igniteui-angular 15.1.30 → 15.1.31
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/esm2020/lib/action-strip/action-strip.component.mjs +3 -3
- package/esm2020/lib/action-strip/grid-actions/grid-action-button.component.mjs +3 -3
- package/esm2020/lib/banner/banner.component.mjs +8 -8
- package/esm2020/lib/card/card.component.mjs +3 -3
- package/esm2020/lib/carousel/carousel.component.mjs +7 -7
- package/esm2020/lib/combo/combo-dropdown.component.mjs +3 -3
- package/esm2020/lib/combo/combo.common.mjs +5 -5
- package/esm2020/lib/combo/combo.component.mjs +3 -3
- package/esm2020/lib/combo/combo.directives.mjs +2 -2
- package/esm2020/lib/core/navigation/directives.mjs +3 -3
- package/esm2020/lib/date-common/calendar-container/calendar-container.component.mjs +3 -3
- package/esm2020/lib/date-picker/date-picker.component.mjs +7 -7
- package/esm2020/lib/date-range-picker/date-range-picker.component.mjs +6 -6
- package/esm2020/lib/dialog/dialog.component.mjs +5 -5
- package/esm2020/lib/directives/button/button.directive.mjs +8 -8
- package/esm2020/lib/directives/ripple/ripple.directive.mjs +6 -6
- package/esm2020/lib/directives/tooltip/tooltip-target.directive.mjs +7 -9
- package/esm2020/lib/directives/tooltip/tooltip.directive.mjs +2 -2
- package/esm2020/lib/drop-down/drop-down.component.mjs +3 -3
- package/esm2020/lib/expansion-panel/expansion-panel.component.mjs +4 -4
- package/esm2020/lib/grids/column-actions/column-actions.component.mjs +3 -3
- package/esm2020/lib/grids/common/crud.service.mjs +2 -2
- package/esm2020/lib/grids/filtering/base/grid-filtering-row.component.mjs +3 -3
- package/esm2020/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.mjs +3 -3
- package/esm2020/lib/grids/filtering/excel-style/excel-style-date-expression.component.mjs +3 -3
- package/esm2020/lib/grids/filtering/excel-style/excel-style-default-expression.component.mjs +3 -3
- package/esm2020/lib/grids/filtering/excel-style/excel-style-header.component.mjs +3 -3
- package/esm2020/lib/grids/filtering/excel-style/excel-style-moving.component.mjs +3 -3
- package/esm2020/lib/grids/filtering/excel-style/excel-style-search.component.mjs +3 -3
- package/esm2020/lib/grids/filtering/excel-style/excel-style-sorting.component.mjs +3 -3
- package/esm2020/lib/grids/grid/grid.component.mjs +3 -3
- package/esm2020/lib/grids/grid-base.directive.mjs +4 -4
- package/esm2020/lib/grids/hierarchical-grid/hierarchical-grid.component.mjs +3 -3
- package/esm2020/lib/grids/tree-grid/tree-grid.component.mjs +3 -3
- package/esm2020/lib/query-builder/query-builder.component.mjs +3 -3
- package/esm2020/lib/simple-combo/simple-combo.component.mjs +3 -3
- package/esm2020/lib/snackbar/snackbar.component.mjs +4 -4
- package/esm2020/lib/tabs/tabs/tabs.component.mjs +3 -3
- package/esm2020/lib/time-picker/time-picker.component.mjs +6 -5
- package/esm2020/lib/toast/toast.component.mjs +2 -2
- package/esm2020/lib/tree/tree-node/tree-node.component.mjs +4 -4
- package/fesm2015/igniteui-angular.mjs +117 -118
- package/fesm2015/igniteui-angular.mjs.map +1 -1
- package/fesm2020/igniteui-angular.mjs +117 -118
- package/fesm2020/igniteui-angular.mjs.map +1 -1
- package/lib/banner/banner.component.d.ts +5 -5
- package/lib/card/card.component.d.ts +2 -2
- package/lib/carousel/carousel.component.d.ts +6 -6
- package/lib/combo/combo.common.d.ts +4 -4
- package/lib/combo/combo.directives.d.ts +1 -1
- package/lib/core/navigation/directives.d.ts +2 -2
- package/lib/date-picker/date-picker.component.d.ts +4 -4
- package/lib/date-range-picker/date-range-picker.component.d.ts +3 -3
- package/lib/dialog/dialog.component.d.ts +4 -4
- package/lib/directives/button/button.directive.d.ts +7 -7
- package/lib/directives/ripple/ripple.directive.d.ts +6 -6
- package/lib/directives/tooltip/tooltip-target.directive.d.ts +6 -8
- package/lib/directives/tooltip/tooltip.directive.d.ts +1 -1
- package/lib/expansion-panel/expansion-panel.component.d.ts +3 -3
- package/lib/grids/common/crud.service.d.ts +1 -1
- package/lib/grids/grid-base.directive.d.ts +3 -3
- package/lib/snackbar/snackbar.component.d.ts +1 -1
- package/lib/time-picker/time-picker.component.d.ts +1 -1
- package/lib/toast/toast.component.d.ts +1 -1
- package/lib/tree/tree-node/tree-node.component.d.ts +3 -3
- package/migrations/common/UpdateChanges.js +1 -1
- package/package.json +1 -1
|
@@ -705,10 +705,10 @@ export class IgxGridFilteringRowComponent {
|
|
|
705
705
|
}
|
|
706
706
|
}
|
|
707
707
|
IgxGridFilteringRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IgxGridFilteringRowComponent, deps: [{ token: i1.IgxFilteringService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i2.PlatformUtil }], target: i0.ɵɵFactoryTarget.Component });
|
|
708
|
-
IgxGridFilteringRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: IgxGridFilteringRowComponent, selector: "igx-grid-filtering-row", inputs: { column: "column", value: "value" }, host: { listeners: { "keydown": "onKeydownHandler($event)" }, properties: { "class.igx-grid__filtering-row": "this.defaultCSSClass", "class.igx-grid__filtering-row--compact": "this.compactCSSClass", "class.igx-grid__filtering-row--cosy": "this.cosyCSSClass" } }, viewQueries: [{ propertyName: "defaultFilterUI", first: true, predicate: ["defaultFilterUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultDateUI", first: true, predicate: ["defaultDateUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultTimeUI", first: true, predicate: ["defaultTimeUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultDateTimeUI", first: true, predicate: ["defaultDateTimeUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true, read: ElementRef }, { propertyName: "dropDownConditions", first: true, predicate: ["inputGroupConditions"], descendants: true, read: IgxDropDownComponent, static: true }, { propertyName: "chipsArea", first: true, predicate: ["chipsArea"], descendants: true, read: IgxChipsAreaComponent, static: true }, { propertyName: "inputGroup", first: true, predicate: ["inputGroup"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "inputGroupPrefix", first: true, predicate: ["inputGroupPrefix"], descendants: true, read: ElementRef }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "operand", first: true, predicate: ["operand"], descendants: true }, { propertyName: "closeButton", first: true, predicate: ["closeButton"], descendants: true, static: true }, { propertyName: "dropDownOperators", predicate: ["operators"], descendants: true, read: IgxDropDownComponent }], ngImport: i0, template: "<!-- Have to apply styles inline because of the overlay outlet ... -->\n<igx-drop-down #inputGroupConditions [displayDensity]=\"displayDensity\" [height]=\"'200px'\" (selectionChanging)=\"onConditionsChanged($event)\">\n <igx-drop-down-item *ngFor=\"let condition of conditions\"\n [value]=\"condition\"\n [selected]=\"isConditionSelected(condition)\">\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon family=\"imx-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{ translateCondition(condition) }}</span>\n </div>\n </igx-drop-down-item>\n</igx-drop-down>\n\n<ng-template #defaultFilterUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n autocomplete=\"off\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [type]=\"type\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-template #defaultDateUI>\n <igx-date-picker #picker\n [(value)]=\"value\"\n [readOnly]=\"true\"\n [outlet]=\"filteringService.grid.outlet\"\n [locale]=\"filteringService.grid.locale\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\"\n type=\"box\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [placeholder]=\"placeholder\"\n [weekStart]=\"column.pipeArgs.weekStart\"\n [displayDensity]=\"displayDensity\"\n (keydown)=\"onInputKeyDown($event)\"\n (focusout)=\"onInputGroupFocusout()\"\n (closed)=\"focusEditElement()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n</ng-template>\n\n<ng-template #defaultTimeUI>\n <igx-time-picker #picker\n [(value)]=\"value\"\n [inputFormat]=\"column.defaultTimeFormat\"\n [locale]=\"filteringService.grid.locale\"\n [formatter]=\"column.formatter\"\n [outlet]=\"filteringService.grid.outlet\"\n [displayDensity]=\"displayDensity\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"placeholder\"\n (closed)=\"focusEditElement()\"\n (focusout)=\"onInputGroupFocusout()\"\n (keydown)=\"onInputKeyDown($event)\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n</ng-template>\n\n<ng-template #defaultDateTimeUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n [igxDateTimeEditor]=\"column.defaultDateTimeFormat\"\n [value]=\"value\"\n (valueChange)=\"onInput($event)\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this }\"></ng-container>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-start\" *ngIf=\"showArrows\" (keydown)=\"onLeftArrowKeyDown($event)\" (click)=\"scrollChipsOnArrowPress('left')\">\n <igx-icon>navigate_before</igx-icon>\n</button>\n\n<div #container class=\"igx-grid__filtering-row-main\">\n <div>\n <igx-chips-area #chipsArea>\n <ng-container *ngFor=\"let item of expressionsList; index as i; let last = last;\" tabindex=\"0\">\n <igx-chip #chip id='chip'\n (pointerdown)=\"onChipPointerdown($event, chip)\"\n (click)=\"onChipClick($event, item)\"\n (keydown)=\"onChipKeyDown($event, item)\"\n (remove)=\"onChipRemoved($event, item)\"\n [selectable]=\"false\"\n [selected]=\"item.isSelected\"\n [displayDensity]=\"displayDensity\"\n [removable]=\"true\">\n <igx-icon\n igxPrefix\n family=\"imx-icons\"\n [name]=\"item.expression.condition.iconName\">\n </igx-icon>\n <span>{{filteringService.getChipLabel(item.expression)}}</span>\n </igx-chip>\n\n <span id='operand' *ngIf=\"!last\">\n <button igxButton type=\"button\" (click)=\"toggleOperatorsDropDown($event, i)\" [igxDropDownItemNavigation]=\"operators\" [displayDensity]=\"displayDensity\">\n <igx-icon>expand_more</igx-icon>\n <span>{{filteringService.getOperatorAsString(item.afterOperator)}}</span>\n </button>\n <igx-drop-down [displayDensity]=\"column.grid.displayDensity\" #operators (selectionChanging)=\"onLogicOperatorChanged($event, item)\">\n <igx-drop-down-item [value]=\"0\" [selected]=\"item.afterOperator === 0\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_and}}</igx-drop-down-item>\n <igx-drop-down-item [value]=\"1\" [selected]=\"item.afterOperator === 1\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_or}}</igx-drop-down-item>\n </igx-drop-down>\n </span>\n </ng-container>\n </igx-chips-area>\n </div>\n</div>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-end\" *ngIf=\"showArrows\" (click)=\"scrollChipsOnArrowPress('right')\">\n <igx-icon>navigate_next</igx-icon>\n</button>\n\n<div #buttonsContainer [ngClass]=\"isNarrowWidth ? 'igx-grid__filtering-row-editing-buttons--small' : 'igx-grid__filtering-row-editing-buttons'\">\n <button [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"clearFiltering()\" [disabled]=\"disabled\" [tabindex]=\"disabled\">\n <igx-icon>refresh</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_reset}}</span>\n </button>\n <button #closeButton [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"close()\">\n <igx-icon>close</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_close}}</span>\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: i5.IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "todayButtonLabel", "cancelButtonLabel", "spinLoop", "spinDelta", "outlet", "id", "formatViews", "disabledDates", "specialDates", "calendarFormat", "value", "minValue", "maxValue", "resourceStrings", "readOnly"], outputs: ["valueChange", "validationFailed"] }, { kind: "component", type: i6.IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: i6.IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: i7.IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: i8.IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: i9.IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: i10.IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: i11.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: i12.IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }, { kind: "component", type: i13.IgxChipsAreaComponent, selector: "igx-chips-area", inputs: ["width", "height"], outputs: ["reorder", "selectionChange", "moveStart", "moveEnd"] }, { kind: "component", type: i14.IgxChipComponent, selector: "igx-chip", inputs: ["id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "component", type: i15.IgxDropDownComponent, selector: "igx-drop-down", inputs: ["allowItemsFocus", "labelledBy"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "component", type: i16.IgxDropDownItemComponent, selector: "igx-drop-down-item" }, { kind: "directive", type: i17.IgxDropDownItemNavigationDirective, selector: "[igxDropDownItemNavigation]", inputs: ["igxDropDownItemNavigation"] }, { kind: "component", type: i18.IgxTimePickerComponent, selector: "igx-time-picker", inputs: ["id", "displayFormat", "inputFormat", "mode", "minValue", "maxValue", "spinLoop", "formatter", "headerOrientation", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "directive", type: i19.IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
708
|
+
IgxGridFilteringRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: IgxGridFilteringRowComponent, selector: "igx-grid-filtering-row", inputs: { column: "column", value: "value" }, host: { listeners: { "keydown": "onKeydownHandler($event)" }, properties: { "class.igx-grid__filtering-row": "this.defaultCSSClass", "class.igx-grid__filtering-row--compact": "this.compactCSSClass", "class.igx-grid__filtering-row--cosy": "this.cosyCSSClass" } }, viewQueries: [{ propertyName: "defaultFilterUI", first: true, predicate: ["defaultFilterUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultDateUI", first: true, predicate: ["defaultDateUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultTimeUI", first: true, predicate: ["defaultTimeUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultDateTimeUI", first: true, predicate: ["defaultDateTimeUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true, read: ElementRef }, { propertyName: "dropDownConditions", first: true, predicate: ["inputGroupConditions"], descendants: true, read: IgxDropDownComponent, static: true }, { propertyName: "chipsArea", first: true, predicate: ["chipsArea"], descendants: true, read: IgxChipsAreaComponent, static: true }, { propertyName: "inputGroup", first: true, predicate: ["inputGroup"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "inputGroupPrefix", first: true, predicate: ["inputGroupPrefix"], descendants: true, read: ElementRef }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "operand", first: true, predicate: ["operand"], descendants: true }, { propertyName: "closeButton", first: true, predicate: ["closeButton"], descendants: true, static: true }, { propertyName: "dropDownOperators", predicate: ["operators"], descendants: true, read: IgxDropDownComponent }], ngImport: i0, template: "<!-- Have to apply styles inline because of the overlay outlet ... -->\n<igx-drop-down #inputGroupConditions [displayDensity]=\"displayDensity\" [height]=\"'200px'\" (selectionChanging)=\"onConditionsChanged($event)\">\n <igx-drop-down-item *ngFor=\"let condition of conditions\"\n [value]=\"condition\"\n [selected]=\"isConditionSelected(condition)\">\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon family=\"imx-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{ translateCondition(condition) }}</span>\n </div>\n </igx-drop-down-item>\n</igx-drop-down>\n\n<ng-template #defaultFilterUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n autocomplete=\"off\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [type]=\"type\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-template #defaultDateUI>\n <igx-date-picker #picker\n [(value)]=\"value\"\n [readOnly]=\"true\"\n [outlet]=\"filteringService.grid.outlet\"\n [locale]=\"filteringService.grid.locale\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\"\n type=\"box\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [placeholder]=\"placeholder\"\n [weekStart]=\"column.pipeArgs.weekStart\"\n [displayDensity]=\"displayDensity\"\n (keydown)=\"onInputKeyDown($event)\"\n (focusout)=\"onInputGroupFocusout()\"\n (closed)=\"focusEditElement()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n</ng-template>\n\n<ng-template #defaultTimeUI>\n <igx-time-picker #picker\n [(value)]=\"value\"\n [inputFormat]=\"column.defaultTimeFormat\"\n [locale]=\"filteringService.grid.locale\"\n [formatter]=\"column.formatter\"\n [outlet]=\"filteringService.grid.outlet\"\n [displayDensity]=\"displayDensity\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"placeholder\"\n (closed)=\"focusEditElement()\"\n (focusout)=\"onInputGroupFocusout()\"\n (keydown)=\"onInputKeyDown($event)\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n</ng-template>\n\n<ng-template #defaultDateTimeUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n [igxDateTimeEditor]=\"column.defaultDateTimeFormat\"\n [value]=\"value\"\n (valueChange)=\"onInput($event)\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this }\"></ng-container>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-start\" *ngIf=\"showArrows\" (keydown)=\"onLeftArrowKeyDown($event)\" (click)=\"scrollChipsOnArrowPress('left')\">\n <igx-icon>navigate_before</igx-icon>\n</button>\n\n<div #container class=\"igx-grid__filtering-row-main\">\n <div>\n <igx-chips-area #chipsArea>\n <ng-container *ngFor=\"let item of expressionsList; index as i; let last = last;\" tabindex=\"0\">\n <igx-chip #chip id=\"chip\"\n (pointerdown)=\"onChipPointerdown($event, chip)\"\n (click)=\"onChipClick($event, item)\"\n (keydown)=\"onChipKeyDown($event, item)\"\n (remove)=\"onChipRemoved($event, item)\"\n [selectable]=\"false\"\n [selected]=\"item.isSelected\"\n [displayDensity]=\"displayDensity\"\n [removable]=\"true\">\n <igx-icon\n igxPrefix\n family=\"imx-icons\"\n [name]=\"item.expression.condition.iconName\">\n </igx-icon>\n <span>{{filteringService.getChipLabel(item.expression)}}</span>\n </igx-chip>\n\n <span id=\"operand\" *ngIf=\"!last\">\n <button igxButton type=\"button\" (click)=\"toggleOperatorsDropDown($event, i)\" [igxDropDownItemNavigation]=\"operators\" [displayDensity]=\"displayDensity\">\n <igx-icon>expand_more</igx-icon>\n <span>{{filteringService.getOperatorAsString(item.afterOperator)}}</span>\n </button>\n <igx-drop-down [displayDensity]=\"column.grid.displayDensity\" #operators (selectionChanging)=\"onLogicOperatorChanged($event, item)\">\n <igx-drop-down-item [value]=\"0\" [selected]=\"item.afterOperator === 0\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_and}}</igx-drop-down-item>\n <igx-drop-down-item [value]=\"1\" [selected]=\"item.afterOperator === 1\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_or}}</igx-drop-down-item>\n </igx-drop-down>\n </span>\n </ng-container>\n </igx-chips-area>\n </div>\n</div>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-end\" *ngIf=\"showArrows\" (click)=\"scrollChipsOnArrowPress('right')\">\n <igx-icon>navigate_next</igx-icon>\n</button>\n\n<div #buttonsContainer [ngClass]=\"isNarrowWidth ? 'igx-grid__filtering-row-editing-buttons--small' : 'igx-grid__filtering-row-editing-buttons'\">\n <button [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"clearFiltering()\" [disabled]=\"disabled\" [tabindex]=\"disabled\">\n <igx-icon>refresh</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_reset}}</span>\n </button>\n <button #closeButton [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"close()\">\n <igx-icon>close</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_close}}</span>\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: i5.IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "todayButtonLabel", "cancelButtonLabel", "spinLoop", "spinDelta", "outlet", "id", "formatViews", "disabledDates", "specialDates", "calendarFormat", "value", "minValue", "maxValue", "resourceStrings", "readOnly"], outputs: ["valueChange", "validationFailed"] }, { kind: "component", type: i6.IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: i6.IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: i7.IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: i8.IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: i9.IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: i10.IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: i11.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: i12.IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }, { kind: "component", type: i13.IgxChipsAreaComponent, selector: "igx-chips-area", inputs: ["width", "height"], outputs: ["reorder", "selectionChange", "moveStart", "moveEnd"] }, { kind: "component", type: i14.IgxChipComponent, selector: "igx-chip", inputs: ["id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "component", type: i15.IgxDropDownComponent, selector: "igx-drop-down", inputs: ["allowItemsFocus", "labelledBy"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "component", type: i16.IgxDropDownItemComponent, selector: "igx-drop-down-item" }, { kind: "directive", type: i17.IgxDropDownItemNavigationDirective, selector: "[igxDropDownItemNavigation]", inputs: ["igxDropDownItemNavigation"] }, { kind: "component", type: i18.IgxTimePickerComponent, selector: "igx-time-picker", inputs: ["id", "displayFormat", "inputFormat", "mode", "minValue", "maxValue", "spinLoop", "formatter", "headerOrientation", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "directive", type: i19.IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
709
709
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IgxGridFilteringRowComponent, decorators: [{
|
|
710
710
|
type: Component,
|
|
711
|
-
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-grid-filtering-row', template: "<!-- Have to apply styles inline because of the overlay outlet ... -->\n<igx-drop-down #inputGroupConditions [displayDensity]=\"displayDensity\" [height]=\"'200px'\" (selectionChanging)=\"onConditionsChanged($event)\">\n <igx-drop-down-item *ngFor=\"let condition of conditions\"\n [value]=\"condition\"\n [selected]=\"isConditionSelected(condition)\">\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon family=\"imx-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{ translateCondition(condition) }}</span>\n </div>\n </igx-drop-down-item>\n</igx-drop-down>\n\n<ng-template #defaultFilterUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n autocomplete=\"off\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [type]=\"type\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-template #defaultDateUI>\n <igx-date-picker #picker\n [(value)]=\"value\"\n [readOnly]=\"true\"\n [outlet]=\"filteringService.grid.outlet\"\n [locale]=\"filteringService.grid.locale\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\"\n type=\"box\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [placeholder]=\"placeholder\"\n [weekStart]=\"column.pipeArgs.weekStart\"\n [displayDensity]=\"displayDensity\"\n (keydown)=\"onInputKeyDown($event)\"\n (focusout)=\"onInputGroupFocusout()\"\n (closed)=\"focusEditElement()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n</ng-template>\n\n<ng-template #defaultTimeUI>\n <igx-time-picker #picker\n [(value)]=\"value\"\n [inputFormat]=\"column.defaultTimeFormat\"\n [locale]=\"filteringService.grid.locale\"\n [formatter]=\"column.formatter\"\n [outlet]=\"filteringService.grid.outlet\"\n [displayDensity]=\"displayDensity\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"placeholder\"\n (closed)=\"focusEditElement()\"\n (focusout)=\"onInputGroupFocusout()\"\n (keydown)=\"onInputKeyDown($event)\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n</ng-template>\n\n<ng-template #defaultDateTimeUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n [igxDateTimeEditor]=\"column.defaultDateTimeFormat\"\n [value]=\"value\"\n (valueChange)=\"onInput($event)\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this }\"></ng-container>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-start\" *ngIf=\"showArrows\" (keydown)=\"onLeftArrowKeyDown($event)\" (click)=\"scrollChipsOnArrowPress('left')\">\n <igx-icon>navigate_before</igx-icon>\n</button>\n\n<div #container class=\"igx-grid__filtering-row-main\">\n <div>\n <igx-chips-area #chipsArea>\n <ng-container *ngFor=\"let item of expressionsList; index as i; let last = last;\" tabindex=\"0\">\n <igx-chip #chip id='chip'\n (pointerdown)=\"onChipPointerdown($event, chip)\"\n (click)=\"onChipClick($event, item)\"\n (keydown)=\"onChipKeyDown($event, item)\"\n (remove)=\"onChipRemoved($event, item)\"\n [selectable]=\"false\"\n [selected]=\"item.isSelected\"\n [displayDensity]=\"displayDensity\"\n [removable]=\"true\">\n <igx-icon\n igxPrefix\n family=\"imx-icons\"\n [name]=\"item.expression.condition.iconName\">\n </igx-icon>\n <span>{{filteringService.getChipLabel(item.expression)}}</span>\n </igx-chip>\n\n <span id='operand' *ngIf=\"!last\">\n <button igxButton type=\"button\" (click)=\"toggleOperatorsDropDown($event, i)\" [igxDropDownItemNavigation]=\"operators\" [displayDensity]=\"displayDensity\">\n <igx-icon>expand_more</igx-icon>\n <span>{{filteringService.getOperatorAsString(item.afterOperator)}}</span>\n </button>\n <igx-drop-down [displayDensity]=\"column.grid.displayDensity\" #operators (selectionChanging)=\"onLogicOperatorChanged($event, item)\">\n <igx-drop-down-item [value]=\"0\" [selected]=\"item.afterOperator === 0\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_and}}</igx-drop-down-item>\n <igx-drop-down-item [value]=\"1\" [selected]=\"item.afterOperator === 1\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_or}}</igx-drop-down-item>\n </igx-drop-down>\n </span>\n </ng-container>\n </igx-chips-area>\n </div>\n</div>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-end\" *ngIf=\"showArrows\" (click)=\"scrollChipsOnArrowPress('right')\">\n <igx-icon>navigate_next</igx-icon>\n</button>\n\n<div #buttonsContainer [ngClass]=\"isNarrowWidth ? 'igx-grid__filtering-row-editing-buttons--small' : 'igx-grid__filtering-row-editing-buttons'\">\n <button [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"clearFiltering()\" [disabled]=\"disabled\" [tabindex]=\"disabled\">\n <igx-icon>refresh</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_reset}}</span>\n </button>\n <button #closeButton [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"close()\">\n <igx-icon>close</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_close}}</span>\n </button>\n</div>\n" }]
|
|
711
|
+
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-grid-filtering-row', template: "<!-- Have to apply styles inline because of the overlay outlet ... -->\n<igx-drop-down #inputGroupConditions [displayDensity]=\"displayDensity\" [height]=\"'200px'\" (selectionChanging)=\"onConditionsChanged($event)\">\n <igx-drop-down-item *ngFor=\"let condition of conditions\"\n [value]=\"condition\"\n [selected]=\"isConditionSelected(condition)\">\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon family=\"imx-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{ translateCondition(condition) }}</span>\n </div>\n </igx-drop-down-item>\n</igx-drop-down>\n\n<ng-template #defaultFilterUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n autocomplete=\"off\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [type]=\"type\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-template #defaultDateUI>\n <igx-date-picker #picker\n [(value)]=\"value\"\n [readOnly]=\"true\"\n [outlet]=\"filteringService.grid.outlet\"\n [locale]=\"filteringService.grid.locale\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\"\n type=\"box\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [placeholder]=\"placeholder\"\n [weekStart]=\"column.pipeArgs.weekStart\"\n [displayDensity]=\"displayDensity\"\n (keydown)=\"onInputKeyDown($event)\"\n (focusout)=\"onInputGroupFocusout()\"\n (closed)=\"focusEditElement()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n</ng-template>\n\n<ng-template #defaultTimeUI>\n <igx-time-picker #picker\n [(value)]=\"value\"\n [inputFormat]=\"column.defaultTimeFormat\"\n [locale]=\"filteringService.grid.locale\"\n [formatter]=\"column.formatter\"\n [outlet]=\"filteringService.grid.outlet\"\n [displayDensity]=\"displayDensity\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"placeholder\"\n (closed)=\"focusEditElement()\"\n (focusout)=\"onInputGroupFocusout()\"\n (keydown)=\"onInputKeyDown($event)\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n</ng-template>\n\n<ng-template #defaultDateTimeUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n [igxDateTimeEditor]=\"column.defaultDateTimeFormat\"\n [value]=\"value\"\n (valueChange)=\"onInput($event)\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this }\"></ng-container>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-start\" *ngIf=\"showArrows\" (keydown)=\"onLeftArrowKeyDown($event)\" (click)=\"scrollChipsOnArrowPress('left')\">\n <igx-icon>navigate_before</igx-icon>\n</button>\n\n<div #container class=\"igx-grid__filtering-row-main\">\n <div>\n <igx-chips-area #chipsArea>\n <ng-container *ngFor=\"let item of expressionsList; index as i; let last = last;\" tabindex=\"0\">\n <igx-chip #chip id=\"chip\"\n (pointerdown)=\"onChipPointerdown($event, chip)\"\n (click)=\"onChipClick($event, item)\"\n (keydown)=\"onChipKeyDown($event, item)\"\n (remove)=\"onChipRemoved($event, item)\"\n [selectable]=\"false\"\n [selected]=\"item.isSelected\"\n [displayDensity]=\"displayDensity\"\n [removable]=\"true\">\n <igx-icon\n igxPrefix\n family=\"imx-icons\"\n [name]=\"item.expression.condition.iconName\">\n </igx-icon>\n <span>{{filteringService.getChipLabel(item.expression)}}</span>\n </igx-chip>\n\n <span id=\"operand\" *ngIf=\"!last\">\n <button igxButton type=\"button\" (click)=\"toggleOperatorsDropDown($event, i)\" [igxDropDownItemNavigation]=\"operators\" [displayDensity]=\"displayDensity\">\n <igx-icon>expand_more</igx-icon>\n <span>{{filteringService.getOperatorAsString(item.afterOperator)}}</span>\n </button>\n <igx-drop-down [displayDensity]=\"column.grid.displayDensity\" #operators (selectionChanging)=\"onLogicOperatorChanged($event, item)\">\n <igx-drop-down-item [value]=\"0\" [selected]=\"item.afterOperator === 0\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_and}}</igx-drop-down-item>\n <igx-drop-down-item [value]=\"1\" [selected]=\"item.afterOperator === 1\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_or}}</igx-drop-down-item>\n </igx-drop-down>\n </span>\n </ng-container>\n </igx-chips-area>\n </div>\n</div>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-end\" *ngIf=\"showArrows\" (click)=\"scrollChipsOnArrowPress('right')\">\n <igx-icon>navigate_next</igx-icon>\n</button>\n\n<div #buttonsContainer [ngClass]=\"isNarrowWidth ? 'igx-grid__filtering-row-editing-buttons--small' : 'igx-grid__filtering-row-editing-buttons'\">\n <button [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"clearFiltering()\" [disabled]=\"disabled\" [tabindex]=\"disabled\">\n <igx-icon>refresh</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_reset}}</span>\n </button>\n <button #closeButton [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"close()\">\n <igx-icon>close</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_close}}</span>\n </button>\n</div>\n" }]
|
|
712
712
|
}], ctorParameters: function () { return [{ type: i1.IgxFilteringService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i2.PlatformUtil }]; }, propDecorators: { column: [{
|
|
713
713
|
type: Input
|
|
714
714
|
}], value: [{
|
|
@@ -768,4 +768,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
768
768
|
type: HostListener,
|
|
769
769
|
args: ['keydown', ['$event']]
|
|
770
770
|
}] } });
|
|
771
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1yb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLXJvdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUNULEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFFWixVQUFVLEVBQ1YsV0FBVyxFQUNYLHVCQUF1QixFQUV2QixZQUFZLEVBRWYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxvQkFBb0IsRUFBdUIsTUFBTSwrQkFBK0IsQ0FBQztBQUUxRixPQUFPLEVBQUUsY0FBYyxFQUF3QixNQUFNLHlEQUF5RCxDQUFDO0FBQy9HLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQztBQUNqSCxPQUFPLEVBQXNCLHFCQUFxQixFQUFvQixNQUFNLDJCQUEyQixDQUFDO0FBR3hHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVB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RUFBRSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkzRCxpQkFBaUI7c0JBRDFCLFlBQVk7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFO2dCQUkvQyxVQUFVO3NCQURuQixTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSW5DLE1BQU07c0JBRGYsU0FBUzt1QkFBQyxRQUFRO2dCQUlULGdCQUFnQjtzQkFEekIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSXpDLFNBQVM7c0JBRGxCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJOUIsT0FBTztzQkFEaEIsU0FBUzt1QkFBQyxTQUFTO2dCQUlWLFdBQVc7c0JBRHBCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFrRG5DLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIElucHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgUXVlcnlMaXN0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgVmlld1JlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR3JpZENvbHVtbkRhdGFUeXBlLCBEYXRhVXRpbCB9IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSWd4RHJvcERvd25Db21wb25lbnQsIElTZWxlY3Rpb25FdmVudEFyZ3MgfSBmcm9tICcuLi8uLi8uLi9kcm9wLWRvd24vcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJRmlsdGVyaW5nT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMsIElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBIb3Jpem9udGFsQWxpZ25tZW50LCBWZXJ0aWNhbEFsaWdubWVudCwgT3ZlcmxheVNldHRpbmdzIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvcG9zaXRpb24vY29ubmVjdGVkLXBvc2l0aW9uaW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7IElCYXNlQ2hpcEV2ZW50QXJncywgSWd4Q2hpcHNBcmVhQ29tcG9uZW50LCBJZ3hDaGlwQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY2hpcHMvcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJZ3hEcm9wRG93bkl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kcm9wLWRvd24vZHJvcC1kb3duLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9ncmlkLWZpbHRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9vdmVybGF5L3Njcm9sbCc7XG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZGlzcGxheURlbnNpdHknO1xuaW1wb3J0IHsgSWd4RGF0ZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hUaW1lUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vdGltZS1waWNrZXIvdGltZS1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IGlzRXF1YWwsIFBsYXRmb3JtVXRpbCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRXhwcmVzc2lvblVJIH0gZnJvbSAnLi4vZXhjZWwtc3R5bGUvY29tbW9uJztcbmltcG9ydCB7IENvbHVtblR5cGUgfSBmcm9tICcuLi8uLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc2VsZWN0b3I6ICdpZ3gtZ3JpZC1maWx0ZXJpbmctcm93JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY29sdW1uKCk6IENvbHVtblR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1uKHZhbCkge1xuICAgICAgICBpZiAodGhpcy5fY29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdC5mb3JFYWNoKGV4cCA9PiBleHAuaXNTZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW4gPSB2YWw7XG5cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0ID0gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdldEV4cHJlc3Npb25zKHRoaXMuX2NvbHVtbi5maWVsZCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbigpO1xuXG4gICAgICAgICAgICB0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uc2VhcmNoVmFsIDogbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbCkge1xuICAgICAgICBpZiAoIXZhbCAmJiB2YWwgIT09IDAgJiYgdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbCkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbCA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uZXhwcmVzc2lvbiA9PT0gdGhpcy5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCAmJiB0aGlzLmV4cHJlc3Npb25zTGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJGaWx0ZXIodGhpcy5jb2x1bW4uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbih0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbDtcbiAgICAgICAgICAgIGlmIChpc0VxdWFsKG9sZFZhbHVlLCB2YWwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24uc2VhcmNoVmFsID0gRGF0YVV0aWwucGFyc2VWYWx1ZSh0aGlzLmNvbHVtbi5kYXRhVHlwZSwgdmFsKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25zTGlzdC5maW5kKGl0ZW0gPT4gaXRlbS5leHByZXNzaW9uID09PSB0aGlzLmV4cHJlc3Npb24pID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEV4cHJlc3Npb24odHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkaXNwbGF5RGVuc2l0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmdyaWQuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvbWZvcnRhYmxlID8gRGlzcGxheURlbnNpdHkuY29zeSA6IHRoaXMuY29sdW1uLmdyaWQuZGlzcGxheURlbnNpdHk7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZF9fZmlsdGVyaW5nLXJvdycpXG4gICAgcHVibGljIGRlZmF1bHRDU1NDbGFzcyA9IHRydWU7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkX19maWx0ZXJpbmctcm93LS1jb21wYWN0JylcbiAgICBwdWJsaWMgZ2V0IGNvbXBhY3RDU1NDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmdyaWQuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvbXBhY3Q7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZF9fZmlsdGVyaW5nLXJvdy0tY29zeScpXG4gICAgcHVibGljIGdldCBjb3N5Q1NTQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5ncmlkLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb3N5O1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRGaWx0ZXJVSScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RmlsdGVyVUk6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RGF0ZVVJJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHREYXRlVUk6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0VGltZVVJJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRUaW1lVUk6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RGF0ZVRpbWVVSScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RGF0ZVRpbWVVSTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIGlucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cENvbmRpdGlvbnMnLCB7IHJlYWQ6IElneERyb3BEb3duQ29tcG9uZW50LCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZHJvcERvd25Db25kaXRpb25zOiBJZ3hEcm9wRG93bkNvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2NoaXBzQXJlYScsIHsgcmVhZDogSWd4Q2hpcHNBcmVhQ29tcG9uZW50LCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgY2hpcHNBcmVhOiBJZ3hDaGlwc0FyZWFDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkcmVuKCdvcGVyYXRvcnMnLCB7IHJlYWQ6IElneERyb3BEb3duQ29tcG9uZW50IH0pXG4gICAgcHJvdGVjdGVkIGRyb3BEb3duT3BlcmF0b3JzOiBRdWVyeUxpc3Q8SWd4RHJvcERvd25Db21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBpbnB1dEdyb3VwOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ3BpY2tlcicpXG4gICAgcHJvdGVjdGVkIHBpY2tlcjogSWd4RGF0ZVBpY2tlckNvbXBvbmVudCB8IElneFRpbWVQaWNrZXJDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdpbnB1dEdyb3VwUHJlZml4JywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIGlucHV0R3JvdXBQcmVmaXg6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgY29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ29wZXJhbmQnKVxuICAgIHByb3RlY3RlZCBvcGVyYW5kOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2Nsb3NlQnV0dG9uJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgY2xvc2VCdXR0b246IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd0Fycm93czogYm9vbGVhbjtcbiAgICBwdWJsaWMgZXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgcHVibGljIGV4cHJlc3Npb25zTGlzdDogQXJyYXk8RXhwcmVzc2lvblVJPjtcblxuICAgIHByaXZhdGUgX3Bvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tXG4gICAgfTtcblxuICAgIHByaXZhdGUgX2NvbmRpdGlvbnNPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcy5fcG9zaXRpb25TZXR0aW5ncylcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfb3BlcmF0b3JzT3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHRoaXMuX3Bvc2l0aW9uU2V0dGluZ3MpXG4gICAgfTtcblxuICAgIHByaXZhdGUgY2hpcHNBcmVhV2lkdGg6IG51bWJlcjtcbiAgICBwcml2YXRlIGNoaXBBcmVhU2Nyb2xsT2Zmc2V0ID0gMDtcbiAgICBwcml2YXRlIF9jb2x1bW4gPSBudWxsO1xuICAgIHByaXZhdGUgaXNLZXlQcmVzc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2NhbmNlbENoaXBDbGljayA9IGZhbHNlO1xuXG4gICAgLyoqIHN3aXRjaCB0byBpY29uIGJ1dHRvbnMgd2hlbiB3aWR0aCBpcyBiZWxvdyA0MzJweCAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgTkFSUk9XX1dJRFRIX1RIUkVTSE9MRCA9IDQzMjtcblxuICAgIHByaXZhdGUgJGRlc3Ryb3llciA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGZpbHRlcmluZ1NlcnZpY2U6IElneEZpbHRlcmluZ1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyByZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWxcbiAgICApIHsgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkhhbmRsZXIoZXZ0OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzRmlsdGVyaW5nS2V5Q29tYm8oZXZ0KSkge1xuICAgICAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLl9jb25kaXRpb25zT3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMuY29sdW1uLmdyaWQub3V0bGV0O1xuICAgICAgICB0aGlzLl9vcGVyYXRvcnNPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5jb2x1bW4uZ3JpZC5vdXRsZXQ7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gdGhpcy5leHByZXNzaW9uc0xpc3QuZmluZChleHByID0+IGV4cHIuaXNTZWxlY3RlZCA9PT0gdHJ1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IHNlbGVjdGVkSXRlbS5leHByZXNzaW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQubG9jYWxlQ2hhbmdlXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95ZXIpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5mb2N1c0VkaXRFbGVtZW50KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhKHRoaXMuY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSAmJiB0aGlzLmNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdERhdGVVSTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5UaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VGltZVVJO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkRhdGVUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RGF0ZVRpbWVVSTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RmlsdGVyVUk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0eXBlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY29sdW1uLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuOlxuICAgICAgICAgICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5OdW1iZXI6XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5DdXJyZW5jeTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbmRpdGlvbnMoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmZpbHRlcnMuY29uZGl0aW9uTGlzdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNVbmFyeUNvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24gJiYgdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdldENoaXBMYWJlbCh0aGlzLmV4cHJlc3Npb24pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfcm93X2RhdGVfcGxhY2Vob2xkZXI7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2ZpbHRlcl9yb3dfYm9vbGVhbl9wbGFjZWhvbGRlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX3Jvd19wbGFjZWhvbGRlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGtleWRvd24gb24gdGhlIGlucHV0IGdyb3VwJ3MgcHJlZml4LlxuICAgICAqL1xuICAgIHB1YmxpYyBvblByZWZpeEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGV2ZW50KSAmJiB0aGlzLmRyb3BEb3duQ29uZGl0aW9ucy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29uZGl0aW9uc0Ryb3BEb3duKHRoaXMuaW5wdXRHcm91cFByZWZpeC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gdGhpcy5wbGF0Zm9ybS5LRVlNQVAuVEFCICYmICF0aGlzLmRyb3BEb3duQ29uZGl0aW9ucy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29uZGl0aW9uc0Ryb3BEb3duKHRoaXMuaW5wdXRHcm91cFByZWZpeC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGtleWRvd24gb24gdGhlIGlucHV0LlxuICAgICAqL1xuICAgIHB1YmxpYyBvbklucHV0S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB0aGlzLmlzS2V5UHJlc3NlZCA9IHRydWU7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dEdyb3VwUHJlZml4Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbmRpdGlvbnNEcm9wRG93bih0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IHRoaXMucGxhdGZvcm0uS0VZTUFQLkVOVEVSKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0NvbXBvc2luZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29tbWl0SW5wdXQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5hbHRLZXkgJiYgKGV2ZW50LmtleSA9PT0gdGhpcy5wbGF0Zm9ybS5LRVlNQVAuQVJST1dfRE9XTikpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRHcm91cFByZWZpeC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbmRpdGlvbnNEcm9wRG93bih0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wbGF0Zm9ybS5pc0ZpbHRlcmluZ0tleUNvbWJvKGV2ZW50KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGtleXVwIG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dEtleVVwKCkge1xuICAgICAgICB0aGlzLmlzS2V5UHJlc3NlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGlucHV0IG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dChldmVudEFyZ3MpIHtcbiAgICAgICAgLy8gVGhlICdpc2tleVByZXNzZWQnIGZsYWcgaXMgbmVlZGVkIGZvciBhIGNhc2UgaW4gSUUsIGJlY2F1c2UgdGhlIGlucHV0IGV2ZW50IGlzIGZpcmVkIG9uIGZvY3VzIGFuZCBmb3Igc29tZSByZWFzb24sXG4gICAgICAgIC8vIHdoZW4geW91IGhhdmUgYSBqYXBhbmVzZSBjaGFyYWN0ZXIgYXMgYSBwbGFjZWhvbGRlciwgb24gaW5pdCB0aGUgdmFsdWUgaGVyZSBpcyBlbXB0eSBzdHJpbmcgLlxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudEFyZ3MudGFyZ2V0O1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlVGltZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV2ZW50QXJncztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0VkZ2UgJiYgdGFyZ2V0LnR5cGUgIT09ICdudW1iZXInXG4gICAgICAgICAgICB8fCB0aGlzLmlzS2V5UHJlc3NlZCB8fCB0YXJnZXQudmFsdWUgfHwgdGFyZ2V0LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRhcmdldC52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGNvbXBvc2l0aW9uc3RhcnQgb24gdGhlIGlucHV0LlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbXBvc2l0aW9uU3RhcnQoKSB7XG4gICAgICAgIHRoaXMuaXNDb21wb3NpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGNvbXBvc2l0aW9uZW5kIG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db21wb3NpdGlvbkVuZCgpIHtcbiAgICAgICAgdGhpcy5pc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGlucHV0IGNsaWNrIGV2ZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBvbklucHV0Q2xpY2soKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkJvb2xlYW4gJiYgdGhpcy5kcm9wRG93bkNvbmRpdGlvbnMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy50b2dnbGVDb25kaXRpb25zRHJvcERvd24odGhpcy5pbnB1dEdyb3VwUHJlZml4Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyaW5nIG9wZXJhdGlvbiBjb25kaXRpb24gZm9yIGEgZ2l2ZW4gdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldENvbmRpdGlvbih2YWx1ZTogc3RyaW5nKTogSUZpbHRlcmluZ09wZXJhdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5maWx0ZXJzLmNvbmRpdGlvbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdHJhbnNsYXRlZCBjb25kaXRpb24gbmFtZSBmb3IgYSBnaXZlbiB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNsYXRlQ29uZGl0aW9uKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQucmVzb3VyY2VTdHJpbmdzW2BpZ3hfZ3JpZF9maWx0ZXJfJHt0aGlzLmdldENvbmRpdGlvbih2YWx1ZSkubmFtZX1gXSB8fCB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpY29uIG5hbWUgb2YgdGhlIGN1cnJlbnQgY29uZGl0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJY29uTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuICYmIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbih0aGlzLmNvbmRpdGlvbnNbMF0pLmljb25OYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24uaWNvbk5hbWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBnaXZlbiBjb25kaXRpb24gaXMgc2VsZWN0ZWQgaW4gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHVibGljIGlzQ29uZGl0aW9uU2VsZWN0ZWQoY29uZGl0aW9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lID09PSBjb25kaXRpb25OYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBjdXJyZW50IGZpbHRlcmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGaWx0ZXJpbmcoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5jbGVhckZpbHRlcih0aGlzLmNvbHVtbi5maWVsZCk7XG4gICAgICAgIHRoaXMucmVzZXRFeHByZXNzaW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbW1pdHMgdGhlIHZhbHVlIG9mIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29tbWl0SW5wdXQoKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0LmZpbHRlcihleCA9PiBleC5pc1NlbGVjdGVkID09PSB0cnVlKTtcbiAgICAgICAgc2VsZWN0ZWRJdGVtLmZvckVhY2goZSA9PiBlLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XG5cbiAgICAgICAgbGV0IGluZGV4VG9EZXNlbGVjdCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uc0xpc3RbaW5kZXhdLmV4cHJlc3Npb247XG4gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbi5zZWFyY2hWYWwgPT09IG51bGwgJiYgIWV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkpIHtcbiAgICAgICAgICAgICAgICBpbmRleFRvRGVzZWxlY3QgPSBpbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhUb0Rlc2VsZWN0ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVFeHByZXNzaW9uKGluZGV4VG9EZXNlbGVjdCwgdGhpcy5leHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbigpO1xuICAgICAgICB0aGlzLnNjcm9sbENoaXBzV2hlbkFkZGluZ0V4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIHZhbHVlIG9mIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJJbnB1dChldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBrZXlkb3duIG9uIGNsZWFyIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25DbGVhcktleURvd24oZXZlbnRBcmdzOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzQWN0aXZhdGlvbktleShldmVudEFyZ3MpKSB7XG4gICAgICAgICAgICBldmVudEFyZ3MucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dCgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0VkaXRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjbGljayBvbiBjbGVhciBidXR0b24uXG4gICAgICovXG4gICAgcHVibGljIG9uQ2xlYXJDbGljaygpIHtcbiAgICAgICAgdGhpcy5jbGVhcklucHV0KCk7XG4gICAgICAgIHRoaXMuZm9jdXNFZGl0RWxlbWVudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGtleWRvd24gb24gY29tbWl0IGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db21taXRLZXlEb3duKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdElucHV0KCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRWRpdEVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGNsaWNrIG9uIGNvbW1pdCBidXR0b24uXG4gICAgICovXG4gICAgcHVibGljIG9uQ29tbWl0Q2xpY2soZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5jb21taXRJbnB1dCgpO1xuICAgICAgICB0aGlzLmZvY3VzRWRpdEVsZW1lbnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBmb2N1c291dCBvbiB0aGUgaW5wdXQgZ3JvdXAuXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXRHcm91cEZvY3Vzb3V0KCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZSAhPT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbiAmJiAhdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGZvY3VzZWRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnaWd4LWNoaXBfX3JlbW92ZScpIHx8IGZvY3VzZWRFbGVtZW50LnRhZ05hbWUgPT09ICdJR1gtREFZLUlURU0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIShmb2N1c2VkRWxlbWVudCAmJiB0aGlzLmVkaXRvcnNDb250YWluKGZvY3VzZWRFbGVtZW50KSlcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmRyb3BEb3duQ29uZGl0aW9ucy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1pdElucHV0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgZmlsdGVyaW5nIGVkaXQgcm93LlxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbnNMaXN0Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3RbMF0uZXhwcmVzc2lvbi5zZWFyY2hWYWwgPT09IG51bGwgJiZcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0WzBdLmV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZ2V0RXhwcmVzc2lvbnModGhpcy5jb2x1bW4uZmllbGQpLnBvcCgpO1xuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29uZFRvUmVtb3ZlID0gdGhpcy5leHByZXNzaW9uc0xpc3QuZmlsdGVyKGV4ID0+IGV4LmV4cHJlc3Npb24uc2VhcmNoVmFsID09PSBudWxsICYmICFleC5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KTtcbiAgICAgICAgICAgIGlmIChjb25kVG9SZW1vdmUgJiYgY29uZFRvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25kVG9SZW1vdmUuZm9yRWFjaChjID0+IHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZW1vdmVFeHByZXNzaW9uKHRoaXMuY29sdW1uLmZpZWxkLCB0aGlzLmV4cHJlc3Npb25zTGlzdC5pbmRleE9mKGMpKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLnVwZGF0ZUZpbHRlcmluZ0NlbGwodGhpcy5jb2x1bW4pO1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyZWRDb2x1bW4gPSBudWxsO1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2Uuc2VsZWN0ZWRFeHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQudGhlYWRSb3cubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuXG4gICAgICAgIHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSh0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRXZlbnQgaGFuZGxlciBmb3IgZGF0ZSBwaWNrZXIncyBzZWxlY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIG9uRGF0ZVNlbGVjdGVkKHZhbHVlOiBEYXRlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgaW5wdXRHcm91cFByZWZpeENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgICAgdGhpcy50b2dnbGVDb25kaXRpb25zRHJvcERvd24oZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGNvbmRpdGlvbnMgZHJvcGRvd24uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZUNvbmRpdGlvbnNEcm9wRG93bih0YXJnZXQ6IGFueSkge1xuICAgICAgICB0aGlzLl9jb25kaXRpb25zT3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5fY29uZGl0aW9uc092ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0YXJnZXQgYXMgSFRNTEVsZW1lbnRdO1xuICAgICAgICB0aGlzLmRyb3BEb3duQ29uZGl0aW9ucy50b2dnbGUodGhpcy5fY29uZGl0aW9uc092ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGxvZ2ljIG9wZXJhdG9ycyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlT3BlcmF0b3JzRHJvcERvd24oZXZlbnRBcmdzLCBpbmRleCkge1xuICAgICAgICB0aGlzLl9vcGVyYXRvcnNPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gZXZlbnRBcmdzLnRhcmdldC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB0aGlzLl9vcGVyYXRvcnNPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbZXZlbnRBcmdzLnRhcmdldC5wYXJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50XTtcbiAgICAgICAgdGhpcy5kcm9wRG93bk9wZXJhdG9ycy50b0FycmF5KClbaW5kZXhdLnRvZ2dsZSh0aGlzLl9vcGVyYXRvcnNPdmVybGF5U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGNoYW5nZSBldmVudCBpbiBjb25kaXRpb25zIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbmRpdGlvbnNDaGFuZ2VkKGV2ZW50QXJncykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChldmVudEFyZ3MubmV3U2VsZWN0aW9uIGFzIElneERyb3BEb3duSXRlbUNvbXBvbmVudCkudmFsdWU7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24gPSB0aGlzLmdldENvbmRpdGlvbih2YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBncmlkJ3MgZmlsdGVyaW5nIG9uIHRoZSBuZXh0IGN5Y2xlIHRvIGVuc3VyZSB0aGUgZHJvcC1kb3duIGlzIGNsb3NlZFxuICAgICAgICAgICAgLy8gaWYgdGhlIGRyb3AtZG93biBpcyBub3QgY2xvc2VkIHRoaXMgZXZlbnQgaGFuZGxlciB3aWxsIGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXNcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnVuYXJ5Q29uZGl0aW9uQ2hhbmdlZENhbGxiYWNrKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuY29uZGl0aW9uQ2hhbmdlZENhbGxiYWNrKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHJlcXVlc3RBbmltYXRpb25GcmFtZSBiZWNhdXNlIG9mIGFuIGlzc3VlIGluIElFLCB3aGVyZSB5b3UgYXJlIHN0aWxsIGFibGUgdG8gd3JpdGUgaW4gdGhlIGlucHV0LFxuICAgICAgICAvLyBpZiBpdCBoYXMgYmVlbiBmb2N1c2VkIGFuZCB0aGVuIHNldCB0byByZWFkb25seS5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZm9jdXNFZGl0RWxlbWVudCgpKTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBvbkNoaXBQb2ludGVyZG93bihhcmdzLCBjaGlwOiBJZ3hDaGlwQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLl9jYW5jZWxDaGlwQ2xpY2sgPSBjaGlwLnNlbGVjdGVkXG4gICAgICAgICAgICAmJiBhY3RpdmVFbGVtZW50ICYmIHRoaXMuZWRpdG9yc0NvbnRhaW4oYWN0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2hpcENsaWNrKGFyZ3MsIGl0ZW06IEV4cHJlc3Npb25VSSkge1xuICAgICAgICBpZiAodGhpcy5fY2FuY2VsQ2hpcENsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxDaGlwQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0LmZvckVhY2goZXggPT4gZXguaXNTZWxlY3RlZCA9IGZhbHNlKTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUNoaXAoaXRlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZUNoaXAoaXRlbTogRXhwcmVzc2lvblVJKSB7XG4gICAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9ICFpdGVtLmlzU2VsZWN0ZWQ7XG4gICAgICAgIGlmIChpdGVtLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGl0ZW0uZXhwcmVzc2lvbjtcblxuICAgICAgICAgICAgdGhpcy5mb2N1c0VkaXRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjaGlwIGtleWRvd24gZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcEtleURvd24oZXZlbnRBcmdzOiBLZXlib2FyZEV2ZW50LCBpdGVtOiBFeHByZXNzaW9uVUkpIHtcbiAgICAgICAgaWYgKGV2ZW50QXJncy5rZXkgPT09IHRoaXMucGxhdGZvcm0uS0VZTUFQLkVOVEVSKSB7XG4gICAgICAgICAgICBldmVudEFyZ3MucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy50b2dnbGVDaGlwKGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2Nyb2xscyB0aGUgZmlyc3QgY2hpcCBpbnRvIHZpZXcgaWYgdGhlIHRhYiBrZXkgaXMgcHJlc3NlZCBvbiB0aGUgbGVmdCBhcnJvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25MZWZ0QXJyb3dLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IHRoaXMucGxhdGZvcm0uS0VZTUFQLlRBQikge1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IDA7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybSh0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGNoaXAgcmVtb3ZlZCBldmVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwUmVtb3ZlZChldmVudEFyZ3M6IElCYXNlQ2hpcEV2ZW50QXJncywgaXRlbTogRXhwcmVzc2lvblVJKSB7XG4gICAgICAgIGNvbnN0IGluZGV4VG9SZW1vdmUgPSB0aGlzLmV4cHJlc3Npb25zTGlzdC5pbmRleE9mKGl0ZW0pO1xuICAgICAgICB0aGlzLnJlbW92ZUV4cHJlc3Npb24oaW5kZXhUb1JlbW92ZSwgaXRlbS5leHByZXNzaW9uKTtcblxuICAgICAgICB0aGlzLnNjcm9sbENoaXBzT25SZW1vdmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBsb2dpYyBvcGVyYXRvciBjaGFuZ2VkIGV2ZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkxvZ2ljT3BlcmF0b3JDaGFuZ2VkKGV2ZW50QXJnczogSVNlbGVjdGlvbkV2ZW50QXJncywgZXhwcmVzc2lvbjogRXhwcmVzc2lvblVJKSB7XG4gICAgICAgIGlmIChldmVudEFyZ3Mub2xkU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBleHByZXNzaW9uLmFmdGVyT3BlcmF0b3IgPSAoZXZlbnRBcmdzLm5ld1NlbGVjdGlvbiBhcyBJZ3hEcm9wRG93bkl0ZW1Db21wb25lbnQpLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3RbdGhpcy5leHByZXNzaW9uc0xpc3QuaW5kZXhPZihleHByZXNzaW9uKSArIDFdLmJlZm9yZU9wZXJhdG9yID0gZXhwcmVzc2lvbi5hZnRlck9wZXJhdG9yO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgZ3JpZCdzIGZpbHRlcmluZyBvbiB0aGUgbmV4dCBjeWNsZSB0byBlbnN1cmUgdGhlIGRyb3AtZG93biBpcyBjbG9zZWRcbiAgICAgICAgICAgIC8vIGlmIHRoZSBkcm9wLWRvd24gaXMgbm90IGNsb3NlZCB0aGlzIGV2ZW50IGhhbmRsZXIgd2lsbCBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5maWx0ZXIoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTY3JvbGxzIHRoZSBjaGlwcyBpbnRvIHRoZSBjaGlwIGFyZWEgd2hlbiBsZWZ0IG9yIHJpZ2h0IGFycm93cyBhcmUgcHJlc3NlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2Nyb2xsQ2hpcHNPbkFycm93UHJlc3MoYXJyb3dQb3NpdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IGNoaXBBcmFlQ2hpbGRyZW4gPSB0aGlzLmNoaXBzQXJlYS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGlmIChhcnJvd1Bvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaXAgb2YgY2hpcEFyYWVDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmNlaWwoY2hpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkgPCBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5yaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb3VudCA8IGNoaXBBcmFlQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCAtPSBNYXRoLmNlaWwoY2hpcEFyYWVDaGlsZHJlbltjb3VudF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpIC1cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5jZWlsKGNvbnRhaW5lclJlY3QucmlnaHQpICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybSh0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcnJvd1Bvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpcCBvZiBjaGlwQXJhZUNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKE1hdGguY2VpbChjaGlwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpIDwgTWF0aC5jZWlsKGNvbnRhaW5lclJlY3QubGVmdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0ICs9IE1hdGguY2VpbChjb250YWluZXJSZWN0LmxlZnQpIC1cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5jZWlsKGNoaXBBcmFlQ2hpbGRyZW5bY291bnQgLSAxXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmVzZXRzIHRoZSBjaGlwcyBhcmVhXG4gICAgICogQG1lbWJlcm9mIElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDaGlwc0FyZWEoKSB7XG4gICAgICAgIHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSh0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0KTtcbiAgICAgICAgdGhpcy5zaG93SGlkZUFycm93QnV0dG9ucygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBmb2N1c0VkaXRFbGVtZW50KCkge1xuICAgICAgICBpZiAodGhpcy5pbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waWNrZXIpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyLmdldEVkaXRFbGVtZW50KCkuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy4kZGVzdHJveWVyLm5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dIaWRlQXJyb3dCdXR0b25zKCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlwc0FyZWFXaWR0aCA9IHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Fycm93cyA9IHRoaXMuY2hpcHNBcmVhV2lkdGggPj0gY29udGFpbmVyV2lkdGggJiYgdGhpcy5pc0NvbHVtbkZpbHRlcmVkO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNlIHRoZSBjZHIuZGV0ZWN0Q2hhbmdlcygpIHVzYWdlIGhlcmVcbiAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmNkciBhcyBWaWV3UmVmKS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRFeHByZXNzaW9uKGlzU2VsZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgZXhwclVJID0gbmV3IEV4cHJlc3Npb25VSSgpO1xuICAgICAgICBleHByVUkuZXhwcmVzc2lvbiA9IHRoaXMuZXhwcmVzc2lvbjtcbiAgICAgICAgZXhwclVJLmJlZm9yZU9wZXJhdG9yID0gdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoID4gMCA/IEZpbHRlcmluZ0xvZ2ljLkFuZCA6IG51bGw7XG4gICAgICAgIGV4cHJVSS5pc1NlbGVjdGVkID0gaXNTZWxlY3RlZDtcblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdC5wdXNoKGV4cHJVSSk7XG5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uc0xpc3RbbGVuZ3RoIC0gMl0pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0W2xlbmd0aCAtIDJdLmFmdGVyT3BlcmF0b3IgPSB0aGlzLmV4cHJlc3Npb25zTGlzdFtsZW5ndGggLSAxXS5iZWZvcmVPcGVyYXRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvd0hpZGVBcnJvd0J1dHRvbnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUV4cHJlc3Npb24oaW5kZXhUb1JlbW92ZTogbnVtYmVyLCBleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbikge1xuICAgICAgICBpZiAoaW5kZXhUb1JlbW92ZSA9PT0gMCAmJiB0aGlzLmV4cHJlc3Npb25zTGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGaWx0ZXJpbmcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZW1vdmVFeHByZXNzaW9uKHRoaXMuY29sdW1uLmZpZWxkLCBpbmRleFRvUmVtb3ZlKTtcblxuICAgICAgICB0aGlzLmZpbHRlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24gPT09IGV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRFeHByZXNzaW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dIaWRlQXJyb3dCdXR0b25zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldEV4cHJlc3Npb24oY29uZGl0aW9uPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IHtcbiAgICAgICAgICAgIGZpZWxkTmFtZTogdGhpcy5jb2x1bW4uZmllbGQsXG4gICAgICAgICAgICBjb25kaXRpb246IG51bGwsXG4gICAgICAgICAgICBzZWFyY2hWYWw6IG51bGwsXG4gICAgICAgICAgICBpZ25vcmVDYXNlOiB0aGlzLmNvbHVtbi5maWx0ZXJpbmdJZ25vcmVDYXNlXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlICE9PSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbikge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbiA9IHRoaXMuZ2V0Q29uZGl0aW9uKGNvbmRpdGlvbiA/PyB0aGlzLmNvbmRpdGlvbnNbMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZSAmJiB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaG93SGlkZUFycm93QnV0dG9ucygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsQ2hpcHNXaGVuQWRkaW5nRXhwcmVzc2lvbigpIHtcbiAgICAgICAgY29uc3QgY2hpcEFyYWVDaGlsZHJlbiA9IHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgaWYgKCFjaGlwQXJhZUNoaWxkcmVuIHx8IGNoaXBBcmFlQ2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGlwc0NvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3QgY2hpcHNBcmVhV2lkdGggPSB0aGlzLmNoaXBzQXJlYS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgaWYgKGNoaXBzQXJlYVdpZHRoID4gY2hpcHNDb250YWluZXJXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IGNoaXBzQ29udGFpbmVyV2lkdGggLSBjaGlwc0FyZWFXaWR0aDtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm0ob2Zmc2V0OiBudW1iZXIpIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7b2Zmc2V0fXB4KWA7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsQ2hpcHNPblJlbW92ZSgpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgY29uc3QgY2hpcEFyYWVDaGlsZHJlbiA9IHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjaGlwIG9mIGNoaXBBcmFlQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmNlaWwoY2hpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkgPCBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5sZWZ0KSkge1xuICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY291bnQgPD0gMikge1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkaWYgPSBjaGlwQXJhZUNoaWxkcmVuW2NvdW50XS5pZCA9PT0gJ2NoaXAnID8gY291bnQgLSAyIDogY291bnQgLSAxO1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCArPSBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5sZWZ0KSAtIE1hdGguY2VpbChjaGlwQXJhZUNoaWxkcmVuW2RpZl0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCkgKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25kaXRpb25DaGFuZ2VkQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmICghIXRoaXMuZXhwcmVzc2lvbi5zZWFyY2hWYWwgfHwgdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdW5hcnlDb25kaXRpb25DaGFuZ2VkQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uc0xpc3QuZmluZChpdGVtID0+IGl0ZW0uZXhwcmVzc2lvbiA9PT0gdGhpcy5leHByZXNzaW9uKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEV4cHJlc3Npb24odHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlcigpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlckludGVybmFsKHRoaXMuY29sdW1uLmZpZWxkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVkaXRvcnNDb250YWluKGNoaWxkOiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIHRoZSBmaXJzdCBjaGVjayBpcyBmYWxzZSBhbmQgdGhlIHNlY29uZCBpcyB1bmRlZmluZWQgdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgLy8gbWFrZSBzdXJlIGl0IGFsd2F5cyByZXR1cm5zIGJvb2xlYW5cbiAgICAgICAgcmV0dXJuICEhKHRoaXMuaW5wdXRHcm91cCAmJiB0aGlzLmlucHV0R3JvdXAubmF0aXZlRWxlbWVudC5jb250YWlucyhjaGlsZClcbiAgICAgICAgICAgIHx8IHRoaXMucGlja2VyICYmIHRoaXMucGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhjaGlsZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzQ29sdW1uRmlsdGVyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgJiYgdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc05hcnJvd1dpZHRoKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIDwgdGhpcy5OQVJST1dfV0lEVEhfVEhSRVNIT0xEO1xuICAgIH1cbn1cbiIsIjwhLS0gSGF2ZSB0byBhcHBseSBzdHlsZXMgaW5saW5lIGJlY2F1c2Ugb2YgdGhlIG92ZXJsYXkgb3V0bGV0IC4uLiAtLT5cbjxpZ3gtZHJvcC1kb3duICNpbnB1dEdyb3VwQ29uZGl0aW9ucyBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIiBbaGVpZ2h0XT1cIicyMDBweCdcIiAoc2VsZWN0aW9uQ2hhbmdpbmcpPVwib25Db25kaXRpb25zQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgPGlneC1kcm9wLWRvd24taXRlbSAqbmdGb3I9XCJsZXQgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnNcIlxuICAgICAgICBbdmFsdWVdPVwiY29uZGl0aW9uXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cImlzQ29uZGl0aW9uU2VsZWN0ZWQoY29uZGl0aW9uKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi1pdGVtc1wiPlxuICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIFtuYW1lXT1cImdldENvbmRpdGlvbihjb25kaXRpb24pLmljb25OYW1lXCI+PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi10ZXh0XCI+e3sgdHJhbnNsYXRlQ29uZGl0aW9uKGNvbmRpdGlvbikgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvaWd4LWRyb3AtZG93bi1pdGVtPlxuPC9pZ3gtZHJvcC1kb3duPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRGaWx0ZXJVST5cbiAgICA8aWd4LWlucHV0LWdyb3VwICNpbnB1dEdyb3VwIHR5cGU9XCJib3hcIiBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIiAoZm9jdXNvdXQpPVwib25JbnB1dEdyb3VwRm9jdXNvdXQoKVwiPlxuICAgICAgICA8aWd4LXByZWZpeCAjaW5wdXRHcm91cFByZWZpeFxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5wdXRHcm91cFByZWZpeENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblByZWZpeEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZ3hEcm9wRG93bkl0ZW1OYXZpZ2F0aW9uXT1cImlucHV0R3JvdXBDb25kaXRpb25zXCI+XG4gICAgICAgICAgICA8aWd4LWljb24gZmFtaWx5PVwiaW14LWljb25zXCIgW25hbWVdPVwiZ2V0SWNvbk5hbWUoKVwiPjwvaWd4LWljb24+XG4gICAgICAgIDwvaWd4LXByZWZpeD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJpc1VuYXJ5Q29uZGl0aW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbklucHV0Q2xpY2soKVwiXG4gICAgICAgICAgICAoY29tcG9zaXRpb25zdGFydCk9XCJvbkNvbXBvc2l0aW9uU3RhcnQoKVwiXG4gICAgICAgICAgICAoY29tcG9zaXRpb25lbmQpPVwib25Db21wb3NpdGlvbkVuZCgpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uSW5wdXRLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGtleXVwKT1cIm9uSW5wdXRLZXlVcCgpXCIvPlxuICAgICAgICAgICAgPGlneC1zdWZmaXggKm5nSWY9XCJ2YWx1ZSB8fCB2YWx1ZSA9PT0gMFwiID5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24gKGtleWRvd24pPVwib25Db21taXRLZXlEb3duKCRldmVudClcIiAoY2xpY2spPVwib25Db21taXRDbGljaygpXCIgdGFiaW5kZXg9XCIwXCI+ZG9uZTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uIChrZXlkb3duKT1cIm9uQ2xlYXJLZXlEb3duKCRldmVudClcIiAoY2xpY2spPVwib25DbGVhckNsaWNrKClcIiB0YWJpbmRleD1cIjBcIj5jbGVhcjwvaWd4LWljb24+XG4gICAgICAgICAgICA8L2lneC1zdWZmaXg+XG4gICAgPC9pZ3gtaW5wdXQtZ3JvdXA+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHREYXRlVUk+XG4gICAgPGlneC1kYXRlLXBpY2tlciAjcGlja2VyXG4gICAgICAgIFsodmFsdWUpXT1cInZhbHVlXCJcbiAgICAgICAgW3JlYWRPbmx5XT1cInRydWVcIlxuICAgICAgICBbb3V0bGV0XT1cImZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5vdXRsZXRcIlxuICAgICAgICBbbG9jYWxlXT1cImZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5sb2NhbGVcIlxuICAgICAgICAoY2xpY2spPVwiZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSA/IG51bGwgOiBwaWNrZXIub3BlbigpXCJcbiAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgIFtkaXNwbGF5Rm9ybWF0XT1cImNvbHVtbi5waXBlQXJncy5mb3JtYXRcIlxuICAgICAgICBbZm9ybWF0dGVyXT1cImNvbHVtbi5mb3JtYXR0ZXJcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbd2Vla1N0YXJ0XT1cImNvbHVtbi5waXBlQXJncy53ZWVrU3RhcnRcIlxuICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKGZvY3Vzb3V0KT1cIm9uSW5wdXRHcm91cEZvY3Vzb3V0KClcIlxuICAgICAgICAoY2xvc2VkKT1cImZvY3VzRWRpdEVsZW1lbnQoKVwiPlxuICAgICAgICA8aWd4LXByZWZpeCAjaW5wdXRHcm91cFByZWZpeFxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIChjbGljayk9XCJpbnB1dEdyb3VwUHJlZml4Q2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvblByZWZpeEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICBbaWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbl09XCJpbnB1dEdyb3VwQ29uZGl0aW9uc1wiPlxuICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIFtuYW1lXT1cImV4cHJlc3Npb24uY29uZGl0aW9uLmljb25OYW1lXCI+PC9pZ3gtaWNvbj5cbiAgICAgICAgPC9pZ3gtcHJlZml4PlxuICAgICAgICA8aWd4LXN1ZmZpeCAqbmdJZj1cInZhbHVlXCI+XG4gICAgICAgICAgICA8aWd4LWljb24gdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwib25Db21taXRLZXlEb3duKCRldmVudClcIiAoY2xpY2spPVwib25Db21taXRDbGljaygkZXZlbnQpXCI+ZG9uZTwvaWd4LWljb24+XG4gICAgICAgICAgICA8aWd4LWljb24gdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwib25DbGVhcktleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJjbGVhcklucHV0KCRldmVudClcIj5jbGVhcjwvaWd4LWljb24+XG4gICAgICAgIDwvaWd4LXN1ZmZpeD5cbiAgICAgICAgPCEtLSBkaXNhYmxlIGRlZmF1bHQgaWNvbnMgLS0+XG4gICAgICAgIDxpZ3gtcGlja2VyLXRvZ2dsZT48L2lneC1waWNrZXItdG9nZ2xlPlxuICAgICAgICA8aWd4LXBpY2tlci1jbGVhcj48L2lneC1waWNrZXItY2xlYXI+XG4gICAgPC9pZ3gtZGF0ZS1waWNrZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRUaW1lVUk+XG4gICAgPGlneC10aW1lLXBpY2tlciAjcGlja2VyXG4gICAgICAgIFsodmFsdWUpXT1cInZhbHVlXCJcbiAgICAgICAgW2lucHV0Rm9ybWF0XT1cImNvbHVtbi5kZWZhdWx0VGltZUZvcm1hdFwiXG4gICAgICAgIFtsb2NhbGVdPVwiZmlsdGVyaW5nU2VydmljZS5ncmlkLmxvY2FsZVwiXG4gICAgICAgIFtmb3JtYXR0ZXJdPVwiY29sdW1uLmZvcm1hdHRlclwiXG4gICAgICAgIFtvdXRsZXRdPVwiZmlsdGVyaW5nU2VydmljZS5ncmlkLm91dGxldFwiXG4gICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJkaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICBbcmVhZE9ubHldPVwidHJ1ZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIChjbG9zZWQpPVwiZm9jdXNFZGl0RWxlbWVudCgpXCJcbiAgICAgICAgKGZvY3Vzb3V0KT1cIm9uSW5wdXRHcm91cEZvY3Vzb3V0KClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrKT1cImV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkgPyBudWxsIDogcGlja2VyLm9wZW4oKVwiPlxuICAgICAgICA8aWd4LXByZWZpeCAjaW5wdXRHcm91cFByZWZpeFxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAoY2xpY2spPVwiaW5wdXRHcm91cFByZWZpeENsaWNrKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvblByZWZpeEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgIFtpZ3hEcm9wRG93bkl0ZW1OYXZpZ2F0aW9uXT1cImlucHV0R3JvdXBDb25kaXRpb25zXCI+XG4gICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJpbXgtaWNvbnNcIiBbbmFtZV09XCJleHByZXNzaW9uLmNvbmRpdGlvbi5pY29uTmFtZVwiPjwvaWd4LWljb24+XG4gICAgPC9pZ3gtcHJlZml4PlxuICAgIDxpZ3gtc3VmZml4ICpuZ0lmPVwidmFsdWVcIj5cbiAgICAgICAgPGlneC1pY29uIHRhYmluZGV4PVwiMFwiIChrZXlkb3duKT1cIm9uQ29tbWl0S2V5RG93bigkZXZlbnQpXCIgKGNsaWNrKT1cIm9uQ29tbWl0Q2xpY2soJGV2ZW50KVwiPmRvbmU8L2lneC1pY29uPlxuICAgICAgICA8aWd4LWljb24gdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwib25DbGVhcktleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJjbGVhcklucHV0KCRldmVudClcIj5jbGVhcjwvaWd4LWljb24+XG4gICAgPC9pZ3gtc3VmZml4PlxuICAgIDwhLS0gZGlzYWJsZSBkZWZhdWx0IGljb25zIC0tPlxuICAgIDxpZ3gtcGlja2VyLXRvZ2dsZT48L2lneC1waWNrZXItdG9nZ2xlPlxuICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICA8L2lneC10aW1lLXBpY2tlcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdERhdGVUaW1lVUk+XG4gICAgPGlneC1pbnB1dC1ncm91cCAjaW5wdXRHcm91cCB0eXBlPVwiYm94XCIgW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgKGZvY3Vzb3V0KT1cIm9uSW5wdXRHcm91cEZvY3Vzb3V0KClcIj5cbiAgICAgICAgPGlneC1wcmVmaXggI2lucHV0R3JvdXBQcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0R3JvdXBQcmVmaXhDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25QcmVmaXhLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbaWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbl09XCJpbnB1dEdyb3VwQ29uZGl0aW9uc1wiPlxuICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIFtuYW1lXT1cImdldEljb25OYW1lKClcIj48L2lneC1pY29uPlxuICAgICAgICA8L2lneC1wcmVmaXg+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICBpZ3hJbnB1dFxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbaWd4RGF0ZVRpbWVFZGl0b3JdPVwiY29sdW1uLmRlZmF1bHREYXRlVGltZUZvcm1hdFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiaXNVbmFyeUNvbmRpdGlvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25JbnB1dENsaWNrKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5dXApPVwib25JbnB1dEtleVVwKClcIi8+XG4gICAgICAgICAgICA8aWd4LXN1ZmZpeCAqbmdJZj1cInZhbHVlIHx8IHZhbHVlID09PSAwXCIgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiAoa2V5ZG93bik9XCJvbkNvbW1pdEtleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJvbkNvbW1pdENsaWNrKClcIiB0YWJpbmRleD1cIjBcIj5kb25lPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24gKGtleWRvd24pPVwib25DbGVhcktleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJvbkNsZWFyQ2xpY2soKVwiIHRhYmluZGV4PVwiMFwiPmNsZWFyPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDwvaWd4LXN1ZmZpeD5cbiAgICA8L2lneC1pbnB1dC1ncm91cD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHRoaXMgfVwiPjwvbmctY29udGFpbmVyPlxuXG48YnV0dG9uIGlneEJ1dHRvbj1cImljb25cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpZ3gtZ3JpZF9fZmlsdGVyaW5nLXJvdy1zY3JvbGwtc3RhcnRcIiAqbmdJZj1cInNob3dBcnJvd3NcIiAoa2V5ZG93bik9XCJvbkxlZnRBcnJvd0tleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJzY3JvbGxDaGlwc09uQXJyb3dQcmVzcygnbGVmdCcpXCI+XG4gICAgPGlneC1pY29uPm5hdmlnYXRlX2JlZm9yZTwvaWd4LWljb24+XG48L2J1dHRvbj5cblxuPGRpdiAjY29udGFpbmVyIGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctbWFpblwiPlxuICAgIDxkaXY+XG4gICAgICAgICA8aWd4LWNoaXBzLWFyZWEgI2NoaXBzQXJlYT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZXhwcmVzc2lvbnNMaXN0OyBpbmRleCBhcyBpOyBsZXQgbGFzdCA9IGxhc3Q7XCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgPGlneC1jaGlwICNjaGlwIGlkPSdjaGlwJ1xuICAgICAgICAgICAgICAgICAgICAocG9pbnRlcmRvd24pPVwib25DaGlwUG9pbnRlcmRvd24oJGV2ZW50LCBjaGlwKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNoaXBDbGljaygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25DaGlwS2V5RG93bigkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKHJlbW92ZSk9XCJvbkNoaXBSZW1vdmVkKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpdGVtLmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgICAgICBbcmVtb3ZhYmxlXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ3hQcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1cImlteC1pY29uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJpdGVtLmV4cHJlc3Npb24uY29uZGl0aW9uLmljb25OYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ZmlsdGVyaW5nU2VydmljZS5nZXRDaGlwTGFiZWwoaXRlbS5leHByZXNzaW9uKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvaWd4LWNoaXA+XG5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZD0nb3BlcmFuZCcgKm5nSWY9XCIhbGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlneEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZU9wZXJhdG9yc0Ryb3BEb3duKCRldmVudCwgaSlcIiBbaWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbl09XCJvcGVyYXRvcnNcIiBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbj5leHBhbmRfbW9yZTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2ZpbHRlcmluZ1NlcnZpY2UuZ2V0T3BlcmF0b3JBc1N0cmluZyhpdGVtLmFmdGVyT3BlcmF0b3IpfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWRyb3AtZG93biBbZGlzcGxheURlbnNpdHldPVwiY29sdW1uLmdyaWQuZGlzcGxheURlbnNpdHlcIiAjb3BlcmF0b3JzIChzZWxlY3Rpb25DaGFuZ2luZyk9XCJvbkxvZ2ljT3BlcmF0b3JDaGFuZ2VkKCRldmVudCwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWRyb3AtZG93bi1pdGVtIFt2YWx1ZV09XCIwXCIgW3NlbGVjdGVkXT1cIml0ZW0uYWZ0ZXJPcGVyYXRvciA9PT0gMFwiPnt7ZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfb3BlcmF0b3JfYW5kfX08L2lneC1kcm9wLWRvd24taXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWRyb3AtZG93bi1pdGVtIFt2YWx1ZV09XCIxXCIgW3NlbGVjdGVkXT1cIml0ZW0uYWZ0ZXJPcGVyYXRvciA9PT0gMVwiPnt7ZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfb3BlcmF0b3Jfb3J9fTwvaWd4LWRyb3AtZG93bi1pdGVtPlxuICAgICAgICAgICAgICAgICAgICA8L2lneC1kcm9wLWRvd24+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvaWd4LWNoaXBzLWFyZWE+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGJ1dHRvbiBpZ3hCdXR0b249XCJpY29uXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctc2Nyb2xsLWVuZFwiICpuZ0lmPVwic2hvd0Fycm93c1wiIChjbGljayk9XCJzY3JvbGxDaGlwc09uQXJyb3dQcmVzcygncmlnaHQnKVwiPlxuICAgIDxpZ3gtaWNvbj5uYXZpZ2F0ZV9uZXh0PC9pZ3gtaWNvbj5cbjwvYnV0dG9uPlxuXG48ZGl2ICNidXR0b25zQ29udGFpbmVyIFtuZ0NsYXNzXT1cImlzTmFycm93V2lkdGggPyAnaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctZWRpdGluZy1idXR0b25zLS1zbWFsbCcgOiAnaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctZWRpdGluZy1idXR0b25zJ1wiPlxuICAgIDxidXR0b24gW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgW2lneEJ1dHRvbl09XCJpc05hcnJvd1dpZHRoID8gJ2ljb24nIDogJ2ZsYXQnXCIgdHlwZT1cImJ1dHRvblwiIGlneFJpcHBsZSAoY2xpY2spPVwiY2xlYXJGaWx0ZXJpbmcoKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFt0YWJpbmRleF09XCJkaXNhYmxlZFwiPlxuICAgICAgICA8aWd4LWljb24+cmVmcmVzaDwvaWd4LWljb24+XG4gICAgICAgIDxzcGFuPnt7aXNOYXJyb3dXaWR0aCA/ICcnIDogZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfcm93X3Jlc2V0fX08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiAjY2xvc2VCdXR0b24gW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgW2lneEJ1dHRvbl09XCJpc05hcnJvd1dpZHRoID8gJ2ljb24nIDogJ2ZsYXQnXCIgdHlwZT1cImJ1dHRvblwiIGlneFJpcHBsZSAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgICA8aWd4LWljb24+Y2xvc2U8L2lneC1pY29uPlxuICAgICAgICA8c3Bhbj57e2lzTmFycm93V2lkdGggPyAnJyA6IGZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX3Jvd19jbG9zZX19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
|
|
771
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1yb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLXJvdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUNULEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFFWixVQUFVLEVBQ1YsV0FBVyxFQUNYLHVCQUF1QixFQUV2QixZQUFZLEVBRWYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxvQkFBb0IsRUFBdUIsTUFBTSwrQkFBK0IsQ0FBQztBQUUxRixPQUFPLEVBQUUsY0FBYyxFQUF3QixNQUFNLHlEQUF5RCxDQUFDO0FBQy9HLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQztBQUNqSCxPQUFPLEVBQXNCLHFCQUFxQixFQUFvQixNQUFNLDJCQUEyQixDQUFDO0FBR3hHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVB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RUFBRSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkzRCxpQkFBaUI7c0JBRDFCLFlBQVk7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFO2dCQUkvQyxVQUFVO3NCQURuQixTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSW5DLE1BQU07c0JBRGYsU0FBUzt1QkFBQyxRQUFRO2dCQUlULGdCQUFnQjtzQkFEekIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSXpDLFNBQVM7c0JBRGxCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJOUIsT0FBTztzQkFEaEIsU0FBUzt1QkFBQyxTQUFTO2dCQUlWLFdBQVc7c0JBRHBCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFrRG5DLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIElucHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgUXVlcnlMaXN0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgVmlld1JlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR3JpZENvbHVtbkRhdGFUeXBlLCBEYXRhVXRpbCB9IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSWd4RHJvcERvd25Db21wb25lbnQsIElTZWxlY3Rpb25FdmVudEFyZ3MgfSBmcm9tICcuLi8uLi8uLi9kcm9wLWRvd24vcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJRmlsdGVyaW5nT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMsIElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBIb3Jpem9udGFsQWxpZ25tZW50LCBWZXJ0aWNhbEFsaWdubWVudCwgT3ZlcmxheVNldHRpbmdzIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvcG9zaXRpb24vY29ubmVjdGVkLXBvc2l0aW9uaW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7IElCYXNlQ2hpcEV2ZW50QXJncywgSWd4Q2hpcHNBcmVhQ29tcG9uZW50LCBJZ3hDaGlwQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY2hpcHMvcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJZ3hEcm9wRG93bkl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kcm9wLWRvd24vZHJvcC1kb3duLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9ncmlkLWZpbHRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9vdmVybGF5L3Njcm9sbCc7XG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZGlzcGxheURlbnNpdHknO1xuaW1wb3J0IHsgSWd4RGF0ZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hUaW1lUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vdGltZS1waWNrZXIvdGltZS1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IGlzRXF1YWwsIFBsYXRmb3JtVXRpbCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRXhwcmVzc2lvblVJIH0gZnJvbSAnLi4vZXhjZWwtc3R5bGUvY29tbW9uJztcbmltcG9ydCB7IENvbHVtblR5cGUgfSBmcm9tICcuLi8uLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc2VsZWN0b3I6ICdpZ3gtZ3JpZC1maWx0ZXJpbmctcm93JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY29sdW1uKCk6IENvbHVtblR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1uKHZhbCkge1xuICAgICAgICBpZiAodGhpcy5fY29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdC5mb3JFYWNoKGV4cCA9PiBleHAuaXNTZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW4gPSB2YWw7XG5cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0ID0gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdldEV4cHJlc3Npb25zKHRoaXMuX2NvbHVtbi5maWVsZCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbigpO1xuXG4gICAgICAgICAgICB0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uc2VhcmNoVmFsIDogbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbCkge1xuICAgICAgICBpZiAoIXZhbCAmJiB2YWwgIT09IDAgJiYgdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbCkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbCA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uZXhwcmVzc2lvbiA9PT0gdGhpcy5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCAmJiB0aGlzLmV4cHJlc3Npb25zTGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJGaWx0ZXIodGhpcy5jb2x1bW4uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbih0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbDtcbiAgICAgICAgICAgIGlmIChpc0VxdWFsKG9sZFZhbHVlLCB2YWwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24uc2VhcmNoVmFsID0gRGF0YVV0aWwucGFyc2VWYWx1ZSh0aGlzLmNvbHVtbi5kYXRhVHlwZSwgdmFsKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25zTGlzdC5maW5kKGl0ZW0gPT4gaXRlbS5leHByZXNzaW9uID09PSB0aGlzLmV4cHJlc3Npb24pID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEV4cHJlc3Npb24odHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkaXNwbGF5RGVuc2l0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmdyaWQuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvbWZvcnRhYmxlID8gRGlzcGxheURlbnNpdHkuY29zeSA6IHRoaXMuY29sdW1uLmdyaWQuZGlzcGxheURlbnNpdHk7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZF9fZmlsdGVyaW5nLXJvdycpXG4gICAgcHVibGljIGRlZmF1bHRDU1NDbGFzcyA9IHRydWU7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkX19maWx0ZXJpbmctcm93LS1jb21wYWN0JylcbiAgICBwdWJsaWMgZ2V0IGNvbXBhY3RDU1NDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmdyaWQuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvbXBhY3Q7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZF9fZmlsdGVyaW5nLXJvdy0tY29zeScpXG4gICAgcHVibGljIGdldCBjb3N5Q1NTQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5ncmlkLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb3N5O1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRGaWx0ZXJVSScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RmlsdGVyVUk6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RGF0ZVVJJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHREYXRlVUk6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0VGltZVVJJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRUaW1lVUk6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RGF0ZVRpbWVVSScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RGF0ZVRpbWVVSTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIGlucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cENvbmRpdGlvbnMnLCB7IHJlYWQ6IElneERyb3BEb3duQ29tcG9uZW50LCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZHJvcERvd25Db25kaXRpb25zOiBJZ3hEcm9wRG93bkNvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2NoaXBzQXJlYScsIHsgcmVhZDogSWd4Q2hpcHNBcmVhQ29tcG9uZW50LCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgY2hpcHNBcmVhOiBJZ3hDaGlwc0FyZWFDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkcmVuKCdvcGVyYXRvcnMnLCB7IHJlYWQ6IElneERyb3BEb3duQ29tcG9uZW50IH0pXG4gICAgcHJvdGVjdGVkIGRyb3BEb3duT3BlcmF0b3JzOiBRdWVyeUxpc3Q8SWd4RHJvcERvd25Db21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBpbnB1dEdyb3VwOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ3BpY2tlcicpXG4gICAgcHJvdGVjdGVkIHBpY2tlcjogSWd4RGF0ZVBpY2tlckNvbXBvbmVudCB8IElneFRpbWVQaWNrZXJDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdpbnB1dEdyb3VwUHJlZml4JywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIGlucHV0R3JvdXBQcmVmaXg6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgY29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ29wZXJhbmQnKVxuICAgIHByb3RlY3RlZCBvcGVyYW5kOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2Nsb3NlQnV0dG9uJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgY2xvc2VCdXR0b246IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd0Fycm93czogYm9vbGVhbjtcbiAgICBwdWJsaWMgZXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgcHVibGljIGV4cHJlc3Npb25zTGlzdDogQXJyYXk8RXhwcmVzc2lvblVJPjtcblxuICAgIHByaXZhdGUgX3Bvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tXG4gICAgfTtcblxuICAgIHByaXZhdGUgX2NvbmRpdGlvbnNPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcy5fcG9zaXRpb25TZXR0aW5ncylcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfb3BlcmF0b3JzT3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHRoaXMuX3Bvc2l0aW9uU2V0dGluZ3MpXG4gICAgfTtcblxuICAgIHByaXZhdGUgY2hpcHNBcmVhV2lkdGg6IG51bWJlcjtcbiAgICBwcml2YXRlIGNoaXBBcmVhU2Nyb2xsT2Zmc2V0ID0gMDtcbiAgICBwcml2YXRlIF9jb2x1bW4gPSBudWxsO1xuICAgIHByaXZhdGUgaXNLZXlQcmVzc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2NhbmNlbENoaXBDbGljayA9IGZhbHNlO1xuXG4gICAgLyoqIHN3aXRjaCB0byBpY29uIGJ1dHRvbnMgd2hlbiB3aWR0aCBpcyBiZWxvdyA0MzJweCAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgTkFSUk9XX1dJRFRIX1RIUkVTSE9MRCA9IDQzMjtcblxuICAgIHByaXZhdGUgJGRlc3Ryb3llciA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGZpbHRlcmluZ1NlcnZpY2U6IElneEZpbHRlcmluZ1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyByZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWxcbiAgICApIHsgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkhhbmRsZXIoZXZ0OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzRmlsdGVyaW5nS2V5Q29tYm8oZXZ0KSkge1xuICAgICAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLl9jb25kaXRpb25zT3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMuY29sdW1uLmdyaWQub3V0bGV0O1xuICAgICAgICB0aGlzLl9vcGVyYXRvcnNPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5jb2x1bW4uZ3JpZC5vdXRsZXQ7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gdGhpcy5leHByZXNzaW9uc0xpc3QuZmluZChleHByID0+IGV4cHIuaXNTZWxlY3RlZCA9PT0gdHJ1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IHNlbGVjdGVkSXRlbS5leHByZXNzaW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQubG9jYWxlQ2hhbmdlXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95ZXIpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5mb2N1c0VkaXRFbGVtZW50KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhKHRoaXMuY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSAmJiB0aGlzLmNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdERhdGVVSTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5UaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VGltZVVJO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkRhdGVUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RGF0ZVRpbWVVSTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RmlsdGVyVUk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0eXBlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY29sdW1uLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuOlxuICAgICAgICAgICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5OdW1iZXI6XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5DdXJyZW5jeTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbmRpdGlvbnMoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmZpbHRlcnMuY29uZGl0aW9uTGlzdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNVbmFyeUNvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24gJiYgdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdldENoaXBMYWJlbCh0aGlzLmV4cHJlc3Npb24pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfcm93X2RhdGVfcGxhY2Vob2xkZXI7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2ZpbHRlcl9yb3dfYm9vbGVhbl9wbGFjZWhvbGRlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX3Jvd19wbGFjZWhvbGRlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGtleWRvd24gb24gdGhlIGlucHV0IGdyb3VwJ3MgcHJlZml4LlxuICAgICAqL1xuICAgIHB1YmxpYyBvblByZWZpeEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGV2ZW50KSAmJiB0aGlzLmRyb3BEb3duQ29uZGl0aW9ucy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29uZGl0aW9uc0Ryb3BEb3duKHRoaXMuaW5wdXRHcm91cFByZWZpeC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gdGhpcy5wbGF0Zm9ybS5LRVlNQVAuVEFCICYmICF0aGlzLmRyb3BEb3duQ29uZGl0aW9ucy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29uZGl0aW9uc0Ryb3BEb3duKHRoaXMuaW5wdXRHcm91cFByZWZpeC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGtleWRvd24gb24gdGhlIGlucHV0LlxuICAgICAqL1xuICAgIHB1YmxpYyBvbklucHV0S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB0aGlzLmlzS2V5UHJlc3NlZCA9IHRydWU7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dEdyb3VwUHJlZml4Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbmRpdGlvbnNEcm9wRG93bih0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IHRoaXMucGxhdGZvcm0uS0VZTUFQLkVOVEVSKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0NvbXBvc2luZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29tbWl0SW5wdXQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5hbHRLZXkgJiYgKGV2ZW50LmtleSA9PT0gdGhpcy5wbGF0Zm9ybS5LRVlNQVAuQVJST1dfRE9XTikpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRHcm91cFByZWZpeC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbmRpdGlvbnNEcm9wRG93bih0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wbGF0Zm9ybS5pc0ZpbHRlcmluZ0tleUNvbWJvKGV2ZW50KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGtleXVwIG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dEtleVVwKCkge1xuICAgICAgICB0aGlzLmlzS2V5UHJlc3NlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGlucHV0IG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dChldmVudEFyZ3MpIHtcbiAgICAgICAgLy8gVGhlICdpc2tleVByZXNzZWQnIGZsYWcgaXMgbmVlZGVkIGZvciBhIGNhc2UgaW4gSUUsIGJlY2F1c2UgdGhlIGlucHV0IGV2ZW50IGlzIGZpcmVkIG9uIGZvY3VzIGFuZCBmb3Igc29tZSByZWFzb24sXG4gICAgICAgIC8vIHdoZW4geW91IGhhdmUgYSBqYXBhbmVzZSBjaGFyYWN0ZXIgYXMgYSBwbGFjZWhvbGRlciwgb24gaW5pdCB0aGUgdmFsdWUgaGVyZSBpcyBlbXB0eSBzdHJpbmcgLlxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudEFyZ3MudGFyZ2V0O1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlVGltZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV2ZW50QXJncztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0VkZ2UgJiYgdGFyZ2V0LnR5cGUgIT09ICdudW1iZXInXG4gICAgICAgICAgICB8fCB0aGlzLmlzS2V5UHJlc3NlZCB8fCB0YXJnZXQudmFsdWUgfHwgdGFyZ2V0LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRhcmdldC52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGNvbXBvc2l0aW9uc3RhcnQgb24gdGhlIGlucHV0LlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbXBvc2l0aW9uU3RhcnQoKSB7XG4gICAgICAgIHRoaXMuaXNDb21wb3NpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGNvbXBvc2l0aW9uZW5kIG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db21wb3NpdGlvbkVuZCgpIHtcbiAgICAgICAgdGhpcy5pc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGlucHV0IGNsaWNrIGV2ZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBvbklucHV0Q2xpY2soKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkJvb2xlYW4gJiYgdGhpcy5kcm9wRG93bkNvbmRpdGlvbnMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy50b2dnbGVDb25kaXRpb25zRHJvcERvd24odGhpcy5pbnB1dEdyb3VwUHJlZml4Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyaW5nIG9wZXJhdGlvbiBjb25kaXRpb24gZm9yIGEgZ2l2ZW4gdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldENvbmRpdGlvbih2YWx1ZTogc3RyaW5nKTogSUZpbHRlcmluZ09wZXJhdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5maWx0ZXJzLmNvbmRpdGlvbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdHJhbnNsYXRlZCBjb25kaXRpb24gbmFtZSBmb3IgYSBnaXZlbiB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNsYXRlQ29uZGl0aW9uKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQucmVzb3VyY2VTdHJpbmdzW2BpZ3hfZ3JpZF9maWx0ZXJfJHt0aGlzLmdldENvbmRpdGlvbih2YWx1ZSkubmFtZX1gXSB8fCB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpY29uIG5hbWUgb2YgdGhlIGN1cnJlbnQgY29uZGl0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJY29uTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuICYmIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbih0aGlzLmNvbmRpdGlvbnNbMF0pLmljb25OYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24uaWNvbk5hbWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBnaXZlbiBjb25kaXRpb24gaXMgc2VsZWN0ZWQgaW4gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHVibGljIGlzQ29uZGl0aW9uU2VsZWN0ZWQoY29uZGl0aW9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lID09PSBjb25kaXRpb25OYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBjdXJyZW50IGZpbHRlcmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGaWx0ZXJpbmcoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5jbGVhckZpbHRlcih0aGlzLmNvbHVtbi5maWVsZCk7XG4gICAgICAgIHRoaXMucmVzZXRFeHByZXNzaW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbW1pdHMgdGhlIHZhbHVlIG9mIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29tbWl0SW5wdXQoKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0LmZpbHRlcihleCA9PiBleC5pc1NlbGVjdGVkID09PSB0cnVlKTtcbiAgICAgICAgc2VsZWN0ZWRJdGVtLmZvckVhY2goZSA9PiBlLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XG5cbiAgICAgICAgbGV0IGluZGV4VG9EZXNlbGVjdCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uc0xpc3RbaW5kZXhdLmV4cHJlc3Npb247XG4gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbi5zZWFyY2hWYWwgPT09IG51bGwgJiYgIWV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkpIHtcbiAgICAgICAgICAgICAgICBpbmRleFRvRGVzZWxlY3QgPSBpbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhUb0Rlc2VsZWN0ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVFeHByZXNzaW9uKGluZGV4VG9EZXNlbGVjdCwgdGhpcy5leHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbigpO1xuICAgICAgICB0aGlzLnNjcm9sbENoaXBzV2hlbkFkZGluZ0V4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIHZhbHVlIG9mIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJJbnB1dChldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBrZXlkb3duIG9uIGNsZWFyIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25DbGVhcktleURvd24oZXZlbnRBcmdzOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzQWN0aXZhdGlvbktleShldmVudEFyZ3MpKSB7XG4gICAgICAgICAgICBldmVudEFyZ3MucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dCgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0VkaXRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjbGljayBvbiBjbGVhciBidXR0b24uXG4gICAgICovXG4gICAgcHVibGljIG9uQ2xlYXJDbGljaygpIHtcbiAgICAgICAgdGhpcy5jbGVhcklucHV0KCk7XG4gICAgICAgIHRoaXMuZm9jdXNFZGl0RWxlbWVudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGtleWRvd24gb24gY29tbWl0IGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db21taXRLZXlEb3duKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdElucHV0KCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRWRpdEVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGNsaWNrIG9uIGNvbW1pdCBidXR0b24uXG4gICAgICovXG4gICAgcHVibGljIG9uQ29tbWl0Q2xpY2soZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5jb21taXRJbnB1dCgpO1xuICAgICAgICB0aGlzLmZvY3VzRWRpdEVsZW1lbnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBmb2N1c291dCBvbiB0aGUgaW5wdXQgZ3JvdXAuXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXRHcm91cEZvY3Vzb3V0KCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZSAhPT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbiAmJiAhdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGZvY3VzZWRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnaWd4LWNoaXBfX3JlbW92ZScpIHx8IGZvY3VzZWRFbGVtZW50LnRhZ05hbWUgPT09ICdJR1gtREFZLUlURU0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIShmb2N1c2VkRWxlbWVudCAmJiB0aGlzLmVkaXRvcnNDb250YWluKGZvY3VzZWRFbGVtZW50KSlcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmRyb3BEb3duQ29uZGl0aW9ucy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1pdElucHV0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgZmlsdGVyaW5nIGVkaXQgcm93LlxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbnNMaXN0Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3RbMF0uZXhwcmVzc2lvbi5zZWFyY2hWYWwgPT09IG51bGwgJiZcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0WzBdLmV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZ2V0RXhwcmVzc2lvbnModGhpcy5jb2x1bW4uZmllbGQpLnBvcCgpO1xuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29uZFRvUmVtb3ZlID0gdGhpcy5leHByZXNzaW9uc0xpc3QuZmlsdGVyKGV4ID0+IGV4LmV4cHJlc3Npb24uc2VhcmNoVmFsID09PSBudWxsICYmICFleC5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KTtcbiAgICAgICAgICAgIGlmIChjb25kVG9SZW1vdmUgJiYgY29uZFRvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25kVG9SZW1vdmUuZm9yRWFjaChjID0+IHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZW1vdmVFeHByZXNzaW9uKHRoaXMuY29sdW1uLmZpZWxkLCB0aGlzLmV4cHJlc3Npb25zTGlzdC5pbmRleE9mKGMpKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLnVwZGF0ZUZpbHRlcmluZ0NlbGwodGhpcy5jb2x1bW4pO1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyZWRDb2x1bW4gPSBudWxsO1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2Uuc2VsZWN0ZWRFeHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQudGhlYWRSb3cubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuXG4gICAgICAgIHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSh0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRXZlbnQgaGFuZGxlciBmb3IgZGF0ZSBwaWNrZXIncyBzZWxlY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIG9uRGF0ZVNlbGVjdGVkKHZhbHVlOiBEYXRlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgaW5wdXRHcm91cFByZWZpeENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgICAgdGhpcy50b2dnbGVDb25kaXRpb25zRHJvcERvd24oZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGNvbmRpdGlvbnMgZHJvcGRvd24uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZUNvbmRpdGlvbnNEcm9wRG93bih0YXJnZXQ6IGFueSkge1xuICAgICAgICB0aGlzLl9jb25kaXRpb25zT3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5fY29uZGl0aW9uc092ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0YXJnZXQgYXMgSFRNTEVsZW1lbnRdO1xuICAgICAgICB0aGlzLmRyb3BEb3duQ29uZGl0aW9ucy50b2dnbGUodGhpcy5fY29uZGl0aW9uc092ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGxvZ2ljIG9wZXJhdG9ycyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlT3BlcmF0b3JzRHJvcERvd24oZXZlbnRBcmdzLCBpbmRleCkge1xuICAgICAgICB0aGlzLl9vcGVyYXRvcnNPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gZXZlbnRBcmdzLnRhcmdldC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB0aGlzLl9vcGVyYXRvcnNPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbZXZlbnRBcmdzLnRhcmdldC5wYXJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50XTtcbiAgICAgICAgdGhpcy5kcm9wRG93bk9wZXJhdG9ycy50b0FycmF5KClbaW5kZXhdLnRvZ2dsZSh0aGlzLl9vcGVyYXRvcnNPdmVybGF5U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGNoYW5nZSBldmVudCBpbiBjb25kaXRpb25zIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbmRpdGlvbnNDaGFuZ2VkKGV2ZW50QXJncykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChldmVudEFyZ3MubmV3U2VsZWN0aW9uIGFzIElneERyb3BEb3duSXRlbUNvbXBvbmVudCkudmFsdWU7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24gPSB0aGlzLmdldENvbmRpdGlvbih2YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBncmlkJ3MgZmlsdGVyaW5nIG9uIHRoZSBuZXh0IGN5Y2xlIHRvIGVuc3VyZSB0aGUgZHJvcC1kb3duIGlzIGNsb3NlZFxuICAgICAgICAgICAgLy8gaWYgdGhlIGRyb3AtZG93biBpcyBub3QgY2xvc2VkIHRoaXMgZXZlbnQgaGFuZGxlciB3aWxsIGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXNcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnVuYXJ5Q29uZGl0aW9uQ2hhbmdlZENhbGxiYWNrKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuY29uZGl0aW9uQ2hhbmdlZENhbGxiYWNrKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHJlcXVlc3RBbmltYXRpb25GcmFtZSBiZWNhdXNlIG9mIGFuIGlzc3VlIGluIElFLCB3aGVyZSB5b3UgYXJlIHN0aWxsIGFibGUgdG8gd3JpdGUgaW4gdGhlIGlucHV0LFxuICAgICAgICAvLyBpZiBpdCBoYXMgYmVlbiBmb2N1c2VkIGFuZCB0aGVuIHNldCB0byByZWFkb25seS5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZm9jdXNFZGl0RWxlbWVudCgpKTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBvbkNoaXBQb2ludGVyZG93bihhcmdzLCBjaGlwOiBJZ3hDaGlwQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLl9jYW5jZWxDaGlwQ2xpY2sgPSBjaGlwLnNlbGVjdGVkXG4gICAgICAgICAgICAmJiBhY3RpdmVFbGVtZW50ICYmIHRoaXMuZWRpdG9yc0NvbnRhaW4oYWN0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2hpcENsaWNrKGFyZ3MsIGl0ZW06IEV4cHJlc3Npb25VSSkge1xuICAgICAgICBpZiAodGhpcy5fY2FuY2VsQ2hpcENsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxDaGlwQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0LmZvckVhY2goZXggPT4gZXguaXNTZWxlY3RlZCA9IGZhbHNlKTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUNoaXAoaXRlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZUNoaXAoaXRlbTogRXhwcmVzc2lvblVJKSB7XG4gICAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9ICFpdGVtLmlzU2VsZWN0ZWQ7XG4gICAgICAgIGlmIChpdGVtLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGl0ZW0uZXhwcmVzc2lvbjtcblxuICAgICAgICAgICAgdGhpcy5mb2N1c0VkaXRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjaGlwIGtleWRvd24gZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcEtleURvd24oZXZlbnRBcmdzOiBLZXlib2FyZEV2ZW50LCBpdGVtOiBFeHByZXNzaW9uVUkpIHtcbiAgICAgICAgaWYgKGV2ZW50QXJncy5rZXkgPT09IHRoaXMucGxhdGZvcm0uS0VZTUFQLkVOVEVSKSB7XG4gICAgICAgICAgICBldmVudEFyZ3MucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy50b2dnbGVDaGlwKGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2Nyb2xscyB0aGUgZmlyc3QgY2hpcCBpbnRvIHZpZXcgaWYgdGhlIHRhYiBrZXkgaXMgcHJlc3NlZCBvbiB0aGUgbGVmdCBhcnJvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25MZWZ0QXJyb3dLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IHRoaXMucGxhdGZvcm0uS0VZTUFQLlRBQikge1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IDA7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybSh0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIGNoaXAgcmVtb3ZlZCBldmVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwUmVtb3ZlZChldmVudEFyZ3M6IElCYXNlQ2hpcEV2ZW50QXJncywgaXRlbTogRXhwcmVzc2lvblVJKSB7XG4gICAgICAgIGNvbnN0IGluZGV4VG9SZW1vdmUgPSB0aGlzLmV4cHJlc3Npb25zTGlzdC5pbmRleE9mKGl0ZW0pO1xuICAgICAgICB0aGlzLnJlbW92ZUV4cHJlc3Npb24oaW5kZXhUb1JlbW92ZSwgaXRlbS5leHByZXNzaW9uKTtcblxuICAgICAgICB0aGlzLnNjcm9sbENoaXBzT25SZW1vdmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBsb2dpYyBvcGVyYXRvciBjaGFuZ2VkIGV2ZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkxvZ2ljT3BlcmF0b3JDaGFuZ2VkKGV2ZW50QXJnczogSVNlbGVjdGlvbkV2ZW50QXJncywgZXhwcmVzc2lvbjogRXhwcmVzc2lvblVJKSB7XG4gICAgICAgIGlmIChldmVudEFyZ3Mub2xkU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBleHByZXNzaW9uLmFmdGVyT3BlcmF0b3IgPSAoZXZlbnRBcmdzLm5ld1NlbGVjdGlvbiBhcyBJZ3hEcm9wRG93bkl0ZW1Db21wb25lbnQpLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3RbdGhpcy5leHByZXNzaW9uc0xpc3QuaW5kZXhPZihleHByZXNzaW9uKSArIDFdLmJlZm9yZU9wZXJhdG9yID0gZXhwcmVzc2lvbi5hZnRlck9wZXJhdG9yO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgZ3JpZCdzIGZpbHRlcmluZyBvbiB0aGUgbmV4dCBjeWNsZSB0byBlbnN1cmUgdGhlIGRyb3AtZG93biBpcyBjbG9zZWRcbiAgICAgICAgICAgIC8vIGlmIHRoZSBkcm9wLWRvd24gaXMgbm90IGNsb3NlZCB0aGlzIGV2ZW50IGhhbmRsZXIgd2lsbCBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5maWx0ZXIoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTY3JvbGxzIHRoZSBjaGlwcyBpbnRvIHRoZSBjaGlwIGFyZWEgd2hlbiBsZWZ0IG9yIHJpZ2h0IGFycm93cyBhcmUgcHJlc3NlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2Nyb2xsQ2hpcHNPbkFycm93UHJlc3MoYXJyb3dQb3NpdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IGNoaXBBcmFlQ2hpbGRyZW4gPSB0aGlzLmNoaXBzQXJlYS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGlmIChhcnJvd1Bvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaXAgb2YgY2hpcEFyYWVDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmNlaWwoY2hpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkgPCBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5yaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb3VudCA8IGNoaXBBcmFlQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCAtPSBNYXRoLmNlaWwoY2hpcEFyYWVDaGlsZHJlbltjb3VudF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpIC1cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5jZWlsKGNvbnRhaW5lclJlY3QucmlnaHQpICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybSh0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcnJvd1Bvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpcCBvZiBjaGlwQXJhZUNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKE1hdGguY2VpbChjaGlwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpIDwgTWF0aC5jZWlsKGNvbnRhaW5lclJlY3QubGVmdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0ICs9IE1hdGguY2VpbChjb250YWluZXJSZWN0LmxlZnQpIC1cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5jZWlsKGNoaXBBcmFlQ2hpbGRyZW5bY291bnQgLSAxXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmVzZXRzIHRoZSBjaGlwcyBhcmVhXG4gICAgICogQG1lbWJlcm9mIElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDaGlwc0FyZWEoKSB7XG4gICAgICAgIHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSh0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0KTtcbiAgICAgICAgdGhpcy5zaG93SGlkZUFycm93QnV0dG9ucygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBmb2N1c0VkaXRFbGVtZW50KCkge1xuICAgICAgICBpZiAodGhpcy5pbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waWNrZXIpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyLmdldEVkaXRFbGVtZW50KCkuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy4kZGVzdHJveWVyLm5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dIaWRlQXJyb3dCdXR0b25zKCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlwc0FyZWFXaWR0aCA9IHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Fycm93cyA9IHRoaXMuY2hpcHNBcmVhV2lkdGggPj0gY29udGFpbmVyV2lkdGggJiYgdGhpcy5pc0NvbHVtbkZpbHRlcmVkO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNlIHRoZSBjZHIuZGV0ZWN0Q2hhbmdlcygpIHVzYWdlIGhlcmVcbiAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmNkciBhcyBWaWV3UmVmKS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRFeHByZXNzaW9uKGlzU2VsZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgZXhwclVJID0gbmV3IEV4cHJlc3Npb25VSSgpO1xuICAgICAgICBleHByVUkuZXhwcmVzc2lvbiA9IHRoaXMuZXhwcmVzc2lvbjtcbiAgICAgICAgZXhwclVJLmJlZm9yZU9wZXJhdG9yID0gdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoID4gMCA/IEZpbHRlcmluZ0xvZ2ljLkFuZCA6IG51bGw7XG4gICAgICAgIGV4cHJVSS5pc1NlbGVjdGVkID0gaXNTZWxlY3RlZDtcblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdC5wdXNoKGV4cHJVSSk7XG5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uc0xpc3RbbGVuZ3RoIC0gMl0pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0W2xlbmd0aCAtIDJdLmFmdGVyT3BlcmF0b3IgPSB0aGlzLmV4cHJlc3Npb25zTGlzdFtsZW5ndGggLSAxXS5iZWZvcmVPcGVyYXRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvd0hpZGVBcnJvd0J1dHRvbnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUV4cHJlc3Npb24oaW5kZXhUb1JlbW92ZTogbnVtYmVyLCBleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbikge1xuICAgICAgICBpZiAoaW5kZXhUb1JlbW92ZSA9PT0gMCAmJiB0aGlzLmV4cHJlc3Npb25zTGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGaWx0ZXJpbmcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZW1vdmVFeHByZXNzaW9uKHRoaXMuY29sdW1uLmZpZWxkLCBpbmRleFRvUmVtb3ZlKTtcblxuICAgICAgICB0aGlzLmZpbHRlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24gPT09IGV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRFeHByZXNzaW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dIaWRlQXJyb3dCdXR0b25zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldEV4cHJlc3Npb24oY29uZGl0aW9uPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IHtcbiAgICAgICAgICAgIGZpZWxkTmFtZTogdGhpcy5jb2x1bW4uZmllbGQsXG4gICAgICAgICAgICBjb25kaXRpb246IG51bGwsXG4gICAgICAgICAgICBzZWFyY2hWYWw6IG51bGwsXG4gICAgICAgICAgICBpZ25vcmVDYXNlOiB0aGlzLmNvbHVtbi5maWx0ZXJpbmdJZ25vcmVDYXNlXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlICE9PSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbikge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbiA9IHRoaXMuZ2V0Q29uZGl0aW9uKGNvbmRpdGlvbiA/PyB0aGlzLmNvbmRpdGlvbnNbMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZSAmJiB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaG93SGlkZUFycm93QnV0dG9ucygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsQ2hpcHNXaGVuQWRkaW5nRXhwcmVzc2lvbigpIHtcbiAgICAgICAgY29uc3QgY2hpcEFyYWVDaGlsZHJlbiA9IHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgaWYgKCFjaGlwQXJhZUNoaWxkcmVuIHx8IGNoaXBBcmFlQ2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGlwc0NvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3QgY2hpcHNBcmVhV2lkdGggPSB0aGlzLmNoaXBzQXJlYS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgaWYgKGNoaXBzQXJlYVdpZHRoID4gY2hpcHNDb250YWluZXJXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IGNoaXBzQ29udGFpbmVyV2lkdGggLSBjaGlwc0FyZWFXaWR0aDtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm0ob2Zmc2V0OiBudW1iZXIpIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7b2Zmc2V0fXB4KWA7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsQ2hpcHNPblJlbW92ZSgpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgY29uc3QgY2hpcEFyYWVDaGlsZHJlbiA9IHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjaGlwIG9mIGNoaXBBcmFlQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmNlaWwoY2hpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkgPCBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5sZWZ0KSkge1xuICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY291bnQgPD0gMikge1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkaWYgPSBjaGlwQXJhZUNoaWxkcmVuW2NvdW50XS5pZCA9PT0gJ2NoaXAnID8gY291bnQgLSAyIDogY291bnQgLSAxO1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCArPSBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5sZWZ0KSAtIE1hdGguY2VpbChjaGlwQXJhZUNoaWxkcmVuW2RpZl0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCkgKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25kaXRpb25DaGFuZ2VkQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmICghIXRoaXMuZXhwcmVzc2lvbi5zZWFyY2hWYWwgfHwgdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdW5hcnlDb25kaXRpb25DaGFuZ2VkQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uc0xpc3QuZmluZChpdGVtID0+IGl0ZW0uZXhwcmVzc2lvbiA9PT0gdGhpcy5leHByZXNzaW9uKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEV4cHJlc3Npb24odHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlcigpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlckludGVybmFsKHRoaXMuY29sdW1uLmZpZWxkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVkaXRvcnNDb250YWluKGNoaWxkOiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIHRoZSBmaXJzdCBjaGVjayBpcyBmYWxzZSBhbmQgdGhlIHNlY29uZCBpcyB1bmRlZmluZWQgdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgLy8gbWFrZSBzdXJlIGl0IGFsd2F5cyByZXR1cm5zIGJvb2xlYW5cbiAgICAgICAgcmV0dXJuICEhKHRoaXMuaW5wdXRHcm91cCAmJiB0aGlzLmlucHV0R3JvdXAubmF0aXZlRWxlbWVudC5jb250YWlucyhjaGlsZClcbiAgICAgICAgICAgIHx8IHRoaXMucGlja2VyICYmIHRoaXMucGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhjaGlsZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzQ29sdW1uRmlsdGVyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgJiYgdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc05hcnJvd1dpZHRoKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIDwgdGhpcy5OQVJST1dfV0lEVEhfVEhSRVNIT0xEO1xuICAgIH1cbn1cbiIsIjwhLS0gSGF2ZSB0byBhcHBseSBzdHlsZXMgaW5saW5lIGJlY2F1c2Ugb2YgdGhlIG92ZXJsYXkgb3V0bGV0IC4uLiAtLT5cbjxpZ3gtZHJvcC1kb3duICNpbnB1dEdyb3VwQ29uZGl0aW9ucyBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIiBbaGVpZ2h0XT1cIicyMDBweCdcIiAoc2VsZWN0aW9uQ2hhbmdpbmcpPVwib25Db25kaXRpb25zQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgPGlneC1kcm9wLWRvd24taXRlbSAqbmdGb3I9XCJsZXQgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnNcIlxuICAgICAgICBbdmFsdWVdPVwiY29uZGl0aW9uXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cImlzQ29uZGl0aW9uU2VsZWN0ZWQoY29uZGl0aW9uKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi1pdGVtc1wiPlxuICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIFtuYW1lXT1cImdldENvbmRpdGlvbihjb25kaXRpb24pLmljb25OYW1lXCI+PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi10ZXh0XCI+e3sgdHJhbnNsYXRlQ29uZGl0aW9uKGNvbmRpdGlvbikgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvaWd4LWRyb3AtZG93bi1pdGVtPlxuPC9pZ3gtZHJvcC1kb3duPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRGaWx0ZXJVST5cbiAgICA8aWd4LWlucHV0LWdyb3VwICNpbnB1dEdyb3VwIHR5cGU9XCJib3hcIiBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIiAoZm9jdXNvdXQpPVwib25JbnB1dEdyb3VwRm9jdXNvdXQoKVwiPlxuICAgICAgICA8aWd4LXByZWZpeCAjaW5wdXRHcm91cFByZWZpeFxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5wdXRHcm91cFByZWZpeENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblByZWZpeEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZ3hEcm9wRG93bkl0ZW1OYXZpZ2F0aW9uXT1cImlucHV0R3JvdXBDb25kaXRpb25zXCI+XG4gICAgICAgICAgICA8aWd4LWljb24gZmFtaWx5PVwiaW14LWljb25zXCIgW25hbWVdPVwiZ2V0SWNvbk5hbWUoKVwiPjwvaWd4LWljb24+XG4gICAgICAgIDwvaWd4LXByZWZpeD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJpc1VuYXJ5Q29uZGl0aW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbklucHV0Q2xpY2soKVwiXG4gICAgICAgICAgICAoY29tcG9zaXRpb25zdGFydCk9XCJvbkNvbXBvc2l0aW9uU3RhcnQoKVwiXG4gICAgICAgICAgICAoY29tcG9zaXRpb25lbmQpPVwib25Db21wb3NpdGlvbkVuZCgpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uSW5wdXRLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGtleXVwKT1cIm9uSW5wdXRLZXlVcCgpXCIvPlxuICAgICAgICA8aWd4LXN1ZmZpeCAqbmdJZj1cInZhbHVlIHx8IHZhbHVlID09PSAwXCIgPlxuICAgICAgICAgICAgPGlneC1pY29uIChrZXlkb3duKT1cIm9uQ29tbWl0S2V5RG93bigkZXZlbnQpXCIgKGNsaWNrKT1cIm9uQ29tbWl0Q2xpY2soKVwiIHRhYmluZGV4PVwiMFwiPmRvbmU8L2lneC1pY29uPlxuICAgICAgICAgICAgPGlneC1pY29uIChrZXlkb3duKT1cIm9uQ2xlYXJLZXlEb3duKCRldmVudClcIiAoY2xpY2spPVwib25DbGVhckNsaWNrKClcIiB0YWJpbmRleD1cIjBcIj5jbGVhcjwvaWd4LWljb24+XG4gICAgICAgIDwvaWd4LXN1ZmZpeD5cbiAgICA8L2lneC1pbnB1dC1ncm91cD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdERhdGVVST5cbiAgICA8aWd4LWRhdGUtcGlja2VyICNwaWNrZXJcbiAgICAgICAgWyh2YWx1ZSldPVwidmFsdWVcIlxuICAgICAgICBbcmVhZE9ubHldPVwidHJ1ZVwiXG4gICAgICAgIFtvdXRsZXRdPVwiZmlsdGVyaW5nU2VydmljZS5ncmlkLm91dGxldFwiXG4gICAgICAgIFtsb2NhbGVdPVwiZmlsdGVyaW5nU2VydmljZS5ncmlkLmxvY2FsZVwiXG4gICAgICAgIChjbGljayk9XCJleHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5ID8gbnVsbCA6IHBpY2tlci5vcGVuKClcIlxuICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwiY29sdW1uLnBpcGVBcmdzLmZvcm1hdFwiXG4gICAgICAgIFtmb3JtYXR0ZXJdPVwiY29sdW1uLmZvcm1hdHRlclwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIFt3ZWVrU3RhcnRdPVwiY29sdW1uLnBpcGVBcmdzLndlZWtTdGFydFwiXG4gICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJkaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uSW5wdXRLZXlEb3duKCRldmVudClcIlxuICAgICAgICAoZm9jdXNvdXQpPVwib25JbnB1dEdyb3VwRm9jdXNvdXQoKVwiXG4gICAgICAgIChjbG9zZWQpPVwiZm9jdXNFZGl0RWxlbWVudCgpXCI+XG4gICAgICAgIDxpZ3gtcHJlZml4ICNpbnB1dEdyb3VwUHJlZml4XG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0R3JvdXBQcmVmaXhDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uUHJlZml4S2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgIFtpZ3hEcm9wRG93bkl0ZW1OYXZpZ2F0aW9uXT1cImlucHV0R3JvdXBDb25kaXRpb25zXCI+XG4gICAgICAgICAgICA8aWd4LWljb24gZmFtaWx5PVwiaW14LWljb25zXCIgW25hbWVdPVwiZXhwcmVzc2lvbi5jb25kaXRpb24uaWNvbk5hbWVcIj48L2lneC1pY29uPlxuICAgICAgICA8L2lneC1wcmVmaXg+XG4gICAgICAgIDxpZ3gtc3VmZml4ICpuZ0lmPVwidmFsdWVcIj5cbiAgICAgICAgICAgIDxpZ3gtaWNvbiB0YWJpbmRleD1cIjBcIiAoa2V5ZG93bik9XCJvbkNvbW1pdEtleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJvbkNvbW1pdENsaWNrKCRldmVudClcIj5kb25lPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxpZ3gtaWNvbiB0YWJpbmRleD1cIjBcIiAoa2V5ZG93bik9XCJvbkNsZWFyS2V5RG93bigkZXZlbnQpXCIgKGNsaWNrKT1cImNsZWFySW5wdXQoJGV2ZW50KVwiPmNsZWFyPC9pZ3gtaWNvbj5cbiAgICAgICAgPC9pZ3gtc3VmZml4PlxuICAgICAgICA8IS0tIGRpc2FibGUgZGVmYXVsdCBpY29ucyAtLT5cbiAgICAgICAgPGlneC1waWNrZXItdG9nZ2xlPjwvaWd4LXBpY2tlci10b2dnbGU+XG4gICAgICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICA8L2lneC1kYXRlLXBpY2tlcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRpbWVVST5cbiAgICA8aWd4LXRpbWUtcGlja2VyICNwaWNrZXJcbiAgICAgICAgWyh2YWx1ZSldPVwidmFsdWVcIlxuICAgICAgICBbaW5wdXRGb3JtYXRdPVwiY29sdW1uLmRlZmF1bHRUaW1lRm9ybWF0XCJcbiAgICAgICAgW2xvY2FsZV09XCJmaWx0ZXJpbmdTZXJ2aWNlLmdyaWQubG9jYWxlXCJcbiAgICAgICAgW2Zvcm1hdHRlcl09XCJjb2x1bW4uZm9ybWF0dGVyXCJcbiAgICAgICAgW291dGxldF09XCJmaWx0ZXJpbmdTZXJ2aWNlLmdyaWQub3V0bGV0XCJcbiAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgKGNsb3NlZCk9XCJmb2N1c0VkaXRFbGVtZW50KClcIlxuICAgICAgICAoZm9jdXNvdXQpPVwib25JbnB1dEdyb3VwRm9jdXNvdXQoKVwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uSW5wdXRLZXlEb3duKCRldmVudClcIlxuICAgICAgICAoY2xpY2spPVwiZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSA/IG51bGwgOiBwaWNrZXIub3BlbigpXCI+XG4gICAgICAgIDxpZ3gtcHJlZml4ICNpbnB1dEdyb3VwUHJlZml4XG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0R3JvdXBQcmVmaXhDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uUHJlZml4S2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgIFtpZ3hEcm9wRG93bkl0ZW1OYXZpZ2F0aW9uXT1cImlucHV0R3JvdXBDb25kaXRpb25zXCI+XG4gICAgICAgICAgICA8aWd4LWljb24gZmFtaWx5PVwiaW14LWljb25zXCIgW25hbWVdPVwiZXhwcmVzc2lvbi5jb25kaXRpb24uaWNvbk5hbWVcIj48L2lneC1pY29uPlxuICAgICAgICA8L2lneC1wcmVmaXg+XG4gICAgICAgIDxpZ3gtc3VmZml4ICpuZ0lmPVwidmFsdWVcIj5cbiAgICAgICAgICAgIDxpZ3gtaWNvbiB0YWJpbmRleD1cIjBcIiAoa2V5ZG93bik9XCJvbkNvbW1pdEtleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJvbkNvbW1pdENsaWNrKCRldmVudClcIj5kb25lPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxpZ3gtaWNvbiB0YWJpbmRleD1cIjBcIiAoa2V5ZG93bik9XCJvbkNsZWFyS2V5RG93bigkZXZlbnQpXCIgKGNsaWNrKT1cImNsZWFySW5wdXQoJGV2ZW50KVwiPmNsZWFyPC9pZ3gtaWNvbj5cbiAgICAgICAgPC9pZ3gtc3VmZml4PlxuICAgICAgICA8IS0tIGRpc2FibGUgZGVmYXVsdCBpY29ucyAtLT5cbiAgICAgICAgPGlneC1waWNrZXItdG9nZ2xlPjwvaWd4LXBpY2tlci10b2dnbGU+XG4gICAgICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICA8L2lneC10aW1lLXBpY2tlcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdERhdGVUaW1lVUk+XG4gICAgPGlneC1pbnB1dC1ncm91cCAjaW5wdXRHcm91cCB0eXBlPVwiYm94XCIgW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgKGZvY3Vzb3V0KT1cIm9uSW5wdXRHcm91cEZvY3Vzb3V0KClcIj5cbiAgICAgICAgPGlneC1wcmVmaXggI2lucHV0R3JvdXBQcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0R3JvdXBQcmVmaXhDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25QcmVmaXhLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbaWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbl09XCJpbnB1dEdyb3VwQ29uZGl0aW9uc1wiPlxuICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIFtuYW1lXT1cImdldEljb25OYW1lKClcIj48L2lneC1pY29uPlxuICAgICAgICA8L2lneC1wcmVmaXg+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICBpZ3hJbnB1dFxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbaWd4RGF0ZVRpbWVFZGl0b3JdPVwiY29sdW1uLmRlZmF1bHREYXRlVGltZUZvcm1hdFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiaXNVbmFyeUNvbmRpdGlvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25JbnB1dENsaWNrKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5dXApPVwib25JbnB1dEtleVVwKClcIi8+XG4gICAgICAgICAgICA8aWd4LXN1ZmZpeCAqbmdJZj1cInZhbHVlIHx8IHZhbHVlID09PSAwXCIgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiAoa2V5ZG93bik9XCJvbkNvbW1pdEtleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJvbkNvbW1pdENsaWNrKClcIiB0YWJpbmRleD1cIjBcIj5kb25lPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24gKGtleWRvd24pPVwib25DbGVhcktleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJvbkNsZWFyQ2xpY2soKVwiIHRhYmluZGV4PVwiMFwiPmNsZWFyPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDwvaWd4LXN1ZmZpeD5cbiAgICA8L2lneC1pbnB1dC1ncm91cD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHRoaXMgfVwiPjwvbmctY29udGFpbmVyPlxuXG48YnV0dG9uIGlneEJ1dHRvbj1cImljb25cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpZ3gtZ3JpZF9fZmlsdGVyaW5nLXJvdy1zY3JvbGwtc3RhcnRcIiAqbmdJZj1cInNob3dBcnJvd3NcIiAoa2V5ZG93bik9XCJvbkxlZnRBcnJvd0tleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJzY3JvbGxDaGlwc09uQXJyb3dQcmVzcygnbGVmdCcpXCI+XG4gICAgPGlneC1pY29uPm5hdmlnYXRlX2JlZm9yZTwvaWd4LWljb24+XG48L2J1dHRvbj5cblxuPGRpdiAjY29udGFpbmVyIGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctbWFpblwiPlxuICAgIDxkaXY+XG4gICAgICAgICA8aWd4LWNoaXBzLWFyZWEgI2NoaXBzQXJlYT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZXhwcmVzc2lvbnNMaXN0OyBpbmRleCBhcyBpOyBsZXQgbGFzdCA9IGxhc3Q7XCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgPGlneC1jaGlwICNjaGlwIGlkPVwiY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCJvbkNoaXBQb2ludGVyZG93bigkZXZlbnQsIGNoaXApXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2hpcENsaWNrKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkNoaXBLZXlEb3duKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAocmVtb3ZlKT1cIm9uQ2hpcFJlbW92ZWQoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cIml0ZW0uaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJkaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlneFByZWZpeFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiaW14LWljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIml0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24uaWNvbk5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tmaWx0ZXJpbmdTZXJ2aWNlLmdldENoaXBMYWJlbChpdGVtLmV4cHJlc3Npb24pfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9pZ3gtY2hpcD5cblxuICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwib3BlcmFuZFwiICpuZ0lmPVwiIWxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZ3hCdXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ0b2dnbGVPcGVyYXRvcnNEcm9wRG93bigkZXZlbnQsIGkpXCIgW2lneERyb3BEb3duSXRlbU5hdmlnYXRpb25dPVwib3BlcmF0b3JzXCIgW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24+ZXhwYW5kX21vcmU8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tmaWx0ZXJpbmdTZXJ2aWNlLmdldE9wZXJhdG9yQXNTdHJpbmcoaXRlbS5hZnRlck9wZXJhdG9yKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1kcm9wLWRvd24gW2Rpc3BsYXlEZW5zaXR5XT1cImNvbHVtbi5ncmlkLmRpc3BsYXlEZW5zaXR5XCIgI29wZXJhdG9ycyAoc2VsZWN0aW9uQ2hhbmdpbmcpPVwib25Mb2dpY09wZXJhdG9yQ2hhbmdlZCgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1kcm9wLWRvd24taXRlbSBbdmFsdWVdPVwiMFwiIFtzZWxlY3RlZF09XCJpdGVtLmFmdGVyT3BlcmF0b3IgPT09IDBcIj57e2ZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX29wZXJhdG9yX2FuZH19PC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1kcm9wLWRvd24taXRlbSBbdmFsdWVdPVwiMVwiIFtzZWxlY3RlZF09XCJpdGVtLmFmdGVyT3BlcmF0b3IgPT09IDFcIj57e2ZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX29wZXJhdG9yX29yfX08L2lneC1kcm9wLWRvd24taXRlbT5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtZHJvcC1kb3duPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2lneC1jaGlwcy1hcmVhPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxidXR0b24gaWd4QnV0dG9uPVwiaWNvblwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImlneC1ncmlkX19maWx0ZXJpbmctcm93LXNjcm9sbC1lbmRcIiAqbmdJZj1cInNob3dBcnJvd3NcIiAoY2xpY2spPVwic2Nyb2xsQ2hpcHNPbkFycm93UHJlc3MoJ3JpZ2h0JylcIj5cbiAgICA8aWd4LWljb24+bmF2aWdhdGVfbmV4dDwvaWd4LWljb24+XG48L2J1dHRvbj5cblxuPGRpdiAjYnV0dG9uc0NvbnRhaW5lciBbbmdDbGFzc109XCJpc05hcnJvd1dpZHRoID8gJ2lneC1ncmlkX19maWx0ZXJpbmctcm93LWVkaXRpbmctYnV0dG9ucy0tc21hbGwnIDogJ2lneC1ncmlkX19maWx0ZXJpbmctcm93LWVkaXRpbmctYnV0dG9ucydcIj5cbiAgICA8YnV0dG9uIFtkaXNwbGF5RGVuc2l0eV09XCJkaXNwbGF5RGVuc2l0eVwiIFtpZ3hCdXR0b25dPVwiaXNOYXJyb3dXaWR0aCA/ICdpY29uJyA6ICdmbGF0J1wiIHR5cGU9XCJidXR0b25cIiBpZ3hSaXBwbGUgKGNsaWNrKT1cImNsZWFyRmlsdGVyaW5nKClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbdGFiaW5kZXhdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgPGlneC1pY29uPnJlZnJlc2g8L2lneC1pY29uPlxuICAgICAgICA8c3Bhbj57e2lzTmFycm93V2lkdGggPyAnJyA6IGZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX3Jvd19yZXNldH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gI2Nsb3NlQnV0dG9uIFtkaXNwbGF5RGVuc2l0eV09XCJkaXNwbGF5RGVuc2l0eVwiIFtpZ3hCdXR0b25dPVwiaXNOYXJyb3dXaWR0aCA/ICdpY29uJyA6ICdmbGF0J1wiIHR5cGU9XCJidXR0b25cIiBpZ3hSaXBwbGUgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgPGlneC1pY29uPmNsb3NlPC9pZ3gtaWNvbj5cbiAgICAgICAgPHNwYW4+e3tpc05hcnJvd1dpZHRoID8gJycgOiBmaWx0ZXJpbmdTZXJ2aWNlLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2ZpbHRlcl9yb3dfY2xvc2V9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbjwvZGl2PlxuIl19
|