Last active
August 16, 2016 06:37
-
-
Save rustyb/34a96f4b55895316c94a816555b52b9a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| @charset "UTF-8"; | |
| /** | |
| * Foundation for Sites by ZURB | |
| * Version 6.1.2 | |
| * foundation.zurb.com | |
| * Licensed under MIT Open Source | |
| */ | |
| .slide-in-down.mui-enter, .slide-in-left.mui-enter, .slide-in-up.mui-enter, .slide-in-right.mui-enter, .slide-out-down.mui-leave, .slide-out-right.mui-leave, .slide-out-up.mui-leave, .slide-out-left.mui-leave, .fade-in.mui-enter, .fade-out.mui-leave, .hinge-in-from-top.mui-enter, .hinge-in-from-right.mui-enter, .hinge-in-from-bottom.mui-enter, .hinge-in-from-left.mui-enter, .hinge-in-from-middle-x.mui-enter, .hinge-in-from-middle-y.mui-enter, .hinge-out-from-top.mui-leave, .hinge-out-from-right.mui-leave, .hinge-out-from-bottom.mui-leave, .hinge-out-from-left.mui-leave, .hinge-out-from-middle-x.mui-leave, .hinge-out-from-middle-y.mui-leave, .scale-in-up.mui-enter, .scale-in-down.mui-enter, .scale-out-up.mui-leave, .scale-out-down.mui-leave, .spin-in.mui-enter, .spin-out.mui-leave, .spin-in-ccw.mui-enter, .spin-out-ccw.mui-leave { | |
| transition-duration: 500ms; | |
| transition-timing-function: linear; } | |
| /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ | |
| /** | |
| * 1. Set default font family to sans-serif. | |
| * 2. Prevent iOS and IE text size adjust after device orientation change, | |
| * without disabling user zoom. | |
| */ | |
| html { | |
| font-family: sans-serif; | |
| /* 1 */ | |
| -ms-text-size-adjust: 100%; | |
| /* 2 */ | |
| -webkit-text-size-adjust: 100%; | |
| /* 2 */ } | |
| /** | |
| * Remove default margin. | |
| */ | |
| body { | |
| margin: 0; } | |
| /* HTML5 display definitions | |
| ========================================================================== */ | |
| /** | |
| * Correct `block` display not defined for any HTML5 element in IE 8/9. | |
| * Correct `block` display not defined for `details` or `summary` in IE 10/11 | |
| * and Firefox. | |
| * Correct `block` display not defined for `main` in IE 11. | |
| */ | |
| article, | |
| aside, | |
| details, | |
| figcaption, | |
| figure, | |
| footer, | |
| header, | |
| hgroup, | |
| main, | |
| menu, | |
| nav, | |
| section, | |
| summary { | |
| display: block; } | |
| /** | |
| * 1. Correct `inline-block` display not defined in IE 8/9. | |
| * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. | |
| */ | |
| audio, | |
| canvas, | |
| progress, | |
| video { | |
| display: inline-block; | |
| /* 1 */ | |
| vertical-align: baseline; | |
| /* 2 */ } | |
| /** | |
| * Prevent modern browsers from displaying `audio` without controls. | |
| * Remove excess height in iOS 5 devices. | |
| */ | |
| audio:not([controls]) { | |
| display: none; | |
| height: 0; } | |
| /** | |
| * Address `[hidden]` styling not present in IE 8/9/10. | |
| * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. | |
| */ | |
| [hidden], | |
| template { | |
| display: none; } | |
| /* Links | |
| ========================================================================== */ | |
| /** | |
| * Remove the gray background color from active links in IE 10. | |
| */ | |
| a { | |
| background-color: transparent; } | |
| /** | |
| * Improve readability of focused elements when they are also in an | |
| * active/hover state. | |
| */ | |
| a:active, | |
| a:hover { | |
| outline: 0; } | |
| /* Text-level semantics | |
| ========================================================================== */ | |
| /** | |
| * Address styling not present in IE 8/9/10/11, Safari, and Chrome. | |
| */ | |
| abbr[title] { | |
| border-bottom: 1px dotted; } | |
| /** | |
| * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. | |
| */ | |
| b, | |
| strong { | |
| font-weight: bold; } | |
| /** | |
| * Address styling not present in Safari and Chrome. | |
| */ | |
| dfn { | |
| font-style: italic; } | |
| /** | |
| * Address variable `h1` font-size and margin within `section` and `article` | |
| * contexts in Firefox 4+, Safari, and Chrome. | |
| */ | |
| h1 { | |
| font-size: 2em; | |
| margin: 0.67em 0; } | |
| /** | |
| * Address styling not present in IE 8/9. | |
| */ | |
| mark { | |
| background: #ff0; | |
| color: #000; } | |
| /** | |
| * Address inconsistent and variable font size in all browsers. | |
| */ | |
| small { | |
| font-size: 80%; } | |
| /** | |
| * Prevent `sub` and `sup` affecting `line-height` in all browsers. | |
| */ | |
| sub, | |
| sup { | |
| font-size: 75%; | |
| line-height: 0; | |
| position: relative; | |
| vertical-align: baseline; } | |
| sup { | |
| top: -0.5em; } | |
| sub { | |
| bottom: -0.25em; } | |
| /* Embedded content | |
| ========================================================================== */ | |
| /** | |
| * Remove border when inside `a` element in IE 8/9/10. | |
| */ | |
| img { | |
| border: 0; } | |
| /** | |
| * Correct overflow not hidden in IE 9/10/11. | |
| */ | |
| svg:not(:root) { | |
| overflow: hidden; } | |
| /* Grouping content | |
| ========================================================================== */ | |
| /** | |
| * Address margin not present in IE 8/9 and Safari. | |
| */ | |
| figure { | |
| margin: 1em 40px; } | |
| /** | |
| * Address differences between Firefox and other browsers. | |
| */ | |
| hr { | |
| box-sizing: content-box; | |
| height: 0; } | |
| /** | |
| * Contain overflow in all browsers. | |
| */ | |
| pre { | |
| overflow: auto; } | |
| /** | |
| * Address odd `em`-unit font size rendering in all browsers. | |
| */ | |
| code, | |
| kbd, | |
| pre, | |
| samp { | |
| font-family: monospace, monospace; | |
| font-size: 1em; } | |
| /* Forms | |
| ========================================================================== */ | |
| /** | |
| * Known limitation: by default, Chrome and Safari on OS X allow very limited | |
| * styling of `select`, unless a `border` property is set. | |
| */ | |
| /** | |
| * 1. Correct color not being inherited. | |
| * Known issue: affects color of disabled elements. | |
| * 2. Correct font properties not being inherited. | |
| * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. | |
| */ | |
| button, | |
| input, | |
| optgroup, | |
| select, | |
| textarea { | |
| color: inherit; | |
| /* 1 */ | |
| font: inherit; | |
| /* 2 */ | |
| margin: 0; | |
| /* 3 */ } | |
| /** | |
| * Address `overflow` set to `hidden` in IE 8/9/10/11. | |
| */ | |
| button { | |
| overflow: visible; } | |
| /** | |
| * Address inconsistent `text-transform` inheritance for `button` and `select`. | |
| * All other form control elements do not inherit `text-transform` values. | |
| * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. | |
| * Correct `select` style inheritance in Firefox. | |
| */ | |
| button, | |
| select { | |
| text-transform: none; } | |
| /** | |
| * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` | |
| * and `video` controls. | |
| * 2. Correct inability to style clickable `input` types in iOS. | |
| * 3. Improve usability and consistency of cursor style between image-type | |
| * `input` and others. | |
| */ | |
| button, | |
| html input[type="button"], | |
| input[type="reset"], | |
| input[type="submit"] { | |
| -webkit-appearance: button; | |
| /* 2 */ | |
| cursor: pointer; | |
| /* 3 */ } | |
| /** | |
| * Re-set default cursor for disabled elements. | |
| */ | |
| button[disabled], | |
| html input[disabled] { | |
| cursor: default; } | |
| /** | |
| * Remove inner padding and border in Firefox 4+. | |
| */ | |
| button::-moz-focus-inner, | |
| input::-moz-focus-inner { | |
| border: 0; | |
| padding: 0; } | |
| /** | |
| * Address Firefox 4+ setting `line-height` on `input` using `!important` in | |
| * the UA stylesheet. | |
| */ | |
| input { | |
| line-height: normal; } | |
| /** | |
| * It's recommended that you don't attempt to style these elements. | |
| * Firefox's implementation doesn't respect box-sizing, padding, or width. | |
| * | |
| * 1. Address box sizing set to `content-box` in IE 8/9/10. | |
| * 2. Remove excess padding in IE 8/9/10. | |
| */ | |
| input[type="checkbox"], | |
| input[type="radio"] { | |
| box-sizing: border-box; | |
| /* 1 */ | |
| padding: 0; | |
| /* 2 */ } | |
| /** | |
| * Fix the cursor style for Chrome's increment/decrement buttons. For certain | |
| * `font-size` values of the `input`, it causes the cursor style of the | |
| * decrement button to change from `default` to `text`. | |
| */ | |
| input[type="number"]::-webkit-inner-spin-button, | |
| input[type="number"]::-webkit-outer-spin-button { | |
| height: auto; } | |
| /** | |
| * 1. Address `appearance` set to `searchfield` in Safari and Chrome. | |
| * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. | |
| */ | |
| input[type="search"] { | |
| -webkit-appearance: textfield; | |
| /* 1 */ | |
| box-sizing: content-box; | |
| /* 2 */ } | |
| /** | |
| * Remove inner padding and search cancel button in Safari and Chrome on OS X. | |
| * Safari (but not Chrome) clips the cancel button when the search input has | |
| * padding (and `textfield` appearance). | |
| */ | |
| input[type="search"]::-webkit-search-cancel-button, | |
| input[type="search"]::-webkit-search-decoration { | |
| -webkit-appearance: none; } | |
| /** | |
| * Define consistent border, margin, and padding. | |
| * [NOTE] We don't enable this ruleset in Foundation, because we want the <fieldset> element to have plain styling. | |
| */ | |
| /* fieldset { | |
| border: 1px solid #c0c0c0; | |
| margin: 0 2px; | |
| padding: 0.35em 0.625em 0.75em; | |
| } */ | |
| /** | |
| * 1. Correct `color` not being inherited in IE 8/9/10/11. | |
| * 2. Remove padding so people aren't caught out if they zero out fieldsets. | |
| */ | |
| legend { | |
| border: 0; | |
| /* 1 */ | |
| padding: 0; | |
| /* 2 */ } | |
| /** | |
| * Remove default vertical scrollbar in IE 8/9/10/11. | |
| */ | |
| textarea { | |
| overflow: auto; } | |
| /** | |
| * Don't inherit the `font-weight` (applied by a rule above). | |
| * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. | |
| */ | |
| optgroup { | |
| font-weight: bold; } | |
| /* Tables | |
| ========================================================================== */ | |
| /** | |
| * Remove most spacing between table cells. | |
| */ | |
| table { | |
| border-collapse: collapse; | |
| border-spacing: 0; } | |
| td, | |
| th { | |
| padding: 0; } | |
| .foundation-mq { | |
| font-family: "small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"; } | |
| html { | |
| font-size: 100%; | |
| box-sizing: border-box; } | |
| *, | |
| *:before, | |
| *:after { | |
| box-sizing: inherit; } | |
| body { | |
| padding: 0; | |
| margin: 0; | |
| font-family: source-sans-pro, "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; | |
| font-weight: normal; | |
| line-height: 1.5; | |
| color: #0a0a0a; | |
| background: #fefefe; | |
| -webkit-font-smoothing: antialiased; | |
| -moz-osx-font-smoothing: grayscale; } | |
| img { | |
| max-width: 100%; | |
| height: auto; | |
| -ms-interpolation-mode: bicubic; | |
| display: inline-block; | |
| vertical-align: middle; } | |
| textarea { | |
| height: auto; | |
| min-height: 50px; | |
| border-radius: 0; } | |
| select { | |
| width: 100%; | |
| border-radius: 0; } | |
| #map_canvas img, | |
| #map_canvas embed, | |
| #map_canvas object, | |
| .map_canvas img, | |
| .map_canvas embed, | |
| .map_canvas object, | |
| .mqa-display img, | |
| .mqa-display embed, | |
| .mqa-display object { | |
| max-width: none !important; } | |
| button { | |
| -webkit-appearance: none; | |
| -moz-appearance: none; | |
| background: transparent; | |
| padding: 0; | |
| border: 0; | |
| border-radius: 0; | |
| line-height: 1; } | |
| .is-visible { | |
| display: block !important; } | |
| .is-hidden { | |
| display: none !important; } | |
| .row { | |
| max-width: 75rem; | |
| margin-left: auto; | |
| margin-right: auto; } | |
| .row::before, .row::after { | |
| content: ' '; | |
| display: table; } | |
| .row::after { | |
| clear: both; } | |
| .row.collapse > .column, .row.collapse > .columns { | |
| padding-left: 0; | |
| padding-right: 0; } | |
| .row .row { | |
| margin-left: -0.625rem; | |
| margin-right: -0.625rem; } | |
| @media screen and (min-width: 40em) { | |
| .row .row { | |
| margin-left: -0.9375rem; | |
| margin-right: -0.9375rem; } } | |
| .row .row.collapse { | |
| margin-left: 0; | |
| margin-right: 0; } | |
| .row.expanded { | |
| max-width: none; } | |
| .row.expanded .row { | |
| margin-left: auto; | |
| margin-right: auto; } | |
| .column, .columns { | |
| padding-left: 0.625rem; | |
| padding-right: 0.625rem; | |
| width: 100%; | |
| float: left; } | |
| @media screen and (min-width: 40em) { | |
| .column, .columns { | |
| padding-left: 0.9375rem; | |
| padding-right: 0.9375rem; } } | |
| .column:last-child:not(:first-child), .columns:last-child:not(:first-child) { | |
| float: right; } | |
| .column.end:last-child:last-child, .end.columns:last-child:last-child { | |
| float: left; } | |
| .column.row.row, .row.row.columns { | |
| float: none; } | |
| .row .column.row.row, .row .row.row.columns { | |
| padding-left: 0; | |
| padding-right: 0; | |
| margin-left: 0; | |
| margin-right: 0; } | |
| .small-1 { | |
| width: 8.33333%; } | |
| .small-push-1 { | |
| position: relative; | |
| left: 8.33333%; } | |
| .small-pull-1 { | |
| position: relative; | |
| left: -8.33333%; } | |
| .small-offset-0 { | |
| margin-left: 0%; } | |
| .small-2 { | |
| width: 16.66667%; } | |
| .small-push-2 { | |
| position: relative; | |
| left: 16.66667%; } | |
| .small-pull-2 { | |
| position: relative; | |
| left: -16.66667%; } | |
| .small-offset-1 { | |
| margin-left: 8.33333%; } | |
| .small-3 { | |
| width: 25%; } | |
| .small-push-3 { | |
| position: relative; | |
| left: 25%; } | |
| .small-pull-3 { | |
| position: relative; | |
| left: -25%; } | |
| .small-offset-2 { | |
| margin-left: 16.66667%; } | |
| .small-4 { | |
| width: 33.33333%; } | |
| .small-push-4 { | |
| position: relative; | |
| left: 33.33333%; } | |
| .small-pull-4 { | |
| position: relative; | |
| left: -33.33333%; } | |
| .small-offset-3 { | |
| margin-left: 25%; } | |
| .small-5 { | |
| width: 41.66667%; } | |
| .small-push-5 { | |
| position: relative; | |
| left: 41.66667%; } | |
| .small-pull-5 { | |
| position: relative; | |
| left: -41.66667%; } | |
| .small-offset-4 { | |
| margin-left: 33.33333%; } | |
| .small-6 { | |
| width: 50%; } | |
| .small-push-6 { | |
| position: relative; | |
| left: 50%; } | |
| .small-pull-6 { | |
| position: relative; | |
| left: -50%; } | |
| .small-offset-5 { | |
| margin-left: 41.66667%; } | |
| .small-7 { | |
| width: 58.33333%; } | |
| .small-push-7 { | |
| position: relative; | |
| left: 58.33333%; } | |
| .small-pull-7 { | |
| position: relative; | |
| left: -58.33333%; } | |
| .small-offset-6 { | |
| margin-left: 50%; } | |
| .small-8 { | |
| width: 66.66667%; } | |
| .small-push-8 { | |
| position: relative; | |
| left: 66.66667%; } | |
| .small-pull-8 { | |
| position: relative; | |
| left: -66.66667%; } | |
| .small-offset-7 { | |
| margin-left: 58.33333%; } | |
| .small-9 { | |
| width: 75%; } | |
| .small-push-9 { | |
| position: relative; | |
| left: 75%; } | |
| .small-pull-9 { | |
| position: relative; | |
| left: -75%; } | |
| .small-offset-8 { | |
| margin-left: 66.66667%; } | |
| .small-10 { | |
| width: 83.33333%; } | |
| .small-push-10 { | |
| position: relative; | |
| left: 83.33333%; } | |
| .small-pull-10 { | |
| position: relative; | |
| left: -83.33333%; } | |
| .small-offset-9 { | |
| margin-left: 75%; } | |
| .small-11 { | |
| width: 91.66667%; } | |
| .small-push-11 { | |
| position: relative; | |
| left: 91.66667%; } | |
| .small-pull-11 { | |
| position: relative; | |
| left: -91.66667%; } | |
| .small-offset-10 { | |
| margin-left: 83.33333%; } | |
| .small-12 { | |
| width: 100%; } | |
| .small-offset-11 { | |
| margin-left: 91.66667%; } | |
| .small-up-1 > .column, .small-up-1 > .columns { | |
| width: 100%; | |
| float: left; } | |
| .small-up-1 > .column:nth-of-type(1n), .small-up-1 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .small-up-1 > .column:nth-of-type(1n+1), .small-up-1 > .columns:nth-of-type(1n+1) { | |
| clear: both; } | |
| .small-up-1 > .column:last-child, .small-up-1 > .columns:last-child { | |
| float: left; } | |
| .small-up-2 > .column, .small-up-2 > .columns { | |
| width: 50%; | |
| float: left; } | |
| .small-up-2 > .column:nth-of-type(1n), .small-up-2 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .small-up-2 > .column:nth-of-type(2n+1), .small-up-2 > .columns:nth-of-type(2n+1) { | |
| clear: both; } | |
| .small-up-2 > .column:last-child, .small-up-2 > .columns:last-child { | |
| float: left; } | |
| .small-up-3 > .column, .small-up-3 > .columns { | |
| width: 33.33333%; | |
| float: left; } | |
| .small-up-3 > .column:nth-of-type(1n), .small-up-3 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .small-up-3 > .column:nth-of-type(3n+1), .small-up-3 > .columns:nth-of-type(3n+1) { | |
| clear: both; } | |
| .small-up-3 > .column:last-child, .small-up-3 > .columns:last-child { | |
| float: left; } | |
| .small-up-4 > .column, .small-up-4 > .columns { | |
| width: 25%; | |
| float: left; } | |
| .small-up-4 > .column:nth-of-type(1n), .small-up-4 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .small-up-4 > .column:nth-of-type(4n+1), .small-up-4 > .columns:nth-of-type(4n+1) { | |
| clear: both; } | |
| .small-up-4 > .column:last-child, .small-up-4 > .columns:last-child { | |
| float: left; } | |
| .small-up-5 > .column, .small-up-5 > .columns { | |
| width: 20%; | |
| float: left; } | |
| .small-up-5 > .column:nth-of-type(1n), .small-up-5 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .small-up-5 > .column:nth-of-type(5n+1), .small-up-5 > .columns:nth-of-type(5n+1) { | |
| clear: both; } | |
| .small-up-5 > .column:last-child, .small-up-5 > .columns:last-child { | |
| float: left; } | |
| .small-up-6 > .column, .small-up-6 > .columns { | |
| width: 16.66667%; | |
| float: left; } | |
| .small-up-6 > .column:nth-of-type(1n), .small-up-6 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .small-up-6 > .column:nth-of-type(6n+1), .small-up-6 > .columns:nth-of-type(6n+1) { | |
| clear: both; } | |
| .small-up-6 > .column:last-child, .small-up-6 > .columns:last-child { | |
| float: left; } | |
| .small-up-7 > .column, .small-up-7 > .columns { | |
| width: 14.28571%; | |
| float: left; } | |
| .small-up-7 > .column:nth-of-type(1n), .small-up-7 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .small-up-7 > .column:nth-of-type(7n+1), .small-up-7 > .columns:nth-of-type(7n+1) { | |
| clear: both; } | |
| .small-up-7 > .column:last-child, .small-up-7 > .columns:last-child { | |
| float: left; } | |
| .small-up-8 > .column, .small-up-8 > .columns { | |
| width: 12.5%; | |
| float: left; } | |
| .small-up-8 > .column:nth-of-type(1n), .small-up-8 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .small-up-8 > .column:nth-of-type(8n+1), .small-up-8 > .columns:nth-of-type(8n+1) { | |
| clear: both; } | |
| .small-up-8 > .column:last-child, .small-up-8 > .columns:last-child { | |
| float: left; } | |
| .small-collapse > .column, .small-collapse > .columns { | |
| padding-left: 0; | |
| padding-right: 0; } | |
| .small-collapse .row { | |
| margin-left: 0; | |
| margin-right: 0; } | |
| .small-uncollapse > .column, .small-uncollapse > .columns { | |
| padding-left: 0.625rem; | |
| padding-right: 0.625rem; } | |
| .small-centered { | |
| float: none; | |
| margin-left: auto; | |
| margin-right: auto; } | |
| .small-uncentered, | |
| .small-push-0, | |
| .small-pull-0 { | |
| position: static; | |
| margin-left: 0; | |
| margin-right: 0; | |
| float: left; } | |
| @media screen and (min-width: 40em) { | |
| .medium-1 { | |
| width: 8.33333%; } | |
| .medium-push-1 { | |
| position: relative; | |
| left: 8.33333%; } | |
| .medium-pull-1 { | |
| position: relative; | |
| left: -8.33333%; } | |
| .medium-offset-0 { | |
| margin-left: 0%; } | |
| .medium-2 { | |
| width: 16.66667%; } | |
| .medium-push-2 { | |
| position: relative; | |
| left: 16.66667%; } | |
| .medium-pull-2 { | |
| position: relative; | |
| left: -16.66667%; } | |
| .medium-offset-1 { | |
| margin-left: 8.33333%; } | |
| .medium-3 { | |
| width: 25%; } | |
| .medium-push-3 { | |
| position: relative; | |
| left: 25%; } | |
| .medium-pull-3 { | |
| position: relative; | |
| left: -25%; } | |
| .medium-offset-2 { | |
| margin-left: 16.66667%; } | |
| .medium-4 { | |
| width: 33.33333%; } | |
| .medium-push-4 { | |
| position: relative; | |
| left: 33.33333%; } | |
| .medium-pull-4 { | |
| position: relative; | |
| left: -33.33333%; } | |
| .medium-offset-3 { | |
| margin-left: 25%; } | |
| .medium-5 { | |
| width: 41.66667%; } | |
| .medium-push-5 { | |
| position: relative; | |
| left: 41.66667%; } | |
| .medium-pull-5 { | |
| position: relative; | |
| left: -41.66667%; } | |
| .medium-offset-4 { | |
| margin-left: 33.33333%; } | |
| .medium-6 { | |
| width: 50%; } | |
| .medium-push-6 { | |
| position: relative; | |
| left: 50%; } | |
| .medium-pull-6 { | |
| position: relative; | |
| left: -50%; } | |
| .medium-offset-5 { | |
| margin-left: 41.66667%; } | |
| .medium-7 { | |
| width: 58.33333%; } | |
| .medium-push-7 { | |
| position: relative; | |
| left: 58.33333%; } | |
| .medium-pull-7 { | |
| position: relative; | |
| left: -58.33333%; } | |
| .medium-offset-6 { | |
| margin-left: 50%; } | |
| .medium-8 { | |
| width: 66.66667%; } | |
| .medium-push-8 { | |
| position: relative; | |
| left: 66.66667%; } | |
| .medium-pull-8 { | |
| position: relative; | |
| left: -66.66667%; } | |
| .medium-offset-7 { | |
| margin-left: 58.33333%; } | |
| .medium-9 { | |
| width: 75%; } | |
| .medium-push-9 { | |
| position: relative; | |
| left: 75%; } | |
| .medium-pull-9 { | |
| position: relative; | |
| left: -75%; } | |
| .medium-offset-8 { | |
| margin-left: 66.66667%; } | |
| .medium-10 { | |
| width: 83.33333%; } | |
| .medium-push-10 { | |
| position: relative; | |
| left: 83.33333%; } | |
| .medium-pull-10 { | |
| position: relative; | |
| left: -83.33333%; } | |
| .medium-offset-9 { | |
| margin-left: 75%; } | |
| .medium-11 { | |
| width: 91.66667%; } | |
| .medium-push-11 { | |
| position: relative; | |
| left: 91.66667%; } | |
| .medium-pull-11 { | |
| position: relative; | |
| left: -91.66667%; } | |
| .medium-offset-10 { | |
| margin-left: 83.33333%; } | |
| .medium-12 { | |
| width: 100%; } | |
| .medium-offset-11 { | |
| margin-left: 91.66667%; } | |
| .medium-up-1 > .column, .medium-up-1 > .columns { | |
| width: 100%; | |
| float: left; } | |
| .medium-up-1 > .column:nth-of-type(1n), .medium-up-1 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .medium-up-1 > .column:nth-of-type(1n+1), .medium-up-1 > .columns:nth-of-type(1n+1) { | |
| clear: both; } | |
| .medium-up-1 > .column:last-child, .medium-up-1 > .columns:last-child { | |
| float: left; } | |
| .medium-up-2 > .column, .medium-up-2 > .columns { | |
| width: 50%; | |
| float: left; } | |
| .medium-up-2 > .column:nth-of-type(1n), .medium-up-2 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .medium-up-2 > .column:nth-of-type(2n+1), .medium-up-2 > .columns:nth-of-type(2n+1) { | |
| clear: both; } | |
| .medium-up-2 > .column:last-child, .medium-up-2 > .columns:last-child { | |
| float: left; } | |
| .medium-up-3 > .column, .medium-up-3 > .columns { | |
| width: 33.33333%; | |
| float: left; } | |
| .medium-up-3 > .column:nth-of-type(1n), .medium-up-3 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .medium-up-3 > .column:nth-of-type(3n+1), .medium-up-3 > .columns:nth-of-type(3n+1) { | |
| clear: both; } | |
| .medium-up-3 > .column:last-child, .medium-up-3 > .columns:last-child { | |
| float: left; } | |
| .medium-up-4 > .column, .medium-up-4 > .columns { | |
| width: 25%; | |
| float: left; } | |
| .medium-up-4 > .column:nth-of-type(1n), .medium-up-4 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .medium-up-4 > .column:nth-of-type(4n+1), .medium-up-4 > .columns:nth-of-type(4n+1) { | |
| clear: both; } | |
| .medium-up-4 > .column:last-child, .medium-up-4 > .columns:last-child { | |
| float: left; } | |
| .medium-up-5 > .column, .medium-up-5 > .columns { | |
| width: 20%; | |
| float: left; } | |
| .medium-up-5 > .column:nth-of-type(1n), .medium-up-5 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .medium-up-5 > .column:nth-of-type(5n+1), .medium-up-5 > .columns:nth-of-type(5n+1) { | |
| clear: both; } | |
| .medium-up-5 > .column:last-child, .medium-up-5 > .columns:last-child { | |
| float: left; } | |
| .medium-up-6 > .column, .medium-up-6 > .columns { | |
| width: 16.66667%; | |
| float: left; } | |
| .medium-up-6 > .column:nth-of-type(1n), .medium-up-6 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .medium-up-6 > .column:nth-of-type(6n+1), .medium-up-6 > .columns:nth-of-type(6n+1) { | |
| clear: both; } | |
| .medium-up-6 > .column:last-child, .medium-up-6 > .columns:last-child { | |
| float: left; } | |
| .medium-up-7 > .column, .medium-up-7 > .columns { | |
| width: 14.28571%; | |
| float: left; } | |
| .medium-up-7 > .column:nth-of-type(1n), .medium-up-7 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .medium-up-7 > .column:nth-of-type(7n+1), .medium-up-7 > .columns:nth-of-type(7n+1) { | |
| clear: both; } | |
| .medium-up-7 > .column:last-child, .medium-up-7 > .columns:last-child { | |
| float: left; } | |
| .medium-up-8 > .column, .medium-up-8 > .columns { | |
| width: 12.5%; | |
| float: left; } | |
| .medium-up-8 > .column:nth-of-type(1n), .medium-up-8 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .medium-up-8 > .column:nth-of-type(8n+1), .medium-up-8 > .columns:nth-of-type(8n+1) { | |
| clear: both; } | |
| .medium-up-8 > .column:last-child, .medium-up-8 > .columns:last-child { | |
| float: left; } | |
| .medium-collapse > .column, .medium-collapse > .columns { | |
| padding-left: 0; | |
| padding-right: 0; } | |
| .medium-collapse .row { | |
| margin-left: 0; | |
| margin-right: 0; } | |
| .medium-uncollapse > .column, .medium-uncollapse > .columns { | |
| padding-left: 0.9375rem; | |
| padding-right: 0.9375rem; } | |
| .medium-centered { | |
| float: none; | |
| margin-left: auto; | |
| margin-right: auto; } | |
| .medium-uncentered, | |
| .medium-push-0, | |
| .medium-pull-0 { | |
| position: static; | |
| margin-left: 0; | |
| margin-right: 0; | |
| float: left; } } | |
| @media screen and (min-width: 64em) { | |
| .large-1 { | |
| width: 8.33333%; } | |
| .large-push-1 { | |
| position: relative; | |
| left: 8.33333%; } | |
| .large-pull-1 { | |
| position: relative; | |
| left: -8.33333%; } | |
| .large-offset-0 { | |
| margin-left: 0%; } | |
| .large-2 { | |
| width: 16.66667%; } | |
| .large-push-2 { | |
| position: relative; | |
| left: 16.66667%; } | |
| .large-pull-2 { | |
| position: relative; | |
| left: -16.66667%; } | |
| .large-offset-1 { | |
| margin-left: 8.33333%; } | |
| .large-3 { | |
| width: 25%; } | |
| .large-push-3 { | |
| position: relative; | |
| left: 25%; } | |
| .large-pull-3 { | |
| position: relative; | |
| left: -25%; } | |
| .large-offset-2 { | |
| margin-left: 16.66667%; } | |
| .large-4 { | |
| width: 33.33333%; } | |
| .large-push-4 { | |
| position: relative; | |
| left: 33.33333%; } | |
| .large-pull-4 { | |
| position: relative; | |
| left: -33.33333%; } | |
| .large-offset-3 { | |
| margin-left: 25%; } | |
| .large-5 { | |
| width: 41.66667%; } | |
| .large-push-5 { | |
| position: relative; | |
| left: 41.66667%; } | |
| .large-pull-5 { | |
| position: relative; | |
| left: -41.66667%; } | |
| .large-offset-4 { | |
| margin-left: 33.33333%; } | |
| .large-6 { | |
| width: 50%; } | |
| .large-push-6 { | |
| position: relative; | |
| left: 50%; } | |
| .large-pull-6 { | |
| position: relative; | |
| left: -50%; } | |
| .large-offset-5 { | |
| margin-left: 41.66667%; } | |
| .large-7 { | |
| width: 58.33333%; } | |
| .large-push-7 { | |
| position: relative; | |
| left: 58.33333%; } | |
| .large-pull-7 { | |
| position: relative; | |
| left: -58.33333%; } | |
| .large-offset-6 { | |
| margin-left: 50%; } | |
| .large-8 { | |
| width: 66.66667%; } | |
| .large-push-8 { | |
| position: relative; | |
| left: 66.66667%; } | |
| .large-pull-8 { | |
| position: relative; | |
| left: -66.66667%; } | |
| .large-offset-7 { | |
| margin-left: 58.33333%; } | |
| .large-9 { | |
| width: 75%; } | |
| .large-push-9 { | |
| position: relative; | |
| left: 75%; } | |
| .large-pull-9 { | |
| position: relative; | |
| left: -75%; } | |
| .large-offset-8 { | |
| margin-left: 66.66667%; } | |
| .large-10 { | |
| width: 83.33333%; } | |
| .large-push-10 { | |
| position: relative; | |
| left: 83.33333%; } | |
| .large-pull-10 { | |
| position: relative; | |
| left: -83.33333%; } | |
| .large-offset-9 { | |
| margin-left: 75%; } | |
| .large-11 { | |
| width: 91.66667%; } | |
| .large-push-11 { | |
| position: relative; | |
| left: 91.66667%; } | |
| .large-pull-11 { | |
| position: relative; | |
| left: -91.66667%; } | |
| .large-offset-10 { | |
| margin-left: 83.33333%; } | |
| .large-12 { | |
| width: 100%; } | |
| .large-offset-11 { | |
| margin-left: 91.66667%; } | |
| .large-up-1 > .column, .large-up-1 > .columns { | |
| width: 100%; | |
| float: left; } | |
| .large-up-1 > .column:nth-of-type(1n), .large-up-1 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .large-up-1 > .column:nth-of-type(1n+1), .large-up-1 > .columns:nth-of-type(1n+1) { | |
| clear: both; } | |
| .large-up-1 > .column:last-child, .large-up-1 > .columns:last-child { | |
| float: left; } | |
| .large-up-2 > .column, .large-up-2 > .columns { | |
| width: 50%; | |
| float: left; } | |
| .large-up-2 > .column:nth-of-type(1n), .large-up-2 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .large-up-2 > .column:nth-of-type(2n+1), .large-up-2 > .columns:nth-of-type(2n+1) { | |
| clear: both; } | |
| .large-up-2 > .column:last-child, .large-up-2 > .columns:last-child { | |
| float: left; } | |
| .large-up-3 > .column, .large-up-3 > .columns { | |
| width: 33.33333%; | |
| float: left; } | |
| .large-up-3 > .column:nth-of-type(1n), .large-up-3 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .large-up-3 > .column:nth-of-type(3n+1), .large-up-3 > .columns:nth-of-type(3n+1) { | |
| clear: both; } | |
| .large-up-3 > .column:last-child, .large-up-3 > .columns:last-child { | |
| float: left; } | |
| .large-up-4 > .column, .large-up-4 > .columns { | |
| width: 25%; | |
| float: left; } | |
| .large-up-4 > .column:nth-of-type(1n), .large-up-4 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .large-up-4 > .column:nth-of-type(4n+1), .large-up-4 > .columns:nth-of-type(4n+1) { | |
| clear: both; } | |
| .large-up-4 > .column:last-child, .large-up-4 > .columns:last-child { | |
| float: left; } | |
| .large-up-5 > .column, .large-up-5 > .columns { | |
| width: 20%; | |
| float: left; } | |
| .large-up-5 > .column:nth-of-type(1n), .large-up-5 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .large-up-5 > .column:nth-of-type(5n+1), .large-up-5 > .columns:nth-of-type(5n+1) { | |
| clear: both; } | |
| .large-up-5 > .column:last-child, .large-up-5 > .columns:last-child { | |
| float: left; } | |
| .large-up-6 > .column, .large-up-6 > .columns { | |
| width: 16.66667%; | |
| float: left; } | |
| .large-up-6 > .column:nth-of-type(1n), .large-up-6 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .large-up-6 > .column:nth-of-type(6n+1), .large-up-6 > .columns:nth-of-type(6n+1) { | |
| clear: both; } | |
| .large-up-6 > .column:last-child, .large-up-6 > .columns:last-child { | |
| float: left; } | |
| .large-up-7 > .column, .large-up-7 > .columns { | |
| width: 14.28571%; | |
| float: left; } | |
| .large-up-7 > .column:nth-of-type(1n), .large-up-7 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .large-up-7 > .column:nth-of-type(7n+1), .large-up-7 > .columns:nth-of-type(7n+1) { | |
| clear: both; } | |
| .large-up-7 > .column:last-child, .large-up-7 > .columns:last-child { | |
| float: left; } | |
| .large-up-8 > .column, .large-up-8 > .columns { | |
| width: 12.5%; | |
| float: left; } | |
| .large-up-8 > .column:nth-of-type(1n), .large-up-8 > .columns:nth-of-type(1n) { | |
| clear: none; } | |
| .large-up-8 > .column:nth-of-type(8n+1), .large-up-8 > .columns:nth-of-type(8n+1) { | |
| clear: both; } | |
| .large-up-8 > .column:last-child, .large-up-8 > .columns:last-child { | |
| float: left; } | |
| .large-collapse > .column, .large-collapse > .columns { | |
| padding-left: 0; | |
| padding-right: 0; } | |
| .large-collapse .row { | |
| margin-left: 0; | |
| margin-right: 0; } | |
| .large-uncollapse > .column, .large-uncollapse > .columns { | |
| padding-left: 0.9375rem; | |
| padding-right: 0.9375rem; } | |
| .large-centered { | |
| float: none; | |
| margin-left: auto; | |
| margin-right: auto; } | |
| .large-uncentered, | |
| .large-push-0, | |
| .large-pull-0 { | |
| position: static; | |
| margin-left: 0; | |
| margin-right: 0; | |
| float: left; } } | |
| div, | |
| dl, | |
| dt, | |
| dd, | |
| ul, | |
| ol, | |
| li, | |
| h1, | |
| h2, | |
| h3, | |
| h4, | |
| h5, | |
| h6, | |
| pre, | |
| form, | |
| p, | |
| blockquote, | |
| th, | |
| td { | |
| margin: 0; | |
| padding: 0; } | |
| p { | |
| font-size: inherit; | |
| line-height: 1.6; | |
| margin-bottom: 1rem; | |
| text-rendering: optimizeLegibility; } | |
| em, | |
| i { | |
| font-style: italic; | |
| line-height: inherit; } | |
| strong, | |
| b { | |
| font-weight: bold; | |
| line-height: inherit; } | |
| small { | |
| font-size: 80%; | |
| line-height: inherit; } | |
| h1, | |
| h2, | |
| h3, | |
| h4, | |
| h5, | |
| h6 { | |
| font-family: merriweather, serif; | |
| font-weight: normal; | |
| font-style: normal; | |
| color: inherit; | |
| text-rendering: optimizeLegibility; | |
| margin-top: 0; | |
| margin-bottom: 0.5rem; | |
| line-height: 1.4; } | |
| h1 small, | |
| h2 small, | |
| h3 small, | |
| h4 small, | |
| h5 small, | |
| h6 small { | |
| color: #cacaca; | |
| line-height: 0; } | |
| h1 { | |
| font-size: 1.5rem; } | |
| h2 { | |
| font-size: 1.25rem; } | |
| h3 { | |
| font-size: 1.1875rem; } | |
| h4 { | |
| font-size: 1.125rem; } | |
| h5 { | |
| font-size: 1.0625rem; } | |
| h6 { | |
| font-size: 1rem; } | |
| @media screen and (min-width: 40em) { | |
| h1 { | |
| font-size: 3rem; } | |
| h2 { | |
| font-size: 2.5rem; } | |
| h3 { | |
| font-size: 1.9375rem; } | |
| h4 { | |
| font-size: 1.5625rem; } | |
| h5 { | |
| font-size: 1.25rem; } | |
| h6 { | |
| font-size: 1rem; } } | |
| a { | |
| color: #2199e8; | |
| text-decoration: none; | |
| line-height: inherit; | |
| cursor: pointer; } | |
| a:hover, a:focus { | |
| color: #1585cf; } | |
| a img { | |
| border: 0; } | |
| hr { | |
| max-width: 75rem; | |
| height: 0; | |
| border-right: 0; | |
| border-top: 0; | |
| border-bottom: 1px solid #cacaca; | |
| border-left: 0; | |
| margin: 1.25rem auto; | |
| clear: both; } | |
| ul, | |
| ol, | |
| dl { | |
| line-height: 1.6; | |
| margin-bottom: 1rem; | |
| list-style-position: outside; } | |
| li { | |
| font-size: inherit; } | |
| ul { | |
| list-style-type: disc; | |
| margin-left: 1.25rem; } | |
| ol { | |
| margin-left: 1.25rem; } | |
| ul ul, ol ul, ul ol, ol ol { | |
| margin-left: 1.25rem; | |
| margin-bottom: 0; } | |
| dl { | |
| margin-bottom: 1rem; } | |
| dl dt { | |
| margin-bottom: 0.3rem; | |
| font-weight: bold; } | |
| blockquote { | |
| margin: 0 0 1rem; | |
| padding: 0.5625rem 1.25rem 0 1.1875rem; | |
| border-left: 1px solid #cacaca; } | |
| blockquote, blockquote p { | |
| line-height: 1.6; | |
| color: #8a8a8a; } | |
| cite { | |
| display: block; | |
| font-size: 0.8125rem; | |
| color: #8a8a8a; } | |
| cite:before { | |
| content: '\2014 \0020'; } | |
| abbr { | |
| color: #0a0a0a; | |
| cursor: help; | |
| border-bottom: 1px dotted #0a0a0a; } | |
| code { | |
| font-family: Consolas, "Liberation Mono", Courier, monospace; | |
| font-weight: normal; | |
| color: #0a0a0a; | |
| background-color: #e6e6e6; | |
| border: 1px solid #cacaca; | |
| padding: 0.125rem 0.3125rem 0.0625rem; } | |
| kbd { | |
| padding: 0.125rem 0.25rem 0; | |
| margin: 0; | |
| background-color: #e6e6e6; | |
| color: #0a0a0a; | |
| font-family: Consolas, "Liberation Mono", Courier, monospace; } | |
| .subheader { | |
| margin-top: 0.2rem; | |
| margin-bottom: 0.5rem; | |
| font-weight: normal; | |
| line-height: 1.4; | |
| color: #8a8a8a; } | |
| .lead { | |
| font-size: 125%; | |
| line-height: 1.6; } | |
| .stat { | |
| font-size: 2.5rem; | |
| line-height: 1; } | |
| p + .stat { | |
| margin-top: -1rem; } | |
| .no-bullet { | |
| margin-left: 0; | |
| list-style: none; } | |
| .text-left { | |
| text-align: left; } | |
| .text-right { | |
| text-align: right; } | |
| .text-center { | |
| text-align: center; } | |
| .text-justify { | |
| text-align: justify; } | |
| @media screen and (min-width: 40em) { | |
| .medium-text-left { | |
| text-align: left; } | |
| .medium-text-right { | |
| text-align: right; } | |
| .medium-text-center { | |
| text-align: center; } | |
| .medium-text-justify { | |
| text-align: justify; } } | |
| @media screen and (min-width: 64em) { | |
| .large-text-left { | |
| text-align: left; } | |
| .large-text-right { | |
| text-align: right; } | |
| .large-text-center { | |
| text-align: center; } | |
| .large-text-justify { | |
| text-align: justify; } } | |
| .show-for-print { | |
| display: none !important; } | |
| @media print { | |
| * { | |
| background: transparent !important; | |
| color: black !important; | |
| box-shadow: none !important; | |
| text-shadow: none !important; } | |
| .show-for-print { | |
| display: block !important; } | |
| .hide-for-print { | |
| display: none !important; } | |
| table.show-for-print { | |
| display: table !important; } | |
| thead.show-for-print { | |
| display: table-header-group !important; } | |
| tbody.show-for-print { | |
| display: table-row-group !important; } | |
| tr.show-for-print { | |
| display: table-row !important; } | |
| td.show-for-print { | |
| display: table-cell !important; } | |
| th.show-for-print { | |
| display: table-cell !important; } | |
| a, | |
| a:visited { | |
| text-decoration: underline; } | |
| a[href]:after { | |
| content: " (" attr(href) ")"; } | |
| .ir a:after, | |
| a[href^='javascript:']:after, | |
| a[href^='#']:after { | |
| content: ''; } | |
| abbr[title]:after { | |
| content: " (" attr(title) ")"; } | |
| pre, | |
| blockquote { | |
| border: 1px solid #999; | |
| page-break-inside: avoid; } | |
| thead { | |
| display: table-header-group; } | |
| tr, | |
| img { | |
| page-break-inside: avoid; } | |
| img { | |
| max-width: 100% !important; } | |
| @page { | |
| margin: 0.5cm; } | |
| p, | |
| h2, | |
| h3 { | |
| orphans: 3; | |
| widows: 3; } | |
| h2, | |
| h3 { | |
| page-break-after: avoid; } } | |
| .button { | |
| display: inline-block; | |
| text-align: center; | |
| line-height: 1; | |
| cursor: pointer; | |
| -webkit-appearance: none; | |
| transition: background-color 0.25s ease-out, color 0.25s ease-out; | |
| vertical-align: middle; | |
| border: 1px solid transparent; | |
| border-radius: 0; | |
| padding: 0.85em 1em; | |
| margin: 0 0 1rem 0; | |
| font-size: 0.9rem; | |
| background-color: #2199e8; | |
| color: #fff; } | |
| [data-whatinput='mouse'] .button { | |
| outline: 0; } | |
| .button:hover, .button:focus { | |
| background-color: #1583cc; | |
| color: #fff; } | |
| .button.tiny { | |
| font-size: 0.6rem; } | |
| .button.small { | |
| font-size: 0.75rem; } | |
| .button.large { | |
| font-size: 1.25rem; } | |
| .button.expanded { | |
| display: block; | |
| width: 100%; | |
| margin-left: 0; | |
| margin-right: 0; } | |
| .button.primary { | |
| background-color: #2199e8; | |
| color: #fff; } | |
| .button.primary:hover, .button.primary:focus { | |
| background-color: #147cc0; | |
| color: #fff; } | |
| .button.secondary { | |
| background-color: #777; | |
| color: #fff; } | |
| .button.secondary:hover, .button.secondary:focus { | |
| background-color: #5f5f5f; | |
| color: #fff; } | |
| .button.success { | |
| background-color: #3adb76; | |
| color: #fff; } | |
| .button.success:hover, .button.success:focus { | |
| background-color: #22bb5b; | |
| color: #fff; } | |
| .button.alert { | |
| background-color: #ec5840; | |
| color: #fff; } | |
| .button.alert:hover, .button.alert:focus { | |
| background-color: #da3116; | |
| color: #fff; } | |
| .button.warning { | |
| background-color: #ffae00; | |
| color: #fff; } | |
| .button.warning:hover, .button.warning:focus { | |
| background-color: #cc8b00; | |
| color: #fff; } | |
| .button.hollow { | |
| border: 1px solid #2199e8; | |
| color: #2199e8; } | |
| .button.hollow, .button.hollow:hover, .button.hollow:focus { | |
| background-color: transparent; } | |
| .button.hollow:hover, .button.hollow:focus { | |
| border-color: #0c4d78; | |
| color: #0c4d78; } | |
| .button.hollow.primary { | |
| border: 1px solid #2199e8; | |
| color: #2199e8; } | |
| .button.hollow.primary:hover, .button.hollow.primary:focus { | |
| border-color: #0c4d78; | |
| color: #0c4d78; } | |
| .button.hollow.secondary { | |
| border: 1px solid #777; | |
| color: #777; } | |
| .button.hollow.secondary:hover, .button.hollow.secondary:focus { | |
| border-color: #3c3c3c; | |
| color: #3c3c3c; } | |
| .button.hollow.success { | |
| border: 1px solid #3adb76; | |
| color: #3adb76; } | |
| .button.hollow.success:hover, .button.hollow.success:focus { | |
| border-color: #157539; | |
| color: #157539; } | |
| .button.hollow.alert { | |
| border: 1px solid #ec5840; | |
| color: #ec5840; } | |
| .button.hollow.alert:hover, .button.hollow.alert:focus { | |
| border-color: #881f0e; | |
| color: #881f0e; } | |
| .button.hollow.warning { | |
| border: 1px solid #ffae00; | |
| color: #ffae00; } | |
| .button.hollow.warning:hover, .button.hollow.warning:focus { | |
| border-color: #805700; | |
| color: #805700; } | |
| .button.disabled, .button[disabled] { | |
| opacity: 0.25; | |
| cursor: not-allowed; | |
| pointer-events: none; } | |
| .button.dropdown::after { | |
| content: ''; | |
| display: block; | |
| width: 0; | |
| height: 0; | |
| border: inset 0.4em; | |
| border-color: #fefefe transparent transparent; | |
| border-top-style: solid; | |
| border-bottom-width: 0; | |
| position: relative; | |
| top: 0.4em; | |
| float: right; | |
| margin-left: 1em; | |
| display: inline-block; } | |
| .button.arrow-only::after { | |
| margin-left: 0; | |
| float: none; | |
| top: 0.2em; } | |
| [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], | |
| textarea { | |
| display: block; | |
| box-sizing: border-box; | |
| width: 100%; | |
| height: 2.4375rem; | |
| padding: 0.5rem; | |
| border: 1px solid #cacaca; | |
| margin: 0 0 1rem; | |
| font-family: inherit; | |
| font-size: 1rem; | |
| color: #0a0a0a; | |
| background-color: #fefefe; | |
| box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); | |
| border-radius: 0; | |
| transition: box-shadow 0.5s, border-color 0.25s ease-in-out; | |
| -webkit-appearance: none; | |
| -moz-appearance: none; } | |
| [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, | |
| textarea:focus { | |
| border: 1px solid #8a8a8a; | |
| background-color: #fefefe; | |
| outline: none; | |
| box-shadow: 0 0 5px #cacaca; | |
| transition: box-shadow 0.5s, border-color 0.25s ease-in-out; } | |
| textarea { | |
| max-width: 100%; } | |
| textarea[rows] { | |
| height: auto; } | |
| input:disabled, input[readonly], | |
| textarea:disabled, | |
| textarea[readonly] { | |
| background-color: #e6e6e6; | |
| cursor: default; } | |
| [type='submit'], | |
| [type='button'] { | |
| border-radius: 0; | |
| -webkit-appearance: none; | |
| -moz-appearance: none; } | |
| input[type='search'] { | |
| box-sizing: border-box; } | |
| [type='file'], | |
| [type='checkbox'], | |
| [type='radio'] { | |
| margin: 0 0 1rem; } | |
| [type='checkbox'] + label, | |
| [type='radio'] + label { | |
| display: inline-block; | |
| margin-left: 0.5rem; | |
| margin-right: 1rem; | |
| margin-bottom: 0; | |
| vertical-align: baseline; } | |
| label > [type='checkbox'], | |
| label > [type='label'] { | |
| margin-right: 0.5rem; } | |
| [type='file'] { | |
| width: 100%; } | |
| label { | |
| display: block; | |
| margin: 0; | |
| font-size: 0.875rem; | |
| font-weight: normal; | |
| line-height: 1.8; | |
| color: #0a0a0a; } | |
| label.middle { | |
| margin: 0 0 1rem; | |
| padding: 0.5625rem 0; } | |
| .help-text { | |
| margin-top: -0.5rem; | |
| font-size: 0.8125rem; | |
| font-style: italic; | |
| color: #333; } | |
| .input-group { | |
| display: table; | |
| width: 100%; | |
| margin-bottom: 1rem; } | |
| .input-group > :first-child { | |
| border-radius: 0 0 0 0; } | |
| .input-group > :last-child > * { | |
| border-radius: 0 0 0 0; } | |
| .input-group-label, .input-group-field, .input-group-button { | |
| display: table-cell; | |
| margin: 0; | |
| vertical-align: middle; } | |
| .input-group-label { | |
| text-align: center; | |
| width: 1%; | |
| height: 100%; | |
| padding: 0 1rem; | |
| background: #e6e6e6; | |
| color: #0a0a0a; | |
| border: 1px solid #cacaca; | |
| white-space: nowrap; } | |
| .input-group-label:first-child { | |
| border-right: 0; } | |
| .input-group-label:last-child { | |
| border-left: 0; } | |
| .input-group-field { | |
| border-radius: 0; | |
| height: 2.5rem; } | |
| .input-group-button { | |
| height: 100%; | |
| padding-top: 0; | |
| padding-bottom: 0; | |
| text-align: center; | |
| width: 1%; } | |
| .input-group-button a, | |
| .input-group-button input, | |
| .input-group-button button { | |
| margin: 0; } | |
| fieldset { | |
| border: 0; | |
| padding: 0; | |
| margin: 0; } | |
| legend { | |
| margin-bottom: 0.5rem; | |
| max-width: 100%; } | |
| .fieldset { | |
| border: 1px solid #cacaca; | |
| padding: 1.25rem; | |
| margin: 1.125rem 0; } | |
| .fieldset legend { | |
| background: #fefefe; | |
| padding: 0 0.1875rem; | |
| margin: 0; | |
| margin-left: -0.1875rem; } | |
| select { | |
| height: 2.4375rem; | |
| padding: 0.5rem; | |
| border: 1px solid #cacaca; | |
| margin: 0 0 1rem; | |
| font-size: 1rem; | |
| font-family: inherit; | |
| line-height: normal; | |
| color: #0a0a0a; | |
| background-color: #fefefe; | |
| border-radius: 0; | |
| -webkit-appearance: none; | |
| -moz-appearance: none; | |
| background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="32" height="24" viewBox="0 0 32 24"><polygon points="0,0 32,0 16,24" style="fill: rgb%2851, 51, 51%29"></polygon></svg>'); | |
| background-size: 9px 6px; | |
| background-position: right center; | |
| background-origin: content-box; | |
| background-repeat: no-repeat; } | |
| @media screen and (min-width: 0\0) { | |
| select { | |
| background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); } } | |
| select:disabled { | |
| background-color: #e6e6e6; | |
| cursor: default; } | |
| select::-ms-expand { | |
| display: none; } | |
| select[multiple] { | |
| height: auto; } | |
| .is-invalid-input:not(:focus) { | |
| background-color: rgba(236, 88, 64, 0.1); | |
| border-color: #ec5840; } | |
| .is-invalid-label { | |
| color: #ec5840; } | |
| .form-error { | |
| display: none; | |
| margin-top: -0.5rem; | |
| margin-bottom: 1rem; | |
| font-size: 0.75rem; | |
| font-weight: bold; | |
| color: #ec5840; } | |
| .form-error.is-visible { | |
| display: block; } | |
| .hide { | |
| display: none !important; } | |
| .invisible { | |
| visibility: hidden; } | |
| @media screen and (min-width: 0em) and (max-width: 39.9375em) { | |
| .hide-for-small-only { | |
| display: none !important; } } | |
| @media screen and (max-width: 0em), screen and (min-width: 40em) { | |
| .show-for-small-only { | |
| display: none !important; } } | |
| @media screen and (min-width: 40em) { | |
| .hide-for-medium { | |
| display: none !important; } } | |
| @media screen and (max-width: 39.9375em) { | |
| .show-for-medium { | |
| display: none !important; } } | |
| @media screen and (min-width: 40em) and (max-width: 63.9375em) { | |
| .hide-for-medium-only { | |
| display: none !important; } } | |
| @media screen and (max-width: 39.9375em), screen and (min-width: 64em) { | |
| .show-for-medium-only { | |
| display: none !important; } } | |
| @media screen and (min-width: 64em) { | |
| .hide-for-large { | |
| display: none !important; } } | |
| @media screen and (max-width: 63.9375em) { | |
| .show-for-large { | |
| display: none !important; } } | |
| @media screen and (min-width: 64em) and (max-width: 74.9375em) { | |
| .hide-for-large-only { | |
| display: none !important; } } | |
| @media screen and (max-width: 63.9375em), screen and (min-width: 75em) { | |
| .show-for-large-only { | |
| display: none !important; } } | |
| .show-for-sr, | |
| .show-on-focus { | |
| position: absolute !important; | |
| width: 1px; | |
| height: 1px; | |
| overflow: hidden; | |
| clip: rect(0, 0, 0, 0); } | |
| .show-on-focus:active, .show-on-focus:focus { | |
| position: static !important; | |
| height: auto; | |
| width: auto; | |
| overflow: visible; | |
| clip: auto; } | |
| .show-for-landscape, | |
| .hide-for-portrait { | |
| display: block !important; } | |
| @media screen and (orientation: landscape) { | |
| .show-for-landscape, | |
| .hide-for-portrait { | |
| display: block !important; } } | |
| @media screen and (orientation: portrait) { | |
| .show-for-landscape, | |
| .hide-for-portrait { | |
| display: none !important; } } | |
| .hide-for-landscape, | |
| .show-for-portrait { | |
| display: none !important; } | |
| @media screen and (orientation: landscape) { | |
| .hide-for-landscape, | |
| .show-for-portrait { | |
| display: none !important; } } | |
| @media screen and (orientation: portrait) { | |
| .hide-for-landscape, | |
| .show-for-portrait { | |
| display: block !important; } } | |
| .float-left { | |
| float: left !important; } | |
| .float-right { | |
| float: right !important; } | |
| .float-center { | |
| display: block; | |
| margin-left: auto; | |
| margin-right: auto; } | |
| .clearfix::before, .clearfix::after { | |
| content: ' '; | |
| display: table; } | |
| .clearfix::after { | |
| clear: both; } | |
| .accordion { | |
| list-style-type: none; | |
| background: #fefefe; | |
| border: 1px solid #e6e6e6; | |
| border-bottom: 0; | |
| border-radius: 0; | |
| margin-left: 0; } | |
| .accordion-title { | |
| display: block; | |
| padding: 1.25rem 1rem; | |
| line-height: 1; | |
| font-size: 0.75rem; | |
| color: #2199e8; | |
| position: relative; | |
| border-bottom: 1px solid #e6e6e6; } | |
| .accordion-title:hover, .accordion-title:focus { | |
| background-color: #e6e6e6; } | |
| .accordion-title::before { | |
| content: '+'; | |
| position: absolute; | |
| right: 1rem; | |
| top: 50%; | |
| margin-top: -0.5rem; } | |
| .is-active > .accordion-title::before { | |
| content: '–'; } | |
| .accordion-content { | |
| padding: 1rem; | |
| display: none; | |
| border-bottom: 1px solid #e6e6e6; | |
| background-color: #fefefe; } | |
| .is-accordion-submenu-parent > a { | |
| position: relative; } | |
| .is-accordion-submenu-parent > a::after { | |
| content: ''; | |
| display: block; | |
| width: 0; | |
| height: 0; | |
| border: inset 6px; | |
| border-color: #2199e8 transparent transparent; | |
| border-top-style: solid; | |
| border-bottom-width: 0; | |
| position: absolute; | |
| top: 50%; | |
| margin-top: -4px; | |
| right: 1rem; } | |
| .is-accordion-submenu-parent[aria-expanded='true'] > a::after { | |
| -webkit-transform-origin: 50% 50%; | |
| -ms-transform-origin: 50% 50%; | |
| transform-origin: 50% 50%; | |
| -webkit-transform: scaleY(-1); | |
| -ms-transform: scaleY(-1); | |
| transform: scaleY(-1); } | |
| .badge { | |
| display: inline-block; | |
| padding: 0.3em; | |
| min-width: 2.1em; | |
| font-size: 0.6rem; | |
| text-align: center; | |
| border-radius: 50%; | |
| background: #2199e8; | |
| color: #fefefe; } | |
| .badge.secondary { | |
| background: #777; | |
| color: #fefefe; } | |
| .badge.success { | |
| background: #3adb76; | |
| color: #fefefe; } | |
| .badge.alert { | |
| background: #ec5840; | |
| color: #fefefe; } | |
| .badge.warning { | |
| background: #ffae00; | |
| color: #fefefe; } | |
| .breadcrumbs { | |
| list-style: none; | |
| margin: 0 0 1rem 0; } | |
| .breadcrumbs::before, .breadcrumbs::after { | |
| content: ' '; | |
| display: table; } | |
| .breadcrumbs::after { | |
| clear: both; } | |
| .breadcrumbs li { | |
| float: left; | |
| color: #0a0a0a; | |
| font-size: 0.6875rem; | |
| cursor: default; | |
| text-transform: uppercase; } | |
| .breadcrumbs li:not(:last-child)::after { | |
| color: #cacaca; | |
| content: "/"; | |
| margin: 0 0.75rem; | |
| position: relative; | |
| top: 1px; | |
| opacity: 1; } | |
| .breadcrumbs a { | |
| color: #2199e8; } | |
| .breadcrumbs a:hover { | |
| text-decoration: underline; } | |
| .breadcrumbs .disabled { | |
| color: #cacaca; } | |
| .button-group { | |
| margin-bottom: 1rem; | |
| font-size: 0.9rem; } | |
| .button-group::before, .button-group::after { | |
| content: ' '; | |
| display: table; } | |
| .button-group::after { | |
| clear: both; } | |
| .button-group .button { | |
| float: left; | |
| margin: 0; | |
| font-size: inherit; } | |
| .button-group .button:not(:last-child) { | |
| border-right: 1px solid #fefefe; } | |
| .button-group.tiny { | |
| font-size: 0.6rem; } | |
| .button-group.small { | |
| font-size: 0.75rem; } | |
| .button-group.large { | |
| font-size: 1.25rem; } | |
| .button-group.expanded { | |
| display: table; | |
| table-layout: fixed; | |
| width: 100%; } | |
| .button-group.expanded::before, .button-group.expanded::after { | |
| display: none; } | |
| .button-group.expanded .button { | |
| display: table-cell; | |
| float: none; } | |
| .button-group.primary .button { | |
| background-color: #2199e8; | |
| color: #fefefe; } | |
| .button-group.primary .button:hover, .button-group.primary .button:focus { | |
| background-color: #147cc0; | |
| color: #fefefe; } | |
| .button-group.secondary .button { | |
| background-color: #777; | |
| color: #fefefe; } | |
| .button-group.secondary .button:hover, .button-group.secondary .button:focus { | |
| background-color: #5f5f5f; | |
| color: #fefefe; } | |
| .button-group.success .button { | |
| background-color: #3adb76; | |
| color: #fefefe; } | |
| .button-group.success .button:hover, .button-group.success .button:focus { | |
| background-color: #22bb5b; | |
| color: #fefefe; } | |
| .button-group.alert .button { | |
| background-color: #ec5840; | |
| color: #fefefe; } | |
| .button-group.alert .button:hover, .button-group.alert .button:focus { | |
| background-color: #da3116; | |
| color: #fefefe; } | |
| .button-group.warning .button { | |
| background-color: #ffae00; | |
| color: #fefefe; } | |
| .button-group.warning .button:hover, .button-group.warning .button:focus { | |
| background-color: #cc8b00; | |
| color: #fefefe; } | |
| .button-group.stacked .button, .button-group.stacked-for-small .button { | |
| width: 100%; } | |
| .button-group.stacked .button:not(:last-child), .button-group.stacked-for-small .button:not(:last-child) { | |
| border-right: 1px solid; } | |
| @media screen and (min-width: 40em) { | |
| .button-group.stacked-for-small .button { | |
| width: auto; } | |
| .button-group.stacked-for-small .button:not(:last-child) { | |
| border-right: 1px solid #fefefe; } } | |
| @media screen and (min-width: 0em) and (max-width: 39.9375em) { | |
| .button-group.stacked-for-small.expanded { | |
| display: block; } | |
| .button-group.stacked-for-small.expanded .button { | |
| display: block; | |
| border-right: 0; } } | |
| .callout { | |
| margin: 0 0 1rem 0; | |
| padding: 1rem; | |
| border: 1px solid rgba(10, 10, 10, 0.25); | |
| border-radius: 0; | |
| position: relative; | |
| color: #0a0a0a; | |
| background-color: white; } | |
| .callout > :first-child { | |
| margin-top: 0; } | |
| .callout > :last-child { | |
| margin-bottom: 0; } | |
| .callout.primary { | |
| background-color: #def0fc; } | |
| .callout.secondary { | |
| background-color: #ebebeb; } | |
| .callout.success { | |
| background-color: #e1faea; } | |
| .callout.alert { | |
| background-color: #fce6e2; } | |
| .callout.warning { | |
| background-color: #fff3d9; } | |
| .callout.small { | |
| padding-top: 0.5rem; | |
| padding-right: 0.5rem; | |
| padding-bottom: 0.5rem; | |
| padding-left: 0.5rem; } | |
| .callout.large { | |
| padding-top: 3rem; | |
| padding-right: 3rem; | |
| padding-bottom: 3rem; | |
| padding-left: 3rem; } | |
| .close-button { | |
| position: absolute; | |
| color: #8a8a8a; | |
| right: 1rem; | |
| top: 0.5rem; | |
| font-size: 2em; | |
| line-height: 1; | |
| cursor: pointer; } | |
| [data-whatinput='mouse'] .close-button { | |
| outline: 0; } | |
| .close-button:hover, .close-button:focus { | |
| color: #0a0a0a; } | |
| .is-drilldown { | |
| position: relative; | |
| overflow: hidden; } | |
| .is-drilldown-submenu { | |
| position: absolute; | |
| top: 0; | |
| left: 100%; | |
| z-index: -1; | |
| height: 100%; | |
| width: 100%; | |
| background: #fefefe; | |
| transition: -webkit-transform 0.15s linear; | |
| transition: transform 0.15s linear; | |
| transition: transform 0.15s linear, -webkit-transform 0.15s linear; } | |
| .is-drilldown-submenu.is-active { | |
| z-index: 1; | |
| display: block; | |
| -webkit-transform: translateX(-100%); | |
| -ms-transform: translateX(-100%); | |
| transform: translateX(-100%); } | |
| .is-drilldown-submenu.is-closing { | |
| -webkit-transform: translateX(100%); | |
| -ms-transform: translateX(100%); | |
| transform: translateX(100%); } | |
| .is-drilldown-submenu-parent > a { | |
| position: relative; } | |
| .is-drilldown-submenu-parent > a::after { | |
| content: ''; | |
| display: block; | |
| width: 0; | |
| height: 0; | |
| border: inset 6px; | |
| border-color: transparent transparent transparent #2199e8; | |
| border-left-style: solid; | |
| border-right-width: 0; | |
| position: absolute; | |
| top: 50%; | |
| margin-top: -6px; | |
| right: 1rem; } | |
| .js-drilldown-back > a::before { | |
| content: ''; | |
| display: block; | |
| width: 0; | |
| height: 0; | |
| border: inset 6px; | |
| border-color: transparent #2199e8 transparent transparent; | |
| border-right-style: solid; | |
| border-left-width: 0; | |
| border-left-width: 0; | |
| display: inline-block; | |
| vertical-align: middle; | |
| margin-right: 0.75rem; } | |
| .dropdown-pane { | |
| background-color: #fefefe; | |
| border: 1px solid #cacaca; | |
| border-radius: 0; | |
| display: block; | |
| font-size: 1rem; | |
| padding: 1rem; | |
| position: absolute; | |
| visibility: hidden; | |
| width: 300px; | |
| z-index: 10; } | |
| .dropdown-pane.is-open { | |
| visibility: visible; } | |
| .dropdown-pane.tiny { | |
| width: 100px; } | |
| .dropdown-pane.small { | |
| width: 200px; } | |
| .dropdown-pane.large { | |
| width: 400px; } | |
| [data-whatinput='mouse'] .dropdown.menu a { | |
| outline: 0; } | |
| .no-js .dropdown.menu ul { | |
| display: none; } | |
| .dropdown.menu:not(.vertical) .is-dropdown-submenu.first-sub { | |
| top: 100%; | |
| left: 0; | |
| right: auto; } | |
| .dropdown.menu.align-right .is-dropdown-submenu.first-sub { | |
| top: 100%; | |
| left: auto; | |
| right: 0; } | |
| .is-dropdown-menu.vertical { | |
| width: 100px; } | |
| .is-dropdown-menu.vertical.align-right { | |
| float: right; } | |
| .is-dropdown-menu.vertical > li .is-dropdown-submenu { | |
| top: 0; | |
| left: 100%; } | |
| .is-dropdown-submenu-parent { | |
| position: relative; } | |
| .is-dropdown-submenu-parent a::after { | |
| float: right; | |
| margin-top: 3px; | |
| margin-left: 10px; } | |
| .is-dropdown-submenu-parent.is-down-arrow a { | |
| padding-right: 1.5rem; | |
| position: relative; } | |
| .is-dropdown-submenu-parent.is-down-arrow > a::after { | |
| content: ''; | |
| display: block; | |
| width: 0; | |
| height: 0; | |
| border: inset 5px; | |
| border-color: #2199e8 transparent transparent; | |
| border-top-style: solid; | |
| border-bottom-width: 0; | |
| position: absolute; | |
| top: 0.825rem; | |
| right: 5px; } | |
| .is-dropdown-submenu-parent.is-left-arrow > a::after { | |
| content: ''; | |
| display: block; | |
| width: 0; | |
| height: 0; | |
| border: inset 5px; | |
| border-color: transparent #2199e8 transparent transparent; | |
| border-right-style: solid; | |
| border-left-width: 0; | |
| float: left; | |
| margin-left: 0; | |
| margin-right: 10px; } | |
| .is-dropdown-submenu-parent.is-right-arrow > a::after { | |
| content: ''; | |
| display: block; | |
| width: 0; | |
| height: 0; | |
| border: inset 5px; | |
| border-color: transparent transparent transparent #2199e8; | |
| border-left-style: solid; | |
| border-right-width: 0; } | |
| .is-dropdown-submenu-parent.is-left-arrow.opens-inner .is-dropdown-submenu { | |
| right: 0; | |
| left: auto; } | |
| .is-dropdown-submenu-parent.is-right-arrow.opens-inner .is-dropdown-submenu { | |
| left: 0; | |
| right: auto; } | |
| .is-dropdown-submenu-parent.opens-inner .is-dropdown-submenu { | |
| top: 100%; } | |
| .is-dropdown-submenu-parent.opens-left .is-dropdown-submenu { | |
| left: auto; | |
| right: 100%; } | |
| .is-dropdown-submenu { | |
| display: none; | |
| position: absolute; | |
| top: 0; | |
| left: 100%; | |
| min-width: 200px; | |
| z-index: 1; | |
| background: #fefefe; | |
| border: 1px solid #cacaca; } | |
| .is-dropdown-submenu .is-dropdown-submenu { | |
| margin-top: -1px; } | |
| .is-dropdown-submenu > li { | |
| width: 100%; } | |
| .is-dropdown-submenu:not(.js-dropdown-nohover) > .is-dropdown-submenu-parent:hover > .is-dropdown-submenu, .is-dropdown-submenu.js-dropdown-active { | |
| display: block; } | |
| .flex-video { | |
| position: relative; | |
| height: 0; | |
| padding-bottom: 75%; | |
| margin-bottom: 1rem; | |
| overflow: hidden; } | |
| .flex-video iframe, | |
| .flex-video object, | |
| .flex-video embed, | |
| .flex-video video { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; } | |
| .flex-video.widescreen { | |
| padding-bottom: 56.25%; } | |
| .flex-video.vimeo { | |
| padding-top: 0; } | |
| .label { | |
| display: inline-block; | |
| padding: 0.33333rem 0.5rem; | |
| font-size: 0.8rem; | |
| line-height: 1; | |
| white-space: nowrap; | |
| cursor: default; | |
| border-radius: 0; | |
| background: #2199e8; | |
| color: #fefefe; } | |
| .label.secondary { | |
| background: #777; | |
| color: #fefefe; } | |
| .label.success { | |
| background: #3adb76; | |
| color: #fefefe; } | |
| .label.alert { | |
| background: #ec5840; | |
| color: #fefefe; } | |
| .label.warning { | |
| background: #ffae00; | |
| color: #fefefe; } | |
| .media-object { | |
| margin-bottom: 1rem; | |
| display: block; } | |
| .media-object img { | |
| max-width: none; } | |
| @media screen and (min-width: 0em) and (max-width: 39.9375em) { | |
| .media-object.stack-for-small .media-object-section { | |
| display: block; | |
| padding: 0; | |
| padding-bottom: 1rem; } | |
| .media-object.stack-for-small .media-object-section img { | |
| width: 100%; } } | |
| .media-object-section { | |
| display: table-cell; | |
| vertical-align: top; } | |
| .media-object-section:first-child { | |
| padding-right: 1rem; } | |
| .media-object-section:last-child:not(:nth-child(2)) { | |
| padding-left: 1rem; } | |
| .media-object-section.middle { | |
| vertical-align: middle; } | |
| .media-object-section.bottom { | |
| vertical-align: bottom; } | |
| .menu { | |
| margin: 0; | |
| list-style-type: none; } | |
| .menu > li { | |
| display: table-cell; | |
| vertical-align: middle; } | |
| [data-whatinput='mouse'] .menu > li { | |
| outline: 0; } | |
| .menu > li > a { | |
| display: block; | |
| padding: 0.7rem 1rem; | |
| line-height: 1; } | |
| .menu input, | |
| .menu a, | |
| .menu button { | |
| margin-bottom: 0; } | |
| .menu > li > a > img, | |
| .menu > li > a > i { | |
| vertical-align: middle; } | |
| .menu > li > a > span { | |
| vertical-align: middle; } | |
| .menu > li > a > img, | |
| .menu > li > a > i { | |
| display: inline-block; | |
| margin-right: 0.25rem; } | |
| .menu > li { | |
| display: table-cell; } | |
| .menu.vertical > li { | |
| display: block; } | |
| @media screen and (min-width: 40em) { | |
| .menu.medium-horizontal > li { | |
| display: table-cell; } | |
| .menu.medium-vertical > li { | |
| display: block; } } | |
| @media screen and (min-width: 64em) { | |
| .menu.large-horizontal > li { | |
| display: table-cell; } | |
| .menu.large-vertical > li { | |
| display: block; } } | |
| .menu.simple li { | |
| line-height: 1; | |
| display: inline-block; | |
| margin-right: 1rem; } | |
| .menu.simple a { | |
| padding: 0; } | |
| .menu.align-right > li { | |
| float: right; } | |
| .menu.expanded { | |
| display: table; | |
| table-layout: fixed; | |
| width: 100%; } | |
| .menu.expanded > li:first-child:last-child { | |
| width: 100%; } | |
| .menu.icon-top > li > a { | |
| text-align: center; } | |
| .menu.icon-top > li > a > img, | |
| .menu.icon-top > li > a > i { | |
| display: block; | |
| margin: 0 auto 0.25rem; } | |
| .menu.nested { | |
| margin-left: 1rem; } | |
| .menu-text { | |
| font-weight: bold; | |
| color: inherit; | |
| line-height: 1; | |
| padding-top: 0; | |
| padding-bottom: 0; | |
| padding: 0.7rem 1rem; } | |
| .no-js [data-responsive-menu] ul { | |
| display: none; } | |
| html, | |
| body { | |
| height: 100%; } | |
| .off-canvas-wrapper { | |
| width: 100%; | |
| overflow-x: hidden; | |
| position: relative; | |
| -webkit-backface-visibility: hidden; | |
| backface-visibility: hidden; | |
| -webkit-overflow-scrolling: auto; } | |
| .off-canvas-wrapper-inner { | |
| position: relative; | |
| width: 100%; | |
| transition: -webkit-transform 0.5s ease; | |
| transition: transform 0.5s ease; | |
| transition: transform 0.5s ease, -webkit-transform 0.5s ease; } | |
| .off-canvas-wrapper-inner::before, .off-canvas-wrapper-inner::after { | |
| content: ' '; | |
| display: table; } | |
| .off-canvas-wrapper-inner::after { | |
| clear: both; } | |
| .off-canvas-content, | |
| .off-canvas-content { | |
| min-height: 100%; | |
| background: #fefefe; | |
| transition: -webkit-transform 0.5s ease; | |
| transition: transform 0.5s ease; | |
| transition: transform 0.5s ease, -webkit-transform 0.5s ease; | |
| -webkit-backface-visibility: hidden; | |
| backface-visibility: hidden; | |
| z-index: 1; | |
| box-shadow: 0 0 10px rgba(10, 10, 10, 0.5); } | |
| .js-off-canvas-exit { | |
| display: none; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| background: rgba(254, 254, 254, 0.25); | |
| cursor: pointer; | |
| transition: background 0.5s ease; } | |
| .off-canvas { | |
| position: absolute; | |
| background: #e6e6e6; | |
| z-index: -1; | |
| max-height: 100%; | |
| overflow-y: auto; | |
| -webkit-transform: translateX(0); | |
| -ms-transform: translateX(0); | |
| transform: translateX(0); } | |
| [data-whatinput='mouse'] .off-canvas { | |
| outline: 0; } | |
| .off-canvas.position-left { | |
| left: -250px; | |
| top: 0; | |
| width: 250px; } | |
| .is-open-left { | |
| -webkit-transform: translateX(250px); | |
| -ms-transform: translateX(250px); | |
| transform: translateX(250px); } | |
| .off-canvas.position-right { | |
| right: -250px; | |
| top: 0; | |
| width: 250px; } | |
| .is-open-right { | |
| -webkit-transform: translateX(-250px); | |
| -ms-transform: translateX(-250px); | |
| transform: translateX(-250px); } | |
| @media screen and (min-width: 40em) { | |
| .position-left.reveal-for-medium { | |
| left: 0; | |
| z-index: auto; | |
| position: fixed; } | |
| .position-left.reveal-for-medium ~ .off-canvas-content { | |
| margin-left: 250px; } | |
| .position-right.reveal-for-medium { | |
| right: 0; | |
| z-index: auto; | |
| position: fixed; } | |
| .position-right.reveal-for-medium ~ .off-canvas-content { | |
| margin-right: 250px; } } | |
| @media screen and (min-width: 64em) { | |
| .position-left.reveal-for-large { | |
| left: 0; | |
| z-index: auto; | |
| position: fixed; } | |
| .position-left.reveal-for-large ~ .off-canvas-content { | |
| margin-left: 250px; } | |
| .position-right.reveal-for-large { | |
| right: 0; | |
| z-index: auto; | |
| position: fixed; } | |
| .position-right.reveal-for-large ~ .off-canvas-content { | |
| margin-right: 250px; } } | |
| .orbit { | |
| position: relative; } | |
| .orbit-container { | |
| position: relative; | |
| margin: 0; | |
| overflow: hidden; | |
| list-style: none; } | |
| .orbit-slide { | |
| width: 100%; | |
| max-height: 100%; } | |
| .orbit-slide.no-motionui.is-active { | |
| top: 0; | |
| left: 0; } | |
| .orbit-figure { | |
| margin: 0; } | |
| .orbit-image { | |
| margin: 0; | |
| width: 100%; | |
| max-width: 100%; } | |
| .orbit-caption { | |
| position: absolute; | |
| bottom: 0; | |
| width: 100%; | |
| padding: 1rem; | |
| margin-bottom: 0; | |
| color: #fefefe; | |
| background-color: rgba(10, 10, 10, 0.5); } | |
| .orbit-previous, .orbit-next { | |
| position: absolute; | |
| top: 50%; | |
| -webkit-transform: translateY(-50%); | |
| -ms-transform: translateY(-50%); | |
| transform: translateY(-50%); | |
| z-index: 10; | |
| padding: 1rem; | |
| color: #fefefe; } | |
| [data-whatinput='mouse'] .orbit-previous, [data-whatinput='mouse'] .orbit-next { | |
| outline: 0; } | |
| .orbit-previous:hover, .orbit-next:hover, .orbit-previous:active, .orbit-next:active, .orbit-previous:focus, .orbit-next:focus { | |
| background-color: rgba(10, 10, 10, 0.5); } | |
| .orbit-previous { | |
| left: 0; } | |
| .orbit-next { | |
| left: auto; | |
| right: 0; } | |
| .orbit-bullets { | |
| position: relative; | |
| margin-top: 0.8rem; | |
| margin-bottom: 0.8rem; | |
| text-align: center; } | |
| [data-whatinput='mouse'] .orbit-bullets { | |
| outline: 0; } | |
| .orbit-bullets button { | |
| width: 1.2rem; | |
| height: 1.2rem; | |
| margin: 0.1rem; | |
| background-color: #cacaca; | |
| border-radius: 50%; } | |
| .orbit-bullets button:hover { | |
| background-color: #8a8a8a; } | |
| .orbit-bullets button.is-active { | |
| background-color: #8a8a8a; } | |
| .pagination { | |
| margin-left: 0; | |
| margin-bottom: 1rem; } | |
| .pagination::before, .pagination::after { | |
| content: ' '; | |
| display: table; } | |
| .pagination::after { | |
| clear: both; } | |
| .pagination li { | |
| font-size: 0.875rem; | |
| margin-right: 0.0625rem; | |
| border-radius: 0; | |
| display: none; } | |
| .pagination li:last-child, .pagination li:first-child { | |
| display: inline-block; } | |
| @media screen and (min-width: 40em) { | |
| .pagination li { | |
| display: inline-block; } } | |
| .pagination a, | |
| .pagination button { | |
| color: #0a0a0a; | |
| display: block; | |
| padding: 0.1875rem 0.625rem; | |
| border-radius: 0; } | |
| .pagination a:hover, | |
| .pagination button:hover { | |
| background: #e6e6e6; } | |
| .pagination .current { | |
| padding: 0.1875rem 0.625rem; | |
| background: #2199e8; | |
| color: #fefefe; | |
| cursor: default; } | |
| .pagination .disabled { | |
| padding: 0.1875rem 0.625rem; | |
| color: #cacaca; | |
| cursor: default; } | |
| .pagination .disabled:hover { | |
| background: transparent; } | |
| .pagination .ellipsis::after { | |
| content: '…'; | |
| padding: 0.1875rem 0.625rem; | |
| color: #0a0a0a; } | |
| .pagination-previous a::before, | |
| .pagination-previous.disabled::before { | |
| content: '«'; | |
| display: inline-block; | |
| margin-right: 0.5rem; } | |
| .pagination-next a::after, | |
| .pagination-next.disabled::after { | |
| content: '»'; | |
| display: inline-block; | |
| margin-left: 0.5rem; } | |
| .progress { | |
| background-color: #cacaca; | |
| height: 1rem; | |
| margin-bottom: 1rem; | |
| border-radius: 0; } | |
| .progress.primary .progress-meter { | |
| background-color: #2199e8; } | |
| .progress.secondary .progress-meter { | |
| background-color: #777; } | |
| .progress.success .progress-meter { | |
| background-color: #3adb76; } | |
| .progress.alert .progress-meter { | |
| background-color: #ec5840; } | |
| .progress.warning .progress-meter { | |
| background-color: #ffae00; } | |
| .progress-meter { | |
| position: relative; | |
| display: block; | |
| width: 0%; | |
| height: 100%; | |
| background-color: #2199e8; } | |
| .progress-meter-text { | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| -webkit-transform: translate(-50%, -50%); | |
| -ms-transform: translate(-50%, -50%); | |
| transform: translate(-50%, -50%); | |
| position: absolute; | |
| margin: 0; | |
| font-size: 0.75rem; | |
| font-weight: bold; | |
| color: #fefefe; | |
| white-space: nowrap; } | |
| .slider { | |
| position: relative; | |
| height: 0.5rem; | |
| margin-top: 1.25rem; | |
| margin-bottom: 2.25rem; | |
| background-color: #e6e6e6; | |
| cursor: pointer; | |
| -webkit-user-select: none; | |
| -moz-user-select: none; | |
| -ms-user-select: none; | |
| user-select: none; | |
| -ms-touch-action: none; | |
| touch-action: none; } | |
| .slider-fill { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| display: inline-block; | |
| max-width: 100%; | |
| height: 0.5rem; | |
| background-color: #cacaca; | |
| transition: all 0.2s ease-in-out; } | |
| .slider-fill.is-dragging { | |
| transition: all 0s linear; } | |
| .slider-handle { | |
| position: absolute; | |
| top: 50%; | |
| -webkit-transform: translateY(-50%); | |
| -ms-transform: translateY(-50%); | |
| transform: translateY(-50%); | |
| position: absolute; | |
| left: 0; | |
| z-index: 1; | |
| display: inline-block; | |
| width: 1.4rem; | |
| height: 1.4rem; | |
| background-color: #2199e8; | |
| transition: all 0.2s ease-in-out; | |
| -ms-touch-action: manipulation; | |
| touch-action: manipulation; | |
| border-radius: 0; } | |
| [data-whatinput='mouse'] .slider-handle { | |
| outline: 0; } | |
| .slider-handle:hover { | |
| background-color: #1583cc; } | |
| .slider-handle.is-dragging { | |
| transition: all 0s linear; } | |
| .slider.disabled, | |
| .slider[disabled] { | |
| opacity: 0.25; | |
| cursor: not-allowed; } | |
| .slider.vertical { | |
| display: inline-block; | |
| width: 0.5rem; | |
| height: 12.5rem; | |
| margin: 0 1.25rem; | |
| -webkit-transform: scale(1, -1); | |
| -ms-transform: scale(1, -1); | |
| transform: scale(1, -1); } | |
| .slider.vertical .slider-fill { | |
| top: 0; | |
| width: 0.5rem; | |
| max-height: 100%; } | |
| .slider.vertical .slider-handle { | |
| position: absolute; | |
| top: 0; | |
| left: 50%; | |
| width: 1.4rem; | |
| height: 1.4rem; | |
| -webkit-transform: translateX(-50%); | |
| -ms-transform: translateX(-50%); | |
| transform: translateX(-50%); } | |
| .sticky-container { | |
| position: relative; } | |
| .sticky { | |
| position: absolute; | |
| z-index: 0; | |
| -webkit-transform: translate3d(0, 0, 0); | |
| transform: translate3d(0, 0, 0); } | |
| .sticky.is-stuck { | |
| position: fixed; | |
| z-index: 5; } | |
| .sticky.is-stuck.is-at-top { | |
| top: 0; } | |
| .sticky.is-stuck.is-at-bottom { | |
| bottom: 0; } | |
| .sticky.is-anchored { | |
| position: absolute; | |
| left: auto; | |
| right: auto; } | |
| .sticky.is-anchored.is-at-bottom { | |
| bottom: 0; } | |
| body.is-reveal-open { | |
| overflow: hidden; } | |
| .reveal-overlay { | |
| display: none; | |
| position: fixed; | |
| top: 0; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| z-index: 1005; | |
| background-color: rgba(10, 10, 10, 0.45); | |
| overflow-y: scroll; } | |
| .reveal { | |
| display: none; | |
| z-index: 1006; | |
| padding: 1rem; | |
| border: 1px solid #cacaca; | |
| margin: 6.25rem auto 0; | |
| background-color: #fefefe; | |
| border-radius: 0; | |
| position: absolute; | |
| overflow-y: auto; } | |
| [data-whatinput='mouse'] .reveal { | |
| outline: 0; } | |
| @media screen and (min-width: 40em) { | |
| .reveal { | |
| min-height: 0; } } | |
| .reveal .column, .reveal .columns, | |
| .reveal .columns { | |
| min-width: 0; } | |
| .reveal > :last-child { | |
| margin-bottom: 0; } | |
| @media screen and (min-width: 40em) { | |
| .reveal { | |
| width: 600px; | |
| max-width: 75rem; } } | |
| @media screen and (min-width: 40em) { | |
| .reveal .reveal { | |
| left: auto; | |
| right: auto; | |
| margin: 0 auto; } } | |
| .reveal.collapse { | |
| padding: 0; } | |
| @media screen and (min-width: 40em) { | |
| .reveal.tiny { | |
| width: 30%; | |
| max-width: 75rem; } } | |
| @media screen and (min-width: 40em) { | |
| .reveal.small { | |
| width: 50%; | |
| max-width: 75rem; } } | |
| @media screen and (min-width: 40em) { | |
| .reveal.large { | |
| width: 90%; | |
| max-width: 75rem; } } | |
| .reveal.full { | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| height: 100vh; | |
| min-height: 100vh; | |
| max-width: none; | |
| margin-left: 0; | |
| border: 0; } | |
| .switch { | |
| margin-bottom: 1rem; | |
| outline: 0; | |
| position: relative; | |
| -webkit-user-select: none; | |
| -moz-user-select: none; | |
| -ms-user-select: none; | |
| user-select: none; | |
| color: #fefefe; | |
| font-weight: bold; | |
| font-size: 0.875rem; } | |
| .switch-input { | |
| opacity: 0; | |
| position: absolute; } | |
| .switch-paddle { | |
| background: #cacaca; | |
| cursor: pointer; | |
| display: block; | |
| position: relative; | |
| width: 4rem; | |
| height: 2rem; | |
| transition: all 0.25s ease-out; | |
| border-radius: 0; | |
| color: inherit; | |
| font-weight: inherit; } | |
| input + .switch-paddle { | |
| margin: 0; } | |
| .switch-paddle::after { | |
| background: #fefefe; | |
| content: ''; | |
| display: block; | |
| position: absolute; | |
| height: 1.5rem; | |
| left: 0.25rem; | |
| top: 0.25rem; | |
| width: 1.5rem; | |
| transition: all 0.25s ease-out; | |
| -webkit-transform: translate3d(0, 0, 0); | |
| transform: translate3d(0, 0, 0); | |
| border-radius: 0; } | |
| input:checked ~ .switch-paddle { | |
| background: #2199e8; } | |
| input:checked ~ .switch-paddle::after { | |
| left: 2.25rem; } | |
| [data-whatinput='mouse'] input:focus ~ .switch-paddle { | |
| outline: 0; } | |
| .switch-active, .switch-inactive { | |
| position: absolute; | |
| top: 50%; | |
| -webkit-transform: translateY(-50%); | |
| -ms-transform: translateY(-50%); | |
| transform: translateY(-50%); } | |
| .switch-active { | |
| left: 8%; | |
| display: none; } | |
| input:checked + label > .switch-active { | |
| display: block; } | |
| .switch-inactive { | |
| right: 15%; } | |
| input:checked + label > .switch-inactive { | |
| display: none; } | |
| .switch.tiny .switch-paddle { | |
| width: 3rem; | |
| height: 1.5rem; | |
| font-size: 0.625rem; } | |
| .switch.tiny .switch-paddle::after { | |
| width: 1rem; | |
| height: 1rem; } | |
| .switch.tiny input:checked ~ .switch-paddle:after { | |
| left: 1.75rem; } | |
| .switch.small .switch-paddle { | |
| width: 3.5rem; | |
| height: 1.75rem; | |
| font-size: 0.75rem; } | |
| .switch.small .switch-paddle::after { | |
| width: 1.25rem; | |
| height: 1.25rem; } | |
| .switch.small input:checked ~ .switch-paddle:after { | |
| left: 2rem; } | |
| .switch.large .switch-paddle { | |
| width: 5rem; | |
| height: 2.5rem; | |
| font-size: 1rem; } | |
| .switch.large .switch-paddle::after { | |
| width: 2rem; | |
| height: 2rem; } | |
| .switch.large input:checked ~ .switch-paddle:after { | |
| left: 2.75rem; } | |
| table { | |
| width: 100%; | |
| margin-bottom: 1rem; | |
| border-radius: 0; } | |
| table thead, | |
| table tbody, | |
| table tfoot { | |
| border: 1px solid #f1f1f1; | |
| background-color: #fefefe; } | |
| table caption { | |
| font-weight: bold; | |
| padding: 0.5rem 0.625rem 0.625rem; } | |
| table thead, | |
| table tfoot { | |
| background: #f8f8f8; | |
| color: #0a0a0a; } | |
| table thead tr, | |
| table tfoot tr { | |
| background: transparent; } | |
| table thead th, | |
| table thead td, | |
| table tfoot th, | |
| table tfoot td { | |
| padding: 0.5rem 0.625rem 0.625rem; | |
| font-weight: bold; | |
| text-align: left; } | |
| table tbody tr:nth-child(even) { | |
| background-color: #f1f1f1; } | |
| table tbody th, | |
| table tbody td { | |
| padding: 0.5rem 0.625rem 0.625rem; } | |
| @media screen and (max-width: 63.9375em) { | |
| table.stack thead { | |
| display: none; } | |
| table.stack tfoot { | |
| display: none; } | |
| table.stack tr, | |
| table.stack th, | |
| table.stack td { | |
| display: block; } | |
| table.stack td { | |
| border-top: 0; } } | |
| table.scroll { | |
| display: block; | |
| width: 100%; | |
| overflow-x: auto; } | |
| table.hover tr:hover { | |
| background-color: #f9f9f9; } | |
| table.hover tr:nth-of-type(even):hover { | |
| background-color: #ececec; } | |
| .tabs { | |
| margin: 0; | |
| list-style-type: none; | |
| background: #fefefe; | |
| border: 1px solid #e6e6e6; } | |
| .tabs::before, .tabs::after { | |
| content: ' '; | |
| display: table; } | |
| .tabs::after { | |
| clear: both; } | |
| .tabs.vertical > li { | |
| width: auto; | |
| float: none; | |
| display: block; } | |
| .tabs.simple > li > a { | |
| padding: 0; } | |
| .tabs.simple > li > a:hover { | |
| background: transparent; } | |
| .tabs.primary { | |
| background: #2199e8; } | |
| .tabs.primary > li > a { | |
| color: #fefefe; } | |
| .tabs.primary > li > a:hover, .tabs.primary > li > a:focus { | |
| background: #1893e4; } | |
| .tabs-title { | |
| float: left; } | |
| .tabs-title > a { | |
| display: block; | |
| padding: 1.25rem 1.5rem; | |
| line-height: 1; | |
| font-size: 12px; | |
| color: #2199e8; } | |
| .tabs-title > a:hover { | |
| background: #fefefe; } | |
| .tabs-title > a:focus, .tabs-title > a[aria-selected='true'] { | |
| background: #e6e6e6; } | |
| .tabs-content { | |
| background: #fefefe; | |
| transition: all 0.5s ease; | |
| border: 1px solid #e6e6e6; | |
| border-top: 0; } | |
| .tabs-content.vertical { | |
| border: 1px solid #e6e6e6; | |
| border-left: 0; } | |
| .tabs-panel { | |
| display: none; | |
| padding: 1rem; } | |
| .tabs-panel.is-active { | |
| display: block; } | |
| .thumbnail { | |
| border: solid 4px #fefefe; | |
| box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2); | |
| display: inline-block; | |
| line-height: 0; | |
| max-width: 100%; | |
| transition: box-shadow 200ms ease-out; | |
| border-radius: 0; | |
| margin-bottom: 1rem; } | |
| .thumbnail:hover, .thumbnail:focus { | |
| box-shadow: 0 0 6px 1px rgba(33, 153, 232, 0.5); } | |
| .title-bar { | |
| background: #0a0a0a; | |
| color: #fefefe; | |
| padding: 0.5rem; } | |
| .title-bar::before, .title-bar::after { | |
| content: ' '; | |
| display: table; } | |
| .title-bar::after { | |
| clear: both; } | |
| .title-bar .menu-icon { | |
| margin-left: 0.25rem; | |
| margin-right: 0.5rem; } | |
| .title-bar-left { | |
| float: left; } | |
| .title-bar-right { | |
| float: right; | |
| text-align: right; } | |
| .title-bar-title { | |
| font-weight: bold; | |
| vertical-align: middle; | |
| display: inline-block; } | |
| .menu-icon { | |
| position: relative; | |
| display: inline-block; | |
| vertical-align: middle; | |
| cursor: pointer; | |
| width: 20px; | |
| height: 16px; } | |
| .menu-icon::after { | |
| content: ''; | |
| position: absolute; | |
| display: block; | |
| width: 100%; | |
| height: 2px; | |
| background: #fefefe; | |
| top: 0; | |
| left: 0; | |
| box-shadow: 0 7px 0 #fefefe, 0 14px 0 #fefefe; } | |
| .menu-icon:hover::after { | |
| background: #cacaca; | |
| box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; } | |
| .menu-icon.dark { | |
| position: relative; | |
| display: inline-block; | |
| vertical-align: middle; | |
| cursor: pointer; | |
| width: 20px; | |
| height: 16px; } | |
| .menu-icon.dark::after { | |
| content: ''; | |
| position: absolute; | |
| display: block; | |
| width: 100%; | |
| height: 2px; | |
| background: #0a0a0a; | |
| top: 0; | |
| left: 0; | |
| box-shadow: 0 7px 0 #0a0a0a, 0 14px 0 #0a0a0a; } | |
| .menu-icon.dark:hover::after { | |
| background: #8a8a8a; | |
| box-shadow: 0 7px 0 #8a8a8a, 0 14px 0 #8a8a8a; } | |
| .has-tip { | |
| border-bottom: dotted 1px #8a8a8a; | |
| font-weight: bold; | |
| position: relative; | |
| display: inline-block; | |
| cursor: help; } | |
| .tooltip { | |
| background-color: #0a0a0a; | |
| color: #fefefe; | |
| font-size: 80%; | |
| padding: 0.75rem; | |
| position: absolute; | |
| z-index: 10; | |
| top: calc(100% + 0.6495rem); | |
| max-width: 10rem !important; | |
| border-radius: 0; } | |
| .tooltip::before { | |
| content: ''; | |
| display: block; | |
| width: 0; | |
| height: 0; | |
| border: inset 0.75rem; | |
| border-color: transparent transparent #0a0a0a; | |
| border-bottom-style: solid; | |
| border-top-width: 0; | |
| bottom: 100%; | |
| position: absolute; | |
| left: 50%; | |
| -webkit-transform: translateX(-50%); | |
| -ms-transform: translateX(-50%); | |
| transform: translateX(-50%); } | |
| .tooltip.top::before { | |
| content: ''; | |
| display: block; | |
| width: 0; | |
| height: 0; | |
| border: inset 0.75rem; | |
| border-color: #0a0a0a transparent transparent; | |
| border-top-style: solid; | |
| border-bottom-width: 0; | |
| top: 100%; | |
| bottom: auto; } | |
| .tooltip.left::before { | |
| content: ''; | |
| display: block; | |
| width: 0; | |
| height: 0; | |
| border: inset 0.75rem; | |
| border-color: transparent transparent transparent #0a0a0a; | |
| border-left-style: solid; | |
| border-right-width: 0; | |
| bottom: auto; | |
| left: 100%; | |
| top: 50%; | |
| -webkit-transform: translateY(-50%); | |
| -ms-transform: translateY(-50%); | |
| transform: translateY(-50%); } | |
| .tooltip.right::before { | |
| content: ''; | |
| display: block; | |
| width: 0; | |
| height: 0; | |
| border: inset 0.75rem; | |
| border-color: transparent #0a0a0a transparent transparent; | |
| border-right-style: solid; | |
| border-left-width: 0; | |
| bottom: auto; | |
| left: auto; | |
| right: 100%; | |
| top: 50%; | |
| -webkit-transform: translateY(-50%); | |
| -ms-transform: translateY(-50%); | |
| transform: translateY(-50%); } | |
| .top-bar { | |
| padding: 0.5rem; } | |
| .top-bar::before, .top-bar::after { | |
| content: ' '; | |
| display: table; } | |
| .top-bar::after { | |
| clear: both; } | |
| .top-bar, | |
| .top-bar ul { | |
| background-color: #e6e6e6; } | |
| .top-bar input { | |
| width: 200px; | |
| margin-right: 1rem; } | |
| .top-bar input.button { | |
| width: auto; } | |
| @media screen and (max-width: 39.9375em) { | |
| .stacked-for-small .top-bar-title { | |
| width: 100%; } | |
| .stacked-for-small .top-bar-right { | |
| width: 100%; } | |
| .stacked-for-small .top-bar-left { | |
| width: 100%; } } | |
| @media screen and (max-width: 63.9375em) { | |
| .stacked-for-medium .top-bar-title { | |
| width: 100%; } | |
| .stacked-for-medium .top-bar-right { | |
| width: 100%; } | |
| .stacked-for-medium .top-bar-left { | |
| width: 100%; } } | |
| @media screen and (max-width: 74.9375em) { | |
| .stacked-for-large .top-bar-title { | |
| width: 100%; } | |
| .stacked-for-large .top-bar-right { | |
| width: 100%; } | |
| .stacked-for-large .top-bar-left { | |
| width: 100%; } } | |
| @media screen and (min-width: 0em) and (max-width: 39.9375em) { | |
| .top-bar-title { | |
| width: 100%; } | |
| .top-bar-right { | |
| width: 100%; } | |
| .top-bar-left { | |
| width: 100%; } } | |
| .top-bar-title { | |
| float: left; | |
| margin-right: 1rem; } | |
| .top-bar-left { | |
| float: left; } | |
| .top-bar-right { | |
| float: right; } | |
| .slide-in-down.mui-enter { | |
| -webkit-transform: translateY(-100%); | |
| -ms-transform: translateY(-100%); | |
| transform: translateY(-100%); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| -webkit-backface-visibility: hidden; | |
| backface-visibility: hidden; } | |
| .slide-in-down.mui-enter.mui-enter-active { | |
| -webkit-transform: translateY(0); | |
| -ms-transform: translateY(0); | |
| transform: translateY(0); } | |
| .slide-in-left.mui-enter { | |
| -webkit-transform: translateX(-100%); | |
| -ms-transform: translateX(-100%); | |
| transform: translateX(-100%); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| -webkit-backface-visibility: hidden; | |
| backface-visibility: hidden; } | |
| .slide-in-left.mui-enter.mui-enter-active { | |
| -webkit-transform: translateX(0); | |
| -ms-transform: translateX(0); | |
| transform: translateX(0); } | |
| .slide-in-up.mui-enter { | |
| -webkit-transform: translateY(100%); | |
| -ms-transform: translateY(100%); | |
| transform: translateY(100%); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| -webkit-backface-visibility: hidden; | |
| backface-visibility: hidden; } | |
| .slide-in-up.mui-enter.mui-enter-active { | |
| -webkit-transform: translateY(0); | |
| -ms-transform: translateY(0); | |
| transform: translateY(0); } | |
| .slide-in-right.mui-enter { | |
| -webkit-transform: translateX(100%); | |
| -ms-transform: translateX(100%); | |
| transform: translateX(100%); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| -webkit-backface-visibility: hidden; | |
| backface-visibility: hidden; } | |
| .slide-in-right.mui-enter.mui-enter-active { | |
| -webkit-transform: translateX(0); | |
| -ms-transform: translateX(0); | |
| transform: translateX(0); } | |
| .slide-out-down.mui-leave { | |
| -webkit-transform: translateY(0); | |
| -ms-transform: translateY(0); | |
| transform: translateY(0); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| -webkit-backface-visibility: hidden; | |
| backface-visibility: hidden; } | |
| .slide-out-down.mui-leave.mui-leave-active { | |
| -webkit-transform: translateY(100%); | |
| -ms-transform: translateY(100%); | |
| transform: translateY(100%); } | |
| .slide-out-right.mui-leave { | |
| -webkit-transform: translateX(0); | |
| -ms-transform: translateX(0); | |
| transform: translateX(0); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| -webkit-backface-visibility: hidden; | |
| backface-visibility: hidden; } | |
| .slide-out-right.mui-leave.mui-leave-active { | |
| -webkit-transform: translateX(100%); | |
| -ms-transform: translateX(100%); | |
| transform: translateX(100%); } | |
| .slide-out-up.mui-leave { | |
| -webkit-transform: translateY(0); | |
| -ms-transform: translateY(0); | |
| transform: translateY(0); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| -webkit-backface-visibility: hidden; | |
| backface-visibility: hidden; } | |
| .slide-out-up.mui-leave.mui-leave-active { | |
| -webkit-transform: translateY(-100%); | |
| -ms-transform: translateY(-100%); | |
| transform: translateY(-100%); } | |
| .slide-out-left.mui-leave { | |
| -webkit-transform: translateX(0); | |
| -ms-transform: translateX(0); | |
| transform: translateX(0); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| -webkit-backface-visibility: hidden; | |
| backface-visibility: hidden; } | |
| .slide-out-left.mui-leave.mui-leave-active { | |
| -webkit-transform: translateX(-100%); | |
| -ms-transform: translateX(-100%); | |
| transform: translateX(-100%); } | |
| .fade-in.mui-enter { | |
| opacity: 0; | |
| transition-property: opacity; } | |
| .fade-in.mui-enter.mui-enter-active { | |
| opacity: 1; } | |
| .fade-out.mui-leave { | |
| opacity: 1; | |
| transition-property: opacity; } | |
| .fade-out.mui-leave.mui-leave-active { | |
| opacity: 0; } | |
| .hinge-in-from-top.mui-enter { | |
| -webkit-transform: perspective(2000px) rotateX(-90deg); | |
| transform: perspective(2000px) rotateX(-90deg); | |
| -webkit-transform-origin: top; | |
| -ms-transform-origin: top; | |
| transform-origin: top; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 0; } | |
| .hinge-in-from-top.mui-enter.mui-enter-active { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| opacity: 1; } | |
| .hinge-in-from-right.mui-enter { | |
| -webkit-transform: perspective(2000px) rotateY(-90deg); | |
| transform: perspective(2000px) rotateY(-90deg); | |
| -webkit-transform-origin: right; | |
| -ms-transform-origin: right; | |
| transform-origin: right; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 0; } | |
| .hinge-in-from-right.mui-enter.mui-enter-active { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| opacity: 1; } | |
| .hinge-in-from-bottom.mui-enter { | |
| -webkit-transform: perspective(2000px) rotateX(90deg); | |
| transform: perspective(2000px) rotateX(90deg); | |
| -webkit-transform-origin: bottom; | |
| -ms-transform-origin: bottom; | |
| transform-origin: bottom; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 0; } | |
| .hinge-in-from-bottom.mui-enter.mui-enter-active { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| opacity: 1; } | |
| .hinge-in-from-left.mui-enter { | |
| -webkit-transform: perspective(2000px) rotateY(90deg); | |
| transform: perspective(2000px) rotateY(90deg); | |
| -webkit-transform-origin: left; | |
| -ms-transform-origin: left; | |
| transform-origin: left; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 0; } | |
| .hinge-in-from-left.mui-enter.mui-enter-active { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| opacity: 1; } | |
| .hinge-in-from-middle-x.mui-enter { | |
| -webkit-transform: perspective(2000px) rotateX(-90deg); | |
| transform: perspective(2000px) rotateX(-90deg); | |
| -webkit-transform-origin: center; | |
| -ms-transform-origin: center; | |
| transform-origin: center; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 0; } | |
| .hinge-in-from-middle-x.mui-enter.mui-enter-active { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| opacity: 1; } | |
| .hinge-in-from-middle-y.mui-enter { | |
| -webkit-transform: perspective(2000px) rotateY(-90deg); | |
| transform: perspective(2000px) rotateY(-90deg); | |
| -webkit-transform-origin: center; | |
| -ms-transform-origin: center; | |
| transform-origin: center; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 0; } | |
| .hinge-in-from-middle-y.mui-enter.mui-enter-active { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| opacity: 1; } | |
| .hinge-out-from-top.mui-leave { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| -webkit-transform-origin: top; | |
| -ms-transform-origin: top; | |
| transform-origin: top; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 1; } | |
| .hinge-out-from-top.mui-leave.mui-leave-active { | |
| -webkit-transform: perspective(2000px) rotateX(-90deg); | |
| transform: perspective(2000px) rotateX(-90deg); | |
| opacity: 0; } | |
| .hinge-out-from-right.mui-leave { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| -webkit-transform-origin: right; | |
| -ms-transform-origin: right; | |
| transform-origin: right; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 1; } | |
| .hinge-out-from-right.mui-leave.mui-leave-active { | |
| -webkit-transform: perspective(2000px) rotateY(-90deg); | |
| transform: perspective(2000px) rotateY(-90deg); | |
| opacity: 0; } | |
| .hinge-out-from-bottom.mui-leave { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| -webkit-transform-origin: bottom; | |
| -ms-transform-origin: bottom; | |
| transform-origin: bottom; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 1; } | |
| .hinge-out-from-bottom.mui-leave.mui-leave-active { | |
| -webkit-transform: perspective(2000px) rotateX(90deg); | |
| transform: perspective(2000px) rotateX(90deg); | |
| opacity: 0; } | |
| .hinge-out-from-left.mui-leave { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| -webkit-transform-origin: left; | |
| -ms-transform-origin: left; | |
| transform-origin: left; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 1; } | |
| .hinge-out-from-left.mui-leave.mui-leave-active { | |
| -webkit-transform: perspective(2000px) rotateY(90deg); | |
| transform: perspective(2000px) rotateY(90deg); | |
| opacity: 0; } | |
| .hinge-out-from-middle-x.mui-leave { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| -webkit-transform-origin: center; | |
| -ms-transform-origin: center; | |
| transform-origin: center; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 1; } | |
| .hinge-out-from-middle-x.mui-leave.mui-leave-active { | |
| -webkit-transform: perspective(2000px) rotateX(-90deg); | |
| transform: perspective(2000px) rotateX(-90deg); | |
| opacity: 0; } | |
| .hinge-out-from-middle-y.mui-leave { | |
| -webkit-transform: perspective(2000px) rotate(0deg); | |
| transform: perspective(2000px) rotate(0deg); | |
| -webkit-transform-origin: center; | |
| -ms-transform-origin: center; | |
| transform-origin: center; | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 1; } | |
| .hinge-out-from-middle-y.mui-leave.mui-leave-active { | |
| -webkit-transform: perspective(2000px) rotateY(-90deg); | |
| transform: perspective(2000px) rotateY(-90deg); | |
| opacity: 0; } | |
| .scale-in-up.mui-enter { | |
| -webkit-transform: scale(0.5); | |
| -ms-transform: scale(0.5); | |
| transform: scale(0.5); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 0; } | |
| .scale-in-up.mui-enter.mui-enter-active { | |
| -webkit-transform: scale(1); | |
| -ms-transform: scale(1); | |
| transform: scale(1); | |
| opacity: 1; } | |
| .scale-in-down.mui-enter { | |
| -webkit-transform: scale(1.5); | |
| -ms-transform: scale(1.5); | |
| transform: scale(1.5); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 0; } | |
| .scale-in-down.mui-enter.mui-enter-active { | |
| -webkit-transform: scale(1); | |
| -ms-transform: scale(1); | |
| transform: scale(1); | |
| opacity: 1; } | |
| .scale-out-up.mui-leave { | |
| -webkit-transform: scale(1); | |
| -ms-transform: scale(1); | |
| transform: scale(1); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 1; } | |
| .scale-out-up.mui-leave.mui-leave-active { | |
| -webkit-transform: scale(1.5); | |
| -ms-transform: scale(1.5); | |
| transform: scale(1.5); | |
| opacity: 0; } | |
| .scale-out-down.mui-leave { | |
| -webkit-transform: scale(1); | |
| -ms-transform: scale(1); | |
| transform: scale(1); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 1; } | |
| .scale-out-down.mui-leave.mui-leave-active { | |
| -webkit-transform: scale(0.5); | |
| -ms-transform: scale(0.5); | |
| transform: scale(0.5); | |
| opacity: 0; } | |
| .spin-in.mui-enter { | |
| -webkit-transform: rotate(-0.75turn); | |
| -ms-transform: rotate(-0.75turn); | |
| transform: rotate(-0.75turn); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 0; } | |
| .spin-in.mui-enter.mui-enter-active { | |
| -webkit-transform: rotate(0); | |
| -ms-transform: rotate(0); | |
| transform: rotate(0); | |
| opacity: 1; } | |
| .spin-out.mui-leave { | |
| -webkit-transform: rotate(0); | |
| -ms-transform: rotate(0); | |
| transform: rotate(0); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 1; } | |
| .spin-out.mui-leave.mui-leave-active { | |
| -webkit-transform: rotate(0.75turn); | |
| -ms-transform: rotate(0.75turn); | |
| transform: rotate(0.75turn); | |
| opacity: 0; } | |
| .spin-in-ccw.mui-enter { | |
| -webkit-transform: rotate(0.75turn); | |
| -ms-transform: rotate(0.75turn); | |
| transform: rotate(0.75turn); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 0; } | |
| .spin-in-ccw.mui-enter.mui-enter-active { | |
| -webkit-transform: rotate(0); | |
| -ms-transform: rotate(0); | |
| transform: rotate(0); | |
| opacity: 1; } | |
| .spin-out-ccw.mui-leave { | |
| -webkit-transform: rotate(0); | |
| -ms-transform: rotate(0); | |
| transform: rotate(0); | |
| transition-property: opacity, -webkit-transform; | |
| transition-property: transform, opacity; | |
| transition-property: transform, opacity, -webkit-transform; | |
| opacity: 1; } | |
| .spin-out-ccw.mui-leave.mui-leave-active { | |
| -webkit-transform: rotate(-0.75turn); | |
| -ms-transform: rotate(-0.75turn); | |
| transform: rotate(-0.75turn); | |
| opacity: 0; } | |
| .slow { | |
| transition-duration: 750ms !important; } | |
| .fast { | |
| transition-duration: 250ms !important; } | |
| .linear { | |
| transition-timing-function: linear !important; } | |
| .ease { | |
| transition-timing-function: ease !important; } | |
| .ease-in { | |
| transition-timing-function: ease-in !important; } | |
| .ease-out { | |
| transition-timing-function: ease-out !important; } | |
| .ease-in-out { | |
| transition-timing-function: ease-in-out !important; } | |
| .bounce-in { | |
| transition-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; } | |
| .bounce-out { | |
| transition-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; } | |
| .bounce-in-out { | |
| transition-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; } | |
| .short-delay { | |
| transition-delay: 300ms !important; } | |
| .long-delay { | |
| transition-delay: 700ms !important; } | |
| .shake { | |
| -webkit-animation-name: shake-7; | |
| animation-name: shake-7; } | |
| @-webkit-keyframes shake-7 { | |
| 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% { | |
| -webkit-transform: translateX(7%); | |
| transform: translateX(7%); } | |
| 5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% { | |
| -webkit-transform: translateX(-7%); | |
| transform: translateX(-7%); } } | |
| @keyframes shake-7 { | |
| 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% { | |
| -webkit-transform: translateX(7%); | |
| transform: translateX(7%); } | |
| 5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% { | |
| -webkit-transform: translateX(-7%); | |
| transform: translateX(-7%); } } | |
| .spin-cw { | |
| -webkit-animation-name: spin-cw-1turn; | |
| animation-name: spin-cw-1turn; } | |
| @-webkit-keyframes spin-cw-1turn { | |
| 0% { | |
| -webkit-transform: rotate(-1turn); | |
| transform: rotate(-1turn); } | |
| 100% { | |
| -webkit-transform: rotate(0); | |
| transform: rotate(0); } } | |
| @keyframes spin-cw-1turn { | |
| 0% { | |
| -webkit-transform: rotate(-1turn); | |
| transform: rotate(-1turn); } | |
| 100% { | |
| -webkit-transform: rotate(0); | |
| transform: rotate(0); } } | |
| .spin-ccw { | |
| -webkit-animation-name: spin-cw-1turn; | |
| animation-name: spin-cw-1turn; } | |
| @keyframes spin-cw-1turn { | |
| 0% { | |
| -webkit-transform: rotate(0); | |
| transform: rotate(0); } | |
| 100% { | |
| -webkit-transform: rotate(1turn); | |
| transform: rotate(1turn); } } | |
| .wiggle { | |
| -webkit-animation-name: wiggle-7deg; | |
| animation-name: wiggle-7deg; } | |
| @-webkit-keyframes wiggle-7deg { | |
| 40%, 50%, 60% { | |
| -webkit-transform: rotate(7deg); | |
| transform: rotate(7deg); } | |
| 35%, 45%, 55%, 65% { | |
| -webkit-transform: rotate(-7deg); | |
| transform: rotate(-7deg); } | |
| 0%, 30%, 70%, 100% { | |
| -webkit-transform: rotate(0); | |
| transform: rotate(0); } } | |
| @keyframes wiggle-7deg { | |
| 40%, 50%, 60% { | |
| -webkit-transform: rotate(7deg); | |
| transform: rotate(7deg); } | |
| 35%, 45%, 55%, 65% { | |
| -webkit-transform: rotate(-7deg); | |
| transform: rotate(-7deg); } | |
| 0%, 30%, 70%, 100% { | |
| -webkit-transform: rotate(0); | |
| transform: rotate(0); } } | |
| .infinite { | |
| -webkit-animation-iteration-count: infinite; | |
| animation-iteration-count: infinite; } | |
| .slow { | |
| -webkit-animation-duration: 750ms !important; | |
| animation-duration: 750ms !important; } | |
| .fast { | |
| -webkit-animation-duration: 250ms !important; | |
| animation-duration: 250ms !important; } | |
| .linear { | |
| -webkit-animation-timing-function: linear !important; | |
| animation-timing-function: linear !important; } | |
| .ease { | |
| -webkit-animation-timing-function: ease !important; | |
| animation-timing-function: ease !important; } | |
| .ease-in { | |
| -webkit-animation-timing-function: ease-in !important; | |
| animation-timing-function: ease-in !important; } | |
| .ease-out { | |
| -webkit-animation-timing-function: ease-out !important; | |
| animation-timing-function: ease-out !important; } | |
| .ease-in-out { | |
| -webkit-animation-timing-function: ease-in-out !important; | |
| animation-timing-function: ease-in-out !important; } | |
| .bounce-in { | |
| -webkit-animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; | |
| animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; } | |
| .bounce-out { | |
| -webkit-animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; | |
| animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; } | |
| .bounce-in-out { | |
| -webkit-animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; | |
| animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; } | |
| .short-delay { | |
| -webkit-animation-delay: 300ms !important; | |
| animation-delay: 300ms !important; } | |
| .long-delay { | |
| -webkit-animation-delay: 700ms !important; | |
| animation-delay: 700ms !important; } | |
| main { | |
| clear: both; } | |
| .layout-content { | |
| padding: 3em 2%; } | |
| .layout-grey { | |
| padding: 3em 2%; | |
| background-color: rgba(229, 229, 229, 0.5); | |
| background: #e5e5e5; } | |
| .global-header { | |
| padding: 0 2%; | |
| margin-bottom: 50px; | |
| box-shadow: 0 0 5px rgba(0, 0, 0, 0.18); | |
| border-bottom: 1px solid #ddd; } | |
| .global-header-logo { | |
| display: block; | |
| /* float: left; */ | |
| margin: 8px auto; | |
| transition: all 0.4s ease; | |
| width: 6em; } | |
| @media screen and (min-width: 40em) { | |
| .global-header-logo { | |
| float: left; | |
| width: 8em; | |
| margin: 1em auto; } } | |
| .nav-global-secondary li { | |
| font-weight: 700; | |
| text-transform: uppercase; } | |
| .nav-global-secondary li a { | |
| color: black; } | |
| .nav-global-secondary a.state-active { | |
| background-color: #2c296b; | |
| color: white; } | |
| .nav-global-secondary, .nav-global-secondary ul { | |
| margin: 0; | |
| list-style-type: none; } | |
| .nav-global-secondary > li, .nav-global-secondary ul > li { | |
| display: table-cell; | |
| vertical-align: middle; } | |
| [data-whatinput='mouse'] .nav-global-secondary > li, [data-whatinput='mouse'] .nav-global-secondary ul > li { | |
| outline: 0; } | |
| .nav-global-secondary > li > a, .nav-global-secondary ul > li > a { | |
| display: block; | |
| padding: 24px 24px; | |
| line-height: 1; } | |
| .nav-global-secondary input, | |
| .nav-global-secondary a, | |
| .nav-global-secondary button, .nav-global-secondary ul input, | |
| .nav-global-secondary ul a, | |
| .nav-global-secondary ul button { | |
| margin-bottom: 0; } | |
| .nav-global-secondary > li, .nav-global-secondary ul > li { | |
| display: table-cell; } | |
| .nav-global-secondary.vertical > li, .nav-global-secondary ul.vertical > li { | |
| display: block; } | |
| @media screen and (min-width: 40em) { | |
| .nav-global-secondary.medium-horizontal > li, .nav-global-secondary ul.medium-horizontal > li { | |
| display: table-cell; } | |
| .nav-global-secondary.medium-vertical > li, .nav-global-secondary ul.medium-vertical > li { | |
| display: block; } } | |
| @media screen and (min-width: 64em) { | |
| .nav-global-secondary.large-horizontal > li, .nav-global-secondary ul.large-horizontal > li { | |
| display: table-cell; } | |
| .nav-global-secondary.large-vertical > li, .nav-global-secondary ul.large-vertical > li { | |
| display: block; } } | |
| .nav-global-secondary.nested, .nav-global-secondary ul.nested { | |
| margin-left: 1rem; } | |
| .nav-global-secondary.align-right, .nav-global-secondary ul.align-right { | |
| float: right; } | |
| .nav-global-secondary.nav-tier2 li, .nav-global-secondary ul.nav-tier2 li { | |
| font-weight: normal; } | |
| .nav-global-secondary .nav-tier2 { | |
| background-color: white; | |
| border-bottom: 1px solid #ddd; | |
| border-top: 1px solid #ddd; | |
| display: block; | |
| float: right; | |
| font-size: 14px; | |
| font-weight: normal !important; | |
| left: auto; | |
| margin-left: -9999px; | |
| overflow: hidden; | |
| padding: 0 2% 0 9999px; | |
| position: absolute; | |
| right: 0; | |
| text-align: right; | |
| width: auto; } | |
| @media screen and (max-width: 40em) { | |
| .nav-global-secondary ul { | |
| width: 100%; } | |
| .nav-global-secondary .nav-tier2 li { | |
| float: left; | |
| clear: both; | |
| width: 100%; | |
| text-align: left; } | |
| .nav-global-secondary .nav-tier2 { | |
| margin-left: 0; | |
| float: left; | |
| padding: 0.5em 0 1em 0; | |
| position: relative; | |
| width: 100%; | |
| margin-bottom: 1.5em; } } | |
| .button.login { | |
| padding: 12px 26px; | |
| border-radius: 5px; | |
| margin-left: 1.5em; | |
| color: #fff; } | |
| .masthead { | |
| clear: both; | |
| overflow: hidden; | |
| position: relative; | |
| text-align: center; | |
| background-color: black; } | |
| .masthead:before { | |
| background: url("https://style.codeforamerica.org/3/style/images/images/masthead-default.jpg") center center no-repeat; | |
| background-size: cover; | |
| content: ""; | |
| display: none; | |
| left: 0; | |
| max-width: none; | |
| min-height: 400px; | |
| opacity: 0.8; | |
| position: absolute; | |
| top: 0; | |
| width: 100%; | |
| z-index: 1; | |
| display: block; } | |
| .masthead-header { | |
| clear: both; | |
| float: left; | |
| margin: 0em auto; | |
| overflow: hidden; | |
| padding: 0 4%; | |
| position: inherit; | |
| width: auto; | |
| z-index: 1; | |
| text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.6); } | |
| .masthead-header .page-title a:link, .masthead-header .page-title a:visited, .masthead-header .page-title a:hover, .masthead-header .page-title a:focus, .masthead-header .page-title a:active { | |
| color: white; | |
| text-decoration: none; } | |
| .masthead-header h1.page-title { | |
| max-width: 40em; | |
| margin-left: auto; | |
| margin-right: auto; | |
| margin-top: 96px; } | |
| .masthead-header p { | |
| color: white; | |
| font-size: 24px; | |
| line-height: 35px; | |
| font-weight: 500; | |
| max-width: 25em; | |
| margin-left: auto; | |
| margin-right: auto; } | |
| .masthead-xl .masthead-header:before { | |
| background-image: url("https://style.codeforamerica.org/3/style/images/fade-black.png"); | |
| width: 100%; | |
| content: ""; | |
| height: 300px; | |
| display: block; | |
| z-index: -1; | |
| bottom: 0; | |
| left: 0; | |
| position: absolute; } | |
| .global-footer { | |
| position: relative; | |
| background: #000; | |
| color: #fff; | |
| padding: 2em 2em 1em 2em; } | |
| .global-footer .logo { | |
| left: 2%; | |
| margin: 16px 16px 16px 0; | |
| position: absolute; | |
| width: 100px; } | |
| .global-footer small { | |
| float: left; | |
| margin: 10px 0 10px 120px; } | |
| /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcC5jc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9mb3VuZGF0aW9uLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL21vdGlvbi11aS9zcmMvX2NsYXNzZXMuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvbW90aW9uLXVpL3NyYy9fc2V0dGluZ3Muc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL19nbG9iYWwuc2NzcyIsIl9zZXR0aW5ncy5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvZ3JpZC9fY2xhc3Nlcy5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvZ3JpZC9fcm93LnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy91dGlsL191bml0LnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy91dGlsL19taXhpbnMuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2dyaWQvX2d1dHRlci5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvdXRpbC9fYnJlYWtwb2ludC5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvZ3JpZC9fY29sdW1uLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9ncmlkL19zaXplLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9ncmlkL19wb3NpdGlvbi5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvZ3JpZC9fbGF5b3V0LnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy90eXBvZ3JhcGh5L19iYXNlLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy90eXBvZ3JhcGh5L19oZWxwZXJzLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy90eXBvZ3JhcGh5L19hbGlnbm1lbnQuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL3R5cG9ncmFwaHkvX3ByaW50LnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9jb21wb25lbnRzL19idXR0b24uc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2Zvcm1zL190ZXh0LnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9mb3Jtcy9fY2hlY2tib3guc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2Zvcm1zL19sYWJlbC5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvZm9ybXMvX2hlbHAtdGV4dC5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvZm9ybXMvX2lucHV0LWdyb3VwLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9mb3Jtcy9fZmllbGRzZXQuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2Zvcm1zL19zZWxlY3Quc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2Zvcm1zL19lcnJvci5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvY29tcG9uZW50cy9fdmlzaWJpbGl0eS5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvY29tcG9uZW50cy9fZmxvYXQuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX2FjY29yZGlvbi5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvY29tcG9uZW50cy9fYWNjb3JkaW9uLW1lbnUuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX2JhZGdlLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9jb21wb25lbnRzL19icmVhZGNydW1icy5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvY29tcG9uZW50cy9fYnV0dG9uLWdyb3VwLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9jb21wb25lbnRzL19jYWxsb3V0LnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9jb21wb25lbnRzL19jbG9zZS1idXR0b24uc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX2RyaWxsZG93bi5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvY29tcG9uZW50cy9fZHJvcGRvd24uc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX2Ryb3Bkb3duLW1lbnUuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX2ZsZXgtdmlkZW8uc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX2xhYmVsLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9jb21wb25lbnRzL19tZWRpYS1vYmplY3Quc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX21lbnUuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX29mZi1jYW52YXMuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX29yYml0LnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9jb21wb25lbnRzL19wYWdpbmF0aW9uLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9jb21wb25lbnRzL19wcm9ncmVzcy1iYXIuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX3NsaWRlci5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvY29tcG9uZW50cy9fc3RpY2t5LnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9jb21wb25lbnRzL19yZXZlYWwuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX3N3aXRjaC5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvY29tcG9uZW50cy9fdGFibGUuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL3V0aWwvX2NvbG9yLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9jb21wb25lbnRzL190YWJzLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL2ZvdW5kYXRpb24tc2l0ZXMvc2Nzcy9jb21wb25lbnRzL190aHVtYm5haWwuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvZm91bmRhdGlvbi1zaXRlcy9zY3NzL2NvbXBvbmVudHMvX3RpdGxlLWJhci5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvY29tcG9uZW50cy9fdG9vbHRpcC5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9mb3VuZGF0aW9uLXNpdGVzL3Njc3MvY29tcG9uZW50cy9fdG9wLWJhci5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9tb3Rpb24tdWkvc3JjL3V0aWwvX2tleWZyYW1lLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL21vdGlvbi11aS9zcmMvdHJhbnNpdGlvbnMvX3NsaWRlLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL21vdGlvbi11aS9zcmMvdXRpbC9fdHJhbnNpdGlvbi5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9tb3Rpb24tdWkvc3JjL3RyYW5zaXRpb25zL19mYWRlLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL21vdGlvbi11aS9zcmMvZWZmZWN0cy9faGluZ2Uuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvbW90aW9uLXVpL3NyYy90cmFuc2l0aW9ucy9faGluZ2Uuc2NzcyIsIi4uLy4uLy4uL2Jvd2VyX2NvbXBvbmVudHMvbW90aW9uLXVpL3NyYy90cmFuc2l0aW9ucy9fem9vbS5zY3NzIiwiLi4vLi4vLi4vYm93ZXJfY29tcG9uZW50cy9tb3Rpb24tdWkvc3JjL3RyYW5zaXRpb25zL19zcGluLnNjc3MiLCIuLi8uLi8uLi9ib3dlcl9jb21wb25lbnRzL21vdGlvbi11aS9zcmMvdXRpbC9fYW5pbWF0aW9uLnNjc3MiLCJhcHAuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUI7QUNBakI7Ozs7O0dBS0c7QUNNRDtFQVJBLDJCQ2tCYztFRGpCZCxtQ0NpQ2UsRURoQ2hCOztBRTZNQyw0RUFBNEU7QUFFNUU7Ozs7S0FJRztBQUVIO0VBQ0Usd0JBQXdCO0VBQUUsT0FBTztFQUNqQywyQkFBMkI7RUFBRSxPQUFPO0VBQ3BDLCtCQUErQjtFQUFFLE9BQU8sRUFDekM7O0FBRUQ7O0tBRUc7QUFFSDtFQUNFLFVBQVUsRUFDWDs7QUFFRDtrRkFDZ0Y7QUFFaEY7Ozs7O0tBS0c7QUFFSDs7Ozs7Ozs7Ozs7OztFQWFFLGVBQWUsRUFDaEI7O0FBRUQ7OztLQUdHO0FBRUg7Ozs7RUFJRSxzQkFBc0I7RUFBRSxPQUFPO0VBQy9CLHlCQUF5QjtFQUFFLE9BQU8sRUFDbkM7O0FBRUQ7OztLQUdHO0FBRUg7RUFDRSxjQUFjO0VBQ2QsVUFBVSxFQUNYOztBQUVEOzs7S0FHRztBSjdNTDs7RUlpTkksY0FBYyxFQUNmOztBQUVEO2tGQUNnRjtBQUVoRjs7S0FFRztBQUVIO0VBQ0UsOEJBQThCLEVBQy9COztBQUVEOzs7S0FHRztBQUVIOztFQUVFLFdBQVcsRUFDWjs7QUFFRDtrRkFDZ0Y7QUFFaEY7O0tBRUc7QUFFSDtFQUNFLDBCQUEwQixFQUMzQjs7QUFFRDs7S0FFRztBQUVIOztFQUVFLGtCQUFrQixFQUNuQjs7QUFFRDs7S0FFRztBQUVIO0VBQ0UsbUJBQW1CLEVBQ3BCOztBQUVEOzs7S0FHRztBQUVIO0VBQ0UsZUFBZTtFQUNmLGlCQUFpQixFQUNsQjs7QUFFRDs7S0FFRztBQUVIO0VBQ0UsaUJBQWlCO0VBQ2pCLFlBQVksRUFDYjs7QUFFRDs7S0FFRztBQUVIO0VBQ0UsZUFBZSxFQUNoQjs7QUFFRDs7S0FFRztBQUVIOztFQUVFLGVBQWU7RUFDZixlQUFlO0VBQ2YsbUJBQW1CO0VBQ25CLHlCQUF5QixFQUMxQjs7QUFFRDtFQUNFLFlBQVksRUFDYjs7QUFFRDtFQUNFLGdCQUFnQixFQUNqQjs7QUFFRDtrRkFDZ0Y7QUFFaEY7O0tBRUc7QUFFSDtFQUNFLFVBQVUsRUFDWDs7QUFFRDs7S0FFRztBQUVIO0VBQ0UsaUJBQWlCLEVBQ2xCOztBQUVEO2tGQUNnRjtBQUVoRjs7S0FFRztBQUVIO0VBQ0UsaUJBQWlCLEVBQ2xCOztBQUVEOztLQUVHO0FBRUg7RUFDRSx3QkFBd0I7RUFDeEIsVUFBVSxFQUNYOztBQUVEOztLQUVHO0FBRUg7RUFDRSxlQUFlLEVBQ2hCOztBQUVEOztLQUVHO0FBRUg7Ozs7RUFJRSxrQ0FBa0M7RUFDbEMsZUFBZSxFQUNoQjs7QUFFRDtrRkFDZ0Y7QUFFaEY7OztLQUdHO0FBRUg7Ozs7O0tBS0c7QUFFSDs7Ozs7RUFLRSxlQUFlO0VBQUUsT0FBTztFQUN4QixjQUFjO0VBQUUsT0FBTztFQUN2QixVQUFVO0VBQUUsT0FBTyxFQUNwQjs7QUFFRDs7S0FFRztBQUVIO0VBQ0Usa0JBQWtCLEVBQ25COztBQUVEOzs7OztLQUtHO0FBRUg7O0VBRUUscUJBQXFCLEVBQ3RCOztBQUVEOzs7Ozs7S0FNRztBQUVIOzs7O0VBSUUsMkJBQTJCO0VBQUUsT0FBTztFQUNwQyxnQkFBZ0I7RUFBRSxPQUFPLEVBQzFCOztBQUVEOztLQUVHO0FBRUg7O0VBRUUsZ0JBQWdCLEVBQ2pCOztBQUVEOztLQUVHO0FBRUg7O0VBRUUsVUFBVTtFQUNWLFdBQVcsRUFDWjs7QUFFRDs7O0tBR0c7QUFFSDtFQUNFLG9CQUFvQixFQUNyQjs7QUFFRDs7Ozs7O0tBTUc7QUFFSDs7RUFFRSx1QkFBdUI7RUFBRSxPQUFPO0VBQ2hDLFdBQVc7RUFBRSxPQUFPLEVBQ3JCOztBQUVEOzs7O0tBSUc7QUFFSDs7RUFFRSxhQUFhLEVBQ2Q7O0FBRUQ7OztLQUdHO0FBRUg7RUFDRSw4QkFBOEI7RUFBRSxPQUFPO0VBQ3ZDLHdCQUF3QjtFQUFFLE9BQU8sRUFDbEM7O0FBRUQ7Ozs7S0FJRztBQUVIOztFQUVFLHlCQUF5QixFQUMxQjs7QUFFRDs7O0tBR0c7QUFFSDs7OztNQUlJO0FBRUo7OztLQUdHO0FBRUg7RUFDRSxVQUFVO0VBQUUsT0FBTztFQUNuQixXQUFXO0VBQUUsT0FBTyxFQUNyQjs7QUFFRDs7S0FFRztBQUVIO0VBQ0UsZUFBZSxFQUNoQjs7QUFFRDs7O0tBR0c7QUFFSDtFQUNFLGtCQUFrQixFQUNuQjs7QUFFRDtrRkFDZ0Y7QUFFaEY7O0tBRUc7QUFFSDtFQUNFLDBCQUEwQjtFQUMxQixrQkFBa0IsRUFDbkI7O0FBRUQ7O0VBRUUsV0FBVyxFQUNaOztBQXBnQkQ7RUFDRSx5RUFBZ0QsRUFDakQ7O0FBRUQ7RUFDRSxnQkM3RW1CO0VEOEVuQix1QkFBdUIsRUFDeEI7O0FBR0Q7OztFQUdFLG9CQUFvQixFQUNyQjs7QUFHRDtFQUNFLFdBQVc7RUFDWCxVQUFVO0VBQ1YscUZDN0VzRjtFRDhFdEYsb0JDMUV5QjtFRDJFekIsaUJDNUZtQjtFRDZGbkIsZUNwRlc7RURxRlgsb0JDcEZXO0VEdUZULG9DQUFvQztFQUNwQyxtQ0FBbUMsRUFFdEM7O0FBRUQ7RUFFRSxnQkFBZ0I7RUFDaEIsYUFBYTtFQUNiLGdDQUFnQztFQUdoQyxzQkFBc0I7RUFDdEIsdUJBQXVCLEVBQ3hCOztBQUdEO0VBQ0UsYUFBYTtFQUNiLGlCQUFpQjtFQUNqQixpQkNsR2EsRURtR2Q7O0FBR0Q7RUFDRSxZQUFZO0VBQ1osaUJDeEdhLEVEeUdkOztBQUlEOzs7Ozs7Ozs7RUFNSSwyQkFBMkIsRUFDNUI7O0FBSUg7RUFDRSx5QkFBeUI7RUFDekIsc0JBQXNCO0VBQ3RCLHdCQUF3QjtFQUN4QixXQUFXO0VBQ1gsVUFBVTtFQUNWLGlCQzlIYTtFRCtIYixlQUFlLEVBQ2hCOztBQUdEO0VBQ0UsMEJBQTBCLEVBQzNCOztBQUVEO0VBQ0UseUJBQXlCLEVBQzFCOztBRW5MRDtFQ3FDRSxpQkNrQmtCO0VEakJsQixrQkFBa0I7RUFDbEIsbUJBQW1CLEVESHBCO0VBcENEO0lHOEdFLGFBQWE7SUFDYixlQUFlLEVBQ2hCO0VIaEhEO0lHbUhFLFlBQVksRUFDYjtFSHBIRDtJSWZBLGdCQUFnQjtJQUNoQixpQkFBaUIsRUptQm1CO0VBTHBDO0lDMkRFLHVCQURpQjtJQUVqQix3QkFGaUIsRURqQ2hCO0lLd0ZEO01MakhGO1FDMkRFLHdCQURpQjtRQUVqQix5QkFGaUIsRURqQ2hCLEVBQUE7SUF6Qkg7TUFzQk0sZUFBZTtNQUNmLGdCQUFnQixFQUNqQjtFQXhCTDtJQTZCSSxnQkFBZ0IsRUFNakI7SUFuQ0g7TUFnQ00sa0JBQWtCO01BQ2xCLG1CQUFtQixFQUNwQjs7QUFLTDtFTUdNLHVCQUhnQjtFQUloQix3QkFKZ0I7RUNsRHRCLFlEZXNCO0VBNkN0QixZUjRCeUQsRUU5QnhEO0VLa0VDO0lMMUVGO01NR00sd0JBSGdCO01BSWhCLHlCQUpnQixFTlFyQixFQUFBO0VBUkQ7SU1nQkksYVJ1QnNELEVRdEJ2RDtFTmpCSDtJUWxCRSxZVndEdUQsRVV2RHhEOztBUjZCRDtFQUNFLFlBQVksRUFTYjtFQU5DO0lBQ0UsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YsZ0JBQWdCLEVBQ2pCOztBQU1DO0VPN0VKLGdCRGVzQixFTmdFakI7O0FBSUM7RVFsRkosbUJBQW1CO0VBQ25CLGVBSG1CLEVSc0ZkOztBQUVEO0VRdEZKLG1CQUFtQjtFQUNuQixnQkFIbUIsRVIwRmQ7O0FBTUg7RVF0RUosZ0JGYnNCLEVOcUZqQjs7QUFwQkQ7RU83RUosaUJEZXNCLEVOZ0VqQjs7QUFJQztFUWxGSixtQkFBbUI7RUFDbkIsZ0JBSG1CLEVSc0ZkOztBQUVEO0VRdEZKLG1CQUFtQjtFQUNuQixpQkFIbUIsRVIwRmQ7O0FBTUg7RVF0RUosc0JGVnNCLEVOa0ZqQjs7QUFwQkQ7RU83RUosV0Rlc0IsRU5nRWpCOztBQUlDO0VRbEZKLG1CQUFtQjtFQUNuQixVQUhtQixFUnNGZDs7QUFFRDtFUXRGSixtQkFBbUI7RUFDbkIsV0FIbUIsRVIwRmQ7O0FBTUg7RVF0RUosdUJGVnNCLEVOa0ZqQjs7QUFwQkQ7RU83RUosaUJEZXNCLEVOZ0VqQjs7QUFJQztFUWxGSixtQkFBbUI7RUFDbkIsZ0JBSG1CLEVSc0ZkOztBQUVEO0VRdEZKLG1CQUFtQjtFQUNuQixpQkFIbUIsRVIwRmQ7O0FBTUg7RVF0RUosaUJGVnNCLEVOa0ZqQjs7QUFwQkQ7RU83RUosaUJEZXNCLEVOZ0VqQjs7QUFJQztFUWxGSixtQkFBbUI7RUFDbkIsZ0JBSG1CLEVSc0ZkOztBQUVEO0VRdEZKLG1CQUFtQjtFQUNuQixpQkFIbUIsRVIwRmQ7O0FBTUg7RVF0RUosdUJGVnNCLEVOa0ZqQjs7QUFwQkQ7RU83RUosV0Rlc0IsRU5nRWpCOztBQUlDO0VRbEZKLG1CQUFtQjtFQUNuQixVQUhtQixFUnNGZDs7QUFFRDtFUXRGSixtQkFBbUI7RUFDbkIsV0FIbUIsRVIwRmQ7O0FBTUg7RVF0RUosdUJGVnNCLEVOa0ZqQjs7QUFwQkQ7RU83RUosaUJEZXNCLEVOZ0VqQjs7QUFJQztFUWxGSixtQkFBbUI7RUFDbkIsZ0JBSG1CLEVSc0ZkOztBQUVEO0VRdEZKLG1CQUFtQjtFQUNuQixpQkFIbUIsRVIwRmQ7O0FBTUg7RVF0RUosaUJGVnNCLEVOa0ZqQjs7QUFwQkQ7RU83RUosaUJEZXNCLEVOZ0VqQjs7QUFJQztFUWxGSixtQkFBbUI7RUFDbkIsZ0JBSG1CLEVSc0ZkOztBQUVEO0VRdEZKLG1CQUFtQjtFQUNuQixpQkFIbUIsRVIwRmQ7O0FBTUg7RVF0RUosdUJGVnNCLEVOa0ZqQjs7QUFwQkQ7RU83RUosV0Rlc0IsRU5nRWpCOztBQUlDO0VRbEZKLG1CQUFtQjtFQUNuQixVQUhtQixFUnNGZDs7QUFFRDtFUXRGSixtQkFBbUI7RUFDbkIsV0FIbUIsRVIwRmQ7O0FBTUg7RVF0RUosdUJGVnNCLEVOa0ZqQjs7QUFwQkQ7RU83RUosaUJEZXNCLEVOZ0VqQjs7QUFJQztFUWxGSixtQkFBbUI7RUFDbkIsZ0JBSG1CLEVSc0ZkOztBQUVEO0VRdEZKLG1CQUFtQjtFQUNuQixpQkFIbUIsRVIwRmQ7O0FBTUg7RVF0RUosaUJGVnNCLEVOa0ZqQjs7QUFwQkQ7RU83RUosaUJEZXNCLEVOZ0VqQjs7QUFJQztFUWxGSixtQkFBbUI7RUFDbkIsZ0JBSG1CLEVSc0ZkOztBQUVEO0VRdEZKLG1CQUFtQjtFQUNuQixpQkFIbUIsRVIwRmQ7O0FBTUg7RVF0RUosdUJGVnNCLEVOa0ZqQjs7QUFwQkQ7RU83RUosWURlc0IsRU5nRWpCOztBQWdCRDtFUXRFSix1QkZWc0IsRU5rRmpCOztBQUtEO0VTbkdGLFlBQWlCO0VBQ2pCLFlYb0Z1RCxFV3ZFeEQ7RVRxRkc7SVMvRkEsWUFBWSxFQUNiO0VUOEZDO0lTM0ZBLFlBQVksRUFDYjtFVDBGQztJU3ZGQSxZQUFZLEVBQ2I7O0FUc0ZDO0VTbkdGLFdBQWlCO0VBQ2pCLFlYb0Z1RCxFV3ZFeEQ7RVRxRkc7SVMvRkEsWUFBWSxFQUNiO0VUOEZDO0lTM0ZBLFlBQVksRUFDYjtFVDBGQztJU3ZGQSxZQUFZLEVBQ2I7O0FUc0ZDO0VTbkdGLGlCQUFpQjtFQUNqQixZWG9GdUQsRVd2RXhEO0VUcUZHO0lTL0ZBLFlBQVksRUFDYjtFVDhGQztJUzNGQSxZQUFZLEVBQ2I7RVQwRkM7SVN2RkEsWUFBWSxFQUNiOztBVHNGQztFU25HRixXQUFpQjtFQUNqQixZWG9GdUQsRVd2RXhEO0VUcUZHO0lTL0ZBLFlBQVksRUFDYjtFVDhGQztJUzNGQSxZQUFZLEVBQ2I7RVQwRkM7SVN2RkEsWUFBWSxFQUNiOztBVHNGQztFU25HRixXQUFpQjtFQUNqQixZWG9GdUQsRVd2RXhEO0VUcUZHO0lTL0ZBLFlBQVksRUFDYjtFVDhGQztJUzNGQSxZQUFZLEVBQ2I7RVQwRkM7SVN2RkEsWUFBWSxFQUNiOztBVHNGQztFU25HRixpQkFBaUI7RUFDakIsWVhvRnVELEVXdkV4RDtFVHFGRztJUy9GQSxZQUFZLEVBQ2I7RVQ4RkM7SVMzRkEsWUFBWSxFQUNiO0VUMEZDO0lTdkZBLFlBQVksRUFDYjs7QVRzRkM7RVNuR0YsaUJBQWlCO0VBQ2pCLFlYb0Z1RCxFV3ZFeEQ7RVRxRkc7SVMvRkEsWUFBWSxFQUNiO0VUOEZDO0lTM0ZBLFlBQVksRUFDYjtFVDBGQztJU3ZGQSxZQUFZLEVBQ2I7O0FUc0ZDO0VTbkdGLGFBQWlCO0VBQ2pCLFlYb0Z1RCxFV3ZFeEQ7RVRxRkc7SVMvRkEsWUFBWSxFQUNiO0VUOEZDO0lTM0ZBLFlBQVksRUFDYjtFVDBGQztJU3ZGQSxZQUFZLEVBQ2I7O0FUNEZEO0VJaEhGLGdCQUFnQjtFQUNoQixpQkFBaUIsRUpnSG1COztBQURsQztFQUlJLGVBQWU7RUFDZixnQkFBZ0IsRUFDakI7O0FBR0g7RUloSEYsdUJBRGlCO0VBRWpCLHdCQUZpQixFSjBIOEI7O0FBSTdDO0VRN0hBLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsbUJBQW1CLEVSNkhsQjs7QUFHRDs7O0VRdkhGLGlCQUFpQjtFQUNqQixlQUFlO0VBQ2YsZ0JBQWdCO0VBQ2hCLFlBQVksRVJzSFQ7O0FLYkQ7RUwvQ0U7SU83RUosZ0JEZXNCLEVOZ0VqQjtFQUlDO0lRbEZKLG1CQUFtQjtJQUNuQixlQUhtQixFUnNGZDtFQUVEO0lRdEZKLG1CQUFtQjtJQUNuQixnQkFIbUIsRVIwRmQ7RUFNSDtJUXRFSixnQkZic0IsRU5xRmpCO0VBcEJEO0lPN0VKLGlCRGVzQixFTmdFakI7RUFJQztJUWxGSixtQkFBbUI7SUFDbkIsZ0JBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLGlCQUhtQixFUjBGZDtFQU1IO0lRdEVKLHNCRlZzQixFTmtGakI7RUFwQkQ7SU83RUosV0Rlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLFVBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLFdBSG1CLEVSMEZkO0VBTUg7SVF0RUosdUJGVnNCLEVOa0ZqQjtFQXBCRDtJTzdFSixpQkRlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLGdCQUhtQixFUnNGZDtFQUVEO0lRdEZKLG1CQUFtQjtJQUNuQixpQkFIbUIsRVIwRmQ7RUFNSDtJUXRFSixpQkZWc0IsRU5rRmpCO0VBcEJEO0lPN0VKLGlCRGVzQixFTmdFakI7RUFJQztJUWxGSixtQkFBbUI7SUFDbkIsZ0JBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLGlCQUhtQixFUjBGZDtFQU1IO0lRdEVKLHVCRlZzQixFTmtGakI7RUFwQkQ7SU83RUosV0Rlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLFVBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLFdBSG1CLEVSMEZkO0VBTUg7SVF0RUosdUJGVnNCLEVOa0ZqQjtFQXBCRDtJTzdFSixpQkRlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLGdCQUhtQixFUnNGZDtFQUVEO0lRdEZKLG1CQUFtQjtJQUNuQixpQkFIbUIsRVIwRmQ7RUFNSDtJUXRFSixpQkZWc0IsRU5rRmpCO0VBcEJEO0lPN0VKLGlCRGVzQixFTmdFakI7RUFJQztJUWxGSixtQkFBbUI7SUFDbkIsZ0JBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLGlCQUhtQixFUjBGZDtFQU1IO0lRdEVKLHVCRlZzQixFTmtGakI7RUFwQkQ7SU83RUosV0Rlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLFVBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLFdBSG1CLEVSMEZkO0VBTUg7SVF0RUosdUJGVnNCLEVOa0ZqQjtFQXBCRDtJTzdFSixpQkRlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLGdCQUhtQixFUnNGZDtFQUVEO0lRdEZKLG1CQUFtQjtJQUNuQixpQkFIbUIsRVIwRmQ7RUFNSDtJUXRFSixpQkZWc0IsRU5rRmpCO0VBcEJEO0lPN0VKLGlCRGVzQixFTmdFakI7RUFJQztJUWxGSixtQkFBbUI7SUFDbkIsZ0JBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLGlCQUhtQixFUjBGZDtFQU1IO0lRdEVKLHVCRlZzQixFTmtGakI7RUFwQkQ7SU83RUosWURlc0IsRU5nRWpCO0VBZ0JEO0lRdEVKLHVCRlZzQixFTmtGakI7RUFLRDtJU25HRixZQUFpQjtJQUNqQixZWG9GdUQsRVd2RXhEO0lUcUZHO01TL0ZBLFlBQVksRUFDYjtJVDhGQztNUzNGQSxZQUFZLEVBQ2I7SVQwRkM7TVN2RkEsWUFBWSxFQUNiO0VUc0ZDO0lTbkdGLFdBQWlCO0lBQ2pCLFlYb0Z1RCxFV3ZFeEQ7SVRxRkc7TVMvRkEsWUFBWSxFQUNiO0lUOEZDO01TM0ZBLFlBQVksRUFDYjtJVDBGQztNU3ZGQSxZQUFZLEVBQ2I7RVRzRkM7SVNuR0YsaUJBQWlCO0lBQ2pCLFlYb0Z1RCxFV3ZFeEQ7SVRxRkc7TVMvRkEsWUFBWSxFQUNiO0lUOEZDO01TM0ZBLFlBQVksRUFDYjtJVDBGQztNU3ZGQSxZQUFZLEVBQ2I7RVRzRkM7SVNuR0YsV0FBaUI7SUFDakIsWVhvRnVELEVXdkV4RDtJVHFGRztNUy9GQSxZQUFZLEVBQ2I7SVQ4RkM7TVMzRkEsWUFBWSxFQUNiO0lUMEZDO01TdkZBLFlBQVksRUFDYjtFVHNGQztJU25HRixXQUFpQjtJQUNqQixZWG9GdUQsRVd2RXhEO0lUcUZHO01TL0ZBLFlBQVksRUFDYjtJVDhGQztNUzNGQSxZQUFZLEVBQ2I7SVQwRkM7TVN2RkEsWUFBWSxFQUNiO0VUc0ZDO0lTbkdGLGlCQUFpQjtJQUNqQixZWG9GdUQsRVd2RXhEO0lUcUZHO01TL0ZBLFlBQVksRUFDYjtJVDhGQztNUzNGQSxZQUFZLEVBQ2I7SVQwRkM7TVN2RkEsWUFBWSxFQUNiO0VUc0ZDO0lTbkdGLGlCQUFpQjtJQUNqQixZWG9GdUQsRVd2RXhEO0lUcUZHO01TL0ZBLFlBQVksRUFDYjtJVDhGQztNUzNGQSxZQUFZLEVBQ2I7SVQwRkM7TVN2RkEsWUFBWSxFQUNiO0VUc0ZDO0lTbkdGLGFBQWlCO0lBQ2pCLFlYb0Z1RCxFV3ZFeEQ7SVRxRkc7TVMvRkEsWUFBWSxFQUNiO0lUOEZDO01TM0ZBLFlBQVksRUFDYjtJVDBGQztNU3ZGQSxZQUFZLEVBQ2I7RVQ0RkQ7SUloSEYsZ0JBQWdCO0lBQ2hCLGlCQUFpQixFSmdIbUI7RUFEbEM7SUFJSSxlQUFlO0lBQ2YsZ0JBQWdCLEVBQ2pCO0VBR0g7SUloSEYsd0JBRGlCO0lBRWpCLHlCQUZpQixFSjBIOEI7RUFJN0M7SVE3SEEsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixtQkFBbUIsRVI2SGxCO0VBR0Q7OztJUXZIRixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixZQUFZLEVSc0hULEVBQUE7O0FLYkQ7RUwvQ0U7SU83RUosZ0JEZXNCLEVOZ0VqQjtFQUlDO0lRbEZKLG1CQUFtQjtJQUNuQixlQUhtQixFUnNGZDtFQUVEO0lRdEZKLG1CQUFtQjtJQUNuQixnQkFIbUIsRVIwRmQ7RUFNSDtJUXRFSixnQkZic0IsRU5xRmpCO0VBcEJEO0lPN0VKLGlCRGVzQixFTmdFakI7RUFJQztJUWxGSixtQkFBbUI7SUFDbkIsZ0JBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLGlCQUhtQixFUjBGZDtFQU1IO0lRdEVKLHNCRlZzQixFTmtGakI7RUFwQkQ7SU83RUosV0Rlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLFVBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLFdBSG1CLEVSMEZkO0VBTUg7SVF0RUosdUJGVnNCLEVOa0ZqQjtFQXBCRDtJTzdFSixpQkRlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLGdCQUhtQixFUnNGZDtFQUVEO0lRdEZKLG1CQUFtQjtJQUNuQixpQkFIbUIsRVIwRmQ7RUFNSDtJUXRFSixpQkZWc0IsRU5rRmpCO0VBcEJEO0lPN0VKLGlCRGVzQixFTmdFakI7RUFJQztJUWxGSixtQkFBbUI7SUFDbkIsZ0JBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLGlCQUhtQixFUjBGZDtFQU1IO0lRdEVKLHVCRlZzQixFTmtGakI7RUFwQkQ7SU83RUosV0Rlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLFVBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLFdBSG1CLEVSMEZkO0VBTUg7SVF0RUosdUJGVnNCLEVOa0ZqQjtFQXBCRDtJTzdFSixpQkRlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLGdCQUhtQixFUnNGZDtFQUVEO0lRdEZKLG1CQUFtQjtJQUNuQixpQkFIbUIsRVIwRmQ7RUFNSDtJUXRFSixpQkZWc0IsRU5rRmpCO0VBcEJEO0lPN0VKLGlCRGVzQixFTmdFakI7RUFJQztJUWxGSixtQkFBbUI7SUFDbkIsZ0JBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLGlCQUhtQixFUjBGZDtFQU1IO0lRdEVKLHVCRlZzQixFTmtGakI7RUFwQkQ7SU83RUosV0Rlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLFVBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLFdBSG1CLEVSMEZkO0VBTUg7SVF0RUosdUJGVnNCLEVOa0ZqQjtFQXBCRDtJTzdFSixpQkRlc0IsRU5nRWpCO0VBSUM7SVFsRkosbUJBQW1CO0lBQ25CLGdCQUhtQixFUnNGZDtFQUVEO0lRdEZKLG1CQUFtQjtJQUNuQixpQkFIbUIsRVIwRmQ7RUFNSDtJUXRFSixpQkZWc0IsRU5rRmpCO0VBcEJEO0lPN0VKLGlCRGVzQixFTmdFakI7RUFJQztJUWxGSixtQkFBbUI7SUFDbkIsZ0JBSG1CLEVSc0ZkO0VBRUQ7SVF0RkosbUJBQW1CO0lBQ25CLGlCQUhtQixFUjBGZDtFQU1IO0lRdEVKLHVCRlZzQixFTmtGakI7RUFwQkQ7SU83RUosWURlc0IsRU5nRWpCO0VBZ0JEO0lRdEVKLHVCRlZzQixFTmtGakI7RUFLRDtJU25HRixZQUFpQjtJQUNqQixZWG9GdUQsRVd2RXhEO0lUcUZHO01TL0ZBLFlBQVksRUFDYjtJVDhGQztNUzNGQSxZQUFZLEVBQ2I7SVQwRkM7TVN2RkEsWUFBWSxFQUNiO0VUc0ZDO0lTbkdGLFdBQWlCO0lBQ2pCLFlYb0Z1RCxFV3ZFeEQ7SVRxRkc7TVMvRkEsWUFBWSxFQUNiO0lUOEZDO01TM0ZBLFlBQVksRUFDYjtJVDBGQztNU3ZGQSxZQUFZLEVBQ2I7RVRzRkM7SVNuR0YsaUJBQWlCO0lBQ2pCLFlYb0Z1RCxFV3ZFeEQ7SVRxRkc7TVMvRkEsWUFBWSxFQUNiO0lUOEZDO01TM0ZBLFlBQVksRUFDYjtJVDBGQztNU3ZGQSxZQUFZLEVBQ2I7RVRzRkM7SVNuR0YsV0FBaUI7SUFDakIsWVhvRnVELEVXdkV4RDtJVHFGRztNUy9GQSxZQUFZLEVBQ2I7SVQ4RkM7TVMzRkEsWUFBWSxFQUNiO0lUMEZDO01TdkZBLFlBQVksRUFDYjtFVHNGQztJU25HRixXQUFpQjtJQUNqQixZWG9GdUQsRVd2RXhEO0lUcUZHO01TL0ZBLFlBQVksRUFDYjtJVDhGQztNUzNGQSxZQUFZLEVBQ2I7SVQwRkM7TVN2RkEsWUFBWSxFQUNiO0VUc0ZDO0lTbkdGLGlCQUFpQjtJQUNqQixZWG9GdUQsRVd2RXhEO0lUcUZHO01TL0ZBLFlBQVksRUFDYjtJVDhGQztNUzNGQSxZQUFZLEVBQ2I7SVQwRkM7TVN2RkEsWUFBWSxFQUNiO0VUc0ZDO0lTbkdGLGlCQUFpQjtJQUNqQixZWG9GdUQsRVd2RXhEO0lUcUZHO01TL0ZBLFlBQVksRUFDYjtJVDhGQztNUzNGQSxZQUFZLEVBQ2I7SVQwRkM7TVN2RkEsWUFBWSxFQUNiO0VUc0ZDO0lTbkdGLGFBQWlCO0lBQ2pCLFlYb0Z1RCxFV3ZFeEQ7SVRxRkc7TVMvRkEsWUFBWSxFQUNiO0lUOEZDO01TM0ZBLFlBQVksRUFDYjtJVDBGQztNU3ZGQSxZQUFZLEVBQ2I7RVQ0RkQ7SUloSEYsZ0JBQWdCO0lBQ2hCLGlCQUFpQixFSmdIbUI7RUFEbEM7SUFJSSxlQUFlO0lBQ2YsZ0JBQWdCLEVBQ2pCO0VBR0g7SUloSEYsd0JBRGlCO0lBRWpCLHlCQUZpQixFSjBIOEI7RUFJN0M7SVE3SEEsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixtQkFBbUIsRVI2SGxCO0VBR0Q7OztJUXZIRixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixZQUFZLEVSc0hULEVBQUE7O0FVZ0ZIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBbUJFLFVBQVU7RUFDVixXQUFXLEVBQ1o7O0FBR0Q7RUFDRSxtQkFBbUI7RUFDbkIsaUJYcElzQjtFV3FJdEIsb0JYcEkwQjtFV3FJMUIsbUNYcEl5QyxFV3FJMUM7O0FBR0Q7O0VBRUUsbUJBQW1CO0VBQ25CLHFCQUFxQixFQUN0Qjs7QUFHRDs7RUFFRSxrQlg5TXFCO0VXK01yQixxQkFBcUIsRUFDdEI7O0FBR0Q7RUFDRSxlWDNKaUI7RVc0SmpCLHFCQUFxQixFQUN0Qjs7QUFHRDs7Ozs7O0VBTUUsaUNYaE1vQztFV2lNcEMsb0JYak95QjtFV2tPekIsbUJYaE1zQjtFV2lNdEIsZVg3S2tCO0VXOEtsQixtQ1gzS3NDO0VXNEt0QyxjQUFjO0VBQ2Qsc0JYOUt5QjtFVytLekIsaUJYaExtQixFV3NMcEI7RUFuQkQ7Ozs7OztJQWdCSSxlWHBQZTtJV3FQZixlQUFlLEVBQ2hCOztBQU9HO0VBQ0Usa0JSck9ZLEVRc09iOztBQUZEO0VBQ0UsbUJSck9ZLEVRc09iOztBQUZEO0VBQ0UscUJSck9ZLEVRc09iOztBQUZEO0VBQ0Usb0JSck9ZLEVRc09iOztBQUZEO0VBQ0UscUJSck9ZLEVRc09iOztBQUZEO0VBQ0UsZ0JSck9ZLEVRc09iOztBTDVLTDtFSzBLSTtJQUNFLGdCUnJPWSxFUXNPYjtFQUZEO0lBQ0Usa0JSck9ZLEVRc09iO0VBRkQ7SUFDRSxxQlJyT1ksRVFzT2I7RUFGRDtJQUNFLHFCUnJPWSxFUXNPYjtFQUZEO0lBQ0UsbUJSck9ZLEVRc09iO0VBRkQ7SUFDRSxnQlJyT1ksRVFzT2IsRUFBQTs7QUFNUDtFQUNFLGVYNVFtQjtFVzZRbkIsc0JYdEx5QjtFV3VMekIscUJBQXFCO0VBQ3JCLGdCQUFnQixFQWFqQjtFQWpCRDtJQVFJLGVYN0wwQixFV2lNM0I7RUFaSDtJQWVJLFVBQVUsRUFDWDs7QUFJSDtFQUNFLGlCUmpRa0I7RVFrUWxCLFVBQVU7RUFDVixnQkFBZ0I7RUFDaEIsY0FBYztFQUNkLGlDWDlSaUI7RVcrUmpCLGVBQWU7RUFDZixxQlgzTXlCO0VXNE16QixZQUFZLEVBQ2I7O0FBR0Q7OztFQUdFLGlCWGxPc0I7RVdtT3RCLG9CWGxPMEI7RVdtTzFCLDZCWGpOeUIsRVdrTjFCOztBQUdEO0VBQ0UsbUJBQW1CLEVBQ3BCOztBQUdEO0VBQ0Usc0JYNU5rQjtFVzZObEIscUJYM05zQixFVzROdkI7O0FBR0Q7RUFDRSxxQlhoT3NCLEVXaU92Qjs7QUFHRDtFQUVJLHFCWHJPMkI7RVdzTzNCLGlCQUFpQixFQUNsQjs7QUFJSDtFQUNFLG9CWDNPeUIsRVdpUDFCO0VBUEQ7SUFJSSxzQlg1TzhCO0lXNk85QixrQlhoVW1CLEVXaVVwQjs7QUFJSDtFQUNFLGlCWDFRMEI7RVcyUTFCLHVDUnpUa0I7RVEwVGxCLCtCWG5WaUIsRVd5VmxCO0VBVEQ7SUFNSSxpQlhoUm9CO0lXaVJwQixlWHRWYSxFV3VWZDs7QUFJSDtFQUNFLGVBQWU7RUFDZixxQlJyVWtCO0VRc1VsQixlWDlWZSxFV21XaEI7RUFSRDtJQU1JLHVCQUF1QixFQUN4Qjs7QUFJSDtFQUNFLGVYdFdXO0VXdVdYLGFBQWE7RUFDYixrQ1h4V1csRVd5V1o7O0FBR0Q7RUFDRSw2RFhsVW1FO0VXbVVuRSxvQlh0V3lCO0VXdVd6QixlWC9XVztFV2dYWCwwQlhuWGdCO0VXb1hoQiwwQlhuWGlCO0VXb1hqQixzQ1IzVmtCLEVRNFZuQjs7QUFHRDtFQUNFLDRCUjNWUztFUTRWVCxVQUFVO0VBQ1YsMEJYNVhnQjtFVzZYaEIsZVgxWFc7RVcyWFgsNkRYaFZtRSxFV2lWcEU7O0FDdFlEO0VBQ0UsbUJaMEh5QjtFWXpIekIsc0JaMEg0QjtFWXpINUIsb0JaZXlCO0VZZHpCLGlCWm9Ic0I7RVluSHRCLGVaSWUsRVlIaEI7O0FBR0Q7RUFDRSxnQlo0RzhCO0VZM0c5Qixp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RTBEb0NFLGlDQUZpQjtNQUVqQiw2QkFGaUI7VUFFakIseUJBRmlCO0VDdkJmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBRzFDLG9DQUE0QjtVQUE1Qiw0QkFBNEIsRUNSM0I7O0E1RE5IO0UwRG9DRSxxQ0FGaUI7TUFFakIsaUNBRmlCO1VBRWpCLDZCQUZpQixFRWhCaEI7O0E1RGpCSDtFMERtQ0UsaUNBRmlCO01BRWpCLDZCQUZpQjtVQUVqQix5QkFGaUI7RUN2QmYsZ0RBQXdDO0VBQXhDLHdDQUF3QztFQUF4QywyREFBd0M7RUFHMUMsb0NBQTRCO1VBQTVCLDRCQUE0QixFQ1IzQjs7QTVETEg7RTBEbUNFLHFDQUZpQjtNQUVqQixpQ0FGaUI7VUFFakIsNkJBRmlCLEVFaEJoQjs7QTVEZEg7RTBEZ0NFLFcxRGhDa0M7RTZEQWxDLDZCQUE2QixFREU1Qjs7QTVERkg7RTBEZ0NFLFcxRGhDcUMsRTREY3BDOztBNURiSDtFMEQrQkUsVzFEL0JrQztFNkREbEMsNkJBQTZCLEVERTVCOztBNURESDtFMEQrQkUsVzFEL0JxQyxFNERhcEM7O0E1RFZIO0UwRDRCRSx1RElyQ1k7VUpxQ1osK0NJckNZO0VKcUNaLDhCQUZpQjtNQUVqQiwwQkFGaUI7VUFFakIsc0JBRmlCO0VLdkJmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQTJCLEVITjVCOztBNURFSDtFMEQ0QkUsb0RJVnNDO1VKVXRDLDRDSVZzQztFQ0pwQyxXQUEyQixFSEo1Qjs7QTVEVEg7RTBEMkJFLHVESXBDYztVSm9DZCwrQ0lwQ2M7RUpvQ2QsZ0NBRmlCO01BRWpCLDRCQUZpQjtVQUVqQix3QkFGaUI7RUt2QmYsZ0RBQXdDO0VBQXhDLHdDQUF3QztFQUF4QywyREFBd0M7RUFDeEMsV0FBMkIsRUhONUI7O0E1REdIO0UwRDJCRSxvRElWc0M7VUpVdEMsNENJVnNDO0VDSnBDLFdBQTJCLEVISjVCOztBNURSSDtFMEQwQkUsc0RJbkNlO1VKbUNmLDhDSW5DZTtFSm1DZixpQ0FGaUI7TUFFakIsNkJBRmlCO1VBRWpCLHlCQUZpQjtFS3ZCZixnREFBd0M7RUFBeEMsd0NBQXdDO0VBQXhDLDJEQUF3QztFQUN4QyxXQUEyQixFSE41Qjs7QTVESUg7RTBEMEJFLG9ESVZzQztVSlV0Qyw0Q0lWc0M7RUNKcEMsV0FBMkIsRUhKNUI7O0E1RFBIO0UwRHlCRSxzRElsQ2E7VUprQ2IsOENJbENhO0VKa0NiLCtCQUZpQjtNQUVqQiwyQkFGaUI7VUFFakIsdUJBRmlCO0VLdkJmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQTJCLEVITjVCOztBNURLSDtFMER5QkUsb0RJVnNDO1VKVXRDLDRDSVZzQztFQ0pwQyxXQUEyQixFSEo1Qjs7QTVETkg7RTBEd0JFLHVESXJDWTtVSnFDWiwrQ0lyQ1k7RUpxQ1osaUNBRmlCO01BRWpCLDZCQUZpQjtVQUVqQix5QkFGaUI7RUt2QmYsZ0RBQXdDO0VBQXhDLHdDQUF3QztFQUF4QywyREFBd0M7RUFDeEMsV0FBMkIsRUhONUI7O0E1RE1IO0UwRHdCRSxvRElWc0M7VUpVdEMsNENJVnNDO0VDSnBDLFdBQTJCLEVISjVCOztBNURMSDtFMER1QkUsdURJcENjO1VKb0NkLCtDSXBDYztFSm9DZCxpQ0FGaUI7TUFFakIsNkJBRmlCO1VBRWpCLHlCQUZpQjtFS3ZCZixnREFBd0M7RUFBeEMsd0NBQXdDO0VBQXhDLDJEQUF3QztFQUN4QyxXQUEyQixFSE41Qjs7QTVET0g7RTBEdUJFLG9ESVZzQztVSlV0Qyw0Q0lWc0M7RUNKcEMsV0FBMkIsRUhKNUI7O0E1REpIO0UwRHNCRSxvRElSd0M7VUpReEMsNENJUndDO0VKUXhDLDhCQUZpQjtNQUVqQiwwQkFGaUI7VUFFakIsc0JBRmlCO0VLdkJmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQThCLEVITi9COztBNURRSDtFMERzQkUsdURJckNZO1VKcUNaLCtDSXJDWTtFQ3VCVixXQUE4QixFSEovQjs7QTVESEg7RTBEcUJFLG9ESVJ3QztVSlF4Qyw0Q0lSd0M7RUpReEMsZ0NBRmlCO01BRWpCLDRCQUZpQjtVQUVqQix3QkFGaUI7RUt2QmYsZ0RBQXdDO0VBQXhDLHdDQUF3QztFQUF4QywyREFBd0M7RUFDeEMsV0FBOEIsRUhOL0I7O0E1RFNIO0UwRHFCRSx1RElwQ2M7VUpvQ2QsK0NJcENjO0VDc0JaLFdBQThCLEVISi9COztBNURGSDtFMERvQkUsb0RJUndDO1VKUXhDLDRDSVJ3QztFSlF4QyxpQ0FGaUI7TUFFakIsNkJBRmlCO1VBRWpCLHlCQUZpQjtFS3ZCZixnREFBd0M7RUFBeEMsd0NBQXdDO0VBQXhDLDJEQUF3QztFQUN4QyxXQUE4QixFSE4vQjs7QTVEVUg7RTBEb0JFLHNESW5DZTtVSm1DZiw4Q0luQ2U7RUNxQmIsV0FBOEIsRUhKL0I7O0E1RERIO0UwRG1CRSxvRElSd0M7VUpReEMsNENJUndDO0VKUXhDLCtCQUZpQjtNQUVqQiwyQkFGaUI7VUFFakIsdUJBRmlCO0VLdkJmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQThCLEVITi9COztBNURXSDtFMERtQkUsc0RJbENhO1VKa0NiLDhDSWxDYTtFQ29CWCxXQUE4QixFSEovQjs7QTVEQUg7RTBEa0JFLG9ESVJ3QztVSlF4Qyw0Q0lSd0M7RUpReEMsaUNBRmlCO01BRWpCLDZCQUZpQjtVQUVqQix5QkFGaUI7RUt2QmYsZ0RBQXdDO0VBQXhDLHdDQUF3QztFQUF4QywyREFBd0M7RUFDeEMsV0FBOEIsRUhOL0I7O0E1RFlIO0UwRGtCRSx1RElyQ1k7VUpxQ1osK0NJckNZO0VDdUJWLFdBQThCLEVISi9COztBNURDSDtFMERpQkUsb0RJUndDO1VKUXhDLDRDSVJ3QztFSlF4QyxpQ0FGaUI7TUFFakIsNkJBRmlCO1VBRWpCLHlCQUZpQjtFS3ZCZixnREFBd0M7RUFBeEMsd0NBQXdDO0VBQXhDLDJEQUF3QztFQUN4QyxXQUE4QixFSE4vQjs7QTVEYUg7RTBEaUJFLHVESXBDYztVSm9DZCwrQ0lwQ2M7RUNzQlosV0FBOEIsRUhKL0I7O0E1RElIO0UwRGNFLDhCQUZpQjtNQUVqQiwwQkFGaUI7VUFFakIsc0JBRmlCO0VNM0JmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQTJCLEVKRjVCOztBNURnQkg7RTBEY0UsNEJBRmlCO01BRWpCLHdCQUZpQjtVQUVqQixvQkFGaUI7RU1oQmYsV0FBMkIsRUpBNUI7O0E1REtIO0UwRGFFLDhCQUZpQjtNQUVqQiwwQkFGaUI7VUFFakIsc0JBRmlCO0VNM0JmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQTJCLEVKRjVCOztBNURpQkg7RTBEYUUsNEJBRmlCO01BRWpCLHdCQUZpQjtVQUVqQixvQkFGaUI7RU1oQmYsV0FBMkIsRUpBNUI7O0E1RE1IO0UwRFlFLDRCQUZpQjtNQUVqQix3QkFGaUI7VUFFakIsb0JBRmlCO0VNM0JmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQThCLEVKRi9COztBNURrQkg7RTBEWUUsOEJBRmlCO01BRWpCLDBCQUZpQjtVQUVqQixzQkFGaUI7RU1oQmYsV0FBOEIsRUpBL0I7O0E1RE9IO0UwRFdFLDRCQUZpQjtNQUVqQix3QkFGaUI7VUFFakIsb0JBRmlCO0VNM0JmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQThCLEVKRi9COztBNURtQkg7RTBEV0UsOEJBRmlCO01BRWpCLDBCQUZpQjtVQUVqQixzQkFGaUI7RU1oQmYsV0FBOEIsRUpBL0I7O0E1RFVIO0UwRFFFLHFDQUZpQjtNQUVqQixpQ0FGaUI7VUFFakIsNkJBRmlCO0VPM0JmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQTJCLEVMRjVCOztBNURzQkg7RTBEUUUsNkJBRmlCO01BRWpCLHlCQUZpQjtVQUVqQixxQkFGaUI7RU9oQmYsV0FBMkIsRUxBNUI7O0E1RFdIO0UwRE9FLDZCQUZpQjtNQUVqQix5QkFGaUI7VUFFakIscUJBRmlCO0VPM0JmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQThCLEVMRi9COztBNUR1Qkg7RTBET0Usb0NBRmlCO01BRWpCLGdDQUZpQjtVQUVqQiw0QkFGaUI7RU9oQmYsV0FBOEIsRUxBL0I7O0E1RFlIO0UwRE1FLG9DQUZpQjtNQUVqQixnQ0FGaUI7VUFFakIsNEJBRmlCO0VPM0JmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQTJCLEVMRjVCOztBNUR3Qkg7RTBETUUsNkJBRmlCO01BRWpCLHlCQUZpQjtVQUVqQixxQkFGaUI7RU9oQmYsV0FBMkIsRUxBNUI7O0E1RGFIO0UwREtFLDZCQUZpQjtNQUVqQix5QkFGaUI7VUFFakIscUJBRmlCO0VPM0JmLGdEQUF3QztFQUF4Qyx3Q0FBd0M7RUFBeEMsMkRBQXdDO0VBQ3hDLFdBQThCLEVMRi9COztBNUR5Qkg7RTBES0UscUNBRmlCO01BRWpCLGlDQUZpQjtVQUVqQiw2QkFGaUI7RU9oQmYsV0FBOEIsRUxBL0I7O0E1RG9CQztFQUFFLHNDQUFzQyxFQUFJOztBQUE1QztFQUFFLHNDQUFzQyxFQUFJOztBQU01QztFQUFFLDhDQUE2QyxFQUFJOztBQUFuRDtFQUFFLDRDQUE2QyxFQUFJOztBQUFuRDtFQUFFLCtDQUE2QyxFQUFJOztBQUFuRDtFQUFFLGdEQUE2QyxFQUFJOztBQUFuRDtFQUFFLG1EQUE2QyxFQUFJOztBQUFuRDtFQUFFLCtFQUE2QyxFQUFJOztBQUFuRDtFQUFFLGdGQUE2QyxFQUFJOztBQUFuRDtFQUFFLCtFQUE2QyxFQUFJOztBQU1uRDtFQUFFLG1DQUFtQyxFQUFJOztBQUF6QztFQUFFLG1DQUFtQyxFQUFJOztBQVE3QztFa0V0RUEsZ0NBQXVCO1VBQXZCLHdCQUF1QixFbEVzRXNCOztBMERqRTdDO0VBR0k7SUFHSSxrQ0FBVTtZQUFWLDBCQUFVLEVBQUE7RUFIZDtJQUdJLG1DQUFVO1lBQVYsMkJBQVUsRUFBQSxFQUFBOztBQU5sQjtFQUdJO0lBR0ksa0NBQVU7WUFBViwwQkFBVSxFQUFBO0VBSGQ7SUFHSSxtQ0FBVTtZQUFWLDJCQUFVLEVBQUEsRUFBQTs7QTFENERsQjtFa0V2RUEsc0NBQXVCO1VBQXZCLDhCQUF1QixFbEV1RXFCOztBMERsRTVDO0VBR0k7SUFHSSxrQ0FBVTtZQUFWLDBCQUFVLEVBQUE7RUFIZDtJQUdJLDZCQUFVO1lBQVYscUJBQVUsRUFBQSxFQUFBOztBQU5sQjtFQUdJO0lBR0ksa0NBQVU7WUFBViwwQkFBVSxFQUFBO0VBSGQ7SUFHSSw2QkFBVTtZQUFWLHFCQUFVLEVBQUEsRUFBQTs7QTFENkRsQjtFa0V4RUEsc0NBQXVCO1VBQXZCLDhCQUF1QixFbEV3RTBCOztBMERuRWpEO0VBR0k7SUFHSSw2QkFBVTtZQUFWLHFCQUFVLEVBQUE7RUFIZDtJQUdJLGlDQUFVO1lBQVYseUJBQVUsRUFBQSxFQUFBOztBMUQ4RGxCO0VrRXpFQSxvQ0FBdUI7VUFBdkIsNEJBQXVCLEVsRXlFdUI7O0EwRHBFOUM7RUFHSTtJQUdJLGdDQUFVO1lBQVYsd0JBQVUsRUFBQTtFQUhkO0lBR0ksaUNBQVU7WUFBVix5QkFBVSxFQUFBO0VBSGQ7SUFHSSw2QkFBVTtZQUFWLHFCQUFVLEVBQUEsRUFBQTs7QUFObEI7RUFHSTtJQUdJLGdDQUFVO1lBQVYsd0JBQVUsRUFBQTtFQUhkO0lBR0ksaUNBQVU7WUFBVix5QkFBVSxFQUFBO0VBSGQ7SUFHSSw2QkFBVTtZQUFWLHFCQUFVLEVBQUEsRUFBQTs7QTFEa0VsQjtFQUFZLDRDQUFvQztVQUFwQyxvQ0FBb0MsRUFBSTs7QUFJaEQ7RUFBRSw2Q0FBcUM7VUFBckMscUNBQXFDLEVBQUk7O0FBQTNDO0VBQUUsNkNBQXFDO1VBQXJDLHFDQUFxQyxFQUFJOztBQU0zQztFQUFFLHFEQUE0QztVQUE1Qyw2Q0FBNEMsRUFBSTs7QUFBbEQ7RUFBRSxtREFBNEM7VUFBNUMsMkNBQTRDLEVBQUk7O0FBQWxEO0VBQUUsc0RBQTRDO1VBQTVDLDhDQUE0QyxFQUFJOztBQUFsRDtFQUFFLHVEQUE0QztVQUE1QywrQ0FBNEMsRUFBSTs7QUFBbEQ7RUFBRSwwREFBNEM7VUFBNUMsa0RBQTRDLEVBQUk7O0FBQWxEO0VBQUUsc0ZBQTRDO1VBQTVDLDhFQUE0QyxFQUFJOztBQUFsRDtFQUFFLHVGQUE0QztVQUE1QywrRUFBNEMsRUFBSTs7QUFBbEQ7RUFBRSxzRkFBNEM7VUFBNUMsOEVBQTRDLEVBQUk7O0FBTWxEO0VBQUUsMENBQWtDO1VBQWxDLGtDQUFrQyxFQUFJOztBQUF4QztFQUFFLDBDQUFrQztVQUFsQyxrQ0FBa0MsRUFBSTs7QW1FckQ5QztFQUFNLFlBQVcsRUFBRzs7QUFFcEI7RUFBaUIsZ0JBQWUsRUFBRzs7QUFDbkM7RUFDSSxnQkFBZTtFQUNmLDJDQUFzQjtFQUN0QixvQkFBb0IsRUFDdkI7O0FBQ0Q7RUFBZ0IsY0FBYztFQUFFLG9CQUFvQjtFQUFDLHdDQUF3QjtFQUFnQiw4QkFBOEIsRUFBRzs7QUFDOUg7RUFDSSxlQUFlO0VBQ2Ysa0JBQWtCO0VBQ2xCLGlCQUFpQjtFQUVqQiwwQkFBMEI7RUFDMUIsV0FBVyxFQUNkOztBQUNEO0VBQ0M7SUFDRyxZQUFZO0lBQ1osV0FBVztJQUNYLGlCQUFpQixFQUNwQixFQUFBOztBQU1EO0VBQTBCLGlCQUFpQjtFQUFDLDBCQUF5QixFQUFHOztBQUN4RTtFQUE0QixhQUFhLEVBQUc7O0FBQzVDO0VBQ0ksMEJBQTBCO0VBQzFCLGFBQWEsRUFFaEI7O0FBQ0Q7RXpCbERFLFV2Q29WYTtFdUNuVmIsc0JBQXNCLEV5QmtGdkI7RUFqQ0Q7SXpCNUNJLG9CQUFvQjtJQUNwQix1QkFBdUIsRUFDeEI7STVDaWlIQztNU3Y2R0EsV0FBVyxFQUNaO0U0RGpGSDtJekJ0Q0ksZUFBZTtJQUNmLG1CeUI2QnlCO0l6QjVCekIsZUFBZSxFQUNoQjtFeUJtQ0g7Ozs7O0l6QjdCSSxpQkFBaUIsRUFDbEI7RXlCNEJIO0l6QmJNLG9CQUFvQixFQUNyQjtFeUJZTDtJekJSTSxlQUFlLEVBQ2hCO0VqQ2lFRDtJMEQxREo7TXpCYk0sb0JBQW9CLEVBQ3JCO0l5QllMO016QlJNLGVBQWUsRUFDaEIsRUFBQTtFakNpRUQ7STBEMURKO016QmJNLG9CQUFvQixFQUNyQjtJeUJZTDtNekJSTSxlQUFlLEVBQ2hCLEVBQUE7RXlCT0w7SXpCZ0JFLGtCdkNtUnVCLEVnRTNRcEI7RUF4Qkw7SUE0QlEsYUFBWSxFQUNmO0VBN0JMO0lBK0JvQixvQkFBb0IsRUFBRzs7QUFHM0M7RUFDSSx3QkFBd0I7RUFDeEIsOEJBQThCO0VBQzlCLDJCQUEyQjtFQUMzQixlQUFlO0VBQ2YsYUFBYTtFQUNiLGdCQUFnQjtFQUNoQiwrQkFBK0I7RUFDL0IsV0FBVztFQUNYLHFCQUFxQjtFQUNyQixpQkFBaUI7RUFDakIsdUJBQXVCO0VBQ3ZCLG1CQUFtQjtFQUNuQixTQUFTO0VBQ1Qsa0JBQWtCO0VBQ2xCLFlBQVksRUFDZjs7QUFFRDtFQUNJO0lBQ0ksWUFBWSxFQUNmO0VBQ0Q7SUFDSSxZQUFXO0lBQ1gsWUFBWTtJQUNaLFlBQVk7SUFDWixpQkFBaUIsRUFDcEI7RUFFRDtJQUNJLGVBQWU7SUFDZixZQUFZO0lBQ1osdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixZQUFZO0lBQ1oscUJBQXFCLEVBQ3hCLEVBQUE7O0FBR0w7RUFDSSxtQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixZQUFZLEVBQ2Y7O0FBRUQ7RUFDSSxZQUFZO0VBQ1osaUJBQWlCO0VBQ2pCLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsd0JBQXdCLEVBQzNCOztBQUVEO0VBQ0ksdUhBQXNIO0VBQ3RILHVCQUF1QjtFQUN2QixZQUFZO0VBQ1osY0FBYztFQUNkLFFBQVE7RUFDUixnQkFBZ0I7RUFDaEIsa0JBQWtCO0VBQ2xCLGFBQWE7RUFDYixtQkFBbUI7RUFDbkIsT0FBTztFQUNQLFlBQVk7RUFDWixXQUFXO0VBQ1gsZUFBZSxFQUNsQjs7QUFFRDtFQUNJLFlBQVk7RUFDWixZQUFZO0VBQ1osaUJBQWlCO0VBQ2pCLGlCQUFpQjtFQUNqQixjQUFjO0VBQ2Qsa0JBQWtCO0VBQ2xCLFlBQVk7RUFDWixXQUFXO0VBQ1gsNENBQTZCLEVBQ2hDOztBQUVEO0VBQ0ksYUFBYTtFQUNiLHNCQUFzQixFQUV6Qjs7QUFFRDtFQUNJLGdCQUFnQjtFQUNoQixrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLGlCQUFpQixFQUNwQjs7QUFFRDtFQUNJLGFBQWE7RUFDYixnQkFBZ0I7RUFDaEIsa0JBQWtCO0VBQ2xCLGlCQUFpQjtFQUNqQixnQkFBZ0I7RUFDaEIsa0JBQWtCO0VBQ2xCLG1CQUFtQixFQUN0Qjs7QUFFRDtFQUNJLHdGQUFxQjtFQUNyQixZQUFZO0VBQ1osWUFBWTtFQUNaLGNBQWM7RUFDZCxlQUFlO0VBQ2YsWUFBWTtFQUNaLFVBQVU7RUFDVixRQUFRO0VBQ1IsbUJBQW1CLEVBQ3RCOztBQUdEO0VBQ08sbUJBQW1CO0VBQUMsaUJBQWlCO0VBQUMsWUFBWTtFQUFDLHlCQUF3QixFQUFHOztBQURyRjtFQUdRLFNBQVM7RUFDVCx5QkFBeUI7RUFDekIsbUJBQW1CO0VBQ25CLGFBQWEsRUFDaEI7O0FBUEw7RUFVUSxZQUFZO0VBQ1osMEJBQTBCLEVBQzdCIiwiZmlsZSI6ImFwcC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJAY2hhcnNldCBcIlVURi04XCI7XG4vKipcbiAqIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbiAqIFZlcnNpb24gNi4xLjJcbiAqIGZvdW5kYXRpb24uenVyYi5jb21cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuICovXG4uc2xpZGUtaW4tZG93bi5tdWktZW50ZXIsIC5zbGlkZS1pbi1sZWZ0Lm11aS1lbnRlciwgLnNsaWRlLWluLXVwLm11aS1lbnRlciwgLnNsaWRlLWluLXJpZ2h0Lm11aS1lbnRlciwgLnNsaWRlLW91dC1kb3duLm11aS1sZWF2ZSwgLnNsaWRlLW91dC1yaWdodC5tdWktbGVhdmUsIC5zbGlkZS1vdXQtdXAubXVpLWxlYXZlLCAuc2xpZGUtb3V0LWxlZnQubXVpLWxlYXZlLCAuZmFkZS1pbi5tdWktZW50ZXIsIC5mYWRlLW91dC5tdWktbGVhdmUsIC5oaW5nZS1pbi1mcm9tLXRvcC5tdWktZW50ZXIsIC5oaW5nZS1pbi1mcm9tLXJpZ2h0Lm11aS1lbnRlciwgLmhpbmdlLWluLWZyb20tYm90dG9tLm11aS1lbnRlciwgLmhpbmdlLWluLWZyb20tbGVmdC5tdWktZW50ZXIsIC5oaW5nZS1pbi1mcm9tLW1pZGRsZS14Lm11aS1lbnRlciwgLmhpbmdlLWluLWZyb20tbWlkZGxlLXkubXVpLWVudGVyLCAuaGluZ2Utb3V0LWZyb20tdG9wLm11aS1sZWF2ZSwgLmhpbmdlLW91dC1mcm9tLXJpZ2h0Lm11aS1sZWF2ZSwgLmhpbmdlLW91dC1mcm9tLWJvdHRvbS5tdWktbGVhdmUsIC5oaW5nZS1vdXQtZnJvbS1sZWZ0Lm11aS1sZWF2ZSwgLmhpbmdlLW91dC1mcm9tLW1pZGRsZS14Lm11aS1sZWF2ZSwgLmhpbmdlLW91dC1mcm9tLW1pZGRsZS15Lm11aS1sZWF2ZSwgLnNjYWxlLWluLXVwLm11aS1lbnRlciwgLnNjYWxlLWluLWRvd24ubXVpLWVudGVyLCAuc2NhbGUtb3V0LXVwLm11aS1sZWF2ZSwgLnNjYWxlLW91dC1kb3duLm11aS1sZWF2ZSwgLnNwaW4taW4ubXVpLWVudGVyLCAuc3Bpbi1vdXQubXVpLWxlYXZlLCAuc3Bpbi1pbi1jY3cubXVpLWVudGVyLCAuc3Bpbi1vdXQtY2N3Lm11aS1sZWF2ZSB7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDUwMG1zO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyOyB9XG5cbi8qISBub3JtYWxpemUuY3NzIHYzLjAuMyB8IE1JVCBMaWNlbnNlIHwgZ2l0aHViLmNvbS9uZWNvbGFzL25vcm1hbGl6ZS5jc3MgKi9cbi8qKlxuICAgKiAxLiBTZXQgZGVmYXVsdCBmb250IGZhbWlseSB0byBzYW5zLXNlcmlmLlxuICAgKiAyLiBQcmV2ZW50IGlPUyBhbmQgSUUgdGV4dCBzaXplIGFkanVzdCBhZnRlciBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLFxuICAgKiAgICB3aXRob3V0IGRpc2FibGluZyB1c2VyIHpvb20uXG4gICAqL1xuaHRtbCB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICAvKiAxICovXG4gIC1tcy10ZXh0LXNpemUtYWRqdXN0OiAxMDAlO1xuICAvKiAyICovXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcbiAgLyogMiAqLyB9XG5cbi8qKlxuICAgKiBSZW1vdmUgZGVmYXVsdCBtYXJnaW4uXG4gICAqL1xuYm9keSB7XG4gIG1hcmdpbjogMDsgfVxuXG4vKiBIVE1MNSBkaXNwbGF5IGRlZmluaXRpb25zXG4gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAgICogQ29ycmVjdCBgYmxvY2tgIGRpc3BsYXkgbm90IGRlZmluZWQgZm9yIGFueSBIVE1MNSBlbGVtZW50IGluIElFIDgvOS5cbiAgICogQ29ycmVjdCBgYmxvY2tgIGRpc3BsYXkgbm90IGRlZmluZWQgZm9yIGBkZXRhaWxzYCBvciBgc3VtbWFyeWAgaW4gSUUgMTAvMTFcbiAgICogYW5kIEZpcmVmb3guXG4gICAqIENvcnJlY3QgYGJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGZvciBgbWFpbmAgaW4gSUUgMTEuXG4gICAqL1xuYXJ0aWNsZSxcbmFzaWRlLFxuZGV0YWlscyxcbmZpZ2NhcHRpb24sXG5maWd1cmUsXG5mb290ZXIsXG5oZWFkZXIsXG5oZ3JvdXAsXG5tYWluLFxubWVudSxcbm5hdixcbnNlY3Rpb24sXG5zdW1tYXJ5IHtcbiAgZGlzcGxheTogYmxvY2s7IH1cblxuLyoqXG4gICAqIDEuIENvcnJlY3QgYGlubGluZS1ibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBpbiBJRSA4LzkuXG4gICAqIDIuIE5vcm1hbGl6ZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgYHByb2dyZXNzYCBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBPcGVyYS5cbiAgICovXG5hdWRpbyxcbmNhbnZhcyxcbnByb2dyZXNzLFxudmlkZW8ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIC8qIDEgKi9cbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xuICAvKiAyICovIH1cblxuLyoqXG4gICAqIFByZXZlbnQgbW9kZXJuIGJyb3dzZXJzIGZyb20gZGlzcGxheWluZyBgYXVkaW9gIHdpdGhvdXQgY29udHJvbHMuXG4gICAqIFJlbW92ZSBleGNlc3MgaGVpZ2h0IGluIGlPUyA1IGRldmljZXMuXG4gICAqL1xuYXVkaW86bm90KFtjb250cm9sc10pIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgaGVpZ2h0OiAwOyB9XG5cbi8qKlxuICAgKiBBZGRyZXNzIGBbaGlkZGVuXWAgc3R5bGluZyBub3QgcHJlc2VudCBpbiBJRSA4LzkvMTAuXG4gICAqIEhpZGUgdGhlIGB0ZW1wbGF0ZWAgZWxlbWVudCBpbiBJRSA4LzkvMTAvMTEsIFNhZmFyaSwgYW5kIEZpcmVmb3ggPCAyMi5cbiAgICovXG5baGlkZGVuXSxcbnRlbXBsYXRlIHtcbiAgZGlzcGxheTogbm9uZTsgfVxuXG4vKiBMaW5rc1xuICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gICAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYWN0aXZlIGxpbmtzIGluIElFIDEwLlxuICAgKi9cbmEge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgfVxuXG4vKipcbiAgICogSW1wcm92ZSByZWFkYWJpbGl0eSBvZiBmb2N1c2VkIGVsZW1lbnRzIHdoZW4gdGhleSBhcmUgYWxzbyBpbiBhblxuICAgKiBhY3RpdmUvaG92ZXIgc3RhdGUuXG4gICAqL1xuYTphY3RpdmUsXG5hOmhvdmVyIHtcbiAgb3V0bGluZTogMDsgfVxuXG4vKiBUZXh0LWxldmVsIHNlbWFudGljc1xuICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gICAqIEFkZHJlc3Mgc3R5bGluZyBub3QgcHJlc2VudCBpbiBJRSA4LzkvMTAvMTEsIFNhZmFyaSwgYW5kIENocm9tZS5cbiAgICovXG5hYmJyW3RpdGxlXSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQ7IH1cblxuLyoqXG4gICAqIEFkZHJlc3Mgc3R5bGUgc2V0IHRvIGBib2xkZXJgIGluIEZpcmVmb3ggNCssIFNhZmFyaSwgYW5kIENocm9tZS5cbiAgICovXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7IH1cblxuLyoqXG4gICAqIEFkZHJlc3Mgc3R5bGluZyBub3QgcHJlc2VudCBpbiBTYWZhcmkgYW5kIENocm9tZS5cbiAgICovXG5kZm4ge1xuICBmb250LXN0eWxlOiBpdGFsaWM7IH1cblxuLyoqXG4gICAqIEFkZHJlc3MgdmFyaWFibGUgYGgxYCBmb250LXNpemUgYW5kIG1hcmdpbiB3aXRoaW4gYHNlY3Rpb25gIGFuZCBgYXJ0aWNsZWBcbiAgICogY29udGV4dHMgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLlxuICAgKi9cbmgxIHtcbiAgZm9udC1zaXplOiAyZW07XG4gIG1hcmdpbjogMC42N2VtIDA7IH1cblxuLyoqXG4gICAqIEFkZHJlc3Mgc3R5bGluZyBub3QgcHJlc2VudCBpbiBJRSA4LzkuXG4gICAqL1xubWFyayB7XG4gIGJhY2tncm91bmQ6ICNmZjA7XG4gIGNvbG9yOiAjMDAwOyB9XG5cbi8qKlxuICAgKiBBZGRyZXNzIGluY29uc2lzdGVudCBhbmQgdmFyaWFibGUgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAgICovXG5zbWFsbCB7XG4gIGZvbnQtc2l6ZTogODAlOyB9XG5cbi8qKlxuICAgKiBQcmV2ZW50IGBzdWJgIGFuZCBgc3VwYCBhZmZlY3RpbmcgYGxpbmUtaGVpZ2h0YCBpbiBhbGwgYnJvd3NlcnMuXG4gICAqL1xuc3ViLFxuc3VwIHtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGxpbmUtaGVpZ2h0OiAwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsgfVxuXG5zdXAge1xuICB0b3A6IC0wLjVlbTsgfVxuXG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07IH1cblxuLyogRW1iZWRkZWQgY29udGVudFxuICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gICAqIFJlbW92ZSBib3JkZXIgd2hlbiBpbnNpZGUgYGFgIGVsZW1lbnQgaW4gSUUgOC85LzEwLlxuICAgKi9cbmltZyB7XG4gIGJvcmRlcjogMDsgfVxuXG4vKipcbiAgICogQ29ycmVjdCBvdmVyZmxvdyBub3QgaGlkZGVuIGluIElFIDkvMTAvMTEuXG4gICAqL1xuc3ZnOm5vdCg6cm9vdCkge1xuICBvdmVyZmxvdzogaGlkZGVuOyB9XG5cbi8qIEdyb3VwaW5nIGNvbnRlbnRcbiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICAgKiBBZGRyZXNzIG1hcmdpbiBub3QgcHJlc2VudCBpbiBJRSA4LzkgYW5kIFNhZmFyaS5cbiAgICovXG5maWd1cmUge1xuICBtYXJnaW46IDFlbSA0MHB4OyB9XG5cbi8qKlxuICAgKiBBZGRyZXNzIGRpZmZlcmVuY2VzIGJldHdlZW4gRmlyZWZveCBhbmQgb3RoZXIgYnJvd3NlcnMuXG4gICAqL1xuaHIge1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgaGVpZ2h0OiAwOyB9XG5cbi8qKlxuICAgKiBDb250YWluIG92ZXJmbG93IGluIGFsbCBicm93c2Vycy5cbiAgICovXG5wcmUge1xuICBvdmVyZmxvdzogYXV0bzsgfVxuXG4vKipcbiAgICogQWRkcmVzcyBvZGQgYGVtYC11bml0IGZvbnQgc2l6ZSByZW5kZXJpbmcgaW4gYWxsIGJyb3dzZXJzLlxuICAgKi9cbmNvZGUsXG5rYmQsXG5wcmUsXG5zYW1wIHtcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDFlbTsgfVxuXG4vKiBGb3Jtc1xuICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gICAqIEtub3duIGxpbWl0YXRpb246IGJ5IGRlZmF1bHQsIENocm9tZSBhbmQgU2FmYXJpIG9uIE9TIFggYWxsb3cgdmVyeSBsaW1pdGVkXG4gICAqIHN0eWxpbmcgb2YgYHNlbGVjdGAsIHVubGVzcyBhIGBib3JkZXJgIHByb3BlcnR5IGlzIHNldC5cbiAgICovXG4vKipcbiAgICogMS4gQ29ycmVjdCBjb2xvciBub3QgYmVpbmcgaW5oZXJpdGVkLlxuICAgKiAgICBLbm93biBpc3N1ZTogYWZmZWN0cyBjb2xvciBvZiBkaXNhYmxlZCBlbGVtZW50cy5cbiAgICogMi4gQ29ycmVjdCBmb250IHByb3BlcnRpZXMgbm90IGJlaW5nIGluaGVyaXRlZC5cbiAgICogMy4gQWRkcmVzcyBtYXJnaW5zIHNldCBkaWZmZXJlbnRseSBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4gICAqL1xuYnV0dG9uLFxuaW5wdXQsXG5vcHRncm91cCxcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIC8qIDEgKi9cbiAgZm9udDogaW5oZXJpdDtcbiAgLyogMiAqL1xuICBtYXJnaW46IDA7XG4gIC8qIDMgKi8gfVxuXG4vKipcbiAgICogQWRkcmVzcyBgb3ZlcmZsb3dgIHNldCB0byBgaGlkZGVuYCBpbiBJRSA4LzkvMTAvMTEuXG4gICAqL1xuYnV0dG9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7IH1cblxuLyoqXG4gICAqIEFkZHJlc3MgaW5jb25zaXN0ZW50IGB0ZXh0LXRyYW5zZm9ybWAgaW5oZXJpdGFuY2UgZm9yIGBidXR0b25gIGFuZCBgc2VsZWN0YC5cbiAgICogQWxsIG90aGVyIGZvcm0gY29udHJvbCBlbGVtZW50cyBkbyBub3QgaW5oZXJpdCBgdGV4dC10cmFuc2Zvcm1gIHZhbHVlcy5cbiAgICogQ29ycmVjdCBgYnV0dG9uYCBzdHlsZSBpbmhlcml0YW5jZSBpbiBGaXJlZm94LCBJRSA4LzkvMTAvMTEsIGFuZCBPcGVyYS5cbiAgICogQ29ycmVjdCBgc2VsZWN0YCBzdHlsZSBpbmhlcml0YW5jZSBpbiBGaXJlZm94LlxuICAgKi9cbmJ1dHRvbixcbnNlbGVjdCB7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lOyB9XG5cbi8qKlxuICAgKiAxLiBBdm9pZCB0aGUgV2ViS2l0IGJ1ZyBpbiBBbmRyb2lkIDQuMC4qIHdoZXJlICgyKSBkZXN0cm95cyBuYXRpdmUgYGF1ZGlvYFxuICAgKiAgICBhbmQgYHZpZGVvYCBjb250cm9scy5cbiAgICogMi4gQ29ycmVjdCBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIGBpbnB1dGAgdHlwZXMgaW4gaU9TLlxuICAgKiAzLiBJbXByb3ZlIHVzYWJpbGl0eSBhbmQgY29uc2lzdGVuY3kgb2YgY3Vyc29yIHN0eWxlIGJldHdlZW4gaW1hZ2UtdHlwZVxuICAgKiAgICBgaW5wdXRgIGFuZCBvdGhlcnMuXG4gICAqL1xuYnV0dG9uLFxuaHRtbCBpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLFxuaW5wdXRbdHlwZT1cInJlc2V0XCJdLFxuaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xuICAvKiAyICovXG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLyogMyAqLyB9XG5cbi8qKlxuICAgKiBSZS1zZXQgZGVmYXVsdCBjdXJzb3IgZm9yIGRpc2FibGVkIGVsZW1lbnRzLlxuICAgKi9cbmJ1dHRvbltkaXNhYmxlZF0sXG5odG1sIGlucHV0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogZGVmYXVsdDsgfVxuXG4vKipcbiAgICogUmVtb3ZlIGlubmVyIHBhZGRpbmcgYW5kIGJvcmRlciBpbiBGaXJlZm94IDQrLlxuICAgKi9cbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcbmlucHV0OjotbW96LWZvY3VzLWlubmVyIHtcbiAgYm9yZGVyOiAwO1xuICBwYWRkaW5nOiAwOyB9XG5cbi8qKlxuICAgKiBBZGRyZXNzIEZpcmVmb3ggNCsgc2V0dGluZyBgbGluZS1oZWlnaHRgIG9uIGBpbnB1dGAgdXNpbmcgYCFpbXBvcnRhbnRgIGluXG4gICAqIHRoZSBVQSBzdHlsZXNoZWV0LlxuICAgKi9cbmlucHV0IHtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsgfVxuXG4vKipcbiAgICogSXQncyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkb24ndCBhdHRlbXB0IHRvIHN0eWxlIHRoZXNlIGVsZW1lbnRzLlxuICAgKiBGaXJlZm94J3MgaW1wbGVtZW50YXRpb24gZG9lc24ndCByZXNwZWN0IGJveC1zaXppbmcsIHBhZGRpbmcsIG9yIHdpZHRoLlxuICAgKlxuICAgKiAxLiBBZGRyZXNzIGJveCBzaXppbmcgc2V0IHRvIGBjb250ZW50LWJveGAgaW4gSUUgOC85LzEwLlxuICAgKiAyLiBSZW1vdmUgZXhjZXNzIHBhZGRpbmcgaW4gSUUgOC85LzEwLlxuICAgKi9cbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXSxcbmlucHV0W3R5cGU9XCJyYWRpb1wiXSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8qIDEgKi9cbiAgcGFkZGluZzogMDtcbiAgLyogMiAqLyB9XG5cbi8qKlxuICAgKiBGaXggdGhlIGN1cnNvciBzdHlsZSBmb3IgQ2hyb21lJ3MgaW5jcmVtZW50L2RlY3JlbWVudCBidXR0b25zLiBGb3IgY2VydGFpblxuICAgKiBgZm9udC1zaXplYCB2YWx1ZXMgb2YgdGhlIGBpbnB1dGAsIGl0IGNhdXNlcyB0aGUgY3Vyc29yIHN0eWxlIG9mIHRoZVxuICAgKiBkZWNyZW1lbnQgYnV0dG9uIHRvIGNoYW5nZSBmcm9tIGBkZWZhdWx0YCB0byBgdGV4dGAuXG4gICAqL1xuaW5wdXRbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87IH1cblxuLyoqXG4gICAqIDEuIEFkZHJlc3MgYGFwcGVhcmFuY2VgIHNldCB0byBgc2VhcmNoZmllbGRgIGluIFNhZmFyaSBhbmQgQ2hyb21lLlxuICAgKiAyLiBBZGRyZXNzIGBib3gtc2l6aW5nYCBzZXQgdG8gYGJvcmRlci1ib3hgIGluIFNhZmFyaSBhbmQgQ2hyb21lLlxuICAgKi9cbmlucHV0W3R5cGU9XCJzZWFyY2hcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbiAgLyogMSAqL1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgLyogMiAqLyB9XG5cbi8qKlxuICAgKiBSZW1vdmUgaW5uZXIgcGFkZGluZyBhbmQgc2VhcmNoIGNhbmNlbCBidXR0b24gaW4gU2FmYXJpIGFuZCBDaHJvbWUgb24gT1MgWC5cbiAgICogU2FmYXJpIChidXQgbm90IENocm9tZSkgY2xpcHMgdGhlIGNhbmNlbCBidXR0b24gd2hlbiB0aGUgc2VhcmNoIGlucHV0IGhhc1xuICAgKiBwYWRkaW5nIChhbmQgYHRleHRmaWVsZGAgYXBwZWFyYW5jZSkuXG4gICAqL1xuaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbixcbmlucHV0W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IH1cblxuLyoqXG4gICAqIERlZmluZSBjb25zaXN0ZW50IGJvcmRlciwgbWFyZ2luLCBhbmQgcGFkZGluZy5cbiAgICogW05PVEVdIFdlIGRvbid0IGVuYWJsZSB0aGlzIHJ1bGVzZXQgaW4gRm91bmRhdGlvbiwgYmVjYXVzZSB3ZSB3YW50IHRoZSA8ZmllbGRzZXQ+IGVsZW1lbnQgdG8gaGF2ZSBwbGFpbiBzdHlsaW5nLlxuICAgKi9cbi8qIGZpZWxkc2V0IHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICAgIG1hcmdpbjogMCAycHg7XG4gICAgcGFkZGluZzogMC4zNWVtIDAuNjI1ZW0gMC43NWVtO1xuICB9ICovXG4vKipcbiAgICogMS4gQ29ycmVjdCBgY29sb3JgIG5vdCBiZWluZyBpbmhlcml0ZWQgaW4gSUUgOC85LzEwLzExLlxuICAgKiAyLiBSZW1vdmUgcGFkZGluZyBzbyBwZW9wbGUgYXJlbid0IGNhdWdodCBvdXQgaWYgdGhleSB6ZXJvIG91dCBmaWVsZHNldHMuXG4gICAqL1xubGVnZW5kIHtcbiAgYm9yZGVyOiAwO1xuICAvKiAxICovXG4gIHBhZGRpbmc6IDA7XG4gIC8qIDIgKi8gfVxuXG4vKipcbiAgICogUmVtb3ZlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsYmFyIGluIElFIDgvOS8xMC8xMS5cbiAgICovXG50ZXh0YXJlYSB7XG4gIG92ZXJmbG93OiBhdXRvOyB9XG5cbi8qKlxuICAgKiBEb24ndCBpbmhlcml0IHRoZSBgZm9udC13ZWlnaHRgIChhcHBsaWVkIGJ5IGEgcnVsZSBhYm92ZSkuXG4gICAqIE5PVEU6IHRoZSBkZWZhdWx0IGNhbm5vdCBzYWZlbHkgYmUgY2hhbmdlZCBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYLlxuICAgKi9cbm9wdGdyb3VwIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7IH1cblxuLyogVGFibGVzXG4gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAgICogUmVtb3ZlIG1vc3Qgc3BhY2luZyBiZXR3ZWVuIHRhYmxlIGNlbGxzLlxuICAgKi9cbnRhYmxlIHtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgYm9yZGVyLXNwYWNpbmc6IDA7IH1cblxudGQsXG50aCB7XG4gIHBhZGRpbmc6IDA7IH1cblxuLmZvdW5kYXRpb24tbXEge1xuICBmb250LWZhbWlseTogXCJzbWFsbD0wZW0mbWVkaXVtPTQwZW0mbGFyZ2U9NjRlbSZ4bGFyZ2U9NzVlbSZ4eGxhcmdlPTkwZW1cIjsgfVxuXG5odG1sIHtcbiAgZm9udC1zaXplOiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9XG5cbiosXG4qOmJlZm9yZSxcbio6YWZ0ZXIge1xuICBib3gtc2l6aW5nOiBpbmhlcml0OyB9XG5cbmJvZHkge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIGZvbnQtZmFtaWx5OiBzb3VyY2Utc2Fucy1wcm8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgSGVsdmV0aWNhLCBSb2JvdG8sIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMS41O1xuICBjb2xvcjogIzBhMGEwYTtcbiAgYmFja2dyb3VuZDogI2ZlZmVmZTtcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7IH1cblxuaW1nIHtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGF1dG87XG4gIC1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6IGJpY3ViaWM7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgfVxuXG50ZXh0YXJlYSB7XG4gIGhlaWdodDogYXV0bztcbiAgbWluLWhlaWdodDogNTBweDtcbiAgYm9yZGVyLXJhZGl1czogMDsgfVxuXG5zZWxlY3Qge1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogMDsgfVxuXG4jbWFwX2NhbnZhcyBpbWcsXG4jbWFwX2NhbnZhcyBlbWJlZCxcbiNtYXBfY2FudmFzIG9iamVjdCxcbi5tYXBfY2FudmFzIGltZyxcbi5tYXBfY2FudmFzIGVtYmVkLFxuLm1hcF9jYW52YXMgb2JqZWN0LFxuLm1xYS1kaXNwbGF5IGltZyxcbi5tcWEtZGlzcGxheSBlbWJlZCxcbi5tcWEtZGlzcGxheSBvYmplY3Qge1xuICBtYXgtd2lkdGg6IG5vbmUgIWltcG9ydGFudDsgfVxuXG5idXR0b24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgbGluZS1oZWlnaHQ6IDE7IH1cblxuLmlzLXZpc2libGUge1xuICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9XG5cbi5pcy1oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH1cblxuLnJvdyB7XG4gIG1heC13aWR0aDogNzVyZW07XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87IH1cbiAgLnJvdzo6YmVmb3JlLCAucm93OjphZnRlciB7XG4gICAgY29udGVudDogJyAnO1xuICAgIGRpc3BsYXk6IHRhYmxlOyB9XG4gIC5yb3c6OmFmdGVyIHtcbiAgICBjbGVhcjogYm90aDsgfVxuICAucm93LmNvbGxhcHNlID4gLmNvbHVtbiwgLnJvdy5jb2xsYXBzZSA+IC5jb2x1bW5zIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgcGFkZGluZy1yaWdodDogMDsgfVxuICAucm93IC5yb3cge1xuICAgIG1hcmdpbi1sZWZ0OiAtMC42MjVyZW07XG4gICAgbWFyZ2luLXJpZ2h0OiAtMC42MjVyZW07IH1cbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0MGVtKSB7XG4gICAgICAucm93IC5yb3cge1xuICAgICAgICBtYXJnaW4tbGVmdDogLTAuOTM3NXJlbTtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAtMC45Mzc1cmVtOyB9IH1cbiAgICAucm93IC5yb3cuY29sbGFwc2Uge1xuICAgICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDA7IH1cbiAgLnJvdy5leHBhbmRlZCB7XG4gICAgbWF4LXdpZHRoOiBub25lOyB9XG4gICAgLnJvdy5leHBhbmRlZCAucm93IHtcbiAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvOyB9XG5cbi5jb2x1bW4sIC5jb2x1bW5zIHtcbiAgcGFkZGluZy1sZWZ0OiAwLjYyNXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC42MjVyZW07XG4gIHdpZHRoOiAxMDAlO1xuICBmbG9hdDogbGVmdDsgfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0MGVtKSB7XG4gICAgLmNvbHVtbiwgLmNvbHVtbnMge1xuICAgICAgcGFkZGluZy1sZWZ0OiAwLjkzNzVyZW07XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAwLjkzNzVyZW07IH0gfVxuICAuY29sdW1uOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksIC5jb2x1bW5zOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkge1xuICAgIGZsb2F0OiByaWdodDsgfVxuICAuY29sdW1uLmVuZDpsYXN0LWNoaWxkOmxhc3QtY2hpbGQsIC5lbmQuY29sdW1uczpsYXN0LWNoaWxkOmxhc3QtY2hpbGQge1xuICAgIGZsb2F0OiBsZWZ0OyB9XG5cbi5jb2x1bW4ucm93LnJvdywgLnJvdy5yb3cuY29sdW1ucyB7XG4gIGZsb2F0OiBub25lOyB9XG4gIC5yb3cgLmNvbHVtbi5yb3cucm93LCAucm93IC5yb3cucm93LmNvbHVtbnMge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIG1hcmdpbi1yaWdodDogMDsgfVxuXG4uc21hbGwtMSB7XG4gIHdpZHRoOiA4LjMzMzMzJTsgfVxuXG4uc21hbGwtcHVzaC0xIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiA4LjMzMzMzJTsgfVxuXG4uc21hbGwtcHVsbC0xIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAtOC4zMzMzMyU7IH1cblxuLnNtYWxsLW9mZnNldC0wIHtcbiAgbWFyZ2luLWxlZnQ6IDAlOyB9XG5cbi5zbWFsbC0yIHtcbiAgd2lkdGg6IDE2LjY2NjY3JTsgfVxuXG4uc21hbGwtcHVzaC0yIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAxNi42NjY2NyU7IH1cblxuLnNtYWxsLXB1bGwtMiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbGVmdDogLTE2LjY2NjY3JTsgfVxuXG4uc21hbGwtb2Zmc2V0LTEge1xuICBtYXJnaW4tbGVmdDogOC4zMzMzMyU7IH1cblxuLnNtYWxsLTMge1xuICB3aWR0aDogMjUlOyB9XG5cbi5zbWFsbC1wdXNoLTMge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGxlZnQ6IDI1JTsgfVxuXG4uc21hbGwtcHVsbC0zIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAtMjUlOyB9XG5cbi5zbWFsbC1vZmZzZXQtMiB7XG4gIG1hcmdpbi1sZWZ0OiAxNi42NjY2NyU7IH1cblxuLnNtYWxsLTQge1xuICB3aWR0aDogMzMuMzMzMzMlOyB9XG5cbi5zbWFsbC1wdXNoLTQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGxlZnQ6IDMzLjMzMzMzJTsgfVxuXG4uc21hbGwtcHVsbC00IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAtMzMuMzMzMzMlOyB9XG5cbi5zbWFsbC1vZmZzZXQtMyB7XG4gIG1hcmdpbi1sZWZ0OiAyNSU7IH1cblxuLnNtYWxsLTUge1xuICB3aWR0aDogNDEuNjY2NjclOyB9XG5cbi5zbWFsbC1wdXNoLTUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGxlZnQ6IDQxLjY2NjY3JTsgfVxuXG4uc21hbGwtcHVsbC01IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAtNDEuNjY2NjclOyB9XG5cbi5zbWFsbC1vZmZzZXQtNCB7XG4gIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMyU7IH1cblxuLnNtYWxsLTYge1xuICB3aWR0aDogNTAlOyB9XG5cbi5zbWFsbC1wdXNoLTYge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGxlZnQ6IDUwJTsgfVxuXG4uc21hbGwtcHVsbC02IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAtNTAlOyB9XG5cbi5zbWFsbC1vZmZzZXQtNSB7XG4gIG1hcmdpbi1sZWZ0OiA0MS42NjY2NyU7IH1cblxuLnNtYWxsLTcge1xuICB3aWR0aDogNTguMzMzMzMlOyB9XG5cbi5zbWFsbC1wdXNoLTcge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGxlZnQ6IDU4LjMzMzMzJTsgfVxuXG4uc21hbGwtcHVsbC03IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAtNTguMzMzMzMlOyB9XG5cbi5zbWFsbC1vZmZzZXQtNiB7XG4gIG1hcmdpbi1sZWZ0OiA1MCU7IH1cblxuLnNtYWxsLTgge1xuICB3aWR0aDogNjYuNjY2NjclOyB9XG5cbi5zbWFsbC1wdXNoLTgge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGxlZnQ6IDY2LjY2NjY3JTsgfVxuXG4uc21hbGwtcHVsbC04IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAtNjYuNjY2NjclOyB9XG5cbi5zbWFsbC1vZmZzZXQtNyB7XG4gIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMyU7IH1cblxuLnNtYWxsLTkge1xuICB3aWR0aDogNzUlOyB9XG5cbi5zbWFsbC1wdXNoLTkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGxlZnQ6IDc1JTsgfVxuXG4uc21hbGwtcHVsbC05IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAtNzUlOyB9XG5cbi5zbWFsbC1vZmZzZXQtOCB7XG4gIG1hcmdpbi1sZWZ0OiA2Ni42NjY2NyU7IH1cblxuLnNtYWxsLTEwIHtcbiAgd2lkdGg6IDgzLjMzMzMzJTsgfVxuXG4uc21hbGwtcHVzaC0xMCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbGVmdDogODMuMzMzMzMlOyB9XG5cbi5zbWFsbC1wdWxsLTEwIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAtODMuMzMzMzMlOyB9XG5cbi5zbWFsbC1vZmZzZXQtOSB7XG4gIG1hcmdpbi1sZWZ0OiA3NSU7IH1cblxuLnNtYWxsLTExIHtcbiAgd2lkdGg6IDkxLjY2NjY3JTsgfVxuXG4uc21hbGwtcHVzaC0xMSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbGVmdDogOTEuNjY2NjclOyB9XG5cbi5zbWFsbC1wdWxsLTExIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAtOTEuNjY2NjclOyB9XG5cbi5zbWFsbC1vZmZzZXQtMTAge1xuICBtYXJnaW4tbGVmdDogODMuMzMzMzMlOyB9XG5cbi5zbWFsbC0xMiB7XG4gIHdpZHRoOiAxMDAlOyB9XG5cbi5zbWFsbC1vZmZzZXQtMTEge1xuICBtYXJnaW4tbGVmdDogOTEuNjY2NjclOyB9XG5cbi5zbWFsbC11cC0xID4gLmNvbHVtbiwgLnNtYWxsLXVwLTEgPiAuY29sdW1ucyB7XG4gIHdpZHRoOiAxMDAlO1xuICBmbG9hdDogbGVmdDsgfVxuICAuc21hbGwtdXAtMSA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMW4pLCAuc21hbGwtdXAtMSA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgY2xlYXI6IG5vbmU7IH1cbiAgLnNtYWxsLXVwLTEgPiAuY29sdW1uOm50aC1vZi10eXBlKDFuKzEpLCAuc21hbGwtdXAtMSA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKzEpIHtcbiAgICBjbGVhcjogYm90aDsgfVxuICAuc21hbGwtdXAtMSA+IC5jb2x1bW46bGFzdC1jaGlsZCwgLnNtYWxsLXVwLTEgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICBmbG9hdDogbGVmdDsgfVxuXG4uc21hbGwtdXAtMiA+IC5jb2x1bW4sIC5zbWFsbC11cC0yID4gLmNvbHVtbnMge1xuICB3aWR0aDogNTAlO1xuICBmbG9hdDogbGVmdDsgfVxuICAuc21hbGwtdXAtMiA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMW4pLCAuc21hbGwtdXAtMiA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgY2xlYXI6IG5vbmU7IH1cbiAgLnNtYWxsLXVwLTIgPiAuY29sdW1uOm50aC1vZi10eXBlKDJuKzEpLCAuc21hbGwtdXAtMiA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDJuKzEpIHtcbiAgICBjbGVhcjogYm90aDsgfVxuICAuc21hbGwtdXAtMiA+IC5jb2x1bW46bGFzdC1jaGlsZCwgLnNtYWxsLXVwLTIgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICBmbG9hdDogbGVmdDsgfVxuXG4uc21hbGwtdXAtMyA+IC5jb2x1bW4sIC5zbWFsbC11cC0zID4gLmNvbHVtbnMge1xuICB3aWR0aDogMzMuMzMzMzMlO1xuICBmbG9hdDogbGVmdDsgfVxuICAuc21hbGwtdXAtMyA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMW4pLCAuc21hbGwtdXAtMyA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgY2xlYXI6IG5vbmU7IH1cbiAgLnNtYWxsLXVwLTMgPiAuY29sdW1uOm50aC1vZi10eXBlKDNuKzEpLCAuc21hbGwtdXAtMyA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDNuKzEpIHtcbiAgICBjbGVhcjogYm90aDsgfVxuICAuc21hbGwtdXAtMyA+IC5jb2x1bW46bGFzdC1jaGlsZCwgLnNtYWxsLXVwLTMgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICBmbG9hdDogbGVmdDsgfVxuXG4uc21hbGwtdXAtNCA+IC5jb2x1bW4sIC5zbWFsbC11cC00ID4gLmNvbHVtbnMge1xuICB3aWR0aDogMjUlO1xuICBmbG9hdDogbGVmdDsgfVxuICAuc21hbGwtdXAtNCA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMW4pLCAuc21hbGwtdXAtNCA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgY2xlYXI6IG5vbmU7IH1cbiAgLnNtYWxsLXVwLTQgPiAuY29sdW1uOm50aC1vZi10eXBlKDRuKzEpLCAuc21hbGwtdXAtNCA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDRuKzEpIHtcbiAgICBjbGVhcjogYm90aDsgfVxuICAuc21hbGwtdXAtNCA+IC5jb2x1bW46bGFzdC1jaGlsZCwgLnNtYWxsLXVwLTQgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICBmbG9hdDogbGVmdDsgfVxuXG4uc21hbGwtdXAtNSA+IC5jb2x1bW4sIC5zbWFsbC11cC01ID4gLmNvbHVtbnMge1xuICB3aWR0aDogMjAlO1xuICBmbG9hdDogbGVmdDsgfVxuICAuc21hbGwtdXAtNSA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMW4pLCAuc21hbGwtdXAtNSA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgY2xlYXI6IG5vbmU7IH1cbiAgLnNtYWxsLXVwLTUgPiAuY29sdW1uOm50aC1vZi10eXBlKDVuKzEpLCAuc21hbGwtdXAtNSA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDVuKzEpIHtcbiAgICBjbGVhcjogYm90aDsgfVxuICAuc21hbGwtdXAtNSA+IC5jb2x1bW46bGFzdC1jaGlsZCwgLnNtYWxsLXVwLTUgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICBmbG9hdDogbGVmdDsgfVxuXG4uc21hbGwtdXAtNiA+IC5jb2x1bW4sIC5zbWFsbC11cC02ID4gLmNvbHVtbnMge1xuICB3aWR0aDogMTYuNjY2NjclO1xuICBmbG9hdDogbGVmdDsgfVxuICAuc21hbGwtdXAtNiA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMW4pLCAuc21hbGwtdXAtNiA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgY2xlYXI6IG5vbmU7IH1cbiAgLnNtYWxsLXVwLTYgPiAuY29sdW1uOm50aC1vZi10eXBlKDZuKzEpLCAuc21hbGwtdXAtNiA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDZuKzEpIHtcbiAgICBjbGVhcjogYm90aDsgfVxuICAuc21hbGwtdXAtNiA+IC5jb2x1bW46bGFzdC1jaGlsZCwgLnNtYWxsLXVwLTYgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICBmbG9hdDogbGVmdDsgfVxuXG4uc21hbGwtdXAtNyA+IC5jb2x1bW4sIC5zbWFsbC11cC03ID4gLmNvbHVtbnMge1xuICB3aWR0aDogMTQuMjg1NzElO1xuICBmbG9hdDogbGVmdDsgfVxuICAuc21hbGwtdXAtNyA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMW4pLCAuc21hbGwtdXAtNyA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgY2xlYXI6IG5vbmU7IH1cbiAgLnNtYWxsLXVwLTcgPiAuY29sdW1uOm50aC1vZi10eXBlKDduKzEpLCAuc21hbGwtdXAtNyA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDduKzEpIHtcbiAgICBjbGVhcjogYm90aDsgfVxuICAuc21hbGwtdXAtNyA+IC5jb2x1bW46bGFzdC1jaGlsZCwgLnNtYWxsLXVwLTcgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICBmbG9hdDogbGVmdDsgfVxuXG4uc21hbGwtdXAtOCA+IC5jb2x1bW4sIC5zbWFsbC11cC04ID4gLmNvbHVtbnMge1xuICB3aWR0aDogMTIuNSU7XG4gIGZsb2F0OiBsZWZ0OyB9XG4gIC5zbWFsbC11cC04ID4gLmNvbHVtbjpudGgtb2YtdHlwZSgxbiksIC5zbWFsbC11cC04ID4gLmNvbHVtbnM6bnRoLW9mLXR5cGUoMW4pIHtcbiAgICBjbGVhcjogbm9uZTsgfVxuICAuc21hbGwtdXAtOCA+IC5jb2x1bW46bnRoLW9mLXR5cGUoOG4rMSksIC5zbWFsbC11cC04ID4gLmNvbHVtbnM6bnRoLW9mLXR5cGUoOG4rMSkge1xuICAgIGNsZWFyOiBib3RoOyB9XG4gIC5zbWFsbC11cC04ID4gLmNvbHVtbjpsYXN0LWNoaWxkLCAuc21hbGwtdXAtOCA+IC5jb2x1bW5zOmxhc3QtY2hpbGQge1xuICAgIGZsb2F0OiBsZWZ0OyB9XG5cbi5zbWFsbC1jb2xsYXBzZSA+IC5jb2x1bW4sIC5zbWFsbC1jb2xsYXBzZSA+IC5jb2x1bW5zIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBwYWRkaW5nLXJpZ2h0OiAwOyB9XG5cbi5zbWFsbC1jb2xsYXBzZSAucm93IHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIG1hcmdpbi1yaWdodDogMDsgfVxuXG4uc21hbGwtdW5jb2xsYXBzZSA+IC5jb2x1bW4sIC5zbWFsbC11bmNvbGxhcHNlID4gLmNvbHVtbnMge1xuICBwYWRkaW5nLWxlZnQ6IDAuNjI1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjYyNXJlbTsgfVxuXG4uc21hbGwtY2VudGVyZWQge1xuICBmbG9hdDogbm9uZTtcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIG1hcmdpbi1yaWdodDogYXV0bzsgfVxuXG4uc21hbGwtdW5jZW50ZXJlZCxcbi5zbWFsbC1wdXNoLTAsXG4uc21hbGwtcHVsbC0wIHtcbiAgcG9zaXRpb246IHN0YXRpYztcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIG1hcmdpbi1yaWdodDogMDtcbiAgZmxvYXQ6IGxlZnQ7IH1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNDBlbSkge1xuICAubWVkaXVtLTEge1xuICAgIHdpZHRoOiA4LjMzMzMzJTsgfVxuICAubWVkaXVtLXB1c2gtMSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDguMzMzMzMlOyB9XG4gIC5tZWRpdW0tcHVsbC0xIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTguMzMzMzMlOyB9XG4gIC5tZWRpdW0tb2Zmc2V0LTAge1xuICAgIG1hcmdpbi1sZWZ0OiAwJTsgfVxuICAubWVkaXVtLTIge1xuICAgIHdpZHRoOiAxNi42NjY2NyU7IH1cbiAgLm1lZGl1bS1wdXNoLTIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiAxNi42NjY2NyU7IH1cbiAgLm1lZGl1bS1wdWxsLTIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiAtMTYuNjY2NjclOyB9XG4gIC5tZWRpdW0tb2Zmc2V0LTEge1xuICAgIG1hcmdpbi1sZWZ0OiA4LjMzMzMzJTsgfVxuICAubWVkaXVtLTMge1xuICAgIHdpZHRoOiAyNSU7IH1cbiAgLm1lZGl1bS1wdXNoLTMge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiAyNSU7IH1cbiAgLm1lZGl1bS1wdWxsLTMge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiAtMjUlOyB9XG4gIC5tZWRpdW0tb2Zmc2V0LTIge1xuICAgIG1hcmdpbi1sZWZ0OiAxNi42NjY2NyU7IH1cbiAgLm1lZGl1bS00IHtcbiAgICB3aWR0aDogMzMuMzMzMzMlOyB9XG4gIC5tZWRpdW0tcHVzaC00IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogMzMuMzMzMzMlOyB9XG4gIC5tZWRpdW0tcHVsbC00IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTMzLjMzMzMzJTsgfVxuICAubWVkaXVtLW9mZnNldC0zIHtcbiAgICBtYXJnaW4tbGVmdDogMjUlOyB9XG4gIC5tZWRpdW0tNSB7XG4gICAgd2lkdGg6IDQxLjY2NjY3JTsgfVxuICAubWVkaXVtLXB1c2gtNSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDQxLjY2NjY3JTsgfVxuICAubWVkaXVtLXB1bGwtNSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IC00MS42NjY2NyU7IH1cbiAgLm1lZGl1bS1vZmZzZXQtNCB7XG4gICAgbWFyZ2luLWxlZnQ6IDMzLjMzMzMzJTsgfVxuICAubWVkaXVtLTYge1xuICAgIHdpZHRoOiA1MCU7IH1cbiAgLm1lZGl1bS1wdXNoLTYge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiA1MCU7IH1cbiAgLm1lZGl1bS1wdWxsLTYge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiAtNTAlOyB9XG4gIC5tZWRpdW0tb2Zmc2V0LTUge1xuICAgIG1hcmdpbi1sZWZ0OiA0MS42NjY2NyU7IH1cbiAgLm1lZGl1bS03IHtcbiAgICB3aWR0aDogNTguMzMzMzMlOyB9XG4gIC5tZWRpdW0tcHVzaC03IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogNTguMzMzMzMlOyB9XG4gIC5tZWRpdW0tcHVsbC03IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTU4LjMzMzMzJTsgfVxuICAubWVkaXVtLW9mZnNldC02IHtcbiAgICBtYXJnaW4tbGVmdDogNTAlOyB9XG4gIC5tZWRpdW0tOCB7XG4gICAgd2lkdGg6IDY2LjY2NjY3JTsgfVxuICAubWVkaXVtLXB1c2gtOCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDY2LjY2NjY3JTsgfVxuICAubWVkaXVtLXB1bGwtOCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IC02Ni42NjY2NyU7IH1cbiAgLm1lZGl1bS1vZmZzZXQtNyB7XG4gICAgbWFyZ2luLWxlZnQ6IDU4LjMzMzMzJTsgfVxuICAubWVkaXVtLTkge1xuICAgIHdpZHRoOiA3NSU7IH1cbiAgLm1lZGl1bS1wdXNoLTkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiA3NSU7IH1cbiAgLm1lZGl1bS1wdWxsLTkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiAtNzUlOyB9XG4gIC5tZWRpdW0tb2Zmc2V0LTgge1xuICAgIG1hcmdpbi1sZWZ0OiA2Ni42NjY2NyU7IH1cbiAgLm1lZGl1bS0xMCB7XG4gICAgd2lkdGg6IDgzLjMzMzMzJTsgfVxuICAubWVkaXVtLXB1c2gtMTAge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiA4My4zMzMzMyU7IH1cbiAgLm1lZGl1bS1wdWxsLTEwIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTgzLjMzMzMzJTsgfVxuICAubWVkaXVtLW9mZnNldC05IHtcbiAgICBtYXJnaW4tbGVmdDogNzUlOyB9XG4gIC5tZWRpdW0tMTEge1xuICAgIHdpZHRoOiA5MS42NjY2NyU7IH1cbiAgLm1lZGl1bS1wdXNoLTExIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogOTEuNjY2NjclOyB9XG4gIC5tZWRpdW0tcHVsbC0xMSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IC05MS42NjY2NyU7IH1cbiAgLm1lZGl1bS1vZmZzZXQtMTAge1xuICAgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMyU7IH1cbiAgLm1lZGl1bS0xMiB7XG4gICAgd2lkdGg6IDEwMCU7IH1cbiAgLm1lZGl1bS1vZmZzZXQtMTEge1xuICAgIG1hcmdpbi1sZWZ0OiA5MS42NjY2NyU7IH1cbiAgLm1lZGl1bS11cC0xID4gLmNvbHVtbiwgLm1lZGl1bS11cC0xID4gLmNvbHVtbnMge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZsb2F0OiBsZWZ0OyB9XG4gICAgLm1lZGl1bS11cC0xID4gLmNvbHVtbjpudGgtb2YtdHlwZSgxbiksIC5tZWRpdW0tdXAtMSA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgICBjbGVhcjogbm9uZTsgfVxuICAgIC5tZWRpdW0tdXAtMSA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMW4rMSksIC5tZWRpdW0tdXAtMSA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKzEpIHtcbiAgICAgIGNsZWFyOiBib3RoOyB9XG4gICAgLm1lZGl1bS11cC0xID4gLmNvbHVtbjpsYXN0LWNoaWxkLCAubWVkaXVtLXVwLTEgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICAgIGZsb2F0OiBsZWZ0OyB9XG4gIC5tZWRpdW0tdXAtMiA+IC5jb2x1bW4sIC5tZWRpdW0tdXAtMiA+IC5jb2x1bW5zIHtcbiAgICB3aWR0aDogNTAlO1xuICAgIGZsb2F0OiBsZWZ0OyB9XG4gICAgLm1lZGl1bS11cC0yID4gLmNvbHVtbjpudGgtb2YtdHlwZSgxbiksIC5tZWRpdW0tdXAtMiA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgICBjbGVhcjogbm9uZTsgfVxuICAgIC5tZWRpdW0tdXAtMiA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMm4rMSksIC5tZWRpdW0tdXAtMiA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDJuKzEpIHtcbiAgICAgIGNsZWFyOiBib3RoOyB9XG4gICAgLm1lZGl1bS11cC0yID4gLmNvbHVtbjpsYXN0LWNoaWxkLCAubWVkaXVtLXVwLTIgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICAgIGZsb2F0OiBsZWZ0OyB9XG4gIC5tZWRpdW0tdXAtMyA+IC5jb2x1bW4sIC5tZWRpdW0tdXAtMyA+IC5jb2x1bW5zIHtcbiAgICB3aWR0aDogMzMuMzMzMzMlO1xuICAgIGZsb2F0OiBsZWZ0OyB9XG4gICAgLm1lZGl1bS11cC0zID4gLmNvbHVtbjpudGgtb2YtdHlwZSgxbiksIC5tZWRpdW0tdXAtMyA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgICBjbGVhcjogbm9uZTsgfVxuICAgIC5tZWRpdW0tdXAtMyA+IC5jb2x1bW46bnRoLW9mLXR5cGUoM24rMSksIC5tZWRpdW0tdXAtMyA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDNuKzEpIHtcbiAgICAgIGNsZWFyOiBib3RoOyB9XG4gICAgLm1lZGl1bS11cC0zID4gLmNvbHVtbjpsYXN0LWNoaWxkLCAubWVkaXVtLXVwLTMgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICAgIGZsb2F0OiBsZWZ0OyB9XG4gIC5tZWRpdW0tdXAtNCA+IC5jb2x1bW4sIC5tZWRpdW0tdXAtNCA+IC5jb2x1bW5zIHtcbiAgICB3aWR0aDogMjUlO1xuICAgIGZsb2F0OiBsZWZ0OyB9XG4gICAgLm1lZGl1bS11cC00ID4gLmNvbHVtbjpudGgtb2YtdHlwZSgxbiksIC5tZWRpdW0tdXAtNCA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgICBjbGVhcjogbm9uZTsgfVxuICAgIC5tZWRpdW0tdXAtNCA+IC5jb2x1bW46bnRoLW9mLXR5cGUoNG4rMSksIC5tZWRpdW0tdXAtNCA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDRuKzEpIHtcbiAgICAgIGNsZWFyOiBib3RoOyB9XG4gICAgLm1lZGl1bS11cC00ID4gLmNvbHVtbjpsYXN0LWNoaWxkLCAubWVkaXVtLXVwLTQgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICAgIGZsb2F0OiBsZWZ0OyB9XG4gIC5tZWRpdW0tdXAtNSA+IC5jb2x1bW4sIC5tZWRpdW0tdXAtNSA+IC5jb2x1bW5zIHtcbiAgICB3aWR0aDogMjAlO1xuICAgIGZsb2F0OiBsZWZ0OyB9XG4gICAgLm1lZGl1bS11cC01ID4gLmNvbHVtbjpudGgtb2YtdHlwZSgxbiksIC5tZWRpdW0tdXAtNSA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgICBjbGVhcjogbm9uZTsgfVxuICAgIC5tZWRpdW0tdXAtNSA+IC5jb2x1bW46bnRoLW9mLXR5cGUoNW4rMSksIC5tZWRpdW0tdXAtNSA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDVuKzEpIHtcbiAgICAgIGNsZWFyOiBib3RoOyB9XG4gICAgLm1lZGl1bS11cC01ID4gLmNvbHVtbjpsYXN0LWNoaWxkLCAubWVkaXVtLXVwLTUgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICAgIGZsb2F0OiBsZWZ0OyB9XG4gIC5tZWRpdW0tdXAtNiA+IC5jb2x1bW4sIC5tZWRpdW0tdXAtNiA+IC5jb2x1bW5zIHtcbiAgICB3aWR0aDogMTYuNjY2NjclO1xuICAgIGZsb2F0OiBsZWZ0OyB9XG4gICAgLm1lZGl1bS11cC02ID4gLmNvbHVtbjpudGgtb2YtdHlwZSgxbiksIC5tZWRpdW0tdXAtNiA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgICBjbGVhcjogbm9uZTsgfVxuICAgIC5tZWRpdW0tdXAtNiA+IC5jb2x1bW46bnRoLW9mLXR5cGUoNm4rMSksIC5tZWRpdW0tdXAtNiA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDZuKzEpIHtcbiAgICAgIGNsZWFyOiBib3RoOyB9XG4gICAgLm1lZGl1bS11cC02ID4gLmNvbHVtbjpsYXN0LWNoaWxkLCAubWVkaXVtLXVwLTYgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICAgIGZsb2F0OiBsZWZ0OyB9XG4gIC5tZWRpdW0tdXAtNyA+IC5jb2x1bW4sIC5tZWRpdW0tdXAtNyA+IC5jb2x1bW5zIHtcbiAgICB3aWR0aDogMTQuMjg1NzElO1xuICAgIGZsb2F0OiBsZWZ0OyB9XG4gICAgLm1lZGl1bS11cC03ID4gLmNvbHVtbjpudGgtb2YtdHlwZSgxbiksIC5tZWRpdW0tdXAtNyA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgICBjbGVhcjogbm9uZTsgfVxuICAgIC5tZWRpdW0tdXAtNyA+IC5jb2x1bW46bnRoLW9mLXR5cGUoN24rMSksIC5tZWRpdW0tdXAtNyA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDduKzEpIHtcbiAgICAgIGNsZWFyOiBib3RoOyB9XG4gICAgLm1lZGl1bS11cC03ID4gLmNvbHVtbjpsYXN0LWNoaWxkLCAubWVkaXVtLXVwLTcgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICAgIGZsb2F0OiBsZWZ0OyB9XG4gIC5tZWRpdW0tdXAtOCA+IC5jb2x1bW4sIC5tZWRpdW0tdXAtOCA+IC5jb2x1bW5zIHtcbiAgICB3aWR0aDogMTIuNSU7XG4gICAgZmxvYXQ6IGxlZnQ7IH1cbiAgICAubWVkaXVtLXVwLTggPiAuY29sdW1uOm50aC1vZi10eXBlKDFuKSwgLm1lZGl1bS11cC04ID4gLmNvbHVtbnM6bnRoLW9mLXR5cGUoMW4pIHtcbiAgICAgIGNsZWFyOiBub25lOyB9XG4gICAgLm1lZGl1bS11cC04ID4gLmNvbHVtbjpudGgtb2YtdHlwZSg4bisxKSwgLm1lZGl1bS11cC04ID4gLmNvbHVtbnM6bnRoLW9mLXR5cGUoOG4rMSkge1xuICAgICAgY2xlYXI6IGJvdGg7IH1cbiAgICAubWVkaXVtLXVwLTggPiAuY29sdW1uOmxhc3QtY2hpbGQsIC5tZWRpdW0tdXAtOCA+IC5jb2x1bW5zOmxhc3QtY2hpbGQge1xuICAgICAgZmxvYXQ6IGxlZnQ7IH1cbiAgLm1lZGl1bS1jb2xsYXBzZSA+IC5jb2x1bW4sIC5tZWRpdW0tY29sbGFwc2UgPiAuY29sdW1ucyB7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgIHBhZGRpbmctcmlnaHQ6IDA7IH1cbiAgLm1lZGl1bS1jb2xsYXBzZSAucm93IHtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7IH1cbiAgLm1lZGl1bS11bmNvbGxhcHNlID4gLmNvbHVtbiwgLm1lZGl1bS11bmNvbGxhcHNlID4gLmNvbHVtbnMge1xuICAgIHBhZGRpbmctbGVmdDogMC45Mzc1cmVtO1xuICAgIHBhZGRpbmctcmlnaHQ6IDAuOTM3NXJlbTsgfVxuICAubWVkaXVtLWNlbnRlcmVkIHtcbiAgICBmbG9hdDogbm9uZTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87IH1cbiAgLm1lZGl1bS11bmNlbnRlcmVkLFxuICAubWVkaXVtLXB1c2gtMCxcbiAgLm1lZGl1bS1wdWxsLTAge1xuICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIGZsb2F0OiBsZWZ0OyB9IH1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNjRlbSkge1xuICAubGFyZ2UtMSB7XG4gICAgd2lkdGg6IDguMzMzMzMlOyB9XG4gIC5sYXJnZS1wdXNoLTEge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiA4LjMzMzMzJTsgfVxuICAubGFyZ2UtcHVsbC0xIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTguMzMzMzMlOyB9XG4gIC5sYXJnZS1vZmZzZXQtMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDAlOyB9XG4gIC5sYXJnZS0yIHtcbiAgICB3aWR0aDogMTYuNjY2NjclOyB9XG4gIC5sYXJnZS1wdXNoLTIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiAxNi42NjY2NyU7IH1cbiAgLmxhcmdlLXB1bGwtMiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IC0xNi42NjY2NyU7IH1cbiAgLmxhcmdlLW9mZnNldC0xIHtcbiAgICBtYXJnaW4tbGVmdDogOC4zMzMzMyU7IH1cbiAgLmxhcmdlLTMge1xuICAgIHdpZHRoOiAyNSU7IH1cbiAgLmxhcmdlLXB1c2gtMyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDI1JTsgfVxuICAubGFyZ2UtcHVsbC0zIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTI1JTsgfVxuICAubGFyZ2Utb2Zmc2V0LTIge1xuICAgIG1hcmdpbi1sZWZ0OiAxNi42NjY2NyU7IH1cbiAgLmxhcmdlLTQge1xuICAgIHdpZHRoOiAzMy4zMzMzMyU7IH1cbiAgLmxhcmdlLXB1c2gtNCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDMzLjMzMzMzJTsgfVxuICAubGFyZ2UtcHVsbC00IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTMzLjMzMzMzJTsgfVxuICAubGFyZ2Utb2Zmc2V0LTMge1xuICAgIG1hcmdpbi1sZWZ0OiAyNSU7IH1cbiAgLmxhcmdlLTUge1xuICAgIHdpZHRoOiA0MS42NjY2NyU7IH1cbiAgLmxhcmdlLXB1c2gtNSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDQxLjY2NjY3JTsgfVxuICAubGFyZ2UtcHVsbC01IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTQxLjY2NjY3JTsgfVxuICAubGFyZ2Utb2Zmc2V0LTQge1xuICAgIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMyU7IH1cbiAgLmxhcmdlLTYge1xuICAgIHdpZHRoOiA1MCU7IH1cbiAgLmxhcmdlLXB1c2gtNiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDUwJTsgfVxuICAubGFyZ2UtcHVsbC02IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTUwJTsgfVxuICAubGFyZ2Utb2Zmc2V0LTUge1xuICAgIG1hcmdpbi1sZWZ0OiA0MS42NjY2NyU7IH1cbiAgLmxhcmdlLTcge1xuICAgIHdpZHRoOiA1OC4zMzMzMyU7IH1cbiAgLmxhcmdlLXB1c2gtNyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDU4LjMzMzMzJTsgfVxuICAubGFyZ2UtcHVsbC03IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTU4LjMzMzMzJTsgfVxuICAubGFyZ2Utb2Zmc2V0LTYge1xuICAgIG1hcmdpbi1sZWZ0OiA1MCU7IH1cbiAgLmxhcmdlLTgge1xuICAgIHdpZHRoOiA2Ni42NjY2NyU7IH1cbiAgLmxhcmdlLXB1c2gtOCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDY2LjY2NjY3JTsgfVxuICAubGFyZ2UtcHVsbC04IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTY2LjY2NjY3JTsgfVxuICAubGFyZ2Utb2Zmc2V0LTcge1xuICAgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMyU7IH1cbiAgLmxhcmdlLTkge1xuICAgIHdpZHRoOiA3NSU7IH1cbiAgLmxhcmdlLXB1c2gtOSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDc1JTsgfVxuICAubGFyZ2UtcHVsbC05IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTc1JTsgfVxuICAubGFyZ2Utb2Zmc2V0LTgge1xuICAgIG1hcmdpbi1sZWZ0OiA2Ni42NjY2NyU7IH1cbiAgLmxhcmdlLTEwIHtcbiAgICB3aWR0aDogODMuMzMzMzMlOyB9XG4gIC5sYXJnZS1wdXNoLTEwIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogODMuMzMzMzMlOyB9XG4gIC5sYXJnZS1wdWxsLTEwIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTgzLjMzMzMzJTsgfVxuICAubGFyZ2Utb2Zmc2V0LTkge1xuICAgIG1hcmdpbi1sZWZ0OiA3NSU7IH1cbiAgLmxhcmdlLTExIHtcbiAgICB3aWR0aDogOTEuNjY2NjclOyB9XG4gIC5sYXJnZS1wdXNoLTExIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogOTEuNjY2NjclOyB9XG4gIC5sYXJnZS1wdWxsLTExIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTkxLjY2NjY3JTsgfVxuICAubGFyZ2Utb2Zmc2V0LTEwIHtcbiAgICBtYXJnaW4tbGVmdDogODMuMzMzMzMlOyB9XG4gIC5sYXJnZS0xMiB7XG4gICAgd2lkdGg6IDEwMCU7IH1cbiAgLmxhcmdlLW9mZnNldC0xMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY3JTsgfVxuICAubGFyZ2UtdXAtMSA+IC5jb2x1bW4sIC5sYXJnZS11cC0xID4gLmNvbHVtbnMge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZsb2F0OiBsZWZ0OyB9XG4gICAgLmxhcmdlLXVwLTEgPiAuY29sdW1uOm50aC1vZi10eXBlKDFuKSwgLmxhcmdlLXVwLTEgPiAuY29sdW1uczpudGgtb2YtdHlwZSgxbikge1xuICAgICAgY2xlYXI6IG5vbmU7IH1cbiAgICAubGFyZ2UtdXAtMSA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMW4rMSksIC5sYXJnZS11cC0xID4gLmNvbHVtbnM6bnRoLW9mLXR5cGUoMW4rMSkge1xuICAgICAgY2xlYXI6IGJvdGg7IH1cbiAgICAubGFyZ2UtdXAtMSA+IC5jb2x1bW46bGFzdC1jaGlsZCwgLmxhcmdlLXVwLTEgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICAgIGZsb2F0OiBsZWZ0OyB9XG4gIC5sYXJnZS11cC0yID4gLmNvbHVtbiwgLmxhcmdlLXVwLTIgPiAuY29sdW1ucyB7XG4gICAgd2lkdGg6IDUwJTtcbiAgICBmbG9hdDogbGVmdDsgfVxuICAgIC5sYXJnZS11cC0yID4gLmNvbHVtbjpudGgtb2YtdHlwZSgxbiksIC5sYXJnZS11cC0yID4gLmNvbHVtbnM6bnRoLW9mLXR5cGUoMW4pIHtcbiAgICAgIGNsZWFyOiBub25lOyB9XG4gICAgLmxhcmdlLXVwLTIgPiAuY29sdW1uOm50aC1vZi10eXBlKDJuKzEpLCAubGFyZ2UtdXAtMiA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDJuKzEpIHtcbiAgICAgIGNsZWFyOiBib3RoOyB9XG4gICAgLmxhcmdlLXVwLTIgPiAuY29sdW1uOmxhc3QtY2hpbGQsIC5sYXJnZS11cC0yID4gLmNvbHVtbnM6bGFzdC1jaGlsZCB7XG4gICAgICBmbG9hdDogbGVmdDsgfVxuICAubGFyZ2UtdXAtMyA+IC5jb2x1bW4sIC5sYXJnZS11cC0zID4gLmNvbHVtbnMge1xuICAgIHdpZHRoOiAzMy4zMzMzMyU7XG4gICAgZmxvYXQ6IGxlZnQ7IH1cbiAgICAubGFyZ2UtdXAtMyA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMW4pLCAubGFyZ2UtdXAtMyA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgICBjbGVhcjogbm9uZTsgfVxuICAgIC5sYXJnZS11cC0zID4gLmNvbHVtbjpudGgtb2YtdHlwZSgzbisxKSwgLmxhcmdlLXVwLTMgPiAuY29sdW1uczpudGgtb2YtdHlwZSgzbisxKSB7XG4gICAgICBjbGVhcjogYm90aDsgfVxuICAgIC5sYXJnZS11cC0zID4gLmNvbHVtbjpsYXN0LWNoaWxkLCAubGFyZ2UtdXAtMyA+IC5jb2x1bW5zOmxhc3QtY2hpbGQge1xuICAgICAgZmxvYXQ6IGxlZnQ7IH1cbiAgLmxhcmdlLXVwLTQgPiAuY29sdW1uLCAubGFyZ2UtdXAtNCA+IC5jb2x1bW5zIHtcbiAgICB3aWR0aDogMjUlO1xuICAgIGZsb2F0OiBsZWZ0OyB9XG4gICAgLmxhcmdlLXVwLTQgPiAuY29sdW1uOm50aC1vZi10eXBlKDFuKSwgLmxhcmdlLXVwLTQgPiAuY29sdW1uczpudGgtb2YtdHlwZSgxbikge1xuICAgICAgY2xlYXI6IG5vbmU7IH1cbiAgICAubGFyZ2UtdXAtNCA+IC5jb2x1bW46bnRoLW9mLXR5cGUoNG4rMSksIC5sYXJnZS11cC00ID4gLmNvbHVtbnM6bnRoLW9mLXR5cGUoNG4rMSkge1xuICAgICAgY2xlYXI6IGJvdGg7IH1cbiAgICAubGFyZ2UtdXAtNCA+IC5jb2x1bW46bGFzdC1jaGlsZCwgLmxhcmdlLXVwLTQgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICAgIGZsb2F0OiBsZWZ0OyB9XG4gIC5sYXJnZS11cC01ID4gLmNvbHVtbiwgLmxhcmdlLXVwLTUgPiAuY29sdW1ucyB7XG4gICAgd2lkdGg6IDIwJTtcbiAgICBmbG9hdDogbGVmdDsgfVxuICAgIC5sYXJnZS11cC01ID4gLmNvbHVtbjpudGgtb2YtdHlwZSgxbiksIC5sYXJnZS11cC01ID4gLmNvbHVtbnM6bnRoLW9mLXR5cGUoMW4pIHtcbiAgICAgIGNsZWFyOiBub25lOyB9XG4gICAgLmxhcmdlLXVwLTUgPiAuY29sdW1uOm50aC1vZi10eXBlKDVuKzEpLCAubGFyZ2UtdXAtNSA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDVuKzEpIHtcbiAgICAgIGNsZWFyOiBib3RoOyB9XG4gICAgLmxhcmdlLXVwLTUgPiAuY29sdW1uOmxhc3QtY2hpbGQsIC5sYXJnZS11cC01ID4gLmNvbHVtbnM6bGFzdC1jaGlsZCB7XG4gICAgICBmbG9hdDogbGVmdDsgfVxuICAubGFyZ2UtdXAtNiA+IC5jb2x1bW4sIC5sYXJnZS11cC02ID4gLmNvbHVtbnMge1xuICAgIHdpZHRoOiAxNi42NjY2NyU7XG4gICAgZmxvYXQ6IGxlZnQ7IH1cbiAgICAubGFyZ2UtdXAtNiA+IC5jb2x1bW46bnRoLW9mLXR5cGUoMW4pLCAubGFyZ2UtdXAtNiA+IC5jb2x1bW5zOm50aC1vZi10eXBlKDFuKSB7XG4gICAgICBjbGVhcjogbm9uZTsgfVxuICAgIC5sYXJnZS11cC02ID4gLmNvbHVtbjpudGgtb2YtdHlwZSg2bisxKSwgLmxhcmdlLXVwLTYgPiAuY29sdW1uczpudGgtb2YtdHlwZSg2bisxKSB7XG4gICAgICBjbGVhcjogYm90aDsgfVxuICAgIC5sYXJnZS11cC02ID4gLmNvbHVtbjpsYXN0LWNoaWxkLCAubGFyZ2UtdXAtNiA+IC5jb2x1bW5zOmxhc3QtY2hpbGQge1xuICAgICAgZmxvYXQ6IGxlZnQ7IH1cbiAgLmxhcmdlLXVwLTcgPiAuY29sdW1uLCAubGFyZ2UtdXAtNyA+IC5jb2x1bW5zIHtcbiAgICB3aWR0aDogMTQuMjg1NzElO1xuICAgIGZsb2F0OiBsZWZ0OyB9XG4gICAgLmxhcmdlLXVwLTcgPiAuY29sdW1uOm50aC1vZi10eXBlKDFuKSwgLmxhcmdlLXVwLTcgPiAuY29sdW1uczpudGgtb2YtdHlwZSgxbikge1xuICAgICAgY2xlYXI6IG5vbmU7IH1cbiAgICAubGFyZ2UtdXAtNyA+IC5jb2x1bW46bnRoLW9mLXR5cGUoN24rMSksIC5sYXJnZS11cC03ID4gLmNvbHVtbnM6bnRoLW9mLXR5cGUoN24rMSkge1xuICAgICAgY2xlYXI6IGJvdGg7IH1cbiAgICAubGFyZ2UtdXAtNyA+IC5jb2x1bW46bGFzdC1jaGlsZCwgLmxhcmdlLXVwLTcgPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICAgIGZsb2F0OiBsZWZ0OyB9XG4gIC5sYXJnZS11cC04ID4gLmNvbHVtbiwgLmxhcmdlLXVwLTggPiAuY29sdW1ucyB7XG4gICAgd2lkdGg6IDEyLjUlO1xuICAgIGZsb2F0OiBsZWZ0OyB9XG4gICAgLmxhcmdlLXVwLTggPiAuY29sdW1uOm50aC1vZi10eXBlKDFuKSwgLmxhcmdlLXVwLTggPiAuY29sdW1uczpudGgtb2YtdHlwZSgxbikge1xuICAgICAgY2xlYXI6IG5vbmU7IH1cbiAgICAubGFyZ2UtdXAtOCA+IC5jb2x1bW46bnRoLW9mLXR5cGUoOG4rMSksIC5sYXJnZS11cC04ID4gLmNvbHVtbnM6bnRoLW9mLXR5cGUoOG4rMSkge1xuICAgICAgY2xlYXI6IGJvdGg7IH1cbiAgICAubGFyZ2UtdXAtOCA+IC5jb2x1bW46bGFzdC1jaGlsZCwgLmxhcmdlLXVwLTggPiAuY29sdW1uczpsYXN0LWNoaWxkIHtcbiAgICAgIGZsb2F0OiBsZWZ0OyB9XG4gIC5sYXJnZS1jb2xsYXBzZSA+IC5jb2x1bW4sIC5sYXJnZS1jb2xsYXBzZSA+IC5jb2x1bW5zIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgcGFkZGluZy1yaWdodDogMDsgfVxuICAubGFyZ2UtY29sbGFwc2UgLnJvdyB7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAwOyB9XG4gIC5sYXJnZS11bmNvbGxhcHNlID4gLmNvbHVtbiwgLmxhcmdlLXVuY29sbGFwc2UgPiAuY29sdW1ucyB7XG4gICAgcGFkZGluZy1sZWZ0OiAwLjkzNzVyZW07XG4gICAgcGFkZGluZy1yaWdodDogMC45Mzc1cmVtOyB9XG4gIC5sYXJnZS1jZW50ZXJlZCB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvOyB9XG4gIC5sYXJnZS11bmNlbnRlcmVkLFxuICAubGFyZ2UtcHVzaC0wLFxuICAubGFyZ2UtcHVsbC0wIHtcbiAgICBwb3NpdGlvbjogc3RhdGljO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICBmbG9hdDogbGVmdDsgfSB9XG5cbmRpdixcbmRsLFxuZHQsXG5kZCxcbnVsLFxub2wsXG5saSxcbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNixcbnByZSxcbmZvcm0sXG5wLFxuYmxvY2txdW90ZSxcbnRoLFxudGQge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7IH1cblxucCB7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgbGluZS1oZWlnaHQ6IDEuNjtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsgfVxuXG5lbSxcbmkge1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG4gIGxpbmUtaGVpZ2h0OiBpbmhlcml0OyB9XG5cbnN0cm9uZyxcbmIge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH1cblxuc21hbGwge1xuICBmb250LXNpemU6IDgwJTtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH1cblxuaDEsXG5oMixcbmgzLFxuaDQsXG5oNSxcbmg2IHtcbiAgZm9udC1mYW1pbHk6IG1lcnJpd2VhdGhlciwgc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNDsgfVxuICBoMSBzbWFsbCxcbiAgaDIgc21hbGwsXG4gIGgzIHNtYWxsLFxuICBoNCBzbWFsbCxcbiAgaDUgc21hbGwsXG4gIGg2IHNtYWxsIHtcbiAgICBjb2xvcjogI2NhY2FjYTtcbiAgICBsaW5lLWhlaWdodDogMDsgfVxuXG5oMSB7XG4gIGZvbnQtc2l6ZTogMS41cmVtOyB9XG5cbmgyIHtcbiAgZm9udC1zaXplOiAxLjI1cmVtOyB9XG5cbmgzIHtcbiAgZm9udC1zaXplOiAxLjE4NzVyZW07IH1cblxuaDQge1xuICBmb250LXNpemU6IDEuMTI1cmVtOyB9XG5cbmg1IHtcbiAgZm9udC1zaXplOiAxLjA2MjVyZW07IH1cblxuaDYge1xuICBmb250LXNpemU6IDFyZW07IH1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNDBlbSkge1xuICBoMSB7XG4gICAgZm9udC1zaXplOiAzcmVtOyB9XG4gIGgyIHtcbiAgICBmb250LXNpemU6IDIuNXJlbTsgfVxuICBoMyB7XG4gICAgZm9udC1zaXplOiAxLjkzNzVyZW07IH1cbiAgaDQge1xuICAgIGZvbnQtc2l6ZTogMS41NjI1cmVtOyB9XG4gIGg1IHtcbiAgICBmb250LXNpemU6IDEuMjVyZW07IH1cbiAgaDYge1xuICAgIGZvbnQtc2l6ZTogMXJlbTsgfSB9XG5cbmEge1xuICBjb2xvcjogIzIxOTllODtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgY3Vyc29yOiBwb2ludGVyOyB9XG4gIGE6aG92ZXIsIGE6Zm9jdXMge1xuICAgIGNvbG9yOiAjMTU4NWNmOyB9XG4gIGEgaW1nIHtcbiAgICBib3JkZXI6IDA7IH1cblxuaHIge1xuICBtYXgtd2lkdGg6IDc1cmVtO1xuICBoZWlnaHQ6IDA7XG4gIGJvcmRlci1yaWdodDogMDtcbiAgYm9yZGVyLXRvcDogMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjYWNhY2E7XG4gIGJvcmRlci1sZWZ0OiAwO1xuICBtYXJnaW46IDEuMjVyZW0gYXV0bztcbiAgY2xlYXI6IGJvdGg7IH1cblxudWwsXG5vbCxcbmRsIHtcbiAgbGluZS1oZWlnaHQ6IDEuNjtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTsgfVxuXG5saSB7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDsgfVxuXG51bCB7XG4gIGxpc3Qtc3R5bGUtdHlwZTogZGlzYztcbiAgbWFyZ2luLWxlZnQ6IDEuMjVyZW07IH1cblxub2wge1xuICBtYXJnaW4tbGVmdDogMS4yNXJlbTsgfVxuXG51bCB1bCwgb2wgdWwsIHVsIG9sLCBvbCBvbCB7XG4gIG1hcmdpbi1sZWZ0OiAxLjI1cmVtO1xuICBtYXJnaW4tYm90dG9tOiAwOyB9XG5cbmRsIHtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTsgfVxuICBkbCBkdCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMC4zcmVtO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9XG5cbmJsb2NrcXVvdGUge1xuICBtYXJnaW46IDAgMCAxcmVtO1xuICBwYWRkaW5nOiAwLjU2MjVyZW0gMS4yNXJlbSAwIDEuMTg3NXJlbTtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2FjYWNhOyB9XG4gIGJsb2NrcXVvdGUsIGJsb2NrcXVvdGUgcCB7XG4gICAgbGluZS1oZWlnaHQ6IDEuNjtcbiAgICBjb2xvcjogIzhhOGE4YTsgfVxuXG5jaXRlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICBjb2xvcjogIzhhOGE4YTsgfVxuICBjaXRlOmJlZm9yZSB7XG4gICAgY29udGVudDogJ1xcMjAxNCBcXDAwMjAnOyB9XG5cbmFiYnIge1xuICBjb2xvcjogIzBhMGEwYTtcbiAgY3Vyc29yOiBoZWxwO1xuICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICMwYTBhMGE7IH1cblxuY29kZSB7XG4gIGZvbnQtZmFtaWx5OiBDb25zb2xhcywgXCJMaWJlcmF0aW9uIE1vbm9cIiwgQ291cmllciwgbW9ub3NwYWNlO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBjb2xvcjogIzBhMGEwYTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZTZlNjtcbiAgYm9yZGVyOiAxcHggc29saWQgI2NhY2FjYTtcbiAgcGFkZGluZzogMC4xMjVyZW0gMC4zMTI1cmVtIDAuMDYyNXJlbTsgfVxuXG5rYmQge1xuICBwYWRkaW5nOiAwLjEyNXJlbSAwLjI1cmVtIDA7XG4gIG1hcmdpbjogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZTZlNjtcbiAgY29sb3I6ICMwYTBhMGE7XG4gIGZvbnQtZmFtaWx5OiBDb25zb2xhcywgXCJMaWJlcmF0aW9uIE1vbm9cIiwgQ291cmllciwgbW9ub3NwYWNlOyB9XG5cbi5zdWJoZWFkZXIge1xuICBtYXJnaW4tdG9wOiAwLjJyZW07XG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgY29sb3I6ICM4YThhOGE7IH1cblxuLmxlYWQge1xuICBmb250LXNpemU6IDEyNSU7XG4gIGxpbmUtaGVpZ2h0OiAxLjY7IH1cblxuLnN0YXQge1xuICBmb250LXNpemU6IDIuNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDE7IH1cbiAgcCArIC5zdGF0IHtcbiAgICBtYXJnaW4tdG9wOiAtMXJlbTsgfVxuXG4ubm8tYnVsbGV0IHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7IH1cblxuLnRleHQtbGVmdCB7XG4gIHRleHQtYWxpZ246IGxlZnQ7IH1cblxuLnRleHQtcmlnaHQge1xuICB0ZXh0LWFsaWduOiByaWdodDsgfVxuXG4udGV4dC1jZW50ZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7IH1cblxuLnRleHQtanVzdGlmeSB7XG4gIHRleHQtYWxpZ246IGp1c3RpZnk7IH1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNDBlbSkge1xuICAubWVkaXVtLXRleHQtbGVmdCB7XG4gICAgdGV4dC1hbGlnbjogbGVmdDsgfVxuICAubWVkaXVtLXRleHQtcmlnaHQge1xuICAgIHRleHQtYWxpZ246IHJpZ2h0OyB9XG4gIC5tZWRpdW0tdGV4dC1jZW50ZXIge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjsgfVxuICAubWVkaXVtLXRleHQtanVzdGlmeSB7XG4gICAgdGV4dC1hbGlnbjoganVzdGlmeTsgfSB9XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDY0ZW0pIHtcbiAgLmxhcmdlLXRleHQtbGVmdCB7XG4gICAgdGV4dC1hbGlnbjogbGVmdDsgfVxuICAubGFyZ2UtdGV4dC1yaWdodCB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7IH1cbiAgLmxhcmdlLXRleHQtY2VudGVyIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IH1cbiAgLmxhcmdlLXRleHQtanVzdGlmeSB7XG4gICAgdGV4dC1hbGlnbjoganVzdGlmeTsgfSB9XG5cbi5zaG93LWZvci1wcmludCB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfVxuXG5AbWVkaWEgcHJpbnQge1xuICAqIHtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiBibGFjayAhaW1wb3J0YW50O1xuICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgICB0ZXh0LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OyB9XG4gIC5zaG93LWZvci1wcmludCB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfVxuICAuaGlkZS1mb3ItcHJpbnQge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfVxuICB0YWJsZS5zaG93LWZvci1wcmludCB7XG4gICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDsgfVxuICB0aGVhZC5zaG93LWZvci1wcmludCB7XG4gICAgZGlzcGxheTogdGFibGUtaGVhZGVyLWdyb3VwICFpbXBvcnRhbnQ7IH1cbiAgdGJvZHkuc2hvdy1mb3ItcHJpbnQge1xuICAgIGRpc3BsYXk6IHRhYmxlLXJvdy1ncm91cCAhaW1wb3J0YW50OyB9XG4gIHRyLnNob3ctZm9yLXByaW50IHtcbiAgICBkaXNwbGF5OiB0YWJsZS1yb3cgIWltcG9ydGFudDsgfVxuICB0ZC5zaG93LWZvci1wcmludCB7XG4gICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50OyB9XG4gIHRoLnNob3ctZm9yLXByaW50IHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7IH1cbiAgYSxcbiAgYTp2aXNpdGVkIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfVxuICBhW2hyZWZdOmFmdGVyIHtcbiAgICBjb250ZW50OiBcIiAoXCIgYXR0cihocmVmKSBcIilcIjsgfVxuICAuaXIgYTphZnRlcixcbiAgYVtocmVmXj0namF2YXNjcmlwdDonXTphZnRlcixcbiAgYVtocmVmXj0nIyddOmFmdGVyIHtcbiAgICBjb250ZW50OiAnJzsgfVxuICBhYmJyW3RpdGxlXTphZnRlciB7XG4gICAgY29udGVudDogXCIgKFwiIGF0dHIodGl0bGUpIFwiKVwiOyB9XG4gIHByZSxcbiAgYmxvY2txdW90ZSB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTtcbiAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH1cbiAgdGhlYWQge1xuICAgIGRpc3BsYXk6IHRhYmxlLWhlYWRlci1ncm91cDsgfVxuICB0cixcbiAgaW1nIHtcbiAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH1cbiAgaW1nIHtcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfVxuICBAcGFnZSB7XG4gICAgbWFyZ2luOiAwLjVjbTsgfVxuICBwLFxuICBoMixcbiAgaDMge1xuICAgIG9ycGhhbnM6IDM7XG4gICAgd2lkb3dzOiAzOyB9XG4gIGgyLFxuICBoMyB7XG4gICAgcGFnZS1icmVhay1hZnRlcjogYXZvaWQ7IH0gfVxuXG4uYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjI1cyBlYXNlLW91dCwgY29sb3IgMC4yNXMgZWFzZS1vdXQ7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBwYWRkaW5nOiAwLjg1ZW0gMWVtO1xuICBtYXJnaW46IDAgMCAxcmVtIDA7XG4gIGZvbnQtc2l6ZTogMC45cmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE5OWU4O1xuICBjb2xvcjogI2ZmZjsgfVxuICBbZGF0YS13aGF0aW5wdXQ9J21vdXNlJ10gLmJ1dHRvbiB7XG4gICAgb3V0bGluZTogMDsgfVxuICAuYnV0dG9uOmhvdmVyLCAuYnV0dG9uOmZvY3VzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTU4M2NjO1xuICAgIGNvbG9yOiAjZmZmOyB9XG4gIC5idXR0b24udGlueSB7XG4gICAgZm9udC1zaXplOiAwLjZyZW07IH1cbiAgLmJ1dHRvbi5zbWFsbCB7XG4gICAgZm9udC1zaXplOiAwLjc1cmVtOyB9XG4gIC5idXR0b24ubGFyZ2Uge1xuICAgIGZvbnQtc2l6ZTogMS4yNXJlbTsgfVxuICAuYnV0dG9uLmV4cGFuZGVkIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7IH1cbiAgLmJ1dHRvbi5wcmltYXJ5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE5OWU4O1xuICAgIGNvbG9yOiAjZmZmOyB9XG4gICAgLmJ1dHRvbi5wcmltYXJ5OmhvdmVyLCAuYnV0dG9uLnByaW1hcnk6Zm9jdXMge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzE0N2NjMDtcbiAgICAgIGNvbG9yOiAjZmZmOyB9XG4gIC5idXR0b24uc2Vjb25kYXJ5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzc3O1xuICAgIGNvbG9yOiAjZmZmOyB9XG4gICAgLmJ1dHRvbi5zZWNvbmRhcnk6aG92ZXIsIC5idXR0b24uc2Vjb25kYXJ5OmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM1ZjVmNWY7XG4gICAgICBjb2xvcjogI2ZmZjsgfVxuICAuYnV0dG9uLnN1Y2Nlc3Mge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMzYWRiNzY7XG4gICAgY29sb3I6ICNmZmY7IH1cbiAgICAuYnV0dG9uLnN1Y2Nlc3M6aG92ZXIsIC5idXR0b24uc3VjY2Vzczpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjJiYjViO1xuICAgICAgY29sb3I6ICNmZmY7IH1cbiAgLmJ1dHRvbi5hbGVydCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VjNTg0MDtcbiAgICBjb2xvcjogI2ZmZjsgfVxuICAgIC5idXR0b24uYWxlcnQ6aG92ZXIsIC5idXR0b24uYWxlcnQ6Zm9jdXMge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2RhMzExNjtcbiAgICAgIGNvbG9yOiAjZmZmOyB9XG4gIC5idXR0b24ud2FybmluZyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYWUwMDtcbiAgICBjb2xvcjogI2ZmZjsgfVxuICAgIC5idXR0b24ud2FybmluZzpob3ZlciwgLmJ1dHRvbi53YXJuaW5nOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjYzhiMDA7XG4gICAgICBjb2xvcjogI2ZmZjsgfVxuICAuYnV0dG9uLmhvbGxvdyB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzIxOTllODtcbiAgICBjb2xvcjogIzIxOTllODsgfVxuICAgIC5idXR0b24uaG9sbG93LCAuYnV0dG9uLmhvbGxvdzpob3ZlciwgLmJ1dHRvbi5ob2xsb3c6Zm9jdXMge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cbiAgICAuYnV0dG9uLmhvbGxvdzpob3ZlciwgLmJ1dHRvbi5ob2xsb3c6Zm9jdXMge1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMGM0ZDc4O1xuICAgICAgY29sb3I6ICMwYzRkNzg7IH1cbiAgICAuYnV0dG9uLmhvbGxvdy5wcmltYXJ5IHtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMyMTk5ZTg7XG4gICAgICBjb2xvcjogIzIxOTllODsgfVxuICAgICAgLmJ1dHRvbi5ob2xsb3cucHJpbWFyeTpob3ZlciwgLmJ1dHRvbi5ob2xsb3cucHJpbWFyeTpmb2N1cyB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogIzBjNGQ3ODtcbiAgICAgICAgY29sb3I6ICMwYzRkNzg7IH1cbiAgICAuYnV0dG9uLmhvbGxvdy5zZWNvbmRhcnkge1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzc3NztcbiAgICAgIGNvbG9yOiAjNzc3OyB9XG4gICAgICAuYnV0dG9uLmhvbGxvdy5zZWNvbmRhcnk6aG92ZXIsIC5idXR0b24uaG9sbG93LnNlY29uZGFyeTpmb2N1cyB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogIzNjM2MzYztcbiAgICAgICAgY29sb3I6ICMzYzNjM2M7IH1cbiAgICAuYnV0dG9uLmhvbGxvdy5zdWNjZXNzIHtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzYWRiNzY7XG4gICAgICBjb2xvcjogIzNhZGI3NjsgfVxuICAgICAgLmJ1dHRvbi5ob2xsb3cuc3VjY2Vzczpob3ZlciwgLmJ1dHRvbi5ob2xsb3cuc3VjY2Vzczpmb2N1cyB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogIzE1NzUzOTtcbiAgICAgICAgY29sb3I6ICMxNTc1Mzk7IH1cbiAgICAuYnV0dG9uLmhvbGxvdy5hbGVydCB7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZWM1ODQwO1xuICAgICAgY29sb3I6ICNlYzU4NDA7IH1cbiAgICAgIC5idXR0b24uaG9sbG93LmFsZXJ0OmhvdmVyLCAuYnV0dG9uLmhvbGxvdy5hbGVydDpmb2N1cyB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogIzg4MWYwZTtcbiAgICAgICAgY29sb3I6ICM4ODFmMGU7IH1cbiAgICAuYnV0dG9uLmhvbGxvdy53YXJuaW5nIHtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmFlMDA7XG4gICAgICBjb2xvcjogI2ZmYWUwMDsgfVxuICAgICAgLmJ1dHRvbi5ob2xsb3cud2FybmluZzpob3ZlciwgLmJ1dHRvbi5ob2xsb3cud2FybmluZzpmb2N1cyB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogIzgwNTcwMDtcbiAgICAgICAgY29sb3I6ICM4MDU3MDA7IH1cbiAgLmJ1dHRvbi5kaXNhYmxlZCwgLmJ1dHRvbltkaXNhYmxlZF0ge1xuICAgIG9wYWNpdHk6IDAuMjU7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxuICAuYnV0dG9uLmRyb3Bkb3duOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDA7XG4gICAgaGVpZ2h0OiAwO1xuICAgIGJvcmRlcjogaW5zZXQgMC40ZW07XG4gICAgYm9yZGVyLWNvbG9yOiAjZmVmZWZlIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci10b3Atc3R5bGU6IHNvbGlkO1xuICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogMC40ZW07XG4gICAgZmxvYXQ6IHJpZ2h0O1xuICAgIG1hcmdpbi1sZWZ0OiAxZW07XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9XG4gIC5idXR0b24uYXJyb3ctb25seTo6YWZ0ZXIge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIGZsb2F0OiBub25lO1xuICAgIHRvcDogMC4yZW07IH1cblxuW3R5cGU9J3RleHQnXSwgW3R5cGU9J3Bhc3N3b3JkJ10sIFt0eXBlPSdkYXRlJ10sIFt0eXBlPSdkYXRldGltZSddLCBbdHlwZT0nZGF0ZXRpbWUtbG9jYWwnXSwgW3R5cGU9J21vbnRoJ10sIFt0eXBlPSd3ZWVrJ10sIFt0eXBlPSdlbWFpbCddLCBbdHlwZT0nbnVtYmVyJ10sIFt0eXBlPSdzZWFyY2gnXSwgW3R5cGU9J3RlbCddLCBbdHlwZT0ndGltZSddLCBbdHlwZT0ndXJsJ10sIFt0eXBlPSdjb2xvciddLFxudGV4dGFyZWEge1xuICBkaXNwbGF5OiBibG9jaztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMi40Mzc1cmVtO1xuICBwYWRkaW5nOiAwLjVyZW07XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjYWNhY2E7XG4gIG1hcmdpbjogMCAwIDFyZW07XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXNpemU6IDFyZW07XG4gIGNvbG9yOiAjMGEwYTBhO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgxMCwgMTAsIDEwLCAwLjEpO1xuICBib3JkZXItcmFkaXVzOiAwO1xuICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuNXMsIGJvcmRlci1jb2xvciAwLjI1cyBlYXNlLWluLW91dDtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7IH1cbiAgW3R5cGU9J3RleHQnXTpmb2N1cywgW3R5cGU9J3Bhc3N3b3JkJ106Zm9jdXMsIFt0eXBlPSdkYXRlJ106Zm9jdXMsIFt0eXBlPSdkYXRldGltZSddOmZvY3VzLCBbdHlwZT0nZGF0ZXRpbWUtbG9jYWwnXTpmb2N1cywgW3R5cGU9J21vbnRoJ106Zm9jdXMsIFt0eXBlPSd3ZWVrJ106Zm9jdXMsIFt0eXBlPSdlbWFpbCddOmZvY3VzLCBbdHlwZT0nbnVtYmVyJ106Zm9jdXMsIFt0eXBlPSdzZWFyY2gnXTpmb2N1cywgW3R5cGU9J3RlbCddOmZvY3VzLCBbdHlwZT0ndGltZSddOmZvY3VzLCBbdHlwZT0ndXJsJ106Zm9jdXMsIFt0eXBlPSdjb2xvciddOmZvY3VzLFxuICB0ZXh0YXJlYTpmb2N1cyB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzhhOGE4YTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogMCAwIDVweCAjY2FjYWNhO1xuICAgIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMC41cywgYm9yZGVyLWNvbG9yIDAuMjVzIGVhc2UtaW4tb3V0OyB9XG5cbnRleHRhcmVhIHtcbiAgbWF4LXdpZHRoOiAxMDAlOyB9XG4gIHRleHRhcmVhW3Jvd3NdIHtcbiAgICBoZWlnaHQ6IGF1dG87IH1cblxuaW5wdXQ6ZGlzYWJsZWQsIGlucHV0W3JlYWRvbmx5XSxcbnRleHRhcmVhOmRpc2FibGVkLFxudGV4dGFyZWFbcmVhZG9ubHldIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZTZlNjtcbiAgY3Vyc29yOiBkZWZhdWx0OyB9XG5cblt0eXBlPSdzdWJtaXQnXSxcblt0eXBlPSdidXR0b24nXSB7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgLW1vei1hcHBlYXJhbmNlOiBub25lOyB9XG5cbmlucHV0W3R5cGU9J3NlYXJjaCddIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgfVxuXG5bdHlwZT0nZmlsZSddLFxuW3R5cGU9J2NoZWNrYm94J10sXG5bdHlwZT0ncmFkaW8nXSB7XG4gIG1hcmdpbjogMCAwIDFyZW07IH1cblxuW3R5cGU9J2NoZWNrYm94J10gKyBsYWJlbCxcblt0eXBlPSdyYWRpbyddICsgbGFiZWwge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiAwLjVyZW07XG4gIG1hcmdpbi1yaWdodDogMXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOyB9XG5cbmxhYmVsID4gW3R5cGU9J2NoZWNrYm94J10sXG5sYWJlbCA+IFt0eXBlPSdsYWJlbCddIHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07IH1cblxuW3R5cGU9J2ZpbGUnXSB7XG4gIHdpZHRoOiAxMDAlOyB9XG5cbmxhYmVsIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDEuODtcbiAgY29sb3I6ICMwYTBhMGE7IH1cbiAgbGFiZWwubWlkZGxlIHtcbiAgICBtYXJnaW46IDAgMCAxcmVtO1xuICAgIHBhZGRpbmc6IDAuNTYyNXJlbSAwOyB9XG5cbi5oZWxwLXRleHQge1xuICBtYXJnaW4tdG9wOiAtMC41cmVtO1xuICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xuICBjb2xvcjogIzMzMzsgfVxuXG4uaW5wdXQtZ3JvdXAge1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgd2lkdGg6IDEwMCU7XG4gIG1hcmdpbi1ib3R0b206IDFyZW07IH1cbiAgLmlucHV0LWdyb3VwID4gOmZpcnN0LWNoaWxkIHtcbiAgICBib3JkZXItcmFkaXVzOiAwIDAgMCAwOyB9XG4gIC5pbnB1dC1ncm91cCA+IDpsYXN0LWNoaWxkID4gKiB7XG4gICAgYm9yZGVyLXJhZGl1czogMCAwIDAgMDsgfVxuXG4uaW5wdXQtZ3JvdXAtbGFiZWwsIC5pbnB1dC1ncm91cC1maWVsZCwgLmlucHV0LWdyb3VwLWJ1dHRvbiB7XG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gIG1hcmdpbjogMDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgfVxuXG4uaW5wdXQtZ3JvdXAtbGFiZWwge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHdpZHRoOiAxJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nOiAwIDFyZW07XG4gIGJhY2tncm91bmQ6ICNlNmU2ZTY7XG4gIGNvbG9yOiAjMGEwYTBhO1xuICBib3JkZXI6IDFweCBzb2xpZCAjY2FjYWNhO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XG4gIC5pbnB1dC1ncm91cC1sYWJlbDpmaXJzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXJpZ2h0OiAwOyB9XG4gIC5pbnB1dC1ncm91cC1sYWJlbDpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItbGVmdDogMDsgfVxuXG4uaW5wdXQtZ3JvdXAtZmllbGQge1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBoZWlnaHQ6IDIuNXJlbTsgfVxuXG4uaW5wdXQtZ3JvdXAtYnV0dG9uIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nLXRvcDogMDtcbiAgcGFkZGluZy1ib3R0b206IDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2lkdGg6IDElOyB9XG4gIC5pbnB1dC1ncm91cC1idXR0b24gYSxcbiAgLmlucHV0LWdyb3VwLWJ1dHRvbiBpbnB1dCxcbiAgLmlucHV0LWdyb3VwLWJ1dHRvbiBidXR0b24ge1xuICAgIG1hcmdpbjogMDsgfVxuXG5maWVsZHNldCB7XG4gIGJvcmRlcjogMDtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luOiAwOyB9XG5cbmxlZ2VuZCB7XG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbiAgbWF4LXdpZHRoOiAxMDAlOyB9XG5cbi5maWVsZHNldCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjYWNhY2E7XG4gIHBhZGRpbmc6IDEuMjVyZW07XG4gIG1hcmdpbjogMS4xMjVyZW0gMDsgfVxuICAuZmllbGRzZXQgbGVnZW5kIHtcbiAgICBiYWNrZ3JvdW5kOiAjZmVmZWZlO1xuICAgIHBhZGRpbmc6IDAgMC4xODc1cmVtO1xuICAgIG1hcmdpbjogMDtcbiAgICBtYXJnaW4tbGVmdDogLTAuMTg3NXJlbTsgfVxuXG5zZWxlY3Qge1xuICBoZWlnaHQ6IDIuNDM3NXJlbTtcbiAgcGFkZGluZzogMC41cmVtO1xuICBib3JkZXI6IDFweCBzb2xpZCAjY2FjYWNhO1xuICBtYXJnaW46IDAgMCAxcmVtO1xuICBmb250LXNpemU6IDFyZW07XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICBjb2xvcjogIzBhMGEwYTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmVyc2lvbj1cIjEuMVwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMzIgMjRcIj48cG9seWdvbiBwb2ludHM9XCIwLDAgMzIsMCAxNiwyNFwiIHN0eWxlPVwiZmlsbDogcmdiJTI4NTEsIDUxLCA1MSUyOVwiPjwvcG9seWdvbj48L3N2Zz4nKTtcbiAgYmFja2dyb3VuZC1zaXplOiA5cHggNnB4O1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCBjZW50ZXI7XG4gIGJhY2tncm91bmQtb3JpZ2luOiBjb250ZW50LWJveDtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAwXFwwKSB7XG4gICAgc2VsZWN0IHtcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBWUNBWUFBQUNiVS84MEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBSXBKUkVGVWVOckVrY2tOZ0RBTUJCZlJrRXQwT2JSQkJkc0dYVURnbVFmSzRYaEgybThjelFBQXkyN1IzdHN3NFFmZTJ4OHVPTzZvWUxiNkdsT29yM0dGK3N3VVJBT21VSitSd3RFSnM5V3ZUR0VZeEJYcUkxTVFBWmhDZlVRS1J6RE1WaitUd3JBSVY2anZTVUVrWUFyMUxTa2N5VEJiL1YrS1lmWDd4QWV1c3Ezc0xEdEdIM2tFR0FDUFdJZmxOWmZoUlFBQUFBQkpSVTVFcmtKZ2dnPT1cIik7IH0gfVxuICBzZWxlY3Q6ZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlNmU2ZTY7XG4gICAgY3Vyc29yOiBkZWZhdWx0OyB9XG4gIHNlbGVjdDo6LW1zLWV4cGFuZCB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICBzZWxlY3RbbXVsdGlwbGVdIHtcbiAgICBoZWlnaHQ6IGF1dG87IH1cblxuLmlzLWludmFsaWQtaW5wdXQ6bm90KDpmb2N1cykge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIzNiwgODgsIDY0LCAwLjEpO1xuICBib3JkZXItY29sb3I6ICNlYzU4NDA7IH1cblxuLmlzLWludmFsaWQtbGFiZWwge1xuICBjb2xvcjogI2VjNTg0MDsgfVxuXG4uZm9ybS1lcnJvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIG1hcmdpbi10b3A6IC0wLjVyZW07XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZWM1ODQwOyB9XG4gIC5mb3JtLWVycm9yLmlzLXZpc2libGUge1xuICAgIGRpc3BsYXk6IGJsb2NrOyB9XG5cbi5oaWRlIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9XG5cbi5pbnZpc2libGUge1xuICB2aXNpYmlsaXR5OiBoaWRkZW47IH1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMGVtKSBhbmQgKG1heC13aWR0aDogMzkuOTM3NWVtKSB7XG4gIC5oaWRlLWZvci1zbWFsbC1vbmx5IHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAwZW0pLCBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQwZW0pIHtcbiAgLnNob3ctZm9yLXNtYWxsLW9ubHkge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSB9XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQwZW0pIHtcbiAgLmhpZGUtZm9yLW1lZGl1bSB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzkuOTM3NWVtKSB7XG4gIC5zaG93LWZvci1tZWRpdW0ge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSB9XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQwZW0pIGFuZCAobWF4LXdpZHRoOiA2My45Mzc1ZW0pIHtcbiAgLmhpZGUtZm9yLW1lZGl1bS1vbmx5IHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzOS45Mzc1ZW0pLCBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDY0ZW0pIHtcbiAgLnNob3ctZm9yLW1lZGl1bS1vbmx5IHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA2NGVtKSB7XG4gIC5oaWRlLWZvci1sYXJnZSB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjMuOTM3NWVtKSB7XG4gIC5zaG93LWZvci1sYXJnZSB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNjRlbSkgYW5kIChtYXgtd2lkdGg6IDc0LjkzNzVlbSkge1xuICAuaGlkZS1mb3ItbGFyZ2Utb25seSB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjMuOTM3NWVtKSwgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NWVtKSB7XG4gIC5zaG93LWZvci1sYXJnZS1vbmx5IHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfVxuXG4uc2hvdy1mb3Itc3IsXG4uc2hvdy1vbi1mb2N1cyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1xuICB3aWR0aDogMXB4O1xuICBoZWlnaHQ6IDFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcDogcmVjdCgwLCAwLCAwLCAwKTsgfVxuXG4uc2hvdy1vbi1mb2N1czphY3RpdmUsIC5zaG93LW9uLWZvY3VzOmZvY3VzIHtcbiAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xuICBoZWlnaHQ6IGF1dG87XG4gIHdpZHRoOiBhdXRvO1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgY2xpcDogYXV0bzsgfVxuXG4uc2hvdy1mb3ItbGFuZHNjYXBlLFxuLmhpZGUtZm9yLXBvcnRyYWl0IHtcbiAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkge1xuICAgIC5zaG93LWZvci1sYW5kc2NhcGUsXG4gICAgLmhpZGUtZm9yLXBvcnRyYWl0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IH0gfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSB7XG4gICAgLnNob3ctZm9yLWxhbmRzY2FwZSxcbiAgICAuaGlkZS1mb3ItcG9ydHJhaXQge1xuICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH1cblxuLmhpZGUtZm9yLWxhbmRzY2FwZSxcbi5zaG93LWZvci1wb3J0cmFpdCB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkge1xuICAgIC5oaWRlLWZvci1sYW5kc2NhcGUsXG4gICAgLnNob3ctZm9yLXBvcnRyYWl0IHtcbiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSB9XG4gIEBtZWRpYSBzY3JlZW4gYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpIHtcbiAgICAuaGlkZS1mb3ItbGFuZHNjYXBlLFxuICAgIC5zaG93LWZvci1wb3J0cmFpdCB7XG4gICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9IH1cblxuLmZsb2F0LWxlZnQge1xuICBmbG9hdDogbGVmdCAhaW1wb3J0YW50OyB9XG5cbi5mbG9hdC1yaWdodCB7XG4gIGZsb2F0OiByaWdodCAhaW1wb3J0YW50OyB9XG5cbi5mbG9hdC1jZW50ZXIge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIG1hcmdpbi1yaWdodDogYXV0bzsgfVxuXG4uY2xlYXJmaXg6OmJlZm9yZSwgLmNsZWFyZml4OjphZnRlciB7XG4gIGNvbnRlbnQ6ICcgJztcbiAgZGlzcGxheTogdGFibGU7IH1cblxuLmNsZWFyZml4OjphZnRlciB7XG4gIGNsZWFyOiBib3RoOyB9XG5cbi5hY2NvcmRpb24ge1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIGJhY2tncm91bmQ6ICNmZWZlZmU7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNlNmU2ZTY7XG4gIGJvcmRlci1ib3R0b206IDA7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIG1hcmdpbi1sZWZ0OiAwOyB9XG5cbi5hY2NvcmRpb24tdGl0bGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMS4yNXJlbSAxcmVtO1xuICBsaW5lLWhlaWdodDogMTtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xuICBjb2xvcjogIzIxOTllODtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U2ZTZlNjsgfVxuICAuYWNjb3JkaW9uLXRpdGxlOmhvdmVyLCAuYWNjb3JkaW9uLXRpdGxlOmZvY3VzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZlNmU2OyB9XG4gIC5hY2NvcmRpb24tdGl0bGU6OmJlZm9yZSB7XG4gICAgY29udGVudDogJysnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogMXJlbTtcbiAgICB0b3A6IDUwJTtcbiAgICBtYXJnaW4tdG9wOiAtMC41cmVtOyB9XG4gIC5pcy1hY3RpdmUgPiAuYWNjb3JkaW9uLXRpdGxlOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICfigJMnOyB9XG5cbi5hY2NvcmRpb24tY29udGVudCB7XG4gIHBhZGRpbmc6IDFyZW07XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTZlNmU2O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlOyB9XG5cbi5pcy1hY2NvcmRpb24tc3VibWVudS1wYXJlbnQgPiBhIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyB9XG4gIC5pcy1hY2NvcmRpb24tc3VibWVudS1wYXJlbnQgPiBhOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDA7XG4gICAgaGVpZ2h0OiAwO1xuICAgIGJvcmRlcjogaW5zZXQgNnB4O1xuICAgIGJvcmRlci1jb2xvcjogIzIxOTllOCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDtcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDUwJTtcbiAgICBtYXJnaW4tdG9wOiAtNHB4O1xuICAgIHJpZ2h0OiAxcmVtOyB9XG5cbi5pcy1hY2NvcmRpb24tc3VibWVudS1wYXJlbnRbYXJpYS1leHBhbmRlZD0ndHJ1ZSddID4gYTo6YWZ0ZXIge1xuICB0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgNTAlO1xuICB0cmFuc2Zvcm06IHNjYWxlWSgtMSk7IH1cblxuLmJhZGdlIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nOiAwLjNlbTtcbiAgbWluLXdpZHRoOiAyLjFlbTtcbiAgZm9udC1zaXplOiAwLjZyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBiYWNrZ3JvdW5kOiAjMjE5OWU4O1xuICBjb2xvcjogI2ZlZmVmZTsgfVxuICAuYmFkZ2Uuc2Vjb25kYXJ5IHtcbiAgICBiYWNrZ3JvdW5kOiAjNzc3O1xuICAgIGNvbG9yOiAjZmVmZWZlOyB9XG4gIC5iYWRnZS5zdWNjZXNzIHtcbiAgICBiYWNrZ3JvdW5kOiAjM2FkYjc2O1xuICAgIGNvbG9yOiAjZmVmZWZlOyB9XG4gIC5iYWRnZS5hbGVydCB7XG4gICAgYmFja2dyb3VuZDogI2VjNTg0MDtcbiAgICBjb2xvcjogI2ZlZmVmZTsgfVxuICAuYmFkZ2Uud2FybmluZyB7XG4gICAgYmFja2dyb3VuZDogI2ZmYWUwMDtcbiAgICBjb2xvcjogI2ZlZmVmZTsgfVxuXG4uYnJlYWRjcnVtYnMge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBtYXJnaW46IDAgMCAxcmVtIDA7IH1cbiAgLmJyZWFkY3J1bWJzOjpiZWZvcmUsIC5icmVhZGNydW1iczo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcgJztcbiAgICBkaXNwbGF5OiB0YWJsZTsgfVxuICAuYnJlYWRjcnVtYnM6OmFmdGVyIHtcbiAgICBjbGVhcjogYm90aDsgfVxuICAuYnJlYWRjcnVtYnMgbGkge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIGNvbG9yOiAjMGEwYTBhO1xuICAgIGZvbnQtc2l6ZTogMC42ODc1cmVtO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9XG4gICAgLmJyZWFkY3J1bWJzIGxpOm5vdCg6bGFzdC1jaGlsZCk6OmFmdGVyIHtcbiAgICAgIGNvbG9yOiAjY2FjYWNhO1xuICAgICAgY29udGVudDogXCIvXCI7XG4gICAgICBtYXJnaW46IDAgMC43NXJlbTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHRvcDogMXB4O1xuICAgICAgb3BhY2l0eTogMTsgfVxuICAuYnJlYWRjcnVtYnMgYSB7XG4gICAgY29sb3I6ICMyMTk5ZTg7IH1cbiAgICAuYnJlYWRjcnVtYnMgYTpob3ZlciB7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfVxuICAuYnJlYWRjcnVtYnMgLmRpc2FibGVkIHtcbiAgICBjb2xvcjogI2NhY2FjYTsgfVxuXG4uYnV0dG9uLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgZm9udC1zaXplOiAwLjlyZW07IH1cbiAgLmJ1dHRvbi1ncm91cDo6YmVmb3JlLCAuYnV0dG9uLWdyb3VwOjphZnRlciB7XG4gICAgY29udGVudDogJyAnO1xuICAgIGRpc3BsYXk6IHRhYmxlOyB9XG4gIC5idXR0b24tZ3JvdXA6OmFmdGVyIHtcbiAgICBjbGVhcjogYm90aDsgfVxuICAuYnV0dG9uLWdyb3VwIC5idXR0b24ge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbjogMDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7IH1cbiAgICAuYnV0dG9uLWdyb3VwIC5idXR0b246bm90KDpsYXN0LWNoaWxkKSB7XG4gICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZmVmZWZlOyB9XG4gIC5idXR0b24tZ3JvdXAudGlueSB7XG4gICAgZm9udC1zaXplOiAwLjZyZW07IH1cbiAgLmJ1dHRvbi1ncm91cC5zbWFsbCB7XG4gICAgZm9udC1zaXplOiAwLjc1cmVtOyB9XG4gIC5idXR0b24tZ3JvdXAubGFyZ2Uge1xuICAgIGZvbnQtc2l6ZTogMS4yNXJlbTsgfVxuICAuYnV0dG9uLWdyb3VwLmV4cGFuZGVkIHtcbiAgICBkaXNwbGF5OiB0YWJsZTtcbiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkO1xuICAgIHdpZHRoOiAxMDAlOyB9XG4gICAgLmJ1dHRvbi1ncm91cC5leHBhbmRlZDo6YmVmb3JlLCAuYnV0dG9uLWdyb3VwLmV4cGFuZGVkOjphZnRlciB7XG4gICAgICBkaXNwbGF5OiBub25lOyB9XG4gICAgLmJ1dHRvbi1ncm91cC5leHBhbmRlZCAuYnV0dG9uIHtcbiAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgICBmbG9hdDogbm9uZTsgfVxuICAuYnV0dG9uLWdyb3VwLnByaW1hcnkgLmJ1dHRvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzIxOTllODtcbiAgICBjb2xvcjogI2ZlZmVmZTsgfVxuICAgIC5idXR0b24tZ3JvdXAucHJpbWFyeSAuYnV0dG9uOmhvdmVyLCAuYnV0dG9uLWdyb3VwLnByaW1hcnkgLmJ1dHRvbjpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTQ3Y2MwO1xuICAgICAgY29sb3I6ICNmZWZlZmU7IH1cbiAgLmJ1dHRvbi1ncm91cC5zZWNvbmRhcnkgLmJ1dHRvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzc3NztcbiAgICBjb2xvcjogI2ZlZmVmZTsgfVxuICAgIC5idXR0b24tZ3JvdXAuc2Vjb25kYXJ5IC5idXR0b246aG92ZXIsIC5idXR0b24tZ3JvdXAuc2Vjb25kYXJ5IC5idXR0b246Zm9jdXMge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzVmNWY1ZjtcbiAgICAgIGNvbG9yOiAjZmVmZWZlOyB9XG4gIC5idXR0b24tZ3JvdXAuc3VjY2VzcyAuYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2FkYjc2O1xuICAgIGNvbG9yOiAjZmVmZWZlOyB9XG4gICAgLmJ1dHRvbi1ncm91cC5zdWNjZXNzIC5idXR0b246aG92ZXIsIC5idXR0b24tZ3JvdXAuc3VjY2VzcyAuYnV0dG9uOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyMmJiNWI7XG4gICAgICBjb2xvcjogI2ZlZmVmZTsgfVxuICAuYnV0dG9uLWdyb3VwLmFsZXJ0IC5idXR0b24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlYzU4NDA7XG4gICAgY29sb3I6ICNmZWZlZmU7IH1cbiAgICAuYnV0dG9uLWdyb3VwLmFsZXJ0IC5idXR0b246aG92ZXIsIC5idXR0b24tZ3JvdXAuYWxlcnQgLmJ1dHRvbjpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGEzMTE2O1xuICAgICAgY29sb3I6ICNmZWZlZmU7IH1cbiAgLmJ1dHRvbi1ncm91cC53YXJuaW5nIC5idXR0b24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmFlMDA7XG4gICAgY29sb3I6ICNmZWZlZmU7IH1cbiAgICAuYnV0dG9uLWdyb3VwLndhcm5pbmcgLmJ1dHRvbjpob3ZlciwgLmJ1dHRvbi1ncm91cC53YXJuaW5nIC5idXR0b246Zm9jdXMge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2NjOGIwMDtcbiAgICAgIGNvbG9yOiAjZmVmZWZlOyB9XG4gIC5idXR0b24tZ3JvdXAuc3RhY2tlZCAuYnV0dG9uLCAuYnV0dG9uLWdyb3VwLnN0YWNrZWQtZm9yLXNtYWxsIC5idXR0b24ge1xuICAgIHdpZHRoOiAxMDAlOyB9XG4gICAgLmJ1dHRvbi1ncm91cC5zdGFja2VkIC5idXR0b246bm90KDpsYXN0LWNoaWxkKSwgLmJ1dHRvbi1ncm91cC5zdGFja2VkLWZvci1zbWFsbCAuYnV0dG9uOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7IH1cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNDBlbSkge1xuICAgIC5idXR0b24tZ3JvdXAuc3RhY2tlZC1mb3Itc21hbGwgLmJ1dHRvbiB7XG4gICAgICB3aWR0aDogYXV0bzsgfVxuICAgICAgLmJ1dHRvbi1ncm91cC5zdGFja2VkLWZvci1zbWFsbCAuYnV0dG9uOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZmVmZWZlOyB9IH1cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMGVtKSBhbmQgKG1heC13aWR0aDogMzkuOTM3NWVtKSB7XG4gICAgLmJ1dHRvbi1ncm91cC5zdGFja2VkLWZvci1zbWFsbC5leHBhbmRlZCB7XG4gICAgICBkaXNwbGF5OiBibG9jazsgfVxuICAgICAgLmJ1dHRvbi1ncm91cC5zdGFja2VkLWZvci1zbWFsbC5leHBhbmRlZCAuYnV0dG9uIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGJvcmRlci1yaWdodDogMDsgfSB9XG5cbi5jYWxsb3V0IHtcbiAgbWFyZ2luOiAwIDAgMXJlbSAwO1xuICBwYWRkaW5nOiAxcmVtO1xuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEwLCAxMCwgMTAsIDAuMjUpO1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGNvbG9yOiAjMGEwYTBhO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfVxuICAuY2FsbG91dCA+IDpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXRvcDogMDsgfVxuICAuY2FsbG91dCA+IDpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwOyB9XG4gIC5jYWxsb3V0LnByaW1hcnkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWYwZmM7IH1cbiAgLmNhbGxvdXQuc2Vjb25kYXJ5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWJlYmViOyB9XG4gIC5jYWxsb3V0LnN1Y2Nlc3Mge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlMWZhZWE7IH1cbiAgLmNhbGxvdXQuYWxlcnQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmY2U2ZTI7IH1cbiAgLmNhbGxvdXQud2FybmluZyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjNkOTsgfVxuICAuY2FsbG91dC5zbWFsbCB7XG4gICAgcGFkZGluZy10b3A6IDAuNXJlbTtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjVyZW07XG4gICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDAuNXJlbTsgfVxuICAuY2FsbG91dC5sYXJnZSB7XG4gICAgcGFkZGluZy10b3A6IDNyZW07XG4gICAgcGFkZGluZy1yaWdodDogM3JlbTtcbiAgICBwYWRkaW5nLWJvdHRvbTogM3JlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDNyZW07IH1cblxuLmNsb3NlLWJ1dHRvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgY29sb3I6ICM4YThhOGE7XG4gIHJpZ2h0OiAxcmVtO1xuICB0b3A6IDAuNXJlbTtcbiAgZm9udC1zaXplOiAyZW07XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjdXJzb3I6IHBvaW50ZXI7IH1cbiAgW2RhdGEtd2hhdGlucHV0PSdtb3VzZSddIC5jbG9zZS1idXR0b24ge1xuICAgIG91dGxpbmU6IDA7IH1cbiAgLmNsb3NlLWJ1dHRvbjpob3ZlciwgLmNsb3NlLWJ1dHRvbjpmb2N1cyB7XG4gICAgY29sb3I6ICMwYTBhMGE7IH1cblxuLmlzLWRyaWxsZG93biB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjsgfVxuXG4uaXMtZHJpbGxkb3duLXN1Ym1lbnUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMTAwJTtcbiAgei1pbmRleDogLTE7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQ6ICNmZWZlZmU7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBsaW5lYXI7IH1cbiAgLmlzLWRyaWxsZG93bi1zdWJtZW51LmlzLWFjdGl2ZSB7XG4gICAgei1pbmRleDogMTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOyB9XG4gIC5pcy1kcmlsbGRvd24tc3VibWVudS5pcy1jbG9zaW5nIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7IH1cblxuLmlzLWRyaWxsZG93bi1zdWJtZW51LXBhcmVudCA+IGEge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7IH1cbiAgLmlzLWRyaWxsZG93bi1zdWJtZW51LXBhcmVudCA+IGE6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyOiBpbnNldCA2cHg7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjMjE5OWU4O1xuICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDtcbiAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIG1hcmdpbi10b3A6IC02cHg7XG4gICAgcmlnaHQ6IDFyZW07IH1cblxuLmpzLWRyaWxsZG93bi1iYWNrID4gYTo6YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMDtcbiAgaGVpZ2h0OiAwO1xuICBib3JkZXI6IGluc2V0IDZweDtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCAjMjE5OWU4IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICBib3JkZXItcmlnaHQtc3R5bGU6IHNvbGlkO1xuICBib3JkZXItbGVmdC13aWR0aDogMDtcbiAgYm9yZGVyLWxlZnQtd2lkdGg6IDA7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgbWFyZ2luLXJpZ2h0OiAwLjc1cmVtOyB9XG5cbi5kcm9wZG93bi1wYW5lIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2NhY2FjYTtcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgcGFkZGluZzogMXJlbTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIHdpZHRoOiAzMDBweDtcbiAgei1pbmRleDogMTA7IH1cbiAgLmRyb3Bkb3duLXBhbmUuaXMtb3BlbiB7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTsgfVxuXG4uZHJvcGRvd24tcGFuZS50aW55IHtcbiAgd2lkdGg6IDEwMHB4OyB9XG5cbi5kcm9wZG93bi1wYW5lLnNtYWxsIHtcbiAgd2lkdGg6IDIwMHB4OyB9XG5cbi5kcm9wZG93bi1wYW5lLmxhcmdlIHtcbiAgd2lkdGg6IDQwMHB4OyB9XG5cbltkYXRhLXdoYXRpbnB1dD0nbW91c2UnXSAuZHJvcGRvd24ubWVudSBhIHtcbiAgb3V0bGluZTogMDsgfVxuXG4ubm8tanMgLmRyb3Bkb3duLm1lbnUgdWwge1xuICBkaXNwbGF5OiBub25lOyB9XG5cbi5kcm9wZG93bi5tZW51Om5vdCgudmVydGljYWwpIC5pcy1kcm9wZG93bi1zdWJtZW51LmZpcnN0LXN1YiB7XG4gIHRvcDogMTAwJTtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IGF1dG87IH1cblxuLmRyb3Bkb3duLm1lbnUuYWxpZ24tcmlnaHQgLmlzLWRyb3Bkb3duLXN1Ym1lbnUuZmlyc3Qtc3ViIHtcbiAgdG9wOiAxMDAlO1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogMDsgfVxuXG4uaXMtZHJvcGRvd24tbWVudS52ZXJ0aWNhbCB7XG4gIHdpZHRoOiAxMDBweDsgfVxuICAuaXMtZHJvcGRvd24tbWVudS52ZXJ0aWNhbC5hbGlnbi1yaWdodCB7XG4gICAgZmxvYXQ6IHJpZ2h0OyB9XG4gIC5pcy1kcm9wZG93bi1tZW51LnZlcnRpY2FsID4gbGkgLmlzLWRyb3Bkb3duLXN1Ym1lbnUge1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAxMDAlOyB9XG5cbi5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTsgfVxuICAuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQgYTo6YWZ0ZXIge1xuICAgIGZsb2F0OiByaWdodDtcbiAgICBtYXJnaW4tdG9wOiAzcHg7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7IH1cbiAgLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50LmlzLWRvd24tYXJyb3cgYSB7XG4gICAgcGFkZGluZy1yaWdodDogMS41cmVtO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfVxuICAuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQuaXMtZG93bi1hcnJvdyA+IGE6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyOiBpbnNldCA1cHg7XG4gICAgYm9yZGVyLWNvbG9yOiAjMjE5OWU4IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci10b3Atc3R5bGU6IHNvbGlkO1xuICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMC44MjVyZW07XG4gICAgcmlnaHQ6IDVweDsgfVxuICAuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQuaXMtbGVmdC1hcnJvdyA+IGE6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyOiBpbnNldCA1cHg7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCAjMjE5OWU4IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7XG4gICAgYm9yZGVyLWxlZnQtd2lkdGg6IDA7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4OyB9XG4gIC5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudC5pcy1yaWdodC1hcnJvdyA+IGE6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyOiBpbnNldCA1cHg7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjMjE5OWU4O1xuICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDtcbiAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7IH1cbiAgLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50LmlzLWxlZnQtYXJyb3cub3BlbnMtaW5uZXIgLmlzLWRyb3Bkb3duLXN1Ym1lbnUge1xuICAgIHJpZ2h0OiAwO1xuICAgIGxlZnQ6IGF1dG87IH1cbiAgLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50LmlzLXJpZ2h0LWFycm93Lm9wZW5zLWlubmVyIC5pcy1kcm9wZG93bi1zdWJtZW51IHtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiBhdXRvOyB9XG4gIC5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudC5vcGVucy1pbm5lciAuaXMtZHJvcGRvd24tc3VibWVudSB7XG4gICAgdG9wOiAxMDAlOyB9XG4gIC5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudC5vcGVucy1sZWZ0IC5pcy1kcm9wZG93bi1zdWJtZW51IHtcbiAgICBsZWZ0OiBhdXRvO1xuICAgIHJpZ2h0OiAxMDAlOyB9XG5cbi5pcy1kcm9wZG93bi1zdWJtZW51IHtcbiAgZGlzcGxheTogbm9uZTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDEwMCU7XG4gIG1pbi13aWR0aDogMjAwcHg7XG4gIHotaW5kZXg6IDE7XG4gIGJhY2tncm91bmQ6ICNmZWZlZmU7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjYWNhY2E7IH1cbiAgLmlzLWRyb3Bkb3duLXN1Ym1lbnUgLmlzLWRyb3Bkb3duLXN1Ym1lbnUge1xuICAgIG1hcmdpbi10b3A6IC0xcHg7IH1cbiAgLmlzLWRyb3Bkb3duLXN1Ym1lbnUgPiBsaSB7XG4gICAgd2lkdGg6IDEwMCU7IH1cbiAgLmlzLWRyb3Bkb3duLXN1Ym1lbnU6bm90KC5qcy1kcm9wZG93bi1ub2hvdmVyKSA+IC5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudDpob3ZlciA+IC5pcy1kcm9wZG93bi1zdWJtZW51LCAuaXMtZHJvcGRvd24tc3VibWVudS5qcy1kcm9wZG93bi1hY3RpdmUge1xuICAgIGRpc3BsYXk6IGJsb2NrOyB9XG5cbi5mbGV4LXZpZGVvIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBoZWlnaHQ6IDA7XG4gIHBhZGRpbmctYm90dG9tOiA3NSU7XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG4gIG92ZXJmbG93OiBoaWRkZW47IH1cbiAgLmZsZXgtdmlkZW8gaWZyYW1lLFxuICAuZmxleC12aWRlbyBvYmplY3QsXG4gIC5mbGV4LXZpZGVvIGVtYmVkLFxuICAuZmxleC12aWRlbyB2aWRlbyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTsgfVxuICAuZmxleC12aWRlby53aWRlc2NyZWVuIHtcbiAgICBwYWRkaW5nLWJvdHRvbTogNTYuMjUlOyB9XG4gIC5mbGV4LXZpZGVvLnZpbWVvIHtcbiAgICBwYWRkaW5nLXRvcDogMDsgfVxuXG4ubGFiZWwge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDAuMzMzMzNyZW0gMC41cmVtO1xuICBmb250LXNpemU6IDAuOHJlbTtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgYmFja2dyb3VuZDogIzIxOTllODtcbiAgY29sb3I6ICNmZWZlZmU7IH1cbiAgLmxhYmVsLnNlY29uZGFyeSB7XG4gICAgYmFja2dyb3VuZDogIzc3NztcbiAgICBjb2xvcjogI2ZlZmVmZTsgfVxuICAubGFiZWwuc3VjY2VzcyB7XG4gICAgYmFja2dyb3VuZDogIzNhZGI3NjtcbiAgICBjb2xvcjogI2ZlZmVmZTsgfVxuICAubGFiZWwuYWxlcnQge1xuICAgIGJhY2tncm91bmQ6ICNlYzU4NDA7XG4gICAgY29sb3I6ICNmZWZlZmU7IH1cbiAgLmxhYmVsLndhcm5pbmcge1xuICAgIGJhY2tncm91bmQ6ICNmZmFlMDA7XG4gICAgY29sb3I6ICNmZWZlZmU7IH1cblxuLm1lZGlhLW9iamVjdCB7XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG4gIGRpc3BsYXk6IGJsb2NrOyB9XG4gIC5tZWRpYS1vYmplY3QgaW1nIHtcbiAgICBtYXgtd2lkdGg6IG5vbmU7IH1cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMGVtKSBhbmQgKG1heC13aWR0aDogMzkuOTM3NWVtKSB7XG4gICAgLm1lZGlhLW9iamVjdC5zdGFjay1mb3Itc21hbGwgLm1lZGlhLW9iamVjdC1zZWN0aW9uIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIHBhZGRpbmctYm90dG9tOiAxcmVtOyB9XG4gICAgICAubWVkaWEtb2JqZWN0LnN0YWNrLWZvci1zbWFsbCAubWVkaWEtb2JqZWN0LXNlY3Rpb24gaW1nIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7IH0gfVxuXG4ubWVkaWEtb2JqZWN0LXNlY3Rpb24ge1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9XG4gIC5tZWRpYS1vYmplY3Qtc2VjdGlvbjpmaXJzdC1jaGlsZCB7XG4gICAgcGFkZGluZy1yaWdodDogMXJlbTsgfVxuICAubWVkaWEtb2JqZWN0LXNlY3Rpb246bGFzdC1jaGlsZDpub3QoOm50aC1jaGlsZCgyKSkge1xuICAgIHBhZGRpbmctbGVmdDogMXJlbTsgfVxuICAubWVkaWEtb2JqZWN0LXNlY3Rpb24ubWlkZGxlIHtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB9XG4gIC5tZWRpYS1vYmplY3Qtc2VjdGlvbi5ib3R0b20ge1xuICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207IH1cblxuLm1lbnUge1xuICBtYXJnaW46IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgfVxuICAubWVudSA+IGxpIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH1cbiAgICBbZGF0YS13aGF0aW5wdXQ9J21vdXNlJ10gLm1lbnUgPiBsaSB7XG4gICAgICBvdXRsaW5lOiAwOyB9XG4gIC5tZW51ID4gbGkgPiBhIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwYWRkaW5nOiAwLjdyZW0gMXJlbTtcbiAgICBsaW5lLWhlaWdodDogMTsgfVxuICAubWVudSBpbnB1dCxcbiAgLm1lbnUgYSxcbiAgLm1lbnUgYnV0dG9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwOyB9XG4gIC5tZW51ID4gbGkgPiBhID4gaW1nLFxuICAubWVudSA+IGxpID4gYSA+IGkge1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH1cbiAgLm1lbnUgPiBsaSA+IGEgPiBzcGFuIHtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB9XG4gIC5tZW51ID4gbGkgPiBhID4gaW1nLFxuICAubWVudSA+IGxpID4gYSA+IGkge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tcmlnaHQ6IDAuMjVyZW07IH1cbiAgLm1lbnUgPiBsaSB7XG4gICAgZGlzcGxheTogdGFibGUtY2VsbDsgfVxuICAubWVudS52ZXJ0aWNhbCA+IGxpIHtcbiAgICBkaXNwbGF5OiBibG9jazsgfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0MGVtKSB7XG4gICAgLm1lbnUubWVkaXVtLWhvcml6b250YWwgPiBsaSB7XG4gICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOyB9XG4gICAgLm1lbnUubWVkaXVtLXZlcnRpY2FsID4gbGkge1xuICAgICAgZGlzcGxheTogYmxvY2s7IH0gfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA2NGVtKSB7XG4gICAgLm1lbnUubGFyZ2UtaG9yaXpvbnRhbCA+IGxpIHtcbiAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7IH1cbiAgICAubWVudS5sYXJnZS12ZXJ0aWNhbCA+IGxpIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrOyB9IH1cbiAgLm1lbnUuc2ltcGxlIGxpIHtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbWFyZ2luLXJpZ2h0OiAxcmVtOyB9XG4gIC5tZW51LnNpbXBsZSBhIHtcbiAgICBwYWRkaW5nOiAwOyB9XG4gIC5tZW51LmFsaWduLXJpZ2h0ID4gbGkge1xuICAgIGZsb2F0OiByaWdodDsgfVxuICAubWVudS5leHBhbmRlZCB7XG4gICAgZGlzcGxheTogdGFibGU7XG4gICAgdGFibGUtbGF5b3V0OiBmaXhlZDtcbiAgICB3aWR0aDogMTAwJTsgfVxuICAgIC5tZW51LmV4cGFuZGVkID4gbGk6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XG4gICAgICB3aWR0aDogMTAwJTsgfVxuICAubWVudS5pY29uLXRvcCA+IGxpID4gYSB7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyOyB9XG4gICAgLm1lbnUuaWNvbi10b3AgPiBsaSA+IGEgPiBpbWcsXG4gICAgLm1lbnUuaWNvbi10b3AgPiBsaSA+IGEgPiBpIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgbWFyZ2luOiAwIGF1dG8gMC4yNXJlbTsgfVxuICAubWVudS5uZXN0ZWQge1xuICAgIG1hcmdpbi1sZWZ0OiAxcmVtOyB9XG5cbi5tZW51LXRleHQge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBwYWRkaW5nLXRvcDogMDtcbiAgcGFkZGluZy1ib3R0b206IDA7XG4gIHBhZGRpbmc6IDAuN3JlbSAxcmVtOyB9XG5cbi5uby1qcyBbZGF0YS1yZXNwb25zaXZlLW1lbnVdIHVsIHtcbiAgZGlzcGxheTogbm9uZTsgfVxuXG5odG1sLFxuYm9keSB7XG4gIGhlaWdodDogMTAwJTsgfVxuXG4ub2ZmLWNhbnZhcy13cmFwcGVyIHtcbiAgd2lkdGg6IDEwMCU7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiBhdXRvOyB9XG5cbi5vZmYtY2FudmFzLXdyYXBwZXItaW5uZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC41cyBlYXNlOyB9XG4gIC5vZmYtY2FudmFzLXdyYXBwZXItaW5uZXI6OmJlZm9yZSwgLm9mZi1jYW52YXMtd3JhcHBlci1pbm5lcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcgJztcbiAgICBkaXNwbGF5OiB0YWJsZTsgfVxuICAub2ZmLWNhbnZhcy13cmFwcGVyLWlubmVyOjphZnRlciB7XG4gICAgY2xlYXI6IGJvdGg7IH1cblxuLm9mZi1jYW52YXMtY29udGVudCxcbi5vZmYtY2FudmFzLWNvbnRlbnQge1xuICBtaW4taGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kOiAjZmVmZWZlO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC41cyBlYXNlO1xuICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gIHotaW5kZXg6IDE7XG4gIGJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMTAsIDEwLCAxMCwgMC41KTsgfVxuXG4uanMtb2ZmLWNhbnZhcy1leGl0IHtcbiAgZGlzcGxheTogbm9uZTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjU0LCAyNTQsIDI1NCwgMC4yNSk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjVzIGVhc2U7IH1cblxuLm9mZi1jYW52YXMge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJhY2tncm91bmQ6ICNlNmU2ZTY7XG4gIHotaW5kZXg6IC0xO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7IH1cbiAgW2RhdGEtd2hhdGlucHV0PSdtb3VzZSddIC5vZmYtY2FudmFzIHtcbiAgICBvdXRsaW5lOiAwOyB9XG4gIC5vZmYtY2FudmFzLnBvc2l0aW9uLWxlZnQge1xuICAgIGxlZnQ6IC0yNTBweDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDI1MHB4OyB9XG4gICAgLmlzLW9wZW4tbGVmdCB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMjUwcHgpOyB9XG4gIC5vZmYtY2FudmFzLnBvc2l0aW9uLXJpZ2h0IHtcbiAgICByaWdodDogLTI1MHB4O1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMjUwcHg7IH1cbiAgICAuaXMtb3Blbi1yaWdodCB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTI1MHB4KTsgfVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0MGVtKSB7XG4gIC5wb3NpdGlvbi1sZWZ0LnJldmVhbC1mb3ItbWVkaXVtIHtcbiAgICBsZWZ0OiAwO1xuICAgIHotaW5kZXg6IGF1dG87XG4gICAgcG9zaXRpb246IGZpeGVkOyB9XG4gICAgLnBvc2l0aW9uLWxlZnQucmV2ZWFsLWZvci1tZWRpdW0gfiAub2ZmLWNhbnZhcy1jb250ZW50IHtcbiAgICAgIG1hcmdpbi1sZWZ0OiAyNTBweDsgfVxuICAucG9zaXRpb24tcmlnaHQucmV2ZWFsLWZvci1tZWRpdW0ge1xuICAgIHJpZ2h0OiAwO1xuICAgIHotaW5kZXg6IGF1dG87XG4gICAgcG9zaXRpb246IGZpeGVkOyB9XG4gICAgLnBvc2l0aW9uLXJpZ2h0LnJldmVhbC1mb3ItbWVkaXVtIH4gLm9mZi1jYW52YXMtY29udGVudCB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDI1MHB4OyB9IH1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNjRlbSkge1xuICAucG9zaXRpb24tbGVmdC5yZXZlYWwtZm9yLWxhcmdlIHtcbiAgICBsZWZ0OiAwO1xuICAgIHotaW5kZXg6IGF1dG87XG4gICAgcG9zaXRpb246IGZpeGVkOyB9XG4gICAgLnBvc2l0aW9uLWxlZnQucmV2ZWFsLWZvci1sYXJnZSB+IC5vZmYtY2FudmFzLWNvbnRlbnQge1xuICAgICAgbWFyZ2luLWxlZnQ6IDI1MHB4OyB9XG4gIC5wb3NpdGlvbi1yaWdodC5yZXZlYWwtZm9yLWxhcmdlIHtcbiAgICByaWdodDogMDtcbiAgICB6LWluZGV4OiBhdXRvO1xuICAgIHBvc2l0aW9uOiBmaXhlZDsgfVxuICAgIC5wb3NpdGlvbi1yaWdodC5yZXZlYWwtZm9yLWxhcmdlIH4gLm9mZi1jYW52YXMtY29udGVudCB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDI1MHB4OyB9IH1cblxuLm9yYml0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyB9XG5cbi5vcmJpdC1jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbjogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgbGlzdC1zdHlsZTogbm9uZTsgfVxuXG4ub3JiaXQtc2xpZGUge1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LWhlaWdodDogMTAwJTsgfVxuICAub3JiaXQtc2xpZGUubm8tbW90aW9udWkuaXMtYWN0aXZlIHtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDsgfVxuXG4ub3JiaXQtZmlndXJlIHtcbiAgbWFyZ2luOiAwOyB9XG5cbi5vcmJpdC1pbWFnZSB7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTsgfVxuXG4ub3JiaXQtY2FwdGlvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgY29sb3I6ICNmZWZlZmU7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTAsIDEwLCAxMCwgMC41KTsgfVxuXG4ub3JiaXQtcHJldmlvdXMsIC5vcmJpdC1uZXh0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB6LWluZGV4OiAxMDtcbiAgcGFkZGluZzogMXJlbTtcbiAgY29sb3I6ICNmZWZlZmU7IH1cbiAgW2RhdGEtd2hhdGlucHV0PSdtb3VzZSddIC5vcmJpdC1wcmV2aW91cywgW2RhdGEtd2hhdGlucHV0PSdtb3VzZSddIC5vcmJpdC1uZXh0IHtcbiAgICBvdXRsaW5lOiAwOyB9XG4gIC5vcmJpdC1wcmV2aW91czpob3ZlciwgLm9yYml0LW5leHQ6aG92ZXIsIC5vcmJpdC1wcmV2aW91czphY3RpdmUsIC5vcmJpdC1uZXh0OmFjdGl2ZSwgLm9yYml0LXByZXZpb3VzOmZvY3VzLCAub3JiaXQtbmV4dDpmb2N1cyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMCwgMTAsIDEwLCAwLjUpOyB9XG5cbi5vcmJpdC1wcmV2aW91cyB7XG4gIGxlZnQ6IDA7IH1cblxuLm9yYml0LW5leHQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogMDsgfVxuXG4ub3JiaXQtYnVsbGV0cyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWFyZ2luLXRvcDogMC44cmVtO1xuICBtYXJnaW4tYm90dG9tOiAwLjhyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjsgfVxuICBbZGF0YS13aGF0aW5wdXQ9J21vdXNlJ10gLm9yYml0LWJ1bGxldHMge1xuICAgIG91dGxpbmU6IDA7IH1cbiAgLm9yYml0LWJ1bGxldHMgYnV0dG9uIHtcbiAgICB3aWR0aDogMS4ycmVtO1xuICAgIGhlaWdodDogMS4ycmVtO1xuICAgIG1hcmdpbjogMC4xcmVtO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjYWNhY2E7XG4gICAgYm9yZGVyLXJhZGl1czogNTAlOyB9XG4gICAgLm9yYml0LWJ1bGxldHMgYnV0dG9uOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4YThhOGE7IH1cbiAgICAub3JiaXQtYnVsbGV0cyBidXR0b24uaXMtYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4YThhOGE7IH1cblxuLnBhZ2luYXRpb24ge1xuICBtYXJnaW4tbGVmdDogMDtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTsgfVxuICAucGFnaW5hdGlvbjo6YmVmb3JlLCAucGFnaW5hdGlvbjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcgJztcbiAgICBkaXNwbGF5OiB0YWJsZTsgfVxuICAucGFnaW5hdGlvbjo6YWZ0ZXIge1xuICAgIGNsZWFyOiBib3RoOyB9XG4gIC5wYWdpbmF0aW9uIGxpIHtcbiAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgIG1hcmdpbi1yaWdodDogMC4wNjI1cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuICAgIC5wYWdpbmF0aW9uIGxpOmxhc3QtY2hpbGQsIC5wYWdpbmF0aW9uIGxpOmZpcnN0LWNoaWxkIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsgfVxuICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQwZW0pIHtcbiAgICAgIC5wYWdpbmF0aW9uIGxpIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9IH1cbiAgLnBhZ2luYXRpb24gYSxcbiAgLnBhZ2luYXRpb24gYnV0dG9uIHtcbiAgICBjb2xvcjogIzBhMGEwYTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwYWRkaW5nOiAwLjE4NzVyZW0gMC42MjVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMDsgfVxuICAgIC5wYWdpbmF0aW9uIGE6aG92ZXIsXG4gICAgLnBhZ2luYXRpb24gYnV0dG9uOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNlNmU2ZTY7IH1cbiAgLnBhZ2luYXRpb24gLmN1cnJlbnQge1xuICAgIHBhZGRpbmc6IDAuMTg3NXJlbSAwLjYyNXJlbTtcbiAgICBiYWNrZ3JvdW5kOiAjMjE5OWU4O1xuICAgIGNvbG9yOiAjZmVmZWZlO1xuICAgIGN1cnNvcjogZGVmYXVsdDsgfVxuICAucGFnaW5hdGlvbiAuZGlzYWJsZWQge1xuICAgIHBhZGRpbmc6IDAuMTg3NXJlbSAwLjYyNXJlbTtcbiAgICBjb2xvcjogI2NhY2FjYTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7IH1cbiAgICAucGFnaW5hdGlvbiAuZGlzYWJsZWQ6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH1cbiAgLnBhZ2luYXRpb24gLmVsbGlwc2lzOjphZnRlciB7XG4gICAgY29udGVudDogJ+KApic7XG4gICAgcGFkZGluZzogMC4xODc1cmVtIDAuNjI1cmVtO1xuICAgIGNvbG9yOiAjMGEwYTBhOyB9XG5cbi5wYWdpbmF0aW9uLXByZXZpb3VzIGE6OmJlZm9yZSxcbi5wYWdpbmF0aW9uLXByZXZpb3VzLmRpc2FibGVkOjpiZWZvcmUge1xuICBjb250ZW50OiAnwqsnO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogMC41cmVtOyB9XG5cbi5wYWdpbmF0aW9uLW5leHQgYTo6YWZ0ZXIsXG4ucGFnaW5hdGlvbi1uZXh0LmRpc2FibGVkOjphZnRlciB7XG4gIGNvbnRlbnQ6ICfCuyc7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWxlZnQ6IDAuNXJlbTsgfVxuXG4ucHJvZ3Jlc3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2FjYWNhO1xuICBoZWlnaHQ6IDFyZW07XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG4gIGJvcmRlci1yYWRpdXM6IDA7IH1cbiAgLnByb2dyZXNzLnByaW1hcnkgLnByb2dyZXNzLW1ldGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE5OWU4OyB9XG4gIC5wcm9ncmVzcy5zZWNvbmRhcnkgLnByb2dyZXNzLW1ldGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzc3OyB9XG4gIC5wcm9ncmVzcy5zdWNjZXNzIC5wcm9ncmVzcy1tZXRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzNhZGI3NjsgfVxuICAucHJvZ3Jlc3MuYWxlcnQgLnByb2dyZXNzLW1ldGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM1ODQwOyB9XG4gIC5wcm9ncmVzcy53YXJuaW5nIC5wcm9ncmVzcy1tZXRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYWUwMDsgfVxuXG4ucHJvZ3Jlc3MtbWV0ZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxOTllODsgfVxuXG4ucHJvZ3Jlc3MtbWV0ZXItdGV4dCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogI2ZlZmVmZTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgfVxuXG4uc2xpZGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBoZWlnaHQ6IDAuNXJlbTtcbiAgbWFyZ2luLXRvcDogMS4yNXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMi4yNXJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZTZlNjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgdG91Y2gtYWN0aW9uOiBub25lOyB9XG5cbi5zbGlkZXItZmlsbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAwLjVyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNjYWNhY2E7XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0OyB9XG4gIC5zbGlkZXItZmlsbC5pcy1kcmFnZ2luZyB7XG4gICAgdHJhbnNpdGlvbjogYWxsIDBzIGxpbmVhcjsgfVxuXG4uc2xpZGVyLWhhbmRsZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAxLjRyZW07XG4gIGhlaWdodDogMS40cmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE5OWU4O1xuICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcbiAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247XG4gIGJvcmRlci1yYWRpdXM6IDA7IH1cbiAgW2RhdGEtd2hhdGlucHV0PSdtb3VzZSddIC5zbGlkZXItaGFuZGxlIHtcbiAgICBvdXRsaW5lOiAwOyB9XG4gIC5zbGlkZXItaGFuZGxlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTU4M2NjOyB9XG4gIC5zbGlkZXItaGFuZGxlLmlzLWRyYWdnaW5nIHtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMHMgbGluZWFyOyB9XG5cbi5zbGlkZXIuZGlzYWJsZWQsXG4uc2xpZGVyW2Rpc2FibGVkXSB7XG4gIG9wYWNpdHk6IDAuMjU7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7IH1cblxuLnNsaWRlci52ZXJ0aWNhbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDAuNXJlbTtcbiAgaGVpZ2h0OiAxMi41cmVtO1xuICBtYXJnaW46IDAgMS4yNXJlbTtcbiAgdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7IH1cbiAgLnNsaWRlci52ZXJ0aWNhbCAuc2xpZGVyLWZpbGwge1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMC41cmVtO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7IH1cbiAgLnNsaWRlci52ZXJ0aWNhbCAuc2xpZGVyLWhhbmRsZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgd2lkdGg6IDEuNHJlbTtcbiAgICBoZWlnaHQ6IDEuNHJlbTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7IH1cblxuLnN0aWNreS1jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7IH1cblxuLnN0aWNreSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsgfVxuXG4uc3RpY2t5LmlzLXN0dWNrIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiA1OyB9XG4gIC5zdGlja3kuaXMtc3R1Y2suaXMtYXQtdG9wIHtcbiAgICB0b3A6IDA7IH1cbiAgLnN0aWNreS5pcy1zdHVjay5pcy1hdC1ib3R0b20ge1xuICAgIGJvdHRvbTogMDsgfVxuXG4uc3RpY2t5LmlzLWFuY2hvcmVkIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogYXV0bzsgfVxuICAuc3RpY2t5LmlzLWFuY2hvcmVkLmlzLWF0LWJvdHRvbSB7XG4gICAgYm90dG9tOiAwOyB9XG5cbmJvZHkuaXMtcmV2ZWFsLW9wZW4ge1xuICBvdmVyZmxvdzogaGlkZGVuOyB9XG5cbi5yZXZlYWwtb3ZlcmxheSB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBib3R0b206IDA7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICB6LWluZGV4OiAxMDA1O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDEwLCAxMCwgMTAsIDAuNDUpO1xuICBvdmVyZmxvdy15OiBzY3JvbGw7IH1cblxuLnJldmVhbCB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHotaW5kZXg6IDEwMDY7XG4gIHBhZGRpbmc6IDFyZW07XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjYWNhY2E7XG4gIG1hcmdpbjogNi4yNXJlbSBhdXRvIDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgb3ZlcmZsb3cteTogYXV0bzsgfVxuICBbZGF0YS13aGF0aW5wdXQ9J21vdXNlJ10gLnJldmVhbCB7XG4gICAgb3V0bGluZTogMDsgfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0MGVtKSB7XG4gICAgLnJldmVhbCB7XG4gICAgICBtaW4taGVpZ2h0OiAwOyB9IH1cbiAgLnJldmVhbCAuY29sdW1uLCAucmV2ZWFsIC5jb2x1bW5zLFxuICAucmV2ZWFsIC5jb2x1bW5zIHtcbiAgICBtaW4td2lkdGg6IDA7IH1cbiAgLnJldmVhbCA+IDpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwOyB9XG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQwZW0pIHtcbiAgICAucmV2ZWFsIHtcbiAgICAgIHdpZHRoOiA2MDBweDtcbiAgICAgIG1heC13aWR0aDogNzVyZW07IH0gfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0MGVtKSB7XG4gICAgLnJldmVhbCAucmV2ZWFsIHtcbiAgICAgIGxlZnQ6IGF1dG87XG4gICAgICByaWdodDogYXV0bztcbiAgICAgIG1hcmdpbjogMCBhdXRvOyB9IH1cbiAgLnJldmVhbC5jb2xsYXBzZSB7XG4gICAgcGFkZGluZzogMDsgfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0MGVtKSB7XG4gICAgLnJldmVhbC50aW55IHtcbiAgICAgIHdpZHRoOiAzMCU7XG4gICAgICBtYXgtd2lkdGg6IDc1cmVtOyB9IH1cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNDBlbSkge1xuICAgIC5yZXZlYWwuc21hbGwge1xuICAgICAgd2lkdGg6IDUwJTtcbiAgICAgIG1heC13aWR0aDogNzVyZW07IH0gfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0MGVtKSB7XG4gICAgLnJldmVhbC5sYXJnZSB7XG4gICAgICB3aWR0aDogOTAlO1xuICAgICAgbWF4LXdpZHRoOiA3NXJlbTsgfSB9XG4gIC5yZXZlYWwuZnVsbCB7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGhlaWdodDogMTAwdmg7XG4gICAgbWluLWhlaWdodDogMTAwdmg7XG4gICAgbWF4LXdpZHRoOiBub25lO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIGJvcmRlcjogMDsgfVxuXG4uc3dpdGNoIHtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgb3V0bGluZTogMDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgY29sb3I6ICNmZWZlZmU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBmb250LXNpemU6IDAuODc1cmVtOyB9XG5cbi5zd2l0Y2gtaW5wdXQge1xuICBvcGFjaXR5OiAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7IH1cblxuLnN3aXRjaC1wYWRkbGUge1xuICBiYWNrZ3JvdW5kOiAjY2FjYWNhO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiA0cmVtO1xuICBoZWlnaHQ6IDJyZW07XG4gIHRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLW91dDtcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIGZvbnQtd2VpZ2h0OiBpbmhlcml0OyB9XG4gIGlucHV0ICsgLnN3aXRjaC1wYWRkbGUge1xuICAgIG1hcmdpbjogMDsgfVxuICAuc3dpdGNoLXBhZGRsZTo6YWZ0ZXIge1xuICAgIGJhY2tncm91bmQ6ICNmZWZlZmU7XG4gICAgY29udGVudDogJyc7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGhlaWdodDogMS41cmVtO1xuICAgIGxlZnQ6IDAuMjVyZW07XG4gICAgdG9wOiAwLjI1cmVtO1xuICAgIHdpZHRoOiAxLjVyZW07XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuMjVzIGVhc2Utb3V0O1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gICAgYm9yZGVyLXJhZGl1czogMDsgfVxuICBpbnB1dDpjaGVja2VkIH4gLnN3aXRjaC1wYWRkbGUge1xuICAgIGJhY2tncm91bmQ6ICMyMTk5ZTg7IH1cbiAgICBpbnB1dDpjaGVja2VkIH4gLnN3aXRjaC1wYWRkbGU6OmFmdGVyIHtcbiAgICAgIGxlZnQ6IDIuMjVyZW07IH1cbiAgW2RhdGEtd2hhdGlucHV0PSdtb3VzZSddIGlucHV0OmZvY3VzIH4gLnN3aXRjaC1wYWRkbGUge1xuICAgIG91dGxpbmU6IDA7IH1cblxuLnN3aXRjaC1hY3RpdmUsIC5zd2l0Y2gtaW5hY3RpdmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7IH1cblxuLnN3aXRjaC1hY3RpdmUge1xuICBsZWZ0OiA4JTtcbiAgZGlzcGxheTogbm9uZTsgfVxuICBpbnB1dDpjaGVja2VkICsgbGFiZWwgPiAuc3dpdGNoLWFjdGl2ZSB7XG4gICAgZGlzcGxheTogYmxvY2s7IH1cblxuLnN3aXRjaC1pbmFjdGl2ZSB7XG4gIHJpZ2h0OiAxNSU7IH1cbiAgaW5wdXQ6Y2hlY2tlZCArIGxhYmVsID4gLnN3aXRjaC1pbmFjdGl2ZSB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuXG4uc3dpdGNoLnRpbnkgLnN3aXRjaC1wYWRkbGUge1xuICB3aWR0aDogM3JlbTtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIGZvbnQtc2l6ZTogMC42MjVyZW07IH1cblxuLnN3aXRjaC50aW55IC5zd2l0Y2gtcGFkZGxlOjphZnRlciB7XG4gIHdpZHRoOiAxcmVtO1xuICBoZWlnaHQ6IDFyZW07IH1cblxuLnN3aXRjaC50aW55IGlucHV0OmNoZWNrZWQgfiAuc3dpdGNoLXBhZGRsZTphZnRlciB7XG4gIGxlZnQ6IDEuNzVyZW07IH1cblxuLnN3aXRjaC5zbWFsbCAuc3dpdGNoLXBhZGRsZSB7XG4gIHdpZHRoOiAzLjVyZW07XG4gIGhlaWdodDogMS43NXJlbTtcbiAgZm9udC1zaXplOiAwLjc1cmVtOyB9XG5cbi5zd2l0Y2guc21hbGwgLnN3aXRjaC1wYWRkbGU6OmFmdGVyIHtcbiAgd2lkdGg6IDEuMjVyZW07XG4gIGhlaWdodDogMS4yNXJlbTsgfVxuXG4uc3dpdGNoLnNtYWxsIGlucHV0OmNoZWNrZWQgfiAuc3dpdGNoLXBhZGRsZTphZnRlciB7XG4gIGxlZnQ6IDJyZW07IH1cblxuLnN3aXRjaC5sYXJnZSAuc3dpdGNoLXBhZGRsZSB7XG4gIHdpZHRoOiA1cmVtO1xuICBoZWlnaHQ6IDIuNXJlbTtcbiAgZm9udC1zaXplOiAxcmVtOyB9XG5cbi5zd2l0Y2gubGFyZ2UgLnN3aXRjaC1wYWRkbGU6OmFmdGVyIHtcbiAgd2lkdGg6IDJyZW07XG4gIGhlaWdodDogMnJlbTsgfVxuXG4uc3dpdGNoLmxhcmdlIGlucHV0OmNoZWNrZWQgfiAuc3dpdGNoLXBhZGRsZTphZnRlciB7XG4gIGxlZnQ6IDIuNzVyZW07IH1cblxudGFibGUge1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgYm9yZGVyLXJhZGl1czogMDsgfVxuICB0YWJsZSB0aGVhZCxcbiAgdGFibGUgdGJvZHksXG4gIHRhYmxlIHRmb290IHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZjFmMWYxO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7IH1cbiAgdGFibGUgY2FwdGlvbiB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgcGFkZGluZzogMC41cmVtIDAuNjI1cmVtIDAuNjI1cmVtOyB9XG4gIHRhYmxlIHRoZWFkLFxuICB0YWJsZSB0Zm9vdCB7XG4gICAgYmFja2dyb3VuZDogI2Y4ZjhmODtcbiAgICBjb2xvcjogIzBhMGEwYTsgfVxuICAgIHRhYmxlIHRoZWFkIHRyLFxuICAgIHRhYmxlIHRmb290IHRyIHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9XG4gICAgdGFibGUgdGhlYWQgdGgsXG4gICAgdGFibGUgdGhlYWQgdGQsXG4gICAgdGFibGUgdGZvb3QgdGgsXG4gICAgdGFibGUgdGZvb3QgdGQge1xuICAgICAgcGFkZGluZzogMC41cmVtIDAuNjI1cmVtIDAuNjI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICB0ZXh0LWFsaWduOiBsZWZ0OyB9XG4gIHRhYmxlIHRib2R5IHRyOm50aC1jaGlsZChldmVuKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTsgfVxuICB0YWJsZSB0Ym9keSB0aCxcbiAgdGFibGUgdGJvZHkgdGQge1xuICAgIHBhZGRpbmc6IDAuNXJlbSAwLjYyNXJlbSAwLjYyNXJlbTsgfVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2My45Mzc1ZW0pIHtcbiAgdGFibGUuc3RhY2sgdGhlYWQge1xuICAgIGRpc3BsYXk6IG5vbmU7IH1cbiAgdGFibGUuc3RhY2sgdGZvb3Qge1xuICAgIGRpc3BsYXk6IG5vbmU7IH1cbiAgdGFibGUuc3RhY2sgdHIsXG4gIHRhYmxlLnN0YWNrIHRoLFxuICB0YWJsZS5zdGFjayB0ZCB7XG4gICAgZGlzcGxheTogYmxvY2s7IH1cbiAgdGFibGUuc3RhY2sgdGQge1xuICAgIGJvcmRlci10b3A6IDA7IH0gfVxuXG50YWJsZS5zY3JvbGwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG4gIG92ZXJmbG93LXg6IGF1dG87IH1cblxudGFibGUuaG92ZXIgdHI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5OyB9XG5cbnRhYmxlLmhvdmVyIHRyOm50aC1vZi10eXBlKGV2ZW4pOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjZWNlYzsgfVxuXG4udGFicyB7XG4gIG1hcmdpbjogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBiYWNrZ3JvdW5kOiAjZmVmZWZlO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2OyB9XG4gIC50YWJzOjpiZWZvcmUsIC50YWJzOjphZnRlciB7XG4gICAgY29udGVudDogJyAnO1xuICAgIGRpc3BsYXk6IHRhYmxlOyB9XG4gIC50YWJzOjphZnRlciB7XG4gICAgY2xlYXI6IGJvdGg7IH1cblxuLnRhYnMudmVydGljYWwgPiBsaSB7XG4gIHdpZHRoOiBhdXRvO1xuICBmbG9hdDogbm9uZTtcbiAgZGlzcGxheTogYmxvY2s7IH1cblxuLnRhYnMuc2ltcGxlID4gbGkgPiBhIHtcbiAgcGFkZGluZzogMDsgfVxuICAudGFicy5zaW1wbGUgPiBsaSA+IGE6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9XG5cbi50YWJzLnByaW1hcnkge1xuICBiYWNrZ3JvdW5kOiAjMjE5OWU4OyB9XG4gIC50YWJzLnByaW1hcnkgPiBsaSA+IGEge1xuICAgIGNvbG9yOiAjZmVmZWZlOyB9XG4gICAgLnRhYnMucHJpbWFyeSA+IGxpID4gYTpob3ZlciwgLnRhYnMucHJpbWFyeSA+IGxpID4gYTpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kOiAjMTg5M2U0OyB9XG5cbi50YWJzLXRpdGxlIHtcbiAgZmxvYXQ6IGxlZnQ7IH1cbiAgLnRhYnMtdGl0bGUgPiBhIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwYWRkaW5nOiAxLjI1cmVtIDEuNXJlbTtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgY29sb3I6ICMyMTk5ZTg7IH1cbiAgICAudGFicy10aXRsZSA+IGE6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2ZlZmVmZTsgfVxuICAgIC50YWJzLXRpdGxlID4gYTpmb2N1cywgLnRhYnMtdGl0bGUgPiBhW2FyaWEtc2VsZWN0ZWQ9J3RydWUnXSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTZlNmU2OyB9XG5cbi50YWJzLWNvbnRlbnQge1xuICBiYWNrZ3JvdW5kOiAjZmVmZWZlO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2O1xuICBib3JkZXItdG9wOiAwOyB9XG5cbi50YWJzLWNvbnRlbnQudmVydGljYWwge1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2O1xuICBib3JkZXItbGVmdDogMDsgfVxuXG4udGFicy1wYW5lbCB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBhZGRpbmc6IDFyZW07IH1cbiAgLnRhYnMtcGFuZWwuaXMtYWN0aXZlIHtcbiAgICBkaXNwbGF5OiBibG9jazsgfVxuXG4udGh1bWJuYWlsIHtcbiAgYm9yZGVyOiBzb2xpZCA0cHggI2ZlZmVmZTtcbiAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMTAsIDEwLCAxMCwgMC4yKTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBsaW5lLWhlaWdodDogMDtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDIwMG1zIGVhc2Utb3V0O1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBtYXJnaW4tYm90dG9tOiAxcmVtOyB9XG4gIC50aHVtYm5haWw6aG92ZXIsIC50aHVtYm5haWw6Zm9jdXMge1xuICAgIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4IHJnYmEoMzMsIDE1MywgMjMyLCAwLjUpOyB9XG5cbi50aXRsZS1iYXIge1xuICBiYWNrZ3JvdW5kOiAjMGEwYTBhO1xuICBjb2xvcjogI2ZlZmVmZTtcbiAgcGFkZGluZzogMC41cmVtOyB9XG4gIC50aXRsZS1iYXI6OmJlZm9yZSwgLnRpdGxlLWJhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcgJztcbiAgICBkaXNwbGF5OiB0YWJsZTsgfVxuICAudGl0bGUtYmFyOjphZnRlciB7XG4gICAgY2xlYXI6IGJvdGg7IH1cbiAgLnRpdGxlLWJhciAubWVudS1pY29uIHtcbiAgICBtYXJnaW4tbGVmdDogMC4yNXJlbTtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuNXJlbTsgfVxuXG4udGl0bGUtYmFyLWxlZnQge1xuICBmbG9hdDogbGVmdDsgfVxuXG4udGl0bGUtYmFyLXJpZ2h0IHtcbiAgZmxvYXQ6IHJpZ2h0O1xuICB0ZXh0LWFsaWduOiByaWdodDsgfVxuXG4udGl0bGUtYmFyLXRpdGxlIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jazsgfVxuXG4ubWVudS1pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMTZweDsgfVxuICAubWVudS1pY29uOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMnB4O1xuICAgIGJhY2tncm91bmQ6ICNmZWZlZmU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgYm94LXNoYWRvdzogMCA3cHggMCAjZmVmZWZlLCAwIDE0cHggMCAjZmVmZWZlOyB9XG4gIC5tZW51LWljb246aG92ZXI6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kOiAjY2FjYWNhO1xuICAgIGJveC1zaGFkb3c6IDAgN3B4IDAgI2NhY2FjYSwgMCAxNHB4IDAgI2NhY2FjYTsgfVxuXG4ubWVudS1pY29uLmRhcmsge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAxNnB4OyB9XG4gIC5tZW51LWljb24uZGFyazo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICBiYWNrZ3JvdW5kOiAjMGEwYTBhO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIGJveC1zaGFkb3c6IDAgN3B4IDAgIzBhMGEwYSwgMCAxNHB4IDAgIzBhMGEwYTsgfVxuICAubWVudS1pY29uLmRhcms6aG92ZXI6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kOiAjOGE4YThhO1xuICAgIGJveC1zaGFkb3c6IDAgN3B4IDAgIzhhOGE4YSwgMCAxNHB4IDAgIzhhOGE4YTsgfVxuXG4uaGFzLXRpcCB7XG4gIGJvcmRlci1ib3R0b206IGRvdHRlZCAxcHggIzhhOGE4YTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjdXJzb3I6IGhlbHA7IH1cblxuLnRvb2x0aXAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMGEwYTBhO1xuICBjb2xvcjogI2ZlZmVmZTtcbiAgZm9udC1zaXplOiA4MCU7XG4gIHBhZGRpbmc6IDAuNzVyZW07XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTA7XG4gIHRvcDogY2FsYygxMDAlICsgMC42NDk1cmVtKTtcbiAgbWF4LXdpZHRoOiAxMHJlbSAhaW1wb3J0YW50O1xuICBib3JkZXItcmFkaXVzOiAwOyB9XG4gIC50b29sdGlwOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAwO1xuICAgIGhlaWdodDogMDtcbiAgICBib3JkZXI6IGluc2V0IDAuNzVyZW07XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjMGEwYTBhO1xuICAgIGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkO1xuICAgIGJvcmRlci10b3Atd2lkdGg6IDA7XG4gICAgYm90dG9tOiAxMDAlO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiA1MCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOyB9XG4gIC50b29sdGlwLnRvcDo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyOiBpbnNldCAwLjc1cmVtO1xuICAgIGJvcmRlci1jb2xvcjogIzBhMGEwYSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDtcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xuICAgIHRvcDogMTAwJTtcbiAgICBib3R0b206IGF1dG87IH1cbiAgLnRvb2x0aXAubGVmdDo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyOiBpbnNldCAwLjc1cmVtO1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzBhMGEwYTtcbiAgICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7XG4gICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwO1xuICAgIGJvdHRvbTogYXV0bztcbiAgICBsZWZ0OiAxMDAlO1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsgfVxuICAudG9vbHRpcC5yaWdodDo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyOiBpbnNldCAwLjc1cmVtO1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgIzBhMGEwYSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmlnaHQtc3R5bGU6IHNvbGlkO1xuICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xuICAgIGJvdHRvbTogYXV0bztcbiAgICBsZWZ0OiBhdXRvO1xuICAgIHJpZ2h0OiAxMDAlO1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsgfVxuXG4udG9wLWJhciB7XG4gIHBhZGRpbmc6IDAuNXJlbTsgfVxuICAudG9wLWJhcjo6YmVmb3JlLCAudG9wLWJhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcgJztcbiAgICBkaXNwbGF5OiB0YWJsZTsgfVxuICAudG9wLWJhcjo6YWZ0ZXIge1xuICAgIGNsZWFyOiBib3RoOyB9XG4gIC50b3AtYmFyLFxuICAudG9wLWJhciB1bCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZTZlNjsgfVxuICAudG9wLWJhciBpbnB1dCB7XG4gICAgd2lkdGg6IDIwMHB4O1xuICAgIG1hcmdpbi1yaWdodDogMXJlbTsgfVxuICAudG9wLWJhciBpbnB1dC5idXR0b24ge1xuICAgIHdpZHRoOiBhdXRvOyB9XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDM5LjkzNzVlbSkge1xuICAuc3RhY2tlZC1mb3Itc21hbGwgLnRvcC1iYXItdGl0bGUge1xuICAgIHdpZHRoOiAxMDAlOyB9XG4gIC5zdGFja2VkLWZvci1zbWFsbCAudG9wLWJhci1yaWdodCB7XG4gICAgd2lkdGg6IDEwMCU7IH1cbiAgLnN0YWNrZWQtZm9yLXNtYWxsIC50b3AtYmFyLWxlZnQge1xuICAgIHdpZHRoOiAxMDAlOyB9IH1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjMuOTM3NWVtKSB7XG4gIC5zdGFja2VkLWZvci1tZWRpdW0gLnRvcC1iYXItdGl0bGUge1xuICAgIHdpZHRoOiAxMDAlOyB9XG4gIC5zdGFja2VkLWZvci1tZWRpdW0gLnRvcC1iYXItcmlnaHQge1xuICAgIHdpZHRoOiAxMDAlOyB9XG4gIC5zdGFja2VkLWZvci1tZWRpdW0gLnRvcC1iYXItbGVmdCB7XG4gICAgd2lkdGg6IDEwMCU7IH0gfVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NC45Mzc1ZW0pIHtcbiAgLnN0YWNrZWQtZm9yLWxhcmdlIC50b3AtYmFyLXRpdGxlIHtcbiAgICB3aWR0aDogMTAwJTsgfVxuICAuc3RhY2tlZC1mb3ItbGFyZ2UgLnRvcC1iYXItcmlnaHQge1xuICAgIHdpZHRoOiAxMDAlOyB9XG4gIC5zdGFja2VkLWZvci1sYXJnZSAudG9wLWJhci1sZWZ0IHtcbiAgICB3aWR0aDogMTAwJTsgfSB9XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDBlbSkgYW5kIChtYXgtd2lkdGg6IDM5LjkzNzVlbSkge1xuICAudG9wLWJhci10aXRsZSB7XG4gICAgd2lkdGg6IDEwMCU7IH1cbiAgLnRvcC1iYXItcmlnaHQge1xuICAgIHdpZHRoOiAxMDAlOyB9XG4gIC50b3AtYmFyLWxlZnQge1xuICAgIHdpZHRoOiAxMDAlOyB9IH1cblxuLnRvcC1iYXItdGl0bGUge1xuICBmbG9hdDogbGVmdDtcbiAgbWFyZ2luLXJpZ2h0OiAxcmVtOyB9XG5cbi50b3AtYmFyLWxlZnQge1xuICBmbG9hdDogbGVmdDsgfVxuXG4udG9wLWJhci1yaWdodCB7XG4gIGZsb2F0OiByaWdodDsgfVxuXG4uc2xpZGUtaW4tZG93bi5tdWktZW50ZXIge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEwMCUpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjsgfVxuXG4uc2xpZGUtaW4tZG93bi5tdWktZW50ZXIubXVpLWVudGVyLWFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxuXG4uc2xpZGUtaW4tbGVmdC5tdWktZW50ZXIge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjsgfVxuXG4uc2xpZGUtaW4tbGVmdC5tdWktZW50ZXIubXVpLWVudGVyLWFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsgfVxuXG4uc2xpZGUtaW4tdXAubXVpLWVudGVyIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMCUpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjsgfVxuXG4uc2xpZGUtaW4tdXAubXVpLWVudGVyLm11aS1lbnRlci1hY3RpdmUge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cblxuLnNsaWRlLWluLXJpZ2h0Lm11aS1lbnRlciB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47IH1cblxuLnNsaWRlLWluLXJpZ2h0Lm11aS1lbnRlci5tdWktZW50ZXItYWN0aXZlIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOyB9XG5cbi5zbGlkZS1vdXQtZG93bi5tdWktbGVhdmUge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuOyB9XG5cbi5zbGlkZS1vdXQtZG93bi5tdWktbGVhdmUubXVpLWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsgfVxuXG4uc2xpZGUtb3V0LXJpZ2h0Lm11aS1sZWF2ZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47IH1cblxuLnNsaWRlLW91dC1yaWdodC5tdWktbGVhdmUubXVpLWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsgfVxuXG4uc2xpZGUtb3V0LXVwLm11aS1sZWF2ZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47IH1cblxuLnNsaWRlLW91dC11cC5tdWktbGVhdmUubXVpLWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTAwJSk7IH1cblxuLnNsaWRlLW91dC1sZWZ0Lm11aS1sZWF2ZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47IH1cblxuLnNsaWRlLW91dC1sZWZ0Lm11aS1sZWF2ZS5tdWktbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsgfVxuXG4uZmFkZS1pbi5tdWktZW50ZXIge1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5OyB9XG5cbi5mYWRlLWluLm11aS1lbnRlci5tdWktZW50ZXItYWN0aXZlIHtcbiAgb3BhY2l0eTogMTsgfVxuXG4uZmFkZS1vdXQubXVpLWxlYXZlIHtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTsgfVxuXG4uZmFkZS1vdXQubXVpLWxlYXZlLm11aS1sZWF2ZS1hY3RpdmUge1xuICBvcGFjaXR5OiAwOyB9XG5cbi5oaW5nZS1pbi1mcm9tLXRvcC5tdWktZW50ZXIge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCgtOTBkZWcpO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3A7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgb3BhY2l0eTogMDsgfVxuXG4uaGluZ2UtaW4tZnJvbS10b3AubXVpLWVudGVyLm11aS1lbnRlci1hY3RpdmUge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlKDBkZWcpO1xuICBvcGFjaXR5OiAxOyB9XG5cbi5oaW5nZS1pbi1mcm9tLXJpZ2h0Lm11aS1lbnRlciB7XG4gIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVZKC05MGRlZyk7XG4gIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0O1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIG9wYWNpdHk6IDA7IH1cblxuLmhpbmdlLWluLWZyb20tcmlnaHQubXVpLWVudGVyLm11aS1lbnRlci1hY3RpdmUge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlKDBkZWcpO1xuICBvcGFjaXR5OiAxOyB9XG5cbi5oaW5nZS1pbi1mcm9tLWJvdHRvbS5tdWktZW50ZXIge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCg5MGRlZyk7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICBvcGFjaXR5OiAwOyB9XG5cbi5oaW5nZS1pbi1mcm9tLWJvdHRvbS5tdWktZW50ZXIubXVpLWVudGVyLWFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGUoMGRlZyk7XG4gIG9wYWNpdHk6IDE7IH1cblxuLmhpbmdlLWluLWZyb20tbGVmdC5tdWktZW50ZXIge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWSg5MGRlZyk7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQ7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgb3BhY2l0eTogMDsgfVxuXG4uaGluZ2UtaW4tZnJvbS1sZWZ0Lm11aS1lbnRlci5tdWktZW50ZXItYWN0aXZlIHtcbiAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZSgwZGVnKTtcbiAgb3BhY2l0eTogMTsgfVxuXG4uaGluZ2UtaW4tZnJvbS1taWRkbGUteC5tdWktZW50ZXIge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCgtOTBkZWcpO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgb3BhY2l0eTogMDsgfVxuXG4uaGluZ2UtaW4tZnJvbS1taWRkbGUteC5tdWktZW50ZXIubXVpLWVudGVyLWFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGUoMGRlZyk7XG4gIG9wYWNpdHk6IDE7IH1cblxuLmhpbmdlLWluLWZyb20tbWlkZGxlLXkubXVpLWVudGVyIHtcbiAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoLTkwZGVnKTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIG9wYWNpdHk6IDA7IH1cblxuLmhpbmdlLWluLWZyb20tbWlkZGxlLXkubXVpLWVudGVyLm11aS1lbnRlci1hY3RpdmUge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlKDBkZWcpO1xuICBvcGFjaXR5OiAxOyB9XG5cbi5oaW5nZS1vdXQtZnJvbS10b3AubXVpLWxlYXZlIHtcbiAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZSgwZGVnKTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIG9wYWNpdHk6IDE7IH1cblxuLmhpbmdlLW91dC1mcm9tLXRvcC5tdWktbGVhdmUubXVpLWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKC05MGRlZyk7XG4gIG9wYWNpdHk6IDA7IH1cblxuLmhpbmdlLW91dC1mcm9tLXJpZ2h0Lm11aS1sZWF2ZSB7XG4gIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGUoMGRlZyk7XG4gIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0O1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIG9wYWNpdHk6IDE7IH1cblxuLmhpbmdlLW91dC1mcm9tLXJpZ2h0Lm11aS1sZWF2ZS5tdWktbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoLTkwZGVnKTtcbiAgb3BhY2l0eTogMDsgfVxuXG4uaGluZ2Utb3V0LWZyb20tYm90dG9tLm11aS1sZWF2ZSB7XG4gIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGUoMGRlZyk7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICBvcGFjaXR5OiAxOyB9XG5cbi5oaW5nZS1vdXQtZnJvbS1ib3R0b20ubXVpLWxlYXZlLm11aS1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCg5MGRlZyk7XG4gIG9wYWNpdHk6IDA7IH1cblxuLmhpbmdlLW91dC1mcm9tLWxlZnQubXVpLWxlYXZlIHtcbiAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZSgwZGVnKTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdDtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICBvcGFjaXR5OiAxOyB9XG5cbi5oaW5nZS1vdXQtZnJvbS1sZWZ0Lm11aS1sZWF2ZS5tdWktbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoOTBkZWcpO1xuICBvcGFjaXR5OiAwOyB9XG5cbi5oaW5nZS1vdXQtZnJvbS1taWRkbGUteC5tdWktbGVhdmUge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlKDBkZWcpO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgb3BhY2l0eTogMTsgfVxuXG4uaGluZ2Utb3V0LWZyb20tbWlkZGxlLXgubXVpLWxlYXZlLm11aS1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCgtOTBkZWcpO1xuICBvcGFjaXR5OiAwOyB9XG5cbi5oaW5nZS1vdXQtZnJvbS1taWRkbGUteS5tdWktbGVhdmUge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlKDBkZWcpO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgb3BhY2l0eTogMTsgfVxuXG4uaGluZ2Utb3V0LWZyb20tbWlkZGxlLXkubXVpLWxlYXZlLm11aS1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWSgtOTBkZWcpO1xuICBvcGFjaXR5OiAwOyB9XG5cbi5zY2FsZS1pbi11cC5tdWktZW50ZXIge1xuICB0cmFuc2Zvcm06IHNjYWxlKDAuNSk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgb3BhY2l0eTogMDsgfVxuXG4uc2NhbGUtaW4tdXAubXVpLWVudGVyLm11aS1lbnRlci1hY3RpdmUge1xuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICBvcGFjaXR5OiAxOyB9XG5cbi5zY2FsZS1pbi1kb3duLm11aS1lbnRlciB7XG4gIHRyYW5zZm9ybTogc2NhbGUoMS41KTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICBvcGFjaXR5OiAwOyB9XG5cbi5zY2FsZS1pbi1kb3duLm11aS1lbnRlci5tdWktZW50ZXItYWN0aXZlIHtcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgb3BhY2l0eTogMTsgfVxuXG4uc2NhbGUtb3V0LXVwLm11aS1sZWF2ZSB7XG4gIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgb3BhY2l0eTogMTsgfVxuXG4uc2NhbGUtb3V0LXVwLm11aS1sZWF2ZS5tdWktbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNmb3JtOiBzY2FsZSgxLjUpO1xuICBvcGFjaXR5OiAwOyB9XG5cbi5zY2FsZS1vdXQtZG93bi5tdWktbGVhdmUge1xuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIG9wYWNpdHk6IDE7IH1cblxuLnNjYWxlLW91dC1kb3duLm11aS1sZWF2ZS5tdWktbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpO1xuICBvcGFjaXR5OiAwOyB9XG5cbi5zcGluLWluLm11aS1lbnRlciB7XG4gIHRyYW5zZm9ybTogcm90YXRlKC0wLjc1dHVybik7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgb3BhY2l0eTogMDsgfVxuXG4uc3Bpbi1pbi5tdWktZW50ZXIubXVpLWVudGVyLWFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogcm90YXRlKDApO1xuICBvcGFjaXR5OiAxOyB9XG5cbi5zcGluLW91dC5tdWktbGVhdmUge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICBvcGFjaXR5OiAxOyB9XG5cbi5zcGluLW91dC5tdWktbGVhdmUubXVpLWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogcm90YXRlKDAuNzV0dXJuKTtcbiAgb3BhY2l0eTogMDsgfVxuXG4uc3Bpbi1pbi1jY3cubXVpLWVudGVyIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMC43NXR1cm4pO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIG9wYWNpdHk6IDA7IH1cblxuLnNwaW4taW4tY2N3Lm11aS1lbnRlci5tdWktZW50ZXItYWN0aXZlIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMCk7XG4gIG9wYWNpdHk6IDE7IH1cblxuLnNwaW4tb3V0LWNjdy5tdWktbGVhdmUge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICBvcGFjaXR5OiAxOyB9XG5cbi5zcGluLW91dC1jY3cubXVpLWxlYXZlLm11aS1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgtMC43NXR1cm4pO1xuICBvcGFjaXR5OiAwOyB9XG5cbi5zbG93IHtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogNzUwbXMgIWltcG9ydGFudDsgfVxuXG4uZmFzdCB7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDI1MG1zICFpbXBvcnRhbnQ7IH1cblxuLmxpbmVhciB7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXIgIWltcG9ydGFudDsgfVxuXG4uZWFzZSB7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlICFpbXBvcnRhbnQ7IH1cblxuLmVhc2UtaW4ge1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbiAhaW1wb3J0YW50OyB9XG5cbi5lYXNlLW91dCB7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dCAhaW1wb3J0YW50OyB9XG5cbi5lYXNlLWluLW91dCB7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dCAhaW1wb3J0YW50OyB9XG5cbi5ib3VuY2UtaW4ge1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNDg1LCAwLjE1NSwgMC4yNCwgMS4yNDUpICFpbXBvcnRhbnQ7IH1cblxuLmJvdW5jZS1vdXQge1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNDg1LCAwLjE1NSwgMC41MTUsIDAuODQ1KSAhaW1wb3J0YW50OyB9XG5cbi5ib3VuY2UtaW4tb3V0IHtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjc2LCAtMC4yNDUsIDAuMjQsIDEuMjQ1KSAhaW1wb3J0YW50OyB9XG5cbi5zaG9ydC1kZWxheSB7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDMwMG1zICFpbXBvcnRhbnQ7IH1cblxuLmxvbmctZGVsYXkge1xuICB0cmFuc2l0aW9uLWRlbGF5OiA3MDBtcyAhaW1wb3J0YW50OyB9XG5cbi5zaGFrZSB7XG4gIGFuaW1hdGlvbi1uYW1lOiBzaGFrZS03OyB9XG5cbkBrZXlmcmFtZXMgc2hha2UtNyB7XG4gIDAlLCAxMCUsIDIwJSwgMzAlLCA0MCUsIDUwJSwgNjAlLCA3MCUsIDgwJSwgOTAlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNyUpOyB9XG4gIDUlLCAxNSUsIDI1JSwgMzUlLCA0NSUsIDU1JSwgNjUlLCA3NSUsIDg1JSwgOTUlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTclKTsgfSB9XG5cbi5zcGluLWN3IHtcbiAgYW5pbWF0aW9uLW5hbWU6IHNwaW4tY3ctMXR1cm47IH1cblxuQGtleWZyYW1lcyBzcGluLWN3LTF0dXJuIHtcbiAgMCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKC0xdHVybik7IH1cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMCk7IH0gfVxuXG4uc3Bpbi1jY3cge1xuICBhbmltYXRpb24tbmFtZTogc3Bpbi1jdy0xdHVybjsgfVxuXG5Aa2V5ZnJhbWVzIHNwaW4tY3ctMXR1cm4ge1xuICAwJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMCk7IH1cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMXR1cm4pOyB9IH1cblxuLndpZ2dsZSB7XG4gIGFuaW1hdGlvbi1uYW1lOiB3aWdnbGUtN2RlZzsgfVxuXG5Aa2V5ZnJhbWVzIHdpZ2dsZS03ZGVnIHtcbiAgNDAlLCA1MCUsIDYwJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoN2RlZyk7IH1cbiAgMzUlLCA0NSUsIDU1JSwgNjUlIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtN2RlZyk7IH1cbiAgMCUsIDMwJSwgNzAlLCAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTsgfSB9XG5cbi5pbmZpbml0ZSB7XG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOyB9XG5cbi5zbG93IHtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiA3NTBtcyAhaW1wb3J0YW50OyB9XG5cbi5mYXN0IHtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAyNTBtcyAhaW1wb3J0YW50OyB9XG5cbi5saW5lYXIge1xuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXIgIWltcG9ydGFudDsgfVxuXG4uZWFzZSB7XG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UgIWltcG9ydGFudDsgfVxuXG4uZWFzZS1pbiB7XG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW4gIWltcG9ydGFudDsgfVxuXG4uZWFzZS1vdXQge1xuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dCAhaW1wb3J0YW50OyB9XG5cbi5lYXNlLWluLW91dCB7XG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW4tb3V0ICFpbXBvcnRhbnQ7IH1cblxuLmJvdW5jZS1pbiB7XG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQ4NSwgMC4xNTUsIDAuMjQsIDEuMjQ1KSAhaW1wb3J0YW50OyB9XG5cbi5ib3VuY2Utb3V0IHtcbiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNDg1LCAwLjE1NSwgMC41MTUsIDAuODQ1KSAhaW1wb3J0YW50OyB9XG5cbi5ib3VuY2UtaW4tb3V0IHtcbiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNzYsIC0wLjI0NSwgMC4yNCwgMS4yNDUpICFpbXBvcnRhbnQ7IH1cblxuLnNob3J0LWRlbGF5IHtcbiAgYW5pbWF0aW9uLWRlbGF5OiAzMDBtcyAhaW1wb3J0YW50OyB9XG5cbi5sb25nLWRlbGF5IHtcbiAgYW5pbWF0aW9uLWRlbGF5OiA3MDBtcyAhaW1wb3J0YW50OyB9XG5cbm1haW4ge1xuICBjbGVhcjogYm90aDsgfVxuXG4ubGF5b3V0LWNvbnRlbnQge1xuICBwYWRkaW5nOiAzZW0gMiU7IH1cblxuLmxheW91dC1ncmV5IHtcbiAgcGFkZGluZzogM2VtIDIlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIyOSwgMjI5LCAyMjksIDAuNSk7XG4gIGJhY2tncm91bmQ6ICNlNWU1ZTU7IH1cblxuLmdsb2JhbC1oZWFkZXIge1xuICBwYWRkaW5nOiAwIDIlO1xuICBtYXJnaW4tYm90dG9tOiA1MHB4O1xuICBib3gtc2hhZG93OiAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkOyB9XG5cbi5nbG9iYWwtaGVhZGVyLWxvZ28ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgLyogZmxvYXQ6IGxlZnQ7ICovXG4gIG1hcmdpbjogOHB4IGF1dG87XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuNHMgZWFzZTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNHMgZWFzZTtcbiAgd2lkdGg6IDZlbTsgfVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0MGVtKSB7XG4gIC5nbG9iYWwtaGVhZGVyLWxvZ28ge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIHdpZHRoOiA4ZW07XG4gICAgbWFyZ2luOiAxZW0gYXV0bzsgfSB9XG5cbi5uYXYtZ2xvYmFsLXNlY29uZGFyeSBsaSB7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH1cblxuLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IGxpIGEge1xuICBjb2xvcjogYmxhY2s7IH1cblxuLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IGEuc3RhdGUtYWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMjk2YjtcbiAgY29sb3I6IHdoaXRlOyB9XG5cbi5uYXYtZ2xvYmFsLXNlY29uZGFyeSwgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IHVsIHtcbiAgbWFyZ2luOiAwO1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IH1cbiAgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5ID4gbGksIC5uYXYtZ2xvYmFsLXNlY29uZGFyeSB1bCA+IGxpIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH1cbiAgICBbZGF0YS13aGF0aW5wdXQ9J21vdXNlJ10gLm5hdi1nbG9iYWwtc2Vjb25kYXJ5ID4gbGksIFtkYXRhLXdoYXRpbnB1dD0nbW91c2UnXSAubmF2LWdsb2JhbC1zZWNvbmRhcnkgdWwgPiBsaSB7XG4gICAgICBvdXRsaW5lOiAwOyB9XG4gIC5uYXYtZ2xvYmFsLXNlY29uZGFyeSA+IGxpID4gYSwgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IHVsID4gbGkgPiBhIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwYWRkaW5nOiAyNHB4IDI0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7IH1cbiAgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IGlucHV0LFxuICAubmF2LWdsb2JhbC1zZWNvbmRhcnkgYSxcbiAgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IGJ1dHRvbiwgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IHVsIGlucHV0LFxuICAubmF2LWdsb2JhbC1zZWNvbmRhcnkgdWwgYSxcbiAgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IHVsIGJ1dHRvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDsgfVxuICAubmF2LWdsb2JhbC1zZWNvbmRhcnkgPiBsaSwgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IHVsID4gbGkge1xuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7IH1cbiAgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5LnZlcnRpY2FsID4gbGksIC5uYXYtZ2xvYmFsLXNlY29uZGFyeSB1bC52ZXJ0aWNhbCA+IGxpIHtcbiAgICBkaXNwbGF5OiBibG9jazsgfVxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0MGVtKSB7XG4gICAgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5Lm1lZGl1bS1ob3Jpem9udGFsID4gbGksIC5uYXYtZ2xvYmFsLXNlY29uZGFyeSB1bC5tZWRpdW0taG9yaXpvbnRhbCA+IGxpIHtcbiAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7IH1cbiAgICAubmF2LWdsb2JhbC1zZWNvbmRhcnkubWVkaXVtLXZlcnRpY2FsID4gbGksIC5uYXYtZ2xvYmFsLXNlY29uZGFyeSB1bC5tZWRpdW0tdmVydGljYWwgPiBsaSB7XG4gICAgICBkaXNwbGF5OiBibG9jazsgfSB9XG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDY0ZW0pIHtcbiAgICAubmF2LWdsb2JhbC1zZWNvbmRhcnkubGFyZ2UtaG9yaXpvbnRhbCA+IGxpLCAubmF2LWdsb2JhbC1zZWNvbmRhcnkgdWwubGFyZ2UtaG9yaXpvbnRhbCA+IGxpIHtcbiAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7IH1cbiAgICAubmF2LWdsb2JhbC1zZWNvbmRhcnkubGFyZ2UtdmVydGljYWwgPiBsaSwgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IHVsLmxhcmdlLXZlcnRpY2FsID4gbGkge1xuICAgICAgZGlzcGxheTogYmxvY2s7IH0gfVxuICAubmF2LWdsb2JhbC1zZWNvbmRhcnkubmVzdGVkLCAubmF2LWdsb2JhbC1zZWNvbmRhcnkgdWwubmVzdGVkIHtcbiAgICBtYXJnaW4tbGVmdDogMXJlbTsgfVxuICAubmF2LWdsb2JhbC1zZWNvbmRhcnkuYWxpZ24tcmlnaHQsIC5uYXYtZ2xvYmFsLXNlY29uZGFyeSB1bC5hbGlnbi1yaWdodCB7XG4gICAgZmxvYXQ6IHJpZ2h0OyB9XG4gIC5uYXYtZ2xvYmFsLXNlY29uZGFyeS5uYXYtdGllcjIgbGksIC5uYXYtZ2xvYmFsLXNlY29uZGFyeSB1bC5uYXYtdGllcjIgbGkge1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7IH1cblxuLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IC5uYXYtdGllcjIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBkaXNwbGF5OiBibG9jaztcbiAgZmxvYXQ6IHJpZ2h0O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWwgIWltcG9ydGFudDtcbiAgbGVmdDogYXV0bztcbiAgbWFyZ2luLWxlZnQ6IC05OTk5cHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBhZGRpbmc6IDAgMiUgMCA5OTk5cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDA7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICB3aWR0aDogYXV0bzsgfVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0MGVtKSB7XG4gIC5uYXYtZ2xvYmFsLXNlY29uZGFyeSB1bCB7XG4gICAgd2lkdGg6IDEwMCU7IH1cbiAgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IC5uYXYtdGllcjIgbGkge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIGNsZWFyOiBib3RoO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7IH1cbiAgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IC5uYXYtdGllcjIge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIHBhZGRpbmc6IDAuNWVtIDAgMWVtIDA7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206IDEuNWVtOyB9IH1cblxuLmJ1dHRvbi5sb2dpbiB7XG4gIHBhZGRpbmc6IDEycHggMjZweDtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICBtYXJnaW4tbGVmdDogMS41ZW07XG4gIGNvbG9yOiAjZmZmOyB9XG5cbi5tYXN0aGVhZCB7XG4gIGNsZWFyOiBib3RoO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IH1cblxuLm1hc3RoZWFkOmJlZm9yZSB7XG4gIGJhY2tncm91bmQ6IHVybChcImh0dHBzOi8vc3R5bGUuY29kZWZvcmFtZXJpY2Eub3JnLzMvc3R5bGUvaW1hZ2VzL2ltYWdlcy9tYXN0aGVhZC1kZWZhdWx0LmpwZ1wiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcbiAgY29udGVudDogXCJcIjtcbiAgZGlzcGxheTogbm9uZTtcbiAgbGVmdDogMDtcbiAgbWF4LXdpZHRoOiBub25lO1xuICBtaW4taGVpZ2h0OiA0MDBweDtcbiAgb3BhY2l0eTogMC44O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGJsb2NrOyB9XG5cbi5tYXN0aGVhZC1oZWFkZXIge1xuICBjbGVhcjogYm90aDtcbiAgZmxvYXQ6IGxlZnQ7XG4gIG1hcmdpbjogMGVtIGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBhZGRpbmc6IDAgNCU7XG4gIHBvc2l0aW9uOiBpbmhlcml0O1xuICB3aWR0aDogYXV0bztcbiAgei1pbmRleDogMTtcbiAgdGV4dC1zaGFkb3c6IDBweCAwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC42KTsgfVxuXG4ubWFzdGhlYWQtaGVhZGVyIC5wYWdlLXRpdGxlIGE6bGluaywgLm1hc3RoZWFkLWhlYWRlciAucGFnZS10aXRsZSBhOnZpc2l0ZWQsIC5tYXN0aGVhZC1oZWFkZXIgLnBhZ2UtdGl0bGUgYTpob3ZlciwgLm1hc3RoZWFkLWhlYWRlciAucGFnZS10aXRsZSBhOmZvY3VzLCAubWFzdGhlYWQtaGVhZGVyIC5wYWdlLXRpdGxlIGE6YWN0aXZlIHtcbiAgY29sb3I6IHdoaXRlO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH1cblxuLm1hc3RoZWFkLWhlYWRlciBoMS5wYWdlLXRpdGxlIHtcbiAgbWF4LXdpZHRoOiA0MGVtO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICBtYXJnaW4tdG9wOiA5NnB4OyB9XG5cbi5tYXN0aGVhZC1oZWFkZXIgcCB7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgZm9udC1zaXplOiAyNHB4O1xuICBsaW5lLWhlaWdodDogMzVweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgbWF4LXdpZHRoOiAyNWVtO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvOyB9XG5cbi5tYXN0aGVhZC14bCAubWFzdGhlYWQtaGVhZGVyOmJlZm9yZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImh0dHBzOi8vc3R5bGUuY29kZWZvcmFtZXJpY2Eub3JnLzMvc3R5bGUvaW1hZ2VzL2ZhZGUtYmxhY2sucG5nXCIpO1xuICB3aWR0aDogMTAwJTtcbiAgY29udGVudDogXCJcIjtcbiAgaGVpZ2h0OiAzMDBweDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHotaW5kZXg6IC0xO1xuICBib3R0b206IDA7XG4gIGxlZnQ6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTsgfVxuXG4uZ2xvYmFsLWZvb3RlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZDogIzAwMDtcbiAgY29sb3I6ICNmZmY7XG4gIHBhZGRpbmc6IDJlbSAyZW0gMWVtIDJlbTsgfVxuXG4uZ2xvYmFsLWZvb3RlciAubG9nbyB7XG4gIGxlZnQ6IDIlO1xuICBtYXJnaW46IDE2cHggMTZweCAxNnB4IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMHB4OyB9XG5cbi5nbG9iYWwtZm9vdGVyIHNtYWxsIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIG1hcmdpbjogMTBweCAwIDEwcHggMTIwcHg7IH1cbiIsIi8qKlxuICogRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuICogVmVyc2lvbiA2LjEuMlxuICogZm91bmRhdGlvbi56dXJiLmNvbVxuICogTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG4gKi9cblxuLy8gU2FzcyB1dGlsaXRpZXNcbkBpbXBvcnQgJ3V0aWwvdXRpbCc7XG5cbi8vIEdsb2JhbCB2YXJpYWJsZXMgYW5kIHN0eWxlc1xuQGltcG9ydCAnZ2xvYmFsJztcblxuLy8gQ29tcG9uZW50c1xuQGltcG9ydCAnZ3JpZC9ncmlkJztcbkBpbXBvcnQgJ3R5cG9ncmFwaHkvdHlwb2dyYXBoeSc7XG5AaW1wb3J0ICdmb3Jtcy9mb3Jtcyc7XG5AaW1wb3J0ICdjb21wb25lbnRzL3Zpc2liaWxpdHknO1xuQGltcG9ydCAnY29tcG9uZW50cy9mbG9hdCc7XG5AaW1wb3J0ICdjb21wb25lbnRzL2J1dHRvbic7XG5AaW1wb3J0ICdjb21wb25lbnRzL2J1dHRvbi1ncm91cCc7XG5AaW1wb3J0ICdjb21wb25lbnRzL2FjY29yZGlvbi1tZW51JztcbkBpbXBvcnQgJ2NvbXBvbmVudHMvYWNjb3JkaW9uJztcbkBpbXBvcnQgJ2NvbXBvbmVudHMvYmFkZ2UnO1xuQGltcG9ydCAnY29tcG9uZW50cy9icmVhZGNydW1icyc7XG5AaW1wb3J0ICdjb21wb25lbnRzL2NhbGxvdXQnO1xuQGltcG9ydCAnY29tcG9uZW50cy9jbG9zZS1idXR0b24nO1xuQGltcG9ydCAnY29tcG9uZW50cy9kcmlsbGRvd24nO1xuQGltcG9ydCAnY29tcG9uZW50cy9kcm9wZG93bi1tZW51JztcbkBpbXBvcnQgJ2NvbXBvbmVudHMvZHJvcGRvd24nO1xuQGltcG9ydCAnY29tcG9uZW50cy9mbGV4LXZpZGVvJztcbkBpbXBvcnQgJ2NvbXBvbmVudHMvbGFiZWwnO1xuQGltcG9ydCAnY29tcG9uZW50cy9tZWRpYS1vYmplY3QnO1xuQGltcG9ydCAnY29tcG9uZW50cy9tZW51JztcbkBpbXBvcnQgJ2NvbXBvbmVudHMvb2ZmLWNhbnZhcyc7XG5AaW1wb3J0ICdjb21wb25lbnRzL29yYml0JztcbkBpbXBvcnQgJ2NvbXBvbmVudHMvcGFnaW5hdGlvbic7XG5AaW1wb3J0ICdjb21wb25lbnRzL3Byb2dyZXNzLWJhcic7XG5AaW1wb3J0ICdjb21wb25lbnRzL3JldmVhbCc7XG5AaW1wb3J0ICdjb21wb25lbnRzL3NsaWRlcic7XG5AaW1wb3J0ICdjb21wb25lbnRzL3N0aWNreSc7XG5AaW1wb3J0ICdjb21wb25lbnRzL3N3aXRjaCc7XG5AaW1wb3J0ICdjb21wb25lbnRzL3RhYmxlJztcbkBpbXBvcnQgJ2NvbXBvbmVudHMvdGFicyc7XG5AaW1wb3J0ICdjb21wb25lbnRzL3RpdGxlLWJhcic7XG5AaW1wb3J0ICdjb21wb25lbnRzL3RvcC1iYXInO1xuQGltcG9ydCAnY29tcG9uZW50cy90aHVtYm5haWwnO1xuQGltcG9ydCAnY29tcG9uZW50cy90b29sdGlwJztcblxuQG1peGluIGZvdW5kYXRpb24tZXZlcnl0aGluZygkZmxleDogZmFsc2UpIHtcbiAgQGluY2x1ZGUgZm91bmRhdGlvbi1nbG9iYWwtc3R5bGVzO1xuICBAaWYgbm90ICRmbGV4IHtcbiAgICBAaW5jbHVkZSBmb3VuZGF0aW9uLWdyaWQ7XG4gIH1cbiAgQGVsc2Uge1xuICAgIEBpbmNsdWRlIGZvdW5kYXRpb24tZmxleC1ncmlkO1xuICB9XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tdHlwb2dyYXBoeTtcbiAgQGluY2x1ZGUgZm91bmRhdGlvbi1idXR0b247XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tZm9ybXM7XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tdmlzaWJpbGl0eS1jbGFzc2VzO1xuICBAaW5jbHVkZSBmb3VuZGF0aW9uLWZsb2F0LWNsYXNzZXM7XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tYWNjb3JkaW9uO1xuICBAaW5jbHVkZSBmb3VuZGF0aW9uLWFjY29yZGlvbi1tZW51O1xuICBAaW5jbHVkZSBmb3VuZGF0aW9uLWJhZGdlO1xuICBAaW5jbHVkZSBmb3VuZGF0aW9uLWJyZWFkY3J1bWJzO1xuICBAaW5jbHVkZSBmb3VuZGF0aW9uLWJ1dHRvbi1ncm91cDtcbiAgQGluY2x1ZGUgZm91bmRhdGlvbi1jYWxsb3V0O1xuICBAaW5jbHVkZSBmb3VuZGF0aW9uLWNsb3NlLWJ1dHRvbjtcbiAgQGluY2x1ZGUgZm91bmRhdGlvbi1kcmlsbGRvd24tbWVudTtcbiAgQGluY2x1ZGUgZm91bmRhdGlvbi1kcm9wZG93bjtcbiAgQGluY2x1ZGUgZm91bmRhdGlvbi1kcm9wZG93bi1tZW51O1xuICBAaW5jbHVkZSBmb3VuZGF0aW9uLWZsZXgtdmlkZW87XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tbGFiZWw7XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tbWVkaWEtb2JqZWN0O1xuICBAaW5jbHVkZSBmb3VuZGF0aW9uLW1lbnU7XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tb2ZmLWNhbnZhcztcbiAgQGluY2x1ZGUgZm91bmRhdGlvbi1vcmJpdDtcbiAgQGluY2x1ZGUgZm91bmRhdGlvbi1wYWdpbmF0aW9uO1xuICBAaW5jbHVkZSBmb3VuZGF0aW9uLXByb2dyZXNzLWJhcjtcbiAgQGluY2x1ZGUgZm91bmRhdGlvbi1zbGlkZXI7XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tc3RpY2t5O1xuICBAaW5jbHVkZSBmb3VuZGF0aW9uLXJldmVhbDtcbiAgQGluY2x1ZGUgZm91bmRhdGlvbi1zd2l0Y2g7XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tdGFibGU7XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tdGFicztcbiAgQGluY2x1ZGUgZm91bmRhdGlvbi10aHVtYm5haWw7XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tdGl0bGUtYmFyO1xuICBAaW5jbHVkZSBmb3VuZGF0aW9uLXRvb2x0aXA7XG4gIEBpbmNsdWRlIGZvdW5kYXRpb24tdG9wLWJhcjtcbn1cbiIsIi8vIHNjc3MtbGludDpkaXNhYmxlIEltcG9ydGFudFJ1bGUsIFNwYWNlQWZ0ZXJDb21tYSwgU2luZ2xlTGluZVBlclByb3BlcnR5XG5cbiVtdWktZGVmYXVsdHMge1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiBtYXAtZ2V0KCRtb3Rpb24tdWktc3BlZWRzLCBkZWZhdWx0KTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IG1hcC1nZXQoJG1vdGlvbi11aS1lYXNpbmdzLCBkZWZhdWx0KTtcbn1cblxuLy8gVHJhbnNpdGlvbnNcbi8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtXG5AbWl4aW4gbW90aW9uLXVpLXRyYW5zaXRpb25zIHtcbiAgLy8gU2xpZGVcbiAgLnNsaWRlLWluLWRvd24gICAgeyBAaW5jbHVkZSBtdWktc2xpZGUoaW4sICBkb3duKTsgfVxuICAuc2xpZGUtaW4tbGVmdCAgICB7IEBpbmNsdWRlIG11aS1zbGlkZShpbiwgIHJpZ2h0KTsgfVxuICAuc2xpZGUtaW4tdXAgICAgICB7IEBpbmNsdWRlIG11aS1zbGlkZShpbiwgIGJvdHRvbSk7IH1cbiAgLnNsaWRlLWluLXJpZ2h0ICAgeyBAaW5jbHVkZSBtdWktc2xpZGUoaW4sICBsZWZ0KTsgfVxuICAuc2xpZGUtb3V0LWRvd24gICB7IEBpbmNsdWRlIG11aS1zbGlkZShvdXQsIGRvd24pOyB9XG4gIC5zbGlkZS1vdXQtcmlnaHQgIHsgQGluY2x1ZGUgbXVpLXNsaWRlKG91dCwgcmlnaHQpOyB9XG4gIC5zbGlkZS1vdXQtdXAgICAgIHsgQGluY2x1ZGUgbXVpLXNsaWRlKG91dCwgdG9wKTsgfVxuICAuc2xpZGUtb3V0LWxlZnQgICB7IEBpbmNsdWRlIG11aS1zbGlkZShvdXQsIGxlZnQpOyB9XG5cbiAgLy8gRmFkZVxuICAuZmFkZS1pbiAgeyBAaW5jbHVkZSBtdWktZmFkZShpbiwgIDAsIDEpOyB9XG4gIC5mYWRlLW91dCB7IEBpbmNsdWRlIG11aS1mYWRlKG91dCwgMSwgMCk7IH1cblxuICAvLyBIaW5nZVxuICAuaGluZ2UtaW4tZnJvbS10b3AgICAgICB7IEBpbmNsdWRlIG11aS1oaW5nZShpbiwgIHRvcCk7IH1cbiAgLmhpbmdlLWluLWZyb20tcmlnaHQgICAgeyBAaW5jbHVkZSBtdWktaGluZ2UoaW4sICByaWdodCk7IH1cbiAgLmhpbmdlLWluLWZyb20tYm90dG9tICAgeyBAaW5jbHVkZSBtdWktaGluZ2UoaW4sICBib3R0b20pOyB9XG4gIC5oaW5nZS1pbi1mcm9tLWxlZnQgICAgIHsgQGluY2x1ZGUgbXVpLWhpbmdlKGluLCAgbGVmdCk7IH1cbiAgLmhpbmdlLWluLWZyb20tbWlkZGxlLXggIHsgQGluY2x1ZGUgbXVpLWhpbmdlKGluLCAgdG9wLCAgIGNlbnRlcik7IH1cbiAgLmhpbmdlLWluLWZyb20tbWlkZGxlLXkgIHsgQGluY2x1ZGUgbXVpLWhpbmdlKGluLCAgcmlnaHQsIGNlbnRlcik7IH1cbiAgLmhpbmdlLW91dC1mcm9tLXRvcCAgICAgeyBAaW5jbHVkZSBtdWktaGluZ2Uob3V0LCB0b3ApOyB9XG4gIC5oaW5nZS1vdXQtZnJvbS1yaWdodCAgIHsgQGluY2x1ZGUgbXVpLWhpbmdlKG91dCwgcmlnaHQpOyB9XG4gIC5oaW5nZS1vdXQtZnJvbS1ib3R0b20gIHsgQGluY2x1ZGUgbXVpLWhpbmdlKG91dCwgYm90dG9tKTsgfVxuICAuaGluZ2Utb3V0LWZyb20tbGVmdCAgICB7IEBpbmNsdWRlIG11aS1oaW5nZShvdXQsIGxlZnQpOyB9XG4gIC5oaW5nZS1vdXQtZnJvbS1taWRkbGUteCB7IEBpbmNsdWRlIG11aS1oaW5nZShvdXQsIHRvcCwgICBjZW50ZXIpOyB9XG4gIC5oaW5nZS1vdXQtZnJvbS1taWRkbGUteSB7IEBpbmNsdWRlIG11aS1oaW5nZShvdXQsIHJpZ2h0LCBjZW50ZXIpOyB9XG5cbiAgLy8gU2NhbGVcbiAgLnNjYWxlLWluLXVwICAgIHsgQGluY2x1ZGUgbXVpLXpvb20oaW4sICAwLjUsIDEpOyB9XG4gIC5zY2FsZS1pbi1kb3duICB7IEBpbmNsdWRlIG11aS16b29tKGluLCAgMS41LCAxKTsgfVxuICAuc2NhbGUtb3V0LXVwICAgeyBAaW5jbHVkZSBtdWktem9vbShvdXQsIDEsIDEuNSk7IH1cbiAgLnNjYWxlLW91dC1kb3duIHsgQGluY2x1ZGUgbXVpLXpvb20ob3V0LCAxLCAwLjUpOyB9XG5cbiAgLy8gU3BpblxuICAuc3Bpbi1pbiAgICAgeyBAaW5jbHVkZSBtdWktc3BpbihpbiwgIGN3KTsgfVxuICAuc3Bpbi1vdXQgICAgeyBAaW5jbHVkZSBtdWktc3BpbihvdXQsIGN3KTsgfVxuICAuc3Bpbi1pbi1jY3cgIHsgQGluY2x1ZGUgbXVpLXNwaW4oaW4sICBjY3cpOyB9XG4gIC5zcGluLW91dC1jY3cgeyBAaW5jbHVkZSBtdWktc3BpbihvdXQsIGNjdyk7IH1cblxuICAvLyBUcmFuc2l0aW9uIE1vZGlmaWVyc1xuICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLVxuXG4gIEBlYWNoICRuYW1lLCAkdmFsdWUgaW4gJG1vdGlvbi11aS1zcGVlZHMge1xuICAgIEBpZiAkbmFtZSAhPSBkZWZhdWx0IHtcbiAgICAgIC4jeyRuYW1lfSB7IHRyYW5zaXRpb24tZHVyYXRpb246ICR2YWx1ZSAhaW1wb3J0YW50OyB9XG4gICAgfVxuICB9XG5cbiAgQGVhY2ggJG5hbWUsICR2YWx1ZSBpbiAkbW90aW9uLXVpLWVhc2luZ3Mge1xuICAgIEBpZiAkbmFtZSAhPSBkZWZhdWx0IHtcbiAgICAgIC4jeyRuYW1lfSB7IHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkdmFsdWUgIWltcG9ydGFudDsgfVxuICAgIH1cbiAgfVxuXG4gIEBlYWNoICRuYW1lLCAkdmFsdWUgaW4gJG1vdGlvbi11aS1kZWxheXMge1xuICAgIEBpZiAkbmFtZSAhPSBkZWZhdWx0IHtcbiAgICAgIC4jeyRuYW1lfS1kZWxheSB7IHRyYW5zaXRpb24tZGVsYXk6ICR2YWx1ZSAhaW1wb3J0YW50OyB9XG4gICAgfVxuICB9XG59XG5cbi8vIEFuaW1hdGlvbnNcbi8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtXG5AbWl4aW4gbW90aW9uLXVpLWFuaW1hdGlvbnMge1xuICAuc2hha2UgICAgeyBAaW5jbHVkZSBtdWktYW5pbWF0aW9uKHNoYWtlKTsgfVxuICAuc3Bpbi1jdyAgeyBAaW5jbHVkZSBtdWktYW5pbWF0aW9uKHNwaW4pOyB9XG4gIC5zcGluLWNjdyB7IEBpbmNsdWRlIG11aS1hbmltYXRpb24oc3BpbihjY3cpKTsgfVxuICAud2lnZ2xlICAgeyBAaW5jbHVkZSBtdWktYW5pbWF0aW9uKHdpZ2dsZSk7IH1cblxuICAvLyBBbmltYXRpb24gTW9kaWZpZXJzXG4gIC8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtXG4gIC5pbmZpbml0ZSB7IGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOyB9XG5cbiAgQGVhY2ggJG5hbWUsICR2YWx1ZSBpbiAkbW90aW9uLXVpLXNwZWVkcyB7XG4gICAgQGlmICRuYW1lICE9IGRlZmF1bHQge1xuICAgICAgLiN7JG5hbWV9IHsgYW5pbWF0aW9uLWR1cmF0aW9uOiAkdmFsdWUgIWltcG9ydGFudDsgfVxuICAgIH1cbiAgfVxuXG4gIEBlYWNoICRuYW1lLCAkdmFsdWUgaW4gJG1vdGlvbi11aS1lYXNpbmdzIHtcbiAgICBAaWYgJG5hbWUgIT0gZGVmYXVsdCB7XG4gICAgICAuI3skbmFtZX0geyBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkdmFsdWUgIWltcG9ydGFudDsgfVxuICAgIH1cbiAgfVxuXG4gIEBlYWNoICRuYW1lLCAkdmFsdWUgaW4gJG1vdGlvbi11aS1kZWxheXMge1xuICAgIEBpZiAkbmFtZSAhPSBkZWZhdWx0IHtcbiAgICAgIC4jeyRuYW1lfS1kZWxheSB7IGFuaW1hdGlvbi1kZWxheTogJHZhbHVlICFpbXBvcnRhbnQ7IH1cbiAgICB9XG4gIH1cbn1cbiIsIi8vLyBGb3JtYXQgZm9yIENTUyBjbGFzc2VzIGNyZWF0ZWQgd2l0aCBNb3Rpb24gVUkuXG4vLy8gQHR5cGUgTWFwXG4vLy8gQHByb3Age0Jvb2xlYW59IGFwcGVuZCBbdHJ1ZV0gLSBEZWZpbmVzIGlmIHNlbGVjdG9ycyBhcmUgY2hhaW5lZCB0byB0aGUgc2VsZWN0b3IgKGAuY2xhc3MuZW50ZXJgKSwgb3IgYXBwZW5kZWQgYXMgYSBuZXcgY2xhc3MgKGAuY2xhc3MtZW50ZXJgKS5cbi8vLyBAcHJvcCB7U3RyaW5nfSBwcmVmaXggWydtdWktJ10gLSBQcmVmaXggdG8gYWRkIGJlZm9yZSB0aGUgc3RhdGUgb2YgYSBjbGFzcy4gRW50ZXIgYW4gZW1wdHkgc3RyaW5nIHRvIHVzZSBubyBwcmVmaXguXG4vLy8gQHByb3Age1N0cmluZ30gcHJlZml4IFsnLWFjdGl2ZSddIC0gU3VmZml4IHRvIGFkZCB0byB0aGUgYWN0aXZlIHN0YXRlIGNsYXNzLlxuJG1vdGlvbi11aS1jbGFzc2VzOiAoXG4gIGNoYWluOiB0cnVlLFxuICBwcmVmaXg6ICdtdWktJyxcbiAgYWN0aXZlOiAnLWFjdGl2ZScsXG4pICFkZWZhdWx0O1xuXG4vLy8gU3RhdGUgbmFtZXMgdG8gcmVmZXJlbmNlIHdoZW4gd3JpdGluZyBtb3Rpb24gY2xhc3Nlcy4gVG8gdXNlIG11bHRpcGxlIGNsYXNzIG5hbWVzIGZvciBvbmUgc3RhdGUsIGVudGVyIGEgbGlzdCBvZiBzdHJpbmdzIGluc3RlYWQgb2Ygb25lIHN0cmluZy5cbi8vLyBAdHlwZSBNYXBcbiRtb3Rpb24tdWktc3RhdGVzOiAoXG4gIGluOiAnZW50ZXInLFxuICBvdXQ6ICdsZWF2ZScsXG4pICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBzcGVlZCB0aGF0IHRyYW5zaXRpb25zIGFuZCBhbmltYXRpb25zIHBsYXkgYXQsIGFsb25nIHdpdGggdmFsdWVzIGZvciBtb2RpZmllciBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgc3BlZWQuXG4vLy8gQHR5cGUgTWFwXG4kbW90aW9uLXVpLXNwZWVkczogKFxuICBkZWZhdWx0OiA1MDBtcyxcbiAgc2xvdzogNzUwbXMsXG4gIGZhc3Q6IDI1MG1zLFxuKSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgZGVsYXkgdG8gYWRkIGJlZm9yZSBtb3Rpb24sIGFsb25nIHdpdGggdmFsdWVzIGZvciBtb2RpZmllciBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgZGVsYXkuXG4vLy8gQHR5cGUgTWFwXG4kbW90aW9uLXVpLWRlbGF5czogKFxuICBkZWZhdWx0OiAwLFxuICBzaG9ydDogMzAwbXMsXG4gIGxvbmc6IDcwMG1zLFxuKSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgZWFzaW5nIGZvciB0cmFuc2l0aW9ucyBhbmQgYW5pbWF0aW9ucywgYWxvbmcgd2l0aCB2YWx1ZXMgZm9yIG1vZGlmaWVyIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSBlYXNpbmcuXG4vLy8gQHR5cGUgTWFwXG4kbW90aW9uLXVpLWVhc2luZ3M6IChcbiAgZGVmYXVsdDogbGluZWFyLFxuICBsaW5lYXI6IGxpbmVhcixcbiAgZWFzZTogZWFzZSxcbiAgZWFzZS1pbjogZWFzZS1pbixcbiAgZWFzZS1vdXQ6IGVhc2Utb3V0LFxuICBlYXNlLWluLW91dDogZWFzZS1pbi1vdXQsXG4gIGJvdW5jZS1pbjogY3ViaWMtYmV6aWVyKDAuNDg1LCAwLjE1NSwgMC4yNCwgMS4yNDUpLFxuICBib3VuY2Utb3V0OiBjdWJpYy1iZXppZXIoMC40ODUsIDAuMTU1LCAwLjUxNSwgMC44NDUpLFxuICBib3VuY2UtaW4tb3V0OiBjdWJpYy1iZXppZXIoMC43NiwgLTAuMjQ1LCAwLjI0LCAxLjI0NSksXG4pICFkZWZhdWx0O1xuXG4vLy8gTWlzY2VsbGFuZW91cyBzZXR0aW5ncyByZWxhdGVkIHRvIE1vdGlvbiBVSS5cbi8vLyBAdHlwZSBNYXBcbi8vLyBAcHJvcCB7Qm9vbGVhbn0gc2xpZGUtYW5kLWZhZGUgW2ZhbHNlXSAtIERlZmluZXMgaWYgc2xpZGUgbW90aW9ucyBzaG91bGQgYWxzbyBmYWRlIGluL291dC5cbi8vLyBAcHJvcCB7Qm9vbGVhbn0gc2xpZGUtYW5kLWZhZGUgW3RydWVdIC0gRGVmaW5lcyBpZiBoaW5nZSBtb3Rpb25zIHNob3VsZCBhbHNvIGZhZGUgaW4vb3V0LlxuLy8vIEBwcm9wIHtCb29sZWFufSBzbGlkZS1hbmQtZmFkZSBbdHJ1ZV0gLSBEZWZpbmVzIGlmIHNjYWxlIG1vdGlvbnMgc2hvdWxkIGFsc28gZmFkZSBpbi9vdXQuXG4vLy8gQHByb3Age0Jvb2xlYW59IHNsaWRlLWFuZC1mYWRlIFt0cnVlXSAtIERlZmluZXMgaWYgc3BpbiBtb3Rpb25zIHNob3VsZCBhbHNvIGZhZGUgaW4vb3V0LlxuJG1vdGlvbi11aS1zZXR0aW5nczogKFxuICBzbGlkZS1hbmQtZmFkZTogZmFsc2UsXG4gIGhpbmdlLWFuZC1mYWRlOiB0cnVlLFxuICBzY2FsZS1hbmQtZmFkZTogdHJ1ZSxcbiAgc3Bpbi1hbmQtZmFkZTogdHJ1ZSxcbiAgYWN0aXZhdGUtcXVldWUtY2xhc3M6ICdpcy1hbmltYXRpbmcnLFxuKSAhZGVmYXVsdDtcbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLyBzY3NzLWxpbnQ6ZGlzYWJsZSBDb2xvclZhcmlhYmxlLCBRdWFsaWZ5aW5nRWxlbWVudCwgVmVuZG9yUHJlZml4XG5cbi8vLy9cbi8vLyBAZ3JvdXAgZ2xvYmFsXG4vLy8vXG5cbi8vLyBGb250IHNpemUgYXR0cmlidXRlIGFwcGxpZWQgdG8gYDxodG1sPmAgYW5kIGA8Ym9keT5gLiBXZSB1c2UgMTAwJSBieSBkZWZhdWx0IHNvIHRoZSB2YWx1ZSBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgdXNlcidzIGJyb3dzZXIgc2V0dGluZ3MuXG4vLy8gQHR5cGUgTnVtYmVyXG4kZ2xvYmFsLWZvbnQtc2l6ZTogMTAwJSAhZGVmYXVsdDtcblxuLy8vIEdsb2JhbCB3aWR0aCBvZiB5b3VyIHNpdGUuIFVzZWQgYnkgdGhlIGdyaWQgdG8gZGV0ZXJtaW5lIHJvdyB3aWR0aC5cbi8vLyBAdHlwZSBOdW1iZXJcbiRnbG9iYWwtd2lkdGg6IHJlbS1jYWxjKDEyMDApICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBsaW5lIGhlaWdodCBmb3IgYWxsIHR5cGUuIGAkZ2xvYmFsLWxpbmVoZWlnaHRgIGlzIDI0cHggd2hpbGUgYCRnbG9iYWwtZm9udC1zaXplYCBpcyAxNnB4XG4vLy8gQHR5cGUgTnVtYmVyXG4kZ2xvYmFsLWxpbmVoZWlnaHQ6IDEuNSAhZGVmYXVsdDtcblxuLy8vIFByaW1hcnkgY29sb3IgZm9yIGludGVyYWN0aXZlIGNvbXBvbmVudHMgbGlrZSBsaW5rcyBhbmQgYnV0dG9ucy5cbi8vLyBAdHlwZSBDb2xvclxuJHByaW1hcnktY29sb3I6ICMyMTk5ZTggIWRlZmF1bHQ7XG5cbi8vLyBTZWNvbmRhcnkgY29sb3IsIHVzZWQgd2l0aCBjb21wb25lbnRzIHRoYXQgc3VwcG9ydCB0aGUgYC5zZWNvbmRhcnlgIGNsYXNzLlxuLy8vIEB0eXBlIENvbG9yXG4kc2Vjb25kYXJ5LWNvbG9yOiAjNzc3ICFkZWZhdWx0O1xuXG4vLy8gQ29sb3IgdG8gaW5kaWNhdGUgYSBwb3NpdGl2ZSBzdGF0dXMgb3IgYWN0aW9uLCB1c2VkIHdpdGggdGhlIGAuc3VjY2Vzc2AgY2xhc3MuXG4vLy8gQHR5cGUgQ29sb3JcbiRzdWNjZXNzLWNvbG9yOiAjM2FkYjc2ICFkZWZhdWx0O1xuXG4vLy8gQ29sb3IgdG8gaW5kaWNhdGUgYSBjYXV0aW9uIHN0YXR1cyBvciBhY3Rpb24sIHVzZWQgd2l0aCB0aGUgYC53YXJuaW5nYCBjbGFzcy5cbi8vLyBAdHlwZSBDb2xvclxuJHdhcm5pbmctY29sb3I6ICNmZmFlMDAgIWRlZmF1bHQ7XG5cbi8vLyBDb2xvciB0byBpbmRpY2F0ZSBhIG5lZ2F0aXZlIHN0YXR1cyBvciBhY3Rpb24sIHVzZWQgd2l0aCB0aGUgYC5hbGVydGAgY2xhc3MuXG4vLy8gQHR5cGUgQ29sb3JcbiRhbGVydC1jb2xvcjogI2VjNTg0MCAhZGVmYXVsdDtcblxuLy8vIENvbG9yIHVzZWQgZm9yIGxpZ2h0IGdyYXkgVUkgaXRlbXMuXG4vLy8gQHR5cGUgQ29sb3JcbiRsaWdodC1ncmF5OiAjZTZlNmU2ICFkZWZhdWx0O1xuXG4vLy8gQ29sb3IgdXNlZCBmb3IgbWVkaXVtIGdyYXkgVUkgaXRlbXMuXG4vLy8gQHR5cGUgQ29sb3JcbiRtZWRpdW0tZ3JheTogI2NhY2FjYSAhZGVmYXVsdDtcblxuLy8vIENvbG9yIHVzZWQgZm9yIGRhcmsgZ3JheSBVSSBpdGVtcy5cbi8vLyBAdHlwZSBDb2xvclxuJGRhcmstZ3JheTogIzhhOGE4YSAhZGVmYXVsdDtcblxuLy8vIENvbG9yIHVzZWQgZm9yIGJsYWNrIHVpIGl0ZW1zLlxuLy8vIEB0eXBlIENvbG9yXG4kYmxhY2s6ICMwYTBhMGEgIWRlZmF1bHQ7XG5cbi8vLyBDb2xvciB1c2VkIGZvciB3aGl0ZSB1aSBpdGVtcy5cbi8vLyBAdHlwZSBDb2xvclxuJHdoaXRlOiAjZmVmZWZlICFkZWZhdWx0O1xuXG4vLy8gQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgYm9keS5cbi8vLyBAdHlwZSBDb2xvclxuJGJvZHktYmFja2dyb3VuZDogJHdoaXRlICFkZWZhdWx0O1xuXG4vLy8gVGV4dCBjb2xvciBvZiB0aGUgYm9keS5cbi8vLyBAdHlwZSBDb2xvclxuJGJvZHktZm9udC1jb2xvcjogJGJsYWNrICFkZWZhdWx0O1xuXG4vLy8gRm9udCBzdGFjayBvZiB0aGUgYm9keS5cbi8vLyBAdHlwZSBMaXN0XG4kYm9keS1mb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgSGVsdmV0aWNhLCBSb2JvdG8sIEFyaWFsLCBzYW5zLXNlcmlmICFkZWZhdWx0O1xuXG4vLy8gU2V0IHRvIGB0cnVlYCB0byBlbmFibGUgYW50aWFsaWFzZWQgdHlwZSwgdXNpbmcgdGhlIGAtd2Via2l0LWZvbnQtc21vb3RoaW5nYCBhbmQgYC1tb3otb3N4LWZvbnQtc21vb3RoaW5nYCBDU1MgcHJvcGVydGllcy5cbi8vLyBAdHlwZSBCb29sZWFuXG4kYm9keS1hbnRpYWxpYXNlZDogdHJ1ZSAhZGVmYXVsdDtcblxuLy8vIEdsb2JhbCB2YWx1ZSB1c2VkIGZvciBtYXJnaW4gb24gY29tcG9uZW50cy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRnbG9iYWwtbWFyZ2luOiAxcmVtICFkZWZhdWx0O1xuXG4vLy8gR2xvYmFsIHZhbHVlIHVzZWQgZm9yIHBhZGRpbmcgb24gY29tcG9uZW50cy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRnbG9iYWwtcGFkZGluZzogMXJlbSAhZGVmYXVsdDtcblxuLy8vIEdsb2JhbCBmb250IHdlaWdodCB1c2VkIGZvciBub3JtYWwgdHlwZS5cbi8vLyBAdHlwZSBLZXl3b3JkIHwgTnVtYmVyXG4kZ2xvYmFsLXdlaWdodC1ub3JtYWw6IG5vcm1hbCAhZGVmYXVsdDtcblxuLy8vIEdsb2JhbCBmb250IHdlaWdodCB1c2VkIGZvciBib2xkIHR5cGUuXG4vLy8gQHR5cGUgS2V5d29yZCB8IE51bWJlclxuJGdsb2JhbC13ZWlnaHQtYm9sZDogYm9sZCAhZGVmYXVsdDtcblxuLy8vIEdsb2JhbCB2YWx1ZSB1c2VkIGZvciBhbGwgZWxlbWVudHMgdGhhdCBoYXZlIGEgYm9yZGVyIHJhZGl1cy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRnbG9iYWwtcmFkaXVzOiAwICFkZWZhdWx0O1xuXG4vLy8gU2V0cyB0aGUgdGV4dCBkaXJlY3Rpb24gb2YgdGhlIENTUy4gQ2FuIGJlIGVpdGhlciBgbHRyYCBvciBgcnRsYC5cbiRnbG9iYWwtdGV4dC1kaXJlY3Rpb246IGx0ciAhZGVmYXVsdDtcblxuLy8gSW50ZXJuYWwgdmFyaWFibGVzIHVzZWQgZm9yIHRleHQgZGlyZWN0aW9uXG4kZ2xvYmFsLWxlZnQ6IGlmKCRnbG9iYWwtdGV4dC1kaXJlY3Rpb24gPT0gcnRsLCByaWdodCwgbGVmdCk7XG4kZ2xvYmFsLXJpZ2h0OiBpZigkZ2xvYmFsLXRleHQtZGlyZWN0aW9uID09IHJ0bCwgbGVmdCwgcmlnaHQpO1xuXG4vLyBJbnRlcm5hbCBtYXAgdXNlZCB0byBpdGVyYXRlIHRocm91Z2ggY29sb3JzLCB0byBnZW5lcmF0ZSBDU1MgY2xhc3NlcyB3aXRoIGxlc3MgY29kZVxuJGZvdW5kYXRpb24tY29sb3JzOiAoXG4gIHByaW1hcnk6ICRwcmltYXJ5LWNvbG9yLFxuICBzZWNvbmRhcnk6ICRzZWNvbmRhcnktY29sb3IsXG4gIHN1Y2Nlc3M6ICRzdWNjZXNzLWNvbG9yLFxuICBhbGVydDogJGFsZXJ0LWNvbG9yLFxuICB3YXJuaW5nOiAkd2FybmluZy1jb2xvcixcbikgIWRlZmF1bHQ7XG5cbkBtaXhpbiBmb3VuZGF0aW9uLWdsb2JhbC1zdHlsZXMge1xuICBAaW5jbHVkZSAtemYtbm9ybWFsaXplO1xuXG4gIC8vIFRoZXNlIHN0eWxlcyBhcmUgYXBwbGllZCB0byBhIDxtZXRhPiB0YWcsIHdoaWNoIGlzIHJlYWQgYnkgdGhlIEZvdW5kYXRpb24gSmF2YVNjcmlwdFxuICAuZm91bmRhdGlvbi1tcSB7XG4gICAgZm9udC1mYW1pbHk6ICcjey16Zi1icC1zZXJpYWxpemUoJGJyZWFrcG9pbnRzKX0nO1xuICB9XG5cbiAgaHRtbCB7XG4gICAgZm9udC1zaXplOiAkZ2xvYmFsLWZvbnQtc2l6ZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB9XG5cbiAgLy8gU2V0IGJveC1zaXppbmcgZ2xvYmFsbHkgdG8gaGFuZGxlIHBhZGRpbmcgYW5kIGJvcmRlciB3aWR0aHNcbiAgKixcbiAgKjpiZWZvcmUsXG4gICo6YWZ0ZXIge1xuICAgIGJveC1zaXppbmc6IGluaGVyaXQ7XG4gIH1cblxuICAvLyBEZWZhdWx0IGJvZHkgc3R5bGVzXG4gIGJvZHkge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIGZvbnQtZmFtaWx5OiAkYm9keS1mb250LWZhbWlseTtcbiAgICBmb250LXdlaWdodDogJGdsb2JhbC13ZWlnaHQtbm9ybWFsO1xuICAgIGxpbmUtaGVpZ2h0OiAkZ2xvYmFsLWxpbmVoZWlnaHQ7XG4gICAgY29sb3I6ICRib2R5LWZvbnQtY29sb3I7XG4gICAgYmFja2dyb3VuZDogJGJvZHktYmFja2dyb3VuZDtcblxuICAgIEBpZiAoJGJvZHktYW50aWFsaWFzZWQpIHtcbiAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xuICAgICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbiAgICB9XG4gIH1cblxuICBpbWcge1xuICAgIC8vIEdyaWQgZGVmYXVsdHMgdG8gZ2V0IGltYWdlcyBhbmQgZW1iZWRzIHRvIHdvcmsgcHJvcGVybHlcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIC1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6IGJpY3ViaWM7XG5cbiAgICAvLyBHZXQgcmlkIG9mIGdhcCB1bmRlciBpbWFnZXMgYnkgbWFraW5nIHRoZW0gZGlzcGxheTogaW5saW5lLWJsb2NrOyBieSBkZWZhdWx0XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgdGV4dGFyZWEgdGFrZXMgb24gaGVpZ2h0IGF1dG9tYXRpY2FsbHlcbiAgdGV4dGFyZWEge1xuICAgIGhlaWdodDogYXV0bztcbiAgICBtaW4taGVpZ2h0OiA1MHB4O1xuICAgIGJvcmRlci1yYWRpdXM6ICRnbG9iYWwtcmFkaXVzO1xuICB9XG5cbiAgLy8gTWFrZSBzZWxlY3QgZWxlbWVudHMgYXJlIDEwMCUgd2lkdGggYnkgZGVmYXVsdFxuICBzZWxlY3Qge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci1yYWRpdXM6ICRnbG9iYWwtcmFkaXVzO1xuICB9XG5cbiAgLy8gU3R5bGVzIEdvb2dsZSBNYXBzIGFuZCBNYXBRdWVzdCBlbWJlZHMgcHJvcGVybHlcbiAgLy8gc2Nzcy1saW50OmRpc2FibGUgSWRTZWxlY3RvclxuICAjbWFwX2NhbnZhcyxcbiAgLm1hcF9jYW52YXMsXG4gIC5tcWEtZGlzcGxheSB7XG4gICAgaW1nLFxuICAgIGVtYmVkLFxuICAgIG9iamVjdCB7XG4gICAgICBtYXgtd2lkdGg6IG5vbmUgIWltcG9ydGFudDtcbiAgICB9XG4gIH1cblxuICAvLyBSZXNldCA8YnV0dG9uPiBzdHlsZXMgY3JlYXRlZCBieSBtb3N0IGJyb3dzZXJzXG4gIGJ1dHRvbiB7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlcjogMDtcbiAgICBib3JkZXItcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cztcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgfVxuXG4gIC8vIEludGVybmFsIGNsYXNzZXMgdG8gc2hvdy9oaWRlIGVsZW1lbnRzIGluIEphdmFTY3JpcHRcbiAgLmlzLXZpc2libGUge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cblxuICAuaXMtaGlkZGVuIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLy8vIExvYWRzIG5vcm1hbGl6ZS5jc3MuXG4vLy8gQGFjY2VzcyBwcml2YXRlXG5AbWl4aW4gLXpmLW5vcm1hbGl6ZSB7XG4gIC8qISBub3JtYWxpemUuY3NzIHYzLjAuMyB8IE1JVCBMaWNlbnNlIHwgZ2l0aHViLmNvbS9uZWNvbGFzL25vcm1hbGl6ZS5jc3MgKi9cblxuICAvKipcbiAgICogMS4gU2V0IGRlZmF1bHQgZm9udCBmYW1pbHkgdG8gc2Fucy1zZXJpZi5cbiAgICogMi4gUHJldmVudCBpT1MgYW5kIElFIHRleHQgc2l6ZSBhZGp1c3QgYWZ0ZXIgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSxcbiAgICogICAgd2l0aG91dCBkaXNhYmxpbmcgdXNlciB6b29tLlxuICAgKi9cblxuICBodG1sIHtcbiAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgLyogMSAqL1xuICAgIC1tcy10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovXG4gICAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGRlZmF1bHQgbWFyZ2luLlxuICAgKi9cblxuICBib2R5IHtcbiAgICBtYXJnaW46IDA7XG4gIH1cblxuICAvKiBIVE1MNSBkaXNwbGF5IGRlZmluaXRpb25zXG4gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgLyoqXG4gICAqIENvcnJlY3QgYGJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGZvciBhbnkgSFRNTDUgZWxlbWVudCBpbiBJRSA4LzkuXG4gICAqIENvcnJlY3QgYGJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGZvciBgZGV0YWlsc2Agb3IgYHN1bW1hcnlgIGluIElFIDEwLzExXG4gICAqIGFuZCBGaXJlZm94LlxuICAgKiBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYG1haW5gIGluIElFIDExLlxuICAgKi9cblxuICBhcnRpY2xlLFxuICBhc2lkZSxcbiAgZGV0YWlscyxcbiAgZmlnY2FwdGlvbixcbiAgZmlndXJlLFxuICBmb290ZXIsXG4gIGhlYWRlcixcbiAgaGdyb3VwLFxuICBtYWluLFxuICBtZW51LFxuICBuYXYsXG4gIHNlY3Rpb24sXG4gIHN1bW1hcnkge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuIENvcnJlY3QgYGlubGluZS1ibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBpbiBJRSA4LzkuXG4gICAqIDIuIE5vcm1hbGl6ZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgYHByb2dyZXNzYCBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBPcGVyYS5cbiAgICovXG5cbiAgYXVkaW8sXG4gIGNhbnZhcyxcbiAgcHJvZ3Jlc3MsXG4gIHZpZGVvIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IC8qIDEgKi9cbiAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7IC8qIDIgKi9cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2ZW50IG1vZGVybiBicm93c2VycyBmcm9tIGRpc3BsYXlpbmcgYGF1ZGlvYCB3aXRob3V0IGNvbnRyb2xzLlxuICAgKiBSZW1vdmUgZXhjZXNzIGhlaWdodCBpbiBpT1MgNSBkZXZpY2VzLlxuICAgKi9cblxuICBhdWRpbzpub3QoW2NvbnRyb2xzXSkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgaGVpZ2h0OiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHJlc3MgYFtoaWRkZW5dYCBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS8xMC5cbiAgICogSGlkZSB0aGUgYHRlbXBsYXRlYCBlbGVtZW50IGluIElFIDgvOS8xMC8xMSwgU2FmYXJpLCBhbmQgRmlyZWZveCA8IDIyLlxuICAgKi9cblxuICBbaGlkZGVuXSxcbiAgdGVtcGxhdGUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAvKiBMaW5rc1xuICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGdyYXkgYmFja2dyb3VuZCBjb2xvciBmcm9tIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbiAgICovXG5cbiAgYSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cblxuICAvKipcbiAgICogSW1wcm92ZSByZWFkYWJpbGl0eSBvZiBmb2N1c2VkIGVsZW1lbnRzIHdoZW4gdGhleSBhcmUgYWxzbyBpbiBhblxuICAgKiBhY3RpdmUvaG92ZXIgc3RhdGUuXG4gICAqL1xuXG4gIGE6YWN0aXZlLFxuICBhOmhvdmVyIHtcbiAgICBvdXRsaW5lOiAwO1xuICB9XG5cbiAgLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAvKipcbiAgICogQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS8xMC8xMSwgU2FmYXJpLCBhbmQgQ2hyb21lLlxuICAgKi9cblxuICBhYmJyW3RpdGxlXSB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRyZXNzIHN0eWxlIHNldCB0byBgYm9sZGVyYCBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4gICAqL1xuXG4gIGIsXG4gIHN0cm9uZyB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIH1cblxuICAvKipcbiAgICogQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIFNhZmFyaSBhbmQgQ2hyb21lLlxuICAgKi9cblxuICBkZm4ge1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRyZXNzIHZhcmlhYmxlIGBoMWAgZm9udC1zaXplIGFuZCBtYXJnaW4gd2l0aGluIGBzZWN0aW9uYCBhbmQgYGFydGljbGVgXG4gICAqIGNvbnRleHRzIGluIEZpcmVmb3ggNCssIFNhZmFyaSwgYW5kIENocm9tZS5cbiAgICovXG5cbiAgaDEge1xuICAgIGZvbnQtc2l6ZTogMmVtO1xuICAgIG1hcmdpbjogMC42N2VtIDA7XG4gIH1cblxuICAvKipcbiAgICogQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS5cbiAgICovXG5cbiAgbWFyayB7XG4gICAgYmFja2dyb3VuZDogI2ZmMDtcbiAgICBjb2xvcjogIzAwMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRyZXNzIGluY29uc2lzdGVudCBhbmQgdmFyaWFibGUgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAgICovXG5cbiAgc21hbGwge1xuICAgIGZvbnQtc2l6ZTogODAlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGFmZmVjdGluZyBgbGluZS1oZWlnaHRgIGluIGFsbCBicm93c2Vycy5cbiAgICovXG5cbiAgc3ViLFxuICBzdXAge1xuICAgIGZvbnQtc2l6ZTogNzUlO1xuICAgIGxpbmUtaGVpZ2h0OiAwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG4gIH1cblxuICBzdXAge1xuICAgIHRvcDogLTAuNWVtO1xuICB9XG5cbiAgc3ViIHtcbiAgICBib3R0b206IC0wLjI1ZW07XG4gIH1cblxuICAvKiBFbWJlZGRlZCBjb250ZW50XG4gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgLyoqXG4gICAqIFJlbW92ZSBib3JkZXIgd2hlbiBpbnNpZGUgYGFgIGVsZW1lbnQgaW4gSUUgOC85LzEwLlxuICAgKi9cblxuICBpbWcge1xuICAgIGJvcmRlcjogMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JyZWN0IG92ZXJmbG93IG5vdCBoaWRkZW4gaW4gSUUgOS8xMC8xMS5cbiAgICovXG5cbiAgc3ZnOm5vdCg6cm9vdCkge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cblxuICAvKiBHcm91cGluZyBjb250ZW50XG4gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgLyoqXG4gICAqIEFkZHJlc3MgbWFyZ2luIG5vdCBwcmVzZW50IGluIElFIDgvOSBhbmQgU2FmYXJpLlxuICAgKi9cblxuICBmaWd1cmUge1xuICAgIG1hcmdpbjogMWVtIDQwcHg7XG4gIH1cblxuICAvKipcbiAgICogQWRkcmVzcyBkaWZmZXJlbmNlcyBiZXR3ZWVuIEZpcmVmb3ggYW5kIG90aGVyIGJyb3dzZXJzLlxuICAgKi9cblxuICBociB7XG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgaGVpZ2h0OiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRhaW4gb3ZlcmZsb3cgaW4gYWxsIGJyb3dzZXJzLlxuICAgKi9cblxuICBwcmUge1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHJlc3Mgb2RkIGBlbWAtdW5pdCBmb250IHNpemUgcmVuZGVyaW5nIGluIGFsbCBicm93c2Vycy5cbiAgICovXG5cbiAgY29kZSxcbiAga2JkLFxuICBwcmUsXG4gIHNhbXAge1xuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTtcbiAgICBmb250LXNpemU6IDFlbTtcbiAgfVxuXG4gIC8qIEZvcm1zXG4gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgLyoqXG4gICAqIEtub3duIGxpbWl0YXRpb246IGJ5IGRlZmF1bHQsIENocm9tZSBhbmQgU2FmYXJpIG9uIE9TIFggYWxsb3cgdmVyeSBsaW1pdGVkXG4gICAqIHN0eWxpbmcgb2YgYHNlbGVjdGAsIHVubGVzcyBhIGBib3JkZXJgIHByb3BlcnR5IGlzIHNldC5cbiAgICovXG5cbiAgLyoqXG4gICAqIDEuIENvcnJlY3QgY29sb3Igbm90IGJlaW5nIGluaGVyaXRlZC5cbiAgICogICAgS25vd24gaXNzdWU6IGFmZmVjdHMgY29sb3Igb2YgZGlzYWJsZWQgZWxlbWVudHMuXG4gICAqIDIuIENvcnJlY3QgZm9udCBwcm9wZXJ0aWVzIG5vdCBiZWluZyBpbmhlcml0ZWQuXG4gICAqIDMuIEFkZHJlc3MgbWFyZ2lucyBzZXQgZGlmZmVyZW50bHkgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLlxuICAgKi9cblxuICBidXR0b24sXG4gIGlucHV0LFxuICBvcHRncm91cCxcbiAgc2VsZWN0LFxuICB0ZXh0YXJlYSB7XG4gICAgY29sb3I6IGluaGVyaXQ7IC8qIDEgKi9cbiAgICBmb250OiBpbmhlcml0OyAvKiAyICovXG4gICAgbWFyZ2luOiAwOyAvKiAzICovXG4gIH1cblxuICAvKipcbiAgICogQWRkcmVzcyBgb3ZlcmZsb3dgIHNldCB0byBgaGlkZGVuYCBpbiBJRSA4LzkvMTAvMTEuXG4gICAqL1xuXG4gIGJ1dHRvbiB7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIH1cblxuICAvKipcbiAgICogQWRkcmVzcyBpbmNvbnNpc3RlbnQgYHRleHQtdHJhbnNmb3JtYCBpbmhlcml0YW5jZSBmb3IgYGJ1dHRvbmAgYW5kIGBzZWxlY3RgLlxuICAgKiBBbGwgb3RoZXIgZm9ybSBjb250cm9sIGVsZW1lbnRzIGRvIG5vdCBpbmhlcml0IGB0ZXh0LXRyYW5zZm9ybWAgdmFsdWVzLlxuICAgKiBDb3JyZWN0IGBidXR0b25gIHN0eWxlIGluaGVyaXRhbmNlIGluIEZpcmVmb3gsIElFIDgvOS8xMC8xMSwgYW5kIE9wZXJhLlxuICAgKiBDb3JyZWN0IGBzZWxlY3RgIHN0eWxlIGluaGVyaXRhbmNlIGluIEZpcmVmb3guXG4gICAqL1xuXG4gIGJ1dHRvbixcbiAgc2VsZWN0IHtcbiAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLiBBdm9pZCB0aGUgV2ViS2l0IGJ1ZyBpbiBBbmRyb2lkIDQuMC4qIHdoZXJlICgyKSBkZXN0cm95cyBuYXRpdmUgYGF1ZGlvYFxuICAgKiAgICBhbmQgYHZpZGVvYCBjb250cm9scy5cbiAgICogMi4gQ29ycmVjdCBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIGBpbnB1dGAgdHlwZXMgaW4gaU9TLlxuICAgKiAzLiBJbXByb3ZlIHVzYWJpbGl0eSBhbmQgY29uc2lzdGVuY3kgb2YgY3Vyc29yIHN0eWxlIGJldHdlZW4gaW1hZ2UtdHlwZVxuICAgKiAgICBgaW5wdXRgIGFuZCBvdGhlcnMuXG4gICAqL1xuXG4gIGJ1dHRvbixcbiAgaHRtbCBpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCAvKiAxICovXG4gIGlucHV0W3R5cGU9XCJyZXNldFwiXSxcbiAgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSB7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IC8qIDIgKi9cbiAgICBjdXJzb3I6IHBvaW50ZXI7IC8qIDMgKi9cbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1zZXQgZGVmYXVsdCBjdXJzb3IgZm9yIGRpc2FibGVkIGVsZW1lbnRzLlxuICAgKi9cblxuICBidXR0b25bZGlzYWJsZWRdLFxuICBodG1sIGlucHV0W2Rpc2FibGVkXSB7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBpbm5lciBwYWRkaW5nIGFuZCBib3JkZXIgaW4gRmlyZWZveCA0Ky5cbiAgICovXG5cbiAgYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLFxuICBpbnB1dDo6LW1vei1mb2N1cy1pbm5lciB7XG4gICAgYm9yZGVyOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cblxuICAvKipcbiAgICogQWRkcmVzcyBGaXJlZm94IDQrIHNldHRpbmcgYGxpbmUtaGVpZ2h0YCBvbiBgaW5wdXRgIHVzaW5nIGAhaW1wb3J0YW50YCBpblxuICAgKiB0aGUgVUEgc3R5bGVzaGVldC5cbiAgICovXG5cbiAgaW5wdXQge1xuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG4gIH1cblxuICAvKipcbiAgICogSXQncyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkb24ndCBhdHRlbXB0IHRvIHN0eWxlIHRoZXNlIGVsZW1lbnRzLlxuICAgKiBGaXJlZm94J3MgaW1wbGVtZW50YXRpb24gZG9lc24ndCByZXNwZWN0IGJveC1zaXppbmcsIHBhZGRpbmcsIG9yIHdpZHRoLlxuICAgKlxuICAgKiAxLiBBZGRyZXNzIGJveCBzaXppbmcgc2V0IHRvIGBjb250ZW50LWJveGAgaW4gSUUgOC85LzEwLlxuICAgKiAyLiBSZW1vdmUgZXhjZXNzIHBhZGRpbmcgaW4gSUUgOC85LzEwLlxuICAgKi9cblxuICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0sXG4gIGlucHV0W3R5cGU9XCJyYWRpb1wiXSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLyogMSAqL1xuICAgIHBhZGRpbmc6IDA7IC8qIDIgKi9cbiAgfVxuXG4gIC8qKlxuICAgKiBGaXggdGhlIGN1cnNvciBzdHlsZSBmb3IgQ2hyb21lJ3MgaW5jcmVtZW50L2RlY3JlbWVudCBidXR0b25zLiBGb3IgY2VydGFpblxuICAgKiBgZm9udC1zaXplYCB2YWx1ZXMgb2YgdGhlIGBpbnB1dGAsIGl0IGNhdXNlcyB0aGUgY3Vyc29yIHN0eWxlIG9mIHRoZVxuICAgKiBkZWNyZW1lbnQgYnV0dG9uIHRvIGNoYW5nZSBmcm9tIGBkZWZhdWx0YCB0byBgdGV4dGAuXG4gICAqL1xuXG4gIGlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG4gIGlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxuXG4gIC8qKlxuICAgKiAxLiBBZGRyZXNzIGBhcHBlYXJhbmNlYCBzZXQgdG8gYHNlYXJjaGZpZWxkYCBpbiBTYWZhcmkgYW5kIENocm9tZS5cbiAgICogMi4gQWRkcmVzcyBgYm94LXNpemluZ2Agc2V0IHRvIGBib3JkZXItYm94YCBpbiBTYWZhcmkgYW5kIENocm9tZS5cbiAgICovXG5cbiAgaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7IC8qIDEgKi9cbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgLyogMiAqL1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBpbm5lciBwYWRkaW5nIGFuZCBzZWFyY2ggY2FuY2VsIGJ1dHRvbiBpbiBTYWZhcmkgYW5kIENocm9tZSBvbiBPUyBYLlxuICAgKiBTYWZhcmkgKGJ1dCBub3QgQ2hyb21lKSBjbGlwcyB0aGUgY2FuY2VsIGJ1dHRvbiB3aGVuIHRoZSBzZWFyY2ggaW5wdXQgaGFzXG4gICAqIHBhZGRpbmcgKGFuZCBgdGV4dGZpZWxkYCBhcHBlYXJhbmNlKS5cbiAgICovXG5cbiAgaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbixcbiAgaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBjb25zaXN0ZW50IGJvcmRlciwgbWFyZ2luLCBhbmQgcGFkZGluZy5cbiAgICogW05PVEVdIFdlIGRvbid0IGVuYWJsZSB0aGlzIHJ1bGVzZXQgaW4gRm91bmRhdGlvbiwgYmVjYXVzZSB3ZSB3YW50IHRoZSA8ZmllbGRzZXQ+IGVsZW1lbnQgdG8gaGF2ZSBwbGFpbiBzdHlsaW5nLlxuICAgKi9cblxuICAvKiBmaWVsZHNldCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgICBtYXJnaW46IDAgMnB4O1xuICAgIHBhZGRpbmc6IDAuMzVlbSAwLjYyNWVtIDAuNzVlbTtcbiAgfSAqL1xuXG4gIC8qKlxuICAgKiAxLiBDb3JyZWN0IGBjb2xvcmAgbm90IGJlaW5nIGluaGVyaXRlZCBpbiBJRSA4LzkvMTAvMTEuXG4gICAqIDIuIFJlbW92ZSBwYWRkaW5nIHNvIHBlb3BsZSBhcmVuJ3QgY2F1Z2h0IG91dCBpZiB0aGV5IHplcm8gb3V0IGZpZWxkc2V0cy5cbiAgICovXG5cbiAgbGVnZW5kIHtcbiAgICBib3JkZXI6IDA7IC8qIDEgKi9cbiAgICBwYWRkaW5nOiAwOyAvKiAyICovXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsYmFyIGluIElFIDgvOS8xMC8xMS5cbiAgICovXG5cbiAgdGV4dGFyZWEge1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICB9XG5cbiAgLyoqXG4gICAqIERvbid0IGluaGVyaXQgdGhlIGBmb250LXdlaWdodGAgKGFwcGxpZWQgYnkgYSBydWxlIGFib3ZlKS5cbiAgICogTk9URTogdGhlIGRlZmF1bHQgY2Fubm90IHNhZmVseSBiZSBjaGFuZ2VkIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIE9TIFguXG4gICAqL1xuXG4gIG9wdGdyb3VwIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgfVxuXG4gIC8qIFRhYmxlc1xuICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgbW9zdCBzcGFjaW5nIGJldHdlZW4gdGFibGUgY2VsbHMuXG4gICAqL1xuXG4gIHRhYmxlIHtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIGJvcmRlci1zcGFjaW5nOiAwO1xuICB9XG5cbiAgdGQsXG4gIHRoIHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG59XG4iLCIvLyAgRm91bmRhdGlvbiBmb3IgU2l0ZXMgU2V0dGluZ3Ncbi8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cbi8vICBUYWJsZSBvZiBDb250ZW50czpcbi8vXG4vLyAgIDEuIEdsb2JhbFxuLy8gICAyLiBCcmVha3BvaW50c1xuLy8gICAzLiBUaGUgR3JpZFxuLy8gICA0LiBCYXNlIFR5cG9ncmFwaHlcbi8vICAgNS4gVHlwb2dyYXBoeSBIZWxwZXJzXG4vLyAgIDYuIEFiaWRlXG4vLyAgIDcuIEFjY29yZGlvblxuLy8gICA4LiBBY2NvcmRpb24gTWVudVxuLy8gICA5LiBCYWRnZVxuLy8gIDEwLiBCcmVhZGNydW1ic1xuLy8gIDExLiBCdXR0b25cbi8vICAxMi4gQnV0dG9uIEdyb3VwXG4vLyAgMTMuIENhbGxvdXRcbi8vICAxNC4gQ2xvc2UgQnV0dG9uXG4vLyAgMTUuIERyaWxsZG93blxuLy8gIDE2LiBEcm9wZG93blxuLy8gIDE3LiBEcm9wZG93biBNZW51XG4vLyAgMTguIEZsZXggVmlkZW9cbi8vICAxOS4gRm9ybXNcbi8vICAyMC4gTGFiZWxcbi8vICAyMS4gTWVkaWEgT2JqZWN0XG4vLyAgMjIuIE1lbnVcbi8vICAyMy4gT2ZmLWNhbnZhc1xuLy8gIDI0LiBPcmJpdFxuLy8gIDI1LiBQYWdpbmF0aW9uXG4vLyAgMjYuIFByb2dyZXNzIEJhclxuLy8gIDI3LiBSZXZlYWxcbi8vICAyOC4gU2xpZGVyXG4vLyAgMjkuIFN3aXRjaFxuLy8gIDMwLiBUYWJsZVxuLy8gIDMxLiBUYWJzXG4vLyAgMzIuIFRodW1ibmFpbFxuLy8gIDMzLiBUaXRsZSBCYXJcbi8vICAzNC4gVG9vbHRpcFxuLy8gIDM1LiBUb3AgQmFyXG5cbkBpbXBvcnQgJ3V0aWwvdXRpbCc7XG5cbi8vIDEuIEdsb2JhbFxuLy8gLS0tLS0tLS0tXG5cbiRnbG9iYWwtZm9udC1zaXplOiAxMDAlO1xuJGdsb2JhbC13aWR0aDogcmVtLWNhbGMoMTIwMCk7XG4kZ2xvYmFsLWxpbmVoZWlnaHQ6IDEuNTtcbiRwcmltYXJ5LWNvbG9yOiAjMjE5OWU4O1xuJHNlY29uZGFyeS1jb2xvcjogIzc3NztcbiRzdWNjZXNzLWNvbG9yOiAjM2FkYjc2O1xuJHdhcm5pbmctY29sb3I6ICNmZmFlMDA7XG4kYWxlcnQtY29sb3I6ICNlYzU4NDA7XG4kbGlnaHQtZ3JheTogI2U2ZTZlNjtcbiRtZWRpdW0tZ3JheTogI2NhY2FjYTtcbiRkYXJrLWdyYXk6ICM4YThhOGE7XG4kYmxhY2s6ICMwYTBhMGE7XG4kd2hpdGU6ICNmZWZlZmU7XG4kYm9keS1iYWNrZ3JvdW5kOiAkd2hpdGU7XG4kYm9keS1mb250LWNvbG9yOiAkYmxhY2s7XG4kYm9keS1mb250LWZhbWlseTogc291cmNlLXNhbnMtcHJvLCAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIFJvYm90bywgQXJpYWwsIHNhbnMtc2VyaWY7XG4kYm9keS1hbnRpYWxpYXNlZDogdHJ1ZTtcbiRnbG9iYWwtbWFyZ2luOiAxcmVtO1xuJGdsb2JhbC1wYWRkaW5nOiAxcmVtO1xuJGdsb2JhbC13ZWlnaHQtbm9ybWFsOiBub3JtYWw7XG4kZ2xvYmFsLXdlaWdodC1ib2xkOiBib2xkO1xuJGdsb2JhbC1yYWRpdXM6IDA7XG4kZ2xvYmFsLXRleHQtZGlyZWN0aW9uOiBsdHI7XG5cbi8vIDIuIEJyZWFrcG9pbnRzXG4vLyAtLS0tLS0tLS0tLS0tLVxuXG4kYnJlYWtwb2ludHM6IChcbiAgc21hbGw6IDAsXG4gIG1lZGl1bTogNjQwcHgsXG4gIGxhcmdlOiAxMDI0cHgsXG4gIHhsYXJnZTogMTIwMHB4LFxuICB4eGxhcmdlOiAxNDQwcHgsXG4pO1xuJGJyZWFrcG9pbnQtY2xhc3NlczogKHNtYWxsIG1lZGl1bSBsYXJnZSk7XG5cbi8vIDMuIFRoZSBHcmlkXG4vLyAtLS0tLS0tLS0tLVxuXG4kZ3JpZC1yb3ctd2lkdGg6ICRnbG9iYWwtd2lkdGg7XG4kZ3JpZC1jb2x1bW4tY291bnQ6IDEyO1xuJGdyaWQtY29sdW1uLXJlc3BvbnNpdmUtZ3V0dGVyOiAoXG4gIHNtYWxsOiAyMHB4LFxuICBtZWRpdW06IDMwcHgsXG4pO1xuJGdyaWQtY29sdW1uLWFsaWduLWVkZ2U6IHRydWU7XG4kYmxvY2stZ3JpZC1tYXg6IDg7XG5cbi8vIDQuIEJhc2UgVHlwb2dyYXBoeVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiRoZWFkZXItZm9udC1mYW1pbHk6IG1lcnJpd2VhdGhlciwgc2VyaWY7IC8vJGJvZHktZm9udC1mYW1pbHk7XG4kaGVhZGVyLWZvbnQtd2VpZ2h0OiAkZ2xvYmFsLXdlaWdodC1ub3JtYWw7XG4kaGVhZGVyLWZvbnQtc3R5bGU6IG5vcm1hbDtcbiRmb250LWZhbWlseS1tb25vc3BhY2U6IENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgQ291cmllciwgbW9ub3NwYWNlO1xuJGhlYWRlci1zaXplczogKFxuICBzbWFsbDogKFxuICAgICdoMSc6IDI0LFxuICAgICdoMic6IDIwLFxuICAgICdoMyc6IDE5LFxuICAgICdoNCc6IDE4LFxuICAgICdoNSc6IDE3LFxuICAgICdoNic6IDE2LFxuICApLFxuICBtZWRpdW06IChcbiAgICAnaDEnOiA0OCxcbiAgICAnaDInOiA0MCxcbiAgICAnaDMnOiAzMSxcbiAgICAnaDQnOiAyNSxcbiAgICAnaDUnOiAyMCxcbiAgICAnaDYnOiAxNixcbiAgKSxcbik7XG4kaGVhZGVyLWNvbG9yOiBpbmhlcml0O1xuJGhlYWRlci1saW5laGVpZ2h0OiAxLjQ7XG4kaGVhZGVyLW1hcmdpbi1ib3R0b206IDAuNXJlbTtcbiRoZWFkZXItdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTtcbiRzbWFsbC1mb250LXNpemU6IDgwJTtcbiRoZWFkZXItc21hbGwtZm9udC1jb2xvcjogJG1lZGl1bS1ncmF5O1xuJHBhcmFncmFwaC1saW5laGVpZ2h0OiAxLjY7XG4kcGFyYWdyYXBoLW1hcmdpbi1ib3R0b206IDFyZW07XG4kcGFyYWdyYXBoLXRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4kY29kZS1jb2xvcjogJGJsYWNrO1xuJGNvZGUtZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1tb25vc3BhY2U7XG4kY29kZS1mb250LXdlaWdodDogJGdsb2JhbC13ZWlnaHQtbm9ybWFsO1xuJGNvZGUtYmFja2dyb3VuZDogJGxpZ2h0LWdyYXk7XG4kY29kZS1ib3JkZXI6IDFweCBzb2xpZCAkbWVkaXVtLWdyYXk7XG4kY29kZS1wYWRkaW5nOiByZW0tY2FsYygyIDUgMSk7XG4kYW5jaG9yLWNvbG9yOiAkcHJpbWFyeS1jb2xvcjtcbiRhbmNob3ItY29sb3ItaG92ZXI6IHNjYWxlLWNvbG9yKCRhbmNob3ItY29sb3IsICRsaWdodG5lc3M6IC0xNCUpO1xuJGFuY2hvci10ZXh0LWRlY29yYXRpb246IG5vbmU7XG4kYW5jaG9yLXRleHQtZGVjb3JhdGlvbi1ob3Zlcjogbm9uZTtcbiRoci13aWR0aDogJGdsb2JhbC13aWR0aDtcbiRoci1ib3JkZXI6IDFweCBzb2xpZCAkbWVkaXVtLWdyYXk7XG4kaHItbWFyZ2luOiByZW0tY2FsYygyMCkgYXV0bztcbiRsaXN0LWxpbmVoZWlnaHQ6ICRwYXJhZ3JhcGgtbGluZWhlaWdodDtcbiRsaXN0LW1hcmdpbi1ib3R0b206ICRwYXJhZ3JhcGgtbWFyZ2luLWJvdHRvbTtcbiRsaXN0LXN0eWxlLXR5cGU6IGRpc2M7XG4kbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTtcbiRsaXN0LXNpZGUtbWFyZ2luOiAxLjI1cmVtO1xuJGxpc3QtbmVzdGVkLXNpZGUtbWFyZ2luOiAxLjI1cmVtO1xuJGRlZm5saXN0LW1hcmdpbi1ib3R0b206IDFyZW07XG4kZGVmbmxpc3QtdGVybS13ZWlnaHQ6ICRnbG9iYWwtd2VpZ2h0LWJvbGQ7XG4kZGVmbmxpc3QtdGVybS1tYXJnaW4tYm90dG9tOiAwLjNyZW07XG4kYmxvY2txdW90ZS1jb2xvcjogJGRhcmstZ3JheTtcbiRibG9ja3F1b3RlLXBhZGRpbmc6IHJlbS1jYWxjKDkgMjAgMCAxOSk7XG4kYmxvY2txdW90ZS1ib3JkZXI6IDFweCBzb2xpZCAkbWVkaXVtLWdyYXk7XG4kY2l0ZS1mb250LXNpemU6IHJlbS1jYWxjKDEzKTtcbiRjaXRlLWNvbG9yOiAkZGFyay1ncmF5O1xuJGtleXN0cm9rZS1mb250OiAkZm9udC1mYW1pbHktbW9ub3NwYWNlO1xuJGtleXN0cm9rZS1jb2xvcjogJGJsYWNrO1xuJGtleXN0cm9rZS1iYWNrZ3JvdW5kOiAkbGlnaHQtZ3JheTtcbiRrZXlzdHJva2UtcGFkZGluZzogcmVtLWNhbGMoMiA0IDApO1xuJGtleXN0cm9rZS1yYWRpdXM6ICRnbG9iYWwtcmFkaXVzO1xuJGFiYnItdW5kZXJsaW5lOiAxcHggZG90dGVkICRibGFjaztcblxuLy8gNS4gVHlwb2dyYXBoeSBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuJGxlYWQtZm9udC1zaXplOiAkZ2xvYmFsLWZvbnQtc2l6ZSAqIDEuMjU7XG4kbGVhZC1saW5laGVpZ2h0OiAxLjY7XG4kc3ViaGVhZGVyLWxpbmVoZWlnaHQ6IDEuNDtcbiRzdWJoZWFkZXItY29sb3I6ICRkYXJrLWdyYXk7XG4kc3ViaGVhZGVyLWZvbnQtd2VpZ2h0OiAkZ2xvYmFsLXdlaWdodC1ub3JtYWw7XG4kc3ViaGVhZGVyLW1hcmdpbi10b3A6IDAuMnJlbTtcbiRzdWJoZWFkZXItbWFyZ2luLWJvdHRvbTogMC41cmVtO1xuJHN0YXQtZm9udC1zaXplOiAyLjVyZW07XG5cbi8vIDYuIEFiaWRlXG4vLyAtLS0tLS0tLVxuXG4kYWJpZGUtaW5wdXRzOiB0cnVlO1xuJGFiaWRlLWxhYmVsczogdHJ1ZTtcbiRpbnB1dC1iYWNrZ3JvdW5kLWludmFsaWQ6ICRhbGVydC1jb2xvcjtcbiRmb3JtLWxhYmVsLWNvbG9yLWludmFsaWQ6ICRhbGVydC1jb2xvcjtcbiRpbnB1dC1lcnJvci1jb2xvcjogJGFsZXJ0LWNvbG9yO1xuJGlucHV0LWVycm9yLWZvbnQtc2l6ZTogcmVtLWNhbGMoMTIpO1xuJGlucHV0LWVycm9yLWZvbnQtd2VpZ2h0OiAkZ2xvYmFsLXdlaWdodC1ib2xkO1xuXG4vLyA3LiBBY2NvcmRpb25cbi8vIC0tLS0tLS0tLS0tLVxuXG4kYWNjb3JkaW9uLWJhY2tncm91bmQ6ICR3aGl0ZTtcbiRhY2NvcmRpb24tcGx1c21pbnVzOiB0cnVlO1xuJGFjY29yZGlvbi1pdGVtLWNvbG9yOiBmb3JlZ3JvdW5kKCRhY2NvcmRpb24tYmFja2dyb3VuZCwgJHByaW1hcnktY29sb3IpO1xuJGFjY29yZGlvbi1pdGVtLWJhY2tncm91bmQtaG92ZXI6ICRsaWdodC1ncmF5O1xuJGFjY29yZGlvbi1pdGVtLXBhZGRpbmc6IDEuMjVyZW0gMXJlbTtcbiRhY2NvcmRpb24tY29udGVudC1iYWNrZ3JvdW5kOiAkd2hpdGU7XG4kYWNjb3JkaW9uLWNvbnRlbnQtYm9yZGVyOiAxcHggc29saWQgJGxpZ2h0LWdyYXk7XG4kYWNjb3JkaW9uLWNvbnRlbnQtY29sb3I6IGZvcmVncm91bmQoJGFjY29yZGlvbi1iYWNrZ3JvdW5kLCAkcHJpbWFyeS1jb2xvcik7XG4kYWNjb3JkaW9uLWNvbnRlbnQtcGFkZGluZzogMXJlbTtcblxuLy8gOC4gQWNjb3JkaW9uIE1lbnVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tXG5cbiRhY2NvcmRpb25tZW51LWFycm93czogdHJ1ZTtcbiRhY2NvcmRpb25tZW51LWFycm93LWNvbG9yOiAkcHJpbWFyeS1jb2xvcjtcblxuLy8gOS4gQmFkZ2Vcbi8vIC0tLS0tLS0tXG5cbiRiYWRnZS1iYWNrZ3JvdW5kOiAkcHJpbWFyeS1jb2xvcjtcbiRiYWRnZS1jb2xvcjogZm9yZWdyb3VuZCgkYmFkZ2UtYmFja2dyb3VuZCk7XG4kYmFkZ2UtcGFkZGluZzogMC4zZW07XG4kYmFkZ2UtbWlud2lkdGg6IDIuMWVtO1xuJGJhZGdlLWZvbnQtc2l6ZTogMC42cmVtO1xuXG4vLyAxMC4gQnJlYWRjcnVtYnNcbi8vIC0tLS0tLS0tLS0tLS0tLVxuXG4kYnJlYWRjcnVtYnMtbWFyZ2luOiAwIDAgJGdsb2JhbC1tYXJnaW4gMDtcbiRicmVhZGNydW1icy1pdGVtLWZvbnQtc2l6ZTogcmVtLWNhbGMoMTEpO1xuJGJyZWFkY3J1bWJzLWl0ZW0tY29sb3I6ICRwcmltYXJ5LWNvbG9yO1xuJGJyZWFkY3J1bWJzLWl0ZW0tY29sb3ItY3VycmVudDogJGJsYWNrO1xuJGJyZWFkY3J1bWJzLWl0ZW0tY29sb3ItZGlzYWJsZWQ6ICRtZWRpdW0tZ3JheTtcbiRicmVhZGNydW1icy1pdGVtLW1hcmdpbjogMC43NXJlbTtcbiRicmVhZGNydW1icy1pdGVtLXVwcGVyY2FzZTogdHJ1ZTtcbiRicmVhZGNydW1icy1pdGVtLXNsYXNoOiB0cnVlO1xuXG4vLyAxMS4gQnV0dG9uXG4vLyAtLS0tLS0tLS0tXG5cbiRidXR0b24tcGFkZGluZzogMC44NWVtIDFlbTtcbiRidXR0b24tbWFyZ2luOiAwIDAgJGdsb2JhbC1tYXJnaW4gMDtcbiRidXR0b24tZmlsbDogc29saWQ7XG4kYnV0dG9uLWJhY2tncm91bmQ6ICRwcmltYXJ5LWNvbG9yO1xuJGJ1dHRvbi1iYWNrZ3JvdW5kLWhvdmVyOiBzY2FsZS1jb2xvcigkYnV0dG9uLWJhY2tncm91bmQsICRsaWdodG5lc3M6IC0xNSUpO1xuJGJ1dHRvbi1jb2xvcjogI2ZmZjtcbiRidXR0b24tY29sb3ItYWx0OiAjMDAwO1xuJGJ1dHRvbi1yYWRpdXM6ICRnbG9iYWwtcmFkaXVzO1xuJGJ1dHRvbi1zaXplczogKFxuICB0aW55OiAwLjZyZW0sXG4gIHNtYWxsOiAwLjc1cmVtLFxuICBkZWZhdWx0OiAwLjlyZW0sXG4gIGxhcmdlOiAxLjI1cmVtLFxuKTtcbiRidXR0b24tb3BhY2l0eS1kaXNhYmxlZDogMC4yNTtcblxuLy8gMTIuIEJ1dHRvbiBHcm91cFxuLy8gLS0tLS0tLS0tLS0tLS0tLVxuXG4kYnV0dG9uZ3JvdXAtbWFyZ2luOiAxcmVtO1xuJGJ1dHRvbmdyb3VwLXNwYWNpbmc6IDFweDtcbiRidXR0b25ncm91cC1jaGlsZC1zZWxlY3RvcjogJy5idXR0b24nO1xuJGJ1dHRvbmdyb3VwLWV4cGFuZC1tYXg6IDY7XG5cbi8vIDEzLiBDYWxsb3V0XG4vLyAtLS0tLS0tLS0tLVxuXG4kY2FsbG91dC1iYWNrZ3JvdW5kOiAkd2hpdGU7XG4kY2FsbG91dC1iYWNrZ3JvdW5kLWZhZGU6IDg1JTtcbiRjYWxsb3V0LWJvcmRlcjogMXB4IHNvbGlkIHJnYmEoJGJsYWNrLCAwLjI1KTtcbiRjYWxsb3V0LW1hcmdpbjogMCAwIDFyZW0gMDtcbiRjYWxsb3V0LXBhZGRpbmc6IDFyZW07XG4kY2FsbG91dC1mb250LWNvbG9yOiAkYm9keS1mb250LWNvbG9yO1xuJGNhbGxvdXQtZm9udC1jb2xvci1hbHQ6ICRib2R5LWJhY2tncm91bmQ7XG4kY2FsbG91dC1yYWRpdXM6ICRnbG9iYWwtcmFkaXVzO1xuJGNhbGxvdXQtbGluay10aW50OiAzMCU7XG5cbi8vIDE0LiBDbG9zZSBCdXR0b25cbi8vIC0tLS0tLS0tLS0tLS0tLS1cblxuJGNsb3NlYnV0dG9uLXBvc2l0aW9uOiByaWdodCB0b3A7XG4kY2xvc2VidXR0b24tb2Zmc2V0LWhvcml6b250YWw6IDFyZW07XG4kY2xvc2VidXR0b24tb2Zmc2V0LXZlcnRpY2FsOiAwLjVyZW07XG4kY2xvc2VidXR0b24tc2l6ZTogMmVtO1xuJGNsb3NlYnV0dG9uLWxpbmVoZWlnaHQ6IDE7XG4kY2xvc2VidXR0b24tY29sb3I6ICRkYXJrLWdyYXk7XG4kY2xvc2VidXR0b24tY29sb3ItaG92ZXI6ICRibGFjaztcblxuLy8gMTUuIERyaWxsZG93blxuLy8gLS0tLS0tLS0tLS0tLVxuXG4kZHJpbGxkb3duLXRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBsaW5lYXI7XG4kZHJpbGxkb3duLWFycm93czogdHJ1ZTtcbiRkcmlsbGRvd24tYXJyb3ctY29sb3I6ICRwcmltYXJ5LWNvbG9yO1xuJGRyaWxsZG93bi1iYWNrZ3JvdW5kOiAkd2hpdGU7XG5cbi8vIDE2LiBEcm9wZG93blxuLy8gLS0tLS0tLS0tLS0tXG5cbiRkcm9wZG93bi1wYWRkaW5nOiAxcmVtO1xuJGRyb3Bkb3duLWJvcmRlcjogMXB4IHNvbGlkICRtZWRpdW0tZ3JheTtcbiRkcm9wZG93bi1mb250LXNpemU6IDFyZW07XG4kZHJvcGRvd24td2lkdGg6IDMwMHB4O1xuJGRyb3Bkb3duLXJhZGl1czogJGdsb2JhbC1yYWRpdXM7XG4kZHJvcGRvd24tc2l6ZXM6IChcbiAgdGlueTogMTAwcHgsXG4gIHNtYWxsOiAyMDBweCxcbiAgbGFyZ2U6IDQwMHB4LFxuKTtcblxuLy8gMTcuIERyb3Bkb3duIE1lbnVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tXG5cbiRkcm9wZG93bm1lbnUtYXJyb3dzOiB0cnVlO1xuJGRyb3Bkb3dubWVudS1hcnJvdy1jb2xvcjogJGFuY2hvci1jb2xvcjtcbiRkcm9wZG93bm1lbnUtbWluLXdpZHRoOiAyMDBweDtcbiRkcm9wZG93bm1lbnUtYmFja2dyb3VuZDogJHdoaXRlO1xuJGRyb3Bkb3dubWVudS1ib3JkZXI6IDFweCBzb2xpZCAkbWVkaXVtLWdyYXk7XG5cbi8vIDE4LiBGbGV4IFZpZGVvXG4vLyAtLS0tLS0tLS0tLS0tLVxuXG4kZmxleHZpZGVvLW1hcmdpbi1ib3R0b206IHJlbS1jYWxjKDE2KTtcbiRmbGV4dmlkZW8tcmF0aW86IDQgYnkgMztcbiRmbGV4dmlkZW8tcmF0aW8td2lkZXNjcmVlbjogMTYgYnkgOTtcblxuLy8gMTkuIEZvcm1zXG4vLyAtLS0tLS0tLS1cblxuJGZpZWxkc2V0LWJvcmRlcjogMXB4IHNvbGlkICRtZWRpdW0tZ3JheTtcbiRmaWVsZHNldC1wYWRkaW5nOiByZW0tY2FsYygyMCk7XG4kZmllbGRzZXQtbWFyZ2luOiByZW0tY2FsYygxOCAwKTtcbiRsZWdlbmQtcGFkZGluZzogcmVtLWNhbGMoMCAzKTtcbiRmb3JtLXNwYWNpbmc6IHJlbS1jYWxjKDE2KTtcbiRoZWxwdGV4dC1jb2xvcjogIzMzMztcbiRoZWxwdGV4dC1mb250LXNpemU6IHJlbS1jYWxjKDEzKTtcbiRoZWxwdGV4dC1mb250LXN0eWxlOiBpdGFsaWM7XG4kaW5wdXQtcHJlZml4LWNvbG9yOiAkYmxhY2s7XG4kaW5wdXQtcHJlZml4LWJhY2tncm91bmQ6ICRsaWdodC1ncmF5O1xuJGlucHV0LXByZWZpeC1ib3JkZXI6IDFweCBzb2xpZCAkbWVkaXVtLWdyYXk7XG4kaW5wdXQtcHJlZml4LXBhZGRpbmc6IDFyZW07XG4kZm9ybS1sYWJlbC1jb2xvcjogJGJsYWNrO1xuJGZvcm0tbGFiZWwtZm9udC1zaXplOiByZW0tY2FsYygxNCk7XG4kZm9ybS1sYWJlbC1mb250LXdlaWdodDogJGdsb2JhbC13ZWlnaHQtbm9ybWFsO1xuJGZvcm0tbGFiZWwtbGluZS1oZWlnaHQ6IDEuODtcbiRzZWxlY3QtYmFja2dyb3VuZDogJHdoaXRlO1xuJHNlbGVjdC10cmlhbmdsZS1jb2xvcjogIzMzMztcbiRzZWxlY3QtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cztcbiRpbnB1dC1jb2xvcjogJGJsYWNrO1xuJGlucHV0LWZvbnQtZmFtaWx5OiBpbmhlcml0O1xuJGlucHV0LWZvbnQtc2l6ZTogcmVtLWNhbGMoMTYpO1xuJGlucHV0LWJhY2tncm91bmQ6ICR3aGl0ZTtcbiRpbnB1dC1iYWNrZ3JvdW5kLWZvY3VzOiAkd2hpdGU7XG4kaW5wdXQtYmFja2dyb3VuZC1kaXNhYmxlZDogJGxpZ2h0LWdyYXk7XG4kaW5wdXQtYm9yZGVyOiAxcHggc29saWQgJG1lZGl1bS1ncmF5O1xuJGlucHV0LWJvcmRlci1mb2N1czogMXB4IHNvbGlkICRkYXJrLWdyYXk7XG4kaW5wdXQtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgkYmxhY2ssIDAuMSk7XG4kaW5wdXQtc2hhZG93LWZvY3VzOiAwIDAgNXB4ICRtZWRpdW0tZ3JheTtcbiRpbnB1dC1jdXJzb3ItZGlzYWJsZWQ6IGRlZmF1bHQ7XG4kaW5wdXQtdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjVzLCBib3JkZXItY29sb3IgMC4yNXMgZWFzZS1pbi1vdXQ7XG4kaW5wdXQtbnVtYmVyLXNwaW5uZXJzOiB0cnVlO1xuJGlucHV0LXJhZGl1czogJGdsb2JhbC1yYWRpdXM7XG5cbi8vIDIwLiBMYWJlbFxuLy8gLS0tLS0tLS0tXG5cbiRsYWJlbC1iYWNrZ3JvdW5kOiAkcHJpbWFyeS1jb2xvcjtcbiRsYWJlbC1jb2xvcjogZm9yZWdyb3VuZCgkbGFiZWwtYmFja2dyb3VuZCk7XG4kbGFiZWwtZm9udC1zaXplOiAwLjhyZW07XG4kbGFiZWwtcGFkZGluZzogMC4zMzMzM3JlbSAwLjVyZW07XG4kbGFiZWwtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cztcblxuLy8gMjEuIE1lZGlhIE9iamVjdFxuLy8gLS0tLS0tLS0tLS0tLS0tLVxuXG4kbWVkaWFvYmplY3QtbWFyZ2luLWJvdHRvbTogJGdsb2JhbC1tYXJnaW47XG4kbWVkaWFvYmplY3Qtc2VjdGlvbi1wYWRkaW5nOiAkZ2xvYmFsLXBhZGRpbmc7XG4kbWVkaWFvYmplY3QtaW1hZ2Utd2lkdGgtc3RhY2tlZDogMTAwJTtcblxuLy8gMjIuIE1lbnVcbi8vIC0tLS0tLS0tXG5cbiRtZW51LW1hcmdpbjogMDtcbiRtZW51LW1hcmdpbi1uZXN0ZWQ6IDFyZW07XG4kbWVudS1pdGVtLXBhZGRpbmc6IDAuN3JlbSAxcmVtO1xuJG1lbnUtaWNvbi1zcGFjaW5nOiAwLjI1cmVtO1xuJG1lbnUtZXhwYW5kLW1heDogNjtcblxuLy8gMjMuIE9mZi1jYW52YXNcbi8vIC0tLS0tLS0tLS0tLS0tXG5cbiRvZmZjYW52YXMtc2l6ZTogMjUwcHg7XG4kb2ZmY2FudmFzLWJhY2tncm91bmQ6ICRsaWdodC1ncmF5O1xuJG9mZmNhbnZhcy16aW5kZXg6IC0xO1xuJG9mZmNhbnZhcy10cmFuc2l0aW9uLWxlbmd0aDogMC41cztcbiRvZmZjYW52YXMtdHJhbnNpdGlvbi10aW1pbmc6IGVhc2U7XG4kb2ZmY2FudmFzLWZpeGVkLXJldmVhbDogdHJ1ZTtcbiRvZmZjYW52YXMtZXhpdC1iYWNrZ3JvdW5kOiByZ2JhKCR3aGl0ZSwgMC4yNSk7XG4kbWFpbmNvbnRlbnQtY2xhc3M6ICdvZmYtY2FudmFzLWNvbnRlbnQnO1xuJG1haW5jb250ZW50LXNoYWRvdzogMCAwIDEwcHggcmdiYSgkYmxhY2ssIDAuNSk7XG5cbi8vIDI0LiBPcmJpdFxuLy8gLS0tLS0tLS0tXG5cbiRvcmJpdC1idWxsZXQtYmFja2dyb3VuZDogJG1lZGl1bS1ncmF5O1xuJG9yYml0LWJ1bGxldC1iYWNrZ3JvdW5kLWFjdGl2ZTogJGRhcmstZ3JheTtcbiRvcmJpdC1idWxsZXQtZGlhbWV0ZXI6IDEuMnJlbTtcbiRvcmJpdC1idWxsZXQtbWFyZ2luOiAwLjFyZW07XG4kb3JiaXQtYnVsbGV0LW1hcmdpbi10b3A6IDAuOHJlbTtcbiRvcmJpdC1idWxsZXQtbWFyZ2luLWJvdHRvbTogMC44cmVtO1xuJG9yYml0LWNhcHRpb24tYmFja2dyb3VuZDogcmdiYSgkYmxhY2ssIDAuNSk7XG4kb3JiaXQtY2FwdGlvbi1wYWRkaW5nOiAxcmVtO1xuJG9yYml0LWNvbnRyb2wtYmFja2dyb3VuZC1ob3ZlcjogcmdiYSgkYmxhY2ssIDAuNSk7XG4kb3JiaXQtY29udHJvbC1wYWRkaW5nOiAxcmVtO1xuJG9yYml0LWNvbnRyb2wtemluZGV4OiAxMDtcblxuLy8gMjUuIFBhZ2luYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tXG5cbiRwYWdpbmF0aW9uLWZvbnQtc2l6ZTogcmVtLWNhbGMoMTQpO1xuJHBhZ2luYXRpb24tbWFyZ2luLWJvdHRvbTogJGdsb2JhbC1tYXJnaW47XG4kcGFnaW5hdGlvbi1pdGVtLWNvbG9yOiAkYmxhY2s7XG4kcGFnaW5hdGlvbi1pdGVtLXBhZGRpbmc6IHJlbS1jYWxjKDMgMTApO1xuJHBhZ2luYXRpb24taXRlbS1zcGFjaW5nOiByZW0tY2FsYygxKTtcbiRwYWdpbmF0aW9uLXJhZGl1czogJGdsb2JhbC1yYWRpdXM7XG4kcGFnaW5hdGlvbi1pdGVtLWJhY2tncm91bmQtaG92ZXI6ICRsaWdodC1ncmF5O1xuJHBhZ2luYXRpb24taXRlbS1iYWNrZ3JvdW5kLWN1cnJlbnQ6ICRwcmltYXJ5LWNvbG9yO1xuJHBhZ2luYXRpb24taXRlbS1jb2xvci1jdXJyZW50OiBmb3JlZ3JvdW5kKCRwYWdpbmF0aW9uLWl0ZW0tYmFja2dyb3VuZC1jdXJyZW50KTtcbiRwYWdpbmF0aW9uLWl0ZW0tY29sb3ItZGlzYWJsZWQ6ICRtZWRpdW0tZ3JheTtcbiRwYWdpbmF0aW9uLWVsbGlwc2lzLWNvbG9yOiAkYmxhY2s7XG4kcGFnaW5hdGlvbi1tb2JpbGUtaXRlbXM6IGZhbHNlO1xuJHBhZ2luYXRpb24tYXJyb3dzOiB0cnVlO1xuXG4vLyAyNi4gUHJvZ3Jlc3MgQmFyXG4vLyAtLS0tLS0tLS0tLS0tLS0tXG5cbiRwcm9ncmVzcy1oZWlnaHQ6IDFyZW07XG4kcHJvZ3Jlc3MtYmFja2dyb3VuZDogJG1lZGl1bS1ncmF5O1xuJHByb2dyZXNzLW1hcmdpbi1ib3R0b206ICRnbG9iYWwtbWFyZ2luO1xuJHByb2dyZXNzLW1ldGVyLWJhY2tncm91bmQ6ICRwcmltYXJ5LWNvbG9yO1xuJHByb2dyZXNzLXJhZGl1czogJGdsb2JhbC1yYWRpdXM7XG5cbi8vIDI3LiBSZXZlYWxcbi8vIC0tLS0tLS0tLS1cblxuJHJldmVhbC1iYWNrZ3JvdW5kOiAkd2hpdGU7XG4kcmV2ZWFsLXdpZHRoOiA2MDBweDtcbiRyZXZlYWwtbWF4LXdpZHRoOiAkZ2xvYmFsLXdpZHRoO1xuJHJldmVhbC1vZmZzZXQ6IHJlbS1jYWxjKDEwMCk7XG4kcmV2ZWFsLXBhZGRpbmc6ICRnbG9iYWwtcGFkZGluZztcbiRyZXZlYWwtYm9yZGVyOiAxcHggc29saWQgJG1lZGl1bS1ncmF5O1xuJHJldmVhbC1yYWRpdXM6ICRnbG9iYWwtcmFkaXVzO1xuJHJldmVhbC16aW5kZXg6IDEwMDU7XG4kcmV2ZWFsLW92ZXJsYXktYmFja2dyb3VuZDogcmdiYSgkYmxhY2ssIDAuNDUpO1xuXG4vLyAyOC4gU2xpZGVyXG4vLyAtLS0tLS0tLS0tXG5cbiRzbGlkZXItaGVpZ2h0OiAwLjVyZW07XG4kc2xpZGVyLXdpZHRoLXZlcnRpY2FsOiAkc2xpZGVyLWhlaWdodDtcbiRzbGlkZXItYmFja2dyb3VuZDogJGxpZ2h0LWdyYXk7XG4kc2xpZGVyLWZpbGwtYmFja2dyb3VuZDogJG1lZGl1bS1ncmF5O1xuJHNsaWRlci1oYW5kbGUtaGVpZ2h0OiAxLjRyZW07XG4kc2xpZGVyLWhhbmRsZS13aWR0aDogMS40cmVtO1xuJHNsaWRlci1oYW5kbGUtYmFja2dyb3VuZDogJHByaW1hcnktY29sb3I7XG4kc2xpZGVyLW9wYWNpdHktZGlzYWJsZWQ6IDAuMjU7XG4kc2xpZGVyLXJhZGl1czogJGdsb2JhbC1yYWRpdXM7XG4kc2xpZGVyLXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0O1xuXG4vLyAyOS4gU3dpdGNoXG4vLyAtLS0tLS0tLS0tXG5cbiRzd2l0Y2gtYmFja2dyb3VuZDogJG1lZGl1bS1ncmF5O1xuJHN3aXRjaC1iYWNrZ3JvdW5kLWFjdGl2ZTogJHByaW1hcnktY29sb3I7XG4kc3dpdGNoLWhlaWdodDogMnJlbTtcbiRzd2l0Y2gtaGVpZ2h0LXRpbnk6IDEuNXJlbTtcbiRzd2l0Y2gtaGVpZ2h0LXNtYWxsOiAxLjc1cmVtO1xuJHN3aXRjaC1oZWlnaHQtbGFyZ2U6IDIuNXJlbTtcbiRzd2l0Y2gtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cztcbiRzd2l0Y2gtbWFyZ2luOiAkZ2xvYmFsLW1hcmdpbjtcbiRzd2l0Y2gtcGFkZGxlLWJhY2tncm91bmQ6ICR3aGl0ZTtcbiRzd2l0Y2gtcGFkZGxlLW9mZnNldDogMC4yNXJlbTtcbiRzd2l0Y2gtcGFkZGxlLXJhZGl1czogJGdsb2JhbC1yYWRpdXM7XG4kc3dpdGNoLXBhZGRsZS10cmFuc2l0aW9uOiBhbGwgMC4yNXMgZWFzZS1vdXQ7XG5cbi8vIDMwLiBUYWJsZVxuLy8gLS0tLS0tLS0tXG5cbiR0YWJsZS1iYWNrZ3JvdW5kOiAkd2hpdGU7XG4kdGFibGUtY29sb3Itc2NhbGU6IDUlO1xuJHRhYmxlLWJvcmRlcjogMXB4IHNvbGlkIHNtYXJ0LXNjYWxlKCR0YWJsZS1iYWNrZ3JvdW5kLCAkdGFibGUtY29sb3Itc2NhbGUpO1xuJHRhYmxlLXBhZGRpbmc6IHJlbS1jYWxjKDggMTAgMTApO1xuJHRhYmxlLWhvdmVyLXNjYWxlOiAyJTtcbiR0YWJsZS1yb3ctaG92ZXI6IGRhcmtlbigkdGFibGUtYmFja2dyb3VuZCwgJHRhYmxlLWhvdmVyLXNjYWxlKTtcbiR0YWJsZS1yb3ctc3RyaXBlLWhvdmVyOiBkYXJrZW4oJHRhYmxlLWJhY2tncm91bmQsICR0YWJsZS1jb2xvci1zY2FsZSArICR0YWJsZS1ob3Zlci1zY2FsZSk7XG4kdGFibGUtc3RyaXBlZC1iYWNrZ3JvdW5kOiBzbWFydC1zY2FsZSgkdGFibGUtYmFja2dyb3VuZCwgJHRhYmxlLWNvbG9yLXNjYWxlKTtcbiR0YWJsZS1zdHJpcGU6IGV2ZW47XG4kdGFibGUtaGVhZC1iYWNrZ3JvdW5kOiBzbWFydC1zY2FsZSgkdGFibGUtYmFja2dyb3VuZCwgJHRhYmxlLWNvbG9yLXNjYWxlIC8gMik7XG4kdGFibGUtZm9vdC1iYWNrZ3JvdW5kOiBzbWFydC1zY2FsZSgkdGFibGUtYmFja2dyb3VuZCwgJHRhYmxlLWNvbG9yLXNjYWxlKTtcbiR0YWJsZS1oZWFkLWZvbnQtY29sb3I6ICRib2R5LWZvbnQtY29sb3I7XG4kc2hvdy1oZWFkZXItZm9yLXN0YWNrZWQ6IGZhbHNlO1xuXG4vLyAzMS4gVGFic1xuLy8gLS0tLS0tLS1cblxuJHRhYi1tYXJnaW46IDA7XG4kdGFiLWJhY2tncm91bmQ6ICR3aGl0ZTtcbiR0YWItYmFja2dyb3VuZC1hY3RpdmU6ICRsaWdodC1ncmF5O1xuJHRhYi1ib3JkZXI6ICRsaWdodC1ncmF5O1xuJHRhYi1pdGVtLWNvbG9yOiBmb3JlZ3JvdW5kKCR0YWItYmFja2dyb3VuZCwgJHByaW1hcnktY29sb3IpO1xuJHRhYi1pdGVtLWJhY2tncm91bmQtaG92ZXI6ICR3aGl0ZTtcbiR0YWItaXRlbS1wYWRkaW5nOiAxLjI1cmVtIDEuNXJlbTtcbiR0YWItZXhwYW5kLW1heDogNjtcbiR0YWItY29udGVudC1iYWNrZ3JvdW5kOiAkd2hpdGU7XG4kdGFiLWNvbnRlbnQtYm9yZGVyOiAkbGlnaHQtZ3JheTtcbiR0YWItY29udGVudC1jb2xvcjogZm9yZWdyb3VuZCgkdGFiLWJhY2tncm91bmQsICRwcmltYXJ5LWNvbG9yKTtcbiR0YWItY29udGVudC1wYWRkaW5nOiAxcmVtO1xuXG4vLyAzMi4gVGh1bWJuYWlsXG4vLyAtLS0tLS0tLS0tLS0tXG5cbiR0aHVtYm5haWwtYm9yZGVyOiBzb2xpZCA0cHggJHdoaXRlO1xuJHRodW1ibmFpbC1tYXJnaW4tYm90dG9tOiAkZ2xvYmFsLW1hcmdpbjtcbiR0aHVtYm5haWwtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgkYmxhY2ssIDAuMik7XG4kdGh1bWJuYWlsLXNoYWRvdy1ob3ZlcjogMCAwIDZweCAxcHggcmdiYSgkcHJpbWFyeS1jb2xvciwgMC41KTtcbiR0aHVtYm5haWwtdHJhbnNpdGlvbjogYm94LXNoYWRvdyAyMDBtcyBlYXNlLW91dDtcbiR0aHVtYm5haWwtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cztcblxuLy8gMzMuIFRpdGxlIEJhclxuLy8gLS0tLS0tLS0tLS0tLVxuXG4kdGl0bGViYXItYmFja2dyb3VuZDogJGJsYWNrO1xuJHRpdGxlYmFyLWNvbG9yOiAkd2hpdGU7XG4kdGl0bGViYXItcGFkZGluZzogMC41cmVtO1xuJHRpdGxlYmFyLXRleHQtZm9udC13ZWlnaHQ6IGJvbGQ7XG4kdGl0bGViYXItaWNvbi1jb2xvcjogJHdoaXRlO1xuJHRpdGxlYmFyLWljb24tY29sb3ItaG92ZXI6ICRtZWRpdW0tZ3JheTtcbiR0aXRsZWJhci1pY29uLXNwYWNpbmc6IDAuMjVyZW07XG5cbi8vIDM0LiBUb29sdGlwXG4vLyAtLS0tLS0tLS0tLVxuXG4kaGFzLXRpcC1mb250LXdlaWdodDogJGdsb2JhbC13ZWlnaHQtYm9sZDtcbiRoYXMtdGlwLWJvcmRlci1ib3R0b206IGRvdHRlZCAxcHggJGRhcmstZ3JheTtcbiR0b29sdGlwLWJhY2tncm91bmQtY29sb3I6ICRibGFjaztcbiR0b29sdGlwLWNvbG9yOiAkd2hpdGU7XG4kdG9vbHRpcC1wYWRkaW5nOiAwLjc1cmVtO1xuJHRvb2x0aXAtZm9udC1zaXplOiAkc21hbGwtZm9udC1zaXplO1xuJHRvb2x0aXAtcGlwLXdpZHRoOiAwLjc1cmVtO1xuJHRvb2x0aXAtcGlwLWhlaWdodDogJHRvb2x0aXAtcGlwLXdpZHRoICogMC44NjY7XG4kdG9vbHRpcC1waXAtb2Zmc2V0OiAxLjI1cmVtO1xuJHRvb2x0aXAtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cztcblxuLy8gMzUuIFRvcCBCYXJcbi8vIC0tLS0tLS0tLS0tXG5cbiR0b3BiYXItcGFkZGluZzogMC41cmVtO1xuJHRvcGJhci1iYWNrZ3JvdW5kOiAkbGlnaHQtZ3JheTtcbiR0b3BiYXItdGl0bGUtc3BhY2luZzogMXJlbTtcbiR0b3BiYXItaW5wdXQtd2lkdGg6IDIwMHB4O1xuXG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBncmlkXG4vLy8vXG5cbi8vLyBPdXRwdXRzIENTUyBjbGFzc2VzIGZvciB0aGUgZ3JpZC5cbi8vLyBAYWNjZXNzIHByaXZhdGVcbkBtaXhpbiBmb3VuZGF0aW9uLWdyaWQoXG4gICRyb3c6ICdyb3cnLFxuICAkY29sdW1uOiAnY29sdW1uJyxcbiAgJGNvbHVtbi1yb3c6ICdjb2x1bW4tcm93JyxcbiAgJHB1c2g6ICdwdXNoJyxcbiAgJHB1bGw6ICdwdWxsJyxcbiAgJGNlbnRlcjogJ2NlbnRlcmVkJyxcbiAgJHVuY2VudGVyOiAndW5jZW50ZXJlZCcsXG4gICRjb2xsYXBzZTogJ2NvbGxhcHNlJyxcbiAgJHVuY29sbGFwc2U6ICd1bmNvbGxhcHNlJyxcbiAgJG9mZnNldDogJ29mZnNldCcsXG4gICRlbmQ6ICdlbmQnLFxuICAkZXhwYW5kZWQ6ICdleHBhbmRlZCdcbikge1xuICAvLyBSb3dcbiAgLiN7JHJvd30ge1xuICAgIEBpbmNsdWRlIGdyaWQtcm93O1xuXG4gICAgLy8gQ29sbGFwc2luZ1xuICAgICYuI3skY29sbGFwc2V9IHtcbiAgICAgID4gLiN7JGNvbHVtbn0geyBAaW5jbHVkZSBncmlkLWNvbC1jb2xsYXBzZTsgfVxuICAgIH1cblxuICAgIC8vIE5lc3RpbmdcbiAgICAmICYge1xuICAgICAgQGlmICRncmlkLWNvbHVtbi1ndXR0ZXIgPT0gbnVsbCB7XG4gICAgICAgIEBlYWNoICRicmVha3BvaW50LCAkZ3V0dGVyIGluICRncmlkLWNvbHVtbi1yZXNwb25zaXZlLWd1dHRlciB7XG4gICAgICAgICAgQGluY2x1ZGUgYnJlYWtwb2ludCgkYnJlYWtwb2ludCkge1xuICAgICAgICAgICAgQGluY2x1ZGUgZ3JpZC1yb3ctbmVzdCgkZ3V0dGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEBlbHNlIHtcbiAgICAgICAgQGluY2x1ZGUgZ3JpZC1yb3ctbmVzdCgkZ3JpZC1jb2x1bW4tZ3V0dGVyKTtcbiAgICAgIH1cblxuICAgICAgJi4jeyRjb2xsYXBzZX0ge1xuICAgICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV4cGFuZGVkIChmdWxsLXdpZHRoKSByb3dcbiAgICAmLiN7JGV4cGFuZGVkfSB7XG4gICAgICBtYXgtd2lkdGg6IG5vbmU7XG5cbiAgICAgIC4jeyRyb3d9IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgICAgIG1hcmdpbi1yaWdodDogYXV0bztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb2x1bW5cbiAgLiN7JGNvbHVtbn0ge1xuICAgIEBpbmNsdWRlIGdyaWQtY29sO1xuXG4gICAgQGlmICRncmlkLWNvbHVtbi1hbGlnbi1lZGdlIHtcbiAgICAgICYuI3skZW5kfSB7XG4gICAgICAgIEBpbmNsdWRlIGdyaWQtY29sLWVuZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb2x1bW4gcm93XG4gIC8vIFRoZSBkb3VibGUgLnJvdyBjbGFzcyBpcyBuZWVkZWQgdG8gYnVtcCB1cCB0aGUgc3BlY2lmaWNpdHlcbiAgLiN7JGNvbHVtbn0uI3skcm93fS4jeyRyb3d9IHtcbiAgICBmbG9hdDogbm9uZTtcblxuICAgIC8vIFRvIHByb3Blcmx5IG5lc3QgYSBjb2x1bW4gcm93LCBwYWRkaW5nIGFuZCBtYXJnaW4gaXMgcmVtb3ZlZFxuICAgIC4jeyRyb3d9ICYge1xuICAgICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgICAgcGFkZGluZy1yaWdodDogMDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIH1cbiAgfVxuXG4gIEBpbmNsdWRlIC16Zi1lYWNoLWJyZWFrcG9pbnQge1xuICAgIEBmb3IgJGkgZnJvbSAxIHRocm91Z2ggJGdyaWQtY29sdW1uLWNvdW50IHtcbiAgICAgIC8vIENvbHVtbiB3aWR0aFxuICAgICAgLiN7JC16Zi1zaXplfS0jeyRpfSB7XG4gICAgICAgIEBpbmNsdWRlIGdyaWQtY29sLXNpemUoJGkpO1xuICAgICAgfVxuXG4gICAgICAvLyBTb3VyY2Ugb3JkZXJpbmdcbiAgICAgIEBpZiAkaSA8ICRncmlkLWNvbHVtbi1jb3VudCB7XG4gICAgICAgIC4jeyQtemYtc2l6ZX0tI3skcHVzaH0tI3skaX0ge1xuICAgICAgICAgIEBpbmNsdWRlIGdyaWQtY29sLXBvcygkaSk7XG4gICAgICAgIH1cblxuICAgICAgICAuI3skLXpmLXNpemV9LSN7JHB1bGx9LSN7JGl9IHtcbiAgICAgICAgICBAaW5jbHVkZSBncmlkLWNvbC1wb3MoLSRpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPZmZzZXRzXG4gICAgICAkbzogJGkgLSAxO1xuXG4gICAgICAuI3skLXpmLXNpemV9LSN7JG9mZnNldH0tI3skb30ge1xuICAgICAgICBAaW5jbHVkZSBncmlkLWNvbC1vZmYoJG8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJsb2NrIGdyaWRcbiAgICBAZm9yICRpIGZyb20gMSB0aHJvdWdoICRibG9jay1ncmlkLW1heCB7XG4gICAgICAuI3skLXpmLXNpemV9LXVwLSN7JGl9IHtcbiAgICAgICAgQGluY2x1ZGUgZ3JpZC1sYXlvdXQoJGksIFwiLiN7JGNvbHVtbn1cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzcG9uc2l2ZSBjb2xsYXBzaW5nXG4gICAgLiN7JC16Zi1zaXplfS0jeyRjb2xsYXBzZX0ge1xuICAgICAgPiAuI3skY29sdW1ufSB7IEBpbmNsdWRlIGdyaWQtY29sLWNvbGxhcHNlOyB9XG5cbiAgICAgIC4jeyRyb3d9IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuI3skLXpmLXNpemV9LSN7JHVuY29sbGFwc2V9IHtcbiAgICAgICRndXR0ZXI6IG51bGw7XG5cbiAgICAgIEBpZiAkZ3JpZC1jb2x1bW4tZ3V0dGVyIHtcbiAgICAgICAgJGd1dHRlcjogJGdyaWQtY29sdW1uLWd1dHRlcjtcbiAgICAgIH1cbiAgICAgIEBlbHNlIHtcbiAgICAgICAgJGd1dHRlcjogLXpmLWdldC1icC12YWwoJGdyaWQtY29sdW1uLXJlc3BvbnNpdmUtZ3V0dGVyLCAkLXpmLXNpemUpO1xuICAgICAgfVxuICAgICAgPiAuI3skY29sdW1ufSB7IEBpbmNsdWRlIGdyaWQtY29sLXVuY29sbGFwc2UoJGd1dHRlcik7IH1cbiAgICB9XG5cbiAgICAvLyBQb3NpdGlvbmluZ1xuICAgIC4jeyQtemYtc2l6ZX0tI3skY2VudGVyfSB7XG4gICAgICBAaW5jbHVkZSBncmlkLWNvbC1wb3MoY2VudGVyKTtcbiAgICB9XG5cbiAgICAvLyBHdXR0ZXIgYWRqdXN0bWVudFxuICAgIC4jeyQtemYtc2l6ZX0tI3skdW5jZW50ZXJ9LFxuICAgIC4jeyQtemYtc2l6ZX0tI3skcHVzaH0tMCxcbiAgICAuI3skLXpmLXNpemV9LSN7JHB1bGx9LTAge1xuICAgICAgQGluY2x1ZGUgZ3JpZC1jb2wtdW5wb3M7XG4gICAgfVxuICB9XG5cbiAgQGlmICRjb2x1bW4gPT0gJ2NvbHVtbicge1xuICAgIC5jb2x1bW5zIHtcbiAgICAgIC8vIHNjc3MtbGludDpkaXNhYmxlIFBsYWNlaG9sZGVySW5FeHRlbmRcbiAgICAgIEBleHRlbmQgLmNvbHVtbjtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGdyaWRcbi8vLy9cblxuLy8vIENoYW5nZSB0aGUgYmVoYXZpb3Igb2YgY29sdW1ucyBkZWZpbmVkIGluc2lkZSB0aGlzIG1peGluIHRvIHVzZSBhIGRpZmZlcmVudCBjb2x1bW4gY291bnQuXG4vLy8gQGNvbnRlbnRcbi8vL1xuLy8vIEBwYXJhbSB7TnVtYmVyfSAkY29sdW1ucyAtIE51bWJlciBvZiBjb2x1bW5zIHRvIHVzZS5cbi8vLyBAcGFyYW0ge0Jvb2xlYW59ICRyb290IFtmYWxzZV1cbi8vLyAgIElmIGBmYWxzZWAsIHNlbGVjdG9ycyBpbnNpZGUgdGhpcyBtaXhpbiB3aWxsIG5lc3QgaW5zaWRlIHRoZSBwYXJlbnQgc2VsZWN0b3IuXG4vLy8gICBJZiBgdHJ1ZWAsIHNlbGVjdG9ycyB3aWxsIG5vdCBuZXN0LlxuQG1peGluIGdyaWQtY29udGV4dChcbiAgJGNvbHVtbnMsXG4gICRyb290OiBmYWxzZVxuKSB7XG4gIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNvbHVtbiBjb3VudCBzbyBpdCBjYW4gYmUgcmUtc2V0IGxhdGVyXG4gICRvbGQtZ3JpZC1jb2x1bW4tY291bnQ6ICRncmlkLWNvbHVtbi1jb3VudDtcbiAgJGdyaWQtY29sdW1uLWNvdW50OiAkY29sdW1ucyAhZ2xvYmFsO1xuXG4gIEBpZiAkcm9vdCB7XG4gICAgQGF0LXJvb3QgeyBAY29udGVudDsgfVxuICB9XG4gIEBlbHNlIHtcbiAgICBAY29udGVudDtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgdGhlIG9sZCBjb2x1bW4gY291bnRcbiAgJGdyaWQtY29sdW1uLWNvdW50OiAkb2xkLWdyaWQtY29sdW1uLWNvdW50O1xufVxuXG4vLy8gQ3JlYXRlcyBhIGdyaWQgcm93LlxuLy8vIEBjb250ZW50XG4vLy9cbi8vLyBAcGFyYW0ge051bWJlcn0gJGNvbHVtbnMgW251bGxdIC0gQ29sdW1uIGNvdW50IGZvciB0aGlzIHJvdy4gYG51bGxgIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGNvbHVtbiBjb3VudC5cbi8vLyBAcGFyYW0ge0tleXdvcmRzfSAkYmVoYXZpb3IgW251bGxdXG4vLy8gICBNb2RpZmljYXRpb25zIHRvIHRoZSBkZWZhdWx0IGdyaWQgc3R5bGVzLiBgbmVzdGAgaW5kaWNhdGVzIHRoZSByb3cgd2lsbCBiZSBwbGFjZWQgaW5zaWRlIGFub3RoZXIgcm93LiBgY29sbGFwc2VgIGluZGljYXRlcyB0aGF0IHRoZSBjb2x1bW5zIGluc2lkZSB0aGlzIHJvdyB3aWxsIG5vdCBoYXZlIHBhZGRpbmcuIGBuZXN0IGNvbGxhcHNlYCBjb21iaW5lcyBib3RoIGJlaGF2aW9ycy5cbi8vLyBAcGFyYW0ge051bWJlcn0gJHdpZHRoIFskZ3JpZC1yb3ctd2lkdGhdIC0gTWF4aW11bSB3aWR0aCBvZiB0aGUgcm93LlxuLy8vIEBwYXJhbSB7Qm9vbGVhbn0gJGNmIFt0cnVlXSAtIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgYSBjbGVhcmZpeC5cbi8vLyBAcGFyYW0ge051bWJlcn0gJGd1dHRlciBbJGdyaWQtY29sdW1uLWd1dHRlcl0gLSBHdXR0ZXIgdG8gdXNlIHdoZW4gaW52ZXJ0aW5nIG1hcmdpbnMsIGluIGNhc2UgdGhlIHJvdyBpcyBuZXN0ZWQuXG5AbWl4aW4gZ3JpZC1yb3coXG4gICRjb2x1bW5zOiBudWxsLFxuICAkYmVoYXZpb3I6IG51bGwsXG4gICR3aWR0aDogJGdyaWQtcm93LXdpZHRoLFxuICAkY2Y6IHRydWUsXG4gICRndXR0ZXI6ICRncmlkLWNvbHVtbi1ndXR0ZXJcbikge1xuICAkYmVoYXZpb3I6IC16Zi1nZXQtb3B0aW9ucygkYmVoYXZpb3IsIG5lc3QgY29sbGFwc2UpO1xuICAkbWFyZ2luOiBhdXRvO1xuXG4gIEBpZiBtYXAtZ2V0KCRiZWhhdmlvciwgbmVzdCkge1xuICAgIEBpbmNsdWRlIGdyaWQtcm93LW5lc3QoJGd1dHRlcik7XG5cbiAgICBAaWYgbWFwLWdldCgkYmVoYXZpb3IsIGNvbGxhcHNlKSB7XG4gICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICB9XG4gIH1cbiAgQGVsc2Uge1xuICAgIG1heC13aWR0aDogJHdpZHRoO1xuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIG1hcmdpbi1yaWdodDogYXV0bztcbiAgfVxuXG4gIEBpZiAkY2Yge1xuICAgIEBpbmNsdWRlIGNsZWFyZml4O1xuICB9XG5cbiAgQGlmICRjb2x1bW5zICE9IG51bGwge1xuICAgIEBpbmNsdWRlIGdyaWQtY29udGV4dCgkY29sdW1ucykge1xuICAgICAgQGNvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8vLyBJbnZlcnRzIHRoZSBtYXJnaW5zIG9mIGEgcm93IHRvIG5lc3QgaXQgaW5zaWRlIG9mIGEgY29sdW1uLlxuLy8vXG4vLy8gQHBhcmFtIHtNYXB8bnVsbH0gJGd1dHRlciBbbnVsbF0gLSBHdXR0ZXIgdmFsdWUgdG8gdXNlIHdoZW4gaW52ZXJ0aW5nIHRoZSBtYXJnaW5zLiBTZXQgdG8gYG51bGxgIHRvIHJlZmVyIHRvIHRoZSByZXNwb25zaXZlIGd1dHRlciBzZXR0aW5ncy5cbkBtaXhpbiBncmlkLXJvdy1uZXN0KCRndXR0ZXI6IG51bGwpIHtcbiAgQGlmICRndXR0ZXIgIT0gbnVsbCB7XG4gICAgJG1hcmdpbjogcmVtLWNhbGMoJGd1dHRlcikgLyAyICogLTE7XG4gICAgbWFyZ2luLWxlZnQ6ICRtYXJnaW47XG4gICAgbWFyZ2luLXJpZ2h0OiAkbWFyZ2luO1xuICB9XG4gIEBlbHNlIHtcbiAgICBAZWFjaCAkYnJlYWtwb2ludCwgJHZhbHVlIGluICRncmlkLWNvbHVtbi1yZXNwb25zaXZlLWd1dHRlciB7XG4gICAgICAkbWFyZ2luOiByZW0tY2FsYygkdmFsdWUpIC8gMiAqIC0xO1xuXG4gICAgICBAaW5jbHVkZSBicmVha3BvaW50KCRicmVha3BvaW50KSB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAkbWFyZ2luO1xuICAgICAgICBtYXJnaW4tcmlnaHQ6ICRtYXJnaW47XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBmdW5jdGlvbnNcbi8vLy9cblxuJGdsb2JhbC1mb250LXNpemU6IDEwMCUgIWRlZmF1bHQ7XG5cbi8vIHNjc3MtbGludDpkaXNhYmxlIFplcm9Vbml0XG5cbi8vLyBSZW1vdmVzIHRoZSB1bml0IChlLmcuIHB4LCBlbSwgcmVtKSBmcm9tIGEgdmFsdWUsIHJldHVybmluZyB0aGUgbnVtYmVyIG9ubHkuXG4vLy9cbi8vLyBAcGFyYW0ge051bWJlcn0gJG51bSAtIE51bWJlciB0byBzdHJpcCB1bml0IGZyb20uXG4vLy9cbi8vLyBAcmV0dXJucyB7TnVtYmVyfSBUaGUgc2FtZSBudW1iZXIsIHNhbnMgdW5pdC5cbkBmdW5jdGlvbiBzdHJpcC11bml0KCRudW0pIHtcbiAgQHJldHVybiAkbnVtIC8gKCRudW0gKiAwICsgMSk7XG59XG5cbi8vLyBDb252ZXJ0cyBvbmUgb3IgbW9yZSBwaXhlbCB2YWx1ZXMgaW50byBtYXRjaGluZyByZW0gdmFsdWVzLlxuLy8vXG4vLy8gQHBhcmFtIHtOdW1iZXJ8TGlzdH0gJHZhbHVlcyAtIE9uZSBvciBtb3JlIHZhbHVlcyB0byBjb252ZXJ0LiBCZSBzdXJlIHRvIHNlcGFyYXRlIHRoZW0gd2l0aCBzcGFjZXMgYW5kIG5vdCBjb21tYXMuIElmIHlvdSBuZWVkIHRvIGNvbnZlcnQgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgd3JhcCB0aGUgbGlzdCBpbiBwYXJlbnRoZXNlcy5cbi8vLyBAcGFyYW0ge051bWJlcn0gJGJhc2UgW251bGxdIC0gVGhlIGJhc2UgdmFsdWUgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGByZW1gLiBJZiB5b3UncmUgdXNpbmcgRm91bmRhdGlvbiBvdXQgb2YgdGhlIGJveCwgdGhpcyBpcyAxNnB4LiBJZiB0aGlzIHBhcmFtZXRlciBpcyBgbnVsbGAsIHRoZSBmdW5jdGlvbiB3aWxsIHJlZmVyZW5jZSB0aGUgYCRiYXNlLWZvbnQtc2l6ZWAgdmFyaWFibGUgYXMgdGhlIGJhc2UuXG4vLy9cbi8vLyBAcmV0dXJucyB7TGlzdH0gQSBsaXN0IG9mIGNvbnZlcnRlZCB2YWx1ZXMuXG5AZnVuY3Rpb24gcmVtLWNhbGMoJHZhbHVlcywgJGJhc2U6IG51bGwpIHtcbiAgJHJlbS12YWx1ZXM6ICgpO1xuICAkY291bnQ6IGxlbmd0aCgkdmFsdWVzKTtcblxuICAvLyBJZiBubyBiYXNlIGlzIGRlZmluZWQsIGRlZmVyIHRvIHRoZSBnbG9iYWwgZm9udCBzaXplXG4gIEBpZiAkYmFzZSA9PSBudWxsIHtcbiAgICAkYmFzZTogJGdsb2JhbC1mb250LXNpemU7XG4gIH1cblxuICAvLyBJZiB0aGUgYmFzZSBmb250IHNpemUgaXMgYSAlLCB0aGVuIG11bHRpcGx5IGl0IGJ5IDE2cHhcbiAgLy8gVGhpcyBpcyBiZWNhdXNlIDEwMCUgZm9udCBzaXplID0gMTZweCBpbiBtb3N0IGFsbCBicm93c2Vyc1xuICBAaWYgdW5pdCgkYmFzZSkgPT0gJyUnIHtcbiAgICAkYmFzZTogKCRiYXNlIC8gMTAwJSkgKiAxNnB4O1xuICB9XG5cbiAgQGlmICRjb3VudCA9PSAxIHtcbiAgICBAcmV0dXJuIC16Zi10by1yZW0oJHZhbHVlcywgJGJhc2UpO1xuICB9XG5cbiAgQGZvciAkaSBmcm9tIDEgdGhyb3VnaCAkY291bnQge1xuICAgICRyZW0tdmFsdWVzOiBhcHBlbmQoJHJlbS12YWx1ZXMsIC16Zi10by1yZW0obnRoKCR2YWx1ZXMsICRpKSwgJGJhc2UpKTtcbiAgfVxuXG4gIEByZXR1cm4gJHJlbS12YWx1ZXM7XG59XG5cbi8vIENvbnZlcnRzIGEgdW5pdGxlc3MsIHBpeGVsLCBvciByZW0gdmFsdWUgdG8gZW0sIGZvciB1c2UgaW4gYnJlYWtwb2ludHMuXG5AZnVuY3Rpb24gLXpmLWJwLXRvLWVtKCR2YWx1ZSkge1xuICAvLyBQaXhlbCBhbmQgdW5pdGxlc3MgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gcmVtc1xuICBAaWYgdW5pdCgkdmFsdWUpID09ICdweCcgb3IgdW5pdGxlc3MoJHZhbHVlKSB7XG4gICAgJHZhbHVlOiByZW0tY2FsYygkdmFsdWUsICRiYXNlOiAxNnB4KTtcbiAgfVxuXG4gIC8vIFRoZW4gdGhlIHZhbHVlIGlzIGNvbnZlcnRlZCB0byBlbXNcbiAgQHJldHVybiBzdHJpcC11bml0KCR2YWx1ZSkgKiAxZW07XG59XG5cbi8vLyBDb252ZXJ0cyBhIHBpeGVsIHZhbHVlIHRvIG1hdGNoaW5nIHJlbSB2YWx1ZS4gKkFueSogdmFsdWUgcGFzc2VkLCByZWdhcmRsZXNzIG9mIHVuaXQsIGlzIGFzc3VtZWQgdG8gYmUgYSBwaXhlbCB2YWx1ZS4gQnkgZGVmYXVsdCwgdGhlIGJhc2UgcGl4ZWwgdmFsdWUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHJlbSB2YWx1ZSBpcyB0YWtlbiBmcm9tIHRoZSBgJGdsb2JhbC1mb250LXNpemVgIHZhcmlhYmxlLlxuLy8vIEBhY2Nlc3MgcHJpdmF0ZVxuLy8vXG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICR2YWx1ZSAtIFBpeGVsIHZhbHVlIHRvIGNvbnZlcnQuXG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICRiYXNlIFtudWxsXSAtIEJhc2UgZm9yIHBpeGVsIGNvbnZlcnNpb24uXG4vLy9cbi8vLyBAcmV0dXJucyB7TnVtYmVyfSBBIG51bWJlciBpbiByZW1zLCBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBnaXZlbiB2YWx1ZSBhbmQgdGhlIGJhc2UgcGl4ZWwgdmFsdWUuIHJlbSB2YWx1ZXMgYXJlIHBhc3NlZCB0aHJvdWdoIGFzIGlzLlxuQGZ1bmN0aW9uIC16Zi10by1yZW0oJHZhbHVlLCAkYmFzZTogbnVsbCkge1xuICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBudW1iZXJcbiAgQGlmIHR5cGUtb2YoJHZhbHVlKSAhPSAnbnVtYmVyJyB7XG4gICAgQHdhcm4gaW5zcGVjdCgkdmFsdWUpICsgJyB3YXMgcGFzc2VkIHRvIHJlbS1jYWxjKCksIHdoaWNoIGlzIG5vdCBhIG51bWJlci4nO1xuICAgIEByZXR1cm4gJHZhbHVlO1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlIHJlbSBpZiB1bml0cyBmb3IgJHZhbHVlIGlzIG5vdCByZW1cbiAgQGlmIHVuaXQoJHZhbHVlKSAhPSAncmVtJyB7XG4gICAgJHZhbHVlOiBzdHJpcC11bml0KCR2YWx1ZSkgLyBzdHJpcC11bml0KCRiYXNlKSAqIDFyZW07XG4gIH1cblxuICAvLyBUdXJuIDByZW0gaW50byAwXG4gIEBpZiAkdmFsdWUgPT0gMHJlbSB7XG4gICAgJHZhbHVlOiAwO1xuICB9XG5cbiAgQHJldHVybiAkdmFsdWU7XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBmdW5jdGlvbnNcbi8vLy9cblxuLy8vIENyZWF0ZXMgYSBDU1MgdHJpYW5nbGUsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBkcm9wZG93biBhcnJvd3MsIGRyb3Bkb3duIHBpcHMsIGFuZCBtb3JlLiBVc2UgdGhpcyBtaXhpbiBpbnNpZGUgYSBgJjo6YmVmb3JlYCBvciBgJjo6YWZ0ZXJgIHNlbGVjdG9yLCB0byBhdHRhY2ggdGhlIHRyaWFuZ2xlIHRvIGFuIGV4aXN0aW5nIGVsZW1lbnQuXG4vLy9cbi8vLyBAcGFyYW0ge051bWJlcn0gJHRyaWFuZ2xlLXNpemUgLSBXaWR0aCBvZiB0aGUgdHJpYW5nbGUuXG4vLy8gQHBhcmFtIHtDb2xvcn0gJHRyaWFuZ2xlLWNvbG9yIC0gQ29sb3Igb2YgdGhlIHRyaWFuZ2xlLlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJHRyaWFuZ2xlLWRpcmVjdGlvbiAtIERpcmVjdGlvbiB0aGUgdHJpYW5nbGUgcG9pbnRzLiBDYW4gYmUgYHVwYCwgYHJpZ2h0YCwgYGRvd25gLCBvciBgbGVmdGAuXG5AbWl4aW4gY3NzLXRyaWFuZ2xlKFxuICAkdHJpYW5nbGUtc2l6ZSxcbiAgJHRyaWFuZ2xlLWNvbG9yLFxuICAkdHJpYW5nbGUtZGlyZWN0aW9uXG4pIHtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMDtcbiAgaGVpZ2h0OiAwO1xuICBib3JkZXI6IGluc2V0ICR0cmlhbmdsZS1zaXplO1xuXG4gIEBpZiAoJHRyaWFuZ2xlLWRpcmVjdGlvbiA9PSBkb3duKSB7XG4gICAgYm9yZGVyLWNvbG9yOiAkdHJpYW5nbGUtY29sb3IgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7XG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcbiAgfVxuICBAaWYgKCR0cmlhbmdsZS1kaXJlY3Rpb24gPT0gdXApIHtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICR0cmlhbmdsZS1jb2xvcjtcbiAgICBib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDtcbiAgICBib3JkZXItdG9wLXdpZHRoOiAwO1xuICB9XG4gIEBpZiAoJHRyaWFuZ2xlLWRpcmVjdGlvbiA9PSByaWdodCkge1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgJHRyaWFuZ2xlLWNvbG9yO1xuICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDtcbiAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7XG4gIH1cbiAgQGlmICgkdHJpYW5nbGUtZGlyZWN0aW9uID09IGxlZnQpIHtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50ICR0cmlhbmdsZS1jb2xvciB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmlnaHQtc3R5bGU6IHNvbGlkO1xuICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xuICB9XG59XG5cbi8vLyBDcmVhdGVzIGEgbWVudSBpY29uIHdpdGggYSBzZXQgd2lkdGgsIGhlaWdodCwgbnVtYmVyIG9mIGJhcnMsIGFuZCBjb2xvcnMuIFRoZSBtaXhpbiB1c2VzIHRoZSBoZWlnaHQgb2YgdGhlIGljb24gYW5kIHRoZSB3ZWlnaHQgb2YgdGhlIGJhcnMgdG8gZGV0ZXJtaW5lIHNwYWNpbmcuIDxkaXYgY2xhc3M9XCJkb2NzLWV4YW1wbGUtYnVyZ2VyXCI+PC9kaXY+XG4vLy9cbi8vLyBAcGFyYW0ge0NvbG9yfSAkY29sb3IgLSBDb2xvciB0byB1c2UgZm9yIHRoZSBpY29uLlxuLy8vIEBwYXJhbSB7Q29sb3J9ICRjb2xvci1ob3ZlciAtIENvbG9yIHRvIHVzZSB3aGVuIHRoZSBpY29uIGlzIGhvdmVyZWQgb3Zlci5cbi8vLyBAcGFyYW0ge051bWJlcn0gJHdpZHRoIC0gV2lkdGggb2YgdGhlIGljb24uXG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICRoZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGljb24uXG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICR3ZWlnaHQgLSBIZWlnaHQgb2YgaW5kaXZpZHVhbCBiYXJzIGluIHRoZSBpY29uLlxuLy8vIEBwYXJhbSB7TnVtYmVyfSAkYmFycyAtIE51bWJlciBvZiBiYXJzIGluIHRoZSBpY29uLlxuQG1peGluIGhhbWJ1cmdlcihcbiAgJGNvbG9yOiAkYmxhY2ssXG4gICRjb2xvci1ob3ZlcjogJGRhcmstZ3JheSxcbiAgJHdpZHRoOiAyMHB4LFxuICAkaGVpZ2h0OiAxNnB4LFxuICAkd2VpZ2h0OiAycHgsXG4gICRiYXJzOiAzXG4pIHtcbiAgLy8gYm94LXNoYWRvdyBDU1Mgb3V0cHV0XG4gICRzaGFkb3c6ICgpO1xuICAkaG92ZXItc2hhZG93OiAoKTtcblxuICAvLyBTcGFjaW5nIGJldHdlZW4gYmFycyBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhlIGljb24gYW5kIHRoZSB3ZWlnaHQgb2YgZWFjaCBiYXJcbiAgJHNwYWNpbmc6IGZsb29yKCgkaGVpZ2h0IC0gKCR3ZWlnaHQgKiAkYmFycykpIC8gKCRiYXJzIC0gMSkpO1xuXG4gIC8vIEljb24gY29udGFpbmVyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHdpZHRoOiAkd2lkdGg7XG4gIGhlaWdodDogJGhlaWdodDtcblxuICAvLyBJY29uIGJhcnNcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6ICR3ZWlnaHQ7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuXG4gICAgQGZvciAkaSBmcm9tIDIgdGhyb3VnaCAkYmFycyB7XG4gICAgICAkb2Zmc2V0OiAoJHdlaWdodCArICRzcGFjaW5nKSAqICgkaSAtIDEpO1xuICAgICAgJHNoYWRvdzogYXBwZW5kKCRzaGFkb3csIDAgJG9mZnNldCAwICRjb2xvciwgY29tbWEpO1xuICAgIH1cblxuICAgIGJveC1zaGFkb3c6ICRzaGFkb3c7XG4gIH1cblxuICAvLyBIb3ZlciBzdGF0ZVxuICBAaWYgJGNvbG9yLWhvdmVyIHtcbiAgICAvLyBHZW5lcmF0ZSBDU1NcbiAgICBAZm9yICRpIGZyb20gMiB0aHJvdWdoICRiYXJzIHtcbiAgICAgICRvZmZzZXQ6ICgkd2VpZ2h0ICsgJHNwYWNpbmcpICogKCRpIC0gMSk7XG4gICAgICAkaG92ZXItc2hhZG93OiBhcHBlbmQoJGhvdmVyLXNoYWRvdywgMCAkb2Zmc2V0IDAgJGNvbG9yLWhvdmVyLCBjb21tYSk7XG4gICAgfVxuXG4gICAgJjpob3Zlcjo6YWZ0ZXIge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWhvdmVyO1xuICAgICAgYm94LXNoYWRvdzogJGhvdmVyLXNoYWRvdztcbiAgICB9XG4gIH1cbn1cblxuLy8vIEFkZHMgYSBkb3dud2FyZC1mYWNpbmcgdHJpYW5nbGUgYXMgYSBiYWNrZ3JvdW5kIGltYWdlIHRvIGFuIGVsZW1lbnQuIFRoZSBpbWFnZSBpcyBmb3JtYXR0ZWQgYXMgYW4gU1ZHLCBtYWtpbmcgaXQgZWFzeSB0byBjaGFuZ2UgdGhlIGNvbG9yLiBCZWNhdXNlIEludGVybmV0IEV4cGxvcmVyIGRvZXNuJ3Qgc3VwcG9ydCBlbmNvZGVkIFNWR3MgYXMgYmFja2dyb3VuZCBpbWFnZXMsIGEgUE5HIGZhbGxiYWNrIGlzIGFsc28gaW5jbHVkZWQuXG4vLy8gVGhlcmUgYXJlIHR3byBQTkcgZmFsbGJhY2tzOiBhIGJsYWNrIHRyaWFuZ2xlIGFuZCBhIHdoaXRlIHRyaWFuZ2xlLiBUaGUgb25lIHVzZWQgZGVwZW5kcyBvbiB0aGUgbGlnaHRuZXNzIG9mIHRoZSBpbnB1dCBjb2xvci5cbi8vL1xuLy8vIEBwYXJhbSB7Q29sb3J9ICRjb2xvciBbJGJsYWNrXSAtIENvbG9yIHRvIHVzZSBmb3IgdGhlIHRyaWFuZ2xlLlxuQG1peGluIGJhY2tncm91bmQtdHJpYW5nbGUoJGNvbG9yOiAkYmxhY2spIHtcbiAgJHJnYjogJ3JnYiUyOCN7cmVkKCRjb2xvcil9LCAje2dyZWVuKCRjb2xvcil9LCAje2JsdWUoJGNvbG9yKX0lMjknO1xuXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmVyc2lvbj1cIjEuMVwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMzIgMjRcIj48cG9seWdvbiBwb2ludHM9XCIwLDAgMzIsMCAxNiwyNFwiIHN0eWxlPVwiZmlsbDogI3skcmdifVwiPjwvcG9seWdvbj48L3N2Zz4nKTtcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOjBcXDApIHtcbiAgICBAaWYgbGlnaHRuZXNzKCRjb2xvcikgPCA1MCUge1xuICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQVlDQVlBQUFDYlUvODBBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUlwSlJFRlVlTnJFa2NrTmdEQU1CQmZSa0V0ME9iUkJCZHNHWFVEZ21RZks0WGhIMm04Y3pRQUF5MjdSM3RzdzRRZmUyeDh1T082b1lMYjZHbE9vcjNHRitzd1VSQU9tVUorUnd0RUpzOVd2VEdFWXhCWHFJMU1RQVpoQ2ZVUUtSekRNVmorVHdyQUlWNmp2U1VFa1lBcjFMU2tjeVRCYi9WK0tZZlg3eEFldXNxM3NMRHRHSDNrRUdBQ1BXSWZsTlpmaFJRQUFBQUJKUlU1RXJrSmdnZz09Jyk7XG4gICAgfVxuICAgIEBlbHNlIHtcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFZQ0FZQUFBQ2JVLzgwQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFNQkpSRUZVZU5yRWxsc09oQ0FNUlZzekM5SWx6VTdLQ21WSFRKc29NV1lNVXRweXY5QmdidVhRQjVaU2RnQllZWTR5Y2dCaXZrOEtZRnNRTWZNaVRUQlA0bzNuVXpDS3pPYWJMSmJMeTIvZzMxZXZHa0FnaW5SNC9aZWdLSDVxWDNiSkNzY0EzdDB4M2tnTzV0UUZ5aGhGZjUweFJxRkxieU1VTkpRemd5akdTL3dnQ3B2S3FrUkJwdVdyRTRWOWQrMUU0ZFBVWHFJZzEwN1NRT0UvMkRSUXhNd1REeWdJSW5WREVUOVQzbENvai82ai9WQ21HalpPbDJsS3BaOEFBd0RRUDd6SWltREdGUUFBQUFCSlJVNUVya0pnZ2c9PScpO1xuICAgIH1cbiAgfVxufVxuXG4vLy8gQXBwbGllcyB0aGUgbWljcm8gY2xlYXJmaXggaGFjayBwb3B1bGFyaXplZCBieSBOaWNvbGFzIEdhbGxhZ2hlci4gSW5jbHVkZSB0aGlzIG1peGluIG9uIGEgY29udGFpbmVyIGlmIGl0cyBjaGlsZHJlbiBhcmUgYWxsIGZsb2F0ZWQsIHRvIGdpdmUgdGhlIGNvbnRhaW5lciBhIHByb3BlciBoZWlnaHQuXG4vLy8gQGxpbmsgaHR0cDovL25pY29sYXNnYWxsYWdoZXIuY29tL21pY3JvLWNsZWFyZml4LWhhY2svIE1pY3JvIENsZWFyZml4IEhhY2tcbkBtaXhpbiBjbGVhcmZpeCB7XG4gICY6OmJlZm9yZSxcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcgJztcbiAgICBkaXNwbGF5OiB0YWJsZTtcbiAgfVxuXG4gICY6OmFmdGVyIHtcbiAgICBjbGVhcjogYm90aDtcbiAgfVxufVxuXG4vLy8gQWRkcyBDU1MgZm9yIGEgXCJxdWFudGl0eSBxdWVyeVwiIHNlbGVjdG9yIHRoYXQgYXV0b21hdGljYWxseSBzaXplcyBlbGVtZW50cyBiYXNlZCBvbiBob3cgbWFueSB0aGVyZSBhcmUgaW5zaWRlIGEgY29udGFpbmVyLlxuLy8vIEBsaW5rIGh0dHA6Ly9hbGlzdGFwYXJ0LmNvbS9hcnRpY2xlL3F1YW50aXR5LXF1ZXJpZXMtZm9yLWNzcyBRdWFudGl0eSBRdWVyaWVzIGZvciBDU1Ncbi8vL1xuLy8vIEBwYXJhbSB7TnVtYmVyfSAkbWF4IC0gTWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gZGV0ZWN0LiBUaGUgaGlnaGVyIHRoaXMgbnVtYmVyIGlzLCB0aGUgbW9yZSBDU1MgdGhhdCdzIHJlcXVpcmVkIHRvIGNvdmVyIGVhY2ggbnVtYmVyIG9mIGl0ZW1zLlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJGVsZW0gW2xpXSAtIFRhZyB0byB1c2UgZm9yIHNpYmxpbmcgc2VsZWN0b3JzLlxuQG1peGluIGF1dG8td2lkdGgoJG1heCwgJGVsZW06IGxpKSB7XG4gIEBmb3IgJGkgZnJvbSAyIHRocm91Z2ggJG1heCB7XG4gICAgJjpudGgtbGFzdC1jaGlsZCgjeyRpfSk6Zmlyc3QtY2hpbGQsXG4gICAgJjpudGgtbGFzdC1jaGlsZCgjeyRpfSk6Zmlyc3QtY2hpbGQgfiAjeyRlbGVtfSB7XG4gICAgICB3aWR0aDogcGVyY2VudGFnZSgxIC8gJGkpO1xuICAgIH1cbiAgfVxufVxuXG4vLy8gUmVtb3ZlcyB0aGUgZm9jdXMgcmluZyBhcm91bmQgYW4gZWxlbWVudCB3aGVuIGEgbW91c2UgaW5wdXQgaXMgZGV0ZWN0ZWQuXG5AbWl4aW4gZGlzYWJsZS1tb3VzZS1vdXRsaW5lIHtcbiAgW2RhdGEtd2hhdGlucHV0PSdtb3VzZSddICYge1xuICAgIG91dGxpbmU6IDA7XG4gIH1cbn1cblxuLy8vIE1ha2VzIGFuIGVsZW1lbnQgdmlzdWFsbHkgaGlkZGVuLCBidXQgc3RpbGwgYWNjZXNzaWJsZSB0byBrZXlib2FyZHMgYW5kIGFzc2lzdGl2ZSBkZXZpY2VzLlxuLy8vIEBsaW5rIGh0dHA6Ly9zbm9vay5jYS9hcmNoaXZlcy9odG1sX2FuZF9jc3MvaGlkaW5nLWNvbnRlbnQtZm9yLWFjY2Vzc2liaWxpdHkgSGlkaW5nIENvbnRlbnQgZm9yIEFjY2Vzc2liaWxpdHlcbkBtaXhpbiBlbGVtZW50LWludmlzaWJsZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1xuICB3aWR0aDogMXB4O1xuICBoZWlnaHQ6IDFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcDogcmVjdCgwLCAwLCAwLCAwKTtcbn1cblxuLy8vIFJldmVyc2VzIHRoZSBDU1Mgb3V0cHV0IGNyZWF0ZWQgYnkgdGhlIGBlbGVtZW50LWludmlzaWJsZSgpYCBtaXhpbi5cbkBtaXhpbiBlbGVtZW50LWludmlzaWJsZS1vZmYge1xuICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XG4gIGhlaWdodDogYXV0bztcbiAgd2lkdGg6IGF1dG87XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICBjbGlwOiBhdXRvO1xufVxuXG4vLy8gVmVydGljYWxseSBjZW50ZXJzIHRoZSBlbGVtZW50IGluc2lkZSBvZiBpdHMgZmlyc3Qgbm9uLXN0YXRpYyBwYXJlbnQsXG4vLy8gQGxpbmsgaHR0cDovL3d3dy5zaXRlcG9pbnQuY29tL2NlbnRlcmluZy13aXRoLXNhc3MvIENlbnRlcmluZyBXaXRoIFNhc3NcbkBtaXhpbiB2ZXJ0aWNhbC1jZW50ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG59XG5cbi8vLyBIb3Jpem9udGFsbHkgY2VudGVycyB0aGUgZWxlbWVudCBpbnNpZGUgb2YgaXRzIGZpcnN0IG5vbi1zdGF0aWMgcGFyZW50LFxuLy8vIEBsaW5rIGh0dHA6Ly93d3cuc2l0ZXBvaW50LmNvbS9jZW50ZXJpbmctd2l0aC1zYXNzLyBDZW50ZXJpbmcgV2l0aCBTYXNzXG5AbWl4aW4gaG9yaXpvbnRhbC1jZW50ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xufVxuXG4vLy8gQWJzb2x1dGVseSBjZW50ZXJzIHRoZSBlbGVtZW50IGluc2lkZSBvZiBpdHMgZmlyc3Qgbm9uLXN0YXRpYyBwYXJlbnQsXG4vLy8gQGxpbmsgaHR0cDovL3d3dy5zaXRlcG9pbnQuY29tL2NlbnRlcmluZy13aXRoLXNhc3MvIENlbnRlcmluZyBXaXRoIFNhc3NcbkBtaXhpbiBhYnNvbHV0ZS1jZW50ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xufVxuXG4vLy8gSXRlcmF0ZXMgdGhyb3VnaCBicmVha3BvaW50cyBkZWZpbmVkIGluIGAkYnJlYWtwb2ludC1jbGFzc2VzYCBhbmQgcHJpbnRzIHRoZSBDU1MgaW5zaWRlIHRoZSBtaXhpbiBhdCBlYWNoIGJyZWFrcG9pbnQncyBtZWRpYSBxdWVyeS4gVXNlIHRoaXMgd2l0aCB0aGUgZ3JpZCwgb3IgYW55IG90aGVyIGNvbXBvbmVudCB0aGF0IGhhcyByZXNwb25zaXZlIGNsYXNzZXMuXG4vLy9cbi8vLyBAcGFyYW0ge0Jvb2xlYW59ICRzbWFsbCBbdHJ1ZV0gLSBJZiBgZmFsc2VgLCB0aGUgbWl4aW4gd2lsbCBza2lwIHRoZSBgc21hbGxgIGJyZWFrcG9pbnQuIFVzZSB0aGlzIHdpdGggY29tcG9uZW50cyB0aGF0IGRvbid0IHByZWZpeCBjbGFzc2VzIHdpdGggYHNtYWxsLWAsIG9ubHkgYG1lZGl1bS1gIGFuZCB1cC5cbkBtaXhpbiAtemYtZWFjaC1icmVha3BvaW50KCRzbWFsbDogdHJ1ZSkge1xuICAkbWFwOiAkYnJlYWtwb2ludC1jbGFzc2VzO1xuXG4gIEBpZiBub3QgJHNtYWxsIHtcbiAgICAkbWFwOiBtYXAtcmVtb3ZlKCRtYXAsIHNtYWxsKTtcbiAgfVxuXG4gIEBlYWNoICRzaXplIGluICRtYXAge1xuICAgICQtemYtc2l6ZTogJHNpemUgIWdsb2JhbDtcblxuICAgIEBpbmNsdWRlIGJyZWFrcG9pbnQoJHNpemUpIHtcbiAgICAgIEBjb250ZW50O1xuICAgIH1cbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgZ3JpZFxuLy8vL1xuXG4vLy8gQ29sbGFwc2UgdGhlIGd1dHRlcnMgb24gYSBjb2x1bW4gYnkgcmVtb3ZpbmcgdGhlIHBhZGRpbmcuICoqTm90ZToqKiBvbmx5IHVzZSB0aGlzIG1peGluIHdpdGhpbiBhIGJyZWFrcG9pbnQuIFRvIGNvbGxhcHNlIGEgY29sdW1uJ3MgZ3V0dGVycyBvbiBhbGwgc2NyZWVuIHNpemVzLCB1c2UgdGhlIGAkZ3V0dGVyYCBwYXJhbWV0ZXIgb2YgdGhlIGBncmlkLWNvbHVtbigpYCBtaXhpbiBpbnN0ZWFkLlxuQG1peGluIGdyaWQtY29sdW1uLWNvbGxhcHNlIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBwYWRkaW5nLXJpZ2h0OiAwO1xufVxuXG4vLy8gVW4tY29sbGFwc2UgdGhlIGd1dHRlcnMgb24gYSBjb2x1bW4gYnkgcmUtYWRkaW5nIHRoZSBwYWRkaW5nLlxuLy8vXG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICRndXR0ZXIgWyRncmlkLWNvbHVtbi1ndXR0ZXJdIC0gU3BhY2luZyBiZXR3ZWVuIGNvbHVtbnMuXG5AbWl4aW4gZ3JpZC1jb2x1bW4tdW5jb2xsYXBzZSgkZ3V0dGVyOiAkZ3JpZC1jb2x1bW4tZ3V0dGVyKSB7XG4gICRndXR0ZXI6IHJlbS1jYWxjKCRndXR0ZXIpIC8gMjtcbiAgcGFkZGluZy1sZWZ0OiAkZ3V0dGVyO1xuICBwYWRkaW5nLXJpZ2h0OiAkZ3V0dGVyO1xufVxuXG4vLy8gU2hvcnRoYW5kIGZvciBgZ3JpZC1jb2x1bW4tY29sbGFwc2UoKWAuXG4vLy8gQGFsaWFzIGdyaWQtY29sdW1uLWNvbGxhcHNlXG5AbWl4aW4gZ3JpZC1jb2wtY29sbGFwc2Uge1xuICBAaW5jbHVkZSBncmlkLWNvbHVtbi1jb2xsYXBzZTtcbn1cblxuLy8vIFNob3J0aGFuZCBmb3IgYGdyaWQtY29sdW1uLXVuY29sbGFwc2UoKWAuXG4vLy8gQGFsaWFzIGdyaWQtY29sdW1uLXVuY29sbGFwc2VcbkBtaXhpbiBncmlkLWNvbC11bmNvbGxhcHNlKCRndXR0ZXI6ICRncmlkLWNvbHVtbi1ndXR0ZXIpIHtcbiAgQGluY2x1ZGUgZ3JpZC1jb2x1bW4tdW5jb2xsYXBzZSgkZ3V0dGVyKTtcbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGJyZWFrcG9pbnRzXG4vLy8vXG5cbi8vIHNjc3MtbGludDpkaXNhYmxlIFplcm9Vbml0XG5cbi8vLyBBIGxpc3Qgb2YgbmFtZWQgYnJlYWtwb2ludHMuIFlvdSBjYW4gdXNlIHRoZXNlIHdpdGggdGhlIGBicmVha3BvaW50KClgIG1peGluIHRvIHF1aWNrbHkgY3JlYXRlIG1lZGlhIHF1ZXJpZXMuXG4vLy8gQHR5cGUgTWFwXG4kYnJlYWtwb2ludHM6IChcbiAgc21hbGw6IDAsXG4gIG1lZGl1bTogNjQwcHgsXG4gIGxhcmdlOiAxMDI0cHgsXG4gIHhsYXJnZTogMTIwMHB4LFxuICB4eGxhcmdlOiAxNDQwcHgsXG4pICFkZWZhdWx0O1xuXG4vLy8gQWxsIG9mIHRoZSBuYW1lcyBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBvdXRwdXQgYXMgY2xhc3NlcyBpbiB5b3VyIENTUywgbGlrZSBgLnNtYWxsLTEyYCwgYC5tZWRpdW0tNmAsIGFuZCBzbyBvbi4gRWFjaCB2YWx1ZSBpbiB0aGlzIGxpc3QgbXVzdCBhbHNvIGJlIGluIHRoZSBgJGJyZWFrcG9pbnRzYCBtYXAuXG4vLy8gQHR5cGUgTGlzdFxuJGJyZWFrcG9pbnQtY2xhc3NlczogKHNtYWxsIG1lZGl1bSBsYXJnZSkgIWRlZmF1bHQ7XG5cbi8vLyBHZW5lcmF0ZXMgYSBtZWRpYSBxdWVyeSBzdHJpbmcgbWF0Y2hpbmcgdGhlIGlucHV0IHZhbHVlLiBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGBicmVha3BvaW50KClgIG1peGluIHRvIHNlZSB3aGF0IHRoZSBwb3NzaWJsZSBpbnB1dHMgYXJlLlxuLy8vXG4vLy8gQHBhcmFtIHtLZXl3b3JkfE51bWJlcn0gJHZhbCBbc21hbGxdIC0gQnJlYWtwb2ludCBuYW1lLCBvciBweCwgcmVtLCBvciBlbSB2YWx1ZSB0byBwcm9jZXNzLlxuQGZ1bmN0aW9uIGJyZWFrcG9pbnQoJHZhbDogc21hbGwpIHtcbiAgLy8gU2l6ZSBvciBrZXl3b3JkXG4gICRicDogbnRoKCR2YWwsIDEpO1xuICAvLyBWYWx1ZSBmb3IgbWF4LXdpZHRoIG1lZGlhIHF1ZXJpZXNcbiAgJGJwLW1heDogMDtcbiAgLy8gRGlyZWN0aW9uIG9mIG1lZGlhIHF1ZXJ5ICh1cCwgZG93biwgb3Igb25seSlcbiAgJGRpcjogaWYobGVuZ3RoKCR2YWwpID4gMSwgbnRoKCR2YWwsIDIpLCB1cCk7XG4gIC8vIEV2ZW50dWFsIG91dHB1dFxuICAkc3RyOiAnJztcbiAgLy8gSXMgaXQgYSBuYW1lZCBtZWRpYSBxdWVyeT9cbiAgJG5hbWVkOiBmYWxzZTtcblxuICAvLyBPcmllbnRhdGlvbiBtZWRpYSBxdWVyaWVzIGhhdmUgYSB1bmlxdWUgc3ludGF4XG4gIEBpZiAkYnAgPT0gJ2xhbmRzY2FwZScgb3IgJGJwID09ICdwb3J0cmFpdCcge1xuICAgIEByZXR1cm4gJyhvcmllbnRhdGlvbjogI3skYnB9KSc7XG4gIH1cbiAgQGVsc2UgaWYgJGJwID09ICdyZXRpbmEnIHtcbiAgICBAcmV0dXJuICcoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwgKG1pbi1yZXNvbHV0aW9uOiAxOTJkcGkpJztcbiAgfVxuXG4gIC8vIFRyeSB0byBwdWxsIGEgbmFtZWQgYnJlYWtwb2ludCBvdXQgb2YgdGhlICRicmVha3BvaW50cyBtYXBcbiAgQGlmIHR5cGUtb2YoJGJwKSA9PSAnc3RyaW5nJyB7XG4gICAgQGlmIG1hcC1oYXMta2V5KCRicmVha3BvaW50cywgJGJwKSB7XG4gICAgICBAaWYgJGRpciA9PSAnb25seScgb3IgJGRpciA9PSAnZG93bicge1xuICAgICAgICAkbmV4dC1icDogLXpmLW1hcC1uZXh0KCRicmVha3BvaW50cywgJGJwKTtcblxuICAgICAgICBAaWYgJG5leHQtYnAgPT0gbnVsbCB7XG4gICAgICAgICAgJGJwLW1heDogbnVsbDtcbiAgICAgICAgICBAd2FybiAnYnJlYWtwb2ludCgpOiB0aGUgbWVkaWEgcXVlcnkgXCIjeyR2YWx9XCIgY2Fubm90IGJlIHVzZWQgYmVjYXVzZSAjeyRicH0gaXMgdGhlIGxhcmdlc3QgYnJlYWtwb2ludC4nO1xuICAgICAgICB9XG4gICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAkYnAtbWF4OiAkbmV4dC1icDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAkYnA6IG1hcC1nZXQoJGJyZWFrcG9pbnRzLCAkYnApO1xuICAgICAgJG5hbWVkOiB0cnVlO1xuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICAkYnA6IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29udmVydCBhbnkgcGl4ZWwsIHJlbSwgb3IgdW5pdGxlc3MgdmFsdWUgdG8gZW1cbiAgJGJwOiAtemYtYnAtdG8tZW0oJGJwKTtcbiAgQGlmICRicC1tYXgge1xuICAgICRicC1tYXg6IC16Zi1icC10by1lbSgkYnAtbWF4KSAtICgxLzE2KTtcbiAgfVxuXG4gIC8vIFNraXAgbWVkaWEgcXVlcnkgY3JlYXRpb24gaWYgdGhlIGlucHV0IGlzIFwiMCB1cFwiXG4gIEBpZiAkYnAgPiAwZW0gb3IgJGRpciA9PSAnb25seScgb3IgJGRpciA9PSAnZG93bicge1xuICAgIC8vIGBvbmx5YCByYW5nZXMgdXNlIHRoZSBmb3JtYXQgYChtaW4td2lkdGg6IG4pIGFuZCAobWF4LXdpZHRoOiBuKWBcbiAgICBAaWYgJGRpciA9PSAnb25seScge1xuICAgICAgQGlmICRuYW1lZCA9PSB0cnVlIHtcbiAgICAgICAgJHN0cjogJHN0ciArICcobWluLXdpZHRoOiAjeyRicH0pJztcblxuICAgICAgICBAaWYgJGJwLW1heCAhPSBudWxsIHtcbiAgICAgICAgICAkc3RyOiAkc3RyICsgJyBhbmQgKG1heC13aWR0aDogI3skYnAtbWF4fSknO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBAZWxzZSB7XG4gICAgICAgIEB3YXJuICdPbmx5IG5hbWVkIG1lZGlhIHF1ZXJpZXMgY2FuIGhhdmUgYW4gYG9ubHlgIHJhbmdlLic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYGRvd25gIHJhbmdlcyB1c2UgdGhlIGZvcm1hdCBgKG1heC13aWR0aDogbilgXG4gICAgQGVsc2UgaWYgJGRpciA9PSAnZG93bicge1xuICAgICAgJG1heDogMDtcblxuICAgICAgLy8gRm9yIG5hbWVkIGJyZWFrcG9pbnRzLCBzdWJ0cmFjdCB0aGUgYnJlYWtwb2ludCB2YWx1ZSBieSBvbmUgXCJwaXhlbFwiLCBvciAxLzE2ZW0uXG4gICAgICBAaWYgJG5hbWVkIHtcbiAgICAgICAgJG1heDogJGJwLW1heDtcbiAgICAgIH1cbiAgICAgIEBlbHNlIHtcbiAgICAgICAgJG1heDogJGJwO1xuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIG1lZGlhIHF1ZXJ5IGNyZWF0aW9uIGlmIGlucHV0IHZhbHVlIGlzIGV4YWN0bHkgXCIwIGRvd25cIiBidXQgZG9uJ3QgXCJzbWFsbCBkb3duXCJcbiAgICAgIEBpZiAkbmFtZWQgb3IgJGJwID4gMGVtIHtcbiAgICAgICAgJHN0cjogJHN0ciArICcobWF4LXdpZHRoOiAjeyRtYXh9KSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYHVwYCByYW5nZXMgdXNlIHRoZSBmb3JtYXQgYChtaW4td2lkdGg6IG4pYFxuICAgIEBlbHNlIGlmICRicCA+IDBlbSB7XG4gICAgICAkc3RyOiAkc3RyICsgJyhtaW4td2lkdGg6ICN7JGJwfSknO1xuICAgIH1cbiAgfVxuXG4gIEByZXR1cm4gJHN0cjtcbn1cblxuLy8vIFdyYXBzIGEgbWVkaWEgcXVlcnkgYXJvdW5kIHRoZSBjb250ZW50IHlvdSBwdXQgaW5zaWRlIHRoZSBtaXhpbi4gVGhpcyBtaXhpbiBhY2NlcHRzIGEgbnVtYmVyIG9mIHZhbHVlczpcbi8vLyAgLSBJZiBhIHN0cmluZyBpcyBwYXNzZWQsIHRoZSBtaXhpbiB3aWxsIGxvb2sgZm9yIGl0IGluIHRoZSBgJGJyZWFrcG9pbnRzYCBtYXAsIGFuZCB1c2UgYSBtZWRpYSBxdWVyeSB0aGVyZS5cbi8vLyAgLSBJZiBhIHBpeGVsIHZhbHVlIGlzIHBhc3NlZCwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4gZW0gdmFsdWUgdXNpbmcgYCRnbG9iYWwtZm9udC1zaXplYCBhcyB0aGUgYmFzZS5cbi8vLyAgLSBJZiBhIHJlbSB2YWx1ZSBpcyBwYXNzZWQsIHRoZSB1bml0IHdpbGwgYmUgY2hhbmdlZCB0byBlbS5cbi8vLyAgLSBJZiBhbiBlbSB2YWx1ZSBpcyBwYXNzZWQsIHRoZSB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMtaXMuXG4vLy9cbi8vLyBAcGFyYW0ge0tleXdvcmR8TnVtYmVyfSAkdmFsdWUgLSBCcmVha3BvaW50IG5hbWUsIG9yIHB4LCByZW0sIG9yIGVtIHZhbHVlIHRvIHByb2Nlc3MuXG4vLy9cbi8vLyBAb3V0cHV0IElmIHRoZSBicmVha3BvaW50IGlzIFwiMHB4IGFuZCBsYXJnZXJcIiwgb3V0cHV0cyB0aGUgY29udGVudCBhcy1pcy4gT3RoZXJ3aXNlLCBvdXRwdXRzIHRoZSBjb250ZW50IHdyYXBwZWQgaW4gYSBtZWRpYSBxdWVyeS5cbkBtaXhpbiBicmVha3BvaW50KCR2YWx1ZSkge1xuICAkc3RyOiBicmVha3BvaW50KCR2YWx1ZSk7XG5cbiAgLy8gSWYgJHN0ciBpcyBzdGlsbCBhbiBlbXB0eSBzdHJpbmcsIG5vIG1lZGlhIHF1ZXJ5IGlzIG5lZWRlZFxuICBAaWYgJHN0ciA9PSAnJyB7XG4gICAgQGNvbnRlbnQ7XG4gIH1cblxuICAvLyBPdGhlcndpc2UsIHdyYXAgdGhlIGNvbnRlbnQgaW4gYSBtZWRpYSBxdWVyeVxuICBAZWxzZSB7XG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgI3skc3RyfSB7XG4gICAgICBAY29udGVudDtcbiAgICB9XG4gIH1cbn1cblxuLy8vIENvbnZlcnMgdGhlIGJyZWFrcG9pbnRzIG1hcCB0byBhIFVSTC1lbmNvZGVkIHN0cmluZywgbGlrZSB0aGlzOiBga2V5MT12YWx1ZTEma2V5Mj12YWx1ZTJgLiBUaGUgdmFsdWUgaXMgdGhlbiBkcm9wcGVkIGludG8gdGhlIENTUyBmb3IgYSBzcGVjaWFsIGA8bWV0YT5gIHRhZywgd2hpY2ggaXMgcmVhZCBieSB0aGUgRm91bmRhdGlvbiBKYXZhU2NyaXB0LiBUaGlzIGlzIGhvdyB3ZSB0cmFuc2ZlciB2YWx1ZXMgZnJvbSBTYXNzIHRvIEphdmFTY3JpcHQsIHNvIHRoZXkgY2FuIGJlIGRlZmluZWQgaW4gb25lIHBsYWNlLlxuLy8vIEBhY2Nlc3MgcHJpdmF0ZVxuLy8vXG4vLy8gQHBhcmFtIHtNYXB9ICRtYXAgLSBNYXAgdG8gY29udmVydC5cbi8vL1xuLy8vIEByZXR1cm5zIHtTdHJpbmd9IEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1hcCdzIGNvbnRlbnRzLlxuQGZ1bmN0aW9uIC16Zi1icC1zZXJpYWxpemUoJG1hcCkge1xuICAkc3RyOiAnJztcbiAgQGVhY2ggJGtleSwgJHZhbHVlIGluICRtYXAge1xuICAgICRzdHI6ICRzdHIgKyAka2V5ICsgJz0nICsgLXpmLWJwLXRvLWVtKCR2YWx1ZSkgKyAnJic7XG4gIH1cbiAgJHN0cjogc3RyLXNsaWNlKCRzdHIsIDEsIC0yKTtcblxuICBAcmV0dXJuICRzdHI7XG59XG5cbi8vLyBGaW5kIHRoZSBuZXh0IGtleSBpbiBhIG1hcC5cbi8vLyBAYWNjZXNzIHByaXZhdGVcbi8vL1xuLy8vIEBwYXJhbSB7TWFwfSAkbWFwIC0gTWFwIHRvIHRyYXZlcnNlLlxuLy8vIEBwYXJhbSB7TWl4ZWR9ICRrZXkgLSBLZXkgdG8gdXNlIGFzIGEgc3RhcnRpbmcgcG9pbnQuXG4vLy9cbi8vLyBAcmV0dXJucyB7TWl4ZWR9IFRoZSB2YWx1ZSBmb3IgdGhlIGtleSBhZnRlciBgJGtleWAsIGlmIGAka2V5YCB3YXMgZm91bmQuIElmIGAka2V5YCB3YXMgbm90IGZvdW5kLCBvciBgJGtleWAgd2FzIHRoZSBsYXN0IHZhbHVlIGluIHRoZSBtYXAsIHJldHVybnMgYG51bGxgLlxuQGZ1bmN0aW9uIC16Zi1tYXAtbmV4dCgkbWFwLCAka2V5KSB7XG4gIC8vIFN0b3JlIHRoZSB2YWx1ZXMgb2YgdGhlIG1hcCBhcyBhIGxpc3QsIHNvIHdlIGNhbiBhY2Nlc3MgdGhlbSB3aXRoIG50aFxuICAkdmFsdWVzOiBtYXAtdmFsdWVzKCRtYXApO1xuXG4gIC8vIEdoZXR0byBmb3IgbG9vcFxuICAkaTogMTtcbiAgJGZvdW5kOiBmYWxzZTtcbiAgQGVhY2ggJHZhbCBpbiBtYXAta2V5cygkbWFwKSB7XG4gICAgQGlmICRmb3VuZCA9PSBmYWxzZSB7XG4gICAgICBAaWYgKCRrZXkgPT0gJHZhbCkge1xuICAgICAgICAkZm91bmQ6IHRydWU7XG4gICAgICB9XG4gICAgICAkaTogJGkgKyAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZSBrZXkgZG9lc24ndCBleGlzdCwgb3IgaXQncyB0aGUgbGFzdCBrZXkgaW4gdGhlIG1hcCwgcmV0dXJuIG51bGxcbiAgQGlmICRpID4gbGVuZ3RoKCRtYXApIHtcbiAgICBAcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHZhbHVlXG4gIEBlbHNlIHtcbiAgICBAcmV0dXJuIG50aCgkdmFsdWVzLCAkaSk7XG4gIH1cbn1cblxuLy8vIEdldCBhIHZhbHVlIGZvciBhIGJyZWFrcG9pbnQgZnJvbSBhIHJlc3BvbnNpdmUgY29uZmlnIG1hcC4gSWYgdGhlIGNvbmZpZyBtYXAgaGFzIHRoZSBrZXkgYCR2YWx1ZWAsIHRoZSBleGFjdCBicmVha3BvaW50IHZhbHVlIGlzIHJldHVybmVkLiBJZiB0aGUgY29uZmlnIG1hcCBkb2VzICpub3QqIGhhdmUgdGhlIGJyZWFrcG9pbnQsIHRoZSB2YWx1ZSBtYXRjaGluZyB0aGUgbmV4dCBsb3dlc3QgYnJlYWtwb2ludCBpbiB0aGUgY29uZmlnIG1hcCBpcyByZXR1cm5lZC5cbi8vLyBAYWNjZXNzIHByaXZhdGVcbi8vL1xuLy8vIEBwYXJhbSB7TWFwfSAkbWFwIC0gSW5wdXQgY29uZmlnIG1hcC5cbi8vLyBAcGFyYW0ge0tleXdvcmR9ICR2YWx1ZSAtIEJyZWFrcG9pbnQgbmFtZSB0byB1c2UuXG4vLy9cbi8vLyBAcmV0dXJuIHtNaXhlZH0gVGhlIGNvcnJlc3BvbmRpbmcgYnJlYWtwb2ludCB2YWx1ZS5cbkBmdW5jdGlvbiAtemYtZ2V0LWJwLXZhbCgkbWFwLCAkdmFsdWUpIHtcbiAgLy8gQ2hlY2sgaWYgdGhlIGJyZWFrcG9pbnQgbmFtZSBleGlzdHMgZ2xvYmFsbHlcbiAgQGlmIG5vdCBtYXAtaGFzLWtleSgkYnJlYWtwb2ludHMsICR2YWx1ZSkge1xuICAgIEByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBDaGVjayBpZiB0aGUgYnJlYWtwb2ludCBuYW1lIGV4aXN0cyBpbiB0aGUgbG9jYWwgY29uZmlnIG1hcFxuICBAZWxzZSBpZiBtYXAtaGFzLWtleSgkbWFwLCAkdmFsdWUpIHtcbiAgICAvLyBJZiBpdCBkb2VzLCBqdXN0IHJldHVybiB0aGUgdmFsdWVcbiAgICBAcmV0dXJuIG1hcC1nZXQoJG1hcCwgJHZhbHVlKTtcbiAgfVxuICAvLyBPdGhlcndpc2UsIGZpbmQgdGhlIG5leHQgbG93ZXN0IGJyZWFrcG9pbnQgYW5kIHJldHVybiB0aGF0IHZhbHVlXG4gIEBlbHNlIHtcbiAgICAkYW5jaG9yOiBudWxsO1xuICAgICRmb3VuZDogZmFsc2U7XG5cbiAgICBAZWFjaCAka2V5LCAkdmFsIGluICRicmVha3BvaW50cyB7XG4gICAgICBAaWYgbm90ICRmb3VuZCB7XG4gICAgICAgIEBpZiBtYXAtaGFzLWtleSgkbWFwLCAka2V5KSB7XG4gICAgICAgICAgJGFuY2hvcjogJGtleTtcbiAgICAgICAgfVxuICAgICAgICBAaWYgJGtleSA9PSAkdmFsdWUge1xuICAgICAgICAgICRmb3VuZDogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIEByZXR1cm4gbWFwLWdldCgkbWFwLCAkYW5jaG9yKTtcbiAgfVxufVxuXG4vLyBMZWdhY3kgYnJlYWtwb2ludCB2YXJpYWJsZXNcbi8vIFRoZXNlIHdpbGwgYmUgcmVtb3ZlZCBpbiA2LjJcbiRzbWFsbC11cDogbnVsbDtcbiRzbWFsbC1vbmx5OiBudWxsO1xuJG1lZGl1bS11cDogbnVsbDtcbiRtZWRpdW0tb25seTogbnVsbDtcbiRsYXJnZS11cDogbnVsbDtcbiRsYXJnZS1vbmx5OiBudWxsO1xuJHhsYXJnZS11cDogbnVsbDtcbiR4bGFyZ2Utb25seTogbnVsbDtcbiR4eGxhcmdlLXVwOiBudWxsO1xuJHh4bGFyZ2Utb25seTogbnVsbDtcblxuQGlmIG1hcC1oYXMta2V5KCRicmVha3BvaW50cywgc21hbGwpIHtcbiAgJHNtYWxsLXVwOiBzY3JlZW47XG4gICRzbWFsbC1vbmx5OiB1bnF1b3RlKCdzY3JlZW4gYW5kICN7YnJlYWtwb2ludChzbWFsbCBvbmx5KX0nKTtcbn1cblxuQGlmIG1hcC1oYXMta2V5KCRicmVha3BvaW50cywgbWVkaXVtKSB7XG4gICRtZWRpdW0tdXA6IHVucXVvdGUoJ3NjcmVlbiBhbmQgI3ticmVha3BvaW50KG1lZGl1bSl9Jyk7XG4gICRtZWRpdW0tb25seTogdW5xdW90ZSgnc2NyZWVuIGFuZCAje2JyZWFrcG9pbnQobWVkaXVtIG9ubHkpfScpO1xufVxuXG5AaWYgbWFwLWhhcy1rZXkoJGJyZWFrcG9pbnRzLCBsYXJnZSkge1xuICAkbGFyZ2UtdXA6IHVucXVvdGUoJ3NjcmVlbiBhbmQgI3ticmVha3BvaW50KGxhcmdlKX0nKTtcbiAgJGxhcmdlLW9ubHk6IHVucXVvdGUoJ3NjcmVlbiBhbmQgI3ticmVha3BvaW50KGxhcmdlIG9ubHkpfScpO1xufVxuXG5AaWYgbWFwLWhhcy1rZXkoJGJyZWFrcG9pbnRzLCB4bGFyZ2UpIHtcbiAgJHhsYXJnZS11cDogdW5xdW90ZSgnc2NyZWVuIGFuZCAje2JyZWFrcG9pbnQoeGxhcmdlKX0nKTtcbiAgJHhsYXJnZS1vbmx5OiB1bnF1b3RlKCdzY3JlZW4gYW5kICN7YnJlYWtwb2ludCh4bGFyZ2Ugb25seSl9Jyk7XG59XG5cbkBpZiBtYXAtaGFzLWtleSgkYnJlYWtwb2ludHMsIHh4bGFyZ2UpIHtcbiAgJHh4bGFyZ2UtdXA6IHVucXVvdGUoJ3NjcmVlbiBhbmQgI3ticmVha3BvaW50KHh4bGFyZ2UpfScpO1xufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgZ3JpZFxuLy8vL1xuXG4vLy8gQ2FsY3VsYXRlcyB0aGUgd2lkdGggb2YgYSBjb2x1bW4gYmFzZWQgb24gYSBudW1iZXIgb2YgZmFjdG9ycy5cbi8vL1xuLy8vIEBwYXJhbSB7TnVtYmVyfExpc3R9ICRjb2x1bW5zXG4vLy8gICBXaWR0aCBvZiB0aGUgY29sdW1uLiBBY2NlcHRzIG11bHRpcGxlIHZhbHVlczpcbi8vLyAgIC0gQSBwZXJjZW50YWdlIHZhbHVlIHdpbGwgbWFrZSB0aGUgY29sdW1uIHRoYXQgZXhhY3Qgc2l6ZS5cbi8vLyAgIC0gQSBzaW5nbGUgZGlnaXQgd2lsbCBtYWtlIHRoZSBjb2x1bW4gc3BhbiB0aGF0IG51bWJlciBvZiBjb2x1bW5zIHdpZGUsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGNvbHVtbiBjb3VudCBvZiB0aGUgcGFyZW50IHJvdy5cbi8vLyAgIC0gQSBzdHJpbmcgb2YgdGhlIGZvcm1hdCBcInggb2YgeVwiIHdpbGwgbWFrZSBhIGNvbHVtbiB0aGF0IGlzICp4KiBjb2x1bW5zIHdpZGUsIGFzc3VtaW5nICp5KiB0b3RhbCBjb2x1bW5zIGZvciB0aGUgcGFyZW50LlxuLy8vXG4vLy8gQHJldHVybnMge051bWJlcn0gQSBjYWxjdWxhdGVkIHBlcmNlbnRhZ2UgdmFsdWUuXG5AZnVuY3Rpb24gZ3JpZC1jb2x1bW4oJGNvbHVtbnMpIHtcbiAgJHdpZHRoOiAwJTtcblxuICAvLyBQYXJzaW5nIHBlcmNlbnRzLCBkZWNpbWFscywgYW5kIGNvbHVtbiBjb3VudHNcbiAgQGlmIHR5cGUtb2YoJGNvbHVtbnMpID09ICdudW1iZXInIHtcbiAgICBAaWYgdW5pdCgkY29sdW1ucykgPT0gJyUnIHtcbiAgICAgICR3aWR0aDogJGNvbHVtbnM7XG4gICAgfVxuICAgIEBlbHNlIGlmICRjb2x1bW5zIDwgMSB7XG4gICAgICAkd2lkdGg6IHBlcmNlbnRhZ2UoJGNvbHVtbnMpO1xuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICAkd2lkdGg6IHBlcmNlbnRhZ2UoJGNvbHVtbnMgLyAkZ3JpZC1jb2x1bW4tY291bnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNpbmcgXCJuIG9mIG5cIiBleHByZXNzaW9uc1xuICBAZWxzZSBpZiB0eXBlLW9mKCRjb2x1bW5zKSA9PSAnbGlzdCcge1xuICAgIEBpZiBsZW5ndGgoJGNvbHVtbnMpICE9IDMge1xuICAgICAgQGVycm9yICdXcm9uZyBzeW50YXggZm9yIGdyaWQtY29sdW1uKCkuIFVzZSB0aGUgZm9ybWF0IFwibiBvZiBuXCIuJztcbiAgICB9XG4gICAgQGVsc2Uge1xuICAgICAgJHdpZHRoOiBwZXJjZW50YWdlKG50aCgkY29sdW1ucywgMSkgLyBudGgoJGNvbHVtbnMsIDMpKTtcbiAgICB9XG4gIH1cblxuICAvLyBBbnl0aGluZyBlbHNlIGlzIGluY29ycmVjdFxuICBAZWxzZSB7XG4gICAgQGVycm9yICdXcm9uZyBzeW50YXggZm9yIGdyaWQtY29sdW1uKCkuIFVzZSBhIG51bWJlciwgZGVjaW1hbCwgcGVyY2VudGFnZSwgb3IgXCJuIG9mIG5cIi4nO1xuICB9XG5cbiAgQHJldHVybiAkd2lkdGg7XG59XG5cbi8vLyBDcmVhdGVzIGEgZ3JpZCBjb2x1bW4uXG4vLy9cbi8vLyBAcGFyYW0ge01peGVkfSAkY29sdW1ucyBbJGdyaWQtY29sdW1uLWNvdW50XSAtIFdpZHRoIG9mIHRoZSBjb2x1bW4uIFJlZmVyIHRvIHRoZSBgZ3JpZC1jb2x1bW4oKWAgZnVuY3Rpb24gdG8gc2VlIHBvc3NpYmxlIHZhbHVlcy5cbi8vLyBAcGFyYW0ge051bWJlcn0gJGd1dHRlciBbJGdyaWQtY29sdW1uLWd1dHRlcl0gLSBTcGFjaW5nIGJldHdlZW4gY29sdW1ucy5cbkBtaXhpbiBncmlkLWNvbHVtbihcbiAgJGNvbHVtbnM6ICRncmlkLWNvbHVtbi1jb3VudCxcbiAgJGd1dHRlcjogJGdyaWQtY29sdW1uLWd1dHRlclxuKSB7XG4gIEBpZiAkZ3V0dGVyICE9IG51bGwge1xuICAgICRndXR0ZXI6IHJlbS1jYWxjKCRndXR0ZXIpIC8gMjtcbiAgfVxuICBAZWxzZSB7XG4gICAgQGVhY2ggJGJyZWFrcG9pbnQsICRndXR0ZXIgaW4gJGdyaWQtY29sdW1uLXJlc3BvbnNpdmUtZ3V0dGVyIHtcbiAgICAgICRwYWRkaW5nOiByZW0tY2FsYygkZ3V0dGVyKSAvIDI7XG5cbiAgICAgIEBpbmNsdWRlIGJyZWFrcG9pbnQoJGJyZWFrcG9pbnQpIHtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAkcGFkZGluZztcbiAgICAgICAgcGFkZGluZy1yaWdodDogJHBhZGRpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQGluY2x1ZGUgZ3JpZC1jb2x1bW4tc2l6ZSgkY29sdW1ucyk7XG4gIGZsb2F0OiAkZ2xvYmFsLWxlZnQ7XG4gIHBhZGRpbmctbGVmdDogJGd1dHRlcjtcbiAgcGFkZGluZy1yaWdodDogJGd1dHRlcjtcblxuICBAaWYgJGdyaWQtY29sdW1uLWFsaWduLWVkZ2Uge1xuICAgICY6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSB7XG4gICAgICBmbG9hdDogJGdsb2JhbC1yaWdodDtcbiAgICB9XG4gIH1cbn1cblxuLy8vIENyZWF0ZXMgYSBncmlkIGNvbHVtbiByb3cuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgYWRkaW5nIGAucm93YCBhbmQgYC5jb2x1bW5gIHRvIHRoZSBzYW1lIGVsZW1lbnQuXG4vLy9cbi8vLyBAcGFyYW0ge051bWJlcn0gJGd1dHRlciBbJGdyaWQtY29sdW1uLWd1dHRlcl0gLSBXaWR0aCBvZiB0aGUgZ3V0dGVycyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgY29sdW1uIHJvdy5cbkBtaXhpbiBncmlkLWNvbHVtbi1yb3coXG4gICRndXR0ZXI6ICRncmlkLWNvbHVtbi1ndXR0ZXJcbikge1xuICBAaW5jbHVkZSBncmlkLXJvdztcbiAgQGluY2x1ZGUgZ3JpZC1jb2x1bW4oJGd1dHRlcjogJGd1dHRlcik7XG5cbiAgJixcbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBmbG9hdDogbm9uZTtcbiAgfVxufVxuXG4vLy8gU2hvcnRoYW5kIGZvciBgZ3JpZC1jb2x1bW4oKWAuXG4vLy8gQGFsaWFzIGdyaWQtY29sdW1uXG5AZnVuY3Rpb24gZ3JpZC1jb2woXG4gICRjb2x1bW5zOiAkZ3JpZC1jb2x1bW4tY291bnRcbikge1xuICBAcmV0dXJuIGdyaWQtY29sdW1uKCRjb2x1bW5zKTtcbn1cblxuLy8vIFNob3J0aGFuZCBmb3IgYGdyaWQtY29sdW1uKClgLlxuLy8vIEBhbGlhcyBncmlkLWNvbHVtblxuQG1peGluIGdyaWQtY29sKFxuICAkY29sdW1uczogJGdyaWQtY29sdW1uLWNvdW50LFxuICAkZ3V0dGVyOiAkZ3JpZC1jb2x1bW4tZ3V0dGVyXG4pIHtcbiAgQGluY2x1ZGUgZ3JpZC1jb2x1bW4oJGNvbHVtbnMsICRndXR0ZXIpO1xufVxuXG4vLy8gU2hvcnRoYW5kIGZvciBgZ3JpZC1jb2x1bW4tcm93KClgLlxuLy8vIEBhbGlhcyBncmlkLWNvbHVtbi1yb3dcbkBtaXhpbiBncmlkLWNvbC1yb3coXG4gICRndXR0ZXI6ICRncmlkLWNvbHVtbi1ndXR0ZXJcbikge1xuICBAaW5jbHVkZSBncmlkLWNvbHVtbi1yb3coJGd1dHRlcik7XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBncmlkXG4vLy8vXG5cbi8vLyBTZXQgdGhlIHdpZHRoIG9mIGEgZ3JpZCBjb2x1bW4uXG4vLy9cbi8vLyBAcGFyYW0ge051bWJlcnxMaXN0fSAkd2lkdGggWyRncmlkLWNvbHVtbi1jb3VudF0gLSBXaWR0aCB0byBtYWtlIHRoZSBjb2x1bW4uIFlvdSBjYW4gcGFzcyBpbiBhbnkgdmFsdWUgYWNjZXB0ZWQgYnkgdGhlIGBncmlkLWNvbHVtbigpYCBmdW5jdGlvbiwgc3VjaCBhcyBgNmAsIGA1MCVgLCBvciBgMSBvZiAyYC5cbkBtaXhpbiBncmlkLWNvbHVtbi1zaXplKFxuICAkY29sdW1uczogJGdyaWQtY29sdW1uLWNvdW50XG4pIHtcbiAgd2lkdGg6IGdyaWQtY29sdW1uKCRjb2x1bW5zKTtcbn1cblxuLy8vIFNob3J0aGFuZCBmb3IgYGdyaWQtY29sdW1uLXNpemUoKWAuXG4vLy8gQGFsaWFzIGdyaWQtY29sdW1uLXNpemVcbkBtaXhpbiBncmlkLWNvbC1zaXplKFxuICAkY29sdW1uczogJGdyaWQtY29sdW1uLWNvdW50XG4pIHtcbiAgQGluY2x1ZGUgZ3JpZC1jb2x1bW4tc2l6ZSgkY29sdW1ucyk7XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBncmlkXG4vLy8vXG5cbi8vLyBSZXBvc2l0aW9uIGEgY29sdW1uLlxuLy8vXG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICRwb3NpdGlvbiAtIERpcmVjdGlvbiBhbmQgYW1vdW50IHRvIG1vdmUuIFRoZSBjb2x1bW4gd2lsbCBtb3ZlIGVxdWFsIHRvIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIGNvdW50IHNwZWNpZmllZC4gQSBwb3NpdGl2ZSBudW1iZXIgd2lsbCBwdXNoIHRoZSBjb2x1bW4gdG8gdGhlIHJpZ2h0LCB3aGlsZSBhIG5lZ2F0aXZlIG51bWJlciB3aWxsIHB1bGwgaXQgdG8gdGhlIGxlZnQuXG5AbWl4aW4gZ3JpZC1jb2x1bW4tcG9zaXRpb24oJHBvc2l0aW9uKSB7XG4gIEBpZiB0eXBlLW9mKCRwb3NpdGlvbikgPT0gJ251bWJlcicge1xuICAgICRvZmZzZXQ6IHBlcmNlbnRhZ2UoJHBvc2l0aW9uIC8gJGdyaWQtY29sdW1uLWNvdW50KTtcblxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAjeyRnbG9iYWwtbGVmdH06ICRvZmZzZXQ7XG4gIH1cbiAgQGVsc2UgaWYgJHBvc2l0aW9uID09IGNlbnRlciB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICB9XG4gIEBlbHNlIHtcbiAgICBAd2FybiAnV3Jvbmcgc3ludGF4IGZvciBncmlkLWNvbHVtbi1wb3NpdGlvbigpLiBFbnRlciBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIG51bWJlciwgb3IgY2VudGVyLic7XG4gIH1cbn1cblxuLy8vIFJlc2V0IGEgcG9zaXRpb24gZGVmaW5pdGlvbi5cbkBtaXhpbiBncmlkLWNvbHVtbi11bnBvc2l0aW9uIHtcbiAgcG9zaXRpb246IHN0YXRpYztcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIG1hcmdpbi1yaWdodDogMDtcbiAgZmxvYXQ6IGxlZnQ7XG59XG5cbi8vLyBPZmZzZXRzIGEgY29sdW1uIHRvIHRoZSByaWdodCBieSBgJG5gIGNvbHVtbnMuXG4vLy8gQHBhcmFtIHtOdW1iZXJ8TGlzdH0gJG4gLSBXaWR0aCB0byBvZmZzZXQgYnkuIFlvdSBjYW4gcGFzcyBpbiBhbnkgdmFsdWUgYWNjZXB0ZWQgYnkgdGhlIGBncmlkLWNvbHVtbigpYCBtaXhpbiwgc3VjaCBhcyBgNmAsIGA1MCVgLCBvciBgMSBvZiAyYC5cbkBtaXhpbiBncmlkLWNvbHVtbi1vZmZzZXQoJG4pIHtcbiAgbWFyZ2luLSN7JGdsb2JhbC1sZWZ0fTogZ3JpZC1jb2x1bW4oJG4pO1xufVxuXG4vLy8gRGlzYWJsZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgbGFzdCBjb2x1bW4gaW4gYSByb3cgYWxpZ25pbmcgdG8gdGhlIG9wcG9zaXRlIGVkZ2UuXG5AbWl4aW4gZ3JpZC1jb2x1bW4tZW5kIHtcbiAgLy8gVGhpcyBleHRyYSBzcGVjaWZpY2l0eSBpcyByZXF1aXJlZCBmb3IgdGhlIHByb3BlcnR5IHRvIGJlIGFwcGxpZWRcbiAgJjpsYXN0LWNoaWxkOmxhc3QtY2hpbGQge1xuICAgIGZsb2F0OiAkZ2xvYmFsLWxlZnQ7XG4gIH1cbn1cblxuLy8vIFNob3J0aGFuZCBmb3IgYGdyaWQtY29sdW1uLXBvc2l0aW9uKClgLlxuLy8vIEBhbGlhcyBncmlkLWNvbHVtbi1wb3NpdGlvblxuQG1peGluIGdyaWQtY29sLXBvcygkcG9zaXRpb24pIHtcbiAgQGluY2x1ZGUgZ3JpZC1jb2x1bW4tcG9zaXRpb24oJHBvc2l0aW9uKTtcbn1cblxuLy8vIFNob3J0aGFuZCBmb3IgYGdyaWQtY29sdW1uLXVucG9zaXRpb24oKWAuXG4vLy8gQGFsaWFzIGdyaWQtY29sdW1uLXVucG9zaXRpb25cbkBtaXhpbiBncmlkLWNvbC11bnBvcyB7XG4gIEBpbmNsdWRlIGdyaWQtY29sdW1uLXVucG9zaXRpb247XG59XG5cbi8vLyBTaG9ydGhhbmQgZm9yIGBncmlkLWNvbHVtbi1vZmZzZXQoKWAuXG4vLy8gQGFsaWFzIGdyaWQtY29sdW1uLW9mZnNldFxuQG1peGluIGdyaWQtY29sLW9mZigkbikge1xuICBAaW5jbHVkZSBncmlkLWNvbHVtbi1vZmZzZXQoJG4pO1xufVxuXG4vLy8gU2hvcnRoYW5kIGZvciBgZ3JpZC1jb2x1bW4tZW5kKClgLlxuLy8vIEBhbGlhcyBncmlkLWNvbHVtbi1lbmRcbkBtaXhpbiBncmlkLWNvbC1lbmQge1xuICBAaW5jbHVkZSBncmlkLWNvbHVtbi1lbmQ7XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBncmlkXG4vLy8vXG5cbi8vLyBTaXplcyBjaGlsZCBlbGVtZW50cyBzbyB0aGF0IGAkbmAgbnVtYmVyIG9mIGl0ZW1zIGFwcGVhciBvbiBlYWNoIHJvdy5cbi8vL1xuLy8vIEBwYXJhbSB7TnVtYmVyfSAkbiAtIE51bWJlciBvZiBlbGVtZW50cyB0byBkaXNwbGF5IHBlciByb3cuXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRzZWxlY3RvciBbJy5jb2x1bW4nXSAtIFNlbGVjdG9yKHMpIHRvIHVzZSBmb3IgY2hpbGQgZWxlbWVudHMuXG5AbWl4aW4gZ3JpZC1sYXlvdXQoXG4gICRuLFxuICAkc2VsZWN0b3I6ICcuY29sdW1uJ1xuKSB7XG4gICYgPiAjeyRzZWxlY3Rvcn0ge1xuICAgIHdpZHRoOiBwZXJjZW50YWdlKDEvJG4pO1xuICAgIGZsb2F0OiAkZ2xvYmFsLWxlZnQ7XG5cbiAgICAmOm50aC1vZi10eXBlKDFuKSB7XG4gICAgICBjbGVhcjogbm9uZTtcbiAgICB9XG5cbiAgICAmOm50aC1vZi10eXBlKCN7JG59bisxKSB7XG4gICAgICBjbGVhcjogYm90aDtcbiAgICB9XG5cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgfVxuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCB0eXBvZ3JhcGh5LWJhc2Vcbi8vLy9cblxuLy8gQmFzZSBUeXBvZ3JhcGh5XG4vLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLVxuLy8gVGhlc2UgYXJlIHN0eWxlcyBhcHBsaWVkIHRvIGJhc2ljIEhUTUwgdGFncywgaW5jbHVkaW5nOlxuLy8gICAtIFBhcmFncmFwaHMgPHA+XG4vLyAgIC0gQm9sZC9pdGFsaWNzIDxiPiA8c3Ryb25nPiA8aT4gPGVtPlxuLy8gICAtIFNtYWxsIHRleHQgPHNtYWxsPlxuLy8gICAtIEhlYWRpbmdzIDxoMT7igJQ8aDY+XG4vLyAgIC0gQW5jaG9ycyA8YT5cbi8vICAgLSBEaXZpZGVycyA8aHI+XG4vLyAgIC0gTGlzdHMgPHVsPiA8b2w+IDxkbD5cbi8vICAgLSBCbG9ja3F1b3RlcyA8YmxvY2txdW90ZT5cbi8vICAgLSBDb2RlIGJsb2NrcyA8Y29kZT5cbi8vICAgLSBBYmJyZXZpYXRpb25zIDxhYmJyPlxuLy8gICAtIENpdGF0aW9ucyA8Y2l0ZT5cbi8vICAgLSBLZXlzdHJva2VzIDxrYmQ+XG5cbi8vLyBGb250IGZhbWlseSBmb3IgaGVhZGVyIGVsZW1lbnRzLlxuLy8vIEB0eXBlIFN0cmluZyB8IExpc3RcbiRoZWFkZXItZm9udC1mYW1pbHk6ICRib2R5LWZvbnQtZmFtaWx5ICFkZWZhdWx0O1xuXG4vLy8gRm9udCB3ZWlnaHQgb2YgaGVhZGVycy5cbi8vLyBAdHlwZSBTdHJpbmdcbiRoZWFkZXItZm9udC13ZWlnaHQ6ICRnbG9iYWwtd2VpZ2h0LW5vcm1hbCAhZGVmYXVsdDtcblxuLy8vIEZvbnQgc3R5bGUgKGUuZy4gaXRhbGljaXplZCkgb2YgaGVhZGVycy5cbi8vLyBAdHlwZSBTdHJpbmdcbiRoZWFkZXItZm9udC1zdHlsZTogbm9ybWFsICFkZWZhdWx0O1xuXG4vLy8gRm9udCBzdGFjayB1c2VkIGZvciBlbGVtZW50cyB0aGF0IHVzZSBtb25vc3BhY2VkIHR5cGUsIHN1Y2ggYXMgY29kZSBzYW1wbGVzXG4vLy8gQHR5cGUgU3RyaW5nIHwgTGlzdFxuJGZvbnQtZmFtaWx5LW1vbm9zcGFjZTogQ29uc29sYXMsICdMaWJlcmF0aW9uIE1vbm8nLCBDb3VyaWVyLCBtb25vc3BhY2UgIWRlZmF1bHQ7XG5cbi8vLyBTaXplcyBvZiBoZWFkaW5ncyBhdCB2YXJpb3VzIHNjcmVlbiBzaXplcy4gRWFjaCBrZXkgaXMgYSBicmVha3BvaW50LCBhbmQgZWFjaCB2YWx1ZSBpcyBhIG1hcCBvZiBoZWFkaW5nIHNpemVzLlxuLy8vIEB0eXBlIE1hcFxuJGhlYWRlci1zaXplczogKFxuICBzbWFsbDogKFxuICAgICdoMSc6IDI0LFxuICAgICdoMic6IDIwLFxuICAgICdoMyc6IDE5LFxuICAgICdoNCc6IDE4LFxuICAgICdoNSc6IDE3LFxuICAgICdoNic6IDE2LFxuICApLFxuICBtZWRpdW06IChcbiAgICAnaDEnOiA0OCxcbiAgICAnaDInOiA0MCxcbiAgICAnaDMnOiAzMSxcbiAgICAnaDQnOiAyNSxcbiAgICAnaDUnOiAyMCxcbiAgICAnaDYnOiAxNixcbiAgKSxcbikgIWRlZmF1bHQ7XG5cbi8vLyBDb2xvciBvZiBoZWFkZXJzLlxuLy8vIEB0eXBlIENvbG9yXG4kaGVhZGVyLWNvbG9yOiBpbmhlcml0ICFkZWZhdWx0O1xuXG4vLy8gTGluZSBoZWlnaHQgb2YgaGVhZGVycy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRoZWFkZXItbGluZWhlaWdodDogMS40ICFkZWZhdWx0O1xuXG4vLy8gQm90dG9tIG1hcmdpbiBvZiBoZWFkZXJzLlxuLy8vIEB0eXBlIE51bWJlclxuJGhlYWRlci1tYXJnaW4tYm90dG9tOiAwLjVyZW0gIWRlZmF1bHQ7XG5cbi8vLyBUZXh0IHJlbmRlcmluZyBtZXRob2Qgb2YgaGVhZGVycy5cbi8vLyBAdHlwZSBTdHJpbmdcbiRoZWFkZXItdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eSAhZGVmYXVsdDtcblxuLy8vIEZvbnQgc2l6ZSBvZiBgPHNtYWxsPmAgZWxlbWVudHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kc21hbGwtZm9udC1zaXplOiA4MCUgIWRlZmF1bHQ7XG5cbi8vLyBDb2xvciBvZiBgPHNtYWxsPmAgZWxlbWVudHMgd2hlbiBwbGFjZWQgaW5zaWRlIGhlYWRlcnMuXG4vLy8gQHR5cGUgQ29sb3JcbiRoZWFkZXItc21hbGwtZm9udC1jb2xvcjogJG1lZGl1bS1ncmF5ICFkZWZhdWx0O1xuXG4vLy8gTGluZSBoZWlnaHQgb2YgdGV4dCBpbnNpZGUgYDxwPmAgZWxlbWVudHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kcGFyYWdyYXBoLWxpbmVoZWlnaHQ6IDEuNiAhZGVmYXVsdDtcblxuLy8vIEJvdHRvbSBtYXJnaW4gb2YgcGFyYWdyYXBocy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRwYXJhZ3JhcGgtbWFyZ2luLWJvdHRvbTogMXJlbSAhZGVmYXVsdDtcblxuLy8vIFRleHQgcmVuZGVyaW5nIG1ldGhvZCBmb3IgcGFyYWdyYXBoIHRleHQuXG4vLy8gQHR5cGUgU3RyaW5nXG4kcGFyYWdyYXBoLXRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHkgIWRlZmF1bHQ7XG5cbi8vLyBUZXh0IGNvbG9yIG9mIGNvZGUgc2FtcGxlcy5cbi8vLyBAdHlwZSBDb2xvclxuJGNvZGUtY29sb3I6ICRibGFjayAhZGVmYXVsdDtcblxuLy8vIEZvbnQgZmFtaWx5IG9mIGNvZGUgc2FtcGxlcy5cbi8vLyBAdHlwZSBTdHJpbmcgfCBMaXN0XG4kY29kZS1mb250LWZhbWlseTogJGZvbnQtZmFtaWx5LW1vbm9zcGFjZSAhZGVmYXVsdDtcblxuLy8vIEZvbnQgd2VpZ2h0IG9mIHRleHQgaW4gY29kZSBzYW1wbGVzLlxuLy8vIEB0eXBlIFN0cmluZ1xuJGNvZGUtZm9udC13ZWlnaHQ6ICRnbG9iYWwtd2VpZ2h0LW5vcm1hbCAhZGVmYXVsdDtcblxuLy8vIEJhY2tncm91bmQgY29sb3Igb2YgY29kZSBzYW1wbGVzLlxuLy8vIEB0eXBlIENvbG9yXG4kY29kZS1iYWNrZ3JvdW5kOiAkbGlnaHQtZ3JheSAhZGVmYXVsdDtcblxuLy8vIEJvcmRlciBhcm91bmQgY29kZSBzYW1wbGVzLlxuLy8vIEB0eXBlIExpc3RcbiRjb2RlLWJvcmRlcjogMXB4IHNvbGlkICRtZWRpdW0tZ3JheSAhZGVmYXVsdDtcblxuLy8vIFBhZGRpbmcgYXJvdW5kIHRleHQgb2YgY29kZSBzYW1wbGVzLlxuLy8vIEB0eXBlIE51bWJlciB8IExpc3RcbiRjb2RlLXBhZGRpbmc6IHJlbS1jYWxjKDIgNSAxKSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgY29sb3IgZm9yIGxpbmtzLlxuLy8vIEB0eXBlIENvbG9yXG4kYW5jaG9yLWNvbG9yOiAkcHJpbWFyeS1jb2xvciAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgY29sb3IgZm9yIGxpbmtzIG9uIGhvdmVyLlxuLy8vIEB0eXBlIENvbG9yXG4kYW5jaG9yLWNvbG9yLWhvdmVyOiBzY2FsZS1jb2xvcigkYW5jaG9yLWNvbG9yLCAkbGlnaHRuZXNzOiAtMTQlKSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgdGV4dCBkZW9jcmF0aW9uIGZvciBsaW5rcy5cbi8vLyBAdHlwZSBTdHJpbmdcbiRhbmNob3ItdGV4dC1kZWNvcmF0aW9uOiBub25lICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCB0ZXh0IGRlY29yYXRpb24gZm9yIGxpbmtzIG9uIGhvdmVyLlxuLy8vIEB0eXBlIFN0cmluZ1xuJGFuY2hvci10ZXh0LWRlY29yYXRpb24taG92ZXI6IG5vbmUgIWRlZmF1bHQ7XG5cbi8vLyBNYXhpbXVtIHdpZHRoIG9mIGEgZGl2aWRlci5cbi8vLyBAdHlwZSBOdW1iZXJcbiRoci13aWR0aDogJGdsb2JhbC13aWR0aCAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgYm9yZGVyIGZvciBhIGRpdmlkZXIuXG4vLy8gQHR5cGUgTGlzdFxuJGhyLWJvcmRlcjogMXB4IHNvbGlkICRtZWRpdW0tZ3JheSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgbWFyZ2luIGZvciBhIGRpdmlkZXIuXG4vLy8gQHR5cGUgTnVtYmVyIHwgTGlzdFxuJGhyLW1hcmdpbjogcmVtLWNhbGMoMjApIGF1dG8gIWRlZmF1bHQ7XG5cbi8vLyBMaW5lIGhlaWdodCBmb3IgaXRlbXMgaW4gYSBsaXN0LlxuLy8vIEB0eXBlIE51bWJlclxuJGxpc3QtbGluZWhlaWdodDogJHBhcmFncmFwaC1saW5laGVpZ2h0ICFkZWZhdWx0O1xuXG4vLy8gQm90dG9tIG1hcmdpbiBmb3IgaXRlbXMgaW4gYSBsaXN0LlxuLy8vIEB0eXBlIE51bWJlclxuJGxpc3QtbWFyZ2luLWJvdHRvbTogJHBhcmFncmFwaC1tYXJnaW4tYm90dG9tICFkZWZhdWx0O1xuXG4vLy8gQnVsbGV0IHR5cGUgdG8gdXNlIGZvciB1bm9yZGVyZWQgbGlzdHMgKGUuZy4sIGBzcXVhcmVgLCBgY2lyY2xlYCwgYGRpc2NgKS5cbi8vLyBAdHlwZSBTdHJpbmdcbiRsaXN0LXN0eWxlLXR5cGU6IGRpc2MgIWRlZmF1bHQ7XG5cbi8vLyBQb3NpdGlvbmluZyBmb3IgYnVsbGV0cyBvbiB1bm9yZGVyZWQgbGlzdCBpdGVtcy5cbi8vLyBAdHlwZSBTdHJpbmdcbiRsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlICFkZWZhdWx0O1xuXG4vLy8gTGVmdCAob3IgcmlnaHQpIG1hcmdpbiBmb3IgbGlzdHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kbGlzdC1zaWRlLW1hcmdpbjogMS4yNXJlbSAhZGVmYXVsdDtcblxuLy8vIExlZnQgKG9yIHJpZ2h0KSBtYXJnaW4gZm9yIGEgbGlzdCBpbnNpZGUgYSBsaXN0LlxuLy8vIEB0eXBlIE51bWJlclxuJGxpc3QtbmVzdGVkLXNpZGUtbWFyZ2luOiAxLjI1cmVtICFkZWZhdWx0O1xuXG4vLy8gQm90dG9tIG1hcmdpbiBmb3IgYDxkbD5gIGVsZW1lbnRzLlxuLy8vIEB0eXBlIE51bWJlclxuJGRlZm5saXN0LW1hcmdpbi1ib3R0b206IDFyZW0gIWRlZmF1bHQ7XG5cbi8vLyBGb250IHdlaWdodCBmb3IgYDxkdD5gIGVsZW1lbnRzLlxuLy8vIEB0eXBlIFN0cmluZ1xuJGRlZm5saXN0LXRlcm0td2VpZ2h0OiAkZ2xvYmFsLXdlaWdodC1ib2xkICFkZWZhdWx0O1xuXG4vLy8gU3BhY2luZyBiZXR3ZWVuIGA8ZHQ+YCBhbmQgYDxkZD5gIGVsZW1lbnRzLlxuLy8vIEB0eXBlIE51bWJlclxuJGRlZm5saXN0LXRlcm0tbWFyZ2luLWJvdHRvbTogMC4zcmVtICFkZWZhdWx0O1xuXG4vLy8gVGV4dCBjb2xvciBvZiBgPGJsb2NrcXVvdGU+YCBlbGVtZW50cy5cbi8vLyBAdHlwZSBDb2xvclxuJGJsb2NrcXVvdGUtY29sb3I6ICRkYXJrLWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBQYWRkaW5nIGluc2lkZSBhIGA8YmxvY2txdW90ZT5gIGVsZW1lbnQuXG4vLy8gQHR5cGUgTnVtYmVyIHwgTGlzdFxuJGJsb2NrcXVvdGUtcGFkZGluZzogcmVtLWNhbGMoOSAyMCAwIDE5KSAhZGVmYXVsdDtcblxuLy8vIFNpZGUgYm9yZGVyIGZvciBgPGJsb2NrcXVvdGU+YCBlbGVtZW50cy5cbi8vLyBAdHlwZSBMaXN0XG4kYmxvY2txdW90ZS1ib3JkZXI6IDFweCBzb2xpZCAkbWVkaXVtLWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBGb250IHNpemUgZm9yIGA8Y2l0ZT5gIGVsZW1lbnRzLlxuLy8vIEB0eXBlIE51bWJlclxuJGNpdGUtZm9udC1zaXplOiByZW0tY2FsYygxMykgIWRlZmF1bHQ7XG5cbi8vLyBUZXh0IGNvbG9yIGZvciBgPGNpdGU+YCBlbGVtZW50cy5cbi8vLyBAdHlwZSBDb2xvclxuJGNpdGUtY29sb3I6ICRkYXJrLWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBGb250IGZhbWlseSBmb3IgYDxrYmQ+YCBlbGVtZW50cy5cbi8vLyBAdHlwZSBTdHJpbmcgfCBMaXN0XG4ka2V5c3Ryb2tlLWZvbnQ6ICRmb250LWZhbWlseS1tb25vc3BhY2UgIWRlZmF1bHQ7XG5cbi8vLyBUZXh0IGNvbG9yIGZvciBgPGtiZD5gIGVsZW1lbnRzLlxuLy8vIEB0eXBlIENvbG9yXG4ka2V5c3Ryb2tlLWNvbG9yOiAkYmxhY2sgIWRlZmF1bHQ7XG5cbi8vLyBCYWNrZ3JvdW5kIGNvbG9yIGZvciBgPGtiZD5gIGVsZW1lbnRzLlxuLy8vIEB0eXBlIENvbG9yXG4ka2V5c3Ryb2tlLWJhY2tncm91bmQ6ICRsaWdodC1ncmF5ICFkZWZhdWx0O1xuXG4vLy8gUGFkZGluZyBmb3IgYDxrYmQ+YCBlbGVtZW50cy5cbi8vLyBAdHlwZSBOdW1iZXIgfCBMaXN0XG4ka2V5c3Ryb2tlLXBhZGRpbmc6IHJlbS1jYWxjKDIgNCAwKSAhZGVmYXVsdDtcblxuLy8vIEJvcmRlciByYWRpdXMgZm9yIGA8a2JkPmAgZWxlbWVudHMuXG4vLy8gQHR5cGUgTnVtYmVyIHwgTGlzdFxuJGtleXN0cm9rZS1yYWRpdXM6ICRnbG9iYWwtcmFkaXVzICFkZWZhdWx0O1xuXG4vLy8gQm90dG9tIGJvcmRlciBzdHlsZSBmb3IgYDxhYmJyPmAgZWxlbWVudHMuXG4vLy8gQHR5cGUgTGlzdFxuJGFiYnItdW5kZXJsaW5lOiAxcHggZG90dGVkICRibGFjayAhZGVmYXVsdDtcblxuQG1peGluIGZvdW5kYXRpb24tdHlwb2dyYXBoeS1iYXNlIHtcbiAgLy8gVHlwb2dyYXBoeSByZXNldHNcbiAgZGl2LFxuICBkbCxcbiAgZHQsXG4gIGRkLFxuICB1bCxcbiAgb2wsXG4gIGxpLFxuICBoMSxcbiAgaDIsXG4gIGgzLFxuICBoNCxcbiAgaDUsXG4gIGg2LFxuICBwcmUsXG4gIGZvcm0sXG4gIHAsXG4gIGJsb2NrcXVvdGUsXG4gIHRoLFxuICB0ZCB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cblxuICAvLyBQYXJhZ3JhcGhzXG4gIHAge1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogJHBhcmFncmFwaC1saW5laGVpZ2h0O1xuICAgIG1hcmdpbi1ib3R0b206ICRwYXJhZ3JhcGgtbWFyZ2luLWJvdHRvbTtcbiAgICB0ZXh0LXJlbmRlcmluZzogJHBhcmFncmFwaC10ZXh0LXJlbmRlcmluZztcbiAgfVxuXG4gIC8vIEVtcGhhc2l6ZWQgdGV4dFxuICBlbSxcbiAgaSB7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICB9XG5cbiAgLy8gU3Ryb25nIHRleHRcbiAgc3Ryb25nLFxuICBiIHtcbiAgICBmb250LXdlaWdodDogJGdsb2JhbC13ZWlnaHQtYm9sZDtcbiAgICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgfVxuXG4gIC8vIFNtYWxsIHRleHRcbiAgc21hbGwge1xuICAgIGZvbnQtc2l6ZTogJHNtYWxsLWZvbnQtc2l6ZTtcbiAgICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgfVxuXG4gIC8vIEhlYWRpbmdzXG4gIGgxLFxuICBoMixcbiAgaDMsXG4gIGg0LFxuICBoNSxcbiAgaDYge1xuICAgIGZvbnQtZmFtaWx5OiAkaGVhZGVyLWZvbnQtZmFtaWx5O1xuICAgIGZvbnQtd2VpZ2h0OiAkaGVhZGVyLWZvbnQtd2VpZ2h0O1xuICAgIGZvbnQtc3R5bGU6ICRoZWFkZXItZm9udC1zdHlsZTtcbiAgICBjb2xvcjogJGhlYWRlci1jb2xvcjtcbiAgICB0ZXh0LXJlbmRlcmluZzogJGhlYWRlci10ZXh0LXJlbmRlcmluZztcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIG1hcmdpbi1ib3R0b206ICRoZWFkZXItbWFyZ2luLWJvdHRvbTtcbiAgICBsaW5lLWhlaWdodDogJGhlYWRlci1saW5laGVpZ2h0O1xuXG4gICAgc21hbGwge1xuICAgICAgY29sb3I6ICRoZWFkZXItc21hbGwtZm9udC1jb2xvcjtcbiAgICAgIGxpbmUtaGVpZ2h0OiAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlYWRpbmcgc2l6ZXNcbiAgQGVhY2ggJHNpemUsICRoZWFkZXJzIGluICRoZWFkZXItc2l6ZXMge1xuICAgIEBpbmNsdWRlIGJyZWFrcG9pbnQoJHNpemUpIHtcbiAgICAgIEBlYWNoICRoZWFkZXIsICRmb250LXNpemUgaW4gJGhlYWRlcnMge1xuICAgICAgICAjeyRoZWFkZXJ9IHtcbiAgICAgICAgICBmb250LXNpemU6IHJlbS1jYWxjKCRmb250LXNpemUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTGlua3NcbiAgYSB7XG4gICAgY29sb3I6ICRhbmNob3ItY29sb3I7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiAkYW5jaG9yLXRleHQtZGVjb3JhdGlvbjtcbiAgICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG5cbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6ICRhbmNob3ItY29sb3ItaG92ZXI7XG4gICAgICBAaWYgJGFuY2hvci10ZXh0LWRlY29yYXRpb24taG92ZXIgIT0gJGFuY2hvci10ZXh0LWRlY29yYXRpb24ge1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246ICRhbmNob3ItdGV4dC1kZWNvcmF0aW9uLWhvdmVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGltZyB7XG4gICAgICBib3JkZXI6IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gSG9yaXpvbnRhbCBydWxlXG4gIGhyIHtcbiAgICBtYXgtd2lkdGg6ICRoci13aWR0aDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgIGJvcmRlci10b3A6IDA7XG4gICAgYm9yZGVyLWJvdHRvbTogJGhyLWJvcmRlcjtcbiAgICBib3JkZXItbGVmdDogMDtcbiAgICBtYXJnaW46ICRoci1tYXJnaW47XG4gICAgY2xlYXI6IGJvdGg7XG4gIH1cblxuICAvLyBMaXN0c1xuICB1bCxcbiAgb2wsXG4gIGRsIHtcbiAgICBsaW5lLWhlaWdodDogJGxpc3QtbGluZWhlaWdodDtcbiAgICBtYXJnaW4tYm90dG9tOiAkbGlzdC1tYXJnaW4tYm90dG9tO1xuICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246ICRsaXN0LXN0eWxlLXBvc2l0aW9uO1xuICB9XG5cbiAgLy8gTGlzdCBpdGVtc1xuICBsaSB7XG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuICB9XG5cbiAgLy8gVW5vcmRlcmVkIGxpc3RzXG4gIHVsIHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6ICRsaXN0LXN0eWxlLXR5cGU7XG4gICAgbWFyZ2luLSN7JGdsb2JhbC1sZWZ0fTogJGxpc3Qtc2lkZS1tYXJnaW47XG4gIH1cblxuICAvLyBPcmRlcmVkIGxpc3RzXG4gIG9sIHtcbiAgICBtYXJnaW4tI3skZ2xvYmFsLWxlZnR9OiAkbGlzdC1zaWRlLW1hcmdpbjtcbiAgfVxuXG4gIC8vIE5lc3RlZCB1bm9yZGVyZWQvb3JkZXJlZCBsaXN0c1xuICB1bCwgb2wge1xuICAgICYgJiB7XG4gICAgICBtYXJnaW4tI3skZ2xvYmFsLWxlZnR9OiAkbGlzdC1uZXN0ZWQtc2lkZS1tYXJnaW47XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZmluaXRpb24gbGlzdHNcbiAgZGwge1xuICAgIG1hcmdpbi1ib3R0b206ICRkZWZubGlzdC1tYXJnaW4tYm90dG9tO1xuXG4gICAgZHQge1xuICAgICAgbWFyZ2luLWJvdHRvbTogJGRlZm5saXN0LXRlcm0tbWFyZ2luLWJvdHRvbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiAkZGVmbmxpc3QtdGVybS13ZWlnaHQ7XG4gICAgfVxuICB9XG5cbiAgLy8gQmxvY2txdW90ZXNcbiAgYmxvY2txdW90ZSB7XG4gICAgbWFyZ2luOiAwIDAgJHBhcmFncmFwaC1tYXJnaW4tYm90dG9tO1xuICAgIHBhZGRpbmc6ICRibG9ja3F1b3RlLXBhZGRpbmc7XG4gICAgYm9yZGVyLSN7JGdsb2JhbC1sZWZ0fTogJGJsb2NrcXVvdGUtYm9yZGVyO1xuXG4gICAgJiwgcCB7XG4gICAgICBsaW5lLWhlaWdodDogJHBhcmFncmFwaC1saW5laGVpZ2h0O1xuICAgICAgY29sb3I6ICRibG9ja3F1b3RlLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIENpdGF0aW9uc1xuICBjaXRlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBmb250LXNpemU6ICRjaXRlLWZvbnQtc2l6ZTtcbiAgICBjb2xvcjogJGNpdGUtY29sb3I7XG5cbiAgICAmOmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFwyMDE0IFxcMDAyMCc7XG4gICAgfVxuICB9XG5cbiAgLy8gQWJicmV2aWF0aW9uc1xuICBhYmJyIHtcbiAgICBjb2xvcjogJGJvZHktZm9udC1jb2xvcjtcbiAgICBjdXJzb3I6IGhlbHA7XG4gICAgYm9yZGVyLWJvdHRvbTogJGFiYnItdW5kZXJsaW5lO1xuICB9XG5cbiAgLy8gQ29kZVxuICBjb2RlIHtcbiAgICBmb250LWZhbWlseTogJGNvZGUtZm9udC1mYW1pbHk7XG4gICAgZm9udC13ZWlnaHQ6ICRjb2RlLWZvbnQtd2VpZ2h0O1xuICAgIGNvbG9yOiAkY29kZS1jb2xvcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29kZS1iYWNrZ3JvdW5kO1xuICAgIGJvcmRlcjogJGNvZGUtYm9yZGVyO1xuICAgIHBhZGRpbmc6ICRjb2RlLXBhZGRpbmc7XG4gIH1cblxuICAvLyBLZXlzdHJva2VzXG4gIGtiZCB7XG4gICAgcGFkZGluZzogJGtleXN0cm9rZS1wYWRkaW5nO1xuICAgIG1hcmdpbjogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAka2V5c3Ryb2tlLWJhY2tncm91bmQ7XG4gICAgY29sb3I6ICRrZXlzdHJva2UtY29sb3I7XG4gICAgZm9udC1mYW1pbHk6ICRrZXlzdHJva2UtZm9udDtcbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgdHlwb2dyYXBoeS1oZWxwZXJzXG4vLy8vXG5cbi8vLyBEZWZhdWx0IGZvbnQgc2l6ZSBmb3IgbGVhZCBwYXJhZ3JhcGhzLlxuLy8vIEB0eXBlIE51bWJlclxuJGxlYWQtZm9udC1zaXplOiAkZ2xvYmFsLWZvbnQtc2l6ZSAqIDEuMjUgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGxpbmUgaGVpZ2h0IGZvciBsZWFkIHBhcmFncmFwaHMuXG4vLy8gQHR5cGUgU3RyaW5nXG4kbGVhZC1saW5laGVpZ2h0OiAxLjYgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGxpbmUgaGVpZ2h0IGZvciBzdWJoZWFkZXJzLlxuLy8vIEB0eXBlIE51bWJlclxuJHN1YmhlYWRlci1saW5laGVpZ2h0OiAxLjQgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGZvbnQgY29sb3IgZm9yIHN1YmhlYWRlcnMuXG4vLy8gQHR5cGUgQ29sb3JcbiRzdWJoZWFkZXItY29sb3I6ICRkYXJrLWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGZvbnQgd2VpZ2h0IGZvciBzdWJoZWFkZXJzLlxuLy8vIEB0eXBlIFN0cmluZ1xuJHN1YmhlYWRlci1mb250LXdlaWdodDogJGdsb2JhbC13ZWlnaHQtbm9ybWFsICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCB0b3AgbWFyZ2luIGZvciBzdWJoaGVhZGVycy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRzdWJoZWFkZXItbWFyZ2luLXRvcDogMC4ycmVtICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBib3R0b20gbWFyZ2luIGZvciBzdWJoZWFkZXJzLlxuLy8vIEB0eXBlIE51bWJlclxuJHN1YmhlYWRlci1tYXJnaW4tYm90dG9tOiAwLjVyZW0gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGZvbnQgc2l6ZSBmb3Igc3RhdGlzdGljIG51bWJlcnMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kc3RhdC1mb250LXNpemU6IDIuNXJlbSAhZGVmYXVsdDtcblxuQG1peGluIGZvdW5kYXRpb24tdHlwb2dyYXBoeS1oZWxwZXJzIHtcbiAgLy8gVXNlIHRvIGNyZWF0ZSBhIHN1YmhlYWRpbmcgdW5kZXIgYSBtYWluIGhlYWRlclxuICAvLyBNYWtlIHN1cmUgeW91IHBhaXIgdGhlIHR3byBlbGVtZW50cyBpbiBhIDxoZWFkZXI+IGVsZW1lbnQsIGxpa2UgdGhpczpcbiAgLy8gPGhlYWRlcj5cbiAgLy8gICA8aDE+SGVhZGluZzwvaDE+XG4gIC8vICAgPGgyPlN1YmhlYWRpbmc8L2gyPlxuICAvLyA8L2hlYWRlcj5cbiAgLnN1YmhlYWRlciB7XG4gICAgbWFyZ2luLXRvcDogJHN1YmhlYWRlci1tYXJnaW4tdG9wO1xuICAgIG1hcmdpbi1ib3R0b206ICRzdWJoZWFkZXItbWFyZ2luLWJvdHRvbTtcbiAgICBmb250LXdlaWdodDogJHN1YmhlYWRlci1mb250LXdlaWdodDtcbiAgICBsaW5lLWhlaWdodDogJHN1YmhlYWRlci1saW5laGVpZ2h0O1xuICAgIGNvbG9yOiAkc3ViaGVhZGVyLWNvbG9yO1xuICB9XG5cbiAgLy8gVXNlIHRvIHN0eWxlIGFuIGludHJvZHVjdG9yeSBsZWFkLCBkZWNrLCBibHVyYiwgZXRjLlxuICAubGVhZCB7XG4gICAgZm9udC1zaXplOiAkbGVhZC1mb250LXNpemU7XG4gICAgbGluZS1oZWlnaHQ6ICRsZWFkLWxpbmVoZWlnaHQ7XG4gIH1cblxuICAvLyBVc2UgdG8gc3R5bGUgYSBsYXJnZSBudW1iZXIgdG8gZGlzcGxheSBhIHN0YXRpc3RpY1xuICAuc3RhdCB7XG4gICAgZm9udC1zaXplOiAkc3RhdC1mb250LXNpemU7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG5cbiAgICBwICsgJiB7XG4gICAgICBtYXJnaW4tdG9wOiAtMXJlbTtcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgdG8gcmVtb3ZlIHRoZSBidWxsZXRzIGZyb20gYW4gdW5vcmRlcmVkIGxpc3RcbiAgLm5vLWJ1bGxldCB7XG4gICAgbWFyZ2luLSN7JGdsb2JhbC1sZWZ0fTogMDtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuQG1peGluIGZvdW5kYXRpb24tdGV4dC1hbGlnbm1lbnQge1xuICBAZWFjaCAkc2l6ZSBpbiAkYnJlYWtwb2ludC1jbGFzc2VzIHtcbiAgICBAaW5jbHVkZSBicmVha3BvaW50KCRzaXplKSB7XG4gICAgICBAZWFjaCAkYWxpZ24gaW4gKGxlZnQsIHJpZ2h0LCBjZW50ZXIsIGp1c3RpZnkpIHtcbiAgICAgICAgQGlmICRzaXplICE9ICdzbWFsbCcge1xuICAgICAgICAgIC4jeyRzaXplfS10ZXh0LSN7JGFsaWdufSB7XG4gICAgICAgICAgICB0ZXh0LWFsaWduOiAkYWxpZ247XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAudGV4dC0jeyRhbGlnbn0ge1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogJGFsaWduO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgdHlwb2dyYXBoeVxuLy8vL1xuXG4vLyBzY3NzLWxpbnQ6ZGlzYWJsZSBhbGxcblxuQG1peGluIGZvdW5kYXRpb24tcHJpbnQtc3R5bGVzIHtcbiAgLnNob3ctZm9yLXByaW50IHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9XG5cbiAgQG1lZGlhIHByaW50IHtcbiAgICAqIHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICBjb2xvcjogYmxhY2sgIWltcG9ydGFudDsgLy8gQmxhY2sgcHJpbnRzIGZhc3RlcjogaDVicC5jb20vc1xuICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgdGV4dC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAuc2hvdy1mb3ItcHJpbnQgeyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9XG4gICAgLmhpZGUtZm9yLXByaW50IHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9XG5cbiAgICB0YWJsZS5zaG93LWZvci1wcmludCB7IGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7IH1cbiAgICB0aGVhZC5zaG93LWZvci1wcmludCB7IGRpc3BsYXk6IHRhYmxlLWhlYWRlci1ncm91cCAhaW1wb3J0YW50OyB9XG4gICAgdGJvZHkuc2hvdy1mb3ItcHJpbnQgeyBkaXNwbGF5OiB0YWJsZS1yb3ctZ3JvdXAgIWltcG9ydGFudDsgfVxuICAgIHRyLnNob3ctZm9yLXByaW50IHsgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7IH1cbiAgICB0ZC5zaG93LWZvci1wcmludCB7IGRpc3BsYXk6IHRhYmxlLWNlbGwgIWltcG9ydGFudDsgfVxuICAgIHRoLnNob3ctZm9yLXByaW50IHsgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50OyB9XG5cbiAgICAvLyBEaXNwbGF5IHRoZSBVUkwgb2YgYSBsaW5rIGFmdGVyIHRoZSB0ZXh0XG4gICAgYSxcbiAgICBhOnZpc2l0ZWQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9XG4gICAgYVtocmVmXTphZnRlciB7IGNvbnRlbnQ6ICcgKCcgYXR0cihocmVmKSAnKSc7IH1cblxuICAgIC8vIERvbid0IGRpc3BsYXkgdGhlIFVSTCBmb3IgaW1hZ2VzIG9yIEphdmFTY3JpcHQvaW50ZXJuYWwgbGlua3NcbiAgICAuaXIgYTphZnRlcixcbiAgICBhW2hyZWZePSdqYXZhc2NyaXB0OiddOmFmdGVyLFxuICAgIGFbaHJlZl49JyMnXTphZnRlciB7IGNvbnRlbnQ6ICcnOyB9XG5cbiAgICAvLyBEaXNwbGF5IHdoYXQgYW4gYWJicmV2aWF0aW9uIHN0YW5kcyBmb3IgYWZ0ZXIgdGhlIHRleHRcbiAgICBhYmJyW3RpdGxlXTphZnRlciB7IGNvbnRlbnQ6ICcgKCcgYXR0cih0aXRsZSkgJyknOyB9XG5cbiAgICAvLyBQcmV2ZW50IHBhZ2UgYnJlYWtzIGluIHRoZSBtaWRkbGUgb2YgYSBibG9ja3F1b3RlIG9yIHByZWZvcm1hdHRlZCB0ZXh0IGJsb2NrXG4gICAgcHJlLFxuICAgIGJsb2NrcXVvdGUge1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTtcbiAgICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgICB9XG5cbiAgICAvLyBoNWJwLmNvbS90XG4gICAgdGhlYWQgeyBkaXNwbGF5OiB0YWJsZS1oZWFkZXItZ3JvdXA7IH1cblxuICAgIHRyLFxuICAgIGltZyB7IHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsgfVxuXG4gICAgaW1nIHsgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH1cblxuICAgIEBwYWdlIHsgbWFyZ2luOiAwLjVjbTsgfVxuXG4gICAgcCxcbiAgICBoMixcbiAgICBoMyB7XG4gICAgICBvcnBoYW5zOiAzO1xuICAgICAgd2lkb3dzOiAzO1xuICAgIH1cblxuICAgIC8vIEF2b2lkIHBhZ2UgYnJlYWtzIGFmdGVyIGEgaGVhZGluZ1xuICAgIGgyLFxuICAgIGgzIHsgcGFnZS1icmVhay1hZnRlcjogYXZvaWQ7IH1cbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgYnV0dG9uXG4vLy8vXG5cbi8vLyBQYWRkaW5nIGluc2lkZSBidXR0b25zLlxuLy8vIEB0eXBlIExpc3RcbiRidXR0b24tcGFkZGluZzogMC44NWVtIDFlbSAhZGVmYXVsdDtcblxuLy8vIE1hcmdpbiBhcm91bmQgYnV0dG9ucy5cbi8vLyBAdHlwZSBMaXN0XG4kYnV0dG9uLW1hcmdpbjogMCAwICRnbG9iYWwtbWFyZ2luIDAgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGZpbGwgZm9yIGJ1dHRvbnMuIENhbiBlaXRoZXIgYmUgYHNvbGlkYCBvciBgaG9sbG93YC5cbi8vLyBAdHlwZSBLZXl3b3JkXG4kYnV0dG9uLWZpbGw6IHNvbGlkICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBidXR0b25zLlxuLy8vIEB0eXBlIENvbG9yXG4kYnV0dG9uLWJhY2tncm91bmQ6ICRwcmltYXJ5LWNvbG9yICFkZWZhdWx0O1xuXG4vLy8gQmFja2dyb3VuZCBjb2xvciBvbiBob3ZlciBmb3IgYnV0dG9ucy5cbi8vLyBAdHlwZSBDb2xvclxuJGJ1dHRvbi1iYWNrZ3JvdW5kLWhvdmVyOiBzY2FsZS1jb2xvcigkYnV0dG9uLWJhY2tncm91bmQsICRsaWdodG5lc3M6IC0xNSUpICFkZWZhdWx0O1xuXG4vLy8gRm9udCBjb2xvciBmb3IgYnV0dG9ucy5cbi8vLyBAdHlwZSBMaXN0XG4kYnV0dG9uLWNvbG9yOiAjZmZmICFkZWZhdWx0O1xuXG4vLy8gRm9udCBjb2xvciBmb3IgYnV0dG9ucywgaWYgdGhlIGJhY2tncm91bmQgaXMgbGlnaHQuXG4vLy8gQHR5cGUgTGlzdFxuJGJ1dHRvbi1jb2xvci1hbHQ6ICMwMDAgIWRlZmF1bHQ7XG5cbi8vLyBCb3JkZXIgcmFkaXVzIGZvciBidXR0b25zLCBkZWZhdWx0ZWQgdG8gZ2xvYmFsLXJhZGl1cy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRidXR0b24tcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cyAhZGVmYXVsdDtcblxuLy8vIFNpemVzIGZvciBidXR0b25zLlxuLy8vIEB0eXBlIE1hcFxuJGJ1dHRvbi1zaXplczogKFxuICB0aW55OiAwLjZyZW0sXG4gIHNtYWxsOiAwLjc1cmVtLFxuICBkZWZhdWx0OiAwLjlyZW0sXG4gIGxhcmdlOiAxLjI1cmVtLFxuKSAhZGVmYXVsdDtcblxuLy8vIG9wYWNpdHkgZm9yIGEgZGlzYWJsZWQgYnV0dG9uLlxuLy8vIEB0eXBlIExpc3RcbiRidXR0b24tb3BhY2l0eS1kaXNhYmxlZDogMC4yNSAhZGVmYXVsdDtcblxuLy8gSW50ZXJuYWw6IGZsaXAgZnJvbSBtYXJnaW4tcmlnaHQgdG8gbWFyZ2luLWxlZnQgZm9yIGRlZmF1bHRzXG5AaWYgJGdsb2JhbC10ZXh0LWRpcmVjdGlvbiA9PSAncnRsJyB7XG4gICRidXR0b24tbWFyZ2luOiAwIDAgJGdsb2JhbC1tYXJnaW4gJGdsb2JhbC1tYXJnaW4gIWRlZmF1bHQ7XG59XG5cbi8vIFRPRE86IERvY3VtZW50IGJ1dHRvbi1iYXNlKCkgbWl4aW5cbkBtaXhpbiBidXR0b24tYmFzZSB7XG4gIEBpbmNsdWRlIGRpc2FibGUtbW91c2Utb3V0bGluZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjI1cyBlYXNlLW91dCwgY29sb3IgMC4yNXMgZWFzZS1vdXQ7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiAkYnV0dG9uLXJhZGl1cztcbiAgcGFkZGluZzogJGJ1dHRvbi1wYWRkaW5nO1xuICBtYXJnaW46ICRidXR0b24tbWFyZ2luO1xuICBmb250LXNpemU6IG1hcC1nZXQoJGJ1dHRvbi1zaXplcywgZGVmYXVsdCk7XG59XG5cbi8vLyBFeHBhbmRzIGEgYnV0dG9uIHRvIG1ha2UgaXQgZnVsbC13aWR0aC5cbi8vLyBAcGFyYW0ge0Jvb2xlYW59ICRleHBhbmQgW3RydWVdIC0gU2V0IHRvIGB0cnVlYCB0byBlbmFibGUgdGhlIGV4cGFuZCBiZWhhdmlvci4gU2V0IHRvIGBmYWxzZWAgdG8gcmV2ZXJzZSB0aGlzIGJlaGF2aW9yLlxuQG1peGluIGJ1dHRvbi1leHBhbmQoJGV4cGFuZDogdHJ1ZSkge1xuICBAaWYgJGV4cGFuZCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICB9XG4gIEBlbHNlIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgbWFyZ2luOiAkYnV0dG9uLW1hcmdpbjtcbiAgfVxufVxuXG4vLy8gU2V0cyB0aGUgdmlzdWFsIHN0eWxlIG9mIGEgYnV0dG9uLlxuLy8vIEBwYXJhbSB7Q29sb3J9ICRiYWNrZ3JvdW5kIFskYnV0dG9uLWJhY2tncm91bmRdIC0gQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgYnV0dG9uLlxuLy8vIEBwYXJhbSB7Q29sb3J9ICRiYWNrZ3JvdW5kLWhvdmVyIFskYnV0dG9uLWJhY2tncm91bmQtaG92ZXJdIC0gQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgYnV0dG9uIG9uIGhvdmVyLiBTZXQgdG8gYGF1dG9gIHRvIGhhdmUgdGhlIG1peGluIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBob3ZlciBjb2xvci5cbi8vLyBAcGFyYW0ge0NvbG9yfSAkY29sb3IgWyRidXR0b24tY29sb3JdIC0gVGV4dCBjb2xvciBvZiB0aGUgYnV0dG9uLiBTZXQgdG8gYGF1dG9gIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBjb2xvciBiYXNlZCBvbiB0aGUgYmFja2dyb3VuZCBjb2xvci5cbkBtaXhpbiBidXR0b24tc3R5bGUoXG4gICRiYWNrZ3JvdW5kOiAkYnV0dG9uLWJhY2tncm91bmQsXG4gICRiYWNrZ3JvdW5kLWhvdmVyOiAkYnV0dG9uLWJhY2tncm91bmQtaG92ZXIsXG4gICRjb2xvcjogJGJ1dHRvbi1jb2xvclxuKSB7XG4gIEBpZiAkY29sb3IgPT0gYXV0byB7XG4gICAgJGNvbG9yOiBmb3JlZ3JvdW5kKCRiYWNrZ3JvdW5kKTtcbiAgfVxuXG4gIEBpZiAkYmFja2dyb3VuZC1ob3ZlciA9PSBhdXRvIHtcbiAgICAkYmFja2dyb3VuZC1ob3Zlcjogc2NhbGUtY29sb3IoJGJhY2tncm91bmQsICRsaWdodG5lc3M6IC0yMCUpO1xuICB9XG5cbiAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQ7XG4gIGNvbG9yOiAkY29sb3I7XG5cbiAgJjpob3ZlciwgJjpmb2N1cyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQtaG92ZXI7XG4gICAgY29sb3I6ICRjb2xvcjtcbiAgfVxufVxuXG4vLy8gUmVtb3ZlcyBiYWNrZ3JvdW5kIGZpbGwgb24gaG92ZXIgYW5kIGZvY3VzIGZvciBob2xsb3cgYnV0dG9ucy5cbkBtaXhpbiBidXR0b24taG9sbG93IHtcbiAgJixcbiAgJjpob3ZlciwgJjpmb2N1cyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbn1cblxuQG1peGluIGJ1dHRvbi1ob2xsb3ctc3R5bGUoJGNvbG9yOiAkcHJpbWFyeS1jb2xvcikge1xuICAkY29sb3ItaG92ZXI6IHNjYWxlLWNvbG9yKCRjb2xvciwgJGxpZ2h0bmVzczogLTUwJSk7XG5cbiAgYm9yZGVyOiAxcHggc29saWQgJGNvbG9yO1xuICBjb2xvcjogJGNvbG9yO1xuXG4gICY6aG92ZXIsICY6Zm9jdXMge1xuICAgIGJvcmRlci1jb2xvcjogJGNvbG9yLWhvdmVyO1xuICAgIGNvbG9yOiAkY29sb3ItaG92ZXI7XG4gIH1cbn1cblxuLy8vIEFkZHMgZGlzYWJsZWQgc3R5bGVzIHRvIGEgYnV0dG9uIGJ5IGZhZGluZyB0aGUgZWxlbWVudCwgcmVzZXRpbmcgdGhlIGN1cnNvciwgYW5kIGRpc2FibGluZyBwb2ludGVyIGV2ZW50cy5cbkBtaXhpbiBidXR0b24tZGlzYWJsZWQge1xuICBvcGFjaXR5OiAkYnV0dG9uLW9wYWNpdHktZGlzYWJsZWQ7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4vLy8gQWRkcyBhIGRyb3Bkb3duIGFycm93IHRvIGEgYnV0dG9uLlxuLy8vIEBwYXJhbSB7TnVtYmVyfSAkc2l6ZSBbMC40ZW1dIC0gU2l6ZSBvZiB0aGUgYXJyb3cuIFdlIHJlY29tbWVuZCB1c2luZyBhbiBgZW1gIHZhbHVlIHNvIHRoZSB0cmlhbmdsZSBzY2FsZXMgd2hlbiB1c2VkIGluc2lkZSBkaWZmZXJlbnQgc2l6ZXMgb2YgYnV0dG9ucy5cbi8vLyBAcGFyYW0ge0NvbG9yfSAkY29sb3IgW3doaXRlXSAtIENvbG9yIG9mIHRoZSBhcnJvdy5cbi8vLyBAcGFyYW0ge051bWJlcn0gJG9mZnNldCBbJGJ1dHRvbi1wYWRkaW5nXSAtIERpc3RhbmNlIGJldHdlZW4gdGhlIGFycm93IGFuZCB0aGUgdGV4dCBvZiB0aGUgYnV0dG9uLiBEZWZhdWx0cyB0byB3aGF0ZXZlciB0aGUgcmlnaHQgcGFkZGluZyBvZiBhIGJ1dHRvbiBpcy5cbkBtaXhpbiBidXR0b24tZHJvcGRvd24oXG4gICRzaXplOiAwLjRlbSxcbiAgJGNvbG9yOiAkd2hpdGUsXG4gICRvZmZzZXQ6IGdldC1zaWRlKCRidXR0b24tcGFkZGluZywgcmlnaHQpXG4pIHtcbiAgJjo6YWZ0ZXIge1xuICAgIEBpbmNsdWRlIGNzcy10cmlhbmdsZSgkc2l6ZSwgJGNvbG9yLCBkb3duKTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAwLjRlbTsgLy8gQWxpZ25zIHRoZSBhcnJvdyB3aXRoIHRoZSB0ZXh0IG9mIHRoZSBidXR0b25cbiAgICBmbG9hdDogI3skZ2xvYmFsLXJpZ2h0fTtcbiAgICBtYXJnaW4tI3skZ2xvYmFsLWxlZnR9OiBnZXQtc2lkZSgkYnV0dG9uLXBhZGRpbmcsIHJpZ2h0KTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cbn1cblxuLy8vIEFkZHMgYWxsIHN0eWxlcyBmb3IgYSBidXR0b24uIEZvciBtb3JlIGdyYW51bGFyIGNvbnRyb2wgb3ZlciBzdHlsZXMsIHVzZSB0aGUgaW5kaXZpZHVhbCBidXR0b24gbWl4aW5zLlxuLy8vIEBwYXJhbSB7Qm9vbGVhbn0gJGV4cGFuZCBbZmFsc2VdIC0gU2V0IHRvIGB0cnVlYCB0byBtYWtlIHRoZSBidXR0b24gZnVsbC13aWR0aC5cbi8vLyBAcGFyYW0ge0NvbG9yfSAkYmFja2dyb3VuZCBbJGJ1dHRvbi1iYWNrZ3JvdW5kXSAtIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIGJ1dHRvbi5cbi8vLyBAcGFyYW0ge0NvbG9yfSAkYmFja2dyb3VuZC1ob3ZlciBbJGJ1dHRvbi1iYWNrZ3JvdW5kLWhvdmVyXSAtIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIGJ1dHRvbiBvbiBob3Zlci4gU2V0IHRvIGBhdXRvYCB0byBoYXZlIHRoZSBtaXhpbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGEgaG92ZXIgY29sb3IuXG4vLy8gQHBhcmFtIHtDb2xvcn0gJGNvbG9yIFskYnV0dG9uLWNvbG9yXSAtIFRleHQgY29sb3Igb2YgdGhlIGJ1dHRvbi4gU2V0IHRvIGBhdXRvYCB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGEgY29sb3IgYmFzZWQgb24gdGhlIGJhY2tncm91bmQgY29sb3IuXG4vLy8gQHBhcmFtIHtLZXl3b3JkfSAkc3R5bGUgW3NvbGlkXSAtIFNldCB0byBgaG9sbG93YCB0byBjcmVhdGUgYSBob2xsb3cgYnV0dG9uLiBUaGUgY29sb3IgZGVmaW5lZCBpbiBgJGJhY2tncm91bmRgIHdpbGwgYmUgdXNlZCBhcyB0aGUgcHJpbWFyeSBjb2xvciBvZiB0aGUgYnV0dG9uLlxuQG1peGluIGJ1dHRvbihcbiAgJGV4cGFuZDogZmFsc2UsXG4gICRiYWNrZ3JvdW5kOiAkYnV0dG9uLWJhY2tncm91bmQsXG4gICRiYWNrZ3JvdW5kLWhvdmVyOiAkYnV0dG9uLWJhY2tncm91bmQtaG92ZXIsXG4gICRjb2xvcjogJGJ1dHRvbi1jb2xvcixcbiAgJHN0eWxlOiAkYnV0dG9uLWZpbGxcbikge1xuICBAaW5jbHVkZSBidXR0b24tYmFzZTtcblxuICBAaWYgJHN0eWxlID09IHNvbGlkIHtcbiAgICBAaW5jbHVkZSBidXR0b24tc3R5bGUoJGJhY2tncm91bmQsICRiYWNrZ3JvdW5kLWhvdmVyLCAkY29sb3IpO1xuICB9XG4gIEBlbHNlIGlmICRzdHlsZSA9PSBob2xsb3cge1xuICAgIEBpbmNsdWRlIGJ1dHRvbi1ob2xsb3c7XG4gICAgQGluY2x1ZGUgYnV0dG9uLWhvbGxvdy1zdHlsZSgkYmFja2dyb3VuZCk7XG4gIH1cblxuICBAaWYgJGV4cGFuZCB7XG4gICAgQGluY2x1ZGUgYnV0dG9uLWV4cGFuZDtcbiAgfVxufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1idXR0b24ge1xuICAuYnV0dG9uIHtcbiAgICBAaW5jbHVkZSBidXR0b247XG5cbiAgICAvLyBTaXplc1xuICAgICYudGlueSAgICAgeyBmb250LXNpemU6IG1hcC1nZXQoJGJ1dHRvbi1zaXplcywgdGlueSk7IH1cbiAgICAmLnNtYWxsICAgIHsgZm9udC1zaXplOiBtYXAtZ2V0KCRidXR0b24tc2l6ZXMsIHNtYWxsKTsgfVxuICAgICYubGFyZ2UgICAgeyBmb250LXNpemU6IG1hcC1nZXQoJGJ1dHRvbi1zaXplcywgbGFyZ2UpOyB9XG4gICAgJi5leHBhbmRlZCB7IEBpbmNsdWRlIGJ1dHRvbi1leHBhbmQ7IH1cblxuICAgIC8vIENvbG9yc1xuICAgIEBlYWNoICRuYW1lLCAkY29sb3IgaW4gJGZvdW5kYXRpb24tY29sb3JzIHtcbiAgICAgIEBpZiAkYnV0dG9uLWZpbGwgIT0gaG9sbG93IHtcbiAgICAgICAgJi4jeyRuYW1lfSB7XG4gICAgICAgICAgQGluY2x1ZGUgYnV0dG9uLXN0eWxlKCRjb2xvciwgYXV0byk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEBlbHNlIHtcbiAgICAgICAgJi4jeyRuYW1lfSB7XG4gICAgICAgICAgQGluY2x1ZGUgYnV0dG9uLWhvbGxvdy1zdHlsZSgkY29sb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgJi4jeyRuYW1lfS5kcm9wZG93bjo6YWZ0ZXIge1xuICAgICAgICAgIGJvcmRlci10b3AtY29sb3I6ICRjb2xvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhvbGxvdyBzdHlsZVxuICAgIEBpZiAkYnV0dG9uLWZpbGwgIT0gaG9sbG93IHtcbiAgICAgICYuaG9sbG93IHtcbiAgICAgICAgQGluY2x1ZGUgYnV0dG9uLWhvbGxvdztcbiAgICAgICAgQGluY2x1ZGUgYnV0dG9uLWhvbGxvdy1zdHlsZTtcblxuICAgICAgICBAZWFjaCAkbmFtZSwgJGNvbG9yIGluICRmb3VuZGF0aW9uLWNvbG9ycyB7XG4gICAgICAgICAgJi4jeyRuYW1lfSB7XG4gICAgICAgICAgICBAaW5jbHVkZSBidXR0b24taG9sbG93LXN0eWxlKCRjb2xvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZWQgc3R5bGVcbiAgICAmLmRpc2FibGVkLFxuICAgICZbZGlzYWJsZWRdIHtcbiAgICAgIEBpbmNsdWRlIGJ1dHRvbi1kaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvLyBEcm9wZG93biBhcnJvd1xuICAgICYuZHJvcGRvd24ge1xuICAgICAgQGluY2x1ZGUgYnV0dG9uLWRyb3Bkb3duO1xuXG4gICAgICBAaWYgJGJ1dHRvbi1maWxsID09IGhvbGxvdyB7XG4gICAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAkYnV0dG9uLWJhY2tncm91bmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCdXR0b24gd2l0aCBkcm9wZG93biBhcnJvdyBvbmx5XG4gICAgJi5hcnJvdy1vbmx5OjphZnRlciB7XG4gICAgICBtYXJnaW4tI3skZ2xvYmFsLWxlZnR9OiAwO1xuICAgICAgZmxvYXQ6IG5vbmU7XG4gICAgICB0b3A6IDAuMmVtO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgZm9ybXNcbi8vLy9cblxuLy8vIEZvbnQgY29sb3Igb2YgdGV4dCBpbnB1dHMuXG4vLy8gQHR5cGUgQ29sb3JcbiRpbnB1dC1jb2xvcjogJGJsYWNrICFkZWZhdWx0O1xuXG4vLy8gRm9udCBmYW1pbHkgb2YgdGV4dCBpbnB1dHMuXG4vLy8gQHR5cGUgRm9udFxuJGlucHV0LWZvbnQtZmFtaWx5OiBpbmhlcml0ICFkZWZhdWx0O1xuXG4vLy8gRm9udCBzaXplIG9mIHRleHQgaW5wdXRzLlxuLy8vIEB0eXBlIE51bWJlclxuJGlucHV0LWZvbnQtc2l6ZTogcmVtLWNhbGMoMTYpICFkZWZhdWx0O1xuXG4vLy8gQmFja2dyb3VuZCBjb2xvciBvZiB0ZXh0IGlucHV0cy5cbi8vLyBAdHlwZSBDb2xvclxuJGlucHV0LWJhY2tncm91bmQ6ICR3aGl0ZSAhZGVmYXVsdDtcblxuLy8vIEJhY2tncm91bmQgY29sb3Igb2YgZm9jdXNlZCBvZiB0ZXh0IGlucHV0cy5cbi8vLyBAdHlwZSBDb2xvclxuJGlucHV0LWJhY2tncm91bmQtZm9jdXM6ICR3aGl0ZSAhZGVmYXVsdDtcblxuLy8vIEJhY2tncm91bmQgY29sb3Igb2YgZGlzYWJsZWQgdGV4dCBpbnB1dHMuXG4vLy8gQHR5cGUgQ29sb3JcbiRpbnB1dC1iYWNrZ3JvdW5kLWRpc2FibGVkOiAkbGlnaHQtZ3JheSAhZGVmYXVsdDtcblxuLy8vIEJvcmRlciBhcm91bmQgdGV4dCBpbnB1dHMuXG4vLy8gQHR5cGUgQm9yZGVyXG4kaW5wdXQtYm9yZGVyOiAxcHggc29saWQgJG1lZGl1bS1ncmF5ICFkZWZhdWx0O1xuXG4vLy8gQm9yZGVyIGFyb3VuZCBmb2N1c2VkIHRleHQgaW5wdXRzLlxuLy8vIEB0eXBlIENvbG9yXG4kaW5wdXQtYm9yZGVyLWZvY3VzOiAxcHggc29saWQgJGRhcmstZ3JheSAhZGVmYXVsdDtcblxuLy8vIEJveCBzaGFkb3cgaW5zaWRlIHRleHQgaW5wdXRzIHdoZW4gbm90IGZvY3VzZWQuXG4vLy8gQHR5cGUgU2hhZG93XG4kaW5wdXQtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgkYmxhY2ssIDAuMSkgIWRlZmF1bHQ7XG5cbi8vLyBCb3ggc2hhZG93IG91dHNpZGUgdGV4dCBpbnB1dHMgd2hlbiBmb2N1c2VkLlxuLy8vIEB0eXBlIFNoYWRvd1xuJGlucHV0LXNoYWRvdy1mb2N1czogMCAwIDVweCAkbWVkaXVtLWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBDdXJzb3IgdG8gdXNlIHdoZW4gaG92ZXJpbmcgb3ZlciBhIGRpc2FibGVkIHRleHQgaW5wdXQuXG4vLy8gQHR5cGUgQ3Vyc29yXG4kaW5wdXQtY3Vyc29yLWRpc2FibGVkOiBkZWZhdWx0ICFkZWZhdWx0O1xuXG4vLy8gUHJvcGVydGllcyB0byB0cmFuc2l0aW9uIG9uIHRleHQgaW5wdXRzLlxuLy8vIEB0eXBlIFRyYW5zaXRpb25cbiRpbnB1dC10cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuNXMsIGJvcmRlci1jb2xvciAwLjI1cyBlYXNlLWluLW91dCAhZGVmYXVsdDtcblxuLy8vIEVuYWJsZXMgdGhlIHVwL2Rvd24gYnV0dG9ucyB0aGF0IENocm9tZSBhbmQgRmlyZWZveCBhZGQgdG8gYDxpbnB1dCB0eXBlPSdudW1iZXInPmAgZWxlbWVudHMuXG4vLy8gQHR5cGUgQm9vbGVhblxuJGlucHV0LW51bWJlci1zcGlubmVyczogdHJ1ZSAhZGVmYXVsdDtcblxuLy8vIFJhZGl1cyBmb3IgdGV4dCBpbnB1dHMuXG4vLy8gQHR5cGUgQm9yZGVyXG4kaW5wdXQtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cyAhZGVmYXVsdDtcblxuQG1peGluIGZvcm0tZWxlbWVudCB7XG4gICRoZWlnaHQ6ICgkaW5wdXQtZm9udC1zaXplICsgKCRmb3JtLXNwYWNpbmcgKiAxLjUpIC0gcmVtLWNhbGMoMSkpO1xuXG4gIGRpc3BsYXk6IGJsb2NrO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAkaGVpZ2h0O1xuICBwYWRkaW5nOiAkZm9ybS1zcGFjaW5nIC8gMjtcbiAgYm9yZGVyOiAkaW5wdXQtYm9yZGVyO1xuICBtYXJnaW46IDAgMCAkZm9ybS1zcGFjaW5nO1xuXG4gIGZvbnQtZmFtaWx5OiAkaW5wdXQtZm9udC1mYW1pbHk7XG4gIGZvbnQtc2l6ZTogJGlucHV0LWZvbnQtc2l6ZTtcbiAgY29sb3I6ICRpbnB1dC1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0LWJhY2tncm91bmQ7XG4gIGJveC1zaGFkb3c6ICRpbnB1dC1zaGFkb3c7XG4gIGJvcmRlci1yYWRpdXM6ICRpbnB1dC1yYWRpdXM7XG5cbiAgQGlmIGhhcy12YWx1ZSgkaW5wdXQtdHJhbnNpdGlvbikge1xuICAgIHRyYW5zaXRpb246ICRpbnB1dC10cmFuc2l0aW9uO1xuICB9XG5cbiAgLy8gRm9jdXMgc3RhdGVcbiAgJjpmb2N1cyB7XG4gICAgYm9yZGVyOiAkaW5wdXQtYm9yZGVyLWZvY3VzO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRpbnB1dC1iYWNrZ3JvdW5kLWZvY3VzO1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogJGlucHV0LXNoYWRvdy1mb2N1cztcblxuICAgIEBpZiBoYXMtdmFsdWUoJGlucHV0LXRyYW5zaXRpb24pIHtcbiAgICAgIHRyYW5zaXRpb246ICRpbnB1dC10cmFuc2l0aW9uO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1mb3JtLXRleHQge1xuICAvLyBUZXh0IGlucHV0c1xuICAje3RleHQtaW5wdXRzKCl9LFxuICB0ZXh0YXJlYSB7XG4gICAgQGluY2x1ZGUgZm9ybS1lbGVtZW50O1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gIH1cblxuICAvLyBUZXh0IGFyZWFzXG4gIHRleHRhcmVhIHtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG5cbiAgICAmW3Jvd3NdIHtcbiAgICAgIGhlaWdodDogYXV0bztcbiAgICB9XG4gIH1cblxuICAvLyBEaXNhYmxlZC9yZWFkb25seSBzdGF0ZVxuICBpbnB1dCxcbiAgdGV4dGFyZWEge1xuICAgICY6ZGlzYWJsZWQsXG4gICAgJltyZWFkb25seV0ge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0LWJhY2tncm91bmQtZGlzYWJsZWQ7XG4gICAgICBjdXJzb3I6ICRpbnB1dC1jdXJzb3ItZGlzYWJsZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzZXQgc3R5bGVzIG9uIGJ1dHRvbi1saWtlIGlucHV0c1xuICBbdHlwZT0nc3VibWl0J10sXG4gIFt0eXBlPSdidXR0b24nXSB7XG4gICAgYm9yZGVyLXJhZGl1czogJGJ1dHRvbi1yYWRpdXM7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgfVxuXG4gIC8vIFJlc2V0IE5vcm1hbGl6ZSBzZXR0aW5nIGNvbnRlbnQtYm94IHRvIHNlYXJjaCBlbGVtZW50c1xuICAvLyBzY3NzLWxpbnQ6ZGlzYWJsZSBRdWFsaWZ5aW5nRWxlbWVudFxuICBpbnB1dFt0eXBlPSdzZWFyY2gnXSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgfVxuXG4gIC8vIE51bWJlciBpbnB1dCBzdHlsZXNcbiAgW3R5cGU9J251bWJlciddIHtcbiAgICBAaWYgbm90ICRpbnB1dC1udW1iZXItc3Bpbm5lcnMge1xuICAgICAgLW1vei1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG5cbiAgICAgIFt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbiAgICAgIFt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgZm9ybXNcbi8vLy9cblxuQG1peGluIGZvdW5kYXRpb24tZm9ybS1jaGVja2JveCB7XG4gIFt0eXBlPSdmaWxlJ10sXG4gIFt0eXBlPSdjaGVja2JveCddLFxuICBbdHlwZT0ncmFkaW8nXSB7XG4gICAgbWFyZ2luOiAwIDAgJGZvcm0tc3BhY2luZztcbiAgfVxuXG4gIC8vIFN0eWxlcyBmb3IgaW5wdXQvbGFiZWwgc2libGluZ3NcbiAgW3R5cGU9J2NoZWNrYm94J10gKyBsYWJlbCxcbiAgW3R5cGU9J3JhZGlvJ10gKyBsYWJlbCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi0jeyRnbG9iYWwtbGVmdH06ICRmb3JtLXNwYWNpbmcgKiAwLjU7XG4gICAgbWFyZ2luLSN7JGdsb2JhbC1yaWdodH06ICRmb3JtLXNwYWNpbmc7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG4gIH1cblxuICAvLyBTdHlsZXMgZm9yIGlucHV0cyBpbnNpZGUgbGFiZWxzXG4gIGxhYmVsID4gW3R5cGU9J2NoZWNrYm94J10sXG4gIGxhYmVsID4gW3R5cGU9J2xhYmVsJ10ge1xuICAgIG1hcmdpbi0jeyRnbG9iYWwtcmlnaHR9OiAkZm9ybS1zcGFjaW5nICogMC41O1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIGZpbGUgaW5wdXQgd2lkdGhcbiAgW3R5cGU9J2ZpbGUnXSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGZvcm1zXG4vLy8vXG5cbi8vLyBDb2xvciBmb3IgZm9ybSBsYWJlbHMuXG4vLy8gQHR5cGUgQ29sb3JcbiRmb3JtLWxhYmVsLWNvbG9yOiAkYmxhY2sgIWRlZmF1bHQ7XG5cbi8vLyBGb250IHNpemUgZm9yIGZvcm0gbGFiZWxzLlxuLy8vIEB0eXBlIE51bWJlclxuJGZvcm0tbGFiZWwtZm9udC1zaXplOiByZW0tY2FsYygxNCkgIWRlZmF1bHQ7XG5cbi8vLyBGb250IHdlaWdodCBmb3IgZm9ybSBsYWJlbHMuXG4vLy8gQHR5cGUgS2V5d29yZFxuJGZvcm0tbGFiZWwtZm9udC13ZWlnaHQ6ICRnbG9iYWwtd2VpZ2h0LW5vcm1hbCAhZGVmYXVsdDtcblxuLy8vIExpbmUgaGVpZ2h0IGZvciBmb3JtIGxhYmVscy4gVGhlIGhpZ2hlciB0aGUgbnVtYmVyLCB0aGUgbW9yZSBzcGFjZSBiZXR3ZWVuIHRoZSBsYWJlbCBhbmQgaXRzIGlucHV0IGZpZWxkLlxuLy8vIEB0eXBlIE51bWJlclxuJGZvcm0tbGFiZWwtbGluZS1oZWlnaHQ6IDEuOCAhZGVmYXVsdDtcblxuQG1peGluIGZvcm0tbGFiZWwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6ICRmb3JtLWxhYmVsLWZvbnQtc2l6ZTtcbiAgZm9udC13ZWlnaHQ6ICRmb3JtLWxhYmVsLWZvbnQtd2VpZ2h0O1xuICBsaW5lLWhlaWdodDogJGZvcm0tbGFiZWwtbGluZS1oZWlnaHQ7XG4gIGNvbG9yOiAkZm9ybS1sYWJlbC1jb2xvcjtcbn1cblxuQG1peGluIGZvcm0tbGFiZWwtbWlkZGxlIHtcbiAgJGlucHV0LWJvcmRlci13aWR0aDogZ2V0LWJvcmRlci12YWx1ZSgkaW5wdXQtYm9yZGVyLCB3aWR0aCk7XG4gIG1hcmdpbjogMCAwICRmb3JtLXNwYWNpbmc7XG4gIHBhZGRpbmc6ICgkZm9ybS1zcGFjaW5nIC8gMiArIHJlbS1jYWxjKCRpbnB1dC1ib3JkZXItd2lkdGgpKSAwO1xufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1mb3JtLWxhYmVsIHtcbiAgbGFiZWwge1xuICAgIEBpbmNsdWRlIGZvcm0tbGFiZWw7XG5cbiAgICAmLm1pZGRsZSB7XG4gICAgICBAaW5jbHVkZSBmb3JtLWxhYmVsLW1pZGRsZTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGZvcm1zXG4vLy8vXG5cbi8vLyBEZWZhdWx0IGNvbG9yIGZvciBoZWxwIHRleHQuXG4vLy8gQHR5cGUgQ29sb3JcbiRoZWxwdGV4dC1jb2xvcjogIzMzMyAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgZm9udCBzaXplIGZvciBoZWxwIHRleHQuXG4vLy8gQHR5cGUgTnVtYmVyXG4kaGVscHRleHQtZm9udC1zaXplOiByZW0tY2FsYygxMykgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGZvbnQgc3R5bGUgZm9yIGhlbHAgdGV4dC5cbi8vLyBAdHlwZSBLZXl3b3JkXG4kaGVscHRleHQtZm9udC1zdHlsZTogaXRhbGljICFkZWZhdWx0O1xuXG5AbWl4aW4gZm91bmRhdGlvbi1mb3JtLWhlbHB0ZXh0IHtcbiAgLmhlbHAtdGV4dCB7XG4gICAgJG1hcmdpbi10b3A6ICgkZm9ybS1zcGFjaW5nICogMC41KSAqIC0xO1xuXG4gICAgbWFyZ2luLXRvcDogJG1hcmdpbi10b3A7XG4gICAgZm9udC1zaXplOiAkaGVscHRleHQtZm9udC1zaXplO1xuICAgIGZvbnQtc3R5bGU6ICRoZWxwdGV4dC1mb250LXN0eWxlO1xuICAgIGNvbG9yOiAkaGVscHRleHQtY29sb3I7XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGZvcm1zXG4vLy8vXG5cbi8vLyBDb2xvciBvZiBsYWJlbHMgcHJlZml4ZWQgdG8gYW4gaW5wdXQuXG4vLy8gQHR5cGUgQ29sb3JcbiRpbnB1dC1wcmVmaXgtY29sb3I6ICRibGFjayAhZGVmYXVsdDtcblxuLy8vIEJhY2tncm91bmQgY29sb3Igb2YgbGFiZWxzIHByZWZpeGVkIHRvIGFuIGlucHV0LlxuLy8vIEB0eXBlIENvbG9yXG4kaW5wdXQtcHJlZml4LWJhY2tncm91bmQ6ICRsaWdodC1ncmF5ICFkZWZhdWx0O1xuXG4vLy8gQm9yZGVyIGFyb3VuZCBsYWJlbHMgcHJlZml4ZWQgdG8gYW4gaW5wdXQuXG4vLy8gQHR5cGUgQm9yZGVyXG4kaW5wdXQtcHJlZml4LWJvcmRlcjogMXB4IHNvbGlkICRtZWRpdW0tZ3JheSAhZGVmYXVsdDtcblxuLy8vIExlZnQvcmlnaHQgcGFkZGluZyBvZiBhbiBwcmUvcG9zdGZpeGVkIGlucHV0IGxhYmVsXG4kaW5wdXQtcHJlZml4LXBhZGRpbmc6IDFyZW0gIWRlZmF1bHQ7XG5cbkBtaXhpbiBmb3VuZGF0aW9uLWZvcm0tcHJlcG9zdGZpeCB7XG4gICRoZWlnaHQ6ICgkaW5wdXQtZm9udC1zaXplICsgJGZvcm0tc3BhY2luZyAqIDEuNSk7XG5cblxuICAuaW5wdXQtZ3JvdXAge1xuICAgIGRpc3BsYXk6IHRhYmxlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206ICRmb3JtLXNwYWNpbmc7XG5cbiAgICA+IDpmaXJzdC1jaGlsZCB7XG4gICAgICBib3JkZXItcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cyAwIDAgJGdsb2JhbC1yYWRpdXM7XG4gICAgfVxuXG4gICAgPiA6bGFzdC1jaGlsZCB7XG4gICAgICA+ICoge1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwICRnbG9iYWwtcmFkaXVzICRnbG9iYWwtcmFkaXVzIDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJWlucHV0LWdyb3VwLWNoaWxkIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIG1hcmdpbjogMDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB9XG5cbiAgLmlucHV0LWdyb3VwLWxhYmVsIHtcbiAgICBAZXh0ZW5kICVpbnB1dC1ncm91cC1jaGlsZDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgd2lkdGg6IDElO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwYWRkaW5nOiAwICRpbnB1dC1wcmVmaXgtcGFkZGluZztcbiAgICBiYWNrZ3JvdW5kOiAkaW5wdXQtcHJlZml4LWJhY2tncm91bmQ7XG4gICAgY29sb3I6ICRpbnB1dC1wcmVmaXgtY29sb3I7XG4gICAgYm9yZGVyOiAkaW5wdXQtcHJlZml4LWJvcmRlcjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gICAgQGlmIGhhcy12YWx1ZSgkaW5wdXQtcHJlZml4LWJvcmRlcikge1xuICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci0jeyRnbG9iYWwtcmlnaHR9OiAwO1xuICAgICAgfVxuXG4gICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItI3skZ2xvYmFsLWxlZnR9OiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5pbnB1dC1ncm91cC1maWVsZCB7XG4gICAgQGV4dGVuZCAlaW5wdXQtZ3JvdXAtY2hpbGQ7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBoZWlnaHQ6ICRoZWlnaHQ7XG4gIH1cblxuICAuaW5wdXQtZ3JvdXAtYnV0dG9uIHtcbiAgICBAZXh0ZW5kICVpbnB1dC1ncm91cC1jaGlsZDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcGFkZGluZy10b3A6IDA7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHdpZHRoOiAxJTtcblxuICAgIGEsXG4gICAgaW5wdXQsXG4gICAgYnV0dG9uIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGZvcm1zXG4vLy8vXG5cbi8vLyBEZWZhdWx0IGJvcmRlciBhcm91bmQgY3VzdG9tIGZpZWxkc2V0cy5cbi8vLyBAdHlwZSBCb3JkZXJcbiRmaWVsZHNldC1ib3JkZXI6IDFweCBzb2xpZCAkbWVkaXVtLWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHBhZGRpbmcgaW5zaWRlIGN1c3RvbSBmaWVsZHNldHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kZmllbGRzZXQtcGFkZGluZzogcmVtLWNhbGMoMjApICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBtYXJnaW4gYXJvdW5kIGN1c3RvbSBmaWVsZHNldHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kZmllbGRzZXQtbWFyZ2luOiByZW0tY2FsYygxOCAwKSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgcGFkZGluZyBiZXR3ZWVuIHRoZSBsZWdlbmQgdGV4dCBhbmQgZmllbGRzZXQgYm9yZGVyLlxuLy8vIEB0eXBlIE51bWJlclxuJGxlZ2VuZC1wYWRkaW5nOiByZW0tY2FsYygwIDMpICFkZWZhdWx0O1xuXG5AbWl4aW4gZmllbGRzZXQge1xuICBib3JkZXI6ICRmaWVsZHNldC1ib3JkZXI7XG4gIHBhZGRpbmc6ICRmaWVsZHNldC1wYWRkaW5nO1xuICBtYXJnaW46ICRmaWVsZHNldC1tYXJnaW47XG5cbiAgbGVnZW5kIHtcbiAgICAvLyBDb3ZlcnMgdXAgdGhlIGZpZWxkc2V0J3MgYm9yZGVyIHRvIGNyZWF0ZSBhcnRpZmljaWFsIHBhZGRpbmdcbiAgICBiYWNrZ3JvdW5kOiAkYm9keS1iYWNrZ3JvdW5kO1xuICAgIHBhZGRpbmc6ICRsZWdlbmQtcGFkZGluZztcbiAgICBtYXJnaW46IDA7XG4gICAgbWFyZ2luLSN7JGdsb2JhbC1sZWZ0fTogcmVtLWNhbGMoLTMpO1xuICB9XG59XG5cbkBtaXhpbiBmb3VuZGF0aW9uLWZvcm0tZmllbGRzZXQge1xuICBmaWVsZHNldCB7XG4gICAgYm9yZGVyOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICB9XG5cbiAgbGVnZW5kIHtcbiAgICBtYXJnaW4tYm90dG9tOiAkZm9ybS1zcGFjaW5nICogMC41O1xuICAgIG1heC13aWR0aDogMTAwJTtcbiAgfVxuXG4gIC5maWVsZHNldCB7XG4gICAgQGluY2x1ZGUgZmllbGRzZXQ7XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGZvcm1zXG4vLy8vXG5cbi8vLyBCYWNrZ3JvdW5kIGNvbG9yIGZvciBzZWxlY3QgbWVudXMuXG4vLy8gQHR5cGUgQ29sb3JcbiRzZWxlY3QtYmFja2dyb3VuZDogJHdoaXRlICFkZWZhdWx0O1xuXG4vLy8gQ29sb3Igb2YgdGhlIGRyb3Bkb3duIHRyaWFuZ2xlIGluc2lkZSBzZWxlY3QgbWVudXMuIFNldCB0byBgdHJhbnNwYXJlbnRgIHRvIHJlbW92ZSBpdCBlbnRpcmVseS5cbi8vLyBAdHlwZSBDb2xvclxuJHNlbGVjdC10cmlhbmdsZS1jb2xvcjogIzMzMyAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgcmFkaXVzIGZvciBzZWxlY3QgbWVudXMuXG4vLy8gQHR5cGUgQ29sb3JcbiRzZWxlY3QtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cyAhZGVmYXVsdDtcblxuQG1peGluIGZvcm0tc2VsZWN0IHtcbiAgJGhlaWdodDogKCRpbnB1dC1mb250LXNpemUgKyAoJGZvcm0tc3BhY2luZyAqIDEuNSkgLSByZW0tY2FsYygxKSk7XG5cbiAgaGVpZ2h0OiAkaGVpZ2h0O1xuICBwYWRkaW5nOiAoJGZvcm0tc3BhY2luZyAvIDIpO1xuICBib3JkZXI6ICRpbnB1dC1ib3JkZXI7XG4gIG1hcmdpbjogMCAwICRmb3JtLXNwYWNpbmc7XG4gIGZvbnQtc2l6ZTogJGlucHV0LWZvbnQtc2l6ZTtcbiAgZm9udC1mYW1pbHk6ICRpbnB1dC1mb250LWZhbWlseTtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbiAgY29sb3I6ICRpbnB1dC1jb2xvcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHNlbGVjdC1iYWNrZ3JvdW5kO1xuICBib3JkZXItcmFkaXVzOiAkc2VsZWN0LXJhZGl1cztcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG5cbiAgQGlmICRzZWxlY3QtdHJpYW5nbGUtY29sb3IgIT0gdHJhbnNwYXJlbnQge1xuICAgIEBpbmNsdWRlIGJhY2tncm91bmQtdHJpYW5nbGUoJHNlbGVjdC10cmlhbmdsZS1jb2xvcik7XG4gICAgYmFja2dyb3VuZC1zaXplOiA5cHggNnB4O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246ICRnbG9iYWwtcmlnaHQgY2VudGVyO1xuICAgIGJhY2tncm91bmQtb3JpZ2luOiBjb250ZW50LWJveDtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICB9XG5cbiAgLy8gRGlzYWJsZWQgc3RhdGVcbiAgJjpkaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0LWJhY2tncm91bmQtZGlzYWJsZWQ7XG4gICAgY3Vyc29yOiAkaW5wdXQtY3Vyc29yLWRpc2FibGVkO1xuICB9XG5cbiAgLy8gSGlkZSB0aGUgZHJvcGRvd24gYXJyb3cgc2hvd24gaW4gbmV3ZXIgSUUgdmVyc2lvbnNcbiAgJjo6LW1zLWV4cGFuZCB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gICZbbXVsdGlwbGVdIHtcbiAgICBoZWlnaHQ6IGF1dG87XG4gIH1cbn1cblxuQG1peGluIGZvdW5kYXRpb24tZm9ybS1zZWxlY3Qge1xuICBzZWxlY3Qge1xuICAgIEBpbmNsdWRlIGZvcm0tc2VsZWN0O1xuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBhYmlkZVxuLy8vL1xuXG4vLy8gU2V0cyBpZiBlcnJvciBzdHlsZXMgc2hvdWxkIGJlIGFkZGVkIHRvIGlucHV0cy5cbi8vLyBAdHlwZSBCb29sZWFuXG4kYWJpZGUtaW5wdXRzOiB0cnVlICFkZWZhdWx0O1xuXG4vLy8gU2V0cyBpZiBlcnJvciBzdHlsZXMgc2hvdWxkIGJlIGFkZGVkIHRvIGxhYmVscy5cbi8vLyBAdHlwZSBCb29sZWFuXG4kYWJpZGUtbGFiZWxzOiB0cnVlICFkZWZhdWx0O1xuXG4vLy8gQmFja2dyb3VuZCBjb2xvciB0byB1c2UgZm9yIGludmFsaWQgdGV4dCBpbnB1dHMuXG4vLy8gQHR5cGUgQ29sb3JcbiRpbnB1dC1iYWNrZ3JvdW5kLWludmFsaWQ6ICRhbGVydC1jb2xvciAhZGVmYXVsdDtcblxuLy8vIENvbG9yIHRvIHVzZSBmb3IgbGFiZWxzIG9mIGludmFsaWQgaW5wdXRzLlxuLy8vIEB0eXBlIENvbG9yXG4kZm9ybS1sYWJlbC1jb2xvci1pbnZhbGlkOiAkYWxlcnQtY29sb3IgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGZvbnQgY29sb3IgZm9yIGZvcm0gZXJyb3IgdGV4dC5cbi8vLyBAdHlwZSBDb2xvclxuJGlucHV0LWVycm9yLWNvbG9yOiAkYWxlcnQtY29sb3IgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGZvbnQgc2l6ZSBmb3IgZm9ybSBlcnJvciB0ZXh0LlxuLy8vIEB0eXBlIE51bWJlclxuJGlucHV0LWVycm9yLWZvbnQtc2l6ZTogcmVtLWNhbGMoMTIpICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBmb250IHdlaWdodCBmb3IgZm9ybSBlcnJvciB0ZXh0LlxuLy8vIEB0eXBlIEtleXdvcmRcbiRpbnB1dC1lcnJvci1mb250LXdlaWdodDogJGdsb2JhbC13ZWlnaHQtYm9sZCAhZGVmYXVsdDtcblxuLy8vIFN0eWxlcyB0aGUgYmFja2dyb3VuZCBhbmQgYm9yZGVyIG9mIGFuIGlucHV0IGZpZWxkIHRvIGhhdmUgYW4gZXJyb3Igc3RhdGUuXG4vLy9cbi8vLyBAcGFyYW0ge0NvbG9yfSAkYmFja2dyb3VuZCBbJGFsZXJ0LWNvbG9yXSAtIENvbG9yIHRvIHVzZSBmb3IgdGhlIGJhY2tncm91bmQgYW5kIGJvcmRlci5cbkBtaXhpbiBmb3JtLWlucHV0LWVycm9yKFxuICAkYmFja2dyb3VuZDogJGlucHV0LWJhY2tncm91bmQtaW52YWxpZFxuKSB7XG4gICY6bm90KDpmb2N1cykge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoJGJhY2tncm91bmQsIDAuMSk7XG4gICAgYm9yZGVyLWNvbG9yOiAkYmFja2dyb3VuZDtcbiAgfVxufVxuXG4vLy8gQWRkcyBlcnJvciBzdHlsZXMgdG8gYSBmb3JtIGVsZW1lbnQsIHVzaW5nIHRoZSB2YWx1ZXMgaW4gdGhlIHNldHRpbmdzIGZpbGUuXG5AbWl4aW4gZm9ybS1lcnJvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIG1hcmdpbi10b3A6ICRmb3JtLXNwYWNpbmcgKiAtMC41O1xuICBtYXJnaW4tYm90dG9tOiAkZm9ybS1zcGFjaW5nO1xuICBmb250LXNpemU6ICRpbnB1dC1lcnJvci1mb250LXNpemU7XG4gIGZvbnQtd2VpZ2h0OiAkaW5wdXQtZXJyb3ItZm9udC13ZWlnaHQ7XG4gIGNvbG9yOiAkaW5wdXQtZXJyb3ItY29sb3I7XG59XG5cbkBtaXhpbiBmb3VuZGF0aW9uLWZvcm0tZXJyb3Ige1xuICBAaWYgJGFiaWRlLWlucHV0cyB7XG4gICAgLy8gRXJyb3IgY2xhc3MgZm9yIGludmFsaWQgaW5wdXRzXG4gICAgLmlzLWludmFsaWQtaW5wdXQge1xuICAgICAgQGluY2x1ZGUgZm9ybS1pbnB1dC1lcnJvcjtcbiAgICB9XG4gIH1cblxuICBAaWYgJGFiaWRlLWxhYmVscyB7XG4gICAgLy8gRXJyb3IgY2xhc3MgZm9yIGxhYmVscyBvZiBpbnZhbGlkIG91dHB1dHNcbiAgICAuaXMtaW52YWxpZC1sYWJlbCB7XG4gICAgICBjb2xvcjogJGZvcm0tbGFiZWwtY29sb3ItaW52YWxpZDtcbiAgICB9XG4gIH1cblxuICAvLyBGb3JtIGVycm9yIGVsZW1lbnRcbiAgLmZvcm0tZXJyb3Ige1xuICAgIEBpbmNsdWRlIGZvcm0tZXJyb3I7XG5cbiAgICAmLmlzLXZpc2libGUge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vIEhpZGUgYW4gZWxlbWVudCBieSBkZWZhdWx0LCBvbmx5IGRpc3BsYXlpbmcgaXQgYWJvdmUgYSBjZXJ0YWluIHNjcmVlbiBzaXplLlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJHNpemUgLSBCcmVha3BvaW50IHRvIHVzZS4gKipNdXN0IGJlIGEgYnJlYWtwb2ludCBkZWZpbmVkIGluIGAkYnJlYWtwb2ludHNgLioqXG5AbWl4aW4gc2hvdy1mb3IoJHNpemUpIHtcbiAgJHNpemU6IG1hcC1nZXQoJGJyZWFrcG9pbnRzLCAkc2l6ZSk7XG4gICRzaXplOiAtemYtYnAtdG8tZW0oJHNpemUpIC0gKDEvMTYpO1xuXG4gIEBpbmNsdWRlIGJyZWFrcG9pbnQoJHNpemUgZG93bikge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG4vLy8gSGlkZSBhbiBlbGVtZW50IGJ5IGRlZmF1bHQsIG9ubHkgZGlzcGxheWluZyBpdCB3aXRoaW4gYSBjZXJ0YWluIGJyZWFrcG9pbnQuXG4vLy8gQHBhcmFtIHtLZXl3b3JkfSAkc2l6ZSAtIEJyZWFrcG9pbnQgdG8gdXNlLiAqKk11c3QgYmUgYSBicmVha3BvaW50IGRlZmluZWQgaW4gYCRicmVha3BvaW50c2AuKipcbkBtaXhpbiBzaG93LWZvci1vbmx5KCRzaXplKSB7XG4gICRsb3dlci1ib3VuZC1zaXplOiBtYXAtZ2V0KCRicmVha3BvaW50cywgJHNpemUpO1xuICAkdXBwZXItYm91bmQtc2l6ZTogLXpmLW1hcC1uZXh0KCRicmVha3BvaW50cywgJHNpemUpO1xuXG4gIC8vIG1vcmUgb2Z0ZW4gdGhhbiBub3QgdGhpcyB3aWxsIGJlIGNvcnJlY3QsIGp1c3Qgb25lIHRpbWUgcm91bmQgdGhlIGxvb3AgaXQgd29uJ3Qgc28gc2V0IGluIHNjb3BlIGhlcmVcbiAgJGxvd2VyLWJvdW5kOiAtemYtYnAtdG8tZW0oJGxvd2VyLWJvdW5kLXNpemUpIC0gKDEvMTYpO1xuICAvLyB0ZXN0IGFjdHVhbCBsb3dlci1ib3VuZC1zaXplLCBpZiAwIHNldCBpdCB0byAwZW1cbiAgQGlmICRsb3dlci1ib3VuZC1zaXplID09IDAge1xuICAgICRsb3dlci1ib3VuZDogLXpmLWJwLXRvLWVtKCRsb3dlci1ib3VuZC1zaXplKTtcbiAgfVxuXG4gIEBpZiAkdXBwZXItYm91bmQtc2l6ZSA9PSBudWxsIHtcbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkbG93ZXItYm91bmQpIHtcbiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICB9XG4gIH1cbiAgQGVsc2Uge1xuICAgICR1cHBlci1ib3VuZDogLXpmLWJwLXRvLWVtKCR1cHBlci1ib3VuZC1zaXplKTtcbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkbG93ZXItYm91bmQpLCBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICR1cHBlci1ib3VuZCkge1xuICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICAgIH1cbiAgfVxufVxuXG5cbi8vLyBTaG93IGFuIGVsZW1lbnQgYnkgZGVmYXVsdCwgYW5kIGhpZGUgaXQgYWJvdmUgYSBjZXJ0YWluIHNjcmVlbiBzaXplLlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJHNpemUgLSBCcmVha3BvaW50IHRvIHVzZS4gKipNdXN0IGJlIGEgYnJlYWtwb2ludCBkZWZpbmVkIGluIGAkYnJlYWtwb2ludHNgLioqXG5AbWl4aW4gaGlkZS1mb3IoJHNpemUpIHtcbiAgQGluY2x1ZGUgYnJlYWtwb2ludCgkc2l6ZSkge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG4vLy8gU2hvdyBhbiBlbGVtZW50IGJ5IGRlZmF1bHQsIGFuZCBoaWRlIGl0IGFib3ZlIGEgY2VydGFpbiBzY3JlZW4gc2l6ZS5cbi8vLyBAcGFyYW0ge0tleXdvcmR9ICRzaXplIC0gQnJlYWtwb2ludCB0byB1c2UuICoqTXVzdCBiZSBhIGJyZWFrcG9pbnQgZGVmaW5lZCBpbiBgJGJyZWFrcG9pbnRzYC4qKlxuQG1peGluIGhpZGUtZm9yLW9ubHkoJHNpemUpIHtcbiAgQGluY2x1ZGUgYnJlYWtwb2ludCgkc2l6ZSBvbmx5KSB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG59XG5cbkBtaXhpbiBmb3VuZGF0aW9uLXZpc2liaWxpdHktY2xhc3NlcyB7XG4gIC8vIEJhc2ljIGhpZGluZyBjbGFzc2VzXG4gIC5oaWRlIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cblxuICAuaW52aXNpYmxlIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIH1cblxuICAvLyBSZXNwb25zaXZlIHZpc2liaWxpdHkgY2xhc3Nlc1xuICBAZWFjaCAkc2l6ZSBpbiAkYnJlYWtwb2ludC1jbGFzc2VzIHtcbiAgICBAaWYgJHNpemUgIT0gc21hbGwge1xuICAgICAgLmhpZGUtZm9yLSN7JHNpemV9IHtcbiAgICAgICAgQGluY2x1ZGUgaGlkZS1mb3IoJHNpemUpO1xuICAgICAgfVxuXG4gICAgICAuc2hvdy1mb3ItI3skc2l6ZX0ge1xuICAgICAgICBAaW5jbHVkZSBzaG93LWZvcigkc2l6ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmhpZGUtZm9yLSN7JHNpemV9LW9ubHkge1xuICAgICAgQGluY2x1ZGUgaGlkZS1mb3Itb25seSgkc2l6ZSk7XG4gICAgfVxuXG4gICAgLnNob3ctZm9yLSN7JHNpemV9LW9ubHkge1xuICAgICAgQGluY2x1ZGUgc2hvdy1mb3Itb25seSgkc2l6ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2NyZWVuIHJlYWRlciB2aXNpYmlsaXR5IGNsYXNzZXNcbiAgLy8gTmVlZCBhIFwiaGlkZS1mb3Itc3JcIiBjbGFzcz8gQWRkIGFyaWEtaGlkZGVuPSd0cnVlJyB0byB0aGUgZWxlbWVudFxuICAuc2hvdy1mb3Itc3IsXG4gIC5zaG93LW9uLWZvY3VzIHtcbiAgICBAaW5jbHVkZSBlbGVtZW50LWludmlzaWJsZTtcbiAgfVxuXG4gIC8vIE9ubHkgZGlzcGxheSB0aGUgZWxlbWVudCB3aGVuIGl0J3MgZm9jdXNlZFxuICAuc2hvdy1vbi1mb2N1cyB7XG4gICAgJjphY3RpdmUsXG4gICAgJjpmb2N1cyB7XG4gICAgICBAaW5jbHVkZSBlbGVtZW50LWludmlzaWJsZS1vZmY7XG4gICAgfVxuICB9XG5cbiAgLy8gTGFuZHNjYXBlIGFuZCBwb3J0cmFpdCB2aXNpYmlsaXR5XG4gIC5zaG93LWZvci1sYW5kc2NhcGUsXG4gIC5oaWRlLWZvci1wb3J0cmFpdCB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcblxuICAgIEBpbmNsdWRlIGJyZWFrcG9pbnQobGFuZHNjYXBlKSB7XG4gICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIEBpbmNsdWRlIGJyZWFrcG9pbnQocG9ydHJhaXQpIHtcbiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICB9XG4gIH1cblxuICAuaGlkZS1mb3ItbGFuZHNjYXBlLFxuICAuc2hvdy1mb3ItcG9ydHJhaXQge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblxuICAgIEBpbmNsdWRlIGJyZWFrcG9pbnQobGFuZHNjYXBlKSB7XG4gICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgQGluY2x1ZGUgYnJlYWtwb2ludChwb3J0cmFpdCkge1xuICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGZsb2F0XG4vLy8vXG5cbkBtaXhpbiBmb3VuZGF0aW9uLWZsb2F0LWNsYXNzZXMge1xuICAuZmxvYXQtbGVmdCB7XG4gICAgZmxvYXQ6IGxlZnQgIWltcG9ydGFudDtcbiAgfVxuXG4gIC5mbG9hdC1yaWdodCB7XG4gICAgZmxvYXQ6IHJpZ2h0ICFpbXBvcnRhbnQ7XG4gIH1cblxuICAuZmxvYXQtY2VudGVyIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIH1cblxuICAuY2xlYXJmaXgge1xuICAgIEBpbmNsdWRlIGNsZWFyZml4O1xuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBhY2NvcmRpb25cbi8vLy9cblxuLy8vIERlZmF1bHQgYmFja2dyb3VuZCBjb2xvciBvZiBhbiBhY2NvcmRpb24gZ3JvdXAuXG4vLy8gQHR5cGUgQ29sb3JcbiRhY2NvcmRpb24tYmFja2dyb3VuZDogJHdoaXRlICFkZWZhdWx0O1xuXG4vLy8gSWYgYHRydWVgLCBhZGRzIHBsdXMgYW5kIG1pbnVzIGljb25zIHRvIHRoZSBzaWRlIG9mIGVhY2ggYWNjb3JkaW9uIHRpdGxlLlxuLy8vIEB0eXBlIEJvb2xlYW5cbiRhY2NvcmRpb24tcGx1c21pbnVzOiB0cnVlICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCB0ZXh0IGNvbG9yIGZvciBpdGVtcyBpbiBhIE1lbnUuXG4vLy8gQHR5cGUgQ29sb3JcbiRhY2NvcmRpb24taXRlbS1jb2xvcjogZm9yZWdyb3VuZCgkYWNjb3JkaW9uLWJhY2tncm91bmQsICRwcmltYXJ5LWNvbG9yKSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgYmFja2dyb3VuZCBjb2xvciBvbiBob3ZlciBmb3IgaXRlbXMgaW4gYSBNZW51LlxuLy8vIEB0eXBlIENvbG9yXG4kYWNjb3JkaW9uLWl0ZW0tYmFja2dyb3VuZC1ob3ZlcjogJGxpZ2h0LWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHBhZGRpbmcgb2YgYW4gYWNjb3JkaW9uIGl0ZW0uXG4vLy8gQHR5cGUgTnVtYmVyIHwgTGlzdFxuJGFjY29yZGlvbi1pdGVtLXBhZGRpbmc6IDEuMjVyZW0gMXJlbSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgYmFja2dyb3VuZCBjb2xvciBvZiB0YWIgY29udGVudC5cbi8vLyBAdHlwZSBDb2xvclxuJGFjY29yZGlvbi1jb250ZW50LWJhY2tncm91bmQ6ICR3aGl0ZSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgYm9yZGVyIGNvbG9yIG9mIHRhYiBjb250ZW50LlxuLy8vIEB0eXBlIENvbG9yXG4kYWNjb3JkaW9uLWNvbnRlbnQtYm9yZGVyOiAxcHggc29saWQgJGxpZ2h0LWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHRleHQgY29sb3Igb2YgdGFiIGNvbnRlbnQuXG4vLy8gQHR5cGUgQ29sb3JcbiRhY2NvcmRpb24tY29udGVudC1jb2xvcjogZm9yZWdyb3VuZCgkYWNjb3JkaW9uLWJhY2tncm91bmQsICRwcmltYXJ5LWNvbG9yKSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgcGFkZGluZyBmb3IgdGFiIGNvbnRlbnQuXG4vLy8gQHR5cGUgTnVtYmVyIHwgTGlzdFxuJGFjY29yZGlvbi1jb250ZW50LXBhZGRpbmc6IDFyZW0gIWRlZmF1bHQ7XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYW4gYWNjb3JkaW9uIGNvbnRhaW5lci4gQXBwbHkgdGhpcyB0byB0aGUgc2FtZSBlbGVtZW50IHRoYXQgZ2V0cyBgZGF0YS1hY2NvcmRpb25gLlxuQG1peGluIGFjY29yZGlvbi1jb250YWluZXIge1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIGJhY2tncm91bmQ6ICRhY2NvcmRpb24tYmFja2dyb3VuZDtcbiAgYm9yZGVyOiAkYWNjb3JkaW9uLWNvbnRlbnQtYm9yZGVyO1xuICBib3JkZXItYm90dG9tOiAwO1xuICBib3JkZXItcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cztcbiAgbWFyZ2luLSN7JGdsb2JhbC1sZWZ0fTogMDtcbn1cblxuLy8vIEFkZHMgc3R5bGVzIGZvciB0aGUgdGl0bGUgb2YgYW4gYWNjb3JkaW9uIGl0ZW0uIEFwcGx5IHRoaXMgdG8gdGhlIGxpbmsgd2l0aGluIGFuIGFjY29yZGlvbiBpdGVtLlxuQG1peGluIGFjY29yZGlvbi10aXRsZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAkYWNjb3JkaW9uLWl0ZW0tcGFkZGluZztcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGZvbnQtc2l6ZTogcmVtLWNhbGMoMTIpO1xuICBjb2xvcjogJGFjY29yZGlvbi1pdGVtLWNvbG9yO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJvcmRlci1ib3R0b206ICRhY2NvcmRpb24tY29udGVudC1ib3JkZXI7XG5cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGFjY29yZGlvbi1pdGVtLWJhY2tncm91bmQtaG92ZXI7XG4gIH1cblxuICBAaWYgJGFjY29yZGlvbi1wbHVzbWludXMge1xuICAgICY6OmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnKyc7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAjeyRnbG9iYWwtcmlnaHR9OiAxcmVtO1xuICAgICAgdG9wOiA1MCU7XG4gICAgICBtYXJnaW4tdG9wOiAtMC41cmVtO1xuICAgIH1cblxuICAgIC5pcy1hY3RpdmUgPiAmOjpiZWZvcmUge1xuICAgICAgY29udGVudDogJ+KAkyc7XG4gICAgfVxuICB9XG59XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYWNjb3JkaW9uIGNvbnRlbnQuIEFwcGx5IHRoaXMgdG8gdGhlIGNvbnRlbnQgcGFuZSBiZWxvdyBhbiBhY2NvcmRpb24gaXRlbSdzIHRpdGxlLlxuQG1peGluIGFjY29yZGlvbi1jb250ZW50IHtcbiAgcGFkZGluZzogJGFjY29yZGlvbi1jb250ZW50LXBhZGRpbmc7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGJvcmRlci1ib3R0b206ICRhY2NvcmRpb24tY29udGVudC1ib3JkZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICRhY2NvcmRpb24tY29udGVudC1iYWNrZ3JvdW5kO1xufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1hY2NvcmRpb24ge1xuICAuYWNjb3JkaW9uIHtcbiAgICBAaW5jbHVkZSBhY2NvcmRpb24tY29udGFpbmVyO1xuICB9XG5cbiAgLmFjY29yZGlvbi1pdGVtIHtcbiAgICAvLyBUaGlzIGNsYXNzIGRvZXNuJ3QgbmVlZCBzdHlsZXMhXG4gIH1cblxuICAuYWNjb3JkaW9uLXRpdGxlIHtcbiAgICBAaW5jbHVkZSBhY2NvcmRpb24tdGl0bGU7XG4gIH1cblxuICAuYWNjb3JkaW9uLWNvbnRlbnQge1xuICAgIEBpbmNsdWRlIGFjY29yZGlvbi1jb250ZW50O1xuICB9XG59XG4iLCIvLy8vXG4vLy8gQGdyb3VwIGFjY29yZGlvbi1tZW51XG4vLy8vXG5cbi8vLyBTZXRzIGlmIGFjY29yZGlvbiBtZW51cyBoYXZlIHRoZSBkZWZhdWx0IGFycm93IHN0eWxlcy5cbi8vLyBAdHlwZSBCb29sZWFuXG4kYWNjb3JkaW9ubWVudS1hcnJvd3M6IHRydWUgIWRlZmF1bHQ7XG5cbi8vLyBTZXRzIGFjY29yZGlvbiBtZW51IGFycm93IGNvbG9yIGlmIGFycm93IGlzIHVzZWQuXG4vLy8gQHR5cGUgQ29sb3JcbiRhY2NvcmRpb25tZW51LWFycm93LWNvbG9yOiAkcHJpbWFyeS1jb2xvciAhZGVmYXVsdDtcblxuQG1peGluIGZvdW5kYXRpb24tYWNjb3JkaW9uLW1lbnUge1xuICBAaWYgJGFjY29yZGlvbm1lbnUtYXJyb3dzIHtcbiAgICAuaXMtYWNjb3JkaW9uLXN1Ym1lbnUtcGFyZW50ID4gYSB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgQGluY2x1ZGUgY3NzLXRyaWFuZ2xlKDZweCwgJGFjY29yZGlvbm1lbnUtYXJyb3ctY29sb3IsIGRvd24pO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICBtYXJnaW4tdG9wOiAtNHB4O1xuICAgICAgICByaWdodDogMXJlbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuaXMtYWNjb3JkaW9uLXN1Ym1lbnUtcGFyZW50W2FyaWEtZXhwYW5kZWQ9J3RydWUnXSA+IGE6OmFmdGVyIHtcbiAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHNjYWxlWSgtMSk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBiYWRnZVxuLy8vL1xuXG4vLy8gRGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBiYWRnZXMuXG4vLy8gQHR5cGUgQ29sb3JcbiRiYWRnZS1iYWNrZ3JvdW5kOiAkcHJpbWFyeS1jb2xvciAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgdGV4dCBjb2xvciBmb3IgYmFkZ2VzLlxuLy8vIEB0eXBlIENvbG9yXG4kYmFkZ2UtY29sb3I6IGZvcmVncm91bmQoJGJhZGdlLWJhY2tncm91bmQpICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBwYWRkaW5nIGluc2lkZSBiYWRnZXMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kYmFkZ2UtcGFkZGluZzogMC4zZW0gIWRlZmF1bHQ7XG5cbi8vLyBNaW5pbXVtIHdpZHRoIG9mIGEgYmFkZ2UuXG4vLy8gQHR5cGUgTnVtYmVyXG4kYmFkZ2UtbWlud2lkdGg6IDIuMWVtICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBmb250IHNpemUgZm9yIGJhZGdlcy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRiYWRnZS1mb250LXNpemU6IDAuNnJlbSAhZGVmYXVsdDtcblxuLy8vIEdlbmVyYXRlcyB0aGUgYmFzZSBzdHlsZXMgZm9yIGEgYmFkZ2UuXG5AbWl4aW4gYmFkZ2Uge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6ICRiYWRnZS1wYWRkaW5nO1xuICBtaW4td2lkdGg6ICRiYWRnZS1taW53aWR0aDtcbiAgZm9udC1zaXplOiAkYmFkZ2UtZm9udC1zaXplO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbn1cblxuQG1peGluIGZvdW5kYXRpb24tYmFkZ2Uge1xuICAuYmFkZ2Uge1xuICAgIEBpbmNsdWRlIGJhZGdlO1xuXG4gICAgYmFja2dyb3VuZDogJGJhZGdlLWJhY2tncm91bmQ7XG4gICAgY29sb3I6ICRiYWRnZS1jb2xvcjtcblxuICAgIEBlYWNoICRuYW1lLCAkY29sb3IgaW4gJGZvdW5kYXRpb24tY29sb3JzIHtcbiAgICAgIEBpZiAkbmFtZSAhPSBwcmltYXJ5IHtcbiAgICAgICAgJi4jeyRuYW1lfSB7XG4gICAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yO1xuICAgICAgICAgIGNvbG9yOiBmb3JlZ3JvdW5kKCRjb2xvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGJyZWFkY3J1bWJzXG4vLy8vXG5cbi8vLyBNYXJnaW4gYXJvdW5kIGEgYnJlYWRjcnVtYnMgY29udGFpbmVyLlxuLy8vIEB0eXBlIE51bWJlclxuJGJyZWFkY3J1bWJzLW1hcmdpbjogMCAwICRnbG9iYWwtbWFyZ2luIDAgIWRlZmF1bHQ7XG5cbi8vLyBGb250IHNpemUgb2YgYnJlYWRjcnVtYiBsaW5rcy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRicmVhZGNydW1icy1pdGVtLWZvbnQtc2l6ZTogcmVtLWNhbGMoMTEpICFkZWZhdWx0O1xuXG4vLy8gQ29sb3Igb2YgYnJlYWRjcnVtYiBsaW5rcy5cbi8vLyBAdHlwZSBDb2xvclxuJGJyZWFkY3J1bWJzLWl0ZW0tY29sb3I6ICRwcmltYXJ5LWNvbG9yICFkZWZhdWx0O1xuXG4vLy8gQ29sb3Igb2YgdGhlIGFjdGl2ZSBicmVhZGNydW1iIGxpbmsuXG4vLy8gQHR5cGUgQ29sb3JcbiRicmVhZGNydW1icy1pdGVtLWNvbG9yLWN1cnJlbnQ6ICRibGFjayAhZGVmYXVsdDtcblxuLy8vIE9wYWNpdHkgb2YgZGlzYWJsZWQgYnJlYWRjcnVtYiBsaW5rcy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRicmVhZGNydW1icy1pdGVtLWNvbG9yLWRpc2FibGVkOiAkbWVkaXVtLWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBNYXJnaW4gYmV0d2VlbiBicmVhZGNydW1iIGl0ZW1zLlxuLy8vIEB0eXBlIE51bWJlclxuJGJyZWFkY3J1bWJzLWl0ZW0tbWFyZ2luOiAwLjc1cmVtICFkZWZhdWx0O1xuXG4vLy8gSWYgYHRydWVgLCBtYWtlcyBicmVhZGNydW1iIGxpbmtzIHVwcGVyY2FzZS5cbi8vLyBAdHlwZSBCb29sZWFuXG4kYnJlYWRjcnVtYnMtaXRlbS11cHBlcmNhc2U6IHRydWUgIWRlZmF1bHQ7XG5cbi8vLyBJZiBgdHJ1ZWAsIGFkZHMgYSBzbGFzaCBiZXR3ZWVuIGJyZWFkY3J1bWIgbGlua3MuXG4vLy8gQHR5cGUgQm9vbGVhblxuJGJyZWFkY3J1bWJzLWl0ZW0tc2xhc2g6IHRydWUgIWRlZmF1bHQ7XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYSBicmVhZGNydW1icyBjb250YWluZXIsIGFsb25nIHdpdGggdGhlIHN0eWxlcyBmb3IgdGhlIGA8bGk+YCBhbmQgYDxhPmAgZWxlbWVudHMgaW5zaWRlIG9mIGl0LlxuQG1peGluIGJyZWFkY3J1bWJzLWNvbnRhaW5lciB7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBtYXJnaW46ICRicmVhZGNydW1icy1tYXJnaW47XG5cbiAgLy8gSXRlbSB3cmFwcGVyXG4gIGxpIHtcbiAgICBmbG9hdDogI3skZ2xvYmFsLWxlZnR9O1xuICAgIGNvbG9yOiAkYnJlYWRjcnVtYnMtaXRlbS1jb2xvci1jdXJyZW50O1xuICAgIGZvbnQtc2l6ZTogJGJyZWFkY3J1bWJzLWl0ZW0tZm9udC1zaXplO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcblxuICAgIEBpZiAkYnJlYWRjcnVtYnMtaXRlbS11cHBlcmNhc2Uge1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICB9XG5cbiAgICBAaWYgJGJyZWFkY3J1bWJzLWl0ZW0tc2xhc2gge1xuICAgICAgLy8gTmVlZCB0byBlc2NhcGUgdGhlIGJhY2tzbGFzaFxuICAgICAgJHNsYXNoOiBpZigkZ2xvYmFsLXRleHQtZGlyZWN0aW9uID09ICdsdHInLCAnLycsICdcXFxcJyk7XG5cbiAgICAgICY6bm90KDpsYXN0LWNoaWxkKTo6YWZ0ZXIge1xuICAgICAgICBjb2xvcjogJG1lZGl1bS1ncmF5O1xuICAgICAgICBjb250ZW50OiAkc2xhc2g7XG4gICAgICAgIG1hcmdpbjogMCAkYnJlYWRjcnVtYnMtaXRlbS1tYXJnaW47XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgdG9wOiAxcHg7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9XG4gICAgfVxuICAgIEBlbHNlIHtcbiAgICAgIG1hcmdpbi0jeyRnbG9iYWwtcmlnaHR9OiAkYnJlYWRjcnVtYnMtaXRlbS1tYXJnaW47XG4gICAgfVxuICB9XG5cbiAgLy8gUGFnZSBsaW5rc1xuICBhIHtcbiAgICBjb2xvcjogJGJyZWFkY3J1bWJzLWl0ZW0tY29sb3I7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1icmVhZGNydW1icyB7XG4gIC5icmVhZGNydW1icyB7XG4gICAgQGluY2x1ZGUgYnJlYWRjcnVtYnMtY29udGFpbmVyO1xuXG4gICAgLmRpc2FibGVkIHtcbiAgICAgIGNvbG9yOiAkYnJlYWRjcnVtYnMtaXRlbS1jb2xvci1kaXNhYmxlZDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGJ1dHRvbi1ncm91cFxuLy8vL1xuXG4vLy8gTWFyZ2luIGZvciBidXR0b24gZ3JvdXBzLlxuLy8vIEB0eXBlIE51bWJlclxuJGJ1dHRvbmdyb3VwLW1hcmdpbjogMXJlbSAhZGVmYXVsdDtcblxuLy8vIE1hcmdpbiBiZXR3ZWVuIGJ1dHRvbnMgaW4gYSBidXR0b24gZ3JvdXAuXG4vLy8gQHR5cGUgQm9yZGVyXG4kYnV0dG9uZ3JvdXAtc3BhY2luZzogMXB4ICFkZWZhdWx0O1xuXG4vLy8gU2VsZWN0b3IgZm9yIHRoZSBidXR0b25zIGluc2lkZSBhIGJ1dHRvbiBncm91cC5cbi8vLyBAdHlwZSBTdHJpbmdcbiRidXR0b25ncm91cC1jaGlsZC1zZWxlY3RvcjogJy5idXR0b24nICFkZWZhdWx0O1xuXG4vLy8gTWF4aW11bSBudW1iZXIgb2YgYnV0dG9ucyB0aGF0IGNhbiBiZSBpbiBhbiBldmVuLXdpZHRoIGJ1dHRvbiBncm91cC5cbi8vLyBAdHlwZSBOdW1iZXJcbiRidXR0b25ncm91cC1leHBhbmQtbWF4OiA2ICFkZWZhdWx0O1xuXG4vLy8gQWRkIHN0eWxlcyBmb3IgYSBidXR0b24gZ3JvdXAgY29udGFpbmVyLlxuLy8vIEBwYXJhbSB7U3RyaW5nfSAkY2hpbGQtc2VsZWN0b3IgWyRidXR0b25ncm91cC1jaGlsZC1zZWxlY3Rvcl0gLSBTZWxlY3RvciBmb3IgdGhlIGJ1dHRvbnMgaW5zaWRlIGEgYnV0dG9uIGdyb3VwLlxuQG1peGluIGJ1dHRvbi1ncm91cChcbiAgJGNoaWxkLXNlbGVjdG9yOiAkYnV0dG9uZ3JvdXAtY2hpbGQtc2VsZWN0b3Jcbikge1xuICBAaW5jbHVkZSBjbGVhcmZpeDtcbiAgbWFyZ2luLWJvdHRvbTogJGJ1dHRvbmdyb3VwLW1hcmdpbjtcbiAgZm9udC1zaXplOiBtYXAtZ2V0KCRidXR0b24tc2l6ZXMsIGRlZmF1bHQpO1xuXG4gICN7JGNoaWxkLXNlbGVjdG9yfSB7XG4gICAgZmxvYXQ6ICN7JGdsb2JhbC1sZWZ0fTtcbiAgICBtYXJnaW46IDA7XG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuXG4gICAgJjpub3QoOmxhc3QtY2hpbGQpIHtcbiAgICAgIGJvcmRlci0jeyRnbG9iYWwtcmlnaHR9OiAkYnV0dG9uZ3JvdXAtc3BhY2luZyBzb2xpZCAkYm9keS1iYWNrZ3JvdW5kO1xuICAgIH1cbiAgfVxufVxuXG4vLy8gQ3JlYXRlcyBhIGZ1bGwtd2lkdGggYnV0dG9uIGdyb3VwLCBtYWtpbmcgZWFjaCBidXR0b24gZXF1YWwgd2lkdGguXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRzZWxlY3RvciBbJGJ1dHRvbmdyb3VwLWNoaWxkLXNlbGVjdG9yXSAtIFNlbGVjdG9yIGZvciB0aGUgYnV0dG9ucyBpbnNpZGUgYSBidXR0b24gZ3JvdXAuXG5AbWl4aW4gYnV0dG9uLWdyb3VwLWV4cGFuZChcbiAgJHNlbGVjdG9yOiAkYnV0dG9uZ3JvdXAtY2hpbGQtc2VsZWN0b3IsXG4gICRjb3VudDogbnVsbFxuKSB7XG4gIEBpZiAkY291bnQgIT0gbnVsbCB7XG4gICAgQHdhcm4gJ2J1dHRvbi1ncm91cC1leHBhbmQoKTogdGhlICRjb3VudCBwcm9wZXJ0eSBpcyBubyBsb25nZXIgbmVlZGVkLiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIHJlbW92ZWQgaW4gRm91bmRhdGlvbiA2LjIuJztcbiAgfVxuXG4gIGRpc3BsYXk6IHRhYmxlO1xuICB0YWJsZS1sYXlvdXQ6IGZpeGVkO1xuICB3aWR0aDogMTAwJTtcblxuICAmOjpiZWZvcmUsXG4gICY6OmFmdGVyIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgI3skc2VsZWN0b3J9IHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIGZsb2F0OiBub25lO1xuICB9XG59XG5cbi8vLyBTdGFja3MgdGhlIGJ1dHRvbnMgaW4gYSBidXR0b24gZ3JvdXAuXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRzZWxlY3RvciBbJGJ1dHRvbmdyb3VwLWNoaWxkLXNlbGVjdG9yXSAtIFNlbGVjdG9yIGZvciB0aGUgYnV0dG9ucyBpbnNpZGUgdGhlIGJ1dHRvbiBncm91cC5cbkBtaXhpbiBidXR0b24tZ3JvdXAtc3RhY2soXG4gICRzZWxlY3RvcjogJGJ1dHRvbmdyb3VwLWNoaWxkLXNlbGVjdG9yXG4pIHtcbiAgI3skc2VsZWN0b3J9IHtcbiAgICB3aWR0aDogMTAwJTtcblxuICAgICY6bm90KDpsYXN0LWNoaWxkKSB7XG4gICAgICBib3JkZXItI3skZ2xvYmFsLXJpZ2h0fTogJGJ1dHRvbmdyb3VwLXNwYWNpbmcgc29saWQ7XG4gICAgfVxuICB9XG59XG5cbi8vLyBVbi1zdGFja3MgdGhlIGJ1dHRvbnMgaW4gYSBidXR0b24gZ3JvdXAuXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRzZWxlY3RvciBbJGJ1dHRvbmdyb3VwLWNoaWxkLXNlbGVjdG9yXSAtIFNlbGVjdG9yIGZvciB0aGUgYnV0dG9ucyBpbnNpZGUgdGhlIGJ1dHRvbiBncm91cC5cbkBtaXhpbiBidXR0b24tZ3JvdXAtdW5zdGFjayhcbiAgJHNlbGVjdG9yOiAkYnV0dG9uZ3JvdXAtY2hpbGQtc2VsZWN0b3Jcbikge1xuICAjeyRzZWxlY3Rvcn0ge1xuICAgIHdpZHRoOiBhdXRvO1xuXG4gICAgJjpub3QoOmxhc3QtY2hpbGQpIHtcbiAgICAgIGJvcmRlci0jeyRnbG9iYWwtcmlnaHR9OiAkYnV0dG9uZ3JvdXAtc3BhY2luZyBzb2xpZCAkYm9keS1iYWNrZ3JvdW5kO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1idXR0b24tZ3JvdXAge1xuICAuYnV0dG9uLWdyb3VwIHtcbiAgICBAaW5jbHVkZSBidXR0b24tZ3JvdXA7XG5cbiAgICAvLyBTaXplc1xuICAgICYudGlueSAgICAgeyBmb250LXNpemU6IG1hcC1nZXQoJGJ1dHRvbi1zaXplcywgdGlueSk7IH1cbiAgICAmLnNtYWxsICAgIHsgZm9udC1zaXplOiBtYXAtZ2V0KCRidXR0b24tc2l6ZXMsIHNtYWxsKTsgfVxuICAgICYubGFyZ2UgICAgeyBmb250LXNpemU6IG1hcC1nZXQoJGJ1dHRvbi1zaXplcywgbGFyZ2UpOyB9XG4gICAgJi5leHBhbmRlZCB7IEBpbmNsdWRlIGJ1dHRvbi1ncm91cC1leHBhbmQ7IH1cblxuICAgIC8vIENvbG9yc1xuICAgIEBlYWNoICRuYW1lLCAkY29sb3IgaW4gJGZvdW5kYXRpb24tY29sb3JzIHtcbiAgICAgIEBpZiAkYnV0dG9uLWZpbGwgIT0gaG9sbG93IHtcbiAgICAgICAgJi4jeyRuYW1lfSAjeyRidXR0b25ncm91cC1jaGlsZC1zZWxlY3Rvcn0ge1xuICAgICAgICAgIEBpbmNsdWRlIGJ1dHRvbi1zdHlsZSgkY29sb3IsIGF1dG8sIGF1dG8pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBAZWxzZSB7XG4gICAgICAgICYuI3skbmFtZX0gI3skYnV0dG9uZ3JvdXAtY2hpbGQtc2VsZWN0b3J9IHtcbiAgICAgICAgICBAaW5jbHVkZSBidXR0b24taG9sbG93O1xuICAgICAgICAgIEBpbmNsdWRlIGJ1dHRvbi1ob2xsb3ctc3R5bGUoJGNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgICYuc3RhY2tlZCxcbiAgICAmLnN0YWNrZWQtZm9yLXNtYWxsIHtcbiAgICAgIEBpbmNsdWRlIGJ1dHRvbi1ncm91cC1zdGFjaztcbiAgICB9XG5cbiAgICAmLnN0YWNrZWQtZm9yLXNtYWxsIHtcbiAgICAgIEBpbmNsdWRlIGJyZWFrcG9pbnQobWVkaXVtKSB7XG4gICAgICAgIEBpbmNsdWRlIGJ1dHRvbi1ncm91cC11bnN0YWNrO1xuICAgICAgfVxuICAgIH1cblxuICAgICYuc3RhY2tlZC1mb3Itc21hbGwuZXhwYW5kZWQge1xuICAgICAgQGluY2x1ZGUgYnJlYWtwb2ludChzbWFsbCBvbmx5KSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuXG4gICAgICAgICN7JGJ1dHRvbmdyb3VwLWNoaWxkLXNlbGVjdG9yfSB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBjYWxsb3V0XG4vLy8vXG5cbi8vLyBEZWZ1YWx0IGJhY2tncm91bmQgY29sb3IuXG4vLy8gQHR5cGUgQ29sb3JcbiRjYWxsb3V0LWJhY2tncm91bmQ6ICR3aGl0ZSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgZmFkZSB2YWx1ZSBmb3IgY2FsbG91dCBiYWNrZ3JvdW5kcy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRjYWxsb3V0LWJhY2tncm91bmQtZmFkZTogODUlICFkZWZhdWx0O1xuXG4vLy8gRGVmdWFsdCBib3JkZXIgc3R5bGUgZm9yIGNhbGxvdXRzLlxuLy8vIEB0eXBlIExpc3RcbiRjYWxsb3V0LWJvcmRlcjogMXB4IHNvbGlkIHJnYmEoJGJsYWNrLCAwLjI1KSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgYm90dG9tIG1hcmdpbiBmb3IgY2FsbG91dHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kY2FsbG91dC1tYXJnaW46IDAgMCAxcmVtIDAgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGlubmVyIHBhZGRpbmcgZm9yIGNhbGxvdXRzLlxuLy8vIEB0eXBlIE51bWJlclxuJGNhbGxvdXQtcGFkZGluZzogMXJlbSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgZm9udCBjb2xvciBmb3IgY2FsbG91dHMuXG4vLy8gQHR5cGUgQ29sb3JcbiRjYWxsb3V0LWZvbnQtY29sb3I6ICRib2R5LWZvbnQtY29sb3IgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGZvbnQgY29sb3IgZm9yIGNhbGxvdXRzLCBpZiB0aGUgY2FsbG91dCBoYXMgYSBkYXJrIGJhY2tncm91bmQuXG4vLy8gQHR5cGUgQ29sb3JcbiRjYWxsb3V0LWZvbnQtY29sb3ItYWx0OiAkYm9keS1iYWNrZ3JvdW5kICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBib3JkZXIgcmFkaXVzIGZvciBjYWxsb3V0cy5cbi8vLyBAdHlwZSBDb2xvclxuJGNhbGxvdXQtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cyAhZGVmYXVsdDtcblxuLy8vIEFtb3VudCB0byB0aW50IGxpbmtzIHVzZWQgd2l0aGluIGNvbG9yZWQgcGFuZWxzLiBTZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS5cbi8vLyBAdHlwZSBOdW1iZXIgfCBCb29sZWFuXG4kY2FsbG91dC1saW5rLXRpbnQ6IDMwJSAhZGVmYXVsdDtcblxuLy8vIEFkZHMgYmFzaWMgc3R5bGVzIGZvciBhIGNhbGxvdXQsIGluY2x1ZGluZyBwYWRkaW5nIGFuZCBtYXJnaW4uXG5AbWl4aW4gY2FsbG91dC1iYXNlKCkge1xuICBtYXJnaW46ICRjYWxsb3V0LW1hcmdpbjtcbiAgcGFkZGluZzogJGNhbGxvdXQtcGFkZGluZztcbiAgYm9yZGVyOiAkY2FsbG91dC1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICRjYWxsb3V0LXJhZGl1cztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBjb2xvcjogJGNhbGxvdXQtZm9udC1jb2xvcjtcblxuICAvLyBSZXNwZWN0IHRoZSBwYWRkaW5nLCBmb29sLlxuICA+IDpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgfVxuXG4gID4gOmxhc3QtY2hpbGQge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cbn1cblxuLy8vIEdlbmVyYXRlIHF1aWNrIHN0eWxlcyBmb3IgYSBjYWxsb3V0IHVzaW5nIGEgc2luZ2xlIGNvbG9yIGFzIGEgYmFzZWxpbmUuXG4vLy8gQHBhcmFtIHtDb2xvcn0gJGNvbG9yIFskY2FsbG91dC1iYWNrZ3JvdW5kXSAtIENvbG9yIHRvIHVzZS5cbkBtaXhpbiBjYWxsb3V0LXN0eWxlKCRjb2xvcjogJGNhbGxvdXQtYmFja2dyb3VuZCkge1xuICAkYmFja2dyb3VuZDogc2NhbGUtY29sb3IoJGNvbG9yLCAkbGlnaHRuZXNzOiAkY2FsbG91dC1iYWNrZ3JvdW5kLWZhZGUpO1xuXG4gIGJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kO1xufVxuXG5AbWl4aW4gY2FsbG91dC1zaXplKCRwYWRkaW5nKSB7XG4gIHBhZGRpbmctdG9wOiAkcGFkZGluZztcbiAgcGFkZGluZy1yaWdodDogJHBhZGRpbmc7XG4gIHBhZGRpbmctYm90dG9tOiAkcGFkZGluZztcbiAgcGFkZGluZy1sZWZ0OiAkcGFkZGluZztcbn1cblxuXG4vLy8gQWRkcyBzdHlsZXMgZm9yIGEgY2FsbG91dC5cbi8vLyBAcGFyYW0ge0NvbG9yfSAkY29sb3IgWyRjYWxsb3V0LWJhY2tncm91bmRdIC0gQ29sb3IgdG8gdXNlLlxuQG1peGluIGNhbGxvdXQoJGNvbG9yOiAkY2FsbG91dC1iYWNrZ3JvdW5kKSB7XG4gIEBpbmNsdWRlIGNhbGxvdXQtYmFzZTtcbiAgQGluY2x1ZGUgY2FsbG91dC1zdHlsZSgkY29sb3IpO1xufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1jYWxsb3V0IHtcbiAgLmNhbGxvdXQge1xuICAgIEBpbmNsdWRlIGNhbGxvdXQ7XG5cbiAgICBAZWFjaCAkbmFtZSwgJGNvbG9yIGluICRmb3VuZGF0aW9uLWNvbG9ycyB7XG4gICAgICAmLiN7JG5hbWV9IHtcbiAgICAgICAgQGluY2x1ZGUgY2FsbG91dC1zdHlsZSgkY29sb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgICYuc21hbGwge1xuICAgICAgQGluY2x1ZGUgY2FsbG91dC1zaXplKDAuNXJlbSk7XG4gICAgfVxuXG4gICAgJi5sYXJnZSB7XG4gICAgICBAaW5jbHVkZSBjYWxsb3V0LXNpemUoM3JlbSk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBjbG9zZS1idXR0b25cbi8vLy9cblxuLy8vIERlZmF1bHQgcG9zaXRpb24gb2YgdGhlIGNsb3NlIGJ1dHRvbi4gVGhlIGZpcnN0IHZhbHVlIHNob3VsZCBiZSBgcmlnaHRgIG9yIGBsZWZ0YCwgYW5kIHRoZSBzZWNvbmQgdmFsdWUgc2hvdWxkIGJlIGB0b3BgIG9yIGBib3R0b21gLlxuLy8vIEB0eXBlIExpc3RcbiRjbG9zZWJ1dHRvbi1wb3NpdGlvbjogcmlnaHQgdG9wICFkZWZhdWx0O1xuXG4vLy8gUmlnaHQgKG9yIGxlZnQpIG9mZnNldCBmb3IgYSBjbG9zZSBidXR0b24uXG4vLy8gQHR5cGUgTnVtYmVyXG4kY2xvc2VidXR0b24tb2Zmc2V0LWhvcml6b250YWw6IDFyZW0gIWRlZmF1bHQ7XG5cbi8vLyBUb3AgKG9yIGJvdHRvbSkgb2Zmc2V0IGZvciBhIGNsb3NlIGJ1dHRvbi5cbi8vLyBAdHlwZSBOdW1iZXJcbiRjbG9zZWJ1dHRvbi1vZmZzZXQtdmVydGljYWw6IDAuNXJlbSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgZm9udCBzaXplIG9mIHRoZSBjbG9zZSBidXR0b24uXG4vLy8gQHR5cGUgTnVtYmVyXG4kY2xvc2VidXR0b24tc2l6ZTogMmVtICFkZWZhdWx0O1xuXG4vLy8gVGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBjbG9zZSBidXR0b24uIEl0IGFmZmVjdHMgdGhlIHNwYWNpbmcgb2YgdGhlIGVsZW1lbnQuXG4vLy8gQHR5cGUgTnVtYmVyXG4kY2xvc2VidXR0b24tbGluZWhlaWdodDogMSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgY29sb3Igb2YgdGhlIGNsb3NlIGJ1dHRvbi5cbi8vLyBAdHlwZSBDb2xvclxuJGNsb3NlYnV0dG9uLWNvbG9yOiAkZGFyay1ncmF5ICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBjb2xvciBvZiB0aGUgY2xvc2UgYnV0dG9uIHdoZW4gYmVpbmcgaG92ZXJlZCBvbi5cbi8vLyBAdHlwZSBDb2xvclxuJGNsb3NlYnV0dG9uLWNvbG9yLWhvdmVyOiAkYmxhY2sgIWRlZmF1bHQ7XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYSBjbG9zZSBidXR0b24sIHVzaW5nIHRoZSBzdHlsZXMgaW4gdGhlIHNldHRpbmdzIHZhcmlhYmxlcy5cbkBtaXhpbiBjbG9zZS1idXR0b24ge1xuICAkeDogbnRoKCRjbG9zZWJ1dHRvbi1wb3NpdGlvbiwgMSk7XG4gICR5OiBudGgoJGNsb3NlYnV0dG9uLXBvc2l0aW9uLCAyKTtcblxuICBAaW5jbHVkZSBkaXNhYmxlLW1vdXNlLW91dGxpbmU7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgY29sb3I6ICRjbG9zZWJ1dHRvbi1jb2xvcjtcbiAgI3skeH06ICRjbG9zZWJ1dHRvbi1vZmZzZXQtaG9yaXpvbnRhbDtcbiAgI3skeX06ICRjbG9zZWJ1dHRvbi1vZmZzZXQtdmVydGljYWw7XG4gIGZvbnQtc2l6ZTogJGNsb3NlYnV0dG9uLXNpemU7XG4gIGxpbmUtaGVpZ2h0OiAkY2xvc2VidXR0b24tbGluZWhlaWdodDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAkY2xvc2VidXR0b24tY29sb3ItaG92ZXI7XG4gIH1cbn1cblxuQG1peGluIGZvdW5kYXRpb24tY2xvc2UtYnV0dG9uIHtcbiAgLmNsb3NlLWJ1dHRvbiB7XG4gICAgQGluY2x1ZGUgY2xvc2UtYnV0dG9uO1xuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBkcmlsbGRvd25cbi8vLy9cblxuLy8vIFRyYW5zaXRpb24gcHJvcGVydHkgdG8gdXNlIGZvciBhbmltYXRpbmcgbWVudXMuXG4vLy8gQHR5cGUgVHJhbnNpdGlvblxuJGRyaWxsZG93bi10cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xNXMgbGluZWFyICFkZWZhdWx0O1xuXG4vLy8gQWRkcyBhcnJvd3MgdG8gZHJpbGxkb3duIGl0ZW1zIHdpdGggc3VibWVudXMsIGFzIHdlbGwgYXMgdGhlIGJhY2sgYnV0dG9uLlxuLy8vIEB0eXBlIEJvb2xlYW5cbiRkcmlsbGRvd24tYXJyb3dzOiB0cnVlICFkZWZhdWx0O1xuXG4vLy8gU2V0cyBkcmlsbGRvd24gYXJyb3cgY29sb3IgaWYgYXJyb3cgaXMgdXNlZC5cbi8vLyBAdHlwZSBDb2xvclxuJGRyaWxsZG93bi1hcnJvdy1jb2xvcjogJHByaW1hcnktY29sb3IgIWRlZmF1bHQ7XG5cbi8vLyBCYWNrZ3JvdW5kIGNvbG9yIGZvciBkcmlsbGRvd24gc3VibWVudXMuXG4vLy8gQHR5cGUgQ29sb3JcbiRkcmlsbGRvd24tYmFja2dyb3VuZDogJHdoaXRlICFkZWZhdWx0O1xuXG5AbWl4aW4gZm91bmRhdGlvbi1kcmlsbGRvd24tbWVudSB7XG4gIC8vIEFwcGxpZWQgdG8gdGhlIE1lbnUgY29udGFpbmVyXG4gIC5pcy1kcmlsbGRvd24ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG5cbiAgLy8gQXBwbGllZCB0byBuZXN0ZWQgPHVsPnNcbiAgLmlzLWRyaWxsZG93bi1zdWJtZW51IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgICN7JGdsb2JhbC1sZWZ0fTogMTAwJTtcbiAgICB6LWluZGV4OiAtMTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYmFja2dyb3VuZDogJGRyaWxsZG93bi1iYWNrZ3JvdW5kO1xuICAgIHRyYW5zaXRpb246ICRkcmlsbGRvd24tdHJhbnNpdGlvbjtcblxuICAgICYuaXMtYWN0aXZlIHtcbiAgICAgIHotaW5kZXg6IDE7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChpZigkZ2xvYmFsLXRleHQtZGlyZWN0aW9uID09IGx0ciwgLTEwMCUsIDEwMCUpKTtcbiAgICB9XG5cbiAgICAmLmlzLWNsb3Npbmcge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGlmKCRnbG9iYWwtdGV4dC1kaXJlY3Rpb24gPT0gbHRyLCAxMDAlLCAtMTAwJSkpO1xuICAgIH1cbiAgfVxuXG4gIEBpZiAkZHJpbGxkb3duLWFycm93cyB7XG4gICAgLmlzLWRyaWxsZG93bi1zdWJtZW51LXBhcmVudCA+IGEge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIEBpbmNsdWRlIGNzcy10cmlhbmdsZSg2cHgsICRkcmlsbGRvd24tYXJyb3ctY29sb3IsICRnbG9iYWwtcmlnaHQpO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICBtYXJnaW4tdG9wOiAtNnB4O1xuICAgICAgICAjeyRnbG9iYWwtcmlnaHR9OiAxcmVtO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5qcy1kcmlsbGRvd24tYmFjayA+IGE6OmJlZm9yZSB7XG4gICAgICBAaW5jbHVkZSBjc3MtdHJpYW5nbGUoNnB4LCAkZHJpbGxkb3duLWFycm93LWNvbG9yLCAkZ2xvYmFsLWxlZnQpO1xuICAgICAgYm9yZGVyLSN7JGdsb2JhbC1sZWZ0fS13aWR0aDogMDtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICBtYXJnaW4tI3skZ2xvYmFsLXJpZ2h0fTogMC43NXJlbTsgLy8gQ3JlYXRlcyBzcGFjZSBiZXR3ZWVuIHRoZSBhcnJvdyBhbmQgdGhlIHRleHRcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGRyb3Bkb3duXG4vLy8vXG5cbi8vLyBQYWRkaW5nIGZvciBkcm9wZG93biBwYW5lcy5cbi8vLyBAdHlwZSBMaXN0XG4kZHJvcGRvd24tcGFkZGluZzogMXJlbSAhZGVmYXVsdDtcblxuLy8vIEJvcmRlciBmb3IgZHJvcGRvd24gcGFuZXMuXG4vLy8gQHR5cGUgTGlzdFxuJGRyb3Bkb3duLWJvcmRlcjogMXB4IHNvbGlkICRtZWRpdW0tZ3JheSAhZGVmYXVsdDtcblxuLy8vIEZvbnQgc2l6ZSBmb3IgZHJvcGRvd24gcGFuZXMuXG4vLy8gQHR5cGUgTGlzdFxuJGRyb3Bkb3duLWZvbnQtc2l6ZTogMXJlbSAhZGVmYXVsdDtcblxuLy8vIFdpZHRoIGZvciBkcm9wZG93biBwYW5lcy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRkcm9wZG93bi13aWR0aDogMzAwcHggIWRlZmF1bHQ7XG5cbi8vLyBCb3JkZXIgcmFkaXVzIGRyb3Bkb3duIHBhbmVzLlxuLy8vIEB0eXBlIE51bWJlclxuJGRyb3Bkb3duLXJhZGl1czogJGdsb2JhbC1yYWRpdXMgIWRlZmF1bHQ7XG5cbi8vLyBTaXplcyBmb3IgZHJvcGRvd24gcGFuZXMuIEVhY2ggc2l6ZSBpcyBhIENTUyBjbGFzcyB5b3UgY2FuIGFwcGx5LlxuLy8vIEB0eXBlIE1hcFxuJGRyb3Bkb3duLXNpemVzOiAoXG4gIHRpbnk6IDEwMHB4LFxuICBzbWFsbDogMjAwcHgsXG4gIGxhcmdlOiA0MDBweCxcbikgIWRlZmF1bHQ7XG5cbi8vLyBBcHBsaWVzIHN0eWxlcyBmb3IgYSBiYXNpYyBkcm9wZG93bi5cbkBtaXhpbiBkcm9wZG93bi1jb250YWluZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kO1xuICBib3JkZXI6ICRkcm9wZG93bi1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICRkcm9wZG93bi1yYWRpdXM7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LXNpemU6ICRkcm9wZG93bi1mb250LXNpemU7XG4gIHBhZGRpbmc6ICRkcm9wZG93bi1wYWRkaW5nO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgd2lkdGg6ICRkcm9wZG93bi13aWR0aDtcbiAgei1pbmRleDogMTA7XG5cbiAgJi5pcy1vcGVuIHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICB9XG59XG5cbkBtaXhpbiBmb3VuZGF0aW9uLWRyb3Bkb3duIHtcbiAgLmRyb3Bkb3duLXBhbmUge1xuICAgIEBpbmNsdWRlIGRyb3Bkb3duLWNvbnRhaW5lcjtcbiAgfVxuXG4gIEBlYWNoICRuYW1lLCAkc2l6ZSBpbiAkZHJvcGRvd24tc2l6ZXMge1xuICAgIC5kcm9wZG93bi1wYW5lLiN7JG5hbWV9IHtcbiAgICAgIHdpZHRoOiAkc2l6ZTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGRyb3Bkb3duLW1lbnVcbi8vLy9cblxuLy8vIEVuYWJsZXMgYXJyb3dzIGZvciBpdGVtcyB3aXRoIGRyb3Bkb3duIG1lbnVzLlxuLy8vIEB0eXBlIEJvb2xlYW5cbiRkcm9wZG93bm1lbnUtYXJyb3dzOiB0cnVlICFkZWZhdWx0O1xuXG4vLy8gU2V0cyBkcm9wZG93biBtZW51IGFycm93IGNvbG9yIGlmIGFycm93IGlzIHVzZWQuXG4vLy8gQHR5cGUgQ29sb3JcbiRkcm9wZG93bm1lbnUtYXJyb3ctY29sb3I6ICRhbmNob3ItY29sb3IgIWRlZmF1bHQ7XG5cbi8vLyBNaW5pbXVtIHdpZHRoIG9mIGRyb3Bkb3duIHN1Yi1tZW51cy5cbi8vLyBAdHlwZSBMZW5ndGhcbiRkcm9wZG93bm1lbnUtbWluLXdpZHRoOiAyMDBweCAhZGVmYXVsdDtcblxuLy8vIEJhY2tncm91bmQgY29sb3IgZm9yIGRyb3Bkb3ducy5cbi8vLyBAdHlwZSBDb2xvclxuJGRyb3Bkb3dubWVudS1iYWNrZ3JvdW5kOiAkd2hpdGUgIWRlZmF1bHQ7XG5cbi8vLyBCb3JkZXIgZm9yIGRyb3Bkb3duIHN1Yi1tZW51cy5cbi8vLyBAdHlwZSBMaXN0XG4kZHJvcGRvd25tZW51LWJvcmRlcjogMXB4IHNvbGlkICRtZWRpdW0tZ3JheSAhZGVmYXVsdDtcblxuLy8gQm9yZGVyIHdpZHRoIGZvciBkcm9wZG93biBzdWItbWVudXMuXG4vLyBVc2VkIHRvIGFkanVzdCB0b3AgbWFyZ2luIG9mIGEgc3ViLW1lbnUgaWYgYSBib3JkZXIgaXMgdXNlZC5cbi8vIEB0eXBlIExlbmd0aFxuJGRyb3Bkb3dubWVudS1ib3JkZXItd2lkdGg6IG50aCgkZHJvcGRvd25tZW51LWJvcmRlciwgMSk7XG5cbkBtaXhpbiBmb3VuZGF0aW9uLWRyb3Bkb3duLW1lbnUge1xuICAuZHJvcGRvd24ubWVudSB7XG4gICAgYSB7XG4gICAgICBAaW5jbHVkZSBkaXNhYmxlLW1vdXNlLW91dGxpbmU7XG4gICAgfVxuICAgICY6bm90KC52ZXJ0aWNhbCkge1xuXG4gICAgfVxuICAgIC5uby1qcyAmIHVsIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuXG4gICAgJjpub3QoLnZlcnRpY2FsKSB7XG4gICAgICAuaXMtZHJvcGRvd24tc3VibWVudSB7XG4gICAgICAgICYuZmlyc3Qtc3ViIHtcbiAgICAgICAgICB0b3A6IDEwMCU7XG4gICAgICAgICAgI3skZ2xvYmFsLWxlZnR9OiAwO1xuICAgICAgICAgICN7JGdsb2JhbC1yaWdodH06IGF1dG87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLmFsaWduLXJpZ2h0IHtcbiAgICAgIC5pcy1kcm9wZG93bi1zdWJtZW51LmZpcnN0LXN1YiB7XG4gICAgICAgIHRvcDogMTAwJTtcbiAgICAgICAgbGVmdDogYXV0bztcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLmlzLWRyb3Bkb3duLW1lbnUudmVydGljYWwge1xuICAgIHdpZHRoOiAxMDBweDtcblxuICAgICYuYWxpZ24tcmlnaHQge1xuICAgICAgZmxvYXQ6IHJpZ2h0O1xuICAgIH1cblxuICAgID4gbGkgLmlzLWRyb3Bkb3duLXN1Ym1lbnUge1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMTAwJTtcbiAgICB9XG4gIH1cblxuICAuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIGE6OmFmdGVyIHtcbiAgICAgIGZsb2F0OiAkZ2xvYmFsLXJpZ2h0O1xuICAgICAgbWFyZ2luLXRvcDogM3B4O1xuICAgICAgbWFyZ2luLSN7JGdsb2JhbC1sZWZ0fTogMTBweDtcbiAgICB9XG5cbiAgICBAaWYgJGRyb3Bkb3dubWVudS1hcnJvd3Mge1xuICAgICAgJi5pcy1kb3duLWFycm93IGEge1xuICAgICAgICBwYWRkaW5nLSN7JGdsb2JhbC1yaWdodH06IDEuNXJlbTtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuXG4gICAgICAmLmlzLWRvd24tYXJyb3cgPiBhOjphZnRlciB7XG4gICAgICAgIEBpbmNsdWRlIGNzcy10cmlhbmdsZSg1cHgsICRkcm9wZG93bm1lbnUtYXJyb3ctY29sb3IsIGRvd24pO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogcmVtLWNhbGMoMnB4KSArIHJlbS1jYWxjKGdldC1zaWRlKCRtZW51LWl0ZW0tcGFkZGluZywgdG9wKSk7XG4gICAgICAgICN7JGdsb2JhbC1yaWdodH06IDVweDtcbiAgICAgIH1cblxuICAgICAgJi5pcy1sZWZ0LWFycm93ID4gYTo6YWZ0ZXIge1xuICAgICAgICBAaW5jbHVkZSBjc3MtdHJpYW5nbGUoNXB4LCAkZHJvcGRvd25tZW51LWFycm93LWNvbG9yLCBsZWZ0KTtcbiAgICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgICB9XG5cbiAgICAgICYuaXMtcmlnaHQtYXJyb3cgPiBhOjphZnRlciB7XG4gICAgICAgIEBpbmNsdWRlIGNzcy10cmlhbmdsZSg1cHgsICRkcm9wZG93bm1lbnUtYXJyb3ctY29sb3IsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLmlzLWxlZnQtYXJyb3cub3BlbnMtaW5uZXIgLmlzLWRyb3Bkb3duLXN1Ym1lbnUge1xuICAgICAgcmlnaHQ6IDA7XG4gICAgICBsZWZ0OiBhdXRvO1xuICAgIH1cblxuICAgICYuaXMtcmlnaHQtYXJyb3cub3BlbnMtaW5uZXIgLmlzLWRyb3Bkb3duLXN1Ym1lbnUge1xuICAgICAgbGVmdDogMDtcbiAgICAgIHJpZ2h0OiBhdXRvO1xuICAgIH1cblxuICAgICYub3BlbnMtaW5uZXIgLmlzLWRyb3Bkb3duLXN1Ym1lbnUge1xuICAgICAgdG9wOiAxMDAlO1xuICAgIH1cblxuICAgICYub3BlbnMtbGVmdCAuaXMtZHJvcGRvd24tc3VibWVudSB7XG4gICAgICBsZWZ0OiBhdXRvO1xuICAgICAgcmlnaHQ6IDEwMCU7XG4gICAgfVxuICB9XG5cblxuICAuaXMtZHJvcGRvd24tc3VibWVudSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgICN7JGdsb2JhbC1sZWZ0fTogMTAwJTtcbiAgICBtaW4td2lkdGg6ICRkcm9wZG93bm1lbnUtbWluLXdpZHRoO1xuICAgIHotaW5kZXg6IDE7XG4gICAgYmFja2dyb3VuZDogJGRyb3Bkb3dubWVudS1iYWNrZ3JvdW5kO1xuICAgIGJvcmRlcjogJGRyb3Bkb3dubWVudS1ib3JkZXI7XG5cbiAgICBAaWYgKHR5cGUtb2YoJGRyb3Bkb3dubWVudS1ib3JkZXItd2lkdGgpID09ICdudW1iZXInKSB7XG4gICAgICAuaXMtZHJvcGRvd24tc3VibWVudSB7XG4gICAgICAgIG1hcmdpbi10b3A6ICgtJGRyb3Bkb3dubWVudS1ib3JkZXItd2lkdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgID4gbGkge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG5cbiAgICAvLyBbVE9ET10gQ3V0IGJhY2sgc3BlY2lmaWNpdHlcbiAgICAvLyBzY3NzLWxpbnQ6ZGlzYWJsZSBTZWxlY3RvckRlcHRoXG4gICAgJjpub3QoLmpzLWRyb3Bkb3duLW5vaG92ZXIpID4gLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50OmhvdmVyID4gJixcbiAgICAmLmpzLWRyb3Bkb3duLWFjdGl2ZSB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGZsZXgtdmlkZW9cbi8vLy9cblxuLy8vIE1hcmdpbiBiZWxvdyBhIGZsZXggdmlkZW8gY29udGFpbmVyLlxuLy8vIEB0eXBlIE51bWJlclxuJGZsZXh2aWRlby1tYXJnaW4tYm90dG9tOiByZW0tY2FsYygxNikgIWRlZmF1bHQ7XG5cbi8vLyBQYWRkaW5nIHVzZWQgdG8gY3JlYXRlIGEgNDozIGFzcGVjdCByYXRpby5cbi8vLyBAdHlwZSBOdW1iZXJcbiRmbGV4dmlkZW8tcmF0aW86IDQgYnkgMyAhZGVmYXVsdDtcblxuLy8vIFBhZGRpbmcgdXNlZCB0byBjcmVhdGUgYSAxNjo5IGFzcGVjdCByYXRpby5cbi8vLyBAdHlwZSBOdW1iZXJcbiRmbGV4dmlkZW8tcmF0aW8td2lkZXNjcmVlbjogMTYgYnkgOSAhZGVmYXVsdDtcblxuLy8vIENyZWF0ZXMgYSBwZXJjZW50YWdlIGhlaWdodCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhZGRpbmcgaW4gYSBmbGV4IHZpZGVvIGNvbnRhaW5lci5cbi8vLyBAcGFyYW0ge0xpc3R9ICRyYXRpbyAtIFJhdGlvIHRvIHVzZSB0byBjYWxjdWxhdGUgdGhlIGhlaWdodCwgZm9ybWF0dGVkIGFzIGB4IGJ5IHlgLlxuLy8vIEByZXR1cm4ge051bWJlcn0gQSBwZXJjZW50YWdlIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIGBwYWRkaW5nLWJvdHRvbWAgcGFyYW1ldGVyIG9mIGEgZmxleCB2aWRlbyBjb250YWluZXIuXG5AZnVuY3Rpb24gZmxleC12aWRlbygkcmF0aW8pIHtcbiAgJHc6IG50aCgkcmF0aW8sIDEpO1xuICAkaDogbnRoKCRyYXRpbywgMyk7XG4gIEByZXR1cm4gJGggLyAkdyAqIDEwMCU7XG59XG5cbi8vLyBDcmVhdGVzIGEgZmxleCB2aWRlbyBjb250YWluZXIuXG4vLy8gQHBhcmFtIHtMaXN0fSAkcmF0aW8gWyRmbGV4dmlkZW8tcmF0aW9dIC0gUmF0aW8gdG8gdXNlIGZvciB0aGUgY29udGFpbmVyLCBmb3JtYXR0ZWQgYXMgYHggYnkgeWAuXG5AbWl4aW4gZmxleC12aWRlbygkcmF0aW86ICRmbGV4dmlkZW8tcmF0aW8pIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBoZWlnaHQ6IDA7XG4gIHBhZGRpbmctYm90dG9tOiBmbGV4LXZpZGVvKCRyYXRpbyk7XG4gIG1hcmdpbi1ib3R0b206ICRmbGV4dmlkZW8tbWFyZ2luLWJvdHRvbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcblxuICBpZnJhbWUsXG4gIG9iamVjdCxcbiAgZW1iZWQsXG4gIHZpZGVvIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgICN7JGdsb2JhbC1sZWZ0fTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gIH1cbn1cblxuQG1peGluIGZvdW5kYXRpb24tZmxleC12aWRlbyB7XG4gIC5mbGV4LXZpZGVvIHtcbiAgICBAaW5jbHVkZSBmbGV4LXZpZGVvO1xuXG4gICAgJi53aWRlc2NyZWVuIHtcbiAgICAgIHBhZGRpbmctYm90dG9tOiBmbGV4LXZpZGVvKCRmbGV4dmlkZW8tcmF0aW8td2lkZXNjcmVlbik7XG4gICAgfVxuXG4gICAgJi52aW1lbyB7XG4gICAgICBwYWRkaW5nLXRvcDogMDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIGxhYmVsXG4vLy8vXG5cbi8vLyBEZWZhdWx0IGJhY2tncm91bmQgY29sb3IgZm9yIGxhYmVscy5cbi8vLyBAdHlwZSBDb2xvclxuJGxhYmVsLWJhY2tncm91bmQ6ICRwcmltYXJ5LWNvbG9yICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCB0ZXh0IGNvbG9yIGZvciBsYWJlbHMuXG4vLy8gQHR5cGUgQ29sb3JcbiRsYWJlbC1jb2xvcjogZm9yZWdyb3VuZCgkbGFiZWwtYmFja2dyb3VuZCkgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGZvbnQgc2l6ZSBmb3IgbGFiZWxzLlxuLy8vIEB0eXBlIE51bWJlclxuJGxhYmVsLWZvbnQtc2l6ZTogMC44cmVtICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBwYWRkaW5nIGluc2lkZSBsYWJlbHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kbGFiZWwtcGFkZGluZzogMC4zMzMzM3JlbSAwLjVyZW0gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHJhZGl1cyBvZiBsYWJlbHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kbGFiZWwtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cyAhZGVmYXVsdDtcblxuLy8vIEdlbmVyYXRlcyBiYXNlIHN0eWxlcyBmb3IgYSBsYWJlbC5cbkBtaXhpbiBsYWJlbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZzogJGxhYmVsLXBhZGRpbmc7XG4gIGZvbnQtc2l6ZTogJGxhYmVsLWZvbnQtc2l6ZTtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgYm9yZGVyLXJhZGl1czogJGxhYmVsLXJhZGl1cztcbn1cblxuQG1peGluIGZvdW5kYXRpb24tbGFiZWwge1xuICAubGFiZWwge1xuICAgIEBpbmNsdWRlIGxhYmVsO1xuXG4gICAgYmFja2dyb3VuZDogJGxhYmVsLWJhY2tncm91bmQ7XG4gICAgY29sb3I6ICRsYWJlbC1jb2xvcjtcblxuICAgIEBlYWNoICRuYW1lLCAkY29sb3IgaW4gJGZvdW5kYXRpb24tY29sb3JzIHtcbiAgICAgIEBpZiAkbmFtZSAhPSBwcmltYXJ5IHtcbiAgICAgICAgJi4jeyRuYW1lfSB7XG4gICAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yO1xuICAgICAgICAgIGNvbG9yOiBmb3JlZ3JvdW5kKCRjb2xvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIG1lZGlhLW9iamVjdFxuLy8vL1xuXG4vLy8gQm90dG9tIG1hcmdpbiBvZiBhIG1lZGlhIG9iamVjdC5cbi8vLyBAdHlwZSBOdW1iZXJcbiRtZWRpYW9iamVjdC1tYXJnaW4tYm90dG9tOiAkZ2xvYmFsLW1hcmdpbiAhZGVmYXVsdDtcblxuLy8vIExlZnQgYW5kIHJpZ2h0IHBhZGRpbmcgb24gc2VjdGlvbnMgd2l0aGluIGEgbWVkaWEgb2JqZWN0LlxuLy8vIEB0eXBlIE51bWJlclxuJG1lZGlhb2JqZWN0LXNlY3Rpb24tcGFkZGluZzogJGdsb2JhbC1wYWRkaW5nICFkZWZhdWx0O1xuXG4vLy8gV2l0aCBvZiBpbWFnZXMgd2l0aGluIGEgbWVkaWEgb2JqZWN0LCB3aGVuIHRoZSBvYmplY3QgaXMgc3RhY2tlZCB2ZXJ0aWNhbGx5LiBTZXQgdG8gJ2F1dG8nIHRvIHVzZSB0aGUgaW1hZ2UncyBuYXR1cmFsIHdpZHRoLlxuLy8vIEB0eXBlIE51bWJlclxuJG1lZGlhb2JqZWN0LWltYWdlLXdpZHRoLXN0YWNrZWQ6IDEwMCUgIWRlZmF1bHQ7XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYSBtZWRpYSBvYmplY3QgY29udGFpbmVyLlxuQG1peGluIG1lZGlhLW9iamVjdC1jb250YWluZXIge1xuICBtYXJnaW4tYm90dG9tOiAkbWVkaWFvYmplY3QtbWFyZ2luLWJvdHRvbTtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3Igc2VjdGlvbnMgd2l0aGluIGEgbWVkaWEgb2JqZWN0LlxuLy8vIEBwYXJhbSB7TnVtYmVyfSAkcGFkZGluZyBbJG1lZGlhb2JqZWN0LXNlY3Rpb24tcGFkZGluZ10gLSBQYWRkaW5nIGJldHdlZW4gc2VjdGlvbnMuXG5AbWl4aW4gbWVkaWEtb2JqZWN0LXNlY3Rpb24oJHBhZGRpbmc6ICRtZWRpYW9iamVjdC1zZWN0aW9uLXBhZGRpbmcpIHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcblxuICAmOmZpcnN0LWNoaWxkIHtcbiAgICBwYWRkaW5nLSN7JGdsb2JhbC1yaWdodH06ICRwYWRkaW5nO1xuICB9XG5cbiAgJjpsYXN0LWNoaWxkOm5vdCg6bnRoLWNoaWxkKDIpKSB7XG4gICAgcGFkZGluZy0jeyRnbG9iYWwtbGVmdH06ICRwYWRkaW5nO1xuICB9XG59XG5cbi8vLyBBZGRzIHN0eWxlcyB0byBzdGFjayBzZWN0aW9ucyBvZiBhIG1lZGlhIG9iamVjdC4gQXBwbHkgdGhpcyB0byB0aGUgc2VjdGlvbiBlbGVtZW50cywgbm90IHRoZSBjb250YWluZXIuXG5AbWl4aW4gbWVkaWEtb2JqZWN0LXN0YWNrIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDA7XG4gIHBhZGRpbmctYm90dG9tOiAkbWVkaWFvYmplY3Qtc2VjdGlvbi1wYWRkaW5nO1xuXG4gIGltZyB7XG4gICAgd2lkdGg6ICRtZWRpYW9iamVjdC1pbWFnZS13aWR0aC1zdGFja2VkO1xuICB9XG59XG5cbkBtaXhpbiBmb3VuZGF0aW9uLW1lZGlhLW9iamVjdCB7XG4gIC5tZWRpYS1vYmplY3Qge1xuICAgIEBpbmNsdWRlIG1lZGlhLW9iamVjdC1jb250YWluZXI7XG5cbiAgICBpbWcge1xuICAgICAgbWF4LXdpZHRoOiBub25lO1xuICAgIH1cblxuICAgICYuc3RhY2stZm9yLXNtYWxsIC5tZWRpYS1vYmplY3Qtc2VjdGlvbiB7XG4gICAgICBAaW5jbHVkZSBicmVha3BvaW50KHNtYWxsIG9ubHkpIHtcbiAgICAgICAgQGluY2x1ZGUgbWVkaWEtb2JqZWN0LXN0YWNrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5tZWRpYS1vYmplY3Qtc2VjdGlvbiB7XG4gICAgQGluY2x1ZGUgbWVkaWEtb2JqZWN0LXNlY3Rpb247XG5cbiAgICAmLm1pZGRsZSB7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH1cbiAgICAmLmJvdHRvbSB7IHZlcnRpY2FsLWFsaWduOiBib3R0b207IH1cbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgbWVudVxuLy8vL1xuXG4vLy8gTWFyZ2luIG9mIGEgbWVudS5cbi8vLyBAdHlwZSBOdW1iZXJcbiRtZW51LW1hcmdpbjogMCAhZGVmYXVsdDtcblxuLy8vIExlZnQtaGFuZCBtYXJnaW4gb2YgYSBuZXN0ZWQgbWVudS5cbi8vLyBAdHlwZSBOdW1iZXJcbiRtZW51LW1hcmdpbi1uZXN0ZWQ6IDFyZW0gIWRlZmF1bHQ7XG5cbi8vLyBQYWRkaW5nIGZvciBpdGVtcyBpbiBhIG1lbnUuXG4vLy8gQHR5cGUgTnVtYmVyXG4kbWVudS1pdGVtLXBhZGRpbmc6IDAuN3JlbSAxcmVtICFkZWZhdWx0O1xuXG4vLy8gU3BhY2luZyBiZXR3ZWVuIGFuIGljb24gYW5kIHRleHQgaW4gYSBtZW51IGl0ZW0uXG4vLy8gQHR5cGUgTnVtYmVyXG4kbWVudS1pY29uLXNwYWNpbmc6IDAuMjVyZW0gIWRlZmF1bHQ7XG5cbi8vLyBNYXhpbXVtIG51bWJlciBvZiBgZXhwYW5kLW5gIGNsYXNzZXMgdG8gaW5jbHVkZSBpbiB0aGUgQ1NTLlxuLy8vIEB0eXBlIE51bWJlclxuJG1lbnUtZXhwYW5kLW1heDogNiAhZGVmYXVsdDtcblxuLy8vIENyZWF0ZXMgdGhlIGJhc2Ugc3R5bGVzIGZvciBhIE1lbnUuXG5AbWl4aW4gbWVudS1iYXNlIHtcbiAgbWFyZ2luOiAkbWVudS1tYXJnaW47XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcblxuICAvLyBMaXN0IGl0ZW1zIGFyZSB0YWJsZSBjZWxsIHRvIGFsbG93IGZvciB2ZXJ0aWNhbCBhbGlnbm1lbnRcbiAgPiBsaSB7XG4gICAgQGluY2x1ZGUgZGlzYWJsZS1tb3VzZS1vdXRsaW5lO1xuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgfVxuXG4gIC8vIFJlc2V0IGxpbmUgaGVpZ2h0IHRvIG1ha2UgdGhlIGhlaWdodCBvZiB0aGUgb3ZlcmFsbCBpdGVtIGVhc2llciB0byBjYWxjdWxhdGVcbiAgPiBsaSA+IGEge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBhZGRpbmc6ICRtZW51LWl0ZW0tcGFkZGluZztcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgfVxuXG4gIC8vIFJlc2V0IHN0eWxlcyBvZiBpbm5lciBlbGVtZW50c1xuICBpbnB1dCxcbiAgYSxcbiAgYnV0dG9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbi8vLyBFeHBhbmRzIHRoZSBpdGVtcyBvZiBhIE1lbnUsIHNvIGVhY2ggaXRlbSBpcyB0aGUgc2FtZSB3aWR0aC5cbkBtaXhpbiBtZW51LWV4cGFuZCB7XG4gIGRpc3BsYXk6IHRhYmxlO1xuICB0YWJsZS1sYXlvdXQ6IGZpeGVkO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLy8vIFNldHMgdGhlIGRpcmVjdGlvbiBvZiBhIE1lbnUuXG4vLy8gQHBhcmFtIHtLZXl3b3JkfSAkZGlyIFtob3Jpem9udGFsXSAtIERpcmVjdGlvbiBvZiB0aGUgTWVudS4gQ2FuIGJlIGBob3Jpem9udGFsYCBvciBgdmVydGljYWxgLlxuQG1peGluIG1lbnUtZGlyZWN0aW9uKCRkaXI6IGhvcml6b250YWwpIHtcbiAgQGlmICRkaXIgPT0gaG9yaXpvbnRhbCB7XG4gICAgPiBsaSB7XG4gICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIH1cbiAgfVxuICBAZWxzZSBpZiAkZGlyID09IHZlcnRpY2FsIHtcbiAgICA+IGxpIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgfVxuICBAZWxzZSB7XG4gICAgQHdhcm4gJ1RoZSBkaXJlY3Rpb24gdXNlZCBmb3IgbWVudS1kaXJlY3Rpb24oKSBtdXN0IGJlIGhvcml6b250YWwgb3IgdmVydGljYWwuJztcbiAgfVxufVxuXG4vLy8gQ3JlYXRlcyBhIHNpbXBsZSBNZW51LCB3aGljaCBoYXMgbm8gcGFkZGluZyBvciBob3ZlciBzdGF0ZS5cbkBtaXhpbiBtZW51LXNpbXBsZSB7XG4gIGxpIHtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbWFyZ2luLSN7JGdsb2JhbC1yaWdodH06IGdldC1zaWRlKCRtZW51LWl0ZW0tcGFkZGluZywgJGdsb2JhbC1yaWdodCk7XG4gIH1cblxuICBhIHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG59XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYSBuZXN0ZWQgTWVudSwgYnkgYWRkaW5nIGBtYXJnaW4tbGVmdGAgdG8gdGhlIG1lbnUuXG4vLy8gQHBhcmFtIHtLZXl3b3JkfE51bWJlcn0gJHBhZGRpbmcgW2F1dG9dIC0gTGVuZ3RoIG9mIHRoZSBtYXJnaW4uXG5AbWl4aW4gbWVudS1uZXN0ZWQoJG1hcmdpbjogJG1lbnUtbWFyZ2luLW5lc3RlZCkge1xuICBtYXJnaW4tI3skZ2xvYmFsLWxlZnR9OiAkbWFyZ2luO1xufVxuXG4vLy8gQWRkcyBzdXBwb3J0IGZvciBpY29ucyB0byBNZW51IGl0ZW1zLlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJHBvc2l0aW9uIFtzaWRlXSAtIFBvc2l0aW9uaW5nIGZvciBpY29ucy4gQ2FuIGJlIGBzaWRlYCAobGVmdCwgb3IgcmlnaHQgb24gUlRMKSBvciBgdG9wYC5cbi8vLyBAcGFyYW0ge0Jvb2xlYW59ICRiYXNlIFt0cnVlXSAtIFNldCB0byBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIHNoYXJlZCBDU1MgYmV0d2VlbiBzaWRlLSBhbmQgdG9wLWFsaWduZWQgaWNvbnMgZnJvbSBiZWluZyBwcmludGVkLiBTZXQgdGhpcyB0byBgZmFsc2VgIGlmIHlvdSdyZSBjYWxsaW5nIHRoZSBtaXhpbiBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBlbGVtZW50LlxuQG1peGluIG1lbnUtaWNvbnMoJHBvc2l0aW9uOiBzaWRlLCAkYmFzZTogdHJ1ZSkge1xuICBAaWYgJGJhc2Uge1xuICAgID4gbGkgPiBhIHtcbiAgICAgID4gaW1nLFxuICAgICAgPiBpIHtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgIH1cblxuICAgICAgPiBzcGFuIHtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAaWYgJHBvc2l0aW9uID09IHNpZGUge1xuICAgID4gbGkgPiBhIHtcbiAgICAgID4gaW1nLFxuICAgICAgPiBpIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBtYXJnaW4tI3skZ2xvYmFsLXJpZ2h0fTogJG1lbnUtaWNvbi1zcGFjaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBAZWxzZSBpZiAkcG9zaXRpb24gPT0gdG9wIHtcbiAgICA+IGxpID4gYSB7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG5cbiAgICAgID4gaW1nLFxuICAgICAgPiBpIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbjogMCBhdXRvICRtZW51LWljb24tc3BhY2luZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1lbnUtdGV4dCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogaW5oZXJpdDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHBhZGRpbmctdG9wOiAwO1xuICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgcGFkZGluZzogJG1lbnUtaXRlbS1wYWRkaW5nO1xufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1tZW51IHtcbiAgLm1lbnUge1xuICAgIEBpbmNsdWRlIG1lbnUtYmFzZTtcbiAgICBAaW5jbHVkZSBtZW51LWljb25zO1xuXG4gICAgLy8gT3JpZW50YXRpb25cbiAgICBAaW5jbHVkZSBtZW51LWRpcmVjdGlvbihob3Jpem9udGFsKTtcblxuICAgICYudmVydGljYWwge1xuICAgICAgQGluY2x1ZGUgbWVudS1kaXJlY3Rpb24odmVydGljYWwpO1xuICAgIH1cblxuICAgIEBlYWNoICRzaXplIGluICRicmVha3BvaW50LWNsYXNzZXMge1xuICAgICAgQGlmICRzaXplICE9IHNtYWxsIHtcbiAgICAgICAgQGluY2x1ZGUgYnJlYWtwb2ludCgkc2l6ZSkge1xuICAgICAgICAgICYuI3skc2l6ZX0taG9yaXpvbnRhbCB7XG4gICAgICAgICAgICBAaW5jbHVkZSBtZW51LWRpcmVjdGlvbihob3Jpem9udGFsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAmLiN7JHNpemV9LXZlcnRpY2FsIHtcbiAgICAgICAgICAgIEBpbmNsdWRlIG1lbnUtZGlyZWN0aW9uKHZlcnRpY2FsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTaW1wbGVcbiAgICAmLnNpbXBsZSB7XG4gICAgICBAaW5jbHVkZSBtZW51LXNpbXBsZTtcbiAgICB9XG5cbiAgICAvLyBBbGlnbiByaWdodFxuICAgICYuYWxpZ24tI3skZ2xvYmFsLXJpZ2h0fSB7XG4gICAgICA+IGxpIHtcbiAgICAgICAgZmxvYXQ6ICRnbG9iYWwtcmlnaHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXZlbi13aWR0aFxuICAgICYuZXhwYW5kZWQge1xuICAgICAgQGluY2x1ZGUgbWVudS1leHBhbmQ7XG5cbiAgICAgID4gbGk6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZlcnRpY2FsIGljb25zXG4gICAgJi5pY29uLXRvcCB7XG4gICAgICBAaW5jbHVkZSBtZW51LWljb25zKHRvcCwgJGJhc2U6IGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBOZXN0aW5nXG4gICAgJi5uZXN0ZWQge1xuICAgICAgQGluY2x1ZGUgbWVudS1uZXN0ZWQ7XG4gICAgfVxuICB9XG5cbiAgLm1lbnUtdGV4dCB7XG4gICAgQGluY2x1ZGUgbWVudS10ZXh0O1xuICB9XG5cbiAgLy8gUHJldmVudCBGT1VDIHdoZW4gdXNpbmcgdGhlIFJlc3BvbnNpdmUgTWVudSBwbHVnaW5cbiAgLm5vLWpzIFtkYXRhLXJlc3BvbnNpdmUtbWVudV0gdWwge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIG9mZi1jYW52YXNcbi8vLy9cblxuLy8vIFdpZHRoIG9mIGFuIG9mZi1jYW52YXMgbWVudS5cbi8vLyBAdHlwZSBOdW1iZXJcbiRvZmZjYW52YXMtc2l6ZTogMjUwcHggIWRlZmF1bHQ7XG5cbi8vLyBCYWNrZ3JvdW5kIGNvbG9yIG9mIGFuIG9mZi1jYW52YXMgbWVudS5cbi8vLyBAdHlwZSBDb2xvclxuJG9mZmNhbnZhcy1iYWNrZ3JvdW5kOiAkbGlnaHQtZ3JheSAhZGVmYXVsdDtcblxuLy8vIFotaW5kZXggb2YgYW4gb2ZmLWNhbnZhcyBtZW51LlxuLy8vIEB0eXBlIE51bWJlclxuJG9mZmNhbnZhcy16aW5kZXg6IC0xICFkZWZhdWx0O1xuXG4vLy8gTGVuZ3RoIG9mIHRoZSBhbmltYXRpb24gb24gYW4gb2ZmLWNhbnZhcyBtZW51LlxuLy8vIEB0eXBlIE51bWJlclxuJG9mZmNhbnZhcy10cmFuc2l0aW9uLWxlbmd0aDogMC41cyAhZGVmYXVsdDtcblxuLy8vIFRpbWluZyBmdW5jdGlvbiBvZiB0aGUgYW5pbWF0aW9uIG9uIGFuIG9mZi1jYW52YXMgbWVudS5cbi8vLyBAdHlwZSBLZXl3b3JkXG4kb2ZmY2FudmFzLXRyYW5zaXRpb24tdGltaW5nOiBlYXNlICFkZWZhdWx0O1xuXG4vLy8gSWYgYHRydWVgLCBhIHJldmVhbGVkIG9mZi1jYW52YXMgd2lsbCBiZSBmaXhlZC1wb3NpdGlvbiwgYW5kIHNjcm9sbCB3aXRoIHRoZSBzY3JlZW4uXG4kb2ZmY2FudmFzLWZpeGVkLXJldmVhbDogdHJ1ZSAhZGVmYXVsdDtcblxuLy8vIEJhY2tncm91bmQgY29sb3IgZm9yIHRoZSBvdmVybGF5IHRoYXQgYXBwZWFycyB3aGVuIGFuIG9mZi1jYW52YXMgbWVudSBpcyBvcGVuLlxuLy8vIEB0eXBlIENvbG9yXG4kb2ZmY2FudmFzLWV4aXQtYmFja2dyb3VuZDogcmdiYSgkd2hpdGUsIDAuMjUpICFkZWZhdWx0O1xuXG4vLy8gQ1NTIGNsYXNzIHVzZWQgZm9yIHRoZSBtYWluIGNvbnRlbnQgYXJlYS4gVGhlIG9mZi1jYW52YXMgbWl4aW5zIHVzZSB0aGlzIHRvIHRhcmdldCB0aGUgcGFnZSBib2R5LlxuJG1haW5jb250ZW50LWNsYXNzOiAnb2ZmLWNhbnZhcy1jb250ZW50JyAhZGVmYXVsdDtcblxuLy8vIEJveCBzaGFkb3cgdG8gcGxhY2UgdW5kZXIgdGhlIG1haW4gY29udGVudCBhcmVhLiBUaGlzIHNoYWRvdyBvdmVybGFwcyB0aGUgb2ZmLWNhbnZhcyBtZW51cy5cbi8vLyBAdHlwZSBTaGFkb3dcbiRtYWluY29udGVudC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoJGJsYWNrLCAwLjUpICFkZWZhdWx0O1xuXG4vLy8gQWRkcyBiYXNlbGluZSBzdHlsZXMgZm9yIG9mZi1jYW52YXMuIFRoaXMgQ1NTIGlzIHJlcXVpcmVkIHRvIG1ha2UgdGhlIG90aGVyIHBpZWNlcyB3b3JrLlxuQG1peGluIG9mZi1jYW52YXMtYmFzaWNzIHtcbiAgLy8gRXh0cmEgcHJvcGVydGllcyBuZWVkZWQgb24gPGh0bWw+IGFuZCA8Ym9keT4gdG8gbWFrZSBvZmYtY2FudmFzIHdvcmtcbiAgaHRtbCxcbiAgYm9keSB7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICB9XG5cbiAgLm9mZi1jYW52YXMtd3JhcHBlciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IGF1dG87XG4gIH1cblxuICAub2ZmLWNhbnZhcy13cmFwcGVyLWlubmVyIHtcbiAgICBAaW5jbHVkZSBjbGVhcmZpeDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtICRvZmZjYW52YXMtdHJhbnNpdGlvbi1sZW5ndGggJG9mZmNhbnZhcy10cmFuc2l0aW9uLXRpbWluZztcbiAgfVxuXG4gIC8vIENvbnRhaW5lciBmb3IgcGFnZSBjb250ZW50XG4gIC5vZmYtY2FudmFzLWNvbnRlbnQsXG4gIC4jeyRtYWluY29udGVudC1jbGFzc30ge1xuICAgIG1pbi1oZWlnaHQ6IDEwMCU7XG4gICAgYmFja2dyb3VuZDogJGJvZHktYmFja2dyb3VuZDtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gJG9mZmNhbnZhcy10cmFuc2l0aW9uLWxlbmd0aCAkb2ZmY2FudmFzLXRyYW5zaXRpb24tdGltaW5nO1xuICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICB6LWluZGV4OiAxO1xuXG4gICAgQGlmIGhhcy12YWx1ZSgkbWFpbmNvbnRlbnQtc2hhZG93KSB7XG4gICAgICBib3gtc2hhZG93OiAkbWFpbmNvbnRlbnQtc2hhZG93O1xuICAgIH1cbiAgfVxuXG4gIC8vIENsaWNrLXRvLWV4aXQgb3ZlcmxheSAoZ2VuZXJhdGVkIGJ5IEphdmFTY3JpcHQpXG4gIC5qcy1vZmYtY2FudmFzLWV4aXQge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAkb2ZmY2FudmFzLWV4aXQtYmFja2dyb3VuZDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAkb2ZmY2FudmFzLXRyYW5zaXRpb24tbGVuZ3RoICRvZmZjYW52YXMtdHJhbnNpdGlvbi10aW1pbmc7XG4gIH1cbn1cblxuLy8vIEFkZHMgYmFzaWMgc3R5bGVzIGZvciBhbiBvZmYtY2FudmFzIG1lbnUuXG5AbWl4aW4gb2ZmLWNhbnZhcy1iYXNlIHtcbiAgQGluY2x1ZGUgZGlzYWJsZS1tb3VzZS1vdXRsaW5lO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJhY2tncm91bmQ6ICRvZmZjYW52YXMtYmFja2dyb3VuZDtcbiAgei1pbmRleDogJG9mZmNhbnZhcy16aW5kZXg7XG4gIG1heC1oZWlnaHQ6IDEwMCU7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbn1cblxuQG1peGluIG9mZi1jYW52YXMtcG9zaXRpb24oXG4gICRwb3NpdGlvbjogbGVmdCxcbiAgJHNpemU6ICRvZmZjYW52YXMtc2l6ZSxcbiAgJGZpeGVkOiBmYWxzZVxuKSB7XG4gIEBpZiAkcG9zaXRpb24gPT0gbGVmdCB7XG4gICAgbGVmdDogLSRzaXplO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogJHNpemU7XG4gIH1cbiAgQGVsc2UgaWYgJHBvc2l0aW9uID09IHJpZ2h0IHtcbiAgICByaWdodDogLSRzaXplO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogJHNpemU7XG4gIH1cblxuICAvLyBHZW5lcmF0ZXMgYW4gb3BlbiBzdGF0ZSBjbGFzcyB0aGF0IG1hdGNoZXMgdGhlIHdpZHRoIG9mIHRoZSBtZW51XG4gIEBhdC1yb290IHtcbiAgICAuaXMtb3Blbi0jeyRwb3NpdGlvbn0ge1xuICAgICAgQGlmICRwb3NpdGlvbiA9PSBsZWZ0IHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKCRzaXplKTtcbiAgICAgIH1cbiAgICAgIEBlbHNlIGlmICRwb3NpdGlvbiA9PSByaWdodCB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtJHNpemUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLy8gQWRkcyBzdHlsZXMgdGhhdCByZXZlYWwgYW4gb2ZmLWNhbnZhcyBtZW51LlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJHBvc2l0aW9uIFtsZWZ0XSAtIFBvc2l0aW9uIG9mIHRoZSBvZmYtY2FudmFzIG1lbnUgYmVpbmcgcmV2ZWFsZWQuXG5AbWl4aW4gb2ZmLWNhbnZhcy1yZXZlYWwoXG4gICRwb3NpdGlvbjogbGVmdFxuKSB7XG4gICN7JHBvc2l0aW9ufTogMDtcbiAgei1pbmRleDogYXV0bztcblxuICBAaWYgJG9mZmNhbnZhcy1maXhlZC1yZXZlYWwge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgfVxuXG4gICYgfiAuI3skbWFpbmNvbnRlbnQtY2xhc3N9IHtcbiAgICBtYXJnaW4tI3skcG9zaXRpb259OiAkb2ZmY2FudmFzLXNpemU7XG4gIH1cbn1cblxuQG1peGluIGZvdW5kYXRpb24tb2ZmLWNhbnZhcyB7XG4gIEBpbmNsdWRlIG9mZi1jYW52YXMtYmFzaWNzO1xuXG4gIC8vIE9mZi1jYW52YXMgY29udGFpbmVyXG4gIC5vZmYtY2FudmFzIHtcbiAgICBAaW5jbHVkZSBvZmYtY2FudmFzLWJhc2U7XG5cbiAgICAmLnBvc2l0aW9uLWxlZnQgICB7IEBpbmNsdWRlIG9mZi1jYW52YXMtcG9zaXRpb24obGVmdCk7IH1cbiAgICAmLnBvc2l0aW9uLXJpZ2h0ICB7IEBpbmNsdWRlIG9mZi1jYW52YXMtcG9zaXRpb24ocmlnaHQpOyB9XG4gIH1cblxuICAvLyBSZXZlYWwgb2ZmLWNhbnZhcyBtZW51IG9uIGxhcmdlciBzY3JlZW5zXG4gIEBlYWNoICRuYW1lLCAkdmFsdWUgaW4gJGJyZWFrcG9pbnQtY2xhc3NlcyB7XG4gICAgQGlmICRuYW1lICE9IHNtYWxsIHtcbiAgICAgIEBpbmNsdWRlIGJyZWFrcG9pbnQoJG5hbWUpIHtcbiAgICAgICAgLnBvc2l0aW9uLWxlZnQucmV2ZWFsLWZvci0jeyRuYW1lfSB7XG4gICAgICAgICAgQGluY2x1ZGUgb2ZmLWNhbnZhcy1yZXZlYWwobGVmdCk7XG4gICAgICAgIH1cblxuICAgICAgICAucG9zaXRpb24tcmlnaHQucmV2ZWFsLWZvci0jeyRuYW1lfSB7XG4gICAgICAgICAgQGluY2x1ZGUgb2ZmLWNhbnZhcy1yZXZlYWwocmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBvcmJpdFxuLy8vL1xuXG4vLy8gRGVmYXVsdCBjb2xvciBmb3IgT3JiaXQncyBidWxsZXRzLlxuLy8vIEB0eXBlIENvbG9yXG4kb3JiaXQtYnVsbGV0LWJhY2tncm91bmQ6ICRtZWRpdW0tZ3JheSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgYWN0aXZlIGNvbG9yIGZvciBPcmJpdCdzIGJ1bGxldHMuXG4vLy8gQHR5cGUgQ29sb3JcbiRvcmJpdC1idWxsZXQtYmFja2dyb3VuZC1hY3RpdmU6ICRkYXJrLWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGRpYW1ldGVyIGZvciBPcmJpdCdzIGJ1bGxldHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kb3JiaXQtYnVsbGV0LWRpYW1ldGVyOiAxLjJyZW0gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IG1hcmdpbiBiZXR3ZWVuIE9yYml0J3MgYnVsbGV0cy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRvcmJpdC1idWxsZXQtbWFyZ2luOiAwLjFyZW0gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGRpc3RhbmNlIGZyb20gc2xpZGUgcmVnaW9uIGZvciBPcmJpdCdzIGJ1bGxldHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kb3JiaXQtYnVsbGV0LW1hcmdpbi10b3A6IDAuOHJlbSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgYm90dG9tIG1hcmdpbiBmcm9tIE9yYml0J3MgYnVsbGV0cyB0byB3aGF0ZXZlciBjb250ZW50IG1heSBsdXJrIGJlbG93IGl0LlxuLy8vIEB0eXBlIE51bWJlclxuJG9yYml0LWJ1bGxldC1tYXJnaW4tYm90dG9tOiAwLjhyZW0gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGJhY2tncm91bmQgY29sb3IgZm9yIE9yYml0J3MgY2FwdGlvbi5cbi8vLyBAdHlwZSBDb2xvclxuJG9yYml0LWNhcHRpb24tYmFja2dyb3VuZDogcmdiYSgkYmxhY2ssIDAuNSkgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHBhZGRpbmcgZm9yIE9yYml0J3MgY2FwdGlvbi5cbi8vLyBAdHlwZSBOdW1iZXJcbiRvcmJpdC1jYXB0aW9uLXBhZGRpbmc6IDFyZW0gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGJhY2tncm91bmQgY29sb3IgZm9yIE9yYml0J3MgY29udHJvbHMgd2hlbiBob3ZlcmVkLlxuLy8vIEB0eXBlIENvbG9yXG4kb3JiaXQtY29udHJvbC1iYWNrZ3JvdW5kLWhvdmVyOiByZ2JhKCRibGFjaywgMC41KSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgcGFkZGluZyBmb3IgT3JiaXQncyBjb250cm9scy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRvcmJpdC1jb250cm9sLXBhZGRpbmc6IDFyZW0gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHotaW5kZXggZm9yIE9yYml0J3MgY29udHJvbHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kb3JiaXQtY29udHJvbC16aW5kZXg6IDEwICFkZWZhdWx0O1xuXG4vLy8gQWRkcyBzdHlsZXMgZm9yIHRoZSBvdXRlciBPcmJpdCB3cmFwcGVyLiBUaGVzZSBzdHlsZXMgYXJlIHVzZWQgb24gdGhlIGAub3JiaXRgIGNsYXNzLlxuQG1peGluIG9yYml0LXdyYXBwZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgdGhlIGlubmVyIE9yYml0IHNsaWRlIGNvbnRhaW5lci4gVGhlc2Ugc3R5bGVzIGFyZSB1c2VkIG9uIHRoZSBgLm9yYml0LWNvbnRhaW5lcmAgY2xhc3MuXG5AbWl4aW4gb3JiaXQtY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgdGhlIGluZGl2aWR1YWwgc2xpZGVzIG9mIGFuIE9yYml0IHNsaWRlci4gVGhlc2Ugc3R5bGVzIGFyZSB1c2VkIG9uIHRoZSBgLm9yYml0LXNsaWRlYCBjbGFzcy5cbkBtaXhpbiBvcmJpdC1zbGlkZSB7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xuXG4gICYubm8tbW90aW9udWkge1xuICAgICYuaXMtYWN0aXZlIHtcbiAgICAgIHRvcDogMDtcbiAgICAgIGxlZnQ6IDA7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBvcmJpdC1maWd1cmUge1xuICBtYXJnaW46IDA7XG59XG5cbkBtaXhpbiBvcmJpdC1pbWFnZSB7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbn1cblxuLy8vIEFkZHMgc3R5bGVzIGZvciBhbiBvcmJpdCBzbGlkZSBjYXB0aW9uLiBUaGVzZSBzdHlsZXMgYXJlIHVzZWQgb24gdGhlIGAub3JiaXQtY2FwdGlvbmAgY2xhc3MuXG5AbWl4aW4gb3JiaXQtY2FwdGlvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogJG9yYml0LWNhcHRpb24tcGFkZGluZztcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgY29sb3I6IGZvcmVncm91bmQoJG9yYml0LWNhcHRpb24tYmFja2dyb3VuZCk7XG4gIGJhY2tncm91bmQtY29sb3I6ICRvcmJpdC1jYXB0aW9uLWJhY2tncm91bmQ7XG59XG5cbi8vLyBBZGRzIGJhc2Ugc3R5bGVzIGZvciB0aGUgbmV4dC9wcmV2aW91cyBidXR0b25zIGluIGFuIE9yYml0IHNsaWRlci4gVGhlc2Ugc3R5bGVzIGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgYC5vcmJpdC1uZXh0YCBhbmQgYC5vcmJpdC1wcmV2aW91c2AgY2xhc3NlcyBpbiB0aGUgZGVmYXVsdCBDU1MuXG5AbWl4aW4gb3JiaXQtY29udHJvbCB7XG4gIEBpbmNsdWRlIGRpc2FibGUtbW91c2Utb3V0bGluZTtcbiAgQGluY2x1ZGUgdmVydGljYWwtY2VudGVyO1xuICB6LWluZGV4OiAkb3JiaXQtY29udHJvbC16aW5kZXg7XG4gIHBhZGRpbmc6ICRvcmJpdC1jb250cm9sLXBhZGRpbmc7XG4gIGNvbG9yOiAkd2hpdGU7XG5cbiAgJjpob3ZlcixcbiAgJjphY3RpdmUsXG4gICY6Zm9jdXMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRvcmJpdC1jb250cm9sLWJhY2tncm91bmQtaG92ZXI7XG4gIH1cbn1cblxuLy8vIEFkZHMgc3R5bGVzIGZvciB0aGUgT3JiaXQgcHJldmlvdXMgYnV0dG9uLiBUaGVzZSBzdHlsZXMgYXJlIHVzZWQgb24gdGhlIGAub3JiaXQtcHJldmlvdXNgIGNsYXNzLlxuQG1peGluIG9yYml0LXByZXZpb3VzIHtcbiAgI3skZ2xvYmFsLWxlZnR9OiAwO1xufVxuXG4vLy8gQWRkcyBzdHlsZXMgZm9yIHRoZSBPcmJpdCBuZXh0IGJ1dHRvbi4gVGhlc2Ugc3R5bGVzIGFyZSB1c2VkIG9uIHRoZSBgLm9yYml0LW5leHRgIGNsYXNzLlxuQG1peGluIG9yYml0LW5leHQge1xuICAjeyRnbG9iYWwtbGVmdH06IGF1dG87XG4gICN7JGdsb2JhbC1yaWdodH06IDA7XG59XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYSBjb250YWluZXIgb2YgT3JiaXQgYnVsbGV0cy4gLy8vIEFkZHMgc3R5bGVzIGZvciB0aGUgT3JiaXQgcHJldmlvdXMgYnV0dG9uLiBUaGVzZSBzdHlsZXMgYXJlIHVzZWQgb24gdGhlIGAub3JiaXQtYnVsbGV0c2AgY2xhc3MuXG5AbWl4aW4gb3JiaXQtYnVsbGV0cyB7XG4gIEBpbmNsdWRlIGRpc2FibGUtbW91c2Utb3V0bGluZTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tdG9wOiAkb3JiaXQtYnVsbGV0LW1hcmdpbi10b3A7XG4gIG1hcmdpbi1ib3R0b206ICRvcmJpdC1idWxsZXQtbWFyZ2luLWJvdHRvbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuXG4gIGJ1dHRvbiB7XG4gICAgd2lkdGg6ICRvcmJpdC1idWxsZXQtZGlhbWV0ZXI7XG4gICAgaGVpZ2h0OiAkb3JiaXQtYnVsbGV0LWRpYW1ldGVyO1xuICAgIG1hcmdpbjogJG9yYml0LWJ1bGxldC1tYXJnaW47XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJG9yYml0LWJ1bGxldC1iYWNrZ3JvdW5kO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcblxuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG9yYml0LWJ1bGxldC1iYWNrZ3JvdW5kLWFjdGl2ZTtcbiAgICB9XG5cbiAgICAmLmlzLWFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkb3JiaXQtYnVsbGV0LWJhY2tncm91bmQtYWN0aXZlO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1vcmJpdCB7XG4gIC5vcmJpdCB7XG4gICAgQGluY2x1ZGUgb3JiaXQtd3JhcHBlcjtcbiAgfVxuXG4gIC5vcmJpdC1jb250YWluZXIge1xuICAgIEBpbmNsdWRlIG9yYml0LWNvbnRhaW5lcjtcbiAgfVxuXG4gIC5vcmJpdC1zbGlkZSB7XG4gICAgQGluY2x1ZGUgb3JiaXQtc2xpZGU7XG4gIH1cblxuICAub3JiaXQtZmlndXJlIHtcbiAgICBAaW5jbHVkZSBvcmJpdC1maWd1cmU7XG4gIH1cblxuICAub3JiaXQtaW1hZ2Uge1xuICAgIEBpbmNsdWRlIG9yYml0LWltYWdlO1xuICB9XG5cbiAgLm9yYml0LWNhcHRpb24ge1xuICAgIEBpbmNsdWRlIG9yYml0LWNhcHRpb247XG4gIH1cblxuICAlb3JiaXQtY29udHJvbCB7XG4gICAgQGluY2x1ZGUgb3JiaXQtY29udHJvbDtcbiAgfVxuXG4gIC5vcmJpdC1wcmV2aW91cyB7XG4gICAgQGV4dGVuZCAlb3JiaXQtY29udHJvbDtcbiAgICBAaW5jbHVkZSBvcmJpdC1wcmV2aW91cztcbiAgfVxuXG4gIC5vcmJpdC1uZXh0IHtcbiAgICBAZXh0ZW5kICVvcmJpdC1jb250cm9sO1xuICAgIEBpbmNsdWRlIG9yYml0LW5leHQ7XG4gIH1cblxuICAub3JiaXQtYnVsbGV0cyB7XG4gICAgQGluY2x1ZGUgb3JiaXQtYnVsbGV0cztcbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgcGFnaW5hdGlvblxuLy8vL1xuXG4vLy8gRm9udCBzaXplIG9mIHBhZ2luYXRpb24gaXRlbXMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kcGFnaW5hdGlvbi1mb250LXNpemU6IHJlbS1jYWxjKDE0KSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgYm90dG9tIG1hcmdpbiBvZiB0aGUgbWVkaWEgb2JqZWN0LlxuLy8vIEB0eXBlIE51bWJlclxuJHBhZ2luYXRpb24tbWFyZ2luLWJvdHRvbTogJGdsb2JhbC1tYXJnaW4gIWRlZmF1bHQ7XG5cbi8vLyBUZXh0IGNvbG9yIG9mIHBhZ2luYXRpb24gaXRlbXMuXG4vLy8gQHR5cGUgQ29sb3JcbiRwYWdpbmF0aW9uLWl0ZW0tY29sb3I6ICRibGFjayAhZGVmYXVsdDtcblxuLy8vIFBhZGRpbmcgaW5zaWRlIG9mIHBhZ2luYXRpb24gaXRlbXMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kcGFnaW5hdGlvbi1pdGVtLXBhZGRpbmc6IHJlbS1jYWxjKDMgMTApICFkZWZhdWx0O1xuXG4vLy8gUmlnaHQgbWFyZ2luIHRvIHNlcGFyYXRlIHBhZ2luYXRpb24gaXRlbXMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kcGFnaW5hdGlvbi1pdGVtLXNwYWNpbmc6IHJlbS1jYWxjKDEpICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCByYWRpdXMgZm9yIHBhZ2luYXRpb24gaXRlbXMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kcGFnaW5hdGlvbi1yYWRpdXM6ICRnbG9iYWwtcmFkaXVzICFkZWZhdWx0O1xuXG4vLy8gQmFja2dyb3VuZCBjb2xvciBvZiBwYWdpbmF0aW9uIGl0ZW1zIG9uIGhvdmVyLlxuLy8vIEB0eXBlIENvbG9yXG4kcGFnaW5hdGlvbi1pdGVtLWJhY2tncm91bmQtaG92ZXI6ICRsaWdodC1ncmF5ICFkZWZhdWx0O1xuXG4vLy8gQmFja2dyb3VuZCBjb2xvciBvZiBwYWdpbmF0aW9uIGl0ZW0gZm9yIHRoZSBjdXJyZW50IHBhZ2UuXG4vLy8gQHR5cGUgQ29sb3JcbiRwYWdpbmF0aW9uLWl0ZW0tYmFja2dyb3VuZC1jdXJyZW50OiAkcHJpbWFyeS1jb2xvciAhZGVmYXVsdDtcblxuLy8vIFRleHQgY29sb3Igb2YgdGhlIHBhZ2luYXRpb24gaXRlbSBmb3IgdGhlIGN1cnJlbnQgcGFnZS5cbi8vLyBAdHlwZSBDb2xvclxuJHBhZ2luYXRpb24taXRlbS1jb2xvci1jdXJyZW50OiBmb3JlZ3JvdW5kKCRwYWdpbmF0aW9uLWl0ZW0tYmFja2dyb3VuZC1jdXJyZW50KSAhZGVmYXVsdDtcblxuLy8vIFRleHQgY29sb3Igb2YgYSBkaXNhYmxlZCBwYWdpbmF0aW9uIGl0ZW0uXG4vLy8gQHR5cGUgQ29sb3JcbiRwYWdpbmF0aW9uLWl0ZW0tY29sb3ItZGlzYWJsZWQ6ICRtZWRpdW0tZ3JheSAhZGVmYXVsdDtcblxuLy8vIENvbG9yIG9mIHRoZSBlbGxpcHNpcyBpbiBhIHBhZ2luYXRpb24gbWVudS5cbi8vLyBAdHlwZSBDb2xvclxuJHBhZ2luYXRpb24tZWxsaXBzaXMtY29sb3I6ICRibGFjayAhZGVmYXVsdDtcblxuLy8vIElmIGBmYWxzZWAsIGRvbid0IGRpc3BsYXkgcGFnZSBudW1iZXIgbGlua3Mgb24gbW9iaWxlLCBvbmx5IG5leHQvcHJldmlvdXMgbGlua3MuXG4vLy8gQHR5cGUgQm9vbGVhblxuJHBhZ2luYXRpb24tbW9iaWxlLWl0ZW1zOiBmYWxzZSAhZGVmYXVsdDtcblxuLy8vIElmIGB0cnVlYCwgYXJyb3dzIGFyZSBhZGRlZCB0byB0aGUgbmV4dCBhbmQgcHJldmlvdXMgbGlua3Mgb2YgcGFnaW5hdGlvbi5cbi8vLyBAdHlwZSBCb29sZWFuXG4kcGFnaW5hdGlvbi1hcnJvd3M6IHRydWUgIWRlZmF1bHQ7XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYSBwYWdpbmF0aW9uIGNvbnRhaW5lci4gQXBwbHkgdGhpcyB0byBhIGA8dWw+YC5cbkBtaXhpbiBwYWdpbmF0aW9uLWNvbnRhaW5lciB7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuICBtYXJnaW4tI3skZ2xvYmFsLWxlZnR9OiAwO1xuICBtYXJnaW4tYm90dG9tOiAkcGFnaW5hdGlvbi1tYXJnaW4tYm90dG9tO1xuXG4gIC8vIExpc3QgaXRlbVxuICBsaSB7XG4gICAgZm9udC1zaXplOiAkcGFnaW5hdGlvbi1mb250LXNpemU7XG4gICAgbWFyZ2luLSN7JGdsb2JhbC1yaWdodH06ICRwYWdpbmF0aW9uLWl0ZW0tc3BhY2luZztcbiAgICBib3JkZXItcmFkaXVzOiAkcGFnaW5hdGlvbi1yYWRpdXM7XG5cbiAgICBAaWYgJHBhZ2luYXRpb24tbW9iaWxlLWl0ZW1zIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gICAgQGVsc2Uge1xuICAgICAgZGlzcGxheTogbm9uZTtcblxuICAgICAgJjpsYXN0LWNoaWxkLFxuICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIH1cblxuICAgICAgQGluY2x1ZGUgYnJlYWtwb2ludChtZWRpdW0pIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFBhZ2UgbGlua3NcbiAgYSxcbiAgYnV0dG9uIHtcbiAgICBjb2xvcjogJHBhZ2luYXRpb24taXRlbS1jb2xvcjtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwYWRkaW5nOiAkcGFnaW5hdGlvbi1pdGVtLXBhZGRpbmc7XG4gICAgYm9yZGVyLXJhZGl1czogJGdsb2JhbC1yYWRpdXM7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICRwYWdpbmF0aW9uLWl0ZW0tYmFja2dyb3VuZC1ob3ZlcjtcbiAgICB9XG4gIH1cbn1cblxuLy8vIEFkZHMgc3R5bGVzIGZvciB0aGUgY3VycmVudCBwYWdpbmF0aW9uIGl0ZW0uIEFwcGx5IHRoaXMgdG8gYW4gYDxhPmAuXG5AbWl4aW4gcGFnaW5hdGlvbi1pdGVtLWN1cnJlbnQge1xuICBwYWRkaW5nOiAkcGFnaW5hdGlvbi1pdGVtLXBhZGRpbmc7XG4gIGJhY2tncm91bmQ6ICRwYWdpbmF0aW9uLWl0ZW0tYmFja2dyb3VuZC1jdXJyZW50O1xuICBjb2xvcjogJHBhZ2luYXRpb24taXRlbS1jb2xvci1jdXJyZW50O1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYSBkaXNhYmxlZCBwYWdpbmF0aW9uIGl0ZW0uIEFwcGx5IHRoaXMgdG8gYW4gYDxhPmAuXG5AbWl4aW4gcGFnaW5hdGlvbi1pdGVtLWRpc2FibGVkIHtcbiAgcGFkZGluZzogJHBhZ2luYXRpb24taXRlbS1wYWRkaW5nO1xuICBjb2xvcjogJHBhZ2luYXRpb24taXRlbS1jb2xvci1kaXNhYmxlZDtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuXG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICB9XG59XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYW4gZWxsaXBzaXMgZm9yIHVzZSBpbiBhIHBhZ2luYXRpb24gbGlzdC5cbkBtaXhpbiBwYWdpbmF0aW9uLWVsbGlwc2lzIHtcbiAgY29udGVudDogJ+KApic7XG4gIHBhZGRpbmc6ICRwYWdpbmF0aW9uLWl0ZW0tcGFkZGluZztcbiAgY29sb3I6ICRwYWdpbmF0aW9uLWVsbGlwc2lzLWNvbG9yO1xufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1wYWdpbmF0aW9uIHtcbiAgLnBhZ2luYXRpb24ge1xuICAgIEBpbmNsdWRlIHBhZ2luYXRpb24tY29udGFpbmVyO1xuXG4gICAgLmN1cnJlbnQge1xuICAgICAgQGluY2x1ZGUgcGFnaW5hdGlvbi1pdGVtLWN1cnJlbnQ7XG4gICAgfVxuXG4gICAgLmRpc2FibGVkIHtcbiAgICAgIEBpbmNsdWRlIHBhZ2luYXRpb24taXRlbS1kaXNhYmxlZDtcbiAgICB9XG5cbiAgICAuZWxsaXBzaXM6OmFmdGVyIHtcbiAgICAgIEBpbmNsdWRlIHBhZ2luYXRpb24tZWxsaXBzaXM7XG4gICAgfVxuICB9XG5cbiAgQGlmICRwYWdpbmF0aW9uLWFycm93cyB7XG4gICAgLnBhZ2luYXRpb24tcHJldmlvdXMgYTo6YmVmb3JlLFxuICAgIC5wYWdpbmF0aW9uLXByZXZpb3VzLmRpc2FibGVkOjpiZWZvcmUge1xuICAgICAgY29udGVudDogJ8KrJztcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIG1hcmdpbi0jeyRnbG9iYWwtcmlnaHR9OiAwLjVyZW07XG4gICAgfVxuXG4gICAgLnBhZ2luYXRpb24tbmV4dCBhOjphZnRlcixcbiAgICAucGFnaW5hdGlvbi1uZXh0LmRpc2FibGVkOjphZnRlciB7XG4gICAgICBjb250ZW50OiAnwrsnO1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgbWFyZ2luLSN7JGdsb2JhbC1sZWZ0fTogMC41cmVtO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgcHJvZ3Jlc3MtYmFyXG4vLy8vXG5cbi8vLyBIZWlnaHQgb2YgYSBwcm9ncmVzcyBiYXIuXG4vLy8gQHR5cGUgTnVtYmVyXG4kcHJvZ3Jlc3MtaGVpZ2h0OiAxcmVtICFkZWZhdWx0O1xuXG4vLy8gQmFja2dyb3VuZCBjb2xvciBvZiBhIHByb2dyZXNzIGJhci5cbi8vLyBAdHlwZSBDb2xvclxuJHByb2dyZXNzLWJhY2tncm91bmQ6ICRtZWRpdW0tZ3JheSAhZGVmYXVsdDtcblxuLy8vIEJvdHRvbSBtYXJnaW4gb2YgYSBwcm9ncmVzcyBiYXIuXG4vLy8gQHR5cGUgTnVtYmVyXG4kcHJvZ3Jlc3MtbWFyZ2luLWJvdHRvbTogJGdsb2JhbC1tYXJnaW4gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGNvbG9yIG9mIGEgcHJvZ3Jlc3MgYmFyJ3MgbWV0ZXIuXG4vLy8gQHR5cGUgQ29sb3JcbiRwcm9ncmVzcy1tZXRlci1iYWNrZ3JvdW5kOiAkcHJpbWFyeS1jb2xvciAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgcmFkaXVzIG9mIGEgcHJvZ3Jlc3MgYmFyLlxuLy8vIEB0eXBlIE51bWJlclxuJHByb2dyZXNzLXJhZGl1czogJGdsb2JhbC1yYWRpdXMgIWRlZmF1bHQ7XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYSBwcm9ncmVzcyBiYXIgY29udGFpbmVyLlxuQG1peGluIHByb2dyZXNzLWNvbnRhaW5lciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICRwcm9ncmVzcy1iYWNrZ3JvdW5kO1xuICBoZWlnaHQ6ICRwcm9ncmVzcy1oZWlnaHQ7XG4gIG1hcmdpbi1ib3R0b206ICRwcm9ncmVzcy1tYXJnaW4tYm90dG9tO1xuICBib3JkZXItcmFkaXVzOiAkcHJvZ3Jlc3MtcmFkaXVzO1xufVxuXG4vLy8gQWRkcyBzdHlsZXMgZm9yIHRoZSBpbm5lciBtZXRlciBvZiBhIHByb2dyZXNzIGJhci5cbkBtaXhpbiBwcm9ncmVzcy1tZXRlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtbWV0ZXItYmFja2dyb3VuZDtcblxuICBAaWYgaGFzLXZhbHVlKCRwcm9ncmVzcy1yYWRpdXMpIHtcbiAgICBib3JkZXItcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cztcbiAgfVxufVxuXG4vLy8gQWRkcyBzdHlsZXMgZm9yIHRleHQgaW4gdGhlIHByb2dyZXNzIG1ldGVyLlxuQG1peGluIHByb2dyZXNzLW1ldGVyLXRleHQge1xuICBAaW5jbHVkZSBhYnNvbHV0ZS1jZW50ZXI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogJHdoaXRlO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gIEBpZiBoYXMtdmFsdWUoJHByb2dyZXNzLXJhZGl1cykge1xuICAgIGJvcmRlci1yYWRpdXM6ICRwcm9ncmVzcy1yYWRpdXM7XG4gIH1cbn1cblxuQG1peGluIGZvdW5kYXRpb24tcHJvZ3Jlc3MtYmFyIHtcbiAgLy8gUHJvZ3Jlc3MgYmFyXG4gIC5wcm9ncmVzcyB7XG4gICAgQGluY2x1ZGUgcHJvZ3Jlc3MtY29udGFpbmVyO1xuXG4gICAgQGVhY2ggJG5hbWUsICRjb2xvciBpbiAkZm91bmRhdGlvbi1jb2xvcnMge1xuICAgICAgJi4jeyRuYW1lfSB7XG4gICAgICAgIC5wcm9ncmVzcy1tZXRlciB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGNvbG9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSW5uZXIgbWV0ZXJcbiAgLnByb2dyZXNzLW1ldGVyIHtcbiAgICBAaW5jbHVkZSBwcm9ncmVzcy1tZXRlcjtcbiAgfVxuXG4gIC8vIElubmVyIG1ldGVyIHRleHRcbiAgLnByb2dyZXNzLW1ldGVyLXRleHQge1xuICAgIEBpbmNsdWRlIHByb2dyZXNzLW1ldGVyLXRleHQ7XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLyBbVE9ET10gQ2hlY2sgaG93IHBsdWdpbiBjb25maXJtcyBkaXNhYmxlZCBvciB2ZXJ0aWNhbCBzdGF0dXNcbi8vIFtUT0RPXSBDaGVjayBpZiB0cmFuc2l0aW9uOiBhbGw7IGlzIG5lY2Vzc2FyeVxuXG4vLy8vXG4vLy8gQGdyb3VwIHNsaWRlclxuLy8vL1xuXG4vLy8gRGVmYXVsdCBoZWlnaHQgb2YgdGhlIHNsaWRlci5cbi8vLyBAdHlwZSBOdW1iZXJcbiRzbGlkZXItaGVpZ2h0OiAwLjVyZW0gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHNsaWRlciB3aWR0aCBvZiBhIHZlcnRpY2FsIHNsaWRlci5cbi8vLyBAdHlwZSBOdW1iZXJcbiRzbGlkZXItd2lkdGgtdmVydGljYWw6ICRzbGlkZXItaGVpZ2h0ICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzbGlkZXIncyB0cmFjay5cbi8vLyBAdHlwZSBDb2xvclxuJHNsaWRlci1iYWNrZ3JvdW5kOiAkbGlnaHQtZ3JheSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgY29sb3Igb2YgdGhlIGFjdGl2ZSBmaWxsIGNvbG9yIG9mIHRoZSBzbGlkZXIuXG4vLy8gQHR5cGUgQ29sb3JcbiRzbGlkZXItZmlsbC1iYWNrZ3JvdW5kOiAkbWVkaXVtLWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGhlaWdodCBvZiB0aGUgaGFuZGxlIG9mIHRoZSBzbGlkZXIuXG4vLy8gQHR5cGUgTnVtYmVyXG4kc2xpZGVyLWhhbmRsZS1oZWlnaHQ6IDEuNHJlbSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgd2lkdGggb2YgdGhlIGhhbmRsZSBvZiB0aGUgc2xpZGVyLlxuLy8vIEB0eXBlIE51bWJlclxuJHNsaWRlci1oYW5kbGUtd2lkdGg6IDEuNHJlbSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgY29sb3Igb2YgdGhlIGhhbmRsZSBmb3IgdGhlIHNsaWRlci5cbi8vLyBAdHlwZSBDb2xvclxuJHNsaWRlci1oYW5kbGUtYmFja2dyb3VuZDogJHByaW1hcnktY29sb3IgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGZhZGUgYW1vdW50IG9mIGEgZGlzYWJsZWQgc2xpZGVyLlxuLy8vIEB0eXBlIE51bWJlclxuJHNsaWRlci1vcGFjaXR5LWRpc2FibGVkOiAwLjI1ICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCByYWRpdXMgZm9yIHNsaWRlci5cbi8vLyBAdHlwZSBOdW1iZXJcbiRzbGlkZXItcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cyAhZGVmYXVsdDtcblxuLy8vIFRyYW5zaXRpb24gcHJvcGVydGllcyB0byBhcHBseSB0byB0aGUgc2xpZGVyIGhhbmRsZSBhbmQgZmlsbC5cbi8vLyBAdHlwZSBUcmFuc2l0aW9uXG4kc2xpZGVyLXRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0ICFkZWZhdWx0O1xuXG4vLy8gQWRkcyB0aGUgZ2VuZXJhbCBzdHlsZXMgZm9yIHNsaWRlcnMuXG5AbWl4aW4gc2xpZGVyLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiAkc2xpZGVyLWhlaWdodDtcbiAgbWFyZ2luLXRvcDogMS4yNXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMi4yNXJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHNsaWRlci1iYWNrZ3JvdW5kO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHVzZXItc2VsZWN0OiBub25lO1xuICB0b3VjaC1hY3Rpb246IG5vbmU7XG59XG5cbi8vLyBBZGRzIHRoZSBnZW5lcmFsIHN0eWxlcyBmb3IgYWN0aXZlIGZpbGwgZm9yIHNsaWRlcnMuXG5AbWl4aW4gc2xpZGVyLWZpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogJHNsaWRlci1oZWlnaHQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICRzbGlkZXItZmlsbC1iYWNrZ3JvdW5kO1xuICB0cmFuc2l0aW9uOiAkc2xpZGVyLXRyYW5zaXRpb247XG5cbiAgJi5pcy1kcmFnZ2luZyB7XG4gICAgdHJhbnNpdGlvbjogYWxsIDBzIGxpbmVhcjtcbiAgfVxufVxuXG4vLy8gQWRkcyB0aGUgZ2VuZXJhbCBzdHlsZXMgZm9yIHRoZSBzbGlkZXIgaGFuZGxlcy5cbkBtaXhpbiBzbGlkZXItaGFuZGxlIHtcbiAgQGluY2x1ZGUgZGlzYWJsZS1tb3VzZS1vdXRsaW5lO1xuICBAaW5jbHVkZSB2ZXJ0aWNhbC1jZW50ZXI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogJHNsaWRlci1oYW5kbGUtd2lkdGg7XG4gIGhlaWdodDogJHNsaWRlci1oYW5kbGUtaGVpZ2h0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkc2xpZGVyLWhhbmRsZS1iYWNrZ3JvdW5kO1xuICB0cmFuc2l0aW9uOiAkc2xpZGVyLXRyYW5zaXRpb247XG4gIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uO1xuICBib3JkZXItcmFkaXVzOiAkc2xpZGVyLXJhZGl1cztcblxuICAmOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBzY2FsZS1jb2xvcigkc2xpZGVyLWhhbmRsZS1iYWNrZ3JvdW5kLCAkbGlnaHRuZXNzOiAtMTUlKTtcbiAgfVxuXG4gICYuaXMtZHJhZ2dpbmcge1xuICAgIHRyYW5zaXRpb246IGFsbCAwcyBsaW5lYXI7XG4gIH1cbn1cblxuQG1peGluIHNsaWRlci1kaXNhYmxlZCB7XG4gIG9wYWNpdHk6ICRzbGlkZXItb3BhY2l0eS1kaXNhYmxlZDtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuQG1peGluIHNsaWRlci12ZXJ0aWNhbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6ICRzbGlkZXItd2lkdGgtdmVydGljYWw7XG4gIGhlaWdodDogMTIuNXJlbTtcbiAgbWFyZ2luOiAwIDEuMjVyZW07XG4gIHRyYW5zZm9ybTogc2NhbGUoMSwgLTEpO1xuXG4gIC5zbGlkZXItZmlsbCB7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAkc2xpZGVyLXdpZHRoLXZlcnRpY2FsO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gIH1cblxuICAuc2xpZGVyLWhhbmRsZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgd2lkdGg6ICRzbGlkZXItaGFuZGxlLWhlaWdodDtcbiAgICBoZWlnaHQ6ICRzbGlkZXItaGFuZGxlLXdpZHRoO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgfVxufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1zbGlkZXIge1xuICAvLyBDb250YWluZXJcbiAgLnNsaWRlciB7XG4gICAgQGluY2x1ZGUgc2xpZGVyLWNvbnRhaW5lcjtcbiAgfVxuXG4gIC8vIEZpbGwgYXJlYVxuICAuc2xpZGVyLWZpbGwge1xuICAgIEBpbmNsdWRlIHNsaWRlci1maWxsO1xuICB9XG5cbiAgLy8gRHJhZ2dhYmxlIGhhbmRsZVxuICAuc2xpZGVyLWhhbmRsZSB7XG4gICAgQGluY2x1ZGUgc2xpZGVyLWhhbmRsZTtcbiAgfVxuXG4gIC8vIERpc2FibGVkIHN0YXRlXG4gIC5zbGlkZXIuZGlzYWJsZWQsXG4gIC5zbGlkZXJbZGlzYWJsZWRdIHtcbiAgICBAaW5jbHVkZSBzbGlkZXItZGlzYWJsZWQ7XG4gIH1cblxuICAvLyBWZXJ0aWNhbCBzbGlkZXJcbiAgLnNsaWRlci52ZXJ0aWNhbCB7XG4gICAgQGluY2x1ZGUgc2xpZGVyLXZlcnRpY2FsO1xuICB9XG5cbiAgLy8gUlRMIHN1cHBvcnRcbiAgQGlmICRnbG9iYWwtdGV4dC1kaXJlY3Rpb24gPT0gcnRsIHtcbiAgICAuc2xpZGVyOm5vdCgudmVydGljYWwpIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGUoLTEsIDEpO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbkBtaXhpbiBmb3VuZGF0aW9uLXN0aWNreSB7XG4gIC5zdGlja3ktY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cblxuICAuc3RpY2t5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICB9XG5cbiAgLnN0aWNreS5pcy1zdHVjayB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHotaW5kZXg6IDU7XG5cbiAgICAmLmlzLWF0LXRvcCB7XG4gICAgICB0b3A6IDA7XG4gICAgfVxuXG4gICAgJi5pcy1hdC1ib3R0b20ge1xuICAgICAgYm90dG9tOiAwO1xuICAgIH1cbiAgfVxuXG4gIC5zdGlja3kuaXMtYW5jaG9yZWQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiBhdXRvO1xuICAgIHJpZ2h0OiBhdXRvO1xuXG4gICAgJi5pcy1hdC1ib3R0b20ge1xuICAgICAgYm90dG9tOiAwO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgcmV2ZWFsXG4vLy8vXG5cbi8vLyBEZWZhdWx0IGJhY2tncm91bmQgY29sb3Igb2YgYSBtb2RhbC5cbi8vLyBAdHlwZSBDb2xvclxuJHJldmVhbC1iYWNrZ3JvdW5kOiAkd2hpdGUgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHdpZHRoIG9mIGEgbW9kYWwsIHdpdGggbm8gY2xhc3MgYXBwbGllZC5cbi8vLyBAdHlwZSBOdW1iZXJcbiRyZXZlYWwtd2lkdGg6IDYwMHB4ICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBtYXhpbXVtIHdpZHRoIG9mIGEgbW9kYWwuXG4vLy8gQHR5cGUgTnVtYmVyXG4kcmV2ZWFsLW1heC13aWR0aDogJGdsb2JhbC13aWR0aCAhZGVmYXVsdDtcblxuLy8vIE9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIHdpbmRvdyB3aGVuIGEgbW9kYWwgaXMgYWRkZWQuXG4vLy8gQHR5cGUgTnVtYmVyXG4kcmV2ZWFsLW9mZnNldDogcmVtLWNhbGMoMTAwKSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgcGFkZGluZyBpbnNpZGUgYSBtb2RhbC5cbi8vLyBAdHlwZSBOdW1iZXJcbiRyZXZlYWwtcGFkZGluZzogJGdsb2JhbC1wYWRkaW5nICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBib3JkZXIgYXJvdW5kIGEgbW9kYWwuXG4vLy8gQHR5cGUgTnVtYmVyXG4kcmV2ZWFsLWJvcmRlcjogMXB4IHNvbGlkICRtZWRpdW0tZ3JheSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgcmFkaXVzIGZvciBtb2RhbC5cbi8vLyBAdHlwZSBOdW1iZXJcbiRyZXZlYWwtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cyAhZGVmYXVsdDtcblxuLy8vIHotaW5kZXggZm9yIG1vZGFscy4gVGhlIG92ZXJsYXkgdXNlcyB0aGlzIHZhbHVlLCB3aGlsZSB0aGUgbW9kYWwgaXRzZWxmIHVzZXMgdGhpcyB2YWx1ZSBwbHVzIG9uZS5cbi8vLyBAdHlwZSBOdW1iZXJcbiRyZXZlYWwtemluZGV4OiAxMDA1ICFkZWZhdWx0O1xuXG4vLy8gQmFja2dyb3VuZCBjb2xvciBvZiBtb2RhbCBvdmVybGF5cy5cbi8vLyBAdHlwZSBDb2xvclxuJHJldmVhbC1vdmVybGF5LWJhY2tncm91bmQ6IHJnYmEoJGJsYWNrLCAwLjQ1KSAhZGVmYXVsdDtcblxuLy8vIEFkZHMgc3R5bGVzIGZvciBhIG1vZGFsIG92ZXJsYXkuXG4vLy8gQHBhcmFtIHtDb2xvcn0gJGJhY2tncm91bmQgWyRyZXZlYWwtb3ZlcmxheS1iYWNrZ3JvdW5kXSAtIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIG92ZXJsYXkuXG5AbWl4aW4gcmV2ZWFsLW92ZXJsYXkge1xuICBkaXNwbGF5OiBub25lO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiAwO1xuICByaWdodDogMDtcbiAgei1pbmRleDogJHJldmVhbC16aW5kZXg7XG4gIGJhY2tncm91bmQtY29sb3I6ICRyZXZlYWwtb3ZlcmxheS1iYWNrZ3JvdW5kO1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG5cbi8vLyBBZGRzIGJhc2Ugc3R5bGVzIGZvciBhIG1vZGFsLlxuQG1peGluIHJldmVhbC1tb2RhbC1iYXNlIHtcbiAgQGluY2x1ZGUgZGlzYWJsZS1tb3VzZS1vdXRsaW5lO1xuICBkaXNwbGF5OiBub25lO1xuICB6LWluZGV4OiAkcmV2ZWFsLXppbmRleCArIDE7XG4gIHBhZGRpbmc6ICRyZXZlYWwtcGFkZGluZztcbiAgYm9yZGVyOiAkcmV2ZWFsLWJvcmRlcjtcbiAgbWFyZ2luOiAkcmV2ZWFsLW9mZnNldCBhdXRvIDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICRyZXZlYWwtYmFja2dyb3VuZDtcbiAgYm9yZGVyLXJhZGl1czogJHJldmVhbC1yYWRpdXM7XG5cbiAgQGluY2x1ZGUgYnJlYWtwb2ludChtZWRpdW0pIHtcbiAgICBtaW4taGVpZ2h0OiAwO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIHJvd3MgZG9uJ3QgaGF2ZSBhIG1pbi13aWR0aCBvbiB0aGVtXG4gIC5jb2x1bW4sXG4gIC5jb2x1bW5zIHtcbiAgICBtaW4td2lkdGg6IDA7XG4gIH1cblxuICAvLyBTdHJpcCBtYXJnaW5zIGZyb20gdGhlIGxhc3QgaXRlbSBpbiB0aGUgbW9kYWxcbiAgPiA6bGFzdC1jaGlsZCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxufVxuXG4vLy8gQWRqdXN0cyB0aGUgd2lkdGggb2YgYSBtb2RhbC5cbi8vLyBAcGFyYW0ge051bWJlcn0gJHdpZHRoIC0gV2lkdGggb2YgdGhlIG1vZGFsLiBHZW5lcmFsbHkgYSBwZXJjZW50YWdlLlxuLy8vIEBwYXJhbSB7TnVtYmVyfSAkbWF4LXdpZHRoIFskcmV2ZWFsLW1heC13aWR0aF0gLSBNYXhpbXVtIHdpZHRoIG9mIHRoZSBtb2RhbC5cbkBtaXhpbiByZXZlYWwtbW9kYWwtd2lkdGgoXG4gICR3aWR0aDogJHJldmVhbC13aWR0aCxcbiAgJG1heC13aWR0aDogJHJldmVhbC1tYXgtd2lkdGhcbikge1xuICBAaW5jbHVkZSBicmVha3BvaW50KG1lZGl1bSkge1xuICAgIEBleHRlbmQgJXJldmVhbC1jZW50ZXJlZDtcbiAgICB3aWR0aDogJHdpZHRoO1xuICAgIG1heC13aWR0aDogJHJldmVhbC1tYXgtd2lkdGg7XG4gIH1cbn1cblxuLy8vIENyZWF0ZXMgYSBmdWxsLXNjcmVlbiBtb2RhbCwgd2hpY2ggc3RyZXRjaGVzIHRoZSBmdWxsIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbkBtaXhpbiByZXZlYWwtbW9kYWwtZnVsbHNjcmVlbiB7XG4gIC8vIHNjc3MtbGludDpkaXNhYmxlIER1cGxpY2F0ZVByb3BlcnR5XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgaGVpZ2h0OiAxMDB2aDtcbiAgbWluLWhlaWdodDogMTAwdmg7XG4gIG1heC13aWR0aDogbm9uZTtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIGJvcmRlcjogMDtcbn1cblxuQG1peGluIGZvdW5kYXRpb24tcmV2ZWFsIHtcbiAgLy8gW1RPRE9dIElzIHRoaXMgbmVjZXNzYXJ5P1xuICAvLyBzY3NzLWxpbnQ6ZGlzYWJsZSBRdWFsaWZ5aW5nRWxlbWVudFxuICBib2R5LmlzLXJldmVhbC1vcGVuIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG5cbiAgLy8gT3ZlcmxheVxuICAucmV2ZWFsLW92ZXJsYXkge1xuICAgIEBpbmNsdWRlIHJldmVhbC1vdmVybGF5O1xuICB9XG5cbiAgLy8gTW9kYWwgY29udGFpbmVyXG4gIC5yZXZlYWwge1xuICAgIEBpbmNsdWRlIHJldmVhbC1tb2RhbC1iYXNlO1xuICAgIEBpbmNsdWRlIHJldmVhbC1tb2RhbC13aWR0aCgkcmV2ZWFsLXdpZHRoKTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcblxuICAgIC8vIFBsYWNlaG9sZGVyIHNlbGVjdG9yIGZvciBtZWRpdW0tYW5kLXVwIG1vZGFsc1xuICAgIC8vIFByZXZlbnRzIGR1cGxpY2F0ZSBDU1Mgd2hlbiBkZWZpbmluZyBtdWx0aXBsZSBSZXZlYWwgc2l6ZXNcbiAgICBAaW5jbHVkZSBicmVha3BvaW50KG1lZGl1bSkge1xuICAgICAgJXJldmVhbC1jZW50ZXJlZCB7XG4gICAgICAgIGxlZnQ6IGF1dG87XG4gICAgICAgIHJpZ2h0OiBhdXRvO1xuICAgICAgICBtYXJnaW46IDAgYXV0bztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgcGFkZGluZ1xuICAgICYuY29sbGFwc2Uge1xuICAgICAgcGFkZGluZzogMDtcbiAgICB9XG5cbiAgICAvLyBTaXppbmcgY2xhc3Nlc1xuICAgICYudGlueSAgeyBAaW5jbHVkZSByZXZlYWwtbW9kYWwtd2lkdGgoMzAlKTsgfVxuICAgICYuc21hbGwgeyBAaW5jbHVkZSByZXZlYWwtbW9kYWwtd2lkdGgoNTAlKTsgfVxuICAgICYubGFyZ2UgeyBAaW5jbHVkZSByZXZlYWwtbW9kYWwtd2lkdGgoOTAlKTsgfVxuXG4gICAgLy8gRnVsbC1zY3JlZW4gbW9kZVxuICAgICYuZnVsbCB7XG4gICAgICBAaW5jbHVkZSByZXZlYWwtbW9kYWwtZnVsbHNjcmVlbjtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIHN3aXRjaFxuLy8vL1xuXG4vLy8gQmFja2dyb3VuZCBjb2xvciBvZiBhIHN3aXRjaC5cbi8vLyBAdHlwZSBDb2xvclxuJHN3aXRjaC1iYWNrZ3JvdW5kOiAkbWVkaXVtLWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBCYWNrZ3JvdW5kIGFjdGl2ZSBjb2xvciBvZiBhIHN3aXRjaC5cbi8vLyBAdHlwZSBDb2xvclxuJHN3aXRjaC1iYWNrZ3JvdW5kLWFjdGl2ZTogJHByaW1hcnktY29sb3IgIWRlZmF1bHQ7XG5cbi8vLyBIZWlnaHQgb2YgYSBzd2l0Y2gsIHdpdGggbm8gY2xhc3MgYXBwbGllZC5cbi8vLyBAdHlwZSBOdW1iZXJcbiRzd2l0Y2gtaGVpZ2h0OiAycmVtICFkZWZhdWx0O1xuXG4vLy8gSGVpZ2h0IG9mIGEgc3dpdGNoIHdpdGggLnRpbnkgY2xhc3MuXG4vLy8gQHR5cGUgTnVtYmVyXG4kc3dpdGNoLWhlaWdodC10aW55OiAxLjVyZW0gIWRlZmF1bHQ7XG5cbi8vLyBIZWlnaHQgb2YgYSBzd2l0Y2ggd2l0aCAuc21hbGwgY2xhc3MuXG4vLy8gQHR5cGUgTnVtYmVyXG4kc3dpdGNoLWhlaWdodC1zbWFsbDogMS43NXJlbSAhZGVmYXVsdDtcblxuLy8vIEhlaWdodCBvZiBhIHN3aXRjaCB3aXRoIC5sYXJnZSBjbGFzcy5cbi8vLyBAdHlwZSBOdW1iZXJcbiRzd2l0Y2gtaGVpZ2h0LWxhcmdlOiAyLjVyZW0gIWRlZmF1bHQ7XG5cbi8vLyBCb3JkZXIgcmFkaXVzIG9mIHRoZSBzd2l0Y2hcbi8vLyBAdHlwZSBOdW1iZXJcbiRzd2l0Y2gtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cyAhZGVmYXVsdDtcblxuLy8vIGJvcmRlciBhcm91bmQgYSBtb2RhbC5cbi8vLyBAdHlwZSBOdW1iZXJcbiRzd2l0Y2gtbWFyZ2luOiAkZ2xvYmFsLW1hcmdpbiAhZGVmYXVsdDtcblxuLy8vIEJhY2tncm91bmQgY29sb3IgZm9yIHRoZSBzd2l0Y2ggY29udGFpbmVyIGFuZCBwYWRkbGUuXG4vLy8gQHR5cGUgQ29sb3JcbiRzd2l0Y2gtcGFkZGxlLWJhY2tncm91bmQ6ICR3aGl0ZSAhZGVmYXVsdDtcblxuLy8vIFNwYWNpbmcgYmV0d2VlbiBhIHN3aXRjaCBwYWRkbGUgYW5kIHRoZSBlZGdlIG9mIHRoZSBib2R5LlxuLy8vIEB0eXBlIE51bWJlclxuJHN3aXRjaC1wYWRkbGUtb2Zmc2V0OiAwLjI1cmVtICFkZWZhdWx0O1xuXG4vLy8gYm9yZGVyIHJhZGl1cyBvZiB0aGUgc3dpdGNoIHBhZGRsZVxuLy8vIEB0eXBlIE51bWJlclxuJHN3aXRjaC1wYWRkbGUtcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cyAhZGVmYXVsdDtcblxuLy8vIHN3aXRjaCB0cmFuc2l0aW9uLlxuLy8vIEB0eXBlIE51bWJlclxuJHN3aXRjaC1wYWRkbGUtdHJhbnNpdGlvbjogYWxsIDAuMjVzIGVhc2Utb3V0ICFkZWZhdWx0O1xuXG4vLyBtYWtlIHRoZW0gdmFyaWFibGVzXG4vLyBhc2sgYWJvdXQgYWNjZXNzaWJpbGl0eSBvbiBsYWJlbFxuLy8gY2hhbmdlIGNsYXNzIG5hbWUgZm9yIHRleHRcblxuLy8vIEFkZHMgc3R5bGVzIGZvciBhIHN3aXRjaCBjb250YWluZXIuIEFwcGx5IHRoaXMgdG8gYSBjb250YWluZXIgY2xhc3MuXG5AbWl4aW4gc3dpdGNoLWNvbnRhaW5lciB7XG4gIG1hcmdpbi1ib3R0b206ICRzd2l0Y2gtbWFyZ2luO1xuICBvdXRsaW5lOiAwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xuXG4gIC8vIFRoZXNlIHByb3BlcnRpZXMgY2FzY2FkZSBkb3duIHRvIHRoZSBzd2l0Y2ggdGV4dFxuICBjb2xvcjogJHdoaXRlO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZm9udC1zaXplOiByZW0tY2FsYygxNCk7XG59XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYSBzd2l0Y2ggaW5wdXQuIEFwcGx5IHRoaXMgdG8gYW4gYDxpbnB1dD5gIHdpdGhpbiBhIHN3aXRjaC5cbkBtaXhpbiBzd2l0Y2gtaW5wdXQge1xuICBvcGFjaXR5OiAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgdGhlIGJhY2tncm91bmQgYW5kIHBhZGRsZSBvZiBhIHN3aXRjaC4gQXBwbHkgdGhpcyB0byBhIGA8bGFiZWw+YCB3aXRoaW4gYSBzd2l0Y2guXG5AbWl4aW4gc3dpdGNoLXBhZGRsZSB7XG4gIGJhY2tncm91bmQ6ICRzd2l0Y2gtYmFja2dyb3VuZDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogNHJlbTtcbiAgaGVpZ2h0OiAkc3dpdGNoLWhlaWdodDtcbiAgdHJhbnNpdGlvbjogJHN3aXRjaC1wYWRkbGUtdHJhbnNpdGlvbjtcbiAgYm9yZGVyLXJhZGl1czogJHN3aXRjaC1yYWRpdXM7XG5cbiAgLy8gUmVzZXR0aW5nIHRoZXNlIDxsYWJlbD4gcHJlc2V0cyBzbyB0eXBlIHN0eWxlcyBjYXNjYWRlIGRvd25cbiAgY29sb3I6IGluaGVyaXQ7XG4gIGZvbnQtd2VpZ2h0OiBpbmhlcml0O1xuXG4gIC8vIE5lZWRlZCB0byBvdmVycmlkZSBzcGVjaWZpY2l0eVxuICBpbnB1dCArICYge1xuICAgIG1hcmdpbjogMDtcbiAgfVxuXG4gIC8vIFRoZSBwYWRkbGUgaXRzZWxmXG4gICY6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kOiAkc3dpdGNoLXBhZGRsZS1iYWNrZ3JvdW5kO1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBoZWlnaHQ6IDEuNXJlbTtcbiAgICAjeyRnbG9iYWwtbGVmdH06IDAuMjVyZW07XG4gICAgdG9wOiAwLjI1cmVtO1xuICAgIHdpZHRoOiAxLjVyZW07XG4gICAgdHJhbnNpdGlvbjogJHN3aXRjaC1wYWRkbGUtdHJhbnNpdGlvbjtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgIGJvcmRlci1yYWRpdXM6ICRzd2l0Y2gtcGFkZGxlLXJhZGl1cztcbiAgfVxuXG4gIC8vIENoYW5nZSB0aGUgdmlzdWFsIHN0eWxlIHdoZW4gdGhlIHN3aXRjaCBpcyBhY3RpdmVcbiAgaW5wdXQ6Y2hlY2tlZCB+ICYge1xuICAgIGJhY2tncm91bmQ6ICRzd2l0Y2gtYmFja2dyb3VuZC1hY3RpdmU7XG5cbiAgICAmOjphZnRlciB7XG4gICAgICAjeyRnbG9iYWwtbGVmdH06IDIuMjVyZW07XG4gICAgfVxuICB9XG5cbiAgaW5wdXQ6Zm9jdXMgfiAmIHtcbiAgICBAaW5jbHVkZSBkaXNhYmxlLW1vdXNlLW91dGxpbmU7XG4gIH1cbn1cblxuLy8vIEFkZHMgYmFzZSBzdHlsZXMgZm9yIGFjdGl2ZS9pbmFjdGl2ZSB0ZXh0IGluc2lkZSBhIHN3aXRjaC4gQXBwbHkgdGhpcyB0byB0ZXh0IGVsZW1lbnRzIGluc2lkZSB0aGUgc3dpdGNoIGA8bGFiZWw+YC5cbkBtaXhpbiBzd2l0Y2gtdGV4dCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cblxuLy8vIEFkZHMgc3R5bGVzIGZvciB0aGUgYWN0aXZlIHN0YXRlIHRleHQgd2l0aGluIGEgc3dpdGNoLlxuQG1peGluIHN3aXRjaC10ZXh0LWFjdGl2ZSB7XG4gICN7JGdsb2JhbC1sZWZ0fTogOCU7XG4gIGRpc3BsYXk6IG5vbmU7XG5cbiAgaW5wdXQ6Y2hlY2tlZCArIGxhYmVsID4gJiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbn1cblxuLy8vIEFkZHMgc3R5bGVzIGZvciB0aGUgaW5hY3RpdmUgc3RhdGUgdGV4dCB3aXRoaW4gYSBzd2l0Y2guXG5AbWl4aW4gc3dpdGNoLXRleHQtaW5hY3RpdmUge1xuICAjeyRnbG9iYWwtcmlnaHR9OiAxNSU7XG5cbiAgaW5wdXQ6Y2hlY2tlZCArIGxhYmVsID4gJiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4vLy8gQ2hhbmdlcyB0aGUgc2l6ZSBvZiBhIHN3aXRjaCBieSBtb2RpZnlpbmcgdGhlIHNpemUgb2YgdGhlIGJvZHkgYW5kIHBhZGRsZS4gQXBwbHkgdGhpcyB0byBhIHN3aXRjaCBjb250YWluZXIuXG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICRmb250LXNpemUgWzFyZW1dIC0gRm9udCBzaXplIG9mIGxhYmVsIHRleHQgd2l0aGluIHRoZSBzd2l0Y2guXG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICR3aWR0aCBbNHJlbV0gLSBXaWR0aCBvZiB0aGUgc3dpdGNoIGJvZHkuXG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICRoZWlnaHQgWzJyZW1dIC0gSGVpZ2h0IG9mIHRoZSBzd2l0Y2ggYm9keS5cbi8vLyBAcGFyYW0ge051bWJlcn0gJHBhZGRsZS13aWR0aCBbMS41cmVtXSAtIFdpZHRoIG9mIHRoZSBzd2l0Y2ggcGFkZGxlLlxuLy8vIEBwYXJhbSB7TnVtYmVyfSAkcGFkZGxlLW9mZnNldCBbMC4yNXJlbV0gLSBTcGFjaW5nIGJldHdlZW4gdGhlIHN3aXRjaCBwYWRkbGUgYW5kIHRoZSBlZGdlIG9mIHRoZSBzd2l0Y2ggYm9keS5cbkBtaXhpbiBzd2l0Y2gtc2l6ZShcbiAgJGZvbnQtc2l6ZTogMXJlbSxcbiAgJHdpZHRoOiA0cmVtLFxuICAkaGVpZ2h0OiAycmVtLFxuICAkcGFkZGxlLXdpZHRoOiAxLjVyZW0sXG4gICRwYWRkbGUtb2Zmc2V0OiAwLjI1cmVtXG4pIHtcbiAgJHBhZGRsZS1oZWlnaHQ6ICRoZWlnaHQgLSAoJHBhZGRsZS1vZmZzZXQgKiAyKTtcbiAgJHBhZGRsZS1sZWZ0LWFjdGl2ZTogJHdpZHRoIC0gJHBhZGRsZS13aWR0aCAtICRwYWRkbGUtb2Zmc2V0O1xuXG4gIC5zd2l0Y2gtcGFkZGxlIHtcbiAgICB3aWR0aDogJHdpZHRoO1xuICAgIGhlaWdodDogJGhlaWdodDtcbiAgICBmb250LXNpemU6ICRmb250LXNpemU7XG4gIH1cblxuICAuc3dpdGNoLXBhZGRsZTo6YWZ0ZXIge1xuICAgIHdpZHRoOiAkcGFkZGxlLXdpZHRoO1xuICAgIGhlaWdodDogJHBhZGRsZS1oZWlnaHQ7XG4gIH1cblxuICBpbnB1dDpjaGVja2VkIH4gLnN3aXRjaC1wYWRkbGU6YWZ0ZXIge1xuICAgICN7JGdsb2JhbC1sZWZ0fTogJHBhZGRsZS1sZWZ0LWFjdGl2ZTtcbiAgfVxufVxuXG5AbWl4aW4gZm91bmRhdGlvbi1zd2l0Y2gge1xuICAvLyBDb250YWluZXIgY2xhc3NcbiAgLnN3aXRjaCB7XG4gICAgQGluY2x1ZGUgc3dpdGNoLWNvbnRhaW5lcjtcbiAgfVxuXG4gIC8vIDxpbnB1dD4gZWxlbWVudFxuICAuc3dpdGNoLWlucHV0IHtcbiAgICBAaW5jbHVkZSBzd2l0Y2gtaW5wdXQ7XG4gIH1cblxuICAvLyA8bGFiZWw+IGVsZW1lbnRcbiAgLnN3aXRjaC1wYWRkbGUge1xuICAgIEBpbmNsdWRlIHN3aXRjaC1wYWRkbGU7XG4gIH1cblxuICAvLyBCYXNlIGxhYmVsIHRleHQgc3R5bGVzXG4gICVzd2l0Y2gtdGV4dCB7XG4gICAgQGluY2x1ZGUgc3dpdGNoLXRleHQ7XG4gIH1cblxuICAvLyBBY3RpdmUgbGFiZWwgdGV4dCBzdHlsZXNcbiAgLnN3aXRjaC1hY3RpdmUge1xuICAgIEBleHRlbmQgJXN3aXRjaC10ZXh0O1xuICAgIEBpbmNsdWRlIHN3aXRjaC10ZXh0LWFjdGl2ZTtcbiAgfVxuXG4gIC8vIEluYWN0aXZlIGxhYmVsIHRleHQgc3R5bGVzXG4gIC5zd2l0Y2gtaW5hY3RpdmUge1xuICAgIEBleHRlbmQgJXN3aXRjaC10ZXh0O1xuICAgIEBpbmNsdWRlIHN3aXRjaC10ZXh0LWluYWN0aXZlO1xuICB9XG5cbiAgLy8gU3dpdGNoIHNpemVzXG4gIC5zd2l0Y2gudGlueSB7XG4gICAgQGluY2x1ZGUgc3dpdGNoLXNpemUocmVtLWNhbGMoMTApLCAzcmVtLCAkc3dpdGNoLWhlaWdodC10aW55LCAxcmVtLCAkc3dpdGNoLXBhZGRsZS1vZmZzZXQpO1xuICB9XG5cbiAgLnN3aXRjaC5zbWFsbCB7XG4gICAgQGluY2x1ZGUgc3dpdGNoLXNpemUocmVtLWNhbGMoMTIpLCAzLjVyZW0sICRzd2l0Y2gtaGVpZ2h0LXNtYWxsLCAxLjI1cmVtLCAkc3dpdGNoLXBhZGRsZS1vZmZzZXQpO1xuICB9XG5cbiAgLnN3aXRjaC5sYXJnZSB7XG4gICAgQGluY2x1ZGUgc3dpdGNoLXNpemUocmVtLWNhbGMoMTYpLCA1cmVtLCAkc3dpdGNoLWhlaWdodC1sYXJnZSwgMnJlbSwgJHN3aXRjaC1wYWRkbGUtb2Zmc2V0KTtcbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vIHNjc3MtbGludDpkaXNhYmxlIE1lcmdlYWJsZVNlbGVjdG9yLCBRdWFsaWZ5aW5nRWxlbWVudFxuXG4vLy8vXG4vLy8gQGdyb3VwIHRhYmxlXG4vLy8vXG5cbi8vLyBEZWZhdWx0IGNvbG9yIGZvciB0YWJsZSBiYWNrZ3JvdW5kLlxuLy8vIEB0eXBlIENvbG9yXG4kdGFibGUtYmFja2dyb3VuZDogJHdoaXRlICAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgc2NhbGUgZm9yIGRhcmtlbmluZyB0aGUgc3RyaXBlZCB0YWJsZSByb3dzIGFuZCB0aGUgdGFibGUgYm9yZGVyLlxuLy8vIEB0eXBlIE51bWJlclxuJHRhYmxlLWNvbG9yLXNjYWxlOiA1JSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgc3R5bGUgZm9yIHRhYmxlIGJvcmRlci5cbi8vLyBAdHlwZSBMaXN0XG4kdGFibGUtYm9yZGVyOiAxcHggc29saWQgc21hcnQtc2NhbGUoJHRhYmxlLWJhY2tncm91bmQsICR0YWJsZS1jb2xvci1zY2FsZSkgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHBhZGRpbmcgZm9yIHRhYmxlLlxuLy8vIEB0eXBlIE51bWJlclxuJHRhYmxlLXBhZGRpbmc6IHJlbS1jYWxjKDggMTAgMTApICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBzY2FsZSBmb3IgZGFya2VuaW5nIHRoZSB0YWJsZSByb3dzIG9uIGhvdmVyLlxuLy8vIEB0eXBlIE51bWJlclxuJHRhYmxlLWhvdmVyLXNjYWxlOiAyJSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgY29sb3Igb2Ygc3RhbmRhcmQgcm93cyBvbiBob3Zlci5cbi8vLyBAdHlwZSBMaXN0XG4kdGFibGUtcm93LWhvdmVyOiBkYXJrZW4oJHRhYmxlLWJhY2tncm91bmQsICR0YWJsZS1ob3Zlci1zY2FsZSkgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGNvbG9yIG9mIHN0cmlwZWQgcm93cyBvbiBob3Zlci5cbi8vLyBAdHlwZSBMaXN0XG4kdGFibGUtcm93LXN0cmlwZS1ob3ZlcjogZGFya2VuKCR0YWJsZS1iYWNrZ3JvdW5kLCAkdGFibGUtY29sb3Itc2NhbGUgKyAkdGFibGUtaG92ZXItc2NhbGUpICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBzdHJpcGVkIHJvd3MuXG4vLy8gQHR5cGUgQ29sb3JcbiR0YWJsZS1zdHJpcGVkLWJhY2tncm91bmQ6IHNtYXJ0LXNjYWxlKCR0YWJsZS1iYWNrZ3JvdW5kLCAkdGFibGUtY29sb3Itc2NhbGUpICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCB2YWx1ZSBmb3Igc2hvd2luZyB0aGUgc3RyaXBlIG9uIHJvd3Mgb2YgdGhlIHRhYmxlcywgZXhjbHVkaW5nIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBJZiBldmVuLCB0aGUgZXZlbiByb3dzIHdpbGwgaGF2ZSBhIGJhY2tncm91bmQgY29sb3IuIElmIG9kZCwgdGhlIG9kZCByb3dzIHdpbGwgaGF2ZSBhIGJhY2tncm91bmQgY29sb3IuIElmIGVtcHR5LCBvciBhbnlvdGhlciB2YWx1ZSwgdGhlIHRhYmxlIHJvd3Mgd2lsbCBoYXZlIG5vIHN0cmlwaW5nLlxuLy8vIEB0eXBlIEtleW93b3JkXG4kdGFibGUtc3RyaXBlOiBldmVuICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBjb2xvciBmb3IgaGVhZGVyIGJhY2tncm91bmQuXG4vLy8gQHR5cGUgQ29sb3JcbiR0YWJsZS1oZWFkLWJhY2tncm91bmQ6IHNtYXJ0LXNjYWxlKCR0YWJsZS1iYWNrZ3JvdW5kLCAkdGFibGUtY29sb3Itc2NhbGUgLyAyKSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgY29sb3IgZm9yIGZvb3RlciBiYWNrZ3JvdW5kLlxuLy8vIEB0eXBlIENvbG9yXG4kdGFibGUtZm9vdC1iYWNrZ3JvdW5kOiBzbWFydC1zY2FsZSgkdGFibGUtYmFja2dyb3VuZCwgJHRhYmxlLWNvbG9yLXNjYWxlKSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgZm9udCBjb2xvciBmb3IgaGVhZGVyLlxuLy8vIEB0eXBlIENvbG9yXG4kdGFibGUtaGVhZC1mb250LWNvbG9yOiAkYm9keS1mb250LWNvbG9yICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCB2YWx1ZSBmb3Igc2hvd2luZyB0aGUgaGVhZGVyIHdoZW4gdXNpbmcgc3RhY2tlZCB0YWJsZXMuXG4vLy8gQHR5cGUgQm9vbGVhblxuJHNob3ctaGVhZGVyLWZvci1zdGFja2VkOiBmYWxzZSAhZGVmYXVsdDtcblxuQG1peGluIC16Zi10YWJsZS1jaGlsZHJlbi1zdHlsZXMoJHN0cmlwZTogJHRhYmxlLXN0cmlwZSkge1xuICB0aGVhZCxcbiAgdGJvZHksXG4gIHRmb290IHtcbiAgICBib3JkZXI6ICR0YWJsZS1ib3JkZXI7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHRhYmxlLWJhY2tncm91bmQ7XG4gIH1cblxuICAvLyBDYXB0aW9uXG4gIGNhcHRpb24ge1xuICAgIGZvbnQtd2VpZ2h0OiAkZ2xvYmFsLXdlaWdodC1ib2xkO1xuICAgIHBhZGRpbmc6ICR0YWJsZS1wYWRkaW5nO1xuICB9XG5cbiAgLy8gVGFibGUgaGVhZCBhbmQgZm9vdFxuICB0aGVhZCxcbiAgdGZvb3Qge1xuICAgIGJhY2tncm91bmQ6ICR0YWJsZS1oZWFkLWJhY2tncm91bmQ7XG4gICAgY29sb3I6ICR0YWJsZS1oZWFkLWZvbnQtY29sb3I7XG5cbiAgICAvLyBSb3dzIHdpdGhpbiBoZWFkIGFuZCBmb290XG4gICAgdHIge1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgfVxuXG4gICAgLy8gQ2VsbHMgd2l0aGluIGhlYWQgYW5kIGZvb3RcbiAgICB0aCxcbiAgICB0ZCB7XG4gICAgICBwYWRkaW5nOiAkdGFibGUtcGFkZGluZztcbiAgICAgIGZvbnQtd2VpZ2h0OiAkZ2xvYmFsLXdlaWdodC1ib2xkO1xuICAgICAgdGV4dC1hbGlnbjogI3skZ2xvYmFsLWxlZnR9O1xuICAgIH1cbiAgfVxuXG4gIC8vIFRhYmxlIHJvd3NcbiAgdGJvZHkge1xuICAgIHRyIHtcbiAgICAgIC8vIElmIHN0cmlwZSBpcyBzZXQgdG8gZXZlbiwgZGFya2VuIHRoZSBldmVuIHJvd3MuXG4gICAgICBAaWYgJHN0cmlwZSA9PSBldmVuIHtcbiAgICAgICAgJjpudGgtY2hpbGQoZXZlbikge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR0YWJsZS1zdHJpcGVkLWJhY2tncm91bmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgc3RyaXBlIGlzIHNldCB0byBvZGQsIGRhcmtlbiB0aGUgb2RkIHJvd3MuXG4gICAgICBAZWxzZSBpZiAkc3RyaXBlID09IG9kZCB7XG4gICAgICAgICY6bnRoLWNoaWxkKG9kZCkge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR0YWJsZS1zdHJpcGVkLWJhY2tncm91bmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aCxcbiAgICB0ZCB7XG4gICAgICBwYWRkaW5nOiAkdGFibGUtcGFkZGluZztcbiAgICB9XG4gIH1cbn1cblxuLy8vIEFkZHMgdGhlIGdlbmVyYWwgc3R5bGVzIGZvciB0YWJsZXMuXG4vLy8gQHBhcmFtIHtLZXl3b3JkfSAkc3RyaXBlIFskdGFibGUtc3RyaXBlXSAtIFVzZXMga2V5d29yZHMgZXZlbiwgb2RkLCBvciBub25lIHRvIGRhcmtlbiByb3dzIG9mIHRoZSB0YWJsZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZXZlbi5cbkBtaXhpbiB0YWJsZShcbiAgJHN0cmlwZTogJHRhYmxlLXN0cmlwZSxcbiAgJG5lc3Q6IGZhbHNlXG4pIHtcbiAgd2lkdGg6IDEwMCU7XG4gIG1hcmdpbi1ib3R0b206ICRnbG9iYWwtbWFyZ2luO1xuICBib3JkZXItcmFkaXVzOiAkZ2xvYmFsLXJhZGl1cztcblxuICBAaWYgJG5lc3Qge1xuICAgIEBpbmNsdWRlIC16Zi10YWJsZS1jaGlsZHJlbi1zdHlsZXMoJHN0cmlwZSk7XG4gIH1cbiAgQGVsc2Uge1xuICAgIEBhdC1yb290IHtcbiAgICAgIEBpbmNsdWRlIC16Zi10YWJsZS1jaGlsZHJlbi1zdHlsZXMoJHN0cmlwZSk7XG4gICAgfVxuICB9XG59XG5cbi8vLyBBZGRzIHRoZSBhYmlsaXR5IHRvIGhvcml6b250YWxseSBzY3JvbGwgdGhlIHRhYmxlIHdoZW4gdGhlIGNvbnRlbnQgb3ZlcmZsb3dzIGhvcml6b250YWxseS5cbkBtaXhpbiB0YWJsZS1zY3JvbGwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG4gIG92ZXJmbG93LXg6IGF1dG87XG59XG5cbi8vLyBTbGlnaHRseSBkYXJrZW5zIHRoZSB0YWJsZSByb3dzIG9uIGhvdmVyLlxuQG1peGluIHRhYmxlLWhvdmVyIHtcbiAgdHIge1xuICAgIC8vRGFya2VucyB0aGUgbm9uLXN0cmlwZWQgdGFibGUgcm93cyBvbiBob3Zlci5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR0YWJsZS1yb3ctaG92ZXI7XG4gICAgfVxuXG4gICAgLy9EYXJrZW5zIHRoZSBldmVuIHN0cmlwZWQgdGFibGUgcm93cy5cbiAgICBAaWYoJHRhYmxlLXN0cmlwZSA9PSBldmVuKSB7XG4gICAgICAmOm50aC1vZi10eXBlKGV2ZW4pOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHRhYmxlLXJvdy1zdHJpcGUtaG92ZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9EYXJrZW5zIHRoZSBvZGQgc3RyaXBlZCB0YWJsZSByb3dzLlxuICAgIEBlbHNlaWYoJHRhYmxlLXN0cmlwZSA9PSBvZGQpIHtcbiAgICAgICY6bnRoLW9mLXR5cGUob2RkKTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR0YWJsZS1yb3ctc3RyaXBlLWhvdmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLy8gQWRkcyBzdHlsZXMgZm9yIGEgc3RhY2tlZCB0YWJsZS4gVXNlZnVsIGZvciBzbWFsbC1zY3JlZW4gbGF5b3V0cy5cbi8vLyBAcGFyYW0ge0Jvb2xlYW59ICRoZWFkZXIgWyRzaG93LWhlYWRlci1mb3Itc3RhY2tlZF0gLSBTaG93IHRoZSBmaXJzdCB0aCBvZiBoZWFkZXIgd2hlbiBzdGFja2VkLlxuQG1peGluIHRhYmxlLXN0YWNrKCRoZWFkZXI6ICRzaG93LWhlYWRlci1mb3Itc3RhY2tlZCkge1xuICBAaWYgJGhlYWRlciB7XG4gICAgdGhlYWQge1xuICAgICAgdGg6Zmlyc3QtY2hpbGQge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cblxuICAgICAgdGgge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBAZWxzZSB7XG4gICAgdGhlYWQge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cblxuICB0Zm9vdCB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIHRyLFxuICB0aCxcbiAgdGQge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgdGQge1xuICAgIGJvcmRlci10b3A6IDA7XG4gIH1cbn1cblxuQG1peGluIGZvdW5kYXRpb24tdGFibGUoJG5lc3Q6IGZhbHNlKSB7XG4gIHRhYmxlIHtcbiAgICBAaW5jbHVkZSB0YWJsZSgkbmVzdDogJG5lc3QpO1xuICB9XG5cbiAgdGFibGUuc3RhY2sge1xuICAgIEBpbmNsdWRlIGJyZWFrcG9pbnQobWVkaXVtIGRvd24pIHtcbiAgICAgIEBpbmNsdWRlIHRhYmxlLXN0YWNrO1xuICAgIH1cbiAgfVxuXG4gIHRhYmxlLnNjcm9sbCB7XG4gICAgQGluY2x1ZGUgdGFibGUtc2Nyb2xsO1xuICB9XG5cbiAgdGFibGUuaG92ZXIge1xuICAgIEBpbmNsdWRlIHRhYmxlLWhvdmVyO1xuICB9XG59XG4iLCIvLyBGb3VuZGF0aW9uIGZvciBTaXRlcyBieSBaVVJCXG4vLyBmb3VuZGF0aW9uLnp1cmIuY29tXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgT3BlbiBTb3VyY2VcblxuLy8vL1xuLy8vIEBncm91cCBmdW5jdGlvbnNcbi8vLy9cblxuLy8vIENoZWNrcyB0aGUgbGlnaHRuZXNzIG9mIGAkY29sb3JgLCBhbmQgaWYgaXQgcGFzc2VzIHRoZSBgJHRocmVzaG9sZGAgb2YgbGlnaHRuZXNzLCBpdCByZXR1cm5zIHRoZSBgJHllc2AgY29sb3IuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgYCRub2AgY29sb3IuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGR5bmFtaWNhbGx5IG91dHB1dCBhIGZvcmVncm91bmQgY29sb3IgYmFzZWQgb24gYSBnaXZlbiBiYWNrZ3JvdW5kIGNvbG9yLlxuLy8vXG4vLy8gQHBhcmFtIHtDb2xvcn0gJGNvbG9yIC0gQ29sb3IgdG8gY2hlY2sgdGhlIGxpZ2h0bmVzcyBvZi5cbi8vLyBAcGFyYW0ge0NvbG9yfSAkeWVzIFskYmxhY2tdIC0gQ29sb3IgdG8gcmV0dXJuIGlmIGAkY29sb3JgIGlzIGxpZ2h0LlxuLy8vIEBwYXJhbSB7Q29sb3J9ICRubyBbJHdoaXRlXSAtIENvbG9yIHRvIHJldHVybiBpZiBgJGNvbG9yYCBpcyBkYXJrLlxuLy8vIEBwYXJhbSB7UGVyY2VudGFnZX0gJHRocmVzaG9sZCBbNjAlXSAtIFRocmVzaG9sZCBvZiBsaWdodG5lc3MgdG8gY2hlY2sgYWdhaW5zdC5cbi8vL1xuLy8vIEByZXR1cm5zIHtDb2xvcn0gVGhlICR5ZXMgY29sb3Igb3IgJG5vIGNvbG9yLlxuQGZ1bmN0aW9uIGZvcmVncm91bmQoJGNvbG9yLCAkeWVzOiAkYmxhY2ssICRubzogJHdoaXRlLCAkdGhyZXNob2xkOiA2MCUpIHtcbiAgQGlmICRjb2xvciA9PSB0cmFuc3BhcmVudCB7XG4gICAgJGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kO1xuICB9XG4gIEBpZiAobGlnaHRuZXNzKCRjb2xvcikgPiAkdGhyZXNob2xkKSB7XG4gICAgQHJldHVybiAkeWVzO1xuICB9XG4gIEBlbHNlIHtcbiAgICBAcmV0dXJuICRubztcbiAgfVxufVxuXG4vLy8gU2NhbGVzIGEgY29sb3IgdG8gYmUgbGlnaHRlciBpZiBpdCdzIGxpZ2h0LCBvciBkYXJrZXIgaWYgaXQncyBkYXJrLiBVc2UgdGhpcyBmdW5jdGlvbiB0byB0aW50IGEgY29sb3IgYXBwcm9wcmlhdGUgdG8gaXRzIGxpZ2h0bmVzcy5cbi8vL1xuLy8vIEBwYXJhbSB7Q29sb3J9ICRjb2xvciAtIENvbG9yIHRvIHNjYWxlLlxuLy8vIEBwYXJhbSB7UGVyY2VudGFnZX0gJHNjYWxlIFs1JV0gLSBBbW91bnQgdG8gc2NhbGUgdXAgb3IgZG93bi5cbi8vLyBAcGFyYW0ge1BlcmNlbnRhZ2V9ICR0aHJlc2hvbGQgWzQwJV0gLSBUaHJlc2hvbGQgb2YgbGlnaHRuZXNzIHRvIGNoZWNrIGFnYWluc3QuXG4vLy9cbi8vLyBAcmV0dXJucyB7Q29sb3J9IEEgc2NhbGVkIGNvbG9yLlxuQGZ1bmN0aW9uIHNtYXJ0LXNjYWxlKCRjb2xvciwgJHNjYWxlOiA1JSwgJHRocmVzaG9sZDogNDAlKSB7XG4gIEBpZiBsaWdodG5lc3MoJGNvbG9yKSA+ICR0aHJlc2hvbGQge1xuICAgICRzY2FsZTogLSRzY2FsZTtcbiAgfVxuICBAcmV0dXJuIHNjYWxlLWNvbG9yKCRjb2xvciwgJGxpZ2h0bmVzczogJHNjYWxlKTtcbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIHRhYnNcbi8vLy9cblxuLy8vIERlZmF1bHQgbWFyZ2luIG9mIHRoZSB0YWIgYmFyLlxuLy8vIEB0eXBlIE51bWJlclxuJHRhYi1tYXJnaW46IDAgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGJhY2tncm91bmQgY29sb3Igb2YgYSB0YWIgYmFyLlxuLy8vIEB0eXBlIENvbG9yXG4kdGFiLWJhY2tncm91bmQ6ICR3aGl0ZSAhZGVmYXVsdDtcblxuLy8vIGFjdGl2ZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIGEgdGFiIGJhci5cbi8vLyBAdHlwZSBDb2xvclxuJHRhYi1iYWNrZ3JvdW5kLWFjdGl2ZTogJGxpZ2h0LWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGJvcmRlciBjb2xvciBvZiB0YWIgY29udGVudC5cbi8vLyBAdHlwZSBDb2xvclxuJHRhYi1ib3JkZXI6ICRsaWdodC1ncmF5ICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCB0ZXh0IGNvbG9yIGZvciBpdGVtcyBpbiBhIE1lbnUuXG4vLy8gQHR5cGUgQ29sb3JcbiR0YWItaXRlbS1jb2xvcjogZm9yZWdyb3VuZCgkdGFiLWJhY2tncm91bmQsICRwcmltYXJ5LWNvbG9yKSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgYmFja2dyb3VuZCBjb2xvciBvbiBob3ZlciBmb3IgaXRlbXMgaW4gYSBNZW51LlxuJHRhYi1pdGVtLWJhY2tncm91bmQtaG92ZXI6ICR3aGl0ZSAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgcGFkZGluZyBvZiBhIGEgdGFiIGl0ZW0uXG4vLy8gQHR5cGUgTnVtYmVyXG4kdGFiLWl0ZW0tcGFkZGluZzogMS4yNXJlbSAxLjVyZW0gIWRlZmF1bHQ7XG5cbi8vLyBNYXhpbXVtIG51bWJlciBvZiBgZXhwYW5kLW5gIGNsYXNzZXMgdG8gaW5jbHVkZSBpbiB0aGUgQ1NTLlxuLy8vIEB0eXBlIE51bWJlclxuJHRhYi1leHBhbmQtbWF4OiA2ICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRhYiBjb250ZW50LlxuLy8vIEB0eXBlIENvbG9yXG4kdGFiLWNvbnRlbnQtYmFja2dyb3VuZDogJHdoaXRlICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBib3JkZXIgY29sb3Igb2YgdGFiIGNvbnRlbnQuXG4vLy8gQHR5cGUgQ29sb3JcbiR0YWItY29udGVudC1ib3JkZXI6ICRsaWdodC1ncmF5ICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCB0ZXh0IGNvbG9yIG9mIHRhYiBjb250ZW50LlxuLy8vIEB0eXBlIENvbG9yXG4kdGFiLWNvbnRlbnQtY29sb3I6IGZvcmVncm91bmQoJHRhYi1iYWNrZ3JvdW5kLCAkcHJpbWFyeS1jb2xvcikgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHBhZGRpbmcgZm9yIHRhYiBjb250ZW50LlxuLy8vIEB0eXBlIE51bWJlciB8IExpc3RcbiR0YWItY29udGVudC1wYWRkaW5nOiAxcmVtICFkZWZhdWx0O1xuXG4vLy8gQWRkcyBzdHlsZXMgZm9yIGEgdGFiIGNvbnRhaW5lci4gQXBwbHkgdGhpcyB0byBhIGA8dWw+YC5cbkBtaXhpbiB0YWJzLWNvbnRhaW5lciB7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuICBtYXJnaW46ICR0YWItbWFyZ2luO1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIGJhY2tncm91bmQ6ICR0YWItYmFja2dyb3VuZDtcbiAgYm9yZGVyOiAxcHggc29saWQgJHRhYi1jb250ZW50LWJvcmRlcjtcbn1cblxuLy8vIEF1Z21lbnRzIGEgdGFiIGNvbnRhaW5lciB0byBoYXZlIHZlcnRpY2FsIHRhYnMuIFVzZSB0aGlzIGluIGNvbmp1bmN0aW9uIHdpdGggYHRhYnMtY29udGFpbmVyKClgLlxuQG1peGluIHRhYnMtY29udGFpbmVyLXZlcnRpY2FsIHtcbiAgPiBsaSB7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbn1cblxuLy8vIEFkZHMgc3R5bGVzIGZvciB0aGUgbGlua3Mgd2l0aGluIGEgdGFiIGNvbnRhaW5lci4gQXBwbHkgdGhpcyB0byB0aGUgYDxsaT5gIGVsZW1lbnRzIGluc2lkZSBhIHRhYiBjb250YWluZXIuXG5AbWl4aW4gdGFicy10aXRsZSB7XG4gIGZsb2F0OiAjeyRnbG9iYWwtbGVmdH07XG5cbiAgPiBhIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwYWRkaW5nOiAkdGFiLWl0ZW0tcGFkZGluZztcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgY29sb3I6ICR0YWItaXRlbS1jb2xvcjtcblxuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogJHRhYi1pdGVtLWJhY2tncm91bmQtaG92ZXI7XG4gICAgfVxuXG4gICAgJjpmb2N1cyxcbiAgICAmW2FyaWEtc2VsZWN0ZWQ9J3RydWUnXSB7XG4gICAgICBiYWNrZ3JvdW5kOiAkdGFiLWJhY2tncm91bmQtYWN0aXZlO1xuICAgIH1cbiAgfVxufVxuXG4vLy8gQWRkcyBzdHlsZXMgZm9yIHRoZSB3cmFwcGVyIHRoYXQgc3Vycm91bmRzIGEgdGFiIGdyb3VwJ3MgY29udGVudCBwYW5lcy5cbkBtaXhpbiB0YWJzLWNvbnRlbnQge1xuICBiYWNrZ3JvdW5kOiAkdGFiLWNvbnRlbnQtYmFja2dyb3VuZDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXMgZWFzZTtcbiAgYm9yZGVyOiAxcHggc29saWQgJHRhYi1jb250ZW50LWJvcmRlcjtcbiAgYm9yZGVyLXRvcDogMDtcbn1cblxuLy8vIEF1Z21lbnRzIGEgdGFiIGNvbnRlbnQgY29udGFpbmVyIHRvIGhhdmUgYSB2ZXJ0aWNhbCBzdHlsZSwgYnkgc2hpZnRpbmcgdGhlIGJvcmRlciBhcm91bmQuIFVzZSB0aGlzIGluIGNvbmp1bmN0aW9uIHdpdGggYHRhYnMtY29udGVudCgpYC5cbkBtaXhpbiB0YWJzLWNvbnRlbnQtdmVydGljYWwge1xuICBib3JkZXI6IDFweCBzb2xpZCAkdGFiLWNvbnRlbnQtYm9yZGVyO1xuICBib3JkZXItI3skZ2xvYmFsLWxlZnR9OiAwO1xufVxuXG4vLy8gQWRkcyBzdHlsZXMgZm9yIGFuIGluZGl2aWR1YWwgdGFiIGNvbnRlbnQgcGFuZWwgd2l0aGluIHRoZSB0YWIgY29udGVudCBjb250YWluZXIuXG5AbWl4aW4gdGFicy1wYW5lbCB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBhZGRpbmc6ICR0YWItY29udGVudC1wYWRkaW5nO1xuXG4gICYuaXMtYWN0aXZlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxufVxuXG5AbWl4aW4gZm91bmRhdGlvbi10YWJzIHtcbiAgLnRhYnMge1xuICAgIEBpbmNsdWRlIHRhYnMtY29udGFpbmVyO1xuICB9XG5cbiAgLy8gVmVydGljYWxcbiAgLnRhYnMudmVydGljYWwge1xuICAgIEBpbmNsdWRlIHRhYnMtY29udGFpbmVyLXZlcnRpY2FsO1xuICB9XG5cbiAgLy8gU2ltcGxlXG4gIC50YWJzLnNpbXBsZSB7XG4gICAgPiBsaSA+IGEge1xuICAgICAgcGFkZGluZzogMDtcblxuICAgICAgJjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFByaW1hcnkgY29sb3JcbiAgLnRhYnMucHJpbWFyeSB7XG4gICAgYmFja2dyb3VuZDogJHByaW1hcnktY29sb3I7XG5cbiAgICA+IGxpID4gYSB7XG4gICAgICBjb2xvcjogZm9yZWdyb3VuZCgkcHJpbWFyeS1jb2xvcik7XG5cbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgYmFja2dyb3VuZDogc21hcnQtc2NhbGUoJHByaW1hcnktY29sb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC50YWJzLXRpdGxlIHtcbiAgICBAaW5jbHVkZSB0YWJzLXRpdGxlO1xuICB9XG5cbiAgLnRhYnMtY29udGVudCB7XG4gICAgQGluY2x1ZGUgdGFicy1jb250ZW50O1xuICB9XG5cbiAgLnRhYnMtY29udGVudC52ZXJ0aWNhbCB7XG4gICAgQGluY2x1ZGUgdGFicy1jb250ZW50LXZlcnRpY2FsO1xuICB9XG5cbiAgLnRhYnMtcGFuZWwge1xuICAgIEBpbmNsdWRlIHRhYnMtcGFuZWw7XG4gIH1cbn1cbiIsIi8vIEZvdW5kYXRpb24gZm9yIFNpdGVzIGJ5IFpVUkJcbi8vIGZvdW5kYXRpb24uenVyYi5jb21cbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCBPcGVuIFNvdXJjZVxuXG4vLy8vXG4vLy8gQGdyb3VwIHRodW1ibmFpbFxuLy8vL1xuXG4vLy8gQm9yZGVyIGFyb3VuZCB0aHVtYm5haWwgaW1hZ2VzLlxuLy8vIEB0eXBlIEJvcmRlclxuJHRodW1ibmFpbC1ib3JkZXI6IHNvbGlkIDRweCAkd2hpdGUgIWRlZmF1bHQ7XG5cbi8vLyBCb3R0b20gbWFyZ2luIGZvciB0aHVtYm5haWwgaW1hZ2VzLlxuLy8vIEB0eXBlIExlbmd0aFxuJHRodW1ibmFpbC1tYXJnaW4tYm90dG9tOiAkZ2xvYmFsLW1hcmdpbiAhZGVmYXVsdDtcblxuLy8vIEJveCBzaGFkb3cgdW5kZXIgdGh1bWJuYWlsIGltYWdlcy5cbi8vLyBAdHlwZSBTaGFkb3dcbiR0aHVtYm5haWwtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgkYmxhY2ssIDAuMikgIWRlZmF1bHQ7XG5cbi8vLyBCb3ggc2hhZG93IHVuZGVyIHRodW1ibmFpbCBpbWFnZXMuXG4vLy8gQHR5cGUgU2hhZG93XG4kdGh1bWJuYWlsLXNoYWRvdy1ob3ZlcjogMCAwIDZweCAxcHggcmdiYSgkcHJpbWFyeS1jb2xvciwgMC41KSAhZGVmYXVsdDtcblxuLy8vIFRyYW5zaXRpb24gcHJvcHJ0aWVzIGZvciB0aHVtYm5haWwgaW1hZ2VzLlxuLy8vIEB0eXBlIFRyYW5zaXRpb25cbiR0aHVtYm5haWwtdHJhbnNpdGlvbjogYm94LXNoYWRvdyAyMDBtcyBlYXNlLW91dCAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgcmFkaXVzIGZvciB0aHVtYm5haWwgaW1hZ2VzLlxuLy8vIEB0eXBlIE51bWJlclxuJHRodW1ibmFpbC1yYWRpdXM6ICRnbG9iYWwtcmFkaXVzICFkZWZhdWx0O1xuXG4vLy8gQWRkcyB0aHVtYm5haWwgc3R5bGVzIHRvIGFuIGVsZW1lbnQuXG5AbWl4aW4gdGh1bWJuYWlsIHtcbiAgYm9yZGVyOiAkdGh1bWJuYWlsLWJvcmRlcjtcbiAgYm94LXNoYWRvdzogJHRodW1ibmFpbC1zaGFkb3c7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgdHJhbnNpdGlvbjogJHRodW1ibmFpbC10cmFuc2l0aW9uO1xuICBib3JkZXItcmFkaXVzOiAkdGh1bWJuYWlsLXJhZGl1cztcbiAgbWFyZ2luLWJvdHRvbTogJHRodW1ibmFpbC1tYXJnaW4tYm90dG9tO1xuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGJveC1zaGFkb3c6ICR0aHVtYm5haWwtc2hhZG93LWhvdmVyO1xuICB9XG59XG5cbkBtaXhpbiBmb3VuZGF0aW9uLXRodW1ibmFpbCB7XG4gIC50aHVtYm5haWwge1xuICAgIEBpbmNsdWRlIHRodW1ibmFpbDtcbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgdGl0bGUtYmFyXG4vLy8vXG5cbi8vLyBCYWNrZ3JvdW5kIGNvbG9yIG9mIGEgdGl0bGUgYmFyLlxuLy8vIEB0eXBlIENvbG9yXG4kdGl0bGViYXItYmFja2dyb3VuZDogJGJsYWNrICFkZWZhdWx0O1xuXG4vLy8gQ29sb3Igb2YgdGV4dCBpbnNpZGUgYSB0aXRsZSBiYXIuXG4vLy8gQHR5cGUgQ29sb3JcbiR0aXRsZWJhci1jb2xvcjogJHdoaXRlICFkZWZhdWx0O1xuXG4vLy8gUGFkZGluZyBpbnNpZGUgYSB0aXRsZSBiYXIuXG4vLy8gQHR5cGUgTGVuZ3RoXG4kdGl0bGViYXItcGFkZGluZzogMC41cmVtICFkZWZhdWx0O1xuXG4vLy8gRm9udCB3ZWlnaHQgb2YgdGV4dCBpbnNpZGUgYSB0aXRsZSBiYXIuXG4vLy8gQHR5cGUgV2VpZ2h0XG4kdGl0bGViYXItdGV4dC1mb250LXdlaWdodDogYm9sZCAhZGVmYXVsdDtcblxuLy8vIENvbG9yIG9mIG1lbnUgaWNvbnMgaW5zaWRlIGEgdGl0bGUgYmFyLlxuLy8vIEB0eXBlIENvbG9yXG4kdGl0bGViYXItaWNvbi1jb2xvcjogJHdoaXRlICFkZWZhdWx0O1xuXG4vLy8gQ29sb3Igb2YgbWVudSBpY29ucyBpbnNpZGUgYSB0aXRsZSBiYXIgb24gaG92ZXIuXG4vLy8gQHR5cGUgQ29sb3JcbiR0aXRsZWJhci1pY29uLWNvbG9yLWhvdmVyOiAkbWVkaXVtLWdyYXkgIWRlZmF1bHQ7XG5cbi8vLyBTcGFjaW5nIGJldHdlZW4gdGhlIG1lbnUgaWNvbiBhbmQgdGV4dCBpbnNpZGUgYSB0aXRsZSBiYXIuXG4vLy8gQHR5cGUgTGVuZ3RoXG4kdGl0bGViYXItaWNvbi1zcGFjaW5nOiAwLjI1cmVtICFkZWZhdWx0O1xuXG5AbWl4aW4gZm91bmRhdGlvbi10aXRsZS1iYXIge1xuICAudGl0bGUtYmFyIHtcbiAgICBAaW5jbHVkZSBjbGVhcmZpeDtcbiAgICBiYWNrZ3JvdW5kOiAkdGl0bGViYXItYmFja2dyb3VuZDtcbiAgICBjb2xvcjogJHRpdGxlYmFyLWNvbG9yO1xuICAgIHBhZGRpbmc6ICR0aXRsZWJhci1wYWRkaW5nO1xuXG4gICAgLm1lbnUtaWNvbiB7XG4gICAgICBtYXJnaW4tI3skZ2xvYmFsLWxlZnR9OiAkdGl0bGViYXItaWNvbi1zcGFjaW5nO1xuICAgICAgbWFyZ2luLSN7JGdsb2JhbC1yaWdodH06ICR0aXRsZWJhci1wYWRkaW5nO1xuICAgIH1cbiAgfVxuXG4gIC50aXRsZS1iYXItbGVmdCB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cblxuICAudGl0bGUtYmFyLXJpZ2h0IHtcbiAgICBmbG9hdDogcmlnaHQ7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIH1cblxuICAudGl0bGUtYmFyLXRpdGxlIHtcbiAgICBmb250LXdlaWdodDogJHRpdGxlYmFyLXRleHQtZm9udC13ZWlnaHQ7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cblxuICAubWVudS1pY29uIHtcbiAgICBAaW5jbHVkZSBoYW1idXJnZXIoJGNvbG9yOiAkdGl0bGViYXItaWNvbi1jb2xvciwgJGNvbG9yLWhvdmVyOiAkdGl0bGViYXItaWNvbi1jb2xvci1ob3Zlcik7XG4gIH1cblxuICAubWVudS1pY29uLmRhcmsge1xuICAgIEBpbmNsdWRlIGhhbWJ1cmdlcjtcbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgdG9vbHRpcFxuLy8vL1xuXG4vLy8gRGVmYXVsdCBmb250IHdlaWdodCBvZiB0aGUgZGVmaW5lZCB0ZXJtLlxuLy8vIEB0eXBlIEtleXdvcmQgfCBOdW1iZXJcbiRoYXMtdGlwLWZvbnQtd2VpZ2h0OiAkZ2xvYmFsLXdlaWdodC1ib2xkICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBib3JkZXIgYm90dG9tIG9mIHRoZSBkZWZpbmVkIHRlcm0uXG4vLy8gQHR5cGUgTGlzdFxuJGhhcy10aXAtYm9yZGVyLWJvdHRvbTogZG90dGVkIDFweCAkZGFyay1ncmF5ICFkZWZhdWx0O1xuXG4vLy8gRGVmYXVsdCBjb2xvciBvZiB0aGUgdG9vbHRpcCBiYWNrZ3JvdW5kLlxuLy8vIEB0eXBlIENvbG9yXG4kdG9vbHRpcC1iYWNrZ3JvdW5kLWNvbG9yOiAkYmxhY2sgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGNvbG9yIG9mIHRoZSB0b29sdGlwIGZvbnQuXG4vLy8gQHR5cGUgQ29sb3JcbiR0b29sdGlwLWNvbG9yOiAkd2hpdGUgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHBhZGRpbmcgb2YgdGhlIHRvb2x0aXAgYmFja2dyb3VuZC5cbi8vLyBAdHlwZSBOdW1iZXJcbiR0b29sdGlwLXBhZGRpbmc6IDAuNzVyZW0gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IGZvbnQgc2l6ZSBvZiB0aGUgdG9vbHRpcCB0ZXh0LiBCeSBkZWZhdWx0LCB3ZSByZWNvbW1lbmQgYSBzbWFsbGVyIGZvbnQgc2l6ZSB0aGFuIHRoZSBib2R5IGNvcHkuXG4vLy8gQHR5cGUgTnVtYmVyXG4kdG9vbHRpcC1mb250LXNpemU6ICRzbWFsbC1mb250LXNpemUgIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHBpcCB3aWR0aCBmb3IgdG9vbHRpcHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kdG9vbHRpcC1waXAtd2lkdGg6IDAuNzVyZW0gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHBpcCBoZWlnaHQgZm9yIHRvb2x0aXBzLiBUaGlzIGlzIGhlbHBmdWwgZm9yIGNhbGN1bGF0aW5nIHRoZSBkaXN0YW5jZSBvZiB0aGUgdG9vbHRpcCBmcm9tIHRoZSB0b29sdGlwIHdvcmQuXG4vLy8gQHR5cGUgTnVtYmVyXG4kdG9vbHRpcC1waXAtaGVpZ2h0OiAkdG9vbHRpcC1waXAtd2lkdGggKiAwLjg2NiAhZGVmYXVsdDtcblxuLy8vIERlZmF1bHQgcGlwIG9mZnNldCBmb3IgdG9vbHRpcHMuIFRoaXMgY29udHJvbHMgaG93IGZhciB0aGUgcGlwIGlzIGluZGVudGVkIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUgdG9vbHRpcC5cbi8vLyBAdHlwZSBOdW1iZXJcbiR0b29sdGlwLXBpcC1vZmZzZXQ6IDEuMjVyZW0gIWRlZmF1bHQ7XG5cbi8vLyBEZWZhdWx0IHJhZGl1cyBmb3IgdG9vbHRpcHMuXG4vLy8gQHR5cGUgTnVtYmVyXG4kdG9vbHRpcC1yYWRpdXM6ICRnbG9iYWwtcmFkaXVzICFkZWZhdWx0O1xuXG5AbWl4aW4gaGFzLXRpcCB7XG4gIGJvcmRlci1ib3R0b206ICRoYXMtdGlwLWJvcmRlci1ib3R0b207XG4gIGZvbnQtd2VpZ2h0OiAkaGFzLXRpcC1mb250LXdlaWdodDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGN1cnNvcjogaGVscDtcbn1cblxuQG1peGluIHRvb2x0aXAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkdG9vbHRpcC1iYWNrZ3JvdW5kLWNvbG9yO1xuICBjb2xvcjogJHRvb2x0aXAtY29sb3I7XG4gIGZvbnQtc2l6ZTogJHRvb2x0aXAtZm9udC1zaXplO1xuICBwYWRkaW5nOiAkdG9vbHRpcC1wYWRkaW5nO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDEwO1xuICB0b3A6IGNhbGMoMTAwJSArICN7JHRvb2x0aXAtcGlwLWhlaWdodH0pO1xuICBtYXgtd2lkdGg6IDEwcmVtICFpbXBvcnRhbnQ7XG4gIGJvcmRlci1yYWRpdXM6ICR0b29sdGlwLXJhZGl1cztcblxuICAmOjpiZWZvcmUge1xuICAgIEBpbmNsdWRlIGNzcy10cmlhbmdsZSgkdG9vbHRpcC1waXAtd2lkdGgsICR0b29sdGlwLWJhY2tncm91bmQtY29sb3IsIHVwKTtcbiAgICBib3R0b206IDEwMCU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDUwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIH1cblxuICAmLnRvcDo6YmVmb3JlIHtcbiAgICBAaW5jbHVkZSBjc3MtdHJpYW5nbGUoJHRvb2x0aXAtcGlwLXdpZHRoLCAkdG9vbHRpcC1iYWNrZ3JvdW5kLWNvbG9yLCBkb3duKTtcbiAgICB0b3A6IDEwMCU7XG4gICAgYm90dG9tOiBhdXRvO1xuICB9XG5cbiAgJi5sZWZ0OjpiZWZvcmUge1xuICAgIEBpbmNsdWRlIGNzcy10cmlhbmdsZSgkdG9vbHRpcC1waXAtd2lkdGgsICR0b29sdGlwLWJhY2tncm91bmQtY29sb3IsIHJpZ2h0KTtcbiAgICBib3R0b206IGF1dG87XG4gICAgbGVmdDogMTAwJTtcbiAgICB0b3A6IDUwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIH1cblxuICAmLnJpZ2h0OjpiZWZvcmUge1xuICAgIEBpbmNsdWRlIGNzcy10cmlhbmdsZSgkdG9vbHRpcC1waXAtd2lkdGgsICR0b29sdGlwLWJhY2tncm91bmQtY29sb3IsIGxlZnQpO1xuICAgIGJvdHRvbTogYXV0bztcbiAgICBsZWZ0OiBhdXRvO1xuICAgIHJpZ2h0OiAxMDAlO1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgfVxufVxuXG5AbWl4aW4gZm91bmRhdGlvbi10b29sdGlwIHtcbiAgLmhhcy10aXAge1xuICAgIEBpbmNsdWRlIGhhcy10aXA7XG4gIH1cblxuICAudG9vbHRpcCB7XG4gICAgQGluY2x1ZGUgdG9vbHRpcDtcbiAgfVxufVxuIiwiLy8gRm91bmRhdGlvbiBmb3IgU2l0ZXMgYnkgWlVSQlxuLy8gZm91bmRhdGlvbi56dXJiLmNvbVxuLy8gTGljZW5zZWQgdW5kZXIgTUlUIE9wZW4gU291cmNlXG5cbi8vLy9cbi8vLyBAZ3JvdXAgdG9wLWJhclxuLy8vL1xuXG4vLy8gUGFkZGluZyBmb3IgdGhlIHRvcCBiYXIuXG4vLy8gQHR5cGUgTnVtYmVyXG4kdG9wYmFyLXBhZGRpbmc6IDAuNXJlbSAhZGVmYXVsdDtcblxuLy8vIEJhY2tncm91bmQgY29sb3IgZm9yIHRoZSB0b3AgYmFyLiBUaGlzIGNvbG9yIGFsc28gY2FzY2FkZXMgdG8gbWVudXMgd2l0aGluIHRoZSB0b3AgYmFyLlxuLy8vIEB0eXBlIENvbG9yXG4kdG9wYmFyLWJhY2tncm91bmQ6ICRsaWdodC1ncmF5ICFkZWZhdWx0O1xuXG4vLy8gU3BhY2luZyBmb3IgdGhlIHRvcCBiYXIgdGl0bGUuXG4vLy8gQHR5cGUgTnVtYmVyXG4kdG9wYmFyLXRpdGxlLXNwYWNpbmc6IDFyZW0gIWRlZmF1bHQ7XG5cbi8vLyBXaWR0aCBvZiBgPGlucHV0PmAgZWxlbWVudHMgaW5zaWRlIHRoZSB0b3AgYmFyLlxuLy8vIEB0eXBlIE51bWJlclxuJHRvcGJhci1pbnB1dC13aWR0aDogMjAwcHggIWRlZmF1bHQ7XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYSB0b3AgYmFyIGNvbnRhaW5lci5cbkBtaXhpbiB0b3AtYmFyLWNvbnRhaW5lciB7XG4gIEBpbmNsdWRlIGNsZWFyZml4O1xuICBwYWRkaW5nOiAkdG9wYmFyLXBhZGRpbmc7XG5cbiAgJixcbiAgdWwge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR0b3BiYXItYmFja2dyb3VuZDtcbiAgfVxuXG4gIGlucHV0IHtcbiAgICB3aWR0aDogJHRvcGJhci1pbnB1dC13aWR0aDtcbiAgICBtYXJnaW4tI3skZ2xvYmFsLXJpZ2h0fTogMXJlbTtcbiAgfVxuXG4gIC8vIHNjc3MtbGludDpkaXNhYmxlIFF1YWxpZnlpbmdFbGVtZW50XG4gIGlucHV0LmJ1dHRvbiB7XG4gICAgd2lkdGg6IGF1dG87XG4gIH1cbn1cblxuLy8vIG1ha2VzIHNlY3Rpb25zIHN0YWNrZWRcbkBtaXhpbiB0b3AtYmFyLXN0YWNrZWQge1xuICAvLyBTdWItc2VjdGlvbnNcbiAgLnRvcC1iYXItdGl0bGUge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG5cbiAgLnRvcC1iYXItcmlnaHQge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG5cbiAgLnRvcC1iYXItbGVmdCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuQG1peGluIGZvdW5kYXRpb24tdG9wLWJhciB7XG4gIC8vIFRvcCBiYXIgY29udGFpbmVyXG4gIC50b3AtYmFyIHtcbiAgICBAaW5jbHVkZSB0b3AtYmFyLWNvbnRhaW5lcjtcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIGNsYXNzZXMgZm9yIHN0YWNraW5nIG9uIGVhY2ggc2NyZWVuIHNpemUgKGRlZmluZWQgaW4gJGJyZWFrcG9pbnQtY2xhc3NlcylcbiAgQGVhY2ggJHNpemUgaW4gJGJyZWFrcG9pbnQtY2xhc3NlcyB7XG4gICAgLnN0YWNrZWQtZm9yLSN7JHNpemV9IHtcbiAgICAgIEBpbmNsdWRlIGJyZWFrcG9pbnQoJHNpemUgZG93bikge1xuICAgICAgICBAaW5jbHVkZSB0b3AtYmFyLXN0YWNrZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhY2sgb24gc21hbGwgc2NyZWVucyBhcyBkZWZhdWx0XG4gIEBpbmNsdWRlIGJyZWFrcG9pbnQoc21hbGwgb25seSkge1xuICAgIEBpbmNsdWRlIHRvcC1iYXItc3RhY2tlZDtcbiAgfVxuXG4gIC8vIFN1Yi1zZWN0aW9uc1xuICAudG9wLWJhci10aXRsZSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgbWFyZ2luLXJpZ2h0OiAkdG9wYmFyLXRpdGxlLXNwYWNpbmc7XG4gIH1cbiAgLnRvcC1iYXItbGVmdCB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cblxuICAudG9wLWJhci1yaWdodCB7XG4gICAgZmxvYXQ6IHJpZ2h0O1xuICB9XG59XG4iLCIvLyBJbnRlcm5hbCBjb3VudGVyIGZvciBjcmVhdGluZyB1bmlxdWUga2V5ZnJhbWUgbmFtZXNcbiQtbXVpLWN1c3RvbTogMDtcblxuLy8vIENyZWF0ZXMgYSBrZXlmcmFtZSBmcm9tIG9uZSBvciBtb3JlIGVmZmVjdCBmdW5jdGlvbnMuIFVzZSB0aGlzIGZ1bmN0aW9uIGluc3RlYWQgb2YgYG11aS1hbmltYXRpb25gIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGtleWZyYW1lIGFuaW1hdGlvbiAqd2l0aG91dCogYXV0b21hdGljYWxseSBhc3NpZ25pbmcgaXQgdG8gdGhlIGVsZW1lbnQuXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRuYW1lIC0gTmFtZSBvZiB0aGUga2V5ZnJhbWUuXG4vLy8gQHBhcmFtIHtGdW5jdGlvbn0gJGVmZmVjdHMuLi4gLSBPbmUgb3IgbW9yZSBlZmZlY3QgZnVuY3Rpb25zIHRvIGJ1aWxkIHRoZSBrZXlmcmFtZSB3aXRoLlxuQG1peGluIG11aS1rZXlmcmFtZXMoJG5hbWUsICRlZmZlY3RzLi4uKSB7XG4gICRvYmo6IC1tdWktcHJvY2Vzcy1hcmdzKCRlZmZlY3RzLi4uKTtcbiAgJG9iajogbWFwLXJlbW92ZSgkb2JqLCBuYW1lKTtcblxuICBAa2V5ZnJhbWVzICN7JG5hbWV9IHtcbiAgICAvLyBOb3cgaXRlcmF0ZSB0aHJvdWdoIGVhY2gga2V5ZnJhbWUgcGVyY2VudGFnZVxuICAgIEBlYWNoICRwY3QsICRwcm9wcyBpbiAkb2JqIHtcbiAgICAgICN7LW11aS1rZXlmcmFtZS1wY3QoJHBjdCl9IHtcbiAgICAgICAgLy8gTGFzdGx5LCBpdGVyYXRlIHRocm91Z2ggZWFjaCBDU1MgcHJvcGVydHkgd2l0aGluIGEgcGVyY2VudGFnZSBhbmQgcHJpbnQgaXQgb3V0XG4gICAgICAgIEBlYWNoICRwcm9wLCAkdmFsdWUgaW4gJHByb3BzIHtcbiAgICAgICAgICAjeyRwcm9wfTogI3skdmFsdWV9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vLyBDcmVhdGVzIGEgc3RyaW5nIGZvciBhIENTUyBrZXlmcmFtZSwgYnkgY29udmVydGluZyBhIGxpc3Qgb2YgbnVtYmVycyB0byBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBlcmNlbnRhZ2UgdmFsdWVzLlxuLy8vIEBwYXJhbSB7TnVtYmVyfExpc3R9ICRpbnB1dCAtIExpc3Qgb2YgbnVtYmVycyB0byB1c2UuXG4vLy8gQHJldHVybiB7U3RyaW5nfSBBIHNldCBvZiBjb21tYS1zZXBhcmF0ZWQgcGVyY2VudGFnZSB2YWx1ZXMuXG4vLy8gQGFjY2VzcyBwcml2YXRlXG5AZnVuY3Rpb24gLW11aS1rZXlmcmFtZS1wY3QoJGlucHV0KSB7XG4gICRvdXRwdXQ6ICgpO1xuXG4gIEBpZiB0eXBlLW9mKCRpbnB1dCkgPT0gJ251bWJlcicge1xuICAgICRvdXRwdXQ6ICgkaW5wdXQgKiAxJSk7XG4gIH0gQGVsc2UgaWYgdHlwZS1vZigkaW5wdXQpID09ICdsaXN0JyB7XG4gICAgQGVhY2ggJGkgaW4gJGlucHV0IHtcbiAgICAgICRvdXRwdXQ6IGFwcGVuZCgkb3V0cHV0LCAoJGkgKiAxJSksIGNvbW1hKTtcbiAgICB9XG4gIH1cblxuICBAcmV0dXJuICRvdXRwdXQ7XG59XG5cbi8vLyBQcmludHMgdGhlIENTUyBwcm9wZXJ0aWVzIGZyb20gYSBzcGVjaWZpYyBrZXkgaW4gYSBrZXlmcmFtZXMgbWFwLiBVc2VkIHRvIGJvcnJvdyBDU1MgZnJvbSBrZXlmcmFtZSBmdW5jdGlvbnMgZm9yIHVzZSBpbiB0cmFuc2l0aW9ucy5cbi8vLyBAcGFyYW0ge01hcH0gJGtmIC0gS2V5ZnJhbWUgbWFwIHRvIGV4dHJhY3QgZnJvbS5cbi8vLyBAcGFyYW0ge051bWJlcn0gJGtleSAtIEtleSBpbiB0aGUgbWFwIHRvIHByaW50IHRoZSBDU1Mgb2YuXG4vLy8gQGFjY2VzcyBwcml2YXRlXG5AbWl4aW4gLW11aS1rZXlmcmFtZS1nZXQoJGtmLCAka2V5KSB7XG4gICRtYXA6IG1hcC1nZXQoJGtmLCAka2V5KTtcblxuICBAZWFjaCAkcHJvcCwgJHZhbHVlIGluICRtYXAgb3IgKCkge1xuICAgIC8vIFNvbWUga2V5ZnJhbWUgbWFwcyBzdG9yZSB0cmFuc2Zvcm1zIGFzIHF1b3RlZCBzdHJpbmdzXG4gICAgQGlmIHR5cGUtb2YoJHZhbHVlKSA9PSAnc3RyaW5nJyB7XG4gICAgICAkdmFsdWU6IHVucXVvdGUoJHZhbHVlKTtcbiAgICB9XG4gICAgI3skcHJvcH06ICR2YWx1ZTtcbiAgfVxufVxuXG4vLy8gUmVmb3JtYXRzIGEgbWFwIGNvbnRhaW5pbmcga2V5cyB3aXRoIGEgbGlzdCBvZiB2YWx1ZXMsIHNvIHRoYXQgZWFjaCBrZXkgaXMgYSBzaW5nbGUgdmFsdWUuXG4vLy8gQHBhcmFtIHtNYXB9ICRtYXAgLSBNYXAgdG8gc3BsaXQgdXAuXG4vLy8gQHJldHVybiB7TWFwfSBBIHJlZm9ybWF0dGVkIG1hcC5cbi8vLyBAYWNjZXNzIHByaXZhdGVcbkBmdW5jdGlvbiAtbXVpLWtleWZyYW1lLXNwbGl0KCRtYXApIHtcbiAgJG5ldy1tYXA6ICgpO1xuXG4gIC8vIFNwbGl0IGtleXMgd2l0aCBtdWx0aXBsZSB2YWx1ZXMgaW50byBpbmRpdmlkdWFsIGtleXNcbiAgQGVhY2ggJGtleSwgJGl0ZW0gaW4gJG1hcCB7XG4gICAgJGtleS10eXBlOiB0eXBlLW9mKCRrZXkpO1xuXG4gICAgQGlmICRrZXktdHlwZSA9PSAnbnVtYmVyJyB7XG4gICAgICAkbmV3LW1hcDogbWFwLW1lcmdlKCRuZXctbWFwLCAoJGtleTogJGl0ZW0pKTtcbiAgICB9IEBlbHNlIGlmICRrZXktdHlwZSA9PSAnbGlzdCcge1xuICAgICAgQGVhY2ggJGsgaW4gJGtleSB7XG4gICAgICAgICRuZXctbWFwOiBtYXAtbWVyZ2UoJG5ldy1tYXAsICgkazogJGl0ZW0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAcmV0dXJuICRuZXctbWFwO1xufVxuXG4vLy8gQ29tYmluZXMgYSBzZXJpZXMgb2Yga2V5ZnJhbWUgb2JqZWN0cyBpbnRvIG9uZS5cbi8vLyBAcGFyYW0ge01hcH0gJG1hcHMuLi4gLSBBIHNlcmllcyBvZiBtYXBzIHRvIG1lcmdlLCBhcyBpbmRpdmlkdWFsIHBhcmFtZXRlcnMuXG4vLy8gQHJldHVybiB7TWFwfSBBIGNvbWJpbmVkIGtleWZyYW1lIG9iamVjdC5cbi8vLyBAYWNjZXNzIHByaXZhdGVcbkBmdW5jdGlvbiAtbXVpLWtleWZyYW1lLWNvbWJpbmUoJG1hcHMuLi4pIHtcbiAgJG5ldy1tYXA6ICgpO1xuXG4gIC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIG1hcCBwYXNzZWQgaW5cbiAgQGVhY2ggJG1hcCBpbiAkbWFwcyB7XG4gICAgQGlmIHR5cGUtb2YoJG1hcCkgPT0gJ3N0cmluZycge1xuICAgICAgJG1hcDogY2FsbCgkbWFwKTtcbiAgICB9XG5cbiAgICAkbWFwOiAtbXVpLWtleWZyYW1lLXNwbGl0KCRtYXApO1xuXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2gga2V5ZnJhbWUgaW4gdGhlIG1hcFxuICAgIC8vICRrZXkgaXMgdGhlIGtleWZyYW1lIHBlcmNlbnRhZ2VcbiAgICAvLyAkdmFsdWUgaXMgYSBtYXAgb2YgQ1NTIHByb3BlcnRpZXNcbiAgICBAZWFjaCAka2V5LCAkdmFsdWUgaW4gJG1hcCB7XG4gICAgICAkbmV3LXZhbHVlOiAoKTtcblxuICAgICAgQGlmIG1hcC1oYXMta2V5KCRuZXctbWFwLCAka2V5KSB7XG4gICAgICAgIC8vIElmIHRoZSBtYXAgYWxyZWFkeSBoYXMgdGhlIGtleWZyYW1lICUsIGFwcGVuZCB0aGUgbmV3IHByb3BlcnR5XG4gICAgICAgICRuZXctdmFsdWU6IC1tdWktbWVyZ2UtcHJvcGVydGllcyhtYXAtZ2V0KCRuZXctbWFwLCAka2V5KSwgJHZhbHVlKTtcbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSBhIG5ldyBtYXAgd2l0aCB0aGUgbmV3IHByb3BlcnR5XG4gICAgICAgICRuZXctdmFsdWU6ICR2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRmluYWxseSwgbWVyZ2UgdGhlIG1vZGlmaWVkIGtleWZyYW1lIHZhbHVlIGludG8gdGhlIG91dHB1dCBtYXBcbiAgICAgICRuZXctbWFwOiBtYXAtbWVyZ2UoJG5ldy1tYXAsICgka2V5OiAkbmV3LXZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWFrZSBhIG5hbWUgZm9yIHRoZSBrZXlmcmFtZXNcbiAgJC1tdWktY3VzdG9tOiAkLW11aS1jdXN0b20gKyAxICFnbG9iYWw7XG4gICRtYXAtbmFtZTogKG5hbWU6ICdjdXN0b20tI3skLW11aS1jdXN0b219Jyk7XG4gICRuZXctbWFwOiBtYXAtbWVyZ2UoJG5ldy1tYXAsICRtYXAtbmFtZSk7XG5cbiAgQHJldHVybiAkbmV3LW1hcDtcbn1cblxuLy8vIENvbWJpbmVzIHR3byBtYXBzIG9mIENTUyBwcm9wZXJ0aWVzIGludG8gb25lIG1hcC4gSWYgYm90aCBtYXBzIGhhdmUgYSB0cmFuc2Zvcm0gcHJvcGVydHksIHRoZSB2YWx1ZXMgZnJvbSBlYWNoIHdpbGwgYmUgY29tYmluZWQgaW50byBvbmUgcHJvcGVydHkuXG4vLy8gQHBhcmFtIHtNYXB9ICRvbmUgLSBGaXJzdCBtYXAgdG8gbWVyZ2UuXG4vLy8gQHBhcmFtIHtNYXB9ICR0d28gLSBTZWNvbmQgbWFwIHRvIG1lcmdlLlxuLy8vIEByZXR1cm4ge01hcH0gQSBjb21iaW5lZCBtYXAuXG4vLy8gQGFjY2VzcyBwcml2YXRlXG5AZnVuY3Rpb24gLW11aS1tZXJnZS1wcm9wZXJ0aWVzKCRvbmUsICR0d28pIHtcbiAgQGlmIG1hcC1oYXMta2V5KCRvbmUsIHRyYW5zZm9ybSkgYW5kIG1hcC1oYXMta2V5KCR0d28sIHRyYW5zZm9ybSkge1xuICAgICR0cmFuc2Zvcm06IGpvaW4obWFwLWdldCgkb25lLCB0cmFuc2Zvcm0pLCBtYXAtZ2V0KCR0d28sIHRyYW5zZm9ybSkpO1xuICAgICRvbmU6IG1hcC1tZXJnZSgkb25lLCAodHJhbnNmb3JtOiAkdHJhbnNmb3JtKSk7XG4gICAgJHR3bzogbWFwLXJlbW92ZSgkdHdvLCB0cmFuc2Zvcm0pO1xuICB9XG5cbiAgQHJldHVybiBtYXAtbWVyZ2UoJG9uZSwgJHR3byk7XG59XG4iLCIvLy8gQ3JlYXRlcyBhIHNsaWRpbmcgdHJhbnNpdGlvbiBieSB0cmFuc2xhdGluZyB0aGUgZWxlbWVudCBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseS5cbi8vLyBAcGFyYW0ge0tleXdvcmR9ICRzdGF0ZSBbaW5dIC0gU3RhdGUgdG8gdHJhbnNpdGlvbiB0by5cbi8vLyBAcGFyYW0ge0tleXdvcmR9ICRkaXJlY3Rpb24gW2xlZnRdIC0gU2lkZSBvZiB0aGUgZWxlbWVudCB0byBzbGlkZSBmcm9tLiBDYW4gYmUgYHRvcGAsIGByaWdodGAsIGBib3R0b21gLCBvciBgbGVmdGAuXG4vLy8gQHBhcmFtIHtMZW5ndGh9ICRhbW91bnQgWzEwMCVdIC0gTGVuZ3RoIG9mIHRoZSBzbGlkZSBhcyBhIHBlcmNlbnRhZ2UgdmFsdWUuXG4vLy8gQHBhcmFtIHtCb29sZWFufSAkZmFkZSBbZmFsc2VdIC0gU2V0IHRvIGB0cnVlYCB0byBmYWRlIHRoZSBlbGVtZW50IGluIG9yIG91dCBzaW11bHRhbmVvdXNseS5cbi8vLyBAcGFyYW0ge0R1cmF0aW9ufSAkZHVyYXRpb24gW251bGxdIC0gTGVuZ3RoIChzcGVlZCkgb2YgdGhlIHRyYW5zaXRpb24uXG4vLy8gQHBhcmFtIHtLZXl3b3JkfEZ1bmN0aW9ufSAkdGltaW5nIFtudWxsXSAtIEVhc2luZyBvZiB0aGUgdHJhbnNpdGlvbi5cbi8vLyBAcGFyYW0ge0R1cmF0aW9ufSAkZGVsYXkgW251bGxdIC0gRGVsYXkgaW4gc2Vjb25kcyBvciBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSB0cmFuc2l0aW9uIHN0YXJ0cy5cbkBtaXhpbiBtdWktc2xpZGUgKFxuICAkc3RhdGU6IGluLFxuICAkZGlyZWN0aW9uOiBsZWZ0LFxuICAkYW1vdW50OiAxMDAlLFxuICAkZmFkZTogbWFwLWdldCgkbW90aW9uLXVpLXNldHRpbmdzLCBzbGlkZS1hbmQtZmFkZSksXG4gICRkdXJhdGlvbjogbnVsbCxcbiAgJHRpbWluZzogbnVsbCxcbiAgJGRlbGF5OiBudWxsXG4pIHtcbiAgJHNsaWRlOiBzbGlkZSgkc3RhdGUsICRkaXJlY3Rpb24sICRhbW91bnQpO1xuXG4gIC8vIENTUyBPdXRwdXRcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbi1zdGFydCgkc3RhdGUpIHtcbiAgICBAaW5jbHVkZSB0cmFuc2l0aW9uLWJhc2ljcygkZHVyYXRpb24sICR0aW1pbmcsICRkZWxheSk7XG4gICAgQGluY2x1ZGUgLW11aS1rZXlmcmFtZS1nZXQoJHNsaWRlLCAwKTtcblxuICAgIEBpZiAkZmFkZSB7XG4gICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgICBvcGFjaXR5OiBpZigkc3RhdGUgPT0gaW4sIDAsIDEpO1xuICAgIH0gQGVsc2Uge1xuICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICAgIH1cblxuICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgfVxuXG4gIEBpbmNsdWRlIHRyYW5zaXRpb24tZW5kKCRzdGF0ZSkge1xuICAgIEBpbmNsdWRlIC1tdWkta2V5ZnJhbWUtZ2V0KCRzbGlkZSwgMTAwKTtcblxuICAgIEBpZiAkZmFkZSB7XG4gICAgICBvcGFjaXR5OiBpZigkc3RhdGUgPT0gaW4sIDEsIDApO1xuICAgIH1cbiAgfVxufVxuIiwiLy8vIEFwcGxpZXMgYmFzaWMgdHJhbnNpdGlvbiBzZXR0aW5ncyB0byBhbiBlbGVtZW50LlxuLy8vIEBwYXJhbSB7RHVyYXRpb259ICRkdXJhdGlvbiBbbnVsbF0gLSBMZW5ndGggKHNwZWVkKSBvZiB0aGUgdHJhbnNpdGlvbi5cbi8vLyBAcGFyYW0ge0tleXdvcmR8RnVuY3Rpb259ICR0aW1pbmcgW251bGxdIC0gRWFzaW5nIG9mIHRoZSB0cmFuc2l0aW9uLlxuLy8vIEBwYXJhbSB7RHVyYXRpb259ICRkZWxheSBbbnVsbF0gLSBEZWxheSBpbiBzZWNvbmRzIG9yIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHRyYW5zaXRpb24gc3RhcnRzLlxuQG1peGluIHRyYW5zaXRpb24tYmFzaWNzKFxuICAkZHVyYXRpb246IG51bGwsXG4gICR0aW1pbmc6IG51bGwsXG4gICRkZWxheTogbnVsbFxuKSB7XG4gIEBleHRlbmQgJW11aS1kZWZhdWx0cztcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogJGR1cmF0aW9uO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogJHRpbWluZztcbiAgdHJhbnNpdGlvbi1kZWxheTogJGRlbGF5O1xufVxuXG4vLy8gV3JhcHMgdGhlIGNvbnRlbnQgaW4gdGhlIHNldHVwIGNsYXNzIGZvciBhIHRyYW5zaXRpb24uXG4vLy8gQHBhcmFtIHtLZXl3b3JkfSAkZGlyIC0gU3RhdGUgdG8gc2V0dXAgZm9yIHRyYW5zaXRpb24uXG5AbWl4aW4gdHJhbnNpdGlvbi1zdGFydCgkZGlyKSB7XG4gICRzZWxlY3RvcjogLW11aS1idWlsZC1zZWxlY3RvcihtYXAtZ2V0KCRtb3Rpb24tdWktc3RhdGVzLCAkZGlyKSk7XG5cbiAgQGF0LXJvb3Qge1xuICAgICN7JHNlbGVjdG9yfSB7XG4gICAgICBAY29udGVudDtcbiAgICB9XG4gIH1cbn1cblxuLy8vIFdyYXBzIHRoZSBjb250ZW50IGluIHRoZSBhY3RpdmUgY2xhc3MgZm9yIGEgdHJhbnNpdGlvbi5cbi8vLyBAcGFyYW0ge0tleXdvcmR9ICRkaXIgLSBTdGF0ZSB0byBhY3RpdmF0ZSBhIHRyYW5zaXRpb24gb24uXG5AbWl4aW4gdHJhbnNpdGlvbi1lbmQoJGRpcikge1xuICAkc2VsZWN0b3I6IC1tdWktYnVpbGQtc2VsZWN0b3IobWFwLWdldCgkbW90aW9uLXVpLXN0YXRlcywgJGRpciksIHRydWUpO1xuXG4gIEBhdC1yb290IHtcbiAgICAjeyRzZWxlY3Rvcn0ge1xuICAgICAgQGNvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8vLyBBZGRzIHN0eWxlcyBmb3IgYSBzdGFnZ2VyIGFuaW1hdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBBbmd1bGFyJ3MgYG5nLXJlcGVhdGAuXG4vLy8gQHBhcmFtIHtEdXJhdGlvbn0gJGRlbGF5LWFtb3VudCAtIEFtb3VudCBvZiB0aW1lIGluIHNlY29uZHMgb3IgbWlsbGlzZWNvbmRzIHRvIGFkZCBiZXR3ZWVuIGVhY2ggaXRlbSdzIGFuaW1hdGlvbi5cbkBtaXhpbiBzdGFnZ2VyKCRkZWxheS1hbW91bnQpIHtcbiAgdHJhbnNpdGlvbi1kZWxheTogJGRlbGF5LWFtb3VudDtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMDsgLy8gUHJldmVudCBhY2NpZGVudGFsIENTUyBpbmhlcml0YW5jZVxufVxuIiwiLy8vIENyZWF0ZXMgYSBmYWRlIHRyYW5zaXRpb24gYnkgYWRqdXN0aW5nIHRoZSBvcGFjaXR5IG9mIHRoZSBlbGVtZW50LlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJHN0YXRlIFtpbl0gLSBTdGF0ZSB0byB0cmFuc2l0aW9uIHRvLlxuLy8vIEBwYXJhbSB7TnVtYmVyfSAkZnJvbSBbMF0gLSBPcGFjaXR5IHRvIHN0YXJ0IGF0LiBNdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS5cbi8vLyBAcGFyYW0ge051bWJlcn0gJHRvIFsxXSAtIE9wYWNpdHkgdG8gZW5kIG9uLlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJGR1cmF0aW9uIFtudWxsXSAtIExlbmd0aCAoc3BlZWQpIG9mIHRoZSB0cmFuc2l0aW9uLlxuLy8vIEBwYXJhbSB7S2V5d29yZHxGdW5jdGlvbn0gJHRpbWluZyBbbnVsbF0gLSBFYXNpbmcgb2YgdGhlIHRyYW5zaXRpb24uXG4vLy8gQHBhcmFtIHtEdXJhdGlvbn0gJGRlbGF5IFtudWxsXSAtIERlbGF5IGluIHNlY29uZHMgb3IgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgdHJhbnNpdGlvbiBzdGFydHMuXG5AbWl4aW4gbXVpLWZhZGUoXG4gICRzdGF0ZTogaW4sXG4gICRmcm9tOiAwLFxuICAkdG86IDEsXG4gICRkdXJhdGlvbjogbnVsbCxcbiAgJHRpbWluZzogbnVsbCxcbiAgJGRlbGF5OiBudWxsXG4pIHtcbiAgJGZhZGU6IGZhZGUoJGZyb20sICR0byk7XG5cbiAgQGluY2x1ZGUgdHJhbnNpdGlvbi1zdGFydCgkc3RhdGUpIHtcbiAgICBAaW5jbHVkZSB0cmFuc2l0aW9uLWJhc2ljcygkZHVyYXRpb24sICR0aW1pbmcsICRkZWxheSk7XG4gICAgQGluY2x1ZGUgLW11aS1rZXlmcmFtZS1nZXQoJGZhZGUsIDApO1xuXG4gICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTtcbiAgfVxuXG4gIEBpbmNsdWRlIHRyYW5zaXRpb24tZW5kKCRzdGF0ZSkge1xuICAgIEBpbmNsdWRlIC1tdWkta2V5ZnJhbWUtZ2V0KCRmYWRlLCAxMDApO1xuICB9XG59XG4iLCIvLy8gQ3JlYXRlcyBhIGhpbmdlIGVmZmVjdCBieSByb3RhdGluZyB0aGUgZWxlbWVudC5cbi8vLyBAcGFyYW0ge0tleXdvcmR9ICRzdGF0ZSBbaW5dIC0gU3RhdGUgdG8gdHJhbnNpdGlvbiB0by5cbi8vLyBAcGFyYW0ge0tleXdvcmR9ICRmcm9tIFtsZWZ0XSAtIEVkZ2Ugb2YgdGhlIGVsZW1lbnQgdG8gcm90YXRlIGZyb20uIENhbiBiZSBgdG9wYCwgYHJpZ2h0YCwgYGJvdHRvbWAsIG9yIGBsZWZ0YC5cbi8vLyBAcGFyYW0ge0tleXdvcmR9ICRheGlzIFtlZGdlXSAtIEF4aXMgb2YgdGhlIGVsZW1lbnQgdG8gcm90YXRlIG9uLiBDYW4gYmUgYGVkZ2VgIG9yIGBjZW50ZXJgLlxuLy8vIEBwYXJhbSB7TnVtYmVyfSAkcGVyc3BlY3RpdmUgWzIwMDBweF0gLSBQZXJjZWl2ZWQgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdmlld2VyIGFuZCB0aGUgZWxlbWVudC4gQSBoaWdoZXIgbnVtYmVyIHdpbGwgbWFrZSB0aGUgcm90YXRpb24gZWZmZWN0IG1vcmUgcHJvbm91bmNlZC5cbi8vLyBAcGFyYW0ge0tleXdvcmR9ICR0dXJuLW9yaWdpbiBbZnJvbS1iYWNrXSAtIFNpZGUgb2YgdGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIHJvdGF0aW9uIGZyb20uIENhbiBiZSBgZnJvbS1iYWNrYCBvciBgZnJvbS1mcm9udGAuXG5AZnVuY3Rpb24gaGluZ2UgKFxuICAkc3RhdGU6IGluLFxuICAkZnJvbTogbGVmdCxcbiAgJGF4aXM6IGVkZ2UsXG4gICRwZXJzcGVjdGl2ZTogMjAwMHB4LFxuICAkdHVybi1vcmlnaW46IGZyb20tYmFja1xuKSB7XG4gIC8vIFJvdGF0aW9uIGRpcmVjdGlvbnMgd2hlbiBoaW5naW5nIGZyb20gYmFjayB2cy4gZnJvbnRcbiAgJHJvdGF0aW9uLWFtb3VudDogOTBkZWc7XG4gICRyb3RhdGlvbnMtYmFjazogKFxuICAgIHRvcDogcm90YXRlWCgkcm90YXRpb24tYW1vdW50ICogLTEpLFxuICAgIHJpZ2h0OiByb3RhdGVZKCRyb3RhdGlvbi1hbW91bnQgKiAtMSksXG4gICAgYm90dG9tOiByb3RhdGVYKCRyb3RhdGlvbi1hbW91bnQpLFxuICAgIGxlZnQ6IHJvdGF0ZVkoJHJvdGF0aW9uLWFtb3VudCksXG4gICk7XG4gICRyb3RhdGlvbnMtZnJvbTogKFxuICAgIHRvcDogcm90YXRlWCgkcm90YXRpb24tYW1vdW50KSxcbiAgICByaWdodDogcm90YXRlWSgkcm90YXRpb24tYW1vdW50KSxcbiAgICBib3R0b206IHJvdGF0ZVgoJHJvdGF0aW9uLWFtb3VudCAqIC0xKSxcbiAgICBsZWZ0OiByb3RhdGVZKCRyb3RhdGlvbi1hbW91bnQgKiAtMSksXG4gICk7XG5cbiAgLy8gUm90YXRpb24gb3JpZ2luXG4gICRyb3RhdGlvbjogJyc7XG4gIEBpZiAkdHVybi1vcmlnaW4gPT0gZnJvbS1mcm9udCB7XG4gICAgJHJvdGF0aW9uOiBtYXAtZ2V0KCRyb3RhdGlvbnMtZnJvbSwgJGZyb20pO1xuICB9IEBlbHNlIGlmICR0dXJuLW9yaWdpbiA9PSBmcm9tLWJhY2sge1xuICAgICRyb3RhdGlvbjogbWFwLWdldCgkcm90YXRpb25zLWJhY2ssICRmcm9tKTtcbiAgfSBAZWxzZSB7XG4gICAgQHdhcm4gJyR0dXJuLW9yaWdpbiBtdXN0IGJlIGVpdGhlciBcImZyb20tYmFja1wiIG9yIFwiZnJvbS1mcm9udFwiJztcbiAgfVxuXG4gIC8vIFN0YXJ0IGFuZCBlbmQgc3RhdGVcbiAgJHN0YXJ0OiAnJztcbiAgJGVuZDogJyc7XG4gIEBpZiAkc3RhdGUgPT0gaW4ge1xuICAgICRzdGFydDogcGVyc3BlY3RpdmUoJHBlcnNwZWN0aXZlKSAkcm90YXRpb247XG4gICAgJGVuZDogcGVyc3BlY3RpdmUoJHBlcnNwZWN0aXZlKSByb3RhdGUoMGRlZyk7XG4gIH0gQGVsc2Uge1xuICAgICRzdGFydDogcGVyc3BlY3RpdmUoJHBlcnNwZWN0aXZlKSByb3RhdGUoMGRlZyk7XG4gICAgJGVuZDogcGVyc3BlY3RpdmUoJHBlcnNwZWN0aXZlKSAkcm90YXRpb247XG4gIH1cblxuICAvLyBUdXJuIGF4aXNcbiAgJG9yaWdpbjogJyc7XG4gIEBpZiAkYXhpcyA9PSBlZGdlIHtcbiAgICAkb3JpZ2luOiAkZnJvbTtcbiAgfSBAZWxzZSB7XG4gICAgJG9yaWdpbjogY2VudGVyO1xuICB9XG5cbiAgJGtleWZyYW1lczogKFxuICAgIG5hbWU6ICdoaW5nZS0jeyRzdGF0ZX0tI3skZnJvbX0tI3skYXhpc30tI3skdHVybi1vcmlnaW59JyxcbiAgICAwOiAodHJhbnNmb3JtOiAkc3RhcnQsIHRyYW5zZm9ybS1vcmlnaW46ICRvcmlnaW4pLFxuICAgIDEwMDogKHRyYW5zZm9ybTogJGVuZCksXG4gICk7XG5cbiAgQHJldHVybiAka2V5ZnJhbWVzO1xufVxuIiwiLy8vIENyZWF0ZXMgYSBoaW5nZSB0cmFuc2l0aW9uIGJ5IHJvdGF0aW5nIHRoZSBlbGVtZW50LlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJHN0YXRlIFtpbl0gLSBTdGF0ZSB0byB0cmFuc2l0aW9uIHRvLlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJGZyb20gW2xlZnRdIC0gRWRnZSBvZiB0aGUgZWxlbWVudCB0byByb3RhdGUgZnJvbS4gQ2FuIGJlIGB0b3BgLCBgcmlnaHRgLCBgYm90dG9tYCwgb3IgYGxlZnRgLlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJGF4aXMgW2VkZ2VdIC0gQXhpcyBvZiB0aGUgZWxlbWVudCB0byByb3RhdGUgb24uIENhbiBiZSBgZWRnZWAgb3IgYGNlbnRlcmAuXG4vLy8gQHBhcmFtIHtMZW5ndGh9ICRwZXJzcGVjdGl2ZSBbMjAwMHB4XSAtIFBlcmNlaXZlZCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB2aWV3ZXIgYW5kIHRoZSBlbGVtZW50LiBBIGhpZ2hlciBudW1iZXIgd2lsbCBtYWtlIHRoZSByb3RhdGlvbiBlZmZlY3QgbW9yZSBwcm9ub3VuY2VkLlxuLy8vIEBwYXJhbSB7S2V5d29yZH0gJHR1cm4tb3JpZ2luIFtmcm9tLWJhY2tdIC0gU2lkZSBvZiB0aGUgZWxlbWVudCB0byBzdGFydCB0aGUgcm90YXRpb24gZnJvbS4gQ2FuIGJlIGBmcm9tLWJhY2tgIG9yIGBmcm9tLWZyb250YC5cbi8vLyBAcGFyYW0ge0Jvb2xlYW59ICRmYWRlIFt0cnVlXSAtIFNldCB0byBgdHJ1ZWAgdG8gZmFkZSB0aGUgZWxlbWVudCBpbiBvciBvdXQgc2ltdWx0YW5lb3VzbHkuXG4vLy8gQHBhcmFtIHtEdXJhdGlvbn0gJGR1cmF0aW9uIFtudWxsXSAtIExlbmd0aCAoc3BlZWQpIG9mIHRoZSB0cmFuc2l0aW9uLlxuLy8vIEBwYXJhbSB7S2V5d29yZHxGdW5jdGlvbn0gJHRpbWluZyBbbnVsbF0gLSBFYXNpbmcgb2YgdGhlIHRyYW5zaXRpb24uXG4vLy8gQHBhcmFtIHtEdXJhdGlvbn0gJGRlbGF5IFtudWxsXSAtIERlbGF5IGluIHNlY29uZHMgb3IgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgdHJhbnNpdGlvbiBzdGFydHMuXG5AbWl4aW4gbXVpLWhpbmdlIChcbiAgJHN0YXRlOiBpbixcbiAgJGZyb206IGxlZnQsXG4gICRheGlzOiBlZGdlLFxuICAkcGVyc3BlY3RpdmU6IDIwMDBweCxcbiAgJHR1cm4tb3JpZ2luOiBmcm9tLWJhY2ssXG4gICRmYWRlOiBtYXAtZ2V0KCRtb3Rpb24tdWktc2V0dGluZ3MsIGhpbmdlLWFuZC1mYWRlKSxcbiAgJGR1cmF0aW9uOiBudWxsLFxuICAkdGltaW5nOiBudWxsLFxuICAkZGVsYXk6IG51bGxcbikge1xuICAkaGluZ2U6IGhpbmdlKCRzdGF0ZSwgJGZyb20sICRheGlzLCAkcGVyc3BlY3RpdmUsICR0dXJuLW9yaWdpbik7XG5cbiAgQGluY2x1ZGUgdHJhbnNpdGlvbi1zdGFydCgkc3RhdGUpIHtcbiAgICBAaW5jbHVkZSB0cmFuc2l0aW9uLWJhc2ljcygkZHVyYXRpb24sICR0aW1pbmcsICRkZWxheSk7XG4gICAgQGluY2x1ZGUgLW11aS1rZXlmcmFtZS1nZXQoJGhpbmdlLCAwKTtcblxuICAgIEBpZiAkZmFkZSB7XG4gICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgICBvcGFjaXR5OiBpZigkc3RhdGUgPT0gaW4sIDAsIDEpO1xuICAgIH0gQGVsc2Uge1xuICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICAgIH1cbiAgfVxuXG4gIEBpbmNsdWRlIHRyYW5zaXRpb24tZW5kKCRzdGF0ZSkge1xuICAgIEBpbmNsdWRlIC1tdWkta2V5ZnJhbWUtZ2V0KCRoaW5nZSwgMTAwKTtcblxuICAgIEBpZiAkZmFkZSB7XG4gICAgICBvcGFjaXR5OiBpZigkc3RhdGUgPT0gaW4sIDEsIDApO1xuICAgIH1cbiAgfVxufVxuIiwiLy8vIENyZWF0ZXMgYSBzY2FsaW5nIHRyYW5zaXRpb24uIEEgc2NhbGUgb2YgYDFgIG1lYW5zIHRoZSBlbGVtZW50IGlzIHRoZSBzYW1lIHNpemUuIExhcmdlciBudW1iZXJzIG1ha2UgdGhlIGVsZW1lbnQgYmlnZ2VyLCB3aGlsZSBudW1iZXJzIGxlc3MgdGhhbiAxIG1ha2UgdGhlIGVsZW1lbnQgc21hbGxlci5cbi8vLyBAcGFyYW0ge0tleXdvcmR9ICRzdGF0ZSBbaW5dIC0gU3RhdGUgdG8gdHJhbnNpdGlvbiB0by5cbi8vLyBAcGFyYW0ge051bWJlcn0gJGZyb20gWzEuNV0gLSBTaXplIHRvIHN0YXJ0IGF0LlxuLy8vIEBwYXJhbSB7TnVtYmVyfSAkZnJvbSBbMV0gLSBTaXplIHRvIGVuZCBhdC5cbi8vLyBAcGFyYW0ge0Jvb2xlYW59ICRmYWRlIFt0cnVlXSAtIFNldCB0byBgdHJ1ZWAgdG8gZmFkZSB0aGUgZWxlbWVudCBpbiBvciBvdXQgc2ltdWx0YW5lb3VzbHkuXG4vLy8gQHBhcmFtIHtEdXJhdGlvbn0gJGR1cmF0aW9uIFtudWxsXSAtIExlbmd0aCAoc3BlZWQpIG9mIHRoZSB0cmFuc2l0aW9uLlxuLy8vIEBwYXJhbSB7S2V5d29yZHxGdW5jdGlvbn0gJHRpbWluZyBbbnVsbF0gLSBFYXNpbmcgb2YgdGhlIHRyYW5zaXRpb24uXG4vLy8gQHBhcmFtIHtEdXJhdGlvbn0gJGRlbGF5IFtudWxsXSAtIERlbGF5IGluIHNlY29uZHMgb3IgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgdHJhbnNpdGlvbiBzdGFydHMuXG5AbWl4aW4gbXVpLXpvb20oXG4gICRzdGF0ZTogaW4sXG4gICRmcm9tOiAxLjUsXG4gICR0bzogMSxcbiAgJGZhZGU6IG1hcC1nZXQoJG1vdGlvbi11aS1zZXR0aW5ncywgc2NhbGUtYW5kLWZhZGUpLFxuICAkZHVyYXRpb246IG51bGwsXG4gICR0aW1pbmc6IG51bGwsXG4gICRkZWxheTogbnVsbFxuKSB7XG4gICRzY2FsZTogem9vbSgkZnJvbSwgJHRvKTtcblxuICBAaW5jbHVkZSB0cmFuc2l0aW9uLXN0YXJ0KCRzdGF0ZSkge1xuICAgIEBpbmNsdWRlIHRyYW5zaXRpb24tYmFzaWNzKCRkdXJhdGlvbiwgJHRpbWluZywgJGRlbGF5KTtcbiAgICBAaW5jbHVkZSAtbXVpLWtleWZyYW1lLWdldCgkc2NhbGUsIDApO1xuXG4gICAgQGlmICRmYWRlIHtcbiAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgICAgIG9wYWNpdHk6IGlmKCRzdGF0ZSA9PSBpbiwgMCwgMSk7XG4gICAgfSBAZWxzZSB7XG4gICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgfVxuICB9XG5cbiAgQGluY2x1ZGUgdHJhbnNpdGlvbi1lbmQoJHN0YXRlKSB7XG4gICAgQGluY2x1ZGUgLW11aS1rZXlmcmFtZS1nZXQoJHNjYWxlLCAxMDApO1xuXG4gICAgQGlmICRmYWRlIHtcbiAgICAgIG9wYWNpdHk6IGlmKCRzdGF0ZSA9PSBpbiwgMSwgMCk7XG4gICAgfVxuICB9XG59XG4iLCIvLy8gQ3JlYXRlcyBhIHNwaW5uaW5nIHRyYW5zaXRpb24gYnkgcm90YXRpbmcgdGhlIGVsZW1lbnQuIFRoZSBgdHVybmAgdW5pdCBpcyB1c2VkIHRvIHNwZWNpZnkgaG93IGZhciB0byByb3RhdGUuIGAxdHVybmAgaXMgZXF1YWwgdG8gYSAzNjAtZGVncmVlIHNwaW4uXG4vLy8gQHBhcmFtIHtLZXl3b3JkfSAkc3RhdGUgW2luXSAtIFN0YXRlIHRvIHRyYW5zaXRpb24gdG8uXG4vLy8gQHBhcmFtIHtCb29sZWFufSAkZGlyZWN0aW9uIFtjd10gLSBEaXJlY3Rpb24gdG8gc3Bpbi4gU2hvdWxkIGJlIGBjd2AgKGNsb2Nrd2lzZSkgb3IgYGNjd2AgKGNvdW50ZXJjbG9ja3dpc2UpLlxuLy8vIEBwYXJhbSB7TnVtYmVyfSAkYW1vdW50IFswLjc1dHVybl0gLSBBbW91bnQgdG8gZWxlbWVudCB0aGUgZWxlbWVudC5cbi8vLyBAcGFyYW0ge0Jvb2xlYW59ICRmYWRlIFtmYWxzZV0gLSBTZXQgdG8gYHRydWVgIHRvIGZhZGUgdGhlIGVsZW1lbnQgaW4gb3Igb3V0IHNpbXVsdGFuZW91c2x5LlxuLy8vIEBwYXJhbSB7RHVyYXRpb259ICRkdXJhdGlvbiBbbnVsbF0gLSBMZW5ndGggKHNwZWVkKSBvZiB0aGUgdHJhbnNpdGlvbi5cbi8vLyBAcGFyYW0ge0tleXdvcmR8RnVuY3Rpb259ICR0aW1pbmcgW251bGxdIC0gRWFzaW5nIG9mIHRoZSB0cmFuc2l0aW9uLlxuLy8vIEBwYXJhbSB7RHVyYXRpb259ICRkZWxheSBbbnVsbF0gLSBEZWxheSBpbiBzZWNvbmRzIG9yIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHRyYW5zaXRpb24gc3RhcnRzLlxuQG1peGluIG11aS1zcGluKFxuICAkc3RhdGU6IGluLFxuICAkZGlyZWN0aW9uOiBjdyxcbiAgJGFtb3VudDogMC43NXR1cm4sXG4gICRmYWRlOiBtYXAtZ2V0KCRtb3Rpb24tdWktc2V0dGluZ3MsIHNwaW4tYW5kLWZhZGUpLFxuICAkZHVyYXRpb246IG51bGwsXG4gICR0aW1pbmc6IG51bGwsXG4gICRkZWxheTogbnVsbFxuKSB7XG4gICRzcGluOiBzcGluKCRzdGF0ZSwgJGRpcmVjdGlvbiwgJGFtb3VudCk7XG5cbiAgQGluY2x1ZGUgdHJhbnNpdGlvbi1zdGFydCgkc3RhdGUpIHtcbiAgICBAaW5jbHVkZSB0cmFuc2l0aW9uLWJhc2ljcygkZHVyYXRpb24sICR0aW1pbmcsICRkZWxheSk7XG4gICAgQGluY2x1ZGUgLW11aS1rZXlmcmFtZS1nZXQoJHNwaW4sIDApO1xuXG4gICAgQGlmICRmYWRlIHtcbiAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgICAgIG9wYWNpdHk6IGlmKCRzdGF0ZSA9PSBpbiwgMCwgMSk7XG4gICAgfSBAZWxzZSB7XG4gICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgfVxuICB9XG5cbiAgQGluY2x1ZGUgdHJhbnNpdGlvbi1lbmQoJHN0YXRlKSB7XG4gICAgQGluY2x1ZGUgLW11aS1rZXlmcmFtZS1nZXQoJHNwaW4sIDEwMCk7XG5cbiAgICBAaWYgJGZhZGUge1xuICAgICAgb3BhY2l0eTogaWYoJHN0YXRlID09IGluLCAxLCAwKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vLyBDcmVhdGVzIGEga2V5ZnJhbWUgZnJvbSBvbmUgb3IgbW9yZSBlZmZlY3QgZnVuY3Rpb25zIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBlbGVtZW50IGJ5IGFkZGluZyB0aGUgYGFuaW1hdGlvbi1uYW1lYCBwcm9wZXJ0eS5cbi8vLyBAcGFyYW0ge0Z1bmN0aW9ufSAkZWZmZWN0cy4uLiAtIE9uZSBvciBtb3JlIGVmZmVjdCBmdW5jdGlvbnMgdG8gYnVpbGQgdGhlIGtleWZyYW1lIHdpdGguXG5AbWl4aW4gbXVpLWFuaW1hdGlvbigkYXJncy4uLikge1xuICAkbmFtZTogbWFwLWdldCgtbXVpLXByb2Nlc3MtYXJncygkYXJncy4uLiksIG5hbWUpO1xuICBAaW5jbHVkZSBtdWkta2V5ZnJhbWVzKCRuYW1lLCAkYXJncy4uLik7XG4gIGFuaW1hdGlvbi1uYW1lOiB1bnF1b3RlKCRuYW1lKTtcbn1cbiIsIkBjaGFyc2V0ICd1dGYtOCc7XG5cbkBpbXBvcnQgJ3NldHRpbmdzJztcbkBpbXBvcnQgJ2ZvdW5kYXRpb24nO1xuQGltcG9ydCAnbW90aW9uLXVpJztcblxuQGluY2x1ZGUgZm91bmRhdGlvbi1nbG9iYWwtc3R5bGVzO1xuQGluY2x1ZGUgZm91bmRhdGlvbi1ncmlkO1xuQGluY2x1ZGUgZm91bmRhdGlvbi10eXBvZ3JhcGh5O1xuQGluY2x1ZGUgZm91bmRhdGlvbi1idXR0b247XG5AaW5jbHVkZSBmb3VuZGF0aW9uLWZvcm1zO1xuQGluY2x1ZGUgZm91bmRhdGlvbi12aXNpYmlsaXR5LWNsYXNzZXM7XG5AaW5jbHVkZSBmb3VuZGF0aW9uLWZsb2F0LWNsYXNzZXM7XG5AaW5jbHVkZSBmb3VuZGF0aW9uLWFjY29yZGlvbjtcbkBpbmNsdWRlIGZvdW5kYXRpb24tYWNjb3JkaW9uLW1lbnU7XG5AaW5jbHVkZSBmb3VuZGF0aW9uLWJhZGdlO1xuQGluY2x1ZGUgZm91bmRhdGlvbi1icmVhZGNydW1icztcbkBpbmNsdWRlIGZvdW5kYXRpb24tYnV0dG9uLWdyb3VwO1xuQGluY2x1ZGUgZm91bmRhdGlvbi1jYWxsb3V0O1xuQGluY2x1ZGUgZm91bmRhdGlvbi1jbG9zZS1idXR0b247XG5AaW5jbHVkZSBmb3VuZGF0aW9uLWRyaWxsZG93bi1tZW51O1xuQGluY2x1ZGUgZm91bmRhdGlvbi1kcm9wZG93bjtcbkBpbmNsdWRlIGZvdW5kYXRpb24tZHJvcGRvd24tbWVudTtcbkBpbmNsdWRlIGZvdW5kYXRpb24tZmxleC12aWRlbztcbkBpbmNsdWRlIGZvdW5kYXRpb24tbGFiZWw7XG5AaW5jbHVkZSBmb3VuZGF0aW9uLW1lZGlhLW9iamVjdDtcbkBpbmNsdWRlIGZvdW5kYXRpb24tbWVudTtcbkBpbmNsdWRlIGZvdW5kYXRpb24tb2ZmLWNhbnZhcztcbkBpbmNsdWRlIGZvdW5kYXRpb24tb3JiaXQ7XG5AaW5jbHVkZSBmb3VuZGF0aW9uLXBhZ2luYXRpb247XG5AaW5jbHVkZSBmb3VuZGF0aW9uLXByb2dyZXNzLWJhcjtcbkBpbmNsdWRlIGZvdW5kYXRpb24tc2xpZGVyO1xuQGluY2x1ZGUgZm91bmRhdGlvbi1zdGlja3k7XG5AaW5jbHVkZSBmb3VuZGF0aW9uLXJldmVhbDtcbkBpbmNsdWRlIGZvdW5kYXRpb24tc3dpdGNoO1xuQGluY2x1ZGUgZm91bmRhdGlvbi10YWJsZTtcbkBpbmNsdWRlIGZvdW5kYXRpb24tdGFicztcbkBpbmNsdWRlIGZvdW5kYXRpb24tdGh1bWJuYWlsO1xuQGluY2x1ZGUgZm91bmRhdGlvbi10aXRsZS1iYXI7XG5AaW5jbHVkZSBmb3VuZGF0aW9uLXRvb2x0aXA7XG5AaW5jbHVkZSBmb3VuZGF0aW9uLXRvcC1iYXI7XG5cbkBpbmNsdWRlIG1vdGlvbi11aS10cmFuc2l0aW9ucztcbkBpbmNsdWRlIG1vdGlvbi11aS1hbmltYXRpb25zO1xuXG5tYWluIHtjbGVhcjpib3RoO31cblxuLmxheW91dC1jb250ZW50IHtwYWRkaW5nOjNlbSAyJTt9XG4ubGF5b3V0LWdyZXkge1xuICAgIHBhZGRpbmc6M2VtIDIlO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjI5LCAyMjksIDIyOSwgMC41KTtcbiAgICBiYWNrZ3JvdW5kOiAjZTVlNWU1O1xufVxuLmdsb2JhbC1oZWFkZXIge3BhZGRpbmc6IDAgMiU7IG1hcmdpbi1ib3R0b206IDUwcHg7Ym94LXNoYWRvdzogMCAwIDVweCByZ2JhKDAsIDAsIDAsIDAuMTgpO2JvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO31cbi5nbG9iYWwtaGVhZGVyLWxvZ28ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIC8qIGZsb2F0OiBsZWZ0OyAqL1xuICAgIG1hcmdpbjogOHB4IGF1dG87XG4gICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC40cyBlYXNlO1xuICAgIHRyYW5zaXRpb246IGFsbCAwLjRzIGVhc2U7XG4gICAgd2lkdGg6IDZlbTtcbn1cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQwZW0pIHtcblx0Lmdsb2JhbC1oZWFkZXItbG9nbyB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgd2lkdGg6IDhlbTtcbiAgICBtYXJnaW46IDFlbSBhdXRvO1xufVxufVxuXG5cblxuJG1lbnUtaXRlbS1wYWRkaW5nOiAyNHB4IDI0cHg7XG4ubmF2LWdsb2JhbC1zZWNvbmRhcnkgbGkge2ZvbnQtd2VpZ2h0OiA3MDA7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO31cbi5uYXYtZ2xvYmFsLXNlY29uZGFyeSBsaSBhIHtjb2xvcjogYmxhY2s7fVxuLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IGEuc3RhdGUtYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmMyOTZiO1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBcbn1cbi5uYXYtZ2xvYmFsLXNlY29uZGFyeSwgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IHVsIHtcbiAgICBcbiAgICBAaW5jbHVkZSBtZW51LWJhc2U7XG4gICAgLy8gT3JpZW50YXRpb25cbiAgICBAaW5jbHVkZSBtZW51LWRpcmVjdGlvbihob3Jpem9udGFsKTtcbiAgICBcbiAgICAmLnZlcnRpY2FsIHtAaW5jbHVkZSBtZW51LWRpcmVjdGlvbigndmVydGljYWwnKTt9XG4gICAgQGVhY2ggJHNpemUgaW4gJGJyZWFrcG9pbnQtY2xhc3NlcyB7XG4gICAgICBAaWYgJHNpemUgIT0gc21hbGwge1xuICAgICAgICBAaW5jbHVkZSBicmVha3BvaW50KCRzaXplKSB7XG4gICAgICAgICAgJi4jeyRzaXplfS1ob3Jpem9udGFsIHtcbiAgICAgICAgICAgIEBpbmNsdWRlIG1lbnUtZGlyZWN0aW9uKGhvcml6b250YWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICYuI3skc2l6ZX0tdmVydGljYWwge1xuICAgICAgICAgICAgQGluY2x1ZGUgbWVudS1kaXJlY3Rpb24odmVydGljYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5lc3RpbmdcbiAgICAmLm5lc3RlZCB7XG4gICAgICBAaW5jbHVkZSBtZW51LW5lc3RlZDtcbiAgICB9XG5cbiAgICAvLyBBbGlnbiByaWdodFxuICAgICYuYWxpZ24tI3skZ2xvYmFsLXJpZ2h0fSB7XG4gICAgICAgIGZsb2F0OnJpZ2h0O1xuICAgIH1cblxuICAgICYubmF2LXRpZXIyIGxpIHtmb250LXdlaWdodDogbm9ybWFsO31cbiAgICBcbn1cbi5uYXYtZ2xvYmFsLXNlY29uZGFyeSAubmF2LXRpZXIyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBmbG9hdDogcmlnaHQ7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWwgIWltcG9ydGFudDtcbiAgICBsZWZ0OiBhdXRvO1xuICAgIG1hcmdpbi1sZWZ0OiAtOTk5OXB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcGFkZGluZzogMCAyJSAwIDk5OTlweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDA7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgd2lkdGg6IGF1dG87XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQwZW0pIHtcbiAgICAubmF2LWdsb2JhbC1zZWNvbmRhcnkgdWwge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IC5uYXYtdGllcjIgbGkge1xuICAgICAgICBmbG9hdDpsZWZ0O1xuICAgICAgICBjbGVhcjogYm90aDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgfVxuXG4gICAgLm5hdi1nbG9iYWwtc2Vjb25kYXJ5IC5uYXYtdGllcjIge1xuICAgICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICAgIHBhZGRpbmc6IDAuNWVtIDAgMWVtIDA7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDEuNWVtO1xuICAgIH1cbn1cblxuLmJ1dHRvbi5sb2dpbiB7XG4gICAgcGFkZGluZzoxMnB4IDI2cHg7IFxuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBtYXJnaW4tbGVmdDogMS41ZW07XG4gICAgY29sb3I6ICNmZmY7XG59XG5cbi5tYXN0aGVhZCB7XG4gICAgY2xlYXI6IGJvdGg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBcbn1cblxuLm1hc3RoZWFkOmJlZm9yZSB7XG4gICAgYmFja2dyb3VuZDogdXJsKFwiaHR0cHM6Ly9zdHlsZS5jb2RlZm9yYW1lcmljYS5vcmcvMy9zdHlsZS9pbWFnZXMvaW1hZ2VzL21hc3RoZWFkLWRlZmF1bHQuanBnXCIpIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XG4gICAgY29udGVudDogXCJcIjtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIGxlZnQ6IDA7XG4gICAgbWF4LXdpZHRoOiBub25lO1xuICAgIG1pbi1oZWlnaHQ6IDQwMHB4O1xuICAgIG9wYWNpdHk6IDAuODtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHotaW5kZXg6IDE7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5tYXN0aGVhZC1oZWFkZXIge1xuICAgIGNsZWFyOiBib3RoO1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbjogMGVtIGF1dG87XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwYWRkaW5nOiAwIDQlO1xuICAgIHBvc2l0aW9uOiBpbmhlcml0O1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIHotaW5kZXg6IDE7XG4gICAgdGV4dC1zaGFkb3c6IDBweCAwcHggM3B4IHJnYmEoMCwwLDAsMC42KTtcbn1cblxuLm1hc3RoZWFkLWhlYWRlciAucGFnZS10aXRsZSBhOmxpbmssIC5tYXN0aGVhZC1oZWFkZXIgLnBhZ2UtdGl0bGUgYTp2aXNpdGVkLCAubWFzdGhlYWQtaGVhZGVyIC5wYWdlLXRpdGxlIGE6aG92ZXIsIC5tYXN0aGVhZC1oZWFkZXIgLnBhZ2UtdGl0bGUgYTpmb2N1cywgLm1hc3RoZWFkLWhlYWRlciAucGFnZS10aXRsZSBhOmFjdGl2ZSB7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxufVxuXG4ubWFzdGhlYWQtaGVhZGVyIGgxLnBhZ2UtdGl0bGUge1xuICAgIG1heC13aWR0aDogNDBlbTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gICAgbWFyZ2luLXRvcDogOTZweDtcbn1cblxuLm1hc3RoZWFkLWhlYWRlciBwIHtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgZm9udC1zaXplOiAyNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAzNXB4O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgbWF4LXdpZHRoOiAyNWVtO1xuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIG1hcmdpbi1yaWdodDogYXV0bztcbn1cblxuLm1hc3RoZWFkLXhsIC5tYXN0aGVhZC1oZWFkZXI6YmVmb3JlIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJodHRwczovL3N0eWxlLmNvZGVmb3JhbWVyaWNhLm9yZy8zL3N0eWxlL2ltYWdlcy9mYWRlLWJsYWNrLnBuZ1wiKTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIGhlaWdodDogMzAwcHg7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgei1pbmRleDogLTE7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG5cbi5nbG9iYWwtZm9vdGVyIHtcbiAgICAmIHtwb3NpdGlvbjogcmVsYXRpdmU7YmFja2dyb3VuZDogIzAwMDtjb2xvcjogI2ZmZjtwYWRkaW5nOjJlbSAyZW0gMWVtIDJlbTt9XG4gICAgLmxvZ28ge1xuICAgICAgICBsZWZ0OiAyJTtcbiAgICAgICAgbWFyZ2luOiAxNnB4IDE2cHggMTZweCAwO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHdpZHRoOiAxMDBweDtcbiAgICB9XG5cbiAgICBzbWFsbCB7XG4gICAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgICBtYXJnaW46IDEwcHggMCAxMHB4IDEyMHB4O1xuICAgIH1cbn1cblxuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9 */ |
This file has been truncated, but you can view the full file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /*! | |
| * jQuery JavaScript Library v2.1.4 | |
| * http://jquery.com/ | |
| * | |
| * Includes Sizzle.js | |
| * http://sizzlejs.com/ | |
| * | |
| * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors | |
| * Released under the MIT license | |
| * http://jquery.org/license | |
| * | |
| * Date: 2015-04-28T16:01Z | |
| */ | |
| (function( global, factory ) { | |
| if ( typeof module === "object" && typeof module.exports === "object" ) { | |
| // For CommonJS and CommonJS-like environments where a proper `window` | |
| // is present, execute the factory and get jQuery. | |
| // For environments that do not have a `window` with a `document` | |
| // (such as Node.js), expose a factory as module.exports. | |
| // This accentuates the need for the creation of a real `window`. | |
| // e.g. var jQuery = require("jquery")(window); | |
| // See ticket #14549 for more info. | |
| module.exports = global.document ? | |
| factory( global, true ) : | |
| function( w ) { | |
| if ( !w.document ) { | |
| throw new Error( "jQuery requires a window with a document" ); | |
| } | |
| return factory( w ); | |
| }; | |
| } else { | |
| factory( global ); | |
| } | |
| // Pass this if window is not defined yet | |
| }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { | |
| // Support: Firefox 18+ | |
| // Can't be in strict mode, several libs including ASP.NET trace | |
| // the stack via arguments.caller.callee and Firefox dies if | |
| // you try to trace through "use strict" call chains. (#13335) | |
| // | |
| var arr = []; | |
| var slice = arr.slice; | |
| var concat = arr.concat; | |
| var push = arr.push; | |
| var indexOf = arr.indexOf; | |
| var class2type = {}; | |
| var toString = class2type.toString; | |
| var hasOwn = class2type.hasOwnProperty; | |
| var support = {}; | |
| var | |
| // Use the correct document accordingly with window argument (sandbox) | |
| document = window.document, | |
| version = "2.1.4", | |
| // Define a local copy of jQuery | |
| jQuery = function( selector, context ) { | |
| // The jQuery object is actually just the init constructor 'enhanced' | |
| // Need init if jQuery is called (just allow error to be thrown if not included) | |
| return new jQuery.fn.init( selector, context ); | |
| }, | |
| // Support: Android<4.1 | |
| // Make sure we trim BOM and NBSP | |
| rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, | |
| // Matches dashed string for camelizing | |
| rmsPrefix = /^-ms-/, | |
| rdashAlpha = /-([\da-z])/gi, | |
| // Used by jQuery.camelCase as callback to replace() | |
| fcamelCase = function( all, letter ) { | |
| return letter.toUpperCase(); | |
| }; | |
| jQuery.fn = jQuery.prototype = { | |
| // The current version of jQuery being used | |
| jquery: version, | |
| constructor: jQuery, | |
| // Start with an empty selector | |
| selector: "", | |
| // The default length of a jQuery object is 0 | |
| length: 0, | |
| toArray: function() { | |
| return slice.call( this ); | |
| }, | |
| // Get the Nth element in the matched element set OR | |
| // Get the whole matched element set as a clean array | |
| get: function( num ) { | |
| return num != null ? | |
| // Return just the one element from the set | |
| ( num < 0 ? this[ num + this.length ] : this[ num ] ) : | |
| // Return all the elements in a clean array | |
| slice.call( this ); | |
| }, | |
| // Take an array of elements and push it onto the stack | |
| // (returning the new matched element set) | |
| pushStack: function( elems ) { | |
| // Build a new jQuery matched element set | |
| var ret = jQuery.merge( this.constructor(), elems ); | |
| // Add the old object onto the stack (as a reference) | |
| ret.prevObject = this; | |
| ret.context = this.context; | |
| // Return the newly-formed element set | |
| return ret; | |
| }, | |
| // Execute a callback for every element in the matched set. | |
| // (You can seed the arguments with an array of args, but this is | |
| // only used internally.) | |
| each: function( callback, args ) { | |
| return jQuery.each( this, callback, args ); | |
| }, | |
| map: function( callback ) { | |
| return this.pushStack( jQuery.map(this, function( elem, i ) { | |
| return callback.call( elem, i, elem ); | |
| })); | |
| }, | |
| slice: function() { | |
| return this.pushStack( slice.apply( this, arguments ) ); | |
| }, | |
| first: function() { | |
| return this.eq( 0 ); | |
| }, | |
| last: function() { | |
| return this.eq( -1 ); | |
| }, | |
| eq: function( i ) { | |
| var len = this.length, | |
| j = +i + ( i < 0 ? len : 0 ); | |
| return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); | |
| }, | |
| end: function() { | |
| return this.prevObject || this.constructor(null); | |
| }, | |
| // For internal use only. | |
| // Behaves like an Array's method, not like a jQuery method. | |
| push: push, | |
| sort: arr.sort, | |
| splice: arr.splice | |
| }; | |
| jQuery.extend = jQuery.fn.extend = function() { | |
| var options, name, src, copy, copyIsArray, clone, | |
| target = arguments[0] || {}, | |
| i = 1, | |
| length = arguments.length, | |
| deep = false; | |
| // Handle a deep copy situation | |
| if ( typeof target === "boolean" ) { | |
| deep = target; | |
| // Skip the boolean and the target | |
| target = arguments[ i ] || {}; | |
| i++; | |
| } | |
| // Handle case when target is a string or something (possible in deep copy) | |
| if ( typeof target !== "object" && !jQuery.isFunction(target) ) { | |
| target = {}; | |
| } | |
| // Extend jQuery itself if only one argument is passed | |
| if ( i === length ) { | |
| target = this; | |
| i--; | |
| } | |
| for ( ; i < length; i++ ) { | |
| // Only deal with non-null/undefined values | |
| if ( (options = arguments[ i ]) != null ) { | |
| // Extend the base object | |
| for ( name in options ) { | |
| src = target[ name ]; | |
| copy = options[ name ]; | |
| // Prevent never-ending loop | |
| if ( target === copy ) { | |
| continue; | |
| } | |
| // Recurse if we're merging plain objects or arrays | |
| if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { | |
| if ( copyIsArray ) { | |
| copyIsArray = false; | |
| clone = src && jQuery.isArray(src) ? src : []; | |
| } else { | |
| clone = src && jQuery.isPlainObject(src) ? src : {}; | |
| } | |
| // Never move original objects, clone them | |
| target[ name ] = jQuery.extend( deep, clone, copy ); | |
| // Don't bring in undefined values | |
| } else if ( copy !== undefined ) { | |
| target[ name ] = copy; | |
| } | |
| } | |
| } | |
| } | |
| // Return the modified object | |
| return target; | |
| }; | |
| jQuery.extend({ | |
| // Unique for each copy of jQuery on the page | |
| expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), | |
| // Assume jQuery is ready without the ready module | |
| isReady: true, | |
| error: function( msg ) { | |
| throw new Error( msg ); | |
| }, | |
| noop: function() {}, | |
| isFunction: function( obj ) { | |
| return jQuery.type(obj) === "function"; | |
| }, | |
| isArray: Array.isArray, | |
| isWindow: function( obj ) { | |
| return obj != null && obj === obj.window; | |
| }, | |
| isNumeric: function( obj ) { | |
| // parseFloat NaNs numeric-cast false positives (null|true|false|"") | |
| // ...but misinterprets leading-number strings, particularly hex literals ("0x...") | |
| // subtraction forces infinities to NaN | |
| // adding 1 corrects loss of precision from parseFloat (#15100) | |
| return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; | |
| }, | |
| isPlainObject: function( obj ) { | |
| // Not plain objects: | |
| // - Any object or value whose internal [[Class]] property is not "[object Object]" | |
| // - DOM nodes | |
| // - window | |
| if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { | |
| return false; | |
| } | |
| if ( obj.constructor && | |
| !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { | |
| return false; | |
| } | |
| // If the function hasn't returned already, we're confident that | |
| // |obj| is a plain object, created by {} or constructed with new Object | |
| return true; | |
| }, | |
| isEmptyObject: function( obj ) { | |
| var name; | |
| for ( name in obj ) { | |
| return false; | |
| } | |
| return true; | |
| }, | |
| type: function( obj ) { | |
| if ( obj == null ) { | |
| return obj + ""; | |
| } | |
| // Support: Android<4.0, iOS<6 (functionish RegExp) | |
| return typeof obj === "object" || typeof obj === "function" ? | |
| class2type[ toString.call(obj) ] || "object" : | |
| typeof obj; | |
| }, | |
| // Evaluates a script in a global context | |
| globalEval: function( code ) { | |
| var script, | |
| indirect = eval; | |
| code = jQuery.trim( code ); | |
| if ( code ) { | |
| // If the code includes a valid, prologue position | |
| // strict mode pragma, execute code by injecting a | |
| // script tag into the document. | |
| if ( code.indexOf("use strict") === 1 ) { | |
| script = document.createElement("script"); | |
| script.text = code; | |
| document.head.appendChild( script ).parentNode.removeChild( script ); | |
| } else { | |
| // Otherwise, avoid the DOM node creation, insertion | |
| // and removal by using an indirect global eval | |
| indirect( code ); | |
| } | |
| } | |
| }, | |
| // Convert dashed to camelCase; used by the css and data modules | |
| // Support: IE9-11+ | |
| // Microsoft forgot to hump their vendor prefix (#9572) | |
| camelCase: function( string ) { | |
| return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); | |
| }, | |
| nodeName: function( elem, name ) { | |
| return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); | |
| }, | |
| // args is for internal usage only | |
| each: function( obj, callback, args ) { | |
| var value, | |
| i = 0, | |
| length = obj.length, | |
| isArray = isArraylike( obj ); | |
| if ( args ) { | |
| if ( isArray ) { | |
| for ( ; i < length; i++ ) { | |
| value = callback.apply( obj[ i ], args ); | |
| if ( value === false ) { | |
| break; | |
| } | |
| } | |
| } else { | |
| for ( i in obj ) { | |
| value = callback.apply( obj[ i ], args ); | |
| if ( value === false ) { | |
| break; | |
| } | |
| } | |
| } | |
| // A special, fast, case for the most common use of each | |
| } else { | |
| if ( isArray ) { | |
| for ( ; i < length; i++ ) { | |
| value = callback.call( obj[ i ], i, obj[ i ] ); | |
| if ( value === false ) { | |
| break; | |
| } | |
| } | |
| } else { | |
| for ( i in obj ) { | |
| value = callback.call( obj[ i ], i, obj[ i ] ); | |
| if ( value === false ) { | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| return obj; | |
| }, | |
| // Support: Android<4.1 | |
| trim: function( text ) { | |
| return text == null ? | |
| "" : | |
| ( text + "" ).replace( rtrim, "" ); | |
| }, | |
| // results is for internal usage only | |
| makeArray: function( arr, results ) { | |
| var ret = results || []; | |
| if ( arr != null ) { | |
| if ( isArraylike( Object(arr) ) ) { | |
| jQuery.merge( ret, | |
| typeof arr === "string" ? | |
| [ arr ] : arr | |
| ); | |
| } else { | |
| push.call( ret, arr ); | |
| } | |
| } | |
| return ret; | |
| }, | |
| inArray: function( elem, arr, i ) { | |
| return arr == null ? -1 : indexOf.call( arr, elem, i ); | |
| }, | |
| merge: function( first, second ) { | |
| var len = +second.length, | |
| j = 0, | |
| i = first.length; | |
| for ( ; j < len; j++ ) { | |
| first[ i++ ] = second[ j ]; | |
| } | |
| first.length = i; | |
| return first; | |
| }, | |
| grep: function( elems, callback, invert ) { | |
| var callbackInverse, | |
| matches = [], | |
| i = 0, | |
| length = elems.length, | |
| callbackExpect = !invert; | |
| // Go through the array, only saving the items | |
| // that pass the validator function | |
| for ( ; i < length; i++ ) { | |
| callbackInverse = !callback( elems[ i ], i ); | |
| if ( callbackInverse !== callbackExpect ) { | |
| matches.push( elems[ i ] ); | |
| } | |
| } | |
| return matches; | |
| }, | |
| // arg is for internal usage only | |
| map: function( elems, callback, arg ) { | |
| var value, | |
| i = 0, | |
| length = elems.length, | |
| isArray = isArraylike( elems ), | |
| ret = []; | |
| // Go through the array, translating each of the items to their new values | |
| if ( isArray ) { | |
| for ( ; i < length; i++ ) { | |
| value = callback( elems[ i ], i, arg ); | |
| if ( value != null ) { | |
| ret.push( value ); | |
| } | |
| } | |
| // Go through every key on the object, | |
| } else { | |
| for ( i in elems ) { | |
| value = callback( elems[ i ], i, arg ); | |
| if ( value != null ) { | |
| ret.push( value ); | |
| } | |
| } | |
| } | |
| // Flatten any nested arrays | |
| return concat.apply( [], ret ); | |
| }, | |
| // A global GUID counter for objects | |
| guid: 1, | |
| // Bind a function to a context, optionally partially applying any | |
| // arguments. | |
| proxy: function( fn, context ) { | |
| var tmp, args, proxy; | |
| if ( typeof context === "string" ) { | |
| tmp = fn[ context ]; | |
| context = fn; | |
| fn = tmp; | |
| } | |
| // Quick check to determine if target is callable, in the spec | |
| // this throws a TypeError, but we will just return undefined. | |
| if ( !jQuery.isFunction( fn ) ) { | |
| return undefined; | |
| } | |
| // Simulated bind | |
| args = slice.call( arguments, 2 ); | |
| proxy = function() { | |
| return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); | |
| }; | |
| // Set the guid of unique handler to the same of original handler, so it can be removed | |
| proxy.guid = fn.guid = fn.guid || jQuery.guid++; | |
| return proxy; | |
| }, | |
| now: Date.now, | |
| // jQuery.support is not used in Core but other projects attach their | |
| // properties to it so it needs to exist. | |
| support: support | |
| }); | |
| // Populate the class2type map | |
| jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { | |
| class2type[ "[object " + name + "]" ] = name.toLowerCase(); | |
| }); | |
| function isArraylike( obj ) { | |
| // Support: iOS 8.2 (not reproducible in simulator) | |
| // `in` check used to prevent JIT error (gh-2145) | |
| // hasOwn isn't used here due to false negatives | |
| // regarding Nodelist length in IE | |
| var length = "length" in obj && obj.length, | |
| type = jQuery.type( obj ); | |
| if ( type === "function" || jQuery.isWindow( obj ) ) { | |
| return false; | |
| } | |
| if ( obj.nodeType === 1 && length ) { | |
| return true; | |
| } | |
| return type === "array" || length === 0 || | |
| typeof length === "number" && length > 0 && ( length - 1 ) in obj; | |
| } | |
| var Sizzle = | |
| /*! | |
| * Sizzle CSS Selector Engine v2.2.0-pre | |
| * http://sizzlejs.com/ | |
| * | |
| * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors | |
| * Released under the MIT license | |
| * http://jquery.org/license | |
| * | |
| * Date: 2014-12-16 | |
| */ | |
| (function( window ) { | |
| var i, | |
| support, | |
| Expr, | |
| getText, | |
| isXML, | |
| tokenize, | |
| compile, | |
| select, | |
| outermostContext, | |
| sortInput, | |
| hasDuplicate, | |
| // Local document vars | |
| setDocument, | |
| document, | |
| docElem, | |
| documentIsHTML, | |
| rbuggyQSA, | |
| rbuggyMatches, | |
| matches, | |
| contains, | |
| // Instance-specific data | |
| expando = "sizzle" + 1 * new Date(), | |
| preferredDoc = window.document, | |
| dirruns = 0, | |
| done = 0, | |
| classCache = createCache(), | |
| tokenCache = createCache(), | |
| compilerCache = createCache(), | |
| sortOrder = function( a, b ) { | |
| if ( a === b ) { | |
| hasDuplicate = true; | |
| } | |
| return 0; | |
| }, | |
| // General-purpose constants | |
| MAX_NEGATIVE = 1 << 31, | |
| // Instance methods | |
| hasOwn = ({}).hasOwnProperty, | |
| arr = [], | |
| pop = arr.pop, | |
| push_native = arr.push, | |
| push = arr.push, | |
| slice = arr.slice, | |
| // Use a stripped-down indexOf as it's faster than native | |
| // http://jsperf.com/thor-indexof-vs-for/5 | |
| indexOf = function( list, elem ) { | |
| var i = 0, | |
| len = list.length; | |
| for ( ; i < len; i++ ) { | |
| if ( list[i] === elem ) { | |
| return i; | |
| } | |
| } | |
| return -1; | |
| }, | |
| booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", | |
| // Regular expressions | |
| // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace | |
| whitespace = "[\\x20\\t\\r\\n\\f]", | |
| // http://www.w3.org/TR/css3-syntax/#characters | |
| characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", | |
| // Loosely modeled on CSS identifier characters | |
| // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors | |
| // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier | |
| identifier = characterEncoding.replace( "w", "w#" ), | |
| // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors | |
| attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + | |
| // Operator (capture 2) | |
| "*([*^$|!~]?=)" + whitespace + | |
| // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" | |
| "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + | |
| "*\\]", | |
| pseudos = ":(" + characterEncoding + ")(?:\\((" + | |
| // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: | |
| // 1. quoted (capture 3; capture 4 or capture 5) | |
| "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + | |
| // 2. simple (capture 6) | |
| "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + | |
| // 3. anything else (capture 2) | |
| ".*" + | |
| ")\\)|)", | |
| // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter | |
| rwhitespace = new RegExp( whitespace + "+", "g" ), | |
| rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), | |
| rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), | |
| rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), | |
| rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), | |
| rpseudo = new RegExp( pseudos ), | |
| ridentifier = new RegExp( "^" + identifier + "$" ), | |
| matchExpr = { | |
| "ID": new RegExp( "^#(" + characterEncoding + ")" ), | |
| "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), | |
| "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), | |
| "ATTR": new RegExp( "^" + attributes ), | |
| "PSEUDO": new RegExp( "^" + pseudos ), | |
| "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + | |
| "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + | |
| "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), | |
| "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), | |
| // For use in libraries implementing .is() | |
| // We use this for POS matching in `select` | |
| "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + | |
| whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) | |
| }, | |
| rinputs = /^(?:input|select|textarea|button)$/i, | |
| rheader = /^h\d$/i, | |
| rnative = /^[^{]+\{\s*\[native \w/, | |
| // Easily-parseable/retrievable ID or TAG or CLASS selectors | |
| rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, | |
| rsibling = /[+~]/, | |
| rescape = /'|\\/g, | |
| // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters | |
| runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), | |
| funescape = function( _, escaped, escapedWhitespace ) { | |
| var high = "0x" + escaped - 0x10000; | |
| // NaN means non-codepoint | |
| // Support: Firefox<24 | |
| // Workaround erroneous numeric interpretation of +"0x" | |
| return high !== high || escapedWhitespace ? | |
| escaped : | |
| high < 0 ? | |
| // BMP codepoint | |
| String.fromCharCode( high + 0x10000 ) : | |
| // Supplemental Plane codepoint (surrogate pair) | |
| String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); | |
| }, | |
| // Used for iframes | |
| // See setDocument() | |
| // Removing the function wrapper causes a "Permission Denied" | |
| // error in IE | |
| unloadHandler = function() { | |
| setDocument(); | |
| }; | |
| // Optimize for push.apply( _, NodeList ) | |
| try { | |
| push.apply( | |
| (arr = slice.call( preferredDoc.childNodes )), | |
| preferredDoc.childNodes | |
| ); | |
| // Support: Android<4.0 | |
| // Detect silently failing push.apply | |
| arr[ preferredDoc.childNodes.length ].nodeType; | |
| } catch ( e ) { | |
| push = { apply: arr.length ? | |
| // Leverage slice if possible | |
| function( target, els ) { | |
| push_native.apply( target, slice.call(els) ); | |
| } : | |
| // Support: IE<9 | |
| // Otherwise append directly | |
| function( target, els ) { | |
| var j = target.length, | |
| i = 0; | |
| // Can't trust NodeList.length | |
| while ( (target[j++] = els[i++]) ) {} | |
| target.length = j - 1; | |
| } | |
| }; | |
| } | |
| function Sizzle( selector, context, results, seed ) { | |
| var match, elem, m, nodeType, | |
| // QSA vars | |
| i, groups, old, nid, newContext, newSelector; | |
| if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { | |
| setDocument( context ); | |
| } | |
| context = context || document; | |
| results = results || []; | |
| nodeType = context.nodeType; | |
| if ( typeof selector !== "string" || !selector || | |
| nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { | |
| return results; | |
| } | |
| if ( !seed && documentIsHTML ) { | |
| // Try to shortcut find operations when possible (e.g., not under DocumentFragment) | |
| if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { | |
| // Speed-up: Sizzle("#ID") | |
| if ( (m = match[1]) ) { | |
| if ( nodeType === 9 ) { | |
| elem = context.getElementById( m ); | |
| // Check parentNode to catch when Blackberry 4.6 returns | |
| // nodes that are no longer in the document (jQuery #6963) | |
| if ( elem && elem.parentNode ) { | |
| // Handle the case where IE, Opera, and Webkit return items | |
| // by name instead of ID | |
| if ( elem.id === m ) { | |
| results.push( elem ); | |
| return results; | |
| } | |
| } else { | |
| return results; | |
| } | |
| } else { | |
| // Context is not a document | |
| if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && | |
| contains( context, elem ) && elem.id === m ) { | |
| results.push( elem ); | |
| return results; | |
| } | |
| } | |
| // Speed-up: Sizzle("TAG") | |
| } else if ( match[2] ) { | |
| push.apply( results, context.getElementsByTagName( selector ) ); | |
| return results; | |
| // Speed-up: Sizzle(".CLASS") | |
| } else if ( (m = match[3]) && support.getElementsByClassName ) { | |
| push.apply( results, context.getElementsByClassName( m ) ); | |
| return results; | |
| } | |
| } | |
| // QSA path | |
| if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { | |
| nid = old = expando; | |
| newContext = context; | |
| newSelector = nodeType !== 1 && selector; | |
| // qSA works strangely on Element-rooted queries | |
| // We can work around this by specifying an extra ID on the root | |
| // and working up from there (Thanks to Andrew Dupont for the technique) | |
| // IE 8 doesn't work on object elements | |
| if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { | |
| groups = tokenize( selector ); | |
| if ( (old = context.getAttribute("id")) ) { | |
| nid = old.replace( rescape, "\\$&" ); | |
| } else { | |
| context.setAttribute( "id", nid ); | |
| } | |
| nid = "[id='" + nid + "'] "; | |
| i = groups.length; | |
| while ( i-- ) { | |
| groups[i] = nid + toSelector( groups[i] ); | |
| } | |
| newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; | |
| newSelector = groups.join(","); | |
| } | |
| if ( newSelector ) { | |
| try { | |
| push.apply( results, | |
| newContext.querySelectorAll( newSelector ) | |
| ); | |
| return results; | |
| } catch(qsaError) { | |
| } finally { | |
| if ( !old ) { | |
| context.removeAttribute("id"); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| // All others | |
| return select( selector.replace( rtrim, "$1" ), context, results, seed ); | |
| } | |
| /** | |
| * Create key-value caches of limited size | |
| * @returns {Function(string, Object)} Returns the Object data after storing it on itself with | |
| * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) | |
| * deleting the oldest entry | |
| */ | |
| function createCache() { | |
| var keys = []; | |
| function cache( key, value ) { | |
| // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) | |
| if ( keys.push( key + " " ) > Expr.cacheLength ) { | |
| // Only keep the most recent entries | |
| delete cache[ keys.shift() ]; | |
| } | |
| return (cache[ key + " " ] = value); | |
| } | |
| return cache; | |
| } | |
| /** | |
| * Mark a function for special use by Sizzle | |
| * @param {Function} fn The function to mark | |
| */ | |
| function markFunction( fn ) { | |
| fn[ expando ] = true; | |
| return fn; | |
| } | |
| /** | |
| * Support testing using an element | |
| * @param {Function} fn Passed the created div and expects a boolean result | |
| */ | |
| function assert( fn ) { | |
| var div = document.createElement("div"); | |
| try { | |
| return !!fn( div ); | |
| } catch (e) { | |
| return false; | |
| } finally { | |
| // Remove from its parent by default | |
| if ( div.parentNode ) { | |
| div.parentNode.removeChild( div ); | |
| } | |
| // release memory in IE | |
| div = null; | |
| } | |
| } | |
| /** | |
| * Adds the same handler for all of the specified attrs | |
| * @param {String} attrs Pipe-separated list of attributes | |
| * @param {Function} handler The method that will be applied | |
| */ | |
| function addHandle( attrs, handler ) { | |
| var arr = attrs.split("|"), | |
| i = attrs.length; | |
| while ( i-- ) { | |
| Expr.attrHandle[ arr[i] ] = handler; | |
| } | |
| } | |
| /** | |
| * Checks document order of two siblings | |
| * @param {Element} a | |
| * @param {Element} b | |
| * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b | |
| */ | |
| function siblingCheck( a, b ) { | |
| var cur = b && a, | |
| diff = cur && a.nodeType === 1 && b.nodeType === 1 && | |
| ( ~b.sourceIndex || MAX_NEGATIVE ) - | |
| ( ~a.sourceIndex || MAX_NEGATIVE ); | |
| // Use IE sourceIndex if available on both nodes | |
| if ( diff ) { | |
| return diff; | |
| } | |
| // Check if b follows a | |
| if ( cur ) { | |
| while ( (cur = cur.nextSibling) ) { | |
| if ( cur === b ) { | |
| return -1; | |
| } | |
| } | |
| } | |
| return a ? 1 : -1; | |
| } | |
| /** | |
| * Returns a function to use in pseudos for input types | |
| * @param {String} type | |
| */ | |
| function createInputPseudo( type ) { | |
| return function( elem ) { | |
| var name = elem.nodeName.toLowerCase(); | |
| return name === "input" && elem.type === type; | |
| }; | |
| } | |
| /** | |
| * Returns a function to use in pseudos for buttons | |
| * @param {String} type | |
| */ | |
| function createButtonPseudo( type ) { | |
| return function( elem ) { | |
| var name = elem.nodeName.toLowerCase(); | |
| return (name === "input" || name === "button") && elem.type === type; | |
| }; | |
| } | |
| /** | |
| * Returns a function to use in pseudos for positionals | |
| * @param {Function} fn | |
| */ | |
| function createPositionalPseudo( fn ) { | |
| return markFunction(function( argument ) { | |
| argument = +argument; | |
| return markFunction(function( seed, matches ) { | |
| var j, | |
| matchIndexes = fn( [], seed.length, argument ), | |
| i = matchIndexes.length; | |
| // Match elements found at the specified indexes | |
| while ( i-- ) { | |
| if ( seed[ (j = matchIndexes[i]) ] ) { | |
| seed[j] = !(matches[j] = seed[j]); | |
| } | |
| } | |
| }); | |
| }); | |
| } | |
| /** | |
| * Checks a node for validity as a Sizzle context | |
| * @param {Element|Object=} context | |
| * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value | |
| */ | |
| function testContext( context ) { | |
| return context && typeof context.getElementsByTagName !== "undefined" && context; | |
| } | |
| // Expose support vars for convenience | |
| support = Sizzle.support = {}; | |
| /** | |
| * Detects XML nodes | |
| * @param {Element|Object} elem An element or a document | |
| * @returns {Boolean} True iff elem is a non-HTML XML node | |
| */ | |
| isXML = Sizzle.isXML = function( elem ) { | |
| // documentElement is verified for cases where it doesn't yet exist | |
| // (such as loading iframes in IE - #4833) | |
| var documentElement = elem && (elem.ownerDocument || elem).documentElement; | |
| return documentElement ? documentElement.nodeName !== "HTML" : false; | |
| }; | |
| /** | |
| * Sets document-related variables once based on the current document | |
| * @param {Element|Object} [doc] An element or document object to use to set the document | |
| * @returns {Object} Returns the current document | |
| */ | |
| setDocument = Sizzle.setDocument = function( node ) { | |
| var hasCompare, parent, | |
| doc = node ? node.ownerDocument || node : preferredDoc; | |
| // If no document and documentElement is available, return | |
| if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { | |
| return document; | |
| } | |
| // Set our document | |
| document = doc; | |
| docElem = doc.documentElement; | |
| parent = doc.defaultView; | |
| // Support: IE>8 | |
| // If iframe document is assigned to "document" variable and if iframe has been reloaded, | |
| // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 | |
| // IE6-8 do not support the defaultView property so parent will be undefined | |
| if ( parent && parent !== parent.top ) { | |
| // IE11 does not have attachEvent, so all must suffer | |
| if ( parent.addEventListener ) { | |
| parent.addEventListener( "unload", unloadHandler, false ); | |
| } else if ( parent.attachEvent ) { | |
| parent.attachEvent( "onunload", unloadHandler ); | |
| } | |
| } | |
| /* Support tests | |
| ---------------------------------------------------------------------- */ | |
| documentIsHTML = !isXML( doc ); | |
| /* Attributes | |
| ---------------------------------------------------------------------- */ | |
| // Support: IE<8 | |
| // Verify that getAttribute really returns attributes and not properties | |
| // (excepting IE8 booleans) | |
| support.attributes = assert(function( div ) { | |
| div.className = "i"; | |
| return !div.getAttribute("className"); | |
| }); | |
| /* getElement(s)By* | |
| ---------------------------------------------------------------------- */ | |
| // Check if getElementsByTagName("*") returns only elements | |
| support.getElementsByTagName = assert(function( div ) { | |
| div.appendChild( doc.createComment("") ); | |
| return !div.getElementsByTagName("*").length; | |
| }); | |
| // Support: IE<9 | |
| support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); | |
| // Support: IE<10 | |
| // Check if getElementById returns elements by name | |
| // The broken getElementById methods don't pick up programatically-set names, | |
| // so use a roundabout getElementsByName test | |
| support.getById = assert(function( div ) { | |
| docElem.appendChild( div ).id = expando; | |
| return !doc.getElementsByName || !doc.getElementsByName( expando ).length; | |
| }); | |
| // ID find and filter | |
| if ( support.getById ) { | |
| Expr.find["ID"] = function( id, context ) { | |
| if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { | |
| var m = context.getElementById( id ); | |
| // Check parentNode to catch when Blackberry 4.6 returns | |
| // nodes that are no longer in the document #6963 | |
| return m && m.parentNode ? [ m ] : []; | |
| } | |
| }; | |
| Expr.filter["ID"] = function( id ) { | |
| var attrId = id.replace( runescape, funescape ); | |
| return function( elem ) { | |
| return elem.getAttribute("id") === attrId; | |
| }; | |
| }; | |
| } else { | |
| // Support: IE6/7 | |
| // getElementById is not reliable as a find shortcut | |
| delete Expr.find["ID"]; | |
| Expr.filter["ID"] = function( id ) { | |
| var attrId = id.replace( runescape, funescape ); | |
| return function( elem ) { | |
| var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); | |
| return node && node.value === attrId; | |
| }; | |
| }; | |
| } | |
| // Tag | |
| Expr.find["TAG"] = support.getElementsByTagName ? | |
| function( tag, context ) { | |
| if ( typeof context.getElementsByTagName !== "undefined" ) { | |
| return context.getElementsByTagName( tag ); | |
| // DocumentFragment nodes don't have gEBTN | |
| } else if ( support.qsa ) { | |
| return context.querySelectorAll( tag ); | |
| } | |
| } : | |
| function( tag, context ) { | |
| var elem, | |
| tmp = [], | |
| i = 0, | |
| // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too | |
| results = context.getElementsByTagName( tag ); | |
| // Filter out possible comments | |
| if ( tag === "*" ) { | |
| while ( (elem = results[i++]) ) { | |
| if ( elem.nodeType === 1 ) { | |
| tmp.push( elem ); | |
| } | |
| } | |
| return tmp; | |
| } | |
| return results; | |
| }; | |
| // Class | |
| Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { | |
| if ( documentIsHTML ) { | |
| return context.getElementsByClassName( className ); | |
| } | |
| }; | |
| /* QSA/matchesSelector | |
| ---------------------------------------------------------------------- */ | |
| // QSA and matchesSelector support | |
| // matchesSelector(:active) reports false when true (IE9/Opera 11.5) | |
| rbuggyMatches = []; | |
| // qSa(:focus) reports false when true (Chrome 21) | |
| // We allow this because of a bug in IE8/9 that throws an error | |
| // whenever `document.activeElement` is accessed on an iframe | |
| // So, we allow :focus to pass through QSA all the time to avoid the IE error | |
| // See http://bugs.jquery.com/ticket/13378 | |
| rbuggyQSA = []; | |
| if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { | |
| // Build QSA regex | |
| // Regex strategy adopted from Diego Perini | |
| assert(function( div ) { | |
| // Select is set to empty string on purpose | |
| // This is to test IE's treatment of not explicitly | |
| // setting a boolean content attribute, | |
| // since its presence should be enough | |
| // http://bugs.jquery.com/ticket/12359 | |
| docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" + | |
| "<select id='" + expando + "-\f]' msallowcapture=''>" + | |
| "<option selected=''></option></select>"; | |
| // Support: IE8, Opera 11-12.16 | |
| // Nothing should be selected when empty strings follow ^= or $= or *= | |
| // The test attribute must be unknown in Opera but "safe" for WinRT | |
| // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section | |
| if ( div.querySelectorAll("[msallowcapture^='']").length ) { | |
| rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); | |
| } | |
| // Support: IE8 | |
| // Boolean attributes and "value" are not treated correctly | |
| if ( !div.querySelectorAll("[selected]").length ) { | |
| rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); | |
| } | |
| // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ | |
| if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { | |
| rbuggyQSA.push("~="); | |
| } | |
| // Webkit/Opera - :checked should return selected option elements | |
| // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked | |
| // IE8 throws error here and will not see later tests | |
| if ( !div.querySelectorAll(":checked").length ) { | |
| rbuggyQSA.push(":checked"); | |
| } | |
| // Support: Safari 8+, iOS 8+ | |
| // https://bugs.webkit.org/show_bug.cgi?id=136851 | |
| // In-page `selector#id sibing-combinator selector` fails | |
| if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { | |
| rbuggyQSA.push(".#.+[+~]"); | |
| } | |
| }); | |
| assert(function( div ) { | |
| // Support: Windows 8 Native Apps | |
| // The type and name attributes are restricted during .innerHTML assignment | |
| var input = doc.createElement("input"); | |
| input.setAttribute( "type", "hidden" ); | |
| div.appendChild( input ).setAttribute( "name", "D" ); | |
| // Support: IE8 | |
| // Enforce case-sensitivity of name attribute | |
| if ( div.querySelectorAll("[name=d]").length ) { | |
| rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); | |
| } | |
| // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) | |
| // IE8 throws error here and will not see later tests | |
| if ( !div.querySelectorAll(":enabled").length ) { | |
| rbuggyQSA.push( ":enabled", ":disabled" ); | |
| } | |
| // Opera 10-11 does not throw on post-comma invalid pseudos | |
| div.querySelectorAll("*,:x"); | |
| rbuggyQSA.push(",.*:"); | |
| }); | |
| } | |
| if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || | |
| docElem.webkitMatchesSelector || | |
| docElem.mozMatchesSelector || | |
| docElem.oMatchesSelector || | |
| docElem.msMatchesSelector) )) ) { | |
| assert(function( div ) { | |
| // Check to see if it's possible to do matchesSelector | |
| // on a disconnected node (IE 9) | |
| support.disconnectedMatch = matches.call( div, "div" ); | |
| // This should fail with an exception | |
| // Gecko does not error, returns false instead | |
| matches.call( div, "[s!='']:x" ); | |
| rbuggyMatches.push( "!=", pseudos ); | |
| }); | |
| } | |
| rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); | |
| rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); | |
| /* Contains | |
| ---------------------------------------------------------------------- */ | |
| hasCompare = rnative.test( docElem.compareDocumentPosition ); | |
| // Element contains another | |
| // Purposefully does not implement inclusive descendent | |
| // As in, an element does not contain itself | |
| contains = hasCompare || rnative.test( docElem.contains ) ? | |
| function( a, b ) { | |
| var adown = a.nodeType === 9 ? a.documentElement : a, | |
| bup = b && b.parentNode; | |
| return a === bup || !!( bup && bup.nodeType === 1 && ( | |
| adown.contains ? | |
| adown.contains( bup ) : | |
| a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 | |
| )); | |
| } : | |
| function( a, b ) { | |
| if ( b ) { | |
| while ( (b = b.parentNode) ) { | |
| if ( b === a ) { | |
| return true; | |
| } | |
| } | |
| } | |
| return false; | |
| }; | |
| /* Sorting | |
| ---------------------------------------------------------------------- */ | |
| // Document order sorting | |
| sortOrder = hasCompare ? | |
| function( a, b ) { | |
| // Flag for duplicate removal | |
| if ( a === b ) { | |
| hasDuplicate = true; | |
| return 0; | |
| } | |
| // Sort on method existence if only one input has compareDocumentPosition | |
| var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; | |
| if ( compare ) { | |
| return compare; | |
| } | |
| // Calculate position if both inputs belong to the same document | |
| compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? | |
| a.compareDocumentPosition( b ) : | |
| // Otherwise we know they are disconnected | |
| 1; | |
| // Disconnected nodes | |
| if ( compare & 1 || | |
| (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { | |
| // Choose the first element that is related to our preferred document | |
| if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { | |
| return -1; | |
| } | |
| if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { | |
| return 1; | |
| } | |
| // Maintain original order | |
| return sortInput ? | |
| ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : | |
| 0; | |
| } | |
| return compare & 4 ? -1 : 1; | |
| } : | |
| function( a, b ) { | |
| // Exit early if the nodes are identical | |
| if ( a === b ) { | |
| hasDuplicate = true; | |
| return 0; | |
| } | |
| var cur, | |
| i = 0, | |
| aup = a.parentNode, | |
| bup = b.parentNode, | |
| ap = [ a ], | |
| bp = [ b ]; | |
| // Parentless nodes are either documents or disconnected | |
| if ( !aup || !bup ) { | |
| return a === doc ? -1 : | |
| b === doc ? 1 : | |
| aup ? -1 : | |
| bup ? 1 : | |
| sortInput ? | |
| ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : | |
| 0; | |
| // If the nodes are siblings, we can do a quick check | |
| } else if ( aup === bup ) { | |
| return siblingCheck( a, b ); | |
| } | |
| // Otherwise we need full lists of their ancestors for comparison | |
| cur = a; | |
| while ( (cur = cur.parentNode) ) { | |
| ap.unshift( cur ); | |
| } | |
| cur = b; | |
| while ( (cur = cur.parentNode) ) { | |
| bp.unshift( cur ); | |
| } | |
| // Walk down the tree looking for a discrepancy | |
| while ( ap[i] === bp[i] ) { | |
| i++; | |
| } | |
| return i ? | |
| // Do a sibling check if the nodes have a common ancestor | |
| siblingCheck( ap[i], bp[i] ) : | |
| // Otherwise nodes in our document sort first | |
| ap[i] === preferredDoc ? -1 : | |
| bp[i] === preferredDoc ? 1 : | |
| 0; | |
| }; | |
| return doc; | |
| }; | |
| Sizzle.matches = function( expr, elements ) { | |
| return Sizzle( expr, null, null, elements ); | |
| }; | |
| Sizzle.matchesSelector = function( elem, expr ) { | |
| // Set document vars if needed | |
| if ( ( elem.ownerDocument || elem ) !== document ) { | |
| setDocument( elem ); | |
| } | |
| // Make sure that attribute selectors are quoted | |
| expr = expr.replace( rattributeQuotes, "='$1']" ); | |
| if ( support.matchesSelector && documentIsHTML && | |
| ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && | |
| ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { | |
| try { | |
| var ret = matches.call( elem, expr ); | |
| // IE 9's matchesSelector returns false on disconnected nodes | |
| if ( ret || support.disconnectedMatch || | |
| // As well, disconnected nodes are said to be in a document | |
| // fragment in IE 9 | |
| elem.document && elem.document.nodeType !== 11 ) { | |
| return ret; | |
| } | |
| } catch (e) {} | |
| } | |
| return Sizzle( expr, document, null, [ elem ] ).length > 0; | |
| }; | |
| Sizzle.contains = function( context, elem ) { | |
| // Set document vars if needed | |
| if ( ( context.ownerDocument || context ) !== document ) { | |
| setDocument( context ); | |
| } | |
| return contains( context, elem ); | |
| }; | |
| Sizzle.attr = function( elem, name ) { | |
| // Set document vars if needed | |
| if ( ( elem.ownerDocument || elem ) !== document ) { | |
| setDocument( elem ); | |
| } | |
| var fn = Expr.attrHandle[ name.toLowerCase() ], | |
| // Don't get fooled by Object.prototype properties (jQuery #13807) | |
| val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? | |
| fn( elem, name, !documentIsHTML ) : | |
| undefined; | |
| return val !== undefined ? | |
| val : | |
| support.attributes || !documentIsHTML ? | |
| elem.getAttribute( name ) : | |
| (val = elem.getAttributeNode(name)) && val.specified ? | |
| val.value : | |
| null; | |
| }; | |
| Sizzle.error = function( msg ) { | |
| throw new Error( "Syntax error, unrecognized expression: " + msg ); | |
| }; | |
| /** | |
| * Document sorting and removing duplicates | |
| * @param {ArrayLike} results | |
| */ | |
| Sizzle.uniqueSort = function( results ) { | |
| var elem, | |
| duplicates = [], | |
| j = 0, | |
| i = 0; | |
| // Unless we *know* we can detect duplicates, assume their presence | |
| hasDuplicate = !support.detectDuplicates; | |
| sortInput = !support.sortStable && results.slice( 0 ); | |
| results.sort( sortOrder ); | |
| if ( hasDuplicate ) { | |
| while ( (elem = results[i++]) ) { | |
| if ( elem === results[ i ] ) { | |
| j = duplicates.push( i ); | |
| } | |
| } | |
| while ( j-- ) { | |
| results.splice( duplicates[ j ], 1 ); | |
| } | |
| } | |
| // Clear input after sorting to release objects | |
| // See https://github.com/jquery/sizzle/pull/225 | |
| sortInput = null; | |
| return results; | |
| }; | |
| /** | |
| * Utility function for retrieving the text value of an array of DOM nodes | |
| * @param {Array|Element} elem | |
| */ | |
| getText = Sizzle.getText = function( elem ) { | |
| var node, | |
| ret = "", | |
| i = 0, | |
| nodeType = elem.nodeType; | |
| if ( !nodeType ) { | |
| // If no nodeType, this is expected to be an array | |
| while ( (node = elem[i++]) ) { | |
| // Do not traverse comment nodes | |
| ret += getText( node ); | |
| } | |
| } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { | |
| // Use textContent for elements | |
| // innerText usage removed for consistency of new lines (jQuery #11153) | |
| if ( typeof elem.textContent === "string" ) { | |
| return elem.textContent; | |
| } else { | |
| // Traverse its children | |
| for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { | |
| ret += getText( elem ); | |
| } | |
| } | |
| } else if ( nodeType === 3 || nodeType === 4 ) { | |
| return elem.nodeValue; | |
| } | |
| // Do not include comment or processing instruction nodes | |
| return ret; | |
| }; | |
| Expr = Sizzle.selectors = { | |
| // Can be adjusted by the user | |
| cacheLength: 50, | |
| createPseudo: markFunction, | |
| match: matchExpr, | |
| attrHandle: {}, | |
| find: {}, | |
| relative: { | |
| ">": { dir: "parentNode", first: true }, | |
| " ": { dir: "parentNode" }, | |
| "+": { dir: "previousSibling", first: true }, | |
| "~": { dir: "previousSibling" } | |
| }, | |
| preFilter: { | |
| "ATTR": function( match ) { | |
| match[1] = match[1].replace( runescape, funescape ); | |
| // Move the given value to match[3] whether quoted or unquoted | |
| match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); | |
| if ( match[2] === "~=" ) { | |
| match[3] = " " + match[3] + " "; | |
| } | |
| return match.slice( 0, 4 ); | |
| }, | |
| "CHILD": function( match ) { | |
| /* matches from matchExpr["CHILD"] | |
| 1 type (only|nth|...) | |
| 2 what (child|of-type) | |
| 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) | |
| 4 xn-component of xn+y argument ([+-]?\d*n|) | |
| 5 sign of xn-component | |
| 6 x of xn-component | |
| 7 sign of y-component | |
| 8 y of y-component | |
| */ | |
| match[1] = match[1].toLowerCase(); | |
| if ( match[1].slice( 0, 3 ) === "nth" ) { | |
| // nth-* requires argument | |
| if ( !match[3] ) { | |
| Sizzle.error( match[0] ); | |
| } | |
| // numeric x and y parameters for Expr.filter.CHILD | |
| // remember that false/true cast respectively to 0/1 | |
| match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); | |
| match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); | |
| // other types prohibit arguments | |
| } else if ( match[3] ) { | |
| Sizzle.error( match[0] ); | |
| } | |
| return match; | |
| }, | |
| "PSEUDO": function( match ) { | |
| var excess, | |
| unquoted = !match[6] && match[2]; | |
| if ( matchExpr["CHILD"].test( match[0] ) ) { | |
| return null; | |
| } | |
| // Accept quoted arguments as-is | |
| if ( match[3] ) { | |
| match[2] = match[4] || match[5] || ""; | |
| // Strip excess characters from unquoted arguments | |
| } else if ( unquoted && rpseudo.test( unquoted ) && | |
| // Get excess from tokenize (recursively) | |
| (excess = tokenize( unquoted, true )) && | |
| // advance to the next closing parenthesis | |
| (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { | |
| // excess is a negative index | |
| match[0] = match[0].slice( 0, excess ); | |
| match[2] = unquoted.slice( 0, excess ); | |
| } | |
| // Return only captures needed by the pseudo filter method (type and argument) | |
| return match.slice( 0, 3 ); | |
| } | |
| }, | |
| filter: { | |
| "TAG": function( nodeNameSelector ) { | |
| var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); | |
| return nodeNameSelector === "*" ? | |
| function() { return true; } : | |
| function( elem ) { | |
| return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; | |
| }; | |
| }, | |
| "CLASS": function( className ) { | |
| var pattern = classCache[ className + " " ]; | |
| return pattern || | |
| (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && | |
| classCache( className, function( elem ) { | |
| return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); | |
| }); | |
| }, | |
| "ATTR": function( name, operator, check ) { | |
| return function( elem ) { | |
| var result = Sizzle.attr( elem, name ); | |
| if ( result == null ) { | |
| return operator === "!="; | |
| } | |
| if ( !operator ) { | |
| return true; | |
| } | |
| result += ""; | |
| return operator === "=" ? result === check : | |
| operator === "!=" ? result !== check : | |
| operator === "^=" ? check && result.indexOf( check ) === 0 : | |
| operator === "*=" ? check && result.indexOf( check ) > -1 : | |
| operator === "$=" ? check && result.slice( -check.length ) === check : | |
| operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : | |
| operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : | |
| false; | |
| }; | |
| }, | |
| "CHILD": function( type, what, argument, first, last ) { | |
| var simple = type.slice( 0, 3 ) !== "nth", | |
| forward = type.slice( -4 ) !== "last", | |
| ofType = what === "of-type"; | |
| return first === 1 && last === 0 ? | |
| // Shortcut for :nth-*(n) | |
| function( elem ) { | |
| return !!elem.parentNode; | |
| } : | |
| function( elem, context, xml ) { | |
| var cache, outerCache, node, diff, nodeIndex, start, | |
| dir = simple !== forward ? "nextSibling" : "previousSibling", | |
| parent = elem.parentNode, | |
| name = ofType && elem.nodeName.toLowerCase(), | |
| useCache = !xml && !ofType; | |
| if ( parent ) { | |
| // :(first|last|only)-(child|of-type) | |
| if ( simple ) { | |
| while ( dir ) { | |
| node = elem; | |
| while ( (node = node[ dir ]) ) { | |
| if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { | |
| return false; | |
| } | |
| } | |
| // Reverse direction for :only-* (if we haven't yet done so) | |
| start = dir = type === "only" && !start && "nextSibling"; | |
| } | |
| return true; | |
| } | |
| start = [ forward ? parent.firstChild : parent.lastChild ]; | |
| // non-xml :nth-child(...) stores cache data on `parent` | |
| if ( forward && useCache ) { | |
| // Seek `elem` from a previously-cached index | |
| outerCache = parent[ expando ] || (parent[ expando ] = {}); | |
| cache = outerCache[ type ] || []; | |
| nodeIndex = cache[0] === dirruns && cache[1]; | |
| diff = cache[0] === dirruns && cache[2]; | |
| node = nodeIndex && parent.childNodes[ nodeIndex ]; | |
| while ( (node = ++nodeIndex && node && node[ dir ] || | |
| // Fallback to seeking `elem` from the start | |
| (diff = nodeIndex = 0) || start.pop()) ) { | |
| // When found, cache indexes on `parent` and break | |
| if ( node.nodeType === 1 && ++diff && node === elem ) { | |
| outerCache[ type ] = [ dirruns, nodeIndex, diff ]; | |
| break; | |
| } | |
| } | |
| // Use previously-cached element index if available | |
| } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { | |
| diff = cache[1]; | |
| // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) | |
| } else { | |
| // Use the same loop as above to seek `elem` from the start | |
| while ( (node = ++nodeIndex && node && node[ dir ] || | |
| (diff = nodeIndex = 0) || start.pop()) ) { | |
| if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { | |
| // Cache the index of each encountered element | |
| if ( useCache ) { | |
| (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; | |
| } | |
| if ( node === elem ) { | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| // Incorporate the offset, then check against cycle size | |
| diff -= last; | |
| return diff === first || ( diff % first === 0 && diff / first >= 0 ); | |
| } | |
| }; | |
| }, | |
| "PSEUDO": function( pseudo, argument ) { | |
| // pseudo-class names are case-insensitive | |
| // http://www.w3.org/TR/selectors/#pseudo-classes | |
| // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters | |
| // Remember that setFilters inherits from pseudos | |
| var args, | |
| fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || | |
| Sizzle.error( "unsupported pseudo: " + pseudo ); | |
| // The user may use createPseudo to indicate that | |
| // arguments are needed to create the filter function | |
| // just as Sizzle does | |
| if ( fn[ expando ] ) { | |
| return fn( argument ); | |
| } | |
| // But maintain support for old signatures | |
| if ( fn.length > 1 ) { | |
| args = [ pseudo, pseudo, "", argument ]; | |
| return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? | |
| markFunction(function( seed, matches ) { | |
| var idx, | |
| matched = fn( seed, argument ), | |
| i = matched.length; | |
| while ( i-- ) { | |
| idx = indexOf( seed, matched[i] ); | |
| seed[ idx ] = !( matches[ idx ] = matched[i] ); | |
| } | |
| }) : | |
| function( elem ) { | |
| return fn( elem, 0, args ); | |
| }; | |
| } | |
| return fn; | |
| } | |
| }, | |
| pseudos: { | |
| // Potentially complex pseudos | |
| "not": markFunction(function( selector ) { | |
| // Trim the selector passed to compile | |
| // to avoid treating leading and trailing | |
| // spaces as combinators | |
| var input = [], | |
| results = [], | |
| matcher = compile( selector.replace( rtrim, "$1" ) ); | |
| return matcher[ expando ] ? | |
| markFunction(function( seed, matches, context, xml ) { | |
| var elem, | |
| unmatched = matcher( seed, null, xml, [] ), | |
| i = seed.length; | |
| // Match elements unmatched by `matcher` | |
| while ( i-- ) { | |
| if ( (elem = unmatched[i]) ) { | |
| seed[i] = !(matches[i] = elem); | |
| } | |
| } | |
| }) : | |
| function( elem, context, xml ) { | |
| input[0] = elem; | |
| matcher( input, null, xml, results ); | |
| // Don't keep the element (issue #299) | |
| input[0] = null; | |
| return !results.pop(); | |
| }; | |
| }), | |
| "has": markFunction(function( selector ) { | |
| return function( elem ) { | |
| return Sizzle( selector, elem ).length > 0; | |
| }; | |
| }), | |
| "contains": markFunction(function( text ) { | |
| text = text.replace( runescape, funescape ); | |
| return function( elem ) { | |
| return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; | |
| }; | |
| }), | |
| // "Whether an element is represented by a :lang() selector | |
| // is based solely on the element's language value | |
| // being equal to the identifier C, | |
| // or beginning with the identifier C immediately followed by "-". | |
| // The matching of C against the element's language value is performed case-insensitively. | |
| // The identifier C does not have to be a valid language name." | |
| // http://www.w3.org/TR/selectors/#lang-pseudo | |
| "lang": markFunction( function( lang ) { | |
| // lang value must be a valid identifier | |
| if ( !ridentifier.test(lang || "") ) { | |
| Sizzle.error( "unsupported lang: " + lang ); | |
| } | |
| lang = lang.replace( runescape, funescape ).toLowerCase(); | |
| return function( elem ) { | |
| var elemLang; | |
| do { | |
| if ( (elemLang = documentIsHTML ? | |
| elem.lang : | |
| elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { | |
| elemLang = elemLang.toLowerCase(); | |
| return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; | |
| } | |
| } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); | |
| return false; | |
| }; | |
| }), | |
| // Miscellaneous | |
| "target": function( elem ) { | |
| var hash = window.location && window.location.hash; | |
| return hash && hash.slice( 1 ) === elem.id; | |
| }, | |
| "root": function( elem ) { | |
| return elem === docElem; | |
| }, | |
| "focus": function( elem ) { | |
| return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); | |
| }, | |
| // Boolean properties | |
| "enabled": function( elem ) { | |
| return elem.disabled === false; | |
| }, | |
| "disabled": function( elem ) { | |
| return elem.disabled === true; | |
| }, | |
| "checked": function( elem ) { | |
| // In CSS3, :checked should return both checked and selected elements | |
| // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked | |
| var nodeName = elem.nodeName.toLowerCase(); | |
| return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); | |
| }, | |
| "selected": function( elem ) { | |
| // Accessing this property makes selected-by-default | |
| // options in Safari work properly | |
| if ( elem.parentNode ) { | |
| elem.parentNode.selectedIndex; | |
| } | |
| return elem.selected === true; | |
| }, | |
| // Contents | |
| "empty": function( elem ) { | |
| // http://www.w3.org/TR/selectors/#empty-pseudo | |
| // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), | |
| // but not by others (comment: 8; processing instruction: 7; etc.) | |
| // nodeType < 6 works because attributes (2) do not appear as children | |
| for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { | |
| if ( elem.nodeType < 6 ) { | |
| return false; | |
| } | |
| } | |
| return true; | |
| }, | |
| "parent": function( elem ) { | |
| return !Expr.pseudos["empty"]( elem ); | |
| }, | |
| // Element/input types | |
| "header": function( elem ) { | |
| return rheader.test( elem.nodeName ); | |
| }, | |
| "input": function( elem ) { | |
| return rinputs.test( elem.nodeName ); | |
| }, | |
| "button": function( elem ) { | |
| var name = elem.nodeName.toLowerCase(); | |
| return name === "input" && elem.type === "button" || name === "button"; | |
| }, | |
| "text": function( elem ) { | |
| var attr; | |
| return elem.nodeName.toLowerCase() === "input" && | |
| elem.type === "text" && | |
| // Support: IE<8 | |
| // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" | |
| ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); | |
| }, | |
| // Position-in-collection | |
| "first": createPositionalPseudo(function() { | |
| return [ 0 ]; | |
| }), | |
| "last": createPositionalPseudo(function( matchIndexes, length ) { | |
| return [ length - 1 ]; | |
| }), | |
| "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { | |
| return [ argument < 0 ? argument + length : argument ]; | |
| }), | |
| "even": createPositionalPseudo(function( matchIndexes, length ) { | |
| var i = 0; | |
| for ( ; i < length; i += 2 ) { | |
| matchIndexes.push( i ); | |
| } | |
| return matchIndexes; | |
| }), | |
| "odd": createPositionalPseudo(function( matchIndexes, length ) { | |
| var i = 1; | |
| for ( ; i < length; i += 2 ) { | |
| matchIndexes.push( i ); | |
| } | |
| return matchIndexes; | |
| }), | |
| "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { | |
| var i = argument < 0 ? argument + length : argument; | |
| for ( ; --i >= 0; ) { | |
| matchIndexes.push( i ); | |
| } | |
| return matchIndexes; | |
| }), | |
| "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { | |
| var i = argument < 0 ? argument + length : argument; | |
| for ( ; ++i < length; ) { | |
| matchIndexes.push( i ); | |
| } | |
| return matchIndexes; | |
| }) | |
| } | |
| }; | |
| Expr.pseudos["nth"] = Expr.pseudos["eq"]; | |
| // Add button/input type pseudos | |
| for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { | |
| Expr.pseudos[ i ] = createInputPseudo( i ); | |
| } | |
| for ( i in { submit: true, reset: true } ) { | |
| Expr.pseudos[ i ] = createButtonPseudo( i ); | |
| } | |
| // Easy API for creating new setFilters | |
| function setFilters() {} | |
| setFilters.prototype = Expr.filters = Expr.pseudos; | |
| Expr.setFilters = new setFilters(); | |
| tokenize = Sizzle.tokenize = function( selector, parseOnly ) { | |
| var matched, match, tokens, type, | |
| soFar, groups, preFilters, | |
| cached = tokenCache[ selector + " " ]; | |
| if ( cached ) { | |
| return parseOnly ? 0 : cached.slice( 0 ); | |
| } | |
| soFar = selector; | |
| groups = []; | |
| preFilters = Expr.preFilter; | |
| while ( soFar ) { | |
| // Comma and first run | |
| if ( !matched || (match = rcomma.exec( soFar )) ) { | |
| if ( match ) { | |
| // Don't consume trailing commas as valid | |
| soFar = soFar.slice( match[0].length ) || soFar; | |
| } | |
| groups.push( (tokens = []) ); | |
| } | |
| matched = false; | |
| // Combinators | |
| if ( (match = rcombinators.exec( soFar )) ) { | |
| matched = match.shift(); | |
| tokens.push({ | |
| value: matched, | |
| // Cast descendant combinators to space | |
| type: match[0].replace( rtrim, " " ) | |
| }); | |
| soFar = soFar.slice( matched.length ); | |
| } | |
| // Filters | |
| for ( type in Expr.filter ) { | |
| if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || | |
| (match = preFilters[ type ]( match ))) ) { | |
| matched = match.shift(); | |
| tokens.push({ | |
| value: matched, | |
| type: type, | |
| matches: match | |
| }); | |
| soFar = soFar.slice( matched.length ); | |
| } | |
| } | |
| if ( !matched ) { | |
| break; | |
| } | |
| } | |
| // Return the length of the invalid excess | |
| // if we're just parsing | |
| // Otherwise, throw an error or return tokens | |
| return parseOnly ? | |
| soFar.length : | |
| soFar ? | |
| Sizzle.error( selector ) : | |
| // Cache the tokens | |
| tokenCache( selector, groups ).slice( 0 ); | |
| }; | |
| function toSelector( tokens ) { | |
| var i = 0, | |
| len = tokens.length, | |
| selector = ""; | |
| for ( ; i < len; i++ ) { | |
| selector += tokens[i].value; | |
| } | |
| return selector; | |
| } | |
| function addCombinator( matcher, combinator, base ) { | |
| var dir = combinator.dir, | |
| checkNonElements = base && dir === "parentNode", | |
| doneName = done++; | |
| return combinator.first ? | |
| // Check against closest ancestor/preceding element | |
| function( elem, context, xml ) { | |
| while ( (elem = elem[ dir ]) ) { | |
| if ( elem.nodeType === 1 || checkNonElements ) { | |
| return matcher( elem, context, xml ); | |
| } | |
| } | |
| } : | |
| // Check against all ancestor/preceding elements | |
| function( elem, context, xml ) { | |
| var oldCache, outerCache, | |
| newCache = [ dirruns, doneName ]; | |
| // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching | |
| if ( xml ) { | |
| while ( (elem = elem[ dir ]) ) { | |
| if ( elem.nodeType === 1 || checkNonElements ) { | |
| if ( matcher( elem, context, xml ) ) { | |
| return true; | |
| } | |
| } | |
| } | |
| } else { | |
| while ( (elem = elem[ dir ]) ) { | |
| if ( elem.nodeType === 1 || checkNonElements ) { | |
| outerCache = elem[ expando ] || (elem[ expando ] = {}); | |
| if ( (oldCache = outerCache[ dir ]) && | |
| oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { | |
| // Assign to newCache so results back-propagate to previous elements | |
| return (newCache[ 2 ] = oldCache[ 2 ]); | |
| } else { | |
| // Reuse newcache so results back-propagate to previous elements | |
| outerCache[ dir ] = newCache; | |
| // A match means we're done; a fail means we have to keep checking | |
| if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { | |
| return true; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }; | |
| } | |
| function elementMatcher( matchers ) { | |
| return matchers.length > 1 ? | |
| function( elem, context, xml ) { | |
| var i = matchers.length; | |
| while ( i-- ) { | |
| if ( !matchers[i]( elem, context, xml ) ) { | |
| return false; | |
| } | |
| } | |
| return true; | |
| } : | |
| matchers[0]; | |
| } | |
| function multipleContexts( selector, contexts, results ) { | |
| var i = 0, | |
| len = contexts.length; | |
| for ( ; i < len; i++ ) { | |
| Sizzle( selector, contexts[i], results ); | |
| } | |
| return results; | |
| } | |
| function condense( unmatched, map, filter, context, xml ) { | |
| var elem, | |
| newUnmatched = [], | |
| i = 0, | |
| len = unmatched.length, | |
| mapped = map != null; | |
| for ( ; i < len; i++ ) { | |
| if ( (elem = unmatched[i]) ) { | |
| if ( !filter || filter( elem, context, xml ) ) { | |
| newUnmatched.push( elem ); | |
| if ( mapped ) { | |
| map.push( i ); | |
| } | |
| } | |
| } | |
| } | |
| return newUnmatched; | |
| } | |
| function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { | |
| if ( postFilter && !postFilter[ expando ] ) { | |
| postFilter = setMatcher( postFilter ); | |
| } | |
| if ( postFinder && !postFinder[ expando ] ) { | |
| postFinder = setMatcher( postFinder, postSelector ); | |
| } | |
| return markFunction(function( seed, results, context, xml ) { | |
| var temp, i, elem, | |
| preMap = [], | |
| postMap = [], | |
| preexisting = results.length, | |
| // Get initial elements from seed or context | |
| elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), | |
| // Prefilter to get matcher input, preserving a map for seed-results synchronization | |
| matcherIn = preFilter && ( seed || !selector ) ? | |
| condense( elems, preMap, preFilter, context, xml ) : | |
| elems, | |
| matcherOut = matcher ? | |
| // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, | |
| postFinder || ( seed ? preFilter : preexisting || postFilter ) ? | |
| // ...intermediate processing is necessary | |
| [] : | |
| // ...otherwise use results directly | |
| results : | |
| matcherIn; | |
| // Find primary matches | |
| if ( matcher ) { | |
| matcher( matcherIn, matcherOut, context, xml ); | |
| } | |
| // Apply postFilter | |
| if ( postFilter ) { | |
| temp = condense( matcherOut, postMap ); | |
| postFilter( temp, [], context, xml ); | |
| // Un-match failing elements by moving them back to matcherIn | |
| i = temp.length; | |
| while ( i-- ) { | |
| if ( (elem = temp[i]) ) { | |
| matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); | |
| } | |
| } | |
| } | |
| if ( seed ) { | |
| if ( postFinder || preFilter ) { | |
| if ( postFinder ) { | |
| // Get the final matcherOut by condensing this intermediate into postFinder contexts | |
| temp = []; | |
| i = matcherOut.length; | |
| while ( i-- ) { | |
| if ( (elem = matcherOut[i]) ) { | |
| // Restore matcherIn since elem is not yet a final match | |
| temp.push( (matcherIn[i] = elem) ); | |
| } | |
| } | |
| postFinder( null, (matcherOut = []), temp, xml ); | |
| } | |
| // Move matched elements from seed to results to keep them synchronized | |
| i = matcherOut.length; | |
| while ( i-- ) { | |
| if ( (elem = matcherOut[i]) && | |
| (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { | |
| seed[temp] = !(results[temp] = elem); | |
| } | |
| } | |
| } | |
| // Add elements to results, through postFinder if defined | |
| } else { | |
| matcherOut = condense( | |
| matcherOut === results ? | |
| matcherOut.splice( preexisting, matcherOut.length ) : | |
| matcherOut | |
| ); | |
| if ( postFinder ) { | |
| postFinder( null, results, matcherOut, xml ); | |
| } else { | |
| push.apply( results, matcherOut ); | |
| } | |
| } | |
| }); | |
| } | |
| function matcherFromTokens( tokens ) { | |
| var checkContext, matcher, j, | |
| len = tokens.length, | |
| leadingRelative = Expr.relative[ tokens[0].type ], | |
| implicitRelative = leadingRelative || Expr.relative[" "], | |
| i = leadingRelative ? 1 : 0, | |
| // The foundational matcher ensures that elements are reachable from top-level context(s) | |
| matchContext = addCombinator( function( elem ) { | |
| return elem === checkContext; | |
| }, implicitRelative, true ), | |
| matchAnyContext = addCombinator( function( elem ) { | |
| return indexOf( checkContext, elem ) > -1; | |
| }, implicitRelative, true ), | |
| matchers = [ function( elem, context, xml ) { | |
| var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( | |
| (checkContext = context).nodeType ? | |
| matchContext( elem, context, xml ) : | |
| matchAnyContext( elem, context, xml ) ); | |
| // Avoid hanging onto element (issue #299) | |
| checkContext = null; | |
| return ret; | |
| } ]; | |
| for ( ; i < len; i++ ) { | |
| if ( (matcher = Expr.relative[ tokens[i].type ]) ) { | |
| matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; | |
| } else { | |
| matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); | |
| // Return special upon seeing a positional matcher | |
| if ( matcher[ expando ] ) { | |
| // Find the next relative operator (if any) for proper handling | |
| j = ++i; | |
| for ( ; j < len; j++ ) { | |
| if ( Expr.relative[ tokens[j].type ] ) { | |
| break; | |
| } | |
| } | |
| return setMatcher( | |
| i > 1 && elementMatcher( matchers ), | |
| i > 1 && toSelector( | |
| // If the preceding token was a descendant combinator, insert an implicit any-element `*` | |
| tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) | |
| ).replace( rtrim, "$1" ), | |
| matcher, | |
| i < j && matcherFromTokens( tokens.slice( i, j ) ), | |
| j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), | |
| j < len && toSelector( tokens ) | |
| ); | |
| } | |
| matchers.push( matcher ); | |
| } | |
| } | |
| return elementMatcher( matchers ); | |
| } | |
| function matcherFromGroupMatchers( elementMatchers, setMatchers ) { | |
| var bySet = setMatchers.length > 0, | |
| byElement = elementMatchers.length > 0, | |
| superMatcher = function( seed, context, xml, results, outermost ) { | |
| var elem, j, matcher, | |
| matchedCount = 0, | |
| i = "0", | |
| unmatched = seed && [], | |
| setMatched = [], | |
| contextBackup = outermostContext, | |
| // We must always have either seed elements or outermost context | |
| elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), | |
| // Use integer dirruns iff this is the outermost matcher | |
| dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), | |
| len = elems.length; | |
| if ( outermost ) { | |
| outermostContext = context !== document && context; | |
| } | |
| // Add elements passing elementMatchers directly to results | |
| // Keep `i` a string if there are no elements so `matchedCount` will be "00" below | |
| // Support: IE<9, Safari | |
| // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id | |
| for ( ; i !== len && (elem = elems[i]) != null; i++ ) { | |
| if ( byElement && elem ) { | |
| j = 0; | |
| while ( (matcher = elementMatchers[j++]) ) { | |
| if ( matcher( elem, context, xml ) ) { | |
| results.push( elem ); | |
| break; | |
| } | |
| } | |
| if ( outermost ) { | |
| dirruns = dirrunsUnique; | |
| } | |
| } | |
| // Track unmatched elements for set filters | |
| if ( bySet ) { | |
| // They will have gone through all possible matchers | |
| if ( (elem = !matcher && elem) ) { | |
| matchedCount--; | |
| } | |
| // Lengthen the array for every element, matched or not | |
| if ( seed ) { | |
| unmatched.push( elem ); | |
| } | |
| } | |
| } | |
| // Apply set filters to unmatched elements | |
| matchedCount += i; | |
| if ( bySet && i !== matchedCount ) { | |
| j = 0; | |
| while ( (matcher = setMatchers[j++]) ) { | |
| matcher( unmatched, setMatched, context, xml ); | |
| } | |
| if ( seed ) { | |
| // Reintegrate element matches to eliminate the need for sorting | |
| if ( matchedCount > 0 ) { | |
| while ( i-- ) { | |
| if ( !(unmatched[i] || setMatched[i]) ) { | |
| setMatched[i] = pop.call( results ); | |
| } | |
| } | |
| } | |
| // Discard index placeholder values to get only actual matches | |
| setMatched = condense( setMatched ); | |
| } | |
| // Add matches to results | |
| push.apply( results, setMatched ); | |
| // Seedless set matches succeeding multiple successful matchers stipulate sorting | |
| if ( outermost && !seed && setMatched.length > 0 && | |
| ( matchedCount + setMatchers.length ) > 1 ) { | |
| Sizzle.uniqueSort( results ); | |
| } | |
| } | |
| // Override manipulation of globals by nested matchers | |
| if ( outermost ) { | |
| dirruns = dirrunsUnique; | |
| outermostContext = contextBackup; | |
| } | |
| return unmatched; | |
| }; | |
| return bySet ? | |
| markFunction( superMatcher ) : | |
| superMatcher; | |
| } | |
| compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { | |
| var i, | |
| setMatchers = [], | |
| elementMatchers = [], | |
| cached = compilerCache[ selector + " " ]; | |
| if ( !cached ) { | |
| // Generate a function of recursive functions that can be used to check each element | |
| if ( !match ) { | |
| match = tokenize( selector ); | |
| } | |
| i = match.length; | |
| while ( i-- ) { | |
| cached = matcherFromTokens( match[i] ); | |
| if ( cached[ expando ] ) { | |
| setMatchers.push( cached ); | |
| } else { | |
| elementMatchers.push( cached ); | |
| } | |
| } | |
| // Cache the compiled function | |
| cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); | |
| // Save selector and tokenization | |
| cached.selector = selector; | |
| } | |
| return cached; | |
| }; | |
| /** | |
| * A low-level selection function that works with Sizzle's compiled | |
| * selector functions | |
| * @param {String|Function} selector A selector or a pre-compiled | |
| * selector function built with Sizzle.compile | |
| * @param {Element} context | |
| * @param {Array} [results] | |
| * @param {Array} [seed] A set of elements to match against | |
| */ | |
| select = Sizzle.select = function( selector, context, results, seed ) { | |
| var i, tokens, token, type, find, | |
| compiled = typeof selector === "function" && selector, | |
| match = !seed && tokenize( (selector = compiled.selector || selector) ); | |
| results = results || []; | |
| // Try to minimize operations if there is no seed and only one group | |
| if ( match.length === 1 ) { | |
| // Take a shortcut and set the context if the root selector is an ID | |
| tokens = match[0] = match[0].slice( 0 ); | |
| if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && | |
| support.getById && context.nodeType === 9 && documentIsHTML && | |
| Expr.relative[ tokens[1].type ] ) { | |
| context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; | |
| if ( !context ) { | |
| return results; | |
| // Precompiled matchers will still verify ancestry, so step up a level | |
| } else if ( compiled ) { | |
| context = context.parentNode; | |
| } | |
| selector = selector.slice( tokens.shift().value.length ); | |
| } | |
| // Fetch a seed set for right-to-left matching | |
| i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; | |
| while ( i-- ) { | |
| token = tokens[i]; | |
| // Abort if we hit a combinator | |
| if ( Expr.relative[ (type = token.type) ] ) { | |
| break; | |
| } | |
| if ( (find = Expr.find[ type ]) ) { | |
| // Search, expanding context for leading sibling combinators | |
| if ( (seed = find( | |
| token.matches[0].replace( runescape, funescape ), | |
| rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context | |
| )) ) { | |
| // If seed is empty or no tokens remain, we can return early | |
| tokens.splice( i, 1 ); | |
| selector = seed.length && toSelector( tokens ); | |
| if ( !selector ) { | |
| push.apply( results, seed ); | |
| return results; | |
| } | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| // Compile and execute a filtering function if one is not provided | |
| // Provide `match` to avoid retokenization if we modified the selector above | |
| ( compiled || compile( selector, match ) )( | |
| seed, | |
| context, | |
| !documentIsHTML, | |
| results, | |
| rsibling.test( selector ) && testContext( context.parentNode ) || context | |
| ); | |
| return results; | |
| }; | |
| // One-time assignments | |
| // Sort stability | |
| support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; | |
| // Support: Chrome 14-35+ | |
| // Always assume duplicates if they aren't passed to the comparison function | |
| support.detectDuplicates = !!hasDuplicate; | |
| // Initialize against the default document | |
| setDocument(); | |
| // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) | |
| // Detached nodes confoundingly follow *each other* | |
| support.sortDetached = assert(function( div1 ) { | |
| // Should return 1, but returns 4 (following) | |
| return div1.compareDocumentPosition( document.createElement("div") ) & 1; | |
| }); | |
| // Support: IE<8 | |
| // Prevent attribute/property "interpolation" | |
| // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx | |
| if ( !assert(function( div ) { | |
| div.innerHTML = "<a href='#'></a>"; | |
| return div.firstChild.getAttribute("href") === "#" ; | |
| }) ) { | |
| addHandle( "type|href|height|width", function( elem, name, isXML ) { | |
| if ( !isXML ) { | |
| return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); | |
| } | |
| }); | |
| } | |
| // Support: IE<9 | |
| // Use defaultValue in place of getAttribute("value") | |
| if ( !support.attributes || !assert(function( div ) { | |
| div.innerHTML = "<input/>"; | |
| div.firstChild.setAttribute( "value", "" ); | |
| return div.firstChild.getAttribute( "value" ) === ""; | |
| }) ) { | |
| addHandle( "value", function( elem, name, isXML ) { | |
| if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { | |
| return elem.defaultValue; | |
| } | |
| }); | |
| } | |
| // Support: IE<9 | |
| // Use getAttributeNode to fetch booleans when getAttribute lies | |
| if ( !assert(function( div ) { | |
| return div.getAttribute("disabled") == null; | |
| }) ) { | |
| addHandle( booleans, function( elem, name, isXML ) { | |
| var val; | |
| if ( !isXML ) { | |
| return elem[ name ] === true ? name.toLowerCase() : | |
| (val = elem.getAttributeNode( name )) && val.specified ? | |
| val.value : | |
| null; | |
| } | |
| }); | |
| } | |
| return Sizzle; | |
| })( window ); | |
| jQuery.find = Sizzle; | |
| jQuery.expr = Sizzle.selectors; | |
| jQuery.expr[":"] = jQuery.expr.pseudos; | |
| jQuery.unique = Sizzle.uniqueSort; | |
| jQuery.text = Sizzle.getText; | |
| jQuery.isXMLDoc = Sizzle.isXML; | |
| jQuery.contains = Sizzle.contains; | |
| var rneedsContext = jQuery.expr.match.needsContext; | |
| var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); | |
| var risSimple = /^.[^:#\[\.,]*$/; | |
| // Implement the identical functionality for filter and not | |
| function winnow( elements, qualifier, not ) { | |
| if ( jQuery.isFunction( qualifier ) ) { | |
| return jQuery.grep( elements, function( elem, i ) { | |
| /* jshint -W018 */ | |
| return !!qualifier.call( elem, i, elem ) !== not; | |
| }); | |
| } | |
| if ( qualifier.nodeType ) { | |
| return jQuery.grep( elements, function( elem ) { | |
| return ( elem === qualifier ) !== not; | |
| }); | |
| } | |
| if ( typeof qualifier === "string" ) { | |
| if ( risSimple.test( qualifier ) ) { | |
| return jQuery.filter( qualifier, elements, not ); | |
| } | |
| qualifier = jQuery.filter( qualifier, elements ); | |
| } | |
| return jQuery.grep( elements, function( elem ) { | |
| return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; | |
| }); | |
| } | |
| jQuery.filter = function( expr, elems, not ) { | |
| var elem = elems[ 0 ]; | |
| if ( not ) { | |
| expr = ":not(" + expr + ")"; | |
| } | |
| return elems.length === 1 && elem.nodeType === 1 ? | |
| jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : | |
| jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { | |
| return elem.nodeType === 1; | |
| })); | |
| }; | |
| jQuery.fn.extend({ | |
| find: function( selector ) { | |
| var i, | |
| len = this.length, | |
| ret = [], | |
| self = this; | |
| if ( typeof selector !== "string" ) { | |
| return this.pushStack( jQuery( selector ).filter(function() { | |
| for ( i = 0; i < len; i++ ) { | |
| if ( jQuery.contains( self[ i ], this ) ) { | |
| return true; | |
| } | |
| } | |
| }) ); | |
| } | |
| for ( i = 0; i < len; i++ ) { | |
| jQuery.find( selector, self[ i ], ret ); | |
| } | |
| // Needed because $( selector, context ) becomes $( context ).find( selector ) | |
| ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); | |
| ret.selector = this.selector ? this.selector + " " + selector : selector; | |
| return ret; | |
| }, | |
| filter: function( selector ) { | |
| return this.pushStack( winnow(this, selector || [], false) ); | |
| }, | |
| not: function( selector ) { | |
| return this.pushStack( winnow(this, selector || [], true) ); | |
| }, | |
| is: function( selector ) { | |
| return !!winnow( | |
| this, | |
| // If this is a positional/relative selector, check membership in the returned set | |
| // so $("p:first").is("p:last") won't return true for a doc with two "p". | |
| typeof selector === "string" && rneedsContext.test( selector ) ? | |
| jQuery( selector ) : | |
| selector || [], | |
| false | |
| ).length; | |
| } | |
| }); | |
| // Initialize a jQuery object | |
| // A central reference to the root jQuery(document) | |
| var rootjQuery, | |
| // A simple way to check for HTML strings | |
| // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) | |
| // Strict HTML recognition (#11290: must start with <) | |
| rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, | |
| init = jQuery.fn.init = function( selector, context ) { | |
| var match, elem; | |
| // HANDLE: $(""), $(null), $(undefined), $(false) | |
| if ( !selector ) { | |
| return this; | |
| } | |
| // Handle HTML strings | |
| if ( typeof selector === "string" ) { | |
| if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { | |
| // Assume that strings that start and end with <> are HTML and skip the regex check | |
| match = [ null, selector, null ]; | |
| } else { | |
| match = rquickExpr.exec( selector ); | |
| } | |
| // Match html or make sure no context is specified for #id | |
| if ( match && (match[1] || !context) ) { | |
| // HANDLE: $(html) -> $(array) | |
| if ( match[1] ) { | |
| context = context instanceof jQuery ? context[0] : context; | |
| // Option to run scripts is true for back-compat | |
| // Intentionally let the error be thrown if parseHTML is not present | |
| jQuery.merge( this, jQuery.parseHTML( | |
| match[1], | |
| context && context.nodeType ? context.ownerDocument || context : document, | |
| true | |
| ) ); | |
| // HANDLE: $(html, props) | |
| if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { | |
| for ( match in context ) { | |
| // Properties of context are called as methods if possible | |
| if ( jQuery.isFunction( this[ match ] ) ) { | |
| this[ match ]( context[ match ] ); | |
| // ...and otherwise set as attributes | |
| } else { | |
| this.attr( match, context[ match ] ); | |
| } | |
| } | |
| } | |
| return this; | |
| // HANDLE: $(#id) | |
| } else { | |
| elem = document.getElementById( match[2] ); | |
| // Support: Blackberry 4.6 | |
| // gEBID returns nodes no longer in the document (#6963) | |
| if ( elem && elem.parentNode ) { | |
| // Inject the element directly into the jQuery object | |
| this.length = 1; | |
| this[0] = elem; | |
| } | |
| this.context = document; | |
| this.selector = selector; | |
| return this; | |
| } | |
| // HANDLE: $(expr, $(...)) | |
| } else if ( !context || context.jquery ) { | |
| return ( context || rootjQuery ).find( selector ); | |
| // HANDLE: $(expr, context) | |
| // (which is just equivalent to: $(context).find(expr) | |
| } else { | |
| return this.constructor( context ).find( selector ); | |
| } | |
| // HANDLE: $(DOMElement) | |
| } else if ( selector.nodeType ) { | |
| this.context = this[0] = selector; | |
| this.length = 1; | |
| return this; | |
| // HANDLE: $(function) | |
| // Shortcut for document ready | |
| } else if ( jQuery.isFunction( selector ) ) { | |
| return typeof rootjQuery.ready !== "undefined" ? | |
| rootjQuery.ready( selector ) : | |
| // Execute immediately if ready is not present | |
| selector( jQuery ); | |
| } | |
| if ( selector.selector !== undefined ) { | |
| this.selector = selector.selector; | |
| this.context = selector.context; | |
| } | |
| return jQuery.makeArray( selector, this ); | |
| }; | |
| // Give the init function the jQuery prototype for later instantiation | |
| init.prototype = jQuery.fn; | |
| // Initialize central reference | |
| rootjQuery = jQuery( document ); | |
| var rparentsprev = /^(?:parents|prev(?:Until|All))/, | |
| // Methods guaranteed to produce a unique set when starting from a unique set | |
| guaranteedUnique = { | |
| children: true, | |
| contents: true, | |
| next: true, | |
| prev: true | |
| }; | |
| jQuery.extend({ | |
| dir: function( elem, dir, until ) { | |
| var matched = [], | |
| truncate = until !== undefined; | |
| while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { | |
| if ( elem.nodeType === 1 ) { | |
| if ( truncate && jQuery( elem ).is( until ) ) { | |
| break; | |
| } | |
| matched.push( elem ); | |
| } | |
| } | |
| return matched; | |
| }, | |
| sibling: function( n, elem ) { | |
| var matched = []; | |
| for ( ; n; n = n.nextSibling ) { | |
| if ( n.nodeType === 1 && n !== elem ) { | |
| matched.push( n ); | |
| } | |
| } | |
| return matched; | |
| } | |
| }); | |
| jQuery.fn.extend({ | |
| has: function( target ) { | |
| var targets = jQuery( target, this ), | |
| l = targets.length; | |
| return this.filter(function() { | |
| var i = 0; | |
| for ( ; i < l; i++ ) { | |
| if ( jQuery.contains( this, targets[i] ) ) { | |
| return true; | |
| } | |
| } | |
| }); | |
| }, | |
| closest: function( selectors, context ) { | |
| var cur, | |
| i = 0, | |
| l = this.length, | |
| matched = [], | |
| pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? | |
| jQuery( selectors, context || this.context ) : | |
| 0; | |
| for ( ; i < l; i++ ) { | |
| for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { | |
| // Always skip document fragments | |
| if ( cur.nodeType < 11 && (pos ? | |
| pos.index(cur) > -1 : | |
| // Don't pass non-elements to Sizzle | |
| cur.nodeType === 1 && | |
| jQuery.find.matchesSelector(cur, selectors)) ) { | |
| matched.push( cur ); | |
| break; | |
| } | |
| } | |
| } | |
| return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); | |
| }, | |
| // Determine the position of an element within the set | |
| index: function( elem ) { | |
| // No argument, return index in parent | |
| if ( !elem ) { | |
| return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; | |
| } | |
| // Index in selector | |
| if ( typeof elem === "string" ) { | |
| return indexOf.call( jQuery( elem ), this[ 0 ] ); | |
| } | |
| // Locate the position of the desired element | |
| return indexOf.call( this, | |
| // If it receives a jQuery object, the first element is used | |
| elem.jquery ? elem[ 0 ] : elem | |
| ); | |
| }, | |
| add: function( selector, context ) { | |
| return this.pushStack( | |
| jQuery.unique( | |
| jQuery.merge( this.get(), jQuery( selector, context ) ) | |
| ) | |
| ); | |
| }, | |
| addBack: function( selector ) { | |
| return this.add( selector == null ? | |
| this.prevObject : this.prevObject.filter(selector) | |
| ); | |
| } | |
| }); | |
| function sibling( cur, dir ) { | |
| while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} | |
| return cur; | |
| } | |
| jQuery.each({ | |
| parent: function( elem ) { | |
| var parent = elem.parentNode; | |
| return parent && parent.nodeType !== 11 ? parent : null; | |
| }, | |
| parents: function( elem ) { | |
| return jQuery.dir( elem, "parentNode" ); | |
| }, | |
| parentsUntil: function( elem, i, until ) { | |
| return jQuery.dir( elem, "parentNode", until ); | |
| }, | |
| next: function( elem ) { | |
| return sibling( elem, "nextSibling" ); | |
| }, | |
| prev: function( elem ) { | |
| return sibling( elem, "previousSibling" ); | |
| }, | |
| nextAll: function( elem ) { | |
| return jQuery.dir( elem, "nextSibling" ); | |
| }, | |
| prevAll: function( elem ) { | |
| return jQuery.dir( elem, "previousSibling" ); | |
| }, | |
| nextUntil: function( elem, i, until ) { | |
| return jQuery.dir( elem, "nextSibling", until ); | |
| }, | |
| prevUntil: function( elem, i, until ) { | |
| return jQuery.dir( elem, "previousSibling", until ); | |
| }, | |
| siblings: function( elem ) { | |
| return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); | |
| }, | |
| children: function( elem ) { | |
| return jQuery.sibling( elem.firstChild ); | |
| }, | |
| contents: function( elem ) { | |
| return elem.contentDocument || jQuery.merge( [], elem.childNodes ); | |
| } | |
| }, function( name, fn ) { | |
| jQuery.fn[ name ] = function( until, selector ) { | |
| var matched = jQuery.map( this, fn, until ); | |
| if ( name.slice( -5 ) !== "Until" ) { | |
| selector = until; | |
| } | |
| if ( selector && typeof selector === "string" ) { | |
| matched = jQuery.filter( selector, matched ); | |
| } | |
| if ( this.length > 1 ) { | |
| // Remove duplicates | |
| if ( !guaranteedUnique[ name ] ) { | |
| jQuery.unique( matched ); | |
| } | |
| // Reverse order for parents* and prev-derivatives | |
| if ( rparentsprev.test( name ) ) { | |
| matched.reverse(); | |
| } | |
| } | |
| return this.pushStack( matched ); | |
| }; | |
| }); | |
| var rnotwhite = (/\S+/g); | |
| // String to Object options format cache | |
| var optionsCache = {}; | |
| // Convert String-formatted options into Object-formatted ones and store in cache | |
| function createOptions( options ) { | |
| var object = optionsCache[ options ] = {}; | |
| jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { | |
| object[ flag ] = true; | |
| }); | |
| return object; | |
| } | |
| /* | |
| * Create a callback list using the following parameters: | |
| * | |
| * options: an optional list of space-separated options that will change how | |
| * the callback list behaves or a more traditional option object | |
| * | |
| * By default a callback list will act like an event callback list and can be | |
| * "fired" multiple times. | |
| * | |
| * Possible options: | |
| * | |
| * once: will ensure the callback list can only be fired once (like a Deferred) | |
| * | |
| * memory: will keep track of previous values and will call any callback added | |
| * after the list has been fired right away with the latest "memorized" | |
| * values (like a Deferred) | |
| * | |
| * unique: will ensure a callback can only be added once (no duplicate in the list) | |
| * | |
| * stopOnFalse: interrupt callings when a callback returns false | |
| * | |
| */ | |
| jQuery.Callbacks = function( options ) { | |
| // Convert options from String-formatted to Object-formatted if needed | |
| // (we check in cache first) | |
| options = typeof options === "string" ? | |
| ( optionsCache[ options ] || createOptions( options ) ) : | |
| jQuery.extend( {}, options ); | |
| var // Last fire value (for non-forgettable lists) | |
| memory, | |
| // Flag to know if list was already fired | |
| fired, | |
| // Flag to know if list is currently firing | |
| firing, | |
| // First callback to fire (used internally by add and fireWith) | |
| firingStart, | |
| // End of the loop when firing | |
| firingLength, | |
| // Index of currently firing callback (modified by remove if needed) | |
| firingIndex, | |
| // Actual callback list | |
| list = [], | |
| // Stack of fire calls for repeatable lists | |
| stack = !options.once && [], | |
| // Fire callbacks | |
| fire = function( data ) { | |
| memory = options.memory && data; | |
| fired = true; | |
| firingIndex = firingStart || 0; | |
| firingStart = 0; | |
| firingLength = list.length; | |
| firing = true; | |
| for ( ; list && firingIndex < firingLength; firingIndex++ ) { | |
| if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { | |
| memory = false; // To prevent further calls using add | |
| break; | |
| } | |
| } | |
| firing = false; | |
| if ( list ) { | |
| if ( stack ) { | |
| if ( stack.length ) { | |
| fire( stack.shift() ); | |
| } | |
| } else if ( memory ) { | |
| list = []; | |
| } else { | |
| self.disable(); | |
| } | |
| } | |
| }, | |
| // Actual Callbacks object | |
| self = { | |
| // Add a callback or a collection of callbacks to the list | |
| add: function() { | |
| if ( list ) { | |
| // First, we save the current length | |
| var start = list.length; | |
| (function add( args ) { | |
| jQuery.each( args, function( _, arg ) { | |
| var type = jQuery.type( arg ); | |
| if ( type === "function" ) { | |
| if ( !options.unique || !self.has( arg ) ) { | |
| list.push( arg ); | |
| } | |
| } else if ( arg && arg.length && type !== "string" ) { | |
| // Inspect recursively | |
| add( arg ); | |
| } | |
| }); | |
| })( arguments ); | |
| // Do we need to add the callbacks to the | |
| // current firing batch? | |
| if ( firing ) { | |
| firingLength = list.length; | |
| // With memory, if we're not firing then | |
| // we should call right away | |
| } else if ( memory ) { | |
| firingStart = start; | |
| fire( memory ); | |
| } | |
| } | |
| return this; | |
| }, | |
| // Remove a callback from the list | |
| remove: function() { | |
| if ( list ) { | |
| jQuery.each( arguments, function( _, arg ) { | |
| var index; | |
| while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { | |
| list.splice( index, 1 ); | |
| // Handle firing indexes | |
| if ( firing ) { | |
| if ( index <= firingLength ) { | |
| firingLength--; | |
| } | |
| if ( index <= firingIndex ) { | |
| firingIndex--; | |
| } | |
| } | |
| } | |
| }); | |
| } | |
| return this; | |
| }, | |
| // Check if a given callback is in the list. | |
| // If no argument is given, return whether or not list has callbacks attached. | |
| has: function( fn ) { | |
| return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); | |
| }, | |
| // Remove all callbacks from the list | |
| empty: function() { | |
| list = []; | |
| firingLength = 0; | |
| return this; | |
| }, | |
| // Have the list do nothing anymore | |
| disable: function() { | |
| list = stack = memory = undefined; | |
| return this; | |
| }, | |
| // Is it disabled? | |
| disabled: function() { | |
| return !list; | |
| }, | |
| // Lock the list in its current state | |
| lock: function() { | |
| stack = undefined; | |
| if ( !memory ) { | |
| self.disable(); | |
| } | |
| return this; | |
| }, | |
| // Is it locked? | |
| locked: function() { | |
| return !stack; | |
| }, | |
| // Call all callbacks with the given context and arguments | |
| fireWith: function( context, args ) { | |
| if ( list && ( !fired || stack ) ) { | |
| args = args || []; | |
| args = [ context, args.slice ? args.slice() : args ]; | |
| if ( firing ) { | |
| stack.push( args ); | |
| } else { | |
| fire( args ); | |
| } | |
| } | |
| return this; | |
| }, | |
| // Call all the callbacks with the given arguments | |
| fire: function() { | |
| self.fireWith( this, arguments ); | |
| return this; | |
| }, | |
| // To know if the callbacks have already been called at least once | |
| fired: function() { | |
| return !!fired; | |
| } | |
| }; | |
| return self; | |
| }; | |
| jQuery.extend({ | |
| Deferred: function( func ) { | |
| var tuples = [ | |
| // action, add listener, listener list, final state | |
| [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], | |
| [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], | |
| [ "notify", "progress", jQuery.Callbacks("memory") ] | |
| ], | |
| state = "pending", | |
| promise = { | |
| state: function() { | |
| return state; | |
| }, | |
| always: function() { | |
| deferred.done( arguments ).fail( arguments ); | |
| return this; | |
| }, | |
| then: function( /* fnDone, fnFail, fnProgress */ ) { | |
| var fns = arguments; | |
| return jQuery.Deferred(function( newDefer ) { | |
| jQuery.each( tuples, function( i, tuple ) { | |
| var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; | |
| // deferred[ done | fail | progress ] for forwarding actions to newDefer | |
| deferred[ tuple[1] ](function() { | |
| var returned = fn && fn.apply( this, arguments ); | |
| if ( returned && jQuery.isFunction( returned.promise ) ) { | |
| returned.promise() | |
| .done( newDefer.resolve ) | |
| .fail( newDefer.reject ) | |
| .progress( newDefer.notify ); | |
| } else { | |
| newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); | |
| } | |
| }); | |
| }); | |
| fns = null; | |
| }).promise(); | |
| }, | |
| // Get a promise for this deferred | |
| // If obj is provided, the promise aspect is added to the object | |
| promise: function( obj ) { | |
| return obj != null ? jQuery.extend( obj, promise ) : promise; | |
| } | |
| }, | |
| deferred = {}; | |
| // Keep pipe for back-compat | |
| promise.pipe = promise.then; | |
| // Add list-specific methods | |
| jQuery.each( tuples, function( i, tuple ) { | |
| var list = tuple[ 2 ], | |
| stateString = tuple[ 3 ]; | |
| // promise[ done | fail | progress ] = list.add | |
| promise[ tuple[1] ] = list.add; | |
| // Handle state | |
| if ( stateString ) { | |
| list.add(function() { | |
| // state = [ resolved | rejected ] | |
| state = stateString; | |
| // [ reject_list | resolve_list ].disable; progress_list.lock | |
| }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); | |
| } | |
| // deferred[ resolve | reject | notify ] | |
| deferred[ tuple[0] ] = function() { | |
| deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); | |
| return this; | |
| }; | |
| deferred[ tuple[0] + "With" ] = list.fireWith; | |
| }); | |
| // Make the deferred a promise | |
| promise.promise( deferred ); | |
| // Call given func if any | |
| if ( func ) { | |
| func.call( deferred, deferred ); | |
| } | |
| // All done! | |
| return deferred; | |
| }, | |
| // Deferred helper | |
| when: function( subordinate /* , ..., subordinateN */ ) { | |
| var i = 0, | |
| resolveValues = slice.call( arguments ), | |
| length = resolveValues.length, | |
| // the count of uncompleted subordinates | |
| remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, | |
| // the master Deferred. If resolveValues consist of only a single Deferred, just use that. | |
| deferred = remaining === 1 ? subordinate : jQuery.Deferred(), | |
| // Update function for both resolve and progress values | |
| updateFunc = function( i, contexts, values ) { | |
| return function( value ) { | |
| contexts[ i ] = this; | |
| values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; | |
| if ( values === progressValues ) { | |
| deferred.notifyWith( contexts, values ); | |
| } else if ( !( --remaining ) ) { | |
| deferred.resolveWith( contexts, values ); | |
| } | |
| }; | |
| }, | |
| progressValues, progressContexts, resolveContexts; | |
| // Add listeners to Deferred subordinates; treat others as resolved | |
| if ( length > 1 ) { | |
| progressValues = new Array( length ); | |
| progressContexts = new Array( length ); | |
| resolveContexts = new Array( length ); | |
| for ( ; i < length; i++ ) { | |
| if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { | |
| resolveValues[ i ].promise() | |
| .done( updateFunc( i, resolveContexts, resolveValues ) ) | |
| .fail( deferred.reject ) | |
| .progress( updateFunc( i, progressContexts, progressValues ) ); | |
| } else { | |
| --remaining; | |
| } | |
| } | |
| } | |
| // If we're not waiting on anything, resolve the master | |
| if ( !remaining ) { | |
| deferred.resolveWith( resolveContexts, resolveValues ); | |
| } | |
| return deferred.promise(); | |
| } | |
| }); | |
| // The deferred used on DOM ready | |
| var readyList; | |
| jQuery.fn.ready = function( fn ) { | |
| // Add the callback | |
| jQuery.ready.promise().done( fn ); | |
| return this; | |
| }; | |
| jQuery.extend({ | |
| // Is the DOM ready to be used? Set to true once it occurs. | |
| isReady: false, | |
| // A counter to track how many items to wait for before | |
| // the ready event fires. See #6781 | |
| readyWait: 1, | |
| // Hold (or release) the ready event | |
| holdReady: function( hold ) { | |
| if ( hold ) { | |
| jQuery.readyWait++; | |
| } else { | |
| jQuery.ready( true ); | |
| } | |
| }, | |
| // Handle when the DOM is ready | |
| ready: function( wait ) { | |
| // Abort if there are pending holds or we're already ready | |
| if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { | |
| return; | |
| } | |
| // Remember that the DOM is ready | |
| jQuery.isReady = true; | |
| // If a normal DOM Ready event fired, decrement, and wait if need be | |
| if ( wait !== true && --jQuery.readyWait > 0 ) { | |
| return; | |
| } | |
| // If there are functions bound, to execute | |
| readyList.resolveWith( document, [ jQuery ] ); | |
| // Trigger any bound ready events | |
| if ( jQuery.fn.triggerHandler ) { | |
| jQuery( document ).triggerHandler( "ready" ); | |
| jQuery( document ).off( "ready" ); | |
| } | |
| } | |
| }); | |
| /** | |
| * The ready event handler and self cleanup method | |
| */ | |
| function completed() { | |
| document.removeEventListener( "DOMContentLoaded", completed, false ); | |
| window.removeEventListener( "load", completed, false ); | |
| jQuery.ready(); | |
| } | |
| jQuery.ready.promise = function( obj ) { | |
| if ( !readyList ) { | |
| readyList = jQuery.Deferred(); | |
| // Catch cases where $(document).ready() is called after the browser event has already occurred. | |
| // We once tried to use readyState "interactive" here, but it caused issues like the one | |
| // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 | |
| if ( document.readyState === "complete" ) { | |
| // Handle it asynchronously to allow scripts the opportunity to delay ready | |
| setTimeout( jQuery.ready ); | |
| } else { | |
| // Use the handy event callback | |
| document.addEventListener( "DOMContentLoaded", completed, false ); | |
| // A fallback to window.onload, that will always work | |
| window.addEventListener( "load", completed, false ); | |
| } | |
| } | |
| return readyList.promise( obj ); | |
| }; | |
| // Kick off the DOM ready check even if the user does not | |
| jQuery.ready.promise(); | |
| // Multifunctional method to get and set values of a collection | |
| // The value/s can optionally be executed if it's a function | |
| var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { | |
| var i = 0, | |
| len = elems.length, | |
| bulk = key == null; | |
| // Sets many values | |
| if ( jQuery.type( key ) === "object" ) { | |
| chainable = true; | |
| for ( i in key ) { | |
| jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); | |
| } | |
| // Sets one value | |
| } else if ( value !== undefined ) { | |
| chainable = true; | |
| if ( !jQuery.isFunction( value ) ) { | |
| raw = true; | |
| } | |
| if ( bulk ) { | |
| // Bulk operations run against the entire set | |
| if ( raw ) { | |
| fn.call( elems, value ); | |
| fn = null; | |
| // ...except when executing function values | |
| } else { | |
| bulk = fn; | |
| fn = function( elem, key, value ) { | |
| return bulk.call( jQuery( elem ), value ); | |
| }; | |
| } | |
| } | |
| if ( fn ) { | |
| for ( ; i < len; i++ ) { | |
| fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); | |
| } | |
| } | |
| } | |
| return chainable ? | |
| elems : | |
| // Gets | |
| bulk ? | |
| fn.call( elems ) : | |
| len ? fn( elems[0], key ) : emptyGet; | |
| }; | |
| /** | |
| * Determines whether an object can have data | |
| */ | |
| jQuery.acceptData = function( owner ) { | |
| // Accepts only: | |
| // - Node | |
| // - Node.ELEMENT_NODE | |
| // - Node.DOCUMENT_NODE | |
| // - Object | |
| // - Any | |
| /* jshint -W018 */ | |
| return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); | |
| }; | |
| function Data() { | |
| // Support: Android<4, | |
| // Old WebKit does not have Object.preventExtensions/freeze method, | |
| // return new empty object instead with no [[set]] accessor | |
| Object.defineProperty( this.cache = {}, 0, { | |
| get: function() { | |
| return {}; | |
| } | |
| }); | |
| this.expando = jQuery.expando + Data.uid++; | |
| } | |
| Data.uid = 1; | |
| Data.accepts = jQuery.acceptData; | |
| Data.prototype = { | |
| key: function( owner ) { | |
| // We can accept data for non-element nodes in modern browsers, | |
| // but we should not, see #8335. | |
| // Always return the key for a frozen object. | |
| if ( !Data.accepts( owner ) ) { | |
| return 0; | |
| } | |
| var descriptor = {}, | |
| // Check if the owner object already has a cache key | |
| unlock = owner[ this.expando ]; | |
| // If not, create one | |
| if ( !unlock ) { | |
| unlock = Data.uid++; | |
| // Secure it in a non-enumerable, non-writable property | |
| try { | |
| descriptor[ this.expando ] = { value: unlock }; | |
| Object.defineProperties( owner, descriptor ); | |
| // Support: Android<4 | |
| // Fallback to a less secure definition | |
| } catch ( e ) { | |
| descriptor[ this.expando ] = unlock; | |
| jQuery.extend( owner, descriptor ); | |
| } | |
| } | |
| // Ensure the cache object | |
| if ( !this.cache[ unlock ] ) { | |
| this.cache[ unlock ] = {}; | |
| } | |
| return unlock; | |
| }, | |
| set: function( owner, data, value ) { | |
| var prop, | |
| // There may be an unlock assigned to this node, | |
| // if there is no entry for this "owner", create one inline | |
| // and set the unlock as though an owner entry had always existed | |
| unlock = this.key( owner ), | |
| cache = this.cache[ unlock ]; | |
| // Handle: [ owner, key, value ] args | |
| if ( typeof data === "string" ) { | |
| cache[ data ] = value; | |
| // Handle: [ owner, { properties } ] args | |
| } else { | |
| // Fresh assignments by object are shallow copied | |
| if ( jQuery.isEmptyObject( cache ) ) { | |
| jQuery.extend( this.cache[ unlock ], data ); | |
| // Otherwise, copy the properties one-by-one to the cache object | |
| } else { | |
| for ( prop in data ) { | |
| cache[ prop ] = data[ prop ]; | |
| } | |
| } | |
| } | |
| return cache; | |
| }, | |
| get: function( owner, key ) { | |
| // Either a valid cache is found, or will be created. | |
| // New caches will be created and the unlock returned, | |
| // allowing direct access to the newly created | |
| // empty data object. A valid owner object must be provided. | |
| var cache = this.cache[ this.key( owner ) ]; | |
| return key === undefined ? | |
| cache : cache[ key ]; | |
| }, | |
| access: function( owner, key, value ) { | |
| var stored; | |
| // In cases where either: | |
| // | |
| // 1. No key was specified | |
| // 2. A string key was specified, but no value provided | |
| // | |
| // Take the "read" path and allow the get method to determine | |
| // which value to return, respectively either: | |
| // | |
| // 1. The entire cache object | |
| // 2. The data stored at the key | |
| // | |
| if ( key === undefined || | |
| ((key && typeof key === "string") && value === undefined) ) { | |
| stored = this.get( owner, key ); | |
| return stored !== undefined ? | |
| stored : this.get( owner, jQuery.camelCase(key) ); | |
| } | |
| // [*]When the key is not a string, or both a key and value | |
| // are specified, set or extend (existing objects) with either: | |
| // | |
| // 1. An object of properties | |
| // 2. A key and value | |
| // | |
| this.set( owner, key, value ); | |
| // Since the "set" path can have two possible entry points | |
| // return the expected data based on which path was taken[*] | |
| return value !== undefined ? value : key; | |
| }, | |
| remove: function( owner, key ) { | |
| var i, name, camel, | |
| unlock = this.key( owner ), | |
| cache = this.cache[ unlock ]; | |
| if ( key === undefined ) { | |
| this.cache[ unlock ] = {}; | |
| } else { | |
| // Support array or space separated string of keys | |
| if ( jQuery.isArray( key ) ) { | |
| // If "name" is an array of keys... | |
| // When data is initially created, via ("key", "val") signature, | |
| // keys will be converted to camelCase. | |
| // Since there is no way to tell _how_ a key was added, remove | |
| // both plain key and camelCase key. #12786 | |
| // This will only penalize the array argument path. | |
| name = key.concat( key.map( jQuery.camelCase ) ); | |
| } else { | |
| camel = jQuery.camelCase( key ); | |
| // Try the string as a key before any manipulation | |
| if ( key in cache ) { | |
| name = [ key, camel ]; | |
| } else { | |
| // If a key with the spaces exists, use it. | |
| // Otherwise, create an array by matching non-whitespace | |
| name = camel; | |
| name = name in cache ? | |
| [ name ] : ( name.match( rnotwhite ) || [] ); | |
| } | |
| } | |
| i = name.length; | |
| while ( i-- ) { | |
| delete cache[ name[ i ] ]; | |
| } | |
| } | |
| }, | |
| hasData: function( owner ) { | |
| return !jQuery.isEmptyObject( | |
| this.cache[ owner[ this.expando ] ] || {} | |
| ); | |
| }, | |
| discard: function( owner ) { | |
| if ( owner[ this.expando ] ) { | |
| delete this.cache[ owner[ this.expando ] ]; | |
| } | |
| } | |
| }; | |
| var data_priv = new Data(); | |
| var data_user = new Data(); | |
| // Implementation Summary | |
| // | |
| // 1. Enforce API surface and semantic compatibility with 1.9.x branch | |
| // 2. Improve the module's maintainability by reducing the storage | |
| // paths to a single mechanism. | |
| // 3. Use the same single mechanism to support "private" and "user" data. | |
| // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) | |
| // 5. Avoid exposing implementation details on user objects (eg. expando properties) | |
| // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 | |
| var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, | |
| rmultiDash = /([A-Z])/g; | |
| function dataAttr( elem, key, data ) { | |
| var name; | |
| // If nothing was found internally, try to fetch any | |
| // data from the HTML5 data-* attribute | |
| if ( data === undefined && elem.nodeType === 1 ) { | |
| name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); | |
| data = elem.getAttribute( name ); | |
| if ( typeof data === "string" ) { | |
| try { | |
| data = data === "true" ? true : | |
| data === "false" ? false : | |
| data === "null" ? null : | |
| // Only convert to a number if it doesn't change the string | |
| +data + "" === data ? +data : | |
| rbrace.test( data ) ? jQuery.parseJSON( data ) : | |
| data; | |
| } catch( e ) {} | |
| // Make sure we set the data so it isn't changed later | |
| data_user.set( elem, key, data ); | |
| } else { | |
| data = undefined; | |
| } | |
| } | |
| return data; | |
| } | |
| jQuery.extend({ | |
| hasData: function( elem ) { | |
| return data_user.hasData( elem ) || data_priv.hasData( elem ); | |
| }, | |
| data: function( elem, name, data ) { | |
| return data_user.access( elem, name, data ); | |
| }, | |
| removeData: function( elem, name ) { | |
| data_user.remove( elem, name ); | |
| }, | |
| // TODO: Now that all calls to _data and _removeData have been replaced | |
| // with direct calls to data_priv methods, these can be deprecated. | |
| _data: function( elem, name, data ) { | |
| return data_priv.access( elem, name, data ); | |
| }, | |
| _removeData: function( elem, name ) { | |
| data_priv.remove( elem, name ); | |
| } | |
| }); | |
| jQuery.fn.extend({ | |
| data: function( key, value ) { | |
| var i, name, data, | |
| elem = this[ 0 ], | |
| attrs = elem && elem.attributes; | |
| // Gets all values | |
| if ( key === undefined ) { | |
| if ( this.length ) { | |
| data = data_user.get( elem ); | |
| if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { | |
| i = attrs.length; | |
| while ( i-- ) { | |
| // Support: IE11+ | |
| // The attrs elements can be null (#14894) | |
| if ( attrs[ i ] ) { | |
| name = attrs[ i ].name; | |
| if ( name.indexOf( "data-" ) === 0 ) { | |
| name = jQuery.camelCase( name.slice(5) ); | |
| dataAttr( elem, name, data[ name ] ); | |
| } | |
| } | |
| } | |
| data_priv.set( elem, "hasDataAttrs", true ); | |
| } | |
| } | |
| return data; | |
| } | |
| // Sets multiple values | |
| if ( typeof key === "object" ) { | |
| return this.each(function() { | |
| data_user.set( this, key ); | |
| }); | |
| } | |
| return access( this, function( value ) { | |
| var data, | |
| camelKey = jQuery.camelCase( key ); | |
| // The calling jQuery object (element matches) is not empty | |
| // (and therefore has an element appears at this[ 0 ]) and the | |
| // `value` parameter was not undefined. An empty jQuery object | |
| // will result in `undefined` for elem = this[ 0 ] which will | |
| // throw an exception if an attempt to read a data cache is made. | |
| if ( elem && value === undefined ) { | |
| // Attempt to get data from the cache | |
| // with the key as-is | |
| data = data_user.get( elem, key ); | |
| if ( data !== undefined ) { | |
| return data; | |
| } | |
| // Attempt to get data from the cache | |
| // with the key camelized | |
| data = data_user.get( elem, camelKey ); | |
| if ( data !== undefined ) { | |
| return data; | |
| } | |
| // Attempt to "discover" the data in | |
| // HTML5 custom data-* attrs | |
| data = dataAttr( elem, camelKey, undefined ); | |
| if ( data !== undefined ) { | |
| return data; | |
| } | |
| // We tried really hard, but the data doesn't exist. | |
| return; | |
| } | |
| // Set the data... | |
| this.each(function() { | |
| // First, attempt to store a copy or reference of any | |
| // data that might've been store with a camelCased key. | |
| var data = data_user.get( this, camelKey ); | |
| // For HTML5 data-* attribute interop, we have to | |
| // store property names with dashes in a camelCase form. | |
| // This might not apply to all properties...* | |
| data_user.set( this, camelKey, value ); | |
| // *... In the case of properties that might _actually_ | |
| // have dashes, we need to also store a copy of that | |
| // unchanged property. | |
| if ( key.indexOf("-") !== -1 && data !== undefined ) { | |
| data_user.set( this, key, value ); | |
| } | |
| }); | |
| }, null, value, arguments.length > 1, null, true ); | |
| }, | |
| removeData: function( key ) { | |
| return this.each(function() { | |
| data_user.remove( this, key ); | |
| }); | |
| } | |
| }); | |
| jQuery.extend({ | |
| queue: function( elem, type, data ) { | |
| var queue; | |
| if ( elem ) { | |
| type = ( type || "fx" ) + "queue"; | |
| queue = data_priv.get( elem, type ); | |
| // Speed up dequeue by getting out quickly if this is just a lookup | |
| if ( data ) { | |
| if ( !queue || jQuery.isArray( data ) ) { | |
| queue = data_priv.access( elem, type, jQuery.makeArray(data) ); | |
| } else { | |
| queue.push( data ); | |
| } | |
| } | |
| return queue || []; | |
| } | |
| }, | |
| dequeue: function( elem, type ) { | |
| type = type || "fx"; | |
| var queue = jQuery.queue( elem, type ), | |
| startLength = queue.length, | |
| fn = queue.shift(), | |
| hooks = jQuery._queueHooks( elem, type ), | |
| next = function() { | |
| jQuery.dequeue( elem, type ); | |
| }; | |
| // If the fx queue is dequeued, always remove the progress sentinel | |
| if ( fn === "inprogress" ) { | |
| fn = queue.shift(); | |
| startLength--; | |
| } | |
| if ( fn ) { | |
| // Add a progress sentinel to prevent the fx queue from being | |
| // automatically dequeued | |
| if ( type === "fx" ) { | |
| queue.unshift( "inprogress" ); | |
| } | |
| // Clear up the last queue stop function | |
| delete hooks.stop; | |
| fn.call( elem, next, hooks ); | |
| } | |
| if ( !startLength && hooks ) { | |
| hooks.empty.fire(); | |
| } | |
| }, | |
| // Not public - generate a queueHooks object, or return the current one | |
| _queueHooks: function( elem, type ) { | |
| var key = type + "queueHooks"; | |
| return data_priv.get( elem, key ) || data_priv.access( elem, key, { | |
| empty: jQuery.Callbacks("once memory").add(function() { | |
| data_priv.remove( elem, [ type + "queue", key ] ); | |
| }) | |
| }); | |
| } | |
| }); | |
| jQuery.fn.extend({ | |
| queue: function( type, data ) { | |
| var setter = 2; | |
| if ( typeof type !== "string" ) { | |
| data = type; | |
| type = "fx"; | |
| setter--; | |
| } | |
| if ( arguments.length < setter ) { | |
| return jQuery.queue( this[0], type ); | |
| } | |
| return data === undefined ? | |
| this : | |
| this.each(function() { | |
| var queue = jQuery.queue( this, type, data ); | |
| // Ensure a hooks for this queue | |
| jQuery._queueHooks( this, type ); | |
| if ( type === "fx" && queue[0] !== "inprogress" ) { | |
| jQuery.dequeue( this, type ); | |
| } | |
| }); | |
| }, | |
| dequeue: function( type ) { | |
| return this.each(function() { | |
| jQuery.dequeue( this, type ); | |
| }); | |
| }, | |
| clearQueue: function( type ) { | |
| return this.queue( type || "fx", [] ); | |
| }, | |
| // Get a promise resolved when queues of a certain type | |
| // are emptied (fx is the type by default) | |
| promise: function( type, obj ) { | |
| var tmp, | |
| count = 1, | |
| defer = jQuery.Deferred(), | |
| elements = this, | |
| i = this.length, | |
| resolve = function() { | |
| if ( !( --count ) ) { | |
| defer.resolveWith( elements, [ elements ] ); | |
| } | |
| }; | |
| if ( typeof type !== "string" ) { | |
| obj = type; | |
| type = undefined; | |
| } | |
| type = type || "fx"; | |
| while ( i-- ) { | |
| tmp = data_priv.get( elements[ i ], type + "queueHooks" ); | |
| if ( tmp && tmp.empty ) { | |
| count++; | |
| tmp.empty.add( resolve ); | |
| } | |
| } | |
| resolve(); | |
| return defer.promise( obj ); | |
| } | |
| }); | |
| var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; | |
| var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; | |
| var isHidden = function( elem, el ) { | |
| // isHidden might be called from jQuery#filter function; | |
| // in that case, element will be second argument | |
| elem = el || elem; | |
| return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); | |
| }; | |
| var rcheckableType = (/^(?:checkbox|radio)$/i); | |
| (function() { | |
| var fragment = document.createDocumentFragment(), | |
| div = fragment.appendChild( document.createElement( "div" ) ), | |
| input = document.createElement( "input" ); | |
| // Support: Safari<=5.1 | |
| // Check state lost if the name is set (#11217) | |
| // Support: Windows Web Apps (WWA) | |
| // `name` and `type` must use .setAttribute for WWA (#14901) | |
| input.setAttribute( "type", "radio" ); | |
| input.setAttribute( "checked", "checked" ); | |
| input.setAttribute( "name", "t" ); | |
| div.appendChild( input ); | |
| // Support: Safari<=5.1, Android<4.2 | |
| // Older WebKit doesn't clone checked state correctly in fragments | |
| support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; | |
| // Support: IE<=11+ | |
| // Make sure textarea (and checkbox) defaultValue is properly cloned | |
| div.innerHTML = "<textarea>x</textarea>"; | |
| support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; | |
| })(); | |
| var strundefined = typeof undefined; | |
| support.focusinBubbles = "onfocusin" in window; | |
| var | |
| rkeyEvent = /^key/, | |
| rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, | |
| rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, | |
| rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; | |
| function returnTrue() { | |
| return true; | |
| } | |
| function returnFalse() { | |
| return false; | |
| } | |
| function safeActiveElement() { | |
| try { | |
| return document.activeElement; | |
| } catch ( err ) { } | |
| } | |
| /* | |
| * Helper functions for managing events -- not part of the public interface. | |
| * Props to Dean Edwards' addEvent library for many of the ideas. | |
| */ | |
| jQuery.event = { | |
| global: {}, | |
| add: function( elem, types, handler, data, selector ) { | |
| var handleObjIn, eventHandle, tmp, | |
| events, t, handleObj, | |
| special, handlers, type, namespaces, origType, | |
| elemData = data_priv.get( elem ); | |
| // Don't attach events to noData or text/comment nodes (but allow plain objects) | |
| if ( !elemData ) { | |
| return; | |
| } | |
| // Caller can pass in an object of custom data in lieu of the handler | |
| if ( handler.handler ) { | |
| handleObjIn = handler; | |
| handler = handleObjIn.handler; | |
| selector = handleObjIn.selector; | |
| } | |
| // Make sure that the handler has a unique ID, used to find/remove it later | |
| if ( !handler.guid ) { | |
| handler.guid = jQuery.guid++; | |
| } | |
| // Init the element's event structure and main handler, if this is the first | |
| if ( !(events = elemData.events) ) { | |
| events = elemData.events = {}; | |
| } | |
| if ( !(eventHandle = elemData.handle) ) { | |
| eventHandle = elemData.handle = function( e ) { | |
| // Discard the second event of a jQuery.event.trigger() and | |
| // when an event is called after a page has unloaded | |
| return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? | |
| jQuery.event.dispatch.apply( elem, arguments ) : undefined; | |
| }; | |
| } | |
| // Handle multiple events separated by a space | |
| types = ( types || "" ).match( rnotwhite ) || [ "" ]; | |
| t = types.length; | |
| while ( t-- ) { | |
| tmp = rtypenamespace.exec( types[t] ) || []; | |
| type = origType = tmp[1]; | |
| namespaces = ( tmp[2] || "" ).split( "." ).sort(); | |
| // There *must* be a type, no attaching namespace-only handlers | |
| if ( !type ) { | |
| continue; | |
| } | |
| // If event changes its type, use the special event handlers for the changed type | |
| special = jQuery.event.special[ type ] || {}; | |
| // If selector defined, determine special event api type, otherwise given type | |
| type = ( selector ? special.delegateType : special.bindType ) || type; | |
| // Update special based on newly reset type | |
| special = jQuery.event.special[ type ] || {}; | |
| // handleObj is passed to all event handlers | |
| handleObj = jQuery.extend({ | |
| type: type, | |
| origType: origType, | |
| data: data, | |
| handler: handler, | |
| guid: handler.guid, | |
| selector: selector, | |
| needsContext: selector && jQuery.expr.match.needsContext.test( selector ), | |
| namespace: namespaces.join(".") | |
| }, handleObjIn ); | |
| // Init the event handler queue if we're the first | |
| if ( !(handlers = events[ type ]) ) { | |
| handlers = events[ type ] = []; | |
| handlers.delegateCount = 0; | |
| // Only use addEventListener if the special events handler returns false | |
| if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { | |
| if ( elem.addEventListener ) { | |
| elem.addEventListener( type, eventHandle, false ); | |
| } | |
| } | |
| } | |
| if ( special.add ) { | |
| special.add.call( elem, handleObj ); | |
| if ( !handleObj.handler.guid ) { | |
| handleObj.handler.guid = handler.guid; | |
| } | |
| } | |
| // Add to the element's handler list, delegates in front | |
| if ( selector ) { | |
| handlers.splice( handlers.delegateCount++, 0, handleObj ); | |
| } else { | |
| handlers.push( handleObj ); | |
| } | |
| // Keep track of which events have ever been used, for event optimization | |
| jQuery.event.global[ type ] = true; | |
| } | |
| }, | |
| // Detach an event or set of events from an element | |
| remove: function( elem, types, handler, selector, mappedTypes ) { | |
| var j, origCount, tmp, | |
| events, t, handleObj, | |
| special, handlers, type, namespaces, origType, | |
| elemData = data_priv.hasData( elem ) && data_priv.get( elem ); | |
| if ( !elemData || !(events = elemData.events) ) { | |
| return; | |
| } | |
| // Once for each type.namespace in types; type may be omitted | |
| types = ( types || "" ).match( rnotwhite ) || [ "" ]; | |
| t = types.length; | |
| while ( t-- ) { | |
| tmp = rtypenamespace.exec( types[t] ) || []; | |
| type = origType = tmp[1]; | |
| namespaces = ( tmp[2] || "" ).split( "." ).sort(); | |
| // Unbind all events (on this namespace, if provided) for the element | |
| if ( !type ) { | |
| for ( type in events ) { | |
| jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); | |
| } | |
| continue; | |
| } | |
| special = jQuery.event.special[ type ] || {}; | |
| type = ( selector ? special.delegateType : special.bindType ) || type; | |
| handlers = events[ type ] || []; | |
| tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); | |
| // Remove matching events | |
| origCount = j = handlers.length; | |
| while ( j-- ) { | |
| handleObj = handlers[ j ]; | |
| if ( ( mappedTypes || origType === handleObj.origType ) && | |
| ( !handler || handler.guid === handleObj.guid ) && | |
| ( !tmp || tmp.test( handleObj.namespace ) ) && | |
| ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { | |
| handlers.splice( j, 1 ); | |
| if ( handleObj.selector ) { | |
| handlers.delegateCount--; | |
| } | |
| if ( special.remove ) { | |
| special.remove.call( elem, handleObj ); | |
| } | |
| } | |
| } | |
| // Remove generic event handler if we removed something and no more handlers exist | |
| // (avoids potential for endless recursion during removal of special event handlers) | |
| if ( origCount && !handlers.length ) { | |
| if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { | |
| jQuery.removeEvent( elem, type, elemData.handle ); | |
| } | |
| delete events[ type ]; | |
| } | |
| } | |
| // Remove the expando if it's no longer used | |
| if ( jQuery.isEmptyObject( events ) ) { | |
| delete elemData.handle; | |
| data_priv.remove( elem, "events" ); | |
| } | |
| }, | |
| trigger: function( event, data, elem, onlyHandlers ) { | |
| var i, cur, tmp, bubbleType, ontype, handle, special, | |
| eventPath = [ elem || document ], | |
| type = hasOwn.call( event, "type" ) ? event.type : event, | |
| namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; | |
| cur = tmp = elem = elem || document; | |
| // Don't do events on text and comment nodes | |
| if ( elem.nodeType === 3 || elem.nodeType === 8 ) { | |
| return; | |
| } | |
| // focus/blur morphs to focusin/out; ensure we're not firing them right now | |
| if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { | |
| return; | |
| } | |
| if ( type.indexOf(".") >= 0 ) { | |
| // Namespaced trigger; create a regexp to match event type in handle() | |
| namespaces = type.split("."); | |
| type = namespaces.shift(); | |
| namespaces.sort(); | |
| } | |
| ontype = type.indexOf(":") < 0 && "on" + type; | |
| // Caller can pass in a jQuery.Event object, Object, or just an event type string | |
| event = event[ jQuery.expando ] ? | |
| event : | |
| new jQuery.Event( type, typeof event === "object" && event ); | |
| // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) | |
| event.isTrigger = onlyHandlers ? 2 : 3; | |
| event.namespace = namespaces.join("."); | |
| event.namespace_re = event.namespace ? | |
| new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : | |
| null; | |
| // Clean up the event in case it is being reused | |
| event.result = undefined; | |
| if ( !event.target ) { | |
| event.target = elem; | |
| } | |
| // Clone any incoming data and prepend the event, creating the handler arg list | |
| data = data == null ? | |
| [ event ] : | |
| jQuery.makeArray( data, [ event ] ); | |
| // Allow special events to draw outside the lines | |
| special = jQuery.event.special[ type ] || {}; | |
| if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { | |
| return; | |
| } | |
| // Determine event propagation path in advance, per W3C events spec (#9951) | |
| // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) | |
| if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { | |
| bubbleType = special.delegateType || type; | |
| if ( !rfocusMorph.test( bubbleType + type ) ) { | |
| cur = cur.parentNode; | |
| } | |
| for ( ; cur; cur = cur.parentNode ) { | |
| eventPath.push( cur ); | |
| tmp = cur; | |
| } | |
| // Only add window if we got to document (e.g., not plain obj or detached DOM) | |
| if ( tmp === (elem.ownerDocument || document) ) { | |
| eventPath.push( tmp.defaultView || tmp.parentWindow || window ); | |
| } | |
| } | |
| // Fire handlers on the event path | |
| i = 0; | |
| while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { | |
| event.type = i > 1 ? | |
| bubbleType : | |
| special.bindType || type; | |
| // jQuery handler | |
| handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); | |
| if ( handle ) { | |
| handle.apply( cur, data ); | |
| } | |
| // Native handler | |
| handle = ontype && cur[ ontype ]; | |
| if ( handle && handle.apply && jQuery.acceptData( cur ) ) { | |
| event.result = handle.apply( cur, data ); | |
| if ( event.result === false ) { | |
| event.preventDefault(); | |
| } | |
| } | |
| } | |
| event.type = type; | |
| // If nobody prevented the default action, do it now | |
| if ( !onlyHandlers && !event.isDefaultPrevented() ) { | |
| if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && | |
| jQuery.acceptData( elem ) ) { | |
| // Call a native DOM method on the target with the same name name as the event. | |
| // Don't do default actions on window, that's where global variables be (#6170) | |
| if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { | |
| // Don't re-trigger an onFOO event when we call its FOO() method | |
| tmp = elem[ ontype ]; | |
| if ( tmp ) { | |
| elem[ ontype ] = null; | |
| } | |
| // Prevent re-triggering of the same event, since we already bubbled it above | |
| jQuery.event.triggered = type; | |
| elem[ type ](); | |
| jQuery.event.triggered = undefined; | |
| if ( tmp ) { | |
| elem[ ontype ] = tmp; | |
| } | |
| } | |
| } | |
| } | |
| return event.result; | |
| }, | |
| dispatch: function( event ) { | |
| // Make a writable jQuery.Event from the native event object | |
| event = jQuery.event.fix( event ); | |
| var i, j, ret, matched, handleObj, | |
| handlerQueue = [], | |
| args = slice.call( arguments ), | |
| handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], | |
| special = jQuery.event.special[ event.type ] || {}; | |
| // Use the fix-ed jQuery.Event rather than the (read-only) native event | |
| args[0] = event; | |
| event.delegateTarget = this; | |
| // Call the preDispatch hook for the mapped type, and let it bail if desired | |
| if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { | |
| return; | |
| } | |
| // Determine handlers | |
| handlerQueue = jQuery.event.handlers.call( this, event, handlers ); | |
| // Run delegates first; they may want to stop propagation beneath us | |
| i = 0; | |
| while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { | |
| event.currentTarget = matched.elem; | |
| j = 0; | |
| while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { | |
| // Triggered event must either 1) have no namespace, or 2) have namespace(s) | |
| // a subset or equal to those in the bound event (both can have no namespace). | |
| if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { | |
| event.handleObj = handleObj; | |
| event.data = handleObj.data; | |
| ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) | |
| .apply( matched.elem, args ); | |
| if ( ret !== undefined ) { | |
| if ( (event.result = ret) === false ) { | |
| event.preventDefault(); | |
| event.stopPropagation(); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| // Call the postDispatch hook for the mapped type | |
| if ( special.postDispatch ) { | |
| special.postDispatch.call( this, event ); | |
| } | |
| return event.result; | |
| }, | |
| handlers: function( event, handlers ) { | |
| var i, matches, sel, handleObj, | |
| handlerQueue = [], | |
| delegateCount = handlers.delegateCount, | |
| cur = event.target; | |
| // Find delegate handlers | |
| // Black-hole SVG <use> instance trees (#13180) | |
| // Avoid non-left-click bubbling in Firefox (#3861) | |
| if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { | |
| for ( ; cur !== this; cur = cur.parentNode || this ) { | |
| // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) | |
| if ( cur.disabled !== true || event.type !== "click" ) { | |
| matches = []; | |
| for ( i = 0; i < delegateCount; i++ ) { | |
| handleObj = handlers[ i ]; | |
| // Don't conflict with Object.prototype properties (#13203) | |
| sel = handleObj.selector + " "; | |
| if ( matches[ sel ] === undefined ) { | |
| matches[ sel ] = handleObj.needsContext ? | |
| jQuery( sel, this ).index( cur ) >= 0 : | |
| jQuery.find( sel, this, null, [ cur ] ).length; | |
| } | |
| if ( matches[ sel ] ) { | |
| matches.push( handleObj ); | |
| } | |
| } | |
| if ( matches.length ) { | |
| handlerQueue.push({ elem: cur, handlers: matches }); | |
| } | |
| } | |
| } | |
| } | |
| // Add the remaining (directly-bound) handlers | |
| if ( delegateCount < handlers.length ) { | |
| handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); | |
| } | |
| return handlerQueue; | |
| }, | |
| // Includes some event props shared by KeyEvent and MouseEvent | |
| props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), | |
| fixHooks: {}, | |
| keyHooks: { | |
| props: "char charCode key keyCode".split(" "), | |
| filter: function( event, original ) { | |
| // Add which for key events | |
| if ( event.which == null ) { | |
| event.which = original.charCode != null ? original.charCode : original.keyCode; | |
| } | |
| return event; | |
| } | |
| }, | |
| mouseHooks: { | |
| props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), | |
| filter: function( event, original ) { | |
| var eventDoc, doc, body, | |
| button = original.button; | |
| // Calculate pageX/Y if missing and clientX/Y available | |
| if ( event.pageX == null && original.clientX != null ) { | |
| eventDoc = event.target.ownerDocument || document; | |
| doc = eventDoc.documentElement; | |
| body = eventDoc.body; | |
| event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); | |
| event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); | |
| } | |
| // Add which for click: 1 === left; 2 === middle; 3 === right | |
| // Note: button is not normalized, so don't use it | |
| if ( !event.which && button !== undefined ) { | |
| event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); | |
| } | |
| return event; | |
| } | |
| }, | |
| fix: function( event ) { | |
| if ( event[ jQuery.expando ] ) { | |
| return event; | |
| } | |
| // Create a writable copy of the event object and normalize some properties | |
| var i, prop, copy, | |
| type = event.type, | |
| originalEvent = event, | |
| fixHook = this.fixHooks[ type ]; | |
| if ( !fixHook ) { | |
| this.fixHooks[ type ] = fixHook = | |
| rmouseEvent.test( type ) ? this.mouseHooks : | |
| rkeyEvent.test( type ) ? this.keyHooks : | |
| {}; | |
| } | |
| copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; | |
| event = new jQuery.Event( originalEvent ); | |
| i = copy.length; | |
| while ( i-- ) { | |
| prop = copy[ i ]; | |
| event[ prop ] = originalEvent[ prop ]; | |
| } | |
| // Support: Cordova 2.5 (WebKit) (#13255) | |
| // All events should have a target; Cordova deviceready doesn't | |
| if ( !event.target ) { | |
| event.target = document; | |
| } | |
| // Support: Safari 6.0+, Chrome<28 | |
| // Target should not be a text node (#504, #13143) | |
| if ( event.target.nodeType === 3 ) { | |
| event.target = event.target.parentNode; | |
| } | |
| return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; | |
| }, | |
| special: { | |
| load: { | |
| // Prevent triggered image.load events from bubbling to window.load | |
| noBubble: true | |
| }, | |
| focus: { | |
| // Fire native event if possible so blur/focus sequence is correct | |
| trigger: function() { | |
| if ( this !== safeActiveElement() && this.focus ) { | |
| this.focus(); | |
| return false; | |
| } | |
| }, | |
| delegateType: "focusin" | |
| }, | |
| blur: { | |
| trigger: function() { | |
| if ( this === safeActiveElement() && this.blur ) { | |
| this.blur(); | |
| return false; | |
| } | |
| }, | |
| delegateType: "focusout" | |
| }, | |
| click: { | |
| // For checkbox, fire native event so checked state will be right | |
| trigger: function() { | |
| if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { | |
| this.click(); | |
| return false; | |
| } | |
| }, | |
| // For cross-browser consistency, don't fire native .click() on links | |
| _default: function( event ) { | |
| return jQuery.nodeName( event.target, "a" ); | |
| } | |
| }, | |
| beforeunload: { | |
| postDispatch: function( event ) { | |
| // Support: Firefox 20+ | |
| // Firefox doesn't alert if the returnValue field is not set. | |
| if ( event.result !== undefined && event.originalEvent ) { | |
| event.originalEvent.returnValue = event.result; | |
| } | |
| } | |
| } | |
| }, | |
| simulate: function( type, elem, event, bubble ) { | |
| // Piggyback on a donor event to simulate a different one. | |
| // Fake originalEvent to avoid donor's stopPropagation, but if the | |
| // simulated event prevents default then we do the same on the donor. | |
| var e = jQuery.extend( | |
| new jQuery.Event(), | |
| event, | |
| { | |
| type: type, | |
| isSimulated: true, | |
| originalEvent: {} | |
| } | |
| ); | |
| if ( bubble ) { | |
| jQuery.event.trigger( e, null, elem ); | |
| } else { | |
| jQuery.event.dispatch.call( elem, e ); | |
| } | |
| if ( e.isDefaultPrevented() ) { | |
| event.preventDefault(); | |
| } | |
| } | |
| }; | |
| jQuery.removeEvent = function( elem, type, handle ) { | |
| if ( elem.removeEventListener ) { | |
| elem.removeEventListener( type, handle, false ); | |
| } | |
| }; | |
| jQuery.Event = function( src, props ) { | |
| // Allow instantiation without the 'new' keyword | |
| if ( !(this instanceof jQuery.Event) ) { | |
| return new jQuery.Event( src, props ); | |
| } | |
| // Event object | |
| if ( src && src.type ) { | |
| this.originalEvent = src; | |
| this.type = src.type; | |
| // Events bubbling up the document may have been marked as prevented | |
| // by a handler lower down the tree; reflect the correct value. | |
| this.isDefaultPrevented = src.defaultPrevented || | |
| src.defaultPrevented === undefined && | |
| // Support: Android<4.0 | |
| src.returnValue === false ? | |
| returnTrue : | |
| returnFalse; | |
| // Event type | |
| } else { | |
| this.type = src; | |
| } | |
| // Put explicitly provided properties onto the event object | |
| if ( props ) { | |
| jQuery.extend( this, props ); | |
| } | |
| // Create a timestamp if incoming event doesn't have one | |
| this.timeStamp = src && src.timeStamp || jQuery.now(); | |
| // Mark it as fixed | |
| this[ jQuery.expando ] = true; | |
| }; | |
| // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding | |
| // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html | |
| jQuery.Event.prototype = { | |
| isDefaultPrevented: returnFalse, | |
| isPropagationStopped: returnFalse, | |
| isImmediatePropagationStopped: returnFalse, | |
| preventDefault: function() { | |
| var e = this.originalEvent; | |
| this.isDefaultPrevented = returnTrue; | |
| if ( e && e.preventDefault ) { | |
| e.preventDefault(); | |
| } | |
| }, | |
| stopPropagation: function() { | |
| var e = this.originalEvent; | |
| this.isPropagationStopped = returnTrue; | |
| if ( e && e.stopPropagation ) { | |
| e.stopPropagation(); | |
| } | |
| }, | |
| stopImmediatePropagation: function() { | |
| var e = this.originalEvent; | |
| this.isImmediatePropagationStopped = returnTrue; | |
| if ( e && e.stopImmediatePropagation ) { | |
| e.stopImmediatePropagation(); | |
| } | |
| this.stopPropagation(); | |
| } | |
| }; | |
| // Create mouseenter/leave events using mouseover/out and event-time checks | |
| // Support: Chrome 15+ | |
| jQuery.each({ | |
| mouseenter: "mouseover", | |
| mouseleave: "mouseout", | |
| pointerenter: "pointerover", | |
| pointerleave: "pointerout" | |
| }, function( orig, fix ) { | |
| jQuery.event.special[ orig ] = { | |
| delegateType: fix, | |
| bindType: fix, | |
| handle: function( event ) { | |
| var ret, | |
| target = this, | |
| related = event.relatedTarget, | |
| handleObj = event.handleObj; | |
| // For mousenter/leave call the handler if related is outside the target. | |
| // NB: No relatedTarget if the mouse left/entered the browser window | |
| if ( !related || (related !== target && !jQuery.contains( target, related )) ) { | |
| event.type = handleObj.origType; | |
| ret = handleObj.handler.apply( this, arguments ); | |
| event.type = fix; | |
| } | |
| return ret; | |
| } | |
| }; | |
| }); | |
| // Support: Firefox, Chrome, Safari | |
| // Create "bubbling" focus and blur events | |
| if ( !support.focusinBubbles ) { | |
| jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { | |
| // Attach a single capturing handler on the document while someone wants focusin/focusout | |
| var handler = function( event ) { | |
| jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); | |
| }; | |
| jQuery.event.special[ fix ] = { | |
| setup: function() { | |
| var doc = this.ownerDocument || this, | |
| attaches = data_priv.access( doc, fix ); | |
| if ( !attaches ) { | |
| doc.addEventListener( orig, handler, true ); | |
| } | |
| data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); | |
| }, | |
| teardown: function() { | |
| var doc = this.ownerDocument || this, | |
| attaches = data_priv.access( doc, fix ) - 1; | |
| if ( !attaches ) { | |
| doc.removeEventListener( orig, handler, true ); | |
| data_priv.remove( doc, fix ); | |
| } else { | |
| data_priv.access( doc, fix, attaches ); | |
| } | |
| } | |
| }; | |
| }); | |
| } | |
| jQuery.fn.extend({ | |
| on: function( types, selector, data, fn, /*INTERNAL*/ one ) { | |
| var origFn, type; | |
| // Types can be a map of types/handlers | |
| if ( typeof types === "object" ) { | |
| // ( types-Object, selector, data ) | |
| if ( typeof selector !== "string" ) { | |
| // ( types-Object, data ) | |
| data = data || selector; | |
| selector = undefined; | |
| } | |
| for ( type in types ) { | |
| this.on( type, selector, data, types[ type ], one ); | |
| } | |
| return this; | |
| } | |
| if ( data == null && fn == null ) { | |
| // ( types, fn ) | |
| fn = selector; | |
| data = selector = undefined; | |
| } else if ( fn == null ) { | |
| if ( typeof selector === "string" ) { | |
| // ( types, selector, fn ) | |
| fn = data; | |
| data = undefined; | |
| } else { | |
| // ( types, data, fn ) | |
| fn = data; | |
| data = selector; | |
| selector = undefined; | |
| } | |
| } | |
| if ( fn === false ) { | |
| fn = returnFalse; | |
| } else if ( !fn ) { | |
| return this; | |
| } | |
| if ( one === 1 ) { | |
| origFn = fn; | |
| fn = function( event ) { | |
| // Can use an empty set, since event contains the info | |
| jQuery().off( event ); | |
| return origFn.apply( this, arguments ); | |
| }; | |
| // Use same guid so caller can remove using origFn | |
| fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); | |
| } | |
| return this.each( function() { | |
| jQuery.event.add( this, types, fn, data, selector ); | |
| }); | |
| }, | |
| one: function( types, selector, data, fn ) { | |
| return this.on( types, selector, data, fn, 1 ); | |
| }, | |
| off: function( types, selector, fn ) { | |
| var handleObj, type; | |
| if ( types && types.preventDefault && types.handleObj ) { | |
| // ( event ) dispatched jQuery.Event | |
| handleObj = types.handleObj; | |
| jQuery( types.delegateTarget ).off( | |
| handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, | |
| handleObj.selector, | |
| handleObj.handler | |
| ); | |
| return this; | |
| } | |
| if ( typeof types === "object" ) { | |
| // ( types-object [, selector] ) | |
| for ( type in types ) { | |
| this.off( type, selector, types[ type ] ); | |
| } | |
| return this; | |
| } | |
| if ( selector === false || typeof selector === "function" ) { | |
| // ( types [, fn] ) | |
| fn = selector; | |
| selector = undefined; | |
| } | |
| if ( fn === false ) { | |
| fn = returnFalse; | |
| } | |
| return this.each(function() { | |
| jQuery.event.remove( this, types, fn, selector ); | |
| }); | |
| }, | |
| trigger: function( type, data ) { | |
| return this.each(function() { | |
| jQuery.event.trigger( type, data, this ); | |
| }); | |
| }, | |
| triggerHandler: function( type, data ) { | |
| var elem = this[0]; | |
| if ( elem ) { | |
| return jQuery.event.trigger( type, data, elem, true ); | |
| } | |
| } | |
| }); | |
| var | |
| rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, | |
| rtagName = /<([\w:]+)/, | |
| rhtml = /<|&#?\w+;/, | |
| rnoInnerhtml = /<(?:script|style|link)/i, | |
| // checked="checked" or checked | |
| rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, | |
| rscriptType = /^$|\/(?:java|ecma)script/i, | |
| rscriptTypeMasked = /^true\/(.*)/, | |
| rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, | |
| // We have to close these tags to support XHTML (#13200) | |
| wrapMap = { | |
| // Support: IE9 | |
| option: [ 1, "<select multiple='multiple'>", "</select>" ], | |
| thead: [ 1, "<table>", "</table>" ], | |
| col: [ 2, "<table><colgroup>", "</colgroup></table>" ], | |
| tr: [ 2, "<table><tbody>", "</tbody></table>" ], | |
| td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], | |
| _default: [ 0, "", "" ] | |
| }; | |
| // Support: IE9 | |
| wrapMap.optgroup = wrapMap.option; | |
| wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; | |
| wrapMap.th = wrapMap.td; | |
| // Support: 1.x compatibility | |
| // Manipulating tables requires a tbody | |
| function manipulationTarget( elem, content ) { | |
| return jQuery.nodeName( elem, "table" ) && | |
| jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? | |
| elem.getElementsByTagName("tbody")[0] || | |
| elem.appendChild( elem.ownerDocument.createElement("tbody") ) : | |
| elem; | |
| } | |
| // Replace/restore the type attribute of script elements for safe DOM manipulation | |
| function disableScript( elem ) { | |
| elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; | |
| return elem; | |
| } | |
| function restoreScript( elem ) { | |
| var match = rscriptTypeMasked.exec( elem.type ); | |
| if ( match ) { | |
| elem.type = match[ 1 ]; | |
| } else { | |
| elem.removeAttribute("type"); | |
| } | |
| return elem; | |
| } | |
| // Mark scripts as having already been evaluated | |
| function setGlobalEval( elems, refElements ) { | |
| var i = 0, | |
| l = elems.length; | |
| for ( ; i < l; i++ ) { | |
| data_priv.set( | |
| elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) | |
| ); | |
| } | |
| } | |
| function cloneCopyEvent( src, dest ) { | |
| var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; | |
| if ( dest.nodeType !== 1 ) { | |
| return; | |
| } | |
| // 1. Copy private data: events, handlers, etc. | |
| if ( data_priv.hasData( src ) ) { | |
| pdataOld = data_priv.access( src ); | |
| pdataCur = data_priv.set( dest, pdataOld ); | |
| events = pdataOld.events; | |
| if ( events ) { | |
| delete pdataCur.handle; | |
| pdataCur.events = {}; | |
| for ( type in events ) { | |
| for ( i = 0, l = events[ type ].length; i < l; i++ ) { | |
| jQuery.event.add( dest, type, events[ type ][ i ] ); | |
| } | |
| } | |
| } | |
| } | |
| // 2. Copy user data | |
| if ( data_user.hasData( src ) ) { | |
| udataOld = data_user.access( src ); | |
| udataCur = jQuery.extend( {}, udataOld ); | |
| data_user.set( dest, udataCur ); | |
| } | |
| } | |
| function getAll( context, tag ) { | |
| var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : | |
| context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : | |
| []; | |
| return tag === undefined || tag && jQuery.nodeName( context, tag ) ? | |
| jQuery.merge( [ context ], ret ) : | |
| ret; | |
| } | |
| // Fix IE bugs, see support tests | |
| function fixInput( src, dest ) { | |
| var nodeName = dest.nodeName.toLowerCase(); | |
| // Fails to persist the checked state of a cloned checkbox or radio button. | |
| if ( nodeName === "input" && rcheckableType.test( src.type ) ) { | |
| dest.checked = src.checked; | |
| // Fails to return the selected option to the default selected state when cloning options | |
| } else if ( nodeName === "input" || nodeName === "textarea" ) { | |
| dest.defaultValue = src.defaultValue; | |
| } | |
| } | |
| jQuery.extend({ | |
| clone: function( elem, dataAndEvents, deepDataAndEvents ) { | |
| var i, l, srcElements, destElements, | |
| clone = elem.cloneNode( true ), | |
| inPage = jQuery.contains( elem.ownerDocument, elem ); | |
| // Fix IE cloning issues | |
| if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && | |
| !jQuery.isXMLDoc( elem ) ) { | |
| // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 | |
| destElements = getAll( clone ); | |
| srcElements = getAll( elem ); | |
| for ( i = 0, l = srcElements.length; i < l; i++ ) { | |
| fixInput( srcElements[ i ], destElements[ i ] ); | |
| } | |
| } | |
| // Copy the events from the original to the clone | |
| if ( dataAndEvents ) { | |
| if ( deepDataAndEvents ) { | |
| srcElements = srcElements || getAll( elem ); | |
| destElements = destElements || getAll( clone ); | |
| for ( i = 0, l = srcElements.length; i < l; i++ ) { | |
| cloneCopyEvent( srcElements[ i ], destElements[ i ] ); | |
| } | |
| } else { | |
| cloneCopyEvent( elem, clone ); | |
| } | |
| } | |
| // Preserve script evaluation history | |
| destElements = getAll( clone, "script" ); | |
| if ( destElements.length > 0 ) { | |
| setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); | |
| } | |
| // Return the cloned set | |
| return clone; | |
| }, | |
| buildFragment: function( elems, context, scripts, selection ) { | |
| var elem, tmp, tag, wrap, contains, j, | |
| fragment = context.createDocumentFragment(), | |
| nodes = [], | |
| i = 0, | |
| l = elems.length; | |
| for ( ; i < l; i++ ) { | |
| elem = elems[ i ]; | |
| if ( elem || elem === 0 ) { | |
| // Add nodes directly | |
| if ( jQuery.type( elem ) === "object" ) { | |
| // Support: QtWebKit, PhantomJS | |
| // push.apply(_, arraylike) throws on ancient WebKit | |
| jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); | |
| // Convert non-html into a text node | |
| } else if ( !rhtml.test( elem ) ) { | |
| nodes.push( context.createTextNode( elem ) ); | |
| // Convert html into DOM nodes | |
| } else { | |
| tmp = tmp || fragment.appendChild( context.createElement("div") ); | |
| // Deserialize a standard representation | |
| tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); | |
| wrap = wrapMap[ tag ] || wrapMap._default; | |
| tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ]; | |
| // Descend through wrappers to the right content | |
| j = wrap[ 0 ]; | |
| while ( j-- ) { | |
| tmp = tmp.lastChild; | |
| } | |
| // Support: QtWebKit, PhantomJS | |
| // push.apply(_, arraylike) throws on ancient WebKit | |
| jQuery.merge( nodes, tmp.childNodes ); | |
| // Remember the top-level container | |
| tmp = fragment.firstChild; | |
| // Ensure the created nodes are orphaned (#12392) | |
| tmp.textContent = ""; | |
| } | |
| } | |
| } | |
| // Remove wrapper from fragment | |
| fragment.textContent = ""; | |
| i = 0; | |
| while ( (elem = nodes[ i++ ]) ) { | |
| // #4087 - If origin and destination elements are the same, and this is | |
| // that element, do not do anything | |
| if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { | |
| continue; | |
| } | |
| contains = jQuery.contains( elem.ownerDocument, elem ); | |
| // Append to fragment | |
| tmp = getAll( fragment.appendChild( elem ), "script" ); | |
| // Preserve script evaluation history | |
| if ( contains ) { | |
| setGlobalEval( tmp ); | |
| } | |
| // Capture executables | |
| if ( scripts ) { | |
| j = 0; | |
| while ( (elem = tmp[ j++ ]) ) { | |
| if ( rscriptType.test( elem.type || "" ) ) { | |
| scripts.push( elem ); | |
| } | |
| } | |
| } | |
| } | |
| return fragment; | |
| }, | |
| cleanData: function( elems ) { | |
| var data, elem, type, key, | |
| special = jQuery.event.special, | |
| i = 0; | |
| for ( ; (elem = elems[ i ]) !== undefined; i++ ) { | |
| if ( jQuery.acceptData( elem ) ) { | |
| key = elem[ data_priv.expando ]; | |
| if ( key && (data = data_priv.cache[ key ]) ) { | |
| if ( data.events ) { | |
| for ( type in data.events ) { | |
| if ( special[ type ] ) { | |
| jQuery.event.remove( elem, type ); | |
| // This is a shortcut to avoid jQuery.event.remove's overhead | |
| } else { | |
| jQuery.removeEvent( elem, type, data.handle ); | |
| } | |
| } | |
| } | |
| if ( data_priv.cache[ key ] ) { | |
| // Discard any remaining `private` data | |
| delete data_priv.cache[ key ]; | |
| } | |
| } | |
| } | |
| // Discard any remaining `user` data | |
| delete data_user.cache[ elem[ data_user.expando ] ]; | |
| } | |
| } | |
| }); | |
| jQuery.fn.extend({ | |
| text: function( value ) { | |
| return access( this, function( value ) { | |
| return value === undefined ? | |
| jQuery.text( this ) : | |
| this.empty().each(function() { | |
| if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { | |
| this.textContent = value; | |
| } | |
| }); | |
| }, null, value, arguments.length ); | |
| }, | |
| append: function() { | |
| return this.domManip( arguments, function( elem ) { | |
| if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { | |
| var target = manipulationTarget( this, elem ); | |
| target.appendChild( elem ); | |
| } | |
| }); | |
| }, | |
| prepend: function() { | |
| return this.domManip( arguments, function( elem ) { | |
| if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { | |
| var target = manipulationTarget( this, elem ); | |
| target.insertBefore( elem, target.firstChild ); | |
| } | |
| }); | |
| }, | |
| before: function() { | |
| return this.domManip( arguments, function( elem ) { | |
| if ( this.parentNode ) { | |
| this.parentNode.insertBefore( elem, this ); | |
| } | |
| }); | |
| }, | |
| after: function() { | |
| return this.domManip( arguments, function( elem ) { | |
| if ( this.parentNode ) { | |
| this.parentNode.insertBefore( elem, this.nextSibling ); | |
| } | |
| }); | |
| }, | |
| remove: function( selector, keepData /* Internal Use Only */ ) { | |
| var elem, | |
| elems = selector ? jQuery.filter( selector, this ) : this, | |
| i = 0; | |
| for ( ; (elem = elems[i]) != null; i++ ) { | |
| if ( !keepData && elem.nodeType === 1 ) { | |
| jQuery.cleanData( getAll( elem ) ); | |
| } | |
| if ( elem.parentNode ) { | |
| if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { | |
| setGlobalEval( getAll( elem, "script" ) ); | |
| } | |
| elem.parentNode.removeChild( elem ); | |
| } | |
| } | |
| return this; | |
| }, | |
| empty: function() { | |
| var elem, | |
| i = 0; | |
| for ( ; (elem = this[i]) != null; i++ ) { | |
| if ( elem.nodeType === 1 ) { | |
| // Prevent memory leaks | |
| jQuery.cleanData( getAll( elem, false ) ); | |
| // Remove any remaining nodes | |
| elem.textContent = ""; | |
| } | |
| } | |
| return this; | |
| }, | |
| clone: function( dataAndEvents, deepDataAndEvents ) { | |
| dataAndEvents = dataAndEvents == null ? false : dataAndEvents; | |
| deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; | |
| return this.map(function() { | |
| return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); | |
| }); | |
| }, | |
| html: function( value ) { | |
| return access( this, function( value ) { | |
| var elem = this[ 0 ] || {}, | |
| i = 0, | |
| l = this.length; | |
| if ( value === undefined && elem.nodeType === 1 ) { | |
| return elem.innerHTML; | |
| } | |
| // See if we can take a shortcut and just use innerHTML | |
| if ( typeof value === "string" && !rnoInnerhtml.test( value ) && | |
| !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { | |
| value = value.replace( rxhtmlTag, "<$1></$2>" ); | |
| try { | |
| for ( ; i < l; i++ ) { | |
| elem = this[ i ] || {}; | |
| // Remove element nodes and prevent memory leaks | |
| if ( elem.nodeType === 1 ) { | |
| jQuery.cleanData( getAll( elem, false ) ); | |
| elem.innerHTML = value; | |
| } | |
| } | |
| elem = 0; | |
| // If using innerHTML throws an exception, use the fallback method | |
| } catch( e ) {} | |
| } | |
| if ( elem ) { | |
| this.empty().append( value ); | |
| } | |
| }, null, value, arguments.length ); | |
| }, | |
| replaceWith: function() { | |
| var arg = arguments[ 0 ]; | |
| // Make the changes, replacing each context element with the new content | |
| this.domManip( arguments, function( elem ) { | |
| arg = this.parentNode; | |
| jQuery.cleanData( getAll( this ) ); | |
| if ( arg ) { | |
| arg.replaceChild( elem, this ); | |
| } | |
| }); | |
| // Force removal if there was no new content (e.g., from empty arguments) | |
| return arg && (arg.length || arg.nodeType) ? this : this.remove(); | |
| }, | |
| detach: function( selector ) { | |
| return this.remove( selector, true ); | |
| }, | |
| domManip: function( args, callback ) { | |
| // Flatten any nested arrays | |
| args = concat.apply( [], args ); | |
| var fragment, first, scripts, hasScripts, node, doc, | |
| i = 0, | |
| l = this.length, | |
| set = this, | |
| iNoClone = l - 1, | |
| value = args[ 0 ], | |
| isFunction = jQuery.isFunction( value ); | |
| // We can't cloneNode fragments that contain checked, in WebKit | |
| if ( isFunction || | |
| ( l > 1 && typeof value === "string" && | |
| !support.checkClone && rchecked.test( value ) ) ) { | |
| return this.each(function( index ) { | |
| var self = set.eq( index ); | |
| if ( isFunction ) { | |
| args[ 0 ] = value.call( this, index, self.html() ); | |
| } | |
| self.domManip( args, callback ); | |
| }); | |
| } | |
| if ( l ) { | |
| fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); | |
| first = fragment.firstChild; | |
| if ( fragment.childNodes.length === 1 ) { | |
| fragment = first; | |
| } | |
| if ( first ) { | |
| scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); | |
| hasScripts = scripts.length; | |
| // Use the original fragment for the last item instead of the first because it can end up | |
| // being emptied incorrectly in certain situations (#8070). | |
| for ( ; i < l; i++ ) { | |
| node = fragment; | |
| if ( i !== iNoClone ) { | |
| node = jQuery.clone( node, true, true ); | |
| // Keep references to cloned scripts for later restoration | |
| if ( hasScripts ) { | |
| // Support: QtWebKit | |
| // jQuery.merge because push.apply(_, arraylike) throws | |
| jQuery.merge( scripts, getAll( node, "script" ) ); | |
| } | |
| } | |
| callback.call( this[ i ], node, i ); | |
| } | |
| if ( hasScripts ) { | |
| doc = scripts[ scripts.length - 1 ].ownerDocument; | |
| // Reenable scripts | |
| jQuery.map( scripts, restoreScript ); | |
| // Evaluate executable scripts on first document insertion | |
| for ( i = 0; i < hasScripts; i++ ) { | |
| node = scripts[ i ]; | |
| if ( rscriptType.test( node.type || "" ) && | |
| !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { | |
| if ( node.src ) { | |
| // Optional AJAX dependency, but won't run scripts if not present | |
| if ( jQuery._evalUrl ) { | |
| jQuery._evalUrl( node.src ); | |
| } | |
| } else { | |
| jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| return this; | |
| } | |
| }); | |
| jQuery.each({ | |
| appendTo: "append", | |
| prependTo: "prepend", | |
| insertBefore: "before", | |
| insertAfter: "after", | |
| replaceAll: "replaceWith" | |
| }, function( name, original ) { | |
| jQuery.fn[ name ] = function( selector ) { | |
| var elems, | |
| ret = [], | |
| insert = jQuery( selector ), | |
| last = insert.length - 1, | |
| i = 0; | |
| for ( ; i <= last; i++ ) { | |
| elems = i === last ? this : this.clone( true ); | |
| jQuery( insert[ i ] )[ original ]( elems ); | |
| // Support: QtWebKit | |
| // .get() because push.apply(_, arraylike) throws | |
| push.apply( ret, elems.get() ); | |
| } | |
| return this.pushStack( ret ); | |
| }; | |
| }); | |
| var iframe, | |
| elemdisplay = {}; | |
| /** | |
| * Retrieve the actual display of a element | |
| * @param {String} name nodeName of the element | |
| * @param {Object} doc Document object | |
| */ | |
| // Called only from within defaultDisplay | |
| function actualDisplay( name, doc ) { | |
| var style, | |
| elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), | |
| // getDefaultComputedStyle might be reliably used only on attached element | |
| display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? | |
| // Use of this method is a temporary fix (more like optimization) until something better comes along, | |
| // since it was removed from specification and supported only in FF | |
| style.display : jQuery.css( elem[ 0 ], "display" ); | |
| // We don't have any data stored on the element, | |
| // so use "detach" method as fast way to get rid of the element | |
| elem.detach(); | |
| return display; | |
| } | |
| /** | |
| * Try to determine the default display value of an element | |
| * @param {String} nodeName | |
| */ | |
| function defaultDisplay( nodeName ) { | |
| var doc = document, | |
| display = elemdisplay[ nodeName ]; | |
| if ( !display ) { | |
| display = actualDisplay( nodeName, doc ); | |
| // If the simple way fails, read from inside an iframe | |
| if ( display === "none" || !display ) { | |
| // Use the already-created iframe if possible | |
| iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement ); | |
| // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse | |
| doc = iframe[ 0 ].contentDocument; | |
| // Support: IE | |
| doc.write(); | |
| doc.close(); | |
| display = actualDisplay( nodeName, doc ); | |
| iframe.detach(); | |
| } | |
| // Store the correct default display | |
| elemdisplay[ nodeName ] = display; | |
| } | |
| return display; | |
| } | |
| var rmargin = (/^margin/); | |
| var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); | |
| var getStyles = function( elem ) { | |
| // Support: IE<=11+, Firefox<=30+ (#15098, #14150) | |
| // IE throws on elements created in popups | |
| // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" | |
| if ( elem.ownerDocument.defaultView.opener ) { | |
| return elem.ownerDocument.defaultView.getComputedStyle( elem, null ); | |
| } | |
| return window.getComputedStyle( elem, null ); | |
| }; | |
| function curCSS( elem, name, computed ) { | |
| var width, minWidth, maxWidth, ret, | |
| style = elem.style; | |
| computed = computed || getStyles( elem ); | |
| // Support: IE9 | |
| // getPropertyValue is only needed for .css('filter') (#12537) | |
| if ( computed ) { | |
| ret = computed.getPropertyValue( name ) || computed[ name ]; | |
| } | |
| if ( computed ) { | |
| if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { | |
| ret = jQuery.style( elem, name ); | |
| } | |
| // Support: iOS < 6 | |
| // A tribute to the "awesome hack by Dean Edwards" | |
| // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels | |
| // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values | |
| if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { | |
| // Remember the original values | |
| width = style.width; | |
| minWidth = style.minWidth; | |
| maxWidth = style.maxWidth; | |
| // Put in the new values to get a computed value out | |
| style.minWidth = style.maxWidth = style.width = ret; | |
| ret = computed.width; | |
| // Revert the changed values | |
| style.width = width; | |
| style.minWidth = minWidth; | |
| style.maxWidth = maxWidth; | |
| } | |
| } | |
| return ret !== undefined ? | |
| // Support: IE | |
| // IE returns zIndex value as an integer. | |
| ret + "" : | |
| ret; | |
| } | |
| function addGetHookIf( conditionFn, hookFn ) { | |
| // Define the hook, we'll check on the first run if it's really needed. | |
| return { | |
| get: function() { | |
| if ( conditionFn() ) { | |
| // Hook not needed (or it's not possible to use it due | |
| // to missing dependency), remove it. | |
| delete this.get; | |
| return; | |
| } | |
| // Hook needed; redefine it so that the support test is not executed again. | |
| return (this.get = hookFn).apply( this, arguments ); | |
| } | |
| }; | |
| } | |
| (function() { | |
| var pixelPositionVal, boxSizingReliableVal, | |
| docElem = document.documentElement, | |
| container = document.createElement( "div" ), | |
| div = document.createElement( "div" ); | |
| if ( !div.style ) { | |
| return; | |
| } | |
| // Support: IE9-11+ | |
| // Style of cloned element affects source element cloned (#8908) | |
| div.style.backgroundClip = "content-box"; | |
| div.cloneNode( true ).style.backgroundClip = ""; | |
| support.clearCloneStyle = div.style.backgroundClip === "content-box"; | |
| container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" + | |
| "position:absolute"; | |
| container.appendChild( div ); | |
| // Executing both pixelPosition & boxSizingReliable tests require only one layout | |
| // so they're executed at the same time to save the second computation. | |
| function computePixelPositionAndBoxSizingReliable() { | |
| div.style.cssText = | |
| // Support: Firefox<29, Android 2.3 | |
| // Vendor-prefix box-sizing | |
| "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" + | |
| "box-sizing:border-box;display:block;margin-top:1%;top:1%;" + | |
| "border:1px;padding:1px;width:4px;position:absolute"; | |
| div.innerHTML = ""; | |
| docElem.appendChild( container ); | |
| var divStyle = window.getComputedStyle( div, null ); | |
| pixelPositionVal = divStyle.top !== "1%"; | |
| boxSizingReliableVal = divStyle.width === "4px"; | |
| docElem.removeChild( container ); | |
| } | |
| // Support: node.js jsdom | |
| // Don't assume that getComputedStyle is a property of the global object | |
| if ( window.getComputedStyle ) { | |
| jQuery.extend( support, { | |
| pixelPosition: function() { | |
| // This test is executed only once but we still do memoizing | |
| // since we can use the boxSizingReliable pre-computing. | |
| // No need to check if the test was already performed, though. | |
| computePixelPositionAndBoxSizingReliable(); | |
| return pixelPositionVal; | |
| }, | |
| boxSizingReliable: function() { | |
| if ( boxSizingReliableVal == null ) { | |
| computePixelPositionAndBoxSizingReliable(); | |
| } | |
| return boxSizingReliableVal; | |
| }, | |
| reliableMarginRight: function() { | |
| // Support: Android 2.3 | |
| // Check if div with explicit width and no margin-right incorrectly | |
| // gets computed margin-right based on width of container. (#3333) | |
| // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right | |
| // This support function is only executed once so no memoizing is needed. | |
| var ret, | |
| marginDiv = div.appendChild( document.createElement( "div" ) ); | |
| // Reset CSS: box-sizing; display; margin; border; padding | |
| marginDiv.style.cssText = div.style.cssText = | |
| // Support: Firefox<29, Android 2.3 | |
| // Vendor-prefix box-sizing | |
| "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + | |
| "box-sizing:content-box;display:block;margin:0;border:0;padding:0"; | |
| marginDiv.style.marginRight = marginDiv.style.width = "0"; | |
| div.style.width = "1px"; | |
| docElem.appendChild( container ); | |
| ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight ); | |
| docElem.removeChild( container ); | |
| div.removeChild( marginDiv ); | |
| return ret; | |
| } | |
| }); | |
| } | |
| })(); | |
| // A method for quickly swapping in/out CSS properties to get correct calculations. | |
| jQuery.swap = function( elem, options, callback, args ) { | |
| var ret, name, | |
| old = {}; | |
| // Remember the old values, and insert the new ones | |
| for ( name in options ) { | |
| old[ name ] = elem.style[ name ]; | |
| elem.style[ name ] = options[ name ]; | |
| } | |
| ret = callback.apply( elem, args || [] ); | |
| // Revert the old values | |
| for ( name in options ) { | |
| elem.style[ name ] = old[ name ]; | |
| } | |
| return ret; | |
| }; | |
| var | |
| // Swappable if display is none or starts with table except "table", "table-cell", or "table-caption" | |
| // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display | |
| rdisplayswap = /^(none|table(?!-c[ea]).+)/, | |
| rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ), | |
| rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ), | |
| cssShow = { position: "absolute", visibility: "hidden", display: "block" }, | |
| cssNormalTransform = { | |
| letterSpacing: "0", | |
| fontWeight: "400" | |
| }, | |
| cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; | |
| // Return a css property mapped to a potentially vendor prefixed property | |
| function vendorPropName( style, name ) { | |
| // Shortcut for names that are not vendor prefixed | |
| if ( name in style ) { | |
| return name; | |
| } | |
| // Check for vendor prefixed names | |
| var capName = name[0].toUpperCase() + name.slice(1), | |
| origName = name, | |
| i = cssPrefixes.length; | |
| while ( i-- ) { | |
| name = cssPrefixes[ i ] + capName; | |
| if ( name in style ) { | |
| return name; | |
| } | |
| } | |
| return origName; | |
| } | |
| function setPositiveNumber( elem, value, subtract ) { | |
| var matches = rnumsplit.exec( value ); | |
| return matches ? | |
| // Guard against undefined "subtract", e.g., when used as in cssHooks | |
| Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : | |
| value; | |
| } | |
| function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { | |
| var i = extra === ( isBorderBox ? "border" : "content" ) ? | |
| // If we already have the right measurement, avoid augmentation | |
| 4 : | |
| // Otherwise initialize for horizontal or vertical properties | |
| name === "width" ? 1 : 0, | |
| val = 0; | |
| for ( ; i < 4; i += 2 ) { | |
| // Both box models exclude margin, so add it if we want it | |
| if ( extra === "margin" ) { | |
| val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); | |
| } | |
| if ( isBorderBox ) { | |
| // border-box includes padding, so remove it if we want content | |
| if ( extra === "content" ) { | |
| val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); | |
| } | |
| // At this point, extra isn't border nor margin, so remove border | |
| if ( extra !== "margin" ) { | |
| val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); | |
| } | |
| } else { | |
| // At this point, extra isn't content, so add padding | |
| val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); | |
| // At this point, extra isn't content nor padding, so add border | |
| if ( extra !== "padding" ) { | |
| val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); | |
| } | |
| } | |
| } | |
| return val; | |
| } | |
| function getWidthOrHeight( elem, name, extra ) { | |
| // Start with offset property, which is equivalent to the border-box value | |
| var valueIsBorderBox = true, | |
| val = name === "width" ? elem.offsetWidth : elem.offsetHeight, | |
| styles = getStyles( elem ), | |
| isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; | |
| // Some non-html elements return undefined for offsetWidth, so check for null/undefined | |
| // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 | |
| // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 | |
| if ( val <= 0 || val == null ) { | |
| // Fall back to computed then uncomputed css if necessary | |
| val = curCSS( elem, name, styles ); | |
| if ( val < 0 || val == null ) { | |
| val = elem.style[ name ]; | |
| } | |
| // Computed unit is not pixels. Stop here and return. | |
| if ( rnumnonpx.test(val) ) { | |
| return val; | |
| } | |
| // Check for style in case a browser which returns unreliable values | |
| // for getComputedStyle silently falls back to the reliable elem.style | |
| valueIsBorderBox = isBorderBox && | |
| ( support.boxSizingReliable() || val === elem.style[ name ] ); | |
| // Normalize "", auto, and prepare for extra | |
| val = parseFloat( val ) || 0; | |
| } | |
| // Use the active box-sizing model to add/subtract irrelevant styles | |
| return ( val + | |
| augmentWidthOrHeight( | |
| elem, | |
| name, | |
| extra || ( isBorderBox ? "border" : "content" ), | |
| valueIsBorderBox, | |
| styles | |
| ) | |
| ) + "px"; | |
| } | |
| function showHide( elements, show ) { | |
| var display, elem, hidden, | |
| values = [], | |
| index = 0, | |
| length = elements.length; | |
| for ( ; index < length; index++ ) { | |
| elem = elements[ index ]; | |
| if ( !elem.style ) { | |
| continue; | |
| } | |
| values[ index ] = data_priv.get( elem, "olddisplay" ); | |
| display = elem.style.display; | |
| if ( show ) { | |
| // Reset the inline display of this element to learn if it is | |
| // being hidden by cascaded rules or not | |
| if ( !values[ index ] && display === "none" ) { | |
| elem.style.display = ""; | |
| } | |
| // Set elements which have been overridden with display: none | |
| // in a stylesheet to whatever the default browser style is | |
| // for such an element | |
| if ( elem.style.display === "" && isHidden( elem ) ) { | |
| values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) ); | |
| } | |
| } else { | |
| hidden = isHidden( elem ); | |
| if ( display !== "none" || !hidden ) { | |
| data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); | |
| } | |
| } | |
| } | |
| // Set the display of most of the elements in a second loop | |
| // to avoid the constant reflow | |
| for ( index = 0; index < length; index++ ) { | |
| elem = elements[ index ]; | |
| if ( !elem.style ) { | |
| continue; | |
| } | |
| if ( !show || elem.style.display === "none" || elem.style.display === "" ) { | |
| elem.style.display = show ? values[ index ] || "" : "none"; | |
| } | |
| } | |
| return elements; | |
| } | |
| jQuery.extend({ | |
| // Add in style property hooks for overriding the default | |
| // behavior of getting and setting a style property | |
| cssHooks: { | |
| opacity: { | |
| get: function( elem, computed ) { | |
| if ( computed ) { | |
| // We should always get a number back from opacity | |
| var ret = curCSS( elem, "opacity" ); | |
| return ret === "" ? "1" : ret; | |
| } | |
| } | |
| } | |
| }, | |
| // Don't automatically add "px" to these possibly-unitless properties | |
| cssNumber: { | |
| "columnCount": true, | |
| "fillOpacity": true, | |
| "flexGrow": true, | |
| "flexShrink": true, | |
| "fontWeight": true, | |
| "lineHeight": true, | |
| "opacity": true, | |
| "order": true, | |
| "orphans": true, | |
| "widows": true, | |
| "zIndex": true, | |
| "zoom": true | |
| }, | |
| // Add in properties whose names you wish to fix before | |
| // setting or getting the value | |
| cssProps: { | |
| "float": "cssFloat" | |
| }, | |
| // Get and set the style property on a DOM Node | |
| style: function( elem, name, value, extra ) { | |
| // Don't set styles on text and comment nodes | |
| if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { | |
| return; | |
| } | |
| // Make sure that we're working with the right name | |
| var ret, type, hooks, | |
| origName = jQuery.camelCase( name ), | |
| style = elem.style; | |
| name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); | |
| // Gets hook for the prefixed version, then unprefixed version | |
| hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; | |
| // Check if we're setting a value | |
| if ( value !== undefined ) { | |
| type = typeof value; | |
| // Convert "+=" or "-=" to relative numbers (#7345) | |
| if ( type === "string" && (ret = rrelNum.exec( value )) ) { | |
| value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); | |
| // Fixes bug #9237 | |
| type = "number"; | |
| } | |
| // Make sure that null and NaN values aren't set (#7116) | |
| if ( value == null || value !== value ) { | |
| return; | |
| } | |
| // If a number, add 'px' to the (except for certain CSS properties) | |
| if ( type === "number" && !jQuery.cssNumber[ origName ] ) { | |
| value += "px"; | |
| } | |
| // Support: IE9-11+ | |
| // background-* props affect original clone's values | |
| if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { | |
| style[ name ] = "inherit"; | |
| } | |
| // If a hook was provided, use that value, otherwise just set the specified value | |
| if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { | |
| style[ name ] = value; | |
| } | |
| } else { | |
| // If a hook was provided get the non-computed value from there | |
| if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { | |
| return ret; | |
| } | |
| // Otherwise just get the value from the style object | |
| return style[ name ]; | |
| } | |
| }, | |
| css: function( elem, name, extra, styles ) { | |
| var val, num, hooks, | |
| origName = jQuery.camelCase( name ); | |
| // Make sure that we're working with the right name | |
| name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); | |
| // Try prefixed name followed by the unprefixed name | |
| hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; | |
| // If a hook was provided get the computed value from there | |
| if ( hooks && "get" in hooks ) { | |
| val = hooks.get( elem, true, extra ); | |
| } | |
| // Otherwise, if a way to get the computed value exists, use that | |
| if ( val === undefined ) { | |
| val = curCSS( elem, name, styles ); | |
| } | |
| // Convert "normal" to computed value | |
| if ( val === "normal" && name in cssNormalTransform ) { | |
| val = cssNormalTransform[ name ]; | |
| } | |
| // Make numeric if forced or a qualifier was provided and val looks numeric | |
| if ( extra === "" || extra ) { | |
| num = parseFloat( val ); | |
| return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; | |
| } | |
| return val; | |
| } | |
| }); | |
| jQuery.each([ "height", "width" ], function( i, name ) { | |
| jQuery.cssHooks[ name ] = { | |
| get: function( elem, computed, extra ) { | |
| if ( computed ) { | |
| // Certain elements can have dimension info if we invisibly show them | |
| // but it must have a current display style that would benefit | |
| return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ? | |
| jQuery.swap( elem, cssShow, function() { | |
| return getWidthOrHeight( elem, name, extra ); | |
| }) : | |
| getWidthOrHeight( elem, name, extra ); | |
| } | |
| }, | |
| set: function( elem, value, extra ) { | |
| var styles = extra && getStyles( elem ); | |
| return setPositiveNumber( elem, value, extra ? | |
| augmentWidthOrHeight( | |
| elem, | |
| name, | |
| extra, | |
| jQuery.css( elem, "boxSizing", false, styles ) === "border-box", | |
| styles | |
| ) : 0 | |
| ); | |
| } | |
| }; | |
| }); | |
| // Support: Android 2.3 | |
| jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight, | |
| function( elem, computed ) { | |
| if ( computed ) { | |
| return jQuery.swap( elem, { "display": "inline-block" }, | |
| curCSS, [ elem, "marginRight" ] ); | |
| } | |
| } | |
| ); | |
| // These hooks are used by animate to expand properties | |
| jQuery.each({ | |
| margin: "", | |
| padding: "", | |
| border: "Width" | |
| }, function( prefix, suffix ) { | |
| jQuery.cssHooks[ prefix + suffix ] = { | |
| expand: function( value ) { | |
| var i = 0, | |
| expanded = {}, | |
| // Assumes a single number if not a string | |
| parts = typeof value === "string" ? value.split(" ") : [ value ]; | |
| for ( ; i < 4; i++ ) { | |
| expanded[ prefix + cssExpand[ i ] + suffix ] = | |
| parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; | |
| } | |
| return expanded; | |
| } | |
| }; | |
| if ( !rmargin.test( prefix ) ) { | |
| jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; | |
| } | |
| }); | |
| jQuery.fn.extend({ | |
| css: function( name, value ) { | |
| return access( this, function( elem, name, value ) { | |
| var styles, len, | |
| map = {}, | |
| i = 0; | |
| if ( jQuery.isArray( name ) ) { | |
| styles = getStyles( elem ); | |
| len = name.length; | |
| for ( ; i < len; i++ ) { | |
| map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); | |
| } | |
| return map; | |
| } | |
| return value !== undefined ? | |
| jQuery.style( elem, name, value ) : | |
| jQuery.css( elem, name ); | |
| }, name, value, arguments.length > 1 ); | |
| }, | |
| show: function() { | |
| return showHide( this, true ); | |
| }, | |
| hide: function() { | |
| return showHide( this ); | |
| }, | |
| toggle: function( state ) { | |
| if ( typeof state === "boolean" ) { | |
| return state ? this.show() : this.hide(); | |
| } | |
| return this.each(function() { | |
| if ( isHidden( this ) ) { | |
| jQuery( this ).show(); | |
| } else { | |
| jQuery( this ).hide(); | |
| } | |
| }); | |
| } | |
| }); | |
| function Tween( elem, options, prop, end, easing ) { | |
| return new Tween.prototype.init( elem, options, prop, end, easing ); | |
| } | |
| jQuery.Tween = Tween; | |
| Tween.prototype = { | |
| constructor: Tween, | |
| init: function( elem, options, prop, end, easing, unit ) { | |
| this.elem = elem; | |
| this.prop = prop; | |
| this.easing = easing || "swing"; | |
| this.options = options; | |
| this.start = this.now = this.cur(); | |
| this.end = end; | |
| this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); | |
| }, | |
| cur: function() { | |
| var hooks = Tween.propHooks[ this.prop ]; | |
| return hooks && hooks.get ? | |
| hooks.get( this ) : | |
| Tween.propHooks._default.get( this ); | |
| }, | |
| run: function( percent ) { | |
| var eased, | |
| hooks = Tween.propHooks[ this.prop ]; | |
| if ( this.options.duration ) { | |
| this.pos = eased = jQuery.easing[ this.easing ]( | |
| percent, this.options.duration * percent, 0, 1, this.options.duration | |
| ); | |
| } else { | |
| this.pos = eased = percent; | |
| } | |
| this.now = ( this.end - this.start ) * eased + this.start; | |
| if ( this.options.step ) { | |
| this.options.step.call( this.elem, this.now, this ); | |
| } | |
| if ( hooks && hooks.set ) { | |
| hooks.set( this ); | |
| } else { | |
| Tween.propHooks._default.set( this ); | |
| } | |
| return this; | |
| } | |
| }; | |
| Tween.prototype.init.prototype = Tween.prototype; | |
| Tween.propHooks = { | |
| _default: { | |
| get: function( tween ) { | |
| var result; | |
| if ( tween.elem[ tween.prop ] != null && | |
| (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) { | |
| return tween.elem[ tween.prop ]; | |
| } | |
| // Passing an empty string as a 3rd parameter to .css will automatically | |
| // attempt a parseFloat and fallback to a string if the parse fails. | |
| // Simple values such as "10px" are parsed to Float; | |
| // complex values such as "rotate(1rad)" are returned as-is. | |
| result = jQuery.css( tween.elem, tween.prop, "" ); | |
| // Empty strings, null, undefined and "auto" are converted to 0. | |
| return !result || result === "auto" ? 0 : result; | |
| }, | |
| set: function( tween ) { | |
| // Use step hook for back compat. | |
| // Use cssHook if its there. | |
| // Use .style if available and use plain properties where available. | |
| if ( jQuery.fx.step[ tween.prop ] ) { | |
| jQuery.fx.step[ tween.prop ]( tween ); | |
| } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) { | |
| jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); | |
| } else { | |
| tween.elem[ tween.prop ] = tween.now; | |
| } | |
| } | |
| } | |
| }; | |
| // Support: IE9 | |
| // Panic based approach to setting things on disconnected nodes | |
| Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { | |
| set: function( tween ) { | |
| if ( tween.elem.nodeType && tween.elem.parentNode ) { | |
| tween.elem[ tween.prop ] = tween.now; | |
| } | |
| } | |
| }; | |
| jQuery.easing = { | |
| linear: function( p ) { | |
| return p; | |
| }, | |
| swing: function( p ) { | |
| return 0.5 - Math.cos( p * Math.PI ) / 2; | |
| } | |
| }; | |
| jQuery.fx = Tween.prototype.init; | |
| // Back Compat <1.8 extension point | |
| jQuery.fx.step = {}; | |
| var | |
| fxNow, timerId, | |
| rfxtypes = /^(?:toggle|show|hide)$/, | |
| rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ), | |
| rrun = /queueHooks$/, | |
| animationPrefilters = [ defaultPrefilter ], | |
| tweeners = { | |
| "*": [ function( prop, value ) { | |
| var tween = this.createTween( prop, value ), | |
| target = tween.cur(), | |
| parts = rfxnum.exec( value ), | |
| unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), | |
| // Starting value computation is required for potential unit mismatches | |
| start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) && | |
| rfxnum.exec( jQuery.css( tween.elem, prop ) ), | |
| scale = 1, | |
| maxIterations = 20; | |
| if ( start && start[ 3 ] !== unit ) { | |
| // Trust units reported by jQuery.css | |
| unit = unit || start[ 3 ]; | |
| // Make sure we update the tween properties later on | |
| parts = parts || []; | |
| // Iteratively approximate from a nonzero starting point | |
| start = +target || 1; | |
| do { | |
| // If previous iteration zeroed out, double until we get *something*. | |
| // Use string for doubling so we don't accidentally see scale as unchanged below | |
| scale = scale || ".5"; | |
| // Adjust and apply | |
| start = start / scale; | |
| jQuery.style( tween.elem, prop, start + unit ); | |
| // Update scale, tolerating zero or NaN from tween.cur(), | |
| // break the loop if scale is unchanged or perfect, or if we've just had enough | |
| } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations ); | |
| } | |
| // Update tween properties | |
| if ( parts ) { | |
| start = tween.start = +start || +target || 0; | |
| tween.unit = unit; | |
| // If a +=/-= token was provided, we're doing a relative animation | |
| tween.end = parts[ 1 ] ? | |
| start + ( parts[ 1 ] + 1 ) * parts[ 2 ] : | |
| +parts[ 2 ]; | |
| } | |
| return tween; | |
| } ] | |
| }; | |
| // Animations created synchronously will run synchronously | |
| function createFxNow() { | |
| setTimeout(function() { | |
| fxNow = undefined; | |
| }); | |
| return ( fxNow = jQuery.now() ); | |
| } | |
| // Generate parameters to create a standard animation | |
| function genFx( type, includeWidth ) { | |
| var which, | |
| i = 0, | |
| attrs = { height: type }; | |
| // If we include width, step value is 1 to do all cssExpand values, | |
| // otherwise step value is 2 to skip over Left and Right | |
| includeWidth = includeWidth ? 1 : 0; | |
| for ( ; i < 4 ; i += 2 - includeWidth ) { | |
| which = cssExpand[ i ]; | |
| attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; | |
| } | |
| if ( includeWidth ) { | |
| attrs.opacity = attrs.width = type; | |
| } | |
| return attrs; | |
| } | |
| function createTween( value, prop, animation ) { | |
| var tween, | |
| collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ), | |
| index = 0, | |
| length = collection.length; | |
| for ( ; index < length; index++ ) { | |
| if ( (tween = collection[ index ].call( animation, prop, value )) ) { | |
| // We're done with this property | |
| return tween; | |
| } | |
| } | |
| } | |
| function defaultPrefilter( elem, props, opts ) { | |
| /* jshint validthis: true */ | |
| var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay, | |
| anim = this, | |
| orig = {}, | |
| style = elem.style, | |
| hidden = elem.nodeType && isHidden( elem ), | |
| dataShow = data_priv.get( elem, "fxshow" ); | |
| // Handle queue: false promises | |
| if ( !opts.queue ) { | |
| hooks = jQuery._queueHooks( elem, "fx" ); | |
| if ( hooks.unqueued == null ) { | |
| hooks.unqueued = 0; | |
| oldfire = hooks.empty.fire; | |
| hooks.empty.fire = function() { | |
| if ( !hooks.unqueued ) { | |
| oldfire(); | |
| } | |
| }; | |
| } | |
| hooks.unqueued++; | |
| anim.always(function() { | |
| // Ensure the complete handler is called before this completes | |
| anim.always(function() { | |
| hooks.unqueued--; | |
| if ( !jQuery.queue( elem, "fx" ).length ) { | |
| hooks.empty.fire(); | |
| } | |
| }); | |
| }); | |
| } | |
| // Height/width overflow pass | |
| if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) { | |
| // Make sure that nothing sneaks out | |
| // Record all 3 overflow attributes because IE9-10 do not | |
| // change the overflow attribute when overflowX and | |
| // overflowY are set to the same value | |
| opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; | |
| // Set display property to inline-block for height/width | |
| // animations on inline elements that are having width/height animated | |
| display = jQuery.css( elem, "display" ); | |
| // Test default display if display is currently "none" | |
| checkDisplay = display === "none" ? | |
| data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display; | |
| if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) { | |
| style.display = "inline-block"; | |
| } | |
| } | |
| if ( opts.overflow ) { | |
| style.overflow = "hidden"; | |
| anim.always(function() { | |
| style.overflow = opts.overflow[ 0 ]; | |
| style.overflowX = opts.overflow[ 1 ]; | |
| style.overflowY = opts.overflow[ 2 ]; | |
| }); | |
| } | |
| // show/hide pass | |
| for ( prop in props ) { | |
| value = props[ prop ]; | |
| if ( rfxtypes.exec( value ) ) { | |
| delete props[ prop ]; | |
| toggle = toggle || value === "toggle"; | |
| if ( value === ( hidden ? "hide" : "show" ) ) { | |
| // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden | |
| if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { | |
| hidden = true; | |
| } else { | |
| continue; | |
| } | |
| } | |
| orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); | |
| // Any non-fx value stops us from restoring the original display value | |
| } else { | |
| display = undefined; | |
| } | |
| } | |
| if ( !jQuery.isEmptyObject( orig ) ) { | |
| if ( dataShow ) { | |
| if ( "hidden" in dataShow ) { | |
| hidden = dataShow.hidden; | |
| } | |
| } else { | |
| dataShow = data_priv.access( elem, "fxshow", {} ); | |
| } | |
| // Store state if its toggle - enables .stop().toggle() to "reverse" | |
| if ( toggle ) { | |
| dataShow.hidden = !hidden; | |
| } | |
| if ( hidden ) { | |
| jQuery( elem ).show(); | |
| } else { | |
| anim.done(function() { | |
| jQuery( elem ).hide(); | |
| }); | |
| } | |
| anim.done(function() { | |
| var prop; | |
| data_priv.remove( elem, "fxshow" ); | |
| for ( prop in orig ) { | |
| jQuery.style( elem, prop, orig[ prop ] ); | |
| } | |
| }); | |
| for ( prop in orig ) { | |
| tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); | |
| if ( !( prop in dataShow ) ) { | |
| dataShow[ prop ] = tween.start; | |
| if ( hidden ) { | |
| tween.end = tween.start; | |
| tween.start = prop === "width" || prop === "height" ? 1 : 0; | |
| } | |
| } | |
| } | |
| // If this is a noop like .hide().hide(), restore an overwritten display value | |
| } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) { | |
| style.display = display; | |
| } | |
| } | |
| function propFilter( props, specialEasing ) { | |
| var index, name, easing, value, hooks; | |
| // camelCase, specialEasing and expand cssHook pass | |
| for ( index in props ) { | |
| name = jQuery.camelCase( index ); | |
| easing = specialEasing[ name ]; | |
| value = props[ index ]; | |
| if ( jQuery.isArray( value ) ) { | |
| easing = value[ 1 ]; | |
| value = props[ index ] = value[ 0 ]; | |
| } | |
| if ( index !== name ) { | |
| props[ name ] = value; | |
| delete props[ index ]; | |
| } | |
| hooks = jQuery.cssHooks[ name ]; | |
| if ( hooks && "expand" in hooks ) { | |
| value = hooks.expand( value ); | |
| delete props[ name ]; | |
| // Not quite $.extend, this won't overwrite existing keys. | |
| // Reusing 'index' because we have the correct "name" | |
| for ( index in value ) { | |
| if ( !( index in props ) ) { | |
| props[ index ] = value[ index ]; | |
| specialEasing[ index ] = easing; | |
| } | |
| } | |
| } else { | |
| specialEasing[ name ] = easing; | |
| } | |
| } | |
| } | |
| function Animation( elem, properties, options ) { | |
| var result, | |
| stopped, | |
| index = 0, | |
| length = animationPrefilters.length, | |
| deferred = jQuery.Deferred().always( function() { | |
| // Don't match elem in the :animated selector | |
| delete tick.elem; | |
| }), | |
| tick = function() { | |
| if ( stopped ) { | |
| return false; | |
| } | |
| var currentTime = fxNow || createFxNow(), | |
| remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), | |
| // Support: Android 2.3 | |
| // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) | |
| temp = remaining / animation.duration || 0, | |
| percent = 1 - temp, | |
| index = 0, | |
| length = animation.tweens.length; | |
| for ( ; index < length ; index++ ) { | |
| animation.tweens[ index ].run( percent ); | |
| } | |
| deferred.notifyWith( elem, [ animation, percent, remaining ]); | |
| if ( percent < 1 && length ) { | |
| return remaining; | |
| } else { | |
| deferred.resolveWith( elem, [ animation ] ); | |
| return false; | |
| } | |
| }, | |
| animation = deferred.promise({ | |
| elem: elem, | |
| props: jQuery.extend( {}, properties ), | |
| opts: jQuery.extend( true, { specialEasing: {} }, options ), | |
| originalProperties: properties, | |
| originalOptions: options, | |
| startTime: fxNow || createFxNow(), | |
| duration: options.duration, | |
| tweens: [], | |
| createTween: function( prop, end ) { | |
| var tween = jQuery.Tween( elem, animation.opts, prop, end, | |
| animation.opts.specialEasing[ prop ] || animation.opts.easing ); | |
| animation.tweens.push( tween ); | |
| return tween; | |
| }, | |
| stop: function( gotoEnd ) { | |
| var index = 0, | |
| // If we are going to the end, we want to run all the tweens | |
| // otherwise we skip this part | |
| length = gotoEnd ? animation.tweens.length : 0; | |
| if ( stopped ) { | |
| return this; | |
| } | |
| stopped = true; | |
| for ( ; index < length ; index++ ) { | |
| animation.tweens[ index ].run( 1 ); | |
| } | |
| // Resolve when we played the last frame; otherwise, reject | |
| if ( gotoEnd ) { | |
| deferred.resolveWith( elem, [ animation, gotoEnd ] ); | |
| } else { | |
| deferred.rejectWith( elem, [ animation, gotoEnd ] ); | |
| } | |
| return this; | |
| } | |
| }), | |
| props = animation.props; | |
| propFilter( props, animation.opts.specialEasing ); | |
| for ( ; index < length ; index++ ) { | |
| result = animationPrefilters[ index ].call( animation, elem, props, animation.opts ); | |
| if ( result ) { | |
| return result; | |
| } | |
| } | |
| jQuery.map( props, createTween, animation ); | |
| if ( jQuery.isFunction( animation.opts.start ) ) { | |
| animation.opts.start.call( elem, animation ); | |
| } | |
| jQuery.fx.timer( | |
| jQuery.extend( tick, { | |
| elem: elem, | |
| anim: animation, | |
| queue: animation.opts.queue | |
| }) | |
| ); | |
| // attach callbacks from options | |
| return animation.progress( animation.opts.progress ) | |
| .done( animation.opts.done, animation.opts.complete ) | |
| .fail( animation.opts.fail ) | |
| .always( animation.opts.always ); | |
| } | |
| jQuery.Animation = jQuery.extend( Animation, { | |
| tweener: function( props, callback ) { | |
| if ( jQuery.isFunction( props ) ) { | |
| callback = props; | |
| props = [ "*" ]; | |
| } else { | |
| props = props.split(" "); | |
| } | |
| var prop, | |
| index = 0, | |
| length = props.length; | |
| for ( ; index < length ; index++ ) { | |
| prop = props[ index ]; | |
| tweeners[ prop ] = tweeners[ prop ] || []; | |
| tweeners[ prop ].unshift( callback ); | |
| } | |
| }, | |
| prefilter: function( callback, prepend ) { | |
| if ( prepend ) { | |
| animationPrefilters.unshift( callback ); | |
| } else { | |
| animationPrefilters.push( callback ); | |
| } | |
| } | |
| }); | |
| jQuery.speed = function( speed, easing, fn ) { | |
| var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { | |
| complete: fn || !fn && easing || | |
| jQuery.isFunction( speed ) && speed, | |
| duration: speed, | |
| easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing | |
| }; | |
| opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : | |
| opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; | |
| // Normalize opt.queue - true/undefined/null -> "fx" | |
| if ( opt.queue == null || opt.queue === true ) { | |
| opt.queue = "fx"; | |
| } | |
| // Queueing | |
| opt.old = opt.complete; | |
| opt.complete = function() { | |
| if ( jQuery.isFunction( opt.old ) ) { | |
| opt.old.call( this ); | |
| } | |
| if ( opt.queue ) { | |
| jQuery.dequeue( this, opt.queue ); | |
| } | |
| }; | |
| return opt; | |
| }; | |
| jQuery.fn.extend({ | |
| fadeTo: function( speed, to, easing, callback ) { | |
| // Show any hidden elements after setting opacity to 0 | |
| return this.filter( isHidden ).css( "opacity", 0 ).show() | |
| // Animate to the value specified | |
| .end().animate({ opacity: to }, speed, easing, callback ); | |
| }, | |
| animate: function( prop, speed, easing, callback ) { | |
| var empty = jQuery.isEmptyObject( prop ), | |
| optall = jQuery.speed( speed, easing, callback ), | |
| doAnimation = function() { | |
| // Operate on a copy of prop so per-property easing won't be lost | |
| var anim = Animation( this, jQuery.extend( {}, prop ), optall ); | |
| // Empty animations, or finishing resolves immediately | |
| if ( empty || data_priv.get( this, "finish" ) ) { | |
| anim.stop( true ); | |
| } | |
| }; | |
| doAnimation.finish = doAnimation; | |
| return empty || optall.queue === false ? | |
| this.each( doAnimation ) : | |
| this.queue( optall.queue, doAnimation ); | |
| }, | |
| stop: function( type, clearQueue, gotoEnd ) { | |
| var stopQueue = function( hooks ) { | |
| var stop = hooks.stop; | |
| delete hooks.stop; | |
| stop( gotoEnd ); | |
| }; | |
| if ( typeof type !== "string" ) { | |
| gotoEnd = clearQueue; | |
| clearQueue = type; | |
| type = undefined; | |
| } | |
| if ( clearQueue && type !== false ) { | |
| this.queue( type || "fx", [] ); | |
| } | |
| return this.each(function() { | |
| var dequeue = true, | |
| index = type != null && type + "queueHooks", | |
| timers = jQuery.timers, | |
| data = data_priv.get( this ); | |
| if ( index ) { | |
| if ( data[ index ] && data[ index ].stop ) { | |
| stopQueue( data[ index ] ); | |
| } | |
| } else { | |
| for ( index in data ) { | |
| if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { | |
| stopQueue( data[ index ] ); | |
| } | |
| } | |
| } | |
| for ( index = timers.length; index--; ) { | |
| if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) { | |
| timers[ index ].anim.stop( gotoEnd ); | |
| dequeue = false; | |
| timers.splice( index, 1 ); | |
| } | |
| } | |
| // Start the next in the queue if the last step wasn't forced. | |
| // Timers currently will call their complete callbacks, which | |
| // will dequeue but only if they were gotoEnd. | |
| if ( dequeue || !gotoEnd ) { | |
| jQuery.dequeue( this, type ); | |
| } | |
| }); | |
| }, | |
| finish: function( type ) { | |
| if ( type !== false ) { | |
| type = type || "fx"; | |
| } | |
| return this.each(function() { | |
| var index, | |
| data = data_priv.get( this ), | |
| queue = data[ type + "queue" ], | |
| hooks = data[ type + "queueHooks" ], | |
| timers = jQuery.timers, | |
| length = queue ? queue.length : 0; | |
| // Enable finishing flag on private data | |
| data.finish = true; | |
| // Empty the queue first | |
| jQuery.queue( this, type, [] ); | |
| if ( hooks && hooks.stop ) { | |
| hooks.stop.call( this, true ); | |
| } | |
| // Look for any active animations, and finish them | |
| for ( index = timers.length; index--; ) { | |
| if ( timers[ index ].elem === this && timers[ index ].queue === type ) { | |
| timers[ index ].anim.stop( true ); | |
| timers.splice( index, 1 ); | |
| } | |
| } | |
| // Look for any animations in the old queue and finish them | |
| for ( index = 0; index < length; index++ ) { | |
| if ( queue[ index ] && queue[ index ].finish ) { | |
| queue[ index ].finish.call( this ); | |
| } | |
| } | |
| // Turn off finishing flag | |
| delete data.finish; | |
| }); | |
| } | |
| }); | |
| jQuery.each([ "toggle", "show", "hide" ], function( i, name ) { | |
| var cssFn = jQuery.fn[ name ]; | |
| jQuery.fn[ name ] = function( speed, easing, callback ) { | |
| return speed == null || typeof speed === "boolean" ? | |
| cssFn.apply( this, arguments ) : | |
| this.animate( genFx( name, true ), speed, easing, callback ); | |
| }; | |
| }); | |
| // Generate shortcuts for custom animations | |
| jQuery.each({ | |
| slideDown: genFx("show"), | |
| slideUp: genFx("hide"), | |
| slideToggle: genFx("toggle"), | |
| fadeIn: { opacity: "show" }, | |
| fadeOut: { opacity: "hide" }, | |
| fadeToggle: { opacity: "toggle" } | |
| }, function( name, props ) { | |
| jQuery.fn[ name ] = function( speed, easing, callback ) { | |
| return this.animate( props, speed, easing, callback ); | |
| }; | |
| }); | |
| jQuery.timers = []; | |
| jQuery.fx.tick = function() { | |
| var timer, | |
| i = 0, | |
| timers = jQuery.timers; | |
| fxNow = jQuery.now(); | |
| for ( ; i < timers.length; i++ ) { | |
| timer = timers[ i ]; | |
| // Checks the timer has not already been removed | |
| if ( !timer() && timers[ i ] === timer ) { | |
| timers.splice( i--, 1 ); | |
| } | |
| } | |
| if ( !timers.length ) { | |
| jQuery.fx.stop(); | |
| } | |
| fxNow = undefined; | |
| }; | |
| jQuery.fx.timer = function( timer ) { | |
| jQuery.timers.push( timer ); | |
| if ( timer() ) { | |
| jQuery.fx.start(); | |
| } else { | |
| jQuery.timers.pop(); | |
| } | |
| }; | |
| jQuery.fx.interval = 13; | |
| jQuery.fx.start = function() { | |
| if ( !timerId ) { | |
| timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval ); | |
| } | |
| }; | |
| jQuery.fx.stop = function() { | |
| clearInterval( timerId ); | |
| timerId = null; | |
| }; | |
| jQuery.fx.speeds = { | |
| slow: 600, | |
| fast: 200, | |
| // Default speed | |
| _default: 400 | |
| }; | |
| // Based off of the plugin by Clint Helfers, with permission. | |
| // http://blindsignals.com/index.php/2009/07/jquery-delay/ | |
| jQuery.fn.delay = function( time, type ) { | |
| time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; | |
| type = type || "fx"; | |
| return this.queue( type, function( next, hooks ) { | |
| var timeout = setTimeout( next, time ); | |
| hooks.stop = function() { | |
| clearTimeout( timeout ); | |
| }; | |
| }); | |
| }; | |
| (function() { | |
| var input = document.createElement( "input" ), | |
| select = document.createElement( "select" ), | |
| opt = select.appendChild( document.createElement( "option" ) ); | |
| input.type = "checkbox"; | |
| // Support: iOS<=5.1, Android<=4.2+ | |
| // Default value for a checkbox should be "on" | |
| support.checkOn = input.value !== ""; | |
| // Support: IE<=11+ | |
| // Must access selectedIndex to make default options select | |
| support.optSelected = opt.selected; | |
| // Support: Android<=2.3 | |
| // Options inside disabled selects are incorrectly marked as disabled | |
| select.disabled = true; | |
| support.optDisabled = !opt.disabled; | |
| // Support: IE<=11+ | |
| // An input loses its value after becoming a radio | |
| input = document.createElement( "input" ); | |
| input.value = "t"; | |
| input.type = "radio"; | |
| support.radioValue = input.value === "t"; | |
| })(); | |
| var nodeHook, boolHook, | |
| attrHandle = jQuery.expr.attrHandle; | |
| jQuery.fn.extend({ | |
| attr: function( name, value ) { | |
| return access( this, jQuery.attr, name, value, arguments.length > 1 ); | |
| }, | |
| removeAttr: function( name ) { | |
| return this.each(function() { | |
| jQuery.removeAttr( this, name ); | |
| }); | |
| } | |
| }); | |
| jQuery.extend({ | |
| attr: function( elem, name, value ) { | |
| var hooks, ret, | |
| nType = elem.nodeType; | |
| // don't get/set attributes on text, comment and attribute nodes | |
| if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { | |
| return; | |
| } | |
| // Fallback to prop when attributes are not supported | |
| if ( typeof elem.getAttribute === strundefined ) { | |
| return jQuery.prop( elem, name, value ); | |
| } | |
| // All attributes are lowercase | |
| // Grab necessary hook if one is defined | |
| if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { | |
| name = name.toLowerCase(); | |
| hooks = jQuery.attrHooks[ name ] || | |
| ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); | |
| } | |
| if ( value !== undefined ) { | |
| if ( value === null ) { | |
| jQuery.removeAttr( elem, name ); | |
| } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { | |
| return ret; | |
| } else { | |
| elem.setAttribute( name, value + "" ); | |
| return value; | |
| } | |
| } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { | |
| return ret; | |
| } else { | |
| ret = jQuery.find.attr( elem, name ); | |
| // Non-existent attributes return null, we normalize to undefined | |
| return ret == null ? | |
| undefined : | |
| ret; | |
| } | |
| }, | |
| removeAttr: function( elem, value ) { | |
| var name, propName, | |
| i = 0, | |
| attrNames = value && value.match( rnotwhite ); | |
| if ( attrNames && elem.nodeType === 1 ) { | |
| while ( (name = attrNames[i++]) ) { | |
| propName = jQuery.propFix[ name ] || name; | |
| // Boolean attributes get special treatment (#10870) | |
| if ( jQuery.expr.match.bool.test( name ) ) { | |
| // Set corresponding property to false | |
| elem[ propName ] = false; | |
| } | |
| elem.removeAttribute( name ); | |
| } | |
| } | |
| }, | |
| attrHooks: { | |
| type: { | |
| set: function( elem, value ) { | |
| if ( !support.radioValue && value === "radio" && | |
| jQuery.nodeName( elem, "input" ) ) { | |
| var val = elem.value; | |
| elem.setAttribute( "type", value ); | |
| if ( val ) { | |
| elem.value = val; | |
| } | |
| return value; | |
| } | |
| } | |
| } | |
| } | |
| }); | |
| // Hooks for boolean attributes | |
| boolHook = { | |
| set: function( elem, value, name ) { | |
| if ( value === false ) { | |
| // Remove boolean attributes when set to false | |
| jQuery.removeAttr( elem, name ); | |
| } else { | |
| elem.setAttribute( name, name ); | |
| } | |
| return name; | |
| } | |
| }; | |
| jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { | |
| var getter = attrHandle[ name ] || jQuery.find.attr; | |
| attrHandle[ name ] = function( elem, name, isXML ) { | |
| var ret, handle; | |
| if ( !isXML ) { | |
| // Avoid an infinite loop by temporarily removing this function from the getter | |
| handle = attrHandle[ name ]; | |
| attrHandle[ name ] = ret; | |
| ret = getter( elem, name, isXML ) != null ? | |
| name.toLowerCase() : | |
| null; | |
| attrHandle[ name ] = handle; | |
| } | |
| return ret; | |
| }; | |
| }); | |
| var rfocusable = /^(?:input|select|textarea|button)$/i; | |
| jQuery.fn.extend({ | |
| prop: function( name, value ) { | |
| return access( this, jQuery.prop, name, value, arguments.length > 1 ); | |
| }, | |
| removeProp: function( name ) { | |
| return this.each(function() { | |
| delete this[ jQuery.propFix[ name ] || name ]; | |
| }); | |
| } | |
| }); | |
| jQuery.extend({ | |
| propFix: { | |
| "for": "htmlFor", | |
| "class": "className" | |
| }, | |
| prop: function( elem, name, value ) { | |
| var ret, hooks, notxml, | |
| nType = elem.nodeType; | |
| // Don't get/set properties on text, comment and attribute nodes | |
| if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { | |
| return; | |
| } | |
| notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); | |
| if ( notxml ) { | |
| // Fix name and attach hooks | |
| name = jQuery.propFix[ name ] || name; | |
| hooks = jQuery.propHooks[ name ]; | |
| } | |
| if ( value !== undefined ) { | |
| return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? | |
| ret : | |
| ( elem[ name ] = value ); | |
| } else { | |
| return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? | |
| ret : | |
| elem[ name ]; | |
| } | |
| }, | |
| propHooks: { | |
| tabIndex: { | |
| get: function( elem ) { | |
| return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ? | |
| elem.tabIndex : | |
| -1; | |
| } | |
| } | |
| } | |
| }); | |
| if ( !support.optSelected ) { | |
| jQuery.propHooks.selected = { | |
| get: function( elem ) { | |
| var parent = elem.parentNode; | |
| if ( parent && parent.parentNode ) { | |
| parent.parentNode.selectedIndex; | |
| } | |
| return null; | |
| } | |
| }; | |
| } | |
| jQuery.each([ | |
| "tabIndex", | |
| "readOnly", | |
| "maxLength", | |
| "cellSpacing", | |
| "cellPadding", | |
| "rowSpan", | |
| "colSpan", | |
| "useMap", | |
| "frameBorder", | |
| "contentEditable" | |
| ], function() { | |
| jQuery.propFix[ this.toLowerCase() ] = this; | |
| }); | |
| var rclass = /[\t\r\n\f]/g; | |
| jQuery.fn.extend({ | |
| addClass: function( value ) { | |
| var classes, elem, cur, clazz, j, finalValue, | |
| proceed = typeof value === "string" && value, | |
| i = 0, | |
| len = this.length; | |
| if ( jQuery.isFunction( value ) ) { | |
| return this.each(function( j ) { | |
| jQuery( this ).addClass( value.call( this, j, this.className ) ); | |
| }); | |
| } | |
| if ( proceed ) { | |
| // The disjunction here is for better compressibility (see removeClass) | |
| classes = ( value || "" ).match( rnotwhite ) || []; | |
| for ( ; i < len; i++ ) { | |
| elem = this[ i ]; | |
| cur = elem.nodeType === 1 && ( elem.className ? | |
| ( " " + elem.className + " " ).replace( rclass, " " ) : | |
| " " | |
| ); | |
| if ( cur ) { | |
| j = 0; | |
| while ( (clazz = classes[j++]) ) { | |
| if ( cur.indexOf( " " + clazz + " " ) < 0 ) { | |
| cur += clazz + " "; | |
| } | |
| } | |
| // only assign if different to avoid unneeded rendering. | |
| finalValue = jQuery.trim( cur ); | |
| if ( elem.className !== finalValue ) { | |
| elem.className = finalValue; | |
| } | |
| } | |
| } | |
| } | |
| return this; | |
| }, | |
| removeClass: function( value ) { | |
| var classes, elem, cur, clazz, j, finalValue, | |
| proceed = arguments.length === 0 || typeof value === "string" && value, | |
| i = 0, | |
| len = this.length; | |
| if ( jQuery.isFunction( value ) ) { | |
| return this.each(function( j ) { | |
| jQuery( this ).removeClass( value.call( this, j, this.className ) ); | |
| }); | |
| } | |
| if ( proceed ) { | |
| classes = ( value || "" ).match( rnotwhite ) || []; | |
| for ( ; i < len; i++ ) { | |
| elem = this[ i ]; | |
| // This expression is here for better compressibility (see addClass) | |
| cur = elem.nodeType === 1 && ( elem.className ? | |
| ( " " + elem.className + " " ).replace( rclass, " " ) : | |
| "" | |
| ); | |
| if ( cur ) { | |
| j = 0; | |
| while ( (clazz = classes[j++]) ) { | |
| // Remove *all* instances | |
| while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { | |
| cur = cur.replace( " " + clazz + " ", " " ); | |
| } | |
| } | |
| // Only assign if different to avoid unneeded rendering. | |
| finalValue = value ? jQuery.trim( cur ) : ""; | |
| if ( elem.className !== finalValue ) { | |
| elem.className = finalValue; | |
| } | |
| } | |
| } | |
| } | |
| return this; | |
| }, | |
| toggleClass: function( value, stateVal ) { | |
| var type = typeof value; | |
| if ( typeof stateVal === "boolean" && type === "string" ) { | |
| return stateVal ? this.addClass( value ) : this.removeClass( value ); | |
| } | |
| if ( jQuery.isFunction( value ) ) { | |
| return this.each(function( i ) { | |
| jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); | |
| }); | |
| } | |
| return this.each(function() { | |
| if ( type === "string" ) { | |
| // Toggle individual class names | |
| var className, | |
| i = 0, | |
| self = jQuery( this ), | |
| classNames = value.match( rnotwhite ) || []; | |
| while ( (className = classNames[ i++ ]) ) { | |
| // Check each className given, space separated list | |
| if ( self.hasClass( className ) ) { | |
| self.removeClass( className ); | |
| } else { | |
| self.addClass( className ); | |
| } | |
| } | |
| // Toggle whole class name | |
| } else if ( type === strundefined || type === "boolean" ) { | |
| if ( this.className ) { | |
| // store className if set | |
| data_priv.set( this, "__className__", this.className ); | |
| } | |
| // If the element has a class name or if we're passed `false`, | |
| // then remove the whole classname (if there was one, the above saved it). | |
| // Otherwise bring back whatever was previously saved (if anything), | |
| // falling back to the empty string if nothing was stored. | |
| this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || ""; | |
| } | |
| }); | |
| }, | |
| hasClass: function( selector ) { | |
| var className = " " + selector + " ", | |
| i = 0, | |
| l = this.length; | |
| for ( ; i < l; i++ ) { | |
| if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| }); | |
| var rreturn = /\r/g; | |
| jQuery.fn.extend({ | |
| val: function( value ) { | |
| var hooks, ret, isFunction, | |
| elem = this[0]; | |
| if ( !arguments.length ) { | |
| if ( elem ) { | |
| hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; | |
| if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { | |
| return ret; | |
| } | |
| ret = elem.value; | |
| return typeof ret === "string" ? | |
| // Handle most common string cases | |
| ret.replace(rreturn, "") : | |
| // Handle cases where value is null/undef or number | |
| ret == null ? "" : ret; | |
| } | |
| return; | |
| } | |
| isFunction = jQuery.isFunction( value ); | |
| return this.each(function( i ) { | |
| var val; | |
| if ( this.nodeType !== 1 ) { | |
| return; | |
| } | |
| if ( isFunction ) { | |
| val = value.call( this, i, jQuery( this ).val() ); | |
| } else { | |
| val = value; | |
| } | |
| // Treat null/undefined as ""; convert numbers to string | |
| if ( val == null ) { | |
| val = ""; | |
| } else if ( typeof val === "number" ) { | |
| val += ""; | |
| } else if ( jQuery.isArray( val ) ) { | |
| val = jQuery.map( val, function( value ) { | |
| return value == null ? "" : value + ""; | |
| }); | |
| } | |
| hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; | |
| // If set returns undefined, fall back to normal setting | |
| if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { | |
| this.value = val; | |
| } | |
| }); | |
| } | |
| }); | |
| jQuery.extend({ | |
| valHooks: { | |
| option: { | |
| get: function( elem ) { | |
| var val = jQuery.find.attr( elem, "value" ); | |
| return val != null ? | |
| val : | |
| // Support: IE10-11+ | |
| // option.text throws exceptions (#14686, #14858) | |
| jQuery.trim( jQuery.text( elem ) ); | |
| } | |
| }, | |
| select: { | |
| get: function( elem ) { | |
| var value, option, | |
| options = elem.options, | |
| index = elem.selectedIndex, | |
| one = elem.type === "select-one" || index < 0, | |
| values = one ? null : [], | |
| max = one ? index + 1 : options.length, | |
| i = index < 0 ? | |
| max : | |
| one ? index : 0; | |
| // Loop through all the selected options | |
| for ( ; i < max; i++ ) { | |
| option = options[ i ]; | |
| // IE6-9 doesn't update selected after form reset (#2551) | |
| if ( ( option.selected || i === index ) && | |
| // Don't return options that are disabled or in a disabled optgroup | |
| ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) && | |
| ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { | |
| // Get the specific value for the option | |
| value = jQuery( option ).val(); | |
| // We don't need an array for one selects | |
| if ( one ) { | |
| return value; | |
| } | |
| // Multi-Selects return an array | |
| values.push( value ); | |
| } | |
| } | |
| return values; | |
| }, | |
| set: function( elem, value ) { | |
| var optionSet, option, | |
| options = elem.options, | |
| values = jQuery.makeArray( value ), | |
| i = options.length; | |
| while ( i-- ) { | |
| option = options[ i ]; | |
| if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) { | |
| optionSet = true; | |
| } | |
| } | |
| // Force browsers to behave consistently when non-matching value is set | |
| if ( !optionSet ) { | |
| elem.selectedIndex = -1; | |
| } | |
| return values; | |
| } | |
| } | |
| } | |
| }); | |
| // Radios and checkboxes getter/setter | |
| jQuery.each([ "radio", "checkbox" ], function() { | |
| jQuery.valHooks[ this ] = { | |
| set: function( elem, value ) { | |
| if ( jQuery.isArray( value ) ) { | |
| return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); | |
| } | |
| } | |
| }; | |
| if ( !support.checkOn ) { | |
| jQuery.valHooks[ this ].get = function( elem ) { | |
| return elem.getAttribute("value") === null ? "on" : elem.value; | |
| }; | |
| } | |
| }); | |
| // Return jQuery for attributes-only inclusion | |
| jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + | |
| "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + | |
| "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { | |
| // Handle event binding | |
| jQuery.fn[ name ] = function( data, fn ) { | |
| return arguments.length > 0 ? | |
| this.on( name, null, data, fn ) : | |
| this.trigger( name ); | |
| }; | |
| }); | |
| jQuery.fn.extend({ | |
| hover: function( fnOver, fnOut ) { | |
| return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); | |
| }, | |
| bind: function( types, data, fn ) { | |
| return this.on( types, null, data, fn ); | |
| }, | |
| unbind: function( types, fn ) { | |
| return this.off( types, null, fn ); | |
| }, | |
| delegate: function( selector, types, data, fn ) { | |
| return this.on( types, selector, data, fn ); | |
| }, | |
| undelegate: function( selector, types, fn ) { | |
| // ( namespace ) or ( selector, types [, fn] ) | |
| return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); | |
| } | |
| }); | |
| var nonce = jQuery.now(); | |
| var rquery = (/\?/); | |
| // Support: Android 2.3 | |
| // Workaround failure to string-cast null input | |
| jQuery.parseJSON = function( data ) { | |
| return JSON.parse( data + "" ); | |
| }; | |
| // Cross-browser xml parsing | |
| jQuery.parseXML = function( data ) { | |
| var xml, tmp; | |
| if ( !data || typeof data !== "string" ) { | |
| return null; | |
| } | |
| // Support: IE9 | |
| try { | |
| tmp = new DOMParser(); | |
| xml = tmp.parseFromString( data, "text/xml" ); | |
| } catch ( e ) { | |
| xml = undefined; | |
| } | |
| if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { | |
| jQuery.error( "Invalid XML: " + data ); | |
| } | |
| return xml; | |
| }; | |
| var | |
| rhash = /#.*$/, | |
| rts = /([?&])_=[^&]*/, | |
| rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, | |
| // #7653, #8125, #8152: local protocol detection | |
| rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, | |
| rnoContent = /^(?:GET|HEAD)$/, | |
| rprotocol = /^\/\//, | |
| rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/, | |
| /* Prefilters | |
| * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) | |
| * 2) These are called: | |
| * - BEFORE asking for a transport | |
| * - AFTER param serialization (s.data is a string if s.processData is true) | |
| * 3) key is the dataType | |
| * 4) the catchall symbol "*" can be used | |
| * 5) execution will start with transport dataType and THEN continue down to "*" if needed | |
| */ | |
| prefilters = {}, | |
| /* Transports bindings | |
| * 1) key is the dataType | |
| * 2) the catchall symbol "*" can be used | |
| * 3) selection will start with transport dataType and THEN go to "*" if needed | |
| */ | |
| transports = {}, | |
| // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression | |
| allTypes = "*/".concat( "*" ), | |
| // Document location | |
| ajaxLocation = window.location.href, | |
| // Segment location into parts | |
| ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; | |
| // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport | |
| function addToPrefiltersOrTransports( structure ) { | |
| // dataTypeExpression is optional and defaults to "*" | |
| return function( dataTypeExpression, func ) { | |
| if ( typeof dataTypeExpression !== "string" ) { | |
| func = dataTypeExpression; | |
| dataTypeExpression = "*"; | |
| } | |
| var dataType, | |
| i = 0, | |
| dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || []; | |
| if ( jQuery.isFunction( func ) ) { | |
| // For each dataType in the dataTypeExpression | |
| while ( (dataType = dataTypes[i++]) ) { | |
| // Prepend if requested | |
| if ( dataType[0] === "+" ) { | |
| dataType = dataType.slice( 1 ) || "*"; | |
| (structure[ dataType ] = structure[ dataType ] || []).unshift( func ); | |
| // Otherwise append | |
| } else { | |
| (structure[ dataType ] = structure[ dataType ] || []).push( func ); | |
| } | |
| } | |
| } | |
| }; | |
| } | |
| // Base inspection function for prefilters and transports | |
| function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { | |
| var inspected = {}, | |
| seekingTransport = ( structure === transports ); | |
| function inspect( dataType ) { | |
| var selected; | |
| inspected[ dataType ] = true; | |
| jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { | |
| var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); | |
| if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) { | |
| options.dataTypes.unshift( dataTypeOrTransport ); | |
| inspect( dataTypeOrTransport ); | |
| return false; | |
| } else if ( seekingTransport ) { | |
| return !( selected = dataTypeOrTransport ); | |
| } | |
| }); | |
| return selected; | |
| } | |
| return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); | |
| } | |
| // A special extend for ajax options | |
| // that takes "flat" options (not to be deep extended) | |
| // Fixes #9887 | |
| function ajaxExtend( target, src ) { | |
| var key, deep, | |
| flatOptions = jQuery.ajaxSettings.flatOptions || {}; | |
| for ( key in src ) { | |
| if ( src[ key ] !== undefined ) { | |
| ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ]; | |
| } | |
| } | |
| if ( deep ) { | |
| jQuery.extend( true, target, deep ); | |
| } | |
| return target; | |
| } | |
| /* Handles responses to an ajax request: | |
| * - finds the right dataType (mediates between content-type and expected dataType) | |
| * - returns the corresponding response | |
| */ | |
| function ajaxHandleResponses( s, jqXHR, responses ) { | |
| var ct, type, finalDataType, firstDataType, | |
| contents = s.contents, | |
| dataTypes = s.dataTypes; | |
| // Remove auto dataType and get content-type in the process | |
| while ( dataTypes[ 0 ] === "*" ) { | |
| dataTypes.shift(); | |
| if ( ct === undefined ) { | |
| ct = s.mimeType || jqXHR.getResponseHeader("Content-Type"); | |
| } | |
| } | |
| // Check if we're dealing with a known content-type | |
| if ( ct ) { | |
| for ( type in contents ) { | |
| if ( contents[ type ] && contents[ type ].test( ct ) ) { | |
| dataTypes.unshift( type ); | |
| break; | |
| } | |
| } | |
| } | |
| // Check to see if we have a response for the expected dataType | |
| if ( dataTypes[ 0 ] in responses ) { | |
| finalDataType = dataTypes[ 0 ]; | |
| } else { | |
| // Try convertible dataTypes | |
| for ( type in responses ) { | |
| if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { | |
| finalDataType = type; | |
| break; | |
| } | |
| if ( !firstDataType ) { | |
| firstDataType = type; | |
| } | |
| } | |
| // Or just use first one | |
| finalDataType = finalDataType || firstDataType; | |
| } | |
| // If we found a dataType | |
| // We add the dataType to the list if needed | |
| // and return the corresponding response | |
| if ( finalDataType ) { | |
| if ( finalDataType !== dataTypes[ 0 ] ) { | |
| dataTypes.unshift( finalDataType ); | |
| } | |
| return responses[ finalDataType ]; | |
| } | |
| } | |
| /* Chain conversions given the request and the original response | |
| * Also sets the responseXXX fields on the jqXHR instance | |
| */ | |
| function ajaxConvert( s, response, jqXHR, isSuccess ) { | |
| var conv2, current, conv, tmp, prev, | |
| converters = {}, | |
| // Work with a copy of dataTypes in case we need to modify it for conversion | |
| dataTypes = s.dataTypes.slice(); | |
| // Create converters map with lowercased keys | |
| if ( dataTypes[ 1 ] ) { | |
| for ( conv in s.converters ) { | |
| converters[ conv.toLowerCase() ] = s.converters[ conv ]; | |
| } | |
| } | |
| current = dataTypes.shift(); | |
| // Convert to each sequential dataType | |
| while ( current ) { | |
| if ( s.responseFields[ current ] ) { | |
| jqXHR[ s.responseFields[ current ] ] = response; | |
| } | |
| // Apply the dataFilter if provided | |
| if ( !prev && isSuccess && s.dataFilter ) { | |
| response = s.dataFilter( response, s.dataType ); | |
| } | |
| prev = current; | |
| current = dataTypes.shift(); | |
| if ( current ) { | |
| // There's only work to do if current dataType is non-auto | |
| if ( current === "*" ) { | |
| current = prev; | |
| // Convert response if prev dataType is non-auto and differs from current | |
| } else if ( prev !== "*" && prev !== current ) { | |
| // Seek a direct converter | |
| conv = converters[ prev + " " + current ] || converters[ "* " + current ]; | |
| // If none found, seek a pair | |
| if ( !conv ) { | |
| for ( conv2 in converters ) { | |
| // If conv2 outputs current | |
| tmp = conv2.split( " " ); | |
| if ( tmp[ 1 ] === current ) { | |
| // If prev can be converted to accepted input | |
| conv = converters[ prev + " " + tmp[ 0 ] ] || | |
| converters[ "* " + tmp[ 0 ] ]; | |
| if ( conv ) { | |
| // Condense equivalence converters | |
| if ( conv === true ) { | |
| conv = converters[ conv2 ]; | |
| // Otherwise, insert the intermediate dataType | |
| } else if ( converters[ conv2 ] !== true ) { | |
| current = tmp[ 0 ]; | |
| dataTypes.unshift( tmp[ 1 ] ); | |
| } | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| // Apply converter (if not an equivalence) | |
| if ( conv !== true ) { | |
| // Unless errors are allowed to bubble, catch and return them | |
| if ( conv && s[ "throws" ] ) { | |
| response = conv( response ); | |
| } else { | |
| try { | |
| response = conv( response ); | |
| } catch ( e ) { | |
| return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| return { state: "success", data: response }; | |
| } | |
| jQuery.extend({ | |
| // Counter for holding the number of active queries | |
| active: 0, | |
| // Last-Modified header cache for next request | |
| lastModified: {}, | |
| etag: {}, | |
| ajaxSettings: { | |
| url: ajaxLocation, | |
| type: "GET", | |
| isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), | |
| global: true, | |
| processData: true, | |
| async: true, | |
| contentType: "application/x-www-form-urlencoded; charset=UTF-8", | |
| /* | |
| timeout: 0, | |
| data: null, | |
| dataType: null, | |
| username: null, | |
| password: null, | |
| cache: null, | |
| throws: false, | |
| traditional: false, | |
| headers: {}, | |
| */ | |
| accepts: { | |
| "*": allTypes, | |
| text: "text/plain", | |
| html: "text/html", | |
| xml: "application/xml, text/xml", | |
| json: "application/json, text/javascript" | |
| }, | |
| contents: { | |
| xml: /xml/, | |
| html: /html/, | |
| json: /json/ | |
| }, | |
| responseFields: { | |
| xml: "responseXML", | |
| text: "responseText", | |
| json: "responseJSON" | |
| }, | |
| // Data converters | |
| // Keys separate source (or catchall "*") and destination types with a single space | |
| converters: { | |
| // Convert anything to text | |
| "* text": String, | |
| // Text to html (true = no transformation) | |
| "text html": true, | |
| // Evaluate text as a json expression | |
| "text json": jQuery.parseJSON, | |
| // Parse text as xml | |
| "text xml": jQuery.parseXML | |
| }, | |
| // For options that shouldn't be deep extended: | |
| // you can add your own custom options here if | |
| // and when you create one that shouldn't be | |
| // deep extended (see ajaxExtend) | |
| flatOptions: { | |
| url: true, | |
| context: true | |
| } | |
| }, | |
| // Creates a full fledged settings object into target | |
| // with both ajaxSettings and settings fields. | |
| // If target is omitted, writes into ajaxSettings. | |
| ajaxSetup: function( target, settings ) { | |
| return settings ? | |
| // Building a settings object | |
| ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : | |
| // Extending ajaxSettings | |
| ajaxExtend( jQuery.ajaxSettings, target ); | |
| }, | |
| ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), | |
| ajaxTransport: addToPrefiltersOrTransports( transports ), | |
| // Main method | |
| ajax: function( url, options ) { | |
| // If url is an object, simulate pre-1.5 signature | |
| if ( typeof url === "object" ) { | |
| options = url; | |
| url = undefined; | |
| } | |
| // Force options to be an object | |
| options = options || {}; | |
| var transport, | |
| // URL without anti-cache param | |
| cacheURL, | |
| // Response headers | |
| responseHeadersString, | |
| responseHeaders, | |
| // timeout handle | |
| timeoutTimer, | |
| // Cross-domain detection vars | |
| parts, | |
| // To know if global events are to be dispatched | |
| fireGlobals, | |
| // Loop variable | |
| i, | |
| // Create the final options object | |
| s = jQuery.ajaxSetup( {}, options ), | |
| // Callbacks context | |
| callbackContext = s.context || s, | |
| // Context for global events is callbackContext if it is a DOM node or jQuery collection | |
| globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? | |
| jQuery( callbackContext ) : | |
| jQuery.event, | |
| // Deferreds | |
| deferred = jQuery.Deferred(), | |
| completeDeferred = jQuery.Callbacks("once memory"), | |
| // Status-dependent callbacks | |
| statusCode = s.statusCode || {}, | |
| // Headers (they are sent all at once) | |
| requestHeaders = {}, | |
| requestHeadersNames = {}, | |
| // The jqXHR state | |
| state = 0, | |
| // Default abort message | |
| strAbort = "canceled", | |
| // Fake xhr | |
| jqXHR = { | |
| readyState: 0, | |
| // Builds headers hashtable if needed | |
| getResponseHeader: function( key ) { | |
| var match; | |
| if ( state === 2 ) { | |
| if ( !responseHeaders ) { | |
| responseHeaders = {}; | |
| while ( (match = rheaders.exec( responseHeadersString )) ) { | |
| responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; | |
| } | |
| } | |
| match = responseHeaders[ key.toLowerCase() ]; | |
| } | |
| return match == null ? null : match; | |
| }, | |
| // Raw string | |
| getAllResponseHeaders: function() { | |
| return state === 2 ? responseHeadersString : null; | |
| }, | |
| // Caches the header | |
| setRequestHeader: function( name, value ) { | |
| var lname = name.toLowerCase(); | |
| if ( !state ) { | |
| name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; | |
| requestHeaders[ name ] = value; | |
| } | |
| return this; | |
| }, | |
| // Overrides response content-type header | |
| overrideMimeType: function( type ) { | |
| if ( !state ) { | |
| s.mimeType = type; | |
| } | |
| return this; | |
| }, | |
| // Status-dependent callbacks | |
| statusCode: function( map ) { | |
| var code; | |
| if ( map ) { | |
| if ( state < 2 ) { | |
| for ( code in map ) { | |
| // Lazy-add the new callback in a way that preserves old ones | |
| statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; | |
| } | |
| } else { | |
| // Execute the appropriate callbacks | |
| jqXHR.always( map[ jqXHR.status ] ); | |
| } | |
| } | |
| return this; | |
| }, | |
| // Cancel the request | |
| abort: function( statusText ) { | |
| var finalText = statusText || strAbort; | |
| if ( transport ) { | |
| transport.abort( finalText ); | |
| } | |
| done( 0, finalText ); | |
| return this; | |
| } | |
| }; | |
| // Attach deferreds | |
| deferred.promise( jqXHR ).complete = completeDeferred.add; | |
| jqXHR.success = jqXHR.done; | |
| jqXHR.error = jqXHR.fail; | |
| // Remove hash character (#7531: and string promotion) | |
| // Add protocol if not provided (prefilters might expect it) | |
| // Handle falsy url in the settings object (#10093: consistency with old signature) | |
| // We also use the url parameter if available | |
| s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ) | |
| .replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); | |
| // Alias method option to type as per ticket #12004 | |
| s.type = options.method || options.type || s.method || s.type; | |
| // Extract dataTypes list | |
| s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ]; | |
| // A cross-domain request is in order when we have a protocol:host:port mismatch | |
| if ( s.crossDomain == null ) { | |
| parts = rurl.exec( s.url.toLowerCase() ); | |
| s.crossDomain = !!( parts && | |
| ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] || | |
| ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !== | |
| ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) ) | |
| ); | |
| } | |
| // Convert data if not already a string | |
| if ( s.data && s.processData && typeof s.data !== "string" ) { | |
| s.data = jQuery.param( s.data, s.traditional ); | |
| } | |
| // Apply prefilters | |
| inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); | |
| // If request was aborted inside a prefilter, stop there | |
| if ( state === 2 ) { | |
| return jqXHR; | |
| } | |
| // We can fire global events as of now if asked to | |
| // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) | |
| fireGlobals = jQuery.event && s.global; | |
| // Watch for a new set of requests | |
| if ( fireGlobals && jQuery.active++ === 0 ) { | |
| jQuery.event.trigger("ajaxStart"); | |
| } | |
| // Uppercase the type | |
| s.type = s.type.toUpperCase(); | |
| // Determine if request has content | |
| s.hasContent = !rnoContent.test( s.type ); | |
| // Save the URL in case we're toying with the If-Modified-Since | |
| // and/or If-None-Match header later on | |
| cacheURL = s.url; | |
| // More options handling for requests with no content | |
| if ( !s.hasContent ) { | |
| // If data is available, append data to url | |
| if ( s.data ) { | |
| cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data ); | |
| // #9682: remove data so that it's not used in an eventual retry | |
| delete s.data; | |
| } | |
| // Add anti-cache in url if needed | |
| if ( s.cache === false ) { | |
| s.url = rts.test( cacheURL ) ? | |
| // If there is already a '_' parameter, set its value | |
| cacheURL.replace( rts, "$1_=" + nonce++ ) : | |
| // Otherwise add one to the end | |
| cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++; | |
| } | |
| } | |
| // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. | |
| if ( s.ifModified ) { | |
| if ( jQuery.lastModified[ cacheURL ] ) { | |
| jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); | |
| } | |
| if ( jQuery.etag[ cacheURL ] ) { | |
| jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); | |
| } | |
| } | |
| // Set the correct header, if data is being sent | |
| if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { | |
| jqXHR.setRequestHeader( "Content-Type", s.contentType ); | |
| } | |
| // Set the Accepts header for the server, depending on the dataType | |
| jqXHR.setRequestHeader( | |
| "Accept", | |
| s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? | |
| s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : | |
| s.accepts[ "*" ] | |
| ); | |
| // Check for headers option | |
| for ( i in s.headers ) { | |
| jqXHR.setRequestHeader( i, s.headers[ i ] ); | |
| } | |
| // Allow custom headers/mimetypes and early abort | |
| if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { | |
| // Abort if not done already and return | |
| return jqXHR.abort(); | |
| } | |
| // Aborting is no longer a cancellation | |
| strAbort = "abort"; | |
| // Install callbacks on deferreds | |
| for ( i in { success: 1, error: 1, complete: 1 } ) { | |
| jqXHR[ i ]( s[ i ] ); | |
| } | |
| // Get transport | |
| transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); | |
| // If no transport, we auto-abort | |
| if ( !transport ) { | |
| done( -1, "No Transport" ); | |
| } else { | |
| jqXHR.readyState = 1; | |
| // Send global event | |
| if ( fireGlobals ) { | |
| globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); | |
| } | |
| // Timeout | |
| if ( s.async && s.timeout > 0 ) { | |
| timeoutTimer = setTimeout(function() { | |
| jqXHR.abort("timeout"); | |
| }, s.timeout ); | |
| } | |
| try { | |
| state = 1; | |
| transport.send( requestHeaders, done ); | |
| } catch ( e ) { | |
| // Propagate exception as error if not done | |
| if ( state < 2 ) { | |
| done( -1, e ); | |
| // Simply rethrow otherwise | |
| } else { | |
| throw e; | |
| } | |
| } | |
| } | |
| // Callback for when everything is done | |
| function done( status, nativeStatusText, responses, headers ) { | |
| var isSuccess, success, error, response, modified, | |
| statusText = nativeStatusText; | |
| // Called once | |
| if ( state === 2 ) { | |
| return; | |
| } | |
| // State is "done" now | |
| state = 2; | |
| // Clear timeout if it exists | |
| if ( timeoutTimer ) { | |
| clearTimeout( timeoutTimer ); | |
| } | |
| // Dereference transport for early garbage collection | |
| // (no matter how long the jqXHR object will be used) | |
| transport = undefined; | |
| // Cache response headers | |
| responseHeadersString = headers || ""; | |
| // Set readyState | |
| jqXHR.readyState = status > 0 ? 4 : 0; | |
| // Determine if successful | |
| isSuccess = status >= 200 && status < 300 || status === 304; | |
| // Get response data | |
| if ( responses ) { | |
| response = ajaxHandleResponses( s, jqXHR, responses ); | |
| } | |
| // Convert no matter what (that way responseXXX fields are always set) | |
| response = ajaxConvert( s, response, jqXHR, isSuccess ); | |
| // If successful, handle type chaining | |
| if ( isSuccess ) { | |
| // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. | |
| if ( s.ifModified ) { | |
| modified = jqXHR.getResponseHeader("Last-Modified"); | |
| if ( modified ) { | |
| jQuery.lastModified[ cacheURL ] = modified; | |
| } | |
| modified = jqXHR.getResponseHeader("etag"); | |
| if ( modified ) { | |
| jQuery.etag[ cacheURL ] = modified; | |
| } | |
| } | |
| // if no content | |
| if ( status === 204 || s.type === "HEAD" ) { | |
| statusText = "nocontent"; | |
| // if not modified | |
| } else if ( status === 304 ) { | |
| statusText = "notmodified"; | |
| // If we have data, let's convert it | |
| } else { | |
| statusText = response.state; | |
| success = response.data; | |
| error = response.error; | |
| isSuccess = !error; | |
| } | |
| } else { | |
| // Extract error from statusText and normalize for non-aborts | |
| error = statusText; | |
| if ( status || !statusText ) { | |
| statusText = "error"; | |
| if ( status < 0 ) { | |
| status = 0; | |
| } | |
| } | |
| } | |
| // Set data for the fake xhr object | |
| jqXHR.status = status; | |
| jqXHR.statusText = ( nativeStatusText || statusText ) + ""; | |
| // Success/Error | |
| if ( isSuccess ) { | |
| deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); | |
| } else { | |
| deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); | |
| } | |
| // Status-dependent callbacks | |
| jqXHR.statusCode( statusCode ); | |
| statusCode = undefined; | |
| if ( fireGlobals ) { | |
| globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", | |
| [ jqXHR, s, isSuccess ? success : error ] ); | |
| } | |
| // Complete | |
| completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); | |
| if ( fireGlobals ) { | |
| globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); | |
| // Handle the global AJAX counter | |
| if ( !( --jQuery.active ) ) { | |
| jQuery.event.trigger("ajaxStop"); | |
| } | |
| } | |
| } | |
| return jqXHR; | |
| }, | |
| getJSON: function( url, data, callback ) { | |
| return jQuery.get( url, data, callback, "json" ); | |
| }, | |
| getScript: function( url, callback ) { | |
| return jQuery.get( url, undefined, callback, "script" ); | |
| } | |
| }); | |
| jQuery.each( [ "get", "post" ], function( i, method ) { | |
| jQuery[ method ] = function( url, data, callback, type ) { | |
| // Shift arguments if data argument was omitted | |
| if ( jQuery.isFunction( data ) ) { | |
| type = type || callback; | |
| callback = data; | |
| data = undefined; | |
| } | |
| return jQuery.ajax({ | |
| url: url, | |
| type: method, | |
| dataType: type, | |
| data: data, | |
| success: callback | |
| }); | |
| }; | |
| }); | |
| jQuery._evalUrl = function( url ) { | |
| return jQuery.ajax({ | |
| url: url, | |
| type: "GET", | |
| dataType: "script", | |
| async: false, | |
| global: false, | |
| "throws": true | |
| }); | |
| }; | |
| jQuery.fn.extend({ | |
| wrapAll: function( html ) { | |
| var wrap; | |
| if ( jQuery.isFunction( html ) ) { | |
| return this.each(function( i ) { | |
| jQuery( this ).wrapAll( html.call(this, i) ); | |
| }); | |
| } | |
| if ( this[ 0 ] ) { | |
| // The elements to wrap the target around | |
| wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); | |
| if ( this[ 0 ].parentNode ) { | |
| wrap.insertBefore( this[ 0 ] ); | |
| } | |
| wrap.map(function() { | |
| var elem = this; | |
| while ( elem.firstElementChild ) { | |
| elem = elem.firstElementChild; | |
| } | |
| return elem; | |
| }).append( this ); | |
| } | |
| return this; | |
| }, | |
| wrapInner: function( html ) { | |
| if ( jQuery.isFunction( html ) ) { | |
| return this.each(function( i ) { | |
| jQuery( this ).wrapInner( html.call(this, i) ); | |
| }); | |
| } | |
| return this.each(function() { | |
| var self = jQuery( this ), | |
| contents = self.contents(); | |
| if ( contents.length ) { | |
| contents.wrapAll( html ); | |
| } else { | |
| self.append( html ); | |
| } | |
| }); | |
| }, | |
| wrap: function( html ) { | |
| var isFunction = jQuery.isFunction( html ); | |
| return this.each(function( i ) { | |
| jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); | |
| }); | |
| }, | |
| unwrap: function() { | |
| return this.parent().each(function() { | |
| if ( !jQuery.nodeName( this, "body" ) ) { | |
| jQuery( this ).replaceWith( this.childNodes ); | |
| } | |
| }).end(); | |
| } | |
| }); | |
| jQuery.expr.filters.hidden = function( elem ) { | |
| // Support: Opera <= 12.12 | |
| // Opera reports offsetWidths and offsetHeights less than zero on some elements | |
| return elem.offsetWidth <= 0 && elem.offsetHeight <= 0; | |
| }; | |
| jQuery.expr.filters.visible = function( elem ) { | |
| return !jQuery.expr.filters.hidden( elem ); | |
| }; | |
| var r20 = /%20/g, | |
| rbracket = /\[\]$/, | |
| rCRLF = /\r?\n/g, | |
| rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, | |
| rsubmittable = /^(?:input|select|textarea|keygen)/i; | |
| function buildParams( prefix, obj, traditional, add ) { | |
| var name; | |
| if ( jQuery.isArray( obj ) ) { | |
| // Serialize array item. | |
| jQuery.each( obj, function( i, v ) { | |
| if ( traditional || rbracket.test( prefix ) ) { | |
| // Treat each array item as a scalar. | |
| add( prefix, v ); | |
| } else { | |
| // Item is non-scalar (array or object), encode its numeric index. | |
| buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add ); | |
| } | |
| }); | |
| } else if ( !traditional && jQuery.type( obj ) === "object" ) { | |
| // Serialize object item. | |
| for ( name in obj ) { | |
| buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); | |
| } | |
| } else { | |
| // Serialize scalar item. | |
| add( prefix, obj ); | |
| } | |
| } | |
| // Serialize an array of form elements or a set of | |
| // key/values into a query string | |
| jQuery.param = function( a, traditional ) { | |
| var prefix, | |
| s = [], | |
| add = function( key, value ) { | |
| // If value is a function, invoke it and return its value | |
| value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); | |
| s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); | |
| }; | |
| // Set traditional to true for jQuery <= 1.3.2 behavior. | |
| if ( traditional === undefined ) { | |
| traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; | |
| } | |
| // If an array was passed in, assume that it is an array of form elements. | |
| if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { | |
| // Serialize the form elements | |
| jQuery.each( a, function() { | |
| add( this.name, this.value ); | |
| }); | |
| } else { | |
| // If traditional, encode the "old" way (the way 1.3.2 or older | |
| // did it), otherwise encode params recursively. | |
| for ( prefix in a ) { | |
| buildParams( prefix, a[ prefix ], traditional, add ); | |
| } | |
| } | |
| // Return the resulting serialization | |
| return s.join( "&" ).replace( r20, "+" ); | |
| }; | |
| jQuery.fn.extend({ | |
| serialize: function() { | |
| return jQuery.param( this.serializeArray() ); | |
| }, | |
| serializeArray: function() { | |
| return this.map(function() { | |
| // Can add propHook for "elements" to filter or add form elements | |
| var elements = jQuery.prop( this, "elements" ); | |
| return elements ? jQuery.makeArray( elements ) : this; | |
| }) | |
| .filter(function() { | |
| var type = this.type; | |
| // Use .is( ":disabled" ) so that fieldset[disabled] works | |
| return this.name && !jQuery( this ).is( ":disabled" ) && | |
| rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && | |
| ( this.checked || !rcheckableType.test( type ) ); | |
| }) | |
| .map(function( i, elem ) { | |
| var val = jQuery( this ).val(); | |
| return val == null ? | |
| null : | |
| jQuery.isArray( val ) ? | |
| jQuery.map( val, function( val ) { | |
| return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; | |
| }) : | |
| { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; | |
| }).get(); | |
| } | |
| }); | |
| jQuery.ajaxSettings.xhr = function() { | |
| try { | |
| return new XMLHttpRequest(); | |
| } catch( e ) {} | |
| }; | |
| var xhrId = 0, | |
| xhrCallbacks = {}, | |
| xhrSuccessStatus = { | |
| // file protocol always yields status code 0, assume 200 | |
| 0: 200, | |
| // Support: IE9 | |
| // #1450: sometimes IE returns 1223 when it should be 204 | |
| 1223: 204 | |
| }, | |
| xhrSupported = jQuery.ajaxSettings.xhr(); | |
| // Support: IE9 | |
| // Open requests must be manually aborted on unload (#5280) | |
| // See https://support.microsoft.com/kb/2856746 for more info | |
| if ( window.attachEvent ) { | |
| window.attachEvent( "onunload", function() { | |
| for ( var key in xhrCallbacks ) { | |
| xhrCallbacks[ key ](); | |
| } | |
| }); | |
| } | |
| support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); | |
| support.ajax = xhrSupported = !!xhrSupported; | |
| jQuery.ajaxTransport(function( options ) { | |
| var callback; | |
| // Cross domain only allowed if supported through XMLHttpRequest | |
| if ( support.cors || xhrSupported && !options.crossDomain ) { | |
| return { | |
| send: function( headers, complete ) { | |
| var i, | |
| xhr = options.xhr(), | |
| id = ++xhrId; | |
| xhr.open( options.type, options.url, options.async, options.username, options.password ); | |
| // Apply custom fields if provided | |
| if ( options.xhrFields ) { | |
| for ( i in options.xhrFields ) { | |
| xhr[ i ] = options.xhrFields[ i ]; | |
| } | |
| } | |
| // Override mime type if needed | |
| if ( options.mimeType && xhr.overrideMimeType ) { | |
| xhr.overrideMimeType( options.mimeType ); | |
| } | |
| // X-Requested-With header | |
| // For cross-domain requests, seeing as conditions for a preflight are | |
| // akin to a jigsaw puzzle, we simply never set it to be sure. | |
| // (it can always be set on a per-request basis or even using ajaxSetup) | |
| // For same-domain requests, won't change header if already provided. | |
| if ( !options.crossDomain && !headers["X-Requested-With"] ) { | |
| headers["X-Requested-With"] = "XMLHttpRequest"; | |
| } | |
| // Set headers | |
| for ( i in headers ) { | |
| xhr.setRequestHeader( i, headers[ i ] ); | |
| } | |
| // Callback | |
| callback = function( type ) { | |
| return function() { | |
| if ( callback ) { | |
| delete xhrCallbacks[ id ]; | |
| callback = xhr.onload = xhr.onerror = null; | |
| if ( type === "abort" ) { | |
| xhr.abort(); | |
| } else if ( type === "error" ) { | |
| complete( | |
| // file: protocol always yields status 0; see #8605, #14207 | |
| xhr.status, | |
| xhr.statusText | |
| ); | |
| } else { | |
| complete( | |
| xhrSuccessStatus[ xhr.status ] || xhr.status, | |
| xhr.statusText, | |
| // Support: IE9 | |
| // Accessing binary-data responseText throws an exception | |
| // (#11426) | |
| typeof xhr.responseText === "string" ? { | |
| text: xhr.responseText | |
| } : undefined, | |
| xhr.getAllResponseHeaders() | |
| ); | |
| } | |
| } | |
| }; | |
| }; | |
| // Listen to events | |
| xhr.onload = callback(); | |
| xhr.onerror = callback("error"); | |
| // Create the abort callback | |
| callback = xhrCallbacks[ id ] = callback("abort"); | |
| try { | |
| // Do send the request (this may raise an exception) | |
| xhr.send( options.hasContent && options.data || null ); | |
| } catch ( e ) { | |
| // #14683: Only rethrow if this hasn't been notified as an error yet | |
| if ( callback ) { | |
| throw e; | |
| } | |
| } | |
| }, | |
| abort: function() { | |
| if ( callback ) { | |
| callback(); | |
| } | |
| } | |
| }; | |
| } | |
| }); | |
| // Install script dataType | |
| jQuery.ajaxSetup({ | |
| accepts: { | |
| script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" | |
| }, | |
| contents: { | |
| script: /(?:java|ecma)script/ | |
| }, | |
| converters: { | |
| "text script": function( text ) { | |
| jQuery.globalEval( text ); | |
| return text; | |
| } | |
| } | |
| }); | |
| // Handle cache's special case and crossDomain | |
| jQuery.ajaxPrefilter( "script", function( s ) { | |
| if ( s.cache === undefined ) { | |
| s.cache = false; | |
| } | |
| if ( s.crossDomain ) { | |
| s.type = "GET"; | |
| } | |
| }); | |
| // Bind script tag hack transport | |
| jQuery.ajaxTransport( "script", function( s ) { | |
| // This transport only deals with cross domain requests | |
| if ( s.crossDomain ) { | |
| var script, callback; | |
| return { | |
| send: function( _, complete ) { | |
| script = jQuery("<script>").prop({ | |
| async: true, | |
| charset: s.scriptCharset, | |
| src: s.url | |
| }).on( | |
| "load error", | |
| callback = function( evt ) { | |
| script.remove(); | |
| callback = null; | |
| if ( evt ) { | |
| complete( evt.type === "error" ? 404 : 200, evt.type ); | |
| } | |
| } | |
| ); | |
| document.head.appendChild( script[ 0 ] ); | |
| }, | |
| abort: function() { | |
| if ( callback ) { | |
| callback(); | |
| } | |
| } | |
| }; | |
| } | |
| }); | |
| var oldCallbacks = [], | |
| rjsonp = /(=)\?(?=&|$)|\?\?/; | |
| // Default jsonp settings | |
| jQuery.ajaxSetup({ | |
| jsonp: "callback", | |
| jsonpCallback: function() { | |
| var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); | |
| this[ callback ] = true; | |
| return callback; | |
| } | |
| }); | |
| // Detect, normalize options and install callbacks for jsonp requests | |
| jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { | |
| var callbackName, overwritten, responseContainer, | |
| jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? | |
| "url" : | |
| typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data" | |
| ); | |
| // Handle iff the expected data type is "jsonp" or we have a parameter to set | |
| if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { | |
| // Get callback name, remembering preexisting value associated with it | |
| callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? | |
| s.jsonpCallback() : | |
| s.jsonpCallback; | |
| // Insert callback into url or form data | |
| if ( jsonProp ) { | |
| s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); | |
| } else if ( s.jsonp !== false ) { | |
| s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; | |
| } | |
| // Use data converter to retrieve json after script execution | |
| s.converters["script json"] = function() { | |
| if ( !responseContainer ) { | |
| jQuery.error( callbackName + " was not called" ); | |
| } | |
| return responseContainer[ 0 ]; | |
| }; | |
| // force json dataType | |
| s.dataTypes[ 0 ] = "json"; | |
| // Install callback | |
| overwritten = window[ callbackName ]; | |
| window[ callbackName ] = function() { | |
| responseContainer = arguments; | |
| }; | |
| // Clean-up function (fires after converters) | |
| jqXHR.always(function() { | |
| // Restore preexisting value | |
| window[ callbackName ] = overwritten; | |
| // Save back as free | |
| if ( s[ callbackName ] ) { | |
| // make sure that re-using the options doesn't screw things around | |
| s.jsonpCallback = originalSettings.jsonpCallback; | |
| // save the callback name for future use | |
| oldCallbacks.push( callbackName ); | |
| } | |
| // Call if it was a function and we have a response | |
| if ( responseContainer && jQuery.isFunction( overwritten ) ) { | |
| overwritten( responseContainer[ 0 ] ); | |
| } | |
| responseContainer = overwritten = undefined; | |
| }); | |
| // Delegate to script | |
| return "script"; | |
| } | |
| }); | |
| // data: string of html | |
| // context (optional): If specified, the fragment will be created in this context, defaults to document | |
| // keepScripts (optional): If true, will include scripts passed in the html string | |
| jQuery.parseHTML = function( data, context, keepScripts ) { | |
| if ( !data || typeof data !== "string" ) { | |
| return null; | |
| } | |
| if ( typeof context === "boolean" ) { | |
| keepScripts = context; | |
| context = false; | |
| } | |
| context = context || document; | |
| var parsed = rsingleTag.exec( data ), | |
| scripts = !keepScripts && []; | |
| // Single tag | |
| if ( parsed ) { | |
| return [ context.createElement( parsed[1] ) ]; | |
| } | |
| parsed = jQuery.buildFragment( [ data ], context, scripts ); | |
| if ( scripts && scripts.length ) { | |
| jQuery( scripts ).remove(); | |
| } | |
| return jQuery.merge( [], parsed.childNodes ); | |
| }; | |
| // Keep a copy of the old load method | |
| var _load = jQuery.fn.load; | |
| /** | |
| * Load a url into a page | |
| */ | |
| jQuery.fn.load = function( url, params, callback ) { | |
| if ( typeof url !== "string" && _load ) { | |
| return _load.apply( this, arguments ); | |
| } | |
| var selector, type, response, | |
| self = this, | |
| off = url.indexOf(" "); | |
| if ( off >= 0 ) { | |
| selector = jQuery.trim( url.slice( off ) ); | |
| url = url.slice( 0, off ); | |
| } | |
| // If it's a function | |
| if ( jQuery.isFunction( params ) ) { | |
| // We assume that it's the callback | |
| callback = params; | |
| params = undefined; | |
| // Otherwise, build a param string | |
| } else if ( params && typeof params === "object" ) { | |
| type = "POST"; | |
| } | |
| // If we have elements to modify, make the request | |
| if ( self.length > 0 ) { | |
| jQuery.ajax({ | |
| url: url, | |
| // if "type" variable is undefined, then "GET" method will be used | |
| type: type, | |
| dataType: "html", | |
| data: params | |
| }).done(function( responseText ) { | |
| // Save response for use in complete callback | |
| response = arguments; | |
| self.html( selector ? | |
| // If a selector was specified, locate the right elements in a dummy div | |
| // Exclude scripts to avoid IE 'Permission Denied' errors | |
| jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) : | |
| // Otherwise use the full result | |
| responseText ); | |
| }).complete( callback && function( jqXHR, status ) { | |
| self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] ); | |
| }); | |
| } | |
| return this; | |
| }; | |
| // Attach a bunch of functions for handling common AJAX events | |
| jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) { | |
| jQuery.fn[ type ] = function( fn ) { | |
| return this.on( type, fn ); | |
| }; | |
| }); | |
| jQuery.expr.filters.animated = function( elem ) { | |
| return jQuery.grep(jQuery.timers, function( fn ) { | |
| return elem === fn.elem; | |
| }).length; | |
| }; | |
| var docElem = window.document.documentElement; | |
| /** | |
| * Gets a window from an element | |
| */ | |
| function getWindow( elem ) { | |
| return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView; | |
| } | |
| jQuery.offset = { | |
| setOffset: function( elem, options, i ) { | |
| var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, | |
| position = jQuery.css( elem, "position" ), | |
| curElem = jQuery( elem ), | |
| props = {}; | |
| // Set position first, in-case top/left are set even on static elem | |
| if ( position === "static" ) { | |
| elem.style.position = "relative"; | |
| } | |
| curOffset = curElem.offset(); | |
| curCSSTop = jQuery.css( elem, "top" ); | |
| curCSSLeft = jQuery.css( elem, "left" ); | |
| calculatePosition = ( position === "absolute" || position === "fixed" ) && | |
| ( curCSSTop + curCSSLeft ).indexOf("auto") > -1; | |
| // Need to be able to calculate position if either | |
| // top or left is auto and position is either absolute or fixed | |
| if ( calculatePosition ) { | |
| curPosition = curElem.position(); | |
| curTop = curPosition.top; | |
| curLeft = curPosition.left; | |
| } else { | |
| curTop = parseFloat( curCSSTop ) || 0; | |
| curLeft = parseFloat( curCSSLeft ) || 0; | |
| } | |
| if ( jQuery.isFunction( options ) ) { | |
| options = options.call( elem, i, curOffset ); | |
| } | |
| if ( options.top != null ) { | |
| props.top = ( options.top - curOffset.top ) + curTop; | |
| } | |
| if ( options.left != null ) { | |
| props.left = ( options.left - curOffset.left ) + curLeft; | |
| } | |
| if ( "using" in options ) { | |
| options.using.call( elem, props ); | |
| } else { | |
| curElem.css( props ); | |
| } | |
| } | |
| }; | |
| jQuery.fn.extend({ | |
| offset: function( options ) { | |
| if ( arguments.length ) { | |
| return options === undefined ? | |
| this : | |
| this.each(function( i ) { | |
| jQuery.offset.setOffset( this, options, i ); | |
| }); | |
| } | |
| var docElem, win, | |
| elem = this[ 0 ], | |
| box = { top: 0, left: 0 }, | |
| doc = elem && elem.ownerDocument; | |
| if ( !doc ) { | |
| return; | |
| } | |
| docElem = doc.documentElement; | |
| // Make sure it's not a disconnected DOM node | |
| if ( !jQuery.contains( docElem, elem ) ) { | |
| return box; | |
| } | |
| // Support: BlackBerry 5, iOS 3 (original iPhone) | |
| // If we don't have gBCR, just use 0,0 rather than error | |
| if ( typeof elem.getBoundingClientRect !== strundefined ) { | |
| box = elem.getBoundingClientRect(); | |
| } | |
| win = getWindow( doc ); | |
| return { | |
| top: box.top + win.pageYOffset - docElem.clientTop, | |
| left: box.left + win.pageXOffset - docElem.clientLeft | |
| }; | |
| }, | |
| position: function() { | |
| if ( !this[ 0 ] ) { | |
| return; | |
| } | |
| var offsetParent, offset, | |
| elem = this[ 0 ], | |
| parentOffset = { top: 0, left: 0 }; | |
| // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent | |
| if ( jQuery.css( elem, "position" ) === "fixed" ) { | |
| // Assume getBoundingClientRect is there when computed position is fixed | |
| offset = elem.getBoundingClientRect(); | |
| } else { | |
| // Get *real* offsetParent | |
| offsetParent = this.offsetParent(); | |
| // Get correct offsets | |
| offset = this.offset(); | |
| if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) { | |
| parentOffset = offsetParent.offset(); | |
| } | |
| // Add offsetParent borders | |
| parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ); | |
| parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ); | |
| } | |
| // Subtract parent offsets and element margins | |
| return { | |
| top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), | |
| left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) | |
| }; | |
| }, | |
| offsetParent: function() { | |
| return this.map(function() { | |
| var offsetParent = this.offsetParent || docElem; | |
| while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) { | |
| offsetParent = offsetParent.offsetParent; | |
| } | |
| return offsetParent || docElem; | |
| }); | |
| } | |
| }); | |
| // Create scrollLeft and scrollTop methods | |
| jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { | |
| var top = "pageYOffset" === prop; | |
| jQuery.fn[ method ] = function( val ) { | |
| return access( this, function( elem, method, val ) { | |
| var win = getWindow( elem ); | |
| if ( val === undefined ) { | |
| return win ? win[ prop ] : elem[ method ]; | |
| } | |
| if ( win ) { | |
| win.scrollTo( | |
| !top ? val : window.pageXOffset, | |
| top ? val : window.pageYOffset | |
| ); | |
| } else { | |
| elem[ method ] = val; | |
| } | |
| }, method, val, arguments.length, null ); | |
| }; | |
| }); | |
| // Support: Safari<7+, Chrome<37+ | |
| // Add the top/left cssHooks using jQuery.fn.position | |
| // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 | |
| // Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280 | |
| // getComputedStyle returns percent when specified for top/left/bottom/right; | |
| // rather than make the css module depend on the offset module, just check for it here | |
| jQuery.each( [ "top", "left" ], function( i, prop ) { | |
| jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, | |
| function( elem, computed ) { | |
| if ( computed ) { | |
| computed = curCSS( elem, prop ); | |
| // If curCSS returns percentage, fallback to offset | |
| return rnumnonpx.test( computed ) ? | |
| jQuery( elem ).position()[ prop ] + "px" : | |
| computed; | |
| } | |
| } | |
| ); | |
| }); | |
| // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods | |
| jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { | |
| jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) { | |
| // Margin is only for outerHeight, outerWidth | |
| jQuery.fn[ funcName ] = function( margin, value ) { | |
| var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), | |
| extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); | |
| return access( this, function( elem, type, value ) { | |
| var doc; | |
| if ( jQuery.isWindow( elem ) ) { | |
| // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there | |
| // isn't a whole lot we can do. See pull request at this URL for discussion: | |
| // https://github.com/jquery/jquery/pull/764 | |
| return elem.document.documentElement[ "client" + name ]; | |
| } | |
| // Get document width or height | |
| if ( elem.nodeType === 9 ) { | |
| doc = elem.documentElement; | |
| // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], | |
| // whichever is greatest | |
| return Math.max( | |
| elem.body[ "scroll" + name ], doc[ "scroll" + name ], | |
| elem.body[ "offset" + name ], doc[ "offset" + name ], | |
| doc[ "client" + name ] | |
| ); | |
| } | |
| return value === undefined ? | |
| // Get width or height on the element, requesting but not forcing parseFloat | |
| jQuery.css( elem, type, extra ) : | |
| // Set width or height on the element | |
| jQuery.style( elem, type, value, extra ); | |
| }, type, chainable ? margin : undefined, chainable, null ); | |
| }; | |
| }); | |
| }); | |
| // The number of elements contained in the matched element set | |
| jQuery.fn.size = function() { | |
| return this.length; | |
| }; | |
| jQuery.fn.andSelf = jQuery.fn.addBack; | |
| // Register as a named AMD module, since jQuery can be concatenated with other | |
| // files that may use define, but not via a proper concatenation script that | |
| // understands anonymous AMD modules. A named AMD is safest and most robust | |
| // way to register. Lowercase jquery is used because AMD module names are | |
| // derived from file names, and jQuery is normally delivered in a lowercase | |
| // file name. Do this after creating the global so that if an AMD module wants | |
| // to call noConflict to hide this version of jQuery, it will work. | |
| // Note that for maximum portability, libraries that are not jQuery should | |
| // declare themselves as anonymous modules, and avoid setting a global if an | |
| // AMD loader is present. jQuery is a special case. For more information, see | |
| // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon | |
| if ( typeof define === "function" && define.amd ) { | |
| define( "jquery", [], function() { | |
| return jQuery; | |
| }); | |
| } | |
| var | |
| // Map over jQuery in case of overwrite | |
| _jQuery = window.jQuery, | |
| // Map over the $ in case of overwrite | |
| _$ = window.$; | |
| jQuery.noConflict = function( deep ) { | |
| if ( window.$ === jQuery ) { | |
| window.$ = _$; | |
| } | |
| if ( deep && window.jQuery === jQuery ) { | |
| window.jQuery = _jQuery; | |
| } | |
| return jQuery; | |
| }; | |
| // Expose jQuery and $ identifiers, even in AMD | |
| // (#7102#comment:10, https://github.com/jquery/jquery/pull/557) | |
| // and CommonJS for browser emulators (#13566) | |
| if ( typeof noGlobal === strundefined ) { | |
| window.jQuery = window.$ = jQuery; | |
| } | |
| return jQuery; | |
| })); | |
| ;(function(root, factory) { | |
| if (typeof define === 'function' && define.amd) { | |
| define([], function() { | |
| return (factory()); | |
| }); | |
| } else if (typeof exports === 'object') { | |
| module.exports = factory(); | |
| } else { | |
| root.whatInput = factory(); | |
| } | |
| } (this, function() { | |
| 'use strict'; | |
| /* | |
| --------------- | |
| variables | |
| --------------- | |
| */ | |
| // array of actively pressed keys | |
| var activeKeys = []; | |
| // cache document.body | |
| var body = document.body; | |
| // boolean: true if touch buffer timer is running | |
| var buffer = false; | |
| // the last used input type | |
| var currentInput = null; | |
| // array of form elements that take keyboard input | |
| var formInputs = [ | |
| 'input', | |
| 'select', | |
| 'textarea' | |
| ]; | |
| // user-set flag to allow typing in form fields to be recorded | |
| var formTyping = body.hasAttribute('data-whatinput-formtyping'); | |
| // mapping of events to input types | |
| var inputMap = { | |
| 'keydown': 'keyboard', | |
| 'mousedown': 'mouse', | |
| 'mouseenter': 'mouse', | |
| 'touchstart': 'touch', | |
| 'pointerdown': 'pointer', | |
| 'MSPointerDown': 'pointer' | |
| }; | |
| // array of all used input types | |
| var inputTypes = []; | |
| // mapping of key codes to common name | |
| var keyMap = { | |
| 9: 'tab', | |
| 13: 'enter', | |
| 16: 'shift', | |
| 27: 'esc', | |
| 32: 'space', | |
| 37: 'left', | |
| 38: 'up', | |
| 39: 'right', | |
| 40: 'down' | |
| }; | |
| // map of IE 10 pointer events | |
| var pointerMap = { | |
| 2: 'touch', | |
| 3: 'touch', // treat pen like touch | |
| 4: 'mouse' | |
| }; | |
| // touch buffer timer | |
| var timer; | |
| /* | |
| --------------- | |
| functions | |
| --------------- | |
| */ | |
| function bufferInput(event) { | |
| clearTimeout(timer); | |
| setInput(event); | |
| buffer = true; | |
| timer = setTimeout(function() { | |
| buffer = false; | |
| }, 1000); | |
| } | |
| function immediateInput(event) { | |
| if (!buffer) setInput(event); | |
| } | |
| function setInput(event) { | |
| var eventKey = key(event); | |
| var eventTarget = target(event); | |
| var value = inputMap[event.type]; | |
| if (value === 'pointer') value = pointerType(event); | |
| if (currentInput !== value) { | |
| if ( | |
| // only if the user flag isn't set | |
| !formTyping && | |
| // only if currentInput has a value | |
| currentInput && | |
| // only if the input is `keyboard` | |
| value === 'keyboard' && | |
| // not if the key is `TAB` | |
| keyMap[eventKey] !== 'tab' && | |
| // only if the target is one of the elements in `formInputs` | |
| formInputs.indexOf(eventTarget.nodeName.toLowerCase()) >= 0 | |
| ) { | |
| // ignore keyboard typing on form elements | |
| } else { | |
| currentInput = value; | |
| body.setAttribute('data-whatinput', currentInput); | |
| if (inputTypes.indexOf(currentInput) === -1) inputTypes.push(currentInput); | |
| } | |
| } | |
| if (value === 'keyboard') logKeys(eventKey); | |
| } | |
| function key(event) { | |
| return (event.keyCode) ? event.keyCode : event.which; | |
| } | |
| function target(event) { | |
| return event.target || event.srcElement; | |
| } | |
| function pointerType(event) { | |
| return (typeof event.pointerType === 'number') ? pointerMap[event.pointerType] : event.pointerType; | |
| } | |
| // keyboard logging | |
| function logKeys(eventKey) { | |
| if (activeKeys.indexOf(keyMap[eventKey]) === -1 && keyMap[eventKey]) activeKeys.push(keyMap[eventKey]); | |
| } | |
| function unLogKeys(event) { | |
| var eventKey = key(event); | |
| var arrayPos = activeKeys.indexOf(keyMap[eventKey]); | |
| if (arrayPos !== -1) activeKeys.splice(arrayPos, 1); | |
| } | |
| function bindEvents() { | |
| // pointer/mouse | |
| var mouseEvent = 'mousedown'; | |
| if (window.PointerEvent) { | |
| mouseEvent = 'pointerdown'; | |
| } else if (window.MSPointerEvent) { | |
| mouseEvent = 'MSPointerDown'; | |
| } | |
| body.addEventListener(mouseEvent, immediateInput); | |
| body.addEventListener('mouseenter', immediateInput); | |
| // touch | |
| if ('ontouchstart' in window) { | |
| body.addEventListener('touchstart', bufferInput); | |
| } | |
| // keyboard | |
| body.addEventListener('keydown', immediateInput); | |
| document.addEventListener('keyup', unLogKeys); | |
| } | |
| /* | |
| --------------- | |
| init | |
| don't start script unless browser cuts the mustard, | |
| also passes if polyfills are used | |
| --------------- | |
| */ | |
| if ('addEventListener' in window && Array.prototype.indexOf) { | |
| bindEvents(); | |
| } | |
| /* | |
| --------------- | |
| api | |
| --------------- | |
| */ | |
| return { | |
| // returns string: the current input type | |
| ask: function() { return currentInput; }, | |
| // returns array: currently pressed keys | |
| keys: function() { return activeKeys; }, | |
| // returns array: all the detected input types | |
| types: function() { return inputTypes; }, | |
| // accepts string: manually set the input type | |
| set: setInput | |
| }; | |
| })); | |
| !function($) { | |
| "use strict"; | |
| var FOUNDATION_VERSION = '6.1.2'; | |
| // Global Foundation object | |
| // This is attached to the window, or used as a module for AMD/Browserify | |
| var Foundation = { | |
| version: FOUNDATION_VERSION, | |
| /** | |
| * Stores initialized plugins. | |
| */ | |
| _plugins: {}, | |
| /** | |
| * Stores generated unique ids for plugin instances | |
| */ | |
| _uuids: [], | |
| /** | |
| * Returns a boolean for RTL support | |
| */ | |
| rtl: function(){ | |
| return $('html').attr('dir') === 'rtl'; | |
| }, | |
| /** | |
| * Defines a Foundation plugin, adding it to the `Foundation` namespace and the list of plugins to initialize when reflowing. | |
| * @param {Object} plugin - The constructor of the plugin. | |
| */ | |
| plugin: function(plugin, name) { | |
| // Object key to use when adding to global Foundation object | |
| // Examples: Foundation.Reveal, Foundation.OffCanvas | |
| var className = (name || functionName(plugin)); | |
| // Object key to use when storing the plugin, also used to create the identifying data attribute for the plugin | |
| // Examples: data-reveal, data-off-canvas | |
| var attrName = hyphenate(className); | |
| // Add to the Foundation object and the plugins list (for reflowing) | |
| this._plugins[attrName] = this[className] = plugin; | |
| }, | |
| /** | |
| * @function | |
| * Populates the _uuids array with pointers to each individual plugin instance. | |
| * Adds the `zfPlugin` data-attribute to programmatically created plugins to allow use of $(selector).foundation(method) calls. | |
| * Also fires the initialization event for each plugin, consolidating repeditive code. | |
| * @param {Object} plugin - an instance of a plugin, usually `this` in context. | |
| * @param {String} name - the name of the plugin, passed as a camelCased string. | |
| * @fires Plugin#init | |
| */ | |
| registerPlugin: function(plugin, name){ | |
| var pluginName = name ? hyphenate(name) : functionName(plugin.constructor).toLowerCase(); | |
| plugin.uuid = this.GetYoDigits(6, pluginName); | |
| if(!plugin.$element.attr('data-' + pluginName)){ plugin.$element.attr('data-' + pluginName, plugin.uuid); } | |
| if(!plugin.$element.data('zfPlugin')){ plugin.$element.data('zfPlugin', plugin); } | |
| /** | |
| * Fires when the plugin has initialized. | |
| * @event Plugin#init | |
| */ | |
| plugin.$element.trigger('init.zf.' + pluginName); | |
| this._uuids.push(plugin.uuid); | |
| return; | |
| }, | |
| /** | |
| * @function | |
| * Removes the plugins uuid from the _uuids array. | |
| * Removes the zfPlugin data attribute, as well as the data-plugin-name attribute. | |
| * Also fires the destroyed event for the plugin, consolidating repeditive code. | |
| * @param {Object} plugin - an instance of a plugin, usually `this` in context. | |
| * @fires Plugin#destroyed | |
| */ | |
| unregisterPlugin: function(plugin){ | |
| var pluginName = hyphenate(functionName(plugin.$element.data('zfPlugin').constructor)); | |
| this._uuids.splice(this._uuids.indexOf(plugin.uuid), 1); | |
| plugin.$element.removeAttr('data-' + pluginName).removeData('zfPlugin') | |
| /** | |
| * Fires when the plugin has been destroyed. | |
| * @event Plugin#destroyed | |
| */ | |
| .trigger('destroyed.zf.' + pluginName); | |
| for(var prop in plugin){ | |
| plugin[prop] = null;//clean up script to prep for garbage collection. | |
| } | |
| return; | |
| }, | |
| /** | |
| * @function | |
| * Causes one or more active plugins to re-initialize, resetting event listeners, recalculating positions, etc. | |
| * @param {String} plugins - optional string of an individual plugin key, attained by calling `$(element).data('pluginName')`, or string of a plugin class i.e. `'dropdown'` | |
| * @default If no argument is passed, reflow all currently active plugins. | |
| */ | |
| reInit: function(plugins){ | |
| var isJQ = plugins instanceof $; | |
| try{ | |
| if(isJQ){ | |
| plugins.each(function(){ | |
| $(this).data('zfPlugin')._init(); | |
| }); | |
| }else{ | |
| var type = typeof plugins, | |
| _this = this, | |
| fns = { | |
| 'object': function(plgs){ | |
| plgs.forEach(function(p){ | |
| $('[data-'+ p +']').foundation('_init'); | |
| }); | |
| }, | |
| 'string': function(){ | |
| $('[data-'+ plugins +']').foundation('_init'); | |
| }, | |
| 'undefined': function(){ | |
| this['object'](Object.keys(_this._plugins)); | |
| } | |
| }; | |
| fns[type](plugins); | |
| } | |
| }catch(err){ | |
| console.error(err); | |
| }finally{ | |
| return plugins; | |
| } | |
| }, | |
| /** | |
| * returns a random base-36 uid with namespacing | |
| * @function | |
| * @param {Number} length - number of random base-36 digits desired. Increase for more random strings. | |
| * @param {String} namespace - name of plugin to be incorporated in uid, optional. | |
| * @default {String} '' - if no plugin name is provided, nothing is appended to the uid. | |
| * @returns {String} - unique id | |
| */ | |
| GetYoDigits: function(length, namespace){ | |
| length = length || 6; | |
| return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1) + (namespace ? '-' + namespace : ''); | |
| }, | |
| /** | |
| * Initialize plugins on any elements within `elem` (and `elem` itself) that aren't already initialized. | |
| * @param {Object} elem - jQuery object containing the element to check inside. Also checks the element itself, unless it's the `document` object. | |
| * @param {String|Array} plugins - A list of plugins to initialize. Leave this out to initialize everything. | |
| */ | |
| reflow: function(elem, plugins) { | |
| // If plugins is undefined, just grab everything | |
| if (typeof plugins === 'undefined') { | |
| plugins = Object.keys(this._plugins); | |
| } | |
| // If plugins is a string, convert it to an array with one item | |
| else if (typeof plugins === 'string') { | |
| plugins = [plugins]; | |
| } | |
| var _this = this; | |
| // Iterate through each plugin | |
| $.each(plugins, function(i, name) { | |
| // Get the current plugin | |
| var plugin = _this._plugins[name]; | |
| // Localize the search to all elements inside elem, as well as elem itself, unless elem === document | |
| var $elem = $(elem).find('[data-'+name+']').addBack('[data-'+name+']'); | |
| // For each plugin found, initialize it | |
| $elem.each(function() { | |
| var $el = $(this), | |
| opts = {}; | |
| // Don't double-dip on plugins | |
| if ($el.data('zfPlugin')) { | |
| console.warn("Tried to initialize "+name+" on an element that already has a Foundation plugin."); | |
| return; | |
| } | |
| if($el.attr('data-options')){ | |
| var thing = $el.attr('data-options').split(';').forEach(function(e, i){ | |
| var opt = e.split(':').map(function(el){ return el.trim(); }); | |
| if(opt[0]) opts[opt[0]] = parseValue(opt[1]); | |
| }); | |
| } | |
| try{ | |
| $el.data('zfPlugin', new plugin($(this), opts)); | |
| }catch(er){ | |
| console.error(er); | |
| }finally{ | |
| return; | |
| } | |
| }); | |
| }); | |
| }, | |
| getFnName: functionName, | |
| transitionend: function($elem){ | |
| var transitions = { | |
| 'transition': 'transitionend', | |
| 'WebkitTransition': 'webkitTransitionEnd', | |
| 'MozTransition': 'transitionend', | |
| 'OTransition': 'otransitionend' | |
| }; | |
| var elem = document.createElement('div'), | |
| end; | |
| for (var t in transitions){ | |
| if (typeof elem.style[t] !== 'undefined'){ | |
| end = transitions[t]; | |
| } | |
| } | |
| if(end){ | |
| return end; | |
| }else{ | |
| end = setTimeout(function(){ | |
| $elem.triggerHandler('transitionend', [$elem]); | |
| }, 1); | |
| return 'transitionend'; | |
| } | |
| } | |
| }; | |
| Foundation.util = { | |
| /** | |
| * Function for applying a debounce effect to a function call. | |
| * @function | |
| * @param {Function} func - Function to be called at end of timeout. | |
| * @param {Number} delay - Time in ms to delay the call of `func`. | |
| * @returns function | |
| */ | |
| throttle: function (func, delay) { | |
| var timer = null; | |
| return function () { | |
| var context = this, args = arguments; | |
| if (timer === null) { | |
| timer = setTimeout(function () { | |
| func.apply(context, args); | |
| timer = null; | |
| }, delay); | |
| } | |
| }; | |
| } | |
| }; | |
| // TODO: consider not making this a jQuery function | |
| // TODO: need way to reflow vs. re-initialize | |
| /** | |
| * The Foundation jQuery method. | |
| * @param {String|Array} method - An action to perform on the current jQuery object. | |
| */ | |
| var foundation = function(method) { | |
| var type = typeof method, | |
| $meta = $('meta.foundation-mq'), | |
| $noJS = $('.no-js'); | |
| if(!$meta.length){ | |
| $('<meta class="foundation-mq">').appendTo(document.head); | |
| } | |
| if($noJS.length){ | |
| $noJS.removeClass('no-js'); | |
| } | |
| if(type === 'undefined'){//needs to initialize the Foundation object, or an individual plugin. | |
| Foundation.MediaQuery._init(); | |
| Foundation.reflow(this); | |
| }else if(type === 'string'){//an individual method to invoke on a plugin or group of plugins | |
| var args = Array.prototype.slice.call(arguments, 1);//collect all the arguments, if necessary | |
| var plugClass = this.data('zfPlugin');//determine the class of plugin | |
| if(plugClass !== undefined && plugClass[method] !== undefined){//make sure both the class and method exist | |
| if(this.length === 1){//if there's only one, call it directly. | |
| plugClass[method].apply(plugClass, args); | |
| }else{ | |
| this.each(function(i, el){//otherwise loop through the jQuery collection and invoke the method on each | |
| plugClass[method].apply($(el).data('zfPlugin'), args); | |
| }); | |
| } | |
| }else{//error for no class or no method | |
| throw new ReferenceError("We're sorry, '" + method + "' is not an available method for " + (plugClass ? functionName(plugClass) : 'this element') + '.'); | |
| } | |
| }else{//error for invalid argument type | |
| throw new TypeError("We're sorry, '" + type + "' is not a valid parameter. You must use a string representing the method you wish to invoke."); | |
| } | |
| return this; | |
| }; | |
| window.Foundation = Foundation; | |
| $.fn.foundation = foundation; | |
| // Polyfill for requestAnimationFrame | |
| (function() { | |
| if (!Date.now || !window.Date.now) | |
| window.Date.now = Date.now = function() { return new Date().getTime(); }; | |
| var vendors = ['webkit', 'moz']; | |
| for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) { | |
| var vp = vendors[i]; | |
| window.requestAnimationFrame = window[vp+'RequestAnimationFrame']; | |
| window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame'] | |
| || window[vp+'CancelRequestAnimationFrame']); | |
| } | |
| if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) | |
| || !window.requestAnimationFrame || !window.cancelAnimationFrame) { | |
| var lastTime = 0; | |
| window.requestAnimationFrame = function(callback) { | |
| var now = Date.now(); | |
| var nextTime = Math.max(lastTime + 16, now); | |
| return setTimeout(function() { callback(lastTime = nextTime); }, | |
| nextTime - now); | |
| }; | |
| window.cancelAnimationFrame = clearTimeout; | |
| } | |
| /** | |
| * Polyfill for performance.now, required by rAF | |
| */ | |
| if(!window.performance || !window.performance.now){ | |
| window.performance = { | |
| start: Date.now(), | |
| now: function(){ return Date.now() - this.start; } | |
| }; | |
| } | |
| })(); | |
| if (!Function.prototype.bind) { | |
| Function.prototype.bind = function(oThis) { | |
| if (typeof this !== 'function') { | |
| // closest thing possible to the ECMAScript 5 | |
| // internal IsCallable function | |
| throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); | |
| } | |
| var aArgs = Array.prototype.slice.call(arguments, 1), | |
| fToBind = this, | |
| fNOP = function() {}, | |
| fBound = function() { | |
| return fToBind.apply(this instanceof fNOP | |
| ? this | |
| : oThis, | |
| aArgs.concat(Array.prototype.slice.call(arguments))); | |
| }; | |
| if (this.prototype) { | |
| // native functions don't have a prototype | |
| fNOP.prototype = this.prototype; | |
| } | |
| fBound.prototype = new fNOP(); | |
| return fBound; | |
| }; | |
| } | |
| // Polyfill to get the name of a function in IE9 | |
| function functionName(fn) { | |
| if (Function.prototype.name === undefined) { | |
| var funcNameRegex = /function\s([^(]{1,})\(/; | |
| var results = (funcNameRegex).exec((fn).toString()); | |
| return (results && results.length > 1) ? results[1].trim() : ""; | |
| } | |
| else if (fn.prototype === undefined) { | |
| return fn.constructor.name; | |
| } | |
| else { | |
| return fn.prototype.constructor.name; | |
| } | |
| } | |
| function parseValue(str){ | |
| if(/true/.test(str)) return true; | |
| else if(/false/.test(str)) return false; | |
| else if(!isNaN(str * 1)) return parseFloat(str); | |
| return str; | |
| } | |
| // Convert PascalCase to kebab-case | |
| // Thank you: http://stackoverflow.com/a/8955580 | |
| function hyphenate(str) { | |
| return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); | |
| } | |
| }(jQuery); | |
| !function(Foundation, window){ | |
| /** | |
| * Compares the dimensions of an element to a container and determines collision events with container. | |
| * @function | |
| * @param {jQuery} element - jQuery object to test for collisions. | |
| * @param {jQuery} parent - jQuery object to use as bounding container. | |
| * @param {Boolean} lrOnly - set to true to check left and right values only. | |
| * @param {Boolean} tbOnly - set to true to check top and bottom values only. | |
| * @default if no parent object passed, detects collisions with `window`. | |
| * @returns {Boolean} - true if collision free, false if a collision in any direction. | |
| */ | |
| var ImNotTouchingYou = function(element, parent, lrOnly, tbOnly){ | |
| var eleDims = GetDimensions(element), | |
| top, bottom, left, right; | |
| if(parent){ | |
| var parDims = GetDimensions(parent); | |
| bottom = (eleDims.offset.top + eleDims.height <= parDims.height + parDims.offset.top); | |
| top = (eleDims.offset.top >= parDims.offset.top); | |
| left = (eleDims.offset.left >= parDims.offset.left); | |
| right = (eleDims.offset.left + eleDims.width <= parDims.width); | |
| }else{ | |
| bottom = (eleDims.offset.top + eleDims.height <= eleDims.windowDims.height + eleDims.windowDims.offset.top); | |
| top = (eleDims.offset.top >= eleDims.windowDims.offset.top); | |
| left = (eleDims.offset.left >= eleDims.windowDims.offset.left); | |
| right = (eleDims.offset.left + eleDims.width <= eleDims.windowDims.width); | |
| } | |
| var allDirs = [bottom, top, left, right]; | |
| if(lrOnly){ return left === right === true; } | |
| if(tbOnly){ return top === bottom === true; } | |
| return allDirs.indexOf(false) === -1; | |
| }; | |
| /** | |
| * Uses native methods to return an object of dimension values. | |
| * @function | |
| * @param {jQuery || HTML} element - jQuery object or DOM element for which to get the dimensions. Can be any element other that document or window. | |
| * @returns {Object} - nested object of integer pixel values | |
| * TODO - if element is window, return only those values. | |
| */ | |
| var GetDimensions = function(elem, test){ | |
| elem = elem.length ? elem[0] : elem; | |
| if(elem === window || elem === document){ throw new Error("I'm sorry, Dave. I'm afraid I can't do that."); } | |
| var rect = elem.getBoundingClientRect(), | |
| parRect = elem.parentNode.getBoundingClientRect(), | |
| winRect = document.body.getBoundingClientRect(), | |
| winY = window.pageYOffset, | |
| winX = window.pageXOffset; | |
| return { | |
| width: rect.width, | |
| height: rect.height, | |
| offset: { | |
| top: rect.top + winY, | |
| left: rect.left + winX | |
| }, | |
| parentDims: { | |
| width: parRect.width, | |
| height: parRect.height, | |
| offset: { | |
| top: parRect.top + winY, | |
| left: parRect.left + winX | |
| } | |
| }, | |
| windowDims: { | |
| width: winRect.width, | |
| height: winRect.height, | |
| offset: { | |
| top: winY, | |
| left: winX | |
| } | |
| } | |
| }; | |
| }; | |
| /** | |
| * Returns an object of top and left integer pixel values for dynamically rendered elements, | |
| * such as: Tooltip, Reveal, and Dropdown | |
| * @function | |
| * @param {jQuery} element - jQuery object for the element being positioned. | |
| * @param {jQuery} anchor - jQuery object for the element's anchor point. | |
| * @param {String} position - a string relating to the desired position of the element, relative to it's anchor | |
| * @param {Number} vOffset - integer pixel value of desired vertical separation between anchor and element. | |
| * @param {Number} hOffset - integer pixel value of desired horizontal separation between anchor and element. | |
| * @param {Boolean} isOverflow - if a collision event is detected, sets to true to default the element to full width - any desired offset. | |
| * TODO alter/rewrite to work with `em` values as well/instead of pixels | |
| */ | |
| var GetOffsets = function(element, anchor, position, vOffset, hOffset, isOverflow){ | |
| var $eleDims = GetDimensions(element), | |
| // var $eleDims = GetDimensions(element), | |
| $anchorDims = anchor ? GetDimensions(anchor) : null; | |
| // $anchorDims = anchor ? GetDimensions(anchor) : null; | |
| switch(position){ | |
| case 'top': | |
| return { | |
| left: $anchorDims.offset.left, | |
| top: $anchorDims.offset.top - ($eleDims.height + vOffset) | |
| }; | |
| break; | |
| case 'left': | |
| return { | |
| left: $anchorDims.offset.left - ($eleDims.width + hOffset), | |
| top: $anchorDims.offset.top | |
| }; | |
| break; | |
| case 'right': | |
| return { | |
| left: $anchorDims.offset.left + $anchorDims.width + hOffset, | |
| top: $anchorDims.offset.top | |
| }; | |
| break; | |
| case 'center top': | |
| return { | |
| left: ($anchorDims.offset.left + ($anchorDims.width / 2)) - ($eleDims.width / 2), | |
| top: $anchorDims.offset.top - ($eleDims.height + vOffset) | |
| }; | |
| break; | |
| case 'center bottom': | |
| return { | |
| left: isOverflow ? hOffset : (($anchorDims.offset.left + ($anchorDims.width / 2)) - ($eleDims.width / 2)), | |
| top: $anchorDims.offset.top + $anchorDims.height + vOffset | |
| }; | |
| break; | |
| case 'center left': | |
| return { | |
| left: $anchorDims.offset.left - ($eleDims.width + hOffset), | |
| top: ($anchorDims.offset.top + ($anchorDims.height / 2)) - ($eleDims.height / 2) | |
| }; | |
| break; | |
| case 'center right': | |
| return { | |
| left: $anchorDims.offset.left + $anchorDims.width + hOffset + 1, | |
| top: ($anchorDims.offset.top + ($anchorDims.height / 2)) - ($eleDims.height / 2) | |
| }; | |
| break; | |
| case 'center': | |
| return { | |
| left: ($eleDims.windowDims.offset.left + ($eleDims.windowDims.width / 2)) - ($eleDims.width / 2), | |
| top: ($eleDims.windowDims.offset.top + ($eleDims.windowDims.height / 2)) - ($eleDims.height / 2) | |
| }; | |
| break; | |
| case 'reveal': | |
| return { | |
| left: ($eleDims.windowDims.width - $eleDims.width) / 2, | |
| top: $eleDims.windowDims.offset.top + vOffset | |
| }; | |
| case 'reveal full': | |
| return { | |
| left: $eleDims.windowDims.offset.left, | |
| top: $eleDims.windowDims.offset.top | |
| }; | |
| break; | |
| default: | |
| return { | |
| left: $anchorDims.offset.left, | |
| top: $anchorDims.offset.top + $anchorDims.height + vOffset | |
| }; | |
| } | |
| }; | |
| Foundation.Box = { | |
| ImNotTouchingYou: ImNotTouchingYou, | |
| GetDimensions: GetDimensions, | |
| GetOffsets: GetOffsets | |
| }; | |
| }(window.Foundation, window); | |
| /******************************************* | |
| * * | |
| * This util was created by Marius Olbertz * | |
| * Please thank Marius on GitHub /owlbertz * | |
| * or the web http://www.mariusolbertz.de/ * | |
| * * | |
| ******************************************/ | |
| !function($, Foundation){ | |
| 'use strict'; | |
| Foundation.Keyboard = {}; | |
| var keyCodes = { | |
| 9: 'TAB', | |
| 13: 'ENTER', | |
| 27: 'ESCAPE', | |
| 32: 'SPACE', | |
| 37: 'ARROW_LEFT', | |
| 38: 'ARROW_UP', | |
| 39: 'ARROW_RIGHT', | |
| 40: 'ARROW_DOWN' | |
| }; | |
| /* | |
| * Constants for easier comparing. | |
| * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE | |
| */ | |
| var keys = (function(kcs) { | |
| var k = {}; | |
| for (var kc in kcs) k[kcs[kc]] = kcs[kc]; | |
| return k; | |
| })(keyCodes); | |
| Foundation.Keyboard.keys = keys; | |
| /** | |
| * Parses the (keyboard) event and returns a String that represents its key | |
| * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE | |
| * @param {Event} event - the event generated by the event handler | |
| * @return String key - String that represents the key pressed | |
| */ | |
| var parseKey = function(event) { | |
| var key = keyCodes[event.which || event.keyCode] || String.fromCharCode(event.which).toUpperCase(); | |
| if (event.shiftKey) key = 'SHIFT_' + key; | |
| if (event.ctrlKey) key = 'CTRL_' + key; | |
| if (event.altKey) key = 'ALT_' + key; | |
| return key; | |
| }; | |
| Foundation.Keyboard.parseKey = parseKey; | |
| // plain commands per component go here, ltr and rtl are merged based on orientation | |
| var commands = {}; | |
| /** | |
| * Handles the given (keyboard) event | |
| * @param {Event} event - the event generated by the event handler | |
| * @param {String} component - Foundation component's name, e.g. Slider or Reveal | |
| * @param {Objects} functions - collection of functions that are to be executed | |
| */ | |
| var handleKey = function(event, component, functions) { | |
| var commandList = commands[component], | |
| keyCode = parseKey(event), | |
| cmds, | |
| command, | |
| fn; | |
| if (!commandList) return console.warn('Component not defined!'); | |
| if (typeof commandList.ltr === 'undefined') { // this component does not differentiate between ltr and rtl | |
| cmds = commandList; // use plain list | |
| } else { // merge ltr and rtl: if document is rtl, rtl overwrites ltr and vice versa | |
| if (Foundation.rtl()) cmds = $.extend({}, commandList.ltr, commandList.rtl); | |
| else cmds = $.extend({}, commandList.rtl, commandList.ltr); | |
| } | |
| command = cmds[keyCode]; | |
| fn = functions[command]; | |
| if (fn && typeof fn === 'function') { // execute function if exists | |
| fn.apply(); | |
| if (functions.handled || typeof functions.handled === 'function') { // execute function when event was handled | |
| functions.handled.apply(); | |
| } | |
| } else { | |
| if (functions.unhandled || typeof functions.unhandled === 'function') { // execute function when event was not handled | |
| functions.unhandled.apply(); | |
| } | |
| } | |
| }; | |
| Foundation.Keyboard.handleKey = handleKey; | |
| /** | |
| * Finds all focusable elements within the given `$element` | |
| * @param {jQuery} $element - jQuery object to search within | |
| * @return {jQuery} $focusable - all focusable elements within `$element` | |
| */ | |
| var findFocusable = function($element) { | |
| return $element.find('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]').filter(function() { | |
| if (!$(this).is(':visible') || $(this).attr('tabindex') < 0) { return false; } //only have visible elements and those that have a tabindex greater or equal 0 | |
| return true; | |
| }); | |
| }; | |
| Foundation.Keyboard.findFocusable = findFocusable; | |
| /** | |
| * Returns the component name name | |
| * @param {Object} component - Foundation component, e.g. Slider or Reveal | |
| * @return String componentName | |
| */ | |
| var register = function(componentName, cmds) { | |
| commands[componentName] = cmds; | |
| }; | |
| Foundation.Keyboard.register = register; | |
| }(jQuery, window.Foundation); | |
| !function($, Foundation) { | |
| // Default set of media queries | |
| var defaultQueries = { | |
| 'default' : 'only screen', | |
| landscape : 'only screen and (orientation: landscape)', | |
| portrait : 'only screen and (orientation: portrait)', | |
| retina : 'only screen and (-webkit-min-device-pixel-ratio: 2),' + | |
| 'only screen and (min--moz-device-pixel-ratio: 2),' + | |
| 'only screen and (-o-min-device-pixel-ratio: 2/1),' + | |
| 'only screen and (min-device-pixel-ratio: 2),' + | |
| 'only screen and (min-resolution: 192dpi),' + | |
| 'only screen and (min-resolution: 2dppx)' | |
| }; | |
| var MediaQuery = { | |
| queries: [], | |
| current: '', | |
| /** | |
| * Checks if the screen is at least as wide as a breakpoint. | |
| * @function | |
| * @param {String} size - Name of the breakpoint to check. | |
| * @returns {Boolean} `true` if the breakpoint matches, `false` if it's smaller. | |
| */ | |
| atLeast: function(size) { | |
| var query = this.get(size); | |
| if (query) { | |
| return window.matchMedia(query).matches; | |
| } | |
| return false; | |
| }, | |
| /** | |
| * Gets the media query of a breakpoint. | |
| * @function | |
| * @param {String} size - Name of the breakpoint to get. | |
| * @returns {String|null} - The media query of the breakpoint, or `null` if the breakpoint doesn't exist. | |
| */ | |
| get: function(size) { | |
| for (var i in this.queries) { | |
| var query = this.queries[i]; | |
| if (size === query.name) return query.value; | |
| } | |
| return null; | |
| }, | |
| /** | |
| * Initializes the media query helper, by extracting the breakpoint list from the CSS and activating the breakpoint watcher. | |
| * @function | |
| * @private | |
| */ | |
| _init: function() { | |
| var self = this; | |
| var extractedStyles = $('.foundation-mq').css('font-family'); | |
| var namedQueries; | |
| namedQueries = parseStyleToObject(extractedStyles); | |
| for (var key in namedQueries) { | |
| self.queries.push({ | |
| name: key, | |
| value: 'only screen and (min-width: ' + namedQueries[key] + ')' | |
| }); | |
| } | |
| this.current = this._getCurrentSize(); | |
| this._watcher(); | |
| // Extend default queries | |
| // namedQueries = $.extend(defaultQueries, namedQueries); | |
| }, | |
| /** | |
| * Gets the current breakpoint name by testing every breakpoint and returning the last one to match (the biggest one). | |
| * @function | |
| * @private | |
| * @returns {String} Name of the current breakpoint. | |
| */ | |
| _getCurrentSize: function() { | |
| var matched; | |
| for (var i in this.queries) { | |
| var query = this.queries[i]; | |
| if (window.matchMedia(query.value).matches) { | |
| matched = query; | |
| } | |
| } | |
| if(typeof matched === 'object') { | |
| return matched.name; | |
| } else { | |
| return matched; | |
| } | |
| }, | |
| /** | |
| * Activates the breakpoint watcher, which fires an event on the window whenever the breakpoint changes. | |
| * @function | |
| * @private | |
| */ | |
| _watcher: function() { | |
| var _this = this; | |
| $(window).on('resize.zf.mediaquery', function() { | |
| var newSize = _this._getCurrentSize(); | |
| if (newSize !== _this.current) { | |
| // Broadcast the media query change on the window | |
| $(window).trigger('changed.zf.mediaquery', [newSize, _this.current]); | |
| // Change the current media query | |
| _this.current = newSize; | |
| } | |
| }); | |
| } | |
| }; | |
| Foundation.MediaQuery = MediaQuery; | |
| // matchMedia() polyfill - Test a CSS media type/query in JS. | |
| // Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license | |
| window.matchMedia || (window.matchMedia = function() { | |
| 'use strict'; | |
| // For browsers that support matchMedium api such as IE 9 and webkit | |
| var styleMedia = (window.styleMedia || window.media); | |
| // For those that don't support matchMedium | |
| if (!styleMedia) { | |
| var style = document.createElement('style'), | |
| script = document.getElementsByTagName('script')[0], | |
| info = null; | |
| style.type = 'text/css'; | |
| style.id = 'matchmediajs-test'; | |
| script.parentNode.insertBefore(style, script); | |
| // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers | |
| info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle; | |
| styleMedia = { | |
| matchMedium: function(media) { | |
| var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }'; | |
| // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers | |
| if (style.styleSheet) { | |
| style.styleSheet.cssText = text; | |
| } else { | |
| style.textContent = text; | |
| } | |
| // Test if media query is true or false | |
| return info.width === '1px'; | |
| } | |
| }; | |
| } | |
| return function(media) { | |
| return { | |
| matches: styleMedia.matchMedium(media || 'all'), | |
| media: media || 'all' | |
| }; | |
| }; | |
| }()); | |
| // Thank you: https://github.com/sindresorhus/query-string | |
| function parseStyleToObject(str) { | |
| var styleObject = {}; | |
| if (typeof str !== 'string') { | |
| return styleObject; | |
| } | |
| str = str.trim().slice(1, -1); // browsers re-quote string style values | |
| if (!str) { | |
| return styleObject; | |
| } | |
| styleObject = str.split('&').reduce(function(ret, param) { | |
| var parts = param.replace(/\+/g, ' ').split('='); | |
| var key = parts[0]; | |
| var val = parts[1]; | |
| key = decodeURIComponent(key); | |
| // missing `=` should be `null`: | |
| // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters | |
| val = val === undefined ? null : decodeURIComponent(val); | |
| if (!ret.hasOwnProperty(key)) { | |
| ret[key] = val; | |
| } else if (Array.isArray(ret[key])) { | |
| ret[key].push(val); | |
| } else { | |
| ret[key] = [ret[key], val]; | |
| } | |
| return ret; | |
| }, {}); | |
| return styleObject; | |
| } | |
| }(jQuery, Foundation); | |
| /** | |
| * Motion module. | |
| * @module foundation.motion | |
| */ | |
| !function($, Foundation) { | |
| var initClasses = ['mui-enter', 'mui-leave']; | |
| var activeClasses = ['mui-enter-active', 'mui-leave-active']; | |
| function animate(isIn, element, animation, cb) { | |
| element = $(element).eq(0); | |
| if (!element.length) return; | |
| var initClass = isIn ? initClasses[0] : initClasses[1]; | |
| var activeClass = isIn ? activeClasses[0] : activeClasses[1]; | |
| // Set up the animation | |
| reset(); | |
| element.addClass(animation) | |
| .css('transition', 'none'); | |
| // .addClass(initClass); | |
| // if(isIn) element.show(); | |
| requestAnimationFrame(function() { | |
| element.addClass(initClass); | |
| if (isIn) element.show(); | |
| }); | |
| // Start the animation | |
| requestAnimationFrame(function() { | |
| element[0].offsetWidth; | |
| element.css('transition', ''); | |
| element.addClass(activeClass); | |
| }); | |
| // Move(500, element, function(){ | |
| // // element[0].offsetWidth; | |
| // element.css('transition', ''); | |
| // element.addClass(activeClass); | |
| // }); | |
| // Clean up the animation when it finishes | |
| element.one(Foundation.transitionend(element), finish);//.one('finished.zf.animate', finish); | |
| // Hides the element (for out animations), resets the element, and runs a callback | |
| function finish() { | |
| if (!isIn) element.hide(); | |
| reset(); | |
| if (cb) cb.apply(element); | |
| } | |
| // Resets transitions and removes motion-specific classes | |
| function reset() { | |
| element[0].style.transitionDuration = 0; | |
| element.removeClass(initClass + ' ' + activeClass + ' ' + animation); | |
| } | |
| } | |
| var Motion = { | |
| animateIn: function(element, animation, /*duration,*/ cb) { | |
| animate(true, element, animation, cb); | |
| }, | |
| animateOut: function(element, animation, /*duration,*/ cb) { | |
| animate(false, element, animation, cb); | |
| } | |
| }; | |
| var Move = function(duration, elem, fn){ | |
| var anim, prog, start = null; | |
| // console.log('called'); | |
| function move(ts){ | |
| if(!start) start = window.performance.now(); | |
| // console.log(start, ts); | |
| prog = ts - start; | |
| fn.apply(elem); | |
| if(prog < duration){ anim = window.requestAnimationFrame(move, elem); } | |
| else{ | |
| window.cancelAnimationFrame(anim); | |
| elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]); | |
| } | |
| } | |
| anim = window.requestAnimationFrame(move); | |
| }; | |
| Foundation.Move = Move; | |
| Foundation.Motion = Motion; | |
| }(jQuery, Foundation); | |
| !function($, Foundation){ | |
| 'use strict'; | |
| Foundation.Nest = { | |
| Feather: function(menu, type){ | |
| menu.attr('role', 'menubar'); | |
| type = type || 'zf'; | |
| var items = menu.find('li').attr({'role': 'menuitem'}), | |
| subMenuClass = 'is-' + type + '-submenu', | |
| subItemClass = subMenuClass + '-item', | |
| hasSubClass = 'is-' + type + '-submenu-parent'; | |
| menu.find('a:first').attr('tabindex', 0); | |
| items.each(function(){ | |
| var $item = $(this), | |
| $sub = $item.children('ul'); | |
| if($sub.length){ | |
| $item.addClass(hasSubClass) | |
| .attr({ | |
| 'aria-haspopup': true, | |
| 'aria-expanded': false, | |
| 'aria-label': $item.children('a:first').text() | |
| }); | |
| $sub.addClass('submenu ' + subMenuClass) | |
| .attr({ | |
| 'data-submenu': '', | |
| 'aria-hidden': true, | |
| 'role': 'menu' | |
| }); | |
| } | |
| if($item.parent('[data-submenu]').length){ | |
| $item.addClass('is-submenu-item ' + subItemClass); | |
| } | |
| }); | |
| return; | |
| }, | |
| Burn: function(menu, type){ | |
| var items = menu.find('li').removeAttr('tabindex'), | |
| subMenuClass = 'is-' + type + '-submenu', | |
| subItemClass = subMenuClass + '-item', | |
| hasSubClass = 'is-' + type + '-submenu-parent'; | |
| // menu.find('.is-active').removeClass('is-active'); | |
| menu.find('*') | |
| // menu.find('.' + subMenuClass + ', .' + subItemClass + ', .is-active, .has-submenu, .is-submenu-item, .submenu, [data-submenu]') | |
| .removeClass(subMenuClass + ' ' + subItemClass + ' ' + hasSubClass + ' is-submenu-item submenu is-active') | |
| .removeAttr('data-submenu').css('display', ''); | |
| // console.log( menu.find('.' + subMenuClass + ', .' + subItemClass + ', .has-submenu, .is-submenu-item, .submenu, [data-submenu]') | |
| // .removeClass(subMenuClass + ' ' + subItemClass + ' has-submenu is-submenu-item submenu') | |
| // .removeAttr('data-submenu')); | |
| // items.each(function(){ | |
| // var $item = $(this), | |
| // $sub = $item.children('ul'); | |
| // if($item.parent('[data-submenu]').length){ | |
| // $item.removeClass('is-submenu-item ' + subItemClass); | |
| // } | |
| // if($sub.length){ | |
| // $item.removeClass('has-submenu'); | |
| // $sub.removeClass('submenu ' + subMenuClass).removeAttr('data-submenu'); | |
| // } | |
| // }); | |
| } | |
| }; | |
| }(jQuery, window.Foundation); | |
| !function($, Foundation){ | |
| 'use strict'; | |
| var Timer = function(elem, options, cb){ | |
| var _this = this, | |
| duration = options.duration,//options is an object for easily adding features later. | |
| nameSpace = Object.keys(elem.data())[0] || 'timer', | |
| remain = -1, | |
| start, | |
| timer; | |
| this.isPaused = false; | |
| this.restart = function(){ | |
| remain = -1; | |
| clearTimeout(timer); | |
| this.start(); | |
| }; | |
| this.start = function(){ | |
| this.isPaused = false | |
| // if(!elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. | |
| clearTimeout(timer); | |
| remain = remain <= 0 ? duration : remain; | |
| elem.data('paused', false); | |
| start = Date.now(); | |
| timer = setTimeout(function(){ | |
| if(options.infinite){ | |
| _this.restart();//rerun the timer. | |
| } | |
| cb(); | |
| }, remain); | |
| elem.trigger('timerstart.zf.' + nameSpace); | |
| }; | |
| this.pause = function(){ | |
| this.isPaused = true; | |
| //if(elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. | |
| clearTimeout(timer); | |
| elem.data('paused', true); | |
| var end = Date.now(); | |
| remain = remain - (end - start); | |
| elem.trigger('timerpaused.zf.' + nameSpace); | |
| }; | |
| }; | |
| /** | |
| * Runs a callback function when images are fully loaded. | |
| * @param {Object} images - Image(s) to check if loaded. | |
| * @param {Func} callback - Function to execute when image is fully loaded. | |
| */ | |
| var onImagesLoaded = function(images, callback){ | |
| var self = this, | |
| unloaded = images.length; | |
| if (unloaded === 0) { | |
| callback(); | |
| } | |
| var singleImageLoaded = function() { | |
| unloaded--; | |
| if (unloaded === 0) { | |
| callback(); | |
| } | |
| }; | |
| images.each(function() { | |
| if (this.complete) { | |
| singleImageLoaded(); | |
| } | |
| else if (typeof this.naturalWidth !== 'undefined' && this.naturalWidth > 0) { | |
| singleImageLoaded(); | |
| } | |
| else { | |
| $(this).one('load', function() { | |
| singleImageLoaded(); | |
| }); | |
| } | |
| }); | |
| }; | |
| Foundation.Timer = Timer; | |
| Foundation.onImagesLoaded = onImagesLoaded; | |
| }(jQuery, window.Foundation); | |
| //************************************************** | |
| //**Work inspired by multiple jquery swipe plugins** | |
| //**Done by Yohai Ararat *************************** | |
| //************************************************** | |
| (function($) { | |
| $.spotSwipe = { | |
| version: '1.0.0', | |
| enabled: 'ontouchstart' in document.documentElement, | |
| preventDefault: false, | |
| moveThreshold: 75, | |
| timeThreshold: 200 | |
| }; | |
| var startPosX, | |
| startPosY, | |
| startTime, | |
| elapsedTime, | |
| isMoving = false; | |
| function onTouchEnd() { | |
| // alert(this); | |
| this.removeEventListener('touchmove', onTouchMove); | |
| this.removeEventListener('touchend', onTouchEnd); | |
| isMoving = false; | |
| } | |
| function onTouchMove(e) { | |
| if ($.spotSwipe.preventDefault) { e.preventDefault(); } | |
| if(isMoving) { | |
| var x = e.touches[0].pageX; | |
| var y = e.touches[0].pageY; | |
| var dx = startPosX - x; | |
| var dy = startPosY - y; | |
| var dir; | |
| elapsedTime = new Date().getTime() - startTime; | |
| if(Math.abs(dx) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) { | |
| dir = dx > 0 ? 'left' : 'right'; | |
| } | |
| // else if(Math.abs(dy) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) { | |
| // dir = dy > 0 ? 'down' : 'up'; | |
| // } | |
| if(dir) { | |
| e.preventDefault(); | |
| onTouchEnd.call(this); | |
| $(this).trigger('swipe', dir).trigger('swipe' + dir); | |
| } | |
| } | |
| } | |
| function onTouchStart(e) { | |
| if (e.touches.length == 1) { | |
| startPosX = e.touches[0].pageX; | |
| startPosY = e.touches[0].pageY; | |
| isMoving = true; | |
| startTime = new Date().getTime(); | |
| this.addEventListener('touchmove', onTouchMove, false); | |
| this.addEventListener('touchend', onTouchEnd, false); | |
| } | |
| } | |
| function init() { | |
| this.addEventListener && this.addEventListener('touchstart', onTouchStart, false); | |
| } | |
| function teardown() { | |
| this.removeEventListener('touchstart', onTouchStart); | |
| } | |
| $.event.special.swipe = { setup: init }; | |
| $.each(['left', 'up', 'down', 'right'], function () { | |
| $.event.special['swipe' + this] = { setup: function(){ | |
| $(this).on('swipe', $.noop); | |
| } }; | |
| }); | |
| })(jQuery); | |
| /**************************************************** | |
| * Method for adding psuedo drag events to elements * | |
| ***************************************************/ | |
| !function($){ | |
| $.fn.addTouch = function(){ | |
| this.each(function(i,el){ | |
| $(el).bind('touchstart touchmove touchend touchcancel',function(){ | |
| //we pass the original event object because the jQuery event | |
| //object is normalized to w3c specs and does not provide the TouchList | |
| handleTouch(event); | |
| }); | |
| }); | |
| var handleTouch = function(event){ | |
| var touches = event.changedTouches, | |
| first = touches[0], | |
| eventTypes = { | |
| touchstart: 'mousedown', | |
| touchmove: 'mousemove', | |
| touchend: 'mouseup' | |
| }, | |
| type = eventTypes[event.type], | |
| simulatedEvent | |
| ; | |
| if('MouseEvent' in window && typeof window.MouseEvent === 'function') { | |
| simulatedEvent = window.MouseEvent(type, { | |
| 'bubbles': true, | |
| 'cancelable': true, | |
| 'screenX': first.screenX, | |
| 'screenY': first.screenY, | |
| 'clientX': first.clientX, | |
| 'clientY': first.clientY | |
| }); | |
| } else { | |
| simulatedEvent = document.createEvent('MouseEvent'); | |
| simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0/*left*/, null); | |
| } | |
| first.target.dispatchEvent(simulatedEvent); | |
| }; | |
| }; | |
| }(jQuery); | |
| //********************************** | |
| //**From the jQuery Mobile Library** | |
| //**need to recreate functionality** | |
| //**and try to improve if possible** | |
| //********************************** | |
| /* Removing the jQuery function **** | |
| ************************************ | |
| (function( $, window, undefined ) { | |
| var $document = $( document ), | |
| // supportTouch = $.mobile.support.touch, | |
| touchStartEvent = 'touchstart'//supportTouch ? "touchstart" : "mousedown", | |
| touchStopEvent = 'touchend'//supportTouch ? "touchend" : "mouseup", | |
| touchMoveEvent = 'touchmove'//supportTouch ? "touchmove" : "mousemove"; | |
| // setup new event shortcuts | |
| $.each( ( "touchstart touchmove touchend " + | |
| "swipe swipeleft swiperight" ).split( " " ), function( i, name ) { | |
| $.fn[ name ] = function( fn ) { | |
| return fn ? this.bind( name, fn ) : this.trigger( name ); | |
| }; | |
| // jQuery < 1.8 | |
| if ( $.attrFn ) { | |
| $.attrFn[ name ] = true; | |
| } | |
| }); | |
| function triggerCustomEvent( obj, eventType, event, bubble ) { | |
| var originalType = event.type; | |
| event.type = eventType; | |
| if ( bubble ) { | |
| $.event.trigger( event, undefined, obj ); | |
| } else { | |
| $.event.dispatch.call( obj, event ); | |
| } | |
| event.type = originalType; | |
| } | |
| // also handles taphold | |
| // Also handles swipeleft, swiperight | |
| $.event.special.swipe = { | |
| // More than this horizontal displacement, and we will suppress scrolling. | |
| scrollSupressionThreshold: 30, | |
| // More time than this, and it isn't a swipe. | |
| durationThreshold: 1000, | |
| // Swipe horizontal displacement must be more than this. | |
| horizontalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30, | |
| // Swipe vertical displacement must be less than this. | |
| verticalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30, | |
| getLocation: function ( event ) { | |
| var winPageX = window.pageXOffset, | |
| winPageY = window.pageYOffset, | |
| x = event.clientX, | |
| y = event.clientY; | |
| if ( event.pageY === 0 && Math.floor( y ) > Math.floor( event.pageY ) || | |
| event.pageX === 0 && Math.floor( x ) > Math.floor( event.pageX ) ) { | |
| // iOS4 clientX/clientY have the value that should have been | |
| // in pageX/pageY. While pageX/page/ have the value 0 | |
| x = x - winPageX; | |
| y = y - winPageY; | |
| } else if ( y < ( event.pageY - winPageY) || x < ( event.pageX - winPageX ) ) { | |
| // Some Android browsers have totally bogus values for clientX/Y | |
| // when scrolling/zooming a page. Detectable since clientX/clientY | |
| // should never be smaller than pageX/pageY minus page scroll | |
| x = event.pageX - winPageX; | |
| y = event.pageY - winPageY; | |
| } | |
| return { | |
| x: x, | |
| y: y | |
| }; | |
| }, | |
| start: function( event ) { | |
| var data = event.originalEvent.touches ? | |
| event.originalEvent.touches[ 0 ] : event, | |
| location = $.event.special.swipe.getLocation( data ); | |
| return { | |
| time: ( new Date() ).getTime(), | |
| coords: [ location.x, location.y ], | |
| origin: $( event.target ) | |
| }; | |
| }, | |
| stop: function( event ) { | |
| var data = event.originalEvent.touches ? | |
| event.originalEvent.touches[ 0 ] : event, | |
| location = $.event.special.swipe.getLocation( data ); | |
| return { | |
| time: ( new Date() ).getTime(), | |
| coords: [ location.x, location.y ] | |
| }; | |
| }, | |
| handleSwipe: function( start, stop, thisObject, origTarget ) { | |
| if ( stop.time - start.time < $.event.special.swipe.durationThreshold && | |
| Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold && | |
| Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) { | |
| var direction = start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight"; | |
| triggerCustomEvent( thisObject, "swipe", $.Event( "swipe", { target: origTarget, swipestart: start, swipestop: stop }), true ); | |
| triggerCustomEvent( thisObject, direction,$.Event( direction, { target: origTarget, swipestart: start, swipestop: stop } ), true ); | |
| return true; | |
| } | |
| return false; | |
| }, | |
| // This serves as a flag to ensure that at most one swipe event event is | |
| // in work at any given time | |
| eventInProgress: false, | |
| setup: function() { | |
| var events, | |
| thisObject = this, | |
| $this = $( thisObject ), | |
| context = {}; | |
| // Retrieve the events data for this element and add the swipe context | |
| events = $.data( this, "mobile-events" ); | |
| if ( !events ) { | |
| events = { length: 0 }; | |
| $.data( this, "mobile-events", events ); | |
| } | |
| events.length++; | |
| events.swipe = context; | |
| context.start = function( event ) { | |
| // Bail if we're already working on a swipe event | |
| if ( $.event.special.swipe.eventInProgress ) { | |
| return; | |
| } | |
| $.event.special.swipe.eventInProgress = true; | |
| var stop, | |
| start = $.event.special.swipe.start( event ), | |
| origTarget = event.target, | |
| emitted = false; | |
| context.move = function( event ) { | |
| if ( !start || event.isDefaultPrevented() ) { | |
| return; | |
| } | |
| stop = $.event.special.swipe.stop( event ); | |
| if ( !emitted ) { | |
| emitted = $.event.special.swipe.handleSwipe( start, stop, thisObject, origTarget ); | |
| if ( emitted ) { | |
| // Reset the context to make way for the next swipe event | |
| $.event.special.swipe.eventInProgress = false; | |
| } | |
| } | |
| // prevent scrolling | |
| if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) { | |
| event.preventDefault(); | |
| } | |
| }; | |
| context.stop = function() { | |
| emitted = true; | |
| // Reset the context to make way for the next swipe event | |
| $.event.special.swipe.eventInProgress = false; | |
| $document.off( touchMoveEvent, context.move ); | |
| context.move = null; | |
| }; | |
| $document.on( touchMoveEvent, context.move ) | |
| .one( touchStopEvent, context.stop ); | |
| }; | |
| $this.on( touchStartEvent, context.start ); | |
| }, | |
| teardown: function() { | |
| var events, context; | |
| events = $.data( this, "mobile-events" ); | |
| if ( events ) { | |
| context = events.swipe; | |
| delete events.swipe; | |
| events.length--; | |
| if ( events.length === 0 ) { | |
| $.removeData( this, "mobile-events" ); | |
| } | |
| } | |
| if ( context ) { | |
| if ( context.start ) { | |
| $( this ).off( touchStartEvent, context.start ); | |
| } | |
| if ( context.move ) { | |
| $document.off( touchMoveEvent, context.move ); | |
| } | |
| if ( context.stop ) { | |
| $document.off( touchStopEvent, context.stop ); | |
| } | |
| } | |
| } | |
| }; | |
| $.each({ | |
| swipeleft: "swipe.left", | |
| swiperight: "swipe.right" | |
| }, function( event, sourceEvent ) { | |
| $.event.special[ event ] = { | |
| setup: function() { | |
| $( this ).bind( sourceEvent, $.noop ); | |
| }, | |
| teardown: function() { | |
| $( this ).unbind( sourceEvent ); | |
| } | |
| }; | |
| }); | |
| })( jQuery, this ); | |
| */ | |
| !function(Foundation, $) { | |
| 'use strict'; | |
| // Elements with [data-open] will reveal a plugin that supports it when clicked. | |
| $(document).on('click.zf.trigger', '[data-open]', function() { | |
| var id = $(this).data('open'); | |
| $('#' + id).triggerHandler('open.zf.trigger', [$(this)]); | |
| }); | |
| // Elements with [data-close] will close a plugin that supports it when clicked. | |
| // If used without a value on [data-close], the event will bubble, allowing it to close a parent component. | |
| $(document).on('click.zf.trigger', '[data-close]', function() { | |
| var id = $(this).data('close'); | |
| if (id) { | |
| $('#' + id).triggerHandler('close.zf.trigger', [$(this)]); | |
| } | |
| else { | |
| $(this).trigger('close.zf.trigger'); | |
| } | |
| }); | |
| // Elements with [data-toggle] will toggle a plugin that supports it when clicked. | |
| $(document).on('click.zf.trigger', '[data-toggle]', function() { | |
| var id = $(this).data('toggle'); | |
| $('#' + id).triggerHandler('toggle.zf.trigger', [$(this)]); | |
| }); | |
| // Elements with [data-closable] will respond to close.zf.trigger events. | |
| $(document).on('close.zf.trigger', '[data-closable]', function(e){ | |
| e.stopPropagation(); | |
| var animation = $(this).data('closable'); | |
| if(animation !== ''){ | |
| Foundation.Motion.animateOut($(this), animation, function() { | |
| $(this).trigger('closed.zf'); | |
| }); | |
| }else{ | |
| $(this).fadeOut().trigger('closed.zf'); | |
| } | |
| }); | |
| var MutationObserver = (function () { | |
| var prefixes = ['WebKit', 'Moz', 'O', 'Ms', '']; | |
| for (var i=0; i < prefixes.length; i++) { | |
| if (prefixes[i] + 'MutationObserver' in window) { | |
| return window[prefixes[i] + 'MutationObserver']; | |
| } | |
| } | |
| return false; | |
| }()); | |
| var checkListeners = function(){ | |
| eventsListener(); | |
| resizeListener(); | |
| scrollListener(); | |
| closemeListener(); | |
| }; | |
| /** | |
| * Fires once after all other scripts have loaded | |
| * @function | |
| * @private | |
| */ | |
| $(window).load(function(){ | |
| checkListeners(); | |
| }); | |
| //******** only fires this function once on load, if there's something to watch ******** | |
| var closemeListener = function(pluginName){ | |
| var yetiBoxes = $('[data-yeti-box]'), | |
| plugNames = ['dropdown', 'tooltip', 'reveal']; | |
| if(pluginName){ | |
| if(typeof pluginName === 'string'){ | |
| plugNames.push(pluginName); | |
| }else if(typeof pluginName === 'object' && typeof pluginName[0] === 'string'){ | |
| plugNames.concat(pluginName); | |
| }else{ | |
| console.error('Plugin names must be strings'); | |
| } | |
| } | |
| if(yetiBoxes.length){ | |
| var listeners = plugNames.map(function(name){ | |
| return 'closeme.zf.' + name; | |
| }).join(' '); | |
| $(window).off(listeners).on(listeners, function(e, pluginId){ | |
| var plugin = e.namespace.split('.')[0]; | |
| var plugins = $('[data-' + plugin + ']').not('[data-yeti-box="' + pluginId + '"]'); | |
| plugins.each(function(){ | |
| var _this = $(this); | |
| _this.triggerHandler('close.zf.trigger', [_this]); | |
| }); | |
| }); | |
| } | |
| }; | |
| var resizeListener = function(debounce){ | |
| var timer, | |
| $nodes = $('[data-resize]'); | |
| if($nodes.length){ | |
| $(window).off('resize.zf.trigger') | |
| .on('resize.zf.trigger', function(e) { | |
| if (timer) { clearTimeout(timer); } | |
| timer = setTimeout(function(){ | |
| if(!MutationObserver){//fallback for IE 9 | |
| $nodes.each(function(){ | |
| $(this).triggerHandler('resizeme.zf.trigger'); | |
| }); | |
| } | |
| //trigger all listening elements and signal a resize event | |
| $nodes.attr('data-events', "resize"); | |
| }, debounce || 10);//default time to emit resize event | |
| }); | |
| } | |
| }; | |
| var scrollListener = function(debounce){ | |
| var timer, | |
| $nodes = $('[data-scroll]'); | |
| if($nodes.length){ | |
| $(window).off('scroll.zf.trigger') | |
| .on('scroll.zf.trigger', function(e){ | |
| if(timer){ clearTimeout(timer); } | |
| timer = setTimeout(function(){ | |
| if(!MutationObserver){//fallback for IE 9 | |
| $nodes.each(function(){ | |
| $(this).triggerHandler('scrollme.zf.trigger'); | |
| }); | |
| } | |
| //trigger all listening elements and signal a scroll event | |
| $nodes.attr('data-events', "scroll"); | |
| }, debounce || 10);//default time to emit scroll event | |
| }); | |
| } | |
| }; | |
| // function domMutationObserver(debounce) { | |
| // // !!! This is coming soon and needs more work; not active !!! // | |
| // var timer, | |
| // nodes = document.querySelectorAll('[data-mutate]'); | |
| // // | |
| // if (nodes.length) { | |
| // // var MutationObserver = (function () { | |
| // // var prefixes = ['WebKit', 'Moz', 'O', 'Ms', '']; | |
| // // for (var i=0; i < prefixes.length; i++) { | |
| // // if (prefixes[i] + 'MutationObserver' in window) { | |
| // // return window[prefixes[i] + 'MutationObserver']; | |
| // // } | |
| // // } | |
| // // return false; | |
| // // }()); | |
| // | |
| // | |
| // //for the body, we need to listen for all changes effecting the style and class attributes | |
| // var bodyObserver = new MutationObserver(bodyMutation); | |
| // bodyObserver.observe(document.body, { attributes: true, childList: true, characterData: false, subtree:true, attributeFilter:["style", "class"]}); | |
| // | |
| // | |
| // //body callback | |
| // function bodyMutation(mutate) { | |
| // //trigger all listening elements and signal a mutation event | |
| // if (timer) { clearTimeout(timer); } | |
| // | |
| // timer = setTimeout(function() { | |
| // bodyObserver.disconnect(); | |
| // $('[data-mutate]').attr('data-events',"mutate"); | |
| // }, debounce || 150); | |
| // } | |
| // } | |
| // } | |
| var eventsListener = function() { | |
| if(!MutationObserver){ return false; } | |
| var nodes = document.querySelectorAll('[data-resize], [data-scroll], [data-mutate]'); | |
| //element callback | |
| var listeningElementsMutation = function(mutationRecordsList) { | |
| var $target = $(mutationRecordsList[0].target); | |
| //trigger the event handler for the element depending on type | |
| switch ($target.attr("data-events")) { | |
| case "resize" : | |
| $target.triggerHandler('resizeme.zf.trigger', [$target]); | |
| break; | |
| case "scroll" : | |
| $target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]); | |
| break; | |
| // case "mutate" : | |
| // console.log('mutate', $target); | |
| // $target.triggerHandler('mutate.zf.trigger'); | |
| // | |
| // //make sure we don't get stuck in an infinite loop from sloppy codeing | |
| // if ($target.index('[data-mutate]') == $("[data-mutate]").length-1) { | |
| // domMutationObserver(); | |
| // } | |
| // break; | |
| default : | |
| return false; | |
| //nothing | |
| } | |
| } | |
| if(nodes.length){ | |
| //for each element that needs to listen for resizing, scrolling, (or coming soon mutation) add a single observer | |
| for (var i = 0; i <= nodes.length-1; i++) { | |
| var elementObserver = new MutationObserver(listeningElementsMutation); | |
| elementObserver.observe(nodes[i], { attributes: true, childList: false, characterData: false, subtree:false, attributeFilter:["data-events"]}); | |
| } | |
| } | |
| }; | |
| // ------------------------------------ | |
| // [PH] | |
| // Foundation.CheckWatchers = checkWatchers; | |
| Foundation.IHearYou = checkListeners; | |
| // Foundation.ISeeYou = scrollListener; | |
| // Foundation.IFeelYou = closemeListener; | |
| }(window.Foundation, window.jQuery); | |
| !function(Foundation, $) { | |
| 'use strict'; | |
| /** | |
| * Creates a new instance of Abide. | |
| * @class | |
| * @fires Abide#init | |
| * @param {Object} element - jQuery object to add the trigger to. | |
| * @param {Object} options - Overrides to the default plugin settings. | |
| */ | |
| function Abide(element, options) { | |
| this.$element = element; | |
| this.options = $.extend({}, Abide.defaults, this.$element.data(), options); | |
| this._init(); | |
| Foundation.registerPlugin(this, 'Abide'); | |
| } | |
| /** | |
| * Default settings for plugin | |
| */ | |
| Abide.defaults = { | |
| /** | |
| * The default event to validate inputs. Checkboxes and radios validate immediately. | |
| * Remove or change this value for manual validation. | |
| * @option | |
| * @example 'fieldChange' | |
| */ | |
| validateOn: 'fieldChange', | |
| /** | |
| * Class to be applied to input labels on failed validation. | |
| * @option | |
| * @example 'is-invalid-label' | |
| */ | |
| labelErrorClass: 'is-invalid-label', | |
| /** | |
| * Class to be applied to inputs on failed validation. | |
| * @option | |
| * @example 'is-invalid-input' | |
| */ | |
| inputErrorClass: 'is-invalid-input', | |
| /** | |
| * Class selector to use to target Form Errors for show/hide. | |
| * @option | |
| * @example '.form-error' | |
| */ | |
| formErrorSelector: '.form-error', | |
| /** | |
| * Class added to Form Errors on failed validation. | |
| * @option | |
| * @example 'is-visible' | |
| */ | |
| formErrorClass: 'is-visible', | |
| /** | |
| * Set to true to validate text inputs on any value change. | |
| * @option | |
| * @example false | |
| */ | |
| liveValidate: false, | |
| patterns: { | |
| alpha : /^[a-zA-Z]+$/, | |
| alpha_numeric : /^[a-zA-Z0-9]+$/, | |
| integer : /^[-+]?\d+$/, | |
| number : /^[-+]?\d*(?:[\.\,]\d+)?$/, | |
| // amex, visa, diners | |
| card : /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/, | |
| cvv : /^([0-9]){3,4}$/, | |
| // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address | |
| email : /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/, | |
| url : /^(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/, | |
| // abc.de | |
| domain : /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/, | |
| datetime : /^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/, | |
| // YYYY-MM-DD | |
| date : /(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/, | |
| // HH:MM:SS | |
| time : /^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/, | |
| dateISO : /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/, | |
| // MM/DD/YYYY | |
| month_day_year : /^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/, | |
| // DD/MM/YYYY | |
| day_month_year : /^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/, | |
| // #FFF or #FFFFFF | |
| color : /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/ | |
| }, | |
| /** | |
| * Optional validation functions to be used. `equalTo` being the only default included function. | |
| * Functions should return only a boolean if the input is valid or not. Functions are given the following arguments: | |
| * el : The jQuery element to validate. | |
| * required : Boolean value of the required attribute be present or not. | |
| * parent : The direct parent of the input. | |
| * @option | |
| */ | |
| validators: { | |
| equalTo: function (el, required, parent) { | |
| return $('#' + el.attr('data-equalto')).val() === el.val(); | |
| } | |
| } | |
| }; | |
| /** | |
| * Initializes the Abide plugin and calls functions to get Abide functioning on load. | |
| * @private | |
| */ | |
| Abide.prototype._init = function(){ | |
| this.$inputs = this.$element.find('input, textarea, select').not('[data-abide-ignore]'); | |
| this._events(); | |
| }; | |
| /** | |
| * Initializes events for Abide. | |
| * @private | |
| */ | |
| Abide.prototype._events = function() { | |
| var _this = this; | |
| this.$element.off('.abide') | |
| .on('reset.zf.abide', function(e){ | |
| _this.resetForm(); | |
| }) | |
| .on('submit.zf.abide', function(e){ | |
| return _this.validateForm(); | |
| }); | |
| if(this.options.validateOn === 'fieldChange'){ | |
| this.$inputs.off('change.zf.abide') | |
| .on('change.zf.abide', function(e){ | |
| _this.validateInput($(this)); | |
| }); | |
| } | |
| if(this.options.liveValidate){ | |
| this.$inputs.off('input.zf.abide') | |
| .on('input.zf.abide', function(e){ | |
| _this.validateInput($(this)); | |
| }); | |
| } | |
| }, | |
| /** | |
| * Calls necessary functions to update Abide upon DOM change | |
| * @private | |
| */ | |
| Abide.prototype._reflow = function() { | |
| this._init(); | |
| }; | |
| /** | |
| * Checks whether or not a form element has the required attribute and if it's checked or not | |
| * @param {Object} element - jQuery object to check for required attribute | |
| * @returns {Boolean} Boolean value depends on whether or not attribute is checked or empty | |
| */ | |
| Abide.prototype.requiredCheck = function($el) { | |
| if(!$el.attr('required')) return true; | |
| var isGood = true; | |
| switch ($el[0].type) { | |
| case 'checkbox': | |
| case 'radio': | |
| isGood = $el[0].checked; | |
| break; | |
| case 'select': | |
| case 'select-one': | |
| case 'select-multiple': | |
| var opt = $el.find('option:selected'); | |
| if(!opt.length || !opt.val()) isGood = false; | |
| break; | |
| default: | |
| if(!$el.val() || !$el.val().length) isGood = false; | |
| } | |
| return isGood; | |
| }; | |
| /** | |
| * Based on $el, get the first element with selector in this order: | |
| * 1. The element's direct sibling('s). | |
| * 3. The element's parent's children. | |
| * | |
| * This allows for multiple form errors per input, though if none are found, no form errors will be shown. | |
| * | |
| * @param {Object} $el - jQuery object to use as reference to find the form error selector. | |
| * @returns {Object} jQuery object with the selector. | |
| */ | |
| Abide.prototype.findFormError = function($el){ | |
| var $error = $el.siblings(this.options.formErrorSelector); | |
| if(!$error.length){ | |
| $error = $el.parent().find(this.options.formErrorSelector); | |
| } | |
| return $error; | |
| }; | |
| /** | |
| * Get the first element in this order: | |
| * 2. The <label> with the attribute `[for="someInputId"]` | |
| * 3. The `.closest()` <label> | |
| * | |
| * @param {Object} $el - jQuery object to check for required attribute | |
| * @returns {Boolean} Boolean value depends on whether or not attribute is checked or empty | |
| */ | |
| Abide.prototype.findLabel = function($el) { | |
| var $label = this.$element.find('label[for="' + $el[0].id + '"]'); | |
| if(!$label.length){ | |
| return $el.closest('label'); | |
| } | |
| return $label; | |
| }; | |
| /** | |
| * Adds the CSS error class as specified by the Abide settings to the label, input, and the form | |
| * @param {Object} $el - jQuery object to add the class to | |
| */ | |
| Abide.prototype.addErrorClasses = function($el){ | |
| var $label = this.findLabel($el), | |
| $formError = this.findFormError($el); | |
| if($label.length){ | |
| $label.addClass(this.options.labelErrorClass); | |
| } | |
| if($formError.length){ | |
| $formError.addClass(this.options.formErrorClass); | |
| } | |
| $el.addClass(this.options.inputErrorClass).attr('data-invalid', ''); | |
| }; | |
| /** | |
| * Removes CSS error class as specified by the Abide settings from the label, input, and the form | |
| * @param {Object} $el - jQuery object to remove the class from | |
| */ | |
| Abide.prototype.removeErrorClasses = function($el){ | |
| var $label = this.findLabel($el), | |
| $formError = this.findFormError($el); | |
| if($label.length){ | |
| $label.removeClass(this.options.labelErrorClass); | |
| } | |
| if($formError.length){ | |
| $formError.removeClass(this.options.formErrorClass); | |
| } | |
| $el.removeClass(this.options.inputErrorClass).removeAttr('data-invalid'); | |
| }; | |
| /** | |
| * Goes through a form to find inputs and proceeds to validate them in ways specific to their type | |
| * @fires Abide#invalid | |
| * @fires Abide#valid | |
| * @param {Object} element - jQuery object to validate, should be an HTML input | |
| * @returns {Boolean} goodToGo - If the input is valid or not. | |
| */ | |
| Abide.prototype.validateInput = function($el){ | |
| var clearRequire = this.requiredCheck($el), | |
| validated = false, | |
| customValidator = true, | |
| validator = $el.attr('data-validator'), | |
| equalTo = true; | |
| switch ($el[0].type) { | |
| case 'radio': | |
| validated = this.validateRadio($el.attr('name')); | |
| break; | |
| case 'checkbox': | |
| validated = clearRequire; | |
| break; | |
| case 'select': | |
| case 'select-one': | |
| case 'select-multiple': | |
| validated = clearRequire; | |
| break; | |
| default: | |
| validated = this.validateText($el); | |
| } | |
| if(validator){ customValidator = this.matchValidation($el, validator, $el.attr('required')); } | |
| if($el.attr('data-equalto')){ equalTo = this.options.validators.equalTo($el); } | |
| var goodToGo = [clearRequire, validated, customValidator, equalTo].indexOf(false) === -1, | |
| message = (goodToGo ? 'valid' : 'invalid') + '.zf.abide'; | |
| this[goodToGo ? 'removeErrorClasses' : 'addErrorClasses']($el); | |
| /** | |
| * Fires when the input is done checking for validation. Event trigger is either `valid.zf.abide` or `invalid.zf.abide` | |
| * Trigger includes the DOM element of the input. | |
| * @event Abide#valid | |
| * @event Abide#invalid | |
| */ | |
| $el.trigger(message, [$el]); | |
| return goodToGo; | |
| }; | |
| /** | |
| * Goes through a form and if there are any invalid inputs, it will display the form error element | |
| * @returns {Boolean} noError - true if no errors were detected... | |
| * @fires Abide#formvalid | |
| * @fires Abide#forminvalid | |
| */ | |
| Abide.prototype.validateForm = function(){ | |
| var acc = [], | |
| _this = this; | |
| this.$inputs.each(function(){ | |
| acc.push(_this.validateInput($(this))); | |
| }); | |
| var noError = acc.indexOf(false) === -1; | |
| this.$element.find('[data-abide-error]').css('display', (noError ? 'none' : 'block')); | |
| /** | |
| * Fires when the form is finished validating. Event trigger is either `formvalid.zf.abide` or `forminvalid.zf.abide`. | |
| * Trigger includes the element of the form. | |
| * @event Abide#formvalid | |
| * @event Abide#forminvalid | |
| */ | |
| this.$element.trigger((noError ? 'formvalid' : 'forminvalid') + '.zf.abide', [this.$element]); | |
| return noError; | |
| }; | |
| /** | |
| * Determines whether or a not a text input is valid based on the pattern specified in the attribute. If no matching pattern is found, returns true. | |
| * @param {Object} $el - jQuery object to validate, should be a text input HTML element | |
| * @param {String} pattern - string value of one of the RegEx patterns in Abide.options.patterns | |
| * @returns {Boolean} Boolean value depends on whether or not the input value matches the pattern specified | |
| */ | |
| Abide.prototype.validateText = function($el, pattern){ | |
| // pattern = pattern ? pattern : $el.attr('pattern') ? $el.attr('pattern') : $el.attr('type'); | |
| pattern = (pattern || $el.attr('pattern') || $el.attr('type')); | |
| var inputText = $el.val(); | |
| return inputText.length ?//if text, check if the pattern exists, if so, test it, if no text or no pattern, return true. | |
| this.options.patterns.hasOwnProperty(pattern) ? this.options.patterns[pattern].test(inputText) : | |
| pattern && pattern !== $el.attr('type') ? new RegExp(pattern).test(inputText) : true : true; | |
| }; /** | |
| * Determines whether or a not a radio input is valid based on whether or not it is required and selected | |
| * @param {String} groupName - A string that specifies the name of a radio button group | |
| * @returns {Boolean} Boolean value depends on whether or not at least one radio input has been selected (if it's required) | |
| */ | |
| Abide.prototype.validateRadio = function(groupName){ | |
| var $group = this.$element.find(':radio[name="' + groupName + '"]'), | |
| counter = [], | |
| _this = this; | |
| $group.each(function(){ | |
| var rdio = $(this), | |
| clear = _this.requiredCheck(rdio); | |
| counter.push(clear); | |
| if(clear) _this.removeErrorClasses(rdio); | |
| }); | |
| return counter.indexOf(false) === -1; | |
| }; | |
| /** | |
| * Determines if a selected input passes a custom validation function. Multiple validations can be used, if passed to the element with `data-validator="foo bar baz"` in a space separated listed. | |
| * @param {Object} $el - jQuery input element. | |
| * @param {String} validators - a string of function names matching functions in the Abide.options.validators object. | |
| * @param {Boolean} required - self explanatory? | |
| * @returns {Boolean} - true if validations passed. | |
| */ | |
| Abide.prototype.matchValidation = function($el, validators, required){ | |
| var _this = this; | |
| required = required ? true : false; | |
| var clear = validators.split(' ').map(function(v){ | |
| return _this.options.validators[v]($el, required, $el.parent()); | |
| }); | |
| return clear.indexOf(false) === -1; | |
| }; | |
| /** | |
| * Resets form inputs and styles | |
| * @fires Abide#formreset | |
| */ | |
| Abide.prototype.resetForm = function() { | |
| var $form = this.$element, | |
| opts = this.options; | |
| $('.' + opts.labelErrorClass, $form).not('small').removeClass(opts.labelErrorClass); | |
| $('.' + opts.inputErrorClass, $form).not('small').removeClass(opts.inputErrorClass); | |
| $(opts.formErrorSelector + '.' + opts.formErrorClass).removeClass(opts.formErrorClass); | |
| $form.find('[data-abide-error]').css('display', 'none'); | |
| $(':input', $form).not(':button, :submit, :reset, :hidden, [data-abide-ignore]').val('').removeAttr('data-invalid'); | |
| /** | |
| * Fires when the form has been reset. | |
| * @event Abide#formreset | |
| */ | |
| $form.trigger('formreset.zf.abide', [$form]); | |
| }; | |
| /** | |
| * Destroys an instance of Abide. | |
| * Removes error styles and classes from elements, without resetting their values. | |
| */ | |
| Abide.prototype.destroy = function(){ | |
| var _this = this; | |
| this.$element.off('.abide') | |
| .find('[data-abide-error]').css('display', 'none'); | |
| this.$inputs.off('.abide') | |
| .each(function(){ | |
| _this.removeErrorClasses($(this)); | |
| }); | |
| Foundation.unregisterPlugin(this); | |
| }; | |
| Foundation.plugin(Abide, 'Abide'); | |
| // Exports for AMD/Browserify | |
| if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') | |
| module.exports = Abide; | |
| if (typeof define === 'function') | |
| define(['foundation'], function() { | |
| return Abide; | |
| }); | |
| }(Foundation, jQuery); | |
| /** | |
| * Accordion module. | |
| * @module foundation.accordion | |
| * @requires foundation.util.keyboard | |
| * @requires foundation.util.motion | |
| */ | |
| !function($, Foundation) { | |
| 'use strict'; | |
| /** | |
| * Creates a new instance of an accordion. | |
| * @class | |
| * @fires Accordion#init | |
| * @param {jQuery} element - jQuery object to make into an accordion. | |
| * @param {Object} options - a plain object with settings to override the default options. | |
| */ | |
| function Accordion(element, options){ | |
| this.$element = element; | |
| this.options = $.extend({}, Accordion.defaults, this.$element.data(), options); | |
| this._init(); | |
| Foundation.registerPlugin(this, 'Accordion'); | |
| Foundation.Keyboard.register('Accordion', { | |
| 'ENTER': 'toggle', | |
| 'SPACE': 'toggle', | |
| 'ARROW_DOWN': 'next', | |
| 'ARROW_UP': 'previous' | |
| }); | |
| } | |
| Accordion.defaults = { | |
| /** | |
| * Amount of time to animate the opening of an accordion pane. | |
| * @option | |
| * @example 250 | |
| */ | |
| slideSpeed: 250, | |
| /** | |
| * Allow the accordion to have multiple open panes. | |
| * @option | |
| * @example false | |
| */ | |
| multiExpand: false, | |
| /** | |
| * Allow the accordion to close all panes. | |
| * @option | |
| * @example false | |
| */ | |
| allowAllClosed: false | |
| }; | |
| /** | |
| * Initializes the accordion by animating the preset active pane(s). | |
| * @private | |
| */ | |
| Accordion.prototype._init = function() { | |
| this.$element.attr('role', 'tablist'); | |
| this.$tabs = this.$element.children('li'); | |
| if (this.$tabs.length === 0) { | |
| this.$tabs = this.$element.children('[data-accordion-item]'); | |
| } | |
| this.$tabs.each(function(idx, el){ | |
| var $el = $(el), | |
| $content = $el.find('[data-tab-content]'), | |
| id = $content[0].id || Foundation.GetYoDigits(6, 'accordion'), | |
| linkId = el.id || id + '-label'; | |
| $el.find('a:first').attr({ | |
| 'aria-controls': id, | |
| 'role': 'tab', | |
| 'id': linkId, | |
| 'aria-expanded': false, | |
| 'aria-selected': false | |
| }); | |
| $content.attr({'role': 'tabpanel', 'aria-labelledby': linkId, 'aria-hidden': true, 'id': id}); | |
| }); | |
| var $initActive = this.$element.find('.is-active').children('[data-tab-content]'); | |
| if($initActive.length){ | |
| this.down($initActive, true); | |
| } | |
| this._events(); | |
| }; | |
| /** | |
| * Adds event handlers for items within the accordion. | |
| * @private | |
| */ | |
| Accordion.prototype._events = function() { | |
| var _this = this; | |
| this.$tabs.each(function(){ | |
| var $elem = $(this); | |
| var $tabContent = $elem.children('[data-tab-content]'); | |
| if ($tabContent.length) { | |
| $elem.children('a').off('click.zf.accordion keydown.zf.accordion') | |
| .on('click.zf.accordion', function(e){ | |
| // $(this).children('a').on('click.zf.accordion', function(e) { | |
| e.preventDefault(); | |
| if ($elem.hasClass('is-active')) { | |
| if(_this.options.allowAllClosed || $elem.siblings().hasClass('is-active')){ | |
| _this.up($tabContent); | |
| } | |
| } | |
| else { | |
| _this.down($tabContent); | |
| } | |
| }).on('keydown.zf.accordion', function(e){ | |
| Foundation.Keyboard.handleKey(e, 'Accordion', { | |
| toggle: function() { | |
| _this.toggle($tabContent); | |
| }, | |
| next: function() { | |
| $elem.next().find('a').focus().trigger('click.zf.accordion'); | |
| }, | |
| previous: function() { | |
| $elem.prev().find('a').focus().trigger('click.zf.accordion'); | |
| }, | |
| handled: function() { | |
| e.preventDefault(); | |
| e.stopPropagation(); | |
| } | |
| }); | |
| }); | |
| } | |
| }); | |
| }; | |
| /** | |
| * Toggles the selected content pane's open/close state. | |
| * @param {jQuery} $target - jQuery object of the pane to toggle. | |
| * @function | |
| */ | |
| Accordion.prototype.toggle = function($target){ | |
| if($target.parent().hasClass('is-active')){ | |
| if(this.options.allowAllClosed || $target.parent().siblings().hasClass('is-active')){ | |
| this.up($target); | |
| }else{ return; } | |
| }else{ | |
| this.down($target); | |
| } | |
| }; | |
| /** | |
| * Opens the accordion tab defined by `$target`. | |
| * @param {jQuery} $target - Accordion pane to open. | |
| * @param {Boolean} firstTime - flag to determine if reflow should happen. | |
| * @fires Accordion#down | |
| * @function | |
| */ | |
| Accordion.prototype.down = function($target, firstTime) { | |
| var _this = this; | |
| if(!this.options.multiExpand && !firstTime){ | |
| var $currentActive = this.$element.find('.is-active').children('[data-tab-content]'); | |
| if($currentActive.length){ | |
| this.up($currentActive); | |
| } | |
| } | |
| $target | |
| .attr('aria-hidden', false) | |
| .parent('[data-tab-content]') | |
| .addBack() | |
| .parent().addClass('is-active'); | |
| // Foundation.Move(_this.options.slideSpeed, $target, function(){ | |
| $target.slideDown(_this.options.slideSpeed, function () { | |
| /** | |
| * Fires when the tab is done opening. | |
| * @event Accordion#down | |
| */ | |
| _this.$element.trigger('down.zf.accordion', [$target]); | |
| }); | |
| // }); | |
| // if(!firstTime){ | |
| // Foundation._reflow(this.$element.attr('data-accordion')); | |
| // } | |
| $('#' + $target.attr('aria-labelledby')).attr({ | |
| 'aria-expanded': true, | |
| 'aria-selected': true | |
| }); | |
| }; | |
| /** | |
| * Closes the tab defined by `$target`. | |
| * @param {jQuery} $target - Accordion tab to close. | |
| * @fires Accordion#up | |
| * @function | |
| */ | |
| Accordion.prototype.up = function($target) { | |
| var $aunts = $target.parent().siblings(), | |
| _this = this; | |
| var canClose = this.options.multiExpand ? $aunts.hasClass('is-active') : $target.parent().hasClass('is-active'); | |
| if(!this.options.allowAllClosed && !canClose){ | |
| return; | |
| } | |
| // Foundation.Move(this.options.slideSpeed, $target, function(){ | |
| $target.slideUp(_this.options.slideSpeed, function () { | |
| /** | |
| * Fires when the tab is done collapsing up. | |
| * @event Accordion#up | |
| */ | |
| _this.$element.trigger('up.zf.accordion', [$target]); | |
| }); | |
| // }); | |
| $target.attr('aria-hidden', true) | |
| .parent().removeClass('is-active'); | |
| $('#' + $target.attr('aria-labelledby')).attr({ | |
| 'aria-expanded': false, | |
| 'aria-selected': false | |
| }); | |
| }; | |
| /** | |
| * Destroys an instance of an accordion. | |
| * @fires Accordion#destroyed | |
| * @function | |
| */ | |
| Accordion.prototype.destroy = function() { | |
| this.$element.find('[data-tab-content]').slideUp(0).css('display', ''); | |
| this.$element.find('a').off('.zf.accordion'); | |
| Foundation.unregisterPlugin(this); | |
| }; | |
| Foundation.plugin(Accordion, 'Accordion'); | |
| }(jQuery, window.Foundation); | |
| /** | |
| * AccordionMenu module. | |
| * @module foundation.accordionMenu | |
| * @requires foundation.util.keyboard | |
| * @requires foundation.util.motion | |
| * @requires foundation.util.nest | |
| */ | |
| !function($) { | |
| 'use strict'; | |
| /** | |
| * Creates a new instance of an accordion menu. | |
| * @class | |
| * @fires AccordionMenu#init | |
| * @param {jQuery} element - jQuery object to make into an accordion menu. | |
| * @param {Object} options - Overrides to the default plugin settings. | |
| */ | |
| function AccordionMenu(element, options) { | |
| this.$element = element; | |
| this.options = $.extend({}, AccordionMenu.defaults, this.$element.data(), options); | |
| Foundation.Nest.Feather(this.$element, 'accordion'); | |
| this._init(); | |
| Foundation.registerPlugin(this, 'AccordionMenu'); | |
| Foundation.Keyboard.register('AccordionMenu', { | |
| 'ENTER': 'toggle', | |
| 'SPACE': 'toggle', | |
| 'ARROW_RIGHT': 'open', | |
| 'ARROW_UP': 'up', | |
| 'ARROW_DOWN': 'down', | |
| 'ARROW_LEFT': 'close', | |
| 'ESCAPE': 'closeAll', | |
| 'TAB': 'down', | |
| 'SHIFT_TAB': 'up' | |
| }); | |
| } | |
| AccordionMenu.defaults = { | |
| /** | |
| * Amount of time to animate the opening of a submenu in ms. | |
| * @option | |
| * @example 250 | |
| */ | |
| slideSpeed: 250, | |
| /** | |
| * Allow the menu to have multiple open panes. | |
| * @option | |
| * @example true | |
| */ | |
| multiOpen: true | |
| }; | |
| /** | |
| * Initializes the accordion menu by hiding all nested menus. | |
| * @private | |
| */ | |
| AccordionMenu.prototype._init = function() { | |
| this.$element.find('[data-submenu]').not('.is-active').slideUp(0);//.find('a').css('padding-left', '1rem'); | |
| this.$element.attr({ | |
| 'role': 'tablist', | |
| 'aria-multiselectable': this.options.multiOpen | |
| }); | |
| this.$menuLinks = this.$element.find('.is-accordion-submenu-parent'); | |
| this.$menuLinks.each(function(){ | |
| var linkId = this.id || Foundation.GetYoDigits(6, 'acc-menu-link'), | |
| $elem = $(this), | |
| $sub = $elem.children('[data-submenu]'), | |
| subId = $sub[0].id || Foundation.GetYoDigits(6, 'acc-menu'), | |
| isActive = $sub.hasClass('is-active'); | |
| $elem.attr({ | |
| 'aria-controls': subId, | |
| 'aria-expanded': isActive, | |
| 'role': 'tab', | |
| 'id': linkId | |
| }); | |
| $sub.attr({ | |
| 'aria-labelledby': linkId, | |
| 'aria-hidden': !isActive, | |
| 'role': 'tabpanel', | |
| 'id': subId | |
| }); | |
| }); | |
| var initPanes = this.$element.find('.is-active'); | |
| if(initPanes.length){ | |
| var _this = this; | |
| initPanes.each(function(){ | |
| _this.down($(this)); | |
| }); | |
| } | |
| this._events(); | |
| }; | |
| /** | |
| * Adds event handlers for items within the menu. | |
| * @private | |
| */ | |
| AccordionMenu.prototype._events = function() { | |
| var _this = this; | |
| this.$element.find('li').each(function() { | |
| var $submenu = $(this).children('[data-submenu]'); | |
| if ($submenu.length) { | |
| $(this).children('a').off('click.zf.accordionMenu').on('click.zf.accordionMenu', function(e) { | |
| e.preventDefault(); | |
| _this.toggle($submenu); | |
| }); | |
| } | |
| }).on('keydown.zf.accordionmenu', function(e){ | |
| var $element = $(this), | |
| $elements = $element.parent('ul').children('li'), | |
| $prevElement, | |
| $nextElement, | |
| $target = $element.children('[data-submenu]'); | |
| $elements.each(function(i) { | |
| if ($(this).is($element)) { | |
| $prevElement = $elements.eq(Math.max(0, i-1)); | |
| $nextElement = $elements.eq(Math.min(i+1, $elements.length-1)); | |
| if ($(this).children('[data-submenu]:visible').length) { // has open sub menu | |
| $nextElement = $element.find('li:first-child'); | |
| } | |
| if ($(this).is(':first-child')) { // is first element of sub menu | |
| $prevElement = $element.parents('li').first(); | |
| } else if ($prevElement.children('[data-submenu]:visible').length) { // if previous element has open sub menu | |
| $prevElement = $prevElement.find('li:last-child'); | |
| } | |
| if ($(this).is(':last-child')) { // is last element of sub menu | |
| $nextElement = $element.parents('li').first().next('li'); | |
| } | |
| return; | |
| } | |
| }); | |
| Foundation.Keyboard.handleKey(e, 'AccordionMenu', { | |
| open: function() { | |
| if ($target.is(':hidden')) { | |
| _this.down($target); | |
| $target.find('li').first().focus(); | |
| } | |
| }, | |
| close: function() { | |
| if ($target.length && !$target.is(':hidden')) { // close active sub of this item | |
| _this.up($target); | |
| } else if ($element.parent('[data-submenu]').length) { // close currently open sub | |
| _this.up($element.parent('[data-submenu]')); | |
| $element.parents('li').first().focus(); | |
| } | |
| }, | |
| up: function() { | |
| $prevElement.focus(); | |
| }, | |
| down: function() { | |
| $nextElement.focus(); | |
| }, | |
| toggle: function() { | |
| if ($element.children('[data-submenu]').length) { | |
| _this.toggle($element.children('[data-submenu]')); | |
| } | |
| }, | |
| closeAll: function() { | |
| _this.hideAll(); | |
| }, | |
| handled: function() { | |
| e.preventDefault(); | |
| e.stopImmediatePropagation(); | |
| } | |
| }); | |
| });//.attr('tabindex', 0); | |
| }; | |
| /** | |
| * Closes all panes of the menu. | |
| * @function | |
| */ | |
| AccordionMenu.prototype.hideAll = function(){ | |
| this.$element.find('[data-submenu]').slideUp(this.options.slideSpeed); | |
| }; | |
| /** | |
| * Toggles the open/close state of a submenu. | |
| * @function | |
| * @param {jQuery} $target - the submenu to toggle | |
| */ | |
| AccordionMenu.prototype.toggle = function($target){ | |
| if(!$target.is(':animated')) { | |
| if (!$target.is(':hidden')) { | |
| this.up($target); | |
| } | |
| else { | |
| this.down($target); | |
| } | |
| } | |
| }; | |
| /** | |
| * Opens the sub-menu defined by `$target`. | |
| * @param {jQuery} $target - Sub-menu to open. | |
| * @fires AccordionMenu#down | |
| */ | |
| AccordionMenu.prototype.down = function($target) { | |
| var _this = this; | |
| if(!this.options.multiOpen){ | |
| this.up(this.$element.find('.is-active').not($target.parentsUntil(this.$element).add($target))); | |
| } | |
| $target.addClass('is-active').attr({'aria-hidden': false}) | |
| .parent('.is-accordion-submenu-parent').attr({'aria-expanded': true}); | |
| Foundation.Move(this.options.slideSpeed, $target, function(){ | |
| $target.slideDown(_this.options.slideSpeed, function () { | |
| /** | |
| * Fires when the menu is done opening. | |
| * @event AccordionMenu#down | |
| */ | |
| _this.$element.trigger('down.zf.accordionMenu', [$target]); | |
| }); | |
| }); | |
| }; | |
| /** | |
| * Closes the sub-menu defined by `$target`. All sub-menus inside the target will be closed as well. | |
| * @param {jQuery} $target - Sub-menu to close. | |
| * @fires AccordionMenu#up | |
| */ | |
| AccordionMenu.prototype.up = function($target) { | |
| var _this = this; | |
| Foundation.Move(this.options.slideSpeed, $target, function(){ | |
| $target.slideUp(_this.options.slideSpeed, function () { | |
| /** | |
| * Fires when the menu is done collapsing up. | |
| * @event AccordionMenu#up | |
| */ | |
| _this.$element.trigger('up.zf.accordionMenu', [$target]); | |
| }); | |
| }); | |
| var $menus = $target.find('[data-submenu]').slideUp(0).addBack().attr('aria-hidden', true); | |
| $menus.parent('.is-accordion-submenu-parent').attr('aria-expanded', false); | |
| }; | |
| /** | |
| * Destroys an instance of accordion menu. | |
| * @fires AccordionMenu#destroyed | |
| */ | |
| AccordionMenu.prototype.destroy = function(){ | |
| this.$element.find('[data-submenu]').slideDown(0).css('display', ''); | |
| this.$element.find('a').off('click.zf.accordionMenu'); | |
| Foundation.Nest.Burn(this.$element, 'accordion'); | |
| Foundation.unregisterPlugin(this); | |
| }; | |
| Foundation.plugin(AccordionMenu, 'AccordionMenu'); | |
| }(jQuery, window.Foundation); | |
| /** | |
| * Drilldown module. | |
| * @module foundation.drilldown | |
| * @requires foundation.util.keyboard | |
| * @requires foundation.util.motion | |
| * @requires foundation.util.nest | |
| */ | |
| !function($, Foundation){ | |
| 'use strict'; | |
| /** | |
| * Creates a new instance of a drilldown menu. | |
| * @class | |
| * @param {jQuery} element - jQuery object to make into an accordion menu. | |
| * @param {Object} options - Overrides to the default plugin settings. | |
| */ | |
| function Drilldown(element, options){ | |
| this.$element = element; | |
| this.options = $.extend({}, Drilldown.defaults, this.$element.data(), options); | |
| Foundation.Nest.Feather(this.$element, 'drilldown'); | |
| this._init(); | |
| Foundation.registerPlugin(this, 'Drilldown'); | |
| Foundation.Keyboard.register('Drilldown', { | |
| 'ENTER': 'open', | |
| 'SPACE': 'open', | |
| 'ARROW_RIGHT': 'next', | |
| 'ARROW_UP': 'up', | |
| 'ARROW_DOWN': 'down', | |
| 'ARROW_LEFT': 'previous', | |
| 'ESCAPE': 'close', | |
| 'TAB': 'down', | |
| 'SHIFT_TAB': 'up' | |
| }); | |
| } | |
| Drilldown.defaults = { | |
| /** | |
| * Markup used for JS generated back button. Prepended to submenu lists and deleted on `destroy` method, 'js-drilldown-back' class required. Remove the backslash (`\`) if copy and pasting. | |
| * @option | |
| * @example '<\li><\a>Back<\/a><\/li>' | |
| */ | |
| backButton: '<li class="js-drilldown-back"><a>Back</a></li>', | |
| /** | |
| * Markup used to wrap drilldown menu. Use a class name for independent styling; the JS applied class: `is-drilldown` is required. Remove the backslash (`\`) if copy and pasting. | |
| * @option | |
| * @example '<\div class="is-drilldown"><\/div>' | |
| */ | |
| wrapper: '<div></div>', | |
| /** | |
| * Allow the menu to return to root list on body click. | |
| * @option | |
| * @example false | |
| */ | |
| closeOnClick: false | |
| // holdOpen: false | |
| }; | |
| /** | |
| * Initializes the drilldown by creating jQuery collections of elements | |
| * @private | |
| */ | |
| Drilldown.prototype._init = function(){ | |
| this.$submenuAnchors = this.$element.find('li.is-drilldown-submenu-parent'); | |
| this.$submenus = this.$submenuAnchors.children('[data-submenu]'); | |
| this.$menuItems = this.$element.find('li').not('.js-drilldown-back').attr('role', 'menuitem'); | |
| this._prepareMenu(); | |
| this._keyboardEvents(); | |
| }; | |
| /** | |
| * prepares drilldown menu by setting attributes to links and elements | |
| * sets a min height to prevent content jumping | |
| * wraps the element if not already wrapped | |
| * @private | |
| * @function | |
| */ | |
| Drilldown.prototype._prepareMenu = function(){ | |
| var _this = this; | |
| // if(!this.options.holdOpen){ | |
| // this._menuLinkEvents(); | |
| // } | |
| this.$submenuAnchors.each(function(){ | |
| var $sub = $(this); | |
| var $link = $sub.find('a:first'); | |
| $link.data('savedHref', $link.attr('href')).removeAttr('href'); | |
| $sub.children('[data-submenu]') | |
| .attr({ | |
| 'aria-hidden': true, | |
| 'tabindex': 0, | |
| 'role': 'menu' | |
| }); | |
| _this._events($sub); | |
| }); | |
| this.$submenus.each(function(){ | |
| var $menu = $(this), | |
| $back = $menu.find('.js-drilldown-back'); | |
| if(!$back.length){ | |
| $menu.prepend(_this.options.backButton); | |
| } | |
| _this._back($menu); | |
| }); | |
| if(!this.$element.parent().hasClass('is-drilldown')){ | |
| this.$wrapper = $(this.options.wrapper).addClass('is-drilldown').css(this._getMaxDims()); | |
| this.$element.wrap(this.$wrapper); | |
| } | |
| }; | |
| /** | |
| * Adds event handlers to elements in the menu. | |
| * @function | |
| * @private | |
| * @param {jQuery} $elem - the current menu item to add handlers to. | |
| */ | |
| Drilldown.prototype._events = function($elem){ | |
| var _this = this; | |
| $elem.off('click.zf.drilldown') | |
| .on('click.zf.drilldown', function(e){ | |
| if($(e.target).parentsUntil('ul', 'li').hasClass('is-drilldown-submenu-parent')){ | |
| e.stopImmediatePropagation(); | |
| e.preventDefault(); | |
| } | |
| // if(e.target !== e.currentTarget.firstElementChild){ | |
| // return false; | |
| // } | |
| _this._show($elem); | |
| if(_this.options.closeOnClick){ | |
| var $body = $('body').not(_this.$wrapper); | |
| $body.off('.zf.drilldown').on('click.zf.drilldown', function(e){ | |
| e.preventDefault(); | |
| _this._hideAll(); | |
| $body.off('.zf.drilldown'); | |
| }); | |
| } | |
| }); | |
| }; | |
| /** | |
| * Adds keydown event listener to `li`'s in the menu. | |
| * @private | |
| */ | |
| Drilldown.prototype._keyboardEvents = function() { | |
| var _this = this; | |
| this.$menuItems.add(this.$element.find('.js-drilldown-back')).on('keydown.zf.drilldown', function(e){ | |
| var $element = $(this), | |
| $elements = $element.parent('ul').children('li'), | |
| $prevElement, | |
| $nextElement; | |
| $elements.each(function(i) { | |
| if ($(this).is($element)) { | |
| $prevElement = $elements.eq(Math.max(0, i-1)); | |
| $nextElement = $elements.eq(Math.min(i+1, $elements.length-1)); | |
| return; | |
| } | |
| }); | |
| Foundation.Keyboard.handleKey(e, 'Drilldown', { | |
| next: function() { | |
| if ($element.is(_this.$submenuAnchors)) { | |
| _this._show($element); | |
| $element.on(Foundation.transitionend($element), function(){ | |
| $element.find('ul li').filter(_this.$menuItems).first().focus(); | |
| }); | |
| } | |
| }, | |
| previous: function() { | |
| _this._hide($element.parent('ul')); | |
| $element.parent('ul').on(Foundation.transitionend($element), function(){ | |
| setTimeout(function() { | |
| $element.parent('ul').parent('li').focus(); | |
| }, 1); | |
| }); | |
| }, | |
| up: function() { | |
| $prevElement.focus(); | |
| }, | |
| down: function() { | |
| $nextElement.focus(); | |
| }, | |
| close: function() { | |
| _this._back(); | |
| //_this.$menuItems.first().focus(); // focus to first element | |
| }, | |
| open: function() { | |
| if (!$element.is(_this.$menuItems)) { // not menu item means back button | |
| _this._hide($element.parent('ul')); | |
| setTimeout(function(){$element.parent('ul').parent('li').focus();}, 1); | |
| } else if ($element.is(_this.$submenuAnchors)) { | |
| _this._show($element); | |
| setTimeout(function(){$element.find('ul li').filter(_this.$menuItems).first().focus();}, 1); | |
| } | |
| }, | |
| handled: function() { | |
| e.preventDefault(); | |
| e.stopImmediatePropagation(); | |
| } | |
| }); | |
| }); // end keyboardAccess | |
| }; | |
| /** | |
| * Closes all open elements, and returns to root menu. | |
| * @function | |
| * @fires Drilldown#closed | |
| */ | |
| Drilldown.prototype._hideAll = function(){ | |
| var $elem = this.$element.find('.is-drilldown-submenu.is-active').addClass('is-closing'); | |
| $elem.one(Foundation.transitionend($elem), function(e){ | |
| $elem.removeClass('is-active is-closing'); | |
| }); | |
| /** | |
| * Fires when the menu is fully closed. | |
| * @event Drilldown#closed | |
| */ | |
| this.$element.trigger('closed.zf.drilldown'); | |
| }; | |
| /** | |
| * Adds event listener for each `back` button, and closes open menus. | |
| * @function | |
| * @fires Drilldown#back | |
| * @param {jQuery} $elem - the current sub-menu to add `back` event. | |
| */ | |
| Drilldown.prototype._back = function($elem){ | |
| var _this = this; | |
| $elem.off('click.zf.drilldown'); | |
| $elem.children('.js-drilldown-back') | |
| .on('click.zf.drilldown', function(e){ | |
| e.stopImmediatePropagation(); | |
| // console.log('mouseup on back'); | |
| _this._hide($elem); | |
| }); | |
| }; | |
| /** | |
| * Adds event listener to menu items w/o submenus to close open menus on click. | |
| * @function | |
| * @private | |
| */ | |
| Drilldown.prototype._menuLinkEvents = function(){ | |
| var _this = this; | |
| this.$menuItems.not('.is-drilldown-submenu-parent') | |
| .off('click.zf.drilldown') | |
| .on('click.zf.drilldown', function(e){ | |
| // e.stopImmediatePropagation(); | |
| setTimeout(function(){ | |
| _this._hideAll(); | |
| }, 0); | |
| }); | |
| }; | |
| /** | |
| * Opens a submenu. | |
| * @function | |
| * @fires Drilldown#open | |
| * @param {jQuery} $elem - the current element with a submenu to open. | |
| */ | |
| Drilldown.prototype._show = function($elem){ | |
| $elem.children('[data-submenu]').addClass('is-active'); | |
| this.$element.trigger('open.zf.drilldown', [$elem]); | |
| }; | |
| /** | |
| * Hides a submenu | |
| * @function | |
| * @fires Drilldown#hide | |
| * @param {jQuery} $elem - the current sub-menu to hide. | |
| */ | |
| Drilldown.prototype._hide = function($elem){ | |
| var _this = this; | |
| $elem.addClass('is-closing') | |
| .one(Foundation.transitionend($elem), function(){ | |
| $elem.removeClass('is-active is-closing'); | |
| }); | |
| /** | |
| * Fires when the submenu is has closed. | |
| * @event Drilldown#hide | |
| */ | |
| $elem.trigger('hide.zf.drilldown', [$elem]); | |
| }; | |
| /** | |
| * Iterates through the nested menus to calculate the min-height, and max-width for the menu. | |
| * Prevents content jumping. | |
| * @function | |
| * @private | |
| */ | |
| Drilldown.prototype._getMaxDims = function(){ | |
| var max = 0, result = {}; | |
| this.$submenus.add(this.$element).each(function(){ | |
| var numOfElems = $(this).children('li').length; | |
| max = numOfElems > max ? numOfElems : max; | |
| }); | |
| result.height = max * this.$menuItems[0].getBoundingClientRect().height + 'px'; | |
| result.width = this.$element[0].getBoundingClientRect().width + 'px'; | |
| return result; | |
| }; | |
| /** | |
| * Destroys the Drilldown Menu | |
| * @function | |
| */ | |
| Drilldown.prototype.destroy = function(){ | |
| this._hideAll(); | |
| Foundation.Nest.Burn(this.$element, 'drilldown'); | |
| this.$element.unwrap() | |
| .find('.js-drilldown-back').remove() | |
| .end().find('.is-active, .is-closing, .is-drilldown-submenu').removeClass('is-active is-closing is-drilldown-submenu') | |
| .end().find('[data-submenu]').removeAttr('aria-hidden tabindex role') | |
| .off('.zf.drilldown').end().off('zf.drilldown'); | |
| this.$element.find('a').each(function(){ | |
| var $link = $(this); | |
| if($link.data('savedHref')){ | |
| $link.attr('href', $link.data('savedHref')).removeData('savedHref'); | |
| }else{ return; } | |
| }); | |
| Foundation.unregisterPlugin(this); | |
| }; | |
| Foundation.plugin(Drilldown, 'Drilldown'); | |
| }(jQuery, window.Foundation); | |
| /** | |
| * Dropdown module. | |
| * @module foundation.dropdown | |
| * @requires foundation.util.keyboard | |
| * @requires foundation.util.box | |
| * @requires foundation.util.triggers | |
| */ | |
| !function($, Foundation){ | |
| 'use strict'; | |
| /** | |
| * Creates a new instance of a dropdown. | |
| * @class | |
| * @param {jQuery} element - jQuery object to make into a dropdown. | |
| * Objec |
View raw
(Sorry about that, but we can’t show files that are this big right now.)
View raw
(Sorry about that, but we can’t show files that are this big right now.)
View raw
(Sorry about that, but we can’t show files that are this big right now.)
View raw
(Sorry about that, but we can’t show files that are this big right now.)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment



