bways-report 0.2.1 → 0.2.2
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/README.md +18 -0
- package/esm2022/lib/core/config/bways-report-config.mjs +1 -1
- package/esm2022/lib/core/services/report-session-context.service.mjs +1 -44
- package/esm2022/lib/core/utils/report-parameter.util.mjs +14 -2
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +55 -2
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +9 -7
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +7 -14
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +11 -11
- package/esm2022/lib/features/designer/designer.component.mjs +3 -3
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +5 -3
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +4 -4
- package/fesm2022/bways-report.mjs +94 -81
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/config/bways-report-config.d.ts +3 -0
- package/lib/core/services/report-session-context.service.d.ts +0 -5
- package/lib/core/utils/report-parameter.util.d.ts +2 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +7 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +1 -0
- package/package.json +1 -1
- package/styles/theme.css +9 -12
|
@@ -496,7 +496,7 @@ export class RptDropdownComponent {
|
|
|
496
496
|
const k = String(it.value);
|
|
497
497
|
if (!seen.has(k)) {
|
|
498
498
|
seen.add(k);
|
|
499
|
-
deduped.push({ key:
|
|
499
|
+
deduped.push({ key: it.value, label: it.label || k });
|
|
500
500
|
}
|
|
501
501
|
}
|
|
502
502
|
this.dynamicOptions.set(deduped);
|
|
@@ -535,14 +535,14 @@ export class RptDropdownComponent {
|
|
|
535
535
|
}
|
|
536
536
|
}
|
|
537
537
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
538
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptDropdownComponent, isStandalone: true, selector: "rpt-dropdown", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null }, parentForm: { classPropertyName: "parentForm", publicName: "parentForm", isSignal: true, isRequired: false, transformFunction: null }, showStatus: { classPropertyName: "showStatus", publicName: "showStatus", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dropdownClick: "dropdownClick" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()" }, properties: { "class.is-open": "isOpen()", "class.opens-above": "opensAbove()" } }, viewQueries: [{ propertyName: "comboboxWrapperEl", first: true, predicate: ["comboboxWrapper"], descendants: true, isSignal: true }, { propertyName: "searchInputEl", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }, { propertyName: "optionsListEl", first: true, predicate: ["optionsListEl"], descendants: true, isSignal: true }], ngImport: i0, template: " <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n @if (isSearchable()) {\n <!-- Searchable Typeahead Combobox -->\n <div class=\"rpt-combobox-wrapper\" #comboboxWrapper #comboboxOrigin=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n <button\n type=\"button\"\n class=\"rpt-combobox-trigger\"\n [id]=\"elementId()\"\n [class.rpt-invalid]=\"isInvalid()\"\n [class.is-open]=\"isOpen()\"\n [disabled]=\"formControl().disabled\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n (click)=\"toggleOpen($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"trigger-label\" [class.is-placeholder]=\"!selectedOption()\">\n {{ selectedOption() ? selectedOption()!.label : placeholder() }}\n </span>\n\n <div class=\"trigger-actions\">\n @if (isLoading()) {\n <span class=\"status-dot dot-pulse\" style=\"color: #2563eb; margin-right: 4px;\" title=\"Executing query on database...\"></span>\n }\n @if (loadError() && !isLoading()) {\n <button\n type=\"button\"\n class=\"trigger-retry-btn\"\n title=\"Retry database query\"\n aria-label=\"Retry database query\"\n (click)=\"retryLookup($event)\"\n >\n \u21BB Retry\n </button>\n }\n @if (selectedOption() && !formControl().disabled) {\n <span\n role=\"button\"\n tabindex=\"0\"\n class=\"trigger-clear-btn\"\n title=\"Clear selection\"\n aria-label=\"Clear selection\"\n (click)=\"clearSelection($event)\"\n (keydown.enter)=\"clearSelection($event)\"\n (keydown.space)=\"clearSelection($event)\"\n >\n \u2715\n </span>\n }\n <span class=\"trigger-arrow\" [class.rotated]=\"isOpen()\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n </button>\n </div>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"comboboxOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"triggerWidth()\"\n [cdkConnectedOverlayMinWidth]=\"'min(180px, calc(100vw - 16px))'\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n (overlayOutsideClick)=\"closeDropdown()\"\n (positionChange)=\"onPositionChange($event)\"\n (attach)=\"onOverlayAttached()\"\n (detach)=\"closeDropdown()\"\n >\n <div\n class=\"rpt-combobox-menu\"\n [class.opens-above]=\"opensAbove()\"\n role=\"listbox\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Real-time Filter Search Box -->\n <div class=\"combobox-search-box\">\n <span class=\"combobox-search-icon\" aria-hidden=\"true\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n </span>\n <input\n #searchInput\n type=\"text\"\n class=\"combobox-search-input\"\n placeholder=\"Type to filter...\"\n [value]=\"searchTerm()\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? (elementId() + '_opt_' + focusedIndex()) : null\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n @if (searchTerm()) {\n <button\n type=\"button\"\n class=\"combobox-search-clear\"\n title=\"Clear filter\"\n (click)=\"clearSearch($event)\"\n >\n \u2715\n </button>\n }\n </div>\n\n <!-- Filtered Options List -->\n <div class=\"combobox-options-list\" #optionsListEl (scroll)=\"onOptionsScroll($event)\">\n @if (waitingFor().length > 0) {\n <div class=\"combobox-status-row waiting\">\n <span>Waiting for {{ waitingLabel() }}...</span>\n </div>\n } @else if (isLoading()) {\n <div class=\"combobox-status-row loading\">\n <span class=\"status-dot dot-pulse\"></span>\n <span>Executing query on database (may take 1\u20132 minutes on local database)...</span>\n </div>\n } @else if (loadError()) {\n <div class=\"combobox-status-row error\">\n <span>Error: {{ loadError() }}</span>\n <button type=\"button\" class=\"combobox-retry-btn\" (click)=\"retryLookup($event)\">\u21BB Retry Query</button>\n </div>\n } @else if (isDynamicSource() && hasLoaded() && allOptions().length === 0) {\n <div class=\"combobox-status-row empty\">\n <span>No records found (check parameters)</span>\n </div>\n } @else if (filteredOptions().length === 0) {\n <div class=\"combobox-status-row empty\">\n <span>No options matching \"{{ searchTerm() }}\"</span>\n </div>\n } @else {\n @for (opt of visibleFilteredOptions(); track opt.key; let i = $index) {\n <div\n role=\"option\"\n [id]=\"elementId() + '_opt_' + i\"\n class=\"combobox-option-item\"\n [class.is-selected]=\"isSelected(opt)\"\n [class.is-focused]=\"focusedIndex() === i\"\n [attr.aria-selected]=\"isSelected(opt)\"\n (click)=\"selectOption(opt)\"\n (mouseenter)=\"focusedIndex.set(i)\"\n >\n <span class=\"opt-label\">{{ opt.label }}</span>\n @if (isSelected(opt)) {\n <span class=\"opt-check\" aria-hidden=\"true\">\u2713</span>\n }\n </div>\n }\n @if (excessFilteredCount() > 0) {\n <div class=\"combobox-status-row hint\">\n <span>Showing {{ visibleFilteredOptions().length }} of {{ filteredOptions().length }} matches. Scroll down or</span>\n <button\n type=\"button\"\n class=\"combobox-load-all-btn\"\n (click)=\"loadAllFiltered(); $event.stopPropagation();\"\n >\n Load all {{ filteredOptions().length }}\n </button>\n </div>\n }\n }\n </div>\n </div>\n </ng-template>\n } @else {\n <!-- Native Browser Select Fallback -->\n <div class=\"rpt-select-wrapper\">\n <select\n [id]=\"elementId()\"\n [formControl]=\"formControl()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-select\"\n >\n @if (waitingFor().length > 0) {\n <option value=\"\" disabled selected>Waiting for {{ waitingLabel() }}...</option>\n } @else if (isLoading()) {\n <option value=\"\" disabled selected>Loading options from database...</option>\n } @else if (loadError()) {\n <option value=\"\" disabled selected>Error: {{ loadError() }}</option>\n } @else if (isDynamicSource() && hasLoaded() && allOptions().length === 0) {\n <option value=\"\" disabled selected>-- No records found (check parameters) --</option>\n } @else if (placeholder()) {\n <option value=\"\" [disabled]=\"config().validation?.required\">{{ placeholder() }}</option>\n }\n @for (opt of renderedOptions(); track opt.key) {\n <option [value]=\"opt.key\">{{ opt.label }}</option>\n }\n @if (hasExcessOptions()) {\n <option value=\"\" disabled>... and {{ excessOptionsCount() }} more records (refine filter) ...</option>\n }\n </select>\n <div class=\"rpt-select-arrow\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n }\n\n @if (showStatus() && isDynamicSource() && statusText()) {\n <div class=\"rpt-status-badge\" [attr.data-status]=\"statusKind()\">\n @switch (statusKind()) {\n @case ('loading') {\n <span class=\"status-dot dot-pulse\"></span>\n <span>Loading from database\u2026</span>\n }\n @case ('ok') {\n <span class=\"status-dot dot-ok\"></span>\n <span>{{ dynamicOptions().length }} records loaded</span>\n }\n @case ('waiting') {\n <span class=\"status-dot dot-warn\"></span>\n <span>Waiting for:</span>\n <div class=\"waiting-tokens\">\n @for (k of waitingFor(); track k) {\n <span class=\"waiting-token\">{{ k }}</span>\n }\n </div>\n }\n @case ('error') {\n <span class=\"status-dot dot-err\"></span>\n <span>{{ loadError() }}</span>\n <button type=\"button\" class=\"rpt-badge-retry-btn\" (click)=\"retryLookup($event)\">\u21BB Retry</button>\n }\n @case ('empty') {\n <span class=\"status-dot\"></span>\n <span>No records found for parameters</span>\n }\n @default {\n <span class=\"status-dot\"></span>\n }\n }\n </div>\n }\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>", styles: [":host{display:block;width:100%;max-width:100%;min-width:0;box-sizing:border-box;font-family:var(--rpt-font-family, inherit);position:relative}.rpt-status-badge{display:flex;flex-wrap:wrap;align-items:center;gap:4px;font-size:.6875rem;padding:3px 6px;border-radius:4px;margin-top:4px;font-weight:500;line-height:1.3;max-width:100%;box-sizing:border-box;overflow:hidden;word-break:break-word}.rpt-status-badge>span{overflow-wrap:anywhere;word-break:break-word}.rpt-status-badge[data-status=loading]{background:#eff6ff;color:#2563eb;border:1px solid #dbeafe}.rpt-status-badge[data-status=ok]{background:#f0fdf4;color:#16a34a;border:1px solid #dcfce7}.rpt-status-badge[data-status=waiting]{background:#fffbeb;color:#d97706;border:1px solid #fef3c7}.rpt-status-badge[data-status=error]{background:#fef2f2;color:#dc2626;border:1px solid #fee2e2}.rpt-status-badge[data-status=empty]{background:#f8fafc;color:#64748b;border:1px solid #e2e8f0}.waiting-tokens{display:inline-flex;flex-wrap:wrap;align-items:center;gap:3px;margin-left:2px;max-width:100%}.waiting-token{background:#b453091f;border:1px solid rgba(180,83,9,.3);padding:1px 5px;border-radius:3px;font-weight:700;font-size:.625rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;box-sizing:border-box}.status-dot{width:6px;height:6px;border-radius:50%;background:currentColor}.dot-pulse{animation:rpt-pulse 1s infinite alternate}@keyframes rpt-pulse{0%{opacity:.3}to{opacity:1}}.rpt-field-group{display:flex;flex-direction:column;max-width:100%;min-width:0;gap:4px;box-sizing:border-box;position:relative}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-select-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex;align-items:center}.rpt-select{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 36px 6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);appearance:none;-webkit-appearance:none;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-select:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-select:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-select:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-select.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-select.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-select-arrow{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;color:var(--rpt-color-text-muted, #64748b);display:flex;align-items:center}.rpt-combobox-wrapper{position:relative;width:100%;flex:1;min-height:0}.rpt-combobox-trigger{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 10px 6px 12px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:var(--rpt-font-size-base, .875rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-combobox-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-combobox-trigger:focus-visible,.rpt-combobox-trigger.is-open{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-combobox-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-combobox-trigger.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-combobox-trigger.rpt-invalid:focus-visible{box-shadow:0 0 0 3px #ef444440}.trigger-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}.trigger-label.is-placeholder{color:var(--rpt-color-text-muted, #94a3b8)}.trigger-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.trigger-clear-btn{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.6875rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s ease,color .15s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.rpt-combobox-menu{width:100%;min-width:0;max-width:100vw;box-sizing:border-box;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #00000024,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:rpt-dropdown-pop .12s cubic-bezier(0,0,.2,1)}.rpt-combobox-menu.opens-above{box-shadow:0 -10px 25px -5px #00000024,0 -8px 10px -6px #00000014;animation:rpt-dropdown-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes rpt-dropdown-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes rpt-dropdown-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.combobox-search-box{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background-color:#f8fafc}.combobox-search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.combobox-search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .8125rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.combobox-search-input::placeholder{color:#94a3b8}.combobox-search-clear{border:none;background:#e2e8f0;color:#64748b;width:16px;height:16px;border-radius:50%;font-size:.625rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0}.combobox-search-clear:hover{background:#cbd5e1;color:#0f172a}.combobox-options-list{max-height:220px;overflow-y:auto;overscroll-behavior:contain;padding:4px}.combobox-option-item{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-radius:4px;font-size:var(--rpt-font-size-base, .84rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.combobox-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.combobox-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.opt-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opt-check{font-size:.875rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);margin-left:8px}.combobox-status-row{padding:10px 12px;font-size:.78rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.combobox-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:#2563eb}.combobox-status-row.error{display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--rpt-color-danger, #dc2626)}.trigger-retry-btn,.combobox-retry-btn,.rpt-badge-retry-btn{display:inline-flex;align-items:center;gap:3px;font-size:.6875rem;font-weight:600;color:#dc2626;background:#fee2e2;border:1px solid #fca5a5;border-radius:4px;padding:2px 7px;cursor:pointer;line-height:1.2;transition:background-color .12s ease,color .12s ease}.trigger-retry-btn:hover,.combobox-retry-btn:hover,.rpt-badge-retry-btn:hover{background:#fecaca;color:#b91c1c;border-color:#f87171}.combobox-status-row.hint{font-size:.72rem;color:#64748b;border-top:1px dashed #cbd5e1;margin-top:4px;padding:6px 10px;background-color:#f8fafc;display:flex;align-items:center;justify-content:space-between;gap:8px;position:sticky;bottom:0;z-index:2;box-shadow:0 -2px 6px #0000000a}.combobox-load-all-btn{background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.6875rem;font-weight:600;padding:3px 8px;border-radius:4px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:all .12s ease}.combobox-load-all-btn:hover{background:#2563eb;color:#fff;border-color:#2563eb}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i2.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
538
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptDropdownComponent, isStandalone: true, selector: "rpt-dropdown", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null }, parentForm: { classPropertyName: "parentForm", publicName: "parentForm", isSignal: true, isRequired: false, transformFunction: null }, showStatus: { classPropertyName: "showStatus", publicName: "showStatus", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dropdownClick: "dropdownClick" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()" }, properties: { "class.is-open": "isOpen()", "class.opens-above": "opensAbove()" } }, viewQueries: [{ propertyName: "comboboxWrapperEl", first: true, predicate: ["comboboxWrapper"], descendants: true, isSignal: true }, { propertyName: "searchInputEl", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }, { propertyName: "optionsListEl", first: true, predicate: ["optionsListEl"], descendants: true, isSignal: true }], ngImport: i0, template: " <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n @if (isSearchable()) {\n <!-- Searchable Typeahead Combobox -->\n <div class=\"rpt-combobox-wrapper\" #comboboxWrapper #comboboxOrigin=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n <button\n type=\"button\"\n class=\"rpt-combobox-trigger\"\n [id]=\"elementId()\"\n [class.rpt-invalid]=\"isInvalid()\"\n [class.is-open]=\"isOpen()\"\n [disabled]=\"formControl().disabled\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n (click)=\"toggleOpen($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"trigger-label\" [class.is-placeholder]=\"!selectedOption()\">\n {{ selectedOption() ? selectedOption()!.label : placeholder() }}\n </span>\n\n <div class=\"trigger-actions\">\n @if (isLoading()) {\n <span class=\"status-dot dot-pulse\" style=\"color: #2563eb; margin-right: 4px;\" title=\"Executing query on database...\"></span>\n }\n @if (loadError() && !isLoading()) {\n <button\n type=\"button\"\n class=\"trigger-retry-btn\"\n title=\"Retry database query\"\n aria-label=\"Retry database query\"\n (click)=\"retryLookup($event)\"\n >\n \u21BB Retry\n </button>\n }\n @if (selectedOption() && !formControl().disabled) {\n <span\n role=\"button\"\n tabindex=\"0\"\n class=\"trigger-clear-btn\"\n title=\"Clear selection\"\n aria-label=\"Clear selection\"\n (click)=\"clearSelection($event)\"\n (keydown.enter)=\"clearSelection($event)\"\n (keydown.space)=\"clearSelection($event)\"\n >\n \u2715\n </span>\n }\n <span class=\"trigger-arrow\" [class.rotated]=\"isOpen()\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n </button>\n </div>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"comboboxOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"triggerWidth()\"\n [cdkConnectedOverlayMinWidth]=\"'min(180px, calc(100vw - 16px))'\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n (overlayOutsideClick)=\"closeDropdown()\"\n (positionChange)=\"onPositionChange($event)\"\n (attach)=\"onOverlayAttached()\"\n (detach)=\"closeDropdown()\"\n >\n <div\n class=\"rpt-combobox-menu\"\n [class.opens-above]=\"opensAbove()\"\n role=\"listbox\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Real-time Filter Search Box -->\n <div class=\"combobox-search-box\">\n <span class=\"combobox-search-icon\" aria-hidden=\"true\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n </span>\n <input\n #searchInput\n type=\"text\"\n class=\"combobox-search-input\"\n placeholder=\"Type to filter...\"\n [value]=\"searchTerm()\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? (elementId() + '_opt_' + focusedIndex()) : null\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n @if (searchTerm()) {\n <button\n type=\"button\"\n class=\"combobox-search-clear\"\n title=\"Clear filter\"\n (click)=\"clearSearch($event)\"\n >\n \u2715\n </button>\n }\n </div>\n\n <!-- Filtered Options List -->\n <div class=\"combobox-options-list\" #optionsListEl (scroll)=\"onOptionsScroll($event)\">\n @if (waitingFor().length > 0) {\n <div class=\"combobox-status-row waiting\">\n <span>Waiting for {{ waitingLabel() }}...</span>\n </div>\n } @else if (isLoading()) {\n <div class=\"combobox-status-row loading\">\n <span class=\"status-dot dot-pulse\"></span>\n <span>Executing query on database (may take 1\u20132 minutes on local database)...</span>\n </div>\n } @else if (loadError()) {\n <div class=\"combobox-status-row error\">\n <span>Error: {{ loadError() }}</span>\n <button type=\"button\" class=\"combobox-retry-btn\" (click)=\"retryLookup($event)\">\u21BB Retry Query</button>\n </div>\n } @else if (isDynamicSource() && hasLoaded() && allOptions().length === 0) {\n <div class=\"combobox-status-row empty\">\n <span>No records found (check parameters)</span>\n </div>\n } @else if (filteredOptions().length === 0) {\n <div class=\"combobox-status-row empty\">\n <span>No options matching \"{{ searchTerm() }}\"</span>\n </div>\n } @else {\n @for (opt of visibleFilteredOptions(); track opt.key; let i = $index) {\n <div\n role=\"option\"\n [id]=\"elementId() + '_opt_' + i\"\n class=\"combobox-option-item\"\n [class.is-selected]=\"isSelected(opt)\"\n [class.is-focused]=\"focusedIndex() === i\"\n [attr.aria-selected]=\"isSelected(opt)\"\n (click)=\"selectOption(opt)\"\n (mouseenter)=\"focusedIndex.set(i)\"\n >\n <span class=\"opt-label\">{{ opt.label }}</span>\n @if (isSelected(opt)) {\n <span class=\"opt-check\" aria-hidden=\"true\">\u2713</span>\n }\n </div>\n }\n @if (excessFilteredCount() > 0) {\n <div class=\"combobox-status-row hint\">\n <span>Showing {{ visibleFilteredOptions().length }} of {{ filteredOptions().length }} matches. Scroll down or</span>\n <button\n type=\"button\"\n class=\"combobox-load-all-btn\"\n (click)=\"loadAllFiltered(); $event.stopPropagation();\"\n >\n Load all {{ filteredOptions().length }}\n </button>\n </div>\n }\n }\n </div>\n </div>\n </ng-template>\n } @else {\n <!-- Native Browser Select Fallback -->\n <div class=\"rpt-select-wrapper\">\n <select\n [id]=\"elementId()\"\n [formControl]=\"formControl()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-select\"\n >\n @if (waitingFor().length > 0) {\n <option value=\"\" disabled selected>Waiting for {{ waitingLabel() }}...</option>\n } @else if (isLoading()) {\n <option value=\"\" disabled selected>Loading options from database...</option>\n } @else if (loadError()) {\n <option value=\"\" disabled selected>Error: {{ loadError() }}</option>\n } @else if (isDynamicSource() && hasLoaded() && allOptions().length === 0) {\n <option value=\"\" disabled selected>-- No records found (check parameters) --</option>\n } @else if (placeholder()) {\n <option value=\"\" [disabled]=\"config().validation?.required\">{{ placeholder() }}</option>\n }\n @for (opt of renderedOptions(); track opt.key) {\n <option [ngValue]=\"opt.key\">{{ opt.label }}</option>\n }\n @if (hasExcessOptions()) {\n <option value=\"\" disabled>... and {{ excessOptionsCount() }} more records (refine filter) ...</option>\n }\n </select>\n <div class=\"rpt-select-arrow\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n }\n\n @if (showStatus() && isDynamicSource() && statusText()) {\n <div class=\"rpt-status-badge\" [attr.data-status]=\"statusKind()\">\n @switch (statusKind()) {\n @case ('loading') {\n <span class=\"status-dot dot-pulse\"></span>\n <span>Loading from database\u2026</span>\n }\n @case ('ok') {\n <span class=\"status-dot dot-ok\"></span>\n <span>{{ dynamicOptions().length }} records loaded</span>\n }\n @case ('waiting') {\n <span class=\"status-dot dot-warn\"></span>\n <span>Waiting for:</span>\n <div class=\"waiting-tokens\">\n @for (k of waitingFor(); track k) {\n <span class=\"waiting-token\">{{ k }}</span>\n }\n </div>\n }\n @case ('error') {\n <span class=\"status-dot dot-err\"></span>\n <span>{{ loadError() }}</span>\n <button type=\"button\" class=\"rpt-badge-retry-btn\" (click)=\"retryLookup($event)\">\u21BB Retry</button>\n }\n @case ('empty') {\n <span class=\"status-dot\"></span>\n <span>No records found for parameters</span>\n }\n @default {\n <span class=\"status-dot\"></span>\n }\n }\n </div>\n }\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>", styles: [":host{display:block;width:100%;max-width:100%;min-width:0;box-sizing:border-box;font-family:var(--rpt-font-family, inherit);position:relative}.rpt-status-badge{display:flex;flex-wrap:wrap;align-items:center;gap:4px;font-size:.6875rem;padding:3px 6px;border-radius:4px;margin-top:4px;font-weight:500;line-height:1.3;max-width:100%;box-sizing:border-box;overflow:hidden;word-break:break-word}.rpt-status-badge>span{overflow-wrap:anywhere;word-break:break-word}.rpt-status-badge[data-status=loading]{background:#eff6ff;color:#2563eb;border:1px solid #dbeafe}.rpt-status-badge[data-status=ok]{background:#f0fdf4;color:#16a34a;border:1px solid #dcfce7}.rpt-status-badge[data-status=waiting]{background:#fffbeb;color:#d97706;border:1px solid #fef3c7}.rpt-status-badge[data-status=error]{background:#fef2f2;color:#dc2626;border:1px solid #fee2e2}.rpt-status-badge[data-status=empty]{background:#f8fafc;color:#64748b;border:1px solid #e2e8f0}.waiting-tokens{display:inline-flex;flex-wrap:wrap;align-items:center;gap:3px;margin-left:2px;max-width:100%}.waiting-token{background:#b453091f;border:1px solid rgba(180,83,9,.3);padding:1px 5px;border-radius:3px;font-weight:700;font-size:.625rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;box-sizing:border-box}.status-dot{width:6px;height:6px;border-radius:50%;background:currentColor}.dot-pulse{animation:rpt-pulse 1s infinite alternate}@keyframes rpt-pulse{0%{opacity:.3}to{opacity:1}}.rpt-field-group{display:flex;flex-direction:column;max-width:100%;min-width:0;gap:4px;box-sizing:border-box;position:relative}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-select-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex;align-items:center}.rpt-select{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 36px 6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);appearance:none;-webkit-appearance:none;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-select:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-select:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-select:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-select.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-select.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-select-arrow{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;color:var(--rpt-color-text-muted, #64748b);display:flex;align-items:center}.rpt-combobox-wrapper{position:relative;width:100%;flex:1;min-height:0}.rpt-combobox-trigger{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 10px 6px 12px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:var(--rpt-font-size-base, .875rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-combobox-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-combobox-trigger:focus-visible,.rpt-combobox-trigger.is-open{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-combobox-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-combobox-trigger.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-combobox-trigger.rpt-invalid:focus-visible{box-shadow:0 0 0 3px #ef444440}.trigger-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}.trigger-label.is-placeholder{color:var(--rpt-color-text-muted, #94a3b8)}.trigger-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.trigger-clear-btn{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.6875rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s ease,color .15s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.rpt-combobox-menu{width:100%;min-width:0;max-width:100vw;box-sizing:border-box;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #00000024,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:rpt-dropdown-pop .12s cubic-bezier(0,0,.2,1)}.rpt-combobox-menu.opens-above{box-shadow:0 -10px 25px -5px #00000024,0 -8px 10px -6px #00000014;animation:rpt-dropdown-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes rpt-dropdown-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes rpt-dropdown-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.combobox-search-box{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background-color:#f8fafc}.combobox-search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.combobox-search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .8125rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.combobox-search-input::placeholder{color:#94a3b8}.combobox-search-clear{border:none;background:#e2e8f0;color:#64748b;width:16px;height:16px;border-radius:50%;font-size:.625rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0}.combobox-search-clear:hover{background:#cbd5e1;color:#0f172a}.combobox-options-list{max-height:220px;overflow-y:auto;overscroll-behavior:contain;padding:4px}.combobox-option-item{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-radius:4px;font-size:var(--rpt-font-size-base, .84rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.combobox-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.combobox-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.opt-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opt-check{font-size:.875rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);margin-left:8px}.combobox-status-row{padding:10px 12px;font-size:.78rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.combobox-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:#2563eb}.combobox-status-row.error{display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--rpt-color-danger, #dc2626)}.trigger-retry-btn,.combobox-retry-btn,.rpt-badge-retry-btn{display:inline-flex;align-items:center;gap:3px;font-size:.6875rem;font-weight:600;color:#dc2626;background:#fee2e2;border:1px solid #fca5a5;border-radius:4px;padding:2px 7px;cursor:pointer;line-height:1.2;transition:background-color .12s ease,color .12s ease}.trigger-retry-btn:hover,.combobox-retry-btn:hover,.rpt-badge-retry-btn:hover{background:#fecaca;color:#b91c1c;border-color:#f87171}.combobox-status-row.hint{font-size:.72rem;color:#64748b;border-top:1px dashed #cbd5e1;margin-top:4px;padding:6px 10px;background-color:#f8fafc;display:flex;align-items:center;justify-content:space-between;gap:8px;position:sticky;bottom:0;z-index:2;box-shadow:0 -2px 6px #0000000a}.combobox-load-all-btn{background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.6875rem;font-weight:600;padding:3px 8px;border-radius:4px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:all .12s ease}.combobox-load-all-btn:hover{background:#2563eb;color:#fff;border-color:#2563eb}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i2.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
539
539
|
}
|
|
540
540
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptDropdownComponent, decorators: [{
|
|
541
541
|
type: Component,
|
|
542
542
|
args: [{ selector: 'rpt-dropdown', standalone: true, imports: [ReactiveFormsModule, OverlayModule], host: {
|
|
543
543
|
'[class.is-open]': 'isOpen()',
|
|
544
544
|
'[class.opens-above]': 'opensAbove()',
|
|
545
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, template: " <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n @if (isSearchable()) {\n <!-- Searchable Typeahead Combobox -->\n <div class=\"rpt-combobox-wrapper\" #comboboxWrapper #comboboxOrigin=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n <button\n type=\"button\"\n class=\"rpt-combobox-trigger\"\n [id]=\"elementId()\"\n [class.rpt-invalid]=\"isInvalid()\"\n [class.is-open]=\"isOpen()\"\n [disabled]=\"formControl().disabled\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n (click)=\"toggleOpen($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"trigger-label\" [class.is-placeholder]=\"!selectedOption()\">\n {{ selectedOption() ? selectedOption()!.label : placeholder() }}\n </span>\n\n <div class=\"trigger-actions\">\n @if (isLoading()) {\n <span class=\"status-dot dot-pulse\" style=\"color: #2563eb; margin-right: 4px;\" title=\"Executing query on database...\"></span>\n }\n @if (loadError() && !isLoading()) {\n <button\n type=\"button\"\n class=\"trigger-retry-btn\"\n title=\"Retry database query\"\n aria-label=\"Retry database query\"\n (click)=\"retryLookup($event)\"\n >\n \u21BB Retry\n </button>\n }\n @if (selectedOption() && !formControl().disabled) {\n <span\n role=\"button\"\n tabindex=\"0\"\n class=\"trigger-clear-btn\"\n title=\"Clear selection\"\n aria-label=\"Clear selection\"\n (click)=\"clearSelection($event)\"\n (keydown.enter)=\"clearSelection($event)\"\n (keydown.space)=\"clearSelection($event)\"\n >\n \u2715\n </span>\n }\n <span class=\"trigger-arrow\" [class.rotated]=\"isOpen()\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n </button>\n </div>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"comboboxOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"triggerWidth()\"\n [cdkConnectedOverlayMinWidth]=\"'min(180px, calc(100vw - 16px))'\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n (overlayOutsideClick)=\"closeDropdown()\"\n (positionChange)=\"onPositionChange($event)\"\n (attach)=\"onOverlayAttached()\"\n (detach)=\"closeDropdown()\"\n >\n <div\n class=\"rpt-combobox-menu\"\n [class.opens-above]=\"opensAbove()\"\n role=\"listbox\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Real-time Filter Search Box -->\n <div class=\"combobox-search-box\">\n <span class=\"combobox-search-icon\" aria-hidden=\"true\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n </span>\n <input\n #searchInput\n type=\"text\"\n class=\"combobox-search-input\"\n placeholder=\"Type to filter...\"\n [value]=\"searchTerm()\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? (elementId() + '_opt_' + focusedIndex()) : null\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n @if (searchTerm()) {\n <button\n type=\"button\"\n class=\"combobox-search-clear\"\n title=\"Clear filter\"\n (click)=\"clearSearch($event)\"\n >\n \u2715\n </button>\n }\n </div>\n\n <!-- Filtered Options List -->\n <div class=\"combobox-options-list\" #optionsListEl (scroll)=\"onOptionsScroll($event)\">\n @if (waitingFor().length > 0) {\n <div class=\"combobox-status-row waiting\">\n <span>Waiting for {{ waitingLabel() }}...</span>\n </div>\n } @else if (isLoading()) {\n <div class=\"combobox-status-row loading\">\n <span class=\"status-dot dot-pulse\"></span>\n <span>Executing query on database (may take 1\u20132 minutes on local database)...</span>\n </div>\n } @else if (loadError()) {\n <div class=\"combobox-status-row error\">\n <span>Error: {{ loadError() }}</span>\n <button type=\"button\" class=\"combobox-retry-btn\" (click)=\"retryLookup($event)\">\u21BB Retry Query</button>\n </div>\n } @else if (isDynamicSource() && hasLoaded() && allOptions().length === 0) {\n <div class=\"combobox-status-row empty\">\n <span>No records found (check parameters)</span>\n </div>\n } @else if (filteredOptions().length === 0) {\n <div class=\"combobox-status-row empty\">\n <span>No options matching \"{{ searchTerm() }}\"</span>\n </div>\n } @else {\n @for (opt of visibleFilteredOptions(); track opt.key; let i = $index) {\n <div\n role=\"option\"\n [id]=\"elementId() + '_opt_' + i\"\n class=\"combobox-option-item\"\n [class.is-selected]=\"isSelected(opt)\"\n [class.is-focused]=\"focusedIndex() === i\"\n [attr.aria-selected]=\"isSelected(opt)\"\n (click)=\"selectOption(opt)\"\n (mouseenter)=\"focusedIndex.set(i)\"\n >\n <span class=\"opt-label\">{{ opt.label }}</span>\n @if (isSelected(opt)) {\n <span class=\"opt-check\" aria-hidden=\"true\">\u2713</span>\n }\n </div>\n }\n @if (excessFilteredCount() > 0) {\n <div class=\"combobox-status-row hint\">\n <span>Showing {{ visibleFilteredOptions().length }} of {{ filteredOptions().length }} matches. Scroll down or</span>\n <button\n type=\"button\"\n class=\"combobox-load-all-btn\"\n (click)=\"loadAllFiltered(); $event.stopPropagation();\"\n >\n Load all {{ filteredOptions().length }}\n </button>\n </div>\n }\n }\n </div>\n </div>\n </ng-template>\n } @else {\n <!-- Native Browser Select Fallback -->\n <div class=\"rpt-select-wrapper\">\n <select\n [id]=\"elementId()\"\n [formControl]=\"formControl()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-select\"\n >\n @if (waitingFor().length > 0) {\n <option value=\"\" disabled selected>Waiting for {{ waitingLabel() }}...</option>\n } @else if (isLoading()) {\n <option value=\"\" disabled selected>Loading options from database...</option>\n } @else if (loadError()) {\n <option value=\"\" disabled selected>Error: {{ loadError() }}</option>\n } @else if (isDynamicSource() && hasLoaded() && allOptions().length === 0) {\n <option value=\"\" disabled selected>-- No records found (check parameters) --</option>\n } @else if (placeholder()) {\n <option value=\"\" [disabled]=\"config().validation?.required\">{{ placeholder() }}</option>\n }\n @for (opt of renderedOptions(); track opt.key) {\n <option [value]=\"opt.key\">{{ opt.label }}</option>\n }\n @if (hasExcessOptions()) {\n <option value=\"\" disabled>... and {{ excessOptionsCount() }} more records (refine filter) ...</option>\n }\n </select>\n <div class=\"rpt-select-arrow\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n }\n\n @if (showStatus() && isDynamicSource() && statusText()) {\n <div class=\"rpt-status-badge\" [attr.data-status]=\"statusKind()\">\n @switch (statusKind()) {\n @case ('loading') {\n <span class=\"status-dot dot-pulse\"></span>\n <span>Loading from database\u2026</span>\n }\n @case ('ok') {\n <span class=\"status-dot dot-ok\"></span>\n <span>{{ dynamicOptions().length }} records loaded</span>\n }\n @case ('waiting') {\n <span class=\"status-dot dot-warn\"></span>\n <span>Waiting for:</span>\n <div class=\"waiting-tokens\">\n @for (k of waitingFor(); track k) {\n <span class=\"waiting-token\">{{ k }}</span>\n }\n </div>\n }\n @case ('error') {\n <span class=\"status-dot dot-err\"></span>\n <span>{{ loadError() }}</span>\n <button type=\"button\" class=\"rpt-badge-retry-btn\" (click)=\"retryLookup($event)\">\u21BB Retry</button>\n }\n @case ('empty') {\n <span class=\"status-dot\"></span>\n <span>No records found for parameters</span>\n }\n @default {\n <span class=\"status-dot\"></span>\n }\n }\n </div>\n }\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>", styles: [":host{display:block;width:100%;max-width:100%;min-width:0;box-sizing:border-box;font-family:var(--rpt-font-family, inherit);position:relative}.rpt-status-badge{display:flex;flex-wrap:wrap;align-items:center;gap:4px;font-size:.6875rem;padding:3px 6px;border-radius:4px;margin-top:4px;font-weight:500;line-height:1.3;max-width:100%;box-sizing:border-box;overflow:hidden;word-break:break-word}.rpt-status-badge>span{overflow-wrap:anywhere;word-break:break-word}.rpt-status-badge[data-status=loading]{background:#eff6ff;color:#2563eb;border:1px solid #dbeafe}.rpt-status-badge[data-status=ok]{background:#f0fdf4;color:#16a34a;border:1px solid #dcfce7}.rpt-status-badge[data-status=waiting]{background:#fffbeb;color:#d97706;border:1px solid #fef3c7}.rpt-status-badge[data-status=error]{background:#fef2f2;color:#dc2626;border:1px solid #fee2e2}.rpt-status-badge[data-status=empty]{background:#f8fafc;color:#64748b;border:1px solid #e2e8f0}.waiting-tokens{display:inline-flex;flex-wrap:wrap;align-items:center;gap:3px;margin-left:2px;max-width:100%}.waiting-token{background:#b453091f;border:1px solid rgba(180,83,9,.3);padding:1px 5px;border-radius:3px;font-weight:700;font-size:.625rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;box-sizing:border-box}.status-dot{width:6px;height:6px;border-radius:50%;background:currentColor}.dot-pulse{animation:rpt-pulse 1s infinite alternate}@keyframes rpt-pulse{0%{opacity:.3}to{opacity:1}}.rpt-field-group{display:flex;flex-direction:column;max-width:100%;min-width:0;gap:4px;box-sizing:border-box;position:relative}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-select-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex;align-items:center}.rpt-select{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 36px 6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);appearance:none;-webkit-appearance:none;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-select:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-select:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-select:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-select.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-select.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-select-arrow{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;color:var(--rpt-color-text-muted, #64748b);display:flex;align-items:center}.rpt-combobox-wrapper{position:relative;width:100%;flex:1;min-height:0}.rpt-combobox-trigger{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 10px 6px 12px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:var(--rpt-font-size-base, .875rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-combobox-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-combobox-trigger:focus-visible,.rpt-combobox-trigger.is-open{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-combobox-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-combobox-trigger.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-combobox-trigger.rpt-invalid:focus-visible{box-shadow:0 0 0 3px #ef444440}.trigger-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}.trigger-label.is-placeholder{color:var(--rpt-color-text-muted, #94a3b8)}.trigger-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.trigger-clear-btn{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.6875rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s ease,color .15s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.rpt-combobox-menu{width:100%;min-width:0;max-width:100vw;box-sizing:border-box;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #00000024,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:rpt-dropdown-pop .12s cubic-bezier(0,0,.2,1)}.rpt-combobox-menu.opens-above{box-shadow:0 -10px 25px -5px #00000024,0 -8px 10px -6px #00000014;animation:rpt-dropdown-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes rpt-dropdown-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes rpt-dropdown-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.combobox-search-box{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background-color:#f8fafc}.combobox-search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.combobox-search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .8125rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.combobox-search-input::placeholder{color:#94a3b8}.combobox-search-clear{border:none;background:#e2e8f0;color:#64748b;width:16px;height:16px;border-radius:50%;font-size:.625rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0}.combobox-search-clear:hover{background:#cbd5e1;color:#0f172a}.combobox-options-list{max-height:220px;overflow-y:auto;overscroll-behavior:contain;padding:4px}.combobox-option-item{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-radius:4px;font-size:var(--rpt-font-size-base, .84rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.combobox-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.combobox-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.opt-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opt-check{font-size:.875rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);margin-left:8px}.combobox-status-row{padding:10px 12px;font-size:.78rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.combobox-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:#2563eb}.combobox-status-row.error{display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--rpt-color-danger, #dc2626)}.trigger-retry-btn,.combobox-retry-btn,.rpt-badge-retry-btn{display:inline-flex;align-items:center;gap:3px;font-size:.6875rem;font-weight:600;color:#dc2626;background:#fee2e2;border:1px solid #fca5a5;border-radius:4px;padding:2px 7px;cursor:pointer;line-height:1.2;transition:background-color .12s ease,color .12s ease}.trigger-retry-btn:hover,.combobox-retry-btn:hover,.rpt-badge-retry-btn:hover{background:#fecaca;color:#b91c1c;border-color:#f87171}.combobox-status-row.hint{font-size:.72rem;color:#64748b;border-top:1px dashed #cbd5e1;margin-top:4px;padding:6px 10px;background-color:#f8fafc;display:flex;align-items:center;justify-content:space-between;gap:8px;position:sticky;bottom:0;z-index:2;box-shadow:0 -2px 6px #0000000a}.combobox-load-all-btn{background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.6875rem;font-weight:600;padding:3px 8px;border-radius:4px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:all .12s ease}.combobox-load-all-btn:hover{background:#2563eb;color:#fff;border-color:#2563eb}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"] }]
|
|
545
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: " <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n @if (isSearchable()) {\n <!-- Searchable Typeahead Combobox -->\n <div class=\"rpt-combobox-wrapper\" #comboboxWrapper #comboboxOrigin=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n <button\n type=\"button\"\n class=\"rpt-combobox-trigger\"\n [id]=\"elementId()\"\n [class.rpt-invalid]=\"isInvalid()\"\n [class.is-open]=\"isOpen()\"\n [disabled]=\"formControl().disabled\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n (click)=\"toggleOpen($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"trigger-label\" [class.is-placeholder]=\"!selectedOption()\">\n {{ selectedOption() ? selectedOption()!.label : placeholder() }}\n </span>\n\n <div class=\"trigger-actions\">\n @if (isLoading()) {\n <span class=\"status-dot dot-pulse\" style=\"color: #2563eb; margin-right: 4px;\" title=\"Executing query on database...\"></span>\n }\n @if (loadError() && !isLoading()) {\n <button\n type=\"button\"\n class=\"trigger-retry-btn\"\n title=\"Retry database query\"\n aria-label=\"Retry database query\"\n (click)=\"retryLookup($event)\"\n >\n \u21BB Retry\n </button>\n }\n @if (selectedOption() && !formControl().disabled) {\n <span\n role=\"button\"\n tabindex=\"0\"\n class=\"trigger-clear-btn\"\n title=\"Clear selection\"\n aria-label=\"Clear selection\"\n (click)=\"clearSelection($event)\"\n (keydown.enter)=\"clearSelection($event)\"\n (keydown.space)=\"clearSelection($event)\"\n >\n \u2715\n </span>\n }\n <span class=\"trigger-arrow\" [class.rotated]=\"isOpen()\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n </button>\n </div>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"comboboxOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"triggerWidth()\"\n [cdkConnectedOverlayMinWidth]=\"'min(180px, calc(100vw - 16px))'\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n (overlayOutsideClick)=\"closeDropdown()\"\n (positionChange)=\"onPositionChange($event)\"\n (attach)=\"onOverlayAttached()\"\n (detach)=\"closeDropdown()\"\n >\n <div\n class=\"rpt-combobox-menu\"\n [class.opens-above]=\"opensAbove()\"\n role=\"listbox\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Real-time Filter Search Box -->\n <div class=\"combobox-search-box\">\n <span class=\"combobox-search-icon\" aria-hidden=\"true\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n </span>\n <input\n #searchInput\n type=\"text\"\n class=\"combobox-search-input\"\n placeholder=\"Type to filter...\"\n [value]=\"searchTerm()\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? (elementId() + '_opt_' + focusedIndex()) : null\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n @if (searchTerm()) {\n <button\n type=\"button\"\n class=\"combobox-search-clear\"\n title=\"Clear filter\"\n (click)=\"clearSearch($event)\"\n >\n \u2715\n </button>\n }\n </div>\n\n <!-- Filtered Options List -->\n <div class=\"combobox-options-list\" #optionsListEl (scroll)=\"onOptionsScroll($event)\">\n @if (waitingFor().length > 0) {\n <div class=\"combobox-status-row waiting\">\n <span>Waiting for {{ waitingLabel() }}...</span>\n </div>\n } @else if (isLoading()) {\n <div class=\"combobox-status-row loading\">\n <span class=\"status-dot dot-pulse\"></span>\n <span>Executing query on database (may take 1\u20132 minutes on local database)...</span>\n </div>\n } @else if (loadError()) {\n <div class=\"combobox-status-row error\">\n <span>Error: {{ loadError() }}</span>\n <button type=\"button\" class=\"combobox-retry-btn\" (click)=\"retryLookup($event)\">\u21BB Retry Query</button>\n </div>\n } @else if (isDynamicSource() && hasLoaded() && allOptions().length === 0) {\n <div class=\"combobox-status-row empty\">\n <span>No records found (check parameters)</span>\n </div>\n } @else if (filteredOptions().length === 0) {\n <div class=\"combobox-status-row empty\">\n <span>No options matching \"{{ searchTerm() }}\"</span>\n </div>\n } @else {\n @for (opt of visibleFilteredOptions(); track opt.key; let i = $index) {\n <div\n role=\"option\"\n [id]=\"elementId() + '_opt_' + i\"\n class=\"combobox-option-item\"\n [class.is-selected]=\"isSelected(opt)\"\n [class.is-focused]=\"focusedIndex() === i\"\n [attr.aria-selected]=\"isSelected(opt)\"\n (click)=\"selectOption(opt)\"\n (mouseenter)=\"focusedIndex.set(i)\"\n >\n <span class=\"opt-label\">{{ opt.label }}</span>\n @if (isSelected(opt)) {\n <span class=\"opt-check\" aria-hidden=\"true\">\u2713</span>\n }\n </div>\n }\n @if (excessFilteredCount() > 0) {\n <div class=\"combobox-status-row hint\">\n <span>Showing {{ visibleFilteredOptions().length }} of {{ filteredOptions().length }} matches. Scroll down or</span>\n <button\n type=\"button\"\n class=\"combobox-load-all-btn\"\n (click)=\"loadAllFiltered(); $event.stopPropagation();\"\n >\n Load all {{ filteredOptions().length }}\n </button>\n </div>\n }\n }\n </div>\n </div>\n </ng-template>\n } @else {\n <!-- Native Browser Select Fallback -->\n <div class=\"rpt-select-wrapper\">\n <select\n [id]=\"elementId()\"\n [formControl]=\"formControl()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-select\"\n >\n @if (waitingFor().length > 0) {\n <option value=\"\" disabled selected>Waiting for {{ waitingLabel() }}...</option>\n } @else if (isLoading()) {\n <option value=\"\" disabled selected>Loading options from database...</option>\n } @else if (loadError()) {\n <option value=\"\" disabled selected>Error: {{ loadError() }}</option>\n } @else if (isDynamicSource() && hasLoaded() && allOptions().length === 0) {\n <option value=\"\" disabled selected>-- No records found (check parameters) --</option>\n } @else if (placeholder()) {\n <option value=\"\" [disabled]=\"config().validation?.required\">{{ placeholder() }}</option>\n }\n @for (opt of renderedOptions(); track opt.key) {\n <option [ngValue]=\"opt.key\">{{ opt.label }}</option>\n }\n @if (hasExcessOptions()) {\n <option value=\"\" disabled>... and {{ excessOptionsCount() }} more records (refine filter) ...</option>\n }\n </select>\n <div class=\"rpt-select-arrow\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n }\n\n @if (showStatus() && isDynamicSource() && statusText()) {\n <div class=\"rpt-status-badge\" [attr.data-status]=\"statusKind()\">\n @switch (statusKind()) {\n @case ('loading') {\n <span class=\"status-dot dot-pulse\"></span>\n <span>Loading from database\u2026</span>\n }\n @case ('ok') {\n <span class=\"status-dot dot-ok\"></span>\n <span>{{ dynamicOptions().length }} records loaded</span>\n }\n @case ('waiting') {\n <span class=\"status-dot dot-warn\"></span>\n <span>Waiting for:</span>\n <div class=\"waiting-tokens\">\n @for (k of waitingFor(); track k) {\n <span class=\"waiting-token\">{{ k }}</span>\n }\n </div>\n }\n @case ('error') {\n <span class=\"status-dot dot-err\"></span>\n <span>{{ loadError() }}</span>\n <button type=\"button\" class=\"rpt-badge-retry-btn\" (click)=\"retryLookup($event)\">\u21BB Retry</button>\n }\n @case ('empty') {\n <span class=\"status-dot\"></span>\n <span>No records found for parameters</span>\n }\n @default {\n <span class=\"status-dot\"></span>\n }\n }\n </div>\n }\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>", styles: [":host{display:block;width:100%;max-width:100%;min-width:0;box-sizing:border-box;font-family:var(--rpt-font-family, inherit);position:relative}.rpt-status-badge{display:flex;flex-wrap:wrap;align-items:center;gap:4px;font-size:.6875rem;padding:3px 6px;border-radius:4px;margin-top:4px;font-weight:500;line-height:1.3;max-width:100%;box-sizing:border-box;overflow:hidden;word-break:break-word}.rpt-status-badge>span{overflow-wrap:anywhere;word-break:break-word}.rpt-status-badge[data-status=loading]{background:#eff6ff;color:#2563eb;border:1px solid #dbeafe}.rpt-status-badge[data-status=ok]{background:#f0fdf4;color:#16a34a;border:1px solid #dcfce7}.rpt-status-badge[data-status=waiting]{background:#fffbeb;color:#d97706;border:1px solid #fef3c7}.rpt-status-badge[data-status=error]{background:#fef2f2;color:#dc2626;border:1px solid #fee2e2}.rpt-status-badge[data-status=empty]{background:#f8fafc;color:#64748b;border:1px solid #e2e8f0}.waiting-tokens{display:inline-flex;flex-wrap:wrap;align-items:center;gap:3px;margin-left:2px;max-width:100%}.waiting-token{background:#b453091f;border:1px solid rgba(180,83,9,.3);padding:1px 5px;border-radius:3px;font-weight:700;font-size:.625rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;box-sizing:border-box}.status-dot{width:6px;height:6px;border-radius:50%;background:currentColor}.dot-pulse{animation:rpt-pulse 1s infinite alternate}@keyframes rpt-pulse{0%{opacity:.3}to{opacity:1}}.rpt-field-group{display:flex;flex-direction:column;max-width:100%;min-width:0;gap:4px;box-sizing:border-box;position:relative}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-select-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex;align-items:center}.rpt-select{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 36px 6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);appearance:none;-webkit-appearance:none;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-select:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-select:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-select:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-select.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-select.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-select-arrow{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;color:var(--rpt-color-text-muted, #64748b);display:flex;align-items:center}.rpt-combobox-wrapper{position:relative;width:100%;flex:1;min-height:0}.rpt-combobox-trigger{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 10px 6px 12px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:var(--rpt-font-size-base, .875rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-combobox-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-combobox-trigger:focus-visible,.rpt-combobox-trigger.is-open{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-combobox-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-combobox-trigger.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-combobox-trigger.rpt-invalid:focus-visible{box-shadow:0 0 0 3px #ef444440}.trigger-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}.trigger-label.is-placeholder{color:var(--rpt-color-text-muted, #94a3b8)}.trigger-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.trigger-clear-btn{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.6875rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s ease,color .15s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.rpt-combobox-menu{width:100%;min-width:0;max-width:100vw;box-sizing:border-box;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #00000024,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:rpt-dropdown-pop .12s cubic-bezier(0,0,.2,1)}.rpt-combobox-menu.opens-above{box-shadow:0 -10px 25px -5px #00000024,0 -8px 10px -6px #00000014;animation:rpt-dropdown-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes rpt-dropdown-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes rpt-dropdown-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.combobox-search-box{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background-color:#f8fafc}.combobox-search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.combobox-search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .8125rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.combobox-search-input::placeholder{color:#94a3b8}.combobox-search-clear{border:none;background:#e2e8f0;color:#64748b;width:16px;height:16px;border-radius:50%;font-size:.625rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0}.combobox-search-clear:hover{background:#cbd5e1;color:#0f172a}.combobox-options-list{max-height:220px;overflow-y:auto;overscroll-behavior:contain;padding:4px}.combobox-option-item{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-radius:4px;font-size:var(--rpt-font-size-base, .84rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.combobox-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.combobox-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.opt-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opt-check{font-size:.875rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);margin-left:8px}.combobox-status-row{padding:10px 12px;font-size:.78rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.combobox-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:#2563eb}.combobox-status-row.error{display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--rpt-color-danger, #dc2626)}.trigger-retry-btn,.combobox-retry-btn,.rpt-badge-retry-btn{display:inline-flex;align-items:center;gap:3px;font-size:.6875rem;font-weight:600;color:#dc2626;background:#fee2e2;border:1px solid #fca5a5;border-radius:4px;padding:2px 7px;cursor:pointer;line-height:1.2;transition:background-color .12s ease,color .12s ease}.trigger-retry-btn:hover,.combobox-retry-btn:hover,.rpt-badge-retry-btn:hover{background:#fecaca;color:#b91c1c;border-color:#f87171}.combobox-status-row.hint{font-size:.72rem;color:#64748b;border-top:1px dashed #cbd5e1;margin-top:4px;padding:6px 10px;background-color:#f8fafc;display:flex;align-items:center;justify-content:space-between;gap:8px;position:sticky;bottom:0;z-index:2;box-shadow:0 -2px 6px #0000000a}.combobox-load-all-btn{background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.6875rem;font-weight:600;padding:3px 8px;border-radius:4px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:all .12s ease}.combobox-load-all-btn:hover{background:#2563eb;color:#fff;border-color:#2563eb}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"] }]
|
|
546
546
|
}], ctorParameters: () => [], propDecorators: { onDocumentClick: [{
|
|
547
547
|
type: HostListener,
|
|
548
548
|
args: ['document:click', ['$event']]
|
|
@@ -550,4 +550,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
550
550
|
type: HostListener,
|
|
551
551
|
args: ['document:keydown.escape']
|
|
552
552
|
}] } });
|
|
553
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9kcm9wZG93bi9ycHQtZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvcHJpbWl0aXZlcy9jb21wb25lbnRzL2Ryb3Bkb3duL3JwdC1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNyRixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFHTCxhQUFhLEdBRWQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDekYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDcEcsT0FBTyxFQUFFLGdC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QUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9ydE92ZXJsYXlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtb3ZlcmxheS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIENvbm5lY3RlZFBvc2l0aW9uLFxuICBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsXG4gIE92ZXJsYXlNb2R1bGUsXG4gIFNjcm9sbFN0cmF0ZWd5LFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBnZXRWYWxpZGF0aW9uTWVzc2FnZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdmFsaWRhdGlvbi92YWxpZGF0aW9uLWZhY3RvcnknO1xuaW1wb3J0IHsgTWFzdGVyRGF0YVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL21hc3Rlci1kYXRhLnByb3ZpZGVyJztcbmltcG9ydCB7IFJlcG9ydExvb2t1cEFkYXB0ZXIgfSBmcm9tICcuLi8uLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvbG9va3VwLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LXNlc3Npb24tY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IFJFUE9SVElOR19DT05GSUcgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3Rva2Vucy9yZXBvcnRpbmctY29uZmlnLnRva2VuJztcbmltcG9ydCB7IFNlc3Npb25Db250ZXh0TWFwIH0gZnJvbSAnLi4vLi4vLi4vY29yZS90b2tlbnMvc2Vzc2lvbi1jb250ZXh0LnRva2VuJztcbmltcG9ydCB7XG4gIGZpbmRNaXNzaW5nQ2FudmFzRmllbGRzLFxuICByZXNvbHZlUGFyYW1ldGVyTWFwcGluZ3MsXG59IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMvcmVwb3J0LXBhcmFtZXRlci51dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBEcm9wZG93bk9wdGlvbiB7XG4gIGtleTogc3RyaW5nIHwgbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtZHJvcGRvd24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZSwgT3ZlcmxheU1vZHVsZV0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmlzLW9wZW5dJzogJ2lzT3BlbigpJyxcbiAgICAnW2NsYXNzLm9wZW5zLWFib3ZlXSc6ICdvcGVuc0Fib3ZlKCknLFxuICB9LFxuICB0ZW1wbGF0ZVVybDogJy4vcnB0LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3JwdC1kcm9wZG93bi5jb21wb25lbnQuY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJwdERyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXN0ZXJEYXRhUHJvdmlkZXIgPSBpbmplY3QoTWFzdGVyRGF0YVByb3ZpZGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvb2t1cEFkYXB0ZXIgPSBpbmplY3QoUmVwb3J0TG9va3VwQWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uU2VydmljZSA9IGluamVjdChSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRpbmdDb25maWcgPSBpbmplY3QoUkVQT1JUSU5HX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICByZWFkb25seSBzY3JvbGxTdHJhdGVneTogU2Nyb2xsU3RyYXRlZ3kgPSBpbmplY3QoUmVwb3J0T3ZlcmxheVNlcnZpY2UpLnNjcm9sbFN0cmF0ZWd5KCgpID0+IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgcmVhZG9ubHkgdHJpZ2dlcldpZHRoID0gc2lnbmFsPG51bWJlciB8IHN0cmluZz4oJ2F1dG8nKTtcblxuICByZWFkb25seSBvdmVybGF5UG9zaXRpb25zOiBDb25uZWN0ZWRQb3NpdGlvbltdID0gW1xuICAgIHtcbiAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgb2Zmc2V0WTogNCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgb2Zmc2V0WTogLTQsXG4gICAgfSxcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgb2Zmc2V0WTogNCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICBvZmZzZXRZOiAtNCxcbiAgICB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24+KCk7XG4gIHJlYWRvbmx5IGNvbnRyb2wgPSBpbnB1dDxGb3JtQ29udHJvbCB8IG51bGwgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IHBhcmVudEZvcm0gPSBpbnB1dDxGb3JtR3JvdXAgfCBudWxsPihudWxsKTtcbiAgLyoqIERlc2lnbmVyIG1vZGU6IHNob3dzIGEgc21hbGwgc3RhdHVzIGxpbmUgKExvYWRpbmcgLyBOIHJlY29yZHMgLyBXYWl0aW5nIGZvcuKApikuICovXG4gIHJlYWRvbmx5IHNob3dTdGF0dXMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duQ2xpY2sgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZhbGxiYWNrQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gIHJlYWRvbmx5IGR5bmFtaWNPcHRpb25zID0gc2lnbmFsPERyb3Bkb3duT3B0aW9uW10+KFtdKTtcbiAgcHJpdmF0ZSBsb29rdXBTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgbWFzdGVyRGF0YVN1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBmb3JtQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSByZWxvYWRUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIGxhc3RSZXF1ZXN0S2V5ID0gJyc7XG5cbiAgLy8gQ29tYm9ib3ggaW50ZXJhY3RpdmUgc3RhdGVcbiAgcmVhZG9ubHkgaXNPcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgb3BlbnNBYm92ZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNlYXJjaFRlcm0gPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGZvY3VzZWRJbmRleCA9IHNpZ25hbDxudW1iZXI+KC0xKTtcbiAgcmVhZG9ubHkgY3VycmVudFZhbHVlID0gc2lnbmFsPHVua25vd24+KG51bGwpO1xuICByZWFkb25seSBjb21ib2JveFdyYXBwZXJFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ2NvbWJvYm94V3JhcHBlcicpO1xuICByZWFkb25seSBzZWFyY2hJbnB1dEVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdzZWFyY2hJbnB1dCcpO1xuICByZWFkb25seSBvcHRpb25zTGlzdEVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pignb3B0aW9uc0xpc3RFbCcpO1xuXG4gIHByaXZhdGUgY29udHJvbFN1Yj86IFN1YnNjcmlwdGlvbjtcblxuICByZWFkb25seSBmb3JtQ29udHJvbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29udHJvbCgpID8/IHRoaXMuZmFsbGJhY2tDb250cm9sKTtcbiAgcmVhZG9ubHkgZWxlbWVudElkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb25maWcoKS5rZXkgfHwgdGhpcy5jb25maWcoKS5pZCk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gKHRoaXMuY29uZmlnKCkucHJvcGVydGllcz8uWydwbGFjZWhvbGRlciddIGFzIHN0cmluZykgPz8gJy0tIFNlbGVjdCAtLSdcbiAgKTtcblxuICByZWFkb25seSBpc1NlYXJjaGFibGUgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/LlsnbmF0aXZlU2VsZWN0J10gIT09IHRydWVcbiAgKTtcblxuICByZWFkb25seSBpc0xvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBoYXNMb2FkZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBsb2FkRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBDYW52YXMgZmllbGQga2V5cyB0aGF0IG11c3QgYmUgZmlsbGVkIGJlZm9yZSB0aGUgbG9va3VwIGNhbiBydW4uICovXG4gIHJlYWRvbmx5IHdhaXRpbmdGb3IgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcblxuICByZWFkb25seSBpc0R5bmFtaWNTb3VyY2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZHMgPSB0aGlzLmNvbmZpZygpLmRhdGFTb3VyY2U7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZHMgJiZcbiAgICAgIChkcy5zb3VyY2VUeXBlID09PSAndGFibGUnIHx8XG4gICAgICAgIGRzLnNvdXJjZVR5cGUgPT09ICdwcm9jZWR1cmUnIHx8XG4gICAgICAgIGRzLnNvdXJjZVR5cGUgPT09ICdhcGknIHx8XG4gICAgICAgIGRzLmFwaUVuZHBvaW50IHx8XG4gICAgICAgIGRzLmVudGl0eU5hbWUgfHxcbiAgICAgICAgZHMubWFzdGVyTmFtZSlcbiAgICApO1xuICB9KTtcblxuICByZWFkb25seSBzdGF0aWNPcHRpb25zID0gY29tcHV0ZWQ8RHJvcGRvd25PcHRpb25bXT4oKCkgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/Llsnb3B0aW9ucyddO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMpKSB7XG4gICAgICByZXR1cm4gb3B0cztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9KTtcblxuICByZWFkb25seSBhbGxPcHRpb25zID0gY29tcHV0ZWQ8RHJvcGRvd25PcHRpb25bXT4oKCkgPT4ge1xuICAgIGlmICh0aGlzLmlzRHluYW1pY1NvdXJjZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5keW5hbWljT3B0aW9ucygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0aWNPcHRpb25zKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkT3B0aW9uID0gY29tcHV0ZWQ8RHJvcGRvd25PcHRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5jdXJyZW50VmFsdWUoKTtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gJycpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHN0clZhbCA9IFN0cmluZyh2YWwpO1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5hbGxPcHRpb25zKCkuZmluZCgob3B0KSA9PiBTdHJpbmcob3B0LmtleSkgPT09IHN0clZhbCk7XG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgcmV0dXJuIHsga2V5OiB2YWwgYXMgc3RyaW5nIHwgbnVtYmVyLCBsYWJlbDogc3RyVmFsIH07XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGZpbHRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCB0ZXJtID0gdGhpcy5zZWFyY2hUZXJtKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgYWxsID0gdGhpcy5hbGxPcHRpb25zKCk7XG4gICAgaWYgKCF0ZXJtKSByZXR1cm4gYWxsO1xuICAgIHJldHVybiBhbGwuZmlsdGVyKChvcHQpID0+XG4gICAgICBvcHQubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSB8fCBTdHJpbmcob3B0LmtleSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKVxuICAgICk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IE1BWF9GSUxURVJfUkVOREVSID0gMjAwO1xuICByZWFkb25seSBJTklUSUFMX0ZJTFRFUl9SRU5ERVIgPSAyMDA7XG4gIHJlYWRvbmx5IGZpbHRlclJlbmRlckxpbWl0ID0gc2lnbmFsPG51bWJlcj4oMjAwKTtcblxuICByZWFkb25seSB2aXNpYmxlRmlsdGVyZWRPcHRpb25zID0gY29tcHV0ZWQ8RHJvcGRvd25PcHRpb25bXT4oKCkgPT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcbiAgICBjb25zdCBsaW1pdCA9IHRoaXMuZmlsdGVyUmVuZGVyTGltaXQoKTtcbiAgICBpZiAoZmlsdGVyZWQubGVuZ3RoIDw9IGxpbWl0KSByZXR1cm4gZmlsdGVyZWQ7XG4gICAgcmV0dXJuIGZpbHRlcmVkLnNsaWNlKDAsIGxpbWl0KTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZXhjZXNzRmlsdGVyZWRDb3VudCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCAtIHRoaXMuZmlsdGVyUmVuZGVyTGltaXQoKSk7XG4gIH0pO1xuXG4gIG9uT3B0aW9uc1Njcm9sbChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgaWYgKGVsLnNjcm9sbFRvcCArIGVsLmNsaWVudEhlaWdodCA+PSBlbC5zY3JvbGxIZWlnaHQgLSAxMjApIHtcbiAgICAgIHRoaXMubG9hZE1vcmVGaWx0ZXJlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRNb3JlRmlsdGVyZWQoKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aDtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5maWx0ZXJSZW5kZXJMaW1pdCgpO1xuICAgIGlmIChjdXJyZW50IDwgdG90YWwpIHtcbiAgICAgIHRoaXMuZmlsdGVyUmVuZGVyTGltaXQudXBkYXRlKChjKSA9PiBNYXRoLm1pbih0b3RhbCwgYyArIDIwMCkpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRBbGxGaWx0ZXJlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlclJlbmRlckxpbWl0LnNldCh0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCk7XG4gIH1cblxuICByZWFkb25seSBNQVhfUkVOREVSRURfT1BUSU9OUyA9IDUwMDA7XG4gIHJlYWRvbmx5IHJlbmRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5hbGxPcHRpb25zKCk7XG4gICAgaWYgKG9wdHMubGVuZ3RoIDw9IHRoaXMuTUFYX1JFTkRFUkVEX09QVElPTlMpIHJldHVybiBvcHRzO1xuICAgIHJldHVybiBvcHRzLnNsaWNlKDAsIHRoaXMuTUFYX1JFTkRFUkVEX09QVElPTlMpO1xuICB9KTtcbiAgcmVhZG9ubHkgaGFzRXhjZXNzT3B0aW9ucyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5hbGxPcHRpb25zKCkubGVuZ3RoID4gdGhpcy5NQVhfUkVOREVSRURfT1BUSU9OUztcbiAgfSk7XG4gIHJlYWRvbmx5IGV4Y2Vzc09wdGlvbnNDb3VudCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLmFsbE9wdGlvbnMoKS5sZW5ndGggLSB0aGlzLk1BWF9SRU5ERVJFRF9PUFRJT05TKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgd2FpdGluZ0xhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGtleXMgPSB0aGlzLndhaXRpbmdGb3IoKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICByZXR1cm4ga2V5cy5qb2luKCcsICcpO1xuICB9KTtcblxuICByZWFkb25seSBzdGF0dXNLaW5kID0gY29tcHV0ZWQ8J2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ29rJyB8ICd3YWl0aW5nJyB8ICdlcnJvcicgfCAnZW1wdHknPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmlzRHluYW1pY1NvdXJjZSgpKSByZXR1cm4gJ2lkbGUnO1xuICAgIGlmICh0aGlzLmlzTG9hZGluZygpKSByZXR1cm4gJ2xvYWRpbmcnO1xuICAgIGlmICh0aGlzLmxvYWRFcnJvcigpKSByZXR1cm4gJ2Vycm9yJztcbiAgICBpZiAodGhpcy53YWl0aW5nRm9yKCkubGVuZ3RoID4gMCkgcmV0dXJuICd3YWl0aW5nJztcbiAgICBpZiAodGhpcy5oYXNMb2FkZWQoKSkgcmV0dXJuIHRoaXMuZHluYW1pY09wdGlvbnMoKS5sZW5ndGggPiAwID8gJ29rJyA6ICdlbXB0eSc7XG4gICAgcmV0dXJuICdpZGxlJztcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc3RhdHVzVGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMuc3RhdHVzS2luZCgpKSB7XG4gICAgICBjYXNlICdsb2FkaW5nJzpcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbmZpZygpLmRhdGFTb3VyY2U/LnNvdXJjZVR5cGUgPT09ICdhcGknIHx8IHRoaXMuY29uZmlnKCkuZGF0YVNvdXJjZT8uYXBpRW5kcG9pbnQpXG4gICAgICAgICAgPyAnTG9hZGluZyBmcm9tIEFQSeKApidcbiAgICAgICAgICA6ICdMb2FkaW5nIGZyb20gZGF0YWJhc2XigKYnO1xuICAgICAgY2FzZSAnb2snOlxuICAgICAgICByZXR1cm4gYCR7dGhpcy5keW5hbWljT3B0aW9ucygpLmxlbmd0aH0gcmVjb3JkcyBsb2FkZWRgO1xuICAgICAgY2FzZSAnd2FpdGluZyc6XG4gICAgICAgIHJldHVybiBgV2FpdGluZyBmb3I6ICR7dGhpcy53YWl0aW5nTGFiZWwoKX1gO1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkRXJyb3IoKSA/PyAnRmFpbGVkIHRvIGxvYWQnO1xuICAgICAgY2FzZSAnZW1wdHknOlxuICAgICAgICByZXR1cm4gJ1F1ZXJ5IHJldHVybmVkIG5vIHJlY29yZHMgZm9yIHRoZXNlIHBhcmFtZXRlcnMnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVhZG9ubHkgaXNJbnZhbGlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmZvcm1Db250cm9sKCk7XG4gICAgcmV0dXJuIGN0cmwuaW52YWxpZCAmJiAoY3RybC5kaXJ0eSB8fCBjdHJsLnRvdWNoZWQpO1xuICB9KTtcblxuICByZWFkb25seSBlcnJvck1lc3NhZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybUNvbnRyb2woKTtcbiAgICBpZiAoIWN0cmwuaW52YWxpZCB8fCAoIWN0cmwuZGlydHkgJiYgIWN0cmwudG91Y2hlZCkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3QgZXJyb3JzID0gY3RybC5lcnJvcnM7XG4gICAgaWYgKCFlcnJvcnMpIHJldHVybiAnJztcbiAgICBjb25zdCBmaXJzdEtleSA9IE9iamVjdC5rZXlzKGVycm9ycylbMF07XG4gICAgcmV0dXJuIGdldFZhbGlkYXRpb25NZXNzYWdlKHRoaXMuY29uZmlnKCkudmFsaWRhdGlvbiwgZmlyc3RLZXkpO1xuICB9KTtcblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBOb2RlO1xuICAgIGlmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnKVxuICBvbkVzY2FwZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgfVxuICB9XG5cbiAgaXNTZWxlY3RlZChvcHQ6IERyb3Bkb3duT3B0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5jdXJyZW50VmFsdWUoKTtcbiAgICBpZiAoY3VyID09PSBudWxsIHx8IGN1ciA9PT0gdW5kZWZpbmVkIHx8IGN1ciA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gU3RyaW5nKGN1cikgPT09IFN0cmluZyhvcHQua2V5KTtcbiAgfVxuXG4gIHRvZ2dsZU9wZW4oZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZHJvcGRvd25DbGljay5lbWl0KCk7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2woKS5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuRHJvcGRvd24oKTtcbiAgICB9XG4gIH1cblxuICBvcGVuRHJvcGRvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2woKS5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuY29tYm9ib3hXcmFwcGVyRWwoKT8ubmF0aXZlRWxlbWVudCA/PyB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCByZWN0ID0gd3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAocmVjdC53aWR0aCA+IDApIHtcbiAgICAgIHRoaXMudHJpZ2dlcldpZHRoLnNldChyZWN0LndpZHRoKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmZXJBYm92ZSA9IHRoaXMuY29uZmlnKCk/LnByb3BlcnRpZXM/Llsnb3BlbkFib3ZlJ10gPT09IHRydWU7XG4gICAgaWYgKHByZWZlckFib3ZlKSB7XG4gICAgICB0aGlzLm9wZW5zQWJvdmUuc2V0KHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICB0aGlzLnNlYXJjaFRlcm0uc2V0KCcnKTtcbiAgICB0aGlzLmZpbHRlclJlbmRlckxpbWl0LnNldCh0aGlzLklOSVRJQUxfRklMVEVSX1JFTkRFUik7XG4gICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgfVxuXG4gIG9uUG9zaXRpb25DaGFuZ2UoY2hhbmdlOiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5zQWJvdmUuc2V0KGNoYW5nZS5jb25uZWN0aW9uUGFpci5vcmlnaW5ZID09PSAndG9wJyk7XG4gIH1cblxuICBvbk92ZXJsYXlBdHRhY2hlZCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfSwgMjUpO1xuICB9XG5cbiAgY2xvc2VEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCgpLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuXG4gIHNlbGVjdE9wdGlvbihvcHQ6IERyb3Bkb3duT3B0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmFsdWUuc2V0KG9wdC5rZXkpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2woKS5zZXRWYWx1ZShvcHQua2V5KTtcbiAgICB0aGlzLmZvcm1Db250cm9sKCkubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLmZvcm1Db250cm9sKCkubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICB9XG5cbiAgY2xlYXJTZWxlY3Rpb24oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmN1cnJlbnRWYWx1ZS5zZXQoJycpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2woKS5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCgpLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCgpLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLnNlYXJjaFRlcm0uc2V0KCcnKTtcbiAgICB0aGlzLmZpbHRlclJlbmRlckxpbWl0LnNldCh0aGlzLklOSVRJQUxfRklMVEVSX1JFTkRFUik7XG4gICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgfVxuXG4gIC8qKiBNYW51YWxseSByZXRyeSBsb2FkaW5nIGR5bmFtaWMgbG9va3VwIG9wdGlvbnMgKGUuZy4gYWZ0ZXIgZGF0YWJhc2UgdGltZW91dCkuICovXG4gIHJldHJ5TG9va3VwKGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVxdWVzdEtleSA9ICcnO1xuICAgIHRoaXMubG9hZEVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLnJlbG9hZERhdGFTb3VyY2VPcHRpb25zKHRoaXMuc2Vzc2lvblNlcnZpY2U/LnNlc3Npb25Db250ZXh0KCkgPz8ge30pO1xuICB9XG5cbiAgY2xlYXJTZWFyY2goZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgdGhpcy5maWx0ZXJSZW5kZXJMaW1pdC5zZXQodGhpcy5JTklUSUFMX0ZJTFRFUl9SRU5ERVIpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gICAgdGhpcy5zZWFyY2hJbnB1dEVsKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIG9uU2VhcmNoSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdmFsID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLnNlYXJjaFRlcm0uc2V0KHZhbCk7XG4gICAgdGhpcy5maWx0ZXJSZW5kZXJMaW1pdC5zZXQodGhpcy5JTklUSUFMX0ZJTFRFUl9SRU5ERVIpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgwKTtcbiAgfVxuXG4gIG9uVHJpZ2dlcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyB8fCBldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLm9wZW5Ecm9wZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLnZpc2libGVGaWx0ZXJlZE9wdGlvbnMoKTtcbiAgICBjb25zdCBjb3VudCA9IHZpc2libGUubGVuZ3RoO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSAodGhpcy5mb2N1c2VkSW5kZXgoKSArIDEpICUgY291bnQ7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5leHQpO1xuICAgICAgICAgIHRoaXMuc2Nyb2xsRm9jdXNlZEludG9WaWV3KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuZm9jdXNlZEluZGV4KCkgPD0gMCA/IGNvdW50IC0gMSA6IHRoaXMuZm9jdXNlZEluZGV4KCkgLSAxO1xuICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2KTtcbiAgICAgICAgICB0aGlzLnNjcm9sbEZvY3VzZWRJbnRvVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpZHggPj0gMCAmJiBpZHggPCBjb3VudCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9uKHZpc2libGVbaWR4XSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdE9wdGlvbih2aXNpYmxlWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VzY2FwZSc6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnVGFiJzoge1xuICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxGb2N1c2VkSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdEVsID0gdGhpcy5vcHRpb25zTGlzdEVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFsaXN0RWwpIHJldHVybjtcbiAgICBjb25zdCBpdGVtcyA9IGxpc3RFbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmNvbWJvYm94LW9wdGlvbi1pdGVtJyk7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKTtcbiAgICBpZiAoaXRlbXMgJiYgaXRlbXNbaWR4XSkge1xuICAgICAgaXRlbXNbaWR4XS5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gU3luYyByZWFjdGl2ZSBmb3JtIGNvbnRyb2wgdmFsdWUgY2hhbmdlcyB0byBjdXJyZW50VmFsdWUgc2lnbmFsXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBjdHJsID0gdGhpcy5mb3JtQ29udHJvbCgpO1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jdXJyZW50VmFsdWUuc2V0KGN0cmwudmFsdWUpKTtcbiAgICAgICAgdGhpcy5jb250cm9sU3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xTdWIgPSBjdHJsLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHYpID0+IHRoaXMuY3VycmVudFZhbHVlLnNldCh2KSk7XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIC8vIFJlLXJ1biB3aGVuZXZlciB0aGUgYm91bmQgZGF0YSBzb3VyY2UsIHRoZSBzZXNzaW9uLCBvciB0aGUgcGFyZW50IGZvcm0gY2hhbmdlcy5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlPy5zZXNzaW9uQ29udGV4dCgpID8/IHt9O1xuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5wYXJlbnRGb3JtKCk7XG4gICAgICAgIHRoaXMuY29uZmlnKCk7IC8vIGRlcGVuZGVuY3k6IGRhdGEgc291cmNlIGNvbmZpZ3VyYXRpb25cblxuICAgICAgICB0aGlzLmZvcm1DaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAoZm9ybSAmJiB0aGlzLmlzRHluYW1pY1NvdXJjZSgpKSB7XG4gICAgICAgICAgdGhpcy5mb3JtQ2hhbmdlc1N1YiA9IGZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNjaGVkdWxlUmVsb2FkKCkpO1xuICAgICAgICB9XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLnNjaGVkdWxlUmVsb2FkKCkpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5sb29rdXBTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5tYXN0ZXJEYXRhU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZm9ybUNoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMucmVsb2FkVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFRpbWVyKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVSZWxvYWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVsb2FkVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFRpbWVyKTtcbiAgICB0aGlzLnJlbG9hZFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbG9hZERhdGFTb3VyY2VPcHRpb25zKHRoaXMuc2Vzc2lvblNlcnZpY2U/LnNlc3Npb25Db250ZXh0KCkgPz8ge30pO1xuICAgIH0sIDI1MCk7XG4gIH1cblxuICBwcml2YXRlIHJlbG9hZERhdGFTb3VyY2VPcHRpb25zKHNlc3Npb246IFNlc3Npb25Db250ZXh0TWFwKTogdm9pZCB7XG4gICAgY29uc3QgZHMgPSB0aGlzLmNvbmZpZygpLmRhdGFTb3VyY2U7XG4gICAgaWYgKCFkcyB8fCAhdGhpcy5pc0R5bmFtaWNTb3VyY2UoKSkgcmV0dXJuO1xuXG4gICAgLy8gMS4gRGF0YWJhc2UgVGFibGUgLyBTdG9yZWQgUHJvY2VkdXJlIC8gUkVTVCBBUEkgTG9va3VwXG4gICAgY29uc3QgaXNBcGkgPSBkcy5zb3VyY2VUeXBlID09PSAnYXBpJyB8fCAhIWRzLmFwaUVuZHBvaW50O1xuICAgIGNvbnN0IGlzRGJMb29rdXAgPSAhIShkcy5lbnRpdHlOYW1lICYmIChkcy5zb3VyY2VUeXBlID09PSAndGFibGUnIHx8IGRzLnNvdXJjZVR5cGUgPT09ICdwcm9jZWR1cmUnKSk7XG5cbiAgICBpZiAoKGlzQXBpIHx8IGlzRGJMb29rdXApICYmIHRoaXMubG9va3VwQWRhcHRlcikge1xuICAgICAgY29uc3QgZm9ybVZhbHVlcyA9IHRoaXMucGFyZW50Rm9ybSgpPy5nZXRSYXdWYWx1ZSgpID8/IHt9O1xuXG4gICAgICAvLyBEbyBub3QgY2FsbCB1bnRpbCBldmVyeSBjYW52YXMgZmllbGQgdGhpcyBsb29rdXAgZGVwZW5kcyBvbiBpcyBmaWxsZWQuXG4gICAgICBjb25zdCBtaXNzaW5nID0gZmluZE1pc3NpbmdDYW52YXNGaWVsZHMoZHMucGFyYW1ldGVyTWFwcGluZ3MsIGZvcm1WYWx1ZXMpO1xuICAgICAgdGhpcy53YWl0aW5nRm9yLnNldChtaXNzaW5nKTtcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb29rdXBTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMubG9hZEVycm9yLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5keW5hbWljT3B0aW9ucy5zZXQoW10pO1xuICAgICAgICB0aGlzLmxhc3RSZXF1ZXN0S2V5ID0gJyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmVkIHByb2NlZHVyZXMgb25seSByZWNlaXZlIGV4cGxpY2l0IG1hcHBpbmdzIHNvIFNRTCBTZXJ2ZXIgZG9lc24ndCByZWplY3QgdW5rbm93biBhcmd1bWVudHMuXG4gICAgICBsZXQgcmVzb2x2ZWRQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWRQYXJhbXMgPSB7XG4gICAgICAgICAgLi4uKGRzLnNvdXJjZVR5cGUgPT09ICd0YWJsZScgPyBzZXNzaW9uIDoge30pLFxuICAgICAgICAgIC4uLnJlc29sdmVQYXJhbWV0ZXJNYXBwaW5ncyhkcy5wYXJhbWV0ZXJNYXBwaW5ncywgc2Vzc2lvbiwgZm9ybVZhbHVlcyksXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvb2t1cFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5keW5hbWljT3B0aW9ucy5zZXQoW10pO1xuICAgICAgICB0aGlzLmxvYWRFcnJvci5zZXQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXJhbWV0ZXIgdmFsdWUuJyk7XG4gICAgICAgIHRoaXMubGFzdFJlcXVlc3RLZXkgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXF1ZXN0OiBhbnkgPSB7XG4gICAgICAgIHNvdXJjZVR5cGU6IGRzLnNvdXJjZVR5cGUgPz8gKGlzQXBpID8gJ2FwaScgOiAndGFibGUnKSxcbiAgICAgICAgZW50aXR5TmFtZTogZHMuZW50aXR5TmFtZSA/PyAoaXNBcGkgPyBkcy5hcGlFbmRwb2ludCA6ICcnKSxcbiAgICAgICAgc2NoZW1hOiBkcy5zY2hlbWEgPz8gJ2RibycsXG4gICAgICAgIHZhbHVlRmllbGQ6IGRzLnZhbHVlRmllbGQ/LnRyaW0oKSB8fCAnJyxcbiAgICAgICAgZGlzcGxheUZpZWxkOiBkcy5kaXNwbGF5RmllbGQ/LnRyaW0oKSB8fCAnJyxcbiAgICAgICAgZmlsdGVyOiBkcy5maWx0ZXIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHJlc29sdmVkUGFyYW1zLFxuICAgICAgICBhcGlFbmRwb2ludDogZHMuYXBpRW5kcG9pbnQsXG4gICAgICAgIGRhdGFQYXRoOiBkcy5kYXRhUGF0aCxcbiAgICAgICAgdXNlUHJveHk6IGRzLnVzZVByb3h5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KTtcbiAgICAgIGlmIChyZXF1ZXN0S2V5ID09PSB0aGlzLmxhc3RSZXF1ZXN0S2V5KSByZXR1cm47IC8vIG5vdGhpbmcgY2hhbmdlZFxuICAgICAgdGhpcy5sYXN0UmVxdWVzdEtleSA9IHJlcXVlc3RLZXk7XG5cbiAgICAgIC8vIFN0b3JlZCBwcm9jZWR1cmVzIG9uIGxvY2FsIGRhdGFiYXNlcyBjYW4gdGFrZSBhIGNvdXBsZSBtaW51dGVzIHRvIGV4ZWN1dGUuXG4gICAgICAvLyBEZWZhdWx0IHRpbWVvdXQgaXMgMzAwLDAwMG1zICg1IG1pbnV0ZXMpLCBjb25maWd1cmFibGUgdmlhIGNvbXBvbmVudCBwcm9wZXJ0aWVzIG9yIHJlcG9ydGluZ0NvbmZpZy5cbiAgICAgIGNvbnN0IHRpbWVvdXRNcyA9XG4gICAgICAgICgoZHMgYXMgYW55KT8udGltZW91dE1zIGFzIG51bWJlcikgfHxcbiAgICAgICAgKHRoaXMuY29uZmlnKCkucHJvcGVydGllcz8uWyd0aW1lb3V0TXMnXSBhcyBudW1iZXIpIHx8XG4gICAgICAgIHRoaXMucmVwb3J0aW5nQ29uZmlnPy5sb29rdXBUaW1lb3V0TXMgfHxcbiAgICAgICAgMzAwMDAwO1xuXG4gICAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWRFcnJvci5zZXQobnVsbCk7XG4gICAgICB0aGlzLmxvb2t1cFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMubG9va3VwU3ViID0gdGhpcy5sb29rdXBBZGFwdGVyXG4gICAgICAgIC5mZXRjaE9wdGlvbnMocmVxdWVzdClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGltZW91dCh7XG4gICAgICAgICAgICBlYWNoOiB0aW1lb3V0TXMsXG4gICAgICAgICAgICB3aXRoOiAoKSA9PlxuICAgICAgICAgICAgICB0aHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBMb29rdXAgcXVlcnkgdGltZWQgb3V0IGFmdGVyICR7TWF0aC5yb3VuZCh0aW1lb3V0TXMgLyAxMDAwKX1zIChzdG9yZWQgcHJvY2VkdXJlIHRvb2sgdG9vIGxvbmcgdG8gcmVzcG9uZCBvbiBsb2NhbCBkYXRhYmFzZSlgXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmhhc0xvYWRlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgLy8gRGVkdXBsaWNhdGUgaXRlbXMgYnkga2V5L3ZhbHVlIHRvIGVuc3VyZSBjbGVhbiBzZWxlY3Qgb3B0aW9uc1xuICAgICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICBjb25zdCBkZWR1cGVkOiBEcm9wZG93bk9wdGlvbltdID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBpdCBvZiBpdGVtcykge1xuICAgICAgICAgICAgY29uc3QgayA9IFN0cmluZyhpdC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIXNlZW4uaGFzKGspKSB7XG4gICAgICAgICAgICAgIHNlZW4uYWRkKGspO1xuICAgICAgICAgICAgICBkZWR1cGVkLnB1c2goeyBrZXk6IGssIGxhYmVsOiBpdC5sYWJlbCB8fCBrIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmR5bmFtaWNPcHRpb25zLnNldChkZWR1cGVkKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbUnB0RHJvcGRvd25dIEZhaWxlZCB0byBsb2FkIGxvb2t1cCBvcHRpb25zIGZvciAke2RzLmVudGl0eU5hbWV9OmAsIGVycik7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmhhc0xvYWRlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5keW5hbWljT3B0aW9ucy5zZXQoW10pO1xuICAgICAgICAgIHRoaXMubGFzdFJlcXVlc3RLZXkgPSAnJzsgLy8gYWxsb3cgcmV0cnlcbiAgICAgICAgICB0aGlzLmxvYWRFcnJvci5zZXQoZXJyPy5tZXNzYWdlIHx8ICdEYXRhYmFzZSBxdWVyeSBlcnJvcicpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gMi4gTGVnYWN5IE1hc3RlciBEYXRhIFByb3ZpZGVyXG4gICAgaWYgKGRzLm1hc3Rlck5hbWUgJiYgdGhpcy5tYXN0ZXJEYXRhUHJvdmlkZXIgJiYgIXRoaXMubWFzdGVyRGF0YVN1Yikge1xuICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkRXJyb3Iuc2V0KG51bGwpO1xuICAgICAgdGhpcy5tYXN0ZXJEYXRhU3ViID0gdGhpcy5tYXN0ZXJEYXRhUHJvdmlkZXIuZ2V0TWFzdGVyRGF0YShkcy5tYXN0ZXJOYW1lKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoaXRlbXMpID0+IHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuaGFzTG9hZGVkLnNldCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmR5bmFtaWNPcHRpb25zLnNldChcbiAgICAgICAgICAgIGl0ZW1zLm1hcCgoaXQpID0+ICh7XG4gICAgICAgICAgICAgIGtleTogU3RyaW5nKGl0LnZhbHVlID8/IGl0WydpZCddID8/ICcnKSxcbiAgICAgICAgICAgICAgbGFiZWw6IFN0cmluZyhpdC5sYWJlbCA/PyBpdFsnbmFtZSddID8/ICcnKSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW1JwdERyb3Bkb3duXSBGYWlsZWQgdG8gbG9hZCBtYXN0ZXIgZGF0YSBmb3IgJHtkcy5tYXN0ZXJOYW1lfTpgLCBlcnIpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5oYXNMb2FkZWQuc2V0KHRydWUpO1xuICAgICAgICAgIHRoaXMubG9hZEVycm9yLnNldChlcnI/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBsb2FkIG1hc3RlciBkYXRhJyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIiAgICA8ZGl2IGNsYXNzPVwicnB0LWZpZWxkLWdyb3VwXCI+XG4gICAgICBAaWYgKGNvbmZpZygpLmxhYmVsKSB7XG4gICAgICAgIDxsYWJlbCBbZm9yXT1cImVsZW1lbnRJZCgpXCIgY2xhc3M9XCJycHQtbGFiZWxcIj5cbiAgICAgICAgICB7eyBjb25maWcoKS5sYWJlbCB9fVxuICAgICAgICAgIEBpZiAoY29uZmlnKCkudmFsaWRhdGlvbj8ucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXJlcXVpcmVkLW1hcmtlclwiPio8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGlzU2VhcmNoYWJsZSgpKSB7XG4gICAgICAgIDwhLS0gU2VhcmNoYWJsZSBUeXBlYWhlYWQgQ29tYm9ib3ggLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtY29tYm9ib3gtd3JhcHBlclwiICNjb21ib2JveFdyYXBwZXIgI2NvbWJvYm94T3JpZ2luPVwiY2RrT3ZlcmxheU9yaWdpblwiIGNka092ZXJsYXlPcmlnaW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInJwdC1jb21ib2JveC10cmlnZ2VyXCJcbiAgICAgICAgICAgIFtpZF09XCJlbGVtZW50SWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MucnB0LWludmFsaWRdPVwiaXNJbnZhbGlkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLW9wZW5dPVwiaXNPcGVuKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1Db250cm9sKCkuZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW4oKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3BlbigkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uVHJpZ2dlcktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cmlnZ2VyLWxhYmVsXCIgW2NsYXNzLmlzLXBsYWNlaG9sZGVyXT1cIiFzZWxlY3RlZE9wdGlvbigpXCI+XG4gICAgICAgICAgICAgIHt7IHNlbGVjdGVkT3B0aW9uKCkgPyBzZWxlY3RlZE9wdGlvbigpIS5sYWJlbCA6IHBsYWNlaG9sZGVyKCkgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyaWdnZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgICBAaWYgKGlzTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90IGRvdC1wdWxzZVwiIHN0eWxlPVwiY29sb3I6ICMyNTYzZWI7IG1hcmdpbi1yaWdodDogNHB4O1wiIHRpdGxlPVwiRXhlY3V0aW5nIHF1ZXJ5IG9uIGRhdGFiYXNlLi4uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAobG9hZEVycm9yKCkgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRyaWdnZXItcmV0cnktYnRuXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiUmV0cnkgZGF0YWJhc2UgcXVlcnlcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJldHJ5IGRhdGFiYXNlIHF1ZXJ5XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXRyeUxvb2t1cCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICDihrsgUmV0cnlcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkT3B0aW9uKCkgJiYgIWZvcm1Db250cm9sKCkuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cmlnZ2VyLWNsZWFyLWJ0blwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIkNsZWFyIHNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclNlbGVjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNsZWFyU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiY2xlYXJTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAg4pyVXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJpZ2dlci1hcnJvd1wiIFtjbGFzcy5yb3RhdGVkXT1cImlzT3BlbigpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgMTIgOFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEgMS41TDYgNi41TDExIDEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJjb21ib2JveE9yaWdpblwiXG4gICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImlzT3BlbigpXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJvdmVybGF5UG9zaXRpb25zXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVdpZHRoXT1cInRyaWdnZXJXaWR0aCgpXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU1pbldpZHRoXT1cIidtaW4oMTgwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSknXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUZsZXhpYmxlRGltZW5zaW9uc109XCJ0cnVlXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVZpZXdwb3J0TWFyZ2luXT1cIjhcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UHVzaF09XCJ0cnVlXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVNjcm9sbFN0cmF0ZWd5XT1cInNjcm9sbFN0cmF0ZWd5XCJcbiAgICAgICAgICAob3ZlcmxheU91dHNpZGVDbGljayk9XCJjbG9zZURyb3Bkb3duKClcIlxuICAgICAgICAgIChwb3NpdGlvbkNoYW5nZSk9XCJvblBvc2l0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChhdHRhY2gpPVwib25PdmVybGF5QXR0YWNoZWQoKVwiXG4gICAgICAgICAgKGRldGFjaCk9XCJjbG9zZURyb3Bkb3duKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJycHQtY29tYm9ib3gtbWVudVwiXG4gICAgICAgICAgICBbY2xhc3Mub3BlbnMtYWJvdmVdPVwib3BlbnNBYm92ZSgpXCJcbiAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDwhLS0gUmVhbC10aW1lIEZpbHRlciBTZWFyY2ggQm94IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvYm94LXNlYXJjaC1ib3hcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21ib2JveC1zZWFyY2gtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjhcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICAgIDxsaW5lIHgxPVwiMjFcIiB5MT1cIjIxXCIgeDI9XCIxNi42NVwiIHkyPVwiMTYuNjVcIj48L2xpbmU+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgI3NlYXJjaElucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29tYm9ib3gtc2VhcmNoLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgdG8gZmlsdGVyLi4uXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VhcmNoVGVybSgpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiZm9jdXNlZEluZGV4KCkgPj0gMCA/IChlbGVtZW50SWQoKSArICdfb3B0XycgKyBmb2N1c2VkSW5kZXgoKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblNlYXJjaEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIEBpZiAoc2VhcmNoVGVybSgpKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbWJvYm94LXNlYXJjaC1jbGVhclwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIkNsZWFyIGZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAg4pyVXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEZpbHRlcmVkIE9wdGlvbnMgTGlzdCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1vcHRpb25zLWxpc3RcIiAjb3B0aW9uc0xpc3RFbCAoc2Nyb2xsKT1cIm9uT3B0aW9uc1Njcm9sbCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIEBpZiAod2FpdGluZ0ZvcigpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc3RhdHVzLXJvdyB3YWl0aW5nXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5XYWl0aW5nIGZvciB7eyB3YWl0aW5nTGFiZWwoKSB9fS4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc3RhdHVzLXJvdyBsb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZG90LXB1bHNlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RXhlY3V0aW5nIHF1ZXJ5IG9uIGRhdGFiYXNlIChtYXkgdGFrZSAx4oCTMiBtaW51dGVzIG9uIGxvY2FsIGRhdGFiYXNlKS4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAobG9hZEVycm9yKCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc3RhdHVzLXJvdyBlcnJvclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RXJyb3I6IHt7IGxvYWRFcnJvcigpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjb21ib2JveC1yZXRyeS1idG5cIiAoY2xpY2spPVwicmV0cnlMb29rdXAoJGV2ZW50KVwiPuKGuyBSZXRyeSBRdWVyeTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChpc0R5bmFtaWNTb3VyY2UoKSAmJiBoYXNMb2FkZWQoKSAmJiBhbGxPcHRpb25zKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvYm94LXN0YXR1cy1yb3cgZW1wdHlcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPk5vIHJlY29yZHMgZm91bmQgKGNoZWNrIHBhcmFtZXRlcnMpPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc3RhdHVzLXJvdyBlbXB0eVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+Tm8gb3B0aW9ucyBtYXRjaGluZyBcInt7IHNlYXJjaFRlcm0oKSB9fVwiPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAZm9yIChvcHQgb2YgdmlzaWJsZUZpbHRlcmVkT3B0aW9ucygpOyB0cmFjayBvcHQua2V5OyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImVsZW1lbnRJZCgpICsgJ19vcHRfJyArIGlcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbWJvYm94LW9wdGlvbi1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1mb2N1c2VkXT1cImZvY3VzZWRJbmRleCgpID09PSBpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKG9wdClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0T3B0aW9uKG9wdClcIlxuICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJmb2N1c2VkSW5kZXguc2V0KGkpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHQtbGFiZWxcIj57eyBvcHQubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXNTZWxlY3RlZChvcHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHQtY2hlY2tcIiBhcmlhLWhpZGRlbj1cInRydWVcIj7inJM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKGV4Y2Vzc0ZpbHRlcmVkQ291bnQoKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1zdGF0dXMtcm93IGhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2hvd2luZyB7eyB2aXNpYmxlRmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIH19IG9mIHt7IGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCB9fSBtYXRjaGVzLiBTY3JvbGwgZG93biBvcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29tYm9ib3gtbG9hZC1hbGwtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibG9hZEFsbEZpbHRlcmVkKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgTG9hZCBhbGwge3sgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8IS0tIE5hdGl2ZSBCcm93c2VyIFNlbGVjdCBGYWxsYmFjayAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgIFtpZF09XCJlbGVtZW50SWQoKVwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2woKVwiXG4gICAgICAgICAgICBbY2xhc3MucnB0LWludmFsaWRdPVwiaXNJbnZhbGlkKClcIlxuICAgICAgICAgICAgY2xhc3M9XCJycHQtc2VsZWN0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHdhaXRpbmdGb3IoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBkaXNhYmxlZCBzZWxlY3RlZD5XYWl0aW5nIGZvciB7eyB3YWl0aW5nTGFiZWwoKSB9fS4uLjwvb3B0aW9uPlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAoaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIGRpc2FibGVkIHNlbGVjdGVkPkxvYWRpbmcgb3B0aW9ucyBmcm9tIGRhdGFiYXNlLi4uPC9vcHRpb24+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChsb2FkRXJyb3IoKSkge1xuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgZGlzYWJsZWQgc2VsZWN0ZWQ+RXJyb3I6IHt7IGxvYWRFcnJvcigpIH19PC9vcHRpb24+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChpc0R5bmFtaWNTb3VyY2UoKSAmJiBoYXNMb2FkZWQoKSAmJiBhbGxPcHRpb25zKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBkaXNhYmxlZCBzZWxlY3RlZD4tLSBObyByZWNvcmRzIGZvdW5kIChjaGVjayBwYXJhbWV0ZXJzKSAtLTwvb3B0aW9uPlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAocGxhY2Vob2xkZXIoKSkge1xuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgW2Rpc2FibGVkXT1cImNvbmZpZygpLnZhbGlkYXRpb24/LnJlcXVpcmVkXCI+e3sgcGxhY2Vob2xkZXIoKSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGZvciAob3B0IG9mIHJlbmRlcmVkT3B0aW9ucygpOyB0cmFjayBvcHQua2V5KSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIm9wdC5rZXlcIj57eyBvcHQubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoaGFzRXhjZXNzT3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBkaXNhYmxlZD4uLi4gYW5kIHt7IGV4Y2Vzc09wdGlvbnNDb3VudCgpIH19IG1vcmUgcmVjb3JkcyAocmVmaW5lIGZpbHRlcikgLi4uPC9vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zZWxlY3QtYXJyb3dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDEyIDhcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEgMS41TDYgNi41TDExIDEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmIChzaG93U3RhdHVzKCkgJiYgaXNEeW5hbWljU291cmNlKCkgJiYgc3RhdHVzVGV4dCgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdHVzLWJhZGdlXCIgW2F0dHIuZGF0YS1zdGF0dXNdPVwic3RhdHVzS2luZCgpXCI+XG4gICAgICAgICAgQHN3aXRjaCAoc3RhdHVzS2luZCgpKSB7XG4gICAgICAgICAgICBAY2FzZSAoJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBkb3QtcHVsc2VcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPkxvYWRpbmcgZnJvbSBkYXRhYmFzZeKApjwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnb2snKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBkb3Qtb2tcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGR5bmFtaWNPcHRpb25zKCkubGVuZ3RoIH19IHJlY29yZHMgbG9hZGVkPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCd3YWl0aW5nJykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZG90LXdhcm5cIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPldhaXRpbmcgZm9yOjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhaXRpbmctdG9rZW5zXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoayBvZiB3YWl0aW5nRm9yKCk7IHRyYWNrIGspIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwid2FpdGluZy10b2tlblwiPnt7IGsgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnZXJyb3InKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBkb3QtZXJyXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBsb2FkRXJyb3IoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycHQtYmFkZ2UtcmV0cnktYnRuXCIgKGNsaWNrKT1cInJldHJ5TG9va3VwKCRldmVudClcIj7ihrsgUmV0cnk8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnZW1wdHknKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4+Tm8gcmVjb3JkcyBmb3VuZCBmb3IgcGFyYW1ldGVyczwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoZXJyb3JNZXNzYWdlKCkpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtZXJyb3ItdGV4dFwiPnt7IGVycm9yTWVzc2FnZSgpIH19PC9zcGFuPlxuICAgICAgfVxuICAgIDwvZGl2PiJdfQ==
|
|
553
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9kcm9wZG93bi9ycHQtZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvcHJpbWl0aXZlcy9jb21wb25lbnRzL2Ryb3Bkb3duL3JwdC1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNyRixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFHTCxhQUFhLEdBRWQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDekYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDcEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFL0UsT0FBTyxFQUNMLHVCQUF1QixFQUN2Qix3QkFBd0IsR0FDekIsTUFBTSwyQ0FBMkMsQ0FBQzs7OztBQW1CbkQsTUFBTSxPQUFPLG9CQUFvQjtJQUNkLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLGFBQWEsR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNoRSxjQUFjLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFdkUsY0FBYyxHQUFtQixNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNsSCxZQUFZLEdBQUcsTUFBTSxDQUFrQixNQUFNLENBQUMsQ0FBQztJQUUvQyxnQkFBZ0IsR0FBd0I7UUFDL0M7WUFDRSxPQUFPLEVBQUUsT0FBTztZQUNoQixPQUFPLEVBQUUsUUFBUTtZQUNqQixRQUFRLEVBQUUsT0FBTztZQUNqQixRQUFRLEVBQUUsS0FBSztZQUNmLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRDtZQUNFLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLE9BQU87WUFDakIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUNaO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsS0FBSztZQUNkLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsUUFBUSxFQUFFLEtBQUs7WUFDZixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsS0FBSztZQUNkLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLEtBQUs7WUFDZixRQUFRLEVBQUUsUUFBUTtZQUNsQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ1o7S0FDRixDQUFDO0lBRU8sTUFBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQTZCLENBQUM7SUFDckQsT0FBTyxHQUFHLEtBQUssRUFBa0MsQ0FBQztJQUNsRCxVQUFVLEdBQUcsS0FBSyxDQUFtQixJQUFJLENBQUMsQ0FBQztJQUNwRCxxRkFBcUY7SUFDNUUsVUFBVSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNuQyxhQUFhLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFFdkIsZUFBZSxHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLGNBQWMsR0FBRyxNQUFNLENBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLFNBQVMsQ0FBZ0I7SUFDekIsYUFBYSxDQUFnQjtJQUM3QixjQUFjLENBQWdCO0lBQzlCLFdBQVcsQ0FBaUM7SUFDNUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUU1Qiw2QkFBNkI7SUFDcEIsTUFBTSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNoQyxVQUFVLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLFVBQVUsR0FBRyxNQUFNLENBQVMsRUFBRSxDQUFDLENBQUM7SUFDaEMsWUFBWSxHQUFHLE1BQU0sQ0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLFlBQVksR0FBRyxNQUFNLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDckMsaUJBQWlCLEdBQUcsU0FBUyxDQUEwQixpQkFBaUIsQ0FBQyxDQUFDO0lBQzFFLGFBQWEsR0FBRyxTQUFTLENBQStCLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZFLGFBQWEsR0FBRyxTQUFTLENBQTBCLGVBQWUsQ0FBQyxDQUFDO0lBRXJFLFVBQVUsQ0FBZ0I7SUFFekIsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JFLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEUsV0FBVyxHQUFHLFFBQVEsQ0FDN0IsR0FBRyxFQUFFLENBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBWSxJQUFJLGNBQWMsQ0FDOUUsQ0FBQztJQUVPLFlBQVksR0FBRyxRQUFRLENBQzlCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxJQUFJLENBQzFELENBQUM7SUFFTyxTQUFTLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ25DLFNBQVMsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDbkMsU0FBUyxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFDakQsdUVBQXVFO0lBQzlELFVBQVUsR0FBRyxNQUFNLENBQVcsRUFBRSxDQUFDLENBQUM7SUFFbEMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDdkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNwQyxPQUFPLENBQUMsQ0FBQyxDQUNQLEVBQUU7WUFDRixDQUFDLEVBQUUsQ0FBQyxVQUFVLEtBQUssT0FBTztnQkFDeEIsRUFBRSxDQUFDLFVBQVUsS0FBSyxXQUFXO2dCQUM3QixFQUFFLENBQUMsVUFBVSxLQUFLLEtBQUs7Z0JBQ3ZCLEVBQUUsQ0FBQyxXQUFXO2dCQUNkLEVBQUUsQ0FBQyxVQUFVO2dCQUNiLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FDakIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRU0sYUFBYSxHQUFHLFFBQVEsQ0FBbUIsR0FBRyxFQUFFO1FBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQyxDQUFDO0lBRU0sVUFBVSxHQUFHLFFBQVEsQ0FBbUIsR0FBRyxFQUFFO1FBQ3BELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUMsQ0FBQyxDQUFDO0lBRU0sY0FBYyxHQUFHLFFBQVEsQ0FBd0IsR0FBRyxFQUFFO1FBQzdELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQzFFLElBQUksS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hCLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBc0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFFTSxlQUFlLEdBQUcsUUFBUSxDQUFtQixHQUFHLEVBQUU7UUFDekQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sR0FBRyxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ3hCLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUN2RixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFTSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7SUFDeEIscUJBQXFCLEdBQUcsR0FBRyxDQUFDO0lBQzVCLGlCQUFpQixHQUFHLE1BQU0sQ0FBUyxHQUFHLENBQUMsQ0FBQztJQUV4QyxzQkFBc0IsR0FBRyxRQUFRLENBQW1CLEdBQUcsRUFBRTtRQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdkMsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUs7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUM5QyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBRU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFTLEdBQUcsRUFBRTtRQUNuRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUMvRSxDQUFDLENBQUMsQ0FBQztJQUVILGVBQWUsQ0FBQyxLQUFZO1FBQzFCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO1FBQ3ZDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUNoQixJQUFJLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLE9BQU8sR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRVEsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0lBQzVCLGVBQWUsR0FBRyxRQUFRLENBQW1CLEdBQUcsRUFBRTtRQUN6RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0I7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMxRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ00sZ0JBQWdCLEdBQUcsUUFBUSxDQUFVLEdBQUcsRUFBRTtRQUNqRCxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ00sa0JBQWtCLEdBQUcsUUFBUSxDQUFTLEdBQUcsRUFBRTtRQUNsRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDLENBQUM7SUFFTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFTSxVQUFVLEdBQUcsUUFBUSxDQUE0RCxHQUFHLEVBQUU7UUFDN0YsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN2QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ25ELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQy9FLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBRU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbEMsUUFBUSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUMxQixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQztvQkFDOUYsQ0FBQyxDQUFDLG1CQUFtQjtvQkFDckIsQ0FBQyxDQUFDLHdCQUF3QixDQUFDO1lBQy9CLEtBQUssSUFBSTtnQkFDUCxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0saUJBQWlCLENBQUM7WUFDMUQsS0FBSyxTQUFTO2dCQUNaLE9BQU8sZ0JBQWdCLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQy9DLEtBQUssT0FBTztnQkFDVixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQztZQUM5QyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxnREFBZ0QsQ0FBQztZQUMxRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVNLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0RCxDQUFDLENBQUMsQ0FBQztJQUVNLFlBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3BELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsQ0FBQztJQUdILGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU87UUFDM0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQWMsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBR0QsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQW1CO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2xFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3RCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDeEMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQ3pGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDdEUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFzQztRQUNyRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQW1CO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVk7UUFDekIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxtRkFBbUY7SUFDbkYsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBWTtRQUN0QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFZO1FBQ3hCLE1BQU0sR0FBRyxHQUFJLEtBQUssQ0FBQyxNQUEyQixDQUFDLEtBQUssQ0FBQztRQUNyRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFvQjtRQUNuQyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDNUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFvQjtRQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRTdCLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDakIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDZCxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7b0JBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDZixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQzVFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDYixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsQ0FBQztxQkFBTSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDZCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckIsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxhQUFhLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBYyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFRDtRQUNFLGtFQUFrRTtRQUNsRSxNQUFNLENBQ0osR0FBRyxFQUFFO1lBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsQ0FBQyxFQUNELEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQzVCLENBQUM7UUFFRixrRkFBa0Y7UUFDbEYsTUFBTSxDQUNKLEdBQUcsRUFBRTtZQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyx3Q0FBd0M7WUFFdkQsSUFBSSxDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUNuQyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUNqRixDQUFDO1lBQ0QsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRU8sdUJBQXVCLENBQUMsT0FBMEI7UUFDeEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNwQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUFFLE9BQU87UUFFM0MseURBQXlEO1FBQ3pELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxVQUFVLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO1FBQzFELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxFQUFFLENBQUMsVUFBVSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFckcsSUFBSSxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDaEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUUxRCx5RUFBeUU7WUFDekUsTUFBTSxPQUFPLEdBQUcsdUJBQXVCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdCLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU87WUFDVCxDQUFDO1lBRUQsbUdBQW1HO1lBQ25HLElBQUksY0FBdUMsQ0FBQztZQUM1QyxJQUFJLENBQUM7Z0JBQ0gsY0FBYyxHQUFHO29CQUNmLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzdDLEdBQUcsd0JBQXdCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUM7aUJBQ3ZFLENBQUM7WUFDSixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUM7Z0JBQ3hGLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO2dCQUN6QixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFRO2dCQUNuQixVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3RELFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFELE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxJQUFJLEtBQUs7Z0JBQzFCLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7Z0JBQ3ZDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7Z0JBQzNDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTTtnQkFDakIsVUFBVSxFQUFFLGNBQWM7Z0JBQzFCLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVztnQkFDM0IsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRO2dCQUNyQixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVE7YUFDdEIsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLGNBQWM7Z0JBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUNsRSxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQztZQUVqQyw2RUFBNkU7WUFDN0Usc0dBQXNHO1lBQ3RHLE1BQU0sU0FBUyxHQUNYLEVBQVUsRUFBRSxTQUFvQjtnQkFDakMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBWTtnQkFDbkQsSUFBSSxDQUFDLGVBQWUsRUFBRSxlQUFlO2dCQUNyQyxNQUFNLENBQUM7WUFFVCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWE7aUJBQ2hDLFlBQVksQ0FBQyxPQUFPLENBQUM7aUJBQ3JCLElBQUksQ0FDSCxPQUFPLENBQUM7Z0JBQ04sSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUNULFVBQVUsQ0FDUixHQUFHLEVBQUUsQ0FDSCxJQUFJLEtBQUssQ0FDUCxnQ0FBZ0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGlFQUFpRSxDQUM5SCxDQUNKO2FBQ0osQ0FBQyxDQUNIO2lCQUNBLFNBQVMsQ0FBQztnQkFDWCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pCLGdFQUFnRTtvQkFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztvQkFDL0IsTUFBTSxPQUFPLEdBQXFCLEVBQUUsQ0FBQztvQkFDckMsS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FBQzt3QkFDdkIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDWixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDeEQsQ0FBQztvQkFDSCxDQUFDO29CQUNELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsbURBQW1ELEVBQUUsQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDeEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsQ0FBQyxjQUFjO29CQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLHNCQUFzQixDQUFDLENBQUM7Z0JBQzdELENBQUM7YUFDRixDQUFDLENBQUM7WUFDSCxPQUFPO1FBQ1QsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3BFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNsRixJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUNyQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUNqQixHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDdkMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7cUJBQzVDLENBQUMsQ0FBQyxDQUNKLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxFQUFFLENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ3JGLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSw0QkFBNEIsQ0FBQyxDQUFDO2dCQUNuRSxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7d0dBdGtCVSxvQkFBb0I7NEZBQXBCLG9CQUFvQiw4cUNDdERqQywyc1dBMlBVLGsyUkQ5TUUsbUJBQW1CLG90QkFBRSxhQUFhOzs0RkFTakMsb0JBQW9CO2tCQVpoQyxTQUFTOytCQUNFLGNBQWMsY0FDWixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLENBQUMsUUFDdkM7d0JBQ0osaUJBQWlCLEVBQUUsVUFBVTt3QkFDN0IscUJBQXFCLEVBQUUsY0FBYztxQkFDdEMsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU07d0RBdU8vQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVTFDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBvcnRPdmVybGF5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LW92ZXJsYXkuc2VydmljZSc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBDb25uZWN0ZWRQb3NpdGlvbixcbiAgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLFxuICBPdmVybGF5TW9kdWxlLFxuICBTY3JvbGxTdHJhdGVneSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0aW1lb3V0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdGlvbk1lc3NhZ2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1mYWN0b3J5JztcbmltcG9ydCB7IE1hc3RlckRhdGFQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9tYXN0ZXItZGF0YS5wcm92aWRlcic7XG5pbXBvcnQgeyBSZXBvcnRMb29rdXBBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL2xvb2t1cC5jb250cmFjdCc7XG5pbXBvcnQgeyBSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBSRVBPUlRJTkdfQ09ORklHIH0gZnJvbSAnLi4vLi4vLi4vY29yZS90b2tlbnMvcmVwb3J0aW5nLWNvbmZpZy50b2tlbic7XG5pbXBvcnQgeyBTZXNzaW9uQ29udGV4dE1hcCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdG9rZW5zL3Nlc3Npb24tY29udGV4dC50b2tlbic7XG5pbXBvcnQge1xuICBmaW5kTWlzc2luZ0NhbnZhc0ZpZWxkcyxcbiAgcmVzb2x2ZVBhcmFtZXRlck1hcHBpbmdzLFxufSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzL3JlcG9ydC1wYXJhbWV0ZXIudXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcGRvd25PcHRpb24ge1xuICBrZXk6IHN0cmluZyB8IG51bWJlcjtcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LWRyb3Bkb3duJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGUsIE92ZXJsYXlNb2R1bGVdLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5pcy1vcGVuXSc6ICdpc09wZW4oKScsXG4gICAgJ1tjbGFzcy5vcGVucy1hYm92ZV0nOiAnb3BlbnNBYm92ZSgpJyxcbiAgfSxcbiAgdGVtcGxhdGVVcmw6ICcuL3JwdC1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9ycHQtZHJvcGRvd24uY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBScHREcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFzdGVyRGF0YVByb3ZpZGVyID0gaW5qZWN0KE1hc3RlckRhdGFQcm92aWRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb29rdXBBZGFwdGVyID0gaW5qZWN0KFJlcG9ydExvb2t1cEFkYXB0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0aW5nQ29uZmlnID0gaW5qZWN0KFJFUE9SVElOR19DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgcmVhZG9ubHkgc2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5ID0gaW5qZWN0KFJlcG9ydE92ZXJsYXlTZXJ2aWNlKS5zY3JvbGxTdHJhdGVneSgoKSA9PiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gIHJlYWRvbmx5IHRyaWdnZXJXaWR0aCA9IHNpZ25hbDxudW1iZXIgfCBzdHJpbmc+KCdhdXRvJyk7XG5cbiAgcmVhZG9ubHkgb3ZlcmxheVBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgIG9mZnNldFk6IDQsXG4gICAgfSxcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgIG9mZnNldFk6IC00LFxuICAgIH0sXG4gICAge1xuICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgIG92ZXJsYXlYOiAnZW5kJyxcbiAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgIG9mZnNldFk6IDQsXG4gICAgfSxcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgb2Zmc2V0WTogLTQsXG4gICAgfSxcbiAgXTtcblxuICByZWFkb25seSBjb25maWcgPSBpbnB1dC5yZXF1aXJlZDxSZXBvcnRDb21wb25lbnREZWZpbml0aW9uPigpO1xuICByZWFkb25seSBjb250cm9sID0gaW5wdXQ8Rm9ybUNvbnRyb2wgfCBudWxsIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBwYXJlbnRGb3JtID0gaW5wdXQ8Rm9ybUdyb3VwIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBEZXNpZ25lciBtb2RlOiBzaG93cyBhIHNtYWxsIHN0YXR1cyBsaW5lIChMb2FkaW5nIC8gTiByZWNvcmRzIC8gV2FpdGluZyBmb3LigKYpLiAqL1xuICByZWFkb25seSBzaG93U3RhdHVzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBkcm9wZG93bkNsaWNrID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBmYWxsYmFja0NvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICByZWFkb25seSBkeW5hbWljT3B0aW9ucyA9IHNpZ25hbDxEcm9wZG93bk9wdGlvbltdPihbXSk7XG4gIHByaXZhdGUgbG9va3VwU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIG1hc3RlckRhdGFTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZm9ybUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcmVsb2FkVGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBsYXN0UmVxdWVzdEtleSA9ICcnO1xuXG4gIC8vIENvbWJvYm94IGludGVyYWN0aXZlIHN0YXRlXG4gIHJlYWRvbmx5IGlzT3BlbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IG9wZW5zQWJvdmUgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzZWFyY2hUZXJtID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICByZWFkb25seSBmb2N1c2VkSW5kZXggPSBzaWduYWw8bnVtYmVyPigtMSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRWYWx1ZSA9IHNpZ25hbDx1bmtub3duPihudWxsKTtcbiAgcmVhZG9ubHkgY29tYm9ib3hXcmFwcGVyRWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdjb21ib2JveFdyYXBwZXInKTtcbiAgcmVhZG9ubHkgc2VhcmNoSW5wdXRFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+Pignc2VhcmNoSW5wdXQnKTtcbiAgcmVhZG9ubHkgb3B0aW9uc0xpc3RFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ29wdGlvbnNMaXN0RWwnKTtcblxuICBwcml2YXRlIGNvbnRyb2xTdWI/OiBTdWJzY3JpcHRpb247XG5cbiAgcmVhZG9ubHkgZm9ybUNvbnRyb2wgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbnRyb2woKSA/PyB0aGlzLmZhbGxiYWNrQ29udHJvbCk7XG4gIHJlYWRvbmx5IGVsZW1lbnRJZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29uZmlnKCkua2V5IHx8IHRoaXMuY29uZmlnKCkuaWQpO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGNvbXB1dGVkKFxuICAgICgpID0+ICh0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/LlsncGxhY2Vob2xkZXInXSBhcyBzdHJpbmcpID8/ICctLSBTZWxlY3QgLS0nXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNTZWFyY2hhYmxlID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5jb25maWcoKS5wcm9wZXJ0aWVzPy5bJ25hdGl2ZVNlbGVjdCddICE9PSB0cnVlXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNMb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaGFzTG9hZGVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZEVycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICAvKiogQ2FudmFzIGZpZWxkIGtleXMgdGhhdCBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgdGhlIGxvb2t1cCBjYW4gcnVuLiAqL1xuICByZWFkb25seSB3YWl0aW5nRm9yID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG5cbiAgcmVhZG9ubHkgaXNEeW5hbWljU291cmNlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGRzID0gdGhpcy5jb25maWcoKS5kYXRhU291cmNlO1xuICAgIHJldHVybiAhIShcbiAgICAgIGRzICYmXG4gICAgICAoZHMuc291cmNlVHlwZSA9PT0gJ3RhYmxlJyB8fFxuICAgICAgICBkcy5zb3VyY2VUeXBlID09PSAncHJvY2VkdXJlJyB8fFxuICAgICAgICBkcy5zb3VyY2VUeXBlID09PSAnYXBpJyB8fFxuICAgICAgICBkcy5hcGlFbmRwb2ludCB8fFxuICAgICAgICBkcy5lbnRpdHlOYW1lIHx8XG4gICAgICAgIGRzLm1hc3Rlck5hbWUpXG4gICAgKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc3RhdGljT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5jb25maWcoKS5wcm9wZXJ0aWVzPy5bJ29wdGlvbnMnXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRzKSkge1xuICAgICAgcmV0dXJuIG9wdHM7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYWxsT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uW10+KCgpID0+IHtcbiAgICBpZiAodGhpcy5pc0R5bmFtaWNTb3VyY2UoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZHluYW1pY09wdGlvbnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhdGljT3B0aW9ucygpO1xuICB9KTtcblxuICByZWFkb25seSBzZWxlY3RlZE9wdGlvbiA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuY3VycmVudFZhbHVlKCk7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09ICcnKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzdHJWYWwgPSBTdHJpbmcodmFsKTtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuYWxsT3B0aW9ucygpLmZpbmQoKG9wdCkgPT4gU3RyaW5nKG9wdC5rZXkpID09PSBzdHJWYWwpO1xuICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgIHJldHVybiB7IGtleTogdmFsIGFzIHN0cmluZyB8IG51bWJlciwgbGFiZWw6IHN0clZhbCB9O1xuICB9KTtcblxuICByZWFkb25seSBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZDxEcm9wZG93bk9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgdGVybSA9IHRoaXMuc2VhcmNoVGVybSgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGFsbCA9IHRoaXMuYWxsT3B0aW9ucygpO1xuICAgIGlmICghdGVybSkgcmV0dXJuIGFsbDtcbiAgICByZXR1cm4gYWxsLmZpbHRlcigob3B0KSA9PlxuICAgICAgb3B0LmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkgfHwgU3RyaW5nKG9wdC5rZXkpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSlcbiAgICApO1xuICB9KTtcblxuICByZWFkb25seSBNQVhfRklMVEVSX1JFTkRFUiA9IDIwMDtcbiAgcmVhZG9ubHkgSU5JVElBTF9GSUxURVJfUkVOREVSID0gMjAwO1xuICByZWFkb25seSBmaWx0ZXJSZW5kZXJMaW1pdCA9IHNpZ25hbDxudW1iZXI+KDIwMCk7XG5cbiAgcmVhZG9ubHkgdmlzaWJsZUZpbHRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCk7XG4gICAgY29uc3QgbGltaXQgPSB0aGlzLmZpbHRlclJlbmRlckxpbWl0KCk7XG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA8PSBsaW1pdCkgcmV0dXJuIGZpbHRlcmVkO1xuICAgIHJldHVybiBmaWx0ZXJlZC5zbGljZSgwLCBsaW1pdCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGV4Y2Vzc0ZpbHRlcmVkQ291bnQgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggLSB0aGlzLmZpbHRlclJlbmRlckxpbWl0KCkpO1xuICB9KTtcblxuICBvbk9wdGlvbnNTY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmIChlbC5zY3JvbGxUb3AgKyBlbC5jbGllbnRIZWlnaHQgPj0gZWwuc2Nyb2xsSGVpZ2h0IC0gMTIwKSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRmlsdGVyZWQoKTtcbiAgICB9XG4gIH1cblxuICBsb2FkTW9yZUZpbHRlcmVkKCk6IHZvaWQge1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGg7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZmlsdGVyUmVuZGVyTGltaXQoKTtcbiAgICBpZiAoY3VycmVudCA8IHRvdGFsKSB7XG4gICAgICB0aGlzLmZpbHRlclJlbmRlckxpbWl0LnVwZGF0ZSgoYykgPT4gTWF0aC5taW4odG90YWwsIGMgKyAyMDApKTtcbiAgICB9XG4gIH1cblxuICBsb2FkQWxsRmlsdGVyZWQoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJSZW5kZXJMaW1pdC5zZXQodGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGgpO1xuICB9XG5cbiAgcmVhZG9ubHkgTUFYX1JFTkRFUkVEX09QVElPTlMgPSA1MDAwO1xuICByZWFkb25seSByZW5kZXJlZE9wdGlvbnMgPSBjb21wdXRlZDxEcm9wZG93bk9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMuYWxsT3B0aW9ucygpO1xuICAgIGlmIChvcHRzLmxlbmd0aCA8PSB0aGlzLk1BWF9SRU5ERVJFRF9PUFRJT05TKSByZXR1cm4gb3B0cztcbiAgICByZXR1cm4gb3B0cy5zbGljZSgwLCB0aGlzLk1BWF9SRU5ERVJFRF9PUFRJT05TKTtcbiAgfSk7XG4gIHJlYWRvbmx5IGhhc0V4Y2Vzc09wdGlvbnMgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYWxsT3B0aW9ucygpLmxlbmd0aCA+IHRoaXMuTUFYX1JFTkRFUkVEX09QVElPTlM7XG4gIH0pO1xuICByZWFkb25seSBleGNlc3NPcHRpb25zQ291bnQgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy5hbGxPcHRpb25zKCkubGVuZ3RoIC0gdGhpcy5NQVhfUkVOREVSRURfT1BUSU9OUyk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHdhaXRpbmdMYWJlbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBrZXlzID0gdGhpcy53YWl0aW5nRm9yKCk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGtleXMuam9pbignLCAnKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc3RhdHVzS2luZCA9IGNvbXB1dGVkPCdpZGxlJyB8ICdsb2FkaW5nJyB8ICdvaycgfCAnd2FpdGluZycgfCAnZXJyb3InIHwgJ2VtcHR5Jz4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc0R5bmFtaWNTb3VyY2UoKSkgcmV0dXJuICdpZGxlJztcbiAgICBpZiAodGhpcy5pc0xvYWRpbmcoKSkgcmV0dXJuICdsb2FkaW5nJztcbiAgICBpZiAodGhpcy5sb2FkRXJyb3IoKSkgcmV0dXJuICdlcnJvcic7XG4gICAgaWYgKHRoaXMud2FpdGluZ0ZvcigpLmxlbmd0aCA+IDApIHJldHVybiAnd2FpdGluZyc7XG4gICAgaWYgKHRoaXMuaGFzTG9hZGVkKCkpIHJldHVybiB0aGlzLmR5bmFtaWNPcHRpb25zKCkubGVuZ3RoID4gMCA/ICdvaycgOiAnZW1wdHknO1xuICAgIHJldHVybiAnaWRsZSc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHN0YXR1c1RleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgc3dpdGNoICh0aGlzLnN0YXR1c0tpbmQoKSkge1xuICAgICAgY2FzZSAnbG9hZGluZyc6XG4gICAgICAgIHJldHVybiAodGhpcy5jb25maWcoKS5kYXRhU291cmNlPy5zb3VyY2VUeXBlID09PSAnYXBpJyB8fCB0aGlzLmNvbmZpZygpLmRhdGFTb3VyY2U/LmFwaUVuZHBvaW50KVxuICAgICAgICAgID8gJ0xvYWRpbmcgZnJvbSBBUEnigKYnXG4gICAgICAgICAgOiAnTG9hZGluZyBmcm9tIGRhdGFiYXNl4oCmJztcbiAgICAgIGNhc2UgJ29rJzpcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZHluYW1pY09wdGlvbnMoKS5sZW5ndGh9IHJlY29yZHMgbG9hZGVkYDtcbiAgICAgIGNhc2UgJ3dhaXRpbmcnOlxuICAgICAgICByZXR1cm4gYFdhaXRpbmcgZm9yOiAke3RoaXMud2FpdGluZ0xhYmVsKCl9YDtcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZEVycm9yKCkgPz8gJ0ZhaWxlZCB0byBsb2FkJztcbiAgICAgIGNhc2UgJ2VtcHR5JzpcbiAgICAgICAgcmV0dXJuICdRdWVyeSByZXR1cm5lZCBubyByZWNvcmRzIGZvciB0aGVzZSBwYXJhbWV0ZXJzJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGlzSW52YWxpZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjdHJsID0gdGhpcy5mb3JtQ29udHJvbCgpO1xuICAgIHJldHVybiBjdHJsLmludmFsaWQgJiYgKGN0cmwuZGlydHkgfHwgY3RybC50b3VjaGVkKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZXJyb3JNZXNzYWdlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmZvcm1Db250cm9sKCk7XG4gICAgaWYgKCFjdHJsLmludmFsaWQgfHwgKCFjdHJsLmRpcnR5ICYmICFjdHJsLnRvdWNoZWQpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IGVycm9ycyA9IGN0cmwuZXJyb3JzO1xuICAgIGlmICghZXJyb3JzKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZmlyc3RLZXkgPSBPYmplY3Qua2V5cyhlcnJvcnMpWzBdO1xuICAgIHJldHVybiBnZXRWYWxpZGF0aW9uTWVzc2FnZSh0aGlzLmNvbmZpZygpLnZhbGlkYXRpb24sIGZpcnN0S2V5KTtcbiAgfSk7XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgTm9kZTtcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIGlzU2VsZWN0ZWQob3B0OiBEcm9wZG93bk9wdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuY3VycmVudFZhbHVlKCk7XG4gICAgaWYgKGN1ciA9PT0gbnVsbCB8fCBjdXIgPT09IHVuZGVmaW5lZCB8fCBjdXIgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIFN0cmluZyhjdXIpID09PSBTdHJpbmcob3B0LmtleSk7XG4gIH1cblxuICB0b2dnbGVPcGVuKGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmRyb3Bkb3duQ2xpY2suZW1pdCgpO1xuICAgIGlmICh0aGlzLmZvcm1Db250cm9sKCkuZGlzYWJsZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlbkRyb3Bkb3duKCk7XG4gICAgfVxuICB9XG5cbiAgb3BlbkRyb3Bkb3duKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm1Db250cm9sKCkuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmNvbWJvYm94V3JhcHBlckVsKCk/Lm5hdGl2ZUVsZW1lbnQgPz8gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgcmVjdCA9IHdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKHJlY3Qud2lkdGggPiAwKSB7XG4gICAgICB0aGlzLnRyaWdnZXJXaWR0aC5zZXQocmVjdC53aWR0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmVyQWJvdmUgPSB0aGlzLmNvbmZpZygpPy5wcm9wZXJ0aWVzPy5bJ29wZW5BYm92ZSddID09PSB0cnVlO1xuICAgIGlmIChwcmVmZXJBYm92ZSkge1xuICAgICAgdGhpcy5vcGVuc0Fib3ZlLnNldCh0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgdGhpcy5maWx0ZXJSZW5kZXJMaW1pdC5zZXQodGhpcy5JTklUSUFMX0ZJTFRFUl9SRU5ERVIpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gIH1cblxuICBvblBvc2l0aW9uQ2hhbmdlKGNoYW5nZTogQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuc0Fib3ZlLnNldChjaGFuZ2UuY29ubmVjdGlvblBhaXIub3JpZ2luWSA9PT0gJ3RvcCcpO1xuICB9XG5cbiAgb25PdmVybGF5QXR0YWNoZWQoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaElucHV0RWwoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH0sIDI1KTtcbiAgfVxuXG4gIGNsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2woKS5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cblxuICBzZWxlY3RPcHRpb24ob3B0OiBEcm9wZG93bk9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFZhbHVlLnNldChvcHQua2V5KTtcbiAgICB0aGlzLmZvcm1Db250cm9sKCkuc2V0VmFsdWUob3B0LmtleSk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCgpLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCgpLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5jdXJyZW50VmFsdWUuc2V0KCcnKTtcbiAgICB0aGlzLmZvcm1Db250cm9sKCkuc2V0VmFsdWUoJycpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2woKS5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2woKS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgdGhpcy5maWx0ZXJSZW5kZXJMaW1pdC5zZXQodGhpcy5JTklUSUFMX0ZJTFRFUl9SRU5ERVIpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gIH1cblxuICAvKiogTWFudWFsbHkgcmV0cnkgbG9hZGluZyBkeW5hbWljIGxvb2t1cCBvcHRpb25zIChlLmcuIGFmdGVyIGRhdGFiYXNlIHRpbWVvdXQpLiAqL1xuICByZXRyeUxvb2t1cChldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIHRoaXMubGFzdFJlcXVlc3RLZXkgPSAnJztcbiAgICB0aGlzLmxvYWRFcnJvci5zZXQobnVsbCk7XG4gICAgdGhpcy5yZWxvYWREYXRhU291cmNlT3B0aW9ucyh0aGlzLnNlc3Npb25TZXJ2aWNlPy5zZXNzaW9uQ29udGV4dCgpID8/IHt9KTtcbiAgfVxuXG4gIGNsZWFyU2VhcmNoKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQoJycpO1xuICAgIHRoaXMuZmlsdGVyUmVuZGVyTGltaXQuc2V0KHRoaXMuSU5JVElBTF9GSUxURVJfUkVOREVSKTtcbiAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgIHRoaXMuc2VhcmNoSW5wdXRFbCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBvblNlYXJjaElucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCh2YWwpO1xuICAgIHRoaXMuZmlsdGVyUmVuZGVyTGltaXQuc2V0KHRoaXMuSU5JVElBTF9GSUxURVJfUkVOREVSKTtcbiAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoMCk7XG4gIH1cblxuICBvblRyaWdnZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgfHwgZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5vcGVuRHJvcGRvd24oKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy52aXNpYmxlRmlsdGVyZWRPcHRpb25zKCk7XG4gICAgY29uc3QgY291bnQgPSB2aXNpYmxlLmxlbmd0aDtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gKHRoaXMuZm9jdXNlZEluZGV4KCkgKyAxKSAlIGNvdW50O1xuICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChuZXh0KTtcbiAgICAgICAgICB0aGlzLnNjcm9sbEZvY3VzZWRJbnRvVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLmZvY3VzZWRJbmRleCgpIDw9IDAgPyBjb3VudCAtIDEgOiB0aGlzLmZvY3VzZWRJbmRleCgpIC0gMTtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQocHJldik7XG4gICAgICAgICAgdGhpcy5zY3JvbGxGb2N1c2VkSW50b1ZpZXcoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VudGVyJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgY291bnQpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdE9wdGlvbih2aXNpYmxlW2lkeF0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RPcHRpb24odmlzaWJsZVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdFc2NhcGUnOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1RhYic6IHtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsRm9jdXNlZEludG9WaWV3KCk6IHZvaWQge1xuICAgIGNvbnN0IGxpc3RFbCA9IHRoaXMub3B0aW9uc0xpc3RFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghbGlzdEVsKSByZXR1cm47XG4gICAgY29uc3QgaXRlbXMgPSBsaXN0RWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5jb21ib2JveC1vcHRpb24taXRlbScpO1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgaWYgKGl0ZW1zICYmIGl0ZW1zW2lkeF0pIHtcbiAgICAgIGl0ZW1zW2lkeF0uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFN5bmMgcmVhY3RpdmUgZm9ybSBjb250cm9sIHZhbHVlIGNoYW5nZXMgdG8gY3VycmVudFZhbHVlIHNpZ25hbFxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybUNvbnRyb2woKTtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuY3VycmVudFZhbHVlLnNldChjdHJsLnZhbHVlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sU3ViID0gY3RybC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2KSA9PiB0aGlzLmN1cnJlbnRWYWx1ZS5zZXQodikpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICAvLyBSZS1ydW4gd2hlbmV2ZXIgdGhlIGJvdW5kIGRhdGEgc291cmNlLCB0aGUgc2Vzc2lvbiwgb3IgdGhlIHBhcmVudCBmb3JtIGNoYW5nZXMuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9uU2VydmljZT8uc2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMucGFyZW50Rm9ybSgpO1xuICAgICAgICB0aGlzLmNvbmZpZygpOyAvLyBkZXBlbmRlbmN5OiBkYXRhIHNvdXJjZSBjb25maWd1cmF0aW9uXG5cbiAgICAgICAgdGhpcy5mb3JtQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKGZvcm0gJiYgdGhpcy5pc0R5bmFtaWNTb3VyY2UoKSkge1xuICAgICAgICAgIHRoaXMuZm9ybUNoYW5nZXNTdWIgPSBmb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zY2hlZHVsZVJlbG9hZCgpKTtcbiAgICAgICAgfVxuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5zY2hlZHVsZVJlbG9hZCgpKTtcbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubG9va3VwU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubWFzdGVyRGF0YVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZvcm1DaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIGlmICh0aGlzLnJlbG9hZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRUaW1lcik7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlUmVsb2FkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlbG9hZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRUaW1lcik7XG4gICAgdGhpcy5yZWxvYWRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWxvYWREYXRhU291cmNlT3B0aW9ucyh0aGlzLnNlc3Npb25TZXJ2aWNlPy5zZXNzaW9uQ29udGV4dCgpID8/IHt9KTtcbiAgICB9LCAyNTApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWxvYWREYXRhU291cmNlT3B0aW9ucyhzZXNzaW9uOiBTZXNzaW9uQ29udGV4dE1hcCk6IHZvaWQge1xuICAgIGNvbnN0IGRzID0gdGhpcy5jb25maWcoKS5kYXRhU291cmNlO1xuICAgIGlmICghZHMgfHwgIXRoaXMuaXNEeW5hbWljU291cmNlKCkpIHJldHVybjtcblxuICAgIC8vIDEuIERhdGFiYXNlIFRhYmxlIC8gU3RvcmVkIFByb2NlZHVyZSAvIFJFU1QgQVBJIExvb2t1cFxuICAgIGNvbnN0IGlzQXBpID0gZHMuc291cmNlVHlwZSA9PT0gJ2FwaScgfHwgISFkcy5hcGlFbmRwb2ludDtcbiAgICBjb25zdCBpc0RiTG9va3VwID0gISEoZHMuZW50aXR5TmFtZSAmJiAoZHMuc291cmNlVHlwZSA9PT0gJ3RhYmxlJyB8fCBkcy5zb3VyY2VUeXBlID09PSAncHJvY2VkdXJlJykpO1xuXG4gICAgaWYgKChpc0FwaSB8fCBpc0RiTG9va3VwKSAmJiB0aGlzLmxvb2t1cEFkYXB0ZXIpIHtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSB0aGlzLnBhcmVudEZvcm0oKT8uZ2V0UmF3VmFsdWUoKSA/PyB7fTtcblxuICAgICAgLy8gRG8gbm90IGNhbGwgdW50aWwgZXZlcnkgY2FudmFzIGZpZWxkIHRoaXMgbG9va3VwIGRlcGVuZHMgb24gaXMgZmlsbGVkLlxuICAgICAgY29uc3QgbWlzc2luZyA9IGZpbmRNaXNzaW5nQ2FudmFzRmllbGRzKGRzLnBhcmFtZXRlck1hcHBpbmdzLCBmb3JtVmFsdWVzKTtcbiAgICAgIHRoaXMud2FpdGluZ0Zvci5zZXQobWlzc2luZyk7XG4gICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubG9va3VwU3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmxvYWRFcnJvci5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuZHluYW1pY09wdGlvbnMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5sYXN0UmVxdWVzdEtleSA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlZCBwcm9jZWR1cmVzIG9ubHkgcmVjZWl2ZSBleHBsaWNpdCBtYXBwaW5ncyBzbyBTUUwgU2VydmVyIGRvZXNuJ3QgcmVqZWN0IHVua25vd24gYXJndW1lbnRzLlxuICAgICAgbGV0IHJlc29sdmVkUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVkUGFyYW1zID0ge1xuICAgICAgICAgIC4uLihkcy5zb3VyY2VUeXBlID09PSAndGFibGUnID8gc2Vzc2lvbiA6IHt9KSxcbiAgICAgICAgICAuLi5yZXNvbHZlUGFyYW1ldGVyTWFwcGluZ3MoZHMucGFyYW1ldGVyTWFwcGluZ3MsIHNlc3Npb24sIGZvcm1WYWx1ZXMpLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb29rdXBTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZHluYW1pY09wdGlvbnMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5sb2FkRXJyb3Iuc2V0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ludmFsaWQgcGFyYW1ldGVyIHZhbHVlLicpO1xuICAgICAgICB0aGlzLmxhc3RSZXF1ZXN0S2V5ID0gJyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdDogYW55ID0ge1xuICAgICAgICBzb3VyY2VUeXBlOiBkcy5zb3VyY2VUeXBlID8/IChpc0FwaSA/ICdhcGknIDogJ3RhYmxlJyksXG4gICAgICAgIGVudGl0eU5hbWU6IGRzLmVudGl0eU5hbWUgPz8gKGlzQXBpID8gZHMuYXBpRW5kcG9pbnQgOiAnJyksXG4gICAgICAgIHNjaGVtYTogZHMuc2NoZW1hID8/ICdkYm8nLFxuICAgICAgICB2YWx1ZUZpZWxkOiBkcy52YWx1ZUZpZWxkPy50cmltKCkgfHwgJycsXG4gICAgICAgIGRpc3BsYXlGaWVsZDogZHMuZGlzcGxheUZpZWxkPy50cmltKCkgfHwgJycsXG4gICAgICAgIGZpbHRlcjogZHMuZmlsdGVyLFxuICAgICAgICBwYXJhbWV0ZXJzOiByZXNvbHZlZFBhcmFtcyxcbiAgICAgICAgYXBpRW5kcG9pbnQ6IGRzLmFwaUVuZHBvaW50LFxuICAgICAgICBkYXRhUGF0aDogZHMuZGF0YVBhdGgsXG4gICAgICAgIHVzZVByb3h5OiBkcy51c2VQcm94eSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXF1ZXN0S2V5ID0gSlNPTi5zdHJpbmdpZnkocmVxdWVzdCk7XG4gICAgICBpZiAocmVxdWVzdEtleSA9PT0gdGhpcy5sYXN0UmVxdWVzdEtleSkgcmV0dXJuOyAvLyBub3RoaW5nIGNoYW5nZWRcbiAgICAgIHRoaXMubGFzdFJlcXVlc3RLZXkgPSByZXF1ZXN0S2V5O1xuXG4gICAgICAvLyBTdG9yZWQgcHJvY2VkdXJlcyBvbiBsb2NhbCBkYXRhYmFzZXMgY2FuIHRha2UgYSBjb3VwbGUgbWludXRlcyB0byBleGVjdXRlLlxuICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0IGlzIDMwMCwwMDBtcyAoNSBtaW51dGVzKSwgY29uZmlndXJhYmxlIHZpYSBjb21wb25lbnQgcHJvcGVydGllcyBvciByZXBvcnRpbmdDb25maWcuXG4gICAgICBjb25zdCB0aW1lb3V0TXMgPVxuICAgICAgICAoKGRzIGFzIGFueSk/LnRpbWVvdXRNcyBhcyBudW1iZXIpIHx8XG4gICAgICAgICh0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/LlsndGltZW91dE1zJ10gYXMgbnVtYmVyKSB8fFxuICAgICAgICB0aGlzLnJlcG9ydGluZ0NvbmZpZz8ubG9va3VwVGltZW91dE1zIHx8XG4gICAgICAgIDMwMDAwMDtcblxuICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkRXJyb3Iuc2V0KG51bGwpO1xuICAgICAgdGhpcy5sb29rdXBTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmxvb2t1cFN1YiA9IHRoaXMubG9va3VwQWRhcHRlclxuICAgICAgICAuZmV0Y2hPcHRpb25zKHJlcXVlc3QpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRpbWVvdXQoe1xuICAgICAgICAgICAgZWFjaDogdGltZW91dE1zLFxuICAgICAgICAgICAgd2l0aDogKCkgPT5cbiAgICAgICAgICAgICAgdGhyb3dFcnJvcihcbiAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgTG9va3VwIHF1ZXJ5IHRpbWVkIG91dCBhZnRlciAke01hdGgucm91bmQodGltZW91dE1zIC8gMTAwMCl9cyAoc3RvcmVkIHByb2NlZHVyZSB0b29rIHRvbyBsb25nIHRvIHJlc3BvbmQgb24gbG9jYWwgZGF0YWJhc2UpYFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChpdGVtcykgPT4ge1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5oYXNMb2FkZWQuc2V0KHRydWUpO1xuICAgICAgICAgIC8vIERlZHVwbGljYXRlIGl0ZW1zIGJ5IGtleS92YWx1ZSB0byBlbnN1cmUgY2xlYW4gc2VsZWN0IG9wdGlvbnNcbiAgICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgY29uc3QgZGVkdXBlZDogRHJvcGRvd25PcHRpb25bXSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgaXQgb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBTdHJpbmcoaXQudmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFzZWVuLmhhcyhrKSkge1xuICAgICAgICAgICAgICBzZWVuLmFkZChrKTtcbiAgICAgICAgICAgICAgZGVkdXBlZC5wdXNoKHsga2V5OiBpdC52YWx1ZSwgbGFiZWw6IGl0LmxhYmVsIHx8IGsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZHluYW1pY09wdGlvbnMuc2V0KGRlZHVwZWQpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtScHREcm9wZG93bl0gRmFpbGVkIHRvIGxvYWQgbG9va3VwIG9wdGlvbnMgZm9yICR7ZHMuZW50aXR5TmFtZX06YCwgZXJyKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuaGFzTG9hZGVkLnNldCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmR5bmFtaWNPcHRpb25zLnNldChbXSk7XG4gICAgICAgICAgdGhpcy5sYXN0UmVxdWVzdEtleSA9ICcnOyAvLyBhbGxvdyByZXRyeVxuICAgICAgICAgIHRoaXMubG9hZEVycm9yLnNldChlcnI/Lm1lc3NhZ2UgfHwgJ0RhdGFiYXNlIHF1ZXJ5IGVycm9yJyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAyLiBMZWdhY3kgTWFzdGVyIERhdGEgUHJvdmlkZXJcbiAgICBpZiAoZHMubWFzdGVyTmFtZSAmJiB0aGlzLm1hc3RlckRhdGFQcm92aWRlciAmJiAhdGhpcy5tYXN0ZXJEYXRhU3ViKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWRFcnJvci5zZXQobnVsbCk7XG4gICAgICB0aGlzLm1hc3RlckRhdGFTdWIgPSB0aGlzLm1hc3RlckRhdGFQcm92aWRlci5nZXRNYXN0ZXJEYXRhKGRzLm1hc3Rlck5hbWUpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChpdGVtcykgPT4ge1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5oYXNMb2FkZWQuc2V0KHRydWUpO1xuICAgICAgICAgIHRoaXMuZHluYW1pY09wdGlvbnMuc2V0KFxuICAgICAgICAgICAgaXRlbXMubWFwKChpdCkgPT4gKHtcbiAgICAgICAgICAgICAga2V5OiBTdHJpbmcoaXQudmFsdWUgPz8gaXRbJ2lkJ10gPz8gJycpLFxuICAgICAgICAgICAgICBsYWJlbDogU3RyaW5nKGl0LmxhYmVsID8/IGl0WyduYW1lJ10gPz8gJycpLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbUnB0RHJvcGRvd25dIEZhaWxlZCB0byBsb2FkIG1hc3RlciBkYXRhIGZvciAke2RzLm1hc3Rlck5hbWV9OmAsIGVycik7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmhhc0xvYWRlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5sb2FkRXJyb3Iuc2V0KGVycj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGxvYWQgbWFzdGVyIGRhdGEnKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiICAgIDxkaXYgY2xhc3M9XCJycHQtZmllbGQtZ3JvdXBcIj5cbiAgICAgIEBpZiAoY29uZmlnKCkubGFiZWwpIHtcbiAgICAgICAgPGxhYmVsIFtmb3JdPVwiZWxlbWVudElkKClcIiBjbGFzcz1cInJwdC1sYWJlbFwiPlxuICAgICAgICAgIHt7IGNvbmZpZygpLmxhYmVsIH19XG4gICAgICAgICAgQGlmIChjb25maWcoKS52YWxpZGF0aW9uPy5yZXF1aXJlZCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcmVxdWlyZWQtbWFya2VyXCI+Kjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoaXNTZWFyY2hhYmxlKCkpIHtcbiAgICAgICAgPCEtLSBTZWFyY2hhYmxlIFR5cGVhaGVhZCBDb21ib2JveCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1jb21ib2JveC13cmFwcGVyXCIgI2NvbWJvYm94V3JhcHBlciAjY29tYm9ib3hPcmlnaW49XCJjZGtPdmVybGF5T3JpZ2luXCIgY2RrT3ZlcmxheU9yaWdpbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicnB0LWNvbWJvYm94LXRyaWdnZXJcIlxuICAgICAgICAgICAgW2lkXT1cImVsZW1lbnRJZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ycHQtaW52YWxpZF09XCJpc0ludmFsaWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuaXMtb3Blbl09XCJpc09wZW4oKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybUNvbnRyb2woKS5kaXNhYmxlZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPcGVuKCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25UcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRyaWdnZXItbGFiZWxcIiBbY2xhc3MuaXMtcGxhY2Vob2xkZXJdPVwiIXNlbGVjdGVkT3B0aW9uKClcIj5cbiAgICAgICAgICAgICAge3sgc2VsZWN0ZWRPcHRpb24oKSA/IHNlbGVjdGVkT3B0aW9uKCkhLmxhYmVsIDogcGxhY2Vob2xkZXIoKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpZ2dlci1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIEBpZiAoaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZG90LXB1bHNlXCIgc3R5bGU9XCJjb2xvcjogIzI1NjNlYjsgbWFyZ2luLXJpZ2h0OiA0cHg7XCIgdGl0bGU9XCJFeGVjdXRpbmcgcXVlcnkgb24gZGF0YWJhc2UuLi5cIj48L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChsb2FkRXJyb3IoKSAmJiAhaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJpZ2dlci1yZXRyeS1idG5cIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZXRyeSBkYXRhYmFzZSBxdWVyeVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmV0cnkgZGF0YWJhc2UgcXVlcnlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJldHJ5TG9va3VwKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIOKGuyBSZXRyeVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRPcHRpb24oKSAmJiAhZm9ybUNvbnRyb2woKS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRyaWdnZXItY2xlYXItYnRuXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQ2xlYXIgc2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhciBzZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2xlYXJTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJjbGVhclNlbGVjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICDinJVcbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cmlnZ2VyLWFycm93XCIgW2NsYXNzLnJvdGF0ZWRdPVwiaXNPcGVuKClcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCAxMiA4XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMSAxLjVMNiA2LjVMMTEgMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cImNvbWJvYm94T3JpZ2luXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuKClcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cIm92ZXJsYXlQb3NpdGlvbnNcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5V2lkdGhdPVwidHJpZ2dlcldpZHRoKClcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGhdPVwiJ21pbigxODBweCwgY2FsYygxMDB2dyAtIDE2cHgpKSdcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5RmxleGlibGVEaW1lbnNpb25zXT1cInRydWVcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5Vmlld3BvcnRNYXJnaW5dPVwiOFwiXG4gICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQdXNoXT1cInRydWVcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3ldPVwic2Nyb2xsU3RyYXRlZ3lcIlxuICAgICAgICAgIChvdmVybGF5T3V0c2lkZUNsaWNrKT1cImNsb3NlRHJvcGRvd24oKVwiXG4gICAgICAgICAgKHBvc2l0aW9uQ2hhbmdlKT1cIm9uUG9zaXRpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgKGF0dGFjaCk9XCJvbk92ZXJsYXlBdHRhY2hlZCgpXCJcbiAgICAgICAgICAoZGV0YWNoKT1cImNsb3NlRHJvcGRvd24oKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInJwdC1jb21ib2JveC1tZW51XCJcbiAgICAgICAgICAgIFtjbGFzcy5vcGVucy1hYm92ZV09XCJvcGVuc0Fib3ZlKClcIlxuICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPCEtLSBSZWFsLXRpbWUgRmlsdGVyIFNlYXJjaCBCb3ggLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc2VhcmNoLWJveFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbWJvYm94LXNlYXJjaC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiOFwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIyMVwiIHkxPVwiMjFcIiB4Mj1cIjE2LjY1XCIgeTI9XCIxNi42NVwiPjwvbGluZT5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjb21ib2JveC1zZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSB0byBmaWx0ZXIuLi5cIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXJtKClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJmb2N1c2VkSW5kZXgoKSA+PSAwID8gKGVsZW1lbnRJZCgpICsgJ19vcHRfJyArIGZvY3VzZWRJbmRleCgpKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvblNlYXJjaElucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uU2VhcmNoS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgQGlmIChzZWFyY2hUZXJtKCkpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29tYm9ib3gtc2VhcmNoLWNsZWFyXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQ2xlYXIgZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICDinJVcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gRmlsdGVyZWQgT3B0aW9ucyBMaXN0IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvYm94LW9wdGlvbnMtbGlzdFwiICNvcHRpb25zTGlzdEVsIChzY3JvbGwpPVwib25PcHRpb25zU2Nyb2xsKCRldmVudClcIj5cbiAgICAgICAgICAgICAgQGlmICh3YWl0aW5nRm9yKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1zdGF0dXMtcm93IHdhaXRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPldhaXRpbmcgZm9yIHt7IHdhaXRpbmdMYWJlbCgpIH19Li4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChpc0xvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1zdGF0dXMtcm93IGxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBkb3QtcHVsc2VcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5FeGVjdXRpbmcgcXVlcnkgb24gZGF0YWJhc2UgKG1heSB0YWtlIDHigJMyIG1pbnV0ZXMgb24gbG9jYWwgZGF0YWJhc2UpLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChsb2FkRXJyb3IoKSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1zdGF0dXMtcm93IGVycm9yXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5FcnJvcjoge3sgbG9hZEVycm9yKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNvbWJvYm94LXJldHJ5LWJ0blwiIChjbGljayk9XCJyZXRyeUxvb2t1cCgkZXZlbnQpXCI+4oa7IFJldHJ5IFF1ZXJ5PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGlzRHluYW1pY1NvdXJjZSgpICYmIGhhc0xvYWRlZCgpICYmIGFsbE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc3RhdHVzLXJvdyBlbXB0eVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+Tm8gcmVjb3JkcyBmb3VuZCAoY2hlY2sgcGFyYW1ldGVycyk8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1zdGF0dXMtcm93IGVtcHR5XCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5ObyBvcHRpb25zIG1hdGNoaW5nIFwie3sgc2VhcmNoVGVybSgpIH19XCI8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIEBmb3IgKG9wdCBvZiB2aXNpYmxlRmlsdGVyZWRPcHRpb25zKCk7IHRyYWNrIG9wdC5rZXk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZWxlbWVudElkKCkgKyAnX29wdF8nICsgaVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29tYm9ib3gtb3B0aW9uLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChvcHQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWZvY3VzZWRdPVwiZm9jdXNlZEluZGV4KCkgPT09IGlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RPcHRpb24ob3B0KVwiXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImZvY3VzZWRJbmRleC5zZXQoaSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdC1sYWJlbFwiPnt7IG9wdC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpc1NlbGVjdGVkKG9wdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdC1jaGVja1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPuKckzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoZXhjZXNzRmlsdGVyZWRDb3VudCgpID4gMCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvYm94LXN0YXR1cy1yb3cgaGludFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TaG93aW5nIHt7IHZpc2libGVGaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggfX0gb2Yge3sgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIH19IG1hdGNoZXMuIFNjcm9sbCBkb3duIG9yPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb21ib2JveC1sb2FkLWFsbC1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJsb2FkQWxsRmlsdGVyZWQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBMb2FkIGFsbCB7eyBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDwhLS0gTmF0aXZlIEJyb3dzZXIgU2VsZWN0IEZhbGxiYWNrIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgW2lkXT1cImVsZW1lbnRJZCgpXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ycHQtaW52YWxpZF09XCJpc0ludmFsaWQoKVwiXG4gICAgICAgICAgICBjbGFzcz1cInJwdC1zZWxlY3RcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAod2FpdGluZ0ZvcigpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIGRpc2FibGVkIHNlbGVjdGVkPldhaXRpbmcgZm9yIHt7IHdhaXRpbmdMYWJlbCgpIH19Li4uPC9vcHRpb24+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChpc0xvYWRpbmcoKSkge1xuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgZGlzYWJsZWQgc2VsZWN0ZWQ+TG9hZGluZyBvcHRpb25zIGZyb20gZGF0YWJhc2UuLi48L29wdGlvbj5cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKGxvYWRFcnJvcigpKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBkaXNhYmxlZCBzZWxlY3RlZD5FcnJvcjoge3sgbG9hZEVycm9yKCkgfX08L29wdGlvbj5cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKGlzRHluYW1pY1NvdXJjZSgpICYmIGhhc0xvYWRlZCgpICYmIGFsbE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIGRpc2FibGVkIHNlbGVjdGVkPi0tIE5vIHJlY29yZHMgZm91bmQgKGNoZWNrIHBhcmFtZXRlcnMpIC0tPC9vcHRpb24+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChwbGFjZWhvbGRlcigpKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBbZGlzYWJsZWRdPVwiY29uZmlnKCkudmFsaWRhdGlvbj8ucmVxdWlyZWRcIj57eyBwbGFjZWhvbGRlcigpIH19PC9vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZm9yIChvcHQgb2YgcmVuZGVyZWRPcHRpb25zKCk7IHRyYWNrIG9wdC5rZXkpIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJvcHQua2V5XCI+e3sgb3B0LmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGhhc0V4Y2Vzc09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgZGlzYWJsZWQ+Li4uIGFuZCB7eyBleGNlc3NPcHRpb25zQ291bnQoKSB9fSBtb3JlIHJlY29yZHMgKHJlZmluZSBmaWx0ZXIpIC4uLjwvb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc2VsZWN0LWFycm93XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCAxMiA4XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xIDEuNUw2IDYuNUwxMSAxLjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc2hvd1N0YXR1cygpICYmIGlzRHluYW1pY1NvdXJjZSgpICYmIHN0YXR1c1RleHQoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXN0YXR1cy1iYWRnZVwiIFthdHRyLmRhdGEtc3RhdHVzXT1cInN0YXR1c0tpbmQoKVwiPlxuICAgICAgICAgIEBzd2l0Y2ggKHN0YXR1c0tpbmQoKSkge1xuICAgICAgICAgICAgQGNhc2UgKCdsb2FkaW5nJykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZG90LXB1bHNlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj5Mb2FkaW5nIGZyb20gZGF0YWJhc2XigKY8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ29rJykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZG90LW9rXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBkeW5hbWljT3B0aW9ucygpLmxlbmd0aCB9fSByZWNvcmRzIGxvYWRlZDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnd2FpdGluZycpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90IGRvdC13YXJuXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj5XYWl0aW5nIGZvcjo8L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWl0aW5nLXRva2Vuc1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGsgb2Ygd2FpdGluZ0ZvcigpOyB0cmFjayBrKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIndhaXRpbmctdG9rZW5cIj57eyBrIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2Vycm9yJykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZG90LWVyclwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgbG9hZEVycm9yKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LWJhZGdlLXJldHJ5LWJ0blwiIChjbGljayk9XCJyZXRyeUxvb2t1cCgkZXZlbnQpXCI+4oa7IFJldHJ5PC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2VtcHR5Jykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPk5vIHJlY29yZHMgZm91bmQgZm9yIHBhcmFtZXRlcnM8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKGVycm9yTWVzc2FnZSgpKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWVycm9yLXRleHRcIj57eyBlcnJvck1lc3NhZ2UoKSB9fTwvc3Bhbj5cbiAgICAgIH1cbiAgICA8L2Rpdj4iXX0=
|