@scion/workbench 18.0.0-beta.2 → 18.0.0-beta.4
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/common/class-list.mjs +67 -29
- package/esm2022/lib/common/objects.util.mjs +7 -1
- package/esm2022/lib/common/operators.mjs +1 -12
- package/esm2022/lib/common/uid.util.mjs +22 -0
- package/esm2022/lib/content-projection/content-as-overlay.component.mjs +3 -3
- package/esm2022/lib/content-projection/content-projection.directive.mjs +16 -17
- package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +3 -8
- package/esm2022/lib/dialog/workbench-dialog.component.mjs +22 -20
- package/esm2022/lib/dialog/workbench-dialog.mjs +61 -1
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +71 -26
- package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +25 -23
- package/esm2022/lib/executor/latest-task-executor.mjs +55 -0
- package/esm2022/lib/executor/single-task-executor.mjs +7 -17
- package/esm2022/lib/filter-field/filter-field.component.mjs +5 -5
- package/esm2022/lib/layout/grid-element/grid-element.component.mjs +6 -16
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +5 -6
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +11 -0
- package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +4 -4
- package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +67 -0
- package/esm2022/lib/layout/stringifier.mjs +70 -0
- package/esm2022/lib/layout/workbench-layout.component.mjs +4 -5
- package/esm2022/lib/layout/workbench-layout.mjs +1 -1
- package/esm2022/lib/layout/workbench-layout.model.mjs +1 -1
- package/esm2022/lib/layout/workbench-layout.service.mjs +6 -7
- package/esm2022/lib/layout/workench-layout-serializer.service.mjs +16 -25
- package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +2 -2
- package/esm2022/lib/layout//311/265workbench-layout.mjs +45 -48
- package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +3 -3
- package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +22 -6
- package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +28 -21
- package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +11 -1
- package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +63 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +5 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +4 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +14 -6
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +7 -6
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +3 -2
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +4 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +39 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +120 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +55 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +19 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +4 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +11 -12
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +4 -15
- package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +11 -27
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +49 -22
- package/esm2022/lib/microfrontend-platform/public_api.mjs +2 -1
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +5 -4
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +18 -16
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +28 -6
- package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +32 -0
- package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +25 -7
- package/esm2022/lib/notification/notification-list.component.mjs +4 -8
- package/esm2022/lib/notification/notification.component.mjs +4 -5
- package/esm2022/lib/page-not-found/format-url.pipe.mjs +2 -2
- package/esm2022/lib/page-not-found/page-not-found.component.mjs +3 -3
- package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +7 -13
- package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +4 -4
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +56 -75
- package/esm2022/lib/part/part-portal.pipe.mjs +8 -8
- package/esm2022/lib/part/part.component.mjs +32 -42
- package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +4 -6
- package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +2 -2
- package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +27 -28
- package/esm2022/lib/part/view-list/view-list.component.mjs +41 -48
- package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +20 -24
- package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +15 -17
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +77 -88
- package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +3 -4
- package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +14 -15
- package/esm2022/lib/part/workbench-part-action.registry.mjs +18 -42
- package/esm2022/lib/part/workbench-part.model.mjs +10 -1
- package/esm2022/lib/part/workbench-part.registry.mjs +11 -45
- package/esm2022/lib/part//311/265workbench-part.model.mjs +71 -55
- package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +3 -3
- package/esm2022/lib/perspective/workbench-perspective.model.mjs +1 -1
- package/esm2022/lib/perspective/workbench-perspective.registry.mjs +11 -43
- package/esm2022/lib/perspective/workbench-perspective.service.mjs +71 -62
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +40 -28
- package/esm2022/lib/popup/popup.component.mjs +3 -3
- package/esm2022/lib/popup/popup.config.mjs +23 -13
- package/esm2022/lib/popup/popup.service.mjs +48 -45
- package/esm2022/lib/portal/wb-component-portal.mjs +3 -1
- package/esm2022/lib/registry/workbench-object-registry.mjs +38 -17
- package/esm2022/lib/routing/public_api.mjs +1 -2
- package/esm2022/lib/routing/routing.model.mjs +1 -1
- package/esm2022/lib/routing/routing.util.mjs +210 -0
- package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +110 -0
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +3 -3
- package/esm2022/lib/routing/workbench-layout-differ.mjs +3 -10
- package/esm2022/lib/routing/workbench-message-box-differ.mjs +3 -3
- package/esm2022/lib/routing/workbench-navigational-states.mjs +1 -1
- package/esm2022/lib/routing/workbench-popup-differ.mjs +3 -3
- package/esm2022/lib/routing/workbench-url-observer.service.mjs +138 -147
- package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +58 -0
- package/esm2022/lib/routing//311/265workbench-router.service.mjs +42 -32
- package/esm2022/lib/startup/splash/splash.component.mjs +3 -3
- package/esm2022/lib/testing/workbench.provider.mjs +2 -2
- package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +15 -19
- package/esm2022/lib/view/view-move-handler.service.mjs +11 -11
- package/esm2022/lib/view/view-portal.pipe.mjs +7 -7
- package/esm2022/lib/view/view.component.mjs +42 -41
- package/esm2022/lib/view/workbench-view-route-guards.mjs +5 -5
- package/esm2022/lib/view/workbench-view.model.mjs +1 -1
- package/esm2022/lib/view/workbench-view.registry.mjs +11 -45
- package/esm2022/lib/view//311/265workbench-view.model.mjs +136 -144
- package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +2 -2
- package/esm2022/lib/view-dnd/view-drag.service.mjs +1 -1
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +18 -20
- package/esm2022/lib/workbench-config.mjs +1 -1
- package/esm2022/lib/workbench-id.mjs +3 -3
- package/esm2022/lib/workbench.component.mjs +2 -2
- package/esm2022/lib/workbench.constants.mjs +1 -5
- package/esm2022/lib/workbench.model.mjs +1 -1
- package/esm2022/lib/workbench.provider.mjs +3 -9
- package/esm2022/lib/workbench.service.mjs +1 -1
- package/esm2022/lib//311/265workbench.service.mjs +31 -42
- package/fesm2022/scion-workbench.mjs +2586 -1996
- package/fesm2022/scion-workbench.mjs.map +1 -1
- package/lib/common/class-list.d.ts +35 -22
- package/lib/common/objects.util.d.ts +4 -0
- package/lib/common/operators.d.ts +1 -6
- package/lib/common/uid.util.d.ts +9 -0
- package/lib/dialog/workbench-dialog.component.d.ts +3 -2
- package/lib/dialog/workbench-dialog.d.ts +57 -13
- package/lib/dialog//311/265workbench-dialog.d.ts +36 -17
- package/lib/dialog//311/265workbench-dialog.service.d.ts +10 -11
- package/lib/executor/latest-task-executor.d.ts +26 -0
- package/lib/executor/single-task-executor.d.ts +3 -6
- package/lib/filter-field/filter-field.component.d.ts +1 -1
- package/lib/layout/grid-element/grid-element.component.d.ts +1 -8
- package/lib/layout/migration/model/workbench-layout-migration-v5.model.d.ts +36 -0
- package/lib/layout/migration/workbench-layout-migration-v5.service.d.ts +12 -0
- package/lib/layout/stringifier.d.ts +26 -0
- package/lib/layout/workbench-layout.d.ts +9 -6
- package/lib/layout/workbench-layout.model.d.ts +5 -3
- package/lib/layout/workbench-layout.service.d.ts +4 -4
- package/lib/layout/workench-layout-serializer.service.d.ts +13 -15
- package/lib/layout//311/265workbench-layout.d.ts +13 -16
- package/lib/layout//311/265workbench-layout.factory.d.ts +2 -2
- package/lib/microfrontend-platform/common/microfrontend.util.d.ts +5 -1
- package/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.d.ts +7 -3
- package/lib/microfrontend-platform/manifest-object-cache.service.d.ts +33 -0
- package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +1 -5
- package/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.d.ts +1 -1
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.d.ts +10 -0
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.d.ts +24 -0
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.d.ts +20 -0
- package/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.d.ts +9 -0
- package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.d.ts +4 -8
- package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.d.ts +0 -4
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.d.ts +5 -12
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.d.ts +7 -2
- package/lib/microfrontend-platform/public_api.d.ts +1 -0
- package/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.d.ts +1 -1
- package/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.d.ts +3 -7
- package/lib/microfrontend-platform/routing/microfrontend-view-routes.d.ts +9 -2
- package/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.d.ts +11 -0
- package/lib/notification/notification-list.component.d.ts +0 -2
- package/lib/part/part-action-bar/part-action-bar.component.d.ts +4 -1
- package/lib/part/part-action-bar/part-action.directive.d.ts +2 -2
- package/lib/part/part-bar/part-bar.component.d.ts +8 -12
- package/lib/part/part-portal.pipe.d.ts +3 -5
- package/lib/part/part.component.d.ts +9 -12
- package/lib/part/view-context-menu/view-menu.directive.d.ts +1 -1
- package/lib/part/view-context-menu/view-menu.service.d.ts +8 -12
- package/lib/part/view-list/view-list.component.d.ts +8 -21
- package/lib/part/view-list-button/view-list-button.component.d.ts +8 -11
- package/lib/part/view-list-item/view-list-item.component.d.ts +3 -7
- package/lib/part/view-tab/view-tab.component.d.ts +17 -28
- package/lib/part/view-tab-drag-image/view-tab-drag-image.component.d.ts +4 -4
- package/lib/part/workbench-part-action.registry.d.ts +3 -23
- package/lib/part/workbench-part.model.d.ts +8 -27
- package/lib/part/workbench-part.registry.d.ts +3 -26
- package/lib/part//311/265workbench-part.model.d.ts +24 -17
- package/lib/perspective/workbench-perspective.model.d.ts +18 -25
- package/lib/perspective/workbench-perspective.registry.d.ts +3 -26
- package/lib/perspective/workbench-perspective.service.d.ts +16 -14
- package/lib/perspective//311/265workbench-perspective.model.d.ts +30 -20
- package/lib/popup/popup.config.d.ts +2 -0
- package/lib/popup/popup.service.d.ts +12 -14
- package/lib/registry/workbench-object-registry.d.ts +10 -6
- package/lib/routing/public_api.d.ts +1 -2
- package/lib/routing/routing.model.d.ts +25 -13
- package/lib/routing/{router.util.d.ts → routing.util.d.ts} +24 -1
- package/lib/routing/{workbench-auxiliary-routes-registrator.service.d.ts → workbench-auxiliary-route-installer.service.d.ts} +10 -3
- package/lib/routing/workbench-layout-differ.d.ts +1 -2
- package/lib/routing/workbench-navigational-states.d.ts +3 -3
- package/lib/routing/workbench-url-observer.service.d.ts +31 -55
- package/lib/routing/workbench-view-outlet-differ.d.ts +32 -0
- package/lib/routing//311/265workbench-router.service.d.ts +10 -16
- package/lib/testing/workbench.provider.d.ts +3 -1
- package/lib/theme/workbench-theme-switcher.service.d.ts +4 -6
- package/lib/view/view-portal.pipe.d.ts +1 -3
- package/lib/view/view.component.d.ts +9 -10
- package/lib/view/workbench-view-route-guards.d.ts +2 -2
- package/lib/view/workbench-view.model.d.ts +49 -35
- package/lib/view/workbench-view.registry.d.ts +3 -27
- package/lib/view//311/265workbench-view.model.d.ts +58 -64
- package/lib/view-dnd/view-drag.service.d.ts +5 -2
- package/lib/workbench-config.d.ts +2 -2
- package/lib/workbench.constants.d.ts +0 -5
- package/lib/workbench.model.d.ts +6 -2
- package/lib/workbench.service.d.ts +58 -56
- package/lib//311/265workbench.service.d.ts +18 -31
- package/package.json +3 -3
- package/esm2022/lib/common/filter-by-predicate.pipe.mjs +0 -27
- package/esm2022/lib/common/filter-by-text.pipe.mjs +0 -39
- package/esm2022/lib/common/uuid.util.mjs +0 -17
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.mjs +0 -41
- package/esm2022/lib/part/part-action-bar/part-action-filter.pipe.mjs +0 -26
- package/esm2022/lib/routing/router.util.mjs +0 -126
- package/esm2022/lib/routing/workbench-auxiliary-routes-registrator.service.mjs +0 -94
- package/lib/common/filter-by-predicate.pipe.d.ts +0 -10
- package/lib/common/filter-by-text.pipe.d.ts +0 -12
- package/lib/common/uuid.util.d.ts +0 -8
- package/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.d.ts +0 -10
- package/lib/part/part-action-bar/part-action-filter.pipe.d.ts +0 -11
|
@@ -9,18 +9,18 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { MPart, MTreeNode } from './workbench-layout.model';
|
|
11
11
|
import { assertType } from '../common/asserts.util';
|
|
12
|
-
import {
|
|
12
|
+
import { UID } from '../common/uid.util';
|
|
13
13
|
import { MAIN_AREA } from './workbench-layout';
|
|
14
14
|
import { WorkbenchLayoutSerializer } from './workench-layout-serializer.service';
|
|
15
|
+
import { WORKBENCH_VIEW_REGISTRY } from '../view/workbench-view.registry';
|
|
16
|
+
import { WORKBENCH_PART_REGISTRY } from '../part/workbench-part.registry';
|
|
15
17
|
import { inject, Injectable, InjectionToken, Injector, runInInjectionContext } from '@angular/core';
|
|
16
|
-
import {
|
|
18
|
+
import { Routing } from '../routing/routing.util';
|
|
17
19
|
import { Arrays } from '@scion/toolkit/util';
|
|
18
20
|
import { Objects } from '../common/objects.util';
|
|
19
21
|
import { WorkbenchLayouts } from './workbench-layouts.util';
|
|
20
22
|
import { Logger } from '../logging';
|
|
21
23
|
import * as i0 from "@angular/core";
|
|
22
|
-
import * as i1 from "../part/workbench-part.registry";
|
|
23
|
-
import * as i2 from "../view/workbench-view.registry";
|
|
24
24
|
/**
|
|
25
25
|
* @inheritDoc
|
|
26
26
|
*
|
|
@@ -50,7 +50,7 @@ export class ɵWorkbenchLayout {
|
|
|
50
50
|
this._gridNames = Objects.keys(this._grids);
|
|
51
51
|
this._maximized = config.maximized ?? false;
|
|
52
52
|
this._viewOutlets = new Map(Objects.entries(coerceViewOutlets(config.viewOutlets)));
|
|
53
|
-
this.
|
|
53
|
+
this._navigationStates = new Map(Objects.entries(config.navigationStates ?? {}));
|
|
54
54
|
this.parts().forEach(part => assertType(part, { toBeOneOf: [MTreeNode, MPart] }));
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
@@ -91,21 +91,21 @@ export class ɵWorkbenchLayout {
|
|
|
91
91
|
return Object.fromEntries(viewOutletEntries);
|
|
92
92
|
}
|
|
93
93
|
/**
|
|
94
|
-
* Finds
|
|
94
|
+
* Finds navigational state for views based on the specified filter.
|
|
95
95
|
*
|
|
96
96
|
* @param findBy - Defines the search scope.
|
|
97
97
|
* @param findBy.grid - Searches for views contained in the specified grid.
|
|
98
|
-
* @return
|
|
98
|
+
* @return navigation state of views matching the filter criteria.
|
|
99
99
|
*/
|
|
100
|
-
|
|
101
|
-
const
|
|
102
|
-
return Object.fromEntries(
|
|
100
|
+
navigationStates(findBy) {
|
|
101
|
+
const navigationStateEntries = this.views({ grid: findBy?.grid }).map(view => [view.id, this._navigationStates.get(view.id) ?? {}]);
|
|
102
|
+
return Object.fromEntries(navigationStateEntries);
|
|
103
103
|
}
|
|
104
104
|
/**
|
|
105
105
|
* Finds the navigational state of specified view.
|
|
106
106
|
*/
|
|
107
|
-
|
|
108
|
-
return this.
|
|
107
|
+
navigationState(findBy) {
|
|
108
|
+
return this._navigationStates.get(findBy.viewId) ?? {};
|
|
109
109
|
}
|
|
110
110
|
/**
|
|
111
111
|
* Finds the URL of specified view.
|
|
@@ -253,10 +253,10 @@ export class ɵWorkbenchLayout {
|
|
|
253
253
|
addView(id, options) {
|
|
254
254
|
const workingCopy = this.workingCopy();
|
|
255
255
|
if (WorkbenchLayouts.isViewId(id)) {
|
|
256
|
-
workingCopy.__addView({ id, uid:
|
|
256
|
+
workingCopy.__addView({ id, uid: UID.randomUID() }, options);
|
|
257
257
|
}
|
|
258
258
|
else {
|
|
259
|
-
workingCopy.__addView({ id: this.computeNextViewId(), alternativeId: id, uid:
|
|
259
|
+
workingCopy.__addView({ id: this.computeNextViewId(), alternativeId: id, uid: UID.randomUID() }, options);
|
|
260
260
|
}
|
|
261
261
|
return workingCopy;
|
|
262
262
|
}
|
|
@@ -349,11 +349,11 @@ export class ɵWorkbenchLayout {
|
|
|
349
349
|
/**
|
|
350
350
|
* Serializes this layout into a URL-safe base64 string.
|
|
351
351
|
*/
|
|
352
|
-
serialize() {
|
|
352
|
+
serialize(flags) {
|
|
353
353
|
const isMainAreaEmpty = (this.mainAreaGrid?.root instanceof MPart && this.mainAreaGrid.root.views.length === 0) ?? true;
|
|
354
354
|
return {
|
|
355
|
-
workbenchGrid: this._serializer.serializeGrid(this.workbenchGrid),
|
|
356
|
-
mainAreaGrid: isMainAreaEmpty ? null : this._serializer.serializeGrid(this._grids.mainArea),
|
|
355
|
+
workbenchGrid: this._serializer.serializeGrid(this.workbenchGrid, flags),
|
|
356
|
+
mainAreaGrid: isMainAreaEmpty ? null : this._serializer.serializeGrid(this._grids.mainArea, flags),
|
|
357
357
|
workbenchViewOutlets: this._serializer.serializeViewOutlets(this.viewOutlets({ grid: 'workbench' })),
|
|
358
358
|
mainAreaViewOutlets: this._serializer.serializeViewOutlets(this.viewOutlets({ grid: 'mainArea' })),
|
|
359
359
|
};
|
|
@@ -378,7 +378,7 @@ export class ɵWorkbenchLayout {
|
|
|
378
378
|
const ratio = relativeTo.ratio ?? .5;
|
|
379
379
|
// Create a new tree node.
|
|
380
380
|
const newTreeNode = new MTreeNode({
|
|
381
|
-
|
|
381
|
+
id: UID.randomUID(),
|
|
382
382
|
child1: addBefore ? newPart : referenceElement,
|
|
383
383
|
child2: addBefore ? referenceElement : newPart,
|
|
384
384
|
direction: relativeTo.align === 'left' || relativeTo.align === 'right' ? 'row' : 'column',
|
|
@@ -429,7 +429,7 @@ export class ɵWorkbenchLayout {
|
|
|
429
429
|
// Remove outlets and states of views contained in the part.
|
|
430
430
|
part.views.forEach(view => {
|
|
431
431
|
this._viewOutlets.delete(view.id);
|
|
432
|
-
this.
|
|
432
|
+
this._navigationStates.delete(view.id);
|
|
433
433
|
});
|
|
434
434
|
// If the removed part was the active part, make the last used part the active part.
|
|
435
435
|
if (grid.activePartId === id) {
|
|
@@ -470,7 +470,7 @@ export class ɵWorkbenchLayout {
|
|
|
470
470
|
if (!commands.length && !extras?.hint && !extras?.relativeTo) {
|
|
471
471
|
throw Error('[NavigateError] Commands, relativeTo or hint must be set.');
|
|
472
472
|
}
|
|
473
|
-
const urlSegments = runInInjectionContext(this._injector, () =>
|
|
473
|
+
const urlSegments = runInInjectionContext(this._injector, () => Routing.commandsToSegments(commands, { relativeTo: extras?.relativeTo }));
|
|
474
474
|
if (urlSegments.length) {
|
|
475
475
|
this._viewOutlets.set(view.id, urlSegments);
|
|
476
476
|
}
|
|
@@ -478,13 +478,15 @@ export class ɵWorkbenchLayout {
|
|
|
478
478
|
this._viewOutlets.delete(view.id);
|
|
479
479
|
}
|
|
480
480
|
if (extras?.state && Objects.keys(extras.state).length) {
|
|
481
|
-
this.
|
|
481
|
+
this._navigationStates.set(view.id, extras.state);
|
|
482
482
|
}
|
|
483
483
|
else {
|
|
484
|
-
this.
|
|
484
|
+
this._navigationStates.delete(view.id);
|
|
485
485
|
}
|
|
486
486
|
view.navigation = Objects.withoutUndefinedEntries({
|
|
487
|
+
id: UID.randomUID(),
|
|
487
488
|
hint: extras?.hint,
|
|
489
|
+
data: extras?.data,
|
|
488
490
|
cssClass: extras?.cssClass ? Arrays.coerce(extras.cssClass) : undefined,
|
|
489
491
|
});
|
|
490
492
|
}
|
|
@@ -496,7 +498,7 @@ export class ɵWorkbenchLayout {
|
|
|
496
498
|
const targetPart = this.part({ partId: targetPartId });
|
|
497
499
|
// Move the view.
|
|
498
500
|
if (sourcePart !== targetPart) {
|
|
499
|
-
this.__removeView(view, { removeOutlet: false,
|
|
501
|
+
this.__removeView(view, { removeOutlet: false, removeNavigationState: false, force: true });
|
|
500
502
|
this.__addView(view, { partId: targetPartId, position: options?.position });
|
|
501
503
|
}
|
|
502
504
|
else if (options?.position !== undefined) {
|
|
@@ -529,8 +531,8 @@ export class ɵWorkbenchLayout {
|
|
|
529
531
|
this._viewOutlets.delete(view.id);
|
|
530
532
|
}
|
|
531
533
|
// Remove state.
|
|
532
|
-
if (options?.
|
|
533
|
-
this.
|
|
534
|
+
if (options?.removeNavigationState ?? true) {
|
|
535
|
+
this._navigationStates.delete(view.id);
|
|
534
536
|
}
|
|
535
537
|
// Activate the last used view if this view was active.
|
|
536
538
|
if (part.activeViewId === view.id) {
|
|
@@ -605,9 +607,9 @@ export class ɵWorkbenchLayout {
|
|
|
605
607
|
this._viewOutlets.set(newViewId, this._viewOutlets.get(view.id));
|
|
606
608
|
this._viewOutlets.delete(view.id);
|
|
607
609
|
}
|
|
608
|
-
if (this.
|
|
609
|
-
this.
|
|
610
|
-
this.
|
|
610
|
+
if (this._navigationStates.has(view.id)) {
|
|
611
|
+
this._navigationStates.set(newViewId, this._navigationStates.get(view.id));
|
|
612
|
+
this._navigationStates.delete(view.id);
|
|
611
613
|
}
|
|
612
614
|
if (part.activeViewId === view.id) {
|
|
613
615
|
part.activeViewId = newViewId;
|
|
@@ -626,12 +628,7 @@ export class ɵWorkbenchLayout {
|
|
|
626
628
|
return this.findTreeElements((element) => element === findBy.element, { findFirst: true, grid: gridName }).length > 0;
|
|
627
629
|
});
|
|
628
630
|
if (!gridName) {
|
|
629
|
-
|
|
630
|
-
throw Error(`[NullGridError] No grid found that contains the part '${findBy.element.id}'".`);
|
|
631
|
-
}
|
|
632
|
-
else {
|
|
633
|
-
throw Error(`[NullGridError] No grid found that contains the node '${findBy.element.nodeId}'".`);
|
|
634
|
-
}
|
|
631
|
+
throw Error(`[NullGridError] No grid found that contains the ${findBy.element instanceof MPart ? 'part' : 'node'} '${findBy.element.id}'".`);
|
|
635
632
|
}
|
|
636
633
|
return this._grids[gridName];
|
|
637
634
|
}
|
|
@@ -644,7 +641,7 @@ export class ɵWorkbenchLayout {
|
|
|
644
641
|
*/
|
|
645
642
|
findTreeElement(findBy) {
|
|
646
643
|
const element = this.findTreeElements((element) => {
|
|
647
|
-
return element
|
|
644
|
+
return element.id === findBy.id;
|
|
648
645
|
}, { findFirst: true }).at(0);
|
|
649
646
|
if (!element) {
|
|
650
647
|
throw Error(`[NullElementError] No element found with id '${findBy.id}'.`);
|
|
@@ -694,10 +691,10 @@ export class ɵWorkbenchLayout {
|
|
|
694
691
|
*/
|
|
695
692
|
workingCopy() {
|
|
696
693
|
return runInInjectionContext(this._injector, () => new ɵWorkbenchLayout({
|
|
697
|
-
workbenchGrid: this._serializer.serializeGrid(this.workbenchGrid
|
|
698
|
-
mainAreaGrid: this._serializer.serializeGrid(this._grids.mainArea
|
|
694
|
+
workbenchGrid: this._serializer.serializeGrid(this.workbenchGrid),
|
|
695
|
+
mainAreaGrid: this._serializer.serializeGrid(this._grids.mainArea),
|
|
699
696
|
viewOutlets: Object.fromEntries(this._viewOutlets),
|
|
700
|
-
|
|
697
|
+
navigationStates: Object.fromEntries(this._navigationStates),
|
|
701
698
|
maximized: this._maximized,
|
|
702
699
|
}));
|
|
703
700
|
}
|
|
@@ -793,7 +790,7 @@ function coercePosition(position, part) {
|
|
|
793
790
|
*/
|
|
794
791
|
export const MAIN_AREA_INITIAL_PART_ID = new InjectionToken('MAIN_AREA_INITIAL_PART_ID', {
|
|
795
792
|
providedIn: 'root',
|
|
796
|
-
factory: () =>
|
|
793
|
+
factory: () => UID.randomUID(),
|
|
797
794
|
});
|
|
798
795
|
/**
|
|
799
796
|
* Provides the instant when a part was last activated.
|
|
@@ -804,8 +801,8 @@ export const MAIN_AREA_INITIAL_PART_ID = new InjectionToken('MAIN_AREA_INITIAL_P
|
|
|
804
801
|
* ```
|
|
805
802
|
*/
|
|
806
803
|
export class PartActivationInstantProvider {
|
|
807
|
-
constructor(
|
|
808
|
-
this._partRegistry =
|
|
804
|
+
constructor() {
|
|
805
|
+
this._partRegistry = inject(WORKBENCH_PART_REGISTRY);
|
|
809
806
|
}
|
|
810
807
|
/**
|
|
811
808
|
* Returns the instant when the specified part was last activated.
|
|
@@ -813,13 +810,13 @@ export class PartActivationInstantProvider {
|
|
|
813
810
|
getActivationInstant(partId) {
|
|
814
811
|
return this._partRegistry.get(partId, { orElse: null })?.activationInstant ?? 0;
|
|
815
812
|
}
|
|
816
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartActivationInstantProvider, deps: [
|
|
813
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartActivationInstantProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
817
814
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartActivationInstantProvider, providedIn: 'root' }); }
|
|
818
815
|
}
|
|
819
816
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartActivationInstantProvider, decorators: [{
|
|
820
817
|
type: Injectable,
|
|
821
818
|
args: [{ providedIn: 'root' }]
|
|
822
|
-
}]
|
|
819
|
+
}] });
|
|
823
820
|
/**
|
|
824
821
|
* Provides the instant when a view was last activated.
|
|
825
822
|
*
|
|
@@ -829,8 +826,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
|
|
|
829
826
|
* ```
|
|
830
827
|
*/
|
|
831
828
|
export class ViewActivationInstantProvider {
|
|
832
|
-
constructor(
|
|
833
|
-
this._viewRegistry =
|
|
829
|
+
constructor() {
|
|
830
|
+
this._viewRegistry = inject(WORKBENCH_VIEW_REGISTRY);
|
|
834
831
|
}
|
|
835
832
|
/**
|
|
836
833
|
* Returns the instant when the specified view was last activated.
|
|
@@ -838,13 +835,13 @@ export class ViewActivationInstantProvider {
|
|
|
838
835
|
getActivationInstant(viewId) {
|
|
839
836
|
return this._viewRegistry.get(viewId, { orElse: null })?.activationInstant ?? 0;
|
|
840
837
|
}
|
|
841
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewActivationInstantProvider, deps: [
|
|
838
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewActivationInstantProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
842
839
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewActivationInstantProvider, providedIn: 'root' }); }
|
|
843
840
|
}
|
|
844
841
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewActivationInstantProvider, decorators: [{
|
|
845
842
|
type: Injectable,
|
|
846
843
|
args: [{ providedIn: 'root' }]
|
|
847
|
-
}]
|
|
844
|
+
}] });
|
|
848
845
|
/**
|
|
849
846
|
* Creates a predicate to match a view by its primary or alternative id, depending on the type of the passed id.
|
|
850
847
|
*/
|
|
@@ -862,4 +859,4 @@ function matchViewById(id) {
|
|
|
862
859
|
function stringifyFilter(filter) {
|
|
863
860
|
return Object.entries(filter).map(([key, value]) => `${key}=${value}`).join(', ');
|
|
864
861
|
}
|
|
865
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybV3b3JrYmVuY2gtbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvbGF5b3V0L8m1d29ya2JlbmNoLWxheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBQyxLQUFLLEVBQWEsU0FBUyxFQUFvQixNQUFNLDBCQUEwQixDQUFDO0FBQ3hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsVUFBVSxFQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFDLFNBQVMsRUFBaUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUcvRSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFhLHFCQUFxQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUluRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFM0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7Ozs7QUFFbEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQWEzQixpQkFBaUI7SUFDakIsWUFBWSxNQUE2TDtRQVJ4TCxtQ0FBOEIsR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUN2RSxtQ0FBOEIsR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUN2RSxnQkFBVyxH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QyxhQUFhLEtBQUssRUFBRSxDQUFDO0lBQzNDLENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxNQUFxQztJQUM1RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjMgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5pbXBvcnQge01QYXJ0LCBNUGFydEdyaWQsIE1UcmVlTm9kZSwgTVZpZXcsIMm1TVBhcnRHcmlkfSBmcm9tICcuL3dvcmtiZW5jaC1sYXlvdXQubW9kZWwnO1xuaW1wb3J0IHthc3NlcnRUeXBlfSBmcm9tICcuLi9jb21tb24vYXNzZXJ0cy51dGlsJztcbmltcG9ydCB7cmFuZG9tVVVJRCwgVVVJRH0gZnJvbSAnLi4vY29tbW9uL3V1aWQudXRpbCc7XG5pbXBvcnQge01BSU5fQVJFQSwgUmVmZXJlbmNlUGFydCwgV29ya2JlbmNoTGF5b3V0fSBmcm9tICcuL3dvcmtiZW5jaC1sYXlvdXQnO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXRTZXJpYWxpemVyfSBmcm9tICcuL3dvcmtlbmNoLWxheW91dC1zZXJpYWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHtXb3JrYmVuY2hWaWV3UmVnaXN0cnl9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcucmVnaXN0cnknO1xuaW1wb3J0IHtXb3JrYmVuY2hQYXJ0UmVnaXN0cnl9IGZyb20gJy4uL3BhcnQvd29ya2JlbmNoLXBhcnQucmVnaXN0cnknO1xuaW1wb3J0IHtpbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBJbmplY3RvciwgUHJlZGljYXRlLCBydW5JbkluamVjdGlvbkNvbnRleHR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtSb3V0ZXJVdGlsc30gZnJvbSAnLi4vcm91dGluZy9yb3V0ZXIudXRpbCc7XG5pbXBvcnQge0NvbW1hbmRzLCBWaWV3T3V0bGV0cywgVmlld1N0YXRlLCBWaWV3U3RhdGVzfSBmcm9tICcuLi9yb3V0aW5nL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgVXJsU2VnbWVudH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7Vmlld0lkfSBmcm9tICcuLi92aWV3L3dvcmtiZW5jaC12aWV3Lm1vZGVsJztcbmltcG9ydCB7QXJyYXlzfSBmcm9tICdAc2Npb24vdG9vbGtpdC91dGlsJztcbmltcG9ydCB7VXJsU2VnbWVudE1hdGNoZXJ9IGZyb20gJy4uL3JvdXRpbmcvdXJsLXNlZ21lbnQtbWF0Y2hlcic7XG5pbXBvcnQge09iamVjdHN9IGZyb20gJy4uL2NvbW1vbi9vYmplY3RzLnV0aWwnO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXRzfSBmcm9tICcuL3dvcmtiZW5jaC1sYXlvdXRzLnV0aWwnO1xuaW1wb3J0IHtMb2dnZXJ9IGZyb20gJy4uL2xvZ2dpbmcnO1xuXG4vKipcbiAqIEBpbmhlcml0RG9jXG4gKlxuICogVGhlIHdvcmtiZW5jaCBsYXlvdXQgaXMgYSBncmlkIG9mIHBhcnRzLiBJdCBjb250YWlucyBhdCBsZWFzdCBvbmUgcGFydC4gQSBzcGVjaWFsIHBhcnQsIHRoZSBtYWluIGFyZWEgcGFydCwgaXMgbm90IGEgc3RhY2sgb2Ygdmlld3NcbiAqIGJ1dCBlbWJlZHMgYSBzdWItZ3JpZCwgdGhlIG1haW4gYXJlYSBncmlkLiBJdCBkZWZpbmVzIHRoZSBhcnJhbmdlbWVudCBvZiBwYXJ0cyBpbiB0aGUgbWFpbiBhcmVhLiBUaGUgbWFpbiBhcmVhIGlzIG9wdGlvbmFsLlxuICpcbiAqIFRoZSBsYXlvdXQgaXMgc2VyaWFsaXphYmxlIGludG8gYSBVUkwtc2FmZSBiYXNlNjQgc3RyaW5nLlxuICpcbiAqIFRoZSBsYXlvdXQgaXMgYW4gaW1tdXRhYmxlIG9iamVjdCB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgdG8gbW9kaWZ5IHRoZSBsYXlvdXQuIE1vZGlmaWNhdGlvbnMgaGF2ZSBub1xuICogc2lkZSBlZmZlY3RzLiBFYWNoIG1vZGlmaWNhdGlvbiBjcmVhdGVzIGEgbmV3IGxheW91dCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMuXG4gKlxuICogSU1QT1JUQU5UOiBNZXRob2RzIHN0YXJ0aW5nIHdpdGggYW4gdW5kZXJzY29yZSBpbmRpY2F0ZSB0aGV5IGFyZSBub3Qgd29ya2luZyBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmeWluZyB0aGUgbGF5b3V0IGluc3RhbmNlLlxuICovXG5leHBvcnQgY2xhc3MgybVXb3JrYmVuY2hMYXlvdXQgaW1wbGVtZW50cyBXb3JrYmVuY2hMYXlvdXQge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2dyaWRzOiBHcmlkcztcbiAgcHJpdmF0ZSByZWFkb25seSBfdmlld091dGxldHM6IE1hcDxWaWV3SWQsIFVybFNlZ21lbnRbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdTdGF0ZXM6IE1hcDxWaWV3SWQsIFZpZXdTdGF0ZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2dyaWROYW1lczogQXJyYXk8a2V5b2YgR3JpZHM+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9wYXJ0QWN0aXZhdGlvbkluc3RhbnRQcm92aWRlciA9IGluamVjdChQYXJ0QWN0aXZhdGlvbkluc3RhbnRQcm92aWRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyID0gaW5qZWN0KFZpZXdBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VyaWFsaXplciA9IGluamVjdChXb3JrYmVuY2hMYXlvdXRTZXJpYWxpemVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gIHByaXZhdGUgX21heGltaXplZDogYm9vbGVhbjtcblxuICAvKiogQGludGVybmFsICoqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IHt3b3JrYmVuY2hHcmlkPzogc3RyaW5nIHwgTVBhcnRHcmlkIHwgbnVsbDsgbWFpbkFyZWFHcmlkPzogc3RyaW5nIHwgTVBhcnRHcmlkIHwgbnVsbDsgdmlld091dGxldHM/OiBzdHJpbmcgfCBWaWV3T3V0bGV0cyB8IG51bGw7IHZpZXdTdGF0ZXM/OiBWaWV3U3RhdGVzIHwgbnVsbDsgbWF4aW1pemVkPzogYm9vbGVhbn0pIHtcbiAgICB0aGlzLl9ncmlkcyA9IHtcbiAgICAgIHdvcmtiZW5jaDogY29lcmNlTVBhcnRHcmlkKGNvbmZpZy53b3JrYmVuY2hHcmlkLCB7ZGVmYXVsdDogY3JlYXRlRGVmYXVsdFdvcmtiZW5jaEdyaWR9KSxcbiAgICB9O1xuICAgIGlmICh0aGlzLmhhc1BhcnQoTUFJTl9BUkVBLCB7Z3JpZDogJ3dvcmtiZW5jaCd9KSkge1xuICAgICAgdGhpcy5fZ3JpZHMubWFpbkFyZWEgPSBjb2VyY2VNUGFydEdyaWQoY29uZmlnLm1haW5BcmVhR3JpZCwge2RlZmF1bHQ6IGNyZWF0ZUluaXRpYWxNYWluQXJlYUdyaWR9KTtcbiAgICB9XG4gICAgdGhpcy5fZ3JpZE5hbWVzID0gT2JqZWN0cy5rZXlzKHRoaXMuX2dyaWRzKTtcbiAgICB0aGlzLl9tYXhpbWl6ZWQgPSBjb25maWcubWF4aW1pemVkID8/IGZhbHNlO1xuICAgIHRoaXMuX3ZpZXdPdXRsZXRzID0gbmV3IE1hcDxWaWV3SWQsIFVybFNlZ21lbnRbXT4oT2JqZWN0cy5lbnRyaWVzKGNvZXJjZVZpZXdPdXRsZXRzKGNvbmZpZy52aWV3T3V0bGV0cykpKTtcbiAgICB0aGlzLl92aWV3U3RhdGVzID0gbmV3IE1hcDxWaWV3SWQsIFZpZXdTdGF0ZT4oT2JqZWN0cy5lbnRyaWVzKGNvbmZpZy52aWV3U3RhdGVzID8/IHt9KSk7XG4gICAgdGhpcy5wYXJ0cygpLmZvckVhY2gocGFydCA9PiBhc3NlcnRUeXBlKHBhcnQsIHt0b0JlT25lT2Y6IFtNVHJlZU5vZGUsIE1QYXJ0XX0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIG1haW4gd29ya2JlbmNoIGdyaWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdvcmtiZW5jaEdyaWQoKTogUmVhZG9ubHk8ybVNUGFydEdyaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZHMud29ya2JlbmNoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgbWFpbiBhcmVhIGdyaWQsIGlmIGFueS5cbiAgICpcbiAgICogVGhlIG1haW4gYXJlYSBncmlkIGlzIGEgc3ViLWdyaWQgaW5jbHVkZWQgYnkgdGhlIHtAbGluayBNQUlOX0FSRUF9IHBhcnQuIEl0IGRlZmluZXMgdGhlIGFycmFuZ2VtZW50IG9mIHBhcnRzIGluIHRoZSBtYWluIGFyZWEuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1haW5BcmVhR3JpZCgpOiBSZWFkb25seTzJtU1QYXJ0R3JpZD4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZHMubWFpbkFyZWEgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyBpZiBnaXZlbiBwYXJ0IGlzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIGdyaWQuXG4gICAqL1xuICBwdWJsaWMgaGFzUGFydChpZDogc3RyaW5nLCBvcHRpb25zPzoge2dyaWQ/OiBrZXlvZiBHcmlkc30pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wYXJ0KHtwYXJ0SWQ6IGlkLCBncmlkOiBvcHRpb25zPy5ncmlkfSwge29yRWxzZTogbnVsbH0pICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3RzIGlmIGdpdmVuIHZpZXcgaXMgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgZ3JpZC5cbiAgICovXG4gIHB1YmxpYyBoYXNWaWV3KGlkOiBzdHJpbmcsIG9wdGlvbnM/OiB7Z3JpZD86IGtleW9mIEdyaWRzfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdzKHtncmlkOiBvcHRpb25zPy5ncmlkLCBpZDogaWR9KS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBVUkwgb2Ygdmlld3MgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBmaWx0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBmaW5kQnkgLSBEZWZpbmVzIHRoZSBzZWFyY2ggc2NvcGUuXG4gICAqIEBwYXJhbSBmaW5kQnkuZ3JpZCAtIFNlYXJjaGVzIGZvciB2aWV3cyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBncmlkLlxuICAgKiBAcmV0dXJuIG91dGxldHMgb2Ygdmlld3MgbWF0Y2hpbmcgdGhlIGZpbHRlciBjcml0ZXJpYS5cbiAgICovXG4gIHB1YmxpYyB2aWV3T3V0bGV0cyhmaW5kQnk/OiB7Z3JpZD86IGtleW9mIEdyaWRzfSk6IFZpZXdPdXRsZXRzIHtcbiAgICBjb25zdCB2aWV3T3V0bGV0RW50cmllcyA9IHRoaXMudmlld3Moe2dyaWQ6IGZpbmRCeT8uZ3JpZH0pLm1hcCh2aWV3ID0+IFt2aWV3LmlkLCB0aGlzLl92aWV3T3V0bGV0cy5nZXQodmlldy5pZCkgPz8gW11dKTtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHZpZXdPdXRsZXRFbnRyaWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgbmF2aWdhdGlvbmFsIHN0YXRlIG9mIHZpZXdzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgZmlsdGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZmluZEJ5IC0gRGVmaW5lcyB0aGUgc2VhcmNoIHNjb3BlLlxuICAgKiBAcGFyYW0gZmluZEJ5LmdyaWQgLSBTZWFyY2hlcyBmb3Igdmlld3MgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgZ3JpZC5cbiAgICogQHJldHVybiB2aWV3IHN0YXRlIG1hdGNoaW5nIHRoZSBmaWx0ZXIgY3JpdGVyaWEuXG4gICAqL1xuICBwdWJsaWMgdmlld1N0YXRlcyhmaW5kQnk/OiB7Z3JpZD86IGtleW9mIEdyaWRzfSk6IFZpZXdTdGF0ZXMge1xuICAgIGNvbnN0IHZpZXdTdGF0ZUVudHJpZXMgPSB0aGlzLnZpZXdzKHtncmlkOiBmaW5kQnk/LmdyaWR9KS5tYXAodmlldyA9PiBbdmlldy5pZCwgdGhpcy5fdmlld1N0YXRlcy5nZXQodmlldy5pZCkgPz8ge31dKTtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHZpZXdTdGF0ZUVudHJpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBuYXZpZ2F0aW9uYWwgc3RhdGUgb2Ygc3BlY2lmaWVkIHZpZXcuXG4gICAqL1xuICBwdWJsaWMgdmlld1N0YXRlKGZpbmRCeToge3ZpZXdJZDogVmlld0lkfSk6IFZpZXdTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdTdGF0ZXMuZ2V0KGZpbmRCeS52aWV3SWQpID8/IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBVUkwgb2Ygc3BlY2lmaWVkIHZpZXcuXG4gICAqL1xuICBwdWJsaWMgdXJsU2VnbWVudHMoZmluZEJ5OiB7dmlld0lkOiBWaWV3SWR9KTogVXJsU2VnbWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld091dGxldHMuZ2V0KGZpbmRCeS52aWV3SWQpID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdGF0ZSwgbWF4aW1pemVzIG9yIG1pbmltaXplcyB0aGUgbWFpbiBhcmVhLlxuICAgKlxuICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIGxheW91dCB3aXRoIHRoZSBtYXhpbWl6YXRpb24gY2hhbmdlZC5cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVNYXhpbWl6ZWQoKTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5Ll9fdG9nZ2xlTWF4aW1pemVkKCk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtYWluIGFyZWEgaXMgbWF4aW1pemVkLlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhpbWl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX21heGltaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBwYXJ0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGZpbHRlci5cbiAgICpcbiAgICogQHBhcmFtIGZpbmRCeSAtIERlZmluZXMgdGhlIHNlYXJjaCBzY29wZS5cbiAgICogQHBhcmFtIGZpbmRCeS5ncmlkIC0gU2VhcmNoZXMgZm9yIHBhcnRzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIGdyaWQuXG4gICAqIEByZXR1cm4gcGFydHMgbWF0Y2hpbmcgdGhlIGZpbHRlciBjcml0ZXJpYS5cbiAgICovXG4gIHB1YmxpYyBwYXJ0cyhmaW5kQnk/OiB7Z3JpZD86IGtleW9mIEdyaWRzfSk6IHJlYWRvbmx5IE1QYXJ0W10ge1xuICAgIHJldHVybiB0aGlzLmZpbmRUcmVlRWxlbWVudHMoKGVsZW1lbnQ6IE1UcmVlTm9kZSB8IE1QYXJ0KTogZWxlbWVudCBpcyBNUGFydCA9PiBlbGVtZW50IGluc3RhbmNlb2YgTVBhcnQsIHtncmlkOiBmaW5kQnk/LmdyaWR9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHBhcnQgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBmaWx0ZXIuIElmIG5vdCBmb3VuZCwgYnkgZGVmYXVsdCwgdGhyb3dzIGFuIGVycm9yIHVubGVzcyBzZXR0aW5nIHRoZSBgb3JFbHNlTnVsbGAgb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZmluZEJ5IC0gRGVmaW5lcyB0aGUgc2VhcmNoIHNjb3BlLlxuICAgKiBAcGFyYW0gZmluZEJ5LnBhcnRJZCAtIFNlYXJjaGVzIGZvciBhIHBhcnQgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLlxuICAgKiBAcGFyYW0gZmluZEJ5LnZpZXdJZCAtIFNlYXJjaGVzIGZvciBhIHBhcnQgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZpZXcuXG4gICAqIEBwYXJhbSBmaW5kQnkuZ3JpZCAtIFNlYXJjaGVzIGZvciBhIHBhcnQgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgZ3JpZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb250cm9scyB0aGUgc2VhcmNoLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5vckVsc2UgLSBDb250cm9scyB0byByZXR1cm4gYG51bGxgIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IgaWYgbm8gcGFydCBpcyBmb3VuZC5cbiAgICogQHJldHVybiBwYXJ0IG1hdGNoaW5nIHRoZSBmaWx0ZXIgY3JpdGVyaWEuXG4gICAqL1xuICBwdWJsaWMgcGFydChmaW5kQnk6IHtwYXJ0SWQ/OiBzdHJpbmc7IHZpZXdJZD86IHN0cmluZzsgZ3JpZD86IGtleW9mIEdyaWRzfSk6IE1QYXJ0O1xuICBwdWJsaWMgcGFydChmaW5kQnk6IHtwYXJ0SWQ/OiBzdHJpbmc7IHZpZXdJZD86IHN0cmluZzsgZ3JpZD86IGtleW9mIEdyaWRzfSwgb3B0aW9uczoge29yRWxzZTogbnVsbH0pOiBNUGFydCB8IG51bGw7XG4gIHB1YmxpYyBwYXJ0KGZpbmRCeToge3BhcnRJZD86IHN0cmluZzsgdmlld0lkPzogc3RyaW5nOyBncmlkPzoga2V5b2YgR3JpZHN9LCBvcHRpb25zPzoge29yRWxzZTogbnVsbH0pOiBNUGFydCB8IG51bGwge1xuICAgIGlmICghZmluZEJ5LnBhcnRJZCAmJiAhZmluZEJ5LnZpZXdJZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFtQYXJ0RmluZEVycm9yXSBNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50LiBTcGVjaWZ5IGVpdGhlciAncGFydElkJyBvciAndmlld0lkJy5gKTtcbiAgICB9XG4gICAgY29uc3QgcGFydCA9IHRoaXMuZmluZFRyZWVFbGVtZW50cygoZWxlbWVudDogTVRyZWVOb2RlIHwgTVBhcnQpOiBlbGVtZW50IGlzIE1QYXJ0ID0+IHtcbiAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZpbmRCeS5wYXJ0SWQgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50LmlkICE9PSBmaW5kQnkucGFydElkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaW5kQnkudmlld0lkICE9PSB1bmRlZmluZWQgJiYgIWVsZW1lbnQudmlld3Muc29tZShtYXRjaFZpZXdCeUlkKGZpbmRCeS52aWV3SWQhKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSwge2ZpbmRGaXJzdDogdHJ1ZSwgZ3JpZDogZmluZEJ5LmdyaWR9KVswXTtcblxuICAgIGlmICghcGFydCAmJiAhb3B0aW9ucykge1xuICAgICAgdGhyb3cgRXJyb3IoYFtOdWxsUGFydEVycm9yXSBObyBtYXRjaGluZyBwYXJ0IGZvdW5kOiBbJHtzdHJpbmdpZnlGaWx0ZXIoZmluZEJ5KX1dYCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0ID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gQGluaGVyaXREb2NcbiAgICogQHBhcmFtIHJlbGF0aXZlVG8gLSBAaW5oZXJpdERvY1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEBpbmhlcml0RG9jXG4gICAqIEBwYXJhbSBvcHRpb25zLmFjdGl2YXRlIC0gQGluaGVyaXREb2NcbiAgICogQHBhcmFtIG9wdGlvbnMuc3RydWN0dXJhbCAtIFNwZWNpZmllcyBpZiB0aGlzIGlzIGEgc3RydWN0dXJhbCBwYXJ0LiBBIHN0cnVjdHVyYWwgcGFydCB3aWxsIG5vdCBiZSByZW1vdmVkIHdoZW4gcmVtb3ZpbmcgaXRzIGxhc3Qgdmlldy4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gICAqL1xuICBwdWJsaWMgYWRkUGFydChpZDogc3RyaW5nIHwgTUFJTl9BUkVBLCByZWxhdGl2ZVRvOiBSZWZlcmVuY2VFbGVtZW50LCBvcHRpb25zPzoge2FjdGl2YXRlPzogYm9vbGVhbjsgc3RydWN0dXJhbD86IGJvb2xlYW59KTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5Ll9fYWRkUGFydChpZCwgcmVsYXRpdmVUbywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUGFydChpZDogc3RyaW5nKTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5Ll9fcmVtb3ZlUGFydChpZCk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFjdGl2ZSBwYXJ0IG9mIHRoZSBzcGVjaWZpZWQgZ3JpZCwgb3IgYG51bGxgIGlmIHNwZWNpZmllZCBncmlkIGlzIG5vdCBwcmVzZW50LlxuICAgKi9cbiAgcHVibGljIGFjdGl2ZVBhcnQoZmluZDoge2dyaWQ6ICd3b3JrYmVuY2gnfSk6IFJlYWRvbmx5PE1QYXJ0PjtcbiAgcHVibGljIGFjdGl2ZVBhcnQoZmluZDoge2dyaWQ6IGtleW9mIEdyaWRzfSk6IFJlYWRvbmx5PE1QYXJ0PiB8IG51bGw7XG4gIHB1YmxpYyBhY3RpdmVQYXJ0KGZpbmQ6IHtncmlkOiBrZXlvZiBHcmlkc30pOiBSZWFkb25seTxNUGFydD4gfCBudWxsIHtcbiAgICBjb25zdCBncmlkID0gdGhpcy5fZ3JpZHNbZmluZC5ncmlkXTtcbiAgICBpZiAoIWdyaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJ0KHtwYXJ0SWQ6IGdyaWQuYWN0aXZlUGFydElkLCBncmlkOiBmaW5kLmdyaWR9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGFjdGl2YXRlUGFydChpZDogc3RyaW5nKTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5Ll9fYWN0aXZhdGVQYXJ0KGlkKTtcbiAgICByZXR1cm4gd29ya2luZ0NvcHk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSB2aWV3IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgZmlsdGVyLiBJZiBub3QgZm91bmQsIGJ5IGRlZmF1bHQsIHRocm93cyBhbiBlcnJvciB1bmxlc3Mgc2V0dGluZyB0aGUgYG9yRWxzZU51bGxgIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGZpbmRCeSAtIERlZmluZXMgdGhlIHNlYXJjaCBzY29wZS5cbiAgICogQHBhcmFtIGZpbmRCeS52aWV3SWQgLSBTZWFyY2hlcyBmb3IgYSB2aWV3IHdpdGggdGhlIHNwZWNpZmllZCBpZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb250cm9scyB0aGUgc2VhcmNoLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5vckVsc2UgLSBDb250cm9scyB0byByZXR1cm4gYG51bGxgIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IgaWYgbm8gdmlldyBpcyBmb3VuZC5cbiAgICogQHJldHVybiB2aWV3IG1hdGNoaW5nIHRoZSBmaWx0ZXIgY3JpdGVyaWEuXG4gICAqL1xuICBwdWJsaWMgdmlldyhmaW5kQnk6IHt2aWV3SWQ6IFZpZXdJZH0pOiBNVmlldztcbiAgcHVibGljIHZpZXcoZmluZEJ5OiB7dmlld0lkOiBWaWV3SWR9LCBvcHRpb25zOiB7b3JFbHNlOiBudWxsfSk6IE1WaWV3IHwgbnVsbDtcbiAgcHVibGljIHZpZXcoZmluZEJ5OiB7dmlld0lkOiBWaWV3SWR9LCBvcHRpb25zPzoge29yRWxzZTogbnVsbH0pOiBNVmlldyB8IG51bGwge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdzKHtpZDogZmluZEJ5LnZpZXdJZH0pLmF0KDApO1xuICAgIGlmICghdmlldyAmJiAhb3B0aW9ucykge1xuICAgICAgdGhyb3cgRXJyb3IoYFtOdWxsVmlld0Vycm9yXSBObyB2aWV3IGZvdW5kIHdpdGggaWQgJyR7ZmluZEJ5LnZpZXdJZH0nLmApO1xuICAgIH1cbiAgICByZXR1cm4gdmlldyA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHZpZXdzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgZmlsdGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZmluZEJ5IC0gRGVmaW5lcyB0aGUgc2VhcmNoIHNjb3BlLlxuICAgKiBAcGFyYW0gZmluZEJ5LmlkIC0gU2VhcmNoZXMgZm9yIHZpZXdzIHdpdGggdGhlIHNwZWNpZmllZCBpZC5cbiAgICogQHBhcmFtIGZpbmRCeS5wYXJ0SWQgLSBTZWFyY2hlcyBmb3Igdmlld3MgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgcGFydC5cbiAgICogQHBhcmFtIGZpbmRCeS5zZWdtZW50cyAtIFNlYXJjaGVzIGZvciB2aWV3cyBuYXZpZ2F0ZWQgdG8gdGhlIHNwZWNpZmllZCBVUkwuXG4gICAqIEBwYXJhbSBmaW5kQnkubmF2aWdhdGlvbkhpbnQgLSBTZWFyY2hlcyBmb3Igdmlld3MgbmF2aWdhdGVkIHdpdGggZ2l2ZW4gaGludC4gUGFzc2luZyBgbnVsbGAgc2VhcmNoZXMgZm9yIHZpZXdzIG5hdmlnYXRlZCB3aXRob3V0IGEgaGludC5cbiAgICogQHBhcmFtIGZpbmRCeS5tYXJrZWRGb3JSZW1vdmFsIC0gU2VhcmNoZXMgZm9yIHZpZXdzIG1hcmtlZCAob3Igbm90IG1hcmtlZCkgZm9yIHJlbW92YWwuXG4gICAqIEBwYXJhbSBmaW5kQnkuZ3JpZCAtIFNlYXJjaGVzIGZvciB2aWV3cyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBncmlkLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbnRyb2xzIHRoZSBzZWFyY2guXG4gICAqIEBwYXJhbSBvcHRpb25zLm9yRWxzZSAtIENvbnRyb2xzIHRvIGVycm9yIGlmIG5vIHZpZXcgaXMgZm91bmQuXG4gICAqIEByZXR1cm4gdmlld3MgbWF0Y2hpbmcgdGhlIGZpbHRlciBjcml0ZXJpYS5cbiAgICovXG4gIHB1YmxpYyB2aWV3cyhmaW5kQnk/OiB7aWQ/OiBzdHJpbmc7IHBhcnRJZD86IHN0cmluZzsgc2VnbWVudHM/OiBVcmxTZWdtZW50TWF0Y2hlcjsgbmF2aWdhdGlvbkhpbnQ/OiBzdHJpbmcgfCBudWxsOyBtYXJrZWRGb3JSZW1vdmFsPzogYm9vbGVhbjsgZ3JpZD86IGtleW9mIEdyaWRzfSwgb3B0aW9ucz86IHtvckVsc2U6ICd0aHJvd0Vycm9yJ30pOiByZWFkb25seSBNVmlld1tdIHtcbiAgICBjb25zdCB2aWV3cyA9IHRoaXMucGFydHMoe2dyaWQ6IGZpbmRCeT8uZ3JpZH0pXG4gICAgICAuZmlsdGVyKHBhcnQgPT4ge1xuICAgICAgICBpZiAoZmluZEJ5Py5wYXJ0SWQgIT09IHVuZGVmaW5lZCAmJiBwYXJ0LmlkICE9PSBmaW5kQnkucGFydElkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSlcbiAgICAgIC5mbGF0TWFwKHBhcnQgPT4gcGFydC52aWV3cylcbiAgICAgIC5maWx0ZXIodmlldyA9PiB7XG4gICAgICAgIGlmIChmaW5kQnk/LmlkICE9PSB1bmRlZmluZWQgJiYgIW1hdGNoVmlld0J5SWQoZmluZEJ5LmlkKSh2aWV3KSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmluZEJ5Py5zZWdtZW50cyAmJiAhZmluZEJ5LnNlZ21lbnRzLm1hdGNoZXModGhpcy51cmxTZWdtZW50cyh7dmlld0lkOiB2aWV3LmlkfSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaW5kQnk/Lm5hdmlnYXRpb25IaW50ICE9PSB1bmRlZmluZWQgJiYgZmluZEJ5Lm5hdmlnYXRpb25IaW50ICE9PSAodmlldy5uYXZpZ2F0aW9uPy5oaW50ID8/IG51bGwpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaW5kQnk/Lm1hcmtlZEZvclJlbW92YWwgIT09IHVuZGVmaW5lZCAmJiBmaW5kQnkubWFya2VkRm9yUmVtb3ZhbCAhPT0gKHZpZXcubWFya2VkRm9yUmVtb3ZhbCA/PyBmYWxzZSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcblxuICAgIGlmIChmaW5kQnkgJiYgIXZpZXdzLmxlbmd0aCAmJiBvcHRpb25zKSB7XG4gICAgICB0aHJvdyBFcnJvcihgW051bGxWaWV3RXJyb3JdIE5vIG1hdGNoaW5nIHZpZXcgZm91bmQ6IFske3N0cmluZ2lmeUZpbHRlcihmaW5kQnkpfV1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgYWRkVmlldyhpZDogc3RyaW5nLCBvcHRpb25zOiB7cGFydElkOiBzdHJpbmc7IHBvc2l0aW9uPzogbnVtYmVyIHwgJ3N0YXJ0JyB8ICdlbmQnIHwgJ2JlZm9yZS1hY3RpdmUtdmlldycgfCAnYWZ0ZXItYWN0aXZlLXZpZXcnOyBhY3RpdmF0ZVZpZXc/OiBib29sZWFuOyBhY3RpdmF0ZVBhcnQ/OiBib29sZWFuOyBjc3NDbGFzcz86IHN0cmluZyB8IHN0cmluZ1tdfSk6IMm1V29ya2JlbmNoTGF5b3V0IHtcbiAgICBjb25zdCB3b3JraW5nQ29weSA9IHRoaXMud29ya2luZ0NvcHkoKTtcbiAgICBpZiAoV29ya2JlbmNoTGF5b3V0cy5pc1ZpZXdJZChpZCkpIHtcbiAgICAgIHdvcmtpbmdDb3B5Ll9fYWRkVmlldyh7aWQsIHVpZDogcmFuZG9tVVVJRCgpfSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgd29ya2luZ0NvcHkuX19hZGRWaWV3KHtpZDogdGhpcy5jb21wdXRlTmV4dFZpZXdJZCgpLCBhbHRlcm5hdGl2ZUlkOiBpZCwgdWlkOiByYW5kb21VVUlEKCl9LCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmF2aWdhdGVWaWV3KGlkOiBzdHJpbmcsIGNvbW1hbmRzOiBDb21tYW5kcywgZXh0cmFzPzoge2hpbnQ/OiBzdHJpbmc7IHJlbGF0aXZlVG8/OiBBY3RpdmF0ZWRSb3V0ZSB8IG51bGw7IHN0YXRlPzogVmlld1N0YXRlOyBjc3NDbGFzcz86IHN0cmluZyB8IHN0cmluZ1tdfSk6IMm1V29ya2JlbmNoTGF5b3V0IHtcbiAgICBjb25zdCB3b3JraW5nQ29weSA9IHRoaXMud29ya2luZ0NvcHkoKTtcbiAgICB3b3JraW5nQ29weS52aWV3cyh7aWR9LCB7b3JFbHNlOiAndGhyb3dFcnJvcid9KS5mb3JFYWNoKHZpZXcgPT4gd29ya2luZ0NvcHkuX19uYXZpZ2F0ZVZpZXcodmlldywgY29tbWFuZHMsIGV4dHJhcykpO1xuICAgIHJldHVybiB3b3JraW5nQ29weTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBAaW5oZXJpdERvY1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbnRyb2xzIHJlbW92YWwgb2YgdGhlIHZpZXcuXG4gICAqIEBwYXJhbSBvcHRpb25zLmZvcmNlIC0gU3BlY2lmaWVzIHdoZXRoZXIgdG8gZm9yY2UgcmVtb3ZlIHRoZSB2aWV3LCBieXBhc3NpbmcgYENhbkNsb3NlYCBndWFyZC5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVWaWV3KGlkOiBzdHJpbmcsIG9wdGlvbnM/OiB7Zm9yY2U/OiBib29sZWFufSk6IMm1V29ya2JlbmNoTGF5b3V0IHtcbiAgICBjb25zdCB3b3JraW5nQ29weSA9IHRoaXMud29ya2luZ0NvcHkoKTtcbiAgICB3b3JraW5nQ29weS52aWV3cyh7aWR9LCB7b3JFbHNlOiAndGhyb3dFcnJvcid9KS5mb3JFYWNoKHZpZXcgPT4gd29ya2luZ0NvcHkuX19yZW1vdmVWaWV3KHZpZXcsIHtmb3JjZTogb3B0aW9ucz8uZm9yY2V9KSk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdmlld3MgbWFya2VkIGZvciByZW1vdmFsLCBvcHRpb25hbGx5IGludm9raW5nIHRoZSBwYXNzZWQgYENhbkNsb3NlYCBmdW5jdGlvbiB0byBkZWNpZGUgd2hldGhlciB0byByZW1vdmUgYSB2aWV3LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbW92ZVZpZXdzTWFya2VkRm9yUmVtb3ZhbChjYW5DbG9zZUZuPzogKHZpZXdVaWQ6IFVVSUQpID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuKTogUHJvbWlzZTzJtVdvcmtiZW5jaExheW91dD4ge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIGZvciAoY29uc3QgdmlldyBvZiB3b3JraW5nQ29weS52aWV3cyh7bWFya2VkRm9yUmVtb3ZhbDogdHJ1ZX0pKSB7XG4gICAgICBpZiAoIWNhbkNsb3NlRm4gfHwgYXdhaXQgY2FuQ2xvc2VGbih2aWV3LnVpZCkpIHtcbiAgICAgICAgd29ya2luZ0NvcHkuX19yZW1vdmVWaWV3KHZpZXcsIHtmb3JjZTogdHJ1ZX0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd29ya2luZ0NvcHk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBtb3ZlVmlldyhpZDogc3RyaW5nLCB0YXJnZXRQYXJ0SWQ6IHN0cmluZywgb3B0aW9ucz86IHtwb3NpdGlvbj86IG51bWJlciB8ICdzdGFydCcgfCAnZW5kJyB8ICdiZWZvcmUtYWN0aXZlLXZpZXcnIHwgJ2FmdGVyLWFjdGl2ZS12aWV3JzsgYWN0aXZhdGVWaWV3PzogYm9vbGVhbjsgYWN0aXZhdGVQYXJ0PzogYm9vbGVhbn0pOiDJtVdvcmtiZW5jaExheW91dCB7XG4gICAgY29uc3Qgd29ya2luZ0NvcHkgPSB0aGlzLndvcmtpbmdDb3B5KCk7XG4gICAgd29ya2luZ0NvcHkudmlld3Moe2lkfSwge29yRWxzZTogJ3Rocm93RXJyb3InfSkuZm9yRWFjaCh2aWV3ID0+IHdvcmtpbmdDb3B5Ll9fbW92ZVZpZXcodmlldywgdGFyZ2V0UGFydElkLCBvcHRpb25zKSk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgYWN0aXZhdGVWaWV3KGlkOiBzdHJpbmcsIG9wdGlvbnM/OiB7YWN0aXZhdGVQYXJ0PzogYm9vbGVhbn0pOiDJtVdvcmtiZW5jaExheW91dCB7XG4gICAgY29uc3Qgd29ya2luZ0NvcHkgPSB0aGlzLndvcmtpbmdDb3B5KCk7XG4gICAgd29ya2luZ0NvcHkudmlld3Moe2lkfSwge29yRWxzZTogJ3Rocm93RXJyb3InfSkuZm9yRWFjaCh2aWV3ID0+IHdvcmtpbmdDb3B5Ll9fYWN0aXZhdGVWaWV3KHZpZXcsIG9wdGlvbnMpKTtcbiAgICByZXR1cm4gd29ya2luZ0NvcHk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGVzIHRoZSBwcmVjZWRpbmcgdmlldyBpZiBpdCBleGlzdHMsIG9yIHRoZSBzdWJzZXF1ZW50IHZpZXcgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHZpZXcgdG8gYWN0aXZhdGUgaXRzIGFkamFjZW50IHZpZXcuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29udHJvbHMgdmlldyBhY3RpdmF0aW9uLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5hY3RpdmF0ZVBhcnQgLSBDb250cm9scyBpZiB0byBhY3RpdmF0ZSB0aGUgcGFydC4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIGxheW91dCB3aXRoIHRoZSBhZGphY2VudCB2aWV3IGFjdGl2YXRlZC5cbiAgICovXG4gIHB1YmxpYyBhY3RpdmF0ZUFkamFjZW50VmlldyhpZDogc3RyaW5nLCBvcHRpb25zPzoge2FjdGl2YXRlUGFydD86IGJvb2xlYW59KTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5LnZpZXdzKHtpZH0sIHtvckVsc2U6ICd0aHJvd0Vycm9yJ30pLmZvckVhY2godmlldyA9PiB3b3JraW5nQ29weS5fX2FjdGl2YXRlQWRqYWNlbnRWaWV3KHZpZXcsIG9wdGlvbnMpKTtcbiAgICByZXR1cm4gd29ya2luZ0NvcHk7XG4gIH1cblxuICAvKipcbiAgICogUmVuYW1lcyBhIHZpZXcuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgdmlldyB3aGljaCB0byByZW5hbWUuXG4gICAqIEBwYXJhbSBuZXdWaWV3SWQgLSBUaGUgbmV3IGlkZW50aXR5IG9mIHRoZSB2aWV3LlxuICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIGxheW91dCB3aXRoIHRoZSB2aWV3IHJlbmFtZWQuXG4gICAqL1xuICBwdWJsaWMgcmVuYW1lVmlldyhpZDogVmlld0lkLCBuZXdWaWV3SWQ6IFZpZXdJZCk6IMm1V29ya2JlbmNoTGF5b3V0IHtcbiAgICBjb25zdCB3b3JraW5nQ29weSA9IHRoaXMud29ya2luZ0NvcHkoKTtcbiAgICB3b3JraW5nQ29weS5fX3JlbmFtZVZpZXcod29ya2luZ0NvcHkudmlldyh7dmlld0lkOiBpZH0pLCBuZXdWaWV3SWQpO1xuICAgIHJldHVybiB3b3JraW5nQ29weTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzcGxpdCByYXRpbyBmb3IgdGhlIHR3byBjaGlsZHJlbiBvZiBhIHtAbGluayBNVHJlZU5vZGV9LlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZUlkIC0gVGhlIGlkIG9mIHRoZSBub2RlIHRvIHNldCB0aGUgc3BsaXQgcmF0aW8gZm9yLlxuICAgKiBAcGFyYW0gcmF0aW8gLSBUaGUgcHJvcG9ydGlvbmFsIHNpemUgYmV0d2VlbiB0aGUgdHdvIGNoaWxkcmVuLCBleHByZXNzZWQgYXMgY2xvc2VkIGludGVydmFsIFswLDFdLlxuICAgKiAgICAgICAgICAgICAgICBFeGFtcGxlOiBUbyBnaXZlIDEvMyBvZiB0aGUgc3BhY2UgdG8gdGhlIGZpcnN0IGNoaWxkLCBzZXQgdGhlIHJhdGlvIHRvIGAwLjNgLlxuICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIGxheW91dCB3aXRoIHRoZSBzcGxpdCByYXRpbyBzZXQuXG4gICAqL1xuICBwdWJsaWMgc2V0U3BsaXRSYXRpbyhub2RlSWQ6IHN0cmluZywgcmF0aW86IG51bWJlcik6IMm1V29ya2JlbmNoTGF5b3V0IHtcbiAgICBjb25zdCB3b3JraW5nQ29weSA9IHRoaXMud29ya2luZ0NvcHkoKTtcbiAgICB3b3JraW5nQ29weS5fX3NldFNwbGl0UmF0aW8obm9kZUlkLCByYXRpbyk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgdGhpcyBsYXlvdXQgaW50byBhIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6ZWRXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IGlzTWFpbkFyZWFFbXB0eSA9ICh0aGlzLm1haW5BcmVhR3JpZD8ucm9vdCBpbnN0YW5jZW9mIE1QYXJ0ICYmIHRoaXMubWFpbkFyZWFHcmlkLnJvb3Qudmlld3MubGVuZ3RoID09PSAwKSA/PyB0cnVlO1xuICAgIHJldHVybiB7XG4gICAgICB3b3JrYmVuY2hHcmlkOiB0aGlzLl9zZXJpYWxpemVyLnNlcmlhbGl6ZUdyaWQodGhpcy53b3JrYmVuY2hHcmlkKSxcbiAgICAgIG1haW5BcmVhR3JpZDogaXNNYWluQXJlYUVtcHR5ID8gbnVsbCA6IHRoaXMuX3NlcmlhbGl6ZXIuc2VyaWFsaXplR3JpZCh0aGlzLl9ncmlkcy5tYWluQXJlYSksXG4gICAgICB3b3JrYmVuY2hWaWV3T3V0bGV0czogdGhpcy5fc2VyaWFsaXplci5zZXJpYWxpemVWaWV3T3V0bGV0cyh0aGlzLnZpZXdPdXRsZXRzKHtncmlkOiAnd29ya2JlbmNoJ30pKSxcbiAgICAgIG1haW5BcmVhVmlld091dGxldHM6IHRoaXMuX3NlcmlhbGl6ZXIuc2VyaWFsaXplVmlld091dGxldHModGhpcy52aWV3T3V0bGV0cyh7Z3JpZDogJ21haW5BcmVhJ30pKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBuZXh0IGF2YWlsYWJsZSB2aWV3IGlkLlxuICAgKi9cbiAgcHVibGljIGNvbXB1dGVOZXh0Vmlld0lkKCk6IFZpZXdJZCB7XG4gICAgcmV0dXJuIFdvcmtiZW5jaExheW91dHMuY29tcHV0ZU5leHRWaWV3SWQodGhpcy52aWV3cygpLm1hcCh2aWV3ID0+IHZpZXcuaWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoIHVuZGVyc2NvcmVzLCBpbmRpY2F0aW5nIHRoYXQgaXQgZG9lcyBub3Qgb3BlcmF0ZSBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmaWVzIHRoaXMgbGF5b3V0IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIF9fYWRkUGFydChpZDogc3RyaW5nLCByZWxhdGl2ZVRvOiBSZWZlcmVuY2VFbGVtZW50LCBvcHRpb25zPzoge2FjdGl2YXRlPzogYm9vbGVhbjsgc3RydWN0dXJhbD86IGJvb2xlYW59KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzUGFydChpZCkpIHtcbiAgICAgIHRocm93IEVycm9yKGBbUGFydEFkZEVycm9yXSBQYXJ0IGlkIG11c3QgYmUgdW5pcXVlLiBUaGUgbGF5b3V0IGFscmVhZHkgY29udGFpbnMgYSBwYXJ0IHdpdGggdGhlIGlkICcke2lkfScuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UGFydCA9IG5ldyBNUGFydCh7aWQsIHN0cnVjdHVyYWw6IG9wdGlvbnM/LnN0cnVjdHVyYWwgPz8gdHJ1ZSwgdmlld3M6IFtdfSk7XG5cbiAgICAvLyBGaW5kIHRoZSByZWZlcmVuY2UgZWxlbWVudCwgaWYgc3BlY2lmaWVkLCBvciB1c2UgdGhlIGxheW91dCByb290IGFzIHJlZmVyZW5jZSBvdGhlcndpc2UuXG4gICAgY29uc3QgcmVmZXJlbmNlRWxlbWVudCA9IHJlbGF0aXZlVG8ucmVsYXRpdmVUbyA/IHRoaXMuZmluZFRyZWVFbGVtZW50KHtpZDogcmVsYXRpdmVUby5yZWxhdGl2ZVRvfSkgOiB0aGlzLndvcmtiZW5jaEdyaWQucm9vdDtcbiAgICBjb25zdCBhZGRCZWZvcmUgPSByZWxhdGl2ZVRvLmFsaWduID09PSAnbGVmdCcgfHwgcmVsYXRpdmVUby5hbGlnbiA9PT0gJ3RvcCc7XG4gICAgY29uc3QgcmF0aW8gPSByZWxhdGl2ZVRvLnJhdGlvID8/IC41O1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHRyZWUgbm9kZS5cbiAgICBjb25zdCBuZXdUcmVlTm9kZTogTVRyZWVOb2RlID0gbmV3IE1UcmVlTm9kZSh7XG4gICAgICBub2RlSWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgIGNoaWxkMTogYWRkQmVmb3JlID8gbmV3UGFydCA6IHJlZmVyZW5jZUVsZW1lbnQsXG4gICAgICBjaGlsZDI6IGFkZEJlZm9yZSA/IHJlZmVyZW5jZUVsZW1lbnQgOiBuZXdQYXJ0LFxuICAgICAgZGlyZWN0aW9uOiByZWxhdGl2ZVRvLmFsaWduID09PSAnbGVmdCcgfHwgcmVsYXRpdmVUby5hbGlnbiA9PT0gJ3JpZ2h0JyA/ICdyb3cnIDogJ2NvbHVtbicsXG4gICAgICByYXRpbzogYWRkQmVmb3JlID8gcmF0aW8gOiAxIC0gcmF0aW8sXG4gICAgICBwYXJlbnQ6IHJlZmVyZW5jZUVsZW1lbnQucGFyZW50LFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIHRoZSB0cmVlIG5vZGUgdG8gdGhlIGxheW91dC5cbiAgICBpZiAoIXJlZmVyZW5jZUVsZW1lbnQucGFyZW50KSB7XG4gICAgICB0aGlzLmdyaWQoe2VsZW1lbnQ6IHJlZmVyZW5jZUVsZW1lbnR9KS5yb290ID0gbmV3VHJlZU5vZGU7IC8vIHRvcC1sZXZlbCBub2RlXG4gICAgfVxuICAgIGVsc2UgaWYgKHJlZmVyZW5jZUVsZW1lbnQucGFyZW50LmNoaWxkMSA9PT0gcmVmZXJlbmNlRWxlbWVudCkge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudC5wYXJlbnQuY2hpbGQxID0gbmV3VHJlZU5vZGU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudC5wYXJlbnQuY2hpbGQyID0gbmV3VHJlZU5vZGU7XG4gICAgfVxuICAgIHJlZmVyZW5jZUVsZW1lbnQucGFyZW50ID0gbmV3VHJlZU5vZGU7XG4gICAgbmV3UGFydC5wYXJlbnQgPSBuZXdUcmVlTm9kZTtcblxuICAgIC8vIEFjdGl2YXRlIHRoZSBwYXJ0LlxuICAgIGlmIChvcHRpb25zPy5hY3RpdmF0ZSkge1xuICAgICAgdGhpcy5fX2FjdGl2YXRlUGFydChuZXdQYXJ0LmlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90ZTogVGhpcyBtZXRob2QgbmFtZSBiZWdpbnMgd2l0aCB1bmRlcnNjb3JlcywgaW5kaWNhdGluZyB0aGF0IGl0IGRvZXMgbm90IG9wZXJhdGUgb24gYSB3b3JraW5nIGNvcHksIGJ1dCBtb2RpZmllcyB0aGlzIGxheW91dCBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBfX3JlbW92ZVBhcnQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnQgPSB0aGlzLnBhcnQoe3BhcnRJZDogaWR9KTtcbiAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkKHtlbGVtZW50OiBwYXJ0fSk7XG4gICAgY29uc3QgZ3JpZE5hbWUgPSB0aGlzLl9ncmlkTmFtZXMuZmluZChncmlkTmFtZSA9PiB0aGlzLl9ncmlkc1tncmlkTmFtZV0gPT09IGdyaWQpO1xuXG4gICAgLy8gVGhlIGxhc3QgcGFydCBpcyBuZXZlciByZW1vdmVkLlxuICAgIGNvbnN0IHBhcnRzID0gdGhpcy5wYXJ0cyh7Z3JpZDogZ3JpZE5hbWV9KTtcbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSBwYXJ0LlxuICAgIGNvbnN0IHNpYmxpbmdFbGVtZW50ID0gKHBhcnQucGFyZW50IS5jaGlsZDEgPT09IHBhcnQgPyBwYXJ0LnBhcmVudCEuY2hpbGQyIDogcGFydC5wYXJlbnQhLmNoaWxkMSk7XG4gICAgaWYgKCFwYXJ0LnBhcmVudCEucGFyZW50KSB7XG4gICAgICBncmlkLnJvb3QgPSBzaWJsaW5nRWxlbWVudDtcbiAgICAgIGdyaWQucm9vdC5wYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKHBhcnQucGFyZW50IS5wYXJlbnQuY2hpbGQxID09PSBwYXJ0LnBhcmVudCkge1xuICAgICAgcGFydC5wYXJlbnQhLnBhcmVudC5jaGlsZDEgPSBzaWJsaW5nRWxlbWVudDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBwYXJ0LnBhcmVudCEucGFyZW50LmNoaWxkMiA9IHNpYmxpbmdFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBvdXRsZXRzIGFuZCBzdGF0ZXMgb2Ygdmlld3MgY29udGFpbmVkIGluIHRoZSBwYXJ0LlxuICAgIHBhcnQudmlld3MuZm9yRWFjaCh2aWV3ID0+IHtcbiAgICAgIHRoaXMuX3ZpZXdPdXRsZXRzLmRlbGV0ZSh2aWV3LmlkKTtcbiAgICAgIHRoaXMuX3ZpZXdTdGF0ZXMuZGVsZXRlKHZpZXcuaWQpO1xuICAgIH0pO1xuXG4gICAgLy8gSWYgdGhlIHJlbW92ZWQgcGFydCB3YXMgdGhlIGFjdGl2ZSBwYXJ0LCBtYWtlIHRoZSBsYXN0IHVzZWQgcGFydCB0aGUgYWN0aXZlIHBhcnQuXG4gICAgaWYgKGdyaWQuYWN0aXZlUGFydElkID09PSBpZCkge1xuICAgICAgY29uc3QgYWN0aXZlUGFydCA9IHBhcnRzXG4gICAgICAgIC5maWx0ZXIocGFydCA9PiBwYXJ0LmlkICE9PSBpZClcbiAgICAgICAgLnNvcnQoKHBhcnQxLCBwYXJ0MikgPT4ge1xuICAgICAgICAgIGNvbnN0IGFjdGl2YXRpb25JbnN0YW50UGFydDEgPSB0aGlzLl9wYXJ0QWN0aXZhdGlvbkluc3RhbnRQcm92aWRlci5nZXRBY3RpdmF0aW9uSW5zdGFudChwYXJ0MS5pZCk7XG4gICAgICAgICAgY29uc3QgYWN0aXZhdGlvbkluc3RhbnRQYXJ0MiA9IHRoaXMuX3BhcnRBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyLmdldEFjdGl2YXRpb25JbnN0YW50KHBhcnQyLmlkKTtcbiAgICAgICAgICByZXR1cm4gYWN0aXZhdGlvbkluc3RhbnRQYXJ0MiAtIGFjdGl2YXRpb25JbnN0YW50UGFydDE7XG4gICAgICAgIH0pWzBdO1xuICAgICAgZ3JpZC5hY3RpdmVQYXJ0SWQgPSBhY3RpdmVQYXJ0IS5pZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90ZTogVGhpcyBtZXRob2QgbmFtZSBiZWdpbnMgd2l0aCB1bmRlcnNjb3JlcywgaW5kaWNhdGluZyB0aGF0IGl0IGRvZXMgbm90IG9wZXJhdGUgb24gYSB3b3JraW5nIGNvcHksIGJ1dCBtb2RpZmllcyB0aGlzIGxheW91dCBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBfX2FkZFZpZXcodmlldzogTVZpZXcsIG9wdGlvbnM6IHtwYXJ0SWQ6IHN0cmluZzsgcG9zaXRpb24/OiBudW1iZXIgfCAnc3RhcnQnIHwgJ2VuZCcgfCAnYmVmb3JlLWFjdGl2ZS12aWV3JyB8ICdhZnRlci1hY3RpdmUtdmlldyc7IGFjdGl2YXRlVmlldz86IGJvb2xlYW47IGFjdGl2YXRlUGFydD86IGJvb2xlYW47IGNzc0NsYXNzPzogc3RyaW5nIHwgc3RyaW5nW119KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzVmlldyh2aWV3LmlkKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYFtWaWV3QWRkRXJyb3JdIFZpZXcgaWQgbXVzdCBiZSB1bmlxdWUuIFRoZSBsYXlvdXQgYWxyZWFkeSBjb250YWlucyBhIHZpZXcgd2l0aCB0aGUgaWQgJyR7dmlldy5pZH0nLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnQgPSB0aGlzLnBhcnQoe3BhcnRJZDogb3B0aW9ucy5wYXJ0SWR9KTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IGNvZXJjZVBvc2l0aW9uKG9wdGlvbnMucG9zaXRpb24gPz8gJ2VuZCcsIHBhcnQpO1xuICAgIHBhcnQudmlld3Muc3BsaWNlKHBvc2l0aW9uLCAwLCB2aWV3KTtcblxuICAgIGlmIChvcHRpb25zLmFjdGl2YXRlVmlldykge1xuICAgICAgdGhpcy5fX2FjdGl2YXRlVmlldyh2aWV3KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYWN0aXZhdGVQYXJ0KSB7XG4gICAgICB0aGlzLl9fYWN0aXZhdGVQYXJ0KG9wdGlvbnMucGFydElkKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuY3NzQ2xhc3MpIHtcbiAgICAgIHZpZXcuY3NzQ2xhc3MgPSBBcnJheXMuY29lcmNlKG9wdGlvbnMuY3NzQ2xhc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoIHVuZGVyc2NvcmVzLCBpbmRpY2F0aW5nIHRoYXQgaXQgZG9lcyBub3Qgb3BlcmF0ZSBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmaWVzIHRoaXMgbGF5b3V0IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIF9fbmF2aWdhdGVWaWV3KHZpZXc6IE1WaWV3LCBjb21tYW5kczogQ29tbWFuZHMsIGV4dHJhcz86IHtoaW50Pzogc3RyaW5nOyByZWxhdGl2ZVRvPzogQWN0aXZhdGVkUm91dGUgfCBudWxsOyBzdGF0ZT86IFZpZXdTdGF0ZTsgY3NzQ2xhc3M/OiBzdHJpbmcgfCBzdHJpbmdbXX0pOiB2b2lkIHtcbiAgICBpZiAoIWNvbW1hbmRzLmxlbmd0aCAmJiAhZXh0cmFzPy5oaW50ICYmICFleHRyYXM/LnJlbGF0aXZlVG8pIHtcbiAgICAgIHRocm93IEVycm9yKCdbTmF2aWdhdGVFcnJvcl0gQ29tbWFuZHMsIHJlbGF0aXZlVG8gb3IgaGludCBtdXN0IGJlIHNldC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmxTZWdtZW50cyA9IHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLl9pbmplY3RvciwgKCkgPT4gUm91dGVyVXRpbHMuY29tbWFuZHNUb1NlZ21lbnRzKGNvbW1hbmRzLCB7cmVsYXRpdmVUbzogZXh0cmFzPy5yZWxhdGl2ZVRvfSkpO1xuICAgIGlmICh1cmxTZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3ZpZXdPdXRsZXRzLnNldCh2aWV3LmlkLCB1cmxTZWdtZW50cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5fdmlld091dGxldHMuZGVsZXRlKHZpZXcuaWQpO1xuICAgIH1cblxuICAgIGlmIChleHRyYXM/LnN0YXRlICYmIE9iamVjdHMua2V5cyhleHRyYXMuc3RhdGUpLmxlbmd0aCkge1xuICAgICAgdGhpcy5fdmlld1N0YXRlcy5zZXQodmlldy5pZCwgZXh0cmFzLnN0YXRlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl92aWV3U3RhdGVzLmRlbGV0ZSh2aWV3LmlkKTtcbiAgICB9XG5cbiAgICB2aWV3Lm5hdmlnYXRpb24gPSBPYmplY3RzLndpdGhvdXRVbmRlZmluZWRFbnRyaWVzKHtcbiAgICAgIGhpbnQ6IGV4dHJhcz8uaGludCxcbiAgICAgIGNzc0NsYXNzOiBleHRyYXM/LmNzc0NsYXNzID8gQXJyYXlzLmNvZXJjZShleHRyYXMuY3NzQ2xhc3MpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIG5hbWUgYmVnaW5zIHdpdGggdW5kZXJzY29yZXMsIGluZGljYXRpbmcgdGhhdCBpdCBkb2VzIG5vdCBvcGVyYXRlIG9uIGEgd29ya2luZyBjb3B5LCBidXQgbW9kaWZpZXMgdGhpcyBsYXlvdXQgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgX19tb3ZlVmlldyh2aWV3OiBNVmlldywgdGFyZ2V0UGFydElkOiBzdHJpbmcsIG9wdGlvbnM/OiB7cG9zaXRpb24/OiBudW1iZXIgfCAnc3RhcnQnIHwgJ2VuZCcgfCAnYmVmb3JlLWFjdGl2ZS12aWV3JyB8ICdhZnRlci1hY3RpdmUtdmlldyc7IGFjdGl2YXRlVmlldz86IGJvb2xlYW47IGFjdGl2YXRlUGFydD86IGJvb2xlYW59KTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlUGFydCA9IHRoaXMucGFydCh7dmlld0lkOiB2aWV3LmlkfSk7XG4gICAgY29uc3QgdGFyZ2V0UGFydCA9IHRoaXMucGFydCh7cGFydElkOiB0YXJnZXRQYXJ0SWR9KTtcblxuICAgIC8vIE1vdmUgdGhlIHZpZXcuXG4gICAgaWYgKHNvdXJjZVBhcnQgIT09IHRhcmdldFBhcnQpIHtcbiAgICAgIHRoaXMuX19yZW1vdmVWaWV3KHZpZXcsIHtyZW1vdmVPdXRsZXQ6IGZhbHNlLCByZW1vdmVTdGF0ZTogZmFsc2UsIGZvcmNlOiB0cnVlfSk7XG4gICAgICB0aGlzLl9fYWRkVmlldyh2aWV3LCB7cGFydElkOiB0YXJnZXRQYXJ0SWQsIHBvc2l0aW9uOiBvcHRpb25zPy5wb3NpdGlvbn0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zPy5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGNvZXJjZVBvc2l0aW9uKG9wdGlvbnMucG9zaXRpb24sIHRhcmdldFBhcnQpO1xuICAgICAgY29uc3QgcmVmZXJlbmNlVmlldzogTVZpZXcgfCB1bmRlZmluZWQgPSBzb3VyY2VQYXJ0LnZpZXdzLmF0KHBvc2l0aW9uKTtcbiAgICAgIHNvdXJjZVBhcnQudmlld3Muc3BsaWNlKHNvdXJjZVBhcnQudmlld3MuaW5kZXhPZih2aWV3KSwgMSk7XG4gICAgICBzb3VyY2VQYXJ0LnZpZXdzLnNwbGljZShyZWZlcmVuY2VWaWV3ID8gc291cmNlUGFydC52aWV3cy5pbmRleE9mKHJlZmVyZW5jZVZpZXcpIDogc291cmNlUGFydC52aWV3cy5sZW5ndGgsIDAsIHZpZXcpO1xuICAgIH1cblxuICAgIC8vIEFjdGl2YXRlIHZpZXcgYW5kIHBhcnQuXG4gICAgaWYgKG9wdGlvbnM/LmFjdGl2YXRlUGFydCkge1xuICAgICAgdGhpcy5fX2FjdGl2YXRlUGFydCh0YXJnZXRQYXJ0SWQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8uYWN0aXZhdGVWaWV3KSB7XG4gICAgICB0aGlzLl9fYWN0aXZhdGVWaWV3KHZpZXcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoIHVuZGVyc2NvcmVzLCBpbmRpY2F0aW5nIHRoYXQgaXQgZG9lcyBub3Qgb3BlcmF0ZSBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmaWVzIHRoaXMgbGF5b3V0IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIF9fcmVtb3ZlVmlldyh2aWV3OiBNVmlldywgb3B0aW9ucz86IHtyZW1vdmVPdXRsZXQ/OiBmYWxzZTsgcmVtb3ZlU3RhdGU/OiBmYWxzZTsgZm9yY2U/OiBib29sZWFufSk6IHZvaWQge1xuICAgIGlmICghb3B0aW9ucz8uZm9yY2UpIHtcbiAgICAgIHZpZXcubWFya2VkRm9yUmVtb3ZhbCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFydCA9IHRoaXMucGFydCh7dmlld0lkOiB2aWV3LmlkfSk7XG5cbiAgICAvLyBSZW1vdmUgdmlldy5cbiAgICBwYXJ0LnZpZXdzLnNwbGljZShwYXJ0LnZpZXdzLmluZGV4T2YodmlldyksIDEpO1xuXG4gICAgLy8gUmVtb3ZlIG91dGxldC5cbiAgICBpZiAob3B0aW9ucz8ucmVtb3ZlT3V0bGV0ID8/IHRydWUpIHtcbiAgICAgIHRoaXMuX3ZpZXdPdXRsZXRzLmRlbGV0ZSh2aWV3LmlkKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgc3RhdGUuXG4gICAgaWYgKG9wdGlvbnM/LnJlbW92ZVN0YXRlID8/IHRydWUpIHtcbiAgICAgIHRoaXMuX3ZpZXdTdGF0ZXMuZGVsZXRlKHZpZXcuaWQpO1xuICAgIH1cblxuICAgIC8vIEFjdGl2YXRlIHRoZSBsYXN0IHVzZWQgdmlldyBpZiB0aGlzIHZpZXcgd2FzIGFjdGl2ZS5cbiAgICBpZiAocGFydC5hY3RpdmVWaWV3SWQgPT09IHZpZXcuaWQpIHtcbiAgICAgIHBhcnQuYWN0aXZlVmlld0lkID0gcGFydC52aWV3c1xuICAgICAgICAubWFwKHZpZXcgPT4gdmlldy5pZClcbiAgICAgICAgLnNvcnQoKHZpZXdJZDEsIHZpZXdJZDIpID0+IHtcbiAgICAgICAgICBjb25zdCBhY3RpdmF0aW9uSW5zdGFudFZpZXcxID0gdGhpcy5fdmlld0FjdGl2YXRpb25JbnN0YW50UHJvdmlkZXIuZ2V0QWN0aXZhdGlvbkluc3RhbnQodmlld0lkMSk7XG4gICAgICAgICAgY29uc3QgYWN0aXZhdGlvbkluc3RhbnRWaWV3MiA9IHRoaXMuX3ZpZXdBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyLmdldEFjdGl2YXRpb25JbnN0YW50KHZpZXdJZDIpO1xuICAgICAgICAgIHJldHVybiBhY3RpdmF0aW9uSW5zdGFudFZpZXcyIC0gYWN0aXZhdGlvbkluc3RhbnRWaWV3MTtcbiAgICAgICAgfSkuYXQoMCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSBwYXJ0IGlmIHRoaXMgaXMgdGhlIGxhc3QgdmlldyBvZiB0aGUgcGFydCBhbmQgbm90IGEgc3RydWN0dXJhbCBwYXJ0LlxuICAgIGlmIChwYXJ0LnZpZXdzLmxlbmd0aCA9PT0gMCAmJiAhcGFydC5zdHJ1Y3R1cmFsKSB7XG4gICAgICB0aGlzLl9fcmVtb3ZlUGFydChwYXJ0LmlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90ZTogVGhpcyBtZXRob2QgbmFtZSBiZWdpbnMgd2l0aCB1bmRlcnNjb3JlcywgaW5kaWNhdGluZyB0aGF0IGl0IGRvZXMgbm90IG9wZXJhdGUgb24gYSB3b3JraW5nIGNvcHksIGJ1dCBtb2RpZmllcyB0aGlzIGxheW91dCBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBfX2FjdGl2YXRlVmlldyh2aWV3OiBNVmlldywgb3B0aW9ucz86IHthY3RpdmF0ZVBhcnQ/OiBib29sZWFufSk6IHZvaWQge1xuICAgIC8vIEFjdGl2YXRlIHRoZSB2aWV3LlxuICAgIGNvbnN0IHBhcnQgPSB0aGlzLnBhcnQoe3ZpZXdJZDogdmlldy5pZH0pO1xuICAgIHBhcnQuYWN0aXZlVmlld0lkID0gdmlldy5pZDtcblxuICAgIC8vIEFjdGl2YXRlIHRoZSBwYXJ0LlxuICAgIGlmIChvcHRpb25zPy5hY3RpdmF0ZVBhcnQpIHtcbiAgICAgIHRoaXMuX19hY3RpdmF0ZVBhcnQocGFydC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIG5hbWUgYmVnaW5zIHdpdGggdW5kZXJzY29yZXMsIGluZGljYXRpbmcgdGhhdCBpdCBkb2VzIG5vdCBvcGVyYXRlIG9uIGEgd29ya2luZyBjb3B5LCBidXQgbW9kaWZpZXMgdGhpcyBsYXlvdXQgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgX19hY3RpdmF0ZUFkamFjZW50Vmlldyh2aWV3OiBNVmlldywgb3B0aW9ucz86IHthY3RpdmF0ZVBhcnQ/OiBib29sZWFufSk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnQgPSB0aGlzLnBhcnQoe3ZpZXdJZDogdmlldy5pZH0pO1xuICAgIGNvbnN0IHZpZXdJbmRleCA9IHBhcnQudmlld3MuaW5kZXhPZih2aWV3KTtcbiAgICBwYXJ0LmFjdGl2ZVZpZXdJZCA9IChwYXJ0LnZpZXdzW3ZpZXdJbmRleCAtIDFdIHx8IHBhcnQudmlld3Nbdmlld0luZGV4ICsgMV0pPy5pZDsgLy8gaXMgYHVuZGVmaW5lZGAgaWYgaXQgaXMgdGhlIGxhc3QgdmlldyBvZiB0aGUgcGFydFxuXG4gICAgLy8gQWN0aXZhdGUgdGhlIHBhcnQuXG4gICAgaWYgKG9wdGlvbnM/LmFjdGl2YXRlUGFydCkge1xuICAgICAgdGhpcy5fX2FjdGl2YXRlUGFydChwYXJ0LmlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90ZTogVGhpcyBtZXRob2QgbmFtZSBiZWdpbnMgd2l0aCB1bmRlcnNjb3JlcywgaW5kaWNhdGluZyB0aGF0IGl0IGRvZXMgbm90IG9wZXJhdGUgb24gYSB3b3JraW5nIGNvcHksIGJ1dCBtb2RpZmllcyB0aGlzIGxheW91dCBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBfX3NldFNwbGl0UmF0aW8obm9kZUlkOiBzdHJpbmcsIHJhdGlvOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAocmF0aW8gPCAwIHx8IHJhdGlvID4gMSkge1xuICAgICAgdGhyb3cgRXJyb3IoYFtMYXlvdXRNb2RpZnlFcnJvcl0gUmF0aW8gZm9yIG5vZGUgJyR7bm9kZUlkfScgbXVzdCBiZSBpbiB0aGUgY2xvc2VkIGludGVydmFsIFswLDFdLCBidXQgd2FzICcke3JhdGlvfScuYCk7XG4gICAgfVxuICAgIHRoaXMuZmluZFRyZWVFbGVtZW50PE1UcmVlTm9kZT4oe2lkOiBub2RlSWR9KS5yYXRpbyA9IHJhdGlvO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIG5hbWUgYmVnaW5zIHdpdGggdW5kZXJzY29yZXMsIGluZGljYXRpbmcgdGhhdCBpdCBkb2VzIG5vdCBvcGVyYXRlIG9uIGEgd29ya2luZyBjb3B5LCBidXQgbW9kaWZpZXMgdGhpcyBsYXlvdXQgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgX19hY3RpdmF0ZVBhcnQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnQgPSB0aGlzLnBhcnQoe3BhcnRJZDogaWR9KTtcbiAgICB0aGlzLmdyaWQoe2VsZW1lbnQ6IHBhcnR9KS5hY3RpdmVQYXJ0SWQgPSBpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoIHVuZGVyc2NvcmVzLCBpbmRpY2F0aW5nIHRoYXQgaXQgZG9lcyBub3Qgb3BlcmF0ZSBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmaWVzIHRoaXMgbGF5b3V0IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIF9fdG9nZ2xlTWF4aW1pemVkKCk6IHZvaWQge1xuICAgIHRoaXMuX21heGltaXplZCA9ICF0aGlzLl9tYXhpbWl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogTm90ZTogVGhpcyBtZXRob2QgbmFtZSBiZWdpbnMgd2l0aCB1bmRlcnNjb3JlcywgaW5kaWNhdGluZyB0aGF0IGl0IGRvZXMgbm90IG9wZXJhdGUgb24gYSB3b3JraW5nIGNvcHksIGJ1dCBtb2RpZmllcyB0aGlzIGxheW91dCBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBfX3JlbmFtZVZpZXcodmlldzogTVZpZXcsIG5ld1ZpZXdJZDogVmlld0lkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzVmlldyhuZXdWaWV3SWQpKSB7XG4gICAgICB0aHJvdyBFcnJvcihgW1ZpZXdSZW5hbWVFcnJvcl0gVmlldyBpZCBtdXN0IGJlIHVuaXF1ZS4gVGhlIGxheW91dCBhbHJlYWR5IGNvbnRhaW5zIGEgdmlldyB3aXRoIHRoZSBpZCAnJHtuZXdWaWV3SWR9Jy5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0ID0gdGhpcy5wYXJ0KHt2aWV3SWQ6IHZpZXcuaWR9KTtcblxuICAgIGlmICh0aGlzLl92aWV3T3V0bGV0cy5oYXModmlldy5pZCkpIHtcbiAgICAgIHRoaXMuX3ZpZXdPdXRsZXRzLnNldChuZXdWaWV3SWQsIHRoaXMuX3ZpZXdPdXRsZXRzLmdldCh2aWV3LmlkKSEpO1xuICAgICAgdGhpcy5fdmlld091dGxldHMuZGVsZXRlKHZpZXcuaWQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdmlld1N0YXRlcy5oYXModmlldy5pZCkpIHtcbiAgICAgIHRoaXMuX3ZpZXdTdGF0ZXMuc2V0KG5ld1ZpZXdJZCwgdGhpcy5fdmlld1N0YXRlcy5nZXQodmlldy5pZCkhKTtcbiAgICAgIHRoaXMuX3ZpZXdTdGF0ZXMuZGVsZXRlKHZpZXcuaWQpO1xuICAgIH1cblxuICAgIGlmIChwYXJ0LmFjdGl2ZVZpZXdJZCA9PT0gdmlldy5pZCkge1xuICAgICAgcGFydC5hY3RpdmVWaWV3SWQgPSBuZXdWaWV3SWQ7XG4gICAgfVxuXG4gICAgdmlldy5pZCA9IG5ld1ZpZXdJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIGdyaWQgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBmaWx0ZXIuIElmIG5vdCBmb3VuZCwgdGhyb3dzIGFuIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gZmluZEJ5IC0gRGVmaW5lcyB0aGUgc2VhcmNoIHNjb3BlLlxuICAgKiBAcGFyYW0gZmluZEJ5LmVsZW1lbnQgLSBTZWFyY2hlcyBmb3IgYSBncmlkIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgKiBAcmV0dXJuIEdyaWQgbWF0Y2hpbmcgdGhlIGZpbHRlciBjcml0ZXJpYS5cbiAgICovXG4gIHByaXZhdGUgZ3JpZChmaW5kQnk6IHtlbGVtZW50OiBNUGFydCB8IE1UcmVlTm9kZX0pOiBNUGFydEdyaWQge1xuICAgIGNvbnN0IGdyaWROYW1lID0gdGhpcy5fZ3JpZE5hbWVzLmZpbmQoZ3JpZE5hbWUgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZFRyZWVFbGVtZW50cygoZWxlbWVudDogTVRyZWVOb2RlIHwgTVBhcnQpOiBlbGVtZW50IGlzIE1QYXJ0IHwgTVRyZWVOb2RlID0+IGVsZW1lbnQgPT09IGZpbmRCeS5lbGVtZW50LCB7ZmluZEZpcnN0OiB0cnVlLCBncmlkOiBncmlkTmFtZX0pLmxlbmd0aCA+IDA7XG4gICAgfSk7XG5cbiAgICBpZiAoIWdyaWROYW1lKSB7XG4gICAgICBpZiAoZmluZEJ5LmVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkge1xuICAgICAgICB0aHJvdyBFcnJvcihgW051bGxHcmlkRXJyb3JdIE5vIGdyaWQgZm91bmQgdGhhdCBjb250YWlucyB0aGUgcGFydCAnJHtmaW5kQnkuZWxlbWVudC5pZH0nXCIuYCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYFtOdWxsR3JpZEVycm9yXSBObyBncmlkIGZvdW5kIHRoYXQgY29udGFpbnMgdGhlIG5vZGUgJyR7ZmluZEJ5LmVsZW1lbnQubm9kZUlkfSdcIi5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZHNbZ3JpZE5hbWVdITtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZXMgdGhlIHRyZWUgdG8gZmluZCBhbiBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gZmluZEJ5IC0gRGVmaW5lcyB0aGUgc2VhcmNoIHNjb3BlLlxuICAgKiBAcGFyYW0gZmluZEJ5LmlkIC0gU2VhcmNoZXMgZm9yIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLlxuICAgKiBAcmV0dXJuIEVsZW1lbnQgbWF0Y2hpbmcgdGhlIGZpbHRlciBjcml0ZXJpYS5cbiAgICovXG4gIHByaXZhdGUgZmluZFRyZWVFbGVtZW50PFQgZXh0ZW5kcyBNVHJlZU5vZGUgfCBNUGFydD4oZmluZEJ5OiB7aWQ6IHN0cmluZ30pOiBUIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5maW5kVHJlZUVsZW1lbnRzKChlbGVtZW50OiBNVHJlZU5vZGUgfCBNUGFydCk6IGVsZW1lbnQgaXMgVCA9PiB7XG4gICAgICByZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0ID8gZWxlbWVudC5pZCA9PT0gZmluZEJ5LmlkIDogZWxlbWVudC5ub2RlSWQgPT09IGZpbmRCeS5pZDtcbiAgICB9LCB7ZmluZEZpcnN0OiB0cnVlfSkuYXQoMCk7XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHRocm93IEVycm9yKGBbTnVsbEVsZW1lbnRFcnJvcl0gTm8gZWxlbWVudCBmb3VuZCB3aXRoIGlkICcke2ZpbmRCeS5pZH0nLmApO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZXMgdGhlIHRyZWUgdG8gZmluZCBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBwcmVkaWNhdGVGbiAtIFByZWRpY2F0ZSBmdW5jdGlvbiB0byBtYXRjaC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBEZWZpbmVzIHNlYXJjaCBzY29wZSBhbmQgb3B0aW9ucy5cbiAgICogQHBhcmFtIG9wdGlvbnMuZmluZEZpcnN0IC0gSWYgc3BlY2lmaWVkLCBzdG9wcyB0cmF2ZXJzaW5nIG9uIGZpcnN0IG1hdGNoLiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5ncmlkIC0gU2VhcmNoZXMgZm9yIGFuIGVsZW1lbnQgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgZ3JpZC5cbiAgICogQHJldHVybiBFbGVtZW50cyBtYXRjaGluZyB0aGUgZmlsdGVyIGNyaXRlcmlhLlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kVHJlZUVsZW1lbnRzPFQgZXh0ZW5kcyBNVHJlZU5vZGUgfCBNUGFydD4ocHJlZGljYXRlRm46IChlbGVtZW50OiBNVHJlZU5vZGUgfCBNUGFydCkgPT4gZWxlbWVudCBpcyBULCBvcHRpb25zPzoge2ZpbmRGaXJzdD86IGJvb2xlYW47IGdyaWQ/OiBrZXlvZiBHcmlkc30pOiBUW10ge1xuICAgIGlmIChvcHRpb25zPy5ncmlkICYmICF0aGlzLl9ncmlkc1tvcHRpb25zLmdyaWRdKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBUW10gPSBbXTtcblxuICAgIGZ1bmN0aW9uIHZpc2l0UGFydHMobm9kZTogTVRyZWVOb2RlIHwgTVBhcnQpOiBib29sZWFuIHtcbiAgICAgIGlmIChwcmVkaWNhdGVGbihub2RlKSkge1xuICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmZpbmRGaXJzdCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gc3RvcCB2aXNpdGluZyBvdGhlciBlbGVtZW50c1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgTVRyZWVOb2RlKSB7XG4gICAgICAgIHJldHVybiB2aXNpdFBhcnRzKG5vZGUuY2hpbGQxKSAmJiB2aXNpdFBhcnRzKG5vZGUuY2hpbGQyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5ncmlkKSB7XG4gICAgICB2aXNpdFBhcnRzKHRoaXMuX2dyaWRzW29wdGlvbnMuZ3JpZF0hLnJvb3QpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZ3JpZCBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2dyaWRzKSkge1xuICAgICAgICBpZiAoZ3JpZCAmJiAhdmlzaXRQYXJ0cyhncmlkLnJvb3QpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgbGF5b3V0LlxuICAgKi9cbiAgcHJpdmF0ZSB3b3JraW5nQ29weSgpOiDJtVdvcmtiZW5jaExheW91dCB7XG4gICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLl9pbmplY3RvciwgKCkgPT4gbmV3IMm1V29ya2JlbmNoTGF5b3V0KHtcbiAgICAgIHdvcmtiZW5jaEdyaWQ6IHRoaXMuX3NlcmlhbGl6ZXIuc2VyaWFsaXplR3JpZCh0aGlzLndvcmtiZW5jaEdyaWQsIHtpbmNsdWRlTm9kZUlkOiB0cnVlLCBpbmNsdWRlVWlkOiB0cnVlLCBpbmNsdWRlTWFya2VkRm9yUmVtb3ZhbEZsYWc6IHRydWV9KSxcbiAgICAgIG1haW5BcmVhR3JpZDogdGhpcy5fc2VyaWFsaXplci5zZXJpYWxpemVHcmlkKHRoaXMuX2dyaWRzLm1haW5BcmVhLCB7aW5jbHVkZU5vZGVJZDogdHJ1ZSwgaW5jbHVkZVVpZDogdHJ1ZSwgaW5jbHVkZU1hcmtlZEZvclJlbW92YWxGbGFnOiB0cnVlfSksXG4gICAgICB2aWV3T3V0bGV0czogT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX3ZpZXdPdXRsZXRzKSxcbiAgICAgIHZpZXdTdGF0ZXM6IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLl92aWV3U3RhdGVzKSxcbiAgICAgIG1heGltaXplZDogdGhpcy5fbWF4aW1pemVkLFxuICAgIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWZhdWx0IHdvcmtiZW5jaCBncmlkIHdpdGggYSBtYWluIGFyZWEuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRXb3JrYmVuY2hHcmlkKCk6IE1QYXJ0R3JpZCB7XG4gIHJldHVybiB7XG4gICAgcm9vdDogbmV3IE1QYXJ0KHtpZDogTUFJTl9BUkVBLCBzdHJ1Y3R1cmFsOiB0cnVlLCB2aWV3czogW119KSxcbiAgICBhY3RpdmVQYXJ0SWQ6IE1BSU5fQVJFQSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFpbiBhcmVhIGdyaWQgd2l0aCBhbiBpbml0aWFsIHBhcnQuXG4gKlxuICogVGhlIERJIHRva2VuIHtAbGluayBNQUlOX0FSRUFfSU5JVElBTF9QQVJUX0lEfSBpcyB1c2VkIHRvIGFzc2lnbiB0aGUgaW5pdGlhbCBwYXJ0IGl0cyBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5pdGlhbE1haW5BcmVhR3JpZCgpOiBNUGFydEdyaWQge1xuICByZXR1cm4ge1xuICAgIHJvb3Q6IG5ldyBNUGFydCh7aWQ6IGluamVjdChNQUlOX0FSRUFfSU5JVElBTF9QQVJUX0lEKSwgc3RydWN0dXJhbDogZmFsc2UsIHZpZXdzOiBbXX0pLFxuICAgIGFjdGl2ZVBhcnRJZDogaW5qZWN0KE1BSU5fQVJFQV9JTklUSUFMX1BBUlRfSUQpLFxuICB9O1xufVxuXG4vKipcbiAqIENvZXJjZXMge0BsaW5rIE1QYXJ0R3JpZH0sIGFwcGx5aW5nIG5lY2Vzc2FyeSBtaWdyYXRpb25zIGlmIHRoZSBzZXJpYWxpemVkIGdyaWQgaXMgb3V0ZGF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZU1QYXJ0R3JpZChncmlkOiBzdHJpbmcgfCBNUGFydEdyaWQgfCBudWxsIHwgdW5kZWZpbmVkLCBvcHRpb25zOiB7ZGVmYXVsdDogKCkgPT4gTVBhcnRHcmlkfSk6IMm1TVBhcnRHcmlkIHtcbiAgZ3JpZCA/Pz0gb3B0aW9ucy5kZWZhdWx0KCk7XG5cbiAgaWYgKHR5cGVvZiBncmlkID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBncmlkO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gaW5qZWN0KFdvcmtiZW5jaExheW91dFNlcmlhbGl6ZXIpLmRlc2VyaWFsaXplR3JpZChncmlkKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbmplY3QoTG9nZ2VyKS5lcnJvcignW1NlcmlhbGl6ZUVycm9yXSBGYWlsZWQgdG8gZGVzZXJpYWxpemUgd29ya2JlbmNoIGxheW91dC4gUGxlYXNlIGNsZWFyIHlvdXIgYnJvd3NlciBzdG9yYWdlIGFuZCByZWxvYWQgdGhlIGFwcGxpY2F0aW9uLicsIGVycm9yKTtcbiAgICByZXR1cm4gey4uLm9wdGlvbnMuZGVmYXVsdCgpLCBtaWdyYXRlZDogdHJ1ZX07XG4gIH1cbn1cblxuLyoqXG4gKiBDb2VyY2VzIHtAbGluayBWaWV3T3V0bGV0c30sIGFwcGx5aW5nIG5lY2Vzc2FyeSBtaWdyYXRpb25zIGlmIHRoZSBzZXJpYWxpemVkIG91dGxldHMgYXJlIG91dGRhdGVkLlxuICovXG5mdW5jdGlvbiBjb2VyY2VWaWV3T3V0bGV0cyh2aWV3T3V0bGV0czogc3RyaW5nIHwgVmlld091dGxldHMgfCBudWxsIHwgdW5kZWZpbmVkKTogVmlld091dGxldHMge1xuICBpZiAoIXZpZXdPdXRsZXRzKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2aWV3T3V0bGV0cyA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdmlld091dGxldHM7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBpbmplY3QoV29ya2JlbmNoTGF5b3V0U2VyaWFsaXplcikuZGVzZXJpYWxpemVWaWV3T3V0bGV0cyh2aWV3T3V0bGV0cyk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7XG4gICAgaW5qZWN0KExvZ2dlcikuZXJyb3IoJ1tTZXJpYWxpemVFcnJvcl0gRmFpbGVkIHRvIGRlc2VyaWFsaXplIHZpZXcgb3V0bGV0cy4gUGxlYXNlIGNsZWFyIHlvdXIgYnJvd3NlciBzdG9yYWdlIGFuZCByZWxvYWQgdGhlIGFwcGxpY2F0aW9uLicsIGVycm9yKTtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqXG4gKiBHcmlkcyBvZiB0aGUgd29ya2JlbmNoIGxheW91dC5cbiAqL1xuaW50ZXJmYWNlIEdyaWRzIHtcbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgZ3JpZCBvZiB0aGUgd29ya2JlbmNoLlxuICAgKi9cbiAgd29ya2JlbmNoOiDJtU1QYXJ0R3JpZDtcbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgZ3JpZCBvZiB0aGUgbWFpbiBhcmVhLCBpZiBhbnkuXG4gICAqXG4gICAqIFRoZSBtYWluIGFyZWEgZ3JpZCBpcyBhIHN1Yi1ncmlkIGVtYmVkZGVkIGluIHRoZSBtYWluIGFyZWEgcGFydCwgaWYgYW55LiBJdCBkZWZpbmVzIHRoZSBhcnJhbmdlbWVudCBvZiBwYXJ0cyBpbiB0aGUgbWFpbiBhcmVhLlxuICAgKi9cbiAgbWFpbkFyZWE/OiDJtU1QYXJ0R3JpZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBpZiBhIG51bWJlciwgb3IgY29tcHV0ZXMgaXQgZnJvbSB0aGUgZ2l2ZW4gbGl0ZXJhbCBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZVBvc2l0aW9uKHBvc2l0aW9uOiBudW1iZXIgfCAnc3RhcnQnIHwgJ2VuZCcgfCAnYmVmb3JlLWFjdGl2ZS12aWV3JyB8ICdhZnRlci1hY3RpdmUtdmlldycsIHBhcnQ6IE1QYXJ0KTogbnVtYmVyIHtcbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ3N0YXJ0Jzoge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNhc2UgJ2VuZCc6IHtcbiAgICAgIHJldHVybiBwYXJ0LnZpZXdzLmxlbmd0aDtcbiAgICB9XG4gICAgY2FzZSAnYmVmb3JlLWFjdGl2ZS12aWV3Jzoge1xuICAgICAgY29uc3QgYWN0aXZlVmlld0luZGV4ID0gcGFydC52aWV3cy5maW5kSW5kZXgodmlldyA9PiB2aWV3LmlkID09PSBwYXJ0LmFjdGl2ZVZpZXdJZCk7XG4gICAgICByZXR1cm4gKGFjdGl2ZVZpZXdJbmRleCA+IC0xID8gYWN0aXZlVmlld0luZGV4IDogcGFydC52aWV3cy5sZW5ndGgpO1xuICAgIH1cbiAgICBjYXNlICdhZnRlci1hY3RpdmUtdmlldyc6IHtcbiAgICAgIGNvbnN0IGFjdGl2ZVZpZXdJbmRleCA9IHBhcnQudmlld3MuZmluZEluZGV4KHZpZXcgPT4gdmlldy5pZCA9PT0gcGFydC5hY3RpdmVWaWV3SWQpO1xuICAgICAgcmV0dXJuIChhY3RpdmVWaWV3SW5kZXggPiAtMSA/IGFjdGl2ZVZpZXdJbmRleCArIDEgOiBwYXJ0LnZpZXdzLmxlbmd0aCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgaG93IHRvIGxheSBvdXQgYSBwYXJ0IHJlbGF0aXZlIHRvIGFub3RoZXIgcGFydCBvciBub2RlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZmVyZW5jZUVsZW1lbnQgZXh0ZW5kcyBSZWZlcmVuY2VQYXJ0IHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgcGFydCBvciBub2RlIHdoaWNoIHRvIHVzZSBhcyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgdG8gbGF5IG91dCB0aGUgcGFydC5cbiAgICogSWYgbm90IHNldCwgdGhlIHBhcnQgd2lsbCBiZSBhbGlnbmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3b3JrYmVuY2ggbGF5b3V0LlxuICAgKi9cbiAgcmVsYXRpdmVUbz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBESSB0b2tlbiB0byBjb250cm9sIHRoZSBpZGVudGl0eSBvZiB0aGUgaW5pdGlhbCBwYXJ0IGluIHRoZSBtYWluIGFyZWEuXG4gKlxuICogVGhlIGluaXRpYWwgcGFydCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdGhlIHdvcmtiZW5jaCBpZiB0aGUgbWFpbiBhcmVhIGhhcyBubyBwYXJ0LCBidXQgaXQgaGFzIG5vXG4gKiBzcGVjaWFsIG1lYW5pbmcgdG8gdGhlIHdvcmtiZW5jaCBhbmQgY2FuIGJlIHJlbW92ZWQgYnkgdGhlIHVzZXIuIElmIG5vdCBzZXQsIGEgVVVJRCBpcyBhc3NpZ25lZC5cbiAqXG4gKiBPdmVyd3JpdGUgdGhpcyBESSB0b2tlbiBpbiB0ZXN0cyB0byBjb250cm9sIHRoZSBpZGVudGl0eSBvZiB0aGUgaW5pdGlhbCBwYXJ0LlxuICogYGBgXG4gKiBUZXN0QmVkLm92ZXJyaWRlUHJvdmlkZXIoTUFJTl9BUkVBX0lOSVRJQUxfUEFSVF9JRCwge3VzZVZhbHVlOiAnbWFpbid9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBNQUlOX0FSRUFfSU5JVElBTF9QQVJUX0lEID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ01BSU5fQVJFQV9JTklUSUFMX1BBUlRfSUQnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gcmFuZG9tVVVJRCgpLFxufSk7XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIGluc3RhbnQgd2hlbiBhIHBhcnQgd2FzIGxhc3QgYWN0aXZhdGVkLlxuICpcbiAqIE92ZXJ3cml0ZSBESSB0b2tlbiBpbiB0ZXN0cyB0byBjb250cm9sIHBhcnQgYWN0aXZhdGlvbiBpbnN0YW50cy5cbiAqIGBgYFxuICogVGVzdEJlZC5vdmVycmlkZVByb3ZpZGVyKFBhcnRBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyLCB7dXNlVmFsdWU6IC4uLn0pO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIFBhcnRBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyIHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9wYXJ0UmVnaXN0cnk6IFdvcmtiZW5jaFBhcnRSZWdpc3RyeSkge1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGluc3RhbnQgd2hlbiB0aGUgc3BlY2lmaWVkIHBhcnQgd2FzIGxhc3QgYWN0aXZhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldEFjdGl2YXRpb25JbnN0YW50KHBhcnRJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFydFJlZ2lzdHJ5LmdldChwYXJ0SWQsIHtvckVsc2U6IG51bGx9KT8uYWN0aXZhdGlvbkluc3RhbnQgPz8gMDtcbiAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSBpbnN0YW50IHdoZW4gYSB2aWV3IHdhcyBsYXN0IGFjdGl2YXRlZC5cbiAqXG4gKiBPdmVyd3JpdGUgREkgdG9rZW4gaW4gdGVzdHMgdG8gY29udHJvbCB2aWV3IGFjdGl2YXRpb24gaW5zdGFudHMuXG4gKiBgYGBcbiAqIFRlc3RCZWQub3ZlcnJpZGVQcm92aWRlcihWaWV3QWN0aXZhdGlvbkluc3RhbnRQcm92aWRlciwge3VzZVZhbHVlOiAuLi59KTtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBWaWV3QWN0aXZhdGlvbkluc3RhbnRQcm92aWRlciB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdmlld1JlZ2lzdHJ5OiBXb3JrYmVuY2hWaWV3UmVnaXN0cnkpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbnN0YW50IHdoZW4gdGhlIHNwZWNpZmllZCB2aWV3IHdhcyBsYXN0IGFjdGl2YXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXRBY3RpdmF0aW9uSW5zdGFudCh2aWV3SWQ6IFZpZXdJZCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdSZWdpc3RyeS5nZXQodmlld0lkLCB7b3JFbHNlOiBudWxsfSk/LmFjdGl2YXRpb25JbnN0YW50ID8/IDA7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJlZGljYXRlIHRvIG1hdGNoIGEgdmlldyBieSBpdHMgcHJpbWFyeSBvciBhbHRlcm5hdGl2ZSBpZCwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZSBwYXNzZWQgaWQuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoVmlld0J5SWQoaWQ6IHN0cmluZyk6IFByZWRpY2F0ZTxNVmlldz4ge1xuICBpZiAoV29ya2JlbmNoTGF5b3V0cy5pc1ZpZXdJZChpZCkpIHtcbiAgICByZXR1cm4gdmlldyA9PiB2aWV3LmlkID09PSBpZDtcbiAgfVxuICBlbHNlIHtcbiAgICByZXR1cm4gdmlldyA9PiB2aWV3LmFsdGVybmF0aXZlSWQgPT09IGlkO1xuICB9XG59XG5cbi8qKlxuICogU3RyaW5naWZpZXMgdGhlIGdpdmVuIGZpbHRlciB0byBiZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLlxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlGaWx0ZXIoZmlsdGVyOiB7W3Byb3BlcnR5OiBzdHJpbmddOiB1bmtub3dufSk6IHN0cmluZyB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhmaWx0ZXIpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7dmFsdWV9YCkuam9pbignLCAnKTtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVkIGFydGlmYWN0cyBvZiB0aGUgd29ya2JlbmNoIGxheW91dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkV29ya2JlbmNoTGF5b3V0IHtcbiAgd29ya2JlbmNoR3JpZDogc3RyaW5nO1xuICB3b3JrYmVuY2hWaWV3T3V0bGV0czogc3RyaW5nO1xuICBtYWluQXJlYUdyaWQ6IHN0cmluZyB8IG51bGw7XG4gIG1haW5BcmVhVmlld091dGxldHM6IHN0cmluZztcbn1cbiJdfQ==
|
|
862
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybV3b3JrYmVuY2gtbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvbGF5b3V0L8m1d29ya2JlbmNoLWxheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBQyxLQUFLLEVBQWEsU0FBUyxFQUFvQixNQUFNLDBCQUEwQixDQUFDO0FBQ3hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDdkMsT0FBTyxFQUFDLFNBQVMsRUFBaUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RSxPQUFPLEVBQXlCLHlCQUF5QixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDdkcsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBYSxxQkFBcUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3RyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFJaEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRTNDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sWUFBWSxDQUFDOztBQUVsQzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBYTNCLGlCQUFpQjtJQUNqQixZQUFZLE1BQXlNO1FBUnBNLG1DQUE4QixH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O0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxNQUFxQztJQUM1RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjMgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5pbXBvcnQge01QYXJ0LCBNUGFydEdyaWQsIE1UcmVlTm9kZSwgTVZpZXcsIMm1TVBhcnRHcmlkfSBmcm9tICcuL3dvcmtiZW5jaC1sYXlvdXQubW9kZWwnO1xuaW1wb3J0IHthc3NlcnRUeXBlfSBmcm9tICcuLi9jb21tb24vYXNzZXJ0cy51dGlsJztcbmltcG9ydCB7VUlEfSBmcm9tICcuLi9jb21tb24vdWlkLnV0aWwnO1xuaW1wb3J0IHtNQUlOX0FSRUEsIFJlZmVyZW5jZVBhcnQsIFdvcmtiZW5jaExheW91dH0gZnJvbSAnLi93b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7R3JpZFNlcmlhbGl6YXRpb25GbGFncywgV29ya2JlbmNoTGF5b3V0U2VyaWFsaXplcn0gZnJvbSAnLi93b3JrZW5jaC1sYXlvdXQtc2VyaWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7V09SS0JFTkNIX1ZJRVdfUkVHSVNUUll9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcucmVnaXN0cnknO1xuaW1wb3J0IHtXT1JLQkVOQ0hfUEFSVF9SRUdJU1RSWX0gZnJvbSAnLi4vcGFydC93b3JrYmVuY2gtcGFydC5yZWdpc3RyeSc7XG5pbXBvcnQge2luamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIEluamVjdG9yLCBQcmVkaWNhdGUsIHJ1bkluSW5qZWN0aW9uQ29udGV4dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1JvdXRpbmd9IGZyb20gJy4uL3JvdXRpbmcvcm91dGluZy51dGlsJztcbmltcG9ydCB7Q29tbWFuZHMsIE5hdmlnYXRpb25EYXRhLCBOYXZpZ2F0aW9uU3RhdGUsIE5hdmlnYXRpb25TdGF0ZXMsIFZpZXdPdXRsZXRzfSBmcm9tICcuLi9yb3V0aW5nL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgVXJsU2VnbWVudH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7Vmlld0lkfSBmcm9tICcuLi92aWV3L3dvcmtiZW5jaC12aWV3Lm1vZGVsJztcbmltcG9ydCB7QXJyYXlzfSBmcm9tICdAc2Npb24vdG9vbGtpdC91dGlsJztcbmltcG9ydCB7VXJsU2VnbWVudE1hdGNoZXJ9IGZyb20gJy4uL3JvdXRpbmcvdXJsLXNlZ21lbnQtbWF0Y2hlcic7XG5pbXBvcnQge09iamVjdHN9IGZyb20gJy4uL2NvbW1vbi9vYmplY3RzLnV0aWwnO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXRzfSBmcm9tICcuL3dvcmtiZW5jaC1sYXlvdXRzLnV0aWwnO1xuaW1wb3J0IHtMb2dnZXJ9IGZyb20gJy4uL2xvZ2dpbmcnO1xuXG4vKipcbiAqIEBpbmhlcml0RG9jXG4gKlxuICogVGhlIHdvcmtiZW5jaCBsYXlvdXQgaXMgYSBncmlkIG9mIHBhcnRzLiBJdCBjb250YWlucyBhdCBsZWFzdCBvbmUgcGFydC4gQSBzcGVjaWFsIHBhcnQsIHRoZSBtYWluIGFyZWEgcGFydCwgaXMgbm90IGEgc3RhY2sgb2Ygdmlld3NcbiAqIGJ1dCBlbWJlZHMgYSBzdWItZ3JpZCwgdGhlIG1haW4gYXJlYSBncmlkLiBJdCBkZWZpbmVzIHRoZSBhcnJhbmdlbWVudCBvZiBwYXJ0cyBpbiB0aGUgbWFpbiBhcmVhLiBUaGUgbWFpbiBhcmVhIGlzIG9wdGlvbmFsLlxuICpcbiAqIFRoZSBsYXlvdXQgaXMgc2VyaWFsaXphYmxlIGludG8gYSBVUkwtc2FmZSBiYXNlNjQgc3RyaW5nLlxuICpcbiAqIFRoZSBsYXlvdXQgaXMgYW4gaW1tdXRhYmxlIG9iamVjdCB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgdG8gbW9kaWZ5IHRoZSBsYXlvdXQuIE1vZGlmaWNhdGlvbnMgaGF2ZSBub1xuICogc2lkZSBlZmZlY3RzLiBFYWNoIG1vZGlmaWNhdGlvbiBjcmVhdGVzIGEgbmV3IGxheW91dCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMuXG4gKlxuICogSU1QT1JUQU5UOiBNZXRob2RzIHN0YXJ0aW5nIHdpdGggYW4gdW5kZXJzY29yZSBpbmRpY2F0ZSB0aGV5IGFyZSBub3Qgd29ya2luZyBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmeWluZyB0aGUgbGF5b3V0IGluc3RhbmNlLlxuICovXG5leHBvcnQgY2xhc3MgybVXb3JrYmVuY2hMYXlvdXQgaW1wbGVtZW50cyBXb3JrYmVuY2hMYXlvdXQge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2dyaWRzOiBHcmlkcztcbiAgcHJpdmF0ZSByZWFkb25seSBfdmlld091dGxldHM6IE1hcDxWaWV3SWQsIFVybFNlZ21lbnRbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX25hdmlnYXRpb25TdGF0ZXM6IE1hcDxWaWV3SWQsIE5hdmlnYXRpb25TdGF0ZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2dyaWROYW1lczogQXJyYXk8a2V5b2YgR3JpZHM+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9wYXJ0QWN0aXZhdGlvbkluc3RhbnRQcm92aWRlciA9IGluamVjdChQYXJ0QWN0aXZhdGlvbkluc3RhbnRQcm92aWRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyID0gaW5qZWN0KFZpZXdBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VyaWFsaXplciA9IGluamVjdChXb3JrYmVuY2hMYXlvdXRTZXJpYWxpemVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gIHByaXZhdGUgX21heGltaXplZDogYm9vbGVhbjtcblxuICAvKiogQGludGVybmFsICoqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IHt3b3JrYmVuY2hHcmlkPzogc3RyaW5nIHwgTVBhcnRHcmlkIHwgbnVsbDsgbWFpbkFyZWFHcmlkPzogc3RyaW5nIHwgTVBhcnRHcmlkIHwgbnVsbDsgdmlld091dGxldHM/OiBzdHJpbmcgfCBWaWV3T3V0bGV0cyB8IG51bGw7IG5hdmlnYXRpb25TdGF0ZXM/OiBOYXZpZ2F0aW9uU3RhdGVzIHwgbnVsbDsgbWF4aW1pemVkPzogYm9vbGVhbn0pIHtcbiAgICB0aGlzLl9ncmlkcyA9IHtcbiAgICAgIHdvcmtiZW5jaDogY29lcmNlTVBhcnRHcmlkKGNvbmZpZy53b3JrYmVuY2hHcmlkLCB7ZGVmYXVsdDogY3JlYXRlRGVmYXVsdFdvcmtiZW5jaEdyaWR9KSxcbiAgICB9O1xuICAgIGlmICh0aGlzLmhhc1BhcnQoTUFJTl9BUkVBLCB7Z3JpZDogJ3dvcmtiZW5jaCd9KSkge1xuICAgICAgdGhpcy5fZ3JpZHMubWFpbkFyZWEgPSBjb2VyY2VNUGFydEdyaWQoY29uZmlnLm1haW5BcmVhR3JpZCwge2RlZmF1bHQ6IGNyZWF0ZUluaXRpYWxNYWluQXJlYUdyaWR9KTtcbiAgICB9XG4gICAgdGhpcy5fZ3JpZE5hbWVzID0gT2JqZWN0cy5rZXlzKHRoaXMuX2dyaWRzKTtcbiAgICB0aGlzLl9tYXhpbWl6ZWQgPSBjb25maWcubWF4aW1pemVkID8/IGZhbHNlO1xuICAgIHRoaXMuX3ZpZXdPdXRsZXRzID0gbmV3IE1hcDxWaWV3SWQsIFVybFNlZ21lbnRbXT4oT2JqZWN0cy5lbnRyaWVzKGNvZXJjZVZpZXdPdXRsZXRzKGNvbmZpZy52aWV3T3V0bGV0cykpKTtcbiAgICB0aGlzLl9uYXZpZ2F0aW9uU3RhdGVzID0gbmV3IE1hcDxWaWV3SWQsIE5hdmlnYXRpb25TdGF0ZT4oT2JqZWN0cy5lbnRyaWVzKGNvbmZpZy5uYXZpZ2F0aW9uU3RhdGVzID8/IHt9KSk7XG4gICAgdGhpcy5wYXJ0cygpLmZvckVhY2gocGFydCA9PiBhc3NlcnRUeXBlKHBhcnQsIHt0b0JlT25lT2Y6IFtNVHJlZU5vZGUsIE1QYXJ0XX0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIG1haW4gd29ya2JlbmNoIGdyaWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdvcmtiZW5jaEdyaWQoKTogUmVhZG9ubHk8ybVNUGFydEdyaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZHMud29ya2JlbmNoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgbWFpbiBhcmVhIGdyaWQsIGlmIGFueS5cbiAgICpcbiAgICogVGhlIG1haW4gYXJlYSBncmlkIGlzIGEgc3ViLWdyaWQgaW5jbHVkZWQgYnkgdGhlIHtAbGluayBNQUlOX0FSRUF9IHBhcnQuIEl0IGRlZmluZXMgdGhlIGFycmFuZ2VtZW50IG9mIHBhcnRzIGluIHRoZSBtYWluIGFyZWEuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1haW5BcmVhR3JpZCgpOiBSZWFkb25seTzJtU1QYXJ0R3JpZD4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZHMubWFpbkFyZWEgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyBpZiBnaXZlbiBwYXJ0IGlzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIGdyaWQuXG4gICAqL1xuICBwdWJsaWMgaGFzUGFydChpZDogc3RyaW5nLCBvcHRpb25zPzoge2dyaWQ/OiBrZXlvZiBHcmlkc30pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wYXJ0KHtwYXJ0SWQ6IGlkLCBncmlkOiBvcHRpb25zPy5ncmlkfSwge29yRWxzZTogbnVsbH0pICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3RzIGlmIGdpdmVuIHZpZXcgaXMgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgZ3JpZC5cbiAgICovXG4gIHB1YmxpYyBoYXNWaWV3KGlkOiBzdHJpbmcsIG9wdGlvbnM/OiB7Z3JpZD86IGtleW9mIEdyaWRzfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdzKHtncmlkOiBvcHRpb25zPy5ncmlkLCBpZDogaWR9KS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBVUkwgb2Ygdmlld3MgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBmaWx0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBmaW5kQnkgLSBEZWZpbmVzIHRoZSBzZWFyY2ggc2NvcGUuXG4gICAqIEBwYXJhbSBmaW5kQnkuZ3JpZCAtIFNlYXJjaGVzIGZvciB2aWV3cyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBncmlkLlxuICAgKiBAcmV0dXJuIG91dGxldHMgb2Ygdmlld3MgbWF0Y2hpbmcgdGhlIGZpbHRlciBjcml0ZXJpYS5cbiAgICovXG4gIHB1YmxpYyB2aWV3T3V0bGV0cyhmaW5kQnk/OiB7Z3JpZD86IGtleW9mIEdyaWRzfSk6IFZpZXdPdXRsZXRzIHtcbiAgICBjb25zdCB2aWV3T3V0bGV0RW50cmllcyA9IHRoaXMudmlld3Moe2dyaWQ6IGZpbmRCeT8uZ3JpZH0pLm1hcCh2aWV3ID0+IFt2aWV3LmlkLCB0aGlzLl92aWV3T3V0bGV0cy5nZXQodmlldy5pZCkgPz8gW11dKTtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHZpZXdPdXRsZXRFbnRyaWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBuYXZpZ2F0aW9uYWwgc3RhdGUgZm9yIHZpZXdzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgZmlsdGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZmluZEJ5IC0gRGVmaW5lcyB0aGUgc2VhcmNoIHNjb3BlLlxuICAgKiBAcGFyYW0gZmluZEJ5LmdyaWQgLSBTZWFyY2hlcyBmb3Igdmlld3MgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgZ3JpZC5cbiAgICogQHJldHVybiBuYXZpZ2F0aW9uIHN0YXRlIG9mIHZpZXdzIG1hdGNoaW5nIHRoZSBmaWx0ZXIgY3JpdGVyaWEuXG4gICAqL1xuICBwdWJsaWMgbmF2aWdhdGlvblN0YXRlcyhmaW5kQnk/OiB7Z3JpZD86IGtleW9mIEdyaWRzfSk6IE5hdmlnYXRpb25TdGF0ZXMge1xuICAgIGNvbnN0IG5hdmlnYXRpb25TdGF0ZUVudHJpZXMgPSB0aGlzLnZpZXdzKHtncmlkOiBmaW5kQnk/LmdyaWR9KS5tYXAodmlldyA9PiBbdmlldy5pZCwgdGhpcy5fbmF2aWdhdGlvblN0YXRlcy5nZXQodmlldy5pZCkgPz8ge31dKTtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKG5hdmlnYXRpb25TdGF0ZUVudHJpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBuYXZpZ2F0aW9uYWwgc3RhdGUgb2Ygc3BlY2lmaWVkIHZpZXcuXG4gICAqL1xuICBwdWJsaWMgbmF2aWdhdGlvblN0YXRlKGZpbmRCeToge3ZpZXdJZDogVmlld0lkfSk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TdGF0ZXMuZ2V0KGZpbmRCeS52aWV3SWQpID8/IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBVUkwgb2Ygc3BlY2lmaWVkIHZpZXcuXG4gICAqL1xuICBwdWJsaWMgdXJsU2VnbWVudHMoZmluZEJ5OiB7dmlld0lkOiBWaWV3SWR9KTogVXJsU2VnbWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld091dGxldHMuZ2V0KGZpbmRCeS52aWV3SWQpID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdGF0ZSwgbWF4aW1pemVzIG9yIG1pbmltaXplcyB0aGUgbWFpbiBhcmVhLlxuICAgKlxuICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIGxheW91dCB3aXRoIHRoZSBtYXhpbWl6YXRpb24gY2hhbmdlZC5cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVNYXhpbWl6ZWQoKTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5Ll9fdG9nZ2xlTWF4aW1pemVkKCk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtYWluIGFyZWEgaXMgbWF4aW1pemVkLlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhpbWl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX21heGltaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBwYXJ0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGZpbHRlci5cbiAgICpcbiAgICogQHBhcmFtIGZpbmRCeSAtIERlZmluZXMgdGhlIHNlYXJjaCBzY29wZS5cbiAgICogQHBhcmFtIGZpbmRCeS5ncmlkIC0gU2VhcmNoZXMgZm9yIHBhcnRzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIGdyaWQuXG4gICAqIEByZXR1cm4gcGFydHMgbWF0Y2hpbmcgdGhlIGZpbHRlciBjcml0ZXJpYS5cbiAgICovXG4gIHB1YmxpYyBwYXJ0cyhmaW5kQnk/OiB7Z3JpZD86IGtleW9mIEdyaWRzfSk6IHJlYWRvbmx5IE1QYXJ0W10ge1xuICAgIHJldHVybiB0aGlzLmZpbmRUcmVlRWxlbWVudHMoKGVsZW1lbnQ6IE1UcmVlTm9kZSB8IE1QYXJ0KTogZWxlbWVudCBpcyBNUGFydCA9PiBlbGVtZW50IGluc3RhbmNlb2YgTVBhcnQsIHtncmlkOiBmaW5kQnk/LmdyaWR9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHBhcnQgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBmaWx0ZXIuIElmIG5vdCBmb3VuZCwgYnkgZGVmYXVsdCwgdGhyb3dzIGFuIGVycm9yIHVubGVzcyBzZXR0aW5nIHRoZSBgb3JFbHNlTnVsbGAgb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZmluZEJ5IC0gRGVmaW5lcyB0aGUgc2VhcmNoIHNjb3BlLlxuICAgKiBAcGFyYW0gZmluZEJ5LnBhcnRJZCAtIFNlYXJjaGVzIGZvciBhIHBhcnQgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLlxuICAgKiBAcGFyYW0gZmluZEJ5LnZpZXdJZCAtIFNlYXJjaGVzIGZvciBhIHBhcnQgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZpZXcuXG4gICAqIEBwYXJhbSBmaW5kQnkuZ3JpZCAtIFNlYXJjaGVzIGZvciBhIHBhcnQgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgZ3JpZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb250cm9scyB0aGUgc2VhcmNoLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5vckVsc2UgLSBDb250cm9scyB0byByZXR1cm4gYG51bGxgIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IgaWYgbm8gcGFydCBpcyBmb3VuZC5cbiAgICogQHJldHVybiBwYXJ0IG1hdGNoaW5nIHRoZSBmaWx0ZXIgY3JpdGVyaWEuXG4gICAqL1xuICBwdWJsaWMgcGFydChmaW5kQnk6IHtwYXJ0SWQ/OiBzdHJpbmc7IHZpZXdJZD86IHN0cmluZzsgZ3JpZD86IGtleW9mIEdyaWRzfSk6IE1QYXJ0O1xuICBwdWJsaWMgcGFydChmaW5kQnk6IHtwYXJ0SWQ/OiBzdHJpbmc7IHZpZXdJZD86IHN0cmluZzsgZ3JpZD86IGtleW9mIEdyaWRzfSwgb3B0aW9uczoge29yRWxzZTogbnVsbH0pOiBNUGFydCB8IG51bGw7XG4gIHB1YmxpYyBwYXJ0KGZpbmRCeToge3BhcnRJZD86IHN0cmluZzsgdmlld0lkPzogc3RyaW5nOyBncmlkPzoga2V5b2YgR3JpZHN9LCBvcHRpb25zPzoge29yRWxzZTogbnVsbH0pOiBNUGFydCB8IG51bGwge1xuICAgIGlmICghZmluZEJ5LnBhcnRJZCAmJiAhZmluZEJ5LnZpZXdJZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFtQYXJ0RmluZEVycm9yXSBNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50LiBTcGVjaWZ5IGVpdGhlciAncGFydElkJyBvciAndmlld0lkJy5gKTtcbiAgICB9XG4gICAgY29uc3QgcGFydCA9IHRoaXMuZmluZFRyZWVFbGVtZW50cygoZWxlbWVudDogTVRyZWVOb2RlIHwgTVBhcnQpOiBlbGVtZW50IGlzIE1QYXJ0ID0+IHtcbiAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZpbmRCeS5wYXJ0SWQgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50LmlkICE9PSBmaW5kQnkucGFydElkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaW5kQnkudmlld0lkICE9PSB1bmRlZmluZWQgJiYgIWVsZW1lbnQudmlld3Muc29tZShtYXRjaFZpZXdCeUlkKGZpbmRCeS52aWV3SWQhKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSwge2ZpbmRGaXJzdDogdHJ1ZSwgZ3JpZDogZmluZEJ5LmdyaWR9KVswXTtcblxuICAgIGlmICghcGFydCAmJiAhb3B0aW9ucykge1xuICAgICAgdGhyb3cgRXJyb3IoYFtOdWxsUGFydEVycm9yXSBObyBtYXRjaGluZyBwYXJ0IGZvdW5kOiBbJHtzdHJpbmdpZnlGaWx0ZXIoZmluZEJ5KX1dYCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0ID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gQGluaGVyaXREb2NcbiAgICogQHBhcmFtIHJlbGF0aXZlVG8gLSBAaW5oZXJpdERvY1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEBpbmhlcml0RG9jXG4gICAqIEBwYXJhbSBvcHRpb25zLmFjdGl2YXRlIC0gQGluaGVyaXREb2NcbiAgICogQHBhcmFtIG9wdGlvbnMuc3RydWN0dXJhbCAtIFNwZWNpZmllcyBpZiB0aGlzIGlzIGEgc3RydWN0dXJhbCBwYXJ0LiBBIHN0cnVjdHVyYWwgcGFydCB3aWxsIG5vdCBiZSByZW1vdmVkIHdoZW4gcmVtb3ZpbmcgaXRzIGxhc3Qgdmlldy4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gICAqL1xuICBwdWJsaWMgYWRkUGFydChpZDogc3RyaW5nIHwgTUFJTl9BUkVBLCByZWxhdGl2ZVRvOiBSZWZlcmVuY2VFbGVtZW50LCBvcHRpb25zPzoge2FjdGl2YXRlPzogYm9vbGVhbjsgc3RydWN0dXJhbD86IGJvb2xlYW59KTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5Ll9fYWRkUGFydChpZCwgcmVsYXRpdmVUbywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUGFydChpZDogc3RyaW5nKTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5Ll9fcmVtb3ZlUGFydChpZCk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFjdGl2ZSBwYXJ0IG9mIHRoZSBzcGVjaWZpZWQgZ3JpZCwgb3IgYG51bGxgIGlmIHNwZWNpZmllZCBncmlkIGlzIG5vdCBwcmVzZW50LlxuICAgKi9cbiAgcHVibGljIGFjdGl2ZVBhcnQoZmluZDoge2dyaWQ6ICd3b3JrYmVuY2gnfSk6IFJlYWRvbmx5PE1QYXJ0PjtcbiAgcHVibGljIGFjdGl2ZVBhcnQoZmluZDoge2dyaWQ6IGtleW9mIEdyaWRzfSk6IFJlYWRvbmx5PE1QYXJ0PiB8IG51bGw7XG4gIHB1YmxpYyBhY3RpdmVQYXJ0KGZpbmQ6IHtncmlkOiBrZXlvZiBHcmlkc30pOiBSZWFkb25seTxNUGFydD4gfCBudWxsIHtcbiAgICBjb25zdCBncmlkID0gdGhpcy5fZ3JpZHNbZmluZC5ncmlkXTtcbiAgICBpZiAoIWdyaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJ0KHtwYXJ0SWQ6IGdyaWQuYWN0aXZlUGFydElkLCBncmlkOiBmaW5kLmdyaWR9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGFjdGl2YXRlUGFydChpZDogc3RyaW5nKTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5Ll9fYWN0aXZhdGVQYXJ0KGlkKTtcbiAgICByZXR1cm4gd29ya2luZ0NvcHk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSB2aWV3IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgZmlsdGVyLiBJZiBub3QgZm91bmQsIGJ5IGRlZmF1bHQsIHRocm93cyBhbiBlcnJvciB1bmxlc3Mgc2V0dGluZyB0aGUgYG9yRWxzZU51bGxgIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGZpbmRCeSAtIERlZmluZXMgdGhlIHNlYXJjaCBzY29wZS5cbiAgICogQHBhcmFtIGZpbmRCeS52aWV3SWQgLSBTZWFyY2hlcyBmb3IgYSB2aWV3IHdpdGggdGhlIHNwZWNpZmllZCBpZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb250cm9scyB0aGUgc2VhcmNoLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5vckVsc2UgLSBDb250cm9scyB0byByZXR1cm4gYG51bGxgIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IgaWYgbm8gdmlldyBpcyBmb3VuZC5cbiAgICogQHJldHVybiB2aWV3IG1hdGNoaW5nIHRoZSBmaWx0ZXIgY3JpdGVyaWEuXG4gICAqL1xuICBwdWJsaWMgdmlldyhmaW5kQnk6IHt2aWV3SWQ6IFZpZXdJZH0pOiBNVmlldztcbiAgcHVibGljIHZpZXcoZmluZEJ5OiB7dmlld0lkOiBWaWV3SWR9LCBvcHRpb25zOiB7b3JFbHNlOiBudWxsfSk6IE1WaWV3IHwgbnVsbDtcbiAgcHVibGljIHZpZXcoZmluZEJ5OiB7dmlld0lkOiBWaWV3SWR9LCBvcHRpb25zPzoge29yRWxzZTogbnVsbH0pOiBNVmlldyB8IG51bGwge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdzKHtpZDogZmluZEJ5LnZpZXdJZH0pLmF0KDApO1xuICAgIGlmICghdmlldyAmJiAhb3B0aW9ucykge1xuICAgICAgdGhyb3cgRXJyb3IoYFtOdWxsVmlld0Vycm9yXSBObyB2aWV3IGZvdW5kIHdpdGggaWQgJyR7ZmluZEJ5LnZpZXdJZH0nLmApO1xuICAgIH1cbiAgICByZXR1cm4gdmlldyA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHZpZXdzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgZmlsdGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZmluZEJ5IC0gRGVmaW5lcyB0aGUgc2VhcmNoIHNjb3BlLlxuICAgKiBAcGFyYW0gZmluZEJ5LmlkIC0gU2VhcmNoZXMgZm9yIHZpZXdzIHdpdGggdGhlIHNwZWNpZmllZCBpZC5cbiAgICogQHBhcmFtIGZpbmRCeS5wYXJ0SWQgLSBTZWFyY2hlcyBmb3Igdmlld3MgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgcGFydC5cbiAgICogQHBhcmFtIGZpbmRCeS5zZWdtZW50cyAtIFNlYXJjaGVzIGZvciB2aWV3cyBuYXZpZ2F0ZWQgdG8gdGhlIHNwZWNpZmllZCBVUkwuXG4gICAqIEBwYXJhbSBmaW5kQnkubmF2aWdhdGlvbkhpbnQgLSBTZWFyY2hlcyBmb3Igdmlld3MgbmF2aWdhdGVkIHdpdGggZ2l2ZW4gaGludC4gUGFzc2luZyBgbnVsbGAgc2VhcmNoZXMgZm9yIHZpZXdzIG5hdmlnYXRlZCB3aXRob3V0IGEgaGludC5cbiAgICogQHBhcmFtIGZpbmRCeS5tYXJrZWRGb3JSZW1vdmFsIC0gU2VhcmNoZXMgZm9yIHZpZXdzIG1hcmtlZCAob3Igbm90IG1hcmtlZCkgZm9yIHJlbW92YWwuXG4gICAqIEBwYXJhbSBmaW5kQnkuZ3JpZCAtIFNlYXJjaGVzIGZvciB2aWV3cyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBncmlkLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbnRyb2xzIHRoZSBzZWFyY2guXG4gICAqIEBwYXJhbSBvcHRpb25zLm9yRWxzZSAtIENvbnRyb2xzIHRvIGVycm9yIGlmIG5vIHZpZXcgaXMgZm91bmQuXG4gICAqIEByZXR1cm4gdmlld3MgbWF0Y2hpbmcgdGhlIGZpbHRlciBjcml0ZXJpYS5cbiAgICovXG4gIHB1YmxpYyB2aWV3cyhmaW5kQnk/OiB7aWQ/OiBzdHJpbmc7IHBhcnRJZD86IHN0cmluZzsgc2VnbWVudHM/OiBVcmxTZWdtZW50TWF0Y2hlcjsgbmF2aWdhdGlvbkhpbnQ/OiBzdHJpbmcgfCBudWxsOyBtYXJrZWRGb3JSZW1vdmFsPzogYm9vbGVhbjsgZ3JpZD86IGtleW9mIEdyaWRzfSwgb3B0aW9ucz86IHtvckVsc2U6ICd0aHJvd0Vycm9yJ30pOiByZWFkb25seSBNVmlld1tdIHtcbiAgICBjb25zdCB2aWV3cyA9IHRoaXMucGFydHMoe2dyaWQ6IGZpbmRCeT8uZ3JpZH0pXG4gICAgICAuZmlsdGVyKHBhcnQgPT4ge1xuICAgICAgICBpZiAoZmluZEJ5Py5wYXJ0SWQgIT09IHVuZGVmaW5lZCAmJiBwYXJ0LmlkICE9PSBmaW5kQnkucGFydElkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSlcbiAgICAgIC5mbGF0TWFwKHBhcnQgPT4gcGFydC52aWV3cylcbiAgICAgIC5maWx0ZXIodmlldyA9PiB7XG4gICAgICAgIGlmIChmaW5kQnk/LmlkICE9PSB1bmRlZmluZWQgJiYgIW1hdGNoVmlld0J5SWQoZmluZEJ5LmlkKSh2aWV3KSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmluZEJ5Py5zZWdtZW50cyAmJiAhZmluZEJ5LnNlZ21lbnRzLm1hdGNoZXModGhpcy51cmxTZWdtZW50cyh7dmlld0lkOiB2aWV3LmlkfSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaW5kQnk/Lm5hdmlnYXRpb25IaW50ICE9PSB1bmRlZmluZWQgJiYgZmluZEJ5Lm5hdmlnYXRpb25IaW50ICE9PSAodmlldy5uYXZpZ2F0aW9uPy5oaW50ID8/IG51bGwpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaW5kQnk/Lm1hcmtlZEZvclJlbW92YWwgIT09IHVuZGVmaW5lZCAmJiBmaW5kQnkubWFya2VkRm9yUmVtb3ZhbCAhPT0gKHZpZXcubWFya2VkRm9yUmVtb3ZhbCA/PyBmYWxzZSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcblxuICAgIGlmIChmaW5kQnkgJiYgIXZpZXdzLmxlbmd0aCAmJiBvcHRpb25zKSB7XG4gICAgICB0aHJvdyBFcnJvcihgW051bGxWaWV3RXJyb3JdIE5vIG1hdGNoaW5nIHZpZXcgZm91bmQ6IFske3N0cmluZ2lmeUZpbHRlcihmaW5kQnkpfV1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgYWRkVmlldyhpZDogc3RyaW5nLCBvcHRpb25zOiB7cGFydElkOiBzdHJpbmc7IHBvc2l0aW9uPzogbnVtYmVyIHwgJ3N0YXJ0JyB8ICdlbmQnIHwgJ2JlZm9yZS1hY3RpdmUtdmlldycgfCAnYWZ0ZXItYWN0aXZlLXZpZXcnOyBhY3RpdmF0ZVZpZXc/OiBib29sZWFuOyBhY3RpdmF0ZVBhcnQ/OiBib29sZWFuOyBjc3NDbGFzcz86IHN0cmluZyB8IHN0cmluZ1tdfSk6IMm1V29ya2JlbmNoTGF5b3V0IHtcbiAgICBjb25zdCB3b3JraW5nQ29weSA9IHRoaXMud29ya2luZ0NvcHkoKTtcbiAgICBpZiAoV29ya2JlbmNoTGF5b3V0cy5pc1ZpZXdJZChpZCkpIHtcbiAgICAgIHdvcmtpbmdDb3B5Ll9fYWRkVmlldyh7aWQsIHVpZDogVUlELnJhbmRvbVVJRCgpfSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgd29ya2luZ0NvcHkuX19hZGRWaWV3KHtpZDogdGhpcy5jb21wdXRlTmV4dFZpZXdJZCgpLCBhbHRlcm5hdGl2ZUlkOiBpZCwgdWlkOiBVSUQucmFuZG9tVUlEKCl9LCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmF2aWdhdGVWaWV3KGlkOiBzdHJpbmcsIGNvbW1hbmRzOiBDb21tYW5kcywgZXh0cmFzPzoge2hpbnQ/OiBzdHJpbmc7IHJlbGF0aXZlVG8/OiBBY3RpdmF0ZWRSb3V0ZSB8IG51bGw7IGRhdGE/OiBOYXZpZ2F0aW9uRGF0YTsgc3RhdGU/OiBOYXZpZ2F0aW9uU3RhdGU7IGNzc0NsYXNzPzogc3RyaW5nIHwgc3RyaW5nW119KTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5LnZpZXdzKHtpZH0sIHtvckVsc2U6ICd0aHJvd0Vycm9yJ30pLmZvckVhY2godmlldyA9PiB3b3JraW5nQ29weS5fX25hdmlnYXRlVmlldyh2aWV3LCBjb21tYW5kcywgZXh0cmFzKSk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIEBpbmhlcml0RG9jXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29udHJvbHMgcmVtb3ZhbCBvZiB0aGUgdmlldy5cbiAgICogQHBhcmFtIG9wdGlvbnMuZm9yY2UgLSBTcGVjaWZpZXMgd2hldGhlciB0byBmb3JjZSByZW1vdmUgdGhlIHZpZXcsIGJ5cGFzc2luZyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZVZpZXcoaWQ6IHN0cmluZywgb3B0aW9ucz86IHtmb3JjZT86IGJvb2xlYW59KTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5LnZpZXdzKHtpZH0sIHtvckVsc2U6ICd0aHJvd0Vycm9yJ30pLmZvckVhY2godmlldyA9PiB3b3JraW5nQ29weS5fX3JlbW92ZVZpZXcodmlldywge2ZvcmNlOiBvcHRpb25zPy5mb3JjZX0pKTtcbiAgICByZXR1cm4gd29ya2luZ0NvcHk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB2aWV3cyBtYXJrZWQgZm9yIHJlbW92YWwsIG9wdGlvbmFsbHkgaW52b2tpbmcgdGhlIHBhc3NlZCBgQ2FuQ2xvc2VgIGZ1bmN0aW9uIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHJlbW92ZSBhIHZpZXcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVtb3ZlVmlld3NNYXJrZWRGb3JSZW1vdmFsKGNhbkNsb3NlRm4/OiAodmlld1VpZDogc3RyaW5nKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbik6IFByb21pc2U8ybVXb3JrYmVuY2hMYXlvdXQ+IHtcbiAgICBjb25zdCB3b3JraW5nQ29weSA9IHRoaXMud29ya2luZ0NvcHkoKTtcbiAgICBmb3IgKGNvbnN0IHZpZXcgb2Ygd29ya2luZ0NvcHkudmlld3Moe21hcmtlZEZvclJlbW92YWw6IHRydWV9KSkge1xuICAgICAgaWYgKCFjYW5DbG9zZUZuIHx8IGF3YWl0IGNhbkNsb3NlRm4odmlldy51aWQpKSB7XG4gICAgICAgIHdvcmtpbmdDb3B5Ll9fcmVtb3ZlVmlldyh2aWV3LCB7Zm9yY2U6IHRydWV9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbW92ZVZpZXcoaWQ6IHN0cmluZywgdGFyZ2V0UGFydElkOiBzdHJpbmcsIG9wdGlvbnM/OiB7cG9zaXRpb24/OiBudW1iZXIgfCAnc3RhcnQnIHwgJ2VuZCcgfCAnYmVmb3JlLWFjdGl2ZS12aWV3JyB8ICdhZnRlci1hY3RpdmUtdmlldyc7IGFjdGl2YXRlVmlldz86IGJvb2xlYW47IGFjdGl2YXRlUGFydD86IGJvb2xlYW59KTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5LnZpZXdzKHtpZH0sIHtvckVsc2U6ICd0aHJvd0Vycm9yJ30pLmZvckVhY2godmlldyA9PiB3b3JraW5nQ29weS5fX21vdmVWaWV3KHZpZXcsIHRhcmdldFBhcnRJZCwgb3B0aW9ucykpO1xuICAgIHJldHVybiB3b3JraW5nQ29weTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGFjdGl2YXRlVmlldyhpZDogc3RyaW5nLCBvcHRpb25zPzoge2FjdGl2YXRlUGFydD86IGJvb2xlYW59KTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGNvbnN0IHdvcmtpbmdDb3B5ID0gdGhpcy53b3JraW5nQ29weSgpO1xuICAgIHdvcmtpbmdDb3B5LnZpZXdzKHtpZH0sIHtvckVsc2U6ICd0aHJvd0Vycm9yJ30pLmZvckVhY2godmlldyA9PiB3b3JraW5nQ29weS5fX2FjdGl2YXRlVmlldyh2aWV3LCBvcHRpb25zKSk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlcyB0aGUgcHJlY2VkaW5nIHZpZXcgaWYgaXQgZXhpc3RzLCBvciB0aGUgc3Vic2VxdWVudCB2aWV3IG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSB2aWV3IHRvIGFjdGl2YXRlIGl0cyBhZGphY2VudCB2aWV3LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbnRyb2xzIHZpZXcgYWN0aXZhdGlvbi5cbiAgICogQHBhcmFtIG9wdGlvbnMuYWN0aXZhdGVQYXJ0IC0gQ29udHJvbHMgaWYgdG8gYWN0aXZhdGUgdGhlIHBhcnQuIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBsYXlvdXQgd2l0aCB0aGUgYWRqYWNlbnQgdmlldyBhY3RpdmF0ZWQuXG4gICAqL1xuICBwdWJsaWMgYWN0aXZhdGVBZGphY2VudFZpZXcoaWQ6IHN0cmluZywgb3B0aW9ucz86IHthY3RpdmF0ZVBhcnQ/OiBib29sZWFufSk6IMm1V29ya2JlbmNoTGF5b3V0IHtcbiAgICBjb25zdCB3b3JraW5nQ29weSA9IHRoaXMud29ya2luZ0NvcHkoKTtcbiAgICB3b3JraW5nQ29weS52aWV3cyh7aWR9LCB7b3JFbHNlOiAndGhyb3dFcnJvcid9KS5mb3JFYWNoKHZpZXcgPT4gd29ya2luZ0NvcHkuX19hY3RpdmF0ZUFkamFjZW50Vmlldyh2aWV3LCBvcHRpb25zKSk7XG4gICAgcmV0dXJuIHdvcmtpbmdDb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmFtZXMgYSB2aWV3LlxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHZpZXcgd2hpY2ggdG8gcmVuYW1lLlxuICAgKiBAcGFyYW0gbmV3Vmlld0lkIC0gVGhlIG5ldyBpZGVudGl0eSBvZiB0aGUgdmlldy5cbiAgICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBsYXlvdXQgd2l0aCB0aGUgdmlldyByZW5hbWVkLlxuICAgKi9cbiAgcHVibGljIHJlbmFtZVZpZXcoaWQ6IFZpZXdJZCwgbmV3Vmlld0lkOiBWaWV3SWQpOiDJtVdvcmtiZW5jaExheW91dCB7XG4gICAgY29uc3Qgd29ya2luZ0NvcHkgPSB0aGlzLndvcmtpbmdDb3B5KCk7XG4gICAgd29ya2luZ0NvcHkuX19yZW5hbWVWaWV3KHdvcmtpbmdDb3B5LnZpZXcoe3ZpZXdJZDogaWR9KSwgbmV3Vmlld0lkKTtcbiAgICByZXR1cm4gd29ya2luZ0NvcHk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3BsaXQgcmF0aW8gZm9yIHRoZSB0d28gY2hpbGRyZW4gb2YgYSB7QGxpbmsgTVRyZWVOb2RlfS5cbiAgICpcbiAgICogQHBhcmFtIG5vZGVJZCAtIFRoZSBpZCBvZiB0aGUgbm9kZSB0byBzZXQgdGhlIHNwbGl0IHJhdGlvIGZvci5cbiAgICogQHBhcmFtIHJhdGlvIC0gVGhlIHByb3BvcnRpb25hbCBzaXplIGJldHdlZW4gdGhlIHR3byBjaGlsZHJlbiwgZXhwcmVzc2VkIGFzIGNsb3NlZCBpbnRlcnZhbCBbMCwxXS5cbiAgICogICAgICAgICAgICAgICAgRXhhbXBsZTogVG8gZ2l2ZSAxLzMgb2YgdGhlIHNwYWNlIHRvIHRoZSBmaXJzdCBjaGlsZCwgc2V0IHRoZSByYXRpbyB0byBgMC4zYC5cbiAgICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBsYXlvdXQgd2l0aCB0aGUgc3BsaXQgcmF0aW8gc2V0LlxuICAgKi9cbiAgcHVibGljIHNldFNwbGl0UmF0aW8obm9kZUlkOiBzdHJpbmcsIHJhdGlvOiBudW1iZXIpOiDJtVdvcmtiZW5jaExheW91dCB7XG4gICAgY29uc3Qgd29ya2luZ0NvcHkgPSB0aGlzLndvcmtpbmdDb3B5KCk7XG4gICAgd29ya2luZ0NvcHkuX19zZXRTcGxpdFJhdGlvKG5vZGVJZCwgcmF0aW8pO1xuICAgIHJldHVybiB3b3JraW5nQ29weTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHRoaXMgbGF5b3V0IGludG8gYSBVUkwtc2FmZSBiYXNlNjQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIHNlcmlhbGl6ZShmbGFncz86IEdyaWRTZXJpYWxpemF0aW9uRmxhZ3MpOiBTZXJpYWxpemVkV29ya2JlbmNoTGF5b3V0IHtcbiAgICBjb25zdCBpc01haW5BcmVhRW1wdHkgPSAodGhpcy5tYWluQXJlYUdyaWQ/LnJvb3QgaW5zdGFuY2VvZiBNUGFydCAmJiB0aGlzLm1haW5BcmVhR3JpZC5yb290LnZpZXdzLmxlbmd0aCA9PT0gMCkgPz8gdHJ1ZTtcbiAgICByZXR1cm4ge1xuICAgICAgd29ya2JlbmNoR3JpZDogdGhpcy5fc2VyaWFsaXplci5zZXJpYWxpemVHcmlkKHRoaXMud29ya2JlbmNoR3JpZCwgZmxhZ3MpLFxuICAgICAgbWFpbkFyZWFHcmlkOiBpc01haW5BcmVhRW1wdHkgPyBudWxsIDogdGhpcy5fc2VyaWFsaXplci5zZXJpYWxpemVHcmlkKHRoaXMuX2dyaWRzLm1haW5BcmVhLCBmbGFncyksXG4gICAgICB3b3JrYmVuY2hWaWV3T3V0bGV0czogdGhpcy5fc2VyaWFsaXplci5zZXJpYWxpemVWaWV3T3V0bGV0cyh0aGlzLnZpZXdPdXRsZXRzKHtncmlkOiAnd29ya2JlbmNoJ30pKSxcbiAgICAgIG1haW5BcmVhVmlld091dGxldHM6IHRoaXMuX3NlcmlhbGl6ZXIuc2VyaWFsaXplVmlld091dGxldHModGhpcy52aWV3T3V0bGV0cyh7Z3JpZDogJ21haW5BcmVhJ30pKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBuZXh0IGF2YWlsYWJsZSB2aWV3IGlkLlxuICAgKi9cbiAgcHVibGljIGNvbXB1dGVOZXh0Vmlld0lkKCk6IFZpZXdJZCB7XG4gICAgcmV0dXJuIFdvcmtiZW5jaExheW91dHMuY29tcHV0ZU5leHRWaWV3SWQodGhpcy52aWV3cygpLm1hcCh2aWV3ID0+IHZpZXcuaWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoIHVuZGVyc2NvcmVzLCBpbmRpY2F0aW5nIHRoYXQgaXQgZG9lcyBub3Qgb3BlcmF0ZSBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmaWVzIHRoaXMgbGF5b3V0IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIF9fYWRkUGFydChpZDogc3RyaW5nLCByZWxhdGl2ZVRvOiBSZWZlcmVuY2VFbGVtZW50LCBvcHRpb25zPzoge2FjdGl2YXRlPzogYm9vbGVhbjsgc3RydWN0dXJhbD86IGJvb2xlYW59KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzUGFydChpZCkpIHtcbiAgICAgIHRocm93IEVycm9yKGBbUGFydEFkZEVycm9yXSBQYXJ0IGlkIG11c3QgYmUgdW5pcXVlLiBUaGUgbGF5b3V0IGFscmVhZHkgY29udGFpbnMgYSBwYXJ0IHdpdGggdGhlIGlkICcke2lkfScuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UGFydCA9IG5ldyBNUGFydCh7aWQsIHN0cnVjdHVyYWw6IG9wdGlvbnM/LnN0cnVjdHVyYWwgPz8gdHJ1ZSwgdmlld3M6IFtdfSk7XG5cbiAgICAvLyBGaW5kIHRoZSByZWZlcmVuY2UgZWxlbWVudCwgaWYgc3BlY2lmaWVkLCBvciB1c2UgdGhlIGxheW91dCByb290IGFzIHJlZmVyZW5jZSBvdGhlcndpc2UuXG4gICAgY29uc3QgcmVmZXJlbmNlRWxlbWVudCA9IHJlbGF0aXZlVG8ucmVsYXRpdmVUbyA/IHRoaXMuZmluZFRyZWVFbGVtZW50KHtpZDogcmVsYXRpdmVUby5yZWxhdGl2ZVRvfSkgOiB0aGlzLndvcmtiZW5jaEdyaWQucm9vdDtcbiAgICBjb25zdCBhZGRCZWZvcmUgPSByZWxhdGl2ZVRvLmFsaWduID09PSAnbGVmdCcgfHwgcmVsYXRpdmVUby5hbGlnbiA9PT0gJ3RvcCc7XG4gICAgY29uc3QgcmF0aW8gPSByZWxhdGl2ZVRvLnJhdGlvID8/IC41O1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHRyZWUgbm9kZS5cbiAgICBjb25zdCBuZXdUcmVlTm9kZTogTVRyZWVOb2RlID0gbmV3IE1UcmVlTm9kZSh7XG4gICAgICBpZDogVUlELnJhbmRvbVVJRCgpLFxuICAgICAgY2hpbGQxOiBhZGRCZWZvcmUgPyBuZXdQYXJ0IDogcmVmZXJlbmNlRWxlbWVudCxcbiAgICAgIGNoaWxkMjogYWRkQmVmb3JlID8gcmVmZXJlbmNlRWxlbWVudCA6IG5ld1BhcnQsXG4gICAgICBkaXJlY3Rpb246IHJlbGF0aXZlVG8uYWxpZ24gPT09ICdsZWZ0JyB8fCByZWxhdGl2ZVRvLmFsaWduID09PSAncmlnaHQnID8gJ3JvdycgOiAnY29sdW1uJyxcbiAgICAgIHJhdGlvOiBhZGRCZWZvcmUgPyByYXRpbyA6IDEgLSByYXRpbyxcbiAgICAgIHBhcmVudDogcmVmZXJlbmNlRWxlbWVudC5wYXJlbnQsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdGhlIHRyZWUgbm9kZSB0byB0aGUgbGF5b3V0LlxuICAgIGlmICghcmVmZXJlbmNlRWxlbWVudC5wYXJlbnQpIHtcbiAgICAgIHRoaXMuZ3JpZCh7ZWxlbWVudDogcmVmZXJlbmNlRWxlbWVudH0pLnJvb3QgPSBuZXdUcmVlTm9kZTsgLy8gdG9wLWxldmVsIG5vZGVcbiAgICB9XG4gICAgZWxzZSBpZiAocmVmZXJlbmNlRWxlbWVudC5wYXJlbnQuY2hpbGQxID09PSByZWZlcmVuY2VFbGVtZW50KSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50LnBhcmVudC5jaGlsZDEgPSBuZXdUcmVlTm9kZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50LnBhcmVudC5jaGlsZDIgPSBuZXdUcmVlTm9kZTtcbiAgICB9XG4gICAgcmVmZXJlbmNlRWxlbWVudC5wYXJlbnQgPSBuZXdUcmVlTm9kZTtcbiAgICBuZXdQYXJ0LnBhcmVudCA9IG5ld1RyZWVOb2RlO1xuXG4gICAgLy8gQWN0aXZhdGUgdGhlIHBhcnQuXG4gICAgaWYgKG9wdGlvbnM/LmFjdGl2YXRlKSB7XG4gICAgICB0aGlzLl9fYWN0aXZhdGVQYXJ0KG5ld1BhcnQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoIHVuZGVyc2NvcmVzLCBpbmRpY2F0aW5nIHRoYXQgaXQgZG9lcyBub3Qgb3BlcmF0ZSBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmaWVzIHRoaXMgbGF5b3V0IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIF9fcmVtb3ZlUGFydChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGFydCA9IHRoaXMucGFydCh7cGFydElkOiBpZH0pO1xuICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQoe2VsZW1lbnQ6IHBhcnR9KTtcbiAgICBjb25zdCBncmlkTmFtZSA9IHRoaXMuX2dyaWROYW1lcy5maW5kKGdyaWROYW1lID0+IHRoaXMuX2dyaWRzW2dyaWROYW1lXSA9PT0gZ3JpZCk7XG5cbiAgICAvLyBUaGUgbGFzdCBwYXJ0IGlzIG5ldmVyIHJlbW92ZWQuXG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKHtncmlkOiBncmlkTmFtZX0pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBhcnQuXG4gICAgY29uc3Qgc2libGluZ0VsZW1lbnQgPSAocGFydC5wYXJlbnQhLmNoaWxkMSA9PT0gcGFydCA/IHBhcnQucGFyZW50IS5jaGlsZDIgOiBwYXJ0LnBhcmVudCEuY2hpbGQxKTtcbiAgICBpZiAoIXBhcnQucGFyZW50IS5wYXJlbnQpIHtcbiAgICAgIGdyaWQucm9vdCA9IHNpYmxpbmdFbGVtZW50O1xuICAgICAgZ3JpZC5yb290LnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFydC5wYXJlbnQhLnBhcmVudC5jaGlsZDEgPT09IHBhcnQucGFyZW50KSB7XG4gICAgICBwYXJ0LnBhcmVudCEucGFyZW50LmNoaWxkMSA9IHNpYmxpbmdFbGVtZW50O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHBhcnQucGFyZW50IS5wYXJlbnQuY2hpbGQyID0gc2libGluZ0VsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIG91dGxldHMgYW5kIHN0YXRlcyBvZiB2aWV3cyBjb250YWluZWQgaW4gdGhlIHBhcnQuXG4gICAgcGFydC52aWV3cy5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgdGhpcy5fdmlld091dGxldHMuZGVsZXRlKHZpZXcuaWQpO1xuICAgICAgdGhpcy5fbmF2aWdhdGlvblN0YXRlcy5kZWxldGUodmlldy5pZCk7XG4gICAgfSk7XG5cbiAgICAvLyBJZiB0aGUgcmVtb3ZlZCBwYXJ0IHdhcyB0aGUgYWN0aXZlIHBhcnQsIG1ha2UgdGhlIGxhc3QgdXNlZCBwYXJ0IHRoZSBhY3RpdmUgcGFydC5cbiAgICBpZiAoZ3JpZC5hY3RpdmVQYXJ0SWQgPT09IGlkKSB7XG4gICAgICBjb25zdCBhY3RpdmVQYXJ0ID0gcGFydHNcbiAgICAgICAgLmZpbHRlcihwYXJ0ID0+IHBhcnQuaWQgIT09IGlkKVxuICAgICAgICAuc29ydCgocGFydDEsIHBhcnQyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWN0aXZhdGlvbkluc3RhbnRQYXJ0MSA9IHRoaXMuX3BhcnRBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyLmdldEFjdGl2YXRpb25JbnN0YW50KHBhcnQxLmlkKTtcbiAgICAgICAgICBjb25zdCBhY3RpdmF0aW9uSW5zdGFudFBhcnQyID0gdGhpcy5fcGFydEFjdGl2YXRpb25JbnN0YW50UHJvdmlkZXIuZ2V0QWN0aXZhdGlvbkluc3RhbnQocGFydDIuaWQpO1xuICAgICAgICAgIHJldHVybiBhY3RpdmF0aW9uSW5zdGFudFBhcnQyIC0gYWN0aXZhdGlvbkluc3RhbnRQYXJ0MTtcbiAgICAgICAgfSlbMF07XG4gICAgICBncmlkLmFjdGl2ZVBhcnRJZCA9IGFjdGl2ZVBhcnQhLmlkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoIHVuZGVyc2NvcmVzLCBpbmRpY2F0aW5nIHRoYXQgaXQgZG9lcyBub3Qgb3BlcmF0ZSBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmaWVzIHRoaXMgbGF5b3V0IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIF9fYWRkVmlldyh2aWV3OiBNVmlldywgb3B0aW9uczoge3BhcnRJZDogc3RyaW5nOyBwb3NpdGlvbj86IG51bWJlciB8ICdzdGFydCcgfCAnZW5kJyB8ICdiZWZvcmUtYWN0aXZlLXZpZXcnIHwgJ2FmdGVyLWFjdGl2ZS12aWV3JzsgYWN0aXZhdGVWaWV3PzogYm9vbGVhbjsgYWN0aXZhdGVQYXJ0PzogYm9vbGVhbjsgY3NzQ2xhc3M/OiBzdHJpbmcgfCBzdHJpbmdbXX0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNWaWV3KHZpZXcuaWQpKSB7XG4gICAgICB0aHJvdyBFcnJvcihgW1ZpZXdBZGRFcnJvcl0gVmlldyBpZCBtdXN0IGJlIHVuaXF1ZS4gVGhlIGxheW91dCBhbHJlYWR5IGNvbnRhaW5zIGEgdmlldyB3aXRoIHRoZSBpZCAnJHt2aWV3LmlkfScuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydCA9IHRoaXMucGFydCh7cGFydElkOiBvcHRpb25zLnBhcnRJZH0pO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gY29lcmNlUG9zaXRpb24ob3B0aW9ucy5wb3NpdGlvbiA/PyAnZW5kJywgcGFydCk7XG4gICAgcGFydC52aWV3cy5zcGxpY2UocG9zaXRpb24sIDAsIHZpZXcpO1xuXG4gICAgaWYgKG9wdGlvbnMuYWN0aXZhdGVWaWV3KSB7XG4gICAgICB0aGlzLl9fYWN0aXZhdGVWaWV3KHZpZXcpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5hY3RpdmF0ZVBhcnQpIHtcbiAgICAgIHRoaXMuX19hY3RpdmF0ZVBhcnQob3B0aW9ucy5wYXJ0SWQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jc3NDbGFzcykge1xuICAgICAgdmlldy5jc3NDbGFzcyA9IEFycmF5cy5jb2VyY2Uob3B0aW9ucy5jc3NDbGFzcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIG5hbWUgYmVnaW5zIHdpdGggdW5kZXJzY29yZXMsIGluZGljYXRpbmcgdGhhdCBpdCBkb2VzIG5vdCBvcGVyYXRlIG9uIGEgd29ya2luZyBjb3B5LCBidXQgbW9kaWZpZXMgdGhpcyBsYXlvdXQgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgX19uYXZpZ2F0ZVZpZXcodmlldzogTVZpZXcsIGNvbW1hbmRzOiBDb21tYW5kcywgZXh0cmFzPzoge2hpbnQ/OiBzdHJpbmc7IHJlbGF0aXZlVG8/OiBBY3RpdmF0ZWRSb3V0ZSB8IG51bGw7IGRhdGE/OiBOYXZpZ2F0aW9uRGF0YTsgc3RhdGU/OiBOYXZpZ2F0aW9uU3RhdGU7IGNzc0NsYXNzPzogc3RyaW5nIHwgc3RyaW5nW119KTogdm9pZCB7XG4gICAgaWYgKCFjb21tYW5kcy5sZW5ndGggJiYgIWV4dHJhcz8uaGludCAmJiAhZXh0cmFzPy5yZWxhdGl2ZVRvKSB7XG4gICAgICB0aHJvdyBFcnJvcignW05hdmlnYXRlRXJyb3JdIENvbW1hbmRzLCByZWxhdGl2ZVRvIG9yIGhpbnQgbXVzdCBiZSBzZXQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsU2VnbWVudHMgPSBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IsICgpID0+IFJvdXRpbmcuY29tbWFuZHNUb1NlZ21lbnRzKGNvbW1hbmRzLCB7cmVsYXRpdmVUbzogZXh0cmFzPy5yZWxhdGl2ZVRvfSkpO1xuICAgIGlmICh1cmxTZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3ZpZXdPdXRsZXRzLnNldCh2aWV3LmlkLCB1cmxTZWdtZW50cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5fdmlld091dGxldHMuZGVsZXRlKHZpZXcuaWQpO1xuICAgIH1cblxuICAgIGlmIChleHRyYXM/LnN0YXRlICYmIE9iamVjdHMua2V5cyhleHRyYXMuc3RhdGUpLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbmF2aWdhdGlvblN0YXRlcy5zZXQodmlldy5pZCwgZXh0cmFzLnN0YXRlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9uYXZpZ2F0aW9uU3RhdGVzLmRlbGV0ZSh2aWV3LmlkKTtcbiAgICB9XG5cbiAgICB2aWV3Lm5hdmlnYXRpb24gPSBPYmplY3RzLndpdGhvdXRVbmRlZmluZWRFbnRyaWVzKHtcbiAgICAgIGlkOiBVSUQucmFuZG9tVUlEKCksXG4gICAgICBoaW50OiBleHRyYXM/LmhpbnQsXG4gICAgICBkYXRhOiBleHRyYXM/LmRhdGEsXG4gICAgICBjc3NDbGFzczogZXh0cmFzPy5jc3NDbGFzcyA/IEFycmF5cy5jb2VyY2UoZXh0cmFzLmNzc0NsYXNzKSA6IHVuZGVmaW5lZCxcbiAgICB9IHNhdGlzZmllcyBNVmlld1snbmF2aWdhdGlvbiddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoIHVuZGVyc2NvcmVzLCBpbmRpY2F0aW5nIHRoYXQgaXQgZG9lcyBub3Qgb3BlcmF0ZSBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmaWVzIHRoaXMgbGF5b3V0IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIF9fbW92ZVZpZXcodmlldzogTVZpZXcsIHRhcmdldFBhcnRJZDogc3RyaW5nLCBvcHRpb25zPzoge3Bvc2l0aW9uPzogbnVtYmVyIHwgJ3N0YXJ0JyB8ICdlbmQnIHwgJ2JlZm9yZS1hY3RpdmUtdmlldycgfCAnYWZ0ZXItYWN0aXZlLXZpZXcnOyBhY3RpdmF0ZVZpZXc/OiBib29sZWFuOyBhY3RpdmF0ZVBhcnQ/OiBib29sZWFufSk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZVBhcnQgPSB0aGlzLnBhcnQoe3ZpZXdJZDogdmlldy5pZH0pO1xuICAgIGNvbnN0IHRhcmdldFBhcnQgPSB0aGlzLnBhcnQoe3BhcnRJZDogdGFyZ2V0UGFydElkfSk7XG5cbiAgICAvLyBNb3ZlIHRoZSB2aWV3LlxuICAgIGlmIChzb3VyY2VQYXJ0ICE9PSB0YXJnZXRQYXJ0KSB7XG4gICAgICB0aGlzLl9fcmVtb3ZlVmlldyh2aWV3LCB7cmVtb3ZlT3V0bGV0OiBmYWxzZSwgcmVtb3ZlTmF2aWdhdGlvblN0YXRlOiBmYWxzZSwgZm9yY2U6IHRydWV9KTtcbiAgICAgIHRoaXMuX19hZGRWaWV3KHZpZXcsIHtwYXJ0SWQ6IHRhcmdldFBhcnRJZCwgcG9zaXRpb246IG9wdGlvbnM/LnBvc2l0aW9ufSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnM/LnBvc2l0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gY29lcmNlUG9zaXRpb24ob3B0aW9ucy5wb3NpdGlvbiwgdGFyZ2V0UGFydCk7XG4gICAgICBjb25zdCByZWZlcmVuY2VWaWV3OiBNVmlldyB8IHVuZGVmaW5lZCA9IHNvdXJjZVBhcnQudmlld3MuYXQocG9zaXRpb24pO1xuICAgICAgc291cmNlUGFydC52aWV3cy5zcGxpY2Uoc291cmNlUGFydC52aWV3cy5pbmRleE9mKHZpZXcpLCAxKTtcbiAgICAgIHNvdXJjZVBhcnQudmlld3Muc3BsaWNlKHJlZmVyZW5jZVZpZXcgPyBzb3VyY2VQYXJ0LnZpZXdzLmluZGV4T2YocmVmZXJlbmNlVmlldykgOiBzb3VyY2VQYXJ0LnZpZXdzLmxlbmd0aCwgMCwgdmlldyk7XG4gICAgfVxuXG4gICAgLy8gQWN0aXZhdGUgdmlldyBhbmQgcGFydC5cbiAgICBpZiAob3B0aW9ucz8uYWN0aXZhdGVQYXJ0KSB7XG4gICAgICB0aGlzLl9fYWN0aXZhdGVQYXJ0KHRhcmdldFBhcnRJZCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy5hY3RpdmF0ZVZpZXcpIHtcbiAgICAgIHRoaXMuX19hY3RpdmF0ZVZpZXcodmlldyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIG5hbWUgYmVnaW5zIHdpdGggdW5kZXJzY29yZXMsIGluZGljYXRpbmcgdGhhdCBpdCBkb2VzIG5vdCBvcGVyYXRlIG9uIGEgd29ya2luZyBjb3B5LCBidXQgbW9kaWZpZXMgdGhpcyBsYXlvdXQgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgX19yZW1vdmVWaWV3KHZpZXc6IE1WaWV3LCBvcHRpb25zPzoge3JlbW92ZU91dGxldD86IGZhbHNlOyByZW1vdmVOYXZpZ2F0aW9uU3RhdGU/OiBmYWxzZTsgZm9yY2U/OiBib29sZWFufSk6IHZvaWQge1xuICAgIGlmICghb3B0aW9ucz8uZm9yY2UpIHtcbiAgICAgIHZpZXcubWFya2VkRm9yUmVtb3ZhbCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFydCA9IHRoaXMucGFydCh7dmlld0lkOiB2aWV3LmlkfSk7XG5cbiAgICAvLyBSZW1vdmUgdmlldy5cbiAgICBwYXJ0LnZpZXdzLnNwbGljZShwYXJ0LnZpZXdzLmluZGV4T2YodmlldyksIDEpO1xuXG4gICAgLy8gUmVtb3ZlIG91dGxldC5cbiAgICBpZiAob3B0aW9ucz8ucmVtb3ZlT3V0bGV0ID8/IHRydWUpIHtcbiAgICAgIHRoaXMuX3ZpZXdPdXRsZXRzLmRlbGV0ZSh2aWV3LmlkKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgc3RhdGUuXG4gICAgaWYgKG9wdGlvbnM/LnJlbW92ZU5hdmlnYXRpb25TdGF0ZSA/PyB0cnVlKSB7XG4gICAgICB0aGlzLl9uYXZpZ2F0aW9uU3RhdGVzLmRlbGV0ZSh2aWV3LmlkKTtcbiAgICB9XG5cbiAgICAvLyBBY3RpdmF0ZSB0aGUgbGFzdCB1c2VkIHZpZXcgaWYgdGhpcyB2aWV3IHdhcyBhY3RpdmUuXG4gICAgaWYgKHBhcnQuYWN0aXZlVmlld0lkID09PSB2aWV3LmlkKSB7XG4gICAgICBwYXJ0LmFjdGl2ZVZpZXdJZCA9IHBhcnQudmlld3NcbiAgICAgICAgLm1hcCh2aWV3ID0+IHZpZXcuaWQpXG4gICAgICAgIC5zb3J0KCh2aWV3SWQxLCB2aWV3SWQyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWN0aXZhdGlvbkluc3RhbnRWaWV3MSA9IHRoaXMuX3ZpZXdBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyLmdldEFjdGl2YXRpb25JbnN0YW50KHZpZXdJZDEpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2YXRpb25JbnN0YW50VmlldzIgPSB0aGlzLl92aWV3QWN0aXZhdGlvbkluc3RhbnRQcm92aWRlci5nZXRBY3RpdmF0aW9uSW5zdGFudCh2aWV3SWQyKTtcbiAgICAgICAgICByZXR1cm4gYWN0aXZhdGlvbkluc3RhbnRWaWV3MiAtIGFjdGl2YXRpb25JbnN0YW50VmlldzE7XG4gICAgICAgIH0pLmF0KDApO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgcGFydCBpZiB0aGlzIGlzIHRoZSBsYXN0IHZpZXcgb2YgdGhlIHBhcnQgYW5kIG5vdCBhIHN0cnVjdHVyYWwgcGFydC5cbiAgICBpZiAocGFydC52aWV3cy5sZW5ndGggPT09IDAgJiYgIXBhcnQuc3RydWN0dXJhbCkge1xuICAgICAgdGhpcy5fX3JlbW92ZVBhcnQocGFydC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIG5hbWUgYmVnaW5zIHdpdGggdW5kZXJzY29yZXMsIGluZGljYXRpbmcgdGhhdCBpdCBkb2VzIG5vdCBvcGVyYXRlIG9uIGEgd29ya2luZyBjb3B5LCBidXQgbW9kaWZpZXMgdGhpcyBsYXlvdXQgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgX19hY3RpdmF0ZVZpZXcodmlldzogTVZpZXcsIG9wdGlvbnM/OiB7YWN0aXZhdGVQYXJ0PzogYm9vbGVhbn0pOiB2b2lkIHtcbiAgICAvLyBBY3RpdmF0ZSB0aGUgdmlldy5cbiAgICBjb25zdCBwYXJ0ID0gdGhpcy5wYXJ0KHt2aWV3SWQ6IHZpZXcuaWR9KTtcbiAgICBwYXJ0LmFjdGl2ZVZpZXdJZCA9IHZpZXcuaWQ7XG5cbiAgICAvLyBBY3RpdmF0ZSB0aGUgcGFydC5cbiAgICBpZiAob3B0aW9ucz8uYWN0aXZhdGVQYXJ0KSB7XG4gICAgICB0aGlzLl9fYWN0aXZhdGVQYXJ0KHBhcnQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoIHVuZGVyc2NvcmVzLCBpbmRpY2F0aW5nIHRoYXQgaXQgZG9lcyBub3Qgb3BlcmF0ZSBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmaWVzIHRoaXMgbGF5b3V0IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIF9fYWN0aXZhdGVBZGphY2VudFZpZXcodmlldzogTVZpZXcsIG9wdGlvbnM/OiB7YWN0aXZhdGVQYXJ0PzogYm9vbGVhbn0pOiB2b2lkIHtcbiAgICBjb25zdCBwYXJ0ID0gdGhpcy5wYXJ0KHt2aWV3SWQ6IHZpZXcuaWR9KTtcbiAgICBjb25zdCB2aWV3SW5kZXggPSBwYXJ0LnZpZXdzLmluZGV4T2Yodmlldyk7XG4gICAgcGFydC5hY3RpdmVWaWV3SWQgPSAocGFydC52aWV3c1t2aWV3SW5kZXggLSAxXSB8fCBwYXJ0LnZpZXdzW3ZpZXdJbmRleCArIDFdKT8uaWQ7IC8vIGlzIGB1bmRlZmluZWRgIGlmIGl0IGlzIHRoZSBsYXN0IHZpZXcgb2YgdGhlIHBhcnRcblxuICAgIC8vIEFjdGl2YXRlIHRoZSBwYXJ0LlxuICAgIGlmIChvcHRpb25zPy5hY3RpdmF0ZVBhcnQpIHtcbiAgICAgIHRoaXMuX19hY3RpdmF0ZVBhcnQocGFydC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIG5hbWUgYmVnaW5zIHdpdGggdW5kZXJzY29yZXMsIGluZGljYXRpbmcgdGhhdCBpdCBkb2VzIG5vdCBvcGVyYXRlIG9uIGEgd29ya2luZyBjb3B5LCBidXQgbW9kaWZpZXMgdGhpcyBsYXlvdXQgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgX19zZXRTcGxpdFJhdGlvKG5vZGVJZDogc3RyaW5nLCByYXRpbzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHJhdGlvIDwgMCB8fCByYXRpbyA+IDEpIHtcbiAgICAgIHRocm93IEVycm9yKGBbTGF5b3V0TW9kaWZ5RXJyb3JdIFJhdGlvIGZvciBub2RlICcke25vZGVJZH0nIG11c3QgYmUgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBbMCwxXSwgYnV0IHdhcyAnJHtyYXRpb30nLmApO1xuICAgIH1cbiAgICB0aGlzLmZpbmRUcmVlRWxlbWVudDxNVHJlZU5vZGU+KHtpZDogbm9kZUlkfSkucmF0aW8gPSByYXRpbztcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoIHVuZGVyc2NvcmVzLCBpbmRpY2F0aW5nIHRoYXQgaXQgZG9lcyBub3Qgb3BlcmF0ZSBvbiBhIHdvcmtpbmcgY29weSwgYnV0IG1vZGlmaWVzIHRoaXMgbGF5b3V0IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIF9fYWN0aXZhdGVQYXJ0KGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJ0ID0gdGhpcy5wYXJ0KHtwYXJ0SWQ6IGlkfSk7XG4gICAgdGhpcy5ncmlkKHtlbGVtZW50OiBwYXJ0fSkuYWN0aXZlUGFydElkID0gaWQ7XG4gIH1cblxuICAvKipcbiAgICogTm90ZTogVGhpcyBtZXRob2QgbmFtZSBiZWdpbnMgd2l0aCB1bmRlcnNjb3JlcywgaW5kaWNhdGluZyB0aGF0IGl0IGRvZXMgbm90IG9wZXJhdGUgb24gYSB3b3JraW5nIGNvcHksIGJ1dCBtb2RpZmllcyB0aGlzIGxheW91dCBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBfX3RvZ2dsZU1heGltaXplZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9tYXhpbWl6ZWQgPSAhdGhpcy5fbWF4aW1pemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIG5hbWUgYmVnaW5zIHdpdGggdW5kZXJzY29yZXMsIGluZGljYXRpbmcgdGhhdCBpdCBkb2VzIG5vdCBvcGVyYXRlIG9uIGEgd29ya2luZyBjb3B5LCBidXQgbW9kaWZpZXMgdGhpcyBsYXlvdXQgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgX19yZW5hbWVWaWV3KHZpZXc6IE1WaWV3LCBuZXdWaWV3SWQ6IFZpZXdJZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1ZpZXcobmV3Vmlld0lkKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYFtWaWV3UmVuYW1lRXJyb3JdIFZpZXcgaWQgbXVzdCBiZSB1bmlxdWUuIFRoZSBsYXlvdXQgYWxyZWFkeSBjb250YWlucyBhIHZpZXcgd2l0aCB0aGUgaWQgJyR7bmV3Vmlld0lkfScuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydCA9IHRoaXMucGFydCh7dmlld0lkOiB2aWV3LmlkfSk7XG5cbiAgICBpZiAodGhpcy5fdmlld091dGxldHMuaGFzKHZpZXcuaWQpKSB7XG4gICAgICB0aGlzLl92aWV3T3V0bGV0cy5zZXQobmV3Vmlld0lkLCB0aGlzLl92aWV3T3V0bGV0cy5nZXQodmlldy5pZCkhKTtcbiAgICAgIHRoaXMuX3ZpZXdPdXRsZXRzLmRlbGV0ZSh2aWV3LmlkKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX25hdmlnYXRpb25TdGF0ZXMuaGFzKHZpZXcuaWQpKSB7XG4gICAgICB0aGlzLl9uYXZpZ2F0aW9uU3RhdGVzLnNldChuZXdWaWV3SWQsIHRoaXMuX25hdmlnYXRpb25TdGF0ZXMuZ2V0KHZpZXcuaWQpISk7XG4gICAgICB0aGlzLl9uYXZpZ2F0aW9uU3RhdGVzLmRlbGV0ZSh2aWV3LmlkKTtcbiAgICB9XG5cbiAgICBpZiAocGFydC5hY3RpdmVWaWV3SWQgPT09IHZpZXcuaWQpIHtcbiAgICAgIHBhcnQuYWN0aXZlVmlld0lkID0gbmV3Vmlld0lkO1xuICAgIH1cblxuICAgIHZpZXcuaWQgPSBuZXdWaWV3SWQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBncmlkIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgZmlsdGVyLiBJZiBub3QgZm91bmQsIHRocm93cyBhbiBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIGZpbmRCeSAtIERlZmluZXMgdGhlIHNlYXJjaCBzY29wZS5cbiAgICogQHBhcmFtIGZpbmRCeS5lbGVtZW50IC0gU2VhcmNoZXMgZm9yIGEgZ3JpZCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICogQHJldHVybiBHcmlkIG1hdGNoaW5nIHRoZSBmaWx0ZXIgY3JpdGVyaWEuXG4gICAqL1xuICBwcml2YXRlIGdyaWQoZmluZEJ5OiB7ZWxlbWVudDogTVBhcnQgfCBNVHJlZU5vZGV9KTogTVBhcnRHcmlkIHtcbiAgICBjb25zdCBncmlkTmFtZSA9IHRoaXMuX2dyaWROYW1lcy5maW5kKGdyaWROYW1lID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmZpbmRUcmVlRWxlbWVudHMoKGVsZW1lbnQ6IE1UcmVlTm9kZSB8IE1QYXJ0KTogZWxlbWVudCBpcyBNUGFydCB8IE1UcmVlTm9kZSA9PiBlbGVtZW50ID09PSBmaW5kQnkuZWxlbWVudCwge2ZpbmRGaXJzdDogdHJ1ZSwgZ3JpZDogZ3JpZE5hbWV9KS5sZW5ndGggPiAwO1xuICAgIH0pO1xuXG4gICAgaWYgKCFncmlkTmFtZSkge1xuICAgICAgdGhyb3cgRXJyb3IoYFtOdWxsR3JpZEVycm9yXSBObyBncmlkIGZvdW5kIHRoYXQgY29udGFpbnMgdGhlICR7ZmluZEJ5LmVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCA/ICdwYXJ0JyA6ICdub2RlJ30gJyR7ZmluZEJ5LmVsZW1lbnQuaWR9J1wiLmApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkc1tncmlkTmFtZV0hO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlcyB0aGUgdHJlZSB0byBmaW5kIGFuIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBmaW5kQnkgLSBEZWZpbmVzIHRoZSBzZWFyY2ggc2NvcGUuXG4gICAqIEBwYXJhbSBmaW5kQnkuaWQgLSBTZWFyY2hlcyBmb3IgYW4gZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuXG4gICAqIEByZXR1cm4gRWxlbWVudCBtYXRjaGluZyB0aGUgZmlsdGVyIGNyaXRlcmlhLlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kVHJlZUVsZW1lbnQ8VCBleHRlbmRzIE1UcmVlTm9kZSB8IE1QYXJ0PihmaW5kQnk6IHtpZDogc3RyaW5nfSk6IFQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZpbmRUcmVlRWxlbWVudHMoKGVsZW1lbnQ6IE1UcmVlTm9kZSB8IE1QYXJ0KTogZWxlbWVudCBpcyBUID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50LmlkID09PSBmaW5kQnkuaWQ7XG4gICAgfSwge2ZpbmRGaXJzdDogdHJ1ZX0pLmF0KDApO1xuXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICB0aHJvdyBFcnJvcihgW051bGxFbGVtZW50RXJyb3JdIE5vIGVsZW1lbnQgZm91bmQgd2l0aCBpZCAnJHtmaW5kQnkuaWR9Jy5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogVHJhdmVyc2VzIHRoZSB0cmVlIHRvIGZpbmQgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gcHJlZGljYXRlRm4gLSBQcmVkaWNhdGUgZnVuY3Rpb24gdG8gbWF0Y2guXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRGVmaW5lcyBzZWFyY2ggc2NvcGUgYW5kIG9wdGlvbnMuXG4gICAqIEBwYXJhbSBvcHRpb25zLmZpbmRGaXJzdCAtIElmIHNwZWNpZmllZCwgc3RvcHMgdHJhdmVyc2luZyBvbiBmaXJzdCBtYXRjaC4gSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICogQHBhcmFtIG9wdGlvbnMuZ3JpZCAtIFNlYXJjaGVzIGZvciBhbiBlbGVtZW50IGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIGdyaWQuXG4gICAqIEByZXR1cm4gRWxlbWVudHMgbWF0Y2hpbmcgdGhlIGZpbHRlciBjcml0ZXJpYS5cbiAgICovXG4gIHByaXZhdGUgZmluZFRyZWVFbGVtZW50czxUIGV4dGVuZHMgTVRyZWVOb2RlIHwgTVBhcnQ+KHByZWRpY2F0ZUZuOiAoZWxlbWVudDogTVRyZWVOb2RlIHwgTVBhcnQpID0+IGVsZW1lbnQgaXMgVCwgb3B0aW9ucz86IHtmaW5kRmlyc3Q/OiBib29sZWFuOyBncmlkPzoga2V5b2YgR3JpZHN9KTogVFtdIHtcbiAgICBpZiAob3B0aW9ucz8uZ3JpZCAmJiAhdGhpcy5fZ3JpZHNbb3B0aW9ucy5ncmlkXSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogVFtdID0gW107XG5cbiAgICBmdW5jdGlvbiB2aXNpdFBhcnRzKG5vZGU6IE1UcmVlTm9kZSB8IE1QYXJ0KTogYm9vbGVhbiB7XG4gICAgICBpZiAocHJlZGljYXRlRm4obm9kZSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICAgIGlmIChvcHRpb25zPy5maW5kRmlyc3QpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHN0b3AgdmlzaXRpbmcgb3RoZXIgZWxlbWVudHNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE1UcmVlTm9kZSkge1xuICAgICAgICByZXR1cm4gdmlzaXRQYXJ0cyhub2RlLmNoaWxkMSkgJiYgdmlzaXRQYXJ0cyhub2RlLmNoaWxkMik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8uZ3JpZCkge1xuICAgICAgdmlzaXRQYXJ0cyh0aGlzLl9ncmlkc1tvcHRpb25zLmdyaWRdIS5yb290KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGdyaWQgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9ncmlkcykpIHtcbiAgICAgICAgaWYgKGdyaWQgJiYgIXZpc2l0UGFydHMoZ3JpZC5yb290KSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIGxheW91dC5cbiAgICovXG4gIHByaXZhdGUgd29ya2luZ0NvcHkoKTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IsICgpID0+IG5ldyDJtVdvcmtiZW5jaExheW91dCh7XG4gICAgICB3b3JrYmVuY2hHcmlkOiB0aGlzLl9zZXJpYWxpemVyLnNlcmlhbGl6ZUdyaWQodGhpcy53b3JrYmVuY2hHcmlkKSxcbiAgICAgIG1haW5BcmVhR3JpZDogdGhpcy5fc2VyaWFsaXplci5zZXJpYWxpemVHcmlkKHRoaXMuX2dyaWRzLm1haW5BcmVhKSxcbiAgICAgIHZpZXdPdXRsZXRzOiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5fdmlld091dGxldHMpLFxuICAgICAgbmF2aWdhdGlvblN0YXRlczogT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX25hdmlnYXRpb25TdGF0ZXMpLFxuICAgICAgbWF4aW1pemVkOiB0aGlzLl9tYXhpbWl6ZWQsXG4gICAgfSkpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlZmF1bHQgd29ya2JlbmNoIGdyaWQgd2l0aCBhIG1haW4gYXJlYS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFdvcmtiZW5jaEdyaWQoKTogTVBhcnRHcmlkIHtcbiAgcmV0dXJuIHtcbiAgICByb290OiBuZXcgTVBhcnQoe2lkOiBNQUlOX0FSRUEsIHN0cnVjdHVyYWw6IHRydWUsIHZpZXdzOiBbXX0pLFxuICAgIGFjdGl2ZVBhcnRJZDogTUFJTl9BUkVBLFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYWluIGFyZWEgZ3JpZCB3aXRoIGFuIGluaXRpYWwgcGFydC5cbiAqXG4gKiBUaGUgREkgdG9rZW4ge0BsaW5rIE1BSU5fQVJFQV9JTklUSUFMX1BBUlRfSUR9IGlzIHVzZWQgdG8gYXNzaWduIHRoZSBpbml0aWFsIHBhcnQgaXRzIGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiBjcmVhdGVJbml0aWFsTWFpbkFyZWFHcmlkKCk6IE1QYXJ0R3JpZCB7XG4gIHJldHVybiB7XG4gICAgcm9vdDogbmV3IE1QYXJ0KHtpZDogaW5qZWN0KE1BSU5fQVJFQV9JTklUSUFMX1BBUlRfSUQpLCBzdHJ1Y3R1cmFsOiBmYWxzZSwgdmlld3M6IFtdfSksXG4gICAgYWN0aXZlUGFydElkOiBpbmplY3QoTUFJTl9BUkVBX0lOSVRJQUxfUEFSVF9JRCksXG4gIH07XG59XG5cbi8qKlxuICogQ29lcmNlcyB7QGxpbmsgTVBhcnRHcmlkfSwgYXBwbHlpbmcgbmVjZXNzYXJ5IG1pZ3JhdGlvbnMgaWYgdGhlIHNlcmlhbGl6ZWQgZ3JpZCBpcyBvdXRkYXRlZC5cbiAqL1xuZnVuY3Rpb24gY29lcmNlTVBhcnRHcmlkKGdyaWQ6IHN0cmluZyB8IE1QYXJ0R3JpZCB8IG51bGwgfCB1bmRlZmluZWQsIG9wdGlvbnM6IHtkZWZhdWx0OiAoKSA9PiBNUGFydEdyaWR9KTogybVNUGFydEdyaWQge1xuICBncmlkID8/PSBvcHRpb25zLmRlZmF1bHQoKTtcblxuICBpZiAodHlwZW9mIGdyaWQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGdyaWQ7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBpbmplY3QoV29ya2JlbmNoTGF5b3V0U2VyaWFsaXplcikuZGVzZXJpYWxpemVHcmlkKGdyaWQpO1xuICB9XG4gIGNhdGNoIChlcnJvcikge1xuICAgIGluamVjdChMb2dnZXIpLmVycm9yKCdbU2VyaWFsaXplRXJyb3JdIEZhaWxlZCB0byBkZXNlcmlhbGl6ZSB3b3JrYmVuY2ggbGF5b3V0LiBQbGVhc2UgY2xlYXIgeW91ciBicm93c2VyIHN0b3JhZ2UgYW5kIHJlbG9hZCB0aGUgYXBwbGljYXRpb24uJywgZXJyb3IpO1xuICAgIHJldHVybiB7Li4ub3B0aW9ucy5kZWZhdWx0KCksIG1pZ3JhdGVkOiB0cnVlfTtcbiAgfVxufVxuXG4vKipcbiAqIENvZXJjZXMge0BsaW5rIFZpZXdPdXRsZXRzfSwgYXBwbHlpbmcgbmVjZXNzYXJ5IG1pZ3JhdGlvbnMgaWYgdGhlIHNlcmlhbGl6ZWQgb3V0bGV0cyBhcmUgb3V0ZGF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZVZpZXdPdXRsZXRzKHZpZXdPdXRsZXRzOiBzdHJpbmcgfCBWaWV3T3V0bGV0cyB8IG51bGwgfCB1bmRlZmluZWQpOiBWaWV3T3V0bGV0cyB7XG4gIGlmICghdmlld091dGxldHMpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBpZiAodHlwZW9mIHZpZXdPdXRsZXRzID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB2aWV3T3V0bGV0cztcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGluamVjdChXb3JrYmVuY2hMYXlvdXRTZXJpYWxpemVyKS5kZXNlcmlhbGl6ZVZpZXdPdXRsZXRzKHZpZXdPdXRsZXRzKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbmplY3QoTG9nZ2VyKS5lcnJvcignW1NlcmlhbGl6ZUVycm9yXSBGYWlsZWQgdG8gZGVzZXJpYWxpemUgdmlldyBvdXRsZXRzLiBQbGVhc2UgY2xlYXIgeW91ciBicm93c2VyIHN0b3JhZ2UgYW5kIHJlbG9hZCB0aGUgYXBwbGljYXRpb24uJywgZXJyb3IpO1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIEdyaWRzIG9mIHRoZSB3b3JrYmVuY2ggbGF5b3V0LlxuICovXG5pbnRlcmZhY2UgR3JpZHMge1xuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBncmlkIG9mIHRoZSB3b3JrYmVuY2guXG4gICAqL1xuICB3b3JrYmVuY2g6IMm1TVBhcnRHcmlkO1xuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBncmlkIG9mIHRoZSBtYWluIGFyZWEsIGlmIGFueS5cbiAgICpcbiAgICogVGhlIG1haW4gYXJlYSBncmlkIGlzIGEgc3ViLWdyaWQgZW1iZWRkZWQgaW4gdGhlIG1haW4gYXJlYSBwYXJ0LCBpZiBhbnkuIEl0IGRlZmluZXMgdGhlIGFycmFuZ2VtZW50IG9mIHBhcnRzIGluIHRoZSBtYWluIGFyZWEuXG4gICAqL1xuICBtYWluQXJlYT86IMm1TVBhcnRHcmlkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBvc2l0aW9uIGlmIGEgbnVtYmVyLCBvciBjb21wdXRlcyBpdCBmcm9tIHRoZSBnaXZlbiBsaXRlcmFsIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gY29lcmNlUG9zaXRpb24ocG9zaXRpb246IG51bWJlciB8ICdzdGFydCcgfCAnZW5kJyB8ICdiZWZvcmUtYWN0aXZlLXZpZXcnIHwgJ2FmdGVyLWFjdGl2ZS12aWV3JywgcGFydDogTVBhcnQpOiBudW1iZXIge1xuICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgY2FzZSAnc3RhcnQnOiB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY2FzZSAnZW5kJzoge1xuICAgICAgcmV0dXJuIHBhcnQudmlld3MubGVuZ3RoO1xuICAgIH1cbiAgICBjYXNlICdiZWZvcmUtYWN0aXZlLXZpZXcnOiB7XG4gICAgICBjb25zdCBhY3RpdmVWaWV3SW5kZXggPSBwYXJ0LnZpZXdzLmZpbmRJbmRleCh2aWV3ID0+IHZpZXcuaWQgPT09IHBhcnQuYWN0aXZlVmlld0lkKTtcbiAgICAgIHJldHVybiAoYWN0aXZlVmlld0luZGV4ID4gLTEgPyBhY3RpdmVWaWV3SW5kZXggOiBwYXJ0LnZpZXdzLmxlbmd0aCk7XG4gICAgfVxuICAgIGNhc2UgJ2FmdGVyLWFjdGl2ZS12aWV3Jzoge1xuICAgICAgY29uc3QgYWN0aXZlVmlld0luZGV4ID0gcGFydC52aWV3cy5maW5kSW5kZXgodmlldyA9PiB2aWV3LmlkID09PSBwYXJ0LmFjdGl2ZVZpZXdJZCk7XG4gICAgICByZXR1cm4gKGFjdGl2ZVZpZXdJbmRleCA+IC0xID8gYWN0aXZlVmlld0luZGV4ICsgMSA6IHBhcnQudmlld3MubGVuZ3RoKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERlc2NyaWJlcyBob3cgdG8gbGF5IG91dCBhIHBhcnQgcmVsYXRpdmUgdG8gYW5vdGhlciBwYXJ0IG9yIG5vZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVmZXJlbmNlRWxlbWVudCBleHRlbmRzIFJlZmVyZW5jZVBhcnQge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwYXJ0IG9yIG5vZGUgd2hpY2ggdG8gdXNlIGFzIHRoZSByZWZlcmVuY2UgZWxlbWVudCB0byBsYXkgb3V0IHRoZSBwYXJ0LlxuICAgKiBJZiBub3Qgc2V0LCB0aGUgcGFydCB3aWxsIGJlIGFsaWduZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdvcmtiZW5jaCBsYXlvdXQuXG4gICAqL1xuICByZWxhdGl2ZVRvPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERJIHRva2VuIHRvIGNvbnRyb2wgdGhlIGlkZW50aXR5IG9mIHRoZSBpbml0aWFsIHBhcnQgaW4gdGhlIG1haW4gYXJlYS5cbiAqXG4gKiBUaGUgaW5pdGlhbCBwYXJ0IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgd29ya2JlbmNoIGlmIHRoZSBtYWluIGFyZWEgaGFzIG5vIHBhcnQsIGJ1dCBpdCBoYXMgbm9cbiAqIHNwZWNpYWwgbWVhbmluZyB0byB0aGUgd29ya2JlbmNoIGFuZCBjYW4gYmUgcmVtb3ZlZCBieSB0aGUgdXNlci4gSWYgbm90IHNldCwgYSBVVUlEIGlzIGFzc2lnbmVkLlxuICpcbiAqIE92ZXJ3cml0ZSB0aGlzIERJIHRva2VuIGluIHRlc3RzIHRvIGNvbnRyb2wgdGhlIGlkZW50aXR5IG9mIHRoZSBpbml0aWFsIHBhcnQuXG4gKiBgYGBcbiAqIFRlc3RCZWQub3ZlcnJpZGVQcm92aWRlcihNQUlOX0FSRUFfSU5JVElBTF9QQVJUX0lELCB7dXNlVmFsdWU6ICdtYWluJ30pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IE1BSU5fQVJFQV9JTklUSUFMX1BBUlRfSUQgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignTUFJTl9BUkVBX0lOSVRJQUxfUEFSVF9JRCcsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBVSUQucmFuZG9tVUlEKCksXG59KTtcblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgaW5zdGFudCB3aGVuIGEgcGFydCB3YXMgbGFzdCBhY3RpdmF0ZWQuXG4gKlxuICogT3ZlcndyaXRlIERJIHRva2VuIGluIHRlc3RzIHRvIGNvbnRyb2wgcGFydCBhY3RpdmF0aW9uIGluc3RhbnRzLlxuICogYGBgXG4gKiBUZXN0QmVkLm92ZXJyaWRlUHJvdmlkZXIoUGFydEFjdGl2YXRpb25JbnN0YW50UHJvdmlkZXIsIHt1c2VWYWx1ZTogLi4ufSk7XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgUGFydEFjdGl2YXRpb25JbnN0YW50UHJvdmlkZXIge1xuXG4gIHByaXZhdGUgX3BhcnRSZWdpc3RyeSA9IGluamVjdChXT1JLQkVOQ0hfUEFSVF9SRUdJU1RSWSk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGluc3RhbnQgd2hlbiB0aGUgc3BlY2lmaWVkIHBhcnQgd2FzIGxhc3QgYWN0aXZhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldEFjdGl2YXRpb25JbnN0YW50KHBhcnRJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFydFJlZ2lzdHJ5LmdldChwYXJ0SWQsIHtvckVsc2U6IG51bGx9KT8uYWN0aXZhdGlvbkluc3RhbnQgPz8gMDtcbiAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSBpbnN0YW50IHdoZW4gYSB2aWV3IHdhcyBsYXN0IGFjdGl2YXRlZC5cbiAqXG4gKiBPdmVyd3JpdGUgREkgdG9rZW4gaW4gdGVzdHMgdG8gY29udHJvbCB2aWV3IGFjdGl2YXRpb24gaW5zdGFudHMuXG4gKiBgYGBcbiAqIFRlc3RCZWQub3ZlcnJpZGVQcm92aWRlcihWaWV3QWN0aXZhdGlvbkluc3RhbnRQcm92aWRlciwge3VzZVZhbHVlOiAuLi59KTtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBWaWV3QWN0aXZhdGlvbkluc3RhbnRQcm92aWRlciB7XG5cbiAgcHJpdmF0ZSBfdmlld1JlZ2lzdHJ5ID0gaW5qZWN0KFdPUktCRU5DSF9WSUVXX1JFR0lTVFJZKTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaW5zdGFudCB3aGVuIHRoZSBzcGVjaWZpZWQgdmlldyB3YXMgbGFzdCBhY3RpdmF0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0QWN0aXZhdGlvbkluc3RhbnQodmlld0lkOiBWaWV3SWQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92aWV3UmVnaXN0cnkuZ2V0KHZpZXdJZCwge29yRWxzZTogbnVsbH0pPy5hY3RpdmF0aW9uSW5zdGFudCA/PyAwO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHByZWRpY2F0ZSB0byBtYXRjaCBhIHZpZXcgYnkgaXRzIHByaW1hcnkgb3IgYWx0ZXJuYXRpdmUgaWQsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgcGFzc2VkIGlkLlxuICovXG5mdW5jdGlvbiBtYXRjaFZpZXdCeUlkKGlkOiBzdHJpbmcpOiBQcmVkaWNhdGU8TVZpZXc+IHtcbiAgaWYgKFdvcmtiZW5jaExheW91dHMuaXNWaWV3SWQoaWQpKSB7XG4gICAgcmV0dXJuIHZpZXcgPT4gdmlldy5pZCA9PT0gaWQ7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIHZpZXcgPT4gdmlldy5hbHRlcm5hdGl2ZUlkID09PSBpZDtcbiAgfVxufVxuXG4vKipcbiAqIFN0cmluZ2lmaWVzIHRoZSBnaXZlbiBmaWx0ZXIgdG8gYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5RmlsdGVyKGZpbHRlcjoge1twcm9wZXJ0eTogc3RyaW5nXTogdW5rbm93bn0pOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZmlsdGVyKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fT0ke3ZhbHVlfWApLmpvaW4oJywgJyk7XG59XG5cbi8qKlxuICogU2VyaWFsaXplZCBhcnRpZmFjdHMgb2YgdGhlIHdvcmtiZW5jaCBsYXlvdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZFdvcmtiZW5jaExheW91dCB7XG4gIHdvcmtiZW5jaEdyaWQ6IHN0cmluZztcbiAgd29ya2JlbmNoVmlld091dGxldHM6IHN0cmluZztcbiAgbWFpbkFyZWFHcmlkOiBzdHJpbmcgfCBudWxsO1xuICBtYWluQXJlYVZpZXdPdXRsZXRzOiBzdHJpbmc7XG59XG4iXX0=
|