@schneideress/dashboardframework 0.0.278 → 13.0.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 (134) hide show
  1. package/README.md +8 -8
  2. package/esm2020/lib/custom.notifier.options.mjs +41 -0
  3. package/esm2020/lib/ra-dashboard-area/ra.dashboard.area.mjs +445 -0
  4. package/esm2020/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +43 -0
  5. package/esm2020/lib/ra-widget-container/ra.widget.container.component.mjs +767 -0
  6. package/esm2020/lib/ra.base.dashboard.filter.mjs +44 -0
  7. package/esm2020/lib/ra.base.dashboard.template.mjs +36 -0
  8. package/esm2020/lib/ra.dashbard.event.bus.mjs +46 -0
  9. package/esm2020/lib/ra.dashboard.module.mjs +64 -0
  10. package/esm2020/lib/ra.dashboard.responsive.service.mjs +136 -0
  11. package/esm2020/lib/ra.dashboard.service.mjs +77 -0
  12. package/esm2020/lib/ra.event.enum.mjs +60 -0
  13. package/esm2020/lib/ra.gridster.config.mjs +56 -0
  14. package/esm2020/public-api.mjs +15 -0
  15. package/esm2020/schneideress-dashboardframework.mjs +5 -0
  16. package/fesm2015/schneideress-dashboardframework.mjs +1800 -0
  17. package/fesm2015/schneideress-dashboardframework.mjs.map +1 -0
  18. package/fesm2020/schneideress-dashboardframework.mjs +1790 -0
  19. package/fesm2020/schneideress-dashboardframework.mjs.map +1 -0
  20. package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +5 -2
  21. package/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.d.ts +3 -0
  22. package/lib/ra-widget-container/ra.widget.container.component.d.ts +6 -4
  23. package/lib/ra.base.dashboard.filter.d.ts +3 -1
  24. package/lib/ra.base.dashboard.template.d.ts +3 -0
  25. package/lib/ra.dashbard.event.bus.d.ts +3 -0
  26. package/lib/ra.dashboard.module.d.ts +15 -0
  27. package/lib/ra.dashboard.responsive.service.d.ts +8 -5
  28. package/lib/ra.dashboard.service.d.ts +4 -2
  29. package/lib/ra.gridster.config.d.ts +1 -1
  30. package/package.json +26 -20
  31. package/schneideress-dashboardframework.d.ts +1 -6
  32. package/bundles/schneideress-dashboardframework.umd.js +0 -5091
  33. package/bundles/schneideress-dashboardframework.umd.js.map +0 -1
  34. package/bundles/schneideress-dashboardframework.umd.min.js +0 -16
  35. package/bundles/schneideress-dashboardframework.umd.min.js.map +0 -1
  36. package/esm2015/gridster/index.js +0 -14
  37. package/esm2015/gridster/lib/gridster.component.js +0 -471
  38. package/esm2015/gridster/lib/gridster.interface.js +0 -3
  39. package/esm2015/gridster/lib/gridster.module.js +0 -25
  40. package/esm2015/gridster/lib/gridsterCompact.service.js +0 -162
  41. package/esm2015/gridster/lib/gridsterConfig.constant.js +0 -104
  42. package/esm2015/gridster/lib/gridsterConfig.interface.js +0 -27
  43. package/esm2015/gridster/lib/gridsterConfigS.interface.js +0 -1
  44. package/esm2015/gridster/lib/gridsterDraggable.service.js +0 -351
  45. package/esm2015/gridster/lib/gridsterEmptyCell.service.js +0 -216
  46. package/esm2015/gridster/lib/gridsterItem.component.js +0 -141
  47. package/esm2015/gridster/lib/gridsterItem.interface.js +0 -1
  48. package/esm2015/gridster/lib/gridsterItemComponent.interface.js +0 -3
  49. package/esm2015/gridster/lib/gridsterPreview.component.js +0 -45
  50. package/esm2015/gridster/lib/gridsterPush.service.js +0 -296
  51. package/esm2015/gridster/lib/gridsterPushResize.service.js +0 -225
  52. package/esm2015/gridster/lib/gridsterRenderer.service.js +0 -208
  53. package/esm2015/gridster/lib/gridsterResizable.service.js +0 -368
  54. package/esm2015/gridster/lib/gridsterResizeEventType.interface.js +0 -1
  55. package/esm2015/gridster/lib/gridsterScroll.service.js +0 -119
  56. package/esm2015/gridster/lib/gridsterSwap.service.js +0 -85
  57. package/esm2015/gridster/lib/gridsterUtils.service.js +0 -89
  58. package/esm2015/lib/custom.notifier.options.js +0 -41
  59. package/esm2015/lib/ra-dashboard-area/ra.dashboard.area.js +0 -488
  60. package/esm2015/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.js +0 -48
  61. package/esm2015/lib/ra-widget-container/ra.widget.container.component.js +0 -829
  62. package/esm2015/lib/ra.base.dashboard.filter.js +0 -47
  63. package/esm2015/lib/ra.base.dashboard.template.js +0 -32
  64. package/esm2015/lib/ra.dashbard.event.bus.js +0 -46
  65. package/esm2015/lib/ra.dashboard.module.js +0 -44
  66. package/esm2015/lib/ra.dashboard.responsive.service.js +0 -140
  67. package/esm2015/lib/ra.dashboard.service.js +0 -82
  68. package/esm2015/lib/ra.event.enum.js +0 -60
  69. package/esm2015/lib/ra.gridster.config.js +0 -56
  70. package/esm2015/public-api.js +0 -13
  71. package/esm2015/schneideress-dashboardframework.js +0 -11
  72. package/esm5/gridster/index.js +0 -14
  73. package/esm5/gridster/lib/gridster.component.js +0 -474
  74. package/esm5/gridster/lib/gridster.interface.js +0 -7
  75. package/esm5/gridster/lib/gridster.module.js +0 -28
  76. package/esm5/gridster/lib/gridsterCompact.service.js +0 -163
  77. package/esm5/gridster/lib/gridsterConfig.constant.js +0 -104
  78. package/esm5/gridster/lib/gridsterConfig.interface.js +0 -27
  79. package/esm5/gridster/lib/gridsterConfigS.interface.js +0 -1
  80. package/esm5/gridster/lib/gridsterDraggable.service.js +0 -356
  81. package/esm5/gridster/lib/gridsterEmptyCell.service.js +0 -220
  82. package/esm5/gridster/lib/gridsterItem.component.js +0 -142
  83. package/esm5/gridster/lib/gridsterItem.interface.js +0 -1
  84. package/esm5/gridster/lib/gridsterItemComponent.interface.js +0 -7
  85. package/esm5/gridster/lib/gridsterPreview.component.js +0 -46
  86. package/esm5/gridster/lib/gridsterPush.service.js +0 -297
  87. package/esm5/gridster/lib/gridsterPushResize.service.js +0 -226
  88. package/esm5/gridster/lib/gridsterRenderer.service.js +0 -209
  89. package/esm5/gridster/lib/gridsterResizable.service.js +0 -373
  90. package/esm5/gridster/lib/gridsterResizeEventType.interface.js +0 -1
  91. package/esm5/gridster/lib/gridsterScroll.service.js +0 -119
  92. package/esm5/gridster/lib/gridsterSwap.service.js +0 -86
  93. package/esm5/gridster/lib/gridsterUtils.service.js +0 -93
  94. package/esm5/lib/custom.notifier.options.js +0 -41
  95. package/esm5/lib/ra-dashboard-area/ra.dashboard.area.js +0 -499
  96. package/esm5/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.js +0 -50
  97. package/esm5/lib/ra-widget-container/ra.widget.container.component.js +0 -891
  98. package/esm5/lib/ra.base.dashboard.filter.js +0 -50
  99. package/esm5/lib/ra.base.dashboard.template.js +0 -35
  100. package/esm5/lib/ra.dashbard.event.bus.js +0 -47
  101. package/esm5/lib/ra.dashboard.module.js +0 -47
  102. package/esm5/lib/ra.dashboard.responsive.service.js +0 -151
  103. package/esm5/lib/ra.dashboard.service.js +0 -85
  104. package/esm5/lib/ra.event.enum.js +0 -60
  105. package/esm5/lib/ra.gridster.config.js +0 -56
  106. package/esm5/public-api.js +0 -13
  107. package/esm5/schneideress-dashboardframework.js +0 -11
  108. package/fesm2015/schneideress-dashboardframework.js +0 -4737
  109. package/fesm2015/schneideress-dashboardframework.js.map +0 -1
  110. package/fesm5/schneideress-dashboardframework.js +0 -4871
  111. package/fesm5/schneideress-dashboardframework.js.map +0 -1
  112. package/gridster/index.d.ts +0 -11
  113. package/gridster/lib/gridster.component.d.ts +0 -67
  114. package/gridster/lib/gridster.interface.d.ts +0 -46
  115. package/gridster/lib/gridster.module.d.ts +0 -2
  116. package/gridster/lib/gridsterCompact.service.d.ts +0 -15
  117. package/gridster/lib/gridsterConfig.constant.d.ts +0 -2
  118. package/gridster/lib/gridsterConfig.interface.d.ts +0 -133
  119. package/gridster/lib/gridsterConfigS.interface.d.ts +0 -93
  120. package/gridster/lib/gridsterDraggable.service.d.ts +0 -59
  121. package/gridster/lib/gridsterEmptyCell.service.d.ts +0 -29
  122. package/gridster/lib/gridsterItem.component.d.ts +0 -32
  123. package/gridster/lib/gridsterItem.interface.d.ts +0 -21
  124. package/gridster/lib/gridsterItemComponent.interface.d.ts +0 -25
  125. package/gridster/lib/gridsterPreview.component.d.ts +0 -10
  126. package/gridster/lib/gridsterPush.service.d.ts +0 -33
  127. package/gridster/lib/gridsterPushResize.service.d.ts +0 -26
  128. package/gridster/lib/gridsterRenderer.service.d.ts +0 -38
  129. package/gridster/lib/gridsterResizable.service.d.ts +0 -67
  130. package/gridster/lib/gridsterResizeEventType.interface.d.ts +0 -6
  131. package/gridster/lib/gridsterScroll.service.d.ts +0 -4
  132. package/gridster/lib/gridsterSwap.service.d.ts +0 -13
  133. package/gridster/lib/gridsterUtils.service.d.ts +0 -16
  134. package/schneideress-dashboardframework.metadata.json +0 -1
@@ -1,499 +0,0 @@
1
- import * as tslib_1 from "tslib";
2
- import { Input, OnInit, Component, OnChanges, SimpleChanges, NgZone, OnDestroy, ViewChild, ElementRef, HostListener, Output, EventEmitter } from '@angular/core';
3
- import { RaDashboardService } from '../ra.dashboard.service';
4
- import { RADashboardEventBus } from '../ra.dashbard.event.bus';
5
- import { RAEvent } from '../ra.event.enum';
6
- import { NgxUiLoaderService } from 'ngx-ui-loader';
7
- import { NotifierService } from 'angular-notifier';
8
- import { RATranslateService, RAPermissionService } from '@schneideress/ra-common';
9
- import { RADashboardResponsiveService } from '../ra.dashboard.responsive.service';
10
- var RADashboardArea = /** @class */ (function () {
11
- function RADashboardArea(dashboardService, ngZone, ngxService, translateService, notifier, responsiveService, permissionService) {
12
- this.dashboardService = dashboardService;
13
- this.ngZone = ngZone;
14
- this.ngxService = ngxService;
15
- this.translateService = translateService;
16
- this.notifier = notifier;
17
- this.responsiveService = responsiveService;
18
- this.permissionService = permissionService;
19
- this.widgetList = Array();
20
- this.gridheight = 300;
21
- this.gridcellHeight = 0;
22
- this.userWidgets = [];
23
- this.PAMWidgets = [];
24
- this.isWidgetLoaded = false;
25
- this.domResized = false;
26
- this.showEmptyDashboard = false;
27
- this.isWidgetMgmnt = false;
28
- this.widgetHeight = 2;
29
- this.widgetWidth = 4;
30
- this.hideDashboardBanner = new EventEmitter();
31
- }
32
- RADashboardArea.prototype.ngOnInit = function () {
33
- var _this = this;
34
- this.isWidgetMgmnt = this.permissionService.hasPermission('ra.widgetmanagement');
35
- this.initiateGridsterConfig();
36
- this.lastViewType = this.responsiveService.IsDesktopView ? 'desktop' : 'mobile';
37
- this.responsiveService.resized.subscribe(function (isDesktop) {
38
- if (_this.lastViewType != (isDesktop ? 'desktop' : 'mobile') || !isDesktop) {
39
- _this.lastViewType = (isDesktop ? 'desktop' : 'mobile');
40
- _this.widgetList = [];
41
- setTimeout(function () {
42
- _this.initiateGridsterConfig();
43
- _this.options.api.optionsChanged();
44
- if (_this.userWidgets) {
45
- _this.widgetList = _this.mapObjectListToGridsterItemList(_this.userWidgets);
46
- setTimeout(function () {
47
- _this.setAreaHeight();
48
- });
49
- }
50
- else {
51
- _this.loadWidgets(_this.userDashboardId, _this.areaKey);
52
- }
53
- _this.domResized = !_this.domResized;
54
- });
55
- }
56
- else {
57
- setTimeout(function () {
58
- _this.gridcellHeight = _this.options.api.getCurrentRowHeight();
59
- _this.domResized = !_this.domResized;
60
- _this.setAreaHeight();
61
- }, 100);
62
- }
63
- });
64
- };
65
- RADashboardArea.prototype.ngOnChanges = function (changes) {
66
- this.isWidgetMgmnt = this.permissionService.hasPermission('ra.widgetmanagement');
67
- if (this.raDashboardEventBus && this.appConfig && !this.isWidgetLoaded) {
68
- this.isWidgetLoaded = true;
69
- this.loadWidgets(this.userDashboardId, this.areaKey);
70
- }
71
- if (changes.raDashboardEventBus && changes.raDashboardEventBus.currentValue != changes.raDashboardEventBus.previousValue) {
72
- this.inititateEventBusSubscritions();
73
- }
74
- };
75
- /**To set GridsterConfig */
76
- RADashboardArea.prototype.initiateGridsterConfig = function () {
77
- var _this = this;
78
- /**To override default configuration values to the gridster control */
79
- this.options = this.responsiveService.getGridsterConfig(this.isWidgetMgmnt);
80
- this.options.initCallback = function (gridster) {
81
- if (_this.options.api) {
82
- _this.gridcellHeight = _this.options.api.getCurrentRowHeight();
83
- }
84
- };
85
- this.options.itemChangeCallback = function (item) {
86
- if (_this.responsiveService.IsDesktopView) {
87
- if (item.widgetInfo && item.widgetInfo.widgetInstanceId) {
88
- _this.updateWidgetPosition(item.widgetInfo.widgetInstanceId);
89
- }
90
- }
91
- _this.setAreaHeight();
92
- };
93
- };
94
- /** To initiate eventbus subsctiptions */
95
- RADashboardArea.prototype.inititateEventBusSubscritions = function () {
96
- var _this = this;
97
- this.widgetDeleteEvent = this.raDashboardEventBus.subscribe(RAEvent.WidgetDelete).subscribe(function (instanceId) {
98
- _this.ngZone.run(function () {
99
- _this.deleteWidget(instanceId, true);
100
- });
101
- });
102
- this.widgetAddEvent = this.raDashboardEventBus.subscribe(RAEvent.AddWidget).subscribe(function (widgetInfo) {
103
- _this.ngZone.run(function () {
104
- _this.copyWidget(widgetInfo);
105
- });
106
- });
107
- this.conifgAddClick = this.raDashboardEventBus.subscribe(RAEvent.ConfigAddClick).subscribe(function (e) {
108
- _this.ngZone.run(function () {
109
- _this.addWidget(e);
110
- });
111
- });
112
- this.rearrangeWidgetClick = this.raDashboardEventBus.subscribe(RAEvent.RearrangeClicked).subscribe(function (e) {
113
- _this.ngZone.run(function () {
114
- _this.rearrangeWidgets();
115
- });
116
- });
117
- this.widgetLibraryDoneClick = this.raDashboardEventBus.subscribe(RAEvent.widgetLibraryDoneClick).subscribe(function (widgetList) {
118
- _this.ngZone.run(function () {
119
- if (widgetList) {
120
- _this.addWidgetListToGridster(widgetList, 0);
121
- }
122
- });
123
- });
124
- };
125
- /**
126
- * temp fix- recursive method to iterate over the list of items
127
- * and add them to gridster in the given order
128
- * @param widgetList -list of widgets
129
- * @param index -index of the current value to be added
130
- */
131
- RADashboardArea.prototype.addWidgetListToGridster = function (widgetList, index) {
132
- var areaContext = this;
133
- var indexVal = index + 1;
134
- if (index > widgetList.length - 1)
135
- return;
136
- else {
137
- if (index == 0) {
138
- areaContext.addWidget(widgetList[index]);
139
- areaContext.addWidgetListToGridster(widgetList, indexVal);
140
- }
141
- else {
142
- setTimeout(function () {
143
- areaContext.addWidget(widgetList[index]);
144
- areaContext.addWidgetListToGridster(widgetList, indexVal);
145
- }, 1000);
146
- }
147
- }
148
- };
149
- RADashboardArea.prototype.ngOnDestroy = function () {
150
- if (this.conifgAddClick)
151
- this.conifgAddClick.unsubscribe();
152
- if (this.widgetAddEvent)
153
- this.widgetAddEvent.unsubscribe();
154
- if (this.widgetDeleteEvent)
155
- this.widgetDeleteEvent.unsubscribe();
156
- if (this.widgetLibraryDoneClick)
157
- this.widgetLibraryDoneClick.unsubscribe();
158
- if (this.rearrangeWidgetClick)
159
- this.rearrangeWidgetClick.unsubscribe();
160
- };
161
- /**To update position/dimention of all widgets in the area */
162
- RADashboardArea.prototype.updateWidgets = function () {
163
- this.dashboardService.updateWidgets(this.formatWidgetDataForPositionDetails(this.mapGridsterListToObject(this.widgetList)), this.appConfig).subscribe(function (widgets) {
164
- });
165
- return true;
166
- };
167
- /**To update widget dimensions */
168
- RADashboardArea.prototype.updateWidgetPosition = function (widgetInstanceId) {
169
- var widgetFilteredList = [];
170
- var widget = this.widgetList.filter(function (filtered) { return filtered.widgetInfo && filtered.widgetInfo.widgetInstanceId == widgetInstanceId; });
171
- if (widget && widget.length > 0) {
172
- widgetFilteredList.push(widget[0]);
173
- var widgetList = this.mapGridsterListToObject(widgetFilteredList);
174
- this.dashboardService.updateWidgets(this.formatWidgetDataForPositionDetails(widgetList), this.appConfig).subscribe(function (widgets) {
175
- });
176
- }
177
- return true;
178
- };
179
- /**To restrict request payload to be of min size (position & size details) */
180
- RADashboardArea.prototype.formatWidgetDataForPositionDetails = function (widgetItemList) {
181
- var itemList = [];
182
- widgetItemList.forEach(function (widgetItem) {
183
- var item = {};
184
- item.widgetInstanceId = widgetItem.widgetInstanceId;
185
- item.position_x = widgetItem.position_x;
186
- item.position_y = widgetItem.position_y;
187
- item.width = widgetItem.width;
188
- item.height = widgetItem.height;
189
- itemList.push(item);
190
- });
191
- return itemList;
192
- };
193
- /** To retrieve widgets based on userDashboardid and area name */
194
- RADashboardArea.prototype.loadWidgets = function (userDashboarId, areaKey) {
195
- var _this = this;
196
- var isIndicatorDashboard = localStorage.getItem('IsIndicatorDashboard') == 'true' ? true : false;
197
- var widgetInfo = {
198
- dashboardId: userDashboarId.toString(),
199
- dashboardAreaKey: areaKey,
200
- isIndicatorDashboard: isIndicatorDashboard
201
- };
202
- this.widgetList = [];
203
- this.dashboardService.getWidgetsByDashboardArea(widgetInfo, this.appConfig).subscribe(function (widgets) {
204
- _this.userWidgets = widgets;
205
- _this.PAMWidgets = [];
206
- widgets.forEach(function (element) {
207
- var settings = undefined;
208
- if (element.widgetSettings) {
209
- settings = JSON.parse(element.widgetSettings);
210
- if (settings && settings.isPAMWidget)
211
- _this.PAMWidgets.push(element.widgetInstanceId);
212
- }
213
- });
214
- _this.checkPAMWidgets();
215
- if (widgets && widgets.length > 0) {
216
- _this.dashboardService.clientId = widgets[0].clientId;
217
- _this.widgetList = _this.mapObjectListToGridsterItemList(widgets);
218
- _this.setAreaHeight();
219
- _this.raDashboardEventBus.publish(RAEvent.HideDashboardBanner, false);
220
- }
221
- else {
222
- _this.showEmptyDashboard = true;
223
- _this.raDashboardEventBus.publish(RAEvent.HideDashboardBanner, _this.showEmptyDashboard);
224
- }
225
- });
226
- };
227
- /** To set Area(Gridster) height dynamically as widgets are added/removed */
228
- RADashboardArea.prototype.setAreaHeight = function () {
229
- var _this = this;
230
- setTimeout(function () {
231
- var isMobile = false;
232
- if (_this.options.mobileBreakpoint > _this.gridWrapper.nativeElement.clientWidth) {
233
- isMobile = true;
234
- }
235
- var areaScrollHeight = 0;
236
- var areaHeight = 0;
237
- var curRowHeight = 0;
238
- if (_this.options.api) {
239
- curRowHeight = _this.options.api.getCurrentRowHeight();
240
- }
241
- _this.showEmptyDashboard = _this.userWidgets.length > 0 ? false : true;
242
- _this.widgetList.forEach(function (t) {
243
- var currentHeight = t.y + t.rows;
244
- if (currentHeight > areaScrollHeight) {
245
- areaScrollHeight = currentHeight;
246
- }
247
- if (curRowHeight == 0) {
248
- currentHeight = _this.widgetList[0].curRowHeight;
249
- }
250
- t.widgetInfo.rowHeight = curRowHeight;
251
- });
252
- _this.gridcellHeight = curRowHeight;
253
- if (_this.options.api) {
254
- areaHeight = areaScrollHeight * _this.options.api.getCurrentRowHeight() + 100;
255
- }
256
- var areaScrollHeightMob = 0;
257
- if (isMobile) {
258
- areaScrollHeightMob = _this.widgetList.length * 300 + 200;
259
- areaHeight = areaScrollHeightMob;
260
- }
261
- if (areaHeight < 600) {
262
- areaHeight = 600;
263
- }
264
- _this.gridheight = areaHeight;
265
- });
266
- };
267
- /** To remove a widget instance from dashboard and to save info in database */
268
- RADashboardArea.prototype.deleteWidget = function (widgetInstanceId, isalertDisabled) {
269
- if (isalertDisabled === void 0) { isalertDisabled = false; }
270
- var gridsterItem = this.widgetList.filter(function (item) {
271
- return item.widgetInfo.widgetInstanceId === widgetInstanceId;
272
- });
273
- if (gridsterItem.length > 0) {
274
- var widget = this.userWidgets.filter(function (item) {
275
- return item.widgetInstanceId === widgetInstanceId;
276
- });
277
- if (widget.length > 0) {
278
- this.userWidgets.splice(this.userWidgets.indexOf(widget[0]), 1);
279
- }
280
- if (this.PAMWidgets.length > 0) {
281
- var indx = this.PAMWidgets.indexOf(widgetInstanceId);
282
- if (indx > -1)
283
- this.PAMWidgets.splice(indx, 1);
284
- this.checkPAMWidgets();
285
- }
286
- this.widgetList.splice(this.widgetList.indexOf(gridsterItem[0]), 1);
287
- this.setAreaHeight();
288
- if (!isalertDisabled) {
289
- this.notifier.notify('success', " " + this.translateService.translate('Common.Widgettext') + " " + gridsterItem[0].widgetInfo.widgetTitle + " " + this.translateService.translate('Common.deletedSuccesfully') + " ");
290
- }
291
- }
292
- this.showEmptyDashboard = this.userWidgets.length > 0 ? false : true;
293
- if (this.showEmptyDashboard == true) {
294
- this.raDashboardEventBus.publish(RAEvent.HideDashboardBanner, this.showEmptyDashboard);
295
- }
296
- };
297
- /**To rearrange widgets position in the dashboard, compactLeft&Up,compactLeft,compactUp,etc*/
298
- RADashboardArea.prototype.rearrangeWidgets = function () {
299
- var _this = this;
300
- for (var i = 0; i < this.userWidgets.length; i++) {
301
- this.userWidgets[i].position_x = 0;
302
- this.userWidgets[i].position_y = 0;
303
- }
304
- this.widgetList = this.mapObjectListToGridsterItemList(this.userWidgets);
305
- if (this.widgetList.length > 0)
306
- this.updateWidgetPosition(this.widgetList[0].widgetInfo.widgetInstanceId);
307
- setTimeout(function () {
308
- _this.setAreaHeight();
309
- });
310
- };
311
- /**To add widget instance to the database with the next available position and to make changes in
312
- * dashboard area.
313
- */
314
- RADashboardArea.prototype.addWidget = function (data) {
315
- var _this = this;
316
- data.height = this.widgetHeight;
317
- data.width = this.widgetWidth;
318
- this.raDashboardEventBus.publish(RAEvent.HideDashboardBanner, false);
319
- if (data.widgetSettings) {
320
- if (typeof data.widgetSettings === 'string')
321
- data.widgetSettings = JSON.parse(data.widgetSettings);
322
- if (data.widgetSettings.defaultCols) {
323
- data.width = data.widgetSettings.defaultCols;
324
- }
325
- if (data.widgetSettings.defaultRows) {
326
- data.height = data.widgetSettings.defaultRows;
327
- }
328
- data.widgetSettings = null;
329
- }
330
- data = this.setPositions(data);
331
- /** to find the available position in gridster, temp commenting the code-returning higher y value than normal */
332
- data.dashboardAreaKey = this.areaKey;
333
- data.dashboardId = this.userDashboardId;
334
- this.ngxService.start();
335
- this.dashboardService.addWidget(data, this.appConfig).subscribe(function (widget) {
336
- _this.userWidgets.push(widget);
337
- var gridsterItem = _this.responsiveService.getGridsterItem(widget);
338
- _this.widgetList.push(gridsterItem);
339
- _this.setAreaHeight();
340
- if (_this.options.api) {
341
- var curRowHeight = Number(_this.options.api.getCurrentRowHeight());
342
- if (curRowHeight > 0) {
343
- widget.rowHeight = curRowHeight;
344
- _this.gridcellHeight = curRowHeight;
345
- }
346
- }
347
- var widgetInstanceId = 0;
348
- if (widget && widget.widgetInstanceId) {
349
- widgetInstanceId = widget.widgetInstanceId;
350
- /**To save added widget position in db */
351
- if (_this.responsiveService.IsDesktopView) {
352
- setTimeout(function () {
353
- _this.updateWidgetPosition(widgetInstanceId);
354
- });
355
- }
356
- }
357
- if (widget.settings && widget.settings.isPAMWidget) {
358
- _this.PAMWidgets.push(widget.widgetInstanceId);
359
- _this.checkPAMWidgets();
360
- }
361
- _this.raDashboardEventBus.publish(RAEvent.WidgetAdded, widget);
362
- });
363
- };
364
- RADashboardArea.prototype.setPositions = function (data) {
365
- data.position_x = 0;
366
- data.position_y = 0;
367
- if (!this.responsiveService.IsDesktopView) {
368
- if (this.userWidgets.length > 0) {
369
- var widget = this.userWidgets[this.userWidgets.length - 1];
370
- if (widget.position_x + widget.width > (this.responsiveService.maxColsDesktop / 2)) {
371
- data.position_y = widget.position_y + 1;
372
- }
373
- else {
374
- data.position_y = widget.position_y;
375
- data.position_x = this.responsiveService.maxColsDesktop - (widget.position_x + widget.width);
376
- }
377
- }
378
- }
379
- return data;
380
- };
381
- /** To add widget to current widget list ,invoked from copy widget window*/
382
- RADashboardArea.prototype.copyWidget = function (data) {
383
- data = this.setPositions(data);
384
- if (!this.responsiveService.IsDesktopView) {
385
- this.dashboardService.updateWidgets(this.formatWidgetDataForPositionDetails([data]), this.appConfig).subscribe(function (widgets) {
386
- });
387
- }
388
- this.userWidgets.push(data);
389
- var gridsterItem = this.responsiveService.getGridsterItem(data);
390
- this.widgetList.push(gridsterItem);
391
- this.setAreaHeight();
392
- if (data.settings && data.settings.isPAMWidget) {
393
- this.PAMWidgets.push(data.widgetInstanceId);
394
- this.checkPAMWidgets();
395
- }
396
- };
397
- RADashboardArea.prototype.mapObjectListToGridsterItemList = function (widgetList) {
398
- var _this = this;
399
- var widgetArray = Array();
400
- widgetList.forEach(function (widget) {
401
- widgetArray.push(_this.responsiveService.getGridsterItem(widget));
402
- });
403
- return widgetArray;
404
- };
405
- RADashboardArea.prototype.mapGridsterItemToObject = function (widgetItem) {
406
- var widget;
407
- widget = widgetItem.widgetInfo;
408
- widget.height = widgetItem.rows;
409
- widget.width = widgetItem.cols;
410
- widget.position_x = widgetItem.x;
411
- widget.position_y = widgetItem.y;
412
- widget.rowHeight = widgetItem.curRowHeight;
413
- return widget;
414
- };
415
- RADashboardArea.prototype.mapGridsterListToObject = function (widgetItemList) {
416
- var _this = this;
417
- var widgetListArray = Array();
418
- widgetItemList.forEach(function (widget) {
419
- widgetListArray.push(_this.mapGridsterItemToObject(widget));
420
- });
421
- return widgetListArray;
422
- };
423
- RADashboardArea.prototype.addNewWidget = function () {
424
- this.raDashboardEventBus.publish(RAEvent.AddNewWidgetToDashboard, null);
425
- };
426
- RADashboardArea.prototype.updateAppliedFilters = function (data) {
427
- this.raDashboardEventBus.publish(RAEvent.UpdateAppledFiterForInapplicableFilter, data);
428
- };
429
- RADashboardArea.prototype.checkPAMWidgets = function () {
430
- if (this.PAMWidgets.length > 0) {
431
- this.raDashboardEventBus.publish(RAEvent.ShowInapplicableFilterMessage, true);
432
- }
433
- else {
434
- this.raDashboardEventBus.publish(RAEvent.ShowInapplicableFilterMessage, false);
435
- }
436
- };
437
- RADashboardArea.ctorParameters = function () { return [
438
- { type: RaDashboardService },
439
- { type: NgZone },
440
- { type: NgxUiLoaderService },
441
- { type: RATranslateService },
442
- { type: NotifierService },
443
- { type: RADashboardResponsiveService },
444
- { type: RAPermissionService }
445
- ]; };
446
- tslib_1.__decorate([
447
- Input('user-dashboard-id'),
448
- tslib_1.__metadata("design:type", Number)
449
- ], RADashboardArea.prototype, "userDashboardId", void 0);
450
- tslib_1.__decorate([
451
- Input('area-key'),
452
- tslib_1.__metadata("design:type", String)
453
- ], RADashboardArea.prototype, "areaKey", void 0);
454
- tslib_1.__decorate([
455
- Input('global-filter'),
456
- tslib_1.__metadata("design:type", Object)
457
- ], RADashboardArea.prototype, "globalFilter", void 0);
458
- tslib_1.__decorate([
459
- Input('event-bus'),
460
- tslib_1.__metadata("design:type", RADashboardEventBus)
461
- ], RADashboardArea.prototype, "raDashboardEventBus", void 0);
462
- tslib_1.__decorate([
463
- Input('widget-height'),
464
- tslib_1.__metadata("design:type", Number)
465
- ], RADashboardArea.prototype, "widgetHeight", void 0);
466
- tslib_1.__decorate([
467
- Input('widget-width'),
468
- tslib_1.__metadata("design:type", Number)
469
- ], RADashboardArea.prototype, "widgetWidth", void 0);
470
- tslib_1.__decorate([
471
- Input('app-config'),
472
- tslib_1.__metadata("design:type", Object)
473
- ], RADashboardArea.prototype, "appConfig", void 0);
474
- tslib_1.__decorate([
475
- Output(),
476
- tslib_1.__metadata("design:type", Object)
477
- ], RADashboardArea.prototype, "hideDashboardBanner", void 0);
478
- tslib_1.__decorate([
479
- ViewChild('gridWrapper', { static: false }),
480
- tslib_1.__metadata("design:type", ElementRef)
481
- ], RADashboardArea.prototype, "gridWrapper", void 0);
482
- RADashboardArea = tslib_1.__decorate([
483
- Component({
484
- selector: 'ra-dashboard-area',
485
- template: "<div #gridWrapper class=\"wrap gridster gridster-mobile\" [ngStyle]=\"{'height': userWidgets.length > 0 ? (gridheight + 'px') : 'unset'}\">\r\n <!-- <div #gridWrapper class=\"wrap gridster\"> -->\r\n <gridster [options]=\"options\" style=\"height:100%;\" *ngIf=\"userWidgets.length > 0\">\r\n <gridster-item [item]=\"item\" *ngFor=\"let item of widgetList\">\r\n <ra-widget-container [app-config]=\"appConfig\" [event-bus]=\"raDashboardEventBus\"\r\n (widgetDeleted)=\"deleteWidget($event)\" [data]=\"item\" [global-filter]=\"globalFilter\"\r\n [grid-cell-height]=\"gridcellHeight\" *ngIf=\"gridcellHeight && gridcellHeight > 0\" [widget-width]=\"item.cols\"\r\n [widget-height]=\"item.rows\" [widget-instance-id]=\"item.widgetInstanceId\" [dom-resized]=\"domResized\"\r\n (updateAppliedFilters)=\"updateAppliedFilters($event)\">\r\n </ra-widget-container>\r\n </gridster-item>\r\n </gridster>\r\n\r\n <div class=\"empty-padding kiosk-hide\" *ngIf=\"showEmptyDashboard\">\r\n <div class=\"empty-wrapper\">\r\n <div></div>\r\n <div class=\"m-1 empty-prefix\">\r\n <i class=\"fal fa-edit edit-icon\"></i>\r\n <span class=\"empty-title\">{{'dashboard.emptydashboard'|translate}}</span>\r\n </div>\r\n <div class=\"empty-content light\">\r\n <div>\r\n <div class=\"col-sm-12 empty-msg\">\r\n {{'dashboard.emptydashboardmessage'|translate}} <br />\r\n {{'dashboard.emptydashboardmessage2'|translate}}\r\n </div>\r\n <button *ngIf=\"isWidgetMgmnt\" class=\"btn btnLib btn-sm m-1 dashboard-button light\" (click)=\"addNewWidget()\">\r\n <i class=\"fal fa-plus m-1\"></i>{{'dashboard.addawidgets'|translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <notifier-container></notifier-container>\r\n</div>",
486
- styles: ["gridster{width:inherit;resize:height;display:flex;background-color:#ededed;overflow-y:hidden!important}.dvheader{width:100%;height:35px;background:#000;color:#fff;padding:7px 3px 5px 6px;text-transform:uppercase}gridster-item{box-sizing:border-box;z-index:1;position:absolute;overflow:hidden;transition:.3s;display:none;background:#fff;-webkit-user-select:text;-moz-user-select:text;user-select:text;box-shadow:0 1px 10px rgba(0,0,0,.05)}gridster-item:hover{box-shadow:0 1px 10px rgba(0,0,0,.15)}@media screen and (max-width:685px){.gridster-mobile{height:auto!important;margin-bottom:50px!important}}@media screen and (max-width:350px){.gridster-mobile{min-height:330px!important;margin-bottom:0!important}}.empty-padding{padding:40px 20px 20px;background-color:#ededed;display:flex;justify-content:center;align-content:center}.empty-wrapper{display:flex;background-color:#fff;border-radius:8px;min-height:125px;width:72%}.empty-prefix{color:#32ad3c;font-size:18px;display:flex;align-items:center;padding:10px 30px;min-width:max-content;min-width:-moz-max-content}.empty-content{color:#333;border-left:1px solid #a9afb1;width:100%;display:flex;align-items:center;padding:15px 30px 10px 40px}.empty-msg{padding:0 0 5px;font-size:16px}.dashboard-button{padding:5px 10px 5px 5px!important}.btnLib{background-color:#ededed;color:#333!important}.btn-group-sm>.btn,.btn-sm{padding:5px 20px 5px 5px}.edit-icon{color:#32ad3c;font-size:24px;margin-right:15px}.empty-title{margin-top:10px}@media screen and (max-width:600px){.empty-padding{padding:10px;background-color:#ededed;width:100%;display:block}.empty-wrapper{display:flex;background-color:#fff;border-radius:8px;min-height:125px;width:100%}.empty-prefix{color:#32ad3c;font-size:16px;display:flex;height:40px;padding:6px 10px 8px}.empty-content{color:#333;display:flex;padding:5px 10px 10px;margin-top:44px;margin-left:-185px;border-left:none}.empty-msg{padding:12px 10px 10px 5px;font-size:14px;border-top:1px solid #a9afb1}.edit-icon{color:#32ad3c;font-size:20px;margin-right:6px}.empty-title{margin-top:6px}}"]
487
- }),
488
- tslib_1.__metadata("design:paramtypes", [RaDashboardService,
489
- NgZone,
490
- NgxUiLoaderService,
491
- RATranslateService,
492
- NotifierService,
493
- RADashboardResponsiveService,
494
- RAPermissionService])
495
- ], RADashboardArea);
496
- return RADashboardArea;
497
- }());
498
- export { RADashboardArea };
499
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmEuZGFzaGJvYXJkLmFyZWEuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2NobmVpZGVyZXNzL2Rhc2hib2FyZGZyYW1ld29yay8iLCJzb3VyY2VzIjpbImxpYi9yYS1kYXNoYm9hcmQtYXJlYS9yYS5kYXNoYm9hcmQuYXJlYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2pLLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBUWxGO0lBK0JFLHlCQUFvQixnQkFBb0MsRUFDOUMsTUFBYyxFQUNkLFVBQThCLEVBQzlCLGdCQUFvQyxFQUNwQyxRQUF5QixFQUN6QixpQkFBK0MsRUFDL0MsaUJBQXNDO1FBTjVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUFDOUMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQW9CO1FBQzlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUFDcEMsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUE4QjtRQUMvQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXFCO1FBbkN6QyxlQUFVLEdBQUcsS0FBSyxFQUFnQixDQUFDO1FBRW5DLGVBQVUsR0FBVyxHQUFHLENBQUM7UUFDekIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0IsZ0JBQVcsR0FBVSxFQUFFLENBQUM7UUFDeEIsZUFBVSxHQUFRLEVBQUUsQ0FBQztRQU9wQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNqQyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNwQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQU9kLGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBQzFCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBRXJDLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFZbkQsQ0FBQztJQUVELGtDQUFRLEdBQVI7UUFBQSxpQkE4QkM7UUE3QkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNoRixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFDLFNBQVM7WUFDakQsSUFBSSxLQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUN6RSxLQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2RCxLQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsVUFBVSxDQUFDO29CQUNULEtBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO29CQUM5QixLQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDbEMsSUFBSSxLQUFJLENBQUMsV0FBVyxFQUFFO3dCQUNwQixLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUksQ0FBQywrQkFBK0IsQ0FBQyxLQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQ3pFLFVBQVUsQ0FBQzs0QkFDVCxLQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ3ZCLENBQUMsQ0FBQyxDQUFDO3FCQUNKO3lCQUNJO3dCQUNILEtBQUksQ0FBQyxXQUFXLENBQUMsS0FBSSxDQUFDLGVBQWUsRUFBRSxLQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ3REO29CQUNELEtBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxLQUFJLENBQUMsVUFBVSxDQUFDO2dCQUNyQyxDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLFVBQVUsQ0FBQztvQkFDVCxLQUFJLENBQUMsY0FBYyxHQUFHLEtBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQzdELEtBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxLQUFJLENBQUMsVUFBVSxDQUFDO29CQUNuQyxLQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3ZCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzthQUNUO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQscUNBQVcsR0FBWCxVQUFZLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2pGLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUU7WUFDeEgsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsMkJBQTJCO0lBQ3BCLGdEQUFzQixHQUE3QjtRQUFBLGlCQWdCQztRQWZDLHNFQUFzRTtRQUN0RSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsVUFBQyxRQUFhO1lBQ3hDLElBQUksS0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ3BCLEtBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUM5RDtRQUNILENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEdBQUcsVUFBQyxJQUFrQjtZQUNuRCxJQUFJLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUU7Z0JBQ3hDLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFO29CQUN2RCxLQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUM3RDthQUNGO1lBQ0QsS0FBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsdURBQTZCLEdBQTdCO1FBQUEsaUJBZ0NDO1FBL0JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQyxVQUFVO1lBQ3JHLEtBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUNkLEtBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFDLFVBQVU7WUFDL0YsS0FBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsS0FBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQyxDQUFDO1lBQzNGLEtBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUNkLEtBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFDLENBQUM7WUFDbkcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsS0FBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFDLFVBQVU7WUFDcEgsS0FBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsSUFBSSxVQUFVLEVBQUU7b0JBQ2QsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDN0M7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaURBQXVCLEdBQXZCLFVBQXdCLFVBQWUsRUFBRSxLQUFhO1FBQ3BELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLFFBQVEsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUMvQixPQUFPO2FBQ0o7WUFDSCxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7Z0JBQ2QsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDekMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUMzRDtpQkFDSTtnQkFDSCxVQUFVLENBQUM7b0JBQ1QsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDekMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDNUQsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ1Y7U0FDRjtJQUNILENBQUM7SUFFRCxxQ0FBVyxHQUFYO1FBQ0UsSUFBSSxJQUFJLENBQUMsY0FBYztZQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXBDLElBQUksSUFBSSxDQUFDLGNBQWM7WUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxpQkFBaUI7WUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXZDLElBQUksSUFBSSxDQUFDLHNCQUFzQjtZQUM3QixJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFNUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CO1lBQzNCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU1QyxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELHVDQUFhLEdBQWI7UUFDRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQ3hILElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxPQUFPO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLDhDQUFvQixHQUFwQixVQUFxQixnQkFBd0I7UUFFM0MsSUFBSSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBQSxRQUFRLElBQUksT0FBQSxRQUFRLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLElBQUksZ0JBQWdCLEVBQS9FLENBQStFLENBQUMsQ0FBQztRQUNqSSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLE9BQU87WUFDMUgsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSw0REFBa0MsR0FBbEMsVUFBbUMsY0FBNkI7UUFDOUQsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxVQUFVO1lBQ3pDLElBQUksSUFBSSxHQUFHLEVBQWlCLENBQUM7WUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDeEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxpRUFBaUU7SUFDakUscUNBQVcsR0FBWCxVQUFZLGNBQXNCLEVBQUUsT0FBZTtRQUFuRCxpQkFnQ0M7UUEvQkMsSUFBSSxvQkFBb0IsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNqRyxJQUFJLFVBQVUsR0FBZ0I7WUFDNUIsV0FBVyxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUU7WUFDdEMsZ0JBQWdCLEVBQUUsT0FBTztZQUN6QixvQkFBb0IsRUFBRSxvQkFBb0I7U0FDM0MsQ0FBQTtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLE9BQU87WUFDM0YsS0FBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7WUFDM0IsS0FBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDckIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87Z0JBQ3JCLElBQUksUUFBUSxHQUFRLFNBQVMsQ0FBQTtnQkFDN0IsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFO29CQUMxQixRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQzlDLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXO3dCQUNsQyxLQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDbEQ7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILEtBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUV2QixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDakMsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUNyRCxLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUksQ0FBQywrQkFBK0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDaEUsS0FBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQixLQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN0RTtpQkFDSTtnQkFDSCxLQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO2dCQUMvQixLQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxLQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUN4RjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUdELDRFQUE0RTtJQUM1RSx1Q0FBYSxHQUFiO1FBQUEsaUJBd0NDO1FBdkNDLFVBQVUsQ0FBQztZQUNULElBQUksUUFBUSxHQUFZLEtBQUssQ0FBQztZQUM5QixJQUFJLEtBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsS0FBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFO2dCQUM5RSxRQUFRLEdBQUcsSUFBSSxDQUFDO2FBQ2pCO1lBQ0QsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFDekIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLEtBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO2dCQUNwQixZQUFZLEdBQUcsS0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUN2RDtZQUVELEtBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBRXJFLEtBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUMsQ0FBQztnQkFDeEIsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNqQyxJQUFJLGFBQWEsR0FBRyxnQkFBZ0IsRUFBRTtvQkFDcEMsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO2lCQUNsQztnQkFDRCxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUU7b0JBQ3JCLGFBQWEsR0FBRyxLQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztpQkFDakQ7Z0JBQ0QsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsS0FBSSxDQUFDLGNBQWMsR0FBRyxZQUFZLENBQUM7WUFDbkMsSUFBSSxLQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDcEIsVUFBVSxHQUFHLGdCQUFnQixHQUFHLEtBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLEdBQUcsR0FBRyxDQUFDO2FBQzlFO1lBQ0QsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7WUFDNUIsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osbUJBQW1CLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDekQsVUFBVSxHQUFHLG1CQUFtQixDQUFDO2FBQ2xDO1lBQ0QsSUFBSSxVQUFVLEdBQUcsR0FBRyxFQUFFO2dCQUNwQixVQUFVLEdBQUcsR0FBRyxDQUFDO2FBQ2xCO1lBQ0QsS0FBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDO0lBR0QsOEVBQThFO0lBQzlFLHNDQUFZLEdBQVosVUFBYSxnQkFBcUIsRUFBRSxlQUFnQztRQUFoQyxnQ0FBQSxFQUFBLHVCQUFnQztRQUNsRSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFDLElBQUk7WUFDN0MsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixLQUFLLGdCQUFnQixDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFDLElBQUk7Z0JBQ3hDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixLQUFLLGdCQUFnQixDQUFDO1lBQ3BELENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDakU7WUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDOUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDckQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO29CQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ3hCO1lBR0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZOO1NBQ0Y7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNyRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLEVBQUU7WUFDbkMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDeEY7SUFDSCxDQUFDO0lBRUQsNkZBQTZGO0lBQzdGLDBDQUFnQixHQUFoQjtRQUFBLGlCQVlDO1FBWEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQzVCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVFLFVBQVUsQ0FBQztZQUNULEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7SUFFRDs7T0FFRztJQUNILG1DQUFTLEdBQVQsVUFBVSxJQUFTO1FBQW5CLGlCQW1EQztRQWxEQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLE9BQU8sSUFBSSxDQUFDLGNBQWMsS0FBSyxRQUFRO2dCQUN6QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRXhELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7YUFDOUM7WUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFO2dCQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO2FBQy9DO1lBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQixnSEFBZ0g7UUFDaEgsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLE1BQU07WUFDcEUsS0FBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUIsSUFBSSxZQUFZLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRSxLQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuQyxLQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFckIsSUFBSSxLQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDcEIsSUFBSSxZQUFZLEdBQVcsTUFBTSxDQUFDLEtBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztnQkFDMUUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFO29CQUNwQixNQUFNLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztvQkFDaEMsS0FBSSxDQUFDLGNBQWMsR0FBRyxZQUFZLENBQUM7aUJBQ3BDO2FBQ0Y7WUFDRCxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3JDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDM0MseUNBQXlDO2dCQUN6QyxJQUFJLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUU7b0JBQ3hDLFVBQVUsQ0FBQzt3QkFDVCxLQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDOUMsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtZQUNELElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRTtnQkFDbEQsS0FBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzlDLEtBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4QjtZQUNELEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxzQ0FBWSxHQUFwQixVQUFxQixJQUFTO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFO1lBQ3pDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ2xGLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7aUJBQ3pDO3FCQUNJO29CQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzlGO2FBQ0Y7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxvQ0FBVSxHQUFWLFVBQVcsSUFBUztRQUNsQixJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRTtZQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLE9BQU87WUFDdEgsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRTtZQUM5QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRUQseURBQStCLEdBQS9CLFVBQWdDLFVBQThCO1FBQTlELGlCQU1DO1FBTEMsSUFBSSxXQUFXLEdBQUcsS0FBSyxFQUFnQixDQUFDO1FBQ3hDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBQSxNQUFNO1lBQ3ZCLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELGlEQUF1QixHQUF2QixVQUF3QixVQUF3QjtRQUM5QyxJQUFJLE1BQW1CLENBQUM7UUFDeEIsTUFBTSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDL0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUMvQixNQUFNLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztRQUMzQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsaURBQXVCLEdBQXZCLFVBQXdCLGNBQW1DO1FBQTNELGlCQU1DO1FBTEMsSUFBSSxlQUFlLEdBQUcsS0FBSyxFQUFlLENBQUM7UUFDM0MsY0FBYyxDQUFDLE9BQU8sQ0FBQyxVQUFBLE1BQU07WUFDM0IsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxzQ0FBWSxHQUFuQjtRQUNFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFTSw4Q0FBb0IsR0FBM0IsVUFBNEIsSUFBUztRQUNuQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRU0seUNBQWUsR0FBdEI7UUFDRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMvRTthQUNJO1lBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDaEY7SUFDSCxDQUFDOztnQkFqY3FDLGtCQUFrQjtnQkFDdEMsTUFBTTtnQkFDRixrQkFBa0I7Z0JBQ1osa0JBQWtCO2dCQUMxQixlQUFlO2dCQUNOLDRCQUE0QjtnQkFDNUIsbUJBQW1COztJQWpCcEI7UUFBM0IsS0FBSyxDQUFDLG1CQUFtQixDQUFDOzs0REFBeUI7SUFDakM7UUFBbEIsS0FBSyxDQUFDLFVBQVUsQ0FBQzs7b0RBQWlCO0lBQ1g7UUFBdkIsS0FBSyxDQUFDLGVBQWUsQ0FBQzs7eURBQW1CO0lBQ3RCO1FBQW5CLEtBQUssQ0FBQyxXQUFXLENBQUM7MENBQXNCLG1CQUFtQjtnRUFBQztJQUNyQztRQUF2QixLQUFLLENBQUMsZUFBZSxDQUFDOzt5REFBMEI7SUFDMUI7UUFBdEIsS0FBSyxDQUFDLGNBQWMsQ0FBQzs7d0RBQXlCO0lBQzFCO1FBQXBCLEtBQUssQ0FBQyxZQUFZLENBQUM7O3NEQUF1QjtJQUNqQztRQUFULE1BQU0sRUFBRTs7Z0VBQTBDO0lBRU47UUFBNUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQzswQ0FBYyxVQUFVO3dEQUFDO0lBN0IxRCxlQUFlO1FBTDNCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxtQkFBbUI7WUFDN0IsczJEQUF1Qzs7U0FFeEMsQ0FBQztpREFnQ3NDLGtCQUFrQjtZQUN0QyxNQUFNO1lBQ0Ysa0JBQWtCO1lBQ1osa0JBQWtCO1lBQzFCLGVBQWU7WUFDTiw0QkFBNEI7WUFDNUIsbUJBQW1CO09BckNyQyxlQUFlLENBa2UzQjtJQUFELHNCQUFDO0NBQUEsQUFsZUQsSUFrZUM7U0FsZVksZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElucHV0LCBPbkluaXQsIENvbXBvbmVudCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBOZ1pvbmUsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBHcmlkc3RlckNvbmZpZywgR3JpZHN0ZXJJdGVtIH0gZnJvbSAnLi4vLi4vZ3JpZHN0ZXIvaW5kZXgnO1xyXG5pbXBvcnQgeyBSYURhc2hib2FyZFNlcnZpY2UgfSBmcm9tICcuLi9yYS5kYXNoYm9hcmQuc2VydmljZSc7XHJcbmltcG9ydCB7IFJBRGFzaGJvYXJkRXZlbnRCdXMgfSBmcm9tICcuLi9yYS5kYXNoYmFyZC5ldmVudC5idXMnO1xyXG5pbXBvcnQgeyBSQUV2ZW50IH0gZnJvbSAnLi4vcmEuZXZlbnQuZW51bSc7XHJcbmltcG9ydCB7IElXaWRnZXRJbmZvLCBJQXBwQ29uZmlnIH0gZnJvbSAnQHNjaG5laWRlcmVzcy93aWRnZXRmcmFtZXdvcmsnO1xyXG5pbXBvcnQgeyBOZ3hVaUxvYWRlclNlcnZpY2UgfSBmcm9tICduZ3gtdWktbG9hZGVyJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnYW5ndWxhci1ub3RpZmllcic7XHJcbmltcG9ydCB7IFJBVHJhbnNsYXRlU2VydmljZSwgUkFQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJ0BzY2huZWlkZXJlc3MvcmEtY29tbW9uJztcclxuaW1wb3J0IHsgUkFEYXNoYm9hcmRSZXNwb25zaXZlU2VydmljZSB9IGZyb20gJy4uL3JhLmRhc2hib2FyZC5yZXNwb25zaXZlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdyYS1kYXNoYm9hcmQtYXJlYScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JhLmRhc2hib2FyZC5hcmVhLmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3JhLmRhc2hib2FyZC5hcmVhLmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSQURhc2hib2FyZEFyZWEgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuXHJcbiAgcHVibGljIHdpZGdldExpc3QgPSBBcnJheTxHcmlkc3Rlckl0ZW0+KCk7XHJcbiAgcHVibGljIG9wdGlvbnM6IEdyaWRzdGVyQ29uZmlnO1xyXG4gIHB1YmxpYyBncmlkaGVpZ2h0OiBudW1iZXIgPSAzMDA7XHJcbiAgcHVibGljIGdyaWRjZWxsSGVpZ2h0OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyB1c2VyV2lkZ2V0czogYW55W10gPSBbXTtcclxuICBwdWJsaWMgUEFNV2lkZ2V0czogYW55ID0gW107XHJcblxyXG4gIHByaXZhdGUgY29uaWZnQWRkQ2xpY2s6IGFueTtcclxuICBwcml2YXRlIHJlYXJyYW5nZVdpZGdldENsaWNrOiBhbnk7XHJcbiAgcHJpdmF0ZSB3aWRnZXREZWxldGVFdmVudDogYW55O1xyXG4gIHByaXZhdGUgd2lkZ2V0QWRkRXZlbnQ6IGFueTtcclxuICBwcml2YXRlIHdpZGdldExpYnJhcnlEb25lQ2xpY2s6IGFueTtcclxuICBwcml2YXRlIGlzV2lkZ2V0TG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGRvbVJlc2l6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd0VtcHR5RGFzaGJvYXJkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGlzV2lkZ2V0TWdtbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGFzdFZpZXdUeXBlOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgndXNlci1kYXNoYm9hcmQtaWQnKSB1c2VyRGFzaGJvYXJkSWQ6IG51bWJlcjtcclxuICBASW5wdXQoJ2FyZWEta2V5JykgYXJlYUtleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgnZ2xvYmFsLWZpbHRlcicpIGdsb2JhbEZpbHRlcjogYW55O1xyXG4gIEBJbnB1dCgnZXZlbnQtYnVzJykgcmFEYXNoYm9hcmRFdmVudEJ1czogUkFEYXNoYm9hcmRFdmVudEJ1cztcclxuICBASW5wdXQoJ3dpZGdldC1oZWlnaHQnKSB3aWRnZXRIZWlnaHQ6IG51bWJlciA9IDI7XHJcbiAgQElucHV0KCd3aWRnZXQtd2lkdGgnKSB3aWRnZXRXaWR0aDogbnVtYmVyID0gNDtcclxuICBASW5wdXQoJ2FwcC1jb25maWcnKSBhcHBDb25maWc6IElBcHBDb25maWc7XHJcbiAgQE91dHB1dCgpIGhpZGVEYXNoYm9hcmRCYW5uZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2dyaWRXcmFwcGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGdyaWRXcmFwcGVyOiBFbGVtZW50UmVmO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhc2hib2FyZFNlcnZpY2U6IFJhRGFzaGJvYXJkU2VydmljZSxcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIG5neFNlcnZpY2U6IE5neFVpTG9hZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogUkFUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZmllcjogTm90aWZpZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXNwb25zaXZlU2VydmljZTogUkFEYXNoYm9hcmRSZXNwb25zaXZlU2VydmljZSxcclxuICAgIHByaXZhdGUgcGVybWlzc2lvblNlcnZpY2U6IFJBUGVybWlzc2lvblNlcnZpY2VcclxuICApIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1dpZGdldE1nbW50ID0gdGhpcy5wZXJtaXNzaW9uU2VydmljZS5oYXNQZXJtaXNzaW9uKCdyYS53aWRnZXRtYW5hZ2VtZW50Jyk7XHJcbiAgICB0aGlzLmluaXRpYXRlR3JpZHN0ZXJDb25maWcoKTtcclxuICAgIHRoaXMubGFzdFZpZXdUeXBlID0gdGhpcy5yZXNwb25zaXZlU2VydmljZS5Jc0Rlc2t0b3BWaWV3ID8gJ2Rlc2t0b3AnIDogJ21vYmlsZSc7XHJcbiAgICB0aGlzLnJlc3BvbnNpdmVTZXJ2aWNlLnJlc2l6ZWQuc3Vic2NyaWJlKChpc0Rlc2t0b3ApID0+IHtcclxuICAgICAgaWYgKHRoaXMubGFzdFZpZXdUeXBlICE9IChpc0Rlc2t0b3AgPyAnZGVza3RvcCcgOiAnbW9iaWxlJykgfHwgIWlzRGVza3RvcCkge1xyXG4gICAgICAgIHRoaXMubGFzdFZpZXdUeXBlID0gKGlzRGVza3RvcCA/ICdkZXNrdG9wJyA6ICdtb2JpbGUnKTtcclxuICAgICAgICB0aGlzLndpZGdldExpc3QgPSBbXTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW5pdGlhdGVHcmlkc3RlckNvbmZpZygpO1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFwaS5vcHRpb25zQ2hhbmdlZCgpO1xyXG4gICAgICAgICAgaWYgKHRoaXMudXNlcldpZGdldHMpIHtcclxuICAgICAgICAgICAgdGhpcy53aWRnZXRMaXN0ID0gdGhpcy5tYXBPYmplY3RMaXN0VG9Hcmlkc3Rlckl0ZW1MaXN0KHRoaXMudXNlcldpZGdldHMpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnNldEFyZWFIZWlnaHQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkV2lkZ2V0cyh0aGlzLnVzZXJEYXNoYm9hcmRJZCwgdGhpcy5hcmVhS2V5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZG9tUmVzaXplZCA9ICF0aGlzLmRvbVJlc2l6ZWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdyaWRjZWxsSGVpZ2h0ID0gdGhpcy5vcHRpb25zLmFwaS5nZXRDdXJyZW50Um93SGVpZ2h0KCk7XHJcbiAgICAgICAgICB0aGlzLmRvbVJlc2l6ZWQgPSAhdGhpcy5kb21SZXNpemVkO1xyXG4gICAgICAgICAgdGhpcy5zZXRBcmVhSGVpZ2h0KCk7XHJcbiAgICAgICAgfSwgMTAwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzV2lkZ2V0TWdtbnQgPSB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLmhhc1Blcm1pc3Npb24oJ3JhLndpZGdldG1hbmFnZW1lbnQnKTtcclxuICAgIGlmICh0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMgJiYgdGhpcy5hcHBDb25maWcgJiYgIXRoaXMuaXNXaWRnZXRMb2FkZWQpIHtcclxuICAgICAgdGhpcy5pc1dpZGdldExvYWRlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMubG9hZFdpZGdldHModGhpcy51c2VyRGFzaGJvYXJkSWQsIHRoaXMuYXJlYUtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMucmFEYXNoYm9hcmRFdmVudEJ1cyAmJiBjaGFuZ2VzLnJhRGFzaGJvYXJkRXZlbnRCdXMuY3VycmVudFZhbHVlICE9IGNoYW5nZXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuaW5pdGl0YXRlRXZlbnRCdXNTdWJzY3JpdGlvbnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlRvIHNldCBHcmlkc3RlckNvbmZpZyAqL1xyXG4gIHB1YmxpYyBpbml0aWF0ZUdyaWRzdGVyQ29uZmlnKCkge1xyXG4gICAgLyoqVG8gb3ZlcnJpZGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHZhbHVlcyB0byB0aGUgZ3JpZHN0ZXIgY29udHJvbCAqL1xyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5yZXNwb25zaXZlU2VydmljZS5nZXRHcmlkc3RlckNvbmZpZyh0aGlzLmlzV2lkZ2V0TWdtbnQpO1xyXG4gICAgdGhpcy5vcHRpb25zLmluaXRDYWxsYmFjayA9IChncmlkc3RlcjogYW55KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXBpKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkY2VsbEhlaWdodCA9IHRoaXMub3B0aW9ucy5hcGkuZ2V0Q3VycmVudFJvd0hlaWdodCgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhpcy5vcHRpb25zLml0ZW1DaGFuZ2VDYWxsYmFjayA9IChpdGVtOiBHcmlkc3Rlckl0ZW0pID0+IHtcclxuICAgICAgaWYgKHRoaXMucmVzcG9uc2l2ZVNlcnZpY2UuSXNEZXNrdG9wVmlldykge1xyXG4gICAgICAgIGlmIChpdGVtLndpZGdldEluZm8gJiYgaXRlbS53aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0UG9zaXRpb24oaXRlbS53aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldEFyZWFIZWlnaHQoKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogVG8gaW5pdGlhdGUgZXZlbnRidXMgc3Vic2N0aXB0aW9ucyAqL1xyXG4gIGluaXRpdGF0ZUV2ZW50QnVzU3Vic2NyaXRpb25zKCkge1xyXG4gICAgdGhpcy53aWRnZXREZWxldGVFdmVudCA9IHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5zdWJzY3JpYmUoUkFFdmVudC5XaWRnZXREZWxldGUpLnN1YnNjcmliZSgoaW5zdGFuY2VJZCkgPT4ge1xyXG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGVsZXRlV2lkZ2V0KGluc3RhbmNlSWQsIHRydWUpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMud2lkZ2V0QWRkRXZlbnQgPSB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMuc3Vic2NyaWJlKFJBRXZlbnQuQWRkV2lkZ2V0KS5zdWJzY3JpYmUoKHdpZGdldEluZm8pID0+IHtcclxuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLmNvcHlXaWRnZXQod2lkZ2V0SW5mbyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jb25pZmdBZGRDbGljayA9IHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5zdWJzY3JpYmUoUkFFdmVudC5Db25maWdBZGRDbGljaykuc3Vic2NyaWJlKChlKSA9PiB7XHJcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hZGRXaWRnZXQoZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5yZWFycmFuZ2VXaWRnZXRDbGljayA9IHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5zdWJzY3JpYmUoUkFFdmVudC5SZWFycmFuZ2VDbGlja2VkKS5zdWJzY3JpYmUoKGUpID0+IHtcclxuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLnJlYXJyYW5nZVdpZGdldHMoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLndpZGdldExpYnJhcnlEb25lQ2xpY2sgPSB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMuc3Vic2NyaWJlKFJBRXZlbnQud2lkZ2V0TGlicmFyeURvbmVDbGljaykuc3Vic2NyaWJlKCh3aWRnZXRMaXN0KSA9PiB7XHJcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgaWYgKHdpZGdldExpc3QpIHtcclxuICAgICAgICAgIHRoaXMuYWRkV2lkZ2V0TGlzdFRvR3JpZHN0ZXIod2lkZ2V0TGlzdCwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogdGVtcCBmaXgtIHJlY3Vyc2l2ZSBtZXRob2QgdG8gaXRlcmF0ZSBvdmVyIHRoZSBsaXN0IG9mIGl0ZW1zXHJcbiAgICogYW5kIGFkZCB0aGVtIHRvIGdyaWRzdGVyIGluIHRoZSBnaXZlbiBvcmRlclxyXG4gICAqIEBwYXJhbSB3aWRnZXRMaXN0ICAtbGlzdCBvZiB3aWRnZXRzXHJcbiAgICogQHBhcmFtIGluZGV4IC1pbmRleCBvZiB0aGUgY3VycmVudCB2YWx1ZSB0byBiZSBhZGRlZFxyXG4gICAqL1xyXG4gIGFkZFdpZGdldExpc3RUb0dyaWRzdGVyKHdpZGdldExpc3Q6IGFueSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgbGV0IGFyZWFDb250ZXh0ID0gdGhpcztcclxuICAgIGxldCBpbmRleFZhbCA9IGluZGV4ICsgMTtcclxuICAgIGlmIChpbmRleCA+IHdpZGdldExpc3QubGVuZ3RoIC0gMSlcclxuICAgICAgcmV0dXJuO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChpbmRleCA9PSAwKSB7XHJcbiAgICAgICAgYXJlYUNvbnRleHQuYWRkV2lkZ2V0KHdpZGdldExpc3RbaW5kZXhdKTtcclxuICAgICAgICBhcmVhQ29udGV4dC5hZGRXaWRnZXRMaXN0VG9Hcmlkc3Rlcih3aWRnZXRMaXN0LCBpbmRleFZhbCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBhcmVhQ29udGV4dC5hZGRXaWRnZXQod2lkZ2V0TGlzdFtpbmRleF0pO1xyXG4gICAgICAgICAgYXJlYUNvbnRleHQuYWRkV2lkZ2V0TGlzdFRvR3JpZHN0ZXIod2lkZ2V0TGlzdCwgaW5kZXhWYWwpO1xyXG4gICAgICAgIH0sIDEwMDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbmlmZ0FkZENsaWNrKVxyXG4gICAgICB0aGlzLmNvbmlmZ0FkZENsaWNrLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMud2lkZ2V0QWRkRXZlbnQpXHJcbiAgICAgIHRoaXMud2lkZ2V0QWRkRXZlbnQudW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBpZiAodGhpcy53aWRnZXREZWxldGVFdmVudClcclxuICAgICAgdGhpcy53aWRnZXREZWxldGVFdmVudC51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLndpZGdldExpYnJhcnlEb25lQ2xpY2spXHJcbiAgICAgIHRoaXMud2lkZ2V0TGlicmFyeURvbmVDbGljay51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLnJlYXJyYW5nZVdpZGdldENsaWNrKVxyXG4gICAgICB0aGlzLnJlYXJyYW5nZVdpZGdldENsaWNrLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqVG8gdXBkYXRlIHBvc2l0aW9uL2RpbWVudGlvbiBvZiBhbGwgd2lkZ2V0cyBpbiB0aGUgYXJlYSAqL1xyXG4gIHVwZGF0ZVdpZGdldHMoKSB7XHJcbiAgICB0aGlzLmRhc2hib2FyZFNlcnZpY2UudXBkYXRlV2lkZ2V0cyh0aGlzLmZvcm1hdFdpZGdldERhdGFGb3JQb3NpdGlvbkRldGFpbHModGhpcy5tYXBHcmlkc3Rlckxpc3RUb09iamVjdCh0aGlzLndpZGdldExpc3QpKSxcclxuICAgICAgdGhpcy5hcHBDb25maWcpLnN1YnNjcmliZSh3aWRnZXRzID0+IHtcclxuICAgICAgfSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlRvIHVwZGF0ZSB3aWRnZXQgZGltZW5zaW9ucyAqL1xyXG4gIHVwZGF0ZVdpZGdldFBvc2l0aW9uKHdpZGdldEluc3RhbmNlSWQ6IG51bWJlcikge1xyXG5cclxuICAgIGxldCB3aWRnZXRGaWx0ZXJlZExpc3QgPSBbXTtcclxuICAgIGxldCB3aWRnZXQgPSB0aGlzLndpZGdldExpc3QuZmlsdGVyKGZpbHRlcmVkID0+IGZpbHRlcmVkLndpZGdldEluZm8gJiYgZmlsdGVyZWQud2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkID09IHdpZGdldEluc3RhbmNlSWQpO1xyXG4gICAgaWYgKHdpZGdldCAmJiB3aWRnZXQubGVuZ3RoID4gMCkge1xyXG4gICAgICB3aWRnZXRGaWx0ZXJlZExpc3QucHVzaCh3aWRnZXRbMF0pO1xyXG4gICAgICBsZXQgd2lkZ2V0TGlzdCA9IHRoaXMubWFwR3JpZHN0ZXJMaXN0VG9PYmplY3Qod2lkZ2V0RmlsdGVyZWRMaXN0KTtcclxuICAgICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLnVwZGF0ZVdpZGdldHModGhpcy5mb3JtYXRXaWRnZXREYXRhRm9yUG9zaXRpb25EZXRhaWxzKHdpZGdldExpc3QpLCB0aGlzLmFwcENvbmZpZykuc3Vic2NyaWJlKHdpZGdldHMgPT4ge1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqVG8gcmVzdHJpY3QgcmVxdWVzdCBwYXlsb2FkIHRvIGJlIG9mIG1pbiBzaXplIChwb3NpdGlvbiAmIHNpemUgZGV0YWlscykgKi9cclxuICBmb3JtYXRXaWRnZXREYXRhRm9yUG9zaXRpb25EZXRhaWxzKHdpZGdldEl0ZW1MaXN0OiBJV2lkZ2V0SW5mb1tdKSB7XHJcbiAgICBsZXQgaXRlbUxpc3Q6IGFueSA9IFtdO1xyXG4gICAgd2lkZ2V0SXRlbUxpc3QuZm9yRWFjaChmdW5jdGlvbiAod2lkZ2V0SXRlbSkge1xyXG4gICAgICBsZXQgaXRlbSA9IHt9IGFzIElXaWRnZXRJbmZvO1xyXG4gICAgICBpdGVtLndpZGdldEluc3RhbmNlSWQgPSB3aWRnZXRJdGVtLndpZGdldEluc3RhbmNlSWQ7XHJcbiAgICAgIGl0ZW0ucG9zaXRpb25feCA9IHdpZGdldEl0ZW0ucG9zaXRpb25feDtcclxuICAgICAgaXRlbS5wb3NpdGlvbl95ID0gd2lkZ2V0SXRlbS5wb3NpdGlvbl95O1xyXG4gICAgICBpdGVtLndpZHRoID0gd2lkZ2V0SXRlbS53aWR0aDtcclxuICAgICAgaXRlbS5oZWlnaHQgPSB3aWRnZXRJdGVtLmhlaWdodDtcclxuICAgICAgaXRlbUxpc3QucHVzaChpdGVtKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGl0ZW1MaXN0O1xyXG4gIH1cclxuXHJcbiAgLyoqIFRvIHJldHJpZXZlIHdpZGdldHMgYmFzZWQgb24gdXNlckRhc2hib2FyZGlkIGFuZCBhcmVhIG5hbWUgKi9cclxuICBsb2FkV2lkZ2V0cyh1c2VyRGFzaGJvYXJJZDogbnVtYmVyLCBhcmVhS2V5OiBzdHJpbmcpIHtcclxuICAgIGxldCBpc0luZGljYXRvckRhc2hib2FyZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdJc0luZGljYXRvckRhc2hib2FyZCcpID09ICd0cnVlJyA/IHRydWUgOiBmYWxzZTtcclxuICAgIGxldCB3aWRnZXRJbmZvID0gPElXaWRnZXRJbmZvPntcclxuICAgICAgZGFzaGJvYXJkSWQ6IHVzZXJEYXNoYm9hcklkLnRvU3RyaW5nKCksXHJcbiAgICAgIGRhc2hib2FyZEFyZWFLZXk6IGFyZWFLZXksXHJcbiAgICAgIGlzSW5kaWNhdG9yRGFzaGJvYXJkOiBpc0luZGljYXRvckRhc2hib2FyZFxyXG4gICAgfVxyXG4gICAgdGhpcy53aWRnZXRMaXN0ID0gW107XHJcbiAgICB0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0V2lkZ2V0c0J5RGFzaGJvYXJkQXJlYSh3aWRnZXRJbmZvLCB0aGlzLmFwcENvbmZpZykuc3Vic2NyaWJlKHdpZGdldHMgPT4ge1xyXG4gICAgICB0aGlzLnVzZXJXaWRnZXRzID0gd2lkZ2V0cztcclxuICAgICAgdGhpcy5QQU1XaWRnZXRzID0gW107XHJcbiAgICAgIHdpZGdldHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICB2YXIgc2V0dGluZ3M6IGFueSA9IHVuZGVmaW5lZFxyXG4gICAgICAgIGlmIChlbGVtZW50LndpZGdldFNldHRpbmdzKSB7XHJcbiAgICAgICAgICBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZWxlbWVudC53aWRnZXRTZXR0aW5ncyk7XHJcbiAgICAgICAgICBpZiAoc2V0dGluZ3MgJiYgc2V0dGluZ3MuaXNQQU1XaWRnZXQpXHJcbiAgICAgICAgICAgIHRoaXMuUEFNV2lkZ2V0cy5wdXNoKGVsZW1lbnQud2lkZ2V0SW5zdGFuY2VJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5jaGVja1BBTVdpZGdldHMoKTtcclxuXHJcbiAgICAgIGlmICh3aWRnZXRzICYmIHdpZGdldHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkU2VydmljZS5jbGllbnRJZCA9IHdpZGdldHNbMF0uY2xpZW50SWQ7XHJcbiAgICAgICAgdGhpcy53aWRnZXRMaXN0ID0gdGhpcy5tYXBPYmplY3RMaXN0VG9Hcmlkc3Rlckl0ZW1MaXN0KHdpZGdldHMpO1xyXG4gICAgICAgIHRoaXMuc2V0QXJlYUhlaWdodCgpO1xyXG4gICAgICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuSGlkZURhc2hib2FyZEJhbm5lciwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2hvd0VtcHR5RGFzaGJvYXJkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMucHVibGlzaChSQUV2ZW50LkhpZGVEYXNoYm9hcmRCYW5uZXIsIHRoaXMuc2hvd0VtcHR5RGFzaGJvYXJkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIFRvIHNldCBBcmVhKEdyaWRzdGVyKSBoZWlnaHQgZHluYW1pY2FsbHkgYXMgd2lkZ2V0cyBhcmUgYWRkZWQvcmVtb3ZlZCAqL1xyXG4gIHNldEFyZWFIZWlnaHQoKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgbGV0IGlzTW9iaWxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9iaWxlQnJlYWtwb2ludCA+IHRoaXMuZ3JpZFdyYXBwZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCkge1xyXG4gICAgICAgIGlzTW9iaWxlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgYXJlYVNjcm9sbEhlaWdodCA9IDA7XHJcbiAgICAgIGxldCBhcmVhSGVpZ2h0ID0gMDtcclxuICAgICAgbGV0IGN1clJvd0hlaWdodCA9IDA7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXBpKSB7XHJcbiAgICAgICAgY3VyUm93SGVpZ2h0ID0gdGhpcy5vcHRpb25zLmFwaS5nZXRDdXJyZW50Um93SGVpZ2h0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2hvd0VtcHR5RGFzaGJvYXJkID0gdGhpcy51c2VyV2lkZ2V0cy5sZW5ndGggPiAwID8gZmFsc2UgOiB0cnVlO1xyXG5cclxuICAgICAgdGhpcy53aWRnZXRMaXN0LmZvckVhY2goKHQpID0+IHtcclxuICAgICAgICBsZXQgY3VycmVudEhlaWdodCA9IHQueSArIHQucm93cztcclxuICAgICAgICBpZiAoY3VycmVudEhlaWdodCA+IGFyZWFTY3JvbGxIZWlnaHQpIHtcclxuICAgICAgICAgIGFyZWFTY3JvbGxIZWlnaHQgPSBjdXJyZW50SGVpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VyUm93SGVpZ2h0ID09IDApIHtcclxuICAgICAgICAgIGN1cnJlbnRIZWlnaHQgPSB0aGlzLndpZGdldExpc3RbMF0uY3VyUm93SGVpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0LndpZGdldEluZm8ucm93SGVpZ2h0ID0gY3VyUm93SGVpZ2h0O1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5ncmlkY2VsbEhlaWdodCA9IGN1clJvd0hlaWdodDtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hcGkpIHtcclxuICAgICAgICBhcmVhSGVpZ2h0ID0gYXJlYVNjcm9sbEhlaWdodCAqIHRoaXMub3B0aW9ucy5hcGkuZ2V0Q3VycmVudFJvd0hlaWdodCgpICsgMTAwO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBhcmVhU2Nyb2xsSGVpZ2h0TW9iID0gMDtcclxuICAgICAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICAgICAgYXJlYVNjcm9sbEhlaWdodE1vYiA9IHRoaXMud2lkZ2V0TGlzdC5sZW5ndGggKiAzMDAgKyAyMDA7XHJcbiAgICAgICAgYXJlYUhlaWdodCA9IGFyZWFTY3JvbGxIZWlnaHRNb2I7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGFyZWFIZWlnaHQgPCA2MDApIHtcclxuICAgICAgICBhcmVhSGVpZ2h0ID0gNjAwO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JpZGhlaWdodCA9IGFyZWFIZWlnaHQ7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIFRvIHJlbW92ZSBhIHdpZGdldCBpbnN0YW5jZSBmcm9tIGRhc2hib2FyZCBhbmQgdG8gc2F2ZSBpbmZvIGluIGRhdGFiYXNlICovXHJcbiAgZGVsZXRlV2lkZ2V0KHdpZGdldEluc3RhbmNlSWQ6IGFueSwgaXNhbGVydERpc2FibGVkOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGxldCBncmlkc3Rlckl0ZW0gPSB0aGlzLndpZGdldExpc3QuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgIHJldHVybiBpdGVtLndpZGdldEluZm8ud2lkZ2V0SW5zdGFuY2VJZCA9PT0gd2lkZ2V0SW5zdGFuY2VJZDtcclxuICAgIH0pO1xyXG4gICAgaWYgKGdyaWRzdGVySXRlbS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCB3aWRnZXQgPSB0aGlzLnVzZXJXaWRnZXRzLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBpdGVtLndpZGdldEluc3RhbmNlSWQgPT09IHdpZGdldEluc3RhbmNlSWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAod2lkZ2V0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnVzZXJXaWRnZXRzLnNwbGljZSh0aGlzLnVzZXJXaWRnZXRzLmluZGV4T2Yod2lkZ2V0WzBdKSwgMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLlBBTVdpZGdldHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHZhciBpbmR4ID0gdGhpcy5QQU1XaWRnZXRzLmluZGV4T2Yod2lkZ2V0SW5zdGFuY2VJZCk7XHJcbiAgICAgICAgaWYgKGluZHggPiAtMSlcclxuICAgICAgICAgIHRoaXMuUEFNV2lkZ2V0cy5zcGxpY2UoaW5keCwgMSk7XHJcbiAgICAgICAgdGhpcy5jaGVja1BBTVdpZGdldHMoKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIHRoaXMud2lkZ2V0TGlzdC5zcGxpY2UodGhpcy53aWRnZXRMaXN0LmluZGV4T2YoZ3JpZHN0ZXJJdGVtWzBdKSwgMSk7XHJcbiAgICAgIHRoaXMuc2V0QXJlYUhlaWdodCgpO1xyXG4gICAgICBpZiAoIWlzYWxlcnREaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMubm90aWZpZXIubm90aWZ5KCdzdWNjZXNzJywgXCIgXCIgKyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdDb21tb24uV2lkZ2V0dGV4dCcpICsgXCIgXCIgKyBncmlkc3Rlckl0ZW1bMF0ud2lkZ2V0SW5mby53aWRnZXRUaXRsZSArIFwiIFwiICsgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLmRlbGV0ZWRTdWNjZXNmdWxseScpICsgXCIgXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dFbXB0eURhc2hib2FyZCA9IHRoaXMudXNlcldpZGdldHMubGVuZ3RoID4gMCA/IGZhbHNlIDogdHJ1ZTtcclxuICAgIGlmICh0aGlzLnNob3dFbXB0eURhc2hib2FyZCA9PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuSGlkZURhc2hib2FyZEJhbm5lciwgdGhpcy5zaG93RW1wdHlEYXNoYm9hcmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqVG8gcmVhcnJhbmdlIHdpZGdldHMgcG9zaXRpb24gaW4gdGhlIGRhc2hib2FyZCwgY29tcGFjdExlZnQmVXAsY29tcGFjdExlZnQsY29tcGFjdFVwLGV0YyovXHJcbiAgcmVhcnJhbmdlV2lkZ2V0cygpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy51c2VyV2lkZ2V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnVzZXJXaWRnZXRzW2ldLnBvc2l0aW9uX3ggPSAwO1xyXG4gICAgICB0aGlzLnVzZXJXaWRnZXRzW2ldLnBvc2l0aW9uX3kgPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy53aWRnZXRMaXN0ID0gdGhpcy5tYXBPYmplY3RMaXN0VG9Hcmlkc3Rlckl0ZW1MaXN0KHRoaXMudXNlcldpZGdldHMpO1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0TGlzdC5sZW5ndGggPiAwKVxyXG4gICAgICB0aGlzLnVwZGF0ZVdpZGdldFBvc2l0aW9uKHRoaXMud2lkZ2V0TGlzdFswXS53aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0QXJlYUhlaWdodCgpO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqVG8gYWRkIHdpZGdldCBpbnN0YW5jZSB0byB0aGUgZGF0YWJhc2Ugd2l0aCB0aGUgbmV4dCBhdmFpbGFibGUgcG9zaXRpb24gYW5kIHRvIG1ha2UgY2hhbmdlcyBpblxyXG4gICAqIGRhc2hib2FyZCBhcmVhLlxyXG4gICAqL1xyXG4gIGFkZFdpZGdldChkYXRhOiBhbnkpIHtcclxuICAgIGRhdGEuaGVpZ2h0ID0gdGhpcy53aWRnZXRIZWlnaHQ7XHJcbiAgICBkYXRhLndpZHRoID0gdGhpcy53aWRnZXRXaWR0aDtcclxuICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuSGlkZURhc2hib2FyZEJhbm5lciwgZmFsc2UpO1xyXG4gICAgaWYgKGRhdGEud2lkZ2V0U2V0dGluZ3MpIHtcclxuICAgICAgaWYgKHR5cGVvZiBkYXRhLndpZGdldFNldHRpbmdzID09PSAnc3RyaW5nJylcclxuICAgICAgICBkYXRhLndpZGdldFNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhLndpZGdldFNldHRpbmdzKTtcclxuXHJcbiAgICAgIGlmIChkYXRhLndpZGdldFNldHRpbmdzLmRlZmF1bHRDb2xzKSB7XHJcbiAgICAgICAgZGF0YS53aWR0aCA9IGRhdGEud2lkZ2V0U2V0dGluZ3MuZGVmYXVsdENvbHM7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRhdGEud2lkZ2V0U2V0dGluZ3MuZGVmYXVsdFJvd3MpIHtcclxuICAgICAgICBkYXRhLmhlaWdodCA9IGRhdGEud2lkZ2V0U2V0dGluZ3MuZGVmYXVsdFJvd3M7XHJcbiAgICAgIH1cclxuICAgICAgZGF0YS53aWRnZXRTZXR0aW5ncyA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBkYXRhID0gdGhpcy5zZXRQb3NpdGlvbnMoZGF0YSk7XHJcblxyXG4gICAgLyoqIHRvIGZpbmQgdGhlIGF2YWlsYWJsZSBwb3NpdGlvbiBpbiBncmlkc3RlciwgdGVtcCBjb21tZW50aW5nIHRoZSBjb2RlLXJldHVybmluZyBoaWdoZXIgeSB2YWx1ZSB0aGFuIG5vcm1hbCAqL1xyXG4gICAgZGF0YS5kYXNoYm9hcmRBcmVhS2V5ID0gdGhpcy5hcmVhS2V5O1xyXG4gICAgZGF0YS5kYXNoYm9hcmRJZCA9IHRoaXMudXNlckRhc2hib2FyZElkO1xyXG4gICAgdGhpcy5uZ3hTZXJ2aWNlLnN0YXJ0KCk7XHJcbiAgICB0aGlzLmRhc2hib2FyZFNlcnZpY2UuYWRkV2lkZ2V0KGRhdGEsIHRoaXMuYXBwQ29uZmlnKS5zdWJzY3JpYmUod2lkZ2V0ID0+IHtcclxuICAgICAgdGhpcy51c2VyV2lkZ2V0cy5wdXNoKHdpZGdldCk7XHJcbiAgICAgIGxldCBncmlkc3Rlckl0ZW0gPSB0aGlzLnJlc3BvbnNpdmVTZXJ2aWNlLmdldEdyaWRzdGVySXRlbSh3aWRnZXQpO1xyXG4gICAgICB0aGlzLndpZGdldExpc3QucHVzaChncmlkc3Rlckl0ZW0pO1xyXG4gICAgICB0aGlzLnNldEFyZWFIZWlnaHQoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXBpKSB7XHJcbiAgICAgICAgbGV0IGN1clJvd0hlaWdodDogbnVtYmVyID0gTnVtYmVyKHRoaXMub3B0aW9ucy5hcGkuZ2V0Q3VycmVudFJvd0hlaWdodCgpKTtcclxuICAgICAgICBpZiAoY3VyUm93SGVpZ2h0ID4gMCkge1xyXG4gICAgICAgICAgd2lkZ2V0LnJvd0hlaWdodCA9IGN1clJvd0hlaWdodDtcclxuICAgICAgICAgIHRoaXMuZ3JpZGNlbGxIZWlnaHQgPSBjdXJSb3dIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHZhciB3aWRnZXRJbnN0YW5jZUlkID0gMDtcclxuICAgICAgaWYgKHdpZGdldCAmJiB3aWRnZXQud2lkZ2V0SW5zdGFuY2VJZCkge1xyXG4gICAgICAgIHdpZGdldEluc3RhbmNlSWQgPSB3aWRnZXQud2lkZ2V0SW5zdGFuY2VJZDtcclxuICAgICAgICAvKipUbyBzYXZlIGFkZGVkIHdpZGdldCBwb3NpdGlvbiBpbiBkYiAqL1xyXG4gICAgICAgIGlmICh0aGlzLnJlc3BvbnNpdmVTZXJ2aWNlLklzRGVza3RvcFZpZXcpIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldFBvc2l0aW9uKHdpZGdldEluc3RhbmNlSWQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh3aWRnZXQuc2V0dGluZ3MgJiYgd2lkZ2V0LnNldHRpbmdzLmlzUEFNV2lkZ2V0KSB7XHJcbiAgICAgICAgdGhpcy5QQU1XaWRnZXRzLnB1c2god2lkZ2V0LndpZGdldEluc3RhbmNlSWQpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tQQU1XaWRnZXRzKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yYURhc2hib2FyZEV2ZW50QnVzLnB1Ymxpc2goUkFFdmVudC5XaWRnZXRBZGRlZCwgd2lkZ2V0KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRQb3NpdGlvbnMoZGF0YTogYW55KSB7XHJcbiAgICBkYXRhLnBvc2l0aW9uX3ggPSAwO1xyXG4gICAgZGF0YS5wb3NpdGlvbl95ID0gMDtcclxuICAgIGlmICghdGhpcy5yZXNwb25zaXZlU2VydmljZS5Jc0Rlc2t0b3BWaWV3KSB7XHJcbiAgICAgIGlmICh0aGlzLnVzZXJXaWRnZXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgd2lkZ2V0ID0gdGhpcy51c2VyV2lkZ2V0c1t0aGlzLnVzZXJXaWRnZXRzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGlmICh3aWRnZXQucG9zaXRpb25feCArIHdpZGdldC53aWR0aCA+ICh0aGlzLnJlc3BvbnNpdmVTZXJ2aWNlLm1heENvbHNEZXNrdG9wIC8gMikpIHtcclxuICAgICAgICAgIGRhdGEucG9zaXRpb25feSA9IHdpZGdldC5wb3NpdGlvbl95ICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBkYXRhLnBvc2l0aW9uX3kgPSB3aWRnZXQucG9zaXRpb25feTtcclxuICAgICAgICAgIGRhdGEucG9zaXRpb25feCA9IHRoaXMucmVzcG9uc2l2ZVNlcnZpY2UubWF4Q29sc0Rlc2t0b3AgLSAod2lkZ2V0LnBvc2l0aW9uX3ggKyB3aWRnZXQud2lkdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICAvKiogVG8gYWRkIHdpZGdldCB0byBjdXJyZW50IHdpZGdldCBsaXN0ICxpbnZva2VkIGZyb20gY29weSB3aWRnZXQgd2luZG93Ki9cclxuICBjb3B5V2lkZ2V0KGRhdGE6IGFueSkge1xyXG4gICAgZGF0YSA9IHRoaXMuc2V0UG9zaXRpb25zKGRhdGEpO1xyXG4gICAgaWYgKCF0aGlzLnJlc3BvbnNpdmVTZXJ2aWNlLklzRGVza3RvcFZpZXcpIHtcclxuICAgICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLnVwZGF0ZVdpZGdldHModGhpcy5mb3JtYXRXaWRnZXREYXRhRm9yUG9zaXRpb25EZXRhaWxzKFtkYXRhXSksIHRoaXMuYXBwQ29uZmlnKS5zdWJzY3JpYmUod2lkZ2V0cyA9PiB7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy51c2VyV2lkZ2V0cy5wdXNoKGRhdGEpO1xyXG4gICAgbGV0IGdyaWRzdGVySXRlbSA9IHRoaXMucmVzcG9uc2l2ZVNlcnZpY2UuZ2V0R3JpZHN0ZXJJdGVtKGRhdGEpO1xyXG4gICAgdGhpcy53aWRnZXRMaXN0LnB1c2goZ3JpZHN0ZXJJdGVtKTtcclxuICAgIHRoaXMuc2V0QXJlYUhlaWdodCgpO1xyXG4gICAgaWYgKGRhdGEuc2V0dGluZ3MgJiYgZGF0YS5zZXR0aW5ncy5pc1BBTVdpZGdldCkge1xyXG4gICAgICB0aGlzLlBBTVdpZGdldHMucHVzaChkYXRhLndpZGdldEluc3RhbmNlSWQpO1xyXG4gICAgICB0aGlzLmNoZWNrUEFNV2lkZ2V0cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFwT2JqZWN0TGlzdFRvR3JpZHN0ZXJJdGVtTGlzdCh3aWRnZXRMaXN0OiBBcnJheTxJV2lkZ2V0SW5mbz4pIHtcclxuICAgIGxldCB3aWRnZXRBcnJheSA9IEFycmF5PEdyaWRzdGVySXRlbT4oKTtcclxuICAgIHdpZGdldExpc3QuZm9yRWFjaCh3aWRnZXQgPT4ge1xyXG4gICAgICB3aWRnZXRBcnJheS5wdXNoKHRoaXMucmVzcG9uc2l2ZVNlcnZpY2UuZ2V0R3JpZHN0ZXJJdGVtKHdpZGdldCkpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gd2lkZ2V0QXJyYXk7XHJcbiAgfVxyXG5cclxuICBtYXBHcmlkc3Rlckl0ZW1Ub09iamVjdCh3aWRnZXRJdGVtOiBHcmlkc3Rlckl0ZW0pIHtcclxuICAgIGxldCB3aWRnZXQ6IElXaWRnZXRJbmZvO1xyXG4gICAgd2lkZ2V0ID0gd2lkZ2V0SXRlbS53aWRnZXRJbmZvO1xyXG4gICAgd2lkZ2V0LmhlaWdodCA9IHdpZGdldEl0ZW0ucm93cztcclxuICAgIHdpZGdldC53aWR0aCA9IHdpZGdldEl0ZW0uY29scztcclxuICAgIHdpZGdldC5wb3NpdGlvbl94ID0gd2lkZ2V0SXRlbS54O1xyXG4gICAgd2lkZ2V0LnBvc2l0aW9uX3kgPSB3aWRnZXRJdGVtLnk7XHJcbiAgICB3aWRnZXQucm93SGVpZ2h0ID0gd2lkZ2V0SXRlbS5jdXJSb3dIZWlnaHQ7XHJcbiAgICByZXR1cm4gd2lkZ2V0O1xyXG4gIH1cclxuXHJcbiAgbWFwR3JpZHN0ZXJMaXN0VG9PYmplY3Qod2lkZ2V0SXRlbUxpc3Q6IEFycmF5PEdyaWRzdGVySXRlbT4pIHtcclxuICAgIGxldCB3aWRnZXRMaXN0QXJyYXkgPSBBcnJheTxJV2lkZ2V0SW5mbz4oKTtcclxuICAgIHdpZGdldEl0ZW1MaXN0LmZvckVhY2god2lkZ2V0ID0+IHtcclxuICAgICAgd2lkZ2V0TGlzdEFycmF5LnB1c2godGhpcy5tYXBHcmlkc3Rlckl0ZW1Ub09iamVjdCh3aWRnZXQpKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHdpZGdldExpc3RBcnJheTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGROZXdXaWRnZXQoKSB7XHJcbiAgICB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMucHVibGlzaChSQUV2ZW50LkFkZE5ld1dpZGdldFRvRGFzaGJvYXJkLCBudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVBcHBsaWVkRmlsdGVycyhkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuVXBkYXRlQXBwbGVkRml0ZXJGb3JJbmFwcGxpY2FibGVGaWx0ZXIsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrUEFNV2lkZ2V0cygpIHtcclxuICAgIGlmICh0aGlzLlBBTVdpZGdldHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMucHVibGlzaChSQUV2ZW50LlNob3dJbmFwcGxpY2FibGVGaWx0ZXJNZXNzYWdlLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMucHVibGlzaChSQUV2ZW50LlNob3dJbmFwcGxpY2FibGVGaWx0ZXJNZXNzYWdlLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufSJdfQ==