obsidian-dev-utils 94.2.0 → 94.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 94.3.0
4
+
5
+ - feat(demo-vault-coverage): let a settings-less plugin register the suite
6
+ - docs: use NATO placeholders instead of foo, bar and baz
7
+
3
8
  ## 94.2.0
4
9
 
5
10
  - feat(markdown): teach renderInternalLink the folder-note concept
@@ -125,7 +125,7 @@ __export(generated_during_build_exports, {
125
125
  LIBRARY_VERSION: () => LIBRARY_VERSION
126
126
  });
127
127
  module.exports = __toCommonJS(generated_during_build_exports);
128
- const LIBRARY_VERSION = "94.2.0";
128
+ const LIBRARY_VERSION = "94.3.0";
129
129
  const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-dev-utils-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-dev-utils-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-dev-utils-lock-indicator-flash {\n animation: obsidian-dev-utils-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-dev-utils-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n@keyframes obsidian-dev-utils-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\n }\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-dev-utils.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n cursor: pointer;\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-dev-utils.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-dev-utils-minimized-modal-bar-attention 0.35s ease-out;\n}\n.obsidian-dev-utils.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button:hover,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-dev-utils.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.plugin-notice-close-button {\n position: absolute;\n right: var(--size-4-3);\n top: var(--size-4-3);\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice {\n padding: 0;\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice .obsidian-dev-utils.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.popover {\n max-width: min(420px, 90vw);\n min-width: 320px;\n padding: var(--size-4-2) var(--size-4-3);\n position: absolute;\n z-index: var(--layer-menu);\n}\n.obsidian-dev-utils.popover .setting-item {\n align-items: center;\n border-top: none;\n gap: var(--size-4-2);\n padding: var(--size-2-1) 0;\n}\n.obsidian-dev-utils.popover .setting-item-info {\n margin-right: 0;\n}\n.obsidian-dev-utils.popover .setting-item-control {\n flex-grow: 1;\n justify-content: flex-end;\n}\n.obsidian-dev-utils.popover input[type=text] {\n width: 100%;\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\nbody button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid:not(.untouched), .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid:not(.untouched), .obsidian-dev-utils input.metadata-input-text:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:focus:invalid:not(.untouched),\n.obsidian-dev-utils textarea:active:invalid:not(.untouched),\n.obsidian-dev-utils textarea:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils textarea:focus:invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-notice.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/popover.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACFJ;EACE;IAEE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACxGJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACTN;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAOJ;EACE;;AAEA;EACE;;;AChCF;EACE;;;ACCJ;EAIE;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;AC9BF;EACE;;;ACON;EACE;;;ACTE;EACE;;;ACKJ;EAPA;;AAuBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAvBJ;;AA6BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-dev-utils%60.%5Cn.obsidian-dev-utils-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-dev-utils-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-dev-utils-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn@keyframes%20obsidian-dev-utils-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button,%5Cn%20%20%20%20.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20The%20close%20button%20reuses%20Obsidian's%20%60modal-header-button%60%20+%20%60clickable-icon%60%20classes%20so%20it%20matches%5Cn%20%20%20%20//%20The%20native%20modal%20close%20button%20(box%20+%20hover);%20only%20its%20corner%20position%20is%20set%20here.%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%20var(--size-4-3);%5Cn%20%20%20%20%20%20top:%20var(--size-4-3);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-explicit-close.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20A%20popover%20is%20anchored%20at%20a%20point%20and%20appended%20to%20the%20document%20body,%20outside%20any%20plugin-scoped%5Cn//%20container,%20so%20it%20is%20positioned%20absolutely%20at%20the%20top%20level.%20It%20borrows%20Obsidian's%20%60.menu%60%20look,%5Cn//%20which%20already%20carries%20the%20popup%20background,%20border%20and%20shadow%20%E2%80%94%20only%20layout%20is%20set%20here.%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20&.popover%20%7B%5Cn%20%20%20%20//%20Deliberately%20not%20%60calc(100vw%20-%2016px)%60:%20the%20SCSS%20compiler%20strips%20the%20%60calc(%60%20wrapper%20inside%5Cn%20%20%20%20//%20%60min()%60,%20which%20yields%20invalid%20CSS.%20A%20viewport%20percentage%20keeps%20a%20narrow%20window's%20popover%20on%5Cn%20%20%20%20//%20screen.%5Cn%20%20%20%20max-width:%20min(420px,%2090vw);%5Cn%20%20%20%20min-width:%20320px;%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20z-index:%20var(--layer-menu);%5Cn%5Cn%20%20%20%20//%20Setting%20rows%20are%20built%20for%20a%20full-width%20settings%20tab;%20compact%20them%20for%20a%20popover.%5Cn%20%20%20%20.setting-item%20%7B%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20border-top:%20none;%5Cn%20%20%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20%20%20padding:%20var(--size-2-1)%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-info%20%7B%5Cn%20%20%20%20%20%20margin-right:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-control%20%7B%5Cn%20%20%20%20%20%20flex-grow:%201;%5Cn%20%20%20%20%20%20justify-content:%20flex-end;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20input%5Btype='text'%5D%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20with%20a%5Cn//%20%60body%60-prefixed%20selector%20(specificity%200,1,2)%20so%20it%20wins%20over%20tldraw's%20(0,1,1)%20while%5Cn//%20Staying%20correct%20for%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cnbody%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cr%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cr%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cr%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%20%20%7D%5Cr%5Cn%7D%5Cr%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn//%20An%20input%20the%20user%20has%20not%20interacted%20with%20yet%20carries%20%60.untouched%60%20(set%20by%20%60PromptModal%60),%20so%20a%20modal%20that%5Cn//%20opens%20invalid%20by%20design%20does%20not%20greet%20the%20user%20in%20red.%20Both%20blocks%20below%20must%20be%20gated:%20the%20input%20is%5Cn//%20focused%20on%20open,%20so%20the%20focus%20block%20alone%20would%20keep%20painting%20it.%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
130
130
  // Annotate the CommonJS export names for ESM import in node:
131
131
  0 && (module.exports = {
@@ -376,7 +376,7 @@ function registerDemoVaultCoverageSuite(params) {
376
376
  }));
377
377
  const startNote = params.authoring?.startNote ?? DEFAULT_START_NOTE;
378
378
  (0, import_vitest.describe)("demo-vault coverage", () => {
379
- for (const spec of params.interfaces) {
379
+ for (const spec of params.interfaces ?? []) {
380
380
  (0, import_vitest.it)(`demonstrates every ${spec.interfaceName} ${spec.kind}`, () => {
381
381
  const members = checker.getInterfaceMembers(spec);
382
382
  const demonstrated = members[spec.kind];
@@ -388,7 +388,7 @@ function registerDemoVaultCoverageSuite(params) {
388
388
  (0, import_vitest.expect)(checker.findStaleReferences({ receiver: spec.receiver, validMembers: members.all })).toEqual([]);
389
389
  });
390
390
  }
391
- for (const spec of params.configInterfaces) {
391
+ for (const spec of params.configInterfaces ?? []) {
392
392
  (0, import_vitest.it)(`demonstrates every ${spec.interfaceName} option`, () => {
393
393
  const members = checker.getInterfaceMembers(spec);
394
394
  (0, import_vitest.expect)(members.properties.length).toBeGreaterThan(0);
@@ -429,12 +429,17 @@ function registerDemoVaultCoverageSuite(params) {
429
429
  (0, import_vitest.it)("commits none of the app.json settings obsidian-dev-utils injects at release time", () => {
430
430
  (0, import_vitest.expect)(checker.findCommittedAppJsonSettings()).toEqual([]);
431
431
  });
432
- (0, import_vitest.it)("keeps the reflected surface non-trivial", () => {
433
- const guard = params.nonTrivialGuard;
434
- const members = checker.getInterfaceMembers(guard);
435
- (0, import_vitest.expect)(members.all).toContain(guard.expectMember);
436
- (0, import_vitest.expect)(checker.collectDemoNoteRelativePaths()).toContain(guard.expectDemoNote);
432
+ (0, import_vitest.it)("reads a non-empty demo vault", () => {
433
+ (0, import_vitest.expect)(checker.collectDemoNoteRelativePaths().length).toBeGreaterThan(0);
437
434
  });
435
+ const guard = params.nonTrivialGuard;
436
+ if (guard) {
437
+ (0, import_vitest.it)("keeps the reflected surface non-trivial", () => {
438
+ const members = checker.getInterfaceMembers(guard);
439
+ (0, import_vitest.expect)(members.all).toContain(guard.expectMember);
440
+ (0, import_vitest.expect)(checker.collectDemoNoteRelativePaths()).toContain(guard.expectDemoNote);
441
+ });
442
+ }
438
443
  });
439
444
  }
440
445
  const CLASS_MEMBER_MODIFIERS = String.raw`(?:(?:public|private|protected|readonly|static|abstract|override)\s+)*`;
@@ -658,4 +663,4 @@ function tryDecodeUriComponent(value) {
658
663
  DemoVaultCoverageChecker,
659
664
  registerDemoVaultCoverageSuite
660
665
  });
661
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogU3RhdGljIGNvdmVyYWdlL2ZyZXNobmVzcyBjaGVja3MgdGhhdCBrZWVwIGEgcGx1Z2luJ3MgaW4tcmVwbyBgZGVtby12YXVsdC9gIGluIHN5bmMgd2l0aCBpdHMgcHVibGljIHN1cmZhY2UuXG4gKlxuICogQSBwbHVnaW4gY2FuIHNoaXAgYSBjdXJhdGVkIGRlbW8gdmF1bHQgYXQgYGRlbW8tdmF1bHQvYCBpbiBpdHMgcmVwbyByb290LiBUaGVzZSBoZWxwZXJzIHJlZmxlY3QgdGhlIHJlYWxcbiAqIHB1YmxpYyBBUEkvY29uZmlnL2RvY3Mgc3RyYWlnaHQgZnJvbSBzb3VyY2UgYW5kIGFzc2VydCBcdTIwMTQgV0lUSE9VVCBsYXVuY2hpbmcgT2JzaWRpYW4gXHUyMDE0IHRoYXQgZXZlcnkgZmVhdHVyZSBpc1xuICogZGVtb25zdHJhdGVkIGluIHRoZSBub3RlcyBhbmQgdGhhdCB0aGUgbm90ZXMgcmVmZXJlbmNlIG5vIEFQSSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzIChyZW5hbWUgZHJpZnQpLlxuICogVGhlIHJ1bnRpbWUgYmVoYXZpb3Igb2YgdGhlIHBsdWdpbiBpcyBjb3ZlcmVkIGJ5IGl0cyBvdGhlciBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IGJ5IHRoZSBkZW1vIHZhdWx0OyB0aGVcbiAqIHZhdWx0IGlzIGEgbGVhcm5pbmcgcmVzb3VyY2UsIGFuZCB0aGVzZSBjaGVja3Mgb25seSBndWFyZCB0aGF0IGl0IHN0YXlzIHRydXRoZnVsLlxuICpcbiAqIFRoZXkgYWxzbyBndWFyZCB0aGUgdmF1bHQncyBvd24gYC5vYnNpZGlhbi9hcHAuanNvbmA6IHRoZSBzZXR0aW5ncyBsaXN0ZWQgaW5cbiAqIHtAbGluayBERU1PX1ZBVUxUX0FQUF9KU09OX1NFVFRJTkdTfSBiZWxvbmcgdG8gYG9ic2lkaWFuLWRldi11dGlsc2AsIHdoaWNoIHdyaXRlcyB0aGVtIGludG8gdGhlIGFyY2hpdmVkXG4gKiB2YXVsdCBhdCByZWxlYXNlIHRpbWUsIHNvIGEgdmF1bHQgdGhhdCBjb21taXRzIGFueSBvZiB0aGVtIGlzIGtlZXBpbmcgYSBzZWNvbmQgY29weSBub3RoaW5nIHJlY29uY2lsZXMuXG4gKlxuICogVGhleSBhbHNvIGVuZm9yY2UgdGhlIGRlbW8tdmF1bHQgQVVUSE9SSU5HIGNvbnZlbnRpb24gXHUyMDE0IGV2ZXJ5IG5vdGUgb3BlbnMgd2l0aCBhbiBgIyBIMWAgYW5kIGEgcGxhaW5cbiAqIHByb3NlIHBhcmFncmFwaCwgZXZlcnkgbm90ZSBpcyByZWFjaGFibGUgZnJvbSB0aGUgc3RhcnQgbm90ZSwgYW5kIG5vIG5vdGUgdXNlcyBhIGBbW3dpa2lsaW5rXV1gIG9yIGFcbiAqIGBbRG9jc10oXHUyMDI2KWAgbGluZS4gVGhlc2UgY2hlY2tzIGFyZSB1bmNvbmRpdGlvbmFsOiB0aGUgZGVtbyB2YXVsdCBpcyB0aGUgcHVibGlzaGVkIGRvY3VtZW50YXRpb24sIHJlYWRcbiAqIGluIE9ic2lkaWFuIEFORCBvbiBHaXRIdWIgKHdoZXJlIGEgd2lraWxpbmsgZG9lcyBub3QgcmVuZGVyKSwgc28gYSBub3RlIHRoYXQgYnJlYWtzIHRoZSBjb252ZW50aW9uIGlzXG4gKiBicm9rZW4gZm9yIHJlYWwgcmVhZGVycy4gYGF1dGhvcmluZ2Agb25seSB0dW5lcyB0aGVtICh3aGljaCBub3RlIGlzIHRoZSBzdGFydCwgd2hpY2ggbm90ZXMgc2l0IG91dHNpZGVcbiAqIHRoZSBsZWFybmluZyBwYXRoKTsgaXQgY2Fubm90IHN3aXRjaCB0aGVtIG9mZi5cbiAqXG4gKiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIG5vdGUgd2hvc2UgU1VCSkVDVCBpcyB0aGUgd2lraWxpbmsgXHUyMDE0IGFuIGVtYmVkIHNwZWxsaW5nIHRoZSByZWFkZXIgaXMgYmVpbmcgdGF1Z2h0XG4gKiB0byB0eXBlLCBhIGZyb250bWF0dGVyIHByb3BlcnR5IHZhbHVlIHRoYXQgZXhpc3RzIHRvIGNvbnRyYXN0IHdpdGggYSBNYXJrZG93biBsaW5rLCBhIGZpeHR1cmUgdGhhdCBtdXN0XG4gKiBrZWVwIHRoZSB3aWtpbGluayBhIGNvbW1hbmQgaXMgc3VwcG9zZWQgdG8gbGVhdmUgYWxvbmUsIGEgbGluayB0aGUgcmVhZGVyIGNsaWNrcyB3aGlsZSBpdCBzdGlsbCByZXNvbHZlc1xuICogdG8gbm90aGluZy4gU3VjaCBhIG5vdGUgc2F5cyBzbyBpdHNlbGYsIHN0YXRpbmcgd2h5LCBpbiBvbmUgb2YgdHdvIGZvcm1zIG1vZGVsbGVkIG9uIEVTTGludCdzLlxuICpcbiAqIFBlciBsaW5lIG9yIHBlciByZWdpb24sIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBpbiBPYnNpZGlhbiBBTkQgb24gR2l0SHViIFx1MjAxNCB0aGVcbiAqIHNwZWxsaW5nIHRoZXNlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWA6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUtbmV4dC1saW5lIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gQ2xpY2tpbmcgYSBsaW5rIHRvIGEgbm90ZSB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCBJUyB0aGUgZmVhdHVyZS4gLS0+XG4gKiAyLiBDbGljayB0aGlzIGxpbms6IFtbUHJvamVjdHMvRnJlc2ggaWRlYV1dLlxuICpcbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLSBUaGUgd2lraWxpbmsgZW1iZWQgaXMgdGhlIHN5bnRheCB0aGlzIG5vdGUgdGVhY2hlcy4gLS0+XG4gKiAhW1tiYXNpYy5odG1sfDQwMF1dXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1lbmFibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLT5cbiAqIGBgYFxuICpcbiAqIFBlciBub3RlLCBpbiB0aGUgbm90ZSdzIG93biBmcm9udG1hdHRlciBcdTIwMTQgdGhlIG9ubHkgZm9ybSB0aGF0IGNhbiByZWFjaCBhIHdpa2lsaW5rIElOU0lERSBmcm9udG1hdHRlcixcbiAqIHdoZXJlIGEgY29tbWVudCBjYW5ub3QgZ286XG4gKlxuICogYGBgeWFtbFxuICogLS0tXG4gKiBvYnNpZGlhbi1kZXYtdXRpbHM6XG4gKiAgIGRlbW8tdmF1bHQtdmFsaWRhdGlvbjpcbiAqICAgICBhbGxvdy13aWtpbGlua3M6IFRoZSBgd2lraWxpbmtgIHByb3BlcnR5IHZhbHVlIGlzIHRoZSBjb250cmFzdCB0aGlzIG5vdGUgaXMgYnVpbHQgYXJvdW5kLlxuICogLS0tXG4gKiBgYGBcbiAqXG4gKiBFaXRoZXIgd2F5IHRoZSBkZWNsYXJhdGlvbiB0cmF2ZWxzIHdpdGggdGhlIG5vdGUgcmF0aGVyIHRoYW4gc2l0dGluZyBpbiBhIGxpc3Qgc29tZXdoZXJlIGVsc2UsIGl0IGNhcnJpZXNcbiAqIGl0cyBqdXN0aWZpY2F0aW9uLCBhbmQgaXQgZXhlbXB0cyBvbmx5IHRoZSBXSUtJTElOSyBjaGVjayBcdTIwMTQgdGhlIEgxLCBwcm9zZSwgcmVhY2hhYmlsaXR5IGFuZCBgW0RvY3NdYFxuICogY2hlY2tzIHN0aWxsIGFwcGx5LiBBIGRlY2xhcmF0aW9uIHdpdGggbm8gcmVhc29uLCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmssIGEgcmVnaW9uIG5ldmVyIGVuYWJsZWQgYWdhaW4sXG4gKiBvciBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlIGFsbCBmYWlsOiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCB0aGF0IG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIG9yIHRoYXRcbiAqIHNpbGVudGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vIGV4ZW1wdGlvbiBhdCBhbGwuXG4gKlxuICogVHdvIGxheWVycyBhcmUgZXhwb3NlZDpcbiAqIC0ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0gXHUyMDE0IGEgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgdGhhdCByZWFkcyB0aGUgY29ycHVzLCBwYXJzZXMgaW50ZXJmYWNlIC9cbiAqICAgY2xhc3MgLyBlbnVtIG1lbWJlcnMgYW5kIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kIHJldHVybnMgZGlhZ25vc3RpYyBhcnJheXMgKHdoYXQgaXMgdW5kZW1vbnN0cmF0ZWQgLyBzdGFsZVxuICogICAvIHVubGlua2VkIC8gb2ZmLWNvbnZlbnRpb24pLlxuICogLSB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfSBcdTIwMTQgYSB0aGluIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSBvdmVyIHRoZSBjb3JlLCBzb1xuICogICBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBjYWxsLlxuICovXG5cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi9wbHVnaW4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQgeyBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwIH0gZnJvbSAnLi4vcmVnLWV4cC50cyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7XG4gIGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyxcbiAgcGFyc2VEZW1vVmF1bHRBcHBKc29uXG59IGZyb20gJy4vZGVtby12YXVsdC1hcHAtanNvbi50cyc7XG5cbi8qKlxuICogVHVuZXMgdGhlIGFsd2F5cy1vbiBhdXRob3JpbmcgY2hlY2tzLiBJdCBjYW5ub3QgZGlzYWJsZSB0aGVtIFx1MjAxNCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0QXV0aG9yaW5nU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZXMgKHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSB0aGF0IHNpdCBvdXRzaWRlIHRoZSBsZWFybmluZyBwYXRoIGFuZCBhcmUgdGhlcmVmb3JlXG4gICAqIGV4ZW1wdCBmcm9tIGV2ZXJ5IGF1dGhvcmluZyBjaGVjay4gRGVmYXVsdHMgdG8gdGhlIHZhdWx0J3Mgb3duIGBSRUFETUUubWRgLCB3aGljaCBhZGRyZXNzZXMgc29tZW9uZVxuICAgKiBicm93c2luZyB0aGUgcmVwbyBvbiBHaXRIdWIgcmF0aGVyIHRoYW4gYSByZWFkZXIgd29ya2luZyB0aHJvdWdoIHRoZSB2YXVsdC5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTm90ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIG5vdGUgKHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIGV2ZXJ5IG90aGVyIG5vdGUgbXVzdCBiZSByZWFjaGFibGUgZnJvbS4gRGVmYXVsdHMgdG9cbiAgICogYDAwIFN0YXJ0Lm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0Tm90ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIGNvbmZpZyBpbnRlcmZhY2Ugd2hvc2Ugb3B0aW9ucyBhcmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb25maWdJbnRlcmZhY2VDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgd2hvc2UgcHJvcGVydGllcyBhcmUgdGhlIGNvbmZpZ1xuICAgKiBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJ9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIGV4ZW1wdCBmcm9tIHRoZSBhdXRob3JpbmcgY2hlY2tzLiBEZWZhdWx0cyB0byB0aGVcbiAgICogdmF1bHQncyBvd24gYFJFQURNRS5tZGAuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZE5vdGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwbHVnaW4gcmVwbyByb290IFx1MjAxNCB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgYGRlbW8tdmF1bHQvYCBhbmQgdGhlIHNvdXJjZSBiZWluZ1xuICAgKiByZWZsZWN0ZWQuIENhbGxlcnMgdHlwaWNhbGx5IHBhc3MgYGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kU3RhbGVSZWZlcmVuY2VzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kU3RhbGVSZWZlcmVuY2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSByZWNlaXZlciB3aG9zZSBgYCBgJHtyZWNlaXZlcn0uPG1lbWJlcj5gIGBgIHJlZmVyZW5jZXMgYXJlIHNjYW5uZWQgZm9yIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtZW1iZXJzIHRoYXQgY3VycmVudGx5IGV4aXN0IG9uIHRoZSByZWNlaXZlcjsgYW55IHJlZmVyZW5jZWQgbWVtYmVyIG5vdCBpbiB0aGlzIHNldCBpcyBzdGFsZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkTWVtYmVyczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWVtYmVyIG5hbWVzIHRoYXQgbXVzdCBlYWNoIGFwcGVhciBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICByZWFkb25seSBtZW1iZXJzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hlbiBzZXQsIGEgbWVtYmVyIGlzIGRlbW9uc3RyYXRlZCBvbmx5IGlmIGBgIGAke3JlY2VpdmVyfS4ke21lbWJlcn1gIGBgIGFwcGVhcnMgKGUuZy4gYSBjb250ZXh0IG9iamVjdCdzXG4gICAqIG1ldGhvZHMpOyB3aGVuIGFic2VudCwgdGhlIGJhcmUgbWVtYmVyIG5hbWUgaXMgbG9va2VkIHVwIChlLmcuIGEgY29uZmlnIG9wdGlvbikuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5saW5rZWRGZWF0dXJlRG9jc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVubGlua2VkRmVhdHVyZURvY3NQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRvY3MgZm9sZGVyIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSB0b3AtbGV2ZWwgYCoubWRgIGZpbGVzIGFyZSB0aGUgZmVhdHVyZSBkb2NzLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jc0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgdGhhdCBhcmUgTk9UIHBlci1mZWF0dXJlIHBhZ2VzIGFuZCBzbyBuZWVkIG5vIGxpbmtpbmcgZGVtbyBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uRmVhdHVyZURvY3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbnJlYWNoYWJsZU5vdGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5yZWFjaGFibGVOb3Rlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhlIHdhbGsgc3RhcnRzIGZyb20sIGUuZy4gYDAwIFN0YXJ0Lm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0Tm90ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSBgZXhwb3J0IGZ1bmN0aW9uYHMgYXJlIHBhcnNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRJbnRlcmZhY2VNZW1iZXJzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHRvIHBhcnNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBmZWF0dXJlLWRvYyBsaW5raW5nIGNoZWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIGRvY3MgZm9sZGVyIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSB0b3AtbGV2ZWwgYCoubWRgIGZpbGVzIGFyZSB0aGUgZmVhdHVyZSBkb2NzLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2MgYmFzZW5hbWVzICh3aXRob3V0IGAubWRgKSB0aGF0IGFyZSBOT1QgcGVyLWZlYXR1cmUgcGFnZXMgYW5kIHNvIG5lZWQgbm8gbGlua2luZyBkZW1vIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub25GZWF0dXJlRG9jczogc3RyaW5nW107XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBtb2R1bGUncyBleHBvcnRlZCBmdW5jdGlvbnMsIGVhY2ggZGVtb25zdHJhdGVkIGJ5IGl0cyBiYXJlIG5hbWUgaW4gdGhlIGRlbW8gY29ycHVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEZ1bmN0aW9uc0NvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBzaW5nbGUgaW50ZXJmYWNlJ3MgbWVtYmVycyBhbmQgZGVtb25zdHJhdGVzIHRoZW0gdmlhIGBgIGAke3JlY2VpdmVyfS48bWVtYmVyPmAgYGAgcmVmZXJlbmNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRJbnRlcmZhY2VDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgdG8gcmVmbGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZGVtb25zdHJhdGVkIG1lbWJlcnMgYXJlIHRoZSByZWZsZWN0ZWQgdHlwZSdzIG1ldGhvZHMgb3IgaXRzIHByb3BlcnRpZXMgKGVudW0gbWVtYmVycyBjb3VudCBhc1xuICAgKiBwcm9wZXJ0aWVzKS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IERlbW9WYXVsdEludGVyZmFjZU1lbWJlcktpbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIHRoZSBub3RlcyBjYWxsIHRoZSBtZW1iZXJzIG9uIChlLmcuIGBjb2RlQnV0dG9uQ29udGV4dGApLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBpbnRlcmZhY2UncyBkZW1vbnN0cmF0ZWQgbWVtYmVycyBhcmUgaXRzIG1ldGhvZHMgb3IgaXRzIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlbW9WYXVsdEludGVyZmFjZU1lbWJlcktpbmQgPSAnbWV0aG9kcycgfCAncHJvcGVydGllcyc7XG5cbi8qKlxuICogQ29uZmlndXJlcyB0aGUgZ3VhcmQgdGhhdCB0aGUgcmVmbGVjdGVkIHN1cmZhY2UgaXMgbm9uLXRyaXZpYWwgKHByb3RlY3RzIGFnYWluc3QgYSBwYXJzaW5nIHJlZ3Jlc3Npb25cbiAqIHNpbGVudGx5IGVtcHR5aW5nIGV2ZXJ5IG90aGVyIGNoZWNrKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjIHtcbiAgLyoqXG4gICAqIEEgZGVtbyBub3RlIChwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSB0aGF0IG11c3QgYmUgcHJlc2VudC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdERlbW9Ob3RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbWVtYmVyIHRoYXQgbXVzdCBiZSByZWZsZWN0ZWQgZnJvbSB7QGxpbmsgRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYy5pbnRlcmZhY2VOYW1lfS5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdE1lbWJlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB3aG9zZSBtZW1iZXJzIGFyZSByZS1wYXJzZWQgZm9yIHRoZVxuICAgKiBndWFyZC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgZGVtbyBub3RlLCBhcyByZWFkIGZyb20gdGhlIGRlbW8gdmF1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Tm90ZSB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZSdzIHJhdyBNYXJrZG93biBjb250ZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgZm9sZGVyLCBlLmcuIGAwMCBTdGFydC5tZGAuXG4gICAqL1xuICByZWFkb25seSByZWxhdGl2ZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyc2VkIG1lbWJlcnMgb2YgYSBzb3VyY2UgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgLyoqXG4gICAqIEV2ZXJ5IG1lbWJlciBcdTIwMTQge0BsaW5rIEludGVyZmFjZU1lbWJlcnMubWV0aG9kc30gZm9sbG93ZWQgYnkge0BsaW5rIEludGVyZmFjZU1lbWJlcnMucHJvcGVydGllc30uXG4gICAqL1xuICByZWFkb25seSBhbGw6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIG1lbWJlcnMgKGRlY2xhcmVkIGFzIGBuYW1lKC4uLilgKS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbWVtYmVycyAoZGVjbGFyZWQgYXMgYG5hbWU/OiAuLi5gKS5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnRpZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgbm90ZSBsaW5lIHBhaXJlZCB3aXRoIHRoZSBsaW5lIG51bWJlciBpdCBjYW1lIGZyb20sIHNvIGEgY2hlY2sgdGhhdCBza2lwcyBmZW5jZWQgYmxvY2tzIGNhbiBzdGlsbFxuICogcmVwb3J0IFx1MjAxNCBhbmQgYW4gaW5saW5lIGRpcmVjdGl2ZSBjYW4gc3RpbGwgbmFtZSBcdTIwMTQgdGhlIGxpbmUgYXMgdGhlIHJlYWRlciBzZWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGVMaW5lIHtcbiAgLyoqXG4gICAqIFRoZSB6ZXJvLWJhc2VkIGxpbmUgbnVtYmVyIHdpdGhpbiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lJ3MgcmF3IHRleHQuXG4gICAqL1xuICByZWFkb25seSBsaW5lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBgZGlzYWJsZWAgcmVnaW9uIHRoYXQgaGFzIGJlZW4gb3BlbmVkIGFuZCBub3QgeWV0IGVuYWJsZWQgYWdhaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3Blbldpa2lsaW5rRGlyZWN0aXZlUmVnaW9uIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJlZ2lvbiBoYXMgY292ZXJlZCBhIHdpa2lsaW5rLCB3aGljaCBpcyB3aGF0IHN0b3BzIGl0IGJlaW5nIHJlcG9ydGVkIGFzIHBvaW50bGVzcy5cbiAgICovXG4gIGlzVXNlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgdGhlIHJlZ2lvbiB3YXMgb3BlbmVkIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZUluZGV4OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUdW5lcyB0aGUgYWx3YXlzLW9uIGF1dGhvcmluZyBjaGVja3MsIG9yIGB1bmRlZmluZWRgIHRvIHRha2UgdGhlaXIgZGVmYXVsdHMuIEl0IGNhbm5vdCBkaXNhYmxlIHRoZW0uXG4gICAqL1xuICByZWFkb25seSBhdXRob3Jpbmc/OiBEZW1vVmF1bHRBdXRob3JpbmdTcGVjO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uZmlnIGludGVyZmFjZXMgd2hvc2Ugb3B0aW9ucyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ0ludGVyZmFjZXM6IERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjaywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGx1Z2luIHNoaXBzIG5vIGBkb2NzL2AgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jcz86IERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2R1bGVzIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAgICogcGx1Z2luIGV4cG9zZXMgbm8gc3VjaCBtb2R1bGUgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk1vZHVsZXM/OiBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGludGVyZmFjZXMgd2hvc2UgbWVtYmVycyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIChhbmQgcmVmZXJlbmNlZCB3aXRob3V0IGRyaWZ0KS5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZXM6IERlbW9WYXVsdEludGVyZmFjZUNvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZ3VhcmQgdGhhdCBrZWVwcyB0aGUgcmVmbGVjdGVkIHN1cmZhY2Ugbm9uLXRyaXZpYWwuXG4gICAqL1xuICByZWFkb25seSBub25Ucml2aWFsR3VhcmQ6IERlbW9WYXVsdE5vblRyaXZpYWxHdWFyZFNwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwbHVnaW4gcmVwbyByb290LiBDYWxsZXJzIHR5cGljYWxseSBwYXNzIGBnZXRSb290Rm9sZGVyKCkgPz8gcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBhIG5vdGUncyBpbmxpbmUgYG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlXHUyMDI2YCBkaXJlY3RpdmVzIGFsbG93LCBhbmQgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2lraWxpbmtEaXJlY3RpdmVTY2FuIHtcbiAgLyoqXG4gICAqIFRoZSB6ZXJvLWJhc2VkIGxpbmUgbnVtYmVycyBhIGRpcmVjdGl2ZSBhbGxvd3MgYSB3aWtpbGluayBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRMaW5lSW5kZXhlczogUmVhZG9ubHlTZXQ8bnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGl2ZSBtaXN0YWtlcyBmb3VuZCwgZWFjaCBwaHJhc2VkIGZvciBhIGZhaWxpbmcgYXNzZXJ0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBydW5uaW5nIHN0YXRlIG9mIGEgZGlyZWN0aXZlIHNjYW4sIHRocmVhZGVkIHRocm91Z2ggdGhlIHBlci1saW5lIGhlbHBlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2lraWxpbmtEaXJlY3RpdmVTY2FuU3RhdGUge1xuICAvKipcbiAgICogVGhlIGxpbmVzIGEgZGlyZWN0aXZlIGhhcyBhbGxvd2VkIGEgd2lraWxpbmsgb24gc28gZmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZExpbmVJbmRleGVzOiBTZXQ8bnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbiBjdXJyZW50bHkgb3BlbiwgYW5kIHdoZXRoZXIgaXQgaGFzIGNvdmVyZWQgYSB3aWtpbGluayB5ZXQuXG4gICAqL1xuICBvcGVuUmVnaW9uOiBudWxsIHwgT3Blbldpa2lsaW5rRGlyZWN0aXZlUmVnaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBhIGBkaXNhYmxlLW5leHQtbGluZWAgd2FzIHJlYWQgb24sIHdoaWxlIGl0IHN0aWxsIHdhaXRzIGZvciB0aGUgbGluZSBpdCBjb3ZlcnMuXG4gICAqL1xuICBwZW5kaW5nTmV4dExpbmVJbmRleDogbnVsbCB8IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGl2ZSBtaXN0YWtlcyBmb3VuZCBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lcyBvZiB0aGUgbm90ZSB0aGF0IGNhcnJ5IGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSB3aWtpbGlua0xpbmVJbmRleGVzOiBSZWFkb25seVNldDxudW1iZXI+O1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgcGx1Z2luJ3MgcHVibGljIHN1cmZhY2UgZnJvbSBzb3VyY2UgYW5kIGNoZWNrcyBpdHMgaW4tcmVwbyBgZGVtby12YXVsdC9gIHN0YXlzIGluIHN5bmMgd2l0aCBpdC5cbiAqXG4gKiBFdmVyeSBtZXRob2QgaXMgYSBwdXJlIHF1ZXJ5IG92ZXIgZmlsZXMgdW5kZXIgdGhlIHJlcG8gcm9vdCAodGhlIGRlbW8gY29ycHVzIGlzIHJlYWQgb25jZSBhbmQgY2FjaGVkKSwgc29cbiAqIHRoZSBjaGVja2VyIGlzIHRyaXZpYWxseSB1bml0LXRlc3RhYmxlIGFnYWluc3QgYSBmaXh0dXJlIHJlcG8gYW5kIGNhcnJpZXMgbm8gdGVzdC1mcmFtZXdvcmsgZGVwZW5kZW5jeS5cbiAqL1xuZXhwb3J0IGNsYXNzIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlciB7XG4gIHByaXZhdGUgY2FjaGVkQ29ycHVzOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWROb3RlczogRGVtb1ZhdWx0Tm90ZVtdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVtb1ZhdWx0Rm9sZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhjbHVkZWROb3RlczogU2V0PHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2hlY2tlciByb290ZWQgYXQgYSBwbHVnaW4gcmVwby5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29uc3RydWN0b3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMucm9vdEZvbGRlciA9IHBhcmFtcy5yb290Rm9sZGVyO1xuICAgIHRoaXMuZGVtb1ZhdWx0Rm9sZGVyID0gam9pbih0aGlzLnJvb3RGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCk7XG4gICAgdGhpcy5leGNsdWRlZE5vdGVzID0gbmV3IFNldChwYXJhbXMuZXhjbHVkZWROb3RlcyA/PyBERUZBVUxUX0VYQ0xVREVEX05PVEVTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0cyB0aGUgZGVtbyBub3RlcyBhcyBwYXRocyByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBmb2xkZXIgKGZvciBhIG5vbi10cml2aWFsLXN1cmZhY2UgZ3VhcmQpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgZXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQuXG4gICAqL1xuICBwdWJsaWMgY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdE5vdGVzKCkubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIGNhY2hlcyBldmVyeSBkZW1vIG5vdGUgaW5kaXZpZHVhbGx5IFx1MjAxNCB0aGUgcGVyLW5vdGUgdmlldyB0aGUgYXV0aG9yaW5nIGNoZWNrcyB3b3JrIG9uLCBhc1xuICAgKiBvcHBvc2VkIHRvIHRoZSBjb25jYXRlbmF0ZWQge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5yZWFkQ29ycHVzfS5cbiAgICpcbiAgICogQHJldHVybnMgRXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQsIGV4Y2x1ZGVkIG9uZXMgaW5jbHVkZWQuXG4gICAqL1xuICBwdWJsaWMgY29sbGVjdE5vdGVzKCk6IERlbW9WYXVsdE5vdGVbXSB7XG4gICAgdGhpcy5jYWNoZWROb3RlcyA/Pz0gdGhpcy5jb2xsZWN0TWFya2Rvd25GaWxlcyh0aGlzLmRlbW9WYXVsdEZvbGRlcikubWFwKChmaWxlKSA9PiAoe1xuICAgICAgY29udGVudDogcmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpLFxuICAgICAgcmVsYXRpdmVQYXRoOiByZWxhdGl2ZSh0aGlzLmRlbW9WYXVsdEZvbGRlciwgZmlsZSlcbiAgICB9KSk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkTm90ZXM7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGAub2JzaWRpYW4vYXBwLmpzb25gIHNldHRpbmdzIHRoZSB2YXVsdCBjb21taXRzIHRoYXQgYG9ic2lkaWFuLWRldi11dGlsc2Agb3ducyBhbmQgd3JpdGVzXG4gICAqIGludG8gdGhlIGFyY2hpdmVkIHZhdWx0IGl0c2VsZi4gQSBjb21taXR0ZWQgb25lIGlzIGEgc2Vjb25kIGNvcHkgb2YgYSBzZXR0aW5nIG5vdGhpbmcgcmVjb25jaWxlcywgYW5kXG4gICAqIGl0IGlzIHRoZSBjb3B5IHRoYXQgZ29lcyBzdGFsZSBcdTIwMTQgc28gdGhlIGNvbnZlbnRpb24gaXMgdGhhdCB0aGUgdmF1bHQgY29tbWl0cyBub25lIG9mIHRoZW0uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBuYW1lcyBvZiB0aGUgb3duZWQgc2V0dGluZ3MgdGhlIGNvbW1pdHRlZCBgYXBwLmpzb25gIHNldHMuIEEgdmF1bHQgdGhhdCBjb21taXRzIG5vXG4gICAqIGBhcHAuanNvbmAgYXQgYWxsIGlzIGZpbmUsIGFuZCB5aWVsZHMgbm9uZS5cbiAgICovXG4gIHB1YmxpYyBmaW5kQ29tbWl0dGVkQXBwSnNvblNldHRpbmdzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhcHBKc29uUGF0aCA9IGpvaW4odGhpcy5kZW1vVmF1bHRGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5BcHBKc29uKTtcbiAgICBjb25zdCBjb250ZW50ID0gZXhpc3RzU3luYyhhcHBKc29uUGF0aCkgPyByZWFkRmlsZVN5bmMoYXBwSnNvblBhdGgsICd1dGYtOCcpIDogbnVsbDtcbiAgICByZXR1cm4gZmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzKHsgYXBwSnNvbjogcGFyc2VEZW1vVmF1bHRBcHBKc29uKHsgY29udGVudCwgcGF0aDogYXBwSnNvblBhdGggfSkgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgY2FycnlpbmcgYSBgW0RvY3NdKFx1MjAyNilgIGxpbmsgbGluZS4gVGhlIG5vdGUgSVMgdGhlIGRvY3VtZW50YXRpb24sIHNvIGEgbGluZSBwb2ludGluZ1xuICAgKiBlbHNld2hlcmUgZm9yIHRoZSByZWFsIGV4cGxhbmF0aW9uIGlzIHRoZSBzaGFwZSB0aGlzIGNvbnZlbnRpb24gZXhpc3RzIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aERvY3NMaW5rcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+IGdldExpbmVzT3V0c2lkZUZlbmNlcyhub3RlLmNvbnRlbnQpLnNvbWUoKGxpbmUpID0+IERPQ1NfTElOS19SRUdfRVhQLnRlc3QobGluZSkpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHRoYXQgZG8gbm90IG9wZW4gd2l0aCBhbiBgIyBIMWAgKGZyb250bWF0dGVyIGFzaWRlKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aG91dEgxKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4gIWhhc0gxKG5vdGUuY29udGVudCkpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgd2l0aCBubyBwcm9zZSBwYXJhZ3JhcGggYmVmb3JlIHRoZWlyIGZpcnN0IGNvZGUgZmVuY2UgXHUyMDE0IHRoZSAxLTMgc2VudGVuY2VzIHNheWluZyB3aGF0IHRoZVxuICAgKiBmZWF0dXJlIGRvZXMgYW5kIHdoeSBhIHJlYWRlciB3b3VsZCB3YW50IGl0LCB3aXRob3V0IHdoaWNoIHRoZSBub3RlIGlzIGEgYnV0dG9uIHdpdGggbm8gbGVzc29uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRob3V0SW50cm9Qcm9zZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+ICFoYXNJbnRyb1Byb3NlKG5vdGUuY29udGVudCkpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgd2hvc2Ugd2lraWxpbmsgYWxsb3dhbmNlIGlzIG5vdCBkb2luZyBhbnkgd29yayBcdTIwMTQgZGVjbGFyZWQgd2l0aG91dCBhIHJlYXNvbiwgb3Igb24gYSBub3RlXG4gICAqIHRoYXQgY2FycmllcyBubyB3aWtpbGluayBhdCBhbGwuIEJvdGggYXJlIGRyaWZ0OiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCBhbmQgb25lIG5vdGhpbmcgbmVlZHNcbiAgICogYW55IG1vcmUsIHdoaWNoIHdvdWxkIGdvIG9uIGhpZGluZyB0aGUgbmV4dCB3aWtpbGluayBzb21lYm9keSBhZGRzIGJ5IGFjY2lkZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRoVW5qdXN0aWZpZWRXaWtpbGlua0FsbG93YW5jZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKCkuZmxhdE1hcCgobm90ZSkgPT4ge1xuICAgICAgY29uc3Qgc2NhbiA9IHNjYW5XaWtpbGlua0RpcmVjdGl2ZXMobm90ZS5jb250ZW50KTtcbiAgICAgIGNvbnN0IHByb2JsZW1zID0gWy4uLnNjYW4ucHJvYmxlbXNdO1xuICAgICAgY29uc3QgcmVhc29uID0gcmVhZFdpa2lsaW5rQWxsb3dhbmNlUmVhc29uKG5vdGUuY29udGVudCk7XG4gICAgICBpZiAocmVhc29uICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChyZWFzb24udHJpbSgpID09PSAnJykge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goJ2Egbm90ZS1sZXZlbCBhbGxvd2FuY2Ugd2l0aCBubyByZWFzb24nKTtcbiAgICAgICAgfSBlbHNlIGlmICghaGFzV2lraWxpbmsobm90ZS5jb250ZW50KSkge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goJ2Egbm90ZS1sZXZlbCBhbGxvd2FuY2UgY292ZXJpbmcgbm8gd2lraWxpbmsnKTtcbiAgICAgICAgfSBlbHNlIGlmIChzY2FuLmFsbG93ZWRMaW5lSW5kZXhlcy5zaXplID4gMCkge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goJ2lubGluZSBkaXJlY3RpdmVzIHRoZSBub3RlLWxldmVsIGFsbG93YW5jZSBhbHJlYWR5IGNvdmVycycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvYmxlbXMubWFwKChwcm9ibGVtKSA9PiBgJHtub3RlLnJlbGF0aXZlUGF0aH06ICR7cHJvYmxlbX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB1c2luZyBhbiBPYnNpZGlhbiBgW1t3aWtpbGlua11dYCBvdXRzaWRlIGEgY29kZSBmZW5jZS4gVGhlIGRlbW8gdmF1bHQgaXMgYWxzbyByZWFkIG9uXG4gICAqIEdpdEh1Yiwgd2hlcmUgYSB3aWtpbGluayByZW5kZXJzIGFzIGxpdGVyYWwgYnJhY2tldHMgYW5kIGxlYWRzIG5vd2hlcmUuIEEgd2lraWxpbmsgc2hvd24gSU5TSURFIGFcbiAgICogZmVuY2UgaXMgc2FtcGxlIHRleHQsIG5vdCBuYXZpZ2F0aW9uLCBzbyBmZW5jZWQgYmxvY2tzIGFyZSBza2lwcGVkLCBhcyBpcyBhIG5vdGUgdGhhdCBkZWNsYXJlcyBpbiBpdHNcbiAgICogZnJvbnRtYXR0ZXIgd2h5IGl0cyB3aWtpbGlua3MgYXJlIHRoZSBwb2ludCBcdTIwMTQgc2VlIHRoZSBmaWxlIG92ZXJ2aWV3LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRoV2lraWxpbmtzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4ge1xuICAgICAgICBpZiAocmVhZFdpa2lsaW5rQWxsb3dhbmNlUmVhc29uKG5vdGUuY29udGVudCkgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBhbGxvd2VkTGluZUluZGV4ZXMgfSA9IHNjYW5XaWtpbGlua0RpcmVjdGl2ZXMobm90ZS5jb250ZW50KTtcbiAgICAgICAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKG5vdGUuY29udGVudCkuc29tZSgobGluZUluZGV4KSA9PiAhYWxsb3dlZExpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbWVtYmVycyB0aGF0IHRoZSBkZW1vIG5vdGVzIHJlZmVyZW5jZSBvbiBhIHJlY2VpdmVyIGJ1dCB0aGF0IG5vIGxvbmdlciBleGlzdCBvbiBpdCAocmVuYW1lIGRyaWZ0KS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3Qgc3RhbGUgbWVtYmVyIG5hbWVzIHJlZmVyZW5jZWQgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcHVibGljIGZpbmRTdGFsZVJlZmVyZW5jZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kU3RhbGVSZWZlcmVuY2VzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZhbGlkTWVtYmVycyA9IG5ldyBTZXQocGFyYW1zLnZhbGlkTWVtYmVycyk7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IFsuLi50aGlzLnJlYWRDb3JwdXMoKS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgJHtwYXJhbXMucmVjZWl2ZXJ9XFwuKD88bWVtYmVyPlxcdyspYCwgJ2cnKSldXG4gICAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21lbWJlcicpKTtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQocmVmZXJlbmNlZCldLmZpbHRlcigobWVtYmVyKSA9PiAhdmFsaWRNZW1iZXJzLmhhcyhtZW1iZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBtZW1iZXJzIHRoYXQgYXJlIG5vdCBkZW1vbnN0cmF0ZWQgYW55d2hlcmUgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBtZW1iZXIgbmFtZXMgd2l0aCBubyBkZW1vbnN0cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvcnB1cyA9IHRoaXMucmVhZENvcnB1cygpO1xuICAgIHJldHVybiBwYXJhbXMubWVtYmVycy5maWx0ZXIoKG1lbWJlcikgPT4ge1xuICAgICAgY29uc3QgbmVlZGxlID0gcGFyYW1zLnJlY2VpdmVyID09PSB1bmRlZmluZWQgPyBtZW1iZXIgOiBgJHtwYXJhbXMucmVjZWl2ZXJ9LiR7bWVtYmVyfWA7XG4gICAgICByZXR1cm4gIWNvcnB1cy5pbmNsdWRlcyhuZWVkbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGZlYXR1cmUgZG9jcyB0aGF0IG5vIGRlbW8gbm90ZSBsaW5rcyB0by5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZmVhdHVyZS1kb2MgYmFzZW5hbWVzICh3aXRob3V0IGAubWRgKSBub3QgbGlua2VkIGZyb20gYW55IGRlbW8gbm90ZS5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5saW5rZWRGZWF0dXJlRG9jcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5vbkZlYXR1cmVEb2NzID0gbmV3IFNldChwYXJhbXMubm9uRmVhdHVyZURvY3MpO1xuICAgIGNvbnN0IGZlYXR1cmVEb2NzID0gcmVhZGRpclN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5kb2NzRm9sZGVyKSlcbiAgICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKVxuICAgICAgLm1hcCgoZmlsZSkgPT4gZmlsZS5yZXBsYWNlKC9cXC5tZCQvLCAnJykpXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAhbm9uRmVhdHVyZURvY3MuaGFzKG5hbWUpKTtcbiAgICBjb25zdCBsaW5rZWREb2NzID0gbmV3IFNldChcbiAgICAgIFsuLi50aGlzLnJlYWRDb3JwdXMoKS5tYXRjaEFsbCgvZG9jc1xcLyg/PGRvYz5bXFx3LV0rKVxcLm1kL2cpXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnZG9jJykpXG4gICAgKTtcbiAgICByZXR1cm4gZmVhdHVyZURvY3MuZmlsdGVyKChkb2MpID0+ICFsaW5rZWREb2NzLmhhcyhkb2MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB0aGF0IGNhbm5vdCBiZSByZWFjaGVkIGZyb20gdGhlIHN0YXJ0IG5vdGUgYnkgZm9sbG93aW5nIE1hcmtkb3duIGxpbmtzIGJldHdlZW4gbm90ZXMuXG4gICAqXG4gICAqIFRoZSB3YWxrIHN0YXJ0cyBhdCB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMuc3RhcnROb3RlfSBhbmQgZm9sbG93c1xuICAgKiBldmVyeSBgW1RleHRdKDwuL05OIE5hbWUubWQ+KWAgbGluayBvdXRzaWRlIGEgY29kZSBmZW5jZSwgdHJhbnNpdGl2ZWx5LiBBIG5vdGUgbm90aGluZyBsaW5rcyB0byBpc1xuICAgKiBvbmUgYSByZWFkZXIgY2FuIG9ubHkgZmluZCBieSBicm93c2luZyB0aGUgZmlsZSBsaXN0IFx1MjAxNCB3aGljaCBpcyBleGFjdGx5IHdoYXQgdGhlIGdyb3VwZWQgaW5kZXggaW4gdGhlXG4gICAqIHN0YXJ0IG5vdGUgaXMgbWVhbnQgdG8gcmVwbGFjZS4gV2hlbiB0aGUgc3RhcnQgbm90ZSBpdHNlbGYgaXMgbWlzc2luZywgRVZFUlkgbm90ZSBpcyB1bnJlYWNoYWJsZSxcbiAgICogYmVjYXVzZSB0aGVyZSBpcyBub3doZXJlIHRvIHN0YXJ0IGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHdhbGsuXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgdW5yZWFjaGFibGUgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZFVucmVhY2hhYmxlTm90ZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5yZWFjaGFibGVOb3Rlc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBub3Rlc0J5UmVsYXRpdmVQYXRoID0gbmV3IE1hcCh0aGlzLmNvbGxlY3ROb3RlcygpLm1hcCgobm90ZSkgPT4gW25vdGUucmVsYXRpdmVQYXRoLCBub3RlXSkpO1xuICAgIGNvbnN0IHJlYWNoZWROb3RlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHBlbmRpbmdOb3RlcyA9IFtwYXJhbXMuc3RhcnROb3RlXTtcblxuICAgIHdoaWxlIChwZW5kaW5nTm90ZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm90ZVBhdGggPSBlbnN1cmVOb25OdWxsYWJsZShwZW5kaW5nTm90ZXMucG9wKCkpO1xuICAgICAgY29uc3Qgbm90ZSA9IG5vdGVzQnlSZWxhdGl2ZVBhdGguZ2V0KG5vdGVQYXRoKTtcbiAgICAgIGlmICghbm90ZSB8fCByZWFjaGVkTm90ZXMuaGFzKG5vdGVQYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlYWNoZWROb3Rlcy5hZGQobm90ZVBhdGgpO1xuICAgICAgcGVuZGluZ05vdGVzLnB1c2goLi4uY29sbGVjdE5vdGVMaW5rVGFyZ2V0cyhub3RlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKVxuICAgICAgLmZpbHRlcigobm90ZVBhdGgpID0+ICFyZWFjaGVkTm90ZXMuaGFzKG5vdGVQYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBuYW1lcyBvZiB0aGUgYGV4cG9ydCBmdW5jdGlvbmBzIChpbmNsdWRpbmcgYGFzeW5jYCBhbmQgZ2VuZXJhdG9yIGRlY2xhcmF0aW9ucykgaW4gYSBzb3VyY2UgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZXhwb3J0ZWQgZnVuY3Rpb24gbmFtZXMgaW4gc291cmNlIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGdldEV4cG9ydGVkRnVuY3Rpb25OYW1lcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPSByZWFkRmlsZVN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5zb3VyY2VQYXRoKSwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIFsuLi5zb3VyY2UubWF0Y2hBbGwoL15leHBvcnQgKD86YXN5bmMgKT9mdW5jdGlvblxcKj8gKD88bmFtZT5cXHcrKS9nbSldXG4gICAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBtZW1iZXJzIG9mIGFuIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgZGVjbGFyZWQgaW4gYSBzb3VyY2UgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgcGFyc2VkIHtAbGluayBJbnRlcmZhY2VNZW1iZXJzfS5cbiAgICogQHRocm93cyBXaGVuIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgc291cmNlIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0SW50ZXJmYWNlTWVtYmVycyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEludGVyZmFjZU1lbWJlcnNQYXJhbXMpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgICBjb25zdCBzb3VyY2UgPSByZWFkRmlsZVN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5zb3VyY2VQYXRoKSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgZXhwb3J0ICg/PGtleXdvcmQ+aW50ZXJmYWNlfGNsYXNzfGVudW0pICR7cGFyYW1zLmludGVyZmFjZU5hbWV9XFxiW157XSpcXHsoPzxib2R5PltcXHNcXFNdKj8pXFxuXFx9YCkuZXhlYyhzb3VyY2UpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgaW50ZXJmYWNlICR7cGFyYW1zLmludGVyZmFjZU5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZU1lbWJlcnMoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2tleXdvcmQnKSwgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2JvZHknKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIGNhY2hlcyB0aGUgZGVtbyBjb3JwdXMgXHUyMDE0IGV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0IGpvaW5lZCBpbnRvIG9uZSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjb25jYXRlbmF0ZWQgZGVtby1ub3RlIGNvbnRlbnRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRDb3JwdXMoKTogc3RyaW5nIHtcbiAgICB0aGlzLmNhY2hlZENvcnB1cyA/Pz0gdGhpcy5jb2xsZWN0Tm90ZXMoKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5jb250ZW50KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZENvcnB1cztcbiAgfVxuXG4gIC8vIFRoZSBub3RlcyB0aGUgYXV0aG9yaW5nIGNoZWNrcyBhcHBseSB0bzogZXZlcnkgbm90ZSBleGNlcHQgdGhlIG9uZXMgZGVjbGFyZWQgb3V0c2lkZSB0aGUgbGVhcm5pbmdcbiAgLy8gUGF0aCAodGhlIHZhdWx0J3Mgb3duIGBSRUFETUUubWRgIGJ5IGRlZmF1bHQpLlxuICBwcml2YXRlIGNvbGxlY3RDaGVja2FibGVOb3RlcygpOiBEZW1vVmF1bHROb3RlW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3ROb3RlcygpLmZpbHRlcigobm90ZSkgPT4gIXRoaXMuZXhjbHVkZWROb3Rlcy5oYXMobm90ZS5yZWxhdGl2ZVBhdGgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdE1hcmtkb3duRmlsZXMoZm9sZGVyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlmIChlbnRyeS5uYW1lID09PSBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Ob2RlTW9kdWxlcyBhcyBzdHJpbmcpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmNvbGxlY3RNYXJrZG93bkZpbGVzKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSkpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICByZXN1bHQucHVzaChqb2luKGZvbGRlciwgZW50cnkubmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgYHZpdGVzdGAgc3VpdGUgdGhhdCBrZWVwcyBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCBpbiBzeW5jIHdpdGggaXRzIHB1YmxpYyBzdXJmYWNlLlxuICpcbiAqIENhbGwgaXQgb25jZSBmcm9tIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQubm8tYXBwLmludGVncmF0aW9uLnRlc3QudHNgOyBpdCByZWdpc3RlcnMgb25lIHRlc3QgcGVyIGNoZWNrLFxuICogZGVsZWdhdGluZyB0byB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyfS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRlY2xhcmF0aXZlIGNvdmVyYWdlIHNwZWNpZmljYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGUocGFyYW1zOiBSZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgY2hlY2tlciA9IG5ldyBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zPih7XG4gICAgZXhjbHVkZWROb3RlczogcGFyYW1zLmF1dGhvcmluZz8uZXhjbHVkZWROb3RlcyxcbiAgICByb290Rm9sZGVyOiBwYXJhbXMucm9vdEZvbGRlclxuICB9KSk7XG4gIGNvbnN0IHN0YXJ0Tm90ZSA9IHBhcmFtcy5hdXRob3Jpbmc/LnN0YXJ0Tm90ZSA/PyBERUZBVUxUX1NUQVJUX05PVEU7XG5cbiAgZGVzY3JpYmUoJ2RlbW8tdmF1bHQgY292ZXJhZ2UnLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5pbnRlcmZhY2VzKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSAke3NwZWMua2luZH1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGNvbnN0IGRlbW9uc3RyYXRlZCA9IG1lbWJlcnNbc3BlYy5raW5kXTtcbiAgICAgICAgZXhwZWN0KGRlbW9uc3RyYXRlZC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGRlbW9uc3RyYXRlZCwgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KGByZWZlcmVuY2VzIG5vICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kU3RhbGVSZWZlcmVuY2VzKHsgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIsIHZhbGlkTWVtYmVyczogbWVtYmVycy5hbGwgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5jb25maWdJbnRlcmZhY2VzKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBvcHRpb25gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChtZW1iZXJzLnByb3BlcnRpZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBtZW1iZXJzLnByb3BlcnRpZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5mdW5jdGlvbk1vZHVsZXMgPz8gW10pIHtcbiAgICAgIGl0KGBkZW1vbnN0cmF0ZXMgZXZlcnkgZXhwb3J0ZWQgZnVuY3Rpb24gaW4gJHtzcGVjLnNvdXJjZVBhdGh9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gY2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChmdW5jdGlvbk5hbWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogZnVuY3Rpb25OYW1lcyB9KSkudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NzID0gcGFyYW1zLmRvY3M7XG4gICAgaWYgKGRvY3MpIHtcbiAgICAgIGl0KCdsaW5rcyBhIGRlbW8gbm90ZSBmb3IgZXZlcnkgZmVhdHVyZSBkb2MnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzKHsgZG9jc0ZvbGRlcjogZG9jcy5mb2xkZXIsIG5vbkZlYXR1cmVEb2NzOiBkb2NzLm5vbkZlYXR1cmVEb2NzIH0pKVxuICAgICAgICAgIC50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdvcGVucyBldmVyeSBub3RlIHdpdGggYW4gSDEnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SDEoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGEgcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSBpdHMgZmlyc3QgY29kZSBibG9jaycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhvdXRJbnRyb1Byb3NlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoYHJlYWNoZXMgZXZlcnkgbm90ZSBmcm9tICR7c3RhcnROb3RlfWAsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbnJlYWNoYWJsZU5vdGVzKHsgc3RhcnROb3RlIH0pKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIG5vIHdpa2lsaW5rcywgd2hpY2ggZG8gbm90IHJlbmRlciBvbiBHaXRIdWInLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoV2lraWxpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2p1c3RpZmllcyBldmVyeSB3aWtpbGluayBhbGxvd2FuY2UsIGFuZCBkZWNsYXJlcyBub25lIGl0IG5vIGxvbmdlciBuZWVkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhcnJpZXMgbm8gRG9jcyBsaW5rIGxpbmUsIGJlY2F1c2UgdGhlIG5vdGUgaXMgdGhlIGRvY3MnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoRG9jc0xpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbW1pdHMgbm9uZSBvZiB0aGUgYXBwLmpzb24gc2V0dGluZ3Mgb2JzaWRpYW4tZGV2LXV0aWxzIGluamVjdHMgYXQgcmVsZWFzZSB0aW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZENvbW1pdHRlZEFwcEpzb25TZXR0aW5ncygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdrZWVwcyB0aGUgcmVmbGVjdGVkIHN1cmZhY2Ugbm9uLXRyaXZpYWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBndWFyZCA9IHBhcmFtcy5ub25Ucml2aWFsR3VhcmQ7XG4gICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKGd1YXJkKTtcbiAgICAgIGV4cGVjdChtZW1iZXJzLmFsbCkudG9Db250YWluKGd1YXJkLmV4cGVjdE1lbWJlcik7XG4gICAgICBleHBlY3QoY2hlY2tlci5jb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCkpLnRvQ29udGFpbihndWFyZC5leHBlY3REZW1vTm90ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5jb25zdCBDTEFTU19NRU1CRVJfTU9ESUZJRVJTID0gU3RyaW5nLnJhd2AoPzooPzpwdWJsaWN8cHJpdmF0ZXxwcm90ZWN0ZWR8cmVhZG9ubHl8c3RhdGljfGFic3RyYWN0fG92ZXJyaWRlKVxccyspKmA7XG5jb25zdCBBQlNPTFVURV9VUkxfUkVHX0VYUCA9IC9eW2Etel1bXFx3Ky4tXSo6L2k7XG5jb25zdCBBTkdMRV9CUkFDS0VUU19SRUdfRVhQID0gL148fD4kL2c7XG5jb25zdCBDT0RFX0ZFTkNFX1JFR19FWFAgPSAvXlxccyooPzpgYGB8fn5+KS87XG5jb25zdCBERUZBVUxUX0VYQ0xVREVEX05PVEVTID0gWydSRUFETUUubWQnXTtcbmNvbnN0IERFRkFVTFRfU1RBUlRfTk9URSA9ICcwMCBTdGFydC5tZCc7XG5jb25zdCBET0NTX0xJTktfUkVHX0VYUCA9IC9eXFxzKlxcW0RvY3NdXFwoLztcbmNvbnN0IEZST05UTUFUVEVSX1JFR19FWFAgPSAvXi0tLVxccj9cXG5bXFxzXFxTXSo/XFxyP1xcbi0tLVteXFxTXFxuXSpcXHI/XFxuPy87XG5jb25zdCBIMV9SRUdfRVhQID0gL14jIFxcUy87XG5jb25zdCBIRUFESU5HX1JFR19FWFAgPSAvXiN7MSw2fSAvO1xuY29uc3QgSU5MSU5FX0NPREVfUkVHX0VYUCA9IC9gW15gXFxuXSpgL2c7XG5jb25zdCBNQVJLRE9XTl9MSU5LX1JFR19FWFAgPSAvXFxbW15cXF1dKl1cXCgoPzx0YXJnZXQ+W14pXSspXFwpL2c7XG4vLyBBbiBpbmxpbmUgZGlyZWN0aXZlLCBzaGFwZWQgYWZ0ZXIgRVNMaW50J3MgYW5kIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBCT1RIIGluXG4vLyBPYnNpZGlhbiBhbmQgb24gR2l0SHViIFx1MjAxNCB0aGUgc2FtZSBzcGVsbGluZyB0aGUgdmF1bHRzIGFscmVhZHkgdXNlIGZvciBgbWFya2Rvd25saW50LWRpc2FibGUtbmV4dC1saW5lYC5cbi8vIEFuIE9ic2lkaWFuIGAlJSBcdTIwMjYgJSVgIGNvbW1lbnQgd291bGQgc2hvdyB1cCBhcyBsaXRlcmFsIHRleHQgb24gR2l0SHViLCB3aGljaCBpcyBoYWxmIHRoZSByZWFkZXJzaGlwLlxuY29uc3QgRElSRUNUSVZFX1JFR19FWFAgPSAvXlxccyo8IS0tXFxzKm9ic2lkaWFuLWRldi11dGlscy0oPzxhY3Rpb24+ZGlzYWJsZS1uZXh0LWxpbmV8ZGlzYWJsZXxlbmFibGUpXFxzKyg/PHJ1bGU+W1xcdy1dK1xcL1tcXHctXSspKD86XFxzKy0tXFxzKyg/PHJlYXNvbj4uKj8pKT9cXHMqLS0+XFxzKiQvO1xuLy8gQ2F0Y2hlcyBhIGRpcmVjdGl2ZSB0aGF0IHdhcyBNRUFOVCB0byBiZSBvbmUgYnV0IGlzIG1pc3NwZWxsZWQ6IGl0IHdvdWxkIG90aGVyd2lzZSByZWFkIGFzIGFuIG9yZGluYXJ5XG4vLyBDb21tZW50IGFuZCBzaWxlbnRseSBkbyBub3RoaW5nLCB3aGljaCBpcyB0aGUgZmFpbHVyZSBtb2RlIGEgc3VwcHJlc3Npb24gc3ludGF4IG11c3QgbmV2ZXIgaGF2ZS5cbmNvbnN0IERJUkVDVElWRV9QUk9CRV9SRUdfRVhQID0gLzwhLS1cXHMqb2JzaWRpYW4tZGV2LXV0aWxzLS87XG5jb25zdCBXSUtJTElOS19SVUxFID0gJ2RlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MnO1xuLy8gVGhlIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGZyb250bWF0dGVyIHBhdGgsIGF0IGFueSBpbmRlbnRhdGlvbjpcbi8vIFRoZSBrZXlzIG11c3QgbmVzdCBpbiB0aGF0IG9yZGVyLCBhbmQgYW55IGxpbmUgYmV0d2VlbiB0aGVtIGhhcyB0byBzdGF5IGluZGVudGVkLCBzbyBhIGRlZGVudCB0byB0aGVcbi8vIERvY3VtZW50J3Mgb3duIHRvcCBsZXZlbCBlbmRzIHRoZSBtYXRjaCByYXRoZXIgdGhhbiByZWFjaGluZyBhIHNhbWUtbmFtZWQga2V5IHVuZGVyIGFub3RoZXIgcGFyZW50LlxuY29uc3QgV0lLSUxJTktfQUxMT1dBTkNFX1JFR19FWFAgPSAvXm9ic2lkaWFuLWRldi11dGlsczpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2RlbW8tdmF1bHQtdmFsaWRhdGlvbjpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2FsbG93LXdpa2lsaW5rczooPzxyZWFzb24+LiopJC9tO1xuY29uc3QgV0lLSUxJTktfUkVHX0VYUCA9IC9cXFtcXFtbXlxcXV0rXV0vO1xuXG4vLyBBcHBsaWVzIG9uZSBwYXJzZWQgZGlyZWN0aXZlIHRvIHRoZSBzY2FuLlxuZnVuY3Rpb24gYXBwbHlXaWtpbGlua0RpcmVjdGl2ZShzdGF0ZTogV2lraWxpbmtEaXJlY3RpdmVTY2FuU3RhdGUsIGxpbmVJbmRleDogbnVtYmVyLCBtYXRjaDogUmVnRXhwRXhlY0FycmF5KTogdm9pZCB7XG4gIGNvbnN0IGFjdGlvbiA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdhY3Rpb24nKTtcbiAgY29uc3QgcnVsZSA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdydWxlJyk7XG4gIGNvbnN0IHJlYXNvbiA9IG1hdGNoLmdyb3Vwcz8uWydyZWFzb24nXT8udHJpbSgpID8/ICcnO1xuICBpZiAocnVsZSAhPT0gV0lLSUxJTktfUlVMRSkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGFuIHVua25vd24gcnVsZSBcIiR7cnVsZX1cIiBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFjdGlvbiAhPT0gJ2VuYWJsZScgJiYgcmVhc29uID09PSAnJykge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlyZWN0aXZlIHdpdGggbm8gcmVhc29uIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhY3Rpb24gPT09ICdkaXNhYmxlLW5leHQtbGluZScpIHtcbiAgICBzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCA9IGxpbmVJbmRleDtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnZGlzYWJsZScpIHtcbiAgICBpZiAoc3RhdGUub3BlblJlZ2lvbikge1xuICAgICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfSBpbnNpZGUgdGhlIHJlZ2lvbiBvcGVuZWQgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHN0YXRlLm9wZW5SZWdpb24ubGluZUluZGV4KX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGUub3BlblJlZ2lvbiA9IHsgaXNVc2VkOiBmYWxzZSwgbGluZUluZGV4IH07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFzdGF0ZS5vcGVuUmVnaW9uKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYW4gZW5hYmxlIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfSB3aXRoIG5vIHJlZ2lvbiBvcGVuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghc3RhdGUub3BlblJlZ2lvbi5pc1VzZWQpIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIHJlZ2lvbiBvcGVuZWQgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHN0YXRlLm9wZW5SZWdpb24ubGluZUluZGV4KX0gY292ZXJpbmcgbm8gd2lraWxpbmtgKTtcbiAgfVxuICBzdGF0ZS5vcGVuUmVnaW9uID0gbnVsbDtcbn1cblxuLy8gQXBwbGllcyBvbmUgb3JkaW5hcnkgbGluZSB0byB0aGUgc2NhbjogYW4gb3BlbiByZWdpb24gY292ZXJzIGl0LCBhbmQgYSBwZW5kaW5nIGBkaXNhYmxlLW5leHQtbGluZWBcbi8vIENsYWltcyB0aGUgZmlyc3QgbGluZSB3aXRoIGNvbnRlbnQgb24gaXQgXHUyMDE0IHRoZSBkaXJlY3RpdmUgYW5kIGl0cyB0YXJnZXQgYXJlIHVzdWFsbHkgYSBibGFuayBsaW5lIGFwYXJ0LlxuZnVuY3Rpb24gYXBwbHlXaWtpbGlua1NjYW5MaW5lKHN0YXRlOiBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSwgbGluZUluZGV4OiBudW1iZXIsIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoc3RhdGUub3BlblJlZ2lvbikge1xuICAgIHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlcy5hZGQobGluZUluZGV4KTtcbiAgICBzdGF0ZS5vcGVuUmVnaW9uLmlzVXNlZCB8fD0gc3RhdGUud2lraWxpbmtMaW5lSW5kZXhlcy5oYXMobGluZUluZGV4KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ID09PSBudWxsIHx8IGxpbmUudHJpbSgpID09PSAnJykge1xuICAgIHJldHVybjtcbiAgfVxuICBzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXMuYWRkKGxpbmVJbmRleCk7XG4gIGlmICghc3RhdGUud2lraWxpbmtMaW5lSW5kZXhlcy5oYXMobGluZUluZGV4KSkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZS1uZXh0LWxpbmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4KX0gY292ZXJpbmcgbm8gd2lraWxpbmtgKTtcbiAgfVxuICBzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWVtYmVycyhtZXRob2RzOiBzdHJpbmdbXSwgcHJvcGVydGllczogc3RyaW5nW10pOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgcmV0dXJuIHtcbiAgICBhbGw6IFsuLi5tZXRob2RzLCAuLi5wcm9wZXJ0aWVzXSxcbiAgICBtZXRob2RzLFxuICAgIHByb3BlcnRpZXNcbiAgfTtcbn1cblxuLy8gUmVzb2x2ZXMgdGhlIG5vdGVzIGEgbm90ZSBsaW5rcyB0bzogZXZlcnkgTWFya2Rvd24gbGluayBvdXRzaWRlIGEgY29kZSBmZW5jZSB3aG9zZSB0YXJnZXQgaXMgYSBgLm1kYFxuLy8gRmlsZSwgbWFkZSByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBzbyBpdCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBub3RlIG1hcC4gRXh0ZXJuYWwgVVJMcyBhbmRcbi8vIE5vbi1ub3RlIHRhcmdldHMgKGltYWdlcywgc2NyaXB0cykgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsZWFybmluZyBwYXRoIGFuZCBhcmUgc2tpcHBlZDsgYSBgI2FuY2hvcmAgaXNcbi8vIERyb3BwZWQsIHNpbmNlIGl0IGFkZHJlc3NlcyBhIHBsYWNlIGluc2lkZSBhbiBhbHJlYWR5LXJlc29sdmVkIG5vdGUuXG4vLyBSZXR1cm5zIHRoZSBub3RlJ3MgbGluZXMgd2l0aCBmZW5jZWQgY29kZSBibG9ja3MgcmVtb3ZlZCAodGhlIGZlbmNlIGxpbmVzIGluY2x1ZGVkKSwgcGFpcmVkIHdpdGggdGhlXG4vLyBMaW5lIG51bWJlciBlYWNoIGNhbWUgZnJvbSwgc28gYSBjaGVjayBuZXZlciBtaXN0YWtlcyBzYW1wbGUgY29kZSBmb3IgcHJvc2UgXHUyMDE0IGEgYFtbd2lraWxpbmtdXWBcbi8vIERlbW9uc3RyYXRlZCBpbnNpZGUgYSBmZW5jZSBpcyB0ZXh0LCBub3QgbmF2aWdhdGlvbiBcdTIwMTQgYW5kIGFuIGlubGluZSBkaXJlY3RpdmUgY2FuIHN0aWxsIG5hbWUgYSBsaW5lLlxuZnVuY3Rpb24gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBOb3RlTGluZVtdIHtcbiAgY29uc3Qgbm90ZUxpbmVzOiBOb3RlTGluZVtdID0gW107XG4gIGxldCBpc0luc2lkZUZlbmNlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoQ09ERV9GRU5DRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIGlzSW5zaWRlRmVuY2UgPSAhaXNJbnNpZGVGZW5jZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWlzSW5zaWRlRmVuY2UpIHtcbiAgICAgIG5vdGVMaW5lcy5wdXNoKHsgaW5kZXgsIGxpbmUgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3RlTGluZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZTogRGVtb1ZhdWx0Tm90ZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdGFyZ2V0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGdldExpbmVzT3V0c2lkZUZlbmNlcyhub3RlLmNvbnRlbnQpKSB7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBzdHJpcElubGluZUNvZGUobGluZSkubWF0Y2hBbGwoTUFSS0RPV05fTElOS19SRUdfRVhQKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnJlcGxhY2VBbGwoQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCwgJycpO1xuICAgICAgY29uc3QgW25vdGVQYXRoID0gJyddID0gdGFyZ2V0LnNwbGl0KCcjJywgMSk7XG4gICAgICBpZiAoQUJTT0xVVEVfVVJMX1JFR19FWFAudGVzdChub3RlUGF0aCkgfHwgIW5vdGVQYXRoLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0cy5wdXNoKGpvaW4oZGlybmFtZShub3RlLnJlbGF0aXZlUGF0aCksIHRyeURlY29kZVVyaUNvbXBvbmVudChub3RlUGF0aCkpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldHM7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGNsYXNzQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmNsYXNzQm9keS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgXiB7Mn0oPzxtb2RpZmllcnM+JHtDTEFTU19NRU1CRVJfTU9ESUZJRVJTfSkoPzxuYW1lPlxcdyspKD86PFtePl0qPik/XFwoYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc1Byb3BlcnR5TmFtZXMoY2xhc3NCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uY2xhc3NCb2R5Lm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeIHsyfSg/PG1vZGlmaWVycz4ke0NMQVNTX01FTUJFUl9NT0RJRklFUlN9KSg/PG5hbWU+XFx3KylcXHMqXFw/P1xccypbOj1dYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoZW51bUJvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5lbnVtQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspL2dtKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RNZXRob2ROYW1lcyhpbnRlcmZhY2VCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uaW50ZXJmYWNlQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspKD86PFtePl0qPik/XFwoL2dtKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm9wZXJ0eU5hbWVzKGludGVyZmFjZUJvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/PG5hbWU+XFx3KylcXD8/Oi9nbSldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xufVxuXG4vLyBUaGUgbGluZSBudW1iZXJzIGNhcnJ5aW5nIGEgd2lraWxpbmsgdGhhdCBpcyBuYXZpZ2F0aW9uIHJhdGhlciB0aGFuIHNhbXBsZSB0ZXh0LlxuZnVuY3Rpb24gZmluZFdpa2lsaW5rTGluZUluZGV4ZXMoY29udGVudDogc3RyaW5nKTogbnVtYmVyW10ge1xuICByZXR1cm4gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50KVxuICAgIC5maWx0ZXIoKG5vdGVMaW5lKSA9PiBXSUtJTElOS19SRUdfRVhQLnRlc3Qoc3RyaXBJbmxpbmVDb2RlKG5vdGVMaW5lLmxpbmUpKSlcbiAgICAubWFwKChub3RlTGluZSkgPT4gbm90ZUxpbmUuaW5kZXgpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBsaW5lICR7U3RyaW5nKGxpbmVJbmRleCArIDEpfWA7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBjb2xsZWN0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQpLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmxpbmUpO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlJ3MgZmlyc3QgY29udGVudCBsaW5lIChmcm9udG1hdHRlciBhbmQgYmxhbmsgbGluZXMgYXNpZGUpIGlzIGFuIGAjIEgxYC5cbmZ1bmN0aW9uIGhhc0gxKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaXBGcm9udG1hdHRlcihjb250ZW50KS5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gSDFfUkVHX0VYUC50ZXN0KHRyaW1tZWRMaW5lKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFdoZXRoZXIgYSBwbGFpbiBwcm9zZSBsaW5lIGFwcGVhcnMgYmVmb3JlIHRoZSBub3RlJ3MgZmlyc3QgY29kZSBmZW5jZS4gSGVhZGluZ3MgYXJlIG5vdCBwcm9zZSBcdTIwMTQgYSBub3RlXG4vLyBUaGF0IGdvZXMgc3RyYWlnaHQgZnJvbSBpdHMgdGl0bGUgdG8gYSBidXR0b24gaXMgZXhhY3RseSB0aGUgc2hhcGUgdGhpcyBjaGVjayByZWplY3RzLlxuZnVuY3Rpb24gaGFzSW50cm9Qcm9zZShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKENPREVfRkVOQ0VfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgaWYgKHRyaW1tZWRMaW5lID09PSAnJyB8fCBIRUFESU5HX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFdoZXRoZXIgdGhlIG5vdGUgbmF2aWdhdGVzIHdpdGggYW4gT2JzaWRpYW4gYFtbd2lraWxpbmtdXWAuIEZlbmNlZCBibG9ja3MgYW5kIGlubGluZSBjb2RlIGFyZSBzYW1wbGVcbi8vIFRleHQgcmF0aGVyIHRoYW4gbmF2aWdhdGlvbiwgc28gdGhleSBhcmUgcmVtb3ZlZCBiZWZvcmUgbG9va2luZy5cbmZ1bmN0aW9uIGhhc1dpa2lsaW5rKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmluZFdpa2lsaW5rTGluZUluZGV4ZXMoY29udGVudCkubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gaXNOb25QdWJsaWNNZW1iZXIobW9kaWZpZXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGIoPzpwcml2YXRlfHByb3RlY3RlZClcXGIvLnRlc3QobW9kaWZpZXJzKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNZW1iZXJzKGtleXdvcmQ6IHN0cmluZywgYm9keTogc3RyaW5nKTogSW50ZXJmYWNlTWVtYmVycyB7XG4gIHN3aXRjaCAoa2V5d29yZCkge1xuICAgIGNhc2UgJ2NsYXNzJzoge1xuICAgICAgcmV0dXJuIGJ1aWxkTWVtYmVycyhleHRyYWN0Q2xhc3NNZXRob2ROYW1lcyhib2R5KSwgZXh0cmFjdENsYXNzUHJvcGVydHlOYW1lcyhib2R5KSk7XG4gICAgfVxuICAgIGNhc2UgJ2VudW0nOiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKFtdLCBleHRyYWN0RW51bU1lbWJlck5hbWVzKGJvZHkpKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIGJ1aWxkTWVtYmVycyhleHRyYWN0TWV0aG9kTmFtZXMoYm9keSksIGV4dHJhY3RQcm9wZXJ0eU5hbWVzKGJvZHkpKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gUmVhZHMgdGhlIG5vdGUncyBgb2JzaWRpYW4tZGV2LXV0aWxzID4gZGVtby12YXVsdC12YWxpZGF0aW9uID4gYWxsb3ctd2lraWxpbmtzYCBkZWNsYXJhdGlvbjogdGhlIHN0YXRlZFxuLy8gUmVhc29uLCBgJydgIHdoZW4gdGhlIGtleSBpcyBwcmVzZW50IHdpdGggbm90aGluZyBhZnRlciBpdCwgb3IgYG51bGxgIHdoZW4gdGhlIG5vdGUgZGVjbGFyZXMgbm90aGluZy5cbi8vIFJlYWQgd2l0aCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiByYXRoZXIgdGhhbiBhIFlBTUwgcGFyc2VyOiBpdCBpcyBvbmUga25vd24ga2V5IHBhdGgsIGFuZCBldmVyeSBwbHVnaW4gdGhhdFxuLy8gSW5zdGFsbHMgdGhpcyBwYWNrYWdlIHdvdWxkIG90aGVyd2lzZSBjYXJyeSBhIFlBTUwgZGVwZW5kZW5jeSBmb3IgaXQuXG5mdW5jdGlvbiByZWFkV2lraWxpbmtBbGxvd2FuY2VSZWFzb24oY29udGVudDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gRlJPTlRNQVRURVJfUkVHX0VYUC5leGVjKGNvbnRlbnQpPy5bMF07XG4gIGlmIChmcm9udG1hdHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcmVhc29uID0gV0lLSUxJTktfQUxMT1dBTkNFX1JFR19FWFAuZXhlYyhmcm9udG1hdHRlcik/Lmdyb3Vwcz8uWydyZWFzb24nXTtcbiAgaWYgKHJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlYXNvbi50cmltKCkucmVwbGFjZSgvXig/PHF1b3RlPltcIiddKSg/PHZhbHVlPltcXHNcXFNdKilcXGs8cXVvdGU+JC8sICckPHZhbHVlPicpO1xufVxuXG4vLyBSZWFkcyB0aGUgbm90ZSdzIGlubGluZSBgb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGVcdTIwMjZgIGRpcmVjdGl2ZXMsIHJldHVybmluZyB3aGljaCBsaW5lcyB0aGV5IGFsbG93IGFcbi8vIFdpa2lsaW5rIG9uIGFuZCBldmVyeXRoaW5nIHdyb25nIHdpdGggdGhlbS4gQSBzdXBwcmVzc2lvbiB0aGF0IHF1aWV0bHkgZG9lcyBub3RoaW5nIGlzIHdvcnNlIHRoYW4gbm9uZSxcbi8vIFNvIGEgbWlzc3BlbGxlZCBkaXJlY3RpdmUsIG9uZSB3aXRoIG5vIHJlYXNvbiwgYW4gdW5jbG9zZWQgcmVnaW9uIGFuZCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmsgYXQgYWxsXG4vLyBBcmUgZWFjaCByZXBvcnRlZCByYXRoZXIgdGhhbiBpZ25vcmVkLlxuZnVuY3Rpb24gc2Nhbldpa2lsaW5rRGlyZWN0aXZlcyhjb250ZW50OiBzdHJpbmcpOiBXaWtpbGlua0RpcmVjdGl2ZVNjYW4ge1xuICBjb25zdCBzdGF0ZTogV2lraWxpbmtEaXJlY3RpdmVTY2FuU3RhdGUgPSB7XG4gICAgYWxsb3dlZExpbmVJbmRleGVzOiBuZXcgU2V0PG51bWJlcj4oKSxcbiAgICBvcGVuUmVnaW9uOiBudWxsLFxuICAgIHBlbmRpbmdOZXh0TGluZUluZGV4OiBudWxsLFxuICAgIHByb2JsZW1zOiBbXSxcbiAgICB3aWtpbGlua0xpbmVJbmRleGVzOiBuZXcgU2V0KGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpKVxuICB9O1xuXG4gIGZvciAoY29uc3QgeyBpbmRleCwgbGluZSB9IG9mIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkpIHtcbiAgICBjb25zdCBtYXRjaCA9IERJUkVDVElWRV9SRUdfRVhQLmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBhcHBseVdpa2lsaW5rRGlyZWN0aXZlKHN0YXRlLCBpbmRleCwgbWF0Y2gpO1xuICAgIH0gZWxzZSBpZiAoRElSRUNUSVZFX1BST0JFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBtYWxmb3JtZWQgZGlyZWN0aXZlIG9uICR7Zm9ybWF0TGluZU51bWJlcihpbmRleCl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGx5V2lraWxpbmtTY2FuTGluZShzdGF0ZSwgaW5kZXgsIGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5vcGVuUmVnaW9uKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihzdGF0ZS5vcGVuUmVnaW9uLmxpbmVJbmRleCl9IHRoYXQgaXMgbmV2ZXIgZW5hYmxlZCBhZ2FpbmApO1xuICB9XG4gIGlmIChzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCAhPT0gbnVsbCkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZS1uZXh0LWxpbmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4KX0gY292ZXJpbmcgbm8gd2lraWxpbmtgKTtcbiAgfVxuICByZXR1cm4geyBhbGxvd2VkTGluZUluZGV4ZXM6IHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlcywgcHJvYmxlbXM6IHN0YXRlLnByb2JsZW1zIH07XG59XG5cbmZ1bmN0aW9uIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShGUk9OVE1BVFRFUl9SRUdfRVhQLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5saW5lQ29kZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKElOTElORV9DT0RFX1JFR19FWFAsICcnKTtcbn1cblxuLy8gQSBoYW5kLXdyaXR0ZW4gbGluayBtYXkgY29udGFpbiBhIGJhcmUgYCVgIChvciBhbnkgb3RoZXIgaW52YWxpZCBwZXJjZW50LWVzY2FwZSksIHdoaWNoIG1ha2VzXG4vLyBgZGVjb2RlVVJJQ29tcG9uZW50YCB0aHJvdy4gU3VjaCBhIHRhcmdldCBpcyBtZWFudCBsaXRlcmFsbHksIHNvIGl0IGlzIHVzZWQgYXMgd3JpdHRlbi5cbmZ1bmN0aW9uIHRyeURlY29kZVVyaUNvbXBvbmVudCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0VBLHFCQUlPO0FBQ1Asb0JBSU87QUFFUCwwQkFBNEM7QUFDNUMsd0NBQXdDO0FBQ3hDLGtCQUlPO0FBQ1AscUJBQXVDO0FBQ3ZDLHlCQUFrQztBQUNsQyxpQ0FHTztBQXVYQSxNQUFNLHlCQUF5QjtBQUFBLEVBQzVCLGVBQThCO0FBQUEsRUFDOUIsY0FBc0M7QUFBQSxFQUM3QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
666
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogU3RhdGljIGNvdmVyYWdlL2ZyZXNobmVzcyBjaGVja3MgdGhhdCBrZWVwIGEgcGx1Z2luJ3MgaW4tcmVwbyBgZGVtby12YXVsdC9gIGluIHN5bmMgd2l0aCBpdHMgcHVibGljIHN1cmZhY2UuXG4gKlxuICogQSBwbHVnaW4gY2FuIHNoaXAgYSBjdXJhdGVkIGRlbW8gdmF1bHQgYXQgYGRlbW8tdmF1bHQvYCBpbiBpdHMgcmVwbyByb290LiBUaGVzZSBoZWxwZXJzIHJlZmxlY3QgdGhlIHJlYWxcbiAqIHB1YmxpYyBBUEkvY29uZmlnL2RvY3Mgc3RyYWlnaHQgZnJvbSBzb3VyY2UgYW5kIGFzc2VydCBcdTIwMTQgV0lUSE9VVCBsYXVuY2hpbmcgT2JzaWRpYW4gXHUyMDE0IHRoYXQgZXZlcnkgZmVhdHVyZSBpc1xuICogZGVtb25zdHJhdGVkIGluIHRoZSBub3RlcyBhbmQgdGhhdCB0aGUgbm90ZXMgcmVmZXJlbmNlIG5vIEFQSSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzIChyZW5hbWUgZHJpZnQpLlxuICogVGhlIHJ1bnRpbWUgYmVoYXZpb3Igb2YgdGhlIHBsdWdpbiBpcyBjb3ZlcmVkIGJ5IGl0cyBvdGhlciBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IGJ5IHRoZSBkZW1vIHZhdWx0OyB0aGVcbiAqIHZhdWx0IGlzIGEgbGVhcm5pbmcgcmVzb3VyY2UsIGFuZCB0aGVzZSBjaGVja3Mgb25seSBndWFyZCB0aGF0IGl0IHN0YXlzIHRydXRoZnVsLlxuICpcbiAqIFRoZXkgYWxzbyBndWFyZCB0aGUgdmF1bHQncyBvd24gYC5vYnNpZGlhbi9hcHAuanNvbmA6IHRoZSBzZXR0aW5ncyBsaXN0ZWQgaW5cbiAqIHtAbGluayBERU1PX1ZBVUxUX0FQUF9KU09OX1NFVFRJTkdTfSBiZWxvbmcgdG8gYG9ic2lkaWFuLWRldi11dGlsc2AsIHdoaWNoIHdyaXRlcyB0aGVtIGludG8gdGhlIGFyY2hpdmVkXG4gKiB2YXVsdCBhdCByZWxlYXNlIHRpbWUsIHNvIGEgdmF1bHQgdGhhdCBjb21taXRzIGFueSBvZiB0aGVtIGlzIGtlZXBpbmcgYSBzZWNvbmQgY29weSBub3RoaW5nIHJlY29uY2lsZXMuXG4gKlxuICogVGhleSBhbHNvIGVuZm9yY2UgdGhlIGRlbW8tdmF1bHQgQVVUSE9SSU5HIGNvbnZlbnRpb24gXHUyMDE0IGV2ZXJ5IG5vdGUgb3BlbnMgd2l0aCBhbiBgIyBIMWAgYW5kIGEgcGxhaW5cbiAqIHByb3NlIHBhcmFncmFwaCwgZXZlcnkgbm90ZSBpcyByZWFjaGFibGUgZnJvbSB0aGUgc3RhcnQgbm90ZSwgYW5kIG5vIG5vdGUgdXNlcyBhIGBbW3dpa2lsaW5rXV1gIG9yIGFcbiAqIGBbRG9jc10oXHUyMDI2KWAgbGluZS4gVGhlc2UgY2hlY2tzIGFyZSB1bmNvbmRpdGlvbmFsOiB0aGUgZGVtbyB2YXVsdCBpcyB0aGUgcHVibGlzaGVkIGRvY3VtZW50YXRpb24sIHJlYWRcbiAqIGluIE9ic2lkaWFuIEFORCBvbiBHaXRIdWIgKHdoZXJlIGEgd2lraWxpbmsgZG9lcyBub3QgcmVuZGVyKSwgc28gYSBub3RlIHRoYXQgYnJlYWtzIHRoZSBjb252ZW50aW9uIGlzXG4gKiBicm9rZW4gZm9yIHJlYWwgcmVhZGVycy4gYGF1dGhvcmluZ2Agb25seSB0dW5lcyB0aGVtICh3aGljaCBub3RlIGlzIHRoZSBzdGFydCwgd2hpY2ggbm90ZXMgc2l0IG91dHNpZGVcbiAqIHRoZSBsZWFybmluZyBwYXRoKTsgaXQgY2Fubm90IHN3aXRjaCB0aGVtIG9mZi5cbiAqXG4gKiBPbmx5IGByb290Rm9sZGVyYCBpcyByZXF1aXJlZCwgc28gYSBwbHVnaW4gd2l0aCBubyBzZXR0aW5ncyBhbmQgbm8gcHVibGljIEFQSSB0byByZWZsZWN0IHJlZ2lzdGVycyB0aGVcbiAqIHN1aXRlIHdpdGggdGhhdCBhbG9uZSBhbmQgc3RpbGwgZ2V0cyBldmVyeSBhdXRob3JpbmcgY2hlY2sgXHUyMDE0IHRoZSBjaGVja3MgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggd2hhdCB0aGVcbiAqIHBsdWdpbiBleHBvc2VzLiBFYWNoIHJlZmxlY3Rpb24gc3BlYyAoYGNvbmZpZ0ludGVyZmFjZXNgLCBgaW50ZXJmYWNlc2AsIGBub25Ucml2aWFsR3VhcmRgKSBhZGRzIHRoZSBjaGVja3NcbiAqIGl0IGRlc2NyaWJlcyB3aGVuIHN1cHBsaWVkLiBUaGUgdmF1bHQgaXMgZ3VhcmRlZCBhZ2FpbnN0IGJlaW5nIGVtcHR5IGVpdGhlciB3YXk6IHdpdGggbm8gbm90ZXMgdG8gcmVhZCxcbiAqIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayB3b3VsZCBwYXNzIGJ5IGhhdmluZyBub3RoaW5nIHRvIGxvb2sgYXQuXG4gKlxuICogVGhlIG9uZSBleGNlcHRpb24gaXMgYSBub3RlIHdob3NlIFNVQkpFQ1QgaXMgdGhlIHdpa2lsaW5rIFx1MjAxNCBhbiBlbWJlZCBzcGVsbGluZyB0aGUgcmVhZGVyIGlzIGJlaW5nIHRhdWdodFxuICogdG8gdHlwZSwgYSBmcm9udG1hdHRlciBwcm9wZXJ0eSB2YWx1ZSB0aGF0IGV4aXN0cyB0byBjb250cmFzdCB3aXRoIGEgTWFya2Rvd24gbGluaywgYSBmaXh0dXJlIHRoYXQgbXVzdFxuICoga2VlcCB0aGUgd2lraWxpbmsgYSBjb21tYW5kIGlzIHN1cHBvc2VkIHRvIGxlYXZlIGFsb25lLCBhIGxpbmsgdGhlIHJlYWRlciBjbGlja3Mgd2hpbGUgaXQgc3RpbGwgcmVzb2x2ZXNcbiAqIHRvIG5vdGhpbmcuIFN1Y2ggYSBub3RlIHNheXMgc28gaXRzZWxmLCBzdGF0aW5nIHdoeSwgaW4gb25lIG9mIHR3byBmb3JtcyBtb2RlbGxlZCBvbiBFU0xpbnQncy5cbiAqXG4gKiBQZXIgbGluZSBvciBwZXIgcmVnaW9uLCB3cml0dGVuIGFzIGFuIEhUTUwgY29tbWVudCBzbyBpdCBpcyBpbnZpc2libGUgaW4gT2JzaWRpYW4gQU5EIG9uIEdpdEh1YiBcdTIwMTQgdGhlXG4gKiBzcGVsbGluZyB0aGVzZSB2YXVsdHMgYWxyZWFkeSB1c2UgZm9yIGBtYXJrZG93bmxpbnQtZGlzYWJsZS1uZXh0LWxpbmVgOlxuICpcbiAqIGBgYG1hcmtkb3duXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlLW5leHQtbGluZSBkZW1vLXZhdWx0LXZhbGlkYXRpb24vbm8td2lraWxpbmtzIC0tIENsaWNraW5nIGEgbGluayB0byBhIG5vdGUgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQgSVMgdGhlIGZlYXR1cmUuIC0tPlxuICogMi4gQ2xpY2sgdGhpcyBsaW5rOiBbW1Byb2plY3RzL0ZyZXNoIGlkZWFdXS5cbiAqXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gVGhlIHdpa2lsaW5rIGVtYmVkIGlzIHRoZSBzeW50YXggdGhpcyBub3RlIHRlYWNoZXMuIC0tPlxuICogIVtbYmFzaWMuaHRtbHw0MDBdXVxuICogPCEtLSBvYnNpZGlhbi1kZXYtdXRpbHMtZW5hYmxlIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0+XG4gKiBgYGBcbiAqXG4gKiBQZXIgbm90ZSwgaW4gdGhlIG5vdGUncyBvd24gZnJvbnRtYXR0ZXIgXHUyMDE0IHRoZSBvbmx5IGZvcm0gdGhhdCBjYW4gcmVhY2ggYSB3aWtpbGluayBJTlNJREUgZnJvbnRtYXR0ZXIsXG4gKiB3aGVyZSBhIGNvbW1lbnQgY2Fubm90IGdvOlxuICpcbiAqIGBgYHlhbWxcbiAqIC0tLVxuICogb2JzaWRpYW4tZGV2LXV0aWxzOlxuICogICBkZW1vLXZhdWx0LXZhbGlkYXRpb246XG4gKiAgICAgYWxsb3ctd2lraWxpbmtzOiBUaGUgYHdpa2lsaW5rYCBwcm9wZXJ0eSB2YWx1ZSBpcyB0aGUgY29udHJhc3QgdGhpcyBub3RlIGlzIGJ1aWx0IGFyb3VuZC5cbiAqIC0tLVxuICogYGBgXG4gKlxuICogRWl0aGVyIHdheSB0aGUgZGVjbGFyYXRpb24gdHJhdmVscyB3aXRoIHRoZSBub3RlIHJhdGhlciB0aGFuIHNpdHRpbmcgaW4gYSBsaXN0IHNvbWV3aGVyZSBlbHNlLCBpdCBjYXJyaWVzXG4gKiBpdHMganVzdGlmaWNhdGlvbiwgYW5kIGl0IGV4ZW1wdHMgb25seSB0aGUgV0lLSUxJTksgY2hlY2sgXHUyMDE0IHRoZSBIMSwgcHJvc2UsIHJlYWNoYWJpbGl0eSBhbmQgYFtEb2NzXWBcbiAqIGNoZWNrcyBzdGlsbCBhcHBseS4gQSBkZWNsYXJhdGlvbiB3aXRoIG5vIHJlYXNvbiwgb25lIGNvdmVyaW5nIG5vIHdpa2lsaW5rLCBhIHJlZ2lvbiBuZXZlciBlbmFibGVkIGFnYWluLFxuICogb3IgYSBtaXNzcGVsbGVkIGRpcmVjdGl2ZSBhbGwgZmFpbDogYW4gZXhlbXB0aW9uIG5vYm9keSBjYW4ganVzdGlmeSwgdGhhdCBub3RoaW5nIG5lZWRzIGFueSBtb3JlLCBvciB0aGF0XG4gKiBzaWxlbnRseSBkb2VzIG5vdGhpbmcgaXMgd29yc2UgdGhhbiBubyBleGVtcHRpb24gYXQgYWxsLlxuICpcbiAqIFR3byBsYXllcnMgYXJlIGV4cG9zZWQ6XG4gKiAtIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJ9IFx1MjAxNCBhIGZyYW1ld29yay1hZ25vc3RpYyBjb3JlIHRoYXQgcmVhZHMgdGhlIGNvcnB1cywgcGFyc2VzIGludGVyZmFjZSAvXG4gKiAgIGNsYXNzIC8gZW51bSBtZW1iZXJzIGFuZCBleHBvcnRlZCBmdW5jdGlvbnMsIGFuZCByZXR1cm5zIGRpYWdub3N0aWMgYXJyYXlzICh3aGF0IGlzIHVuZGVtb25zdHJhdGVkIC8gc3RhbGVcbiAqICAgLyB1bmxpbmtlZCAvIG9mZi1jb252ZW50aW9uKS5cbiAqIC0ge0BsaW5rIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZX0gXHUyMDE0IGEgdGhpbiB3cmFwcGVyIHRoYXQgcmVnaXN0ZXJzIGEgYHZpdGVzdGAgc3VpdGUgb3ZlciB0aGUgY29yZSwgc29cbiAqICAgYSBwbHVnaW4ncyBgZGVtby12YXVsdC5uby1hcHAuaW50ZWdyYXRpb24udGVzdC50c2AgaXMgYSBzaW5nbGUgZGVjbGFyYXRpdmUgY2FsbC5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgZGVzY3JpYmUsXG4gIGV4cGVjdCxcbiAgaXRcbn0gZnJvbSAndml0ZXN0JztcblxuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4vcGx1Z2luL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGRpcm5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJy4uL3JlZy1leHAudHMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQge1xuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuXG4vKipcbiAqIFR1bmVzIHRoZSBhbHdheXMtb24gYXV0aG9yaW5nIGNoZWNrcy4gSXQgY2Fubm90IGRpc2FibGUgdGhlbSBcdTIwMTQgc2VlIHRoZSBmaWxlIG92ZXJ2aWV3LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEF1dGhvcmluZ1NwZWMge1xuICAvKipcbiAgICogVGhlIG5vdGVzIChwYXRocyByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhhdCBzaXQgb3V0c2lkZSB0aGUgbGVhcm5pbmcgcGF0aCBhbmQgYXJlIHRoZXJlZm9yZVxuICAgKiBleGVtcHQgZnJvbSBldmVyeSBhdXRob3JpbmcgY2hlY2suIERlZmF1bHRzIHRvIHRoZSB2YXVsdCdzIG93biBgUkVBRE1FLm1kYCwgd2hpY2ggYWRkcmVzc2VzIHNvbWVvbmVcbiAgICogYnJvd3NpbmcgdGhlIHJlcG8gb24gR2l0SHViIHJhdGhlciB0aGFuIGEgcmVhZGVyIHdvcmtpbmcgdGhyb3VnaCB0aGUgdmF1bHQuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZE5vdGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBub3RlIChwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSBldmVyeSBvdGhlciBub3RlIG11c3QgYmUgcmVhY2hhYmxlIGZyb20uIERlZmF1bHRzIHRvXG4gICAqIGAwMCBTdGFydC5tZGAuXG4gICAqL1xuICByZWFkb25seSBzdGFydE5vdGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBjb25maWcgaW50ZXJmYWNlIHdob3NlIG9wdGlvbnMgYXJlIGRlbW9uc3RyYXRlZCBieSB0aGVpciBiYXJlIG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q29uZmlnSW50ZXJmYWNlQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHdob3NlIHByb3BlcnRpZXMgYXJlIHRoZSBjb25maWdcbiAgICogb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZXMgKHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSBleGVtcHQgZnJvbSB0aGUgYXV0aG9yaW5nIGNoZWNrcy4gRGVmYXVsdHMgdG8gdGhlXG4gICAqIHZhdWx0J3Mgb3duIGBSRUFETUUubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGx1Z2luIHJlcG8gcm9vdCBcdTIwMTQgdGhlIGZvbGRlciBjb250YWluaW5nIGBkZW1vLXZhdWx0L2AgYW5kIHRoZSBzb3VyY2UgYmVpbmdcbiAgICogcmVmbGVjdGVkLiBDYWxsZXJzIHR5cGljYWxseSBwYXNzIGBnZXRSb290Rm9sZGVyKCkgPz8gcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFN0YWxlUmVmZXJlbmNlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVjZWl2ZXIgd2hvc2UgYGAgYCR7cmVjZWl2ZXJ9LjxtZW1iZXI+YCBgYCByZWZlcmVuY2VzIGFyZSBzY2FubmVkIGZvciBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVtYmVycyB0aGF0IGN1cnJlbnRseSBleGlzdCBvbiB0aGUgcmVjZWl2ZXI7IGFueSByZWZlcmVuY2VkIG1lbWJlciBub3QgaW4gdGhpcyBzZXQgaXMgc3RhbGUuXG4gICAqL1xuICByZWFkb25seSB2YWxpZE1lbWJlcnM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG1lbWJlciBuYW1lcyB0aGF0IG11c3QgZWFjaCBhcHBlYXIgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtYmVyczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBhIG1lbWJlciBpcyBkZW1vbnN0cmF0ZWQgb25seSBpZiBgYCBgJHtyZWNlaXZlcn0uJHttZW1iZXJ9YCBgYCBhcHBlYXJzIChlLmcuIGEgY29udGV4dCBvYmplY3Qnc1xuICAgKiBtZXRob2RzKTsgd2hlbiBhYnNlbnQsIHRoZSBiYXJlIG1lbWJlciBuYW1lIGlzIGxvb2tlZCB1cCAoZS5nLiBhIGNvbmZpZyBvcHRpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVubGlua2VkRmVhdHVyZURvY3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGRvY3NGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIHRoYXQgYXJlIE5PVCBwZXItZmVhdHVyZSBwYWdlcyBhbmQgc28gbmVlZCBubyBsaW5raW5nIGRlbW8gbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vbkZlYXR1cmVEb2NzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5yZWFjaGFibGVOb3Rlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGUgKHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoZSB3YWxrIHN0YXJ0cyBmcm9tLCBlLmcuIGAwMCBTdGFydC5tZGAuXG4gICAqL1xuICByZWFkb25seSBzdGFydE5vdGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIGFyZSBwYXJzZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0SW50ZXJmYWNlTWVtYmVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB0byBwYXJzZS5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyB0aGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHREb2NzQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgdGhhdCBhcmUgTk9UIHBlci1mZWF0dXJlIHBhZ2VzIGFuZCBzbyBuZWVkIG5vIGxpbmtpbmcgZGVtbyBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uRmVhdHVyZURvY3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgbW9kdWxlJ3MgZXhwb3J0ZWQgZnVuY3Rpb25zLCBlYWNoIGRlbW9uc3RyYXRlZCBieSBpdHMgYmFyZSBuYW1lIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgc2luZ2xlIGludGVyZmFjZSdzIG1lbWJlcnMgYW5kIGRlbW9uc3RyYXRlcyB0aGVtIHZpYSBgYCBgJHtyZWNlaXZlcn0uPG1lbWJlcj5gIGBgIHJlZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHRvIHJlZmxlY3QuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRlbW9uc3RyYXRlZCBtZW1iZXJzIGFyZSB0aGUgcmVmbGVjdGVkIHR5cGUncyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzIChlbnVtIG1lbWJlcnMgY291bnQgYXNcbiAgICogcHJvcGVydGllcykuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBEZW1vVmF1bHRJbnRlcmZhY2VNZW1iZXJLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciB0aGUgbm90ZXMgY2FsbCB0aGUgbWVtYmVycyBvbiAoZS5nLiBgY29kZUJ1dHRvbkNvbnRleHRgKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gaW50ZXJmYWNlJ3MgZGVtb25zdHJhdGVkIG1lbWJlcnMgYXJlIGl0cyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgdHlwZSBEZW1vVmF1bHRJbnRlcmZhY2VNZW1iZXJLaW5kID0gJ21ldGhvZHMnIHwgJ3Byb3BlcnRpZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGd1YXJkIHRoYXQgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIGlzIG5vbi10cml2aWFsIChwcm90ZWN0cyBhZ2FpbnN0IGEgcGFyc2luZyByZWdyZXNzaW9uXG4gKiBzaWxlbnRseSBlbXB0eWluZyBldmVyeSBvdGhlciBjaGVjaykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYyB7XG4gIC8qKlxuICAgKiBBIGRlbW8gbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhhdCBtdXN0IGJlIHByZXNlbnQuXG4gICAqL1xuICByZWFkb25seSBleHBlY3REZW1vTm90ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIG1lbWJlciB0aGF0IG11c3QgYmUgcmVmbGVjdGVkIGZyb20ge0BsaW5rIERlbW9WYXVsdE5vblRyaXZpYWxHdWFyZFNwZWMuaW50ZXJmYWNlTmFtZX0uXG4gICAqL1xuICByZWFkb25seSBleHBlY3RNZW1iZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgd2hvc2UgbWVtYmVycyBhcmUgcmUtcGFyc2VkIGZvciB0aGVcbiAgICogZ3VhcmQuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGRlbW8gbm90ZSwgYXMgcmVhZCBmcm9tIHRoZSBkZW1vIHZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdE5vdGUge1xuICAvKipcbiAgICogVGhlIG5vdGUncyByYXcgTWFya2Rvd24gY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGUncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IGZvbGRlciwgZS5nLiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcnNlZCBtZW1iZXJzIG9mIGEgc291cmNlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJmYWNlTWVtYmVycyB7XG4gIC8qKlxuICAgKiBFdmVyeSBtZW1iZXIgXHUyMDE0IHtAbGluayBJbnRlcmZhY2VNZW1iZXJzLm1ldGhvZHN9IGZvbGxvd2VkIGJ5IHtAbGluayBJbnRlcmZhY2VNZW1iZXJzLnByb3BlcnRpZXN9LlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIG1ldGhvZCBtZW1iZXJzIChkZWNsYXJlZCBhcyBgbmFtZSguLi4pYCkuXG4gICAqL1xuICByZWFkb25seSBtZXRob2RzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IG1lbWJlcnMgKGRlY2xhcmVkIGFzIGBuYW1lPzogLi4uYCkuXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0aWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIG5vdGUgbGluZSBwYWlyZWQgd2l0aCB0aGUgbGluZSBudW1iZXIgaXQgY2FtZSBmcm9tLCBzbyBhIGNoZWNrIHRoYXQgc2tpcHMgZmVuY2VkIGJsb2NrcyBjYW4gc3RpbGxcbiAqIHJlcG9ydCBcdTIwMTQgYW5kIGFuIGlubGluZSBkaXJlY3RpdmUgY2FuIHN0aWxsIG5hbWUgXHUyMDE0IHRoZSBsaW5lIGFzIHRoZSByZWFkZXIgc2VlcyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RlTGluZSB7XG4gIC8qKlxuICAgKiBUaGUgemVyby1iYXNlZCBsaW5lIG51bWJlciB3aXRoaW4gdGhlIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSdzIHJhdyB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgYGRpc2FibGVgIHJlZ2lvbiB0aGF0IGhhcyBiZWVuIG9wZW5lZCBhbmQgbm90IHlldCBlbmFibGVkIGFnYWluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5XaWtpbGlua0RpcmVjdGl2ZVJlZ2lvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSByZWdpb24gaGFzIGNvdmVyZWQgYSB3aWtpbGluaywgd2hpY2ggaXMgd2hhdCBzdG9wcyBpdCBiZWluZyByZXBvcnRlZCBhcyBwb2ludGxlc3MuXG4gICAqL1xuICBpc1VzZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIHRoZSByZWdpb24gd2FzIG9wZW5lZCBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmVJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVQYXJhbXMge1xuICAvKipcbiAgICogVHVuZXMgdGhlIGFsd2F5cy1vbiBhdXRob3JpbmcgY2hlY2tzLCBvciBgdW5kZWZpbmVkYCB0byB0YWtlIHRoZWlyIGRlZmF1bHRzLiBJdCBjYW5ub3QgZGlzYWJsZSB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaW5nPzogRGVtb1ZhdWx0QXV0aG9yaW5nU3BlYztcblxuICAvKipcbiAgICogVGhlIGNvbmZpZyBpbnRlcmZhY2VzIHdob3NlIG9wdGlvbnMgbXVzdCBlYWNoIGJlIGRlbW9uc3RyYXRlZCBieSB0aGVpciBiYXJlIG5hbWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlXG4gICAqIHBsdWdpbiBoYXMgbm8gc2V0dGluZ3MuXG4gICAqL1xuICByZWFkb25seSBjb25maWdJbnRlcmZhY2VzPzogRGVtb1ZhdWx0Q29uZmlnSW50ZXJmYWNlQ292ZXJhZ2VTcGVjW107XG5cbiAgLyoqXG4gICAqIFRoZSBmZWF0dXJlLWRvYyBsaW5raW5nIGNoZWNrLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwbHVnaW4gc2hpcHMgbm8gYGRvY3MvYCBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSBkb2NzPzogRGVtb1ZhdWx0RG9jc0NvdmVyYWdlU3BlYztcblxuICAvKipcbiAgICogVGhlIG1vZHVsZXMgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBwbHVnaW4gZXhwb3NlcyBubyBzdWNoIG1vZHVsZSB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uTW9kdWxlcz86IERlbW9WYXVsdEZ1bmN0aW9uc0NvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJmYWNlcyB3aG9zZSBtZW1iZXJzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgKGFuZCByZWZlcmVuY2VkIHdpdGhvdXQgZHJpZnQpLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gICAqIHRoZSBwbHVnaW4gZXhwb3NlcyBubyBwdWJsaWMgQVBJIHN1cmZhY2UgdG8gcmVmbGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZXM/OiBEZW1vVmF1bHRJbnRlcmZhY2VDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGd1YXJkIHRoYXQga2VlcHMgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIG5vbi10cml2aWFsLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vIHJlZmxlY3RlZCBzdXJmYWNlXG4gICAqIHRvIGd1YXJkLiBUaGUgdmF1bHQgaXMgY2hlY2tlZCBmb3IgYmVpbmcgbm9uLWVtcHR5IGVpdGhlciB3YXkuXG4gICAqL1xuICByZWFkb25seSBub25Ucml2aWFsR3VhcmQ/OiBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGx1Z2luIHJlcG8gcm9vdC4gQ2FsbGVycyB0eXBpY2FsbHkgcGFzcyBgZ2V0Um9vdEZvbGRlcigpID8/IHByb2Nlc3MuY3dkKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgYSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZVx1MjAyNmAgZGlyZWN0aXZlcyBhbGxvdywgYW5kIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpa2lsaW5rRGlyZWN0aXZlU2NhbiB7XG4gIC8qKlxuICAgKiBUaGUgemVyby1iYXNlZCBsaW5lIG51bWJlcnMgYSBkaXJlY3RpdmUgYWxsb3dzIGEgd2lraWxpbmsgb24uXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXM6IFJlYWRvbmx5U2V0PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQsIGVhY2ggcGhyYXNlZCBmb3IgYSBmYWlsaW5nIGFzc2VydGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcnVubmluZyBzdGF0ZSBvZiBhIGRpcmVjdGl2ZSBzY2FuLCB0aHJlYWRlZCB0aHJvdWdoIHRoZSBwZXItbGluZSBoZWxwZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpa2lsaW5rRGlyZWN0aXZlU2NhblN0YXRlIHtcbiAgLyoqXG4gICAqIFRoZSBsaW5lcyBhIGRpcmVjdGl2ZSBoYXMgYWxsb3dlZCBhIHdpa2lsaW5rIG9uIHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRMaW5lSW5kZXhlczogU2V0PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gY3VycmVudGx5IG9wZW4sIGFuZCB3aGV0aGVyIGl0IGhhcyBjb3ZlcmVkIGEgd2lraWxpbmsgeWV0LlxuICAgKi9cbiAgb3BlblJlZ2lvbjogbnVsbCB8IE9wZW5XaWtpbGlua0RpcmVjdGl2ZVJlZ2lvbjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgYSBgZGlzYWJsZS1uZXh0LWxpbmVgIHdhcyByZWFkIG9uLCB3aGlsZSBpdCBzdGlsbCB3YWl0cyBmb3IgdGhlIGxpbmUgaXQgY292ZXJzLlxuICAgKi9cbiAgcGVuZGluZ05leHRMaW5lSW5kZXg6IG51bGwgfCBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQgc28gZmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZXMgb2YgdGhlIG5vdGUgdGhhdCBjYXJyeSBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgd2lraWxpbmtMaW5lSW5kZXhlczogUmVhZG9ubHlTZXQ8bnVtYmVyPjtcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIHBsdWdpbidzIHB1YmxpYyBzdXJmYWNlIGZyb20gc291cmNlIGFuZCBjaGVja3MgaXRzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCBzdGF5cyBpbiBzeW5jIHdpdGggaXQuXG4gKlxuICogRXZlcnkgbWV0aG9kIGlzIGEgcHVyZSBxdWVyeSBvdmVyIGZpbGVzIHVuZGVyIHRoZSByZXBvIHJvb3QgKHRoZSBkZW1vIGNvcnB1cyBpcyByZWFkIG9uY2UgYW5kIGNhY2hlZCksIHNvXG4gKiB0aGUgY2hlY2tlciBpcyB0cml2aWFsbHkgdW5pdC10ZXN0YWJsZSBhZ2FpbnN0IGEgZml4dHVyZSByZXBvIGFuZCBjYXJyaWVzIG5vIHRlc3QtZnJhbWV3b3JrIGRlcGVuZGVuY3kuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIge1xuICBwcml2YXRlIGNhY2hlZENvcnB1czogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgY2FjaGVkTm90ZXM6IERlbW9WYXVsdE5vdGVbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbW9WYXVsdEZvbGRlcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGVkTm90ZXM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNoZWNrZXIgcm9vdGVkIGF0IGEgcGx1Z2luIHJlcG8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLnJvb3RGb2xkZXIgPSBwYXJhbXMucm9vdEZvbGRlcjtcbiAgICB0aGlzLmRlbW9WYXVsdEZvbGRlciA9IGpvaW4odGhpcy5yb290Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQpO1xuICAgIHRoaXMuZXhjbHVkZWROb3RlcyA9IG5ldyBTZXQocGFyYW1zLmV4Y2x1ZGVkTm90ZXMgPz8gREVGQVVMVF9FWENMVURFRF9OT1RFUyk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIGRlbW8gbm90ZXMgYXMgcGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgZm9sZGVyIChmb3IgYSBub24tdHJpdmlhbC1zdXJmYWNlIGd1YXJkKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIGV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0LlxuICAgKi9cbiAgcHVibGljIGNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3ROb3RlcygpLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuZCBjYWNoZXMgZXZlcnkgZGVtbyBub3RlIGluZGl2aWR1YWxseSBcdTIwMTQgdGhlIHBlci1ub3RlIHZpZXcgdGhlIGF1dGhvcmluZyBjaGVja3Mgd29yayBvbiwgYXNcbiAgICogb3Bwb3NlZCB0byB0aGUgY29uY2F0ZW5hdGVkIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIucmVhZENvcnB1c30uXG4gICAqXG4gICAqIEByZXR1cm5zIEV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0LCBleGNsdWRlZCBvbmVzIGluY2x1ZGVkLlxuICAgKi9cbiAgcHVibGljIGNvbGxlY3ROb3RlcygpOiBEZW1vVmF1bHROb3RlW10ge1xuICAgIHRoaXMuY2FjaGVkTm90ZXMgPz89IHRoaXMuY29sbGVjdE1hcmtkb3duRmlsZXModGhpcy5kZW1vVmF1bHRGb2xkZXIpLm1hcCgoZmlsZSkgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IHJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKSxcbiAgICAgIHJlbGF0aXZlUGF0aDogcmVsYXRpdmUodGhpcy5kZW1vVmF1bHRGb2xkZXIsIGZpbGUpXG4gICAgfSkpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZE5vdGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBgLm9ic2lkaWFuL2FwcC5qc29uYCBzZXR0aW5ncyB0aGUgdmF1bHQgY29tbWl0cyB0aGF0IGBvYnNpZGlhbi1kZXYtdXRpbHNgIG93bnMgYW5kIHdyaXRlc1xuICAgKiBpbnRvIHRoZSBhcmNoaXZlZCB2YXVsdCBpdHNlbGYuIEEgY29tbWl0dGVkIG9uZSBpcyBhIHNlY29uZCBjb3B5IG9mIGEgc2V0dGluZyBub3RoaW5nIHJlY29uY2lsZXMsIGFuZFxuICAgKiBpdCBpcyB0aGUgY29weSB0aGF0IGdvZXMgc3RhbGUgXHUyMDE0IHNvIHRoZSBjb252ZW50aW9uIGlzIHRoYXQgdGhlIHZhdWx0IGNvbW1pdHMgbm9uZSBvZiB0aGVtLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmFtZXMgb2YgdGhlIG93bmVkIHNldHRpbmdzIHRoZSBjb21taXR0ZWQgYGFwcC5qc29uYCBzZXRzLiBBIHZhdWx0IHRoYXQgY29tbWl0cyBub1xuICAgKiBgYXBwLmpzb25gIGF0IGFsbCBpcyBmaW5lLCBhbmQgeWllbGRzIG5vbmUuXG4gICAqL1xuICBwdWJsaWMgZmluZENvbW1pdHRlZEFwcEpzb25TZXR0aW5ncygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYXBwSnNvblBhdGggPSBqb2luKHRoaXMuZGVtb1ZhdWx0Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbik7XG4gICAgY29uc3QgY29udGVudCA9IGV4aXN0c1N5bmMoYXBwSnNvblBhdGgpID8gcmVhZEZpbGVTeW5jKGFwcEpzb25QYXRoLCAndXRmLTgnKSA6IG51bGw7XG4gICAgcmV0dXJuIGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyh7IGFwcEpzb246IHBhcnNlRGVtb1ZhdWx0QXBwSnNvbih7IGNvbnRlbnQsIHBhdGg6IGFwcEpzb25QYXRoIH0pIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIGNhcnJ5aW5nIGEgYFtEb2NzXShcdTIwMjYpYCBsaW5rIGxpbmUuIFRoZSBub3RlIElTIHRoZSBkb2N1bWVudGF0aW9uLCBzbyBhIGxpbmUgcG9pbnRpbmdcbiAgICogZWxzZXdoZXJlIGZvciB0aGUgcmVhbCBleHBsYW5hdGlvbiBpcyB0aGUgc2hhcGUgdGhpcyBjb252ZW50aW9uIGV4aXN0cyB0byByZW1vdmUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhEb2NzTGlua3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiBnZXRMaW5lc091dHNpZGVGZW5jZXMobm90ZS5jb250ZW50KS5zb21lKChsaW5lKSA9PiBET0NTX0xJTktfUkVHX0VYUC50ZXN0KGxpbmUpKSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB0aGF0IGRvIG5vdCBvcGVuIHdpdGggYW4gYCMgSDFgIChmcm9udG1hdHRlciBhc2lkZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhvdXRIMSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+ICFoYXNIMShub3RlLmNvbnRlbnQpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHdpdGggbm8gcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSB0aGVpciBmaXJzdCBjb2RlIGZlbmNlIFx1MjAxNCB0aGUgMS0zIHNlbnRlbmNlcyBzYXlpbmcgd2hhdCB0aGVcbiAgICogZmVhdHVyZSBkb2VzIGFuZCB3aHkgYSByZWFkZXIgd291bGQgd2FudCBpdCwgd2l0aG91dCB3aGljaCB0aGUgbm90ZSBpcyBhIGJ1dHRvbiB3aXRoIG5vIGxlc3Nvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aG91dEludHJvUHJvc2UoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiAhaGFzSW50cm9Qcm9zZShub3RlLmNvbnRlbnQpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHdob3NlIHdpa2lsaW5rIGFsbG93YW5jZSBpcyBub3QgZG9pbmcgYW55IHdvcmsgXHUyMDE0IGRlY2xhcmVkIHdpdGhvdXQgYSByZWFzb24sIG9yIG9uIGEgbm90ZVxuICAgKiB0aGF0IGNhcnJpZXMgbm8gd2lraWxpbmsgYXQgYWxsLiBCb3RoIGFyZSBkcmlmdDogYW4gZXhlbXB0aW9uIG5vYm9keSBjYW4ganVzdGlmeSwgYW5kIG9uZSBub3RoaW5nIG5lZWRzXG4gICAqIGFueSBtb3JlLCB3aGljaCB3b3VsZCBnbyBvbiBoaWRpbmcgdGhlIG5leHQgd2lraWxpbmsgc29tZWJvZHkgYWRkcyBieSBhY2NpZGVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aFVuanVzdGlmaWVkV2lraWxpbmtBbGxvd2FuY2UoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpLmZsYXRNYXAoKG5vdGUpID0+IHtcbiAgICAgIGNvbnN0IHNjYW4gPSBzY2FuV2lraWxpbmtEaXJlY3RpdmVzKG5vdGUuY29udGVudCk7XG4gICAgICBjb25zdCBwcm9ibGVtcyA9IFsuLi5zY2FuLnByb2JsZW1zXTtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihub3RlLmNvbnRlbnQpO1xuICAgICAgaWYgKHJlYXNvbiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocmVhc29uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdhIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIHdpdGggbm8gcmVhc29uJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc1dpa2lsaW5rKG5vdGUuY29udGVudCkpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdhIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIGNvdmVyaW5nIG5vIHdpa2lsaW5rJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Nhbi5hbGxvd2VkTGluZUluZGV4ZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdpbmxpbmUgZGlyZWN0aXZlcyB0aGUgbm90ZS1sZXZlbCBhbGxvd2FuY2UgYWxyZWFkeSBjb3ZlcnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2JsZW1zLm1hcCgocHJvYmxlbSkgPT4gYCR7bm90ZS5yZWxhdGl2ZVBhdGh9OiAke3Byb2JsZW19YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdXNpbmcgYW4gT2JzaWRpYW4gYFtbd2lraWxpbmtdXWAgb3V0c2lkZSBhIGNvZGUgZmVuY2UuIFRoZSBkZW1vIHZhdWx0IGlzIGFsc28gcmVhZCBvblxuICAgKiBHaXRIdWIsIHdoZXJlIGEgd2lraWxpbmsgcmVuZGVycyBhcyBsaXRlcmFsIGJyYWNrZXRzIGFuZCBsZWFkcyBub3doZXJlLiBBIHdpa2lsaW5rIHNob3duIElOU0lERSBhXG4gICAqIGZlbmNlIGlzIHNhbXBsZSB0ZXh0LCBub3QgbmF2aWdhdGlvbiwgc28gZmVuY2VkIGJsb2NrcyBhcmUgc2tpcHBlZCwgYXMgaXMgYSBub3RlIHRoYXQgZGVjbGFyZXMgaW4gaXRzXG4gICAqIGZyb250bWF0dGVyIHdoeSBpdHMgd2lraWxpbmtzIGFyZSB0aGUgcG9pbnQgXHUyMDE0IHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aFdpa2lsaW5rcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihub3RlLmNvbnRlbnQpICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgYWxsb3dlZExpbmVJbmRleGVzIH0gPSBzY2FuV2lraWxpbmtEaXJlY3RpdmVzKG5vdGUuY29udGVudCk7XG4gICAgICAgIHJldHVybiBmaW5kV2lraWxpbmtMaW5lSW5kZXhlcyhub3RlLmNvbnRlbnQpLnNvbWUoKGxpbmVJbmRleCkgPT4gIWFsbG93ZWRMaW5lSW5kZXhlcy5oYXMobGluZUluZGV4KSk7XG4gICAgICB9KVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG1lbWJlcnMgdGhhdCB0aGUgZGVtbyBub3RlcyByZWZlcmVuY2Ugb24gYSByZWNlaXZlciBidXQgdGhhdCBubyBsb25nZXIgZXhpc3Qgb24gaXQgKHJlbmFtZSBkcmlmdCkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGRpc3RpbmN0IHN0YWxlIG1lbWJlciBuYW1lcyByZWZlcmVuY2VkIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHB1YmxpYyBmaW5kU3RhbGVSZWZlcmVuY2VzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFN0YWxlUmVmZXJlbmNlc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWxpZE1lbWJlcnMgPSBuZXcgU2V0KHBhcmFtcy52YWxpZE1lbWJlcnMpO1xuICAgIGNvbnN0IHJlZmVyZW5jZWQgPSBbLi4udGhpcy5yZWFkQ29ycHVzKCkubWF0Y2hBbGwobmV3IFJlZ0V4cChTdHJpbmcucmF3YCR7cGFyYW1zLnJlY2VpdmVyfVxcLig/PG1lbWJlcj5cXHcrKWAsICdnJykpXVxuICAgICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtZW1iZXInKSk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KHJlZmVyZW5jZWQpXS5maWx0ZXIoKG1lbWJlcikgPT4gIXZhbGlkTWVtYmVycy5oYXMobWVtYmVyKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbWVtYmVycyB0aGF0IGFyZSBub3QgZGVtb25zdHJhdGVkIGFueXdoZXJlIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgbWVtYmVyIG5hbWVzIHdpdGggbm8gZGVtb25zdHJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb3JwdXMgPSB0aGlzLnJlYWRDb3JwdXMoKTtcbiAgICByZXR1cm4gcGFyYW1zLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IG5lZWRsZSA9IHBhcmFtcy5yZWNlaXZlciA9PT0gdW5kZWZpbmVkID8gbWVtYmVyIDogYCR7cGFyYW1zLnJlY2VpdmVyfS4ke21lbWJlcn1gO1xuICAgICAgcmV0dXJuICFjb3JwdXMuaW5jbHVkZXMobmVlZGxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBmZWF0dXJlIGRvY3MgdGhhdCBubyBkZW1vIG5vdGUgbGlua3MgdG8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGZlYXR1cmUtZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgbm90IGxpbmtlZCBmcm9tIGFueSBkZW1vIG5vdGUuXG4gICAqL1xuICBwdWJsaWMgZmluZFVubGlua2VkRmVhdHVyZURvY3MocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5saW5rZWRGZWF0dXJlRG9jc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBub25GZWF0dXJlRG9jcyA9IG5ldyBTZXQocGFyYW1zLm5vbkZlYXR1cmVEb2NzKTtcbiAgICBjb25zdCBmZWF0dXJlRG9jcyA9IHJlYWRkaXJTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuZG9jc0ZvbGRlcikpXG4gICAgICAuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKCcubWQnKSlcbiAgICAgIC5tYXAoKGZpbGUpID0+IGZpbGUucmVwbGFjZSgvXFwubWQkLywgJycpKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gIW5vbkZlYXR1cmVEb2NzLmhhcyhuYW1lKSk7XG4gICAgY29uc3QgbGlua2VkRG9jcyA9IG5ldyBTZXQoXG4gICAgICBbLi4udGhpcy5yZWFkQ29ycHVzKCkubWF0Y2hBbGwoL2RvY3NcXC8oPzxkb2M+W1xcdy1dKylcXC5tZC9nKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2RvYycpKVxuICAgICk7XG4gICAgcmV0dXJuIGZlYXR1cmVEb2NzLmZpbHRlcigoZG9jKSA9PiAhbGlua2VkRG9jcy5oYXMoZG9jKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdGhhdCBjYW5ub3QgYmUgcmVhY2hlZCBmcm9tIHRoZSBzdGFydCBub3RlIGJ5IGZvbGxvd2luZyBNYXJrZG93biBsaW5rcyBiZXR3ZWVuIG5vdGVzLlxuICAgKlxuICAgKiBUaGUgd2FsayBzdGFydHMgYXQge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbnJlYWNoYWJsZU5vdGVzUGFyYW1zLnN0YXJ0Tm90ZX0gYW5kIGZvbGxvd3NcbiAgICogZXZlcnkgYFtUZXh0XSg8Li9OTiBOYW1lLm1kPilgIGxpbmsgb3V0c2lkZSBhIGNvZGUgZmVuY2UsIHRyYW5zaXRpdmVseS4gQSBub3RlIG5vdGhpbmcgbGlua3MgdG8gaXNcbiAgICogb25lIGEgcmVhZGVyIGNhbiBvbmx5IGZpbmQgYnkgYnJvd3NpbmcgdGhlIGZpbGUgbGlzdCBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZSBncm91cGVkIGluZGV4IGluIHRoZVxuICAgKiBzdGFydCBub3RlIGlzIG1lYW50IHRvIHJlcGxhY2UuIFdoZW4gdGhlIHN0YXJ0IG5vdGUgaXRzZWxmIGlzIG1pc3NpbmcsIEVWRVJZIG5vdGUgaXMgdW5yZWFjaGFibGUsXG4gICAqIGJlY2F1c2UgdGhlcmUgaXMgbm93aGVyZSB0byBzdGFydCBmcm9tLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YWxrLlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIHVucmVhY2hhYmxlIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbnJlYWNoYWJsZU5vdGVzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm90ZXNCeVJlbGF0aXZlUGF0aCA9IG5ldyBNYXAodGhpcy5jb2xsZWN0Tm90ZXMoKS5tYXAoKG5vdGUpID0+IFtub3RlLnJlbGF0aXZlUGF0aCwgbm90ZV0pKTtcbiAgICBjb25zdCByZWFjaGVkTm90ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBwZW5kaW5nTm90ZXMgPSBbcGFyYW1zLnN0YXJ0Tm90ZV07XG5cbiAgICB3aGlsZSAocGVuZGluZ05vdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vdGVQYXRoID0gZW5zdXJlTm9uTnVsbGFibGUocGVuZGluZ05vdGVzLnBvcCgpKTtcbiAgICAgIGNvbnN0IG5vdGUgPSBub3Rlc0J5UmVsYXRpdmVQYXRoLmdldChub3RlUGF0aCk7XG4gICAgICBpZiAoIW5vdGUgfHwgcmVhY2hlZE5vdGVzLmhhcyhub3RlUGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZWFjaGVkTm90ZXMuYWRkKG5vdGVQYXRoKTtcbiAgICAgIHBlbmRpbmdOb3Rlcy5wdXNoKC4uLmNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aClcbiAgICAgIC5maWx0ZXIoKG5vdGVQYXRoKSA9PiAhcmVhY2hlZE5vdGVzLmhhcyhub3RlUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbmFtZXMgb2YgdGhlIGBleHBvcnQgZnVuY3Rpb25gcyAoaW5jbHVkaW5nIGBhc3luY2AgYW5kIGdlbmVyYXRvciBkZWNsYXJhdGlvbnMpIGluIGEgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGV4cG9ydGVkIGZ1bmN0aW9uIG5hbWVzIGluIHNvdXJjZSBvcmRlci5cbiAgICovXG4gIHB1YmxpYyBnZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID0gcmVhZEZpbGVTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuc291cmNlUGF0aCksICd1dGYtOCcpO1xuICAgIHJldHVybiBbLi4uc291cmNlLm1hdGNoQWxsKC9eZXhwb3J0ICg/OmFzeW5jICk/ZnVuY3Rpb25cXCo/ICg/PG5hbWU+XFx3KykvZ20pXVxuICAgICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbWVtYmVycyBvZiBhbiBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIGRlY2xhcmVkIGluIGEgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIHBhcnNlZCB7QGxpbmsgSW50ZXJmYWNlTWVtYmVyc30uXG4gICAqIEB0aHJvd3MgV2hlbiB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHNvdXJjZSBmaWxlLlxuICAgKi9cbiAgcHVibGljIGdldEludGVyZmFjZU1lbWJlcnMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRJbnRlcmZhY2VNZW1iZXJzUGFyYW1zKTogSW50ZXJmYWNlTWVtYmVycyB7XG4gICAgY29uc3Qgc291cmNlID0gcmVhZEZpbGVTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuc291cmNlUGF0aCksICd1dGYtOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YGV4cG9ydCAoPzxrZXl3b3JkPmludGVyZmFjZXxjbGFzc3xlbnVtKSAke3BhcmFtcy5pbnRlcmZhY2VOYW1lfVxcYltee10qXFx7KD88Ym9keT5bXFxzXFxTXSo/KVxcblxcfWApLmV4ZWMoc291cmNlKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGludGVyZmFjZSAke3BhcmFtcy5pbnRlcmZhY2VOYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VNZW1iZXJzKGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdrZXl3b3JkJyksIGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdib2R5JykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuZCBjYWNoZXMgdGhlIGRlbW8gY29ycHVzIFx1MjAxNCBldmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdCBqb2luZWQgaW50byBvbmUgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29uY2F0ZW5hdGVkIGRlbW8tbm90ZSBjb250ZW50cy5cbiAgICovXG4gIHB1YmxpYyByZWFkQ29ycHVzKCk6IHN0cmluZyB7XG4gICAgdGhpcy5jYWNoZWRDb3JwdXMgPz89IHRoaXMuY29sbGVjdE5vdGVzKClcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUuY29udGVudClcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRDb3JwdXM7XG4gIH1cblxuICAvLyBUaGUgbm90ZXMgdGhlIGF1dGhvcmluZyBjaGVja3MgYXBwbHkgdG86IGV2ZXJ5IG5vdGUgZXhjZXB0IHRoZSBvbmVzIGRlY2xhcmVkIG91dHNpZGUgdGhlIGxlYXJuaW5nXG4gIC8vIFBhdGggKHRoZSB2YXVsdCdzIG93biBgUkVBRE1FLm1kYCBieSBkZWZhdWx0KS5cbiAgcHJpdmF0ZSBjb2xsZWN0Q2hlY2thYmxlTm90ZXMoKTogRGVtb1ZhdWx0Tm90ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Tm90ZXMoKS5maWx0ZXIoKG5vdGUpID0+ICF0aGlzLmV4Y2x1ZGVkTm90ZXMuaGFzKG5vdGUucmVsYXRpdmVQYXRoKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3RNYXJrZG93bkZpbGVzKGZvbGRlcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRkaXJTeW5jKGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBpZiAoZW50cnkubmFtZSA9PT0gT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTm9kZU1vZHVsZXMgYXMgc3RyaW5nKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5jb2xsZWN0TWFya2Rvd25GaWxlcyhqb2luKGZvbGRlciwgZW50cnkubmFtZSkpKTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goam9pbihmb2xkZXIsIGVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGB2aXRlc3RgIHN1aXRlIHRoYXQga2VlcHMgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBDYWxsIGl0IG9uY2UgZnJvbSBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYDsgaXQgcmVnaXN0ZXJzIG9uZSB0ZXN0IHBlciBjaGVjayxcbiAqIGRlbGVnYXRpbmcgdG8ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZWNsYXJhdGl2ZSBjb3ZlcmFnZSBzcGVjaWZpY2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlKHBhcmFtczogUmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrZXIgPSBuZXcgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcz4oe1xuICAgIGV4Y2x1ZGVkTm90ZXM6IHBhcmFtcy5hdXRob3Jpbmc/LmV4Y2x1ZGVkTm90ZXMsXG4gICAgcm9vdEZvbGRlcjogcGFyYW1zLnJvb3RGb2xkZXJcbiAgfSkpO1xuICBjb25zdCBzdGFydE5vdGUgPSBwYXJhbXMuYXV0aG9yaW5nPy5zdGFydE5vdGUgPz8gREVGQVVMVF9TVEFSVF9OT1RFO1xuXG4gIGRlc2NyaWJlKCdkZW1vLXZhdWx0IGNvdmVyYWdlJywgKCkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuaW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gJHtzcGVjLmtpbmR9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBjb25zdCBkZW1vbnN0cmF0ZWQgPSBtZW1iZXJzW3NwZWMua2luZF07XG4gICAgICAgIGV4cGVjdChkZW1vbnN0cmF0ZWQubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBkZW1vbnN0cmF0ZWQsIHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgcmVmZXJlbmNlcyBubyAke3NwZWMuaW50ZXJmYWNlTmFtZX0gbWVtYmVyIHRoYXQgbm8gbG9uZ2VyIGV4aXN0c2AsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IGNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVycyhzcGVjKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlcyh7IHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyLCB2YWxpZE1lbWJlcnM6IG1lbWJlcnMuYWxsIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuY29uZmlnSW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gb3B0aW9uYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QobWVtYmVycy5wcm9wZXJ0aWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogbWVtYmVycy5wcm9wZXJ0aWVzIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuZnVuY3Rpb25Nb2R1bGVzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5IGV4cG9ydGVkIGZ1bmN0aW9uIGluICR7c3BlYy5zb3VyY2VQYXRofWAsICgpID0+IHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lcyA9IGNoZWNrZXIuZ2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzKHNwZWMpO1xuICAgICAgICBleHBlY3QoZnVuY3Rpb25OYW1lcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGZ1bmN0aW9uTmFtZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jcyA9IHBhcmFtcy5kb2NzO1xuICAgIGlmIChkb2NzKSB7XG4gICAgICBpdCgnbGlua3MgYSBkZW1vIG5vdGUgZm9yIGV2ZXJ5IGZlYXR1cmUgZG9jJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5saW5rZWRGZWF0dXJlRG9jcyh7IGRvY3NGb2xkZXI6IGRvY3MuZm9sZGVyLCBub25GZWF0dXJlRG9jczogZG9jcy5ub25GZWF0dXJlRG9jcyB9KSlcbiAgICAgICAgICAudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGFuIEgxJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aG91dEgxKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ29wZW5zIGV2ZXJ5IG5vdGUgd2l0aCBhIHByb3NlIHBhcmFncmFwaCBiZWZvcmUgaXRzIGZpcnN0IGNvZGUgYmxvY2snLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SW50cm9Qcm9zZSgpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KGByZWFjaGVzIGV2ZXJ5IG5vdGUgZnJvbSAke3N0YXJ0Tm90ZX1gLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5yZWFjaGFibGVOb3Rlcyh7IHN0YXJ0Tm90ZSB9KSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBubyB3aWtpbGlua3MsIHdoaWNoIGRvIG5vdCByZW5kZXIgb24gR2l0SHViJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aFdpa2lsaW5rcygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdqdXN0aWZpZXMgZXZlcnkgd2lraWxpbmsgYWxsb3dhbmNlLCBhbmQgZGVjbGFyZXMgbm9uZSBpdCBubyBsb25nZXIgbmVlZHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoVW5qdXN0aWZpZWRXaWtpbGlua0FsbG93YW5jZSgpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYXJyaWVzIG5vIERvY3MgbGluayBsaW5lLCBiZWNhdXNlIHRoZSBub3RlIGlzIHRoZSBkb2NzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aERvY3NMaW5rcygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb21taXRzIG5vbmUgb2YgdGhlIGFwcC5qc29uIHNldHRpbmdzIG9ic2lkaWFuLWRldi11dGlscyBpbmplY3RzIGF0IHJlbGVhc2UgdGltZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRDb21taXR0ZWRBcHBKc29uU2V0dGluZ3MoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICAvLyBXaXRoIG5vIG5vdGVzIHRvIHJlYWQsIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayBhYm92ZSBwYXNzZXMgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdCwgc28gYSB2YXVsdFxuICAgIC8vIFRoYXQgc3RvcHBlZCBiZWluZyBmb3VuZCB3b3VsZCBnbyBvbiByZXBvcnRpbmcgaXRzZWxmIGNsZWFuLiBUaGlzIGlzIHRoZSBoYWxmIG9mIHRoZSBub24tdHJpdmlhbFxuICAgIC8vIEd1YXJkIHRoYXQgc3RpbGwgYXBwbGllcyB3aGVuIHRoZSBwbHVnaW4gZXhwb3NlcyBub3RoaW5nIHRvIHJlZmxlY3QuXG4gICAgaXQoJ3JlYWRzIGEgbm9uLWVtcHR5IGRlbW8gdmF1bHQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5jb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCkubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBndWFyZCA9IHBhcmFtcy5ub25Ucml2aWFsR3VhcmQ7XG4gICAgaWYgKGd1YXJkKSB7XG4gICAgICBpdCgna2VlcHMgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIG5vbi10cml2aWFsJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKGd1YXJkKTtcbiAgICAgICAgZXhwZWN0KG1lbWJlcnMuYWxsKS50b0NvbnRhaW4oZ3VhcmQuZXhwZWN0TWVtYmVyKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpKS50b0NvbnRhaW4oZ3VhcmQuZXhwZWN0RGVtb05vdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQ0xBU1NfTUVNQkVSX01PRElGSUVSUyA9IFN0cmluZy5yYXdgKD86KD86cHVibGljfHByaXZhdGV8cHJvdGVjdGVkfHJlYWRvbmx5fHN0YXRpY3xhYnN0cmFjdHxvdmVycmlkZSlcXHMrKSpgO1xuY29uc3QgQUJTT0xVVEVfVVJMX1JFR19FWFAgPSAvXlthLXpdW1xcdysuLV0qOi9pO1xuY29uc3QgQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCA9IC9ePHw+JC9nO1xuY29uc3QgQ09ERV9GRU5DRV9SRUdfRVhQID0gL15cXHMqKD86YGBgfH5+fikvO1xuY29uc3QgREVGQVVMVF9FWENMVURFRF9OT1RFUyA9IFsnUkVBRE1FLm1kJ107XG5jb25zdCBERUZBVUxUX1NUQVJUX05PVEUgPSAnMDAgU3RhcnQubWQnO1xuY29uc3QgRE9DU19MSU5LX1JFR19FWFAgPSAvXlxccypcXFtEb2NzXVxcKC87XG5jb25zdCBGUk9OVE1BVFRFUl9SRUdfRVhQID0gL14tLS1cXHI/XFxuW1xcc1xcU10qP1xccj9cXG4tLS1bXlxcU1xcbl0qXFxyP1xcbj8vO1xuY29uc3QgSDFfUkVHX0VYUCA9IC9eIyBcXFMvO1xuY29uc3QgSEVBRElOR19SRUdfRVhQID0gL14jezEsNn0gLztcbmNvbnN0IElOTElORV9DT0RFX1JFR19FWFAgPSAvYFteYFxcbl0qYC9nO1xuY29uc3QgTUFSS0RPV05fTElOS19SRUdfRVhQID0gL1xcW1teXFxdXSpdXFwoKD88dGFyZ2V0PlteKV0rKVxcKS9nO1xuLy8gQW4gaW5saW5lIGRpcmVjdGl2ZSwgc2hhcGVkIGFmdGVyIEVTTGludCdzIGFuZCB3cml0dGVuIGFzIGFuIEhUTUwgY29tbWVudCBzbyBpdCBpcyBpbnZpc2libGUgQk9USCBpblxuLy8gT2JzaWRpYW4gYW5kIG9uIEdpdEh1YiBcdTIwMTQgdGhlIHNhbWUgc3BlbGxpbmcgdGhlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWAuXG4vLyBBbiBPYnNpZGlhbiBgJSUgXHUyMDI2ICUlYCBjb21tZW50IHdvdWxkIHNob3cgdXAgYXMgbGl0ZXJhbCB0ZXh0IG9uIEdpdEh1Yiwgd2hpY2ggaXMgaGFsZiB0aGUgcmVhZGVyc2hpcC5cbmNvbnN0IERJUkVDVElWRV9SRUdfRVhQID0gL15cXHMqPCEtLVxccypvYnNpZGlhbi1kZXYtdXRpbHMtKD88YWN0aW9uPmRpc2FibGUtbmV4dC1saW5lfGRpc2FibGV8ZW5hYmxlKVxccysoPzxydWxlPltcXHctXStcXC9bXFx3LV0rKSg/OlxccystLVxccysoPzxyZWFzb24+Lio/KSk/XFxzKi0tPlxccyokLztcbi8vIENhdGNoZXMgYSBkaXJlY3RpdmUgdGhhdCB3YXMgTUVBTlQgdG8gYmUgb25lIGJ1dCBpcyBtaXNzcGVsbGVkOiBpdCB3b3VsZCBvdGhlcndpc2UgcmVhZCBhcyBhbiBvcmRpbmFyeVxuLy8gQ29tbWVudCBhbmQgc2lsZW50bHkgZG8gbm90aGluZywgd2hpY2ggaXMgdGhlIGZhaWx1cmUgbW9kZSBhIHN1cHByZXNzaW9uIHN5bnRheCBtdXN0IG5ldmVyIGhhdmUuXG5jb25zdCBESVJFQ1RJVkVfUFJPQkVfUkVHX0VYUCA9IC88IS0tXFxzKm9ic2lkaWFuLWRldi11dGlscy0vO1xuY29uc3QgV0lLSUxJTktfUlVMRSA9ICdkZW1vLXZhdWx0LXZhbGlkYXRpb24vbm8td2lraWxpbmtzJztcbi8vIFRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzID4gZGVtby12YXVsdC12YWxpZGF0aW9uID4gYWxsb3ctd2lraWxpbmtzYCBmcm9udG1hdHRlciBwYXRoLCBhdCBhbnkgaW5kZW50YXRpb246XG4vLyBUaGUga2V5cyBtdXN0IG5lc3QgaW4gdGhhdCBvcmRlciwgYW5kIGFueSBsaW5lIGJldHdlZW4gdGhlbSBoYXMgdG8gc3RheSBpbmRlbnRlZCwgc28gYSBkZWRlbnQgdG8gdGhlXG4vLyBEb2N1bWVudCdzIG93biB0b3AgbGV2ZWwgZW5kcyB0aGUgbWF0Y2ggcmF0aGVyIHRoYW4gcmVhY2hpbmcgYSBzYW1lLW5hbWVkIGtleSB1bmRlciBhbm90aGVyIHBhcmVudC5cbmNvbnN0IFdJS0lMSU5LX0FMTE9XQU5DRV9SRUdfRVhQID0gL15vYnNpZGlhbi1kZXYtdXRpbHM6W15cXFNcXG5dKlxcbig/OlteXFxTXFxuXSsuKlxcbikqP1teXFxTXFxuXStkZW1vLXZhdWx0LXZhbGlkYXRpb246W15cXFNcXG5dKlxcbig/OlteXFxTXFxuXSsuKlxcbikqP1teXFxTXFxuXSthbGxvdy13aWtpbGlua3M6KD88cmVhc29uPi4qKSQvbTtcbmNvbnN0IFdJS0lMSU5LX1JFR19FWFAgPSAvXFxbXFxbW15cXF1dK11dLztcblxuLy8gQXBwbGllcyBvbmUgcGFyc2VkIGRpcmVjdGl2ZSB0byB0aGUgc2Nhbi5cbmZ1bmN0aW9uIGFwcGx5V2lraWxpbmtEaXJlY3RpdmUoc3RhdGU6IFdpa2lsaW5rRGlyZWN0aXZlU2NhblN0YXRlLCBsaW5lSW5kZXg6IG51bWJlciwgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSk6IHZvaWQge1xuICBjb25zdCBhY3Rpb24gPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnYWN0aW9uJyk7XG4gIGNvbnN0IHJ1bGUgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAncnVsZScpO1xuICBjb25zdCByZWFzb24gPSBtYXRjaC5ncm91cHM/LlsncmVhc29uJ10/LnRyaW0oKSA/PyAnJztcbiAgaWYgKHJ1bGUgIT09IFdJS0lMSU5LX1JVTEUpIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhbiB1bmtub3duIHJ1bGUgXCIke3J1bGV9XCIgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhY3Rpb24gIT09ICdlbmFibGUnICYmIHJlYXNvbiA9PT0gJycpIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIGRpcmVjdGl2ZSB3aXRoIG5vIHJlYXNvbiBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnZGlzYWJsZS1uZXh0LWxpbmUnKSB7XG4gICAgc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXggPSBsaW5lSW5kZXg7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUnKSB7XG4gICAgaWYgKHN0YXRlLm9wZW5SZWdpb24pIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX0gaW5zaWRlIHRoZSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihzdGF0ZS5vcGVuUmVnaW9uLmxpbmVJbmRleCl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlLm9wZW5SZWdpb24gPSB7IGlzVXNlZDogZmFsc2UsIGxpbmVJbmRleCB9O1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc3RhdGUub3BlblJlZ2lvbikge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGFuIGVuYWJsZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX0gd2l0aCBubyByZWdpb24gb3BlbmApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXN0YXRlLm9wZW5SZWdpb24uaXNVc2VkKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihzdGF0ZS5vcGVuUmVnaW9uLmxpbmVJbmRleCl9IGNvdmVyaW5nIG5vIHdpa2lsaW5rYCk7XG4gIH1cbiAgc3RhdGUub3BlblJlZ2lvbiA9IG51bGw7XG59XG5cbi8vIEFwcGxpZXMgb25lIG9yZGluYXJ5IGxpbmUgdG8gdGhlIHNjYW46IGFuIG9wZW4gcmVnaW9uIGNvdmVycyBpdCwgYW5kIGEgcGVuZGluZyBgZGlzYWJsZS1uZXh0LWxpbmVgXG4vLyBDbGFpbXMgdGhlIGZpcnN0IGxpbmUgd2l0aCBjb250ZW50IG9uIGl0IFx1MjAxNCB0aGUgZGlyZWN0aXZlIGFuZCBpdHMgdGFyZ2V0IGFyZSB1c3VhbGx5IGEgYmxhbmsgbGluZSBhcGFydC5cbmZ1bmN0aW9uIGFwcGx5V2lraWxpbmtTY2FuTGluZShzdGF0ZTogV2lraWxpbmtEaXJlY3RpdmVTY2FuU3RhdGUsIGxpbmVJbmRleDogbnVtYmVyLCBsaW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHN0YXRlLm9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXMuYWRkKGxpbmVJbmRleCk7XG4gICAgc3RhdGUub3BlblJlZ2lvbi5pc1VzZWQgfHw9IHN0YXRlLndpa2lsaW5rTGluZUluZGV4ZXMuaGFzKGxpbmVJbmRleCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCA9PT0gbnVsbCB8fCBsaW5lLnRyaW0oKSA9PT0gJycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc3RhdGUuYWxsb3dlZExpbmVJbmRleGVzLmFkZChsaW5lSW5kZXgpO1xuICBpZiAoIXN0YXRlLndpa2lsaW5rTGluZUluZGV4ZXMuaGFzKGxpbmVJbmRleCkpIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIGRpc2FibGUtbmV4dC1saW5lIG9uICR7Zm9ybWF0TGluZU51bWJlcihzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCl9IGNvdmVyaW5nIG5vIHdpa2lsaW5rYCk7XG4gIH1cbiAgc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXggPSBudWxsO1xufVxuXG5mdW5jdGlvbiBidWlsZE1lbWJlcnMobWV0aG9kczogc3RyaW5nW10sIHByb3BlcnRpZXM6IHN0cmluZ1tdKTogSW50ZXJmYWNlTWVtYmVycyB7XG4gIHJldHVybiB7XG4gICAgYWxsOiBbLi4ubWV0aG9kcywgLi4ucHJvcGVydGllc10sXG4gICAgbWV0aG9kcyxcbiAgICBwcm9wZXJ0aWVzXG4gIH07XG59XG5cbi8vIFJlc29sdmVzIHRoZSBub3RlcyBhIG5vdGUgbGlua3MgdG86IGV2ZXJ5IE1hcmtkb3duIGxpbmsgb3V0c2lkZSBhIGNvZGUgZmVuY2Ugd2hvc2UgdGFyZ2V0IGlzIGEgYC5tZGBcbi8vIEZpbGUsIG1hZGUgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgc28gaXQgY2FuIGJlIGxvb2tlZCB1cCBpbiB0aGUgbm90ZSBtYXAuIEV4dGVybmFsIFVSTHMgYW5kXG4vLyBOb24tbm90ZSB0YXJnZXRzIChpbWFnZXMsIHNjcmlwdHMpIGFyZSBub3QgcGFydCBvZiB0aGUgbGVhcm5pbmcgcGF0aCBhbmQgYXJlIHNraXBwZWQ7IGEgYCNhbmNob3JgIGlzXG4vLyBEcm9wcGVkLCBzaW5jZSBpdCBhZGRyZXNzZXMgYSBwbGFjZSBpbnNpZGUgYW4gYWxyZWFkeS1yZXNvbHZlZCBub3RlLlxuLy8gUmV0dXJucyB0aGUgbm90ZSdzIGxpbmVzIHdpdGggZmVuY2VkIGNvZGUgYmxvY2tzIHJlbW92ZWQgKHRoZSBmZW5jZSBsaW5lcyBpbmNsdWRlZCksIHBhaXJlZCB3aXRoIHRoZVxuLy8gTGluZSBudW1iZXIgZWFjaCBjYW1lIGZyb20sIHNvIGEgY2hlY2sgbmV2ZXIgbWlzdGFrZXMgc2FtcGxlIGNvZGUgZm9yIHByb3NlIFx1MjAxNCBhIGBbW3dpa2lsaW5rXV1gXG4vLyBEZW1vbnN0cmF0ZWQgaW5zaWRlIGEgZmVuY2UgaXMgdGV4dCwgbm90IG5hdmlnYXRpb24gXHUyMDE0IGFuZCBhbiBpbmxpbmUgZGlyZWN0aXZlIGNhbiBzdGlsbCBuYW1lIGEgbGluZS5cbmZ1bmN0aW9uIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudDogc3RyaW5nKTogTm90ZUxpbmVbXSB7XG4gIGNvbnN0IG5vdGVMaW5lczogTm90ZUxpbmVbXSA9IFtdO1xuICBsZXQgaXNJbnNpZGVGZW5jZSA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2YgY29udGVudC5zcGxpdCgnXFxuJykuZW50cmllcygpKSB7XG4gICAgaWYgKENPREVfRkVOQ0VfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICBpc0luc2lkZUZlbmNlID0gIWlzSW5zaWRlRmVuY2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFpc0luc2lkZUZlbmNlKSB7XG4gICAgICBub3RlTGluZXMucHVzaCh7IGluZGV4LCBsaW5lIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm90ZUxpbmVzO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0Tm90ZUxpbmtUYXJnZXRzKG5vdGU6IERlbW9WYXVsdE5vdGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRhcmdldHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBnZXRMaW5lc091dHNpZGVGZW5jZXMobm90ZS5jb250ZW50KSkge1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2Ygc3RyaXBJbmxpbmVDb2RlKGxpbmUpLm1hdGNoQWxsKE1BUktET1dOX0xJTktfUkVHX0VYUCkpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICd0YXJnZXQnKS5yZXBsYWNlQWxsKEFOR0xFX0JSQUNLRVRTX1JFR19FWFAsICcnKTtcbiAgICAgIGNvbnN0IFtub3RlUGF0aCA9ICcnXSA9IHRhcmdldC5zcGxpdCgnIycsIDEpO1xuICAgICAgaWYgKEFCU09MVVRFX1VSTF9SRUdfRVhQLnRlc3Qobm90ZVBhdGgpIHx8ICFub3RlUGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRhcmdldHMucHVzaChqb2luKGRpcm5hbWUobm90ZS5yZWxhdGl2ZVBhdGgpLCB0cnlEZWNvZGVVcmlDb21wb25lbnQobm90ZVBhdGgpKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXRzO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0Q2xhc3NNZXRob2ROYW1lcyhjbGFzc0JvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5jbGFzc0JvZHkubWF0Y2hBbGwobmV3IFJlZ0V4cChTdHJpbmcucmF3YF4gezJ9KD88bW9kaWZpZXJzPiR7Q0xBU1NfTUVNQkVSX01PRElGSUVSU30pKD88bmFtZT5cXHcrKSg/OjxbXj5dKj4pP1xcKGAsICdnbScpKV1cbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gIWlzTm9uUHVibGljTWVtYmVyKGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtb2RpZmllcnMnKSkpXG4gICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0Q2xhc3NQcm9wZXJ0eU5hbWVzKGNsYXNzQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmNsYXNzQm9keS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgXiB7Mn0oPzxtb2RpZmllcnM+JHtDTEFTU19NRU1CRVJfTU9ESUZJRVJTfSkoPzxuYW1lPlxcdyspXFxzKlxcPz9cXHMqWzo9XWAsICdnbScpKV1cbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gIWlzTm9uUHVibGljTWVtYmVyKGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtb2RpZmllcnMnKSkpXG4gICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RW51bU1lbWJlck5hbWVzKGVudW1Cb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uZW51bUJvZHkubWF0Y2hBbGwoL14gezJ9KD88bmFtZT5cXHcrKS9nbSldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0TWV0aG9kTmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmludGVyZmFjZUJvZHkubWF0Y2hBbGwoL14gezJ9KD88bmFtZT5cXHcrKSg/OjxbXj5dKj4pP1xcKC9nbSldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvcGVydHlOYW1lcyhpbnRlcmZhY2VCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uaW50ZXJmYWNlQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspXFw/PzovZ20pXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuLy8gVGhlIGxpbmUgbnVtYmVycyBjYXJyeWluZyBhIHdpa2lsaW5rIHRoYXQgaXMgbmF2aWdhdGlvbiByYXRoZXIgdGhhbiBzYW1wbGUgdGV4dC5cbmZ1bmN0aW9uIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudClcbiAgICAuZmlsdGVyKChub3RlTGluZSkgPT4gV0lLSUxJTktfUkVHX0VYUC50ZXN0KHN0cmlwSW5saW5lQ29kZShub3RlTGluZS5saW5lKSkpXG4gICAgLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbGluZSAke1N0cmluZyhsaW5lSW5kZXggKyAxKX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lc091dHNpZGVGZW5jZXMoY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50KS5tYXAoKG5vdGVMaW5lKSA9PiBub3RlTGluZS5saW5lKTtcbn1cblxuLy8gV2hldGhlciB0aGUgbm90ZSdzIGZpcnN0IGNvbnRlbnQgbGluZSAoZnJvbnRtYXR0ZXIgYW5kIGJsYW5rIGxpbmVzIGFzaWRlKSBpcyBhbiBgIyBIMWAuXG5mdW5jdGlvbiBoYXNIMShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZExpbmUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIEgxX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIGEgcGxhaW4gcHJvc2UgbGluZSBhcHBlYXJzIGJlZm9yZSB0aGUgbm90ZSdzIGZpcnN0IGNvZGUgZmVuY2UuIEhlYWRpbmdzIGFyZSBub3QgcHJvc2UgXHUyMDE0IGEgbm90ZVxuLy8gVGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gaXRzIHRpdGxlIHRvIGEgYnV0dG9uIGlzIGV4YWN0bHkgdGhlIHNoYXBlIHRoaXMgY2hlY2sgcmVqZWN0cy5cbmZ1bmN0aW9uIGhhc0ludHJvUHJvc2UoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycgfHwgSEVBRElOR19SRUdfRVhQLnRlc3QodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlIG5hdmlnYXRlcyB3aXRoIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gLiBGZW5jZWQgYmxvY2tzIGFuZCBpbmxpbmUgY29kZSBhcmUgc2FtcGxlXG4vLyBUZXh0IHJhdGhlciB0aGFuIG5hdmlnYXRpb24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYmVmb3JlIGxvb2tpbmcuXG5mdW5jdGlvbiBoYXNXaWtpbGluayhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIGlzTm9uUHVibGljTWVtYmVyKG1vZGlmaWVyczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFxiKD86cHJpdmF0ZXxwcm90ZWN0ZWQpXFxiLy50ZXN0KG1vZGlmaWVycyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWVtYmVycyhrZXl3b3JkOiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IEludGVyZmFjZU1lbWJlcnMge1xuICBzd2l0Y2ggKGtleXdvcmQpIHtcbiAgICBjYXNlICdjbGFzcyc6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoZXh0cmFjdENsYXNzTWV0aG9kTmFtZXMoYm9keSksIGV4dHJhY3RDbGFzc1Byb3BlcnR5TmFtZXMoYm9keSkpO1xuICAgIH1cbiAgICBjYXNlICdlbnVtJzoge1xuICAgICAgcmV0dXJuIGJ1aWxkTWVtYmVycyhbXSwgZXh0cmFjdEVudW1NZW1iZXJOYW1lcyhib2R5KSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoZXh0cmFjdE1ldGhvZE5hbWVzKGJvZHkpLCBleHRyYWN0UHJvcGVydHlOYW1lcyhib2R5KSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFJlYWRzIHRoZSBub3RlJ3MgYG9ic2lkaWFuLWRldi11dGlscyA+IGRlbW8tdmF1bHQtdmFsaWRhdGlvbiA+IGFsbG93LXdpa2lsaW5rc2AgZGVjbGFyYXRpb246IHRoZSBzdGF0ZWRcbi8vIFJlYXNvbiwgYCcnYCB3aGVuIHRoZSBrZXkgaXMgcHJlc2VudCB3aXRoIG5vdGhpbmcgYWZ0ZXIgaXQsIG9yIGBudWxsYCB3aGVuIHRoZSBub3RlIGRlY2xhcmVzIG5vdGhpbmcuXG4vLyBSZWFkIHdpdGggYSByZWd1bGFyIGV4cHJlc3Npb24gcmF0aGVyIHRoYW4gYSBZQU1MIHBhcnNlcjogaXQgaXMgb25lIGtub3duIGtleSBwYXRoLCBhbmQgZXZlcnkgcGx1Z2luIHRoYXRcbi8vIEluc3RhbGxzIHRoaXMgcGFja2FnZSB3b3VsZCBvdGhlcndpc2UgY2FycnkgYSBZQU1MIGRlcGVuZGVuY3kgZm9yIGl0LlxuZnVuY3Rpb24gcmVhZFdpa2lsaW5rQWxsb3dhbmNlUmVhc29uKGNvbnRlbnQ6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IEZST05UTUFUVEVSX1JFR19FWFAuZXhlYyhjb250ZW50KT8uWzBdO1xuICBpZiAoZnJvbnRtYXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHJlYXNvbiA9IFdJS0lMSU5LX0FMTE9XQU5DRV9SRUdfRVhQLmV4ZWMoZnJvbnRtYXR0ZXIpPy5ncm91cHM/LlsncmVhc29uJ107XG4gIGlmIChyZWFzb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiByZWFzb24udHJpbSgpLnJlcGxhY2UoL14oPzxxdW90ZT5bXCInXSkoPzx2YWx1ZT5bXFxzXFxTXSopXFxrPHF1b3RlPiQvLCAnJDx2YWx1ZT4nKTtcbn1cblxuLy8gUmVhZHMgdGhlIG5vdGUncyBpbmxpbmUgYG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlXHUyMDI2YCBkaXJlY3RpdmVzLCByZXR1cm5pbmcgd2hpY2ggbGluZXMgdGhleSBhbGxvdyBhXG4vLyBXaWtpbGluayBvbiBhbmQgZXZlcnl0aGluZyB3cm9uZyB3aXRoIHRoZW0uIEEgc3VwcHJlc3Npb24gdGhhdCBxdWlldGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vbmUsXG4vLyBTbyBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlLCBvbmUgd2l0aCBubyByZWFzb24sIGFuIHVuY2xvc2VkIHJlZ2lvbiBhbmQgb25lIGNvdmVyaW5nIG5vIHdpa2lsaW5rIGF0IGFsbFxuLy8gQXJlIGVhY2ggcmVwb3J0ZWQgcmF0aGVyIHRoYW4gaWdub3JlZC5cbmZ1bmN0aW9uIHNjYW5XaWtpbGlua0RpcmVjdGl2ZXMoY29udGVudDogc3RyaW5nKTogV2lraWxpbmtEaXJlY3RpdmVTY2FuIHtcbiAgY29uc3Qgc3RhdGU6IFdpa2lsaW5rRGlyZWN0aXZlU2NhblN0YXRlID0ge1xuICAgIGFsbG93ZWRMaW5lSW5kZXhlczogbmV3IFNldDxudW1iZXI+KCksXG4gICAgb3BlblJlZ2lvbjogbnVsbCxcbiAgICBwZW5kaW5nTmV4dExpbmVJbmRleDogbnVsbCxcbiAgICBwcm9ibGVtczogW10sXG4gICAgd2lraWxpbmtMaW5lSW5kZXhlczogbmV3IFNldChmaW5kV2lraWxpbmtMaW5lSW5kZXhlcyhjb250ZW50KSlcbiAgfTtcblxuICBmb3IgKGNvbnN0IHsgaW5kZXgsIGxpbmUgfSBvZiBjb2xsZWN0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQpKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBESVJFQ1RJVkVfUkVHX0VYUC5leGVjKGxpbmUpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgYXBwbHlXaWtpbGlua0RpcmVjdGl2ZShzdGF0ZSwgaW5kZXgsIG1hdGNoKTtcbiAgICB9IGVsc2UgaWYgKERJUkVDVElWRV9QUk9CRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgbWFsZm9ybWVkIGRpcmVjdGl2ZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoaW5kZXgpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBseVdpa2lsaW5rU2NhbkxpbmUoc3RhdGUsIGluZGV4LCBsaW5lKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUub3BlblJlZ2lvbikge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUub3BlblJlZ2lvbi5saW5lSW5kZXgpfSB0aGF0IGlzIG5ldmVyIGVuYWJsZWQgYWdhaW5gKTtcbiAgfVxuICBpZiAoc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXggIT09IG51bGwpIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIGRpc2FibGUtbmV4dC1saW5lIG9uICR7Zm9ybWF0TGluZU51bWJlcihzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCl9IGNvdmVyaW5nIG5vIHdpa2lsaW5rYCk7XG4gIH1cbiAgcmV0dXJuIHsgYWxsb3dlZExpbmVJbmRleGVzOiBzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXMsIHByb2JsZW1zOiBzdGF0ZS5wcm9ibGVtcyB9O1xufVxuXG5mdW5jdGlvbiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UoRlJPTlRNQVRURVJfUkVHX0VYUCwgJycpO1xufVxuXG5mdW5jdGlvbiBzdHJpcElubGluZUNvZGUobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChJTkxJTkVfQ09ERV9SRUdfRVhQLCAnJyk7XG59XG5cbi8vIEEgaGFuZC13cml0dGVuIGxpbmsgbWF5IGNvbnRhaW4gYSBiYXJlIGAlYCAob3IgYW55IG90aGVyIGludmFsaWQgcGVyY2VudC1lc2NhcGUpLCB3aGljaCBtYWtlc1xuLy8gYGRlY29kZVVSSUNvbXBvbmVudGAgdGhyb3cuIFN1Y2ggYSB0YXJnZXQgaXMgbWVhbnQgbGl0ZXJhbGx5LCBzbyBpdCBpcyB1c2VkIGFzIHdyaXR0ZW4uXG5mdW5jdGlvbiB0cnlEZWNvZGVVcmlDb21wb25lbnQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7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
@@ -21,6 +21,12 @@
21
21
  * broken for real readers. `authoring` only tunes them (which note is the start, which notes sit outside
22
22
  * the learning path); it cannot switch them off.
23
23
  *
24
+ * Only `rootFolder` is required, so a plugin with no settings and no public API to reflect registers the
25
+ * suite with that alone and still gets every authoring check — the checks have nothing to do with what the
26
+ * plugin exposes. Each reflection spec (`configInterfaces`, `interfaces`, `nonTrivialGuard`) adds the checks
27
+ * it describes when supplied. The vault is guarded against being empty either way: with no notes to read,
28
+ * every authoring check would pass by having nothing to look at.
29
+ *
24
30
  * The one exception is a note whose SUBJECT is the wikilink — an embed spelling the reader is being taught
25
31
  * to type, a frontmatter property value that exists to contrast with a Markdown link, a fixture that must
26
32
  * keep the wikilink a command is supposed to leave alone, a link the reader clicks while it still resolves
@@ -315,9 +321,10 @@ export interface RegisterDemoVaultCoverageSuiteParams {
315
321
  */
316
322
  readonly authoring?: DemoVaultAuthoringSpec;
317
323
  /**
318
- * The config interfaces whose options must each be demonstrated by their bare name.
324
+ * The config interfaces whose options must each be demonstrated by their bare name, or `undefined` when the
325
+ * plugin has no settings.
319
326
  */
320
- readonly configInterfaces: DemoVaultConfigInterfaceCoverageSpec[];
327
+ readonly configInterfaces?: DemoVaultConfigInterfaceCoverageSpec[];
321
328
  /**
322
329
  * The feature-doc linking check, or `undefined` when the plugin ships no `docs/` folder.
323
330
  */
@@ -328,13 +335,15 @@ export interface RegisterDemoVaultCoverageSuiteParams {
328
335
  */
329
336
  readonly functionModules?: DemoVaultFunctionsCoverageSpec[];
330
337
  /**
331
- * The interfaces whose members must each be demonstrated (and referenced without drift).
338
+ * The interfaces whose members must each be demonstrated (and referenced without drift), or `undefined` when
339
+ * the plugin exposes no public API surface to reflect.
332
340
  */
333
- readonly interfaces: DemoVaultInterfaceCoverageSpec[];
341
+ readonly interfaces?: DemoVaultInterfaceCoverageSpec[];
334
342
  /**
335
- * The guard that keeps the reflected surface non-trivial.
343
+ * The guard that keeps the reflected surface non-trivial, or `undefined` when there is no reflected surface
344
+ * to guard. The vault is checked for being non-empty either way.
336
345
  */
337
- readonly nonTrivialGuard: DemoVaultNonTrivialGuardSpec;
346
+ readonly nonTrivialGuard?: DemoVaultNonTrivialGuardSpec;
338
347
  /**
339
348
  * The absolute path of the plugin repo root. Callers typically pass `getRootFolder() ?? process.cwd()`.
340
349
  */
@@ -21,7 +21,7 @@ if you want to view the source, please visit the github repository of this plugi
21
21
  globalThis.process = browserProcess;
22
22
  })();
23
23
 
24
- const LIBRARY_VERSION = "94.2.0";
24
+ const LIBRARY_VERSION = "94.3.0";
25
25
  const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-dev-utils-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-dev-utils-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-dev-utils-lock-indicator-flash {\n animation: obsidian-dev-utils-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-dev-utils-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n@keyframes obsidian-dev-utils-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\n }\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-dev-utils.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n cursor: pointer;\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-dev-utils.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-dev-utils-minimized-modal-bar-attention 0.35s ease-out;\n}\n.obsidian-dev-utils.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button:hover,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-dev-utils.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.plugin-notice-close-button {\n position: absolute;\n right: var(--size-4-3);\n top: var(--size-4-3);\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice {\n padding: 0;\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice .obsidian-dev-utils.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.popover {\n max-width: min(420px, 90vw);\n min-width: 320px;\n padding: var(--size-4-2) var(--size-4-3);\n position: absolute;\n z-index: var(--layer-menu);\n}\n.obsidian-dev-utils.popover .setting-item {\n align-items: center;\n border-top: none;\n gap: var(--size-4-2);\n padding: var(--size-2-1) 0;\n}\n.obsidian-dev-utils.popover .setting-item-info {\n margin-right: 0;\n}\n.obsidian-dev-utils.popover .setting-item-control {\n flex-grow: 1;\n justify-content: flex-end;\n}\n.obsidian-dev-utils.popover input[type=text] {\n width: 100%;\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\nbody button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid:not(.untouched), .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid:not(.untouched), .obsidian-dev-utils input.metadata-input-text:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:focus:invalid:not(.untouched),\n.obsidian-dev-utils textarea:active:invalid:not(.untouched),\n.obsidian-dev-utils textarea:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils textarea:focus:invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-notice.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/popover.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACFJ;EACE;IAEE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACxGJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACTN;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAOJ;EACE;;AAEA;EACE;;;AChCF;EACE;;;ACCJ;EAIE;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;AC9BF;EACE;;;ACON;EACE;;;ACTE;EACE;;;ACKJ;EAPA;;AAuBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAvBJ;;AA6BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-dev-utils%60.%5Cn.obsidian-dev-utils-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-dev-utils-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-dev-utils-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn@keyframes%20obsidian-dev-utils-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button,%5Cn%20%20%20%20.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20The%20close%20button%20reuses%20Obsidian's%20%60modal-header-button%60%20+%20%60clickable-icon%60%20classes%20so%20it%20matches%5Cn%20%20%20%20//%20The%20native%20modal%20close%20button%20(box%20+%20hover);%20only%20its%20corner%20position%20is%20set%20here.%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%20var(--size-4-3);%5Cn%20%20%20%20%20%20top:%20var(--size-4-3);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-explicit-close.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20A%20popover%20is%20anchored%20at%20a%20point%20and%20appended%20to%20the%20document%20body,%20outside%20any%20plugin-scoped%5Cn//%20container,%20so%20it%20is%20positioned%20absolutely%20at%20the%20top%20level.%20It%20borrows%20Obsidian's%20%60.menu%60%20look,%5Cn//%20which%20already%20carries%20the%20popup%20background,%20border%20and%20shadow%20%E2%80%94%20only%20layout%20is%20set%20here.%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20&.popover%20%7B%5Cn%20%20%20%20//%20Deliberately%20not%20%60calc(100vw%20-%2016px)%60:%20the%20SCSS%20compiler%20strips%20the%20%60calc(%60%20wrapper%20inside%5Cn%20%20%20%20//%20%60min()%60,%20which%20yields%20invalid%20CSS.%20A%20viewport%20percentage%20keeps%20a%20narrow%20window's%20popover%20on%5Cn%20%20%20%20//%20screen.%5Cn%20%20%20%20max-width:%20min(420px,%2090vw);%5Cn%20%20%20%20min-width:%20320px;%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20z-index:%20var(--layer-menu);%5Cn%5Cn%20%20%20%20//%20Setting%20rows%20are%20built%20for%20a%20full-width%20settings%20tab;%20compact%20them%20for%20a%20popover.%5Cn%20%20%20%20.setting-item%20%7B%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20border-top:%20none;%5Cn%20%20%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20%20%20padding:%20var(--size-2-1)%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-info%20%7B%5Cn%20%20%20%20%20%20margin-right:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-control%20%7B%5Cn%20%20%20%20%20%20flex-grow:%201;%5Cn%20%20%20%20%20%20justify-content:%20flex-end;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20input%5Btype='text'%5D%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20with%20a%5Cn//%20%60body%60-prefixed%20selector%20(specificity%200,1,2)%20so%20it%20wins%20over%20tldraw's%20(0,1,1)%20while%5Cn//%20Staying%20correct%20for%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cnbody%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cr%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cr%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cr%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%20%20%7D%5Cr%5Cn%7D%5Cr%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn//%20An%20input%20the%20user%20has%20not%20interacted%20with%20yet%20carries%20%60.untouched%60%20(set%20by%20%60PromptModal%60),%20so%20a%20modal%20that%5Cn//%20opens%20invalid%20by%20design%20does%20not%20greet%20the%20user%20in%20red.%20Both%20blocks%20below%20must%20be%20gated:%20the%20input%20is%5Cn//%20focused%20on%20open,%20so%20the%20focus%20block%20alone%20would%20keep%20painting%20it.%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
26
26
  export {
27
27
  LIBRARY_STYLES,
@@ -21,6 +21,12 @@
21
21
  * broken for real readers. `authoring` only tunes them (which note is the start, which notes sit outside
22
22
  * the learning path); it cannot switch them off.
23
23
  *
24
+ * Only `rootFolder` is required, so a plugin with no settings and no public API to reflect registers the
25
+ * suite with that alone and still gets every authoring check — the checks have nothing to do with what the
26
+ * plugin exposes. Each reflection spec (`configInterfaces`, `interfaces`, `nonTrivialGuard`) adds the checks
27
+ * it describes when supplied. The vault is guarded against being empty either way: with no notes to read,
28
+ * every authoring check would pass by having nothing to look at.
29
+ *
24
30
  * The one exception is a note whose SUBJECT is the wikilink — an embed spelling the reader is being taught
25
31
  * to type, a frontmatter property value that exists to contrast with a Markdown link, a fixture that must
26
32
  * keep the wikilink a command is supposed to leave alone, a link the reader clicks while it still resolves
@@ -315,9 +321,10 @@ export interface RegisterDemoVaultCoverageSuiteParams {
315
321
  */
316
322
  readonly authoring?: DemoVaultAuthoringSpec;
317
323
  /**
318
- * The config interfaces whose options must each be demonstrated by their bare name.
324
+ * The config interfaces whose options must each be demonstrated by their bare name, or `undefined` when the
325
+ * plugin has no settings.
319
326
  */
320
- readonly configInterfaces: DemoVaultConfigInterfaceCoverageSpec[];
327
+ readonly configInterfaces?: DemoVaultConfigInterfaceCoverageSpec[];
321
328
  /**
322
329
  * The feature-doc linking check, or `undefined` when the plugin ships no `docs/` folder.
323
330
  */
@@ -328,13 +335,15 @@ export interface RegisterDemoVaultCoverageSuiteParams {
328
335
  */
329
336
  readonly functionModules?: DemoVaultFunctionsCoverageSpec[];
330
337
  /**
331
- * The interfaces whose members must each be demonstrated (and referenced without drift).
338
+ * The interfaces whose members must each be demonstrated (and referenced without drift), or `undefined` when
339
+ * the plugin exposes no public API surface to reflect.
332
340
  */
333
- readonly interfaces: DemoVaultInterfaceCoverageSpec[];
341
+ readonly interfaces?: DemoVaultInterfaceCoverageSpec[];
334
342
  /**
335
- * The guard that keeps the reflected surface non-trivial.
343
+ * The guard that keeps the reflected surface non-trivial, or `undefined` when there is no reflected surface
344
+ * to guard. The vault is checked for being non-empty either way.
336
345
  */
337
- readonly nonTrivialGuard: DemoVaultNonTrivialGuardSpec;
346
+ readonly nonTrivialGuard?: DemoVaultNonTrivialGuardSpec;
338
347
  /**
339
348
  * The absolute path of the plugin repo root. Callers typically pass `getRootFolder() ?? process.cwd()`.
340
349
  */
@@ -287,7 +287,7 @@ function registerDemoVaultCoverageSuite(params) {
287
287
  }));
288
288
  const startNote = params.authoring?.startNote ?? DEFAULT_START_NOTE;
289
289
  describe("demo-vault coverage", () => {
290
- for (const spec of params.interfaces) {
290
+ for (const spec of params.interfaces ?? []) {
291
291
  it(`demonstrates every ${spec.interfaceName} ${spec.kind}`, () => {
292
292
  const members = checker.getInterfaceMembers(spec);
293
293
  const demonstrated = members[spec.kind];
@@ -299,7 +299,7 @@ function registerDemoVaultCoverageSuite(params) {
299
299
  expect(checker.findStaleReferences({ receiver: spec.receiver, validMembers: members.all })).toEqual([]);
300
300
  });
301
301
  }
302
- for (const spec of params.configInterfaces) {
302
+ for (const spec of params.configInterfaces ?? []) {
303
303
  it(`demonstrates every ${spec.interfaceName} option`, () => {
304
304
  const members = checker.getInterfaceMembers(spec);
305
305
  expect(members.properties.length).toBeGreaterThan(0);
@@ -340,12 +340,17 @@ function registerDemoVaultCoverageSuite(params) {
340
340
  it("commits none of the app.json settings obsidian-dev-utils injects at release time", () => {
341
341
  expect(checker.findCommittedAppJsonSettings()).toEqual([]);
342
342
  });
343
- it("keeps the reflected surface non-trivial", () => {
344
- const guard = params.nonTrivialGuard;
345
- const members = checker.getInterfaceMembers(guard);
346
- expect(members.all).toContain(guard.expectMember);
347
- expect(checker.collectDemoNoteRelativePaths()).toContain(guard.expectDemoNote);
343
+ it("reads a non-empty demo vault", () => {
344
+ expect(checker.collectDemoNoteRelativePaths().length).toBeGreaterThan(0);
348
345
  });
346
+ const guard = params.nonTrivialGuard;
347
+ if (guard) {
348
+ it("keeps the reflected surface non-trivial", () => {
349
+ const members = checker.getInterfaceMembers(guard);
350
+ expect(members.all).toContain(guard.expectMember);
351
+ expect(checker.collectDemoNoteRelativePaths()).toContain(guard.expectDemoNote);
352
+ });
353
+ }
349
354
  });
350
355
  }
351
356
  const CLASS_MEMBER_MODIFIERS = String.raw`(?:(?:public|private|protected|readonly|static|abstract|override)\s+)*`;
@@ -568,4 +573,4 @@ export {
568
573
  DemoVaultCoverageChecker,
569
574
  registerDemoVaultCoverageSuite
570
575
  };
571
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogU3RhdGljIGNvdmVyYWdlL2ZyZXNobmVzcyBjaGVja3MgdGhhdCBrZWVwIGEgcGx1Z2luJ3MgaW4tcmVwbyBgZGVtby12YXVsdC9gIGluIHN5bmMgd2l0aCBpdHMgcHVibGljIHN1cmZhY2UuXG4gKlxuICogQSBwbHVnaW4gY2FuIHNoaXAgYSBjdXJhdGVkIGRlbW8gdmF1bHQgYXQgYGRlbW8tdmF1bHQvYCBpbiBpdHMgcmVwbyByb290LiBUaGVzZSBoZWxwZXJzIHJlZmxlY3QgdGhlIHJlYWxcbiAqIHB1YmxpYyBBUEkvY29uZmlnL2RvY3Mgc3RyYWlnaHQgZnJvbSBzb3VyY2UgYW5kIGFzc2VydCBcdTIwMTQgV0lUSE9VVCBsYXVuY2hpbmcgT2JzaWRpYW4gXHUyMDE0IHRoYXQgZXZlcnkgZmVhdHVyZSBpc1xuICogZGVtb25zdHJhdGVkIGluIHRoZSBub3RlcyBhbmQgdGhhdCB0aGUgbm90ZXMgcmVmZXJlbmNlIG5vIEFQSSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzIChyZW5hbWUgZHJpZnQpLlxuICogVGhlIHJ1bnRpbWUgYmVoYXZpb3Igb2YgdGhlIHBsdWdpbiBpcyBjb3ZlcmVkIGJ5IGl0cyBvdGhlciBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IGJ5IHRoZSBkZW1vIHZhdWx0OyB0aGVcbiAqIHZhdWx0IGlzIGEgbGVhcm5pbmcgcmVzb3VyY2UsIGFuZCB0aGVzZSBjaGVja3Mgb25seSBndWFyZCB0aGF0IGl0IHN0YXlzIHRydXRoZnVsLlxuICpcbiAqIFRoZXkgYWxzbyBndWFyZCB0aGUgdmF1bHQncyBvd24gYC5vYnNpZGlhbi9hcHAuanNvbmA6IHRoZSBzZXR0aW5ncyBsaXN0ZWQgaW5cbiAqIHtAbGluayBERU1PX1ZBVUxUX0FQUF9KU09OX1NFVFRJTkdTfSBiZWxvbmcgdG8gYG9ic2lkaWFuLWRldi11dGlsc2AsIHdoaWNoIHdyaXRlcyB0aGVtIGludG8gdGhlIGFyY2hpdmVkXG4gKiB2YXVsdCBhdCByZWxlYXNlIHRpbWUsIHNvIGEgdmF1bHQgdGhhdCBjb21taXRzIGFueSBvZiB0aGVtIGlzIGtlZXBpbmcgYSBzZWNvbmQgY29weSBub3RoaW5nIHJlY29uY2lsZXMuXG4gKlxuICogVGhleSBhbHNvIGVuZm9yY2UgdGhlIGRlbW8tdmF1bHQgQVVUSE9SSU5HIGNvbnZlbnRpb24gXHUyMDE0IGV2ZXJ5IG5vdGUgb3BlbnMgd2l0aCBhbiBgIyBIMWAgYW5kIGEgcGxhaW5cbiAqIHByb3NlIHBhcmFncmFwaCwgZXZlcnkgbm90ZSBpcyByZWFjaGFibGUgZnJvbSB0aGUgc3RhcnQgbm90ZSwgYW5kIG5vIG5vdGUgdXNlcyBhIGBbW3dpa2lsaW5rXV1gIG9yIGFcbiAqIGBbRG9jc10oXHUyMDI2KWAgbGluZS4gVGhlc2UgY2hlY2tzIGFyZSB1bmNvbmRpdGlvbmFsOiB0aGUgZGVtbyB2YXVsdCBpcyB0aGUgcHVibGlzaGVkIGRvY3VtZW50YXRpb24sIHJlYWRcbiAqIGluIE9ic2lkaWFuIEFORCBvbiBHaXRIdWIgKHdoZXJlIGEgd2lraWxpbmsgZG9lcyBub3QgcmVuZGVyKSwgc28gYSBub3RlIHRoYXQgYnJlYWtzIHRoZSBjb252ZW50aW9uIGlzXG4gKiBicm9rZW4gZm9yIHJlYWwgcmVhZGVycy4gYGF1dGhvcmluZ2Agb25seSB0dW5lcyB0aGVtICh3aGljaCBub3RlIGlzIHRoZSBzdGFydCwgd2hpY2ggbm90ZXMgc2l0IG91dHNpZGVcbiAqIHRoZSBsZWFybmluZyBwYXRoKTsgaXQgY2Fubm90IHN3aXRjaCB0aGVtIG9mZi5cbiAqXG4gKiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIG5vdGUgd2hvc2UgU1VCSkVDVCBpcyB0aGUgd2lraWxpbmsgXHUyMDE0IGFuIGVtYmVkIHNwZWxsaW5nIHRoZSByZWFkZXIgaXMgYmVpbmcgdGF1Z2h0XG4gKiB0byB0eXBlLCBhIGZyb250bWF0dGVyIHByb3BlcnR5IHZhbHVlIHRoYXQgZXhpc3RzIHRvIGNvbnRyYXN0IHdpdGggYSBNYXJrZG93biBsaW5rLCBhIGZpeHR1cmUgdGhhdCBtdXN0XG4gKiBrZWVwIHRoZSB3aWtpbGluayBhIGNvbW1hbmQgaXMgc3VwcG9zZWQgdG8gbGVhdmUgYWxvbmUsIGEgbGluayB0aGUgcmVhZGVyIGNsaWNrcyB3aGlsZSBpdCBzdGlsbCByZXNvbHZlc1xuICogdG8gbm90aGluZy4gU3VjaCBhIG5vdGUgc2F5cyBzbyBpdHNlbGYsIHN0YXRpbmcgd2h5LCBpbiBvbmUgb2YgdHdvIGZvcm1zIG1vZGVsbGVkIG9uIEVTTGludCdzLlxuICpcbiAqIFBlciBsaW5lIG9yIHBlciByZWdpb24sIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBpbiBPYnNpZGlhbiBBTkQgb24gR2l0SHViIFx1MjAxNCB0aGVcbiAqIHNwZWxsaW5nIHRoZXNlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWA6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUtbmV4dC1saW5lIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gQ2xpY2tpbmcgYSBsaW5rIHRvIGEgbm90ZSB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCBJUyB0aGUgZmVhdHVyZS4gLS0+XG4gKiAyLiBDbGljayB0aGlzIGxpbms6IFtbUHJvamVjdHMvRnJlc2ggaWRlYV1dLlxuICpcbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLSBUaGUgd2lraWxpbmsgZW1iZWQgaXMgdGhlIHN5bnRheCB0aGlzIG5vdGUgdGVhY2hlcy4gLS0+XG4gKiAhW1tiYXNpYy5odG1sfDQwMF1dXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1lbmFibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLT5cbiAqIGBgYFxuICpcbiAqIFBlciBub3RlLCBpbiB0aGUgbm90ZSdzIG93biBmcm9udG1hdHRlciBcdTIwMTQgdGhlIG9ubHkgZm9ybSB0aGF0IGNhbiByZWFjaCBhIHdpa2lsaW5rIElOU0lERSBmcm9udG1hdHRlcixcbiAqIHdoZXJlIGEgY29tbWVudCBjYW5ub3QgZ286XG4gKlxuICogYGBgeWFtbFxuICogLS0tXG4gKiBvYnNpZGlhbi1kZXYtdXRpbHM6XG4gKiAgIGRlbW8tdmF1bHQtdmFsaWRhdGlvbjpcbiAqICAgICBhbGxvdy13aWtpbGlua3M6IFRoZSBgd2lraWxpbmtgIHByb3BlcnR5IHZhbHVlIGlzIHRoZSBjb250cmFzdCB0aGlzIG5vdGUgaXMgYnVpbHQgYXJvdW5kLlxuICogLS0tXG4gKiBgYGBcbiAqXG4gKiBFaXRoZXIgd2F5IHRoZSBkZWNsYXJhdGlvbiB0cmF2ZWxzIHdpdGggdGhlIG5vdGUgcmF0aGVyIHRoYW4gc2l0dGluZyBpbiBhIGxpc3Qgc29tZXdoZXJlIGVsc2UsIGl0IGNhcnJpZXNcbiAqIGl0cyBqdXN0aWZpY2F0aW9uLCBhbmQgaXQgZXhlbXB0cyBvbmx5IHRoZSBXSUtJTElOSyBjaGVjayBcdTIwMTQgdGhlIEgxLCBwcm9zZSwgcmVhY2hhYmlsaXR5IGFuZCBgW0RvY3NdYFxuICogY2hlY2tzIHN0aWxsIGFwcGx5LiBBIGRlY2xhcmF0aW9uIHdpdGggbm8gcmVhc29uLCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmssIGEgcmVnaW9uIG5ldmVyIGVuYWJsZWQgYWdhaW4sXG4gKiBvciBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlIGFsbCBmYWlsOiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCB0aGF0IG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIG9yIHRoYXRcbiAqIHNpbGVudGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vIGV4ZW1wdGlvbiBhdCBhbGwuXG4gKlxuICogVHdvIGxheWVycyBhcmUgZXhwb3NlZDpcbiAqIC0ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0gXHUyMDE0IGEgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgdGhhdCByZWFkcyB0aGUgY29ycHVzLCBwYXJzZXMgaW50ZXJmYWNlIC9cbiAqICAgY2xhc3MgLyBlbnVtIG1lbWJlcnMgYW5kIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kIHJldHVybnMgZGlhZ25vc3RpYyBhcnJheXMgKHdoYXQgaXMgdW5kZW1vbnN0cmF0ZWQgLyBzdGFsZVxuICogICAvIHVubGlua2VkIC8gb2ZmLWNvbnZlbnRpb24pLlxuICogLSB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfSBcdTIwMTQgYSB0aGluIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSBvdmVyIHRoZSBjb3JlLCBzb1xuICogICBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBjYWxsLlxuICovXG5cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi9wbHVnaW4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQgeyBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwIH0gZnJvbSAnLi4vcmVnLWV4cC50cyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7XG4gIGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyxcbiAgcGFyc2VEZW1vVmF1bHRBcHBKc29uXG59IGZyb20gJy4vZGVtby12YXVsdC1hcHAtanNvbi50cyc7XG5cbi8qKlxuICogVHVuZXMgdGhlIGFsd2F5cy1vbiBhdXRob3JpbmcgY2hlY2tzLiBJdCBjYW5ub3QgZGlzYWJsZSB0aGVtIFx1MjAxNCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0QXV0aG9yaW5nU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZXMgKHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSB0aGF0IHNpdCBvdXRzaWRlIHRoZSBsZWFybmluZyBwYXRoIGFuZCBhcmUgdGhlcmVmb3JlXG4gICAqIGV4ZW1wdCBmcm9tIGV2ZXJ5IGF1dGhvcmluZyBjaGVjay4gRGVmYXVsdHMgdG8gdGhlIHZhdWx0J3Mgb3duIGBSRUFETUUubWRgLCB3aGljaCBhZGRyZXNzZXMgc29tZW9uZVxuICAgKiBicm93c2luZyB0aGUgcmVwbyBvbiBHaXRIdWIgcmF0aGVyIHRoYW4gYSByZWFkZXIgd29ya2luZyB0aHJvdWdoIHRoZSB2YXVsdC5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTm90ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIG5vdGUgKHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIGV2ZXJ5IG90aGVyIG5vdGUgbXVzdCBiZSByZWFjaGFibGUgZnJvbS4gRGVmYXVsdHMgdG9cbiAgICogYDAwIFN0YXJ0Lm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0Tm90ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIGNvbmZpZyBpbnRlcmZhY2Ugd2hvc2Ugb3B0aW9ucyBhcmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb25maWdJbnRlcmZhY2VDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgd2hvc2UgcHJvcGVydGllcyBhcmUgdGhlIGNvbmZpZ1xuICAgKiBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJ9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIGV4ZW1wdCBmcm9tIHRoZSBhdXRob3JpbmcgY2hlY2tzLiBEZWZhdWx0cyB0byB0aGVcbiAgICogdmF1bHQncyBvd24gYFJFQURNRS5tZGAuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZE5vdGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwbHVnaW4gcmVwbyByb290IFx1MjAxNCB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgYGRlbW8tdmF1bHQvYCBhbmQgdGhlIHNvdXJjZSBiZWluZ1xuICAgKiByZWZsZWN0ZWQuIENhbGxlcnMgdHlwaWNhbGx5IHBhc3MgYGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kU3RhbGVSZWZlcmVuY2VzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kU3RhbGVSZWZlcmVuY2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSByZWNlaXZlciB3aG9zZSBgYCBgJHtyZWNlaXZlcn0uPG1lbWJlcj5gIGBgIHJlZmVyZW5jZXMgYXJlIHNjYW5uZWQgZm9yIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtZW1iZXJzIHRoYXQgY3VycmVudGx5IGV4aXN0IG9uIHRoZSByZWNlaXZlcjsgYW55IHJlZmVyZW5jZWQgbWVtYmVyIG5vdCBpbiB0aGlzIHNldCBpcyBzdGFsZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkTWVtYmVyczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWVtYmVyIG5hbWVzIHRoYXQgbXVzdCBlYWNoIGFwcGVhciBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICByZWFkb25seSBtZW1iZXJzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hlbiBzZXQsIGEgbWVtYmVyIGlzIGRlbW9uc3RyYXRlZCBvbmx5IGlmIGBgIGAke3JlY2VpdmVyfS4ke21lbWJlcn1gIGBgIGFwcGVhcnMgKGUuZy4gYSBjb250ZXh0IG9iamVjdCdzXG4gICAqIG1ldGhvZHMpOyB3aGVuIGFic2VudCwgdGhlIGJhcmUgbWVtYmVyIG5hbWUgaXMgbG9va2VkIHVwIChlLmcuIGEgY29uZmlnIG9wdGlvbikuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5saW5rZWRGZWF0dXJlRG9jc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVubGlua2VkRmVhdHVyZURvY3NQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRvY3MgZm9sZGVyIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSB0b3AtbGV2ZWwgYCoubWRgIGZpbGVzIGFyZSB0aGUgZmVhdHVyZSBkb2NzLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jc0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgdGhhdCBhcmUgTk9UIHBlci1mZWF0dXJlIHBhZ2VzIGFuZCBzbyBuZWVkIG5vIGxpbmtpbmcgZGVtbyBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uRmVhdHVyZURvY3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbnJlYWNoYWJsZU5vdGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5yZWFjaGFibGVOb3Rlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhlIHdhbGsgc3RhcnRzIGZyb20sIGUuZy4gYDAwIFN0YXJ0Lm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0Tm90ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSBgZXhwb3J0IGZ1bmN0aW9uYHMgYXJlIHBhcnNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRJbnRlcmZhY2VNZW1iZXJzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHRvIHBhcnNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBmZWF0dXJlLWRvYyBsaW5raW5nIGNoZWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIGRvY3MgZm9sZGVyIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSB0b3AtbGV2ZWwgYCoubWRgIGZpbGVzIGFyZSB0aGUgZmVhdHVyZSBkb2NzLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2MgYmFzZW5hbWVzICh3aXRob3V0IGAubWRgKSB0aGF0IGFyZSBOT1QgcGVyLWZlYXR1cmUgcGFnZXMgYW5kIHNvIG5lZWQgbm8gbGlua2luZyBkZW1vIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub25GZWF0dXJlRG9jczogc3RyaW5nW107XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBtb2R1bGUncyBleHBvcnRlZCBmdW5jdGlvbnMsIGVhY2ggZGVtb25zdHJhdGVkIGJ5IGl0cyBiYXJlIG5hbWUgaW4gdGhlIGRlbW8gY29ycHVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEZ1bmN0aW9uc0NvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBzaW5nbGUgaW50ZXJmYWNlJ3MgbWVtYmVycyBhbmQgZGVtb25zdHJhdGVzIHRoZW0gdmlhIGBgIGAke3JlY2VpdmVyfS48bWVtYmVyPmAgYGAgcmVmZXJlbmNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRJbnRlcmZhY2VDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgdG8gcmVmbGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZGVtb25zdHJhdGVkIG1lbWJlcnMgYXJlIHRoZSByZWZsZWN0ZWQgdHlwZSdzIG1ldGhvZHMgb3IgaXRzIHByb3BlcnRpZXMgKGVudW0gbWVtYmVycyBjb3VudCBhc1xuICAgKiBwcm9wZXJ0aWVzKS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IERlbW9WYXVsdEludGVyZmFjZU1lbWJlcktpbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIHRoZSBub3RlcyBjYWxsIHRoZSBtZW1iZXJzIG9uIChlLmcuIGBjb2RlQnV0dG9uQ29udGV4dGApLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBpbnRlcmZhY2UncyBkZW1vbnN0cmF0ZWQgbWVtYmVycyBhcmUgaXRzIG1ldGhvZHMgb3IgaXRzIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlbW9WYXVsdEludGVyZmFjZU1lbWJlcktpbmQgPSAnbWV0aG9kcycgfCAncHJvcGVydGllcyc7XG5cbi8qKlxuICogQ29uZmlndXJlcyB0aGUgZ3VhcmQgdGhhdCB0aGUgcmVmbGVjdGVkIHN1cmZhY2UgaXMgbm9uLXRyaXZpYWwgKHByb3RlY3RzIGFnYWluc3QgYSBwYXJzaW5nIHJlZ3Jlc3Npb25cbiAqIHNpbGVudGx5IGVtcHR5aW5nIGV2ZXJ5IG90aGVyIGNoZWNrKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjIHtcbiAgLyoqXG4gICAqIEEgZGVtbyBub3RlIChwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSB0aGF0IG11c3QgYmUgcHJlc2VudC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdERlbW9Ob3RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbWVtYmVyIHRoYXQgbXVzdCBiZSByZWZsZWN0ZWQgZnJvbSB7QGxpbmsgRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYy5pbnRlcmZhY2VOYW1lfS5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdE1lbWJlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB3aG9zZSBtZW1iZXJzIGFyZSByZS1wYXJzZWQgZm9yIHRoZVxuICAgKiBndWFyZC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgZGVtbyBub3RlLCBhcyByZWFkIGZyb20gdGhlIGRlbW8gdmF1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Tm90ZSB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZSdzIHJhdyBNYXJrZG93biBjb250ZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgZm9sZGVyLCBlLmcuIGAwMCBTdGFydC5tZGAuXG4gICAqL1xuICByZWFkb25seSByZWxhdGl2ZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyc2VkIG1lbWJlcnMgb2YgYSBzb3VyY2UgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgLyoqXG4gICAqIEV2ZXJ5IG1lbWJlciBcdTIwMTQge0BsaW5rIEludGVyZmFjZU1lbWJlcnMubWV0aG9kc30gZm9sbG93ZWQgYnkge0BsaW5rIEludGVyZmFjZU1lbWJlcnMucHJvcGVydGllc30uXG4gICAqL1xuICByZWFkb25seSBhbGw6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIG1lbWJlcnMgKGRlY2xhcmVkIGFzIGBuYW1lKC4uLilgKS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbWVtYmVycyAoZGVjbGFyZWQgYXMgYG5hbWU/OiAuLi5gKS5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnRpZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgbm90ZSBsaW5lIHBhaXJlZCB3aXRoIHRoZSBsaW5lIG51bWJlciBpdCBjYW1lIGZyb20sIHNvIGEgY2hlY2sgdGhhdCBza2lwcyBmZW5jZWQgYmxvY2tzIGNhbiBzdGlsbFxuICogcmVwb3J0IFx1MjAxNCBhbmQgYW4gaW5saW5lIGRpcmVjdGl2ZSBjYW4gc3RpbGwgbmFtZSBcdTIwMTQgdGhlIGxpbmUgYXMgdGhlIHJlYWRlciBzZWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGVMaW5lIHtcbiAgLyoqXG4gICAqIFRoZSB6ZXJvLWJhc2VkIGxpbmUgbnVtYmVyIHdpdGhpbiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lJ3MgcmF3IHRleHQuXG4gICAqL1xuICByZWFkb25seSBsaW5lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBgZGlzYWJsZWAgcmVnaW9uIHRoYXQgaGFzIGJlZW4gb3BlbmVkIGFuZCBub3QgeWV0IGVuYWJsZWQgYWdhaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3Blbldpa2lsaW5rRGlyZWN0aXZlUmVnaW9uIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJlZ2lvbiBoYXMgY292ZXJlZCBhIHdpa2lsaW5rLCB3aGljaCBpcyB3aGF0IHN0b3BzIGl0IGJlaW5nIHJlcG9ydGVkIGFzIHBvaW50bGVzcy5cbiAgICovXG4gIGlzVXNlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgdGhlIHJlZ2lvbiB3YXMgb3BlbmVkIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZUluZGV4OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUdW5lcyB0aGUgYWx3YXlzLW9uIGF1dGhvcmluZyBjaGVja3MsIG9yIGB1bmRlZmluZWRgIHRvIHRha2UgdGhlaXIgZGVmYXVsdHMuIEl0IGNhbm5vdCBkaXNhYmxlIHRoZW0uXG4gICAqL1xuICByZWFkb25seSBhdXRob3Jpbmc/OiBEZW1vVmF1bHRBdXRob3JpbmdTcGVjO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uZmlnIGludGVyZmFjZXMgd2hvc2Ugb3B0aW9ucyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ0ludGVyZmFjZXM6IERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjaywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGx1Z2luIHNoaXBzIG5vIGBkb2NzL2AgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jcz86IERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2R1bGVzIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAgICogcGx1Z2luIGV4cG9zZXMgbm8gc3VjaCBtb2R1bGUgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk1vZHVsZXM/OiBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGludGVyZmFjZXMgd2hvc2UgbWVtYmVycyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIChhbmQgcmVmZXJlbmNlZCB3aXRob3V0IGRyaWZ0KS5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZXM6IERlbW9WYXVsdEludGVyZmFjZUNvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZ3VhcmQgdGhhdCBrZWVwcyB0aGUgcmVmbGVjdGVkIHN1cmZhY2Ugbm9uLXRyaXZpYWwuXG4gICAqL1xuICByZWFkb25seSBub25Ucml2aWFsR3VhcmQ6IERlbW9WYXVsdE5vblRyaXZpYWxHdWFyZFNwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwbHVnaW4gcmVwbyByb290LiBDYWxsZXJzIHR5cGljYWxseSBwYXNzIGBnZXRSb290Rm9sZGVyKCkgPz8gcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBhIG5vdGUncyBpbmxpbmUgYG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlXHUyMDI2YCBkaXJlY3RpdmVzIGFsbG93LCBhbmQgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2lraWxpbmtEaXJlY3RpdmVTY2FuIHtcbiAgLyoqXG4gICAqIFRoZSB6ZXJvLWJhc2VkIGxpbmUgbnVtYmVycyBhIGRpcmVjdGl2ZSBhbGxvd3MgYSB3aWtpbGluayBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRMaW5lSW5kZXhlczogUmVhZG9ubHlTZXQ8bnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGl2ZSBtaXN0YWtlcyBmb3VuZCwgZWFjaCBwaHJhc2VkIGZvciBhIGZhaWxpbmcgYXNzZXJ0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBydW5uaW5nIHN0YXRlIG9mIGEgZGlyZWN0aXZlIHNjYW4sIHRocmVhZGVkIHRocm91Z2ggdGhlIHBlci1saW5lIGhlbHBlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2lraWxpbmtEaXJlY3RpdmVTY2FuU3RhdGUge1xuICAvKipcbiAgICogVGhlIGxpbmVzIGEgZGlyZWN0aXZlIGhhcyBhbGxvd2VkIGEgd2lraWxpbmsgb24gc28gZmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZExpbmVJbmRleGVzOiBTZXQ8bnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbiBjdXJyZW50bHkgb3BlbiwgYW5kIHdoZXRoZXIgaXQgaGFzIGNvdmVyZWQgYSB3aWtpbGluayB5ZXQuXG4gICAqL1xuICBvcGVuUmVnaW9uOiBudWxsIHwgT3Blbldpa2lsaW5rRGlyZWN0aXZlUmVnaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBhIGBkaXNhYmxlLW5leHQtbGluZWAgd2FzIHJlYWQgb24sIHdoaWxlIGl0IHN0aWxsIHdhaXRzIGZvciB0aGUgbGluZSBpdCBjb3ZlcnMuXG4gICAqL1xuICBwZW5kaW5nTmV4dExpbmVJbmRleDogbnVsbCB8IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGl2ZSBtaXN0YWtlcyBmb3VuZCBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lcyBvZiB0aGUgbm90ZSB0aGF0IGNhcnJ5IGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSB3aWtpbGlua0xpbmVJbmRleGVzOiBSZWFkb25seVNldDxudW1iZXI+O1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgcGx1Z2luJ3MgcHVibGljIHN1cmZhY2UgZnJvbSBzb3VyY2UgYW5kIGNoZWNrcyBpdHMgaW4tcmVwbyBgZGVtby12YXVsdC9gIHN0YXlzIGluIHN5bmMgd2l0aCBpdC5cbiAqXG4gKiBFdmVyeSBtZXRob2QgaXMgYSBwdXJlIHF1ZXJ5IG92ZXIgZmlsZXMgdW5kZXIgdGhlIHJlcG8gcm9vdCAodGhlIGRlbW8gY29ycHVzIGlzIHJlYWQgb25jZSBhbmQgY2FjaGVkKSwgc29cbiAqIHRoZSBjaGVja2VyIGlzIHRyaXZpYWxseSB1bml0LXRlc3RhYmxlIGFnYWluc3QgYSBmaXh0dXJlIHJlcG8gYW5kIGNhcnJpZXMgbm8gdGVzdC1mcmFtZXdvcmsgZGVwZW5kZW5jeS5cbiAqL1xuZXhwb3J0IGNsYXNzIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlciB7XG4gIHByaXZhdGUgY2FjaGVkQ29ycHVzOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWROb3RlczogRGVtb1ZhdWx0Tm90ZVtdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVtb1ZhdWx0Rm9sZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhjbHVkZWROb3RlczogU2V0PHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2hlY2tlciByb290ZWQgYXQgYSBwbHVnaW4gcmVwby5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29uc3RydWN0b3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMucm9vdEZvbGRlciA9IHBhcmFtcy5yb290Rm9sZGVyO1xuICAgIHRoaXMuZGVtb1ZhdWx0Rm9sZGVyID0gam9pbih0aGlzLnJvb3RGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCk7XG4gICAgdGhpcy5leGNsdWRlZE5vdGVzID0gbmV3IFNldChwYXJhbXMuZXhjbHVkZWROb3RlcyA/PyBERUZBVUxUX0VYQ0xVREVEX05PVEVTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0cyB0aGUgZGVtbyBub3RlcyBhcyBwYXRocyByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBmb2xkZXIgKGZvciBhIG5vbi10cml2aWFsLXN1cmZhY2UgZ3VhcmQpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgZXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQuXG4gICAqL1xuICBwdWJsaWMgY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdE5vdGVzKCkubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIGNhY2hlcyBldmVyeSBkZW1vIG5vdGUgaW5kaXZpZHVhbGx5IFx1MjAxNCB0aGUgcGVyLW5vdGUgdmlldyB0aGUgYXV0aG9yaW5nIGNoZWNrcyB3b3JrIG9uLCBhc1xuICAgKiBvcHBvc2VkIHRvIHRoZSBjb25jYXRlbmF0ZWQge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5yZWFkQ29ycHVzfS5cbiAgICpcbiAgICogQHJldHVybnMgRXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQsIGV4Y2x1ZGVkIG9uZXMgaW5jbHVkZWQuXG4gICAqL1xuICBwdWJsaWMgY29sbGVjdE5vdGVzKCk6IERlbW9WYXVsdE5vdGVbXSB7XG4gICAgdGhpcy5jYWNoZWROb3RlcyA/Pz0gdGhpcy5jb2xsZWN0TWFya2Rvd25GaWxlcyh0aGlzLmRlbW9WYXVsdEZvbGRlcikubWFwKChmaWxlKSA9PiAoe1xuICAgICAgY29udGVudDogcmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpLFxuICAgICAgcmVsYXRpdmVQYXRoOiByZWxhdGl2ZSh0aGlzLmRlbW9WYXVsdEZvbGRlciwgZmlsZSlcbiAgICB9KSk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkTm90ZXM7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGAub2JzaWRpYW4vYXBwLmpzb25gIHNldHRpbmdzIHRoZSB2YXVsdCBjb21taXRzIHRoYXQgYG9ic2lkaWFuLWRldi11dGlsc2Agb3ducyBhbmQgd3JpdGVzXG4gICAqIGludG8gdGhlIGFyY2hpdmVkIHZhdWx0IGl0c2VsZi4gQSBjb21taXR0ZWQgb25lIGlzIGEgc2Vjb25kIGNvcHkgb2YgYSBzZXR0aW5nIG5vdGhpbmcgcmVjb25jaWxlcywgYW5kXG4gICAqIGl0IGlzIHRoZSBjb3B5IHRoYXQgZ29lcyBzdGFsZSBcdTIwMTQgc28gdGhlIGNvbnZlbnRpb24gaXMgdGhhdCB0aGUgdmF1bHQgY29tbWl0cyBub25lIG9mIHRoZW0uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBuYW1lcyBvZiB0aGUgb3duZWQgc2V0dGluZ3MgdGhlIGNvbW1pdHRlZCBgYXBwLmpzb25gIHNldHMuIEEgdmF1bHQgdGhhdCBjb21taXRzIG5vXG4gICAqIGBhcHAuanNvbmAgYXQgYWxsIGlzIGZpbmUsIGFuZCB5aWVsZHMgbm9uZS5cbiAgICovXG4gIHB1YmxpYyBmaW5kQ29tbWl0dGVkQXBwSnNvblNldHRpbmdzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhcHBKc29uUGF0aCA9IGpvaW4odGhpcy5kZW1vVmF1bHRGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5BcHBKc29uKTtcbiAgICBjb25zdCBjb250ZW50ID0gZXhpc3RzU3luYyhhcHBKc29uUGF0aCkgPyByZWFkRmlsZVN5bmMoYXBwSnNvblBhdGgsICd1dGYtOCcpIDogbnVsbDtcbiAgICByZXR1cm4gZmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzKHsgYXBwSnNvbjogcGFyc2VEZW1vVmF1bHRBcHBKc29uKHsgY29udGVudCwgcGF0aDogYXBwSnNvblBhdGggfSkgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgY2FycnlpbmcgYSBgW0RvY3NdKFx1MjAyNilgIGxpbmsgbGluZS4gVGhlIG5vdGUgSVMgdGhlIGRvY3VtZW50YXRpb24sIHNvIGEgbGluZSBwb2ludGluZ1xuICAgKiBlbHNld2hlcmUgZm9yIHRoZSByZWFsIGV4cGxhbmF0aW9uIGlzIHRoZSBzaGFwZSB0aGlzIGNvbnZlbnRpb24gZXhpc3RzIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aERvY3NMaW5rcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+IGdldExpbmVzT3V0c2lkZUZlbmNlcyhub3RlLmNvbnRlbnQpLnNvbWUoKGxpbmUpID0+IERPQ1NfTElOS19SRUdfRVhQLnRlc3QobGluZSkpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHRoYXQgZG8gbm90IG9wZW4gd2l0aCBhbiBgIyBIMWAgKGZyb250bWF0dGVyIGFzaWRlKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aG91dEgxKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4gIWhhc0gxKG5vdGUuY29udGVudCkpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgd2l0aCBubyBwcm9zZSBwYXJhZ3JhcGggYmVmb3JlIHRoZWlyIGZpcnN0IGNvZGUgZmVuY2UgXHUyMDE0IHRoZSAxLTMgc2VudGVuY2VzIHNheWluZyB3aGF0IHRoZVxuICAgKiBmZWF0dXJlIGRvZXMgYW5kIHdoeSBhIHJlYWRlciB3b3VsZCB3YW50IGl0LCB3aXRob3V0IHdoaWNoIHRoZSBub3RlIGlzIGEgYnV0dG9uIHdpdGggbm8gbGVzc29uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRob3V0SW50cm9Qcm9zZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+ICFoYXNJbnRyb1Byb3NlKG5vdGUuY29udGVudCkpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgd2hvc2Ugd2lraWxpbmsgYWxsb3dhbmNlIGlzIG5vdCBkb2luZyBhbnkgd29yayBcdTIwMTQgZGVjbGFyZWQgd2l0aG91dCBhIHJlYXNvbiwgb3Igb24gYSBub3RlXG4gICAqIHRoYXQgY2FycmllcyBubyB3aWtpbGluayBhdCBhbGwuIEJvdGggYXJlIGRyaWZ0OiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCBhbmQgb25lIG5vdGhpbmcgbmVlZHNcbiAgICogYW55IG1vcmUsIHdoaWNoIHdvdWxkIGdvIG9uIGhpZGluZyB0aGUgbmV4dCB3aWtpbGluayBzb21lYm9keSBhZGRzIGJ5IGFjY2lkZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRoVW5qdXN0aWZpZWRXaWtpbGlua0FsbG93YW5jZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKCkuZmxhdE1hcCgobm90ZSkgPT4ge1xuICAgICAgY29uc3Qgc2NhbiA9IHNjYW5XaWtpbGlua0RpcmVjdGl2ZXMobm90ZS5jb250ZW50KTtcbiAgICAgIGNvbnN0IHByb2JsZW1zID0gWy4uLnNjYW4ucHJvYmxlbXNdO1xuICAgICAgY29uc3QgcmVhc29uID0gcmVhZFdpa2lsaW5rQWxsb3dhbmNlUmVhc29uKG5vdGUuY29udGVudCk7XG4gICAgICBpZiAocmVhc29uICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChyZWFzb24udHJpbSgpID09PSAnJykge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goJ2Egbm90ZS1sZXZlbCBhbGxvd2FuY2Ugd2l0aCBubyByZWFzb24nKTtcbiAgICAgICAgfSBlbHNlIGlmICghaGFzV2lraWxpbmsobm90ZS5jb250ZW50KSkge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goJ2Egbm90ZS1sZXZlbCBhbGxvd2FuY2UgY292ZXJpbmcgbm8gd2lraWxpbmsnKTtcbiAgICAgICAgfSBlbHNlIGlmIChzY2FuLmFsbG93ZWRMaW5lSW5kZXhlcy5zaXplID4gMCkge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goJ2lubGluZSBkaXJlY3RpdmVzIHRoZSBub3RlLWxldmVsIGFsbG93YW5jZSBhbHJlYWR5IGNvdmVycycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvYmxlbXMubWFwKChwcm9ibGVtKSA9PiBgJHtub3RlLnJlbGF0aXZlUGF0aH06ICR7cHJvYmxlbX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB1c2luZyBhbiBPYnNpZGlhbiBgW1t3aWtpbGlua11dYCBvdXRzaWRlIGEgY29kZSBmZW5jZS4gVGhlIGRlbW8gdmF1bHQgaXMgYWxzbyByZWFkIG9uXG4gICAqIEdpdEh1Yiwgd2hlcmUgYSB3aWtpbGluayByZW5kZXJzIGFzIGxpdGVyYWwgYnJhY2tldHMgYW5kIGxlYWRzIG5vd2hlcmUuIEEgd2lraWxpbmsgc2hvd24gSU5TSURFIGFcbiAgICogZmVuY2UgaXMgc2FtcGxlIHRleHQsIG5vdCBuYXZpZ2F0aW9uLCBzbyBmZW5jZWQgYmxvY2tzIGFyZSBza2lwcGVkLCBhcyBpcyBhIG5vdGUgdGhhdCBkZWNsYXJlcyBpbiBpdHNcbiAgICogZnJvbnRtYXR0ZXIgd2h5IGl0cyB3aWtpbGlua3MgYXJlIHRoZSBwb2ludCBcdTIwMTQgc2VlIHRoZSBmaWxlIG92ZXJ2aWV3LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRoV2lraWxpbmtzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4ge1xuICAgICAgICBpZiAocmVhZFdpa2lsaW5rQWxsb3dhbmNlUmVhc29uKG5vdGUuY29udGVudCkgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBhbGxvd2VkTGluZUluZGV4ZXMgfSA9IHNjYW5XaWtpbGlua0RpcmVjdGl2ZXMobm90ZS5jb250ZW50KTtcbiAgICAgICAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKG5vdGUuY29udGVudCkuc29tZSgobGluZUluZGV4KSA9PiAhYWxsb3dlZExpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbWVtYmVycyB0aGF0IHRoZSBkZW1vIG5vdGVzIHJlZmVyZW5jZSBvbiBhIHJlY2VpdmVyIGJ1dCB0aGF0IG5vIGxvbmdlciBleGlzdCBvbiBpdCAocmVuYW1lIGRyaWZ0KS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3Qgc3RhbGUgbWVtYmVyIG5hbWVzIHJlZmVyZW5jZWQgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcHVibGljIGZpbmRTdGFsZVJlZmVyZW5jZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kU3RhbGVSZWZlcmVuY2VzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZhbGlkTWVtYmVycyA9IG5ldyBTZXQocGFyYW1zLnZhbGlkTWVtYmVycyk7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IFsuLi50aGlzLnJlYWRDb3JwdXMoKS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgJHtwYXJhbXMucmVjZWl2ZXJ9XFwuKD88bWVtYmVyPlxcdyspYCwgJ2cnKSldXG4gICAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21lbWJlcicpKTtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQocmVmZXJlbmNlZCldLmZpbHRlcigobWVtYmVyKSA9PiAhdmFsaWRNZW1iZXJzLmhhcyhtZW1iZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBtZW1iZXJzIHRoYXQgYXJlIG5vdCBkZW1vbnN0cmF0ZWQgYW55d2hlcmUgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBtZW1iZXIgbmFtZXMgd2l0aCBubyBkZW1vbnN0cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvcnB1cyA9IHRoaXMucmVhZENvcnB1cygpO1xuICAgIHJldHVybiBwYXJhbXMubWVtYmVycy5maWx0ZXIoKG1lbWJlcikgPT4ge1xuICAgICAgY29uc3QgbmVlZGxlID0gcGFyYW1zLnJlY2VpdmVyID09PSB1bmRlZmluZWQgPyBtZW1iZXIgOiBgJHtwYXJhbXMucmVjZWl2ZXJ9LiR7bWVtYmVyfWA7XG4gICAgICByZXR1cm4gIWNvcnB1cy5pbmNsdWRlcyhuZWVkbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGZlYXR1cmUgZG9jcyB0aGF0IG5vIGRlbW8gbm90ZSBsaW5rcyB0by5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZmVhdHVyZS1kb2MgYmFzZW5hbWVzICh3aXRob3V0IGAubWRgKSBub3QgbGlua2VkIGZyb20gYW55IGRlbW8gbm90ZS5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5saW5rZWRGZWF0dXJlRG9jcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5vbkZlYXR1cmVEb2NzID0gbmV3IFNldChwYXJhbXMubm9uRmVhdHVyZURvY3MpO1xuICAgIGNvbnN0IGZlYXR1cmVEb2NzID0gcmVhZGRpclN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5kb2NzRm9sZGVyKSlcbiAgICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKVxuICAgICAgLm1hcCgoZmlsZSkgPT4gZmlsZS5yZXBsYWNlKC9cXC5tZCQvLCAnJykpXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAhbm9uRmVhdHVyZURvY3MuaGFzKG5hbWUpKTtcbiAgICBjb25zdCBsaW5rZWREb2NzID0gbmV3IFNldChcbiAgICAgIFsuLi50aGlzLnJlYWRDb3JwdXMoKS5tYXRjaEFsbCgvZG9jc1xcLyg/PGRvYz5bXFx3LV0rKVxcLm1kL2cpXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnZG9jJykpXG4gICAgKTtcbiAgICByZXR1cm4gZmVhdHVyZURvY3MuZmlsdGVyKChkb2MpID0+ICFsaW5rZWREb2NzLmhhcyhkb2MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB0aGF0IGNhbm5vdCBiZSByZWFjaGVkIGZyb20gdGhlIHN0YXJ0IG5vdGUgYnkgZm9sbG93aW5nIE1hcmtkb3duIGxpbmtzIGJldHdlZW4gbm90ZXMuXG4gICAqXG4gICAqIFRoZSB3YWxrIHN0YXJ0cyBhdCB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMuc3RhcnROb3RlfSBhbmQgZm9sbG93c1xuICAgKiBldmVyeSBgW1RleHRdKDwuL05OIE5hbWUubWQ+KWAgbGluayBvdXRzaWRlIGEgY29kZSBmZW5jZSwgdHJhbnNpdGl2ZWx5LiBBIG5vdGUgbm90aGluZyBsaW5rcyB0byBpc1xuICAgKiBvbmUgYSByZWFkZXIgY2FuIG9ubHkgZmluZCBieSBicm93c2luZyB0aGUgZmlsZSBsaXN0IFx1MjAxNCB3aGljaCBpcyBleGFjdGx5IHdoYXQgdGhlIGdyb3VwZWQgaW5kZXggaW4gdGhlXG4gICAqIHN0YXJ0IG5vdGUgaXMgbWVhbnQgdG8gcmVwbGFjZS4gV2hlbiB0aGUgc3RhcnQgbm90ZSBpdHNlbGYgaXMgbWlzc2luZywgRVZFUlkgbm90ZSBpcyB1bnJlYWNoYWJsZSxcbiAgICogYmVjYXVzZSB0aGVyZSBpcyBub3doZXJlIHRvIHN0YXJ0IGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHdhbGsuXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgdW5yZWFjaGFibGUgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZFVucmVhY2hhYmxlTm90ZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5yZWFjaGFibGVOb3Rlc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBub3Rlc0J5UmVsYXRpdmVQYXRoID0gbmV3IE1hcCh0aGlzLmNvbGxlY3ROb3RlcygpLm1hcCgobm90ZSkgPT4gW25vdGUucmVsYXRpdmVQYXRoLCBub3RlXSkpO1xuICAgIGNvbnN0IHJlYWNoZWROb3RlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHBlbmRpbmdOb3RlcyA9IFtwYXJhbXMuc3RhcnROb3RlXTtcblxuICAgIHdoaWxlIChwZW5kaW5nTm90ZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm90ZVBhdGggPSBlbnN1cmVOb25OdWxsYWJsZShwZW5kaW5nTm90ZXMucG9wKCkpO1xuICAgICAgY29uc3Qgbm90ZSA9IG5vdGVzQnlSZWxhdGl2ZVBhdGguZ2V0KG5vdGVQYXRoKTtcbiAgICAgIGlmICghbm90ZSB8fCByZWFjaGVkTm90ZXMuaGFzKG5vdGVQYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlYWNoZWROb3Rlcy5hZGQobm90ZVBhdGgpO1xuICAgICAgcGVuZGluZ05vdGVzLnB1c2goLi4uY29sbGVjdE5vdGVMaW5rVGFyZ2V0cyhub3RlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKVxuICAgICAgLmZpbHRlcigobm90ZVBhdGgpID0+ICFyZWFjaGVkTm90ZXMuaGFzKG5vdGVQYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBuYW1lcyBvZiB0aGUgYGV4cG9ydCBmdW5jdGlvbmBzIChpbmNsdWRpbmcgYGFzeW5jYCBhbmQgZ2VuZXJhdG9yIGRlY2xhcmF0aW9ucykgaW4gYSBzb3VyY2UgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZXhwb3J0ZWQgZnVuY3Rpb24gbmFtZXMgaW4gc291cmNlIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGdldEV4cG9ydGVkRnVuY3Rpb25OYW1lcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPSByZWFkRmlsZVN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5zb3VyY2VQYXRoKSwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIFsuLi5zb3VyY2UubWF0Y2hBbGwoL15leHBvcnQgKD86YXN5bmMgKT9mdW5jdGlvblxcKj8gKD88bmFtZT5cXHcrKS9nbSldXG4gICAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBtZW1iZXJzIG9mIGFuIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgZGVjbGFyZWQgaW4gYSBzb3VyY2UgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgcGFyc2VkIHtAbGluayBJbnRlcmZhY2VNZW1iZXJzfS5cbiAgICogQHRocm93cyBXaGVuIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgc291cmNlIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0SW50ZXJmYWNlTWVtYmVycyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEludGVyZmFjZU1lbWJlcnNQYXJhbXMpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgICBjb25zdCBzb3VyY2UgPSByZWFkRmlsZVN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5zb3VyY2VQYXRoKSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgZXhwb3J0ICg/PGtleXdvcmQ+aW50ZXJmYWNlfGNsYXNzfGVudW0pICR7cGFyYW1zLmludGVyZmFjZU5hbWV9XFxiW157XSpcXHsoPzxib2R5PltcXHNcXFNdKj8pXFxuXFx9YCkuZXhlYyhzb3VyY2UpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgaW50ZXJmYWNlICR7cGFyYW1zLmludGVyZmFjZU5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZU1lbWJlcnMoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2tleXdvcmQnKSwgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2JvZHknKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIGNhY2hlcyB0aGUgZGVtbyBjb3JwdXMgXHUyMDE0IGV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0IGpvaW5lZCBpbnRvIG9uZSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjb25jYXRlbmF0ZWQgZGVtby1ub3RlIGNvbnRlbnRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRDb3JwdXMoKTogc3RyaW5nIHtcbiAgICB0aGlzLmNhY2hlZENvcnB1cyA/Pz0gdGhpcy5jb2xsZWN0Tm90ZXMoKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5jb250ZW50KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZENvcnB1cztcbiAgfVxuXG4gIC8vIFRoZSBub3RlcyB0aGUgYXV0aG9yaW5nIGNoZWNrcyBhcHBseSB0bzogZXZlcnkgbm90ZSBleGNlcHQgdGhlIG9uZXMgZGVjbGFyZWQgb3V0c2lkZSB0aGUgbGVhcm5pbmdcbiAgLy8gUGF0aCAodGhlIHZhdWx0J3Mgb3duIGBSRUFETUUubWRgIGJ5IGRlZmF1bHQpLlxuICBwcml2YXRlIGNvbGxlY3RDaGVja2FibGVOb3RlcygpOiBEZW1vVmF1bHROb3RlW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3ROb3RlcygpLmZpbHRlcigobm90ZSkgPT4gIXRoaXMuZXhjbHVkZWROb3Rlcy5oYXMobm90ZS5yZWxhdGl2ZVBhdGgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdE1hcmtkb3duRmlsZXMoZm9sZGVyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlmIChlbnRyeS5uYW1lID09PSBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Ob2RlTW9kdWxlcyBhcyBzdHJpbmcpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmNvbGxlY3RNYXJrZG93bkZpbGVzKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSkpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICByZXN1bHQucHVzaChqb2luKGZvbGRlciwgZW50cnkubmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgYHZpdGVzdGAgc3VpdGUgdGhhdCBrZWVwcyBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCBpbiBzeW5jIHdpdGggaXRzIHB1YmxpYyBzdXJmYWNlLlxuICpcbiAqIENhbGwgaXQgb25jZSBmcm9tIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQubm8tYXBwLmludGVncmF0aW9uLnRlc3QudHNgOyBpdCByZWdpc3RlcnMgb25lIHRlc3QgcGVyIGNoZWNrLFxuICogZGVsZWdhdGluZyB0byB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyfS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRlY2xhcmF0aXZlIGNvdmVyYWdlIHNwZWNpZmljYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGUocGFyYW1zOiBSZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgY2hlY2tlciA9IG5ldyBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zPih7XG4gICAgZXhjbHVkZWROb3RlczogcGFyYW1zLmF1dGhvcmluZz8uZXhjbHVkZWROb3RlcyxcbiAgICByb290Rm9sZGVyOiBwYXJhbXMucm9vdEZvbGRlclxuICB9KSk7XG4gIGNvbnN0IHN0YXJ0Tm90ZSA9IHBhcmFtcy5hdXRob3Jpbmc/LnN0YXJ0Tm90ZSA/PyBERUZBVUxUX1NUQVJUX05PVEU7XG5cbiAgZGVzY3JpYmUoJ2RlbW8tdmF1bHQgY292ZXJhZ2UnLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5pbnRlcmZhY2VzKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSAke3NwZWMua2luZH1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGNvbnN0IGRlbW9uc3RyYXRlZCA9IG1lbWJlcnNbc3BlYy5raW5kXTtcbiAgICAgICAgZXhwZWN0KGRlbW9uc3RyYXRlZC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGRlbW9uc3RyYXRlZCwgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KGByZWZlcmVuY2VzIG5vICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kU3RhbGVSZWZlcmVuY2VzKHsgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIsIHZhbGlkTWVtYmVyczogbWVtYmVycy5hbGwgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5jb25maWdJbnRlcmZhY2VzKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBvcHRpb25gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChtZW1iZXJzLnByb3BlcnRpZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBtZW1iZXJzLnByb3BlcnRpZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5mdW5jdGlvbk1vZHVsZXMgPz8gW10pIHtcbiAgICAgIGl0KGBkZW1vbnN0cmF0ZXMgZXZlcnkgZXhwb3J0ZWQgZnVuY3Rpb24gaW4gJHtzcGVjLnNvdXJjZVBhdGh9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gY2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChmdW5jdGlvbk5hbWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogZnVuY3Rpb25OYW1lcyB9KSkudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NzID0gcGFyYW1zLmRvY3M7XG4gICAgaWYgKGRvY3MpIHtcbiAgICAgIGl0KCdsaW5rcyBhIGRlbW8gbm90ZSBmb3IgZXZlcnkgZmVhdHVyZSBkb2MnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzKHsgZG9jc0ZvbGRlcjogZG9jcy5mb2xkZXIsIG5vbkZlYXR1cmVEb2NzOiBkb2NzLm5vbkZlYXR1cmVEb2NzIH0pKVxuICAgICAgICAgIC50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdvcGVucyBldmVyeSBub3RlIHdpdGggYW4gSDEnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SDEoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGEgcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSBpdHMgZmlyc3QgY29kZSBibG9jaycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhvdXRJbnRyb1Byb3NlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoYHJlYWNoZXMgZXZlcnkgbm90ZSBmcm9tICR7c3RhcnROb3RlfWAsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbnJlYWNoYWJsZU5vdGVzKHsgc3RhcnROb3RlIH0pKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIG5vIHdpa2lsaW5rcywgd2hpY2ggZG8gbm90IHJlbmRlciBvbiBHaXRIdWInLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoV2lraWxpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2p1c3RpZmllcyBldmVyeSB3aWtpbGluayBhbGxvd2FuY2UsIGFuZCBkZWNsYXJlcyBub25lIGl0IG5vIGxvbmdlciBuZWVkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhcnJpZXMgbm8gRG9jcyBsaW5rIGxpbmUsIGJlY2F1c2UgdGhlIG5vdGUgaXMgdGhlIGRvY3MnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoRG9jc0xpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbW1pdHMgbm9uZSBvZiB0aGUgYXBwLmpzb24gc2V0dGluZ3Mgb2JzaWRpYW4tZGV2LXV0aWxzIGluamVjdHMgYXQgcmVsZWFzZSB0aW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZENvbW1pdHRlZEFwcEpzb25TZXR0aW5ncygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdrZWVwcyB0aGUgcmVmbGVjdGVkIHN1cmZhY2Ugbm9uLXRyaXZpYWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBndWFyZCA9IHBhcmFtcy5ub25Ucml2aWFsR3VhcmQ7XG4gICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKGd1YXJkKTtcbiAgICAgIGV4cGVjdChtZW1iZXJzLmFsbCkudG9Db250YWluKGd1YXJkLmV4cGVjdE1lbWJlcik7XG4gICAgICBleHBlY3QoY2hlY2tlci5jb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCkpLnRvQ29udGFpbihndWFyZC5leHBlY3REZW1vTm90ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5jb25zdCBDTEFTU19NRU1CRVJfTU9ESUZJRVJTID0gU3RyaW5nLnJhd2AoPzooPzpwdWJsaWN8cHJpdmF0ZXxwcm90ZWN0ZWR8cmVhZG9ubHl8c3RhdGljfGFic3RyYWN0fG92ZXJyaWRlKVxccyspKmA7XG5jb25zdCBBQlNPTFVURV9VUkxfUkVHX0VYUCA9IC9eW2Etel1bXFx3Ky4tXSo6L2k7XG5jb25zdCBBTkdMRV9CUkFDS0VUU19SRUdfRVhQID0gL148fD4kL2c7XG5jb25zdCBDT0RFX0ZFTkNFX1JFR19FWFAgPSAvXlxccyooPzpgYGB8fn5+KS87XG5jb25zdCBERUZBVUxUX0VYQ0xVREVEX05PVEVTID0gWydSRUFETUUubWQnXTtcbmNvbnN0IERFRkFVTFRfU1RBUlRfTk9URSA9ICcwMCBTdGFydC5tZCc7XG5jb25zdCBET0NTX0xJTktfUkVHX0VYUCA9IC9eXFxzKlxcW0RvY3NdXFwoLztcbmNvbnN0IEZST05UTUFUVEVSX1JFR19FWFAgPSAvXi0tLVxccj9cXG5bXFxzXFxTXSo/XFxyP1xcbi0tLVteXFxTXFxuXSpcXHI/XFxuPy87XG5jb25zdCBIMV9SRUdfRVhQID0gL14jIFxcUy87XG5jb25zdCBIRUFESU5HX1JFR19FWFAgPSAvXiN7MSw2fSAvO1xuY29uc3QgSU5MSU5FX0NPREVfUkVHX0VYUCA9IC9gW15gXFxuXSpgL2c7XG5jb25zdCBNQVJLRE9XTl9MSU5LX1JFR19FWFAgPSAvXFxbW15cXF1dKl1cXCgoPzx0YXJnZXQ+W14pXSspXFwpL2c7XG4vLyBBbiBpbmxpbmUgZGlyZWN0aXZlLCBzaGFwZWQgYWZ0ZXIgRVNMaW50J3MgYW5kIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBCT1RIIGluXG4vLyBPYnNpZGlhbiBhbmQgb24gR2l0SHViIFx1MjAxNCB0aGUgc2FtZSBzcGVsbGluZyB0aGUgdmF1bHRzIGFscmVhZHkgdXNlIGZvciBgbWFya2Rvd25saW50LWRpc2FibGUtbmV4dC1saW5lYC5cbi8vIEFuIE9ic2lkaWFuIGAlJSBcdTIwMjYgJSVgIGNvbW1lbnQgd291bGQgc2hvdyB1cCBhcyBsaXRlcmFsIHRleHQgb24gR2l0SHViLCB3aGljaCBpcyBoYWxmIHRoZSByZWFkZXJzaGlwLlxuY29uc3QgRElSRUNUSVZFX1JFR19FWFAgPSAvXlxccyo8IS0tXFxzKm9ic2lkaWFuLWRldi11dGlscy0oPzxhY3Rpb24+ZGlzYWJsZS1uZXh0LWxpbmV8ZGlzYWJsZXxlbmFibGUpXFxzKyg/PHJ1bGU+W1xcdy1dK1xcL1tcXHctXSspKD86XFxzKy0tXFxzKyg/PHJlYXNvbj4uKj8pKT9cXHMqLS0+XFxzKiQvO1xuLy8gQ2F0Y2hlcyBhIGRpcmVjdGl2ZSB0aGF0IHdhcyBNRUFOVCB0byBiZSBvbmUgYnV0IGlzIG1pc3NwZWxsZWQ6IGl0IHdvdWxkIG90aGVyd2lzZSByZWFkIGFzIGFuIG9yZGluYXJ5XG4vLyBDb21tZW50IGFuZCBzaWxlbnRseSBkbyBub3RoaW5nLCB3aGljaCBpcyB0aGUgZmFpbHVyZSBtb2RlIGEgc3VwcHJlc3Npb24gc3ludGF4IG11c3QgbmV2ZXIgaGF2ZS5cbmNvbnN0IERJUkVDVElWRV9QUk9CRV9SRUdfRVhQID0gLzwhLS1cXHMqb2JzaWRpYW4tZGV2LXV0aWxzLS87XG5jb25zdCBXSUtJTElOS19SVUxFID0gJ2RlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MnO1xuLy8gVGhlIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGZyb250bWF0dGVyIHBhdGgsIGF0IGFueSBpbmRlbnRhdGlvbjpcbi8vIFRoZSBrZXlzIG11c3QgbmVzdCBpbiB0aGF0IG9yZGVyLCBhbmQgYW55IGxpbmUgYmV0d2VlbiB0aGVtIGhhcyB0byBzdGF5IGluZGVudGVkLCBzbyBhIGRlZGVudCB0byB0aGVcbi8vIERvY3VtZW50J3Mgb3duIHRvcCBsZXZlbCBlbmRzIHRoZSBtYXRjaCByYXRoZXIgdGhhbiByZWFjaGluZyBhIHNhbWUtbmFtZWQga2V5IHVuZGVyIGFub3RoZXIgcGFyZW50LlxuY29uc3QgV0lLSUxJTktfQUxMT1dBTkNFX1JFR19FWFAgPSAvXm9ic2lkaWFuLWRldi11dGlsczpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2RlbW8tdmF1bHQtdmFsaWRhdGlvbjpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2FsbG93LXdpa2lsaW5rczooPzxyZWFzb24+LiopJC9tO1xuY29uc3QgV0lLSUxJTktfUkVHX0VYUCA9IC9cXFtcXFtbXlxcXV0rXV0vO1xuXG4vLyBBcHBsaWVzIG9uZSBwYXJzZWQgZGlyZWN0aXZlIHRvIHRoZSBzY2FuLlxuZnVuY3Rpb24gYXBwbHlXaWtpbGlua0RpcmVjdGl2ZShzdGF0ZTogV2lraWxpbmtEaXJlY3RpdmVTY2FuU3RhdGUsIGxpbmVJbmRleDogbnVtYmVyLCBtYXRjaDogUmVnRXhwRXhlY0FycmF5KTogdm9pZCB7XG4gIGNvbnN0IGFjdGlvbiA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdhY3Rpb24nKTtcbiAgY29uc3QgcnVsZSA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdydWxlJyk7XG4gIGNvbnN0IHJlYXNvbiA9IG1hdGNoLmdyb3Vwcz8uWydyZWFzb24nXT8udHJpbSgpID8/ICcnO1xuICBpZiAocnVsZSAhPT0gV0lLSUxJTktfUlVMRSkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGFuIHVua25vd24gcnVsZSBcIiR7cnVsZX1cIiBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFjdGlvbiAhPT0gJ2VuYWJsZScgJiYgcmVhc29uID09PSAnJykge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlyZWN0aXZlIHdpdGggbm8gcmVhc29uIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhY3Rpb24gPT09ICdkaXNhYmxlLW5leHQtbGluZScpIHtcbiAgICBzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCA9IGxpbmVJbmRleDtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnZGlzYWJsZScpIHtcbiAgICBpZiAoc3RhdGUub3BlblJlZ2lvbikge1xuICAgICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfSBpbnNpZGUgdGhlIHJlZ2lvbiBvcGVuZWQgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHN0YXRlLm9wZW5SZWdpb24ubGluZUluZGV4KX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGUub3BlblJlZ2lvbiA9IHsgaXNVc2VkOiBmYWxzZSwgbGluZUluZGV4IH07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFzdGF0ZS5vcGVuUmVnaW9uKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYW4gZW5hYmxlIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfSB3aXRoIG5vIHJlZ2lvbiBvcGVuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghc3RhdGUub3BlblJlZ2lvbi5pc1VzZWQpIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIHJlZ2lvbiBvcGVuZWQgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHN0YXRlLm9wZW5SZWdpb24ubGluZUluZGV4KX0gY292ZXJpbmcgbm8gd2lraWxpbmtgKTtcbiAgfVxuICBzdGF0ZS5vcGVuUmVnaW9uID0gbnVsbDtcbn1cblxuLy8gQXBwbGllcyBvbmUgb3JkaW5hcnkgbGluZSB0byB0aGUgc2NhbjogYW4gb3BlbiByZWdpb24gY292ZXJzIGl0LCBhbmQgYSBwZW5kaW5nIGBkaXNhYmxlLW5leHQtbGluZWBcbi8vIENsYWltcyB0aGUgZmlyc3QgbGluZSB3aXRoIGNvbnRlbnQgb24gaXQgXHUyMDE0IHRoZSBkaXJlY3RpdmUgYW5kIGl0cyB0YXJnZXQgYXJlIHVzdWFsbHkgYSBibGFuayBsaW5lIGFwYXJ0LlxuZnVuY3Rpb24gYXBwbHlXaWtpbGlua1NjYW5MaW5lKHN0YXRlOiBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSwgbGluZUluZGV4OiBudW1iZXIsIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoc3RhdGUub3BlblJlZ2lvbikge1xuICAgIHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlcy5hZGQobGluZUluZGV4KTtcbiAgICBzdGF0ZS5vcGVuUmVnaW9uLmlzVXNlZCB8fD0gc3RhdGUud2lraWxpbmtMaW5lSW5kZXhlcy5oYXMobGluZUluZGV4KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ID09PSBudWxsIHx8IGxpbmUudHJpbSgpID09PSAnJykge1xuICAgIHJldHVybjtcbiAgfVxuICBzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXMuYWRkKGxpbmVJbmRleCk7XG4gIGlmICghc3RhdGUud2lraWxpbmtMaW5lSW5kZXhlcy5oYXMobGluZUluZGV4KSkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZS1uZXh0LWxpbmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4KX0gY292ZXJpbmcgbm8gd2lraWxpbmtgKTtcbiAgfVxuICBzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWVtYmVycyhtZXRob2RzOiBzdHJpbmdbXSwgcHJvcGVydGllczogc3RyaW5nW10pOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgcmV0dXJuIHtcbiAgICBhbGw6IFsuLi5tZXRob2RzLCAuLi5wcm9wZXJ0aWVzXSxcbiAgICBtZXRob2RzLFxuICAgIHByb3BlcnRpZXNcbiAgfTtcbn1cblxuLy8gUmVzb2x2ZXMgdGhlIG5vdGVzIGEgbm90ZSBsaW5rcyB0bzogZXZlcnkgTWFya2Rvd24gbGluayBvdXRzaWRlIGEgY29kZSBmZW5jZSB3aG9zZSB0YXJnZXQgaXMgYSBgLm1kYFxuLy8gRmlsZSwgbWFkZSByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBzbyBpdCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBub3RlIG1hcC4gRXh0ZXJuYWwgVVJMcyBhbmRcbi8vIE5vbi1ub3RlIHRhcmdldHMgKGltYWdlcywgc2NyaXB0cykgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsZWFybmluZyBwYXRoIGFuZCBhcmUgc2tpcHBlZDsgYSBgI2FuY2hvcmAgaXNcbi8vIERyb3BwZWQsIHNpbmNlIGl0IGFkZHJlc3NlcyBhIHBsYWNlIGluc2lkZSBhbiBhbHJlYWR5LXJlc29sdmVkIG5vdGUuXG4vLyBSZXR1cm5zIHRoZSBub3RlJ3MgbGluZXMgd2l0aCBmZW5jZWQgY29kZSBibG9ja3MgcmVtb3ZlZCAodGhlIGZlbmNlIGxpbmVzIGluY2x1ZGVkKSwgcGFpcmVkIHdpdGggdGhlXG4vLyBMaW5lIG51bWJlciBlYWNoIGNhbWUgZnJvbSwgc28gYSBjaGVjayBuZXZlciBtaXN0YWtlcyBzYW1wbGUgY29kZSBmb3IgcHJvc2UgXHUyMDE0IGEgYFtbd2lraWxpbmtdXWBcbi8vIERlbW9uc3RyYXRlZCBpbnNpZGUgYSBmZW5jZSBpcyB0ZXh0LCBub3QgbmF2aWdhdGlvbiBcdTIwMTQgYW5kIGFuIGlubGluZSBkaXJlY3RpdmUgY2FuIHN0aWxsIG5hbWUgYSBsaW5lLlxuZnVuY3Rpb24gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBOb3RlTGluZVtdIHtcbiAgY29uc3Qgbm90ZUxpbmVzOiBOb3RlTGluZVtdID0gW107XG4gIGxldCBpc0luc2lkZUZlbmNlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoQ09ERV9GRU5DRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIGlzSW5zaWRlRmVuY2UgPSAhaXNJbnNpZGVGZW5jZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWlzSW5zaWRlRmVuY2UpIHtcbiAgICAgIG5vdGVMaW5lcy5wdXNoKHsgaW5kZXgsIGxpbmUgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3RlTGluZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZTogRGVtb1ZhdWx0Tm90ZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdGFyZ2V0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGdldExpbmVzT3V0c2lkZUZlbmNlcyhub3RlLmNvbnRlbnQpKSB7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBzdHJpcElubGluZUNvZGUobGluZSkubWF0Y2hBbGwoTUFSS0RPV05fTElOS19SRUdfRVhQKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnJlcGxhY2VBbGwoQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCwgJycpO1xuICAgICAgY29uc3QgW25vdGVQYXRoID0gJyddID0gdGFyZ2V0LnNwbGl0KCcjJywgMSk7XG4gICAgICBpZiAoQUJTT0xVVEVfVVJMX1JFR19FWFAudGVzdChub3RlUGF0aCkgfHwgIW5vdGVQYXRoLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0cy5wdXNoKGpvaW4oZGlybmFtZShub3RlLnJlbGF0aXZlUGF0aCksIHRyeURlY29kZVVyaUNvbXBvbmVudChub3RlUGF0aCkpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldHM7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGNsYXNzQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmNsYXNzQm9keS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgXiB7Mn0oPzxtb2RpZmllcnM+JHtDTEFTU19NRU1CRVJfTU9ESUZJRVJTfSkoPzxuYW1lPlxcdyspKD86PFtePl0qPik/XFwoYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc1Byb3BlcnR5TmFtZXMoY2xhc3NCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uY2xhc3NCb2R5Lm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeIHsyfSg/PG1vZGlmaWVycz4ke0NMQVNTX01FTUJFUl9NT0RJRklFUlN9KSg/PG5hbWU+XFx3KylcXHMqXFw/P1xccypbOj1dYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoZW51bUJvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5lbnVtQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspL2dtKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RNZXRob2ROYW1lcyhpbnRlcmZhY2VCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uaW50ZXJmYWNlQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspKD86PFtePl0qPik/XFwoL2dtKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm9wZXJ0eU5hbWVzKGludGVyZmFjZUJvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/PG5hbWU+XFx3KylcXD8/Oi9nbSldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xufVxuXG4vLyBUaGUgbGluZSBudW1iZXJzIGNhcnJ5aW5nIGEgd2lraWxpbmsgdGhhdCBpcyBuYXZpZ2F0aW9uIHJhdGhlciB0aGFuIHNhbXBsZSB0ZXh0LlxuZnVuY3Rpb24gZmluZFdpa2lsaW5rTGluZUluZGV4ZXMoY29udGVudDogc3RyaW5nKTogbnVtYmVyW10ge1xuICByZXR1cm4gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50KVxuICAgIC5maWx0ZXIoKG5vdGVMaW5lKSA9PiBXSUtJTElOS19SRUdfRVhQLnRlc3Qoc3RyaXBJbmxpbmVDb2RlKG5vdGVMaW5lLmxpbmUpKSlcbiAgICAubWFwKChub3RlTGluZSkgPT4gbm90ZUxpbmUuaW5kZXgpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBsaW5lICR7U3RyaW5nKGxpbmVJbmRleCArIDEpfWA7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBjb2xsZWN0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQpLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmxpbmUpO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlJ3MgZmlyc3QgY29udGVudCBsaW5lIChmcm9udG1hdHRlciBhbmQgYmxhbmsgbGluZXMgYXNpZGUpIGlzIGFuIGAjIEgxYC5cbmZ1bmN0aW9uIGhhc0gxKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaXBGcm9udG1hdHRlcihjb250ZW50KS5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gSDFfUkVHX0VYUC50ZXN0KHRyaW1tZWRMaW5lKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFdoZXRoZXIgYSBwbGFpbiBwcm9zZSBsaW5lIGFwcGVhcnMgYmVmb3JlIHRoZSBub3RlJ3MgZmlyc3QgY29kZSBmZW5jZS4gSGVhZGluZ3MgYXJlIG5vdCBwcm9zZSBcdTIwMTQgYSBub3RlXG4vLyBUaGF0IGdvZXMgc3RyYWlnaHQgZnJvbSBpdHMgdGl0bGUgdG8gYSBidXR0b24gaXMgZXhhY3RseSB0aGUgc2hhcGUgdGhpcyBjaGVjayByZWplY3RzLlxuZnVuY3Rpb24gaGFzSW50cm9Qcm9zZShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKENPREVfRkVOQ0VfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgaWYgKHRyaW1tZWRMaW5lID09PSAnJyB8fCBIRUFESU5HX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFdoZXRoZXIgdGhlIG5vdGUgbmF2aWdhdGVzIHdpdGggYW4gT2JzaWRpYW4gYFtbd2lraWxpbmtdXWAuIEZlbmNlZCBibG9ja3MgYW5kIGlubGluZSBjb2RlIGFyZSBzYW1wbGVcbi8vIFRleHQgcmF0aGVyIHRoYW4gbmF2aWdhdGlvbiwgc28gdGhleSBhcmUgcmVtb3ZlZCBiZWZvcmUgbG9va2luZy5cbmZ1bmN0aW9uIGhhc1dpa2lsaW5rKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmluZFdpa2lsaW5rTGluZUluZGV4ZXMoY29udGVudCkubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gaXNOb25QdWJsaWNNZW1iZXIobW9kaWZpZXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGIoPzpwcml2YXRlfHByb3RlY3RlZClcXGIvLnRlc3QobW9kaWZpZXJzKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNZW1iZXJzKGtleXdvcmQ6IHN0cmluZywgYm9keTogc3RyaW5nKTogSW50ZXJmYWNlTWVtYmVycyB7XG4gIHN3aXRjaCAoa2V5d29yZCkge1xuICAgIGNhc2UgJ2NsYXNzJzoge1xuICAgICAgcmV0dXJuIGJ1aWxkTWVtYmVycyhleHRyYWN0Q2xhc3NNZXRob2ROYW1lcyhib2R5KSwgZXh0cmFjdENsYXNzUHJvcGVydHlOYW1lcyhib2R5KSk7XG4gICAgfVxuICAgIGNhc2UgJ2VudW0nOiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKFtdLCBleHRyYWN0RW51bU1lbWJlck5hbWVzKGJvZHkpKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIGJ1aWxkTWVtYmVycyhleHRyYWN0TWV0aG9kTmFtZXMoYm9keSksIGV4dHJhY3RQcm9wZXJ0eU5hbWVzKGJvZHkpKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gUmVhZHMgdGhlIG5vdGUncyBgb2JzaWRpYW4tZGV2LXV0aWxzID4gZGVtby12YXVsdC12YWxpZGF0aW9uID4gYWxsb3ctd2lraWxpbmtzYCBkZWNsYXJhdGlvbjogdGhlIHN0YXRlZFxuLy8gUmVhc29uLCBgJydgIHdoZW4gdGhlIGtleSBpcyBwcmVzZW50IHdpdGggbm90aGluZyBhZnRlciBpdCwgb3IgYG51bGxgIHdoZW4gdGhlIG5vdGUgZGVjbGFyZXMgbm90aGluZy5cbi8vIFJlYWQgd2l0aCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiByYXRoZXIgdGhhbiBhIFlBTUwgcGFyc2VyOiBpdCBpcyBvbmUga25vd24ga2V5IHBhdGgsIGFuZCBldmVyeSBwbHVnaW4gdGhhdFxuLy8gSW5zdGFsbHMgdGhpcyBwYWNrYWdlIHdvdWxkIG90aGVyd2lzZSBjYXJyeSBhIFlBTUwgZGVwZW5kZW5jeSBmb3IgaXQuXG5mdW5jdGlvbiByZWFkV2lraWxpbmtBbGxvd2FuY2VSZWFzb24oY29udGVudDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gRlJPTlRNQVRURVJfUkVHX0VYUC5leGVjKGNvbnRlbnQpPy5bMF07XG4gIGlmIChmcm9udG1hdHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcmVhc29uID0gV0lLSUxJTktfQUxMT1dBTkNFX1JFR19FWFAuZXhlYyhmcm9udG1hdHRlcik/Lmdyb3Vwcz8uWydyZWFzb24nXTtcbiAgaWYgKHJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlYXNvbi50cmltKCkucmVwbGFjZSgvXig/PHF1b3RlPltcIiddKSg/PHZhbHVlPltcXHNcXFNdKilcXGs8cXVvdGU+JC8sICckPHZhbHVlPicpO1xufVxuXG4vLyBSZWFkcyB0aGUgbm90ZSdzIGlubGluZSBgb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGVcdTIwMjZgIGRpcmVjdGl2ZXMsIHJldHVybmluZyB3aGljaCBsaW5lcyB0aGV5IGFsbG93IGFcbi8vIFdpa2lsaW5rIG9uIGFuZCBldmVyeXRoaW5nIHdyb25nIHdpdGggdGhlbS4gQSBzdXBwcmVzc2lvbiB0aGF0IHF1aWV0bHkgZG9lcyBub3RoaW5nIGlzIHdvcnNlIHRoYW4gbm9uZSxcbi8vIFNvIGEgbWlzc3BlbGxlZCBkaXJlY3RpdmUsIG9uZSB3aXRoIG5vIHJlYXNvbiwgYW4gdW5jbG9zZWQgcmVnaW9uIGFuZCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmsgYXQgYWxsXG4vLyBBcmUgZWFjaCByZXBvcnRlZCByYXRoZXIgdGhhbiBpZ25vcmVkLlxuZnVuY3Rpb24gc2Nhbldpa2lsaW5rRGlyZWN0aXZlcyhjb250ZW50OiBzdHJpbmcpOiBXaWtpbGlua0RpcmVjdGl2ZVNjYW4ge1xuICBjb25zdCBzdGF0ZTogV2lraWxpbmtEaXJlY3RpdmVTY2FuU3RhdGUgPSB7XG4gICAgYWxsb3dlZExpbmVJbmRleGVzOiBuZXcgU2V0PG51bWJlcj4oKSxcbiAgICBvcGVuUmVnaW9uOiBudWxsLFxuICAgIHBlbmRpbmdOZXh0TGluZUluZGV4OiBudWxsLFxuICAgIHByb2JsZW1zOiBbXSxcbiAgICB3aWtpbGlua0xpbmVJbmRleGVzOiBuZXcgU2V0KGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpKVxuICB9O1xuXG4gIGZvciAoY29uc3QgeyBpbmRleCwgbGluZSB9IG9mIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkpIHtcbiAgICBjb25zdCBtYXRjaCA9IERJUkVDVElWRV9SRUdfRVhQLmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBhcHBseVdpa2lsaW5rRGlyZWN0aXZlKHN0YXRlLCBpbmRleCwgbWF0Y2gpO1xuICAgIH0gZWxzZSBpZiAoRElSRUNUSVZFX1BST0JFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBtYWxmb3JtZWQgZGlyZWN0aXZlIG9uICR7Zm9ybWF0TGluZU51bWJlcihpbmRleCl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGx5V2lraWxpbmtTY2FuTGluZShzdGF0ZSwgaW5kZXgsIGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5vcGVuUmVnaW9uKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihzdGF0ZS5vcGVuUmVnaW9uLmxpbmVJbmRleCl9IHRoYXQgaXMgbmV2ZXIgZW5hYmxlZCBhZ2FpbmApO1xuICB9XG4gIGlmIChzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCAhPT0gbnVsbCkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZS1uZXh0LWxpbmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4KX0gY292ZXJpbmcgbm8gd2lraWxpbmtgKTtcbiAgfVxuICByZXR1cm4geyBhbGxvd2VkTGluZUluZGV4ZXM6IHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlcywgcHJvYmxlbXM6IHN0YXRlLnByb2JsZW1zIH07XG59XG5cbmZ1bmN0aW9uIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShGUk9OVE1BVFRFUl9SRUdfRVhQLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5saW5lQ29kZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKElOTElORV9DT0RFX1JFR19FWFAsICcnKTtcbn1cblxuLy8gQSBoYW5kLXdyaXR0ZW4gbGluayBtYXkgY29udGFpbiBhIGJhcmUgYCVgIChvciBhbnkgb3RoZXIgaW52YWxpZCBwZXJjZW50LWVzY2FwZSksIHdoaWNoIG1ha2VzXG4vLyBgZGVjb2RlVVJJQ29tcG9uZW50YCB0aHJvdy4gU3VjaCBhIHRhcmdldCBpcyBtZWFudCBsaXRlcmFsbHksIHNvIGl0IGlzIHVzZWQgYXMgd3JpdHRlbi5cbmZ1bmN0aW9uIHRyeURlY29kZVVyaUNvbXBvbmVudCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdFQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLCtCQUErQjtBQUN4QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXVYQSxNQUFNLHlCQUF5QjtBQUFBLEVBQzVCLGVBQThCO0FBQUEsRUFDOUIsY0FBc0M7QUFBQSxFQUM3QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1YsWUFBWSxRQUFtRDtBQUNwRSxTQUFLLGFBQWEsT0FBTztBQUN6QixTQUFLLGtCQUFrQixLQUFLLEtBQUssWUFBWSx3QkFBd0IsU0FBUztBQUM5RSxTQUFLLGdCQUFnQixJQUFJLElBQUksT0FBTyxpQkFBaUIsc0JBQXNCO0FBQUEsRUFDN0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTywrQkFBeUM7QUFDOUMsV0FBTyxLQUFLLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVk7QUFBQSxFQUM1RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sZUFBZ0M7QUFDckMsU0FBSyxnQkFBZ0IsS0FBSyxxQkFBcUIsS0FBSyxlQUFlLEVBQUUsSUFBSSxDQUFDLFVBQVU7QUFBQSxNQUNsRixTQUFTLGFBQWEsTUFBTSxPQUFPO0FBQUEsTUFDbkMsY0FBYyxTQUFTLEtBQUssaUJBQWlCLElBQUk7QUFBQSxJQUNuRCxFQUFFO0FBQ0YsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVPLCtCQUF5QztBQUM5QyxVQUFNLGNBQWMsS0FBSyxLQUFLLGlCQUFpQix3QkFBd0IsYUFBYSx3QkFBd0IsT0FBTztBQUNuSCxVQUFNLFVBQVUsV0FBVyxXQUFXLElBQUksYUFBYSxhQUFhLE9BQU8sSUFBSTtBQUMvRSxXQUFPLGtDQUFrQyxFQUFFLFNBQVMsc0JBQXNCLEVBQUUsU0FBUyxNQUFNLFlBQVksQ0FBQyxFQUFFLENBQUM7QUFBQSxFQUM3RztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8seUJBQW1DO0FBQ3hDLFdBQU8sS0FBSyxzQkFBc0IsRUFDL0IsT0FBTyxDQUFDLFNBQVMsc0JBQXNCLEtBQUssT0FBTyxFQUFFLEtBQUssQ0FBQyxTQUFTLGtCQUFrQixLQUFLLElBQUksQ0FBQyxDQUFDLEVBQ2pHLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWTtBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08scUJBQStCO0FBQ3BDLFdBQU8sS0FBSyxzQkFBc0IsRUFDL0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLEVBQ3JDLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWTtBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTyw2QkFBdUM7QUFDNUMsV0FBTyxLQUFLLHNCQUFzQixFQUMvQixPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWMsS0FBSyxPQUFPLENBQUMsRUFDN0MsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZO0FBQUEsRUFDcEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU08sNENBQXNEO0FBQzNELFdBQU8sS0FBSyxzQkFBc0IsRUFBRSxRQUFRLENBQUMsU0FBUztBQUNwRCxZQUFNLE9BQU8sdUJBQXVCLEtBQUssT0FBTztBQUNoRCxZQUFNLFdBQVcsQ0FBQyxHQUFHLEtBQUssUUFBUTtBQUNsQyxZQUFNLFNBQVMsNEJBQTRCLEtBQUssT0FBTztBQUN2RCxVQUFJLFdBQVcsTUFBTTtBQUNuQixZQUFJLE9BQU8sS0FBSyxNQUFNLElBQUk7QUFDeEIsbUJBQVMsS0FBSyx1Q0FBdUM7QUFBQSxRQUN2RCxXQUFXLENBQUMsWUFBWSxLQUFLLE9BQU8sR0FBRztBQUNyQyxtQkFBUyxLQUFLLDZDQUE2QztBQUFBLFFBQzdELFdBQVcsS0FBSyxtQkFBbUIsT0FBTyxHQUFHO0FBQzNDLG1CQUFTLEtBQUssMkRBQTJEO0FBQUEsUUFDM0U7QUFBQSxNQUNGO0FBQ0EsYUFBTyxTQUFTLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxZQUFZLEtBQUssT0FBTyxFQUFFO0FBQUEsSUFDckUsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVTyx5QkFBbUM7QUFDeEMsV0FBTyxLQUFLLHNCQUFzQixFQUMvQixPQUFPLENBQUMsU0FBUztBQUNoQixVQUFJLDRCQUE0QixLQUFLLE9BQU8sTUFBTSxNQUFNO0FBQ3RELGVBQU87QUFBQSxNQUNUO0FBQ0EsWUFBTSxFQUFFLG1CQUFtQixJQUFJLHVCQUF1QixLQUFLLE9BQU87QUFDbEUsYUFBTyx3QkFBd0IsS0FBSyxPQUFPLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsSUFBSSxTQUFTLENBQUM7QUFBQSxJQUNyRyxDQUFDLEVBQ0EsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZO0FBQUEsRUFDcEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLG9CQUFvQixRQUFxRTtBQUM5RixVQUFNLGVBQWUsSUFBSSxJQUFJLE9BQU8sWUFBWTtBQUNoRCxVQUFNLGFBQWEsQ0FBQyxHQUFHLEtBQUssV0FBVyxFQUFFLFNBQVMsSUFBSSxPQUFPLE9BQU8sTUFBTSxPQUFPLFFBQVEsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLEVBQy9HLElBQUksQ0FBQyxVQUFVLHVCQUF1QixPQUFPLFFBQVEsQ0FBQztBQUN6RCxXQUFPLENBQUMsR0FBRyxJQUFJLElBQUksVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDO0FBQUEsRUFDOUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLDBCQUEwQixRQUEyRTtBQUMxRyxVQUFNLFNBQVMsS0FBSyxXQUFXO0FBQy9CLFdBQU8sT0FBTyxRQUFRLE9BQU8sQ0FBQyxXQUFXO0FBQ3ZDLFlBQU0sU0FBUyxPQUFPLGFBQWEsU0FBWSxTQUFTLEdBQUcsT0FBTyxRQUFRLElBQUksTUFBTTtBQUNwRixhQUFPLENBQUMsT0FBTyxTQUFTLE1BQU07QUFBQSxJQUNoQyxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sd0JBQXdCLFFBQXlFO0FBQ3RHLFVBQU0saUJBQWlCLElBQUksSUFBSSxPQUFPLGNBQWM7QUFDcEQsVUFBTSxjQUFjLFlBQVksS0FBSyxLQUFLLFlBQVksT0FBTyxVQUFVLENBQUMsRUFDckUsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLEtBQUssQ0FBQyxFQUNyQyxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsU0FBUyxFQUFFLENBQUMsRUFDdkMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDO0FBQzdDLFVBQU0sYUFBYSxJQUFJO0FBQUEsTUFDckIsQ0FBQyxHQUFHLEtBQUssV0FBVyxFQUFFLFNBQVMsMkJBQTJCLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxLQUFLLENBQUM7QUFBQSxJQUNsSDtBQUNBLFdBQU8sWUFBWSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUM7QUFBQSxFQUN6RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBY08scUJBQXFCLFFBQXNFO0FBQ2hHLFVBQU0sc0JBQXNCLElBQUksSUFBSSxLQUFLLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssY0FBYyxJQUFJLENBQUMsQ0FBQztBQUNoRyxVQUFNLGVBQWUsb0JBQUksSUFBWTtBQUNyQyxVQUFNLGVBQWUsQ0FBQyxPQUFPLFNBQVM7QUFFdEMsV0FBTyxhQUFhLFNBQVMsR0FBRztBQUM5QixZQUFNLFdBQVcsa0JBQWtCLGFBQWEsSUFBSSxDQUFDO0FBQ3JELFlBQU0sT0FBTyxvQkFBb0IsSUFBSSxRQUFRO0FBQzdDLFVBQUksQ0FBQyxRQUFRLGFBQWEsSUFBSSxRQUFRLEdBQUc7QUFDdkM7QUFBQSxNQUNGO0FBQ0EsbUJBQWEsSUFBSSxRQUFRO0FBQ3pCLG1CQUFhLEtBQUssR0FBRyx1QkFBdUIsSUFBSSxDQUFDO0FBQUEsSUFDbkQ7QUFFQSxXQUFPLEtBQUssc0JBQXNCLEVBQy9CLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWSxFQUMvQixPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUM7QUFBQSxFQUNyRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8seUJBQXlCLFFBQTBFO0FBQ3hHLFVBQU0sU0FBUyxhQUFhLEtBQUssS0FBSyxZQUFZLE9BQU8sVUFBVSxHQUFHLE9BQU87QUFDN0UsV0FBTyxDQUFDLEdBQUcsT0FBTyxTQUFTLCtDQUErQyxDQUFDLEVBQ3hFLElBQUksQ0FBQyxVQUFVLHVCQUF1QixPQUFPLE1BQU0sQ0FBQztBQUFBLEVBQ3pEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNPLG9CQUFvQixRQUE2RTtBQUN0RyxVQUFNLFNBQVMsYUFBYSxLQUFLLEtBQUssWUFBWSxPQUFPLFVBQVUsR0FBRyxPQUFPO0FBQzdFLFVBQU0sUUFBUSxJQUFJLE9BQU8sT0FBTyw4Q0FBOEMsT0FBTyxhQUFhLGdDQUFnQyxFQUFFLEtBQUssTUFBTTtBQUMvSSxRQUFJLENBQUMsT0FBTztBQUNWLFlBQU0sSUFBSSxNQUFNLDRCQUE0QixPQUFPLGFBQWEsRUFBRTtBQUFBLElBQ3BFO0FBQ0EsV0FBTyxhQUFhLHVCQUF1QixPQUFPLFNBQVMsR0FBRyx1QkFBdUIsT0FBTyxNQUFNLENBQUM7QUFBQSxFQUNyRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGFBQXFCO0FBQzFCLFNBQUssaUJBQWlCLEtBQUssYUFBYSxFQUNyQyxJQUFJLENBQUMsU0FBUyxLQUFLLE9BQU8sRUFDMUIsS0FBSyxJQUFJO0FBQ1osV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQSxFQUlRLHdCQUF5QztBQUMvQyxXQUFPLEtBQUssYUFBYSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxjQUFjLElBQUksS0FBSyxZQUFZLENBQUM7QUFBQSxFQUN4RjtBQUFBLEVBRVEscUJBQXFCLFFBQTBCO0FBQ3JELFVBQU0sU0FBbUIsQ0FBQztBQUMxQixlQUFXLFNBQVMsWUFBWSxRQUFRLEVBQUUsZUFBZSxLQUFLLENBQUMsR0FBRztBQUNoRSxVQUFJLE1BQU0sWUFBWSxHQUFHO0FBQ3ZCLFlBQUksTUFBTSxTQUFTLHdCQUF3QixhQUF1QjtBQUNoRTtBQUFBLFFBQ0Y7QUFDQSxlQUFPLEtBQUssR0FBRyxLQUFLLHFCQUFxQixLQUFLLFFBQVEsTUFBTSxJQUFJLENBQUMsQ0FBQztBQUFBLE1BQ3BFLFdBQVcsTUFBTSxLQUFLLFNBQVMsS0FBSyxHQUFHO0FBQ3JDLGVBQU8sS0FBSyxLQUFLLFFBQVEsTUFBTSxJQUFJLENBQUM7QUFBQSxNQUN0QztBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBVU8sU0FBUywrQkFBK0IsUUFBb0Q7QUFDakcsUUFBTSxVQUFVLElBQUkseUJBQXlCLDRCQUF1RTtBQUFBLElBQ2xILGVBQWUsT0FBTyxXQUFXO0FBQUEsSUFDakMsWUFBWSxPQUFPO0FBQUEsRUFDckIsQ0FBQyxDQUFDO0FBQ0YsUUFBTSxZQUFZLE9BQU8sV0FBVyxhQUFhO0FBRWpELFdBQVMsdUJBQXVCLE1BQU07QUFDcEMsZUFBVyxRQUFRLE9BQU8sWUFBWTtBQUNwQyxTQUFHLHNCQUFzQixLQUFLLGFBQWEsSUFBSSxLQUFLLElBQUksSUFBSSxNQUFNO0FBQ2hFLGNBQU0sVUFBVSxRQUFRLG9CQUFvQixJQUFJO0FBQ2hELGNBQU0sZUFBZSxRQUFRLEtBQUssSUFBSTtBQUN0QyxlQUFPLGFBQWEsTUFBTSxFQUFFLGdCQUFnQixDQUFDO0FBQzdDLGVBQU8sUUFBUSwwQkFBMEIsRUFBRSxTQUFTLGNBQWMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFBQSxNQUMxRyxDQUFDO0FBRUQsU0FBRyxpQkFBaUIsS0FBSyxhQUFhLGlDQUFpQyxNQUFNO0FBQzNFLGNBQU0sVUFBVSxRQUFRLG9CQUFvQixJQUFJO0FBQ2hELGVBQU8sUUFBUSxvQkFBb0IsRUFBRSxVQUFVLEtBQUssVUFBVSxjQUFjLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLE1BQ3hHLENBQUM7QUFBQSxJQUNIO0FBRUEsZUFBVyxRQUFRLE9BQU8sa0JBQWtCO0FBQzFDLFNBQUcsc0JBQXNCLEtBQUssYUFBYSxXQUFXLE1BQU07QUFDMUQsY0FBTSxVQUFVLFFBQVEsb0JBQW9CLElBQUk7QUFDaEQsZUFBTyxRQUFRLFdBQVcsTUFBTSxFQUFFLGdCQUFnQixDQUFDO0FBQ25ELGVBQU8sUUFBUSwwQkFBMEIsRUFBRSxTQUFTLFFBQVEsV0FBVyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLE1BQ3ZGLENBQUM7QUFBQSxJQUNIO0FBRUEsZUFBVyxRQUFRLE9BQU8sbUJBQW1CLENBQUMsR0FBRztBQUMvQyxTQUFHLDJDQUEyQyxLQUFLLFVBQVUsSUFBSSxNQUFNO0FBQ3JFLGNBQU0sZ0JBQWdCLFFBQVEseUJBQXlCLElBQUk7QUFDM0QsZUFBTyxjQUFjLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQztBQUM5QyxlQUFPLFFBQVEsMEJBQTBCLEVBQUUsU0FBUyxjQUFjLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsTUFDbEYsQ0FBQztBQUFBLElBQ0g7QUFFQSxVQUFNLE9BQU8sT0FBTztBQUNwQixRQUFJLE1BQU07QUFDUixTQUFHLDJDQUEyQyxNQUFNO0FBQ2xELGVBQU8sUUFBUSx3QkFBd0IsRUFBRSxZQUFZLEtBQUssUUFBUSxnQkFBZ0IsS0FBSyxlQUFlLENBQUMsQ0FBQyxFQUNyRyxRQUFRLENBQUMsQ0FBQztBQUFBLE1BQ2YsQ0FBQztBQUFBLElBQ0g7QUFFQSxPQUFHLCtCQUErQixNQUFNO0FBQ3RDLGFBQU8sUUFBUSxtQkFBbUIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDakQsQ0FBQztBQUVELE9BQUcsdUVBQXVFLE1BQU07QUFDOUUsYUFBTyxRQUFRLDJCQUEyQixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFBQSxJQUN6RCxDQUFDO0FBRUQsT0FBRywyQkFBMkIsU0FBUyxJQUFJLE1BQU07QUFDL0MsYUFBTyxRQUFRLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFBQSxJQUNoRSxDQUFDO0FBRUQsT0FBRyxvREFBb0QsTUFBTTtBQUMzRCxhQUFPLFFBQVEsdUJBQXVCLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLElBQ3JELENBQUM7QUFFRCxPQUFHLDRFQUE0RSxNQUFNO0FBQ25GLGFBQU8sUUFBUSwwQ0FBMEMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDeEUsQ0FBQztBQUVELE9BQUcsMkRBQTJELE1BQU07QUFDbEUsYUFBTyxRQUFRLHVCQUF1QixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFBQSxJQUNyRCxDQUFDO0FBRUQsT0FBRyxvRkFBb0YsTUFBTTtBQUMzRixhQUFPLFFBQVEsNkJBQTZCLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLElBQzNELENBQUM7QUFFRCxPQUFHLDJDQUEyQyxNQUFNO0FBQ2xELFlBQU0sUUFBUSxPQUFPO0FBQ3JCLFlBQU0sVUFBVSxRQUFRLG9CQUFvQixLQUFLO0FBQ2pELGFBQU8sUUFBUSxHQUFHLEVBQUUsVUFBVSxNQUFNLFlBQVk7QUFDaEQsYUFBTyxRQUFRLDZCQUE2QixDQUFDLEVBQUUsVUFBVSxNQUFNLGNBQWM7QUFBQSxJQUMvRSxDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7QUFFQSxNQUFNLHlCQUF5QixPQUFPO0FBQ3RDLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0seUJBQXlCLENBQUMsV0FBVztBQUMzQyxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLG9CQUFvQjtBQUMxQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGFBQWE7QUFDbkIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSx3QkFBd0I7QUFJOUIsTUFBTSxvQkFBb0I7QUFHMUIsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxnQkFBZ0I7QUFJdEIsTUFBTSw2QkFBNkI7QUFDbkMsTUFBTSxtQkFBbUI7QUFHekIsU0FBUyx1QkFBdUIsT0FBbUMsV0FBbUIsT0FBOEI7QUFDbEgsUUFBTSxTQUFTLHVCQUF1QixPQUFPLFFBQVE7QUFDckQsUUFBTSxPQUFPLHVCQUF1QixPQUFPLE1BQU07QUFDakQsUUFBTSxTQUFTLE1BQU0sU0FBUyxRQUFRLEdBQUcsS0FBSyxLQUFLO0FBQ25ELE1BQUksU0FBUyxlQUFlO0FBQzFCLFVBQU0sU0FBUyxLQUFLLG9CQUFvQixJQUFJLFFBQVEsaUJBQWlCLFNBQVMsQ0FBQyxFQUFFO0FBQ2pGO0FBQUEsRUFDRjtBQUNBLE1BQUksV0FBVyxZQUFZLFdBQVcsSUFBSTtBQUN4QyxVQUFNLFNBQVMsS0FBSyxpQ0FBaUMsaUJBQWlCLFNBQVMsQ0FBQyxFQUFFO0FBQ2xGO0FBQUEsRUFDRjtBQUVBLE1BQUksV0FBVyxxQkFBcUI7QUFDbEMsVUFBTSx1QkFBdUI7QUFDN0I7QUFBQSxFQUNGO0FBRUEsTUFBSSxXQUFXLFdBQVc7QUFDeEIsUUFBSSxNQUFNLFlBQVk7QUFDcEIsWUFBTSxTQUFTLEtBQUssZ0JBQWdCLGlCQUFpQixTQUFTLENBQUMsZ0NBQWdDLGlCQUFpQixNQUFNLFdBQVcsU0FBUyxDQUFDLEVBQUU7QUFDN0k7QUFBQSxJQUNGO0FBQ0EsVUFBTSxhQUFhLEVBQUUsUUFBUSxPQUFPLFVBQVU7QUFDOUM7QUFBQSxFQUNGO0FBRUEsTUFBSSxDQUFDLE1BQU0sWUFBWTtBQUNyQixVQUFNLFNBQVMsS0FBSyxnQkFBZ0IsaUJBQWlCLFNBQVMsQ0FBQyxzQkFBc0I7QUFDckY7QUFBQSxFQUNGO0FBQ0EsTUFBSSxDQUFDLE1BQU0sV0FBVyxRQUFRO0FBQzVCLFVBQU0sU0FBUyxLQUFLLHNCQUFzQixpQkFBaUIsTUFBTSxXQUFXLFNBQVMsQ0FBQyx1QkFBdUI7QUFBQSxFQUMvRztBQUNBLFFBQU0sYUFBYTtBQUNyQjtBQUlBLFNBQVMsc0JBQXNCLE9BQW1DLFdBQW1CLE1BQW9CO0FBQ3ZHLE1BQUksTUFBTSxZQUFZO0FBQ3BCLFVBQU0sbUJBQW1CLElBQUksU0FBUztBQUN0QyxVQUFNLFdBQVcsV0FBVyxNQUFNLG9CQUFvQixJQUFJLFNBQVM7QUFDbkU7QUFBQSxFQUNGO0FBQ0EsTUFBSSxNQUFNLHlCQUF5QixRQUFRLEtBQUssS0FBSyxNQUFNLElBQUk7QUFDN0Q7QUFBQSxFQUNGO0FBQ0EsUUFBTSxtQkFBbUIsSUFBSSxTQUFTO0FBQ3RDLE1BQUksQ0FBQyxNQUFNLG9CQUFvQixJQUFJLFNBQVMsR0FBRztBQUM3QyxVQUFNLFNBQVMsS0FBSywwQkFBMEIsaUJBQWlCLE1BQU0sb0JBQW9CLENBQUMsdUJBQXVCO0FBQUEsRUFDbkg7QUFDQSxRQUFNLHVCQUF1QjtBQUMvQjtBQUVBLFNBQVMsYUFBYSxTQUFtQixZQUF3QztBQUMvRSxTQUFPO0FBQUEsSUFDTCxLQUFLLENBQUMsR0FBRyxTQUFTLEdBQUcsVUFBVTtBQUFBLElBQy9CO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRjtBQVNBLFNBQVMsMEJBQTBCLFNBQTZCO0FBQzlELFFBQU0sWUFBd0IsQ0FBQztBQUMvQixNQUFJLGdCQUFnQjtBQUNwQixhQUFXLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxNQUFNLElBQUksRUFBRSxRQUFRLEdBQUc7QUFDekQsUUFBSSxtQkFBbUIsS0FBSyxJQUFJLEdBQUc7QUFDakMsc0JBQWdCLENBQUM7QUFDakI7QUFBQSxJQUNGO0FBQ0EsUUFBSSxDQUFDLGVBQWU7QUFDbEIsZ0JBQVUsS0FBSyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQUEsSUFDaEM7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyx1QkFBdUIsTUFBK0I7QUFDN0QsUUFBTSxVQUFvQixDQUFDO0FBQzNCLGFBQVcsUUFBUSxzQkFBc0IsS0FBSyxPQUFPLEdBQUc7QUFDdEQsZUFBVyxTQUFTLGdCQUFnQixJQUFJLEVBQUUsU0FBUyxxQkFBcUIsR0FBRztBQUN6RSxZQUFNLFNBQVMsdUJBQXVCLE9BQU8sUUFBUSxFQUFFLFdBQVcsd0JBQXdCLEVBQUU7QUFDNUYsWUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sTUFBTSxLQUFLLENBQUM7QUFDM0MsVUFBSSxxQkFBcUIsS0FBSyxRQUFRLEtBQUssQ0FBQyxTQUFTLFlBQVksRUFBRSxTQUFTLEtBQUssR0FBRztBQUNsRjtBQUFBLE1BQ0Y7QUFDQSxjQUFRLEtBQUssS0FBSyxRQUFRLEtBQUssWUFBWSxHQUFHLHNCQUFzQixRQUFRLENBQUMsQ0FBQztBQUFBLElBQ2hGO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsd0JBQXdCLFdBQTZCO0FBQzVELFNBQU8sQ0FBQyxHQUFHLFVBQVUsU0FBUyxJQUFJLE9BQU8sT0FBTyx3QkFBd0Isc0JBQXNCLCtCQUErQixJQUFJLENBQUMsQ0FBQyxFQUNoSSxPQUFPLENBQUMsVUFBVSxDQUFDLGtCQUFrQix1QkFBdUIsT0FBTyxXQUFXLENBQUMsQ0FBQyxFQUNoRixJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxNQUFNLENBQUM7QUFDekQ7QUFFQSxTQUFTLDBCQUEwQixXQUE2QjtBQUM5RCxTQUFPLENBQUMsR0FBRyxVQUFVLFNBQVMsSUFBSSxPQUFPLE9BQU8sd0JBQXdCLHNCQUFzQiw4QkFBOEIsSUFBSSxDQUFDLENBQUMsRUFDL0gsT0FBTyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsdUJBQXVCLE9BQU8sV0FBVyxDQUFDLENBQUMsRUFDaEYsSUFBSSxDQUFDLFVBQVUsdUJBQXVCLE9BQU8sTUFBTSxDQUFDO0FBQ3pEO0FBRUEsU0FBUyx1QkFBdUIsVUFBNEI7QUFDMUQsU0FBTyxDQUFDLEdBQUcsU0FBUyxTQUFTLHFCQUFxQixDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsdUJBQXVCLE9BQU8sTUFBTSxDQUFDO0FBQzNHO0FBRUEsU0FBUyxtQkFBbUIsZUFBaUM7QUFDM0QsU0FBTyxDQUFDLEdBQUcsY0FBYyxTQUFTLG1DQUFtQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsdUJBQXVCLE9BQU8sTUFBTSxDQUFDO0FBQzlIO0FBRUEsU0FBUyxxQkFBcUIsZUFBaUM7QUFDN0QsU0FBTyxDQUFDLEdBQUcsY0FBYyxTQUFTLHlCQUF5QixDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsdUJBQXVCLE9BQU8sTUFBTSxDQUFDO0FBQ3BIO0FBR0EsU0FBUyx3QkFBd0IsU0FBMkI7QUFDMUQsU0FBTywwQkFBMEIsT0FBTyxFQUNyQyxPQUFPLENBQUMsYUFBYSxpQkFBaUIsS0FBSyxnQkFBZ0IsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUMxRSxJQUFJLENBQUMsYUFBYSxTQUFTLEtBQUs7QUFDckM7QUFFQSxTQUFTLGlCQUFpQixXQUEyQjtBQUNuRCxTQUFPLFFBQVEsT0FBTyxZQUFZLENBQUMsQ0FBQztBQUN0QztBQUVBLFNBQVMsc0JBQXNCLFNBQTJCO0FBQ3hELFNBQU8sMEJBQTBCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxTQUFTLElBQUk7QUFDM0U7QUFHQSxTQUFTLE1BQU0sU0FBMEI7QUFDdkMsYUFBVyxRQUFRLGlCQUFpQixPQUFPLEVBQUUsTUFBTSxJQUFJLEdBQUc7QUFDeEQsVUFBTSxjQUFjLEtBQUssS0FBSztBQUM5QixRQUFJLGdCQUFnQixJQUFJO0FBQ3RCO0FBQUEsSUFDRjtBQUNBLFdBQU8sV0FBVyxLQUFLLFdBQVc7QUFBQSxFQUNwQztBQUNBLFNBQU87QUFDVDtBQUlBLFNBQVMsY0FBYyxTQUEwQjtBQUMvQyxhQUFXLFFBQVEsaUJBQWlCLE9BQU8sRUFBRSxNQUFNLElBQUksR0FBRztBQUN4RCxRQUFJLG1CQUFtQixLQUFLLElBQUksR0FBRztBQUNqQyxhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sY0FBYyxLQUFLLEtBQUs7QUFDOUIsUUFBSSxnQkFBZ0IsTUFBTSxnQkFBZ0IsS0FBSyxXQUFXLEdBQUc7QUFDM0Q7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPO0FBQ1Q7QUFJQSxTQUFTLFlBQVksU0FBMEI7QUFDN0MsU0FBTyx3QkFBd0IsT0FBTyxFQUFFLFNBQVM7QUFDbkQ7QUFFQSxTQUFTLGtCQUFrQixXQUE0QjtBQUNyRCxTQUFPLDRCQUE0QixLQUFLLFNBQVM7QUFDbkQ7QUFFQSxTQUFTLGFBQWEsU0FBaUIsTUFBZ0M7QUFDckUsVUFBUSxTQUFTO0FBQUEsSUFDZixLQUFLLFNBQVM7QUFDWixhQUFPLGFBQWEsd0JBQXdCLElBQUksR0FBRywwQkFBMEIsSUFBSSxDQUFDO0FBQUEsSUFDcEY7QUFBQSxJQUNBLEtBQUssUUFBUTtBQUNYLGFBQU8sYUFBYSxDQUFDLEdBQUcsdUJBQXVCLElBQUksQ0FBQztBQUFBLElBQ3REO0FBQUEsSUFDQSxTQUFTO0FBQ1AsYUFBTyxhQUFhLG1CQUFtQixJQUFJLEdBQUcscUJBQXFCLElBQUksQ0FBQztBQUFBLElBQzFFO0FBQUEsRUFDRjtBQUNGO0FBTUEsU0FBUyw0QkFBNEIsU0FBZ0M7QUFDbkUsUUFBTSxjQUFjLG9CQUFvQixLQUFLLE9BQU8sSUFBSSxDQUFDO0FBQ3pELE1BQUksZ0JBQWdCLFFBQVc7QUFDN0IsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLFNBQVMsMkJBQTJCLEtBQUssV0FBVyxHQUFHLFNBQVMsUUFBUTtBQUM5RSxNQUFJLFdBQVcsUUFBVztBQUN4QixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sT0FBTyxLQUFLLEVBQUUsUUFBUSw4Q0FBOEMsVUFBVTtBQUN2RjtBQU1BLFNBQVMsdUJBQXVCLFNBQXdDO0FBQ3RFLFFBQU0sUUFBb0M7QUFBQSxJQUN4QyxvQkFBb0Isb0JBQUksSUFBWTtBQUFBLElBQ3BDLFlBQVk7QUFBQSxJQUNaLHNCQUFzQjtBQUFBLElBQ3RCLFVBQVUsQ0FBQztBQUFBLElBQ1gscUJBQXFCLElBQUksSUFBSSx3QkFBd0IsT0FBTyxDQUFDO0FBQUEsRUFDL0Q7QUFFQSxhQUFXLEVBQUUsT0FBTyxLQUFLLEtBQUssMEJBQTBCLE9BQU8sR0FBRztBQUNoRSxVQUFNLFFBQVEsa0JBQWtCLEtBQUssSUFBSTtBQUN6QyxRQUFJLE9BQU87QUFDVCw2QkFBdUIsT0FBTyxPQUFPLEtBQUs7QUFBQSxJQUM1QyxXQUFXLHdCQUF3QixLQUFLLElBQUksR0FBRztBQUM3QyxZQUFNLFNBQVMsS0FBSyw0QkFBNEIsaUJBQWlCLEtBQUssQ0FBQyxFQUFFO0FBQUEsSUFDM0UsT0FBTztBQUNMLDRCQUFzQixPQUFPLE9BQU8sSUFBSTtBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUVBLE1BQUksTUFBTSxZQUFZO0FBQ3BCLFVBQU0sU0FBUyxLQUFLLHNCQUFzQixpQkFBaUIsTUFBTSxXQUFXLFNBQVMsQ0FBQyw4QkFBOEI7QUFBQSxFQUN0SDtBQUNBLE1BQUksTUFBTSx5QkFBeUIsTUFBTTtBQUN2QyxVQUFNLFNBQVMsS0FBSywwQkFBMEIsaUJBQWlCLE1BQU0sb0JBQW9CLENBQUMsdUJBQXVCO0FBQUEsRUFDbkg7QUFDQSxTQUFPLEVBQUUsb0JBQW9CLE1BQU0sb0JBQW9CLFVBQVUsTUFBTSxTQUFTO0FBQ2xGO0FBRUEsU0FBUyxpQkFBaUIsU0FBeUI7QUFDakQsU0FBTyxRQUFRLFFBQVEscUJBQXFCLEVBQUU7QUFDaEQ7QUFFQSxTQUFTLGdCQUFnQixNQUFzQjtBQUM3QyxTQUFPLEtBQUssV0FBVyxxQkFBcUIsRUFBRTtBQUNoRDtBQUlBLFNBQVMsc0JBQXNCLE9BQXVCO0FBQ3BELE1BQUk7QUFDRixXQUFPLG1CQUFtQixLQUFLO0FBQUEsRUFDakMsUUFBUTtBQUNOLFdBQU87QUFBQSxFQUNUO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
576
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogU3RhdGljIGNvdmVyYWdlL2ZyZXNobmVzcyBjaGVja3MgdGhhdCBrZWVwIGEgcGx1Z2luJ3MgaW4tcmVwbyBgZGVtby12YXVsdC9gIGluIHN5bmMgd2l0aCBpdHMgcHVibGljIHN1cmZhY2UuXG4gKlxuICogQSBwbHVnaW4gY2FuIHNoaXAgYSBjdXJhdGVkIGRlbW8gdmF1bHQgYXQgYGRlbW8tdmF1bHQvYCBpbiBpdHMgcmVwbyByb290LiBUaGVzZSBoZWxwZXJzIHJlZmxlY3QgdGhlIHJlYWxcbiAqIHB1YmxpYyBBUEkvY29uZmlnL2RvY3Mgc3RyYWlnaHQgZnJvbSBzb3VyY2UgYW5kIGFzc2VydCBcdTIwMTQgV0lUSE9VVCBsYXVuY2hpbmcgT2JzaWRpYW4gXHUyMDE0IHRoYXQgZXZlcnkgZmVhdHVyZSBpc1xuICogZGVtb25zdHJhdGVkIGluIHRoZSBub3RlcyBhbmQgdGhhdCB0aGUgbm90ZXMgcmVmZXJlbmNlIG5vIEFQSSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzIChyZW5hbWUgZHJpZnQpLlxuICogVGhlIHJ1bnRpbWUgYmVoYXZpb3Igb2YgdGhlIHBsdWdpbiBpcyBjb3ZlcmVkIGJ5IGl0cyBvdGhlciBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IGJ5IHRoZSBkZW1vIHZhdWx0OyB0aGVcbiAqIHZhdWx0IGlzIGEgbGVhcm5pbmcgcmVzb3VyY2UsIGFuZCB0aGVzZSBjaGVja3Mgb25seSBndWFyZCB0aGF0IGl0IHN0YXlzIHRydXRoZnVsLlxuICpcbiAqIFRoZXkgYWxzbyBndWFyZCB0aGUgdmF1bHQncyBvd24gYC5vYnNpZGlhbi9hcHAuanNvbmA6IHRoZSBzZXR0aW5ncyBsaXN0ZWQgaW5cbiAqIHtAbGluayBERU1PX1ZBVUxUX0FQUF9KU09OX1NFVFRJTkdTfSBiZWxvbmcgdG8gYG9ic2lkaWFuLWRldi11dGlsc2AsIHdoaWNoIHdyaXRlcyB0aGVtIGludG8gdGhlIGFyY2hpdmVkXG4gKiB2YXVsdCBhdCByZWxlYXNlIHRpbWUsIHNvIGEgdmF1bHQgdGhhdCBjb21taXRzIGFueSBvZiB0aGVtIGlzIGtlZXBpbmcgYSBzZWNvbmQgY29weSBub3RoaW5nIHJlY29uY2lsZXMuXG4gKlxuICogVGhleSBhbHNvIGVuZm9yY2UgdGhlIGRlbW8tdmF1bHQgQVVUSE9SSU5HIGNvbnZlbnRpb24gXHUyMDE0IGV2ZXJ5IG5vdGUgb3BlbnMgd2l0aCBhbiBgIyBIMWAgYW5kIGEgcGxhaW5cbiAqIHByb3NlIHBhcmFncmFwaCwgZXZlcnkgbm90ZSBpcyByZWFjaGFibGUgZnJvbSB0aGUgc3RhcnQgbm90ZSwgYW5kIG5vIG5vdGUgdXNlcyBhIGBbW3dpa2lsaW5rXV1gIG9yIGFcbiAqIGBbRG9jc10oXHUyMDI2KWAgbGluZS4gVGhlc2UgY2hlY2tzIGFyZSB1bmNvbmRpdGlvbmFsOiB0aGUgZGVtbyB2YXVsdCBpcyB0aGUgcHVibGlzaGVkIGRvY3VtZW50YXRpb24sIHJlYWRcbiAqIGluIE9ic2lkaWFuIEFORCBvbiBHaXRIdWIgKHdoZXJlIGEgd2lraWxpbmsgZG9lcyBub3QgcmVuZGVyKSwgc28gYSBub3RlIHRoYXQgYnJlYWtzIHRoZSBjb252ZW50aW9uIGlzXG4gKiBicm9rZW4gZm9yIHJlYWwgcmVhZGVycy4gYGF1dGhvcmluZ2Agb25seSB0dW5lcyB0aGVtICh3aGljaCBub3RlIGlzIHRoZSBzdGFydCwgd2hpY2ggbm90ZXMgc2l0IG91dHNpZGVcbiAqIHRoZSBsZWFybmluZyBwYXRoKTsgaXQgY2Fubm90IHN3aXRjaCB0aGVtIG9mZi5cbiAqXG4gKiBPbmx5IGByb290Rm9sZGVyYCBpcyByZXF1aXJlZCwgc28gYSBwbHVnaW4gd2l0aCBubyBzZXR0aW5ncyBhbmQgbm8gcHVibGljIEFQSSB0byByZWZsZWN0IHJlZ2lzdGVycyB0aGVcbiAqIHN1aXRlIHdpdGggdGhhdCBhbG9uZSBhbmQgc3RpbGwgZ2V0cyBldmVyeSBhdXRob3JpbmcgY2hlY2sgXHUyMDE0IHRoZSBjaGVja3MgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggd2hhdCB0aGVcbiAqIHBsdWdpbiBleHBvc2VzLiBFYWNoIHJlZmxlY3Rpb24gc3BlYyAoYGNvbmZpZ0ludGVyZmFjZXNgLCBgaW50ZXJmYWNlc2AsIGBub25Ucml2aWFsR3VhcmRgKSBhZGRzIHRoZSBjaGVja3NcbiAqIGl0IGRlc2NyaWJlcyB3aGVuIHN1cHBsaWVkLiBUaGUgdmF1bHQgaXMgZ3VhcmRlZCBhZ2FpbnN0IGJlaW5nIGVtcHR5IGVpdGhlciB3YXk6IHdpdGggbm8gbm90ZXMgdG8gcmVhZCxcbiAqIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayB3b3VsZCBwYXNzIGJ5IGhhdmluZyBub3RoaW5nIHRvIGxvb2sgYXQuXG4gKlxuICogVGhlIG9uZSBleGNlcHRpb24gaXMgYSBub3RlIHdob3NlIFNVQkpFQ1QgaXMgdGhlIHdpa2lsaW5rIFx1MjAxNCBhbiBlbWJlZCBzcGVsbGluZyB0aGUgcmVhZGVyIGlzIGJlaW5nIHRhdWdodFxuICogdG8gdHlwZSwgYSBmcm9udG1hdHRlciBwcm9wZXJ0eSB2YWx1ZSB0aGF0IGV4aXN0cyB0byBjb250cmFzdCB3aXRoIGEgTWFya2Rvd24gbGluaywgYSBmaXh0dXJlIHRoYXQgbXVzdFxuICoga2VlcCB0aGUgd2lraWxpbmsgYSBjb21tYW5kIGlzIHN1cHBvc2VkIHRvIGxlYXZlIGFsb25lLCBhIGxpbmsgdGhlIHJlYWRlciBjbGlja3Mgd2hpbGUgaXQgc3RpbGwgcmVzb2x2ZXNcbiAqIHRvIG5vdGhpbmcuIFN1Y2ggYSBub3RlIHNheXMgc28gaXRzZWxmLCBzdGF0aW5nIHdoeSwgaW4gb25lIG9mIHR3byBmb3JtcyBtb2RlbGxlZCBvbiBFU0xpbnQncy5cbiAqXG4gKiBQZXIgbGluZSBvciBwZXIgcmVnaW9uLCB3cml0dGVuIGFzIGFuIEhUTUwgY29tbWVudCBzbyBpdCBpcyBpbnZpc2libGUgaW4gT2JzaWRpYW4gQU5EIG9uIEdpdEh1YiBcdTIwMTQgdGhlXG4gKiBzcGVsbGluZyB0aGVzZSB2YXVsdHMgYWxyZWFkeSB1c2UgZm9yIGBtYXJrZG93bmxpbnQtZGlzYWJsZS1uZXh0LWxpbmVgOlxuICpcbiAqIGBgYG1hcmtkb3duXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlLW5leHQtbGluZSBkZW1vLXZhdWx0LXZhbGlkYXRpb24vbm8td2lraWxpbmtzIC0tIENsaWNraW5nIGEgbGluayB0byBhIG5vdGUgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQgSVMgdGhlIGZlYXR1cmUuIC0tPlxuICogMi4gQ2xpY2sgdGhpcyBsaW5rOiBbW1Byb2plY3RzL0ZyZXNoIGlkZWFdXS5cbiAqXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gVGhlIHdpa2lsaW5rIGVtYmVkIGlzIHRoZSBzeW50YXggdGhpcyBub3RlIHRlYWNoZXMuIC0tPlxuICogIVtbYmFzaWMuaHRtbHw0MDBdXVxuICogPCEtLSBvYnNpZGlhbi1kZXYtdXRpbHMtZW5hYmxlIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0+XG4gKiBgYGBcbiAqXG4gKiBQZXIgbm90ZSwgaW4gdGhlIG5vdGUncyBvd24gZnJvbnRtYXR0ZXIgXHUyMDE0IHRoZSBvbmx5IGZvcm0gdGhhdCBjYW4gcmVhY2ggYSB3aWtpbGluayBJTlNJREUgZnJvbnRtYXR0ZXIsXG4gKiB3aGVyZSBhIGNvbW1lbnQgY2Fubm90IGdvOlxuICpcbiAqIGBgYHlhbWxcbiAqIC0tLVxuICogb2JzaWRpYW4tZGV2LXV0aWxzOlxuICogICBkZW1vLXZhdWx0LXZhbGlkYXRpb246XG4gKiAgICAgYWxsb3ctd2lraWxpbmtzOiBUaGUgYHdpa2lsaW5rYCBwcm9wZXJ0eSB2YWx1ZSBpcyB0aGUgY29udHJhc3QgdGhpcyBub3RlIGlzIGJ1aWx0IGFyb3VuZC5cbiAqIC0tLVxuICogYGBgXG4gKlxuICogRWl0aGVyIHdheSB0aGUgZGVjbGFyYXRpb24gdHJhdmVscyB3aXRoIHRoZSBub3RlIHJhdGhlciB0aGFuIHNpdHRpbmcgaW4gYSBsaXN0IHNvbWV3aGVyZSBlbHNlLCBpdCBjYXJyaWVzXG4gKiBpdHMganVzdGlmaWNhdGlvbiwgYW5kIGl0IGV4ZW1wdHMgb25seSB0aGUgV0lLSUxJTksgY2hlY2sgXHUyMDE0IHRoZSBIMSwgcHJvc2UsIHJlYWNoYWJpbGl0eSBhbmQgYFtEb2NzXWBcbiAqIGNoZWNrcyBzdGlsbCBhcHBseS4gQSBkZWNsYXJhdGlvbiB3aXRoIG5vIHJlYXNvbiwgb25lIGNvdmVyaW5nIG5vIHdpa2lsaW5rLCBhIHJlZ2lvbiBuZXZlciBlbmFibGVkIGFnYWluLFxuICogb3IgYSBtaXNzcGVsbGVkIGRpcmVjdGl2ZSBhbGwgZmFpbDogYW4gZXhlbXB0aW9uIG5vYm9keSBjYW4ganVzdGlmeSwgdGhhdCBub3RoaW5nIG5lZWRzIGFueSBtb3JlLCBvciB0aGF0XG4gKiBzaWxlbnRseSBkb2VzIG5vdGhpbmcgaXMgd29yc2UgdGhhbiBubyBleGVtcHRpb24gYXQgYWxsLlxuICpcbiAqIFR3byBsYXllcnMgYXJlIGV4cG9zZWQ6XG4gKiAtIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJ9IFx1MjAxNCBhIGZyYW1ld29yay1hZ25vc3RpYyBjb3JlIHRoYXQgcmVhZHMgdGhlIGNvcnB1cywgcGFyc2VzIGludGVyZmFjZSAvXG4gKiAgIGNsYXNzIC8gZW51bSBtZW1iZXJzIGFuZCBleHBvcnRlZCBmdW5jdGlvbnMsIGFuZCByZXR1cm5zIGRpYWdub3N0aWMgYXJyYXlzICh3aGF0IGlzIHVuZGVtb25zdHJhdGVkIC8gc3RhbGVcbiAqICAgLyB1bmxpbmtlZCAvIG9mZi1jb252ZW50aW9uKS5cbiAqIC0ge0BsaW5rIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZX0gXHUyMDE0IGEgdGhpbiB3cmFwcGVyIHRoYXQgcmVnaXN0ZXJzIGEgYHZpdGVzdGAgc3VpdGUgb3ZlciB0aGUgY29yZSwgc29cbiAqICAgYSBwbHVnaW4ncyBgZGVtby12YXVsdC5uby1hcHAuaW50ZWdyYXRpb24udGVzdC50c2AgaXMgYSBzaW5nbGUgZGVjbGFyYXRpdmUgY2FsbC5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgZGVzY3JpYmUsXG4gIGV4cGVjdCxcbiAgaXRcbn0gZnJvbSAndml0ZXN0JztcblxuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4vcGx1Z2luL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGRpcm5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJy4uL3JlZy1leHAudHMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQge1xuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuXG4vKipcbiAqIFR1bmVzIHRoZSBhbHdheXMtb24gYXV0aG9yaW5nIGNoZWNrcy4gSXQgY2Fubm90IGRpc2FibGUgdGhlbSBcdTIwMTQgc2VlIHRoZSBmaWxlIG92ZXJ2aWV3LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEF1dGhvcmluZ1NwZWMge1xuICAvKipcbiAgICogVGhlIG5vdGVzIChwYXRocyByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhhdCBzaXQgb3V0c2lkZSB0aGUgbGVhcm5pbmcgcGF0aCBhbmQgYXJlIHRoZXJlZm9yZVxuICAgKiBleGVtcHQgZnJvbSBldmVyeSBhdXRob3JpbmcgY2hlY2suIERlZmF1bHRzIHRvIHRoZSB2YXVsdCdzIG93biBgUkVBRE1FLm1kYCwgd2hpY2ggYWRkcmVzc2VzIHNvbWVvbmVcbiAgICogYnJvd3NpbmcgdGhlIHJlcG8gb24gR2l0SHViIHJhdGhlciB0aGFuIGEgcmVhZGVyIHdvcmtpbmcgdGhyb3VnaCB0aGUgdmF1bHQuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZE5vdGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBub3RlIChwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSBldmVyeSBvdGhlciBub3RlIG11c3QgYmUgcmVhY2hhYmxlIGZyb20uIERlZmF1bHRzIHRvXG4gICAqIGAwMCBTdGFydC5tZGAuXG4gICAqL1xuICByZWFkb25seSBzdGFydE5vdGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBjb25maWcgaW50ZXJmYWNlIHdob3NlIG9wdGlvbnMgYXJlIGRlbW9uc3RyYXRlZCBieSB0aGVpciBiYXJlIG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q29uZmlnSW50ZXJmYWNlQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHdob3NlIHByb3BlcnRpZXMgYXJlIHRoZSBjb25maWdcbiAgICogb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZXMgKHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSBleGVtcHQgZnJvbSB0aGUgYXV0aG9yaW5nIGNoZWNrcy4gRGVmYXVsdHMgdG8gdGhlXG4gICAqIHZhdWx0J3Mgb3duIGBSRUFETUUubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGx1Z2luIHJlcG8gcm9vdCBcdTIwMTQgdGhlIGZvbGRlciBjb250YWluaW5nIGBkZW1vLXZhdWx0L2AgYW5kIHRoZSBzb3VyY2UgYmVpbmdcbiAgICogcmVmbGVjdGVkLiBDYWxsZXJzIHR5cGljYWxseSBwYXNzIGBnZXRSb290Rm9sZGVyKCkgPz8gcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFN0YWxlUmVmZXJlbmNlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVjZWl2ZXIgd2hvc2UgYGAgYCR7cmVjZWl2ZXJ9LjxtZW1iZXI+YCBgYCByZWZlcmVuY2VzIGFyZSBzY2FubmVkIGZvciBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVtYmVycyB0aGF0IGN1cnJlbnRseSBleGlzdCBvbiB0aGUgcmVjZWl2ZXI7IGFueSByZWZlcmVuY2VkIG1lbWJlciBub3QgaW4gdGhpcyBzZXQgaXMgc3RhbGUuXG4gICAqL1xuICByZWFkb25seSB2YWxpZE1lbWJlcnM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG1lbWJlciBuYW1lcyB0aGF0IG11c3QgZWFjaCBhcHBlYXIgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtYmVyczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBhIG1lbWJlciBpcyBkZW1vbnN0cmF0ZWQgb25seSBpZiBgYCBgJHtyZWNlaXZlcn0uJHttZW1iZXJ9YCBgYCBhcHBlYXJzIChlLmcuIGEgY29udGV4dCBvYmplY3Qnc1xuICAgKiBtZXRob2RzKTsgd2hlbiBhYnNlbnQsIHRoZSBiYXJlIG1lbWJlciBuYW1lIGlzIGxvb2tlZCB1cCAoZS5nLiBhIGNvbmZpZyBvcHRpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVubGlua2VkRmVhdHVyZURvY3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGRvY3NGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIHRoYXQgYXJlIE5PVCBwZXItZmVhdHVyZSBwYWdlcyBhbmQgc28gbmVlZCBubyBsaW5raW5nIGRlbW8gbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vbkZlYXR1cmVEb2NzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5yZWFjaGFibGVOb3Rlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGUgKHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoZSB3YWxrIHN0YXJ0cyBmcm9tLCBlLmcuIGAwMCBTdGFydC5tZGAuXG4gICAqL1xuICByZWFkb25seSBzdGFydE5vdGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIGFyZSBwYXJzZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0SW50ZXJmYWNlTWVtYmVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB0byBwYXJzZS5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyB0aGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHREb2NzQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgdGhhdCBhcmUgTk9UIHBlci1mZWF0dXJlIHBhZ2VzIGFuZCBzbyBuZWVkIG5vIGxpbmtpbmcgZGVtbyBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uRmVhdHVyZURvY3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgbW9kdWxlJ3MgZXhwb3J0ZWQgZnVuY3Rpb25zLCBlYWNoIGRlbW9uc3RyYXRlZCBieSBpdHMgYmFyZSBuYW1lIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgc2luZ2xlIGludGVyZmFjZSdzIG1lbWJlcnMgYW5kIGRlbW9uc3RyYXRlcyB0aGVtIHZpYSBgYCBgJHtyZWNlaXZlcn0uPG1lbWJlcj5gIGBgIHJlZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHRvIHJlZmxlY3QuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRlbW9uc3RyYXRlZCBtZW1iZXJzIGFyZSB0aGUgcmVmbGVjdGVkIHR5cGUncyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzIChlbnVtIG1lbWJlcnMgY291bnQgYXNcbiAgICogcHJvcGVydGllcykuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBEZW1vVmF1bHRJbnRlcmZhY2VNZW1iZXJLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciB0aGUgbm90ZXMgY2FsbCB0aGUgbWVtYmVycyBvbiAoZS5nLiBgY29kZUJ1dHRvbkNvbnRleHRgKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gaW50ZXJmYWNlJ3MgZGVtb25zdHJhdGVkIG1lbWJlcnMgYXJlIGl0cyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgdHlwZSBEZW1vVmF1bHRJbnRlcmZhY2VNZW1iZXJLaW5kID0gJ21ldGhvZHMnIHwgJ3Byb3BlcnRpZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGd1YXJkIHRoYXQgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIGlzIG5vbi10cml2aWFsIChwcm90ZWN0cyBhZ2FpbnN0IGEgcGFyc2luZyByZWdyZXNzaW9uXG4gKiBzaWxlbnRseSBlbXB0eWluZyBldmVyeSBvdGhlciBjaGVjaykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYyB7XG4gIC8qKlxuICAgKiBBIGRlbW8gbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhhdCBtdXN0IGJlIHByZXNlbnQuXG4gICAqL1xuICByZWFkb25seSBleHBlY3REZW1vTm90ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIG1lbWJlciB0aGF0IG11c3QgYmUgcmVmbGVjdGVkIGZyb20ge0BsaW5rIERlbW9WYXVsdE5vblRyaXZpYWxHdWFyZFNwZWMuaW50ZXJmYWNlTmFtZX0uXG4gICAqL1xuICByZWFkb25seSBleHBlY3RNZW1iZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgd2hvc2UgbWVtYmVycyBhcmUgcmUtcGFyc2VkIGZvciB0aGVcbiAgICogZ3VhcmQuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGRlbW8gbm90ZSwgYXMgcmVhZCBmcm9tIHRoZSBkZW1vIHZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdE5vdGUge1xuICAvKipcbiAgICogVGhlIG5vdGUncyByYXcgTWFya2Rvd24gY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGUncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IGZvbGRlciwgZS5nLiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcnNlZCBtZW1iZXJzIG9mIGEgc291cmNlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJmYWNlTWVtYmVycyB7XG4gIC8qKlxuICAgKiBFdmVyeSBtZW1iZXIgXHUyMDE0IHtAbGluayBJbnRlcmZhY2VNZW1iZXJzLm1ldGhvZHN9IGZvbGxvd2VkIGJ5IHtAbGluayBJbnRlcmZhY2VNZW1iZXJzLnByb3BlcnRpZXN9LlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIG1ldGhvZCBtZW1iZXJzIChkZWNsYXJlZCBhcyBgbmFtZSguLi4pYCkuXG4gICAqL1xuICByZWFkb25seSBtZXRob2RzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IG1lbWJlcnMgKGRlY2xhcmVkIGFzIGBuYW1lPzogLi4uYCkuXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0aWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIG5vdGUgbGluZSBwYWlyZWQgd2l0aCB0aGUgbGluZSBudW1iZXIgaXQgY2FtZSBmcm9tLCBzbyBhIGNoZWNrIHRoYXQgc2tpcHMgZmVuY2VkIGJsb2NrcyBjYW4gc3RpbGxcbiAqIHJlcG9ydCBcdTIwMTQgYW5kIGFuIGlubGluZSBkaXJlY3RpdmUgY2FuIHN0aWxsIG5hbWUgXHUyMDE0IHRoZSBsaW5lIGFzIHRoZSByZWFkZXIgc2VlcyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RlTGluZSB7XG4gIC8qKlxuICAgKiBUaGUgemVyby1iYXNlZCBsaW5lIG51bWJlciB3aXRoaW4gdGhlIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSdzIHJhdyB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgYGRpc2FibGVgIHJlZ2lvbiB0aGF0IGhhcyBiZWVuIG9wZW5lZCBhbmQgbm90IHlldCBlbmFibGVkIGFnYWluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5XaWtpbGlua0RpcmVjdGl2ZVJlZ2lvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSByZWdpb24gaGFzIGNvdmVyZWQgYSB3aWtpbGluaywgd2hpY2ggaXMgd2hhdCBzdG9wcyBpdCBiZWluZyByZXBvcnRlZCBhcyBwb2ludGxlc3MuXG4gICAqL1xuICBpc1VzZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIHRoZSByZWdpb24gd2FzIG9wZW5lZCBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmVJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVQYXJhbXMge1xuICAvKipcbiAgICogVHVuZXMgdGhlIGFsd2F5cy1vbiBhdXRob3JpbmcgY2hlY2tzLCBvciBgdW5kZWZpbmVkYCB0byB0YWtlIHRoZWlyIGRlZmF1bHRzLiBJdCBjYW5ub3QgZGlzYWJsZSB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaW5nPzogRGVtb1ZhdWx0QXV0aG9yaW5nU3BlYztcblxuICAvKipcbiAgICogVGhlIGNvbmZpZyBpbnRlcmZhY2VzIHdob3NlIG9wdGlvbnMgbXVzdCBlYWNoIGJlIGRlbW9uc3RyYXRlZCBieSB0aGVpciBiYXJlIG5hbWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlXG4gICAqIHBsdWdpbiBoYXMgbm8gc2V0dGluZ3MuXG4gICAqL1xuICByZWFkb25seSBjb25maWdJbnRlcmZhY2VzPzogRGVtb1ZhdWx0Q29uZmlnSW50ZXJmYWNlQ292ZXJhZ2VTcGVjW107XG5cbiAgLyoqXG4gICAqIFRoZSBmZWF0dXJlLWRvYyBsaW5raW5nIGNoZWNrLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwbHVnaW4gc2hpcHMgbm8gYGRvY3MvYCBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSBkb2NzPzogRGVtb1ZhdWx0RG9jc0NvdmVyYWdlU3BlYztcblxuICAvKipcbiAgICogVGhlIG1vZHVsZXMgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBwbHVnaW4gZXhwb3NlcyBubyBzdWNoIG1vZHVsZSB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uTW9kdWxlcz86IERlbW9WYXVsdEZ1bmN0aW9uc0NvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJmYWNlcyB3aG9zZSBtZW1iZXJzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgKGFuZCByZWZlcmVuY2VkIHdpdGhvdXQgZHJpZnQpLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gICAqIHRoZSBwbHVnaW4gZXhwb3NlcyBubyBwdWJsaWMgQVBJIHN1cmZhY2UgdG8gcmVmbGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZXM/OiBEZW1vVmF1bHRJbnRlcmZhY2VDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGd1YXJkIHRoYXQga2VlcHMgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIG5vbi10cml2aWFsLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vIHJlZmxlY3RlZCBzdXJmYWNlXG4gICAqIHRvIGd1YXJkLiBUaGUgdmF1bHQgaXMgY2hlY2tlZCBmb3IgYmVpbmcgbm9uLWVtcHR5IGVpdGhlciB3YXkuXG4gICAqL1xuICByZWFkb25seSBub25Ucml2aWFsR3VhcmQ/OiBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGx1Z2luIHJlcG8gcm9vdC4gQ2FsbGVycyB0eXBpY2FsbHkgcGFzcyBgZ2V0Um9vdEZvbGRlcigpID8/IHByb2Nlc3MuY3dkKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgYSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZVx1MjAyNmAgZGlyZWN0aXZlcyBhbGxvdywgYW5kIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpa2lsaW5rRGlyZWN0aXZlU2NhbiB7XG4gIC8qKlxuICAgKiBUaGUgemVyby1iYXNlZCBsaW5lIG51bWJlcnMgYSBkaXJlY3RpdmUgYWxsb3dzIGEgd2lraWxpbmsgb24uXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXM6IFJlYWRvbmx5U2V0PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQsIGVhY2ggcGhyYXNlZCBmb3IgYSBmYWlsaW5nIGFzc2VydGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcnVubmluZyBzdGF0ZSBvZiBhIGRpcmVjdGl2ZSBzY2FuLCB0aHJlYWRlZCB0aHJvdWdoIHRoZSBwZXItbGluZSBoZWxwZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpa2lsaW5rRGlyZWN0aXZlU2NhblN0YXRlIHtcbiAgLyoqXG4gICAqIFRoZSBsaW5lcyBhIGRpcmVjdGl2ZSBoYXMgYWxsb3dlZCBhIHdpa2lsaW5rIG9uIHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRMaW5lSW5kZXhlczogU2V0PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gY3VycmVudGx5IG9wZW4sIGFuZCB3aGV0aGVyIGl0IGhhcyBjb3ZlcmVkIGEgd2lraWxpbmsgeWV0LlxuICAgKi9cbiAgb3BlblJlZ2lvbjogbnVsbCB8IE9wZW5XaWtpbGlua0RpcmVjdGl2ZVJlZ2lvbjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgYSBgZGlzYWJsZS1uZXh0LWxpbmVgIHdhcyByZWFkIG9uLCB3aGlsZSBpdCBzdGlsbCB3YWl0cyBmb3IgdGhlIGxpbmUgaXQgY292ZXJzLlxuICAgKi9cbiAgcGVuZGluZ05leHRMaW5lSW5kZXg6IG51bGwgfCBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQgc28gZmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZXMgb2YgdGhlIG5vdGUgdGhhdCBjYXJyeSBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgd2lraWxpbmtMaW5lSW5kZXhlczogUmVhZG9ubHlTZXQ8bnVtYmVyPjtcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIHBsdWdpbidzIHB1YmxpYyBzdXJmYWNlIGZyb20gc291cmNlIGFuZCBjaGVja3MgaXRzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCBzdGF5cyBpbiBzeW5jIHdpdGggaXQuXG4gKlxuICogRXZlcnkgbWV0aG9kIGlzIGEgcHVyZSBxdWVyeSBvdmVyIGZpbGVzIHVuZGVyIHRoZSByZXBvIHJvb3QgKHRoZSBkZW1vIGNvcnB1cyBpcyByZWFkIG9uY2UgYW5kIGNhY2hlZCksIHNvXG4gKiB0aGUgY2hlY2tlciBpcyB0cml2aWFsbHkgdW5pdC10ZXN0YWJsZSBhZ2FpbnN0IGEgZml4dHVyZSByZXBvIGFuZCBjYXJyaWVzIG5vIHRlc3QtZnJhbWV3b3JrIGRlcGVuZGVuY3kuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIge1xuICBwcml2YXRlIGNhY2hlZENvcnB1czogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgY2FjaGVkTm90ZXM6IERlbW9WYXVsdE5vdGVbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbW9WYXVsdEZvbGRlcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGVkTm90ZXM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNoZWNrZXIgcm9vdGVkIGF0IGEgcGx1Z2luIHJlcG8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLnJvb3RGb2xkZXIgPSBwYXJhbXMucm9vdEZvbGRlcjtcbiAgICB0aGlzLmRlbW9WYXVsdEZvbGRlciA9IGpvaW4odGhpcy5yb290Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQpO1xuICAgIHRoaXMuZXhjbHVkZWROb3RlcyA9IG5ldyBTZXQocGFyYW1zLmV4Y2x1ZGVkTm90ZXMgPz8gREVGQVVMVF9FWENMVURFRF9OT1RFUyk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIGRlbW8gbm90ZXMgYXMgcGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgZm9sZGVyIChmb3IgYSBub24tdHJpdmlhbC1zdXJmYWNlIGd1YXJkKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIGV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0LlxuICAgKi9cbiAgcHVibGljIGNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3ROb3RlcygpLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuZCBjYWNoZXMgZXZlcnkgZGVtbyBub3RlIGluZGl2aWR1YWxseSBcdTIwMTQgdGhlIHBlci1ub3RlIHZpZXcgdGhlIGF1dGhvcmluZyBjaGVja3Mgd29yayBvbiwgYXNcbiAgICogb3Bwb3NlZCB0byB0aGUgY29uY2F0ZW5hdGVkIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIucmVhZENvcnB1c30uXG4gICAqXG4gICAqIEByZXR1cm5zIEV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0LCBleGNsdWRlZCBvbmVzIGluY2x1ZGVkLlxuICAgKi9cbiAgcHVibGljIGNvbGxlY3ROb3RlcygpOiBEZW1vVmF1bHROb3RlW10ge1xuICAgIHRoaXMuY2FjaGVkTm90ZXMgPz89IHRoaXMuY29sbGVjdE1hcmtkb3duRmlsZXModGhpcy5kZW1vVmF1bHRGb2xkZXIpLm1hcCgoZmlsZSkgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IHJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKSxcbiAgICAgIHJlbGF0aXZlUGF0aDogcmVsYXRpdmUodGhpcy5kZW1vVmF1bHRGb2xkZXIsIGZpbGUpXG4gICAgfSkpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZE5vdGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBgLm9ic2lkaWFuL2FwcC5qc29uYCBzZXR0aW5ncyB0aGUgdmF1bHQgY29tbWl0cyB0aGF0IGBvYnNpZGlhbi1kZXYtdXRpbHNgIG93bnMgYW5kIHdyaXRlc1xuICAgKiBpbnRvIHRoZSBhcmNoaXZlZCB2YXVsdCBpdHNlbGYuIEEgY29tbWl0dGVkIG9uZSBpcyBhIHNlY29uZCBjb3B5IG9mIGEgc2V0dGluZyBub3RoaW5nIHJlY29uY2lsZXMsIGFuZFxuICAgKiBpdCBpcyB0aGUgY29weSB0aGF0IGdvZXMgc3RhbGUgXHUyMDE0IHNvIHRoZSBjb252ZW50aW9uIGlzIHRoYXQgdGhlIHZhdWx0IGNvbW1pdHMgbm9uZSBvZiB0aGVtLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmFtZXMgb2YgdGhlIG93bmVkIHNldHRpbmdzIHRoZSBjb21taXR0ZWQgYGFwcC5qc29uYCBzZXRzLiBBIHZhdWx0IHRoYXQgY29tbWl0cyBub1xuICAgKiBgYXBwLmpzb25gIGF0IGFsbCBpcyBmaW5lLCBhbmQgeWllbGRzIG5vbmUuXG4gICAqL1xuICBwdWJsaWMgZmluZENvbW1pdHRlZEFwcEpzb25TZXR0aW5ncygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYXBwSnNvblBhdGggPSBqb2luKHRoaXMuZGVtb1ZhdWx0Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbik7XG4gICAgY29uc3QgY29udGVudCA9IGV4aXN0c1N5bmMoYXBwSnNvblBhdGgpID8gcmVhZEZpbGVTeW5jKGFwcEpzb25QYXRoLCAndXRmLTgnKSA6IG51bGw7XG4gICAgcmV0dXJuIGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyh7IGFwcEpzb246IHBhcnNlRGVtb1ZhdWx0QXBwSnNvbih7IGNvbnRlbnQsIHBhdGg6IGFwcEpzb25QYXRoIH0pIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIGNhcnJ5aW5nIGEgYFtEb2NzXShcdTIwMjYpYCBsaW5rIGxpbmUuIFRoZSBub3RlIElTIHRoZSBkb2N1bWVudGF0aW9uLCBzbyBhIGxpbmUgcG9pbnRpbmdcbiAgICogZWxzZXdoZXJlIGZvciB0aGUgcmVhbCBleHBsYW5hdGlvbiBpcyB0aGUgc2hhcGUgdGhpcyBjb252ZW50aW9uIGV4aXN0cyB0byByZW1vdmUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhEb2NzTGlua3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiBnZXRMaW5lc091dHNpZGVGZW5jZXMobm90ZS5jb250ZW50KS5zb21lKChsaW5lKSA9PiBET0NTX0xJTktfUkVHX0VYUC50ZXN0KGxpbmUpKSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB0aGF0IGRvIG5vdCBvcGVuIHdpdGggYW4gYCMgSDFgIChmcm9udG1hdHRlciBhc2lkZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhvdXRIMSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+ICFoYXNIMShub3RlLmNvbnRlbnQpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHdpdGggbm8gcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSB0aGVpciBmaXJzdCBjb2RlIGZlbmNlIFx1MjAxNCB0aGUgMS0zIHNlbnRlbmNlcyBzYXlpbmcgd2hhdCB0aGVcbiAgICogZmVhdHVyZSBkb2VzIGFuZCB3aHkgYSByZWFkZXIgd291bGQgd2FudCBpdCwgd2l0aG91dCB3aGljaCB0aGUgbm90ZSBpcyBhIGJ1dHRvbiB3aXRoIG5vIGxlc3Nvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aG91dEludHJvUHJvc2UoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiAhaGFzSW50cm9Qcm9zZShub3RlLmNvbnRlbnQpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHdob3NlIHdpa2lsaW5rIGFsbG93YW5jZSBpcyBub3QgZG9pbmcgYW55IHdvcmsgXHUyMDE0IGRlY2xhcmVkIHdpdGhvdXQgYSByZWFzb24sIG9yIG9uIGEgbm90ZVxuICAgKiB0aGF0IGNhcnJpZXMgbm8gd2lraWxpbmsgYXQgYWxsLiBCb3RoIGFyZSBkcmlmdDogYW4gZXhlbXB0aW9uIG5vYm9keSBjYW4ganVzdGlmeSwgYW5kIG9uZSBub3RoaW5nIG5lZWRzXG4gICAqIGFueSBtb3JlLCB3aGljaCB3b3VsZCBnbyBvbiBoaWRpbmcgdGhlIG5leHQgd2lraWxpbmsgc29tZWJvZHkgYWRkcyBieSBhY2NpZGVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aFVuanVzdGlmaWVkV2lraWxpbmtBbGxvd2FuY2UoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpLmZsYXRNYXAoKG5vdGUpID0+IHtcbiAgICAgIGNvbnN0IHNjYW4gPSBzY2FuV2lraWxpbmtEaXJlY3RpdmVzKG5vdGUuY29udGVudCk7XG4gICAgICBjb25zdCBwcm9ibGVtcyA9IFsuLi5zY2FuLnByb2JsZW1zXTtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihub3RlLmNvbnRlbnQpO1xuICAgICAgaWYgKHJlYXNvbiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocmVhc29uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdhIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIHdpdGggbm8gcmVhc29uJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc1dpa2lsaW5rKG5vdGUuY29udGVudCkpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdhIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIGNvdmVyaW5nIG5vIHdpa2lsaW5rJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Nhbi5hbGxvd2VkTGluZUluZGV4ZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdpbmxpbmUgZGlyZWN0aXZlcyB0aGUgbm90ZS1sZXZlbCBhbGxvd2FuY2UgYWxyZWFkeSBjb3ZlcnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2JsZW1zLm1hcCgocHJvYmxlbSkgPT4gYCR7bm90ZS5yZWxhdGl2ZVBhdGh9OiAke3Byb2JsZW19YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdXNpbmcgYW4gT2JzaWRpYW4gYFtbd2lraWxpbmtdXWAgb3V0c2lkZSBhIGNvZGUgZmVuY2UuIFRoZSBkZW1vIHZhdWx0IGlzIGFsc28gcmVhZCBvblxuICAgKiBHaXRIdWIsIHdoZXJlIGEgd2lraWxpbmsgcmVuZGVycyBhcyBsaXRlcmFsIGJyYWNrZXRzIGFuZCBsZWFkcyBub3doZXJlLiBBIHdpa2lsaW5rIHNob3duIElOU0lERSBhXG4gICAqIGZlbmNlIGlzIHNhbXBsZSB0ZXh0LCBub3QgbmF2aWdhdGlvbiwgc28gZmVuY2VkIGJsb2NrcyBhcmUgc2tpcHBlZCwgYXMgaXMgYSBub3RlIHRoYXQgZGVjbGFyZXMgaW4gaXRzXG4gICAqIGZyb250bWF0dGVyIHdoeSBpdHMgd2lraWxpbmtzIGFyZSB0aGUgcG9pbnQgXHUyMDE0IHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aFdpa2lsaW5rcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihub3RlLmNvbnRlbnQpICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgYWxsb3dlZExpbmVJbmRleGVzIH0gPSBzY2FuV2lraWxpbmtEaXJlY3RpdmVzKG5vdGUuY29udGVudCk7XG4gICAgICAgIHJldHVybiBmaW5kV2lraWxpbmtMaW5lSW5kZXhlcyhub3RlLmNvbnRlbnQpLnNvbWUoKGxpbmVJbmRleCkgPT4gIWFsbG93ZWRMaW5lSW5kZXhlcy5oYXMobGluZUluZGV4KSk7XG4gICAgICB9KVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG1lbWJlcnMgdGhhdCB0aGUgZGVtbyBub3RlcyByZWZlcmVuY2Ugb24gYSByZWNlaXZlciBidXQgdGhhdCBubyBsb25nZXIgZXhpc3Qgb24gaXQgKHJlbmFtZSBkcmlmdCkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGRpc3RpbmN0IHN0YWxlIG1lbWJlciBuYW1lcyByZWZlcmVuY2VkIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHB1YmxpYyBmaW5kU3RhbGVSZWZlcmVuY2VzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFN0YWxlUmVmZXJlbmNlc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWxpZE1lbWJlcnMgPSBuZXcgU2V0KHBhcmFtcy52YWxpZE1lbWJlcnMpO1xuICAgIGNvbnN0IHJlZmVyZW5jZWQgPSBbLi4udGhpcy5yZWFkQ29ycHVzKCkubWF0Y2hBbGwobmV3IFJlZ0V4cChTdHJpbmcucmF3YCR7cGFyYW1zLnJlY2VpdmVyfVxcLig/PG1lbWJlcj5cXHcrKWAsICdnJykpXVxuICAgICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtZW1iZXInKSk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KHJlZmVyZW5jZWQpXS5maWx0ZXIoKG1lbWJlcikgPT4gIXZhbGlkTWVtYmVycy5oYXMobWVtYmVyKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbWVtYmVycyB0aGF0IGFyZSBub3QgZGVtb25zdHJhdGVkIGFueXdoZXJlIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgbWVtYmVyIG5hbWVzIHdpdGggbm8gZGVtb25zdHJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb3JwdXMgPSB0aGlzLnJlYWRDb3JwdXMoKTtcbiAgICByZXR1cm4gcGFyYW1zLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IG5lZWRsZSA9IHBhcmFtcy5yZWNlaXZlciA9PT0gdW5kZWZpbmVkID8gbWVtYmVyIDogYCR7cGFyYW1zLnJlY2VpdmVyfS4ke21lbWJlcn1gO1xuICAgICAgcmV0dXJuICFjb3JwdXMuaW5jbHVkZXMobmVlZGxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBmZWF0dXJlIGRvY3MgdGhhdCBubyBkZW1vIG5vdGUgbGlua3MgdG8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGZlYXR1cmUtZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgbm90IGxpbmtlZCBmcm9tIGFueSBkZW1vIG5vdGUuXG4gICAqL1xuICBwdWJsaWMgZmluZFVubGlua2VkRmVhdHVyZURvY3MocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5saW5rZWRGZWF0dXJlRG9jc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBub25GZWF0dXJlRG9jcyA9IG5ldyBTZXQocGFyYW1zLm5vbkZlYXR1cmVEb2NzKTtcbiAgICBjb25zdCBmZWF0dXJlRG9jcyA9IHJlYWRkaXJTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuZG9jc0ZvbGRlcikpXG4gICAgICAuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKCcubWQnKSlcbiAgICAgIC5tYXAoKGZpbGUpID0+IGZpbGUucmVwbGFjZSgvXFwubWQkLywgJycpKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gIW5vbkZlYXR1cmVEb2NzLmhhcyhuYW1lKSk7XG4gICAgY29uc3QgbGlua2VkRG9jcyA9IG5ldyBTZXQoXG4gICAgICBbLi4udGhpcy5yZWFkQ29ycHVzKCkubWF0Y2hBbGwoL2RvY3NcXC8oPzxkb2M+W1xcdy1dKylcXC5tZC9nKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2RvYycpKVxuICAgICk7XG4gICAgcmV0dXJuIGZlYXR1cmVEb2NzLmZpbHRlcigoZG9jKSA9PiAhbGlua2VkRG9jcy5oYXMoZG9jKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdGhhdCBjYW5ub3QgYmUgcmVhY2hlZCBmcm9tIHRoZSBzdGFydCBub3RlIGJ5IGZvbGxvd2luZyBNYXJrZG93biBsaW5rcyBiZXR3ZWVuIG5vdGVzLlxuICAgKlxuICAgKiBUaGUgd2FsayBzdGFydHMgYXQge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbnJlYWNoYWJsZU5vdGVzUGFyYW1zLnN0YXJ0Tm90ZX0gYW5kIGZvbGxvd3NcbiAgICogZXZlcnkgYFtUZXh0XSg8Li9OTiBOYW1lLm1kPilgIGxpbmsgb3V0c2lkZSBhIGNvZGUgZmVuY2UsIHRyYW5zaXRpdmVseS4gQSBub3RlIG5vdGhpbmcgbGlua3MgdG8gaXNcbiAgICogb25lIGEgcmVhZGVyIGNhbiBvbmx5IGZpbmQgYnkgYnJvd3NpbmcgdGhlIGZpbGUgbGlzdCBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZSBncm91cGVkIGluZGV4IGluIHRoZVxuICAgKiBzdGFydCBub3RlIGlzIG1lYW50IHRvIHJlcGxhY2UuIFdoZW4gdGhlIHN0YXJ0IG5vdGUgaXRzZWxmIGlzIG1pc3NpbmcsIEVWRVJZIG5vdGUgaXMgdW5yZWFjaGFibGUsXG4gICAqIGJlY2F1c2UgdGhlcmUgaXMgbm93aGVyZSB0byBzdGFydCBmcm9tLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YWxrLlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIHVucmVhY2hhYmxlIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbnJlYWNoYWJsZU5vdGVzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm90ZXNCeVJlbGF0aXZlUGF0aCA9IG5ldyBNYXAodGhpcy5jb2xsZWN0Tm90ZXMoKS5tYXAoKG5vdGUpID0+IFtub3RlLnJlbGF0aXZlUGF0aCwgbm90ZV0pKTtcbiAgICBjb25zdCByZWFjaGVkTm90ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBwZW5kaW5nTm90ZXMgPSBbcGFyYW1zLnN0YXJ0Tm90ZV07XG5cbiAgICB3aGlsZSAocGVuZGluZ05vdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vdGVQYXRoID0gZW5zdXJlTm9uTnVsbGFibGUocGVuZGluZ05vdGVzLnBvcCgpKTtcbiAgICAgIGNvbnN0IG5vdGUgPSBub3Rlc0J5UmVsYXRpdmVQYXRoLmdldChub3RlUGF0aCk7XG4gICAgICBpZiAoIW5vdGUgfHwgcmVhY2hlZE5vdGVzLmhhcyhub3RlUGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZWFjaGVkTm90ZXMuYWRkKG5vdGVQYXRoKTtcbiAgICAgIHBlbmRpbmdOb3Rlcy5wdXNoKC4uLmNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aClcbiAgICAgIC5maWx0ZXIoKG5vdGVQYXRoKSA9PiAhcmVhY2hlZE5vdGVzLmhhcyhub3RlUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbmFtZXMgb2YgdGhlIGBleHBvcnQgZnVuY3Rpb25gcyAoaW5jbHVkaW5nIGBhc3luY2AgYW5kIGdlbmVyYXRvciBkZWNsYXJhdGlvbnMpIGluIGEgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGV4cG9ydGVkIGZ1bmN0aW9uIG5hbWVzIGluIHNvdXJjZSBvcmRlci5cbiAgICovXG4gIHB1YmxpYyBnZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID0gcmVhZEZpbGVTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuc291cmNlUGF0aCksICd1dGYtOCcpO1xuICAgIHJldHVybiBbLi4uc291cmNlLm1hdGNoQWxsKC9eZXhwb3J0ICg/OmFzeW5jICk/ZnVuY3Rpb25cXCo/ICg/PG5hbWU+XFx3KykvZ20pXVxuICAgICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbWVtYmVycyBvZiBhbiBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIGRlY2xhcmVkIGluIGEgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIHBhcnNlZCB7QGxpbmsgSW50ZXJmYWNlTWVtYmVyc30uXG4gICAqIEB0aHJvd3MgV2hlbiB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHNvdXJjZSBmaWxlLlxuICAgKi9cbiAgcHVibGljIGdldEludGVyZmFjZU1lbWJlcnMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRJbnRlcmZhY2VNZW1iZXJzUGFyYW1zKTogSW50ZXJmYWNlTWVtYmVycyB7XG4gICAgY29uc3Qgc291cmNlID0gcmVhZEZpbGVTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuc291cmNlUGF0aCksICd1dGYtOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YGV4cG9ydCAoPzxrZXl3b3JkPmludGVyZmFjZXxjbGFzc3xlbnVtKSAke3BhcmFtcy5pbnRlcmZhY2VOYW1lfVxcYltee10qXFx7KD88Ym9keT5bXFxzXFxTXSo/KVxcblxcfWApLmV4ZWMoc291cmNlKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGludGVyZmFjZSAke3BhcmFtcy5pbnRlcmZhY2VOYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VNZW1iZXJzKGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdrZXl3b3JkJyksIGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdib2R5JykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuZCBjYWNoZXMgdGhlIGRlbW8gY29ycHVzIFx1MjAxNCBldmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdCBqb2luZWQgaW50byBvbmUgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29uY2F0ZW5hdGVkIGRlbW8tbm90ZSBjb250ZW50cy5cbiAgICovXG4gIHB1YmxpYyByZWFkQ29ycHVzKCk6IHN0cmluZyB7XG4gICAgdGhpcy5jYWNoZWRDb3JwdXMgPz89IHRoaXMuY29sbGVjdE5vdGVzKClcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUuY29udGVudClcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRDb3JwdXM7XG4gIH1cblxuICAvLyBUaGUgbm90ZXMgdGhlIGF1dGhvcmluZyBjaGVja3MgYXBwbHkgdG86IGV2ZXJ5IG5vdGUgZXhjZXB0IHRoZSBvbmVzIGRlY2xhcmVkIG91dHNpZGUgdGhlIGxlYXJuaW5nXG4gIC8vIFBhdGggKHRoZSB2YXVsdCdzIG93biBgUkVBRE1FLm1kYCBieSBkZWZhdWx0KS5cbiAgcHJpdmF0ZSBjb2xsZWN0Q2hlY2thYmxlTm90ZXMoKTogRGVtb1ZhdWx0Tm90ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Tm90ZXMoKS5maWx0ZXIoKG5vdGUpID0+ICF0aGlzLmV4Y2x1ZGVkTm90ZXMuaGFzKG5vdGUucmVsYXRpdmVQYXRoKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3RNYXJrZG93bkZpbGVzKGZvbGRlcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRkaXJTeW5jKGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBpZiAoZW50cnkubmFtZSA9PT0gT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTm9kZU1vZHVsZXMgYXMgc3RyaW5nKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5jb2xsZWN0TWFya2Rvd25GaWxlcyhqb2luKGZvbGRlciwgZW50cnkubmFtZSkpKTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goam9pbihmb2xkZXIsIGVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGB2aXRlc3RgIHN1aXRlIHRoYXQga2VlcHMgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBDYWxsIGl0IG9uY2UgZnJvbSBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYDsgaXQgcmVnaXN0ZXJzIG9uZSB0ZXN0IHBlciBjaGVjayxcbiAqIGRlbGVnYXRpbmcgdG8ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZWNsYXJhdGl2ZSBjb3ZlcmFnZSBzcGVjaWZpY2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlKHBhcmFtczogUmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrZXIgPSBuZXcgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcz4oe1xuICAgIGV4Y2x1ZGVkTm90ZXM6IHBhcmFtcy5hdXRob3Jpbmc/LmV4Y2x1ZGVkTm90ZXMsXG4gICAgcm9vdEZvbGRlcjogcGFyYW1zLnJvb3RGb2xkZXJcbiAgfSkpO1xuICBjb25zdCBzdGFydE5vdGUgPSBwYXJhbXMuYXV0aG9yaW5nPy5zdGFydE5vdGUgPz8gREVGQVVMVF9TVEFSVF9OT1RFO1xuXG4gIGRlc2NyaWJlKCdkZW1vLXZhdWx0IGNvdmVyYWdlJywgKCkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuaW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gJHtzcGVjLmtpbmR9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBjb25zdCBkZW1vbnN0cmF0ZWQgPSBtZW1iZXJzW3NwZWMua2luZF07XG4gICAgICAgIGV4cGVjdChkZW1vbnN0cmF0ZWQubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBkZW1vbnN0cmF0ZWQsIHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgcmVmZXJlbmNlcyBubyAke3NwZWMuaW50ZXJmYWNlTmFtZX0gbWVtYmVyIHRoYXQgbm8gbG9uZ2VyIGV4aXN0c2AsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IGNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVycyhzcGVjKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlcyh7IHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyLCB2YWxpZE1lbWJlcnM6IG1lbWJlcnMuYWxsIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuY29uZmlnSW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gb3B0aW9uYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QobWVtYmVycy5wcm9wZXJ0aWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogbWVtYmVycy5wcm9wZXJ0aWVzIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuZnVuY3Rpb25Nb2R1bGVzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5IGV4cG9ydGVkIGZ1bmN0aW9uIGluICR7c3BlYy5zb3VyY2VQYXRofWAsICgpID0+IHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lcyA9IGNoZWNrZXIuZ2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzKHNwZWMpO1xuICAgICAgICBleHBlY3QoZnVuY3Rpb25OYW1lcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGZ1bmN0aW9uTmFtZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jcyA9IHBhcmFtcy5kb2NzO1xuICAgIGlmIChkb2NzKSB7XG4gICAgICBpdCgnbGlua3MgYSBkZW1vIG5vdGUgZm9yIGV2ZXJ5IGZlYXR1cmUgZG9jJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5saW5rZWRGZWF0dXJlRG9jcyh7IGRvY3NGb2xkZXI6IGRvY3MuZm9sZGVyLCBub25GZWF0dXJlRG9jczogZG9jcy5ub25GZWF0dXJlRG9jcyB9KSlcbiAgICAgICAgICAudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGFuIEgxJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aG91dEgxKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ29wZW5zIGV2ZXJ5IG5vdGUgd2l0aCBhIHByb3NlIHBhcmFncmFwaCBiZWZvcmUgaXRzIGZpcnN0IGNvZGUgYmxvY2snLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SW50cm9Qcm9zZSgpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KGByZWFjaGVzIGV2ZXJ5IG5vdGUgZnJvbSAke3N0YXJ0Tm90ZX1gLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5yZWFjaGFibGVOb3Rlcyh7IHN0YXJ0Tm90ZSB9KSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBubyB3aWtpbGlua3MsIHdoaWNoIGRvIG5vdCByZW5kZXIgb24gR2l0SHViJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aFdpa2lsaW5rcygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdqdXN0aWZpZXMgZXZlcnkgd2lraWxpbmsgYWxsb3dhbmNlLCBhbmQgZGVjbGFyZXMgbm9uZSBpdCBubyBsb25nZXIgbmVlZHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoVW5qdXN0aWZpZWRXaWtpbGlua0FsbG93YW5jZSgpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYXJyaWVzIG5vIERvY3MgbGluayBsaW5lLCBiZWNhdXNlIHRoZSBub3RlIGlzIHRoZSBkb2NzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aERvY3NMaW5rcygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb21taXRzIG5vbmUgb2YgdGhlIGFwcC5qc29uIHNldHRpbmdzIG9ic2lkaWFuLWRldi11dGlscyBpbmplY3RzIGF0IHJlbGVhc2UgdGltZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRDb21taXR0ZWRBcHBKc29uU2V0dGluZ3MoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICAvLyBXaXRoIG5vIG5vdGVzIHRvIHJlYWQsIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayBhYm92ZSBwYXNzZXMgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdCwgc28gYSB2YXVsdFxuICAgIC8vIFRoYXQgc3RvcHBlZCBiZWluZyBmb3VuZCB3b3VsZCBnbyBvbiByZXBvcnRpbmcgaXRzZWxmIGNsZWFuLiBUaGlzIGlzIHRoZSBoYWxmIG9mIHRoZSBub24tdHJpdmlhbFxuICAgIC8vIEd1YXJkIHRoYXQgc3RpbGwgYXBwbGllcyB3aGVuIHRoZSBwbHVnaW4gZXhwb3NlcyBub3RoaW5nIHRvIHJlZmxlY3QuXG4gICAgaXQoJ3JlYWRzIGEgbm9uLWVtcHR5IGRlbW8gdmF1bHQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5jb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCkubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBndWFyZCA9IHBhcmFtcy5ub25Ucml2aWFsR3VhcmQ7XG4gICAgaWYgKGd1YXJkKSB7XG4gICAgICBpdCgna2VlcHMgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIG5vbi10cml2aWFsJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKGd1YXJkKTtcbiAgICAgICAgZXhwZWN0KG1lbWJlcnMuYWxsKS50b0NvbnRhaW4oZ3VhcmQuZXhwZWN0TWVtYmVyKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpKS50b0NvbnRhaW4oZ3VhcmQuZXhwZWN0RGVtb05vdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQ0xBU1NfTUVNQkVSX01PRElGSUVSUyA9IFN0cmluZy5yYXdgKD86KD86cHVibGljfHByaXZhdGV8cHJvdGVjdGVkfHJlYWRvbmx5fHN0YXRpY3xhYnN0cmFjdHxvdmVycmlkZSlcXHMrKSpgO1xuY29uc3QgQUJTT0xVVEVfVVJMX1JFR19FWFAgPSAvXlthLXpdW1xcdysuLV0qOi9pO1xuY29uc3QgQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCA9IC9ePHw+JC9nO1xuY29uc3QgQ09ERV9GRU5DRV9SRUdfRVhQID0gL15cXHMqKD86YGBgfH5+fikvO1xuY29uc3QgREVGQVVMVF9FWENMVURFRF9OT1RFUyA9IFsnUkVBRE1FLm1kJ107XG5jb25zdCBERUZBVUxUX1NUQVJUX05PVEUgPSAnMDAgU3RhcnQubWQnO1xuY29uc3QgRE9DU19MSU5LX1JFR19FWFAgPSAvXlxccypcXFtEb2NzXVxcKC87XG5jb25zdCBGUk9OVE1BVFRFUl9SRUdfRVhQID0gL14tLS1cXHI/XFxuW1xcc1xcU10qP1xccj9cXG4tLS1bXlxcU1xcbl0qXFxyP1xcbj8vO1xuY29uc3QgSDFfUkVHX0VYUCA9IC9eIyBcXFMvO1xuY29uc3QgSEVBRElOR19SRUdfRVhQID0gL14jezEsNn0gLztcbmNvbnN0IElOTElORV9DT0RFX1JFR19FWFAgPSAvYFteYFxcbl0qYC9nO1xuY29uc3QgTUFSS0RPV05fTElOS19SRUdfRVhQID0gL1xcW1teXFxdXSpdXFwoKD88dGFyZ2V0PlteKV0rKVxcKS9nO1xuLy8gQW4gaW5saW5lIGRpcmVjdGl2ZSwgc2hhcGVkIGFmdGVyIEVTTGludCdzIGFuZCB3cml0dGVuIGFzIGFuIEhUTUwgY29tbWVudCBzbyBpdCBpcyBpbnZpc2libGUgQk9USCBpblxuLy8gT2JzaWRpYW4gYW5kIG9uIEdpdEh1YiBcdTIwMTQgdGhlIHNhbWUgc3BlbGxpbmcgdGhlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWAuXG4vLyBBbiBPYnNpZGlhbiBgJSUgXHUyMDI2ICUlYCBjb21tZW50IHdvdWxkIHNob3cgdXAgYXMgbGl0ZXJhbCB0ZXh0IG9uIEdpdEh1Yiwgd2hpY2ggaXMgaGFsZiB0aGUgcmVhZGVyc2hpcC5cbmNvbnN0IERJUkVDVElWRV9SRUdfRVhQID0gL15cXHMqPCEtLVxccypvYnNpZGlhbi1kZXYtdXRpbHMtKD88YWN0aW9uPmRpc2FibGUtbmV4dC1saW5lfGRpc2FibGV8ZW5hYmxlKVxccysoPzxydWxlPltcXHctXStcXC9bXFx3LV0rKSg/OlxccystLVxccysoPzxyZWFzb24+Lio/KSk/XFxzKi0tPlxccyokLztcbi8vIENhdGNoZXMgYSBkaXJlY3RpdmUgdGhhdCB3YXMgTUVBTlQgdG8gYmUgb25lIGJ1dCBpcyBtaXNzcGVsbGVkOiBpdCB3b3VsZCBvdGhlcndpc2UgcmVhZCBhcyBhbiBvcmRpbmFyeVxuLy8gQ29tbWVudCBhbmQgc2lsZW50bHkgZG8gbm90aGluZywgd2hpY2ggaXMgdGhlIGZhaWx1cmUgbW9kZSBhIHN1cHByZXNzaW9uIHN5bnRheCBtdXN0IG5ldmVyIGhhdmUuXG5jb25zdCBESVJFQ1RJVkVfUFJPQkVfUkVHX0VYUCA9IC88IS0tXFxzKm9ic2lkaWFuLWRldi11dGlscy0vO1xuY29uc3QgV0lLSUxJTktfUlVMRSA9ICdkZW1vLXZhdWx0LXZhbGlkYXRpb24vbm8td2lraWxpbmtzJztcbi8vIFRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzID4gZGVtby12YXVsdC12YWxpZGF0aW9uID4gYWxsb3ctd2lraWxpbmtzYCBmcm9udG1hdHRlciBwYXRoLCBhdCBhbnkgaW5kZW50YXRpb246XG4vLyBUaGUga2V5cyBtdXN0IG5lc3QgaW4gdGhhdCBvcmRlciwgYW5kIGFueSBsaW5lIGJldHdlZW4gdGhlbSBoYXMgdG8gc3RheSBpbmRlbnRlZCwgc28gYSBkZWRlbnQgdG8gdGhlXG4vLyBEb2N1bWVudCdzIG93biB0b3AgbGV2ZWwgZW5kcyB0aGUgbWF0Y2ggcmF0aGVyIHRoYW4gcmVhY2hpbmcgYSBzYW1lLW5hbWVkIGtleSB1bmRlciBhbm90aGVyIHBhcmVudC5cbmNvbnN0IFdJS0lMSU5LX0FMTE9XQU5DRV9SRUdfRVhQID0gL15vYnNpZGlhbi1kZXYtdXRpbHM6W15cXFNcXG5dKlxcbig/OlteXFxTXFxuXSsuKlxcbikqP1teXFxTXFxuXStkZW1vLXZhdWx0LXZhbGlkYXRpb246W15cXFNcXG5dKlxcbig/OlteXFxTXFxuXSsuKlxcbikqP1teXFxTXFxuXSthbGxvdy13aWtpbGlua3M6KD88cmVhc29uPi4qKSQvbTtcbmNvbnN0IFdJS0lMSU5LX1JFR19FWFAgPSAvXFxbXFxbW15cXF1dK11dLztcblxuLy8gQXBwbGllcyBvbmUgcGFyc2VkIGRpcmVjdGl2ZSB0byB0aGUgc2Nhbi5cbmZ1bmN0aW9uIGFwcGx5V2lraWxpbmtEaXJlY3RpdmUoc3RhdGU6IFdpa2lsaW5rRGlyZWN0aXZlU2NhblN0YXRlLCBsaW5lSW5kZXg6IG51bWJlciwgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSk6IHZvaWQge1xuICBjb25zdCBhY3Rpb24gPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnYWN0aW9uJyk7XG4gIGNvbnN0IHJ1bGUgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAncnVsZScpO1xuICBjb25zdCByZWFzb24gPSBtYXRjaC5ncm91cHM/LlsncmVhc29uJ10/LnRyaW0oKSA/PyAnJztcbiAgaWYgKHJ1bGUgIT09IFdJS0lMSU5LX1JVTEUpIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhbiB1bmtub3duIHJ1bGUgXCIke3J1bGV9XCIgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhY3Rpb24gIT09ICdlbmFibGUnICYmIHJlYXNvbiA9PT0gJycpIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIGRpcmVjdGl2ZSB3aXRoIG5vIHJlYXNvbiBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnZGlzYWJsZS1uZXh0LWxpbmUnKSB7XG4gICAgc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXggPSBsaW5lSW5kZXg7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUnKSB7XG4gICAgaWYgKHN0YXRlLm9wZW5SZWdpb24pIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX0gaW5zaWRlIHRoZSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihzdGF0ZS5vcGVuUmVnaW9uLmxpbmVJbmRleCl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlLm9wZW5SZWdpb24gPSB7IGlzVXNlZDogZmFsc2UsIGxpbmVJbmRleCB9O1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc3RhdGUub3BlblJlZ2lvbikge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGFuIGVuYWJsZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX0gd2l0aCBubyByZWdpb24gb3BlbmApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXN0YXRlLm9wZW5SZWdpb24uaXNVc2VkKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihzdGF0ZS5vcGVuUmVnaW9uLmxpbmVJbmRleCl9IGNvdmVyaW5nIG5vIHdpa2lsaW5rYCk7XG4gIH1cbiAgc3RhdGUub3BlblJlZ2lvbiA9IG51bGw7XG59XG5cbi8vIEFwcGxpZXMgb25lIG9yZGluYXJ5IGxpbmUgdG8gdGhlIHNjYW46IGFuIG9wZW4gcmVnaW9uIGNvdmVycyBpdCwgYW5kIGEgcGVuZGluZyBgZGlzYWJsZS1uZXh0LWxpbmVgXG4vLyBDbGFpbXMgdGhlIGZpcnN0IGxpbmUgd2l0aCBjb250ZW50IG9uIGl0IFx1MjAxNCB0aGUgZGlyZWN0aXZlIGFuZCBpdHMgdGFyZ2V0IGFyZSB1c3VhbGx5IGEgYmxhbmsgbGluZSBhcGFydC5cbmZ1bmN0aW9uIGFwcGx5V2lraWxpbmtTY2FuTGluZShzdGF0ZTogV2lraWxpbmtEaXJlY3RpdmVTY2FuU3RhdGUsIGxpbmVJbmRleDogbnVtYmVyLCBsaW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHN0YXRlLm9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXMuYWRkKGxpbmVJbmRleCk7XG4gICAgc3RhdGUub3BlblJlZ2lvbi5pc1VzZWQgfHw9IHN0YXRlLndpa2lsaW5rTGluZUluZGV4ZXMuaGFzKGxpbmVJbmRleCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCA9PT0gbnVsbCB8fCBsaW5lLnRyaW0oKSA9PT0gJycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc3RhdGUuYWxsb3dlZExpbmVJbmRleGVzLmFkZChsaW5lSW5kZXgpO1xuICBpZiAoIXN0YXRlLndpa2lsaW5rTGluZUluZGV4ZXMuaGFzKGxpbmVJbmRleCkpIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIGRpc2FibGUtbmV4dC1saW5lIG9uICR7Zm9ybWF0TGluZU51bWJlcihzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCl9IGNvdmVyaW5nIG5vIHdpa2lsaW5rYCk7XG4gIH1cbiAgc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXggPSBudWxsO1xufVxuXG5mdW5jdGlvbiBidWlsZE1lbWJlcnMobWV0aG9kczogc3RyaW5nW10sIHByb3BlcnRpZXM6IHN0cmluZ1tdKTogSW50ZXJmYWNlTWVtYmVycyB7XG4gIHJldHVybiB7XG4gICAgYWxsOiBbLi4ubWV0aG9kcywgLi4ucHJvcGVydGllc10sXG4gICAgbWV0aG9kcyxcbiAgICBwcm9wZXJ0aWVzXG4gIH07XG59XG5cbi8vIFJlc29sdmVzIHRoZSBub3RlcyBhIG5vdGUgbGlua3MgdG86IGV2ZXJ5IE1hcmtkb3duIGxpbmsgb3V0c2lkZSBhIGNvZGUgZmVuY2Ugd2hvc2UgdGFyZ2V0IGlzIGEgYC5tZGBcbi8vIEZpbGUsIG1hZGUgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgc28gaXQgY2FuIGJlIGxvb2tlZCB1cCBpbiB0aGUgbm90ZSBtYXAuIEV4dGVybmFsIFVSTHMgYW5kXG4vLyBOb24tbm90ZSB0YXJnZXRzIChpbWFnZXMsIHNjcmlwdHMpIGFyZSBub3QgcGFydCBvZiB0aGUgbGVhcm5pbmcgcGF0aCBhbmQgYXJlIHNraXBwZWQ7IGEgYCNhbmNob3JgIGlzXG4vLyBEcm9wcGVkLCBzaW5jZSBpdCBhZGRyZXNzZXMgYSBwbGFjZSBpbnNpZGUgYW4gYWxyZWFkeS1yZXNvbHZlZCBub3RlLlxuLy8gUmV0dXJucyB0aGUgbm90ZSdzIGxpbmVzIHdpdGggZmVuY2VkIGNvZGUgYmxvY2tzIHJlbW92ZWQgKHRoZSBmZW5jZSBsaW5lcyBpbmNsdWRlZCksIHBhaXJlZCB3aXRoIHRoZVxuLy8gTGluZSBudW1iZXIgZWFjaCBjYW1lIGZyb20sIHNvIGEgY2hlY2sgbmV2ZXIgbWlzdGFrZXMgc2FtcGxlIGNvZGUgZm9yIHByb3NlIFx1MjAxNCBhIGBbW3dpa2lsaW5rXV1gXG4vLyBEZW1vbnN0cmF0ZWQgaW5zaWRlIGEgZmVuY2UgaXMgdGV4dCwgbm90IG5hdmlnYXRpb24gXHUyMDE0IGFuZCBhbiBpbmxpbmUgZGlyZWN0aXZlIGNhbiBzdGlsbCBuYW1lIGEgbGluZS5cbmZ1bmN0aW9uIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudDogc3RyaW5nKTogTm90ZUxpbmVbXSB7XG4gIGNvbnN0IG5vdGVMaW5lczogTm90ZUxpbmVbXSA9IFtdO1xuICBsZXQgaXNJbnNpZGVGZW5jZSA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2YgY29udGVudC5zcGxpdCgnXFxuJykuZW50cmllcygpKSB7XG4gICAgaWYgKENPREVfRkVOQ0VfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICBpc0luc2lkZUZlbmNlID0gIWlzSW5zaWRlRmVuY2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFpc0luc2lkZUZlbmNlKSB7XG4gICAgICBub3RlTGluZXMucHVzaCh7IGluZGV4LCBsaW5lIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm90ZUxpbmVzO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0Tm90ZUxpbmtUYXJnZXRzKG5vdGU6IERlbW9WYXVsdE5vdGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRhcmdldHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBnZXRMaW5lc091dHNpZGVGZW5jZXMobm90ZS5jb250ZW50KSkge1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2Ygc3RyaXBJbmxpbmVDb2RlKGxpbmUpLm1hdGNoQWxsKE1BUktET1dOX0xJTktfUkVHX0VYUCkpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICd0YXJnZXQnKS5yZXBsYWNlQWxsKEFOR0xFX0JSQUNLRVRTX1JFR19FWFAsICcnKTtcbiAgICAgIGNvbnN0IFtub3RlUGF0aCA9ICcnXSA9IHRhcmdldC5zcGxpdCgnIycsIDEpO1xuICAgICAgaWYgKEFCU09MVVRFX1VSTF9SRUdfRVhQLnRlc3Qobm90ZVBhdGgpIHx8ICFub3RlUGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRhcmdldHMucHVzaChqb2luKGRpcm5hbWUobm90ZS5yZWxhdGl2ZVBhdGgpLCB0cnlEZWNvZGVVcmlDb21wb25lbnQobm90ZVBhdGgpKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXRzO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0Q2xhc3NNZXRob2ROYW1lcyhjbGFzc0JvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5jbGFzc0JvZHkubWF0Y2hBbGwobmV3IFJlZ0V4cChTdHJpbmcucmF3YF4gezJ9KD88bW9kaWZpZXJzPiR7Q0xBU1NfTUVNQkVSX01PRElGSUVSU30pKD88bmFtZT5cXHcrKSg/OjxbXj5dKj4pP1xcKGAsICdnbScpKV1cbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gIWlzTm9uUHVibGljTWVtYmVyKGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtb2RpZmllcnMnKSkpXG4gICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0Q2xhc3NQcm9wZXJ0eU5hbWVzKGNsYXNzQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmNsYXNzQm9keS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgXiB7Mn0oPzxtb2RpZmllcnM+JHtDTEFTU19NRU1CRVJfTU9ESUZJRVJTfSkoPzxuYW1lPlxcdyspXFxzKlxcPz9cXHMqWzo9XWAsICdnbScpKV1cbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gIWlzTm9uUHVibGljTWVtYmVyKGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtb2RpZmllcnMnKSkpXG4gICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RW51bU1lbWJlck5hbWVzKGVudW1Cb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uZW51bUJvZHkubWF0Y2hBbGwoL14gezJ9KD88bmFtZT5cXHcrKS9nbSldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0TWV0aG9kTmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmludGVyZmFjZUJvZHkubWF0Y2hBbGwoL14gezJ9KD88bmFtZT5cXHcrKSg/OjxbXj5dKj4pP1xcKC9nbSldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvcGVydHlOYW1lcyhpbnRlcmZhY2VCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uaW50ZXJmYWNlQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspXFw/PzovZ20pXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuLy8gVGhlIGxpbmUgbnVtYmVycyBjYXJyeWluZyBhIHdpa2lsaW5rIHRoYXQgaXMgbmF2aWdhdGlvbiByYXRoZXIgdGhhbiBzYW1wbGUgdGV4dC5cbmZ1bmN0aW9uIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudClcbiAgICAuZmlsdGVyKChub3RlTGluZSkgPT4gV0lLSUxJTktfUkVHX0VYUC50ZXN0KHN0cmlwSW5saW5lQ29kZShub3RlTGluZS5saW5lKSkpXG4gICAgLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbGluZSAke1N0cmluZyhsaW5lSW5kZXggKyAxKX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lc091dHNpZGVGZW5jZXMoY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50KS5tYXAoKG5vdGVMaW5lKSA9PiBub3RlTGluZS5saW5lKTtcbn1cblxuLy8gV2hldGhlciB0aGUgbm90ZSdzIGZpcnN0IGNvbnRlbnQgbGluZSAoZnJvbnRtYXR0ZXIgYW5kIGJsYW5rIGxpbmVzIGFzaWRlKSBpcyBhbiBgIyBIMWAuXG5mdW5jdGlvbiBoYXNIMShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZExpbmUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIEgxX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIGEgcGxhaW4gcHJvc2UgbGluZSBhcHBlYXJzIGJlZm9yZSB0aGUgbm90ZSdzIGZpcnN0IGNvZGUgZmVuY2UuIEhlYWRpbmdzIGFyZSBub3QgcHJvc2UgXHUyMDE0IGEgbm90ZVxuLy8gVGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gaXRzIHRpdGxlIHRvIGEgYnV0dG9uIGlzIGV4YWN0bHkgdGhlIHNoYXBlIHRoaXMgY2hlY2sgcmVqZWN0cy5cbmZ1bmN0aW9uIGhhc0ludHJvUHJvc2UoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycgfHwgSEVBRElOR19SRUdfRVhQLnRlc3QodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlIG5hdmlnYXRlcyB3aXRoIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gLiBGZW5jZWQgYmxvY2tzIGFuZCBpbmxpbmUgY29kZSBhcmUgc2FtcGxlXG4vLyBUZXh0IHJhdGhlciB0aGFuIG5hdmlnYXRpb24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYmVmb3JlIGxvb2tpbmcuXG5mdW5jdGlvbiBoYXNXaWtpbGluayhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIGlzTm9uUHVibGljTWVtYmVyKG1vZGlmaWVyczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFxiKD86cHJpdmF0ZXxwcm90ZWN0ZWQpXFxiLy50ZXN0KG1vZGlmaWVycyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWVtYmVycyhrZXl3b3JkOiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IEludGVyZmFjZU1lbWJlcnMge1xuICBzd2l0Y2ggKGtleXdvcmQpIHtcbiAgICBjYXNlICdjbGFzcyc6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoZXh0cmFjdENsYXNzTWV0aG9kTmFtZXMoYm9keSksIGV4dHJhY3RDbGFzc1Byb3BlcnR5TmFtZXMoYm9keSkpO1xuICAgIH1cbiAgICBjYXNlICdlbnVtJzoge1xuICAgICAgcmV0dXJuIGJ1aWxkTWVtYmVycyhbXSwgZXh0cmFjdEVudW1NZW1iZXJOYW1lcyhib2R5KSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoZXh0cmFjdE1ldGhvZE5hbWVzKGJvZHkpLCBleHRyYWN0UHJvcGVydHlOYW1lcyhib2R5KSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFJlYWRzIHRoZSBub3RlJ3MgYG9ic2lkaWFuLWRldi11dGlscyA+IGRlbW8tdmF1bHQtdmFsaWRhdGlvbiA+IGFsbG93LXdpa2lsaW5rc2AgZGVjbGFyYXRpb246IHRoZSBzdGF0ZWRcbi8vIFJlYXNvbiwgYCcnYCB3aGVuIHRoZSBrZXkgaXMgcHJlc2VudCB3aXRoIG5vdGhpbmcgYWZ0ZXIgaXQsIG9yIGBudWxsYCB3aGVuIHRoZSBub3RlIGRlY2xhcmVzIG5vdGhpbmcuXG4vLyBSZWFkIHdpdGggYSByZWd1bGFyIGV4cHJlc3Npb24gcmF0aGVyIHRoYW4gYSBZQU1MIHBhcnNlcjogaXQgaXMgb25lIGtub3duIGtleSBwYXRoLCBhbmQgZXZlcnkgcGx1Z2luIHRoYXRcbi8vIEluc3RhbGxzIHRoaXMgcGFja2FnZSB3b3VsZCBvdGhlcndpc2UgY2FycnkgYSBZQU1MIGRlcGVuZGVuY3kgZm9yIGl0LlxuZnVuY3Rpb24gcmVhZFdpa2lsaW5rQWxsb3dhbmNlUmVhc29uKGNvbnRlbnQ6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IEZST05UTUFUVEVSX1JFR19FWFAuZXhlYyhjb250ZW50KT8uWzBdO1xuICBpZiAoZnJvbnRtYXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHJlYXNvbiA9IFdJS0lMSU5LX0FMTE9XQU5DRV9SRUdfRVhQLmV4ZWMoZnJvbnRtYXR0ZXIpPy5ncm91cHM/LlsncmVhc29uJ107XG4gIGlmIChyZWFzb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiByZWFzb24udHJpbSgpLnJlcGxhY2UoL14oPzxxdW90ZT5bXCInXSkoPzx2YWx1ZT5bXFxzXFxTXSopXFxrPHF1b3RlPiQvLCAnJDx2YWx1ZT4nKTtcbn1cblxuLy8gUmVhZHMgdGhlIG5vdGUncyBpbmxpbmUgYG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlXHUyMDI2YCBkaXJlY3RpdmVzLCByZXR1cm5pbmcgd2hpY2ggbGluZXMgdGhleSBhbGxvdyBhXG4vLyBXaWtpbGluayBvbiBhbmQgZXZlcnl0aGluZyB3cm9uZyB3aXRoIHRoZW0uIEEgc3VwcHJlc3Npb24gdGhhdCBxdWlldGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vbmUsXG4vLyBTbyBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlLCBvbmUgd2l0aCBubyByZWFzb24sIGFuIHVuY2xvc2VkIHJlZ2lvbiBhbmQgb25lIGNvdmVyaW5nIG5vIHdpa2lsaW5rIGF0IGFsbFxuLy8gQXJlIGVhY2ggcmVwb3J0ZWQgcmF0aGVyIHRoYW4gaWdub3JlZC5cbmZ1bmN0aW9uIHNjYW5XaWtpbGlua0RpcmVjdGl2ZXMoY29udGVudDogc3RyaW5nKTogV2lraWxpbmtEaXJlY3RpdmVTY2FuIHtcbiAgY29uc3Qgc3RhdGU6IFdpa2lsaW5rRGlyZWN0aXZlU2NhblN0YXRlID0ge1xuICAgIGFsbG93ZWRMaW5lSW5kZXhlczogbmV3IFNldDxudW1iZXI+KCksXG4gICAgb3BlblJlZ2lvbjogbnVsbCxcbiAgICBwZW5kaW5nTmV4dExpbmVJbmRleDogbnVsbCxcbiAgICBwcm9ibGVtczogW10sXG4gICAgd2lraWxpbmtMaW5lSW5kZXhlczogbmV3IFNldChmaW5kV2lraWxpbmtMaW5lSW5kZXhlcyhjb250ZW50KSlcbiAgfTtcblxuICBmb3IgKGNvbnN0IHsgaW5kZXgsIGxpbmUgfSBvZiBjb2xsZWN0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQpKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBESVJFQ1RJVkVfUkVHX0VYUC5leGVjKGxpbmUpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgYXBwbHlXaWtpbGlua0RpcmVjdGl2ZShzdGF0ZSwgaW5kZXgsIG1hdGNoKTtcbiAgICB9IGVsc2UgaWYgKERJUkVDVElWRV9QUk9CRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgbWFsZm9ybWVkIGRpcmVjdGl2ZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoaW5kZXgpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBseVdpa2lsaW5rU2NhbkxpbmUoc3RhdGUsIGluZGV4LCBsaW5lKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUub3BlblJlZ2lvbikge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUub3BlblJlZ2lvbi5saW5lSW5kZXgpfSB0aGF0IGlzIG5ldmVyIGVuYWJsZWQgYWdhaW5gKTtcbiAgfVxuICBpZiAoc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXggIT09IG51bGwpIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIGRpc2FibGUtbmV4dC1saW5lIG9uICR7Zm9ybWF0TGluZU51bWJlcihzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleCl9IGNvdmVyaW5nIG5vIHdpa2lsaW5rYCk7XG4gIH1cbiAgcmV0dXJuIHsgYWxsb3dlZExpbmVJbmRleGVzOiBzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXMsIHByb2JsZW1zOiBzdGF0ZS5wcm9ibGVtcyB9O1xufVxuXG5mdW5jdGlvbiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UoRlJPTlRNQVRURVJfUkVHX0VYUCwgJycpO1xufVxuXG5mdW5jdGlvbiBzdHJpcElubGluZUNvZGUobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChJTkxJTkVfQ09ERV9SRUdfRVhQLCAnJyk7XG59XG5cbi8vIEEgaGFuZC13cml0dGVuIGxpbmsgbWF5IGNvbnRhaW4gYSBiYXJlIGAlYCAob3IgYW55IG90aGVyIGludmFsaWQgcGVyY2VudC1lc2NhcGUpLCB3aGljaCBtYWtlc1xuLy8gYGRlY29kZVVSSUNvbXBvbmVudGAgdGhyb3cuIFN1Y2ggYSB0YXJnZXQgaXMgbWVhbnQgbGl0ZXJhbGx5LCBzbyBpdCBpcyB1c2VkIGFzIHdyaXR0ZW4uXG5mdW5jdGlvbiB0cnlEZWNvZGVVcmlDb21wb25lbnQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzRUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUywrQkFBK0I7QUFDeEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUEwWEEsTUFBTSx5QkFBeUI7QUFBQSxFQUM1QixlQUE4QjtBQUFBLEVBQzlCLGNBQXNDO0FBQUEsRUFDN0I7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBbUQ7QUFDcEUsU0FBSyxhQUFhLE9BQU87QUFDekIsU0FBSyxrQkFBa0IsS0FBSyxLQUFLLFlBQVksd0JBQXdCLFNBQVM7QUFDOUUsU0FBSyxnQkFBZ0IsSUFBSSxJQUFJLE9BQU8saUJBQWlCLHNCQUFzQjtBQUFBLEVBQzdFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sK0JBQXlDO0FBQzlDLFdBQU8sS0FBSyxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZO0FBQUEsRUFDNUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLGVBQWdDO0FBQ3JDLFNBQUssZ0JBQWdCLEtBQUsscUJBQXFCLEtBQUssZUFBZSxFQUFFLElBQUksQ0FBQyxVQUFVO0FBQUEsTUFDbEYsU0FBUyxhQUFhLE1BQU0sT0FBTztBQUFBLE1BQ25DLGNBQWMsU0FBUyxLQUFLLGlCQUFpQixJQUFJO0FBQUEsSUFDbkQsRUFBRTtBQUNGLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVTywrQkFBeUM7QUFDOUMsVUFBTSxjQUFjLEtBQUssS0FBSyxpQkFBaUIsd0JBQXdCLGFBQWEsd0JBQXdCLE9BQU87QUFDbkgsVUFBTSxVQUFVLFdBQVcsV0FBVyxJQUFJLGFBQWEsYUFBYSxPQUFPLElBQUk7QUFDL0UsV0FBTyxrQ0FBa0MsRUFBRSxTQUFTLHNCQUFzQixFQUFFLFNBQVMsTUFBTSxZQUFZLENBQUMsRUFBRSxDQUFDO0FBQUEsRUFDN0c7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLHlCQUFtQztBQUN4QyxXQUFPLEtBQUssc0JBQXNCLEVBQy9CLE9BQU8sQ0FBQyxTQUFTLHNCQUFzQixLQUFLLE9BQU8sRUFBRSxLQUFLLENBQUMsU0FBUyxrQkFBa0IsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUNqRyxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVk7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLHFCQUErQjtBQUNwQyxXQUFPLEtBQUssc0JBQXNCLEVBQy9CLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxFQUNyQyxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVk7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sNkJBQXVDO0FBQzVDLFdBQU8sS0FBSyxzQkFBc0IsRUFDL0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEtBQUssT0FBTyxDQUFDLEVBQzdDLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWTtBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNPLDRDQUFzRDtBQUMzRCxXQUFPLEtBQUssc0JBQXNCLEVBQUUsUUFBUSxDQUFDLFNBQVM7QUFDcEQsWUFBTSxPQUFPLHVCQUF1QixLQUFLLE9BQU87QUFDaEQsWUFBTSxXQUFXLENBQUMsR0FBRyxLQUFLLFFBQVE7QUFDbEMsWUFBTSxTQUFTLDRCQUE0QixLQUFLLE9BQU87QUFDdkQsVUFBSSxXQUFXLE1BQU07QUFDbkIsWUFBSSxPQUFPLEtBQUssTUFBTSxJQUFJO0FBQ3hCLG1CQUFTLEtBQUssdUNBQXVDO0FBQUEsUUFDdkQsV0FBVyxDQUFDLFlBQVksS0FBSyxPQUFPLEdBQUc7QUFDckMsbUJBQVMsS0FBSyw2Q0FBNkM7QUFBQSxRQUM3RCxXQUFXLEtBQUssbUJBQW1CLE9BQU8sR0FBRztBQUMzQyxtQkFBUyxLQUFLLDJEQUEyRDtBQUFBLFFBQzNFO0FBQUEsTUFDRjtBQUNBLGFBQU8sU0FBUyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssWUFBWSxLQUFLLE9BQU8sRUFBRTtBQUFBLElBQ3JFLENBQUM7QUFBQSxFQUNIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVU8seUJBQW1DO0FBQ3hDLFdBQU8sS0FBSyxzQkFBc0IsRUFDL0IsT0FBTyxDQUFDLFNBQVM7QUFDaEIsVUFBSSw0QkFBNEIsS0FBSyxPQUFPLE1BQU0sTUFBTTtBQUN0RCxlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU0sRUFBRSxtQkFBbUIsSUFBSSx1QkFBdUIsS0FBSyxPQUFPO0FBQ2xFLGFBQU8sd0JBQXdCLEtBQUssT0FBTyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsbUJBQW1CLElBQUksU0FBUyxDQUFDO0FBQUEsSUFDckcsQ0FBQyxFQUNBLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWTtBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTyxvQkFBb0IsUUFBcUU7QUFDOUYsVUFBTSxlQUFlLElBQUksSUFBSSxPQUFPLFlBQVk7QUFDaEQsVUFBTSxhQUFhLENBQUMsR0FBRyxLQUFLLFdBQVcsRUFBRSxTQUFTLElBQUksT0FBTyxPQUFPLE1BQU0sT0FBTyxRQUFRLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxFQUMvRyxJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxRQUFRLENBQUM7QUFDekQsV0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLFVBQVUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQztBQUFBLEVBQzlFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTywwQkFBMEIsUUFBMkU7QUFDMUcsVUFBTSxTQUFTLEtBQUssV0FBVztBQUMvQixXQUFPLE9BQU8sUUFBUSxPQUFPLENBQUMsV0FBVztBQUN2QyxZQUFNLFNBQVMsT0FBTyxhQUFhLFNBQVksU0FBUyxHQUFHLE9BQU8sUUFBUSxJQUFJLE1BQU07QUFDcEYsYUFBTyxDQUFDLE9BQU8sU0FBUyxNQUFNO0FBQUEsSUFDaEMsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLHdCQUF3QixRQUF5RTtBQUN0RyxVQUFNLGlCQUFpQixJQUFJLElBQUksT0FBTyxjQUFjO0FBQ3BELFVBQU0sY0FBYyxZQUFZLEtBQUssS0FBSyxZQUFZLE9BQU8sVUFBVSxDQUFDLEVBQ3JFLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxLQUFLLENBQUMsRUFDckMsSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLFNBQVMsRUFBRSxDQUFDLEVBQ3ZDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQztBQUM3QyxVQUFNLGFBQWEsSUFBSTtBQUFBLE1BQ3JCLENBQUMsR0FBRyxLQUFLLFdBQVcsRUFBRSxTQUFTLDJCQUEyQixDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsdUJBQXVCLE9BQU8sS0FBSyxDQUFDO0FBQUEsSUFDbEg7QUFDQSxXQUFPLFlBQVksT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDO0FBQUEsRUFDekQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWNPLHFCQUFxQixRQUFzRTtBQUNoRyxVQUFNLHNCQUFzQixJQUFJLElBQUksS0FBSyxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLGNBQWMsSUFBSSxDQUFDLENBQUM7QUFDaEcsVUFBTSxlQUFlLG9CQUFJLElBQVk7QUFDckMsVUFBTSxlQUFlLENBQUMsT0FBTyxTQUFTO0FBRXRDLFdBQU8sYUFBYSxTQUFTLEdBQUc7QUFDOUIsWUFBTSxXQUFXLGtCQUFrQixhQUFhLElBQUksQ0FBQztBQUNyRCxZQUFNLE9BQU8sb0JBQW9CLElBQUksUUFBUTtBQUM3QyxVQUFJLENBQUMsUUFBUSxhQUFhLElBQUksUUFBUSxHQUFHO0FBQ3ZDO0FBQUEsTUFDRjtBQUNBLG1CQUFhLElBQUksUUFBUTtBQUN6QixtQkFBYSxLQUFLLEdBQUcsdUJBQXVCLElBQUksQ0FBQztBQUFBLElBQ25EO0FBRUEsV0FBTyxLQUFLLHNCQUFzQixFQUMvQixJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVksRUFDL0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDO0FBQUEsRUFDckQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLHlCQUF5QixRQUEwRTtBQUN4RyxVQUFNLFNBQVMsYUFBYSxLQUFLLEtBQUssWUFBWSxPQUFPLFVBQVUsR0FBRyxPQUFPO0FBQzdFLFdBQU8sQ0FBQyxHQUFHLE9BQU8sU0FBUywrQ0FBK0MsQ0FBQyxFQUN4RSxJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxNQUFNLENBQUM7QUFBQSxFQUN6RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTTyxvQkFBb0IsUUFBNkU7QUFDdEcsVUFBTSxTQUFTLGFBQWEsS0FBSyxLQUFLLFlBQVksT0FBTyxVQUFVLEdBQUcsT0FBTztBQUM3RSxVQUFNLFFBQVEsSUFBSSxPQUFPLE9BQU8sOENBQThDLE9BQU8sYUFBYSxnQ0FBZ0MsRUFBRSxLQUFLLE1BQU07QUFDL0ksUUFBSSxDQUFDLE9BQU87QUFDVixZQUFNLElBQUksTUFBTSw0QkFBNEIsT0FBTyxhQUFhLEVBQUU7QUFBQSxJQUNwRTtBQUNBLFdBQU8sYUFBYSx1QkFBdUIsT0FBTyxTQUFTLEdBQUcsdUJBQXVCLE9BQU8sTUFBTSxDQUFDO0FBQUEsRUFDckc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxhQUFxQjtBQUMxQixTQUFLLGlCQUFpQixLQUFLLGFBQWEsRUFDckMsSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQzFCLEtBQUssSUFBSTtBQUNaLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUEsRUFJUSx3QkFBeUM7QUFDL0MsV0FBTyxLQUFLLGFBQWEsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssY0FBYyxJQUFJLEtBQUssWUFBWSxDQUFDO0FBQUEsRUFDeEY7QUFBQSxFQUVRLHFCQUFxQixRQUEwQjtBQUNyRCxVQUFNLFNBQW1CLENBQUM7QUFDMUIsZUFBVyxTQUFTLFlBQVksUUFBUSxFQUFFLGVBQWUsS0FBSyxDQUFDLEdBQUc7QUFDaEUsVUFBSSxNQUFNLFlBQVksR0FBRztBQUN2QixZQUFJLE1BQU0sU0FBUyx3QkFBd0IsYUFBdUI7QUFDaEU7QUFBQSxRQUNGO0FBQ0EsZUFBTyxLQUFLLEdBQUcsS0FBSyxxQkFBcUIsS0FBSyxRQUFRLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFBQSxNQUNwRSxXQUFXLE1BQU0sS0FBSyxTQUFTLEtBQUssR0FBRztBQUNyQyxlQUFPLEtBQUssS0FBSyxRQUFRLE1BQU0sSUFBSSxDQUFDO0FBQUEsTUFDdEM7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVVPLFNBQVMsK0JBQStCLFFBQW9EO0FBQ2pHLFFBQU0sVUFBVSxJQUFJLHlCQUF5Qiw0QkFBdUU7QUFBQSxJQUNsSCxlQUFlLE9BQU8sV0FBVztBQUFBLElBQ2pDLFlBQVksT0FBTztBQUFBLEVBQ3JCLENBQUMsQ0FBQztBQUNGLFFBQU0sWUFBWSxPQUFPLFdBQVcsYUFBYTtBQUVqRCxXQUFTLHVCQUF1QixNQUFNO0FBQ3BDLGVBQVcsUUFBUSxPQUFPLGNBQWMsQ0FBQyxHQUFHO0FBQzFDLFNBQUcsc0JBQXNCLEtBQUssYUFBYSxJQUFJLEtBQUssSUFBSSxJQUFJLE1BQU07QUFDaEUsY0FBTSxVQUFVLFFBQVEsb0JBQW9CLElBQUk7QUFDaEQsY0FBTSxlQUFlLFFBQVEsS0FBSyxJQUFJO0FBQ3RDLGVBQU8sYUFBYSxNQUFNLEVBQUUsZ0JBQWdCLENBQUM7QUFDN0MsZUFBTyxRQUFRLDBCQUEwQixFQUFFLFNBQVMsY0FBYyxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLE1BQzFHLENBQUM7QUFFRCxTQUFHLGlCQUFpQixLQUFLLGFBQWEsaUNBQWlDLE1BQU07QUFDM0UsY0FBTSxVQUFVLFFBQVEsb0JBQW9CLElBQUk7QUFDaEQsZUFBTyxRQUFRLG9CQUFvQixFQUFFLFVBQVUsS0FBSyxVQUFVLGNBQWMsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsTUFDeEcsQ0FBQztBQUFBLElBQ0g7QUFFQSxlQUFXLFFBQVEsT0FBTyxvQkFBb0IsQ0FBQyxHQUFHO0FBQ2hELFNBQUcsc0JBQXNCLEtBQUssYUFBYSxXQUFXLE1BQU07QUFDMUQsY0FBTSxVQUFVLFFBQVEsb0JBQW9CLElBQUk7QUFDaEQsZUFBTyxRQUFRLFdBQVcsTUFBTSxFQUFFLGdCQUFnQixDQUFDO0FBQ25ELGVBQU8sUUFBUSwwQkFBMEIsRUFBRSxTQUFTLFFBQVEsV0FBVyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLE1BQ3ZGLENBQUM7QUFBQSxJQUNIO0FBRUEsZUFBVyxRQUFRLE9BQU8sbUJBQW1CLENBQUMsR0FBRztBQUMvQyxTQUFHLDJDQUEyQyxLQUFLLFVBQVUsSUFBSSxNQUFNO0FBQ3JFLGNBQU0sZ0JBQWdCLFFBQVEseUJBQXlCLElBQUk7QUFDM0QsZUFBTyxjQUFjLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQztBQUM5QyxlQUFPLFFBQVEsMEJBQTBCLEVBQUUsU0FBUyxjQUFjLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsTUFDbEYsQ0FBQztBQUFBLElBQ0g7QUFFQSxVQUFNLE9BQU8sT0FBTztBQUNwQixRQUFJLE1BQU07QUFDUixTQUFHLDJDQUEyQyxNQUFNO0FBQ2xELGVBQU8sUUFBUSx3QkFBd0IsRUFBRSxZQUFZLEtBQUssUUFBUSxnQkFBZ0IsS0FBSyxlQUFlLENBQUMsQ0FBQyxFQUNyRyxRQUFRLENBQUMsQ0FBQztBQUFBLE1BQ2YsQ0FBQztBQUFBLElBQ0g7QUFFQSxPQUFHLCtCQUErQixNQUFNO0FBQ3RDLGFBQU8sUUFBUSxtQkFBbUIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDakQsQ0FBQztBQUVELE9BQUcsdUVBQXVFLE1BQU07QUFDOUUsYUFBTyxRQUFRLDJCQUEyQixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFBQSxJQUN6RCxDQUFDO0FBRUQsT0FBRywyQkFBMkIsU0FBUyxJQUFJLE1BQU07QUFDL0MsYUFBTyxRQUFRLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFBQSxJQUNoRSxDQUFDO0FBRUQsT0FBRyxvREFBb0QsTUFBTTtBQUMzRCxhQUFPLFFBQVEsdUJBQXVCLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLElBQ3JELENBQUM7QUFFRCxPQUFHLDRFQUE0RSxNQUFNO0FBQ25GLGFBQU8sUUFBUSwwQ0FBMEMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDeEUsQ0FBQztBQUVELE9BQUcsMkRBQTJELE1BQU07QUFDbEUsYUFBTyxRQUFRLHVCQUF1QixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFBQSxJQUNyRCxDQUFDO0FBRUQsT0FBRyxvRkFBb0YsTUFBTTtBQUMzRixhQUFPLFFBQVEsNkJBQTZCLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLElBQzNELENBQUM7QUFLRCxPQUFHLGdDQUFnQyxNQUFNO0FBQ3ZDLGFBQU8sUUFBUSw2QkFBNkIsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLENBQUM7QUFBQSxJQUN6RSxDQUFDO0FBRUQsVUFBTSxRQUFRLE9BQU87QUFDckIsUUFBSSxPQUFPO0FBQ1QsU0FBRywyQ0FBMkMsTUFBTTtBQUNsRCxjQUFNLFVBQVUsUUFBUSxvQkFBb0IsS0FBSztBQUNqRCxlQUFPLFFBQVEsR0FBRyxFQUFFLFVBQVUsTUFBTSxZQUFZO0FBQ2hELGVBQU8sUUFBUSw2QkFBNkIsQ0FBQyxFQUFFLFVBQVUsTUFBTSxjQUFjO0FBQUEsTUFDL0UsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGLENBQUM7QUFDSDtBQUVBLE1BQU0seUJBQXlCLE9BQU87QUFDdEMsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSx5QkFBeUIsQ0FBQyxXQUFXO0FBQzNDLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sYUFBYTtBQUNuQixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLHdCQUF3QjtBQUk5QixNQUFNLG9CQUFvQjtBQUcxQixNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLGdCQUFnQjtBQUl0QixNQUFNLDZCQUE2QjtBQUNuQyxNQUFNLG1CQUFtQjtBQUd6QixTQUFTLHVCQUF1QixPQUFtQyxXQUFtQixPQUE4QjtBQUNsSCxRQUFNLFNBQVMsdUJBQXVCLE9BQU8sUUFBUTtBQUNyRCxRQUFNLE9BQU8sdUJBQXVCLE9BQU8sTUFBTTtBQUNqRCxRQUFNLFNBQVMsTUFBTSxTQUFTLFFBQVEsR0FBRyxLQUFLLEtBQUs7QUFDbkQsTUFBSSxTQUFTLGVBQWU7QUFDMUIsVUFBTSxTQUFTLEtBQUssb0JBQW9CLElBQUksUUFBUSxpQkFBaUIsU0FBUyxDQUFDLEVBQUU7QUFDakY7QUFBQSxFQUNGO0FBQ0EsTUFBSSxXQUFXLFlBQVksV0FBVyxJQUFJO0FBQ3hDLFVBQU0sU0FBUyxLQUFLLGlDQUFpQyxpQkFBaUIsU0FBUyxDQUFDLEVBQUU7QUFDbEY7QUFBQSxFQUNGO0FBRUEsTUFBSSxXQUFXLHFCQUFxQjtBQUNsQyxVQUFNLHVCQUF1QjtBQUM3QjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLFdBQVcsV0FBVztBQUN4QixRQUFJLE1BQU0sWUFBWTtBQUNwQixZQUFNLFNBQVMsS0FBSyxnQkFBZ0IsaUJBQWlCLFNBQVMsQ0FBQyxnQ0FBZ0MsaUJBQWlCLE1BQU0sV0FBVyxTQUFTLENBQUMsRUFBRTtBQUM3STtBQUFBLElBQ0Y7QUFDQSxVQUFNLGFBQWEsRUFBRSxRQUFRLE9BQU8sVUFBVTtBQUM5QztBQUFBLEVBQ0Y7QUFFQSxNQUFJLENBQUMsTUFBTSxZQUFZO0FBQ3JCLFVBQU0sU0FBUyxLQUFLLGdCQUFnQixpQkFBaUIsU0FBUyxDQUFDLHNCQUFzQjtBQUNyRjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLENBQUMsTUFBTSxXQUFXLFFBQVE7QUFDNUIsVUFBTSxTQUFTLEtBQUssc0JBQXNCLGlCQUFpQixNQUFNLFdBQVcsU0FBUyxDQUFDLHVCQUF1QjtBQUFBLEVBQy9HO0FBQ0EsUUFBTSxhQUFhO0FBQ3JCO0FBSUEsU0FBUyxzQkFBc0IsT0FBbUMsV0FBbUIsTUFBb0I7QUFDdkcsTUFBSSxNQUFNLFlBQVk7QUFDcEIsVUFBTSxtQkFBbUIsSUFBSSxTQUFTO0FBQ3RDLFVBQU0sV0FBVyxXQUFXLE1BQU0sb0JBQW9CLElBQUksU0FBUztBQUNuRTtBQUFBLEVBQ0Y7QUFDQSxNQUFJLE1BQU0seUJBQXlCLFFBQVEsS0FBSyxLQUFLLE1BQU0sSUFBSTtBQUM3RDtBQUFBLEVBQ0Y7QUFDQSxRQUFNLG1CQUFtQixJQUFJLFNBQVM7QUFDdEMsTUFBSSxDQUFDLE1BQU0sb0JBQW9CLElBQUksU0FBUyxHQUFHO0FBQzdDLFVBQU0sU0FBUyxLQUFLLDBCQUEwQixpQkFBaUIsTUFBTSxvQkFBb0IsQ0FBQyx1QkFBdUI7QUFBQSxFQUNuSDtBQUNBLFFBQU0sdUJBQXVCO0FBQy9CO0FBRUEsU0FBUyxhQUFhLFNBQW1CLFlBQXdDO0FBQy9FLFNBQU87QUFBQSxJQUNMLEtBQUssQ0FBQyxHQUFHLFNBQVMsR0FBRyxVQUFVO0FBQUEsSUFDL0I7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBU0EsU0FBUywwQkFBMEIsU0FBNkI7QUFDOUQsUUFBTSxZQUF3QixDQUFDO0FBQy9CLE1BQUksZ0JBQWdCO0FBQ3BCLGFBQVcsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLE1BQU0sSUFBSSxFQUFFLFFBQVEsR0FBRztBQUN6RCxRQUFJLG1CQUFtQixLQUFLLElBQUksR0FBRztBQUNqQyxzQkFBZ0IsQ0FBQztBQUNqQjtBQUFBLElBQ0Y7QUFDQSxRQUFJLENBQUMsZUFBZTtBQUNsQixnQkFBVSxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFBQSxJQUNoQztBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLHVCQUF1QixNQUErQjtBQUM3RCxRQUFNLFVBQW9CLENBQUM7QUFDM0IsYUFBVyxRQUFRLHNCQUFzQixLQUFLLE9BQU8sR0FBRztBQUN0RCxlQUFXLFNBQVMsZ0JBQWdCLElBQUksRUFBRSxTQUFTLHFCQUFxQixHQUFHO0FBQ3pFLFlBQU0sU0FBUyx1QkFBdUIsT0FBTyxRQUFRLEVBQUUsV0FBVyx3QkFBd0IsRUFBRTtBQUM1RixZQUFNLENBQUMsV0FBVyxFQUFFLElBQUksT0FBTyxNQUFNLEtBQUssQ0FBQztBQUMzQyxVQUFJLHFCQUFxQixLQUFLLFFBQVEsS0FBSyxDQUFDLFNBQVMsWUFBWSxFQUFFLFNBQVMsS0FBSyxHQUFHO0FBQ2xGO0FBQUEsTUFDRjtBQUNBLGNBQVEsS0FBSyxLQUFLLFFBQVEsS0FBSyxZQUFZLEdBQUcsc0JBQXNCLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDaEY7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyx3QkFBd0IsV0FBNkI7QUFDNUQsU0FBTyxDQUFDLEdBQUcsVUFBVSxTQUFTLElBQUksT0FBTyxPQUFPLHdCQUF3QixzQkFBc0IsK0JBQStCLElBQUksQ0FBQyxDQUFDLEVBQ2hJLE9BQU8sQ0FBQyxVQUFVLENBQUMsa0JBQWtCLHVCQUF1QixPQUFPLFdBQVcsQ0FBQyxDQUFDLEVBQ2hGLElBQUksQ0FBQyxVQUFVLHVCQUF1QixPQUFPLE1BQU0sQ0FBQztBQUN6RDtBQUVBLFNBQVMsMEJBQTBCLFdBQTZCO0FBQzlELFNBQU8sQ0FBQyxHQUFHLFVBQVUsU0FBUyxJQUFJLE9BQU8sT0FBTyx3QkFBd0Isc0JBQXNCLDhCQUE4QixJQUFJLENBQUMsQ0FBQyxFQUMvSCxPQUFPLENBQUMsVUFBVSxDQUFDLGtCQUFrQix1QkFBdUIsT0FBTyxXQUFXLENBQUMsQ0FBQyxFQUNoRixJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxNQUFNLENBQUM7QUFDekQ7QUFFQSxTQUFTLHVCQUF1QixVQUE0QjtBQUMxRCxTQUFPLENBQUMsR0FBRyxTQUFTLFNBQVMscUJBQXFCLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxNQUFNLENBQUM7QUFDM0c7QUFFQSxTQUFTLG1CQUFtQixlQUFpQztBQUMzRCxTQUFPLENBQUMsR0FBRyxjQUFjLFNBQVMsbUNBQW1DLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxNQUFNLENBQUM7QUFDOUg7QUFFQSxTQUFTLHFCQUFxQixlQUFpQztBQUM3RCxTQUFPLENBQUMsR0FBRyxjQUFjLFNBQVMseUJBQXlCLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxNQUFNLENBQUM7QUFDcEg7QUFHQSxTQUFTLHdCQUF3QixTQUEyQjtBQUMxRCxTQUFPLDBCQUEwQixPQUFPLEVBQ3JDLE9BQU8sQ0FBQyxhQUFhLGlCQUFpQixLQUFLLGdCQUFnQixTQUFTLElBQUksQ0FBQyxDQUFDLEVBQzFFLElBQUksQ0FBQyxhQUFhLFNBQVMsS0FBSztBQUNyQztBQUVBLFNBQVMsaUJBQWlCLFdBQTJCO0FBQ25ELFNBQU8sUUFBUSxPQUFPLFlBQVksQ0FBQyxDQUFDO0FBQ3RDO0FBRUEsU0FBUyxzQkFBc0IsU0FBMkI7QUFDeEQsU0FBTywwQkFBMEIsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLFNBQVMsSUFBSTtBQUMzRTtBQUdBLFNBQVMsTUFBTSxTQUEwQjtBQUN2QyxhQUFXLFFBQVEsaUJBQWlCLE9BQU8sRUFBRSxNQUFNLElBQUksR0FBRztBQUN4RCxVQUFNLGNBQWMsS0FBSyxLQUFLO0FBQzlCLFFBQUksZ0JBQWdCLElBQUk7QUFDdEI7QUFBQSxJQUNGO0FBQ0EsV0FBTyxXQUFXLEtBQUssV0FBVztBQUFBLEVBQ3BDO0FBQ0EsU0FBTztBQUNUO0FBSUEsU0FBUyxjQUFjLFNBQTBCO0FBQy9DLGFBQVcsUUFBUSxpQkFBaUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxHQUFHO0FBQ3hELFFBQUksbUJBQW1CLEtBQUssSUFBSSxHQUFHO0FBQ2pDLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxjQUFjLEtBQUssS0FBSztBQUM5QixRQUFJLGdCQUFnQixNQUFNLGdCQUFnQixLQUFLLFdBQVcsR0FBRztBQUMzRDtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU87QUFDVDtBQUlBLFNBQVMsWUFBWSxTQUEwQjtBQUM3QyxTQUFPLHdCQUF3QixPQUFPLEVBQUUsU0FBUztBQUNuRDtBQUVBLFNBQVMsa0JBQWtCLFdBQTRCO0FBQ3JELFNBQU8sNEJBQTRCLEtBQUssU0FBUztBQUNuRDtBQUVBLFNBQVMsYUFBYSxTQUFpQixNQUFnQztBQUNyRSxVQUFRLFNBQVM7QUFBQSxJQUNmLEtBQUssU0FBUztBQUNaLGFBQU8sYUFBYSx3QkFBd0IsSUFBSSxHQUFHLDBCQUEwQixJQUFJLENBQUM7QUFBQSxJQUNwRjtBQUFBLElBQ0EsS0FBSyxRQUFRO0FBQ1gsYUFBTyxhQUFhLENBQUMsR0FBRyx1QkFBdUIsSUFBSSxDQUFDO0FBQUEsSUFDdEQ7QUFBQSxJQUNBLFNBQVM7QUFDUCxhQUFPLGFBQWEsbUJBQW1CLElBQUksR0FBRyxxQkFBcUIsSUFBSSxDQUFDO0FBQUEsSUFDMUU7QUFBQSxFQUNGO0FBQ0Y7QUFNQSxTQUFTLDRCQUE0QixTQUFnQztBQUNuRSxRQUFNLGNBQWMsb0JBQW9CLEtBQUssT0FBTyxJQUFJLENBQUM7QUFDekQsTUFBSSxnQkFBZ0IsUUFBVztBQUM3QixXQUFPO0FBQUEsRUFDVDtBQUNBLFFBQU0sU0FBUywyQkFBMkIsS0FBSyxXQUFXLEdBQUcsU0FBUyxRQUFRO0FBQzlFLE1BQUksV0FBVyxRQUFXO0FBQ3hCLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxPQUFPLEtBQUssRUFBRSxRQUFRLDhDQUE4QyxVQUFVO0FBQ3ZGO0FBTUEsU0FBUyx1QkFBdUIsU0FBd0M7QUFDdEUsUUFBTSxRQUFvQztBQUFBLElBQ3hDLG9CQUFvQixvQkFBSSxJQUFZO0FBQUEsSUFDcEMsWUFBWTtBQUFBLElBQ1osc0JBQXNCO0FBQUEsSUFDdEIsVUFBVSxDQUFDO0FBQUEsSUFDWCxxQkFBcUIsSUFBSSxJQUFJLHdCQUF3QixPQUFPLENBQUM7QUFBQSxFQUMvRDtBQUVBLGFBQVcsRUFBRSxPQUFPLEtBQUssS0FBSywwQkFBMEIsT0FBTyxHQUFHO0FBQ2hFLFVBQU0sUUFBUSxrQkFBa0IsS0FBSyxJQUFJO0FBQ3pDLFFBQUksT0FBTztBQUNULDZCQUF1QixPQUFPLE9BQU8sS0FBSztBQUFBLElBQzVDLFdBQVcsd0JBQXdCLEtBQUssSUFBSSxHQUFHO0FBQzdDLFlBQU0sU0FBUyxLQUFLLDRCQUE0QixpQkFBaUIsS0FBSyxDQUFDLEVBQUU7QUFBQSxJQUMzRSxPQUFPO0FBQ0wsNEJBQXNCLE9BQU8sT0FBTyxJQUFJO0FBQUEsSUFDMUM7QUFBQSxFQUNGO0FBRUEsTUFBSSxNQUFNLFlBQVk7QUFDcEIsVUFBTSxTQUFTLEtBQUssc0JBQXNCLGlCQUFpQixNQUFNLFdBQVcsU0FBUyxDQUFDLDhCQUE4QjtBQUFBLEVBQ3RIO0FBQ0EsTUFBSSxNQUFNLHlCQUF5QixNQUFNO0FBQ3ZDLFVBQU0sU0FBUyxLQUFLLDBCQUEwQixpQkFBaUIsTUFBTSxvQkFBb0IsQ0FBQyx1QkFBdUI7QUFBQSxFQUNuSDtBQUNBLFNBQU8sRUFBRSxvQkFBb0IsTUFBTSxvQkFBb0IsVUFBVSxNQUFNLFNBQVM7QUFDbEY7QUFFQSxTQUFTLGlCQUFpQixTQUF5QjtBQUNqRCxTQUFPLFFBQVEsUUFBUSxxQkFBcUIsRUFBRTtBQUNoRDtBQUVBLFNBQVMsZ0JBQWdCLE1BQXNCO0FBQzdDLFNBQU8sS0FBSyxXQUFXLHFCQUFxQixFQUFFO0FBQ2hEO0FBSUEsU0FBUyxzQkFBc0IsT0FBdUI7QUFDcEQsTUFBSTtBQUNGLFdBQU8sbUJBQW1CLEtBQUs7QUFBQSxFQUNqQyxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "94.2.0",
3
+ "version": "94.3.0",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development.",
5
5
  "keywords": [
6
6
  "obsidian"