@microsoft/windows-admin-center-sdk 2.186.0 → 2.295.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angular/assets/strings/cs-CZ/strings.json +1 -1
- package/angular/assets/strings/de-DE/strings.json +1 -1
- package/angular/assets/strings/es-ES/strings.json +1 -1
- package/angular/assets/strings/fr-FR/strings.json +1 -1
- package/angular/assets/strings/hu-HU/strings.json +1 -1
- package/angular/assets/strings/it-IT/strings.json +1 -1
- package/angular/assets/strings/ja-JP/strings.json +1 -1
- package/angular/assets/strings/ko-KR/strings.json +1 -1
- package/angular/assets/strings/nl-NL/strings.json +1 -1
- package/angular/assets/strings/pl-PL/strings.json +1 -1
- package/angular/assets/strings/pt-BR/strings.json +1 -1
- package/angular/assets/strings/pt-PT/strings.json +1 -1
- package/angular/assets/strings/ru-RU/strings.json +1 -1
- package/angular/assets/strings/strings.json +1 -1
- package/angular/assets/strings/sv-SE/strings.json +1 -1
- package/angular/assets/strings/tr-TR/strings.json +1 -1
- package/angular/assets/strings/zh-CN/strings.json +1 -1
- package/angular/assets/strings/zh-TW/strings.json +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +1103 -1209
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +2 -2
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
- package/angular/esm2015/src/controls/actions/actions.module.js +2 -2
- package/angular/esm2015/src/controls/actions/containers/action-bar/action-bar.component.js +2 -2
- package/angular/esm2015/src/controls/actions/items/action-button/action-button-renderer.component.js +5 -5
- package/angular/esm2015/src/controls/actions/items/action-dropdown/action-dropdown.component.js +31 -13
- package/angular/esm2015/src/controls/actions/items/action-item.component.js +7 -3
- package/angular/esm2015/src/controls/badge/badge-base.component.js +2 -13
- package/angular/esm2015/src/controls/badge/bugfixes-feature-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/coming-soon-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/credssp-enabled-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/critical-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/custom-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/feedback-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/improvement-feature-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/new-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/new-feature-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/preview-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/warning-badge.component.js +42 -70
- package/angular/esm2015/src/controls/breadcrumb/breadcrumb.component.js +6 -6
- package/angular/esm2015/src/controls/breadcrumb-header/breadcrumb-header.component.js +2 -2
- package/angular/esm2015/src/controls/data-table/data-table-column.component.js +5 -3
- package/angular/esm2015/src/controls/data-table/data-table.component.js +20 -26
- package/angular/esm2015/src/controls/data-table/extensions/data-table-column-picker-extension.js +2 -1
- package/angular/esm2015/src/controls/details/details.component.js +2 -2
- package/angular/esm2015/src/controls/dialog/base-dialog.component.js +1 -1
- package/angular/esm2015/src/controls/dialog/confirmation-dialog/confirmation-dialog.component.js +20 -30
- package/angular/esm2015/src/controls/dialog/dialog.service.js +7 -3
- package/angular/esm2015/src/controls/dropdown/dropdown.component.js +2 -2
- package/angular/esm2015/src/controls/form/form-field/array/array-form-field.component.js +50 -40
- package/angular/esm2015/src/controls/form/form-field/checklist/checklist-form-field.component.js +3 -3
- package/angular/esm2015/src/controls/form/form-field/combobox/combobox-form-field.component.js +14 -13
- package/angular/esm2015/src/controls/form/form-field/datetime/datetime-form-field.component.js +2 -2
- package/angular/esm2015/src/controls/form/form-field/form-field.component.js +16 -4
- package/angular/esm2015/src/controls/form/form-field/options-form-field/form-field-option.component.js +5 -3
- package/angular/esm2015/src/controls/form/form-field/ordered-list/ordered-list-form-field.component.js +25 -21
- package/angular/esm2015/src/controls/form/form-field/radio-group/classic/radio-group-form-field.component.js +5 -5
- package/angular/esm2015/src/controls/form/form-field/search/search-form-field.component.js +2 -2
- package/angular/esm2015/src/controls/form/form-field/tags/tags-form-field.component.js +2 -2
- package/angular/esm2015/src/controls/form/validation-alert/validation-alert.component.js +4 -10
- package/angular/esm2015/src/controls/form/validation-alert/validation-alert.js +1 -1
- package/angular/esm2015/src/controls/horizontal-bar-chart/stacked-horizontal-bar-chart.component.js +17 -1
- package/angular/esm2015/src/controls/icon/layered-icon/layered-icon.component.js +12 -1
- package/angular/esm2015/src/controls/icon/layered-icon/status/status-icon.component.js +53 -9
- package/angular/esm2015/src/controls/loading-wheel/loading-wheel.component.js +17 -1
- package/angular/esm2015/src/controls/master-view/master-view.component.js +34 -30
- package/angular/esm2015/src/controls/pivot/pivot-tab.component.js +1 -1
- package/angular/esm2015/src/controls/pivot/pivot.component.js +21 -9
- package/angular/esm2015/src/controls/property-grid/property-grid.component.js +13 -29
- package/angular/esm2015/src/controls/schema-form/schema-form-content.component.js +7 -4
- package/angular/esm2015/src/controls/settings/common-settings/common-settings.component.js +23 -35
- package/angular/esm2015/src/controls/settings/settings.component.js +28 -1
- package/angular/esm2015/src/controls/settings/settings.module.js +8 -3
- package/angular/esm2015/src/controls/tooltip/tooltip-host.component.js +16 -5
- package/angular/esm2015/src/controls/wizard/wizard.component.js +38 -6
- package/angular/esm2015/src/directives/clamp/clamp.directive.js +26 -7
- package/angular/esm2015/src/directives/discard/discard.directive.js +2 -2
- package/angular/esm2015/src/directives/markdown/markdown.directive.js +5 -18
- package/angular/esm2015/src/generated/strings.js +1 -1
- package/angular/esm2015/src/guards/experiment.guard.service.js +14 -1
- package/angular/esm2015/src/pipes/boolean-converter-pipe.js +11 -1
- package/angular/esm2015/src/pipes/byte-unit-converter-pipe.js +11 -1
- package/angular/esm2015/src/pipes/enum-converter-pipe.js +16 -1
- package/angular/esm2015/src/pipes/format-pipe.js +11 -1
- package/angular/esm2015/src/pipes/highlight-pipe.js +11 -1
- package/angular/esm2015/src/pipes/yesno-converter-pipe.js +11 -1
- package/angular/esm2015/src/service/gateway.service.js +8 -5
- package/angular/esm2015/src/service/notification.service.js +23 -1
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +1042 -1069
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
- package/angular/package.json +0 -1
- package/angular/src/controls/actions/items/action-dropdown/action-dropdown.component.d.ts +2 -0
- package/angular/src/controls/actions/items/action-item.component.d.ts +11 -1
- package/angular/src/controls/badge/badge-base.component.d.ts +0 -4
- package/angular/src/controls/data-table/data-table-column.component.d.ts +2 -1
- package/angular/src/controls/data-table/data-table.component.d.ts +4 -0
- package/angular/src/controls/dialog/base-dialog.component.d.ts +1 -1
- package/angular/src/controls/form/form-field/form-field.component.d.ts +10 -1
- package/angular/src/controls/form/form-field/options-form-field/form-field-option.component.d.ts +5 -1
- package/angular/src/controls/form/validation-alert/validation-alert.component.d.ts +0 -4
- package/angular/src/controls/form/validation-alert/validation-alert.d.ts +0 -1
- package/angular/src/controls/horizontal-bar-chart/stacked-horizontal-bar-chart.component.d.ts +16 -0
- package/angular/src/controls/icon/layered-icon/layered-icon.component.d.ts +11 -0
- package/angular/src/controls/icon/layered-icon/status/status-icon.component.d.ts +13 -2
- package/angular/src/controls/loading-wheel/loading-wheel.component.d.ts +16 -0
- package/angular/src/controls/master-view/master-view.component.d.ts +1 -0
- package/angular/src/controls/pivot/pivot-tab.component.d.ts +0 -1
- package/angular/src/controls/pivot/pivot.component.d.ts +4 -0
- package/angular/src/controls/settings/common-settings/common-settings.component.d.ts +6 -5
- package/angular/src/controls/settings/settings.component.d.ts +27 -0
- package/angular/src/controls/settings/settings.module.d.ts +7 -6
- package/angular/src/controls/tooltip/tooltip-host.component.d.ts +1 -1
- package/angular/src/controls/wizard/wizard.component.d.ts +23 -0
- package/angular/src/directives/clamp/clamp.directive.d.ts +5 -0
- package/angular/src/directives/markdown/markdown.directive.d.ts +2 -3
- package/angular/src/generated/strings.d.ts +9 -0
- package/angular/src/guards/experiment.guard.service.d.ts +13 -0
- package/angular/src/pipes/boolean-converter-pipe.d.ts +10 -0
- package/angular/src/pipes/byte-unit-converter-pipe.d.ts +10 -0
- package/angular/src/pipes/enum-converter-pipe.d.ts +15 -0
- package/angular/src/pipes/format-pipe.d.ts +10 -0
- package/angular/src/pipes/highlight-pipe.d.ts +10 -0
- package/angular/src/pipes/yesno-converter-pipe.d.ts +10 -0
- package/angular/src/service/gateway.service.d.ts +3 -1
- package/angular/src/service/notification.service.d.ts +22 -0
- package/core/base/environment.d.ts +7 -0
- package/core/base/environment.js.map +1 -1
- package/core/base/versioned-object.js +2 -2
- package/core/base/versioned-object.js.map +1 -1
- package/core/data/cim-stream.js +8 -1
- package/core/data/cim-stream.js.map +1 -1
- package/core/data/core-environment.d.ts +4 -0
- package/core/data/core-environment.js +1 -0
- package/core/data/core-environment.js.map +1 -1
- package/core/data/crypto.js +10 -9
- package/core/data/crypto.js.map +1 -1
- package/core/data/file-transfer.js +5 -1
- package/core/data/file-transfer.js.map +1 -1
- package/core/data/gateway-connection.d.ts +11 -1
- package/core/data/gateway-connection.js +51 -9
- package/core/data/gateway-connection.js.map +1 -1
- package/core/data/http-constants.d.ts +5 -1
- package/core/data/http-constants.js +5 -1
- package/core/data/http-constants.js.map +1 -1
- package/core/data/net.d.ts +15 -11
- package/core/data/net.js +44 -41
- package/core/data/net.js.map +1 -1
- package/core/data/node-connection.d.ts +2 -2
- package/core/data/node-connection.js.map +1 -1
- package/core/data/powershell-stream.js +11 -3
- package/core/data/powershell-stream.js.map +1 -1
- package/core/data/powershell.d.ts +17 -1
- package/core/data/powershell.js +35 -9
- package/core/data/powershell.js.map +1 -1
- package/core/data/settings-manager.d.ts +9 -0
- package/core/data/settings-manager.js +18 -1
- package/core/data/settings-manager.js.map +1 -1
- package/core/generated/powershell-scripts.d.ts +5 -4
- package/core/generated/powershell-scripts.js +5 -4
- package/core/generated/powershell-scripts.js.map +1 -1
- package/core/host/host-core-manager.d.ts +36 -0
- package/core/host/host-core-manager.js +134 -0
- package/core/host/host-core-manager.js.map +1 -0
- package/core/host/host-core-message-type.d.ts +12 -0
- package/core/host/host-core-message-type.js +17 -0
- package/core/host/host-core-message-type.js.map +1 -0
- package/core/host/host-core-messages.d.ts +14 -0
- package/core/host/host-core-messages.js +3 -0
- package/core/host/host-core-messages.js.map +1 -0
- package/core/manifest/manifest-loader.d.ts +2 -1
- package/core/manifest/manifest-loader.js +27 -18
- package/core/manifest/manifest-loader.js.map +1 -1
- package/core/notification/notification.js +4 -0
- package/core/notification/notification.js.map +1 -1
- package/core/security/authorization-manager.d.ts +44 -0
- package/core/security/authorization-manager.js +111 -5
- package/core/security/authorization-manager.js.map +1 -1
- package/core/security/sign-on-manager.d.ts +109 -0
- package/core/security/sign-on-manager.js +119 -0
- package/core/security/sign-on-manager.js.map +1 -0
- package/core/security/tag-manager.js.map +1 -1
- package/core/shared/cluster-inventory/cluster-inventory-cache.js +3 -2
- package/core/shared/cluster-inventory/cluster-inventory-cache.js.map +1 -1
- package/core/shared/gateway-inventory/gateway-inventory-cache.d.ts +1 -1
- package/core/shared/gateway-inventory/gateway-inventory-cache.js +1 -1
- package/core/shared/gateway-inventory/gateway-inventory-cache.js.map +1 -1
- package/core/shared/server-inventory/server-inventory-cache.js +2 -1
- package/core/shared/server-inventory/server-inventory-cache.js.map +1 -1
- package/core/shared/tool-inventory/tool-inventory-cache.js +1 -1
- package/core/shared/tool-inventory/tool-inventory-cache.js.map +1 -1
- package/e2e/assets/strings/cs-CZ/strings.json +1 -1
- package/e2e/assets/strings/de-DE/strings.json +1 -1
- package/e2e/assets/strings/es-ES/strings.json +1 -1
- package/e2e/assets/strings/fr-FR/strings.json +1 -1
- package/e2e/assets/strings/hu-HU/strings.json +1 -1
- package/e2e/assets/strings/it-IT/strings.json +1 -1
- package/e2e/assets/strings/ja-JP/strings.json +1 -1
- package/e2e/assets/strings/ko-KR/strings.json +1 -1
- package/e2e/assets/strings/nl-NL/strings.json +1 -1
- package/e2e/assets/strings/pl-PL/strings.json +1 -1
- package/e2e/assets/strings/pt-BR/strings.json +1 -1
- package/e2e/assets/strings/pt-PT/strings.json +1 -1
- package/e2e/assets/strings/ru-RU/strings.json +1 -1
- package/e2e/assets/strings/strings.json +1 -1
- package/e2e/assets/strings/sv-SE/strings.json +1 -1
- package/e2e/assets/strings/tr-TR/strings.json +1 -1
- package/e2e/assets/strings/zh-CN/strings.json +1 -1
- package/e2e/assets/strings/zh-TW/strings.json +1 -1
- package/package.json +5 -5
- package/styles/css/fonts.css +2 -2
- package/styles/css/main.css +1 -1
- package/styles/fonts/ServMDL2/ServMDL2-4.62.woff +0 -0
- package/styles/fonts/ServMDL2/ServMDL2.json +238 -2039
- package/styles/fonts/ServMDL2/ServMDL2.scss +238 -2039
- package/tools/gulp-manifest-resource/index.js +3 -1
- package/tools/gulp-manifest-resource/index.js.map +1 -1
- package/tools/gulp-ps-cim/index.js +1 -1
- package/tools/gulp-ps-cim/index.js.map +1 -1
- package/tools/gulp-ps-cim/powershell-cim-config-schema.json +1 -1
- package/tools/gulp-ps-code/index.js +36 -2
- package/tools/gulp-ps-code/index.js.map +1 -1
- package/tools/gulp-ps-code/ps-code-convert.js +4 -8
- package/tools/gulp-ps-code/ps-code-convert.js.map +1 -1
- package/tools/gulp-ps-resjson/index.js +79 -74
- package/tools/gulp-ps-resjson/index.js.map +1 -1
- package/tools/module-template/build/pipelines/codeinspector.yml +27 -0
- package/tools/module-template/gulpfile.ts/common/lint.ts +3 -3
- package/tools/module-template/gulpfile.ts/common/pack.ts +14 -14
- package/tools/module-template/gulpfile.ts/common/ui-test-automation.ts +40 -0
- package/tools/module-template/gulpfile.ts/common/utilities.ts +10 -10
- package/tools/module-template/gulpfile.ts/common/validate.ts +14 -4
- package/tools/module-template/gulpfile.ts/index.ts +20 -8
- package/tools/wac-cli/src/upgrade/file-updater.d.ts +1 -0
- package/tools/wac-cli/src/upgrade/file-updater.js +7 -1
- package/tools/wac-cli/src/upgrade/file-updater.js.map +1 -1
- package/styles/fonts/ServMDL2/ServMDL2-4.33.woff +0 -0
|
@@ -189,11 +189,17 @@ export class TooltipHostComponent extends CoreBaseComponent {
|
|
|
189
189
|
/**
|
|
190
190
|
* Escape key listener
|
|
191
191
|
*/
|
|
192
|
-
onClick() {
|
|
192
|
+
onClick(event) {
|
|
193
193
|
if (this.options && this.options.showOn === TooltipShowMode.Click) {
|
|
194
194
|
this.options.onWindowClick();
|
|
195
195
|
this.hide(this.options.targetid);
|
|
196
196
|
}
|
|
197
|
+
if (MsftSme.isNullOrUndefined(this.mousePosition)) {
|
|
198
|
+
this.mousePosition = {
|
|
199
|
+
x: event.x,
|
|
200
|
+
y: event.y
|
|
201
|
+
};
|
|
202
|
+
}
|
|
197
203
|
}
|
|
198
204
|
/**
|
|
199
205
|
* Show a tooltip with the given options
|
|
@@ -295,7 +301,12 @@ export class TooltipHostComponent extends CoreBaseComponent {
|
|
|
295
301
|
// then adjust the pointer and tooltip to align with the pointer
|
|
296
302
|
if (tooltipRect.width < targetRect.width) {
|
|
297
303
|
pointerLeft = (((tooltipRect.width / 2) - (pointerRect.width / 2)) - tooltipLeftMargin);
|
|
298
|
-
|
|
304
|
+
if (this.mousePosition.x <= 0) {
|
|
305
|
+
left = (tooltipRect.width / 2) - tooltipLeftMargin;
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
left = (this.mousePosition.x - ((tooltipRect.width / 2) - tooltipLeftMargin));
|
|
309
|
+
}
|
|
299
310
|
}
|
|
300
311
|
// check if right edge of tooltip is off the screen
|
|
301
312
|
const right = (left + tooltipRect.width);
|
|
@@ -376,7 +387,7 @@ TooltipHostComponent.SCREEN_EDGE_MARGIN = 16;
|
|
|
376
387
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.tooltipContainer = _t.first);
|
|
377
388
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.tooltipPointer = _t.first);
|
|
378
389
|
} }, hostBindings: function TooltipHostComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
379
|
-
i0.ɵɵlistener("resize", function TooltipHostComponent_resize_HostBindingHandler($event) { return ctx.onWindowResized($event); }, false, i0.ɵɵresolveWindow)("blur", function TooltipHostComponent_blur_HostBindingHandler($event) { return ctx.onWindowResized($event); }, false, i0.ɵɵresolveWindow)("keyup.escape", function TooltipHostComponent_keyup_escape_HostBindingHandler($event) { return ctx.onEscape($event); }, false, i0.ɵɵresolveDocument)("click", function TooltipHostComponent_click_HostBindingHandler() { return ctx.onClick(); }, false, i0.ɵɵresolveWindow);
|
|
390
|
+
i0.ɵɵlistener("resize", function TooltipHostComponent_resize_HostBindingHandler($event) { return ctx.onWindowResized($event); }, false, i0.ɵɵresolveWindow)("blur", function TooltipHostComponent_blur_HostBindingHandler($event) { return ctx.onWindowResized($event); }, false, i0.ɵɵresolveWindow)("keyup.escape", function TooltipHostComponent_keyup_escape_HostBindingHandler($event) { return ctx.onEscape($event); }, false, i0.ɵɵresolveDocument)("click", function TooltipHostComponent_click_HostBindingHandler($event) { return ctx.onClick($event); }, false, i0.ɵɵresolveWindow);
|
|
380
391
|
} }, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 4, consts: [[1, "sme-tooltip", "sme-tooltip-position-bottom", "sme-layer-tooltip", "sme-shadow-tooltip", 3, "focusin", "focusout", "mouseenter", "mouseleave"], ["tooltipContainer", ""], [1, "sme-tooltip-pointer"], ["tooltipPointer", ""], [1, "sme-tooltip-pointer-cover"], ["class", "sme-tooltip-content sme-focus-trap", 3, "id", 4, "ngIf"], ["aria-live", "assertive"], ["class", "sme-tooltip-content", 3, "id", 4, "ngIf"], [1, "sme-tooltip-content", "sme-focus-trap", 3, "id"], [4, "ngIf"], ["smeTemplateOutlet", "", 3, "template", "data", "hostData"], [1, "sme-font-label", 3, "id"], [1, "sme-tooltip-content", 3, "id"]], template: function TooltipHostComponent_Template(rf, ctx) { if (rf & 1) {
|
|
381
392
|
i0.ɵɵelementStart(0, "div", 0, 1);
|
|
382
393
|
i0.ɵɵlistener("focusin", function TooltipHostComponent_Template_div_focusin_0_listener($event) { return ctx.onFocusChanged($event); })("focusout", function TooltipHostComponent_Template_div_focusout_0_listener($event) { return ctx.onFocusChanged($event); })("mouseenter", function TooltipHostComponent_Template_div_mouseenter_0_listener($event) { return ctx.onHoverChanged($event); })("mouseleave", function TooltipHostComponent_Template_div_mouseleave_0_listener($event) { return ctx.onHoverChanged($event); });
|
|
@@ -417,6 +428,6 @@ TooltipHostComponent.SCREEN_EDGE_MARGIN = 16;
|
|
|
417
428
|
args: ['document:keyup.escape', ['$event']]
|
|
418
429
|
}], onClick: [{
|
|
419
430
|
type: HostListener,
|
|
420
|
-
args: ['window:click']
|
|
431
|
+
args: ['window:click', ['$event']]
|
|
421
432
|
}] }); })();
|
|
422
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC1ob3N0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3Rvb2x0aXAvdG9vbHRpcC1ob3N0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3Rvb2x0aXAvdG9vbHRpcC1ob3N0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRXZFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTdELE9BQU8sRUFBa0IsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7SUNDMUQsNkJBQXlDO0lBQ3ZDLDRCQUNlO0lBQ2pCLDBCQUFlOzs7SUFGbUIsZUFBNkI7SUFBN0Isa0RBQTZCLGdDQUFBLDZCQUFBOzs7SUFJL0QsNkJBQW9DO0lBQ2xDLDZCQUE2QztJQUMzQyw0QkFBTTtJQUFBLFlBQWlCO0lBQUEsaUJBQU87SUFDaEMsaUJBQUk7SUFDTiwwQkFBZTs7O0lBSGEsZUFBa0I7SUFBbEIsdUNBQWtCO0lBQ3BDLGVBQWlCO0lBQWpCLDBDQUFpQjs7O0lBVDdCLDhCQUM0RztJQUMxRyw2RkFHZTtJQUVmLDZGQUllO0lBQ2pCLGlCQUFNOzs7SUFYSiw2Q0FBd0I7SUFEcUQsdUNBQXNCLGdDQUFBLHVDQUFBLDhDQUFBO0lBRXBGLGVBQXdCO0lBQXhCLGdEQUF3QjtJQUt4QixlQUFtQjtJQUFuQiwyQ0FBbUI7OztJQVFs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bUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDOztrQkFDeEMsWUFBWTttQkFBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFZaEMsUUFBUTtrQkFEZCxZQUFZO21CQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDO1lBd0IxQyxPQUFPO2tCQURiLFlBQVk7bUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbmplY3RvciwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZG9tL2RvbSc7XHJcblxyXG5pbXBvcnQgeyBDb3JlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRvb2x0aXBIb3N0IH0gZnJvbSAnLi9tb2RlbHMvdG9vbHRpcC1ob3N0JztcclxuaW1wb3J0IHsgVG9vbHRpcE9wdGlvbnMsIFRvb2x0aXBTaG93TW9kZSB9IGZyb20gJy4vbW9kZWxzL3Rvb2x0aXAtb3B0aW9ucyc7XHJcbmltcG9ydCB7IFRvb2x0aXBIb3N0SW5zdGFuY2UgfSBmcm9tICcuL3Rvb2x0aXAtaG9zdC1pbnN0YW5jZSc7XHJcblxyXG5cclxuLyoqXHJcbiAqIFRvb2x0aXAgaG9zdCBjb21wb25lbnQgcHJvdmlkZXMgYSBob3N0IGZvciB0b29sdGlwcy5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtdG9vbHRpcC1ob3N0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi90b29sdGlwLWhvc3QuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUb29sdGlwSG9zdENvbXBvbmVudCBleHRlbmRzIENvcmVCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIFRvb2x0aXBIb3N0IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnVG9vbHRpcEhvc3RDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNDUkVFTl9FREdFX01BUkdJTiA9IDE2O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbmQgcG9zaXRpb25zIHRoZSB0b29sdGlwXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ3Rvb2x0aXBDb250YWluZXInKVxyXG4gICAgcHVibGljIHRvb2x0aXBDb250YWluZXI6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gcG9pbnQgdG8gdGhlIHRhcmdldCBvZiB0aGUgdG9vbHRpcFxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCd0b29sdGlwUG9pbnRlcicpXHJcbiAgICBwdWJsaWMgdG9vbHRpcFBvaW50ZXI6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY3VycmVudCB0b29sdGlwIG9wdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9wdGlvbnM6IFRvb2x0aXBPcHRpb25zO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgcGxhY2Vob2xkZXIgZm9yIHRoZSBjdXJyZW50IGZvY3VzZWQgc3RhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmb2N1c2VkOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgcGxhY2Vob2xkZXIgZm9yIHRoZSBjdXJyZW50IGhvdmVyZWQgc3RhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBob3ZlcmVkOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogY29udGFpbmVyIGZvciBob3N0IHNwZWNpZmljIGRhdGEgYmVpbmcgcGFzc2VkIHRvIHRoZSB0b29sdGlwIHRlbXBsYXRlIGNvbnRleHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhvc3REYXRhOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGlzIGhvc3RpbmcgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW91c2VQb3NpdGlvbjogV2ViS2l0UG9pbnQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3VzZSBtb3ZlIGxpc3RlbmVyIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25Nb3VzZU1vdmVMaXN0ZW5lcjogKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogaW5kaWNhdGVzIHRoYXQgdGhlIHRvb2x0aXAgaGFzIGZvY3VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNGb2N1c2VkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMgJiYgdGhpcy5pc1Nob3duKHRoaXMub3B0aW9ucy50YXJnZXRpZCkgJiYgdGhpcy5mb2N1c2VkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogaW5kaWNhdGVzIHRoYXQgdGhlIHRvb2x0aXAgaXMgaG92ZXJlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGlzSG92ZXJlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zICYmIHRoaXMuaXNTaG93bih0aGlzLm9wdGlvbnMudGFyZ2V0aWQpICYmIHRoaXMuaG92ZXJlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHJvbGUgdGhhdCB0aGlzIHRvb2x0aXAgaXMgcGxheWluZy4gSWYgdGhlIHRvb2x0aXAgaXMgdGV4dCBvbmx5LFxyXG4gICAgICogdGhlbiBpdCBpcyB0cmVhdGVkIGFzIGEgZGlhbG9nLlxyXG4gICAgICogb3RoZXJ3aXNlIGl0IGlzIHRyZWF0ZWQgYXMgYSB0b29sdGlwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXJpYVJvbGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMudGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdhbGVydGRpYWxvZyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAndG9vbHRpcCc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBhcmlhIG1vZGFsIGF0dHJpYnV0ZSB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGFyaWFNb2RhbCgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy50ZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRvb2x0aXAgY29udGVudCBvdXRzaWRlIHRoZSBhcmlhLWxpdmUgcmVnaW9uIHdpbGwgYmUgc2hvd25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzaG93Tm9uQXJpYUxpdmVDb250ZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMgJiYgKCEhdGhpcy5vcHRpb25zLnRlbXBsYXRlIHx8ICF0aGlzLm9wdGlvbnMuc2hvdWxkUmVhZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRvb2x0aXAgY29udGVudCBpbnNpZGUgdGhlIGFyaWEtbGl2ZSByZWdpb24gd2lsbCBiZSBzaG93blxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNob3dBcmlhTGl2ZUNvbnRlbnQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc2hvdWxkUmVhZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBAc2VlIFRvb2x0aXBIb3N0Q29tcG9uZW50IGNsYXNzLlxyXG4gICAgICogQHBhcmFtIGluamVjdG9yIFRoZSBhbmd1bGFyIGluamVjdGlvbiBzZXJ2aWNlLiByZXF1aXJlZCBieSBAU21lSW5qZWN0YWJsZSgpIGRlY29yYXRvciBpbiB0aGUgYmFzZSBAc2VlIEJhc2VDb21wb25lbnQgY2xhc3NcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICBUb29sdGlwSG9zdEluc3RhbmNlLnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaG9zdERhdGEgPSB7IGFyaWFMYWJlbElkOiB0aGlzLmlkQmFnLmxhYmVsLCBhcmlhRGVzY3JpcHRpb25JZDogdGhpcy5pZEJhZy5kZXNjcmlwdGlvbiB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMub25Nb3VzZU1vdmVMaXN0ZW5lciA9IHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT5cclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmVMaXN0ZW5lcik7XHJcbiAgICAgICAgVG9vbHRpcEhvc3RJbnN0YW5jZS51bnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2NjdXJzIHdoZW4gdGhlIHRvb2x0aXAgY29udGFpbmVyIGlzIGZvY3VzZWQgb3IgdW5mb2N1c2VkXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGZvY3VzaW4gb3IgZm9jdXNvdXQgZXZlbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRm9jdXNDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IHRoaXMub3B0aW9ucyAmJiAoZXZlbnQudHlwZSA9PT0gJ2ZvY3VzaW4nIHx8ICh0aGlzLmZvY3VzZWQgJiYgZXZlbnQudHlwZSAhPT0gJ2ZvY3Vzb3V0JykpO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uU3RhdGVDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2NjdXJzIHdoZW4gdGhlIHRvb2x0aXAgY29udGFpbmVyIGlzIGhvdmVyZWQgb3IgdW4taG92ZXJlZFxyXG4gICAgICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZWVudGVyIG9yIG1vdXNlbGVhdmUgZXZlbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSG92ZXJDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIHRoaXMuaG92ZXJlZCA9IHRoaXMub3B0aW9ucyAmJiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlZW50ZXInIHx8ICh0aGlzLmhvdmVyZWQgJiYgZXZlbnQudHlwZSAhPT0gJ21vdXNlbGVhdmUnKSk7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub25TdGF0ZUNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaW5kb3cgcmVzaXplIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJsdXInLCBbJyRldmVudCddKVxyXG4gICAgcHVibGljIG9uV2luZG93UmVzaXplZChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSh0aGlzLm9wdGlvbnMudGFyZ2V0aWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzY2FwZSBrZXkgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgLy8gZG9jdW1lbnQ6a2V5dXAuZXNjYXBlIGlzIHVzZWQgc28gdGhhdCBhIGRpYWxvZyBpcyBub3QgY2xvc2VkIHdoZW4gdHJ5aW5nIHRvIGNsb3NlIGEgdG9vbHRpcFxyXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5dXAuZXNjYXBlJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBvbkVzY2FwZShldmVudDogRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIFN0b3AgcHJvcGFnYXRpb24gc28gdGhhdCBpZiBpbiBhIGRpYWxvZyBpdCB3aWxsIG5vdCBjbG9zZS5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSh0aGlzLm9wdGlvbnMudGFyZ2V0aWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdXNlIG1vdmVtZW50IGxpc3RlbmVyXHJcbiAgICAgKiBXZSBkbyBub3QgdXNlIEhvc3RMaXN0ZW5lciBoZXJlIHRvIGF2b2lkIGludm9raW5nIGNoYW5nZSBkZXRlY3Rpb24gZm9yIGFsbCBtb3VzZW1vdmUgZXZlbnRzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5tb3VzZVBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICB4OiBldmVudC54LFxyXG4gICAgICAgICAgICB5OiBldmVudC55XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzY2FwZSBrZXkgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OmNsaWNrJylcclxuICAgIHB1YmxpYyBvbkNsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnNob3dPbiA9PT0gVG9vbHRpcFNob3dNb2RlLkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbldpbmRvd0NsaWNrKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSh0aGlzLm9wdGlvbnMudGFyZ2V0aWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgYSB0b29sdGlwIHdpdGggdGhlIGdpdmVuIG9wdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3cob3B0aW9uczogVG9vbHRpcE9wdGlvbnMpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSh0aGlzLm9wdGlvbnMudGFyZ2V0aWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIHRoaXMucmVwb3NpdGlvbihmYWxzZSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBEb20uZ2V0TmV4dEZvY3VzYWJsZUVsZW1lbnQodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgaWYgKG5leHQpIHtcclxuICAgICAgICAgICAgICAgIG5leHQuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgYWN0aXZlIHRvb2x0aXAgd2l0aCBuZXcgb3B0aW9uc1xyXG4gICAgICogQHBhcmFtIGlkIHRoZSB0b29sdGlwIGlkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGUob3B0aW9uczogVG9vbHRpcE9wdGlvbnMpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc1Nob3duKG9wdGlvbnMudGFyZ2V0aWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb250ZW50SWQgPSBvcHRpb25zLmNvbnRlbnRJZDtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50ZW1wbGF0ZSA9IG9wdGlvbnMudGVtcGxhdGU7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50aXRsZSA9IG9wdGlvbnMudGl0bGU7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50O1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucGxhY2VtZW50ID0gb3B0aW9ucy5wbGFjZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVwb3NpdGlvbihmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlcyB0aGUgdG9vbHRpcCB3aXRoIHRoZSBnaXZlbiBpZFxyXG4gICAgICogQHBhcmFtIGlkIHRoZSB0b29sdGlwIGlkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc1Nob3duKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy50YXJnZXRpZCA9PT0gaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlcyB0aGUgdG9vbHRpcCB3aXRoIHRoZSBnaXZlbiBpZFxyXG4gICAgICogQHBhcmFtIGlkIHRoZSB0b29sdGlwIGlkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoaWRlKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc1Nob3duKGlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLmhvdmVyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIGlmIHdlIG9wZW5lZCBhIHRlbXBsYXRlLCByZXN0b3JlIGZvY3VzIHRvIHRoZSBvcmlnaW5hbCBlbGVtZW50IHdoZW4gd2UgY2xvc2UgdGhlIHRvb2x0aXBcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50ZW1wbGF0ZSAmJiB0aGlzLm9wdGlvbnMucmVzdG9yZUZvY3VzVG8pIHtcclxuICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdGVtcGxhdGUgaGFkIGFueSBmb2N1c2FibGUgZWxlbWVudHMgdGhhdCBjYXVzZWQgZm9jdXMgdG8gY2hhbmdlXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0b29sdGlwRm9jdXNhYmxlRWxlbWVudCA9IERvbS5nZXRGaXJzdEVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgPEhUTUxFbGVtZW50PnRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0+IERvbS5pc0ZvY3VzYWJsZShlbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmICh0b29sdGlwRm9jdXNhYmxlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5yZXN0b3JlRm9jdXNUby5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBSZXNldCBwb3NpdGlvbmluZyBzbyB0aGF0IHNtZS1sYXlvdXQtb2ZmLXNjcmVlbiB3aWxsIG5vdCBiZSBvdmVycmlkZGVuXHJcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIG9wdGlvbnMgYXJlIG51bGwuXHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2x0aXAgPSA8SFRNTEVsZW1lbnQ+dGhpcy50b29sdGlwQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUodG9vbHRpcCwgJ2xlZnQnKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0b29sdGlwLCAndG9wJyk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwb3NpdGlvbnMgdGhlIHRvb2x0aXBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZXBvc2l0aW9uKGZpbmFsUmVwb3NpdGlvbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMpIHtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIG5vIGxvbmdlciBpbiB0aGUgZG9tLCBjYW5jZWwgdGhlIHRvb2x0aXBcclxuICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMub3B0aW9ucy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUodGhpcy5vcHRpb25zLnRhcmdldGlkKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gR2V0IGVsZW1lbnRzIGZvciBtYW5pcHVsYXRpb25cclxuICAgICAgICAgICAgY29uc3QgcG9pbnRlciA9IDxIVE1MRWxlbWVudD50aGlzLnRvb2x0aXBQb2ludGVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2x0aXAgPSA8SFRNTEVsZW1lbnQ+dGhpcy50b29sdGlwQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgYm91bmRpbmcgcmVjdGFuZ2xlcyBmb3IgbWVhc3VyZW1lbnRcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0UmVjdCA9ICg8SFRNTEVsZW1lbnQ+dGhpcy5vcHRpb25zLmVsZW1lbnQubmF0aXZlRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGhvc3RSZWN0ID0gKDxIVE1MRWxlbWVudD50aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBwb2ludGVyUmVjdCA9IHBvaW50ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2x0aXBSZWN0ID0gdG9vbHRpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGdldCBpbml0aWFsIHRvcCBhbmQgbGVmdCBwb3NpdGlvbiBvZiB0aGUgdG9vbHRpcFxyXG4gICAgICAgICAgICBjb25zdCBsZWZ0QWRqdXN0bWVudCA9IDI7IC8vIEFkanVzdCB0aGUgdG9vbHRpcCBsb2NhdGlvbiBhIGxpdHRsZSBiaXQgdG8gYWxpZ24gd2l0aCBzb21lIGljb25zIChhcyB0YXJnZXQpIGJldHRlci5cclxuICAgICAgICAgICAgbGV0IGxlZnQgPSB0YXJnZXRSZWN0LmxlZnQgLSBob3N0UmVjdC5sZWZ0ICsgbGVmdEFkanVzdG1lbnQ7XHJcbiAgICAgICAgICAgIGxldCB0b3AgPSAodGFyZ2V0UmVjdC50b3AgLSBob3N0UmVjdC50b3ApICsgdGFyZ2V0UmVjdC5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIG1hcmdpbiBvZiB0aGUgdG9vbHRpcCBhbmQgaW5jbHVkZSB0aGF0IGluIHRoZSBjYWxjdWxhdGlvblxyXG4gICAgICAgICAgICBjb25zdCB0b29sdGlwTGVmdE1hcmdpbiA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRvb2x0aXApLm1hcmdpbkxlZnQsIDEwKTtcclxuICAgICAgICAgICAgY29uc3QgdG9vbHRpcFJpZ2h0TWFyZ2luID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodG9vbHRpcCkubWFyZ2luUmlnaHQsIDEwKTtcclxuICAgICAgICAgICAgbGV0IHBvaW50ZXJMZWZ0ID0gKCh0YXJnZXRSZWN0LndpZHRoIC8gMikgLSAocG9pbnRlclJlY3Qud2lkdGggLyAyKSkgLSB0b29sdGlwTGVmdE1hcmdpbjtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBwb2ludGVyIGhhbmdzIG9mZiB0aGUgbGVmdCBzaWRlIG9mIHRoZSB0b29sdGlwLCB0aGVuIGFkanVzdCB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgdG9vbHRpcCBhbmQgcG9pbnRlclxyXG4gICAgICAgICAgICBpZiAocG9pbnRlckxlZnQgPCB0b29sdGlwTGVmdE1hcmdpbikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdE9mZnNldCA9IHRvb2x0aXBMZWZ0TWFyZ2luIC0gcG9pbnRlckxlZnQ7XHJcbiAgICAgICAgICAgICAgICBsZWZ0IC09IGxlZnRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBwb2ludGVyTGVmdCArPSBsZWZ0T2Zmc2V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBvbiB0aGUgc2Vjb25kIHJvdW5kLCB3ZSBjYW4gdGFrZSB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBvZiB0aGUgdG9vbHRpcCBpbnRvIGFjY291bnQuXHJcbiAgICAgICAgICAgIGlmIChmaW5hbFJlcG9zaXRpb24gJiYgdG9vbHRpcFJlY3QuaGVpZ2h0ID4gMCAmJiB0b29sdGlwUmVjdC53aWR0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmVuZGVyZWQgdG9vbHRpcCB3aWR0aCxcclxuICAgICAgICAgICAgICAgIC8vIHRoZW4gYWRqdXN0IHRoZSBwb2ludGVyIGFuZCB0b29sdGlwIHRvIGFsaWduIHdpdGggdGhlIHBvaW50ZXJcclxuICAgICAgICAgICAgICAgIGlmICh0b29sdGlwUmVjdC53aWR0aCA8IHRhcmdldFJlY3Qud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBwb2ludGVyTGVmdCA9ICgoKHRvb2x0aXBSZWN0LndpZHRoIC8gMikgLSAocG9pbnRlclJlY3Qud2lkdGggLyAyKSkgLSB0b29sdGlwTGVmdE1hcmdpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9ICh0aGlzLm1vdXNlUG9zaXRpb24ueCAtICgodG9vbHRpcFJlY3Qud2lkdGggLyAyKSAtIHRvb2x0aXBMZWZ0TWFyZ2luKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgcmlnaHQgZWRnZSBvZiB0b29sdGlwIGlzIG9mZiB0aGUgc2NyZWVuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IChsZWZ0ICsgdG9vbHRpcFJlY3Qud2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHRPdmVyZmxvdyA9IHJpZ2h0IC0gKGhvc3RSZWN0LnJpZ2h0IC0gVG9vbHRpcEhvc3RDb21wb25lbnQuU0NSRUVOX0VER0VfTUFSR0lOKTtcclxuICAgICAgICAgICAgICAgIGlmIChyaWdodE92ZXJmbG93ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdCBsZWZ0IHBvc2l0aW9uIHRvIGFjY291bnQgZm9yIHJpZ2h0IG9mZnNldFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gcmlnaHRPdmVyZmxvdztcclxuICAgICAgICAgICAgICAgICAgICBwb2ludGVyTGVmdCArPSByaWdodE92ZXJmbG93O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFkanVzdCBmb3IgdG9vbHRpcCBoYW5naW5nIG9uIGxlZnQgYWZ0ZXIgYWRqdXN0bWVudCBvbiByaWdodFxyXG4gICAgICAgICAgICAgICAgaWYgKHBvaW50ZXJMZWZ0ID4gdG9vbHRpcFJlY3Qud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBwb2ludGVyTGVmdCA9ICh0b29sdGlwUmVjdC53aWR0aCAtIHBvaW50ZXJSZWN0LndpZHRoIC0gdG9vbHRpcFJpZ2h0TWFyZ2luKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodG9wICsgdG9vbHRpcFJlY3QuaGVpZ2h0ICsgVG9vbHRpcEhvc3RDb21wb25lbnQuU0NSRUVOX0VER0VfTUFSR0lOID4gaG9zdFJlY3QuYm90dG9tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRvb2x0aXAncyBib3R0b20gaXMgb3V0IG9mIHRoZSB2aWV3cG9ydCdzIGJvdHRvbSBlZGdlLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNob3cgdGhlIHRvb2x0aXAgYWJvdmUgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50ZXJUb3BPZmZzZXQgPSAzOyAvLyBOZWVkIDNweCBoZXJlIGZvciB0aGUgcG9pbnRlciB0b3AgdG8gbWFrZSBpdCBhbGlnbiB3ZWxsIHdpdGggdGhlIHRvb2x0aXAgY29udGVudCBib3guXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gdGFyZ2V0UmVjdC50b3AgLSB0b29sdGlwUmVjdC5oZWlnaHQgLSBwb2ludGVyLmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBvaW50ZXIsICd0b3AnLCBgJHt0b29sdGlwUmVjdC5oZWlnaHQgLSBwb2ludGVyLmNsaWVudEhlaWdodCAvIDIgLSBwb2ludGVyVG9wT2Zmc2V0fXB4YCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocG9pbnRlciwgJ3RvcCcsIGAtOHB4YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgbGVmdCBlZGdlIG9mIHRvb2x0aXAgaXMgb2ZmIHRoZSBzY3JlZW5cclxuICAgICAgICAgICAgICAgIGlmIChsZWZ0IDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZExlZnQgPSBsZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSAtdG9vbHRpcExlZnRNYXJnaW47XHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRlckxlZnQgPSAocG9pbnRlckxlZnQgKyBvbGRMZWZ0ICsgbGVmdCkgPCA0ID8gNCA6IHBvaW50ZXJMZWZ0ICsgb2xkTGVmdDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRvb2x0aXAsICd0b3AnLCBgJHt0b3B9cHhgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodG9vbHRpcCwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBvaW50ZXIsICdsZWZ0JywgYCR7cG9pbnRlckxlZnR9cHhgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiAoYXMgdGhlIG5lZWQgYXJpc2VzKVxyXG4gICAgICAgICAgICAgICAgLy8gQWxsb3cgZm9yIHRvb2x0aXAgcGxhY2VtZW50IChsZWZ0IHJpZ2h0IHRvcCBib3R0b20pXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBGb3IgdGhlIGZpcnN0IHJvdW5kIG9mIHJlbmRlcmluZywganVzdCBtb3ZlIHRoZSB0b29sdGlwIG91dHNpZGUgdGhlIHZpZXdwb3J0LlxyXG4gICAgICAgICAgICAgICAgLy8gQnV0IHdlIHN0aWxsIGNhbiBnZXQgdGhlIHNpemUgb2YgdGhlIHRvb2x0aXAgZm9yIHRoZSAybmQgcm91bmQgb2YgY2FsY3VsYXRpb24uXHJcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHdheSB3b24ndCBjYXVzZSB1bm5lY2Vzc2FyeSBjb250ZW50IG92ZXJmbG93IGFuZCBzY3JvbGxiYXJzLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0b29sdGlwLCAnbGVmdCcsIGAtOTk5cHhgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodG9vbHRpcCwgJ3RvcCcsIGAtOTk5cHhgKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFmaW5hbFJlcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZXBvc2l0aW9uKHRydWUpLCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIGlkQmFnIHVzZWQgYnkgdGhpcyBjb21wb25lbnQgdG8gc3RvcmUgdW5pcXVlIGVsZW1lbnQgaWRzLlxyXG4gICAgICogaWQgdmFsdWVzIHdpbGwgYmUgYXNzaWduZWQgYmUgdGhlIEBzZWUgQmFzZUNvbXBvbmVudCBzdXBlciBjbGFzcy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUlkQmFnKCk6IE1zZnRTbWUuU3RyaW5nTWFwPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGluaXRpYWwgaG9zdCBjbGFzc2VzIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXRJbml0aWFsSG9zdENsYXNzZXMoKS5jb25jYXQoW1xyXG4gICAgICAgICAgICAnc21lLXRvb2x0aXAtaG9zdCcsXHJcbiAgICAgICAgICAgICdzbWUtbGF5ZXItdG9vbHRpcCcsXHJcbiAgICAgICAgICAgICdzbWUtbGF5b3V0LWZpeGVkJyxcclxuICAgICAgICAgICAgJ3NtZS1wb3NpdGlvbi1pbnNldC1ub25lJyxcclxuICAgICAgICAgICAgJ3NtZS1mb2N1cy16b25lJ1xyXG4gICAgICAgIF0pO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgI3Rvb2x0aXBDb250YWluZXIgY2xhc3M9XCJzbWUtdG9vbHRpcCBzbWUtdG9vbHRpcC1wb3NpdGlvbi1ib3R0b20gc21lLWxheWVyLXRvb2x0aXAgc21lLXNoYWRvdy10b29sdGlwXCIgW2NsYXNzLnNtZS1zY3JlZW4tcmVhZGVyXT1cIiFvcHRpb25zXCJcclxuICAgICAoZm9jdXNpbik9XCJvbkZvY3VzQ2hhbmdlZCgkZXZlbnQpXCIgKGZvY3Vzb3V0KT1cIm9uRm9jdXNDaGFuZ2VkKCRldmVudClcIiAobW91c2VlbnRlcik9XCJvbkhvdmVyQ2hhbmdlZCgkZXZlbnQpXCIgKG1vdXNlbGVhdmUpPVwib25Ib3ZlckNoYW5nZWQoJGV2ZW50KVwiPlxyXG4gIDxkaXYgI3Rvb2x0aXBQb2ludGVyIGNsYXNzPVwic21lLXRvb2x0aXAtcG9pbnRlclwiPjwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJzbWUtdG9vbHRpcC1wb2ludGVyLWNvdmVyXCI+PC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJzbWUtdG9vbHRpcC1jb250ZW50IHNtZS1mb2N1cy10cmFwXCIgKm5nSWY9XCJzaG93Tm9uQXJpYUxpdmVDb250ZW50XCIgW2F0dHIucm9sZV09XCJhcmlhUm9sZVwiIFthdHRyLmFyaWEtbW9kYWxdPVwiYXJpYU1vZGFsXCJcclxuICAgIFtpZF09XCJvcHRpb25zLmNvbnRlbnRJZFwiIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZEJhZy5sYWJlbFwiIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaWRCYWcuZGVzY3JpcHRpb25cIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIW9wdGlvbnMudGVtcGxhdGVcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciBzbWVUZW1wbGF0ZU91dGxldCBbdGVtcGxhdGVdPVwib3B0aW9ucy50ZW1wbGF0ZVwiIFtkYXRhXT1cIm9wdGlvbnMuY29udGV4dFwiIFtob3N0RGF0YV09XCJob3N0RGF0YVwiPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIFxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbnMudGl0bGVcIj5cclxuICAgICAgPHAgY2xhc3M9XCJzbWUtZm9udC1sYWJlbFwiIFtpZF09XCJpZEJhZy5sYWJlbFwiPlxyXG4gICAgICAgIDxzcGFuPnt7b3B0aW9ucy50aXRsZX19PC9zcGFuPlxyXG4gICAgICA8L3A+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuICAgICAgXHJcbiAgPGRpdiBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtdG9vbHRpcC1jb250ZW50XCIgKm5nSWY9XCJzaG93QXJpYUxpdmVDb250ZW50XCIgW2F0dHIucm9sZV09XCJhcmlhUm9sZVwiIFthdHRyLmFyaWEtbW9kYWxdPVwiYXJpYU1vZGFsXCJcclxuICAgICAgW2lkXT1cIm9wdGlvbnMuY29udGVudElkXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkQmFnLmxhYmVsXCIgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpZEJhZy5kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwic21lLWZvbnQtbGFiZWxcIiBbaWRdPVwiaWRCYWcubGFiZWxcIj5cclxuICAgICAgICAgICAgPHNwYW4+e3tvcHRpb25zLnRpdGxlfX08L3NwYW4+XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
|
|
433
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC1ob3N0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3Rvb2x0aXAvdG9vbHRpcC1ob3N0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3Rvb2x0aXAvdG9vbHRpcC1ob3N0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRXZFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTdELE9BQU8sRUFBa0IsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7SUNDMUQsNkJBQXlDO0lBQ3ZDLDRCQUNlO0lBQ2pCLDBCQUFlOzs7SUFGbUIsZUFBNkI7SUFBN0Isa0RBQTZCLGdDQUFBLDZCQUFBOzs7SUFJL0QsNkJBQW9DO0lBQ2xDLDZCQUE2QztJQUMzQyw0QkFBTTtJQUFBLFlBQWlCO0lBQUEsaUJBQU87SUFDaEMsaUJBQUk7SUFDTiwwQkFBZTs7O0lBSGEsZUFBa0I7SUFBbEIsdUNBQWtCO0lBQ3BDLGVBQWlCO0lBQWpCLDBDQUFpQjs7O0lBVDdCLDhCQUM0RztJQUMxRyw2RkFHZTtJQUVmLDZGQUllO0lBQ2pCLGlCQUFNOzs7SUFYSiw2Q0FBd0I7SUFEcUQsdUNBQXNCLGdDQUFBLHVDQUFBLDhDQUFBO0lBRXBGLGVBQXdCO0lBQXhCLGdEQUF3QjtJQUt4QixlQUFtQjtJQUFuQiwyQ0FBbUI7OztJQVFs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eUJBQTZDO1FBRTdDLHFFQVlNO1FBRU4sOEJBQTJCO1FBQ3pCLHFFQUtNO1FBQ1IsaUJBQU07UUFDUixpQkFBTTs7UUEzQnNHLGlEQUFvQztRQUs3RixlQUE0QjtRQUE1QixpREFBNEI7UUFlekMsZUFBeUI7UUFBekIsOENBQXlCOzt1RkRKbEQsb0JBQW9CO2NBSmhDLFNBQVM7ZUFBQztnQkFDUCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixXQUFXLEVBQUUsK0JBQStCO2FBQy9DO2dGQWdCVSxnQkFBZ0I7a0JBRHRCLFNBQVM7bUJBQUMsa0JBQWtCO1lBT3RCLGNBQWM7a0JBRHBCLFNBQVM7bUJBQUMsZ0JBQWdCO1lBcUlwQixlQUFlO2tCQUZyQixZQUFZO21CQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0JBQ3hDLFlBQVk7bUJBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBWWhDLFFBQVE7a0JBRGQsWUFBWTttQkFBQyx1QkFBdUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQXdCMUMsT0FBTztrQkFEYixZQUFZO21CQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbmplY3RvciwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZG9tL2RvbSc7XHJcblxyXG5pbXBvcnQgeyBDb3JlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRvb2x0aXBIb3N0IH0gZnJvbSAnLi9tb2RlbHMvdG9vbHRpcC1ob3N0JztcclxuaW1wb3J0IHsgVG9vbHRpcE9wdGlvbnMsIFRvb2x0aXBTaG93TW9kZSB9IGZyb20gJy4vbW9kZWxzL3Rvb2x0aXAtb3B0aW9ucyc7XHJcbmltcG9ydCB7IFRvb2x0aXBIb3N0SW5zdGFuY2UgfSBmcm9tICcuL3Rvb2x0aXAtaG9zdC1pbnN0YW5jZSc7XHJcblxyXG5cclxuLyoqXHJcbiAqIFRvb2x0aXAgaG9zdCBjb21wb25lbnQgcHJvdmlkZXMgYSBob3N0IGZvciB0b29sdGlwcy5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtdG9vbHRpcC1ob3N0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi90b29sdGlwLWhvc3QuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUb29sdGlwSG9zdENvbXBvbmVudCBleHRlbmRzIENvcmVCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIFRvb2x0aXBIb3N0IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnVG9vbHRpcEhvc3RDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNDUkVFTl9FREdFX01BUkdJTiA9IDE2O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbmQgcG9zaXRpb25zIHRoZSB0b29sdGlwXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ3Rvb2x0aXBDb250YWluZXInKVxyXG4gICAgcHVibGljIHRvb2x0aXBDb250YWluZXI6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gcG9pbnQgdG8gdGhlIHRhcmdldCBvZiB0aGUgdG9vbHRpcFxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCd0b29sdGlwUG9pbnRlcicpXHJcbiAgICBwdWJsaWMgdG9vbHRpcFBvaW50ZXI6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY3VycmVudCB0b29sdGlwIG9wdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9wdGlvbnM6IFRvb2x0aXBPcHRpb25zO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgcGxhY2Vob2xkZXIgZm9yIHRoZSBjdXJyZW50IGZvY3VzZWQgc3RhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmb2N1c2VkOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgcGxhY2Vob2xkZXIgZm9yIHRoZSBjdXJyZW50IGhvdmVyZWQgc3RhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBob3ZlcmVkOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogY29udGFpbmVyIGZvciBob3N0IHNwZWNpZmljIGRhdGEgYmVpbmcgcGFzc2VkIHRvIHRoZSB0b29sdGlwIHRlbXBsYXRlIGNvbnRleHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhvc3REYXRhOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGlzIGhvc3RpbmcgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW91c2VQb3NpdGlvbjogV2ViS2l0UG9pbnQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3VzZSBtb3ZlIGxpc3RlbmVyIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25Nb3VzZU1vdmVMaXN0ZW5lcjogKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogaW5kaWNhdGVzIHRoYXQgdGhlIHRvb2x0aXAgaGFzIGZvY3VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNGb2N1c2VkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMgJiYgdGhpcy5pc1Nob3duKHRoaXMub3B0aW9ucy50YXJnZXRpZCkgJiYgdGhpcy5mb2N1c2VkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogaW5kaWNhdGVzIHRoYXQgdGhlIHRvb2x0aXAgaXMgaG92ZXJlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGlzSG92ZXJlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zICYmIHRoaXMuaXNTaG93bih0aGlzLm9wdGlvbnMudGFyZ2V0aWQpICYmIHRoaXMuaG92ZXJlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHJvbGUgdGhhdCB0aGlzIHRvb2x0aXAgaXMgcGxheWluZy4gSWYgdGhlIHRvb2x0aXAgaXMgdGV4dCBvbmx5LFxyXG4gICAgICogdGhlbiBpdCBpcyB0cmVhdGVkIGFzIGEgZGlhbG9nLlxyXG4gICAgICogb3RoZXJ3aXNlIGl0IGlzIHRyZWF0ZWQgYXMgYSB0b29sdGlwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXJpYVJvbGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMudGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdhbGVydGRpYWxvZyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAndG9vbHRpcCc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBhcmlhIG1vZGFsIGF0dHJpYnV0ZSB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGFyaWFNb2RhbCgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy50ZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRvb2x0aXAgY29udGVudCBvdXRzaWRlIHRoZSBhcmlhLWxpdmUgcmVnaW9uIHdpbGwgYmUgc2hvd25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzaG93Tm9uQXJpYUxpdmVDb250ZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMgJiYgKCEhdGhpcy5vcHRpb25zLnRlbXBsYXRlIHx8ICF0aGlzLm9wdGlvbnMuc2hvdWxkUmVhZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRvb2x0aXAgY29udGVudCBpbnNpZGUgdGhlIGFyaWEtbGl2ZSByZWdpb24gd2lsbCBiZSBzaG93blxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNob3dBcmlhTGl2ZUNvbnRlbnQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc2hvdWxkUmVhZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBAc2VlIFRvb2x0aXBIb3N0Q29tcG9uZW50IGNsYXNzLlxyXG4gICAgICogQHBhcmFtIGluamVjdG9yIFRoZSBhbmd1bGFyIGluamVjdGlvbiBzZXJ2aWNlLiByZXF1aXJlZCBieSBAU21lSW5qZWN0YWJsZSgpIGRlY29yYXRvciBpbiB0aGUgYmFzZSBAc2VlIEJhc2VDb21wb25lbnQgY2xhc3NcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICBUb29sdGlwSG9zdEluc3RhbmNlLnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaG9zdERhdGEgPSB7IGFyaWFMYWJlbElkOiB0aGlzLmlkQmFnLmxhYmVsLCBhcmlhRGVzY3JpcHRpb25JZDogdGhpcy5pZEJhZy5kZXNjcmlwdGlvbiB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMub25Nb3VzZU1vdmVMaXN0ZW5lciA9IHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT5cclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmVMaXN0ZW5lcik7XHJcbiAgICAgICAgVG9vbHRpcEhvc3RJbnN0YW5jZS51bnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2NjdXJzIHdoZW4gdGhlIHRvb2x0aXAgY29udGFpbmVyIGlzIGZvY3VzZWQgb3IgdW5mb2N1c2VkXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGZvY3VzaW4gb3IgZm9jdXNvdXQgZXZlbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRm9jdXNDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IHRoaXMub3B0aW9ucyAmJiAoZXZlbnQudHlwZSA9PT0gJ2ZvY3VzaW4nIHx8ICh0aGlzLmZvY3VzZWQgJiYgZXZlbnQudHlwZSAhPT0gJ2ZvY3Vzb3V0JykpO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uU3RhdGVDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2NjdXJzIHdoZW4gdGhlIHRvb2x0aXAgY29udGFpbmVyIGlzIGhvdmVyZWQgb3IgdW4taG92ZXJlZFxyXG4gICAgICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZWVudGVyIG9yIG1vdXNlbGVhdmUgZXZlbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSG92ZXJDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIHRoaXMuaG92ZXJlZCA9IHRoaXMub3B0aW9ucyAmJiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlZW50ZXInIHx8ICh0aGlzLmhvdmVyZWQgJiYgZXZlbnQudHlwZSAhPT0gJ21vdXNlbGVhdmUnKSk7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub25TdGF0ZUNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaW5kb3cgcmVzaXplIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJsdXInLCBbJyRldmVudCddKVxyXG4gICAgcHVibGljIG9uV2luZG93UmVzaXplZChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSh0aGlzLm9wdGlvbnMudGFyZ2V0aWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzY2FwZSBrZXkgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgLy8gZG9jdW1lbnQ6a2V5dXAuZXNjYXBlIGlzIHVzZWQgc28gdGhhdCBhIGRpYWxvZyBpcyBub3QgY2xvc2VkIHdoZW4gdHJ5aW5nIHRvIGNsb3NlIGEgdG9vbHRpcFxyXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5dXAuZXNjYXBlJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBvbkVzY2FwZShldmVudDogRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIFN0b3AgcHJvcGFnYXRpb24gc28gdGhhdCBpZiBpbiBhIGRpYWxvZyBpdCB3aWxsIG5vdCBjbG9zZS5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSh0aGlzLm9wdGlvbnMudGFyZ2V0aWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdXNlIG1vdmVtZW50IGxpc3RlbmVyXHJcbiAgICAgKiBXZSBkbyBub3QgdXNlIEhvc3RMaXN0ZW5lciBoZXJlIHRvIGF2b2lkIGludm9raW5nIGNoYW5nZSBkZXRlY3Rpb24gZm9yIGFsbCBtb3VzZW1vdmUgZXZlbnRzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5tb3VzZVBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICB4OiBldmVudC54LFxyXG4gICAgICAgICAgICB5OiBldmVudC55XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzY2FwZSBrZXkgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zaG93T24gPT09IFRvb2x0aXBTaG93TW9kZS5DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub25XaW5kb3dDbGljaygpO1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUodGhpcy5vcHRpb25zLnRhcmdldGlkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMubW91c2VQb3NpdGlvbikpIHtcclxuICAgICAgICAgICAgdGhpcy5tb3VzZVBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgeDogZXZlbnQueCxcclxuICAgICAgICAgICAgICAgIHk6IGV2ZW50LnlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IGEgdG9vbHRpcCB3aXRoIHRoZSBnaXZlbiBvcHRpb25zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG93KG9wdGlvbnM6IFRvb2x0aXBPcHRpb25zKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUodGhpcy5vcHRpb25zLnRhcmdldGlkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB0aGlzLnJlcG9zaXRpb24oZmFsc2UpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50KHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChuZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBuZXh0LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGFjdGl2ZSB0b29sdGlwIHdpdGggbmV3IG9wdGlvbnNcclxuICAgICAqIEBwYXJhbSBpZCB0aGUgdG9vbHRpcCBpZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlKG9wdGlvbnM6IFRvb2x0aXBPcHRpb25zKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93bihvcHRpb25zLnRhcmdldGlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29udGVudElkID0gb3B0aW9ucy5jb250ZW50SWQ7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlO1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGl0bGUgPSBvcHRpb25zLnRpdGxlO1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudDtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBsYWNlbWVudCA9IG9wdGlvbnMucGxhY2VtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlcG9zaXRpb24oZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGlkZXMgdGhlIHRvb2x0aXAgd2l0aCB0aGUgZ2l2ZW4gaWRcclxuICAgICAqIEBwYXJhbSBpZCB0aGUgdG9vbHRpcCBpZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNTaG93bihpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMudGFyZ2V0aWQgPT09IGlkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGlkZXMgdGhlIHRvb2x0aXAgd2l0aCB0aGUgZ2l2ZW4gaWRcclxuICAgICAqIEBwYXJhbSBpZCB0aGUgdG9vbHRpcCBpZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGlkZShpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93bihpZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5ob3ZlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBpZiB3ZSBvcGVuZWQgYSB0ZW1wbGF0ZSwgcmVzdG9yZSBmb2N1cyB0byB0aGUgb3JpZ2luYWwgZWxlbWVudCB3aGVuIHdlIGNsb3NlIHRoZSB0b29sdGlwXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudGVtcGxhdGUgJiYgdGhpcy5vcHRpb25zLnJlc3RvcmVGb2N1c1RvKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHRlbXBsYXRlIGhhZCBhbnkgZm9jdXNhYmxlIGVsZW1lbnRzIHRoYXQgY2F1c2VkIGZvY3VzIHRvIGNoYW5nZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbHRpcEZvY3VzYWJsZUVsZW1lbnQgPSBEb20uZ2V0Rmlyc3RFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIDxIVE1MRWxlbWVudD50aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9PiBEb20uaXNGb2N1c2FibGUoZWxlbWVudClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAodG9vbHRpcEZvY3VzYWJsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucmVzdG9yZUZvY3VzVG8uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUmVzZXQgcG9zaXRpb25pbmcgc28gdGhhdCBzbWUtbGF5b3V0LW9mZi1zY3JlZW4gd2lsbCBub3QgYmUgb3ZlcnJpZGRlblxyXG4gICAgICAgICAgICAvLyB3aGVuIHRoZSBvcHRpb25zIGFyZSBudWxsLlxyXG4gICAgICAgICAgICBjb25zdCB0b29sdGlwID0gPEhUTUxFbGVtZW50PnRoaXMudG9vbHRpcENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRvb2x0aXAsICdsZWZ0Jyk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUodG9vbHRpcCwgJ3RvcCcpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcG9zaXRpb25zIHRoZSB0b29sdGlwXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVwb3NpdGlvbihmaW5hbFJlcG9zaXRpb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBubyBsb25nZXIgaW4gdGhlIGRvbSwgY2FuY2VsIHRoZSB0b29sdGlwXHJcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0aGlzLm9wdGlvbnMuZWxlbWVudC5uYXRpdmVFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKHRoaXMub3B0aW9ucy50YXJnZXRpZCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEdldCBlbGVtZW50cyBmb3IgbWFuaXB1bGF0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ZXIgPSA8SFRNTEVsZW1lbnQ+dGhpcy50b29sdGlwUG9pbnRlci5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCB0b29sdGlwID0gPEhUTUxFbGVtZW50PnRoaXMudG9vbHRpcENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgLy8gZ2V0IGJvdW5kaW5nIHJlY3RhbmdsZXMgZm9yIG1lYXN1cmVtZW50XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSAoPEhUTUxFbGVtZW50PnRoaXMub3B0aW9ucy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBob3N0UmVjdCA9ICg8SFRNTEVsZW1lbnQ+dGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgcG9pbnRlclJlY3QgPSBwb2ludGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgaW5pdGlhbCB0b3AgYW5kIGxlZnQgcG9zaXRpb24gb2YgdGhlIHRvb2x0aXBcclxuICAgICAgICAgICAgY29uc3QgbGVmdEFkanVzdG1lbnQgPSAyOyAvLyBBZGp1c3QgdGhlIHRvb2x0aXAgbG9jYXRpb24gYSBsaXR0bGUgYml0IHRvIGFsaWduIHdpdGggc29tZSBpY29ucyAoYXMgdGFyZ2V0KSBiZXR0ZXIuXHJcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gdGFyZ2V0UmVjdC5sZWZ0IC0gaG9zdFJlY3QubGVmdCArIGxlZnRBZGp1c3RtZW50O1xyXG4gICAgICAgICAgICBsZXQgdG9wID0gKHRhcmdldFJlY3QudG9wIC0gaG9zdFJlY3QudG9wKSArIHRhcmdldFJlY3QuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgLy8gZ2V0IHRoZSBtYXJnaW4gb2YgdGhlIHRvb2x0aXAgYW5kIGluY2x1ZGUgdGhhdCBpbiB0aGUgY2FsY3VsYXRpb25cclxuICAgICAgICAgICAgY29uc3QgdG9vbHRpcExlZnRNYXJnaW4gPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0b29sdGlwKS5tYXJnaW5MZWZ0LCAxMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2x0aXBSaWdodE1hcmdpbiA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRvb2x0aXApLm1hcmdpblJpZ2h0LCAxMCk7XHJcbiAgICAgICAgICAgIGxldCBwb2ludGVyTGVmdCA9ICgodGFyZ2V0UmVjdC53aWR0aCAvIDIpIC0gKHBvaW50ZXJSZWN0LndpZHRoIC8gMikpIC0gdG9vbHRpcExlZnRNYXJnaW47XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB0aGUgcG9pbnRlciBoYW5ncyBvZmYgdGhlIGxlZnQgc2lkZSBvZiB0aGUgdG9vbHRpcCwgdGhlbiBhZGp1c3QgdGhlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHRvb2x0aXAgYW5kIHBvaW50ZXJcclxuICAgICAgICAgICAgaWYgKHBvaW50ZXJMZWZ0IDwgdG9vbHRpcExlZnRNYXJnaW4pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnRPZmZzZXQgPSB0b29sdGlwTGVmdE1hcmdpbiAtIHBvaW50ZXJMZWZ0O1xyXG4gICAgICAgICAgICAgICAgbGVmdCAtPSBsZWZ0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgcG9pbnRlckxlZnQgKz0gbGVmdE9mZnNldDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gb24gdGhlIHNlY29uZCByb3VuZCwgd2UgY2FuIHRha2UgdGhlIGhlaWdodCBhbmQgd2lkdGggb2YgdGhlIHRvb2x0aXAgaW50byBhY2NvdW50LlxyXG4gICAgICAgICAgICBpZiAoZmluYWxSZXBvc2l0aW9uICYmIHRvb2x0aXBSZWN0LmhlaWdodCA+IDAgJiYgdG9vbHRpcFJlY3Qud2lkdGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRhcmdldCB3aWR0aCBpcyBncmVhdGVyIHRoYW4gdGhlIHJlbmRlcmVkIHRvb2x0aXAgd2lkdGgsXHJcbiAgICAgICAgICAgICAgICAvLyB0aGVuIGFkanVzdCB0aGUgcG9pbnRlciBhbmQgdG9vbHRpcCB0byBhbGlnbiB3aXRoIHRoZSBwb2ludGVyXHJcbiAgICAgICAgICAgICAgICBpZiAodG9vbHRpcFJlY3Qud2lkdGggPCB0YXJnZXRSZWN0LndpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRlckxlZnQgPSAoKCh0b29sdGlwUmVjdC53aWR0aCAvIDIpIC0gKHBvaW50ZXJSZWN0LndpZHRoIC8gMikpIC0gdG9vbHRpcExlZnRNYXJnaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vdXNlUG9zaXRpb24ueCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSAodG9vbHRpcFJlY3Qud2lkdGggLyAyKSAtIHRvb2x0aXBMZWZ0TWFyZ2luO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSAodGhpcy5tb3VzZVBvc2l0aW9uLnggLSAoKHRvb2x0aXBSZWN0LndpZHRoIC8gMikgLSB0b29sdGlwTGVmdE1hcmdpbikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiByaWdodCBlZGdlIG9mIHRvb2x0aXAgaXMgb2ZmIHRoZSBzY3JlZW5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gKGxlZnQgKyB0b29sdGlwUmVjdC53aWR0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodE92ZXJmbG93ID0gcmlnaHQgLSAoaG9zdFJlY3QucmlnaHQgLSBUb29sdGlwSG9zdENvbXBvbmVudC5TQ1JFRU5fRURHRV9NQVJHSU4pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJpZ2h0T3ZlcmZsb3cgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRqdXN0IGxlZnQgcG9zaXRpb24gdG8gYWNjb3VudCBmb3IgcmlnaHQgb2Zmc2V0XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSByaWdodE92ZXJmbG93O1xyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50ZXJMZWZ0ICs9IHJpZ2h0T3ZlcmZsb3c7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB0b29sdGlwIGhhbmdpbmcgb24gbGVmdCBhZnRlciBhZGp1c3RtZW50IG9uIHJpZ2h0XHJcbiAgICAgICAgICAgICAgICBpZiAocG9pbnRlckxlZnQgPiB0b29sdGlwUmVjdC53aWR0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50ZXJMZWZ0ID0gKHRvb2x0aXBSZWN0LndpZHRoIC0gcG9pbnRlclJlY3Qud2lkdGggLSB0b29sdGlwUmlnaHRNYXJnaW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0b3AgKyB0b29sdGlwUmVjdC5oZWlnaHQgKyBUb29sdGlwSG9zdENvbXBvbmVudC5TQ1JFRU5fRURHRV9NQVJHSU4gPiBob3N0UmVjdC5ib3R0b20pIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdG9vbHRpcCdzIGJvdHRvbSBpcyBvdXQgb2YgdGhlIHZpZXdwb3J0J3MgYm90dG9tIGVkZ2UsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyB0aGUgdG9vbHRpcCBhYm92ZSB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRlclRvcE9mZnNldCA9IDM7IC8vIE5lZWQgM3B4IGhlcmUgZm9yIHRoZSBwb2ludGVyIHRvcCB0byBtYWtlIGl0IGFsaWduIHdlbGwgd2l0aCB0aGUgdG9vbHRpcCBjb250ZW50IGJveC5cclxuICAgICAgICAgICAgICAgICAgICB0b3AgPSB0YXJnZXRSZWN0LnRvcCAtIHRvb2x0aXBSZWN0LmhlaWdodCAtIHBvaW50ZXIuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocG9pbnRlciwgJ3RvcCcsIGAke3Rvb2x0aXBSZWN0LmhlaWdodCAtIHBvaW50ZXIuY2xpZW50SGVpZ2h0IC8gMiAtIHBvaW50ZXJUb3BPZmZzZXR9cHhgKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwb2ludGVyLCAndG9wJywgYC04cHhgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBsZWZ0IGVkZ2Ugb2YgdG9vbHRpcCBpcyBvZmYgdGhlIHNjcmVlblxyXG4gICAgICAgICAgICAgICAgaWYgKGxlZnQgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkTGVmdCA9IGxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IC10b29sdGlwTGVmdE1hcmdpbjtcclxuICAgICAgICAgICAgICAgICAgICBwb2ludGVyTGVmdCA9IChwb2ludGVyTGVmdCArIG9sZExlZnQgKyBsZWZ0KSA8IDQgPyA0IDogcG9pbnRlckxlZnQgKyBvbGRMZWZ0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodG9vbHRpcCwgJ3RvcCcsIGAke3RvcH1weGApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0b29sdGlwLCAnbGVmdCcsIGAke2xlZnR9cHhgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocG9pbnRlciwgJ2xlZnQnLCBgJHtwb2ludGVyTGVmdH1weGApO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IChhcyB0aGUgbmVlZCBhcmlzZXMpXHJcbiAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgdG9vbHRpcCBwbGFjZW1lbnQgKGxlZnQgcmlnaHQgdG9wIGJvdHRvbSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIEZvciB0aGUgZmlyc3Qgcm91bmQgb2YgcmVuZGVyaW5nLCBqdXN0IG1vdmUgdGhlIHRvb2x0aXAgb3V0c2lkZSB0aGUgdmlld3BvcnQuXHJcbiAgICAgICAgICAgICAgICAvLyBCdXQgd2Ugc3RpbGwgY2FuIGdldCB0aGUgc2l6ZSBvZiB0aGUgdG9vbHRpcCBmb3IgdGhlIDJuZCByb3VuZCBvZiBjYWxjdWxhdGlvbi5cclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgd2F5IHdvbid0IGNhdXNlIHVubmVjZXNzYXJ5IGNvbnRlbnQgb3ZlcmZsb3cgYW5kIHNjcm9sbGJhcnMuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRvb2x0aXAsICdsZWZ0JywgYC05OTlweGApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0b29sdGlwLCAndG9wJywgYC05OTlweGApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWZpbmFsUmVwb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlcG9zaXRpb24odHJ1ZSksIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgaWRCYWcgdXNlZCBieSB0aGlzIGNvbXBvbmVudCB0byBzdG9yZSB1bmlxdWUgZWxlbWVudCBpZHMuXHJcbiAgICAgKiBpZCB2YWx1ZXMgd2lsbCBiZSBhc3NpZ25lZCBiZSB0aGUgQHNlZSBCYXNlQ29tcG9uZW50IHN1cGVyIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlSWRCYWcoKTogTXNmdFNtZS5TdHJpbmdNYXA8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGFiZWw6ICcnLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgaW5pdGlhbCBob3N0IGNsYXNzZXMgdG8gYmUgYXBwbGllZCB0byB0aGlzIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldEluaXRpYWxIb3N0Q2xhc3NlcygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtdG9vbHRpcC1ob3N0JyxcclxuICAgICAgICAgICAgJ3NtZS1sYXllci10b29sdGlwJyxcclxuICAgICAgICAgICAgJ3NtZS1sYXlvdXQtZml4ZWQnLFxyXG4gICAgICAgICAgICAnc21lLXBvc2l0aW9uLWluc2V0LW5vbmUnLFxyXG4gICAgICAgICAgICAnc21lLWZvY3VzLXpvbmUnXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjdG9vbHRpcENvbnRhaW5lciBjbGFzcz1cInNtZS10b29sdGlwIHNtZS10b29sdGlwLXBvc2l0aW9uLWJvdHRvbSBzbWUtbGF5ZXItdG9vbHRpcCBzbWUtc2hhZG93LXRvb2x0aXBcIiBbY2xhc3Muc21lLXNjcmVlbi1yZWFkZXJdPVwiIW9wdGlvbnNcIlxyXG4gICAgIChmb2N1c2luKT1cIm9uRm9jdXNDaGFuZ2VkKCRldmVudClcIiAoZm9jdXNvdXQpPVwib25Gb2N1c0NoYW5nZWQoJGV2ZW50KVwiIChtb3VzZWVudGVyKT1cIm9uSG92ZXJDaGFuZ2VkKCRldmVudClcIiAobW91c2VsZWF2ZSk9XCJvbkhvdmVyQ2hhbmdlZCgkZXZlbnQpXCI+XHJcbiAgPGRpdiAjdG9vbHRpcFBvaW50ZXIgY2xhc3M9XCJzbWUtdG9vbHRpcC1wb2ludGVyXCI+PC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS10b29sdGlwLXBvaW50ZXItY292ZXJcIj48L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInNtZS10b29sdGlwLWNvbnRlbnQgc21lLWZvY3VzLXRyYXBcIiAqbmdJZj1cInNob3dOb25BcmlhTGl2ZUNvbnRlbnRcIiBbYXR0ci5yb2xlXT1cImFyaWFSb2xlXCIgW2F0dHIuYXJpYS1tb2RhbF09XCJhcmlhTW9kYWxcIlxyXG4gICAgW2lkXT1cIm9wdGlvbnMuY29udGVudElkXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkQmFnLmxhYmVsXCIgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpZEJhZy5kZXNjcmlwdGlvblwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhb3B0aW9ucy50ZW1wbGF0ZVwiPlxyXG4gICAgICA8bmctY29udGFpbmVyIHNtZVRlbXBsYXRlT3V0bGV0IFt0ZW1wbGF0ZV09XCJvcHRpb25zLnRlbXBsYXRlXCIgW2RhdGFdPVwib3B0aW9ucy5jb250ZXh0XCIgW2hvc3REYXRhXT1cImhvc3REYXRhXCI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9ucy50aXRsZVwiPlxyXG4gICAgICA8cCBjbGFzcz1cInNtZS1mb250LWxhYmVsXCIgW2lkXT1cImlkQmFnLmxhYmVsXCI+XHJcbiAgICAgICAgPHNwYW4+e3tvcHRpb25zLnRpdGxlfX08L3NwYW4+XHJcbiAgICAgIDwvcD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG4gICAgICBcclxuICA8ZGl2IGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNtZS10b29sdGlwLWNvbnRlbnRcIiAqbmdJZj1cInNob3dBcmlhTGl2ZUNvbnRlbnRcIiBbYXR0ci5yb2xlXT1cImFyaWFSb2xlXCIgW2F0dHIuYXJpYS1tb2RhbF09XCJhcmlhTW9kYWxcIlxyXG4gICAgICBbaWRdPVwib3B0aW9ucy5jb250ZW50SWRcIiBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiaWRCYWcubGFiZWxcIiBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImlkQmFnLmRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJzbWUtZm9udC1sYWJlbFwiIFtpZF09XCJpZEJhZy5sYWJlbFwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57e29wdGlvbnMudGl0bGV9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvcD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|