igniteui-angular 18.2.0-beta.0 → 18.2.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/badge/badge.component.mjs +19 -3
- package/esm2022/lib/core/i18n/query-builder-resources.mjs +4 -3
- package/esm2022/lib/data-operations/filtering-expression.interface.mjs +1 -1
- package/esm2022/lib/data-operations/filtering-expressions-tree.mjs +1 -1
- package/esm2022/lib/grids/filtering/base/grid-filtering-cell.component.mjs +2 -2
- package/esm2022/lib/grids/grid/groupby-row.component.mjs +2 -2
- package/esm2022/lib/grids/grouping/grid-group-by-area.component.mjs +3 -3
- package/esm2022/lib/grids/grouping/tree-grid-group-by-area.component.mjs +3 -3
- package/esm2022/lib/grids/pivot-grid/pivot-header-row.component.mjs +2 -2
- package/esm2022/lib/grids/selection/selection.service.mjs +9 -9
- package/esm2022/lib/icon/icon.references.mjs +6 -10
- package/esm2022/lib/query-builder/query-builder-header.component.mjs +3 -3
- package/esm2022/lib/query-builder/query-builder-tree.component.mjs +3 -3
- package/esm2022/lib/tabs/tabs/tabs.component.mjs +4 -3
- package/fesm2022/igniteui-angular.mjs +46 -33
- package/fesm2022/igniteui-angular.mjs.map +1 -1
- package/lib/badge/badge.component.d.ts +12 -1
- package/lib/core/i18n/query-builder-resources.d.ts +1 -0
- package/lib/core/styles/components/badge/_badge-component.scss +4 -0
- package/lib/core/styles/components/badge/_badge-theme.scss +6 -12
- package/lib/core/styles/components/banner/_banner-theme.scss +5 -1
- package/lib/core/styles/components/card/_card-theme.scss +18 -1
- package/lib/core/styles/components/chip/_chip-theme.scss +180 -154
- package/lib/core/styles/components/drop-down/_drop-down-theme.scss +5 -1
- package/lib/core/styles/components/navdrawer/_navdrawer-theme.scss +9 -7
- package/lib/core/styles/components/query-builder/_query-builder-component.scss +4 -0
- package/lib/core/styles/components/query-builder/_query-builder-theme.scss +39 -38
- package/lib/core/styles/components/tabs/_tabs-theme.scss +72 -18
- package/lib/core/styles/components/tree/_tree-theme.scss +1 -3
- package/lib/core/styles/typography/_indigo.scss +3 -1
- package/lib/data-operations/filtering-expression.interface.d.ts +2 -4
- package/lib/data-operations/filtering-expressions-tree.d.ts +24 -2
- package/migrations/common/ServerHost.d.ts +3 -1
- package/migrations/common/ServerHost.js +4 -1
- package/migrations/common/UpdateChanges.d.ts +7 -2
- package/migrations/common/UpdateChanges.js +39 -29
- package/migrations/common/project-service-container.d.ts +11 -0
- package/migrations/common/project-service-container.js +25 -0
- package/migrations/update-13_0_0/changes/members.json +1 -1
- package/migrations/update-18_2_0/changes/inputs.json +14 -0
- package/migrations/update-18_2_0/changes/theme-changes.json +6 -0
- package/migrations/update-18_2_0/index.js +36 -0
- package/package.json +2 -2
- package/styles/igniteui-angular-dark.css +1 -1
- package/styles/igniteui-angular.css +1 -1
- package/styles/igniteui-bootstrap-dark.css +1 -1
- package/styles/igniteui-bootstrap-light.css +1 -1
- package/styles/igniteui-dark-green.css +1 -1
- package/styles/igniteui-fluent-dark-excel.css +1 -1
- package/styles/igniteui-fluent-dark-word.css +1 -1
- package/styles/igniteui-fluent-dark.css +1 -1
- package/styles/igniteui-fluent-light-excel.css +1 -1
- package/styles/igniteui-fluent-light-word.css +1 -1
- package/styles/igniteui-fluent-light.css +1 -1
- package/styles/igniteui-indigo-dark.css +1 -1
- package/styles/igniteui-indigo-light.css +1 -1
- package/styles/maps/igniteui-angular-dark.css.map +1 -1
- package/styles/maps/igniteui-angular.css.map +1 -1
- package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
- package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
- package/styles/maps/igniteui-dark-green.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark.css.map +1 -1
- package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
- package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
- package/styles/maps/igniteui-fluent-light.css.map +1 -1
- package/styles/maps/igniteui-indigo-dark.css.map +1 -1
- package/styles/maps/igniteui-indigo-light.css.map +1 -1
|
@@ -1228,7 +1228,7 @@ export class IgxQueryBuilderTreeComponent {
|
|
|
1228
1228
|
this.currentGroup = this.rootGroup;
|
|
1229
1229
|
}
|
|
1230
1230
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: IgxQueryBuilderTreeComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.PlatformUtil }, { token: i0.ElementRef }, { token: i0.ElementRef }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1231
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.4", type: IgxQueryBuilderTreeComponent, isStandalone: true, selector: "igx-query-builder-tree", inputs: { entities: "entities", queryBuilder: "queryBuilder", searchValueTemplate: "searchValueTemplate", parentExpression: "parentExpression", fields: "fields", expressionTree: "expressionTree", locale: "locale", resourceStrings: "resourceStrings" }, outputs: { expressionTreeChange: "expressionTreeChange", inEditModeChange: "inEditModeChange" }, host: { properties: { "class": "this.getClass" }, classAttribute: "igx-query-builder-tree" }, queries: [{ propertyName: "headerContent", first: true, predicate: IgxQueryBuilderHeaderComponent, descendants: true }], viewQueries: [{ propertyName: "entitySelect", first: true, predicate: ["entitySelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "selectedReturnFieldsCombo", first: true, predicate: ["selectedReturnFieldsCombo"], descendants: true, read: IgxComboComponent }, { propertyName: "fieldSelect", first: true, predicate: ["fieldSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "conditionSelect", first: true, predicate: ["conditionSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "searchValueInput", first: true, predicate: ["searchValueInput"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "addRootAndGroupButton", first: true, predicate: ["addRootAndGroupButton"], descendants: true, read: ElementRef }, { propertyName: "addConditionButton", first: true, predicate: ["addConditionButton"], descendants: true, read: ElementRef }, { propertyName: "entityChangeDialog", first: true, predicate: ["entityChangeDialog"], descendants: true, read: IgxDialogComponent }, { propertyName: "editingInputsContainer", first: true, predicate: ["editingInputsContainer"], descendants: true, read: ElementRef }, { propertyName: "addModeContainer", first: true, predicate: ["addModeContainer"], descendants: true, read: ElementRef }, { propertyName: "currentGroupButtonsContainer", first: true, predicate: ["currentGroupButtonsContainer"], descendants: true, read: ElementRef }, { propertyName: "contextMenuToggle", first: true, predicate: IgxToggleDirective, descendants: true }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true }, { propertyName: "overlayOutlet", first: true, predicate: ["overlayOutlet"], descendants: true, read: IgxOverlayOutletDirective, static: true }, { propertyName: "chips", predicate: IgxChipComponent, descendants: true }, { propertyName: "innerQueries", predicate: IgxQueryBuilderTreeComponent, descendants: true }], ngImport: i0, template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <div class=\"igx-query-builder__root\">\n <div class=\"igx-query-builder__root-actions\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n (click)=\"addAndGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"addOrGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </div>\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #operandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n #target=\"tooltipTarget\"\n [igxTooltipTarget]=\"tooltipRef\"\n [data]=\"expressionItem\"\n [removable]=\"isInEditMode() ? 'true' : 'false'\"\n [selected]=\"expressionItem.selected && isInEditMode()\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"isInEditMode() ? onChipClick(expressionItem) : null\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">\n {{expressionItem.fieldLabel || expressionItem.expression.fieldName}}\n </span>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n <ng-container *ngIf=\"expressionItem.expression.searchTree\">\n <strong>{{expressionItem.expression.searchTree.entity}}</strong> / {{formatReturnFields(expressionItem.expression.searchTree)}}\n </ng-container>\n\n <ng-container *ngIf=\"!expressionItem.expression.searchTree\">\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </ng-container>\n </span>\n </igx-chip>\n <div #tooltipRef=\"tooltip\" igxTooltip>\n {{\n expressionItem.expression.searchTree ?\n expressionItem.expression.searchTree.returnFields :\n expressionItem.expression.condition.isUnary ?\n getConditionFriendlyName(expressionItem.expression.condition.name) :\n expressionItem.expression.searchVal\n }}\n </div>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <span tabindex=\"-1\">\n <igx-icon\n tabindex=\"0\"\n family=\"default\"\n name=\"edit\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n </igx-icon>\n </span>\n <span tabindex=\"-1\">\n <igx-icon\n tabindex=\"0\"\n family=\"default\"\n name=\"add\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n </igx-icon>\n </span>\n </div>\n <div igxButton class=\"igx-filter-tree__details-button\" *ngIf=\"!expressionItem.inEditMode && expressionItem.expression.searchTree\"\n (click)=\"expanderClick($event, expressionItem)\">\n <span>{{this.resourceStrings.igx_query_builder_details}}</span>\n <igx-icon *ngIf=\"!expressionItem.expanded\" family=\"default\" name=\"unfold_less\" role=\"button\"></igx-icon>\n <igx-icon *ngIf=\"expressionItem.expanded\" family=\"default\" name=\"unfold_more\" role=\"button\"></igx-icon>\n </div>\n\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [(ngModel)]=\"selectedField\"\n [disabled]=\"!fields\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_column_placeholder}}</label>\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_condition_placeholder}}</label>\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <ng-container\n *ngTemplateOutlet=\"\n searchValueTemplate ? searchValueTemplate : defaultSearchValueTemplate;\n context: getSearchValueTemplateContext(defaultSearchValueTemplate)\n \"\n >\n </ng-container>\n\n <ng-template #defaultSearchValueTemplate>\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_value_placeholder}}</label>\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [(ngModel)]=\"searchValue.value\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue.value\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n\n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue.value\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <label igxLabel>{{this.resourceStrings.igx_query_builder_time_placeholder}}</label>\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n\n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_date_placeholder}}</label>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue.value\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n </ng-template>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"flat\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon family=\"default\" name=\"confirm\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandEdit()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"(!expressionItem.inEditMode && expressionItem.expression.searchTree) || (expressionItem.inEditMode && (selectedCondition === 'in' || selectedCondition === 'notIn'))\">\n <igx-query-builder-tree\n [style.display]=\"expressionItem.inEditMode || expressionItem.expanded ? 'block' : 'none'\"\n [entities]=\"entities\"\n [queryBuilder]=\"this.queryBuilder\"\n [parentExpression]=\"expressionItem\"\n [expressionTree]=\"expressionItem.expression.searchTree\"\n (inEditModeChange)=\"onInEditModeChanged($event)\"\n [searchValueTemplate]=\"searchValueTemplate\">\n </igx-query-builder-tree>\n </ng-container>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandAdd()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionGroupTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem?.operator === 0,\n 'igx-filter-tree__line--or': expressionItem?.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem?.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <div class=\"igx-filter-tree__inputs\" [style.display]=\"(isInEditMode() && this.entities.length > 0 && this.entities[0].name) ? 'flex' : 'none'\">\n <ng-container *ngIf=\"!expressionItem.parent\">\n <igx-select #entitySelect\n type=\"box\"\n (selectionChanging)=\"onEntitySelectChanging($event)\"\n [overlaySettings]=\"entitySelectOverlaySettings\"\n [ngModel]=\"selectedEntity\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_entity }}</label>\n <igx-select-item *ngFor=\"let entity of entities\" [value]=\"entity\">\n {{entity.name}}\n </igx-select-item>\n </igx-select>\n\n <igx-combo\n #selectedReturnFieldsCombo\n [itemsMaxHeight]=\"250\"\n [data]=\"fields\"\n [displayKey]=\"'field'\"\n [valueKey]=\"'field'\"\n [disabled]=\"!selectedEntity\"\n [(ngModel)]=\"selectedReturnFields\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n searchPlaceholder=\"{{ this.resourceStrings.igx_query_builder_search }}\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <ng-template igxComboHeader>\n <div\n class=\"igx-drop-down__item igx-drop-down__item--query-builder\"\n (click)=\"onSelectAllClicked($event)\"\n [ngClass]=\"{'igx-drop-down__item--selected': this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length}\"\n >\n <igx-checkbox\n [checked]=\"this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length\"\n [indeterminate]=\"this.selectedEntity && this.selectedReturnFields && this.selectedReturnFields.length > 0 && this.selectedReturnFields.length < this.selectedEntity.fields?.length\"\n [readonly]=\"true\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\"\n class=\"igx-combo__checkbox\">\n </igx-checkbox>\n <div class=\"igx-drop-down__inner\">\n {{ this.resourceStrings.igx_query_builder_select_all }}\n </div>\n </div>\n </ng-template>\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_return_fields }}</label>\n </igx-combo>\n </ng-container>\n </div>\n\n <ng-container *ngFor=\"let expr of expressionItem?.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionGroupTemplate\n : operandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem && isInEditMode()\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionGroupTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n >\n <button type=\"button\"\n igxIconButton=\"flat\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"default\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon family=\"default\" name=\"delete\"></igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n\n<igx-dialog\n #entityChangeDialog\n title=\"{{ this.resourceStrings.igx_query_builder_dialog_title }}\"\n leftButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_cancel }}\"\n rightButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_confirm }}\"\n (leftButtonSelect)=\"onEntityChangeCancel()\"\n (rightButtonSelect)=\"onEntityChangeConfirm()\">\n <section class=\"igx-query-builder-dialog\">\n <p>{{ this.resourceStrings.igx_query_builder_dialog_message }}</p>\n <igx-checkbox\n (change)=\"onShowEntityChangeDialogChange($event)\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\">\n {{ this.resourceStrings.igx_query_builder_dialog_checkbox_text }}\n </igx-checkbox>\n </section>\n</igx-dialog>\n", dependencies: [{ kind: "component", type: IgxQueryBuilderTreeComponent, selector: "igx-query-builder-tree", inputs: ["entities", "queryBuilder", "searchValueTemplate", "parentExpression", "fields", "expressionTree", "locale", "resourceStrings"], outputs: ["expressionTreeChange", "inEditModeChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxChipComponent, selector: "igx-chip", inputs: ["variant", "id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "class", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "component", type: 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: IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: 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: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "component", type: IgxButtonGroupComponent, selector: "igx-buttongroup", inputs: ["id", "itemContentCssClass", "multiSelection", "selectionMode", "values", "disabled", "alignment"], outputs: ["selected", "deselected"] }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: IgxFieldFormatterPipe, name: "fieldFormatter" }, { kind: "directive", type: IgxIconButtonDirective, selector: "[igxIconButton]", inputs: ["igxIconButton"] }, { kind: "component", type: IgxComboComponent, selector: "igx-combo", inputs: ["autoFocusSearch", "filterable", "searchPlaceholder"], outputs: ["selectionChanging"] }, { kind: "directive", type: IgxLabelDirective, selector: "[igxLabel]", inputs: ["id"] }, { kind: "directive", type: IgxComboHeaderDirective, selector: "[igxComboHeader]" }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "component", type: IgxDialogComponent, selector: "igx-dialog", inputs: ["id", "isModal", "closeOnEscape", "focusTrap", "title", "message", "leftButtonLabel", "leftButtonType", "leftButtonRipple", "rightButtonLabel", "rightButtonType", "rightButtonRipple", "closeOnOutsideSelect", "positionSettings", "isOpen", "role", "titleId"], outputs: ["opening", "opened", "closing", "closed", "leftButtonSelect", "rightButtonSelect", "isOpenChange"] }, { kind: "directive", type: IgxTooltipTargetDirective, selector: "[igxTooltipTarget]", inputs: ["showDelay", "hideDelay", "tooltipDisabled", "igxTooltipTarget", "tooltip"], outputs: ["tooltipShow", "tooltipHide"], exportAs: ["tooltipTarget"] }, { kind: "directive", type: IgxTooltipDirective, selector: "[igxTooltip]", inputs: ["context", "id"], exportAs: ["tooltip"] }] }); }
|
|
1231
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.4", type: IgxQueryBuilderTreeComponent, isStandalone: true, selector: "igx-query-builder-tree", inputs: { entities: "entities", queryBuilder: "queryBuilder", searchValueTemplate: "searchValueTemplate", parentExpression: "parentExpression", fields: "fields", expressionTree: "expressionTree", locale: "locale", resourceStrings: "resourceStrings" }, outputs: { expressionTreeChange: "expressionTreeChange", inEditModeChange: "inEditModeChange" }, host: { properties: { "class": "this.getClass" }, classAttribute: "igx-query-builder-tree" }, queries: [{ propertyName: "headerContent", first: true, predicate: IgxQueryBuilderHeaderComponent, descendants: true }], viewQueries: [{ propertyName: "entitySelect", first: true, predicate: ["entitySelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "selectedReturnFieldsCombo", first: true, predicate: ["selectedReturnFieldsCombo"], descendants: true, read: IgxComboComponent }, { propertyName: "fieldSelect", first: true, predicate: ["fieldSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "conditionSelect", first: true, predicate: ["conditionSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "searchValueInput", first: true, predicate: ["searchValueInput"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "addRootAndGroupButton", first: true, predicate: ["addRootAndGroupButton"], descendants: true, read: ElementRef }, { propertyName: "addConditionButton", first: true, predicate: ["addConditionButton"], descendants: true, read: ElementRef }, { propertyName: "entityChangeDialog", first: true, predicate: ["entityChangeDialog"], descendants: true, read: IgxDialogComponent }, { propertyName: "editingInputsContainer", first: true, predicate: ["editingInputsContainer"], descendants: true, read: ElementRef }, { propertyName: "addModeContainer", first: true, predicate: ["addModeContainer"], descendants: true, read: ElementRef }, { propertyName: "currentGroupButtonsContainer", first: true, predicate: ["currentGroupButtonsContainer"], descendants: true, read: ElementRef }, { propertyName: "contextMenuToggle", first: true, predicate: IgxToggleDirective, descendants: true }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true }, { propertyName: "overlayOutlet", first: true, predicate: ["overlayOutlet"], descendants: true, read: IgxOverlayOutletDirective, static: true }, { propertyName: "chips", predicate: IgxChipComponent, descendants: true }, { propertyName: "innerQueries", predicate: IgxQueryBuilderTreeComponent, descendants: true }], ngImport: i0, template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <div class=\"igx-query-builder__root\">\n <div class=\"igx-query-builder__root-actions\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n (click)=\"addAndGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"addOrGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </div>\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #operandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n #target=\"tooltipTarget\"\n [igxTooltipTarget]=\"tooltipRef\"\n [data]=\"expressionItem\"\n [removable]=\"isInEditMode() ? 'true' : 'false'\"\n [selected]=\"expressionItem.selected && isInEditMode()\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"isInEditMode() ? onChipClick(expressionItem) : null\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">\n {{expressionItem.fieldLabel || expressionItem.expression.fieldName}}\n </span>\n <span igxPrefix class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span *ngIf=\"!expressionItem.expression.condition.isUnary\">\n <ng-container *ngIf=\"expressionItem.expression.searchTree\">\n <strong>{{expressionItem.expression.searchTree.entity}}</strong> / {{formatReturnFields(expressionItem.expression.searchTree)}}\n </ng-container>\n\n <ng-container *ngIf=\"!expressionItem.expression.searchTree\">\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </ng-container>\n </span>\n </igx-chip>\n <div #tooltipRef=\"tooltip\" igxTooltip>\n {{\n expressionItem.expression.searchTree ?\n expressionItem.expression.searchTree.returnFields.join(', ') :\n expressionItem.expression.condition.isUnary ?\n getConditionFriendlyName(expressionItem.expression.condition.name) :\n expressionItem.expression.searchVal\n }}\n </div>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <button\n igxIconButton=\"flat\"\n aria-labelledby=\"edit-expression\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\">\n <igx-icon id=\"edit-expression\">edit</igx-icon>\n </button>\n <button\n igxIconButton=\"flat\"\n aria-labelledby=\"add-expression\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n <igx-icon id=\"add-expression\">add</igx-icon>\n </button>\n </div>\n <div *ngIf=\"!expressionItem.inEditMode && expressionItem.expression.searchTree\"\n igxButton\n class=\"igx-filter-tree__details-button\"\n (click)=\"expanderClick($event, expressionItem)\"\n (keydown)=\"invokeClick($event)\"\n tabindex=\"0\">\n <span>{{this.resourceStrings.igx_query_builder_details}}</span>\n <igx-icon *ngIf=\"expressionItem.expanded\" family=\"default\" name=\"unfold_less\" role=\"button\"></igx-icon>\n <igx-icon *ngIf=\"!expressionItem.expanded\" family=\"default\" name=\"unfold_more\" role=\"button\"></igx-icon>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [(ngModel)]=\"selectedField\"\n [disabled]=\"!fields\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_column_placeholder}}</label>\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_condition_placeholder}}</label>\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <ng-container\n *ngTemplateOutlet=\"\n searchValueTemplate ? searchValueTemplate : defaultSearchValueTemplate;\n context: getSearchValueTemplateContext(defaultSearchValueTemplate)\n \"\n >\n </ng-container>\n\n <ng-template #defaultSearchValueTemplate>\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_value_placeholder}}</label>\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [(ngModel)]=\"searchValue.value\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue.value\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_date_placeholder}}</label>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n\n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue.value\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <label igxLabel>{{this.resourceStrings.igx_query_builder_time_placeholder}}</label>\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n\n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_datetime_placeholder}}</label>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue.value\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n </ng-template>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"flat\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon family=\"default\" name=\"confirm\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandEdit()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"(!expressionItem.inEditMode && expressionItem.expression.searchTree) || (expressionItem.inEditMode && (selectedCondition === 'in' || selectedCondition === 'notIn'))\">\n <igx-query-builder-tree\n [style.display]=\"expressionItem.inEditMode || expressionItem.expanded ? 'block' : 'none'\"\n [entities]=\"entities\"\n [queryBuilder]=\"this.queryBuilder\"\n [parentExpression]=\"expressionItem\"\n [expressionTree]=\"expressionItem.expression.searchTree\"\n (inEditModeChange)=\"onInEditModeChanged($event)\"\n [searchValueTemplate]=\"searchValueTemplate\">\n </igx-query-builder-tree>\n </ng-container>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandAdd()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionGroupTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem?.operator === 0,\n 'igx-filter-tree__line--or': expressionItem?.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem?.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <div class=\"igx-filter-tree__inputs\" [style.display]=\"(isInEditMode() && this.entities.length > 0 && this.entities[0].name) ? 'flex' : 'none'\">\n <ng-container *ngIf=\"!expressionItem.parent\">\n <igx-select #entitySelect\n type=\"box\"\n (selectionChanging)=\"onEntitySelectChanging($event)\"\n [overlaySettings]=\"entitySelectOverlaySettings\"\n [ngModel]=\"selectedEntity\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_entity }}</label>\n <igx-select-item *ngFor=\"let entity of entities\" [value]=\"entity\">\n {{entity.name}}\n </igx-select-item>\n </igx-select>\n\n <igx-combo\n #selectedReturnFieldsCombo\n [itemsMaxHeight]=\"250\"\n [data]=\"fields\"\n [displayKey]=\"'field'\"\n [valueKey]=\"'field'\"\n [disabled]=\"!selectedEntity\"\n [(ngModel)]=\"selectedReturnFields\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n searchPlaceholder=\"{{ this.resourceStrings.igx_query_builder_search }}\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <ng-template igxComboHeader>\n <div\n class=\"igx-drop-down__item igx-drop-down__item--query-builder\"\n (click)=\"onSelectAllClicked($event)\"\n [ngClass]=\"{'igx-drop-down__item--selected': this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length}\"\n >\n <igx-checkbox\n [checked]=\"this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length\"\n [indeterminate]=\"this.selectedEntity && this.selectedReturnFields && this.selectedReturnFields.length > 0 && this.selectedReturnFields.length < this.selectedEntity.fields?.length\"\n [readonly]=\"true\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\"\n class=\"igx-combo__checkbox\">\n </igx-checkbox>\n <div class=\"igx-drop-down__inner\">\n {{ this.resourceStrings.igx_query_builder_select_all }}\n </div>\n </div>\n </ng-template>\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_return_fields }}</label>\n </igx-combo>\n </ng-container>\n </div>\n\n <ng-container *ngFor=\"let expr of expressionItem?.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionGroupTemplate\n : operandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem && isInEditMode()\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionGroupTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n >\n <button type=\"button\"\n igxIconButton=\"flat\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"default\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon family=\"default\" name=\"delete\"></igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n\n<igx-dialog\n #entityChangeDialog\n title=\"{{ this.resourceStrings.igx_query_builder_dialog_title }}\"\n leftButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_cancel }}\"\n rightButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_confirm }}\"\n (leftButtonSelect)=\"onEntityChangeCancel()\"\n (rightButtonSelect)=\"onEntityChangeConfirm()\">\n <section class=\"igx-query-builder-dialog\">\n <p>{{ this.resourceStrings.igx_query_builder_dialog_message }}</p>\n <igx-checkbox\n (change)=\"onShowEntityChangeDialogChange($event)\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\">\n {{ this.resourceStrings.igx_query_builder_dialog_checkbox_text }}\n </igx-checkbox>\n </section>\n</igx-dialog>\n", dependencies: [{ kind: "component", type: IgxQueryBuilderTreeComponent, selector: "igx-query-builder-tree", inputs: ["entities", "queryBuilder", "searchValueTemplate", "parentExpression", "fields", "expressionTree", "locale", "resourceStrings"], outputs: ["expressionTreeChange", "inEditModeChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxChipComponent, selector: "igx-chip", inputs: ["variant", "id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "class", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "component", type: 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: IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: 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: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "component", type: IgxButtonGroupComponent, selector: "igx-buttongroup", inputs: ["id", "itemContentCssClass", "multiSelection", "selectionMode", "values", "disabled", "alignment"], outputs: ["selected", "deselected"] }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: IgxFieldFormatterPipe, name: "fieldFormatter" }, { kind: "directive", type: IgxIconButtonDirective, selector: "[igxIconButton]", inputs: ["igxIconButton"] }, { kind: "component", type: IgxComboComponent, selector: "igx-combo", inputs: ["autoFocusSearch", "filterable", "searchPlaceholder"], outputs: ["selectionChanging"] }, { kind: "directive", type: IgxLabelDirective, selector: "[igxLabel]", inputs: ["id"] }, { kind: "directive", type: IgxComboHeaderDirective, selector: "[igxComboHeader]" }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "component", type: IgxDialogComponent, selector: "igx-dialog", inputs: ["id", "isModal", "closeOnEscape", "focusTrap", "title", "message", "leftButtonLabel", "leftButtonType", "leftButtonRipple", "rightButtonLabel", "rightButtonType", "rightButtonRipple", "closeOnOutsideSelect", "positionSettings", "isOpen", "role", "titleId"], outputs: ["opening", "opened", "closing", "closed", "leftButtonSelect", "rightButtonSelect", "isOpenChange"] }, { kind: "directive", type: IgxTooltipTargetDirective, selector: "[igxTooltipTarget]", inputs: ["showDelay", "hideDelay", "tooltipDisabled", "igxTooltipTarget", "tooltip"], outputs: ["tooltipShow", "tooltipHide"], exportAs: ["tooltipTarget"] }, { kind: "directive", type: IgxTooltipDirective, selector: "[igxTooltip]", inputs: ["context", "id"], exportAs: ["tooltip"] }] }); }
|
|
1232
1232
|
}
|
|
1233
1233
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: IgxQueryBuilderTreeComponent, decorators: [{
|
|
1234
1234
|
type: Component,
|
|
@@ -1267,7 +1267,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImpor
|
|
|
1267
1267
|
IgxDialogComponent,
|
|
1268
1268
|
IgxTooltipTargetDirective,
|
|
1269
1269
|
IgxTooltipDirective
|
|
1270
|
-
], template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <div class=\"igx-query-builder__root\">\n <div class=\"igx-query-builder__root-actions\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n (click)=\"addAndGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"addOrGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </div>\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #operandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n #target=\"tooltipTarget\"\n [igxTooltipTarget]=\"tooltipRef\"\n [data]=\"expressionItem\"\n [removable]=\"isInEditMode() ? 'true' : 'false'\"\n [selected]=\"expressionItem.selected && isInEditMode()\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"isInEditMode() ? onChipClick(expressionItem) : null\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">\n {{expressionItem.fieldLabel || expressionItem.expression.fieldName}}\n </span>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n <ng-container *ngIf=\"expressionItem.expression.searchTree\">\n <strong>{{expressionItem.expression.searchTree.entity}}</strong> / {{formatReturnFields(expressionItem.expression.searchTree)}}\n </ng-container>\n\n <ng-container *ngIf=\"!expressionItem.expression.searchTree\">\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </ng-container>\n </span>\n </igx-chip>\n <div #tooltipRef=\"tooltip\" igxTooltip>\n {{\n expressionItem.expression.searchTree ?\n expressionItem.expression.searchTree.returnFields :\n expressionItem.expression.condition.isUnary ?\n getConditionFriendlyName(expressionItem.expression.condition.name) :\n expressionItem.expression.searchVal\n }}\n </div>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <span tabindex=\"-1\">\n <igx-icon\n tabindex=\"0\"\n family=\"default\"\n name=\"edit\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n </igx-icon>\n </span>\n <span tabindex=\"-1\">\n <igx-icon\n tabindex=\"0\"\n family=\"default\"\n name=\"add\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n </igx-icon>\n </span>\n </div>\n <div igxButton class=\"igx-filter-tree__details-button\" *ngIf=\"!expressionItem.inEditMode && expressionItem.expression.searchTree\"\n (click)=\"expanderClick($event, expressionItem)\">\n <span>{{this.resourceStrings.igx_query_builder_details}}</span>\n <igx-icon *ngIf=\"!expressionItem.expanded\" family=\"default\" name=\"unfold_less\" role=\"button\"></igx-icon>\n <igx-icon *ngIf=\"expressionItem.expanded\" family=\"default\" name=\"unfold_more\" role=\"button\"></igx-icon>\n </div>\n\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [(ngModel)]=\"selectedField\"\n [disabled]=\"!fields\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_column_placeholder}}</label>\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_condition_placeholder}}</label>\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <ng-container\n *ngTemplateOutlet=\"\n searchValueTemplate ? searchValueTemplate : defaultSearchValueTemplate;\n context: getSearchValueTemplateContext(defaultSearchValueTemplate)\n \"\n >\n </ng-container>\n\n <ng-template #defaultSearchValueTemplate>\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_value_placeholder}}</label>\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [(ngModel)]=\"searchValue.value\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue.value\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n\n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue.value\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <label igxLabel>{{this.resourceStrings.igx_query_builder_time_placeholder}}</label>\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n\n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_date_placeholder}}</label>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue.value\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n </ng-template>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"flat\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon family=\"default\" name=\"confirm\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandEdit()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"(!expressionItem.inEditMode && expressionItem.expression.searchTree) || (expressionItem.inEditMode && (selectedCondition === 'in' || selectedCondition === 'notIn'))\">\n <igx-query-builder-tree\n [style.display]=\"expressionItem.inEditMode || expressionItem.expanded ? 'block' : 'none'\"\n [entities]=\"entities\"\n [queryBuilder]=\"this.queryBuilder\"\n [parentExpression]=\"expressionItem\"\n [expressionTree]=\"expressionItem.expression.searchTree\"\n (inEditModeChange)=\"onInEditModeChanged($event)\"\n [searchValueTemplate]=\"searchValueTemplate\">\n </igx-query-builder-tree>\n </ng-container>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandAdd()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionGroupTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem?.operator === 0,\n 'igx-filter-tree__line--or': expressionItem?.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem?.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <div class=\"igx-filter-tree__inputs\" [style.display]=\"(isInEditMode() && this.entities.length > 0 && this.entities[0].name) ? 'flex' : 'none'\">\n <ng-container *ngIf=\"!expressionItem.parent\">\n <igx-select #entitySelect\n type=\"box\"\n (selectionChanging)=\"onEntitySelectChanging($event)\"\n [overlaySettings]=\"entitySelectOverlaySettings\"\n [ngModel]=\"selectedEntity\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_entity }}</label>\n <igx-select-item *ngFor=\"let entity of entities\" [value]=\"entity\">\n {{entity.name}}\n </igx-select-item>\n </igx-select>\n\n <igx-combo\n #selectedReturnFieldsCombo\n [itemsMaxHeight]=\"250\"\n [data]=\"fields\"\n [displayKey]=\"'field'\"\n [valueKey]=\"'field'\"\n [disabled]=\"!selectedEntity\"\n [(ngModel)]=\"selectedReturnFields\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n searchPlaceholder=\"{{ this.resourceStrings.igx_query_builder_search }}\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <ng-template igxComboHeader>\n <div\n class=\"igx-drop-down__item igx-drop-down__item--query-builder\"\n (click)=\"onSelectAllClicked($event)\"\n [ngClass]=\"{'igx-drop-down__item--selected': this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length}\"\n >\n <igx-checkbox\n [checked]=\"this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length\"\n [indeterminate]=\"this.selectedEntity && this.selectedReturnFields && this.selectedReturnFields.length > 0 && this.selectedReturnFields.length < this.selectedEntity.fields?.length\"\n [readonly]=\"true\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\"\n class=\"igx-combo__checkbox\">\n </igx-checkbox>\n <div class=\"igx-drop-down__inner\">\n {{ this.resourceStrings.igx_query_builder_select_all }}\n </div>\n </div>\n </ng-template>\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_return_fields }}</label>\n </igx-combo>\n </ng-container>\n </div>\n\n <ng-container *ngFor=\"let expr of expressionItem?.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionGroupTemplate\n : operandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem && isInEditMode()\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionGroupTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n >\n <button type=\"button\"\n igxIconButton=\"flat\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"default\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon family=\"default\" name=\"delete\"></igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n\n<igx-dialog\n #entityChangeDialog\n title=\"{{ this.resourceStrings.igx_query_builder_dialog_title }}\"\n leftButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_cancel }}\"\n rightButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_confirm }}\"\n (leftButtonSelect)=\"onEntityChangeCancel()\"\n (rightButtonSelect)=\"onEntityChangeConfirm()\">\n <section class=\"igx-query-builder-dialog\">\n <p>{{ this.resourceStrings.igx_query_builder_dialog_message }}</p>\n <igx-checkbox\n (change)=\"onShowEntityChangeDialogChange($event)\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\">\n {{ this.resourceStrings.igx_query_builder_dialog_checkbox_text }}\n </igx-checkbox>\n </section>\n</igx-dialog>\n" }]
|
|
1270
|
+
], template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <div class=\"igx-query-builder__root\">\n <div class=\"igx-query-builder__root-actions\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n (click)=\"addAndGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"addOrGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </div>\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #operandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n #target=\"tooltipTarget\"\n [igxTooltipTarget]=\"tooltipRef\"\n [data]=\"expressionItem\"\n [removable]=\"isInEditMode() ? 'true' : 'false'\"\n [selected]=\"expressionItem.selected && isInEditMode()\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"isInEditMode() ? onChipClick(expressionItem) : null\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">\n {{expressionItem.fieldLabel || expressionItem.expression.fieldName}}\n </span>\n <span igxPrefix class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span *ngIf=\"!expressionItem.expression.condition.isUnary\">\n <ng-container *ngIf=\"expressionItem.expression.searchTree\">\n <strong>{{expressionItem.expression.searchTree.entity}}</strong> / {{formatReturnFields(expressionItem.expression.searchTree)}}\n </ng-container>\n\n <ng-container *ngIf=\"!expressionItem.expression.searchTree\">\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </ng-container>\n </span>\n </igx-chip>\n <div #tooltipRef=\"tooltip\" igxTooltip>\n {{\n expressionItem.expression.searchTree ?\n expressionItem.expression.searchTree.returnFields.join(', ') :\n expressionItem.expression.condition.isUnary ?\n getConditionFriendlyName(expressionItem.expression.condition.name) :\n expressionItem.expression.searchVal\n }}\n </div>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <button\n igxIconButton=\"flat\"\n aria-labelledby=\"edit-expression\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\">\n <igx-icon id=\"edit-expression\">edit</igx-icon>\n </button>\n <button\n igxIconButton=\"flat\"\n aria-labelledby=\"add-expression\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n <igx-icon id=\"add-expression\">add</igx-icon>\n </button>\n </div>\n <div *ngIf=\"!expressionItem.inEditMode && expressionItem.expression.searchTree\"\n igxButton\n class=\"igx-filter-tree__details-button\"\n (click)=\"expanderClick($event, expressionItem)\"\n (keydown)=\"invokeClick($event)\"\n tabindex=\"0\">\n <span>{{this.resourceStrings.igx_query_builder_details}}</span>\n <igx-icon *ngIf=\"expressionItem.expanded\" family=\"default\" name=\"unfold_less\" role=\"button\"></igx-icon>\n <igx-icon *ngIf=\"!expressionItem.expanded\" family=\"default\" name=\"unfold_more\" role=\"button\"></igx-icon>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [(ngModel)]=\"selectedField\"\n [disabled]=\"!fields\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_column_placeholder}}</label>\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_condition_placeholder}}</label>\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <ng-container\n *ngTemplateOutlet=\"\n searchValueTemplate ? searchValueTemplate : defaultSearchValueTemplate;\n context: getSearchValueTemplateContext(defaultSearchValueTemplate)\n \"\n >\n </ng-container>\n\n <ng-template #defaultSearchValueTemplate>\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_value_placeholder}}</label>\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [(ngModel)]=\"searchValue.value\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue.value\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_date_placeholder}}</label>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n\n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue.value\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <label igxLabel>{{this.resourceStrings.igx_query_builder_time_placeholder}}</label>\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n\n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_datetime_placeholder}}</label>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue.value\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n </ng-template>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"flat\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon family=\"default\" name=\"confirm\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandEdit()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"(!expressionItem.inEditMode && expressionItem.expression.searchTree) || (expressionItem.inEditMode && (selectedCondition === 'in' || selectedCondition === 'notIn'))\">\n <igx-query-builder-tree\n [style.display]=\"expressionItem.inEditMode || expressionItem.expanded ? 'block' : 'none'\"\n [entities]=\"entities\"\n [queryBuilder]=\"this.queryBuilder\"\n [parentExpression]=\"expressionItem\"\n [expressionTree]=\"expressionItem.expression.searchTree\"\n (inEditModeChange)=\"onInEditModeChanged($event)\"\n [searchValueTemplate]=\"searchValueTemplate\">\n </igx-query-builder-tree>\n </ng-container>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandAdd()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionGroupTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem?.operator === 0,\n 'igx-filter-tree__line--or': expressionItem?.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem?.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <div class=\"igx-filter-tree__inputs\" [style.display]=\"(isInEditMode() && this.entities.length > 0 && this.entities[0].name) ? 'flex' : 'none'\">\n <ng-container *ngIf=\"!expressionItem.parent\">\n <igx-select #entitySelect\n type=\"box\"\n (selectionChanging)=\"onEntitySelectChanging($event)\"\n [overlaySettings]=\"entitySelectOverlaySettings\"\n [ngModel]=\"selectedEntity\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_entity }}</label>\n <igx-select-item *ngFor=\"let entity of entities\" [value]=\"entity\">\n {{entity.name}}\n </igx-select-item>\n </igx-select>\n\n <igx-combo\n #selectedReturnFieldsCombo\n [itemsMaxHeight]=\"250\"\n [data]=\"fields\"\n [displayKey]=\"'field'\"\n [valueKey]=\"'field'\"\n [disabled]=\"!selectedEntity\"\n [(ngModel)]=\"selectedReturnFields\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n searchPlaceholder=\"{{ this.resourceStrings.igx_query_builder_search }}\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <ng-template igxComboHeader>\n <div\n class=\"igx-drop-down__item igx-drop-down__item--query-builder\"\n (click)=\"onSelectAllClicked($event)\"\n [ngClass]=\"{'igx-drop-down__item--selected': this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length}\"\n >\n <igx-checkbox\n [checked]=\"this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length\"\n [indeterminate]=\"this.selectedEntity && this.selectedReturnFields && this.selectedReturnFields.length > 0 && this.selectedReturnFields.length < this.selectedEntity.fields?.length\"\n [readonly]=\"true\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\"\n class=\"igx-combo__checkbox\">\n </igx-checkbox>\n <div class=\"igx-drop-down__inner\">\n {{ this.resourceStrings.igx_query_builder_select_all }}\n </div>\n </div>\n </ng-template>\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_return_fields }}</label>\n </igx-combo>\n </ng-container>\n </div>\n\n <ng-container *ngFor=\"let expr of expressionItem?.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionGroupTemplate\n : operandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem && isInEditMode()\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionGroupTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n >\n <button type=\"button\"\n igxIconButton=\"flat\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"default\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon family=\"default\" name=\"delete\"></igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n\n<igx-dialog\n #entityChangeDialog\n title=\"{{ this.resourceStrings.igx_query_builder_dialog_title }}\"\n leftButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_cancel }}\"\n rightButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_confirm }}\"\n (leftButtonSelect)=\"onEntityChangeCancel()\"\n (rightButtonSelect)=\"onEntityChangeConfirm()\">\n <section class=\"igx-query-builder-dialog\">\n <p>{{ this.resourceStrings.igx_query_builder_dialog_message }}</p>\n <igx-checkbox\n (change)=\"onShowEntityChangeDialogChange($event)\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\">\n {{ this.resourceStrings.igx_query_builder_dialog_checkbox_text }}\n </igx-checkbox>\n </section>\n</igx-dialog>\n" }]
|
|
1271
1271
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.PlatformUtil }, { type: i0.ElementRef }, { type: i0.ElementRef }, { type: undefined, decorators: [{
|
|
1272
1272
|
type: Inject,
|
|
1273
1273
|
args: [LOCALE_ID]
|
|
@@ -1349,4 +1349,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImpor
|
|
|
1349
1349
|
type: ViewChildren,
|
|
1350
1350
|
args: [IgxQueryBuilderTreeComponent]
|
|
1351
1351
|
}] } });
|
|
1352
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9xdWVyeS1idWlsZGVyL3F1ZXJ5LWJ1aWxkZXItdHJlZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvcXVlcnktYnVpbGRlci9xdWVyeS1idWlsZGVyLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFlBQVksRUFDWixZQUFZLEVBQ1osU0FBUyxFQUNULE1BQU0sRUFDTixJQUFJLEVBR1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFxQixZQUFZLEVBQWEsVUFBVSxFQUFhLFdBQVcsRUFDOUcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUF5Qix1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBZ0MsNkJBQTZCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVuSCxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSx5QkFBeUIsRUFBRSx5QkFBeUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3pOLE9BQU8sRUFBRSxjQUFjLEVBQXdCLE1BQU0sbURBQW1ELENBQUM7QUFDekcsT0FBTyxFQUFFLHdCQUF3QixFQUE4QyxNQUFNLCtDQUErQyxDQUFDO0FBQ3JJLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBRXZHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRWhJLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBbUIsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0csT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekksT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDeEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUQsT0FBTyxFQUE0QixvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7O0FBSTNGLE1BQU0sd0JBQXdCLEdBQUcsWUFBWSxDQUFDO0FBQzlDLE1BQU0sd0JBQXdCLEdBQUcsWUFBWSxDQUFDO0FBQzlDLE1BQU0sNkJBQTZCLEdBQUcsUUFBUSxDQUFDO0FBQy9DLE1BQU0sd0JBQXdCLEdBQUcsT0FBTyxDQUFDO0FBQ3pDLE1BQU0sd0JBQXdCLEdBQUcsdUJBQXVCLENBQUM7QUFDekQsTUFBTSxtQkFBbUIsR0FBRyxZQUFZLENBQUM7QUFNekMsTUFBTSxPQUFPLHFCQUFxQjtJQUV2QixTQUFTLENBQUMsS0FBVSxFQUFFLFNBQXNELEVBQUUsT0FBWSxFQUFFLFNBQWU7UUFDOUcsT0FBTyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRCxDQUFDOzhHQUpRLHFCQUFxQjs0R0FBckIscUJBQXFCOzsyRkFBckIscUJBQXFCO2tCQUpqQyxJQUFJO21CQUFDO29CQUNGLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLFVBQVUsRUFBRSxJQUFJO2lCQUNuQjs7QUFRRDs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjO0lBSWhCLFlBQVksTUFBNEI7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDekIsQ0FBQztDQUNKO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsY0FBYztJQUc1QyxZQUFZLFFBQXdCLEVBQUUsTUFBNEI7UUFDOUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztDQUNKO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0scUJBQXNCLFNBQVEsY0FBYztJQU05QyxZQUFZLFVBQWdDLEVBQUUsTUFBMkI7UUFDckUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDakMsQ0FBQztDQUNKO0FBNENELE1BQU0sT0FBTyw0QkFBNEI7SUFDckM7O09BRUc7SUFDSCxJQUFpQyxRQUFRO1FBQ3JDLE9BQU8saUNBQWlDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBV0QsSUFDVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQVcsZ0JBQWdCLENBQUMsS0FBNEI7UUFDcEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O01BRUU7SUFDRixJQUFXLE1BQU07UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDM0MsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUNXLE1BQU0sQ0FBQyxNQUFtQjtRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUV0QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDM0MsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztNQUVFO0lBQ0YsSUFBVyxjQUFjO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUNXLGNBQWMsQ0FBQyxjQUErQjtRQUNyRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUMxRSxJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztZQUN0QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2dCQUM1QixJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1lBQ3BDLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsTUFBTSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQztZQUNELHVCQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNsQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQ1csZUFBZSxDQUFDLEtBQW1DO1FBQzFELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxlQUFlO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFnREQsSUFDYyxzQkFBc0IsQ0FBQyxLQUFpQjtRQUNsRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQ3hDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxLQUFLLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ2hILHFCQUFxQixDQUFDLEdBQUcsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNwRCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxjQUFjO0lBQ2QsSUFBYyxzQkFBc0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQ2MsZ0JBQWdCLENBQUMsS0FBaUI7UUFDNUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNsQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNwRyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBRUQsY0FBYztJQUNkLElBQWMsZ0JBQWdCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUNjLDRCQUE0QixDQUFDLEtBQWlCO1FBQ3hELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUM7WUFDOUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLDZCQUE2QixJQUFJLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxhQUFhLEtBQUssS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDNUgscUJBQXFCLENBQUMsR0FBRyxFQUFFO2dCQUN2QixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELElBQUksQ0FBQyw2QkFBNkIsR0FBRyxLQUFLLENBQUM7SUFDL0MsQ0FBQztJQUVELGNBQWM7SUFDZCxJQUFjLDRCQUE0QjtRQUN0QyxPQUFPLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztJQUM5QyxDQUFDO0lBbUhELElBQVcsS0FBSztRQUNaLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztRQUNwRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixPQUFPLE1BQU0sRUFBRSxDQUFDO1lBQ1osSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLHdCQUF3QixFQUFFLENBQUM7Z0JBQ2hELE1BQU0sRUFBRSxDQUFDO1lBQ2IsQ0FBQztZQUNELE1BQU0sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBY0QsWUFBbUIsR0FBc0IsRUFDM0IsUUFBc0IsRUFDdEIsRUFBYyxFQUNoQixLQUFpQixFQUNJLFNBQWlCO1FBSi9CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQzNCLGFBQVEsR0FBUixRQUFRLENBQWM7UUFDdEIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNoQixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ0ksY0FBUyxHQUFULFNBQVMsQ0FBUTtRQXJWM0Msd0JBQW1CLEdBQTZELElBQUksQ0FBQztRQXVHNUY7Ozs7OztXQU1HO1FBRUkseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFHM0QscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUEwR3BFOztXQUVHO1FBQ0ksd0JBQW1CLEdBQTRCLEVBQUUsQ0FBQztRQXNCekQ7O1dBRUc7UUFDSSxnQkFBVyxHQUFtQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQU9yRDs7V0FFRztRQUNJLHFDQUFnQyxHQUFvQjtZQUN2RCxjQUFjLEVBQUUsSUFBSSxzQkFBc0IsRUFBRTtZQUM1QyxLQUFLLEVBQUUsS0FBSztZQUNaLG1CQUFtQixFQUFFLElBQUk7U0FDNUIsQ0FBQztRQUVGOztXQUVHO1FBQ0ksZ0NBQTJCLEdBQW9CO1lBQ2xELGNBQWMsRUFBRSxJQUFJLHNCQUFzQixFQUFFO1lBQzVDLEtBQUssRUFBRSxLQUFLO1lBQ1osbUJBQW1CLEVBQUUsSUFBSTtTQUM1QixDQUFDO1FBRUY7O1dBRUc7UUFDSSwrQkFBMEIsR0FBb0I7WUFDakQsY0FBYyxFQUFFLElBQUksc0JBQXNCLEVBQUU7WUFDNUMsS0FBSyxFQUFFLEtBQUs7WUFDWixtQkFBbUIsRUFBRSxJQUFJO1NBQzVCLENBQUM7UUFFRjs7V0FFRztRQUNJLG1DQUE4QixHQUFvQjtZQUNyRCxjQUFjLEVBQUUsSUFBSSxzQkFBc0IsRUFBRTtZQUM1QyxLQUFLLEVBQUUsS0FBSztZQUNaLG1CQUFtQixFQUFFLElBQUk7U0FDNUIsQ0FBQztRQUVNLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBTzlCLG1CQUFjLEdBQUcsR0FBRyxDQUFDO1FBQ3JCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQU0xQixvQkFBZSxHQUEwQixFQUFFLENBQUM7UUFDNUMseUJBQW9CLEdBQTJCLEVBQUUsQ0FBQztRQUtsRCxxQkFBZ0IsR0FBRyx5QkFBeUIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBYzVFLHNCQUFpQixHQUFHO1lBQ3hCLG9CQUFvQixFQUFFLG1CQUFtQixDQUFDLEtBQUs7WUFDL0Msa0JBQWtCLEVBQUUsaUJBQWlCLENBQUMsR0FBRztTQUM1QyxDQUFDO1FBRU0scUJBQWdCLEdBQW9CO1lBQ3hDLG1CQUFtQixFQUFFLEtBQUs7WUFDMUIsS0FBSyxFQUFFLEtBQUs7WUFDWixnQkFBZ0IsRUFBRSxJQUFJLDRCQUE0QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUMxRSxjQUFjLEVBQUUsSUFBSSxtQkFBbUIsRUFBRTtTQUM1QyxDQUFDO1FBT0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDaEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDbEQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQzdELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM1RCxJQUFJLENBQUMsOEJBQThCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEUsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ2xFLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVc7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksc0JBQXNCLENBQUMsS0FBMEI7UUFDcEQsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUNoRCxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN2RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksOEJBQThCLENBQUMsU0FBbUM7UUFDckUsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksb0JBQW9CO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLHFCQUFxQjtRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFdEUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1RSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztZQUN4RCxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7WUFFNUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM5QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUVyRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBRTlCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTFCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsb0JBQW9CLENBQUMsS0FBZTtRQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFFNUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLEtBQUssS0FBSyxJQUFJLFFBQVEsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1lBRW5DLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3pELENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxvQkFBb0I7UUFDM0IsSUFBSSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsYUFBYSxDQUFDLEtBQWdCO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFckMsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4RixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2dCQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGFBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZUFBZSxDQUFDLE1BQStDO1FBQ2xFLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyxvQkFBb0I7UUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxtQkFBbUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLENBQUM7SUFDbkYsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLE1BQTJCLEVBQUUsZUFBZ0M7UUFDN0UsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQztZQUMxQyxTQUFTLEVBQUUsSUFBSTtZQUNmLFNBQVMsRUFBRSxJQUFJO1lBQ2YsYUFBYSxFQUFFLElBQUk7WUFDbkIsVUFBVSxFQUFFLElBQUk7WUFDaEIsU0FBUyxFQUFFLElBQUk7U0FDbEIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVYLElBQUksZUFBZSxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDdkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEQsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVcsQ0FBQyxNQUE0QixFQUFFLGVBQWdDO1FBQzdFLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVSxDQUFDLE1BQTRCLEVBQUUsZUFBZ0M7UUFDNUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQUMsU0FBOEI7UUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQjtRQUNwQixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDdkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzNHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNsSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSztnQkFDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSztnQkFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTTtvQkFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTTtvQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBRW5DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDckUsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUN4RixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwSCxDQUFDO2dCQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDckYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDNUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDN0csSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO2dCQUMzRixJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFDakcsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN4RCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN2RCxDQUFDO1lBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDMUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNwSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0I7UUFDbkIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUMxQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQ25DLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUI7UUFDcEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RSxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNiLFVBQVUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO2dCQUV4RCxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUMvQixVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDbkMsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUUxQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNsQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0kscUJBQXFCO1FBQ3hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsT0FBTyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxpQkFBaUI7WUFDL0MsQ0FDSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxPQUFPLENBQUMsQ0FBQztnQkFDekwsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLElBQUksVUFBVSxDQUFDLGlCQUFpQixJQUFJLFNBQVMsQ0FBQztnQkFDeEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FDdkUsQ0FBQztJQUNWLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZUFBZTtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDMUIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0IsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCLENBQUMsVUFBMEI7UUFDL0MsT0FBTyxVQUFVLFlBQVksbUJBQW1CLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLGNBQThCO1FBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFDLGNBQXFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUNuQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWMsQ0FBQyxjQUFxQztRQUN2RCxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNJLG1CQUFtQixDQUFDLGNBQXFDO1FBQzVELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxjQUFjLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEUsSUFBSSxDQUFDLGFBQWE7WUFDZCxjQUFjLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQzlFLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDZixJQUFJLENBQUMsaUJBQWlCO1lBQ2xCLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pDLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUM7UUFDYixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUU3RCxjQUFjLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxDQUFDO1FBQ3hDLElBQUksY0FBYyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDdkUsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDcEUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLHVCQUF1QixHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFzQixDQUFDLENBQUM7UUFDdEcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGdCQUFnQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMvRSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMvRixJQUFJLENBQUMsZ0NBQWdDLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsY0FBYyxFQUFpQixDQUFDLENBQUM7UUFDakksSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGdCQUFnQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUNwRixJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBQ2xFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBc0IsQ0FBQyxDQUFDO1FBQ3BHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDOUUsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztRQUMxRSxJQUFJLENBQUMsOEJBQThCLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQXNCLENBQUMsQ0FBQztRQUM1RyxJQUFJLENBQUMsOEJBQThCLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBRWxGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5RSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckQsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDcEYsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ25CLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxjQUFjO1FBQ2pCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQzNCLENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUUxQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLGtCQUFrQixDQUFDLGNBQXFDO1FBQzNELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxjQUFjLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsY0FBYyxDQUFDO1FBQ3pDLElBQUksY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCO1FBQ3BCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxTQUF3QjtRQUNyQyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzdFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksY0FBYztRQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhO1FBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWE7UUFDaEIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLFNBQThCO1FBQzlDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUEwQixDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksVUFBVSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDVixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzNDLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDcEMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFNUQsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3pCLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVc7UUFDZCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzNDLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDcEMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksb0JBQW9CLENBQUMsS0FBNEI7UUFDcEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQXVCLENBQUM7UUFDOUQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksd0JBQXdCLENBQUMsSUFBWTtRQUN4QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsNEJBQTRCLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFVO1FBQ3BCLE9BQU8sS0FBSyxZQUFZLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxxQkFBcUI7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDeEMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVcsQ0FBQyxTQUF3QjtRQUN2QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDM0MsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzFCLFNBQVMsQ0FBQyxhQUE2QixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JELENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsSUFBbUI7UUFDakMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxtQkFBbUIsQ0FBQyxLQUFLO1FBQzVCLHVFQUF1RTtRQUN2RSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZ0JBQWdCO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRW5DLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLEtBQWE7UUFDN0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxLQUFhO1FBQzFCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxpQkFBaUI7UUFDcEIsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEQsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU8sQ0FBQyxVQUEwQixFQUFFLGVBQWdDO1FBQ3ZFLE9BQU87WUFDSCxTQUFTLEVBQUUsVUFBVTtZQUNyQixlQUFlO1NBQ2xCLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0I7UUFDckIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDdkQsSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztZQUN2QyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNsQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN2RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYSxDQUFDLEtBQUssRUFBRSxjQUFxQztRQUM3RCxjQUFjLENBQUMsUUFBUSxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztRQUNuRCxJQUFJLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5RCxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLGtCQUFrQixDQUFDLFNBQW9DO1FBQzFELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUM7UUFDNUMsSUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hGLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hELElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLDRCQUE0QixDQUFDO1FBQzdELENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLFlBQVk7UUFDZixPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRU0sbUJBQW1CLENBQUMsY0FBcUM7UUFDNUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNMLENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxNQUFNO1FBQzVCLElBQ0ksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNqSCxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFDekUsQ0FBQztZQUNDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RELENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BELENBQUM7SUFDTCxDQUFDO0lBRU0sNkJBQTZCLENBQUMsMEJBQTBCO1FBQzNELE1BQU0sR0FBRyxHQUFHO1lBQ1IsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzNCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3pDLDBCQUEwQixFQUFFLDBCQUEwQjtTQUN6RCxDQUFDO1FBQ0YsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRU8sU0FBUyxDQUFDLEtBQWdCO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsS0FBSyxDQUFDLFFBQVEsR0FBRyxFQUFFLFVBQVUsRUFBRSx3QkFBd0IsRUFBRSxDQUFDO1FBQzlELENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QixLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEQsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3RCw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUM7UUFDckUsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQixLQUFLLENBQUMscUJBQXFCLEdBQUcsd0JBQXdCLENBQUM7UUFDM0QsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixLQUFLLENBQUMsaUJBQWlCLEdBQUcsbUJBQW1CLENBQUM7UUFDbEQsQ0FBQztJQUNMLENBQUM7SUFFTyxVQUFVLENBQUMsS0FBZ0I7UUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixRQUFRLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckIsS0FBSyxRQUFRLENBQUMsT0FBTztvQkFDakIsS0FBSyxDQUFDLE9BQU8sR0FBRywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDdEQsTUFBTTtnQkFDVixLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3JCLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDdkIsS0FBSyxRQUFRLENBQUMsT0FBTztvQkFDakIsS0FBSyxDQUFDLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDckQsTUFBTTtnQkFDVixLQUFLLFFBQVEsQ0FBQyxJQUFJO29CQUNkLEtBQUssQ0FBQyxPQUFPLEdBQUcsdUJBQXVCLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ25ELE1BQU07Z0JBQ1YsS0FBSyxRQUFRLENBQUMsSUFBSTtvQkFDZCxLQUFLLENBQUMsT0FBTyxHQUFHLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNuRCxNQUFNO2dCQUNWLEtBQUssUUFBUSxDQUFDLFFBQVE7b0JBQ2xCLEtBQUssQ0FBQyxPQUFPLEdBQUcsMkJBQTJCLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3ZELE1BQU07Z0JBQ1YsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUNyQjtvQkFDSSxLQUFLLENBQUMsT0FBTyxHQUFHLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNyRCxNQUFNO1lBQ2QsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsY0FBcUM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsY0FBcUM7UUFDMUQsY0FBYyxDQUFDLFFBQVEsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7UUFFbkQsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsRCxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDTCxDQUFDO0lBRU8sUUFBUSxDQUFDLFFBQXdCLEVBQUUsTUFBNEIsRUFBRSxlQUFnQztRQUNyRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QixNQUFNLFNBQVMsR0FBRyxJQUFJLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU1RCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3BELENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBRU8seUJBQXlCLENBQUMsY0FBK0IsRUFBRSxNQUE0QixFQUFFLFVBQW1CO1FBQ2hILElBQUksU0FBOEIsQ0FBQztRQUNuQyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLFNBQVMsR0FBRyxJQUFJLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFckUsS0FBSyxNQUFNLElBQUksSUFBSSxjQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxJQUFJLFlBQVksd0JBQXdCLEVBQUUsQ0FBQztvQkFDM0MsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3BHLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLGFBQWEsR0FBRyxJQUE0QixDQUFDO29CQUNuRCxNQUFNLFFBQVEsR0FBeUI7d0JBQ25DLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUzt3QkFDbEMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTO3dCQUNsQyxhQUFhLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJO3dCQUMzQyxTQUFTLEVBQUUsYUFBYSxDQUFDLFNBQVM7d0JBQ2xDLFVBQVUsRUFBRSxhQUFhLENBQUMsVUFBVSxFQUFFLHVFQUF1RTt3QkFDN0csVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVO3FCQUN2QyxDQUFDO29CQUNGLE1BQU0sV0FBVyxHQUFHLElBQUkscUJBQXFCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUNuRSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDeEIsVUFBVSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7b0JBQ3ZDLENBQUM7b0JBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDO29CQUNqRSxJQUFJLE1BQU0sRUFBRSxDQUFDO3dCQUNULElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztvQkFDaEMsQ0FBQztvQkFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM1RSxXQUFXLENBQUMsVUFBVSxHQUFHLEtBQUssRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLE1BQU0sSUFBSSxLQUFLLEVBQUUsS0FBSyxDQUFDO29CQUN2RSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUN0RyxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDaEMsQ0FBQztvQkFDRCxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUM7b0JBQ3pFLElBQUksQ0FBQyxxQkFBcUI7d0JBQ3RCLENBQUMsY0FBYyxDQUFDLFlBQVksSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7NEJBQ3BILENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7NEJBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVHLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxpQ0FBaUMsQ0FBQyxTQUE4QixFQUFFLE1BQWUsRUFBRSxZQUF1QjtRQUM5RyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDYixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFekcsS0FBSyxNQUFNLElBQUksSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxJQUFJLFlBQVksbUJBQW1CLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFFLElBQTRCLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUM1RyxjQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELENBQUM7aUJBQU0sQ0FBQztnQkFDSixjQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFFLElBQThCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEYsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUMxQixDQUFDO0lBRU8saUJBQWlCO1FBQ3JCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBRXZELElBQUksZUFBZSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7WUFFdkMsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLGVBQWUsR0FBRztvQkFDbkI7d0JBQ0ksS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMscUNBQXFDO3dCQUNqRSxRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVEsS0FBSyxjQUFjLENBQUMsR0FBRztxQkFDNUQ7b0JBQ0Q7d0JBQ0ksS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsb0NBQW9DO3dCQUNoRSxRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVEsS0FBSyxjQUFjLENBQUMsRUFBRTtxQkFDM0Q7aUJBQ0osQ0FBQztZQUNOLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkMsQ0FBQztJQUNMLENBQUM7SUFFTyx1QkFBdUI7UUFDM0IsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkMsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUUzRyxJQUFJLDhCQUE4QixFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sS0FBSyxDQUFDO1lBQ2pCLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxJQUFvQixFQUFFLEtBQTBCO1FBQ2xFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDeEIsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTyxVQUFVLENBQUMsY0FBOEI7UUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksY0FBYyxLQUFLLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQ2pELENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9DLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLHdDQUF3QztRQUU3SSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU8sV0FBVyxDQUFDLFFBQXdCO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlILE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFN0MsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxJQUFJLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU1RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTVDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDMUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxXQUFXLENBQUMsU0FBOEI7UUFDOUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksU0FBUyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFDRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFNBQThCLEVBQUUsUUFBaUI7UUFDMUUsSUFBSSxTQUFTLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBRTlCLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxQyxDQUFDO1FBQ0wsQ0FBQztRQUVELEtBQUssTUFBTSxJQUFJLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLElBQUksSUFBSSxZQUFZLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDOUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0saUJBQWlCLEdBQUcsSUFBNkIsQ0FBQztnQkFDeEQsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsY0FBOEI7UUFDMUQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUNyQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNMLENBQUM7SUFFTywwQkFBMEI7UUFDOUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3RGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEYsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3QyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25FLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU8scUJBQXFCLENBQUMsTUFBbUI7UUFDN0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDNUQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBRWpCLElBQUksU0FBUyxDQUFDLFNBQVMsR0FBRyxLQUFLLEdBQUcsWUFBWSxFQUFFLENBQUM7WUFDN0MsU0FBUyxDQUFDLFNBQVMsR0FBRyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQy9DLENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFlBQVksR0FBRyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNuRyxTQUFTLENBQUMsU0FBUyxHQUFHLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxHQUFHLEtBQUssR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO1FBQzlGLENBQUM7SUFDTCxDQUFDO0lBR08sSUFBSTtRQUNSLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZDLENBQUM7OEdBaDRDUSw0QkFBNEIsbUlBb1d6QixTQUFTO2tHQXBXWiw0QkFBNEIsd2pCQWlLdkIsOEJBQThCLHlJQTlCVCxrQkFBa0IsaUlBR0wsaUJBQWlCLHFHQUcvQixrQkFBa0IsNkdBR2Qsa0JBQWtCLCtHQUdqQixVQUFVLDRNQU1MLFVBQVUsbUhBR2IsVUFBVSxtSEFHVixrQkFBa0IsMkhBU2QsVUFBVSwrR0FpQmhCLFVBQVUsdUlBaUJFLFVBQVUsaUVBaUJsRCxrQkFBa0IsMk9BU08seUJBQXlCLHNEQU4vQyxnQkFBZ0Isa0VBU2hCLDRCQUE0QixnREN0WTlDLDRvM0JBa25CQSw0Q0QvY2EsNEJBQTRCLG9RQXBDakMsSUFBSSw2RkFFSixrQkFBa0Isb0lBQ2xCLGdCQUFnQiwyRkFDaEIsZ0JBQWdCLDJiQUNoQixrQkFBa0IsOEVBQ2xCLGtCQUFrQiw0RUFDbEIsa0JBQWtCLG9MQUNsQixXQUFXLCttQkFDWCxLQUFLLG1IQUNMLHNCQUFzQiw4RUFDdEIsc0JBQXNCLG9JQUN0QixpQkFBaUIsMEhBQ2pCLHNCQUFzQixzYUFDdEIsd0JBQXdCLG9GQUN4Qix1QkFBdUIsNkRBQ3ZCLHNCQUFzQixnVkFDdEIsMEJBQTBCLG1RQUMxQixnQkFBZ0Isb0pBQ2hCLE9BQU8sb0ZBQ1Asa0JBQWtCLCtKQUNsQix1QkFBdUIsOE1BQ3ZCLHlCQUF5Qix3RkFDekIsUUFBUSx3Q0FsRkgscUJBQXFCLHVEQW9GMUIsc0JBQXNCLHVGQUV0QixpQkFBaUIsc0pBQ2pCLGlCQUFpQix1RUFDakIsdUJBQXVCLDZEQUN2QixvQkFBb0IsMFNBQ3BCLGtCQUFrQixnYkFDbEIseUJBQXlCLDJOQUN6QixtQkFBbUI7OzJGQUdkLDRCQUE0QjtrQkExQ3hDLFNBQVM7K0JBQ0ksd0JBQXdCLFFBRTVCLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGNBQy9CLElBQUksV0FDUDt3QkFDTCxJQUFJO3dCQUNKLDhCQUE4Qjt3QkFDOUIsa0JBQWtCO3dCQUNsQixnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsa0JBQWtCO3dCQUNsQixrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsV0FBVzt3QkFDWCxLQUFLO3dCQUNMLHNCQUFzQjt3QkFDdEIsc0JBQXNCO3dCQUN0QixpQkFBaUI7d0JBQ2pCLHNCQUFzQjt3QkFDdEIsd0JBQXdCO3dCQUN4Qix1QkFBdUI7d0JBQ3ZCLHNCQUFzQjt3QkFDdEIsMEJBQTBCO3dCQUMxQixnQkFBZ0I7d0JBQ2hCLE9BQU87d0JBQ1Asa0JBQWtCO3dCQUNsQix1QkFBdUI7d0JBQ3ZCLHlCQUF5Qjt3QkFDekIsUUFBUTt3QkFDUixxQkFBcUI7d0JBQ3JCLHNCQUFzQjt3QkFDdEIsd0JBQXdCO3dCQUN4QixpQkFBaUI7d0JBQ2pCLGlCQUFpQjt3QkFDakIsdUJBQXVCO3dCQUN2QixvQkFBb0I7d0JBQ3BCLGtCQUFrQjt3QkFDbEIseUJBQXlCO3dCQUN6QixtQkFBbUI7cUJBQ3RCOzswQkFzV0ksTUFBTTsyQkFBQyxTQUFTO3lDQWhXWSxRQUFRO3NCQUF4QyxXQUFXO3VCQUFDLE9BQU87Z0JBS2IsUUFBUTtzQkFEZCxLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQUlLLGdCQUFnQjtzQkFEMUIsS0FBSztnQkF3QkssTUFBTTtzQkFEaEIsS0FBSztnQkEyQkssY0FBYztzQkFEeEIsS0FBSztnQkFrQkssTUFBTTtzQkFEaEIsS0FBSztnQkF3QkssZUFBZTtzQkFEekIsS0FBSztnQkFvQkMsb0JBQW9CO3NCQUQxQixNQUFNO2dCQUlBLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFJRyxZQUFZO3NCQURyQixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRTtnQkFJL0MseUJBQXlCO3NCQURoQyxTQUFTO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFO2dCQUkzRCxXQUFXO3NCQURsQixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRTtnQkFJOUMsZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRTtnQkFJbEQsZ0JBQWdCO3NCQUR2QixTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJM0MsTUFBTTtzQkFEYixTQUFTO3VCQUFDLFFBQVE7Z0JBSVgscUJBQXFCO3NCQUQ1QixTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJaEQsa0JBQWtCO3NCQUR6QixTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJN0Msa0JBQWtCO3NCQUR6QixTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFO2dCQU90RCxhQUFhO3NCQURuQixZQUFZO3VCQUFDLDhCQUE4QjtnQkFJOUIsc0JBQXNCO3NCQURuQyxTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFrQjNDLGdCQUFnQjtzQkFEN0IsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBa0JyQyw0QkFBNEI7c0JBRHpDLFNBQVM7dUJBQUMsOEJBQThCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQWtCdkQsaUJBQWlCO3NCQUR4QixTQUFTO3VCQUFDLGtCQUFrQjtnQkFJckIsS0FBSztzQkFEWixZQUFZO3VCQUFDLGdCQUFnQjtnQkFJdEIsb0JBQW9CO3NCQUQzQixTQUFTO3VCQUFDLHNCQUFzQjtnQkFJekIsYUFBYTtzQkFEcEIsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJckUsWUFBWTtzQkFEbkIsWUFBWTt1QkFBQyw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBMT0NBTEVfSUQsXG4gICAgT3V0cHV0LFxuICAgIFBpcGUsXG4gICAgUGlwZVRyYW5zZm9ybSxcbiAgICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrLCBOZ0lmLCBOZ0ZvciwgTmdUZW1wbGF0ZU91dGxldCwgTmdDbGFzcywgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQnV0dG9uR3JvdXBFdmVudEFyZ3MsIElneEJ1dHRvbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uR3JvdXAvYnV0dG9uR3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneENoaXBDb21wb25lbnQgfSBmcm9tICcuLi9jaGlwcy9jaGlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJUXVlcnlCdWlsZGVyUmVzb3VyY2VTdHJpbmdzLCBRdWVyeUJ1aWxkZXJSZXNvdXJjZVN0cmluZ3NFTiB9IGZyb20gJy4uL2NvcmUvaTE4bi9xdWVyeS1idWlsZGVyLXJlc291cmNlcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IERhdGFUeXBlLCBEYXRhVXRpbCB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQsIElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQsIElneE51bWJlckZpbHRlcmluZ09wZXJhbmQsIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQsIElneFRpbWVGaWx0ZXJpbmdPcGVyYW5kIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMsIElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIElFeHByZXNzaW9uVHJlZSwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJZ3hEYXRlUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50JztcblxuaW1wb3J0IHsgSWd4QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hEYXRlVGltZUVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZGF0ZS10aW1lLWVkaXRvci9kYXRlLXRpbWUtZWRpdG9yLmRpcmVjdGl2ZSc7XG5cbmltcG9ydCB7IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIElneFRvZ2dsZUFjdGlvbkRpcmVjdGl2ZSwgSWd4VG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90b2dnbGUvdG9nZ2xlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGaWVsZFR5cGUsIEVudGl0eVR5cGUgfSBmcm9tICcuLi9ncmlkcy9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4U2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VsZWN0L3NlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSG9yaXpvbnRhbEFsaWdubWVudCwgT3ZlcmxheVNldHRpbmdzLCBQb2ludCwgVmVydGljYWxBbGlnbm1lbnQgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3V0aWxpdGllcyc7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LCBBdXRvUG9zaXRpb25TdHJhdGVneSwgQ2xvc2VTY3JvbGxTdHJhdGVneSwgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSB9IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4VGltZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXItaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hQaWNrZXJUb2dnbGVDb21wb25lbnQsIElneFBpY2tlckNsZWFyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1jb21tb24vcGlja2VyLWljb25zLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaW5wdXQvaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneElucHV0R3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U2VsZWN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL3NlbGVjdC9zZWxlY3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U3VmZml4RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9zdWZmaXgvc3VmZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hQcmVmaXhEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3ByZWZpeC9wcmVmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vcmVzb3VyY2VzJztcbmltcG9ydCB7IElneEljb25CdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2J1dHRvbi9pY29uLWJ1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4Q29tYm9Db21wb25lbnQgfSBmcm9tIFwiLi4vY29tYm8vY29tYm8uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJZ3hMYWJlbERpcmVjdGl2ZSB9IGZyb20gJy4uL2lucHV0LWdyb3VwL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4Q29tYm9IZWFkZXJEaXJlY3RpdmUgfSBmcm9tICcuLi9jb21iby9wdWJsaWNfYXBpJztcbmltcG9ydCB7IElDaGFuZ2VDaGVja2JveEV2ZW50QXJncywgSWd4Q2hlY2tib3hDb21wb25lbnQgfSBmcm9tIFwiLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJZ3hEaWFsb2dDb21wb25lbnQgfSBmcm9tIFwiLi4vZGlhbG9nL2RpYWxvZy5jb21wb25lbnRcIjtcbmltcG9ydCB7IElTZWxlY3Rpb25FdmVudEFyZ3MgfSBmcm9tICcuLi9kcm9wLWRvd24vZHJvcC1kb3duLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneFRvb2x0aXBUYXJnZXREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3Rvb2x0aXAvdG9vbHRpcC10YXJnZXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneFF1ZXJ5QnVpbGRlclNlYXJjaFZhbHVlVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIuZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBJZ3hRdWVyeUJ1aWxkZXJDb21wb25lbnQgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIuY29tcG9uZW50JztcblxuY29uc3QgREVGQVVMVF9QSVBFX0RBVEVfRk9STUFUID0gJ21lZGl1bURhdGUnO1xuY29uc3QgREVGQVVMVF9QSVBFX1RJTUVfRk9STUFUID0gJ21lZGl1bVRpbWUnO1xuY29uc3QgREVGQVVMVF9QSVBFX0RBVEVfVElNRV9GT1JNQVQgPSAnbWVkaXVtJztcbmNvbnN0IERFRkFVTFRfUElQRV9ESUdJVFNfSU5GTyA9ICcxLjAtMyc7XG5jb25zdCBERUZBVUxUX0RBVEVfVElNRV9GT1JNQVQgPSAnZGQvTU0veXl5eSBISDptbTpzcyBhJztcbmNvbnN0IERFRkFVTFRfVElNRV9GT1JNQVQgPSAnaGg6bW06c3MgYSc7XG5cbkBQaXBlKHtcbiAgICBuYW1lOiAnZmllbGRGb3JtYXR0ZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgSWd4RmllbGRGb3JtYXR0ZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cbiAgICBwdWJsaWMgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGZvcm1hdHRlcjogKHY6IGFueSwgZGF0YTogYW55LCBmaWVsZERhdGE/OiBhbnkpID0+IGFueSwgcm93RGF0YTogYW55LCBmaWVsZERhdGE/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlcih2YWx1ZSwgcm93RGF0YSwgZmllbGREYXRhKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlbiBAaW50ZXJuYWxcbiAqXG4gKiBJbnRlcm5hbCBjbGFzcyB1c2FnZVxuICovXG5jbGFzcyBFeHByZXNzaW9uSXRlbSB7XG4gICAgcHVibGljIHBhcmVudDogRXhwcmVzc2lvbkdyb3VwSXRlbTtcbiAgICBwdWJsaWMgc2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIGV4cGFuZGVkOiBib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudD86IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW4gQGludGVybmFsXG4gKlxuICogSW50ZXJuYWwgY2xhc3MgdXNhZ2VcbiAqL1xuY2xhc3MgRXhwcmVzc2lvbkdyb3VwSXRlbSBleHRlbmRzIEV4cHJlc3Npb25JdGVtIHtcbiAgICBwdWJsaWMgb3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljO1xuICAgIHB1YmxpYyBjaGlsZHJlbjogRXhwcmVzc2lvbkl0ZW1bXTtcbiAgICBjb25zdHJ1Y3RvcihvcGVyYXRvcjogRmlsdGVyaW5nTG9naWMsIHBhcmVudD86IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50KTtcbiAgICAgICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW4gQGludGVybmFsXG4gKlxuICogSW50ZXJuYWwgY2xhc3MgdXNhZ2VcbiAqL1xuY2xhc3MgRXhwcmVzc2lvbk9wZXJhbmRJdGVtIGV4dGVuZHMgRXhwcmVzc2lvbkl0ZW0ge1xuICAgIHB1YmxpYyBleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbjtcbiAgICBwdWJsaWMgaW5FZGl0TW9kZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgaW5BZGRNb2RlOiBib29sZWFuO1xuICAgIHB1YmxpYyBob3ZlcmVkOiBib29sZWFuO1xuICAgIHB1YmxpYyBmaWVsZExhYmVsOiBzdHJpbmc7XG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb24sIHBhcmVudDogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICBzdXBlcihwYXJlbnQpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtcXVlcnktYnVpbGRlci10cmVlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcXVlcnktYnVpbGRlci10cmVlLmNvbXBvbmVudC5odG1sJyxcbiAgICBob3N0OiB7ICdjbGFzcyc6ICdpZ3gtcXVlcnktYnVpbGRlci10cmVlJyB9LFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQsXG4gICAgICAgIElneEJ1dHRvbkRpcmVjdGl2ZSxcbiAgICAgICAgSWd4SWNvbkNvbXBvbmVudCxcbiAgICAgICAgSWd4Q2hpcENvbXBvbmVudCxcbiAgICAgICAgSWd4UHJlZml4RGlyZWN0aXZlLFxuICAgICAgICBJZ3hTdWZmaXhEaXJlY3RpdmUsXG4gICAgICAgIElneFNlbGVjdENvbXBvbmVudCxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIE5nRm9yLFxuICAgICAgICBJZ3hTZWxlY3RJdGVtQ29tcG9uZW50LFxuICAgICAgICBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LFxuICAgICAgICBJZ3hJbnB1dERpcmVjdGl2ZSxcbiAgICAgICAgSWd4RGF0ZVBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgSWd4UGlja2VyVG9nZ2xlQ29tcG9uZW50LFxuICAgICAgICBJZ3hQaWNrZXJDbGVhckNvbXBvbmVudCxcbiAgICAgICAgSWd4VGltZVBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgSWd4RGF0ZVRpbWVFZGl0b3JEaXJlY3RpdmUsXG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgICAgIE5nQ2xhc3MsXG4gICAgICAgIElneFRvZ2dsZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4QnV0dG9uR3JvdXBDb21wb25lbnQsXG4gICAgICAgIElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsXG4gICAgICAgIERhdGVQaXBlLFxuICAgICAgICBJZ3hGaWVsZEZvcm1hdHRlclBpcGUsXG4gICAgICAgIElneEljb25CdXR0b25EaXJlY3RpdmUsXG4gICAgICAgIElneFRvZ2dsZUFjdGlvbkRpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9Db21wb25lbnQsXG4gICAgICAgIElneExhYmVsRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib0hlYWRlckRpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIElneERpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgSWd4VG9vbHRpcFRhcmdldERpcmVjdGl2ZSxcbiAgICAgICAgSWd4VG9vbHRpcERpcmVjdGl2ZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgSWd4UXVlcnlCdWlsZGVyVHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgcHVibGljIGdldCBnZXRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIGBpZ3gtcXVlcnktYnVpbGRlci10cmVlLS1sZXZlbC0ke3RoaXMubGV2ZWx9YDtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBlbnRpdGllczogRW50aXR5VHlwZVtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcXVlcnlCdWlsZGVyOiBJZ3hRdWVyeUJ1aWxkZXJDb21wb25lbnQ7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZWFyY2hWYWx1ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hRdWVyeUJ1aWxkZXJTZWFyY2hWYWx1ZVRlbXBsYXRlRGlyZWN0aXZlPiA9IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGFyZW50RXhwcmVzc2lvbigpOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50RXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHBhcmVudEV4cHJlc3Npb24odmFsdWU6IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICB0aGlzLl9wYXJlbnRFeHByZXNzaW9uID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBmaWVsZHMuXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBGaWVsZFR5cGVbXSB7XG4gICAgICAgIGlmICghdGhpcy5fZmllbGRzICYmIHRoaXMuZW50aXRpZXM/Lmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5lbnRpdGllc1swXT8ubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5fZmllbGRzID0gdGhpcy5lbnRpdGllc1swXS5maWVsZHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZpZWxkcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZmllbGRzKGZpZWxkczogRmllbGRUeXBlW10pIHtcbiAgICAgICAgdGhpcy5fZmllbGRzID0gZmllbGRzO1xuXG4gICAgICAgIGlmICghdGhpcy5fZmllbGRzICYmIHRoaXMuZW50aXRpZXM/Lmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5lbnRpdGllc1swXT8ubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5fZmllbGRzID0gdGhpcy5lbnRpdGllc1swXS5maWVsZHM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fZmllbGRzKSB7XG4gICAgICAgICAgICB0aGlzLl9maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXJzKGZpZWxkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1hdChmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiB0cmVlLlxuICAgICovXG4gICAgcHVibGljIGdldCBleHByZXNzaW9uVHJlZSgpOiBJRXhwcmVzc2lvblRyZWUge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwcmVzc2lvblRyZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZXhwcmVzc2lvbiB0cmVlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBleHByZXNzaW9uVHJlZShleHByZXNzaW9uVHJlZTogSUV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleHByZXNzaW9uVHJlZSkgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMuX2V4cHJlc3Npb25UcmVlKSkge1xuICAgICAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSBleHByZXNzaW9uVHJlZTtcbiAgICAgICAgICAgIGlmICghZXhwcmVzc2lvblRyZWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEVudGl0eSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgbG9jYWxlYCBvZiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBhcHBsaWNhdGlvbidzIGxvY2FsZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYGxvY2FsZWAgb2YgdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogRXhwZWN0cyBhIHZhbGlkIEJDUCA0NyBsYW5ndWFnZSB0YWcuXG4gICAgICovXG4gICAgcHVibGljIHNldCBsb2NhbGUodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9sb2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgLy8gaWYgdmFsdWUgaXMgaW52YWxpZCwgc2V0IGl0IGJhY2sgdG8gX2xvY2FsZUlkXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBnZXRMb2NhbGVGaXJzdERheU9mV2Vlayh0aGlzLl9sb2NhbGUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSB0aGlzLl9sb2NhbGVJZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICogQnkgZGVmYXVsdCBpdCB1c2VzIEVOIHJlc291cmNlcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcmVzb3VyY2VTdHJpbmdzKHZhbHVlOiBJUXVlcnlCdWlsZGVyUmVzb3VyY2VTdHJpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jlc291cmNlU3RyaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Jlc291cmNlU3RyaW5ncywgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNvdXJjZVN0cmluZ3MoKTogSVF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVN0cmluZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgZmlyZWQgYXMgdGhlIGV4cHJlc3Npb24gdHJlZSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LXF1ZXJ5LWJ1aWxkZXIgKGV4cHJlc3Npb25UcmVlQ2hhbmdlKT0nb25FeHByZXNzaW9uVHJlZUNoYW5nZSgpJz48L2lneC1xdWVyeS1idWlsZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBleHByZXNzaW9uVHJlZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUV4cHJlc3Npb25UcmVlPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGluRWRpdE1vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEV4cHJlc3Npb25PcGVyYW5kSXRlbT4oKTtcblxuICAgIEBWaWV3Q2hpbGQoJ2VudGl0eVNlbGVjdCcsIHsgcmVhZDogSWd4U2VsZWN0Q29tcG9uZW50IH0pXG4gICAgcHJvdGVjdGVkIGVudGl0eVNlbGVjdDogSWd4U2VsZWN0Q29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnc2VsZWN0ZWRSZXR1cm5GaWVsZHNDb21ibycsIHsgcmVhZDogSWd4Q29tYm9Db21wb25lbnQgfSlcbiAgICBwcml2YXRlIHNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm86IElneENvbWJvQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnZmllbGRTZWxlY3QnLCB7IHJlYWQ6IElneFNlbGVjdENvbXBvbmVudCB9KVxuICAgIHByaXZhdGUgZmllbGRTZWxlY3Q6IElneFNlbGVjdENvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbmRpdGlvblNlbGVjdCcsIHsgcmVhZDogSWd4U2VsZWN0Q29tcG9uZW50IH0pXG4gICAgcHJpdmF0ZSBjb25kaXRpb25TZWxlY3Q6IElneFNlbGVjdENvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaFZhbHVlSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcml2YXRlIHNlYXJjaFZhbHVlSW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdwaWNrZXInKVxuICAgIHByaXZhdGUgcGlja2VyOiBJZ3hEYXRlUGlja2VyQ29tcG9uZW50IHwgSWd4VGltZVBpY2tlckNvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2FkZFJvb3RBbmRHcm91cEJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByaXZhdGUgYWRkUm9vdEFuZEdyb3VwQnV0dG9uOiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgnYWRkQ29uZGl0aW9uQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJpdmF0ZSBhZGRDb25kaXRpb25CdXR0b246IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdlbnRpdHlDaGFuZ2VEaWFsb2cnLCB7IHJlYWQ6IElneERpYWxvZ0NvbXBvbmVudCB9KVxuICAgIHByaXZhdGUgZW50aXR5Q2hhbmdlRGlhbG9nOiBJZ3hEaWFsb2dDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50KVxuICAgIHB1YmxpYyBoZWFkZXJDb250ZW50OiBJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdlZGl0aW5nSW5wdXRzQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIHNldCBlZGl0aW5nSW5wdXRzQ29udGFpbmVyKHZhbHVlOiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmICgodmFsdWUgJiYgIXRoaXMuX2VkaXRpbmdJbnB1dHNDb250YWluZXIpIHx8XG4gICAgICAgICAgICAodmFsdWUgJiYgdGhpcy5fZWRpdGluZ0lucHV0c0NvbnRhaW5lciAmJiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgIT09IHZhbHVlLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KHZhbHVlLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGVkaXRpbmdJbnB1dHNDb250YWluZXIoKTogRWxlbWVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2FkZE1vZGVDb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcm90ZWN0ZWQgc2V0IGFkZE1vZGVDb250YWluZXIodmFsdWU6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKCh2YWx1ZSAmJiAhdGhpcy5fYWRkTW9kZUNvbnRhaW5lcikgfHxcbiAgICAgICAgICAgICh2YWx1ZSAmJiB0aGlzLl9hZGRNb2RlQ29udGFpbmVyICYmIHRoaXMuX2FkZE1vZGVDb250YWluZXIubmF0aXZlRWxlbWVudCAhPT0gdmFsdWUubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcodmFsdWUubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FkZE1vZGVDb250YWluZXIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCBnZXQgYWRkTW9kZUNvbnRhaW5lcigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZE1vZGVDb250YWluZXI7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgnY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBzZXQgY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcih2YWx1ZTogRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoKHZhbHVlICYmICF0aGlzLl9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyKSB8fFxuICAgICAgICAgICAgKHZhbHVlICYmIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIgJiYgdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50ICE9PSB2YWx1ZS5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyh2YWx1ZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lciA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIGdldCBjdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyKCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKElneFRvZ2dsZURpcmVjdGl2ZSlcbiAgICBwcml2YXRlIGNvbnRleHRNZW51VG9nZ2xlOiBJZ3hUb2dnbGVEaXJlY3RpdmU7XG5cbiAgICBAVmlld0NoaWxkcmVuKElneENoaXBDb21wb25lbnQpXG4gICAgcHJpdmF0ZSBjaGlwczogUXVlcnlMaXN0PElneENoaXBDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnZXhwcmVzc2lvbnNDb250YWluZXInKVxuICAgIHByaXZhdGUgZXhwcmVzc2lvbnNDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdvdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcml2YXRlIG92ZXJsYXlPdXRsZXQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICBAVmlld0NoaWxkcmVuKElneFF1ZXJ5QnVpbGRlclRyZWVDb21wb25lbnQpXG4gICAgcHJpdmF0ZSBpbm5lclF1ZXJpZXM6IFF1ZXJ5TGlzdDxJZ3hRdWVyeUJ1aWxkZXJUcmVlQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJvb3RHcm91cDogRXhwcmVzc2lvbkdyb3VwSXRlbTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkRXhwcmVzc2lvbnM6IEV4cHJlc3Npb25PcGVyYW5kSXRlbVtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjdXJyZW50R3JvdXA6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb250ZXh0dWFsR3JvdXA6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJpbmdMb2dpY3M7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZENvbmRpdGlvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VhcmNoVmFsdWU6IHsgdmFsdWU6IGFueSB9ID0geyB2YWx1ZTogbnVsbCB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGlja2VyT3V0bGV0OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIHwgRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJldHVybkZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWVcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW50aXR5U2VsZWN0T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWVcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZVxuICAgIH07XG5cbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIHByaXZhdGUgX3BhcmVudEV4cHJlc3Npb246IEV4cHJlc3Npb25PcGVyYW5kSXRlbTtcbiAgICBwcml2YXRlIF9pbml0aWFsRXhwcmVzc2lvblRyZWU6IElFeHByZXNzaW9uVHJlZTtcbiAgICBwcml2YXRlIF9zZWxlY3RlZEVudGl0eTogRW50aXR5VHlwZTtcbiAgICBwcml2YXRlIF9zZWxlY3RlZFJldHVybkZpZWxkczogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRGaWVsZDogRmllbGRUeXBlO1xuICAgIHByaXZhdGUgX2NsaWNrVGltZXI7XG4gICAgcHJpdmF0ZSBfZGJsQ2xpY2tEZWxheSA9IDIwMDtcbiAgICBwcml2YXRlIF9wcmV2ZW50Q2hpcENsaWNrID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZWRpdGluZ0lucHV0c0NvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgICBwcml2YXRlIF9hZGRNb2RlQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgcHJpdmF0ZSBfYWRkTW9kZUV4cHJlc3Npb246IEV4cHJlc3Npb25PcGVyYW5kSXRlbTtcbiAgICBwcml2YXRlIF9lZGl0ZWRFeHByZXNzaW9uOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRHcm91cHM6IEV4cHJlc3Npb25Hcm91cEl0ZW1bXSA9IFtdO1xuICAgIHByaXZhdGUgX2V4cGFuZGVkRXhwcmVzc2lvbnM6IElGaWx0ZXJpbmdFeHByZXNzaW9uW10gPSBbXTtcbiAgICBwcml2YXRlIF9maWVsZHM6IEZpZWxkVHlwZVtdO1xuICAgIHByaXZhdGUgX2V4cHJlc3Npb25UcmVlOiBJRXhwcmVzc2lvblRyZWU7XG4gICAgcHJpdmF0ZSBfbG9jYWxlO1xuICAgIHByaXZhdGUgX2VudGl0eU5ld1ZhbHVlOiBFbnRpdHlUeXBlO1xuICAgIHByaXZhdGUgX3Jlc291cmNlU3RyaW5ncyA9IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MoUXVlcnlCdWlsZGVyUmVzb3VyY2VTdHJpbmdzRU4pO1xuXG4gICAgcHVibGljIGdldCBsZXZlbCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGxldCBfbGV2ZWwgPSAwO1xuICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICBpZiAocGFyZW50LmxvY2FsTmFtZSA9PT0gJ2lneC1xdWVyeS1idWlsZGVyLXRyZWUnKSB7XG4gICAgICAgICAgICAgICAgX2xldmVsKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX2xldmVsO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Bvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0LFxuICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LlRvcFxuICAgIH07XG5cbiAgICBwcml2YXRlIF9vdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcy5fcG9zaXRpb25TZXR0aW5ncyksXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQ2xvc2VTY3JvbGxTdHJhdGVneSgpXG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IFBsYXRmb3JtVXRpbCxcbiAgICAgICAgcHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBASW5qZWN0KExPQ0FMRV9JRCkgcHJvdGVjdGVkIF9sb2NhbGVJZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5sb2NhbGUgfHwgdGhpcy5fbG9jYWxlSWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLmVudGl0eVNlbGVjdE92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm92ZXJsYXlPdXRsZXQ7XG4gICAgICAgIHRoaXMuZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm92ZXJsYXlPdXRsZXQ7XG4gICAgICAgIHRoaXMucmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICAvLyBUcmlnZ2VyIGFkZGl0aW9uYWwgY2hhbmdlIGRldGVjdGlvbiBjeWNsZVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RlZEVudGl0eSgpOiBFbnRpdHlUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRW50aXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uRW50aXR5U2VsZWN0Q2hhbmdpbmcoZXZlbnQ6IElTZWxlY3Rpb25FdmVudEFyZ3MpIHtcbiAgICAgICAgZXZlbnQuY2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZW50aXR5TmV3VmFsdWUgPSBldmVudC5uZXdTZWxlY3Rpb24udmFsdWU7XG4gICAgICAgIGlmIChldmVudC5vbGRTZWxlY3Rpb24udmFsdWUgJiYgdGhpcy5xdWVyeUJ1aWxkZXIuc2hvd0VudGl0eUNoYW5nZURpYWxvZykge1xuICAgICAgICAgICAgdGhpcy5lbnRpdHlDaGFuZ2VEaWFsb2cub3BlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkVudGl0eUNoYW5nZUNvbmZpcm0oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25TaG93RW50aXR5Q2hhbmdlRGlhbG9nQ2hhbmdlKGV2ZW50QXJnczogSUNoYW5nZUNoZWNrYm94RXZlbnRBcmdzKSB7XG4gICAgICAgIHRoaXMucXVlcnlCdWlsZGVyLnNob3dFbnRpdHlDaGFuZ2VEaWFsb2cgPSAhZXZlbnRBcmdzLmNoZWNrZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvbkVudGl0eUNoYW5nZUNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5lbnRpdHlDaGFuZ2VEaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5lbnRpdHlTZWxlY3QuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5fZW50aXR5TmV3VmFsdWUgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25FbnRpdHlDaGFuZ2VDb25maXJtKCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZEVudGl0eSA9IHRoaXMuX2VudGl0eU5ld1ZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdGVkRW50aXR5LmZpZWxkcykge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbnRpdHkuZmllbGRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWVsZHMgPSB0aGlzLl9lbnRpdHlOZXdWYWx1ZSA/IHRoaXMuX2VudGl0eU5ld1ZhbHVlLmZpZWxkcyA6IFtdO1xuXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzID0gdGhpcy5fZW50aXR5TmV3VmFsdWUuZmllbGRzPy5tYXAoZiA9PiBmLmZpZWxkKTtcblxuICAgICAgICBpZiAodGhpcy5fZXhwcmVzc2lvblRyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlLmVudGl0eSA9IHRoaXMuX3NlbGVjdGVkRW50aXR5Lm5hbWU7XG4gICAgICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZS5yZXR1cm5GaWVsZHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzID0gW107XG5cbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uVHJlZUNoYW5nZS5lbWl0KHRoaXMuX2V4cHJlc3Npb25UcmVlKTtcblxuICAgICAgICAgICAgdGhpcy5hZGRBbmRHcm91cCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRGaWVsZCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLnZhbHVlID0gbnVsbDtcblxuICAgICAgICB0aGlzLmVudGl0eUNoYW5nZURpYWxvZy5jbG9zZSgpO1xuICAgICAgICB0aGlzLmVudGl0eVNlbGVjdC5jbG9zZSgpO1xuXG4gICAgICAgIHRoaXMuX2VudGl0eU5ld1ZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc2VsZWN0ZWRSZXR1cm5GaWVsZHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHM7XG5cbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzICE9PSB2YWx1ZSAmJiBvbGRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzID0gdmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9leHByZXNzaW9uVHJlZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlLnJldHVybkZpZWxkcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvblRyZWVDaGFuZ2UuZW1pdCh0aGlzLl9leHByZXNzaW9uVHJlZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRSZXR1cm5GaWVsZHMoKTogc3RyaW5nW10ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gW3RoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkRmllbGQodmFsdWU6IEZpZWxkVHlwZSkge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3NlbGVjdGVkRmllbGQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkRmllbGQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEZpZWxkID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAob2xkVmFsdWUgJiYgdGhpcy5fc2VsZWN0ZWRGaWVsZCAmJiB0aGlzLl9zZWxlY3RlZEZpZWxkLmRhdGFUeXBlICE9PSBvbGRWYWx1ZS5kYXRhVHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWUudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RlZEZpZWxkKCk6IEZpZWxkVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICpcbiAgICAgKiB1c2VkIGJ5IHRoZSBncmlkXG4gICAgICovXG4gICAgcHVibGljIHNldFBpY2tlck91dGxldChvdXRsZXQ/OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIHwgRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLnBpY2tlck91dGxldCA9IG91dGxldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogdXNlZCBieSB0aGUgZ3JpZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNDb250ZXh0TWVudVZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb250ZXh0TWVudVRvZ2dsZS5jb2xsYXBzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0VkaXRlZEV4cHJlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRDb25kaXRpb24ocGFyZW50OiBFeHByZXNzaW9uR3JvdXBJdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRBZGQoKTtcblxuICAgICAgICBjb25zdCBvcGVyYW5kSXRlbSA9IG5ldyBFeHByZXNzaW9uT3BlcmFuZEl0ZW0oe1xuICAgICAgICAgICAgZmllbGROYW1lOiBudWxsLFxuICAgICAgICAgICAgY29uZGl0aW9uOiBudWxsLFxuICAgICAgICAgICAgY29uZGl0aW9uTmFtZTogbnVsbCxcbiAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRydWUsXG4gICAgICAgICAgICBzZWFyY2hWYWw6IG51bGxcbiAgICAgICAgfSwgcGFyZW50KTtcblxuICAgICAgICBpZiAoYWZ0ZXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGFmdGVyRXhwcmVzc2lvbik7XG4gICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4ICsgMSwgMCwgb3BlcmFuZEl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gob3BlcmFuZEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KG9wZXJhbmRJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRBbmRHcm91cChwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmFkZEdyb3VwKEZpbHRlcmluZ0xvZ2ljLkFuZCwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFkZE9yR3JvdXAocGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5hZGRHcm91cChGaWx0ZXJpbmdMb2dpYy5PciwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuZEdyb3VwKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IGdyb3VwSXRlbS5wYXJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29tbWl0T3BlcmFuZEVkaXQoKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbFNlYXJjaFZhbHVlID0gdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2VkaXRlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5maWVsZE5hbWUgPSB0aGlzLnNlbGVjdGVkRmllbGQuZmllbGQ7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uY29uZGl0aW9uID0gdGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pO1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFZhbCA9IERhdGFVdGlsLnBhcnNlVmFsdWUodGhpcy5zZWxlY3RlZEZpZWxkLmRhdGFUeXBlLCBhY3R1YWxTZWFyY2hWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmZpZWxkTGFiZWwgPSB0aGlzLnNlbGVjdGVkRmllbGQubGFiZWxcbiAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0ZWRGaWVsZC5sYWJlbFxuICAgICAgICAgICAgICAgIDogdGhpcy5zZWxlY3RlZEZpZWxkLmhlYWRlclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0ZWRGaWVsZC5oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnNlbGVjdGVkRmllbGQuZmllbGQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGlubmVyUXVlcnkgPSB0aGlzLmlubmVyUXVlcmllcy5maWx0ZXIocSA9PiBxLmlzSW5FZGl0TW9kZSgpKVswXVxuICAgICAgICAgICAgaWYgKGlubmVyUXVlcnkgJiYgKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPT09ICdpbicgfHwgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9PT0gJ25vdEluJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hUcmVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShpbm5lclF1ZXJ5LmV4cHJlc3Npb25UcmVlLm9wZXJhdG9yKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZS5lbnRpdHkgPSBpbm5lclF1ZXJ5LnNlbGVjdGVkRW50aXR5Lm5hbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFRyZWUucmV0dXJuRmllbGRzID0gaW5uZXJRdWVyeS5zZWxlY3RlZFJldHVybkZpZWxkcztcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZS5maWx0ZXJpbmdPcGVyYW5kcyA9IGlubmVyUXVlcnkuZXhwcmVzc2lvblRyZWUuZmlsdGVyaW5nT3BlcmFuZHM7XG4gICAgICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFRyZWUub3BlcmF0b3IgPSBpbm5lclF1ZXJ5LmV4cHJlc3Npb25UcmVlLm9wZXJhdG9yO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hUcmVlLmZpZWxkTmFtZSA9IGlubmVyUXVlcnkuZXhwcmVzc2lvblRyZWUuZmllbGROYW1lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24odGhpcy5zZWxlY3RlZENvbmRpdGlvbikuaXNVbmFyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hWYWwgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25UcmVlRnJvbUdyb3VwSXRlbSh0aGlzLnJvb3RHcm91cCwgdGhpcy5zZWxlY3RlZEVudGl0eT8ubmFtZSwgdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkcyk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvblRyZWVDaGFuZ2UuZW1pdCh0aGlzLl9leHByZXNzaW9uVHJlZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsT3BlcmFuZEFkZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FkZE1vZGVFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbi5pbkFkZE1vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2FkZE1vZGVFeHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbmNlbE9wZXJhbmRFZGl0KCkge1xuICAgICAgICBpZiAodGhpcy5pbm5lclF1ZXJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyUXVlcnkgPSB0aGlzLmlubmVyUXVlcmllcy5maWx0ZXIocSA9PiBxLmlzSW5FZGl0TW9kZSgpKVswXTtcbiAgICAgICAgICAgIGlmIChpbm5lclF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgaW5uZXJRdWVyeS5leHByZXNzaW9uVHJlZSA9IHRoaXMuX2luaXRpYWxFeHByZXNzaW9uVHJlZTtcblxuICAgICAgICAgICAgICAgIGlmIChpbm5lclF1ZXJ5Ll9lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyUXVlcnkuY2FuY2VsT3BlcmFuZEVkaXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fZWRpdGVkRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5pbkVkaXRNb2RlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmZpZWxkTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbSh0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVyYW5kQ2FuQmVDb21taXR0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGlubmVyUXVlcnkgPSB0aGlzLmlubmVyUXVlcmllcy5maWx0ZXIocSA9PiBxLmlzSW5FZGl0TW9kZSgpKVswXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWVsZCAmJiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uICYmXG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgKCghIXRoaXMuc2VhcmNoVmFsdWUudmFsdWUgfHwgKCEhdGhpcy5zZWFyY2hWYWx1ZVRlbXBsYXRlICYmICEhdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFZhbCkpICYmICEodGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9PT0gJ2luJyB8fCB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID09PSAnbm90SW4nKSkgfHxcbiAgICAgICAgICAgICAgICAoaW5uZXJRdWVyeSAmJiAhIWlubmVyUXVlcnkuZXhwcmVzc2lvblRyZWUgJiYgaW5uZXJRdWVyeS5fZWRpdGVkRXhwcmVzc2lvbiA9PSB1bmRlZmluZWQpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pLmlzVW5hcnlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIHVzZWQgYnkgdGhlIGdyaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhpdE9wZXJhbmRFZGl0KCkge1xuICAgICAgICBpZiAoIXRoaXMuX2VkaXRlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wZXJhbmRDYW5CZUNvbW1pdHRlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0V4cHJlc3Npb25Hcm91cChleHByZXNzaW9uOiBFeHByZXNzaW9uSXRlbSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEV4cHJlc3Npb25Hcm91cEl0ZW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwUmVtb3ZlKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0oZXhwcmVzc2lvbkl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcENsaWNrKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5fY2xpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9wcmV2ZW50Q2hpcENsaWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJldmVudENoaXBDbGljayA9IGZhbHNlO1xuICAgICAgICB9LCB0aGlzLl9kYmxDbGlja0RlbGF5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBEYmxDbGljayhleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbGlja1RpbWVyKTtcbiAgICAgICAgdGhpcy5fcHJldmVudENoaXBDbGljayA9IHRydWU7XG4gICAgICAgIHRoaXMuZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2VkaXRlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uaW5FZGl0TW9kZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFyZW50RXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5pbkVkaXRNb2RlQ2hhbmdlLmVtaXQodGhpcy5wYXJlbnRFeHByZXNzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maWVsZHMgPSB0aGlzLnNlbGVjdGVkRW50aXR5ID8gdGhpcy5zZWxlY3RlZEVudGl0eS5maWVsZHMgOiBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQgPVxuICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWUgP1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQuZmllbGQgPT09IGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGROYW1lKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9XG4gICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbiA/XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZSA6XG4gICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZSA9IGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsO1xuXG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uID0gZXhwcmVzc2lvbkl0ZW07XG4gICAgICAgIGlmIChleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxFeHByZXNzaW9uVHJlZSA9IGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxFeHByZXNzaW9uVHJlZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5lbnRpdHlTZWxlY3RPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5lbnRpdHlTZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5lbnRpdHlTZWxlY3RPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGhpcy5lbnRpdHlTZWxlY3QuZWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuZW50aXR5U2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcbiAgICAgICAgdGhpcy5yZXR1cm5GaWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm8uZ2V0RWRpdEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5yZXR1cm5GaWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm8uZ2V0RWRpdEVsZW1lbnQoKSBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMucmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3MucG9zaXRpb25TdHJhdGVneSA9IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneSgpO1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IHRoaXMuZmllbGRTZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5maWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0aGlzLmZpZWxkU2VsZWN0LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnRdO1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5jb25kaXRpb25TZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGhpcy5jb25kaXRpb25TZWxlY3QuZWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcblxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5maWVsZFNlbGVjdC5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pLmlzVW5hcnkpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0LmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zZWFyY2hWYWx1ZUlucHV0Py5uYXRpdmVFbGVtZW50IHx8IHRoaXMucGlja2VyPy5nZXRFZGl0RWxlbWVudCgpO1xuICAgICAgICAgICAgaW5wdXQ/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLl9zZWxlY3RlZEdyb3Vwcykge1xuICAgICAgICAgICAgZ3JvdXAuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZWxlY3RlZEdyb3VwcyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIGV4cHIuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMgPSBbXTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUNvbnRleHRNZW51KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW50ZXJFeHByZXNzaW9uQWRkKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24uaW5BZGRNb2RlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXJlbnRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmluRWRpdE1vZGVDaGFuZ2UuZW1pdCh0aGlzLnBhcmVudEV4cHJlc3Npb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24gPSBleHByZXNzaW9uSXRlbTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dE1lbnVDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnRBcmdzOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50QXJncy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnRBcmdzLmtleTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNvbGxhcHNlZCAmJiAoa2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FU0NBUEUpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVBbmRHcm91cCgpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVHcm91cChGaWx0ZXJpbmdMb2dpYy5BbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR3JvdXAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoRmlsdGVyaW5nTG9naWMuT3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUZpbHRlcnMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkdyb3VwQ2xpY2soZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSBncm91cEl0ZW0uY2hpbGRyZW5bMF0gYXMgRXhwcmVzc2lvbk9wZXJhbmRJdGVtO1xuICAgICAgICBpZiAoIXRoaXMuaXNJbkVkaXRNb2RlKCkgJiYgZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KGZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9nZ2xlR3JvdXAoZ3JvdXBJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bmdyb3VwKCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEdyb3VwID0gdGhpcy5jb250ZXh0dWFsR3JvdXA7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNlbGVjdGVkR3JvdXAucGFyZW50O1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHNlbGVjdGVkR3JvdXApO1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSwgLi4uc2VsZWN0ZWRHcm91cC5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBzZWxlY3RlZEdyb3VwLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZXhwci5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY29tbWl0T3BlcmFuZEVkaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVHcm91cCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IHRoaXMuY29udGV4dHVhbEdyb3VwO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzZWxlY3RlZEdyb3VwLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzZWxlY3RlZEdyb3VwKTtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0RmlsdGVyaW5nTG9naWMoZXZlbnQ6IElCdXR0b25Hcm91cEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLmNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9IGV2ZW50LmluZGV4IGFzIEZpbHRlcmluZ0xvZ2ljO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RyaW5nc1tgaWd4X3F1ZXJ5X2J1aWxkZXJfZmlsdGVyXyR7bmFtZX1gXSB8fCBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25FeHByZXNzaW9uc1Njcm9sbGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLnJlcG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGludm9rZUNsaWNrKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAoZXZlbnRBcmdzLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuUGlja2VyKGFyZ3M6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGFyZ3MpKSB7XG4gICAgICAgICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBpY2tlci5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk91dGxldFBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgY2xvc2luZyB0aGUgc2VsZWN0J3MgZHJvcGRvd24gd2hlbiBjbGlja2luZyB0aGUgc2Nyb2xsXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpZWxkKSByZXR1cm4gW107XG5cbiAgICAgICAgaWYgKHRoaXMuZW50aXRpZXM/Lmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5lbnRpdGllc1swXS5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uTGlzdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmV4dGVuZGVkQ29uZGl0aW9uTGlzdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldEZvcm1hdHRlcihmaWVsZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkcy5maW5kKGVsID0+IGVsLmZpZWxkID09PSBmaWVsZCkuZm9ybWF0dGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldEZvcm1hdChmaWVsZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkcy5maW5kKGVsID0+IGVsLmZpZWxkID09PSBmaWVsZCkucGlwZUFyZ3MuZm9ybWF0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICpcbiAgICAgKiB1c2VkIGJ5IHRoZSBncmlkXG4gICAgICovXG4gICAgcHVibGljIHNldEFkZEJ1dHRvbkZvY3VzKCkge1xuICAgICAgICBpZiAodGhpcy5hZGRSb290QW5kR3JvdXBCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUm9vdEFuZEdyb3VwQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFkZENvbmRpdGlvbkJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5hZGRDb25kaXRpb25CdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dChleHByZXNzaW9uOiBFeHByZXNzaW9uSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogZXhwcmVzc2lvbixcbiAgICAgICAgICAgIGFmdGVyRXhwcmVzc2lvblxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcFNlbGVjdGlvbkVuZCgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dHVhbEdyb3VwID0gdGhpcy5maW5kU2luZ2xlU2VsZWN0ZWRHcm91cCgpO1xuICAgICAgICBpZiAoY29udGV4dHVhbEdyb3VwIHx8IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHR1YWxHcm91cCA9IGNvbnRleHR1YWxHcm91cDtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ29udGV4dE1lbnVUYXJnZXQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVUb2dnbGUub3Blbih0aGlzLl9vdmVybGF5U2V0dGluZ3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLnJlcG9zaXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kZXJDbGljayhldmVudCwgZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICBleHByZXNzaW9uSXRlbS5leHBhbmRlZCA9ICFleHByZXNzaW9uSXRlbS5leHBhbmRlZDtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9leHBhbmRlZEV4cHJlc3Npb25zLnB1c2goZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaEluZGV4ID0gdGhpcy5fZXhwYW5kZWRFeHByZXNzaW9ucy5pbmRleE9mKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWRFeHByZXNzaW9ucy5zcGxpY2UobWF0Y2hJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGZvcm1hdFJldHVybkZpZWxkcyhpbm5lclRyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgY29uc3QgcmV0dXJuRmllbGRzID0gaW5uZXJUcmVlLnJldHVybkZpZWxkcztcbiAgICAgICAgbGV0IHRleHQgPSByZXR1cm5GaWVsZHMuam9pbignLCAnKTtcbiAgICAgICAgY29uc3QgaW5uZXJUcmVlRW50aXR5ID0gdGhpcy5lbnRpdGllcz8uZmluZChlbCA9PiBlbC5uYW1lID09PSBpbm5lclRyZWUuZW50aXR5KTtcbiAgICAgICAgaWYgKHJldHVybkZpZWxkcy5sZW5ndGggPT09IGlubmVyVHJlZUVudGl0eS5maWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0ZXh0ID0gdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfYWxsX2ZpZWxkcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgPSByZXR1cm5GaWVsZHMuam9pbignLCAnKTtcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0Lmxlbmd0aCA+IDI1ID8gdGV4dC5zdWJzdHJpbmcoMCwgMjUpICsgJyAuLi4nIDogdGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNJbkVkaXRNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMucGFyZW50RXhwcmVzc2lvbiB8fCAodGhpcy5wYXJlbnRFeHByZXNzaW9uICYmIHRoaXMucGFyZW50RXhwcmVzc2lvbi5pbkVkaXRNb2RlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbkVkaXRNb2RlQ2hhbmdlZChleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIGlmICghZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblNlbGVjdEFsbENsaWNrZWQoX2V2ZW50KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcy5sZW5ndGggPiAwICYmIHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzLmxlbmd0aCA8IHRoaXMuX3NlbGVjdGVkRW50aXR5LmZpZWxkcy5sZW5ndGgpIHx8XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcy5sZW5ndGggPT0gdGhpcy5fc2VsZWN0ZWRFbnRpdHkuZmllbGRzLmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHNDb21iby5kZXNlbGVjdEFsbEl0ZW1zKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm8uc2VsZWN0QWxsSXRlbXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZWFyY2hWYWx1ZVRlbXBsYXRlQ29udGV4dChkZWZhdWx0U2VhcmNoVmFsdWVUZW1wbGF0ZSk6IGFueSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogdGhpcy5zZWFyY2hWYWx1ZSxcbiAgICAgICAgICAgIHNlbGVjdGVkRmllbGQ6IHRoaXMuc2VsZWN0ZWRGaWVsZCxcbiAgICAgICAgICAgIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdFNlYXJjaFZhbHVlVGVtcGxhdGU6IGRlZmF1bHRTZWFyY2hWYWx1ZVRlbXBsYXRlXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjdHg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRGb3JtYXQoZmllbGQ6IEZpZWxkVHlwZSkge1xuICAgICAgICBpZiAoIWZpZWxkLnBpcGVBcmdzKSB7XG4gICAgICAgICAgICBmaWVsZC5waXBlQXJncyA9IHsgZGlnaXRzSW5mbzogREVGQVVMVF9QSVBFX0RJR0lUU19JTkZPIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpZWxkLnBpcGVBcmdzLmZvcm1hdCkge1xuICAgICAgICAgICAgZmllbGQucGlwZUFyZ3MuZm9ybWF0ID0gZmllbGQuZGF0YVR5cGUgPT09IERhdGFUeXBlLlRpbWUgP1xuICAgICAgICAgICAgICAgIERFRkFVTFRfUElQRV9USU1FX0ZPUk1BVCA6IGZpZWxkLmRhdGFUeXBlID09PSBEYXRhVHlwZS5EYXRlVGltZSA/XG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUElQRV9EQVRFX1RJTUVfRk9STUFUIDogREVGQVVMVF9QSVBFX0RBVEVfRk9STUFUO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWVsZC5kZWZhdWx0RGF0ZVRpbWVGb3JtYXQpIHtcbiAgICAgICAgICAgIGZpZWxkLmRlZmF1bHREYXRlVGltZUZvcm1hdCA9IERFRkFVTFRfREFURV9USU1FX0ZPUk1BVDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmllbGQuZGVmYXVsdFRpbWVGb3JtYXQpIHtcbiAgICAgICAgICAgIGZpZWxkLmRlZmF1bHRUaW1lRm9ybWF0ID0gREVGQVVMVF9USU1FX0ZPUk1BVDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RmlsdGVycyhmaWVsZDogRmllbGRUeXBlKSB7XG4gICAgICAgIGlmICghZmllbGQuZmlsdGVycykge1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5kYXRhVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbGVhbjpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuTnVtYmVyOlxuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuQ3VycmVuY3k6XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5QZXJjZW50OlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4TnVtYmVyRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLlRpbWU6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hUaW1lRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4RGF0ZVRpbWVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuU3RyaW5nOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuXG4gICAgICAgIHRoaXMudG9nZ2xlQ29udGV4dE1lbnUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICBleHByZXNzaW9uSXRlbS5zZWxlY3RlZCA9ICFleHByZXNzaW9uSXRlbS5zZWxlY3RlZDtcblxuICAgICAgICBpZiAoZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5wdXNoKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmluZGV4T2YoZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0UGFyZW50UmVjdXJzaXZlKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkR3JvdXAob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLCBwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRBZGQoKTtcblxuICAgICAgICBjb25zdCBncm91cEl0ZW0gPSBuZXcgRXhwcmVzc2lvbkdyb3VwSXRlbShvcGVyYXRvciwgcGFyZW50KTtcblxuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoYWZ0ZXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihhZnRlckV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXggKyAxLCAwLCBncm91cEl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChncm91cEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBncm91cEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZENvbmRpdGlvbihncm91cEl0ZW0pO1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IGdyb3VwSXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0oZXhwcmVzc2lvblRyZWU6IElFeHByZXNzaW9uVHJlZSwgcGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgZW50aXR5TmFtZT86IHN0cmluZyk6IEV4cHJlc3Npb25Hcm91cEl0ZW0ge1xuICAgICAgICBsZXQgZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuICAgICAgICBpZiAoZXhwcmVzc2lvblRyZWUpIHtcbiAgICAgICAgICAgIGdyb3VwSXRlbSA9IG5ldyBFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHJlc3Npb25UcmVlLm9wZXJhdG9yLCBwYXJlbnQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgZXhwcmVzc2lvblRyZWUuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgICAgICAgICBncm91cEl0ZW0uY2hpbGRyZW4ucHVzaCh0aGlzLmNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0oZXhwciwgZ3JvdXBJdGVtLCBleHByZXNzaW9uVHJlZS5lbnRpdHkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJpbmdFeHByID0gZXhwciBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwckNvcHk6IElGaWx0ZXJpbmdFeHByZXNzaW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lOiBmaWx0ZXJpbmdFeHByLmZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogZmlsdGVyaW5nRXhwci5jb25kaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25OYW1lOiBmaWx0ZXJpbmdFeHByLmNvbmRpdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVmFsOiBmaWx0ZXJpbmdFeHByLnNlYXJjaFZhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFRyZWU6IGZpbHRlcmluZ0V4cHIuc2VhcmNoVHJlZSwgLy8gdGhpcy5jcmVhdGVFeHByZXNzaW9uR3JvdXBJdGVtKGZpbHRlcmluZ0V4cHIuc2VhcmNoVHJlZSwgZ3JvdXBJdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IGZpbHRlcmluZ0V4cHIuaWdub3JlQ2FzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVyYW5kSXRlbSA9IG5ldyBFeHByZXNzaW9uT3BlcmFuZEl0ZW0oZXhwckNvcHksIGdyb3VwSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHByZXNzaW9uVHJlZS5lbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eU5hbWUgPSBleHByZXNzaW9uVHJlZS5lbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdGllcz8uZmluZChlbCA9PiBlbC5uYW1lID09PSBlbnRpdHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBlbnRpdHkuZmllbGRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHM/LmZpbmQoZWwgPT4gZWwuZmllbGQgPT09IGZpbHRlcmluZ0V4cHIuZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmFuZEl0ZW0uZmllbGRMYWJlbCA9IGZpZWxkPy5sYWJlbCB8fCBmaWVsZD8uaGVhZGVyIHx8IGZpZWxkPy5maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2V4cGFuZGVkRXhwcmVzc2lvbnMuZmlsdGVyKGUgPT4gZS5zZWFyY2hUcmVlID09IG9wZXJhbmRJdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZEl0ZW0uZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSXRlbS5jaGlsZHJlbi5wdXNoKG9wZXJhbmRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbnRpdHkgPSB0aGlzLmVudGl0aWVzPy5maW5kKGVsID0+IGVsLm5hbWUgPT09IGVudGl0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAhZXhwcmVzc2lvblRyZWUucmV0dXJuRmllbGRzIHx8IGV4cHJlc3Npb25UcmVlLnJldHVybkZpZWxkcy5pbmNsdWRlcygnKicpIHx8IGV4cHJlc3Npb25UcmVlLnJldHVybkZpZWxkcy5pbmNsdWRlcygnQWxsJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZmllbGRzPy5tYXAoZiA9PiBmLmZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5maWVsZHM/LmZpbHRlcihmID0+IGV4cHJlc3Npb25UcmVlLnJldHVybkZpZWxkcy5pbmRleE9mKGYuZmllbGQpID49IDApLm1hcChmID0+IGYuZmllbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ3JvdXBJdGVtO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRXhwcmVzc2lvblRyZWVGcm9tR3JvdXBJdGVtKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSwgZW50aXR5Pzogc3RyaW5nLCByZXR1cm5GaWVsZHM/OiBzdHJpbmdbXSk6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB7XG4gICAgICAgIGlmICghZ3JvdXBJdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25UcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShncm91cEl0ZW0ub3BlcmF0b3IsIHVuZGVmaW5lZCwgZW50aXR5LCByZXR1cm5GaWVsZHMpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBncm91cEl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YlRyZWUgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25UcmVlRnJvbUdyb3VwSXRlbSgoaXRlbSBhcyBFeHByZXNzaW9uR3JvdXBJdGVtKSwgZW50aXR5LCByZXR1cm5GaWVsZHMpO1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goc3ViVHJlZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goKGl0ZW0gYXMgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKS5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleHByZXNzaW9uVHJlZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUNvbnRleHRNZW51KCkge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsR3JvdXAgPSB0aGlzLmZpbmRTaW5nbGVTZWxlY3RlZEdyb3VwKCk7XG5cbiAgICAgICAgaWYgKGNvbnRleHR1YWxHcm91cCB8fCB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0dWFsR3JvdXAgPSBjb250ZXh0dWFsR3JvdXA7XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0dWFsR3JvdXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZ0xvZ2ljcyA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2ZpbHRlcl9vcGVyYXRvcl9hbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogY29udGV4dHVhbEdyb3VwLm9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5BbmRcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2ZpbHRlcl9vcGVyYXRvcl9vcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBjb250ZXh0dWFsR3JvdXAub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLk9yXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGV4dE1lbnVUb2dnbGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVUb2dnbGUuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZmluZFNpbmdsZVNlbGVjdGVkR3JvdXAoKTogRXhwcmVzc2lvbkdyb3VwSXRlbSB7XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fc2VsZWN0ZWRHcm91cHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5zQWxsU2VsZWN0ZWRFeHByZXNzaW9ucyA9IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5ldmVyeShvcCA9PiB0aGlzLmlzSW5zaWRlR3JvdXAob3AsIGdyb3VwKSk7XG5cbiAgICAgICAgICAgIGlmIChjb250YWluc0FsbFNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5zaWRlR3JvdXAoaXRlbTogRXhwcmVzc2lvbkl0ZW0sIGdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0ucGFyZW50ID09PSBncm91cCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pc0luc2lkZUdyb3VwKGl0ZW0ucGFyZW50LCBncm91cCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWxldGVJdGVtKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25JdGVtLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtID09PSB0aGlzLmN1cnJlbnRHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSB0aGlzLmN1cnJlbnRHcm91cC5wYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGV4cHJlc3Npb25JdGVtLnBhcmVudC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5leHByZXNzaW9uVHJlZSA/IHRoaXMuZXhwcmVzc2lvblRyZWUuZW50aXR5IDogbnVsbDtcbiAgICAgICAgY29uc3QgcmV0dXJuRmllbGRzID0gdGhpcy5leHByZXNzaW9uVHJlZSA/IHRoaXMuZXhwcmVzc2lvblRyZWUucmV0dXJuRmllbGRzIDogbnVsbDtcbiAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25UcmVlRnJvbUdyb3VwSXRlbSh0aGlzLnJvb3RHcm91cCwgZW50aXR5LCByZXR1cm5GaWVsZHMpOyAvLyBUT0RPOiBkb24ndCByZWNyZWF0ZSBpZiBub3QgbmVjZXNzYXJ5XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByZXNzaW9uSXRlbS5wYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uVHJlZUNoYW5nZS5lbWl0KHRoaXMuX2V4cHJlc3Npb25UcmVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUdyb3VwKG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYykge1xuICAgICAgICBjb25zdCBjaGlwcyA9IHRoaXMuY2hpcHMudG9BcnJheSgpO1xuICAgICAgICBjb25zdCBtaW5JbmRleCA9IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5yZWR1Y2UoKGksIGUpID0+IE1hdGgubWluKGksIGNoaXBzLmZpbmRJbmRleChjID0+IGMuZGF0YSA9PT0gZSkpLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgY29uc3QgZmlyc3RFeHByZXNzaW9uID0gY2hpcHNbbWluSW5kZXhdLmRhdGE7XG5cbiAgICAgICAgY29uc3QgcGFyZW50ID0gZmlyc3RFeHByZXNzaW9uLnBhcmVudDtcbiAgICAgICAgY29uc3QgZ3JvdXBJdGVtID0gbmV3IEV4cHJlc3Npb25Hcm91cEl0ZW0ob3BlcmF0b3IsIHBhcmVudCk7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihmaXJzdEV4cHJlc3Npb24pO1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBncm91cEl0ZW0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIGdyb3VwSXRlbS5jaGlsZHJlbi5wdXNoKGV4cHIpO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVJdGVtKGV4cHIpO1xuICAgICAgICAgICAgZXhwci5wYXJlbnQgPSBncm91cEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVHcm91cChncm91cEl0ZW06IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcbiAgICAgICAgaWYgKGdyb3VwSXRlbS5jaGlsZHJlbiAmJiBncm91cEl0ZW0uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUdyb3VwUmVjdXJzaXZlKGdyb3VwSXRlbSwgIWdyb3VwSXRlbS5zZWxlY3RlZCk7XG4gICAgICAgICAgICBpZiAoIWdyb3VwSXRlbS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RQYXJlbnRSZWN1cnNpdmUoZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29udGV4dE1lbnUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlR3JvdXBSZWN1cnNpdmUoZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtLCBzZWxlY3RlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAoZ3JvdXBJdGVtLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkge1xuICAgICAgICAgICAgZ3JvdXBJdGVtLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG5cbiAgICAgICAgICAgIGlmIChncm91cEl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEdyb3Vwcy5wdXNoKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fc2VsZWN0ZWRHcm91cHMuaW5kZXhPZihncm91cEl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkR3JvdXBzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgZ3JvdXBJdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUdyb3VwUmVjdXJzaXZlKGV4cHIsIHNlbGVjdGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlcmFuZEV4cHJlc3Npb24gPSBleHByIGFzIEV4cHJlc3Npb25PcGVyYW5kSXRlbTtcbiAgICAgICAgICAgICAgICBpZiAob3BlcmFuZEV4cHJlc3Npb24uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlRXhwcmVzc2lvbihvcGVyYW5kRXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZXhwcmVzc2lvbkl0ZW0ucGFyZW50O1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBpZiAocGFyZW50LnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50LnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZEdyb3Vwcy5pbmRleE9mKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRHcm91cHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RQYXJlbnRSZWN1cnNpdmUocGFyZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29udGV4dE1lbnVUYXJnZXQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmV4cHJlc3Npb25zQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGNoaXBzID0gdGhpcy5jaGlwcy5maWx0ZXIoYyA9PiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMuaW5kZXhPZihjLmRhdGEpICE9PSAtMSk7XG4gICAgICAgIGxldCBtaW5Ub3AgPSBjaGlwcy5yZWR1Y2UoKHQsIGMpID0+XG4gICAgICAgICAgICBNYXRoLm1pbih0LCBjLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wKSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIG1pblRvcCA9IE1hdGgubWF4KGNvbnRhaW5lclJlY3QudG9wLCBtaW5Ub3ApO1xuICAgICAgICBtaW5Ub3AgPSBNYXRoLm1pbihjb250YWluZXJSZWN0LmJvdHRvbSwgbWluVG9wKTtcbiAgICAgICAgbGV0IG1heFJpZ2h0ID0gY2hpcHMucmVkdWNlKChyLCBjKSA9PlxuICAgICAgICAgICAgTWF0aC5tYXgociwgYy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSwgMCk7XG4gICAgICAgIG1heFJpZ2h0ID0gTWF0aC5tYXgobWF4UmlnaHQsIGNvbnRhaW5lclJlY3QubGVmdCk7XG4gICAgICAgIG1heFJpZ2h0ID0gTWF0aC5taW4obWF4UmlnaHQsIGNvbnRhaW5lclJlY3QucmlnaHQpO1xuICAgICAgICB0aGlzLl9vdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gbmV3IFBvaW50KG1heFJpZ2h0LCBtaW5Ub3ApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsRWxlbWVudEludG9WaWV3KHRhcmdldDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5leHByZXNzaW9uc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCB0YXJnZXRPZmZzZXQgPSB0YXJnZXQub2Zmc2V0VG9wIC0gY29udGFpbmVyLm9mZnNldFRvcDtcbiAgICAgICAgY29uc3QgZGVsdGEgPSAxMDtcblxuICAgICAgICBpZiAoY29udGFpbmVyLnNjcm9sbFRvcCArIGRlbHRhID4gdGFyZ2V0T2Zmc2V0KSB7XG4gICAgICAgICAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gdGFyZ2V0T2Zmc2V0IC0gZGVsdGE7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyLnNjcm9sbFRvcCArIGNvbnRhaW5lci5jbGllbnRIZWlnaHQgPCB0YXJnZXRPZmZzZXQgKyB0YXJnZXQub2Zmc2V0SGVpZ2h0ICsgZGVsdGEpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSB0YXJnZXRPZmZzZXQgKyB0YXJnZXQub2Zmc2V0SGVpZ2h0ICsgZGVsdGEgLSBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGluaXQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG4gICAgICAgIHRoaXMuY2FuY2VsT3BlcmFuZEVkaXQoKTtcbiAgICAgICAgdGhpcy5yb290R3JvdXAgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0odGhpcy5leHByZXNzaW9uVHJlZSk7XG4gICAgICAgIHRoaXMuY3VycmVudEdyb3VwID0gdGhpcy5yb290R3JvdXA7XG4gICAgfVxufVxuXG4iLCI8bmctdGVtcGxhdGUgI2FkZEljb24+XG4gICAgPGlneC1pY29uIGZhbWlseT1cImRlZmF1bHRcIiBuYW1lPVwiYWRkXCI+PC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY2xvc2VJY29uPlxuICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cImNsb3NlXCI+PC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXZcbiAgICAjZXhwcmVzc2lvbnNDb250YWluZXJcbiAgICBjbGFzcz1cImlneC1xdWVyeS1idWlsZGVyX19tYWluXCJcbiAgICAoc2Nyb2xsKT1cIm9uRXhwcmVzc2lvbnNTY3JvbGxlZCgpXCJcbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJvb3RHcm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LXF1ZXJ5LWJ1aWxkZXJfX3Jvb3RcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlcl9fcm9vdC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRSb290QW5kR3JvdXBCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRBbmRHcm91cCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJY29uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2FuZF9ncm91cCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkT3JHcm91cCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJY29uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX29yX2dyb3VwIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci1lbXB0eVwiPlxuICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cImlneC1maWx0ZXItZW1wdHlfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2luaXRpYWxfdGV4dCB9fVxuICAgICAgICAgICAgICAgIDwvaDY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI2FkZEV4cHJlc3Npb25zVGVtcGxhdGUgbGV0LWV4cHJlc3Npb25JdGVtIGxldC1hZnRlckV4cHJlc3Npb249XCJhZnRlckV4cHJlc3Npb25cIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICNhZGRDb25kaXRpb25CdXR0b25cbiAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNFZGl0ZWRFeHByZXNzaW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRDb25kaXRpb24oZXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbilcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9hZGRfY29uZGl0aW9uXG4gICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNFZGl0ZWRFeHByZXNzaW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRBbmRHcm91cChleHByZXNzaW9uSXRlbSwgYWZ0ZXJFeHByZXNzaW9uKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJY29uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9hbmRfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFzRWRpdGVkRXhwcmVzc2lvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkT3JHcm91cChleHByZXNzaW9uSXRlbSwgYWZ0ZXJFeHByZXNzaW9uKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJY29uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9vcl9ncm91cCB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSAjb3BlcmFuZFRlbXBsYXRlIGxldC1leHByZXNzaW9uSXRlbT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCIhZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZVwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvbi1pdGVtXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSB0cnVlXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSBmYWxzZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtY2hpcFxuICAgICAgICAgICAgICAgICN0YXJnZXQ9XCJ0b29sdGlwVGFyZ2V0XCJcbiAgICAgICAgICAgICAgICBbaWd4VG9vbHRpcFRhcmdldF09XCJ0b29sdGlwUmVmXCJcbiAgICAgICAgICAgICAgICBbZGF0YV09XCJleHByZXNzaW9uSXRlbVwiXG4gICAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCJpc0luRWRpdE1vZGUoKSA/ICd0cnVlJyA6ICdmYWxzZSdcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJleHByZXNzaW9uSXRlbS5zZWxlY3RlZCAmJiBpc0luRWRpdE1vZGUoKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaW52b2tlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImlzSW5FZGl0TW9kZSgpID8gb25DaGlwQ2xpY2soZXhwcmVzc2lvbkl0ZW0pIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cIm9uQ2hpcERibENsaWNrKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgKHJlbW92ZSk9XCJvbkNoaXBSZW1vdmUoZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2VkKT1cIm9uQ2hpcFNlbGVjdGlvbkVuZCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZ3hQcmVmaXggY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb24tY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ZXhwcmVzc2lvbkl0ZW0uZmllbGRMYWJlbCB8fCBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZX19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19leHByZXNzaW9uLWNvbmRpdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uY29uZGl0aW9uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgaWd4U3VmZml4XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57e2V4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZS5lbnRpdHl9fTwvc3Ryb25nPiZuYnNwOy8ge3tmb3JtYXRSZXR1cm5GaWVsZHMoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlKX19XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0RhdGUoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRGb3JtYXR0ZXIoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZmllbGRGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0Rm9ybWF0dGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0Rm9ybWF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMubG9jYWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9pZ3gtY2hpcD5cbiAgICAgICAgICAgIDxkaXYgI3Rvb2x0aXBSZWY9XCJ0b29sdGlwXCIgaWd4VG9vbHRpcD5cbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlLnJldHVybkZpZWxkcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5ID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25kaXRpb25GcmllbmRseU5hbWUoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19leHByZXNzaW9uLWFjdGlvbnNcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIChleHByZXNzaW9uSXRlbS5zZWxlY3RlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFeHByZXNzaW9ucy5sZW5ndGggPT09IDEpIHx8XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmhvdmVyZWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnZva2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbnRlckV4cHJlc3Npb25FZGl0KGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHk9XCJkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJhZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaW52b2tlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW50ZXJFeHByZXNzaW9uQWRkKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFleHByZXNzaW9uSXRlbS5pbkFkZE1vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwcmVzc2lvbkl0ZW0ucGFyZW50ICE9PSBjdXJyZW50R3JvdXAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0gIT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXAuY2hpbGRyZW5bXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLmNoaWxkcmVuLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlneEJ1dHRvbiBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZGV0YWlscy1idXR0b25cIiAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlICYmIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZGVyQ2xpY2soJGV2ZW50LCBleHByZXNzaW9uSXRlbSlcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e3RoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RldGFpbHN9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24gKm5nSWY9XCIhZXhwcmVzc2lvbkl0ZW0uZXhwYW5kZWRcIiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cInVuZm9sZF9sZXNzXCIgcm9sZT1cImJ1dHRvblwiPjwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0uZXhwYW5kZWRcIiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cInVuZm9sZF9tb3JlXCIgcm9sZT1cImJ1dHRvblwiPjwvaWd4LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGVcIlxuICAgICAgICAgICAgI2VkaXRpbmdJbnB1dHNDb250YWluZXJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHNcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LXNlbGVjdFxuICAgICAgICAgICAgICAgICNmaWVsZFNlbGVjdFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwiZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3NcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWVsZHNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBpZ3hMYWJlbD57e3RoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbHVtbl9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aWd4LXNlbGVjdC1pdGVtICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHNcIiBbdmFsdWVdPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfHwgZmllbGQuaGVhZGVyIHx8IGZpZWxkLmZpZWxkIH19XG4gICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxpZ3gtc2VsZWN0XG4gICAgICAgICAgICAgICAgI2NvbmRpdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwiY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQ29uZGl0aW9uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkRmllbGRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBpZ3hMYWJlbD57e3RoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbmRpdGlvbl9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aWd4LXByZWZpeFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uU2VsZWN0LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKGNvbmRpdGlvblNlbGVjdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25TZWxlY3QudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmljb25OYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPC9pZ3gtcHJlZml4PlxuXG4gICAgICAgICAgICAgICAgPGlneC1zZWxlY3QtaXRlbVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29uZGl0aW9uIG9mIGdldENvbmRpdGlvbkxpc3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb25kaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJnZXRDb25kaXRpb25GcmllbmRseU5hbWUoY29uZGl0aW9uKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi1pdGVtc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oY29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmljb25OYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlneC1ncmlkX19maWx0ZXJpbmctZHJvcGRvd24tdGV4dFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2lneC1zZWxlY3QtaXRlbT5cbiAgICAgICAgICAgIDwvaWd4LXNlbGVjdD5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbHVlVGVtcGxhdGUgPyBzZWFyY2hWYWx1ZVRlbXBsYXRlIDogZGVmYXVsdFNlYXJjaFZhbHVlVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGdldFNlYXJjaFZhbHVlVGVtcGxhdGVDb250ZXh0KGRlZmF1bHRTZWFyY2hWYWx1ZVRlbXBsYXRlKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U2VhcmNoVmFsdWVUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8aWd4LWlucHV0LWdyb3VwXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09ICdkYXRlJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09ICd0aW1lJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09ICdkYXRlVGltZScpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7dGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfdmFsdWVfcGxhY2Vob2xkZXJ9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgI3NlYXJjaFZhbHVlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHNlbGVjdGVkQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb25kaXRpb24gPT09ICdpbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbmRpdGlvbiA9PT0gJ25vdEluJ1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQgJiYgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0ZXh0J1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWUudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvaWd4LWlucHV0LWdyb3VwPlxuXG4gICAgICAgICAgICAgICAgPGlneC1kYXRlLXBpY2tlclxuICAgICAgICAgICAgICAgICAgICAjcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWFyY2hWYWx1ZS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9wZW5QaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwaWNrZXIub3BlbigpXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGF0ZV9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkQ29uZGl0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oc2VsZWN0ZWRDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc1VuYXJ5KVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cInRoaXMubG9jYWxlXCJcbiAgICAgICAgICAgICAgICAgICAgW291dGxldF09XCJwaWNrZXJPdXRsZXRcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybWF0dGVyXT1cInNlbGVjdGVkRmllbGQuZm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5waXBlQXJncy5mb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICBbd2Vla1N0YXJ0XT1cInNlbGVjdGVkRmllbGQucGlwZUFyZ3Mud2Vla1N0YXJ0XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBkZWZhdWx0IGljb25zIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LXBpY2tlci10b2dnbGU+PC9pZ3gtcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1waWNrZXItY2xlYXI+PC9pZ3gtcGlja2VyLWNsZWFyPlxuICAgICAgICAgICAgICAgIDwvaWd4LWRhdGUtcGlja2VyPlxuXG4gICAgICAgICAgICAgICAgPGlneC10aW1lLXBpY2tlclxuICAgICAgICAgICAgICAgICAgICAjcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAndGltZSdcIlxuICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWFyY2hWYWx1ZS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwaWNrZXIub3BlbigpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib3BlblBpY2tlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZENvbmRpdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHNlbGVjdGVkQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNVbmFyeSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW2xvY2FsZV09XCJ0aGlzLmxvY2FsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtvdXRsZXRdPVwicGlja2VyT3V0bGV0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdHRlcl09XCJzZWxlY3RlZEZpZWxkLmZvcm1hdHRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtpbnB1dEZvcm1hdF09XCJzZWxlY3RlZEZpZWxkLmRlZmF1bHRUaW1lRm9ybWF0XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBkZWZhdWx0IGljb25zIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgaWd4TGFiZWw+e3t0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl90aW1lX3BsYWNlaG9sZGVyfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LXBpY2tlci10b2dnbGU+PC9pZ3gtcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1waWNrZXItY2xlYXI+PC9pZ3gtcGlja2VyLWNsZWFyPlxuICAgICAgICAgICAgICAgIDwvaWd4LXRpbWUtcGlja2VyPlxuXG4gICAgICAgICAgICAgICAgPGlneC1pbnB1dC1ncm91cFxuICAgICAgICAgICAgICAgICAgICAjaW5wdXRHcm91cFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEZpZWxkICYmIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICdkYXRlVGltZSdcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBpZ3hMYWJlbD57e3RoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RhdGVfcGxhY2Vob2xkZXJ9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZ3hJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWUudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkQ29uZGl0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihzZWxlY3RlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc1VuYXJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZ3hEYXRlVGltZUVkaXRvcl09XCJzZWxlY3RlZEZpZWxkLmRlZmF1bHREYXRlVGltZUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9pZ3gtaW5wdXQtZ3JvdXA+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHMtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGlneEljb25CdXR0b249XCJmbGF0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFvcGVyYW5kQ2FuQmVDb21taXR0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb21taXRPcGVyYW5kRWRpdCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cImNvbmZpcm1cIj48L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGlneEljb25CdXR0b249XCJmbGF0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9wZXJhbmRFZGl0KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNsb3NlSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGUgJiYgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlKSB8fCAoZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZSAmJiAoc2VsZWN0ZWRDb25kaXRpb24gPT09ICdpbicgfHwgc2VsZWN0ZWRDb25kaXRpb24gPT09ICdub3RJbicpKVwiPlxuICAgICAgICAgICAgPGlneC1xdWVyeS1idWlsZGVyLXRyZWVcbiAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlIHx8IGV4cHJlc3Npb25JdGVtLmV4cGFuZGVkID8gJ2Jsb2NrJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgW2VudGl0aWVzXT1cImVudGl0aWVzXCJcbiAgICAgICAgICAgICAgICBbcXVlcnlCdWlsZGVyXT1cInRoaXMucXVlcnlCdWlsZGVyXCJcbiAgICAgICAgICAgICAgICBbcGFyZW50RXhwcmVzc2lvbl09XCJleHByZXNzaW9uSXRlbVwiXG4gICAgICAgICAgICAgICAgW2V4cHJlc3Npb25UcmVlXT1cImV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZVwiXG4gICAgICAgICAgICAgICAgKGluRWRpdE1vZGVDaGFuZ2UpPVwib25JbkVkaXRNb2RlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbc2VhcmNoVmFsdWVUZW1wbGF0ZV09XCJzZWFyY2hWYWx1ZVRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8L2lneC1xdWVyeS1idWlsZGVyLXRyZWU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlXCJcbiAgICAgICAgICAgICNhZGRNb2RlQ29udGFpbmVyXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fYnV0dG9uc1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBhZGRFeHByZXNzaW9uc1RlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHJlc3Npb25JdGVtLnBhcmVudCwgZXhwcmVzc2lvbkl0ZW0pXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hJY29uQnV0dG9uPVwiZmxhdFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9wZXJhbmRBZGQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNsb3NlSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2V4cHJlc3Npb25Hcm91cFRlbXBsYXRlIGxldC1leHByZXNzaW9uSXRlbT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1maWx0ZXItdHJlZVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2xpbmVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tYW5kJzogZXhwcmVzc2lvbkl0ZW0/Lm9wZXJhdG9yID09PSAwLFxuICAgICAgICAgICAgICAgICAgICAnaWd4LWZpbHRlci10cmVlX19saW5lLS1vcic6IGV4cHJlc3Npb25JdGVtPy5vcGVyYXRvciA9PT0gMSxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tc2VsZWN0ZWQnOiBleHByZXNzaW9uSXRlbT8uc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnZva2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cENsaWNrKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHNcIiBbc3R5bGUuZGlzcGxheV09XCIoaXNJbkVkaXRNb2RlKCkgJiYgdGhpcy5lbnRpdGllcy5sZW5ndGggPiAwICYmIHRoaXMuZW50aXRpZXNbMF0ubmFtZSkgPyAnZmxleCcgOiAnbm9uZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5wYXJlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtc2VsZWN0ICNlbnRpdHlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdpbmcpPVwib25FbnRpdHlTZWxlY3RDaGFuZ2luZygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3ZlcmxheVNldHRpbmdzXT1cImVudGl0eVNlbGVjdE92ZXJsYXlTZXR0aW5nc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cImlzSW5FZGl0TW9kZSgpID8gJ2Jsb2NrJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3NlbGVjdF9lbnRpdHkgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtc2VsZWN0LWl0ZW0gKm5nRm9yPVwibGV0IGVudGl0eSBvZiBlbnRpdGllc1wiIFt2YWx1ZV09XCJlbnRpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlbnRpdHkubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY29tYm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0ZWRSZXR1cm5GaWVsZHNDb21ib1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc01heEhlaWdodF09XCIyNTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImZpZWxkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlLZXldPVwiJ2ZpZWxkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlS2V5XT1cIidmaWVsZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRSZXR1cm5GaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwicmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyPVwie3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfc2VhcmNoIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJpc0luRWRpdE1vZGUoKSA/ICdibG9jaycgOiAnbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDb21ib0hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZHJvcC1kb3duX19pdGVtIGlneC1kcm9wLWRvd25fX2l0ZW0tLXF1ZXJ5LWJ1aWxkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0QWxsQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaWd4LWRyb3AtZG93bl9faXRlbS0tc2VsZWN0ZWQnOiB0aGlzLnNlbGVjdGVkRW50aXR5ICYmIHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMgJiYgdGhpcy5zZWxlY3RlZEVudGl0eS5maWVsZHMubGVuZ3RoID09PSB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzLmxlbmd0aH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInRoaXMuc2VsZWN0ZWRFbnRpdHkgJiYgdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkcyAmJiB0aGlzLnNlbGVjdGVkRW50aXR5LmZpZWxkcy5sZW5ndGggPT09IHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwidGhpcy5zZWxlY3RlZEVudGl0eSAmJiB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzICYmIHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzLmxlbmd0aCA8IHRoaXMuc2VsZWN0ZWRFbnRpdHkuZmllbGRzPy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlUmlwcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlneC1jb21ib19fY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1kcm9wLWRvd25fX2lubmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfc2VsZWN0X2FsbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3NlbGVjdF9yZXR1cm5fZmllbGRzIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNvbWJvPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGV4cHIgb2YgZXhwcmVzc2lvbkl0ZW0/LmNoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHByZXNzaW9uR3JvdXAoZXhwcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBleHByZXNzaW9uR3JvdXBUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wZXJhbmRUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHIpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50R3JvdXAgPT09IGV4cHJlc3Npb25JdGVtICYmIGlzSW5FZGl0TW9kZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgI2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2J1dHRvbnNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHByZXNzaW9uc1RlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQoZXhwcmVzc2lvbkl0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJleHByZXNzaW9uSXRlbSAhPT0gcm9vdEdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNFZGl0ZWRFeHByZXNzaW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uY2hpbGRyZW4ubGVuZ3RoIDwgMlxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbmRHcm91cChleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2VuZF9ncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm9vdEdyb3VwXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbkdyb3VwVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dChyb290R3JvdXApXG4gICAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2XG4gICAgICAgIGlneFRvZ2dsZVxuICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItY29udGV4dHVhbC1tZW51XCJcbiAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgICAoY2xvc2VkKT1cImNvbnRleHRNZW51Q2xvc2VkKClcIlxuICAgID5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGlneEljb25CdXR0b249XCJmbGF0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVfX2Nsb3NlLWJ0blwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWxlY3Rpb24oKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjbG9zZUljb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRleHR1YWxHcm91cFwiPlxuICAgICAgICAgICAgPGlneC1idXR0b25ncm91cFxuICAgICAgICAgICAgICAgIFt2YWx1ZXNdPVwiZmlsdGVyaW5nTG9naWNzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdEZpbHRlcmluZ0xvZ2ljKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9pZ3gtYnV0dG9uZ3JvdXA+XG5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY29udGV4dHVhbEdyb3VwLnBhcmVudFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVuZ3JvdXAoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImRlZmF1bHRcIiBuYW1lPVwidW5ncm91cFwiPjwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfdW5ncm91cFxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlR3JvdXAoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLWNvbnRleHR1YWwtbWVudV9fZGVsZXRlLWJ0blwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImRlZmF1bHRcIiBuYW1lPVwiZGVsZXRlXCI+PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9kZWxldGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGV4dHVhbEdyb3VwXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlQW5kR3JvdXAoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfY3JlYXRlX2FuZF9ncm91cCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlT3JHcm91cCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9jcmVhdGVfb3JfZ3JvdXAgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLWNvbnRleHR1YWwtbWVudV9fZGVsZXRlLWJ0blwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGVsZXRlX2ZpbHRlcnMgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2XG4gICAgI292ZXJsYXlPdXRsZXRcbiAgICBpZ3hPdmVybGF5T3V0bGV0XG4gICAgY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlcl9fb3V0bGV0XCJcbiAgICAocG9pbnRlcmRvd24pPVwib25PdXRsZXRQb2ludGVyRG93bigkZXZlbnQpXCJcbj48L2Rpdj5cblxuPGlneC1kaWFsb2dcbiAgICAjZW50aXR5Q2hhbmdlRGlhbG9nXG4gICAgdGl0bGU9XCJ7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9kaWFsb2dfdGl0bGUgfX1cIlxuICAgIGxlZnRCdXR0b25MYWJlbD1cInt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RpYWxvZ19jYW5jZWwgfX1cIlxuICAgIHJpZ2h0QnV0dG9uTGFiZWw9XCJ7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9kaWFsb2dfY29uZmlybSB9fVwiXG4gICAgKGxlZnRCdXR0b25TZWxlY3QpPVwib25FbnRpdHlDaGFuZ2VDYW5jZWwoKVwiXG4gICAgKHJpZ2h0QnV0dG9uU2VsZWN0KT1cIm9uRW50aXR5Q2hhbmdlQ29uZmlybSgpXCI+XG4gICAgPHNlY3Rpb24gY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlci1kaWFsb2dcIj5cbiAgICAgICAgPHA+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGlhbG9nX21lc3NhZ2UgfX08L3A+XG4gICAgICAgIDxpZ3gtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2hvd0VudGl0eUNoYW5nZURpYWxvZ0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIj5cbiAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RpYWxvZ19jaGVja2JveF90ZXh0IH19XG4gICAgICAgIDwvaWd4LWNoZWNrYm94PlxuICAgIDwvc2VjdGlvbj5cbjwvaWd4LWRpYWxvZz5cbiJdfQ==
|
|
1352
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9xdWVyeS1idWlsZGVyL3F1ZXJ5LWJ1aWxkZXItdHJlZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvcXVlcnktYnVpbGRlci9xdWVyeS1idWlsZGVyLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFlBQVksRUFDWixZQUFZLEVBQ1osU0FBUyxFQUNULE1BQU0sRUFDTixJQUFJLEVBR1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFxQixZQUFZLEVBQWEsVUFBVSxFQUFhLFdBQVcsRUFDOUcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUF5Qix1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBZ0MsNkJBQTZCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVuSCxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFB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ZCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgTE9DQUxFX0lELFxuICAgIE91dHB1dCxcbiAgICBQaXBlLFxuICAgIFBpcGVUcmFuc2Zvcm0sXG4gICAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXRMb2NhbGVGaXJzdERheU9mV2VlaywgTmdJZiwgTmdGb3IsIE5nVGVtcGxhdGVPdXRsZXQsIE5nQ2xhc3MsIERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsIElucHV0LCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBIb3N0QmluZGluZ1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUJ1dHRvbkdyb3VwRXZlbnRBcmdzLCBJZ3hCdXR0b25Hcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2J1dHRvbkdyb3VwL2J1dHRvbkdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDaGlwQ29tcG9uZW50IH0gZnJvbSAnLi4vY2hpcHMvY2hpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSVF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5ncywgUXVlcnlCdWlsZGVyUmVzb3VyY2VTdHJpbmdzRU4gfSBmcm9tICcuLi9jb3JlL2kxOG4vcXVlcnktYnVpbGRlci1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgRGF0YVV0aWwgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLCBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZCwgSWd4RGF0ZVRpbWVGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hOdW1iZXJGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hUaW1lRmlsdGVyaW5nT3BlcmFuZCB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IEZpbHRlcmluZ0xvZ2ljLCBJRmlsdGVyaW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBJRXhwcmVzc2lvblRyZWUsIElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgSWd4RGF0ZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IElneEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvYnV0dG9uL2J1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4RGF0ZVRpbWVFZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2RhdGUtdGltZS1lZGl0b3IvZGF0ZS10aW1lLWVkaXRvci5kaXJlY3RpdmUnO1xuXG5pbXBvcnQgeyBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBJZ3hUb2dnbGVBY3Rpb25EaXJlY3RpdmUsIElneFRvZ2dsZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdG9nZ2xlL3RvZ2dsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmllbGRUeXBlLCBFbnRpdHlUeXBlIH0gZnJvbSAnLi4vZ3JpZHMvY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneFNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IEhvcml6b250YWxBbGlnbm1lbnQsIE92ZXJsYXlTZXR0aW5ncywgUG9pbnQsIFZlcnRpY2FsQWxpZ25tZW50IH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSwgQXV0b1Bvc2l0aW9uU3RyYXRlZ3ksIENsb3NlU2Nyb2xsU3RyYXRlZ3ksIENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7IElneFRpbWVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4UGlja2VyVG9nZ2xlQ29tcG9uZW50LCBJZ3hQaWNrZXJDbGVhckNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtY29tbW9uL3BpY2tlci1pY29ucy5jb21tb24nO1xuaW1wb3J0IHsgSWd4SW5wdXREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2lucHV0L2lucHV0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vaW5wdXQtZ3JvdXAvaW5wdXQtZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneFNlbGVjdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9zZWxlY3Qvc2VsZWN0LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IElneFN1ZmZpeERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvc3VmZml4L3N1ZmZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4UHJlZml4RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9wcmVmaXgvcHJlZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBJZ3hJY29uQnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vaWNvbi1idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IElneENvbWJvQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbWJvL2NvbWJvLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSWd4TGFiZWxEaXJlY3RpdmUgfSBmcm9tICcuLi9pbnB1dC1ncm91cC9wdWJsaWNfYXBpJztcbmltcG9ydCB7IElneENvbWJvSGVhZGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vY29tYm8vcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MsIElneENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSWd4RGlhbG9nQ29tcG9uZW50IH0gZnJvbSBcIi4uL2RpYWxvZy9kaWFsb2cuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJU2VsZWN0aW9uRXZlbnRBcmdzIH0gZnJvbSAnLi4vZHJvcC1kb3duL2Ryb3AtZG93bi5jb21tb24nO1xuaW1wb3J0IHsgSWd4VG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hUb29sdGlwVGFyZ2V0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90b29sdGlwL3Rvb2x0aXAtdGFyZ2V0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hRdWVyeUJ1aWxkZXJTZWFyY2hWYWx1ZVRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyLmRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgSWd4UXVlcnlCdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyLmNvbXBvbmVudCc7XG5cbmNvbnN0IERFRkFVTFRfUElQRV9EQVRFX0ZPUk1BVCA9ICdtZWRpdW1EYXRlJztcbmNvbnN0IERFRkFVTFRfUElQRV9USU1FX0ZPUk1BVCA9ICdtZWRpdW1UaW1lJztcbmNvbnN0IERFRkFVTFRfUElQRV9EQVRFX1RJTUVfRk9STUFUID0gJ21lZGl1bSc7XG5jb25zdCBERUZBVUxUX1BJUEVfRElHSVRTX0lORk8gPSAnMS4wLTMnO1xuY29uc3QgREVGQVVMVF9EQVRFX1RJTUVfRk9STUFUID0gJ2RkL01NL3l5eXkgSEg6bW06c3MgYSc7XG5jb25zdCBERUZBVUxUX1RJTUVfRk9STUFUID0gJ2hoOm1tOnNzIGEnO1xuXG5AUGlwZSh7XG4gICAgbmFtZTogJ2ZpZWxkRm9ybWF0dGVyJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIElneEZpZWxkRm9ybWF0dGVyUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gICAgcHVibGljIHRyYW5zZm9ybSh2YWx1ZTogYW55LCBmb3JtYXR0ZXI6ICh2OiBhbnksIGRhdGE6IGFueSwgZmllbGREYXRhPzogYW55KSA9PiBhbnksIHJvd0RhdGE6IGFueSwgZmllbGREYXRhPzogYW55KSB7XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZXIodmFsdWUsIHJvd0RhdGEsIGZpZWxkRGF0YSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW4gQGludGVybmFsXG4gKlxuICogSW50ZXJuYWwgY2xhc3MgdXNhZ2VcbiAqL1xuY2xhc3MgRXhwcmVzc2lvbkl0ZW0ge1xuICAgIHB1YmxpYyBwYXJlbnQ6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG4gICAgcHVibGljIHNlbGVjdGVkOiBib29sZWFuO1xuICAgIHB1YmxpYyBleHBhbmRlZDogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICpcbiAqIEludGVybmFsIGNsYXNzIHVzYWdlXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25Hcm91cEl0ZW0gZXh0ZW5kcyBFeHByZXNzaW9uSXRlbSB7XG4gICAgcHVibGljIG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYztcbiAgICBwdWJsaWMgY2hpbGRyZW46IEV4cHJlc3Npb25JdGVtW107XG4gICAgY29uc3RydWN0b3Iob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLCBwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCk7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICpcbiAqIEludGVybmFsIGNsYXNzIHVzYWdlXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25PcGVyYW5kSXRlbSBleHRlbmRzIEV4cHJlc3Npb25JdGVtIHtcbiAgICBwdWJsaWMgZXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgcHVibGljIGluRWRpdE1vZGU6IGJvb2xlYW47XG4gICAgcHVibGljIGluQWRkTW9kZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgaG92ZXJlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgZmllbGRMYWJlbDogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uLCBwYXJlbnQ6IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50KTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LXF1ZXJ5LWJ1aWxkZXItdHJlZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3F1ZXJ5LWJ1aWxkZXItdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gICAgaG9zdDogeyAnY2xhc3MnOiAnaWd4LXF1ZXJ5LWJ1aWxkZXItdHJlZScgfSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTmdJZixcbiAgICAgICAgSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50LFxuICAgICAgICBJZ3hCdXR0b25EaXJlY3RpdmUsXG4gICAgICAgIElneEljb25Db21wb25lbnQsXG4gICAgICAgIElneENoaXBDb21wb25lbnQsXG4gICAgICAgIElneFByZWZpeERpcmVjdGl2ZSxcbiAgICAgICAgSWd4U3VmZml4RGlyZWN0aXZlLFxuICAgICAgICBJZ3hTZWxlY3RDb21wb25lbnQsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBOZ0ZvcixcbiAgICAgICAgSWd4U2VsZWN0SXRlbUNvbXBvbmVudCxcbiAgICAgICAgSWd4SW5wdXRHcm91cENvbXBvbmVudCxcbiAgICAgICAgSWd4SW5wdXREaXJlY3RpdmUsXG4gICAgICAgIElneERhdGVQaWNrZXJDb21wb25lbnQsXG4gICAgICAgIElneFBpY2tlclRvZ2dsZUNvbXBvbmVudCxcbiAgICAgICAgSWd4UGlja2VyQ2xlYXJDb21wb25lbnQsXG4gICAgICAgIElneFRpbWVQaWNrZXJDb21wb25lbnQsXG4gICAgICAgIElneERhdGVUaW1lRWRpdG9yRGlyZWN0aXZlLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBJZ3hUb2dnbGVEaXJlY3RpdmUsXG4gICAgICAgIElneEJ1dHRvbkdyb3VwQ29tcG9uZW50LFxuICAgICAgICBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLFxuICAgICAgICBEYXRlUGlwZSxcbiAgICAgICAgSWd4RmllbGRGb3JtYXR0ZXJQaXBlLFxuICAgICAgICBJZ3hJY29uQnV0dG9uRGlyZWN0aXZlLFxuICAgICAgICBJZ3hUb2dnbGVBY3Rpb25EaXJlY3RpdmUsXG4gICAgICAgIElneENvbWJvQ29tcG9uZW50LFxuICAgICAgICBJZ3hMYWJlbERpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9IZWFkZXJEaXJlY3RpdmUsXG4gICAgICAgIElneENoZWNrYm94Q29tcG9uZW50LFxuICAgICAgICBJZ3hEaWFsb2dDb21wb25lbnQsXG4gICAgICAgIElneFRvb2x0aXBUYXJnZXREaXJlY3RpdmUsXG4gICAgICAgIElneFRvb2x0aXBEaXJlY3RpdmVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIElneFF1ZXJ5QnVpbGRlclRyZWVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIHB1YmxpYyBnZXQgZ2V0Q2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBgaWd4LXF1ZXJ5LWJ1aWxkZXItdHJlZS0tbGV2ZWwtJHt0aGlzLmxldmVsfWA7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZW50aXRpZXM6IEVudGl0eVR5cGVbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHF1ZXJ5QnVpbGRlcjogSWd4UXVlcnlCdWlsZGVyQ29tcG9uZW50O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2VhcmNoVmFsdWVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4UXVlcnlCdWlsZGVyU2VhcmNoVmFsdWVUZW1wbGF0ZURpcmVjdGl2ZT4gPSBudWxsO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBhcmVudEV4cHJlc3Npb24oKTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudEV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYXJlbnRFeHByZXNzaW9uKHZhbHVlOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5fcGFyZW50RXhwcmVzc2lvbiA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgZmllbGRzLlxuICAgICovXG4gICAgcHVibGljIGdldCBmaWVsZHMoKTogRmllbGRUeXBlW10ge1xuICAgICAgICBpZiAoIXRoaXMuX2ZpZWxkcyAmJiB0aGlzLmVudGl0aWVzPy5sZW5ndGggPT09IDEgJiYgIXRoaXMuZW50aXRpZXNbMF0/Lm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpZWxkcyA9IHRoaXMuZW50aXRpZXNbMF0uZmllbGRzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBmaWVsZHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGZpZWxkcyhmaWVsZHM6IEZpZWxkVHlwZVtdKSB7XG4gICAgICAgIHRoaXMuX2ZpZWxkcyA9IGZpZWxkcztcblxuICAgICAgICBpZiAoIXRoaXMuX2ZpZWxkcyAmJiB0aGlzLmVudGl0aWVzPy5sZW5ndGggPT09IDEgJiYgIXRoaXMuZW50aXRpZXNbMF0/Lm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpZWxkcyA9IHRoaXMuZW50aXRpZXNbMF0uZmllbGRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcykge1xuICAgICAgICAgICAgdGhpcy5fZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVycyhmaWVsZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtYXQoZmllbGQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gdHJlZS5cbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXhwcmVzc2lvblRyZWUoKTogSUV4cHJlc3Npb25UcmVlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cHJlc3Npb25UcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGV4cHJlc3Npb24gdHJlZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZXhwcmVzc2lvblRyZWUoZXhwcmVzc2lvblRyZWU6IElFeHByZXNzaW9uVHJlZSkge1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZXhwcmVzc2lvblRyZWUpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLl9leHByZXNzaW9uVHJlZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gZXhwcmVzc2lvblRyZWU7XG4gICAgICAgICAgICBpZiAoIWV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbnRpdHkgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYGxvY2FsZWAgb2YgdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gYXBwbGljYXRpb24ncyBsb2NhbGUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBsb2NhbGVgIG9mIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIEV4cGVjdHMgYSB2YWxpZCBCQ1AgNDcgbGFuZ3VhZ2UgdGFnLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbG9jYWxlID0gdmFsdWU7XG4gICAgICAgIC8vIGlmIHZhbHVlIGlzIGludmFsaWQsIHNldCBpdCBiYWNrIHRvIF9sb2NhbGVJZFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZ2V0TG9jYWxlRmlyc3REYXlPZldlZWsodGhpcy5fbG9jYWxlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gdGhpcy5fbG9jYWxlSWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBFTiByZXNvdXJjZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc291cmNlU3RyaW5ncyh2YWx1ZTogSVF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5ncykge1xuICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9yZXNvdXJjZVN0cmluZ3MsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElRdWVyeUJ1aWxkZXJSZXNvdXJjZVN0cmluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VTdHJpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIGFzIHRoZSBleHByZXNzaW9uIHRyZWUgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1xdWVyeS1idWlsZGVyIChleHByZXNzaW9uVHJlZUNoYW5nZSk9J29uRXhwcmVzc2lvblRyZWVDaGFuZ2UoKSc+PC9pZ3gtcXVlcnktYnVpbGRlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZXhwcmVzc2lvblRyZWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElFeHByZXNzaW9uVHJlZT4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBpbkVkaXRNb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxFeHByZXNzaW9uT3BlcmFuZEl0ZW0+KCk7XG5cbiAgICBAVmlld0NoaWxkKCdlbnRpdHlTZWxlY3QnLCB7IHJlYWQ6IElneFNlbGVjdENvbXBvbmVudCB9KVxuICAgIHByb3RlY3RlZCBlbnRpdHlTZWxlY3Q6IElneFNlbGVjdENvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm8nLCB7IHJlYWQ6IElneENvbWJvQ29tcG9uZW50IH0pXG4gICAgcHJpdmF0ZSBzZWxlY3RlZFJldHVybkZpZWxkc0NvbWJvOiBJZ3hDb21ib0NvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2ZpZWxkU2VsZWN0JywgeyByZWFkOiBJZ3hTZWxlY3RDb21wb25lbnQgfSlcbiAgICBwcml2YXRlIGZpZWxkU2VsZWN0OiBJZ3hTZWxlY3RDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdjb25kaXRpb25TZWxlY3QnLCB7IHJlYWQ6IElneFNlbGVjdENvbXBvbmVudCB9KVxuICAgIHByaXZhdGUgY29uZGl0aW9uU2VsZWN0OiBJZ3hTZWxlY3RDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdzZWFyY2hWYWx1ZUlucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJpdmF0ZSBzZWFyY2hWYWx1ZUlucHV0OiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgncGlja2VyJylcbiAgICBwcml2YXRlIHBpY2tlcjogSWd4RGF0ZVBpY2tlckNvbXBvbmVudCB8IElneFRpbWVQaWNrZXJDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdhZGRSb290QW5kR3JvdXBCdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcml2YXRlIGFkZFJvb3RBbmRHcm91cEJ1dHRvbjogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ2FkZENvbmRpdGlvbkJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByaXZhdGUgYWRkQ29uZGl0aW9uQnV0dG9uOiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgnZW50aXR5Q2hhbmdlRGlhbG9nJywgeyByZWFkOiBJZ3hEaWFsb2dDb21wb25lbnQgfSlcbiAgICBwcml2YXRlIGVudGl0eUNoYW5nZURpYWxvZzogSWd4RGlhbG9nQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFF1ZXJ5QnVpbGRlckhlYWRlckNvbXBvbmVudClcbiAgICBwdWJsaWMgaGVhZGVyQ29udGVudDogSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnZWRpdGluZ0lucHV0c0NvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBzZXQgZWRpdGluZ0lucHV0c0NvbnRhaW5lcih2YWx1ZTogRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoKHZhbHVlICYmICF0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyKSB8fFxuICAgICAgICAgICAgKHZhbHVlICYmIHRoaXMuX2VkaXRpbmdJbnB1dHNDb250YWluZXIgJiYgdGhpcy5fZWRpdGluZ0lucHV0c0NvbnRhaW5lci5uYXRpdmVFbGVtZW50ICE9PSB2YWx1ZS5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyh2YWx1ZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZWRpdGluZ0lucHV0c0NvbnRhaW5lciA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIGdldCBlZGl0aW5nSW5wdXRzQ29udGFpbmVyKCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdGluZ0lucHV0c0NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKCdhZGRNb2RlQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIHNldCBhZGRNb2RlQ29udGFpbmVyKHZhbHVlOiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmICgodmFsdWUgJiYgIXRoaXMuX2FkZE1vZGVDb250YWluZXIpIHx8XG4gICAgICAgICAgICAodmFsdWUgJiYgdGhpcy5fYWRkTW9kZUNvbnRhaW5lciAmJiB0aGlzLl9hZGRNb2RlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgIT09IHZhbHVlLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KHZhbHVlLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hZGRNb2RlQ29udGFpbmVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGFkZE1vZGVDb250YWluZXIoKTogRWxlbWVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRNb2RlQ29udGFpbmVyO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcm90ZWN0ZWQgc2V0IGN1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIodmFsdWU6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKCh2YWx1ZSAmJiAhdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcikgfHxcbiAgICAgICAgICAgICh2YWx1ZSAmJiB0aGlzLl9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyICYmIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIubmF0aXZlRWxlbWVudCAhPT0gdmFsdWUubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcodmFsdWUubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCBnZXQgY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXI7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZChJZ3hUb2dnbGVEaXJlY3RpdmUpXG4gICAgcHJpdmF0ZSBjb250ZXh0TWVudVRvZ2dsZTogSWd4VG9nZ2xlRGlyZWN0aXZlO1xuXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hDaGlwQ29tcG9uZW50KVxuICAgIHByaXZhdGUgY2hpcHM6IFF1ZXJ5TGlzdDxJZ3hDaGlwQ29tcG9uZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2V4cHJlc3Npb25zQ29udGFpbmVyJylcbiAgICBwcml2YXRlIGV4cHJlc3Npb25zQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgnb3ZlcmxheU91dGxldCcsIHsgcmVhZDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBvdmVybGF5T3V0bGV0OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlO1xuXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hRdWVyeUJ1aWxkZXJUcmVlQ29tcG9uZW50KVxuICAgIHByaXZhdGUgaW5uZXJRdWVyaWVzOiBRdWVyeUxpc3Q8SWd4UXVlcnlCdWlsZGVyVHJlZUNvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb290R3JvdXA6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZEV4cHJlc3Npb25zOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW1bXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY3VycmVudEdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dHVhbEdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyaW5nTG9naWNzO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0ZWRDb25kaXRpb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlYXJjaFZhbHVlOiB7IHZhbHVlOiBhbnkgfSA9IHsgdmFsdWU6IG51bGwgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHBpY2tlck91dGxldDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB8IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXR1cm5GaWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVudGl0eVNlbGVjdE92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWVcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWVcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIF9wYXJlbnRFeHByZXNzaW9uOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG4gICAgcHJpdmF0ZSBfaW5pdGlhbEV4cHJlc3Npb25UcmVlOiBJRXhwcmVzc2lvblRyZWU7XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRFbnRpdHk6IEVudGl0eVR5cGU7XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRSZXR1cm5GaWVsZHM6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgX3NlbGVjdGVkRmllbGQ6IEZpZWxkVHlwZTtcbiAgICBwcml2YXRlIF9jbGlja1RpbWVyO1xuICAgIHByaXZhdGUgX2RibENsaWNrRGVsYXkgPSAyMDA7XG4gICAgcHJpdmF0ZSBfcHJldmVudENoaXBDbGljayA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2VkaXRpbmdJbnB1dHNDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgcHJpdmF0ZSBfYWRkTW9kZUNvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgICBwcml2YXRlIF9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgX2FkZE1vZGVFeHByZXNzaW9uOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG4gICAgcHJpdmF0ZSBfZWRpdGVkRXhwcmVzc2lvbjogRXhwcmVzc2lvbk9wZXJhbmRJdGVtO1xuICAgIHByaXZhdGUgX3NlbGVjdGVkR3JvdXBzOiBFeHByZXNzaW9uR3JvdXBJdGVtW10gPSBbXTtcbiAgICBwcml2YXRlIF9leHBhbmRlZEV4cHJlc3Npb25zOiBJRmlsdGVyaW5nRXhwcmVzc2lvbltdID0gW107XG4gICAgcHJpdmF0ZSBfZmllbGRzOiBGaWVsZFR5cGVbXTtcbiAgICBwcml2YXRlIF9leHByZXNzaW9uVHJlZTogSUV4cHJlc3Npb25UcmVlO1xuICAgIHByaXZhdGUgX2xvY2FsZTtcbiAgICBwcml2YXRlIF9lbnRpdHlOZXdWYWx1ZTogRW50aXR5VHlwZTtcbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3MgPSBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzKFF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5nc0VOKTtcblxuICAgIHB1YmxpYyBnZXQgbGV2ZWwoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBsZXQgX2xldmVsID0gMDtcbiAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHBhcmVudC5sb2NhbE5hbWUgPT09ICdpZ3gtcXVlcnktYnVpbGRlci10cmVlJykge1xuICAgICAgICAgICAgICAgIF9sZXZlbCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9sZXZlbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5SaWdodCxcbiAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5Ub3BcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHRoaXMuX3Bvc2l0aW9uU2V0dGluZ3MpLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IENsb3NlU2Nyb2xsU3RyYXRlZ3koKVxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwsXG4gICAgICAgIHByb3RlY3RlZCBlbDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgQEluamVjdChMT0NBTEVfSUQpIHByb3RlY3RlZCBfbG9jYWxlSWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvY2FsZSA9IHRoaXMubG9jYWxlIHx8IHRoaXMuX2xvY2FsZUlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMub3ZlcmxheU91dGxldDtcbiAgICAgICAgdGhpcy5lbnRpdHlTZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMub3ZlcmxheU91dGxldDtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLnJldHVybkZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMub3ZlcmxheU91dGxldDtcbiAgICAgICAgLy8gVHJpZ2dlciBhZGRpdGlvbmFsIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRFbnRpdHkoKTogRW50aXR5VHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEVudGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkVudGl0eVNlbGVjdENoYW5naW5nKGV2ZW50OiBJU2VsZWN0aW9uRXZlbnRBcmdzKSB7XG4gICAgICAgIGV2ZW50LmNhbmNlbCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2VudGl0eU5ld1ZhbHVlID0gZXZlbnQubmV3U2VsZWN0aW9uLnZhbHVlO1xuICAgICAgICBpZiAoZXZlbnQub2xkU2VsZWN0aW9uLnZhbHVlICYmIHRoaXMucXVlcnlCdWlsZGVyLnNob3dFbnRpdHlDaGFuZ2VEaWFsb2cpIHtcbiAgICAgICAgICAgIHRoaXMuZW50aXR5Q2hhbmdlRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25FbnRpdHlDaGFuZ2VDb25maXJtKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG9uU2hvd0VudGl0eUNoYW5nZURpYWxvZ0NoYW5nZShldmVudEFyZ3M6IElDaGFuZ2VDaGVja2JveEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLnF1ZXJ5QnVpbGRlci5zaG93RW50aXR5Q2hhbmdlRGlhbG9nID0gIWV2ZW50QXJncy5jaGVja2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25FbnRpdHlDaGFuZ2VDYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuZW50aXR5Q2hhbmdlRGlhbG9nLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuZW50aXR5U2VsZWN0LmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2VudGl0eU5ld1ZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG9uRW50aXR5Q2hhbmdlQ29uZmlybSgpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbnRpdHkgPSB0aGlzLl9lbnRpdHlOZXdWYWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3RlZEVudGl0eS5maWVsZHMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRW50aXR5LmZpZWxkcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmllbGRzID0gdGhpcy5fZW50aXR5TmV3VmFsdWUgPyB0aGlzLl9lbnRpdHlOZXdWYWx1ZS5maWVsZHMgOiBbXTtcblxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcyA9IHRoaXMuX2VudGl0eU5ld1ZhbHVlLmZpZWxkcz8ubWFwKGYgPT4gZi5maWVsZCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2V4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZS5lbnRpdHkgPSB0aGlzLl9zZWxlY3RlZEVudGl0eS5uYW1lO1xuICAgICAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUucmV0dXJuRmllbGRzID0gW107XG4gICAgICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvblRyZWVDaGFuZ2UuZW1pdCh0aGlzLl9leHByZXNzaW9uVHJlZSk7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkQW5kR3JvdXAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkRmllbGQgPSBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5lbnRpdHlDaGFuZ2VEaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5lbnRpdHlTZWxlY3QuY2xvc2UoKTtcblxuICAgICAgICB0aGlzLl9lbnRpdHlOZXdWYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkUmV0dXJuRmllbGRzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzO1xuXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcyAhPT0gdmFsdWUgJiYgb2xkVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcyA9IHZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fZXhwcmVzc2lvblRyZWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZS5yZXR1cm5GaWVsZHMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25UcmVlQ2hhbmdlLmVtaXQodGhpcy5fZXhwcmVzc2lvblRyZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkUmV0dXJuRmllbGRzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcyA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkc107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldCBzZWxlY3RlZEZpZWxkKHZhbHVlOiBGaWVsZFR5cGUpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9zZWxlY3RlZEZpZWxkO1xuXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZEZpZWxkICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRGaWVsZCA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKG9sZFZhbHVlICYmIHRoaXMuX3NlbGVjdGVkRmllbGQgJiYgdGhpcy5fc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gb2xkVmFsdWUuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRGaWVsZCgpOiBGaWVsZFR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRGaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogdXNlZCBieSB0aGUgZ3JpZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQaWNrZXJPdXRsZXQob3V0bGV0PzogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB8IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5waWNrZXJPdXRsZXQgPSBvdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIHVzZWQgYnkgdGhlIGdyaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzQ29udGV4dE1lbnVWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNFZGl0ZWRFeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQ29uZGl0aW9uKHBhcmVudDogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgY29uc3Qgb3BlcmFuZEl0ZW0gPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKHtcbiAgICAgICAgICAgIGZpZWxkTmFtZTogbnVsbCxcbiAgICAgICAgICAgIGNvbmRpdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGNvbmRpdGlvbk5hbWU6IG51bGwsXG4gICAgICAgICAgICBpZ25vcmVDYXNlOiB0cnVlLFxuICAgICAgICAgICAgc2VhcmNoVmFsOiBudWxsXG4gICAgICAgIH0sIHBhcmVudCk7XG5cbiAgICAgICAgaWYgKGFmdGVyRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihhZnRlckV4cHJlc3Npb24pO1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCArIDEsIDAsIG9wZXJhbmRJdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKG9wZXJhbmRJdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50ZXJFeHByZXNzaW9uRWRpdChvcGVyYW5kSXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQW5kR3JvdXAocGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5hZGRHcm91cChGaWx0ZXJpbmdMb2dpYy5BbmQsIHBhcmVudCwgYWZ0ZXJFeHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRPckdyb3VwKHBhcmVudD86IEV4cHJlc3Npb25Hcm91cEl0ZW0sIGFmdGVyRXhwcmVzc2lvbj86IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIHRoaXMuYWRkR3JvdXAoRmlsdGVyaW5nTG9naWMuT3IsIHBhcmVudCwgYWZ0ZXJFeHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBlbmRHcm91cChncm91cEl0ZW06IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSBncm91cEl0ZW0ucGFyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbW1pdE9wZXJhbmRFZGl0KCkge1xuICAgICAgICBjb25zdCBhY3R1YWxTZWFyY2hWYWx1ZSA9IHRoaXMuc2VhcmNoVmFsdWUudmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uZmllbGROYW1lID0gdGhpcy5zZWxlY3RlZEZpZWxkLmZpZWxkO1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmNvbmRpdGlvbiA9IHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbih0aGlzLnNlbGVjdGVkQ29uZGl0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hWYWwgPSBEYXRhVXRpbC5wYXJzZVZhbHVlKHRoaXMuc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSwgYWN0dWFsU2VhcmNoVmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5maWVsZExhYmVsID0gdGhpcy5zZWxlY3RlZEZpZWxkLmxhYmVsXG4gICAgICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRmllbGQubGFiZWxcbiAgICAgICAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRGaWVsZC5oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRmllbGQuaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5zZWxlY3RlZEZpZWxkLmZpZWxkO1xuXG4gICAgICAgICAgICBjb25zdCBpbm5lclF1ZXJ5ID0gdGhpcy5pbm5lclF1ZXJpZXMuZmlsdGVyKHEgPT4gcS5pc0luRWRpdE1vZGUoKSlbMF1cbiAgICAgICAgICAgIGlmIChpbm5lclF1ZXJ5ICYmICh0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID09PSAnaW4nIHx8IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPT09ICdub3RJbicpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoaW5uZXJRdWVyeS5leHByZXNzaW9uVHJlZS5vcGVyYXRvcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFRyZWUuZW50aXR5ID0gaW5uZXJRdWVyeS5zZWxlY3RlZEVudGl0eS5uYW1lO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hUcmVlLnJldHVybkZpZWxkcyA9IGlubmVyUXVlcnkuc2VsZWN0ZWRSZXR1cm5GaWVsZHM7XG4gICAgICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFRyZWUuZmlsdGVyaW5nT3BlcmFuZHMgPSBpbm5lclF1ZXJ5LmV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hUcmVlLm9wZXJhdG9yID0gaW5uZXJRdWVyeS5leHByZXNzaW9uVHJlZS5vcGVyYXRvcjtcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZS5maWVsZE5hbWUgPSBpbm5lclF1ZXJ5LmV4cHJlc3Npb25UcmVlLmZpZWxkTmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFRyZWUgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pLmlzVW5hcnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVmFsID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5pbkVkaXRNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gdGhpcy5jcmVhdGVFeHByZXNzaW9uVHJlZUZyb21Hcm91cEl0ZW0odGhpcy5yb290R3JvdXAsIHRoaXMuc2VsZWN0ZWRFbnRpdHk/Lm5hbWUsIHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25UcmVlQ2hhbmdlLmVtaXQodGhpcy5fZXhwcmVzc2lvblRyZWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbmNlbE9wZXJhbmRBZGQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24uaW5BZGRNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYW5jZWxPcGVyYW5kRWRpdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5uZXJRdWVyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBpbm5lclF1ZXJ5ID0gdGhpcy5pbm5lclF1ZXJpZXMuZmlsdGVyKHEgPT4gcS5pc0luRWRpdE1vZGUoKSlbMF07XG4gICAgICAgICAgICBpZiAoaW5uZXJRdWVyeSkge1xuICAgICAgICAgICAgICAgIGlubmVyUXVlcnkuZXhwcmVzc2lvblRyZWUgPSB0aGlzLl9pbml0aWFsRXhwcmVzc2lvblRyZWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5uZXJRdWVyeS5fZWRpdGVkRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBpbm5lclF1ZXJ5LmNhbmNlbE9wZXJhbmRFZGl0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2VkaXRlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uaW5FZGl0TW9kZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5maWVsZE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0odGhpcy5fZWRpdGVkRXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlcmFuZENhbkJlQ29tbWl0dGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpbm5lclF1ZXJ5ID0gdGhpcy5pbm5lclF1ZXJpZXMuZmlsdGVyKHEgPT4gcS5pc0luRWRpdE1vZGUoKSlbMF07XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGQgJiYgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiAmJlxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICgoISF0aGlzLnNlYXJjaFZhbHVlLnZhbHVlIHx8ICghIXRoaXMuc2VhcmNoVmFsdWVUZW1wbGF0ZSAmJiAhIXRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hWYWwpKSAmJiAhKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPT09ICdpbicgfHwgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9PT0gJ25vdEluJykpIHx8XG4gICAgICAgICAgICAgICAgKGlubmVyUXVlcnkgJiYgISFpbm5lclF1ZXJ5LmV4cHJlc3Npb25UcmVlICYmIGlubmVyUXVlcnkuX2VkaXRlZEV4cHJlc3Npb24gPT0gdW5kZWZpbmVkKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbih0aGlzLnNlbGVjdGVkQ29uZGl0aW9uKS5pc1VuYXJ5XG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICpcbiAgICAgKiB1c2VkIGJ5IHRoZSBncmlkXG4gICAgICovXG4gICAgcHVibGljIGV4aXRPcGVyYW5kRWRpdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcGVyYW5kQ2FuQmVDb21taXR0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5jb21taXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kRWRpdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFeHByZXNzaW9uR3JvdXAoZXhwcmVzc2lvbjogRXhwcmVzc2lvbkl0ZW0pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcFJlbW92ZShleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5kZWxldGVJdGVtKGV4cHJlc3Npb25JdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBDbGljayhleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuX2NsaWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcHJldmVudENoaXBDbGljaykge1xuICAgICAgICAgICAgICAgIHRoaXMub25Ub2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3ByZXZlbnRDaGlwQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgfSwgdGhpcy5fZGJsQ2xpY2tEZWxheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwRGJsQ2xpY2soZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY2xpY2tUaW1lcik7XG4gICAgICAgIHRoaXMuX3ByZXZlbnRDaGlwQ2xpY2sgPSB0cnVlO1xuICAgICAgICB0aGlzLmVudGVyRXhwcmVzc2lvbkVkaXQoZXhwcmVzc2lvbkl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVudGVyRXhwcmVzc2lvbkVkaXQoZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuZXhpdE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIHRoaXMuY2FuY2VsT3BlcmFuZEFkZCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBhcmVudEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuaW5FZGl0TW9kZUNoYW5nZS5lbWl0KHRoaXMucGFyZW50RXhwcmVzc2lvbik7XG4gICAgICAgIH1cblxuICAgICAgICBleHByZXNzaW9uSXRlbS5ob3ZlcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmllbGRzID0gdGhpcy5zZWxlY3RlZEVudGl0eSA/IHRoaXMuc2VsZWN0ZWRFbnRpdHkuZmllbGRzIDogbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkID1cbiAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGROYW1lID9cbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmZpZWxkID09PSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZSlcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPVxuICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24gP1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uY29uZGl0aW9uLm5hbWUgOlxuICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUudmFsdWUgPSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbDtcblxuICAgICAgICBleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25JdGVtO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsRXhwcmVzc2lvblRyZWUgPSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsRXhwcmVzc2lvblRyZWUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIHRoaXMuZW50aXR5U2VsZWN0T3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IHRoaXMuZW50aXR5U2VsZWN0LmVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZW50aXR5U2VsZWN0T3ZlcmxheVNldHRpbmdzLmV4Y2x1ZGVGcm9tT3V0c2lkZUNsaWNrID0gW3RoaXMuZW50aXR5U2VsZWN0LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnRdO1xuICAgICAgICB0aGlzLmVudGl0eVNlbGVjdE92ZXJsYXlTZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5ID0gbmV3IEF1dG9Qb3NpdGlvblN0cmF0ZWd5KCk7XG4gICAgICAgIHRoaXMucmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkc0NvbWJvLmdldEVkaXRFbGVtZW50KCk7XG4gICAgICAgIHRoaXMucmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkc0NvbWJvLmdldEVkaXRFbGVtZW50KCkgYXMgSFRNTEVsZW1lbnRdO1xuICAgICAgICB0aGlzLnJldHVybkZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcbiAgICAgICAgdGhpcy5maWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSB0aGlzLmZpZWxkU2VsZWN0LmVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGhpcy5maWVsZFNlbGVjdC5lbGVtZW50IGFzIEhUTUxFbGVtZW50XTtcbiAgICAgICAgdGhpcy5maWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5ID0gbmV3IEF1dG9Qb3NpdGlvblN0cmF0ZWd5KCk7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IHRoaXMuY29uZGl0aW9uU2VsZWN0LmVsZW1lbnQ7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzLmV4Y2x1ZGVGcm9tT3V0c2lkZUNsaWNrID0gW3RoaXMuY29uZGl0aW9uU2VsZWN0LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnRdO1xuICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5ID0gbmV3IEF1dG9Qb3NpdGlvblN0cmF0ZWd5KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMuZmllbGRTZWxlY3QuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbih0aGlzLnNlbGVjdGVkQ29uZGl0aW9uKS5pc1VuYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdC5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2VhcmNoVmFsdWVJbnB1dD8ubmF0aXZlRWxlbWVudCB8fCB0aGlzLnBpY2tlcj8uZ2V0RWRpdEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGlucHV0Py5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fc2VsZWN0ZWRHcm91cHMpIHtcbiAgICAgICAgICAgIGdyb3VwLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRHcm91cHMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICBleHByLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zID0gW107XG5cbiAgICAgICAgdGhpcy50b2dnbGVDb250ZXh0TWVudSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVudGVyRXhwcmVzc2lvbkFkZChleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5fYWRkTW9kZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZE1vZGVFeHByZXNzaW9uLmluQWRkTW9kZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFyZW50RXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5pbkVkaXRNb2RlQ2hhbmdlLmVtaXQodGhpcy5wYXJlbnRFeHByZXNzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmluQWRkTW9kZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX2FkZE1vZGVFeHByZXNzaW9uID0gZXhwcmVzc2lvbkl0ZW07XG4gICAgICAgIGlmIChleHByZXNzaW9uSXRlbS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbnRleHRNZW51Q2xvc2VkKCkge1xuICAgICAgICB0aGlzLmNvbnRleHR1YWxHcm91cCA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudEFyZ3Muc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50QXJncy5rZXk7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0TWVudVRvZ2dsZS5jb2xsYXBzZWQgJiYgKGtleSA9PT0gdGhpcy5wbGF0Zm9ybS5LRVlNQVAuRVNDQVBFKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlQW5kR3JvdXAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoRmlsdGVyaW5nTG9naWMuQW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPckdyb3VwKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwKEZpbHRlcmluZ0xvZ2ljLk9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVGaWx0ZXJzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0oZXhwcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Hcm91cENsaWNrKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICBjb25zdCBmaXJzdENoaWxkID0gZ3JvdXBJdGVtLmNoaWxkcmVuWzBdIGFzIEV4cHJlc3Npb25PcGVyYW5kSXRlbTtcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpICYmIGZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXJFeHByZXNzaW9uRWRpdChmaXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvZ2dsZUdyb3VwKGdyb3VwSXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdW5ncm91cCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IHRoaXMuY29udGV4dHVhbEdyb3VwO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzZWxlY3RlZEdyb3VwLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzZWxlY3RlZEdyb3VwKTtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEsIC4uLnNlbGVjdGVkR3JvdXAuY2hpbGRyZW4pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2Ygc2VsZWN0ZWRHcm91cC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGV4cHIucGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlR3JvdXAoKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXAgPSB0aGlzLmNvbnRleHR1YWxHcm91cDtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2VsZWN0ZWRHcm91cC5wYXJlbnQ7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yoc2VsZWN0ZWRHcm91cCk7XG4gICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyb3VwID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5jb21taXRPcGVyYW5kRWRpdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEZpbHRlcmluZ0xvZ2ljKGV2ZW50OiBJQnV0dG9uR3JvdXBFdmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0dWFsR3JvdXAub3BlcmF0b3IgPSBldmVudC5pbmRleCBhcyBGaWx0ZXJpbmdMb2dpYztcbiAgICAgICAgdGhpcy5jb21taXRPcGVyYW5kRWRpdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVN0cmluZ3NbYGlneF9xdWVyeV9idWlsZGVyX2ZpbHRlcl8ke25hbWV9YF0gfHwgbmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0RhdGUodmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uRXhwcmVzc2lvbnNTY3JvbGxlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVDb250ZXh0TWVudVRhcmdldCgpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0TWVudVRvZ2dsZS5yZXBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZva2VDbGljayhldmVudEFyZ3M6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGV2ZW50QXJncykpIHtcbiAgICAgICAgICAgIGV2ZW50QXJncy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgKGV2ZW50QXJncy5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGljaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlblBpY2tlcihhcmdzOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzQWN0aXZhdGlvbktleShhcmdzKSkge1xuICAgICAgICAgICAgYXJncy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5waWNrZXIub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25PdXRsZXRQb2ludGVyRG93bihldmVudCkge1xuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGNsb3NpbmcgdGhlIHNlbGVjdCdzIGRyb3Bkb3duIHdoZW4gY2xpY2tpbmcgdGhlIHNjcm9sbFxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldENvbmRpdGlvbkxpc3QoKTogc3RyaW5nW10ge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWVsZCkgcmV0dXJuIFtdO1xuXG4gICAgICAgIGlmICh0aGlzLmVudGl0aWVzPy5sZW5ndGggPT09IDEgJiYgIXRoaXMuZW50aXRpZXNbMF0ubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbkxpc3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGQuZmlsdGVycy5leHRlbmRlZENvbmRpdGlvbkxpc3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZXIoZmllbGQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmllbGQpLmZvcm1hdHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtYXQoZmllbGQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmllbGQpLnBpcGVBcmdzLmZvcm1hdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogdXNlZCBieSB0aGUgZ3JpZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRBZGRCdXR0b25Gb2N1cygpIHtcbiAgICAgICAgaWYgKHRoaXMuYWRkUm9vdEFuZEdyb3VwQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFJvb3RBbmRHcm91cEJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hZGRDb25kaXRpb25CdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29uZGl0aW9uQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbnRleHQoZXhwcmVzc2lvbjogRXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbj86IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IGV4cHJlc3Npb24sXG4gICAgICAgICAgICBhZnRlckV4cHJlc3Npb25cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBTZWxlY3Rpb25FbmQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHR1YWxHcm91cCA9IHRoaXMuZmluZFNpbmdsZVNlbGVjdGVkR3JvdXAoKTtcbiAgICAgICAgaWYgKGNvbnRleHR1YWxHcm91cCB8fCB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0dWFsR3JvdXAgPSBjb250ZXh0dWFsR3JvdXA7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0TWVudVRvZ2dsZS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLm9wZW4odGhpcy5fb3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0TWVudVRvZ2dsZS5yZXBvc2l0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZGVyQ2xpY2soZXZlbnQsIGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwYW5kZWQgPSAhZXhwcmVzc2lvbkl0ZW0uZXhwYW5kZWQ7XG4gICAgICAgIGlmIChleHByZXNzaW9uSXRlbS5leHBhbmRlZCkge1xuICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWRFeHByZXNzaW9ucy5wdXNoKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hJbmRleCA9IHRoaXMuX2V4cGFuZGVkRXhwcmVzc2lvbnMuaW5kZXhPZihleHByZXNzaW9uSXRlbS5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIHRoaXMuX2V4cGFuZGVkRXhwcmVzc2lvbnMuc3BsaWNlKG1hdGNoSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3JtYXRSZXR1cm5GaWVsZHMoaW5uZXJUcmVlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgIGNvbnN0IHJldHVybkZpZWxkcyA9IGlubmVyVHJlZS5yZXR1cm5GaWVsZHM7XG4gICAgICAgIGxldCB0ZXh0ID0gcmV0dXJuRmllbGRzLmpvaW4oJywgJyk7XG4gICAgICAgIGNvbnN0IGlubmVyVHJlZUVudGl0eSA9IHRoaXMuZW50aXRpZXM/LmZpbmQoZWwgPT4gZWwubmFtZSA9PT0gaW5uZXJUcmVlLmVudGl0eSk7XG4gICAgICAgIGlmIChyZXR1cm5GaWVsZHMubGVuZ3RoID09PSBpbm5lclRyZWVFbnRpdHkuZmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGV4dCA9IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2FsbF9maWVsZHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ID0gcmV0dXJuRmllbGRzLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5sZW5ndGggPiAyNSA/IHRleHQuc3Vic3RyaW5nKDAsIDI1KSArICcgLi4uJyA6IHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGlzSW5FZGl0TW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnBhcmVudEV4cHJlc3Npb24gfHwgKHRoaXMucGFyZW50RXhwcmVzc2lvbiAmJiB0aGlzLnBhcmVudEV4cHJlc3Npb24uaW5FZGl0TW9kZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSW5FZGl0TW9kZUNoYW5nZWQoZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3RBbGxDbGlja2VkKF9ldmVudCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoID4gMCAmJiB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcy5sZW5ndGggPCB0aGlzLl9zZWxlY3RlZEVudGl0eS5maWVsZHMubGVuZ3RoKSB8fFxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoID09IHRoaXMuX3NlbGVjdGVkRW50aXR5LmZpZWxkcy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm8uZGVzZWxlY3RBbGxJdGVtcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkc0NvbWJvLnNlbGVjdEFsbEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2VhcmNoVmFsdWVUZW1wbGF0ZUNvbnRleHQoZGVmYXVsdFNlYXJjaFZhbHVlVGVtcGxhdGUpOiBhbnkge1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXMuc2VhcmNoVmFsdWUsXG4gICAgICAgICAgICBzZWxlY3RlZEZpZWxkOiB0aGlzLnNlbGVjdGVkRmllbGQsXG4gICAgICAgICAgICBzZWxlY3RlZENvbmRpdGlvbjogdGhpcy5zZWxlY3RlZENvbmRpdGlvbixcbiAgICAgICAgICAgIGRlZmF1bHRTZWFyY2hWYWx1ZVRlbXBsYXRlOiBkZWZhdWx0U2VhcmNoVmFsdWVUZW1wbGF0ZVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gY3R4O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Rm9ybWF0KGZpZWxkOiBGaWVsZFR5cGUpIHtcbiAgICAgICAgaWYgKCFmaWVsZC5waXBlQXJncykge1xuICAgICAgICAgICAgZmllbGQucGlwZUFyZ3MgPSB7IGRpZ2l0c0luZm86IERFRkFVTFRfUElQRV9ESUdJVFNfSU5GTyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWVsZC5waXBlQXJncy5mb3JtYXQpIHtcbiAgICAgICAgICAgIGZpZWxkLnBpcGVBcmdzLmZvcm1hdCA9IGZpZWxkLmRhdGFUeXBlID09PSBEYXRhVHlwZS5UaW1lID9cbiAgICAgICAgICAgICAgICBERUZBVUxUX1BJUEVfVElNRV9GT1JNQVQgOiBmaWVsZC5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuRGF0ZVRpbWUgP1xuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BJUEVfREFURV9USU1FX0ZPUk1BVCA6IERFRkFVTFRfUElQRV9EQVRFX0ZPUk1BVDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmllbGQuZGVmYXVsdERhdGVUaW1lRm9ybWF0KSB7XG4gICAgICAgICAgICBmaWVsZC5kZWZhdWx0RGF0ZVRpbWVGb3JtYXQgPSBERUZBVUxUX0RBVEVfVElNRV9GT1JNQVQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpZWxkLmRlZmF1bHRUaW1lRm9ybWF0KSB7XG4gICAgICAgICAgICBmaWVsZC5kZWZhdWx0VGltZUZvcm1hdCA9IERFRkFVTFRfVElNRV9GT1JNQVQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZpbHRlcnMoZmllbGQ6IEZpZWxkVHlwZSkge1xuICAgICAgICBpZiAoIWZpZWxkLmZpbHRlcnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkJvb2xlYW46XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLk51bWJlcjpcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkN1cnJlbmN5OlxuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuUGVyY2VudDpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneE51bWJlckZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5UaW1lOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4VGltZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneERhdGVUaW1lRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Ub2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcbiAgICAgICAgdGhpcy50b2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtKTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUNvbnRleHRNZW51KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQgPSAhZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQ7XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMucHVzaChleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5pbmRleE9mKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEdyb3VwKG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYywgcGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgY29uc3QgZ3JvdXBJdGVtID0gbmV3IEV4cHJlc3Npb25Hcm91cEl0ZW0ob3BlcmF0b3IsIHBhcmVudCk7XG5cbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGFmdGVyRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoYWZ0ZXJFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4ICsgMSwgMCwgZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2goZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyb3VwID0gZ3JvdXBJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRDb25kaXRpb24oZ3JvdXBJdGVtKTtcbiAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSBncm91cEl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHJlc3Npb25UcmVlOiBJRXhwcmVzc2lvblRyZWUsIHBhcmVudD86IEV4cHJlc3Npb25Hcm91cEl0ZW0sIGVudGl0eU5hbWU/OiBzdHJpbmcpOiBFeHByZXNzaW9uR3JvdXBJdGVtIHtcbiAgICAgICAgbGV0IGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgICAgICBncm91cEl0ZW0gPSBuZXcgRXhwcmVzc2lvbkdyb3VwSXRlbShleHByZXNzaW9uVHJlZS5vcGVyYXRvciwgcGFyZW50KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBleHByIG9mIGV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJdGVtLmNoaWxkcmVuLnB1c2godGhpcy5jcmVhdGVFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHIsIGdyb3VwSXRlbSwgZXhwcmVzc2lvblRyZWUuZW50aXR5KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyaW5nRXhwciA9IGV4cHIgYXMgSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJDb3B5OiBJRmlsdGVyaW5nRXhwcmVzc2lvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogZmlsdGVyaW5nRXhwci5maWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IGZpbHRlcmluZ0V4cHIuY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uTmFtZTogZmlsdGVyaW5nRXhwci5jb25kaXRpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbDogZmlsdGVyaW5nRXhwci5zZWFyY2hWYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hUcmVlOiBmaWx0ZXJpbmdFeHByLnNlYXJjaFRyZWUsIC8vIHRoaXMuY3JlYXRlRXhwcmVzc2lvbkdyb3VwSXRlbShmaWx0ZXJpbmdFeHByLnNlYXJjaFRyZWUsIGdyb3VwSXRlbSksXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBmaWx0ZXJpbmdFeHByLmlnbm9yZUNhc2VcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlcmFuZEl0ZW0gPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKGV4cHJDb3B5LCBncm91cEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvblRyZWUuZW50aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlOYW1lID0gZXhwcmVzc2lvblRyZWUuZW50aXR5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXRpZXM/LmZpbmQoZWwgPT4gZWwubmFtZSA9PT0gZW50aXR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzID0gZW50aXR5LmZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzPy5maW5kKGVsID0+IGVsLmZpZWxkID09PSBmaWx0ZXJpbmdFeHByLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhbmRJdGVtLmZpZWxkTGFiZWwgPSBmaWVsZD8ubGFiZWwgfHwgZmllbGQ/LmhlYWRlciB8fCBmaWVsZD8uZmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9leHBhbmRlZEV4cHJlc3Npb25zLmZpbHRlcihlID0+IGUuc2VhcmNoVHJlZSA9PSBvcGVyYW5kSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWUpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRJdGVtLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBncm91cEl0ZW0uY2hpbGRyZW4ucHVzaChvcGVyYW5kSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRW50aXR5ID0gdGhpcy5lbnRpdGllcz8uZmluZChlbCA9PiBlbC5uYW1lID09PSBlbnRpdHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgIWV4cHJlc3Npb25UcmVlLnJldHVybkZpZWxkcyB8fCBleHByZXNzaW9uVHJlZS5yZXR1cm5GaWVsZHMuaW5jbHVkZXMoJyonKSB8fCBleHByZXNzaW9uVHJlZS5yZXR1cm5GaWVsZHMuaW5jbHVkZXMoJ0FsbCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmZpZWxkcz8ubWFwKGYgPT4gZi5maWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZmllbGRzPy5maWx0ZXIoZiA9PiBleHByZXNzaW9uVHJlZS5yZXR1cm5GaWVsZHMuaW5kZXhPZihmLmZpZWxkKSA+PSAwKS5tYXAoZiA9PiBmLmZpZWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyb3VwSXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUV4cHJlc3Npb25UcmVlRnJvbUdyb3VwSXRlbShncm91cEl0ZW06IEV4cHJlc3Npb25Hcm91cEl0ZW0sIGVudGl0eT86IHN0cmluZywgcmV0dXJuRmllbGRzPzogc3RyaW5nW10pOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUge1xuICAgICAgICBpZiAoIWdyb3VwSXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHByZXNzaW9uVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoZ3JvdXBJdGVtLm9wZXJhdG9yLCB1bmRlZmluZWQsIGVudGl0eSwgcmV0dXJuRmllbGRzKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZ3JvdXBJdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJUcmVlID0gdGhpcy5jcmVhdGVFeHByZXNzaW9uVHJlZUZyb21Hcm91cEl0ZW0oKGl0ZW0gYXMgRXhwcmVzc2lvbkdyb3VwSXRlbSksIGVudGl0eSwgcmV0dXJuRmllbGRzKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHN1YlRyZWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKChpdGVtIGFzIEV4cHJlc3Npb25PcGVyYW5kSXRlbSkuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvblRyZWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVDb250ZXh0TWVudSgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dHVhbEdyb3VwID0gdGhpcy5maW5kU2luZ2xlU2VsZWN0ZWRHcm91cCgpO1xuXG4gICAgICAgIGlmIChjb250ZXh0dWFsR3JvdXAgfHwgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gY29udGV4dHVhbEdyb3VwO1xuXG4gICAgICAgICAgICBpZiAoY29udGV4dHVhbEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdMb2dpY3MgPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9maWx0ZXJfb3BlcmF0b3JfYW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9maWx0ZXJfb3BlcmF0b3Jfb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogY29udGV4dHVhbEdyb3VwLm9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5PclxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRleHRNZW51VG9nZ2xlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRTaW5nbGVTZWxlY3RlZEdyb3VwKCk6IEV4cHJlc3Npb25Hcm91cEl0ZW0ge1xuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX3NlbGVjdGVkR3JvdXBzKSB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluc0FsbFNlbGVjdGVkRXhwcmVzc2lvbnMgPSB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMuZXZlcnkob3AgPT4gdGhpcy5pc0luc2lkZUdyb3VwKG9wLCBncm91cCkpO1xuXG4gICAgICAgICAgICBpZiAoY29udGFpbnNBbGxTZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0luc2lkZUdyb3VwKGl0ZW06IEV4cHJlc3Npb25JdGVtLCBncm91cDogRXhwcmVzc2lvbkdyb3VwSXRlbSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtLnBhcmVudCA9PT0gZ3JvdXApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnNpZGVHcm91cChpdGVtLnBhcmVudCwgZ3JvdXApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVsZXRlSXRlbShleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgaWYgKCFleHByZXNzaW9uSXRlbS5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHByZXNzaW9uSXRlbSA9PT0gdGhpcy5jdXJyZW50R3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEdyb3VwID0gdGhpcy5jdXJyZW50R3JvdXAucGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBleHByZXNzaW9uSXRlbS5wYXJlbnQuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIGNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZXhwcmVzc2lvblRyZWUgPyB0aGlzLmV4cHJlc3Npb25UcmVlLmVudGl0eSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJldHVybkZpZWxkcyA9IHRoaXMuZXhwcmVzc2lvblRyZWUgPyB0aGlzLmV4cHJlc3Npb25UcmVlLnJldHVybkZpZWxkcyA6IG51bGw7XG4gICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gdGhpcy5jcmVhdGVFeHByZXNzaW9uVHJlZUZyb21Hcm91cEl0ZW0odGhpcy5yb290R3JvdXAsIGVudGl0eSwgcmV0dXJuRmllbGRzKTsgLy8gVE9ETzogZG9uJ3QgcmVjcmVhdGUgaWYgbm90IG5lY2Vzc2FyeVxuXG4gICAgICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0oZXhwcmVzc2lvbkl0ZW0ucGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvblRyZWVDaGFuZ2UuZW1pdCh0aGlzLl9leHByZXNzaW9uVHJlZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVHcm91cChvcGVyYXRvcjogRmlsdGVyaW5nTG9naWMpIHtcbiAgICAgICAgY29uc3QgY2hpcHMgPSB0aGlzLmNoaXBzLnRvQXJyYXkoKTtcbiAgICAgICAgY29uc3QgbWluSW5kZXggPSB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMucmVkdWNlKChpLCBlKSA9PiBNYXRoLm1pbihpLCBjaGlwcy5maW5kSW5kZXgoYyA9PiBjLmRhdGEgPT09IGUpKSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIGNvbnN0IGZpcnN0RXhwcmVzc2lvbiA9IGNoaXBzW21pbkluZGV4XS5kYXRhO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGZpcnN0RXhwcmVzc2lvbi5wYXJlbnQ7XG4gICAgICAgIGNvbnN0IGdyb3VwSXRlbSA9IG5ldyBFeHByZXNzaW9uR3JvdXBJdGVtKG9wZXJhdG9yLCBwYXJlbnQpO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoZmlyc3RFeHByZXNzaW9uKTtcbiAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMCwgZ3JvdXBJdGVtKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICBncm91cEl0ZW0uY2hpbGRyZW4ucHVzaChleHByKTtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByKTtcbiAgICAgICAgICAgIGV4cHIucGFyZW50ID0gZ3JvdXBJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlR3JvdXAoZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHRoaXMuZXhpdE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIGlmIChncm91cEl0ZW0uY2hpbGRyZW4gJiYgZ3JvdXBJdGVtLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVHcm91cFJlY3Vyc2l2ZShncm91cEl0ZW0sICFncm91cEl0ZW0uc2VsZWN0ZWQpO1xuICAgICAgICAgICAgaWYgKCFncm91cEl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0UGFyZW50UmVjdXJzaXZlKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbnRleHRNZW51KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUdyb3VwUmVjdXJzaXZlKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSwgc2VsZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGdyb3VwSXRlbS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGdyb3VwSXRlbS5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuXG4gICAgICAgICAgICBpZiAoZ3JvdXBJdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRHcm91cHMucHVzaChncm91cEl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NlbGVjdGVkR3JvdXBzLmluZGV4T2YoZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEdyb3Vwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBleHByIG9mIGdyb3VwSXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVHcm91cFJlY3Vyc2l2ZShleHByLCBzZWxlY3RlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhbmRFeHByZXNzaW9uID0gZXhwciBhcyBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhbmRFeHByZXNzaW9uLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24ob3BlcmFuZEV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzZWxlY3RQYXJlbnRSZWN1cnNpdmUoZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGV4cHJlc3Npb25JdGVtLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHBhcmVudC5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHBhcmVudC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fc2VsZWN0ZWRHcm91cHMuaW5kZXhPZihwYXJlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkR3JvdXBzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0UGFyZW50UmVjdXJzaXZlKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCkge1xuICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5leHByZXNzaW9uc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBjaGlwcyA9IHRoaXMuY2hpcHMuZmlsdGVyKGMgPT4gdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmluZGV4T2YoYy5kYXRhKSAhPT0gLTEpO1xuICAgICAgICBsZXQgbWluVG9wID0gY2hpcHMucmVkdWNlKCh0LCBjKSA9PlxuICAgICAgICAgICAgTWF0aC5taW4odCwgYy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCksIE51bWJlci5NQVhfVkFMVUUpO1xuICAgICAgICBtaW5Ub3AgPSBNYXRoLm1heChjb250YWluZXJSZWN0LnRvcCwgbWluVG9wKTtcbiAgICAgICAgbWluVG9wID0gTWF0aC5taW4oY29udGFpbmVyUmVjdC5ib3R0b20sIG1pblRvcCk7XG4gICAgICAgIGxldCBtYXhSaWdodCA9IGNoaXBzLnJlZHVjZSgociwgYykgPT5cbiAgICAgICAgICAgIE1hdGgubWF4KHIsIGMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCksIDApO1xuICAgICAgICBtYXhSaWdodCA9IE1hdGgubWF4KG1heFJpZ2h0LCBjb250YWluZXJSZWN0LmxlZnQpO1xuICAgICAgICBtYXhSaWdodCA9IE1hdGgubWluKG1heFJpZ2h0LCBjb250YWluZXJSZWN0LnJpZ2h0KTtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IG5ldyBQb2ludChtYXhSaWdodCwgbWluVG9wKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbEVsZW1lbnRJbnRvVmlldyh0YXJnZXQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZXhwcmVzc2lvbnNDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gdGFyZ2V0Lm9mZnNldFRvcCAtIGNvbnRhaW5lci5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gMTA7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lci5zY3JvbGxUb3AgKyBkZWx0YSA+IHRhcmdldE9mZnNldCkge1xuICAgICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IHRhcmdldE9mZnNldCAtIGRlbHRhO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lci5zY3JvbGxUb3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0IDwgdGFyZ2V0T2Zmc2V0ICsgdGFyZ2V0Lm9mZnNldEhlaWdodCArIGRlbHRhKSB7XG4gICAgICAgICAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gdGFyZ2V0T2Zmc2V0ICsgdGFyZ2V0Lm9mZnNldEhlaWdodCArIGRlbHRhIC0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBpbml0KCkge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY2FuY2VsT3BlcmFuZEFkZCgpO1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIHRoaXMucm9vdEdyb3VwID0gdGhpcy5jcmVhdGVFeHByZXNzaW9uR3JvdXBJdGVtKHRoaXMuZXhwcmVzc2lvblRyZWUpO1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IHRoaXMucm9vdEdyb3VwO1xuICAgIH1cbn1cblxuIiwiPG5nLXRlbXBsYXRlICNhZGRJY29uPlxuICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cImFkZFwiPjwvaWd4LWljb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Nsb3NlSWNvbj5cbiAgICA8aWd4LWljb24gZmFtaWx5PVwiZGVmYXVsdFwiIG5hbWU9XCJjbG9zZVwiPjwvaWd4LWljb24+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2XG4gICAgI2V4cHJlc3Npb25zQ29udGFpbmVyXG4gICAgY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlcl9fbWFpblwiXG4gICAgKHNjcm9sbCk9XCJvbkV4cHJlc3Npb25zU2Nyb2xsZWQoKVwiXG4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyb290R3JvdXBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1xdWVyeS1idWlsZGVyX19yb290XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LXF1ZXJ5LWJ1aWxkZXJfX3Jvb3QtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAjYWRkUm9vdEFuZEdyb3VwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQW5kR3JvdXAoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9hbmRfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE9yR3JvdXAoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9vcl9ncm91cCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1maWx0ZXItZW1wdHlcIj5cbiAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJpZ3gtZmlsdGVyLWVtcHR5X190aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9pbml0aWFsX3RleHQgfX1cbiAgICAgICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNhZGRFeHByZXNzaW9uc1RlbXBsYXRlIGxldC1leHByZXNzaW9uSXRlbSBsZXQtYWZ0ZXJFeHByZXNzaW9uPVwiYWZ0ZXJFeHByZXNzaW9uXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAjYWRkQ29uZGl0aW9uQnV0dG9uXG4gICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFzRWRpdGVkRXhwcmVzc2lvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkQ29uZGl0aW9uKGV4cHJlc3Npb25JdGVtLCBhZnRlckV4cHJlc3Npb24pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFkZEljb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfYWRkX2NvbmRpdGlvblxuICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFzRWRpdGVkRXhwcmVzc2lvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkQW5kR3JvdXAoZXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbilcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfYW5kX2dyb3VwIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhc0VkaXRlZEV4cHJlc3Npb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZE9yR3JvdXAoZXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbilcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfb3JfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI29wZXJhbmRUZW1wbGF0ZSBsZXQtZXhwcmVzc2lvbkl0ZW0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiIWV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb24taXRlbVwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJleHByZXNzaW9uSXRlbS5ob3ZlcmVkID0gdHJ1ZVwiXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJleHByZXNzaW9uSXRlbS5ob3ZlcmVkID0gZmFsc2VcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWNoaXBcbiAgICAgICAgICAgICAgICAjdGFyZ2V0PVwidG9vbHRpcFRhcmdldFwiXG4gICAgICAgICAgICAgICAgW2lneFRvb2x0aXBUYXJnZXRdPVwidG9vbHRpcFJlZlwiXG4gICAgICAgICAgICAgICAgW2RhdGFdPVwiZXhwcmVzc2lvbkl0ZW1cIlxuICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwiaXNJbkVkaXRNb2RlKCkgPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQgJiYgaXNJbkVkaXRNb2RlKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpc0luRWRpdE1vZGUoKSA/IG9uQ2hpcENsaWNrKGV4cHJlc3Npb25JdGVtKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgIChkYmxjbGljayk9XCJvbkNoaXBEYmxDbGljayhleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgIChyZW1vdmUpPVwib25DaGlwUmVtb3ZlKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJvbkNoaXBTZWxlY3Rpb25FbmQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWd4UHJlZml4IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19leHByZXNzaW9uLWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICB7e2V4cHJlc3Npb25JdGVtLmZpZWxkTGFiZWwgfHwgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWV9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZ3hQcmVmaXggY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb24tY29uZGl0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25kaXRpb25GcmllbmRseU5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3tleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWUuZW50aXR5fX08L3N0cm9uZz4mbmJzcDsvIHt7Zm9ybWF0UmV0dXJuRmllbGRzKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZSl9fVxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZVwiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNEYXRlKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0Rm9ybWF0dGVyKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGROYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZpZWxkRm9ybWF0dGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEZvcm1hdHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmxvY2FsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvaWd4LWNoaXA+XG4gICAgICAgICAgICA8ZGl2ICN0b29sdGlwUmVmPVwidG9vbHRpcFwiIGlneFRvb2x0aXA+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlID9cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZS5yZXR1cm5GaWVsZHMuam9pbignLCAnKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5ID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25kaXRpb25GcmllbmRseU5hbWUoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19leHByZXNzaW9uLWFjdGlvbnNcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIChleHByZXNzaW9uSXRlbS5zZWxlY3RlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFeHByZXNzaW9ucy5sZW5ndGggPT09IDEpIHx8XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmhvdmVyZWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWd4SWNvbkJ1dHRvbj1cImZsYXRcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJlZGl0LWV4cHJlc3Npb25cIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnZva2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVudGVyRXhwcmVzc2lvbkVkaXQoZXhwcmVzc2lvbkl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiBpZD1cImVkaXQtZXhwcmVzc2lvblwiPmVkaXQ8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWd4SWNvbkJ1dHRvbj1cImZsYXRcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJhZGQtZXhwcmVzc2lvblwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW50ZXJFeHByZXNzaW9uQWRkKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWV4cHJlc3Npb25JdGVtLmluQWRkTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHByZXNzaW9uSXRlbS5wYXJlbnQgIT09IGN1cnJlbnRHcm91cCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRHcm91cC5jaGlsZHJlbltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXAuY2hpbGRyZW4ubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24gaWQ9XCJhZGQtZXhwcmVzc2lvblwiPmFkZDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZSAmJiBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWVcIlxuICAgICAgICAgICAgICAgIGlneEJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19kZXRhaWxzLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZGVyQ2xpY2soJGV2ZW50LCBleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7dGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGV0YWlsc319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiAqbmdJZj1cImV4cHJlc3Npb25JdGVtLmV4cGFuZGVkXCIgZmFtaWx5PVwiZGVmYXVsdFwiIG5hbWU9XCJ1bmZvbGRfbGVzc1wiIHJvbGU9XCJidXR0b25cIj48L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5leHBhbmRlZFwiIGZhbWlseT1cImRlZmF1bHRcIiBuYW1lPVwidW5mb2xkX21vcmVcIiByb2xlPVwiYnV0dG9uXCI+PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGVcIlxuICAgICAgICAgICAgI2VkaXRpbmdJbnB1dHNDb250YWluZXJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHNcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LXNlbGVjdFxuICAgICAgICAgICAgICAgICNmaWVsZFNlbGVjdFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwiZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3NcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWVsZHNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBpZ3hMYWJlbD57e3RoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbHVtbl9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aWd4LXNlbGVjdC1pdGVtICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHNcIiBbdmFsdWVdPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfHwgZmllbGQuaGVhZGVyIHx8IGZpZWxkLmZpZWxkIH19XG4gICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxpZ3gtc2VsZWN0XG4gICAgICAgICAgICAgICAgI2NvbmRpdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwiY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQ29uZGl0aW9uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkRmllbGRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBpZ3hMYWJlbD57e3RoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbmRpdGlvbl9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aWd4LXByZWZpeFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uU2VsZWN0LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKGNvbmRpdGlvblNlbGVjdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25TZWxlY3QudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmljb25OYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPC9pZ3gtcHJlZml4PlxuXG4gICAgICAgICAgICAgICAgPGlneC1zZWxlY3QtaXRlbVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29uZGl0aW9uIG9mIGdldENvbmRpdGlvbkxpc3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb25kaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJnZXRDb25kaXRpb25GcmllbmRseU5hbWUoY29uZGl0aW9uKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi1pdGVtc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oY29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmljb25OYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlneC1ncmlkX19maWx0ZXJpbmctZHJvcGRvd24tdGV4dFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2lneC1zZWxlY3QtaXRlbT5cbiAgICAgICAgICAgIDwvaWd4LXNlbGVjdD5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbHVlVGVtcGxhdGUgPyBzZWFyY2hWYWx1ZVRlbXBsYXRlIDogZGVmYXVsdFNlYXJjaFZhbHVlVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGdldFNlYXJjaFZhbHVlVGVtcGxhdGVDb250ZXh0KGRlZmF1bHRTZWFyY2hWYWx1ZVRlbXBsYXRlKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U2VhcmNoVmFsdWVUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8aWd4LWlucHV0LWdyb3VwXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09ICdkYXRlJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09ICd0aW1lJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09ICdkYXRlVGltZScpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7dGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfdmFsdWVfcGxhY2Vob2xkZXJ9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgI3NlYXJjaFZhbHVlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHNlbGVjdGVkQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb25kaXRpb24gPT09ICdpbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbmRpdGlvbiA9PT0gJ25vdEluJ1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQgJiYgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0ZXh0J1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWUudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvaWd4LWlucHV0LWdyb3VwPlxuXG4gICAgICAgICAgICAgICAgPGlneC1kYXRlLXBpY2tlclxuICAgICAgICAgICAgICAgICAgICAjcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWFyY2hWYWx1ZS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9wZW5QaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwaWNrZXIub3BlbigpXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZENvbmRpdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHNlbGVjdGVkQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNVbmFyeSl8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb25kaXRpb24gPT09ICdpbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29uZGl0aW9uID09PSAnbm90SW4nXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2NhbGVdPVwidGhpcy5sb2NhbGVcIlxuICAgICAgICAgICAgICAgICAgICBbb3V0bGV0XT1cInBpY2tlck91dGxldFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtYXR0ZXJdPVwic2VsZWN0ZWRGaWVsZC5mb3JtYXR0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUZvcm1hdF09XCJzZWxlY3RlZEZpZWxkLnBpcGVBcmdzLmZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgIFt3ZWVrU3RhcnRdPVwic2VsZWN0ZWRGaWVsZC5waXBlQXJncy53ZWVrU3RhcnRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7dGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGF0ZV9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNhYmxlIGRlZmF1bHQgaWNvbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLXRvZ2dsZT48L2lneC1waWNrZXItdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LXBpY2tlci1jbGVhcj48L2lneC1waWNrZXItY2xlYXI+XG4gICAgICAgICAgICAgICAgPC9pZ3gtZGF0ZS1waWNrZXI+XG5cbiAgICAgICAgICAgICAgICA8aWd4LXRpbWUtcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICNwaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEZpZWxkICYmIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICd0aW1lJ1wiXG4gICAgICAgICAgICAgICAgICAgIFsodmFsdWUpXT1cInNlYXJjaFZhbHVlLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBpY2tlci5vcGVuKClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvcGVuUGlja2VyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkQ29uZGl0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oc2VsZWN0ZWRDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc1VuYXJ5KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb25kaXRpb24gPT09ICdpbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29uZGl0aW9uID09PSAnbm90SW4nXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2NhbGVdPVwidGhpcy5sb2NhbGVcIlxuICAgICAgICAgICAgICAgICAgICBbb3V0bGV0XT1cInBpY2tlck91dGxldFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtYXR0ZXJdPVwic2VsZWN0ZWRGaWVsZC5mb3JtYXR0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbaW5wdXRGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5kZWZhdWx0VGltZUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgZGVmYXVsdCBpY29ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7dGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfdGltZV9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1waWNrZXItdG9nZ2xlPjwvaWd4LXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICAgICAgICAgICAgICA8L2lneC10aW1lLXBpY2tlcj5cblxuICAgICAgICAgICAgICAgIDxpZ3gtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgI2lucHV0R3JvdXBcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZVRpbWUnXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgaWd4TGFiZWw+e3t0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9kYXRldGltZV9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHNlbGVjdGVkQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb25kaXRpb24gPT09ICdpbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbmRpdGlvbiA9PT0gJ25vdEluJ1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZ3hEYXRlVGltZUVkaXRvcl09XCJzZWxlY3RlZEZpZWxkLmRlZmF1bHREYXRlVGltZUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9pZ3gtaW5wdXQtZ3JvdXA+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHMtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGlneEljb25CdXR0b249XCJmbGF0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFvcGVyYW5kQ2FuQmVDb21taXR0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb21taXRPcGVyYW5kRWRpdCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cImNvbmZpcm1cIj48L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGlneEljb25CdXR0b249XCJmbGF0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9wZXJhbmRFZGl0KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNsb3NlSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGUgJiYgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlKSB8fCAoZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZSAmJiAoc2VsZWN0ZWRDb25kaXRpb24gPT09ICdpbicgfHwgc2VsZWN0ZWRDb25kaXRpb24gPT09ICdub3RJbicpKVwiPlxuICAgICAgICAgICAgPGlneC1xdWVyeS1idWlsZGVyLXRyZWVcbiAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlIHx8IGV4cHJlc3Npb25JdGVtLmV4cGFuZGVkID8gJ2Jsb2NrJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgW2VudGl0aWVzXT1cImVudGl0aWVzXCJcbiAgICAgICAgICAgICAgICBbcXVlcnlCdWlsZGVyXT1cInRoaXMucXVlcnlCdWlsZGVyXCJcbiAgICAgICAgICAgICAgICBbcGFyZW50RXhwcmVzc2lvbl09XCJleHByZXNzaW9uSXRlbVwiXG4gICAgICAgICAgICAgICAgW2V4cHJlc3Npb25UcmVlXT1cImV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZVwiXG4gICAgICAgICAgICAgICAgKGluRWRpdE1vZGVDaGFuZ2UpPVwib25JbkVkaXRNb2RlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbc2VhcmNoVmFsdWVUZW1wbGF0ZV09XCJzZWFyY2hWYWx1ZVRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8L2lneC1xdWVyeS1idWlsZGVyLXRyZWU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlXCJcbiAgICAgICAgICAgICNhZGRNb2RlQ29udGFpbmVyXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fYnV0dG9uc1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBhZGRFeHByZXNzaW9uc1RlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHJlc3Npb25JdGVtLnBhcmVudCwgZXhwcmVzc2lvbkl0ZW0pXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hJY29uQnV0dG9uPVwiZmxhdFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9wZXJhbmRBZGQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNsb3NlSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2V4cHJlc3Npb25Hcm91cFRlbXBsYXRlIGxldC1leHByZXNzaW9uSXRlbT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1maWx0ZXItdHJlZVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2xpbmVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tYW5kJzogZXhwcmVzc2lvbkl0ZW0/Lm9wZXJhdG9yID09PSAwLFxuICAgICAgICAgICAgICAgICAgICAnaWd4LWZpbHRlci10cmVlX19saW5lLS1vcic6IGV4cHJlc3Npb25JdGVtPy5vcGVyYXRvciA9PT0gMSxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tc2VsZWN0ZWQnOiBleHByZXNzaW9uSXRlbT8uc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnZva2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cENsaWNrKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHNcIiBbc3R5bGUuZGlzcGxheV09XCIoaXNJbkVkaXRNb2RlKCkgJiYgdGhpcy5lbnRpdGllcy5sZW5ndGggPiAwICYmIHRoaXMuZW50aXRpZXNbMF0ubmFtZSkgPyAnZmxleCcgOiAnbm9uZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5wYXJlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtc2VsZWN0ICNlbnRpdHlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdpbmcpPVwib25FbnRpdHlTZWxlY3RDaGFuZ2luZygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3ZlcmxheVNldHRpbmdzXT1cImVudGl0eVNlbGVjdE92ZXJsYXlTZXR0aW5nc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cImlzSW5FZGl0TW9kZSgpID8gJ2Jsb2NrJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3NlbGVjdF9lbnRpdHkgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtc2VsZWN0LWl0ZW0gKm5nRm9yPVwibGV0IGVudGl0eSBvZiBlbnRpdGllc1wiIFt2YWx1ZV09XCJlbnRpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlbnRpdHkubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY29tYm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0ZWRSZXR1cm5GaWVsZHNDb21ib1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc01heEhlaWdodF09XCIyNTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImZpZWxkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlLZXldPVwiJ2ZpZWxkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlS2V5XT1cIidmaWVsZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRSZXR1cm5GaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwicmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyPVwie3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfc2VhcmNoIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJpc0luRWRpdE1vZGUoKSA/ICdibG9jaycgOiAnbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDb21ib0hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZHJvcC1kb3duX19pdGVtIGlneC1kcm9wLWRvd25fX2l0ZW0tLXF1ZXJ5LWJ1aWxkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0QWxsQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaWd4LWRyb3AtZG93bl9faXRlbS0tc2VsZWN0ZWQnOiB0aGlzLnNlbGVjdGVkRW50aXR5ICYmIHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMgJiYgdGhpcy5zZWxlY3RlZEVudGl0eS5maWVsZHMubGVuZ3RoID09PSB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzLmxlbmd0aH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInRoaXMuc2VsZWN0ZWRFbnRpdHkgJiYgdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkcyAmJiB0aGlzLnNlbGVjdGVkRW50aXR5LmZpZWxkcy5sZW5ndGggPT09IHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwidGhpcy5zZWxlY3RlZEVudGl0eSAmJiB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzICYmIHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzLmxlbmd0aCA8IHRoaXMuc2VsZWN0ZWRFbnRpdHkuZmllbGRzPy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlUmlwcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlneC1jb21ib19fY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1kcm9wLWRvd25fX2lubmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfc2VsZWN0X2FsbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3NlbGVjdF9yZXR1cm5fZmllbGRzIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNvbWJvPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGV4cHIgb2YgZXhwcmVzc2lvbkl0ZW0/LmNoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHByZXNzaW9uR3JvdXAoZXhwcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBleHByZXNzaW9uR3JvdXBUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wZXJhbmRUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHIpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50R3JvdXAgPT09IGV4cHJlc3Npb25JdGVtICYmIGlzSW5FZGl0TW9kZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgI2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2J1dHRvbnNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHByZXNzaW9uc1RlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQoZXhwcmVzc2lvbkl0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJleHByZXNzaW9uSXRlbSAhPT0gcm9vdEdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNFZGl0ZWRFeHByZXNzaW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uY2hpbGRyZW4ubGVuZ3RoIDwgMlxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbmRHcm91cChleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2VuZF9ncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm9vdEdyb3VwXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbkdyb3VwVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dChyb290R3JvdXApXG4gICAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2XG4gICAgICAgIGlneFRvZ2dsZVxuICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItY29udGV4dHVhbC1tZW51XCJcbiAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgICAoY2xvc2VkKT1cImNvbnRleHRNZW51Q2xvc2VkKClcIlxuICAgID5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGlneEljb25CdXR0b249XCJmbGF0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVfX2Nsb3NlLWJ0blwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWxlY3Rpb24oKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjbG9zZUljb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRleHR1YWxHcm91cFwiPlxuICAgICAgICAgICAgPGlneC1idXR0b25ncm91cFxuICAgICAgICAgICAgICAgIFt2YWx1ZXNdPVwiZmlsdGVyaW5nTG9naWNzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdEZpbHRlcmluZ0xvZ2ljKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9pZ3gtYnV0dG9uZ3JvdXA+XG5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY29udGV4dHVhbEdyb3VwLnBhcmVudFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVuZ3JvdXAoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImRlZmF1bHRcIiBuYW1lPVwidW5ncm91cFwiPjwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfdW5ncm91cFxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlR3JvdXAoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLWNvbnRleHR1YWwtbWVudV9fZGVsZXRlLWJ0blwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImRlZmF1bHRcIiBuYW1lPVwiZGVsZXRlXCI+PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9kZWxldGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGV4dHVhbEdyb3VwXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlQW5kR3JvdXAoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfY3JlYXRlX2FuZF9ncm91cCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlT3JHcm91cCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9jcmVhdGVfb3JfZ3JvdXAgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLWNvbnRleHR1YWwtbWVudV9fZGVsZXRlLWJ0blwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGVsZXRlX2ZpbHRlcnMgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2XG4gICAgI292ZXJsYXlPdXRsZXRcbiAgICBpZ3hPdmVybGF5T3V0bGV0XG4gICAgY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlcl9fb3V0bGV0XCJcbiAgICAocG9pbnRlcmRvd24pPVwib25PdXRsZXRQb2ludGVyRG93bigkZXZlbnQpXCJcbj48L2Rpdj5cblxuPGlneC1kaWFsb2dcbiAgICAjZW50aXR5Q2hhbmdlRGlhbG9nXG4gICAgdGl0bGU9XCJ7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9kaWFsb2dfdGl0bGUgfX1cIlxuICAgIGxlZnRCdXR0b25MYWJlbD1cInt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RpYWxvZ19jYW5jZWwgfX1cIlxuICAgIHJpZ2h0QnV0dG9uTGFiZWw9XCJ7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9kaWFsb2dfY29uZmlybSB9fVwiXG4gICAgKGxlZnRCdXR0b25TZWxlY3QpPVwib25FbnRpdHlDaGFuZ2VDYW5jZWwoKVwiXG4gICAgKHJpZ2h0QnV0dG9uU2VsZWN0KT1cIm9uRW50aXR5Q2hhbmdlQ29uZmlybSgpXCI+XG4gICAgPHNlY3Rpb24gY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlci1kaWFsb2dcIj5cbiAgICAgICAgPHA+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGlhbG9nX21lc3NhZ2UgfX08L3A+XG4gICAgICAgIDxpZ3gtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2hvd0VudGl0eUNoYW5nZURpYWxvZ0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIj5cbiAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RpYWxvZ19jaGVja2JveF90ZXh0IH19XG4gICAgICAgIDwvaWd4LWNoZWNrYm94PlxuICAgIDwvc2VjdGlvbj5cbjwvaWd4LWRpYWxvZz5cbiJdfQ==
|