@microsoft/windows-admin-center-sdk 2.508.0 → 2.510.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +1025 -514
  2. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
  3. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +1 -1
  4. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
  5. package/angular/esm2015/src/controls/common/decorators/deprecation.decorators.js +1 -1
  6. package/angular/esm2015/src/controls/header/header.component.js +79 -32
  7. package/angular/esm2015/src/controls/layout/index.js +2 -1
  8. package/angular/esm2015/src/controls/layout/layout-config.js +69 -0
  9. package/angular/esm2015/src/controls/layout/layout-item.component.js +12 -4
  10. package/angular/esm2015/src/controls/layout/layout-responsive-window-manager.js +22 -0
  11. package/angular/esm2015/src/controls/layout/layout.component.js +402 -69
  12. package/angular/esm2015/src/controls/property-grid/property-grid.component.js +8 -2
  13. package/angular/esm2015/src/controls/settings/settings.component.js +9 -3
  14. package/angular/esm2015/src/controls/split-view/split-view.component.js +1 -1
  15. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +950 -475
  16. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
  17. package/angular/src/controls/header/header.component.d.ts +17 -5
  18. package/angular/src/controls/layout/index.d.ts +1 -0
  19. package/angular/src/controls/layout/layout-config.d.ts +53 -0
  20. package/angular/src/controls/layout/layout-item.component.d.ts +5 -1
  21. package/angular/src/controls/layout/layout-responsive-window-manager.d.ts +5 -0
  22. package/angular/src/controls/layout/layout.component.d.ts +95 -3
  23. package/angular/src/controls/property-grid/property-grid.component.d.ts +5 -1
  24. package/angular/src/controls/settings/settings.component.d.ts +9 -0
  25. package/e2e/assets/strings/cs-CZ/strings.json +1 -1
  26. package/e2e/assets/strings/de-DE/strings.json +1 -1
  27. package/e2e/assets/strings/es-ES/strings.json +1 -1
  28. package/e2e/assets/strings/fr-FR/strings.json +1 -1
  29. package/e2e/assets/strings/hu-HU/strings.json +1 -1
  30. package/e2e/assets/strings/it-IT/strings.json +1 -1
  31. package/e2e/assets/strings/ja-JP/strings.json +1 -1
  32. package/e2e/assets/strings/ko-KR/strings.json +1 -1
  33. package/e2e/assets/strings/nl-NL/strings.json +1 -1
  34. package/e2e/assets/strings/pl-PL/strings.json +1 -1
  35. package/e2e/assets/strings/pt-BR/strings.json +1 -1
  36. package/e2e/assets/strings/pt-PT/strings.json +1 -1
  37. package/e2e/assets/strings/ru-RU/strings.json +1 -1
  38. package/e2e/assets/strings/strings.json +1 -1
  39. package/e2e/assets/strings/sv-SE/strings.json +1 -1
  40. package/e2e/assets/strings/tr-TR/strings.json +1 -1
  41. package/e2e/assets/strings/zh-CN/strings.json +1 -1
  42. package/e2e/assets/strings/zh-TW/strings.json +1 -1
  43. package/package.json +1 -1
  44. package/styles/css/main-v2.css +1 -1
@@ -1,8 +1,16 @@
1
+ import { __decorate, __metadata } from "tslib";
1
2
  import { Component, ContentChildren, EventEmitter, Inject, Injector, Input, Output, QueryList } from '@angular/core';
3
+ import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators';
4
+ import { Yield } from '@microsoft/windows-admin-center-sdk/core/base/decorators/yield.decorator';
5
+ import { LogLevel } from '@microsoft/windows-admin-center-sdk/core/diagnostics/log-level';
6
+ import { Logging } from '@microsoft/windows-admin-center-sdk/core/diagnostics/logging';
2
7
  import { CoreBaseComponent } from '../common/base.component';
3
8
  import { SME_LAYOUT_PROVIDER } from '../common/layout';
9
+ import { SmeResponsiveWindowBreakpoints } from '../common/sme-responsive-window-manager.component';
10
+ import { LayoutDrivenType, LayoutItemConfigMode, LayoutItemConfigPropertyWidthType } from './layout-config';
4
11
  import { LayoutDefinitionComponent } from './layout-definition.component';
5
12
  import { LayoutItemComponent } from './layout-item.component';
13
+ import { LayoutResponsiveWindowManager } from './layout-responsive-window-manager';
6
14
  import * as i0 from "@angular/core";
7
15
  const _c0 = [[["sme-layout-item"]]];
8
16
  const _c1 = ["sme-layout-item"];
@@ -12,18 +20,64 @@ const _c1 = ["sme-layout-item"];
12
20
  export class LayoutComponent extends CoreBaseComponent {
13
21
  constructor(injector, layout) {
14
22
  super(injector);
15
- this.layout = layout;
23
+ /**
24
+ * The default horizontal space in between layout items.
25
+ */
16
26
  this.itemHorizontalSpace = 32;
27
+ /**
28
+ * The default vertical space in between layout items.
29
+ */
17
30
  this.itemVerticalSpace = 32;
31
+ /**
32
+ * If true, will always try to fill the whole row for each layout item.
33
+ */
18
34
  this.tryToFillWholeRow = true;
35
+ /**
36
+ * The layout definition.
37
+ */
19
38
  this.definition = {};
39
+ /**
40
+ * If false, it will not assign extra paddings to the right for the last layout item.
41
+ */
20
42
  this.padLastItem = false;
43
+ /**
44
+ * If true, not extra right padding when there is only one item that uses the whole width of the row.
45
+ */
21
46
  this.noExtraRightPaddingOneItemPerRow = true;
47
+ /**
48
+ * It determines whether the layout is for settings where it contains a left and right layout item.
49
+ * If true, will apply special design for settings layout.
50
+ * On phone-up, the left side navigation layout item will be using a fixed width by default 300px,
51
+ * the right side layout item will be using the remaining width by default.
52
+ *
53
+ * On phone-down or 400% zoom, nothing is different from the regular settings page,
54
+ * the left right layout will be transformed to top bottom layout.
55
+ */
56
+ this.layoutConfig = {
57
+ [SmeResponsiveWindowBreakpoints.PhoneUp]: { 'mode': LayoutItemConfigMode.Default },
58
+ [SmeResponsiveWindowBreakpoints.PhoneDown]: { 'mode': LayoutItemConfigMode.Default },
59
+ [SmeResponsiveWindowBreakpoints.Reflow]: { 'mode': LayoutItemConfigMode.Default }
60
+ };
61
+ /**
62
+ * Implementation of the Layout interface
63
+ */
22
64
  this.layoutChanged = new EventEmitter();
23
- this.subscriptions.push(this.layout.layoutChanged.subscribe(() => this.onLayoutChanged()));
24
- setTimeout(() => {
25
- this.updateLayout();
26
- });
65
+ /**
66
+ * Implementation of the Layout interface
67
+ */
68
+ this.windowBreakpointChanged = new EventEmitter();
69
+ this.columnCount = 1;
70
+ this.columnSpanTotal = 0;
71
+ this.layoutDrivenType = LayoutDrivenType.Default;
72
+ this.stylePixel = 'px';
73
+ if (layout) {
74
+ this.layoutResponsiveWindowManager = new LayoutResponsiveWindowManager(layout);
75
+ // on parent layout changes, re-emit the layout change to our event
76
+ this.subscriptions.push(layout.layoutChanged.subscribe((() => this.onLayoutChanged())));
77
+ // on window break point changes, emit the event about critical classes and styling updates signal.
78
+ this.subscriptions.push(layout.windowBreakpointChanged.subscribe(() => this.onWindowBreakpointChanged()));
79
+ this.deferredOnLayoutChanged();
80
+ }
27
81
  }
28
82
  /**
29
83
  * The source name to use for logging
@@ -34,15 +88,48 @@ export class LayoutComponent extends CoreBaseComponent {
34
88
  get currentLayoutDefinitionName() {
35
89
  return this.currentLayoutDefinition ? this.currentLayoutDefinition.name : '';
36
90
  }
91
+ get currentLayoutDrivenType() {
92
+ return this.layoutDrivenType;
93
+ }
94
+ get currentWindowBreakpoint() {
95
+ var _a;
96
+ return (_a = this.layoutResponsiveWindowManager) === null || _a === void 0 ? void 0 : _a.prevSize.size;
97
+ }
98
+ get currentLayoutItems() {
99
+ return this.layoutItems;
100
+ }
37
101
  ngAfterViewInit() {
38
102
  this.subscriptions.push(this.layoutItems.changes.subscribe(() => this.onLayoutChanged()));
39
103
  }
104
+ /**
105
+ * The open API for refreshing the control externally.
106
+ */
107
+ refresh() {
108
+ this.resetFlex();
109
+ this.onLayoutChanged();
110
+ }
40
111
  /**
41
112
  * On layout changed event handler, occurs every time the layout has been changed.
42
113
  */
43
114
  onLayoutChanged() {
44
115
  this.updateLayout();
45
116
  }
117
+ /**
118
+ * The deferred layout changed handler.
119
+ */
120
+ deferredOnLayoutChanged() {
121
+ this.onLayoutChanged();
122
+ }
123
+ /**
124
+ * The on window breakpoint changed handler.
125
+ * Adding yield for component to get ElementRef after initialization.
126
+ */
127
+ onWindowBreakpointChanged() {
128
+ if (!this.layoutItems || !this.layoutItems.toArray()) {
129
+ return;
130
+ }
131
+ this.layoutResponsiveWindowManager.onWindowSizeChanged();
132
+ }
46
133
  // Adds classes listed to the root component
47
134
  // On phone down the flex start needs to be flex start to make sure no extra space being generated.
48
135
  getInitialHostClasses() {
@@ -52,83 +139,307 @@ export class LayoutComponent extends CoreBaseComponent {
52
139
  }
53
140
  updateLayout() {
54
141
  setTimeout(() => {
55
- var _a;
56
- if (this.layoutItems) {
57
- const layoutWidth = this.hostElement.nativeElement.clientWidth || Number.MAX_VALUE;
58
- let columnCount = 1;
59
- const layoutItems = this.layoutItems.toArray();
60
- let columnSpanTotal = 0;
61
- layoutItems.forEach(item => columnSpanTotal += item.columnSpan);
142
+ if (!this.layoutItems) {
143
+ return;
144
+ }
145
+ const layoutItems = this.layoutItems.toArray();
146
+ this.getTotalColumnSpan(layoutItems);
147
+ const currentWindowSize = this.layoutResponsiveWindowManager.prevSize.size;
148
+ this.updateLayoutConfig(currentWindowSize);
149
+ const layoutWidth = this.hostElement.nativeElement.clientWidth || Number.MAX_VALUE;
150
+ if (this.layoutDrivenType === LayoutDrivenType.Default) {
62
151
  const definitions = this.definitions.toArray().sort((a, b) => a.until - b.until);
63
152
  const previousLayoutDefinition = this.currentLayoutDefinition;
64
- this.currentLayoutDefinition = undefined;
65
- for (let i = definitions.length - 1; i >= 0; i--) {
66
- const definitionColumns = definitions[i].columns;
67
- if (layoutWidth <= definitions[i].until || (this.tryToFillWholeRow && columnSpanTotal <= definitionColumns)) {
68
- columnCount = definitionColumns;
69
- this.currentLayoutDefinition = definitions[i];
70
- }
71
- }
153
+ this.updateCurrentLayoutDefinition(definitions, layoutWidth);
72
154
  const itemHorizontalSpacePercentage = Math.round(this.itemHorizontalSpace * 100 / layoutWidth);
73
155
  const columnCountModifier = this.padLastItem ? 0 : 1;
74
- const availableLayoutWidthPercentage = 100 - itemHorizontalSpacePercentage * (columnCount - columnCountModifier);
75
- let percentageSoFar = 0;
76
- let columnIndex = 0;
77
- for (let i = 0; i < layoutItems.length; i++) {
78
- let percentage = 0;
79
- columnIndex += layoutItems[i].columnSpan;
80
- if (columnIndex === columnCount) {
81
- // If true, it means this layout item is the last one in the row.
82
- // It ensures the last one in the row use rest of the percentage.
83
- // Example: If it's a 3 column layout, the last one's percentage is 33.34%, not 33.33%
84
- percentage = 100 - percentageSoFar;
156
+ const availableLayoutWidthPercentage = 100 - itemHorizontalSpacePercentage * (this.columnCount - columnCountModifier);
157
+ this.layoutDefinitionWithColumnSpanCalculation(layoutItems, availableLayoutWidthPercentage, itemHorizontalSpacePercentage);
158
+ if (previousLayoutDefinition !== this.currentLayoutDefinition) {
159
+ setTimeout(() => {
160
+ this.layoutChanged.emit();
161
+ });
162
+ }
163
+ }
164
+ else if (this.layoutDrivenType === LayoutDrivenType.ResponsiveWindowManager) {
165
+ let availableLayoutWidthInPixel = layoutWidth - this.itemHorizontalSpace;
166
+ availableLayoutWidthInPixel = availableLayoutWidthInPixel > 0 ? availableLayoutWidthInPixel : 0;
167
+ if (availableLayoutWidthInPixel <= 0) {
168
+ return;
169
+ }
170
+ this.configDrivenCalculation(layoutItems, availableLayoutWidthInPixel);
171
+ }
172
+ });
173
+ }
174
+ updateLayoutConfig(currentWindowSize) {
175
+ if (!currentWindowSize) {
176
+ this.layoutDrivenType = LayoutDrivenType.Default;
177
+ return;
178
+ }
179
+ const phoneUp = this.layoutConfig.PhoneUp;
180
+ const phoneDown = this.layoutConfig.PhoneDown;
181
+ const reflow = this.layoutConfig.Reflow;
182
+ if (!phoneUp || !phoneDown || !reflow) {
183
+ Logging.log({
184
+ level: LogLevel.Debug,
185
+ message: 'Invalid layout config has been passed in',
186
+ source: 'DataTableComponent.onContentTablePressed'
187
+ });
188
+ const defaultMode = { 'mode': LayoutItemConfigMode.Default };
189
+ if (!phoneUp) {
190
+ this.layoutConfig.PhoneUp = defaultMode;
191
+ }
192
+ if (!phoneDown) {
193
+ this.layoutConfig.PhoneDown = defaultMode;
194
+ }
195
+ if (!reflow) {
196
+ this.layoutConfig.Reflow = defaultMode;
197
+ }
198
+ }
199
+ const currentConfig = this.layoutConfig[currentWindowSize];
200
+ if (currentConfig.mode === LayoutItemConfigMode.Default) {
201
+ this.setLayoutDrivenType(LayoutDrivenType.Default);
202
+ }
203
+ else if (currentConfig.mode === LayoutItemConfigMode.Custom && currentConfig.config && currentConfig.config.length) {
204
+ this.setLayoutDrivenType(LayoutDrivenType.ResponsiveWindowManager);
205
+ this.currentLayoutItemConfig = currentConfig.config;
206
+ }
207
+ }
208
+ resetFlex() {
209
+ const layoutItems = this.layoutItems.toArray();
210
+ for (let i = 0; i < layoutItems.length; i++) {
211
+ const layoutItem = layoutItems[i];
212
+ if (layoutItem.flex) {
213
+ layoutItem.flex = undefined;
214
+ }
215
+ }
216
+ }
217
+ setLayoutDrivenType(layoutDrivenType) {
218
+ if (this.layoutDrivenType === LayoutDrivenType.ResponsiveWindowManager && layoutDrivenType === LayoutDrivenType.Default) {
219
+ this.resetFlex();
220
+ }
221
+ this.layoutDrivenType = layoutDrivenType;
222
+ }
223
+ getTotalColumnSpan(layoutItems) {
224
+ this.columnSpanTotal = 0;
225
+ layoutItems.forEach(item => this.columnSpanTotal += item.columnSpan);
226
+ }
227
+ updateCurrentLayoutDefinition(definitions, layoutWidth) {
228
+ this.currentLayoutDefinition = undefined;
229
+ for (let i = definitions.length - 1; i >= 0; i--) {
230
+ const definitionColumns = definitions[i].columns;
231
+ if (layoutWidth <= definitions[i].until || (this.tryToFillWholeRow && this.columnSpanTotal <= definitionColumns)) {
232
+ this.columnCount = definitionColumns;
233
+ this.currentLayoutDefinition = definitions[i];
234
+ }
235
+ }
236
+ }
237
+ layoutDefinitionWithColumnSpanCalculation(layoutItems, availableLayoutWidthPercentage, itemHorizontalSpacePercentage) {
238
+ var _a;
239
+ let percentageSoFar = 0;
240
+ let columnIndex = 0;
241
+ for (let i = 0; i < layoutItems.length; i++) {
242
+ let percentage = 0;
243
+ columnIndex += layoutItems[i].columnSpan;
244
+ if (columnIndex === this.columnCount) {
245
+ // If true, it means this layout item is the last one in the row.
246
+ // It ensures the last one in the row use rest of the percentage.
247
+ // Example: If it's a 3 column layout, the last one's percentage is 33.34%, not 33.33%
248
+ percentage = 100 - percentageSoFar;
249
+ percentageSoFar = 0;
250
+ // 1 column and 1 layout item.
251
+ if (columnIndex === 1 && this.columnCount === 1 && !this.noExtraRightPaddingOneItemPerRow) {
252
+ layoutItems[i].paddingRight = '0px';
253
+ }
254
+ else {
255
+ layoutItems[i].paddingRight = this.padLastItem ? this.itemHorizontalSpace + this.stylePixel : '0' + this.stylePixel;
256
+ }
257
+ columnIndex = 0;
258
+ }
259
+ else {
260
+ const columnPercentage = Math.round(availableLayoutWidthPercentage * 100 / this.columnCount) / 100;
261
+ percentage = layoutItems[i].columnSpan * (columnPercentage + itemHorizontalSpacePercentage);
262
+ percentageSoFar += percentage;
263
+ if (percentageSoFar > 100) {
264
+ // put item on next row if it is too big
265
+ if (percentage > 100) {
266
+ percentage = 100;
267
+ }
268
+ percentageSoFar = 0;
269
+ columnIndex = 0;
270
+ layoutItems[i].paddingRight = this.padLastItem ? this.itemHorizontalSpace + this.stylePixel : '0' + this.stylePixel;
271
+ }
272
+ else {
273
+ layoutItems[i].paddingRight = this.itemHorizontalSpace + this.stylePixel;
274
+ }
275
+ }
276
+ if ((_a = this === null || this === void 0 ? void 0 : this.currentLayoutDefinition) === null || _a === void 0 ? void 0 : _a.addBottomPadding) {
277
+ layoutItems[i].paddingBottom = this.itemVerticalSpace + this.stylePixel;
278
+ }
279
+ else {
280
+ // If bottom padding already exists and currentLayoutDefinition.addBottomPadding is False
281
+ // Remove the bottom padding.
282
+ if (layoutItems[i].paddingBottom === this.itemVerticalSpace + this.stylePixel) {
283
+ layoutItems[i].paddingBottom = '0' + this.stylePixel;
284
+ }
285
+ }
286
+ layoutItems[i].width = percentage + '%';
287
+ layoutItems[i].ready();
288
+ }
289
+ }
290
+ configDrivenCalculation(layoutItems, availableLayoutWidthInPixel) {
291
+ const isHybridMode = this.updateCustomConfig(layoutItems);
292
+ if (isHybridMode) {
293
+ this.configDrivenCalculationHybrid(layoutItems, availableLayoutWidthInPixel);
294
+ }
295
+ else {
296
+ this.configDrivenCalculationDefault(layoutItems, availableLayoutWidthInPixel);
297
+ }
298
+ }
299
+ /**
300
+ * It deal with configurations that only has either percentage or number.
301
+ * Aiming at performance optimization.
302
+ *
303
+ * @param layoutItems The layout item object array
304
+ * @param availableLayoutWidthInPixel available width in pixel horizontally.
305
+ */
306
+ configDrivenCalculationDefault(layoutItems, availableLayoutWidthInPixel) {
307
+ const defaultWidthForLayoutItemInPixel = 200;
308
+ let widthUsedInPixel = 0;
309
+ let percentageSoFar = 0;
310
+ for (let i = 0; i < layoutItems.length; i++) {
311
+ if (layoutItems[i].customConfig.width) {
312
+ const widthObject = layoutItems[i].customConfig.width;
313
+ const remainingWidthInPixel = availableLayoutWidthInPixel - widthUsedInPixel;
314
+ if (widthObject.type === LayoutItemConfigPropertyWidthType.Percentage) {
315
+ if (widthObject.value > 100 || widthObject.value < 0) {
316
+ widthObject.value = 100;
317
+ }
318
+ const percentage = widthObject.value;
319
+ percentageSoFar += percentage;
320
+ const paddingRight = this.itemHorizontalSpace;
321
+ layoutItems[i].paddingRight = paddingRight.toString().concat(this.stylePixel);
322
+ layoutItems[i].width = percentage + '%';
323
+ if (percentageSoFar > 100) {
85
324
  percentageSoFar = 0;
86
- // 1 column and 1 layout item.
87
- if (columnIndex === 1 && columnCount === 1 && !this.noExtraRightPaddingOneItemPerRow) {
88
- layoutItems[i].paddingRight = '0px';
89
- }
90
- else {
91
- layoutItems[i].paddingRight = this.padLastItem ? this.itemHorizontalSpace + 'px' : '0px';
92
- }
93
- columnIndex = 0;
325
+ }
326
+ }
327
+ else if (widthObject.type === LayoutItemConfigPropertyWidthType.Number) {
328
+ if (widthObject.value < 0) {
329
+ widthObject.value =
330
+ defaultWidthForLayoutItemInPixel <= remainingWidthInPixel ?
331
+ defaultWidthForLayoutItemInPixel : remainingWidthInPixel;
332
+ }
333
+ widthUsedInPixel += widthObject.value;
334
+ // how to determine if it is the last item in a row?
335
+ const paddingRight = this.itemHorizontalSpace;
336
+ widthUsedInPixel += paddingRight;
337
+ layoutItems[i].paddingRight = paddingRight.toString().concat(this.stylePixel);
338
+ layoutItems[i].width = widthObject.value + this.stylePixel;
339
+ }
340
+ else {
341
+ Logging.log({
342
+ level: LogLevel.Debug,
343
+ message: 'Invalid width',
344
+ source: 'LayoutComponent.configDrivenCalculationDefault'
345
+ });
346
+ }
347
+ }
348
+ else {
349
+ Logging.log({
350
+ level: LogLevel.Debug,
351
+ message: 'Invalid width',
352
+ source: 'LayoutComponent.configDrivenCalculationDefault'
353
+ });
354
+ }
355
+ layoutItems[i].ready();
356
+ }
357
+ }
358
+ /**
359
+ * It deal with configurations that only has both percentage and number.
360
+ * Aiming at performance optimization.
361
+ *
362
+ * @param layoutItems The layout item object array
363
+ * @param availableLayoutWidthInPixel available width in pixel horizontally.
364
+ */
365
+ configDrivenCalculationHybrid(layoutItems, availableLayoutWidthInPixel) {
366
+ const defaultWidthForLayoutItemInPixel = 200;
367
+ let widthUsedInPixel = 0;
368
+ for (let i = 0; i < layoutItems.length; i++) {
369
+ if (layoutItems[i].customConfig.width) {
370
+ const widthObject = layoutItems[i].customConfig.width;
371
+ const remainingWidthInPixel = availableLayoutWidthInPixel - widthUsedInPixel;
372
+ if (widthObject.type === LayoutItemConfigPropertyWidthType.Percentage) {
373
+ if (widthObject.value > 100 || widthObject.value < 0) {
374
+ widthObject.value = 100;
375
+ }
376
+ // how to determine if it is the last item in a row?
377
+ const paddingRight = this.itemHorizontalSpace;
378
+ widthUsedInPixel += paddingRight;
379
+ layoutItems[i].paddingRight = paddingRight.toString().concat(this.stylePixel);
380
+ let potentialWidthInPixel = (widthObject.value / 100) * remainingWidthInPixel;
381
+ if (potentialWidthInPixel === 0) {
382
+ widthUsedInPixel = 0;
383
+ widthUsedInPixel += paddingRight;
384
+ potentialWidthInPixel = (widthObject.value / 100) * (availableLayoutWidthInPixel - widthUsedInPixel);
94
385
  }
95
386
  else {
96
- const columnPercentage = Math.round(availableLayoutWidthPercentage * 100 / columnCount) / 100;
97
- percentage = layoutItems[i].columnSpan * (columnPercentage + itemHorizontalSpacePercentage);
98
- percentageSoFar += percentage;
99
- if (percentageSoFar > 100) {
100
- // put item on next row if it is too big
101
- if (percentage > 100) {
102
- percentage = 100;
103
- }
104
- percentageSoFar = 0;
105
- columnIndex = 0;
106
- layoutItems[i].paddingRight = this.padLastItem ? this.itemHorizontalSpace + 'px' : '0px';
387
+ if (potentialWidthInPixel >= remainingWidthInPixel) {
388
+ potentialWidthInPixel = remainingWidthInPixel;
389
+ // resets the used pixel for a new row.
390
+ widthUsedInPixel = 0;
107
391
  }
108
392
  else {
109
- layoutItems[i].paddingRight = this.itemHorizontalSpace + 'px';
393
+ widthUsedInPixel += potentialWidthInPixel;
110
394
  }
395
+ layoutItems[i].flex = '1 0 0';
396
+ layoutItems[i].minWidth = defaultWidthForLayoutItemInPixel.toString().concat(this.stylePixel);
111
397
  }
112
- if ((_a = this === null || this === void 0 ? void 0 : this.currentLayoutDefinition) === null || _a === void 0 ? void 0 : _a.addBottomPadding) {
113
- layoutItems[i].paddingBottom = this.itemVerticalSpace + 'px';
114
- }
115
- else {
116
- // If bottom padding already exists and currentLayoutDefinition.addBottomPadding is False
117
- // Remove the bottom padding.
118
- if (layoutItems[i].paddingBottom === this.itemVerticalSpace + 'px') {
119
- layoutItems[i].paddingBottom = 0 + 'px';
120
- }
398
+ layoutItems[i].width = potentialWidthInPixel + this.stylePixel;
399
+ }
400
+ else if (widthObject.type === LayoutItemConfigPropertyWidthType.Number) {
401
+ if (widthObject.value < 0) {
402
+ widthObject.value =
403
+ defaultWidthForLayoutItemInPixel <= remainingWidthInPixel ?
404
+ defaultWidthForLayoutItemInPixel : remainingWidthInPixel;
121
405
  }
122
- layoutItems[i].width = percentage + '%';
123
- layoutItems[i].ready();
406
+ widthUsedInPixel += widthObject.value;
407
+ // how to determine if it is the last item in a row?
408
+ const paddingRight = this.itemHorizontalSpace;
409
+ widthUsedInPixel += paddingRight;
410
+ layoutItems[i].paddingRight = paddingRight.toString().concat(this.stylePixel);
411
+ layoutItems[i].width = widthObject.value + this.stylePixel;
124
412
  }
125
- if (previousLayoutDefinition !== this.currentLayoutDefinition) {
126
- setTimeout(() => {
127
- this.layoutChanged.emit();
413
+ else {
414
+ Logging.log({
415
+ level: LogLevel.Debug,
416
+ message: 'Invalid width',
417
+ source: 'LayoutComponent.configDrivenCalculationHybrid'
128
418
  });
129
419
  }
130
420
  }
131
- });
421
+ else {
422
+ Logging.log({
423
+ level: LogLevel.Debug,
424
+ message: 'Invalid width',
425
+ source: 'LayoutComponent.configDrivenCalculationHybrid'
426
+ });
427
+ }
428
+ layoutItems[i].ready();
429
+ }
430
+ }
431
+ updateCustomConfig(layoutItems) {
432
+ const widthType = [];
433
+ for (let i = 0; i < layoutItems.length; i++) {
434
+ layoutItems[i].customConfig = this.currentLayoutItemConfig[i];
435
+ if (!widthType.includes(layoutItems[i].customConfig.width.type)) {
436
+ widthType.push(layoutItems[i].customConfig.width.type);
437
+ }
438
+ }
439
+ if (widthType.length <= 1) {
440
+ return false;
441
+ }
442
+ return true;
132
443
  }
133
444
  }
134
445
  /** @nocollapse */ LayoutComponent.ɵfac = function LayoutComponent_Factory(t) { return new (t || LayoutComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(SME_LAYOUT_PROVIDER)); };
@@ -139,10 +450,28 @@ export class LayoutComponent extends CoreBaseComponent {
139
450
  let _t;
140
451
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.layoutItems = _t);
141
452
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.definitions = _t);
142
- } }, inputs: { itemHorizontalSpace: "itemHorizontalSpace", itemVerticalSpace: "itemVerticalSpace", tryToFillWholeRow: "tryToFillWholeRow", definition: "definition", padLastItem: "padLastItem", noExtraRightPaddingOneItemPerRow: "noExtraRightPaddingOneItemPerRow" }, outputs: { layoutChanged: "layoutChanged" }, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 1, vars: 0, template: function LayoutComponent_Template(rf, ctx) { if (rf & 1) {
453
+ } }, inputs: { itemHorizontalSpace: "itemHorizontalSpace", itemVerticalSpace: "itemVerticalSpace", tryToFillWholeRow: "tryToFillWholeRow", definition: "definition", padLastItem: "padLastItem", noExtraRightPaddingOneItemPerRow: "noExtraRightPaddingOneItemPerRow", layoutConfig: "layoutConfig" }, outputs: { layoutChanged: "layoutChanged", windowBreakpointChanged: "windowBreakpointChanged" }, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 1, vars: 0, template: function LayoutComponent_Template(rf, ctx) { if (rf & 1) {
143
454
  i0.ɵɵprojectionDef(_c0);
144
455
  i0.ɵɵprojection(0);
145
456
  } }, encapsulation: 2 });
457
+ __decorate([
458
+ Debounce(),
459
+ __metadata("design:type", Function),
460
+ __metadata("design:paramtypes", []),
461
+ __metadata("design:returntype", void 0)
462
+ ], LayoutComponent.prototype, "refresh", null);
463
+ __decorate([
464
+ Debounce(),
465
+ __metadata("design:type", Function),
466
+ __metadata("design:paramtypes", []),
467
+ __metadata("design:returntype", void 0)
468
+ ], LayoutComponent.prototype, "deferredOnLayoutChanged", null);
469
+ __decorate([
470
+ Yield(),
471
+ __metadata("design:type", Function),
472
+ __metadata("design:paramtypes", []),
473
+ __metadata("design:returntype", void 0)
474
+ ], LayoutComponent.prototype, "onWindowBreakpointChanged", null);
146
475
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LayoutComponent, [{
147
476
  type: Component,
148
477
  args: [{
@@ -170,7 +499,11 @@ export class LayoutComponent extends CoreBaseComponent {
170
499
  type: Input
171
500
  }], noExtraRightPaddingOneItemPerRow: [{
172
501
  type: Input
502
+ }], layoutConfig: [{
503
+ type: Input
173
504
  }], layoutChanged: [{
174
505
  type: Output
175
- }] }); })();
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2xheW91dC9sYXlvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvbGF5b3V0L2xheW91dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEksT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFVLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDMUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7QUFFOUQ7O0dBRUc7QUFLSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxpQkFBaUI7SUF5Q2xELFlBQVksUUFBa0IsRUFBdUMsTUFBYztRQUMvRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFEaUQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXhCNUUsd0JBQW1CLEdBQUcsRUFBRSxDQUFDO1FBR3pCLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUd2QixzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFHekIsZUFBVSxHQUE0RSxFQUFFLENBQUM7UUFHekYsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFHcEIscUNBQWdDLEdBQUcsSUFBSSxDQUFDO1FBR3hDLGtCQUFhLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFRaEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJ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LFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDMUI7Z0JBRUQsSUFBSSx3QkFBd0IsS0FBSyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7b0JBQzNELFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDOUIsQ0FBQyxDQUFDLENBQUM7aUJBQ047YUFDSjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7aUdBdkpRLGVBQWUsMERBeUNnQixtQkFBbUI7dUVBekNsRCxlQUFlO29DQVFQLG1CQUFtQjtvQ0FHbkIseUJBQXlCOzs7Ozs7O1FDeEI5QyxrQkFBa0Q7O3VGRGFyQyxlQUFlO2NBSjNCLFNBQVM7ZUFBQztnQkFDUCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsV0FBVyxFQUFFLHlCQUF5QjthQUN6Qzs7c0JBMENvQyxNQUFNO3VCQUFDLG1CQUFtQjt3QkFoQ25ELFdBQVc7a0JBRGxCLGVBQWU7bUJBQUMsbUJBQW1CO1lBSTVCLFdBQVc7a0JBRGxCLGVBQWU7bUJBQUMseUJBQXlCO1lBTW5DLG1CQUFtQjtrQkFEekIsS0FBSztZQUlDLGlCQUFpQjtrQkFEdkIsS0FBSztZQUlDLGlCQUFpQjtrQkFEdkIsS0FBSztZQUlDLFVBQVU7a0JBRGhCLEtBQUs7WUFJQyxXQUFXO2tCQURqQixLQUFLO1lBSUMsZ0NBQWdDO2tCQUR0QyxLQUFLO1lBSUMsYUFBYTtrQkFEbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBPdXRwdXQsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb3JlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExheW91dCwgU01FX0xBWU9VVF9QUk9WSURFUiB9IGZyb20gJy4uL2NvbW1vbi9sYXlvdXQnO1xyXG5pbXBvcnQgeyBMYXlvdXREZWZpbml0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQtZGVmaW5pdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMYXlvdXRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQtaXRlbS5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIExheW91dCBjb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtbGF5b3V0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9sYXlvdXQuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMYXlvdXRDb21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ0xheW91dENvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZHJlbihMYXlvdXRJdGVtQ29tcG9uZW50KVxyXG4gICAgcHJpdmF0ZSBsYXlvdXRJdGVtczogUXVlcnlMaXN0PExheW91dEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oTGF5b3V0RGVmaW5pdGlvbkNvbXBvbmVudClcclxuICAgIHByaXZhdGUgZGVmaW5pdGlvbnM6IFF1ZXJ5TGlzdDxMYXlvdXREZWZpbml0aW9uQ29tcG9uZW50PjtcclxuXHJcbiAgICBwdWJsaWMgY3VycmVudExheW91dERlZmluaXRpb246IExheW91dERlZmluaXRpb25Db21wb25lbnQ7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBpdGVtSG9yaXpvbnRhbFNwYWNlID0gMzI7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBpdGVtVmVydGljYWxTcGFjZSA9IDMyO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdHJ5VG9GaWxsV2hvbGVSb3cgPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmaW5pdGlvbjogeyBbY29sdW1uQ291bnQ6IG51bWJlcl06IHsgbG93ZXJXaWR0aD86IG51bWJlciwgdXBwZXJXaWR0aD86IG51bWJlciB9IH0gPSB7fTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHBhZExhc3RJdGVtID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBub0V4dHJhUmlnaHRQYWRkaW5nT25lSXRlbVBlclJvdyA9IHRydWU7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgbGF5b3V0Q2hhbmdlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgY3VycmVudExheW91dERlZmluaXRpb25OYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudExheW91dERlZmluaXRpb24gPyB0aGlzLmN1cnJlbnRMYXlvdXREZWZpbml0aW9uLm5hbWUgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsIEBJbmplY3QoU01FX0xBWU9VVF9QUk9WSURFUikgcHJpdmF0ZSBsYXlvdXQ6IExheW91dCkge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dC5sYXlvdXRDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpKSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGF5b3V0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dEl0ZW1zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMub25MYXlvdXRDaGFuZ2VkKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9uIGxheW91dCBjaGFuZ2VkIGV2ZW50IGhhbmRsZXIsIG9jY3VycyBldmVyeSB0aW1lIHRoZSBsYXlvdXQgaGFzIGJlZW4gY2hhbmdlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uTGF5b3V0Q2hhbmdlZCgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxheW91dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZHMgY2xhc3NlcyBsaXN0ZWQgdG8gdGhlIHJvb3QgY29tcG9uZW50XHJcbiAgICAvLyBPbiBwaG9uZSBkb3duIHRoZSBmbGV4IHN0YXJ0IG5lZWRzIHRvIGJlIGZsZXggc3RhcnQgdG8gbWFrZSBzdXJlIG5vIGV4dHJhIHNwYWNlIGJlaW5nIGdlbmVyYXRlZC5cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtYXJyYW5nZS13cmFwc3RhY2staCcsICdzbWUtbGF5b3V0LXBob25lLWRvd24nXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUxheW91dCgpOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0SXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dFdpZHRoID0gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIHx8IE51bWJlci5NQVhfVkFMVUU7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29sdW1uQ291bnQgPSAxO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dEl0ZW1zID0gdGhpcy5sYXlvdXRJdGVtcy50b0FycmF5KCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29sdW1uU3BhblRvdGFsID0gMDtcclxuICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zLmZvckVhY2goaXRlbSA9PiBjb2x1bW5TcGFuVG90YWwgKz0gaXRlbS5jb2x1bW5TcGFuKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZpbml0aW9ucyA9IHRoaXMuZGVmaW5pdGlvbnMudG9BcnJheSgpLnNvcnQoKGEsIGIpID0+IGEudW50aWwgLSBiLnVudGlsKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0xheW91dERlZmluaXRpb24gPSB0aGlzLmN1cnJlbnRMYXlvdXREZWZpbml0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGF5b3V0RGVmaW5pdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBkZWZpbml0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmluaXRpb25Db2x1bW5zID0gZGVmaW5pdGlvbnNbaV0uY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGF5b3V0V2lkdGggPD0gZGVmaW5pdGlvbnNbaV0udW50aWwgfHwgKHRoaXMudHJ5VG9GaWxsV2hvbGVSb3cgJiYgY29sdW1uU3BhblRvdGFsIDw9IGRlZmluaXRpb25Db2x1bW5zKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db3VudCA9IGRlZmluaXRpb25Db2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMYXlvdXREZWZpbml0aW9uID0gZGVmaW5pdGlvbnNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Ib3Jpem9udGFsU3BhY2VQZXJjZW50YWdlID0gTWF0aC5yb3VuZCh0aGlzLml0ZW1Ib3Jpem9udGFsU3BhY2UgKiAxMDAgLyBsYXlvdXRXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5Db3VudE1vZGlmaWVyID0gdGhpcy5wYWRMYXN0SXRlbSA/IDAgOiAxO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlTGF5b3V0V2lkdGhQZXJjZW50YWdlID0gMTAwIC0gaXRlbUhvcml6b250YWxTcGFjZVBlcmNlbnRhZ2UgKiAoY29sdW1uQ291bnQgLSBjb2x1bW5Db3VudE1vZGlmaWVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcGVyY2VudGFnZVNvRmFyID0gMDtcclxuICAgICAgICAgICAgICAgIGxldCBjb2x1bW5JbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheW91dEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ICs9IGxheW91dEl0ZW1zW2ldLmNvbHVtblNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSBjb2x1bW5Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0cnVlLCBpdCBtZWFucyB0aGlzIGxheW91dCBpdGVtIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBlbnN1cmVzIHRoZSBsYXN0IG9uZSBpbiB0aGUgcm93IHVzZSByZXN0IG9mIHRoZSBwZXJjZW50YWdlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGFtcGxlOiBJZiBpdCdzIGEgMyBjb2x1bW4gbGF5b3V0LCB0aGUgbGFzdCBvbmUncyBwZXJjZW50YWdlIGlzIDMzLjM0JSwgbm90IDMzLjMzJVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwIC0gcGVyY2VudGFnZVNvRmFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlU29GYXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAxIGNvbHVtbiBhbmQgMSBsYXlvdXQgaXRlbS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSAxICYmIGNvbHVtbkNvdW50ID09PSAxICYmICF0aGlzLm5vRXh0cmFSaWdodFBhZGRpbmdPbmVJdGVtUGVyUm93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5wYWRkaW5nUmlnaHQgPSAnMHB4JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdSaWdodCA9IHRoaXMucGFkTGFzdEl0ZW0gPyB0aGlzLml0ZW1Ib3Jpem9udGFsU3BhY2UgKyAncHgnIDogJzBweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtblBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKGF2YWlsYWJsZUxheW91dFdpZHRoUGVyY2VudGFnZSAqIDEwMCAvIGNvbHVtbkNvdW50KSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSA9IGxheW91dEl0ZW1zW2ldLmNvbHVtblNwYW4gKiAoY29sdW1uUGVyY2VudGFnZSArIGl0ZW1Ib3Jpem9udGFsU3BhY2VQZXJjZW50YWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZVNvRmFyICs9IHBlcmNlbnRhZ2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVyY2VudGFnZVNvRmFyID4gMTAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXQgaXRlbSBvbiBuZXh0IHJvdyBpZiBpdCBpcyB0b28gYmlnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlU29GYXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucGFkZGluZ1JpZ2h0ID0gdGhpcy5wYWRMYXN0SXRlbSA/IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZSArICdweCcgOiAnMHB4JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdSaWdodCA9IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZSArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzPy5jdXJyZW50TGF5b3V0RGVmaW5pdGlvbj8uYWRkQm90dG9tUGFkZGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5wYWRkaW5nQm90dG9tID0gdGhpcy5pdGVtVmVydGljYWxTcGFjZSArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYm90dG9tIHBhZGRpbmcgYWxyZWFkeSBleGlzdHMgYW5kIGN1cnJlbnRMYXlvdXREZWZpbml0aW9uLmFkZEJvdHRvbVBhZGRpbmcgaXMgRmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBib3R0b20gcGFkZGluZy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheW91dEl0ZW1zW2ldLnBhZGRpbmdCb3R0b20gPT09IHRoaXMuaXRlbVZlcnRpY2FsU3BhY2UgKyAncHgnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5wYWRkaW5nQm90dG9tID0gMCArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLndpZHRoID0gcGVyY2VudGFnZSArICclJztcclxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5yZWFkeSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0xheW91dERlZmluaXRpb24gIT09IHRoaXMuY3VycmVudExheW91dERlZmluaXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDaGFuZ2VkLmVtaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIjxuZy1jb250ZW50IHNlbGVjdD1cInNtZS1sYXlvdXQtaXRlbVwiPjwvbmctY29udGVudD5cclxuIl19
506
+ }], windowBreakpointChanged: [{
507
+ type: Output
508
+ }], refresh: [], deferredOnLayoutChanged: [], onWindowBreakpointChanged: [] }); })();
509
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2xheW91dC9sYXlvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvbGF5b3V0L2xheW91dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BJLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDakcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUN2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQVUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRyxPQUFPLEVBQWtDLGdCQUFnQixFQUFvQixvQkFBb0IsRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlKLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7O0FBRW5GOztHQUVHO0FBS0gsTUFBTSxPQUFPLGVB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LENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUN2QixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7O2lHQWxoQlEsZUFBZSwwREFnSGdCLG1CQUFtQjt1RUFoSGxELGVBQWU7b0NBV1AsbUJBQW1CO29DQU1uQix5QkFBeUI7Ozs7Ozs7UUNyQzlDLGtCQUFrRDs7QUQySjlDO0lBREMsUUFBUSxFQUFFOzs7OzhDQUlWO0FBYUQ7SUFEQyxRQUFRLEVBQUU7Ozs7OERBR1Y7QUFPRDtJQURDLEtBQUssRUFBRTs7OztnRUFPUDt1RkF0S1EsZUFBZTtjQUozQixTQUFTO2VBQUM7Z0JBQ1AsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLFdBQVcsRUFBRSx5QkFBeUI7YUFDekM7O3NCQWlIb0MsTUFBTTt1QkFBQyxtQkFBbUI7d0JBcEduRCxXQUFXO2tCQURsQixlQUFlO21CQUFDLG1CQUFtQjtZQU81QixXQUFXO2tCQURsQixlQUFlO21CQUFDLHlCQUF5QjtZQVluQyxtQkFBbUI7a0JBRHpCLEtBQUs7WUFPQyxpQkFBaUI7a0JBRHZCLEtBQUs7WUFPQyxpQkFBaUI7a0JBRHZCLEtBQUs7WUFPQyxVQUFVO2tCQURoQixLQUFLO1lBT0MsV0FBVztrQkFEakIsS0FBSztZQU9DLGdDQUFnQztrQkFEdEMsS0FBSztZQWFDLFlBQVk7a0JBRGxCLEtBQUs7WUFXQyxhQUFhO2tCQURuQixNQUFNO1lBT0EsdUJBQXVCO2tCQUQ3QixNQUFNO1lBaURBLE9BQU8sTUFnQk4sdUJBQXVCLE1BU3hCLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBPdXRwdXQsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBZaWVsZCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL3lpZWxkLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kaWFnbm9zdGljcy9sb2ctbGV2ZWwnO1xyXG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kaWFnbm9zdGljcy9sb2dnaW5nJztcclxuaW1wb3J0IHsgQ29yZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMYXlvdXQsIFNNRV9MQVlPVVRfUFJPVklERVIgfSBmcm9tICcuLi9jb21tb24vbGF5b3V0JztcclxuaW1wb3J0IHsgU21lUmVzcG9uc2l2ZVdpbmRvd0JyZWFrcG9pbnRzIH0gZnJvbSAnLi4vY29tbW9uL3NtZS1yZXNwb25zaXZlLXdpbmRvdy1tYW5hZ2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExheW91dENvbmZpZywgTGF5b3V0Q29uZmlnSXRlbSwgTGF5b3V0RHJpdmVuVHlwZSwgTGF5b3V0SXRlbUNvbmZpZywgTGF5b3V0SXRlbUNvbmZpZ01vZGUsIExheW91dEl0ZW1Db25maWdQcm9wZXJ0eVdpZHRoVHlwZSB9IGZyb20gJy4vbGF5b3V0LWNvbmZpZyc7XHJcbmltcG9ydCB7IExheW91dERlZmluaXRpb25Db21wb25lbnQgfSBmcm9tICcuL2xheW91dC1kZWZpbml0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExheW91dEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2xheW91dC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExheW91dFJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyIH0gZnJvbSAnLi9sYXlvdXQtcmVzcG9uc2l2ZS13aW5kb3ctbWFuYWdlcic7XHJcblxyXG4vKipcclxuICogTGF5b3V0IGNvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1sYXlvdXQnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xheW91dC5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIExheW91dENvbXBvbmVudCBleHRlbmRzIENvcmVCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnTGF5b3V0Q29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsYXlvdXQgaXRlbXMgY29udGVudCBjaGlsZHJlbi5cclxuICAgICAqL1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihMYXlvdXRJdGVtQ29tcG9uZW50KVxyXG4gICAgcHJpdmF0ZSBsYXlvdXRJdGVtczogUXVlcnlMaXN0PExheW91dEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxheW91dCBkZWZpbml0aW9uIGNvbnRlbnQgY2hpbGRyZW4uXHJcbiAgICAgKi9cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oTGF5b3V0RGVmaW5pdGlvbkNvbXBvbmVudClcclxuICAgIHByaXZhdGUgZGVmaW5pdGlvbnM6IFF1ZXJ5TGlzdDxMYXlvdXREZWZpbml0aW9uQ29tcG9uZW50PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjdXJyZW50IGxheW91dCBkZWZpbml0aW9uIHZhbHVlIGJhc2VkIG9uIGN1c3RvbSBsYXlvdXQgZGVmaW5pdGlvbiBhbmQgdGhlIGJyb3dzZXIgd2luZG93IHNpemUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjdXJyZW50TGF5b3V0RGVmaW5pdGlvbjogTGF5b3V0RGVmaW5pdGlvbkNvbXBvbmVudDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkZWZhdWx0IGhvcml6b250YWwgc3BhY2UgaW4gYmV0d2VlbiBsYXlvdXQgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaXRlbUhvcml6b250YWxTcGFjZSA9IDMyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlZmF1bHQgdmVydGljYWwgc3BhY2UgaW4gYmV0d2VlbiBsYXlvdXQgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaXRlbVZlcnRpY2FsU3BhY2UgPSAzMjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRydWUsIHdpbGwgYWx3YXlzIHRyeSB0byBmaWxsIHRoZSB3aG9sZSByb3cgZm9yIGVhY2ggbGF5b3V0IGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdHJ5VG9GaWxsV2hvbGVSb3cgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxheW91dCBkZWZpbml0aW9uLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRlZmluaXRpb246IHsgW2NvbHVtbkNvdW50OiBudW1iZXJdOiB7IGxvd2VyV2lkdGg/OiBudW1iZXIsIHVwcGVyV2lkdGg/OiBudW1iZXIgfSB9ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBmYWxzZSwgaXQgd2lsbCBub3QgYXNzaWduIGV4dHJhIHBhZGRpbmdzIHRvIHRoZSByaWdodCBmb3IgdGhlIGxhc3QgbGF5b3V0IGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcGFkTGFzdEl0ZW0gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRydWUsIG5vdCBleHRyYSByaWdodCBwYWRkaW5nIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgaXRlbSB0aGF0IHVzZXMgdGhlIHdob2xlIHdpZHRoIG9mIHRoZSByb3cuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbm9FeHRyYVJpZ2h0UGFkZGluZ09uZUl0ZW1QZXJSb3cgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBsYXlvdXQgaXMgZm9yIHNldHRpbmdzIHdoZXJlIGl0IGNvbnRhaW5zIGEgbGVmdCBhbmQgcmlnaHQgbGF5b3V0IGl0ZW0uXHJcbiAgICAgKiBJZiB0cnVlLCB3aWxsIGFwcGx5IHNwZWNpYWwgZGVzaWduIGZvciBzZXR0aW5ncyBsYXlvdXQuXHJcbiAgICAgKiBPbiBwaG9uZS11cCwgdGhlIGxlZnQgc2lkZSBuYXZpZ2F0aW9uIGxheW91dCBpdGVtIHdpbGwgYmUgdXNpbmcgYSBmaXhlZCB3aWR0aCBieSBkZWZhdWx0IDMwMHB4LFxyXG4gICAgICogdGhlIHJpZ2h0IHNpZGUgbGF5b3V0IGl0ZW0gd2lsbCBiZSB1c2luZyB0aGUgcmVtYWluaW5nIHdpZHRoIGJ5IGRlZmF1bHQuXHJcbiAgICAgKlxyXG4gICAgICogT24gcGhvbmUtZG93biBvciA0MDAlIHpvb20sIG5vdGhpbmcgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJlZ3VsYXIgc2V0dGluZ3MgcGFnZSxcclxuICAgICAqIHRoZSBsZWZ0IHJpZ2h0IGxheW91dCB3aWxsIGJlIHRyYW5zZm9ybWVkIHRvIHRvcCBib3R0b20gbGF5b3V0LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgIFtTbWVSZXNwb25zaXZlV2luZG93QnJlYWtwb2ludHMuUGhvbmVVcF06IHsnbW9kZSc6IExheW91dEl0ZW1Db25maWdNb2RlLkRlZmF1bHR9LFxyXG4gICAgICAgIFtTbWVSZXNwb25zaXZlV2luZG93QnJlYWtwb2ludHMuUGhvbmVEb3duXTogeydtb2RlJzogTGF5b3V0SXRlbUNvbmZpZ01vZGUuRGVmYXVsdH0sXHJcbiAgICAgICAgW1NtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cy5SZWZsb3ddOiB7J21vZGUnOiBMYXlvdXRJdGVtQ29uZmlnTW9kZS5EZWZhdWx0fVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBMYXlvdXQgaW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGxheW91dENoYW5nZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBMYXlvdXQgaW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHdpbmRvd0JyZWFrcG9pbnRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBjb2x1bW5Db3VudCA9IDE7XHJcbiAgICBwcml2YXRlIGNvbHVtblNwYW5Ub3RhbCA9IDA7XHJcbiAgICBwcml2YXRlIGxheW91dFJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyOiBMYXlvdXRSZXNwb25zaXZlV2luZG93TWFuYWdlcjtcclxuICAgIHByaXZhdGUgbGF5b3V0RHJpdmVuVHlwZSA9IExheW91dERyaXZlblR5cGUuRGVmYXVsdDtcclxuICAgIHByaXZhdGUgY3VycmVudExheW91dEl0ZW1Db25maWc6IExheW91dEl0ZW1Db25maWdbXTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3R5bGVQaXhlbCA9ICdweCc7XHJcblxyXG4gICAgcHVibGljIGdldCBjdXJyZW50TGF5b3V0RGVmaW5pdGlvbk5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50TGF5b3V0RGVmaW5pdGlvbiA/IHRoaXMuY3VycmVudExheW91dERlZmluaXRpb24ubmFtZSA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgY3VycmVudExheW91dERyaXZlblR5cGUoKTogTGF5b3V0RHJpdmVuVHlwZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0RHJpdmVuVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRXaW5kb3dCcmVha3BvaW50KCk6IFNtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0UmVzcG9uc2l2ZVdpbmRvd01hbmFnZXI/LnByZXZTaXplLnNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjdXJyZW50TGF5b3V0SXRlbXMoKTogUXVlcnlMaXN0PExheW91dEl0ZW1Db21wb25lbnQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsIEBJbmplY3QoU01FX0xBWU9VVF9QUk9WSURFUikgbGF5b3V0OiBMYXlvdXQpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcblxyXG4gICAgICAgIGlmIChsYXlvdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRSZXNwb25zaXZlV2luZG93TWFuYWdlciA9IG5ldyBMYXlvdXRSZXNwb25zaXZlV2luZG93TWFuYWdlcihsYXlvdXQpO1xyXG4gICAgICAgICAgICAvLyBvbiBwYXJlbnQgbGF5b3V0IGNoYW5nZXMsIHJlLWVtaXQgdGhlIGxheW91dCBjaGFuZ2UgdG8gb3VyIGV2ZW50XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGxheW91dC5sYXlvdXRDaGFuZ2VkLnN1YnNjcmliZSgoKCkgPT4gdGhpcy5vbkxheW91dENoYW5nZWQoKSkpKTtcclxuICAgICAgICAgICAgLy8gb24gd2luZG93IGJyZWFrIHBvaW50IGNoYW5nZXMsIGVtaXQgdGhlIGV2ZW50IGFib3V0IGNyaXRpY2FsIGNsYXNzZXMgYW5kIHN0eWxpbmcgdXBkYXRlcyBzaWduYWwuXHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGxheW91dC53aW5kb3dCcmVha3BvaW50Q2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbldpbmRvd0JyZWFrcG9pbnRDaGFuZ2VkKCkpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGVmZXJyZWRPbkxheW91dENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRJdGVtcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb3BlbiBBUEkgZm9yIHJlZnJlc2hpbmcgdGhlIGNvbnRyb2wgZXh0ZXJuYWxseS5cclxuICAgICAqL1xyXG4gICAgQERlYm91bmNlKClcclxuICAgIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVzZXRGbGV4KCk7XHJcbiAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9uIGxheW91dCBjaGFuZ2VkIGV2ZW50IGhhbmRsZXIsIG9jY3VycyBldmVyeSB0aW1lIHRoZSBsYXlvdXQgaGFzIGJlZW4gY2hhbmdlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uTGF5b3V0Q2hhbmdlZCgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxheW91dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlZmVycmVkIGxheW91dCBjaGFuZ2VkIGhhbmRsZXIuXHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwcml2YXRlIGRlZmVycmVkT25MYXlvdXRDaGFuZ2VkKCkge1xyXG4gICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb24gd2luZG93IGJyZWFrcG9pbnQgY2hhbmdlZCBoYW5kbGVyLlxyXG4gICAgICogQWRkaW5nIHlpZWxkIGZvciBjb21wb25lbnQgdG8gZ2V0IEVsZW1lbnRSZWYgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXHJcbiAgICAgKi9cclxuICAgIEBZaWVsZCgpXHJcbiAgICBwdWJsaWMgb25XaW5kb3dCcmVha3BvaW50Q2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubGF5b3V0SXRlbXMgfHwgIXRoaXMubGF5b3V0SXRlbXMudG9BcnJheSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0UmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIub25XaW5kb3dTaXplQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZHMgY2xhc3NlcyBsaXN0ZWQgdG8gdGhlIHJvb3QgY29tcG9uZW50XHJcbiAgICAvLyBPbiBwaG9uZSBkb3duIHRoZSBmbGV4IHN0YXJ0IG5lZWRzIHRvIGJlIGZsZXggc3RhcnQgdG8gbWFrZSBzdXJlIG5vIGV4dHJhIHNwYWNlIGJlaW5nIGdlbmVyYXRlZC5cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtYXJyYW5nZS13cmFwc3RhY2staCcsICdzbWUtbGF5b3V0LXBob25lLWRvd24nXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUxheW91dCgpOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxheW91dEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxheW91dEl0ZW1zID0gdGhpcy5sYXlvdXRJdGVtcy50b0FycmF5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VG90YWxDb2x1bW5TcGFuKGxheW91dEl0ZW1zKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRXaW5kb3dTaXplID0gdGhpcy5sYXlvdXRSZXNwb25zaXZlV2luZG93TWFuYWdlci5wcmV2U2l6ZS5zaXplO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxheW91dENvbmZpZyhjdXJyZW50V2luZG93U2l6ZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsYXlvdXRXaWR0aCA9IHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCB8fCBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXREcml2ZW5UeXBlID09PSBMYXlvdXREcml2ZW5UeXBlLkRlZmF1bHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmluaXRpb25zID0gdGhpcy5kZWZpbml0aW9ucy50b0FycmF5KCkuc29ydCgoYSwgYikgPT4gYS51bnRpbCAtIGIudW50aWwpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNMYXlvdXREZWZpbml0aW9uID0gdGhpcy5jdXJyZW50TGF5b3V0RGVmaW5pdGlvbjtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ3VycmVudExheW91dERlZmluaXRpb24oZGVmaW5pdGlvbnMsIGxheW91dFdpZHRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtSG9yaXpvbnRhbFNwYWNlUGVyY2VudGFnZSA9IE1hdGgucm91bmQodGhpcy5pdGVtSG9yaXpvbnRhbFNwYWNlICogMTAwIC8gbGF5b3V0V2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uQ291bnRNb2RpZmllciA9IHRoaXMucGFkTGFzdEl0ZW0gPyAwIDogMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZUxheW91dFdpZHRoUGVyY2VudGFnZSA9IDEwMCAtIGl0ZW1Ib3Jpem9udGFsU3BhY2VQZXJjZW50YWdlICogKHRoaXMuY29sdW1uQ291bnQgLSBjb2x1bW5Db3VudE1vZGlmaWVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0RGVmaW5pdGlvbldpdGhDb2x1bW5TcGFuQ2FsY3VsYXRpb24obGF5b3V0SXRlbXMsIGF2YWlsYWJsZUxheW91dFdpZHRoUGVyY2VudGFnZSwgaXRlbUhvcml6b250YWxTcGFjZVBlcmNlbnRhZ2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0xheW91dERlZmluaXRpb24gIT09IHRoaXMuY3VycmVudExheW91dERlZmluaXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDaGFuZ2VkLmVtaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxheW91dERyaXZlblR5cGUgPT09IExheW91dERyaXZlblR5cGUuUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBhdmFpbGFibGVMYXlvdXRXaWR0aEluUGl4ZWwgPSBsYXlvdXRXaWR0aCAtIHRoaXMuaXRlbUhvcml6b250YWxTcGFjZTtcclxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxheW91dFdpZHRoSW5QaXhlbCA9IGF2YWlsYWJsZUxheW91dFdpZHRoSW5QaXhlbCA+IDAgPyBhdmFpbGFibGVMYXlvdXRXaWR0aEluUGl4ZWwgOiAwO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVMYXlvdXRXaWR0aEluUGl4ZWwgPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ0RyaXZlbkNhbGN1bGF0aW9uKGxheW91dEl0ZW1zLCBhdmFpbGFibGVMYXlvdXRXaWR0aEluUGl4ZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVMYXlvdXRDb25maWcoY3VycmVudFdpbmRvd1NpemU6IFNtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghY3VycmVudFdpbmRvd1NpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXREcml2ZW5UeXBlID0gTGF5b3V0RHJpdmVuVHlwZS5EZWZhdWx0O1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwaG9uZVVwID0gdGhpcy5sYXlvdXRDb25maWcuUGhvbmVVcDtcclxuICAgICAgICBjb25zdCBwaG9uZURvd24gPSB0aGlzLmxheW91dENvbmZpZy5QaG9uZURvd247XHJcbiAgICAgICAgY29uc3QgcmVmbG93ID0gdGhpcy5sYXlvdXRDb25maWcuUmVmbG93O1xyXG5cclxuICAgICAgICBpZiAoIXBob25lVXAgfHwgIXBob25lRG93biB8fCAhcmVmbG93KSB7XHJcbiAgICAgICAgICAgIExvZ2dpbmcubG9nKHtcclxuICAgICAgICAgICAgICAgIGxldmVsOiBMb2dMZXZlbC5EZWJ1ZyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGxheW91dCBjb25maWcgaGFzIGJlZW4gcGFzc2VkIGluJyxcclxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0RhdGFUYWJsZUNvbXBvbmVudC5vbkNvbnRlbnRUYWJsZVByZXNzZWQnXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdE1vZGUgPSB7J21vZGUnOiBMYXlvdXRJdGVtQ29uZmlnTW9kZS5EZWZhdWx0fTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcGhvbmVVcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb25maWcuUGhvbmVVcCA9IGRlZmF1bHRNb2RlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXBob25lRG93bikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb25maWcuUGhvbmVEb3duID0gZGVmYXVsdE1vZGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghcmVmbG93KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dENvbmZpZy5SZWZsb3cgPSBkZWZhdWx0TW9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvbmZpZzogTGF5b3V0Q29uZmlnSXRlbSA9IHRoaXMubGF5b3V0Q29uZmlnW2N1cnJlbnRXaW5kb3dTaXplXTtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRDb25maWcubW9kZSA9PT0gIExheW91dEl0ZW1Db25maWdNb2RlLkRlZmF1bHQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRMYXlvdXREcml2ZW5UeXBlKExheW91dERyaXZlblR5cGUuRGVmYXVsdCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnLm1vZGUgPT09ICBMYXlvdXRJdGVtQ29uZmlnTW9kZS5DdXN0b20gJiYgY3VycmVudENvbmZpZy5jb25maWcgJiYgY3VycmVudENvbmZpZy5jb25maWcubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0RHJpdmVuVHlwZShMYXlvdXREcml2ZW5UeXBlLlJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGF5b3V0SXRlbUNvbmZpZyA9IGN1cnJlbnRDb25maWcuY29uZmlnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0RmxleCgpIHtcclxuICAgICAgICBjb25zdCBsYXlvdXRJdGVtcyA9IHRoaXMubGF5b3V0SXRlbXMudG9BcnJheSgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbGF5b3V0SXRlbSA9IGxheW91dEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBpZiAobGF5b3V0SXRlbS5mbGV4KSB7XHJcbiAgICAgICAgICAgICAgICBsYXlvdXRJdGVtLmZsZXggPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRMYXlvdXREcml2ZW5UeXBlKGxheW91dERyaXZlblR5cGU6IExheW91dERyaXZlblR5cGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5sYXlvdXREcml2ZW5UeXBlID09PSBMYXlvdXREcml2ZW5UeXBlLlJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyICYmIGxheW91dERyaXZlblR5cGUgPT09IExheW91dERyaXZlblR5cGUuRGVmYXVsdCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0RmxleCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sYXlvdXREcml2ZW5UeXBlID0gbGF5b3V0RHJpdmVuVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFRvdGFsQ29sdW1uU3BhbihsYXlvdXRJdGVtczogTGF5b3V0SXRlbUNvbXBvbmVudFtdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5TcGFuVG90YWwgPSAwO1xyXG4gICAgICAgIGxheW91dEl0ZW1zLmZvckVhY2goaXRlbSA9PiB0aGlzLmNvbHVtblNwYW5Ub3RhbCArPSBpdGVtLmNvbHVtblNwYW4pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQ3VycmVudExheW91dERlZmluaXRpb24oXHJcbiAgICAgICAgZGVmaW5pdGlvbnM6IExheW91dERlZmluaXRpb25Db21wb25lbnRbXSxcclxuICAgICAgICBsYXlvdXRXaWR0aDogbnVtYmVyXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRMYXlvdXREZWZpbml0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBkZWZpbml0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBjb25zdCBkZWZpbml0aW9uQ29sdW1ucyA9IGRlZmluaXRpb25zW2ldLmNvbHVtbnM7XHJcbiAgICAgICAgICAgIGlmIChsYXlvdXRXaWR0aCA8PSBkZWZpbml0aW9uc1tpXS51bnRpbCB8fCAodGhpcy50cnlUb0ZpbGxXaG9sZVJvdyAmJiB0aGlzLmNvbHVtblNwYW5Ub3RhbCA8PSBkZWZpbml0aW9uQ29sdW1ucykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uQ291bnQgPSBkZWZpbml0aW9uQ29sdW1ucztcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExheW91dERlZmluaXRpb24gPSBkZWZpbml0aW9uc1tpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxheW91dERlZmluaXRpb25XaXRoQ29sdW1uU3BhbkNhbGN1bGF0aW9uKFxyXG4gICAgICAgIGxheW91dEl0ZW1zOiBMYXlvdXRJdGVtQ29tcG9uZW50W10sXHJcbiAgICAgICAgYXZhaWxhYmxlTGF5b3V0V2lkdGhQZXJjZW50YWdlOiBudW1iZXIsXHJcbiAgICAgICAgaXRlbUhvcml6b250YWxTcGFjZVBlcmNlbnRhZ2U6IG51bWJlclxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHBlcmNlbnRhZ2VTb0ZhciA9IDA7XHJcbiAgICAgICAgbGV0IGNvbHVtbkluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheW91dEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBwZXJjZW50YWdlID0gMDtcclxuICAgICAgICAgICAgY29sdW1uSW5kZXggKz0gbGF5b3V0SXRlbXNbaV0uY29sdW1uU3BhbjtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSB0aGlzLmNvbHVtbkNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0cnVlLCBpdCBtZWFucyB0aGlzIGxheW91dCBpdGVtIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgcm93LlxyXG4gICAgICAgICAgICAgICAgLy8gSXQgZW5zdXJlcyB0aGUgbGFzdCBvbmUgaW4gdGhlIHJvdyB1c2UgcmVzdCBvZiB0aGUgcGVyY2VudGFnZS5cclxuICAgICAgICAgICAgICAgIC8vIEV4YW1wbGU6IElmIGl0J3MgYSAzIGNvbHVtbiBsYXlvdXQsIHRoZSBsYXN0IG9uZSdzIHBlcmNlbnRhZ2UgaXMgMzMuMzQlLCBub3QgMzMuMzMlXHJcbiAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwIC0gcGVyY2VudGFnZVNvRmFyO1xyXG4gICAgICAgICAgICAgICAgcGVyY2VudGFnZVNvRmFyID0gMDtcclxuICAgICAgICAgICAgICAgIC8vIDEgY29sdW1uIGFuZCAxIGxheW91dCBpdGVtLlxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSAxICYmIHRoaXMuY29sdW1uQ291bnQgPT09IDEgJiYgIXRoaXMubm9FeHRyYVJpZ2h0UGFkZGluZ09uZUl0ZW1QZXJSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5wYWRkaW5nUmlnaHQgPSAnMHB4JztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucGFkZGluZ1JpZ2h0ID0gdGhpcy5wYWRMYXN0SXRlbSA/IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZSArIHRoaXMuc3R5bGVQaXhlbCA6ICcwJyArIHRoaXMuc3R5bGVQaXhlbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ID0gMDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtblBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKGF2YWlsYWJsZUxheW91dFdpZHRoUGVyY2VudGFnZSAqIDEwMCAvIHRoaXMuY29sdW1uQ291bnQpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgcGVyY2VudGFnZSA9IGxheW91dEl0ZW1zW2ldLmNvbHVtblNwYW4gKiAoY29sdW1uUGVyY2VudGFnZSArIGl0ZW1Ib3Jpem9udGFsU3BhY2VQZXJjZW50YWdlKTtcclxuICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2VTb0ZhciArPSBwZXJjZW50YWdlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwZXJjZW50YWdlU29GYXIgPiAxMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBwdXQgaXRlbSBvbiBuZXh0IHJvdyBpZiBpdCBpcyB0b28gYmlnXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSA9IDEwMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZVNvRmFyID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucGFkZGluZ1JpZ2h0ID0gdGhpcy5wYWRMYXN0SXRlbSA/IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZSArIHRoaXMuc3R5bGVQaXhlbCA6ICcwJyArIHRoaXMuc3R5bGVQaXhlbDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucGFkZGluZ1JpZ2h0ID0gdGhpcy5pdGVtSG9yaXpvbnRhbFNwYWNlICsgdGhpcy5zdHlsZVBpeGVsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcz8uY3VycmVudExheW91dERlZmluaXRpb24/LmFkZEJvdHRvbVBhZGRpbmcpIHtcclxuICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdCb3R0b20gPSB0aGlzLml0ZW1WZXJ0aWNhbFNwYWNlICsgdGhpcy5zdHlsZVBpeGVsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgYm90dG9tIHBhZGRpbmcgYWxyZWFkeSBleGlzdHMgYW5kIGN1cnJlbnRMYXlvdXREZWZpbml0aW9uLmFkZEJvdHRvbVBhZGRpbmcgaXMgRmFsc2VcclxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYm90dG9tIHBhZGRpbmcuXHJcbiAgICAgICAgICAgICAgICBpZiAobGF5b3V0SXRlbXNbaV0ucGFkZGluZ0JvdHRvbSA9PT0gdGhpcy5pdGVtVmVydGljYWxTcGFjZSArIHRoaXMuc3R5bGVQaXhlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdCb3R0b20gPSAnMCcgKyB0aGlzLnN0eWxlUGl4ZWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLndpZHRoID0gcGVyY2VudGFnZSArICclJztcclxuICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucmVhZHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25maWdEcml2ZW5DYWxjdWxhdGlvbihcclxuICAgICAgICBsYXlvdXRJdGVtczogTGF5b3V0SXRlbUNvbXBvbmVudFtdLFxyXG4gICAgICAgIGF2YWlsYWJsZUxheW91dFdpZHRoSW5QaXhlbDogbnVtYmVyXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpc0h5YnJpZE1vZGUgPSB0aGlzLnVwZGF0ZUN1c3RvbUNvbmZpZyhsYXlvdXRJdGVtcyk7XHJcblxyXG4gICAgICAgIGlmIChpc0h5YnJpZE1vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWdEcml2ZW5DYWxjdWxhdGlvbkh5YnJpZChsYXlvdXRJdGVtcywgYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ0RyaXZlbkNhbGN1bGF0aW9uRGVmYXVsdChsYXlvdXRJdGVtcywgYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBkZWFsIHdpdGggY29uZmlndXJhdGlvbnMgdGhhdCBvbmx5IGhhcyBlaXRoZXIgcGVyY2VudGFnZSBvciBudW1iZXIuXHJcbiAgICAgKiBBaW1pbmcgYXQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsYXlvdXRJdGVtcyBUaGUgbGF5b3V0IGl0ZW0gb2JqZWN0IGFycmF5XHJcbiAgICAgKiBAcGFyYW0gYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsIGF2YWlsYWJsZSB3aWR0aCBpbiBwaXhlbCBob3Jpem9udGFsbHkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uZmlnRHJpdmVuQ2FsY3VsYXRpb25EZWZhdWx0KFxyXG4gICAgICAgIGxheW91dEl0ZW1zOiBMYXlvdXRJdGVtQ29tcG9uZW50W10sXHJcbiAgICAgICAgYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsOiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aEZvckxheW91dEl0ZW1JblBpeGVsID0gMjAwO1xyXG5cclxuICAgICAgICBsZXQgd2lkdGhVc2VkSW5QaXhlbCA9IDA7XHJcbiAgICAgICAgbGV0IHBlcmNlbnRhZ2VTb0ZhciA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXlvdXRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobGF5b3V0SXRlbXNbaV0uY3VzdG9tQ29uZmlnLndpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB3aWR0aE9iamVjdCA9IGxheW91dEl0ZW1zW2ldLmN1c3RvbUNvbmZpZy53aWR0aDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1dpZHRoSW5QaXhlbCA9IGF2YWlsYWJsZUxheW91dFdpZHRoSW5QaXhlbCAtIHdpZHRoVXNlZEluUGl4ZWw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoT2JqZWN0LnR5cGUgPT09IExheW91dEl0ZW1Db25maWdQcm9wZXJ0eVdpZHRoVHlwZS5QZXJjZW50YWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoT2JqZWN0LnZhbHVlID4gMTAwIHx8IHdpZHRoT2JqZWN0LnZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aE9iamVjdC52YWx1ZSA9IDEwMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB3aWR0aE9iamVjdC52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlU29GYXIgKz0gcGVyY2VudGFnZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZ1JpZ2h0ID0gdGhpcy5pdGVtSG9yaXpvbnRhbFNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdSaWdodCA9IHBhZGRpbmdSaWdodC50b1N0cmluZygpLmNvbmNhdCh0aGlzLnN0eWxlUGl4ZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLndpZHRoID0gcGVyY2VudGFnZSArICclJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2VTb0ZhciA+IDEwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlU29GYXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGhPYmplY3QudHlwZSA9PT0gTGF5b3V0SXRlbUNvbmZpZ1Byb3BlcnR5V2lkdGhUeXBlLk51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aE9iamVjdC52YWx1ZSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhPYmplY3QudmFsdWUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFdpZHRoRm9yTGF5b3V0SXRlbUluUGl4ZWwgPD0gcmVtYWluaW5nV2lkdGhJblBpeGVsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0V2lkdGhGb3JMYXlvdXRJdGVtSW5QaXhlbCA6IHJlbWFpbmluZ1dpZHRoSW5QaXhlbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoVXNlZEluUGl4ZWwgKz0gd2lkdGhPYmplY3QudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvdyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgdGhlIGxhc3QgaXRlbSBpbiBhIHJvdz9cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nUmlnaHQgPSB0aGlzLml0ZW1Ib3Jpem9udGFsU3BhY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhVc2VkSW5QaXhlbCArPSBwYWRkaW5nUmlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdSaWdodCA9IHBhZGRpbmdSaWdodC50b1N0cmluZygpLmNvbmNhdCh0aGlzLnN0eWxlUGl4ZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLndpZHRoID0gd2lkdGhPYmplY3QudmFsdWUgKyB0aGlzLnN0eWxlUGl4ZWw7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dpbmcubG9nKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IExvZ0xldmVsLkRlYnVnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB3aWR0aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ0xheW91dENvbXBvbmVudC5jb25maWdEcml2ZW5DYWxjdWxhdGlvbkRlZmF1bHQnXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2dnaW5nLmxvZyh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IExvZ0xldmVsLkRlYnVnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIHdpZHRoJyxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdMYXlvdXRDb21wb25lbnQuY29uZmlnRHJpdmVuQ2FsY3VsYXRpb25EZWZhdWx0J1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnJlYWR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZGVhbCB3aXRoIGNvbmZpZ3VyYXRpb25zIHRoYXQgb25seSBoYXMgYm90aCBwZXJjZW50YWdlIGFuZCBudW1iZXIuXHJcbiAgICAgKiBBaW1pbmcgYXQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsYXlvdXRJdGVtcyBUaGUgbGF5b3V0IGl0ZW0gb2JqZWN0IGFycmF5XHJcbiAgICAgKiBAcGFyYW0gYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsIGF2YWlsYWJsZSB3aWR0aCBpbiBwaXhlbCBob3Jpem9udGFsbHkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uZmlnRHJpdmVuQ2FsY3VsYXRpb25IeWJyaWQoXHJcbiAgICAgICAgbGF5b3V0SXRlbXM6IExheW91dEl0ZW1Db21wb25lbnRbXSxcclxuICAgICAgICBhdmFpbGFibGVMYXlvdXRXaWR0aEluUGl4ZWw6IG51bWJlclxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoRm9yTGF5b3V0SXRlbUluUGl4ZWwgPSAyMDA7XHJcblxyXG4gICAgICAgIGxldCB3aWR0aFVzZWRJblBpeGVsID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheW91dEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChsYXlvdXRJdGVtc1tpXS5jdXN0b21Db25maWcud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoT2JqZWN0ID0gbGF5b3V0SXRlbXNbaV0uY3VzdG9tQ29uZmlnLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nV2lkdGhJblBpeGVsID0gYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsIC0gd2lkdGhVc2VkSW5QaXhlbDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAod2lkdGhPYmplY3QudHlwZSA9PT0gTGF5b3V0SXRlbUNvbmZpZ1Byb3BlcnR5V2lkdGhUeXBlLlBlcmNlbnRhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGhPYmplY3QudmFsdWUgPiAxMDAgfHwgd2lkdGhPYmplY3QudmFsdWUgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoT2JqZWN0LnZhbHVlID0gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaG93IHRvIGRldGVybWluZSBpZiBpdCBpcyB0aGUgbGFzdCBpdGVtIGluIGEgcm93P1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZGRpbmdSaWdodCA9IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZTtcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aFVzZWRJblBpeGVsICs9IHBhZGRpbmdSaWdodDtcclxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5wYWRkaW5nUmlnaHQgPSBwYWRkaW5nUmlnaHQudG9TdHJpbmcoKS5jb25jYXQodGhpcy5zdHlsZVBpeGVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvdGVudGlhbFdpZHRoSW5QaXhlbCA9ICh3aWR0aE9iamVjdC52YWx1ZSAvIDEwMCkgKiByZW1haW5pbmdXaWR0aEluUGl4ZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbFdpZHRoSW5QaXhlbCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aFVzZWRJblBpeGVsID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhVc2VkSW5QaXhlbCArPSBwYWRkaW5nUmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbFdpZHRoSW5QaXhlbCA9ICh3aWR0aE9iamVjdC52YWx1ZSAvIDEwMCkgKiAoYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsIC0gd2lkdGhVc2VkSW5QaXhlbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbFdpZHRoSW5QaXhlbCA+PSByZW1haW5pbmdXaWR0aEluUGl4ZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbFdpZHRoSW5QaXhlbCA9IHJlbWFpbmluZ1dpZHRoSW5QaXhlbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0cyB0aGUgdXNlZCBwaXhlbCBmb3IgYSBuZXcgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhVc2VkSW5QaXhlbCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aFVzZWRJblBpeGVsICs9IHBvdGVudGlhbFdpZHRoSW5QaXhlbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0uZmxleCA9ICcxIDAgMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLm1pbldpZHRoID0gZGVmYXVsdFdpZHRoRm9yTGF5b3V0SXRlbUluUGl4ZWwudG9TdHJpbmcoKS5jb25jYXQodGhpcy5zdHlsZVBpeGVsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLndpZHRoID0gcG90ZW50aWFsV2lkdGhJblBpeGVsICsgdGhpcy5zdHlsZVBpeGVsO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aWR0aE9iamVjdC50eXBlID09PSBMYXlvdXRJdGVtQ29uZmlnUHJvcGVydHlXaWR0aFR5cGUuTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoT2JqZWN0LnZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aE9iamVjdC52YWx1ZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0V2lkdGhGb3JMYXlvdXRJdGVtSW5QaXhlbCA8PSByZW1haW5pbmdXaWR0aEluUGl4ZWwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRXaWR0aEZvckxheW91dEl0ZW1JblBpeGVsIDogcmVtYWluaW5nV2lkdGhJblBpeGVsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhVc2VkSW5QaXhlbCArPSB3aWR0aE9iamVjdC52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaG93IHRvIGRldGVybWluZSBpZiBpdCBpcyB0aGUgbGFzdCBpdGVtIGluIGEgcm93P1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZGRpbmdSaWdodCA9IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZTtcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aFVzZWRJblBpeGVsICs9IHBhZGRpbmdSaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucGFkZGluZ1JpZ2h0ID0gcGFkZGluZ1JpZ2h0LnRvU3RyaW5nKCkuY29uY2F0KHRoaXMuc3R5bGVQaXhlbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ud2lkdGggPSB3aWR0aE9iamVjdC52YWx1ZSArIHRoaXMuc3R5bGVQaXhlbDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2luZy5sb2coe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogTG9nTGV2ZWwuRGVidWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIHdpZHRoJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnTGF5b3V0Q29tcG9uZW50LmNvbmZpZ0RyaXZlbkNhbGN1bGF0aW9uSHlicmlkJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nZ2luZy5sb2coe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiBMb2dMZXZlbC5EZWJ1ZyxcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB3aWR0aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnTGF5b3V0Q29tcG9uZW50LmNvbmZpZ0RyaXZlbkNhbGN1bGF0aW9uSHlicmlkJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnJlYWR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQ3VzdG9tQ29uZmlnKGxheW91dEl0ZW1zOiBMYXlvdXRJdGVtQ29tcG9uZW50W10pOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCB3aWR0aFR5cGUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheW91dEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLmN1c3RvbUNvbmZpZyA9IHRoaXMuY3VycmVudExheW91dEl0ZW1Db25maWdbaV07XHJcbiAgICAgICAgICAgIGlmICghd2lkdGhUeXBlLmluY2x1ZGVzKGxheW91dEl0ZW1zW2ldLmN1c3RvbUNvbmZpZy53aWR0aC50eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgd2lkdGhUeXBlLnB1c2gobGF5b3V0SXRlbXNbaV0uY3VzdG9tQ29uZmlnLndpZHRoLnR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2lkdGhUeXBlLmxlbmd0aCA8PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG59XHJcbiIsIjxuZy1jb250ZW50IHNlbGVjdD1cInNtZS1sYXlvdXQtaXRlbVwiPjwvbmctY29udGVudD5cclxuIl19