@sapui5/sap.fe.templates 1.106.0 → 1.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/package.json +3 -2
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/ListComponent.js +5 -1
  4. package/src/sap/fe/templates/ListComponent.ts +4 -0
  5. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +43 -3
  6. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +38 -2
  7. package/src/sap/fe/templates/ListReport/ListReport.view.xml +12 -1
  8. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +80 -22
  9. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +63 -14
  10. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +30 -21
  11. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.ts +21 -10
  12. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +4 -7
  13. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +2 -6
  14. package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -14
  15. package/src/sap/fe/templates/ListReport/overrides/Share.ts +8 -15
  16. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +15 -11
  17. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +27 -9
  18. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +3 -3
  19. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +2 -2
  20. package/src/sap/fe/templates/ListReport/view/fragments/Table.fragment.xml +0 -1
  21. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +132 -3
  22. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +88 -1
  23. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +35 -47
  24. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +286 -45
  25. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +209 -32
  26. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +49 -7
  27. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +60 -5
  28. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +1 -1
  29. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +1 -2
  30. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
  31. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +1 -2
  32. package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.js +33 -0
  33. package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.ts +23 -0
  34. package/src/sap/fe/templates/ObjectPage/manifest.json +8 -0
  35. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +2 -2
  36. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +2 -1
  37. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +10 -3
  38. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +8 -1
  39. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +7 -1
  40. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +5 -0
  41. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +8 -2
  42. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderContent.fragment.xml +38 -23
  43. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingContent.fragment.xml +30 -0
  44. package/src/sap/fe/templates/ObjectPage/view/fragments/MacroChart.fragment.xml +1 -0
  45. package/src/sap/fe/templates/ObjectPage/view/fragments/Table.fragment.xml +1 -0
  46. package/src/sap/fe/templates/library.js +1 -1
  47. package/src/sap/fe/templates/messagebundle_lt.properties +1 -1
  48. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +0 -899
  49. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +0 -830
  50. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +0 -207
  51. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +0 -177
  52. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +0 -575
  53. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +0 -492
  54. package/src/sap/fe/templates/RootContainer/view/Fcl.view.xml +0 -16
  55. package/src/sap/fe/templates/RootContainer/view/NavContainer.view.xml +0 -9
@@ -1,899 +0,0 @@
1
- /*!
2
- * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
- */
5
- sap.ui.define(["sap/base/Log", "sap/f/FlexibleColumnLayoutSemanticHelper", "sap/f/library", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/KeepAliveHelper", "sap/m/Link", "sap/m/MessageBox", "sap/m/MessagePage", "./RootContainerBaseController"], function (Log, FlexibleColumnLayoutSemanticHelper, fLibrary, ViewState, ClassSupport, KeepAliveHelper, Link, MessageBox, MessagePage, BaseController) {
6
- "use strict";
7
-
8
- var _dec, _dec2, _class, _class2, _descriptor;
9
-
10
- var Icon = MessageBox.Icon;
11
- var Action = MessageBox.Action;
12
- var usingExtension = ClassSupport.usingExtension;
13
- var defineUI5Class = ClassSupport.defineUI5Class;
14
-
15
- function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
16
-
17
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
18
-
19
- function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
20
-
21
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
22
-
23
- function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
24
-
25
- function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
26
-
27
- var LayoutType = fLibrary.LayoutType;
28
- var CONSTANTS = {
29
- page: {
30
- names: ["BeginColumn", "MidColumn", "EndColumn"],
31
- currentGetter: {
32
- prefix: "getCurrent",
33
- suffix: "Page"
34
- },
35
- getter: {
36
- prefix: "get",
37
- suffix: "Pages"
38
- }
39
- }
40
- };
41
-
42
- var _getViewFromContainer = function (oContainer) {
43
- if (oContainer.isA("sap.ui.core.ComponentContainer")) {
44
- return oContainer.getComponentInstance().getRootControl();
45
- } else {
46
- return oContainer;
47
- }
48
- };
49
-
50
- var FclController = (_dec = defineUI5Class("sap.fe.templates.RootContainer.controller.Fcl"), _dec2 = usingExtension(ViewState.override({
51
- applyInitialStateOnly: function () {
52
- return false;
53
- },
54
- adaptBindingRefreshControls: function (aControls) {
55
- this.getView().getController()._getAllVisibleViews().forEach(function (oChildView) {
56
- var pChildView = new Promise(function (resolve) {
57
- resolve(oChildView);
58
- });
59
- aControls.push(pChildView);
60
- });
61
- },
62
- adaptStateControls: function (aStateControls) {
63
- this.getView().getController()._getAllVisibleViews().forEach(function (oChildView) {
64
- var pChildView = new Promise(function (resolve) {
65
- resolve(oChildView);
66
- });
67
- aStateControls.push(pChildView);
68
- });
69
- },
70
- onRestore: function () {
71
- var oView = this.getView(),
72
- oNavContainer = oView.byId("appContent");
73
- var oFCLController = this.getView().getController();
74
- var oInternalModel = oNavContainer.getModel("internal");
75
- var oPages = oInternalModel.getProperty("/pages");
76
-
77
- for (var sComponentId in oPages) {
78
- oInternalModel.setProperty("/pages/".concat(sComponentId, "/restoreStatus"), "pending");
79
- }
80
-
81
- oFCLController.onContainerReady();
82
- },
83
- onSuspend: function () {
84
- var oFCLController = this.getView().getController();
85
- var oFCLControl = oFCLController.getFclControl();
86
- var aBeginColumnPages = oFCLControl.getBeginColumnPages() || [];
87
- var aMidColumnPages = oFCLControl.getMidColumnPages() || [];
88
- var aEndColumnPages = oFCLControl.getEndColumnPages() || [];
89
- var aPages = [].concat(aBeginColumnPages, aMidColumnPages, aEndColumnPages);
90
- aPages.forEach(function (oPage) {
91
- var oTargetView = _getViewFromContainer(oPage);
92
-
93
- var oController = oTargetView && oTargetView.getController();
94
-
95
- if (oController && oController.viewState && oController.viewState.onSuspend) {
96
- return oController.viewState.onSuspend();
97
- }
98
- });
99
- }
100
- })), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseController) {
101
- _inheritsLoose(FclController, _BaseController);
102
-
103
- function FclController() {
104
- var _this;
105
-
106
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
107
- args[_key] = arguments[_key];
108
- }
109
-
110
- _this = _BaseController.call.apply(_BaseController, [this].concat(args)) || this;
111
-
112
- _initializerDefineProperty(_this, "viewState", _descriptor, _assertThisInitialized(_this));
113
-
114
- return _this;
115
- }
116
-
117
- var _proto = FclController.prototype;
118
-
119
- /**
120
- * @private
121
- * @name sap.fe.templates.RootContainer.controller.Fcl.getMetadata
122
- * @function
123
- */
124
- _proto.onInit = function onInit() {
125
- _BaseController.prototype.onInit.call(this);
126
-
127
- this._internalInit();
128
- };
129
-
130
- _proto.attachRouteMatchers = function attachRouteMatchers() {
131
- this.getRouter().attachBeforeRouteMatched(this._getViewForNavigatedRowsComputation, this);
132
-
133
- _BaseController.prototype.attachRouteMatchers.call(this);
134
-
135
- this._internalInit();
136
-
137
- this.getRouter().attachBeforeRouteMatched(this.onBeforeRouteMatched, this);
138
- this.getRouter().attachRouteMatched(this.onRouteMatched, this);
139
- this.getFclControl().attachStateChange(this._saveLayout, this);
140
- };
141
-
142
- _proto._internalInit = function _internalInit() {
143
- if (this._oRouterProxy) {
144
- return; // Already initialized
145
- }
146
-
147
- this.sCurrentRouteName = "";
148
- this.sCurrentArguments = {};
149
- this.SQUERYKEYNAME = "?query";
150
- var oAppComponent = this.getAppComponent();
151
- this._oRouterProxy = oAppComponent.getRouterProxy(); // Get FCL configuration in the manifest
152
-
153
- this._oFCLConfig = {
154
- maxColumnsCount: 3
155
- };
156
- var oRoutingConfig = oAppComponent.getManifest()["sap.ui5"].routing;
157
-
158
- if (oRoutingConfig && oRoutingConfig.config) {
159
- if (oRoutingConfig.config.flexibleColumnLayout) {
160
- var oFCLManifestConfig = oRoutingConfig.config.flexibleColumnLayout; // Default layout for 2 columns
161
-
162
- if (oFCLManifestConfig.defaultTwoColumnLayoutType) {
163
- this._oFCLConfig.defaultTwoColumnLayoutType = oFCLManifestConfig.defaultTwoColumnLayoutType;
164
- } // Default layout for 3 columns
165
-
166
-
167
- if (oFCLManifestConfig.defaultThreeColumnLayoutType) {
168
- this._oFCLConfig.defaultThreeColumnLayoutType = oFCLManifestConfig.defaultThreeColumnLayoutType;
169
- } // Limit FCL to 2 columns ?
170
-
171
-
172
- if (oFCLManifestConfig.limitFCLToTwoColumns === true) {
173
- this._oFCLConfig.maxColumnsCount = 2;
174
- }
175
- }
176
-
177
- if (oRoutingConfig.config.controlAggregation) {
178
- this._oFCLConfig.defaultControlAggregation = oRoutingConfig.config.controlAggregation;
179
- }
180
- }
181
-
182
- this._initializeTargetAggregation(oAppComponent);
183
-
184
- this._initializeRoutesInformation(oAppComponent);
185
- };
186
-
187
- _proto.getFclControl = function getFclControl() {
188
- return this.getView().getContent()[0];
189
- };
190
-
191
- _proto._saveLayout = function _saveLayout(oEvent) {
192
- this.sPreviousLayout = oEvent.getParameters().layout;
193
- }
194
- /**
195
- * Get the additionnal view (on top of the visible views), to be able to compute the latest table navigated rows of the most right visible view after a nav back or column fullscreen.
196
- *
197
- * @function
198
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_getRightMostViewBeforeRouteMatched
199
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
200
- */
201
- ;
202
-
203
- _proto._getViewForNavigatedRowsComputation = function _getViewForNavigatedRowsComputation() {
204
- var _this2 = this;
205
-
206
- var aAllVisibleViewsBeforeRouteMatched = this._getAllVisibleViews(this.sPreviousLayout);
207
-
208
- var oRightMostViewBeforeRouteMatched = aAllVisibleViewsBeforeRouteMatched[aAllVisibleViewsBeforeRouteMatched.length - 1];
209
- var oRightMostView;
210
- this.getRouter().attachEventOnce("routeMatched", function (oEvent) {
211
- oRightMostView = _getViewFromContainer(oEvent.getParameter("views")[oEvent.getParameter("views").length - 1]);
212
-
213
- if (oRightMostViewBeforeRouteMatched) {
214
- // Navigation forward from L2 to view level L3 (FullScreenLayout):
215
- if (oRightMostView.getViewData() && oRightMostView.getViewData().viewLevel === _this2._oFCLConfig.maxColumnsCount) {
216
- _this2.oAdditionalViewForNavRowsComputation = oRightMostView;
217
- } // Navigations backward from L3 down to L2, L1, L0 (ThreeColumn layout):
218
-
219
-
220
- if (oRightMostView.getViewData() && oRightMostViewBeforeRouteMatched.getViewData() && oRightMostViewBeforeRouteMatched.getViewData().viewLevel < _this2._oFCLConfig.maxColumnsCount && oRightMostViewBeforeRouteMatched.getViewData() && oRightMostViewBeforeRouteMatched.getViewData().viewLevel > oRightMostView.getViewData().viewLevel && oRightMostView !== oRightMostViewBeforeRouteMatched) {
221
- _this2.oAdditionalViewForNavRowsComputation = oRightMostViewBeforeRouteMatched;
222
- }
223
- }
224
- });
225
- };
226
-
227
- _proto.getViewForNavigatedRowsComputation = function getViewForNavigatedRowsComputation() {
228
- return this.oAdditionalViewForNavRowsComputation;
229
- };
230
-
231
- _proto.onExit = function onExit() {
232
- this.getRouter().detachRouteMatched(this.onRouteMatched, this);
233
- this.getRouter().detachBeforeRouteMatched(this.onBeforeRouteMatched, this);
234
- this.getFclControl().detachStateChange(this.onStateChanged, this);
235
- this.getFclControl().detachAfterEndColumnNavigate(this.onStateChanged, this);
236
- this._oTargetsAggregation = null;
237
- this._oTargetsFromRoutePattern = null;
238
- BaseController.prototype.onExit.bind(this)();
239
- }
240
- /**
241
- * Check if the FCL component is enabled.
242
- *
243
- * @function
244
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#isFclEnabled
245
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
246
- * @returns `true` since we are in FCL scenario
247
- * @ui5-restricted
248
- * @final
249
- */
250
- ;
251
-
252
- _proto.isFclEnabled = function isFclEnabled() {
253
- return true;
254
- };
255
-
256
- _proto.displayMessagePage = function displayMessagePage(sErrorMessage, mParameters) {
257
- var oFCLControl = this.getFclControl();
258
-
259
- if (this._oFCLConfig && mParameters.FCLLevel >= this._oFCLConfig.maxColumnsCount) {
260
- mParameters.FCLLevel = this._oFCLConfig.maxColumnsCount - 1;
261
- }
262
-
263
- if (!this.aMessagePages) {
264
- this.aMessagePages = [null, null, null];
265
- }
266
-
267
- var oMessagePage = this.aMessagePages[mParameters.FCLLevel];
268
-
269
- if (!oMessagePage) {
270
- oMessagePage = new MessagePage({
271
- showHeader: false,
272
- icon: "sap-icon://message-error"
273
- });
274
- this.aMessagePages[mParameters.FCLLevel] = oMessagePage;
275
-
276
- switch (mParameters.FCLLevel) {
277
- case 0:
278
- oFCLControl.addBeginColumnPage(oMessagePage);
279
- break;
280
-
281
- case 1:
282
- oFCLControl.addMidColumnPage(oMessagePage);
283
- break;
284
-
285
- default:
286
- oFCLControl.addEndColumnPage(oMessagePage);
287
- }
288
- }
289
-
290
- oMessagePage.setText(sErrorMessage);
291
-
292
- if (mParameters.technicalMessage) {
293
- oMessagePage.setCustomDescription(new Link({
294
- text: mParameters.description || mParameters.technicalMessage,
295
- press: function () {
296
- MessageBox.show(mParameters.technicalMessage, {
297
- icon: Icon.ERROR,
298
- title: mParameters.title,
299
- actions: [Action.OK],
300
- defaultAction: Action.OK,
301
- details: mParameters.technicalDetails || "",
302
- contentWidth: "60%"
303
- });
304
- }
305
- }));
306
- } else {
307
- oMessagePage.setDescription(mParameters.description || "");
308
- }
309
-
310
- oFCLControl.to(oMessagePage.getId());
311
- return Promise.resolve(true);
312
- }
313
- /**
314
- * Initialize the object _oTargetsAggregation that defines for each route the relevant aggregation and pattern.
315
- *
316
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_initializeTargetAggregation
317
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
318
- * @function
319
- * @param [oAppComponent] Reference to the AppComponent
320
- */
321
- ;
322
-
323
- _proto._initializeTargetAggregation = function _initializeTargetAggregation(oAppComponent) {
324
- var _this3 = this;
325
-
326
- var oManifest = oAppComponent.getManifest(),
327
- oTargets = oManifest["sap.ui5"].routing ? oManifest["sap.ui5"].routing.targets : null;
328
- this._oTargetsAggregation = {};
329
-
330
- if (oTargets) {
331
- Object.keys(oTargets).forEach(function (sTargetName) {
332
- var oTarget = oTargets[sTargetName];
333
-
334
- if (oTarget.controlAggregation) {
335
- _this3._oTargetsAggregation[sTargetName] = {
336
- aggregation: oTarget.controlAggregation,
337
- pattern: oTarget.contextPattern
338
- };
339
- } else {
340
- _this3._oTargetsAggregation[sTargetName] = {
341
- aggregation: "page",
342
- pattern: null
343
- };
344
- }
345
- });
346
- }
347
- }
348
- /**
349
- * Initializes the mapping between a route (identifed as its pattern) and the corresponding targets
350
- *
351
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_initializeRoutesInformation
352
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
353
- * @function
354
- * @param oAppComponent ref to the AppComponent
355
- */
356
- ;
357
-
358
- _proto._initializeRoutesInformation = function _initializeRoutesInformation(oAppComponent) {
359
- var _this4 = this;
360
-
361
- var oManifest = oAppComponent.getManifest(),
362
- aRoutes = oManifest["sap.ui5"].routing ? oManifest["sap.ui5"].routing.routes : null;
363
- this._oTargetsFromRoutePattern = {};
364
-
365
- if (aRoutes) {
366
- aRoutes.forEach(function (route) {
367
- _this4._oTargetsFromRoutePattern[route.pattern] = route.target;
368
- });
369
- }
370
- };
371
-
372
- _proto.getCurrentArgument = function getCurrentArgument() {
373
- return this.sCurrentArguments;
374
- };
375
-
376
- _proto.getCurrentRouteName = function getCurrentRouteName() {
377
- return this.sCurrentRouteName;
378
- }
379
- /**
380
- * Get FE FCL constant.
381
- *
382
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
383
- * @returns The constants
384
- */
385
- ;
386
-
387
- _proto.getConstants = function getConstants() {
388
- return CONSTANTS;
389
- }
390
- /**
391
- * Getter for oTargetsAggregation array.
392
- *
393
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#getTargetAggregation
394
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
395
- * @function
396
- * @returns The _oTargetsAggregation array
397
- * @ui5-restricted
398
- */
399
- ;
400
-
401
- _proto.getTargetAggregation = function getTargetAggregation() {
402
- return this._oTargetsAggregation;
403
- }
404
- /**
405
- * Function triggered by the router RouteMatched event.
406
- *
407
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#onRouteMatched
408
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
409
- * @param oEvent
410
- */
411
- ;
412
-
413
- _proto.onRouteMatched = function onRouteMatched(oEvent) {
414
- var sRouteName = oEvent.getParameter("name"); // Save the current/previous routes and arguments
415
-
416
- this.sCurrentRouteName = sRouteName;
417
- this.sCurrentArguments = oEvent.getParameter("arguments");
418
- }
419
- /**
420
- * This function is triggering the table scroll to the navigated row after each layout change.
421
- *
422
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#scrollToLastSelectedItem
423
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
424
- */
425
- ;
426
-
427
- _proto._scrollTablesToLastNavigatedItems = function _scrollTablesToLastNavigatedItems() {
428
- var aViews = this._getAllVisibleViews(); //The scrolls are triggered only if the layout is with several columns or when switching the mostRight column in full screen
429
-
430
-
431
- if (aViews.length > 1 || aViews[0].getViewData().viewLevel < this._oFCLConfig.maxColumnsCount) {
432
- var sCurrentViewPath;
433
- var oAdditionalView = this.getViewForNavigatedRowsComputation();
434
-
435
- if (oAdditionalView && aViews.indexOf(oAdditionalView) === -1) {
436
- aViews.push(oAdditionalView);
437
- }
438
-
439
- for (var index = aViews.length - 1; index > 0; index--) {
440
- var oView = aViews[index],
441
- oPreviousView = aViews[index - 1];
442
-
443
- if (oView.getBindingContext()) {
444
- sCurrentViewPath = oView.getBindingContext().getPath();
445
-
446
- oPreviousView.getController()._scrollTablesToRow(sCurrentViewPath);
447
- }
448
- }
449
- }
450
- }
451
- /**
452
- * Function triggered by the FCL StateChanged event.
453
- *
454
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#onStateChanged
455
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
456
- * @param oEvent
457
- */
458
- ;
459
-
460
- _proto.onStateChanged = function onStateChanged(oEvent) {
461
- var bIsNavigationArrow = oEvent.getParameter("isNavigationArrow");
462
-
463
- if (this.sCurrentArguments !== undefined) {
464
- if (!this.sCurrentArguments[this.SQUERYKEYNAME]) {
465
- this.sCurrentArguments[this.SQUERYKEYNAME] = {};
466
- }
467
-
468
- this.sCurrentArguments[this.SQUERYKEYNAME].layout = oEvent.getParameter("layout");
469
- }
470
-
471
- this._forceModelContextChangeOnBreadCrumbs(oEvent); // Replace the URL with the new layout if a navigation arrow was used
472
-
473
-
474
- if (bIsNavigationArrow) {
475
- this._oRouterProxy.navTo(this.sCurrentRouteName, this.sCurrentArguments);
476
- }
477
- }
478
- /**
479
- * Function to fire ModelContextChange event on all breadcrumbs ( on each ObjectPages).
480
- *
481
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_forceModelContextChangeOnBreadCrumbs
482
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
483
- * @param oEvent
484
- */
485
- ;
486
-
487
- _proto._forceModelContextChangeOnBreadCrumbs = function _forceModelContextChangeOnBreadCrumbs(oEvent) {
488
- //force modelcontextchange on ObjectPages to refresh the breadcrumbs link hrefs
489
- var oFcl = oEvent.getSource();
490
- var oPages = [];
491
- oPages = oPages.concat(oFcl.getBeginColumnPages()).concat(oFcl.getMidColumnPages()).concat(oFcl.getEndColumnPages());
492
- oPages.forEach(function (oPage) {
493
- var oView = _getViewFromContainer(oPage);
494
-
495
- var oBreadCrumbs = oView.byId && oView.byId("breadcrumbs");
496
-
497
- if (oBreadCrumbs) {
498
- oBreadCrumbs.fireModelContextChange();
499
- }
500
- });
501
- }
502
- /**
503
- * Function triggered to update the Share button Visibility.
504
- *
505
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
506
- * @param viewColumn Name of the current column ("beginColumn", "midColumn", "endColumn")
507
- * @param sLayout The current layout used by the FCL
508
- * @returns The share button visibility
509
- */
510
- ;
511
-
512
- _proto._updateShareButtonVisibility = function _updateShareButtonVisibility(viewColumn, sLayout) {
513
- var bShowShareIcon;
514
-
515
- switch (sLayout) {
516
- case "OneColumn":
517
- bShowShareIcon = viewColumn === "beginColumn";
518
- break;
519
-
520
- case "MidColumnFullScreen":
521
- case "ThreeColumnsBeginExpandedEndHidden":
522
- case "ThreeColumnsMidExpandedEndHidden":
523
- case "TwoColumnsBeginExpanded":
524
- case "TwoColumnsMidExpanded":
525
- bShowShareIcon = viewColumn === "midColumn";
526
- break;
527
-
528
- case "EndColumnFullScreen":
529
- case "ThreeColumnsEndExpanded":
530
- case "ThreeColumnsMidExpanded":
531
- bShowShareIcon = viewColumn === "endColumn";
532
- break;
533
-
534
- default:
535
- bShowShareIcon = false;
536
- }
537
-
538
- return bShowShareIcon;
539
- };
540
-
541
- _proto.updateUIStateForView = function updateUIStateForView(oView, FCLLevel) {
542
- var oUIState = this.getHelper().getCurrentUIState(),
543
- oFclColName = ["beginColumn", "midColumn", "endColumn"],
544
- sLayout = this.getFclControl().getLayout();
545
- var viewColumn;
546
-
547
- if (!oView.getModel("fclhelper")) {
548
- oView.setModel(this._createHelperModel(), "fclhelper");
549
- }
550
-
551
- if (FCLLevel >= this._oFCLConfig.maxColumnsCount) {
552
- // The view is on a level > max number of columns. It's always fullscreen without close/exit buttons
553
- viewColumn = oFclColName[this._oFCLConfig.maxColumnsCount - 1];
554
- oUIState.actionButtonsInfo.midColumn.fullScreen = null;
555
- oUIState.actionButtonsInfo.midColumn.exitFullScreen = null;
556
- oUIState.actionButtonsInfo.midColumn.closeColumn = null;
557
- oUIState.actionButtonsInfo.endColumn.exitFullScreen = null;
558
- oUIState.actionButtonsInfo.endColumn.fullScreen = null;
559
- oUIState.actionButtonsInfo.endColumn.closeColumn = null;
560
- } else {
561
- viewColumn = oFclColName[FCLLevel];
562
- }
563
-
564
- if (FCLLevel >= this._oFCLConfig.maxColumnsCount || sLayout === "EndColumnFullScreen" || sLayout === "MidColumnFullScreen" || sLayout === "OneColumn") {
565
- oView.getModel("fclhelper").setProperty("/breadCrumbIsVisible", true);
566
- } else {
567
- oView.getModel("fclhelper").setProperty("/breadCrumbIsVisible", false);
568
- } // Unfortunately, the FCLHelper doesn't provide actionButton values for the first column
569
- // so we have to add this info manually
570
-
571
-
572
- oUIState.actionButtonsInfo.beginColumn = {
573
- fullScreen: null,
574
- exitFullScreen: null,
575
- closeColumn: null
576
- };
577
- var oActionButtonInfos = Object.assign({}, oUIState.actionButtonsInfo[viewColumn]);
578
- oActionButtonInfos.switchVisible = oActionButtonInfos.fullScreen !== null || oActionButtonInfos.exitFullScreen !== null;
579
- oActionButtonInfos.switchIcon = oActionButtonInfos.fullScreen !== null ? "sap-icon://full-screen" : "sap-icon://exit-full-screen";
580
- oActionButtonInfos.isFullScreen = oActionButtonInfos.fullScreen === null;
581
- oView.getModel("fclhelper").setProperty("/actionButtonsInfo", oActionButtonInfos);
582
- oView.getModel("fclhelper").setProperty("/showShareIcon", this._updateShareButtonVisibility(viewColumn, sLayout));
583
- }
584
- /**
585
- * Function triggered by the router BeforeRouteMatched event.
586
- *
587
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#onBeforeRouteMatched
588
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
589
- * @param oEvent
590
- */
591
- ;
592
-
593
- _proto.onBeforeRouteMatched = function onBeforeRouteMatched(oEvent) {
594
- if (oEvent) {
595
- var oQueryParams = oEvent.getParameters().arguments[this.SQUERYKEYNAME];
596
- var sLayout = oQueryParams ? oQueryParams.layout : null; // If there is no layout parameter, query for the default level 0 layout (normally OneColumn)
597
-
598
- if (!sLayout) {
599
- var oNextUIState = this.getHelper().getNextUIState(0);
600
- sLayout = oNextUIState.layout;
601
- } // Check if the layout if compatible with the number of targets
602
- // This should always be the case for normal navigation, just needed in case
603
- // the URL has been manually modified
604
-
605
-
606
- var aTargets = oEvent.getParameter("config").target;
607
- sLayout = this._correctLayoutForTargets(sLayout, aTargets); // Update the layout of the FlexibleColumnLayout
608
-
609
- if (sLayout) {
610
- this.getFclControl().setLayout(sLayout);
611
- }
612
- }
613
- }
614
- /**
615
- * Helper for the FCL Component.
616
- *
617
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#getHelper
618
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
619
- * @returns Instance of a semantic helper
620
- */
621
- ;
622
-
623
- _proto.getHelper = function getHelper() {
624
- return FlexibleColumnLayoutSemanticHelper.getInstanceFor(this.getFclControl(), this._oFCLConfig);
625
- }
626
- /**
627
- * Calculates the FCL layout for a given FCL level and a target hash.
628
- *
629
- * @param iNextFCLLevel FCL level to be navigated to
630
- * @param sHash The hash to be navigated to
631
- * @param sProposedLayout The proposed layout
632
- * @param keepCurrentLayout True if we want to keep the current layout if possible
633
- * @returns The calculated layout
634
- */
635
- ;
636
-
637
- _proto.calculateLayout = function calculateLayout(iNextFCLLevel, sHash, sProposedLayout, keepCurrentLayout) {
638
- // First, ask the FCL helper to calculate the layout if nothing is proposed
639
- if (!sProposedLayout) {
640
- sProposedLayout = keepCurrentLayout ? this.getFclControl().getLayout() : this.getHelper().getNextUIState(iNextFCLLevel).layout;
641
- } // Then change this value if necessary, based on the number of targets
642
-
643
-
644
- var oRoute = this.getRouter().getRouteByHash("".concat(sHash, "?layout=").concat(sProposedLayout));
645
-
646
- var aTargets = this._oTargetsFromRoutePattern[oRoute.getPattern()];
647
-
648
- return this._correctLayoutForTargets(sProposedLayout, aTargets);
649
- }
650
- /**
651
- * Checks whether a given FCL layout is compatible with an array of targets.
652
- *
653
- * @param sProposedLayout Proposed value for the FCL layout
654
- * @param aTargets Array of target names used for checking
655
- * @returns The corrected layout
656
- */
657
- ;
658
-
659
- _proto._correctLayoutForTargets = function _correctLayoutForTargets(sProposedLayout, aTargets) {
660
- var allAllowedLayouts = {
661
- "2": ["TwoColumnsMidExpanded", "TwoColumnsBeginExpanded", "MidColumnFullScreen"],
662
- "3": ["ThreeColumnsMidExpanded", "ThreeColumnsEndExpanded", "ThreeColumnsMidExpandedEndHidden", "ThreeColumnsBeginExpandedEndHidden", "MidColumnFullScreen", "EndColumnFullScreen"]
663
- };
664
-
665
- if (aTargets && !Array.isArray(aTargets)) {
666
- // To support single target as a string in the manifest
667
- aTargets = [aTargets];
668
- }
669
-
670
- if (!aTargets) {
671
- // Defensive, just in case...
672
- return sProposedLayout;
673
- } else if (aTargets.length > 1) {
674
- // More than 1 target: just simply check from the allowed values
675
- var aLayouts = allAllowedLayouts[aTargets.length];
676
-
677
- if (aLayouts.indexOf(sProposedLayout) < 0) {
678
- // The proposed layout isn't compatible with the number of columns
679
- // --> Ask the helper for the default layout for the number of columns
680
- sProposedLayout = aLayouts[0]; //this.getHelper().getNextUIState(aTargets.length - 1).layout;
681
- }
682
- } else {
683
- // Only one target
684
- var sTargetAggregation = this.getTargetAggregation()[aTargets[0]].aggregation || this._oFCLConfig.defaultControlAggregation;
685
-
686
- switch (sTargetAggregation) {
687
- case "beginColumnPages":
688
- sProposedLayout = "OneColumn";
689
- break;
690
-
691
- case "midColumnPages":
692
- sProposedLayout = "MidColumnFullScreen";
693
- break;
694
-
695
- case "endColumnPages":
696
- sProposedLayout = "EndColumnFullScreen";
697
- break;
698
- // no default
699
- }
700
- }
701
-
702
- return sProposedLayout;
703
- }
704
- /**
705
- * get all visible views in the FCL component.
706
- * sLayout optional parameter is very specific as part of the calculation of the latest navigated row
707
- *
708
- * @param {*} sLayout Layout that was applied just before the current navigation
709
- * @returns {Array} return views
710
- */
711
- ;
712
-
713
- _proto._getAllVisibleViews = function _getAllVisibleViews(sLayout) {
714
- var aViews = [];
715
- sLayout = sLayout ? sLayout : this.getFclControl().getLayout();
716
-
717
- switch (sLayout) {
718
- case LayoutType.EndColumnFullScreen:
719
- if (this.getFclControl().getCurrentEndColumnPage()) {
720
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
721
- }
722
-
723
- break;
724
-
725
- case LayoutType.MidColumnFullScreen:
726
- if (this.getFclControl().getCurrentMidColumnPage()) {
727
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
728
- }
729
-
730
- break;
731
-
732
- case LayoutType.OneColumn:
733
- if (this.getFclControl().getCurrentBeginColumnPage()) {
734
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
735
- }
736
-
737
- break;
738
-
739
- case LayoutType.ThreeColumnsEndExpanded:
740
- case LayoutType.ThreeColumnsMidExpanded:
741
- if (this.getFclControl().getCurrentBeginColumnPage()) {
742
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
743
- }
744
-
745
- if (this.getFclControl().getCurrentMidColumnPage()) {
746
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
747
- }
748
-
749
- if (this.getFclControl().getCurrentEndColumnPage()) {
750
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
751
- }
752
-
753
- break;
754
-
755
- case LayoutType.TwoColumnsBeginExpanded:
756
- case LayoutType.TwoColumnsMidExpanded:
757
- case LayoutType.ThreeColumnsMidExpandedEndHidden:
758
- case LayoutType.ThreeColumnsBeginExpandedEndHidden:
759
- if (this.getFclControl().getCurrentBeginColumnPage()) {
760
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
761
- }
762
-
763
- if (this.getFclControl().getCurrentMidColumnPage()) {
764
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
765
- }
766
-
767
- break;
768
-
769
- default:
770
- Log.error("Unhandled switch case for ".concat(this.getFclControl().getLayout()));
771
- }
772
-
773
- return aViews;
774
- };
775
-
776
- _proto._getAllViews = function _getAllViews(sLayout) {
777
- var aViews = [];
778
- sLayout = sLayout ? sLayout : this.getFclControl().getLayout();
779
-
780
- switch (sLayout) {
781
- case LayoutType.OneColumn:
782
- if (this.getFclControl().getCurrentBeginColumnPage()) {
783
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
784
- }
785
-
786
- break;
787
-
788
- case LayoutType.ThreeColumnsEndExpanded:
789
- case LayoutType.ThreeColumnsMidExpanded:
790
- case LayoutType.ThreeColumnsMidExpandedEndHidden:
791
- case LayoutType.ThreeColumnsBeginExpandedEndHidden:
792
- case LayoutType.EndColumnFullScreen:
793
- if (this.getFclControl().getCurrentBeginColumnPage()) {
794
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
795
- }
796
-
797
- if (this.getFclControl().getCurrentMidColumnPage()) {
798
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
799
- }
800
-
801
- if (this.getFclControl().getCurrentEndColumnPage()) {
802
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
803
- }
804
-
805
- break;
806
-
807
- case LayoutType.TwoColumnsBeginExpanded:
808
- case LayoutType.TwoColumnsMidExpanded:
809
- if (this.getFclControl().getCurrentBeginColumnPage()) {
810
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
811
- }
812
-
813
- if (this.getFclControl().getCurrentMidColumnPage()) {
814
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
815
- }
816
-
817
- break;
818
-
819
- case LayoutType.MidColumnFullScreen:
820
- // In this case we need to determine if this mid column fullscreen comes from a 2 or a 3 column layout
821
- var sLayoutWhenExitFullScreen = this.getHelper().getCurrentUIState().actionButtonsInfo.midColumn.exitFullScreen;
822
-
823
- if (this.getFclControl().getCurrentBeginColumnPage()) {
824
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
825
- }
826
-
827
- if (this.getFclControl().getCurrentMidColumnPage()) {
828
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
829
- }
830
-
831
- if (sLayoutWhenExitFullScreen.indexOf("ThreeColumn") >= 0) {
832
- // We come from a 3 column layout
833
- if (this.getFclControl().getCurrentEndColumnPage()) {
834
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
835
- }
836
- }
837
-
838
- break;
839
-
840
- default:
841
- Log.error("Unhandled switch case for ".concat(this.getFclControl().getLayout()));
842
- }
843
-
844
- return aViews;
845
- };
846
-
847
- _proto.onContainerReady = function onContainerReady() {
848
- // Restore views if neccessary.
849
- var aViews = this._getAllVisibleViews();
850
-
851
- var aRestorePromises = aViews.reduce(function (aPromises, oTargetView) {
852
- aPromises.push(KeepAliveHelper.restoreView(oTargetView));
853
- return aPromises;
854
- }, []);
855
- return Promise.all(aRestorePromises);
856
- };
857
-
858
- _proto.getRightmostContext = function getRightmostContext() {
859
- var oView = this.getRightmostView();
860
- return oView && oView.getBindingContext();
861
- };
862
-
863
- _proto.getRightmostView = function getRightmostView() {
864
- return this._getAllViews().pop();
865
- };
866
-
867
- _proto.isContextUsedInPages = function isContextUsedInPages(oContext) {
868
- if (!this.getFclControl()) {
869
- return false;
870
- }
871
-
872
- var aAllVisibleViews = this._getAllViews();
873
-
874
- for (var i = 0; i < aAllVisibleViews.length; i++) {
875
- var oView = aAllVisibleViews[i];
876
-
877
- if (!oView) {
878
- // A view has been destroyed --> app is currently being destroyed
879
- return false;
880
- }
881
-
882
- if (oView.getBindingContext() === oContext) {
883
- return true;
884
- }
885
- }
886
-
887
- return false;
888
- };
889
-
890
- return FclController;
891
- }(BaseController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec2], {
892
- configurable: true,
893
- enumerable: true,
894
- writable: true,
895
- initializer: null
896
- })), _class2)) || _class);
897
- return FclController;
898
- }, false);
899
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMYXlvdXRUeXBlIiwiZkxpYnJhcnkiLCJDT05TVEFOVFMiLCJwYWdlIiwibmFtZXMiLCJjdXJyZW50R2V0dGVyIiwicHJlZml4Iiwic3VmZml4IiwiZ2V0dGVyIiwiX2dldFZpZXdGcm9tQ29udGFpbmVyIiwib0NvbnRhaW5lciIsImlzQSIsImdldENvbXBvbmVudEluc3RhbmNlIiwiZ2V0Um9vdENvbnRyb2wiLCJGY2xDb250cm9sbGVyIiwiZGVmaW5lVUk1Q2xhc3MiLCJ1c2luZ0V4dGVuc2lvbiIsIlZpZXdTdGF0ZSIsIm92ZXJyaWRlIiwiYXBwbHlJbml0aWFsU3RhdGVPbmx5IiwiYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzIiwiYUNvbnRyb2xzIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJfZ2V0QWxsVmlzaWJsZVZpZXdzIiwiZm9yRWFjaCIsIm9DaGlsZFZpZXciLCJwQ2hpbGRWaWV3IiwiUHJvbWlzZSIsInJlc29sdmUiLCJwdXNoIiwiYWRhcHRTdGF0ZUNvbnRyb2xzIiwiYVN0YXRlQ29udHJvbHMiLCJvblJlc3RvcmUiLCJvVmlldyIsIm9OYXZDb250YWluZXIiLCJieUlkIiwib0ZDTENvbnRyb2xsZXIiLCJvSW50ZXJuYWxNb2RlbCIsImdldE1vZGVsIiwib1BhZ2VzIiwiZ2V0UHJvcGVydHkiLCJzQ29tcG9uZW50SWQiLCJzZXRQcm9wZXJ0eSIsIm9uQ29udGFpbmVyUmVhZHkiLCJvblN1c3BlbmQiLCJvRkNMQ29udHJvbCIsImdldEZjbENvbnRyb2wiLCJhQmVnaW5Db2x1bW5QYWdlcyIsImdldEJlZ2luQ29sdW1uUGFnZXMiLCJhTWlkQ29sdW1uUGFnZXMiLCJnZXRNaWRDb2x1bW5QYWdlcyIsImFFbmRDb2x1bW5QYWdlcyIsImdldEVuZENvbHVtblBhZ2VzIiwiYVBhZ2VzIiwiY29uY2F0Iiwib1BhZ2UiLCJvVGFyZ2V0VmlldyIsIm9Db250cm9sbGVyIiwidmlld1N0YXRlIiwib25Jbml0IiwiX2ludGVybmFsSW5pdCIsImF0dGFjaFJvdXRlTWF0Y2hlcnMiLCJnZXRSb3V0ZXIiLCJhdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQiLCJfZ2V0Vmlld0Zvck5hdmlnYXRlZFJvd3NDb21wdXRhdGlvbiIsIm9uQmVmb3JlUm91dGVNYXRjaGVkIiwiYXR0YWNoUm91dGVNYXRjaGVkIiwib25Sb3V0ZU1hdGNoZWQiLCJhdHRhY2hTdGF0ZUNoYW5nZSIsIl9zYXZlTGF5b3V0IiwiX29Sb3V0ZXJQcm94eSIsInNDdXJyZW50Um91dGVOYW1lIiwic0N1cnJlbnRBcmd1bWVudHMiLCJTUVVFUllLRVlOQU1FIiwib0FwcENvbXBvbmVudCIsImdldEFwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwiX29GQ0xDb25maWciLCJtYXhDb2x1bW5zQ291bnQiLCJvUm91dGluZ0NvbmZpZyIsImdldE1hbmlmZXN0Iiwicm91dGluZyIsImNvbmZpZyIsImZsZXhpYmxlQ29sdW1uTGF5b3V0Iiwib0ZDTE1hbmlmZXN0Q29uZmlnIiwiZGVmYXVsdFR3b0NvbHVtbkxheW91dFR5cGUiLCJkZWZhdWx0VGhyZWVDb2x1bW5MYXlvdXRUeXBlIiwibGltaXRGQ0xUb1R3b0NvbHVtbnMiLCJjb250cm9sQWdncmVnYXRpb24iLCJkZWZhdWx0Q29udHJvbEFnZ3JlZ2F0aW9uIiwiX2luaXRpYWxpemVUYXJnZXRBZ2dyZWdhdGlvbiIsIl9pbml0aWFsaXplUm91dGVzSW5mb3JtYXRpb24iLCJnZXRDb250ZW50Iiwib0V2ZW50Iiwic1ByZXZpb3VzTGF5b3V0IiwiZ2V0UGFyYW1ldGVycyIsImxheW91dCIsImFBbGxWaXNpYmxlVmlld3NCZWZvcmVSb3V0ZU1hdGNoZWQiLCJvUmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZCIsImxlbmd0aCIsIm9SaWdodE1vc3RWaWV3IiwiYXR0YWNoRXZlbnRPbmNlIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0Vmlld0RhdGEiLCJ2aWV3TGV2ZWwiLCJvQWRkaXRpb25hbFZpZXdGb3JOYXZSb3dzQ29tcHV0YXRpb24iLCJnZXRWaWV3Rm9yTmF2aWdhdGVkUm93c0NvbXB1dGF0aW9uIiwib25FeGl0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiZGV0YWNoQmVmb3JlUm91dGVNYXRjaGVkIiwiZGV0YWNoU3RhdGVDaGFuZ2UiLCJvblN0YXRlQ2hhbmdlZCIsImRldGFjaEFmdGVyRW5kQ29sdW1uTmF2aWdhdGUiLCJfb1RhcmdldHNBZ2dyZWdhdGlvbiIsIl9vVGFyZ2V0c0Zyb21Sb3V0ZVBhdHRlcm4iLCJCYXNlQ29udHJvbGxlciIsInByb3RvdHlwZSIsImJpbmQiLCJpc0ZjbEVuYWJsZWQiLCJkaXNwbGF5TWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibVBhcmFtZXRlcnMiLCJGQ0xMZXZlbCIsImFNZXNzYWdlUGFnZXMiLCJvTWVzc2FnZVBhZ2UiLCJNZXNzYWdlUGFnZSIsInNob3dIZWFkZXIiLCJpY29uIiwiYWRkQmVnaW5Db2x1bW5QYWdlIiwiYWRkTWlkQ29sdW1uUGFnZSIsImFkZEVuZENvbHVtblBhZ2UiLCJzZXRUZXh0IiwidGVjaG5pY2FsTWVzc2FnZSIsInNldEN1c3RvbURlc2NyaXB0aW9uIiwiTGluayIsInRleHQiLCJkZXNjcmlwdGlvbiIsInByZXNzIiwiTWVzc2FnZUJveCIsInNob3ciLCJJY29uIiwiRVJST1IiLCJ0aXRsZSIsImFjdGlvbnMiLCJBY3Rpb24iLCJPSyIsImRlZmF1bHRBY3Rpb24iLCJkZXRhaWxzIiwidGVjaG5pY2FsRGV0YWlscyIsImNvbnRlbnRXaWR0aCIsInNldERlc2NyaXB0aW9uIiwidG8iLCJnZXRJZCIsIm9NYW5pZmVzdCIsIm9UYXJnZXRzIiwidGFyZ2V0cyIsIk9iamVjdCIsImtleXMiLCJzVGFyZ2V0TmFtZSIsIm9UYXJnZXQiLCJhZ2dyZWdhdGlvbiIsInBhdHRlcm4iLCJjb250ZXh0UGF0dGVybiIsImFSb3V0ZXMiLCJyb3V0ZXMiLCJyb3V0ZSIsInRhcmdldCIsImdldEN1cnJlbnRBcmd1bWVudCIsImdldEN1cnJlbnRSb3V0ZU5hbWUiLCJnZXRDb25zdGFudHMiLCJnZXRUYXJnZXRBZ2dyZWdhdGlvbiIsInNSb3V0ZU5hbWUiLCJfc2Nyb2xsVGFibGVzVG9MYXN0TmF2aWdhdGVkSXRlbXMiLCJhVmlld3MiLCJzQ3VycmVudFZpZXdQYXRoIiwib0FkZGl0aW9uYWxWaWV3IiwiaW5kZXhPZiIsImluZGV4Iiwib1ByZXZpb3VzVmlldyIsImdldEJpbmRpbmdDb250ZXh0IiwiZ2V0UGF0aCIsIl9zY3JvbGxUYWJsZXNUb1JvdyIsImJJc05hdmlnYXRpb25BcnJvdyIsInVuZGVmaW5lZCIsIl9mb3JjZU1vZGVsQ29udGV4dENoYW5nZU9uQnJlYWRDcnVtYnMiLCJuYXZUbyIsIm9GY2wiLCJnZXRTb3VyY2UiLCJvQnJlYWRDcnVtYnMiLCJmaXJlTW9kZWxDb250ZXh0Q2hhbmdlIiwiX3VwZGF0ZVNoYXJlQnV0dG9uVmlzaWJpbGl0eSIsInZpZXdDb2x1bW4iLCJzTGF5b3V0IiwiYlNob3dTaGFyZUljb24iLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsIm9VSVN0YXRlIiwiZ2V0SGVscGVyIiwiZ2V0Q3VycmVudFVJU3RhdGUiLCJvRmNsQ29sTmFtZSIsImdldExheW91dCIsInNldE1vZGVsIiwiX2NyZWF0ZUhlbHBlck1vZGVsIiwiYWN0aW9uQnV0dG9uc0luZm8iLCJtaWRDb2x1bW4iLCJmdWxsU2NyZWVuIiwiZXhpdEZ1bGxTY3JlZW4iLCJjbG9zZUNvbHVtbiIsImVuZENvbHVtbiIsImJlZ2luQ29sdW1uIiwib0FjdGlvbkJ1dHRvbkluZm9zIiwiYXNzaWduIiwic3dpdGNoVmlzaWJsZSIsInN3aXRjaEljb24iLCJpc0Z1bGxTY3JlZW4iLCJvUXVlcnlQYXJhbXMiLCJhcmd1bWVudHMiLCJvTmV4dFVJU3RhdGUiLCJnZXROZXh0VUlTdGF0ZSIsImFUYXJnZXRzIiwiX2NvcnJlY3RMYXlvdXRGb3JUYXJnZXRzIiwic2V0TGF5b3V0IiwiRmxleGlibGVDb2x1bW5MYXlvdXRTZW1hbnRpY0hlbHBlciIsImdldEluc3RhbmNlRm9yIiwiY2FsY3VsYXRlTGF5b3V0IiwiaU5leHRGQ0xMZXZlbCIsInNIYXNoIiwic1Byb3Bvc2VkTGF5b3V0Iiwia2VlcEN1cnJlbnRMYXlvdXQiLCJvUm91dGUiLCJnZXRSb3V0ZUJ5SGFzaCIsImdldFBhdHRlcm4iLCJhbGxBbGxvd2VkTGF5b3V0cyIsIkFycmF5IiwiaXNBcnJheSIsImFMYXlvdXRzIiwic1RhcmdldEFnZ3JlZ2F0aW9uIiwiRW5kQ29sdW1uRnVsbFNjcmVlbiIsImdldEN1cnJlbnRFbmRDb2x1bW5QYWdlIiwiTWlkQ29sdW1uRnVsbFNjcmVlbiIsImdldEN1cnJlbnRNaWRDb2x1bW5QYWdlIiwiT25lQ29sdW1uIiwiZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSIsIlRocmVlQ29sdW1uc0VuZEV4cGFuZGVkIiwiVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWQiLCJUd29Db2x1bW5zQmVnaW5FeHBhbmRlZCIsIlR3b0NvbHVtbnNNaWRFeHBhbmRlZCIsIlRocmVlQ29sdW1uc01pZEV4cGFuZGVkRW5kSGlkZGVuIiwiVGhyZWVDb2x1bW5zQmVnaW5FeHBhbmRlZEVuZEhpZGRlbiIsIkxvZyIsImVycm9yIiwiX2dldEFsbFZpZXdzIiwic0xheW91dFdoZW5FeGl0RnVsbFNjcmVlbiIsImFSZXN0b3JlUHJvbWlzZXMiLCJyZWR1Y2UiLCJhUHJvbWlzZXMiLCJLZWVwQWxpdmVIZWxwZXIiLCJyZXN0b3JlVmlldyIsImFsbCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJnZXRSaWdodG1vc3RWaWV3IiwicG9wIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJvQ29udGV4dCIsImFBbGxWaXNpYmxlVmlld3MiLCJpIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJGY2wuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEZsZXhpYmxlQ29sdW1uTGF5b3V0IGZyb20gXCJzYXAvZi9GbGV4aWJsZUNvbHVtbkxheW91dFwiO1xuaW1wb3J0IEZsZXhpYmxlQ29sdW1uTGF5b3V0U2VtYW50aWNIZWxwZXIgZnJvbSBcInNhcC9mL0ZsZXhpYmxlQ29sdW1uTGF5b3V0U2VtYW50aWNIZWxwZXJcIjtcbmltcG9ydCBmTGlicmFyeSBmcm9tIFwic2FwL2YvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCB1c2luZ0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEtlZXBBbGl2ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9LZWVwQWxpdmVIZWxwZXJcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJzYXAvbS9MaW5rXCI7XG5pbXBvcnQgTWVzc2FnZUJveCwgeyBBY3Rpb24sIEljb24gfSBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1lc3NhZ2VQYWdlIGZyb20gXCJzYXAvbS9NZXNzYWdlUGFnZVwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgQmFzZUNvbnRyb2xsZXIgZnJvbSBcIi4vUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyXCI7XG5cbmNvbnN0IExheW91dFR5cGUgPSBmTGlicmFyeS5MYXlvdXRUeXBlO1xuXG5jb25zdCBDT05TVEFOVFMgPSB7XG5cdHBhZ2U6IHtcblx0XHRuYW1lczogW1wiQmVnaW5Db2x1bW5cIiwgXCJNaWRDb2x1bW5cIiwgXCJFbmRDb2x1bW5cIl0sXG5cdFx0Y3VycmVudEdldHRlcjoge1xuXHRcdFx0cHJlZml4OiBcImdldEN1cnJlbnRcIixcblx0XHRcdHN1ZmZpeDogXCJQYWdlXCJcblx0XHR9LFxuXHRcdGdldHRlcjoge1xuXHRcdFx0cHJlZml4OiBcImdldFwiLFxuXHRcdFx0c3VmZml4OiBcIlBhZ2VzXCJcblx0XHR9XG5cdH1cbn07XG5jb25zdCBfZ2V0Vmlld0Zyb21Db250YWluZXIgPSBmdW5jdGlvbiAob0NvbnRhaW5lcjogYW55KSB7XG5cdGlmIChvQ29udGFpbmVyLmlzQShcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiKSkge1xuXHRcdHJldHVybiBvQ29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCkuZ2V0Um9vdENvbnRyb2woKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gb0NvbnRhaW5lcjtcblx0fVxufTtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsXCIpXG5jbGFzcyBGY2xDb250cm9sbGVyIGV4dGVuZHMgQmFzZUNvbnRyb2xsZXIge1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0Vmlld1N0YXRlLm92ZXJyaWRlKHtcblx0XHRcdGFwcGx5SW5pdGlhbFN0YXRlT25seTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhQ29udHJvbHM6IGFueSkge1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIEZjbENvbnRyb2xsZXIpLl9nZXRBbGxWaXNpYmxlVmlld3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChvQ2hpbGRWaWV3OiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBwQ2hpbGRWaWV3ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9DaGlsZFZpZXcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGFDb250cm9scy5wdXNoKHBDaGlsZFZpZXcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRhZGFwdFN0YXRlQ29udHJvbHM6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUsIGFTdGF0ZUNvbnRyb2xzOiBhbnkpIHtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBGY2xDb250cm9sbGVyKS5fZ2V0QWxsVmlzaWJsZVZpZXdzKCkuZm9yRWFjaChmdW5jdGlvbiAob0NoaWxkVmlldzogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3QgcENoaWxkVmlldyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvQ2hpbGRWaWV3KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhU3RhdGVDb250cm9scy5wdXNoKHBDaGlsZFZpZXcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRvblJlc3RvcmU6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUpIHtcblx0XHRcdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRvTmF2Q29udGFpbmVyID0gb1ZpZXcuYnlJZChcImFwcENvbnRlbnRcIik7XG5cdFx0XHRcdGNvbnN0IG9GQ0xDb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbCA9IG9OYXZDb250YWluZXIuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRcdGNvbnN0IG9QYWdlcyA9IG9JbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3BhZ2VzXCIpO1xuXG5cdFx0XHRcdGZvciAoY29uc3Qgc0NvbXBvbmVudElkIGluIG9QYWdlcykge1xuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KGAvcGFnZXMvJHtzQ29tcG9uZW50SWR9L3Jlc3RvcmVTdGF0dXNgLCBcInBlbmRpbmdcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0KG9GQ0xDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLm9uQ29udGFpbmVyUmVhZHkoKTtcblx0XHRcdH0sXG5cdFx0XHRvblN1c3BlbmQ6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUpIHtcblx0XHRcdFx0Y29uc3Qgb0ZDTENvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgRmNsQ29udHJvbGxlcjtcblx0XHRcdFx0Y29uc3Qgb0ZDTENvbnRyb2wgPSBvRkNMQ29udHJvbGxlci5nZXRGY2xDb250cm9sKCk7XG5cdFx0XHRcdGNvbnN0IGFCZWdpbkNvbHVtblBhZ2VzOiBDb250cm9sW10gPSBvRkNMQ29udHJvbC5nZXRCZWdpbkNvbHVtblBhZ2VzKCkgfHwgW107XG5cdFx0XHRcdGNvbnN0IGFNaWRDb2x1bW5QYWdlczogQ29udHJvbFtdID0gb0ZDTENvbnRyb2wuZ2V0TWlkQ29sdW1uUGFnZXMoKSB8fCBbXTtcblx0XHRcdFx0Y29uc3QgYUVuZENvbHVtblBhZ2VzOiBDb250cm9sW10gPSBvRkNMQ29udHJvbC5nZXRFbmRDb2x1bW5QYWdlcygpIHx8IFtdO1xuXHRcdFx0XHRjb25zdCBhUGFnZXMgPSAoW10gYXMgQ29udHJvbFtdKS5jb25jYXQoYUJlZ2luQ29sdW1uUGFnZXMsIGFNaWRDb2x1bW5QYWdlcywgYUVuZENvbHVtblBhZ2VzKTtcblxuXHRcdFx0XHRhUGFnZXMuZm9yRWFjaChmdW5jdGlvbiAob1BhZ2U6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRWaWV3ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKG9QYWdlKTtcblxuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1RhcmdldFZpZXcgJiYgb1RhcmdldFZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlLm9uU3VzcGVuZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5vblN1c3BlbmQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0dmlld1N0YXRlITogVmlld1N0YXRlO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXJQcm94eSE6IFJvdXRlclByb3h5O1xuXHRwcml2YXRlIHNDdXJyZW50Um91dGVOYW1lITogc3RyaW5nO1xuXHRwcml2YXRlIHNDdXJyZW50QXJndW1lbnRzPzogYW55O1xuXHRwcml2YXRlIHNQcmV2aW91c0xheW91dCE6IHN0cmluZztcblx0cHJpdmF0ZSBTUVVFUllLRVlOQU1FITogc3RyaW5nO1xuXHRwcml2YXRlIF9vRkNMQ29uZmlnOiBhbnk7XG5cdHByaXZhdGUgb0FkZGl0aW9uYWxWaWV3Rm9yTmF2Um93c0NvbXB1dGF0aW9uOiBhbnk7XG5cdHByaXZhdGUgX29UYXJnZXRzQWdncmVnYXRpb246IGFueTtcblx0cHJpdmF0ZSBfb1RhcmdldHNGcm9tUm91dGVQYXR0ZXJuOiBhbnk7XG5cdHByaXZhdGUgYU1lc3NhZ2VQYWdlcz86IGFueVtdO1xuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmdldE1ldGFkYXRhXG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblxuXHRvbkluaXQoKSB7XG5cdFx0c3VwZXIub25Jbml0KCk7XG5cblx0XHR0aGlzLl9pbnRlcm5hbEluaXQoKTtcblx0fVxuXG5cdGF0dGFjaFJvdXRlTWF0Y2hlcnMoKSB7XG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQodGhpcy5fZ2V0Vmlld0Zvck5hdmlnYXRlZFJvd3NDb21wdXRhdGlvbiwgdGhpcyk7XG5cdFx0c3VwZXIuYXR0YWNoUm91dGVNYXRjaGVycygpO1xuXHRcdHRoaXMuX2ludGVybmFsSW5pdCgpO1xuXG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQodGhpcy5vbkJlZm9yZVJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5vblJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5nZXRGY2xDb250cm9sKCkuYXR0YWNoU3RhdGVDaGFuZ2UodGhpcy5fc2F2ZUxheW91dCwgdGhpcyk7XG5cdH1cblxuXHRfaW50ZXJuYWxJbml0KCkge1xuXHRcdGlmICh0aGlzLl9vUm91dGVyUHJveHkpIHtcblx0XHRcdHJldHVybjsgLy8gQWxyZWFkeSBpbml0aWFsaXplZFxuXHRcdH1cblxuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUgPSBcIlwiO1xuXHRcdHRoaXMuc0N1cnJlbnRBcmd1bWVudHMgPSB7fTtcblx0XHR0aGlzLlNRVUVSWUtFWU5BTUUgPSBcIj9xdWVyeVwiO1xuXG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0aGlzLl9vUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cblx0XHQvLyBHZXQgRkNMIGNvbmZpZ3VyYXRpb24gaW4gdGhlIG1hbmlmZXN0XG5cdFx0dGhpcy5fb0ZDTENvbmZpZyA9IHsgbWF4Q29sdW1uc0NvdW50OiAzIH07XG5cdFx0Y29uc3Qgb1JvdXRpbmdDb25maWcgPSAob0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSlbXCJzYXAudWk1XCJdLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nQ29uZmlnICYmIG9Sb3V0aW5nQ29uZmlnLmNvbmZpZykge1xuXHRcdFx0aWYgKG9Sb3V0aW5nQ29uZmlnLmNvbmZpZy5mbGV4aWJsZUNvbHVtbkxheW91dCkge1xuXHRcdFx0XHRjb25zdCBvRkNMTWFuaWZlc3RDb25maWcgPSBvUm91dGluZ0NvbmZpZy5jb25maWcuZmxleGlibGVDb2x1bW5MYXlvdXQ7XG5cblx0XHRcdFx0Ly8gRGVmYXVsdCBsYXlvdXQgZm9yIDIgY29sdW1uc1xuXHRcdFx0XHRpZiAob0ZDTE1hbmlmZXN0Q29uZmlnLmRlZmF1bHRUd29Db2x1bW5MYXlvdXRUeXBlKSB7XG5cdFx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0VHdvQ29sdW1uTGF5b3V0VHlwZSA9IG9GQ0xNYW5pZmVzdENvbmZpZy5kZWZhdWx0VHdvQ29sdW1uTGF5b3V0VHlwZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIERlZmF1bHQgbGF5b3V0IGZvciAzIGNvbHVtbnNcblx0XHRcdFx0aWYgKG9GQ0xNYW5pZmVzdENvbmZpZy5kZWZhdWx0VGhyZWVDb2x1bW5MYXlvdXRUeXBlKSB7XG5cdFx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0VGhyZWVDb2x1bW5MYXlvdXRUeXBlID0gb0ZDTE1hbmlmZXN0Q29uZmlnLmRlZmF1bHRUaHJlZUNvbHVtbkxheW91dFR5cGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMaW1pdCBGQ0wgdG8gMiBjb2x1bW5zID9cblx0XHRcdFx0aWYgKG9GQ0xNYW5pZmVzdENvbmZpZy5saW1pdEZDTFRvVHdvQ29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50ID0gMjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9Sb3V0aW5nQ29uZmlnLmNvbmZpZy5jb250cm9sQWdncmVnYXRpb24pIHtcblx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0Q29udHJvbEFnZ3JlZ2F0aW9uID0gb1JvdXRpbmdDb25maWcuY29uZmlnLmNvbnRyb2xBZ2dyZWdhdGlvbjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLl9pbml0aWFsaXplVGFyZ2V0QWdncmVnYXRpb24ob0FwcENvbXBvbmVudCk7XG5cdFx0dGhpcy5faW5pdGlhbGl6ZVJvdXRlc0luZm9ybWF0aW9uKG9BcHBDb21wb25lbnQpO1xuXHR9XG5cblx0Z2V0RmNsQ29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdIGFzIEZsZXhpYmxlQ29sdW1uTGF5b3V0O1xuXHR9XG5cblx0X3NhdmVMYXlvdXQob0V2ZW50OiBhbnkpIHtcblx0XHR0aGlzLnNQcmV2aW91c0xheW91dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkubGF5b3V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgYWRkaXRpb25uYWwgdmlldyAob24gdG9wIG9mIHRoZSB2aXNpYmxlIHZpZXdzKSwgdG8gYmUgYWJsZSB0byBjb21wdXRlIHRoZSBsYXRlc3QgdGFibGUgbmF2aWdhdGVkIHJvd3Mgb2YgdGhlIG1vc3QgcmlnaHQgdmlzaWJsZSB2aWV3IGFmdGVyIGEgbmF2IGJhY2sgb3IgY29sdW1uIGZ1bGxzY3JlZW4uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNfZ2V0UmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICovXG5cblx0X2dldFZpZXdGb3JOYXZpZ2F0ZWRSb3dzQ29tcHV0YXRpb24oKSB7XG5cdFx0Y29uc3QgYUFsbFZpc2libGVWaWV3c0JlZm9yZVJvdXRlTWF0Y2hlZCA9IHRoaXMuX2dldEFsbFZpc2libGVWaWV3cyh0aGlzLnNQcmV2aW91c0xheW91dCk7XG5cdFx0Y29uc3Qgb1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQgPSBhQWxsVmlzaWJsZVZpZXdzQmVmb3JlUm91dGVNYXRjaGVkW2FBbGxWaXNpYmxlVmlld3NCZWZvcmVSb3V0ZU1hdGNoZWQubGVuZ3RoIC0gMV07XG5cdFx0bGV0IG9SaWdodE1vc3RWaWV3O1xuXHRcdHRoaXMuZ2V0Um91dGVyKCkuYXR0YWNoRXZlbnRPbmNlKFwicm91dGVNYXRjaGVkXCIsIChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0b1JpZ2h0TW9zdFZpZXcgPSBfZ2V0Vmlld0Zyb21Db250YWluZXIob0V2ZW50LmdldFBhcmFtZXRlcihcInZpZXdzXCIpW29FdmVudC5nZXRQYXJhbWV0ZXIoXCJ2aWV3c1wiKS5sZW5ndGggLSAxXSk7XG5cdFx0XHRpZiAob1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGlvbiBmb3J3YXJkIGZyb20gTDIgdG8gdmlldyBsZXZlbCBMMyAoRnVsbFNjcmVlbkxheW91dCk6XG5cdFx0XHRcdGlmIChvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpICYmIG9SaWdodE1vc3RWaWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsID09PSB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCkge1xuXHRcdFx0XHRcdHRoaXMub0FkZGl0aW9uYWxWaWV3Rm9yTmF2Um93c0NvbXB1dGF0aW9uID0gb1JpZ2h0TW9zdFZpZXc7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gTmF2aWdhdGlvbnMgYmFja3dhcmQgZnJvbSBMMyBkb3duIHRvIEwyLCBMMSwgTDAgKFRocmVlQ29sdW1uIGxheW91dCk6XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpICYmXG5cdFx0XHRcdFx0b1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQuZ2V0Vmlld0RhdGEoKSAmJlxuXHRcdFx0XHRcdG9SaWdodE1vc3RWaWV3QmVmb3JlUm91dGVNYXRjaGVkLmdldFZpZXdEYXRhKCkudmlld0xldmVsIDwgdGhpcy5fb0ZDTENvbmZpZy5tYXhDb2x1bW5zQ291bnQgJiZcblx0XHRcdFx0XHRvUmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZC5nZXRWaWV3RGF0YSgpICYmXG5cdFx0XHRcdFx0b1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWwgPiBvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbCAmJlxuXHRcdFx0XHRcdG9SaWdodE1vc3RWaWV3ICE9PSBvUmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR0aGlzLm9BZGRpdGlvbmFsVmlld0Zvck5hdlJvd3NDb21wdXRhdGlvbiA9IG9SaWdodE1vc3RWaWV3QmVmb3JlUm91dGVNYXRjaGVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRWaWV3Rm9yTmF2aWdhdGVkUm93c0NvbXB1dGF0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm9BZGRpdGlvbmFsVmlld0Zvck5hdlJvd3NDb21wdXRhdGlvbjtcblx0fVxuXG5cdG9uRXhpdCgpIHtcblx0XHR0aGlzLmdldFJvdXRlcigpLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLm9uUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLmdldFJvdXRlcigpLmRldGFjaEJlZm9yZVJvdXRlTWF0Y2hlZCh0aGlzLm9uQmVmb3JlUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLmdldEZjbENvbnRyb2woKS5kZXRhY2hTdGF0ZUNoYW5nZSh0aGlzLm9uU3RhdGVDaGFuZ2VkLCB0aGlzKTtcblx0XHR0aGlzLmdldEZjbENvbnRyb2woKS5kZXRhY2hBZnRlckVuZENvbHVtbk5hdmlnYXRlKHRoaXMub25TdGF0ZUNoYW5nZWQsIHRoaXMpO1xuXHRcdHRoaXMuX29UYXJnZXRzQWdncmVnYXRpb24gPSBudWxsO1xuXHRcdHRoaXMuX29UYXJnZXRzRnJvbVJvdXRlUGF0dGVybiA9IG51bGw7XG5cblx0XHRCYXNlQ29udHJvbGxlci5wcm90b3R5cGUub25FeGl0LmJpbmQodGhpcykoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiB0aGUgRkNMIGNvbXBvbmVudCBpcyBlbmFibGVkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjaXNGY2xFbmFibGVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgc2luY2Ugd2UgYXJlIGluIEZDTCBzY2VuYXJpb1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRpc0ZjbEVuYWJsZWQoKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRkaXNwbGF5TWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogYW55LCBtUGFyYW1ldGVyczogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgb0ZDTENvbnRyb2wgPSB0aGlzLmdldEZjbENvbnRyb2woKTtcblxuXHRcdGlmICh0aGlzLl9vRkNMQ29uZmlnICYmIG1QYXJhbWV0ZXJzLkZDTExldmVsID49IHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50KSB7XG5cdFx0XHRtUGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50IC0gMTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuYU1lc3NhZ2VQYWdlcykge1xuXHRcdFx0dGhpcy5hTWVzc2FnZVBhZ2VzID0gW251bGwsIG51bGwsIG51bGxdO1xuXHRcdH1cblx0XHRsZXQgb01lc3NhZ2VQYWdlID0gdGhpcy5hTWVzc2FnZVBhZ2VzW21QYXJhbWV0ZXJzLkZDTExldmVsXTtcblx0XHRpZiAoIW9NZXNzYWdlUGFnZSkge1xuXHRcdFx0b01lc3NhZ2VQYWdlID0gbmV3IE1lc3NhZ2VQYWdlKHtcblx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdGljb246IFwic2FwLWljb246Ly9tZXNzYWdlLWVycm9yXCJcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5hTWVzc2FnZVBhZ2VzW21QYXJhbWV0ZXJzLkZDTExldmVsXSA9IG9NZXNzYWdlUGFnZTtcblxuXHRcdFx0c3dpdGNoIChtUGFyYW1ldGVycy5GQ0xMZXZlbCkge1xuXHRcdFx0XHRjYXNlIDA6XG5cdFx0XHRcdFx0b0ZDTENvbnRyb2wuYWRkQmVnaW5Db2x1bW5QYWdlKG9NZXNzYWdlUGFnZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRcdG9GQ0xDb250cm9sLmFkZE1pZENvbHVtblBhZ2Uob01lc3NhZ2VQYWdlKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdG9GQ0xDb250cm9sLmFkZEVuZENvbHVtblBhZ2Uob01lc3NhZ2VQYWdlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvTWVzc2FnZVBhZ2Uuc2V0VGV4dChzRXJyb3JNZXNzYWdlKTtcblxuXHRcdGlmIChtUGFyYW1ldGVycy50ZWNobmljYWxNZXNzYWdlKSB7XG5cdFx0XHRvTWVzc2FnZVBhZ2Uuc2V0Q3VzdG9tRGVzY3JpcHRpb24oXG5cdFx0XHRcdG5ldyBMaW5rKHtcblx0XHRcdFx0XHR0ZXh0OiBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiB8fCBtUGFyYW1ldGVycy50ZWNobmljYWxNZXNzYWdlLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRNZXNzYWdlQm94LnNob3cobVBhcmFtZXRlcnMudGVjaG5pY2FsTWVzc2FnZSwge1xuXHRcdFx0XHRcdFx0XHRpY29uOiBJY29uLkVSUk9SLFxuXHRcdFx0XHRcdFx0XHR0aXRsZTogbVBhcmFtZXRlcnMudGl0bGUsXG5cdFx0XHRcdFx0XHRcdGFjdGlvbnM6IFtBY3Rpb24uT0tdLFxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0QWN0aW9uOiBBY3Rpb24uT0ssXG5cdFx0XHRcdFx0XHRcdGRldGFpbHM6IG1QYXJhbWV0ZXJzLnRlY2huaWNhbERldGFpbHMgfHwgXCJcIixcblx0XHRcdFx0XHRcdFx0Y29udGVudFdpZHRoOiBcIjYwJVwiXG5cdFx0XHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b01lc3NhZ2VQYWdlLnNldERlc2NyaXB0aW9uKG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIHx8IFwiXCIpO1xuXHRcdH1cblxuXHRcdChvRkNMQ29udHJvbCBhcyBhbnkpLnRvKG9NZXNzYWdlUGFnZS5nZXRJZCgpKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemUgdGhlIG9iamVjdCBfb1RhcmdldHNBZ2dyZWdhdGlvbiB0aGF0IGRlZmluZXMgZm9yIGVhY2ggcm91dGUgdGhlIHJlbGV2YW50IGFnZ3JlZ2F0aW9uIGFuZCBwYXR0ZXJuLlxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNfaW5pdGlhbGl6ZVRhcmdldEFnZ3JlZ2F0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIFtvQXBwQ29tcG9uZW50XSBSZWZlcmVuY2UgdG8gdGhlIEFwcENvbXBvbmVudFxuXHQgKi9cblx0X2luaXRpYWxpemVUYXJnZXRBZ2dyZWdhdGlvbihvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRjb25zdCBvTWFuaWZlc3QgPSBvQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0KCkgYXMgYW55LFxuXHRcdFx0b1RhcmdldHMgPSBvTWFuaWZlc3RbXCJzYXAudWk1XCJdLnJvdXRpbmcgPyBvTWFuaWZlc3RbXCJzYXAudWk1XCJdLnJvdXRpbmcudGFyZ2V0cyA6IG51bGw7XG5cblx0XHR0aGlzLl9vVGFyZ2V0c0FnZ3JlZ2F0aW9uID0ge307XG5cblx0XHRpZiAob1RhcmdldHMpIHtcblx0XHRcdE9iamVjdC5rZXlzKG9UYXJnZXRzKS5mb3JFYWNoKChzVGFyZ2V0TmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9UYXJnZXQgPSBvVGFyZ2V0c1tzVGFyZ2V0TmFtZV07XG5cdFx0XHRcdGlmIChvVGFyZ2V0LmNvbnRyb2xBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRcdHRoaXMuX29UYXJnZXRzQWdncmVnYXRpb25bc1RhcmdldE5hbWVdID0ge1xuXHRcdFx0XHRcdFx0YWdncmVnYXRpb246IG9UYXJnZXQuY29udHJvbEFnZ3JlZ2F0aW9uLFxuXHRcdFx0XHRcdFx0cGF0dGVybjogb1RhcmdldC5jb250ZXh0UGF0dGVyblxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fb1RhcmdldHNBZ2dyZWdhdGlvbltzVGFyZ2V0TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbjogXCJwYWdlXCIsXG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiBudWxsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSBtYXBwaW5nIGJldHdlZW4gYSByb3V0ZSAoaWRlbnRpZmVkIGFzIGl0cyBwYXR0ZXJuKSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0c1xuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNfaW5pdGlhbGl6ZVJvdXRlc0luZm9ybWF0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIG9BcHBDb21wb25lbnQgcmVmIHRvIHRoZSBBcHBDb21wb25lbnRcblx0ICovXG5cblx0X2luaXRpYWxpemVSb3V0ZXNJbmZvcm1hdGlvbihvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRjb25zdCBvTWFuaWZlc3QgPSBvQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0KCkgYXMgYW55LFxuXHRcdFx0YVJvdXRlcyA9IG9NYW5pZmVzdFtcInNhcC51aTVcIl0ucm91dGluZyA/IG9NYW5pZmVzdFtcInNhcC51aTVcIl0ucm91dGluZy5yb3V0ZXMgOiBudWxsO1xuXG5cdFx0dGhpcy5fb1RhcmdldHNGcm9tUm91dGVQYXR0ZXJuID0ge307XG5cblx0XHRpZiAoYVJvdXRlcykge1xuXHRcdFx0YVJvdXRlcy5mb3JFYWNoKChyb3V0ZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRzRnJvbVJvdXRlUGF0dGVybltyb3V0ZS5wYXR0ZXJuXSA9IHJvdXRlLnRhcmdldDtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGdldEN1cnJlbnRBcmd1bWVudCgpIHtcblx0XHRyZXR1cm4gdGhpcy5zQ3VycmVudEFyZ3VtZW50cztcblx0fVxuXG5cdGdldEN1cnJlbnRSb3V0ZU5hbWUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IEZFIEZDTCBjb25zdGFudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEByZXR1cm5zIFRoZSBjb25zdGFudHNcblx0ICovXG5cdGdldENvbnN0YW50cygpIHtcblx0XHRyZXR1cm4gQ09OU1RBTlRTO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHRlciBmb3Igb1RhcmdldHNBZ2dyZWdhdGlvbiBhcnJheS5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjZ2V0VGFyZ2V0QWdncmVnYXRpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcmV0dXJucyBUaGUgX29UYXJnZXRzQWdncmVnYXRpb24gYXJyYXlcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRnZXRUYXJnZXRBZ2dyZWdhdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1RhcmdldHNBZ2dyZWdhdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0cmlnZ2VyZWQgYnkgdGhlIHJvdXRlciBSb3V0ZU1hdGNoZWQgZXZlbnQuXG5cdCAqXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyI29uUm91dGVNYXRjaGVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqL1xuXHRvblJvdXRlTWF0Y2hlZChvRXZlbnQ6IGFueSkge1xuXHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmFtZVwiKTtcblxuXHRcdC8vIFNhdmUgdGhlIGN1cnJlbnQvcHJldmlvdXMgcm91dGVzIGFuZCBhcmd1bWVudHNcblx0XHR0aGlzLnNDdXJyZW50Um91dGVOYW1lID0gc1JvdXRlTmFtZTtcblx0XHR0aGlzLnNDdXJyZW50QXJndW1lbnRzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImFyZ3VtZW50c1wiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIHRyaWdnZXJpbmcgdGhlIHRhYmxlIHNjcm9sbCB0byB0aGUgbmF2aWdhdGVkIHJvdyBhZnRlciBlYWNoIGxheW91dCBjaGFuZ2UuXG5cdCAqXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyI3Njcm9sbFRvTGFzdFNlbGVjdGVkSXRlbVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICovXG5cblx0X3Njcm9sbFRhYmxlc1RvTGFzdE5hdmlnYXRlZEl0ZW1zKCkge1xuXHRcdGNvbnN0IGFWaWV3cyA9IHRoaXMuX2dldEFsbFZpc2libGVWaWV3cygpO1xuXHRcdC8vVGhlIHNjcm9sbHMgYXJlIHRyaWdnZXJlZCBvbmx5IGlmIHRoZSBsYXlvdXQgaXMgd2l0aCBzZXZlcmFsIGNvbHVtbnMgb3Igd2hlbiBzd2l0Y2hpbmcgdGhlIG1vc3RSaWdodCBjb2x1bW4gaW4gZnVsbCBzY3JlZW5cblx0XHRpZiAoYVZpZXdzLmxlbmd0aCA+IDEgfHwgYVZpZXdzWzBdLmdldFZpZXdEYXRhKCkudmlld0xldmVsIDwgdGhpcy5fb0ZDTENvbmZpZy5tYXhDb2x1bW5zQ291bnQpIHtcblx0XHRcdGxldCBzQ3VycmVudFZpZXdQYXRoO1xuXHRcdFx0Y29uc3Qgb0FkZGl0aW9uYWxWaWV3ID0gdGhpcy5nZXRWaWV3Rm9yTmF2aWdhdGVkUm93c0NvbXB1dGF0aW9uKCk7XG5cdFx0XHRpZiAob0FkZGl0aW9uYWxWaWV3ICYmIGFWaWV3cy5pbmRleE9mKG9BZGRpdGlvbmFsVmlldykgPT09IC0xKSB7XG5cdFx0XHRcdGFWaWV3cy5wdXNoKG9BZGRpdGlvbmFsVmlldyk7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGxldCBpbmRleCA9IGFWaWV3cy5sZW5ndGggLSAxOyBpbmRleCA+IDA7IGluZGV4LS0pIHtcblx0XHRcdFx0Y29uc3Qgb1ZpZXcgPSBhVmlld3NbaW5kZXhdLFxuXHRcdFx0XHRcdG9QcmV2aW91c1ZpZXcgPSBhVmlld3NbaW5kZXggLSAxXTtcblx0XHRcdFx0aWYgKG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0XHRzQ3VycmVudFZpZXdQYXRoID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRQYXRoKCk7XG5cdFx0XHRcdFx0b1ByZXZpb3VzVmlldy5nZXRDb250cm9sbGVyKCkuX3Njcm9sbFRhYmxlc1RvUm93KHNDdXJyZW50Vmlld1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRyaWdnZXJlZCBieSB0aGUgRkNMIFN0YXRlQ2hhbmdlZCBldmVudC5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjb25TdGF0ZUNoYW5nZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdG9uU3RhdGVDaGFuZ2VkKG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3QgYklzTmF2aWdhdGlvbkFycm93ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlzTmF2aWdhdGlvbkFycm93XCIpO1xuXHRcdGlmICh0aGlzLnNDdXJyZW50QXJndW1lbnRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICghdGhpcy5zQ3VycmVudEFyZ3VtZW50c1t0aGlzLlNRVUVSWUtFWU5BTUVdKSB7XG5cdFx0XHRcdHRoaXMuc0N1cnJlbnRBcmd1bWVudHNbdGhpcy5TUVVFUllLRVlOQU1FXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5zQ3VycmVudEFyZ3VtZW50c1t0aGlzLlNRVUVSWUtFWU5BTUVdLmxheW91dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJsYXlvdXRcIik7XG5cdFx0fVxuXHRcdHRoaXMuX2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1icyhvRXZlbnQpO1xuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgVVJMIHdpdGggdGhlIG5ldyBsYXlvdXQgaWYgYSBuYXZpZ2F0aW9uIGFycm93IHdhcyB1c2VkXG5cdFx0aWYgKGJJc05hdmlnYXRpb25BcnJvdykge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdlRvKHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUsIHRoaXMuc0N1cnJlbnRBcmd1bWVudHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmaXJlIE1vZGVsQ29udGV4dENoYW5nZSBldmVudCBvbiBhbGwgYnJlYWRjcnVtYnMgKCBvbiBlYWNoIE9iamVjdFBhZ2VzKS5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjX2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1ic1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0X2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1icyhvRXZlbnQ6IGFueSkge1xuXHRcdC8vZm9yY2UgbW9kZWxjb250ZXh0Y2hhbmdlIG9uIE9iamVjdFBhZ2VzIHRvIHJlZnJlc2ggdGhlIGJyZWFkY3J1bWJzIGxpbmsgaHJlZnNcblx0XHRjb25zdCBvRmNsID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGxldCBvUGFnZXM6IGFueVtdID0gW107XG5cdFx0b1BhZ2VzID0gb1BhZ2VzLmNvbmNhdChvRmNsLmdldEJlZ2luQ29sdW1uUGFnZXMoKSkuY29uY2F0KG9GY2wuZ2V0TWlkQ29sdW1uUGFnZXMoKSkuY29uY2F0KG9GY2wuZ2V0RW5kQ29sdW1uUGFnZXMoKSk7XG5cdFx0b1BhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG9QYWdlOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKG9QYWdlKTtcblx0XHRcdGNvbnN0IG9CcmVhZENydW1icyA9IG9WaWV3LmJ5SWQgJiYgb1ZpZXcuYnlJZChcImJyZWFkY3J1bWJzXCIpO1xuXHRcdFx0aWYgKG9CcmVhZENydW1icykge1xuXHRcdFx0XHRvQnJlYWRDcnVtYnMuZmlyZU1vZGVsQ29udGV4dENoYW5nZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRyaWdnZXJlZCB0byB1cGRhdGUgdGhlIFNoYXJlIGJ1dHRvbiBWaXNpYmlsaXR5LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHZpZXdDb2x1bW4gTmFtZSBvZiB0aGUgY3VycmVudCBjb2x1bW4gKFwiYmVnaW5Db2x1bW5cIiwgXCJtaWRDb2x1bW5cIiwgXCJlbmRDb2x1bW5cIilcblx0ICogQHBhcmFtIHNMYXlvdXQgVGhlIGN1cnJlbnQgbGF5b3V0IHVzZWQgYnkgdGhlIEZDTFxuXHQgKiBAcmV0dXJucyBUaGUgc2hhcmUgYnV0dG9uIHZpc2liaWxpdHlcblx0ICovXG5cdF91cGRhdGVTaGFyZUJ1dHRvblZpc2liaWxpdHkodmlld0NvbHVtbjogc3RyaW5nLCBzTGF5b3V0OiBzdHJpbmcpIHtcblx0XHRsZXQgYlNob3dTaGFyZUljb247XG5cdFx0c3dpdGNoIChzTGF5b3V0KSB7XG5cdFx0XHRjYXNlIFwiT25lQ29sdW1uXCI6XG5cdFx0XHRcdGJTaG93U2hhcmVJY29uID0gdmlld0NvbHVtbiA9PT0gXCJiZWdpbkNvbHVtblwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJNaWRDb2x1bW5GdWxsU2NyZWVuXCI6XG5cdFx0XHRjYXNlIFwiVGhyZWVDb2x1bW5zQmVnaW5FeHBhbmRlZEVuZEhpZGRlblwiOlxuXHRcdFx0Y2FzZSBcIlRocmVlQ29sdW1uc01pZEV4cGFuZGVkRW5kSGlkZGVuXCI6XG5cdFx0XHRjYXNlIFwiVHdvQ29sdW1uc0JlZ2luRXhwYW5kZWRcIjpcblx0XHRcdGNhc2UgXCJUd29Db2x1bW5zTWlkRXhwYW5kZWRcIjpcblx0XHRcdFx0YlNob3dTaGFyZUljb24gPSB2aWV3Q29sdW1uID09PSBcIm1pZENvbHVtblwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFbmRDb2x1bW5GdWxsU2NyZWVuXCI6XG5cdFx0XHRjYXNlIFwiVGhyZWVDb2x1bW5zRW5kRXhwYW5kZWRcIjpcblx0XHRcdGNhc2UgXCJUaHJlZUNvbHVtbnNNaWRFeHBhbmRlZFwiOlxuXHRcdFx0XHRiU2hvd1NoYXJlSWNvbiA9IHZpZXdDb2x1bW4gPT09IFwiZW5kQ29sdW1uXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YlNob3dTaGFyZUljb24gPSBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIGJTaG93U2hhcmVJY29uO1xuXHR9XG5cblx0dXBkYXRlVUlTdGF0ZUZvclZpZXcob1ZpZXc6IGFueSwgRkNMTGV2ZWw6IGFueSkge1xuXHRcdGNvbnN0IG9VSVN0YXRlID0gdGhpcy5nZXRIZWxwZXIoKS5nZXRDdXJyZW50VUlTdGF0ZSgpIGFzIGFueSxcblx0XHRcdG9GY2xDb2xOYW1lID0gW1wiYmVnaW5Db2x1bW5cIiwgXCJtaWRDb2x1bW5cIiwgXCJlbmRDb2x1bW5cIl0sXG5cdFx0XHRzTGF5b3V0ID0gdGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0TGF5b3V0KCk7XG5cdFx0bGV0IHZpZXdDb2x1bW47XG5cblx0XHRpZiAoIW9WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpKSB7XG5cdFx0XHRvVmlldy5zZXRNb2RlbCh0aGlzLl9jcmVhdGVIZWxwZXJNb2RlbCgpLCBcImZjbGhlbHBlclwiKTtcblx0XHR9XG5cdFx0aWYgKEZDTExldmVsID49IHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpcyBvbiBhIGxldmVsID4gbWF4IG51bWJlciBvZiBjb2x1bW5zLiBJdCdzIGFsd2F5cyBmdWxsc2NyZWVuIHdpdGhvdXQgY2xvc2UvZXhpdCBidXR0b25zXG5cdFx0XHR2aWV3Q29sdW1uID0gb0ZjbENvbE5hbWVbdGhpcy5fb0ZDTENvbmZpZy5tYXhDb2x1bW5zQ291bnQgLSAxXTtcblx0XHRcdG9VSVN0YXRlLmFjdGlvbkJ1dHRvbnNJbmZvLm1pZENvbHVtbi5mdWxsU2NyZWVuID0gbnVsbDtcblx0XHRcdG9VSVN0YXRlLmFjdGlvbkJ1dHRvbnNJbmZvLm1pZENvbHVtbi5leGl0RnVsbFNjcmVlbiA9IG51bGw7XG5cdFx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5taWRDb2x1bW4uY2xvc2VDb2x1bW4gPSBudWxsO1xuXHRcdFx0b1VJU3RhdGUuYWN0aW9uQnV0dG9uc0luZm8uZW5kQ29sdW1uLmV4aXRGdWxsU2NyZWVuID0gbnVsbDtcblx0XHRcdG9VSVN0YXRlLmFjdGlvbkJ1dHRvbnNJbmZvLmVuZENvbHVtbi5mdWxsU2NyZWVuID0gbnVsbDtcblx0XHRcdG9VSVN0YXRlLmFjdGlvbkJ1dHRvbnNJbmZvLmVuZENvbHVtbi5jbG9zZUNvbHVtbiA9IG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZpZXdDb2x1bW4gPSBvRmNsQ29sTmFtZVtGQ0xMZXZlbF07XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0RkNMTGV2ZWwgPj0gdGhpcy5fb0ZDTENvbmZpZy5tYXhDb2x1bW5zQ291bnQgfHxcblx0XHRcdHNMYXlvdXQgPT09IFwiRW5kQ29sdW1uRnVsbFNjcmVlblwiIHx8XG5cdFx0XHRzTGF5b3V0ID09PSBcIk1pZENvbHVtbkZ1bGxTY3JlZW5cIiB8fFxuXHRcdFx0c0xheW91dCA9PT0gXCJPbmVDb2x1bW5cIlxuXHRcdCkge1xuXHRcdFx0b1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuc2V0UHJvcGVydHkoXCIvYnJlYWRDcnVtYklzVmlzaWJsZVwiLCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuc2V0UHJvcGVydHkoXCIvYnJlYWRDcnVtYklzVmlzaWJsZVwiLCBmYWxzZSk7XG5cdFx0fVxuXHRcdC8vIFVuZm9ydHVuYXRlbHksIHRoZSBGQ0xIZWxwZXIgZG9lc24ndCBwcm92aWRlIGFjdGlvbkJ1dHRvbiB2YWx1ZXMgZm9yIHRoZSBmaXJzdCBjb2x1bW5cblx0XHQvLyBzbyB3ZSBoYXZlIHRvIGFkZCB0aGlzIGluZm8gbWFudWFsbHlcblx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5iZWdpbkNvbHVtbiA9IHsgZnVsbFNjcmVlbjogbnVsbCwgZXhpdEZ1bGxTY3JlZW46IG51bGwsIGNsb3NlQ29sdW1uOiBudWxsIH07XG5cblx0XHRjb25zdCBvQWN0aW9uQnV0dG9uSW5mb3MgPSBPYmplY3QuYXNzaWduKHt9LCBvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mb1t2aWV3Q29sdW1uXSk7XG5cdFx0b0FjdGlvbkJ1dHRvbkluZm9zLnN3aXRjaFZpc2libGUgPSBvQWN0aW9uQnV0dG9uSW5mb3MuZnVsbFNjcmVlbiAhPT0gbnVsbCB8fCBvQWN0aW9uQnV0dG9uSW5mb3MuZXhpdEZ1bGxTY3JlZW4gIT09IG51bGw7XG5cdFx0b0FjdGlvbkJ1dHRvbkluZm9zLnN3aXRjaEljb24gPSBvQWN0aW9uQnV0dG9uSW5mb3MuZnVsbFNjcmVlbiAhPT0gbnVsbCA/IFwic2FwLWljb246Ly9mdWxsLXNjcmVlblwiIDogXCJzYXAtaWNvbjovL2V4aXQtZnVsbC1zY3JlZW5cIjtcblx0XHRvQWN0aW9uQnV0dG9uSW5mb3MuaXNGdWxsU2NyZWVuID0gb0FjdGlvbkJ1dHRvbkluZm9zLmZ1bGxTY3JlZW4gPT09IG51bGw7XG5cblx0XHRvVmlldy5nZXRNb2RlbChcImZjbGhlbHBlclwiKS5zZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mb1wiLCBvQWN0aW9uQnV0dG9uSW5mb3MpO1xuXG5cdFx0b1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuc2V0UHJvcGVydHkoXCIvc2hvd1NoYXJlSWNvblwiLCB0aGlzLl91cGRhdGVTaGFyZUJ1dHRvblZpc2liaWxpdHkodmlld0NvbHVtbiwgc0xheW91dCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRyaWdnZXJlZCBieSB0aGUgcm91dGVyIEJlZm9yZVJvdXRlTWF0Y2hlZCBldmVudC5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjb25CZWZvcmVSb3V0ZU1hdGNoZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdG9uQmVmb3JlUm91dGVNYXRjaGVkKG9FdmVudDogYW55KSB7XG5cdFx0aWYgKG9FdmVudCkge1xuXHRcdFx0Y29uc3Qgb1F1ZXJ5UGFyYW1zID0gb0V2ZW50LmdldFBhcmFtZXRlcnMoKS5hcmd1bWVudHNbdGhpcy5TUVVFUllLRVlOQU1FXTtcblx0XHRcdGxldCBzTGF5b3V0ID0gb1F1ZXJ5UGFyYW1zID8gb1F1ZXJ5UGFyYW1zLmxheW91dCA6IG51bGw7XG5cblx0XHRcdC8vIElmIHRoZXJlIGlzIG5vIGxheW91dCBwYXJhbWV0ZXIsIHF1ZXJ5IGZvciB0aGUgZGVmYXVsdCBsZXZlbCAwIGxheW91dCAobm9ybWFsbHkgT25lQ29sdW1uKVxuXHRcdFx0aWYgKCFzTGF5b3V0KSB7XG5cdFx0XHRcdGNvbnN0IG9OZXh0VUlTdGF0ZSA9IHRoaXMuZ2V0SGVscGVyKCkuZ2V0TmV4dFVJU3RhdGUoMCk7XG5cdFx0XHRcdHNMYXlvdXQgPSBvTmV4dFVJU3RhdGUubGF5b3V0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgbGF5b3V0IGlmIGNvbXBhdGlibGUgd2l0aCB0aGUgbnVtYmVyIG9mIHRhcmdldHNcblx0XHRcdC8vIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY2FzZSBmb3Igbm9ybWFsIG5hdmlnYXRpb24sIGp1c3QgbmVlZGVkIGluIGNhc2Vcblx0XHRcdC8vIHRoZSBVUkwgaGFzIGJlZW4gbWFudWFsbHkgbW9kaWZpZWRcblx0XHRcdGNvbnN0IGFUYXJnZXRzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbmZpZ1wiKS50YXJnZXQ7XG5cdFx0XHRzTGF5b3V0ID0gdGhpcy5fY29ycmVjdExheW91dEZvclRhcmdldHMoc0xheW91dCwgYVRhcmdldHMpO1xuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIGxheW91dCBvZiB0aGUgRmxleGlibGVDb2x1bW5MYXlvdXRcblx0XHRcdGlmIChzTGF5b3V0KSB7XG5cdFx0XHRcdHRoaXMuZ2V0RmNsQ29udHJvbCgpLnNldExheW91dChzTGF5b3V0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGVscGVyIGZvciB0aGUgRkNMIENvbXBvbmVudC5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjZ2V0SGVscGVyXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcmV0dXJucyBJbnN0YW5jZSBvZiBhIHNlbWFudGljIGhlbHBlclxuXHQgKi9cblx0Z2V0SGVscGVyKCkge1xuXHRcdHJldHVybiBGbGV4aWJsZUNvbHVtbkxheW91dFNlbWFudGljSGVscGVyLmdldEluc3RhbmNlRm9yKHRoaXMuZ2V0RmNsQ29udHJvbCgpLCB0aGlzLl9vRkNMQ29uZmlnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBGQ0wgbGF5b3V0IGZvciBhIGdpdmVuIEZDTCBsZXZlbCBhbmQgYSB0YXJnZXQgaGFzaC5cblx0ICpcblx0ICogQHBhcmFtIGlOZXh0RkNMTGV2ZWwgRkNMIGxldmVsIHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBzUHJvcG9zZWRMYXlvdXQgVGhlIHByb3Bvc2VkIGxheW91dFxuXHQgKiBAcGFyYW0ga2VlcEN1cnJlbnRMYXlvdXQgVHJ1ZSBpZiB3ZSB3YW50IHRvIGtlZXAgdGhlIGN1cnJlbnQgbGF5b3V0IGlmIHBvc3NpYmxlXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxjdWxhdGVkIGxheW91dFxuXHQgKi9cblx0Y2FsY3VsYXRlTGF5b3V0KGlOZXh0RkNMTGV2ZWw6IG51bWJlciwgc0hhc2g6IHN0cmluZywgc1Byb3Bvc2VkTGF5b3V0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtlZXBDdXJyZW50TGF5b3V0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG5cdFx0Ly8gRmlyc3QsIGFzayB0aGUgRkNMIGhlbHBlciB0byBjYWxjdWxhdGUgdGhlIGxheW91dCBpZiBub3RoaW5nIGlzIHByb3Bvc2VkXG5cdFx0aWYgKCFzUHJvcG9zZWRMYXlvdXQpIHtcblx0XHRcdHNQcm9wb3NlZExheW91dCA9IGtlZXBDdXJyZW50TGF5b3V0ID8gdGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0TGF5b3V0KCkgOiB0aGlzLmdldEhlbHBlcigpLmdldE5leHRVSVN0YXRlKGlOZXh0RkNMTGV2ZWwpLmxheW91dDtcblx0XHR9XG5cblx0XHQvLyBUaGVuIGNoYW5nZSB0aGlzIHZhbHVlIGlmIG5lY2Vzc2FyeSwgYmFzZWQgb24gdGhlIG51bWJlciBvZiB0YXJnZXRzXG5cdFx0Y29uc3Qgb1JvdXRlID0gKHRoaXMuZ2V0Um91dGVyKCkgYXMgYW55KS5nZXRSb3V0ZUJ5SGFzaChgJHtzSGFzaH0/bGF5b3V0PSR7c1Byb3Bvc2VkTGF5b3V0fWApO1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gdGhpcy5fb1RhcmdldHNGcm9tUm91dGVQYXR0ZXJuW29Sb3V0ZS5nZXRQYXR0ZXJuKCldO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2NvcnJlY3RMYXlvdXRGb3JUYXJnZXRzKHNQcm9wb3NlZExheW91dCwgYVRhcmdldHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gRkNMIGxheW91dCBpcyBjb21wYXRpYmxlIHdpdGggYW4gYXJyYXkgb2YgdGFyZ2V0cy5cblx0ICpcblx0ICogQHBhcmFtIHNQcm9wb3NlZExheW91dCBQcm9wb3NlZCB2YWx1ZSBmb3IgdGhlIEZDTCBsYXlvdXRcblx0ICogQHBhcmFtIGFUYXJnZXRzIEFycmF5IG9mIHRhcmdldCBuYW1lcyB1c2VkIGZvciBjaGVja2luZ1xuXHQgKiBAcmV0dXJucyBUaGUgY29ycmVjdGVkIGxheW91dFxuXHQgKi9cblx0X2NvcnJlY3RMYXlvdXRGb3JUYXJnZXRzKHNQcm9wb3NlZExheW91dDogYW55LCBhVGFyZ2V0czogYW55KSB7XG5cdFx0Y29uc3QgYWxsQWxsb3dlZExheW91dHM6IGFueSA9IHtcblx0XHRcdFwiMlwiOiBbXCJUd29Db2x1bW5zTWlkRXhwYW5kZWRcIiwgXCJUd29Db2x1bW5zQmVnaW5FeHBhbmRlZFwiLCBcIk1pZENvbHVtbkZ1bGxTY3JlZW5cIl0sXG5cdFx0XHRcIjNcIjogW1xuXHRcdFx0XHRcIlRocmVlQ29sdW1uc01pZEV4cGFuZGVkXCIsXG5cdFx0XHRcdFwiVGhyZWVDb2x1bW5zRW5kRXhwYW5kZWRcIixcblx0XHRcdFx0XCJUaHJlZUNvbHVtbnNNaWRFeHBhbmRlZEVuZEhpZGRlblwiLFxuXHRcdFx0XHRcIlRocmVlQ29sdW1uc0JlZ2luRXhwYW5kZWRFbmRIaWRkZW5cIixcblx0XHRcdFx0XCJNaWRDb2x1bW5GdWxsU2NyZWVuXCIsXG5cdFx0XHRcdFwiRW5kQ29sdW1uRnVsbFNjcmVlblwiXG5cdFx0XHRdXG5cdFx0fTtcblxuXHRcdGlmIChhVGFyZ2V0cyAmJiAhQXJyYXkuaXNBcnJheShhVGFyZ2V0cykpIHtcblx0XHRcdC8vIFRvIHN1cHBvcnQgc2luZ2xlIHRhcmdldCBhcyBhIHN0cmluZyBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdGFUYXJnZXRzID0gW2FUYXJnZXRzXTtcblx0XHR9XG5cblx0XHRpZiAoIWFUYXJnZXRzKSB7XG5cdFx0XHQvLyBEZWZlbnNpdmUsIGp1c3QgaW4gY2FzZS4uLlxuXHRcdFx0cmV0dXJuIHNQcm9wb3NlZExheW91dDtcblx0XHR9IGVsc2UgaWYgKGFUYXJnZXRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIE1vcmUgdGhhbiAxIHRhcmdldDoganVzdCBzaW1wbHkgY2hlY2sgZnJvbSB0aGUgYWxsb3dlZCB2YWx1ZXNcblx0XHRcdGNvbnN0IGFMYXlvdXRzID0gYWxsQWxsb3dlZExheW91dHNbYVRhcmdldHMubGVuZ3RoXTtcblx0XHRcdGlmIChhTGF5b3V0cy5pbmRleE9mKHNQcm9wb3NlZExheW91dCkgPCAwKSB7XG5cdFx0XHRcdC8vIFRoZSBwcm9wb3NlZCBsYXlvdXQgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZSBudW1iZXIgb2YgY29sdW1uc1xuXHRcdFx0XHQvLyAtLT4gQXNrIHRoZSBoZWxwZXIgZm9yIHRoZSBkZWZhdWx0IGxheW91dCBmb3IgdGhlIG51bWJlciBvZiBjb2x1bW5zXG5cdFx0XHRcdHNQcm9wb3NlZExheW91dCA9IGFMYXlvdXRzWzBdOyAvL3RoaXMuZ2V0SGVscGVyKCkuZ2V0TmV4dFVJU3RhdGUoYVRhcmdldHMubGVuZ3RoIC0gMSkubGF5b3V0O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPbmx5IG9uZSB0YXJnZXRcblx0XHRcdGNvbnN0IHNUYXJnZXRBZ2dyZWdhdGlvbiA9IHRoaXMuZ2V0VGFyZ2V0QWdncmVnYXRpb24oKVthVGFyZ2V0c1swXV0uYWdncmVnYXRpb24gfHwgdGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0Q29udHJvbEFnZ3JlZ2F0aW9uO1xuXHRcdFx0c3dpdGNoIChzVGFyZ2V0QWdncmVnYXRpb24pIHtcblx0XHRcdFx0Y2FzZSBcImJlZ2luQ29sdW1uUGFnZXNcIjpcblx0XHRcdFx0XHRzUHJvcG9zZWRMYXlvdXQgPSBcIk9uZUNvbHVtblwiO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwibWlkQ29sdW1uUGFnZXNcIjpcblx0XHRcdFx0XHRzUHJvcG9zZWRMYXlvdXQgPSBcIk1pZENvbHVtbkZ1bGxTY3JlZW5cIjtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImVuZENvbHVtblBhZ2VzXCI6XG5cdFx0XHRcdFx0c1Byb3Bvc2VkTGF5b3V0ID0gXCJFbmRDb2x1bW5GdWxsU2NyZWVuXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdC8vIG5vIGRlZmF1bHRcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc1Byb3Bvc2VkTGF5b3V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmlzaWJsZSB2aWV3cyBpbiB0aGUgRkNMIGNvbXBvbmVudC5cblx0ICogc0xheW91dCBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgdmVyeSBzcGVjaWZpYyBhcyBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgbGF0ZXN0IG5hdmlnYXRlZCByb3dcblx0ICpcblx0ICogQHBhcmFtIHsqfSBzTGF5b3V0IExheW91dCB0aGF0IHdhcyBhcHBsaWVkIGp1c3QgYmVmb3JlIHRoZSBjdXJyZW50IG5hdmlnYXRpb25cblx0ICogQHJldHVybnMge0FycmF5fSByZXR1cm4gdmlld3Ncblx0ICovXG5cblx0X2dldEFsbFZpc2libGVWaWV3cyhzTGF5b3V0PzogYW55KSB7XG5cdFx0Y29uc3QgYVZpZXdzID0gW107XG5cdFx0c0xheW91dCA9IHNMYXlvdXQgPyBzTGF5b3V0IDogdGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0TGF5b3V0KCk7XG5cdFx0c3dpdGNoIChzTGF5b3V0KSB7XG5cdFx0XHRjYXNlIExheW91dFR5cGUuRW5kQ29sdW1uRnVsbFNjcmVlbjpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEVuZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIExheW91dFR5cGUuTWlkQ29sdW1uRnVsbFNjcmVlbjpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIExheW91dFR5cGUuT25lQ29sdW1uOlxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0YVZpZXdzLnB1c2goX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zRW5kRXhwYW5kZWQ6XG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWQ6XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50RW5kQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0YVZpZXdzLnB1c2goX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNNaWRFeHBhbmRlZDpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNNaWRFeHBhbmRlZEVuZEhpZGRlbjpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNCZWdpbkV4cGFuZGVkRW5kSGlkZGVuOlxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0YVZpZXdzLnB1c2goX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0YVZpZXdzLnB1c2goX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0TG9nLmVycm9yKGBVbmhhbmRsZWQgc3dpdGNoIGNhc2UgZm9yICR7dGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0TGF5b3V0KCl9YCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFWaWV3cztcblx0fVxuXHRfZ2V0QWxsVmlld3Moc0xheW91dD86IGFueSkge1xuXHRcdGNvbnN0IGFWaWV3cyA9IFtdO1xuXHRcdHNMYXlvdXQgPSBzTGF5b3V0ID8gc0xheW91dCA6IHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldExheW91dCgpO1xuXHRcdHN3aXRjaCAoc0xheW91dCkge1xuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLk9uZUNvbHVtbjpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNFbmRFeHBhbmRlZDpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNNaWRFeHBhbmRlZDpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNNaWRFeHBhbmRlZEVuZEhpZGRlbjpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNCZWdpbkV4cGFuZGVkRW5kSGlkZGVuOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLkVuZENvbHVtbkZ1bGxTY3JlZW46XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50RW5kQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0YVZpZXdzLnB1c2goX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNNaWRFeHBhbmRlZDpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5NaWRDb2x1bW5GdWxsU2NyZWVuOlxuXHRcdFx0XHQvLyBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBtaWQgY29sdW1uIGZ1bGxzY3JlZW4gY29tZXMgZnJvbSBhIDIgb3IgYSAzIGNvbHVtbiBsYXlvdXRcblx0XHRcdFx0Y29uc3Qgc0xheW91dFdoZW5FeGl0RnVsbFNjcmVlbiA9ICh0aGlzLmdldEhlbHBlcigpLmdldEN1cnJlbnRVSVN0YXRlKCkgYXMgYW55KS5hY3Rpb25CdXR0b25zSW5mby5taWRDb2x1bW4uZXhpdEZ1bGxTY3JlZW47XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzTGF5b3V0V2hlbkV4aXRGdWxsU2NyZWVuLmluZGV4T2YoXCJUaHJlZUNvbHVtblwiKSA+PSAwKSB7XG5cdFx0XHRcdFx0Ly8gV2UgY29tZSBmcm9tIGEgMyBjb2x1bW4gbGF5b3V0XG5cdFx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50RW5kQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRMb2cuZXJyb3IoYFVuaGFuZGxlZCBzd2l0Y2ggY2FzZSBmb3IgJHt0aGlzLmdldEZjbENvbnRyb2woKS5nZXRMYXlvdXQoKX1gKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFWaWV3cztcblx0fVxuXG5cdG9uQ29udGFpbmVyUmVhZHkoKSB7XG5cdFx0Ly8gUmVzdG9yZSB2aWV3cyBpZiBuZWNjZXNzYXJ5LlxuXHRcdGNvbnN0IGFWaWV3cyA9IHRoaXMuX2dldEFsbFZpc2libGVWaWV3cygpO1xuXHRcdGNvbnN0IGFSZXN0b3JlUHJvbWlzZXM6IGFueVtdID0gYVZpZXdzLnJlZHVjZShmdW5jdGlvbiAoYVByb21pc2VzOiBhbnksIG9UYXJnZXRWaWV3OiBhbnkpIHtcblx0XHRcdGFQcm9taXNlcy5wdXNoKEtlZXBBbGl2ZUhlbHBlci5yZXN0b3JlVmlldyhvVGFyZ2V0VmlldykpO1xuXHRcdFx0cmV0dXJuIGFQcm9taXNlcztcblx0XHR9LCBbXSk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXN0b3JlUHJvbWlzZXMpO1xuXHR9XG5cblx0Z2V0UmlnaHRtb3N0Q29udGV4dCgpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0UmlnaHRtb3N0VmlldygpO1xuXHRcdHJldHVybiBvVmlldyAmJiBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHR9XG5cblx0Z2V0UmlnaHRtb3N0VmlldygpIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0QWxsVmlld3MoKS5wb3AoKTtcblx0fVxuXG5cdGlzQ29udGV4dFVzZWRJblBhZ2VzKG9Db250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0aWYgKCF0aGlzLmdldEZjbENvbnRyb2woKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBhQWxsVmlzaWJsZVZpZXdzID0gdGhpcy5fZ2V0QWxsVmlld3MoKTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUFsbFZpc2libGVWaWV3cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgb1ZpZXcgPSBhQWxsVmlzaWJsZVZpZXdzW2ldO1xuXHRcdFx0aWYgKCFvVmlldykge1xuXHRcdFx0XHQvLyBBIHZpZXcgaGFzIGJlZW4gZGVzdHJveWVkIC0tPiBhcHAgaXMgY3VycmVudGx5IGJlaW5nIGRlc3Ryb3llZFxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAob1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSA9PT0gb0NvbnRleHQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZjbENvbnRyb2xsZXI7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBaUJBLElBQU1BLFVBQVUsR0FBR0MsUUFBUSxDQUFDRCxVQUE1QjtFQUVBLElBQU1FLFNBQVMsR0FBRztJQUNqQkMsSUFBSSxFQUFFO01BQ0xDLEtBQUssRUFBRSxDQUFDLGFBQUQsRUFBZ0IsV0FBaEIsRUFBNkIsV0FBN0IsQ0FERjtNQUVMQyxhQUFhLEVBQUU7UUFDZEMsTUFBTSxFQUFFLFlBRE07UUFFZEMsTUFBTSxFQUFFO01BRk0sQ0FGVjtNQU1MQyxNQUFNLEVBQUU7UUFDUEYsTUFBTSxFQUFFLEtBREQ7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