obsidian-dev-utils 26.20.0 → 26.22.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,15 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 26.22.0
4
+
5
+ - cleanupParentFolders on deletion
6
+
7
+ ## 26.21.0
8
+
9
+ - Switch to EmptyAttachmentFolderBehavior
10
+ - Combine settings properly
11
+ - Update libs
12
+
3
13
  ## 26.20.0
4
14
 
5
15
  - Add more deep equal checks
@@ -30,7 +30,7 @@ __export(Library_exports, {
30
30
  LIBRARY_VERSION: () => LIBRARY_VERSION
31
31
  });
32
32
  module.exports = __toCommonJS(Library_exports);
33
- const LIBRARY_VERSION = "26.20.0";
33
+ const LIBRARY_VERSION = "26.22.0";
34
34
  const LIBRARY_NAME = "obsidian-dev-utils";
35
35
  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.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 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-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.prompt-modal .text-box {\n width: 100%;\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid, .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid, .obsidian-dev-utils input.metadata-input-text:focus:invalid,\n.obsidian-dev-utils input[type=date]:active:invalid,\n.obsidian-dev-utils input[type=date]:focus-visible:invalid,\n.obsidian-dev-utils input[type=date]:focus:invalid,\n.obsidian-dev-utils input[type=datetime-local]:active:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid,\n.obsidian-dev-utils input[type=email]:active:invalid,\n.obsidian-dev-utils input[type=email]:focus-visible:invalid,\n.obsidian-dev-utils input[type=email]:focus:invalid,\n.obsidian-dev-utils input[type=number]:active:invalid,\n.obsidian-dev-utils input[type=number]:focus-visible:invalid,\n.obsidian-dev-utils input[type=number]:focus:invalid,\n.obsidian-dev-utils input[type=password]:active:invalid,\n.obsidian-dev-utils input[type=password]:focus-visible:invalid,\n.obsidian-dev-utils input[type=password]:focus:invalid,\n.obsidian-dev-utils input[type=search]:active:invalid,\n.obsidian-dev-utils input[type=search]:focus-visible:invalid,\n.obsidian-dev-utils input[type=search]:focus:invalid,\n.obsidian-dev-utils input[type=text]:active:invalid,\n.obsidian-dev-utils input[type=text]:focus-visible:invalid,\n.obsidian-dev-utils input[type=text]:focus:invalid,\n.obsidian-dev-utils textarea:active:invalid,\n.obsidian-dev-utils textarea:focus-visible:invalid,\n.obsidian-dev-utils textarea:focus:invalid {\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/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/prompt-modal.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;;AAGF;EACE;EACA;;;ACnCJ;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;;;AChDF;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACRJ;EACE;;;ACDF;EACE;;;ACEJ;EAJA;;AAoBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EApBJ;;AA0BA;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.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.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&.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&.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.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.obsidian-dev-utils%20%7B%5Cn%20%20:invalid%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%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";
36
36
  // Annotate the CommonJS export names for ESM import in node:
@@ -25,6 +25,7 @@ var __copyProps = (to, from, except, desc) => {
25
25
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
26
26
  var RenameDeleteHandler_exports = {};
27
27
  __export(RenameDeleteHandler_exports, {
28
+ EmptyAttachmentFolderBehavior: () => EmptyAttachmentFolderBehavior,
28
29
  registerRenameDeleteHandlers: () => registerRenameDeleteHandlers
29
30
  });
30
31
  module.exports = __toCommonJS(RenameDeleteHandler_exports);
@@ -45,6 +46,12 @@ var import_VaultEx = require('./VaultEx.cjs');
45
46
  const deletedMetadataCacheMap = /* @__PURE__ */ new Map();
46
47
  const handledRenames = /* @__PURE__ */ new Set();
47
48
  const interruptedRenamesMap = /* @__PURE__ */ new Map();
49
+ var EmptyAttachmentFolderBehavior = /* @__PURE__ */ ((EmptyAttachmentFolderBehavior2) => {
50
+ EmptyAttachmentFolderBehavior2["Delete"] = "Delete";
51
+ EmptyAttachmentFolderBehavior2["DeleteWithEmptyParents"] = "DeleteWithEmptyParents";
52
+ EmptyAttachmentFolderBehavior2["Keep"] = "Keep";
53
+ return EmptyAttachmentFolderBehavior2;
54
+ })(EmptyAttachmentFolderBehavior || {});
48
55
  function registerRenameDeleteHandlers(plugin, settingsBuilder) {
49
56
  const renameDeleteHandlersMap = getRenameDeleteHandlersMap(plugin.app);
50
57
  const pluginId = plugin.manifest.id;
@@ -76,6 +83,24 @@ function registerRenameDeleteHandlers(plugin, settingsBuilder) {
76
83
  }
77
84
  });
78
85
  }
86
+ async function cleanupParentFolders(app, parentFolderPaths, notePath) {
87
+ const settings = getSettings(app);
88
+ if (settings.emptyAttachmentFolderBehavior === "Keep" /* Keep */) {
89
+ return;
90
+ }
91
+ for (const parentFolderPath of parentFolderPaths) {
92
+ switch (settings.emptyAttachmentFolderBehavior) {
93
+ case "Delete" /* Delete */:
94
+ await (0, import_VaultEx.deleteSafe)(app, parentFolderPath, notePath, void 0, true);
95
+ break;
96
+ case "DeleteWithEmptyParents" /* DeleteWithEmptyParents */:
97
+ await (0, import_VaultEx.deleteEmptyFolderHierarchy)(app, parentFolderPath);
98
+ break;
99
+ default:
100
+ break;
101
+ }
102
+ }
103
+ }
79
104
  async function continueInterruptedRenames(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks) {
80
105
  const interruptedRenames = interruptedRenamesMap.get(oldPath);
81
106
  if (interruptedRenames) {
@@ -153,20 +178,25 @@ function getSettings(app) {
153
178
  const renameDeleteHandlersMap = getRenameDeleteHandlersMap(app);
154
179
  const settingsBuilders = Array.from(renameDeleteHandlersMap.values()).reverse();
155
180
  const settings = {};
181
+ settings.isNote = (path) => (0, import_FileSystem.isNote)(app, path);
182
+ settings.isPathIgnored = () => false;
156
183
  for (const settingsBuilder of settingsBuilders) {
157
184
  const newSettings = settingsBuilder();
158
185
  settings.shouldDeleteConflictingAttachments ||= newSettings.shouldDeleteConflictingAttachments ?? false;
159
- settings.shouldDeleteEmptyFolders ||= newSettings.shouldDeleteEmptyFolders ?? false;
186
+ if (newSettings.emptyAttachmentFolderBehavior) {
187
+ settings.emptyAttachmentFolderBehavior ??= newSettings.emptyAttachmentFolderBehavior;
188
+ }
160
189
  settings.shouldHandleDeletions ||= newSettings.shouldHandleDeletions ?? false;
161
190
  settings.shouldHandleRenames ||= newSettings.shouldHandleRenames ?? false;
162
191
  settings.shouldRenameAttachmentFiles ||= newSettings.shouldRenameAttachmentFiles ?? false;
163
192
  settings.shouldRenameAttachmentFolder ||= newSettings.shouldRenameAttachmentFolder ?? false;
164
193
  settings.shouldUpdateFilenameAliases ||= newSettings.shouldUpdateFilenameAliases ?? false;
165
194
  const isPathIgnored = settings.isPathIgnored;
166
- settings.isPathIgnored = (path) => isPathIgnored?.(path) ?? newSettings.isPathIgnored?.(path) ?? false;
195
+ settings.isPathIgnored = (path) => isPathIgnored(path) || (newSettings.isPathIgnored?.(path) ?? false);
167
196
  const currentIsNote = settings.isNote;
168
- settings.isNote = (path) => currentIsNote?.(path) ?? newSettings.isNote?.(path) ?? (0, import_FileSystem.isNote)(app, path);
197
+ settings.isNote = (path) => currentIsNote(path) && (newSettings.isNote?.(path) ?? true);
169
198
  }
199
+ settings.emptyAttachmentFolderBehavior ??= "Keep" /* Keep */;
170
200
  return settings;
171
201
  }
172
202
  async function handleCaseCollision(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks) {
@@ -193,6 +223,7 @@ async function handleDelete(app, path) {
193
223
  }
194
224
  const cache = deletedMetadataCacheMap.get(path);
195
225
  deletedMetadataCacheMap.delete(path);
226
+ const parentFolderPaths = /* @__PURE__ */ new Set();
196
227
  if (cache) {
197
228
  const links = (0, import_MetadataCache.getAllLinks)(cache);
198
229
  for (const link of links) {
@@ -203,9 +234,11 @@ async function handleDelete(app, path) {
203
234
  if (isNoteEx(app, attachmentFile.path)) {
204
235
  continue;
205
236
  }
206
- await (0, import_VaultEx.deleteSafe)(app, attachmentFile, path, settings.shouldDeleteEmptyFolders);
237
+ parentFolderPaths.add(attachmentFile.parent?.path ?? "");
238
+ await (0, import_VaultEx.deleteSafe)(app, attachmentFile, path, settings.emptyAttachmentFolderBehavior !== "Keep" /* Keep */);
207
239
  }
208
240
  }
241
+ await cleanupParentFolders(app, Array.from(parentFolderPaths), path);
209
242
  const attachmentFolderPath = await (0, import_AttachmentPath.getAttachmentFolderPath)(app, path);
210
243
  const attachmentFolder = (0, import_FileSystem.getFolderOrNull)(app, attachmentFolderPath);
211
244
  if (!attachmentFolder) {
@@ -214,7 +247,7 @@ async function handleDelete(app, path) {
214
247
  if (!await (0, import_AttachmentPath.hasOwnAttachmentFolder)(app, path)) {
215
248
  return;
216
249
  }
217
- await (0, import_VaultEx.deleteSafe)(app, attachmentFolder, path, false, settings.shouldDeleteEmptyFolders);
250
+ await (0, import_VaultEx.deleteSafe)(app, attachmentFolder, path, false, settings.emptyAttachmentFolderBehavior !== "Keep" /* Keep */);
218
251
  }
219
252
  function handleDeleteIfEnabled(plugin, file) {
220
253
  const app = plugin.app;
@@ -276,21 +309,17 @@ async function handleRenameAsync(app, oldPath, newPath, oldPathBacklinksMap, old
276
309
  const attachmentOldPathBacklinksMap = (await (0, import_MetadataCache.getBacklinksForFileSafe)(app, attachmentOldPath)).data;
277
310
  initBacklinksMap(attachmentOldPathBacklinksMap, renameMap, combinedBacklinksMap, attachmentOldPath);
278
311
  }
279
- const parentFolders = /* @__PURE__ */ new Set();
312
+ const parentFolderPaths = /* @__PURE__ */ new Set();
280
313
  for (const [oldAttachmentPath, newAttachmentPath] of renameMap.entries()) {
281
314
  if (oldAttachmentPath === oldPath) {
282
315
  continue;
283
316
  }
284
317
  const fixedNewAttachmentPath = await renameHandled(app, oldAttachmentPath, newAttachmentPath);
285
318
  renameMap.set(oldAttachmentPath, fixedNewAttachmentPath);
286
- parentFolders.add((0, import_Path.dirname)(oldAttachmentPath));
319
+ parentFolderPaths.add((0, import_Path.dirname)(oldAttachmentPath));
287
320
  }
321
+ await cleanupParentFolders(app, Array.from(parentFolderPaths), oldPath);
288
322
  const settings = getSettings(app);
289
- if (settings.shouldDeleteEmptyFolders) {
290
- for (const parentFolder of parentFolders) {
291
- await (0, import_VaultEx.deleteEmptyFolderHierarchy)(app, parentFolder);
292
- }
293
- }
294
323
  for (const [newBacklinkPath, linkJsonToPathMap] of Array.from(combinedBacklinksMap.entries()).concat(
295
324
  Array.from(interruptedCombinedBacklinksMap?.entries() ?? [])
296
325
  )) {
@@ -444,6 +473,7 @@ function shouldInvokeHandler(plugin) {
444
473
  }
445
474
  // Annotate the CommonJS export names for ESM import in node:
446
475
  0 && (module.exports = {
476
+ EmptyAttachmentFolderBehavior,
447
477
  registerRenameDeleteHandlers
448
478
  });
449
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBQbHVnaW4sXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncyc7XG5cbmltcG9ydCB7IFZhdWx0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIFVwZGF0ZUxpbmtPcHRpb25zLFxuICBVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnNcbn0gZnJvbSAnLi9MaW5rLnRzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9EZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi9PYmplY3QudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIG1ha2VGaWxlTmFtZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyByZXBsYWNlQWxsIH0gZnJvbSAnLi4vU3RyaW5nLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4vQXBwLnRzJztcbmltcG9ydCB7XG4gIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICBoYXNPd25BdHRhY2htZW50Rm9sZGVyXG59IGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGVkaXRMaW5rcyxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuL0xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICB0ZW1wUmVnaXN0ZXJGaWxlQW5kUnVuXG59IGZyb20gJy4vTWV0YWRhdGFDYWNoZS50cyc7XG5pbXBvcnQgeyByZWdpc3RlclBhdGNoIH0gZnJvbSAnLi9Nb25rZXlBcm91bmQudHMnO1xuaW1wb3J0IHsgYWRkVG9RdWV1ZSB9IGZyb20gJy4vUXVldWUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIHJlbmFtZVNhZmVcbn0gZnJvbSAnLi9WYXVsdC50cyc7XG5pbXBvcnQge1xuICBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeSxcbiAgZGVsZXRlU2FmZVxufSBmcm9tICcuL1ZhdWx0RXgudHMnO1xuXG5jb25zdCBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcbmNvbnN0IGhhbmRsZWRSZW5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5jb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuLyoqXG4gKiBTZXR0aW5ncyBmb3IgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3Mge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcGF0aCBpcyBhIG5vdGUuXG4gICAqL1xuICBpc05vdGUocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICBpc1BhdGhJZ25vcmVkKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnRzLlxuICAgKi9cbiAgc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50czogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgZW1wdHkgZm9sZGVycy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgZGVsZXRpb25zLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlRGVsZXRpb25zOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSByZW5hbWVzLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlUmVuYW1lczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmaWxlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZvbGRlciB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZW5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxudHlwZSBSdW5Bc3luY0xpbmtVcGRhdGVGbiA9IEZpbGVNYW5hZ2VyWydydW5Bc3luY0xpbmtVcGRhdGUnXTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlcnMuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gc2V0dGluZ3NCdWlsZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHNldHRpbmdzIGZvciB0aGUgcmVuYW1lIGRlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSZW5hbWVEZWxldGVIYW5kbGVycyhwbHVnaW46IFBsdWdpbiwgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4pOiB2b2lkIHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChwbHVnaW4uYXBwKTtcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG5cbiAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuc2V0KHBsdWdpbklkLCBzZXR0aW5nc0J1aWxkZXIpO1xuICBsb2dSZWdpc3RlcmVkSGFuZGxlcnMocGx1Z2luLmFwcCk7XG5cbiAgcGx1Z2luLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5kZWxldGUocGx1Z2luSWQpO1xuICAgIGxvZ1JlZ2lzdGVyZWRIYW5kbGVycyhwbHVnaW4uYXBwKTtcbiAgfSk7XG5cbiAgY29uc3QgYXBwID0gcGx1Z2luLmFwcDtcbiAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoXG4gICAgYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCAoZmlsZSkgPT4ge1xuICAgICAgaGFuZGxlRGVsZXRlSWZFbmFibGVkKHBsdWdpbiwgZmlsZSk7XG4gICAgfSlcbiAgKTtcblxuICBwbHVnaW4ucmVnaXN0ZXJFdmVudChcbiAgICBhcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKSA9PiB7XG4gICAgICBoYW5kbGVSZW5hbWVJZkVuYWJsZWQocGx1Z2luLCBmaWxlLCBvbGRQYXRoKTtcbiAgICB9KVxuICApO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgKGZpbGUsIHByZXZDYWNoZSkgPT4ge1xuICAgICAgaGFuZGxlTWV0YWRhdGFEZWxldGVkSWZFbmFibGVkKHBsdWdpbiwgZmlsZSwgcHJldkNhY2hlKTtcbiAgICB9KVxuICApO1xuXG4gIHJlZ2lzdGVyUGF0Y2gocGx1Z2luLCBhcHAuZmlsZU1hbmFnZXIsIHtcbiAgICBydW5Bc3luY0xpbmtVcGRhdGU6IChuZXh0OiBSdW5Bc3luY0xpbmtVcGRhdGVGbik6IFJ1bkFzeW5jTGlua1VwZGF0ZUZuID0+IHtcbiAgICAgIHJldHVybiAobGlua1VwZGF0ZXNIYW5kbGVyKSA9PiBydW5Bc3luY0xpbmtVcGRhdGUoYXBwLCBuZXh0LCBsaW5rVXBkYXRlc0hhbmRsZXIpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKFxuICBhcHA6IEFwcCxcbiAgb2xkUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4gIG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGludGVycnVwdGVkUmVuYW1lcyA9IGludGVycnVwdGVkUmVuYW1lc01hcC5nZXQob2xkUGF0aCk7XG4gIGlmIChpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZGVsZXRlKG9sZFBhdGgpO1xuICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICBhd2FpdCBoYW5kbGVSZW5hbWVBc3luYyhhcHAsIGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcywgaW50ZXJydXB0ZWRSZW5hbWUuY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaWxsUmVuYW1lTWFwKGFwcDogQXBwLCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZywgcmVuYW1lTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LCBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlbmFtZU1hcC5zZXQob2xkUGF0aCwgbmV3UGF0aCk7XG5cbiAgaWYgKCFpc05vdGVFeChhcHAsIG9sZFBhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuXG4gIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBvbGRQYXRoKTtcbiAgY29uc3QgbmV3QXR0YWNobWVudEZvbGRlclBhdGggPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyXG4gICAgPyBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIG5ld1BhdGgpXG4gICAgOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aDtcblxuICBjb25zdCBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPSBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy8nO1xuXG4gIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCk7XG5cbiAgaWYgKCFvbGRBdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGVzOiBURmlsZVtdID0gW107XG5cbiAgaWYgKGF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoYXBwLCBvbGRQYXRoKSkge1xuICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihvbGRBdHRhY2htZW50Rm9sZGVyLCAob2xkQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAgIGlmIChpc0ZpbGUob2xkQXR0YWNobWVudEZpbGUpKSB7XG4gICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIG9sZFBhdGhMaW5rcykge1xuICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoYXBwLCBvbGRQYXRoTGluaywgb2xkUGF0aCk7XG4gICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290IHx8IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgb2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICBpZiAob2xkQXR0YWNobWVudEJhY2tsaW5rcy5rZXlzKCkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb2xkQmFzZW5hbWUgPSBiYXNlbmFtZShvbGRQYXRoLCBleHRuYW1lKG9sZFBhdGgpKTtcbiAgY29uc3QgbmV3QmFzZW5hbWUgPSBiYXNlbmFtZShuZXdQYXRoLCBleHRuYW1lKG5ld1BhdGgpKTtcblxuICBmb3IgKGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlIG9mIG9sZEF0dGFjaG1lbnRGaWxlcykge1xuICAgIGlmIChpc05vdGVFeChhcHAsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID8gb2xkQXR0YWNobWVudEZpbGUucGF0aCA6IHJlbGF0aXZlKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKTtcbiAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgIGNvbnN0IG5ld0NoaWxkQmFzZW5hbWUgPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXNcbiAgICAgID8gcmVwbGFjZUFsbChvbGRBdHRhY2htZW50RmlsZS5iYXNlbmFtZSwgb2xkQmFzZW5hbWUsIG5ld0Jhc2VuYW1lKVxuICAgICAgOiBvbGRBdHRhY2htZW50RmlsZS5iYXNlbmFtZTtcbiAgICBsZXQgbmV3Q2hpbGRQYXRoID0gam9pbihuZXdGb2xkZXIsIG1ha2VGaWxlTmFtZShuZXdDaGlsZEJhc2VuYW1lLCBvbGRBdHRhY2htZW50RmlsZS5leHRlbnNpb24pKTtcblxuICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdDaGlsZFBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzKSB7XG4gICAgICBjb25zdCBuZXdDaGlsZEZpbGUgPSBnZXRGaWxlT3JOdWxsKGFwcCwgbmV3Q2hpbGRQYXRoKTtcbiAgICAgIGlmIChuZXdDaGlsZEZpbGUpIHtcbiAgICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnRyYXNoRmlsZShuZXdDaGlsZEZpbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdDaGlsZFBhdGggPSBhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKG5ld0ZvbGRlciwgbmV3Q2hpbGRCYXNlbmFtZSksIG9sZEF0dGFjaG1lbnRGaWxlLmV4dGVuc2lvbik7XG4gICAgfVxuICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudEZpbGUucGF0aCwgbmV3Q2hpbGRQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHA6IEFwcCk6IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKGFwcCwgJ3JlbmFtZURlbGV0ZUhhbmRsZXJzTWFwJywgbmV3IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj4oKSkudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGdldFNldHRpbmdzKGFwcDogQXBwKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+IHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHApO1xuICBjb25zdCBzZXR0aW5nc0J1aWxkZXJzID0gQXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC52YWx1ZXMoKSkucmV2ZXJzZSgpO1xuXG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4gPSB7fTtcbiAgZm9yIChjb25zdCBzZXR0aW5nc0J1aWxkZXIgb2Ygc2V0dGluZ3NCdWlsZGVycykge1xuICAgIGNvbnN0IG5ld1NldHRpbmdzID0gc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGREZWxldGVFbXB0eUZvbGRlcnMgfHw9IG5ld1NldHRpbmdzLnNob3VsZERlbGV0ZUVtcHR5Rm9sZGVycyA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzID8/IGZhbHNlO1xuICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzID8/IGZhbHNlO1xuICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgPz8gZmFsc2U7XG4gICAgc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzZXMgPz8gZmFsc2U7XG4gICAgY29uc3QgaXNQYXRoSWdub3JlZCA9IHNldHRpbmdzLmlzUGF0aElnbm9yZWQ7XG4gICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzUGF0aElnbm9yZWQ/LihwYXRoKSA/PyBuZXdTZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkgPz8gZmFsc2U7XG4gICAgY29uc3QgY3VycmVudElzTm90ZSA9IHNldHRpbmdzLmlzTm90ZTtcbiAgICBzZXR0aW5ncy5pc05vdGUgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBjdXJyZW50SXNOb3RlPy4ocGF0aCkgPz8gbmV3U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gaXNOb3RlKGFwcCwgcGF0aCk7XG4gIH1cblxuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNhc2VDb2xsaXNpb24oXG4gIGFwcDogQXBwLFxuICBvbGRQYXRoOiBzdHJpbmcsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LFxuICBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKCFhcHAudmF1bHQuYWRhcHRlci5pbnNlbnNpdGl2ZSB8fCBvbGRQYXRoLnRvTG93ZXJDYXNlKCkgIT09IG5ld1BhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHRlbXBQYXRoID0gam9pbihkaXJuYW1lKG5ld1BhdGgpLCBgX190ZW1wX18ke2Jhc2VuYW1lKG5ld1BhdGgpfWApO1xuICBhd2FpdCByZW5hbWVIYW5kbGVkKGFwcCwgbmV3UGF0aCwgdGVtcFBhdGgpO1xuICBhd2FpdCBoYW5kbGVSZW5hbWVBc3luYyhhcHAsIG9sZFBhdGgsIHRlbXBQYXRoLCBvbGRQYXRoQmFja2xpbmtzTWFwLCBvbGRQYXRoTGlua3MpO1xuICBhd2FpdCBhcHAudmF1bHQucmVuYW1lKGdldEZpbGUoYXBwLCB0ZW1wUGF0aCksIG5ld1BhdGgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlRGVsZXRlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYEhhbmRsZSBEZWxldGUgJHtwYXRofWApO1xuICBpZiAoIWlzTm90ZUV4KGFwcCwgcGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG4gIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihwYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZ2V0KHBhdGgpO1xuICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5kZWxldGUocGF0aCk7XG4gIGlmIChjYWNoZSkge1xuICAgIGNvbnN0IGxpbmtzID0gZ2V0QWxsTGlua3MoY2FjaGUpO1xuXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICBjb25zdCBhdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShhcHAsIGxpbmssIHBhdGgpO1xuICAgICAgaWYgKCFhdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTm90ZUV4KGFwcCwgYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBhdHRhY2htZW50RmlsZSwgcGF0aCwgc2V0dGluZ3Muc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgcGF0aCk7XG4gIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBhdHRhY2htZW50Rm9sZGVyUGF0aCk7XG5cbiAgaWYgKCFhdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCEoYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcihhcHAsIHBhdGgpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBhdHRhY2htZW50Rm9sZGVyLCBwYXRoLCBmYWxzZSwgc2V0dGluZ3Muc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlRGVsZXRlSWZFbmFibGVkKHBsdWdpbjogUGx1Z2luLCBmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gIGNvbnN0IGFwcCA9IHBsdWdpbi5hcHA7XG4gIGlmICghc2hvdWxkSW52b2tlSGFuZGxlcihwbHVnaW4pKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBhdGggPSBmaWxlLnBhdGg7XG4gIGFkZFRvUXVldWUoYXBwLCAoKSA9PiBoYW5kbGVEZWxldGUoYXBwLCBwYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChhcHA6IEFwcCwgZmlsZTogVEFic3RyYWN0RmlsZSwgcHJldkNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGZpbGUucGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNNYXJrZG93bkZpbGUoYXBwLCBmaWxlKSAmJiBwcmV2Q2FjaGUpIHtcbiAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQoZmlsZS5wYXRoLCBwcmV2Q2FjaGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1ldGFkYXRhRGVsZXRlZElmRW5hYmxlZChwbHVnaW46IFBsdWdpbiwgZmlsZTogVEFic3RyYWN0RmlsZSwgcHJldkNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaGFuZGxlTWV0YWRhdGFEZWxldGVkKHBsdWdpbi5hcHAsIGZpbGUsIHByZXZDYWNoZSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qga2V5ID0gbWFrZUtleShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYEhhbmRsZSBSZW5hbWUgJHtrZXl9YCk7XG4gIGlmIChoYW5kbGVkUmVuYW1lcy5oYXMoa2V5KSkge1xuICAgIGhhbmRsZWRSZW5hbWVzLmRlbGV0ZShrZXkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcbiAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzIHx8IHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSB8fCBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obmV3UGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG9sZFBhdGgpID8/IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICBjb25zdCBvbGRQYXRoTGlua3MgPSBjYWNoZSA/IGdldEFsbExpbmtzKGNhY2hlKSA6IFtdO1xuICBjb25zdCBvbGRQYXRoQmFja2xpbmtzTWFwID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aChhcHAsIG9sZFBhdGgpLmRhdGE7XG4gIGFkZFRvUXVldWUoYXBwLCAoKSA9PiBoYW5kbGVSZW5hbWVBc3luYyhhcHAsIG9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcykpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVSZW5hbWVBc3luYyhcbiAgYXBwOiBBcHAsXG4gIG9sZFBhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuICBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW10sXG4gIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA/OiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzKTtcbiAgYXdhaXQgcmVmcmVzaExpbmtzKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzKTtcbiAgaWYgKGF3YWl0IGhhbmRsZUNhc2VDb2xsaXNpb24oYXBwLCBvbGRQYXRoLCBuZXdQYXRoLCBvbGRQYXRoQmFja2xpbmtzTWFwLCBvbGRQYXRoTGlua3MpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGF3YWl0IGZpbGxSZW5hbWVNYXAoYXBwLCBvbGRQYXRoLCBuZXdQYXRoLCByZW5hbWVNYXAsIG9sZFBhdGhMaW5rcyk7XG5cbiAgICBjb25zdCBjb21iaW5lZEJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAgIGluaXRCYWNrbGlua3NNYXAob2xkUGF0aEJhY2tsaW5rc01hcCwgcmVuYW1lTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgb2xkUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gb2xkUGF0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgYXR0YWNobWVudE9sZFBhdGgpKS5kYXRhO1xuICAgICAgaW5pdEJhY2tsaW5rc01hcChhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCwgcmVuYW1lTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgYXR0YWNobWVudE9sZFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEZvbGRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgW29sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aF0gb2YgcmVuYW1lTWFwLmVudHJpZXMoKSkge1xuICAgICAgaWYgKG9sZEF0dGFjaG1lbnRQYXRoID09PSBvbGRQYXRoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZml4ZWROZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHJlbmFtZUhhbmRsZWQoYXBwLCBvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgcmVuYW1lTWFwLnNldChvbGRBdHRhY2htZW50UGF0aCwgZml4ZWROZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICBwYXJlbnRGb2xkZXJzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICAgIGlmIChzZXR0aW5ncy5zaG91bGREZWxldGVFbXB0eUZvbGRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcGFyZW50Rm9sZGVyIG9mIHBhcmVudEZvbGRlcnMpIHtcbiAgICAgICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHkoYXBwLCBwYXJlbnRGb2xkZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoXG4gICAgICBjb25zdCBbbmV3QmFja2xpbmtQYXRoLCBsaW5rSnNvblRvUGF0aE1hcF0gb2YgQXJyYXkuZnJvbShjb21iaW5lZEJhY2tsaW5rc01hcC5lbnRyaWVzKCkpLmNvbmNhdChcbiAgICAgICAgQXJyYXkuZnJvbShpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPy5lbnRyaWVzKCkgPz8gW10pXG4gICAgICApXG4gICAgKSB7XG4gICAgICBhd2FpdCBlZGl0TGlua3MoYXBwLCBuZXdCYWNrbGlua1BhdGgsIChsaW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRQYXRoID0gbGlua0pzb25Ub1BhdGhNYXAuZ2V0KHRvSnNvbihsaW5rKSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudFBhdGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IHJlbmFtZU1hcC5nZXQob2xkQXR0YWNobWVudFBhdGgpO1xuICAgICAgICBpZiAoIW5ld0F0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtPcHRpb25zPih7XG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIGxpbmssXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgIG9sZFRhcmdldFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlc1xuICAgICAgICB9KSk7XG4gICAgICB9LCB7XG4gICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzTm90ZUV4KGFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGF3YWl0IHVwZGF0ZUxpbmtzSW5GaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnM+KHtcbiAgICAgICAgYXBwLFxuICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBuZXdQYXRoLFxuICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiBvbGRQYXRoLFxuICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlc1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmICghZ2V0RmlsZU9yTnVsbChhcHAsIG5ld1BhdGgpKSB7XG4gICAgICBsZXQgaW50ZXJydXB0ZWRSZW5hbWVzID0gaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmdldChuZXdQYXRoKTtcbiAgICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lcyA9IFtdO1xuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuc2V0KG5ld1BhdGgsIGludGVycnVwdGVkUmVuYW1lcyk7XG4gICAgICB9XG4gICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMucHVzaCh7XG4gICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICBvbGRQYXRoXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgY29uc3Qgb3JwaGFuS2V5cyA9IEFycmF5LmZyb20oaGFuZGxlZFJlbmFtZXMpO1xuICAgIGFkZFRvUXVldWUoYXBwLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBvcnBoYW5LZXlzKSB7XG4gICAgICAgIGhhbmRsZWRSZW5hbWVzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJlbmFtZUlmRW5hYmxlZChwbHVnaW46IFBsdWdpbiwgZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghc2hvdWxkSW52b2tlSGFuZGxlcihwbHVnaW4pKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghaXNGaWxlKGZpbGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG5ld1BhdGggPSBmaWxlLnBhdGg7XG4gIGhhbmRsZVJlbmFtZShwbHVnaW4uYXBwLCBvbGRQYXRoLCBuZXdQYXRoKTtcbn1cblxuZnVuY3Rpb24gaW5pdEJhY2tsaW5rc01hcChcbiAgc2luZ2xlQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIHJlbmFtZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+LFxuICBwYXRoOiBzdHJpbmdcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIGxpbmtzXSBvZiBzaW5nbGVCYWNrbGlua3NNYXAuZW50cmllcygpKSB7XG4gICAgY29uc3QgbmV3QmFja2xpbmtQYXRoID0gcmVuYW1lTWFwLmdldChiYWNrbGlua1BhdGgpID8/IGJhY2tsaW5rUGF0aDtcbiAgICBjb25zdCBsaW5rSnNvblRvUGF0aE1hcCA9IGNvbWJpbmVkQmFja2xpbmtzTWFwLmdldChuZXdCYWNrbGlua1BhdGgpID8/IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29tYmluZWRCYWNrbGlua3NNYXAuc2V0KG5ld0JhY2tsaW5rUGF0aCwgbGlua0pzb25Ub1BhdGhNYXApO1xuICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgbGlua0pzb25Ub1BhdGhNYXAuc2V0KHRvSnNvbihsaW5rKSwgcGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm90ZUV4KGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxvZ1JlZ2lzdGVyZWRIYW5kbGVycyhhcHA6IEFwcCk6IHZvaWQge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmxvZ1JlZ2lzdGVyZWRIYW5kbGVycycpKFxuICAgIGBQbHVnaW5zIHdpdGggcmVnaXN0ZXJlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXJzOiAke0pTT04uc3RyaW5naWZ5KEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpKSl9YFxuICApO1xufVxuXG5mdW5jdGlvbiBtYWtlS2V5KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoTGlua3MoXG4gIGFwcDogQXBwLFxuICBvbGRQYXRoOiBzdHJpbmcsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LFxuICBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShuZXdQYXRoKTtcbiAgY29uc3Qgb2xkUGF0aExpbmtzUmVmcmVzaGVkID0gY2FjaGUgPyBnZXRBbGxMaW5rcyhjYWNoZSkgOiBbXTtcbiAgY29uc3QgZmFrZU9sZEZpbGUgPSBnZXRGaWxlKGFwcCwgb2xkUGF0aCwgdHJ1ZSk7XG4gIGxldCBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gbmV3IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPigpO1xuICBhd2FpdCB0ZW1wUmVnaXN0ZXJGaWxlQW5kUnVuKGFwcCwgZmFrZU9sZEZpbGUsIGFzeW5jICgpID0+IHtcbiAgICBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgZmFrZU9sZEZpbGUpKS5kYXRhO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2Ygb2xkUGF0aExpbmtzUmVmcmVzaGVkKSB7XG4gICAgaWYgKG9sZFBhdGhMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG9sZFBhdGhMaW5rcy5wdXNoKGxpbmspO1xuICB9XG5cbiAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCByZWZyZXNoZWRMaW5rc10gb2Ygb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZC5lbnRyaWVzKCkpIHtcbiAgICBsZXQgb2xkTGlua3MgPSBvbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgIG9sZExpbmtzID0gW107XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbmFtZUhhbmRsZWQoYXBwOiBBcHAsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbmV3UGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gIGlmIChvbGRQYXRoID09PSBuZXdQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbiAgY29uc3Qga2V5ID0gbWFrZUtleShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgaGFuZGxlZFJlbmFtZXMuYWRkKGtleSk7XG4gIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gIHJldHVybiBuZXdQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Bc3luY0xpbmtVcGRhdGUoYXBwOiBBcHAsIG5leHQ6IFJ1bkFzeW5jTGlua1VwZGF0ZUZuLCBsaW5rVXBkYXRlc0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXh0LmNhbGwoYXBwLmZpbGVNYW5hZ2VyLCB3cmFwcGVkSGFuZGxlcik7XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JhcHBlZEhhbmRsZXIobGlua1VwZGF0ZXM6IExpbmtVcGRhdGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpc1JlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV2ZW50UmVmID0gYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoKSA9PiB7XG4gICAgICBpc1JlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgIGlmIChpc1JlbmFtZUNhbGxlZCkge1xuICAgICAgbGlua1VwZGF0ZXMuc3BsaWNlKDApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbjogUGx1Z2luKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFwcCA9IHBsdWdpbi5hcHA7XG4gIGNvbnN0IHBsdWdpbklkID0gcGx1Z2luLm1hbmlmZXN0LmlkO1xuXG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHApO1xuICBjb25zdCBtYWluUGx1Z2luSWQgPSBBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMua2V5cygpKVswXTtcbiAgaWYgKG1haW5QbHVnaW5JZCAhPT0gcGx1Z2luSWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7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
479
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBQbHVnaW4sXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncyc7XG5cbmltcG9ydCB7IFZhdWx0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIFVwZGF0ZUxpbmtPcHRpb25zLFxuICBVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnNcbn0gZnJvbSAnLi9MaW5rLnRzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9EZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi9PYmplY3QudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIG1ha2VGaWxlTmFtZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyByZXBsYWNlQWxsIH0gZnJvbSAnLi4vU3RyaW5nLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4vQXBwLnRzJztcbmltcG9ydCB7XG4gIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICBoYXNPd25BdHRhY2htZW50Rm9sZGVyXG59IGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGVkaXRMaW5rcyxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuL0xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICB0ZW1wUmVnaXN0ZXJGaWxlQW5kUnVuXG59IGZyb20gJy4vTWV0YWRhdGFDYWNoZS50cyc7XG5pbXBvcnQgeyByZWdpc3RlclBhdGNoIH0gZnJvbSAnLi9Nb25rZXlBcm91bmQudHMnO1xuaW1wb3J0IHsgYWRkVG9RdWV1ZSB9IGZyb20gJy4vUXVldWUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIHJlbmFtZVNhZmVcbn0gZnJvbSAnLi9WYXVsdC50cyc7XG5pbXBvcnQge1xuICBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeSxcbiAgZGVsZXRlU2FmZVxufSBmcm9tICcuL1ZhdWx0RXgudHMnO1xuXG5jb25zdCBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcbmNvbnN0IGhhbmRsZWRSZW5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5jb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuLyoqXG4gKiBUaGUgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGF0dGFjaG1lbnQgZm9sZGVycy5cbiAqL1xuZXhwb3J0IGVudW0gRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3Ige1xuICAvKipcbiAgICogRGVsZXRlIHRoZSBlbXB0eSBhdHRhY2htZW50IGZvbGRlci5cbiAgICovXG4gIERlbGV0ZSA9ICdEZWxldGUnLFxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGVtcHR5IGF0dGFjaG1lbnQgZm9sZGVyIGFuZCBhbGwgaXRzIGVtcHR5IHBhcmVudHMuXG4gICAqL1xuICBEZWxldGVXaXRoRW1wdHlQYXJlbnRzID0gJ0RlbGV0ZVdpdGhFbXB0eVBhcmVudHMnLFxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBlbXB0eSBhdHRhY2htZW50IGZvbGRlci5cbiAgICovXG4gIEtlZXAgPSAnS2VlcCdcbn1cblxuLyoqXG4gKiBTZXR0aW5ncyBmb3IgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBhdHRhY2htZW50IGZvbGRlcnMuXG4gICAqL1xuICBlbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvcjogRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBhdGggaXMgYSBub3RlLlxuICAgKi9cbiAgaXNOb3RlKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaWdub3JlIHRoZSBwYXRoLlxuICAgKi9cbiAgaXNQYXRoSWdub3JlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGVuYW1lIGFsaWFzZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEludGVycnVwdGVkUmVuYW1lIHtcbiAgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbnR5cGUgUnVuQXN5bmNMaW5rVXBkYXRlRm4gPSBGaWxlTWFuYWdlclsncnVuQXN5bmNMaW5rVXBkYXRlJ107XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIGluc3RhbmNlLlxuICogQHBhcmFtIHNldHRpbmdzQnVpbGRlciAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzZXR0aW5ncyBmb3IgdGhlIHJlbmFtZSBkZWxldGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUmVuYW1lRGVsZXRlSGFuZGxlcnMocGx1Z2luOiBQbHVnaW4sIHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KTogdm9pZCB7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAocGx1Z2luLmFwcCk7XG4gIGNvbnN0IHBsdWdpbklkID0gcGx1Z2luLm1hbmlmZXN0LmlkO1xuXG4gIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnNldChwbHVnaW5JZCwgc2V0dGluZ3NCdWlsZGVyKTtcbiAgbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKHBsdWdpbi5hcHApO1xuXG4gIHBsdWdpbi5yZWdpc3RlcigoKSA9PiB7XG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuZGVsZXRlKHBsdWdpbklkKTtcbiAgICBsb2dSZWdpc3RlcmVkSGFuZGxlcnMocGx1Z2luLmFwcCk7XG4gIH0pO1xuXG4gIGNvbnN0IGFwcCA9IHBsdWdpbi5hcHA7XG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC52YXVsdC5vbignZGVsZXRlJywgKGZpbGUpID0+IHtcbiAgICAgIGhhbmRsZURlbGV0ZUlmRW5hYmxlZChwbHVnaW4sIGZpbGUpO1xuICAgIH0pXG4gICk7XG5cbiAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoXG4gICAgYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCkgPT4ge1xuICAgICAgaGFuZGxlUmVuYW1lSWZFbmFibGVkKHBsdWdpbiwgZmlsZSwgb2xkUGF0aCk7XG4gICAgfSlcbiAgKTtcblxuICBwbHVnaW4ucmVnaXN0ZXJFdmVudChcbiAgICBhcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIChmaWxlLCBwcmV2Q2FjaGUpID0+IHtcbiAgICAgIGhhbmRsZU1ldGFkYXRhRGVsZXRlZElmRW5hYmxlZChwbHVnaW4sIGZpbGUsIHByZXZDYWNoZSk7XG4gICAgfSlcbiAgKTtcblxuICByZWdpc3RlclBhdGNoKHBsdWdpbiwgYXBwLmZpbGVNYW5hZ2VyLCB7XG4gICAgcnVuQXN5bmNMaW5rVXBkYXRlOiAobmV4dDogUnVuQXN5bmNMaW5rVXBkYXRlRm4pOiBSdW5Bc3luY0xpbmtVcGRhdGVGbiA9PiB7XG4gICAgICByZXR1cm4gKGxpbmtVcGRhdGVzSGFuZGxlcikgPT4gcnVuQXN5bmNMaW5rVXBkYXRlKGFwcCwgbmV4dCwgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwUGFyZW50Rm9sZGVycyhhcHA6IEFwcCwgcGFyZW50Rm9sZGVyUGF0aHM6IHN0cmluZ1tdLCBub3RlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcbiAgaWYgKHNldHRpbmdzLmVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yID09PSBFbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvci5LZWVwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoY29uc3QgcGFyZW50Rm9sZGVyUGF0aCBvZiBwYXJlbnRGb2xkZXJQYXRocykge1xuICAgIHN3aXRjaCAoc2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IpIHtcbiAgICAgIGNhc2UgRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IuRGVsZXRlOlxuICAgICAgICBhd2FpdCBkZWxldGVTYWZlKGFwcCwgcGFyZW50Rm9sZGVyUGF0aCwgbm90ZVBhdGgsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvci5EZWxldGVXaXRoRW1wdHlQYXJlbnRzOlxuICAgICAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeShhcHAsIHBhcmVudEZvbGRlclBhdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcyhcbiAgYXBwOiBBcHAsXG4gIG9sZFBhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuICBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KG9sZFBhdGgpO1xuICBpZiAoaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmRlbGV0ZShvbGRQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGludGVycnVwdGVkUmVuYW1lIG9mIGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgYXdhaXQgaGFuZGxlUmVuYW1lQXN5bmMoYXBwLCBpbnRlcnJ1cHRlZFJlbmFtZS5vbGRQYXRoLCBuZXdQYXRoLCBvbGRQYXRoQmFja2xpbmtzTWFwLCBvbGRQYXRoTGlua3MsIGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmlsbFJlbmFtZU1hcChhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcsIHJlbmFtZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPiwgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZW5hbWVNYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuXG4gIGlmICghaXNOb3RlRXgoYXBwLCBvbGRQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcblxuICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgb2xkUGF0aCk7XG4gIGNvbnN0IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlclxuICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBuZXdQYXRoKVxuICAgIDogb2xkQXR0YWNobWVudEZvbGRlclBhdGg7XG5cbiAgY29uc3QgaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID0gb2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09ICcvJztcblxuICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKGFwcCwgb2xkQXR0YWNobWVudEZvbGRlclBhdGgpO1xuXG4gIGlmICghb2xkQXR0YWNobWVudEZvbGRlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gbmV3QXR0YWNobWVudEZvbGRlclBhdGggJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gIGlmIChhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKGFwcCwgb2xkUGF0aCkpIHtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4ob2xkQXR0YWNobWVudEZvbGRlciwgKG9sZEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKG9sZEF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiBvbGRQYXRoTGlua3MpIHtcbiAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKGFwcCwgb2xkUGF0aExpbmssIG9sZFBhdGgpO1xuICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCB8fCBvbGRBdHRhY2htZW50RmlsZS5wYXRoLnN0YXJ0c1dpdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShhcHAsIG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG9sZEJhc2VuYW1lID0gYmFzZW5hbWUob2xkUGF0aCwgZXh0bmFtZShvbGRQYXRoKSk7XG4gIGNvbnN0IG5ld0Jhc2VuYW1lID0gYmFzZW5hbWUobmV3UGF0aCwgZXh0bmFtZShuZXdQYXRoKSk7XG5cbiAgZm9yIChjb25zdCBvbGRBdHRhY2htZW50RmlsZSBvZiBvbGRBdHRhY2htZW50RmlsZXMpIHtcbiAgICBpZiAoaXNOb3RlRXgoYXBwLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA/IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggOiByZWxhdGl2ZShvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCwgb2xkQXR0YWNobWVudEZpbGUucGF0aCk7XG4gICAgY29uc3QgbmV3Rm9sZGVyID0gam9pbihuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCwgZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICBjb25zdCBuZXdDaGlsZEJhc2VuYW1lID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzXG4gICAgICA/IHJlcGxhY2VBbGwob2xkQXR0YWNobWVudEZpbGUuYmFzZW5hbWUsIG9sZEJhc2VuYW1lLCBuZXdCYXNlbmFtZSlcbiAgICAgIDogb2xkQXR0YWNobWVudEZpbGUuYmFzZW5hbWU7XG4gICAgbGV0IG5ld0NoaWxkUGF0aCA9IGpvaW4obmV3Rm9sZGVyLCBtYWtlRmlsZU5hbWUobmV3Q2hpbGRCYXNlbmFtZSwgb2xkQXR0YWNobWVudEZpbGUuZXh0ZW5zaW9uKSk7XG5cbiAgICBpZiAob2xkQXR0YWNobWVudEZpbGUucGF0aCA9PT0gbmV3Q2hpbGRQYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgY29uc3QgbmV3Q2hpbGRGaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIG5ld0NoaWxkUGF0aCk7XG4gICAgICBpZiAobmV3Q2hpbGRGaWxlKSB7XG4gICAgICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci50cmFzaEZpbGUobmV3Q2hpbGRGaWxlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmV3Q2hpbGRQYXRoID0gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihuZXdGb2xkZXIsIG5ld0NoaWxkQmFzZW5hbWUpLCBvbGRBdHRhY2htZW50RmlsZS5leHRlbnNpb24pO1xuICAgIH1cbiAgICByZW5hbWVNYXAuc2V0KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsIG5ld0NoaWxkUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAoYXBwOiBBcHApOiBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShhcHAsICdyZW5hbWVEZWxldGVIYW5kbGVyc01hcCcsIG5ldyBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+KCkpLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBnZXRTZXR0aW5ncyhhcHA6IEFwcCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAoYXBwKTtcbiAgY29uc3Qgc2V0dGluZ3NCdWlsZGVycyA9IEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAudmFsdWVzKCkpLnJldmVyc2UoKTtcblxuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+ID0ge307XG4gIHNldHRpbmdzLmlzTm90ZSA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzTm90ZShhcHAsIHBhdGgpO1xuICBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkID0gKCk6IGJvb2xlYW4gPT4gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBzZXR0aW5nc0J1aWxkZXIgb2Ygc2V0dGluZ3NCdWlsZGVycykge1xuICAgIGNvbnN0IG5ld1NldHRpbmdzID0gc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyA/PyBmYWxzZTtcbiAgICBpZiAobmV3U2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IpIHtcbiAgICAgIHNldHRpbmdzLmVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yID8/PSBuZXdTZXR0aW5ncy5lbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvcjtcbiAgICB9XG4gICAgc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgPz8gZmFsc2U7XG4gICAgc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyID8/IGZhbHNlO1xuICAgIHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzID8/IGZhbHNlO1xuICAgIGNvbnN0IGlzUGF0aElnbm9yZWQgPSBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkO1xuICAgIHNldHRpbmdzLmlzUGF0aElnbm9yZWQgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBpc1BhdGhJZ25vcmVkKHBhdGgpIHx8IChuZXdTZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkgPz8gZmFsc2UpO1xuICAgIGNvbnN0IGN1cnJlbnRJc05vdGUgPSBzZXR0aW5ncy5pc05vdGU7XG4gICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gY3VycmVudElzTm90ZShwYXRoKSAmJiAobmV3U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gdHJ1ZSk7XG4gIH1cblxuICBzZXR0aW5ncy5lbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvciA/Pz0gRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IuS2VlcDtcbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVDYXNlQ29sbGlzaW9uKFxuICBhcHA6IEFwcCxcbiAgb2xkUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4gIG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghYXBwLnZhdWx0LmFkYXB0ZXIuaW5zZW5zaXRpdmUgfHwgb2xkUGF0aC50b0xvd2VyQ2FzZSgpICE9PSBuZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB0ZW1wUGF0aCA9IGpvaW4oZGlybmFtZShuZXdQYXRoKSwgYF9fdGVtcF9fJHtiYXNlbmFtZShuZXdQYXRoKX1gKTtcbiAgYXdhaXQgcmVuYW1lSGFuZGxlZChhcHAsIG5ld1BhdGgsIHRlbXBQYXRoKTtcbiAgYXdhaXQgaGFuZGxlUmVuYW1lQXN5bmMoYXBwLCBvbGRQYXRoLCB0ZW1wUGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzKTtcbiAgYXdhaXQgYXBwLnZhdWx0LnJlbmFtZShnZXRGaWxlKGFwcCwgdGVtcFBhdGgpLCBuZXdQYXRoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZURlbGV0ZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7cGF0aH1gKTtcbiAgaWYgKCFpc05vdGVFeChhcHAsIHBhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmdldChwYXRoKTtcbiAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKHBhdGgpO1xuICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBpZiAoY2FjaGUpIHtcbiAgICBjb25zdCBsaW5rcyA9IGdldEFsbExpbmtzKGNhY2hlKTtcblxuICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoYXBwLCBsaW5rLCBwYXRoKTtcbiAgICAgIGlmICghYXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05vdGVFeChhcHAsIGF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoYXR0YWNobWVudEZpbGUucGFyZW50Py5wYXRoID8/ICcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBhdHRhY2htZW50RmlsZSwgcGF0aCwgc2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yLktlZXApO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGNsZWFudXBQYXJlbnRGb2xkZXJzKGFwcCwgQXJyYXkuZnJvbShwYXJlbnRGb2xkZXJQYXRocyksIHBhdGgpO1xuXG4gIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBwYXRoKTtcbiAgY29uc3QgYXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIGF0dGFjaG1lbnRGb2xkZXJQYXRoKTtcblxuICBpZiAoIWF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIShhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKGFwcCwgcGF0aCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZGVsZXRlU2FmZShhcHAsIGF0dGFjaG1lbnRGb2xkZXIsIHBhdGgsIGZhbHNlLCBzZXR0aW5ncy5lbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IuS2VlcCk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZURlbGV0ZUlmRW5hYmxlZChwbHVnaW46IFBsdWdpbiwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICBjb25zdCBhcHAgPSBwbHVnaW4uYXBwO1xuICBpZiAoIXNob3VsZEludm9rZUhhbmRsZXIocGx1Z2luKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwYXRoID0gZmlsZS5wYXRoO1xuICBhZGRUb1F1ZXVlKGFwcCwgKCkgPT4gaGFuZGxlRGVsZXRlKGFwcCwgcGF0aCkpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVNZXRhZGF0YURlbGV0ZWQoYXBwOiBBcHAsIGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcbiAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihmaWxlLnBhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzTWFya2Rvd25GaWxlKGFwcCwgZmlsZSkgJiYgcHJldkNhY2hlKSB7XG4gICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuc2V0KGZpbGUucGF0aCwgcHJldkNhY2hlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVNZXRhZGF0YURlbGV0ZWRJZkVuYWJsZWQocGx1Z2luOiBQbHVnaW4sIGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gIGlmICghc2hvdWxkSW52b2tlSGFuZGxlcihwbHVnaW4pKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChwbHVnaW4uYXBwLCBmaWxlLCBwcmV2Q2FjaGUpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVSZW5hbWUoYXBwOiBBcHAsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGtleSA9IG1ha2VLZXkob2xkUGF0aCwgbmV3UGF0aCk7XG4gIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBIYW5kbGUgUmVuYW1lICR7a2V5fWApO1xuICBpZiAoaGFuZGxlZFJlbmFtZXMuaGFzKGtleSkpIHtcbiAgICBoYW5kbGVkUmVuYW1lcy5kZWxldGUoa2V5KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG4gIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fCBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ob2xkUGF0aCkgfHwgc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShuZXdQYXRoKTtcbiAgY29uc3Qgb2xkUGF0aExpbmtzID0gY2FjaGUgPyBnZXRBbGxMaW5rcyhjYWNoZSkgOiBbXTtcbiAgY29uc3Qgb2xkUGF0aEJhY2tsaW5rc01hcCA9IGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwLCBvbGRQYXRoKS5kYXRhO1xuICBhZGRUb1F1ZXVlKGFwcCwgKCkgPT4gaGFuZGxlUmVuYW1lQXN5bmMoYXBwLCBvbGRQYXRoLCBuZXdQYXRoLCBvbGRQYXRoQmFja2xpbmtzTWFwLCBvbGRQYXRoTGlua3MpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVuYW1lQXN5bmMoXG4gIGFwcDogQXBwLFxuICBvbGRQYXRoOiBzdHJpbmcsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LFxuICBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdLFxuICBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcyhhcHAsIG9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcyk7XG4gIGF3YWl0IHJlZnJlc2hMaW5rcyhhcHAsIG9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcyk7XG4gIGlmIChhd2FpdCBoYW5kbGVDYXNlQ29sbGlzaW9uKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVuYW1lTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBhd2FpdCBmaWxsUmVuYW1lTWFwKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgcmVuYW1lTWFwLCBvbGRQYXRoTGlua3MpO1xuXG4gICAgY29uc3QgY29tYmluZWRCYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgICBpbml0QmFja2xpbmtzTWFwKG9sZFBhdGhCYWNrbGlua3NNYXAsIHJlbmFtZU1hcCwgY29tYmluZWRCYWNrbGlua3NNYXAsIG9sZFBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBhdHRhY2htZW50T2xkUGF0aCBvZiByZW5hbWVNYXAua2V5cygpKSB7XG4gICAgICBpZiAoYXR0YWNobWVudE9sZFBhdGggPT09IG9sZFBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCA9IChhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShhcHAsIGF0dGFjaG1lbnRPbGRQYXRoKSkuZGF0YTtcbiAgICAgIGluaXRCYWNrbGlua3NNYXAoYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXAsIHJlbmFtZU1hcCwgY29tYmluZWRCYWNrbGlua3NNYXAsIGF0dGFjaG1lbnRPbGRQYXRoKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBbb2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoXSBvZiByZW5hbWVNYXAuZW50cmllcygpKSB7XG4gICAgICBpZiAob2xkQXR0YWNobWVudFBhdGggPT09IG9sZFBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgcmVuYW1lSGFuZGxlZChhcHAsIG9sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICByZW5hbWVNYXAuc2V0KG9sZEF0dGFjaG1lbnRQYXRoLCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgfVxuXG4gICAgYXdhaXQgY2xlYW51cFBhcmVudEZvbGRlcnMoYXBwLCBBcnJheS5mcm9tKHBhcmVudEZvbGRlclBhdGhzKSwgb2xkUGF0aCk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuXG4gICAgZm9yIChcbiAgICAgIGNvbnN0IFtuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwXSBvZiBBcnJheS5mcm9tKGNvbWJpbmVkQmFja2xpbmtzTWFwLmVudHJpZXMoKSkuY29uY2F0KFxuICAgICAgICBBcnJheS5mcm9tKGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA/LmVudHJpZXMoKSA/PyBbXSlcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGF3YWl0IGVkaXRMaW5rcyhhcHAsIG5ld0JhY2tsaW5rUGF0aCwgKGxpbmspID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudFBhdGggPSBsaW5rSnNvblRvUGF0aE1hcC5nZXQodG9Kc29uKGxpbmspKTtcbiAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gcmVuYW1lTWFwLmdldChvbGRBdHRhY2htZW50UGF0aCk7XG4gICAgICAgIGlmICghbmV3QXR0YWNobWVudFBhdGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua09wdGlvbnM+KHtcbiAgICAgICAgICBhcHAsXG4gICAgICAgICAgbGluayxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogbmV3QXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgb2xkVGFyZ2V0UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzXG4gICAgICAgIH0pKTtcbiAgICAgIH0sIHtcbiAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNOb3RlRXgoYXBwLCBuZXdQYXRoKSkge1xuICAgICAgYXdhaXQgdXBkYXRlTGlua3NJbkZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtzSW5GaWxlT3B0aW9ucz4oe1xuICAgICAgICBhcHAsXG4gICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld1BhdGgsXG4gICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IG9sZFBhdGgsXG4gICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgaWYgKCFnZXRGaWxlT3JOdWxsKGFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGxldCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KG5ld1BhdGgpO1xuICAgICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcC5zZXQobmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgIH1cbiAgICAgIGludGVycnVwdGVkUmVuYW1lcy5wdXNoKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIG9sZFBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjb25zdCBvcnBoYW5LZXlzID0gQXJyYXkuZnJvbShoYW5kbGVkUmVuYW1lcyk7XG4gICAgYWRkVG9RdWV1ZShhcHAsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgaGFuZGxlZFJlbmFtZXMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlUmVuYW1lSWZFbmFibGVkKHBsdWdpbjogUGx1Z2luLCBmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmV3UGF0aCA9IGZpbGUucGF0aDtcbiAgaGFuZGxlUmVuYW1lKHBsdWdpbi5hcHAsIG9sZFBhdGgsIG5ld1BhdGgpO1xufVxuXG5mdW5jdGlvbiBpbml0QmFja2xpbmtzTWFwKFxuICBzaW5nbGVCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgcmVuYW1lTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4sXG4gIHBhdGg6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2JhY2tsaW5rUGF0aCwgbGlua3NdIG9mIHNpbmdsZUJhY2tsaW5rc01hcC5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBuZXdCYWNrbGlua1BhdGggPSByZW5hbWVNYXAuZ2V0KGJhY2tsaW5rUGF0aCkgPz8gYmFja2xpbmtQYXRoO1xuICAgIGNvbnN0IGxpbmtKc29uVG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBjb21iaW5lZEJhY2tsaW5rc01hcC5zZXQobmV3QmFja2xpbmtQYXRoLCBsaW5rSnNvblRvUGF0aE1hcCk7XG4gICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICBsaW5rSnNvblRvUGF0aE1hcC5zZXQodG9Kc29uKGxpbmspLCBwYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb3RlRXgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG4gIHJldHVybiBzZXR0aW5ncy5pc05vdGU/LihwYXRoKSA/PyBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKGFwcDogQXBwKTogdm9pZCB7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAoYXBwKTtcbiAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6bG9nUmVnaXN0ZXJlZEhhbmRsZXJzJykoXG4gICAgYFBsdWdpbnMgd2l0aCByZWdpc3RlcmVkIHJlbmFtZS9kZWxldGUgaGFuZGxlcnM6ICR7SlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC5rZXlzKCkpKX1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIG1ha2VLZXkob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hMaW5rcyhcbiAgYXBwOiBBcHAsXG4gIG9sZFBhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuICBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG9sZFBhdGgpID8/IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICBjb25zdCBvbGRQYXRoTGlua3NSZWZyZXNoZWQgPSBjYWNoZSA/IGdldEFsbExpbmtzKGNhY2hlKSA6IFtdO1xuICBjb25zdCBmYWtlT2xkRmlsZSA9IGdldEZpbGUoYXBwLCBvbGRQYXRoLCB0cnVlKTtcbiAgbGV0IG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQgPSBuZXcgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+KCk7XG4gIGF3YWl0IHRlbXBSZWdpc3RlckZpbGVBbmRSdW4oYXBwLCBmYWtlT2xkRmlsZSwgYXN5bmMgKCkgPT4ge1xuICAgIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQgPSAoYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoYXBwLCBmYWtlT2xkRmlsZSkpLmRhdGE7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBvbGRQYXRoTGlua3NSZWZyZXNoZWQpIHtcbiAgICBpZiAob2xkUGF0aExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgb2xkUGF0aExpbmtzLnB1c2gobGluayk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZExpbmtzXSBvZiBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkLmVudHJpZXMoKSkge1xuICAgIGxldCBvbGRMaW5rcyA9IG9sZFBhdGhCYWNrbGlua3NNYXAuZ2V0KGJhY2tsaW5rUGF0aCk7XG4gICAgaWYgKCFvbGRMaW5rcykge1xuICAgICAgb2xkTGlua3MgPSBbXTtcbiAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXAuc2V0KGJhY2tsaW5rUGF0aCwgb2xkTGlua3MpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGluayBvZiByZWZyZXNoZWRMaW5rcykge1xuICAgICAgaWYgKG9sZExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgb2xkTGlua3MucHVzaChsaW5rKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuYW1lSGFuZGxlZChhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBuZXdQYXRoID0gZ2V0U2FmZVJlbmFtZVBhdGgoYXBwLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxuICBjb25zdCBrZXkgPSBtYWtlS2V5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICBoYW5kbGVkUmVuYW1lcy5hZGQoa2V5KTtcbiAgbmV3UGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoYXBwLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgcmV0dXJuIG5ld1BhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkFzeW5jTGlua1VwZGF0ZShhcHA6IEFwcCwgbmV4dDogUnVuQXN5bmNMaW5rVXBkYXRlRm4sIGxpbmtVcGRhdGVzSGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5leHQuY2FsbChhcHAuZmlsZU1hbmFnZXIsIHdyYXBwZWRIYW5kbGVyKTtcblxuICBhc3luYyBmdW5jdGlvbiB3cmFwcGVkSGFuZGxlcihsaW5rVXBkYXRlczogTGlua1VwZGF0ZVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGlzUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgZXZlbnRSZWYgPSBhcHAudmF1bHQub24oJ3JlbmFtZScsICgpID0+IHtcbiAgICAgIGlzUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXBwLnZhdWx0Lm9mZnJlZihldmVudFJlZik7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgaWYgKGlzUmVuYW1lQ2FsbGVkKSB7XG4gICAgICBsaW5rVXBkYXRlcy5zcGxpY2UoMCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEludm9rZUhhbmRsZXIocGx1Z2luOiBQbHVnaW4pOiBib29sZWFuIHtcbiAgY29uc3QgYXBwID0gcGx1Z2luLmFwcDtcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG5cbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlclBsdWdpbklkcyA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGNvbnN0IG1haW5QbHVnaW5JZCA9IEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlclBsdWdpbklkcy5rZXlzKCkpWzBdO1xuICBpZiAobWFpblBsdWdpbklkICE9PSBwbHVnaW5JZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFvQkEsc0JBQXNCO0FBT3RCLG1CQUErQjtBQUMvQixvQkFHTztBQUNQLGtCQU9PO0FBQ1Asb0JBQTJCO0FBQzNCLGlCQUF5QztBQUN6Qyw0QkFHTztBQUNQLHdCQU9PO0FBQ1Asa0JBS087QUFDUCwyQkFLTztB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QUk7QUFDOUMsTUFBSSwrQkFBK0Isb0JBQUksSUFBeUI7QUFDaEUsWUFBTSw2Q0FBdUIsS0FBSyxhQUFhLFlBQVk7QUFDekQsb0NBQWdDLFVBQU0sOENBQXdCLEtBQUssV0FBVyxHQUFHO0FBQUEsRUFDbkYsQ0FBQztBQUVELGFBQVcsUUFBUSx1QkFBdUI7QUFDeEMsUUFBSSxhQUFhLFNBQVMsSUFBSSxHQUFHO0FBQy9CO0FBQUEsSUFDRjtBQUNBLGlCQUFhLEtBQUssSUFBSTtBQUFBLEVBQ3hCO0FBRUEsYUFBVyxDQUFDLGNBQWMsY0FBYyxLQUFLLDZCQUE2QixRQUFRLEdBQUc7QUFDbkYsUUFBSSxXQUFXLG9CQUFvQixJQUFJLFlBQVk7QUFDbkQsUUFBSSxDQUFDLFVBQVU7QUFDYixpQkFBVyxDQUFDO0FBQ1osMEJBQW9CLElBQUksY0FBYyxRQUFRO0FBQUEsSUFDaEQ7QUFFQSxlQUFXLFFBQVEsZ0JBQWdCO0FBQ2pDLFVBQUksU0FBUyxTQUFTLElBQUksR0FBRztBQUMzQjtBQUFBLE1BQ0Y7QUFDQSxlQUFTLEtBQUssSUFBSTtBQUFBLElBQ3BCO0FBQUEsRUFDRjtBQUNGO0FBRUEsZUFBZSxjQUFjLEtBQVUsU0FBaUIsU0FBa0M7QUFDeEYsZ0JBQVUsZ0NBQWtCLEtBQUssU0FBUyxPQUFPO0FBQ2pELE1BQUksWUFBWSxTQUFTO0FBQ3ZCLFdBQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxNQUFNLFFBQVEsU0FBUyxPQUFPO0FBQ3BDLGlCQUFlLElBQUksR0FBRztBQUN0QixZQUFVLFVBQU0seUJBQVcsS0FBSyxTQUFTLE9BQU87QUFDaEQsU0FBTztBQUNUO0FBRUEsZUFBZSxtQkFBbUIsS0FBVSxNQUE0QixvQkFBdUQ7QUFDN0gsUUFBTSxLQUFLLEtBQUssSUFBSSxhQUFhLGNBQWM7QUFFL0MsaUJBQWUsZUFBZSxhQUEwQztBQUN0RSxRQUFJLGlCQUFpQjtBQUNyQixVQUFNLFdBQVcsSUFBSSxNQUFNLEdBQUcsVUFBVSxNQUFNO0FBQzVDLHVCQUFpQjtBQUFBLElBQ25CLENBQUM7QUFDRCxRQUFJO0FBQ0YsWUFBTSxtQkFBbUIsV0FBVztBQUFBLElBQ3RDLFVBQUU7QUFDQSxVQUFJLE1BQU0sT0FBTyxRQUFRO0FBQUEsSUFDM0I7QUFFQSxRQUFJLGdCQUFnQjtBQUNsQixrQkFBWSxPQUFPLENBQUM7QUFBQSxJQUN0QjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsb0JBQW9CLFFBQXlCO0FBQ3BELFFBQU0sTUFBTSxPQUFPO0FBQ25CLFFBQU0sV0FBVyxPQUFPLFNBQVM7QUFFakMsUUFBTSwrQkFBK0IsMkJBQTJCLEdBQUc7QUFDbkUsUUFBTSxlQUFlLE1BQU0sS0FBSyw2QkFBNkIsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUN0RSxNQUFJLGlCQUFpQixVQUFVO0FBQzdCLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJFbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvciJdCn0K
@@ -4,10 +4,31 @@
4
4
  * Contains utility functions for handling rename and delete events in Obsidian.
5
5
  */
6
6
  import type { Plugin } from 'obsidian';
7
+ /**
8
+ * The behavior of the rename/delete handler when deleting empty attachment folders.
9
+ */
10
+ export declare enum EmptyAttachmentFolderBehavior {
11
+ /**
12
+ * Delete the empty attachment folder.
13
+ */
14
+ Delete = "Delete",
15
+ /**
16
+ * Delete the empty attachment folder and all its empty parents.
17
+ */
18
+ DeleteWithEmptyParents = "DeleteWithEmptyParents",
19
+ /**
20
+ * Keep the empty attachment folder.
21
+ */
22
+ Keep = "Keep"
23
+ }
7
24
  /**
8
25
  * Settings for the rename/delete handler.
9
26
  */
10
27
  export interface RenameDeleteHandlerSettings {
28
+ /**
29
+ * The behavior of the rename/delete handler when deleting empty attachment folders.
30
+ */
31
+ emptyAttachmentFolderBehavior: EmptyAttachmentFolderBehavior;
11
32
  /**
12
33
  * Whether the path is a note.
13
34
  */
@@ -20,10 +41,6 @@ export interface RenameDeleteHandlerSettings {
20
41
  * Whether to delete conflicting attachments.
21
42
  */
22
43
  shouldDeleteConflictingAttachments: boolean;
23
- /**
24
- * Whether to delete empty folders.
25
- */
26
- shouldDeleteEmptyFolders: boolean;
27
44
  /**
28
45
  * Whether to handle deletions.
29
46
  */
@@ -5,7 +5,7 @@ if you want to view the source, please visit the github repository of this plugi
5
5
 
6
6
  (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
7
7
 
8
- const LIBRARY_VERSION = "26.20.0";
8
+ const LIBRARY_VERSION = "26.22.0";
9
9
  const LIBRARY_NAME = "obsidian-dev-utils";
10
10
  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.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 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-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.prompt-modal .text-box {\n width: 100%;\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid, .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid, .obsidian-dev-utils input.metadata-input-text:focus:invalid,\n.obsidian-dev-utils input[type=date]:active:invalid,\n.obsidian-dev-utils input[type=date]:focus-visible:invalid,\n.obsidian-dev-utils input[type=date]:focus:invalid,\n.obsidian-dev-utils input[type=datetime-local]:active:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid,\n.obsidian-dev-utils input[type=email]:active:invalid,\n.obsidian-dev-utils input[type=email]:focus-visible:invalid,\n.obsidian-dev-utils input[type=email]:focus:invalid,\n.obsidian-dev-utils input[type=number]:active:invalid,\n.obsidian-dev-utils input[type=number]:focus-visible:invalid,\n.obsidian-dev-utils input[type=number]:focus:invalid,\n.obsidian-dev-utils input[type=password]:active:invalid,\n.obsidian-dev-utils input[type=password]:focus-visible:invalid,\n.obsidian-dev-utils input[type=password]:focus:invalid,\n.obsidian-dev-utils input[type=search]:active:invalid,\n.obsidian-dev-utils input[type=search]:focus-visible:invalid,\n.obsidian-dev-utils input[type=search]:focus:invalid,\n.obsidian-dev-utils input[type=text]:active:invalid,\n.obsidian-dev-utils input[type=text]:focus-visible:invalid,\n.obsidian-dev-utils input[type=text]:focus:invalid,\n.obsidian-dev-utils textarea:active:invalid,\n.obsidian-dev-utils textarea:focus-visible:invalid,\n.obsidian-dev-utils textarea:focus:invalid {\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/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/prompt-modal.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;;AAGF;EACE;EACA;;;ACnCJ;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;;;AChDF;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACRJ;EACE;;;ACDF;EACE;;;ACEJ;EAJA;;AAoBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EApBJ;;AA0BA;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.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.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&.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&.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.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.obsidian-dev-utils%20%7B%5Cn%20%20:invalid%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%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";
11
11
  export {
@@ -4,10 +4,31 @@
4
4
  * Contains utility functions for handling rename and delete events in Obsidian.
5
5
  */
6
6
  import type { Plugin } from 'obsidian';
7
+ /**
8
+ * The behavior of the rename/delete handler when deleting empty attachment folders.
9
+ */
10
+ export declare enum EmptyAttachmentFolderBehavior {
11
+ /**
12
+ * Delete the empty attachment folder.
13
+ */
14
+ Delete = "Delete",
15
+ /**
16
+ * Delete the empty attachment folder and all its empty parents.
17
+ */
18
+ DeleteWithEmptyParents = "DeleteWithEmptyParents",
19
+ /**
20
+ * Keep the empty attachment folder.
21
+ */
22
+ Keep = "Keep"
23
+ }
7
24
  /**
8
25
  * Settings for the rename/delete handler.
9
26
  */
10
27
  export interface RenameDeleteHandlerSettings {
28
+ /**
29
+ * The behavior of the rename/delete handler when deleting empty attachment folders.
30
+ */
31
+ emptyAttachmentFolderBehavior: EmptyAttachmentFolderBehavior;
11
32
  /**
12
33
  * Whether the path is a note.
13
34
  */
@@ -20,10 +41,6 @@ export interface RenameDeleteHandlerSettings {
20
41
  * Whether to delete conflicting attachments.
21
42
  */
22
43
  shouldDeleteConflictingAttachments: boolean;
23
- /**
24
- * Whether to delete empty folders.
25
- */
26
- shouldDeleteEmptyFolders: boolean;
27
44
  /**
28
45
  * Whether to handle deletions.
29
46
  */
@@ -58,6 +58,12 @@ import {
58
58
  const deletedMetadataCacheMap = /* @__PURE__ */ new Map();
59
59
  const handledRenames = /* @__PURE__ */ new Set();
60
60
  const interruptedRenamesMap = /* @__PURE__ */ new Map();
61
+ var EmptyAttachmentFolderBehavior = /* @__PURE__ */ ((EmptyAttachmentFolderBehavior2) => {
62
+ EmptyAttachmentFolderBehavior2["Delete"] = "Delete";
63
+ EmptyAttachmentFolderBehavior2["DeleteWithEmptyParents"] = "DeleteWithEmptyParents";
64
+ EmptyAttachmentFolderBehavior2["Keep"] = "Keep";
65
+ return EmptyAttachmentFolderBehavior2;
66
+ })(EmptyAttachmentFolderBehavior || {});
61
67
  function registerRenameDeleteHandlers(plugin, settingsBuilder) {
62
68
  const renameDeleteHandlersMap = getRenameDeleteHandlersMap(plugin.app);
63
69
  const pluginId = plugin.manifest.id;
@@ -89,6 +95,24 @@ function registerRenameDeleteHandlers(plugin, settingsBuilder) {
89
95
  }
90
96
  });
91
97
  }
98
+ async function cleanupParentFolders(app, parentFolderPaths, notePath) {
99
+ const settings = getSettings(app);
100
+ if (settings.emptyAttachmentFolderBehavior === "Keep" /* Keep */) {
101
+ return;
102
+ }
103
+ for (const parentFolderPath of parentFolderPaths) {
104
+ switch (settings.emptyAttachmentFolderBehavior) {
105
+ case "Delete" /* Delete */:
106
+ await deleteSafe(app, parentFolderPath, notePath, void 0, true);
107
+ break;
108
+ case "DeleteWithEmptyParents" /* DeleteWithEmptyParents */:
109
+ await deleteEmptyFolderHierarchy(app, parentFolderPath);
110
+ break;
111
+ default:
112
+ break;
113
+ }
114
+ }
115
+ }
92
116
  async function continueInterruptedRenames(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks) {
93
117
  const interruptedRenames = interruptedRenamesMap.get(oldPath);
94
118
  if (interruptedRenames) {
@@ -166,20 +190,25 @@ function getSettings(app) {
166
190
  const renameDeleteHandlersMap = getRenameDeleteHandlersMap(app);
167
191
  const settingsBuilders = Array.from(renameDeleteHandlersMap.values()).reverse();
168
192
  const settings = {};
193
+ settings.isNote = (path) => isNote(app, path);
194
+ settings.isPathIgnored = () => false;
169
195
  for (const settingsBuilder of settingsBuilders) {
170
196
  const newSettings = settingsBuilder();
171
197
  settings.shouldDeleteConflictingAttachments ||= newSettings.shouldDeleteConflictingAttachments ?? false;
172
- settings.shouldDeleteEmptyFolders ||= newSettings.shouldDeleteEmptyFolders ?? false;
198
+ if (newSettings.emptyAttachmentFolderBehavior) {
199
+ settings.emptyAttachmentFolderBehavior ??= newSettings.emptyAttachmentFolderBehavior;
200
+ }
173
201
  settings.shouldHandleDeletions ||= newSettings.shouldHandleDeletions ?? false;
174
202
  settings.shouldHandleRenames ||= newSettings.shouldHandleRenames ?? false;
175
203
  settings.shouldRenameAttachmentFiles ||= newSettings.shouldRenameAttachmentFiles ?? false;
176
204
  settings.shouldRenameAttachmentFolder ||= newSettings.shouldRenameAttachmentFolder ?? false;
177
205
  settings.shouldUpdateFilenameAliases ||= newSettings.shouldUpdateFilenameAliases ?? false;
178
206
  const isPathIgnored = settings.isPathIgnored;
179
- settings.isPathIgnored = (path) => isPathIgnored?.(path) ?? newSettings.isPathIgnored?.(path) ?? false;
207
+ settings.isPathIgnored = (path) => isPathIgnored(path) || (newSettings.isPathIgnored?.(path) ?? false);
180
208
  const currentIsNote = settings.isNote;
181
- settings.isNote = (path) => currentIsNote?.(path) ?? newSettings.isNote?.(path) ?? isNote(app, path);
209
+ settings.isNote = (path) => currentIsNote(path) && (newSettings.isNote?.(path) ?? true);
182
210
  }
211
+ settings.emptyAttachmentFolderBehavior ??= "Keep" /* Keep */;
183
212
  return settings;
184
213
  }
185
214
  async function handleCaseCollision(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks) {
@@ -206,6 +235,7 @@ async function handleDelete(app, path) {
206
235
  }
207
236
  const cache = deletedMetadataCacheMap.get(path);
208
237
  deletedMetadataCacheMap.delete(path);
238
+ const parentFolderPaths = /* @__PURE__ */ new Set();
209
239
  if (cache) {
210
240
  const links = getAllLinks(cache);
211
241
  for (const link of links) {
@@ -216,9 +246,11 @@ async function handleDelete(app, path) {
216
246
  if (isNoteEx(app, attachmentFile.path)) {
217
247
  continue;
218
248
  }
219
- await deleteSafe(app, attachmentFile, path, settings.shouldDeleteEmptyFolders);
249
+ parentFolderPaths.add(attachmentFile.parent?.path ?? "");
250
+ await deleteSafe(app, attachmentFile, path, settings.emptyAttachmentFolderBehavior !== "Keep" /* Keep */);
220
251
  }
221
252
  }
253
+ await cleanupParentFolders(app, Array.from(parentFolderPaths), path);
222
254
  const attachmentFolderPath = await getAttachmentFolderPath(app, path);
223
255
  const attachmentFolder = getFolderOrNull(app, attachmentFolderPath);
224
256
  if (!attachmentFolder) {
@@ -227,7 +259,7 @@ async function handleDelete(app, path) {
227
259
  if (!await hasOwnAttachmentFolder(app, path)) {
228
260
  return;
229
261
  }
230
- await deleteSafe(app, attachmentFolder, path, false, settings.shouldDeleteEmptyFolders);
262
+ await deleteSafe(app, attachmentFolder, path, false, settings.emptyAttachmentFolderBehavior !== "Keep" /* Keep */);
231
263
  }
232
264
  function handleDeleteIfEnabled(plugin, file) {
233
265
  const app = plugin.app;
@@ -289,21 +321,17 @@ async function handleRenameAsync(app, oldPath, newPath, oldPathBacklinksMap, old
289
321
  const attachmentOldPathBacklinksMap = (await getBacklinksForFileSafe(app, attachmentOldPath)).data;
290
322
  initBacklinksMap(attachmentOldPathBacklinksMap, renameMap, combinedBacklinksMap, attachmentOldPath);
291
323
  }
292
- const parentFolders = /* @__PURE__ */ new Set();
324
+ const parentFolderPaths = /* @__PURE__ */ new Set();
293
325
  for (const [oldAttachmentPath, newAttachmentPath] of renameMap.entries()) {
294
326
  if (oldAttachmentPath === oldPath) {
295
327
  continue;
296
328
  }
297
329
  const fixedNewAttachmentPath = await renameHandled(app, oldAttachmentPath, newAttachmentPath);
298
330
  renameMap.set(oldAttachmentPath, fixedNewAttachmentPath);
299
- parentFolders.add(dirname(oldAttachmentPath));
331
+ parentFolderPaths.add(dirname(oldAttachmentPath));
300
332
  }
333
+ await cleanupParentFolders(app, Array.from(parentFolderPaths), oldPath);
301
334
  const settings = getSettings(app);
302
- if (settings.shouldDeleteEmptyFolders) {
303
- for (const parentFolder of parentFolders) {
304
- await deleteEmptyFolderHierarchy(app, parentFolder);
305
- }
306
- }
307
335
  for (const [newBacklinkPath, linkJsonToPathMap] of Array.from(combinedBacklinksMap.entries()).concat(
308
336
  Array.from(interruptedCombinedBacklinksMap?.entries() ?? [])
309
337
  )) {
@@ -456,6 +484,7 @@ function shouldInvokeHandler(plugin) {
456
484
  return true;
457
485
  }
458
486
  export {
487
+ EmptyAttachmentFolderBehavior,
459
488
  registerRenameDeleteHandlers
460
489
  };
461
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBQbHVnaW4sXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncyc7XG5cbmltcG9ydCB7IFZhdWx0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIFVwZGF0ZUxpbmtPcHRpb25zLFxuICBVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnNcbn0gZnJvbSAnLi9MaW5rLnRzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9EZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi9PYmplY3QudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIG1ha2VGaWxlTmFtZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyByZXBsYWNlQWxsIH0gZnJvbSAnLi4vU3RyaW5nLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4vQXBwLnRzJztcbmltcG9ydCB7XG4gIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICBoYXNPd25BdHRhY2htZW50Rm9sZGVyXG59IGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGVkaXRMaW5rcyxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuL0xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICB0ZW1wUmVnaXN0ZXJGaWxlQW5kUnVuXG59IGZyb20gJy4vTWV0YWRhdGFDYWNoZS50cyc7XG5pbXBvcnQgeyByZWdpc3RlclBhdGNoIH0gZnJvbSAnLi9Nb25rZXlBcm91bmQudHMnO1xuaW1wb3J0IHsgYWRkVG9RdWV1ZSB9IGZyb20gJy4vUXVldWUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIHJlbmFtZVNhZmVcbn0gZnJvbSAnLi9WYXVsdC50cyc7XG5pbXBvcnQge1xuICBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeSxcbiAgZGVsZXRlU2FmZVxufSBmcm9tICcuL1ZhdWx0RXgudHMnO1xuXG5jb25zdCBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcbmNvbnN0IGhhbmRsZWRSZW5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5jb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuLyoqXG4gKiBTZXR0aW5ncyBmb3IgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3Mge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcGF0aCBpcyBhIG5vdGUuXG4gICAqL1xuICBpc05vdGUocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICBpc1BhdGhJZ25vcmVkKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnRzLlxuICAgKi9cbiAgc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50czogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgZW1wdHkgZm9sZGVycy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgZGVsZXRpb25zLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlRGVsZXRpb25zOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSByZW5hbWVzLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlUmVuYW1lczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmaWxlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZvbGRlciB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZW5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxudHlwZSBSdW5Bc3luY0xpbmtVcGRhdGVGbiA9IEZpbGVNYW5hZ2VyWydydW5Bc3luY0xpbmtVcGRhdGUnXTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlcnMuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gc2V0dGluZ3NCdWlsZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHNldHRpbmdzIGZvciB0aGUgcmVuYW1lIGRlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSZW5hbWVEZWxldGVIYW5kbGVycyhwbHVnaW46IFBsdWdpbiwgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4pOiB2b2lkIHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChwbHVnaW4uYXBwKTtcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG5cbiAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuc2V0KHBsdWdpbklkLCBzZXR0aW5nc0J1aWxkZXIpO1xuICBsb2dSZWdpc3RlcmVkSGFuZGxlcnMocGx1Z2luLmFwcCk7XG5cbiAgcGx1Z2luLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5kZWxldGUocGx1Z2luSWQpO1xuICAgIGxvZ1JlZ2lzdGVyZWRIYW5kbGVycyhwbHVnaW4uYXBwKTtcbiAgfSk7XG5cbiAgY29uc3QgYXBwID0gcGx1Z2luLmFwcDtcbiAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoXG4gICAgYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCAoZmlsZSkgPT4ge1xuICAgICAgaGFuZGxlRGVsZXRlSWZFbmFibGVkKHBsdWdpbiwgZmlsZSk7XG4gICAgfSlcbiAgKTtcblxuICBwbHVnaW4ucmVnaXN0ZXJFdmVudChcbiAgICBhcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKSA9PiB7XG4gICAgICBoYW5kbGVSZW5hbWVJZkVuYWJsZWQocGx1Z2luLCBmaWxlLCBvbGRQYXRoKTtcbiAgICB9KVxuICApO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgKGZpbGUsIHByZXZDYWNoZSkgPT4ge1xuICAgICAgaGFuZGxlTWV0YWRhdGFEZWxldGVkSWZFbmFibGVkKHBsdWdpbiwgZmlsZSwgcHJldkNhY2hlKTtcbiAgICB9KVxuICApO1xuXG4gIHJlZ2lzdGVyUGF0Y2gocGx1Z2luLCBhcHAuZmlsZU1hbmFnZXIsIHtcbiAgICBydW5Bc3luY0xpbmtVcGRhdGU6IChuZXh0OiBSdW5Bc3luY0xpbmtVcGRhdGVGbik6IFJ1bkFzeW5jTGlua1VwZGF0ZUZuID0+IHtcbiAgICAgIHJldHVybiAobGlua1VwZGF0ZXNIYW5kbGVyKSA9PiBydW5Bc3luY0xpbmtVcGRhdGUoYXBwLCBuZXh0LCBsaW5rVXBkYXRlc0hhbmRsZXIpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKFxuICBhcHA6IEFwcCxcbiAgb2xkUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4gIG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGludGVycnVwdGVkUmVuYW1lcyA9IGludGVycnVwdGVkUmVuYW1lc01hcC5nZXQob2xkUGF0aCk7XG4gIGlmIChpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZGVsZXRlKG9sZFBhdGgpO1xuICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICBhd2FpdCBoYW5kbGVSZW5hbWVBc3luYyhhcHAsIGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcywgaW50ZXJydXB0ZWRSZW5hbWUuY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaWxsUmVuYW1lTWFwKGFwcDogQXBwLCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZywgcmVuYW1lTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LCBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlbmFtZU1hcC5zZXQob2xkUGF0aCwgbmV3UGF0aCk7XG5cbiAgaWYgKCFpc05vdGVFeChhcHAsIG9sZFBhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuXG4gIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBvbGRQYXRoKTtcbiAgY29uc3QgbmV3QXR0YWNobWVudEZvbGRlclBhdGggPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyXG4gICAgPyBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIG5ld1BhdGgpXG4gICAgOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aDtcblxuICBjb25zdCBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPSBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy8nO1xuXG4gIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCk7XG5cbiAgaWYgKCFvbGRBdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGVzOiBURmlsZVtdID0gW107XG5cbiAgaWYgKGF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoYXBwLCBvbGRQYXRoKSkge1xuICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihvbGRBdHRhY2htZW50Rm9sZGVyLCAob2xkQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAgIGlmIChpc0ZpbGUob2xkQXR0YWNobWVudEZpbGUpKSB7XG4gICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIG9sZFBhdGhMaW5rcykge1xuICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoYXBwLCBvbGRQYXRoTGluaywgb2xkUGF0aCk7XG4gICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290IHx8IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgb2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICBpZiAob2xkQXR0YWNobWVudEJhY2tsaW5rcy5rZXlzKCkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb2xkQmFzZW5hbWUgPSBiYXNlbmFtZShvbGRQYXRoLCBleHRuYW1lKG9sZFBhdGgpKTtcbiAgY29uc3QgbmV3QmFzZW5hbWUgPSBiYXNlbmFtZShuZXdQYXRoLCBleHRuYW1lKG5ld1BhdGgpKTtcblxuICBmb3IgKGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlIG9mIG9sZEF0dGFjaG1lbnRGaWxlcykge1xuICAgIGlmIChpc05vdGVFeChhcHAsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID8gb2xkQXR0YWNobWVudEZpbGUucGF0aCA6IHJlbGF0aXZlKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKTtcbiAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgIGNvbnN0IG5ld0NoaWxkQmFzZW5hbWUgPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXNcbiAgICAgID8gcmVwbGFjZUFsbChvbGRBdHRhY2htZW50RmlsZS5iYXNlbmFtZSwgb2xkQmFzZW5hbWUsIG5ld0Jhc2VuYW1lKVxuICAgICAgOiBvbGRBdHRhY2htZW50RmlsZS5iYXNlbmFtZTtcbiAgICBsZXQgbmV3Q2hpbGRQYXRoID0gam9pbihuZXdGb2xkZXIsIG1ha2VGaWxlTmFtZShuZXdDaGlsZEJhc2VuYW1lLCBvbGRBdHRhY2htZW50RmlsZS5leHRlbnNpb24pKTtcblxuICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdDaGlsZFBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzKSB7XG4gICAgICBjb25zdCBuZXdDaGlsZEZpbGUgPSBnZXRGaWxlT3JOdWxsKGFwcCwgbmV3Q2hpbGRQYXRoKTtcbiAgICAgIGlmIChuZXdDaGlsZEZpbGUpIHtcbiAgICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnRyYXNoRmlsZShuZXdDaGlsZEZpbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdDaGlsZFBhdGggPSBhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKG5ld0ZvbGRlciwgbmV3Q2hpbGRCYXNlbmFtZSksIG9sZEF0dGFjaG1lbnRGaWxlLmV4dGVuc2lvbik7XG4gICAgfVxuICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudEZpbGUucGF0aCwgbmV3Q2hpbGRQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHA6IEFwcCk6IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKGFwcCwgJ3JlbmFtZURlbGV0ZUhhbmRsZXJzTWFwJywgbmV3IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj4oKSkudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGdldFNldHRpbmdzKGFwcDogQXBwKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+IHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHApO1xuICBjb25zdCBzZXR0aW5nc0J1aWxkZXJzID0gQXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC52YWx1ZXMoKSkucmV2ZXJzZSgpO1xuXG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4gPSB7fTtcbiAgZm9yIChjb25zdCBzZXR0aW5nc0J1aWxkZXIgb2Ygc2V0dGluZ3NCdWlsZGVycykge1xuICAgIGNvbnN0IG5ld1NldHRpbmdzID0gc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGREZWxldGVFbXB0eUZvbGRlcnMgfHw9IG5ld1NldHRpbmdzLnNob3VsZERlbGV0ZUVtcHR5Rm9sZGVycyA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzID8/IGZhbHNlO1xuICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzID8/IGZhbHNlO1xuICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgPz8gZmFsc2U7XG4gICAgc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzZXMgPz8gZmFsc2U7XG4gICAgY29uc3QgaXNQYXRoSWdub3JlZCA9IHNldHRpbmdzLmlzUGF0aElnbm9yZWQ7XG4gICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzUGF0aElnbm9yZWQ/LihwYXRoKSA/PyBuZXdTZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkgPz8gZmFsc2U7XG4gICAgY29uc3QgY3VycmVudElzTm90ZSA9IHNldHRpbmdzLmlzTm90ZTtcbiAgICBzZXR0aW5ncy5pc05vdGUgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBjdXJyZW50SXNOb3RlPy4ocGF0aCkgPz8gbmV3U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gaXNOb3RlKGFwcCwgcGF0aCk7XG4gIH1cblxuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNhc2VDb2xsaXNpb24oXG4gIGFwcDogQXBwLFxuICBvbGRQYXRoOiBzdHJpbmcsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LFxuICBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKCFhcHAudmF1bHQuYWRhcHRlci5pbnNlbnNpdGl2ZSB8fCBvbGRQYXRoLnRvTG93ZXJDYXNlKCkgIT09IG5ld1BhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHRlbXBQYXRoID0gam9pbihkaXJuYW1lKG5ld1BhdGgpLCBgX190ZW1wX18ke2Jhc2VuYW1lKG5ld1BhdGgpfWApO1xuICBhd2FpdCByZW5hbWVIYW5kbGVkKGFwcCwgbmV3UGF0aCwgdGVtcFBhdGgpO1xuICBhd2FpdCBoYW5kbGVSZW5hbWVBc3luYyhhcHAsIG9sZFBhdGgsIHRlbXBQYXRoLCBvbGRQYXRoQmFja2xpbmtzTWFwLCBvbGRQYXRoTGlua3MpO1xuICBhd2FpdCBhcHAudmF1bHQucmVuYW1lKGdldEZpbGUoYXBwLCB0ZW1wUGF0aCksIG5ld1BhdGgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlRGVsZXRlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYEhhbmRsZSBEZWxldGUgJHtwYXRofWApO1xuICBpZiAoIWlzTm90ZUV4KGFwcCwgcGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG4gIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihwYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZ2V0KHBhdGgpO1xuICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5kZWxldGUocGF0aCk7XG4gIGlmIChjYWNoZSkge1xuICAgIGNvbnN0IGxpbmtzID0gZ2V0QWxsTGlua3MoY2FjaGUpO1xuXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICBjb25zdCBhdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShhcHAsIGxpbmssIHBhdGgpO1xuICAgICAgaWYgKCFhdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTm90ZUV4KGFwcCwgYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBhdHRhY2htZW50RmlsZSwgcGF0aCwgc2V0dGluZ3Muc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgcGF0aCk7XG4gIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBhdHRhY2htZW50Rm9sZGVyUGF0aCk7XG5cbiAgaWYgKCFhdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCEoYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcihhcHAsIHBhdGgpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBhdHRhY2htZW50Rm9sZGVyLCBwYXRoLCBmYWxzZSwgc2V0dGluZ3Muc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlRGVsZXRlSWZFbmFibGVkKHBsdWdpbjogUGx1Z2luLCBmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gIGNvbnN0IGFwcCA9IHBsdWdpbi5hcHA7XG4gIGlmICghc2hvdWxkSW52b2tlSGFuZGxlcihwbHVnaW4pKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBhdGggPSBmaWxlLnBhdGg7XG4gIGFkZFRvUXVldWUoYXBwLCAoKSA9PiBoYW5kbGVEZWxldGUoYXBwLCBwYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChhcHA6IEFwcCwgZmlsZTogVEFic3RyYWN0RmlsZSwgcHJldkNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGZpbGUucGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNNYXJrZG93bkZpbGUoYXBwLCBmaWxlKSAmJiBwcmV2Q2FjaGUpIHtcbiAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQoZmlsZS5wYXRoLCBwcmV2Q2FjaGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1ldGFkYXRhRGVsZXRlZElmRW5hYmxlZChwbHVnaW46IFBsdWdpbiwgZmlsZTogVEFic3RyYWN0RmlsZSwgcHJldkNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaGFuZGxlTWV0YWRhdGFEZWxldGVkKHBsdWdpbi5hcHAsIGZpbGUsIHByZXZDYWNoZSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qga2V5ID0gbWFrZUtleShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYEhhbmRsZSBSZW5hbWUgJHtrZXl9YCk7XG4gIGlmIChoYW5kbGVkUmVuYW1lcy5oYXMoa2V5KSkge1xuICAgIGhhbmRsZWRSZW5hbWVzLmRlbGV0ZShrZXkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcbiAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzIHx8IHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSB8fCBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obmV3UGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG9sZFBhdGgpID8/IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICBjb25zdCBvbGRQYXRoTGlua3MgPSBjYWNoZSA/IGdldEFsbExpbmtzKGNhY2hlKSA6IFtdO1xuICBjb25zdCBvbGRQYXRoQmFja2xpbmtzTWFwID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aChhcHAsIG9sZFBhdGgpLmRhdGE7XG4gIGFkZFRvUXVldWUoYXBwLCAoKSA9PiBoYW5kbGVSZW5hbWVBc3luYyhhcHAsIG9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcykpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVSZW5hbWVBc3luYyhcbiAgYXBwOiBBcHAsXG4gIG9sZFBhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuICBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW10sXG4gIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA/OiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzKTtcbiAgYXdhaXQgcmVmcmVzaExpbmtzKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzKTtcbiAgaWYgKGF3YWl0IGhhbmRsZUNhc2VDb2xsaXNpb24oYXBwLCBvbGRQYXRoLCBuZXdQYXRoLCBvbGRQYXRoQmFja2xpbmtzTWFwLCBvbGRQYXRoTGlua3MpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGF3YWl0IGZpbGxSZW5hbWVNYXAoYXBwLCBvbGRQYXRoLCBuZXdQYXRoLCByZW5hbWVNYXAsIG9sZFBhdGhMaW5rcyk7XG5cbiAgICBjb25zdCBjb21iaW5lZEJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAgIGluaXRCYWNrbGlua3NNYXAob2xkUGF0aEJhY2tsaW5rc01hcCwgcmVuYW1lTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgb2xkUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gb2xkUGF0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgYXR0YWNobWVudE9sZFBhdGgpKS5kYXRhO1xuICAgICAgaW5pdEJhY2tsaW5rc01hcChhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCwgcmVuYW1lTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgYXR0YWNobWVudE9sZFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEZvbGRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgW29sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aF0gb2YgcmVuYW1lTWFwLmVudHJpZXMoKSkge1xuICAgICAgaWYgKG9sZEF0dGFjaG1lbnRQYXRoID09PSBvbGRQYXRoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZml4ZWROZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHJlbmFtZUhhbmRsZWQoYXBwLCBvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgcmVuYW1lTWFwLnNldChvbGRBdHRhY2htZW50UGF0aCwgZml4ZWROZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICBwYXJlbnRGb2xkZXJzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICAgIGlmIChzZXR0aW5ncy5zaG91bGREZWxldGVFbXB0eUZvbGRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcGFyZW50Rm9sZGVyIG9mIHBhcmVudEZvbGRlcnMpIHtcbiAgICAgICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHkoYXBwLCBwYXJlbnRGb2xkZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoXG4gICAgICBjb25zdCBbbmV3QmFja2xpbmtQYXRoLCBsaW5rSnNvblRvUGF0aE1hcF0gb2YgQXJyYXkuZnJvbShjb21iaW5lZEJhY2tsaW5rc01hcC5lbnRyaWVzKCkpLmNvbmNhdChcbiAgICAgICAgQXJyYXkuZnJvbShpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPy5lbnRyaWVzKCkgPz8gW10pXG4gICAgICApXG4gICAgKSB7XG4gICAgICBhd2FpdCBlZGl0TGlua3MoYXBwLCBuZXdCYWNrbGlua1BhdGgsIChsaW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRQYXRoID0gbGlua0pzb25Ub1BhdGhNYXAuZ2V0KHRvSnNvbihsaW5rKSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudFBhdGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IHJlbmFtZU1hcC5nZXQob2xkQXR0YWNobWVudFBhdGgpO1xuICAgICAgICBpZiAoIW5ld0F0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtPcHRpb25zPih7XG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIGxpbmssXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgIG9sZFRhcmdldFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlc1xuICAgICAgICB9KSk7XG4gICAgICB9LCB7XG4gICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzTm90ZUV4KGFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGF3YWl0IHVwZGF0ZUxpbmtzSW5GaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnM+KHtcbiAgICAgICAgYXBwLFxuICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBuZXdQYXRoLFxuICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiBvbGRQYXRoLFxuICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlc1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmICghZ2V0RmlsZU9yTnVsbChhcHAsIG5ld1BhdGgpKSB7XG4gICAgICBsZXQgaW50ZXJydXB0ZWRSZW5hbWVzID0gaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmdldChuZXdQYXRoKTtcbiAgICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lcyA9IFtdO1xuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuc2V0KG5ld1BhdGgsIGludGVycnVwdGVkUmVuYW1lcyk7XG4gICAgICB9XG4gICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMucHVzaCh7XG4gICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICBvbGRQYXRoXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgY29uc3Qgb3JwaGFuS2V5cyA9IEFycmF5LmZyb20oaGFuZGxlZFJlbmFtZXMpO1xuICAgIGFkZFRvUXVldWUoYXBwLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBvcnBoYW5LZXlzKSB7XG4gICAgICAgIGhhbmRsZWRSZW5hbWVzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJlbmFtZUlmRW5hYmxlZChwbHVnaW46IFBsdWdpbiwgZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghc2hvdWxkSW52b2tlSGFuZGxlcihwbHVnaW4pKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghaXNGaWxlKGZpbGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG5ld1BhdGggPSBmaWxlLnBhdGg7XG4gIGhhbmRsZVJlbmFtZShwbHVnaW4uYXBwLCBvbGRQYXRoLCBuZXdQYXRoKTtcbn1cblxuZnVuY3Rpb24gaW5pdEJhY2tsaW5rc01hcChcbiAgc2luZ2xlQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIHJlbmFtZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+LFxuICBwYXRoOiBzdHJpbmdcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIGxpbmtzXSBvZiBzaW5nbGVCYWNrbGlua3NNYXAuZW50cmllcygpKSB7XG4gICAgY29uc3QgbmV3QmFja2xpbmtQYXRoID0gcmVuYW1lTWFwLmdldChiYWNrbGlua1BhdGgpID8/IGJhY2tsaW5rUGF0aDtcbiAgICBjb25zdCBsaW5rSnNvblRvUGF0aE1hcCA9IGNvbWJpbmVkQmFja2xpbmtzTWFwLmdldChuZXdCYWNrbGlua1BhdGgpID8/IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29tYmluZWRCYWNrbGlua3NNYXAuc2V0KG5ld0JhY2tsaW5rUGF0aCwgbGlua0pzb25Ub1BhdGhNYXApO1xuICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgbGlua0pzb25Ub1BhdGhNYXAuc2V0KHRvSnNvbihsaW5rKSwgcGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm90ZUV4KGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxvZ1JlZ2lzdGVyZWRIYW5kbGVycyhhcHA6IEFwcCk6IHZvaWQge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmxvZ1JlZ2lzdGVyZWRIYW5kbGVycycpKFxuICAgIGBQbHVnaW5zIHdpdGggcmVnaXN0ZXJlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXJzOiAke0pTT04uc3RyaW5naWZ5KEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpKSl9YFxuICApO1xufVxuXG5mdW5jdGlvbiBtYWtlS2V5KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoTGlua3MoXG4gIGFwcDogQXBwLFxuICBvbGRQYXRoOiBzdHJpbmcsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LFxuICBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShuZXdQYXRoKTtcbiAgY29uc3Qgb2xkUGF0aExpbmtzUmVmcmVzaGVkID0gY2FjaGUgPyBnZXRBbGxMaW5rcyhjYWNoZSkgOiBbXTtcbiAgY29uc3QgZmFrZU9sZEZpbGUgPSBnZXRGaWxlKGFwcCwgb2xkUGF0aCwgdHJ1ZSk7XG4gIGxldCBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gbmV3IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPigpO1xuICBhd2FpdCB0ZW1wUmVnaXN0ZXJGaWxlQW5kUnVuKGFwcCwgZmFrZU9sZEZpbGUsIGFzeW5jICgpID0+IHtcbiAgICBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgZmFrZU9sZEZpbGUpKS5kYXRhO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2Ygb2xkUGF0aExpbmtzUmVmcmVzaGVkKSB7XG4gICAgaWYgKG9sZFBhdGhMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG9sZFBhdGhMaW5rcy5wdXNoKGxpbmspO1xuICB9XG5cbiAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCByZWZyZXNoZWRMaW5rc10gb2Ygb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZC5lbnRyaWVzKCkpIHtcbiAgICBsZXQgb2xkTGlua3MgPSBvbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgIG9sZExpbmtzID0gW107XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbmFtZUhhbmRsZWQoYXBwOiBBcHAsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbmV3UGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gIGlmIChvbGRQYXRoID09PSBuZXdQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbiAgY29uc3Qga2V5ID0gbWFrZUtleShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgaGFuZGxlZFJlbmFtZXMuYWRkKGtleSk7XG4gIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gIHJldHVybiBuZXdQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Bc3luY0xpbmtVcGRhdGUoYXBwOiBBcHAsIG5leHQ6IFJ1bkFzeW5jTGlua1VwZGF0ZUZuLCBsaW5rVXBkYXRlc0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXh0LmNhbGwoYXBwLmZpbGVNYW5hZ2VyLCB3cmFwcGVkSGFuZGxlcik7XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JhcHBlZEhhbmRsZXIobGlua1VwZGF0ZXM6IExpbmtVcGRhdGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpc1JlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV2ZW50UmVmID0gYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoKSA9PiB7XG4gICAgICBpc1JlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgIGlmIChpc1JlbmFtZUNhbGxlZCkge1xuICAgICAgbGlua1VwZGF0ZXMuc3BsaWNlKDApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbjogUGx1Z2luKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFwcCA9IHBsdWdpbi5hcHA7XG4gIGNvbnN0IHBsdWdpbklkID0gcGx1Z2luLm1hbmlmZXN0LmlkO1xuXG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHApO1xuICBjb25zdCBtYWluUGx1Z2luSWQgPSBBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMua2V5cygpKVswXTtcbiAgaWYgKG1haW5QbHVnaW5JZCAhPT0gcGx1Z2luSWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBb0JBLFNBQVMsYUFBYTtBQU90QixT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
490
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBQbHVnaW4sXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncyc7XG5cbmltcG9ydCB7IFZhdWx0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIFVwZGF0ZUxpbmtPcHRpb25zLFxuICBVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnNcbn0gZnJvbSAnLi9MaW5rLnRzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9EZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi9PYmplY3QudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIG1ha2VGaWxlTmFtZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyByZXBsYWNlQWxsIH0gZnJvbSAnLi4vU3RyaW5nLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4vQXBwLnRzJztcbmltcG9ydCB7XG4gIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICBoYXNPd25BdHRhY2htZW50Rm9sZGVyXG59IGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGVkaXRMaW5rcyxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuL0xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICB0ZW1wUmVnaXN0ZXJGaWxlQW5kUnVuXG59IGZyb20gJy4vTWV0YWRhdGFDYWNoZS50cyc7XG5pbXBvcnQgeyByZWdpc3RlclBhdGNoIH0gZnJvbSAnLi9Nb25rZXlBcm91bmQudHMnO1xuaW1wb3J0IHsgYWRkVG9RdWV1ZSB9IGZyb20gJy4vUXVldWUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIHJlbmFtZVNhZmVcbn0gZnJvbSAnLi9WYXVsdC50cyc7XG5pbXBvcnQge1xuICBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeSxcbiAgZGVsZXRlU2FmZVxufSBmcm9tICcuL1ZhdWx0RXgudHMnO1xuXG5jb25zdCBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcbmNvbnN0IGhhbmRsZWRSZW5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5jb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuLyoqXG4gKiBUaGUgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGF0dGFjaG1lbnQgZm9sZGVycy5cbiAqL1xuZXhwb3J0IGVudW0gRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3Ige1xuICAvKipcbiAgICogRGVsZXRlIHRoZSBlbXB0eSBhdHRhY2htZW50IGZvbGRlci5cbiAgICovXG4gIERlbGV0ZSA9ICdEZWxldGUnLFxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGVtcHR5IGF0dGFjaG1lbnQgZm9sZGVyIGFuZCBhbGwgaXRzIGVtcHR5IHBhcmVudHMuXG4gICAqL1xuICBEZWxldGVXaXRoRW1wdHlQYXJlbnRzID0gJ0RlbGV0ZVdpdGhFbXB0eVBhcmVudHMnLFxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBlbXB0eSBhdHRhY2htZW50IGZvbGRlci5cbiAgICovXG4gIEtlZXAgPSAnS2VlcCdcbn1cblxuLyoqXG4gKiBTZXR0aW5ncyBmb3IgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBhdHRhY2htZW50IGZvbGRlcnMuXG4gICAqL1xuICBlbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvcjogRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBhdGggaXMgYSBub3RlLlxuICAgKi9cbiAgaXNOb3RlKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaWdub3JlIHRoZSBwYXRoLlxuICAgKi9cbiAgaXNQYXRoSWdub3JlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGVuYW1lIGFsaWFzZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEludGVycnVwdGVkUmVuYW1lIHtcbiAgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbnR5cGUgUnVuQXN5bmNMaW5rVXBkYXRlRm4gPSBGaWxlTWFuYWdlclsncnVuQXN5bmNMaW5rVXBkYXRlJ107XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIGluc3RhbmNlLlxuICogQHBhcmFtIHNldHRpbmdzQnVpbGRlciAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzZXR0aW5ncyBmb3IgdGhlIHJlbmFtZSBkZWxldGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUmVuYW1lRGVsZXRlSGFuZGxlcnMocGx1Z2luOiBQbHVnaW4sIHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KTogdm9pZCB7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAocGx1Z2luLmFwcCk7XG4gIGNvbnN0IHBsdWdpbklkID0gcGx1Z2luLm1hbmlmZXN0LmlkO1xuXG4gIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnNldChwbHVnaW5JZCwgc2V0dGluZ3NCdWlsZGVyKTtcbiAgbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKHBsdWdpbi5hcHApO1xuXG4gIHBsdWdpbi5yZWdpc3RlcigoKSA9PiB7XG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuZGVsZXRlKHBsdWdpbklkKTtcbiAgICBsb2dSZWdpc3RlcmVkSGFuZGxlcnMocGx1Z2luLmFwcCk7XG4gIH0pO1xuXG4gIGNvbnN0IGFwcCA9IHBsdWdpbi5hcHA7XG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC52YXVsdC5vbignZGVsZXRlJywgKGZpbGUpID0+IHtcbiAgICAgIGhhbmRsZURlbGV0ZUlmRW5hYmxlZChwbHVnaW4sIGZpbGUpO1xuICAgIH0pXG4gICk7XG5cbiAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoXG4gICAgYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCkgPT4ge1xuICAgICAgaGFuZGxlUmVuYW1lSWZFbmFibGVkKHBsdWdpbiwgZmlsZSwgb2xkUGF0aCk7XG4gICAgfSlcbiAgKTtcblxuICBwbHVnaW4ucmVnaXN0ZXJFdmVudChcbiAgICBhcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIChmaWxlLCBwcmV2Q2FjaGUpID0+IHtcbiAgICAgIGhhbmRsZU1ldGFkYXRhRGVsZXRlZElmRW5hYmxlZChwbHVnaW4sIGZpbGUsIHByZXZDYWNoZSk7XG4gICAgfSlcbiAgKTtcblxuICByZWdpc3RlclBhdGNoKHBsdWdpbiwgYXBwLmZpbGVNYW5hZ2VyLCB7XG4gICAgcnVuQXN5bmNMaW5rVXBkYXRlOiAobmV4dDogUnVuQXN5bmNMaW5rVXBkYXRlRm4pOiBSdW5Bc3luY0xpbmtVcGRhdGVGbiA9PiB7XG4gICAgICByZXR1cm4gKGxpbmtVcGRhdGVzSGFuZGxlcikgPT4gcnVuQXN5bmNMaW5rVXBkYXRlKGFwcCwgbmV4dCwgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwUGFyZW50Rm9sZGVycyhhcHA6IEFwcCwgcGFyZW50Rm9sZGVyUGF0aHM6IHN0cmluZ1tdLCBub3RlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcbiAgaWYgKHNldHRpbmdzLmVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yID09PSBFbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvci5LZWVwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoY29uc3QgcGFyZW50Rm9sZGVyUGF0aCBvZiBwYXJlbnRGb2xkZXJQYXRocykge1xuICAgIHN3aXRjaCAoc2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IpIHtcbiAgICAgIGNhc2UgRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IuRGVsZXRlOlxuICAgICAgICBhd2FpdCBkZWxldGVTYWZlKGFwcCwgcGFyZW50Rm9sZGVyUGF0aCwgbm90ZVBhdGgsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvci5EZWxldGVXaXRoRW1wdHlQYXJlbnRzOlxuICAgICAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeShhcHAsIHBhcmVudEZvbGRlclBhdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcyhcbiAgYXBwOiBBcHAsXG4gIG9sZFBhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuICBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KG9sZFBhdGgpO1xuICBpZiAoaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmRlbGV0ZShvbGRQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGludGVycnVwdGVkUmVuYW1lIG9mIGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgYXdhaXQgaGFuZGxlUmVuYW1lQXN5bmMoYXBwLCBpbnRlcnJ1cHRlZFJlbmFtZS5vbGRQYXRoLCBuZXdQYXRoLCBvbGRQYXRoQmFja2xpbmtzTWFwLCBvbGRQYXRoTGlua3MsIGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmlsbFJlbmFtZU1hcChhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcsIHJlbmFtZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPiwgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZW5hbWVNYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuXG4gIGlmICghaXNOb3RlRXgoYXBwLCBvbGRQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcblxuICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgb2xkUGF0aCk7XG4gIGNvbnN0IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlclxuICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBuZXdQYXRoKVxuICAgIDogb2xkQXR0YWNobWVudEZvbGRlclBhdGg7XG5cbiAgY29uc3QgaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID0gb2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09ICcvJztcblxuICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKGFwcCwgb2xkQXR0YWNobWVudEZvbGRlclBhdGgpO1xuXG4gIGlmICghb2xkQXR0YWNobWVudEZvbGRlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gbmV3QXR0YWNobWVudEZvbGRlclBhdGggJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gIGlmIChhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKGFwcCwgb2xkUGF0aCkpIHtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4ob2xkQXR0YWNobWVudEZvbGRlciwgKG9sZEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKG9sZEF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiBvbGRQYXRoTGlua3MpIHtcbiAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKGFwcCwgb2xkUGF0aExpbmssIG9sZFBhdGgpO1xuICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCB8fCBvbGRBdHRhY2htZW50RmlsZS5wYXRoLnN0YXJ0c1dpdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShhcHAsIG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG9sZEJhc2VuYW1lID0gYmFzZW5hbWUob2xkUGF0aCwgZXh0bmFtZShvbGRQYXRoKSk7XG4gIGNvbnN0IG5ld0Jhc2VuYW1lID0gYmFzZW5hbWUobmV3UGF0aCwgZXh0bmFtZShuZXdQYXRoKSk7XG5cbiAgZm9yIChjb25zdCBvbGRBdHRhY2htZW50RmlsZSBvZiBvbGRBdHRhY2htZW50RmlsZXMpIHtcbiAgICBpZiAoaXNOb3RlRXgoYXBwLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA/IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggOiByZWxhdGl2ZShvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCwgb2xkQXR0YWNobWVudEZpbGUucGF0aCk7XG4gICAgY29uc3QgbmV3Rm9sZGVyID0gam9pbihuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCwgZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICBjb25zdCBuZXdDaGlsZEJhc2VuYW1lID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzXG4gICAgICA/IHJlcGxhY2VBbGwob2xkQXR0YWNobWVudEZpbGUuYmFzZW5hbWUsIG9sZEJhc2VuYW1lLCBuZXdCYXNlbmFtZSlcbiAgICAgIDogb2xkQXR0YWNobWVudEZpbGUuYmFzZW5hbWU7XG4gICAgbGV0IG5ld0NoaWxkUGF0aCA9IGpvaW4obmV3Rm9sZGVyLCBtYWtlRmlsZU5hbWUobmV3Q2hpbGRCYXNlbmFtZSwgb2xkQXR0YWNobWVudEZpbGUuZXh0ZW5zaW9uKSk7XG5cbiAgICBpZiAob2xkQXR0YWNobWVudEZpbGUucGF0aCA9PT0gbmV3Q2hpbGRQYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgY29uc3QgbmV3Q2hpbGRGaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIG5ld0NoaWxkUGF0aCk7XG4gICAgICBpZiAobmV3Q2hpbGRGaWxlKSB7XG4gICAgICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci50cmFzaEZpbGUobmV3Q2hpbGRGaWxlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmV3Q2hpbGRQYXRoID0gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihuZXdGb2xkZXIsIG5ld0NoaWxkQmFzZW5hbWUpLCBvbGRBdHRhY2htZW50RmlsZS5leHRlbnNpb24pO1xuICAgIH1cbiAgICByZW5hbWVNYXAuc2V0KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsIG5ld0NoaWxkUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAoYXBwOiBBcHApOiBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShhcHAsICdyZW5hbWVEZWxldGVIYW5kbGVyc01hcCcsIG5ldyBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+KCkpLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBnZXRTZXR0aW5ncyhhcHA6IEFwcCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAoYXBwKTtcbiAgY29uc3Qgc2V0dGluZ3NCdWlsZGVycyA9IEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAudmFsdWVzKCkpLnJldmVyc2UoKTtcblxuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+ID0ge307XG4gIHNldHRpbmdzLmlzTm90ZSA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzTm90ZShhcHAsIHBhdGgpO1xuICBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkID0gKCk6IGJvb2xlYW4gPT4gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBzZXR0aW5nc0J1aWxkZXIgb2Ygc2V0dGluZ3NCdWlsZGVycykge1xuICAgIGNvbnN0IG5ld1NldHRpbmdzID0gc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyA/PyBmYWxzZTtcbiAgICBpZiAobmV3U2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IpIHtcbiAgICAgIHNldHRpbmdzLmVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yID8/PSBuZXdTZXR0aW5ncy5lbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvcjtcbiAgICB9XG4gICAgc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgPz8gZmFsc2U7XG4gICAgc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyID8/IGZhbHNlO1xuICAgIHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzID8/IGZhbHNlO1xuICAgIGNvbnN0IGlzUGF0aElnbm9yZWQgPSBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkO1xuICAgIHNldHRpbmdzLmlzUGF0aElnbm9yZWQgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBpc1BhdGhJZ25vcmVkKHBhdGgpIHx8IChuZXdTZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkgPz8gZmFsc2UpO1xuICAgIGNvbnN0IGN1cnJlbnRJc05vdGUgPSBzZXR0aW5ncy5pc05vdGU7XG4gICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gY3VycmVudElzTm90ZShwYXRoKSAmJiAobmV3U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gdHJ1ZSk7XG4gIH1cblxuICBzZXR0aW5ncy5lbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvciA/Pz0gRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IuS2VlcDtcbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVDYXNlQ29sbGlzaW9uKFxuICBhcHA6IEFwcCxcbiAgb2xkUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4gIG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghYXBwLnZhdWx0LmFkYXB0ZXIuaW5zZW5zaXRpdmUgfHwgb2xkUGF0aC50b0xvd2VyQ2FzZSgpICE9PSBuZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB0ZW1wUGF0aCA9IGpvaW4oZGlybmFtZShuZXdQYXRoKSwgYF9fdGVtcF9fJHtiYXNlbmFtZShuZXdQYXRoKX1gKTtcbiAgYXdhaXQgcmVuYW1lSGFuZGxlZChhcHAsIG5ld1BhdGgsIHRlbXBQYXRoKTtcbiAgYXdhaXQgaGFuZGxlUmVuYW1lQXN5bmMoYXBwLCBvbGRQYXRoLCB0ZW1wUGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzKTtcbiAgYXdhaXQgYXBwLnZhdWx0LnJlbmFtZShnZXRGaWxlKGFwcCwgdGVtcFBhdGgpLCBuZXdQYXRoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZURlbGV0ZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7cGF0aH1gKTtcbiAgaWYgKCFpc05vdGVFeChhcHAsIHBhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmdldChwYXRoKTtcbiAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKHBhdGgpO1xuICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBpZiAoY2FjaGUpIHtcbiAgICBjb25zdCBsaW5rcyA9IGdldEFsbExpbmtzKGNhY2hlKTtcblxuICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoYXBwLCBsaW5rLCBwYXRoKTtcbiAgICAgIGlmICghYXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05vdGVFeChhcHAsIGF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoYXR0YWNobWVudEZpbGUucGFyZW50Py5wYXRoID8/ICcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBhdHRhY2htZW50RmlsZSwgcGF0aCwgc2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yLktlZXApO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGNsZWFudXBQYXJlbnRGb2xkZXJzKGFwcCwgQXJyYXkuZnJvbShwYXJlbnRGb2xkZXJQYXRocyksIHBhdGgpO1xuXG4gIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBwYXRoKTtcbiAgY29uc3QgYXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIGF0dGFjaG1lbnRGb2xkZXJQYXRoKTtcblxuICBpZiAoIWF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIShhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKGFwcCwgcGF0aCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZGVsZXRlU2FmZShhcHAsIGF0dGFjaG1lbnRGb2xkZXIsIHBhdGgsIGZhbHNlLCBzZXR0aW5ncy5lbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IuS2VlcCk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZURlbGV0ZUlmRW5hYmxlZChwbHVnaW46IFBsdWdpbiwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICBjb25zdCBhcHAgPSBwbHVnaW4uYXBwO1xuICBpZiAoIXNob3VsZEludm9rZUhhbmRsZXIocGx1Z2luKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwYXRoID0gZmlsZS5wYXRoO1xuICBhZGRUb1F1ZXVlKGFwcCwgKCkgPT4gaGFuZGxlRGVsZXRlKGFwcCwgcGF0aCkpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVNZXRhZGF0YURlbGV0ZWQoYXBwOiBBcHAsIGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcbiAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihmaWxlLnBhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzTWFya2Rvd25GaWxlKGFwcCwgZmlsZSkgJiYgcHJldkNhY2hlKSB7XG4gICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuc2V0KGZpbGUucGF0aCwgcHJldkNhY2hlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVNZXRhZGF0YURlbGV0ZWRJZkVuYWJsZWQocGx1Z2luOiBQbHVnaW4sIGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gIGlmICghc2hvdWxkSW52b2tlSGFuZGxlcihwbHVnaW4pKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChwbHVnaW4uYXBwLCBmaWxlLCBwcmV2Q2FjaGUpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVSZW5hbWUoYXBwOiBBcHAsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGtleSA9IG1ha2VLZXkob2xkUGF0aCwgbmV3UGF0aCk7XG4gIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBIYW5kbGUgUmVuYW1lICR7a2V5fWApO1xuICBpZiAoaGFuZGxlZFJlbmFtZXMuaGFzKGtleSkpIHtcbiAgICBoYW5kbGVkUmVuYW1lcy5kZWxldGUoa2V5KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG4gIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fCBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ob2xkUGF0aCkgfHwgc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShuZXdQYXRoKTtcbiAgY29uc3Qgb2xkUGF0aExpbmtzID0gY2FjaGUgPyBnZXRBbGxMaW5rcyhjYWNoZSkgOiBbXTtcbiAgY29uc3Qgb2xkUGF0aEJhY2tsaW5rc01hcCA9IGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwLCBvbGRQYXRoKS5kYXRhO1xuICBhZGRUb1F1ZXVlKGFwcCwgKCkgPT4gaGFuZGxlUmVuYW1lQXN5bmMoYXBwLCBvbGRQYXRoLCBuZXdQYXRoLCBvbGRQYXRoQmFja2xpbmtzTWFwLCBvbGRQYXRoTGlua3MpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVuYW1lQXN5bmMoXG4gIGFwcDogQXBwLFxuICBvbGRQYXRoOiBzdHJpbmcsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LFxuICBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdLFxuICBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcyhhcHAsIG9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcyk7XG4gIGF3YWl0IHJlZnJlc2hMaW5rcyhhcHAsIG9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcyk7XG4gIGlmIChhd2FpdCBoYW5kbGVDYXNlQ29sbGlzaW9uKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVuYW1lTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBhd2FpdCBmaWxsUmVuYW1lTWFwKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgcmVuYW1lTWFwLCBvbGRQYXRoTGlua3MpO1xuXG4gICAgY29uc3QgY29tYmluZWRCYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgICBpbml0QmFja2xpbmtzTWFwKG9sZFBhdGhCYWNrbGlua3NNYXAsIHJlbmFtZU1hcCwgY29tYmluZWRCYWNrbGlua3NNYXAsIG9sZFBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBhdHRhY2htZW50T2xkUGF0aCBvZiByZW5hbWVNYXAua2V5cygpKSB7XG4gICAgICBpZiAoYXR0YWNobWVudE9sZFBhdGggPT09IG9sZFBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCA9IChhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShhcHAsIGF0dGFjaG1lbnRPbGRQYXRoKSkuZGF0YTtcbiAgICAgIGluaXRCYWNrbGlua3NNYXAoYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXAsIHJlbmFtZU1hcCwgY29tYmluZWRCYWNrbGlua3NNYXAsIGF0dGFjaG1lbnRPbGRQYXRoKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBbb2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoXSBvZiByZW5hbWVNYXAuZW50cmllcygpKSB7XG4gICAgICBpZiAob2xkQXR0YWNobWVudFBhdGggPT09IG9sZFBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgcmVuYW1lSGFuZGxlZChhcHAsIG9sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICByZW5hbWVNYXAuc2V0KG9sZEF0dGFjaG1lbnRQYXRoLCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgfVxuXG4gICAgYXdhaXQgY2xlYW51cFBhcmVudEZvbGRlcnMoYXBwLCBBcnJheS5mcm9tKHBhcmVudEZvbGRlclBhdGhzKSwgb2xkUGF0aCk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuXG4gICAgZm9yIChcbiAgICAgIGNvbnN0IFtuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwXSBvZiBBcnJheS5mcm9tKGNvbWJpbmVkQmFja2xpbmtzTWFwLmVudHJpZXMoKSkuY29uY2F0KFxuICAgICAgICBBcnJheS5mcm9tKGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA/LmVudHJpZXMoKSA/PyBbXSlcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGF3YWl0IGVkaXRMaW5rcyhhcHAsIG5ld0JhY2tsaW5rUGF0aCwgKGxpbmspID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudFBhdGggPSBsaW5rSnNvblRvUGF0aE1hcC5nZXQodG9Kc29uKGxpbmspKTtcbiAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gcmVuYW1lTWFwLmdldChvbGRBdHRhY2htZW50UGF0aCk7XG4gICAgICAgIGlmICghbmV3QXR0YWNobWVudFBhdGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua09wdGlvbnM+KHtcbiAgICAgICAgICBhcHAsXG4gICAgICAgICAgbGluayxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogbmV3QXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgb2xkVGFyZ2V0UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzXG4gICAgICAgIH0pKTtcbiAgICAgIH0sIHtcbiAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNOb3RlRXgoYXBwLCBuZXdQYXRoKSkge1xuICAgICAgYXdhaXQgdXBkYXRlTGlua3NJbkZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtzSW5GaWxlT3B0aW9ucz4oe1xuICAgICAgICBhcHAsXG4gICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld1BhdGgsXG4gICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IG9sZFBhdGgsXG4gICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgaWYgKCFnZXRGaWxlT3JOdWxsKGFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGxldCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KG5ld1BhdGgpO1xuICAgICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcC5zZXQobmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgIH1cbiAgICAgIGludGVycnVwdGVkUmVuYW1lcy5wdXNoKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIG9sZFBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjb25zdCBvcnBoYW5LZXlzID0gQXJyYXkuZnJvbShoYW5kbGVkUmVuYW1lcyk7XG4gICAgYWRkVG9RdWV1ZShhcHAsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgaGFuZGxlZFJlbmFtZXMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlUmVuYW1lSWZFbmFibGVkKHBsdWdpbjogUGx1Z2luLCBmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmV3UGF0aCA9IGZpbGUucGF0aDtcbiAgaGFuZGxlUmVuYW1lKHBsdWdpbi5hcHAsIG9sZFBhdGgsIG5ld1BhdGgpO1xufVxuXG5mdW5jdGlvbiBpbml0QmFja2xpbmtzTWFwKFxuICBzaW5nbGVCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgcmVuYW1lTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4sXG4gIHBhdGg6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2JhY2tsaW5rUGF0aCwgbGlua3NdIG9mIHNpbmdsZUJhY2tsaW5rc01hcC5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBuZXdCYWNrbGlua1BhdGggPSByZW5hbWVNYXAuZ2V0KGJhY2tsaW5rUGF0aCkgPz8gYmFja2xpbmtQYXRoO1xuICAgIGNvbnN0IGxpbmtKc29uVG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBjb21iaW5lZEJhY2tsaW5rc01hcC5zZXQobmV3QmFja2xpbmtQYXRoLCBsaW5rSnNvblRvUGF0aE1hcCk7XG4gICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICBsaW5rSnNvblRvUGF0aE1hcC5zZXQodG9Kc29uKGxpbmspLCBwYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb3RlRXgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG4gIHJldHVybiBzZXR0aW5ncy5pc05vdGU/LihwYXRoKSA/PyBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKGFwcDogQXBwKTogdm9pZCB7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAoYXBwKTtcbiAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6bG9nUmVnaXN0ZXJlZEhhbmRsZXJzJykoXG4gICAgYFBsdWdpbnMgd2l0aCByZWdpc3RlcmVkIHJlbmFtZS9kZWxldGUgaGFuZGxlcnM6ICR7SlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC5rZXlzKCkpKX1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIG1ha2VLZXkob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hMaW5rcyhcbiAgYXBwOiBBcHAsXG4gIG9sZFBhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuICBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG9sZFBhdGgpID8/IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICBjb25zdCBvbGRQYXRoTGlua3NSZWZyZXNoZWQgPSBjYWNoZSA/IGdldEFsbExpbmtzKGNhY2hlKSA6IFtdO1xuICBjb25zdCBmYWtlT2xkRmlsZSA9IGdldEZpbGUoYXBwLCBvbGRQYXRoLCB0cnVlKTtcbiAgbGV0IG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQgPSBuZXcgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+KCk7XG4gIGF3YWl0IHRlbXBSZWdpc3RlckZpbGVBbmRSdW4oYXBwLCBmYWtlT2xkRmlsZSwgYXN5bmMgKCkgPT4ge1xuICAgIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQgPSAoYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoYXBwLCBmYWtlT2xkRmlsZSkpLmRhdGE7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBvbGRQYXRoTGlua3NSZWZyZXNoZWQpIHtcbiAgICBpZiAob2xkUGF0aExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgb2xkUGF0aExpbmtzLnB1c2gobGluayk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZExpbmtzXSBvZiBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkLmVudHJpZXMoKSkge1xuICAgIGxldCBvbGRMaW5rcyA9IG9sZFBhdGhCYWNrbGlua3NNYXAuZ2V0KGJhY2tsaW5rUGF0aCk7XG4gICAgaWYgKCFvbGRMaW5rcykge1xuICAgICAgb2xkTGlua3MgPSBbXTtcbiAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXAuc2V0KGJhY2tsaW5rUGF0aCwgb2xkTGlua3MpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGluayBvZiByZWZyZXNoZWRMaW5rcykge1xuICAgICAgaWYgKG9sZExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgb2xkTGlua3MucHVzaChsaW5rKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuYW1lSGFuZGxlZChhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBuZXdQYXRoID0gZ2V0U2FmZVJlbmFtZVBhdGgoYXBwLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxuICBjb25zdCBrZXkgPSBtYWtlS2V5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICBoYW5kbGVkUmVuYW1lcy5hZGQoa2V5KTtcbiAgbmV3UGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoYXBwLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgcmV0dXJuIG5ld1BhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkFzeW5jTGlua1VwZGF0ZShhcHA6IEFwcCwgbmV4dDogUnVuQXN5bmNMaW5rVXBkYXRlRm4sIGxpbmtVcGRhdGVzSGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5leHQuY2FsbChhcHAuZmlsZU1hbmFnZXIsIHdyYXBwZWRIYW5kbGVyKTtcblxuICBhc3luYyBmdW5jdGlvbiB3cmFwcGVkSGFuZGxlcihsaW5rVXBkYXRlczogTGlua1VwZGF0ZVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGlzUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgZXZlbnRSZWYgPSBhcHAudmF1bHQub24oJ3JlbmFtZScsICgpID0+IHtcbiAgICAgIGlzUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXBwLnZhdWx0Lm9mZnJlZihldmVudFJlZik7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgaWYgKGlzUmVuYW1lQ2FsbGVkKSB7XG4gICAgICBsaW5rVXBkYXRlcy5zcGxpY2UoMCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEludm9rZUhhbmRsZXIocGx1Z2luOiBQbHVnaW4pOiBib29sZWFuIHtcbiAgY29uc3QgYXBwID0gcGx1Z2luLmFwcDtcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG5cbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlclBsdWdpbklkcyA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGNvbnN0IG1haW5QbHVnaW5JZCA9IEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlclBsdWdpbklkcy5rZXlzKCkpWzBdO1xuICBpZiAobWFpblBsdWdpbklkICE9PSBwbHVnaW5JZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFvQkEsU0FBUyxhQUFhO0FBT3RCLFNBQVMsc0JBQXNCO0FBQy9CO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxrQkFBa0I7QUFDM0Is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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "26.20.0",
3
+ "version": "26.22.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"
@@ -452,7 +452,7 @@
452
452
  "@types/doctrine": "^0.0.9",
453
453
  "@types/eslint": "^9.6.1",
454
454
  "@types/luxon": "^3.6.2",
455
- "@types/node": "^22.15.2",
455
+ "@types/node": "^22.15.3",
456
456
  "@types/parsimmon": "^1.10.9",
457
457
  "@types/path-browserify": "^1.0.3",
458
458
  "@types/picomatch": "^4.0.0",