@netgrif/components-core 6.4.0 → 6.5.0-rc.1
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/commons/schema.d.ts +3 -0
- package/esm2020/assets/i18n/de.json +4 -2
- package/esm2020/assets/i18n/en.json +4 -2
- package/esm2020/assets/i18n/sk.json +4 -2
- package/esm2020/commons/schema.mjs +1 -1
- package/esm2020/lib/admin/role-assignment/abstract-role-assignment.component.mjs +11 -2
- package/esm2020/lib/admin/role-assignment/services/ProcessList.mjs +5 -2
- package/esm2020/lib/admin/role-assignment-ldap-group/abstract-ldap-group-role-assignment.component.mjs +11 -2
- package/esm2020/lib/admin/user-invite/abstract-user-invite.component.mjs +16 -3
- package/esm2020/lib/allowed-nets/services/factory/allowed-nets-service-factory.mjs +4 -1
- package/esm2020/lib/changed-fields/services/changed-fields.service.mjs +2 -2
- package/esm2020/lib/configuration/configuration.service.mjs +2 -2
- package/esm2020/lib/dialog/components/confirm-dialog/confirm-dialog.component.mjs +2 -2
- package/esm2020/lib/event/public-api.mjs +2 -1
- package/esm2020/lib/event/services/event.service.mjs +4 -4
- package/esm2020/lib/header/services/overflow.service.mjs +2 -2
- package/esm2020/lib/logger/services/log-publisher.service.mjs +2 -2
- package/esm2020/lib/navigation/breadcrumbs/abstract-breadcrumbs.component.mjs +3 -3
- package/esm2020/lib/navigation/dashboard/abstract-dashboard.component.mjs +228 -0
- package/esm2020/lib/navigation/model/group-navigation-constants.mjs +27 -19
- package/esm2020/lib/navigation/model/navigation-configs.mjs +2 -2
- package/esm2020/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.mjs +104 -348
- package/esm2020/lib/navigation/navigation-double-drawer/service/double-drawer-navigation.service.mjs +458 -0
- package/esm2020/lib/navigation/navigation-double-drawer/util/double-drawer-utils.mjs +43 -0
- package/esm2020/lib/navigation/public-api.mjs +4 -1
- package/esm2020/lib/navigation/service/uri.service.mjs +2 -2
- package/esm2020/lib/navigation/utility/filter-extraction.service.mjs +16 -5
- package/esm2020/lib/navigation/utility/navigation-item-task-utility-methods.mjs +13 -1
- package/esm2020/lib/panel/task-panel/abstract-task-panel.component.mjs +3 -3
- package/esm2020/lib/resources/engine-endpoint/petri-net-resource.service.mjs +12 -1
- package/esm2020/lib/resources/interface/petri-net-request-body.mjs +1 -1
- package/esm2020/lib/resources/resource-provider.service.mjs +6 -6
- package/esm2020/lib/routing/redirect-service/redirect.service.mjs +6 -3
- package/esm2020/lib/search/models/category/case/case-dataset.mjs +2 -2
- package/esm2020/lib/search/models/operator/operator.mjs +2 -2
- package/esm2020/lib/search/models/operator/substring.mjs +2 -2
- package/esm2020/lib/search/search-service/search.service.mjs +2 -2
- package/esm2020/lib/task/services/task-data.service.mjs +4 -4
- package/esm2020/lib/task-content/model/subgrid.mjs +2 -2
- package/esm2020/lib/task-content/services/field-converter.service.mjs +2 -2
- package/esm2020/lib/task-content/services/task-content.service.mjs +4 -4
- package/esm2020/lib/toolbar/abstract-toolbar.component.mjs +48 -11
- package/esm2020/lib/toolbar/public-api.mjs +2 -1
- package/esm2020/lib/toolbar/toolbar-config.mjs +2 -0
- package/esm2020/lib/user/services/user-comparator.service.mjs +2 -2
- package/esm2020/lib/utility/contains.pipe.mjs +2 -2
- package/esm2020/lib/utility/navigation-item-task-filter-factory.mjs +4 -3
- package/esm2020/lib/utility/navigation-item-task-search-categories-factory.mjs +4 -1
- package/esm2020/lib/view/abstract/view-with-headers.mjs +1 -1
- package/esm2020/lib/view/public-api.mjs +2 -1
- package/esm2020/lib/view/task-view/abstract-single-task-view.component.mjs +9 -26
- package/esm2020/lib/view/task-view/abstract-tabbed-single-task-view.component.mjs +32 -0
- package/esm2020/lib/view/workflow-view/abstract-workflow-view.component.mjs +14 -1
- package/esm2020/lib/view/workflow-view/workflow-view.service.mjs +17 -2
- package/fesm2015/netgrif-components-core.mjs +1064 -434
- package/fesm2015/netgrif-components-core.mjs.map +1 -1
- package/fesm2020/netgrif-components-core.mjs +1041 -426
- package/fesm2020/netgrif-components-core.mjs.map +1 -1
- package/lib/admin/role-assignment/abstract-role-assignment.component.d.ts +4 -1
- package/lib/admin/role-assignment/services/ProcessList.d.ts +1 -1
- package/lib/admin/role-assignment-ldap-group/abstract-ldap-group-role-assignment.component.d.ts +4 -1
- package/lib/admin/user-invite/abstract-user-invite.component.d.ts +9 -3
- package/lib/allowed-nets/services/factory/allowed-nets-service-factory.d.ts +1 -1
- package/lib/event/public-api.d.ts +1 -0
- package/lib/navigation/dashboard/abstract-dashboard.component.d.ts +73 -0
- package/lib/navigation/model/group-navigation-constants.d.ts +27 -19
- package/lib/navigation/model/navigation-configs.d.ts +1 -0
- package/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.d.ts +22 -57
- package/lib/navigation/navigation-double-drawer/service/double-drawer-navigation.service.d.ts +137 -0
- package/lib/navigation/navigation-double-drawer/util/double-drawer-utils.d.ts +16 -0
- package/lib/navigation/public-api.d.ts +3 -0
- package/lib/navigation/utility/filter-extraction.service.d.ts +3 -2
- package/lib/navigation/utility/navigation-item-task-utility-methods.d.ts +6 -0
- package/lib/resources/engine-endpoint/petri-net-resource.service.d.ts +8 -0
- package/lib/resources/interface/petri-net-request-body.d.ts +1 -0
- package/lib/toolbar/abstract-toolbar.component.d.ts +16 -6
- package/lib/toolbar/public-api.d.ts +1 -0
- package/lib/toolbar/toolbar-config.d.ts +11 -0
- package/lib/utility/navigation-item-task-filter-factory.d.ts +3 -1
- package/lib/utility/navigation-item-task-search-categories-factory.d.ts +1 -1
- package/lib/view/abstract/view-with-headers.d.ts +1 -1
- package/lib/view/public-api.d.ts +1 -0
- package/lib/view/task-view/abstract-single-task-view.component.d.ts +5 -16
- package/lib/view/task-view/abstract-tabbed-single-task-view.component.d.ts +15 -0
- package/lib/view/workflow-view/abstract-workflow-view.component.d.ts +5 -2
- package/lib/view/workflow-view/workflow-view.service.d.ts +2 -0
- package/package.json +1 -1
- package/src/assets/i18n/de.json +4 -2
- package/src/assets/i18n/en.json +4 -2
- package/src/assets/i18n/sk.json +4 -2
package/esm2020/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.mjs
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
import { Breakpoints } from '@angular/cdk/layout';
|
|
2
|
-
import { HttpParams } from '@angular/common/http';
|
|
3
2
|
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
4
|
-
import {
|
|
5
|
-
import { map } from 'rxjs/operators';
|
|
6
|
-
import { SimpleFilter } from '../../filter/models/simple-filter';
|
|
3
|
+
import { filter, take } from 'rxjs/operators';
|
|
7
4
|
import { NAE_ROUTING_CONFIGURATION_PATH } from '../../routing/routing-builder/routing-builder.service';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { GroupNavigationConstants } from '../model/group-navigation-constants';
|
|
11
|
-
import { LEFT_DRAWER_DEFAULT_WIDTH, MENU_IDENTIFIERS, MenuOrder, RIGHT_DRAWER_DEFAULT_MIN_WIDTH, RIGHT_DRAWER_DEFAULT_WIDTH, RIGHT_DRAWER_MAX_WIDTH, RIGHT_SIDE_INIT_PAGE_SIZE, RIGHT_SIDE_NEW_PAGE_SIZE, SETTINGS_TRANSITION_ID, } from '../model/navigation-configs';
|
|
5
|
+
import { LEFT_DRAWER_DEFAULT_WIDTH, RIGHT_DRAWER_DEFAULT_MIN_WIDTH, RIGHT_DRAWER_DEFAULT_WIDTH, RIGHT_DRAWER_MAX_WIDTH, } from '../model/navigation-configs';
|
|
6
|
+
import { DoubleDrawerUtils } from "./util/double-drawer-utils";
|
|
12
7
|
import * as i0 from "@angular/core";
|
|
13
8
|
import * as i1 from "@angular/router";
|
|
14
9
|
import * as i2 from "@angular/cdk/layout";
|
|
@@ -23,8 +18,10 @@ import * as i10 from "../../resources/engine-endpoint/case-resource.service";
|
|
|
23
18
|
import * as i11 from "../../impersonation/services/impersonation-user-select.service";
|
|
24
19
|
import * as i12 from "../../impersonation/services/impersonation.service";
|
|
25
20
|
import * as i13 from "../../routing/dynamic-navigation-route-provider/dynamic-navigation-route-provider.service";
|
|
21
|
+
import * as i14 from "../../routing/redirect-service/redirect.service";
|
|
22
|
+
import * as i15 from "./service/double-drawer-navigation.service";
|
|
26
23
|
export class AbstractNavigationDoubleDrawerComponent {
|
|
27
|
-
constructor(_router, _activatedRoute, _breakpoint, _languageService, _translateService, _userService, _accessService, _log, _config, _uriService, _caseResourceService, _impersonationUserSelect, _impersonation, _dynamicRoutingService) {
|
|
24
|
+
constructor(_router, _activatedRoute, _breakpoint, _languageService, _translateService, _userService, _accessService, _log, _config, _uriService, _caseResourceService, _impersonationUserSelect, _impersonation, _dynamicRoutingService, _redirectService, _navigationService) {
|
|
28
25
|
this._router = _router;
|
|
29
26
|
this._activatedRoute = _activatedRoute;
|
|
30
27
|
this._breakpoint = _breakpoint;
|
|
@@ -39,6 +36,8 @@ export class AbstractNavigationDoubleDrawerComponent {
|
|
|
39
36
|
this._impersonationUserSelect = _impersonationUserSelect;
|
|
40
37
|
this._impersonation = _impersonation;
|
|
41
38
|
this._dynamicRoutingService = _dynamicRoutingService;
|
|
39
|
+
this._redirectService = _redirectService;
|
|
40
|
+
this._navigationService = _navigationService;
|
|
42
41
|
this.imageRouterLink = '/';
|
|
43
42
|
this.imageAlt = 'Logo';
|
|
44
43
|
this.profileRouterLink = '/profile';
|
|
@@ -69,15 +68,17 @@ export class AbstractNavigationDoubleDrawerComponent {
|
|
|
69
68
|
disableClose: false,
|
|
70
69
|
width: RIGHT_DRAWER_DEFAULT_WIDTH,
|
|
71
70
|
};
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
this.
|
|
77
|
-
this.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
this.
|
|
71
|
+
let configUrl = this._config.getServicesConfiguration()?.doubleDrawer?.url;
|
|
72
|
+
if (configUrl !== undefined && !configUrl.startsWith('/')) {
|
|
73
|
+
configUrl = '/' + configUrl;
|
|
74
|
+
}
|
|
75
|
+
this.configUrl = configUrl;
|
|
76
|
+
this._navigationService.itemClicked$.subscribe((itemClickEvent) => {
|
|
77
|
+
this.itemClicked.emit(itemClickEvent);
|
|
78
|
+
});
|
|
79
|
+
this._navigationService.itemLoaded$.subscribe((itemLoadedEvent) => {
|
|
80
|
+
this.itemLoaded.emit(itemLoadedEvent);
|
|
81
|
+
});
|
|
81
82
|
}
|
|
82
83
|
ngOnInit() {
|
|
83
84
|
this._breakpointSubscription = this._breakpoint.observe([Breakpoints.HandsetLandscape]).subscribe(() => {
|
|
@@ -88,83 +89,67 @@ export class AbstractNavigationDoubleDrawerComponent {
|
|
|
88
89
|
this.resolveLayout(true);
|
|
89
90
|
}
|
|
90
91
|
});
|
|
91
|
-
|
|
92
|
-
this.
|
|
93
|
-
|
|
92
|
+
if (this.canApplyAutoSelect()) {
|
|
93
|
+
this.rightItems$.pipe(filter(rightItems => rightItems.length > 0), take(1)).subscribe(() => {
|
|
94
|
+
this.openAvailableView();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
94
97
|
const viewConfigurationPath = this._activatedRoute.snapshot.data[NAE_ROUTING_CONFIGURATION_PATH];
|
|
95
98
|
if (!!viewConfigurationPath) {
|
|
96
99
|
const viewConfiguration = this._config.getViewByPath(viewConfigurationPath);
|
|
97
|
-
|
|
98
|
-
this.resolveUriForChildViews(viewConfigurationPath + '/' + key, childView);
|
|
99
|
-
this.resolveHiddenMenuItemFromChildViews(viewConfigurationPath + '/' + key, childView);
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
get currentNode() {
|
|
104
|
-
return this._currentNode;
|
|
105
|
-
}
|
|
106
|
-
set currentNode(node) {
|
|
107
|
-
if (node === this._currentNode || this.leftLoading$.isActive || this.rightLoading$.isActive) {
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
this._currentNode = node;
|
|
111
|
-
if (!node) {
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
if (node.parentId && !node.parent) {
|
|
115
|
-
if (node.parentId === this._uriService.root.id) {
|
|
116
|
-
node.parent = this._uriService.root;
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
this.nodeLoading$.on();
|
|
120
|
-
this._uriService.getNodeByPath(this._uriService.resolveParentPath(node)).subscribe(n => {
|
|
121
|
-
node.parent = !n ? this._uriService.root : n;
|
|
122
|
-
this.nodeLoading$.off();
|
|
123
|
-
}, error => {
|
|
124
|
-
this._log.error(error);
|
|
125
|
-
this.nodeLoading$.off();
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
if (this.nodeLoading$.isActive) {
|
|
130
|
-
this.nodeLoading$.subscribe(() => {
|
|
131
|
-
this.resolveMenuItems(node);
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
this.resolveMenuItems(node);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
resolveMenuItems(node) {
|
|
139
|
-
if (this._uriService.isRoot(node)) {
|
|
140
|
-
this.leftItems = [];
|
|
141
|
-
this.loadRightSide();
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
if (!this.leftItems.find(item => item.resource?.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH)?.value === node.uriPath)) {
|
|
145
|
-
this.loadLeftSide();
|
|
146
|
-
}
|
|
147
|
-
this.loadRightSide();
|
|
100
|
+
this._navigationService.initializeCustomViewsOfView(viewConfiguration, viewConfigurationPath);
|
|
148
101
|
}
|
|
149
102
|
}
|
|
150
103
|
ngOnDestroy() {
|
|
151
104
|
this._breakpointSubscription?.unsubscribe();
|
|
152
|
-
this._currentNodeSubscription?.unsubscribe();
|
|
153
|
-
this.leftLoading$.complete();
|
|
154
|
-
this.rightLoading$.complete();
|
|
155
|
-
this.nodeLoading$.complete();
|
|
156
105
|
this.loggedOut.complete();
|
|
157
106
|
this.stateChanged.complete();
|
|
158
107
|
this.itemClicked.complete();
|
|
159
108
|
this.resized.complete();
|
|
160
109
|
this.itemLoaded.complete();
|
|
161
110
|
}
|
|
111
|
+
get currentNode() {
|
|
112
|
+
return this._navigationService.currentNode;
|
|
113
|
+
}
|
|
114
|
+
set currentNode(node) {
|
|
115
|
+
this._navigationService.currentNode = node;
|
|
116
|
+
}
|
|
162
117
|
get configLeftMenu() {
|
|
163
118
|
return this._configLeftMenu;
|
|
164
119
|
}
|
|
165
120
|
get configRightMenu() {
|
|
166
121
|
return this._configRightMenu;
|
|
167
122
|
}
|
|
123
|
+
get leftItems$() {
|
|
124
|
+
return this._navigationService.leftItems$;
|
|
125
|
+
}
|
|
126
|
+
get leftItems() {
|
|
127
|
+
return this._navigationService.leftItems;
|
|
128
|
+
}
|
|
129
|
+
get rightItems$() {
|
|
130
|
+
return this._navigationService.rightItems$;
|
|
131
|
+
}
|
|
132
|
+
get rightItems() {
|
|
133
|
+
return this._navigationService.rightItems;
|
|
134
|
+
}
|
|
135
|
+
get moreItems$() {
|
|
136
|
+
return this._navigationService.moreItems$;
|
|
137
|
+
}
|
|
138
|
+
get moreItems() {
|
|
139
|
+
return this._navigationService.moreItems;
|
|
140
|
+
}
|
|
141
|
+
get hiddenCustomItems$() {
|
|
142
|
+
return this._navigationService.hiddenCustomItems$;
|
|
143
|
+
}
|
|
144
|
+
get hiddenCustomItems() {
|
|
145
|
+
return this._navigationService.hiddenCustomItems;
|
|
146
|
+
}
|
|
147
|
+
get leftLoading$() {
|
|
148
|
+
return this._navigationService.leftLoading$;
|
|
149
|
+
}
|
|
150
|
+
get rightLoading$() {
|
|
151
|
+
return this._navigationService.rightLoading$;
|
|
152
|
+
}
|
|
168
153
|
toggleMenu() {
|
|
169
154
|
this.toggleRightMenu();
|
|
170
155
|
if (this.allClosable) {
|
|
@@ -179,30 +164,6 @@ export class AbstractNavigationDoubleDrawerComponent {
|
|
|
179
164
|
this._configRightMenu.opened = !this._configRightMenu.opened;
|
|
180
165
|
this.stateChanged.emit({ menu: 'right', isOpened: this._configRightMenu.opened });
|
|
181
166
|
}
|
|
182
|
-
resolveLayout(isLargeScreen) {
|
|
183
|
-
this._configLeftMenu = isLargeScreen ? {
|
|
184
|
-
mode: 'side',
|
|
185
|
-
opened: true,
|
|
186
|
-
disableClose: true,
|
|
187
|
-
width: this._configLeftMenu.width,
|
|
188
|
-
} : {
|
|
189
|
-
mode: 'over',
|
|
190
|
-
opened: false,
|
|
191
|
-
disableClose: false,
|
|
192
|
-
width: this._configLeftMenu.width,
|
|
193
|
-
};
|
|
194
|
-
this._configRightMenu = isLargeScreen ? {
|
|
195
|
-
mode: 'side',
|
|
196
|
-
opened: true,
|
|
197
|
-
disableClose: true,
|
|
198
|
-
width: this._configRightMenu.width,
|
|
199
|
-
} : {
|
|
200
|
-
mode: 'over',
|
|
201
|
-
opened: false,
|
|
202
|
-
disableClose: false,
|
|
203
|
-
width: this._configRightMenu.width,
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
167
|
getLang() {
|
|
207
168
|
return this._languageService.getLanguage();
|
|
208
169
|
}
|
|
@@ -227,18 +188,14 @@ export class AbstractNavigationDoubleDrawerComponent {
|
|
|
227
188
|
return this._userService.user;
|
|
228
189
|
}
|
|
229
190
|
get canGoBackLoading$() {
|
|
230
|
-
return this.
|
|
191
|
+
return this._navigationService.canGoBackLoading$;
|
|
231
192
|
}
|
|
232
193
|
/**
|
|
233
194
|
* On home click, the current level is set to 0, and current parent is
|
|
234
195
|
* set to root node.
|
|
235
196
|
* */
|
|
236
197
|
onHomeClick() {
|
|
237
|
-
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
this._uriService.activeNode = this._uriService.root;
|
|
241
|
-
this.itemClicked.emit({ uriNode: this._uriService.activeNode, isHome: true });
|
|
198
|
+
this._navigationService.onHomeClick();
|
|
242
199
|
}
|
|
243
200
|
/**
|
|
244
201
|
* On back click, the parent is set to parent of left nodes, that will solve
|
|
@@ -247,241 +204,32 @@ export class AbstractNavigationDoubleDrawerComponent {
|
|
|
247
204
|
* Current level is set to a lower number in order to set the left side menu.
|
|
248
205
|
* */
|
|
249
206
|
onBackClick() {
|
|
250
|
-
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
this._uriService.activeNode = this._currentNode.parent;
|
|
254
|
-
this.itemClicked.emit({ uriNode: this._uriService.activeNode, isHome: false });
|
|
207
|
+
this._navigationService.onBackClick();
|
|
255
208
|
}
|
|
256
209
|
onItemClick(item) {
|
|
257
|
-
|
|
258
|
-
// custom view represented only in nae.json
|
|
259
|
-
if (item.processUri === this.currentNode.uriPath) {
|
|
260
|
-
this._uriService.activeNode = this._currentNode;
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
this._uriService.activeNode = this._currentNode.parent;
|
|
264
|
-
}
|
|
265
|
-
this.itemClicked.emit({ uriNode: this._uriService.activeNode, isHome: false });
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
const path = item.resource.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH)?.value;
|
|
269
|
-
if (this.hasItemChildren(item) && !this.leftLoading$.isActive && !this.rightLoading$.isActive) {
|
|
270
|
-
this._uriService.getNodeByPath(path).subscribe(node => {
|
|
271
|
-
this._uriService.activeNode = node;
|
|
272
|
-
this.itemClicked.emit({ uriNode: this._uriService.activeNode, isHome: false });
|
|
273
|
-
}, error => {
|
|
274
|
-
this._log.error(error);
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
else if (!path.includes(this.currentNode.uriPath)) {
|
|
278
|
-
this._uriService.activeNode = this._currentNode.parent;
|
|
279
|
-
this.itemClicked.emit({ uriNode: this._uriService.activeNode, isHome: false });
|
|
280
|
-
}
|
|
281
|
-
else {
|
|
282
|
-
this._uriService.activeNode = this._currentNode;
|
|
283
|
-
this.itemClicked.emit({ uriNode: this._uriService.activeNode, isHome: false });
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
hasItemChildren(item) {
|
|
288
|
-
return item.resource?.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_HAS_CHILDREN)?.value;
|
|
289
|
-
}
|
|
290
|
-
isItemAndNodeEqual(item, node) {
|
|
291
|
-
return item.resource?.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH)?.value === node.uriPath;
|
|
292
|
-
}
|
|
293
|
-
loadLeftSide() {
|
|
294
|
-
if (this._uriService.isRoot(this._currentNode)) {
|
|
295
|
-
this.leftItems = [];
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
this.leftLoading$.on();
|
|
299
|
-
this._uriService.getItemCaseByNodePath(this.currentNode.parent).subscribe(page => {
|
|
300
|
-
let childCases$;
|
|
301
|
-
let targetItem;
|
|
302
|
-
let orderedChildCaseIds;
|
|
303
|
-
if (page?.pagination?.totalElements === 0) {
|
|
304
|
-
childCases$ = of([]);
|
|
305
|
-
}
|
|
306
|
-
else {
|
|
307
|
-
targetItem = page.content[0];
|
|
308
|
-
orderedChildCaseIds = this.extractChildCaseIds(targetItem);
|
|
309
|
-
childCases$ = this.getItemCasesByIdsInOnePage(orderedChildCaseIds).pipe(map(p => p.content));
|
|
310
|
-
}
|
|
311
|
-
childCases$.subscribe(result => {
|
|
312
|
-
result = result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i);
|
|
313
|
-
this.leftItems = result.sort((a, b) => orderedChildCaseIds.indexOf(a.resource.stringId) - orderedChildCaseIds.indexOf(b.resource.stringId));
|
|
314
|
-
this.resolveCustomViewsInLeftSide();
|
|
315
|
-
this.leftLoading$.off();
|
|
316
|
-
this.itemLoaded.emit({ menu: 'left', items: this.leftItems });
|
|
317
|
-
}, error => {
|
|
318
|
-
this._log.error(error);
|
|
319
|
-
this.leftItems = [];
|
|
320
|
-
this.resolveCustomViewsInLeftSide();
|
|
321
|
-
this.leftLoading$.off();
|
|
322
|
-
});
|
|
323
|
-
}, error => {
|
|
324
|
-
this._log.error(error);
|
|
325
|
-
this.leftItems = [];
|
|
326
|
-
this.resolveCustomViewsInLeftSide();
|
|
327
|
-
this.leftLoading$.off();
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
loadRightSide() {
|
|
331
|
-
this.rightLoading$.on();
|
|
332
|
-
this.moreItems = [];
|
|
333
|
-
this._uriService.getItemCaseByNodePath(this.currentNode).subscribe(page => {
|
|
334
|
-
let childCases$;
|
|
335
|
-
let targetItem;
|
|
336
|
-
let orderedChildCaseIds;
|
|
337
|
-
if (page?.pagination?.totalElements === 0) {
|
|
338
|
-
childCases$ = of([]);
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
targetItem = page.content[0];
|
|
342
|
-
orderedChildCaseIds = this.extractChildCaseIds(targetItem);
|
|
343
|
-
childCases$ = this.getItemCasesByIdsInOnePage(orderedChildCaseIds).pipe(map(p => p.content));
|
|
344
|
-
}
|
|
345
|
-
childCases$.subscribe(result => {
|
|
346
|
-
result = result.sort((a, b) => orderedChildCaseIds.indexOf(a.stringId) - orderedChildCaseIds.indexOf(b.stringId));
|
|
347
|
-
if (result.length > RIGHT_SIDE_INIT_PAGE_SIZE) {
|
|
348
|
-
const rawRightItems = result.splice(0, RIGHT_SIDE_INIT_PAGE_SIZE);
|
|
349
|
-
this.rightItems = rawRightItems.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i);
|
|
350
|
-
this.moreItems = result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i);
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
this.rightItems = result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i);
|
|
354
|
-
}
|
|
355
|
-
this.resolveCustomViewsInRightSide();
|
|
356
|
-
this.rightLoading$.off();
|
|
357
|
-
this.itemLoaded.emit({ menu: 'right', items: this.rightItems });
|
|
358
|
-
}, error => {
|
|
359
|
-
this._log.error(error);
|
|
360
|
-
this.rightItems = [];
|
|
361
|
-
this.moreItems = [];
|
|
362
|
-
this.resolveCustomViewsInRightSide();
|
|
363
|
-
this.rightLoading$.off();
|
|
364
|
-
});
|
|
365
|
-
}, error => {
|
|
366
|
-
this._log.error(error);
|
|
367
|
-
this.rightItems = [];
|
|
368
|
-
this.moreItems = [];
|
|
369
|
-
this.resolveCustomViewsInRightSide();
|
|
370
|
-
this.rightLoading$.off();
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
extractChildCaseIds(item) {
|
|
374
|
-
return item.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_CHILD_ITEM_IDS)?.value;
|
|
375
|
-
}
|
|
376
|
-
getItemCasesByIdsInOnePage(caseIds) {
|
|
377
|
-
return this.getItemCasesByIds(caseIds, 0, caseIds.length);
|
|
378
|
-
}
|
|
379
|
-
getItemCasesByIds(caseIds, pageNumber, pageSize) {
|
|
380
|
-
const searchBody = {
|
|
381
|
-
stringId: caseIds,
|
|
382
|
-
process: MENU_IDENTIFIERS.map(id => ({ identifier: id })),
|
|
383
|
-
};
|
|
384
|
-
let httpParams = new HttpParams()
|
|
385
|
-
.set(PaginationParams.PAGE_SIZE, pageSize)
|
|
386
|
-
.set(PaginationParams.PAGE_NUMBER, pageNumber);
|
|
387
|
-
return this._caseResourceService.searchCases(SimpleFilter.fromCaseQuery(searchBody), httpParams);
|
|
210
|
+
this._navigationService.onItemClick(item);
|
|
388
211
|
}
|
|
389
212
|
loadMoreItems() {
|
|
390
|
-
|
|
391
|
-
this.rightItems.push(...this.moreItems.splice(0, RIGHT_SIDE_NEW_PAGE_SIZE));
|
|
392
|
-
}
|
|
393
|
-
else {
|
|
394
|
-
this.rightItems.push(...this.moreItems);
|
|
395
|
-
this.moreItems = [];
|
|
396
|
-
}
|
|
213
|
+
this._navigationService.loadMoreItems();
|
|
397
214
|
}
|
|
398
215
|
isAscending() {
|
|
399
|
-
return this.
|
|
216
|
+
return this._navigationService.isAscending();
|
|
400
217
|
}
|
|
401
218
|
switchOrder() {
|
|
402
|
-
this.
|
|
403
|
-
let multiplier = 1;
|
|
404
|
-
if (this.itemsOrder === MenuOrder.Descending) {
|
|
405
|
-
multiplier = -1;
|
|
406
|
-
}
|
|
407
|
-
this.rightItems.sort((a, b) => multiplier * a?.navigation?.title.localeCompare(b?.navigation?.title));
|
|
408
|
-
this.leftItems.sort((a, b) => multiplier * a?.navigation?.title.localeCompare(b?.navigation?.title));
|
|
409
|
-
}
|
|
410
|
-
resolveCustomViewsInRightSide() {
|
|
411
|
-
if (!!this._childCustomViews[this._currentNode.uriPath]) {
|
|
412
|
-
this.rightItems.push(...Object.values(this._childCustomViews[this._currentNode.uriPath]));
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
resolveCustomViewsInLeftSide() {
|
|
416
|
-
if (!!this._childCustomViews[this._currentNode.parent.uriPath]) {
|
|
417
|
-
this.leftItems.push(...Object.values(this._childCustomViews[this._currentNode.parent.uriPath]));
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
resolveItemCaseToNavigationItem(itemCase) {
|
|
421
|
-
if (this.representsRootNode(itemCase)) {
|
|
422
|
-
return;
|
|
423
|
-
}
|
|
424
|
-
const item = {
|
|
425
|
-
access: {},
|
|
426
|
-
navigation: {
|
|
427
|
-
icon: itemCase.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_MENU_ICON)?.value || this.filterIcon,
|
|
428
|
-
title: this.getTranslation(itemCase.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_MENU_NAME)?.value) || itemCase.title,
|
|
429
|
-
},
|
|
430
|
-
routing: {
|
|
431
|
-
path: this.getItemRoutingPath(itemCase),
|
|
432
|
-
},
|
|
433
|
-
id: itemCase.stringId,
|
|
434
|
-
resource: itemCase,
|
|
435
|
-
};
|
|
436
|
-
const resolvedRoles = this.resolveAccessRoles(itemCase, GroupNavigationConstants.ITEM_FIELD_ID_ALLOWED_ROLES);
|
|
437
|
-
const resolvedBannedRoles = this.resolveAccessRoles(itemCase, GroupNavigationConstants.ITEM_FIELD_ID_BANNED_ROLES);
|
|
438
|
-
if (!!resolvedRoles)
|
|
439
|
-
item.access['role'] = resolvedRoles;
|
|
440
|
-
if (!!resolvedBannedRoles)
|
|
441
|
-
item.access['bannedRole'] = resolvedBannedRoles;
|
|
442
|
-
if (!this._accessService.canAccessView(item, item.routingPath))
|
|
443
|
-
return;
|
|
444
|
-
return item;
|
|
445
|
-
}
|
|
446
|
-
representsRootNode(item) {
|
|
447
|
-
return item.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH).value === '/';
|
|
448
|
-
}
|
|
449
|
-
getTranslation(value) {
|
|
450
|
-
const locale = this._translateService.currentLang.split('-')[0];
|
|
451
|
-
return locale in value.translations ? value.translations[locale] : value.defaultValue;
|
|
452
|
-
}
|
|
453
|
-
resolveAccessRoles(filter, roleType) {
|
|
454
|
-
const allowedRoles = filter.immediateData.find(f => f.stringId === roleType)?.options;
|
|
455
|
-
if (!allowedRoles || Object.keys(allowedRoles).length === 0)
|
|
456
|
-
return undefined;
|
|
457
|
-
const roles = [];
|
|
458
|
-
Object.keys(allowedRoles).forEach(combined => {
|
|
459
|
-
const parts = combined.split(':');
|
|
460
|
-
roles.push({
|
|
461
|
-
processId: parts[1],
|
|
462
|
-
roleId: parts[0],
|
|
463
|
-
});
|
|
464
|
-
});
|
|
465
|
-
return roles;
|
|
466
|
-
}
|
|
467
|
-
getItemRoutingPath(itemCase) {
|
|
468
|
-
const transId = SETTINGS_TRANSITION_ID;
|
|
469
|
-
const taskId = itemCase.tasks.find(taskPair => taskPair.transition === transId).task;
|
|
470
|
-
const url = this._dynamicRoutingService.route;
|
|
471
|
-
return `/${url}/${taskId}`;
|
|
219
|
+
this._navigationService.switchOrder();
|
|
472
220
|
}
|
|
473
221
|
/**
|
|
474
222
|
* Function to check whether the back button should be displayed
|
|
475
223
|
* @returns boolean if the back button should be displayed
|
|
476
224
|
* */
|
|
477
225
|
isOnZeroLevel() {
|
|
478
|
-
return !!this.
|
|
226
|
+
return !!this._navigationService.currentNode?.level ? this._navigationService.currentNode.level == 0 : true;
|
|
479
227
|
}
|
|
480
228
|
isLeftItemsEmpty() {
|
|
481
|
-
return this.leftItems === undefined || this.leftItems.length === 0;
|
|
229
|
+
return this._navigationService.leftItems === undefined || this._navigationService.leftItems.length === 0;
|
|
482
230
|
}
|
|
483
231
|
isRightItemsEmpty() {
|
|
484
|
-
return this.rightItems === undefined || this.rightItems.length === 0;
|
|
232
|
+
return this._navigationService.rightItems === undefined || this._navigationService.rightItems.length === 0;
|
|
485
233
|
}
|
|
486
234
|
uriNodeTrackBy(index, node) {
|
|
487
235
|
return node.id;
|
|
@@ -504,33 +252,41 @@ export class AbstractNavigationDoubleDrawerComponent {
|
|
|
504
252
|
// this.userPreferenceService._drawerWidthChanged$.next(this.width);
|
|
505
253
|
// this.contentWidth.next(this.width);
|
|
506
254
|
}
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
255
|
+
isItemAndNodeEqual(item, node) {
|
|
256
|
+
return DoubleDrawerUtils.isItemAndNodeEqual(item, node);
|
|
257
|
+
}
|
|
258
|
+
resolveLayout(isLargeScreen) {
|
|
259
|
+
this._configLeftMenu = isLargeScreen ? {
|
|
260
|
+
mode: 'side',
|
|
261
|
+
opened: true,
|
|
262
|
+
disableClose: true,
|
|
263
|
+
width: this._configLeftMenu.width,
|
|
264
|
+
} : {
|
|
265
|
+
mode: 'over',
|
|
266
|
+
opened: false,
|
|
267
|
+
disableClose: false,
|
|
268
|
+
width: this._configLeftMenu.width,
|
|
269
|
+
};
|
|
270
|
+
this._configRightMenu = isLargeScreen ? {
|
|
271
|
+
mode: 'side',
|
|
272
|
+
opened: true,
|
|
273
|
+
disableClose: true,
|
|
274
|
+
width: this._configRightMenu.width,
|
|
275
|
+
} : {
|
|
276
|
+
mode: 'over',
|
|
277
|
+
opened: false,
|
|
278
|
+
disableClose: false,
|
|
279
|
+
width: this._configRightMenu.width,
|
|
518
280
|
};
|
|
519
281
|
}
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
if (!!(childView?.navigation?.hidden)) {
|
|
526
|
-
this.hiddenCustomItems.push({
|
|
527
|
-
id: configPath,
|
|
528
|
-
...childView,
|
|
529
|
-
});
|
|
530
|
-
}
|
|
282
|
+
canApplyAutoSelect() {
|
|
283
|
+
return this.configUrl === this._router.url;
|
|
284
|
+
}
|
|
285
|
+
openAvailableView() {
|
|
286
|
+
this._navigationService.openAvailableView();
|
|
531
287
|
}
|
|
532
288
|
}
|
|
533
|
-
AbstractNavigationDoubleDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractNavigationDoubleDrawerComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.BreakpointObserver }, { token: i3.LanguageService }, { token: i4.TranslateService }, { token: i5.UserService }, { token: i6.AccessService }, { token: i7.LoggerService }, { token: i8.ConfigurationService }, { token: i9.UriService }, { token: i10.CaseResourceService }, { token: i11.ImpersonationUserSelectService }, { token: i12.ImpersonationService }, { token: i13.DynamicNavigationRouteProviderService }], target: i0.ɵɵFactoryTarget.Component });
|
|
289
|
+
AbstractNavigationDoubleDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractNavigationDoubleDrawerComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.BreakpointObserver }, { token: i3.LanguageService }, { token: i4.TranslateService }, { token: i5.UserService }, { token: i6.AccessService }, { token: i7.LoggerService }, { token: i8.ConfigurationService }, { token: i9.UriService }, { token: i10.CaseResourceService }, { token: i11.ImpersonationUserSelectService }, { token: i12.ImpersonationService }, { token: i13.DynamicNavigationRouteProviderService }, { token: i14.RedirectService }, { token: i15.DoubleDrawerNavigationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
534
290
|
AbstractNavigationDoubleDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: AbstractNavigationDoubleDrawerComponent, selector: "ncc-abstract-navigation-double-drawer", inputs: { portalLeftMenu: "portalLeftMenu", portalRightMenu: "portalRightMenu", imageRouterLink: "imageRouterLink", imageAlt: "imageAlt", image: "image", profileRouterLink: "profileRouterLink", includeUser: "includeUser", includeLanguage: "includeLanguage", includeMoreMenu: "includeMoreMenu", includeImpersonation: "includeImpersonation", allClosable: "allClosable", folderIcon: "folderIcon", openedFolderIcon: "openedFolderIcon", filterIcon: "filterIcon", foldersCategoryName: "foldersCategoryName", viewsCategoryName: "viewsCategoryName" }, outputs: { loggedOut: "loggedOut", stateChanged: "stateChanged", itemClicked: "itemClicked", resized: "resized", itemLoaded: "itemLoaded" }, ngImport: i0, template: '', isInline: true });
|
|
535
291
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractNavigationDoubleDrawerComponent, decorators: [{
|
|
536
292
|
type: Component,
|
|
@@ -538,7 +294,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
538
294
|
selector: 'ncc-abstract-navigation-double-drawer',
|
|
539
295
|
template: '',
|
|
540
296
|
}]
|
|
541
|
-
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.BreakpointObserver }, { type: i3.LanguageService }, { type: i4.TranslateService }, { type: i5.UserService }, { type: i6.AccessService }, { type: i7.LoggerService }, { type: i8.ConfigurationService }, { type: i9.UriService }, { type: i10.CaseResourceService }, { type: i11.ImpersonationUserSelectService }, { type: i12.ImpersonationService }, { type: i13.DynamicNavigationRouteProviderService }]; }, propDecorators: { portalLeftMenu: [{
|
|
297
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.BreakpointObserver }, { type: i3.LanguageService }, { type: i4.TranslateService }, { type: i5.UserService }, { type: i6.AccessService }, { type: i7.LoggerService }, { type: i8.ConfigurationService }, { type: i9.UriService }, { type: i10.CaseResourceService }, { type: i11.ImpersonationUserSelectService }, { type: i12.ImpersonationService }, { type: i13.DynamicNavigationRouteProviderService }, { type: i14.RedirectService }, { type: i15.DoubleDrawerNavigationService }]; }, propDecorators: { portalLeftMenu: [{
|
|
542
298
|
type: Input
|
|
543
299
|
}], portalRightMenu: [{
|
|
544
300
|
type: Input
|
|
@@ -581,4 +337,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
581
337
|
}], itemLoaded: [{
|
|
582
338
|
type: Output
|
|
583
339
|
}] } });
|
|
584
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtbmF2aWdhdGlvbi1kb3VibGUtZHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi9uYXZpZ2F0aW9uL25hdmlnYXRpb24tZG91YmxlLWRyYXdlci9hYnN0cmFjdC1uYXZpZ2F0aW9uLWRvdWJsZS1kcmF3ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFJckcsT0FBTyxFQUFhLEVBQUUsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFNbkMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBVS9ELE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLHVEQUF1RCxDQUFDO0FBSXJHLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RSxPQUFPLEVBRUgseUJBQXlCLEVBQ3pCLGdCQUFnQixFQUNoQixTQUFTLEVBRVQsOEJBQThCLEVBQzlCLDBCQUEwQixFQUMxQixzQkFBc0IsRUFDdEIseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4QixzQkFBc0IsR0FDekIsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBY3JDLE1BQU0sT0FBZ0IsdUNBQXVDO0lBNEV6RCxZ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QW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludHN9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHtIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7UmVzaXplRXZlbnR9IGZyb20gJ2FuZ3VsYXItcmVzaXphYmxlLWVsZW1lbnQnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1JvbGVBY2Nlc3MsIFZpZXd9IGZyb20gJy4uLy4uLy4uL2NvbW1vbnMvc2NoZW1hJztcbmltcG9ydCB7QWNjZXNzU2VydmljZX0gZnJvbSAnLi4vLi4vYXV0aG9yaXphdGlvbi9wZXJtaXNzaW9uL2FjY2Vzcy5zZXJ2aWNlJztcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7STE4bkZpZWxkVmFsdWV9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2kxOG4tZmllbGQvbW9kZWxzL2kxOG4tZmllbGQtdmFsdWUnO1xuaW1wb3J0IHtDYXNlU2VhcmNoUmVxdWVzdEJvZHksIFBldHJpTmV0U2VhcmNoUmVxdWVzdH0gZnJvbSAnLi4vLi4vZmlsdGVyL21vZGVscy9jYXNlLXNlYXJjaC1yZXF1ZXN0LWJvZHknO1xuaW1wb3J0IHtTaW1wbGVGaWx0ZXJ9IGZyb20gJy4uLy4uL2ZpbHRlci9tb2RlbHMvc2ltcGxlLWZpbHRlcic7XG5pbXBvcnQge0ltcGVyc29uYXRpb25Vc2VyU2VsZWN0U2VydmljZX0gZnJvbSAnLi4vLi4vaW1wZXJzb25hdGlvbi9zZXJ2aWNlcy9pbXBlcnNvbmF0aW9uLXVzZXItc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHtJbXBlcnNvbmF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vaW1wZXJzb25hdGlvbi9zZXJ2aWNlcy9pbXBlcnNvbmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtDYXNlUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L2Nhc2UtcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge0Nhc2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvY2FzZSc7XG5pbXBvcnQge1BhZ2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvcGFnZSc7XG5pbXBvcnQge1xuICAgIER5bmFtaWNOYXZpZ2F0aW9uUm91dGVQcm92aWRlclNlcnZpY2UsXG59IGZyb20gJy4uLy4uL3JvdXRpbmcvZHluYW1pYy1uYXZpZ2F0aW9uLXJvdXRlLXByb3ZpZGVyL2R5bmFtaWMtbmF2aWdhdGlvbi1yb3V0ZS1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7TkFFX1JPVVRJTkdfQ09ORklHVVJBVElPTl9QQVRIfSBmcm9tICcuLi8uLi9yb3V0aW5nL3JvdXRpbmctYnVpbGRlci9yb3V0aW5nLWJ1aWxkZXIuc2VydmljZSc7XG5pbXBvcnQge0xhbmd1YWdlU2VydmljZX0gZnJvbSAnLi4vLi4vdHJhbnNsYXRlL2xhbmd1YWdlLnNlcnZpY2UnO1xuaW1wb3J0IHtVc2VyfSBmcm9tICcuLi8uLi91c2VyL21vZGVscy91c2VyJztcbmltcG9ydCB7VXNlclNlcnZpY2V9IGZyb20gJy4uLy4uL3VzZXIvc2VydmljZXMvdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7TG9hZGluZ0VtaXR0ZXJ9IGZyb20gJy4uLy4uL3V0aWxpdHkvbG9hZGluZy1lbWl0dGVyJztcbmltcG9ydCB7UGFnaW5hdGlvblBhcmFtc30gZnJvbSAnLi4vLi4vdXRpbGl0eS9wYWdpbmF0aW9uL3BhZ2luYXRpb24tcGFyYW1zJztcbmltcG9ydCB7R3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzfSBmcm9tICcuLi9tb2RlbC9ncm91cC1uYXZpZ2F0aW9uLWNvbnN0YW50cyc7XG5pbXBvcnQge1xuICAgIENvbmZpZ0RvdWJsZU1lbnUsXG4gICAgTEVGVF9EUkFXRVJfREVGQVVMVF9XSURUSCxcbiAgICBNRU5VX0lERU5USUZJRVJTLFxuICAgIE1lbnVPcmRlcixcbiAgICBOYXZpZ2F0aW9uSXRlbSxcbiAgICBSSUdIVF9EUkFXRVJfREVGQVVMVF9NSU5fV0lEVEgsXG4gICAgUklHSFRfRFJBV0VSX0RFRkFVTFRfV0lEVEgsXG4gICAgUklHSFRfRFJBV0VSX01BWF9XSURUSCxcbiAgICBSSUdIVF9TSURFX0lOSVRfUEFHRV9TSVpFLFxuICAgIFJJR0hUX1NJREVfTkVXX1BBR0VfU0laRSxcbiAgICBTRVRUSU5HU19UUkFOU0lUSU9OX0lELFxufSBmcm9tICcuLi9tb2RlbC9uYXZpZ2F0aW9uLWNvbmZpZ3MnO1xuaW1wb3J0IHtcbiAgICBNZW51SXRlbUNsaWNrRXZlbnQsXG4gICAgTWVudUl0ZW1Mb2FkZWRFdmVudCxcbiAgICBNZW51UmVzaXplRXZlbnQsXG4gICAgTWVudVN0YXRlQ2hhbmdlRXZlbnQsXG59IGZyb20gJy4uL21vZGVsL25hdmlnYXRpb24tbWVudS1ldmVudHMnO1xuaW1wb3J0IHtVcmlOb2RlUmVzb3VyY2V9IGZyb20gJy4uL21vZGVsL3VyaS1yZXNvdXJjZSc7XG5pbXBvcnQge1VyaVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2UvdXJpLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25jYy1hYnN0cmFjdC1uYXZpZ2F0aW9uLWRvdWJsZS1kcmF3ZXInLFxuICAgIHRlbXBsYXRlOiAnJyxcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROYXZpZ2F0aW9uRG91YmxlRHJhd2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQElucHV0KCkgcG9ydGFsTGVmdE1lbnU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQElucHV0KCkgcG9ydGFsUmlnaHRNZW51OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBJbnB1dCgpIGltYWdlUm91dGVyTGluazogc3RyaW5nID0gJy8nO1xuICAgIEBJbnB1dCgpIGltYWdlQWx0OiBzdHJpbmcgPSAnTG9nbyc7XG4gICAgQElucHV0KCkgaW1hZ2U6IHN0cmluZztcbiAgICBASW5wdXQoKSBwcm9maWxlUm91dGVyTGluazogc3RyaW5nID0gJy9wcm9maWxlJztcbiAgICBASW5wdXQoKSBpbmNsdWRlVXNlcjogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgaW5jbHVkZUxhbmd1YWdlOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBpbmNsdWRlTW9yZU1lbnU6IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIGluY2x1ZGVJbXBlcnNvbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBhbGxDbG9zYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgZm9sZGVySWNvbjogc3RyaW5nID0gJ2ZvbGRlcic7XG4gICAgQElucHV0KCkgb3BlbmVkRm9sZGVySWNvbjogc3RyaW5nID0gJ2ZvbGRlcl9vcGVuJztcbiAgICBASW5wdXQoKSBmaWx0ZXJJY29uOiBzdHJpbmcgPSAnZmlsdGVyX2FsdCc7XG4gICAgQElucHV0KCkgZm9sZGVyc0NhdGVnb3J5TmFtZTogc3RyaW5nID0gJ3Rvb2xiYXIubWVudS5mb2xkZXJzJztcbiAgICBASW5wdXQoKSB2aWV3c0NhdGVnb3J5TmFtZTogc3RyaW5nID0gJ3Rvb2xiYXIubWVudS52aWV3cyc7XG5cbiAgICBAT3V0cHV0KCkgbG9nZ2VkT3V0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KHRydWUpOyAvLyBvbiBsb2dvdXRcbiAgICBAT3V0cHV0KCkgc3RhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51U3RhdGVDaGFuZ2VFdmVudD4oKTsgLy8gb24gbWVudSBzdGF0ZSBjaGFuZ2VcbiAgICBAT3V0cHV0KCkgaXRlbUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVJdGVtQ2xpY2tFdmVudD4oKTsgLy8gb24gaXRlbSBjbGlja1xuICAgIEBPdXRwdXQoKSByZXNpemVkID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51UmVzaXplRXZlbnQ+KHRydWUpOyAvLyBvbiBtZW51IHJlc2l6ZVxuICAgIEBPdXRwdXQoKSBpdGVtTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51SXRlbUxvYWRlZEV2ZW50Pih0cnVlKTsgLy8gb24gaXRlbSBsb2FkZWRcblxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBkaXNwbGF5ZWQgaXRlbXMgb24gdGhlIGxlZnQgc2lkZVxuICAgICAqICovXG4gICAgbGVmdEl0ZW1zOiBBcnJheTxOYXZpZ2F0aW9uSXRlbT47XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGRpc3BsYXllZCBpdGVtcyBvbiB0aGUgcmlnaHQgc2lkZVxuICAgICAqICovXG4gICAgcmlnaHRJdGVtczogQXJyYXk8TmF2aWdhdGlvbkl0ZW0+O1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBoaWRkZW4gaXRlbXNcbiAgICAgKiAqL1xuICAgIG1vcmVJdGVtczogQXJyYXk8TmF2aWdhdGlvbkl0ZW0+O1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBjdXN0b20gaXRlbXMgaW4gbW9yZSBtZW51XG4gICAgICogKi9cbiAgICBoaWRkZW5DdXN0b21JdGVtczogQXJyYXk8TmF2aWdhdGlvbkl0ZW0+O1xuXG4gICAgaXRlbXNPcmRlcjogTWVudU9yZGVyO1xuXG4gICAgcHJvdGVjdGVkIF9icmVha3BvaW50U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJvdGVjdGVkIF9jdXJyZW50Tm9kZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgLyoqXG4gICAgICogQ3VycmVudGx5IGRpc3BsYXkgdXJpXG4gICAgICogU2libGluZ3Mgb2YgdGhlIG5vZGUgYXJlIG9uIHRoZSBsZWZ0LCBjaGlsZHJlbiBhcmUgb24gdGhlIHJpZ2h0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jdXJyZW50Tm9kZTogVXJpTm9kZVJlc291cmNlO1xuXG4gICAgbGVmdExvYWRpbmckOiBMb2FkaW5nRW1pdHRlcjtcbiAgICByaWdodExvYWRpbmckOiBMb2FkaW5nRW1pdHRlcjtcbiAgICBub2RlTG9hZGluZyQ6IExvYWRpbmdFbWl0dGVyO1xuXG4gICAgcHJvdGVjdGVkIF9jb25maWdMZWZ0TWVudTogQ29uZmlnRG91YmxlTWVudSA9IHtcbiAgICAgICAgbW9kZTogJ3NpZGUnLFxuICAgICAgICBvcGVuZWQ6IHRydWUsXG4gICAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXG4gICAgICAgIHdpZHRoOiBMRUZUX0RSQVdFUl9ERUZBVUxUX1dJRFRILFxuICAgIH07XG4gICAgcHJvdGVjdGVkIF9jb25maWdSaWdodE1lbnU6IENvbmZpZ0RvdWJsZU1lbnUgPSB7XG4gICAgICAgIG1vZGU6ICdzaWRlJyxcbiAgICAgICAgb3BlbmVkOiB0cnVlLFxuICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxuICAgICAgICB3aWR0aDogUklHSFRfRFJBV0VSX0RFRkFVTFRfV0lEVEgsXG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfY2hpbGRDdXN0b21WaWV3czogeyBbdXJpOiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IE5hdmlnYXRpb25JdGVtIH0gfTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3JvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2FjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9icmVha3BvaW50OiBCcmVha3BvaW50T2JzZXJ2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF91c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfYWNjZXNzU2VydmljZTogQWNjZXNzU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY29uZmlnOiBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF91cmlTZXJ2aWNlOiBVcmlTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2Nhc2VSZXNvdXJjZVNlcnZpY2U6IENhc2VSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfaW1wZXJzb25hdGlvblVzZXJTZWxlY3Q6IEltcGVyc29uYXRpb25Vc2VyU2VsZWN0U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9pbXBlcnNvbmF0aW9uOiBJbXBlcnNvbmF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9keW5hbWljUm91dGluZ1NlcnZpY2U6IER5bmFtaWNOYXZpZ2F0aW9uUm91dGVQcm92aWRlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sZWZ0SXRlbXMgPSBuZXcgQXJyYXk8TmF2aWdhdGlvbkl0ZW0+KCk7XG4gICAgICAgIHRoaXMucmlnaHRJdGVtcyA9IG5ldyBBcnJheTxOYXZpZ2F0aW9uSXRlbT4oKTtcbiAgICAgICAgdGhpcy5sZWZ0TG9hZGluZyQgPSBuZXcgTG9hZGluZ0VtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5yaWdodExvYWRpbmckID0gbmV3IExvYWRpbmdFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMubm9kZUxvYWRpbmckID0gbmV3IExvYWRpbmdFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuaXRlbXNPcmRlciA9IE1lbnVPcmRlci5Bc2NlbmRpbmc7XG4gICAgICAgIHRoaXMuaGlkZGVuQ3VzdG9tSXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5tb3JlSXRlbXMgPSBuZXcgQXJyYXk8TmF2aWdhdGlvbkl0ZW0+KCk7XG4gICAgICAgIHRoaXMuX2NoaWxkQ3VzdG9tVmlld3MgPSB7fTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYnJlYWtwb2ludFN1YnNjcmlwdGlvbiA9IHRoaXMuX2JyZWFrcG9pbnQub2JzZXJ2ZShbQnJlYWtwb2ludHMuSGFuZHNldExhbmRzY2FwZV0pLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYnJlYWtwb2ludC5pc01hdGNoZWQoJyhtYXgtd2lkdGg6IDk1OS45OXB4KScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlTGF5b3V0KGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlTGF5b3V0KHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jdXJyZW50Tm9kZVN1YnNjcmlwdGlvbiA9IHRoaXMuX3VyaVNlcnZpY2UuYWN0aXZlTm9kZSQuc3Vic2NyaWJlKG5vZGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IG5vZGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHZpZXdDb25maWd1cmF0aW9uUGF0aCA9IHRoaXMuX2FjdGl2YXRlZFJvdXRlLnNuYXBzaG90LmRhdGFbTkFFX1JPVVRJTkdfQ09ORklHVVJBVElPTl9QQVRIXTtcbiAgICAgICAgaWYgKCEhdmlld0NvbmZpZ3VyYXRpb25QYXRoKSB7XG4gICAgICAgICAgICBjb25zdCB2aWV3Q29uZmlndXJhdGlvbiA9IHRoaXMuX2NvbmZpZy5nZXRWaWV3QnlQYXRoKHZpZXdDb25maWd1cmF0aW9uUGF0aCk7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh2aWV3Q29uZmlndXJhdGlvbi5jaGlsZHJlbikuZm9yRWFjaCgoW2tleSwgY2hpbGRWaWV3XSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVVyaUZvckNoaWxkVmlld3Modmlld0NvbmZpZ3VyYXRpb25QYXRoICsgJy8nICsga2V5LCBjaGlsZFZpZXcpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZUhpZGRlbk1lbnVJdGVtRnJvbUNoaWxkVmlld3Modmlld0NvbmZpZ3VyYXRpb25QYXRoICsgJy8nICsga2V5LCBjaGlsZFZpZXcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgY3VycmVudE5vZGUoKTogVXJpTm9kZVJlc291cmNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnROb2RlO1xuICAgIH1cblxuICAgIHNldCBjdXJyZW50Tm9kZShub2RlOiBVcmlOb2RlUmVzb3VyY2UpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMuX2N1cnJlbnROb2RlIHx8IHRoaXMubGVmdExvYWRpbmckLmlzQWN0aXZlIHx8IHRoaXMucmlnaHRMb2FkaW5nJC5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2N1cnJlbnROb2RlID0gbm9kZTtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucGFyZW50SWQgJiYgIW5vZGUucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5wYXJlbnRJZCA9PT0gdGhpcy5fdXJpU2VydmljZS5yb290LmlkKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSB0aGlzLl91cmlTZXJ2aWNlLnJvb3Q7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZUxvYWRpbmckLm9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXJpU2VydmljZS5nZXROb2RlQnlQYXRoKHRoaXMuX3VyaVNlcnZpY2UucmVzb2x2ZVBhcmVudFBhdGgobm9kZSkpLnN1YnNjcmliZShuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSAhbiA/IHRoaXMuX3VyaVNlcnZpY2Uucm9vdCA6IG47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZUxvYWRpbmckLm9mZigpO1xuICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTG9hZGluZyQub2ZmKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubm9kZUxvYWRpbmckLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGVMb2FkaW5nJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZU1lbnVJdGVtcyhub2RlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlTWVudUl0ZW1zKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVNZW51SXRlbXMobm9kZTogVXJpTm9kZVJlc291cmNlKSB7XG4gICAgICAgIGlmICh0aGlzLl91cmlTZXJ2aWNlLmlzUm9vdChub2RlKSkge1xuICAgICAgICAgICAgdGhpcy5sZWZ0SXRlbXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMubG9hZFJpZ2h0U2lkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmxlZnRJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5yZXNvdXJjZT8uaW1tZWRpYXRlRGF0YS5maW5kKGYgPT4gZi5zdHJpbmdJZCA9PT0gR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfTk9ERV9QQVRIKT8udmFsdWUgPT09IG5vZGUudXJpUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRMZWZ0U2lkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2FkUmlnaHRTaWRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYnJlYWtwb2ludFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fY3VycmVudE5vZGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMubGVmdExvYWRpbmckLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMucmlnaHRMb2FkaW5nJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLm5vZGVMb2FkaW5nJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmxvZ2dlZE91dC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLml0ZW1DbGlja2VkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMucmVzaXplZC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLml0ZW1Mb2FkZWQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBnZXQgY29uZmlnTGVmdE1lbnUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWdMZWZ0TWVudTtcbiAgICB9XG5cbiAgICBnZXQgY29uZmlnUmlnaHRNZW51KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnUmlnaHRNZW51O1xuICAgIH1cblxuICAgIHRvZ2dsZU1lbnUoKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlUmlnaHRNZW51KCk7XG4gICAgICAgIGlmICh0aGlzLmFsbENsb3NhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUxlZnRNZW51KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVMZWZ0TWVudSgpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnTGVmdE1lbnUub3BlbmVkID0gIXRoaXMuX2NvbmZpZ0xlZnRNZW51Lm9wZW5lZDtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQuZW1pdCh7bWVudTogJ2xlZnQnLCBpc09wZW5lZDogdGhpcy5fY29uZmlnTGVmdE1lbnUub3BlbmVkfSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlUmlnaHRNZW51KCkge1xuICAgICAgICB0aGlzLl9jb25maWdSaWdodE1lbnUub3BlbmVkID0gIXRoaXMuX2NvbmZpZ1JpZ2h0TWVudS5vcGVuZWQ7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkLmVtaXQoe21lbnU6ICdyaWdodCcsIGlzT3BlbmVkOiB0aGlzLl9jb25maWdSaWdodE1lbnUub3BlbmVkfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVMYXlvdXQoaXNMYXJnZVNjcmVlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jb25maWdMZWZ0TWVudSA9IGlzTGFyZ2VTY3JlZW4gPyB7XG4gICAgICAgICAgICBtb2RlOiAnc2lkZScsXG4gICAgICAgICAgICBvcGVuZWQ6IHRydWUsXG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5fY29uZmlnTGVmdE1lbnUud2lkdGgsXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgICBtb2RlOiAnb3ZlcicsXG4gICAgICAgICAgICBvcGVuZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9jb25maWdMZWZ0TWVudS53aWR0aCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fY29uZmlnUmlnaHRNZW51ID0gaXNMYXJnZVNjcmVlbiA/IHtcbiAgICAgICAgICAgIG1vZGU6ICdzaWRlJyxcbiAgICAgICAgICAgIG9wZW5lZDogdHJ1ZSxcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9jb25maWdSaWdodE1lbnUud2lkdGgsXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgICBtb2RlOiAnb3ZlcicsXG4gICAgICAgICAgICBvcGVuZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9jb25maWdSaWdodE1lbnUud2lkdGgsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0TGFuZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlU2VydmljZS5nZXRMYW5ndWFnZSgpO1xuICAgIH1cblxuICAgIGxvZ291dCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdXNlclNlcnZpY2UubG9nb3V0KCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnVXNlciBpcyBsb2dnZWQgb3V0Jyk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlZE91dC5lbWl0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb25maWcuZ2V0KCkuc2VydmljZXMgJiYgdGhpcy5fY29uZmlnLmdldCgpLnNlcnZpY2VzLmF1dGggJiYgdGhpcy5fY29uZmlnLmdldE9uTG9nb3V0UGF0aCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RQYXRoID0gdGhpcy5fY29uZmlnLmdldE9uTG9nb3V0UGF0aCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5pbmZvKCdSZWRpcmVjdGluZyB0byAnICsgcmVkaXJlY3RQYXRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW3JlZGlyZWN0UGF0aF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbXBlcnNvbmF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faW1wZXJzb25hdGlvblVzZXJTZWxlY3Quc2VsZWN0SW1wZXJzb25hdGUoKTtcbiAgICB9XG5cbiAgICBzdG9wSW1wZXJzb25hdGluZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faW1wZXJzb25hdGlvbi5jZWFzZSgpO1xuICAgIH1cblxuICAgIGdldCB1c2VyKCk6IFVzZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclNlcnZpY2UudXNlcjtcbiAgICB9XG5cbiAgICBnZXQgY2FuR29CYWNrTG9hZGluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVMb2FkaW5nJDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBob21lIGNsaWNrLCB0aGUgY3VycmVudCBsZXZlbCBpcyBzZXQgdG8gMCwgYW5kIGN1cnJlbnQgcGFyZW50IGlzXG4gICAgICogc2V0IHRvIHJvb3Qgbm9kZS5cbiAgICAgKiAqL1xuICAgIG9uSG9tZUNsaWNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5sZWZ0TG9hZGluZyQuaXNBY3RpdmUgfHwgdGhpcy5yaWdodExvYWRpbmckLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXJpU2VydmljZS5hY3RpdmVOb2RlID0gdGhpcy5fdXJpU2VydmljZS5yb290O1xuICAgICAgICB0aGlzLml0ZW1DbGlja2VkLmVtaXQoe3VyaU5vZGU6IHRoaXMuX3VyaVNlcnZpY2UuYWN0aXZlTm9kZSwgaXNIb21lOiB0cnVlfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gYmFjayBjbGljaywgdGhlIHBhcmVudCBpcyBzZXQgdG8gcGFyZW50IG9mIGxlZnQgbm9kZXMsIHRoYXQgd2lsbCBzb2x2ZVxuICAgICAqIHRoZSByaWdodCBzaWRlIG1lbnUgKGVsZW1lbnRzIHRoYXQgd2VyZSBpbiBsZWZ0IHNpZGUsIGFmdGVyIGJhY2t3YXJkXG4gICAgICogbmF2aWdhdGlvbiB3aWxsIGJlIG9uIHRoZSByaWdodCBzaWRlKS5cbiAgICAgKiBDdXJyZW50IGxldmVsIGlzIHNldCB0byBhIGxvd2VyIG51bWJlciBpbiBvcmRlciB0byBzZXQgdGhlIGxlZnQgc2lkZSBtZW51LlxuICAgICAqICovXG4gICAgb25CYWNrQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmxlZnRMb2FkaW5nJC5pc0FjdGl2ZSB8fCB0aGlzLnJpZ2h0TG9hZGluZyQuaXNBY3RpdmUgfHwgdGhpcy5fdXJpU2VydmljZS5pc1Jvb3QodGhpcy5fY3VycmVudE5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXJpU2VydmljZS5hY3RpdmVOb2RlID0gdGhpcy5fY3VycmVudE5vZGUucGFyZW50O1xuICAgICAgICB0aGlzLml0ZW1DbGlja2VkLmVtaXQoe3VyaU5vZGU6IHRoaXMuX3VyaVNlcnZpY2UuYWN0aXZlTm9kZSwgaXNIb21lOiBmYWxzZX0pO1xuICAgIH1cblxuICAgIG9uSXRlbUNsaWNrKGl0ZW06IE5hdmlnYXRpb25JdGVtKTogdm9pZCB7XG4gICAgICAgIGlmIChpdGVtLnJlc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGN1c3RvbSB2aWV3IHJlcHJlc2VudGVkIG9ubHkgaW4gbmFlLmpzb25cbiAgICAgICAgICAgIGlmIChpdGVtLnByb2Nlc3NVcmkgPT09IHRoaXMuY3VycmVudE5vZGUudXJpUGF0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VyaVNlcnZpY2UuYWN0aXZlTm9kZSA9IHRoaXMuX2N1cnJlbnROb2RlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cmlTZXJ2aWNlLmFjdGl2ZU5vZGUgPSB0aGlzLl9jdXJyZW50Tm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLml0ZW1DbGlja2VkLmVtaXQoe3VyaU5vZGU6IHRoaXMuX3VyaVNlcnZpY2UuYWN0aXZlTm9kZSwgaXNIb21lOiBmYWxzZX0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGl0ZW0ucmVzb3VyY2UuaW1tZWRpYXRlRGF0YS5maW5kKGYgPT4gZi5zdHJpbmdJZCA9PT0gR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfTk9ERV9QQVRIKT8udmFsdWU7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNJdGVtQ2hpbGRyZW4oaXRlbSkgJiYgIXRoaXMubGVmdExvYWRpbmckLmlzQWN0aXZlICYmICF0aGlzLnJpZ2h0TG9hZGluZyQuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cmlTZXJ2aWNlLmdldE5vZGVCeVBhdGgocGF0aCkuc3Vic2NyaWJlKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cmlTZXJ2aWNlLmFjdGl2ZU5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1DbGlja2VkLmVtaXQoe3VyaU5vZGU6IHRoaXMuX3VyaVNlcnZpY2UuYWN0aXZlTm9kZSwgaXNIb21lOiBmYWxzZX0pO1xuICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXBhdGguaW5jbHVkZXModGhpcy5jdXJyZW50Tm9kZS51cmlQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VyaVNlcnZpY2UuYWN0aXZlTm9kZSA9IHRoaXMuX2N1cnJlbnROb2RlLnBhcmVudDtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1DbGlja2VkLmVtaXQoe3VyaU5vZGU6IHRoaXMuX3VyaVNlcnZpY2UuYWN0aXZlTm9kZSwgaXNIb21lOiBmYWxzZX0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cmlTZXJ2aWNlLmFjdGl2ZU5vZGUgPSB0aGlzLl9jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1DbGlja2VkLmVtaXQoe3VyaU5vZGU6IHRoaXMuX3VyaVNlcnZpY2UuYWN0aXZlTm9kZSwgaXNIb21lOiBmYWxzZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzSXRlbUNoaWxkcmVuKGl0ZW06IE5hdmlnYXRpb25JdGVtKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpdGVtLnJlc291cmNlPy5pbW1lZGlhdGVEYXRhLmZpbmQoZiA9PiBmLnN0cmluZ0lkID09PSBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9IQVNfQ0hJTERSRU4pPy52YWx1ZTtcbiAgICB9XG5cbiAgICBpc0l0ZW1BbmROb2RlRXF1YWwoaXRlbTogTmF2aWdhdGlvbkl0ZW0sIG5vZGU6IFVyaU5vZGVSZXNvdXJjZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXRlbS5yZXNvdXJjZT8uaW1tZWRpYXRlRGF0YS5maW5kKGYgPT4gZi5zdHJpbmdJZCA9PT0gR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfTk9ERV9QQVRIKT8udmFsdWUgPT09IG5vZGUudXJpUGF0aDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbG9hZExlZnRTaWRlKCkge1xuICAgICAgICBpZiAodGhpcy5fdXJpU2VydmljZS5pc1Jvb3QodGhpcy5fY3VycmVudE5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLmxlZnRJdGVtcyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGVmdExvYWRpbmckLm9uKCk7XG4gICAgICAgIHRoaXMuX3VyaVNlcnZpY2UuZ2V0SXRlbUNhc2VCeU5vZGVQYXRoKHRoaXMuY3VycmVudE5vZGUucGFyZW50KS5zdWJzY3JpYmUocGFnZSA9PiB7XG4gICAgICAgICAgICBsZXQgY2hpbGRDYXNlcyQ7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0SXRlbTtcbiAgICAgICAgICAgIGxldCBvcmRlcmVkQ2hpbGRDYXNlSWRzO1xuXG4gICAgICAgICAgICBpZiAocGFnZT8ucGFnaW5hdGlvbj8udG90YWxFbGVtZW50cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNoaWxkQ2FzZXMkID0gb2YoW10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRJdGVtID0gcGFnZS5jb250ZW50WzBdO1xuICAgICAgICAgICAgICAgIG9yZGVyZWRDaGlsZENhc2VJZHMgPSB0aGlzLmV4dHJhY3RDaGlsZENhc2VJZHModGFyZ2V0SXRlbSk7XG4gICAgICAgICAgICAgICAgY2hpbGRDYXNlcyQgPSB0aGlzLmdldEl0ZW1DYXNlc0J5SWRzSW5PbmVQYWdlKG9yZGVyZWRDaGlsZENhc2VJZHMpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIG1hcChwID0+IHAuY29udGVudCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2hpbGRDYXNlcyQuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChmb2xkZXIgPT4gdGhpcy5yZXNvbHZlSXRlbUNhc2VUb05hdmlnYXRpb25JdGVtKGZvbGRlcikpLmZpbHRlcihpID0+ICEhaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0SXRlbXMgPSByZXN1bHQuc29ydCgoYSwgYikgPT4gb3JkZXJlZENoaWxkQ2FzZUlkcy5pbmRleE9mKGEucmVzb3VyY2Uuc3RyaW5nSWQpIC0gb3JkZXJlZENoaWxkQ2FzZUlkcy5pbmRleE9mKGIucmVzb3VyY2Uuc3RyaW5nSWQpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVDdXN0b21WaWV3c0luTGVmdFNpZGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnRMb2FkaW5nJC5vZmYoKTtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1Mb2FkZWQuZW1pdCh7bWVudTogJ2xlZnQnLCBpdGVtczogdGhpcy5sZWZ0SXRlbXN9KTtcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMubGVmdEl0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlQ3VzdG9tVmlld3NJbkxlZnRTaWRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0TG9hZGluZyQub2ZmKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMubGVmdEl0ZW1zID0gW107XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVDdXN0b21WaWV3c0luTGVmdFNpZGUoKTtcbiAgICAgICAgICAgIHRoaXMubGVmdExvYWRpbmckLm9mZigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbG9hZFJpZ2h0U2lkZSgpIHtcbiAgICAgICAgdGhpcy5yaWdodExvYWRpbmckLm9uKCk7XG4gICAgICAgIHRoaXMubW9yZUl0ZW1zID0gW107XG4gICAgICAgIHRoaXMuX3VyaVNlcnZpY2UuZ2V0SXRlbUNhc2VCeU5vZGVQYXRoKHRoaXMuY3VycmVudE5vZGUpLnN1YnNjcmliZShwYWdlID0+IHtcbiAgICAgICAgICAgIGxldCBjaGlsZENhc2VzJDtcbiAgICAgICAgICAgIGxldCB0YXJnZXRJdGVtO1xuICAgICAgICAgICAgbGV0IG9yZGVyZWRDaGlsZENhc2VJZHM7XG5cbiAgICAgICAgICAgIGlmIChwYWdlPy5wYWdpbmF0aW9uPy50b3RhbEVsZW1lbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRDYXNlcyQgPSBvZihbXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldEl0ZW0gPSBwYWdlLmNvbnRlbnRbMF07XG4gICAgICAgICAgICAgICAgb3JkZXJlZENoaWxkQ2FzZUlkcyA9IHRoaXMuZXh0cmFjdENoaWxkQ2FzZUlkcyh0YXJnZXRJdGVtKTtcbiAgICAgICAgICAgICAgICBjaGlsZENhc2VzJCA9IHRoaXMuZ2V0SXRlbUNhc2VzQnlJZHNJbk9uZVBhZ2Uob3JkZXJlZENoaWxkQ2FzZUlkcykucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKHAgPT4gcC5jb250ZW50KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjaGlsZENhc2VzJC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IGFzIENhc2VbXSkuc29ydCgoYSwgYikgPT4gb3JkZXJlZENoaWxkQ2FzZUlkcy5pbmRleE9mKGEuc3RyaW5nSWQpIC0gb3JkZXJlZENoaWxkQ2FzZUlkcy5pbmRleE9mKGIuc3RyaW5nSWQpKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IFJJR0hUX1NJREVfSU5JVF9QQUdFX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3UmlnaHRJdGVtczogQ2FzZVtdID0gcmVzdWx0LnNwbGljZSgwLCBSSUdIVF9TSURFX0lOSVRfUEFHRV9TSVpFKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodEl0ZW1zID0gcmF3UmlnaHRJdGVtcy5tYXAoZm9sZGVyID0+IHRoaXMucmVzb2x2ZUl0ZW1DYXNlVG9OYXZpZ2F0aW9uSXRlbShmb2xkZXIpKS5maWx0ZXIoaSA9PiAhIWkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vcmVJdGVtcyA9IHJlc3VsdC5tYXAoZm9sZGVyID0+IHRoaXMucmVzb2x2ZUl0ZW1DYXNlVG9OYXZpZ2F0aW9uSXRlbShmb2xkZXIpKS5maWx0ZXIoaSA9PiAhIWkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHRJdGVtcyA9IHJlc3VsdC5tYXAoZm9sZGVyID0+IHRoaXMucmVzb2x2ZUl0ZW1DYXNlVG9OYXZpZ2F0aW9uSXRlbShmb2xkZXIpKS5maWx0ZXIoaSA9PiAhIWkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVDdXN0b21WaWV3c0luUmlnaHRTaWRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodExvYWRpbmckLm9mZigpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbUxvYWRlZC5lbWl0KHttZW51OiAncmlnaHQnLCBpdGVtczogdGhpcy5yaWdodEl0ZW1zfSk7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0SXRlbXMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vcmVJdGVtcyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZUN1c3RvbVZpZXdzSW5SaWdodFNpZGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0TG9hZGluZyQub2ZmKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMucmlnaHRJdGVtcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5tb3JlSXRlbXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZUN1c3RvbVZpZXdzSW5SaWdodFNpZGUoKTtcbiAgICAgICAgICAgIHRoaXMucmlnaHRMb2FkaW5nJC5vZmYoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGV4dHJhY3RDaGlsZENhc2VJZHMoaXRlbTogQ2FzZSk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaW1tZWRpYXRlRGF0YS5maW5kKGYgPT4gZi5zdHJpbmdJZCA9PT0gR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfQ0hJTERfSVRFTV9JRFMpPy52YWx1ZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0SXRlbUNhc2VzQnlJZHNJbk9uZVBhZ2UoY2FzZUlkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPFBhZ2U8Q2FzZT4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlbUNhc2VzQnlJZHMoY2FzZUlkcywgMCwgY2FzZUlkcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRJdGVtQ2FzZXNCeUlkcyhjYXNlSWRzOiBzdHJpbmdbXSwgcGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxQYWdlPENhc2U+PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaEJvZHk6IENhc2VTZWFyY2hSZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgIHN0cmluZ0lkOiBjYXNlSWRzLFxuICAgICAgICAgICAgcHJvY2VzczogTUVOVV9JREVOVElGSUVSUy5tYXAoaWQgPT4gKHtpZGVudGlmaWVyOiBpZH0gYXMgUGV0cmlOZXRTZWFyY2hSZXF1ZXN0KSksXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAgICAgICAuc2V0KFBhZ2luYXRpb25QYXJhbXMuUEFHRV9TSVpFLCBwYWdlU2l6ZSlcbiAgICAgICAgICAgIC5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX05VTUJFUiwgcGFnZU51bWJlcik7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLnNlYXJjaENhc2VzKFNpbXBsZUZpbHRlci5mcm9tQ2FzZVF1ZXJ5KHNlYXJjaEJvZHkpLCBodHRwUGFyYW1zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZE1vcmVJdGVtcygpIHtcbiAgICAgICAgaWYgKHRoaXMubW9yZUl0ZW1zLmxlbmd0aCA+IFJJR0hUX1NJREVfTkVXX1BBR0VfU0laRSkge1xuICAgICAgICAgICAgdGhpcy5yaWdodEl0ZW1zLnB1c2goLi4udGhpcy5tb3JlSXRlbXMuc3BsaWNlKDAsIFJJR0hUX1NJREVfTkVXX1BBR0VfU0laRSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yaWdodEl0ZW1zLnB1c2goLi4udGhpcy5tb3JlSXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5tb3JlSXRlbXMgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc0FzY2VuZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNPcmRlciA9PT0gTWVudU9yZGVyLkFzY2VuZGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3dpdGNoT3JkZXIoKSB7XG4gICAgICAgIHRoaXMuaXRlbXNPcmRlciA9ICh0aGlzLml0ZW1zT3JkZXIgKyAxKSAlIDI7XG4gICAgICAgIGxldCBtdWx0aXBsaWVyID0gMTtcbiAgICAgICAgaWYgKHRoaXMuaXRlbXNPcmRlciA9PT0gTWVudU9yZGVyLkRlc2NlbmRpbmcpIHtcbiAgICAgICAgICAgIG11bHRpcGxpZXIgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJpZ2h0SXRlbXMuc29ydCgoYSwgYikgPT4gbXVsdGlwbGllciAqIChhPy5uYXZpZ2F0aW9uIGFzIE5hdmlnYXRpb25JdGVtKT8udGl0bGUubG9jYWxlQ29tcGFyZSgoYj8ubmF2aWdhdGlvbiBhcyBOYXZpZ2F0aW9uSXRlbSk/LnRpdGxlKSk7XG4gICAgICAgIHRoaXMubGVmdEl0ZW1zLnNvcnQoKGEsIGIpID0+IG11bHRpcGxpZXIgKiAoYT8ubmF2aWdhdGlvbiBhcyBOYXZpZ2F0aW9uSXRlbSk/LnRpdGxlLmxvY2FsZUNvbXBhcmUoKGI/Lm5hdmlnYXRpb24gYXMgTmF2aWdhdGlvbkl0ZW0pPy50aXRsZSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNvbHZlQ3VzdG9tVmlld3NJblJpZ2h0U2lkZSgpIHtcbiAgICAgICAgaWYgKCEhdGhpcy5fY2hpbGRDdXN0b21WaWV3c1t0aGlzLl9jdXJyZW50Tm9kZS51cmlQYXRoXSkge1xuICAgICAgICAgICAgdGhpcy5yaWdodEl0ZW1zLnB1c2goLi4uT2JqZWN0LnZhbHVlcyh0aGlzLl9jaGlsZEN1c3RvbVZpZXdzW3RoaXMuX2N1cnJlbnROb2RlLnVyaVBhdGhdKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZUN1c3RvbVZpZXdzSW5MZWZ0U2lkZSgpIHtcbiAgICAgICAgaWYgKCEhdGhpcy5fY2hpbGRDdXN0b21WaWV3c1t0aGlzLl9jdXJyZW50Tm9kZS5wYXJlbnQudXJpUGF0aF0pIHtcbiAgICAgICAgICAgIHRoaXMubGVmdEl0ZW1zLnB1c2goLi4uT2JqZWN0LnZhbHVlcyh0aGlzLl9jaGlsZEN1c3RvbVZpZXdzW3RoaXMuX2N1cnJlbnROb2RlLnBhcmVudC51cmlQYXRoXSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVJdGVtQ2FzZVRvTmF2aWdhdGlvbkl0ZW0oaXRlbUNhc2U6IENhc2UpOiBOYXZpZ2F0aW9uSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLnJlcHJlc2VudHNSb290Tm9kZShpdGVtQ2FzZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtOiBOYXZpZ2F0aW9uSXRlbSA9IHtcbiAgICAgICAgICAgIGFjY2Vzczoge30sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uOiB7XG4gICAgICAgICAgICAgICAgaWNvbjogaXRlbUNhc2UuaW1tZWRpYXRlRGF0YS5maW5kKGYgPT4gZi5zdHJpbmdJZCA9PT0gR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfTUVOVV9JQ09OKT8udmFsdWUgfHwgdGhpcy5maWx0ZXJJY29uLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmdldFRyYW5zbGF0aW9uKGl0ZW1DYXNlLmltbWVkaWF0ZURhdGEuZmluZChmID0+IGYuc3RyaW5nSWQgPT09IEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cy5JVEVNX0ZJRUxEX0lEX01FTlVfTkFNRSk/LnZhbHVlKSB8fCBpdGVtQ2FzZS50aXRsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb3V0aW5nOiB7XG4gICAgICAgICAgICAgICAgcGF0aDogdGhpcy5nZXRJdGVtUm91dGluZ1BhdGgoaXRlbUNhc2UpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlkOiBpdGVtQ2FzZS5zdHJpbmdJZCxcbiAgICAgICAgICAgIHJlc291cmNlOiBpdGVtQ2FzZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRSb2xlcyA9IHRoaXMucmVzb2x2ZUFjY2Vzc1JvbGVzKGl0ZW1DYXNlLCBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9BTExPV0VEX1JPTEVTKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRCYW5uZWRSb2xlcyA9IHRoaXMucmVzb2x2ZUFjY2Vzc1JvbGVzKGl0ZW1DYXNlLCBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9CQU5ORURfUk9MRVMpO1xuICAgICAgICBpZiAoISFyZXNvbHZlZFJvbGVzKSBpdGVtLmFjY2Vzc1sncm9sZSddID0gcmVzb2x2ZWRSb2xlcztcbiAgICAgICAgaWYgKCEhcmVzb2x2ZWRCYW5uZWRSb2xlcykgaXRlbS5hY2Nlc3NbJ2Jhbm5lZFJvbGUnXSA9IHJlc29sdmVkQmFubmVkUm9sZXM7XG4gICAgICAgIGlmICghdGhpcy5fYWNjZXNzU2VydmljZS5jYW5BY2Nlc3NWaWV3KGl0ZW0sIGl0ZW0ucm91dGluZ1BhdGgpKSByZXR1cm47XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXByZXNlbnRzUm9vdE5vZGUoaXRlbTogQ2FzZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXRlbS5pbW1lZGlhdGVEYXRhLmZpbmQoZiA9PiBmLnN0cmluZ0lkID09PSBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9OT0RFX1BBVEgpLnZhbHVlID09PSAnLyc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFRyYW5zbGF0aW9uKHZhbHVlOiBJMThuRmllbGRWYWx1ZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcuc3BsaXQoJy0nKVswXTtcbiAgICAgICAgcmV0dXJuIGxvY2FsZSBpbiB2YWx1ZS50cmFuc2xhdGlvbnMgPyB2YWx1ZS50cmFuc2xhdGlvbnNbbG9jYWxlXSA6IHZhbHVlLmRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZUFjY2Vzc1JvbGVzKGZpbHRlcjogQ2FzZSwgcm9sZVR5cGU6IHN0cmluZyk6IEFycmF5PFJvbGVBY2Nlc3M+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZFJvbGVzID0gZmlsdGVyLmltbWVkaWF0ZURhdGEuZmluZChmID0+IGYuc3RyaW5nSWQgPT09IHJvbGVUeXBlKT8ub3B0aW9ucztcbiAgICAgICAgaWYgKCFhbGxvd2VkUm9sZXMgfHwgT2JqZWN0LmtleXMoYWxsb3dlZFJvbGVzKS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHJvbGVzID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKGFsbG93ZWRSb2xlcykuZm9yRWFjaChjb21iaW5lZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGNvbWJpbmVkLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICByb2xlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzSWQ6IHBhcnRzWzFdLFxuICAgICAgICAgICAgICAgIHJvbGVJZDogcGFydHNbMF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByb2xlcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0SXRlbVJvdXRpbmdQYXRoKGl0ZW1DYXNlOiBDYXNlKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zSWQgPSBTRVRUSU5HU19UUkFOU0lUSU9OX0lEO1xuICAgICAgICBjb25zdCB0YXNrSWQgPSBpdGVtQ2FzZS50YXNrcy5maW5kKHRhc2tQYWlyID0+IHRhc2tQYWlyLnRyYW5zaXRpb24gPT09IHRyYW5zSWQpLnRhc2s7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuX2R5bmFtaWNSb3V0aW5nU2VydmljZS5yb3V0ZTtcbiAgICAgICAgcmV0dXJuIGAvJHt1cmx9LyR7dGFza0lkfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciB0aGUgYmFjayBidXR0b24gc2hvdWxkIGJlIGRpc3BsYXllZFxuICAgICAqIEByZXR1cm5zIGJvb2xlYW4gaWYgdGhlIGJhY2sgYnV0dG9uIHNob3VsZCBiZSBkaXNwbGF5ZWRcbiAgICAgKiAqL1xuICAgIGlzT25aZXJvTGV2ZWwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2N1cnJlbnROb2RlPy5sZXZlbCA/IHRoaXMuX2N1cnJlbnROb2RlLmxldmVsID09IDAgOiB0cnVlO1xuICAgIH1cblxuICAgIGlzTGVmdEl0ZW1zRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZnRJdGVtcyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMubGVmdEl0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBpc1JpZ2h0SXRlbXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRJdGVtcyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMucmlnaHRJdGVtcy5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgdXJpTm9kZVRyYWNrQnkoaW5kZXg6IG51bWJlciwgbm9kZTogVXJpTm9kZVJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmlkO1xuICAgIH1cblxuICAgIGl0ZW1zVHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBOYXZpZ2F0aW9uSXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS5pZDtcbiAgICB9XG5cbiAgICBvblJlc2l6ZUV2ZW50KGV2ZW50OiBSZXNpemVFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQucmVjdGFuZ2xlLndpZHRoID4gUklHSFRfRFJBV0VSX01BWF9XSURUSCkge1xuICAgICAgICAgICAgdGhpcy5fY29uZmlnUmlnaHRNZW51LndpZHRoID0gUklHSFRfRFJBV0VSX01BWF9XSURUSDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5yZWN0YW5nbGUud2lkdGggPCBSSUdIVF9EUkFXRVJfREVGQVVMVF9NSU5fV0lEVEgpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZ1JpZ2h0TWVudS53aWR0aCA9IFJJR0hUX0RSQVdFUl9ERUZBVUxUX01JTl9XSURUSDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZ1JpZ2h0TWVudS53aWR0aCA9IGV2ZW50LnJlY3RhbmdsZS53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2l6ZWQuZW1pdCh7d2lkdGg6IHRoaXMuX2NvbmZpZ1JpZ2h0TWVudS53aWR0aH0pO1xuICAgICAgICAvLyBUT0RPIGltcGxlbWVudCBzYXZpbmcgZHJhd2VyIHdpZHRoIHRvIHVzZXIgcHJlZmVyZW5jZXNcbiAgICAgICAgLy8gdGhpcy51c2VyUHJlZmVyZW5jZVNlcnZpY2UuX2RyYXdlcldpZHRoQ2hhbmdlZCQubmV4dCh0aGlzLndpZHRoKTtcbiAgICAgICAgLy8gdGhpcy5jb250ZW50V2lkdGgubmV4dCh0aGlzLndpZHRoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZVVyaUZvckNoaWxkVmlld3MoY29uZmlnUGF0aDogc3RyaW5nLCBjaGlsZFZpZXc6IFZpZXcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFjaGlsZFZpZXcucHJvY2Vzc1VyaSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuX2FjY2Vzc1NlcnZpY2UuY2FuQWNjZXNzVmlldyhjaGlsZFZpZXcsIGNvbmZpZ1BhdGgpKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5fY2hpbGRDdXN0b21WaWV3c1tjaGlsZFZpZXcucHJvY2Vzc1VyaV0pIHtcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkQ3VzdG9tVmlld3NbY2hpbGRWaWV3LnByb2Nlc3NVcmldID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hpbGRDdXN0b21WaWV3c1tjaGlsZFZpZXcucHJvY2Vzc1VyaV1bY29uZmlnUGF0aF0gPSB7XG4gICAgICAgICAgICBpZDogY29uZmlnUGF0aCxcbiAgICAgICAgICAgIC4uLmNoaWxkVmlldyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZUhpZGRlbk1lbnVJdGVtRnJvbUNoaWxkVmlld3MoY29uZmlnUGF0aDogc3RyaW5nLCBjaGlsZFZpZXc6IFZpZXcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFjaGlsZFZpZXcubmF2aWdhdGlvbikgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuX2FjY2Vzc1NlcnZpY2UuY2FuQWNjZXNzVmlldyhjaGlsZFZpZXcsIGNvbmZpZ1BhdGgpKSByZXR1cm47XG4gICAgICAgIGlmICghISgoY2hpbGRWaWV3Py5uYXZpZ2F0aW9uIGFzIGFueSk/LmhpZGRlbikpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZGVuQ3VzdG9tSXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQ6IGNvbmZpZ1BhdGgsXG4gICAgICAgICAgICAgICAgLi4uY2hpbGRWaWV3LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiJdfQ==
|
|
340
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtbmF2aWdhdGlvbi1kb3VibGUtZHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi9uYXZpZ2F0aW9uL25hdmlnYXRpb24tZG91YmxlLWRyYXdlci9hYnN0cmFjdC1uYXZpZ2F0aW9uLWRvdWJsZS1kcmF3ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUtyRyxPQUFPLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBVzVDLE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLHVEQUF1RCxDQUFDO0FBSXJHLE9BQU8sRUFFSCx5QkFBeUIsRUFFekIsOEJBQThCLEVBQzlCLDBCQUEwQixFQUMxQixzQkFBc0IsR0FDekIsTUFBTSw2QkFBNkIsQ0FBQztBQVVyQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNN0QsTUFBTSxPQUFnQix1Q0FBdUM7SUEwQ3pELFlBQWdDLE9BQWUsRUFDZixlQUErQixFQUMvQixXQUErQixFQUMvQixnQkFBaUMsRUFDakMsaUJBQW1DLEVBQ25DLFlBQXlCLEVBQ3pCLGNBQTZCLEVBQzdCLElBQW1CLEVBQ25CLE9BQTZCLEVBQzdCLFdBQXVCLEVBQ3ZCLG9CQUF5QyxFQUN6Qyx3QkFBd0QsRUFDeEQsY0FBb0MsRUFDcEMsc0JBQTZELEVBQzdELGdCQUFpQyxFQUNqQyxrQkFBaUQ7UUFmakQsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUMvQixnQkFBVyxHQUFY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c0JBQXJCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludHN9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1Jlc2l6ZUV2ZW50fSBmcm9tICdhbmd1bGFyLXJlc2l6YWJsZS1lbGVtZW50JztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0FjY2Vzc1NlcnZpY2V9IGZyb20gJy4uLy4uL2F1dGhvcml6YXRpb24vcGVybWlzc2lvbi9hY2Nlc3Muc2VydmljZSc7XG5pbXBvcnQge0NvbmZpZ3VyYXRpb25TZXJ2aWNlfSBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5pbXBvcnQge0ltcGVyc29uYXRpb25Vc2VyU2VsZWN0U2VydmljZX0gZnJvbSAnLi4vLi4vaW1wZXJzb25hdGlvbi9zZXJ2aWNlcy9pbXBlcnNvbmF0aW9uLXVzZXItc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHtJbXBlcnNvbmF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vaW1wZXJzb25hdGlvbi9zZXJ2aWNlcy9pbXBlcnNvbmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtDYXNlUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L2Nhc2UtcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIER5bmFtaWNOYXZpZ2F0aW9uUm91dGVQcm92aWRlclNlcnZpY2UsXG59IGZyb20gJy4uLy4uL3JvdXRpbmcvZHluYW1pYy1uYXZpZ2F0aW9uLXJvdXRlLXByb3ZpZGVyL2R5bmFtaWMtbmF2aWdhdGlvbi1yb3V0ZS1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZGlyZWN0U2VydmljZSB9IGZyb20gJy4uLy4uL3JvdXRpbmcvcmVkaXJlY3Qtc2VydmljZS9yZWRpcmVjdC5zZXJ2aWNlJztcbmltcG9ydCB7TkFFX1JPVVRJTkdfQ09ORklHVVJBVElPTl9QQVRIfSBmcm9tICcuLi8uLi9yb3V0aW5nL3JvdXRpbmctYnVpbGRlci9yb3V0aW5nLWJ1aWxkZXIuc2VydmljZSc7XG5pbXBvcnQge0xhbmd1YWdlU2VydmljZX0gZnJvbSAnLi4vLi4vdHJhbnNsYXRlL2xhbmd1YWdlLnNlcnZpY2UnO1xuaW1wb3J0IHtVc2VyfSBmcm9tICcuLi8uLi91c2VyL21vZGVscy91c2VyJztcbmltcG9ydCB7VXNlclNlcnZpY2V9IGZyb20gJy4uLy4uL3VzZXIvc2VydmljZXMvdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgQ29uZmlnRG91YmxlTWVudSxcbiAgICBMRUZUX0RSQVdFUl9ERUZBVUxUX1dJRFRILFxuICAgIE5hdmlnYXRpb25JdGVtLFxuICAgIFJJR0hUX0RSQVdFUl9ERUZBVUxUX01JTl9XSURUSCxcbiAgICBSSUdIVF9EUkFXRVJfREVGQVVMVF9XSURUSCxcbiAgICBSSUdIVF9EUkFXRVJfTUFYX1dJRFRILFxufSBmcm9tICcuLi9tb2RlbC9uYXZpZ2F0aW9uLWNvbmZpZ3MnO1xuaW1wb3J0IHtcbiAgICBNZW51SXRlbUNsaWNrRXZlbnQsXG4gICAgTWVudUl0ZW1Mb2FkZWRFdmVudCxcbiAgICBNZW51UmVzaXplRXZlbnQsXG4gICAgTWVudVN0YXRlQ2hhbmdlRXZlbnQsXG59IGZyb20gJy4uL21vZGVsL25hdmlnYXRpb24tbWVudS1ldmVudHMnO1xuaW1wb3J0IHtVcmlOb2RlUmVzb3VyY2V9IGZyb20gJy4uL21vZGVsL3VyaS1yZXNvdXJjZSc7XG5pbXBvcnQge1VyaVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2UvdXJpLnNlcnZpY2UnO1xuaW1wb3J0IHtEb3VibGVEcmF3ZXJOYXZpZ2F0aW9uU2VydmljZX0gZnJvbSBcIi4vc2VydmljZS9kb3VibGUtZHJhd2VyLW5hdmlnYXRpb24uc2VydmljZVwiO1xuaW1wb3J0IHtEb3VibGVEcmF3ZXJVdGlsc30gZnJvbSBcIi4vdXRpbC9kb3VibGUtZHJhd2VyLXV0aWxzXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmNjLWFic3RyYWN0LW5hdmlnYXRpb24tZG91YmxlLWRyYXdlcicsXG4gICAgdGVtcGxhdGU6ICcnLFxufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5hdmlnYXRpb25Eb3VibGVEcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBASW5wdXQoKSBwb3J0YWxMZWZ0TWVudTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBASW5wdXQoKSBwb3J0YWxSaWdodE1lbnU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQElucHV0KCkgaW1hZ2VSb3V0ZXJMaW5rOiBzdHJpbmcgPSAnLyc7XG4gICAgQElucHV0KCkgaW1hZ2VBbHQ6IHN0cmluZyA9ICdMb2dvJztcbiAgICBASW5wdXQoKSBpbWFnZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHByb2ZpbGVSb3V0ZXJMaW5rOiBzdHJpbmcgPSAnL3Byb2ZpbGUnO1xuICAgIEBJbnB1dCgpIGluY2x1ZGVVc2VyOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBpbmNsdWRlTGFuZ3VhZ2U6IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIGluY2x1ZGVNb3JlTWVudTogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgaW5jbHVkZUltcGVyc29uYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIGFsbENsb3NhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBmb2xkZXJJY29uOiBzdHJpbmcgPSAnZm9sZGVyJztcbiAgICBASW5wdXQoKSBvcGVuZWRGb2xkZXJJY29uOiBzdHJpbmcgPSAnZm9sZGVyX29wZW4nO1xuICAgIEBJbnB1dCgpIGZpbHRlckljb246IHN0cmluZyA9ICdmaWx0ZXJfYWx0JztcbiAgICBASW5wdXQoKSBmb2xkZXJzQ2F0ZWdvcnlOYW1lOiBzdHJpbmcgPSAndG9vbGJhci5tZW51LmZvbGRlcnMnO1xuICAgIEBJbnB1dCgpIHZpZXdzQ2F0ZWdvcnlOYW1lOiBzdHJpbmcgPSAndG9vbGJhci5tZW51LnZpZXdzJztcblxuICAgIEBPdXRwdXQoKSBsb2dnZWRPdXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4odHJ1ZSk7IC8vIG9uIGxvZ291dFxuICAgIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVTdGF0ZUNoYW5nZUV2ZW50PigpOyAvLyBvbiBtZW51IHN0YXRlIGNoYW5nZVxuICAgIEBPdXRwdXQoKSBpdGVtQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TWVudUl0ZW1DbGlja0V2ZW50PigpOyAvLyBvbiBpdGVtIGNsaWNrXG4gICAgQE91dHB1dCgpIHJlc2l6ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVSZXNpemVFdmVudD4odHJ1ZSk7IC8vIG9uIG1lbnUgcmVzaXplXG4gICAgQE91dHB1dCgpIGl0ZW1Mb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVJdGVtTG9hZGVkRXZlbnQ+KHRydWUpOyAvLyBvbiBpdGVtIGxvYWRlZFxuXG4gICAgcHJvdGVjdGVkIF9icmVha3BvaW50U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBwcm90ZWN0ZWQgX2NvbmZpZ0xlZnRNZW51OiBDb25maWdEb3VibGVNZW51ID0ge1xuICAgICAgICBtb2RlOiAnc2lkZScsXG4gICAgICAgIG9wZW5lZDogdHJ1ZSxcbiAgICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgICAgd2lkdGg6IExFRlRfRFJBV0VSX0RFRkFVTFRfV0lEVEgsXG4gICAgfTtcbiAgICBwcm90ZWN0ZWQgX2NvbmZpZ1JpZ2h0TWVudTogQ29uZmlnRG91YmxlTWVudSA9IHtcbiAgICAgICAgbW9kZTogJ3NpZGUnLFxuICAgICAgICBvcGVuZWQ6IHRydWUsXG4gICAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXG4gICAgICAgIHdpZHRoOiBSSUdIVF9EUkFXRVJfREVGQVVMVF9XSURUSCxcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIGNvbmZpZ1VybDogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2JyZWFrcG9pbnQ6IEJyZWFrcG9pbnRPYnNlcnZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9hY2Nlc3NTZXJ2aWNlOiBBY2Nlc3NTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9jb25maWc6IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3VyaVNlcnZpY2U6IFVyaVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY2FzZVJlc291cmNlU2VydmljZTogQ2FzZVJlc291cmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9pbXBlcnNvbmF0aW9uVXNlclNlbGVjdDogSW1wZXJzb25hdGlvblVzZXJTZWxlY3RTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2ltcGVyc29uYXRpb246IEltcGVyc29uYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2R5bmFtaWNSb3V0aW5nU2VydmljZTogRHluYW1pY05hdmlnYXRpb25Sb3V0ZVByb3ZpZGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9yZWRpcmVjdFNlcnZpY2U6IFJlZGlyZWN0U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9uYXZpZ2F0aW9uU2VydmljZTogRG91YmxlRHJhd2VyTmF2aWdhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgbGV0IGNvbmZpZ1VybDogc3RyaW5nID0gdGhpcy5fY29uZmlnLmdldFNlcnZpY2VzQ29uZmlndXJhdGlvbigpPy5kb3VibGVEcmF3ZXI/LnVybDtcbiAgICAgICAgaWYgKGNvbmZpZ1VybCAhPT0gdW5kZWZpbmVkICYmICFjb25maWdVcmwuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICBjb25maWdVcmwgPSAnLycgKyBjb25maWdVcmw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maWdVcmwgPSBjb25maWdVcmw7XG5cbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvblNlcnZpY2UuaXRlbUNsaWNrZWQkLnN1YnNjcmliZSgoaXRlbUNsaWNrRXZlbnQ6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pdGVtQ2xpY2tlZC5lbWl0KGl0ZW1DbGlja0V2ZW50KTtcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvblNlcnZpY2UuaXRlbUxvYWRlZCQuc3Vic2NyaWJlKChpdGVtTG9hZGVkRXZlbnQ6IE1lbnVJdGVtTG9hZGVkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXRlbUxvYWRlZC5lbWl0KGl0ZW1Mb2FkZWRFdmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9icmVha3BvaW50U3Vic2NyaXB0aW9uID0gdGhpcy5fYnJlYWtwb2ludC5vYnNlcnZlKFtCcmVha3BvaW50cy5IYW5kc2V0TGFuZHNjYXBlXSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9icmVha3BvaW50LmlzTWF0Y2hlZCgnKG1heC13aWR0aDogOTU5Ljk5cHgpJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVMYXlvdXQoZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVMYXlvdXQodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmNhbkFwcGx5QXV0b1NlbGVjdCgpKSB7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0SXRlbXMkLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKHJpZ2h0SXRlbXMgPT4gcmlnaHRJdGVtcy5sZW5ndGggPiAwKSxcbiAgICAgICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgICApLnN1YnNjcmliZSgoKT0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5BdmFpbGFibGVWaWV3KCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgdmlld0NvbmZpZ3VyYXRpb25QYXRoID0gdGhpcy5fYWN0aXZhdGVkUm91dGUuc25hcHNob3QuZGF0YVtOQUVfUk9VVElOR19DT05GSUdVUkFUSU9OX1BBVEhdO1xuICAgICAgICBpZiAoISF2aWV3Q29uZmlndXJhdGlvblBhdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdDb25maWd1cmF0aW9uID0gdGhpcy5fY29uZmlnLmdldFZpZXdCeVBhdGgodmlld0NvbmZpZ3VyYXRpb25QYXRoKTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRpb25TZXJ2aWNlLmluaXRpYWxpemVDdXN0b21WaWV3c09mVmlldyh2aWV3Q29uZmlndXJhdGlvbiwgdmlld0NvbmZpZ3VyYXRpb25QYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYnJlYWtwb2ludFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5sb2dnZWRPdXQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5pdGVtQ2xpY2tlZC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLnJlc2l6ZWQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5pdGVtTG9hZGVkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50Tm9kZSgpOiBVcmlOb2RlUmVzb3VyY2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblNlcnZpY2UuY3VycmVudE5vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjdXJyZW50Tm9kZShub2RlOiBVcmlOb2RlUmVzb3VyY2UpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvblNlcnZpY2UuY3VycmVudE5vZGUgPSBub2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29uZmlnTGVmdE1lbnUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWdMZWZ0TWVudTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbmZpZ1JpZ2h0TWVudSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZ1JpZ2h0TWVudTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxlZnRJdGVtcyQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2VydmljZS5sZWZ0SXRlbXMkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGVmdEl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblNlcnZpY2UubGVmdEl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmlnaHRJdGVtcyQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2VydmljZS5yaWdodEl0ZW1zJDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJpZ2h0SXRlbXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2VydmljZS5yaWdodEl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbW9yZUl0ZW1zJCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TZXJ2aWNlLm1vcmVJdGVtcyQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtb3JlSXRlbXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2VydmljZS5tb3JlSXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoaWRkZW5DdXN0b21JdGVtcyQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2VydmljZS5oaWRkZW5DdXN0b21JdGVtcyQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoaWRkZW5DdXN0b21JdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TZXJ2aWNlLmhpZGRlbkN1c3RvbUl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGVmdExvYWRpbmckKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblNlcnZpY2UubGVmdExvYWRpbmckO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmlnaHRMb2FkaW5nJCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TZXJ2aWNlLnJpZ2h0TG9hZGluZyQ7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZU1lbnUoKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlUmlnaHRNZW51KCk7XG4gICAgICAgIGlmICh0aGlzLmFsbENsb3NhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUxlZnRNZW51KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlTGVmdE1lbnUoKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZ0xlZnRNZW51Lm9wZW5lZCA9ICF0aGlzLl9jb25maWdMZWZ0TWVudS5vcGVuZWQ7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkLmVtaXQoe21lbnU6ICdsZWZ0JywgaXNPcGVuZWQ6IHRoaXMuX2NvbmZpZ0xlZnRNZW51Lm9wZW5lZH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVSaWdodE1lbnUoKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZ1JpZ2h0TWVudS5vcGVuZWQgPSAhdGhpcy5fY29uZmlnUmlnaHRNZW51Lm9wZW5lZDtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQuZW1pdCh7bWVudTogJ3JpZ2h0JywgaXNPcGVuZWQ6IHRoaXMuX2NvbmZpZ1JpZ2h0TWVudS5vcGVuZWR9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGFuZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlU2VydmljZS5nZXRMYW5ndWFnZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2dvdXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3VzZXJTZXJ2aWNlLmxvZ291dCgpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ1VzZXIgaXMgbG9nZ2VkIG91dCcpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZWRPdXQuZW1pdChyZXNwb25zZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fY29uZmlnLmdldCgpLnNlcnZpY2VzICYmIHRoaXMuX2NvbmZpZy5nZXQoKS5zZXJ2aWNlcy5hdXRoICYmIHRoaXMuX2NvbmZpZy5nZXRPbkxvZ291dFBhdGgoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0UGF0aCA9IHRoaXMuX2NvbmZpZy5nZXRPbkxvZ291dFBhdGgoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuaW5mbygnUmVkaXJlY3RpbmcgdG8gJyArIHJlZGlyZWN0UGF0aCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtyZWRpcmVjdFBhdGhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGltcGVyc29uYXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pbXBlcnNvbmF0aW9uVXNlclNlbGVjdC5zZWxlY3RJbXBlcnNvbmF0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdG9wSW1wZXJzb25hdGluZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faW1wZXJzb25hdGlvbi5jZWFzZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXNlcigpOiBVc2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTZXJ2aWNlLnVzZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjYW5Hb0JhY2tMb2FkaW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TZXJ2aWNlLmNhbkdvQmFja0xvYWRpbmckO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGhvbWUgY2xpY2ssIHRoZSBjdXJyZW50IGxldmVsIGlzIHNldCB0byAwLCBhbmQgY3VycmVudCBwYXJlbnQgaXNcbiAgICAgKiBzZXQgdG8gcm9vdCBub2RlLlxuICAgICAqICovXG4gICAgcHVibGljIG9uSG9tZUNsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9uYXZpZ2F0aW9uU2VydmljZS5vbkhvbWVDbGljaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGJhY2sgY2xpY2ssIHRoZSBwYXJlbnQgaXMgc2V0IHRvIHBhcmVudCBvZiBsZWZ0IG5vZGVzLCB0aGF0IHdpbGwgc29sdmVcbiAgICAgKiB0aGUgcmlnaHQgc2lkZSBtZW51IChlbGVtZW50cyB0aGF0IHdlcmUgaW4gbGVmdCBzaWRlLCBhZnRlciBiYWNrd2FyZFxuICAgICAqIG5hdmlnYXRpb24gd2lsbCBiZSBvbiB0aGUgcmlnaHQgc2lkZSkuXG4gICAgICogQ3VycmVudCBsZXZlbCBpcyBzZXQgdG8gYSBsb3dlciBudW1iZXIgaW4gb3JkZXIgdG8gc2V0IHRoZSBsZWZ0IHNpZGUgbWVudS5cbiAgICAgKiAqL1xuICAgIHB1YmxpYyBvbkJhY2tDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvblNlcnZpY2Uub25CYWNrQ2xpY2soKVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkl0ZW1DbGljayhpdGVtOiBOYXZpZ2F0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9uYXZpZ2F0aW9uU2VydmljZS5vbkl0ZW1DbGljayhpdGVtKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZE1vcmVJdGVtcygpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvblNlcnZpY2UubG9hZE1vcmVJdGVtcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0FzY2VuZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TZXJ2aWNlLmlzQXNjZW5kaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN3aXRjaE9yZGVyKCkge1xuICAgICAgICB0aGlzLl9uYXZpZ2F0aW9uU2VydmljZS5zd2l0Y2hPcmRlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJhY2sgYnV0dG9uIHNob3VsZCBiZSBkaXNwbGF5ZWRcbiAgICAgKiBAcmV0dXJucyBib29sZWFuIGlmIHRoZSBiYWNrIGJ1dHRvbiBzaG91bGQgYmUgZGlzcGxheWVkXG4gICAgICogKi9cbiAgICBwdWJsaWMgaXNPblplcm9MZXZlbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fbmF2aWdhdGlvblNlcnZpY2UuY3VycmVudE5vZGU/LmxldmVsID8gdGhpcy5fbmF2aWdhdGlvblNlcnZpY2UuY3VycmVudE5vZGUubGV2ZWwgPT0gMCA6IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGlzTGVmdEl0ZW1zRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2VydmljZS5sZWZ0SXRlbXMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9uYXZpZ2F0aW9uU2VydmljZS5sZWZ0SXRlbXMubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1JpZ2h0SXRlbXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TZXJ2aWNlLnJpZ2h0SXRlbXMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9uYXZpZ2F0aW9uU2VydmljZS5yaWdodEl0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXJpTm9kZVRyYWNrQnkoaW5kZXg6IG51bWJlciwgbm9kZTogVXJpTm9kZVJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBpdGVtc1RyYWNrQnkoaW5kZXg6IG51bWJlciwgaXRlbTogTmF2aWdhdGlvbkl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVzaXplRXZlbnQoZXZlbnQ6IFJlc2l6ZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5yZWN0YW5nbGUud2lkdGggPiBSSUdIVF9EUkFXRVJfTUFYX1dJRFRIKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25maWdSaWdodE1lbnUud2lkdGggPSBSSUdIVF9EUkFXRVJfTUFYX1dJRFRIO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnJlY3RhbmdsZS53aWR0aCA8IFJJR0hUX0RSQVdFUl9ERUZBVUxUX01JTl9XSURUSCkge1xuICAgICAgICAgICAgdGhpcy5fY29uZmlnUmlnaHRNZW51LndpZHRoID0gUklHSFRfRFJBV0VSX0RFRkFVTFRfTUlOX1dJRFRIO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29uZmlnUmlnaHRNZW51LndpZHRoID0gZXZlbnQucmVjdGFuZ2xlLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzaXplZC5lbWl0KHt3aWR0aDogdGhpcy5fY29uZmlnUmlnaHRNZW51LndpZHRofSk7XG4gICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IHNhdmluZyBkcmF3ZXIgd2lkdGggdG8gdXNlciBwcmVmZXJlbmNlc1xuICAgICAgICAvLyB0aGlzLnVzZXJQcmVmZXJlbmNlU2VydmljZS5fZHJhd2VyV2lkdGhDaGFuZ2VkJC5uZXh0KHRoaXMud2lkdGgpO1xuICAgICAgICAvLyB0aGlzLmNvbnRlbnRXaWR0aC5uZXh0KHRoaXMud2lkdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0l0ZW1BbmROb2RlRXF1YWwoaXRlbTogTmF2aWdhdGlvbkl0ZW0sIG5vZGU6IFVyaU5vZGVSZXNvdXJjZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gRG91YmxlRHJhd2VyVXRpbHMuaXNJdGVtQW5kTm9kZUVxdWFsKGl0ZW0sIG5vZGUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNvbHZlTGF5b3V0KGlzTGFyZ2VTY3JlZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY29uZmlnTGVmdE1lbnUgPSBpc0xhcmdlU2NyZWVuID8ge1xuICAgICAgICAgICAgbW9kZTogJ3NpZGUnLFxuICAgICAgICAgICAgb3BlbmVkOiB0cnVlLFxuICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgICAgICAgd2lkdGg6IHRoaXMuX2NvbmZpZ0xlZnRNZW51LndpZHRoLFxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgbW9kZTogJ292ZXInLFxuICAgICAgICAgICAgb3BlbmVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5fY29uZmlnTGVmdE1lbnUud2lkdGgsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2NvbmZpZ1JpZ2h0TWVudSA9IGlzTGFyZ2VTY3JlZW4gPyB7XG4gICAgICAgICAgICBtb2RlOiAnc2lkZScsXG4gICAgICAgICAgICBvcGVuZWQ6IHRydWUsXG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5fY29uZmlnUmlnaHRNZW51LndpZHRoLFxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgbW9kZTogJ292ZXInLFxuICAgICAgICAgICAgb3BlbmVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5fY29uZmlnUmlnaHRNZW51LndpZHRoLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjYW5BcHBseUF1dG9TZWxlY3QoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1VybCA9PT0gdGhpcy5fcm91dGVyLnVybDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3BlbkF2YWlsYWJsZVZpZXcoKSB7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25TZXJ2aWNlLm9wZW5BdmFpbGFibGVWaWV3KCk7XG4gICAgfVxufVxuIl19
|