Files
thpeetz-notes/.obsidian/plugins/callout-manager/styles.css
T
2026-09-01 11:05:57 +02:00

442 lines
121 KiB
CSS

.mod-sidebar-layout .calloutmanager-setting-tab.vertical-tab-content {
position: relative;
padding: 0 !important;
display: flex;
flex-direction: column;
overflow-y: initial;
}
.mod-sidebar-layout .calloutmanager-setting-tab.vertical-tab-content {
--cm-setting-tab-controls-margin: calc(var(--size-4-12) - (var(--size-4-2) - var(--size-4-1)));
}
body.is-phone .mod-sidebar-layout .calloutmanager-setting-tab.vertical-tab-content {
--cm-setting-tab-controls-margin: var(--size-4-2);
}
.calloutmanager-setting-tab-header {
display: flex;
align-items: center;
padding-top: var(--size-4-1);
padding-bottom: var(--size-4-1);
padding-right: var(--size-4-2);
border-bottom: 1px solid var(--background-modifier-border);
background-color: var(--background-secondary);
}
body.is-phone .calloutmanager-setting-tab-header {
background-color: var(--background-primary);
margin-top: var(--modal-header-height);
}
.calloutmanager-setting-tab-nav {
display: flex;
align-items: center;
justify-content: center;
min-width: var(--size-4-12);
min-height: calc(var(--size-4-2) + var(--input-height));
}
.calloutmanager-setting-tab-nav button {
padding: var(--size-4-1) var(--size-4-2);
box-shadow: none;
}
body.is-mobile .calloutmanager-setting-tab-nav {
padding: var(--size-4-2);
}
body.is-phone .calloutmanager-setting-tab-nav, body.is-phone .calloutmanager-setting-tab-nav button {
height: 100%;
min-width: unset;
}
.calloutmanager-setting-tab-controls {
flex: 3 3;
display: flex;
align-items: center;
justify-content: end;
gap: var(--size-4-2);
padding-left: var(--cm-setting-tab-controls-margin);
}
.calloutmanager-setting-tab-controls > *:not(.modal-close-button) {
display: contents;
}
.calloutmanager-setting-tab-controls > *:not(.modal-close-button) > input[type=text] {
flex: 1 1 auto;
}
.calloutmanager-setting-tab-controls .modal-close-button {
flex: 0 0 auto;
position: static;
left: unset;
top: 0;
right: 0;
bottom: 0;
}
body.is-phone .calloutmanager-setting-tab-controls .modal-close-button {
display: none;
}
.calloutmanager-setting-tab-title {
flex: 1 1 auto;
flex-wrap: nowrap;
}
.calloutmanager-setting-tab-title h2,
.calloutmanager-setting-tab-title h3 {
margin: 0;
word-break: keep-all;
}
.calloutmanager-setting-tab-title h3 {
font-size: var(--font-ui-small);
}
body:not(.is-phone) .calloutmanager-setting-tab-title h3 {
font-size: 0.8em;
}
body.is-phone .calloutmanager-setting-tab-title h2:has(+ h3) {
display: none;
}
.calloutmanager-setting-tab-viewport {
flex: 1 2 auto;
}
body.is-phone .calloutmanager-setting-tab-viewport {
--modal-header-height: var(--size-2-1);
}
.calloutmanager-setting-tab-viewport {
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
.calloutmanager-setting-tab-content {
flex: 1 1 auto;
}
.calloutmanager-setting-tab-content body:not(.is-phone) {
min-height: 100%;
}
.calloutmanager-search-error {
width: 60%;
}
body.is-phone .calloutmanager-search-error {
width: 100%;
}
.calloutmanager-search-error code {
word-break: break-all;
color: var(--text-accent);
}
.calloutmanager-search-error-suggestions {
color: var(--text-muted);
}
.calloutmanager-preview-container-with-button {
--calloutmanager-callout-edit-buttons-size: calc(var(--input-height) + 2 * var(--size-4-3));
}
body.is-phone .calloutmanager-preview-container-with-button {
--calloutmanager-callout-edit-buttons-size: var(--input-height);
}
.calloutmanager-preview-container-with-button {
display: grid;
grid-template-columns: 1fr var(--calloutmanager-callout-edit-buttons-size) var(--calloutmanager-callout-edit-buttons-size);
align-items: center;
gap: var(--size-4-2);
}
.calloutmanager-preview-container-with-button > button {
width: var(--calloutmanager-callout-edit-buttons-size);
height: 100%;
}
body:not(.is-phone) .calloutmanager-preview-container-with-button > button {
display: block;
padding: 0 !important;
}
.calloutmanager-callout-resolver {
display: none !important;
}
.calloutmanager-latest-changes {
padding: var(--size-4-4);
}
.calloutmanager-latest-changes .calloutmanager-changelog-section > :first-child {
margin-top: 0;
}
.calloutmanager-latest-changes .calloutmanager-changelog-section > :last-child {
margin-bottom: 0;
}
.calloutmanager-latest-changes .callout {
background: none;
}
.calloutmanager-edit-callout-section {
border-top: 1px solid var(--background-modifier-border);
padding-top: var(--size-4-3);
padding-bottom: var(--size-4-6);
}
.calloutmanager-edit-callout-section:empty {
display: none;
}
.calloutmanager-edit-callout-section--noborder {
border-top: none;
}
.calloutmanager-edit-callout-section .setting-item .setting-item-description p {
margin: 0;
}
.calloutmanager-edit-callout-section h2 {
margin-bottom: 0.3em;
}
.calloutmanager-edit-callout-section h2 + p {
margin-top: 0;
}
.calloutmanager-edit-callout-appearance .setting-item {
border-top: none;
padding-top: 0.375em;
}
.calloutmanager-edit-callout-appearance .setting-item:has(+ .setting-item) {
padding-bottom: 0.375em;
}
body.is-phone .calloutmanager-edit-callout-appearance .setting-item:has(+ .setting-item) {
margin-bottom: 0.7em;
}
.calloutmanager-edit-callout-appearance-json pre {
border: rgba(var(--background-modifier-border)) 1px solid;
border-radius: var(--callout-radius);
padding: var(--size-4-2);
background: var(--background-primary-alt);
overflow-x: auto;
margin: 0;
}
.calloutmanager-edit-callout-appearance-reset {
width: 100%;
}
.callout.calloutmanager-preview {
mix-blend-mode: unset !important;
margin: 0 !important;
}
.calloutmanager-preview-container {
margin-top: 0.5em;
margin-bottom: 0.5em;
}
.calloutmanager-centerbox {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.calloutmanager-pane button[disabled] {
box-shadow: none;
background-color: var(--interactive-normal);
}
.calloutmanager-pane button[disabled]:hover {
background-color: var(--interactive-normal);
cursor: not-allowed;
}
.calloutmanager-pane input[type=color][disabled] {
cursor: not-allowed;
}
.calloutmanager-pane input:invalid:not(:placeholder-shown),
.calloutmanager-pane input.invalid {
border-color: var(--text-error);
}
body.is-phone .calloutmanager-pane input[type=color]::-webkit-color-swatch {
border-radius: var(--button-radius);
border: #f00 2px solid;
border: 1px solid var(--checkbox-border-color);
}
.calloutmanager-pane .clickable-icon.mod-warning {
color: var(--text-error);
background: transparent;
}
.calloutmanager-pane .clickable-icon.mod-warning:hover {
color: var(--text-error);
background: transparent;
}
.calloutmanager-pane input[type=text].mod-error {
border-color: var(--text-error);
}
body.is-phone .calloutmanager-setting-tab-content .setting-item-control button.clickable-icon,
body.is-phone .calloutmanager-setting-tab-controls button.clickable-icon {
width: var(--button-height);
}
body.is-phone .calloutmanager-setting-tab-content .setting-item-control button.clickable-icon {
border: 1px solid var(--checkbox-border-color);
}
.calloutmanager-changelog > *:not(:first-child) {
margin-top: 1em;
}
.calloutmanager-changelog {
--callout-blend-mode: normal;
}
.calloutmanager-changelog details > summary::marker {
color: var(--text-faint);
}
.calloutmanager-changelog details[open] > summary::marker {
color: var(--text-muted);
}
.calloutmanager-changelog details .calloutmanager-changelog-section {
border-bottom: 1px solid var(--background-modifier-border);
margin-bottom: 1.25em;
padding-bottom: 1.25em;
}
.calloutmanager-changelog details .calloutmanager-changelog-section > :last-child {
margin-bottom: 0;
}
.calloutmanager-changelog details:not([data-current-version=true]) .calloutmanager-changelog-heading {
color: var(--text-muted);
}
.calloutmanager-changelog-section .callout {
--callout-padding: 0.5em;
}
.calloutmanager-changelog-section .callout > .callout-content {
margin-left: calc(18px + 0.25em);
overflow-y: hidden;
}
.calloutmanager-changelog-section .callout > .callout-content > :first-child {
margin-top: 0;
}
.calloutmanager-changelog-section .callout > .callout-content > :last-child {
margin-bottom: 0;
}
.callout[data-calloutmanager-changelog-callout=new] {
--callout-icon: lucide-plus;
--callout-color: rgb(30, 160, 30);
}
.theme-dark .callout[data-calloutmanager-changelog-callout=new] {
--callout-color: rgb(60, 250, 60);
}
.callout[data-calloutmanager-changelog-callout=fix] {
--callout-icon: lucide-wrench;
--callout-color: rgb(128, 128, 128);
}
.theme-dark .callout[data-calloutmanager-changelog-callout=fix] {
--callout-color: rgb(180, 180, 180);
}
.callout[data-calloutmanager-changelog-callout=change] {
--callout-icon: lucide-edit-3;
--callout-color: rgb(10, 170, 210);
}
.theme-dark .callout[data-calloutmanager-changelog-callout=change] {
--callout-color: rgb(60, 157, 210);
}
.calloutmanager-changelog-heading {
display: inline;
font-weight: bold;
}
.calloutmanager-edit-callout-preview {
padding-bottom: var(--size-4-8);
min-height: 14em;
}
body.is-mobile .calloutmanager-edit-callout-preview {
min-height: 35vh;
}
.calloutmanager-preview-editor {
resize: vertical;
width: 100%;
min-height: 6em;
margin-top: var(--size-4-3);
background: transparent;
font-size: var(--font-text-size);
font-family: var(--font-text);
line-height: var(--line-height-normal);
}
.calloutmanager-edit-callout-info {
color: var(--text-muted);
}
.calloutmanager-edit-callout--invalid-color {
color: var(--text-error);
}
.calloutmanager-edit-callout--callout-color {
color: rgb(var(--resolved-callout-color));
}
.calloutmanager-edit-callout--callout-id,
.calloutmanager-edit-callout--callout-icon,
.calloutmanager-edit-callout--callout-source {
color: var(--text-normal);
}
:root {
--calloutmanager-icon-picker-size: 100px;
--calloutmanager-icon-picker-gap: 8px;
--calloutmanager-icon-picker-icon-size: 2.5em;
--calloutmanager-icon-picker-id-size: 0.75em;
}
.calloutmanager-icon-picker {
display: grid;
grid-template-columns: repeat(auto-fill, var(--calloutmanager-icon-picker-size));
grid-auto-rows: var(--calloutmanager-icon-picker-size);
gap: var(--calloutmanager-icon-picker-gap);
justify-content: center;
}
.calloutmanager-icon-picker .calloutmanager-icon-preview {
height: 100%;
--calloutmanager-icon-preview-icon-size: var(--calloutmanager-icon-picker-icon-size);
--calloutmanager-icon-preview-id-size: var(--calloutmanager-icon-picker-id-size);
}
:root {
--calloutmanager-reset-button-disabled-opacity: 0.3;
}
.calloutmanager-reset-button:is(.is-disabled, [disabled]) {
opacity: var(--calloutmanager-reset-button-disabled-opacity);
}
.calloutmanager-reset-button:is(.is-disabled, [disabled]):hover {
background-color: transparent;
}
.calloutmanager-reset-button:is(.is-disabled, [disabled]):active {
color: var(--icon-color);
}
:root {
--calloutmanager-icon-preview-icon-size: 1em;
--calloutmanager-icon-preview-id-size: 0.8em;
}
.calloutmanager-icon-preview {
position: relative;
height: unset;
min-height: 3em;
display: flex;
flex-direction: column;
}
.calloutmanager-icon-preview--icon {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, calc(-50% - 0.5em));
--icon-size: var(--calloutmanager-icon-picker-icon-size);
}
.calloutmanager-icon-preview--id {
width: 100%;
margin-top: auto;
white-space: normal;
word-break: break-word;
hyphens: manual;
font-size: var(--calloutmanager-icon-picker-id-size);
}
/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX19maW5hbF9fLmNzcyIsInNvdXJjZXMiOlsic3JjL3VpL2NvbXBvbmVudC9pY29uLXByZXZpZXcudHMiLCJzcmMvdWkvY29tcG9uZW50L3Jlc2V0LWJ1dHRvbi50cyIsInNyYy9wYW5lcy9zZWxlY3QtaWNvbi1wYW5lLnRzIiwic3JjL3BhbmVzL2VkaXQtY2FsbG91dC1wYW5lL3NlY3Rpb24taW5mby50cyIsInNyYy9wYW5lcy9lZGl0LWNhbGxvdXQtcGFuZS9zZWN0aW9uLXByZXZpZXcudHMiLCJzcmMvY2hhbmdlbG9nLnRzIiwic3JjL3BhbmVzL2NoYW5nZWxvZy1wYW5lLnRzIiwic3JjL3VpL3BhbmUudHMiLCJzcmMvdWkvY29tcG9uZW50L2NhbGxvdXQtcHJldmlldy50cyIsInNyYy9wYW5lcy9lZGl0LWNhbGxvdXQtcGFuZS9pbmRleC50cyIsInNyYy9wYW5lcy9tYW5hZ2UtcGx1Z2luLXBhbmUudHMiLCJzcmMvY2FsbG91dC1yZXNvbHZlci50cyIsInNyYy9wYW5lcy9tYW5hZ2UtY2FsbG91dHMtcGFuZS50cyIsInNyYy91aS9wYW5lZC1zZXR0aW5nLXRhYi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGdldEljb24gfSBmcm9tICdvYnNpZGlhbic7XG5cbi8qKlxuICogQSBwcmV2aWV3IG9mIGFuIGljb24uXG4gKlxuICogVGhpcyBpcyBhIGJ1dHRvbiB0aGF0IHNob3dzIHRoZSBpY29uIGdyYXBoaWMgYW5kIGl0cyBuYW1lLlxuICovXG5leHBvcnQgY2xhc3MgSWNvblByZXZpZXdDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50RWw6IEhUTUxFbGVtZW50O1xuXHRwdWJsaWMgcmVhZG9ubHkgaWNvbkVsOiBIVE1MRWxlbWVudDtcblx0cHVibGljIHJlYWRvbmx5IGlkRWw6IEhUTUxFbGVtZW50O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250YWluZXJFbDogSFRNTEVsZW1lbnQpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMuY29tcG9uZW50RWwgPSBjb250YWluZXJFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyBjbHM6ICdjYWxsb3V0bWFuYWdlci1pY29uLXByZXZpZXcnIH0pO1xuXHRcdHRoaXMuaWNvbkVsID0gdGhpcy5jb21wb25lbnRFbC5jcmVhdGVEaXYoeyBjbHM6ICdjYWxsb3V0bWFuYWdlci1pY29uLXByZXZpZXctLWljb24nIH0pO1xuXHRcdHRoaXMuaWRFbCA9IHRoaXMuY29tcG9uZW50RWwuY3JlYXRlRGl2KHsgY2xzOiAnY2FsbG91dG1hbmFnZXItaWNvbi1wcmV2aWV3LS1pZCcgfSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgaWNvbiBvZiB0aGUgaWNvbiBwcmV2aWV3IGNvbXBvbmVudC5cblx0ICogVGhpcyB3aWxsIHVwZGF0ZSB0aGUgbGFiZWwgYW5kIHRoZSBpY29uIFNWRy5cblx0ICpcblx0ICogQHBhcmFtIGljb24gVGhlIGljb24gbmFtZS5cblx0ICogQHJldHVybnMgVGhpcywgZm9yIGNoYWluaW5nLlxuXHQgKi9cblx0cHVibGljIHNldEljb24oaWNvbjogc3RyaW5nKTogdHlwZW9mIHRoaXMge1xuXHRcdGNvbnN0IGljb25TdmcgPSBnZXRJY29uKGljb24pO1xuXG5cdFx0dGhpcy5jb21wb25lbnRFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWNvbi1pZCcsIGljb24pO1xuXHRcdHRoaXMuaWRFbC50ZXh0Q29udGVudCA9IGljb247XG5cdFx0dGhpcy5pY29uRWwuZW1wdHkoKTtcblx0XHRpZiAoaWNvblN2ZyAhPSBudWxsKSB7XG5cdFx0XHR0aGlzLmljb25FbC5hcHBlbmRDaGlsZChpY29uU3ZnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBgY2xpY2tgIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyLlxuXHQgKiBAcmV0dXJucyBUaGlzLCBmb3IgY2hhaW5pbmcuXG5cdCAqL1xuXHRwdWJsaWMgb25DbGljayhsaXN0ZW5lcjogKGV2dDogTW91c2VFdmVudCkgPT4gdm9pZCk6IHR5cGVvZiB0aGlzIHtcblx0XHR0aGlzLmNvbXBvbmVudEVsLm9uY2xpY2sgPSBsaXN0ZW5lcjtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5kZWNsYXJlIGNvbnN0IFNUWUxFUzogYFxuXHQ6cm9vdCB7XG5cdFx0LS1jYWxsb3V0bWFuYWdlci1pY29uLXByZXZpZXctaWNvbi1zaXplOiAxZW07XG5cdFx0LS1jYWxsb3V0bWFuYWdlci1pY29uLXByZXZpZXctaWQtc2l6ZTogMC44ZW07XG5cdH1cblxuXHQuY2FsbG91dG1hbmFnZXItaWNvbi1wcmV2aWV3IHtcblx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0aGVpZ2h0OiB1bnNldDtcblx0XHRtaW4taGVpZ2h0OiAzZW07XG5cblx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdH1cblxuXHQuY2FsbG91dG1hbmFnZXItaWNvbi1wcmV2aWV3LS1pY29uIHtcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0dG9wOiA1MCU7XG5cdFx0bGVmdDogNTAlO1xuXHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIGNhbGMoLTUwJSAtIDAuNWVtKSk7XG5cblx0XHQtLWljb24tc2l6ZTogdmFyKC0tY2FsbG91dG1hbmFnZXItaWNvbi1waWNrZXItaWNvbi1zaXplKTtcblx0fVxuXG5cdC5jYWxsb3V0bWFuYWdlci1pY29uLXByZXZpZXctLWlkIHtcblx0XHR3aWR0aDogMTAwJTtcblx0XHRtYXJnaW4tdG9wOiBhdXRvO1xuXG5cdFx0Ly8gQnJlYWsgd29yZHMuXG5cdFx0d2hpdGUtc3BhY2U6IG5vcm1hbDtcblx0XHR3b3JkLWJyZWFrOiBicmVhay13b3JkO1xuXHRcdGh5cGhlbnM6IG1hbnVhbDtcblxuXHRcdGZvbnQtc2l6ZTogdmFyKC0tY2FsbG91dG1hbmFnZXItaWNvbi1waWNrZXItaWQtc2l6ZSk7XG5cdH1cbmA7XG4iLCJpbXBvcnQgeyBFeHRyYUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ29ic2lkaWFuJztcblxuLyoqXG4gKiBBIHJlc2V0IGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc2V0QnV0dG9uQ29tcG9uZW50IGV4dGVuZHMgRXh0cmFCdXR0b25Db21wb25lbnQge1xuXHRwdWJsaWMgY29uc3RydWN0b3IoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSB7XG5cdFx0c3VwZXIoY29udGFpbmVyRWwpO1xuXHRcdHRoaXMuc2V0SWNvbignbHVjaWRlLXVuZG8nKTtcblx0XHR0aGlzLmV4dHJhU2V0dGluZ3NFbC5jbGFzc0xpc3QuYWRkKCdjYWxsb3V0bWFuYWdlci1yZXNldC1idXR0b24nKTtcblx0fVxufVxuXG5kZWNsYXJlIGNvbnN0IFNUWUxFUzogYFxuXHQ6cm9vdCB7XG5cdFx0LS1jYWxsb3V0bWFuYWdlci1yZXNldC1idXR0b24tZGlzYWJsZWQtb3BhY2l0eTogMC4zO1xuXHR9XG5cblx0Ly8gVGhlIFwidW5kb1wiIGJ1dHRvbiB3aGVuIHRoZSBzZXR0aW5nIGhhcyBub3QgYmVlbiBjaGFuZ2VkIGZyb20gdGhlIGRlZmF1bHQuXG5cdC5jYWxsb3V0bWFuYWdlci1yZXNldC1idXR0b246aXMoLmlzLWRpc2FibGVkLCBbZGlzYWJsZWRdKSB7XG5cdFx0b3BhY2l0eTogdmFyKC0tY2FsbG91dG1hbmFnZXItcmVzZXQtYnV0dG9uLWRpc2FibGVkLW9wYWNpdHkpO1xuXG5cdFx0Jjpob3ZlciB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcblx0XHR9XG5cblx0XHQmOmFjdGl2ZSB7XG5cdFx0XHRjb2xvcjogdmFyKC0taWNvbi1jb2xvcik7XG5cdFx0fVxuXHR9XG5gO1xuIiwiaW1wb3J0IHsgU2VhcmNoUmVzdWx0LCBUZXh0Q29tcG9uZW50LCBnZXRJY29uSWRzLCBwcmVwYXJlRnV6enlTZWFyY2ggfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCBDYWxsb3V0TWFuYWdlclBsdWdpbiBmcm9tICcmcGx1Z2luJztcblxuaW1wb3J0IHsgSWNvblByZXZpZXdDb21wb25lbnQgfSBmcm9tICcmdWkvY29tcG9uZW50L2ljb24tcHJldmlldyc7XG5pbXBvcnQgeyBVSVBhbmUsIFVJUGFuZVRpdGxlIH0gZnJvbSAnJnVpL3BhbmUnO1xuXG5jb25zdCByZWNlbnRJY29uczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKlxuICogQSB1c2VyIGludGVyZmFjZSBwYW5lIGZvciBzZWxlY3RpbmcgYW4gaWNvbi5cbiAqXG4gKiBUaGlzIHByb3ZpZGVzIGEgc2VhcmNoYWJsZSBncmlkIG9mIGljb25zIHRoYXQgdGhlIHVzZXIgY2FuIHNjcm9sbCB0aHJvdWdoLlxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0SWNvblBhbmUgZXh0ZW5kcyBVSVBhbmU8dm9pZD4ge1xuXHRwdWJsaWMgcmVhZG9ubHkgdGl0bGU6IFVJUGFuZVRpdGxlO1xuXHRwcml2YXRlIHBsdWdpbjogQ2FsbG91dE1hbmFnZXJQbHVnaW47XG5cblx0cHJpdmF0ZSBzZWFyY2hRdWVyeTogc3RyaW5nO1xuXHRwcml2YXRlIHNlYXJjaFJlc3VsdHM6IEljb25Gb3JTZWFyY2hbXTtcblxuXHRwcml2YXRlIHVzZWRJY29uczogTWFwPHN0cmluZywgSWNvbkZvclNlYXJjaD47XG5cdHByaXZhdGUgYWxsSWNvbnM6IEljb25Gb3JTZWFyY2hbXTtcblx0cHJpdmF0ZSBwcmV2aWV3TGltaXQ6IG51bWJlcjtcblx0cHJpdmF0ZSBwcmV2aWV3TGltaXRPdmVyYWdlOiBudW1iZXI7XG5cdHByaXZhdGUgb25DaG9vc2U6IChpY29uOiBzdHJpbmcpID0+IHZvaWQ7XG5cblx0cHJpdmF0ZSBjb21wYXJlSWNvbnM6IChhOiBJY29uRm9yU2VhcmNoLCBiOiBJY29uRm9yU2VhcmNoKSA9PiBudW1iZXI7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHBsdWdpbjogQ2FsbG91dE1hbmFnZXJQbHVnaW4sXG5cdFx0dGl0bGU6IFVJUGFuZVRpdGxlLFxuXHRcdG9wdGlvbnM6IHsgbGltaXQ/OiBudW1iZXI7IG9uQ2hvb3NlOiAoaWNvbjogc3RyaW5nKSA9PiB2b2lkIH0sXG5cdCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy50aXRsZSA9IHRpdGxlO1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXHRcdHRoaXMub25DaG9vc2UgPSBvcHRpb25zLm9uQ2hvb3NlO1xuXG5cdFx0dGhpcy5wcmV2aWV3TGltaXQgPSBvcHRpb25zLmxpbWl0ID8/IDI1MDtcblx0XHR0aGlzLnByZXZpZXdMaW1pdE92ZXJhZ2UgPSAwO1xuXG5cdFx0dGhpcy5zZWFyY2hRdWVyeSA9ICcnO1xuXHRcdHRoaXMuc2VhcmNoUmVzdWx0cyA9IFtdO1xuXG5cdFx0Ly8gR2VuZXJhdGUgc3VnZ2VzdGlvbnMgYmFzZWQgb24gd2hhdCBvdGhlciBjYWxsb3V0cyBhcmUgdXNpbmcuXG5cdFx0Y29uc3QgdXNlZEljb25JZHMgPSBuZXcgU2V0KHBsdWdpbi5jYWxsb3V0cy52YWx1ZXMoKS5tYXAoKGMpID0+IGMuaWNvbikpO1xuXHRcdGNvbnN0IHVzZWRJY29ucyA9ICh0aGlzLnVzZWRJY29ucyA9IG5ldyBNYXAoKSk7XG5cblx0XHQvLyBDcmVhdGUgYW4gZWFzaWx5LXNlYXJjaGFibGUgbGlzdCBvZiBpY29ucy5cblx0XHR0aGlzLmFsbEljb25zID0gZ2V0SWNvbklkcygpLm1hcCgoaWQpID0+IHtcblx0XHRcdGNvbnN0IGljb246IEljb25Gb3JTZWFyY2ggPSB7XG5cdFx0XHRcdGlkLFxuXHRcdFx0XHRzZWFyY2hJZDogaWQudHJpbSgpLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdGNvbXBvbmVudDogbnVsbCxcblx0XHRcdFx0c2VhcmNoUmVzdWx0OiBudWxsLFxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHVzZWRJY29uSWRzLmhhcyhpZCkpIHtcblx0XHRcdFx0dGhpcy51c2VkSWNvbnMuc2V0KGlkLCBpY29uKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGljb247XG5cdFx0fSk7XG5cblx0XHQvLyBDcmVhdGUgY29tcGFyYXRvciBmdW5jdGlvbi5cblx0XHR0aGlzLmNvbXBhcmVJY29ucyA9IChcblx0XHRcdHsgaWQ6IGEsIHNlYXJjaElkOiBhTEMsIHNlYXJjaFJlc3VsdDogYVNSIH0sXG5cdFx0XHR7IGlkOiBiLCBzZWFyY2hJZDogYkxDLCBzZWFyY2hSZXN1bHQ6IGJTUiB9LFxuXHRcdCkgPT4ge1xuXHRcdFx0Y29uc3QgcmVjZW5jeSA9IChyZWNlbnRJY29ucy5oYXMoYikgPyAxIDogMCkgLSAocmVjZW50SWNvbnMuaGFzKGEpID8gMSA6IDApO1xuXHRcdFx0Y29uc3Qgc3VnZ2VzdGVkID0gKHVzZWRJY29ucy5oYXMoYikgPyAxIDogMCkgLSAodXNlZEljb25zLmhhcyhhKSA/IDEgOiAwKTtcblx0XHRcdGNvbnN0IHNlYXJjaFJhbmsgPSAoYlNSPy5zY29yZSA/PyAwKSAtIChhU1I/LnNjb3JlID8/IDApO1xuXG5cdFx0XHQvLyBSYW5rZWQuXG5cdFx0XHRjb25zdCBzdW0gPSByZWNlbmN5ICsgc3VnZ2VzdGVkICsgc2VhcmNoUmFuaztcblx0XHRcdGlmIChzdW0gIT09IDApIHJldHVybiBzdW07XG5cblx0XHRcdC8vIExvY2FsZSBjb21wYXJlLlxuXHRcdFx0cmV0dXJuIGJMQy5sb2NhbGVDb21wYXJlKGFMQyk7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBzZWFyY2ggcXVlcnkuXG5cdCAqIEBwYXJhbSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5LlxuXHQgKi9cblx0cHVibGljIHNlYXJjaChxdWVyeTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5zZWFyY2hRdWVyeSA9IHF1ZXJ5O1xuXG5cdFx0aWYgKHF1ZXJ5ID09PSAnJykge1xuXHRcdFx0dGhpcy5yZXNldFNlYXJjaFJlc3VsdHMoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgc2VhcmNoID0gcHJlcGFyZUZ1enp5U2VhcmNoKHF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcblx0XHRcdHRoaXMuY2FsY3VsYXRlU2VhcmNoUmVzdWx0cygoaWNvbikgPT4gc2VhcmNoKGljb24uc2VhcmNoSWQpKTtcblx0XHR9XG5cblx0XHR0aGlzLmRpc3BsYXkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdHNlIHRoZSBzZWFyY2ggcmVzdWx0cyBsaXN0LlxuXHQgKiBAcGFyYW0gc2VhcmNoIFRoZSBzZWFyY2ggZnVuY3Rpb24uXG5cdCAqL1xuXHRwcm90ZWN0ZWQgY2FsY3VsYXRlU2VhcmNoUmVzdWx0cyhzZWFyY2g6IChpY29uOiBJY29uRm9yU2VhcmNoKSA9PiBTZWFyY2hSZXN1bHQgfCBudWxsKTogdm9pZCB7XG5cdFx0dGhpcy5zZWFyY2hSZXN1bHRzID0gdGhpcy5hbGxJY29ucy5maWx0ZXIoKGljb24pID0+IHtcblx0XHRcdGljb24uc2VhcmNoUmVzdWx0ID0gc2VhcmNoKGljb24pO1xuXHRcdFx0cmV0dXJuIGljb24uc2VhcmNoUmVzdWx0ICE9IG51bGw7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnNlYXJjaFJlc3VsdHMuc29ydCh0aGlzLmNvbXBhcmVJY29ucyk7XG5cdFx0dGhpcy5wcmV2aWV3TGltaXRPdmVyYWdlID0gdGhpcy5zZWFyY2hSZXN1bHRzLnNwbGljZSh0aGlzLnByZXZpZXdMaW1pdCkubGVuZ3RoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgc2VhcmNoIHJlc3VsdHMgbGlzdCB0byBzaG93IGEgZGVmYXVsdCBsaXN0IG9mIHN1Z2dlc3RlZCBpY29ucy5cblx0ICovXG5cdHByb3RlY3RlZCByZXNldFNlYXJjaFJlc3VsdHMoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBhbGxJY29ucywgcHJldmlld0xpbWl0LCB1c2VkSWNvbnMgfSA9IHRoaXM7XG5cdFx0dGhpcy5zZWFyY2hSZXN1bHRzID0gQXJyYXkuZnJvbShcblx0XHRcdG5ldyBTZXQoW1xuXHRcdFx0XHQuLi5hbGxJY29ucy5zbGljZSgwLCBwcmV2aWV3TGltaXQpLFxuXHRcdFx0XHQuLi5BcnJheS5mcm9tKHVzZWRJY29ucy52YWx1ZXMoKSkuc2xpY2UoMCwgcHJldmlld0xpbWl0KSxcblx0XHRcdF0pLnZhbHVlcygpLFxuXHRcdCk7XG5cblx0XHQvLyBTb3J0LlxuXHRcdHRoaXMuc2VhcmNoUmVzdWx0cy5zb3J0KHRoaXMuY29tcGFyZUljb25zKS5zbGljZSgwLCB0aGlzLnByZXZpZXdMaW1pdCk7XG5cdFx0dGhpcy5wcmV2aWV3TGltaXRPdmVyYWdlID0gdGhpcy5hbGxJY29ucy5sZW5ndGggLSB0aGlzLnNlYXJjaFJlc3VsdHMubGVuZ3RoO1xuXHR9XG5cblx0LyoqIEBvdmVycmlkZSAqL1xuXHRwdWJsaWMgZGlzcGxheSgpOiB2b2lkIHtcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG5cdFx0Ly8gQWRkIHRoZSBpY29ucy5cblx0XHRjb25zdCBncmlkRWwgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuY3JlYXRlRGl2KHsgY2xzOiAnY2FsbG91dG1hbmFnZXItaWNvbi1waWNrZXInIH0pO1xuXHRcdGZvciAoY29uc3QgaWNvbiBvZiB0aGlzLnNlYXJjaFJlc3VsdHMpIHtcblx0XHRcdGlmIChpY29uLmNvbXBvbmVudCA9PSBudWxsKSB7XG5cdFx0XHRcdGljb24uY29tcG9uZW50ID0gbmV3IEljb25QcmV2aWV3Q29tcG9uZW50KGdyaWRFbCkuc2V0SWNvbihpY29uLmlkKS5jb21wb25lbnRFbDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGdyaWRFbC5hcHBlbmRDaGlsZChpY29uLmNvbXBvbmVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGEgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVyLlxuXHRcdGdyaWRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICh7IHRhcmdldE5vZGUgfSkgPT4ge1xuXHRcdFx0Zm9yICg7IHRhcmdldE5vZGUgIT0gbnVsbCAmJiB0YXJnZXROb2RlICE9PSBncmlkRWw7IHRhcmdldE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudEVsZW1lbnQpIHtcblx0XHRcdFx0aWYgKCEodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgY29udGludWU7XG5cdFx0XHRcdGNvbnN0IGljb25JZCA9IHRhcmdldE5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLWljb24taWQnKTtcblx0XHRcdFx0aWYgKGljb25JZCAhPSBudWxsKSB7XG5cdFx0XHRcdFx0cmVjZW50SWNvbnMuYWRkKGljb25JZCk7XG5cdFx0XHRcdFx0dGhpcy5uYXYuY2xvc2UoKTtcblx0XHRcdFx0XHR0aGlzLm9uQ2hvb3NlKGljb25JZCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBDbGVhciB0aGUgY29udGFpbmVyIGFuZCByZS1yZW5kZXIuXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcblx0XHRjb250YWluZXJFbC5hcHBlbmRDaGlsZChncmlkRWwpO1xuXG5cdFx0Ly8gQWRkIGEgbWVzc2FnZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgaWNvbnMgdG8gZGlzcGxheS5cblx0XHRjb25zdCB7IHByZXZpZXdMaW1pdE92ZXJhZ2UgfSA9IHRoaXM7XG5cdFx0aWYgKHByZXZpZXdMaW1pdE92ZXJhZ2UgPiAwKSB7XG5cdFx0XHRjb25zdCB7IHBsdXJhbElzLCBwbHVyYWxJY29uIH0gPVxuXHRcdFx0XHRwcmV2aWV3TGltaXRPdmVyYWdlID09PSAxXG5cdFx0XHRcdFx0PyB7IHBsdXJhbElzOiAnaXMnLCBwbHVyYWxJY29uOiAnaWNvbicgfVxuXHRcdFx0XHRcdDogeyBwbHVyYWxJczogJ2FyZScsIHBsdXJhbEljb246ICdpY29ucycgfTtcblx0XHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdwJywge1xuXHRcdFx0XHR0ZXh0OlxuXHRcdFx0XHRcdGBUaGVyZSAke3BsdXJhbElzfSAke3ByZXZpZXdMaW1pdE92ZXJhZ2V9IG1vcmUgJHtwbHVyYWxJY29ufSB0byBzaG93LiBgICtcblx0XHRcdFx0XHRgUmVmaW5lIHlvdXIgc2VhcmNoIHRvIHNlZSBtb3JlLmAsXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKiogQG92ZXJyaWRlICovXG5cdHB1YmxpYyBkaXNwbGF5Q29udHJvbHMoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250cm9sc0VsIH0gPSB0aGlzO1xuXG5cdFx0bmV3IFRleHRDb21wb25lbnQoY29udHJvbHNFbClcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnNlYXJjaFF1ZXJ5KVxuXHRcdFx0LnNldFBsYWNlaG9sZGVyKCdTZWFyY2ggaWNvbnMuLi4nKVxuXHRcdFx0Lm9uQ2hhbmdlKHRoaXMuc2VhcmNoLmJpbmQodGhpcykpO1xuXHR9XG5cblx0LyoqIEBvdmVycmlkZSAqL1xuXHRwcm90ZWN0ZWQgb25SZWFkeSgpOiB2b2lkIHtcblx0XHR0aGlzLnJlc2V0U2VhcmNoUmVzdWx0cygpO1xuXHR9XG59XG5cbmludGVyZmFjZSBJY29uRm9yU2VhcmNoIHtcblx0aWQ6IHN0cmluZztcblx0c2VhcmNoSWQ6IHN0cmluZztcblx0Y29tcG9uZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG5cdHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0IHwgbnVsbDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHlsZXM6XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVjbGFyZSBjb25zdCBTVFlMRVM6IGBcblx0OnJvb3Qge1xuXHRcdC0tY2FsbG91dG1hbmFnZXItaWNvbi1waWNrZXItc2l6ZTogMTAwcHg7XG5cdFx0LS1jYWxsb3V0bWFuYWdlci1pY29uLXBpY2tlci1nYXA6IDhweDtcblx0XHQtLWNhbGxvdXRtYW5hZ2VyLWljb24tcGlja2VyLWljb24tc2l6ZTogMi41ZW07XG5cdFx0LS1jYWxsb3V0bWFuYWdlci1pY29uLXBpY2tlci1pZC1zaXplOiAwLjc1ZW07XG5cdH1cblxuXHQuY2FsbG91dG1hbmFnZXItaWNvbi1waWNrZXIge1xuXHRcdGRpc3BsYXk6IGdyaWQ7XG5cblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIHZhcigtLWNhbGxvdXRtYW5hZ2VyLWljb24tcGlja2VyLXNpemUpKTtcblx0XHRncmlkLWF1dG8tcm93czogdmFyKC0tY2FsbG91dG1hbmFnZXItaWNvbi1waWNrZXItc2l6ZSk7XG5cdFx0Z2FwOiB2YXIoLS1jYWxsb3V0bWFuYWdlci1pY29uLXBpY2tlci1nYXApO1xuXG5cdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cblx0XHQuY2FsbG91dG1hbmFnZXItaWNvbi1wcmV2aWV3IHtcblx0XHRcdGhlaWdodDogMTAwJTtcblxuXHRcdFx0LS1jYWxsb3V0bWFuYWdlci1pY29uLXByZXZpZXctaWNvbi1zaXplOiB2YXIoLS1jYWxsb3V0bWFuYWdlci1pY29uLXBpY2tlci1pY29uLXNpemUpO1xuXHRcdFx0LS1jYWxsb3V0bWFuYWdlci1pY29uLXByZXZpZXctaWQtc2l6ZTogdmFyKC0tY2FsbG91dG1hbmFnZXItaWNvbi1waWNrZXItaWQtc2l6ZSk7XG5cdFx0fVxuXHR9XG5gO1xuIiwiaW1wb3J0IHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgZ2V0VGhlbWVNYW5pZmVzdCB9IGZyb20gJ29ic2lkaWFuLWV4dHJhJztcblxuaW1wb3J0IHsgQ2FsbG91dCwgQ2FsbG91dFNvdXJjZSB9IGZyb20gJyZjYWxsb3V0JztcbmltcG9ydCB7IGdldENvbG9yRnJvbUNhbGxvdXQgfSBmcm9tICcmY2FsbG91dC11dGlsJztcbmltcG9ydCB7IFJHQiwgdG9IZXhSR0IgfSBmcm9tICcmY29sb3InO1xuXG5pbXBvcnQgRGVmYXVsdENvbG9ycyBmcm9tIFwiLi4vLi4vZGVmYXVsdF9jb2xvcnMuanNvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVySW5mbyhhcHA6IEFwcCwgY2FsbG91dDogQ2FsbG91dCwgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cdGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdGNvbnN0IGNvbnRlbnRFbCA9IGZyYWcuY3JlYXRlRGl2KHsgY2xzOiAnY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LXNlY3Rpb24nIH0pO1xuXG5cdGNvbnRlbnRFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdBYm91dCB0aGlzIENhbGxvdXQnIH0pO1xuXHRjb250ZW50RWwuY3JlYXRlRWwoJ2RpdicsIHsgY2xzOiAnY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LWluZm8nIH0sIChlbCkgPT4ge1xuXHRcdGVsLmFwcGVuZFRleHQoJ1RoZSAnKTtcblx0XHRlbC5jcmVhdGVTcGFuKHsgY2xzOiAnY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LS1jYWxsb3V0LWlkJywgdGV4dDogY2FsbG91dC5pZCB9KTtcblx0XHRlbC5hcHBlbmRUZXh0KCcgY2FsbG91dCcpO1xuXG5cdFx0Ly8gQ29sb3IgaW5mb3JtYXRpb24uXG5cdFx0ZWwuYXBwZW5kVGV4dCgnIGhhcyAnKTtcblx0XHRhcHBlbmRDb2xvckluZm8oZWwsIGNhbGxvdXQpO1xuXG5cdFx0Ly8gSWNvbiBpbmZvcm1hdGlvbi5cblx0XHRlbC5hcHBlbmRUZXh0KCcgYW5kICcpO1xuXHRcdGFwcGVuZEljb25JbmZvKGVsLCBjYWxsb3V0KTtcblxuXHRcdC8vIFNvdXJjZSBpbmZvcm1hdGlvbi5cblx0XHRpZiAoY2FsbG91dC5zb3VyY2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0aWYgKGNhbGxvdXQuc291cmNlc1swXS50eXBlID09PSAnYnVpbHRpbicpIHtcblx0XHRcdFx0ZWwuYXBwZW5kVGV4dCgnLiBJdCBpcyBvbmUgb2YgdGhlIGJ1aWx0LWluIGNhbGxvdXRzLicpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGVsLmFwcGVuZFRleHQoJy4gSXQgd2FzIGFkZGVkIHRvIE9ic2lkaWFuIGJ5IHRoZSAnKTtcblx0XHRcdGFwcGVuZFNvdXJjZUluZm8oYXBwLCBlbCwgY2FsbG91dC5zb3VyY2VzWzBdKTtcblx0XHRcdGVsLmFwcGVuZFRleHQoJy4nKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRlbC5hcHBlbmRUZXh0KCcuIFRoZSBjYWxsb3V0IGNvbWVzIGZyb206Jyk7XG5cdFx0Y29uc3Qgc291cmNlcyA9IGVsLmNyZWF0ZUVsKCd1bCcsIHsgY2xzOiAnY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LS1jYWxsb3V0LXNvdXJjZS1saXN0JyB9KTtcblx0XHRmb3IgKGNvbnN0IHNvdXJjZSBvZiBjYWxsb3V0LnNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbCA9IHNvdXJjZXMuY3JlYXRlRWwoJ2xpJyk7XG5cdFx0XHRpdGVtRWwuYXBwZW5kVGV4dCgnVGhlICcpO1xuXHRcdFx0YXBwZW5kU291cmNlSW5mbyhhcHAsIGl0ZW1FbCwgc291cmNlKTtcblx0XHRcdGl0ZW1FbC5hcHBlbmRUZXh0KCcuJyk7XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBSZW5kZXIgdGhlIGZyYWdtZW50LlxuXHRjb250YWluZXJFbC5hcHBlbmRDaGlsZChmcmFnKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kSWNvbkluZm8oZWw6IEhUTUxFbGVtZW50LCBjYWxsb3V0OiBDYWxsb3V0KTogdm9pZCB7XG5cdGVsLmFwcGVuZFRleHQoJ2lzIHVzaW5nIHRoZSBpY29uICcpO1xuXHRlbC5jcmVhdGVFbCgnY29kZScsIHsgY2xzOiAnY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LS1jYWxsb3V0LWljb24nLCB0ZXh0OiBjYWxsb3V0Lmljb24gfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENvbG9ySW5mbyhlbDogSFRNTEVsZW1lbnQsIGNhbGxvdXQ6IENhbGxvdXQpOiB2b2lkIHtcblx0Y29uc3QgY2FsbG91dENvbG9yID0gZ2V0Q29sb3JGcm9tQ2FsbG91dChjYWxsb3V0KTtcblxuXHQvLyBJbnZhbGlkIGNvbG9yLlxuXHRpZiAoY2FsbG91dENvbG9yID09IG51bGwpIHtcblx0XHRlbC5hcHBlbmRUZXh0KCdhbiBpbnZhbGlkIGNvbG9yICgnKTtcblx0XHRlbC5jcmVhdGVFbCgnY29kZScsIHtcblx0XHRcdGNsczogJ2NhbGxvdXRtYW5hZ2VyLWVkaXQtY2FsbG91dC0tY29sb3ItaW52YWxpZCcsXG5cdFx0XHR0ZXh0OiBjYWxsb3V0LmNvbG9yLnRyaW0oKSxcblx0XHR9KTtcblx0XHRlbC5hcHBlbmRUZXh0KCcpJyk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gVmFsaWQgY29sb3IuXG5cdGVsLmFwcGVuZFRleHQoJ3RoZSBjb2xvciAnKTtcblx0ZWwuY3JlYXRlRWwoXG5cdFx0J2NvZGUnLFxuXHRcdHsgY2xzOiAnY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LS1jYWxsb3V0LWNvbG9yJywgdGV4dDogZGVzY3JpYmVDb2xvcihjYWxsb3V0Q29sb3IpIH0sXG5cdFx0KGNvbG9yRWwpID0+IGNvbG9yRWwuc3R5bGUuc2V0UHJvcGVydHkoJy0tcmVzb2x2ZWQtY2FsbG91dC1jb2xvcicsIGNhbGxvdXQuY29sb3IpLFxuXHQpO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRTb3VyY2VJbmZvKGFwcDogQXBwLCBlbDogSFRNTEVsZW1lbnQsIHNvdXJjZTogQ2FsbG91dFNvdXJjZSk6IGJvb2xlYW4ge1xuXHRzd2l0Y2ggKHNvdXJjZS50eXBlKSB7XG5cdFx0Y2FzZSAnYnVpbHRpbic6XG5cdFx0XHRlbC5hcHBlbmRUZXh0KCdidWlsdC1pbiBjYWxsb3V0cycpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0Y2FzZSAnY3VzdG9tJzpcblx0XHRcdGVsLmFwcGVuZFRleHQoJ2N1c3RvbSBjYWxsb3V0cyB5b3UgY3JlYXRlZCcpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0Y2FzZSAnc25pcHBldCc6XG5cdFx0XHRlbC5hcHBlbmRUZXh0KCdDU1Mgc25pcHBldCAnKTtcblx0XHRcdGVsLmNyZWF0ZUVsKCdjb2RlJywge1xuXHRcdFx0XHRjbHM6ICdjYWxsb3V0bWFuYWdlci1lZGl0LWNhbGxvdXQtLWNhbGxvdXQtc291cmNlJyxcblx0XHRcdFx0dGV4dDogYCR7c291cmNlLnNuaXBwZXR9LmNzc2AsXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGNhc2UgJ3RoZW1lJzoge1xuXHRcdFx0ZWwuYXBwZW5kVGV4dCgndGhlbWUgJyk7XG5cdFx0XHRjb25zdCB0aGVtZU5hbWUgPSBnZXRUaGVtZU1hbmlmZXN0KGFwcCwgc291cmNlLnRoZW1lKT8ubmFtZSA/PyBzb3VyY2UudGhlbWU7XG5cdFx0XHRlbC5jcmVhdGVTcGFuKHsgY2xzOiAnY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LS1jYWxsb3V0LXNvdXJjZScsIHRleHQ6IHRoZW1lTmFtZSB9KTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZXNjcmliZUNvbG9yKGNvbG9yOiBSR0IpOiBzdHJpbmcge1xuXHRjb25zdCBoZXhTdHJpbmcgPSB0b0hleFJHQihjb2xvcik7XG5cdGNvbnN0IHJnYlN0cmluZyA9IGAke2NvbG9yLnJ9LCAke2NvbG9yLmd9LCAke2NvbG9yLmJ9YDtcblxuXHRjb25zdCBuYW1lZENvbG9yID0gRGVmYXVsdENvbG9ycy5kZWZhdWx0Q29sb3JzW3JnYlN0cmluZyBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdENvbG9ycy5kZWZhdWx0Q29sb3JzXTtcblx0aWYgKG5hbWVkQ29sb3IgIT0gbnVsbCkge1xuXHRcdHJldHVybiBuYW1lZENvbG9yO1xuXHR9XG5cblx0cmV0dXJuIGhleFN0cmluZztcbn1cblxuZGVjbGFyZSBjb25zdCBTVFlMRVM6IGBcblx0Ly8gVGhlIGluZm8gcGFyYWdyYXBoIGFuZCBsaXN0LlxuXHQuY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LWluZm8ge1xuXHRcdGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblx0fVxuXG5cdC5jYWxsb3V0bWFuYWdlci1lZGl0LWNhbGxvdXQtLWludmFsaWQtY29sb3Ige1xuXHRcdGNvbG9yOiB2YXIoLS10ZXh0LWVycm9yKTtcblx0fVxuXG5cdC5jYWxsb3V0bWFuYWdlci1lZGl0LWNhbGxvdXQtLWNhbGxvdXQtY29sb3Ige1xuXHRcdGNvbG9yOiByZ2IodmFyKC0tcmVzb2x2ZWQtY2FsbG91dC1jb2xvcikpO1xuXHR9XG5cblx0LmNhbGxvdXRtYW5hZ2VyLWVkaXQtY2FsbG91dC0tY2FsbG91dC1pZCxcblx0LmNhbGxvdXRtYW5hZ2VyLWVkaXQtY2FsbG91dC0tY2FsbG91dC1pY29uLFxuXHQuY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LS1jYWxsb3V0LXNvdXJjZSB7XG5cdFx0Y29sb3I6IHZhcigtLXRleHQtbm9ybWFsKTtcblx0fVxuXG5cdC5jYWxsb3V0bWFuYWdlci1lZGl0LWNhbGxvdXQtLWNhbGxvdXQtc291cmNlLWxpc3Qge1xuXHR9XG5gO1xuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBNYXJrZG93blJlbmRlcmVyLCBUZXh0QXJlYUNvbXBvbmVudCwgZ2V0SWNvbiB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IGdldEN1cnJlbnRDb2xvclNjaGVtZSB9IGZyb20gJ29ic2lkaWFuLWV4dHJhJztcblxuaW1wb3J0IHsgQ2FsbG91dCB9IGZyb20gJyZjYWxsb3V0JztcbmltcG9ydCB7IENhbGxvdXRTZXR0aW5ncywgY2FsbG91dFNldHRpbmdzVG9DU1MsIGN1cnJlbnRDYWxsb3V0RW52aXJvbm1lbnQgfSBmcm9tICcmY2FsbG91dC1zZXR0aW5ncyc7XG5pbXBvcnQgeyBnZXRUaXRsZUZyb21DYWxsb3V0IH0gZnJvbSAnJmNhbGxvdXQtdXRpbCc7XG5pbXBvcnQgQ2FsbG91dE1hbmFnZXJQbHVnaW4gZnJvbSAnJnBsdWdpbic7XG5cbmltcG9ydCB7IElzb2xhdGVkQ2FsbG91dFByZXZpZXdDb21wb25lbnQgfSBmcm9tICcmdWkvY29tcG9uZW50L2NhbGxvdXQtcHJldmlldyc7XG5cbi8qKlxuICogQSBjYWxsb3V0IHByZXZpZXcgZm9yIHRoZSBlZGl0IGNhbGxvdXQgcGFuZS5cbiAqXG4gKiBUaGlzIGFsbG93cyB0aGUgcHJldmlldyB0ZXh0IHRvIGJlIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVkaXRDYWxsb3V0UGFuZVByZXZpZXcge1xuXHRwdWJsaWMgcmVhZG9ubHkgcHJldmlldzogSXNvbGF0ZWRDYWxsb3V0UHJldmlld0NvbXBvbmVudDtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogQ2FsbG91dE1hbmFnZXJQbHVnaW47XG5cdHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvbkVsOiBIVE1MRWxlbWVudDtcblx0cHJpdmF0ZSByZWFkb25seSBjYWxsb3V0SWQ6IHN0cmluZztcblxuXHRwcml2YXRlIHByZXZpZXdNYXJrZG93biA9ICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4nO1xuXHRwcml2YXRlIHByZXZpZXdFZGl0b3JFbDogSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG5cdHByaXZhdGUgY2FsbG91dEhhc0ljb25SZWFkeTogYm9vbGVhbjtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IocGx1Z2luOiBDYWxsb3V0TWFuYWdlclBsdWdpbiwgY2FsbG91dDogQ2FsbG91dCwgdmlld09ubHk6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmNhbGxvdXRIYXNJY29uUmVhZHkgPSBmYWxzZTtcblx0XHR0aGlzLmNhbGxvdXRJZCA9IGNhbGxvdXQuaWQ7XG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cblx0XHQvLyBDcmVhdGUgdGhlIGNhbGxvdXQgcHJldmlldy5cblx0XHRjb25zdCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXHRcdHRoaXMuc2VjdGlvbkVsID0gZnJhZy5jcmVhdGVEaXYoe1xuXHRcdFx0Y2xzOiBbJ2NhbGxvdXRtYW5hZ2VyLXByZXZpZXctY29udGFpbmVyJywgJ2NhbGxvdXRtYW5hZ2VyLWVkaXQtY2FsbG91dC1wcmV2aWV3J10sXG5cdFx0fSk7XG5cblx0XHR0aGlzLnByZXZpZXcgPSBuZXcgSXNvbGF0ZWRDYWxsb3V0UHJldmlld0NvbXBvbmVudCh0aGlzLnNlY3Rpb25FbCwge1xuXHRcdFx0aWQ6IGNhbGxvdXQuaWQsXG5cdFx0XHR0aXRsZTogZ2V0VGl0bGVGcm9tQ2FsbG91dChjYWxsb3V0KSxcblx0XHRcdGljb246IGNhbGxvdXQuaWNvbixcblx0XHRcdGNvbG9yU2NoZW1lOiBnZXRDdXJyZW50Q29sb3JTY2hlbWUocGx1Z2luLmFwcCksXG5cdFx0XHRjb250ZW50OiAoY29udGFpbmVyRWwpID0+IHtcblx0XHRcdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ3AnLCB7IHRleHQ6IHRoaXMucHJldmlld01hcmtkb3duIH0pO1xuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdC8vIE1ha2UgdGhlIHByZXZpZXcgZWRpdGFibGUuXG5cdFx0aWYgKCF2aWV3T25seSkge1xuXHRcdFx0dGhpcy5tYWtlRWRpdGFibGUoKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIG1ha2VFZGl0YWJsZSgpOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZW50RWwgPSB0aGlzLnByZXZpZXcuY29udGVudEVsIGFzIEhUTUxFbGVtZW50O1xuXG5cdFx0Ly8gQWRkIGEgY2xpY2sgaGFuZGxlciB0byBjaGFuZ2UgdGhlIHByZXZpZXcuXG5cdFx0dGhpcy5wcmV2aWV3RWRpdG9yRWwgPSBudWxsO1xuXHRcdHRoaXMucHJldmlldy5jYWxsb3V0RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5wcmV2aWV3RWRpdG9yRWwgIT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGhlaWdodCA9IGNvbnRlbnRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG5cdFx0XHRjb250ZW50RWwuZW1wdHkoKTtcblx0XHRcdG5ldyBUZXh0QXJlYUNvbXBvbmVudChjb250ZW50RWwpXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnByZXZpZXdNYXJrZG93bilcblx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCdQcmV2aWV3IE1hcmtkb3duLi4uJylcblx0XHRcdFx0LnRoZW4oKGMpID0+IHtcblx0XHRcdFx0XHRjb25zdCBpbnB1dEVsID0gKHRoaXMucHJldmlld0VkaXRvckVsID0gYy5pbnB1dEVsKTtcblx0XHRcdFx0XHRpbnB1dEVsLnN0eWxlLnNldFByb3BlcnR5KCdoZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcblx0XHRcdFx0XHRpbnB1dEVsLmNsYXNzTGlzdC5hZGQoJ2NhbGxvdXRtYW5hZ2VyLXByZXZpZXctZWRpdG9yJyk7XG5cdFx0XHRcdFx0aW5wdXRFbC5mb2N1cygpO1xuXHRcdFx0XHRcdGlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gYy5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0dGhpcy5wcmV2aWV3RWRpdG9yRWwgPSBudWxsO1xuXHRcdFx0XHRcdFx0dGhpcy5wcmV2aWV3TWFya2Rvd24gPSB2YWx1ZTtcblx0XHRcdFx0XHRcdHRoaXMuY2hhbmdlQ29udGVudCh2YWx1ZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZnJlc2hlcyB0aGUgY2FsbG91dCBwcmV2aWV3J3MgaWNvbi5cblx0ICogV2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBwcmV2aWV3IGlzIGF0dGFjaGVkIHRvIERPTSwgYXMgd2UgY2FuJ3QgZ2V0IHRoZSBjb3JyZWN0IGljb24gdW50aWwgdGhhdCBoYXBwZW5zLlxuXHQgKi9cblx0cHJvdGVjdGVkIHJlZnJlc2hQcmV2aWV3SWNvbigpOiB2b2lkIHtcblx0XHRjb25zdCB7IGljb25FbCwgY2FsbG91dEVsIH0gPSB0aGlzLnByZXZpZXc7XG5cblx0XHRpZiAod2luZG93LmRvY3VtZW50LmNvbnRhaW5zKHRoaXMuc2VjdGlvbkVsKSkge1xuXHRcdFx0Y29uc3QgaWNvbiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNhbGxvdXRFbCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1jYWxsb3V0LWljb24nKS50cmltKCk7XG5cdFx0XHRjb25zdCBpY29uU3ZnID0gZ2V0SWNvbihpY29uKSA/PyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdmcnKTtcblxuXHRcdFx0aWNvbkVsLmVtcHR5KCk7XG5cdFx0XHRpY29uRWwuYXBwZW5kQ2hpbGQoaWNvblN2Zyk7XG5cblx0XHRcdHRoaXMuY2FsbG91dEhhc0ljb25SZWFkeSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIHByZXZpZXcgdGhhdCBpcyBkaXNwbGF5ZWQgaW5zaWRlIHRoZSBjYWxsb3V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbWFya2Rvd24gVGhlIG1hcmtkb3duIHRvIHJlbmRlci5cblx0ICovXG5cdHB1YmxpYyBhc3luYyBjaGFuZ2VDb250ZW50KG1hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBjb250ZW50RWwgPSB0aGlzLnByZXZpZXcuY29udGVudEVsIGFzIEhUTUxFbGVtZW50O1xuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IE1hcmtkb3duUmVuZGVyZXIucmVuZGVyTWFya2Rvd24obWFya2Rvd24sIGNvbnRlbnRFbCwgJycsIHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIENvbXBvbmVudCk7XG5cdFx0fSBjYXRjaCAoZXgpIHtcblx0XHRcdGNvbnRlbnRFbC5jcmVhdGVFbCgnY29kZScpLmNyZWF0ZUVsKCdwcmUnLCB7IHRleHQ6IG1hcmtkb3duIH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGNhbGxvdXQuXG5cdCAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2hvdyB0aGUgY3VzdG9taXplZCBjYWxsb3V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIHNldHRpbmdzIHRvIHVzZS5cblx0ICovXG5cdHB1YmxpYyBhc3luYyBjaGFuZ2VTZXR0aW5ncyhzZXR0aW5nczogQ2FsbG91dFNldHRpbmdzKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgeyBwcmV2aWV3IH0gPSB0aGlzO1xuXHRcdGNvbnN0IHN0eWxlcyA9IGNhbGxvdXRTZXR0aW5nc1RvQ1NTKHRoaXMuY2FsbG91dElkLCBzZXR0aW5ncywgY3VycmVudENhbGxvdXRFbnZpcm9ubWVudCh0aGlzLnBsdWdpbi5hcHApKTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgY3VzdG9tIHN0eWxlc2hlZXQgb2YgdGhlIGNhbGxvdXQgcHJldmlldy5cblx0XHRwcmV2aWV3LmN1c3RvbVN0eWxlRWwudGV4dENvbnRlbnQgPSBzdHlsZXM7XG5cdFx0cHJldmlldy5yZXNldFN0eWxlUHJvcGVydHlPdmVycmlkZXMoKTtcblx0XHRwcmV2aWV3LnJlbW92ZVN0eWxlcygoZWwpID0+IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1jYWxsb3V0LW1hbmFnZXInKSA9PT0gJ3N0eWxlLW92ZXJyaWRlcycpO1xuXG5cdFx0dGhpcy5jYWxsb3V0SGFzSWNvblJlYWR5ID0gZmFsc2U7XG5cblx0XHQvLyBSZW1vdmUgdGhlIHByZXZpZXcgc3R5bGVzIGFkZGVkIGJ5IGNhbGxvdXQgbWFuYWdlci5cblx0XHQvLyBOb3cgdGhhdCB3ZSBjaGFuZ2VkIHRoZSBzZXR0aW5ncywgaGF2aW5nIHRoZSBvbGQgc3R5bGVzIHdvdWxkIGxlYWQgdG8gaW5jb25zaXN0ZW5jeS5cblx0XHRwcmV2aWV3LnJlbW92ZVN0eWxlcygoZWwpID0+IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pbmplY3QtaWQnKSA9PT0gJ2NhbGxvdXQtc2V0dGluZ3MnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBdHRhY2hlcyB0aGUgcHJldmlldyB0byBhIGNvbnRhaW5lci5cblx0ICogQHBhcmFtIGNvbnRhaW5lckVsIFRoZSBjb250YWluZXIgZWxlbWVudC5cblx0ICovXG5cdHB1YmxpYyBhdHRhY2goY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSB7XG5cdFx0Y29udGFpbmVyRWwuYXBwZW5kQ2hpbGQodGhpcy5zZWN0aW9uRWwpO1xuXG5cdFx0aWYgKCF0aGlzLmNhbGxvdXRIYXNJY29uUmVhZHkpIHtcblx0XHRcdHRoaXMucmVmcmVzaFByZXZpZXdJY29uKCk7XG5cdFx0fVxuXHR9XG59XG5cbmRlY2xhcmUgY29uc3QgU1RZTEVTOiBgXG5cdC8vIEVuc3VyZSB0aGUgcHJldmlldyB0YWtlcyBhIGNlcnRhaW4gaGVpZ2h0LlxuXHQuY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LXByZXZpZXcge1xuXHRcdHBhZGRpbmctYm90dG9tOiB2YXIoLS1zaXplLTQtOCk7XG5cdFx0bWluLWhlaWdodDogMTRlbTtcblxuXHRcdGJvZHkuaXMtbW9iaWxlICYge1xuXHRcdFx0bWluLWhlaWdodDogMzV2aDtcblx0XHR9XG5cdH1cblxuXHQvLyBUaGUgdGV4dCBib3ggdGhhdCBhbGxvd3MgdGhlIHByZXZpZXcgdG8gYmUgY2hhbmdlZC5cblx0LmNhbGxvdXRtYW5hZ2VyLXByZXZpZXctZWRpdG9yIHtcblx0XHRyZXNpemU6IHZlcnRpY2FsO1xuXHRcdHdpZHRoOiAxMDAlO1xuXHRcdG1pbi1oZWlnaHQ6IDZlbTtcblxuXHRcdG1hcmdpbi10b3A6IHZhcigtLXNpemUtNC0zKTtcblxuXHRcdC8vIFRyeSB0byBiZSBhcyB0cmFuc3BhcmVudCBhcyBwb3NzaWJsZS5cblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0XHRmb250LXNpemU6IHZhcigtLWZvbnQtdGV4dC1zaXplKTtcblx0XHRmb250LWZhbWlseTogdmFyKC0tZm9udC10ZXh0KTtcblx0XHRsaW5lLWhlaWdodDogdmFyKC0tbGluZS1oZWlnaHQtbm9ybWFsKTtcblx0fVxuYDtcbiIsImltcG9ydCB7IENvbXBvbmVudCwgTWFya2Rvd25SZW5kZXJlciwgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgQ2hhbmdlbG9nIGZyb20gJy4uL0NIQU5HRUxPRy5tZCc7XG5cbmludGVyZmFjZSBDaGFuZ2Vsb2dTZWN0aW9uIHtcblx0dmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRjb250YWluZXJFbDogSFRNTERldGFpbHNFbGVtZW50O1xuXHR0aXRsZUVsOiBIVE1MRWxlbWVudDtcblx0Y29udGVudHNFbDogSFRNTEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWN0aW9ucyhhcHA6IEFwcCwgcGFyZW50OiBDb21wb25lbnQpOiBNYXA8c3RyaW5nLCBDaGFuZ2Vsb2dTZWN0aW9uPiB7XG5cdGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdGNvbnN0IHJlbmRlcmVkRWwgPSBmcmFnLmNyZWF0ZURpdigpO1xuXG5cdC8vIFJlbmRlciB0aGUgbWFya2Rvd24uXG5cdE1hcmtkb3duUmVuZGVyZXIucmVuZGVyKGFwcCwgQ2hhbmdlbG9nLCByZW5kZXJlZEVsLCAnJywgcGFyZW50KTtcblxuXHQvLyBFeHRyYWN0IHRoZSBzZWN0aW9ucyBpbnRvIGRldGFpbHMgZWxlbWVudHMuXG5cdGNvbnN0IHNlY3Rpb25zID0gbmV3IE1hcDxzdHJpbmcsIENoYW5nZWxvZ1NlY3Rpb24+KCk7XG5cdGxldCBoZWFkaW5nOiBIVE1MSGVhZGluZ0VsZW1lbnQgfCBudWxsID0gbnVsbDtcblx0bGV0IHNlY3Rpb25Db250YWluZXIgPSBmcmFnLmNyZWF0ZUVsKCdkZXRhaWxzJyk7XG5cdGxldCBzZWN0aW9uU3VtbWFyeSA9IHNlY3Rpb25Db250YWluZXIuY3JlYXRlRWwoJ3N1bW1hcnknKTtcblx0bGV0IHNlY3Rpb25Db250ZW50czogTm9kZVtdID0gW107XG5cblx0Y29uc3QgYWRkUHJldmlvdXNTZWN0aW9uID0gKCkgPT4ge1xuXHRcdGlmIChoZWFkaW5nICE9IG51bGwgJiYgaGVhZGluZy50ZXh0Q29udGVudCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgaGVhZGluZ1RleHQgPSBoZWFkaW5nLnRleHRDb250ZW50O1xuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGRldGFpbHMgc3VtbWFyeSAvIHRpdGxlLlxuXHRcdFx0Y29uc3QgdGl0bGVFbCA9IHNlY3Rpb25TdW1tYXJ5LmNyZWF0ZUVsKCdoMicsIHtcblx0XHRcdFx0Y2xzOiAnY2FsbG91dG1hbmFnZXItY2hhbmdlbG9nLWhlYWRpbmcnLFxuXHRcdFx0XHR0ZXh0OiBoZWFkaW5nVGV4dCxcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGRldGFpbHMgYm9keSAvIGNvbnRlbnQuXG5cdFx0XHRjb25zdCBjb250ZW50c0VsID0gc2VjdGlvbkNvbnRhaW5lci5jcmVhdGVEaXYoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjbHM6ICdjYWxsb3V0bWFuYWdlci1jaGFuZ2Vsb2ctc2VjdGlvbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdChlbCkgPT4ge1xuXHRcdFx0XHRcdHNlY3Rpb25Db250ZW50cy5mb3JFYWNoKChub2RlKSA9PiBlbC5hcHBlbmRDaGlsZChub2RlKSk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyBSZXdyaXRlIGBkYXRhLWNhbGxvdXRgIGF0dHJpYnV0ZSB0byBgZGF0YS1jYWxsb3V0bWFuYWdlci1jaGFuZ2Vsb2ctY2FsbG91dGAuXG5cdFx0XHRBcnJheS5mcm9tKGNvbnRlbnRzRWwucXVlcnlTZWxlY3RvckFsbCgnLmNhbGxvdXRbZGF0YS1jYWxsb3V0XScpKS5mb3JFYWNoKChlbCkgPT4ge1xuXHRcdFx0XHRlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2FsbG91dG1hbmFnZXItY2hhbmdlbG9nLWNhbGxvdXQnLCBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2FsbG91dCcpIGFzIHN0cmluZyk7XG5cdFx0XHRcdGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jYWxsb3V0Jyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgdmVyc2lvbiA9IC9eXFxzKlZlcnNpb24gKFswLTkuXSspXFxzKiQvLmV4ZWMoaGVhZGluZ1RleHQpPy5bMV07XG5cdFx0XHRzZWN0aW9ucy5zZXQodmVyc2lvbiA/PyBoZWFkaW5nLnRleHRDb250ZW50LCB7XG5cdFx0XHRcdHZlcnNpb246IHZlcnNpb24sXG5cdFx0XHRcdGNvbnRlbnRzRWwsXG5cdFx0XHRcdGNvbnRhaW5lckVsOiBzZWN0aW9uQ29udGFpbmVyLFxuXHRcdFx0XHR0aXRsZUVsLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gUmVzZXQgdmFyaWFibGVzLlxuXHRcdGhlYWRpbmcgPSBudWxsO1xuXHRcdHNlY3Rpb25Db250YWluZXIgPSBmcmFnLmNyZWF0ZUVsKCdkZXRhaWxzJyk7XG5cdFx0c2VjdGlvblN1bW1hcnkgPSBzZWN0aW9uQ29udGFpbmVyLmNyZWF0ZUVsKCdzdW1tYXJ5Jyk7XG5cdFx0c2VjdGlvbkNvbnRlbnRzID0gW107XG5cdH07XG5cblx0Zm9yIChsZXQgbm9kZSA9IHJlbmRlcmVkRWwuZmlyc3RDaGlsZDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZT8ubmV4dFNpYmxpbmcpIHtcblx0XHRpZiAobm9kZSBpbnN0YW5jZW9mIEhUTUxIZWFkaW5nRWxlbWVudCAmJiBub2RlLnRhZ05hbWUgPT09ICdIMScpIHtcblx0XHRcdGFkZFByZXZpb3VzU2VjdGlvbigpO1xuXG5cdFx0XHRoZWFkaW5nID0gbm9kZTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdHNlY3Rpb25Db250ZW50cy5wdXNoKG5vZGUpO1xuXHR9XG5cblx0YWRkUHJldmlvdXNTZWN0aW9uKCk7XG5cdHJldHVybiBzZWN0aW9ucztcbn1cblxuZGVjbGFyZSBjb25zdCBTVFlMRVM6IGBcblx0Ly8gU3BlY2lhbCBjYWxsb3V0cyB1c2VkIGluIHRoZSBjaGFuZ2Vsb2cuXG5cblx0Ly8gVGhlIGRhdGEgYXR0cmlidXRlIGlzIHJld3JpdHRlbiBmcm9tICdkYXRhLWNhbGxvdXQnIHRvICdkYXRhLWNhbGxvdXRtYW5hZ2VyLWNoYW5nZWxvZy1jYWxsb3V0JyB0byBwcmV2ZW50XG5cdC8vIGFueSBwb3NzaWJsZSBjb25mbGljdHMgd2l0aCB1c2VyLWRlZmluZWQgb3IgYnVpbHRpbiBjYWxsb3V0cy5cblxuXHQuY2FsbG91dG1hbmFnZXItY2hhbmdlbG9nLXNlY3Rpb24gLmNhbGxvdXQge1xuXHRcdC0tY2FsbG91dC1wYWRkaW5nOiAwLjVlbTtcblxuXHRcdD4gLmNhbGxvdXQtY29udGVudCB7XG5cdFx0XHRtYXJnaW4tbGVmdDogY2FsYygxOHB4ICsgMC4yNWVtKTtcblx0XHRcdG92ZXJmbG93LXk6IGhpZGRlbjtcblx0XHR9XG5cblx0XHQ+IC5jYWxsb3V0LWNvbnRlbnQgPiA6Zmlyc3QtY2hpbGQge1xuXHRcdFx0bWFyZ2luLXRvcDogMDtcblx0XHR9XG5cblx0XHQ+IC5jYWxsb3V0LWNvbnRlbnQgPiA6bGFzdC1jaGlsZCB7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAwO1xuXHRcdH1cblx0fVxuXG5cdC5jYWxsb3V0W2RhdGEtY2FsbG91dG1hbmFnZXItY2hhbmdlbG9nLWNhbGxvdXQ9XCJuZXdcIl0ge1xuXHRcdC0tY2FsbG91dC1pY29uOiBsdWNpZGUtcGx1cztcblx0XHQtLWNhbGxvdXQtY29sb3I6IHJnYigzMCwgMTYwLCAzMCk7XG5cdFx0LnRoZW1lLWRhcmsgJiB7XG5cdFx0XHQtLWNhbGxvdXQtY29sb3I6IHJnYig2MCwgMjUwLCA2MCk7XG5cdFx0fVxuXHR9XG5cblx0LmNhbGxvdXRbZGF0YS1jYWxsb3V0bWFuYWdlci1jaGFuZ2Vsb2ctY2FsbG91dD1cImZpeFwiXSB7XG5cdFx0LS1jYWxsb3V0LWljb246IGx1Y2lkZS13cmVuY2g7XG5cdFx0LS1jYWxsb3V0LWNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7XG5cdFx0LnRoZW1lLWRhcmsgJiB7XG5cdFx0XHQtLWNhbGxvdXQtY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcblx0XHR9XG5cdH1cblxuXHQuY2FsbG91dFtkYXRhLWNhbGxvdXRtYW5hZ2VyLWNoYW5nZWxvZy1jYWxsb3V0PVwiY2hhbmdlXCJdIHtcblx0XHQtLWNhbGxvdXQtaWNvbjogbHVjaWRlLWVkaXQtMztcblx0XHQtLWNhbGxvdXQtY29sb3I6IHJnYigxMCwgMTcwLCAyMTApO1xuXHRcdC50aGVtZS1kYXJrICYge1xuXHRcdFx0LS1jYWxsb3V0LWNvbG9yOiByZ2IoNjAsIDE1NywgMjEwKTtcblx0XHR9XG5cdH1cblxuXHQuY2FsbG91dG1hbmFnZXItY2hhbmdlbG9nLWhlYWRpbmcge1xuXHRcdGRpc3BsYXk6IGlubGluZTtcblx0XHRmb250LXdlaWdodDogYm9sZDtcblx0fVxuYDtcbiIsImltcG9ydCBDYWxsb3V0TWFuYWdlclBsdWdpbiBmcm9tICcmcGx1Z2luJztcblxuaW1wb3J0IHsgVUlQYW5lIH0gZnJvbSAnJnVpL3BhbmUnO1xuXG5pbXBvcnQgeyBnZXRTZWN0aW9ucyB9IGZyb20gJy4uL2NoYW5nZWxvZyc7XG5cbi8qKlxuICogQSBwYW5lIHRoYXQgc2hvd3MgdGhlIHBsdWdpbiBjaGFuZ2Vsb2cuXG4gKi9cbmV4cG9ydCBjbGFzcyBDaGFuZ2Vsb2dQYW5lIGV4dGVuZHMgVUlQYW5lIHtcblx0cHVibGljIHJlYWRvbmx5IHRpdGxlID0gJ0NoYW5nZWxvZyc7XG5cdHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luOiBDYWxsb3V0TWFuYWdlclBsdWdpbjtcblx0cHJpdmF0ZSBjaGFuZ2Vsb2dFbDogSFRNTEVsZW1lbnQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHBsdWdpbjogQ2FsbG91dE1hbmFnZXJQbHVnaW4pIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXG5cdFx0Ly8gQ3JlYXRlIHRoZSBjaGFuZ2Vsb2cgZWxlbWVudC5cblx0XHRjb25zdCBzZWN0aW9ucyA9IGdldFNlY3Rpb25zKHBsdWdpbi5hcHAsIHBsdWdpbik7XG5cdFx0Y29uc3QgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblx0XHR0aGlzLmNoYW5nZWxvZ0VsID0gZnJhZy5jcmVhdGVEaXYoeyBjbHM6ICdjYWxsb3V0bWFuYWdlci1jaGFuZ2Vsb2cnIH0pO1xuXG5cdFx0QXJyYXkuZnJvbShzZWN0aW9ucy52YWx1ZXMoKSkuZm9yRWFjaCgoeyB2ZXJzaW9uLCBjb250YWluZXJFbDogZWwgfSkgPT4ge1xuXHRcdFx0dGhpcy5jaGFuZ2Vsb2dFbC5hcHBlbmRDaGlsZChlbCk7XG5cdFx0XHRpZiAodmVyc2lvbiA9PT0gdGhpcy5wbHVnaW4ubWFuaWZlc3QudmVyc2lvbikge1xuXHRcdFx0XHRlbC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7XG5cdFx0XHRcdGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1jdXJyZW50LXZlcnNpb24nLCAndHJ1ZScpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqIEBvdmVycmlkZSAqL1xuXHRwdWJsaWMgZGlzcGxheSgpOiB2b2lkIHtcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG5cdFx0Y29udGFpbmVyRWwuYXBwZW5kQ2hpbGQodGhpcy5jaGFuZ2Vsb2dFbCk7XG5cdH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHlsZXM6XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVjbGFyZSBjb25zdCBTVFlMRVM6IGBcblx0LmNhbGxvdXRtYW5hZ2VyLWNoYW5nZWxvZyA+ICo6bm90KDpmaXJzdC1jaGlsZCkge1xuXHRcdG1hcmdpbi10b3A6IDFlbTtcblx0fVxuXG5cdC5jYWxsb3V0bWFuYWdlci1jaGFuZ2Vsb2cge1xuXHRcdC0tY2FsbG91dC1ibGVuZC1tb2RlOiBub3JtYWw7XG5cblx0XHRkZXRhaWxzIHtcblx0XHRcdD4gc3VtbWFyeTo6bWFya2VyIHtcblx0XHRcdFx0Y29sb3I6IHZhcigtLXRleHQtZmFpbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHQmW29wZW5dID4gc3VtbWFyeTo6bWFya2VyIHtcblx0XHRcdFx0Y29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuXHRcdFx0fVxuXG5cdFx0XHQuY2FsbG91dG1hbmFnZXItY2hhbmdlbG9nLXNlY3Rpb24ge1xuICAgIFx0XHRcdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLW1vZGlmaWVyLWJvcmRlcik7XG5cdFx0XHRcdG1hcmdpbi1ib3R0b206IDEuMjVlbTtcblx0XHRcdFx0cGFkZGluZy1ib3R0b206IDEuMjVlbTtcblxuXHRcdFx0XHQ+IDpsYXN0LWNoaWxkIHtcblx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZGV0YWlsczpub3QoW2RhdGEtY3VycmVudC12ZXJzaW9uPXRydWVdKSB7XG5cdFx0XHQuY2FsbG91dG1hbmFnZXItY2hhbmdlbG9nLWhlYWRpbmcge1xuXHRcdFx0XHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5gO1xuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVUlQYW5lTmF2aWdhdGlvbiB7XG5cdGNsb3NlKCk6IHZvaWQ7XG5cdG9wZW4ocGFuZTogVUlQYW5lPHVua25vd24+KTogdm9pZDtcblx0cmVwbGFjZShwYW5lOiBVSVBhbmU8dW5rbm93bj4pOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBVSVBhbmVUaXRsZSA9IHN0cmluZyB8IHsgdGl0bGU6IHN0cmluZzsgc3VidGl0bGU6IHN0cmluZyB9O1xuXG4vKipcbiAqIEEgc2V0dGluZyBwYW5lIHRoYXQgZXhpc3RzIHdpdGhpbiB0aGUgc2V0dGluZyB0YWIuXG4gKlxuICogVGhpcyBoYXMgaXRzIG93biBuYXZpZ2F0aW9uIGFuZCBzdGlja3kgaGVhZGVyIVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVUlQYW5lPFMgPSB1bmtub3duPiB7XG5cdHByb3RlY3RlZCByZWFkb25seSBuYXYhOiBVSVBhbmVOYXZpZ2F0aW9uO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgY29udGFpbmVyRWwhOiBIVE1MRWxlbWVudDtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRyb2xzRWwhOiBIVE1MRWxlbWVudDtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IHJvb3QhOiBDb21wb25lbnQ7XG5cblx0LyoqXG5cdCAqIFRoZSB0aXRsZSBvZiB0aGUgcGFuZS5cblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXQgdGl0bGUoKTogVUlQYW5lVGl0bGU7XG5cblx0LyoqXG5cdCAqIENhbGxlZCB0byByZW5kZXIgdGhlIHBhbmUgdG8gaXRzIGNvbnRhaW5lciBlbGVtZW50LlxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGRpc3BsYXkoKTogdm9pZDtcblxuXHQvKipcblx0ICogQ2FsbGVkIHRvIGRpc3BsYXkgdGhlIGNvbnRyb2xzIGZvciB0aGUgcGFuZS5cblx0ICovXG5cdHB1YmxpYyBkaXNwbGF5Q29udHJvbHMoKTogdm9pZCB7fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiB0aGUgcGFuZSBpcyBjcmVhdGVkIGFuZCBhdHRhY2hlZCB0byB0aGUgc2V0dGluZyB0YWIsIGJ1dCBiZWZvcmUge0BsaW5rIGRpc3BsYXl9IGlzIGNhbGxlZC5cblx0ICovXG5cdHByb3RlY3RlZCBvblJlYWR5KCk6IHZvaWQge31cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIHBhbmUgaXMgcmVtb3ZlZCBhbmQgcmVhZHkgdG8gYmUgZGVzdHJveWVkLlxuXHQgKiBBbnkgaW1wb3J0YW50IHNldHRpbmdzIHNob3VsZCBiZSBzYXZlZCBoZXJlLlxuXHQgKlxuXHQgKiBAcGFyYW0gY2FuY2VsbGVkIElmIHRydWUsIHRoZSB1c2VyIGNsb3NlZCB0aGUgcGFuZSB3aXRoIHRoZSBlc2NhcGUga2V5LlxuXHQgKi9cblx0cHJvdGVjdGVkIG9uQ2xvc2UoY2FuY2VsbGVkOiBib29sZWFuKTogdm9pZCB7fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgdG8gc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIHNldHRpbmcgcGFuZS5cblx0ICogVGhpcyBpcyB1c2VkIGZvciBzdXNwZW5kaW5nIGEgcGFuZSB3aGVuIGFub3RoZXIgcGFuZSBjb3ZlcnMgaXQgdXAuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBzYXZlZCBzdGF0ZS5cblx0ICovXG5cdHByb3RlY3RlZCBzdXNwZW5kU3RhdGUoKTogUyB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFM7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHRvIGxvYWQgdGhlIHN0YXRlIG9mIHRoZSBzZXR0aW5nIHBhbmUuXG5cdCAqIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSB7QGxpbmsgZGlzcGxheX0uXG5cdCAqXG5cdCAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgdG8gcmVzdG9yZS5cblx0ICovXG5cdHByb3RlY3RlZCByZXN0b3JlU3RhdGUoc3RhdGU6IFMpOiB2b2lkIHt9XG59XG5cbi8qKlxuICogQSB0eXBlIGZvciBhIHtAbGluayBVSVBhbmV9LCBidXQgd2l0aCBhbGwgcHJvcGVydGllcyBleHBvc2VkIGFuZCB3cml0YWJsZS5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdHlwZSBVSVBhbmVfRlJJRU5EPFMgPSB1bmtub3duPiA9IHtcblx0LXJlYWRvbmx5IFtrZXkgaW4ga2V5b2YgVUlQYW5lPFM+XTogVUlQYW5lPFM+W2tleV07XG59ICYge1xuXHRuYXY6IFVJUGFuZTxTPlsnbmF2J10gfCB1bmRlZmluZWQ7XG5cdGNvbnRhaW5lckVsOiBVSVBhbmU8Uz5bJ2NvbnRhaW5lckVsJ10gfCB1bmRlZmluZWQ7XG5cdGNvbnRyb2xzRWw6IFVJUGFuZTxTPlsnY29udHJvbHNFbCddIHwgdW5kZWZpbmVkO1xuXHRyb290OiBVSVBhbmU8Uz5bJ3Jvb3QnXSB8IHVuZGVmaW5lZDtcblx0b25SZWFkeTogVUlQYW5lPFM+WydvblJlYWR5J107XG5cdG9uQ2xvc2U6IFVJUGFuZTxTPlsnb25DbG9zZSddO1xuXHRzdXNwZW5kU3RhdGU6IFVJUGFuZTxTPlsnc3VzcGVuZFN0YXRlJ107XG5cdHJlc3RvcmVTdGF0ZTogVUlQYW5lPFM+WydyZXN0b3JlU3RhdGUnXTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3R5bGVzOlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmRlY2xhcmUgY29uc3QgU1RZTEVTOiBgXG5cdC8vIEEgY2VudGVyZWQgYm94IHRvIGhlbHAgZGlzcGxheSBoZWxwIG1lc3NhZ2VzIGZvciBlbXB0eSBzZWFyY2hlcy5cblx0LmNhbGxvdXRtYW5hZ2VyLWNlbnRlcmJveCB7XG5cdFx0d2lkdGg6IDEwMCU7XG5cdFx0aGVpZ2h0OiAxMDAlO1xuXG5cdFx0ZGlzcGxheTogZmxleDtcblx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdH1cblxuXHQvLyBJbXByb3ZlIGZvcm0gVVguXG5cdC5jYWxsb3V0bWFuYWdlci1wYW5lIHtcblx0XHQvLyBNYWtlIGRpc2FibGVkIGJ1dHRvbnMgbG9vayBkaXNhYmxlZC5cblx0XHRidXR0b25bZGlzYWJsZWRdIHtcblx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pbnRlcmFjdGl2ZS1ub3JtYWwpO1xuXG5cdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0taW50ZXJhY3RpdmUtbm9ybWFsKTtcblx0XHRcdFx0Y3Vyc29yOiBub3QtYWxsb3dlZDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpbnB1dFt0eXBlPSdjb2xvciddW2Rpc2FibGVkXSB7XG5cdFx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgaW52YWxpZCB0ZXh0IGJveGVzIGxvb2sgaW52YWxpZC5cblx0XHRpbnB1dDppbnZhbGlkOm5vdCg6cGxhY2Vob2xkZXItc2hvd24pLFxuXHRcdGlucHV0LmludmFsaWQge1xuXHRcdFx0Ym9yZGVyLWNvbG9yOiB2YXIoLS10ZXh0LWVycm9yKTtcblx0XHR9XG5cblx0XHQvLyBJbXByb3ZlIGNvbG9yIHBpY2tlciBVWCBvbiBtb2JpbGUuXG5cdFx0Ym9keS5pcy1waG9uZSAmIGlucHV0W3R5cGU9J2NvbG9yJ106Oi13ZWJraXQtY29sb3Itc3dhdGNoIHtcblx0XHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLWJ1dHRvbi1yYWRpdXMpO1xuXHRcdFx0Ym9yZGVyOiAjZjAwIDJweCBzb2xpZDtcblx0XHRcdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNoZWNrYm94LWJvcmRlci1jb2xvcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBjbGlja2FibGUgaWNvbnMgd2l0aCAnbW9kLXdhcm5pbmcnIG5vdCBzb2xpZC5cblx0XHQuY2xpY2thYmxlLWljb24ubW9kLXdhcm5pbmcge1xuXHRcdFx0Y29sb3I6IHZhcigtLXRleHQtZXJyb3IpO1xuXHRcdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0Y29sb3I6IHZhcigtLXRleHQtZXJyb3IpO1xuXHRcdFx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgbW9kLWVycm9yIHRvIHRleHQgZmllbGQuXG5cdFx0aW5wdXRbdHlwZT0ndGV4dCddLm1vZC1lcnJvciB7XG5cdFx0XHRib3JkZXItY29sb3I6IHZhcigtLXRleHQtZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdC8vIE1ha2UgY2xpY2thYmxlIGljb25zIG5vdCB0b28gbGFyZ2Ugb24gbW9iaWxlLlxuXHQuY2FsbG91dG1hbmFnZXItc2V0dGluZy10YWItY29udGVudCAuc2V0dGluZy1pdGVtLWNvbnRyb2wsXG5cdC5jYWxsb3V0bWFuYWdlci1zZXR0aW5nLXRhYi1jb250cm9scyB7XG5cdFx0Ym9keS5pcy1waG9uZSAmIGJ1dHRvbi5jbGlja2FibGUtaWNvbiB7XG5cdFx0XHR3aWR0aDogdmFyKC0tYnV0dG9uLWhlaWdodCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gTWFrZSBjbGlja2FibGUgaWNvbnMgaW4gc2V0dGluZyBwYW5lcyBtb3JlIHZpc2libGUgb24gbW9iaWxlLlxuXHRib2R5LmlzLXBob25lIC5jYWxsb3V0bWFuYWdlci1zZXR0aW5nLXRhYi1jb250ZW50IC5zZXR0aW5nLWl0ZW0tY29udHJvbCBidXR0b24uY2xpY2thYmxlLWljb24ge1xuXHRcdGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNoZWNrYm94LWJvcmRlci1jb2xvcik7XG5cblx0XHQmLmNhbGxvdXRtYW5hZ2VyLXNldHRpbmctc2V0IHtcblx0XHRcdC8vIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcblx0XHR9XG5cdH1cbmA7XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIGdldEljb24gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENhbGxvdXRJRCB9IGZyb20gJyZjYWxsb3V0JztcbmltcG9ydCB7IFJHQiB9IGZyb20gJyZjb2xvcic7XG5cbmNvbnN0IE5PX0FUVEFDSCA9IFN5bWJvbCgpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByZXZpZXdPcHRpb25zIHtcblx0LyoqXG5cdCAqIFRoZSBjYWxsb3V0IElELlxuXHQgKi9cblx0aWQ6IENhbGxvdXRJRDtcblxuXHQvKipcblx0ICogVGhlIGljb24gdG8gZGlzcGxheSBpbiB0aGUgY2FsbG91dC5cblx0ICogVGhpcyBzaG91bGQgYmUga25vd24gaW4gYWR2YW5jZS5cblx0ICovXG5cdGljb246IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIGNvbG9yIG9mIHRoZSBjYWxsb3V0LlxuXHQgKi9cblx0Y29sb3I/OiBSR0I7XG5cblx0LyoqXG5cdCAqIFRoZSB0aXRsZSB0byBzaG93LlxuXHQgKiBUaGUgY2FsbG91dCBJRCB3aWxsIGJlIHVzZWQgaWYgdGhpcyBpcyBvbWl0dGVkLlxuXHQgKi9cblx0dGl0bGU/OiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcgfCAoKHRpdGxlRWw6IEhUTUxFbGVtZW50KSA9PiB1bmtub3duKTtcblxuXHQvKipcblx0ICogVGhlIGNvbnRlbnQgdG8gc2hvdy5cblx0ICovXG5cdGNvbnRlbnQ/OiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcgfCAoKGNvbnRlbnRFbDogSFRNTEVsZW1lbnQpID0+IHVua25vd24pO1xufVxuXG4vKipcbiAqIEEgY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYSBwcmV2aWV3IG9mIGEgY2FsbG91dC5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxvdXRQcmV2aWV3Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcblx0cHVibGljIHJlYWRvbmx5IGNhbGxvdXRFbDogSFRNTEVsZW1lbnQ7XG5cdHB1YmxpYyByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuXHRwdWJsaWMgcmVhZG9ubHkgdGl0bGVFbDogSFRNTEVsZW1lbnQ7XG5cdHB1YmxpYyByZWFkb25seSBpY29uRWw6IEhUTUxFbGVtZW50O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250YWluZXJFbDogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgdHlwZW9mIE5PX0FUVEFDSCwgb3B0aW9uczogUHJldmlld09wdGlvbnMpIHtcblx0XHRzdXBlcigpO1xuXHRcdGNvbnN0IHsgY29sb3IsIGljb24sIGlkLCB0aXRsZSwgY29udGVudCB9ID0gb3B0aW9ucztcblxuXHRcdGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cblx0XHQvLyBCdWlsZCB0aGUgY2FsbG91dC5cblx0XHRjb25zdCBjYWxsb3V0RWwgPSAodGhpcy5jYWxsb3V0RWwgPSBmcmFnLmNyZWF0ZURpdih7IGNsczogWydjYWxsb3V0JywgJ2NhbGxvdXRtYW5hZ2VyLXByZXZpZXcnXSB9KSk7XG5cdFx0Y29uc3QgdGl0bGVFbENvbnRhaW5lciA9IGNhbGxvdXRFbC5jcmVhdGVEaXYoeyBjbHM6ICdjYWxsb3V0LXRpdGxlJyB9KTtcblx0XHR0aGlzLmljb25FbCA9IHRpdGxlRWxDb250YWluZXIuY3JlYXRlRGl2KHsgY2xzOiAnY2FsbG91dC1pY29uJyB9KTtcblx0XHRjb25zdCB0aXRsZUVsID0gKHRoaXMudGl0bGVFbCA9IHRpdGxlRWxDb250YWluZXIuY3JlYXRlRGl2KHsgY2xzOiAnY2FsbG91dC10aXRsZS1pbm5lcicgfSkpO1xuXHRcdGNvbnN0IGNvbnRlbnRFbCA9ICh0aGlzLmNvbnRlbnRFbCA9XG5cdFx0XHRjb250ZW50ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBjYWxsb3V0RWwuY3JlYXRlRGl2KHsgY2xzOiAnY2FsbG91dC1jb250ZW50JyB9KSk7XG5cblx0XHR0aGlzLnNldEljb24oaWNvbik7XG5cdFx0dGhpcy5zZXRDb2xvcihjb2xvcik7XG5cdFx0dGhpcy5zZXRDYWxsb3V0SUQoaWQpO1xuXG5cdFx0Ly8gU2V0IHRoZSBjYWxsb3V0IHRpdGxlLlxuXHRcdGlmICh0aXRsZSA9PSBudWxsKSB0aXRsZUVsLnRleHRDb250ZW50ID0gaWQ7XG5cdFx0ZWxzZSBpZiAodHlwZW9mIHRpdGxlID09PSAnZnVuY3Rpb24nKSB0aXRsZSh0aXRsZUVsKTtcblx0XHRlbHNlIGlmICh0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnKSB0aXRsZUVsLnRleHRDb250ZW50ID0gdGl0bGU7XG5cdFx0ZWxzZSB0aXRsZUVsLmFwcGVuZENoaWxkKHRpdGxlKTtcblxuXHRcdC8vIFNldCB0aGUgY2FsbG91dCBjb250ZW50cy5cblx0XHRpZiAoY29udGVudEVsICE9IG51bGwpIHtcblx0XHRcdGlmICh0eXBlb2YgY29udGVudCA9PT0gJ2Z1bmN0aW9uJykgY29udGVudChjb250ZW50RWwpO1xuXHRcdFx0ZWxzZSBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50RWwudGV4dENvbnRlbnQgPSBjb250ZW50O1xuXHRcdFx0ZWxzZSBjb250ZW50RWwuYXBwZW5kQ2hpbGQoY29udGVudCBhcyBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQpO1xuXHRcdH1cblxuXHRcdC8vIEF0dGFjaCB0byB0aGUgY29udGFpbmVyLlxuXHRcdGlmIChjb250YWluZXJFbCAhPSBOT19BVFRBQ0gpIHtcblx0XHRcdENhbGxvdXRQcmV2aWV3Q29tcG9uZW50LnByb3RvdHlwZS5hdHRhY2hUby5jYWxsKHRoaXMsIGNvbnRhaW5lckVsKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgY2FsbG91dCBJRC5cblx0ICogVGhpcyB3aWxsICpub3QqIGNoYW5nZSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgcHJldmlldy5cblx0ICpcblx0ICogQHBhcmFtIGlkIFRoZSBuZXcgSUQgdG8gdXNlLlxuXHQgKi9cblx0cHVibGljIHNldENhbGxvdXRJRChpZDogc3RyaW5nKTogdHlwZW9mIHRoaXMge1xuXHRcdGNvbnN0IHsgY2FsbG91dEVsIH0gPSB0aGlzO1xuXHRcdGNhbGxvdXRFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2FsbG91dCcsIGlkKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBjYWxsb3V0IGljb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBpY29uIFRoZSBJRCBvZiB0aGUgbmV3IGljb24gdG8gdXNlLlxuXHQgKi9cblx0cHVibGljIHNldEljb24oaWNvbjogc3RyaW5nKTogdHlwZW9mIHRoaXMge1xuXHRcdGNvbnN0IHsgaWNvbkVsLCBjYWxsb3V0RWwgfSA9IHRoaXM7XG5cblx0XHQvLyBDaGFuZ2UgdGhlIGljb24gc3R5bGUgdmFyaWFibGUuXG5cdFx0Y2FsbG91dEVsLnN0eWxlLnNldFByb3BlcnR5KCctLWNhbGxvdXQtaWNvbicsIGljb24pO1xuXG5cdFx0Ly8gQ2xlYXIgdGhlIGljb24gZWxlbWVudCBhbmQgYXBwZW5kIHRoZSBTVkcuXG5cdFx0aWNvbkVsLmVtcHR5KCk7XG5cdFx0Y29uc3QgaWNvblN2ZyA9IGdldEljb24oaWNvbik7XG5cdFx0aWYgKGljb25TdmcgIT0gbnVsbCkge1xuXHRcdFx0dGhpcy5pY29uRWwuYXBwZW5kQ2hpbGQoaWNvblN2Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgY2FsbG91dCBjb2xvci5cblx0ICpcblx0ICogQHBhcmFtIGNvbG9yIFRoZSBjb2xvciB0byB1c2UuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q29sb3IoY29sb3I6IFJHQiB8IHVuZGVmaW5lZCk6IHR5cGVvZiB0aGlzIHtcblx0XHRjb25zdCB7IGNhbGxvdXRFbCB9ID0gdGhpcztcblxuXHRcdGlmIChjb2xvciA9PSBudWxsKSB7XG5cdFx0XHRjYWxsb3V0RWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tY2FsbG91dC1jb2xvcicpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Y2FsbG91dEVsLnN0eWxlLnNldFByb3BlcnR5KCctLWNhbGxvdXQtY29sb3InLCBgcmdiKCR7Y29sb3Iucn0sICR7Y29sb3IuZ30sICR7Y29sb3IuYn0pYCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQXR0YWNoZXMgdGhlIGNhbGxvdXQgcHJldmlldyB0byBhIERPTSBlbGVtZW50LlxuXHQgKiBUaGlzIHBsYWNlcyBpdCBhdCB0aGUgZW5kIG9mIHRoZSBlbGVtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGFpbmVyRWwgVGhlIGNvbnRhaW5lciB0byBhdHRhY2ggdG8uXG5cdCAqL1xuXHRwdWJsaWMgYXR0YWNoVG8oY29udGFpbmVyRWw6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudCk6IHR5cGVvZiB0aGlzIHtcblx0XHRjb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmNhbGxvdXRFbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogUmVzZXRzIHRoZSBgLS1jYWxsb3V0LWNvbG9yYCBhbmQgYC0tY2FsbG91dC1pY29uYCBDU1MgcHJvcGVydGllcyBhZGRlZCB0byB0aGUgY2FsbG91dCBlbGVtZW50LlxuXHQgKi9cblx0cHVibGljIHJlc2V0U3R5bGVQcm9wZXJ0eU92ZXJyaWRlcygpIHtcblx0XHRjb25zdCB7IGNhbGxvdXRFbCB9ID0gdGhpcztcblx0XHRjYWxsb3V0RWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tY2FsbG91dC1jb2xvcicpO1xuXHRcdGNhbGxvdXRFbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnLS1jYWxsb3V0LWljb24nKTtcblx0fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElzb2xhdGVkUHJldmlld09wdGlvbnMgZXh0ZW5kcyBQcmV2aWV3T3B0aW9ucyB7XG5cdGNvbG9yU2NoZW1lOiAnZGFyaycgfCAnbGlnaHQnO1xuXG5cdGZvY3VzZWQ/OiBib29sZWFuO1xuXHR2aWV3VHlwZT86ICdzb3VyY2UnIHwgJ3JlYWRpbmcnO1xuXHRjc3NFbHM/OiAoSFRNTFN0eWxlRWxlbWVudCB8IEhUTUxMaW5rRWxlbWVudClbXTtcbn1cblxuLyoqXG4gKiBBbiBpc29sYXRlZCBjYWxsb3V0IHByZXZpZXcuXG4gKlxuICogVGhpcyB1c2VzIHRoZSBTaGFkb3cgRE9NIHRvIGNyZWF0ZSBhIGZ1bGwgRE9NIGZvciB0aGUgY2FsbG91dCwgYW5kIGFsbG93cyBmb3IgY3VzdG9tIHN0eWxlcyB0byBiZSB1c2VkLlxuICovXG5leHBvcnQgY2xhc3MgSXNvbGF0ZWRDYWxsb3V0UHJldmlld0NvbXBvbmVudCBleHRlbmRzIENhbGxvdXRQcmV2aWV3Q29tcG9uZW50IHtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IHN0eWxlRWxzOiBIVE1MU3R5bGVFbGVtZW50W107XG5cdHByb3RlY3RlZCByZWFkb25seSBzaGFkb3dCb2R5OiBIVE1MQm9keUVsZW1lbnQ7XG5cdHByb3RlY3RlZCByZWFkb25seSBzaGFkb3dIZWFkOiBIVE1MSGVhZEVsZW1lbnQ7XG5cdHByb3RlY3RlZCByZWFkb25seSBzaGFkb3dIb3N0RWw6IEhUTUxFbGVtZW50O1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgc2hhZG93Um9vdDogU2hhZG93Um9vdDtcblxuXHRwdWJsaWMgcmVhZG9ubHkgY3VzdG9tU3R5bGVFbDogSFRNTFN0eWxlRWxlbWVudDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwgb3B0aW9uczogSXNvbGF0ZWRQcmV2aWV3T3B0aW9ucykge1xuXHRcdHN1cGVyKE5PX0FUVEFDSCwgb3B0aW9ucyk7XG5cblx0XHRjb25zdCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXHRcdGNvbnN0IGZvY3VzZWQgPSBvcHRpb25zLmZvY3VzZWQgPz8gZmFsc2U7XG5cdFx0Y29uc3QgY29sb3JTY2hlbWUgPSBvcHRpb25zLmNvbG9yU2NoZW1lO1xuXHRcdGNvbnN0IHJlYWRpbmdWaWV3ID0gKG9wdGlvbnMudmlld1R5cGUgPz8gJ3JlYWRpbmcnKSA9PT0gJ3JlYWRpbmcnO1xuXHRcdGNvbnN0IGNzc0VscyA9IG9wdGlvbnM/LmNzc0VscyA/PyBnZXRDdXJyZW50U3R5bGVzKGNvbnRhaW5lckVsPy5kb2MpO1xuXG5cdFx0Ly8gQ3JlYXRlIGEgc2hhZG93IGRvbS5cblx0XHRjb25zdCBzaGFkb3dIb3N0RWwgPSAodGhpcy5zaGFkb3dIb3N0RWwgPSBmcmFnLmNyZWF0ZURpdigpKTtcblx0XHRjb25zdCBzaGFkb3dSb290ID0gKHRoaXMuc2hhZG93Um9vdCA9IHNoYWRvd0hvc3RFbC5hdHRhY2hTaGFkb3coeyBkZWxlZ2F0ZXNGb2N1czogZmFsc2UsIG1vZGU6ICdjbG9zZWQnIH0pKTtcblx0XHRjb25zdCBzaGFkb3dIZWFkID0gKHRoaXMuc2hhZG93SGVhZCA9IHNoYWRvd1Jvb3QuY3JlYXRlRWwoJ2hlYWQnKSk7XG5cdFx0Y29uc3Qgc2hhZG93Qm9keSA9ICh0aGlzLnNoYWRvd0JvZHkgPSBzaGFkb3dSb290LmNyZWF0ZUVsKCdib2R5JykpO1xuXG5cdFx0Ly8gQ29weSB0aGUgc3R5bGVzIGludG8gdGhlIHNoYWRvdyBoZWFkLlxuXHRcdGNvbnN0IHN0eWxlRWxzID0gKHRoaXMuc3R5bGVFbHMgPSBbXSBhcyBIVE1MU3R5bGVFbGVtZW50W10pO1xuXHRcdGZvciAoY29uc3QgY3NzRWwgb2YgY3NzRWxzKSB7XG5cdFx0XHRjb25zdCBjc3NFbENsb25lID0gY3NzRWwuY2xvbmVOb2RlKHRydWUpO1xuXHRcdFx0aWYgKGNzc0VsLnRhZ05hbWUgPT09ICdTVFlMRScpIHtcblx0XHRcdFx0c3R5bGVFbHMucHVzaChjc3NFbENsb25lIGFzIEhUTUxTdHlsZUVsZW1lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHRzaGFkb3dIZWFkLmFwcGVuZENoaWxkKGNzc0VsQ2xvbmUpO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBzdHlsZXMgdG8gcmVzZXQgYWxsIHByb3BlcnRpZXMgb24gZXZlcnl0aGluZyBhYm92ZSB0aGUgY2FsbG91dC5cblx0XHQvL1xuXHRcdC8vIFRoaXMgaXMgc28gd2UgY2FuIGtlZXAgdGhlIHNlbGVjdG9ycyBjb25zaXN0ZW50IGJldHdlZW4gcmVhbCBPYnNpZGlhbiBhbmQgb3VyIGZha2Ugb25lLCB3aXRob3V0XG5cdFx0Ly8gaGF2aW5nIHRob3NlIGVsZW1lbnRzIGFmZmVjdCB0aGUgZGlzcGxheSBvZiB0aGUgY2FsbG91dCBpdHNlbGYuXG5cdFx0c2hhZG93SGVhZC5jcmVhdGVFbCgnc3R5bGUnLCB7IHRleHQ6IFNIQURPV19ET01fUkVTRVRfU1RZTEVTIH0pO1xuXG5cdFx0Ly8gQWRkIGEgY3VzdG9tIHN0eWxlIGVsZW1lbnQuXG5cdFx0dGhpcy5jdXN0b21TdHlsZUVsID0gc2hhZG93SGVhZC5jcmVhdGVFbCgnc3R5bGUnLCB7IGF0dHI6IHsgJ2RhdGEtY3VzdG9tLXN0eWxlcyc6ICd0cnVlJyB9IH0pO1xuXG5cdFx0Ly8gQ3JlYXRlIGEgZmFrZSBET00gdHJlZSBpbnNpZGUgdGhlIHNoYWRvdyBib2R5IHRvIGhvc3QgdGhlIGNhbGxvdXQuXG5cdFx0c2hhZG93Qm9keS5jbGFzc0xpc3QuYWRkKGB0aGVtZS0ke2NvbG9yU2NoZW1lfWAsICdvYnNpZGlhbi1hcHAnKTtcblx0XHRjb25zdCB2aWV3Q29udGVudEVsID0gc2hhZG93Qm9keVxuXHRcdFx0LmNyZWF0ZURpdih7IGNsczogJ2FwcC1jb250YWluZXInIH0pXG5cdFx0XHQuY3JlYXRlRGl2KHsgY2xzOiAnaG9yaXpvbnRhbC1tYWluLWNvbnRhaW5lcicgfSlcblx0XHRcdC5jcmVhdGVEaXYoeyBjbHM6ICd3b3Jrc3BhY2UnIH0pXG5cdFx0XHQuY3JlYXRlRGl2KHsgY2xzOiAnd29ya3NwYWNlLXNwbGl0IG1vZC1yb290JyB9KVxuXHRcdFx0LmNyZWF0ZURpdih7IGNsczogYHdvcmtzcGFjZS10YWJzICR7Zm9jdXNlZCA/ICdtb2QtYWN0aXZlJyA6ICcnfWAgfSlcblx0XHRcdC5jcmVhdGVEaXYoeyBjbHM6ICd3b3Jrc3BhY2UtdGFiLWNvbnRhaW5lcicgfSlcblx0XHRcdC5jcmVhdGVEaXYoeyBjbHM6IGB3b3Jrc3BhY2UtbGVhZiAke2ZvY3VzZWQgPyAnbW9kLWFjdGl2ZScgOiAnJ31gIH0pXG5cdFx0XHQuY3JlYXRlRGl2KHsgY2xzOiAnd29ya3NwYWNlLWxlYWYtY29udGVudCcgfSlcblx0XHRcdC5jcmVhdGVEaXYoeyBjbHM6ICd2aWV3LWNvbnRlbnQnIH0pO1xuXG5cdFx0Y29uc3QgY2FsbG91dFBhcmVudEVsID0gcmVhZGluZ1ZpZXdcblx0XHRcdD8gY3JlYXRlUmVhZGluZ1ZpZXdDb250YWluZXIodmlld0NvbnRlbnRFbClcblx0XHRcdDogY3JlYXRlTGl2ZVZpZXdDb250YWluZXIodmlld0NvbnRlbnRFbCk7XG5cblx0XHRjYWxsb3V0UGFyZW50RWwuYXBwZW5kQ2hpbGQodGhpcy5jYWxsb3V0RWwpO1xuXG5cdFx0Ly8gQXR0YWNoIHRvIHRoZSBjb250YWluZXIuXG5cdFx0aWYgKGNvbnRhaW5lckVsICE9IG51bGwpIHtcblx0XHRcdElzb2xhdGVkQ2FsbG91dFByZXZpZXdDb21wb25lbnQucHJvdG90eXBlLmF0dGFjaFRvLmNhbGwodGhpcywgY29udGFpbmVyRWwgYXMgSFRNTEVsZW1lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyB0aGUgYDxzdHlsZT5gIGVsZW1lbnRzIHVzZWQgYnkgdGhlIGlzb2xhdGVkIGNhbGxvdXQgcHJldmlldyB3aXRoIHRoZSBsYXRlc3Qgb25lcy5cblx0ICovXG5cdHB1YmxpYyB1cGRhdGVTdHlsZXMoKTogdHlwZW9mIHRoaXMge1xuXHRcdHJldHVybiB0aGlzLnVwZGF0ZVN0eWxlc1dpdGgoXG5cdFx0XHRnZXRDdXJyZW50U3R5bGVzKHRoaXMuc2hhZG93SG9zdEVsLmRvYylcblx0XHRcdFx0LmZpbHRlcigoZSkgPT4gZS50YWdOYW1lID09PSAnU1RZTEUnKVxuXHRcdFx0XHQubWFwKChlKSA9PiBlLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MU3R5bGVFbGVtZW50KSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIHRoZSBgPHN0eWxlPmAgZWxlbWVudHMgdXNlZCBieSB0aGUgaXNvbGF0ZWQgY2FsbG91dCBwcmV2aWV3LlxuXHQgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgcHJldmlldyB3aXRoIHRoZSBsYXRlc3Qgc3R5bGVzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc3R5bGVFbHMgVGhlIG5ldyBzdHlsZSBlbGVtZW50cyB0byB1c2UuIFRoZXNlIHdpbGwgKm5vdCogYmUgY2xvbmVkLlxuXHQgKi9cblx0cHVibGljIHVwZGF0ZVN0eWxlc1dpdGgoc3R5bGVFbHM6IEhUTUxTdHlsZUVsZW1lbnRbXSk6IHR5cGVvZiB0aGlzIHtcblx0XHRjb25zdCB7IHN0eWxlRWxzOiBvbGRTdHlsZUVscywgY3VzdG9tU3R5bGVFbCB9ID0gdGhpcztcblxuXHRcdC8vIFJlcGxhY2UgdGhlIHN0eWxlcy5cblx0XHRsZXQgaSwgZW5kO1xuXHRcdGxldCBsYXN0Tm9kZSA9IGN1c3RvbVN0eWxlRWwucHJldmlvdXNTaWJsaW5nIGFzIEhUTUxFbGVtZW50O1xuXHRcdGZvciAoaSA9IDAsIGVuZCA9IE1hdGgubWluKHN0eWxlRWxzLmxlbmd0aCwgb2xkU3R5bGVFbHMubGVuZ3RoKTsgaSA8IGVuZDsgaSsrKSB7XG5cdFx0XHRjb25zdCBlbCA9IHN0eWxlRWxzW2ldO1xuXHRcdFx0b2xkU3R5bGVFbHNbaV0ucmVwbGFjZVdpdGgoZWwpO1xuXHRcdFx0bGFzdE5vZGUgPSBlbDtcblx0XHR9XG5cblx0XHQvLyBBZGQgc3R5bGVzIHRoYXQgZGlkbid0IGhhdmUgYW55d2hlcmUgdG8gZ28uXG5cdFx0Zm9yIChlbmQgPSBzdHlsZUVscy5sZW5ndGg7IGkgPCBlbmQ7IGkrKykge1xuXHRcdFx0Y29uc3QgZWwgPSBzdHlsZUVsc1tpXTtcblx0XHRcdGxhc3ROb2RlLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBlbCk7XG5cdFx0XHRvbGRTdHlsZUVscy5wdXNoKGVsKTtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZXh0cmEgc3R5bGVzLlxuXHRcdGNvbnN0IHRvUmVtb3ZlID0gb2xkU3R5bGVFbHMuc3BsaWNlKGksIG9sZFN0eWxlRWxzLmxlbmd0aCAtIGkpO1xuXHRcdGZvciAoY29uc3Qgbm9kZSBvZiB0b1JlbW92ZSkge1xuXHRcdFx0bm9kZS5yZW1vdmUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIG1hdGNoaW5nIHN0eWxlIGVsZW1lbnRzLlxuXHQgKiBAcGFyYW0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24uIElmIGl0IHJldHVybnMgdHJ1ZSwgdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZC5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVTdHlsZXMocHJlZGljYXRlOiAoZWw6IEhUTUxTdHlsZUVsZW1lbnQpID0+IGJvb2xlYW4pIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3R5bGVFbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGVsID0gdGhpcy5zdHlsZUVsc1tpXTtcblx0XHRcdGlmIChwcmVkaWNhdGUoZWwpKSB7XG5cdFx0XHRcdGVsLnJlbW92ZSgpO1xuXHRcdFx0XHR0aGlzLnN0eWxlRWxzLnNwbGljZShpLCAxKTtcblx0XHRcdFx0aS0tO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBjb2xvciBzY2hlbWUuXG5cdCAqIEBwYXJhbSBjb2xvclNjaGVtZSBUaGUgY29sb3Igc2NoZW1lIHRvIHVzZS5cblx0ICovXG5cdHB1YmxpYyBzZXRDb2xvclNjaGVtZShjb2xvclNjaGVtZTogJ2RhcmsnIHwgJ2xpZ2h0Jyk6IHR5cGVvZiB0aGlzIHtcblx0XHRjb25zdCB7IGNsYXNzTGlzdCB9ID0gdGhpcy5zaGFkb3dCb2R5O1xuXHRcdGNsYXNzTGlzdC50b2dnbGUoJ3RoZW1lLWRhcmsnLCBjb2xvclNjaGVtZSA9PT0gJ2RhcmsnKTtcblx0XHRjbGFzc0xpc3QudG9nZ2xlKCd0aGVtZS1saWdodCcsIGNvbG9yU2NoZW1lID09PSAnbGlnaHQnKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBBdHRhY2hlcyB0aGUgY2FsbG91dCBwcmV2aWV3IHRvIGEgRE9NIGVsZW1lbnQuXG5cdCAqIFRoaXMgcGxhY2VzIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250YWluZXJFbCBUaGUgY29udGFpbmVyIHRvIGF0dGFjaCB0by5cblx0ICogQG92ZXJyaWRlXG5cdCAqL1xuXHRwdWJsaWMgYXR0YWNoVG8oY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KTogdHlwZW9mIHRoaXMge1xuXHRcdGNvbnRhaW5lckVsLmFwcGVuZENoaWxkKHRoaXMuc2hhZG93SG9zdEVsKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnRseS1hcHBsaWVkIE9ic2lkaWFuIHN0eWxlc2hlZXRzIGFuZCBzdHlsZXMuXG4gKlxuICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gdGFrZSB0aGUgc3R5bGVzIGZyb20uXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiAqKnVuY2xvbmVkKiogYHN0eWxlYCBhbmQgYGxpbmtgIG5vZGVzLlxuICovXG5mdW5jdGlvbiBnZXRDdXJyZW50U3R5bGVzKGRvYz86IERvY3VtZW50KTogQXJyYXk8SFRNTFN0eWxlRWxlbWVudCB8IEhUTUxMaW5rRWxlbWVudD4ge1xuXHRjb25zdCBlbHM6IEFycmF5PEhUTUxTdHlsZUVsZW1lbnQgfCBIVE1MTGlua0VsZW1lbnQ+ID0gW107XG5cdGxldCBub2RlID0gKGRvYyA/PyB3aW5kb3cuZG9jdW1lbnQpLmhlYWQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdGZvciAoOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLm5leHRFbGVtZW50U2libGluZykge1xuXHRcdGNvbnN0IG5vZGVUYWcgPSBub2RlLnRhZ05hbWU7XG5cdFx0aWYgKG5vZGVUYWcgPT09ICdTVFlMRScgfHwgKG5vZGVUYWcgPT09ICdMSU5LJyAmJiBub2RlLmdldEF0dHJpYnV0ZSgncmVsJyk/LnRvTG93ZXJDYXNlKCkgPT09ICdzdHlsZXNoZWV0JykpIHtcblx0XHRcdGVscy5wdXNoKG5vZGUgYXMgSFRNTFN0eWxlRWxlbWVudCB8IEhUTUxMaW5rRWxlbWVudCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBlbHM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIERPTSByZXByZXNlbnRhdGlvbiBvZiB0aGUgT2JzaWRpYW4gcmVhZGluZyB2aWV3LlxuICogQSBjYWxsb3V0IHBsYWNlZCB3aXRoaW4gdGhlIHJldHVybmVkIGNvbnRhaW5lciB3aWxsIGFjdCBhcyB0aG91Z2ggaXQgaXMgaW5zaWRlIGEgTWFya2Rvd24gZG9jdW1lbnQncyByZWFkaW5nIHZpZXcuXG4gKlxuICogQHBhcmFtIHZpZXdDb250ZW50RWwgVGhlIGAudmlldy1jb250ZW50YCBjb250YWluZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIEEgY29udGFpbmVyIHRvIGF0dGFjaCBhIGNhbGxvdXQgdG8uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlYWRpbmdWaWV3Q29udGFpbmVyKHZpZXdDb250ZW50RWw6IEhUTUxEaXZFbGVtZW50KTogSFRNTERpdkVsZW1lbnQge1xuXHQvLyBkaXYubWFya2Rvd24tcmVhZGluZy12aWV3IGRpdi5tYXJrZG93bi1wcmV2aWV3LXZpZS5tYXJrZG93bi1yZW5kZXJlZCAubWFya2Rvd24tcHJldmlldy1zZWN0aW9uXG5cdC8vIGRpdiBkaXYuY2FsbG91dFtkYXRhLWNhbGxvdXRdXG5cdHJldHVybiB2aWV3Q29udGVudEVsXG5cdFx0LmNyZWF0ZURpdih7IGNsczogJ21hcmtkb3duLXJlYWRpbmctdmlldycgfSlcblx0XHQuY3JlYXRlRGl2KHsgY2xzOiAnbWFya2Rvd24tcHJldmlldy12aWV3IG1hcmtkb3duLXJlbmRlcmVkJyB9KVxuXHRcdC5jcmVhdGVEaXYoeyBjbHM6ICdtYXJrZG93bi1wcmV2aWV3LXNlY3Rpb24nIH0pXG5cdFx0LmNyZWF0ZURpdigpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBET00gcmVwcmVzZW50YXRpb24gb2YgdGhlIE9ic2lkaWFuIGxpdmUgZWRpdG9yIHZpZXcuXG4gKiBBIGNhbGxvdXQgcGxhY2VkIHdpdGhpbiB0aGUgcmV0dXJuZWQgY29udGFpbmVyIHdpbGwgYWN0IGFzIHRob3VnaCBpdCBpcyBpbnNpZGUgYSBNYXJrZG93biBkb2N1bWVudCdzIENvZGVNaXJyb3IgZWRpdG9yLlxuICpcbiAqIEBwYXJhbSB2aWV3Q29udGVudEVsIFRoZSBgLnZpZXctY29udGVudGAgY29udGFpbmVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIGNvbnRhaW5lciB0byBhdHRhY2ggYSBjYWxsb3V0IHRvLlxuICovXG5mdW5jdGlvbiBjcmVhdGVMaXZlVmlld0NvbnRhaW5lcih2aWV3Q29udGVudEVsOiBIVE1MRGl2RWxlbWVudCk6IEhUTUxEaXZFbGVtZW50IHtcblx0Ly8gZGl2Lm1hcmtkb3duLXNvdXJjZS12aWV3LmNtLXMtb2JzaWRpYW4ubW9kLWNtNi5pcy1saXZlLXByZXZpZXcgZGl2LmNtLWVkaXRvci7NvDEuzbwyLs28cSBkaXYuY20tc2Nyb2xsZXJcblx0Ly8gZGl2LmNtLXNpemVyIGRpdi5jbS1jb250ZW50Q29udGFpbmVyIGRpdi5jbS1jb250ZW50IGRpdi5jbS1lbWJlZC1ibG9jay5tYXJrZG93bi1yZW5kZXJlZC5jbS1jYWxsb3V0XG5cdHJldHVybiB2aWV3Q29udGVudEVsXG5cdFx0LmNyZWF0ZURpdih7IGNsczogJ21hcmtkb3duLXNvdXJjZS12aWV3IGNtLXMtb2JzaWRpYW4gbW9kLWNtNiBpcy1saXZlLXByZXZpZXcnIH0pXG5cdFx0LmNyZWF0ZURpdih7IGNsczogJ2NtLWVkaXRvciDNvDEgzbwyIM28cScgfSlcblx0XHQuY3JlYXRlRGl2KHsgY2xzOiAnY20tc2Nyb2xsZXInIH0pXG5cdFx0LmNyZWF0ZURpdih7IGNsczogJ2NtLXNpemVyJyB9KVxuXHRcdC5jcmVhdGVEaXYoeyBjbHM6ICdjbS1jb250ZW50Q29udGFpbmVyJyB9KVxuXHRcdC5jcmVhdGVEaXYoeyBjbHM6ICdjbS1jb250ZW50JyB9KVxuXHRcdC5jcmVhdGVEaXYoeyBjbHM6ICdjbS1lbWJlZC1ibG9jayBtYXJrZG93bi1yZW5kZXJlZCBjbS1jYWxsb3V0JyB9KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHlsZXM6XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVjbGFyZSBjb25zdCBTVFlMRVM6IGBcblx0Ly8gUmVzZXQgdGhlIGJsZW5kIG1vZGUgb2YgdGhlIHByZXZpZXcuXG5cdC8vIFRoZSByZW5kZXJpbmcgb2YgdGhlIGNhbGxvdXRzIHdpbGwgYmUgYnJva2VuIHVubGVzcyB0aGlzIGlzIHJlc2V0LlxuXHQuY2FsbG91dC5jYWxsb3V0bWFuYWdlci1wcmV2aWV3IHtcblx0XHRtaXgtYmxlbmQtbW9kZTogdW5zZXQgIWltcG9ydGFudDtcblx0XHRtYXJnaW46IDAgIWltcG9ydGFudDtcblx0fVxuXG5cdC5jYWxsb3V0bWFuYWdlci1wcmV2aWV3LWNvbnRhaW5lciB7XG5cdFx0bWFyZ2luLXRvcDogMC41ZW07XG5cdFx0bWFyZ2luLWJvdHRvbTogMC41ZW07XG5cdH1cbmA7XG5cbmNvbnN0IFNIQURPV19ET01fUkVTRVRfU1RZTEVTID0gYFxuLyogUmVzZXQgbGF5b3V0IGFuZCBzdHlsaW5ncyBmb3IgYWxsIHByb3BlcnRpZXMgdXAgdG8gdGhlIGNhbGxvdXQuICovXG4uYXBwLWNvbnRhaW5lcixcbi5ob3Jpem9udGFsLW1haW4tY29udGFpbmVyLFxuLndvcmtzcGFjZSxcbi53b3Jrc3BhY2Utc3BsaXQsXG4ud29ya3NwYWNlLXRhYnMsXG4ud29ya3NwYWNlLXRhYi1jb250YWluZXIsXG4ud29ya3NwYWNlLWxlYWYsXG4ud29ya3NwYWNlLWxlYWYtY29udGVudCxcbi52aWV3LWNvbnRlbnQsXG4ubWFya2Rvd24tcmVhZGluZy12aWV3LFxuLm1hcmtkb3duLXNvdXJjZS12aWV3LFxuLmNtLWVkaXRvci7NvDEuzbwyLs28cSxcbi5jbS1lZGl0b3IuzbwxLs28Mi7NvHEgPiAuY20tc2Nyb2xsZXIsXG4uY20tc2l6ZXIsXG4uY20tY29udGVudENvbnRhaW5lcixcbi5jbS1jb250ZW50LFxuLm1hcmtkb3duLXByZXZpZXctdmlldyB7XG5cdGFsbDogaW5pdGlhbCAhaW1wb3J0YW50O1xuXHRkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuXG4vKiBTZXQgdGhlIHRleHQgY29sb3Igb2YgdGhlIGNvbnRhaW5lciBmb3IgdGhlIGNhbGxvdXQuICovXG4ubWFya2Rvd24tcHJldmlldy1zZWN0aW9uLFxuLmNtLWNhbGxvdXQge1xuXHRjb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpICFpbXBvcnRhbnQ7XG59XG5cbi8qIE92ZXJyaWRlIG1hcmdpbiBvbiBjYWxsb3V0IHRvIGtlZXAgdGhlIHByZXZpZXcgYXMgc21hbGwgYXMgcG9zc2libGUuICovXG4ubWFya2Rvd24tcHJldmlldy1zZWN0aW9uID4gZGl2ID4gLmNhbGxvdXQsXG4uY20tY2FsbG91dCA+IC5jYWxsb3V0LFxuLmNhbGxvdXRtYW5hZ2VyLXByZXZpZXcuY2FsbG91dCB7XG5cdG1hcmdpbjogMCAhaW1wb3J0YW50O1xufVxuXG4vKiBTZXQgdGhlIGZvbnQgcHJvcGVydGllcyBvZiB0aGUgY2FsbG91dC4gKi9cbi5jbS1jYWxsb3V0LFxuLmNhbGxvdXQge1xuXHRmb250LXNpemU6IHZhcigtLWZvbnQtdGV4dC1zaXplKSAhaW1wb3J0YW50O1xuXHRmb250LWZhbWlseTogdmFyKC0tZm9udC10ZXh0KSAhaW1wb3J0YW50O1xuXHRsaW5lLWhlaWdodDogdmFyKC0tbGluZS1oZWlnaHQtbm9ybWFsKSAhaW1wb3J0YW50O1xufVxuXG4vKiBVc2UgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBjb2xvci4gKi9cbmJvZHkge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuXHRjb250YWluOiBub25lO1xufVxuYDtcbiIsImltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQ2FsbG91dCwgQ2FsbG91dElEIH0gZnJvbSAnJmNhbGxvdXQnO1xuaW1wb3J0IHsgQ2FsbG91dFNldHRpbmdzIH0gZnJvbSAnJmNhbGxvdXQtc2V0dGluZ3MnO1xuaW1wb3J0IENhbGxvdXRNYW5hZ2VyUGx1Z2luIGZyb20gJyZwbHVnaW4nO1xuXG5pbXBvcnQgeyBVSVBhbmUgfSBmcm9tICcmdWkvcGFuZSc7XG5cbmltcG9ydCB7IEFwcGVhcmFuY2VFZGl0b3IgfSBmcm9tICcuL2FwcGVhcmFuY2UtZWRpdG9yJztcbmltcG9ydCB7IEFwcGVhcmFuY2UsIGRldGVybWluZUFwcGVhcmFuY2VUeXBlIH0gZnJvbSAnLi9hcHBlYXJhbmNlLXR5cGUnO1xuaW1wb3J0IENvbXBsZXhBcHBlYXJhbmNlRWRpdG9yIGZyb20gJy4vZWRpdG9yLWNvbXBsZXgnO1xuaW1wb3J0IFBlclNjaGVtZUFwcGVhcmFuY2VFZGl0b3IgZnJvbSAnLi9lZGl0b3ItcGVyLXNjaGVtZSc7XG5pbXBvcnQgVW5pZmllZEFwcGVhcmFuY2VFZGl0b3IgZnJvbSAnLi9lZGl0b3ItdW5pZmllZCc7XG5pbXBvcnQgeyBNaXNjRWRpdG9yIH0gZnJvbSAnLi9taXNjLWVkaXRvcic7XG5pbXBvcnQgeyByZW5kZXJJbmZvIH0gZnJvbSAnLi9zZWN0aW9uLWluZm8nO1xuaW1wb3J0IHsgRWRpdENhbGxvdXRQYW5lUHJldmlldyB9IGZyb20gJy4vc2VjdGlvbi1wcmV2aWV3JztcblxuY29uc3QgSU1QT1NTSUJMRV9DQUxMT1VUX0lEID0gJ1tub3QgYSByZWFsIGNhbGxvdXRdJztcblxuZXhwb3J0IGNsYXNzIEVkaXRDYWxsb3V0UGFuZSBleHRlbmRzIFVJUGFuZSB7XG5cdHB1YmxpYyByZWFkb25seSB0aXRsZTtcblx0cHJpdmF0ZSByZWFkb25seSB2aWV3T25seTogYm9vbGVhbjtcblx0cHJpdmF0ZSByZWFkb25seSBwbHVnaW46IENhbGxvdXRNYW5hZ2VyUGx1Z2luO1xuXG5cdHByaXZhdGUgY2FsbG91dDogQ2FsbG91dDtcblxuXHRwcml2YXRlIHByZXZpZXdTZWN0aW9uOiBFZGl0Q2FsbG91dFBhbmVQcmV2aWV3O1xuXHRwcml2YXRlIGFwcGVhcmFuY2VFZGl0b3JDb250YWluZXJFbDogSFRNTEVsZW1lbnQ7XG5cdHByaXZhdGUgYXBwZWFyYW5jZUVkaXRvckVsOiBIVE1MRWxlbWVudDtcblx0cHJpdmF0ZSBhcHBlYXJhbmNlRWRpdG9yITogQXBwZWFyYW5jZUVkaXRvcjxBcHBlYXJhbmNlPjtcblx0cHJpdmF0ZSBtaXNjRWRpdG9yOiBNaXNjRWRpdG9yO1xuXHRwcml2YXRlIG1pc2NFZGl0b3JDb250YWluZXJFbDogSFRNTEVsZW1lbnQ7XG5cdHByaXZhdGUgYXBwZWFyYW5jZSE6IEFwcGVhcmFuY2U7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHBsdWdpbjogQ2FsbG91dE1hbmFnZXJQbHVnaW4sIGlkOiBDYWxsb3V0SUQsIHZpZXdPbmx5OiBib29sZWFuKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0XHR0aGlzLnZpZXdPbmx5ID0gdmlld09ubHk7XG5cdFx0dGhpcy50aXRsZSA9IHsgdGl0bGU6ICdDYWxsb3V0Jywgc3VidGl0bGU6IGlkIH07XG5cblx0XHQvLyBHZXQgdGhlIGNhbGxvdXQgaW5mb3JtYXRpb24uXG5cdFx0dGhpcy5jYWxsb3V0ID0gcGx1Z2luLmNhbGxvdXRzLmdldChpZCkgPz8ge1xuXHRcdFx0c291cmNlczogW3sgdHlwZTogJ2N1c3RvbScgfV0sXG5cdFx0XHQuLi5wbHVnaW4uY2FsbG91dFJlc29sdmVyLmdldENhbGxvdXRQcm9wZXJ0aWVzKElNUE9TU0lCTEVfQ0FMTE9VVF9JRCksXG5cdFx0XHRpZCxcblx0XHR9O1xuXG5cdFx0Ly8gQ3JlYXRlIHRoZSBwcmV2aWV3LlxuXHRcdHRoaXMucHJldmlld1NlY3Rpb24gPSBuZXcgRWRpdENhbGxvdXRQYW5lUHJldmlldyhwbHVnaW4sIHRoaXMuY2FsbG91dCwgZmFsc2UpO1xuXG5cdFx0Ly8gQ3JlYXRlIHRoZSBtaXNjIGVkaXRvci5cblx0XHR0aGlzLm1pc2NFZGl0b3JDb250YWluZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdHRoaXMubWlzY0VkaXRvckNvbnRhaW5lckVsLmNsYXNzTGlzdC5hZGQoXG5cdFx0XHQnY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LXNlY3Rpb24nLFxuXHRcdFx0J2NhbGxvdXRtYW5hZ2VyLWVkaXQtY2FsbG91dC1zZWN0aW9uLS1ub2JvcmRlcicsXG5cdFx0XHQnY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LW1pc2MnLFxuXHRcdCk7XG5cblx0XHR0aGlzLm1pc2NFZGl0b3IgPSBuZXcgTWlzY0VkaXRvcihwbHVnaW4sIHRoaXMuY2FsbG91dCwgdGhpcy5taXNjRWRpdG9yQ29udGFpbmVyRWwsIHZpZXdPbmx5KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5taXNjRWRpdG9yLCAnbmF2Jywge1xuXHRcdFx0Z2V0OiAoKSA9PiB0aGlzLm5hdixcblx0XHR9KTtcblxuXHRcdC8vIENyZWF0ZSB0aGUgYXBwZWFyYW5jZSBlZGl0b3IuXG5cdFx0dGhpcy5hcHBlYXJhbmNlRWRpdG9yQ29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHR0aGlzLmFwcGVhcmFuY2VFZGl0b3JDb250YWluZXJFbC5jbGFzc0xpc3QuYWRkKFxuXHRcdFx0J2NhbGxvdXRtYW5hZ2VyLWVkaXQtY2FsbG91dC1zZWN0aW9uJyxcblx0XHRcdCdjYWxsb3V0bWFuYWdlci1lZGl0LWNhbGxvdXQtYXBwZWFyYW5jZScsXG5cdFx0KTtcblxuXHRcdHRoaXMuYXBwZWFyYW5jZUVkaXRvckNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0FwcGVhcmFuY2UnIH0pO1xuXHRcdHRoaXMuYXBwZWFyYW5jZUVkaXRvckVsID0gdGhpcy5hcHBlYXJhbmNlRWRpdG9yQ29udGFpbmVyRWwuY3JlYXRlRGl2KCk7XG5cblx0XHR0aGlzLmNoYW5nZVNldHRpbmdzKHBsdWdpbi5nZXRDYWxsb3V0U2V0dGluZ3MoaWQpID8/IFtdKTtcblx0fVxuXG5cdHByb3RlY3RlZCBjaGFuZ2VBcHBlYXJhbmNlRWRpdG9yKG5ld0FwcGVhcmFuY2U6IEFwcGVhcmFuY2UpIHtcblx0XHRjb25zdCBvbGRBcHBlYXJhbmNlID0gdGhpcy5hcHBlYXJhbmNlO1xuXHRcdHRoaXMuYXBwZWFyYW5jZSA9IG5ld0FwcGVhcmFuY2U7XG5cblx0XHRpZiAobmV3QXBwZWFyYW5jZS50eXBlICE9PSBvbGRBcHBlYXJhbmNlPy50eXBlKSB7XG5cdFx0XHR0aGlzLmFwcGVhcmFuY2VFZGl0b3IgPSBuZXcgQVBQRUFSQU5DRV9FRElUT1JTW25ld0FwcGVhcmFuY2UudHlwZV0oKTtcblxuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcy5hcHBlYXJhbmNlRWRpdG9yLCB7XG5cdFx0XHRcdG5hdjogeyBnZXQ6ICgpID0+IHRoaXMubmF2IH0sXG5cdFx0XHRcdHBsdWdpbjogeyB2YWx1ZTogdGhpcy5wbHVnaW4gfSxcblx0XHRcdFx0Y29udGFpbmVyRWw6IHsgdmFsdWU6IHRoaXMuYXBwZWFyYW5jZUVkaXRvckVsIH0sXG5cdFx0XHRcdHNldEFwcGVhcmFuY2U6IHsgdmFsdWU6IHRoaXMub25TZXRBcHBlYXJhbmNlLmJpbmQodGhpcykgfSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgYXBwZWFyYW5jZUVkaXRvciB9ID0gdGhpcztcblx0XHRhcHBlYXJhbmNlRWRpdG9yLmFwcGVhcmFuY2UgPSBuZXdBcHBlYXJhbmNlO1xuXHRcdGFwcGVhcmFuY2VFZGl0b3IuY2FsbG91dCA9IHRoaXMuY2FsbG91dDtcblx0fVxuXG5cdHByb3RlY3RlZCBvblNldEFwcGVhcmFuY2UoYXBwZWFyYW5jZTogQXBwZWFyYW5jZSkge1xuXHRcdHRoaXMuY2hhbmdlQXBwZWFyYW5jZUVkaXRvcihhcHBlYXJhbmNlKTtcblx0XHRjb25zdCBuZXdTZXR0aW5ncyA9IHRoaXMuYXBwZWFyYW5jZUVkaXRvci50b1NldHRpbmdzKCk7XG5cdFx0Y29uc3QgeyBjYWxsb3V0IH0gPSB0aGlzO1xuXHRcdGNvbnN0IHsgY2FsbG91dFJlc29sdmVyIH0gPSB0aGlzLnBsdWdpbjtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgcGx1Z2luIHNldHRpbmdzLlxuXHRcdHRoaXMucGx1Z2luLnNldENhbGxvdXRTZXR0aW5ncyhjYWxsb3V0LmlkLCBuZXdTZXR0aW5ncyk7XG5cblx0XHQvLyBVcGRhdGUgdGhlIGNhbGxvdXQgcHJvcGVydGllcy5cblx0XHRjb25zdCB7IGNvbG9yLCBpY29uIH0gPSBjYWxsb3V0UmVzb2x2ZXIuZ2V0Q2FsbG91dFByb3BlcnRpZXMoY2FsbG91dC5pZCk7XG5cdFx0Y2FsbG91dC5jb2xvciA9IGNvbG9yO1xuXHRcdGNhbGxvdXQuaWNvbiA9IGljb247XG5cblx0XHQvLyBSZXJlbmRlciB0byBzaG93IHdoYXQgY2hhbmdlZC5cblx0XHR0aGlzLnByZXZpZXdTZWN0aW9uLmNoYW5nZVNldHRpbmdzKG5ld1NldHRpbmdzKTtcblxuXHRcdHRoaXMuYXBwZWFyYW5jZUVkaXRvci5jYWxsb3V0ID0gY2FsbG91dDtcblx0XHR0aGlzLmFwcGVhcmFuY2VFZGl0b3JFbC5lbXB0eSgpO1xuXHRcdHRoaXMuYXBwZWFyYW5jZUVkaXRvci5yZW5kZXIoKTtcblxuXHRcdHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcblx0XHR0aGlzLmRpc3BsYXkoKTtcblx0fVxuXG5cdC8qKiBAb3ZlcnJpZGUgKi9cblx0cHVibGljIGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCwgcHJldmlld1NlY3Rpb24sIGFwcGVhcmFuY2VFZGl0b3JDb250YWluZXJFbCwgbWlzY0VkaXRvckNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcblx0XHRwcmV2aWV3U2VjdGlvbi5hdHRhY2goY29udGFpbmVyRWwpO1xuXHRcdHJlbmRlckluZm8odGhpcy5wbHVnaW4uYXBwLCB0aGlzLmNhbGxvdXQsIGNvbnRhaW5lckVsKTtcblx0XHRjb250YWluZXJFbC5hcHBlbmRDaGlsZChtaXNjRWRpdG9yQ29udGFpbmVyRWwpO1xuXHRcdGNvbnRhaW5lckVsLmFwcGVuZENoaWxkKGFwcGVhcmFuY2VFZGl0b3JDb250YWluZXJFbCk7XG5cdH1cblxuXHQvKiogQG92ZXJyaWRlICovXG5cdHB1YmxpYyBkaXNwbGF5Q29udHJvbHMoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjYWxsb3V0LCBjb250cm9sc0VsIH0gPSB0aGlzO1xuXG5cdFx0Ly8gRGVsZXRlIGJ1dHRvbi5cblx0XHRpZiAoIXRoaXMudmlld09ubHkgJiYgY2FsbG91dC5zb3VyY2VzLmxlbmd0aCA9PT0gMSAmJiBjYWxsb3V0LnNvdXJjZXNbMF0udHlwZSA9PT0gJ2N1c3RvbScpIHtcblx0XHRcdG5ldyBCdXR0b25Db21wb25lbnQoY29udHJvbHNFbClcblx0XHRcdFx0LnNldEljb24oJ2x1Y2lkZS10cmFzaCcpXG5cdFx0XHRcdC5zZXRUb29sdGlwKCdEZWxldGUgQ2FsbG91dCcpXG5cdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5yZW1vdmVDdXN0b21DYWxsb3V0KGNhbGxvdXQuaWQpO1xuXHRcdFx0XHRcdHRoaXMubmF2LmNsb3NlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKCh7IGJ1dHRvbkVsIH0pID0+IGJ1dHRvbkVsLmNsYXNzTGlzdC5hZGQoJ2NsaWNrYWJsZS1pY29uJywgJ21vZC13YXJuaW5nJykpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBwcmV2aWV3IHRoYXQgaXMgZGlzcGxheWVkIGluc2lkZSB0aGUgY2FsbG91dC5cblx0ICpcblx0ICogQHBhcmFtIG1hcmtkb3duIFRoZSBtYXJrZG93biB0byByZW5kZXIuXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgY2hhbmdlUHJldmlldyhtYXJrZG93bjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJldmlld1NlY3Rpb24uY2hhbmdlQ29udGVudChtYXJrZG93bik7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgc3R5bGVzIG9mIHRoZSBwcmV2aWV3IHRoYXQgaXMgZGlzcGxheWVkIGluc2lkZSB0aGUgY2FsbG91dC5cblx0ICpcblx0ICogQHBhcmFtIG1hcmtkb3duIFRoZSBtYXJrZG93biB0byByZW5kZXIuXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgY2hhbmdlU2V0dGluZ3Moc2V0dGluZ3M6IENhbGxvdXRTZXR0aW5ncyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMuY2hhbmdlQXBwZWFyYW5jZUVkaXRvcihkZXRlcm1pbmVBcHBlYXJhbmNlVHlwZShzZXR0aW5ncykpO1xuXHRcdHRoaXMuYXBwZWFyYW5jZUVkaXRvckVsLmVtcHR5KCk7XG5cdFx0dGhpcy5hcHBlYXJhbmNlRWRpdG9yLnJlbmRlcigpO1xuXHRcdHRoaXMubWlzY0VkaXRvci5yZW5kZXIoKTtcblxuXHRcdGF3YWl0IHRoaXMucHJldmlld1NlY3Rpb24uY2hhbmdlU2V0dGluZ3Moc2V0dGluZ3MpO1xuXHR9XG59XG5cbmNvbnN0IEFQUEVBUkFOQ0VfRURJVE9SUzogUmVjb3JkPEFwcGVhcmFuY2VbJ3R5cGUnXSwgeyBuZXcgKCk6IEFwcGVhcmFuY2VFZGl0b3I8QXBwZWFyYW5jZT4gfT4gPSB7XG5cdGNvbXBsZXg6IENvbXBsZXhBcHBlYXJhbmNlRWRpdG9yLFxuXHR1bmlmaWVkOiBVbmlmaWVkQXBwZWFyYW5jZUVkaXRvcixcblx0J3Blci1zY2hlbWUnOiBQZXJTY2hlbWVBcHBlYXJhbmNlRWRpdG9yLFxufTtcblxuZGVjbGFyZSBjb25zdCBTVFlMRVM6IGBcblx0Ly8gU2VjdGlvbnMgb2YgdGhlIHBhbmUuXG5cdC5jYWxsb3V0bWFuYWdlci1lZGl0LWNhbGxvdXQtc2VjdGlvbiB7XG5cdFx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcblx0XHRwYWRkaW5nLXRvcDogdmFyKC0tc2l6ZS00LTMpO1xuXHRcdHBhZGRpbmctYm90dG9tOiB2YXIoLS1zaXplLTQtNik7XG5cdH1cblxuXHQuY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LXNlY3Rpb246ZW1wdHkge1xuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdH1cblxuXHQuY2FsbG91dG1hbmFnZXItZWRpdC1jYWxsb3V0LXNlY3Rpb24tLW5vYm9yZGVyIHtcblx0XHRib3JkZXItdG9wOiBub25lO1xuXHR9XG5cblx0LmNhbGxvdXRtYW5hZ2VyLWVkaXQtY2FsbG91dC1zZWN0aW9uIC5zZXR0aW5nLWl0ZW0ge1xuXHRcdC5zZXR0aW5nLWl0ZW0tZGVzY3JpcHRpb24gcCB7XG5cdFx0XHRtYXJnaW46IDA7XG5cdFx0fVxuXHR9XG5cblx0LmNhbGxvdXRtYW5hZ2VyLWVkaXQtY2FsbG91dC1zZWN0aW9uIGgyIHtcblx0XHRtYXJnaW4tYm90dG9tOiAwLjNlbTtcblx0XHQmICsgcCB7XG5cdFx0XHRtYXJnaW4tdG9wOiAwO1xuXHRcdH1cblx0fVxuXG5cdC5jYWxsb3V0bWFuYWdlci1lZGl0LWNhbGxvdXQtYXBwZWFyYW5jZSB7XG5cdFx0LnNldHRpbmctaXRlbSB7XG5cdFx0XHRib3JkZXItdG9wOiBub25lO1xuXHRcdFx0cGFkZGluZy10b3A6IDAuMzc1ZW07XG5cdFx0fVxuXG5cdFx0LnNldHRpbmctaXRlbTpoYXMoKyAuc2V0dGluZy1pdGVtKSB7XG5cdFx0XHRwYWRkaW5nLWJvdHRvbTogMC4zNzVlbTtcblxuXHRcdFx0Ym9keS5pcy1waG9uZSAmIHtcblx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMC43ZW07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LnNldHRpbmctaXRlbSArIC5zZXR0aW5nLWl0ZW0ge1xuXHRcdH1cblx0fVxuXG5cdC8vIFRoZSBwcmV2aWV3IHNob3dpbmcgdGhlIGNvbXBsZXggY2FsbG91dCBzZXR0aW5nIEpTT04uXG5cdC5jYWxsb3V0bWFuYWdlci1lZGl0LWNhbGxvdXQtYXBwZWFyYW5jZS1qc29uIHByZSB7XG5cdFx0Ym9yZGVyOiByZ2JhKHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKSkgMXB4IHNvbGlkO1xuXHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLWNhbGxvdXQtcmFkaXVzKTtcblx0XHRwYWRkaW5nOiB2YXIoLS1zaXplLTQtMik7XG5cdFx0YmFja2dyb3VuZDogdmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5LWFsdCk7XG5cdFx0b3ZlcmZsb3cteDogYXV0bztcblxuXHRcdG1hcmdpbjogMDtcblx0fVxuXG5cdC8vIFRoZSByZXNldCBidXR0b24uXG5cdC5jYWxsb3V0bWFuYWdlci1lZGl0LWNhbGxvdXQtYXBwZWFyYW5jZS1yZXNldCB7XG5cdFx0d2lkdGg6IDEwMCU7XG5cdH1cbmA7XG4iLCJpbXBvcnQgeyBCdXR0b25Db21wb25lbnQsIFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCBDYWxsb3V0TWFuYWdlclBsdWdpbiBmcm9tICcmcGx1Z2luJztcblxuaW1wb3J0IHsgVUlQYW5lIH0gZnJvbSAnJnVpL3BhbmUnO1xuXG5pbXBvcnQgeyBnZXRTZWN0aW9ucyB9IGZyb20gJy4uL2NoYW5nZWxvZyc7XG5cbmltcG9ydCB7IENoYW5nZWxvZ1BhbmUgfSBmcm9tICcuL2NoYW5nZWxvZy1wYW5lJztcbmltcG9ydCB7IE1hbmFnZUNhbGxvdXRzUGFuZSB9IGZyb20gJy4vbWFuYWdlLWNhbGxvdXRzLXBhbmUnO1xuXG5leHBvcnQgY2xhc3MgTWFuYWdlUGx1Z2luUGFuZSBleHRlbmRzIFVJUGFuZSB7XG5cdHB1YmxpYyByZWFkb25seSB0aXRsZSA9ICdDYWxsb3V0IE1hbmFnZXIgU2V0dGluZ3MnO1xuXHRwcml2YXRlIHBsdWdpbjogQ2FsbG91dE1hbmFnZXJQbHVnaW47XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHBsdWdpbjogQ2FsbG91dE1hbmFnZXJQbHVnaW4pIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXHR9XG5cblx0LyoqIEBvdmVycmlkZSAqL1xuXHRwdWJsaWMgZGlzcGxheSgpOiB2b2lkIHtcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsLCBwbHVnaW4gfSA9IHRoaXM7XG5cblx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdC8vIE5hdmlnYXRpb24uXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdNYW5hZ2UgQ2FsbG91dHMnKVxuXHRcdFx0LnNldERlc2MoJ0NyZWF0ZSBvciBlZGl0IE1hcmtkb3duIGNhbGxvdXRzLicpXG5cdFx0XHQuYWRkQnV0dG9uKChidG4pID0+IHtcblx0XHRcdFx0YnRuLnNldEJ1dHRvblRleHQoJ01hbmFnZSBDYWxsb3V0cycpO1xuXHRcdFx0XHRidG4ub25DbGljaygoKSA9PiB0aGlzLm5hdi5vcGVuKG5ldyBNYW5hZ2VDYWxsb3V0c1BhbmUocGx1Z2luKSkpO1xuXHRcdFx0fSk7XG5cblx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdC8vIFNlY3Rpb246IENhbGxvdXQgRGV0ZWN0aW9uXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbCkuc2V0SGVhZGluZygpLnNldE5hbWUoJ0NhbGxvdXQgRGV0ZWN0aW9uJyk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdPYnNpZGlhbicpXG5cdFx0XHQuc2V0RGVzYyhcblx0XHRcdFx0KCgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBkZXNjID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRhaW5lciA9IGRlc2MuY3JlYXRlRGl2KCk7XG5cdFx0XHRcdFx0Y29uc3QgbWV0aG9kID0gcGx1Z2luLmNzc1dhdGNoZXIuZGVzY3JpYmVPYnNpZGlhbkZldGNoTWV0aG9kKCk7XG5cblx0XHRcdFx0XHRjb250YWluZXIuY3JlYXRlRGl2KHtcblx0XHRcdFx0XHRcdHRleHQ6IGBGaW5kIGJ1aWx0LWluIE9ic2lkaWFuIGNhbGxvdXRzJHttZXRob2QgPT09ICcnID8gJycgOiAnICd9JHttZXRob2R9LmAsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRyZXR1cm4gZGVzYztcblx0XHRcdFx0fSkoKSxcblx0XHRcdClcblx0XHRcdC5hZGRUb2dnbGUoKHNldHRpbmcpID0+IHtcblx0XHRcdFx0c2V0dGluZy5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MuY2FsbG91dERldGVjdGlvbi5vYnNpZGlhbikub25DaGFuZ2UoKHYpID0+IHtcblx0XHRcdFx0XHRwbHVnaW4uc2V0dGluZ3MuY2FsbG91dERldGVjdGlvbi5vYnNpZGlhbiA9IHY7XG5cdFx0XHRcdFx0cGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdHBsdWdpbi5yZWZyZXNoQ2FsbG91dFNvdXJjZXMoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1RoZW1lJylcblx0XHRcdC5zZXREZXNjKCdGaW5kIHRoZW1lLXByb3ZpZGVkIGNhbGxvdXRzLicpXG5cdFx0XHQuYWRkVG9nZ2xlKChzZXR0aW5nKSA9PiB7XG5cdFx0XHRcdHNldHRpbmcuc2V0VmFsdWUocGx1Z2luLnNldHRpbmdzLmNhbGxvdXREZXRlY3Rpb24udGhlbWUpLm9uQ2hhbmdlKCh2KSA9PiB7XG5cdFx0XHRcdFx0cGx1Z2luLnNldHRpbmdzLmNhbGxvdXREZXRlY3Rpb24udGhlbWUgPSB2O1xuXHRcdFx0XHRcdHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRwbHVnaW4ucmVmcmVzaENhbGxvdXRTb3VyY2VzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdTbmlwcGV0Jylcblx0XHRcdC5zZXREZXNjKCdGaW5kIGNhbGxvdXRzIGluIGN1c3RvbSBDU1Mgc25pcHBldHMuJylcblx0XHRcdC5hZGRUb2dnbGUoKHNldHRpbmcpID0+IHtcblx0XHRcdFx0c2V0dGluZy5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MuY2FsbG91dERldGVjdGlvbi5zbmlwcGV0KS5vbkNoYW5nZSgodikgPT4ge1xuXHRcdFx0XHRcdHBsdWdpbi5zZXR0aW5ncy5jYWxsb3V0RGV0ZWN0aW9uLnNuaXBwZXQgPSB2O1xuXHRcdFx0XHRcdHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRwbHVnaW4ucmVmcmVzaENhbGxvdXRTb3VyY2VzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdC8vIFNlY3Rpb246IENoYW5nZWxvZ1xuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0SGVhZGluZygpXG5cdFx0XHQuc2V0TmFtZShcIldoYXQncyBOZXdcIilcblx0XHRcdC5zZXREZXNjKGBWZXJzaW9uICR7dGhpcy5wbHVnaW4ubWFuaWZlc3QudmVyc2lvbn1gKVxuXHRcdFx0LmFkZEV4dHJhQnV0dG9uKChidG4pID0+IHtcblx0XHRcdFx0YnRuLnNldEljb24oJ2x1Y2lkZS1tb3JlLWhvcml6b250YWwnKVxuXHRcdFx0XHRcdC5zZXRUb29sdGlwKCdNb3JlIENoYW5nZWxvZ3MnKVxuXHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHRoaXMubmF2Lm9wZW4obmV3IENoYW5nZWxvZ1BhbmUocGx1Z2luKSkpO1xuXHRcdFx0fSk7XG5cblx0XHRjb25zdCBsYXRlc3RDaGFuZ2VzID0gZ2V0U2VjdGlvbnModGhpcy5wbHVnaW4uYXBwLCB0aGlzLnJvb3QpLmdldCh0aGlzLnBsdWdpbi5tYW5pZmVzdC52ZXJzaW9uKTtcblx0XHRpZiAobGF0ZXN0Q2hhbmdlcyAhPSBudWxsKSB7XG5cdFx0XHRjb25zdCBkZXNjID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXHRcdFx0ZGVzYy5hcHBlbmRDaGlsZChsYXRlc3RDaGFuZ2VzLmNvbnRlbnRzRWwpO1xuXG5cdFx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdFx0LnNldERlc2MoZGVzYylcblx0XHRcdFx0LnRoZW4oKHNldHRpbmcpID0+IHNldHRpbmcuY29udHJvbEVsLnJlbW92ZSgpKVxuXHRcdFx0XHQudGhlbigoc2V0dGluZykgPT4gc2V0dGluZy5zZXR0aW5nRWwuY2xhc3NMaXN0LmFkZCgnY2FsbG91dG1hbmFnZXItbGF0ZXN0LWNoYW5nZXMnKSk7XG5cdFx0fVxuXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQvLyBTZWN0aW9uOiBFeHBvcnRcblx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5zZXRIZWFkaW5nKCkuc2V0TmFtZSgnRXhwb3J0Jyk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdDYWxsb3V0IFN0eWxlcycpXG5cdFx0XHQuc2V0RGVzYygnRXhwb3J0IHlvdXIgY3VzdG9tIGNhbGxvdXRzIGFuZCBjaGFuZ2VzIGFzIENTUy4nKVxuXHRcdFx0LmFkZEJ1dHRvbigoYnRuKSA9PiB7XG5cdFx0XHRcdGJ0bi5zZXRCdXR0b25UZXh0KCdDb3B5Jyk7XG5cdFx0XHRcdGJ0bi5vbkNsaWNrKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRidG4uc2V0RGlzYWJsZWQodHJ1ZSk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoJy8qIEV4cG9ydGVkIFN0eWxlcyBmcm9tIE9ic2lkaWFuIENhbGxvdXQgTWFuYWdlciAqL1xcbicgKyB0aGlzLnBsdWdpbi5jc3NBcHBsaWVyLmNzcylcblx0XHRcdFx0XHRcdGJ0bi5zZXRCdXR0b25UZXh0KFwiQ29waWVkIVwiKTtcblx0XHRcdFx0XHR9IGNhdGNoIChleCkge1xuXHRcdFx0XHRcdFx0YnRuLnNldEJ1dHRvblRleHQoXCJFcnJvclwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdC8vIFNlY3Rpb246IFJlc2V0XG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbCkuc2V0SGVhZGluZygpLnNldE5hbWUoJ1Jlc2V0Jyk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdSZXNldCBDYWxsb3V0IFNldHRpbmdzJylcblx0XHRcdC5zZXREZXNjKCdSZXNldCBhbGwgdGhlIGNoYW5nZXMgeW91IG1hZGUgdG8gY2FsbG91dHMuJylcblx0XHRcdC5hZGRCdXR0b24oXG5cdFx0XHRcdHdpdGhDb25maXJtKChidG4pID0+IHtcblx0XHRcdFx0XHRidG4uc2V0QnV0dG9uVGV4dCgnUmVzZXQnKS5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmNhbGxvdXRzLnNldHRpbmdzID0ge307XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVnZW5lcmF0ZSB0aGUgY2FsbG91dCBzdHlsZXMuXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5hcHBseVN0eWxlcygpO1xuXHRcdFx0XHRcdFx0YnRuLnNldEJ1dHRvblRleHQoJ1Jlc2V0Jykuc2V0RGlzYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pLFxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Jlc2V0IEN1c3RvbSBDYWxsb3V0cycpXG5cdFx0XHQuc2V0RGVzYygnUmVtb3ZlcyBhbGwgdGhlIGN1c3RvbSBjYWxsb3V0cyB5b3UgY3JlYXRlZC4nKVxuXHRcdFx0LmFkZEJ1dHRvbihcblx0XHRcdFx0d2l0aENvbmZpcm0oKGJ0bikgPT4ge1xuXHRcdFx0XHRcdGJ0bi5zZXRCdXR0b25UZXh0KCdSZXNldCcpLm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBzdHlsaW5ncyBmb3IgdGhlIGN1c3RvbSBjYWxsb3V0cy5cblx0XHRcdFx0XHRcdGNvbnN0IHsgc2V0dGluZ3MgfSA9IHRoaXMucGx1Z2luO1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjdXN0b20gb2Ygc2V0dGluZ3MuY2FsbG91dHMuY3VzdG9tKSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBzZXR0aW5ncy5jYWxsb3V0cy5zZXR0aW5nc1tjdXN0b21dO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgdGhlIGN1c3RvbSBjYWxsb3V0cy5cblx0XHRcdFx0XHRcdHNldHRpbmdzLmNhbGxvdXRzLmN1c3RvbSA9IFtdO1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cblx0XHRcdFx0XHRcdC8vIFJlZ2VuZXJhdGUgdGhlIGNhbGxvdXQgc3R5bGVzLlxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uY2FsbG91dHMuY3VzdG9tLmNsZWFyKCk7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5hcHBseVN0eWxlcygpO1xuXG5cdFx0XHRcdFx0XHQvLyBSZWdlbmVyYXRlIHRoZSBjYWNoZS5cblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnJlZnJlc2hDYWxsb3V0U291cmNlcygpO1xuXHRcdFx0XHRcdFx0YnRuLnNldEJ1dHRvblRleHQoJ1Jlc2V0Jykuc2V0RGlzYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pLFxuXHRcdFx0KTtcblx0fVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gd2l0aENvbmZpcm0oY2FsbGJhY2s6IChidG46IEJ1dHRvbkNvbXBvbmVudCkgPT4gYW55KTogKGJ0bjogQnV0dG9uQ29tcG9uZW50KSA9PiBhbnkge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRsZXQgb25DbGlja0hhbmRsZXI6IHVuZGVmaW5lZCB8ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgPSB1bmRlZmluZWQ7XG5cdGxldCByZXNldEJ1dHRvbkNsaWNrZWQgPSBmYWxzZTtcblxuXHRyZXR1cm4gKGJ0bikgPT4ge1xuXHRcdGJ0bi5zZXRXYXJuaW5nKCkub25DbGljaygoKSA9PiB7XG5cdFx0XHRpZiAoIXJlc2V0QnV0dG9uQ2xpY2tlZCkge1xuXHRcdFx0XHRyZXNldEJ1dHRvbkNsaWNrZWQgPSB0cnVlO1xuXHRcdFx0XHRidG4uc2V0QnV0dG9uVGV4dCgnQ29uZmlybScpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvbkNsaWNrSGFuZGxlciAhPSB1bmRlZmluZWQpIHtcblx0XHRcdFx0b25DbGlja0hhbmRsZXIoKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdFx0YnRuLm9uQ2xpY2sgPSAoaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpID0+IHtcblx0XHRcdG9uQ2xpY2tIYW5kbGVyID0gaGFuZGxlcjtcblx0XHRcdHJldHVybiBidG47XG5cdFx0fTtcblxuXHRcdC8vIENhbGwgdGhlIGNhbGxiYWNrLlxuXHRcdGNhbGxiYWNrKGJ0bik7XG5cdH07XG59XG5cbmRlY2xhcmUgY29uc3QgU1RZTEVTOiBgXG5cdC5jYWxsb3V0bWFuYWdlci1sYXRlc3QtY2hhbmdlcyB7XG5cdFx0cGFkZGluZzogdmFyKC0tc2l6ZS00LTQpO1xuXG5cdFx0LmNhbGxvdXRtYW5hZ2VyLWNoYW5nZWxvZy1zZWN0aW9uIHtcblx0XHRcdD4gOmZpcnN0LWNoaWxkIHsgbWFyZ2luLXRvcDogMDsgfVxuXHRcdFx0PiA6bGFzdC1jaGlsZCB7IG1hcmdpbi1ib3R0b206IDA7IH1cblx0XHR9XG5cblx0XHQuY2FsbG91dCB7XG5cdFx0XHRiYWNrZ3JvdW5kOiBub25lO1xuXHRcdH1cblx0fVxuYDtcbiIsImltcG9ydCB7IGdldEN1cnJlbnRDb2xvclNjaGVtZSB9IGZyb20gJ29ic2lkaWFuLWV4dHJhJztcblxuaW1wb3J0IHsgQ2FsbG91dElEIH0gZnJvbSAnJmNhbGxvdXQnO1xuXG5pbXBvcnQgeyBJc29sYXRlZENhbGxvdXRQcmV2aWV3Q29tcG9uZW50IH0gZnJvbSAnJnVpL2NvbXBvbmVudC9jYWxsb3V0LXByZXZpZXcnO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBmZXRjaGVzIHN0eWxlIGluZm9ybWF0aW9uIGZvciBjYWxsb3V0cy5cbiAqIFRoaXMga2VlcHMgYSBTaGFkb3cgRE9NIHdpdGhpbiB0aGUgcGFnZSBkb2N1bWVudCBhbmQgdXNlcyBnZXRDb21wdXRlZFN0eWxlcyB0byBnZXQgQ1NTIHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxvdXRSZXNvbHZlciB7XG5cdHByaXZhdGUgcmVhZG9ubHkgb2JzaWRpYW5BcHA6IEFwcDtcblx0cHJpdmF0ZSByZWFkb25seSBob3N0RWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cdHByaXZhdGUgcmVhZG9ubHkgY2FsbG91dFByZXZpZXc6IElzb2xhdGVkQ2FsbG91dFByZXZpZXdDb21wb25lbnQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKGFwcDogQXBwKSB7XG5cdFx0dGhpcy5vYnNpZGlhbkFwcCA9IGFwcDtcblx0XHR0aGlzLmhvc3RFbGVtZW50ID0gZG9jdW1lbnQuYm9keS5jcmVhdGVEaXYoe1xuXHRcdFx0Y2xzOiAnY2FsbG91dG1hbmFnZXItY2FsbG91dC1yZXNvbHZlcicsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmhvc3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7XG5cdFx0dGhpcy5jYWxsb3V0UHJldmlldyA9IG5ldyBJc29sYXRlZENhbGxvdXRQcmV2aWV3Q29tcG9uZW50KHRoaXMuaG9zdEVsZW1lbnQsIHtcblx0XHRcdGlkOiAnJyxcblx0XHRcdGljb246ICcnLFxuXHRcdFx0Y29sb3JTY2hlbWU6ICdkYXJrJyxcblx0XHR9KTtcblxuXHRcdHRoaXMuY2FsbG91dFByZXZpZXcucmVzZXRTdHlsZVByb3BlcnR5T3ZlcnJpZGVzKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVsb2FkcyB0aGUgc3R5bGVzIG9mIHRoZSBjYWxsb3V0IHJlc29sdmVyLlxuXHQgKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBnZXQgdXAtdG8tZGF0ZSBzdHlsZXMgd2hlbiB0aGUgYXBwbGljYXRpb24gQ1NTIGNoYW5nZXMuXG5cdCAqXG5cdCAqIE5vdGU6IFRoaXMgd2lsbCBub3QgcmVsb2FkIHRoZSBPYnNpZGlhbiBhcHAuY3NzIHN0eWxlc2hlZXQuXG5cdCAqIEBwYXJhbSBzdHlsZXMgVGhlIG5ldyBzdHlsZSBlbGVtZW50cyB0byB1c2UuXG5cdCAqL1xuXHRwdWJsaWMgcmVsb2FkU3R5bGVzKCk6IHZvaWQge1xuXHRcdHRoaXMuY2FsbG91dFByZXZpZXcuc2V0Q29sb3JTY2hlbWUoZ2V0Q3VycmVudENvbG9yU2NoZW1lKHRoaXMub2JzaWRpYW5BcHApKTtcblx0XHR0aGlzLmNhbGxvdXRQcmV2aWV3LnVwZGF0ZVN0eWxlcygpO1xuXHRcdHRoaXMuY2FsbG91dFByZXZpZXcucmVtb3ZlU3R5bGVzKChlbCkgPT4gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWNhbGxvdXQtbWFuYWdlcicpID09PSAnc3R5bGUtb3ZlcnJpZGVzJyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgaG9zdCBlbGVtZW50LlxuXHQgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHVubG9hZGluZy5cblx0ICovXG5cdHB1YmxpYyB1bmxvYWQoKSB7XG5cdFx0dGhpcy5ob3N0RWxlbWVudC5yZW1vdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBjb21wdXRlZCBzdHlsZXMgZm9yIGEgZ2l2ZW4gdHlwZSBvZiBjYWxsb3V0LlxuXHQgKiBUaGlzIHVzZXMgdGhlIGN1cnJlbnQgT2JzaWRpYW4gc3R5bGVzLCB0aGVtZXMsIGFuZCBzbmlwcGV0cy5cblx0ICpcblx0ICogQHBhcmFtIGlkIFRoZSBjYWxsb3V0IElELlxuXHQgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4uIFRoZSBzdHlsZXMgbWF5IG9ubHkgYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGlzLlxuXHQgKiBAcmV0dXJucyBXaGF0ZXZlciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJuZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2FsbG91dFN0eWxlczxUPihpZDogQ2FsbG91dElELCBjYWxsYmFjazogKHN0eWxlczogQ1NTU3R5bGVEZWNsYXJhdGlvbikgPT4gVCk6IFQge1xuXHRcdGNvbnN0IHsgY2FsbG91dEVsIH0gPSB0aGlzLmNhbGxvdXRQcmV2aWV3O1xuXHRcdGNhbGxvdXRFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2FsbG91dCcsIGlkKTtcblxuXHRcdC8vIFJ1biB0aGUgY2FsbGJhY2suXG5cdFx0Ly8gICBXZSBuZWVkIHRvIHVzZSB0aGUgY2FsbGJhY2sgdG8gY3JlYXRlIHRoZSBmdWxsIHNldCBvZiBkZXNpcmVkIHJldHVybiBwcm9wZXJ0aWVzIGJlY2F1c2Vcblx0XHQvLyAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgd2lsbCB1cGRhdGUgaXRzZWxmIGF1dG9tYXRpY2FsbHkuIFRoZSBtb21lbnQgd2Vcblx0XHQvLyAgIGNoYW5nZSB0aGUgaG9zdCBlbGVtZW50LCBhbGwgdGhlIHN0eWxlcyB3ZSB3YW50IGZyb20gaXQgd2lsbCBiZSByZW1vdmVkLlxuXHRcdHJldHVybiBjYWxsYmFjayh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjYWxsb3V0RWwpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpY29uIGFuZCBjb2xvciBmb3IgYSBnaXZlbiB0eXBlIG9mIGNhbGxvdXQuXG5cdCAqIFRoaXMgdXNlcyB0aGUgY3VycmVudCBPYnNpZGlhbiBzdHlsZXMsIHRoZW1lcywgYW5kIHNuaXBwZXRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gaWQgVGhlIGNhbGxvdXQgSUQuXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsb3V0IGljb24gYW5kIGNvbG9yLlxuXHQgKi9cblx0cHVibGljIGdldENhbGxvdXRQcm9wZXJ0aWVzKGlkOiBDYWxsb3V0SUQpOiB7IGljb246IHN0cmluZzsgY29sb3I6IHN0cmluZyB9IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRDYWxsb3V0U3R5bGVzKGlkLCAoc3R5bGVzKSA9PiAoe1xuXHRcdFx0aWNvbjogc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJy0tY2FsbG91dC1pY29uJykudHJpbSgpLFxuXHRcdFx0Y29sb3I6IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCctLWNhbGxvdXQtY29sb3InKS50cmltKCksXG5cdFx0fSkpO1xuXHR9XG5cblx0cHVibGljIGdldCBjdXN0b21TdHlsZUVsKCk6IEhUTUxTdHlsZUVsZW1lbnQge1xuXHRcdHJldHVybiB0aGlzLmNhbGxvdXRQcmV2aWV3LmN1c3RvbVN0eWxlRWwgYXMgSFRNTFN0eWxlRWxlbWVudDtcblx0fVxufVxuXG5kZWNsYXJlIGNvbnN0IFNUWUxFUzogYFxuXHQuY2FsbG91dG1hbmFnZXItY2FsbG91dC1yZXNvbHZlciB7XG5cdFx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXHR9XG5gO1xuIiwiaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50LCBNYXJrZG93blZpZXcsIFRleHRDb21wb25lbnQsIGdldEljb24gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENhbGxvdXQgfSBmcm9tICcmY2FsbG91dCc7XG5pbXBvcnQgeyBnZXRDb2xvckZyb21DYWxsb3V0LCBnZXRUaXRsZUZyb21DYWxsb3V0IH0gZnJvbSAnJmNhbGxvdXQtdXRpbCc7XG5pbXBvcnQgQ2FsbG91dE1hbmFnZXJQbHVnaW4gZnJvbSAnJnBsdWdpbic7XG5cbmltcG9ydCB7IENhbGxvdXRQcmV2aWV3Q29tcG9uZW50IH0gZnJvbSAnJnVpL2NvbXBvbmVudC9jYWxsb3V0LXByZXZpZXcnO1xuaW1wb3J0IHsgVUlQYW5lIH0gZnJvbSAnJnVpL3BhbmUnO1xuXG5pbXBvcnQgeyBDYWxsb3V0U2VhcmNoLCBDYWxsb3V0U2VhcmNoUmVzdWx0LCBjYWxsb3V0U2VhcmNoIH0gZnJvbSAnLi4vY2FsbG91dC1zZWFyY2gnO1xuXG5pbXBvcnQgeyBDcmVhdGVDYWxsb3V0UGFuZSB9IGZyb20gJy4vY3JlYXRlLWNhbGxvdXQtcGFuZSc7XG5pbXBvcnQgeyBFZGl0Q2FsbG91dFBhbmUgfSBmcm9tICcuL2VkaXQtY2FsbG91dC1wYW5lJztcbmltcG9ydCB7IGNsb3NlU2V0dGluZ3MgfSBmcm9tICdvYnNpZGlhbi1leHRyYS91bnNhZmUnO1xuXG4vKipcbiAqIFRoZSB1c2VyIGludGVyZmFjZSBwYW5lIGZvciBjaGFuZ2luZyBDYWxsb3V0IE1hbmFnZXIgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYW5hZ2VDYWxsb3V0c1BhbmUgZXh0ZW5kcyBVSVBhbmUge1xuXHRwdWJsaWMgcmVhZG9ubHkgdGl0bGUgPSB7IHRpdGxlOiAnQ2FsbG91dHMnLCBzdWJ0aXRsZTogJ01hbmFnZScgfTtcblx0cHJpdmF0ZSByZWFkb25seSB2aWV3T25seTogYm9vbGVhbjtcblx0cHJpdmF0ZSBwbHVnaW46IENhbGxvdXRNYW5hZ2VyUGx1Z2luO1xuXG5cdHByaXZhdGUgc2VhcmNoUXVlcnk6IHN0cmluZztcblx0cHJpdmF0ZSBzZWFyY2hGbiE6IENhbGxvdXRTZWFyY2g8SFRNTEVsZW1lbnQ+O1xuXHRwcml2YXRlIGNhbGxvdXRzITogUmVhZG9ubHlBcnJheTxDYWxsb3V0U2VhcmNoUmVzdWx0PEhUTUxFbGVtZW50Pj47XG5cblx0cHJpdmF0ZSBzZXRTZWFyY2hFcnJvcjogdW5kZWZpbmVkIHwgKChtZXNzYWdlOiBzdHJpbmcgfCBmYWxzZSkgPT4gdm9pZCk7XG5cdHByaXZhdGUgc2VhcmNoRXJyb3JEaXY6IEhUTUxFbGVtZW50O1xuXHRwcml2YXRlIHNlYXJjaEVycm9yUXVlcnkhOiBIVE1MRWxlbWVudDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IocGx1Z2luOiBDYWxsb3V0TWFuYWdlclBsdWdpbikge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cdFx0dGhpcy52aWV3T25seSA9IGZhbHNlO1xuXHRcdHRoaXMuc2VhcmNoUXVlcnkgPSAnJztcblxuXHRcdGNvbnN0IHsgc2VhcmNoRXJyb3JEaXYsIHNlYXJjaEVycm9yUXVlcnkgfSA9IGNyZWF0ZUVtcHR5U2VhcmNoUmVzdWx0RGl2KCk7XG5cdFx0dGhpcy5zZWFyY2hFcnJvckRpdiA9IHNlYXJjaEVycm9yRGl2O1xuXHRcdHRoaXMuc2VhcmNoRXJyb3JRdWVyeSA9IHNlYXJjaEVycm9yUXVlcnk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlIHRoZSBzZWFyY2ggcXVlcnkgYW5kIHJlLXJlbmRlciB0aGUgcGFuZWwuXG5cdCAqIEBwYXJhbSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5LlxuXHQgKi9cblx0cHVibGljIHNlYXJjaChxdWVyeTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5kb1NlYXJjaChxdWVyeSk7XG5cdFx0dGhpcy5kaXNwbGF5KCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgZG9TZWFyY2gocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLmNhbGxvdXRzID0gdGhpcy5zZWFyY2hGbihxdWVyeSk7XG5cdFx0XHR0aGlzLnNldFNlYXJjaEVycm9yPy4oZmFsc2UpO1xuXHRcdH0gY2F0Y2ggKGV4KSB7XG5cdFx0XHR0aGlzLnNldFNlYXJjaEVycm9yPy4oKGV4IGFzIEVycm9yKS5tZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVmcmVzaCB0aGUgY2FsbG91dCBwcmV2aWV3cy5cblx0ICogVGhpcyByZWdlbmVyYXRlcyB0aGUgcHJldmlld3MgYW5kIHRoZWlyIG1ldGFkYXRhIGZyb20gdGhlIGxpc3Qgb2YgY2FsbG91dHMga25vd24gdG8gdGhlIHBsdWdpbi5cblx0ICovXG5cdHByb3RlY3RlZCBpbnZhbGlkYXRlKCk6IHZvaWQge1xuXHRcdGNvbnN0IHsgcGx1Z2luLCB2aWV3T25seSB9ID0gdGhpcztcblxuXHRcdHRoaXMuc2VhcmNoRm4gPSBjYWxsb3V0U2VhcmNoKHBsdWdpbi5jYWxsb3V0cy52YWx1ZXMoKSwge1xuXHRcdFx0cHJldmlldzogY3JlYXRlUHJldmlld0ZhY3Rvcnkodmlld09ubHkpLFxuXHRcdH0pO1xuXG5cdFx0Ly8gUmVmcmVzaCB0aGUgY2FsbG91dCBsaXN0LlxuXHRcdHRoaXMuZG9TZWFyY2godGhpcy5zZWFyY2hRdWVyeSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgb25DYWxsb3V0QnV0dG9uQ2xpY2soZXZ0OiBNb3VzZUV2ZW50KSB7XG5cdFx0bGV0IGlkID0gbnVsbDtcblx0XHRsZXQgYWN0aW9uID0gbnVsbDtcblx0XHRmb3IgKGxldCB0YXJnZXQgPSBldnQudGFyZ2V0Tm9kZTsgdGFyZ2V0ICE9IG51bGwgJiYgKGlkID09IG51bGwgfHwgYWN0aW9uID09IG51bGwpOyB0YXJnZXQgPSB0YXJnZXQ/LnBhcmVudEVsZW1lbnQpIHtcblx0XHRcdGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSBjb250aW51ZTtcblxuXHRcdFx0Ly8gRmluZCB0aGUgY2FsbG91dCBJRC5cblx0XHRcdGlmIChpZCA9PSBudWxsKSB7XG5cdFx0XHRcdGlkID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jYWxsb3V0LW1hbmFnZXItY2FsbG91dCcpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGaW5kIHRoZSBidXR0b24gYWN0aW9uLlxuXHRcdFx0aWYgKGFjdGlvbiA9PSBudWxsKSB7XG5cdFx0XHRcdGFjdGlvbiA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2FsbG91dC1tYW5hZ2VyLWFjdGlvbicpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIERvIG5vdGhpbmcgaWYgbmVpdGhlciB0aGUgY2FsbG91dCBub3IgYWN0aW9uIHdhcyBmb3VuZC5cblx0XHRpZiAoaWQgPT0gbnVsbCB8fCBhY3Rpb24gPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFZpZXcvZWRpdCB0aGUgc2VsZWN0ZWQgY2FsbG91dC5cblx0XHRpZiAoYWN0aW9uID09PSAnZWRpdCcpIHtcblx0XHRcdHRoaXMubmF2Lm9wZW4obmV3IEVkaXRDYWxsb3V0UGFuZSh0aGlzLnBsdWdpbiwgaWQsIHRoaXMudmlld09ubHkpKTtcblx0XHR9XG5cblx0XHQvLyBJbnNlcnQgdGhlIHNlbGVjdGVkIGNhbGxvdXQuXG5cdFx0ZWxzZSBpZiAoYWN0aW9uID09PSAnaW5zZXJ0Jykge1xuXHRcdFx0Y29uc3QgdmlldyA9IHRoaXMucGx1Z2luLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhlIHVzZXIgaXMgZWRpdGluZyBhIE1hcmtkb3duIGZpbGUuXG5cdFx0XHRpZiAodmlldykge1xuXHRcdFx0XHRjb25zdCBjdXJzb3IgPSB2aWV3LmVkaXRvci5nZXRDdXJzb3IoKTtcblx0XHRcdFx0dmlldy5lZGl0b3IucmVwbGFjZVJhbmdlKFxuXHRcdFx0XHRcdGA+IFshJHtpZH1dXFxuPiBDb250ZW50c2AsXG5cdFx0XHRcdFx0Y3Vyc29yXG5cdFx0XHRcdClcblx0XHRcdFx0dmlldy5lZGl0b3Iuc2V0Q3Vyc29yKGN1cnNvci5saW5lICsgMSwgMTApXG5cdFx0XHRcdGNsb3NlU2V0dGluZ3ModGhpcy5wbHVnaW4uYXBwKVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKiBAb3ZlcnJpZGUgKi9cblx0cHVibGljIGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Ly8gQ3JlYXRlIGEgY29udGVudCBlbGVtZW50IHRvIHJlbmRlciBpbnRvLlxuXHRcdGNvbnN0IGNvbnRlbnRFbCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5jcmVhdGVEaXYoKTtcblx0XHRjb250ZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2FsbG91dEJ1dHRvbkNsaWNrLmJpbmQodGhpcykpO1xuXG5cdFx0Ly8gUmVuZGVyIHRoZSBwcmV2aWV3cy5cblx0XHRjb25zdCB7IGNhbGxvdXRzIH0gPSB0aGlzO1xuXHRcdGZvciAoY29uc3QgY2FsbG91dCBvZiBjYWxsb3V0cykge1xuXHRcdFx0Y29udGVudEVsLmFwcGVuZENoaWxkKGNhbGxvdXQucHJldmlldyk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgbm8gcHJldmlld3MsIHNob3cgaGVscCBpbnN0ZWFkLlxuXHRcdGlmIChjYWxsb3V0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnRlbnRFbC5hcHBlbmRDaGlsZCh0aGlzLnNlYXJjaEVycm9yRGl2KTtcblx0XHR9XG5cblx0XHQvLyBDbGVhciB0aGUgY29udGFpbmVyLlxuXHRcdGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcblx0XHRjb250YWluZXJFbC5hcHBlbmRDaGlsZChjb250ZW50RWwpO1xuXHR9XG5cblx0LyoqIEBvdmVycmlkZSAqL1xuXHRwdWJsaWMgZGlzcGxheUNvbnRyb2xzKCk6IHZvaWQge1xuXHRcdGNvbnN0IHsgY29udHJvbHNFbCB9ID0gdGhpcztcblxuXHRcdGNvbnN0IGZpbHRlciA9IG5ldyBUZXh0Q29tcG9uZW50KGNvbnRyb2xzRWwpXG5cdFx0XHQuc2V0VmFsdWUodGhpcy5zZWFyY2hRdWVyeSlcblx0XHRcdC5zZXRQbGFjZWhvbGRlcignRmlsdGVyIGNhbGxvdXRzLi4uJylcblx0XHRcdC5vbkNoYW5nZSh0aGlzLnNlYXJjaC5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuc2V0U2VhcmNoRXJyb3IgPSAobWVzc2FnZSkgPT4ge1xuXHRcdFx0ZmlsdGVyLmlucHV0RWwuY2xhc3NMaXN0LnRvZ2dsZSgnbW9kLWVycm9yJywgISFtZXNzYWdlKTtcblx0XHRcdGlmIChtZXNzYWdlKSB7XG5cdFx0XHRcdGZpbHRlci5pbnB1dEVsLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIG1lc3NhZ2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZmlsdGVyLmlucHV0RWwucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGlmICghdGhpcy52aWV3T25seSkge1xuXHRcdFx0bmV3IEJ1dHRvbkNvbXBvbmVudChjb250cm9sc0VsKVxuXHRcdFx0XHQuc2V0SWNvbignbHVjaWRlLXBsdXMnKVxuXHRcdFx0XHQuc2V0VG9vbHRpcCgnTmV3IENhbGxvdXQnKVxuXHRcdFx0XHQub25DbGljaygoKSA9PiB0aGlzLm5hdi5vcGVuKG5ldyBDcmVhdGVDYWxsb3V0UGFuZSh0aGlzLnBsdWdpbikpKVxuXHRcdFx0XHQudGhlbigoeyBidXR0b25FbCB9KSA9PiBidXR0b25FbC5jbGFzc0xpc3QuYWRkKCdjbGlja2FibGUtaWNvbicpKTtcblx0XHR9XG5cdH1cblxuXHQvKiogQG92ZXJyaWRlICovXG5cdHByb3RlY3RlZCByZXN0b3JlU3RhdGUoc3RhdGU6IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLmludmFsaWRhdGUoKTtcblx0fVxuXG5cdC8qKiBAb3ZlcnJpZGUgKi9cblx0cHJvdGVjdGVkIG9uUmVhZHkoKTogdm9pZCB7XG5cdFx0dGhpcy5pbnZhbGlkYXRlKCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUHJldmlld0ZhY3Rvcnkodmlld09ubHk6IGJvb2xlYW4pOiAoY2FsbG91dDogQ2FsbG91dCkgPT4gSFRNTEVsZW1lbnQge1xuXHRjb25zdCBlZGl0QnV0dG9uQ29udGVudCA9XG5cdFx0KHZpZXdPbmx5ID8gZ2V0SWNvbignbHVjaWRlLXZpZXcnKSA6IGdldEljb24oJ2x1Y2lkZS1lZGl0JykpID8/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdFZGl0IENhbGxvdXQnKTtcblxuXHRjb25zdCBpbnNlcnRCdXR0b25Db250ZW50ID1cblx0XHQodmlld09ubHkgPyBnZXRJY29uKCdsdWNpZGUtdmlldycpIDogZ2V0SWNvbignbHVjaWRlLWZvcndhcmQnKSkgPz9cblx0XHRkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnSW5zZXJ0IENhbGxvdXQnKTtcblxuXHRyZXR1cm4gKGNhbGxvdXQpID0+IHtcblx0XHRjb25zdCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXHRcdGNvbnN0IGNhbGxvdXRDb250YWluZXJFbCA9IGZyYWcuY3JlYXRlRGl2KHtcblx0XHRcdGNsczogWydjYWxsb3V0bWFuYWdlci1wcmV2aWV3LWNvbnRhaW5lciddLFxuXHRcdFx0YXR0cjoge1xuXHRcdFx0XHRbJ2RhdGEtY2FsbG91dC1tYW5hZ2VyLWNhbGxvdXQnXTogY2FsbG91dC5pZCxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHQvLyBBZGQgdGhlIHByZXZpZXcuXG5cdFx0bmV3IENhbGxvdXRQcmV2aWV3Q29tcG9uZW50KGNhbGxvdXRDb250YWluZXJFbCwge1xuXHRcdFx0aWQ6IGNhbGxvdXQuaWQsXG5cdFx0XHRpY29uOiBjYWxsb3V0Lmljb24sXG5cdFx0XHR0aXRsZTogZ2V0VGl0bGVGcm9tQ2FsbG91dChjYWxsb3V0KSxcblx0XHRcdGNvbG9yOiBnZXRDb2xvckZyb21DYWxsb3V0KGNhbGxvdXQpID8/IHVuZGVmaW5lZCxcblx0XHR9KTtcblxuXHRcdC8vIEFkZCB0aGUgZWRpdCBidXR0b24gdG8gdGhlIGNvbnRhaW5lci5cblx0XHRjYWxsb3V0Q29udGFpbmVyRWwuY2xhc3NMaXN0LmFkZCgnY2FsbG91dG1hbmFnZXItcHJldmlldy1jb250YWluZXItd2l0aC1idXR0b24nKTtcblxuXHRcdGNvbnN0IGVkaXRCdXR0b24gPSBjYWxsb3V0Q29udGFpbmVyRWwuY3JlYXRlRWwoJ2J1dHRvbicpO1xuXHRcdGVkaXRCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWNhbGxvdXQtbWFuYWdlci1hY3Rpb24nLCAnZWRpdCcpO1xuXHRcdGVkaXRCdXR0b24uYXBwZW5kQ2hpbGQoZWRpdEJ1dHRvbkNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuXHRcdC8vIEFkZCB0aGUgaW5zZXJ0IGJ1dHRvbiB0byB0aGUgY29udGFpbmVyLlxuXHRcdGNvbnN0IGluc2VydEJ1dHRvbiA9IGNhbGxvdXRDb250YWluZXJFbC5jcmVhdGVFbCgnYnV0dG9uJyk7XG5cdFx0aW5zZXJ0QnV0dG9uLnNldEF0dHJpYnV0ZSgnZGF0YS1jYWxsb3V0LW1hbmFnZXItYWN0aW9uJywgJ2luc2VydCcpO1xuXHRcdGluc2VydEJ1dHRvbi5hcHBlbmRDaGlsZChpbnNlcnRCdXR0b25Db250ZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cblx0XHQvLyBSZXR1cm4gdGhlIHByZXZpZXcgY29udGFpbmVyLlxuXHRcdHJldHVybiBjYWxsb3V0Q29udGFpbmVyRWw7XG5cdH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpdiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNob3cgdGhlIHVzZXIgd2h5IHRoZSBzZWFyY2ggcXVlcnkgZmFpbGVkLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFbXB0eVNlYXJjaFJlc3VsdERpdigpOiB7IHNlYXJjaEVycm9yRGl2OiBIVE1MRWxlbWVudDsgc2VhcmNoRXJyb3JRdWVyeTogSFRNTEVsZW1lbnQgfSB7XG5cdGxldCBzZWFyY2hFcnJvclF1ZXJ5ITogSFRNTEVsZW1lbnQ7XG5cdGNvbnN0IHNlYXJjaEVycm9yRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdHNlYXJjaEVycm9yRGl2LmNsYXNzTmFtZSA9ICdjYWxsb3V0bWFuYWdlci1jZW50ZXJib3gnO1xuXHRjb25zdCBjb250ZW50RWwgPSBzZWFyY2hFcnJvckRpdi5jcmVhdGVEaXYoeyBjbHM6ICdjYWxsb3V0bWFuYWdlci1zZWFyY2gtZXJyb3InIH0pO1xuXG5cdC8vIFRpdGxlLlxuXHRjb250ZW50RWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnTm8gY2FsbG91dHMgZm91bmQuJyB9KTtcblxuXHQvLyBFcnJvciBtZXNzYWdlLlxuXHRjb250ZW50RWwuY3JlYXRlRWwoJ3AnLCB1bmRlZmluZWQsIChlbCkgPT4ge1xuXHRcdGVsLmNyZWF0ZVNwYW4oeyB0ZXh0OiAnWW91ciBzZWFyY2ggcXVlcnkgJyB9KTtcblx0XHRzZWFyY2hFcnJvclF1ZXJ5ID0gZWwuY3JlYXRlRWwoJ2NvZGUnLCB7IHRleHQ6ICcnIH0pO1xuXHRcdGVsLmNyZWF0ZVNwYW4oeyB0ZXh0OiAnIGRpZCBub3QgcmV0dXJuIGFueSByZXN1bHRzLicgfSk7XG5cdH0pO1xuXG5cdC8vIFN1Z2dlc3Rpb25zLlxuXHRjb250ZW50RWwuY3JlYXRlRGl2KHsgY2xzOiAnY2FsbG91dG1hbmFnZXItc2VhcmNoLWVycm9yLXN1Z2dlc3Rpb25zJyB9LCAoZWwpID0+IHtcblx0XHRlbC5jcmVhdGVEaXYoeyB0ZXh0OiAnVHJ5IHNlYXJjaGluZzonIH0pO1xuXHRcdGVsLmNyZWF0ZUVsKCd1bCcsIHVuZGVmaW5lZCwgKGVsKSA9PiB7XG5cdFx0XHRlbC5jcmVhdGVFbCgnbGknLCB7IHRleHQ6ICdCeSBuYW1lOiAnIH0sIChlbCkgPT4ge1xuXHRcdFx0XHRlbC5jcmVhdGVFbCgnY29kZScsIHsgdGV4dDogJ3dhcm5pbmcnIH0pO1xuXHRcdFx0fSk7XG5cdFx0XHRlbC5jcmVhdGVFbCgnbGknLCB7IHRleHQ6ICdCeSBpY29uOiAnIH0sIChlbCkgPT4ge1xuXHRcdFx0XHRlbC5jcmVhdGVFbCgnY29kZScsIHsgdGV4dDogJ2ljb246Y2hlY2snIH0pO1xuXHRcdFx0fSk7XG5cdFx0XHRlbC5jcmVhdGVFbCgnbGknLCB7IHRleHQ6ICdCdWlsdC1pbiBjYWxsb3V0czogJyB9LCAoZWwpID0+IHtcblx0XHRcdFx0ZWwuY3JlYXRlRWwoJ2NvZGUnLCB7IHRleHQ6ICdmcm9tOm9ic2lkaWFuJyB9KTtcblx0XHRcdH0pO1xuXHRcdFx0ZWwuY3JlYXRlRWwoJ2xpJywgeyB0ZXh0OiAnVGhlbWUgY2FsbG91dHM6ICcgfSwgKGVsKSA9PiB7XG5cdFx0XHRcdGVsLmNyZWF0ZUVsKCdjb2RlJywgeyB0ZXh0OiAnZnJvbTp0aGVtZScgfSk7XG5cdFx0XHR9KTtcblx0XHRcdGVsLmNyZWF0ZUVsKCdsaScsIHsgdGV4dDogJ1NuaXBwZXQgY2FsbG91dHM6ICcgfSwgKGVsKSA9PiB7XG5cdFx0XHRcdGVsLmNyZWF0ZUVsKCdjb2RlJywgeyB0ZXh0OiAnZnJvbTpteSBzbmlwcGV0JyB9KTtcblx0XHRcdH0pO1xuXHRcdFx0ZWwuY3JlYXRlRWwoJ2xpJywgeyB0ZXh0OiAnQ3VzdG9tIGNhbGxvdXRzOiAnIH0sIChlbCkgPT4ge1xuXHRcdFx0XHRlbC5jcmVhdGVFbCgnY29kZScsIHsgdGV4dDogJ2Zyb206Y3VzdG9tJyB9KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRyZXR1cm4geyBzZWFyY2hFcnJvckRpdiwgc2VhcmNoRXJyb3JRdWVyeSB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN0eWxlczpcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5kZWNsYXJlIGNvbnN0IFNUWUxFUzogYFxuXHQuY2FsbG91dG1hbmFnZXItc2VhcmNoLWVycm9yIHtcblx0XHR3aWR0aDogNjAlO1xuXG5cdFx0Ym9keS5pcy1waG9uZSAmIHtcblx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdH1cblxuXHRcdGNvZGUge1xuXHRcdFx0d29yZC1icmVhazogYnJlYWstYWxsO1xuXHRcdFx0Y29sb3I6IHZhcigtLXRleHQtYWNjZW50KTtcblx0XHR9XG5cdH1cblxuXHQuY2FsbG91dG1hbmFnZXItc2VhcmNoLWVycm9yLXN1Z2dlc3Rpb25zIHtcblx0XHRjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG5cdH1cblxuXHQuY2FsbG91dG1hbmFnZXItcHJldmlldy1jb250YWluZXItd2l0aC1idXR0b24ge1xuXHRcdC0tY2FsbG91dG1hbmFnZXItY2FsbG91dC1lZGl0LWJ1dHRvbnMtc2l6ZTogY2FsYyh2YXIoLS1pbnB1dC1oZWlnaHQpICsgMiAqIHZhcigtLXNpemUtNC0zKSk7XG5cdFx0Ym9keS5pcy1waG9uZSAmIHtcblx0XHRcdC0tY2FsbG91dG1hbmFnZXItY2FsbG91dC1lZGl0LWJ1dHRvbnMtc2l6ZTogdmFyKC0taW5wdXQtaGVpZ2h0KTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXIgdGhlIHByZXZpZXcgaW50byBhIGdyaWQuXG5cdFx0ZGlzcGxheTogZ3JpZDtcblx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciB2YXIoLS1jYWxsb3V0bWFuYWdlci1jYWxsb3V0LWVkaXQtYnV0dG9ucy1zaXplKSB2YXIoLS1jYWxsb3V0bWFuYWdlci1jYWxsb3V0LWVkaXQtYnV0dG9ucy1zaXplKTtcblxuXHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0Z2FwOiB2YXIoLS1zaXplLTQtMik7XG5cblx0XHQvLyBFbnN1cmUgdGhlIGJ1dHRvbiBoYXMgYSBzbWFsbCB3aWR0aCwgYnV0IGNhbiBncm93IHRhbGwuXG5cdFx0PiBidXR0b24ge1xuXHRcdFx0d2lkdGg6IHZhcigtLWNhbGxvdXRtYW5hZ2VyLWNhbGxvdXQtZWRpdC1idXR0b25zLXNpemUpO1xuXHRcdFx0aGVpZ2h0OiAxMDAlO1xuXG5cdFx0XHQvLyBGaXggcmVuZGVyaW5nIG5vdCB3b3JraW5nIG9uIG5vbi1waG9uZSBkZXZpY2VzLlxuXHRcdFx0Ym9keTpub3QoLmlzLXBob25lKSAmIHtcblx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdHBhZGRpbmc6IDAgIWltcG9ydGFudDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbmA7XG4iLCJpbXBvcnQgeyBQbHVnaW5TZXR0aW5nVGFiLCBCdXR0b25Db21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBvcGVuUGx1Z2luU2V0dGluZ3MgfSBmcm9tICdvYnNpZGlhbi1leHRyYSc7XG5pbXBvcnQgeyBjbG9zZVNldHRpbmdzIH0gZnJvbSAnb2JzaWRpYW4tZXh0cmEvdW5zYWZlJztcblxuaW1wb3J0IENhbGxvdXRNYW5hZ2VyUGx1Z2luIGZyb20gJyZwbHVnaW4nO1xuXG5pbXBvcnQgeyBVSVBhbmUgfSBmcm9tICcuL3BhbmUnO1xuaW1wb3J0IHsgVUlQYW5lTGF5ZXJzIH0gZnJvbSAnLi9wYW5lLWxheWVycyc7XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRhYiAoVUkpIHRoYXQgd2lsbCBzaG93IHVwIHVuZGVyIE9ic2lkaWFuJ3Mgc2V0dGluZ3MuXG4gKlxuICogVGhpcyBpbXBsZW1lbnRzIHN0YWNrZWQgbmF2aWdhdGlvbiwgd2hlcmUge0BsaW5rIFVJUGFuZX1zIG1heSBiZSBzdGFja2VkIG9uIHRvcCBvZiBlYWNob3RoZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSVNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cHJpdmF0ZSByZWFkb25seSBwbHVnaW46IENhbGxvdXRNYW5hZ2VyUGx1Z2luO1xuXHRwcml2YXRlIHJlYWRvbmx5IGxheWVyczogVUlQYW5lTGF5ZXJzO1xuXHRwcml2YXRlIHJlYWRvbmx5IGNyZWF0ZURlZmF1bHQ6ICgpID0+IFVJUGFuZTtcblxuXHRwcml2YXRlIGluaXRMYXllcjogVUlQYW5lIHwgbnVsbDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IocGx1Z2luOiBDYWxsb3V0TWFuYWdlclBsdWdpbiwgY3JlYXRlRGVmYXVsdDogKCkgPT4gVUlQYW5lKSB7XG5cdFx0c3VwZXIocGx1Z2luLmFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0XHR0aGlzLmNyZWF0ZURlZmF1bHQgPSBjcmVhdGVEZWZhdWx0O1xuXG5cdFx0dGhpcy5pbml0TGF5ZXIgPSBudWxsO1xuXHRcdHRoaXMubGF5ZXJzID0gbmV3IFVJUGFuZUxheWVycyhwbHVnaW4sIHtcblx0XHRcdGNsb3NlOiAoKSA9PiBjbG9zZVNldHRpbmdzKHRoaXMuYXBwKSxcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBvcGVuV2l0aFBhbmUocGFuZTogVUlQYW5lKSB7XG5cdFx0dGhpcy5pbml0TGF5ZXIgPSBwYW5lO1xuXHRcdG9wZW5QbHVnaW5TZXR0aW5ncyh0aGlzLnBsdWdpbi5hcHAsIHRoaXMucGx1Z2luKTtcblx0fVxuXG5cdC8qKiBAb3ZlcnJpZGUgKi9cblx0cHVibGljIGhpZGUoKTogdm9pZCB7XG5cdFx0dGhpcy5pbml0TGF5ZXIgPSBudWxsO1xuXHRcdHRoaXMubGF5ZXJzLmNsZWFyKCk7XG5cdFx0c3VwZXIuaGlkZSgpO1xuXHR9XG5cblx0cHVibGljIGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCwgbGF5ZXJzIH0gPSB0aGlzO1xuXG5cdFx0Ly8gQ2xlYXIgdGhlIGNvbnRhaW5lciBhbmQgY3JlYXRlIHRoZSBlbGVtZW50cy5cblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXHRcdGNvbnRhaW5lckVsLmNsYXNzTGlzdC5hZGQoJ2NhbGxvdXRtYW5hZ2VyLXNldHRpbmctdGFiJywgJ2NhbGxvdXRtYW5hZ2VyLXBhbmUnKTtcblxuXHRcdGNvbnN0IGhlYWRlckVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHsgY2xzOiAnY2FsbG91dG1hbmFnZXItc2V0dGluZy10YWItaGVhZGVyJyB9KTtcblx0XHRsYXllcnMubmF2RWwgPSBoZWFkZXJFbC5jcmVhdGVEaXYoeyBjbHM6ICdjYWxsb3V0bWFuYWdlci1zZXR0aW5nLXRhYi1uYXYnIH0pO1xuXHRcdGxheWVycy50aXRsZUVsID0gaGVhZGVyRWwuY3JlYXRlRGl2KHsgY2xzOiAnY2FsbG91dG1hbmFnZXItc2V0dGluZy10YWItdGl0bGUnIH0pO1xuXG5cdFx0Y29uc3QgY29udHJvbHNFbCA9IGhlYWRlckVsLmNyZWF0ZURpdih7IGNsczogJ2NhbGxvdXRtYW5hZ2VyLXNldHRpbmctdGFiLWNvbnRyb2xzJyB9KTtcblx0XHRsYXllcnMuY29udHJvbHNFbCA9IGNvbnRyb2xzRWwuY3JlYXRlRGl2KCk7XG5cdFx0bGF5ZXJzLnNjcm9sbEVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcblx0XHRcdGNsczogJ2NhbGxvdXRtYW5hZ2VyLXNldHRpbmctdGFiLXZpZXdwb3J0IHZlcnRpY2FsLXRhYi1jb250ZW50Jyxcblx0XHR9KTtcblx0XHRsYXllcnMuY29udGFpbmVyRWwgPSBsYXllcnMuc2Nyb2xsRWwuY3JlYXRlRGl2KHsgY2xzOiAnY2FsbG91dG1hbmFnZXItc2V0dGluZy10YWItY29udGVudCcgfSk7XG5cblx0XHQvLyBDcmVhdGUgYSBjbG9zZSBidXR0b24sIHNpbmNlIHRoZSBuYXRpdmUgb25lIGlzIGNvdmVyZWQuXG5cdFx0Y29uc3QgY2xvc2VCdG4gPSBuZXcgQnV0dG9uQ29tcG9uZW50KGNvbnRyb2xzRWwpO1xuXHRcdGNsb3NlQnRuLnNldEljb24oXCJsdWNpZGUteFwiKTtcblx0XHRjbG9zZUJ0bi5idXR0b25FbC5jbGFzc0xpc3QuYWRkKCdtb2RhbC1jbG9zZS1idXR0b24nKTtcblx0XHRjbG9zZUJ0bi5idXR0b25FbC5jbGFzc0xpc3QuYWRkKCdtb2QtcmFpc2VkJyk7XG5cdFx0Y2xvc2VCdG4uYnV0dG9uRWwuY2xhc3NMaXN0LmFkZCgnY2xpY2thYmxlLWljb24nKTtcblx0XHRjbG9zZUJ0bi5vbkNsaWNrKChldikgPT4ge1xuXHRcdFx0aWYgKCFldi5pc1RydXN0ZWQpIHJldHVybjtcblx0XHRcdGNsb3NlU2V0dGluZ3ModGhpcy5hcHApO1xuXHRcdH0pO1xuXG5cdFx0Ly8gQ2xlYXIgdGhlIGxheWVycy5cblx0XHRsYXllcnMuY2xlYXIoKTtcblxuXHRcdC8vIFJlbmRlciB0aGUgdG9wIGxheWVyIChvciB0aGUgZGVmYXVsdCkuXG5cdFx0Y29uc3QgaW5pdExheWVyID0gdGhpcy5pbml0TGF5ZXIgPz8gdGhpcy5jcmVhdGVEZWZhdWx0KCk7XG5cdFx0dGhpcy5pbml0TGF5ZXIgPSBudWxsO1xuXHRcdGxheWVycy50b3AgPSBpbml0TGF5ZXI7XG5cdH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHlsZXM6XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVjbGFyZSBjb25zdCBTVFlMRVM6IGBcblx0Ly8gVGhlIHNldHRpbmcgdGFiIGNvbnRhaW5lci5cblx0Lm1vZC1zaWRlYmFyLWxheW91dCAuY2FsbG91dG1hbmFnZXItc2V0dGluZy10YWIudmVydGljYWwtdGFiLWNvbnRlbnQge1xuXHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG5cdFx0ZGlzcGxheTogZmxleDtcblx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG5cdFx0Ly8gUHJldmVudCBzY3JvbGxpbmcgb24gdGhlIHBhcmVudCBjb250YWluZXIgc28gd2UgY2FuIGhhdmUgYSBzdGlja3kgaGVhZGVyLlxuXHRcdG92ZXJmbG93LXk6IGluaXRpYWw7XG5cblx0XHQvLyBWYXJpYWJsZXMuXG5cdFx0JiB7XG5cdFx0XHQvLyBTZXQgYSBtYXJnaW4gdGhhdCBhbGxvd3MgdGhlIGNvbnRyb2xzIHRvIGJlY29tZSBwYWRkaW5nIGlmIHRoZXJlJ3Mgbm90aGluZyBpbnNpZGUgdGhlbS5cblx0XHRcdC0tY20tc2V0dGluZy10YWItY29udHJvbHMtbWFyZ2luOiBjYWxjKHZhcigtLXNpemUtNC0xMikgLSAodmFyKC0tc2l6ZS00LTIpIC0gdmFyKC0tc2l6ZS00LTEpKSk7XG5cdFx0XHRib2R5LmlzLXBob25lICYge1xuXHRcdFx0XHQtLWNtLXNldHRpbmctdGFiLWNvbnRyb2xzLW1hcmdpbjogdmFyKC0tc2l6ZS00LTIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFRoZSBzZXR0aW5nIHRhYiBoZWFkZXIuXG5cdC5jYWxsb3V0bWFuYWdlci1zZXR0aW5nLXRhYi1oZWFkZXIge1xuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblxuXHRcdC8vIFBhZGRpbmcgdG8gbWltaWMgdGhlIHNpemluZyBvZiB0aGUgJy52ZXJ0aWNhbC10YWItY29udGVudCdcblx0XHRwYWRkaW5nLXRvcDogdmFyKC0tc2l6ZS00LTEpO1xuXHRcdHBhZGRpbmctYm90dG9tOiB2YXIoLS1zaXplLTQtMSk7XG5cdFx0cGFkZGluZy1yaWdodDogdmFyKC0tc2l6ZS00LTIpO1xuXG5cdFx0Ly8gQm90dG9tIGJvcmRlciB0byBzZXBhcmF0ZSB0aGUgaGVhZGVyIGZyb20gdGhlIGNvbnRlbnQuXG5cdFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcblxuXHRcdC8vIFVzZSB0aGUgYmFja2dyb3VuZCBvZiB0aGUgc2lkZWJhci5cblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSk7XG5cblx0XHRib2R5LmlzLXBob25lICYge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5KTtcblx0XHRcdG1hcmdpbi10b3A6IHZhcigtLW1vZGFsLWhlYWRlci1oZWlnaHQpO1xuXHRcdH1cblx0fVxuXG5cdC8vIFRoZSBzZXR0aW5nIHRhYiBuYXYgd2l0aGluIHRoZSBoZWFkZXIuXG5cdC5jYWxsb3V0bWFuYWdlci1zZXR0aW5nLXRhYi1uYXYge1xuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblxuXHRcdC8vIEVuc3VyZSB0aGUgbmF2IGlzIGF0IGxlYXN0IGFzIGJpZyBhcyBhIGJ1dHRvbi5cblx0XHRtaW4td2lkdGg6IHZhcigtLXNpemUtNC0xMik7XG5cdFx0bWluLWhlaWdodDogY2FsYyh2YXIoLS1zaXplLTQtMikgKyB2YXIoLS1pbnB1dC1oZWlnaHQpKTtcblxuXHRcdC8vIE92ZXJyaWRlIHRoZSBidXR0b24gcGFkZGluZy5cblx0XHRidXR0b24ge1xuXHRcdFx0cGFkZGluZzogdmFyKC0tc2l6ZS00LTEpIHZhcigtLXNpemUtNC0yKTtcblx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0fVxuXG5cdFx0Ly8gUmVkdWNlIHBhZGRpbmcgZm9yIG1vYmlsZS5cblx0XHRib2R5LmlzLW1vYmlsZSAmIHtcblx0XHRcdHBhZGRpbmc6IHZhcigtLXNpemUtNC0yKTtcblx0XHR9XG5cblx0XHRib2R5LmlzLXBob25lICYsXG5cdFx0Ym9keS5pcy1waG9uZSAmIGJ1dHRvbiB7XG5cdFx0XHRoZWlnaHQ6IDEwMCU7XG5cdFx0XHRtaW4td2lkdGg6IHVuc2V0O1xuXHRcdH1cblx0fVxuXG5cdC8vIFRoZSBzZXR0aW5nIHRhYiBuYXYgd2l0aGluIHRoZSBoZWFkZXIuXG5cdC5jYWxsb3V0bWFuYWdlci1zZXR0aW5nLXRhYi1jb250cm9scyB7XG5cdFx0ZmxleDogMyAzO1xuXG5cdFx0ZGlzcGxheTogZmxleDtcblx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdGp1c3RpZnktY29udGVudDogZW5kO1xuXHRcdGdhcDogdmFyKC0tc2l6ZS00LTIpO1xuXG5cdFx0cGFkZGluZy1sZWZ0OiB2YXIoLS1jbS1zZXR0aW5nLXRhYi1jb250cm9scy1tYXJnaW4pO1xuXG5cdFx0Ly8gTWFrZSB0aGUgcmVhbCBjb250cm9sIGVsZW1lbnRzIHRyYW5zcGFyZW50IHRvIHRoZSBjb250YWluZXIuXG5cdFx0PiAqOm5vdCgubW9kYWwtY2xvc2UtYnV0dG9uKSB7XG5cdFx0XHRkaXNwbGF5OiBjb250ZW50cztcblxuXHRcdFx0PiBpbnB1dFt0eXBlPSd0ZXh0J10ge1xuXHRcdFx0XHRmbGV4OiAxIDEgYXV0bztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQuY2FsbG91dG1hbmFnZXItc2V0dGluZy10YWItY29udHJvbHMgLm1vZGFsLWNsb3NlLWJ1dHRvbiB7XG5cdFx0ZmxleDogMCAwIGF1dG87XG5cblx0XHRwb3NpdGlvbjogc3RhdGljO1xuXHRcdGxlZnQ6IHVuc2V0O1xuXHRcdHRvcDogMDtcblx0XHRyaWdodDogMDtcblx0XHRib3R0b206IDA7XG5cblx0XHRib2R5LmlzLXBob25lICYge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHR9XG5cdH1cblxuXHQvLyBUaGUgc2V0dGluZyB0YWIgdGl0bGUgd2l0aGluIHRoZSBoZWFkZXIuXG5cdC5jYWxsb3V0bWFuYWdlci1zZXR0aW5nLXRhYi10aXRsZSB7XG5cdFx0ZmxleDogMSAxIGF1dG87XG5cdFx0ZmxleC13cmFwOiBub3dyYXA7XG5cblx0XHRoMixcblx0XHRoMyB7XG5cdFx0XHRtYXJnaW46IDA7XG5cdFx0XHR3b3JkLWJyZWFrOiBrZWVwLWFsbDtcblx0XHR9XG5cblx0XHRoMyB7XG5cdFx0XHRmb250LXNpemU6IHZhcigtLWZvbnQtdWktc21hbGwpO1xuXHRcdH1cblxuXHRcdGJvZHk6bm90KC5pcy1waG9uZSkgJiBoMyB7XG5cdFx0XHRmb250LXNpemU6IDAuOGVtO1xuXHRcdH1cblxuXHRcdGJvZHkuaXMtcGhvbmUgJiBoMjpoYXMoKyBoMykge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHR9XG5cdH1cblxuXHQvLyBUaGUgc2Nyb2xsIGNvbnRhaW5lciBmb3IgdGhlIHNldHRpbmcgdGFiLlxuXHQuY2FsbG91dG1hbmFnZXItc2V0dGluZy10YWItdmlld3BvcnQge1xuXHRcdGZsZXg6IDEgMiBhdXRvO1xuXG5cdFx0Ym9keS5pcy1waG9uZSAmIHtcblx0XHRcdC0tbW9kYWwtaGVhZGVyLWhlaWdodDogdmFyKC0tc2l6ZS0yLTEpO1xuXHRcdH1cblxuXHRcdC8vIEVuYWJsZSBzY3JvbGxpbmcuXG5cdFx0b3ZlcmZsb3cteTogYXV0bztcblx0XHQtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XG5cdH1cblxuXHQuY2FsbG91dG1hbmFnZXItc2V0dGluZy10YWItY29udGVudCB7XG5cdFx0ZmxleDogMSAxIGF1dG87XG5cblx0XHRib2R5Om5vdCguaXMtcGhvbmUpIHtcblx0XHRcdG1pbi1oZWlnaHQ6IDEwMCU7XG5cdFx0fVxuXHR9XG5gO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBYXlGQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7O0FBR0E7RUFFQTs7QUFDQTtFQUNBOzs7QUFNQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFHQTtFQUdBOztBQUVBO0VBQ0E7RUFDQTs7O0FBS0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBOztBQUdBO0VBQ0E7RUFDQTs7QUFJQTtFQUNBOztBQUdBO0VBRUE7RUFDQTs7O0FBS0E7RUFDQTtFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7O0FBR0E7RUFDQTs7QUFFQTtFQUNBOzs7QUFLQTtFQUNBO0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNBOzs7QUFLQTtFQUNBO0VBQ0E7O0FBRUE7QUFBQTtFQUVBO0VBQ0E7O0FBR0E7RUFDQTs7QUFHQTtFQUNBOztBQUdBO0VBQ0E7OztBQUtBO0VBQ0E7O0FBRUE7RUFDQTs7QUFKQTtFQVFBO0VBQ0E7OztBQUdBO0VBQ0E7O0FBRUE7RUFDQTs7O0FEd0NBO0VBQ0E7O0FBRUE7RUFDQTs7QUFHQTtFQUNBO0VBQ0E7OztBQUlBO0VBQ0E7OztBQUdBO0VBQ0E7O0FBQ0E7RUFDQTs7QUFIQTtFQU9BO0VBQ0E7RUFFQTtFQUNBOztBQUdBO0VBQ0E7RUFDQTs7QUFHQTtFQUNBO0VBQ0E7OztBRDVOQTtFQUNBOzs7QUR1SEE7RUFDQTs7QUFHQTtFQUFBOztBQUNBO0VBQUE7O0FBR0E7RUFDQTs7O0FEeENBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHQTtFQUNBOzs7QUFHQTtFQUNBOzs7QUFJQTtFQUNBOzs7QUFJQTtFQUNBOztBQUNBO0VBQ0E7OztBQUtBO0VBQ0E7RUFDQTs7QUFHQTtFQUNBOztBQUVBO0VBQ0E7O0FBU0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7OztBQUlBO0VBQ0E7OztBRDhJQTtFQUNBO0VBQ0E7OztBQUdBO0VBQ0E7RUFDQTs7O0FEelNBO0VBQ0E7RUFDQTtFQUVBO0VBQ0E7RUFDQTtFQUNBOzs7QUFNQTtFQUNBO0VBQ0E7O0FBRUE7RUFDQTtFQUNBOztBQUlBO0VBQ0E7O0FBSUE7QUFBQTtFQUVBOztBQUlBO0VBQ0E7RUFDQTtFQUNBOztBQUlBO0VBQ0E7RUFDQTs7QUFDQTtFQUNBO0VBQ0E7O0FBS0E7RUFDQTs7O0FBT0E7QUFBQTtFQUNBOzs7QUFLQTtFQUNBOztBRGhIQTtFQUNBOzs7QUFHQTtFQUNBOztBQUdBO0VBQ0E7O0FBR0E7RUFDQTs7QUFHQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNBOztBQU1BO0VBQ0E7OztBRGNBO0VBQ0E7O0FBRUE7RUFDQTtFQUNBOztBQUdBO0VBQ0E7O0FBR0E7RUFDQTs7O0FBSUE7RUFDQTtFQUNBOztBQUNBO0VBQ0E7OztBQUlBO0VBQ0E7RUFDQTs7QUFDQTtFQUNBOzs7QUFJQTtFQUNBO0VBQ0E7O0FBQ0E7RUFDQTs7O0FBSUE7RUFDQTtFQUNBOzs7QUR3QkE7RUFDQTtFQUNBOztBQUVBO0VBQ0E7OztBQUtBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFHQTtFQUNBO0VBQ0E7RUFDQTs7O0FEeERBO0VBQ0E7OztBQUdBO0VBQ0E7OztBQUdBO0VBQ0E7OztBQUdBO0FBQUE7QUFBQTtFQUdBOzs7QUR1RUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0E7RUFDQTtFQUVBO0VBQ0E7RUFDQTtFQUVBOztBQUVBO0VBQ0E7RUFFQTtFQUNBOzs7QURwTkE7RUFDQTs7O0FBSUE7RUFDQTs7QUFFQTtFQUNBOztBQUdBO0VBQ0E7OztBRHlCQTtFQUNBO0VBQ0E7OztBQUdBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTs7O0FBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUVBOzs7QUFHQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFFQSJ9 */