Audio Player
A clean audio player for podcasts, narrated articles, lessons and sample previews. Choose an MP3 or WAV from the Media Library, pick Compact or Card and a Light, Dark or Inherit theme. Works with the keyboard and screen readers, fits down to 320 px, and offers an optional download, a remembered position and English or Polish controls. Everything is set in the Etch props panel.
Paste it on the Etch canvas with Ctrl+V or ⌘V, then click Save.
{"type":"block","gutenbergBlock":{"blockName":"etch/component","attrs":{"metadata":{"name":"audio-player export"},"ref":156,"attributes":{}},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]},"timestamp":"2026-10-12T22:25:24.066Z","styles":{"aclijvb":{"type":"class","selector":".ed-audio-player","collection":"default","css":"/* ED Audio Player 1.0.0-beta.2\n Copyright 2026 Tom Chmiel, https://etchdeveloper.com\n SPDX-License-Identifier: FSL-1.1-MIT (https://etchdeveloper.com/license/)\n Player controls: Media Chrome 4.19.2, Copyright (c) 2020 Mux, Inc., MIT License.\n The full MIT notice travels in this component's controls script. */\n\n /* Optional customization: uncomment only the overrides you need. These lines are\n documentation, not active declarations, so values set on an ancestor, on :root\n or on one instance's class keep working. \"theme\" means the Theme prop decides.\n Limit an override to one theme with .ed-audio-player[data-ed-audio-theme=\"dark\"].\n\n Container\n --ed-audio-player-surface: theme;\n --ed-audio-player-color: theme;\n --ed-audio-player-muted-color: theme;\n --ed-audio-player-border: 1px solid var(--ed-audio-player-border-color);\n --ed-audio-player-border-color: theme;\n --ed-audio-player-radius: var(--radius, 0.75rem);\n --ed-audio-player-shadow: theme;\n --ed-audio-player-padding: var(--space-s, 1rem), Card var(--space-m, 1.5rem);\n --ed-audio-player-gap: var(--space-xs, 0.75rem), Compact rows 4px, Card groups 8px;\n --ed-audio-player-max-width: 100%;\n --ed-audio-player-font-family: inherit;\n --ed-audio-player-text-size: var(--text-m, 1rem);\n --ed-audio-player-line-height: 1.4;\n\n Title, artist and artwork\n --ed-audio-player-title-color: inherit;\n --ed-audio-player-title-font-family: inherit;\n --ed-audio-player-title-size: 1em, Card var(--text-l, 1.25rem);\n --ed-audio-player-title-weight: var(--heading-font-weight, 600);\n --ed-audio-player-artist-color: var(--ed-audio-player-muted-color);\n --ed-audio-player-artist-size: var(--text-s, 0.875rem);\n --ed-audio-player-artwork-size: 64px, Card 96px;\n --ed-audio-player-artwork-radius: calc(var(--ed-audio-player-radius) * 0.75);\n\n Play button and accent\n --ed-audio-player-accent: theme;\n --ed-audio-player-accent-hover: theme;\n --ed-audio-player-accent-contrast: theme;\n --ed-audio-player-play-size: 48px, Card 56px;\n --ed-audio-player-play-radius: 999px;\n --ed-audio-player-play-icon-size: 24px;\n\n Other controls\n --ed-audio-player-control-color: inherit;\n --ed-audio-player-control-hover-background: color-mix(in oklch, currentColor 12%, transparent);\n --ed-audio-player-chip-background: color-mix(in oklch, currentColor 7%, transparent);\n --ed-audio-player-control-size: 44px;\n --ed-audio-player-control-radius: 999px;\n --ed-audio-player-control-gap: 4px, timeline/time 8px, Card transport 12px;\n --ed-audio-player-icon-size: 24px;\n\n Timeline, volume and time\n --ed-audio-player-track-color: color-mix(in oklch, currentColor 18%, transparent);\n --ed-audio-player-buffered-color: color-mix(in oklch, currentColor 16%, transparent);\n --ed-audio-player-progress-color: var(--ed-audio-player-accent);\n --ed-audio-player-thumb-color: var(--ed-audio-player-progress-color);\n --ed-audio-player-track-height: 6px;\n --ed-audio-player-track-radius: 999px;\n --ed-audio-player-thumb-size: 14px;\n --ed-audio-player-volume-width: 88px;\n --ed-audio-player-time-color: var(--ed-audio-player-muted-color);\n --ed-audio-player-time-size: var(--text-s, 0.875rem);\n\n Focus, tooltips, errors and motion\n --ed-audio-player-focus-color: theme;\n --ed-audio-player-focus-width: 2px;\n --ed-audio-player-focus-offset: 2px;\n --ed-audio-player-tooltip-background: theme;\n --ed-audio-player-tooltip-color: theme;\n --ed-audio-player-error-color: theme;\n --ed-audio-player-transition: var(--transition, 0.2s ease);\n */\n\n /* Private theme and layout presets. Public tokens are resolved where they are used. */\n --_ed-audio-player-surface: color-mix(in oklch, currentColor 5%, transparent);\n /* Inherit keeps secondary text at full strength: the page text may already be muted. */\n --_ed-audio-player-muted: currentColor;\n --_ed-audio-player-line: color-mix(in oklch, currentColor 14%, transparent);\n --_ed-audio-player-shadow: none;\n --_ed-audio-player-accent: var(--primary, #2456a6);\n --_ed-audio-player-accent-hover: var(--primary-hover, color-mix(in oklch, var(--primary, #2456a6) 85%, #000));\n --_ed-audio-player-accent-contrast: var(--white, #fff);\n --_ed-audio-player-focus: var(--focus-color, currentColor);\n --_ed-audio-player-tip-bg: var(--text-dark, #1b1e24);\n --_ed-audio-player-tip-ink: var(--white, #fff);\n --_ed-audio-player-error: #b3261e;\n --_ed-audio-player-padding: var(--space-s, 1rem);\n --_ed-audio-player-artwork-size: 64px;\n --_ed-audio-player-play-size: 48px;\n --_ed-audio-player-title-size: 1em;\n --_ed-audio-player-motion: var(--ed-audio-player-transition, var(--transition, 0.2s ease));\n\n /* Media Chrome reads these inside its controls. */\n --media-primary-color: currentColor;\n --media-secondary-color: transparent;\n --media-text-color: currentColor;\n --media-icon-color: currentColor;\n --media-control-background: transparent;\n --media-control-hover-background: var(--ed-audio-player-control-hover-background, color-mix(in oklch, currentColor 12%, transparent));\n --media-control-height: 24px;\n --media-control-padding: 10px;\n --media-focus-box-shadow: none;\n --media-tooltip-background-color: var(--ed-audio-player-tooltip-background, var(--_ed-audio-player-tip-bg));\n --media-tooltip-border-radius: 6px;\n --media-tooltip-distance: 8px;\n --media-tooltip-filter: drop-shadow(0 2px 6px rgb(0 0 0 / 0.2));\n\n box-sizing: border-box;\n inline-size: 100%;\n min-inline-size: 0;\n max-inline-size: var(--ed-audio-player-max-width, 100%);\n padding: var(--ed-audio-player-padding, var(--_ed-audio-player-padding));\n border: var(--ed-audio-player-border, 1px solid var(--ed-audio-player-border-color, var(--_ed-audio-player-line)));\n border-radius: var(--ed-audio-player-radius, var(--radius, 0.75rem));\n background: var(--ed-audio-player-surface, var(--_ed-audio-player-surface));\n box-shadow: var(--ed-audio-player-shadow, var(--_ed-audio-player-shadow));\n color: var(--ed-audio-player-color, inherit);\n font-family: var(--ed-audio-player-font-family, inherit);\n font-size: var(--ed-audio-player-text-size, var(--text-m, 1rem));\n line-height: var(--ed-audio-player-line-height, 1.4);\n\n /* Inherit on a dark section: the runtime sees light inherited text. */\n &[data-ed-audio-context='dark']:not([data-ed-audio-theme='light'], [data-ed-audio-theme='dark']) {\n --_ed-audio-player-accent: var(--primary-light, #9ab6f5);\n --_ed-audio-player-accent-hover: var(--primary-ultra-light, color-mix(in oklch, var(--primary-light, #9ab6f5) 70%, #fff));\n --_ed-audio-player-accent-contrast: var(--primary-ultra-dark, #0b1730);\n --_ed-audio-player-focus: currentColor;\n --_ed-audio-player-tip-bg: var(--text-light, #f3f4f6);\n --_ed-audio-player-tip-ink: var(--text-dark, #1b1e24);\n --_ed-audio-player-error: #ffb4ab;\n }\n &[data-ed-audio-theme='light'] {\n --_ed-audio-player-surface: var(--bg-ultra-light, #fff);\n --_ed-audio-player-muted: var(--text-dark-muted, #5b6270);\n --_ed-audio-player-line: color-mix(in oklch, var(--text-dark, #1b1e24) 12%, transparent);\n --_ed-audio-player-shadow: var(--box-shadow-1, 0 1px 2px rgb(16 24 40 / 0.06), 0 12px 32px -12px rgb(16 24 40 / 0.2));\n --_ed-audio-player-focus: var(--focus-color, var(--primary, #2456a6));\n color-scheme: light;\n color: var(--ed-audio-player-color, var(--text-dark, #1b1e24));\n }\n &[data-ed-audio-theme='dark'] {\n --_ed-audio-player-surface: var(--bg-dark, #1b1f26);\n --_ed-audio-player-muted: var(--text-light-muted, #aab1bc);\n --_ed-audio-player-line: color-mix(in oklch, var(--text-light, #f3f4f6) 14%, transparent);\n --_ed-audio-player-shadow: var(--box-shadow-1, 0 1px 2px rgb(0 0 0 / 0.3), 0 12px 32px -12px rgb(0 0 0 / 0.5));\n --_ed-audio-player-accent: var(--primary-light, #9ab6f5);\n --_ed-audio-player-accent-hover: var(--primary-ultra-light, color-mix(in oklch, var(--primary-light, #9ab6f5) 70%, #fff));\n --_ed-audio-player-accent-contrast: var(--primary-ultra-dark, #0b1730);\n --_ed-audio-player-focus: var(--primary-light, #9ab6f5);\n --_ed-audio-player-tip-bg: var(--text-light, #f3f4f6);\n --_ed-audio-player-tip-ink: var(--text-dark, #1b1e24);\n --_ed-audio-player-error: #ffb4ab;\n color-scheme: dark;\n color: var(--ed-audio-player-color, var(--text-light, #f3f4f6));\n }\n &[data-ed-audio-layout='card'] {\n --_ed-audio-player-padding: var(--space-m, 1.5rem);\n --_ed-audio-player-artwork-size: 96px;\n --_ed-audio-player-play-size: 56px;\n --_ed-audio-player-title-size: var(--text-l, 1.25rem);\n }\n\n & *, & *::before, & *::after { box-sizing: border-box; }\n\n & .ed-audio-player__header {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--ed-audio-player-gap, var(--space-xs, 0.75rem));\n margin-block-end: var(--ed-audio-player-gap, var(--space-xs, 0.75rem));\n min-inline-size: 0;\n }\n & .ed-audio-player__artwork {\n flex: 0 0 auto;\n inline-size: var(--ed-audio-player-artwork-size, var(--_ed-audio-player-artwork-size));\n aspect-ratio: 1;\n overflow: hidden;\n border-radius: var(--ed-audio-player-artwork-radius, calc(var(--ed-audio-player-radius, var(--radius, 0.75rem)) * 0.75));\n background: var(--ed-audio-player-chip-background, color-mix(in oklch, currentColor 7%, transparent));\n }\n & .ed-audio-player__image {\n display: block;\n inline-size: 100%;\n block-size: 100%;\n object-fit: cover;\n border-radius: inherit;\n }\n /* Below about 10rem of text room the title moves under the artwork. */\n & .ed-audio-player__meta {\n flex: 1 1 10rem;\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 2px;\n min-inline-size: 0;\n overflow-wrap: anywhere;\n }\n & .ed-audio-player__title,\n & .ed-audio-player__artist {\n /* Etch's paragraph reset declares break-word, overriding inherited wrapping. */\n min-inline-size: 0;\n max-inline-size: none;\n overflow-wrap: anywhere;\n margin: 0;\n padding: 0;\n font-style: normal;\n text-transform: none;\n }\n & .ed-audio-player__title {\n color: var(--ed-audio-player-title-color, inherit);\n font-family: var(--ed-audio-player-title-font-family, inherit);\n font-size: var(--ed-audio-player-title-size, var(--_ed-audio-player-title-size));\n font-weight: var(--ed-audio-player-title-weight, var(--heading-font-weight, 600));\n line-height: 1.25;\n }\n & .ed-audio-player__artist {\n color: var(--ed-audio-player-artist-color, var(--ed-audio-player-muted-color, var(--_ed-audio-player-muted)));\n font-family: inherit;\n font-size: var(--ed-audio-player-artist-size, var(--text-s, 0.875rem));\n font-weight: 400;\n line-height: 1.4;\n }\n\n & .ed-audio-player__controller {\n display: block;\n inline-size: 100%;\n min-inline-size: 0;\n overflow: visible;\n background: transparent;\n line-height: inherit;\n }\n & .ed-audio-player__controls {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--ed-audio-player-gap, 4px) var(--ed-audio-player-gap, var(--space-xs, 0.75rem));\n inline-size: 100%;\n min-inline-size: 0;\n }\n & .ed-audio-player__transport,\n & .ed-audio-player__progress,\n & .ed-audio-player__utilities {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--ed-audio-player-control-gap, 4px);\n min-inline-size: 0;\n background: transparent;\n }\n /* Enlarged time text can move below the timeline instead of widening the page. */\n & .ed-audio-player__progress { flex: 1 1 14rem; gap: var(--ed-audio-player-control-gap, 8px); }\n & .ed-audio-player__timeline { flex: 1 1 5rem; min-inline-size: 44px; }\n & .ed-audio-player__utilities { margin-inline-start: auto; }\n\n /* Media Chrome sets its own font on each control; use the player's font instead. */\n & .ed-audio-player__play,\n & .ed-audio-player__back,\n & .ed-audio-player__forward,\n & .ed-audio-player__mute,\n & .ed-audio-player__rate,\n & .ed-audio-player__time { font-family: inherit; }\n\n /* Seek, mute and rate: quiet round buttons. */\n & .ed-audio-player__back,\n & .ed-audio-player__forward,\n & .ed-audio-player__mute,\n & .ed-audio-player__rate {\n justify-content: center;\n min-inline-size: var(--ed-audio-player-control-size, 44px);\n block-size: var(--ed-audio-player-control-size, 44px);\n padding: 0;\n border-radius: var(--ed-audio-player-control-radius, 999px);\n background: transparent;\n color: var(--ed-audio-player-control-color, inherit);\n --media-button-icon-width: var(--ed-audio-player-icon-size, 24px);\n --media-button-icon-height: var(--ed-audio-player-icon-size, 24px);\n transition: background-color var(--_ed-audio-player-motion), color var(--_ed-audio-player-motion);\n }\n & .ed-audio-player__back,\n & .ed-audio-player__forward,\n & .ed-audio-player__mute { inline-size: var(--ed-audio-player-control-size, 44px); }\n & .ed-audio-player__rate {\n padding-inline: 10px;\n background: var(--ed-audio-player-chip-background, color-mix(in oklch, currentColor 7%, transparent));\n font-size: var(--text-s, 0.875rem);\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n }\n & .ed-audio-player__back:hover,\n & .ed-audio-player__forward:hover,\n & .ed-audio-player__mute:hover,\n & .ed-audio-player__rate:hover {\n background: var(--ed-audio-player-control-hover-background, color-mix(in oklch, currentColor 12%, transparent));\n }\n\n /* Play: the one filled accent control. */\n & .ed-audio-player__play {\n flex: none;\n justify-content: center;\n inline-size: var(--ed-audio-player-play-size, var(--_ed-audio-player-play-size));\n block-size: var(--ed-audio-player-play-size, var(--_ed-audio-player-play-size));\n padding: 0;\n border-radius: var(--ed-audio-player-play-radius, 999px);\n background: var(--ed-audio-player-accent, var(--_ed-audio-player-accent));\n /* The host keeps the text color so currentColor focus rings stay visible. */\n color: inherit;\n --media-icon-color: var(--ed-audio-player-accent-contrast, var(--_ed-audio-player-accent-contrast));\n --media-button-icon-width: var(--ed-audio-player-play-icon-size, 24px);\n --media-button-icon-height: var(--ed-audio-player-play-icon-size, 24px);\n transition: background-color var(--_ed-audio-player-motion), transform var(--_ed-audio-player-motion);\n }\n & .ed-audio-player__play:hover { background: var(--ed-audio-player-accent-hover, var(--_ed-audio-player-accent-hover)); }\n & .ed-audio-player__play:active { transform: scale(0.96); }\n\n & .ed-audio-player__timeline,\n & .ed-audio-player__volume {\n --media-control-hover-background: transparent;\n --media-range-padding: 10px;\n --media-range-track-height: var(--ed-audio-player-track-height, 6px);\n --media-range-track-border-radius: var(--ed-audio-player-track-radius, 999px);\n --media-range-track-background: var(--ed-audio-player-track-color, color-mix(in oklch, currentColor 18%, transparent));\n --media-range-track-pointer-background: color-mix(in oklch, currentColor 12%, transparent);\n --media-time-range-buffered-color: var(--ed-audio-player-buffered-color, color-mix(in oklch, currentColor 16%, transparent));\n --media-range-bar-color: var(--ed-audio-player-progress-color, var(--ed-audio-player-accent, var(--_ed-audio-player-accent)));\n --media-range-thumb-background: var(--ed-audio-player-thumb-color, var(--ed-audio-player-progress-color, var(--ed-audio-player-accent, var(--_ed-audio-player-accent))));\n --media-range-thumb-width: var(--ed-audio-player-thumb-size, 14px);\n --media-range-thumb-height: var(--ed-audio-player-thumb-size, 14px);\n --media-range-thumb-border-radius: 999px;\n --media-range-thumb-box-shadow: 0 1px 3px rgb(0 0 0 / 0.3);\n /* Ranges draw their own keyboard focus ring from this value. */\n --media-focus-box-shadow: 0 0 0 var(--ed-audio-player-focus-width, 2px) var(--ed-audio-player-focus-color, var(--_ed-audio-player-focus));\n background: transparent;\n border-radius: var(--ed-audio-player-control-radius, 999px);\n /* Media Chrome ranges fill and seek left-to-right; keep them so on RTL pages. */\n direction: ltr;\n /* Media Chrome blocks scrolling on its ranges (touch-action: none). A vertical swipe that starts on a\n slider scrolls the page; the runtime handles taps and sideways drags. */\n touch-action: pan-y pinch-zoom;\n }\n & .ed-audio-player__volume {\n inline-size: var(--ed-audio-player-volume-width, 88px);\n min-inline-size: 44px;\n }\n /* iOS on iPhone keeps the page volume at 100 % (hardware buttons only); Media Chrome marks the slider. */\n & .ed-audio-player__volume[mediavolumeunavailable] { display: none; }\n & .ed-audio-player__time {\n flex: 0 1 auto;\n min-inline-size: 0;\n max-inline-size: 100%;\n padding: 0 4px;\n border-radius: 6px;\n color: var(--ed-audio-player-time-color, var(--ed-audio-player-muted-color, var(--_ed-audio-player-muted)));\n font-size: var(--ed-audio-player-time-size, var(--text-s, 0.875rem));\n font-variant-numeric: tabular-nums;\n white-space: normal;\n overflow-wrap: anywhere;\n /* \"0:00 / 1:32\" keeps its order inside RTL text. */\n direction: ltr;\n unicode-bidi: isolate;\n }\n\n & .ed-audio-player__download {\n --_ed-audio-player-download-icon: url(\"data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v11M7 10l5 5 5-5M5 19h14'%2F%3E%3C%2Fsvg%3E\");\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4em;\n min-block-size: var(--ed-audio-player-control-size, 44px);\n padding: 6px 16px;\n border-radius: var(--ed-audio-player-control-radius, 999px);\n background: var(--ed-audio-player-chip-background, color-mix(in oklch, currentColor 7%, transparent));\n color: var(--ed-audio-player-control-color, inherit);\n font-size: var(--text-s, 0.875rem);\n font-weight: 600;\n line-height: 1.2;\n text-decoration: none;\n overflow-wrap: anywhere;\n transition: background-color var(--_ed-audio-player-motion), color var(--_ed-audio-player-motion);\n }\n & .ed-audio-player__download::before {\n content: \"\";\n flex: none;\n inline-size: 1.15em;\n block-size: 1.15em;\n background: currentColor;\n -webkit-mask: var(--_ed-audio-player-download-icon) center / contain no-repeat;\n mask: var(--_ed-audio-player-download-icon) center / contain no-repeat;\n }\n & .ed-audio-player__download:hover {\n background: var(--ed-audio-player-control-hover-background, color-mix(in oklch, currentColor 12%, transparent));\n color: var(--ed-audio-player-control-color, inherit);\n text-decoration: none;\n }\n\n & .ed-audio-player__status {\n margin: 8px 0 0;\n color: var(--ed-audio-player-muted-color, var(--_ed-audio-player-muted));\n font-size: var(--text-s, 0.875rem);\n }\n &[data-ed-audio-state='error'] .ed-audio-player__status {\n color: var(--ed-audio-player-error-color, var(--_ed-audio-player-error));\n font-weight: 600;\n }\n & .ed-audio-player__fallback {\n display: inline-block;\n margin-block-start: 4px;\n color: inherit;\n font-size: var(--text-s, 0.875rem);\n text-decoration: underline;\n text-underline-offset: 0.2em;\n }\n\n & ::part(tooltip) {\n font-family: inherit;\n color: var(--ed-audio-player-tooltip-color, var(--_ed-audio-player-tip-ink));\n font-size: var(--text-xs, 0.8125rem);\n font-weight: 500;\n }\n & :focus-visible {\n outline: var(--ed-audio-player-focus-width, 2px) solid var(--ed-audio-player-focus-color, var(--_ed-audio-player-focus));\n outline-offset: var(--ed-audio-player-focus-offset, 2px);\n }\n & .ed-audio-player__timeline:focus-visible,\n & .ed-audio-player__volume:focus-visible { outline: none; }\n /* Media Chrome sets --_focus-visible-box-shadow on the range host only for keyboard focus. A site rule such as\n Automatic.css's `:focus { box-shadow: none }` matches the host while its inner slider is focused and would\n cancel that ring, so the component restates it with its own specificity. */\n & .ed-audio-player__timeline:focus-within,\n & .ed-audio-player__volume:focus-within {\n outline: none;\n box-shadow: var(--_focus-visible-box-shadow, none);\n }\n\n /* Compact layout by controller width: one row when wide, utilities on a second\n row when medium, three centered rows when narrow. */\n &:not([data-ed-audio-layout='card']) .ed-audio-player__controller:not([breakpointwide]) .ed-audio-player__utilities {\n flex-basis: 100%;\n justify-content: flex-end;\n }\n &:not([data-ed-audio-layout='card']) .ed-audio-player__controller:not([breakpointmedium]) .ed-audio-player__transport,\n &:not([data-ed-audio-layout='card']) .ed-audio-player__controller:not([breakpointmedium]) .ed-audio-player__utilities {\n flex-basis: 100%;\n justify-content: center;\n margin-inline-start: 0;\n }\n &:not([data-ed-audio-layout='card']) .ed-audio-player__controller:not([breakpointmedium]) .ed-audio-player__progress { flex-basis: 100%; }\n\n &[data-ed-audio-layout='card'] .ed-audio-player__controls {\n flex-direction: column;\n align-items: stretch;\n gap: var(--ed-audio-player-gap, 8px);\n }\n &[data-ed-audio-layout='card'] .ed-audio-player__transport {\n justify-content: center;\n gap: var(--ed-audio-player-control-gap, 12px);\n }\n &[data-ed-audio-layout='card'] .ed-audio-player__progress { flex: 0 0 auto; }\n &[data-ed-audio-layout='card'] .ed-audio-player__utilities {\n flex-basis: auto;\n justify-content: center;\n margin-inline-start: 0;\n }\n\n &[data-ed-audio-audio=''] .ed-audio-player__fallback { display: none; }\n /* A source the server condition withheld has no href: never show a dead link (also without JavaScript). */\n & .ed-audio-player__fallback:not([href]),\n & .ed-audio-player__download:not([href]) { display: none; }\n &[data-ed-audio-show-artwork='false'] .ed-audio-player__artwork,\n &[data-ed-audio-artwork=''] .ed-audio-player__artwork { display: none; }\n &[data-ed-audio-title=''] .ed-audio-player__title,\n &[data-ed-audio-artist=''] .ed-audio-player__artist { display: none; }\n &[data-ed-audio-show-download='false'] .ed-audio-player__download { display: none; }\n /* The controller keeps its width while hidden, so Media Chrome's first size reading is already right; it can\n drop a second reading that arrives quickly, which left wide Compact players in the narrow layout. Its\n contents stay display: none, so the runtime's theme context does not start colour transitions. */\n &:not([data-ed-audio-ready='true']) .ed-audio-player__controller {\n visibility: hidden;\n block-size: 0;\n overflow: hidden;\n }\n &:not([data-ed-audio-ready='true']) .ed-audio-player__controller > * { display: none; }\n &[data-ed-audio-ready='true']:not([data-ed-audio-state='error']) .ed-audio-player__fallback { display: none; }\n &[data-ed-audio-state='empty'] .ed-audio-player__controller { display: none; }\n\n @media (prefers-reduced-motion: reduce) {\n --_ed-audio-player-motion: 0s;\n --media-control-transition-in: none;\n --media-control-transition-out: none;\n --media-range-thumb-transition: none;\n --media-button-icon-transition: none;\n\n & .ed-audio-player__play:active { transform: none; }\n }\n @media (forced-colors: active) {\n /* SVG fill is not reliably recolored with the host's forced background. */\n & .ed-audio-player__play,\n & .ed-audio-player__play:hover {\n --media-icon-color: CanvasText;\n background: Canvas;\n }\n & .ed-audio-player__play,\n & .ed-audio-player__back,\n & .ed-audio-player__forward,\n & .ed-audio-player__mute,\n & .ed-audio-player__rate,\n & .ed-audio-player__download { border: 1px solid ButtonText; }\n & .ed-audio-player__timeline,\n & .ed-audio-player__volume {\n forced-color-adjust: none;\n --media-range-track-background: GrayText;\n --media-time-range-buffered-color: GrayText;\n --media-range-bar-color: Highlight;\n --media-range-thumb-background: Highlight;\n --media-focus-box-shadow: 0 0 0 2px Highlight;\n }\n & :focus-visible { outline-color: Highlight; }\n }\n & [hidden] { display: none; }","readonly":false},"wck57ff":{"type":"class","selector":".ed-audio-player__header","collection":"default","css":"","readonly":false},"93qk1e5":{"type":"class","selector":".ed-audio-player__artwork","collection":"default","css":"","readonly":false},"5towuhp":{"type":"class","selector":".ed-audio-player__image","collection":"default","css":"","readonly":false},"1mcbfxs":{"type":"class","selector":".ed-audio-player__meta","collection":"default","css":"","readonly":false},"1zs7kag":{"type":"class","selector":".ed-audio-player__title","collection":"default","css":"","readonly":false},"blff4wn":{"type":"class","selector":".ed-audio-player__artist","collection":"default","css":"","readonly":false},"h5bdirh":{"type":"class","selector":".ed-audio-player__controller","collection":"default","css":"","readonly":false},"8swo0qy":{"type":"class","selector":".ed-audio-player__media","collection":"default","css":"","readonly":false},"wwgeisx":{"type":"class","selector":".ed-audio-player__controls","collection":"default","css":"","readonly":false},"lp5jyra":{"type":"class","selector":".ed-audio-player__transport","collection":"default","css":"","readonly":false},"1dirzho":{"type":"class","selector":".ed-audio-player__back","collection":"default","css":"","readonly":false},"3gd1z6y":{"type":"class","selector":".ed-audio-player__play","collection":"default","css":"","readonly":false},"1zovyyv":{"type":"class","selector":".ed-audio-player__forward","collection":"default","css":"","readonly":false},"v18bkvg":{"type":"class","selector":".ed-audio-player__progress","collection":"default","css":"","readonly":false},"4ue51om":{"type":"class","selector":".ed-audio-player__timeline","collection":"default","css":"","readonly":false},"hu9dw4c":{"type":"class","selector":".ed-audio-player__time","collection":"default","css":"","readonly":false},"owpsdl2":{"type":"class","selector":".ed-audio-player__utilities","collection":"default","css":"","readonly":false},"je7km66":{"type":"class","selector":".ed-audio-player__mute","collection":"default","css":"","readonly":false},"qm0ap0b":{"type":"class","selector":".ed-audio-player__volume","collection":"default","css":"","readonly":false},"2wrflii":{"type":"class","selector":".ed-audio-player__rate","collection":"default","css":"","readonly":false},"0h8bdaj":{"type":"class","selector":".ed-audio-player__download","collection":"default","css":"","readonly":false},"ml0vw81":{"type":"class","selector":".ed-audio-player__status","collection":"default","css":"","readonly":false},"gddc863":{"type":"class","selector":".ed-audio-player__fallback","collection":"default","css":"","readonly":false}},"components":{"156":{"id":156,"legacyId":"","name":"ED Audio Player","key":"EdAudioPlayer","blocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"ED Audio Player"},"script":{"code":"aWYoZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCJlZC5hdWRpby1wbGF5ZXIudjEiKV0gJiYgKGdsb2JhbFRoaXNbU3ltYm9sLmZvcigiZWQuYXVkaW8tcGxheWVyLnYxIildLnZlcnNpb24gPT09ICIxLjAuMC1iZXRhLjIiIHx8IHR5cGVvZiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoImVkLmF1ZGlvLXBsYXllci52MSIpXS5kaXNwb3NlICE9PSAiZnVuY3Rpb24iKSl7Z2xvYmFsVGhpc1tTeW1ib2wuZm9yKCJlZC5hdWRpby1wbGF5ZXIudjEiKV0uc2NhbigpO31lbHNle2dsb2JhbFRoaXNbU3ltYm9sLmZvcigiZWQuYXVkaW8tcGxheWVyLnYxIildPy5kaXNwb3NlPy4oKTsKLyohIEV0Y2hEZXZlbG9wZXIgRUQgQXVkaW8gUGxheWVyIHdyYXBwZXIuIFRoZSBzaGFyZWQgY29udHJvbHMgc2NyaXB0IGNhcnJpZXMgdGhlIE1lZGlhIENocm9tZSA0LjE5LjIgTUlUIG5vdGljZS4KQ29weXJpZ2h0IDIwMjYgVG9tIENobWllbCwgaHR0cHM6Ly9ldGNoZGV2ZWxvcGVyLmNvbQpTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRlNMLTEuMS1NSVQgKGh0dHBzOi8vZXRjaGRldmVsb3Blci5jb20vbGljZW5zZS8pICovCiJ1c2Ugc3RyaWN0IjsoKCk9Pnt2YXIgZGU9IjEuMC4wLWJldGEuMiIscT0oZSx0LHI9IiIsbik9Pih7a2V5OmUsbmFtZTp0LHR5cGU6e3ByaW1pdGl2ZToic3RyaW5nIiwuLi5uP3tzcGVjaWFsaXplZDpufTp7fX0sZGVmYXVsdDpyfSksVj0oZSx0LHI9ITEpPT4oe2tleTplLG5hbWU6dCx0eXBlOntwcmltaXRpdmU6ImJvb2xlYW4ifSxkZWZhdWx0OnJ9KSxaPShlLHQscik9Pih7Li4ucShlLHQsclswXVsxXSwic2VsZWN0Iiksc2VsZWN0T3B0aW9uc1N0cmluZzpyLm1hcChuPT5uLmpvaW4oIiA6ICIpKS5qb2luKGAKYCl9KSxuZT1bcSgiYXVkaW8iLCJBdWRpbyBGaWxlIiwiIiwiaW1hZ2UiKSxxKCJ0aXRsZSIsIlRpdGxlIikscSgiYXJ0aXN0IiwiQXJ0aXN0IC8gQXV0aG9yIikscSgiYWNjZXNzaWJsZUxhYmVsIiwiQWNjZXNzaWJsZSBMYWJlbCIpLFooImxheW91dCIsIkxheW91dCIsW1siQ29tcGFjdCIsImNvbXBhY3QiXSxbIkNhcmQiLCJjYXJkIl1dKSxaKCJ0aGVtZSIsIlRoZW1lIixbWyJJbmhlcml0IiwiaW5oZXJpdCJdLFsiTGlnaHQiLCJsaWdodCJdLFsiRGFyayIsImRhcmsiXV0pLFYoInNob3dBcnR3b3JrIiwiU2hvdyBBcnR3b3JrIikscSgiYXJ0d29yayIsIkFydHdvcmsiLCIiLCJ3cE1lZGlhSWQiKSxWKCJsb29wIiwiTG9vcCIpLFYoInNob3dEb3dubG9hZCIsIlNob3cgRG93bmxvYWQiKSxxKCJkb3dubG9hZExhYmVsIiwiRG93bmxvYWQgTGFiZWwiLCJEb3dubG9hZCIpLFooImxvYWRNZWRpYSIsIkxvYWQgTWVkaWEiLFtbIldoZW4gVmlzaWJsZSIsInZpc2libGUiXSxbIkVhZ2VyIiwiZWFnZXIiXSxbIk9uIEludGVyYWN0aW9uIiwiaW50ZXJhY3Rpb24iXV0pLFYoImF1dG9QYXVzZU90aGVyUGxheWVycyIsIkF1dG8gUGF1c2UgT3RoZXIgUGxheWVycyIsITApLFooImxhbmd1YWdlIiwiTGFuZ3VhZ2UiLFtbIkF1dG9tYXRpYyIsImF1dG8iXSxbIkVuZ2xpc2giLCJlbiJdLFsiUG9sc2tpIiwicGwiXV0pLFYoInJlc3VtZVBsYXliYWNrIiwiUmVtZW1iZXIgUG9zaXRpb24iKSxxKCJyZXN1bWVLZXkiLCJSZWNvcmRpbmcgSUQiKSxWKCJtZWRpYVNlc3Npb24iLCJTeXN0ZW0gTWVkaWEgQ29udHJvbHMiKV07dmFyIFE9bmUubWFwKGU9PmUua2V5KSxOZT1bImF1ZGlvIl0sSGU9US5maWx0ZXIoZT0+IU5lLmluY2x1ZGVzKGUpKSxJZT1PYmplY3QuZnJvbUVudHJpZXMobmUubWFwKGU9PltlLmtleSxlLmRlZmF1bHRdKSksZWU9ZT0+ImRhdGEtZWQtYXVkaW8tIitlLnJlcGxhY2UoL1tBLVpdL2csdD0+Ii0iK3QudG9Mb3dlckNhc2UoKSk7ZnVuY3Rpb24gYWUoZSx0KXtpZih0eXBlb2YgZSE9InN0cmluZyJ8fCFlLnRyaW0oKXx8L1tcdTAwMDAtXHUwMDFmXHUwMDdme31dLy50ZXN0KGUpKXJldHVybiIiO3RyeXtsZXQgcj1uZXcgVVJMKGUudHJpbSgpLHQpO3JldHVyblsiaHR0cDoiLCJodHRwczoiXS5pbmNsdWRlcyhyLnByb3RvY29sKSYmIXIudXNlcm5hbWUmJiFyLnBhc3N3b3JkP3IuaHJlZjoiIn1jYXRjaHtyZXR1cm4iIn19ZnVuY3Rpb24gcGUoZSx0KXtsZXQgcj17Li4uSWUsLi4uZX0sbj1vPT50eXBlb2Ygbz09InN0cmluZyI/by50cmltKCk6IiI7cmV0dXJuey4uLnIsLi4uT2JqZWN0LmZyb21FbnRyaWVzKG5lLmZpbHRlcihvPT5vLnR5cGUucHJpbWl0aXZlPT09ImJvb2xlYW4iKS5tYXAoKHtrZXk6b30pPT5bbyxyW29dPT09ITB8fHJbb109PT0idHJ1ZSJdKSksc291cmNlOmFlKHIuYXVkaW8sdCksdGl0bGU6bihyLnRpdGxlKSxhcnRpc3Q6bihyLmFydGlzdCksbGFiZWw6bihyLmFjY2Vzc2libGVMYWJlbCl8fG4oci50aXRsZSl8fG4oci5hcnRpc3QpfHwiQXVkaW8gcGxheWVyIixkb3dubG9hZExhYmVsOm4oci5kb3dubG9hZExhYmVsKXx8IkRvd25sb2FkIixsYXlvdXQ6ci5sYXlvdXQ9PT0iY2FyZCI/ImNhcmQiOiJjb21wYWN0Iix0aGVtZTpbImxpZ2h0IiwiZGFyayJdLmluY2x1ZGVzKHIudGhlbWUpP3IudGhlbWU6ImluaGVyaXQiLGxvYWRNZWRpYTpbImVhZ2VyIiwidmlzaWJsZSIsImludGVyYWN0aW9uIl0uaW5jbHVkZXMoci5sb2FkTWVkaWEpP3IubG9hZE1lZGlhOiJ2aXNpYmxlIixsYW5ndWFnZTpbImVuIiwicGwiXS5pbmNsdWRlcyhyLmxhbmd1YWdlKT9yLmxhbmd1YWdlOiJhdXRvIixyZXN1bWVLZXk6bihyLnJlc3VtZUtleSkuc2xpY2UoMCwxMjgpfX12YXIgUj0icHJvcHMuYXVkaW8udHJpbSgpIixKZT1gJHtSfSAhPSAiIiAmJiAhJHtSfS5pbmNsdWRlcygiQCIpICYmICEke1J9LmluY2x1ZGVzKCJ7IikgJiYgISR7Un0uaW5jbHVkZXMoIn0iKSAmJiAhJHtSfS5pbmNsdWRlcygiJiMiKSAmJiAhJHtSfS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCImY29sb24iKSAmJiAoJHtSfS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikgfHwgJHtSfS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSB8fCAhJHtSfS5pbmNsdWRlcygiOiIpKWA7ZnVuY3Rpb24gZmUoZT1nbG9iYWxUaGlzKXtsZXQgdD1TeW1ib2wuZm9yKCJlZC5tZWRpYS5yZWdpc3RyeS52MSIpO2lmKGVbdF0pcmV0dXJuIGVbdF07bGV0IHI9bmV3IFNldDtyZXR1cm4gZVt0XT17cmVnaXN0ZXIobil7cmV0dXJuIHIuYWRkKG4pLCgpPT5yLmRlbGV0ZShuKX0sc3RhcnRlZChuLG8pe2lmKCEoIW98fCFyLmhhcyhuKSkpZm9yKGxldCBjIG9mIHIpYyE9PW4mJmMucGF1c2UoKX0sc2l6ZTooKT0+ci5zaXplfX12YXIgQj17ZW46e3JlZ2lvbjoiQXVkaW8gcGxheWVyIixkb3dubG9hZDoiRG93bmxvYWQiLG9wZW46Ik9wZW4gYXVkaW8gZmlsZSIsZW1wdHk6IlNlbGVjdCBhbiBhdWRpbyBmaWxlLiIsbG9hZGluZzoiTG9hZGluZyBhdWRpb1x1MjAyNiIsZXJyb3I6IlVuYWJsZSB0byBsb2FkIHRoaXMgYXVkaW8uIixibG9ja2VkOiJQcmVzcyBwbGF5IHRvIHN0YXJ0IHRoaXMgYXVkaW8uIixwbGF5OiJwbGF5IixwYXVzZToicGF1c2UiLG11dGU6Im11dGUiLHVubXV0ZToidW5tdXRlIixiYWNrOiJzZWVrIGJhY2sgMTAgc2Vjb25kcyIsZm9yd2FyZDoic2VlayBmb3J3YXJkIDEwIHNlY29uZHMiLHNlZWs6InNlZWsiLHZvbHVtZToidm9sdW1lIixyYXRlOiJQbGF5YmFjayByYXRlIix0aW1lOiJwbGF5YmFjayB0aW1lIix1bmtub3duOiJBdWRpbyBub3QgbG9hZGVkLCB1bmtub3duIHRpbWUuIixyZW1haW5pbmc6InJlbWFpbmluZyIsb2Y6Im9mIn0scGw6e3JlZ2lvbjoiT2R0d2FyemFjeiBhdWRpbyIsZG93bmxvYWQ6IlBvYmllcnoiLG9wZW46Ik90d1x4RjNyeiBwbGlrIGF1ZGlvIixlbXB0eToiV3liaWVyeiBwbGlrIGF1ZGlvLiIsbG9hZGluZzoiV2N6eXR5d2FuaWUgbmFncmFuaWFcdTIwMjYiLGVycm9yOiJOaWUgbW9cdTAxN0NuYSB3Y3p5dGFcdTAxMDcgdGVnbyBuYWdyYW5pYS4iLGJsb2NrZWQ6Ik5hY2lcdTAxNUJuaWogb2R0d2FyemFuaWUsIGFieSByb3pwb2N6XHUwMTA1XHUwMTA3LiIscGxheToiT2R0d1x4RjNyeiIscGF1c2U6IldzdHJ6eW1haiIsbXV0ZToiV3ljaXN6Iix1bm11dGU6IldcdTAxNDJcdTAxMDVjeiBkXHUwMTdBd2lcdTAxMTlrIixiYWNrOiJDb2ZuaWogbyAxMCBzZWt1bmQiLGZvcndhcmQ6IlByemV3aVx1MDE0NCBvIDEwIHNla3VuZCIsc2VlazoiUG96eWNqYSBuYWdyYW5pYSIsdm9sdW1lOiJHXHUwMTQyb1x1MDE1Qm5vXHUwMTVCXHUwMTA3IixyYXRlOiJQclx1MDExOWRrb1x1MDE1Qlx1MDEwNyBvZHR3YXJ6YW5pYSIsdGltZToiQ3phcyBvZHR3YXJ6YW5pYSIsdW5rbm93bjoiTmFncmFuaWUgbmllIHpvc3RhXHUwMTQybyB3Y3p5dGFuZTsgY3phcyBqZXN0IG5pZXpuYW55LiIscmVtYWluaW5nOiJwb3pvc3RhXHUwMTQybyIsb2Y6InoifX0scmU9bmV3IFdlYWtNYXAsJGU9ZT0+U3RyaW5nKGV8fCIiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgiLSIpWzBdPT09InBsIj8icGwiOiJlbiI7ZnVuY3Rpb24gZ2UoZSx0KXtsZXQgcj1yZS5nZXQoZSksbj1lLmdldEF0dHJpYnV0ZSgibGFuZyIpO3I/biE9PXIuYXBwbGllZCYmKHIuYXV0aG9yZWQ9bik6KHI9e2F1dGhvcmVkOm4sYXBwbGllZDp2b2lkIDB9LHJlLnNldChlLHIpKTtsZXQgbz1yLmF1dGhvcmVkPz9lLnBhcmVudEVsZW1lbnQ/LmNsb3Nlc3QoIltsYW5nXSIpPy5nZXRBdHRyaWJ1dGUoImxhbmciKSxjPXQ9PT0icGwifHx0PT09ImVuIj90OiRlKG8pO3JldHVybiByLmFwcGxpZWQ9YyxuIT09YyYmZS5zZXRBdHRyaWJ1dGUoImxhbmciLGMpLGN9ZnVuY3Rpb24gYmUoZSl7bGV0IHQ9cmUuZ2V0KGUpO3QmJihlLmdldEF0dHJpYnV0ZSgibGFuZyIpPT09dC5hcHBsaWVkJiYodC5hdXRob3JlZD09PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGUoImxhbmciKTplLnNldEF0dHJpYnV0ZSgibGFuZyIsdC5hdXRob3JlZCkpLHJlLmRlbGV0ZShlKSl9dmFyIF89KGUsdCxyKT0+e2UmJmUuZ2V0QXR0cmlidXRlKHQpIT09ciYmZS5zZXRBdHRyaWJ1dGUodCxyKX0saWU9KGUsdCk9PntlJiZlLnRleHRDb250ZW50IT09dCYmKGUudGV4dENvbnRlbnQ9dCl9LG1lPWU9PntsZXQgdD1NYXRoLm1heCgwLE1hdGguZmxvb3IoTnVtYmVyLmlzRmluaXRlKGUpP2U6MCkpLHI9TWF0aC5mbG9vcih0LzM2MDApLG49TWF0aC5mbG9vcih0LzYwKSU2MCxvPVN0cmluZyh0JTYwKS5wYWRTdGFydCgyLCIwIik7cmV0dXJuIHI/YCR7cn06JHtTdHJpbmcobikucGFkU3RhcnQoMiwiMCIpfToke299YDpgJHtufToke299YH07ZnVuY3Rpb24gdGUoZSx0LHI9ITEpe2xldCBuPU1hdGgubWF4KDAsTWF0aC5mbG9vcihlKSksbz1uZXcgSW50bC5QbHVyYWxSdWxlcyh0KSxjPXQ9PT0icGwiP3I/W1siZ29kemlueSIsImdvZHppbiIsImdvZHppbiJdLFsibWludXR5IiwibWludXQiLCJtaW51dCJdLFsic2VrdW5keSIsInNla3VuZCIsInNla3VuZCJdXTpbWyJnb2R6aW5hIiwiZ29kemlueSIsImdvZHppbiJdLFsibWludXRhIiwibWludXR5IiwibWludXQiXSxbInNla3VuZGEiLCJzZWt1bmR5Iiwic2VrdW5kIl1dOltbImhvdXIiLCJob3VycyIsImhvdXJzIl0sWyJtaW51dGUiLCJtaW51dGVzIiwibWludXRlcyJdLFsic2Vjb25kIiwic2Vjb25kcyIsInNlY29uZHMiXV07cmV0dXJuW01hdGguZmxvb3Iobi8zNjAwKSxNYXRoLmZsb29yKG4vNjApJTYwLG4lNjBdLmZsYXRNYXAoKGYsdik9PntpZighZiYmKHYhPT0yfHxuKSlyZXR1cm5bXTtsZXQgeT1vLnNlbGVjdChmKSxFPWNbdl1beT09PSJvbmUiPzA6eT09PSJmZXciPzE6Ml07cmV0dXJuW2Ake2Z9ICR7RX1gXX0pLmpvaW4oIiwgIil9dmFyIERlPWU9PmU/ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk6IiI7ZnVuY3Rpb24gaGUoe3Jvb3Q6ZSxtZWRpYTp0LHBhcnQ6cixnZXRDb25maWc6bixvbjpvfSl7bGV0IGM9T2JqZWN0LmZyb21FbnRyaWVzKFsicGxheSIsImJhY2siLCJmb3J3YXJkIiwibXV0ZSIsInJhdGUiLCJ0aW1lbGluZSIsInZvbHVtZSIsInRpbWUiXS5tYXAoZD0+W2QscihlLGQpXSkpLGY9W107ZnVuY3Rpb24gdihkLGcsYSl7aWYoIWQpcmV0dXJuIG51bGw7bGV0IHc9Wy4uLmQuY2hpbGRyZW5dLmZpbmQoJD0+JC5nZXRBdHRyaWJ1dGUoImRhdGEtZWQtYXVkaW8tdGV4dCIpPT09YSk7cmV0dXJuIHd8fCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSx3LmRhdGFzZXQuZWRBdWRpb1RleHQ9YSxnJiYody5zbG90PWcpLHcuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKSxkLmFwcGVuZCh3KSksZi5wdXNoKHcpLHd9bGV0IHk9T2JqZWN0LmZyb21FbnRyaWVzKFsicGxheSIsImJhY2siLCJmb3J3YXJkIiwibXV0ZSIsInJhdGUiXS5tYXAoZD0+W2QsdihjW2RdLCJ0b29sdGlwLWNvbnRlbnQiLCJ0b29sdGlwIildKSksRT12KGMudGltZSwiIiwidGltZSIpLG09dihjLnJhdGUsImljb24iLCJyYXRlIiksaz0hMSxoPSExLGk9ITEsTCxQLEE9ITEseD1jLnRpbWVsaW5lPy5yYW5nZTtpZih4KXtsZXQgZD14LnNldEF0dHJpYnV0ZTt4LnNldEF0dHJpYnV0ZT1mdW5jdGlvbihnLGEpe2lmKCEoIUEmJlN0cmluZyhnKS50b0xvd2VyQ2FzZSgpPT09ImFyaWEtdmFsdWV0ZXh0IikpcmV0dXJuIGQuY2FsbCh0aGlzLGcsYSl9fWZ1bmN0aW9uIEkoZD0hMSl7aWYoaylyZXR1cm47bGV0e2xvY2FsZTpnfT1uKCksYT1CW2ddLHc9bmV3IEludGwuTnVtYmVyRm9ybWF0KGcse21heGltdW1GcmFjdGlvbkRpZ2l0czoyfSkuZm9ybWF0KHQucGxheWJhY2tSYXRlKSwkPXtwbGF5OnQucGF1c2VkP2EucGxheTphLnBhdXNlLG11dGU6dC5tdXRlZHx8dC52b2x1bWU9PT0wP2EudW5tdXRlOmEubXV0ZSxiYWNrOmEuYmFjayxmb3J3YXJkOmEuZm9yd2FyZCxyYXRlOmAke2EucmF0ZX0gJHt3fWB9O2ZvcihsZXQgaiBvZiBPYmplY3Qua2V5cygkKSlfKGNbal0sImFyaWEtbGFiZWwiLCRbal0pLGllKHlbal0sRGUoJFtqXSkpO2llKG0sYCR7d314YCk7bGV0IEY9dC5kdXJhdGlvbix6PXQuY3VycmVudFRpbWUsQz1OdW1iZXIuaXNGaW5pdGUoRikmJkY+MCxVPUM/YCR7dGUoeixnKX0gJHthLm9mfSAke3RlKEYsZywhMCl9YDphLnVua25vd24scD1jLnRpbWU/Lmhhc0F0dHJpYnV0ZSgicmVtYWluaW5nIiksYj1wJiZDP0Ytejp6O2lmKGllKEUsYCR7cD8iXHUyMjEyIjoiIn0ke21lKGIpfSAvICR7bWUoRil9YCksXyhjLnRpbWUsImFyaWEtbGFiZWwiLGEudGltZSksXyhjLnRpbWUsImFyaWEtZGVzY3JpcHRpb24iLHAmJkM/YCR7YS5yZW1haW5pbmd9OiAke3RlKGIsZyl9ICR7YS5vZn0gJHt0ZShGLGcsITApfWA6VSksXyhjLnRpbWVsaW5lPy5yYW5nZSwiYXJpYS1sYWJlbCIsYS5zZWVrKSwoZHx8ZyE9PVB8fHQucGF1c2VkfHx0LmVuZGVkKSYmKEw9VSxQPWcpLHgmJnguZ2V0QXR0cmlidXRlKCJhcmlhLXZhbHVldGV4dCIpIT09TCl7QT0hMDt0cnl7eC5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWV0ZXh0IixMKX1maW5hbGx5e0E9ITF9fV8oYy52b2x1bWU/LnJhbmdlLCJhcmlhLWxhYmVsIixhLnZvbHVtZSk7bGV0IEQ9TWF0aC5yb3VuZCgodC5tdXRlZD8wOnQudm9sdW1lKSoxMDApO18oYy52b2x1bWU/LnJhbmdlLCJhcmlhLXZhbHVldGV4dCIsZz09PSJwbCI/YCR7RH0gcHJvY2VudGA6YCR7RH0lYCl9ZnVuY3Rpb24gVChkKXtpfHw9ZCwhKGh8fGspJiYoaD0hMCxxdWV1ZU1pY3JvdGFzaygoKT0+e2g9ITE7bGV0IGc9aTtpPSExLEkoZyl9KSl9bGV0IE49bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCk9PlQoITEpKTtmb3IobGV0IGQgb2YgT2JqZWN0LnZhbHVlcyhjKSlkJiYoTi5vYnNlcnZlKGQse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsiYXJpYS1sYWJlbCIsImFyaWEtZGVzY3JpcHRpb24iLCJyZW1haW5pbmciXX0pLGQucmFuZ2UmJk4ub2JzZXJ2ZShkLnJhbmdlLHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbImFyaWEtbGFiZWwiLCJhcmlhLXZhbHVldGV4dCJdfSkpO2ZvcihsZXQgZCBvZlsicGxheSIsInRpbWV1cGRhdGUiLCJ2b2x1bWVjaGFuZ2UiLCJyYXRlY2hhbmdlIl0pbyh0LGQsKCk9PlQoITEpKTtmb3IobGV0IGQgb2ZbInBhdXNlIiwiZW5kZWQiLCJsb2FkZWRtZXRhZGF0YSIsImR1cmF0aW9uY2hhbmdlIiwic2Vla2VkIiwiZW1wdGllZCJdKW8odCxkLCgpPT5UKCEwKSk7cmV0dXJuIEkoKSx7dXBkYXRlOkksZGlzcG9zZSgpe2s9ITAsTi5kaXNjb25uZWN0KCksZi5mb3JFYWNoKGQ9PmQucmVtb3ZlKCkpLHgmJmRlbGV0ZSB4LnNldEF0dHJpYnV0ZX19fXZhciBzZT0iZWQuYXVkaW8tcGxheWVyLnJlc3VtZS52MSIsRmU9U3ltYm9sLmZvcigiZWQuYXVkaW8tcGxheWVyLnNlc3Npb24udjEiKSxDZT03MjAqNjAqNjAqMWUzLGplPTVlMyx5ZT01MDtmdW5jdGlvbiB3ZSh7cm9vdDplLG1lZGlhOnQsZ2V0Q29uZmlnOnIscGxheTpuLHBhdXNlOm99KXtsZXQgYz1lLm93bmVyRG9jdW1lbnQsZj1jLmRlZmF1bHRWaWV3Pz9nbG9iYWxUaGlzLHY9bmV3IEFib3J0Q29udHJvbGxlcix5PShzLGwsdSxTPXt9KT0+cz8uYWRkRXZlbnRMaXN0ZW5lcihsLHUsey4uLlMsc2lnbmFsOnYuc2lnbmFsfSksRT0hMSxtPTAsaz0iIixoLGksTCxQLEE9W10seD0hMSxJPXtyZWxlYXNlOkN9O2Z1bmN0aW9uIFQoKXtsZXQgcz1EYXRlLm5vdygpLGw9Zi5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShzZSksdTt0cnl7dT1KU09OLnBhcnNlKGx8fCJ7fSIpfWNhdGNoe3U9e319cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh1JiZ0eXBlb2YgdT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KHUpP3U6e30pLmZpbHRlcigoW1MsTV0pPT4vXlthLWYwLTldezY0fSQvLnRlc3QoUykmJk0mJk51bWJlci5pc0Zpbml0ZShNLnBvc2l0aW9uKSYmTS5wb3NpdGlvbj4wJiZOdW1iZXIuaXNGaW5pdGUoTS51cGRhdGVkKSYmTS51cGRhdGVkPD1zJiZzLU0udXBkYXRlZDxDZSkuc29ydCgoUyxNKT0+TVsxXS51cGRhdGVkLVNbMV0udXBkYXRlZCkuc2xpY2UoMCx5ZSkubWFwKChbUyxNXSk9PltTLHtwb3NpdGlvbjpNLnBvc2l0aW9uLHVwZGF0ZWQ6TS51cGRhdGVkfV0pKX1mdW5jdGlvbiBOKHMpe2xldCBsPU9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhzKS5zb3J0KCh1LFMpPT5TWzFdLnVwZGF0ZWQtdVsxXS51cGRhdGVkKS5zbGljZSgwLHllKSk7T2JqZWN0LmtleXMobCkubGVuZ3RoP2YubG9jYWxTdG9yYWdlLnNldEl0ZW0oc2UsSlNPTi5zdHJpbmdpZnkobCkpOmYubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc2UpfWZ1bmN0aW9uIGQocz1oKXtpZihzPy5rZXkpdHJ5e2xldCBsPVQoKTtkZWxldGUgbFtzLmtleV0sTihsKX1jYXRjaHt9fWZ1bmN0aW9uIGcocz0hMSl7bGV0IGw9aCx1PXQuY3VycmVudFRpbWUsUz10LmR1cmF0aW9uO2lmKCEoIWw/LmtleXx8IWwucmVzdG9yYXRpb25GaW5pc2hlZHx8dC5yZWFkeVN0YXRlPDF8fCFOdW1iZXIuaXNGaW5pdGUoUyl8fFM8PTB8fCFOdW1iZXIuaXNGaW5pdGUodSkpJiYhKCFzJiZEYXRlLm5vdygpLWwubGFzdFdyaXRlPGplKSYmISh1PD0uMjUmJiFsLnVzZXJTZWVrJiYhbC5wbGF5ZWQpKXtpZihsLmxhc3RXcml0ZT1EYXRlLm5vdygpLHQuZW5kZWR8fHU8PS4yNXx8dT49Uy0xKXtkKGwpO3JldHVybn10cnl7bGV0IE09VCgpO2RlbGV0ZSBNW2wua2V5XSxOKHtbbC5rZXldOntwb3NpdGlvbjp1LHVwZGF0ZWQ6RGF0ZS5ub3coKX0sLi4uTX0pfWNhdGNoe319fWZ1bmN0aW9uIGEoKXtsZXQgcz1oO2lmKCFzPy5rZXl8fHMucmVzdG9yYXRpb25GaW5pc2hlZHx8dC5yZWFkeVN0YXRlPDEpcmV0dXJuO2xldCBsPXQuZHVyYXRpb247aWYoISghTnVtYmVyLmlzRmluaXRlKGwpfHxsPD0wKSl7aWYocy5yZXN0b3JhdGlvbkZpbmlzaGVkPSEwLHMudXNlclNlZWt8fHQuY3VycmVudFRpbWU+LjI1KXtnKCEwKTtyZXR1cm59dHJ5e2xldCB1PVQoKSxTPXVbcy5rZXldO2lmKE4odSksIVMpcmV0dXJuO2lmKFMucG9zaXRpb24+PWwtMSl7ZChzKTtyZXR1cm59dC5jdXJyZW50VGltZT1TLnBvc2l0aW9ufWNhdGNoe319fWZ1bmN0aW9uIHcoKXtsZXQgcz1yKCksbD10eXBlb2Ygcy5yZXN1bWVLZXk9PSJzdHJpbmciP3MucmVzdW1lS2V5LnRyaW0oKToiIix1PXMucmVzdW1lUGxheWJhY2smJmwmJnMuc291cmNlP0pTT04uc3RyaW5naWZ5KFtsLHMuc291cmNlXSk6IiI7aWYodT09PWspcmV0dXJuIGg/LnBlbmRpbmc7ZyghMCksaz11O2xldCBTPSsrbTtpZihoPXU/e2tleToiIix1c2VyU2Vlazp0LmN1cnJlbnRUaW1lPi4yNSxwbGF5ZWQ6IXQucGF1c2VkLHJlc3RvcmF0aW9uRmluaXNoZWQ6ITEsbGFzdFdyaXRlOjB9OnZvaWQgMCwhaHx8IWYuY3J5cHRvPy5zdWJ0bGU/LmRpZ2VzdClyZXR1cm47bGV0IE09aDtyZXR1cm4gTS5wZW5kaW5nPVByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PmYuY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh1KSkpLnRoZW4oemU9PntFfHxtIT09U3x8KE0ua2V5PVsuLi5uZXcgVWludDhBcnJheSh6ZSldLm1hcChPZT0+T2UudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkuam9pbigiIiksYSgpKX0pLmNhdGNoKCgpPT57fSksTS5wZW5kaW5nfWZ1bmN0aW9uICQoKXtoJiYoaC51c2VyU2Vlaz0hMCl9ZnVuY3Rpb24gRigpe3RyeXtyZXR1cm4gaT1mLm5hdmlnYXRvcj8ubWVkaWFTZXNzaW9uLGkmJnR5cGVvZiBpLnNldEFjdGlvbkhhbmRsZXI9PSJmdW5jdGlvbiImJnR5cGVvZiBmLk1lZGlhTWV0YWRhdGE9PSJmdW5jdGlvbiJ9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIHooKXtyZXR1cm4gTD8ub3duZXI9PT1JJiZpPy5tZXRhZGF0YT09PVB9ZnVuY3Rpb24gQygpe2lmKEw/Lm93bmVyIT09SSlyZXR1cm47bGV0IHM9eigpO2lmKEwub3duZXI9bnVsbCwhIXMpe2ZvcihsZXQgbCBvZiBBKXRyeXtpLnNldEFjdGlvbkhhbmRsZXIobCxudWxsKX1jYXRjaHt9QT1bXTt0cnl7aS5tZXRhZGF0YT1udWxsLGkucGxheWJhY2tTdGF0ZT0ibm9uZSIsaS5zZXRQb3NpdGlvblN0YXRlPy4oKX1jYXRjaHt9fX1mdW5jdGlvbiBVKCl7bGV0IHM9cigpO2lmKCFzLnNob3dBcnR3b3JrfHwhcy5hcnR3b3JrKXJldHVybltdO2xldCBsPVsuLi5lLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lZC1hdWRpby1wbGF5ZXJfX2ltYWdlIildLmZpbmQoUz0+Uy5jbG9zZXN0KCIuZWQtYXVkaW8tcGxheWVyIik9PT1lKSx1PWFlKGw/LmN1cnJlbnRTcmN8fGw/LnNyYyxjLmJhc2VVUkkpO3JldHVybiB1P1t7c3JjOnV9XTpbXX1mdW5jdGlvbiBwKCl7aWYoIXooKSlyZXR1cm47bGV0IHM9cigpO3RyeXtsZXQgbD1uZXcgZi5NZWRpYU1ldGFkYXRhKHt0aXRsZTpzLnRpdGxlfHxzLmxhYmVsfHwiQXVkaW8gcGxheWVyIixhcnRpc3Q6cy5hcnRpc3R8fCIiLGFydHdvcms6VSgpfSk7aS5tZXRhZGF0YT1sLFA9bH1jYXRjaHt9fWZ1bmN0aW9uIGIoKXtpZih6KCkpdHJ5e2kucGxheWJhY2tTdGF0ZT10LnBhdXNlZHx8dC5lbmRlZD8icGF1c2VkIjoicGxheWluZyI7bGV0IHM9dC5kdXJhdGlvbixsPXQucGxheWJhY2tSYXRlO051bWJlci5pc0Zpbml0ZShzKSYmcz4wJiZOdW1iZXIuaXNGaW5pdGUobCkmJmw+MCYmaS5zZXRQb3NpdGlvblN0YXRlPy4oe2R1cmF0aW9uOnMscGxheWJhY2tSYXRlOmwscG9zaXRpb246TWF0aC5tYXgoMCxNYXRoLm1pbihzLHQuY3VycmVudFRpbWV8fDApKX0pfWNhdGNoe319ZnVuY3Rpb24gRChzLGw9ITEpe2lmKCFOdW1iZXIuaXNGaW5pdGUocyl8fCFOdW1iZXIuaXNGaW5pdGUodC5kdXJhdGlvbil8fHQuZHVyYXRpb248PTApcmV0dXJuOyQoKTtsZXQgdT1NYXRoLm1heCgwLE1hdGgubWluKHQuZHVyYXRpb24scykpO3RyeXtsJiZ0eXBlb2YgdC5mYXN0U2Vlaz09ImZ1bmN0aW9uIj90LmZhc3RTZWVrKHUpOnQuY3VycmVudFRpbWU9dSxiKCl9Y2F0Y2h7fX1mdW5jdGlvbiBqKCl7aWYoRXx8IXIoKS5tZWRpYVNlc3Npb258fHQucGF1c2VkfHx0LmVuZGVkfHwhRigpKXJldHVybjtpZihMPWZbRmVdPz89e293bmVyOm51bGx9LEwub3duZXI9PT1JJiZ6KCkpe3AoKSxiKCk7cmV0dXJufUwub3duZXI/LnJlbGVhc2UoKTt0cnl7UD1uZXcgZi5NZWRpYU1ldGFkYXRhLGkubWV0YWRhdGE9UH1jYXRjaHtyZXR1cm59TC5vd25lcj1JO2xldCBzPXU9Pk51bWJlci5pc0Zpbml0ZSh1Py5zZWVrT2Zmc2V0KSYmdS5zZWVrT2Zmc2V0PjA/dS5zZWVrT2Zmc2V0OjEwLGw9e3BsYXk6KCk9Pnt0cnl7UHJvbWlzZS5yZXNvbHZlKG4oKSkuY2F0Y2goKCk9Pnt9KX1jYXRjaHt9fSxwYXVzZTpvLHN0b3A6KCk9PntvKCksRCgwKSxnKCEwKX0sc2Vla2JhY2t3YXJkOnU9PkQodC5jdXJyZW50VGltZS1zKHUpKSxzZWVrZm9yd2FyZDp1PT5EKHQuY3VycmVudFRpbWUrcyh1KSksc2Vla3RvOnU9PkQodT8uc2Vla1RpbWUsdT8uZmFzdFNlZWspfTtBPVtdO2ZvcihsZXRbdSxTXW9mIE9iamVjdC5lbnRyaWVzKGwpKXRyeXtpLnNldEFjdGlvbkhhbmRsZXIodSxNPT57IUUmJnIoKS5tZWRpYVNlc3Npb24mJnooKSYmUyhNKX0pLEEucHVzaCh1KX1jYXRjaHt9cCgpLGIoKX1mdW5jdGlvbiBjZSgpe2lmKEUpcmV0dXJuO2xldCBzPXcoKSxsPSEhcigpLm1lZGlhU2Vzc2lvbix1PWwmJiF4O3JldHVybiB4PWwsbD96KCk/KHAoKSxiKCkpOnUmJiF0LnBhdXNlZCYmIXQuZW5kZWQmJmooKTpDKCksc31yZXR1cm4geShlLCJtZWRpYXNlZWtyZXF1ZXN0IiwkLHtjYXB0dXJlOiEwfSkseSh0LCJzZWVraW5nIiwkKSx5KHQsImxvYWRlZG1ldGFkYXRhIiwoKT0+e2EoKSxiKCl9KSx5KHQsInBsYXlpbmciLCgpPT57aCYmKGgucGxheWVkPSEwKSxqKCl9KSx5KHQsInRpbWV1cGRhdGUiLCgpPT57ZygpLGIoKX0pLHkodCwicGF1c2UiLCgpPT57ZyghMCksYigpfSkseSh0LCJzZWVrZWQiLCgpPT57dC5wYXVzZWQmJmcoKSxiKCl9KSx5KHQsInJhdGVjaGFuZ2UiLGIpLHkodCwiZHVyYXRpb25jaGFuZ2UiLCgpPT57YSgpLGIoKX0pLHkodCwiZW5kZWQiLCgpPT57ZCgpLGIoKX0pLHkoZSwibG9hZCIscCx7Y2FwdHVyZTohMH0pLHkoYywicGxheSIscz0+e3MudGFyZ2V0IT09dCYmL14oQVVESU98VklERU8pJC8udGVzdChzLnRhcmdldD8udGFnTmFtZSkmJkMoKX0se2NhcHR1cmU6ITB9KSx5KGMsInZpc2liaWxpdHljaGFuZ2UiLCgpPT57Yy52aXNpYmlsaXR5U3RhdGU9PT0iaGlkZGVuIiYmZyghMCl9KSx5KGYsInBhZ2VoaWRlIiwoKT0+ZyghMCkpLGNlKCkse3VwZGF0ZTpjZSxkaXNwb3NlKCl7RXx8KGcoITApLEMoKSxFPSEwLG0rKyx2LmFib3J0KCksaD12b2lkIDApfX19dmFyIFJlPWU9PjEvTWF0aC5tYXgoMjAwLE51bWJlci5pc0Zpbml0ZShlKT9NYXRoLnJvdW5kKGUqNCk6MCk7ZnVuY3Rpb24gS2UoZSx0KXtsZXQgcj1lLXQ7cmV0dXJuIXJ8fE1hdGguYWJzKHIpPi4wNSsuMDE/bnVsbDpNYXRoLm1heCgwLE1hdGgubWluKDEsdCtNYXRoLnNpZ24ocikqLjA1KSl9dmFyIGtlPXtBcnJvd1JpZ2h0Oi4wMSxBcnJvd1VwOi4wMSxBcnJvd0xlZnQ6LS4wMSxBcnJvd0Rvd246LS4wMSxQYWdlVXA6LjEsUGFnZURvd246LS4xfSxBZT04LHFlPShlLHQpPT5NYXRoLmFicyhlKT49QWUmJk1hdGguYWJzKGUpPk1hdGguYWJzKHQpO2Z1bmN0aW9uIFNlKHttZWRpYTplLHRpbWVsaW5lOnQsdm9sdW1lOnIsb246bn0pe2xldCBvPW5ldyBTZXQ7bihnbG9iYWxUaGlzLCJwb2ludGVyZG93biIsbT0+by5hZGQobS5wb2ludGVySWQpLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KTtmb3IobGV0IG0gb2ZbInBvaW50ZXJ1cCIsInBvaW50ZXJjYW5jZWwiXSluKGdsb2JhbFRoaXMsbSxrPT5vLmRlbGV0ZShrLnBvaW50ZXJJZCkse2NhcHR1cmU6ITAscGFzc2l2ZTohMH0pO2xldCBjPVtdO2ZvcihsZXRbbSxrXW9mW1t0LCEwXSxbciwhMV1dKXtsZXQgeD1mdW5jdGlvbihhKXtsZXQgdz1NYXRoLm1heCgwLE1hdGgubWluKDEsYSkpO2gudmFsdWVBc051bWJlcj13LG0udXBkYXRlQmFyPy4oKSxtLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGs/Im1lZGlhc2Vla3JlcXVlc3QiOiJtZWRpYXZvbHVtZXJlcXVlc3QiLHtidWJibGVzOiEwLGNvbXBvc2VkOiEwLGRldGFpbDprP3cqZS5kdXJhdGlvbjp3fSkpfSxOPWZ1bmN0aW9uKGEpe2lmKGEucG9pbnRlcklkPT09QS5pZCl7aWYoIUEuc2NydWJiaW5nKXtpZighcWUoYS5jbGllbnRYLUEueCxhLmNsaWVudFktQS55KSlyZXR1cm47QS5zY3J1YmJpbmc9ITAsbS50b2dnbGVBdHRyaWJ1dGUoImRyYWdnaW5nIiwhMCl9aSgpJiYhUCgpJiZ4KG0uZ2V0UG9pbnRlclJhdGlvKGEpKX19LGQ9ZnVuY3Rpb24oYSl7aWYoYS5wb2ludGVySWQhPT1BLmlkKXJldHVybjtsZXR7eDp3LHk6JCxmcm9tOkYsc2NydWJiaW5nOnp9PUE7aWYoZygpLCFpKCl8fFAoKSlyZXR1cm47bGV0IEM9TWF0aC5oeXBvdChhLmNsaWVudFgtdyxhLmNsaWVudFktJCk8QWU7YS50eXBlPT09InBvaW50ZXJ1cCImJih6fHxDKT94KG0uZ2V0UG9pbnRlclJhdGlvKGEpKTp6JiZGIT09bnVsbCYmeChGKX0sZz1mdW5jdGlvbigpe0EmJihnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixOLCEwKSxnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsZCwhMCksZ2xvYmFsVGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyY2FuY2VsIixkLCEwKSxtLnRvZ2dsZUF0dHJpYnV0ZSgiZHJhZ2dpbmciLCExKSxoLmRpc2FibGVkPW0uaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpLEE9dm9pZCAwKX07dmFyIGY9eCx2PU4seT1kLEU9ZztsZXQgaD1tPy5yYW5nZTtpZighaCljb250aW51ZTtsZXQgaT0oKT0+IWt8fE51bWJlci5pc0Zpbml0ZShlLmR1cmF0aW9uKSYmZS5kdXJhdGlvbj4wLEw9KCk9Pms/ZS5jdXJyZW50VGltZS9lLmR1cmF0aW9uOmUubXV0ZWQ/MDplLnZvbHVtZSxQPSgpPT5tLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8bS5nZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiKT09PSJ0cnVlIixBLEk9KCk9PntoLnN0ZXA9U3RyaW5nKGs/UmUoZS5kdXJhdGlvbik6LjAxKX07aWYoSSgpLGspe2ZvcihsZXQgYSBvZlsibG9hZGVkbWV0YWRhdGEiLCJkdXJhdGlvbmNoYW5nZSIsImVtcHRpZWQiXSluKGUsYSxJKTtuKGUsInBhdXNlIiwoKT0+e2koKSYmIW0uaGFzQXR0cmlidXRlKCJkcmFnZ2luZyIpJiYoaC52YWx1ZUFzTnVtYmVyPUwoKSxtLnVwZGF0ZUJhcj8uKCkpfSl9bihoLCJrZXlkb3duIixhPT57YS5hbHRLZXl8fGEuY3RybEtleXx8YS5tZXRhS2V5fHxoLmRpc2FibGVkfHxtLmdldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIpPT09InRydWUifHwhKGEua2V5IGluIGtlKSYmYS5rZXkhPT0iSG9tZSImJmEua2V5IT09IkVuZCJ8fChhLnByZXZlbnREZWZhdWx0KCksaSgpJiZ4KGEua2V5PT09IkhvbWUiPzA6YS5rZXk9PT0iRW5kIj8xOkwoKStrZVthLmtleV0pKX0pLG4obSwiaW5wdXQiLGE9PntpZihvLnNpemV8fCFpKCkpcmV0dXJuO2xldCB3PUtlKGgudmFsdWVBc051bWJlcixMKCkpO3chPT1udWxsJiYoYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx4KHcpKX0se2NhcHR1cmU6ITB9KTtsZXQgVD1hPT5hLnBvaW50ZXJUeXBlPT09InRvdWNoInx8YS5wb2ludGVyVHlwZT09PSJwZW4iO24obSwicG9pbnRlcmVudGVyIixhPT57VChhKSYmYS5zdG9wUHJvcGFnYXRpb24oKX0se2NhcHR1cmU6ITB9KSxuKG0sInBvaW50ZXJkb3duIixhPT57VChhKSYmKGEuc3RvcFByb3BhZ2F0aW9uKCksIShBfHwhYS5pc1ByaW1hcnkpJiYoQT17aWQ6YS5wb2ludGVySWQseDphLmNsaWVudFgseTphLmNsaWVudFksZnJvbTppKCk/TCgpOm51bGwsc2NydWJiaW5nOiExfSxoLmRpc2FibGVkPSEwLGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLE4sITApLGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIixkLCEwKSxnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJjYW5jZWwiLGQsITApKSl9LHtjYXB0dXJlOiEwfSksYy5wdXNoKCgpPT57ZygpLGguc3RlcD0iYW55In0pfXJldHVybntkaXNwb3NlKCl7Yy5mb3JFYWNoKG09Pm0oKSl9fX12YXIgdmU9U3ltYm9sLmZvcigiZWQuYXVkaW8tcGxheWVyLnYxIiksWD0iLmVkLWF1ZGlvLXBsYXllciIsSz1uZXcgTWFwLHhlPWZlKCksV2U9KGUsdCk9PlsuLi5lLnF1ZXJ5U2VsZWN0b3JBbGwodCldLmZpbHRlcihyPT5yLmNsb3Nlc3QoWCk9PT1lKSxPPShlLHQpPT5XZShlLFgrIl9fIit0KVswXSxMZT1bIm1lZGlhIiwiY29udHJvbGxlciIsInBsYXkiLCJiYWNrIiwiZm9yd2FyZCIsIm11dGUiLCJ0aW1lbGluZSIsInZvbHVtZSIsInJhdGUiLCJ0aW1lIl0sdWU9US5tYXAoZWUpO2Z1bmN0aW9uIEcoZSx0KXtpZighZSlyZXR1cm47bGV0IHI9Wy4uLmUuY2hpbGROb2Rlc10uZmlsdGVyKG89Pm8ubm9kZVR5cGU9PT0zKTtpZighci5sZW5ndGgpe3QmJmUuYXBwZW5kKGUub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0KSk7cmV0dXJufWxldCBuPXIuZmluZChvPT5vLm5vZGVWYWx1ZS50cmltKCkpfHxyWzBdO24ubm9kZVZhbHVlIT09dCYmKG4ubm9kZVZhbHVlPXQpO2ZvcihsZXQgbyBvZiByKW8hPT1uJiZvLm5vZGVWYWx1ZSYmKG8ubm9kZVZhbHVlPSIiKX12YXIgSj0oZSx0LHIpPT57ZSYmZS5nZXRBdHRyaWJ1dGUodCkhPT1yJiZlLnNldEF0dHJpYnV0ZSh0LHIpfTtmdW5jdGlvbiBVZShlKXtsZXQgdD1PYmplY3QuZnJvbUVudHJpZXMoUS5maWx0ZXIobz0+ZS5oYXNBdHRyaWJ1dGUoZWUobykpKS5tYXAobz0+W28sZS5nZXRBdHRyaWJ1dGUoZWUobykpXSkpLHI9cGUodCxkb2N1bWVudC5iYXNlVVJJKTtyLmxvY2FsZT1nZShlLHIubGFuZ3VhZ2UpO2xldCBuPUJbci5sb2NhbGVdO3JldHVybiByLmxhYmVsPVN0cmluZyhyLmFjY2Vzc2libGVMYWJlbHx8IiIpLnRyaW0oKXx8ci50aXRsZXx8ci5hcnRpc3R8fG4ucmVnaW9uLCghci5kb3dubG9hZExhYmVsfHxyLmRvd25sb2FkTGFiZWw9PT0iRG93bmxvYWQiKSYmKHIuZG93bmxvYWRMYWJlbD1uLmRvd25sb2FkKSxyfWZ1bmN0aW9uIE1lKGUsdCl7Zm9yKGxldCBmIG9mW08oZSwiZG93bmxvYWQiKSxPKGUsImZhbGxiYWNrIildKWYmJih0LnNvdXJjZT9KKGYsImhyZWYiLHQuc291cmNlKTpmLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpKTtmb3IobGV0IGYgb2ZbInRpdGxlIiwiYXJ0aXN0Il0pe2xldCB2PU8oZSxmKTt2JiYoRyh2LHRbZl0pLHYuaGlkZGVuPSF0W2ZdKX1sZXQgcj1PKGUsImFydHdvcmsiKTtyJiYoci5oaWRkZW49IXQuc2hvd0FydHdvcmt8fCF0LmFydHdvcmspO2xldCBuPU8oZSwiaGVhZGVyIik7biYmKG4uaGlkZGVuPSEodC50aXRsZXx8dC5hcnRpc3R8fHQuc2hvd0FydHdvcmsmJnQuYXJ0d29yaykpO2xldCBvPU8oZSwiZG93bmxvYWQiKSxjPU8oZSwiZmFsbGJhY2siKTtvJiYoby5oaWRkZW49IXQuc2hvd0Rvd25sb2FkfHwhdC5zb3VyY2UsRyhvLHQuZG93bmxvYWRMYWJlbCkpLGMmJihjLmhpZGRlbj0hdC5zb3VyY2UsRyhjLEJbdC5sb2NhbGVdLm9wZW4pKX12YXIgSDtmdW5jdGlvbiBWZShlKXt0cnl7SD8/PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIix7d2lsbFJlYWRGcmVxdWVudGx5OiEwfSksSC5jbGVhclJlY3QoMCwwLDEsMSksSC5maWxsU3R5bGU9IiMwMDAiLEguZmlsbFN0eWxlPWdldENvbXB1dGVkU3R5bGUoZSkuY29sb3IsSC5maWxsUmVjdCgwLDAsMSwxKTtsZXRbdCxyLG5dPUguZ2V0SW1hZ2VEYXRhKDAsMCwxLDEpLmRhdGEsbz1jPT4oYy89MjU1KTw9LjA0MDQ1P2MvMTIuOTI6KChjKy4wNTUpLzEuMDU1KSoqMi40O0ooZSwiZGF0YS1lZC1hdWRpby1jb250ZXh0IiwuMjEyNipvKHQpKy43MTUyKm8ocikrLjA3MjIqbyhuKT4uND8iZGFyayI6ImxpZ2h0Iil9Y2F0Y2h7ZS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtZWQtYXVkaW8tY29udGV4dCIpfX12YXIgb2U9MDtmdW5jdGlvbiBXKCl7b2V8fChvZT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntvZT0wLFkoKX0pKX1mdW5jdGlvbiBsZShlKXtlLnBhdXNlKCksZS5yZW1vdmVBdHRyaWJ1dGUoInNyYyIpLGUucXVlcnlTZWxlY3RvckFsbCgic291cmNlIikuZm9yRWFjaCh0PT50LnJlbW92ZSgpKSxlLmxvYWQoKX1mdW5jdGlvbiBfZShlLHQpe2xldCByPU8oZSwibWVkaWEiKSxuPU8oZSwiY29udHJvbGxlciIpO2lmKCFyfHwhbilyZXR1cm47bGV0IG89dCxjPW5ldyBBYm9ydENvbnRyb2xsZXIsZj0ocCxiLEQsaj17fSk9PnA/LmFkZEV2ZW50TGlzdGVuZXIoYixELHsuLi5qLHNpZ25hbDpjLnNpZ25hbH0pLHY9ITEseT0hMSxFLG09MCxrPSExLGg9IiIsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhdWRpbyIpO2kuY2xhc3NOYW1lPSJlZC1hdWRpby1wbGF5ZXJfX21lZGlhIixpLnNsb3Q9Im1lZGlhIixpLnByZWxvYWQ9Im5vbmUiLGkubG9vcD1vLmxvb3AsbGUociksci5yZXBsYWNlV2l0aChpKSxuLnNldEF0dHJpYnV0ZSgibm9ob3RrZXlzIiwiIiksbi5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iik9PT0iMCImJm4ucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpO2xldCBMPU8oZSwic3RhdHVzIik7ZnVuY3Rpb24gUChwLGI9IiIpe2lmKHYpcmV0dXJuO2g9YixKKGUsImRhdGEtZWQtYXVkaW8tc3RhdGUiLHApO2xldCBEPUJbby5sb2NhbGVdW2JdfHwiIjtMJiYoRyhMLEQpLEwuaGlkZGVuPSFEKX1mdW5jdGlvbiBBKCl7dnx8KGs9ITEsaS5wYXVzZSgpLFAoImVycm9yIiwiZXJyb3IiKSl9ZnVuY3Rpb24geCgpe3Z8fHl8fCFvLnNvdXJjZXx8KHk9ITAsRT8uZGlzY29ubmVjdCgpLEU9dm9pZCAwLFAoImxvYWRpbmciLCIiKSxpLnByZWxvYWQ9Im1ldGFkYXRhIixpLnNyYz1vLnNvdXJjZSl9ZnVuY3Rpb24gSSgpe0U/LmRpc2Nvbm5lY3QoKSxFPXZvaWQgMCwhKHl8fCFvLnNvdXJjZSkmJihvLmxvYWRNZWRpYT09PSJlYWdlciJ8fG8ubG9hZE1lZGlhPT09InZpc2libGUiJiYhZ2xvYmFsVGhpcy5JbnRlcnNlY3Rpb25PYnNlcnZlcj94KCk6by5sb2FkTWVkaWE9PT0idmlzaWJsZSImJihFPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihwPT57cC5zb21lKGI9PmIuaXNJbnRlcnNlY3RpbmcpJiZ4KCl9LHtyb290TWFyZ2luOiIyMDBweCJ9KSxFLm9ic2VydmUoZSkpKX1mdW5jdGlvbiBUKCl7bSsrLGs9ITEsaS5wYXVzZSgpfWZ1bmN0aW9uIE4oKXtpZih2fHwhby5zb3VyY2V8fGspcmV0dXJuO2UuZGF0YXNldC5lZEF1ZGlvU3RhdGU9PT0iZXJyb3IiJiYobGUoaSkseT0hMSkseCgpLGkucmVhZHlTdGF0ZTwxJiZQKCJsb2FkaW5nIiwibG9hZGluZyIpLGs9ITA7bGV0IHA9KyttO3RyeXtQcm9taXNlLnJlc29sdmUoaS5wbGF5KCkpLmNhdGNoKGI9Pnt2fHxwIT09bXx8Yj8ubmFtZT09PSJBYm9ydEVycm9yInx8KGI/Lm5hbWU9PT0iTm90QWxsb3dlZEVycm9yIj9QKCJ3YWl0aW5nIiwiYmxvY2tlZCIpOkEoKSl9KS5maW5hbGx5KCgpPT57cD09PW0mJihrPSExKX0pfWNhdGNoe2s9ITEsQSgpfX1sZXQgZD17cGF1c2U6VH0sZz14ZS5yZWdpc3RlcihkKSxhPXA9PnAuY29tcG9zZWRQYXRoKCkuc29tZShiPT5iLm5vZGVUeXBlPT09MSYmYi5tYXRjaGVzPy4oWCkmJmIhPT1lKSx3PXA9PnAuY29tcG9zZWRQYXRoKCkuc29tZShiPT5iLm5vZGVUeXBlPT09MSYmYi5sb2NhbE5hbWU9PT0ibWVkaWEtcGxheS1idXR0b24iKTtmKGUsIm1lZGlhcGxheXJlcXVlc3QiLHA9PnthKHApfHwocC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwoa3x8IWkucGF1c2VkKSYmdyhwKT9UKCk6TigpKX0se2NhcHR1cmU6ITB9KSxmKGUsIm1lZGlhcGF1c2VyZXF1ZXN0IixwPT57YShwKXx8KHAuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksaS5wYXVzZWQmJiFrJiZ3KHApP04oKTpUKCkpfSx7Y2FwdHVyZTohMH0pLGYoaSwicGxheSIsKCk9PnhlLnN0YXJ0ZWQoZCxvLmF1dG9QYXVzZU90aGVyUGxheWVycykpLGYoaSwiZXJyb3IiLEEpO2ZvcihsZXQgcCBvZlsibG9hZGVkbWV0YWRhdGEiLCJjYW5wbGF5IiwicGxheWluZyJdKWYoaSxwLCgpPT57aS5lcnJvcnx8UCgicmVhZHkiKX0pO2xldCAkPWhlKHtyb290OmUsbWVkaWE6aSxwYXJ0Ok8sZ2V0Q29uZmlnOigpPT5vLG9uOmZ9KSxGPVNlKHttZWRpYTppLHRpbWVsaW5lOk8oZSwidGltZWxpbmUiKSx2b2x1bWU6TyhlLCJ2b2x1bWUiKSxvbjpmfSksej13ZSh7cm9vdDplLG1lZGlhOmksZ2V0Q29uZmlnOigpPT5vLHBsYXk6TixwYXVzZTpUfSksQz1MZS5tYXAocD0+TyhlLHApKSxVPXttZWRpYTppLGNvbnRyb2xsZXI6bixnZXQgY2ZnKCl7cmV0dXJuIG99LHN0cnVjdHVyZTpDLHVwZGF0ZShwKXtsZXQgYj1vLmxvYWRNZWRpYSE9PXAubG9hZE1lZGlhLEQ9WyJ0aXRsZSIsImFydGlzdCIsImxhYmVsIiwiYXJ0d29yayIsInNob3dBcnR3b3JrIiwicmVzdW1lUGxheWJhY2siLCJyZXN1bWVLZXkiLCJtZWRpYVNlc3Npb24iXS5zb21lKGo9Pm9bal0hPT1wW2pdKTtvPXAsaS5sb29wPW8ubG9vcCxNZShlLG8pLEoobiwiYXJpYS1sYWJlbCIsby5sYWJlbCksJC51cGRhdGUoKSxQKGUuZGF0YXNldC5lZEF1ZGlvU3RhdGUsaCksYiYmSSgpLEQmJnoudXBkYXRlKCl9LGRpc3Bvc2UoKXt2fHwoei5kaXNwb3NlKCksdj0hMCxUKCksYy5hYm9ydCgpLEU/LmRpc2Nvbm5lY3QoKSwkLmRpc3Bvc2UoKSxGLmRpc3Bvc2UoKSxnKCksbGUoaSksSy5kZWxldGUoZSkpfX07Sy5zZXQoZSxVKSxKKG4sImFyaWEtbGFiZWwiLG8ubGFiZWwpLEooZSwiZGF0YS1lZC1hdWRpby1yZWFkeSIsInRydWUiKSxQKG8uc291cmNlPyJ3YWl0aW5nIjoiZW1wdHkiLG8uc291cmNlPyIiOiJlbXB0eSIpLEkoKX1mdW5jdGlvbiBZKCl7Zm9yKGxldFtlLHRdb2YgSykoIWUuaXNDb25uZWN0ZWR8fExlLnNvbWUoKHIsbik9Pk8oZSxyKSE9PXQuc3RydWN0dXJlW25dKSkmJnQuZGlzcG9zZSgpO2ZvcihsZXQgZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFgpKXtsZXQgdD1VZShlKTtNZShlLHQpLFZlKGUpO2xldCByPUsuZ2V0KGUpO3ImJnIuY2ZnLnNvdXJjZSE9PXQuc291cmNlJiZyLmRpc3Bvc2UoKTtsZXQgbj1LLmdldChlKTtpZihuKXtuLnVwZGF0ZSh0KTtjb250aW51ZX1pZihnbG9iYWxUaGlzW1N5bWJvbC5mb3IoImVkLm1lZGlhLmNvbnRyb2xzLnYxIildKV9lKGUsdCk7ZWxzZXtsZXQgbz1PKGUsInN0YXR1cyIpO28mJihHKG8sdC5zb3VyY2U/IiI6Qlt0LmxvY2FsZV0uZW1wdHkpLG8uaGlkZGVuPSEhdC5zb3VyY2UpfX19dmFyIEJlPWU9PmUubm9kZVR5cGU9PT0xJiYoZS5tYXRjaGVzPy4oWCsnLCBbY2xhc3MqPSJlZC1hdWRpby1wbGF5ZXJfXyJdJyl8fGUucXVlcnlTZWxlY3Rvcj8uKFgrJywgW2NsYXNzKj0iZWQtYXVkaW8tcGxheWVyX18iXScpKSxFZT1uZXcgTXV0YXRpb25PYnNlcnZlcihlPT57KGUuc29tZSh0PT50LnR5cGU9PT0iY2hpbGRMaXN0IiYmWy4uLnQuYWRkZWROb2RlcywuLi50LnJlbW92ZWROb2Rlc10uc29tZShCZSkpfHxlLnNvbWUodD0+dC50eXBlPT09ImF0dHJpYnV0ZXMiJiZ1ZS5pbmNsdWRlcyh0LmF0dHJpYnV0ZU5hbWUpKSkmJlkoKSxlLnNvbWUodD0+dC50eXBlPT09ImF0dHJpYnV0ZXMiJiYhdWUuaW5jbHVkZXModC5hdHRyaWJ1dGVOYW1lKSYmKHQudGFyZ2V0PT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx0LnRhcmdldD09PWRvY3VtZW50LmJvZHl8fFsuLi5LLmtleXMoKV0uc29tZShyPT50LnRhcmdldD09PXJ8fHQudGFyZ2V0LmNvbnRhaW5zKHIpKSkpJiZXKCl9KTtFZS5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITAsYXR0cmlidXRlczohMCxhdHRyaWJ1dGVGaWx0ZXI6Wy4uLnVlLCJjbGFzcyIsInN0eWxlIiwibGFuZyJdfSk7dmFyIFBlPW5ldyBNdXRhdGlvbk9ic2VydmVyKFcpO2ZvcihsZXQgZSBvZltkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0pZSYmUGUub2JzZXJ2ZShlLHthdHRyaWJ1dGVzOiEwfSk7dmFyIFRlPWdsb2JhbFRoaXMubWF0Y2hNZWRpYT8uKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIik7VGU/LmFkZEV2ZW50TGlzdGVuZXI/LigiY2hhbmdlIixXKTtnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsVyk7Z2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKCJlZC1tZWRpYS1jb250cm9scy1yZWFkeSIsWSk7Z2xvYmFsVGhpc1t2ZV09e3ZlcnNpb246ZGUsc2NhbjpZLHJlZnJlc2g6VyxnZXQ6ZT0+Sy5nZXQoZSksc2l6ZTooKT0+Sy5zaXplLGRpc3Bvc2UoKXtFZS5kaXNjb25uZWN0KCksUGUuZGlzY29ubmVjdCgpLGNhbmNlbEFuaW1hdGlvbkZyYW1lKG9lKSxUZT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcj8uKCJjaGFuZ2UiLFcpLGdsb2JhbFRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixXKSxnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVkLW1lZGlhLWNvbnRyb2xzLXJlYWR5IixZKTtmb3IobGV0W2UsdF1vZlsuLi5LXSl0LmRpc3Bvc2UoKSxiZShlKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1lZC1hdWRpby1yZWFkeSIpO2RlbGV0ZSBnbG9iYWxUaGlzW3ZlXX19O1koKTt9KSgpOwoKfQo=","id":"qkicrdq"},"tag":"div","attributes":{"data-ed-audio-audio":"{props.audio}","data-ed-audio-title":"{props.title}","data-ed-audio-artist":"{props.artist}","data-ed-audio-accessible-label":"{props.accessibleLabel}","data-ed-audio-layout":"{props.layout}","data-ed-audio-theme":"{props.theme}","data-ed-audio-show-artwork":"{props.showArtwork}","data-ed-audio-artwork":"{props.artwork}","data-ed-audio-loop":"{props.loop}","data-ed-audio-show-download":"{props.showDownload}","data-ed-audio-download-label":"{props.downloadLabel}","data-ed-audio-load-media":"{props.loadMedia}","data-ed-audio-auto-pause-other-players":"{props.autoPauseOtherPlayers}","data-ed-audio-language":"{props.language}","data-ed-audio-resume-playback":"{props.resumePlayback}","data-ed-audio-resume-key":"{props.resumeKey}","data-ed-audio-media-session":"{props.mediaSession}","class":"ed-audio-player"},"styles":["aclijvb"]},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Header"},"tag":"div","attributes":{"class":"ed-audio-player__header"},"styles":["wck57ff"]},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Artwork"},"tag":"div","attributes":{"class":"ed-audio-player__artwork"},"styles":["93qk1e5"]},"innerBlocks":[{"blockName":"etch/dynamic-image","attrs":{"metadata":{"name":"Image"},"tag":"img","attributes":{"mediaId":"{props.artwork}","useSrcSet":"true","maximumSize":"medium","alt":"","loading":"lazy","class":"ed-audio-player__image"},"styles":["5towuhp"]},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Meta"},"tag":"div","attributes":{"class":"ed-audio-player__meta"},"styles":["1mcbfxs"]},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Title"},"tag":"p","attributes":{"class":"ed-audio-player__title"},"styles":["1zs7kag"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.title}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Artist"},"tag":"p","attributes":{"class":"ed-audio-player__artist"},"styles":["blff4wn"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.artist}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]}],"innerHTML":"\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n"]}],"innerHTML":"\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Controller"},"script":{"code":"aWYoIWdsb2JhbFRoaXNbU3ltYm9sLmZvcigiZWQubWVkaWEuY29udHJvbHMudjEiKV0pewovKiEgTWVkaWEgQ2hyb21lIDQuMTkuMgpDb3B5cmlnaHQgKGMpIDIwMjAgTXV4LCBJbmMuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgoKKi8KInVzZSBzdHJpY3QiOygoKT0+e3ZhciB6aT1jbGFzc3thZGRFdmVudExpc3RlbmVyKCl7fXJlbW92ZUV2ZW50TGlzdGVuZXIoKXt9ZGlzcGF0Y2hFdmVudCgpe3JldHVybiEwfX0sWmk9Y2xhc3MgZXh0ZW5kcyB6aXt9LFhpPWNsYXNzIGV4dGVuZHMgWml7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMucm9sZT1udWxsfX0sa3I9Y2xhc3N7b2JzZXJ2ZSgpe311bm9ic2VydmUoKXt9ZGlzY29ubmVjdCgpe319LE1uPXtjcmVhdGVFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvaS5IVE1MRWxlbWVudH0sY3JlYXRlRWxlbWVudE5TOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvaS5IVE1MRWxlbWVudH0sYWRkRXZlbnRMaXN0ZW5lcigpe30scmVtb3ZlRXZlbnRMaXN0ZW5lcigpe30sZGlzcGF0Y2hFdmVudCh0KXtyZXR1cm4hMX19LG9pPXtSZXNpemVPYnNlcnZlcjprcixkb2N1bWVudDpNbixOb2RlOlppLEVsZW1lbnQ6WGksSFRNTEVsZW1lbnQ6Y2xhc3MgZXh0ZW5kcyBYaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5pbm5lckhUTUw9IiJ9Z2V0IGNvbnRlbnQoKXtyZXR1cm4gbmV3IG9pLkRvY3VtZW50RnJhZ21lbnR9fSxEb2N1bWVudEZyYWdtZW50OmNsYXNzIGV4dGVuZHMgeml7fSxjdXN0b21FbGVtZW50czp7Z2V0OmZ1bmN0aW9uKCl7fSxkZWZpbmU6ZnVuY3Rpb24oKXt9LHdoZW5EZWZpbmVkOmZ1bmN0aW9uKCl7fX0sbG9jYWxTdG9yYWdlOntnZXRJdGVtKHQpe3JldHVybiBudWxsfSxzZXRJdGVtKHQsZSl7fSxyZW1vdmVJdGVtKHQpe319LEN1c3RvbUV2ZW50OmZ1bmN0aW9uKCl7fSxnZXRDb21wdXRlZFN0eWxlOmZ1bmN0aW9uKCl7fSxuYXZpZ2F0b3I6e2xhbmd1YWdlczpbXSxnZXQgdXNlckFnZW50KCl7cmV0dXJuIiJ9fSxtYXRjaE1lZGlhKHQpe3JldHVybnttYXRjaGVzOiExLG1lZGlhOnR9fSxET01QYXJzZXI6Y2xhc3N7cGFyc2VGcm9tU3RyaW5nKGUsaSl7cmV0dXJue2JvZHk6e3RleHRDb250ZW50OmV9fX19fSxMbj0iZ2xvYmFsImluIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXM/Lmdsb2JhbD09PWdsb2JhbFRoaXN8fHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2Ygd2luZG93LmN1c3RvbUVsZW1lbnRzPiJ1IixSbj1PYmplY3Qua2V5cyhvaSkuZXZlcnkodD0+dCBpbiBnbG9iYWxUaGlzKSxsPUxuJiYhUm4/b2k6Z2xvYmFsVGhpcyxQPUxuJiYhUm4/TW46Z2xvYmFsVGhpcy5kb2N1bWVudDt2YXIgaD17TUVESUFfUExBWV9SRVFVRVNUOiJtZWRpYXBsYXlyZXF1ZXN0IixNRURJQV9QQVVTRV9SRVFVRVNUOiJtZWRpYXBhdXNlcmVxdWVzdCIsTUVESUFfTVVURV9SRVFVRVNUOiJtZWRpYW11dGVyZXF1ZXN0IixNRURJQV9VTk1VVEVfUkVRVUVTVDoibWVkaWF1bm11dGVyZXF1ZXN0IixNRURJQV9MT09QX1JFUVVFU1Q6Im1lZGlhbG9vcHJlcXVlc3QiLE1FRElBX1ZPTFVNRV9SRVFVRVNUOiJtZWRpYXZvbHVtZXJlcXVlc3QiLE1FRElBX1NFRUtfUkVRVUVTVDoibWVkaWFzZWVrcmVxdWVzdCIsTUVESUFfQUlSUExBWV9SRVFVRVNUOiJtZWRpYWFpcnBsYXlyZXF1ZXN0IixNRURJQV9FTlRFUl9GVUxMU0NSRUVOX1JFUVVFU1Q6Im1lZGlhZW50ZXJmdWxsc2NyZWVucmVxdWVzdCIsTUVESUFfRVhJVF9GVUxMU0NSRUVOX1JFUVVFU1Q6Im1lZGlhZXhpdGZ1bGxzY3JlZW5yZXF1ZXN0IixNRURJQV9QUkVWSUVXX1JFUVVFU1Q6Im1lZGlhcHJldmlld3JlcXVlc3QiLE1FRElBX0VOVEVSX1BJUF9SRVFVRVNUOiJtZWRpYWVudGVycGlwcmVxdWVzdCIsTUVESUFfRVhJVF9QSVBfUkVRVUVTVDoibWVkaWFleGl0cGlwcmVxdWVzdCIsTUVESUFfRU5URVJfQ0FTVF9SRVFVRVNUOiJtZWRpYWVudGVyY2FzdHJlcXVlc3QiLE1FRElBX0VYSVRfQ0FTVF9SRVFVRVNUOiJtZWRpYWV4aXRjYXN0cmVxdWVzdCIsTUVESUFfU0hPV19URVhUX1RSQUNLU19SRVFVRVNUOiJtZWRpYXNob3d0ZXh0dHJhY2tzcmVxdWVzdCIsTUVESUFfSElERV9URVhUX1RSQUNLU19SRVFVRVNUOiJtZWRpYWhpZGV0ZXh0dHJhY2tzcmVxdWVzdCIsTUVESUFfU0hPV19TVUJUSVRMRVNfUkVRVUVTVDoibWVkaWFzaG93c3VidGl0bGVzcmVxdWVzdCIsTUVESUFfRElTQUJMRV9TVUJUSVRMRVNfUkVRVUVTVDoibWVkaWFkaXNhYmxlc3VidGl0bGVzcmVxdWVzdCIsTUVESUFfVE9HR0xFX1NVQlRJVExFU19SRVFVRVNUOiJtZWRpYXRvZ2dsZXN1YnRpdGxlc3JlcXVlc3QiLE1FRElBX1BMQVlCQUNLX1JBVEVfUkVRVUVTVDoibWVkaWFwbGF5YmFja3JhdGVyZXF1ZXN0IixNRURJQV9SRU5ESVRJT05fUkVRVUVTVDoibWVkaWFyZW5kaXRpb25yZXF1ZXN0IixNRURJQV9BVURJT19UUkFDS19SRVFVRVNUOiJtZWRpYWF1ZGlvdHJhY2tyZXF1ZXN0IixNRURJQV9TRUVLX1RPX0xJVkVfUkVRVUVTVDoibWVkaWFzZWVrdG9saXZlcmVxdWVzdCIsUkVHSVNURVJfTUVESUFfU1RBVEVfUkVDRUlWRVI6InJlZ2lzdGVybWVkaWFzdGF0ZXJlY2VpdmVyIixVTlJFR0lTVEVSX01FRElBX1NUQVRFX1JFQ0VJVkVSOiJ1bnJlZ2lzdGVybWVkaWFzdGF0ZXJlY2VpdmVyIn0sdz17TUVESUFfQ0hST01FX0FUVFJJQlVURVM6Im1lZGlhY2hyb21lYXR0cmlidXRlcyIsTUVESUFfQ09OVFJPTExFUjoibWVkaWFjb250cm9sbGVyIn0seXI9e01FRElBX0FJUlBMQVlfVU5BVkFJTEFCTEU6Im1lZGlhQWlycGxheVVuYXZhaWxhYmxlIixNRURJQV9BVURJT19UUkFDS19FTkFCTEVEOiJtZWRpYUF1ZGlvVHJhY2tFbmFibGVkIixNRURJQV9BVURJT19UUkFDS19MSVNUOiJtZWRpYUF1ZGlvVHJhY2tMaXN0IixNRURJQV9BVURJT19UUkFDS19VTkFWQUlMQUJMRToibWVkaWFBdWRpb1RyYWNrVW5hdmFpbGFibGUiLE1FRElBX0JVRkZFUkVEOiJtZWRpYUJ1ZmZlcmVkIixNRURJQV9DQVNUX1VOQVZBSUxBQkxFOiJtZWRpYUNhc3RVbmF2YWlsYWJsZSIsTUVESUFfQ0hBUFRFUlNfQ1VFUzoibWVkaWFDaGFwdGVyc0N1ZXMiLE1FRElBX0NVUlJFTlRfVElNRToibWVkaWFDdXJyZW50VGltZSIsTUVESUFfRFVSQVRJT046Im1lZGlhRHVyYXRpb24iLE1FRElBX0VOREVEOiJtZWRpYUVuZGVkIixNRURJQV9FUlJPUjoibWVkaWFFcnJvciIsTUVESUFfRVJST1JfQ09ERToibWVkaWFFcnJvckNvZGUiLE1FRElBX0VSUk9SX01FU1NBR0U6Im1lZGlhRXJyb3JNZXNzYWdlIixNRURJQV9GVUxMU0NSRUVOX1VOQVZBSUxBQkxFOiJtZWRpYUZ1bGxzY3JlZW5VbmF2YWlsYWJsZSIsTUVESUFfSEFTX1BMQVlFRDoibWVkaWFIYXNQbGF5ZWQiLE1FRElBX0hFSUdIVDoibWVkaWFIZWlnaHQiLE1FRElBX0lTX0FJUlBMQVlJTkc6Im1lZGlhSXNBaXJwbGF5aW5nIixNRURJQV9JU19DQVNUSU5HOiJtZWRpYUlzQ2FzdGluZyIsTUVESUFfSVNfRlVMTFNDUkVFTjoibWVkaWFJc0Z1bGxzY3JlZW4iLE1FRElBX0lTX1BJUDoibWVkaWFJc1BpcCIsTUVESUFfTE9BRElORzoibWVkaWFMb2FkaW5nIixNRURJQV9NVVRFRDoibWVkaWFNdXRlZCIsTUVESUFfTE9PUDoibWVkaWFMb29wIixNRURJQV9QQVVTRUQ6Im1lZGlhUGF1c2VkIixNRURJQV9QSVBfVU5BVkFJTEFCTEU6Im1lZGlhUGlwVW5hdmFpbGFibGUiLE1FRElBX1BMQVlCQUNLX1JBVEU6Im1lZGlhUGxheWJhY2tSYXRlIixNRURJQV9QUkVWSUVXX0NIQVBURVI6Im1lZGlhUHJldmlld0NoYXB0ZXIiLE1FRElBX1BSRVZJRVdfQ09PUkRTOiJtZWRpYVByZXZpZXdDb29yZHMiLE1FRElBX1BSRVZJRVdfSU1BR0U6Im1lZGlhUHJldmlld0ltYWdlIixNRURJQV9QUkVWSUVXX1RJTUU6Im1lZGlhUHJldmlld1RpbWUiLE1FRElBX1JFTkRJVElPTl9MSVNUOiJtZWRpYVJlbmRpdGlvbkxpc3QiLE1FRElBX1JFTkRJVElPTl9TRUxFQ1RFRDoibWVkaWFSZW5kaXRpb25TZWxlY3RlZCIsTUVESUFfUkVORElUSU9OX1VOQVZBSUxBQkxFOiJtZWRpYVJlbmRpdGlvblVuYXZhaWxhYmxlIixNRURJQV9TRUVLQUJMRToibWVkaWFTZWVrYWJsZSIsTUVESUFfU1RSRUFNX1RZUEU6Im1lZGlhU3RyZWFtVHlwZSIsTUVESUFfU1VCVElUTEVTX0xJU1Q6Im1lZGlhU3VidGl0bGVzTGlzdCIsTUVESUFfU1VCVElUTEVTX1NIT1dJTkc6Im1lZGlhU3VidGl0bGVzU2hvd2luZyIsTUVESUFfVEFSR0VUX0xJVkVfV0lORE9XOiJtZWRpYVRhcmdldExpdmVXaW5kb3ciLE1FRElBX1RJTUVfSVNfTElWRToibWVkaWFUaW1lSXNMaXZlIixNRURJQV9WT0xVTUU6Im1lZGlhVm9sdW1lIixNRURJQV9WT0xVTUVfTEVWRUw6Im1lZGlhVm9sdW1lTGV2ZWwiLE1FRElBX1ZPTFVNRV9VTkFWQUlMQUJMRToibWVkaWFWb2x1bWVVbmF2YWlsYWJsZSIsTUVESUFfTEFORzoibWVkaWFMYW5nIixNRURJQV9XSURUSDoibWVkaWFXaWR0aCJ9LERuPU9iamVjdC5lbnRyaWVzKHlyKSxuPURuLnJlZHVjZSgodCxbZSxpXSk9Pih0W2VdPWkudG9Mb3dlckNhc2UoKSx0KSx7fSksSWw9e1VTRVJfSU5BQ1RJVkVfQ0hBTkdFOiJ1c2VyaW5hY3RpdmVjaGFuZ2UiLEJSRUFLUE9JTlRTX0NIQU5HRToiYnJlYWtwb2ludGNoYW5nZSIsQlJFQUtQT0lOVFNfQ09NUFVURUQ6ImJyZWFrcG9pbnRzY29tcHV0ZWQifSxydD1Ebi5yZWR1Y2UoKHQsW2UsaV0pPT4odFtlXT1pLnRvTG93ZXJDYXNlKCksdCksey4uLklsfSksUHU9T2JqZWN0LmVudHJpZXMocnQpLnJlZHVjZSgodCxbZSxpXSk9PntsZXQgYT1uW2VdO3JldHVybiBhJiYodFtpXT1hKSx0fSx7dXNlcmluYWN0aXZlY2hhbmdlOiJ1c2VyaW5hY3RpdmUifSksQ249T2JqZWN0LmVudHJpZXMobikucmVkdWNlKCh0LFtlLGldKT0+e2xldCBhPXJ0W2VdO3JldHVybiBhJiYodFtpXT1hKSx0fSx7dXNlcmluYWN0aXZlOiJ1c2VyaW5hY3RpdmVjaGFuZ2UifSksaWU9e1NVQlRJVExFUzoic3VidGl0bGVzIixDQVBUSU9OUzoiY2FwdGlvbnMiLERFU0NSSVBUSU9OUzoiZGVzY3JpcHRpb25zIixDSEFQVEVSUzoiY2hhcHRlcnMiLE1FVEFEQVRBOiJtZXRhZGF0YSJ9LFZlPXtESVNBQkxFRDoiZGlzYWJsZWQiLEhJRERFTjoiaGlkZGVuIixTSE9XSU5HOiJzaG93aW5nIn07dmFyIEppPXtNT1VTRToibW91c2UiLFBFTjoicGVuIixUT1VDSDoidG91Y2gifSxhZT17VU5BVkFJTEFCTEU6InVuYXZhaWxhYmxlIixVTlNVUFBPUlRFRDoidW5zdXBwb3J0ZWQifSxwZT17TElWRToibGl2ZSIsT05fREVNQU5EOiJvbi1kZW1hbmQiLFVOS05PV046InVua25vd24ifTt2YXIgeG49e0lOTElORToiaW5saW5lIixGVUxMU0NSRUVOOiJmdWxsc2NyZWVuIixQSUNUVVJFX0lOX1BJQ1RVUkU6InBpY3R1cmUtaW4tcGljdHVyZSJ9O3ZhciBVbj1uZXcgV2Vha01hcCx3cj10PT57bGV0IGU9VW4uZ2V0KHQpO3JldHVybiBlfHxVbi5zZXQodCxlPW5ldyBTZXQpLGV9LE9uPW5ldyBsLlJlc2l6ZU9ic2VydmVyKHQ9Pntmb3IobGV0IGUgb2YgdClmb3IobGV0IGkgb2Ygd3IoZS50YXJnZXQpKWkoZSl9KTtmdW5jdGlvbiBOZSh0LGUpe3dyKHQpLmFkZChlKSxPbi5vYnNlcnZlKHQpfWZ1bmN0aW9uIEZlKHQsZSl7bGV0IGk9d3IodCk7aS5kZWxldGUoZSksaS5zaXplfHxPbi51bm9ic2VydmUodCl9ZnVuY3Rpb24gRyh0KXtsZXQgZT17fTtmb3IobGV0IGkgb2YgdCllW2kubmFtZV09aS52YWx1ZTtyZXR1cm4gZX1mdW5jdGlvbiBLZSh0KXt2YXIgZTtyZXR1cm4oZT1qaSh0KSkhPW51bGw/ZTpUZSh0LCJtZWRpYS1jb250cm9sbGVyIil9ZnVuY3Rpb24gamkodCl7dmFyIGU7bGV0e01FRElBX0NPTlRST0xMRVI6aX09dyxhPXQuZ2V0QXR0cmlidXRlKGkpO2lmKGEpcmV0dXJuKGU9c3QodCkpPT1udWxsP3ZvaWQgMDplLmdldEVsZW1lbnRCeUlkKGEpfXZhciBlYT0odCxlLGk9Ii52YWx1ZSIpPT57bGV0IGE9dC5xdWVyeVNlbGVjdG9yKGkpO2EmJihhLnRleHRDb250ZW50PWUpfSxrbD0odCxlKT0+e2xldCBpPWBzbG90W25hbWU9IiR7ZX0iXWAsYT10LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihpKTtyZXR1cm4gYT9hLmNoaWxkcmVuOltdfSx0YT0odCxlKT0+a2wodCxlKVswXSxuZT0odCxlKT0+IXR8fCFlPyExOnQ/LmNvbnRhaW5zKGUpPyEwOm5lKHQsZS5nZXRSb290Tm9kZSgpLmhvc3QpLFRlPSh0LGUpPT57aWYoIXQpcmV0dXJuIG51bGw7bGV0IGk9dC5jbG9zZXN0KGUpO3JldHVybiBpfHxUZSh0LmdldFJvb3ROb2RlKCkuaG9zdCxlKX07ZnVuY3Rpb24gTXIodD1kb2N1bWVudCl7dmFyIGU7bGV0IGk9dD8uYWN0aXZlRWxlbWVudDtyZXR1cm4gaT8oZT1NcihpLnNoYWRvd1Jvb3QpKSE9bnVsbD9lOmk6bnVsbH1mdW5jdGlvbiBzdCh0KXt2YXIgZTtsZXQgaT0oZT10Py5nZXRSb290Tm9kZSk9PW51bGw/dm9pZCAwOmUuY2FsbCh0KTtyZXR1cm4gaSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3R8fGkgaW5zdGFuY2VvZiBEb2N1bWVudD9pOm51bGx9ZnVuY3Rpb24gaWEodCx7ZGVwdGg6ZT0zLGNoZWNrT3BhY2l0eTppPSEwLGNoZWNrVmlzaWJpbGl0eUNTUzphPSEwfT17fSl7aWYodC5jaGVja1Zpc2liaWxpdHkpcmV0dXJuIHQuY2hlY2tWaXNpYmlsaXR5KHtjaGVja09wYWNpdHk6aSxjaGVja1Zpc2liaWxpdHlDU1M6YX0pO2xldCByPXQ7Zm9yKDtyJiZlPjA7KXtsZXQgcz1nZXRDb21wdXRlZFN0eWxlKHIpO2lmKGkmJnMub3BhY2l0eT09PSIwInx8YSYmcy52aXNpYmlsaXR5PT09ImhpZGRlbiJ8fHMuZGlzcGxheT09PSJub25lIilyZXR1cm4hMTtyPXIucGFyZW50RWxlbWVudCxlLS19cmV0dXJuITB9ZnVuY3Rpb24gUG4odCxlLGksYSl7bGV0IHI9YS54LWkueCxzPWEueS1pLnksbz1yKnIrcypzO2lmKG89PT0wKXJldHVybiAwO2xldCBkPSgodC1pLngpKnIrKGUtaS55KSpzKS9vO3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsZCkpfWZ1bmN0aW9uIEIodCxlKXtsZXQgaT15bCh0LGE9PmE9PT1lKTtyZXR1cm4gaXx8bGkodCxlKX1mdW5jdGlvbiB5bCh0LGUpe3ZhciBpLGE7bGV0IHI7Zm9yKHIgb2YoaT10LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlOm5vdChbbWVkaWFdKSIpKSE9bnVsbD9pOltdKXtsZXQgczt0cnl7cz0oYT1yLnNoZWV0KT09bnVsbD92b2lkIDA6YS5jc3NSdWxlc31jYXRjaHtjb250aW51ZX1mb3IobGV0IG8gb2Ygcz8/W10paWYoZShvLnNlbGVjdG9yVGV4dCkpcmV0dXJuIG99fWZ1bmN0aW9uIGxpKHQsZSl7dmFyIGksYTtsZXQgcj0oaT10LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlOm5vdChbbWVkaWFdKSIpKSE9bnVsbD9pOltdLHM9cj8uW3IubGVuZ3RoLTFdO2lmKCFzPy5zaGVldClyZXR1cm4gY29uc29sZS53YXJuKCJNZWRpYSBDaHJvbWU6IE5vIHN0eWxlIHNoZWV0IGZvdW5kIG9uIHN0eWxlIHRhZyBvZiIsdCkse3N0eWxlOntzZXRQcm9wZXJ0eTooKT0+e30scmVtb3ZlUHJvcGVydHk6KCk9PiIiLGdldFByb3BlcnR5VmFsdWU6KCk9PiIifX07bGV0IG89cz8uc2hlZXQuaW5zZXJ0UnVsZShgJHtlfXt9YCxzLnNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7cmV0dXJuKGE9cy5zaGVldC5jc3NSdWxlcyk9PW51bGw/dm9pZCAwOmFbb119ZnVuY3Rpb24gRCh0LGUsaT1OdW1iZXIuTmFOKXtsZXQgYT10LmdldEF0dHJpYnV0ZShlKTtyZXR1cm4gYSE9bnVsbD8rYTppfWZ1bmN0aW9uIEgodCxlLGkpe2xldCBhPStpO2lmKGk9PW51bGx8fE51bWJlci5pc05hTihhKSl7dC5oYXNBdHRyaWJ1dGUoZSkmJnQucmVtb3ZlQXR0cmlidXRlKGUpO3JldHVybn1EKHQsZSx2b2lkIDApIT09YSYmdC5zZXRBdHRyaWJ1dGUoZSxgJHthfWApfWZ1bmN0aW9uIGsodCxlKXtyZXR1cm4gdC5oYXNBdHRyaWJ1dGUoZSl9ZnVuY3Rpb24geSh0LGUsaSl7aWYoaT09bnVsbCl7dC5oYXNBdHRyaWJ1dGUoZSkmJnQucmVtb3ZlQXR0cmlidXRlKGUpO3JldHVybn1rKHQsZSkhPWkmJnQudG9nZ2xlQXR0cmlidXRlKGUsaSl9ZnVuY3Rpb24gTyh0LGUsaT1udWxsKXt2YXIgYTtyZXR1cm4oYT10LmdldEF0dHJpYnV0ZShlKSkhPW51bGw/YTppfWZ1bmN0aW9uIFUodCxlLGkpe2lmKGk9PW51bGwpe3QuaGFzQXR0cmlidXRlKGUpJiZ0LnJlbW92ZUF0dHJpYnV0ZShlKTtyZXR1cm59bGV0IGE9YCR7aX1gO08odCxlLHZvaWQgMCkhPT1hJiZ0LnNldEF0dHJpYnV0ZShlLGEpfXZhciBObj0odCxlLGkpPT57aWYoIWUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIraSl9LEVlPSh0LGUsaSk9PihObih0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLHdsPSh0LGUsaSk9PntpZihlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtlIGluc3RhbmNlb2YgV2Vha1NldD9lLmFkZCh0KTplLnNldCh0LGkpfSxhYT0odCxlLGksYSk9PihObih0LGUsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxhP2EuY2FsbCh0LGkpOmUuc2V0KHQsaSksaSksWDtmdW5jdGlvbiBNbCh0KXtyZXR1cm5gCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiB2YXIoLS1tZWRpYS1jb250cm9sLWRpc3BsYXksIHZhcigtLW1lZGlhLWdlc3R1cmUtcmVjZWl2ZXItZGlzcGxheSwgaW5saW5lLWJsb2NrKSk7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgfXZhciBUdD1jbGFzcyBleHRlbmRzIGwuSFRNTEVsZW1lbnR7Y29uc3RydWN0b3IoKXtpZihzdXBlcigpLHdsKHRoaXMsWCx2b2lkIDApLCF0aGlzLnNoYWRvd1Jvb3Qpe3RoaXMuYXR0YWNoU2hhZG93KHRoaXMuY29uc3RydWN0b3Iuc2hhZG93Um9vdE9wdGlvbnMpO2xldCBlPUcodGhpcy5hdHRyaWJ1dGVzKTt0aGlzLnNoYWRvd1Jvb3QuaW5uZXJIVE1MPXRoaXMuY29uc3RydWN0b3IuZ2V0VGVtcGxhdGVIVE1MKGUpfX1zdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVyblt3Lk1FRElBX0NPTlRST0xMRVIsbi5NRURJQV9QQVVTRURdfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSl7dmFyIHIscyxvLGQsdTtlPT09dy5NRURJQV9DT05UUk9MTEVSJiYoaSYmKChzPShyPUVlKHRoaXMsWCkpPT1udWxsP3ZvaWQgMDpyLnVuYXNzb2NpYXRlRWxlbWVudCk9PW51bGx8fHMuY2FsbChyLHRoaXMpLGFhKHRoaXMsWCxudWxsKSksYSYmdGhpcy5pc0Nvbm5lY3RlZCYmKGFhKHRoaXMsWCwobz10aGlzLmdldFJvb3ROb2RlKCkpPT1udWxsP3ZvaWQgMDpvLmdldEVsZW1lbnRCeUlkKGEpKSwodT0oZD1FZSh0aGlzLFgpKT09bnVsbD92b2lkIDA6ZC5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8dS5jYWxsKGQsdGhpcykpKX1jb25uZWN0ZWRDYWxsYmFjaygpe3ZhciBlLGk7dGhpcy50YWJJbmRleD0tMSx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIiksYWEodGhpcyxYLExsKHRoaXMpKSx0aGlzLmdldEF0dHJpYnV0ZSh3Lk1FRElBX0NPTlRST0xMRVIpJiYoKGk9KGU9RWUodGhpcyxYKSk9PW51bGw/dm9pZCAwOmUuYXNzb2NpYXRlRWxlbWVudCk9PW51bGx8fGkuY2FsbChlLHRoaXMpKSxFZSh0aGlzLFgpJiYoRWUodGhpcyxYKS5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsdGhpcyksRWUodGhpcyxYKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcyksRWUodGhpcyxYKS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil8fChFZSh0aGlzLFgpLnRhYkluZGV4PTApKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3ZhciBlLGksYSxyO3RoaXMuZ2V0QXR0cmlidXRlKHcuTUVESUFfQ09OVFJPTExFUikmJigoaT0oZT1FZSh0aGlzLFgpKT09bnVsbD92b2lkIDA6ZS51bmFzc29jaWF0ZUVsZW1lbnQpPT1udWxsfHxpLmNhbGwoZSx0aGlzKSksKGE9RWUodGhpcyxYKSk9PW51bGx8fGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLHRoaXMpLChyPUVlKHRoaXMsWCkpPT1udWxsfHxyLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzKSxhYSh0aGlzLFgsbnVsbCl9aGFuZGxlRXZlbnQoZSl7dmFyIGk7bGV0IGE9KGk9ZS5jb21wb3NlZFBhdGgoKSk9PW51bGw/dm9pZCAwOmlbMF07aWYoWyJ2aWRlbyIsIm1lZGlhLWNvbnRyb2xsZXIiXS5pbmNsdWRlcyhhPy5sb2NhbE5hbWUpKXtpZihlLnR5cGU9PT0icG9pbnRlcmRvd24iKXRoaXMuX3BvaW50ZXJUeXBlPWUucG9pbnRlclR5cGU7ZWxzZSBpZihlLnR5cGU9PT0iY2xpY2siKXtsZXR7Y2xpZW50WDpzLGNsaWVudFk6b309ZSx7bGVmdDpkLHRvcDp1LHdpZHRoOl8saGVpZ2h0OlR9PXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT1zLWQsdj1vLXU7aWYoQTwwfHx2PDB8fEE+X3x8dj5UfHxfPT09MCYmVD09PTApcmV0dXJuO2xldCBtPXRoaXMuX3BvaW50ZXJUeXBlfHwibW91c2UiO2lmKHRoaXMuX3BvaW50ZXJUeXBlPXZvaWQgMCxtPT09SmkuVE9VQ0gpe3RoaXMuaGFuZGxlVGFwKGUpO3JldHVybn1lbHNlIGlmKG09PT1KaS5NT1VTRXx8bT09PUppLlBFTil7dGhpcy5oYW5kbGVNb3VzZUNsaWNrKGUpO3JldHVybn19fX1nZXQgbWVkaWFQYXVzZWQoKXtyZXR1cm4gayh0aGlzLG4uTUVESUFfUEFVU0VEKX1zZXQgbWVkaWFQYXVzZWQoZSl7eSh0aGlzLG4uTUVESUFfUEFVU0VELGUpfWhhbmRsZVRhcChlKXt9aGFuZGxlTW91c2VDbGljayhlKXtsZXQgaT10aGlzLm1lZGlhUGF1c2VkP2guTUVESUFfUExBWV9SRVFVRVNUOmguTUVESUFfUEFVU0VfUkVRVUVTVDt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGwuQ3VzdG9tRXZlbnQoaSx7Y29tcG9zZWQ6ITAsYnViYmxlczohMH0pKX19O1g9bmV3IFdlYWtNYXA7VHQuc2hhZG93Um9vdE9wdGlvbnM9e21vZGU6Im9wZW4ifTtUdC5nZXRUZW1wbGF0ZUhUTUw9TWw7ZnVuY3Rpb24gTGwodCl7dmFyIGU7bGV0IGk9dC5nZXRBdHRyaWJ1dGUody5NRURJQV9DT05UUk9MTEVSKTtyZXR1cm4gaT8oZT10LmdldFJvb3ROb2RlKCkpPT1udWxsP3ZvaWQgMDplLmdldEVsZW1lbnRCeUlkKGkpOlRlKHQsIm1lZGlhLWNvbnRyb2xsZXIiKX1sLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtZ2VzdHVyZS1yZWNlaXZlciIpfHxsLmN1c3RvbUVsZW1lbnRzLmRlZmluZSgibWVkaWEtZ2VzdHVyZS1yZWNlaXZlciIsVHQpO3ZhciBMcj1UdDt2YXIgRm49eyJTdGFydCBhaXJwbGF5IjoiU3RhcnQgYWlycGxheSIsIlN0b3AgYWlycGxheSI6IlN0b3AgYWlycGxheSIsQXVkaW86IkF1ZGlvIixDYXB0aW9uczoiQ2FwdGlvbnMiLCJFbmFibGUgY2FwdGlvbnMiOiJFbmFibGUgY2FwdGlvbnMiLCJEaXNhYmxlIGNhcHRpb25zIjoiRGlzYWJsZSBjYXB0aW9ucyIsIlN0YXJ0IGNhc3RpbmciOiJTdGFydCBjYXN0aW5nIiwiU3RvcCBjYXN0aW5nIjoiU3RvcCBjYXN0aW5nIiwiRW50ZXIgZnVsbHNjcmVlbiBtb2RlIjoiRW50ZXIgZnVsbHNjcmVlbiBtb2RlIiwiRXhpdCBmdWxsc2NyZWVuIG1vZGUiOiJFeGl0IGZ1bGxzY3JlZW4gbW9kZSIsTXV0ZToiTXV0ZSIsVW5tdXRlOiJVbm11dGUiLExvb3A6Ikxvb3AiLCJFbnRlciBwaWN0dXJlIGluIHBpY3R1cmUgbW9kZSI6IkVudGVyIHBpY3R1cmUgaW4gcGljdHVyZSBtb2RlIiwiRXhpdCBwaWN0dXJlIGluIHBpY3R1cmUgbW9kZSI6IkV4aXQgcGljdHVyZSBpbiBwaWN0dXJlIG1vZGUiLFBsYXk6IlBsYXkiLFBhdXNlOiJQYXVzZSIsIlBsYXliYWNrIHJhdGUiOiJQbGF5YmFjayByYXRlIiwiUGxheWJhY2sgcmF0ZSB7cGxheWJhY2tSYXRlfSI6IlBsYXliYWNrIHJhdGUge3BsYXliYWNrUmF0ZX0iLFF1YWxpdHk6IlF1YWxpdHkiLCJTZWVrIGJhY2t3YXJkIjoiU2VlayBiYWNrd2FyZCIsIlNlZWsgZm9yd2FyZCI6IlNlZWsgZm9yd2FyZCIsU2V0dGluZ3M6IlNldHRpbmdzIixBdXRvOiJBdXRvIiwiYXVkaW8gcGxheWVyIjoiYXVkaW8gcGxheWVyIiwidmlkZW8gcGxheWVyIjoidmlkZW8gcGxheWVyIix2b2x1bWU6InZvbHVtZSIsc2Vlazoic2VlayIsImNsb3NlZCBjYXB0aW9ucyI6ImNsb3NlZCBjYXB0aW9ucyIsImN1cnJlbnQgcGxheWJhY2sgcmF0ZSI6ImN1cnJlbnQgcGxheWJhY2sgcmF0ZSIsInBsYXliYWNrIHRpbWUiOiJwbGF5YmFjayB0aW1lIiwibWVkaWEgbG9hZGluZyI6Im1lZGlhIGxvYWRpbmciLHNldHRpbmdzOiJzZXR0aW5ncyIsImF1ZGlvIHRyYWNrcyI6ImF1ZGlvIHRyYWNrcyIscXVhbGl0eToicXVhbGl0eSIscGxheToicGxheSIscGF1c2U6InBhdXNlIixtdXRlOiJtdXRlIix1bm11dGU6InVubXV0ZSIsImNoYXB0ZXI6IHtjaGFwdGVyTmFtZX0iOiJjaGFwdGVyOiB7Y2hhcHRlck5hbWV9IixsaXZlOiJsaXZlIixPZmY6Ik9mZiIsInN0YXJ0IGFpcnBsYXkiOiJzdGFydCBhaXJwbGF5Iiwic3RvcCBhaXJwbGF5Ijoic3RvcCBhaXJwbGF5Iiwic3RhcnQgY2FzdGluZyI6InN0YXJ0IGNhc3RpbmciLCJzdG9wIGNhc3RpbmciOiJzdG9wIGNhc3RpbmciLCJlbnRlciBmdWxsc2NyZWVuIG1vZGUiOiJlbnRlciBmdWxsc2NyZWVuIG1vZGUiLCJleGl0IGZ1bGxzY3JlZW4gbW9kZSI6ImV4aXQgZnVsbHNjcmVlbiBtb2RlIiwiZW50ZXIgcGljdHVyZSBpbiBwaWN0dXJlIG1vZGUiOiJlbnRlciBwaWN0dXJlIGluIHBpY3R1cmUgbW9kZSIsImV4aXQgcGljdHVyZSBpbiBwaWN0dXJlIG1vZGUiOiJleGl0IHBpY3R1cmUgaW4gcGljdHVyZSBtb2RlIiwic2VlayB0byBsaXZlIjoic2VlayB0byBsaXZlIiwicGxheWluZyBsaXZlIjoicGxheWluZyBsaXZlIiwic2VlayBiYWNrIHtzZWVrT2Zmc2V0fSBzZWNvbmRzIjoic2VlayBiYWNrIHtzZWVrT2Zmc2V0fSBzZWNvbmRzIiwic2VlayBmb3J3YXJkIHtzZWVrT2Zmc2V0fSBzZWNvbmRzIjoic2VlayBmb3J3YXJkIHtzZWVrT2Zmc2V0fSBzZWNvbmRzIiwiTmV0d29yayBFcnJvciI6Ik5ldHdvcmsgRXJyb3IiLCJEZWNvZGUgRXJyb3IiOiJEZWNvZGUgRXJyb3IiLCJTb3VyY2UgTm90IFN1cHBvcnRlZCI6IlNvdXJjZSBOb3QgU3VwcG9ydGVkIiwiRW5jcnlwdGlvbiBFcnJvciI6IkVuY3J5cHRpb24gRXJyb3IiLCJBIG5ldHdvcmsgZXJyb3IgY2F1c2VkIHRoZSBtZWRpYSBkb3dubG9hZCB0byBmYWlsLiI6IkEgbmV0d29yayBlcnJvciBjYXVzZWQgdGhlIG1lZGlhIGRvd25sb2FkIHRvIGZhaWwuIiwiQSBtZWRpYSBlcnJvciBjYXVzZWQgcGxheWJhY2sgdG8gYmUgYWJvcnRlZC4gVGhlIG1lZGlhIGNvdWxkIGJlIGNvcnJ1cHQgb3IgeW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmb3JtYXQuIjoiQSBtZWRpYSBlcnJvciBjYXVzZWQgcGxheWJhY2sgdG8gYmUgYWJvcnRlZC4gVGhlIG1lZGlhIGNvdWxkIGJlIGNvcnJ1cHQgb3IgeW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmb3JtYXQuIiwiQW4gdW5zdXBwb3J0ZWQgZXJyb3Igb2NjdXJyZWQuIFRoZSBzZXJ2ZXIgb3IgbmV0d29yayBmYWlsZWQsIG9yIHlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZm9ybWF0LiI6IkFuIHVuc3VwcG9ydGVkIGVycm9yIG9jY3VycmVkLiBUaGUgc2VydmVyIG9yIG5ldHdvcmsgZmFpbGVkLCBvciB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZvcm1hdC4iLCJUaGUgbWVkaWEgaXMgZW5jcnlwdGVkIGFuZCB0aGVyZSBhcmUgbm8ga2V5cyB0byBkZWNyeXB0IGl0LiI6IlRoZSBtZWRpYSBpcyBlbmNyeXB0ZWQgYW5kIHRoZXJlIGFyZSBubyBrZXlzIHRvIGRlY3J5cHQgaXQuIixob3VyOiJob3VyIixob3VyczoiaG91cnMiLG1pbnV0ZToibWludXRlIixtaW51dGVzOiJtaW51dGVzIixzZWNvbmQ6InNlY29uZCIsc2Vjb25kczoic2Vjb25kcyIsInt0aW1lfSByZW1haW5pbmciOiJ7dGltZX0gcmVtYWluaW5nIiwie2N1cnJlbnRUaW1lfSBvZiB7dG90YWxUaW1lfSI6IntjdXJyZW50VGltZX0gb2Yge3RvdGFsVGltZX0iLCJ2aWRlbyBub3QgbG9hZGVkLCB1bmtub3duIHRpbWUuIjoidmlkZW8gbm90IGxvYWRlZCwgdW5rbm93biB0aW1lLiJ9O3ZhciBIbixkaT17ZW46Rm59LFN0PSgoSG49Z2xvYmFsVGhpcy5uYXZpZ2F0b3IpPT1udWxsP3ZvaWQgMDpIbi5sYW5ndWFnZSl8fCJlbiIsQm49dD0+e1N0PXR9O3ZhciBSbD10PT57dmFyIGUsaSxhO2xldFtyXT1TdC5zcGxpdCgiLSIpO3JldHVybigoZT1kaVtTdF0pPT1udWxsP3ZvaWQgMDplW3RdKXx8KChpPWRpW3JdKT09bnVsbD92b2lkIDA6aVt0XSl8fCgoYT1kaS5lbik9PW51bGw/dm9pZCAwOmFbdF0pfHx0fSxXbj0oKT0+e2xldFt0XT1TdC5zcGxpdCgiLSIpO3JldHVybiBkaVtTdF0/U3Q6ZGlbdF0/dDoiZW4ifSxmPSh0LGU9e30pPT5SbCh0KS5yZXBsYWNlKC9ceyhcdyspXH0vZywoaSxhKT0+YSBpbiBlP1N0cmluZyhlW2FdKTpgeyR7YX19YCk7dmFyIHhyPSh0LGUsaSk9PntpZighZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitpKX0sVj0odCxlLGkpPT4oeHIodCxlLCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpLGk/aS5jYWxsKHQpOmUuZ2V0KHQpKSxlZT0odCxlLGkpPT57aWYoZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7ZSBpbnN0YW5jZW9mIFdlYWtTZXQ/ZS5hZGQodCk6ZS5zZXQodCxpKX0sdmU9KHQsZSxpLGEpPT4oeHIodCxlLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksYT9hLmNhbGwodCxpKTplLnNldCh0LGkpLGkpLGZlPSh0LGUsaSk9Pih4cih0LGUsImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLGkpLHVpLG5hLEl0LHd0LHl0LFJyLGt0LHJhLERyLCRuLENyLFZuLGNpLG9hLGxhLFVyLE10LGhpLEdlLHNhLGc9e0FVRElPOiJhdWRpbyIsQVVUT0hJREU6ImF1dG9oaWRlIixCUkVBS1BPSU5UUzoiYnJlYWtwb2ludHMiLEdFU1RVUkVTX0RJU0FCTEVEOiJnZXN0dXJlc2Rpc2FibGVkIixLRVlCT0FSRF9DT05UUk9MOiJrZXlib2FyZGNvbnRyb2wiLE5PX0FVVE9ISURFOiJub2F1dG9oaWRlIixVU0VSX0lOQUNUSVZFOiJ1c2VyaW5hY3RpdmUiLEFVVE9ISURFX09WRVJfQ09OVFJPTFM6ImF1dG9oaWRlb3ZlcmNvbnRyb2xzIn07ZnVuY3Rpb24gRGwodCl7cmV0dXJuYAogICAgPHN0eWxlPgogICAgICAKICAgICAgOmhvc3QoWyR7bi5NRURJQV9JU19GVUxMU0NSRUVOfV0pIDo6c2xvdHRlZChbc2xvdD1tZWRpYV0pIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICA6aG9zdCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1lZGlhLWJhY2tncm91bmQtY29sb3IsICMwMDApOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoWyR7Zy5BVURJT31dKSkgW3BhcnR+PWxheWVyXTpub3QoW3BhcnR+PW1lZGlhLWxheWVyXSkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWZsb3c6IGNvbHVtbiBub3dyYXA7CiAgICAgICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIH0KCiAgICAgIHNsb3RbbmFtZT1tZWRpYV0gewogICAgICAgIGRpc3BsYXk6IHZhcigtLW1lZGlhLXNsb3QtZGlzcGxheSwgY29udGVudHMpOwogICAgICB9CgogICAgICAKICAgICAgOmhvc3QoWyR7Zy5BVURJT31dKSBzbG90W25hbWU9bWVkaWFdIHsKICAgICAgICBkaXNwbGF5OiB2YXIoLS1tZWRpYS1zbG90LWRpc3BsYXksIG5vbmUpOwogICAgICB9CgogICAgICAKICAgICAgOmhvc3QoWyR7Zy5BVURJT31dKSBbcGFydH49bGF5ZXJdW3BhcnR+PWdlc3R1cmUtbGF5ZXJdIHsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIAogICAgICA6aG9zdCg6bm90KFske2cuQVVESU99XSlbJHtnLkdFU1RVUkVTX0RJU0FCTEVEfV0pIDo6c2xvdHRlZChbc2xvdD1nZXN0dXJlcy1jaHJvbWVdKSwKICAgICAgICAgIDpob3N0KDpub3QoWyR7Zy5BVURJT31dKVske2cuR0VTVFVSRVNfRElTQUJMRUR9XSkgbWVkaWEtZ2VzdHVyZS1yZWNlaXZlcltzbG90PWdlc3R1cmVzLWNocm9tZV0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIAogICAgICA6OnNsb3R0ZWQoOm5vdChbc2xvdD1tZWRpYV0pOm5vdChbc2xvdD1wb3N0ZXJdKTpub3QobWVkaWEtbG9hZGluZy1pbmRpY2F0b3IpOm5vdChbcm9sZT1kaWFsb2ddKTpub3QoW2hpZGRlbl0pKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoWyR7Zy5BVURJT31dKSkgKltwYXJ0fj1sYXllcl1bcGFydH49Y2VudGVyZWQtbGF5ZXJdIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFske2cuQVVESU99XSkpIDo6c2xvdHRlZChtZWRpYS1nZXN0dXJlLXJlY2VpdmVyW3Nsb3Q9Z2VzdHVyZXMtY2hyb21lXSksCiAgICAgIDpob3N0KDpub3QoWyR7Zy5BVURJT31dKSkgbWVkaWEtZ2VzdHVyZS1yZWNlaXZlcltzbG90PWdlc3R1cmVzLWNocm9tZV0gewogICAgICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICBzbG90W25hbWU9bWlkZGxlLWNocm9tZV0gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgfQoKICAgICAgCiAgICAgIDo6c2xvdHRlZChbc2xvdD1tZWRpYV0pLAogICAgICA6OnNsb3R0ZWQoW3Nsb3Q9cG9zdGVyXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgCiAgICAgIDpob3N0KDpub3QoWyR7Zy5BVURJT31dKSkgLnNwYWNlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAKICAgICAgOmhvc3QoOi13ZWJraXQtZnVsbC1zY3JlZW4pIHsKICAgICAgICAKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAKICAgICAgOjpzbG90dGVkKDpub3QoW3Nsb3Q9bWVkaWFdKTpub3QoW3Nsb3Q9cG9zdGVyXSk6bm90KFske2cuTk9fQVVUT0hJREV9XSk6bm90KFtoaWRkZW5dKTpub3QoW3JvbGU9ZGlhbG9nXSkpIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHRyYW5zaXRpb246IHZhcigtLW1lZGlhLWNvbnRyb2wtdHJhbnNpdGlvbi1pbiwgb3BhY2l0eSAwLjI1cyk7CiAgICAgIH0KCiAgICAgIAogICAgICA6aG9zdChbJHtnLlVTRVJfSU5BQ1RJVkV9XTpub3QoWyR7bi5NRURJQV9QQVVTRUR9XSk6bm90KFske24uTUVESUFfSVNfQUlSUExBWUlOR31dKTpub3QoWyR7bi5NRURJQV9JU19DQVNUSU5HfV0pOm5vdChbJHtnLkFVRElPfV0pKSA6OnNsb3R0ZWQoOm5vdChbc2xvdD1tZWRpYV0pOm5vdChbc2xvdD1wb3N0ZXJdKTpub3QoWyR7Zy5OT19BVVRPSElERX1dKTpub3QoW3JvbGU9ZGlhbG9nXSkpIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zaXRpb246IHZhcigtLW1lZGlhLWNvbnRyb2wtdHJhbnNpdGlvbi1vdXQsIG9wYWNpdHkgMXMpOwogICAgICB9CgogICAgICA6aG9zdChbJHtnLlVTRVJfSU5BQ1RJVkV9XTpub3QoWyR7Zy5OT19BVVRPSElERX1dKTpub3QoWyR7bi5NRURJQV9QQVVTRUR9XSk6bm90KFske24uTUVESUFfSVNfQ0FTVElOR31dKTpub3QoWyR7Zy5BVURJT31dKSkgOjpzbG90dGVkKFtzbG90PW1lZGlhXSkgewogICAgICAgIGN1cnNvcjogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoWyR7Zy5VU0VSX0lOQUNUSVZFfV1bJHtnLkFVVE9ISURFX09WRVJfQ09OVFJPTFN9XTpub3QoWyR7Zy5OT19BVVRPSElERX1dKTpub3QoWyR7bi5NRURJQV9QQVVTRUR9XSk6bm90KFske24uTUVESUFfSVNfQ0FTVElOR31dKTpub3QoWyR7Zy5BVURJT31dKSkgKiB7CiAgICAgICAgLS1tZWRpYS1jdXJzb3I6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBub25lOwogICAgICB9CgoKICAgICAgOjpzbG90dGVkKG1lZGlhLWNvbnRyb2wtYmFyKSAgewogICAgICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgIH0KCiAgICAgIAogICAgICA6aG9zdCg6bm90KFske2cuQVVESU99XSlbJHtuLk1FRElBX0hBU19QTEFZRUR9XSkgc2xvdFtuYW1lPXBvc3Rlcl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDo6c2xvdHRlZChbcm9sZT1kaWFsb2ddKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtyb2xlPW1lbnVdKSB7CiAgICAgICAgYWxpZ24tc2VsZjogZW5kOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90IG5hbWU9Im1lZGlhIiBwYXJ0PSJsYXllciBtZWRpYS1sYXllciI+PC9zbG90PgogICAgPHNsb3QgbmFtZT0icG9zdGVyIiBwYXJ0PSJsYXllciBwb3N0ZXItbGF5ZXIiPjwvc2xvdD4KICAgIDxzbG90IG5hbWU9Imdlc3R1cmVzLWNocm9tZSIgcGFydD0ibGF5ZXIgZ2VzdHVyZS1sYXllciI+CiAgICAgIDxtZWRpYS1nZXN0dXJlLXJlY2VpdmVyIHNsb3Q9Imdlc3R1cmVzLWNocm9tZSI+CiAgICAgICAgPHRlbXBsYXRlIHNoYWRvd3Jvb3Rtb2RlPSIke0xyLnNoYWRvd1Jvb3RPcHRpb25zLm1vZGV9Ij4KICAgICAgICAgICR7THIuZ2V0VGVtcGxhdGVIVE1MKHt9KX0KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L21lZGlhLWdlc3R1cmUtcmVjZWl2ZXI+CiAgICA8L3Nsb3Q+CiAgICA8c3BhbiBwYXJ0PSJsYXllciB2ZXJ0aWNhbC1sYXllciI+CiAgICAgIDxzbG90IG5hbWU9InRvcC1jaHJvbWUiIHBhcnQ9InRvcCBjaHJvbWUiPjwvc2xvdD4KICAgICAgPHNsb3QgbmFtZT0ibWlkZGxlLWNocm9tZSIgcGFydD0ibWlkZGxlIGNocm9tZSI+PC9zbG90PgogICAgICA8c2xvdCBuYW1lPSJjZW50ZXJlZC1jaHJvbWUiIHBhcnQ9ImxheWVyIGNlbnRlcmVkLWxheWVyIGNlbnRlciBjZW50ZXJlZCBjaHJvbWUiPjwvc2xvdD4KICAgICAgCiAgICAgIDxzbG90IHBhcnQ9ImJvdHRvbSBjaHJvbWUiPjwvc2xvdD4KICAgIDwvc3Bhbj4KICAgIDxzbG90IG5hbWU9ImRpYWxvZyIgcGFydD0ibGF5ZXIgZGlhbG9nLWxheWVyIj48L3Nsb3Q+CiAgYH12YXIgQ2w9T2JqZWN0LnZhbHVlcyhuKSx4bD0ic206Mzg0IG1kOjU3NiBsZzo3NjggeGw6OTYwIjtmdW5jdGlvbiBVbCh0KXtLbih0LnRhcmdldCx0LmNvbnRlbnRSZWN0LndpZHRoKX1mdW5jdGlvbiBLbih0LGUpe3ZhciBpO2lmKCF0LmlzQ29ubmVjdGVkKXJldHVybjtsZXQgYT0oaT10LmdldEF0dHJpYnV0ZShnLkJSRUFLUE9JTlRTKSkhPW51bGw/aTp4bCxyPU9sKGEpLHM9UGwocixlKSxvPSExO2lmKE9iamVjdC5rZXlzKHIpLmZvckVhY2goZD0+e2lmKHMuaW5jbHVkZXMoZCkpe3QuaGFzQXR0cmlidXRlKGBicmVha3BvaW50JHtkfWApfHwodC5zZXRBdHRyaWJ1dGUoYGJyZWFrcG9pbnQke2R9YCwiIiksbz0hMCk7cmV0dXJufXQuaGFzQXR0cmlidXRlKGBicmVha3BvaW50JHtkfWApJiYodC5yZW1vdmVBdHRyaWJ1dGUoYGJyZWFrcG9pbnQke2R9YCksbz0hMCl9KSxvKXtsZXQgZD1uZXcgQ3VzdG9tRXZlbnQocnQuQlJFQUtQT0lOVFNfQ0hBTkdFLHtkZXRhaWw6c30pO3QuZGlzcGF0Y2hFdmVudChkKX10LmJyZWFrcG9pbnRzQ29tcHV0ZWR8fCh0LmJyZWFrcG9pbnRzQ29tcHV0ZWQ9ITAsdC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChydC5CUkVBS1BPSU5UU19DT01QVVRFRCx7YnViYmxlczohMCxjb21wb3NlZDohMH0pKSl9ZnVuY3Rpb24gT2wodCl7bGV0IGU9dC5zcGxpdCgvXHMrLyk7cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlLm1hcChpPT5pLnNwbGl0KCI6IikpKX1mdW5jdGlvbiBQbCh0LGUpe3JldHVybiBPYmplY3Qua2V5cyh0KS5maWx0ZXIoaT0+ZT49cGFyc2VJbnQodFtpXSkpfXZhciBudD1jbGFzcyBleHRlbmRzIGwuSFRNTEVsZW1lbnR7Y29uc3RydWN0b3IoKXtpZihzdXBlcigpLGVlKHRoaXMsRHIpLGVlKHRoaXMsQ3IpLGVlKHRoaXMsY2kpLGVlKHRoaXMsbGEpLGVlKHRoaXMsTXQpLGVlKHRoaXMsdWksdm9pZCAwKSxlZSh0aGlzLG5hLDApLGVlKHRoaXMsSXQsbnVsbCksZWUodGhpcyx3dCxudWxsKSxlZSh0aGlzLHl0LHZvaWQgMCksdGhpcy5icmVha3BvaW50c0NvbXB1dGVkPSExLGVlKHRoaXMsUnIsZT0+e2xldCBpPXRoaXMubWVkaWE7Zm9yKGxldCBhIG9mIGUpe2lmKGEudHlwZSE9PSJjaGlsZExpc3QiKWNvbnRpbnVlO2xldCByPWEucmVtb3ZlZE5vZGVzO2ZvcihsZXQgcyBvZiByKXtpZihzLnNsb3QhPSJtZWRpYSJ8fGEudGFyZ2V0IT10aGlzKWNvbnRpbnVlO2xldCBvPWEucHJldmlvdXNTaWJsaW5nJiZhLnByZXZpb3VzU2libGluZy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO2lmKCFvfHwhaSl0aGlzLm1lZGlhVW5zZXRDYWxsYmFjayhzKTtlbHNle2xldCBkPW8uc2xvdCE9PSJtZWRpYSI7Zm9yKDsobz1vLnByZXZpb3VzU2libGluZykhPT1udWxsOylvLnNsb3Q9PSJtZWRpYSImJihkPSExKTtkJiZ0aGlzLm1lZGlhVW5zZXRDYWxsYmFjayhzKX19aWYoaSlmb3IobGV0IHMgb2YgYS5hZGRlZE5vZGVzKXM9PT1pJiZ0aGlzLmhhbmRsZU1lZGlhVXBkYXRlZChpKX19KSxlZSh0aGlzLGt0LCExKSxlZSh0aGlzLHJhLGU9PntWKHRoaXMsa3QpfHwoc2V0VGltZW91dCgoKT0+e1VsKGUpLHZlKHRoaXMsa3QsITEpfSwwKSx2ZSh0aGlzLGt0LCEwKSl9KSxlZSh0aGlzLEdlLHZvaWQgMCksZWUodGhpcyxzYSwoKT0+e2lmKCFWKHRoaXMsR2UpLmFzc2lnbmVkRWxlbWVudHMoe2ZsYXR0ZW46ITB9KS5sZW5ndGgpe1YodGhpcyxJdCkmJnRoaXMubWVkaWFVbnNldENhbGxiYWNrKFYodGhpcyxJdCkpO3JldHVybn10aGlzLmhhbmRsZU1lZGlhVXBkYXRlZCh0aGlzLm1lZGlhKX0pLCF0aGlzLnNoYWRvd1Jvb3Qpe3RoaXMuYXR0YWNoU2hhZG93KHRoaXMuY29uc3RydWN0b3Iuc2hhZG93Um9vdE9wdGlvbnMpO2xldCBlPUcodGhpcy5hdHRyaWJ1dGVzKSxpPXRoaXMuY29uc3RydWN0b3IuZ2V0VGVtcGxhdGVIVE1MKGUpO3RoaXMuc2hhZG93Um9vdC5zZXRIVE1MVW5zYWZlP3RoaXMuc2hhZG93Um9vdC5zZXRIVE1MVW5zYWZlKGkpOnRoaXMuc2hhZG93Um9vdC5pbm5lckhUTUw9aX12ZSh0aGlzLHVpLG5ldyBNdXRhdGlvbk9ic2VydmVyKFYodGhpcyxScikpKX1zdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVybltnLkFVVE9ISURFLGcuR0VTVFVSRVNfRElTQUJMRURdLmNvbmNhdChDbCkuZmlsdGVyKGU9PiFbbi5NRURJQV9SRU5ESVRJT05fTElTVCxuLk1FRElBX0FVRElPX1RSQUNLX0xJU1Qsbi5NRURJQV9DSEFQVEVSU19DVUVTLG4uTUVESUFfV0lEVEgsbi5NRURJQV9IRUlHSFQsbi5NRURJQV9FUlJPUixuLk1FRElBX0VSUk9SX01FU1NBR0VdLmluY2x1ZGVzKGUpKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpe2UudG9Mb3dlckNhc2UoKT09Zy5BVVRPSElERSYmKHRoaXMuYXV0b2hpZGU9YSl9Z2V0IG1lZGlhKCl7bGV0IGU9dGhpcy5xdWVyeVNlbGVjdG9yKCI6c2NvcGUgPiBbc2xvdD1tZWRpYV0iKTtyZXR1cm4gZT8ubm9kZU5hbWU9PSJTTE9UIiYmKGU9ZS5hc3NpZ25lZEVsZW1lbnRzKHtmbGF0dGVuOiEwfSlbMF0pLGV9YXN5bmMgaGFuZGxlTWVkaWFVcGRhdGVkKGUpe2UmJih2ZSh0aGlzLEl0LGUpLGUubG9jYWxOYW1lLmluY2x1ZGVzKCItIikmJmF3YWl0IGwuY3VzdG9tRWxlbWVudHMud2hlbkRlZmluZWQoZS5sb2NhbE5hbWUpLHRoaXMubWVkaWFTZXRDYWxsYmFjayhlKSl9Y29ubmVjdGVkQ2FsbGJhY2soKXt2YXIgZTtWKHRoaXMsdWkpLm9ic2VydmUodGhpcyx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxOZSh0aGlzLFYodGhpcyxyYSkpO2xldCBhPXRoaXMuZ2V0QXR0cmlidXRlKGcuQVVESU8pIT1udWxsP2YoImF1ZGlvIHBsYXllciIpOmYoInZpZGVvIHBsYXllciIpO3RoaXMuc2V0QXR0cmlidXRlKCJyb2xlIiwicmVnaW9uIiksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGEpLHRoaXMuaGFuZGxlTWVkaWFVcGRhdGVkKHRoaXMubWVkaWEpLHRoaXMuc2V0QXR0cmlidXRlKGcuVVNFUl9JTkFDVElWRSwiIiksS24odGhpcyx0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtsZXQgcj10aGlzLnF1ZXJ5U2VsZWN0b3IoIjpzY29wZSA+IHNsb3Rbc2xvdD1tZWRpYV0iKTtyJiYodmUodGhpcyxHZSxyKSxWKHRoaXMsR2UpLmFkZEV2ZW50TGlzdGVuZXIoInNsb3RjaGFuZ2UiLFYodGhpcyxzYSkpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIix0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIix0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsdGhpcyksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIix0aGlzKSwoZT1sLndpbmRvdyk9PW51bGx8fGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcyl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXt2YXIgZTtGZSh0aGlzLFYodGhpcyxyYSkpLGNsZWFyVGltZW91dChWKHRoaXMsd3QpKSxWKHRoaXMsdWkpLmRpc2Nvbm5lY3QoKSx0aGlzLm1lZGlhJiZ0aGlzLm1lZGlhVW5zZXRDYWxsYmFjayh0aGlzLm1lZGlhKSwoZT1sLndpbmRvdyk9PW51bGx8fGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcyksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsdGhpcyksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsdGhpcyksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLHRoaXMpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdGhpcyksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdGhpcyksVih0aGlzLEdlKSYmKFYodGhpcyxHZSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2xvdGNoYW5nZSIsVih0aGlzLHNhKSksdmUodGhpcyxHZSxudWxsKSksdmUodGhpcyxrdCwhMSl9bWVkaWFTZXRDYWxsYmFjayhlKXt9bWVkaWFVbnNldENhbGxiYWNrKGUpe3ZlKHRoaXMsSXQsbnVsbCl9aGFuZGxlRXZlbnQoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSJwb2ludGVyZG93biI6dmUodGhpcyxuYSxlLnRpbWVTdGFtcCk7YnJlYWs7Y2FzZSJwb2ludGVybW92ZSI6ZmUodGhpcyxEciwkbikuY2FsbCh0aGlzLGUpO2JyZWFrO2Nhc2UicG9pbnRlcnVwIjpmZSh0aGlzLENyLFZuKS5jYWxsKHRoaXMsZSk7YnJlYWs7Y2FzZSJtb3VzZWxlYXZlIjpmZSh0aGlzLGNpLG9hKS5jYWxsKHRoaXMpO2JyZWFrO2Nhc2UibW91c2V1cCI6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoZy5LRVlCT0FSRF9DT05UUk9MKTticmVhaztjYXNlImtleXVwIjpmZSh0aGlzLE10LGhpKS5jYWxsKHRoaXMpLHRoaXMuc2V0QXR0cmlidXRlKGcuS0VZQk9BUkRfQ09OVFJPTCwiIik7YnJlYWt9fXNldCBhdXRvaGlkZShlKXtsZXQgaT1OdW1iZXIoZSk7dmUodGhpcyx5dCxpc05hTihpKT8wOmkpfWdldCBhdXRvaGlkZSgpe3JldHVybihWKHRoaXMseXQpPT09dm9pZCAwPzI6Vih0aGlzLHl0KSkudG9TdHJpbmcoKX1nZXQgYnJlYWtwb2ludHMoKXtyZXR1cm4gTyh0aGlzLGcuQlJFQUtQT0lOVFMpfXNldCBicmVha3BvaW50cyhlKXtVKHRoaXMsZy5CUkVBS1BPSU5UUyxlKX1nZXQgYXVkaW8oKXtyZXR1cm4gayh0aGlzLGcuQVVESU8pfXNldCBhdWRpbyhlKXt5KHRoaXMsZy5BVURJTyxlKX1nZXQgZ2VzdHVyZXNEaXNhYmxlZCgpe3JldHVybiBrKHRoaXMsZy5HRVNUVVJFU19ESVNBQkxFRCl9c2V0IGdlc3R1cmVzRGlzYWJsZWQoZSl7eSh0aGlzLGcuR0VTVFVSRVNfRElTQUJMRUQsZSl9Z2V0IGtleWJvYXJkQ29udHJvbCgpe3JldHVybiBrKHRoaXMsZy5LRVlCT0FSRF9DT05UUk9MKX1zZXQga2V5Ym9hcmRDb250cm9sKGUpe3kodGhpcyxnLktFWUJPQVJEX0NPTlRST0wsZSl9Z2V0IG5vQXV0b2hpZGUoKXtyZXR1cm4gayh0aGlzLGcuTk9fQVVUT0hJREUpfXNldCBub0F1dG9oaWRlKGUpe3kodGhpcyxnLk5PX0FVVE9ISURFLGUpfWdldCBhdXRvaGlkZU92ZXJDb250cm9scygpe3JldHVybiBrKHRoaXMsZy5BVVRPSElERV9PVkVSX0NPTlRST0xTKX1zZXQgYXV0b2hpZGVPdmVyQ29udHJvbHMoZSl7eSh0aGlzLGcuQVVUT0hJREVfT1ZFUl9DT05UUk9MUyxlKX1nZXQgdXNlckludGVyYWN0aXZlKCl7cmV0dXJuIGsodGhpcyxnLlVTRVJfSU5BQ1RJVkUpfXNldCB1c2VySW50ZXJhY3RpdmUoZSl7eSh0aGlzLGcuVVNFUl9JTkFDVElWRSxlKX19O3VpPW5ldyBXZWFrTWFwO25hPW5ldyBXZWFrTWFwO0l0PW5ldyBXZWFrTWFwO3d0PW5ldyBXZWFrTWFwO3l0PW5ldyBXZWFrTWFwO1JyPW5ldyBXZWFrTWFwO2t0PW5ldyBXZWFrTWFwO3JhPW5ldyBXZWFrTWFwO0RyPW5ldyBXZWFrU2V0OyRuPWZ1bmN0aW9uKHQpe2lmKHQucG9pbnRlclR5cGUhPT0ibW91c2UiJiZ0LnRpbWVTdGFtcC1WKHRoaXMsbmEpPDI1MClyZXR1cm47ZmUodGhpcyxsYSxVcikuY2FsbCh0aGlzKSxjbGVhclRpbWVvdXQoVih0aGlzLHd0KSk7bGV0IGU9dGhpcy5oYXNBdHRyaWJ1dGUoZy5BVVRPSElERV9PVkVSX0NPTlRST0xTKTsoW3RoaXMsdGhpcy5tZWRpYV0uaW5jbHVkZXModC50YXJnZXQpfHxlKSYmZmUodGhpcyxNdCxoaSkuY2FsbCh0aGlzKX07Q3I9bmV3IFdlYWtTZXQ7Vm49ZnVuY3Rpb24odCl7aWYodC5wb2ludGVyVHlwZT09PSJ0b3VjaCIpe2xldCBlPSF0aGlzLmhhc0F0dHJpYnV0ZShnLlVTRVJfSU5BQ1RJVkUpO1t0aGlzLHRoaXMubWVkaWFdLmluY2x1ZGVzKHQudGFyZ2V0KSYmZT9mZSh0aGlzLGNpLG9hKS5jYWxsKHRoaXMpOmZlKHRoaXMsTXQsaGkpLmNhbGwodGhpcyl9ZWxzZSB0LmNvbXBvc2VkUGF0aCgpLnNvbWUoZT0+WyJtZWRpYS1wbGF5LWJ1dHRvbiIsIm1lZGlhLWZ1bGxzY3JlZW4tYnV0dG9uIl0uaW5jbHVkZXMoZT8ubG9jYWxOYW1lKSkmJmZlKHRoaXMsTXQsaGkpLmNhbGwodGhpcyl9O2NpPW5ldyBXZWFrU2V0O29hPWZ1bmN0aW9uKCl7aWYoVih0aGlzLHl0KTwwfHx0aGlzLmhhc0F0dHJpYnV0ZShnLlVTRVJfSU5BQ1RJVkUpKXJldHVybjt0aGlzLnNldEF0dHJpYnV0ZShnLlVTRVJfSU5BQ1RJVkUsIiIpO2xldCB0PW5ldyBsLkN1c3RvbUV2ZW50KHJ0LlVTRVJfSU5BQ1RJVkVfQ0hBTkdFLHtjb21wb3NlZDohMCxidWJibGVzOiEwLGRldGFpbDohMH0pO3RoaXMuZGlzcGF0Y2hFdmVudCh0KX07bGE9bmV3IFdlYWtTZXQ7VXI9ZnVuY3Rpb24oKXtpZighdGhpcy5oYXNBdHRyaWJ1dGUoZy5VU0VSX0lOQUNUSVZFKSlyZXR1cm47dGhpcy5yZW1vdmVBdHRyaWJ1dGUoZy5VU0VSX0lOQUNUSVZFKTtsZXQgdD1uZXcgbC5DdXN0b21FdmVudChydC5VU0VSX0lOQUNUSVZFX0NIQU5HRSx7Y29tcG9zZWQ6ITAsYnViYmxlczohMCxkZXRhaWw6ITF9KTt0aGlzLmRpc3BhdGNoRXZlbnQodCl9O010PW5ldyBXZWFrU2V0O2hpPWZ1bmN0aW9uKCl7ZmUodGhpcyxsYSxVcikuY2FsbCh0aGlzKSxjbGVhclRpbWVvdXQoVih0aGlzLHd0KSk7bGV0IHQ9cGFyc2VJbnQodGhpcy5hdXRvaGlkZSk7dDwwfHx2ZSh0aGlzLHd0LHNldFRpbWVvdXQoKCk9PntmZSh0aGlzLGNpLG9hKS5jYWxsKHRoaXMpfSx0KjFlMykpfTtHZT1uZXcgV2Vha01hcDtzYT1uZXcgV2Vha01hcDtudC5zaGFkb3dSb290T3B0aW9ucz17bW9kZToib3BlbiJ9O250LmdldFRlbXBsYXRlSFRNTD1EbDtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtY29udGFpbmVyIil8fGwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJtZWRpYS1jb250YWluZXIiLG50KTt2YXIgR249KHQsZSxpKT0+e2lmKCFlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCAiK2kpfSx6PSh0LGUsaSk9PihHbih0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLG1pPSh0LGUsaSk9PntpZihlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtlIGluc3RhbmNlb2YgV2Vha1NldD9lLmFkZCh0KTplLnNldCh0LGkpfSxkYT0odCxlLGksYSk9PihHbih0LGUsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxhP2EuY2FsbCh0LGkpOmUuc2V0KHQsaSksaSksTHQsUnQsdWEsb3QsSGUscWUsRHQ9Y2xhc3N7Y29uc3RydWN0b3IoZSxpLHtkZWZhdWx0VmFsdWU6YX09e2RlZmF1bHRWYWx1ZTp2b2lkIDB9KXttaSh0aGlzLEhlKSxtaSh0aGlzLEx0LHZvaWQgMCksbWkodGhpcyxSdCx2b2lkIDApLG1pKHRoaXMsdWEsdm9pZCAwKSxtaSh0aGlzLG90LG5ldyBTZXQpLGRhKHRoaXMsTHQsZSksZGEodGhpcyxSdCxpKSxkYSh0aGlzLHVhLG5ldyBTZXQoYSkpfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHoodGhpcyxIZSxxZSkudmFsdWVzKCl9Z2V0IGxlbmd0aCgpe3JldHVybiB6KHRoaXMsSGUscWUpLnNpemV9Z2V0IHZhbHVlKCl7dmFyIGU7cmV0dXJuKGU9Wy4uLnoodGhpcyxIZSxxZSldLmpvaW4oIiAiKSkhPW51bGw/ZToiIn1zZXQgdmFsdWUoZSl7dmFyIGk7ZSE9PXRoaXMudmFsdWUmJihkYSh0aGlzLG90LG5ldyBTZXQpLHRoaXMuYWRkKC4uLihpPWU/LnNwbGl0KCIgIikpIT1udWxsP2k6W10pKX10b1N0cmluZygpe3JldHVybiB0aGlzLnZhbHVlfWl0ZW0oZSl7cmV0dXJuWy4uLnoodGhpcyxIZSxxZSldW2VdfXZhbHVlcygpe3JldHVybiB6KHRoaXMsSGUscWUpLnZhbHVlcygpfWZvckVhY2goZSxpKXt6KHRoaXMsSGUscWUpLmZvckVhY2goZSxpKX1hZGQoLi4uZSl7dmFyIGksYTtlLmZvckVhY2gocj0+eih0aGlzLG90KS5hZGQocikpLCEodGhpcy52YWx1ZT09PSIiJiYhKChpPXoodGhpcyxMdCkpIT1udWxsJiZpLmhhc0F0dHJpYnV0ZShgJHt6KHRoaXMsUnQpfWApKSkmJigoYT16KHRoaXMsTHQpKT09bnVsbHx8YS5zZXRBdHRyaWJ1dGUoYCR7eih0aGlzLFJ0KX1gLGAke3RoaXMudmFsdWV9YCkpfXJlbW92ZSguLi5lKXt2YXIgaTtlLmZvckVhY2goYT0+eih0aGlzLG90KS5kZWxldGUoYSkpLChpPXoodGhpcyxMdCkpPT1udWxsfHxpLnNldEF0dHJpYnV0ZShgJHt6KHRoaXMsUnQpfWAsYCR7dGhpcy52YWx1ZX1gKX1jb250YWlucyhlKXtyZXR1cm4geih0aGlzLEhlLHFlKS5oYXMoZSl9dG9nZ2xlKGUsaSl7cmV0dXJuIHR5cGVvZiBpPCJ1Ij9pPyh0aGlzLmFkZChlKSwhMCk6KHRoaXMucmVtb3ZlKGUpLCExKTp0aGlzLmNvbnRhaW5zKGUpPyh0aGlzLnJlbW92ZShlKSwhMSk6KHRoaXMuYWRkKGUpLCEwKX1yZXBsYWNlKGUsaSl7cmV0dXJuIHRoaXMucmVtb3ZlKGUpLHRoaXMuYWRkKGkpLGU9PT1pfX07THQ9bmV3IFdlYWtNYXA7UnQ9bmV3IFdlYWtNYXA7dWE9bmV3IFdlYWtNYXA7b3Q9bmV3IFdlYWtNYXA7SGU9bmV3IFdlYWtTZXQ7cWU9ZnVuY3Rpb24oKXtyZXR1cm4geih0aGlzLG90KS5zaXplP3oodGhpcyxvdCk6eih0aGlzLHVhKX07ZnVuY3Rpb24gcW4odCl7cmV0dXJuIHQ/Lm1hcChObCkuam9pbigiICIpfWZ1bmN0aW9uIE5sKHQpe2lmKHQpe2xldHtpZDplLHdpZHRoOmksaGVpZ2h0OmF9PXQ7cmV0dXJuW2UsaSxhXS5maWx0ZXIocj0+ciE9bnVsbCkuam9pbigiOiIpfX1mdW5jdGlvbiBZbih0KXtyZXR1cm4gdD8ubWFwKEZsKS5qb2luKCIgIil9ZnVuY3Rpb24gRmwodCl7aWYodCl7bGV0e2lkOmUsa2luZDppLGxhbmd1YWdlOmEsbGFiZWw6cn09dDtyZXR1cm5bZSxpLGEscl0uZmlsdGVyKHM9PnMhPW51bGwpLmpvaW4oIjoiKX19ZnVuY3Rpb24gQ3QodCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIiYmIU51bWJlci5pc05hTih0KSYmTnVtYmVyLmlzRmluaXRlKHQpfXZhciBjYT10PT5uZXcgUHJvbWlzZShlPT5zZXRUaW1lb3V0KGUsdCkpO3ZhciBIbD0odD0iIik9PnQuc3BsaXQoL1xzKy8pLFFuPSh0PSIiKT0+e2xldFtlLGksYV09dC5zcGxpdCgiOiIpLHI9YT9kZWNvZGVVUklDb21wb25lbnQoYSk6dm9pZCAwO3JldHVybntraW5kOmU9PT0iY2MiP2llLkNBUFRJT05TOmllLlNVQlRJVExFUyxsYW5ndWFnZTppLGxhYmVsOnJ9fSxwaT0odD0iIixlPXt9KT0+SGwodCkubWFwKGk9PntsZXQgYT1RbihpKTtyZXR1cm57Li4uZSwuLi5hfX0pLE9yPXQ9PnQ/QXJyYXkuaXNBcnJheSh0KT90Lm1hcChlPT50eXBlb2YgZT09InN0cmluZyI/UW4oZSk6ZSk6dHlwZW9mIHQ9PSJzdHJpbmciP3BpKHQpOlt0XTpbXSxoYT0oe2tpbmQ6dCxsYWJlbDplLGxhbmd1YWdlOml9PXtraW5kOiJzdWJ0aXRsZXMifSk9PmU/YCR7dD09PSJjYXB0aW9ucyI/ImNjIjoic2IifToke2l9OiR7ZW5jb2RlVVJJQ29tcG9uZW50KGUpfWA6aSxsdD0odD1bXSk9PkFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0LGhhKS5qb2luKCIgIiksQmw9KHQsZSk9Pmk9PmlbdF09PT1lLHpuPXQ9PntsZXQgZT1PYmplY3QuZW50cmllcyh0KS5tYXAoKFtpLGFdKT0+QmwoaSxhKSk7cmV0dXJuIGk9PmUuZXZlcnkoYT0+YShpKSl9LGR0PSh0LGU9W10saT1bXSk9PntsZXQgYT1PcihpKS5tYXAoem4pLHI9cz0+YS5zb21lKG89Pm8ocykpO0FycmF5LmZyb20oZSkuZmlsdGVyKHIpLmZvckVhY2gocz0+e3MubW9kZT10fSl9LHV0PSh0LGU9KCk9PiEwKT0+e2lmKCF0Py50ZXh0VHJhY2tzKXJldHVybltdO2xldCBpPXR5cGVvZiBlPT0iZnVuY3Rpb24iP2U6em4oZSk7cmV0dXJuIEFycmF5LmZyb20odC50ZXh0VHJhY2tzKS5maWx0ZXIoaSl9LFpuPXQ9Pnt2YXIgZTtyZXR1cm4hISgoZT10Lm1lZGlhU3VidGl0bGVzU2hvd2luZykhPW51bGwmJmUubGVuZ3RoKXx8dC5oYXNBdHRyaWJ1dGUobi5NRURJQV9TVUJUSVRMRVNfU0hPV0lORyl9O3ZhciBKbj10PT57dmFyIGU7bGV0e21lZGlhOmksZnVsbHNjcmVlbkVsZW1lbnQ6YX09dDt0cnl7bGV0IHI9YSYmInJlcXVlc3RGdWxsc2NyZWVuImluIGE/InJlcXVlc3RGdWxsc2NyZWVuIjphJiYid2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4iaW4gYT8id2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4iOnZvaWQgMDtpZihyKXtsZXQgcz0oZT1hW3JdKT09bnVsbD92b2lkIDA6ZS5jYWxsKGEpO2lmKHMgaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiBzLmNhdGNoKCgpPT57fSl9ZWxzZSBpPy53ZWJraXRFbnRlckZ1bGxzY3JlZW4/aS53ZWJraXRFbnRlckZ1bGxzY3JlZW4oKTppPy5yZXF1ZXN0RnVsbHNjcmVlbiYmaS5yZXF1ZXN0RnVsbHNjcmVlbigpfWNhdGNoKHIpe2NvbnNvbGUuZXJyb3Iocil9fSxYbj0iZXhpdEZ1bGxzY3JlZW4iaW4gUD8iZXhpdEZ1bGxzY3JlZW4iOiJ3ZWJraXRFeGl0RnVsbHNjcmVlbiJpbiBQPyJ3ZWJraXRFeGl0RnVsbHNjcmVlbiI6IndlYmtpdENhbmNlbEZ1bGxTY3JlZW4iaW4gUD8id2Via2l0Q2FuY2VsRnVsbFNjcmVlbiI6dm9pZCAwLGpuPXQ9Pnt2YXIgZTtsZXR7ZG9jdW1lbnRFbGVtZW50Oml9PXQ7aWYoWG4pe2xldCBhPShlPWk/LltYbl0pPT1udWxsP3ZvaWQgMDplLmNhbGwoaSk7aWYoYSBpbnN0YW5jZW9mIFByb21pc2UpcmV0dXJuIGEuY2F0Y2goKCk9Pnt9KX19LEVpPSJmdWxsc2NyZWVuRWxlbWVudCJpbiBQPyJmdWxsc2NyZWVuRWxlbWVudCI6IndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50ImluIFA/IndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50Ijp2b2lkIDAsV2w9dD0+e2xldHtkb2N1bWVudEVsZW1lbnQ6ZSxtZWRpYTppfT10LGE9ZT8uW0VpXTtyZXR1cm4hYSYmIndlYmtpdERpc3BsYXlpbmdGdWxsc2NyZWVuImluIGkmJiJ3ZWJraXRQcmVzZW50YXRpb25Nb2RlImluIGkmJmkud2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW4mJmkud2Via2l0UHJlc2VudGF0aW9uTW9kZT09PXhuLkZVTExTQ1JFRU4/aTphfSxlbz10PT57dmFyIGU7bGV0e21lZGlhOmksZG9jdW1lbnRFbGVtZW50OmEsZnVsbHNjcmVlbkVsZW1lbnQ6cj1pfT10O2lmKCFpfHwhYSlyZXR1cm4hMTtsZXQgcz1XbCh0KTtpZighcylyZXR1cm4hMTtpZihzPT09cnx8cz09PWkpcmV0dXJuITA7aWYocy5sb2NhbE5hbWUuaW5jbHVkZXMoIi0iKSl7bGV0IG89cy5zaGFkb3dSb290O2lmKCEoRWkgaW4gbykpcmV0dXJuIG5lKHMscik7Zm9yKDtvPy5bRWldOyl7aWYob1tFaV09PT1yKXJldHVybiEwO289KGU9b1tFaV0pPT1udWxsP3ZvaWQgMDplLnNoYWRvd1Jvb3R9fXJldHVybiExfSwkbD0iZnVsbHNjcmVlbkVuYWJsZWQiaW4gUD8iZnVsbHNjcmVlbkVuYWJsZWQiOiJ3ZWJraXRGdWxsc2NyZWVuRW5hYmxlZCJpbiBQPyJ3ZWJraXRGdWxsc2NyZWVuRW5hYmxlZCI6dm9pZCAwLHRvPXQ9PntsZXR7ZG9jdW1lbnRFbGVtZW50OmUsbWVkaWE6aX09dDtyZXR1cm4hIWU/LlskbF18fGkmJiJ3ZWJraXRTdXBwb3J0c0Z1bGxzY3JlZW4iaW4gaX07dmFyIG1hLFByPSgpPT57dmFyIHQsZTtyZXR1cm4gbWF8fChtYT0oZT0odD1QKT09bnVsbD92b2lkIDA6dC5jcmVhdGVFbGVtZW50KT09bnVsbD92b2lkIDA6ZS5jYWxsKHQsInZpZGVvIiksbWEpfSxpbz1hc3luYyh0PVByKCkpPT57aWYoIXQpcmV0dXJuITE7bGV0IGU9dC52b2x1bWU7dC52b2x1bWU9ZS8yKy4xO2xldCBpPW5ldyBBYm9ydENvbnRyb2xsZXIsYT1hd2FpdCBQcm9taXNlLnJhY2UoW1ZsKHQsaS5zaWduYWwpLEtsKHQsZSldKTtyZXR1cm4gaS5hYm9ydCgpLGF9LFZsPSh0LGUpPT5uZXcgUHJvbWlzZShpPT57dC5hZGRFdmVudExpc3RlbmVyKCJ2b2x1bWVjaGFuZ2UiLCgpPT5pKCEwKSx7c2lnbmFsOmV9KX0pLEtsPWFzeW5jKHQsZSk9Pntmb3IobGV0IGk9MDtpPDEwO2krKyl7aWYodC52b2x1bWU9PT1lKXJldHVybiExO2F3YWl0IGNhKDEwKX1yZXR1cm4gdC52b2x1bWUhPT1lfSxHbD0vLipWZXJzaW9uXC8uKlNhZmFyaVwvLiovLnRlc3QobC5uYXZpZ2F0b3IudXNlckFnZW50KSxOcj0odD1QcigpKT0+bC5tYXRjaE1lZGlhKCIoZGlzcGxheS1tb2RlOiBzdGFuZGFsb25lKSIpLm1hdGNoZXMmJkdsPyExOnR5cGVvZiB0Py5yZXF1ZXN0UGljdHVyZUluUGljdHVyZT09ImZ1bmN0aW9uIixGcj0odD1QcigpKT0+dG8oe2RvY3VtZW50RWxlbWVudDpQLG1lZGlhOnR9KSxhbz1GcigpLHJvPU5yKCksc289ISFsLldlYktpdFBsYXliYWNrVGFyZ2V0QXZhaWxhYmlsaXR5RXZlbnQsbm89ISFsLmNocm9tZTt2YXIgeHQ9dD0+dXQodC5tZWRpYSxlPT5baWUuU1VCVElUTEVTLGllLkNBUFRJT05TXS5pbmNsdWRlcyhlLmtpbmQpKS5zb3J0KChlLGkpPT5lLmtpbmQ+PWkua2luZD8xOi0xKSxIcj10PT51dCh0Lm1lZGlhLGU9PmUubW9kZT09PVZlLlNIT1dJTkcmJltpZS5TVUJUSVRMRVMsaWUuQ0FQVElPTlNdLmluY2x1ZGVzKGUua2luZCkpLHBhPSh0LGUpPT57bGV0IGk9eHQodCksYT1Icih0KSxyPSEhYS5sZW5ndGg7aWYoaS5sZW5ndGgpe2lmKGU9PT0hMXx8ciYmZSE9PSEwKWR0KFZlLkRJU0FCTEVELGksYSk7ZWxzZSBpZihlPT09ITB8fCFyJiZlIT09ITEpe2xldCBzPWlbMF0se29wdGlvbnM6b309dDtpZighbz8ubm9TdWJ0aXRsZXNMYW5nUHJlZil7bGV0IFQ9bC5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgibWVkaWEtY2hyb21lLXByZWYtc3VidGl0bGVzLWxhbmciKSxBPVQ/W1QsLi4ubC5uYXZpZ2F0b3IubGFuZ3VhZ2VzXTpsLm5hdmlnYXRvci5sYW5ndWFnZXMsdj1pLmZpbHRlcihtPT5BLnNvbWUoYj0+bS5sYW5ndWFnZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoYi5zcGxpdCgiLSIpWzBdKSkpLnNvcnQoKG0sYik9PntsZXQgRT1BLmZpbmRJbmRleChTPT5tLmxhbmd1YWdlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChTLnNwbGl0KCItIilbMF0pKSxJPUEuZmluZEluZGV4KFM9PmIubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFMuc3BsaXQoIi0iKVswXSkpO3JldHVybiBFLUl9KTt2WzBdJiYocz12WzBdKX1sZXR7bGFuZ3VhZ2U6ZCxsYWJlbDp1LGtpbmQ6X309cztkdChWZS5ESVNBQkxFRCxpLGEpLGR0KFZlLlNIT1dJTkcsaSxbe2xhbmd1YWdlOmQsbGFiZWw6dSxraW5kOl99XSl9fX0sRWE9KHQsZSk9PnQ9PT1lPyEwOnQ9PW51bGx8fGU9PW51bGx8fHR5cGVvZiB0IT10eXBlb2YgZT8hMTp0eXBlb2YgdD09Im51bWJlciImJk51bWJlci5pc05hTih0KSYmTnVtYmVyLmlzTmFOKGUpPyEwOnR5cGVvZiB0IT0ib2JqZWN0Ij8hMTpBcnJheS5pc0FycmF5KHQpP3FsKHQsZSk6T2JqZWN0LmVudHJpZXModCkuZXZlcnkoKFtpLGFdKT0+aSBpbiBlJiZFYShhLGVbaV0pKSxxbD0odCxlKT0+e2xldCBpPUFycmF5LmlzQXJyYXkodCksYT1BcnJheS5pc0FycmF5KGUpO3JldHVybiBpIT09YT8hMTppfHxhP3QubGVuZ3RoIT09ZS5sZW5ndGg/ITE6dC5ldmVyeSgocixzKT0+RWEocixlW3NdKSk6ITB9O3ZhciBZbD1PYmplY3QudmFsdWVzKHBlKSx2YSxRbD1pbygpLnRoZW4odD0+KHZhPXQsdmEpKSxvbz1hc3luYyguLi50KT0+e2F3YWl0IFByb21pc2UuYWxsKHQuZmlsdGVyKGU9PmUpLm1hcChhc3luYyBlPT57aWYoISgibG9jYWxOYW1lImluIGUmJmUgaW5zdGFuY2VvZiBsLkhUTUxFbGVtZW50KSlyZXR1cm47bGV0IGk9ZS5sb2NhbE5hbWU7aWYoIWkuaW5jbHVkZXMoIi0iKSlyZXR1cm47bGV0IGE9bC5jdXN0b21FbGVtZW50cy5nZXQoaSk7YSYmZSBpbnN0YW5jZW9mIGF8fChhd2FpdCBsLmN1c3RvbUVsZW1lbnRzLndoZW5EZWZpbmVkKGkpLGwuY3VzdG9tRWxlbWVudHMudXBncmFkZShlKSl9KSl9LHpsPW5ldyBsLkRPTVBhcnNlcixabD10PT50JiYoemwucGFyc2VGcm9tU3RyaW5nKHQsInRleHQvaHRtbCIpLmJvZHkudGV4dENvbnRlbnR8fHQpLFV0PXttZWRpYUVycm9yOntnZXQodCxlKXtsZXR7bWVkaWE6aX09dDtpZihlPy50eXBlIT09InBsYXlpbmciKXJldHVybiBpPy5lcnJvcn0sbWVkaWFFdmVudHM6WyJlbXB0aWVkIiwiZXJyb3IiLCJwbGF5aW5nIl19LG1lZGlhRXJyb3JDb2RlOntnZXQodCxlKXt2YXIgaTtsZXR7bWVkaWE6YX09dDtpZihlPy50eXBlIT09InBsYXlpbmciKXJldHVybihpPWE/LmVycm9yKT09bnVsbD92b2lkIDA6aS5jb2RlfSxtZWRpYUV2ZW50czpbImVtcHRpZWQiLCJlcnJvciIsInBsYXlpbmciXX0sbWVkaWFFcnJvck1lc3NhZ2U6e2dldCh0LGUpe3ZhciBpLGE7bGV0e21lZGlhOnJ9PXQ7aWYoZT8udHlwZSE9PSJwbGF5aW5nIilyZXR1cm4oYT0oaT1yPy5lcnJvcik9PW51bGw/dm9pZCAwOmkubWVzc2FnZSkhPW51bGw/YToiIn0sbWVkaWFFdmVudHM6WyJlbXB0aWVkIiwiZXJyb3IiLCJwbGF5aW5nIl19LG1lZGlhV2lkdGg6e2dldCh0KXt2YXIgZTtsZXR7bWVkaWE6aX09dDtyZXR1cm4oZT1pPy52aWRlb1dpZHRoKSE9bnVsbD9lOjB9LG1lZGlhRXZlbnRzOlsicmVzaXplIl19LG1lZGlhSGVpZ2h0OntnZXQodCl7dmFyIGU7bGV0e21lZGlhOml9PXQ7cmV0dXJuKGU9aT8udmlkZW9IZWlnaHQpIT1udWxsP2U6MH0sbWVkaWFFdmVudHM6WyJyZXNpemUiXX0sbWVkaWFQYXVzZWQ6e2dldCh0KXt2YXIgZTtsZXR7bWVkaWE6aX09dDtyZXR1cm4oZT1pPy5wYXVzZWQpIT1udWxsP2U6ITB9LHNldCh0LGUpe3ZhciBpO2xldHttZWRpYTphfT1lO2EmJih0P2EucGF1c2UoKTooaT1hLnBsYXkoKSk9PW51bGx8fGkuY2F0Y2goKCk9Pnt9KSl9LG1lZGlhRXZlbnRzOlsicGxheSIsInBsYXlpbmciLCJwYXVzZSIsImVtcHRpZWQiXX0sbWVkaWFIYXNQbGF5ZWQ6e2dldCh0LGUpe2xldHttZWRpYTppfT10O3JldHVybiBpP2U/ZS50eXBlPT09InBsYXlpbmciOiFpLnBhdXNlZDohMX0sbWVkaWFFdmVudHM6WyJwbGF5aW5nIiwiZW1wdGllZCJdfSxtZWRpYUVuZGVkOntnZXQodCl7dmFyIGU7bGV0e21lZGlhOml9PXQ7cmV0dXJuKGU9aT8uZW5kZWQpIT1udWxsP2U6ITF9LG1lZGlhRXZlbnRzOlsic2Vla2VkIiwiZW5kZWQiLCJlbXB0aWVkIl19LG1lZGlhUGxheWJhY2tSYXRlOntnZXQodCl7dmFyIGU7bGV0e21lZGlhOml9PXQ7cmV0dXJuKGU9aT8ucGxheWJhY2tSYXRlKSE9bnVsbD9lOjF9LHNldCh0LGUpe2xldHttZWRpYTppfT1lO2kmJk51bWJlci5pc0Zpbml0ZSgrdCkmJihpLnBsYXliYWNrUmF0ZT0rdCl9LG1lZGlhRXZlbnRzOlsicmF0ZWNoYW5nZSIsImxvYWRzdGFydCJdfSxtZWRpYU11dGVkOntnZXQodCl7dmFyIGU7bGV0e21lZGlhOml9PXQ7cmV0dXJuKGU9aT8ubXV0ZWQpIT1udWxsP2U6ITF9LHNldCh0LGUpe2xldHttZWRpYTppLG9wdGlvbnM6e25vTXV0ZWRQcmVmOmF9PXt9fT1lO2lmKGkpe2kubXV0ZWQ9dDt0cnl7bGV0IHI9bC5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgibWVkaWEtY2hyb21lLXByZWYtbXV0ZWQiKSE9PW51bGwscz1pLmhhc0F0dHJpYnV0ZSgibXV0ZWQiKTtpZihhKXtyJiZsLmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJtZWRpYS1jaHJvbWUtcHJlZi1tdXRlZCIpO3JldHVybn1pZihzJiYhcilyZXR1cm47bC5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibWVkaWEtY2hyb21lLXByZWYtbXV0ZWQiLHQ/InRydWUiOiJmYWxzZSIpfWNhdGNoKHIpe2NvbnNvbGUuZGVidWcoIkVycm9yIHNldHRpbmcgbXV0ZWQgcHJlZiIscil9fX0sbWVkaWFFdmVudHM6WyJ2b2x1bWVjaGFuZ2UiXSxzdGF0ZU93bmVyc1VwZGF0ZUhhbmRsZXJzOlsodCxlKT0+e2xldHtvcHRpb25zOntub011dGVkUHJlZjppfX09ZSx7bWVkaWE6YX09ZTtpZighKCFhfHxhLm11dGVkfHxpKSl0cnl7bGV0IHI9bC5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgibWVkaWEtY2hyb21lLXByZWYtbXV0ZWQiKT09PSJ0cnVlIjtVdC5tZWRpYU11dGVkLnNldChyLGUpLHQocil9Y2F0Y2gocil7Y29uc29sZS5kZWJ1ZygiRXJyb3IgZ2V0dGluZyBtdXRlZCBwcmVmIixyKX19XX0sbWVkaWFMb29wOntnZXQodCl7bGV0e21lZGlhOmV9PXQ7cmV0dXJuIGU/Lmxvb3B9LHNldCh0LGUpe2xldHttZWRpYTppfT1lO2kmJihpLmxvb3A9dCl9LG1lZGlhRXZlbnRzOlsibWVkaWFsb29wcmVxdWVzdCJdfSxtZWRpYVZvbHVtZTp7Z2V0KHQpe3ZhciBlO2xldHttZWRpYTppfT10O3JldHVybihlPWk/LnZvbHVtZSkhPW51bGw/ZToxfSxzZXQodCxlKXtsZXR7bWVkaWE6aSxvcHRpb25zOntub1ZvbHVtZVByZWY6YX09e319PWU7aWYoaSl7dHJ5e3Q9PW51bGw/bC5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgibWVkaWEtY2hyb21lLXByZWYtdm9sdW1lIik6IWkuaGFzQXR0cmlidXRlKCJtdXRlZCIpJiYhYSYmbC5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibWVkaWEtY2hyb21lLXByZWYtdm9sdW1lIix0LnRvU3RyaW5nKCkpfWNhdGNoKHIpe2NvbnNvbGUuZGVidWcoIkVycm9yIHNldHRpbmcgdm9sdW1lIHByZWYiLHIpfU51bWJlci5pc0Zpbml0ZSgrdCkmJihpLnZvbHVtZT0rdCl9fSxtZWRpYUV2ZW50czpbInZvbHVtZWNoYW5nZSJdLHN0YXRlT3duZXJzVXBkYXRlSGFuZGxlcnM6Wyh0LGUpPT57bGV0e29wdGlvbnM6e25vVm9sdW1lUHJlZjppfX09ZTtpZighaSl0cnl7bGV0e21lZGlhOmF9PWU7aWYoIWEpcmV0dXJuO2xldCByPWwubG9jYWxTdG9yYWdlLmdldEl0ZW0oIm1lZGlhLWNocm9tZS1wcmVmLXZvbHVtZSIpO2lmKHI9PW51bGwpcmV0dXJuO1V0Lm1lZGlhVm9sdW1lLnNldCgrcixlKSx0KCtyKX1jYXRjaChhKXtjb25zb2xlLmRlYnVnKCJFcnJvciBnZXR0aW5nIHZvbHVtZSBwcmVmIixhKX19XX0sbWVkaWFWb2x1bWVMZXZlbDp7Z2V0KHQpe2xldHttZWRpYTplfT10O3JldHVybiB0eXBlb2YgZT8udm9sdW1lPiJ1Ij8iaGlnaCI6ZS5tdXRlZHx8ZS52b2x1bWU9PT0wPyJvZmYiOmUudm9sdW1lPC41PyJsb3ciOmUudm9sdW1lPC43NT8ibWVkaXVtIjoiaGlnaCJ9LG1lZGlhRXZlbnRzOlsidm9sdW1lY2hhbmdlIl19LG1lZGlhQ3VycmVudFRpbWU6e2dldCh0KXt2YXIgZTtsZXR7bWVkaWE6aX09dDtyZXR1cm4oZT1pPy5jdXJyZW50VGltZSkhPW51bGw/ZTowfSxzZXQodCxlKXtsZXR7bWVkaWE6aX09ZTshaXx8IUN0KHQpfHwoaS5jdXJyZW50VGltZT10KX0sbWVkaWFFdmVudHM6WyJ0aW1ldXBkYXRlIiwibG9hZGVkbWV0YWRhdGEiXX0sbWVkaWFEdXJhdGlvbjp7Z2V0KHQpe2xldHttZWRpYTplLG9wdGlvbnM6e2RlZmF1bHREdXJhdGlvbjppfT17fX09dDtyZXR1cm4gaSYmKCFlfHwhZS5kdXJhdGlvbnx8TnVtYmVyLmlzTmFOKGUuZHVyYXRpb24pfHwhTnVtYmVyLmlzRmluaXRlKGUuZHVyYXRpb24pKT9pOk51bWJlci5pc0Zpbml0ZShlPy5kdXJhdGlvbik/ZS5kdXJhdGlvbjpOdW1iZXIuTmFOfSxtZWRpYUV2ZW50czpbImR1cmF0aW9uY2hhbmdlIiwibG9hZGVkbWV0YWRhdGEiLCJlbXB0aWVkIl19LG1lZGlhTG9hZGluZzp7Z2V0KHQpe2xldHttZWRpYTplfT10O3JldHVybiBlPy5yZWFkeVN0YXRlPDN9LG1lZGlhRXZlbnRzOlsid2FpdGluZyIsInBsYXlpbmciLCJlbXB0aWVkIl19LG1lZGlhU2Vla2FibGU6e2dldCh0KXt2YXIgZTtsZXR7bWVkaWE6aX09dDtpZighKChlPWk/LnNlZWthYmxlKSE9bnVsbCYmZS5sZW5ndGgpKXJldHVybjtsZXQgYT1pLnNlZWthYmxlLnN0YXJ0KDApLHI9aS5zZWVrYWJsZS5lbmQoaS5zZWVrYWJsZS5sZW5ndGgtMSk7aWYoISghYSYmIXIpKXJldHVybltOdW1iZXIoYS50b0ZpeGVkKDMpKSxOdW1iZXIoci50b0ZpeGVkKDMpKV19LG1lZGlhRXZlbnRzOlsibG9hZGVkbWV0YWRhdGEiLCJlbXB0aWVkIiwicHJvZ3Jlc3MiLCJzZWVrYWJsZWNoYW5nZSJdfSxtZWRpYUJ1ZmZlcmVkOntnZXQodCl7dmFyIGU7bGV0e21lZGlhOml9PXQsYT0oZT1pPy5idWZmZXJlZCkhPW51bGw/ZTpbXTtyZXR1cm4gQXJyYXkuZnJvbShhKS5tYXAoKHIscyk9PltOdW1iZXIoYS5zdGFydChzKS50b0ZpeGVkKDMpKSxOdW1iZXIoYS5lbmQocykudG9GaXhlZCgzKSldKX0sbWVkaWFFdmVudHM6WyJwcm9ncmVzcyIsImVtcHRpZWQiXX0sbWVkaWFTdHJlYW1UeXBlOntnZXQodCl7bGV0e21lZGlhOmUsb3B0aW9uczp7ZGVmYXVsdFN0cmVhbVR5cGU6aX09e319PXQsYT1bcGUuTElWRSxwZS5PTl9ERU1BTkRdLmluY2x1ZGVzKGkpP2k6dm9pZCAwO2lmKCFlKXJldHVybiBhO2xldHtzdHJlYW1UeXBlOnJ9PWU7aWYoWWwuaW5jbHVkZXMocikpcmV0dXJuIHI9PT1wZS5VTktOT1dOP2E6cjtsZXQgcz1lLmR1cmF0aW9uO3JldHVybiBzPT09MS8wP3BlLkxJVkU6TnVtYmVyLmlzRmluaXRlKHMpP3BlLk9OX0RFTUFORDphfSxtZWRpYUV2ZW50czpbImVtcHRpZWQiLCJkdXJhdGlvbmNoYW5nZSIsImxvYWRlZG1ldGFkYXRhIiwic3RyZWFtdHlwZWNoYW5nZSJdfSxtZWRpYVRhcmdldExpdmVXaW5kb3c6e2dldCh0KXtsZXR7bWVkaWE6ZX09dDtpZighZSlyZXR1cm4gTnVtYmVyLk5hTjtsZXR7dGFyZ2V0TGl2ZVdpbmRvdzppfT1lLGE9VXQubWVkaWFTdHJlYW1UeXBlLmdldCh0KTtyZXR1cm4oaT09bnVsbHx8TnVtYmVyLmlzTmFOKGkpKSYmYT09PXBlLkxJVkU/MDppfSxtZWRpYUV2ZW50czpbImVtcHRpZWQiLCJkdXJhdGlvbmNoYW5nZSIsImxvYWRlZG1ldGFkYXRhIiwic3RyZWFtdHlwZWNoYW5nZSIsInRhcmdldGxpdmV3aW5kb3djaGFuZ2UiXX0sbWVkaWFUaW1lSXNMaXZlOntnZXQodCl7bGV0e21lZGlhOmUsb3B0aW9uczp7bGl2ZUVkZ2VPZmZzZXQ6aT0xMH09e319PXQ7aWYoIWUpcmV0dXJuITE7aWYodHlwZW9mIGUubGl2ZUVkZ2VTdGFydD09Im51bWJlciIpcmV0dXJuIE51bWJlci5pc05hTihlLmxpdmVFZGdlU3RhcnQpPyExOmUuY3VycmVudFRpbWU+PWUubGl2ZUVkZ2VTdGFydDtpZighKFV0Lm1lZGlhU3RyZWFtVHlwZS5nZXQodCk9PT1wZS5MSVZFKSlyZXR1cm4hMTtsZXQgcj1lLnNlZWthYmxlO2lmKCFyKXJldHVybiEwO2lmKCFyLmxlbmd0aClyZXR1cm4hMTtsZXQgcz1yLmVuZChyLmxlbmd0aC0xKS1pO3JldHVybiBlLmN1cnJlbnRUaW1lPj1zfSxtZWRpYUV2ZW50czpbInBsYXlpbmciLCJ0aW1ldXBkYXRlIiwicHJvZ3Jlc3MiLCJ3YWl0aW5nIiwiZW1wdGllZCJdfSxtZWRpYVN1YnRpdGxlc0xpc3Q6e2dldCh0KXtyZXR1cm4geHQodCkubWFwKCh7a2luZDplLGxhYmVsOmksbGFuZ3VhZ2U6YX0pPT4oe2tpbmQ6ZSxsYWJlbDppLGxhbmd1YWdlOmF9KSl9LG1lZGlhRXZlbnRzOlsibG9hZHN0YXJ0Il0sdGV4dFRyYWNrc0V2ZW50czpbImFkZHRyYWNrIiwicmVtb3ZldHJhY2siXX0sbWVkaWFTdWJ0aXRsZXNTaG93aW5nOntnZXQodCl7cmV0dXJuIEhyKHQpLm1hcCgoe2tpbmQ6ZSxsYWJlbDppLGxhbmd1YWdlOmF9KT0+KHtraW5kOmUsbGFiZWw6aSxsYW5ndWFnZTphfSkpfSxtZWRpYUV2ZW50czpbImxvYWRzdGFydCJdLHRleHRUcmFja3NFdmVudHM6WyJhZGR0cmFjayIsInJlbW92ZXRyYWNrIiwiY2hhbmdlIl0sc3RhdGVPd25lcnNVcGRhdGVIYW5kbGVyczpbKHQsZSk9Pnt2YXIgaSxhO2xldHttZWRpYTpyLG9wdGlvbnM6c309ZTtpZighcilyZXR1cm47bGV0IG89ZD0+e3ZhciB1OyFzLmRlZmF1bHRTdWJ0aXRsZXN8fGQmJiFbaWUuQ0FQVElPTlMsaWUuU1VCVElUTEVTXS5pbmNsdWRlcygodT1kPy50cmFjayk9PW51bGw/dm9pZCAwOnUua2luZCl8fHBhKGUsITApfTtyZXR1cm4gci5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLG8pLChpPXIudGV4dFRyYWNrcyk9PW51bGx8fGkuYWRkRXZlbnRMaXN0ZW5lcigiYWRkdHJhY2siLG8pLChhPXIudGV4dFRyYWNrcyk9PW51bGx8fGEuYWRkRXZlbnRMaXN0ZW5lcigicmVtb3ZldHJhY2siLG8pLCgpPT57dmFyIGQsdTtyLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsbyksKGQ9ci50ZXh0VHJhY2tzKT09bnVsbHx8ZC5yZW1vdmVFdmVudExpc3RlbmVyKCJhZGR0cmFjayIsbyksKHU9ci50ZXh0VHJhY2tzKT09bnVsbHx8dS5yZW1vdmVFdmVudExpc3RlbmVyKCJyZW1vdmV0cmFjayIsbyl9fV19LG1lZGlhQ2hhcHRlcnNDdWVzOntnZXQodCl7dmFyIGU7bGV0e21lZGlhOml9PXQ7aWYoIWkpcmV0dXJuW107bGV0W2FdPXV0KGkse2tpbmQ6aWUuQ0hBUFRFUlN9KTtyZXR1cm4gQXJyYXkuZnJvbSgoZT1hPy5jdWVzKSE9bnVsbD9lOltdKS5tYXAoKHt0ZXh0OnIsc3RhcnRUaW1lOnMsZW5kVGltZTpvfSk9Pih7dGV4dDpabChyKSxzdGFydFRpbWU6cyxlbmRUaW1lOm99KSl9LG1lZGlhRXZlbnRzOlsibG9hZHN0YXJ0IiwibG9hZGVkbWV0YWRhdGEiXSx0ZXh0VHJhY2tzRXZlbnRzOlsiYWRkdHJhY2siLCJyZW1vdmV0cmFjayIsImNoYW5nZSJdLHN0YXRlT3duZXJzVXBkYXRlSGFuZGxlcnM6Wyh0LGUpPT57dmFyIGk7bGV0e21lZGlhOmF9PWU7aWYoIWEpcmV0dXJuO2xldCByPWEucXVlcnlTZWxlY3RvcigndHJhY2tba2luZD0iY2hhcHRlcnMiXVtkZWZhdWx0XVtzcmNdJykscz0oaT1hLnNoYWRvd1Jvb3QpPT1udWxsP3ZvaWQgMDppLnF1ZXJ5U2VsZWN0b3IoJzppcyh2aWRlbyxhdWRpbykgPiB0cmFja1traW5kPSJjaGFwdGVycyJdW2RlZmF1bHRdW3NyY10nKTtyZXR1cm4gcj8uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsdCkscz8uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsdCksKCk9PntyPy5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIix0KSxzPy5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIix0KX19XX0sbWVkaWFJc1BpcDp7Z2V0KHQpe3ZhciBlLGk7bGV0e21lZGlhOmEsZG9jdW1lbnRFbGVtZW50OnJ9PXQ7aWYoIWF8fCFyfHwhci5waWN0dXJlSW5QaWN0dXJlRWxlbWVudClyZXR1cm4hMTtpZihyLnBpY3R1cmVJblBpY3R1cmVFbGVtZW50PT09YSlyZXR1cm4hMDtpZihyLnBpY3R1cmVJblBpY3R1cmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTE1lZGlhRWxlbWVudClyZXR1cm4oZT1hLmxvY2FsTmFtZSkhPW51bGwmJmUuaW5jbHVkZXMoIi0iKT9uZShhLHIucGljdHVyZUluUGljdHVyZUVsZW1lbnQpOiExO2lmKHIucGljdHVyZUluUGljdHVyZUVsZW1lbnQubG9jYWxOYW1lLmluY2x1ZGVzKCItIikpe2xldCBzPXIucGljdHVyZUluUGljdHVyZUVsZW1lbnQuc2hhZG93Um9vdDtmb3IoO3M/LnBpY3R1cmVJblBpY3R1cmVFbGVtZW50Oyl7aWYocy5waWN0dXJlSW5QaWN0dXJlRWxlbWVudD09PWEpcmV0dXJuITA7cz0oaT1zLnBpY3R1cmVJblBpY3R1cmVFbGVtZW50KT09bnVsbD92b2lkIDA6aS5zaGFkb3dSb290fX1yZXR1cm4hMX0sc2V0KHQsZSl7bGV0e21lZGlhOml9PWU7aWYoaSlpZih0KXtpZighUC5waWN0dXJlSW5QaWN0dXJlRW5hYmxlZCl7Y29uc29sZS53YXJuKCJNZWRpYUNocm9tZTogUGljdHVyZS1pbi1waWN0dXJlIGlzIG5vdCBlbmFibGVkIik7cmV0dXJufWlmKCFpLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKXtjb25zb2xlLndhcm4oIk1lZGlhQ2hyb21lOiBUaGUgY3VycmVudCBtZWRpYSBkb2VzIG5vdCBzdXBwb3J0IHBpY3R1cmUtaW4tcGljdHVyZSIpO3JldHVybn1sZXQgYT0oKT0+e2NvbnNvbGUud2FybigiTWVkaWFDaHJvbWU6IFRoZSBtZWRpYSBpcyBub3QgcmVhZHkgZm9yIHBpY3R1cmUtaW4tcGljdHVyZS4gSXQgbXVzdCBoYXZlIGEgcmVhZHlTdGF0ZSA+IDAuIil9O2kucmVxdWVzdFBpY3R1cmVJblBpY3R1cmUoKS5jYXRjaChyPT57aWYoci5jb2RlPT09MTEpe2lmKCFpLnNyYyl7Y29uc29sZS53YXJuKCJNZWRpYUNocm9tZTogVGhlIG1lZGlhIGlzIG5vdCByZWFkeSBmb3IgcGljdHVyZS1pbi1waWN0dXJlLiBJdCBtdXN0IGhhdmUgYSBzcmMgc2V0LiIpO3JldHVybn1pZihpLnJlYWR5U3RhdGU9PT0wJiZpLnByZWxvYWQ9PT0ibm9uZSIpe2xldCBzPSgpPT57aS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsbyksaS5wcmVsb2FkPSJub25lIn0sbz0oKT0+e2kucmVxdWVzdFBpY3R1cmVJblBpY3R1cmUoKS5jYXRjaChhKSxzKCl9O2kuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLG8pLGkucHJlbG9hZD0ibWV0YWRhdGEiLHNldFRpbWVvdXQoKCk9PntpLnJlYWR5U3RhdGU9PT0wJiZhKCkscygpfSwxZTMpfWVsc2UgdGhyb3cgcn1lbHNlIHRocm93IHJ9KX1lbHNlIFAucGljdHVyZUluUGljdHVyZUVsZW1lbnQmJlAuZXhpdFBpY3R1cmVJblBpY3R1cmUoKX0sbWVkaWFFdmVudHM6WyJlbnRlcnBpY3R1cmVpbnBpY3R1cmUiLCJsZWF2ZXBpY3R1cmVpbnBpY3R1cmUiXX0sbWVkaWFSZW5kaXRpb25MaXN0OntnZXQodCl7dmFyIGU7bGV0e21lZGlhOml9PXQ7cmV0dXJuWy4uLihlPWk/LnZpZGVvUmVuZGl0aW9ucykhPW51bGw/ZTpbXV0ubWFwKGE9Pih7Li4uYX0pKX0sbWVkaWFFdmVudHM6WyJlbXB0aWVkIiwibG9hZHN0YXJ0Il0sdmlkZW9SZW5kaXRpb25zRXZlbnRzOlsiYWRkcmVuZGl0aW9uIiwicmVtb3ZlcmVuZGl0aW9uIl19LG1lZGlhUmVuZGl0aW9uU2VsZWN0ZWQ6e2dldCh0KXt2YXIgZSxpLGE7bGV0e21lZGlhOnJ9PXQ7cmV0dXJuKGE9KGk9cj8udmlkZW9SZW5kaXRpb25zKT09bnVsbD92b2lkIDA6aVsoZT1yLnZpZGVvUmVuZGl0aW9ucyk9PW51bGw/dm9pZCAwOmUuc2VsZWN0ZWRJbmRleF0pPT1udWxsP3ZvaWQgMDphLmlkfSxzZXQodCxlKXtsZXR7bWVkaWE6aX09ZTtpZighaT8udmlkZW9SZW5kaXRpb25zKXtjb25zb2xlLndhcm4oIk1lZGlhQ29udHJvbGxlcjogUmVuZGl0aW9uIHNlbGVjdGlvbiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWVkaWEuIik7cmV0dXJufWxldCBhPXQscj1BcnJheS5wcm90b3R5cGUuZmluZEluZGV4LmNhbGwoaS52aWRlb1JlbmRpdGlvbnMscz0+cy5pZD09YSk7aS52aWRlb1JlbmRpdGlvbnMuc2VsZWN0ZWRJbmRleCE9ciYmKGkudmlkZW9SZW5kaXRpb25zLnNlbGVjdGVkSW5kZXg9cil9LG1lZGlhRXZlbnRzOlsiZW1wdGllZCJdLHZpZGVvUmVuZGl0aW9uc0V2ZW50czpbImFkZHJlbmRpdGlvbiIsInJlbW92ZXJlbmRpdGlvbiIsImNoYW5nZSJdfSxtZWRpYUF1ZGlvVHJhY2tMaXN0OntnZXQodCl7dmFyIGU7bGV0e21lZGlhOml9PXQ7cmV0dXJuWy4uLihlPWk/LmF1ZGlvVHJhY2tzKSE9bnVsbD9lOltdXX0sbWVkaWFFdmVudHM6WyJlbXB0aWVkIiwibG9hZHN0YXJ0Il0sYXVkaW9UcmFja3NFdmVudHM6WyJhZGR0cmFjayIsInJlbW92ZXRyYWNrIl19LG1lZGlhQXVkaW9UcmFja0VuYWJsZWQ6e2dldCh0KXt2YXIgZSxpO2xldHttZWRpYTphfT10O3JldHVybihpPVsuLi4oZT1hPy5hdWRpb1RyYWNrcykhPW51bGw/ZTpbXV0uZmluZChyPT5yLmVuYWJsZWQpKT09bnVsbD92b2lkIDA6aS5pZH0sc2V0KHQsZSl7bGV0e21lZGlhOml9PWU7aWYoIWk/LmF1ZGlvVHJhY2tzKXtjb25zb2xlLndhcm4oIk1lZGlhQ2hyb21lOiBBdWRpbyB0cmFjayBzZWxlY3Rpb24gbm90IHN1cHBvcnRlZCBieSB0aGlzIG1lZGlhLiIpO3JldHVybn1sZXQgYT10O2ZvcihsZXQgciBvZiBpLmF1ZGlvVHJhY2tzKXIuZW5hYmxlZD1hPT1yLmlkfSxtZWRpYUV2ZW50czpbImVtcHRpZWQiXSxhdWRpb1RyYWNrc0V2ZW50czpbImFkZHRyYWNrIiwicmVtb3ZldHJhY2siLCJjaGFuZ2UiXX0sbWVkaWFJc0Z1bGxzY3JlZW46e2dldCh0KXtyZXR1cm4gZW8odCl9LHNldCh0LGUsaSl7dmFyIGEscjt0PyhKbihlKSxpLmRldGFpbCYmISgoYT1lLm1lZGlhKSE9bnVsbCYmYS5pbmVydCkmJigocj1lLm1lZGlhKT09bnVsbHx8ci5mb2N1cygpKSk6am4oZSl9LHJvb3RFdmVudHM6WyJmdWxsc2NyZWVuY2hhbmdlIiwid2Via2l0ZnVsbHNjcmVlbmNoYW5nZSJdLG1lZGlhRXZlbnRzOlsid2Via2l0YmVnaW5mdWxsc2NyZWVuIiwid2Via2l0ZW5kZnVsbHNjcmVlbiIsIndlYmtpdHByZXNlbnRhdGlvbm1vZGVjaGFuZ2VkIl19LG1lZGlhSXNDYXN0aW5nOntnZXQodCl7dmFyIGU7bGV0e21lZGlhOml9PXQ7cmV0dXJuIWk/LnJlbW90ZXx8KChlPWkucmVtb3RlKT09bnVsbD92b2lkIDA6ZS5zdGF0ZSk9PT0iZGlzY29ubmVjdGVkIj8hMTppLnJlbW90ZS5zdGF0ZT09PSJjb25uZWN0ZWQifSxzZXQodCxlKXt2YXIgaSxhO2xldHttZWRpYTpyfT1lO2lmKHImJiEodCYmKChpPXIucmVtb3RlKT09bnVsbD92b2lkIDA6aS5zdGF0ZSkhPT0iZGlzY29ubmVjdGVkIikmJiEoIXQmJigoYT1yLnJlbW90ZSk9PW51bGw/dm9pZCAwOmEuc3RhdGUpIT09ImNvbm5lY3RlZCIpKXtpZih0eXBlb2Ygci5yZW1vdGUucHJvbXB0IT0iZnVuY3Rpb24iKXtjb25zb2xlLndhcm4oIk1lZGlhQ2hyb21lOiBDYXN0aW5nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCIpO3JldHVybn1yLnJlbW90ZS5wcm9tcHQoKS5jYXRjaCgoKT0+e30pfX0scmVtb3RlRXZlbnRzOlsiY29ubmVjdCIsImNvbm5lY3RpbmciLCJkaXNjb25uZWN0Il19LG1lZGlhSXNBaXJwbGF5aW5nOntnZXQoKXtyZXR1cm4hMX0sc2V0KHQsZSl7bGV0e21lZGlhOml9PWU7aWYoaSl7aWYoIShpLndlYmtpdFNob3dQbGF5YmFja1RhcmdldFBpY2tlciYmbC5XZWJLaXRQbGF5YmFja1RhcmdldEF2YWlsYWJpbGl0eUV2ZW50KSl7Y29uc29sZS5lcnJvcigiTWVkaWFDaHJvbWU6IHJlY2VpdmVkIGEgcmVxdWVzdCB0byBzZWxlY3QgQWlyUGxheSBidXQgQWlyUGxheSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQiKTtyZXR1cm59aS53ZWJraXRTaG93UGxheWJhY2tUYXJnZXRQaWNrZXIoKX19LG1lZGlhRXZlbnRzOlsid2Via2l0Y3VycmVudHBsYXliYWNrdGFyZ2V0aXN3aXJlbGVzc2NoYW5nZWQiXX0sbWVkaWFGdWxsc2NyZWVuVW5hdmFpbGFibGU6e2dldCh0KXtsZXR7bWVkaWE6ZX09dDtpZighYW98fCFGcihlKSlyZXR1cm4gYWUuVU5TVVBQT1JURUR9fSxtZWRpYVBpcFVuYXZhaWxhYmxlOntnZXQodCl7bGV0e21lZGlhOmV9PXQ7aWYoIXJvfHwhTnIoZSkpcmV0dXJuIGFlLlVOU1VQUE9SVEVEO2lmKGU/LmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlKXJldHVybiBhZS5VTkFWQUlMQUJMRX19LG1lZGlhVm9sdW1lVW5hdmFpbGFibGU6e2dldCh0KXtsZXR7bWVkaWE6ZX09dDtpZih2YT09PSExfHxlPy52b2x1bWU9PW51bGwpcmV0dXJuIGFlLlVOU1VQUE9SVEVEfSxzdGF0ZU93bmVyc1VwZGF0ZUhhbmRsZXJzOlt0PT57dmE9PW51bGwmJlFsLnRoZW4oZT0+dChlP3ZvaWQgMDphZS5VTlNVUFBPUlRFRCkpfV19LG1lZGlhQ2FzdFVuYXZhaWxhYmxlOntnZXQodCx7YXZhaWxhYmlsaXR5OmU9Im5vdC1hdmFpbGFibGUifT17fSl7dmFyIGk7bGV0e21lZGlhOmF9PXQ7aWYoIW5vfHwhKChpPWE/LnJlbW90ZSkhPW51bGwmJmkuc3RhdGUpKXJldHVybiBhZS5VTlNVUFBPUlRFRDtpZighKGU9PW51bGx8fGU9PT0iYXZhaWxhYmxlIikpcmV0dXJuIGFlLlVOQVZBSUxBQkxFfSxzdGF0ZU93bmVyc1VwZGF0ZUhhbmRsZXJzOlsodCxlKT0+e3ZhciBpO2xldHttZWRpYTphfT1lO3JldHVybiBhPyhhLmRpc2FibGVSZW1vdGVQbGF5YmFja3x8YS5oYXNBdHRyaWJ1dGUoImRpc2FibGVyZW1vdGVwbGF5YmFjayIpfHwoaT1hPy5yZW1vdGUpPT1udWxsfHxpLndhdGNoQXZhaWxhYmlsaXR5KHM9Pnt0KHthdmFpbGFiaWxpdHk6cz8iYXZhaWxhYmxlIjoibm90LWF2YWlsYWJsZSJ9KX0pLmNhdGNoKHM9PntzLm5hbWU9PT0iTm90U3VwcG9ydGVkRXJyb3IiP3Qoe2F2YWlsYWJpbGl0eTpudWxsfSk6dCh7YXZhaWxhYmlsaXR5OiJub3QtYXZhaWxhYmxlIn0pfSksKCk9Pnt2YXIgczsocz1hPy5yZW1vdGUpPT1udWxsfHxzLmNhbmNlbFdhdGNoQXZhaWxhYmlsaXR5KCkuY2F0Y2goKCk9Pnt9KX0pOnZvaWQgMH1dfSxtZWRpYUFpcnBsYXlVbmF2YWlsYWJsZTp7Z2V0KHQsZSl7aWYoIXNvKXJldHVybiBhZS5VTlNVUFBPUlRFRDtpZihlPy5hdmFpbGFiaWxpdHk9PT0ibm90LWF2YWlsYWJsZSIpcmV0dXJuIGFlLlVOQVZBSUxBQkxFfSxtZWRpYUV2ZW50czpbIndlYmtpdHBsYXliYWNrdGFyZ2V0YXZhaWxhYmlsaXR5Y2hhbmdlZCJdLHN0YXRlT3duZXJzVXBkYXRlSGFuZGxlcnM6Wyh0LGUpPT57dmFyIGk7bGV0e21lZGlhOmF9PWU7cmV0dXJuIGE/KGEuZGlzYWJsZVJlbW90ZVBsYXliYWNrfHxhLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZXJlbW90ZXBsYXliYWNrIil8fChpPWE/LnJlbW90ZSk9PW51bGx8fGkud2F0Y2hBdmFpbGFiaWxpdHkocz0+e3Qoe2F2YWlsYWJpbGl0eTpzPyJhdmFpbGFibGUiOiJub3QtYXZhaWxhYmxlIn0pfSkuY2F0Y2gocz0+e3MubmFtZT09PSJOb3RTdXBwb3J0ZWRFcnJvciI/dCh7YXZhaWxhYmlsaXR5Om51bGx9KTp0KHthdmFpbGFiaWxpdHk6Im5vdC1hdmFpbGFibGUifSl9KSwoKT0+e3ZhciBzOyhzPWE/LnJlbW90ZSk9PW51bGx8fHMuY2FuY2VsV2F0Y2hBdmFpbGFiaWxpdHkoKS5jYXRjaCgoKT0+e30pfSk6dm9pZCAwfV19LG1lZGlhUmVuZGl0aW9uVW5hdmFpbGFibGU6e2dldCh0KXt2YXIgZTtsZXR7bWVkaWE6aX09dDtpZighaT8udmlkZW9SZW5kaXRpb25zKXJldHVybiBhZS5VTlNVUFBPUlRFRDtpZighKChlPWkudmlkZW9SZW5kaXRpb25zKSE9bnVsbCYmZS5sZW5ndGgpKXJldHVybiBhZS5VTkFWQUlMQUJMRX0sbWVkaWFFdmVudHM6WyJlbXB0aWVkIiwibG9hZHN0YXJ0Il0sdmlkZW9SZW5kaXRpb25zRXZlbnRzOlsiYWRkcmVuZGl0aW9uIiwicmVtb3ZlcmVuZGl0aW9uIl19LG1lZGlhQXVkaW9UcmFja1VuYXZhaWxhYmxlOntnZXQodCl7dmFyIGUsaTtsZXR7bWVkaWE6YX09dDtpZighYT8uYXVkaW9UcmFja3MpcmV0dXJuIGFlLlVOU1VQUE9SVEVEO2lmKCgoaT0oZT1hLmF1ZGlvVHJhY2tzKT09bnVsbD92b2lkIDA6ZS5sZW5ndGgpIT1udWxsP2k6MCk8PTEpcmV0dXJuIGFlLlVOQVZBSUxBQkxFfSxtZWRpYUV2ZW50czpbImVtcHRpZWQiLCJsb2Fkc3RhcnQiXSxhdWRpb1RyYWNrc0V2ZW50czpbImFkZHRyYWNrIiwicmVtb3ZldHJhY2siXX0sbWVkaWFMYW5nOntnZXQodCl7bGV0e29wdGlvbnM6e21lZGlhTGFuZzplfT17fX09dDtyZXR1cm4gZT8/ImVuIn19fTt2YXIgbG89e1toLk1FRElBX1BSRVZJRVdfUkVRVUVTVF0odCxlLHtkZXRhaWw6aX0pe3ZhciBhLHIscztsZXR7bWVkaWE6b309ZSxkPWk/P3ZvaWQgMCx1LF87aWYobyYmZCE9bnVsbCl7bGV0W21dPXV0KG8se2tpbmQ6aWUuTUVUQURBVEEsbGFiZWw6InRodW1ibmFpbHMifSksYj1BcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKChhPW0/LmN1ZXMpIT1udWxsP2E6W10sKEUsSSxTKT0+ST09PTA/RS5lbmRUaW1lPmQ6ST09PVMubGVuZ3RoLTE/RS5zdGFydFRpbWU8PWQ6RS5zdGFydFRpbWU8PWQmJkUuZW5kVGltZT5kKTtpZihiKXtsZXQgRT0vJ14oPzpbYS16XSs6KT9cL1wvL2kudGVzdChiLnRleHQpfHwocj1vPy5xdWVyeVNlbGVjdG9yKCd0cmFja1tsYWJlbD0idGh1bWJuYWlscyJdJykpPT1udWxsP3ZvaWQgMDpyLnNyYyxJPW5ldyBVUkwoYi50ZXh0LEUpO189bmV3IFVSTFNlYXJjaFBhcmFtcyhJLmhhc2gpLmdldCgiI3h5d2giKS5zcGxpdCgiLCIpLm1hcChqPT4raiksdT1JLmhyZWZ9fWxldCBUPXQubWVkaWFEdXJhdGlvbi5nZXQoZSksdj0ocz10Lm1lZGlhQ2hhcHRlcnNDdWVzLmdldChlKS5maW5kKChtLGIsRSk9PmI9PT1FLmxlbmd0aC0xJiZUPT09bS5lbmRUaW1lP20uc3RhcnRUaW1lPD1kJiZtLmVuZFRpbWU+PWQ6bS5zdGFydFRpbWU8PWQmJm0uZW5kVGltZT5kKSk9PW51bGw/dm9pZCAwOnMudGV4dDtyZXR1cm4gaSE9bnVsbCYmdj09bnVsbCYmKHY9IiIpLHttZWRpYVByZXZpZXdUaW1lOmQsbWVkaWFQcmV2aWV3SW1hZ2U6dSxtZWRpYVByZXZpZXdDb29yZHM6XyxtZWRpYVByZXZpZXdDaGFwdGVyOnZ9fSxbaC5NRURJQV9QQVVTRV9SRVFVRVNUXSh0LGUpe3RbIm1lZGlhUGF1c2VkIl0uc2V0KCEwLGUpfSxbaC5NRURJQV9QTEFZX1JFUVVFU1RdKHQsZSl7dmFyIGksYSxyLHM7bGV0IG89Im1lZGlhUGF1c2VkIix1PXQubWVkaWFTdHJlYW1UeXBlLmdldChlKT09PXBlLkxJVkUsXz0hKChpPWUub3B0aW9ucykhPW51bGwmJmkubm9BdXRvU2Vla1RvTGl2ZSksVD10Lm1lZGlhVGFyZ2V0TGl2ZVdpbmRvdy5nZXQoZSk+MDtpZih1JiZfJiYhVCl7bGV0IEE9KGE9dC5tZWRpYVNlZWthYmxlLmdldChlKSk9PW51bGw/dm9pZCAwOmFbMV07aWYoQSl7bGV0IHY9KHM9KHI9ZS5vcHRpb25zKT09bnVsbD92b2lkIDA6ci5zZWVrVG9MaXZlT2Zmc2V0KSE9bnVsbD9zOjAsbT1BLXY7dC5tZWRpYUN1cnJlbnRUaW1lLnNldChtLGUpfX10W29dLnNldCghMSxlKX0sW2guTUVESUFfUExBWUJBQ0tfUkFURV9SRVFVRVNUXSh0LGUse2RldGFpbDppfSl7bGV0IGE9Im1lZGlhUGxheWJhY2tSYXRlIixyPWk7dFthXS5zZXQocixlKX0sW2guTUVESUFfTVVURV9SRVFVRVNUXSh0LGUpe3RbIm1lZGlhTXV0ZWQiXS5zZXQoITAsZSl9LFtoLk1FRElBX1VOTVVURV9SRVFVRVNUXSh0LGUpe2xldCBpPSJtZWRpYU11dGVkIjt0Lm1lZGlhVm9sdW1lLmdldChlKXx8dC5tZWRpYVZvbHVtZS5zZXQoLjI1LGUpLHRbaV0uc2V0KCExLGUpfSxbaC5NRURJQV9MT09QX1JFUVVFU1RdKHQsZSx7ZGV0YWlsOml9KXtsZXQgYT0ibWVkaWFMb29wIixyPSEhaTtyZXR1cm4gdFthXS5zZXQocixlKSx7bWVkaWFMb29wOnJ9fSxbaC5NRURJQV9WT0xVTUVfUkVRVUVTVF0odCxlLHtkZXRhaWw6aX0pe2xldCBhPSJtZWRpYVZvbHVtZSIscj1pO3ImJnQubWVkaWFNdXRlZC5nZXQoZSkmJnQubWVkaWFNdXRlZC5zZXQoITEsZSksdFthXS5zZXQocixlKX0sW2guTUVESUFfU0VFS19SRVFVRVNUXSh0LGUse2RldGFpbDppfSl7bGV0IGE9Im1lZGlhQ3VycmVudFRpbWUiLHI9aTt0W2FdLnNldChyLGUpfSxbaC5NRURJQV9TRUVLX1RPX0xJVkVfUkVRVUVTVF0odCxlKXt2YXIgaSxhLHI7bGV0IHM9Im1lZGlhQ3VycmVudFRpbWUiLG89KGk9dC5tZWRpYVNlZWthYmxlLmdldChlKSk9PW51bGw/dm9pZCAwOmlbMV07aWYoTnVtYmVyLmlzTmFOKE51bWJlcihvKSkpcmV0dXJuO2xldCBkPShyPShhPWUub3B0aW9ucyk9PW51bGw/dm9pZCAwOmEuc2Vla1RvTGl2ZU9mZnNldCkhPW51bGw/cjowLHU9by1kO3Rbc10uc2V0KHUsZSl9LFtoLk1FRElBX1NIT1dfU1VCVElUTEVTX1JFUVVFU1RdKHQsZSx7ZGV0YWlsOml9KXt2YXIgYTtsZXR7b3B0aW9uczpyfT1lLHM9eHQoZSksbz1PcihpKSxkPShhPW9bMF0pPT1udWxsP3ZvaWQgMDphLmxhbmd1YWdlO2QmJiFyLm5vU3VidGl0bGVzTGFuZ1ByZWYmJmwubG9jYWxTdG9yYWdlLnNldEl0ZW0oIm1lZGlhLWNocm9tZS1wcmVmLXN1YnRpdGxlcy1sYW5nIixkKSxkdChWZS5TSE9XSU5HLHMsbyl9LFtoLk1FRElBX0RJU0FCTEVfU1VCVElUTEVTX1JFUVVFU1RdKHQsZSx7ZGV0YWlsOml9KXtsZXQgYT14dChlKSxyPWk/P1tdO2R0KFZlLkRJU0FCTEVELGEscil9LFtoLk1FRElBX1RPR0dMRV9TVUJUSVRMRVNfUkVRVUVTVF0odCxlLHtkZXRhaWw6aX0pe3BhKGUsaSl9LFtoLk1FRElBX1JFTkRJVElPTl9SRVFVRVNUXSh0LGUse2RldGFpbDppfSl7bGV0IGE9Im1lZGlhUmVuZGl0aW9uU2VsZWN0ZWQiLHI9aTt0W2FdLnNldChyLGUpfSxbaC5NRURJQV9BVURJT19UUkFDS19SRVFVRVNUXSh0LGUse2RldGFpbDppfSl7bGV0IGE9Im1lZGlhQXVkaW9UcmFja0VuYWJsZWQiLHI9aTt0W2FdLnNldChyLGUpfSxbaC5NRURJQV9FTlRFUl9QSVBfUkVRVUVTVF0odCxlKXtsZXQgaT0ibWVkaWFJc1BpcCI7dC5tZWRpYUlzRnVsbHNjcmVlbi5nZXQoZSkmJnQubWVkaWFJc0Z1bGxzY3JlZW4uc2V0KCExLGUpLHRbaV0uc2V0KCEwLGUpfSxbaC5NRURJQV9FWElUX1BJUF9SRVFVRVNUXSh0LGUpe3RbIm1lZGlhSXNQaXAiXS5zZXQoITEsZSl9LFtoLk1FRElBX0VOVEVSX0ZVTExTQ1JFRU5fUkVRVUVTVF0odCxlLGkpe2xldCBhPSJtZWRpYUlzRnVsbHNjcmVlbiI7dC5tZWRpYUlzUGlwLmdldChlKSYmdC5tZWRpYUlzUGlwLnNldCghMSxlKSx0W2FdLnNldCghMCxlLGkpfSxbaC5NRURJQV9FWElUX0ZVTExTQ1JFRU5fUkVRVUVTVF0odCxlKXt0WyJtZWRpYUlzRnVsbHNjcmVlbiJdLnNldCghMSxlKX0sW2guTUVESUFfRU5URVJfQ0FTVF9SRVFVRVNUXSh0LGUpe2xldCBpPSJtZWRpYUlzQ2FzdGluZyI7dC5tZWRpYUlzRnVsbHNjcmVlbi5nZXQoZSkmJnQubWVkaWFJc0Z1bGxzY3JlZW4uc2V0KCExLGUpLHRbaV0uc2V0KCEwLGUpfSxbaC5NRURJQV9FWElUX0NBU1RfUkVRVUVTVF0odCxlKXt0WyJtZWRpYUlzQ2FzdGluZyJdLnNldCghMSxlKX0sW2guTUVESUFfQUlSUExBWV9SRVFVRVNUXSh0LGUpe3RbIm1lZGlhSXNBaXJwbGF5aW5nIl0uc2V0KCEwLGUpfX07dmFyIHVvPSh7bWVkaWE6dCxmdWxsc2NyZWVuRWxlbWVudDplLGRvY3VtZW50RWxlbWVudDppLHN0YXRlTWVkaWF0b3I6YT1VdCxyZXF1ZXN0TWFwOnI9bG8sb3B0aW9uczpzPXt9LG1vbml0b3JTdGF0ZU93bmVyc09ubHlXaXRoU3Vic2NyaXB0aW9uczpvPSEwfSk9PntsZXQgZD1bXSx1PXtvcHRpb25zOnsuLi5zfX0sXz1PYmplY3QuZnJlZXplKHttZWRpYVByZXZpZXdUaW1lOnZvaWQgMCxtZWRpYVByZXZpZXdJbWFnZTp2b2lkIDAsbWVkaWFQcmV2aWV3Q29vcmRzOnZvaWQgMCxtZWRpYVByZXZpZXdDaGFwdGVyOnZvaWQgMH0pLFQ9RT0+e0UhPW51bGwmJihFYShFLF8pfHwoXz1PYmplY3QuZnJlZXplKHsuLi5fLC4uLkV9KSxkLmZvckVhY2goST0+SShfKSkpKX0sQT0oKT0+e2xldCBFPU9iamVjdC5lbnRyaWVzKGEpLnJlZHVjZSgoSSxbUyx7Z2V0Omp9XSk9PihJW1NdPWoodSksSSkse30pO1QoRSl9LHY9e30sbSxiPWFzeW5jKEUsSSk9Pnt2YXIgUyxqLGFpLHJpLF90LE9lLFBlLHNpLGF0LHRuLGFuLHJuLHNuLG5uLG9uLGxuO2xldCB2bD0hIW07aWYobT17Li4udSwuLi5tPz97fSwuLi5FfSx2bClyZXR1cm47YXdhaXQgb28oLi4uT2JqZWN0LnZhbHVlcyhFKSk7bGV0IGJ0PWQubGVuZ3RoPjAmJkk9PT0wJiZvLGRuPXUubWVkaWEhPT1tLm1lZGlhLHVuPSgoUz11Lm1lZGlhKT09bnVsbD92b2lkIDA6Uy50ZXh0VHJhY2tzKSE9PSgoaj1tLm1lZGlhKT09bnVsbD92b2lkIDA6ai50ZXh0VHJhY2tzKSxjbj0oKGFpPXUubWVkaWEpPT1udWxsP3ZvaWQgMDphaS52aWRlb1JlbmRpdGlvbnMpIT09KChyaT1tLm1lZGlhKT09bnVsbD92b2lkIDA6cmkudmlkZW9SZW5kaXRpb25zKSxobj0oKF90PXUubWVkaWEpPT1udWxsP3ZvaWQgMDpfdC5hdWRpb1RyYWNrcykhPT0oKE9lPW0ubWVkaWEpPT1udWxsP3ZvaWQgMDpPZS5hdWRpb1RyYWNrcyksbW49KChQZT11Lm1lZGlhKT09bnVsbD92b2lkIDA6UGUucmVtb3RlKSE9PSgoc2k9bS5tZWRpYSk9PW51bGw/dm9pZCAwOnNpLnJlbW90ZSkscG49dS5kb2N1bWVudEVsZW1lbnQhPT1tLmRvY3VtZW50RWxlbWVudCxFbj0hIXUubWVkaWEmJihkbnx8YnQpLHZuPSEhKChhdD11Lm1lZGlhKSE9bnVsbCYmYXQudGV4dFRyYWNrcykmJih1bnx8YnQpLGZuPSEhKCh0bj11Lm1lZGlhKSE9bnVsbCYmdG4udmlkZW9SZW5kaXRpb25zKSYmKGNufHxidCksZ249ISEoKGFuPXUubWVkaWEpIT1udWxsJiZhbi5hdWRpb1RyYWNrcykmJihobnx8YnQpLF9uPSEhKChybj11Lm1lZGlhKSE9bnVsbCYmcm4ucmVtb3RlKSYmKG1ufHxidCksYm49ISF1LmRvY3VtZW50RWxlbWVudCYmKHBufHxidCksSXI9RW58fHZufHxmbnx8Z258fF9ufHxibixBdD1kLmxlbmd0aD09PTAmJkk9PT0xJiZvLEFuPSEhbS5tZWRpYSYmKGRufHxBdCksVG49ISEoKHNuPW0ubWVkaWEpIT1udWxsJiZzbi50ZXh0VHJhY2tzKSYmKHVufHxBdCksU249ISEoKG5uPW0ubWVkaWEpIT1udWxsJiZubi52aWRlb1JlbmRpdGlvbnMpJiYoY258fEF0KSxJbj0hISgob249bS5tZWRpYSkhPW51bGwmJm9uLmF1ZGlvVHJhY2tzKSYmKGhufHxBdCksa249ISEoKGxuPW0ubWVkaWEpIT1udWxsJiZsbi5yZW1vdGUpJiYobW58fEF0KSx5bj0hIW0uZG9jdW1lbnRFbGVtZW50JiYocG58fEF0KSx3bj1Bbnx8VG58fFNufHxJbnx8a258fHluO2lmKCEoSXJ8fHduKSl7T2JqZWN0LmVudHJpZXMobSkuZm9yRWFjaCgoW1IsbmldKT0+e3VbUl09bml9KSxBKCksbT12b2lkIDA7cmV0dXJufU9iamVjdC5lbnRyaWVzKGEpLmZvckVhY2goKFtSLHtnZXQ6bmksbWVkaWFFdmVudHM6Zmw9W10sdGV4dFRyYWNrc0V2ZW50czpnbD1bXSx2aWRlb1JlbmRpdGlvbnNFdmVudHM6X2w9W10sYXVkaW9UcmFja3NFdmVudHM6Ymw9W10scmVtb3RlRXZlbnRzOkFsPVtdLHJvb3RFdmVudHM6VGw9W10sc3RhdGVPd25lcnNVcGRhdGVIYW5kbGVyczpTbD1bXX1dKT0+e3ZbUl18fCh2W1JdPXt9KTtsZXQgcmU9Rj0+e2xldCBLPW5pKHUsRik7VCh7W1JdOkt9KX0sUTtRPXZbUl0ubWVkaWFFdmVudHMsZmwuZm9yRWFjaChGPT57USYmRW4mJih1Lm1lZGlhLnJlbW92ZUV2ZW50TGlzdGVuZXIoRixRKSx2W1JdLm1lZGlhRXZlbnRzPXZvaWQgMCksQW4mJihtLm1lZGlhLmFkZEV2ZW50TGlzdGVuZXIoRixyZSksdltSXS5tZWRpYUV2ZW50cz1yZSl9KSxRPXZbUl0udGV4dFRyYWNrc0V2ZW50cyxnbC5mb3JFYWNoKEY9Pnt2YXIgSyxtZTtRJiZ2biYmKChLPXUubWVkaWEudGV4dFRyYWNrcyk9PW51bGx8fEsucmVtb3ZlRXZlbnRMaXN0ZW5lcihGLFEpLHZbUl0udGV4dFRyYWNrc0V2ZW50cz12b2lkIDApLFRuJiYoKG1lPW0ubWVkaWEudGV4dFRyYWNrcyk9PW51bGx8fG1lLmFkZEV2ZW50TGlzdGVuZXIoRixyZSksdltSXS50ZXh0VHJhY2tzRXZlbnRzPXJlKX0pLFE9dltSXS52aWRlb1JlbmRpdGlvbnNFdmVudHMsX2wuZm9yRWFjaChGPT57dmFyIEssbWU7USYmZm4mJigoSz11Lm1lZGlhLnZpZGVvUmVuZGl0aW9ucyk9PW51bGx8fEsucmVtb3ZlRXZlbnRMaXN0ZW5lcihGLFEpLHZbUl0udmlkZW9SZW5kaXRpb25zRXZlbnRzPXZvaWQgMCksU24mJigobWU9bS5tZWRpYS52aWRlb1JlbmRpdGlvbnMpPT1udWxsfHxtZS5hZGRFdmVudExpc3RlbmVyKEYscmUpLHZbUl0udmlkZW9SZW5kaXRpb25zRXZlbnRzPXJlKX0pLFE9dltSXS5hdWRpb1RyYWNrc0V2ZW50cyxibC5mb3JFYWNoKEY9Pnt2YXIgSyxtZTtRJiZnbiYmKChLPXUubWVkaWEuYXVkaW9UcmFja3MpPT1udWxsfHxLLnJlbW92ZUV2ZW50TGlzdGVuZXIoRixRKSx2W1JdLmF1ZGlvVHJhY2tzRXZlbnRzPXZvaWQgMCksSW4mJigobWU9bS5tZWRpYS5hdWRpb1RyYWNrcyk9PW51bGx8fG1lLmFkZEV2ZW50TGlzdGVuZXIoRixyZSksdltSXS5hdWRpb1RyYWNrc0V2ZW50cz1yZSl9KSxRPXZbUl0ucmVtb3RlRXZlbnRzLEFsLmZvckVhY2goRj0+e3ZhciBLLG1lO1EmJl9uJiYoKEs9dS5tZWRpYS5yZW1vdGUpPT1udWxsfHxLLnJlbW92ZUV2ZW50TGlzdGVuZXIoRixRKSx2W1JdLnJlbW90ZUV2ZW50cz12b2lkIDApLGtuJiYoKG1lPW0ubWVkaWEucmVtb3RlKT09bnVsbHx8bWUuYWRkRXZlbnRMaXN0ZW5lcihGLHJlKSx2W1JdLnJlbW90ZUV2ZW50cz1yZSl9KSxRPXZbUl0ucm9vdEV2ZW50cyxUbC5mb3JFYWNoKEY9PntRJiZibiYmKHUuZG9jdW1lbnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRixRKSx2W1JdLnJvb3RFdmVudHM9dm9pZCAwKSx5biYmKG0uZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRixyZSksdltSXS5yb290RXZlbnRzPXJlKX0pO2xldCBRaT12W1JdLnN0YXRlT3duZXJzVXBkYXRlSGFuZGxlcnM7aWYoUWkmJklyJiYoQXJyYXkuaXNBcnJheShRaSk/UWk6W1FpXSkuZm9yRWFjaChLPT57dHlwZW9mIEs9PSJmdW5jdGlvbiImJksoKX0pLHduKXtsZXQgRj1TbC5tYXAoSz0+SyhyZSxtKSkuZmlsdGVyKEs9PnR5cGVvZiBLPT0iZnVuY3Rpb24iKTt2W1JdLnN0YXRlT3duZXJzVXBkYXRlSGFuZGxlcnM9Ri5sZW5ndGg9PT0xP0ZbMF06Rn1lbHNlIElyJiYodltSXS5zdGF0ZU93bmVyc1VwZGF0ZUhhbmRsZXJzPXZvaWQgMCl9KSxPYmplY3QuZW50cmllcyhtKS5mb3JFYWNoKChbUixuaV0pPT57dVtSXT1uaX0pLEEoKSxtPXZvaWQgMH07cmV0dXJuIGIoe21lZGlhOnQsZnVsbHNjcmVlbkVsZW1lbnQ6ZSxkb2N1bWVudEVsZW1lbnQ6aSxvcHRpb25zOnN9KSx7ZGlzcGF0Y2goRSl7bGV0e3R5cGU6SSxkZXRhaWw6U309RTtpZihyW0ldJiZfLm1lZGlhRXJyb3JDb2RlPT1udWxsKXtUKHJbSV0oYSx1LEUpKTtyZXR1cm59ST09PSJtZWRpYWVsZW1lbnRjaGFuZ2VyZXF1ZXN0Ij9iKHttZWRpYTpTfSk6ST09PSJmdWxsc2NyZWVuZWxlbWVudGNoYW5nZXJlcXVlc3QiP2Ioe2Z1bGxzY3JlZW5FbGVtZW50OlN9KTpJPT09ImRvY3VtZW50ZWxlbWVudGNoYW5nZXJlcXVlc3QiP2Ioe2RvY3VtZW50RWxlbWVudDpTfSk6ST09PSJvcHRpb25zY2hhbmdlcmVxdWVzdCImJihPYmplY3QuZW50cmllcyhTPz97fSkuZm9yRWFjaCgoW2osYWldKT0+e3Uub3B0aW9uc1tqXT1haX0pLEEoKSl9LGdldFN0YXRlKCl7cmV0dXJuIF99LHN1YnNjcmliZShFKXtyZXR1cm4gYih7fSxkLmxlbmd0aCsxKSxkLnB1c2goRSksRShfKSwoKT0+e2xldCBJPWQuaW5kZXhPZihFKTtJPj0wJiYoYih7fSxkLmxlbmd0aC0xKSxkLnNwbGljZShJLDEpKX19fX07dmFyIEdyPSh0LGUsaSk9PntpZighZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitpKX0scD0odCxlLGkpPT4oR3IodCxlLCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpLGk/aS5jYWxsKHQpOmUuZ2V0KHQpKSxvZT0odCxlLGkpPT57aWYoZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7ZSBpbnN0YW5jZW9mIFdlYWtTZXQ/ZS5hZGQodCk6ZS5zZXQodCxpKX0sZ2U9KHQsZSxpLGEpPT4oR3IodCxlLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksYT9hLmNhbGwodCxpKTplLnNldCh0LGkpLGkpLHZpPSh0LGUsaSk9PihHcih0LGUsImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLGkpLEJlLGZpLE0sSWUsZ2ksU2UsZmEsX2ksZ2EsQnIsaHQsX2EsV3IsJHIsZm8sZ289WyJBcnJvd0xlZnQiLCJBcnJvd1JpZ2h0IiwiQXJyb3dVcCIsIkFycm93RG93biIsIkVudGVyIiwiICIsImYiLCJtIiwiayIsImMiLCJsIiwiaiIsIj4iLCI8IiwicCJdLGNvPTEwLGhvPS4wMjUsbW89LjI1LFhsPS4yNSxKbD0yLGM9e0RFRkFVTFRfU1VCVElUTEVTOiJkZWZhdWx0c3VidGl0bGVzIixERUZBVUxUX1NUUkVBTV9UWVBFOiJkZWZhdWx0c3RyZWFtdHlwZSIsREVGQVVMVF9EVVJBVElPTjoiZGVmYXVsdGR1cmF0aW9uIixGVUxMU0NSRUVOX0VMRU1FTlQ6ImZ1bGxzY3JlZW5lbGVtZW50IixIT1RLRVlTOiJob3RrZXlzIixLRVlCT0FSRF9CQUNLV0FSRF9TRUVLX09GRlNFVDoia2V5Ym9hcmRiYWNrd2FyZHNlZWtvZmZzZXQiLEtFWUJPQVJEX0ZPUldBUkRfU0VFS19PRkZTRVQ6ImtleWJvYXJkZm9yd2FyZHNlZWtvZmZzZXQiLEtFWUJPQVJEX0RPV05fVk9MVU1FX1NURVA6ImtleWJvYXJkZG93bnZvbHVtZXN0ZXAiLEtFWUJPQVJEX1VQX1ZPTFVNRV9TVEVQOiJrZXlib2FyZHVwdm9sdW1lc3RlcCIsS0VZU19VU0VEOiJrZXlzdXNlZCIsTEFORzoibGFuZyIsTE9PUDoibG9vcCIsTElWRV9FREdFX09GRlNFVDoibGl2ZWVkZ2VvZmZzZXQiLE5PX0FVVE9fU0VFS19UT19MSVZFOiJub2F1dG9zZWVrdG9saXZlIixOT19ERUZBVUxUX1NUT1JFOiJub2RlZmF1bHRzdG9yZSIsTk9fSE9US0VZUzoibm9ob3RrZXlzIixOT19NVVRFRF9QUkVGOiJub211dGVkcHJlZiIsTk9fU1VCVElUTEVTX0xBTkdfUFJFRjoibm9zdWJ0aXRsZXNsYW5ncHJlZiIsTk9fVk9MVU1FX1BSRUY6Im5vdm9sdW1lcHJlZiIsU0VFS19UT19MSVZFX09GRlNFVDoic2Vla3RvbGl2ZW9mZnNldCJ9LFZyPWNsYXNzIGV4dGVuZHMgbnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLG9lKHRoaXMsZ2EpLG9lKHRoaXMsX2EpLG9lKHRoaXMsJHIpLHRoaXMubWVkaWFTdGF0ZVJlY2VpdmVycz1bXSx0aGlzLmFzc29jaWF0ZWRFbGVtZW50U3Vic2NyaXB0aW9ucz1uZXcgTWFwLG9lKHRoaXMsQmUsbmV3IER0KHRoaXMsYy5IT1RLRVlTKSksb2UodGhpcyxmaSx2b2lkIDApLG9lKHRoaXMsTSx2b2lkIDApLG9lKHRoaXMsSWUsbnVsbCksb2UodGhpcyxnaSx2b2lkIDApLG9lKHRoaXMsU2Usdm9pZCAwKSxvZSh0aGlzLGZhLGk9Pnt2YXIgYTsoYT1wKHRoaXMsTSkpPT1udWxsfHxhLmRpc3BhdGNoKGkpfSksb2UodGhpcyxfaSx2b2lkIDApLG9lKHRoaXMsaHQsaT0+e2xldHtrZXk6YSxzaGlmdEtleTpyfT1pO2lmKCEociYmKGE9PT0iLyJ8fGE9PT0iPyIpfHxnby5pbmNsdWRlcyhhKSkpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLHAodGhpcyxodCkpO3JldHVybn10aGlzLmtleWJvYXJkU2hvcnRjdXRIYW5kbGVyKGkpfSksdGhpcy5hc3NvY2lhdGVFbGVtZW50KHRoaXMpO2xldCBlPXt9O2dlKHRoaXMsZ2ksaT0+e09iamVjdC5lbnRyaWVzKGkpLmZvckVhY2goKFthLHJdKT0+e2lmKGEgaW4gZSYmZVthXT09PXIpcmV0dXJuO3RoaXMucHJvcGFnYXRlTWVkaWFTdGF0ZShhLHIpO2xldCBzPWEudG9Mb3dlckNhc2UoKSxvPW5ldyBsLkN1c3RvbUV2ZW50KENuW3NdLHtjb21wb3NlZDohMCxkZXRhaWw6cn0pO3RoaXMuZGlzcGF0Y2hFdmVudChvKX0pLGU9aX0pfXN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuIHN1cGVyLm9ic2VydmVkQXR0cmlidXRlcy5jb25jYXQoYy5OT19IT1RLRVlTLGMuSE9US0VZUyxjLkRFRkFVTFRfU1RSRUFNX1RZUEUsYy5ERUZBVUxUX1NVQlRJVExFUyxjLkRFRkFVTFRfRFVSQVRJT04sYy5OT19NVVRFRF9QUkVGLGMuTk9fVk9MVU1FX1BSRUYsYy5MQU5HLGMuTE9PUCxjLkxJVkVfRURHRV9PRkZTRVQsYy5TRUVLX1RPX0xJVkVfT0ZGU0VULGMuTk9fQVVUT19TRUVLX1RPX0xJVkUpfWdldCBtZWRpYVN0b3JlKCl7cmV0dXJuIHAodGhpcyxNKX1zZXQgbWVkaWFTdG9yZShlKXt2YXIgaSxhO2lmKHAodGhpcyxNKSYmKChpPXAodGhpcyxTZSkpPT1udWxsfHxpLmNhbGwodGhpcyksZ2UodGhpcyxTZSx2b2lkIDApKSxnZSh0aGlzLE0sZSksIXAodGhpcyxNKSYmIXRoaXMuaGFzQXR0cmlidXRlKGMuTk9fREVGQVVMVF9TVE9SRSkpe3ZpKHRoaXMsZ2EsQnIpLmNhbGwodGhpcyk7cmV0dXJufWdlKHRoaXMsU2UsKGE9cCh0aGlzLE0pKT09bnVsbD92b2lkIDA6YS5zdWJzY3JpYmUocCh0aGlzLGdpKSkpfWdldCBmdWxsc2NyZWVuRWxlbWVudCgpe3ZhciBlO3JldHVybihlPXAodGhpcyxmaSkpIT1udWxsP2U6dGhpc31zZXQgZnVsbHNjcmVlbkVsZW1lbnQoZSl7dmFyIGk7dGhpcy5oYXNBdHRyaWJ1dGUoYy5GVUxMU0NSRUVOX0VMRU1FTlQpJiZ0aGlzLnJlbW92ZUF0dHJpYnV0ZShjLkZVTExTQ1JFRU5fRUxFTUVOVCksZ2UodGhpcyxmaSxlKSwoaT1wKHRoaXMsTSkpPT1udWxsfHxpLmRpc3BhdGNoKHt0eXBlOiJmdWxsc2NyZWVuZWxlbWVudGNoYW5nZXJlcXVlc3QiLGRldGFpbDp0aGlzLmZ1bGxzY3JlZW5FbGVtZW50fSl9Z2V0IGRlZmF1bHRTdWJ0aXRsZXMoKXtyZXR1cm4gayh0aGlzLGMuREVGQVVMVF9TVUJUSVRMRVMpfXNldCBkZWZhdWx0U3VidGl0bGVzKGUpe3kodGhpcyxjLkRFRkFVTFRfU1VCVElUTEVTLGUpfWdldCBkZWZhdWx0U3RyZWFtVHlwZSgpe3JldHVybiBPKHRoaXMsYy5ERUZBVUxUX1NUUkVBTV9UWVBFKX1zZXQgZGVmYXVsdFN0cmVhbVR5cGUoZSl7VSh0aGlzLGMuREVGQVVMVF9TVFJFQU1fVFlQRSxlKX1nZXQgZGVmYXVsdER1cmF0aW9uKCl7cmV0dXJuIEQodGhpcyxjLkRFRkFVTFRfRFVSQVRJT04pfXNldCBkZWZhdWx0RHVyYXRpb24oZSl7SCh0aGlzLGMuREVGQVVMVF9EVVJBVElPTixlKX1nZXQgbm9Ib3RrZXlzKCl7cmV0dXJuIGsodGhpcyxjLk5PX0hPVEtFWVMpfXNldCBub0hvdGtleXMoZSl7eSh0aGlzLGMuTk9fSE9US0VZUyxlKX1nZXQga2V5c1VzZWQoKXtyZXR1cm4gTyh0aGlzLGMuS0VZU19VU0VEKX1zZXQga2V5c1VzZWQoZSl7VSh0aGlzLGMuS0VZU19VU0VELGUpfWdldCBsaXZlRWRnZU9mZnNldCgpe3JldHVybiBEKHRoaXMsYy5MSVZFX0VER0VfT0ZGU0VUKX1zZXQgbGl2ZUVkZ2VPZmZzZXQoZSl7SCh0aGlzLGMuTElWRV9FREdFX09GRlNFVCxlKX1nZXQgbm9BdXRvU2Vla1RvTGl2ZSgpe3JldHVybiBrKHRoaXMsYy5OT19BVVRPX1NFRUtfVE9fTElWRSl9c2V0IG5vQXV0b1NlZWtUb0xpdmUoZSl7eSh0aGlzLGMuTk9fQVVUT19TRUVLX1RPX0xJVkUsZSl9Z2V0IG5vVm9sdW1lUHJlZigpe3JldHVybiBrKHRoaXMsYy5OT19WT0xVTUVfUFJFRil9c2V0IG5vVm9sdW1lUHJlZihlKXt5KHRoaXMsYy5OT19WT0xVTUVfUFJFRixlKX1nZXQgbm9NdXRlZFByZWYoKXtyZXR1cm4gayh0aGlzLGMuTk9fTVVURURfUFJFRil9c2V0IG5vTXV0ZWRQcmVmKGUpe3kodGhpcyxjLk5PX01VVEVEX1BSRUYsZSl9Z2V0IG5vU3VidGl0bGVzTGFuZ1ByZWYoKXtyZXR1cm4gayh0aGlzLGMuTk9fU1VCVElUTEVTX0xBTkdfUFJFRil9c2V0IG5vU3VidGl0bGVzTGFuZ1ByZWYoZSl7eSh0aGlzLGMuTk9fU1VCVElUTEVTX0xBTkdfUFJFRixlKX1nZXQgbm9EZWZhdWx0U3RvcmUoKXtyZXR1cm4gayh0aGlzLGMuTk9fREVGQVVMVF9TVE9SRSl9c2V0IG5vRGVmYXVsdFN0b3JlKGUpe3kodGhpcyxjLk5PX0RFRkFVTFRfU1RPUkUsZSl9Z2V0IHJlc29sdmVkTGFuZygpe3JldHVybiBXbigpfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSl7dmFyIHIscyxvLGQsdSxfLFQsQSx2LG0sYixFO2lmKHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSksZT09PWMuTk9fSE9US0VZUylhIT09aSYmYT09PSIiPyh0aGlzLmhhc0F0dHJpYnV0ZShjLkhPVEtFWVMpJiZjb25zb2xlLndhcm4oIk1lZGlhIENocm9tZTogQm90aCBgaG90a2V5c2AgYW5kIGBub2hvdGtleXNgIGhhdmUgYmVlbiBzZXQuIEFsbCBob3RrZXlzIHdpbGwgYmUgZGlzYWJsZWQuIiksdGhpcy5kaXNhYmxlSG90a2V5cygpKTphIT09aSYmYT09PW51bGwmJnRoaXMuZW5hYmxlSG90a2V5cygpO2Vsc2UgaWYoZT09PWMuSE9US0VZUylwKHRoaXMsQmUpLnZhbHVlPWE7ZWxzZSBpZihlPT09Yy5ERUZBVUxUX1NVQlRJVExFUyYmYSE9PWkpKHI9cCh0aGlzLE0pKT09bnVsbHx8ci5kaXNwYXRjaCh7dHlwZToib3B0aW9uc2NoYW5nZXJlcXVlc3QiLGRldGFpbDp7ZGVmYXVsdFN1YnRpdGxlczp0aGlzLmhhc0F0dHJpYnV0ZShjLkRFRkFVTFRfU1VCVElUTEVTKX19KTtlbHNlIGlmKGU9PT1jLkRFRkFVTFRfU1RSRUFNX1RZUEUpKG89cCh0aGlzLE0pKT09bnVsbHx8by5kaXNwYXRjaCh7dHlwZToib3B0aW9uc2NoYW5nZXJlcXVlc3QiLGRldGFpbDp7ZGVmYXVsdFN0cmVhbVR5cGU6KHM9dGhpcy5nZXRBdHRyaWJ1dGUoYy5ERUZBVUxUX1NUUkVBTV9UWVBFKSkhPW51bGw/czp2b2lkIDB9fSk7ZWxzZSBpZihlPT09Yy5MSVZFX0VER0VfT0ZGU0VUJiZhIT09aSkoZD1wKHRoaXMsTSkpPT1udWxsfHxkLmRpc3BhdGNoKHt0eXBlOiJvcHRpb25zY2hhbmdlcmVxdWVzdCIsZGV0YWlsOntsaXZlRWRnZU9mZnNldDp0aGlzLmhhc0F0dHJpYnV0ZShjLkxJVkVfRURHRV9PRkZTRVQpPyt0aGlzLmdldEF0dHJpYnV0ZShjLkxJVkVfRURHRV9PRkZTRVQpOnZvaWQgMCxzZWVrVG9MaXZlT2Zmc2V0OnRoaXMuaGFzQXR0cmlidXRlKGMuU0VFS19UT19MSVZFX09GRlNFVCk/K3RoaXMuZ2V0QXR0cmlidXRlKGMuU0VFS19UT19MSVZFX09GRlNFVCk6dGhpcy5oYXNBdHRyaWJ1dGUoYy5MSVZFX0VER0VfT0ZGU0VUKT8rdGhpcy5nZXRBdHRyaWJ1dGUoYy5MSVZFX0VER0VfT0ZGU0VUKTp2b2lkIDB9fSk7ZWxzZSBpZihlPT09Yy5TRUVLX1RPX0xJVkVfT0ZGU0VUJiZhIT09aSkodT1wKHRoaXMsTSkpPT1udWxsfHx1LmRpc3BhdGNoKHt0eXBlOiJvcHRpb25zY2hhbmdlcmVxdWVzdCIsZGV0YWlsOntzZWVrVG9MaXZlT2Zmc2V0OnRoaXMuaGFzQXR0cmlidXRlKGMuU0VFS19UT19MSVZFX09GRlNFVCk/K3RoaXMuZ2V0QXR0cmlidXRlKGMuU0VFS19UT19MSVZFX09GRlNFVCk6dGhpcy5oYXNBdHRyaWJ1dGUoYy5MSVZFX0VER0VfT0ZGU0VUKT8rdGhpcy5nZXRBdHRyaWJ1dGUoYy5MSVZFX0VER0VfT0ZGU0VUKTp2b2lkIDB9fSk7ZWxzZSBpZihlPT09Yy5OT19BVVRPX1NFRUtfVE9fTElWRSkoXz1wKHRoaXMsTSkpPT1udWxsfHxfLmRpc3BhdGNoKHt0eXBlOiJvcHRpb25zY2hhbmdlcmVxdWVzdCIsZGV0YWlsOntub0F1dG9TZWVrVG9MaXZlOnRoaXMuaGFzQXR0cmlidXRlKGMuTk9fQVVUT19TRUVLX1RPX0xJVkUpfX0pO2Vsc2UgaWYoZT09PWMuRlVMTFNDUkVFTl9FTEVNRU5UKXtsZXQgST1hPyhUPXRoaXMuZ2V0Um9vdE5vZGUoKSk9PW51bGw/dm9pZCAwOlQuZ2V0RWxlbWVudEJ5SWQoYSk6dm9pZCAwO2dlKHRoaXMsZmksSSksKEE9cCh0aGlzLE0pKT09bnVsbHx8QS5kaXNwYXRjaCh7dHlwZToiZnVsbHNjcmVlbmVsZW1lbnRjaGFuZ2VyZXF1ZXN0IixkZXRhaWw6dGhpcy5mdWxsc2NyZWVuRWxlbWVudH0pfWVsc2UgZT09PWMuTEFORyYmYSE9PWk/KEJuKGEpLCh2PXAodGhpcyxNKSk9PW51bGx8fHYuZGlzcGF0Y2goe3R5cGU6Im9wdGlvbnNjaGFuZ2VyZXF1ZXN0IixkZXRhaWw6e21lZGlhTGFuZzphfX0pKTplPT09Yy5MT09QJiZhIT09aT8obT1wKHRoaXMsTSkpPT1udWxsfHxtLmRpc3BhdGNoKHt0eXBlOmguTUVESUFfTE9PUF9SRVFVRVNULGRldGFpbDphIT1udWxsfSk6ZT09PWMuTk9fVk9MVU1FX1BSRUYmJmEhPT1pPyhiPXAodGhpcyxNKSk9PW51bGx8fGIuZGlzcGF0Y2goe3R5cGU6Im9wdGlvbnNjaGFuZ2VyZXF1ZXN0IixkZXRhaWw6e25vVm9sdW1lUHJlZjp0aGlzLmhhc0F0dHJpYnV0ZShjLk5PX1ZPTFVNRV9QUkVGKX19KTplPT09Yy5OT19NVVRFRF9QUkVGJiZhIT09aSYmKChFPXAodGhpcyxNKSk9PW51bGx8fEUuZGlzcGF0Y2goe3R5cGU6Im9wdGlvbnNjaGFuZ2VyZXF1ZXN0IixkZXRhaWw6e25vTXV0ZWRQcmVmOnRoaXMuaGFzQXR0cmlidXRlKGMuTk9fTVVURURfUFJFRil9fSkpfWNvbm5lY3RlZENhbGxiYWNrKCl7dmFyIGUsaSxhO3RoaXMuYXNzb2NpYXRlRWxlbWVudCh0aGlzKSwhcCh0aGlzLE0pJiYhdGhpcy5oYXNBdHRyaWJ1dGUoYy5OT19ERUZBVUxUX1NUT1JFKSYmdmkodGhpcyxnYSxCcikuY2FsbCh0aGlzKSwoZT1wKHRoaXMsTSkpPT1udWxsfHxlLmRpc3BhdGNoKHt0eXBlOiJkb2N1bWVudGVsZW1lbnRjaGFuZ2VyZXF1ZXN0IixkZXRhaWw6UH0pLChpPXAodGhpcyxNKSk9PW51bGx8fGkuZGlzcGF0Y2goe3R5cGU6ImZ1bGxzY3JlZW5lbGVtZW50Y2hhbmdlcmVxdWVzdCIsZGV0YWlsOnRoaXMuZnVsbHNjcmVlbkVsZW1lbnR9KSxzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHAodGhpcyxNKSYmIXAodGhpcyxTZSkmJmdlKHRoaXMsU2UsKGE9cCh0aGlzLE0pKT09bnVsbD92b2lkIDA6YS5zdWJzY3JpYmUocCh0aGlzLGdpKSkpLHAodGhpcyxfaSkhPT12b2lkIDAmJnAodGhpcyxNKSYmdGhpcy5tZWRpYSYmc2V0VGltZW91dCgoKT0+e3ZhciByLHMsbzsocz0ocj10aGlzLm1lZGlhKT09bnVsbD92b2lkIDA6ci50ZXh0VHJhY2tzKSE9bnVsbCYmcy5sZW5ndGgmJigobz1wKHRoaXMsTSkpPT1udWxsfHxvLmRpc3BhdGNoKHt0eXBlOmguTUVESUFfVE9HR0xFX1NVQlRJVExFU19SRVFVRVNULGRldGFpbDpwKHRoaXMsX2kpfSkpfSwwKSx0aGlzLmhhc0F0dHJpYnV0ZShjLk5PX0hPVEtFWVMpP3RoaXMuZGlzYWJsZUhvdGtleXMoKTp0aGlzLmVuYWJsZUhvdGtleXMoKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3ZhciBlLGksYSxyLHMsbztpZigoZT1zdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjayk9PW51bGx8fGUuY2FsbCh0aGlzKSx0aGlzLmRpc2FibGVIb3RrZXlzKCkscCh0aGlzLE0pKXtsZXQgZD1wKHRoaXMsTSkuZ2V0U3RhdGUoKTtnZSh0aGlzLF9pLCEhKChpPWQubWVkaWFTdWJ0aXRsZXNTaG93aW5nKSE9bnVsbCYmaS5sZW5ndGgpKSwoYT1wKHRoaXMsTSkpPT1udWxsfHxhLmRpc3BhdGNoKHt0eXBlOiJmdWxsc2NyZWVuZWxlbWVudGNoYW5nZXJlcXVlc3QiLGRldGFpbDp2b2lkIDB9KSwocj1wKHRoaXMsTSkpPT1udWxsfHxyLmRpc3BhdGNoKHt0eXBlOiJkb2N1bWVudGVsZW1lbnRjaGFuZ2VyZXF1ZXN0IixkZXRhaWw6dm9pZCAwfSksKHM9cCh0aGlzLE0pKT09bnVsbHx8cy5kaXNwYXRjaCh7dHlwZTpoLk1FRElBX1RPR0dMRV9TVUJUSVRMRVNfUkVRVUVTVCxkZXRhaWw6ITF9KX1wKHRoaXMsU2UpJiYoKG89cCh0aGlzLFNlKSk9PW51bGx8fG8uY2FsbCh0aGlzKSxnZSh0aGlzLFNlLHZvaWQgMCkpLHRoaXMudW5hc3NvY2lhdGVFbGVtZW50KHRoaXMpLHAodGhpcyxJZSkmJihwKHRoaXMsSWUpLnJlbW92ZSgpLGdlKHRoaXMsSWUsbnVsbCkpfW1lZGlhU2V0Q2FsbGJhY2soZSl7dmFyIGk7c3VwZXIubWVkaWFTZXRDYWxsYmFjayhlKSwoaT1wKHRoaXMsTSkpPT1udWxsfHxpLmRpc3BhdGNoKHt0eXBlOiJtZWRpYWVsZW1lbnRjaGFuZ2VyZXF1ZXN0IixkZXRhaWw6ZX0pLGUuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfHwoZS50YWJJbmRleD0tMSl9bWVkaWFVbnNldENhbGxiYWNrKGUpe3ZhciBpO3N1cGVyLm1lZGlhVW5zZXRDYWxsYmFjayhlKSwoaT1wKHRoaXMsTSkpPT1udWxsfHxpLmRpc3BhdGNoKHt0eXBlOiJtZWRpYWVsZW1lbnRjaGFuZ2VyZXF1ZXN0IixkZXRhaWw6dm9pZCAwfSl9cHJvcGFnYXRlTWVkaWFTdGF0ZShlLGkpe3ZvKHRoaXMubWVkaWFTdGF0ZVJlY2VpdmVycyxlLGkpfWFzc29jaWF0ZUVsZW1lbnQoZSl7aWYoIWUpcmV0dXJuO2xldHthc3NvY2lhdGVkRWxlbWVudFN1YnNjcmlwdGlvbnM6aX09dGhpcztpZihpLmhhcyhlKSlyZXR1cm47bGV0IGE9dGhpcy5yZWdpc3Rlck1lZGlhU3RhdGVSZWNlaXZlci5iaW5kKHRoaXMpLHI9dGhpcy51bnJlZ2lzdGVyTWVkaWFTdGF0ZVJlY2VpdmVyLmJpbmQodGhpcykscz1yZChlLGEscik7T2JqZWN0LnZhbHVlcyhoKS5mb3JFYWNoKG89PntlLmFkZEV2ZW50TGlzdGVuZXIobyxwKHRoaXMsZmEpKX0pLGkuc2V0KGUscyl9dW5hc3NvY2lhdGVFbGVtZW50KGUpe2lmKCFlKXJldHVybjtsZXR7YXNzb2NpYXRlZEVsZW1lbnRTdWJzY3JpcHRpb25zOml9PXRoaXM7aWYoIWkuaGFzKGUpKXJldHVybjtpLmdldChlKSgpLGkuZGVsZXRlKGUpLE9iamVjdC52YWx1ZXMoaCkuZm9yRWFjaChyPT57ZS5yZW1vdmVFdmVudExpc3RlbmVyKHIscCh0aGlzLGZhKSl9KX1yZWdpc3Rlck1lZGlhU3RhdGVSZWNlaXZlcihlKXtpZighZSlyZXR1cm47bGV0IGk9dGhpcy5tZWRpYVN0YXRlUmVjZWl2ZXJzO2kuaW5kZXhPZihlKT4tMXx8KGkucHVzaChlKSxwKHRoaXMsTSkmJk9iamVjdC5lbnRyaWVzKHAodGhpcyxNKS5nZXRTdGF0ZSgpKS5mb3JFYWNoKChbcixzXSk9Pnt2byhbZV0scixzKX0pKX11bnJlZ2lzdGVyTWVkaWFTdGF0ZVJlY2VpdmVyKGUpe2xldCBpPXRoaXMubWVkaWFTdGF0ZVJlY2VpdmVycyxhPWkuaW5kZXhPZihlKTthPDB8fGkuc3BsaWNlKGEsMSl9ZW5hYmxlSG90a2V5cygpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdmkodGhpcyxfYSxXcikpfWRpc2FibGVIb3RrZXlzKCl7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix2aSh0aGlzLF9hLFdyKSksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIscCh0aGlzLGh0KSl9Z2V0IGhvdGtleXMoKXtyZXR1cm4gcCh0aGlzLEJlKX1zZXQgaG90a2V5cyhlKXtVKHRoaXMsYy5IT1RLRVlTLGUpfWtleWJvYXJkU2hvcnRjdXRIYW5kbGVyKGUpe3ZhciBpLGEscixzLG8sZCx1LF8sVDtsZXQgQT1lLnRhcmdldDtpZigoKHI9KGE9KGk9QS5nZXRBdHRyaWJ1dGUoYy5LRVlTX1VTRUQpKT09bnVsbD92b2lkIDA6aS5zcGxpdCgiICIpKSE9bnVsbD9hOkE/LmtleXNVc2VkKSE9bnVsbD9yOltdKS5tYXAoUz0+Uz09PSJTcGFjZSI/IiAiOlMpLmZpbHRlcihCb29sZWFuKS5pbmNsdWRlcyhlLmtleSkpcmV0dXJuO2xldCBtLGIsRTtpZighKHAodGhpcyxCZSkuY29udGFpbnMoYG5vJHtlLmtleS50b0xvd2VyQ2FzZSgpfWApfHxlLmtleT09PSIgIiYmcCh0aGlzLEJlKS5jb250YWlucygibm9zcGFjZSIpfHxlLnNoaWZ0S2V5JiYoZS5rZXk9PT0iLyJ8fGUua2V5PT09Ij8iKSYmcCh0aGlzLEJlKS5jb250YWlucygibm9zaGlmdCsvIikpKXN3aXRjaChlLmtleSl7Y2FzZSIgIjpjYXNlImsiOm09cCh0aGlzLE0pLmdldFN0YXRlKCkubWVkaWFQYXVzZWQ/aC5NRURJQV9QTEFZX1JFUVVFU1Q6aC5NRURJQV9QQVVTRV9SRVFVRVNULHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgbC5DdXN0b21FdmVudChtLHtjb21wb3NlZDohMCxidWJibGVzOiEwfSkpO2JyZWFrO2Nhc2UibSI6bT10aGlzLm1lZGlhU3RvcmUuZ2V0U3RhdGUoKS5tZWRpYVZvbHVtZUxldmVsPT09Im9mZiI/aC5NRURJQV9VTk1VVEVfUkVRVUVTVDpoLk1FRElBX01VVEVfUkVRVUVTVCx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGwuQ3VzdG9tRXZlbnQobSx7Y29tcG9zZWQ6ITAsYnViYmxlczohMH0pKTticmVhaztjYXNlImYiOm09dGhpcy5tZWRpYVN0b3JlLmdldFN0YXRlKCkubWVkaWFJc0Z1bGxzY3JlZW4/aC5NRURJQV9FWElUX0ZVTExTQ1JFRU5fUkVRVUVTVDpoLk1FRElBX0VOVEVSX0ZVTExTQ1JFRU5fUkVRVUVTVCx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGwuQ3VzdG9tRXZlbnQobSx7Y29tcG9zZWQ6ITAsYnViYmxlczohMH0pKTticmVhaztjYXNlImMiOnRoaXMuZGlzcGF0Y2hFdmVudChuZXcgbC5DdXN0b21FdmVudChoLk1FRElBX1RPR0dMRV9TVUJUSVRMRVNfUkVRVUVTVCx7Y29tcG9zZWQ6ITAsYnViYmxlczohMH0pKTticmVhaztjYXNlIkFycm93TGVmdCI6Y2FzZSJqIjp7bGV0IFM9dGhpcy5oYXNBdHRyaWJ1dGUoYy5LRVlCT0FSRF9CQUNLV0FSRF9TRUVLX09GRlNFVCk/K3RoaXMuZ2V0QXR0cmlidXRlKGMuS0VZQk9BUkRfQkFDS1dBUkRfU0VFS19PRkZTRVQpOmNvO2I9TWF0aC5tYXgoKChzPXRoaXMubWVkaWFTdG9yZS5nZXRTdGF0ZSgpLm1lZGlhQ3VycmVudFRpbWUpIT1udWxsP3M6MCktUywwKSxFPW5ldyBsLkN1c3RvbUV2ZW50KGguTUVESUFfU0VFS19SRVFVRVNULHtjb21wb3NlZDohMCxidWJibGVzOiEwLGRldGFpbDpifSksdGhpcy5kaXNwYXRjaEV2ZW50KEUpO2JyZWFrfWNhc2UiQXJyb3dSaWdodCI6Y2FzZSJsIjp7bGV0IFM9dGhpcy5oYXNBdHRyaWJ1dGUoYy5LRVlCT0FSRF9GT1JXQVJEX1NFRUtfT0ZGU0VUKT8rdGhpcy5nZXRBdHRyaWJ1dGUoYy5LRVlCT0FSRF9GT1JXQVJEX1NFRUtfT0ZGU0VUKTpjbztiPU1hdGgubWF4KCgobz10aGlzLm1lZGlhU3RvcmUuZ2V0U3RhdGUoKS5tZWRpYUN1cnJlbnRUaW1lKSE9bnVsbD9vOjApK1MsMCksRT1uZXcgbC5DdXN0b21FdmVudChoLk1FRElBX1NFRUtfUkVRVUVTVCx7Y29tcG9zZWQ6ITAsYnViYmxlczohMCxkZXRhaWw6Yn0pLHRoaXMuZGlzcGF0Y2hFdmVudChFKTticmVha31jYXNlIkFycm93VXAiOntsZXQgUz10aGlzLmhhc0F0dHJpYnV0ZShjLktFWUJPQVJEX1VQX1ZPTFVNRV9TVEVQKT8rdGhpcy5nZXRBdHRyaWJ1dGUoYy5LRVlCT0FSRF9VUF9WT0xVTUVfU1RFUCk6aG87Yj1NYXRoLm1pbigoKGQ9dGhpcy5tZWRpYVN0b3JlLmdldFN0YXRlKCkubWVkaWFWb2x1bWUpIT1udWxsP2Q6MSkrUywxKSxFPW5ldyBsLkN1c3RvbUV2ZW50KGguTUVESUFfVk9MVU1FX1JFUVVFU1Qse2NvbXBvc2VkOiEwLGJ1YmJsZXM6ITAsZGV0YWlsOmJ9KSx0aGlzLmRpc3BhdGNoRXZlbnQoRSk7YnJlYWt9Y2FzZSJBcnJvd0Rvd24iOntsZXQgUz10aGlzLmhhc0F0dHJpYnV0ZShjLktFWUJPQVJEX0RPV05fVk9MVU1FX1NURVApPyt0aGlzLmdldEF0dHJpYnV0ZShjLktFWUJPQVJEX0RPV05fVk9MVU1FX1NURVApOmhvO2I9TWF0aC5tYXgoKCh1PXRoaXMubWVkaWFTdG9yZS5nZXRTdGF0ZSgpLm1lZGlhVm9sdW1lKSE9bnVsbD91OjEpLVMsMCksRT1uZXcgbC5DdXN0b21FdmVudChoLk1FRElBX1ZPTFVNRV9SRVFVRVNULHtjb21wb3NlZDohMCxidWJibGVzOiEwLGRldGFpbDpifSksdGhpcy5kaXNwYXRjaEV2ZW50KEUpO2JyZWFrfWNhc2UiPCI6e2xldCBTPShfPXRoaXMubWVkaWFTdG9yZS5nZXRTdGF0ZSgpLm1lZGlhUGxheWJhY2tSYXRlKSE9bnVsbD9fOjE7Yj1NYXRoLm1heChTLW1vLFhsKS50b0ZpeGVkKDIpLEU9bmV3IGwuQ3VzdG9tRXZlbnQoaC5NRURJQV9QTEFZQkFDS19SQVRFX1JFUVVFU1Qse2NvbXBvc2VkOiEwLGJ1YmJsZXM6ITAsZGV0YWlsOmJ9KSx0aGlzLmRpc3BhdGNoRXZlbnQoRSk7YnJlYWt9Y2FzZSI+Ijp7bGV0IFM9KFQ9dGhpcy5tZWRpYVN0b3JlLmdldFN0YXRlKCkubWVkaWFQbGF5YmFja1JhdGUpIT1udWxsP1Q6MTtiPU1hdGgubWluKFMrbW8sSmwpLnRvRml4ZWQoMiksRT1uZXcgbC5DdXN0b21FdmVudChoLk1FRElBX1BMQVlCQUNLX1JBVEVfUkVRVUVTVCx7Y29tcG9zZWQ6ITAsYnViYmxlczohMCxkZXRhaWw6Yn0pLHRoaXMuZGlzcGF0Y2hFdmVudChFKTticmVha31jYXNlIi8iOmNhc2UiPyI6e2Uuc2hpZnRLZXkmJnZpKHRoaXMsJHIsZm8pLmNhbGwodGhpcyk7YnJlYWt9Y2FzZSJwIjp7bT10aGlzLm1lZGlhU3RvcmUuZ2V0U3RhdGUoKS5tZWRpYUlzUGlwP2guTUVESUFfRVhJVF9QSVBfUkVRVUVTVDpoLk1FRElBX0VOVEVSX1BJUF9SRVFVRVNULEU9bmV3IGwuQ3VzdG9tRXZlbnQobSx7Y29tcG9zZWQ6ITAsYnViYmxlczohMH0pLHRoaXMuZGlzcGF0Y2hFdmVudChFKTticmVha31kZWZhdWx0OmJyZWFrfX19O0JlPW5ldyBXZWFrTWFwO2ZpPW5ldyBXZWFrTWFwO009bmV3IFdlYWtNYXA7SWU9bmV3IFdlYWtNYXA7Z2k9bmV3IFdlYWtNYXA7U2U9bmV3IFdlYWtNYXA7ZmE9bmV3IFdlYWtNYXA7X2k9bmV3IFdlYWtNYXA7Z2E9bmV3IFdlYWtTZXQ7QnI9ZnVuY3Rpb24oKXt2YXIgdDt0aGlzLm1lZGlhU3RvcmU9dW8oe21lZGlhOnRoaXMubWVkaWEsZnVsbHNjcmVlbkVsZW1lbnQ6dGhpcy5mdWxsc2NyZWVuRWxlbWVudCxvcHRpb25zOntkZWZhdWx0U3VidGl0bGVzOnRoaXMuaGFzQXR0cmlidXRlKGMuREVGQVVMVF9TVUJUSVRMRVMpLGRlZmF1bHREdXJhdGlvbjp0aGlzLmhhc0F0dHJpYnV0ZShjLkRFRkFVTFRfRFVSQVRJT04pPyt0aGlzLmdldEF0dHJpYnV0ZShjLkRFRkFVTFRfRFVSQVRJT04pOnZvaWQgMCxkZWZhdWx0U3RyZWFtVHlwZToodD10aGlzLmdldEF0dHJpYnV0ZShjLkRFRkFVTFRfU1RSRUFNX1RZUEUpKSE9bnVsbD90OnZvaWQgMCxsaXZlRWRnZU9mZnNldDp0aGlzLmhhc0F0dHJpYnV0ZShjLkxJVkVfRURHRV9PRkZTRVQpPyt0aGlzLmdldEF0dHJpYnV0ZShjLkxJVkVfRURHRV9PRkZTRVQpOnZvaWQgMCxzZWVrVG9MaXZlT2Zmc2V0OnRoaXMuaGFzQXR0cmlidXRlKGMuU0VFS19UT19MSVZFX09GRlNFVCk/K3RoaXMuZ2V0QXR0cmlidXRlKGMuU0VFS19UT19MSVZFX09GRlNFVCk6dGhpcy5oYXNBdHRyaWJ1dGUoYy5MSVZFX0VER0VfT0ZGU0VUKT8rdGhpcy5nZXRBdHRyaWJ1dGUoYy5MSVZFX0VER0VfT0ZGU0VUKTp2b2lkIDAsbm9BdXRvU2Vla1RvTGl2ZTp0aGlzLmhhc0F0dHJpYnV0ZShjLk5PX0FVVE9fU0VFS19UT19MSVZFKSxub1ZvbHVtZVByZWY6dGhpcy5oYXNBdHRyaWJ1dGUoYy5OT19WT0xVTUVfUFJFRiksbm9NdXRlZFByZWY6dGhpcy5oYXNBdHRyaWJ1dGUoYy5OT19NVVRFRF9QUkVGKSxub1N1YnRpdGxlc0xhbmdQcmVmOnRoaXMuaGFzQXR0cmlidXRlKGMuTk9fU1VCVElUTEVTX0xBTkdfUFJFRil9fSl9O2h0PW5ldyBXZWFrTWFwO19hPW5ldyBXZWFrU2V0O1dyPWZ1bmN0aW9uKHQpe3ZhciBlO2xldHttZXRhS2V5OmksYWx0S2V5OmEsa2V5OnIsc2hpZnRLZXk6c309dCxvPXMmJihyPT09Ii8ifHxyPT09Ij8iKTtpZihvJiYoKGU9cCh0aGlzLEllKSkhPW51bGwmJmUub3Blbikpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLHAodGhpcyxodCkpO3JldHVybn1pZihpfHxhfHwhbyYmIWdvLmluY2x1ZGVzKHIpKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixwKHRoaXMsaHQpKTtyZXR1cm59bGV0IGQ9dC50YXJnZXQsdT1kIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJihkLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09PSJtZWRpYS12b2x1bWUtcmFuZ2UifHxkLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09PSJtZWRpYS10aW1lLXJhbmdlIik7WyIgIiwiQXJyb3dMZWZ0IiwiQXJyb3dSaWdodCIsIkFycm93VXAiLCJBcnJvd0Rvd24iXS5pbmNsdWRlcyhyKSYmIShwKHRoaXMsQmUpLmNvbnRhaW5zKGBubyR7ci50b0xvd2VyQ2FzZSgpfWApfHxyPT09IiAiJiZwKHRoaXMsQmUpLmNvbnRhaW5zKCJub3NwYWNlIikpJiYhdSYmdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHAodGhpcyxodCkse29uY2U6ITB9KX07JHI9bmV3IFdlYWtTZXQ7Zm89ZnVuY3Rpb24oKXtwKHRoaXMsSWUpfHwoZ2UodGhpcyxJZSxQLmNyZWF0ZUVsZW1lbnQoIm1lZGlhLWtleWJvYXJkLXNob3J0Y3V0cy1kaWFsb2ciKSksdGhpcy5hcHBlbmRDaGlsZChwKHRoaXMsSWUpKSkscCh0aGlzLEllKS5vcGVuPSEwfTt2YXIgamw9T2JqZWN0LnZhbHVlcyhuKSxlZD1PYmplY3QudmFsdWVzKHlyKSxfbz10PT57dmFyIGUsaSxhLHI7bGV0e29ic2VydmVkQXR0cmlidXRlczpzfT10LmNvbnN0cnVjdG9yOyFzJiYoKGU9dC5ub2RlTmFtZSkhPW51bGwmJmUuaW5jbHVkZXMoIi0iKSkmJihsLmN1c3RvbUVsZW1lbnRzLnVwZ3JhZGUodCkse29ic2VydmVkQXR0cmlidXRlczpzfT10LmNvbnN0cnVjdG9yKTtsZXQgbz0ocj0oYT0oaT10Py5nZXRBdHRyaWJ1dGUpPT1udWxsP3ZvaWQgMDppLmNhbGwodCx3Lk1FRElBX0NIUk9NRV9BVFRSSUJVVEVTKSk9PW51bGw/dm9pZCAwOmEuc3BsaXQpPT1udWxsP3ZvaWQgMDpyLmNhbGwoYSwvXHMrLyk7cmV0dXJuIEFycmF5LmlzQXJyYXkoc3x8byk/KHN8fG8pLmZpbHRlcihkPT5qbC5pbmNsdWRlcyhkKSk6W119LHRkPXQ9Pnt2YXIgZSxpO3JldHVybihlPXQubm9kZU5hbWUpIT1udWxsJiZlLmluY2x1ZGVzKCItIikmJmwuY3VzdG9tRWxlbWVudHMuZ2V0KChpPXQubm9kZU5hbWUpPT1udWxsP3ZvaWQgMDppLnRvTG93ZXJDYXNlKCkpJiYhKHQgaW5zdGFuY2VvZiBsLmN1c3RvbUVsZW1lbnRzLmdldCh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSYmbC5jdXN0b21FbGVtZW50cy51cGdyYWRlKHQpLGVkLnNvbWUoYT0+YSBpbiB0KX0sS3I9dD0+dGQodCl8fCEhX28odCkubGVuZ3RoLHBvPXQ9Pnt2YXIgZTtyZXR1cm4oZT10Py5qb2luKT09bnVsbD92b2lkIDA6ZS5jYWxsKHQsIjoiKX0sRW89e1tuLk1FRElBX1NVQlRJVExFU19MSVNUXTpsdCxbbi5NRURJQV9TVUJUSVRMRVNfU0hPV0lOR106bHQsW24uTUVESUFfU0VFS0FCTEVdOnBvLFtuLk1FRElBX0JVRkZFUkVEXTp0PT50Py5tYXAocG8pLmpvaW4oIiAiKSxbbi5NRURJQV9QUkVWSUVXX0NPT1JEU106dD0+dD8uam9pbigiICIpLFtuLk1FRElBX1JFTkRJVElPTl9MSVNUXTpxbixbbi5NRURJQV9BVURJT19UUkFDS19MSVNUXTpZbn0saWQ9YXN5bmModCxlLGkpPT57dmFyIGEscjtpZih0LmlzQ29ubmVjdGVkfHxhd2FpdCBjYSgwKSx0eXBlb2YgaT09ImJvb2xlYW4ifHxpPT1udWxsKXJldHVybiB5KHQsZSxpKTtpZih0eXBlb2YgaT09Im51bWJlciIpcmV0dXJuIEgodCxlLGkpO2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyZXR1cm4gVSh0LGUsaSk7aWYoQXJyYXkuaXNBcnJheShpKSYmIWkubGVuZ3RoKXJldHVybiB0LnJlbW92ZUF0dHJpYnV0ZShlKTtsZXQgcz0ocj0oYT1Fb1tlXSk9PW51bGw/dm9pZCAwOmEuY2FsbChFbyxpKSkhPW51bGw/cjppO3JldHVybiB0LnNldEF0dHJpYnV0ZShlLHMpfSxhZD10PT57dmFyIGU7cmV0dXJuISEoKGU9dC5jbG9zZXN0KSE9bnVsbCYmZS5jYWxsKHQsJypbc2xvdD0ibWVkaWEiXScpKX0sY3Q9KHQsZSk9PntpZihhZCh0KSlyZXR1cm47bGV0IGk9KHIscyk9Pnt2YXIgbyxkO0tyKHIpJiZzKHIpO2xldHtjaGlsZHJlbjp1PVtdfT1yPz97fSxfPShkPShvPXI/LnNoYWRvd1Jvb3QpPT1udWxsP3ZvaWQgMDpvLmNoaWxkcmVuKSE9bnVsbD9kOltdO1suLi51LC4uLl9dLmZvckVhY2goQT0+Y3QoQSxzKSl9LGE9dD8ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihhLmluY2x1ZGVzKCItIikmJiFLcih0KSl7bC5jdXN0b21FbGVtZW50cy53aGVuRGVmaW5lZChhKS50aGVuKCgpPT57aSh0LGUpfSk7cmV0dXJufWkodCxlKX0sdm89KHQsZSxpKT0+e3QuZm9yRWFjaChhPT57aWYoZSBpbiBhKXthW2VdPWk7cmV0dXJufWxldCByPV9vKGEpLHM9ZS50b0xvd2VyQ2FzZSgpO3IuaW5jbHVkZXMocykmJmlkKGEscyxpKX0pfSxyZD0odCxlLGkpPT57Y3QodCxlKTtsZXQgYT1UPT57dmFyIEE7bGV0IHY9KEE9VD8uY29tcG9zZWRQYXRoKClbMF0pIT1udWxsP0E6VC50YXJnZXQ7ZSh2KX0scj1UPT57dmFyIEE7bGV0IHY9KEE9VD8uY29tcG9zZWRQYXRoKClbMF0pIT1udWxsP0E6VC50YXJnZXQ7aSh2KX07dC5hZGRFdmVudExpc3RlbmVyKGguUkVHSVNURVJfTUVESUFfU1RBVEVfUkVDRUlWRVIsYSksdC5hZGRFdmVudExpc3RlbmVyKGguVU5SRUdJU1RFUl9NRURJQV9TVEFURV9SRUNFSVZFUixyKTtsZXQgcz1UPT57VC5mb3JFYWNoKEE9PntsZXR7YWRkZWROb2Rlczp2PVtdLHJlbW92ZWROb2RlczptPVtdLHR5cGU6Yix0YXJnZXQ6RSxhdHRyaWJ1dGVOYW1lOkl9PUE7Yj09PSJjaGlsZExpc3QiPyhBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHYsUz0+Y3QoUyxlKSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLFM9PmN0KFMsaSkpKTpiPT09ImF0dHJpYnV0ZXMiJiZJPT09dy5NRURJQV9DSFJPTUVfQVRUUklCVVRFUyYmKEtyKEUpP2UoRSk6aShFKSl9KX0sbz1bXSxkPVQ9PntsZXQgQT1ULnRhcmdldDtBLm5hbWUhPT0ibWVkaWEiJiYoby5mb3JFYWNoKHY9PmN0KHYsaSkpLG89Wy4uLkEuYXNzaWduZWRFbGVtZW50cyh7ZmxhdHRlbjohMH0pXSxvLmZvckVhY2godj0+Y3QodixlKSkpfTt0LmFkZEV2ZW50TGlzdGVuZXIoInNsb3RjaGFuZ2UiLGQpO2xldCB1PW5ldyBNdXRhdGlvbk9ic2VydmVyKHMpO3JldHVybiB1Lm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLGF0dHJpYnV0ZXM6ITAsc3VidHJlZTohMH0pLCgpPT57Y3QodCxpKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNsb3RjaGFuZ2UiLGQpLHUuZGlzY29ubmVjdCgpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihoLlJFR0lTVEVSX01FRElBX1NUQVRFX1JFQ0VJVkVSLGEpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihoLlVOUkVHSVNURVJfTUVESUFfU1RBVEVfUkVDRUlWRVIscil9fTtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtY29udHJvbGxlciIpfHxsLmN1c3RvbUVsZW1lbnRzLmRlZmluZSgibWVkaWEtY29udHJvbGxlciIsVnIpO3ZhciBibz0odCxlLGkpPT57aWYoIWUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIraSl9LGJhPSh0LGUsaSk9Pihibyh0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLHNkPSh0LGUsaSk9PntpZihlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtlIGluc3RhbmNlb2YgV2Vha1NldD9lLmFkZCh0KTplLnNldCh0LGkpfSxBYT0odCxlLGksYSk9Pihibyh0LGUsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxhP2EuY2FsbCh0LGkpOmUuc2V0KHQsaSksaSksa2U7ZnVuY3Rpb24gbmQodCl7cmV0dXJuYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgCiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXNwbGF5OiB2YXIoLS1tZWRpYS1jb250cm9sLWRpc3BsYXksIHZhcigtLW1lZGlhLWNvbnRyb2wtYmFyLWRpc3BsYXksIGlubGluZS1mbGV4KSk7CiAgICAgICAgY29sb3I6IHZhcigtLW1lZGlhLXRleHQtY29sb3IsIHZhcigtLW1lZGlhLXByaW1hcnktY29sb3IsIHJnYigyMzggMjM4IDIzOCkpKTsKICAgICAgICAtLW1lZGlhLWxvYWRpbmctaW5kaWNhdG9yLWljb24taGVpZ2h0OiA0NHB4OwogICAgICB9CgogICAgICA6OnNsb3R0ZWQobWVkaWEtdGltZS1yYW5nZSksCiAgICAgIDo6c2xvdHRlZChtZWRpYS12b2x1bWUtcmFuZ2UpIHsKICAgICAgICBtaW4taGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQobWVkaWEtdGltZS1yYW5nZSksCiAgICAgIDo6c2xvdHRlZChtZWRpYS1jbGlwLXNlbGVjdG9yKSB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQoW3JvbGU9Im1lbnUiXSkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgYH12YXIgYmk9Y2xhc3MgZXh0ZW5kcyBsLkhUTUxFbGVtZW50e2NvbnN0cnVjdG9yKCl7aWYoc3VwZXIoKSxzZCh0aGlzLGtlLHZvaWQgMCksIXRoaXMuc2hhZG93Um9vdCl7dGhpcy5hdHRhY2hTaGFkb3codGhpcy5jb25zdHJ1Y3Rvci5zaGFkb3dSb290T3B0aW9ucyk7bGV0IGU9Ryh0aGlzLmF0dHJpYnV0ZXMpO3RoaXMuc2hhZG93Um9vdC5pbm5lckhUTUw9dGhpcy5jb25zdHJ1Y3Rvci5nZXRUZW1wbGF0ZUhUTUwoZSl9fXN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuW3cuTUVESUFfQ09OVFJPTExFUl19YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKXt2YXIgcixzLG8sZCx1O2U9PT13Lk1FRElBX0NPTlRST0xMRVImJihpJiYoKHM9KHI9YmEodGhpcyxrZSkpPT1udWxsP3ZvaWQgMDpyLnVuYXNzb2NpYXRlRWxlbWVudCk9PW51bGx8fHMuY2FsbChyLHRoaXMpLEFhKHRoaXMsa2UsbnVsbCkpLGEmJnRoaXMuaXNDb25uZWN0ZWQmJihBYSh0aGlzLGtlLChvPXRoaXMuZ2V0Um9vdE5vZGUoKSk9PW51bGw/dm9pZCAwOm8uZ2V0RWxlbWVudEJ5SWQoYSkpLCh1PShkPWJhKHRoaXMsa2UpKT09bnVsbD92b2lkIDA6ZC5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8dS5jYWxsKGQsdGhpcykpKX1jb25uZWN0ZWRDYWxsYmFjaygpe3ZhciBlLGksYTtsZXQgcj10aGlzLmdldEF0dHJpYnV0ZSh3Lk1FRElBX0NPTlRST0xMRVIpO3ImJihBYSh0aGlzLGtlLChlPXRoaXMuZ2V0Um9vdE5vZGUoKSk9PW51bGw/dm9pZCAwOmUuZ2V0RWxlbWVudEJ5SWQocikpLChhPShpPWJhKHRoaXMsa2UpKT09bnVsbD92b2lkIDA6aS5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8YS5jYWxsKGksdGhpcykpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7dmFyIGUsaTsoaT0oZT1iYSh0aGlzLGtlKSk9PW51bGw/dm9pZCAwOmUudW5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8aS5jYWxsKGUsdGhpcyksQWEodGhpcyxrZSxudWxsKX19O2tlPW5ldyBXZWFrTWFwO2JpLnNoYWRvd1Jvb3RPcHRpb25zPXttb2RlOiJvcGVuIn07YmkuZ2V0VGVtcGxhdGVIVE1MPW5kO2wuY3VzdG9tRWxlbWVudHMuZ2V0KCJtZWRpYS1jb250cm9sLWJhciIpfHxsLmN1c3RvbUVsZW1lbnRzLmRlZmluZSgibWVkaWEtY29udHJvbC1iYXIiLGJpKTt2YXIgT3Q9e1BMQUNFTUVOVDoicGxhY2VtZW50IixCT1VORFM6ImJvdW5kcyJ9O2Z1bmN0aW9uIG9kKHQpe3JldHVybmAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tX3Rvb2x0aXAtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWVkaWEtdG9vbHRpcC1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1tZWRpYS1zZWNvbmRhcnktY29sb3IsIHJnYmEoMjAsIDIwLCAzMCwgLjcpKSk7CiAgICAgICAgLS1fdG9vbHRpcC1iYWNrZ3JvdW5kOiB2YXIoLS1tZWRpYS10b29sdGlwLWJhY2tncm91bmQsIHZhcigtLV90b29sdGlwLWJhY2tncm91bmQtY29sb3IpKTsKICAgICAgICAtLV90b29sdGlwLWFycm93LWhhbGYtd2lkdGg6IGNhbGModmFyKC0tbWVkaWEtdG9vbHRpcC1hcnJvdy13aWR0aCwgMTJweCkgLyAyKTsKICAgICAgICAtLV90b29sdGlwLWFycm93LWhlaWdodDogdmFyKC0tbWVkaWEtdG9vbHRpcC1hcnJvdy1oZWlnaHQsIDVweCk7CiAgICAgICAgLS1fdG9vbHRpcC1hcnJvdy1iYWNrZ3JvdW5kOiB2YXIoLS1tZWRpYS10b29sdGlwLWFycm93LWNvbG9yLCB2YXIoLS1fdG9vbHRpcC1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGRpc3BsYXk6IHZhcigtLW1lZGlhLXRvb2x0aXAtZGlzcGxheSwgaW5saW5lLWZsZXgpOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICB6LWluZGV4OiB2YXIoLS1tZWRpYS10b29sdGlwLXotaW5kZXgsIDEpOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLV90b29sdGlwLWJhY2tncm91bmQpOwogICAgICAgIGNvbG9yOiB2YXIoLS1tZWRpYS10ZXh0LWNvbG9yLCB2YXIoLS1tZWRpYS1wcmltYXJ5LWNvbG9yLCByZ2IoMjM4IDIzOCAyMzgpKSk7CiAgICAgICAgZm9udDogdmFyKC0tbWVkaWEtZm9udCwKICAgICAgICAgIHZhcigtLW1lZGlhLWZvbnQtd2VpZ2h0LCA0MDApCiAgICAgICAgICB2YXIoLS1tZWRpYS1mb250LXNpemUsIDEzcHgpIC8KICAgICAgICAgIHZhcigtLW1lZGlhLXRleHQtY29udGVudC1oZWlnaHQsIHZhcigtLW1lZGlhLWNvbnRyb2wtaGVpZ2h0LCAxOHB4KSkKICAgICAgICAgIHZhcigtLW1lZGlhLWZvbnQtZmFtaWx5LCBoZWx2ZXRpY2EgbmV1ZSwgc2Vnb2UgdWksIHJvYm90bywgYXJpYWwsIHNhbnMtc2VyaWYpKTsKICAgICAgICBwYWRkaW5nOiB2YXIoLS1tZWRpYS10b29sdGlwLXBhZGRpbmcsIC4zNWVtIC43ZW0pOwogICAgICAgIGJvcmRlcjogdmFyKC0tbWVkaWEtdG9vbHRpcC1ib3JkZXIsIG5vbmUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1lZGlhLXRvb2x0aXAtYm9yZGVyLXJhZGl1cywgNXB4KTsKICAgICAgICBmaWx0ZXI6IHZhcigtLW1lZGlhLXRvb2x0aXAtZmlsdGVyLCBkcm9wLXNoYWRvdygwIDAgNHB4IHJnYmEoMCwgMCwgMCwgLjIpKSk7CiAgICAgICAgd2hpdGUtc3BhY2U6IHZhcigtLW1lZGlhLXRvb2x0aXAtd2hpdGUtc3BhY2UsIG5vd3JhcCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgaW1nLCBzdmcgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2Fycm93IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDBweDsKICAgICAgICBoZWlnaHQ6IDBweDsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGRpc3BsYXk6IHZhcigtLW1lZGlhLXRvb2x0aXAtYXJyb3ctZGlzcGxheSwgYmxvY2spOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtwbGFjZW1lbnRdKSksCiAgICAgIDpob3N0KFtwbGFjZW1lbnQ9InRvcCJdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogY2FsYygxMDAlICsgdmFyKC0tbWVkaWEtdG9vbHRpcC1kaXN0YW5jZSwgMTJweCkpOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZShjYWxjKC01MCUgLSB2YXIoLS1tZWRpYS10b29sdGlwLW9mZnNldC14LCAwcHgpKSwgMCk7CiAgICAgIH0KICAgICAgOmhvc3QoOm5vdChbcGxhY2VtZW50XSkpICNhcnJvdywKICAgICAgOmhvc3QoW3BsYWNlbWVudD0idG9wIl0pICNhcnJvdyB7CiAgICAgICAgdG9wOiAxMDAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICBib3JkZXItd2lkdGg6IHZhcigtLV90b29sdGlwLWFycm93LWhlaWdodCkgdmFyKC0tX3Rvb2x0aXAtYXJyb3ctaGFsZi13aWR0aCkgMCB2YXIoLS1fdG9vbHRpcC1hcnJvdy1oYWxmLXdpZHRoKTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLV90b29sdGlwLWFycm93LWJhY2tncm91bmQpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKGNhbGMoLTUwJSArIHZhcigtLW1lZGlhLXRvb2x0aXAtb2Zmc2V0LXgsIDBweCkpLCAwKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3BsYWNlbWVudD0icmlnaHQiXSkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiBjYWxjKDEwMCUgKyB2YXIoLS1tZWRpYS10b29sdGlwLWRpc3RhbmNlLCAxMnB4KSk7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTUwJSk7CiAgICAgIH0KICAgICAgOmhvc3QoW3BsYWNlbWVudD0icmlnaHQiXSkgI2Fycm93IHsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICByaWdodDogMTAwJTsKICAgICAgICBib3JkZXItd2lkdGg6IHZhcigtLV90b29sdGlwLWFycm93LWhhbGYtd2lkdGgpIHZhcigtLV90b29sdGlwLWFycm93LWhlaWdodCkgdmFyKC0tX3Rvb2x0aXAtYXJyb3ctaGFsZi13aWR0aCkgMDsKICAgICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHZhcigtLV90b29sdGlwLWFycm93LWJhY2tncm91bmQpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC01MCUpOwogICAgICB9CgogICAgICA6aG9zdChbcGxhY2VtZW50PSJib3R0b20iXSkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGNhbGMoMTAwJSArIHZhcigtLW1lZGlhLXRvb2x0aXAtZGlzdGFuY2UsIDEycHgpKTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoY2FsYygtNTAlIC0gdmFyKC0tbWVkaWEtdG9vbHRpcC1vZmZzZXQteCwgMHB4KSksIDApOwogICAgICB9CiAgICAgIDpob3N0KFtwbGFjZW1lbnQ9ImJvdHRvbSJdKSAjYXJyb3cgewogICAgICAgIGJvdHRvbTogMTAwJTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgYm9yZGVyLXdpZHRoOiAwIHZhcigtLV90b29sdGlwLWFycm93LWhhbGYtd2lkdGgpIHZhcigtLV90b29sdGlwLWFycm93LWhlaWdodCkgdmFyKC0tX3Rvb2x0aXAtYXJyb3ctaGFsZi13aWR0aCk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB2YXIoLS1fdG9vbHRpcC1hcnJvdy1iYWNrZ3JvdW5kKSB0cmFuc3BhcmVudDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZShjYWxjKC01MCUgKyB2YXIoLS1tZWRpYS10b29sdGlwLW9mZnNldC14LCAwcHgpKSwgMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtwbGFjZW1lbnQ9ImxlZnQiXSkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogY2FsYygxMDAlICsgdmFyKC0tbWVkaWEtdG9vbHRpcC1kaXN0YW5jZSwgMTJweCkpOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC01MCUpOwogICAgICB9CiAgICAgIDpob3N0KFtwbGFjZW1lbnQ9ImxlZnQiXSkgI2Fycm93IHsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICBsZWZ0OiAxMDAlOwogICAgICAgIGJvcmRlci13aWR0aDogdmFyKC0tX3Rvb2x0aXAtYXJyb3ctaGFsZi13aWR0aCkgMCB2YXIoLS1fdG9vbHRpcC1hcnJvdy1oYWxmLXdpZHRoKSB2YXIoLS1fdG9vbHRpcC1hcnJvdy1oZWlnaHQpOwogICAgICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdmFyKC0tX3Rvb2x0aXAtYXJyb3ctYmFja2dyb3VuZCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTUwJSk7CiAgICAgIH0KICAgICAgCiAgICAgIDpob3N0KFtwbGFjZW1lbnQ9Im5vbmUiXSkgI2Fycm93IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogICAgPGRpdiBpZD0iYXJyb3ciPjwvZGl2PgogIGB9dmFyIFB0PWNsYXNzIGV4dGVuZHMgbC5IVE1MRWxlbWVudHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksdGhpcy51cGRhdGVYT2Zmc2V0PSgpPT57dmFyIGU7aWYoIWlhKHRoaXMse2NoZWNrT3BhY2l0eTohMSxjaGVja1Zpc2liaWxpdHlDU1M6ITF9KSlyZXR1cm47bGV0IGk9dGhpcy5wbGFjZW1lbnQ7aWYoaT09PSJsZWZ0Inx8aT09PSJyaWdodCIpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoIi0tbWVkaWEtdG9vbHRpcC1vZmZzZXQteCIpO3JldHVybn1sZXQgYT1nZXRDb21wdXRlZFN0eWxlKHRoaXMpLHI9KGU9VGUodGhpcywiIyIrdGhpcy5ib3VuZHMpKSE9bnVsbD9lOktlKHRoaXMpO2lmKCFyKXJldHVybjtsZXR7eDpzLHdpZHRoOm99PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse3g6ZCx3aWR0aDp1fT10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLF89ZCt1LFQ9cytvLEE9YS5nZXRQcm9wZXJ0eVZhbHVlKCItLW1lZGlhLXRvb2x0aXAtb2Zmc2V0LXgiKSx2PUE/cGFyc2VGbG9hdChBLnJlcGxhY2UoInB4IiwiIikpOjAsbT1hLmdldFByb3BlcnR5VmFsdWUoIi0tbWVkaWEtdG9vbHRpcC1jb250YWluZXItbWFyZ2luIiksYj1tP3BhcnNlRmxvYXQobS5yZXBsYWNlKCJweCIsIiIpKTowLEU9ZC1zK3YtYixJPV8tVCt2K2I7aWYoRTwwKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KCItLW1lZGlhLXRvb2x0aXAtb2Zmc2V0LXgiLGAke0V9cHhgKTtyZXR1cm59aWYoST4wKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KCItLW1lZGlhLXRvb2x0aXAtb2Zmc2V0LXgiLGAke0l9cHhgKTtyZXR1cm59dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiLS1tZWRpYS10b29sdGlwLW9mZnNldC14Iil9LCF0aGlzLnNoYWRvd1Jvb3Qpe3RoaXMuYXR0YWNoU2hhZG93KHRoaXMuY29uc3RydWN0b3Iuc2hhZG93Um9vdE9wdGlvbnMpO2xldCBlPUcodGhpcy5hdHRyaWJ1dGVzKTt0aGlzLnNoYWRvd1Jvb3QuaW5uZXJIVE1MPXRoaXMuY29uc3RydWN0b3IuZ2V0VGVtcGxhdGVIVE1MKGUpfWlmKHRoaXMuYXJyb3dFbD10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiI2Fycm93IiksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsInBsYWNlbWVudCIpKXtsZXQgZT10aGlzLnBsYWNlbWVudDtkZWxldGUgdGhpcy5wbGFjZW1lbnQsdGhpcy5wbGFjZW1lbnQ9ZX19c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bT3QuUExBQ0VNRU5ULE90LkJPVU5EU119Z2V0IHBsYWNlbWVudCgpe3JldHVybiBPKHRoaXMsT3QuUExBQ0VNRU5UKX1zZXQgcGxhY2VtZW50KGUpe1UodGhpcyxPdC5QTEFDRU1FTlQsZSl9Z2V0IGJvdW5kcygpe3JldHVybiBPKHRoaXMsT3QuQk9VTkRTKX1zZXQgYm91bmRzKGUpe1UodGhpcyxPdC5CT1VORFMsZSl9fTtQdC5zaGFkb3dSb290T3B0aW9ucz17bW9kZToib3BlbiJ9O1B0LmdldFRlbXBsYXRlSFRNTD1vZDtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtdG9vbHRpcCIpfHxsLmN1c3RvbUVsZW1lbnRzLmRlZmluZSgibWVkaWEtdG9vbHRpcCIsUHQpO3ZhciBxcj1QdDt2YXIgUXI9KHQsZSxpKT0+e2lmKCFlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCAiK2kpfSxxPSh0LGUsaSk9PihRcih0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLE50PSh0LGUsaSk9PntpZihlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtlIGluc3RhbmNlb2YgV2Vha1NldD9lLmFkZCh0KTplLnNldCh0LGkpfSxUYT0odCxlLGksYSk9PihRcih0LGUsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxhP2EuY2FsbCh0LGkpOmUuc2V0KHQsaSksaSksbGQ9KHQsZSxpKT0+KFFyKHQsZSwiYWNjZXNzIHByaXZhdGUgbWV0aG9kIiksaSkseWUsSHQsUWUsRnQsU2EsWXIsQW8sWWU9e1RPT0xUSVBfUExBQ0VNRU5UOiJ0b29sdGlwcGxhY2VtZW50IixESVNBQkxFRDoiZGlzYWJsZWQiLE5PX1RPT0xUSVA6Im5vdG9vbHRpcCJ9O2Z1bmN0aW9uIGRkKHQsZT17fSl7cmV0dXJuYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZvbnQ6IHZhcigtLW1lZGlhLWZvbnQsCiAgICAgICAgICB2YXIoLS1tZWRpYS1mb250LXdlaWdodCwgYm9sZCkKICAgICAgICAgIHZhcigtLW1lZGlhLWZvbnQtc2l6ZSwgMTRweCkgLwogICAgICAgICAgdmFyKC0tbWVkaWEtdGV4dC1jb250ZW50LWhlaWdodCwgdmFyKC0tbWVkaWEtY29udHJvbC1oZWlnaHQsIDI0cHgpKQogICAgICAgICAgdmFyKC0tbWVkaWEtZm9udC1mYW1pbHksIGhlbHZldGljYSBuZXVlLCBzZWdvZSB1aSwgcm9ib3RvLCBhcmlhbCwgc2Fucy1zZXJpZikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1tZWRpYS10ZXh0LWNvbG9yLCB2YXIoLS1tZWRpYS1wcmltYXJ5LWNvbG9yLCByZ2IoMjM4IDIzOCAyMzgpKSk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtY29udHJvbC1iYWNrZ3JvdW5kLCB2YXIoLS1tZWRpYS1zZWNvbmRhcnktY29sb3IsIHJnYigyMCAyMCAzMCAvIC43KSkpOwogICAgICAgIHBhZGRpbmc6IHZhcigtLW1lZGlhLWJ1dHRvbi1wYWRkaW5nLCB2YXIoLS1tZWRpYS1jb250cm9sLXBhZGRpbmcsIDEwcHgpKTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHZhcigtLW1lZGlhLWJ1dHRvbi1qdXN0aWZ5LWNvbnRlbnQsIGNlbnRlcik7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAuMTVzIGxpbmVhcjsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICBjdXJzb3I6IHZhcigtLW1lZGlhLWN1cnNvciwgcG9pbnRlcik7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgCiAgICAgIDpob3N0KDpmb2N1cy12aXNpYmxlKSB7CiAgICAgICAgYm94LXNoYWRvdzogdmFyKC0tbWVkaWEtZm9jdXMtYm94LXNoYWRvdywgaW5zZXQgMCAwIDAgMnB4IHJnYigyNyAxMjcgMjA0IC8gLjkpKTsKICAgICAgICBvdXRsaW5lOiAwOwogICAgICB9CiAgICAgIAogICAgICA6aG9zdCg6d2hlcmUoOmZvY3VzKSkgewogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgICAgb3V0bGluZTogMDsKICAgICAgfQoKICAgICAgOmhvc3QoOmhvdmVyKSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtY29udHJvbC1ob3Zlci1iYWNrZ3JvdW5kLCByZ2JhKDUwIDUwIDcwIC8gLjcpKTsKICAgICAgfQoKICAgICAgc2xvdFtuYW1lPSJpY29uIl0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIHN2ZywgaW1nLCA6OnNsb3R0ZWQoc3ZnKSwgOjpzbG90dGVkKGltZykgewogICAgICAgIHdpZHRoOiB2YXIoLS1tZWRpYS1idXR0b24taWNvbi13aWR0aCk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1tZWRpYS1idXR0b24taWNvbi1oZWlnaHQsIHZhcigtLW1lZGlhLWNvbnRyb2wtaGVpZ2h0LCAyNHB4KSk7CiAgICAgICAgdHJhbnNmb3JtOiB2YXIoLS1tZWRpYS1idXR0b24taWNvbi10cmFuc2Zvcm0pOwogICAgICAgIHRyYW5zaXRpb246IHZhcigtLW1lZGlhLWJ1dHRvbi1pY29uLXRyYW5zaXRpb24pOwogICAgICAgIGZpbGw6IHZhcigtLW1lZGlhLWljb24tY29sb3IsIHZhcigtLW1lZGlhLXByaW1hcnktY29sb3IsIHJnYigyMzggMjM4IDIzOCkpKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgbWVkaWEtdG9vbHRpcCB7CiAgICAgICAgCiAgICAgICAgbWF4LXdpZHRoOiAwOwogICAgICAgIG92ZXJmbG93LXg6IGNsaXA7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4zcywgbWF4LXdpZHRoIDBzIDlzOwogICAgICB9CgogICAgICA6aG9zdCg6aG92ZXIpIG1lZGlhLXRvb2x0aXAsCiAgICAgIDpob3N0KDpmb2N1cy12aXNpYmxlKSBtZWRpYS10b29sdGlwIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3M7CiAgICAgIH0KCiAgICAgIDpob3N0KFtub3Rvb2x0aXBdKSBzbG90W25hbWU9InRvb2x0aXAiXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICAke3RoaXMuZ2V0U2xvdFRlbXBsYXRlSFRNTCh0LGUpfQoKICAgIDxzbG90IG5hbWU9InRvb2x0aXAiPgogICAgICA8bWVkaWEtdG9vbHRpcCBwYXJ0PSJ0b29sdGlwIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgPHRlbXBsYXRlIHNoYWRvd3Jvb3Rtb2RlPSIke3FyLnNoYWRvd1Jvb3RPcHRpb25zLm1vZGV9Ij4KICAgICAgICAgICR7cXIuZ2V0VGVtcGxhdGVIVE1MKHt9KX0KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxzbG90IG5hbWU9InRvb2x0aXAtY29udGVudCI+CiAgICAgICAgICAke3RoaXMuZ2V0VG9vbHRpcENvbnRlbnRIVE1MKHQpfQogICAgICAgIDwvc2xvdD4KICAgICAgPC9tZWRpYS10b29sdGlwPgogICAgPC9zbG90PgogIGB9ZnVuY3Rpb24gdWQodCxlKXtyZXR1cm5gCiAgICA8c2xvdD48L3Nsb3Q+CiAgYH1mdW5jdGlvbiBjZCgpe3JldHVybiIifXZhciBXPWNsYXNzIGV4dGVuZHMgbC5IVE1MRWxlbWVudHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksTnQodGhpcyxZciksTnQodGhpcyx5ZSx2b2lkIDApLHRoaXMucHJldmVudENsaWNrPSExLHRoaXMudG9vbHRpcEVsPW51bGwsTnQodGhpcyxIdCxlPT57dGhpcy5wcmV2ZW50Q2xpY2t8fHRoaXMuaGFuZGxlQ2xpY2soZSksc2V0VGltZW91dChxKHRoaXMsUWUpLDApfSksTnQodGhpcyxRZSwoKT0+e3ZhciBlLGk7KGk9KGU9dGhpcy50b29sdGlwRWwpPT1udWxsP3ZvaWQgMDplLnVwZGF0ZVhPZmZzZXQpPT1udWxsfHxpLmNhbGwoZSl9KSxOdCh0aGlzLEZ0LGU9PntsZXR7a2V5Oml9PWU7aWYoIXRoaXMua2V5c1VzZWQuaW5jbHVkZXMoaSkpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLHEodGhpcyxGdCkpO3JldHVybn10aGlzLnByZXZlbnRDbGlja3x8dGhpcy5oYW5kbGVDbGljayhlKX0pLE50KHRoaXMsU2EsZT0+e2xldHttZXRhS2V5OmksYWx0S2V5OmEsa2V5OnJ9PWU7aWYoaXx8YXx8IXRoaXMua2V5c1VzZWQuaW5jbHVkZXMocikpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLHEodGhpcyxGdCkpO3JldHVybn10aGlzLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixxKHRoaXMsRnQpLHtvbmNlOiEwfSl9KSwhdGhpcy5zaGFkb3dSb290KXt0aGlzLmF0dGFjaFNoYWRvdyh0aGlzLmNvbnN0cnVjdG9yLnNoYWRvd1Jvb3RPcHRpb25zKTtsZXQgZT1HKHRoaXMuYXR0cmlidXRlcyksaT10aGlzLmNvbnN0cnVjdG9yLmdldFRlbXBsYXRlSFRNTChlKTt0aGlzLnNoYWRvd1Jvb3Quc2V0SFRNTFVuc2FmZT90aGlzLnNoYWRvd1Jvb3Quc2V0SFRNTFVuc2FmZShpKTp0aGlzLnNoYWRvd1Jvb3QuaW5uZXJIVE1MPWl9dGhpcy50b29sdGlwRWw9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIm1lZGlhLXRvb2x0aXAiKX1zdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVyblsiZGlzYWJsZWQiLFllLlRPT0xUSVBfUExBQ0VNRU5ULHcuTUVESUFfQ09OVFJPTExFUixuLk1FRElBX0xBTkddfWVuYWJsZSgpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHEodGhpcyxIdCkpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIscSh0aGlzLFNhKSksdGhpcy50YWJJbmRleD0wfWRpc2FibGUoKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixxKHRoaXMsSHQpKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHEodGhpcyxTYSkpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLHEodGhpcyxGdCkpLHRoaXMudGFiSW5kZXg9LTF9YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKXt2YXIgcixzLG8sZCx1O2U9PT13Lk1FRElBX0NPTlRST0xMRVI/KGkmJigocz0ocj1xKHRoaXMseWUpKT09bnVsbD92b2lkIDA6ci51bmFzc29jaWF0ZUVsZW1lbnQpPT1udWxsfHxzLmNhbGwocix0aGlzKSxUYSh0aGlzLHllLG51bGwpKSxhJiZ0aGlzLmlzQ29ubmVjdGVkJiYoVGEodGhpcyx5ZSwobz10aGlzLmdldFJvb3ROb2RlKCkpPT1udWxsP3ZvaWQgMDpvLmdldEVsZW1lbnRCeUlkKGEpKSwodT0oZD1xKHRoaXMseWUpKT09bnVsbD92b2lkIDA6ZC5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8dS5jYWxsKGQsdGhpcykpKTplPT09ImRpc2FibGVkIiYmYSE9PWk/YT09bnVsbD90aGlzLmVuYWJsZSgpOnRoaXMuZGlzYWJsZSgpOmU9PT1ZZS5UT09MVElQX1BMQUNFTUVOVCYmdGhpcy50b29sdGlwRWwmJmEhPT1pP3RoaXMudG9vbHRpcEVsLnBsYWNlbWVudD1hOmU9PT1uLk1FRElBX0xBTkcmJih0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc2xvdFtuYW1lPSJ0b29sdGlwLWNvbnRlbnQiXScpLmlubmVySFRNTD10aGlzLmNvbnN0cnVjdG9yLmdldFRvb2x0aXBDb250ZW50SFRNTCgpKSxxKHRoaXMsUWUpLmNhbGwodGhpcyl9Y29ubmVjdGVkQ2FsbGJhY2soKXt2YXIgZSxpLGE7bGV0e3N0eWxlOnJ9PUIodGhpcy5zaGFkb3dSb290LCI6aG9zdCIpO3Iuc2V0UHJvcGVydHkoImRpc3BsYXkiLGB2YXIoLS1tZWRpYS1jb250cm9sLWRpc3BsYXksIHZhcigtLSR7dGhpcy5sb2NhbE5hbWV9LWRpc3BsYXksIGlubGluZS1mbGV4KSlgKSx0aGlzLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKT90aGlzLmRpc2FibGUoKTp0aGlzLmVuYWJsZSgpLHRoaXMuc2V0QXR0cmlidXRlKCJyb2xlIiwiYnV0dG9uIik7bGV0IHM9dGhpcy5nZXRBdHRyaWJ1dGUody5NRURJQV9DT05UUk9MTEVSKTtzJiYoVGEodGhpcyx5ZSwoZT10aGlzLmdldFJvb3ROb2RlKCkpPT1udWxsP3ZvaWQgMDplLmdldEVsZW1lbnRCeUlkKHMpKSwoYT0oaT1xKHRoaXMseWUpKT09bnVsbD92b2lkIDA6aS5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8YS5jYWxsKGksdGhpcykpLGwuY3VzdG9tRWxlbWVudHMud2hlbkRlZmluZWQoIm1lZGlhLXRvb2x0aXAiKS50aGVuKCgpPT5sZCh0aGlzLFlyLEFvKS5jYWxsKHRoaXMpKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3ZhciBlLGk7dGhpcy5kaXNhYmxlKCksKGk9KGU9cSh0aGlzLHllKSk9PW51bGw/dm9pZCAwOmUudW5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8aS5jYWxsKGUsdGhpcyksVGEodGhpcyx5ZSxudWxsKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHEodGhpcyxRZSkpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHEodGhpcyxRZSkpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHEodGhpcyxIdCkpfWdldCBrZXlzVXNlZCgpe3JldHVyblsiRW50ZXIiLCIgIl19Z2V0IHRvb2x0aXBQbGFjZW1lbnQoKXtyZXR1cm4gTyh0aGlzLFllLlRPT0xUSVBfUExBQ0VNRU5UKX1zZXQgdG9vbHRpcFBsYWNlbWVudChlKXtVKHRoaXMsWWUuVE9PTFRJUF9QTEFDRU1FTlQsZSl9Z2V0IG1lZGlhQ29udHJvbGxlcigpe3JldHVybiBPKHRoaXMsdy5NRURJQV9DT05UUk9MTEVSKX1zZXQgbWVkaWFDb250cm9sbGVyKGUpe1UodGhpcyx3Lk1FRElBX0NPTlRST0xMRVIsZSl9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIGsodGhpcyxZZS5ESVNBQkxFRCl9c2V0IGRpc2FibGVkKGUpe3kodGhpcyxZZS5ESVNBQkxFRCxlKX1nZXQgbm9Ub29sdGlwKCl7cmV0dXJuIGsodGhpcyxZZS5OT19UT09MVElQKX1zZXQgbm9Ub29sdGlwKGUpe3kodGhpcyxZZS5OT19UT09MVElQLGUpfWhhbmRsZUNsaWNrKGUpe319O3llPW5ldyBXZWFrTWFwO0h0PW5ldyBXZWFrTWFwO1FlPW5ldyBXZWFrTWFwO0Z0PW5ldyBXZWFrTWFwO1NhPW5ldyBXZWFrTWFwO1lyPW5ldyBXZWFrU2V0O0FvPWZ1bmN0aW9uKCl7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixxKHRoaXMsUWUpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIixxKHRoaXMsUWUpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixxKHRoaXMsSHQpKTtsZXQgdD10aGlzLnRvb2x0aXBQbGFjZW1lbnQ7dCYmdGhpcy50b29sdGlwRWwmJih0aGlzLnRvb2x0aXBFbC5wbGFjZW1lbnQ9dCl9O1cuc2hhZG93Um9vdE9wdGlvbnM9e21vZGU6Im9wZW4ifTtXLmdldFRlbXBsYXRlSFRNTD1kZDtXLmdldFNsb3RUZW1wbGF0ZUhUTUw9dWQ7Vy5nZXRUb29sdGlwQ29udGVudEhUTUw9Y2Q7bC5jdXN0b21FbGVtZW50cy5nZXQoIm1lZGlhLWNocm9tZS1idXR0b24iKXx8bC5jdXN0b21FbGVtZW50cy5kZWZpbmUoIm1lZGlhLWNocm9tZS1idXR0b24iLFcpO3ZhciBoZD1gPHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBkPSJtNiAyMSAxNS05TDYgM3YxOFoiLz4KPC9zdmc+YCxtZD1gPHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBkPSJNNiAyMGg0VjRINnYxNlptOC0xNnYxNmg0VjRoLTRaIi8+Cjwvc3ZnPmA7ZnVuY3Rpb24gcGQodCl7cmV0dXJuYAogICAgPHN0eWxlPgogICAgICA6aG9zdChbJHtuLk1FRElBX1BBVVNFRH1dKSBzbG90W25hbWU9cGF1c2VdLAogICAgICA6aG9zdCg6bm90KFske24uTUVESUFfUEFVU0VEfV0pKSBzbG90W25hbWU9cGxheV0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoWyR7bi5NRURJQV9QQVVTRUR9XSkgc2xvdFtuYW1lPXRvb2x0aXAtcGF1c2VdLAogICAgICA6aG9zdCg6bm90KFske24uTUVESUFfUEFVU0VEfV0pKSBzbG90W25hbWU9dG9vbHRpcC1wbGF5XSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBuYW1lPSJpY29uIj4KICAgICAgPHNsb3QgbmFtZT0icGxheSI+JHtoZH08L3Nsb3Q+CiAgICAgIDxzbG90IG5hbWU9InBhdXNlIj4ke21kfTwvc2xvdD4KICAgIDwvc2xvdD4KICBgfWZ1bmN0aW9uIEVkKCl7cmV0dXJuYAogICAgPHNsb3QgbmFtZT0idG9vbHRpcC1wbGF5Ij4ke2YoIlBsYXkiKX08L3Nsb3Q+CiAgICA8c2xvdCBuYW1lPSJ0b29sdGlwLXBhdXNlIj4ke2YoIlBhdXNlIil9PC9zbG90PgogIGB9dmFyIFRvPXQ9PntsZXQgZT10Lm1lZGlhUGF1c2VkP2YoInBsYXkiKTpmKCJwYXVzZSIpO3Quc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixlKX0sQWk9Y2xhc3MgZXh0ZW5kcyBXe3N0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuWy4uLnN1cGVyLm9ic2VydmVkQXR0cmlidXRlcyxuLk1FRElBX1BBVVNFRCxuLk1FRElBX0VOREVEXX1jb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksVG8odGhpcyl9YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKXtzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpLChlPT09bi5NRURJQV9QQVVTRUR8fGU9PT1uLk1FRElBX0xBTkcpJiZUbyh0aGlzKX1nZXQgbWVkaWFQYXVzZWQoKXtyZXR1cm4gayh0aGlzLG4uTUVESUFfUEFVU0VEKX1zZXQgbWVkaWFQYXVzZWQoZSl7eSh0aGlzLG4uTUVESUFfUEFVU0VELGUpfWhhbmRsZUNsaWNrKCl7bGV0IGU9dGhpcy5tZWRpYVBhdXNlZD9oLk1FRElBX1BMQVlfUkVRVUVTVDpoLk1FRElBX1BBVVNFX1JFUVVFU1Q7dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBsLkN1c3RvbUV2ZW50KGUse2NvbXBvc2VkOiEwLGJ1YmJsZXM6ITB9KSl9fTtBaS5nZXRTbG90VGVtcGxhdGVIVE1MPXBkO0FpLmdldFRvb2x0aXBDb250ZW50SFRNTD1FZDtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtcGxheS1idXR0b24iKXx8bC5jdXN0b21FbGVtZW50cy5kZWZpbmUoIm1lZGlhLXBsYXktYnV0dG9uIixBaSk7dmFyIEJ0PXtTRUVLX09GRlNFVDoic2Vla29mZnNldCJ9LHpyPTMwLHZkPXQ9PmAKICA8c3ZnIGFyaWEtaGlkZGVuPSJ0cnVlIiB2aWV3Qm94PSIwIDAgMjAgMjQiPgogICAgPGRlZnM+CiAgICAgIDxzdHlsZT4udGV4dHtmb250LXNpemU6OHB4O2ZvbnQtZmFtaWx5OkFyaWFsLUJvbGRNVCwgQXJpYWw7Zm9udC13ZWlnaHQ6NzAwO308L3N0eWxlPgogICAgPC9kZWZzPgogICAgPHRleHQgY2xhc3M9InRleHQgdmFsdWUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuMTggMTkuODcpIj4ke3R9PC90ZXh0PgogICAgPHBhdGggZD0iTTEwIDZWM0w0LjM3IDcgMTAgMTAuOTRWOGE1LjU0IDUuNTQgMCAwIDEgMS45IDEwLjQ4djIuMTJBNy41IDcuNSAwIDAgMCAxMCA2WiIvPgogIDwvc3ZnPmA7ZnVuY3Rpb24gZmQodCxlKXtyZXR1cm5gCiAgICA8c2xvdCBuYW1lPSJpY29uIj4ke3ZkKGUuc2Vla09mZnNldCl9PC9zbG90PgogIGB9dmFyIGdkPSh0LGUpPT57dC5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGYoInNlZWsgYmFjayB7c2Vla09mZnNldH0gc2Vjb25kcyIse3NlZWtPZmZzZXQ6ZX0pKX07ZnVuY3Rpb24gX2QoKXtyZXR1cm4gZigiU2VlayBiYWNrd2FyZCIpfXZhciBiZD0wLFRpPWNsYXNzIGV4dGVuZHMgV3tzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVyblsuLi5zdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMsbi5NRURJQV9DVVJSRU5UX1RJTUUsQnQuU0VFS19PRkZTRVRdfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLnNlZWtPZmZzZXQ9RCh0aGlzLEJ0LlNFRUtfT0ZGU0VULHpyKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpe3N1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSksZ2QodGhpcyx0aGlzLnNlZWtPZmZzZXQpLGU9PT1CdC5TRUVLX09GRlNFVCYmKHRoaXMuc2Vla09mZnNldD1EKHRoaXMsQnQuU0VFS19PRkZTRVQsenIpKX1nZXQgc2Vla09mZnNldCgpe3JldHVybiBEKHRoaXMsQnQuU0VFS19PRkZTRVQsenIpfXNldCBzZWVrT2Zmc2V0KGUpe0godGhpcyxCdC5TRUVLX09GRlNFVCxlKSx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsZigic2VlayBiYWNrIHtzZWVrT2Zmc2V0fSBzZWNvbmRzIix7c2Vla09mZnNldDp0aGlzLnNlZWtPZmZzZXR9KSksZWEodGEodGhpcywiaWNvbiIpLHRoaXMuc2Vla09mZnNldCl9Z2V0IG1lZGlhQ3VycmVudFRpbWUoKXtyZXR1cm4gRCh0aGlzLG4uTUVESUFfQ1VSUkVOVF9USU1FLGJkKX1zZXQgbWVkaWFDdXJyZW50VGltZShlKXtIKHRoaXMsbi5NRURJQV9DVVJSRU5UX1RJTUUsZSl9aGFuZGxlQ2xpY2soKXtsZXQgZT1NYXRoLm1heCh0aGlzLm1lZGlhQ3VycmVudFRpbWUtdGhpcy5zZWVrT2Zmc2V0LDApLGk9bmV3IGwuQ3VzdG9tRXZlbnQoaC5NRURJQV9TRUVLX1JFUVVFU1Qse2NvbXBvc2VkOiEwLGJ1YmJsZXM6ITAsZGV0YWlsOmV9KTt0aGlzLmRpc3BhdGNoRXZlbnQoaSl9fTtUaS5nZXRTbG90VGVtcGxhdGVIVE1MPWZkO1RpLmdldFRvb2x0aXBDb250ZW50SFRNTD1fZDtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtc2Vlay1iYWNrd2FyZC1idXR0b24iKXx8bC5jdXN0b21FbGVtZW50cy5kZWZpbmUoIm1lZGlhLXNlZWstYmFja3dhcmQtYnV0dG9uIixUaSk7dmFyIFd0PXtTRUVLX09GRlNFVDoic2Vla29mZnNldCJ9LFpyPTMwLEFkPXQ9PmAKICA8c3ZnIGFyaWEtaGlkZGVuPSJ0cnVlIiB2aWV3Qm94PSIwIDAgMjAgMjQiPgogICAgPGRlZnM+CiAgICAgIDxzdHlsZT4udGV4dHtmb250LXNpemU6OHB4O2ZvbnQtZmFtaWx5OkFyaWFsLUJvbGRNVCwgQXJpYWw7Zm9udC13ZWlnaHQ6NzAwO308L3N0eWxlPgogICAgPC9kZWZzPgogICAgPHRleHQgY2xhc3M9InRleHQgdmFsdWUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDguOSAxOS44NykiPiR7dH08L3RleHQ+CiAgICA8cGF0aCBkPSJNMTAgNlYzbDUuNjEgNEwxMCAxMC45NFY4YTUuNTQgNS41NCAwIDAgMC0xLjkgMTAuNDh2Mi4xMkE3LjUgNy41IDAgMCAxIDEwIDZaIi8+CiAgPC9zdmc+YDtmdW5jdGlvbiBUZCh0LGUpe3JldHVybmAKICAgIDxzbG90IG5hbWU9Imljb24iPiR7QWQoZS5zZWVrT2Zmc2V0KX08L3Nsb3Q+CiAgYH12YXIgU2Q9KHQsZSk9Pnt0LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsZigic2VlayBmb3J3YXJkIHtzZWVrT2Zmc2V0fSBzZWNvbmRzIix7c2Vla09mZnNldDplfSkpfTtmdW5jdGlvbiBJZCgpe3JldHVybiBmKCJTZWVrIGZvcndhcmQiKX12YXIga2Q9MCxTaT1jbGFzcyBleHRlbmRzIFd7c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLG4uTUVESUFfQ1VSUkVOVF9USU1FLFd0LlNFRUtfT0ZGU0VUXX1jb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5zZWVrT2Zmc2V0PUQodGhpcyxXdC5TRUVLX09GRlNFVCxacil9YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKXtzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpLFNkKHRoaXMsdGhpcy5zZWVrT2Zmc2V0KSxlPT09V3QuU0VFS19PRkZTRVQmJih0aGlzLnNlZWtPZmZzZXQ9RCh0aGlzLFd0LlNFRUtfT0ZGU0VULFpyKSl9Z2V0IHNlZWtPZmZzZXQoKXtyZXR1cm4gRCh0aGlzLFd0LlNFRUtfT0ZGU0VULFpyKX1zZXQgc2Vla09mZnNldChlKXtIKHRoaXMsV3QuU0VFS19PRkZTRVQsZSksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGYoInNlZWsgZm9yd2FyZCB7c2Vla09mZnNldH0gc2Vjb25kcyIse3NlZWtPZmZzZXQ6dGhpcy5zZWVrT2Zmc2V0fSkpLGVhKHRhKHRoaXMsImljb24iKSx0aGlzLnNlZWtPZmZzZXQpfWdldCBtZWRpYUN1cnJlbnRUaW1lKCl7cmV0dXJuIEQodGhpcyxuLk1FRElBX0NVUlJFTlRfVElNRSxrZCl9c2V0IG1lZGlhQ3VycmVudFRpbWUoZSl7SCh0aGlzLG4uTUVESUFfQ1VSUkVOVF9USU1FLGUpfWhhbmRsZUNsaWNrKCl7bGV0IGU9dGhpcy5tZWRpYUN1cnJlbnRUaW1lK3RoaXMuc2Vla09mZnNldCxpPW5ldyBsLkN1c3RvbUV2ZW50KGguTUVESUFfU0VFS19SRVFVRVNULHtjb21wb3NlZDohMCxidWJibGVzOiEwLGRldGFpbDplfSk7dGhpcy5kaXNwYXRjaEV2ZW50KGkpfX07U2kuZ2V0U2xvdFRlbXBsYXRlSFRNTD1UZDtTaS5nZXRUb29sdGlwQ29udGVudEhUTUw9SWQ7bC5jdXN0b21FbGVtZW50cy5nZXQoIm1lZGlhLXNlZWstZm9yd2FyZC1idXR0b24iKXx8bC5jdXN0b21FbGVtZW50cy5kZWZpbmUoIm1lZGlhLXNlZWstZm9yd2FyZC1idXR0b24iLFNpKTt2YXIgYXM9KHQsZSxpKT0+e2lmKCFlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCAiK2kpfSwkPSh0LGUsaSk9Pihhcyh0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLEo9KHQsZSxpKT0+e2lmKGUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO2UgaW5zdGFuY2VvZiBXZWFrU2V0P2UuYWRkKHQpOmUuc2V0KHQsaSl9LHplPSh0LGUsaSxhKT0+KGFzKHQsZSwid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZCIpLGE/YS5jYWxsKHQsaSk6ZS5zZXQodCxpKSxpKSxfZT0odCxlLGkpPT4oYXModCxlLCJhY2Nlc3MgcHJpdmF0ZSBtZXRob2QiKSxpKSx3ZSx4YSxJYSxrYSxiZSxEYSx5YSx3YSxNYSxycyxTbyxMYSxYcixSYSxKcixDYSxzcyxqcixJbyxlcyxrbyx0cyx5byxpcyx3bztmdW5jdGlvbiB5ZCh0KXtyZXR1cm5gCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtLV9mb2N1cy1ib3gtc2hhZG93OiB2YXIoLS1tZWRpYS1mb2N1cy1ib3gtc2hhZG93LCBpbnNldCAwIDAgMCAycHggcmdiKDI3IDEyNyAyMDQgLyAuOSkpOwogICAgICAgIC0tX21lZGlhLXJhbmdlLXBhZGRpbmc6IHZhcigtLW1lZGlhLXJhbmdlLXBhZGRpbmcsIHZhcigtLW1lZGlhLWNvbnRyb2wtcGFkZGluZywgMTBweCkpOwoKICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1fZm9jdXMtdmlzaWJsZS1ib3gtc2hhZG93LCBub25lKTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZWRpYS1jb250cm9sLWJhY2tncm91bmQsIHZhcigtLW1lZGlhLXNlY29uZGFyeS1jb2xvciwgcmdiKDIwIDIwIDMwIC8gLjcpKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLW1lZGlhLWNvbnRyb2wtaGVpZ2h0LCAyNHB4KSArIDIgKiB2YXIoLS1fbWVkaWEtcmFuZ2UtcGFkZGluZykpOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgCiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAuMTVzIGxpbmVhcjsKICAgICAgICBjdXJzb3I6IHZhcigtLW1lZGlhLWN1cnNvciwgcG9pbnRlcik7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgdG91Y2gtYWN0aW9uOiBub25lOyAKICAgICAgfQoKICAgICAgCiAgICAgIGlucHV0W3R5cGU9cmFuZ2VdOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiAwOwogICAgICB9CiAgICAgIGlucHV0W3R5cGU9cmFuZ2VdOmZvY3VzOjotd2Via2l0LXNsaWRlci1ydW5uYWJsZS10cmFjayB7CiAgICAgICAgb3V0bGluZTogMDsKICAgICAgfQoKICAgICAgOmhvc3QoOmhvdmVyKSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtY29udHJvbC1ob3Zlci1iYWNrZ3JvdW5kLCByZ2IoNTAgNTAgNzAgLyAuNykpOwogICAgICB9CgogICAgICAjbGVmdGdhcCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1tZWRpYS1yYW5nZS1wYWRkaW5nLWxlZnQsIHZhcigtLV9tZWRpYS1yYW5nZS1wYWRkaW5nKSk7CiAgICAgIH0KCiAgICAgICNyaWdodGdhcCB7CiAgICAgICAgcGFkZGluZy1yaWdodDogdmFyKC0tbWVkaWEtcmFuZ2UtcGFkZGluZy1yaWdodCwgdmFyKC0tX21lZGlhLXJhbmdlLXBhZGRpbmcpKTsKICAgICAgfQoKICAgICAgI3N0YXJ0cG9pbnQsCiAgICAgICNlbmRwb2ludCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjZW5kcG9pbnQgewogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAjY29udGFpbmVyIHsKICAgICAgICAKICAgICAgICB3aWR0aDogdmFyKC0tbWVkaWEtcmFuZ2UtdHJhY2std2lkdGgsIDEwMCUpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1lZGlhLXJhbmdlLXRyYWNrLXRyYW5zbGF0ZS14LCAwcHgpLCB2YXIoLS1tZWRpYS1yYW5nZS10cmFjay10cmFuc2xhdGUteSwgMHB4KSk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbWluLXdpZHRoOiA0MHB4OwogICAgICB9CgogICAgICAjcmFuZ2UgewogICAgICAgIAogICAgICAgIGRpc3BsYXk6IHZhcigtLW1lZGlhLXRpbWUtcmFuZ2UtaG92ZXItZGlzcGxheSwgYmxvY2spOwogICAgICAgIGJvdHRvbTogdmFyKC0tbWVkaWEtdGltZS1yYW5nZS1ob3Zlci1ib3R0b20sIDApOwogICAgICAgIGhlaWdodDogdmFyKC0tbWVkaWEtdGltZS1yYW5nZS1ob3Zlci1oZWlnaHQsIG1heCgxMDAlICwgMjVweCkpOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjdXJzb3I6IHZhcigtLW1lZGlhLWN1cnNvciwgcG9pbnRlcik7CgogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsgCiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgCiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIEBtZWRpYSAoaG92ZXI6IGhvdmVyKSB7CiAgICAgICAgI3JhbmdlIHsKICAgICAgICAgIGJvdHRvbTogdmFyKC0tbWVkaWEtdGltZS1yYW5nZS1ob3Zlci1ib3R0b20sIDApOwogICAgICAgICAgaGVpZ2h0OiB2YXIoLS1tZWRpYS10aW1lLXJhbmdlLWhvdmVyLWhlaWdodCwgbWF4KDEwMCUsIDIwcHgpKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIAogICAgICAKICAgICAgI3JhbmdlOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIHdpZHRoOiAuMXB4OwogICAgICAgIGhlaWdodDogLjFweDsKICAgICAgfQoKICAgICAgCiAgICAgICNyYW5nZTo6LW1vei1yYW5nZS10aHVtYiB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiB0cmFuc3BhcmVudDsKICAgICAgICB3aWR0aDogLjFweDsKICAgICAgICBoZWlnaHQ6IC4xcHg7CiAgICAgIH0KCiAgICAgICNhcHBlYXJhbmNlIHsKICAgICAgICBoZWlnaHQ6IHZhcigtLW1lZGlhLXJhbmdlLXRyYWNrLWhlaWdodCwgNHB4KTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIAogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgICN0cmFjayB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtcmFuZ2UtdHJhY2stYmFja2dyb3VuZCwgcmdiKDI1NSAyNTUgMjU1IC8gLjIpKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tZWRpYS1yYW5nZS10cmFjay1ib3JkZXItcmFkaXVzLCAxcHgpOwogICAgICAgIGJvcmRlcjogdmFyKC0tbWVkaWEtcmFuZ2UtdHJhY2stYm9yZGVyLCBub25lKTsKICAgICAgICBvdXRsaW5lOiB2YXIoLS1tZWRpYS1yYW5nZS10cmFjay1vdXRsaW5lKTsKICAgICAgICBvdXRsaW5lLW9mZnNldDogdmFyKC0tbWVkaWEtcmFuZ2UtdHJhY2stb3V0bGluZS1vZmZzZXQpOwogICAgICAgIGJhY2tkcm9wLWZpbHRlcjogdmFyKC0tbWVkaWEtcmFuZ2UtdHJhY2stYmFja2Ryb3AtZmlsdGVyKTsKICAgICAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogdmFyKC0tbWVkaWEtcmFuZ2UtdHJhY2stYmFja2Ryb3AtZmlsdGVyKTsKICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1tZWRpYS1yYW5nZS10cmFjay1ib3gtc2hhZG93LCBub25lKTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgICNwcm9ncmVzcywKICAgICAgI3BvaW50ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHdpZHRoOwogICAgICB9CgogICAgICAjcHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLW1lZGlhLXJhbmdlLWJhci1jb2xvciwgdmFyKC0tbWVkaWEtcHJpbWFyeS1jb2xvciwgcmdiKDIzOCAyMzggMjM4KSkpOwogICAgICAgIHRyYW5zaXRpb246IHZhcigtLW1lZGlhLXJhbmdlLXRyYWNrLXRyYW5zaXRpb24pOwogICAgICB9CgogICAgICAjcG9pbnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtcmFuZ2UtdHJhY2stcG9pbnRlci1iYWNrZ3JvdW5kKTsKICAgICAgICBib3JkZXItcmlnaHQ6IHZhcigtLW1lZGlhLXJhbmdlLXRyYWNrLXBvaW50ZXItYm9yZGVyLXJpZ2h0KTsKICAgICAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IC4yNXMsIG9wYWNpdHkgLjI1czsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgQG1lZGlhIChob3ZlcjogaG92ZXIpIHsKICAgICAgICA6aG9zdCg6aG92ZXIpICNwb2ludGVyIHsKICAgICAgICAgIHRyYW5zaXRpb246IHZpc2liaWxpdHkgLjVzLCBvcGFjaXR5IC41czsKICAgICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI3RodW1iLAogICAgICA6OnNsb3R0ZWQoW3Nsb3Q9dGh1bWJdKSB7CiAgICAgICAgd2lkdGg6IHZhcigtLW1lZGlhLXJhbmdlLXRodW1iLXdpZHRoLCAxMHB4KTsKICAgICAgICBoZWlnaHQ6IHZhcigtLW1lZGlhLXJhbmdlLXRodW1iLWhlaWdodCwgMTBweCk7CiAgICAgICAgdHJhbnNpdGlvbjogdmFyKC0tbWVkaWEtcmFuZ2UtdGh1bWItdHJhbnNpdGlvbik7CiAgICAgICAgdHJhbnNmb3JtOiB2YXIoLS1tZWRpYS1yYW5nZS10aHVtYi10cmFuc2Zvcm0sIG5vbmUpOwogICAgICAgIG9wYWNpdHk6IHZhcigtLW1lZGlhLXJhbmdlLXRodW1iLW9wYWNpdHksIDEpOwogICAgICAgIHRyYW5zbGF0ZTogLTUwJTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBjdXJzb3I6IHZhcigtLW1lZGlhLWN1cnNvciwgcG9pbnRlcik7CiAgICAgIH0KCiAgICAgICN0aHVtYiB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWVkaWEtcmFuZ2UtdGh1bWItYm9yZGVyLXJhZGl1cywgMTBweCk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtcmFuZ2UtdGh1bWItYmFja2dyb3VuZCwgdmFyKC0tbWVkaWEtcHJpbWFyeS1jb2xvciwgcmdiKDIzOCAyMzggMjM4KSkpOwogICAgICAgIGJveC1zaGFkb3c6IHZhcigtLW1lZGlhLXJhbmdlLXRodW1iLWJveC1zaGFkb3csIDFweCAxcHggMXB4IHRyYW5zcGFyZW50KTsKICAgICAgICBib3JkZXI6IHZhcigtLW1lZGlhLXJhbmdlLXRodW1iLWJvcmRlciwgbm9uZSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICN0aHVtYiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzc3NzsKICAgICAgfQoKICAgICAgLnNlZ21lbnRzICNhcHBlYXJhbmNlIHsKICAgICAgICBoZWlnaHQ6IHZhcigtLW1lZGlhLXJhbmdlLXNlZ21lbnQtaG92ZXItaGVpZ2h0LCA3cHgpOwogICAgICB9CgogICAgICAjdHJhY2sgewogICAgICAgIGNsaXAtcGF0aDogdXJsKCNzZWdtZW50cy1jbGlwcGluZyk7CiAgICAgIH0KCiAgICAgICNzZWdtZW50cyB7CiAgICAgICAgLS1zZWdtZW50cy1nYXA6IHZhcigtLW1lZGlhLXJhbmdlLXNlZ21lbnRzLWdhcCwgMnB4KTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjc2VnbWVudHMtY2xpcHBpbmcgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKHZhcigtLXNlZ21lbnRzLWdhcCkgLyAyKSk7CiAgICAgIH0KCiAgICAgICNzZWdtZW50cy1jbGlwcGluZzplbXB0eSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgI3NlZ21lbnRzLWNsaXBwaW5nIHJlY3QgewogICAgICAgIGhlaWdodDogdmFyKC0tbWVkaWEtcmFuZ2UtdHJhY2staGVpZ2h0LCA0cHgpOwogICAgICAgIHk6IGNhbGMoKHZhcigtLW1lZGlhLXJhbmdlLXNlZ21lbnQtaG92ZXItaGVpZ2h0LCA3cHgpIC0gdmFyKC0tbWVkaWEtcmFuZ2UtdHJhY2staGVpZ2h0LCA0cHgpKSAvIDIpOwogICAgICAgIHRyYW5zaXRpb246IHZhcigtLW1lZGlhLXJhbmdlLXNlZ21lbnQtdHJhbnNpdGlvbiwgdHJhbnNmb3JtIC4xcyBlYXNlLWluLW91dCk7CiAgICAgICAgdHJhbnNmb3JtOiB2YXIoLS1tZWRpYS1yYW5nZS1zZWdtZW50LXRyYW5zZm9ybSwgc2NhbGVZKDEpKTsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC8qIFZpc2libGUgbGFiZWwgZm9yIGFjY2Vzc2liaWxpdHkgLSBwb3NpdGlvbmVkIG9mZi1zY3JlZW4gYnV0IHRlY2huaWNhbGx5IHZpc2libGUgKEZpcmVmb3ggcmVxdWlyZXMgdmlzaWJsZSBsYWJlbHMpICovCiAgICAgICNyYW5nZS1sYWJlbCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IC0xMDAwMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLW1lZGlhLWNvbnRyb2wtYmFja2dyb3VuZCwgdmFyKC0tbWVkaWEtc2Vjb25kYXJ5LWNvbG9yLCByZ2IoMjAgMjAgMzAgLyAuNykpKTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgaWQ9ImxlZnRnYXAiPjwvZGl2PgogICAgPGRpdiBpZD0iY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ic3RhcnRwb2ludCI+PC9kaXY+CiAgICAgIDxkaXYgaWQ9ImVuZHBvaW50Ij48L2Rpdj4KICAgICAgPGRpdiBpZD0iYXBwZWFyYW5jZSI+CiAgICAgICAgPGRpdiBpZD0idHJhY2siIHBhcnQ9InRyYWNrIj4KICAgICAgICAgIDxkaXYgaWQ9InBvaW50ZXIiPjwvZGl2PgogICAgICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MiIHBhcnQ9InByb2dyZXNzIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8c2xvdCBuYW1lPSJ0aHVtYiI+CiAgICAgICAgICA8ZGl2IGlkPSJ0aHVtYiIgcGFydD0idGh1bWIiPjwvZGl2PgogICAgICAgIDwvc2xvdD4KICAgICAgICA8c3ZnIGlkPSJzZWdtZW50cyIgYXJpYS1oaWRkZW49InRydWUiPjxjbGlwUGF0aCBpZD0ic2VnbWVudHMtY2xpcHBpbmciPjwvY2xpcFBhdGg+PC9zdmc+CiAgICAgIDwvZGl2PgogICAgICAgIDxpbnB1dCBpZD0icmFuZ2UiIHR5cGU9InJhbmdlIiBtaW49IjAiIG1heD0iMSIgc3RlcD0iYW55IiB2YWx1ZT0iMCI+CiAgICAgICAgPGxhYmVsIGZvcj0icmFuZ2UiIGlkPSJyYW5nZS1sYWJlbCI+PC9sYWJlbD4KCiAgICAgICR7dGhpcy5nZXRDb250YWluZXJUZW1wbGF0ZUhUTUwodCl9CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InJpZ2h0Z2FwIj48L2Rpdj4KICBgfWZ1bmN0aW9uIHdkKHQpe3JldHVybiIifXZhciBNZT1jbGFzcyBleHRlbmRzIGwuSFRNTEVsZW1lbnR7Y29uc3RydWN0b3IoKXtpZihzdXBlcigpLEoodGhpcyxycyksSih0aGlzLExhKSxKKHRoaXMsUmEpLEoodGhpcyxDYSksSih0aGlzLGpyKSxKKHRoaXMsZXMpLEoodGhpcyx0cyksSih0aGlzLGlzKSxKKHRoaXMsd2Usdm9pZCAwKSxKKHRoaXMseGEsdm9pZCAwKSxKKHRoaXMsSWEsdm9pZCAwKSxKKHRoaXMsa2Esdm9pZCAwKSxKKHRoaXMsYmUse30pLEoodGhpcyxEYSxbXSksSih0aGlzLHlhLCgpPT57aWYodGhpcy5yYW5nZS5tYXRjaGVzKCI6Zm9jdXMtdmlzaWJsZSIpKXtsZXR7c3R5bGU6ZX09Qih0aGlzLnNoYWRvd1Jvb3QsIjpob3N0Iik7ZS5zZXRQcm9wZXJ0eSgiLS1fZm9jdXMtdmlzaWJsZS1ib3gtc2hhZG93IiwidmFyKC0tX2ZvY3VzLWJveC1zaGFkb3cpIil9fSksSih0aGlzLHdhLCgpPT57bGV0e3N0eWxlOmV9PUIodGhpcy5zaGFkb3dSb290LCI6aG9zdCIpO2UucmVtb3ZlUHJvcGVydHkoIi0tX2ZvY3VzLXZpc2libGUtYm94LXNoYWRvdyIpfSksSih0aGlzLE1hLCgpPT57bGV0IGU9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIiNzZWdtZW50cy1jbGlwcGluZyIpO2UmJmUucGFyZW50Tm9kZS5hcHBlbmQoZSl9KSwhdGhpcy5zaGFkb3dSb290KXt0aGlzLmF0dGFjaFNoYWRvdyh0aGlzLmNvbnN0cnVjdG9yLnNoYWRvd1Jvb3RPcHRpb25zKTtsZXQgZT1HKHRoaXMuYXR0cmlidXRlcyksaT10aGlzLmNvbnN0cnVjdG9yLmdldFRlbXBsYXRlSFRNTChlKTt0aGlzLnNoYWRvd1Jvb3Quc2V0SFRNTFVuc2FmZT90aGlzLnNoYWRvd1Jvb3Quc2V0SFRNTFVuc2FmZShpKTp0aGlzLnNoYWRvd1Jvb3QuaW5uZXJIVE1MPWl9dGhpcy5jb250YWluZXI9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIiNjb250YWluZXIiKSx6ZSh0aGlzLElhLHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIjc3RhcnRwb2ludCIpKSx6ZSh0aGlzLGthLHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIjZW5kcG9pbnQiKSksdGhpcy5yYW5nZT10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiI3JhbmdlIiksdGhpcy5hcHBlYXJhbmNlPXRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIjYXBwZWFyYW5jZSIpfXN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuWyJkaXNhYmxlZCIsImFyaWEtZGlzYWJsZWQiLHcuTUVESUFfQ09OVFJPTExFUl19YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKXt2YXIgcixzLG8sZCx1O2U9PT13Lk1FRElBX0NPTlRST0xMRVI/KGkmJigocz0ocj0kKHRoaXMsd2UpKT09bnVsbD92b2lkIDA6ci51bmFzc29jaWF0ZUVsZW1lbnQpPT1udWxsfHxzLmNhbGwocix0aGlzKSx6ZSh0aGlzLHdlLG51bGwpKSxhJiZ0aGlzLmlzQ29ubmVjdGVkJiYoemUodGhpcyx3ZSwobz10aGlzLmdldFJvb3ROb2RlKCkpPT1udWxsP3ZvaWQgMDpvLmdldEVsZW1lbnRCeUlkKGEpKSwodT0oZD0kKHRoaXMsd2UpKT09bnVsbD92b2lkIDA6ZC5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8dS5jYWxsKGQsdGhpcykpKTooZT09PSJkaXNhYmxlZCJ8fGU9PT0iYXJpYS1kaXNhYmxlZCImJmkhPT1hKSYmKGE9PW51bGw/KHRoaXMucmFuZ2UucmVtb3ZlQXR0cmlidXRlKGUpLF9lKHRoaXMsTGEsWHIpLmNhbGwodGhpcykpOih0aGlzLnJhbmdlLnNldEF0dHJpYnV0ZShlLGEpLF9lKHRoaXMsUmEsSnIpLmNhbGwodGhpcykpKX1jb25uZWN0ZWRDYWxsYmFjaygpe3ZhciBlLGksYTtsZXR7c3R5bGU6cn09Qih0aGlzLnNoYWRvd1Jvb3QsIjpob3N0Iik7ci5zZXRQcm9wZXJ0eSgiZGlzcGxheSIsYHZhcigtLW1lZGlhLWNvbnRyb2wtZGlzcGxheSwgdmFyKC0tJHt0aGlzLmxvY2FsTmFtZX0tZGlzcGxheSwgaW5saW5lLWZsZXgpKWApLCQodGhpcyxiZSkucG9pbnRlcj1CKHRoaXMuc2hhZG93Um9vdCwiI3BvaW50ZXIiKSwkKHRoaXMsYmUpLnByb2dyZXNzPUIodGhpcy5zaGFkb3dSb290LCIjcHJvZ3Jlc3MiKSwkKHRoaXMsYmUpLnRodW1iPUIodGhpcy5zaGFkb3dSb290LCcjdGh1bWIsIDo6c2xvdHRlZChbc2xvdD0idGh1bWIiXSknKSwkKHRoaXMsYmUpLmFjdGl2ZVNlZ21lbnQ9Qih0aGlzLnNoYWRvd1Jvb3QsIiNzZWdtZW50cy1jbGlwcGluZyByZWN0Om50aC1jaGlsZCgwKSIpO2xldCBzPXRoaXMuZ2V0QXR0cmlidXRlKHcuTUVESUFfQ09OVFJPTExFUik7cyYmKHplKHRoaXMsd2UsKGU9dGhpcy5nZXRSb290Tm9kZSgpKT09bnVsbD92b2lkIDA6ZS5nZXRFbGVtZW50QnlJZChzKSksKGE9KGk9JCh0aGlzLHdlKSk9PW51bGw/dm9pZCAwOmkuYXNzb2NpYXRlRWxlbWVudCk9PW51bGx8fGEuY2FsbChpLHRoaXMpKSx0aGlzLnVwZGF0ZUJhcigpLHRoaXMuc2hhZG93Um9vdC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIiwkKHRoaXMseWEpKSx0aGlzLnNoYWRvd1Jvb3QuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNvdXQiLCQodGhpcyx3YSkpLF9lKHRoaXMsTGEsWHIpLmNhbGwodGhpcyksTmUodGhpcy5jb250YWluZXIsJCh0aGlzLE1hKSl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXt2YXIgZSxpO19lKHRoaXMsUmEsSnIpLmNhbGwodGhpcyksKGk9KGU9JCh0aGlzLHdlKSk9PW51bGw/dm9pZCAwOmUudW5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8aS5jYWxsKGUsdGhpcyksemUodGhpcyx3ZSxudWxsKSx0aGlzLnNoYWRvd1Jvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsJCh0aGlzLHlhKSksdGhpcy5zaGFkb3dSb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0IiwkKHRoaXMsd2EpKSxGZSh0aGlzLmNvbnRhaW5lciwkKHRoaXMsTWEpKX11cGRhdGVQb2ludGVyQmFyKGUpe3ZhciBpOyhpPSQodGhpcyxiZSkucG9pbnRlcik9PW51bGx8fGkuc3R5bGUuc2V0UHJvcGVydHkoIndpZHRoIixgJHt0aGlzLmdldFBvaW50ZXJSYXRpbyhlKSoxMDB9JWApfXVwZGF0ZUJhcigpe3ZhciBlLGk7bGV0IGE9dGhpcy5yYW5nZS52YWx1ZUFzTnVtYmVyKjEwMDsoZT0kKHRoaXMsYmUpLnByb2dyZXNzKT09bnVsbHx8ZS5zdHlsZS5zZXRQcm9wZXJ0eSgid2lkdGgiLGAke2F9JWApLChpPSQodGhpcyxiZSkudGh1bWIpPT1udWxsfHxpLnN0eWxlLnNldFByb3BlcnR5KCJsZWZ0IixgJHthfSVgKX11cGRhdGVTZWdtZW50cyhlKXtsZXQgaT10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiI3NlZ21lbnRzLWNsaXBwaW5nIik7aWYoaS50ZXh0Q29udGVudD0iIix0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCJzZWdtZW50cyIsISFlPy5sZW5ndGgpLCFlPy5sZW5ndGgpcmV0dXJuO2xldCBhPVsuLi5uZXcgU2V0KFsrdGhpcy5yYW5nZS5taW4sLi4uZS5mbGF0TWFwKHM9PltzLnN0YXJ0LHMuZW5kXSksK3RoaXMucmFuZ2UubWF4XSldO3plKHRoaXMsRGEsWy4uLmFdKTtsZXQgcj1hLnBvcCgpO2ZvcihsZXRbcyxvXW9mIGEuZW50cmllcygpKXtsZXRbZCx1XT1bcz09PTAscz09PWEubGVuZ3RoLTFdLF89ZD8iY2FsYyh2YXIoLS1zZWdtZW50cy1nYXApIC8gLTEpIjpgJHtvKjEwMH0lYCxBPWBjYWxjKCR7KCh1P3I6YVtzKzFdKS1vKSoxMDB9JSR7ZHx8dT8iIjoiIC0gdmFyKC0tc2VnbWVudHMtZ2FwKSJ9KWAsdj1QLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJyZWN0IiksbT1saSh0aGlzLnNoYWRvd1Jvb3QsYCNzZWdtZW50cy1jbGlwcGluZyByZWN0Om50aC1jaGlsZCgke3MrMX0pYCk7bS5zdHlsZS5zZXRQcm9wZXJ0eSgieCIsXyksbS5zdHlsZS5zZXRQcm9wZXJ0eSgid2lkdGgiLEEpLGkuYXBwZW5kKHYpfX1nZXRQb2ludGVyUmF0aW8oZSl7cmV0dXJuIFBuKGUuY2xpZW50WCxlLmNsaWVudFksJCh0aGlzLElhKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwkKHRoaXMsa2EpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKX1nZXQgZHJhZ2dpbmcoKXtyZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoImRyYWdnaW5nIil9aGFuZGxlRXZlbnQoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSJwb2ludGVybW92ZSI6X2UodGhpcyxpcyx3bykuY2FsbCh0aGlzLGUpO2JyZWFrO2Nhc2UiaW5wdXQiOnRoaXMudXBkYXRlQmFyKCk7YnJlYWs7Y2FzZSJwb2ludGVyZW50ZXIiOl9lKHRoaXMsanIsSW8pLmNhbGwodGhpcyxlKTticmVhaztjYXNlInBvaW50ZXJkb3duIjpfZSh0aGlzLENhLHNzKS5jYWxsKHRoaXMsZSk7YnJlYWs7Y2FzZSJwb2ludGVydXAiOl9lKHRoaXMsZXMsa28pLmNhbGwodGhpcyk7YnJlYWs7Y2FzZSJwb2ludGVybGVhdmUiOl9lKHRoaXMsdHMseW8pLmNhbGwodGhpcyk7YnJlYWt9fWdldCBrZXlzVXNlZCgpe3JldHVyblsiQXJyb3dVcCIsIkFycm93UmlnaHQiLCJBcnJvd0Rvd24iLCJBcnJvd0xlZnQiXX19O3dlPW5ldyBXZWFrTWFwO3hhPW5ldyBXZWFrTWFwO0lhPW5ldyBXZWFrTWFwO2thPW5ldyBXZWFrTWFwO2JlPW5ldyBXZWFrTWFwO0RhPW5ldyBXZWFrTWFwO3lhPW5ldyBXZWFrTWFwO3dhPW5ldyBXZWFrTWFwO01hPW5ldyBXZWFrTWFwO3JzPW5ldyBXZWFrU2V0O1NvPWZ1bmN0aW9uKHQpe2xldCBlPSQodGhpcyxiZSkuYWN0aXZlU2VnbWVudDtpZighZSlyZXR1cm47bGV0IGk9dGhpcy5nZXRQb2ludGVyUmF0aW8odCkscj1gI3NlZ21lbnRzLWNsaXBwaW5nIHJlY3Q6bnRoLWNoaWxkKCR7JCh0aGlzLERhKS5maW5kSW5kZXgoKHMsbyxkKT0+e2xldCB1PWRbbysxXTtyZXR1cm4gdSE9bnVsbCYmaT49cyYmaTw9dX0pKzF9KWA7KGUuc2VsZWN0b3JUZXh0IT1yfHwhZS5zdHlsZS50cmFuc2Zvcm0pJiYoZS5zZWxlY3RvclRleHQ9cixlLnN0eWxlLnNldFByb3BlcnR5KCJ0cmFuc2Zvcm0iLCJ2YXIoLS1tZWRpYS1yYW5nZS1zZWdtZW50LWhvdmVyLXRyYW5zZm9ybSwgc2NhbGVZKDIpKSIpKX07TGE9bmV3IFdlYWtTZXQ7WHI9ZnVuY3Rpb24oKXt0aGlzLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8IXRoaXMuaXNDb25uZWN0ZWR8fCh0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0Iix0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIix0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJlbnRlciIsdGhpcykpfTtSYT1uZXcgV2Vha1NldDtKcj1mdW5jdGlvbigpe3ZhciB0LGU7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJpbnB1dCIsdGhpcyksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsdGhpcyksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZW50ZXIiLHRoaXMpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmxlYXZlIix0aGlzKSwodD1sLndpbmRvdyk9PW51bGx8fHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIix0aGlzKSwoZT1sLndpbmRvdyk9PW51bGx8fGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLHRoaXMpfTtDYT1uZXcgV2Vha1NldDtzcz1mdW5jdGlvbih0KXt2YXIgZTt6ZSh0aGlzLHhhLHQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcy5yYW5nZSkpLChlPWwud2luZG93KT09bnVsbHx8ZS5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLHRoaXMse29uY2U6ITB9KX07anI9bmV3IFdlYWtTZXQ7SW89ZnVuY3Rpb24odCl7dmFyIGU7dC5wb2ludGVyVHlwZSE9PSJtb3VzZSImJl9lKHRoaXMsQ2Esc3MpLmNhbGwodGhpcyx0KSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJsZWF2ZSIsdGhpcyx7b25jZTohMH0pLChlPWwud2luZG93KT09bnVsbHx8ZS5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsdGhpcyl9O2VzPW5ldyBXZWFrU2V0O2tvPWZ1bmN0aW9uKCl7dmFyIHQ7KHQ9bC53aW5kb3cpPT1udWxsfHx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsdGhpcyksdGhpcy50b2dnbGVBdHRyaWJ1dGUoImRyYWdnaW5nIiwhMSksdGhpcy5yYW5nZS5kaXNhYmxlZD10aGlzLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKX07dHM9bmV3IFdlYWtTZXQ7eW89ZnVuY3Rpb24oKXt2YXIgdCxlO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmxlYXZlIix0aGlzKSwodD1sLndpbmRvdyk9PW51bGx8fHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLHRoaXMpLHRoaXMudG9nZ2xlQXR0cmlidXRlKCJkcmFnZ2luZyIsITEpLHRoaXMucmFuZ2UuZGlzYWJsZWQ9dGhpcy5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIiksKGU9JCh0aGlzLGJlKS5hY3RpdmVTZWdtZW50KT09bnVsbHx8ZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNmb3JtIil9O2lzPW5ldyBXZWFrU2V0O3dvPWZ1bmN0aW9uKHQpe3QucG9pbnRlclR5cGU9PT0icGVuIiYmdC5idXR0b25zPT09MHx8KHRoaXMudG9nZ2xlQXR0cmlidXRlKCJkcmFnZ2luZyIsdC5idXR0b25zPT09MXx8dC5wb2ludGVyVHlwZSE9PSJtb3VzZSIpLHRoaXMudXBkYXRlUG9pbnRlckJhcih0KSxfZSh0aGlzLHJzLFNvKS5jYWxsKHRoaXMsdCksdGhpcy5kcmFnZ2luZyYmKHQucG9pbnRlclR5cGUhPT0ibW91c2UifHwhJCh0aGlzLHhhKSkmJih0aGlzLnJhbmdlLmRpc2FibGVkPSEwLHRoaXMucmFuZ2UudmFsdWVBc051bWJlcj10aGlzLmdldFBvaW50ZXJSYXRpbyh0KSx0aGlzLnJhbmdlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJpbnB1dCIse2J1YmJsZXM6ITAsY29tcG9zZWQ6ITB9KSkpKX07TWUuc2hhZG93Um9vdE9wdGlvbnM9e21vZGU6Im9wZW4ifTtNZS5nZXRUZW1wbGF0ZUhUTUw9eWQ7TWUuZ2V0Q29udGFpbmVyVGVtcGxhdGVIVE1MPXdkO2wuY3VzdG9tRWxlbWVudHMuZ2V0KCJtZWRpYS1jaHJvbWUtcmFuZ2UiKXx8bC5jdXN0b21FbGVtZW50cy5kZWZpbmUoIm1lZGlhLWNocm9tZS1yYW5nZSIsTWUpO3ZhciBNbz0odCxlLGkpPT57aWYoIWUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIraSl9LFVhPSh0LGUsaSk9PihNbyh0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLE1kPSh0LGUsaSk9PntpZihlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtlIGluc3RhbmNlb2YgV2Vha1NldD9lLmFkZCh0KTplLnNldCh0LGkpfSxPYT0odCxlLGksYSk9PihNbyh0LGUsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxhP2EuY2FsbCh0LGkpOmUuc2V0KHQsaSksaSksTGU7ZnVuY3Rpb24gTGQodCl7cmV0dXJuYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXNwbGF5OiB2YXIoLS1tZWRpYS1jb250cm9sLWRpc3BsYXksIHZhcigtLW1lZGlhLXByZXZpZXctdGh1bWJuYWlsLWRpc3BsYXksIGlubGluZS1ibG9jaykpOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIGltZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8aW1nIGNyb3Nzb3JpZ2luIGxvYWRpbmc9ImVhZ2VyIiBkZWNvZGluZz0iYXN5bmMiPgogIGB9dmFyICR0PWNsYXNzIGV4dGVuZHMgbC5IVE1MRWxlbWVudHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksTWQodGhpcyxMZSx2b2lkIDApLCF0aGlzLnNoYWRvd1Jvb3Qpe3RoaXMuYXR0YWNoU2hhZG93KHRoaXMuY29uc3RydWN0b3Iuc2hhZG93Um9vdE9wdGlvbnMpO2xldCBlPUcodGhpcy5hdHRyaWJ1dGVzKTt0aGlzLnNoYWRvd1Jvb3QuaW5uZXJIVE1MPXRoaXMuY29uc3RydWN0b3IuZ2V0VGVtcGxhdGVIVE1MKGUpfX1zdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVyblt3Lk1FRElBX0NPTlRST0xMRVIsbi5NRURJQV9QUkVWSUVXX0lNQUdFLG4uTUVESUFfUFJFVklFV19DT09SRFNdfWNvbm5lY3RlZENhbGxiYWNrKCl7dmFyIGUsaSxhO2xldCByPXRoaXMuZ2V0QXR0cmlidXRlKHcuTUVESUFfQ09OVFJPTExFUik7ciYmKE9hKHRoaXMsTGUsKGU9dGhpcy5nZXRSb290Tm9kZSgpKT09bnVsbD92b2lkIDA6ZS5nZXRFbGVtZW50QnlJZChyKSksKGE9KGk9VWEodGhpcyxMZSkpPT1udWxsP3ZvaWQgMDppLmFzc29jaWF0ZUVsZW1lbnQpPT1udWxsfHxhLmNhbGwoaSx0aGlzKSl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXt2YXIgZSxpOyhpPShlPVVhKHRoaXMsTGUpKT09bnVsbD92b2lkIDA6ZS51bmFzc29jaWF0ZUVsZW1lbnQpPT1udWxsfHxpLmNhbGwoZSx0aGlzKSxPYSh0aGlzLExlLG51bGwpfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSl7dmFyIHIscyxvLGQsdTtbbi5NRURJQV9QUkVWSUVXX0lNQUdFLG4uTUVESUFfUFJFVklFV19DT09SRFNdLmluY2x1ZGVzKGUpJiZ0aGlzLnVwZGF0ZSgpLGU9PT13Lk1FRElBX0NPTlRST0xMRVImJihpJiYoKHM9KHI9VWEodGhpcyxMZSkpPT1udWxsP3ZvaWQgMDpyLnVuYXNzb2NpYXRlRWxlbWVudCk9PW51bGx8fHMuY2FsbChyLHRoaXMpLE9hKHRoaXMsTGUsbnVsbCkpLGEmJnRoaXMuaXNDb25uZWN0ZWQmJihPYSh0aGlzLExlLChvPXRoaXMuZ2V0Um9vdE5vZGUoKSk9PW51bGw/dm9pZCAwOm8uZ2V0RWxlbWVudEJ5SWQoYSkpLCh1PShkPVVhKHRoaXMsTGUpKT09bnVsbD92b2lkIDA6ZC5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8dS5jYWxsKGQsdGhpcykpKX1nZXQgbWVkaWFQcmV2aWV3SW1hZ2UoKXtyZXR1cm4gTyh0aGlzLG4uTUVESUFfUFJFVklFV19JTUFHRSl9c2V0IG1lZGlhUHJldmlld0ltYWdlKGUpe1UodGhpcyxuLk1FRElBX1BSRVZJRVdfSU1BR0UsZSl9Z2V0IG1lZGlhUHJldmlld0Nvb3Jkcygpe2xldCBlPXRoaXMuZ2V0QXR0cmlidXRlKG4uTUVESUFfUFJFVklFV19DT09SRFMpO2lmKGUpcmV0dXJuIGUuc3BsaXQoL1xzKy8pLm1hcChpPT4raSl9c2V0IG1lZGlhUHJldmlld0Nvb3JkcyhlKXtpZighZSl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUobi5NRURJQV9QUkVWSUVXX0NPT1JEUyk7cmV0dXJufXRoaXMuc2V0QXR0cmlidXRlKG4uTUVESUFfUFJFVklFV19DT09SRFMsZS5qb2luKCIgIikpfXVwZGF0ZSgpe2xldCBlPXRoaXMubWVkaWFQcmV2aWV3Q29vcmRzLGk9dGhpcy5tZWRpYVByZXZpZXdJbWFnZTtpZighKGUmJmkpKXJldHVybjtsZXRbYSxyLHMsb109ZSxkPWkuc3BsaXQoIiMiKVswXSx1PWdldENvbXB1dGVkU3R5bGUodGhpcykse21heFdpZHRoOl8sbWF4SGVpZ2h0OlQsbWluV2lkdGg6QSxtaW5IZWlnaHQ6dn09dSxtPXUuZ2V0UHJvcGVydHlWYWx1ZSgiLS1tZWRpYS1wcmV2aWV3LXRodW1ibmFpbC1vYmplY3QtZml0IikudHJpbSgpfHwiY29udGFpbiIsYixFO2lmKG09PT0iZmlsbCIpe2xldCBPZT1wYXJzZUludChfKS9zLFBlPXBhcnNlSW50KFQpL28sc2k9cGFyc2VJbnQoQSkvcyxhdD1wYXJzZUludCh2KS9vO2I9T2U8MT9PZTpNYXRoLm1heChPZSxzaSksRT1QZTwxP1BlOk1hdGgubWF4KFBlLGF0KX1lbHNle2xldCBPZT1NYXRoLm1pbihwYXJzZUludChfKS9zLHBhcnNlSW50KFQpL28pLFBlPU1hdGgubWF4KHBhcnNlSW50KEEpL3MscGFyc2VJbnQodikvbyksYXQ9T2U8MT9PZTpQZT4xP1BlOjE7Yj1hdCxFPWF0fWxldHtzdHlsZTpJfT1CKHRoaXMuc2hhZG93Um9vdCwiOmhvc3QiKSxTPUIodGhpcy5zaGFkb3dSb290LCJpbWciKS5zdHlsZSxqPXRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJpbWciKSxyaT1NYXRoLm1pbihiLEUpPDE/Im1pbiI6Im1heCI7SS5zZXRQcm9wZXJ0eShgJHtyaX0td2lkdGhgLCJpbml0aWFsIiwiaW1wb3J0YW50IiksSS5zZXRQcm9wZXJ0eShgJHtyaX0taGVpZ2h0YCwiaW5pdGlhbCIsImltcG9ydGFudCIpLEkud2lkdGg9YCR7cypifXB4YCxJLmhlaWdodD1gJHtvKkV9cHhgO2xldCBfdD0oKT0+e1Mud2lkdGg9YCR7dGhpcy5pbWdXaWR0aCpifXB4YCxTLmhlaWdodD1gJHt0aGlzLmltZ0hlaWdodCpFfXB4YCxTLmRpc3BsYXk9ImJsb2NrIn07ai5zcmMhPT1kJiYoai5vbmxvYWQ9KCk9Pnt0aGlzLmltZ1dpZHRoPWoubmF0dXJhbFdpZHRoLHRoaXMuaW1nSGVpZ2h0PWoubmF0dXJhbEhlaWdodCxfdCgpLGoub25sb2FkPW51bGx9LGouc3JjPWQsX3QoKSksX3QoKSxTLnRyYW5zZm9ybT1gdHJhbnNsYXRlKC0ke2EqYn1weCwgLSR7cipFfXB4KWB9fTtMZT1uZXcgV2Vha01hcDskdC5zaGFkb3dSb290T3B0aW9ucz17bW9kZToib3BlbiJ9OyR0LmdldFRlbXBsYXRlSFRNTD1MZDtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtcHJldmlldy10aHVtYm5haWwiKXx8bC5jdXN0b21FbGVtZW50cy5kZWZpbmUoIm1lZGlhLXByZXZpZXctdGh1bWJuYWlsIiwkdCk7dmFyIG5zPSR0O3ZhciBMbz0odCxlLGkpPT57aWYoIWUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIraSl9LFBhPSh0LGUsaSk9PihMbyh0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLFJkPSh0LGUsaSk9PntpZihlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtlIGluc3RhbmNlb2YgV2Vha1NldD9lLmFkZCh0KTplLnNldCh0LGkpfSxOYT0odCxlLGksYSk9PihMbyh0LGUsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxhP2EuY2FsbCh0LGkpOmUuc2V0KHQsaSksaSksUmU7ZnVuY3Rpb24gRGQodCxlPXt9KXtyZXR1cm5gCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250OiB2YXIoLS1tZWRpYS1mb250LAogICAgICAgICAgdmFyKC0tbWVkaWEtZm9udC13ZWlnaHQsIG5vcm1hbCkKICAgICAgICAgIHZhcigtLW1lZGlhLWZvbnQtc2l6ZSwgMTRweCkgLwogICAgICAgICAgdmFyKC0tbWVkaWEtdGV4dC1jb250ZW50LWhlaWdodCwgdmFyKC0tbWVkaWEtY29udHJvbC1oZWlnaHQsIDI0cHgpKQogICAgICAgICAgdmFyKC0tbWVkaWEtZm9udC1mYW1pbHksIGhlbHZldGljYSBuZXVlLCBzZWdvZSB1aSwgcm9ib3RvLCBhcmlhbCwgc2Fucy1zZXJpZikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1tZWRpYS10ZXh0LWNvbG9yLCB2YXIoLS1tZWRpYS1wcmltYXJ5LWNvbG9yLCByZ2IoMjM4IDIzOCAyMzgpKSk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtdGV4dC1iYWNrZ3JvdW5kLCB2YXIoLS1tZWRpYS1jb250cm9sLWJhY2tncm91bmQsIHZhcigtLW1lZGlhLXNlY29uZGFyeS1jb2xvciwgcmdiKDIwIDIwIDMwIC8gLjcpKSkpOwogICAgICAgIHBhZGRpbmc6IHZhcigtLW1lZGlhLWNvbnRyb2wtcGFkZGluZywgMTBweCk7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICAKICAgICAgOmhvc3QoOmZvY3VzLXZpc2libGUpIHsKICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1tZWRpYS1mb2N1cy1ib3gtc2hhZG93LCBpbnNldCAwIDAgMCAycHggcmdiKDI3IDEyNyAyMDQgLyAuOSkpOwogICAgICAgIG91dGxpbmU6IDA7CiAgICAgIH0KCiAgICAgIAogICAgICA6aG9zdCg6d2hlcmUoOmZvY3VzKSkgewogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgICAgb3V0bGluZTogMDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICAke3RoaXMuZ2V0U2xvdFRlbXBsYXRlSFRNTCh0LGUpfQogIGB9ZnVuY3Rpb24gQ2QodCxlKXtyZXR1cm5gCiAgICA8c2xvdD48L3Nsb3Q+CiAgYH12YXIgbGU9Y2xhc3MgZXh0ZW5kcyBsLkhUTUxFbGVtZW50e2NvbnN0cnVjdG9yKCl7aWYoc3VwZXIoKSxSZCh0aGlzLFJlLHZvaWQgMCksIXRoaXMuc2hhZG93Um9vdCl7dGhpcy5hdHRhY2hTaGFkb3codGhpcy5jb25zdHJ1Y3Rvci5zaGFkb3dSb290T3B0aW9ucyk7bGV0IGU9Ryh0aGlzLmF0dHJpYnV0ZXMpO3RoaXMuc2hhZG93Um9vdC5pbm5lckhUTUw9dGhpcy5jb25zdHJ1Y3Rvci5nZXRUZW1wbGF0ZUhUTUwoZSl9fXN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuW3cuTUVESUFfQ09OVFJPTExFUl19YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKXt2YXIgcixzLG8sZCx1O2U9PT13Lk1FRElBX0NPTlRST0xMRVImJihpJiYoKHM9KHI9UGEodGhpcyxSZSkpPT1udWxsP3ZvaWQgMDpyLnVuYXNzb2NpYXRlRWxlbWVudCk9PW51bGx8fHMuY2FsbChyLHRoaXMpLE5hKHRoaXMsUmUsbnVsbCkpLGEmJnRoaXMuaXNDb25uZWN0ZWQmJihOYSh0aGlzLFJlLChvPXRoaXMuZ2V0Um9vdE5vZGUoKSk9PW51bGw/dm9pZCAwOm8uZ2V0RWxlbWVudEJ5SWQoYSkpLCh1PShkPVBhKHRoaXMsUmUpKT09bnVsbD92b2lkIDA6ZC5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8dS5jYWxsKGQsdGhpcykpKX1jb25uZWN0ZWRDYWxsYmFjaygpe3ZhciBlLGksYTtsZXR7c3R5bGU6cn09Qih0aGlzLnNoYWRvd1Jvb3QsIjpob3N0Iik7ci5zZXRQcm9wZXJ0eSgiZGlzcGxheSIsYHZhcigtLW1lZGlhLWNvbnRyb2wtZGlzcGxheSwgdmFyKC0tJHt0aGlzLmxvY2FsTmFtZX0tZGlzcGxheSwgaW5saW5lLWZsZXgpKWApO2xldCBzPXRoaXMuZ2V0QXR0cmlidXRlKHcuTUVESUFfQ09OVFJPTExFUik7cyYmKE5hKHRoaXMsUmUsKGU9dGhpcy5nZXRSb290Tm9kZSgpKT09bnVsbD92b2lkIDA6ZS5nZXRFbGVtZW50QnlJZChzKSksKGE9KGk9UGEodGhpcyxSZSkpPT1udWxsP3ZvaWQgMDppLmFzc29jaWF0ZUVsZW1lbnQpPT1udWxsfHxhLmNhbGwoaSx0aGlzKSl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXt2YXIgZSxpOyhpPShlPVBhKHRoaXMsUmUpKT09bnVsbD92b2lkIDA6ZS51bmFzc29jaWF0ZUVsZW1lbnQpPT1udWxsfHxpLmNhbGwoZSx0aGlzKSxOYSh0aGlzLFJlLG51bGwpfX07UmU9bmV3IFdlYWtNYXA7bGUuc2hhZG93Um9vdE9wdGlvbnM9e21vZGU6Im9wZW4ifTtsZS5nZXRUZW1wbGF0ZUhUTUw9RGQ7bGUuZ2V0U2xvdFRlbXBsYXRlSFRNTD1DZDtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtdGV4dC1kaXNwbGF5Iil8fGwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJtZWRpYS10ZXh0LWRpc3BsYXkiLGxlKTt2YXIgUm89W3tzaW5ndWxhcjoiaG91ciIscGx1cmFsOiJob3VycyJ9LHtzaW5ndWxhcjoibWludXRlIixwbHVyYWw6Im1pbnV0ZXMifSx7c2luZ3VsYXI6InNlY29uZCIscGx1cmFsOiJzZWNvbmRzIn1dLHhkPSh0LGUpPT57bGV0IGk9dD09PTE/ZihSb1tlXS5zaW5ndWxhcik6ZihSb1tlXS5wbHVyYWwpO3JldHVybmAke3R9ICR7aX1gfSxtdD10PT57aWYoIUN0KHQpKXJldHVybiIiO2xldCBlPU1hdGguYWJzKHQpLGk9ZSE9PXQsYT1uZXcgRGF0ZSgwLDAsMCwwLDAsZSwwKSxzPVthLmdldEhvdXJzKCksYS5nZXRNaW51dGVzKCksYS5nZXRTZWNvbmRzKCldLm1hcCgobyxkKT0+byYmeGQobyxkKSkuZmlsdGVyKG89Pm8pLmpvaW4oIiwgIik7cmV0dXJuIGk/Zigie3RpbWV9IHJlbWFpbmluZyIse3RpbWU6c30pOnN9O2Z1bmN0aW9uIHB0KHQsZSl7bGV0IGk9ITE7dDwwJiYoaT0hMCx0PTAtdCksdD10PDA/MDp0O2xldCBhPU1hdGguZmxvb3IodCU2MCkscj1NYXRoLmZsb29yKHQvNjAlNjApLHM9TWF0aC5mbG9vcih0LzM2MDApLG89TWF0aC5mbG9vcihlLzYwJTYwKSxkPU1hdGguZmxvb3IoZS8zNjAwKTtyZXR1cm4oaXNOYU4odCl8fHQ9PT0xLzApJiYocz1yPWE9IjAiKSxzPXM+MHx8ZD4wP3MrIjoiOiIiLHI9KChzfHxvPj0xMCkmJnI8MTA/IjAiK3I6cikrIjoiLGE9YTwxMD8iMCIrYTphLChpPyItIjoiIikrcytyK2F9dmFyIEZoPU9iamVjdC5mcmVlemUoe2xlbmd0aDowLHN0YXJ0KHQpe2xldCBlPXQ+Pj4wO2lmKGU+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBET01FeGNlcHRpb24oYEZhaWxlZCB0byBleGVjdXRlICdzdGFydCcgb24gJ1RpbWVSYW5nZXMnOiBUaGUgaW5kZXggcHJvdmlkZWQgKCR7ZX0pIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbWF4aW11bSBib3VuZCAoJHt0aGlzLmxlbmd0aH0pLmApO3JldHVybiAwfSxlbmQodCl7bGV0IGU9dD4+PjA7aWYoZT49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihgRmFpbGVkIHRvIGV4ZWN1dGUgJ2VuZCcgb24gJ1RpbWVSYW5nZXMnOiBUaGUgaW5kZXggcHJvdmlkZWQgKCR7ZX0pIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbWF4aW11bSBib3VuZCAoJHt0aGlzLmxlbmd0aH0pLmApO3JldHVybiAwfX0pO3ZhciBDbz0odCxlLGkpPT57aWYoIWUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIraSl9LERvPSh0LGUsaSk9PihDbyh0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLFVkPSh0LGUsaSk9PntpZihlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtlIGluc3RhbmNlb2YgV2Vha1NldD9lLmFkZCh0KTplLnNldCh0LGkpfSxPZD0odCxlLGksYSk9PihDbyh0LGUsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxhP2EuY2FsbCh0LGkpOmUuc2V0KHQsaSksaSksSWksb3M9Y2xhc3MgZXh0ZW5kcyBsZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksVWQodGhpcyxJaSx2b2lkIDApLE9kKHRoaXMsSWksdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoInNsb3QiKSksRG8odGhpcyxJaSkudGV4dENvbnRlbnQ9cHQoMCl9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLG4uTUVESUFfUFJFVklFV19USU1FXX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpe3N1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSksZT09PW4uTUVESUFfUFJFVklFV19USU1FJiZhIT1udWxsJiYoRG8odGhpcyxJaSkudGV4dENvbnRlbnQ9cHQocGFyc2VGbG9hdChhKSkpfWdldCBtZWRpYVByZXZpZXdUaW1lKCl7cmV0dXJuIEQodGhpcyxuLk1FRElBX1BSRVZJRVdfVElNRSl9c2V0IG1lZGlhUHJldmlld1RpbWUoZSl7SCh0aGlzLG4uTUVESUFfUFJFVklFV19USU1FLGUpfX07SWk9bmV3IFdlYWtNYXA7bC5jdXN0b21FbGVtZW50cy5nZXQoIm1lZGlhLXByZXZpZXctdGltZS1kaXNwbGF5Iil8fGwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJtZWRpYS1wcmV2aWV3LXRpbWUtZGlzcGxheSIsb3MpO3ZhciB4bz0odCxlLGkpPT57aWYoIWUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIraSl9LFBkPSh0LGUsaSk9Pih4byh0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLE5kPSh0LGUsaSk9PntpZihlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtlIGluc3RhbmNlb2YgV2Vha1NldD9lLmFkZCh0KTplLnNldCh0LGkpfSxGZD0odCxlLGksYSk9Pih4byh0LGUsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxhP2EuY2FsbCh0LGkpOmUuc2V0KHQsaSksaSksRmEsbHM9Y2xhc3MgZXh0ZW5kcyBsZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksTmQodGhpcyxGYSx2b2lkIDApLEZkKHRoaXMsRmEsdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoInNsb3QiKSl9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLG4uTUVESUFfUFJFVklFV19DSEFQVEVSLG4uTUVESUFfTEFOR119YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKXtpZihzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpLChlPT09bi5NRURJQV9QUkVWSUVXX0NIQVBURVJ8fGU9PT1uLk1FRElBX0xBTkcpJiZhIT09aSYmYSE9bnVsbClpZihQZCh0aGlzLEZhKS50ZXh0Q29udGVudD1hLGEhPT0iIil7bGV0IHI9ZigiY2hhcHRlcjoge2NoYXB0ZXJOYW1lfSIse2NoYXB0ZXJOYW1lOmF9KTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZXRleHQiLHIpfWVsc2UgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtdmFsdWV0ZXh0Iil9Z2V0IG1lZGlhUHJldmlld0NoYXB0ZXIoKXtyZXR1cm4gTyh0aGlzLG4uTUVESUFfUFJFVklFV19DSEFQVEVSKX1zZXQgbWVkaWFQcmV2aWV3Q2hhcHRlcihlKXtVKHRoaXMsbi5NRURJQV9QUkVWSUVXX0NIQVBURVIsZSl9fTtGYT1uZXcgV2Vha01hcDtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtcHJldmlldy1jaGFwdGVyLWRpc3BsYXkiKXx8bC5jdXN0b21FbGVtZW50cy5kZWZpbmUoIm1lZGlhLXByZXZpZXctY2hhcHRlci1kaXNwbGF5Iixscyk7dmFyIFVvPSh0LGUsaSk9PntpZighZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitpKX0sWj0odCxlLGkpPT4oVW8odCxlLCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpLGk/aS5jYWxsKHQpOmUuZ2V0KHQpKSxEZT0odCxlLGkpPT57aWYoZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7ZSBpbnN0YW5jZW9mIFdlYWtTZXQ/ZS5hZGQodCk6ZS5zZXQodCxpKX0sc2U9KHQsZSxpLGEpPT4oVW8odCxlLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksYT9hLmNhbGwodCxpKTplLnNldCh0LGkpLGkpLEhkPSh0LGUsaSxhKT0+KHtzZXQgXyhyKXtzZSh0LGUscixpKX0sZ2V0IF8oKXtyZXR1cm4gWih0LGUsYSl9fSksVnQsSGEsS3Qsa2ksQmEsV2EsJGEsR3QsRXQsVmEsS2E9Y2xhc3N7Y29uc3RydWN0b3IoZSxpLGEpe0RlKHRoaXMsVnQsdm9pZCAwKSxEZSh0aGlzLEhhLHZvaWQgMCksRGUodGhpcyxLdCx2b2lkIDApLERlKHRoaXMsa2ksdm9pZCAwKSxEZSh0aGlzLEJhLHZvaWQgMCksRGUodGhpcyxXYSx2b2lkIDApLERlKHRoaXMsJGEsdm9pZCAwKSxEZSh0aGlzLEd0LHZvaWQgMCksRGUodGhpcyxFdCwwKSxEZSh0aGlzLFZhLChyPXBlcmZvcm1hbmNlLm5vdygpKT0+e3NlKHRoaXMsRXQscmVxdWVzdEFuaW1hdGlvbkZyYW1lKFoodGhpcyxWYSkpKSxzZSh0aGlzLGtpLHBlcmZvcm1hbmNlLm5vdygpLVoodGhpcyxLdCkpO2xldCBzPTFlMy90aGlzLmZwcztpZihaKHRoaXMsa2kpPnMpe3NlKHRoaXMsS3Qsci1aKHRoaXMsa2kpJXMpO2xldCBvPTFlMy8oKHItWih0aGlzLEhhKSkvKytIZCh0aGlzLEJhKS5fKSxkPShyLVoodGhpcyxXYSkpLzFlMy90aGlzLmR1cmF0aW9uLHU9Wih0aGlzLCRhKStkKnRoaXMucGxheWJhY2tSYXRlO3UtWih0aGlzLFZ0KS52YWx1ZUFzTnVtYmVyPjA/c2UodGhpcyxHdCx0aGlzLnBsYXliYWNrUmF0ZS90aGlzLmR1cmF0aW9uL28pOihzZSh0aGlzLEd0LC45OTUqWih0aGlzLEd0KSksdT1aKHRoaXMsVnQpLnZhbHVlQXNOdW1iZXIrWih0aGlzLEd0KSksdGhpcy5jYWxsYmFjayh1KX19KSxzZSh0aGlzLFZ0LGUpLHRoaXMuY2FsbGJhY2s9aSx0aGlzLmZwcz1hfXN0YXJ0KCl7Wih0aGlzLEV0KT09PTAmJihzZSh0aGlzLEt0LHBlcmZvcm1hbmNlLm5vdygpKSxzZSh0aGlzLEhhLFoodGhpcyxLdCkpLHNlKHRoaXMsQmEsMCksWih0aGlzLFZhKS5jYWxsKHRoaXMpKX1zdG9wKCl7Wih0aGlzLEV0KSE9PTAmJihjYW5jZWxBbmltYXRpb25GcmFtZShaKHRoaXMsRXQpKSxzZSh0aGlzLEV0LDApKX11cGRhdGUoe3N0YXJ0OmUsZHVyYXRpb246aSxwbGF5YmFja1JhdGU6YX0pe2xldCByPWUtWih0aGlzLFZ0KS52YWx1ZUFzTnVtYmVyLHM9TWF0aC5hYnMoaS10aGlzLmR1cmF0aW9uKTsocj4wfHxyPC0uMDN8fHM+PS41KSYmdGhpcy5jYWxsYmFjayhlKSxzZSh0aGlzLCRhLGUpLHNlKHRoaXMsV2EscGVyZm9ybWFuY2Uubm93KCkpLHRoaXMuZHVyYXRpb249aSx0aGlzLnBsYXliYWNrUmF0ZT1hfX07VnQ9bmV3IFdlYWtNYXA7SGE9bmV3IFdlYWtNYXA7S3Q9bmV3IFdlYWtNYXA7a2k9bmV3IFdlYWtNYXA7QmE9bmV3IFdlYWtNYXA7V2E9bmV3IFdlYWtNYXA7JGE9bmV3IFdlYWtNYXA7R3Q9bmV3IFdlYWtNYXA7RXQ9bmV3IFdlYWtNYXA7VmE9bmV3IFdlYWtNYXA7dmFyIG1zPSh0LGUsaSk9PntpZighZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitpKX0sTj0odCxlLGkpPT4obXModCxlLCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpLGk/aS5jYWxsKHQpOmUuZ2V0KHQpKSxZPSh0LGUsaSk9PntpZihlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtlIGluc3RhbmNlb2YgV2Vha1NldD9lLmFkZCh0KTplLnNldCh0LGkpfSxkZT0odCxlLGksYSk9Pihtcyh0LGUsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxhP2EuY2FsbCh0LGkpOmUuc2V0KHQsaSksaSksdWU9KHQsZSxpKT0+KG1zKHQsZSwiYWNjZXNzIHByaXZhdGUgbWV0aG9kIiksaSkscXQsWmUsWWEsd2ksUWEscWEsTWksTGksWXQsUXQseWksZHMsT28sdXMsemEscHMsWmEsRXMsWGEsdnMsY3MsUG8sUmksSmEsaHMsTm8sQmQ9dD0+e2xldCBlPXQucmFuZ2UsaT1tdCgrRm8odCkpLGE9bXQoK3QubWVkaWFTZWVrYWJsZUVuZCkscj1pJiZhP2YoIntjdXJyZW50VGltZX0gb2Yge3RvdGFsVGltZX0iLHtjdXJyZW50VGltZTppLHRvdGFsVGltZTphfSk6ZigidmlkZW8gbm90IGxvYWRlZCwgdW5rbm93biB0aW1lLiIpO2Uuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVldGV4dCIscil9O2Z1bmN0aW9uIFdkKHQpe3JldHVybmAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tbWVkaWEtYm94LWJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAtLW1lZGlhLWJveC1wYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgICAgLS1tZWRpYS1ib3gtcGFkZGluZy1yaWdodDogMTBweDsKICAgICAgICAtLW1lZGlhLXByZXZpZXctYm9yZGVyLXJhZGl1czogdmFyKC0tbWVkaWEtYm94LWJvcmRlci1yYWRpdXMpOwogICAgICAgIC0tbWVkaWEtYm94LWFycm93LW9mZnNldDogdmFyKC0tbWVkaWEtYm94LWJvcmRlci1yYWRpdXMpOwogICAgICAgIC0tX2NvbnRyb2wtYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtY29udHJvbC1iYWNrZ3JvdW5kLCB2YXIoLS1tZWRpYS1zZWNvbmRhcnktY29sb3IsIHJnYigyMCAyMCAzMCAvIC43KSkpOwogICAgICAgIC0tX3ByZXZpZXctYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtcHJldmlldy1iYWNrZ3JvdW5kLCB2YXIoLS1fY29udHJvbC1iYWNrZ3JvdW5kKSk7CgogICAgICAgIAogICAgICAgIGNvbnRhaW46IGxheW91dDsKICAgICAgfQoKICAgICAgI2J1ZmZlcmVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZWRpYS10aW1lLXJhbmdlLWJ1ZmZlcmVkLWNvbG9yLCByZ2IoMjU1IDI1NSAyNTUgLyAuNCkpOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHdpZHRoOwogICAgICB9CgogICAgICAjcHJldmlldy1yYWlsLAogICAgICAjY3VycmVudC1yYWlsIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3R0b206IDEwMCU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgW3BhcnR+PSJib3giXSB7CiAgICAgICAgd2lkdGg6IG1pbi1jb250ZW50OwogICAgICAgIAogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDEwMCU7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgICAgfQoKICAgICAgW3BhcnR+PSJjdXJyZW50LWJveCJdIHsKICAgICAgICBkaXNwbGF5OiB2YXIoLS1tZWRpYS1jdXJyZW50LWJveC1kaXNwbGF5LCB2YXIoLS1tZWRpYS1ib3gtZGlzcGxheSwgZmxleCkpOwogICAgICAgIG1hcmdpbjogdmFyKC0tbWVkaWEtY3VycmVudC1ib3gtbWFyZ2luLCB2YXIoLS1tZWRpYS1ib3gtbWFyZ2luLCAwIDAgNXB4KSk7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICBbcGFydH49InByZXZpZXctYm94Il0gewogICAgICAgIGRpc3BsYXk6IHZhcigtLW1lZGlhLXByZXZpZXctYm94LWRpc3BsYXksIHZhcigtLW1lZGlhLWJveC1kaXNwbGF5LCBmbGV4KSk7CiAgICAgICAgbWFyZ2luOiB2YXIoLS1tZWRpYS1wcmV2aWV3LWJveC1tYXJnaW4sIHZhcigtLW1lZGlhLWJveC1tYXJnaW4sIDAgMCA1cHgpKTsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB2YXIoLS1tZWRpYS1wcmV2aWV3LXRyYW5zaXRpb24tcHJvcGVydHksIHZpc2liaWxpdHksIG9wYWNpdHkpOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLW1lZGlhLXByZXZpZXctdHJhbnNpdGlvbi1kdXJhdGlvbi1vdXQsIC4yNXMpOwogICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IHZhcigtLW1lZGlhLXByZXZpZXctdHJhbnNpdGlvbi1kZWxheS1vdXQsIDBzKTsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgOmhvc3QoOmlzKFske24uTUVESUFfUFJFVklFV19JTUFHRX1dLCBbJHtuLk1FRElBX1BSRVZJRVdfVElNRX1dKVtkcmFnZ2luZ10pIFtwYXJ0fj0icHJldmlldy1ib3giXSB7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tbWVkaWEtcHJldmlldy10cmFuc2l0aW9uLWR1cmF0aW9uLWluLCAuNXMpOwogICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IHZhcigtLW1lZGlhLXByZXZpZXctdHJhbnNpdGlvbi1kZWxheS1pbiwgLjI1cyk7CiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICBAbWVkaWEgKGhvdmVyOiBob3ZlcikgewogICAgICAgIDpob3N0KDppcyhbJHtuLk1FRElBX1BSRVZJRVdfSU1BR0V9XSwgWyR7bi5NRURJQV9QUkVWSUVXX1RJTUV9XSk6aG92ZXIpIFtwYXJ0fj0icHJldmlldy1ib3giXSB7CiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1tZWRpYS1wcmV2aWV3LXRyYW5zaXRpb24tZHVyYXRpb24taW4sIC41cyk7CiAgICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1tZWRpYS1wcmV2aWV3LXRyYW5zaXRpb24tZGVsYXktaW4sIC4yNXMpOwogICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICBtZWRpYS1wcmV2aWV3LXRodW1ibmFpbCwKICAgICAgOjpzbG90dGVkKG1lZGlhLXByZXZpZXctdGh1bWJuYWlsKSB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICAgIAogICAgICAgIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMHMgLjI1czsKICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiBjYWxjKHZhcigtLW1lZGlhLXByZXZpZXctdHJhbnNpdGlvbi1kZWxheS1vdXQsIDBzKSArIHZhcigtLW1lZGlhLXByZXZpZXctdHJhbnNpdGlvbi1kdXJhdGlvbi1vdXQsIC4yNXMpKTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZWRpYS1wcmV2aWV3LXRodW1ibmFpbC1iYWNrZ3JvdW5kLCB2YXIoLS1fcHJldmlldy1iYWNrZ3JvdW5kKSk7CiAgICAgICAgYm94LXNoYWRvdzogdmFyKC0tbWVkaWEtcHJldmlldy10aHVtYm5haWwtYm94LXNoYWRvdywgMCAwIDRweCByZ2IoMCAwIDAgLyAuMikpOwogICAgICAgIG1heC13aWR0aDogdmFyKC0tbWVkaWEtcHJldmlldy10aHVtYm5haWwtbWF4LXdpZHRoLCAxODBweCk7CiAgICAgICAgbWF4LWhlaWdodDogdmFyKC0tbWVkaWEtcHJldmlldy10aHVtYm5haWwtbWF4LWhlaWdodCwgMTYwcHgpOwogICAgICAgIG1pbi13aWR0aDogdmFyKC0tbWVkaWEtcHJldmlldy10aHVtYm5haWwtbWluLXdpZHRoLCAxMjBweCk7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tbWVkaWEtcHJldmlldy10aHVtYm5haWwtbWluLWhlaWdodCwgODBweCk7CiAgICAgICAgYm9yZGVyOiB2YXIoLS1tZWRpYS1wcmV2aWV3LXRodW1ibmFpbC1ib3JkZXIpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1lZGlhLXByZXZpZXctdGh1bWJuYWlsLWJvcmRlci1yYWRpdXMsCiAgICAgICAgICB2YXIoLS1tZWRpYS1wcmV2aWV3LWJvcmRlci1yYWRpdXMpIHZhcigtLW1lZGlhLXByZXZpZXctYm9yZGVyLXJhZGl1cykgMCAwKTsKICAgICAgfQoKICAgICAgOmhvc3QoWyR7bi5NRURJQV9QUkVWSUVXX0lNQUdFfV1bZHJhZ2dpbmddKSBtZWRpYS1wcmV2aWV3LXRodW1ibmFpbCwKICAgICAgOmhvc3QoWyR7bi5NRURJQV9QUkVWSUVXX0lNQUdFfV1bZHJhZ2dpbmddKSA6OnNsb3R0ZWQobWVkaWEtcHJldmlldy10aHVtYm5haWwpIHsKICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1tZWRpYS1wcmV2aWV3LXRyYW5zaXRpb24tZGVsYXktaW4sIC4yNXMpOwogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIEBtZWRpYSAoaG92ZXI6IGhvdmVyKSB7CiAgICAgICAgOmhvc3QoWyR7bi5NRURJQV9QUkVWSUVXX0lNQUdFfV06aG92ZXIpIG1lZGlhLXByZXZpZXctdGh1bWJuYWlsLAogICAgICAgIDpob3N0KFske24uTUVESUFfUFJFVklFV19JTUFHRX1dOmhvdmVyKSA6OnNsb3R0ZWQobWVkaWEtcHJldmlldy10aHVtYm5haWwpIHsKICAgICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IHZhcigtLW1lZGlhLXByZXZpZXctdHJhbnNpdGlvbi1kZWxheS1pbiwgLjI1cyk7CiAgICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoWyR7bi5NRURJQV9QUkVWSUVXX1RJTUV9XTpob3ZlcikgewogICAgICAgICAgLS1tZWRpYS10aW1lLXJhbmdlLWhvdmVyLWRpc3BsYXk6IGJsb2NrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgbWVkaWEtcHJldmlldy1jaGFwdGVyLWRpc3BsYXksCiAgICAgIDo6c2xvdHRlZChtZWRpYS1wcmV2aWV3LWNoYXB0ZXItZGlzcGxheSkgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbWVkaWEtZm9udC1zaXplLCAxM3B4KTsKICAgICAgICBsaW5lLWhlaWdodDogMTdweDsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICAgIAogICAgICAgIHRyYW5zaXRpb246IG1pbi13aWR0aCAwcywgYm9yZGVyLXJhZGl1cyAwcywgbWFyZ2luIDBzLCBwYWRkaW5nIDBzLCB2aXNpYmlsaXR5IDBzOwogICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IGNhbGModmFyKC0tbWVkaWEtcHJldmlldy10cmFuc2l0aW9uLWRlbGF5LW91dCwgMHMpICsgdmFyKC0tbWVkaWEtcHJldmlldy10cmFuc2l0aW9uLWR1cmF0aW9uLW91dCwgLjI1cykpOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLW1lZGlhLXByZXZpZXctY2hhcHRlci1iYWNrZ3JvdW5kLCB2YXIoLS1fcHJldmlldy1iYWNrZ3JvdW5kKSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWVkaWEtcHJldmlldy1jaGFwdGVyLWJvcmRlci1yYWRpdXMsCiAgICAgICAgICB2YXIoLS1tZWRpYS1wcmV2aWV3LWJvcmRlci1yYWRpdXMpIHZhcigtLW1lZGlhLXByZXZpZXctYm9yZGVyLXJhZGl1cykKICAgICAgICAgIHZhcigtLW1lZGlhLXByZXZpZXctYm9yZGVyLXJhZGl1cykgdmFyKC0tbWVkaWEtcHJldmlldy1ib3JkZXItcmFkaXVzKSk7CiAgICAgICAgcGFkZGluZzogdmFyKC0tbWVkaWEtcHJldmlldy1jaGFwdGVyLXBhZGRpbmcsIDMuNXB4IDlweCk7CiAgICAgICAgbWFyZ2luOiB2YXIoLS1tZWRpYS1wcmV2aWV3LWNoYXB0ZXItbWFyZ2luLCAwIDAgNXB4KTsKICAgICAgICB0ZXh0LXNoYWRvdzogdmFyKC0tbWVkaWEtcHJldmlldy1jaGFwdGVyLXRleHQtc2hhZG93LCAwIDAgNHB4IHJnYigwIDAgMCAvIC43NSkpOwogICAgICB9CgogICAgICA6aG9zdChbJHtuLk1FRElBX1BSRVZJRVdfSU1BR0V9XSkgbWVkaWEtcHJldmlldy1jaGFwdGVyLWRpc3BsYXksCiAgICAgIDpob3N0KFske24uTUVESUFfUFJFVklFV19JTUFHRX1dKSA6OnNsb3R0ZWQobWVkaWEtcHJldmlldy1jaGFwdGVyLWRpc3BsYXkpIHsKICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1tZWRpYS1wcmV2aWV3LXRyYW5zaXRpb24tZGVsYXktaW4sIC4yNXMpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1lZGlhLXByZXZpZXctY2hhcHRlci1ib3JkZXItcmFkaXVzLCAwKTsKICAgICAgICBwYWRkaW5nOiB2YXIoLS1tZWRpYS1wcmV2aWV3LWNoYXB0ZXItcGFkZGluZywgMy41cHggOXB4IDApOwogICAgICAgIG1hcmdpbjogdmFyKC0tbWVkaWEtcHJldmlldy1jaGFwdGVyLW1hcmdpbiwgMCk7CiAgICAgICAgbWluLXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBtZWRpYS1wcmV2aWV3LWNoYXB0ZXItZGlzcGxheVske24uTUVESUFfUFJFVklFV19DSEFQVEVSfV0sCiAgICAgIDo6c2xvdHRlZChtZWRpYS1wcmV2aWV3LWNoYXB0ZXItZGlzcGxheVske24uTUVESUFfUFJFVklFV19DSEFQVEVSfV0pIHsKICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgICB9CgogICAgICBtZWRpYS1wcmV2aWV3LWNoYXB0ZXItZGlzcGxheTpub3QoW2FyaWEtdmFsdWV0ZXh0XSksCiAgICAgIDo6c2xvdHRlZChtZWRpYS1wcmV2aWV3LWNoYXB0ZXItZGlzcGxheTpub3QoW2FyaWEtdmFsdWV0ZXh0XSkpIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICBtZWRpYS1wcmV2aWV3LXRpbWUtZGlzcGxheSwKICAgICAgOjpzbG90dGVkKG1lZGlhLXByZXZpZXctdGltZS1kaXNwbGF5KSwKICAgICAgbWVkaWEtdGltZS1kaXNwbGF5LAogICAgICA6OnNsb3R0ZWQobWVkaWEtdGltZS1kaXNwbGF5KSB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1tZWRpYS1mb250LXNpemUsIDEzcHgpOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxN3B4OwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICAKICAgICAgICB0cmFuc2l0aW9uOiBtaW4td2lkdGggMHMsIGJvcmRlci1yYWRpdXMgMHM7CiAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogY2FsYyh2YXIoLS1tZWRpYS1wcmV2aWV3LXRyYW5zaXRpb24tZGVsYXktb3V0LCAwcykgKyB2YXIoLS1tZWRpYS1wcmV2aWV3LXRyYW5zaXRpb24tZHVyYXRpb24tb3V0LCAuMjVzKSk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtcHJldmlldy10aW1lLWJhY2tncm91bmQsIHZhcigtLV9wcmV2aWV3LWJhY2tncm91bmQpKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tZWRpYS1wcmV2aWV3LXRpbWUtYm9yZGVyLXJhZGl1cywKICAgICAgICAgIHZhcigtLW1lZGlhLXByZXZpZXctYm9yZGVyLXJhZGl1cykgdmFyKC0tbWVkaWEtcHJldmlldy1ib3JkZXItcmFkaXVzKQogICAgICAgICAgdmFyKC0tbWVkaWEtcHJldmlldy1ib3JkZXItcmFkaXVzKSB2YXIoLS1tZWRpYS1wcmV2aWV3LWJvcmRlci1yYWRpdXMpKTsKICAgICAgICBwYWRkaW5nOiB2YXIoLS1tZWRpYS1wcmV2aWV3LXRpbWUtcGFkZGluZywgMy41cHggOXB4KTsKICAgICAgICBtYXJnaW46IHZhcigtLW1lZGlhLXByZXZpZXctdGltZS1tYXJnaW4sIDApOwogICAgICAgIHRleHQtc2hhZG93OiB2YXIoLS1tZWRpYS1wcmV2aWV3LXRpbWUtdGV4dC1zaGFkb3csIDAgMCA0cHggcmdiKDAgMCAwIC8gLjc1KSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKG1pbigKICAgICAgICAgIG1heChjYWxjKDUwJSAtIHZhcigtLV9ib3gtd2lkdGgpIC8gMiksCiAgICAgICAgICBjYWxjKHZhcigtLV9ib3gtc2hpZnQsIDApKSksCiAgICAgICAgICBjYWxjKHZhcigtLV9ib3gtd2lkdGgpIC8gMiAtIDUwJSkKICAgICAgICApKTsKICAgICAgfQoKICAgICAgOmhvc3QoWyR7bi5NRURJQV9QUkVWSUVXX0lNQUdFfV0pIG1lZGlhLXByZXZpZXctdGltZS1kaXNwbGF5LAogICAgICA6aG9zdChbJHtuLk1FRElBX1BSRVZJRVdfSU1BR0V9XSkgOjpzbG90dGVkKG1lZGlhLXByZXZpZXctdGltZS1kaXNwbGF5KSB7CiAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogdmFyKC0tbWVkaWEtcHJldmlldy10cmFuc2l0aW9uLWRlbGF5LWluLCAuMjVzKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tZWRpYS1wcmV2aWV3LXRpbWUtYm9yZGVyLXJhZGl1cywKICAgICAgICAgIDAgMCB2YXIoLS1tZWRpYS1wcmV2aWV3LWJvcmRlci1yYWRpdXMpIHZhcigtLW1lZGlhLXByZXZpZXctYm9yZGVyLXJhZGl1cykpOwogICAgICAgIG1pbi13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgOmhvc3QoWyR7bi5NRURJQV9QUkVWSUVXX1RJTUV9XTpob3ZlcikgewogICAgICAgIC0tbWVkaWEtdGltZS1yYW5nZS1ob3Zlci1kaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgW3BhcnR+PSJhcnJvdyJdLAogICAgICA6OnNsb3R0ZWQoW3BhcnR+PSJhcnJvdyJdKSB7CiAgICAgICAgZGlzcGxheTogdmFyKC0tbWVkaWEtYm94LWFycm93LWRpc3BsYXksIGlubGluZS1ibG9jayk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKG1pbigKICAgICAgICAgIG1heChjYWxjKDUwJSAtIHZhcigtLV9ib3gtd2lkdGgpIC8gMiArIHZhcigtLW1lZGlhLWJveC1hcnJvdy1vZmZzZXQpKSwKICAgICAgICAgIGNhbGModmFyKC0tX2JveC1zaGlmdCwgMCkpKSwKICAgICAgICAgIGNhbGModmFyKC0tX2JveC13aWR0aCkgLyAyIC0gNTAlIC0gdmFyKC0tbWVkaWEtYm94LWFycm93LW9mZnNldCkpCiAgICAgICAgKSk7CiAgICAgICAgCiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS1tZWRpYS1ib3gtYXJyb3ctYmFja2dyb3VuZCwgdmFyKC0tX2NvbnRyb2wtYmFja2dyb3VuZCkpOwogICAgICAgIGJvcmRlci13aWR0aDogdmFyKC0tbWVkaWEtYm94LWFycm93LWJvcmRlci13aWR0aCwKICAgICAgICAgIHZhcigtLW1lZGlhLWJveC1hcnJvdy1oZWlnaHQsIDVweCkgdmFyKC0tbWVkaWEtYm94LWFycm93LXdpZHRoLCA2cHgpIDApOwogICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0icHJldmlldy1yYWlsIj4KICAgICAgPHNsb3QgbmFtZT0icHJldmlldyIgcGFydD0iYm94IHByZXZpZXctYm94Ij4KICAgICAgICA8bWVkaWEtcHJldmlldy10aHVtYm5haWw+CiAgICAgICAgICA8dGVtcGxhdGUgc2hhZG93cm9vdG1vZGU9IiR7bnMuc2hhZG93Um9vdE9wdGlvbnMubW9kZX0iPgogICAgICAgICAgICAke25zLmdldFRlbXBsYXRlSFRNTCh7fSl9CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvbWVkaWEtcHJldmlldy10aHVtYm5haWw+CiAgICAgICAgPG1lZGlhLXByZXZpZXctY2hhcHRlci1kaXNwbGF5PjwvbWVkaWEtcHJldmlldy1jaGFwdGVyLWRpc3BsYXk+CiAgICAgICAgPG1lZGlhLXByZXZpZXctdGltZS1kaXNwbGF5PjwvbWVkaWEtcHJldmlldy10aW1lLWRpc3BsYXk+CiAgICAgICAgPHNsb3QgbmFtZT0icHJldmlldy1hcnJvdyI+PGRpdiBwYXJ0PSJhcnJvdyI+PC9kaXY+PC9zbG90PgogICAgICA8L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImN1cnJlbnQtcmFpbCI+CiAgICAgIDxzbG90IG5hbWU9ImN1cnJlbnQiIHBhcnQ9ImJveCBjdXJyZW50LWJveCI+CiAgICAgICAgCiAgICAgIDwvc2xvdD4KICAgIDwvZGl2PgogIGB9dmFyIEdhPSh0LGU9dC5tZWRpYUN1cnJlbnRUaW1lKT0+e2xldCBpPU51bWJlci5pc0Zpbml0ZSh0Lm1lZGlhU2Vla2FibGVTdGFydCk/dC5tZWRpYVNlZWthYmxlU3RhcnQ6MCxhPU51bWJlci5pc0Zpbml0ZSh0Lm1lZGlhRHVyYXRpb24pP3QubWVkaWFEdXJhdGlvbjp0Lm1lZGlhU2Vla2FibGVFbmQ7aWYoTnVtYmVyLmlzTmFOKGEpKXJldHVybiAwO2xldCByPShlLWkpLyhhLWkpO3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKHIsMSkpfSxGbz0odCxlPXQucmFuZ2UudmFsdWVBc051bWJlcik9PntsZXQgaT1OdW1iZXIuaXNGaW5pdGUodC5tZWRpYVNlZWthYmxlU3RhcnQpP3QubWVkaWFTZWVrYWJsZVN0YXJ0OjAsYT1OdW1iZXIuaXNGaW5pdGUodC5tZWRpYUR1cmF0aW9uKT90Lm1lZGlhRHVyYXRpb246dC5tZWRpYVNlZWthYmxlRW5kO3JldHVybiBOdW1iZXIuaXNOYU4oYSk/MDplKihhLWkpK2l9LERpPWNsYXNzIGV4dGVuZHMgTWV7Y29uc3RydWN0b3IoKXtzdXBlcigpLFkodGhpcyxkcyksWSh0aGlzLHphKSxZKHRoaXMsWmEpLFkodGhpcyxYYSksWSh0aGlzLGNzKSxZKHRoaXMsUmkpLFkodGhpcyxocyksWSh0aGlzLHF0LG51bGwpLFkodGhpcyxaZSx2b2lkIDApLFkodGhpcyxZYSx2b2lkIDApLFkodGhpcyx3aSx2b2lkIDApLFkodGhpcyxRYSx2b2lkIDApLFkodGhpcyxxYSx2b2lkIDApLFkodGhpcyxNaSx2b2lkIDApLFkodGhpcyxMaSx2b2lkIDApLFkodGhpcyxZdCx2b2lkIDApLFkodGhpcyxRdCx2b2lkIDApLFkodGhpcyx5aSwoKT0+e3VlKHRoaXMsZHMsT28pLmNhbGwodGhpcyk/Tih0aGlzLFplKS5zdGFydCgpOk4odGhpcyxaZSkuc3RvcCgpfSksWSh0aGlzLHVzLGE9Pnt0aGlzLmRyYWdnaW5nfHwoQ3QoYSkmJih0aGlzLnJhbmdlLnZhbHVlQXNOdW1iZXI9YSksTih0aGlzLFF0KXx8dGhpcy51cGRhdGVCYXIoKSl9KSx0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiI3RyYWNrIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwnPGRpdiBpZD0iYnVmZmVyZWQiIHBhcnQ9ImJ1ZmZlcmVkIj48L2Rpdj4nKSxkZSh0aGlzLFlhLHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbcGFydH49ImJveCJdJykpLGRlKHRoaXMsUWEsdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj0icHJldmlldy1ib3giXScpKSxkZSh0aGlzLHFhLHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdbcGFydH49ImN1cnJlbnQtYm94Il0nKSk7bGV0IGk9Z2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTtkZSh0aGlzLE1pLHBhcnNlSW50KGkuZ2V0UHJvcGVydHlWYWx1ZSgiLS1tZWRpYS1ib3gtcGFkZGluZy1sZWZ0IikpKSxkZSh0aGlzLExpLHBhcnNlSW50KGkuZ2V0UHJvcGVydHlWYWx1ZSgiLS1tZWRpYS1ib3gtcGFkZGluZy1yaWdodCIpKSksZGUodGhpcyxaZSxuZXcgS2EodGhpcy5yYW5nZSxOKHRoaXMsdXMpLDYwKSl9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLG4uTUVESUFfUEFVU0VELG4uTUVESUFfRFVSQVRJT04sbi5NRURJQV9TRUVLQUJMRSxuLk1FRElBX0NVUlJFTlRfVElNRSxuLk1FRElBX1BSRVZJRVdfSU1BR0Usbi5NRURJQV9QUkVWSUVXX1RJTUUsbi5NRURJQV9QUkVWSUVXX0NIQVBURVIsbi5NRURJQV9CVUZGRVJFRCxuLk1FRElBX1BMQVlCQUNLX1JBVEUsbi5NRURJQV9MT0FESU5HLG4uTUVESUFfRU5ERURdfWNvbm5lY3RlZENhbGxiYWNrKCl7dmFyIGU7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLnJhbmdlLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsZigic2VlayIpKSxOKHRoaXMseWkpLmNhbGwodGhpcyksZGUodGhpcyxxdCx0aGlzLmdldFJvb3ROb2RlKCkpLChlPU4odGhpcyxxdCkpPT1udWxsfHxlLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25zdGFydCIsdGhpcyl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXt2YXIgZTtzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpLE4odGhpcyxaZSkuc3RvcCgpLChlPU4odGhpcyxxdCkpPT1udWxsfHxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25zdGFydCIsdGhpcyksZGUodGhpcyxxdCxudWxsKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpe3N1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSksaSE9YSYmKGU9PT1uLk1FRElBX0NVUlJFTlRfVElNRXx8ZT09PW4uTUVESUFfUEFVU0VEfHxlPT09bi5NRURJQV9FTkRFRHx8ZT09PW4uTUVESUFfTE9BRElOR3x8ZT09PW4uTUVESUFfRFVSQVRJT058fGU9PT1uLk1FRElBX1NFRUtBQkxFPyhOKHRoaXMsWmUpLnVwZGF0ZSh7c3RhcnQ6R2EodGhpcyksZHVyYXRpb246dGhpcy5tZWRpYVNlZWthYmxlRW5kLXRoaXMubWVkaWFTZWVrYWJsZVN0YXJ0LHBsYXliYWNrUmF0ZTp0aGlzLm1lZGlhUGxheWJhY2tSYXRlfSksTih0aGlzLHlpKS5jYWxsKHRoaXMpLEJkKHRoaXMpKTplPT09bi5NRURJQV9CVUZGRVJFRCYmdGhpcy51cGRhdGVCdWZmZXJlZEJhcigpLChlPT09bi5NRURJQV9EVVJBVElPTnx8ZT09PW4uTUVESUFfU0VFS0FCTEUpJiYodGhpcy5tZWRpYUNoYXB0ZXJzQ3Vlcz1OKHRoaXMsWXQpLHRoaXMudXBkYXRlQmFyKCkpKX1nZXQgbWVkaWFDaGFwdGVyc0N1ZXMoKXtyZXR1cm4gTih0aGlzLFl0KX1zZXQgbWVkaWFDaGFwdGVyc0N1ZXMoZSl7dmFyIGk7ZGUodGhpcyxZdCxlKSx0aGlzLnVwZGF0ZVNlZ21lbnRzKChpPU4odGhpcyxZdCkpPT1udWxsP3ZvaWQgMDppLm1hcChhPT4oe3N0YXJ0OkdhKHRoaXMsYS5zdGFydFRpbWUpLGVuZDpHYSh0aGlzLGEuZW5kVGltZSl9KSkpfWdldCBtZWRpYVBhdXNlZCgpe3JldHVybiBrKHRoaXMsbi5NRURJQV9QQVVTRUQpfXNldCBtZWRpYVBhdXNlZChlKXt5KHRoaXMsbi5NRURJQV9QQVVTRUQsZSl9Z2V0IG1lZGlhTG9hZGluZygpe3JldHVybiBrKHRoaXMsbi5NRURJQV9MT0FESU5HKX1zZXQgbWVkaWFMb2FkaW5nKGUpe3kodGhpcyxuLk1FRElBX0xPQURJTkcsZSl9Z2V0IG1lZGlhRHVyYXRpb24oKXtyZXR1cm4gRCh0aGlzLG4uTUVESUFfRFVSQVRJT04pfXNldCBtZWRpYUR1cmF0aW9uKGUpe0godGhpcyxuLk1FRElBX0RVUkFUSU9OLGUpfWdldCBtZWRpYUN1cnJlbnRUaW1lKCl7cmV0dXJuIEQodGhpcyxuLk1FRElBX0NVUlJFTlRfVElNRSl9c2V0IG1lZGlhQ3VycmVudFRpbWUoZSl7SCh0aGlzLG4uTUVESUFfQ1VSUkVOVF9USU1FLGUpfWdldCBtZWRpYVBsYXliYWNrUmF0ZSgpe3JldHVybiBEKHRoaXMsbi5NRURJQV9QTEFZQkFDS19SQVRFLDEpfXNldCBtZWRpYVBsYXliYWNrUmF0ZShlKXtIKHRoaXMsbi5NRURJQV9QTEFZQkFDS19SQVRFLGUpfWdldCBtZWRpYUJ1ZmZlcmVkKCl7bGV0IGU9dGhpcy5nZXRBdHRyaWJ1dGUobi5NRURJQV9CVUZGRVJFRCk7cmV0dXJuIGU/ZS5zcGxpdCgiICIpLm1hcChpPT5pLnNwbGl0KCI6IikubWFwKGE9PithKSk6W119c2V0IG1lZGlhQnVmZmVyZWQoZSl7aWYoIWUpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4uTUVESUFfQlVGRkVSRUQpO3JldHVybn1sZXQgaT1lLm1hcChhPT5hLmpvaW4oIjoiKSkuam9pbigiICIpO3RoaXMuc2V0QXR0cmlidXRlKG4uTUVESUFfQlVGRkVSRUQsaSl9Z2V0IG1lZGlhU2Vla2FibGUoKXtsZXQgZT10aGlzLmdldEF0dHJpYnV0ZShuLk1FRElBX1NFRUtBQkxFKTtpZihlKXJldHVybiBlLnNwbGl0KCI6IikubWFwKGk9PitpKX1zZXQgbWVkaWFTZWVrYWJsZShlKXtpZihlPT1udWxsKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShuLk1FRElBX1NFRUtBQkxFKTtyZXR1cm59dGhpcy5zZXRBdHRyaWJ1dGUobi5NRURJQV9TRUVLQUJMRSxlLmpvaW4oIjoiKSl9Z2V0IG1lZGlhU2Vla2FibGVFbmQoKXt2YXIgZTtsZXRbLGk9dGhpcy5tZWRpYUR1cmF0aW9uXT0oZT10aGlzLm1lZGlhU2Vla2FibGUpIT1udWxsP2U6W107cmV0dXJuIGl9Z2V0IG1lZGlhU2Vla2FibGVTdGFydCgpe3ZhciBlO2xldFtpPTBdPShlPXRoaXMubWVkaWFTZWVrYWJsZSkhPW51bGw/ZTpbXTtyZXR1cm4gaX1nZXQgbWVkaWFQcmV2aWV3SW1hZ2UoKXtyZXR1cm4gTyh0aGlzLG4uTUVESUFfUFJFVklFV19JTUFHRSl9c2V0IG1lZGlhUHJldmlld0ltYWdlKGUpe1UodGhpcyxuLk1FRElBX1BSRVZJRVdfSU1BR0UsZSl9Z2V0IG1lZGlhUHJldmlld1RpbWUoKXtyZXR1cm4gRCh0aGlzLG4uTUVESUFfUFJFVklFV19USU1FKX1zZXQgbWVkaWFQcmV2aWV3VGltZShlKXtIKHRoaXMsbi5NRURJQV9QUkVWSUVXX1RJTUUsZSl9Z2V0IG1lZGlhRW5kZWQoKXtyZXR1cm4gayh0aGlzLG4uTUVESUFfRU5ERUQpfXNldCBtZWRpYUVuZGVkKGUpe3kodGhpcyxuLk1FRElBX0VOREVELGUpfXVwZGF0ZUJhcigpe3N1cGVyLnVwZGF0ZUJhcigpLHRoaXMudXBkYXRlQnVmZmVyZWRCYXIoKSx0aGlzLnVwZGF0ZUN1cnJlbnRCb3goKX11cGRhdGVCdWZmZXJlZEJhcigpe3ZhciBlO2xldCBpPXRoaXMubWVkaWFCdWZmZXJlZDtpZighaS5sZW5ndGgpcmV0dXJuO2xldCBhO2lmKHRoaXMubWVkaWFFbmRlZClhPTE7ZWxzZXtsZXQgcz10aGlzLm1lZGlhQ3VycmVudFRpbWUsWyxvPXRoaXMubWVkaWFTZWVrYWJsZVN0YXJ0XT0oZT1pLmZpbmQoKFtkLHVdKT0+ZDw9cyYmczw9dSkpIT1udWxsP2U6W107YT1HYSh0aGlzLG8pfWxldHtzdHlsZTpyfT1CKHRoaXMuc2hhZG93Um9vdCwiI2J1ZmZlcmVkIik7ci5zZXRQcm9wZXJ0eSgid2lkdGgiLGAke2EqMTAwfSVgKX11cGRhdGVDdXJyZW50Qm94KCl7aWYoIXRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdzbG90W25hbWU9ImN1cnJlbnQiXScpLmFzc2lnbmVkRWxlbWVudHMoKS5sZW5ndGgpcmV0dXJuO2xldCBpPUIodGhpcy5zaGFkb3dSb290LCIjY3VycmVudC1yYWlsIiksYT1CKHRoaXMuc2hhZG93Um9vdCwnW3BhcnR+PSJjdXJyZW50LWJveCJdJykscj11ZSh0aGlzLHphLHBzKS5jYWxsKHRoaXMsTih0aGlzLHFhKSkscz11ZSh0aGlzLFphLEVzKS5jYWxsKHRoaXMscix0aGlzLnJhbmdlLnZhbHVlQXNOdW1iZXIpLG89dWUodGhpcyxYYSx2cykuY2FsbCh0aGlzLHIsdGhpcy5yYW5nZS52YWx1ZUFzTnVtYmVyKTtpLnN0eWxlLnRyYW5zZm9ybT1gdHJhbnNsYXRlWCgke3N9KWAsaS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1fcmFuZ2Utd2lkdGgiLGAke3IucmFuZ2Uud2lkdGh9YCksYS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1fYm94LXNoaWZ0IixgJHtvfWApLGEuc3R5bGUuc2V0UHJvcGVydHkoIi0tX2JveC13aWR0aCIsYCR7ci5ib3gud2lkdGh9cHhgKSxhLnN0eWxlLnNldFByb3BlcnR5KCJ2aXNpYmlsaXR5IiwiaW5pdGlhbCIpfWhhbmRsZUV2ZW50KGUpe3N3aXRjaChzdXBlci5oYW5kbGVFdmVudChlKSxlLnR5cGUpe2Nhc2UiaW5wdXQiOnVlKHRoaXMsaHMsTm8pLmNhbGwodGhpcyk7YnJlYWs7Y2FzZSJwb2ludGVybW92ZSI6dWUodGhpcyxjcyxQbykuY2FsbCh0aGlzLGUpO2JyZWFrO2Nhc2UicG9pbnRlcnVwIjpOKHRoaXMsUXQpJiZkZSh0aGlzLFF0LCExKTticmVhaztjYXNlInBvaW50ZXJkb3duIjpkZSh0aGlzLFF0LCEwKTticmVhaztjYXNlInBvaW50ZXJsZWF2ZSI6dWUodGhpcyxSaSxKYSkuY2FsbCh0aGlzLG51bGwpO2JyZWFrO2Nhc2UidHJhbnNpdGlvbnN0YXJ0IjpuZShlLnRhcmdldCx0aGlzKSYmc2V0VGltZW91dCgoKT0+Tih0aGlzLHlpKS5jYWxsKHRoaXMpLDApO2JyZWFrfX19O3F0PW5ldyBXZWFrTWFwO1plPW5ldyBXZWFrTWFwO1lhPW5ldyBXZWFrTWFwO3dpPW5ldyBXZWFrTWFwO1FhPW5ldyBXZWFrTWFwO3FhPW5ldyBXZWFrTWFwO01pPW5ldyBXZWFrTWFwO0xpPW5ldyBXZWFrTWFwO1l0PW5ldyBXZWFrTWFwO1F0PW5ldyBXZWFrTWFwO3lpPW5ldyBXZWFrTWFwO2RzPW5ldyBXZWFrU2V0O09vPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQmJiF0aGlzLm1lZGlhUGF1c2VkJiYhdGhpcy5tZWRpYUxvYWRpbmcmJiF0aGlzLm1lZGlhRW5kZWQmJnRoaXMubWVkaWFTZWVrYWJsZUVuZD4wJiZpYSh0aGlzKX07dXM9bmV3IFdlYWtNYXA7emE9bmV3IFdlYWtTZXQ7cHM9ZnVuY3Rpb24odCl7dmFyIGU7bGV0IGE9KChlPXRoaXMuZ2V0QXR0cmlidXRlKCJib3VuZHMiKT9UZSh0aGlzLGAjJHt0aGlzLmdldEF0dHJpYnV0ZSgiYm91bmRzIil9YCk6dGhpcy5wYXJlbnRFbGVtZW50KSE9bnVsbD9lOnRoaXMpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9dGhpcy5yYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPXQub2Zmc2V0V2lkdGgsbz0tKHIubGVmdC1hLmxlZnQtcy8yKSxkPWEucmlnaHQtci5sZWZ0LXMvMjtyZXR1cm57Ym94Ont3aWR0aDpzLG1pbjpvLG1heDpkfSxib3VuZHM6YSxyYW5nZTpyfX07WmE9bmV3IFdlYWtTZXQ7RXM9ZnVuY3Rpb24odCxlKXtsZXQgaT1gJHtlKjEwMH0lYCx7d2lkdGg6YSxtaW46cixtYXg6c309dC5ib3g7aWYoIWEpcmV0dXJuIGk7aWYoTnVtYmVyLmlzTmFOKHIpfHwoaT1gbWF4KCR7YGNhbGMoMSAvIHZhcigtLV9yYW5nZS13aWR0aCkgKiAxMDAgKiAke3J9JSArIHZhcigtLW1lZGlhLWJveC1wYWRkaW5nLWxlZnQpKWB9LCAke2l9KWApLCFOdW1iZXIuaXNOYU4ocykpe2xldCBkPWBjYWxjKDEgLyB2YXIoLS1fcmFuZ2Utd2lkdGgpICogMTAwICogJHtzfSUgLSB2YXIoLS1tZWRpYS1ib3gtcGFkZGluZy1yaWdodCkpYDtpPWBtaW4oJHtpfSwgJHtkfSlgfXJldHVybiBpfTtYYT1uZXcgV2Vha1NldDt2cz1mdW5jdGlvbih0LGUpe2xldHt3aWR0aDppLG1pbjphLG1heDpyfT10LmJveCxzPWUqdC5yYW5nZS53aWR0aDtpZihzPGErTih0aGlzLE1pKSl7bGV0IG89dC5yYW5nZS5sZWZ0LXQuYm91bmRzLmxlZnQtTih0aGlzLE1pKTtyZXR1cm5gJHtzLWkvMitvfXB4YH1pZihzPnItTih0aGlzLExpKSl7bGV0IG89dC5ib3VuZHMucmlnaHQtdC5yYW5nZS5yaWdodC1OKHRoaXMsTGkpO3JldHVybmAke3MraS8yLW8tdC5yYW5nZS53aWR0aH1weGB9cmV0dXJuIDB9O2NzPW5ldyBXZWFrU2V0O1BvPWZ1bmN0aW9uKHQpe2xldCBlPVsuLi5OKHRoaXMsWWEpXS5zb21lKFQ9PnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoVCkpO2lmKCF0aGlzLmRyYWdnaW5nJiYoZXx8IXQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcykpKXt1ZSh0aGlzLFJpLEphKS5jYWxsKHRoaXMsbnVsbCk7cmV0dXJufWxldCBpPXRoaXMubWVkaWFTZWVrYWJsZUVuZDtpZighaSlyZXR1cm47bGV0IGE9Qih0aGlzLnNoYWRvd1Jvb3QsIiNwcmV2aWV3LXJhaWwiKSxyPUIodGhpcy5zaGFkb3dSb290LCdbcGFydH49InByZXZpZXctYm94Il0nKSxzPXVlKHRoaXMsemEscHMpLmNhbGwodGhpcyxOKHRoaXMsUWEpKSxvPSh0LmNsaWVudFgtcy5yYW5nZS5sZWZ0KS9zLnJhbmdlLndpZHRoO289TWF0aC5tYXgoMCxNYXRoLm1pbigxLG8pKTtsZXQgZD11ZSh0aGlzLFphLEVzKS5jYWxsKHRoaXMscyxvKSx1PXVlKHRoaXMsWGEsdnMpLmNhbGwodGhpcyxzLG8pO2Euc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGVYKCR7ZH0pYCxhLnN0eWxlLnNldFByb3BlcnR5KCItLV9yYW5nZS13aWR0aCIsYCR7cy5yYW5nZS53aWR0aH1gKSxyLnN0eWxlLnNldFByb3BlcnR5KCItLV9ib3gtc2hpZnQiLGAke3V9YCksci5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1fYm94LXdpZHRoIixgJHtzLmJveC53aWR0aH1weGApO2xldCBfPU1hdGgucm91bmQoTih0aGlzLHdpKSktTWF0aC5yb3VuZChvKmkpO01hdGguYWJzKF8pPDEmJm8+LjAxJiZvPC45OXx8KGRlKHRoaXMsd2ksbyppKSx1ZSh0aGlzLFJpLEphKS5jYWxsKHRoaXMsTih0aGlzLHdpKSkpfTtSaT1uZXcgV2Vha1NldDtKYT1mdW5jdGlvbih0KXt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGwuQ3VzdG9tRXZlbnQoaC5NRURJQV9QUkVWSUVXX1JFUVVFU1Qse2NvbXBvc2VkOiEwLGJ1YmJsZXM6ITAsZGV0YWlsOnR9KSl9O2hzPW5ldyBXZWFrU2V0O05vPWZ1bmN0aW9uKCl7Tih0aGlzLFplKS5zdG9wKCk7bGV0IHQ9Rm8odGhpcyk7dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBsLkN1c3RvbUV2ZW50KGguTUVESUFfU0VFS19SRVFVRVNULHtjb21wb3NlZDohMCxidWJibGVzOiEwLGRldGFpbDp0fSkpfTtEaS5zaGFkb3dSb290T3B0aW9ucz17bW9kZToib3BlbiJ9O0RpLmdldENvbnRhaW5lclRlbXBsYXRlSFRNTD1XZDtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtdGltZS1yYW5nZSIpfHxsLmN1c3RvbUVsZW1lbnRzLmRlZmluZSgibWVkaWEtdGltZS1yYW5nZSIsRGkpO3ZhciBfcz0odCxlLGkpPT57aWYoIWUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIraSl9LEFlPSh0LGUsaSk9Pihfcyh0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLHZ0PSh0LGUsaSk9PntpZihlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtlIGluc3RhbmNlb2YgV2Vha1NldD9lLmFkZCh0KTplLnNldCh0LGkpfSxicz0odCxlLGksYSk9Pihfcyh0LGUsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxhP2EuY2FsbCh0LGkpOmUuc2V0KHQsaSksaSksSmU9KHQsZSxpKT0+KF9zKHQsZSwiYWNjZXNzIHByaXZhdGUgbWV0aG9kIiksaSksenQsQ2UsYXIsQXMsQm8sdHIsVHMsQ2ksamEsZXIsZnMsWGU9e1JFTUFJTklORzoicmVtYWluaW5nIixTSE9XX0RVUkFUSU9OOiJzaG93ZHVyYXRpb24iLE5PX1RPR0dMRToibm90b2dnbGUifSxIbz1bLi4uT2JqZWN0LnZhbHVlcyhYZSksbi5NRURJQV9DVVJSRU5UX1RJTUUsbi5NRURJQV9EVVJBVElPTixuLk1FRElBX1NFRUtBQkxFXSxXbz1bIkVudGVyIiwiICJdLCRkPSImbmJzcDsvJm5ic3A7Iixncz0odCx7dGltZXNTZXA6ZT0kZH09e30pPT57dmFyIGksYTtsZXQgcj0oaT10Lm1lZGlhQ3VycmVudFRpbWUpIT1udWxsP2k6MCxbLHNdPShhPXQubWVkaWFTZWVrYWJsZSkhPW51bGw/YTpbXSxvPTA7TnVtYmVyLmlzRmluaXRlKHQubWVkaWFEdXJhdGlvbik/bz10Lm1lZGlhRHVyYXRpb246TnVtYmVyLmlzRmluaXRlKHMpJiYobz1zKTtsZXQgZD10LnJlbWFpbmluZz9wdCgwLShvLXIpKTpwdChyKTtyZXR1cm4gdC5zaG93RHVyYXRpb24/YCR7ZH0ke2V9JHtwdChvKX1gOmR9LFZkPXQ9Pnt2YXIgZTtsZXQgaT10Lm1lZGlhQ3VycmVudFRpbWUsWyxhXT0oZT10Lm1lZGlhU2Vla2FibGUpIT1udWxsP2U6W10scj1udWxsO2lmKE51bWJlci5pc0Zpbml0ZSh0Lm1lZGlhRHVyYXRpb24pP3I9dC5tZWRpYUR1cmF0aW9uOk51bWJlci5pc0Zpbml0ZShhKSYmKHI9YSksaT09bnVsbHx8cj09PW51bGwpe3Quc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaXB0aW9uIixmKCJ2aWRlbyBub3QgbG9hZGVkLCB1bmtub3duIHRpbWUuIikpO3JldHVybn1sZXQgcz10LnJlbWFpbmluZz9tdCgwLShyLWkpKTptdChpKTtpZighdC5zaG93RHVyYXRpb24pe3Quc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaXB0aW9uIixzKTtyZXR1cm59bGV0IG89bXQociksZD1mKCJ7Y3VycmVudFRpbWV9IG9mIHt0b3RhbFRpbWV9Iix7Y3VycmVudFRpbWU6cyx0b3RhbFRpbWU6b30pO3Quc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaXB0aW9uIixkKX07ZnVuY3Rpb24gS2QodCxlKXtyZXR1cm5gCiAgICA8c2xvdD4ke2dzKGUpfTwvc2xvdD4KICBgfXZhciBHZD10PT57dC5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGYoInBsYXliYWNrIHRpbWUiKSl9LGlyPWNsYXNzIGV4dGVuZHMgbGV7Y29uc3RydWN0b3IoKXtzdXBlcigpLHZ0KHRoaXMsQXMpLHZ0KHRoaXMsdHIpLHZ0KHRoaXMsQ2kpLHZ0KHRoaXMsZXIpLHZ0KHRoaXMsenQsdm9pZCAwKSx2dCh0aGlzLENlLG51bGwpLHZ0KHRoaXMsYXIsZT0+e2xldHttZXRhS2V5OmksYWx0S2V5OmEsa2V5OnJ9PWU7aWYoaXx8YXx8IVdvLmluY2x1ZGVzKHIpKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixBZSh0aGlzLENlKSk7cmV0dXJufXRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLEFlKHRoaXMsQ2UpKX0pLGJzKHRoaXMsenQsdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoInNsb3QiKSksQWUodGhpcyx6dCkuaW5uZXJIVE1MPWAke2dzKHRoaXMpfWB9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLC4uLkhvLCJkaXNhYmxlZCJdfWNvbm5lY3RlZENhbGxiYWNrKCl7bGV0e3N0eWxlOmV9PUIodGhpcy5zaGFkb3dSb290LCI6aG9zdCg6aG92ZXI6bm90KFtub3RvZ2dsZV0pKSIpO2Uuc2V0UHJvcGVydHkoImN1cnNvciIsInZhcigtLW1lZGlhLWN1cnNvciwgcG9pbnRlcikiKSxlLnNldFByb3BlcnR5KCJiYWNrZ3JvdW5kIiwidmFyKC0tbWVkaWEtY29udHJvbC1ob3Zlci1iYWNrZ3JvdW5kLCByZ2JhKDUwIDUwIDcwIC8gLjcpKSIpLHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixmKCJwbGF5YmFjayB0aW1lIikpLEplKHRoaXMsQ2ksamEpLmNhbGwodGhpcyksc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKX10b2dnbGVUaW1lRGlzcGxheSgpe3RoaXMubm9Ub2dnbGV8fCh0aGlzLmhhc0F0dHJpYnV0ZSgicmVtYWluaW5nIik/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoInJlbWFpbmluZyIpOnRoaXMuc2V0QXR0cmlidXRlKCJyZW1haW5pbmciLCIiKSl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLmRpc2FibGUoKSxKZSh0aGlzLHRyLFRzKS5jYWxsKHRoaXMpLHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCl9YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKXtHZCh0aGlzKSxIby5pbmNsdWRlcyhlKT90aGlzLnVwZGF0ZSgpOmU9PT0iZGlzYWJsZWQiJiZhIT09aT9hPT1udWxsP0plKHRoaXMsQ2ksamEpLmNhbGwodGhpcyk6SmUodGhpcyxlcixmcykuY2FsbCh0aGlzKTplPT09WGUuTk9fVE9HR0xFJiZhIT09aSYmKHRoaXMubm9Ub2dnbGU/SmUodGhpcyxlcixmcykuY2FsbCh0aGlzKTpKZSh0aGlzLENpLGphKS5jYWxsKHRoaXMpKSxzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpfWVuYWJsZSgpe3RoaXMubm9Ub2dnbGV8fCh0aGlzLnRhYkluZGV4PTApfWRpc2FibGUoKXt0aGlzLnRhYkluZGV4PS0xfWdldCByZW1haW5pbmcoKXtyZXR1cm4gayh0aGlzLFhlLlJFTUFJTklORyl9c2V0IHJlbWFpbmluZyhlKXt5KHRoaXMsWGUuUkVNQUlOSU5HLGUpfWdldCBzaG93RHVyYXRpb24oKXtyZXR1cm4gayh0aGlzLFhlLlNIT1dfRFVSQVRJT04pfXNldCBzaG93RHVyYXRpb24oZSl7eSh0aGlzLFhlLlNIT1dfRFVSQVRJT04sZSl9Z2V0IG5vVG9nZ2xlKCl7cmV0dXJuIGsodGhpcyxYZS5OT19UT0dHTEUpfXNldCBub1RvZ2dsZShlKXt5KHRoaXMsWGUuTk9fVE9HR0xFLGUpfWdldCBtZWRpYUR1cmF0aW9uKCl7cmV0dXJuIEQodGhpcyxuLk1FRElBX0RVUkFUSU9OKX1zZXQgbWVkaWFEdXJhdGlvbihlKXtIKHRoaXMsbi5NRURJQV9EVVJBVElPTixlKX1nZXQgbWVkaWFDdXJyZW50VGltZSgpe3JldHVybiBEKHRoaXMsbi5NRURJQV9DVVJSRU5UX1RJTUUpfXNldCBtZWRpYUN1cnJlbnRUaW1lKGUpe0godGhpcyxuLk1FRElBX0NVUlJFTlRfVElNRSxlKX1nZXQgbWVkaWFTZWVrYWJsZSgpe2xldCBlPXRoaXMuZ2V0QXR0cmlidXRlKG4uTUVESUFfU0VFS0FCTEUpO2lmKGUpcmV0dXJuIGUuc3BsaXQoIjoiKS5tYXAoaT0+K2kpfXNldCBtZWRpYVNlZWthYmxlKGUpe2lmKGU9PW51bGwpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4uTUVESUFfU0VFS0FCTEUpO3JldHVybn10aGlzLnNldEF0dHJpYnV0ZShuLk1FRElBX1NFRUtBQkxFLGUuam9pbigiOiIpKX11cGRhdGUoKXtsZXQgZT1ncyh0aGlzKTtWZCh0aGlzKSxlIT09QWUodGhpcyx6dCkuaW5uZXJIVE1MJiYoQWUodGhpcyx6dCkuaW5uZXJIVE1MPWUpfX07enQ9bmV3IFdlYWtNYXA7Q2U9bmV3IFdlYWtNYXA7YXI9bmV3IFdlYWtNYXA7QXM9bmV3IFdlYWtTZXQ7Qm89ZnVuY3Rpb24oKXtBZSh0aGlzLENlKXx8KGJzKHRoaXMsQ2UsdD0+e2xldHtrZXk6ZX09dDtpZighV28uaW5jbHVkZXMoZSkpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLEFlKHRoaXMsQ2UpKTtyZXR1cm59dGhpcy50b2dnbGVUaW1lRGlzcGxheSgpfSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBZSh0aGlzLGFyKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy50b2dnbGVUaW1lRGlzcGxheSkpfTt0cj1uZXcgV2Vha1NldDtUcz1mdW5jdGlvbigpe0FlKHRoaXMsQ2UpJiYodGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsQWUodGhpcyxDZSkpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQWUodGhpcyxhcikpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudG9nZ2xlVGltZURpc3BsYXkpLGJzKHRoaXMsQ2UsbnVsbCkpfTtDaT1uZXcgV2Vha1NldDtqYT1mdW5jdGlvbigpeyF0aGlzLm5vVG9nZ2xlJiYhdGhpcy5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikmJih0aGlzLnNldEF0dHJpYnV0ZSgicm9sZSIsImJ1dHRvbiIpLHRoaXMuZW5hYmxlKCksSmUodGhpcyxBcyxCbykuY2FsbCh0aGlzKSl9O2VyPW5ldyBXZWFrU2V0O2ZzPWZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKSx0aGlzLmRpc2FibGUoKSxKZSh0aGlzLHRyLFRzKS5jYWxsKHRoaXMpfTtpci5nZXRTbG90VGVtcGxhdGVIVE1MPUtkO2wuY3VzdG9tRWxlbWVudHMuZ2V0KCJtZWRpYS10aW1lLWRpc3BsYXkiKXx8bC5jdXN0b21FbGVtZW50cy5kZWZpbmUoIm1lZGlhLXRpbWUtZGlzcGxheSIsaXIpO3ZhciBxZD1gPHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBkPSJNMTYuNSAxMkE0LjUgNC41IDAgMCAwIDE0IDh2Mi4xOGwyLjQ1IDIuNDVhNC4yMiA0LjIyIDAgMCAwIC4wNS0uNjNabTIuNSAwYTYuODQgNi44NCAwIDAgMS0uNTQgMi42NEwyMCAxNi4xNUE4LjggOC44IDAgMCAwIDIxIDEyYTkgOSAwIDAgMC03LTguNzd2Mi4wNkE3IDcgMCAwIDEgMTkgMTJaTTQuMjcgMyAzIDQuMjcgNy43MyA5SDN2Nmg0bDUgNXYtNi43M2w0LjI1IDQuMjVBNi45MiA2LjkyIDAgMCAxIDE0IDE4Ljd2Mi4wNkE5IDkgMCAwIDAgMTcuNjkgMTlsMiAyLjA1TDIxIDE5LjczbC05LTlMNC4yNyAzWk0xMiA0IDkuOTEgNi4wOSAxMiA4LjE4VjRaIi8+Cjwvc3ZnPmAsJG89YDxzdmcgYXJpYS1oaWRkZW49InRydWUiIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgPHBhdGggZD0iTTMgOXY2aDRsNSA1VjRMNyA5SDNabTEzLjUgM0E0LjUgNC41IDAgMCAwIDE0IDh2OGE0LjQ3IDQuNDcgMCAwIDAgMi41LTRaIi8+Cjwvc3ZnPmAsWWQ9YDxzdmcgYXJpYS1oaWRkZW49InRydWUiIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgPHBhdGggZD0iTTMgOXY2aDRsNSA1VjRMNyA5SDNabTEzLjUgM0E0LjUgNC41IDAgMCAwIDE0IDh2OGE0LjQ3IDQuNDcgMCAwIDAgMi41LTRaTTE0IDMuMjN2Mi4wNmE3IDcgMCAwIDEgMCAxMy40MnYyLjA2YTkgOSAwIDAgMCAwLTE3LjU0WiIvPgo8L3N2Zz5gO2Z1bmN0aW9uIFFkKHQpe3JldHVybmAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QoOm5vdChbJHtuLk1FRElBX1ZPTFVNRV9MRVZFTH1dKSkgc2xvdFtuYW1lPWljb25dIHNsb3Q6bm90KFtuYW1lPWhpZ2hdKSwKICAgICAgOmhvc3QoWyR7bi5NRURJQV9WT0xVTUVfTEVWRUx9PWhpZ2hdKSBzbG90W25hbWU9aWNvbl0gc2xvdDpub3QoW25hbWU9aGlnaF0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFske24uTUVESUFfVk9MVU1FX0xFVkVMfT1vZmZdKSBzbG90W25hbWU9aWNvbl0gc2xvdDpub3QoW25hbWU9b2ZmXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoWyR7bi5NRURJQV9WT0xVTUVfTEVWRUx9PWxvd10pIHNsb3RbbmFtZT1pY29uXSBzbG90Om5vdChbbmFtZT1sb3ddKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdChbJHtuLk1FRElBX1ZPTFVNRV9MRVZFTH09bWVkaXVtXSkgc2xvdFtuYW1lPWljb25dIHNsb3Q6bm90KFtuYW1lPW1lZGl1bV0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoWyR7bi5NRURJQV9WT0xVTUVfTEVWRUx9PW9mZl0pKSBzbG90W25hbWU9dG9vbHRpcC11bm11dGVdLAogICAgICA6aG9zdChbJHtuLk1FRElBX1ZPTFVNRV9MRVZFTH09b2ZmXSkgc2xvdFtuYW1lPXRvb2x0aXAtbXV0ZV0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3QgbmFtZT0iaWNvbiI+CiAgICAgIDxzbG90IG5hbWU9Im9mZiI+JHtxZH08L3Nsb3Q+CiAgICAgIDxzbG90IG5hbWU9ImxvdyI+JHskb308L3Nsb3Q+CiAgICAgIDxzbG90IG5hbWU9Im1lZGl1bSI+JHskb308L3Nsb3Q+CiAgICAgIDxzbG90IG5hbWU9ImhpZ2giPiR7WWR9PC9zbG90PgogICAgPC9zbG90PgogIGB9ZnVuY3Rpb24gemQoKXtyZXR1cm5gCiAgICA8c2xvdCBuYW1lPSJ0b29sdGlwLW11dGUiPiR7ZigiTXV0ZSIpfTwvc2xvdD4KICAgIDxzbG90IG5hbWU9InRvb2x0aXAtdW5tdXRlIj4ke2YoIlVubXV0ZSIpfTwvc2xvdD4KICBgfXZhciBWbz10PT57bGV0IGk9dC5tZWRpYVZvbHVtZUxldmVsPT09Im9mZiI/ZigidW5tdXRlIik6ZigibXV0ZSIpO3Quc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixpKX0seGk9Y2xhc3MgZXh0ZW5kcyBXe3N0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuWy4uLnN1cGVyLm9ic2VydmVkQXR0cmlidXRlcyxuLk1FRElBX1ZPTFVNRV9MRVZFTF19Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLFZvKHRoaXMpfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSl7c3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKSxlPT09bi5NRURJQV9WT0xVTUVfTEVWRUwmJlZvKHRoaXMpfWdldCBtZWRpYVZvbHVtZUxldmVsKCl7cmV0dXJuIE8odGhpcyxuLk1FRElBX1ZPTFVNRV9MRVZFTCl9c2V0IG1lZGlhVm9sdW1lTGV2ZWwoZSl7VSh0aGlzLG4uTUVESUFfVk9MVU1FX0xFVkVMLGUpfWhhbmRsZUNsaWNrKCl7bGV0IGU9dGhpcy5tZWRpYVZvbHVtZUxldmVsPT09Im9mZiI/aC5NRURJQV9VTk1VVEVfUkVRVUVTVDpoLk1FRElBX01VVEVfUkVRVUVTVDt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGwuQ3VzdG9tRXZlbnQoZSx7Y29tcG9zZWQ6ITAsYnViYmxlczohMH0pKX19O3hpLmdldFNsb3RUZW1wbGF0ZUhUTUw9UWQ7eGkuZ2V0VG9vbHRpcENvbnRlbnRIVE1MPXpkO2wuY3VzdG9tRWxlbWVudHMuZ2V0KCJtZWRpYS1tdXRlLWJ1dHRvbiIpfHxsLmN1c3RvbUVsZW1lbnRzLmRlZmluZSgibWVkaWEtbXV0ZS1idXR0b24iLHhpKTt2YXIgWmQ9KHQsZSxpKT0+e2lmKCFlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCAiK2kpfSxLbz0odCxlLGkpPT4oWmQodCxlLCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpLGk/aS5jYWxsKHQpOmUuZ2V0KHQpKSxYZD0odCxlLGkpPT57aWYoZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7ZSBpbnN0YW5jZW9mIFdlYWtTZXQ/ZS5hZGQodCk6ZS5zZXQodCxpKX0scnIsSmQ9MSxqZD10PT50Lm1lZGlhTXV0ZWQ/MDp0Lm1lZGlhVm9sdW1lLGV1PXQ9PmAke01hdGgucm91bmQodCoxMDApfSVgLFNzPWNsYXNzIGV4dGVuZHMgTWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLFhkKHRoaXMscnIsKCk9PntsZXQgZT10aGlzLnJhbmdlLnZhbHVlLGk9bmV3IGwuQ3VzdG9tRXZlbnQoaC5NRURJQV9WT0xVTUVfUkVRVUVTVCx7Y29tcG9zZWQ6ITAsYnViYmxlczohMCxkZXRhaWw6ZX0pO3RoaXMuZGlzcGF0Y2hFdmVudChpKX0pfXN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuWy4uLnN1cGVyLm9ic2VydmVkQXR0cmlidXRlcyxuLk1FRElBX1ZPTFVNRSxuLk1FRElBX01VVEVELG4uTUVESUFfVk9MVU1FX1VOQVZBSUxBQkxFXX1jb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5yYW5nZS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGYoInZvbHVtZSIpKSx0aGlzLnJhbmdlLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixLbyh0aGlzLHJyKSl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLnJhbmdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImlucHV0IixLbyh0aGlzLHJyKSksc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpe3N1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSksKGU9PT1uLk1FRElBX1ZPTFVNRXx8ZT09PW4uTUVESUFfTVVURUQpJiYodGhpcy5yYW5nZS52YWx1ZUFzTnVtYmVyPWpkKHRoaXMpLHRoaXMucmFuZ2Uuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVldGV4dCIsZXUodGhpcy5yYW5nZS52YWx1ZUFzTnVtYmVyKSksdGhpcy51cGRhdGVCYXIoKSl9Z2V0IG1lZGlhVm9sdW1lKCl7cmV0dXJuIEQodGhpcyxuLk1FRElBX1ZPTFVNRSxKZCl9c2V0IG1lZGlhVm9sdW1lKGUpe0godGhpcyxuLk1FRElBX1ZPTFVNRSxlKX1nZXQgbWVkaWFNdXRlZCgpe3JldHVybiBrKHRoaXMsbi5NRURJQV9NVVRFRCl9c2V0IG1lZGlhTXV0ZWQoZSl7eSh0aGlzLG4uTUVESUFfTVVURUQsZSl9Z2V0IG1lZGlhVm9sdW1lVW5hdmFpbGFibGUoKXtyZXR1cm4gTyh0aGlzLG4uTUVESUFfVk9MVU1FX1VOQVZBSUxBQkxFKX1zZXQgbWVkaWFWb2x1bWVVbmF2YWlsYWJsZShlKXtVKHRoaXMsbi5NRURJQV9WT0xVTUVfVU5BVkFJTEFCTEUsZSl9fTtycj1uZXcgV2Vha01hcDtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtdm9sdW1lLXJhbmdlIil8fGwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJtZWRpYS12b2x1bWUtcmFuZ2UiLFNzKTt2YXIgdHU9KHQsZSxpKT0+e2lmKCFlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCAiK2kpfSxadD0odCxlLGkpPT4odHUodCxlLCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpLGk/aS5jYWxsKHQpOmUuZ2V0KHQpKSxpdT0odCxlLGkpPT57aWYoZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7ZSBpbnN0YW5jZW9mIFdlYWtTZXQ/ZS5hZGQodCk6ZS5zZXQodCxpKX0samUsSXM9e1JBVEVTOiJyYXRlcyJ9LGF1PVsxLDEuMiwxLjUsMS43LDJdLFVpPTE7ZnVuY3Rpb24ga3ModCl7cmV0dXJuIE1hdGgucm91bmQodCoxMDApLzEwMH1mdW5jdGlvbiBydSh0KXtyZXR1cm5gCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtaW4td2lkdGg6IDVjaDsKICAgICAgICBwYWRkaW5nOiB2YXIoLS1tZWRpYS1idXR0b24tcGFkZGluZywgdmFyKC0tbWVkaWEtY29udHJvbC1wYWRkaW5nLCAxMHB4IDVweCkpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3QgbmFtZT0iaWNvbiI+JHt0Lm1lZGlhcGxheWJhY2tyYXRlP2tzKCt0Lm1lZGlhcGxheWJhY2tyYXRlKTpVaX14PC9zbG90PgogIGB9ZnVuY3Rpb24gc3UoKXtyZXR1cm4gZigiUGxheWJhY2sgcmF0ZSIpfXZhciBPaT1jbGFzcyBleHRlbmRzIFd7Y29uc3RydWN0b3IoKXt2YXIgZTtzdXBlcigpLGl1KHRoaXMsamUsbmV3IER0KHRoaXMsSXMuUkFURVMse2RlZmF1bHRWYWx1ZTphdX0pKSx0aGlzLmNvbnRhaW5lcj10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc2xvdFtuYW1lPSJpY29uIl0nKSx0aGlzLmNvbnRhaW5lci5pbm5lckhUTUw9YCR7a3MoKGU9dGhpcy5tZWRpYVBsYXliYWNrUmF0ZSkhPW51bGw/ZTpVaSl9eGB9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLG4uTUVESUFfUExBWUJBQ0tfUkFURSxJcy5SQVRFU119YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKXtpZihzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpLGU9PT1Jcy5SQVRFUyYmKFp0KHRoaXMsamUpLnZhbHVlPWEpLGU9PT1uLk1FRElBX1BMQVlCQUNLX1JBVEUpe2xldCByPWE/K2E6TnVtYmVyLk5hTixzPWtzKE51bWJlci5pc05hTihyKT9VaTpyKTt0aGlzLmNvbnRhaW5lci5pbm5lckhUTUw9YCR7c314YCx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsZigiUGxheWJhY2sgcmF0ZSB7cGxheWJhY2tSYXRlfSIse3BsYXliYWNrUmF0ZTpzfSkpfX1nZXQgcmF0ZXMoKXtyZXR1cm4gWnQodGhpcyxqZSl9c2V0IHJhdGVzKGUpe2U/QXJyYXkuaXNBcnJheShlKT9adCh0aGlzLGplKS52YWx1ZT1lLmpvaW4oIiAiKTp0eXBlb2YgZT09InN0cmluZyImJihadCh0aGlzLGplKS52YWx1ZT1lKTpadCh0aGlzLGplKS52YWx1ZT0iIn1nZXQgbWVkaWFQbGF5YmFja1JhdGUoKXtyZXR1cm4gRCh0aGlzLG4uTUVESUFfUExBWUJBQ0tfUkFURSxVaSl9c2V0IG1lZGlhUGxheWJhY2tSYXRlKGUpe0godGhpcyxuLk1FRElBX1BMQVlCQUNLX1JBVEUsZSl9aGFuZGxlQ2xpY2soKXt2YXIgZSxpO2xldCBhPUFycmF5LmZyb20oWnQodGhpcyxqZSkudmFsdWVzKCksbz0+K28pLnNvcnQoKG8sZCk9Pm8tZCkscj0oaT0oZT1hLmZpbmQobz0+bz50aGlzLm1lZGlhUGxheWJhY2tSYXRlKSkhPW51bGw/ZTphWzBdKSE9bnVsbD9pOlVpLHM9bmV3IGwuQ3VzdG9tRXZlbnQoaC5NRURJQV9QTEFZQkFDS19SQVRFX1JFUVVFU1Qse2NvbXBvc2VkOiEwLGJ1YmJsZXM6ITAsZGV0YWlsOnJ9KTt0aGlzLmRpc3BhdGNoRXZlbnQocyl9fTtqZT1uZXcgV2Vha01hcDtPaS5nZXRTbG90VGVtcGxhdGVIVE1MPXJ1O09pLmdldFRvb2x0aXBDb250ZW50SFRNTD1zdTtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtcGxheWJhY2stcmF0ZS1idXR0b24iKXx8bC5jdXN0b21FbGVtZW50cy5kZWZpbmUoIm1lZGlhLXBsYXliYWNrLXJhdGUtYnV0dG9uIixPaSk7dmFyIEdvPWA8c3ZnIGFyaWEtaGlkZGVuPSJ0cnVlIiB2aWV3Qm94PSIwIDAgMjggMjQiPgogIDxwYXRoIGQ9Ik0yNCAzSDRhMSAxIDAgMCAwLTEgMXYxNmExIDEgMCAwIDAgMSAxaDIwYTEgMSAwIDAgMCAxLTFWNGExIDEgMCAwIDAtMS0xWm0tMSAxNkg1VjVoMTh2MTRabS0zLThoLTd2NWg3di01WiIvPgo8L3N2Zz5gO2Z1bmN0aW9uIG51KHQpe3JldHVybmAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QoWyR7bi5NRURJQV9JU19QSVB9XSkgc2xvdFtuYW1lPWljb25dIHNsb3Q6bm90KFtuYW1lPWV4aXRdKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFske24uTUVESUFfSVNfUElQfV0pKSBzbG90W25hbWU9aWNvbl0gc2xvdDpub3QoW25hbWU9ZW50ZXJdKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdChbJHtuLk1FRElBX0lTX1BJUH1dKSBzbG90W25hbWU9dG9vbHRpcC1lbnRlcl0sCiAgICAgIDpob3N0KDpub3QoWyR7bi5NRURJQV9JU19QSVB9XSkpIHNsb3RbbmFtZT10b29sdGlwLWV4aXRdIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90IG5hbWU9Imljb24iPgogICAgICA8c2xvdCBuYW1lPSJlbnRlciI+JHtHb308L3Nsb3Q+CiAgICAgIDxzbG90IG5hbWU9ImV4aXQiPiR7R299PC9zbG90PgogICAgPC9zbG90PgogIGB9ZnVuY3Rpb24gb3UoKXtyZXR1cm5gCiAgICA8c2xvdCBuYW1lPSJ0b29sdGlwLWVudGVyIj4ke2YoIkVudGVyIHBpY3R1cmUgaW4gcGljdHVyZSBtb2RlIil9PC9zbG90PgogICAgPHNsb3QgbmFtZT0idG9vbHRpcC1leGl0Ij4ke2YoIkV4aXQgcGljdHVyZSBpbiBwaWN0dXJlIG1vZGUiKX08L3Nsb3Q+CiAgYH12YXIgcW89dD0+e2xldCBlPXQubWVkaWFJc1BpcD9mKCJleGl0IHBpY3R1cmUgaW4gcGljdHVyZSBtb2RlIik6ZigiZW50ZXIgcGljdHVyZSBpbiBwaWN0dXJlIG1vZGUiKTt0LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsZSl9LFBpPWNsYXNzIGV4dGVuZHMgV3tzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVyblsuLi5zdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMsbi5NRURJQV9JU19QSVAsbi5NRURJQV9QSVBfVU5BVkFJTEFCTEVdfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSxxbyh0aGlzKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpe3N1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSksZT09PW4uTUVESUFfSVNfUElQJiZxbyh0aGlzKX1nZXQgbWVkaWFQaXBVbmF2YWlsYWJsZSgpe3JldHVybiBPKHRoaXMsbi5NRURJQV9QSVBfVU5BVkFJTEFCTEUpfXNldCBtZWRpYVBpcFVuYXZhaWxhYmxlKGUpe1UodGhpcyxuLk1FRElBX1BJUF9VTkFWQUlMQUJMRSxlKX1nZXQgbWVkaWFJc1BpcCgpe3JldHVybiBrKHRoaXMsbi5NRURJQV9JU19QSVApfXNldCBtZWRpYUlzUGlwKGUpe3kodGhpcyxuLk1FRElBX0lTX1BJUCxlKX1oYW5kbGVDbGljaygpe2xldCBlPXRoaXMubWVkaWFJc1BpcD9oLk1FRElBX0VYSVRfUElQX1JFUVVFU1Q6aC5NRURJQV9FTlRFUl9QSVBfUkVRVUVTVDt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGwuQ3VzdG9tRXZlbnQoZSx7Y29tcG9zZWQ6ITAsYnViYmxlczohMH0pKX19O1BpLmdldFNsb3RUZW1wbGF0ZUhUTUw9bnU7UGkuZ2V0VG9vbHRpcENvbnRlbnRIVE1MPW91O2wuY3VzdG9tRWxlbWVudHMuZ2V0KCJtZWRpYS1waXAtYnV0dG9uIil8fGwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJtZWRpYS1waXAtYnV0dG9uIixQaSk7dmFyIFFvPSh0LGUsaSk9PntpZighZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitpKX0sbHU9KHQsZSxpKT0+KFFvKHQsZSwicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxpP2kuY2FsbCh0KTplLmdldCh0KSksZHU9KHQsZSxpKT0+e2lmKGUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO2UgaW5zdGFuY2VvZiBXZWFrU2V0P2UuYWRkKHQpOmUuc2V0KHQsaSl9LHV1PSh0LGUsaSxhKT0+KFFvKHQsZSwid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZCIpLGE/YS5jYWxsKHQsaSk6ZS5zZXQodCxpKSxpKSxzcixjdT1gPHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDI2IDI0Ij4KICA8cGF0aCBkPSJNMTYgM3YyLjVoMy41VjlIMjJWM2gtNlpNNCA5aDIuNVY1LjVIMTBWM0g0djZabTE1LjUgOS41SDE2VjIxaDZ2LTZoLTIuNXYzLjVaTTYuNSAxNUg0djZoNnYtMi41SDYuNVYxNVoiLz4KPC9zdmc+YCxodT1gPHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDI2IDI0Ij4KICA8cGF0aCBkPSJNMTguNSA2LjVWM0gxNnY2aDZWNi41aC0zLjVaTTE2IDIxaDIuNXYtMy41SDIyVjE1aC02djZaTTQgMTcuNWgzLjVWMjFIMTB2LTZINHYyLjVabTMuNS0xMUg0VjloNlYzSDcuNXYzLjVaIi8+Cjwvc3ZnPmA7ZnVuY3Rpb24gbXUodCl7cmV0dXJuYAogICAgPHN0eWxlPgogICAgICA6aG9zdChbJHtuLk1FRElBX0lTX0ZVTExTQ1JFRU59XSkgc2xvdFtuYW1lPWljb25dIHNsb3Q6bm90KFtuYW1lPWV4aXRdKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAKICAgICAgOmhvc3QoOm5vdChbJHtuLk1FRElBX0lTX0ZVTExTQ1JFRU59XSkpIHNsb3RbbmFtZT1pY29uXSBzbG90Om5vdChbbmFtZT1lbnRlcl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFske24uTUVESUFfSVNfRlVMTFNDUkVFTn1dKSBzbG90W25hbWU9dG9vbHRpcC1lbnRlcl0sCiAgICAgIDpob3N0KDpub3QoWyR7bi5NRURJQV9JU19GVUxMU0NSRUVOfV0pKSBzbG90W25hbWU9dG9vbHRpcC1leGl0XSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBuYW1lPSJpY29uIj4KICAgICAgPHNsb3QgbmFtZT0iZW50ZXIiPiR7Y3V9PC9zbG90PgogICAgICA8c2xvdCBuYW1lPSJleGl0Ij4ke2h1fTwvc2xvdD4KICAgIDwvc2xvdD4KICBgfWZ1bmN0aW9uIHB1KCl7cmV0dXJuYAogICAgPHNsb3QgbmFtZT0idG9vbHRpcC1lbnRlciI+JHtmKCJFbnRlciBmdWxsc2NyZWVuIG1vZGUiKX08L3Nsb3Q+CiAgICA8c2xvdCBuYW1lPSJ0b29sdGlwLWV4aXQiPiR7ZigiRXhpdCBmdWxsc2NyZWVuIG1vZGUiKX08L3Nsb3Q+CiAgYH12YXIgWW89dD0+e2xldCBlPXQubWVkaWFJc0Z1bGxzY3JlZW4/ZigiZXhpdCBmdWxsc2NyZWVuIG1vZGUiKTpmKCJlbnRlciBmdWxsc2NyZWVuIG1vZGUiKTt0LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsZSl9LE5pPWNsYXNzIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksZHUodGhpcyxzcixudWxsKX1zdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVyblsuLi5zdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMsbi5NRURJQV9JU19GVUxMU0NSRUVOLG4uTUVESUFfRlVMTFNDUkVFTl9VTkFWQUlMQUJMRV19Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLFlvKHRoaXMpfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSl7c3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKSxlPT09bi5NRURJQV9JU19GVUxMU0NSRUVOJiZZbyh0aGlzKX1nZXQgbWVkaWFGdWxsc2NyZWVuVW5hdmFpbGFibGUoKXtyZXR1cm4gTyh0aGlzLG4uTUVESUFfRlVMTFNDUkVFTl9VTkFWQUlMQUJMRSl9c2V0IG1lZGlhRnVsbHNjcmVlblVuYXZhaWxhYmxlKGUpe1UodGhpcyxuLk1FRElBX0ZVTExTQ1JFRU5fVU5BVkFJTEFCTEUsZSl9Z2V0IG1lZGlhSXNGdWxsc2NyZWVuKCl7cmV0dXJuIGsodGhpcyxuLk1FRElBX0lTX0ZVTExTQ1JFRU4pfXNldCBtZWRpYUlzRnVsbHNjcmVlbihlKXt5KHRoaXMsbi5NRURJQV9JU19GVUxMU0NSRUVOLGUpfWhhbmRsZUNsaWNrKGUpe3V1KHRoaXMsc3IsZSk7bGV0IGk9bHUodGhpcyxzcilpbnN0YW5jZW9mIFBvaW50ZXJFdmVudCxhPXRoaXMubWVkaWFJc0Z1bGxzY3JlZW4/bmV3IGwuQ3VzdG9tRXZlbnQoaC5NRURJQV9FWElUX0ZVTExTQ1JFRU5fUkVRVUVTVCx7Y29tcG9zZWQ6ITAsYnViYmxlczohMH0pOm5ldyBsLkN1c3RvbUV2ZW50KGguTUVESUFfRU5URVJfRlVMTFNDUkVFTl9SRVFVRVNULHtjb21wb3NlZDohMCxidWJibGVzOiEwLGRldGFpbDppfSk7dGhpcy5kaXNwYXRjaEV2ZW50KGEpfX07c3I9bmV3IFdlYWtNYXA7TmkuZ2V0U2xvdFRlbXBsYXRlSFRNTD1tdTtOaS5nZXRUb29sdGlwQ29udGVudEhUTUw9cHU7bC5jdXN0b21FbGVtZW50cy5nZXQoIm1lZGlhLWZ1bGxzY3JlZW4tYnV0dG9uIil8fGwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJtZWRpYS1mdWxsc2NyZWVuLWJ1dHRvbiIsTmkpO2Z1bmN0aW9uIHpvKHthbmNob3I6dCxmbG9hdGluZzplLHBsYWNlbWVudDppfSl7bGV0IGE9RXUoe2FuY2hvcjp0LGZsb2F0aW5nOmV9KSx7eDpyLHk6c309ZnUoYSxpKTtyZXR1cm57eDpyLHk6c319ZnVuY3Rpb24gRXUoe2FuY2hvcjp0LGZsb2F0aW5nOmV9KXtyZXR1cm57YW5jaG9yOnZ1KHQsZS5vZmZzZXRQYXJlbnQpLGZsb2F0aW5nOnt4OjAseTowLHdpZHRoOmUub2Zmc2V0V2lkdGgsaGVpZ2h0OmUub2Zmc2V0SGVpZ2h0fX19ZnVuY3Rpb24gdnUodCxlKXt2YXIgaTtsZXQgYT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9KGk9ZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpIT1udWxsP2k6e3g6MCx5OjB9O3JldHVybnt4OmEueC1yLngseTphLnktci55LHdpZHRoOmEud2lkdGgsaGVpZ2h0OmEuaGVpZ2h0fX1mdW5jdGlvbiBmdSh7YW5jaG9yOnQsZmxvYXRpbmc6ZX0saSl7bGV0IGE9Z3UoaSk9PT0ieCI/InkiOiJ4IixyPWE9PT0ieSI/ImhlaWdodCI6IndpZHRoIixzPVpvKGkpLG89dC54K3Qud2lkdGgvMi1lLndpZHRoLzIsZD10LnkrdC5oZWlnaHQvMi1lLmhlaWdodC8yLHU9dFtyXS8yLWVbcl0vMixfO3N3aXRjaChzKXtjYXNlInRvcCI6Xz17eDpvLHk6dC55LWUuaGVpZ2h0fTticmVhaztjYXNlImJvdHRvbSI6Xz17eDpvLHk6dC55K3QuaGVpZ2h0fTticmVhaztjYXNlInJpZ2h0IjpfPXt4OnQueCt0LndpZHRoLHk6ZH07YnJlYWs7Y2FzZSJsZWZ0IjpfPXt4OnQueC1lLndpZHRoLHk6ZH07YnJlYWs7ZGVmYXVsdDpfPXt4OnQueCx5OnQueX19c3dpdGNoKGkuc3BsaXQoIi0iKVsxXSl7Y2FzZSJzdGFydCI6X1thXS09dTticmVhaztjYXNlImVuZCI6X1thXSs9dTticmVha31yZXR1cm4gX31mdW5jdGlvbiBabyh0KXtyZXR1cm4gdC5zcGxpdCgiLSIpWzBdfWZ1bmN0aW9uIGd1KHQpe3JldHVyblsidG9wIiwiYm90dG9tIl0uaW5jbHVkZXMoWm8odCkpPyJ5IjoieCJ9dmFyIGV0PWNsYXNzIGV4dGVuZHMgRXZlbnR7Y29uc3RydWN0b3Ioe2FjdGlvbjplPSJhdXRvIixyZWxhdGVkVGFyZ2V0OmksLi4uYX0pe3N1cGVyKCJpbnZva2UiLGEpLHRoaXMuYWN0aW9uPWUsdGhpcy5yZWxhdGVkVGFyZ2V0PWl9fSxucj1jbGFzcyBleHRlbmRzIEV2ZW50e2NvbnN0cnVjdG9yKHtuZXdTdGF0ZTplLG9sZFN0YXRlOmksLi4uYX0pe3N1cGVyKCJ0b2dnbGUiLGEpLHRoaXMubmV3U3RhdGU9ZSx0aGlzLm9sZFN0YXRlPWl9fTt2YXIgTnM9KHQsZSxpKT0+e2lmKCFlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCAiK2kpfSxMPSh0LGUsaSk9PihOcyh0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLEM9KHQsZSxpKT0+e2lmKGUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO2UgaW5zdGFuY2VvZiBXZWFrU2V0P2UuYWRkKHQpOmUuc2V0KHQsaSl9LGNlPSh0LGUsaSxhKT0+KE5zKHQsZSwid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZCIpLGE/YS5jYWxsKHQsaSk6ZS5zZXQodCxpKSxpKSx4PSh0LGUsaSk9PihOcyh0LGUsImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLGkpLHhlLHR0LFdlLG9yLEZpLGd0LFdpLHlzLFhvLHVyLEZzLGNyLGxyLHdzLE1zLEpvLExzLGpvLFJzLGVsLFh0LEp0LGp0LCRpLGhyLEhzLERzLHRsLEJzLGlsLENzLGFsLFdzLHJsLHhzLHNsLFVzLG5sLEhpLG1yLE9zLG9sLEJpLHByLGRyLFBzO2Z1bmN0aW9uICRzKHt0eXBlOnQsdGV4dDplLHZhbHVlOmksY2hlY2tlZDphfSl7bGV0IHI9UC5jcmVhdGVFbGVtZW50KCJtZWRpYS1jaHJvbWUtbWVudS1pdGVtIik7ci50eXBlPXQ/PyIiLHIucGFydC5hZGQoIm1lbnUtaXRlbSIpLHQmJnIucGFydC5hZGQodCksci52YWx1ZT1pLHIuY2hlY2tlZD1hO2xldCBzPVAuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiBzLnRleHRDb250ZW50PWUsci5hcHBlbmQocykscn1mdW5jdGlvbiBFcih0LGUpe2xldCBpPXQucXVlcnlTZWxlY3RvcihgOnNjb3BlID4gW3Nsb3Q9IiR7ZX0iXWApO2lmKGk/Lm5vZGVOYW1lPT0iU0xPVCImJihpPWkuYXNzaWduZWRFbGVtZW50cyh7ZmxhdHRlbjohMH0pWzBdKSxpKXJldHVybiBpPWkuY2xvbmVOb2RlKCEwKSxpO2xldCBhPXQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBbbmFtZT0iJHtlfSJdID4gc3ZnYCk7cmV0dXJuIGE/YS5jbG9uZU5vZGUoITApOiIifWZ1bmN0aW9uIF91KHQpe3JldHVybmAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGZvbnQ6IHZhcigtLW1lZGlhLWZvbnQsCiAgICAgICAgICB2YXIoLS1tZWRpYS1mb250LXdlaWdodCwgbm9ybWFsKQogICAgICAgICAgdmFyKC0tbWVkaWEtZm9udC1zaXplLCAxNHB4KSAvCiAgICAgICAgICB2YXIoLS1tZWRpYS10ZXh0LWNvbnRlbnQtaGVpZ2h0LCB2YXIoLS1tZWRpYS1jb250cm9sLWhlaWdodCwgMjRweCkpCiAgICAgICAgICB2YXIoLS1tZWRpYS1mb250LWZhbWlseSwgaGVsdmV0aWNhIG5ldWUsIHNlZ29lIHVpLCByb2JvdG8sIGFyaWFsLCBzYW5zLXNlcmlmKSk7CiAgICAgICAgY29sb3I6IHZhcigtLW1lZGlhLXRleHQtY29sb3IsIHZhcigtLW1lZGlhLXByaW1hcnktY29sb3IsIHJnYigyMzggMjM4IDIzOCkpKTsKICAgICAgICAtLV9tZW51LWJnOiByZ2IoMjAgMjAgMzAgLyAuOCk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtbWVudS1iYWNrZ3JvdW5kLCB2YXIoLS1tZWRpYS1jb250cm9sLWJhY2tncm91bmQsIHZhcigtLW1lZGlhLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tX21lbnUtYmcpKSkpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1lZGlhLW1lbnUtYm9yZGVyLXJhZGl1cyk7CiAgICAgICAgYm9yZGVyOiB2YXIoLS1tZWRpYS1tZW51LWJvcmRlciwgbm9uZSk7CiAgICAgICAgZGlzcGxheTogdmFyKC0tbWVkaWEtbWVudS1kaXNwbGF5LCBpbmxpbmUtZmxleCkgIWltcG9ydGFudDsKICAgICAgICAKICAgICAgICB0cmFuc2l0aW9uOiB2YXIoLS1tZWRpYS1tZW51LXRyYW5zaXRpb24taW4sCiAgICAgICAgICB2aXNpYmlsaXR5IDBzLAogICAgICAgICAgb3BhY2l0eSAuMnMgZWFzZS1vdXQsCiAgICAgICAgICB0cmFuc2Zvcm0gLjE1cyBlYXNlLW91dCwKICAgICAgICAgIGxlZnQgLjJzIGVhc2UtaW4tb3V0LAogICAgICAgICAgbWluLXdpZHRoIC4ycyBlYXNlLWluLW91dCwKICAgICAgICAgIG1pbi1oZWlnaHQgLjJzIGVhc2UtaW4tb3V0CiAgICAgICAgKSAhaW1wb3J0YW50OwogICAgICAgIAogICAgICAgIHZpc2liaWxpdHk6IHZhcigtLW1lZGlhLW1lbnUtdmlzaWJpbGl0eSwgdmlzaWJsZSk7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tbWVkaWEtbWVudS1vcGFjaXR5LCAxKTsKICAgICAgICBtYXgtaGVpZ2h0OiB2YXIoLS1tZWRpYS1tZW51LW1heC1oZWlnaHQsIHZhcigtLV9tZW51LW1heC1oZWlnaHQsIDMwMHB4KSk7CiAgICAgICAgdHJhbnNmb3JtOiB2YXIoLS1tZWRpYS1tZW51LXRyYW5zZm9ybS1pbiwgdHJhbnNsYXRlWSgwKSBzY2FsZSgxKSk7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3R0b206IHZhcigtLV9tZW51LWJvdHRvbSk7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfSAKCiAgICAgIEAtbW96LWRvY3VtZW50IHVybC1wcmVmaXgoKSB7CiAgICAgICAgOmhvc3R7CiAgICAgICAgICAtLV9tZW51LWJnOiByZ2IoMjAgMjAgMzApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICB0cmFuc2l0aW9uOiB2YXIoLS1tZWRpYS1tZW51LXRyYW5zaXRpb24tb3V0LAogICAgICAgICAgdmlzaWJpbGl0eSAuMTVzIGVhc2UtaW4sCiAgICAgICAgICBvcGFjaXR5IC4xNXMgZWFzZS1pbiwKICAgICAgICAgIHRyYW5zZm9ybSAuMTVzIGVhc2UtaW4KICAgICAgICApICFpbXBvcnRhbnQ7CiAgICAgICAgdmlzaWJpbGl0eTogdmFyKC0tbWVkaWEtbWVudS1oaWRkZW4tdmlzaWJpbGl0eSwgaGlkZGVuKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1tZWRpYS1tZW51LWhpZGRlbi1vcGFjaXR5LCAwKTsKICAgICAgICBtYXgtaGVpZ2h0OiB2YXIoLS1tZWRpYS1tZW51LWhpZGRlbi1tYXgtaGVpZ2h0LAogICAgICAgICAgdmFyKC0tbWVkaWEtbWVudS1tYXgtaGVpZ2h0LCB2YXIoLS1fbWVudS1tYXgtaGVpZ2h0LCAzMDBweCkpKTsKICAgICAgICB0cmFuc2Zvcm06IHZhcigtLW1lZGlhLW1lbnUtdHJhbnNmb3JtLW91dCwgdHJhbnNsYXRlWSgycHgpIHNjYWxlKC45OSkpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbc2xvdD0ic3VibWVudSJdKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtaW4taGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IC0xMDAlOwogICAgICB9CgogICAgICAjY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjJzIGVhc2Utb3V0OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApOwogICAgICB9CgogICAgICAjY29udGFpbmVyLmhhcy1leHBhbmRlZCB7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC4ycyBlYXNlLWluOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDAlLCAwKTsKICAgICAgfQoKICAgICAgYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgb3V0bGluZTogaW5oZXJpdDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICBzbG90W25hbWU9ImhlYWRlciJdW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIHNsb3RbbmFtZT0iaGVhZGVyIl0gPiAqLAogICAgICBzbG90W25hbWU9ImhlYWRlciJdOjpzbG90dGVkKCopIHsKICAgICAgICBwYWRkaW5nOiAuNGVtIC43ZW07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigyNTUgMjU1IDI1NSAvIC4yNSk7CiAgICAgICAgY3Vyc29yOiB2YXIoLS1tZWRpYS1jdXJzb3IsIGRlZmF1bHQpOwogICAgICB9CgogICAgICBzbG90W25hbWU9ImhlYWRlciJdID4gYnV0dG9uW3BhcnR+PSJiYWNrIl0sCiAgICAgIHNsb3RbbmFtZT0iaGVhZGVyIl06OnNsb3R0ZWQoYnV0dG9uW3BhcnR+PSJiYWNrIl0pIHsKICAgICAgICBjdXJzb3I6IHZhcigtLW1lZGlhLWN1cnNvciwgcG9pbnRlcik7CiAgICAgIH0KCiAgICAgIHN2Z1twYXJ0fj0iYmFjayJdIHsKICAgICAgICBoZWlnaHQ6IHZhcigtLW1lZGlhLW1lbnUtaWNvbi1oZWlnaHQsIHZhcigtLW1lZGlhLWNvbnRyb2wtaGVpZ2h0LCAyNHB4KSk7CiAgICAgICAgZmlsbDogdmFyKC0tbWVkaWEtaWNvbi1jb2xvciwgdmFyKC0tbWVkaWEtcHJpbWFyeS1jb2xvciwgcmdiKDIzOCAyMzggMjM4KSkpOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1yaWdodDogLjVjaDsKICAgICAgfQoKICAgICAgc2xvdDpub3QoW25hbWVdKSB7CiAgICAgICAgZ2FwOiB2YXIoLS1tZWRpYS1tZW51LWdhcCk7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHZhcigtLW1lZGlhLW1lbnUtZmxleC1kaXJlY3Rpb24sIGNvbHVtbik7CiAgICAgICAgb3ZlcmZsb3c6IHZhcigtLW1lZGlhLW1lbnUtb3ZlcmZsb3csIGhpZGRlbiBhdXRvKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtyb2xlPSJtZW51Il0pIHNsb3Q6bm90KFtuYW1lXSkgewogICAgICAgIHBhZGRpbmctYmxvY2s6IC40ZW07CiAgICAgIH0KCiAgICAgIHNsb3Q6bm90KFtuYW1lXSk6OnNsb3R0ZWQoW3JvbGU9Im1lbnUiXSkgewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIH0KCiAgICAgIG1lZGlhLWNocm9tZS1tZW51LWl0ZW0gPiBzcGFuIHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IC41Y2g7CiAgICAgICAgbWF4LXdpZHRoOiB2YXIoLS1tZWRpYS1tZW51LWl0ZW0tbWF4LXdpZHRoKTsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHN0eWxlIGlkPSJsYXlvdXQtcm93IiBtZWRpYT0id2lkdGg6MCI+CgogICAgICBzbG90W25hbWU9ImhlYWRlciJdID4gKiwKICAgICAgc2xvdFtuYW1lPSJoZWFkZXIiXTo6c2xvdHRlZCgqKSB7CiAgICAgICAgcGFkZGluZzogLjRlbSAuNWVtOwogICAgICB9CgogICAgICBzbG90Om5vdChbbmFtZV0pIHsKICAgICAgICBnYXA6IHZhcigtLW1lZGlhLW1lbnUtZ2FwLCAuMjVlbSk7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHZhcigtLW1lZGlhLW1lbnUtZmxleC1kaXJlY3Rpb24sIHJvdyk7CiAgICAgICAgcGFkZGluZy1pbmxpbmU6IC41ZW07CiAgICAgIH0KCiAgICAgIG1lZGlhLWNocm9tZS1tZW51LWl0ZW0gewogICAgICAgIHBhZGRpbmc6IC4zZW0gLjVlbTsKICAgICAgfQoKICAgICAgbWVkaWEtY2hyb21lLW1lbnUtaXRlbVthcmlhLWNoZWNrZWQ9InRydWUiXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtbWVudS1pdGVtLWNoZWNrZWQtYmFja2dyb3VuZCwgcmdiKDI1NSAyNTUgMjU1IC8gLjIpKTsKICAgICAgfQoKICAgICAgCiAgICAgIG1lZGlhLWNocm9tZS1tZW51LWl0ZW06OnBhcnQoY2hlY2tlZC1pbmRpY2F0b3IpIHsKICAgICAgICBkaXNwbGF5OiB2YXIoLS1tZWRpYS1tZW51LWl0ZW0tY2hlY2tlZC1pbmRpY2F0b3ItZGlzcGxheSwgbm9uZSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiIHBhcnQ9ImNvbnRhaW5lciI+CiAgICAgIDxzbG90IG5hbWU9ImhlYWRlciIgaGlkZGVuPgogICAgICAgIDxidXR0b24gcGFydD0iYmFjayBidXR0b24iIGFyaWEtbGFiZWw9IkJhY2sgdG8gcHJldmlvdXMgbWVudSI+CiAgICAgICAgICA8c2xvdCBuYW1lPSJiYWNrLWljb24iPgogICAgICAgICAgICA8c3ZnIGFyaWEtaGlkZGVuPSJ0cnVlIiB2aWV3Qm94PSIwIDAgMjAgMjQiIHBhcnQ9ImJhY2sgaW5kaWNhdG9yIj4KICAgICAgICAgICAgICA8cGF0aCBkPSJtMTEuODggMTcuNTg1Ljc0Mi0uNjY5LTQuMi00LjY2NSA0LjItNC42NjYtLjc0My0uNjY5LTQuODAzIDUuMzM1IDQuODAzIDUuMzM0WiIvPgogICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgIDwvc2xvdD4KICAgICAgICAgIDxzbG90IG5hbWU9InRpdGxlIj48L3Nsb3Q+CiAgICAgICAgPC9idXR0b24+CiAgICAgIDwvc2xvdD4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgICA8c2xvdCBuYW1lPSJjaGVja2VkLWluZGljYXRvciIgaGlkZGVuPjwvc2xvdD4KICBgfXZhciBmdD17U1RZTEU6InN0eWxlIixISURERU46ImhpZGRlbiIsRElTQUJMRUQ6ImRpc2FibGVkIixBTkNIT1I6ImFuY2hvciJ9LGl0PWNsYXNzIGV4dGVuZHMgbC5IVE1MRWxlbWVudHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksQyh0aGlzLHlzKSxDKHRoaXMsdXIpLEModGhpcyxsciksQyh0aGlzLE1zKSxDKHRoaXMsTHMpLEModGhpcyxScyksQyh0aGlzLGp0KSxDKHRoaXMsaHIpLEModGhpcyxEcyksQyh0aGlzLEJzKSxDKHRoaXMsQ3MpLEModGhpcyxXcyksQyh0aGlzLHhzKSxDKHRoaXMsVXMpLEModGhpcyxIaSksQyh0aGlzLE9zKSxDKHRoaXMsQmkpLEModGhpcyxkciksQyh0aGlzLHhlLG51bGwpLEModGhpcyx0dCxudWxsKSxDKHRoaXMsV2UsbnVsbCksQyh0aGlzLG9yLG5ldyBTZXQpLEModGhpcyxGaSx2b2lkIDApLEModGhpcyxndCwhMSksQyh0aGlzLFdpLG51bGwpLEModGhpcyxjciwoKT0+e2xldCBlPUwodGhpcyxvciksaT1uZXcgU2V0KHRoaXMuaXRlbXMpO2ZvcihsZXQgYSBvZiBlKWkuaGFzKGEpfHx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZW1vdmVtZW51aXRlbSIse2RldGFpbDphfSkpO2ZvcihsZXQgYSBvZiBpKWUuaGFzKGEpfHx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJhZGRtZW51aXRlbSIse2RldGFpbDphfSkpO2NlKHRoaXMsb3IsaSl9KSxDKHRoaXMsWHQsKCk9Pnt4KHRoaXMsanQsJGkpLmNhbGwodGhpcykseCh0aGlzLGhyLEhzKS5jYWxsKHRoaXMsITEpfSksQyh0aGlzLEp0LCgpPT57eCh0aGlzLGp0LCRpKS5jYWxsKHRoaXMpfSksIXRoaXMuc2hhZG93Um9vdCl7dGhpcy5hdHRhY2hTaGFkb3codGhpcy5jb25zdHJ1Y3Rvci5zaGFkb3dSb290T3B0aW9ucyk7bGV0IGU9Ryh0aGlzLmF0dHJpYnV0ZXMpO3RoaXMuc2hhZG93Um9vdC5pbm5lckhUTUw9dGhpcy5jb25zdHJ1Y3Rvci5nZXRUZW1wbGF0ZUhUTUwoZSl9dGhpcy5jb250YWluZXI9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIiNjb250YWluZXIiKSx0aGlzLmRlZmF1bHRTbG90PXRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJzbG90Om5vdChbbmFtZV0pIiksY2UodGhpcyxGaSxuZXcgTXV0YXRpb25PYnNlcnZlcihMKHRoaXMsY3IpKSl9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bZnQuRElTQUJMRUQsZnQuSElEREVOLGZ0LlNUWUxFLGZ0LkFOQ0hPUix3Lk1FRElBX0NPTlRST0xMRVJdfXN0YXRpYyBmb3JtYXRNZW51SXRlbVRleHQoZSxpKXtyZXR1cm4gZX1lbmFibGUoKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0Iix0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiaW52b2tlIix0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInRvZ2dsZSIsdGhpcyl9ZGlzYWJsZSgpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXNvdXQiLHRoaXMpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLHRoaXMpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW52b2tlIix0aGlzKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvZ2dsZSIsdGhpcyl9aGFuZGxlRXZlbnQoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSJzbG90Y2hhbmdlIjp4KHRoaXMseXMsWG8pLmNhbGwodGhpcyxlKTticmVhaztjYXNlImludm9rZSI6eCh0aGlzLE1zLEpvKS5jYWxsKHRoaXMsZSk7YnJlYWs7Y2FzZSJjbGljayI6eCh0aGlzLERzLHRsKS5jYWxsKHRoaXMsZSk7YnJlYWs7Y2FzZSJ0b2dnbGUiOngodGhpcyxDcyxhbCkuY2FsbCh0aGlzLGUpO2JyZWFrO2Nhc2UiZm9jdXNvdXQiOngodGhpcyx4cyxzbCkuY2FsbCh0aGlzLGUpO2JyZWFrO2Nhc2Uia2V5ZG93biI6eCh0aGlzLFVzLG5sKS5jYWxsKHRoaXMsZSk7YnJlYWt9fWNvbm5lY3RlZENhbGxiYWNrKCl7dmFyIGUsaTtMKHRoaXMsRmkpLm9ic2VydmUodGhpcy5kZWZhdWx0U2xvdCx7Y2hpbGRMaXN0OiEwfSksY2UodGhpcyxXaSxsaSh0aGlzLnNoYWRvd1Jvb3QsIjpob3N0IikpLHgodGhpcyxscix3cykuY2FsbCh0aGlzKSx0aGlzLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8dGhpcy5lbmFibGUoKSx0aGlzLnJvbGV8fCh0aGlzLnJvbGU9Im1lbnUiKSxjZSh0aGlzLHhlLGppKHRoaXMpKSwoaT0oZT1MKHRoaXMseGUpKT09bnVsbD92b2lkIDA6ZS5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8aS5jYWxsKGUsdGhpcyksdGhpcy5oaWRkZW58fChOZShWaSh0aGlzKSxMKHRoaXMsWHQpKSxOZSh0aGlzLEwodGhpcyxKdCkpKSx4KHRoaXMsdXIsRnMpLmNhbGwodGhpcyksdGhpcy5zaGFkb3dSb290LmFkZEV2ZW50TGlzdGVuZXIoInNsb3RjaGFuZ2UiLHRoaXMpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7dmFyIGUsaTtMKHRoaXMsRmkpLmRpc2Nvbm5lY3QoKSxGZShWaSh0aGlzKSxMKHRoaXMsWHQpKSxGZSh0aGlzLEwodGhpcyxKdCkpLHRoaXMuZGlzYWJsZSgpLChpPShlPUwodGhpcyx4ZSkpPT1udWxsP3ZvaWQgMDplLnVuYXNzb2NpYXRlRWxlbWVudCk9PW51bGx8fGkuY2FsbChlLHRoaXMpLGNlKHRoaXMseGUsbnVsbCksY2UodGhpcyx0dCxudWxsKSxjZSh0aGlzLFdlLG51bGwpLHRoaXMuc2hhZG93Um9vdC5yZW1vdmVFdmVudExpc3RlbmVyKCJzbG90Y2hhbmdlIix0aGlzKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpe3ZhciByLHMsbyxkO2U9PT1mdC5ISURERU4mJmEhPT1pPyhMKHRoaXMsZ3QpfHxjZSh0aGlzLGd0LCEwKSx0aGlzLmhpZGRlbj94KHRoaXMsUnMsZWwpLmNhbGwodGhpcyk6eCh0aGlzLExzLGpvKS5jYWxsKHRoaXMpLHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgbnIoe29sZFN0YXRlOnRoaXMuaGlkZGVuPyJvcGVuIjoiY2xvc2VkIixuZXdTdGF0ZTp0aGlzLmhpZGRlbj8iY2xvc2VkIjoib3BlbiIsYnViYmxlczohMH0pKSk6ZT09PXcuTUVESUFfQ09OVFJPTExFUj8oaSYmKChzPShyPUwodGhpcyx4ZSkpPT1udWxsP3ZvaWQgMDpyLnVuYXNzb2NpYXRlRWxlbWVudCk9PW51bGx8fHMuY2FsbChyLHRoaXMpLGNlKHRoaXMseGUsbnVsbCkpLGEmJnRoaXMuaXNDb25uZWN0ZWQmJihjZSh0aGlzLHhlLGppKHRoaXMpKSwoZD0obz1MKHRoaXMseGUpKT09bnVsbD92b2lkIDA6by5hc3NvY2lhdGVFbGVtZW50KT09bnVsbHx8ZC5jYWxsKG8sdGhpcykpKTplPT09ZnQuRElTQUJMRUQmJmEhPT1pP2E9PW51bGw/dGhpcy5lbmFibGUoKTp0aGlzLmRpc2FibGUoKTplPT09ZnQuU1RZTEUmJmEhPT1pJiZ4KHRoaXMsbHIsd3MpLmNhbGwodGhpcyl9Zm9ybWF0TWVudUl0ZW1UZXh0KGUsaSl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuZm9ybWF0TWVudUl0ZW1UZXh0KGUsaSl9Z2V0IGFuY2hvcigpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgiYW5jaG9yIil9c2V0IGFuY2hvcihlKXt0aGlzLnNldEF0dHJpYnV0ZSgiYW5jaG9yIixgJHtlfWApfWdldCBhbmNob3JFbGVtZW50KCl7dmFyIGU7cmV0dXJuIHRoaXMuYW5jaG9yPyhlPXN0KHRoaXMpKT09bnVsbD92b2lkIDA6ZS5xdWVyeVNlbGVjdG9yKGAjJHt0aGlzLmFuY2hvcn1gKTpudWxsfWdldCBpdGVtcygpe3JldHVybiB0aGlzLmRlZmF1bHRTbG90LmFzc2lnbmVkRWxlbWVudHMoe2ZsYXR0ZW46ITB9KS5maWx0ZXIoYnUpfWdldCByYWRpb0dyb3VwSXRlbXMoKXtyZXR1cm4gdGhpcy5pdGVtcy5maWx0ZXIoZT0+ZS5yb2xlPT09Im1lbnVpdGVtcmFkaW8iKX1nZXQgY2hlY2tlZEl0ZW1zKCl7cmV0dXJuIHRoaXMuaXRlbXMuZmlsdGVyKGU9PmUuY2hlY2tlZCl9Z2V0IHZhbHVlKCl7dmFyIGUsaTtyZXR1cm4oaT0oZT10aGlzLmNoZWNrZWRJdGVtc1swXSk9PW51bGw/dm9pZCAwOmUudmFsdWUpIT1udWxsP2k6IiJ9c2V0IHZhbHVlKGUpe2xldCBpPXRoaXMuaXRlbXMuZmluZChhPT5hLnZhbHVlPT09ZSk7aSYmeCh0aGlzLGRyLFBzKS5jYWxsKHRoaXMsaSl9Zm9jdXMoKXtpZihjZSh0aGlzLHR0LE1yKCkpLHRoaXMuaXRlbXMubGVuZ3RoKXt4KHRoaXMsQmkscHIpLmNhbGwodGhpcyx0aGlzLml0ZW1zWzBdKSx0aGlzLml0ZW1zWzBdLmZvY3VzKCk7cmV0dXJufWxldCBlPXRoaXMucXVlcnlTZWxlY3RvcignW2F1dG9mb2N1c10sIFt0YWJpbmRleF06bm90KFt0YWJpbmRleD0iLTEiXSksIFtyb2xlPSJtZW51Il0nKTtlPy5mb2N1cygpfWhhbmRsZVNlbGVjdChlKXt2YXIgaTtsZXQgYT14KHRoaXMsSGksbXIpLmNhbGwodGhpcyxlKTthJiYoeCh0aGlzLGRyLFBzKS5jYWxsKHRoaXMsYSxhLnR5cGU9PT0iY2hlY2tib3giKSxMKHRoaXMsV2UpJiYhdGhpcy5oaWRkZW4mJigoaT1MKHRoaXMsdHQpKT09bnVsbHx8aS5mb2N1cygpLHRoaXMuaGlkZGVuPSEwKSl9Z2V0IGtleXNVc2VkKCl7cmV0dXJuWyJFbnRlciIsIkVzY2FwZSIsIlRhYiIsIiAiLCJBcnJvd0Rvd24iLCJBcnJvd1VwIiwiSG9tZSIsIkVuZCJdfWhhbmRsZU1vdmUoZSl7dmFyIGksYTtsZXR7a2V5OnJ9PWUscz10aGlzLml0ZW1zLG89KGE9KGk9eCh0aGlzLEhpLG1yKS5jYWxsKHRoaXMsZSkpIT1udWxsP2k6eCh0aGlzLE9zLG9sKS5jYWxsKHRoaXMpKSE9bnVsbD9hOnNbMF0sZD1zLmluZGV4T2YobyksdT1NYXRoLm1heCgwLGQpO3I9PT0iQXJyb3dEb3duIj91Kys6cj09PSJBcnJvd1VwIj91LS06ZS5rZXk9PT0iSG9tZSI/dT0wOmUua2V5PT09IkVuZCImJih1PXMubGVuZ3RoLTEpLHU8MCYmKHU9cy5sZW5ndGgtMSksdT5zLmxlbmd0aC0xJiYodT0wKSx4KHRoaXMsQmkscHIpLmNhbGwodGhpcyxzW3VdKSxzW3VdLmZvY3VzKCl9fTt4ZT1uZXcgV2Vha01hcDt0dD1uZXcgV2Vha01hcDtXZT1uZXcgV2Vha01hcDtvcj1uZXcgV2Vha01hcDtGaT1uZXcgV2Vha01hcDtndD1uZXcgV2Vha01hcDtXaT1uZXcgV2Vha01hcDt5cz1uZXcgV2Vha1NldDtYbz1mdW5jdGlvbih0KXtsZXQgZT10LnRhcmdldDtmb3IobGV0IGkgb2YgZS5hc3NpZ25lZE5vZGVzKHtmbGF0dGVuOiEwfSkpaS5ub2RlVHlwZT09PTMmJmkudGV4dENvbnRlbnQudHJpbSgpPT09IiImJmkucmVtb3ZlKCk7WyJoZWFkZXIiLCJ0aXRsZSJdLmluY2x1ZGVzKGUubmFtZSkmJngodGhpcyx1cixGcykuY2FsbCh0aGlzKSxlLm5hbWV8fEwodGhpcyxjcikuY2FsbCh0aGlzKX07dXI9bmV3IFdlYWtTZXQ7RnM9ZnVuY3Rpb24oKXtsZXQgdD10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc2xvdFtuYW1lPSJoZWFkZXIiXScpLGU9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3Nsb3RbbmFtZT0idGl0bGUiXScpO3QuaGlkZGVuPWUuYXNzaWduZWROb2RlcygpLmxlbmd0aD09PTAmJnQuYXNzaWduZWROb2RlcygpLmxlbmd0aD09PTB9O2NyPW5ldyBXZWFrTWFwO2xyPW5ldyBXZWFrU2V0O3dzPWZ1bmN0aW9uKCl7dmFyIHQ7bGV0IGU9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIiNsYXlvdXQtcm93IiksaT0odD1nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmdldFByb3BlcnR5VmFsdWUoIi0tbWVkaWEtbWVudS1sYXlvdXQiKSk9PW51bGw/dm9pZCAwOnQudHJpbSgpO2Uuc2V0QXR0cmlidXRlKCJtZWRpYSIsaT09PSJyb3ciPyIiOiJ3aWR0aDowIil9O01zPW5ldyBXZWFrU2V0O0pvPWZ1bmN0aW9uKHQpe2NlKHRoaXMsV2UsdC5yZWxhdGVkVGFyZ2V0KSxuZSh0aGlzLHQucmVsYXRlZFRhcmdldCl8fCh0aGlzLmhpZGRlbj0hdGhpcy5oaWRkZW4pfTtMcz1uZXcgV2Vha1NldDtqbz1mdW5jdGlvbigpe3ZhciB0Oyh0PUwodGhpcyxXZSkpPT1udWxsfHx0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsInRydWUiKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLCgpPT50aGlzLmZvY3VzKCkse29uY2U6ITB9KSxOZShWaSh0aGlzKSxMKHRoaXMsWHQpKSxOZSh0aGlzLEwodGhpcyxKdCkpfTtScz1uZXcgV2Vha1NldDtlbD1mdW5jdGlvbigpe3ZhciB0Oyh0PUwodGhpcyxXZSkpPT1udWxsfHx0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsImZhbHNlIiksRmUoVmkodGhpcyksTCh0aGlzLFh0KSksRmUodGhpcyxMKHRoaXMsSnQpKX07WHQ9bmV3IFdlYWtNYXA7SnQ9bmV3IFdlYWtNYXA7anQ9bmV3IFdlYWtTZXQ7JGk9ZnVuY3Rpb24odCl7aWYodGhpcy5oYXNBdHRyaWJ1dGUoIm1lZGlhY29udHJvbGxlciIpJiYhdGhpcy5hbmNob3J8fHRoaXMuaGlkZGVufHwhdGhpcy5hbmNob3JFbGVtZW50KXJldHVybjtsZXR7eDplLHk6aX09em8oe2FuY2hvcjp0aGlzLmFuY2hvckVsZW1lbnQsZmxvYXRpbmc6dGhpcyxwbGFjZW1lbnQ6InRvcC1zdGFydCJ9KTt0Pz8odD10aGlzLm9mZnNldFdpZHRoKTtsZXQgcj1WaSh0aGlzKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPXIud2lkdGgtZS10LG89ci5oZWlnaHQtaS10aGlzLm9mZnNldEhlaWdodCx7c3R5bGU6ZH09TCh0aGlzLFdpKTtkLnNldFByb3BlcnR5KCJwb3NpdGlvbiIsImFic29sdXRlIiksZC5zZXRQcm9wZXJ0eSgicmlnaHQiLGAke01hdGgubWF4KDAscyl9cHhgKSxkLnNldFByb3BlcnR5KCItLV9tZW51LWJvdHRvbSIsYCR7b31weGApO2xldCB1PWdldENvbXB1dGVkU3R5bGUodGhpcyksVD1kLmdldFByb3BlcnR5VmFsdWUoIi0tX21lbnUtYm90dG9tIik9PT11LmJvdHRvbT9vOnBhcnNlRmxvYXQodS5ib3R0b20pLEE9ci5oZWlnaHQtVC1wYXJzZUZsb2F0KHUubWFyZ2luQm90dG9tKTt0aGlzLnN0eWxlLnNldFByb3BlcnR5KCItLV9tZW51LW1heC1oZWlnaHQiLGAke0F9cHhgKX07aHI9bmV3IFdlYWtTZXQ7SHM9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcy5xdWVyeVNlbGVjdG9yKCdbcm9sZT0ibWVudWl0ZW0iXVthcmlhLWhhc3BvcHVwXVthcmlhLWV4cGFuZGVkPSJ0cnVlIl0nKSxpPWU/LnF1ZXJ5U2VsZWN0b3IoJ1tyb2xlPSJtZW51Il0nKSx7c3R5bGU6YX09TCh0aGlzLFdpKTtpZih0fHxhLnNldFByb3BlcnR5KCItLW1lZGlhLW1lbnUtdHJhbnNpdGlvbi1pbiIsIm5vbmUiKSxpKXtsZXQgcj1pLm9mZnNldEhlaWdodCxzPU1hdGgubWF4KGkub2Zmc2V0V2lkdGgsZS5vZmZzZXRXaWR0aCk7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgibWluLXdpZHRoIixgJHtzfXB4YCksdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgibWluLWhlaWdodCIsYCR7cn1weGApLHgodGhpcyxqdCwkaSkuY2FsbCh0aGlzLHMpfWVsc2UgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgibWluLXdpZHRoIiksdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgibWluLWhlaWdodCIpLHgodGhpcyxqdCwkaSkuY2FsbCh0aGlzKTthLnJlbW92ZVByb3BlcnR5KCItLW1lZGlhLW1lbnUtdHJhbnNpdGlvbi1pbiIpfTtEcz1uZXcgV2Vha1NldDt0bD1mdW5jdGlvbih0KXt2YXIgZTtpZih0LnN0b3BQcm9wYWdhdGlvbigpLHQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoTCh0aGlzLEJzLGlsKSkpeyhlPUwodGhpcyx0dCkpPT1udWxsfHxlLmZvY3VzKCksdGhpcy5oaWRkZW49ITA7cmV0dXJufWxldCBpPXgodGhpcyxIaSxtcikuY2FsbCh0aGlzLHQpOyFpfHxpLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8KHgodGhpcyxCaSxwcikuY2FsbCh0aGlzLGkpLHRoaXMuaGFuZGxlU2VsZWN0KHQpKX07QnM9bmV3IFdlYWtTZXQ7aWw9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4odD10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc2xvdFtuYW1lPSJoZWFkZXIiXScpLmFzc2lnbmVkRWxlbWVudHMoe2ZsYXR0ZW46ITB9KSk9PW51bGw/dm9pZCAwOnQuZmluZChpPT5pLm1hdGNoZXMoJ2J1dHRvbltwYXJ0fj0iYmFjayJdJykpfTtDcz1uZXcgV2Vha1NldDthbD1mdW5jdGlvbih0KXtpZih0LnRhcmdldD09PXRoaXMpcmV0dXJuO3godGhpcyxXcyxybCkuY2FsbCh0aGlzKTtsZXQgZT1BcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9Im1lbnVpdGVtIl1bYXJpYS1oYXNwb3B1cF0nKSk7Zm9yKGxldCBpIG9mIGUpaS5pbnZva2VUYXJnZXRFbGVtZW50IT10LnRhcmdldCYmdC5uZXdTdGF0ZT09Im9wZW4iJiZpLmdldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpPT0idHJ1ZSImJiFpLmludm9rZVRhcmdldEVsZW1lbnQuaGlkZGVuJiZpLmludm9rZVRhcmdldEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgZXQoe3JlbGF0ZWRUYXJnZXQ6aX0pKTtmb3IobGV0IGkgb2YgZSlpLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYCR7IWkuc3VibWVudUVsZW1lbnQuaGlkZGVufWApO3godGhpcyxocixIcykuY2FsbCh0aGlzLCEwKX07V3M9bmV3IFdlYWtTZXQ7cmw9ZnVuY3Rpb24oKXtsZXQgZT10aGlzLnF1ZXJ5U2VsZWN0b3IoJ1tyb2xlPSJtZW51aXRlbSJdID4gW3JvbGU9Im1lbnUiXTpub3QoW2hpZGRlbl0pJyk7dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgiaGFzLWV4cGFuZGVkIiwhIWUpfTt4cz1uZXcgV2Vha1NldDtzbD1mdW5jdGlvbih0KXt2YXIgZTtuZSh0aGlzLHQucmVsYXRlZFRhcmdldCl8fChMKHRoaXMsZ3QpJiYoKGU9TCh0aGlzLHR0KSk9PW51bGx8fGUuZm9jdXMoKSksTCh0aGlzLFdlKSYmTCh0aGlzLFdlKSE9PXQucmVsYXRlZFRhcmdldCYmIXRoaXMuaGlkZGVuJiYodGhpcy5oaWRkZW49ITApKX07VXM9bmV3IFdlYWtTZXQ7bmw9ZnVuY3Rpb24odCl7dmFyIGUsaSxhLHIscztsZXR7a2V5Om8sY3RybEtleTpkLGFsdEtleTp1LG1ldGFLZXk6X309dDtpZighKGR8fHV8fF8pJiZ0aGlzLmtleXNVc2VkLmluY2x1ZGVzKG8pKWlmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLG89PT0iVGFiIil7aWYoTCh0aGlzLGd0KSl7dGhpcy5oaWRkZW49ITA7cmV0dXJufXQuc2hpZnRLZXk/KGk9KGU9dGhpcy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKT09bnVsbD92b2lkIDA6ZS5mb2N1cyk9PW51bGx8fGkuY2FsbChlKToocj0oYT10aGlzLm5leHRFbGVtZW50U2libGluZyk9PW51bGw/dm9pZCAwOmEuZm9jdXMpPT1udWxsfHxyLmNhbGwoYSksdGhpcy5ibHVyKCl9ZWxzZSBvPT09IkVzY2FwZSI/KChzPUwodGhpcyx0dCkpPT1udWxsfHxzLmZvY3VzKCksTCh0aGlzLGd0KSYmKHRoaXMuaGlkZGVuPSEwKSk6bz09PSJFbnRlciJ8fG89PT0iICI/dGhpcy5oYW5kbGVTZWxlY3QodCk6dGhpcy5oYW5kbGVNb3ZlKHQpfTtIaT1uZXcgV2Vha1NldDttcj1mdW5jdGlvbih0KXtyZXR1cm4gdC5jb21wb3NlZFBhdGgoKS5maW5kKGU9PlsibWVudWl0ZW1yYWRpbyIsIm1lbnVpdGVtY2hlY2tib3giXS5pbmNsdWRlcyhlLnJvbGUpKX07T3M9bmV3IFdlYWtTZXQ7b2w9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtcy5maW5kKHQ9PnQudGFiSW5kZXg9PT0wKX07Qmk9bmV3IFdlYWtTZXQ7cHI9ZnVuY3Rpb24odCl7Zm9yKGxldCBlIG9mIHRoaXMuaXRlbXMpZS50YWJJbmRleD1lPT09dD8wOi0xfTtkcj1uZXcgV2Vha1NldDtQcz1mdW5jdGlvbih0LGUpe2xldCBpPVsuLi50aGlzLmNoZWNrZWRJdGVtc107dC50eXBlPT09InJhZGlvIiYmdGhpcy5yYWRpb0dyb3VwSXRlbXMuZm9yRWFjaChhPT5hLmNoZWNrZWQ9ITEpLGU/dC5jaGVja2VkPSF0LmNoZWNrZWQ6dC5jaGVja2VkPSEwLHRoaXMuY2hlY2tlZEl0ZW1zLnNvbWUoKGEscik9PmEhPWlbcl0pJiZ0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJjaGFuZ2UiLHtidWJibGVzOiEwLGNvbXBvc2VkOiEwfSkpfTtpdC5zaGFkb3dSb290T3B0aW9ucz17bW9kZToib3BlbiJ9O2l0LmdldFRlbXBsYXRlSFRNTD1fdTtmdW5jdGlvbiBidSh0KXtyZXR1cm5bIm1lbnVpdGVtIiwibWVudWl0ZW1yYWRpbyIsIm1lbnVpdGVtY2hlY2tib3giXS5pbmNsdWRlcyh0Py5yb2xlKX1mdW5jdGlvbiBWaSh0KXt2YXIgZTtyZXR1cm4oZT10LmdldEF0dHJpYnV0ZSgiYm91bmRzIik/VGUodCxgIyR7dC5nZXRBdHRyaWJ1dGUoImJvdW5kcyIpfWApOktlKHQpfHx0LnBhcmVudEVsZW1lbnQpIT1udWxsP2U6dH1sLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtY2hyb21lLW1lbnUiKXx8bC5jdXN0b21FbGVtZW50cy5kZWZpbmUoIm1lZGlhLWNocm9tZS1tZW51IixpdCk7dmFyIHFzPSh0LGUsaSk9PntpZighZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitpKX0sQXU9KHQsZSxpKT0+KHFzKHQsZSwicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxpP2kuY2FsbCh0KTplLmdldCh0KSksVnM9KHQsZSxpKT0+e2lmKGUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO2UgaW5zdGFuY2VvZiBXZWFrU2V0P2UuYWRkKHQpOmUuc2V0KHQsaSl9LFR1PSh0LGUsaSxhKT0+KHFzKHQsZSwid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZCIpLGE/YS5jYWxsKHQsaSk6ZS5zZXQodCxpKSxpKSx2cj0odCxlLGkpPT4ocXModCxlLCJhY2Nlc3MgcHJpdmF0ZSBtZXRob2QiKSxpKSxfcixmcixLcyxncixHcyxTdT1gCiAgPHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDI2IDI0IiBwYXJ0PSJjYXB0aW9ucy1pbmRpY2F0b3IgaW5kaWNhdG9yIj4KICAgIDxwYXRoIGQ9Ik0yMi44MyA1LjY4YTIuNTggMi41OCAwIDAgMC0yLjMtMi41Yy0zLjYyLS4yNC0xMS40NC0uMjQtMTUuMDYgMGEyLjU4IDIuNTggMCAwIDAtMi4zIDIuNWMtLjIzIDQuMjEtLjIzIDguNDMgMCAxMi42NGEyLjU4IDIuNTggMCAwIDAgMi4zIDIuNWMzLjYyLjI0IDExLjQ0LjI0IDE1LjA2IDBhMi41OCAyLjU4IDAgMCAwIDIuMy0yLjVjLjIzLTQuMjEuMjMtOC40MyAwLTEyLjY0Wm0tMTEuMzkgOS40NWEzLjA3IDMuMDcgMCAwIDEtMS45MS41NyAzLjA2IDMuMDYgMCAwIDEtMi4zNC0xIDMuNzUgMy43NSAwIDAgMS0uOTItMi42NyAzLjkyIDMuOTIgMCAwIDEgLjkyLTIuNzcgMy4xOCAzLjE4IDAgMCAxIDIuNDMtMSAyLjk0IDIuOTQgMCAwIDEgMi4xMy43OGMuMzY0LjM1OS42Mi44MTMuNzQgMS4zMWwtMS40My4zNWExLjQ5IDEuNDkgMCAwIDAtMS41MS0xLjE3IDEuNjEgMS42MSAwIDAgMC0xLjI5LjU4IDIuNzkgMi43OSAwIDAgMC0uNSAxLjg5IDMgMyAwIDAgMCAuNDkgMS45MyAxLjYxIDEuNjEgMCAwIDAgMS4yNy41OCAxLjQ4IDEuNDggMCAwIDAgMS0uMzcgMi4xIDIuMSAwIDAgMCAuNTktMS4xNGwxLjQuNDRhMy4yMyAzLjIzIDAgMCAxLTEuMDcgMS42OVptNy4yMiAwYTMuMDcgMy4wNyAwIDAgMS0xLjkxLjU3IDMuMDYgMy4wNiAwIDAgMS0yLjM0LTEgMy43NSAzLjc1IDAgMCAxLS45Mi0yLjY3IDMuODggMy44OCAwIDAgMSAuOTMtMi43NyAzLjE0IDMuMTQgMCAwIDEgMi40Mi0xIDMgMyAwIDAgMSAyLjE2LjgyIDIuOCAyLjggMCAwIDEgLjczIDEuMzFsLTEuNDMuMzVhMS40OSAxLjQ5IDAgMCAwLTEuNTEtMS4yMSAxLjYxIDEuNjEgMCAwIDAtMS4yOS41OEEyLjc5IDIuNzkgMCAwIDAgMTUgMTJhMyAzIDAgMCAwIC40OSAxLjkzIDEuNjEgMS42MSAwIDAgMCAxLjI3LjU4IDEuNDQgMS40NCAwIDAgMCAxLS4zNyAyLjEgMi4xIDAgMCAwIC42LTEuMTVsMS40LjQ0YTMuMTcgMy4xNyAwIDAgMS0xLjEgMS43WiIvPgogIDwvc3ZnPmA7ZnVuY3Rpb24gSXUodCl7cmV0dXJuYAogICAgJHtpdC5nZXRUZW1wbGF0ZUhUTUwodCl9CiAgICA8c2xvdCBuYW1lPSJjYXB0aW9ucy1pbmRpY2F0b3IiIGhpZGRlbj4ke1N1fTwvc2xvdD4KICBgfXZhciBicj1jbGFzcyBleHRlbmRzIGl0e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSxWcyh0aGlzLGZyKSxWcyh0aGlzLGdyKSxWcyh0aGlzLF9yLHZvaWQgMCl9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLG4uTUVESUFfU1VCVElUTEVTX0xJU1Qsbi5NRURJQV9TVUJUSVRMRVNfU0hPV0lOR119YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKXtzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSxpLGEpLGU9PT1uLk1FRElBX1NVQlRJVExFU19MSVNUJiZpIT09YT92cih0aGlzLGZyLEtzKS5jYWxsKHRoaXMpOmU9PT1uLk1FRElBX1NVQlRJVExFU19TSE9XSU5HJiZpIT09YSYmKHRoaXMudmFsdWU9YXx8IiIsdnIodGhpcyxmcixLcykuY2FsbCh0aGlzKSl9Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix2cih0aGlzLGdyLEdzKSl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix2cih0aGlzLGdyLEdzKSl9Z2V0IGFuY2hvckVsZW1lbnQoKXtyZXR1cm4gdGhpcy5hbmNob3IhPT0iYXV0byI/c3VwZXIuYW5jaG9yRWxlbWVudDpLZSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJtZWRpYS1jYXB0aW9ucy1tZW51LWJ1dHRvbiIpfWdldCBtZWRpYVN1YnRpdGxlc0xpc3QoKXtyZXR1cm4gbGwodGhpcyxuLk1FRElBX1NVQlRJVExFU19MSVNUKX1zZXQgbWVkaWFTdWJ0aXRsZXNMaXN0KGUpe2RsKHRoaXMsbi5NRURJQV9TVUJUSVRMRVNfTElTVCxlKX1nZXQgbWVkaWFTdWJ0aXRsZXNTaG93aW5nKCl7cmV0dXJuIGxsKHRoaXMsbi5NRURJQV9TVUJUSVRMRVNfU0hPV0lORyl9c2V0IG1lZGlhU3VidGl0bGVzU2hvd2luZyhlKXtkbCh0aGlzLG4uTUVESUFfU1VCVElUTEVTX1NIT1dJTkcsZSl9fTtfcj1uZXcgV2Vha01hcDtmcj1uZXcgV2Vha1NldDtLcz1mdW5jdGlvbigpe3ZhciB0O2xldCBlPUF1KHRoaXMsX3IpIT09SlNPTi5zdHJpbmdpZnkodGhpcy5tZWRpYVN1YnRpdGxlc0xpc3QpLGk9dGhpcy52YWx1ZSE9PXRoaXMuZ2V0QXR0cmlidXRlKG4uTUVESUFfU1VCVElUTEVTX1NIT1dJTkcpO2lmKCFlJiYhaSlyZXR1cm47VHUodGhpcyxfcixKU09OLnN0cmluZ2lmeSh0aGlzLm1lZGlhU3VidGl0bGVzTGlzdCkpLHRoaXMuZGVmYXVsdFNsb3QudGV4dENvbnRlbnQ9IiI7bGV0IGE9IXRoaXMudmFsdWUscj0kcyh7dHlwZToicmFkaW8iLHRleHQ6dGhpcy5mb3JtYXRNZW51SXRlbVRleHQoZigiT2ZmIikpLHZhbHVlOiJvZmYiLGNoZWNrZWQ6YX0pO3IucHJlcGVuZChFcih0aGlzLCJjaGVja2VkLWluZGljYXRvciIpKSx0aGlzLmRlZmF1bHRTbG90LmFwcGVuZChyKTtsZXQgcz10aGlzLm1lZGlhU3VidGl0bGVzTGlzdDtmb3IobGV0IG8gb2Ygcyl7bGV0IGQ9JHMoe3R5cGU6InJhZGlvIix0ZXh0OnRoaXMuZm9ybWF0TWVudUl0ZW1UZXh0KG8ubGFiZWwsbyksdmFsdWU6aGEobyksY2hlY2tlZDp0aGlzLnZhbHVlPT1oYShvKX0pO2QucHJlcGVuZChFcih0aGlzLCJjaGVja2VkLWluZGljYXRvciIpKSwoKHQ9by5raW5kKSE9bnVsbD90OiJzdWJzIik9PT0iY2FwdGlvbnMiJiZkLmFwcGVuZChFcih0aGlzLCJjYXB0aW9ucy1pbmRpY2F0b3IiKSksdGhpcy5kZWZhdWx0U2xvdC5hcHBlbmQoZCl9fTtncj1uZXcgV2Vha1NldDtHcz1mdW5jdGlvbigpe2xldCB0PXRoaXMubWVkaWFTdWJ0aXRsZXNTaG93aW5nLGU9dGhpcy5nZXRBdHRyaWJ1dGUobi5NRURJQV9TVUJUSVRMRVNfU0hPV0lORyksaT10aGlzLnZhbHVlIT09ZTtpZih0Py5sZW5ndGgmJmkmJnRoaXMuZGlzcGF0Y2hFdmVudChuZXcgbC5DdXN0b21FdmVudChoLk1FRElBX0RJU0FCTEVfU1VCVElUTEVTX1JFUVVFU1Qse2NvbXBvc2VkOiEwLGJ1YmJsZXM6ITAsZGV0YWlsOnR9KSksIXRoaXMudmFsdWV8fCFpKXJldHVybjtsZXQgYT1uZXcgbC5DdXN0b21FdmVudChoLk1FRElBX1NIT1dfU1VCVElUTEVTX1JFUVVFU1Qse2NvbXBvc2VkOiEwLGJ1YmJsZXM6ITAsZGV0YWlsOnRoaXMudmFsdWV9KTt0aGlzLmRpc3BhdGNoRXZlbnQoYSl9O2JyLmdldFRlbXBsYXRlSFRNTD1JdTt2YXIgbGw9KHQsZSk9PntsZXQgaT10LmdldEF0dHJpYnV0ZShlKTtyZXR1cm4gaT9waShpKTpbXX0sZGw9KHQsZSxpKT0+e2lmKCFpPy5sZW5ndGgpe3QucmVtb3ZlQXR0cmlidXRlKGUpO3JldHVybn1sZXQgYT1sdChpKTt0LmdldEF0dHJpYnV0ZShlKSE9PWEmJnQuc2V0QXR0cmlidXRlKGUsYSl9O2wuY3VzdG9tRWxlbWVudHMuZ2V0KCJtZWRpYS1jYXB0aW9ucy1tZW51Iil8fGwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJtZWRpYS1jYXB0aW9ucy1tZW51Iixicik7dmFyIEtpPWNsYXNzIGV4dGVuZHMgV3tjb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5pbnZva2VUYXJnZXRFbGVtZW50JiZ0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1oYXNwb3B1cCIsIm1lbnUiKX1nZXQgaW52b2tlVGFyZ2V0KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJpbnZva2V0YXJnZXQiKX1zZXQgaW52b2tlVGFyZ2V0KGUpe3RoaXMuc2V0QXR0cmlidXRlKCJpbnZva2V0YXJnZXQiLGAke2V9YCl9Z2V0IGludm9rZVRhcmdldEVsZW1lbnQoKXt2YXIgZTtyZXR1cm4gdGhpcy5pbnZva2VUYXJnZXQ/KGU9c3QodGhpcykpPT1udWxsP3ZvaWQgMDplLnF1ZXJ5U2VsZWN0b3IoYCMke3RoaXMuaW52b2tlVGFyZ2V0fWApOm51bGx9aGFuZGxlQ2xpY2soKXt2YXIgZTsoZT10aGlzLmludm9rZVRhcmdldEVsZW1lbnQpPT1udWxsfHxlLmRpc3BhdGNoRXZlbnQobmV3IGV0KHtyZWxhdGVkVGFyZ2V0OnRoaXN9KSl9fTtsLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtY2hyb21lLW1lbnUtYnV0dG9uIil8fGwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJtZWRpYS1jaHJvbWUtbWVudS1idXR0b24iLEtpKTt2YXIga3U9YDxzdmcgYXJpYS1oaWRkZW49InRydWUiIHZpZXdCb3g9IjAgMCAyNiAyNCI+CiAgPHBhdGggZD0iTTIyLjgzIDUuNjhhMi41OCAyLjU4IDAgMCAwLTIuMy0yLjVjLTMuNjItLjI0LTExLjQ0LS4yNC0xNS4wNiAwYTIuNTggMi41OCAwIDAgMC0yLjMgMi41Yy0uMjMgNC4yMS0uMjMgOC40MyAwIDEyLjY0YTIuNTggMi41OCAwIDAgMCAyLjMgMi41YzMuNjIuMjQgMTEuNDQuMjQgMTUuMDYgMGEyLjU4IDIuNTggMCAwIDAgMi4zLTIuNWMuMjMtNC4yMS4yMy04LjQzIDAtMTIuNjRabS0xMS4zOSA5LjQ1YTMuMDcgMy4wNyAwIDAgMS0xLjkxLjU3IDMuMDYgMy4wNiAwIDAgMS0yLjM0LTEgMy43NSAzLjc1IDAgMCAxLS45Mi0yLjY3IDMuOTIgMy45MiAwIDAgMSAuOTItMi43NyAzLjE4IDMuMTggMCAwIDEgMi40My0xIDIuOTQgMi45NCAwIDAgMSAyLjEzLjc4Yy4zNjQuMzU5LjYyLjgxMy43NCAxLjMxbC0xLjQzLjM1YTEuNDkgMS40OSAwIDAgMC0xLjUxLTEuMTcgMS42MSAxLjYxIDAgMCAwLTEuMjkuNTggMi43OSAyLjc5IDAgMCAwLS41IDEuODkgMyAzIDAgMCAwIC40OSAxLjkzIDEuNjEgMS42MSAwIDAgMCAxLjI3LjU4IDEuNDggMS40OCAwIDAgMCAxLS4zNyAyLjEgMi4xIDAgMCAwIC41OS0xLjE0bDEuNC40NGEzLjIzIDMuMjMgMCAwIDEtMS4wNyAxLjY5Wm03LjIyIDBhMy4wNyAzLjA3IDAgMCAxLTEuOTEuNTcgMy4wNiAzLjA2IDAgMCAxLTIuMzQtMSAzLjc1IDMuNzUgMCAwIDEtLjkyLTIuNjcgMy44OCAzLjg4IDAgMCAxIC45My0yLjc3IDMuMTQgMy4xNCAwIDAgMSAyLjQyLTEgMyAzIDAgMCAxIDIuMTYuODIgMi44IDIuOCAwIDAgMSAuNzMgMS4zMWwtMS40My4zNWExLjQ5IDEuNDkgMCAwIDAtMS41MS0xLjIxIDEuNjEgMS42MSAwIDAgMC0xLjI5LjU4QTIuNzkgMi43OSAwIDAgMCAxNSAxMmEzIDMgMCAwIDAgLjQ5IDEuOTMgMS42MSAxLjYxIDAgMCAwIDEuMjcuNTggMS40NCAxLjQ0IDAgMCAwIDEtLjM3IDIuMSAyLjEgMCAwIDAgLjYtMS4xNWwxLjQuNDRhMy4xNyAzLjE3IDAgMCAxLTEuMSAxLjdaIi8+Cjwvc3ZnPmAseXU9YDxzdmcgYXJpYS1oaWRkZW49InRydWUiIHZpZXdCb3g9IjAgMCAyNiAyNCI+CiAgPHBhdGggZD0iTTE3LjczIDE0LjA5YTEuNCAxLjQgMCAwIDEtMSAuMzcgMS41NzkgMS41NzkgMCAwIDEtMS4yNy0uNThBMyAzIDAgMCAxIDE1IDEyYTIuOCAyLjggMCAwIDEgLjUtMS44NSAxLjYzIDEuNjMgMCAwIDEgMS4yOS0uNTcgMS40NyAxLjQ3IDAgMCAxIDEuNTEgMS4ybDEuNDMtLjM0QTIuODkgMi44OSAwIDAgMCAxOSA5LjA3YTMgMyAwIDAgMC0yLjE0LS43OCAzLjE0IDMuMTQgMCAwIDAtMi40MiAxIDMuOTEgMy45MSAwIDAgMC0uOTMgMi43OCAzLjc0IDMuNzQgMCAwIDAgLjkyIDIuNjYgMy4wNyAzLjA3IDAgMCAwIDIuMzQgMSAzLjA3IDMuMDcgMCAwIDAgMS45MS0uNTcgMy4xNyAzLjE3IDAgMCAwIDEuMDctMS43NGwtMS40LS40NWMtLjA4My40My0uMy44MjItLjYyIDEuMTJabS03LjIyIDBhMS40MyAxLjQzIDAgMCAxLTEgLjM3IDEuNTggMS41OCAwIDAgMS0xLjI3LS41OEEzIDMgMCAwIDEgNy43NiAxMmEyLjggMi44IDAgMCAxIC41LTEuODUgMS42MyAxLjYzIDAgMCAxIDEuMjktLjU3IDEuNDcgMS40NyAwIDAgMSAxLjUxIDEuMmwxLjQzLS4zNGEyLjgxIDIuODEgMCAwIDAtLjc0LTEuMzIgMi45NCAyLjk0IDAgMCAwLTIuMTMtLjc4IDMuMTggMy4xOCAwIDAgMC0yLjQzIDEgNCA0IDAgMCAwLS45MiAyLjc4IDMuNzQgMy43NCAwIDAgMCAuOTIgMi42NiAzLjA3IDMuMDcgMCAwIDAgMi4zNCAxIDMuMDcgMy4wNyAwIDAgMCAxLjkxLS41NyAzLjIzIDMuMjMgMCAwIDAgMS4wNy0xLjc0bC0xLjQtLjQ1YTIuMDYgMi4wNiAwIDAgMS0uNiAxLjA3Wm0xMi4zMi04LjQxYTIuNTkgMi41OSAwIDAgMC0yLjMtMi41MUMxOC43MiAzLjA1IDE1Ljg2IDMgMTMgM2MtMi44NiAwLTUuNzIuMDUtNy41My4xN2EyLjU5IDIuNTkgMCAwIDAtMi4zIDIuNTFjLS4yMyA0LjIwNy0uMjMgOC40MjMgMCAxMi42M2EyLjU3IDIuNTcgMCAwIDAgMi4zIDIuNWMxLjgxLjEzIDQuNjcuMTkgNy41My4xOSAyLjg2IDAgNS43Mi0uMDYgNy41My0uMTlhMi41NyAyLjU3IDAgMCAwIDIuMy0yLjVjLjIzLTQuMjA3LjIzLTguNDIzIDAtMTIuNjNabS0xLjQ5IDEyLjUzYTEuMTEgMS4xMSAwIDAgMS0uOTEgMS4xMWMtMS42Ny4xMS00LjQ1LjE4LTcuNDMuMTgtMi45OCAwLTUuNzYtLjA3LTcuNDMtLjE4YTEuMTEgMS4xMSAwIDAgMS0uOTEtMS4xMWMtLjIxLTQuMTQtLjIxLTguMjkgMC0xMi40M2ExLjExIDEuMTEgMCAwIDEgLjkxLTEuMTFDNy4yNCA0LjU2IDEwIDQuNDkgMTMgNC40OXM1Ljc2LjA3IDcuNDMuMThhMS4xMSAxLjExIDAgMCAxIC45MSAxLjExYy4yMSA0LjE0LjIxIDguMjkgMCAxMi40M1oiLz4KPC9zdmc+YDtmdW5jdGlvbiB3dSgpe3JldHVybmAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2RhdGEtY2FwdGlvbnMtZW5hYmxlZD0idHJ1ZSJdKSBzbG90W25hbWU9b2ZmXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAKICAgICAgOmhvc3QoOm5vdChbZGF0YS1jYXB0aW9ucy1lbmFibGVkPSJ0cnVlIl0pKSBzbG90W25hbWU9b25dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFthcmlhLWV4cGFuZGVkPSJ0cnVlIl0pIHNsb3RbbmFtZT10b29sdGlwXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBuYW1lPSJpY29uIj4KICAgICAgPHNsb3QgbmFtZT0ib24iPiR7a3V9PC9zbG90PgogICAgICA8c2xvdCBuYW1lPSJvZmYiPiR7eXV9PC9zbG90PgogICAgPC9zbG90PgogIGB9ZnVuY3Rpb24gTXUoKXtyZXR1cm4gZigiQ2FwdGlvbnMiKX12YXIgdWw9dD0+e3Quc2V0QXR0cmlidXRlKCJkYXRhLWNhcHRpb25zLWVuYWJsZWQiLFpuKHQpLnRvU3RyaW5nKCkpfSxjbD10PT57dC5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGYoImNsb3NlZCBjYXB0aW9ucyIpKX0sR2k9Y2xhc3MgZXh0ZW5kcyBLaXtzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVyblsuLi5zdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMsbi5NRURJQV9TVUJUSVRMRVNfTElTVCxuLk1FRElBX1NVQlRJVExFU19TSE9XSU5HLG4uTUVESUFfTEFOR119Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLGNsKHRoaXMpLHVsKHRoaXMpfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSl7c3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsaSxhKSxlPT09bi5NRURJQV9TVUJUSVRMRVNfU0hPV0lORz91bCh0aGlzKTplPT09bi5NRURJQV9MQU5HJiZjbCh0aGlzKX1nZXQgaW52b2tlVGFyZ2V0RWxlbWVudCgpe3ZhciBlO3JldHVybiB0aGlzLmludm9rZVRhcmdldCE9bnVsbD9zdXBlci5pbnZva2VUYXJnZXRFbGVtZW50OihlPUtlKHRoaXMpKT09bnVsbD92b2lkIDA6ZS5xdWVyeVNlbGVjdG9yKCJtZWRpYS1jYXB0aW9ucy1tZW51Iil9Z2V0IG1lZGlhU3VidGl0bGVzTGlzdCgpe3JldHVybiBobCh0aGlzLG4uTUVESUFfU1VCVElUTEVTX0xJU1QpfXNldCBtZWRpYVN1YnRpdGxlc0xpc3QoZSl7bWwodGhpcyxuLk1FRElBX1NVQlRJVExFU19MSVNULGUpfWdldCBtZWRpYVN1YnRpdGxlc1Nob3dpbmcoKXtyZXR1cm4gaGwodGhpcyxuLk1FRElBX1NVQlRJVExFU19TSE9XSU5HKX1zZXQgbWVkaWFTdWJ0aXRsZXNTaG93aW5nKGUpe21sKHRoaXMsbi5NRURJQV9TVUJUSVRMRVNfU0hPV0lORyxlKX19O0dpLmdldFNsb3RUZW1wbGF0ZUhUTUw9d3U7R2kuZ2V0VG9vbHRpcENvbnRlbnRIVE1MPU11O3ZhciBobD0odCxlKT0+e2xldCBpPXQuZ2V0QXR0cmlidXRlKGUpO3JldHVybiBpP3BpKGkpOltdfSxtbD0odCxlLGkpPT57aWYoIWk/Lmxlbmd0aCl7dC5yZW1vdmVBdHRyaWJ1dGUoZSk7cmV0dXJufWxldCBhPWx0KGkpO3QuZ2V0QXR0cmlidXRlKGUpIT09YSYmdC5zZXRBdHRyaWJ1dGUoZSxhKX07bC5jdXN0b21FbGVtZW50cy5nZXQoIm1lZGlhLWNhcHRpb25zLW1lbnUtYnV0dG9uIil8fGwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJtZWRpYS1jYXB0aW9ucy1tZW51LWJ1dHRvbiIsR2kpO3ZhciBKcz0odCxlLGkpPT57aWYoIWUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIraSl9LHRlPSh0LGUsaSk9PihKcyh0LGUsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksaT9pLmNhbGwodCk6ZS5nZXQodCkpLCRlPSh0LGUsaSk9PntpZihlLmhhcyh0KSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtlIGluc3RhbmNlb2YgV2Vha1NldD9lLmFkZCh0KTplLnNldCh0LGkpfSxZcz0odCxlLGksYSk9PihKcyh0LGUsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxhP2EuY2FsbCh0LGkpOmUuc2V0KHQsaSksaSksdGk9KHQsZSxpKT0+KEpzKHQsZSwiYWNjZXNzIHByaXZhdGUgbWV0aG9kIiksaSksQXIsWWksUXMscGwsU3IsanMsZW4sRWwsVWUsZWksenMsVHIsWnM7ZnVuY3Rpb24gTHUodCl7cmV0dXJuYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgdHJhbnNpdGlvbjogdmFyKC0tbWVkaWEtbWVudS1pdGVtLXRyYW5zaXRpb24sCiAgICAgICAgICBiYWNrZ3JvdW5kIC4xNXMgbGluZWFyLAogICAgICAgICAgb3BhY2l0eSAuMnMgZWFzZS1pbi1vdXQKICAgICAgICApOwogICAgICAgIG91dGxpbmU6IHZhcigtLW1lZGlhLW1lbnUtaXRlbS1vdXRsaW5lLCAwKTsKICAgICAgICBvdXRsaW5lLW9mZnNldDogdmFyKC0tbWVkaWEtbWVudS1pdGVtLW91dGxpbmUtb2Zmc2V0LCAtMXB4KTsKICAgICAgICBjdXJzb3I6IHZhcigtLW1lZGlhLWN1cnNvciwgcG9pbnRlcik7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAganVzdGlmeS1zZWxmOiBzdHJldGNoOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgd2hpdGUtc3BhY2UtY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgIHRleHQtd3JhcDogbm93cmFwOwogICAgICAgIHBhZGRpbmc6IC40ZW0gLjhlbSAuNGVtIDFlbTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzLXZpc2libGUpIHsKICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1tZWRpYS1tZW51LWl0ZW0tZm9jdXMtc2hhZG93LCBpbnNldCAwIDAgMCAycHggcmdiKDI3IDEyNyAyMDQgLyAuOSkpOwogICAgICAgIG91dGxpbmU6IHZhcigtLW1lZGlhLW1lbnUtaXRlbS1ob3Zlci1vdXRsaW5lLCAwKTsKICAgICAgICBvdXRsaW5lLW9mZnNldDogdmFyKC0tbWVkaWEtbWVudS1pdGVtLWhvdmVyLW91dGxpbmUtb2Zmc2V0LCAgdmFyKC0tbWVkaWEtbWVudS1pdGVtLW91dGxpbmUtb2Zmc2V0LCAtMXB4KSk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpob3ZlcikgewogICAgICAgIGN1cnNvcjogdmFyKC0tbWVkaWEtY3Vyc29yLCBwb2ludGVyKTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZWRpYS1tZW51LWl0ZW0taG92ZXItYmFja2dyb3VuZCwgcmdiKDkyIDkyIDEwMiAvIC41KSk7CiAgICAgICAgb3V0bGluZTogdmFyKC0tbWVkaWEtbWVudS1pdGVtLWhvdmVyLW91dGxpbmUpOwogICAgICAgIG91dGxpbmUtb2Zmc2V0OiB2YXIoLS1tZWRpYS1tZW51LWl0ZW0taG92ZXItb3V0bGluZS1vZmZzZXQsICB2YXIoLS1tZWRpYS1tZW51LWl0ZW0tb3V0bGluZS1vZmZzZXQsIC0xcHgpKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2FyaWEtY2hlY2tlZD0idHJ1ZSJdKSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVkaWEtbWVudS1pdGVtLWNoZWNrZWQtYmFja2dyb3VuZCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIC4zKTsKICAgICAgfQoKICAgICAgc2xvdDpub3QoW25hbWVdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHNsb3Q6bm90KFtuYW1lPSJzdWJtZW51Il0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHRyYW5zaXRpb246IGluaGVyaXQ7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tbWVkaWEtbWVudS1pdGVtLW9wYWNpdHksIDEpOwogICAgICB9CgogICAgICBzbG90W25hbWU9ImRlc2NyaXB0aW9uIl0gewogICAgICAgIGp1c3RpZnktY29udGVudDogZW5kOwogICAgICB9CgogICAgICBzbG90W25hbWU9ImRlc2NyaXB0aW9uIl0gPiBzcGFuIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWFyZ2luLWlubGluZTogMWVtIC4yZW07CiAgICAgICAgbWF4LXdpZHRoOiB2YXIoLS1tZWRpYS1tZW51LWl0ZW0tZGVzY3JpcHRpb24tbWF4LXdpZHRoLCAxMDBweCk7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdG9wOiAuMDRlbTsKICAgICAgfQoKICAgICAgc2xvdFtuYW1lPSJjaGVja2VkLWluZGljYXRvciJdIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICA6aG9zdCg6aXMoW3JvbGU9Im1lbnVpdGVtcmFkaW8iXSxbcm9sZT0ibWVudWl0ZW1jaGVja2JveCJdKSkgc2xvdFtuYW1lPSJjaGVja2VkLWluZGljYXRvciJdIHsKICAgICAgICBkaXNwbGF5OiB2YXIoLS1tZWRpYS1tZW51LWl0ZW0tY2hlY2tlZC1pbmRpY2F0b3ItZGlzcGxheSwgaW5saW5lLWJsb2NrKTsKICAgICAgfQoKICAgICAgCiAgICAgIHN2ZywgaW1nLCA6OnNsb3R0ZWQoc3ZnKSwgOjpzbG90dGVkKGltZykgewogICAgICAgIGhlaWdodDogdmFyKC0tbWVkaWEtbWVudS1pdGVtLWljb24taGVpZ2h0LCB2YXIoLS1tZWRpYS1jb250cm9sLWhlaWdodCwgMjRweCkpOwogICAgICAgIGZpbGw6IHZhcigtLW1lZGlhLWljb24tY29sb3IsIHZhcigtLW1lZGlhLXByaW1hcnktY29sb3IsIHJnYigyMzggMjM4IDIzOCkpKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgCiAgICAgIFtwYXJ0fj0iaW5kaWNhdG9yIl0sCiAgICAgIDo6c2xvdHRlZChbcGFydH49ImluZGljYXRvciJdKSB7CiAgICAgICAgZmlsbDogdmFyKC0tbWVkaWEtbWVudS1pdGVtLWluZGljYXRvci1maWxsLAogICAgICAgICAgdmFyKC0tbWVkaWEtaWNvbi1jb2xvciwgdmFyKC0tbWVkaWEtcHJpbWFyeS1jb2xvciwgcmdiKDIzOCAyMzggMjM4KSkpKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLW1lZGlhLW1lbnUtaXRlbS1pbmRpY2F0b3ItaGVpZ2h0LCAxLjI1ZW0pOwogICAgICAgIG1hcmdpbi1yaWdodDogLjVjaDsKICAgICAgfQoKICAgICAgW3BhcnR+PSJjaGVja2VkLWluZGljYXRvciJdIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDpob3N0KFthcmlhLWNoZWNrZWQ9InRydWUiXSkgW3BhcnR+PSJjaGVja2VkLWluZGljYXRvciJdIHsKICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3QgbmFtZT0iY2hlY2tlZC1pbmRpY2F0b3IiPgogICAgICA8c3ZnIGFyaWEtaGlkZGVuPSJ0cnVlIiB2aWV3Qm94PSIwIDEgMjQgMjQiIHBhcnQ9ImNoZWNrZWQtaW5kaWNhdG9yIGluZGljYXRvciI+CiAgICAgICAgPHBhdGggZD0ibTEwIDE1LjE3IDkuMTkzLTkuMTkxIDEuNDE0IDEuNDE0LTEwLjYwNiAxMC42MDYtNi4zNjQtNi4zNjQgMS40MTQtMS40MTQgNC45NSA0Ljk1WiIvPgogICAgICA8L3N2Zz4KICAgIDwvc2xvdD4KICAgIDxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90PgogICAgPHNsb3Q+PC9zbG90PgogICAgPHNsb3QgbmFtZT0iZGVzY3JpcHRpb24iPjwvc2xvdD4KICAgIDxzbG90IG5hbWU9InN1ZmZpeCI+CiAgICAgICR7dGhpcy5nZXRTdWZmaXhTbG90SW5uZXJIVE1MKHQpfQogICAgPC9zbG90PgogICAgPHNsb3QgbmFtZT0ic3VibWVudSI+PC9zbG90PgogIGB9ZnVuY3Rpb24gUnUodCl7cmV0dXJuIiJ9dmFyIGhlPXtUWVBFOiJ0eXBlIixWQUxVRToidmFsdWUiLENIRUNLRUQ6ImNoZWNrZWQiLERJU0FCTEVEOiJkaXNhYmxlZCJ9LGlpPWNsYXNzIGV4dGVuZHMgbC5IVE1MRWxlbWVudHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksJGUodGhpcyxRcyksJGUodGhpcyxTciksJGUodGhpcyxlbiksJGUodGhpcyxUciksJGUodGhpcyxBciwhMSksJGUodGhpcyxZaSx2b2lkIDApLCRlKHRoaXMsVWUsKCk9Pnt2YXIgZSxpO3RoaXMuc3VibWVudUVsZW1lbnQuaXRlbXMmJnRoaXMuc2V0QXR0cmlidXRlKCJzdWJtZW51c2l6ZSIsYCR7dGhpcy5zdWJtZW51RWxlbWVudC5pdGVtcy5sZW5ndGh9YCk7bGV0IGE9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3Nsb3RbbmFtZT0iZGVzY3JpcHRpb24iXScpLHI9KGU9dGhpcy5zdWJtZW51RWxlbWVudC5jaGVja2VkSXRlbXMpPT1udWxsP3ZvaWQgMDplWzBdLHM9KGk9cj8uZGF0YXNldC5kZXNjcmlwdGlvbikhPW51bGw/aTpyPy50ZXh0LG89UC5jcmVhdGVFbGVtZW50KCJzcGFuIik7by50ZXh0Q29udGVudD1zPz8iIixhLnJlcGxhY2VDaGlsZHJlbihvKX0pLCRlKHRoaXMsZWksZT0+e2xldHtrZXk6aX09ZTtpZighdGhpcy5rZXlzVXNlZC5pbmNsdWRlcyhpKSl7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdGUodGhpcyxlaSkpO3JldHVybn10aGlzLmhhbmRsZUNsaWNrKGUpfSksJGUodGhpcyx6cyxlPT57bGV0e21ldGFLZXk6aSxhbHRLZXk6YSxrZXk6cn09ZTtpZihpfHxhfHwhdGhpcy5rZXlzVXNlZC5pbmNsdWRlcyhyKSl7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdGUodGhpcyxlaSkpO3JldHVybn10aGlzLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIix0ZSh0aGlzLGVpKSx7b25jZTohMH0pfSksIXRoaXMuc2hhZG93Um9vdCl7dGhpcy5hdHRhY2hTaGFkb3codGhpcy5jb25zdHJ1Y3Rvci5zaGFkb3dSb290T3B0aW9ucyk7bGV0IGU9Ryh0aGlzLmF0dHJpYnV0ZXMpO3RoaXMuc2hhZG93Um9vdC5pbm5lckhUTUw9dGhpcy5jb25zdHJ1Y3Rvci5nZXRUZW1wbGF0ZUhUTUwoZSl9fXN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuW2hlLlRZUEUsaGUuRElTQUJMRUQsaGUuQ0hFQ0tFRCxoZS5WQUxVRV19ZW5hYmxlKCl7dGhpcy5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil8fHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIikscWkodGhpcykmJiF0aGlzLmhhc0F0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIikmJnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWNoZWNrZWQiLCJmYWxzZSIpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcyl9ZGlzYWJsZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcyksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdGhpcyl9aGFuZGxlRXZlbnQoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSJzbG90Y2hhbmdlIjp0aSh0aGlzLFFzLHBsKS5jYWxsKHRoaXMsZSk7YnJlYWs7Y2FzZSJjbGljayI6dGhpcy5oYW5kbGVDbGljayhlKTticmVhaztjYXNlImtleWRvd24iOnRlKHRoaXMsenMpLmNhbGwodGhpcyxlKTticmVhaztjYXNlImtleXVwIjp0ZSh0aGlzLGVpKS5jYWxsKHRoaXMsZSk7YnJlYWt9fWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLGksYSl7ZT09PWhlLkNIRUNLRUQmJnFpKHRoaXMpJiYhdGUodGhpcyxBcik/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsYSE9bnVsbD8idHJ1ZSI6ImZhbHNlIik6ZT09PWhlLlRZUEUmJmEhPT1pP3RoaXMucm9sZT0ibWVudWl0ZW0iK2E6ZT09PWhlLkRJU0FCTEVEJiZhIT09aSYmKGE9PW51bGw/dGhpcy5lbmFibGUoKTp0aGlzLmRpc2FibGUoKSl9Y29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLmhhc0F0dHJpYnV0ZShoZS5ESVNBQkxFRCl8fHRoaXMuZW5hYmxlKCksdGhpcy5yb2xlPSJtZW51aXRlbSIrdGhpcy50eXBlLFlzKHRoaXMsWWksWHModGhpcyx0aGlzLnBhcmVudE5vZGUpKSx0aSh0aGlzLFRyLFpzKS5jYWxsKHRoaXMpLHRoaXMuc3VibWVudUVsZW1lbnQmJnRpKHRoaXMsU3IsanMpLmNhbGwodGhpcyksdGhpcy5zaGFkb3dSb290LmFkZEV2ZW50TGlzdGVuZXIoInNsb3RjaGFuZ2UiLHRoaXMpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7dGhpcy5kaXNhYmxlKCksdGkodGhpcyxUcixacykuY2FsbCh0aGlzKSxZcyh0aGlzLFlpLG51bGwpLHRoaXMuc2hhZG93Um9vdC5yZW1vdmVFdmVudExpc3RlbmVyKCJzbG90Y2hhbmdlIix0aGlzKX1nZXQgaW52b2tlVGFyZ2V0KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJpbnZva2V0YXJnZXQiKX1zZXQgaW52b2tlVGFyZ2V0KGUpe3RoaXMuc2V0QXR0cmlidXRlKCJpbnZva2V0YXJnZXQiLGAke2V9YCl9Z2V0IGludm9rZVRhcmdldEVsZW1lbnQoKXt2YXIgZTtyZXR1cm4gdGhpcy5pbnZva2VUYXJnZXQ/KGU9c3QodGhpcykpPT1udWxsP3ZvaWQgMDplLnF1ZXJ5U2VsZWN0b3IoYCMke3RoaXMuaW52b2tlVGFyZ2V0fWApOnRoaXMuc3VibWVudUVsZW1lbnR9Z2V0IHN1Ym1lbnVFbGVtZW50KCl7cmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdzbG90W25hbWU9InN1Ym1lbnUiXScpLmFzc2lnbmVkRWxlbWVudHMoe2ZsYXR0ZW46ITB9KVswXX1nZXQgdHlwZSgpe3ZhciBlO3JldHVybihlPXRoaXMuZ2V0QXR0cmlidXRlKGhlLlRZUEUpKSE9bnVsbD9lOiIifXNldCB0eXBlKGUpe3RoaXMuc2V0QXR0cmlidXRlKGhlLlRZUEUsYCR7ZX1gKX1nZXQgdmFsdWUoKXt2YXIgZTtyZXR1cm4oZT10aGlzLmdldEF0dHJpYnV0ZShoZS5WQUxVRSkpIT1udWxsP2U6dGhpcy50ZXh0fXNldCB2YWx1ZShlKXt0aGlzLnNldEF0dHJpYnV0ZShoZS5WQUxVRSxlKX1nZXQgdGV4dCgpe3ZhciBlO3JldHVybigoZT10aGlzLnRleHRDb250ZW50KSE9bnVsbD9lOiIiKS50cmltKCl9Z2V0IGNoZWNrZWQoKXtpZihxaSh0aGlzKSlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIpPT09InRydWUifXNldCBjaGVja2VkKGUpe3FpKHRoaXMpJiYoWXModGhpcyxBciwhMCksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsZT8idHJ1ZSI6ImZhbHNlIiksZT90aGlzLnBhcnQuYWRkKCJjaGVja2VkIik6dGhpcy5wYXJ0LnJlbW92ZSgiY2hlY2tlZCIpKX1oYW5kbGVDbGljayhlKXtxaSh0aGlzKXx8dGhpcy5pbnZva2VUYXJnZXRFbGVtZW50JiZuZSh0aGlzLGUudGFyZ2V0KSYmdGhpcy5pbnZva2VUYXJnZXRFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IGV0KHtyZWxhdGVkVGFyZ2V0OnRoaXN9KSl9Z2V0IGtleXNVc2VkKCl7cmV0dXJuWyJFbnRlciIsIiAiXX19O0FyPW5ldyBXZWFrTWFwO1lpPW5ldyBXZWFrTWFwO1FzPW5ldyBXZWFrU2V0O3BsPWZ1bmN0aW9uKHQpe2xldCBlPXQudGFyZ2V0O2lmKCFlPy5uYW1lKWZvcihsZXQgYSBvZiBlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46ITB9KSlhIGluc3RhbmNlb2YgVGV4dCYmYS50ZXh0Q29udGVudC50cmltKCk9PT0iIiYmYS5yZW1vdmUoKTtlLm5hbWU9PT0ic3VibWVudSImJih0aGlzLnN1Ym1lbnVFbGVtZW50P3RpKHRoaXMsU3IsanMpLmNhbGwodGhpcyk6dGkodGhpcyxlbixFbCkuY2FsbCh0aGlzKSl9O1NyPW5ldyBXZWFrU2V0O2pzPWFzeW5jIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGFzcG9wdXAiLCJtZW51IiksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLGAkeyF0aGlzLnN1Ym1lbnVFbGVtZW50LmhpZGRlbn1gKSx0aGlzLnN1Ym1lbnVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGUodGhpcyxVZSkpLHRoaXMuc3VibWVudUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiYWRkbWVudWl0ZW0iLHRlKHRoaXMsVWUpKSx0aGlzLnN1Ym1lbnVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlbW92ZW1lbnVpdGVtIix0ZSh0aGlzLFVlKSksdGUodGhpcyxVZSkuY2FsbCh0aGlzKX07ZW49bmV3IFdlYWtTZXQ7RWw9ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oYXNwb3B1cCIpLHRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiksdGhpcy5zdWJtZW51RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHRlKHRoaXMsVWUpKSx0aGlzLnN1Ym1lbnVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImFkZG1lbnVpdGVtIix0ZSh0aGlzLFVlKSksdGhpcy5zdWJtZW51RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZW1vdmVtZW51aXRlbSIsdGUodGhpcyxVZSkpLHRlKHRoaXMsVWUpLmNhbGwodGhpcyl9O1VlPW5ldyBXZWFrTWFwO2VpPW5ldyBXZWFrTWFwO3pzPW5ldyBXZWFrTWFwO1RyPW5ldyBXZWFrU2V0O1pzPWZ1bmN0aW9uKCl7dmFyIHQ7bGV0IGU9KHQ9dGUodGhpcyxZaSkpPT1udWxsP3ZvaWQgMDp0LnJhZGlvR3JvdXBJdGVtcztpZighZSlyZXR1cm47bGV0IGk9ZS5maWx0ZXIoYT0+YS5nZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIpPT09InRydWUiKS5wb3AoKTtpfHwoaT1lWzBdKTtmb3IobGV0IGEgb2YgZSlhLnNldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIiwiZmFsc2UiKTtpPy5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsInRydWUiKX07aWkuc2hhZG93Um9vdE9wdGlvbnM9e21vZGU6Im9wZW4ifTtpaS5nZXRUZW1wbGF0ZUhUTUw9THU7aWkuZ2V0U3VmZml4U2xvdElubmVySFRNTD1SdTtmdW5jdGlvbiBxaSh0KXtyZXR1cm4gdC50eXBlPT09InJhZGlvInx8dC50eXBlPT09ImNoZWNrYm94In1mdW5jdGlvbiBYcyh0LGUpe2lmKCF0KXJldHVybiBudWxsO2xldHtob3N0Oml9PXQuZ2V0Um9vdE5vZGUoKTtyZXR1cm4hZSYmaT9Ycyh0LGkpOmU/Lml0ZW1zP2U6WHMoZSxlPy5wYXJlbnROb2RlKX1sLmN1c3RvbUVsZW1lbnRzLmdldCgibWVkaWEtY2hyb21lLW1lbnUtaXRlbSIpfHxsLmN1c3RvbUVsZW1lbnRzLmRlZmluZSgibWVkaWEtY2hyb21lLW1lbnUtaXRlbSIsaWkpO2dsb2JhbFRoaXNbU3ltYm9sLmZvcigiZWQubWVkaWEuY29udHJvbHMudjEiKV09e3ZlcnNpb246IjQuMTkuMiJ9O2dsb2JhbFRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoImVkLW1lZGlhLWNvbnRyb2xzLXJlYWR5IikpO30pKCk7Cgp9Cg==","id":"u8ktk9a"},"tag":"media-controller","attributes":{"audio":"","role":"region","aria-label":"{props.title}","defaultstreamtype":"on-demand","novolumepref":"","nomutedpref":"","nohotkeys":"","breakpoints":"medium:480 wide:720","class":"ed-audio-player__controller"},"styles":["h5bdirh"]},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Media"},"tag":"audio","attributes":{"slot":"media","preload":"none","class":"ed-audio-player__media"},"styles":["8swo0qy"]},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Controls"},"tag":"div","attributes":{"class":"ed-audio-player__controls"},"styles":["wwgeisx"]},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Transport"},"tag":"media-control-bar","attributes":{"class":"ed-audio-player__transport"},"styles":["lp5jyra"]},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Back"},"tag":"media-seek-backward-button","attributes":{"seekoffset":"10","class":"ed-audio-player__back"},"styles":["1dirzho"]},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Play"},"tag":"media-play-button","attributes":{"class":"ed-audio-player__play"},"styles":["3gd1z6y"]},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Forward"},"tag":"media-seek-forward-button","attributes":{"seekoffset":"10","class":"ed-audio-player__forward"},"styles":["1zovyyv"]},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]}],"innerHTML":"\n\n\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Progress"},"tag":"media-control-bar","attributes":{"class":"ed-audio-player__progress"},"styles":["v18bkvg"]},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Timeline"},"tag":"media-time-range","attributes":{"class":"ed-audio-player__timeline"},"styles":["4ue51om"]},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Time"},"tag":"media-time-display","attributes":{"showduration":"","notoggle":"","class":"ed-audio-player__time"},"styles":["hu9dw4c"]},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]}],"innerHTML":"\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Utilities"},"tag":"media-control-bar","attributes":{"class":"ed-audio-player__utilities"},"styles":["owpsdl2"]},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Mute"},"tag":"media-mute-button","attributes":{"class":"ed-audio-player__mute"},"styles":["je7km66"]},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Volume"},"tag":"media-volume-range","attributes":{"class":"ed-audio-player__volume"},"styles":["qm0ap0b"]},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Rate"},"tag":"media-playback-rate-button","attributes":{"rates":"0.5 1 1.5 2","class":"ed-audio-player__rate"},"styles":["2wrflii"]},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]},{"blockName":"etch/condition","attrs":{"condition":{"leftHand":{"leftHand":"props.audio.trim()","operator":"!=","rightHand":"\"\""},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"@\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"{\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"}\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"&#\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().includes(\"&colon\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().startsWith(\"https://\")","operator":"isTruthy","rightHand":null},"operator":"||","rightHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().startsWith(\"http://\")","operator":"isTruthy","rightHand":null},"operator":"||","rightHand":{"leftHand":"props.audio.trim().includes(\":\")","operator":"isFalsy","rightHand":null}}},"operator":"isTruthy","rightHand":null}}}}}}},"conditionString":"props.audio.trim() != \"\" && !props.audio.trim().includes(\"@\") && !props.audio.trim().includes(\"{\") && !props.audio.trim().includes(\"}\") && !props.audio.trim().includes(\"&#\") && !props.audio.trim().toLowerCase().includes(\"&colon\") && (props.audio.trim().toLowerCase().startsWith(\"https://\") || props.audio.trim().toLowerCase().startsWith(\"http://\") || !props.audio.trim().includes(\":\"))"},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Download"},"tag":"a","attributes":{"download":"","href":"{props.audio.trim()}","class":"ed-audio-player__download"},"styles":["0h8bdaj"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.downloadLabel}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/condition","attrs":{"condition":{"leftHand":{"leftHand":{"leftHand":"props.audio.trim()","operator":"!=","rightHand":"\"\""},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"@\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"{\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"}\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"&#\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().includes(\"&colon\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().startsWith(\"https://\")","operator":"isTruthy","rightHand":null},"operator":"||","rightHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().startsWith(\"http://\")","operator":"isTruthy","rightHand":null},"operator":"||","rightHand":{"leftHand":"props.audio.trim().includes(\":\")","operator":"isFalsy","rightHand":null}}},"operator":"isTruthy","rightHand":null}}}}}}},"operator":"isFalsy","rightHand":null},"conditionString":"!(props.audio.trim() != \"\" && !props.audio.trim().includes(\"@\") && !props.audio.trim().includes(\"{\") && !props.audio.trim().includes(\"}\") && !props.audio.trim().includes(\"&#\") && !props.audio.trim().toLowerCase().includes(\"&colon\") && (props.audio.trim().toLowerCase().startsWith(\"https://\") || props.audio.trim().toLowerCase().startsWith(\"http://\") || !props.audio.trim().includes(\":\")))"},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Download"},"tag":"a","attributes":{"download":"","class":"ed-audio-player__download"},"styles":["0h8bdaj"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.downloadLabel}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]}],"innerHTML":"\n\n\n\n\n\n\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n\n",null,"\n\n",null,"\n\n",null,"\n"]}],"innerHTML":"\n\n\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n\n",null,"\n"]}],"innerHTML":"\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Status"},"tag":"p","attributes":{"role":"status","class":"ed-audio-player__status"},"styles":["ml0vw81"]},"innerBlocks":[{"blockName":"etch/condition","attrs":{"condition":{"leftHand":{"leftHand":{"leftHand":"props.audio.trim()","operator":"!=","rightHand":"\"\""},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"@\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"{\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"}\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"&#\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().includes(\"&colon\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().startsWith(\"https://\")","operator":"isTruthy","rightHand":null},"operator":"||","rightHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().startsWith(\"http://\")","operator":"isTruthy","rightHand":null},"operator":"||","rightHand":{"leftHand":"props.audio.trim().includes(\":\")","operator":"isFalsy","rightHand":null}}},"operator":"isTruthy","rightHand":null}}}}}}},"operator":"isFalsy","rightHand":null},"conditionString":"!(props.audio.trim() != \"\" && !props.audio.trim().includes(\"@\") && !props.audio.trim().includes(\"{\") && !props.audio.trim().includes(\"}\") && !props.audio.trim().includes(\"&#\") && !props.audio.trim().toLowerCase().includes(\"&colon\") && (props.audio.trim().toLowerCase().startsWith(\"https://\") || props.audio.trim().toLowerCase().startsWith(\"http://\") || !props.audio.trim().includes(\":\")))"},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"Select an audio file."},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/condition","attrs":{"condition":{"leftHand":{"leftHand":"props.audio.trim()","operator":"!=","rightHand":"\"\""},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"@\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"{\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"}\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"&#\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().includes(\"&colon\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().startsWith(\"https://\")","operator":"isTruthy","rightHand":null},"operator":"||","rightHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().startsWith(\"http://\")","operator":"isTruthy","rightHand":null},"operator":"||","rightHand":{"leftHand":"props.audio.trim().includes(\":\")","operator":"isFalsy","rightHand":null}}},"operator":"isTruthy","rightHand":null}}}}}}},"conditionString":"props.audio.trim() != \"\" && !props.audio.trim().includes(\"@\") && !props.audio.trim().includes(\"{\") && !props.audio.trim().includes(\"}\") && !props.audio.trim().includes(\"&#\") && !props.audio.trim().toLowerCase().includes(\"&colon\") && (props.audio.trim().toLowerCase().startsWith(\"https://\") || props.audio.trim().toLowerCase().startsWith(\"http://\") || !props.audio.trim().includes(\":\"))"},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Fallback"},"tag":"a","attributes":{"href":"{props.audio.trim()}","class":"ed-audio-player__fallback"},"styles":["gddc863"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"Open audio file"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/condition","attrs":{"condition":{"leftHand":{"leftHand":{"leftHand":"props.audio.trim()","operator":"!=","rightHand":"\"\""},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"@\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"{\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"}\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().includes(\"&#\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().includes(\"&colon\")","operator":"isFalsy","rightHand":null},"operator":"&&","rightHand":{"leftHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().startsWith(\"https://\")","operator":"isTruthy","rightHand":null},"operator":"||","rightHand":{"leftHand":{"leftHand":"props.audio.trim().toLowerCase().startsWith(\"http://\")","operator":"isTruthy","rightHand":null},"operator":"||","rightHand":{"leftHand":"props.audio.trim().includes(\":\")","operator":"isFalsy","rightHand":null}}},"operator":"isTruthy","rightHand":null}}}}}}},"operator":"isFalsy","rightHand":null},"conditionString":"!(props.audio.trim() != \"\" && !props.audio.trim().includes(\"@\") && !props.audio.trim().includes(\"{\") && !props.audio.trim().includes(\"}\") && !props.audio.trim().includes(\"&#\") && !props.audio.trim().toLowerCase().includes(\"&colon\") && (props.audio.trim().toLowerCase().startsWith(\"https://\") || props.audio.trim().toLowerCase().startsWith(\"http://\") || !props.audio.trim().includes(\":\")))"},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Fallback"},"tag":"a","attributes":{"class":"ed-audio-player__fallback"},"styles":["gddc863"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"Open audio file"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]}],"innerHTML":"\n\n\n\n\n\n\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n\n",null,"\n\n",null,"\n\n",null,"\n"]}],"properties":[{"name":"Audio File","key":"audio","description":"Choose an audio file from the Media Library or paste a direct http(s) URL, e.g. an MP3 or WAV. Leave empty to show a setup prompt.","type":{"primitive":"string","specialized":"image"},"default":""},{"name":"Title","key":"title","description":"Optional visible title, e.g. Episode 12: Interview. Also names the player for screen readers. Leave empty to hide it.","type":{"primitive":"string"},"default":""},{"name":"Artist / Author","key":"artist","description":"Optional artist, host or author shown under the title. Names the player when Title is empty.","type":{"primitive":"string"},"default":""},{"name":"Accessible Label","key":"accessibleLabel","description":"Screen-reader name of the player, in your site language. Empty uses Title, then Artist, then a localized Audio player label. Give unnamed players distinct labels.","type":{"primitive":"string"},"default":""},{"name":"Layout","key":"layout","description":"Compact: one row of controls in wide containers, stacked rows in narrow ones. Card: larger artwork and title with centered controls below.","type":{"primitive":"string","specialized":"select"},"default":"compact","selectOptionsString":"Compact : compact\nCard : card"},{"name":"Theme","key":"theme","description":"Inherit takes the surrounding text color and adapts to light or dark sections. Light and Dark draw a complete card from your ACSS colors. Fine-tune any detail with the ED Audio Player CSS variables.","type":{"primitive":"string","specialized":"select"},"default":"inherit","selectOptionsString":"Inherit : inherit\nLight : light\nDark : dark"},{"name":"Show Artwork","key":"showArtwork","description":"Show the Artwork image next to the title. It is decorative, so screen readers skip it.","type":{"primitive":"boolean"},"default":false},{"name":"Artwork","key":"artwork","description":"Image from the Media Library, shown square and cropped to fit. Used only when Show Artwork is on.","type":{"primitive":"string","specialized":"wpMediaId"},"default":""},{"name":"Loop","key":"loop","description":"Start again from the beginning when the audio ends.","type":{"primitive":"boolean"},"default":false},{"name":"Show Download","key":"showDownload","description":"Show a download link to the audio file. Browsers may open files from other domains instead of saving them.","type":{"primitive":"boolean"},"default":false},{"name":"Download Label","key":"downloadLabel","description":"Text of the download link in your site language, e.g. Pobierz. Empty or the default Download follows the selected language.","type":{"primitive":"string"},"default":"Download"},{"name":"Load Media","key":"loadMedia","description":"When Visible loads the file once the player is near the screen. Eager loads its details with the page. On Interaction loads nothing until Play, best for many players.","type":{"primitive":"string","specialized":"select"},"default":"visible","selectOptionsString":"When Visible : visible\nEager : eager\nOn Interaction : interaction"},{"name":"Auto Pause Other Players","key":"autoPauseOtherPlayers","description":"Starting this player pauses other ED Audio and Video Players on the page. Off: it does not pause others but can still be paused by them.","type":{"primitive":"boolean"},"default":true},{"name":"Language","key":"language","description":"Translate controls and messages. Automatic follows the nearest language setting or the page language; unsupported languages use English. Each player is independent.","type":{"primitive":"string","specialized":"select"},"default":"auto","selectOptionsString":"Automatic : auto\nEnglish : en\nPolski : pl"},{"name":"Remember Position","key":"resumePlayback","description":"Remember the listening position in this browser for 30 days. Requires a stable Recording ID. Off by default; never starts playback automatically.","type":{"primitive":"boolean"},"default":false},{"name":"Recording ID","key":"resumeKey","description":"A stable, unique ID for this recording when Remember Position is on. Leave empty to disable storage. Reuse the ID only for the same recording.","type":{"primitive":"string"},"default":""},{"name":"System Media Controls","key":"mediaSession","description":"Let the last playing enabled player supply title, artwork and controls to the system media panel. Browser support varies. Off by default.","type":{"primitive":"boolean"},"default":false}],"description":"ED Audio Player 1.0.0-beta.2 by EtchDeveloper. Copyright 2026 Tom Chmiel, FSL-1.1-MIT (etchdeveloper.com/license). Controls: Media Chrome 4.19.2, Copyright (c) 2020 Mux, Inc., MIT."}},"version":2.1}Stay up to date. Etch won’t update a pasted component for you. Subscribe and get one email when a new version is out.
12 players in real layouts
Press Play, use Tab and the arrow keys, or pause the podcast, reload and play again. Switch to Mobile to see the controls stack at phone width.
What it does
One pasted component and no setup. The controls are Media Chrome by Mux, bundled into the component, so there is no plugin, no CDN and no extra request.
Every control you expect
Play, back and forward 10 seconds, a timeline with the time, mute, volume and speed from 0.5× to 2×, plus an optional download link. Starting one player pauses the others.
Two layouts, three themes
Compact fits one row in a wide column and stacks in a narrow one; Card adds square artwork. Inherit follows the section around it, Light and Dark draw a finished card from your ACSS colors.
Accessible by default
Eight Tab stops per player, named controls, arrow keys on the timeline and volume, a visible focus ring and 44 px targets. Checked with VoiceOver in Safari.
Loads only what it needs
When Visible waits until the player nears the screen, On Interaction loads nothing until Play, and Eager reads the length with the page. No autoplay, ever.
Remembers where you stopped
Optional Remember Position keeps the spot in the browser for 30 days. System Media Controls show the title and artwork in the system media panel, where the browser supports it.
English and Polish
Controls, tooltips, slider values and messages follow the page language, or you pin one player to English or Polski. Titles stay exactly as you type them.
51 styling variables
Colors, sizes, corners, the track, the focus ring and tooltips, set on any parent class. ACSS 4 tokens with plain fallbacks, so it works without Automatic.css too.
Live in the builder
The canvas runs the real player, so every prop edit shows at once, without saving. Press Play right in the canvas to hear the file you picked.
Add it in four steps
No plugin and no build step. The component brings its own CSS and two scripts, the player and the bundled Media Chrome controls, so nothing loads from a CDN. It works with or without Automatic.css 4.
Shows without its styles? It was pasted but not saved, and pasting again won’t repair it. Delete ED Audio Player from your components, paste it again and click Save.
- Copy the componentUse Copy component at the top of this page, or download the .json file.
- Paste it on the Etch canvasSelect where it should go, press Ctrl+V or ⌘V, then click Save. Etch adds the component to your list right away but stores its CSS only when you save.
- Choose an audio fileIn Audio File, pick an MP3 or WAV from the Media Library or paste a direct link, then add a Title. The field’s placeholder says Image URL, but the picker accepts audio.
- Save and open the pageThe canvas runs the real player, so every setting you change shows at once. On the page, visitors press Play or use the keyboard.
17 settings in the Etch props panel
In the order of the Etch props panel, where each setting has help text too. Only Audio File is needed; without it, a new player shows a short setup prompt.
Free to use. Not for resale.
Licensed under FSL-1.1-MIT, the Functional Source License with an MIT future license. Each version becomes MIT-licensed two years after its release.
- Use it on unlimited personal, client and commercial websites
- Modify and adapt it however you like
- Use it in paid design and development work for your clients
- Sell it, or a modified version, as a component: in a library, bundle, template kit, plugin or marketplace listing
- Offer it in another commercial product or service that competes with it
Keep the copyright and license notices in the code, and link to this page instead of re-hosting the download, so everyone gets fixes and updates. Read the full license
Third-party code
This component bundles the open-source library below, unchanged. It keeps its own license, and FSL-1.1-MIT does not apply to it. Its full notice opens the component’s controls script and the CSS names it; keep both when you use or change the component.
- Media Chrome4.19.2
How to update
Etch has no update button for pasted components. Pasting a newer version over an installed one changes nothing: Etch keeps the component and the CSS it already has. To update, reinstall in five steps.
- Note what you setWrite down the settings of each player, including its audio file, artwork and Recording ID, and copy any CSS you changed in the component’s own styles.
- Delete the componentIn Etch, delete ED Audio Player from your components. Every player disappears from every page that used it.
- Delete its stylesIn the Style Manager, search for ed-audio-player and delete the 24 styles listed below. Only the first one holds CSS; the others are empty class names.
- Paste the new versionCopy or download the new JSON from this page, paste it on the canvas and click Save. Etch creates the component and its CSS fresh.
- Put your players backInsert a player wherever one was, choose its audio file, re-enter its settings and save. Reload any other open builder tab.
Styles to delete in step 3
.ed-audio-player.ed-audio-player__header.ed-audio-player__artwork.ed-audio-player__image.ed-audio-player__meta.ed-audio-player__title.ed-audio-player__artist.ed-audio-player__controller.ed-audio-player__media.ed-audio-player__controls.ed-audio-player__transport.ed-audio-player__back.ed-audio-player__play.ed-audio-player__forward.ed-audio-player__progress.ed-audio-player__timeline.ed-audio-player__time.ed-audio-player__utilities.ed-audio-player__mute.ed-audio-player__volume.ed-audio-player__rate.ed-audio-player__download.ed-audio-player__status.ed-audio-player__fallback
Trade-offs
- Placements are not kept. Etch doesn’t link old players to the new component, so you insert each one again and re-enter its settings.
- Edits inside the component’s CSS are replaced. Keep overrides on a parent class with the
--ed-audio-player-*variables; those survive an update. - Skipping a step leaves a mix. Without step 2, Etch keeps the old component. Without step 3, the new version runs on the old CSS.
- Saved positions carry over. Remember Position keys each position by Recording ID and audio file, so reuse both and listeners keep their place.
Coming from 1.0.0-beta.1? Follow the five steps above. Settings, classes and styling variables are unchanged, so you can re-enter your settings as they were. Subscribe and you’ll get one email when the next version is out.
What changed
Versions follow semantic versioning. When an update changes how existing options behave, its entry says so.
1.0.0-beta.2Latest
- FixedWith TalkBack, swiping up or down on the timeline or the volume jumped to the start or the end; with VoiceOver the sliders didn’t move. One swipe now moves either slider by 5%, and the arrow keys keep their steps.
- FixedWith TalkBack resting on the timeline, the position was read out every second while the audio played. The timeline now stays quiet during playback; the visible time keeps running.
- FixedOn phones and tablets, a vertical swipe that starts on the timeline or the volume slider now scrolls the page instead of seeking or changing the volume. A tap still sets the value, and a sideways drag scrubs.
- ChangedOn iPhone the volume slider is hidden, because iOS sets the volume only with the hardware buttons. Mute stays, and iPad and desktop keep the slider.
- FixedA wide Compact player could load in the narrow three-row layout (seen in Microsoft Edge). In Safari, a paused timeline now shows exactly where playback stopped.
- ChangedThe player script and the CSS of
.ed-audio-playerchanged, so update the component and its styles together (see How to update). Props, classes, styling variables and the bundled Media Chrome 4.19.2 are the same. - TestedTalkBack on Android, Safari on iPhone and iPad in the iOS Simulator, and Chrome, Firefox, Microsoft Edge and WebKit on the desktop. It stays a beta until NVDA and VoiceOver on a real iPhone are tested.
1.0.0-beta.1
- ReleasedFirst public version. It stays a beta until NVDA, VoiceOver on iOS, TalkBack, Microsoft Edge and touch devices are tested.
Tell me what this component needs
A bug, a missing option, or anything that made the component awkward to use in a real build — it all belongs here. The versions above are the ones it was tested on; if yours differ, say so.