@skyux/tabs 7.0.0-beta.1 → 7.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/documentation.json +970 -830
  2. package/esm2020/lib/modules/sectioned-form/sectioned-form-section.component.mjs +20 -14
  3. package/esm2020/lib/modules/sectioned-form/sectioned-form.component.mjs +25 -19
  4. package/esm2020/lib/modules/sectioned-form/sectioned-form.service.mjs +1 -1
  5. package/esm2020/lib/modules/shared/sky-tabs-resources.module.mjs +9 -1
  6. package/esm2020/lib/modules/tabs/tab-button-view-model.mjs +1 -1
  7. package/esm2020/lib/modules/tabs/tab-button.component.mjs +48 -10
  8. package/esm2020/lib/modules/tabs/tab.component.mjs +73 -33
  9. package/esm2020/lib/modules/tabs/tabs.module.mjs +5 -2
  10. package/esm2020/lib/modules/tabs/tabset-adapter.service.mjs +34 -22
  11. package/esm2020/lib/modules/tabs/tabset-nav-button-disabled.pipe.mjs +22 -0
  12. package/esm2020/lib/modules/tabs/tabset-nav-button.component.mjs +32 -42
  13. package/esm2020/lib/modules/tabs/tabset-permalink.service.mjs +41 -35
  14. package/esm2020/lib/modules/tabs/tabset-tab-indexes-change.mjs +1 -1
  15. package/esm2020/lib/modules/tabs/tabset.component.mjs +219 -226
  16. package/esm2020/lib/modules/tabs/tabset.service.mjs +67 -51
  17. package/esm2020/lib/modules/vertical-tabset/vertical-tab-media-query.service.mjs +11 -12
  18. package/esm2020/lib/modules/vertical-tabset/vertical-tab.component.mjs +67 -54
  19. package/esm2020/lib/modules/vertical-tabset/vertical-tabset-adapter.service.mjs +11 -8
  20. package/esm2020/lib/modules/vertical-tabset/vertical-tabset-group.component.mjs +28 -34
  21. package/esm2020/lib/modules/vertical-tabset/vertical-tabset.component.mjs +23 -20
  22. package/esm2020/lib/modules/vertical-tabset/vertical-tabset.service.mjs +55 -56
  23. package/esm2020/testing/tabs/tab-fixture-tab.mjs +1 -1
  24. package/esm2020/testing/tabs/tabset-fixture.mjs +44 -47
  25. package/fesm2015/skyux-tabs-testing.mjs +47 -49
  26. package/fesm2015/skyux-tabs-testing.mjs.map +1 -1
  27. package/fesm2015/skyux-tabs.mjs +764 -624
  28. package/fesm2015/skyux-tabs.mjs.map +1 -1
  29. package/fesm2020/skyux-tabs-testing.mjs +43 -46
  30. package/fesm2020/skyux-tabs-testing.mjs.map +1 -1
  31. package/fesm2020/skyux-tabs.mjs +867 -731
  32. package/fesm2020/skyux-tabs.mjs.map +1 -1
  33. package/lib/modules/sectioned-form/sectioned-form-section.component.d.ts +7 -10
  34. package/lib/modules/sectioned-form/sectioned-form.component.d.ts +4 -6
  35. package/lib/modules/sectioned-form/sectioned-form.service.d.ts +4 -4
  36. package/lib/modules/tabs/tab-button-view-model.d.ts +7 -5
  37. package/lib/modules/tabs/tab-button.component.d.ts +17 -11
  38. package/lib/modules/tabs/tab.component.d.ts +13 -18
  39. package/lib/modules/tabs/tabs.module.d.ts +9 -8
  40. package/lib/modules/tabs/tabset-adapter.service.d.ts +5 -10
  41. package/lib/modules/tabs/tabset-nav-button-disabled.pipe.d.ts +8 -0
  42. package/lib/modules/tabs/tabset-nav-button.component.d.ts +8 -5
  43. package/lib/modules/tabs/tabset-permalink.service.d.ts +3 -11
  44. package/lib/modules/tabs/tabset-tab-indexes-change.d.ts +2 -2
  45. package/lib/modules/tabs/tabset.component.d.ts +9 -56
  46. package/lib/modules/tabs/tabset.service.d.ts +8 -12
  47. package/lib/modules/vertical-tabset/vertical-tab-media-query.service.d.ts +2 -3
  48. package/lib/modules/vertical-tabset/vertical-tab.component.d.ts +13 -22
  49. package/lib/modules/vertical-tabset/vertical-tabset-adapter.service.d.ts +1 -2
  50. package/lib/modules/vertical-tabset/vertical-tabset-group.component.d.ts +7 -11
  51. package/lib/modules/vertical-tabset/vertical-tabset.component.d.ts +10 -13
  52. package/lib/modules/vertical-tabset/vertical-tabset.service.d.ts +10 -17
  53. package/package.json +9 -9
  54. package/testing/tabs/tab-fixture-tab.d.ts +3 -3
  55. package/testing/tabs/tabset-fixture.d.ts +3 -9
@@ -1,6 +1,6 @@
1
- var _SkyTabsetComponent__hasFinishButton;
1
+ var _SkyTabsetComponent_instances, _SkyTabsetComponent_ngUnsubscribe, _SkyTabsetComponent_tabComponentsChangeUnsubscribe, _SkyTabsetComponent_tabComponentsStateChangeUnsubscribe, _SkyTabsetComponent__active, _SkyTabsetComponent__permalinkId, _SkyTabsetComponent__tabs, _SkyTabsetComponent__tabDisplayMode, _SkyTabsetComponent__tabStyle, _SkyTabsetComponent_changeDetector, _SkyTabsetComponent_elementRef, _SkyTabsetComponent_adapterService, _SkyTabsetComponent_permalinkService, _SkyTabsetComponent_tabsetService, _SkyTabsetComponent_getInitialTabIndex, _SkyTabsetComponent_listenActiveIndexChange, _SkyTabsetComponent_listenTabComponentsStateChange, _SkyTabsetComponent_initTabComponents, _SkyTabsetComponent_resetTabComponents, _SkyTabsetComponent_emitTabIndexChange, _SkyTabsetComponent_unsubscribeTabComponentsStateChange, _SkyTabsetComponent_listenTabButtonsOverflowChange, _SkyTabsetComponent_listenLocationPopStateChange, _SkyTabsetComponent_setActiveTabIndexByPermalinkId, _SkyTabsetComponent_getActiveTabIndexByPermalinkId, _SkyTabsetComponent_getActiveTabComponent, _SkyTabsetComponent_createTabButtons, _SkyTabsetComponent_updateTabButtons, _SkyTabsetComponent_updateTabsetComponent;
2
2
  import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Input, Output, QueryList, ViewEncapsulation, } from '@angular/core';
3
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
4
4
  import { Subject, combineLatest, race } from 'rxjs';
5
5
  import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
6
6
  import { SkyTabComponent } from './tab.component';
@@ -17,14 +17,9 @@ import * as i6 from "@skyux/indicators";
17
17
  import * as i7 from "@skyux/theme";
18
18
  import * as i8 from "./tab-button.component";
19
19
  import * as i9 from "@skyux/i18n";
20
- const DEFAULT_ELEMENT_ROLE = 'tablist';
21
20
  export class SkyTabsetComponent {
22
21
  constructor(changeDetector, elementRef, adapterService, permalinkService, tabsetService) {
23
- this.changeDetector = changeDetector;
24
- this.elementRef = elementRef;
25
- this.adapterService = adapterService;
26
- this.permalinkService = permalinkService;
27
- this.tabsetService = tabsetService;
22
+ _SkyTabsetComponent_instances.add(this);
28
23
  /**
29
24
  * Fires when the active tab changes. This event emits the index of the active tab.
30
25
  */
@@ -46,42 +41,57 @@ export class SkyTabsetComponent {
46
41
  * This event only applies when `tabStyle` is `"tabs"`.
47
42
  */
48
43
  this.tabIndexesChange = new EventEmitter();
44
+ this.dropdownTriggerButtonText = '';
49
45
  this.tabButtons = [];
50
- this.elementRole = DEFAULT_ELEMENT_ROLE;
51
- this.ngUnsubscribe = new Subject();
52
- this.tabComponentsStateChangeUnsubscribe = new Subject();
53
- _SkyTabsetComponent__hasFinishButton.set(this, false);
46
+ _SkyTabsetComponent_ngUnsubscribe.set(this, new Subject());
47
+ _SkyTabsetComponent_tabComponentsChangeUnsubscribe.set(this, new Subject());
48
+ _SkyTabsetComponent_tabComponentsStateChangeUnsubscribe.set(this, new Subject());
49
+ _SkyTabsetComponent__active.set(this, void 0);
50
+ _SkyTabsetComponent__permalinkId.set(this, '');
51
+ _SkyTabsetComponent__tabs.set(this, void 0);
52
+ _SkyTabsetComponent__tabDisplayMode.set(this, 'tabs');
53
+ _SkyTabsetComponent__tabStyle.set(this, 'tabs');
54
+ _SkyTabsetComponent_changeDetector.set(this, void 0);
55
+ _SkyTabsetComponent_elementRef.set(this, void 0);
56
+ _SkyTabsetComponent_adapterService.set(this, void 0);
57
+ _SkyTabsetComponent_permalinkService.set(this, void 0);
58
+ _SkyTabsetComponent_tabsetService.set(this, void 0);
59
+ __classPrivateFieldSet(this, _SkyTabsetComponent_changeDetector, changeDetector, "f");
60
+ __classPrivateFieldSet(this, _SkyTabsetComponent_elementRef, elementRef, "f");
61
+ __classPrivateFieldSet(this, _SkyTabsetComponent_adapterService, adapterService, "f");
62
+ __classPrivateFieldSet(this, _SkyTabsetComponent_permalinkService, permalinkService, "f");
63
+ __classPrivateFieldSet(this, _SkyTabsetComponent_tabsetService, tabsetService, "f");
54
64
  }
55
65
  /**
56
66
  * Activates a tab by its `tabIndex` property.
57
67
  */
58
68
  set active(value) {
59
69
  if (value === undefined ||
60
- this.tabsetService.tabIndexesEqual(value, this._active)) {
70
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").tabIndexesEqual(value, __classPrivateFieldGet(this, _SkyTabsetComponent__active, "f"))) {
61
71
  return;
62
72
  }
63
- this._active = value;
73
+ __classPrivateFieldSet(this, _SkyTabsetComponent__active, value, "f");
64
74
  if (this.tabs) {
65
- this.tabsetService.setActiveTabIndex(value);
75
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").setActiveTabIndex(value);
66
76
  }
67
77
  else {
68
78
  // On init, wait for children tabs to render before broadcasting the active tab index.
69
79
  setTimeout(() => {
70
- if (this.tabsetService.isValidTabIndex(value)) {
80
+ if (__classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").isValidTabIndex(value)) {
71
81
  // On init, yield to the permalink ID, if it exists.
72
- if (this.getActiveTabIndexByPermalinkId() === undefined) {
73
- this.tabsetService.setActiveTabIndex(value);
82
+ if (__classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_getActiveTabIndexByPermalinkId).call(this) === undefined) {
83
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").setActiveTabIndex(value);
74
84
  }
75
85
  }
76
86
  else {
77
87
  // Activate the first tab if the new tab index is invalid.
78
- this._active = this.tabsetService.activateFirstTab();
88
+ __classPrivateFieldSet(this, _SkyTabsetComponent__active, __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").activateFirstTab(), "f");
79
89
  }
80
90
  });
81
91
  }
82
92
  }
83
93
  get active() {
84
- return this._active;
94
+ return __classPrivateFieldGet(this, _SkyTabsetComponent__active, "f");
85
95
  }
86
96
  /**
87
97
  * Distinguishes a tabset's unique state in the URL by generating a query parameter
@@ -92,78 +102,86 @@ export class SkyTabsetComponent {
92
102
  */
93
103
  set permalinkId(value) {
94
104
  if (!value) {
95
- return;
105
+ __classPrivateFieldSet(this, _SkyTabsetComponent__permalinkId, '', "f");
106
+ }
107
+ else {
108
+ const sanitized = __classPrivateFieldGet(this, _SkyTabsetComponent_permalinkService, "f").urlify(value);
109
+ __classPrivateFieldSet(this, _SkyTabsetComponent__permalinkId, `${sanitized}-active-tab`, "f");
96
110
  }
97
- const sanitized = this.permalinkService.urlify(value);
98
- this._permalinkId = `${sanitized}-active-tab`;
99
111
  }
100
112
  get permalinkId() {
101
- return this._permalinkId || '';
113
+ return __classPrivateFieldGet(this, _SkyTabsetComponent__permalinkId, "f");
102
114
  }
103
115
  /**
104
116
  * Specifies the behavior for a series of tabs.
105
117
  * @default "tabs"
106
118
  */
107
119
  set tabStyle(value) {
108
- this._tabStyle = value;
109
- this.elementRole = value === 'tabs' ? DEFAULT_ELEMENT_ROLE : undefined;
120
+ __classPrivateFieldSet(this, _SkyTabsetComponent__tabStyle, value || 'tabs', "f");
110
121
  }
111
122
  get tabStyle() {
112
- return this._tabStyle || 'tabs';
123
+ return __classPrivateFieldGet(this, _SkyTabsetComponent__tabStyle, "f");
113
124
  }
114
125
  set tabDisplayMode(value) {
115
- this._tabDisplayMode = value;
116
- this.changeDetector.markForCheck();
126
+ __classPrivateFieldSet(this, _SkyTabsetComponent__tabDisplayMode, value, "f");
127
+ __classPrivateFieldGet(this, _SkyTabsetComponent_changeDetector, "f").markForCheck();
117
128
  }
118
129
  get tabDisplayMode() {
119
- return this._tabDisplayMode || 'tabs';
130
+ return __classPrivateFieldGet(this, _SkyTabsetComponent__tabDisplayMode, "f");
120
131
  }
121
- get hasFinishButton() {
122
- return __classPrivateFieldGet(this, _SkyTabsetComponent__hasFinishButton, "f");
132
+ set tabs(value) {
133
+ __classPrivateFieldSet(this, _SkyTabsetComponent__tabs, value, "f");
134
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabComponentsChangeUnsubscribe, "f").next();
135
+ value?.changes
136
+ .pipe(takeUntil(__classPrivateFieldGet(this, _SkyTabsetComponent_tabComponentsChangeUnsubscribe, "f")))
137
+ .subscribe(() => {
138
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_resetTabComponents).call(this);
139
+ });
123
140
  }
124
- set hasFinishButton(value) {
125
- __classPrivateFieldSet(this, _SkyTabsetComponent__hasFinishButton, value, "f");
141
+ get tabs() {
142
+ return __classPrivateFieldGet(this, _SkyTabsetComponent__tabs, "f");
126
143
  }
127
144
  ngAfterViewInit() {
128
- this.initTabComponents();
129
- this.listenTabComponentsStructuralChange();
130
- const initialTabIndex = this.getInitialTabIndex();
131
- this.tabsetService.setActiveTabIndex(initialTabIndex);
132
- this.listenTabButtonsOverflowChange();
133
- this.listenLocationPopStateChange();
145
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_initTabComponents).call(this);
146
+ const initialTabIndex = __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_getInitialTabIndex).call(this);
147
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").setActiveTabIndex(initialTabIndex);
148
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_listenTabButtonsOverflowChange).call(this);
149
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_listenLocationPopStateChange).call(this);
134
150
  // If the currently active tab is getting unregistered, activate the next one.
135
- this.tabsetService.activeTabUnregistered
136
- .pipe(takeUntil(this.ngUnsubscribe))
151
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").activeTabUnregistered
152
+ .pipe(takeUntil(__classPrivateFieldGet(this, _SkyTabsetComponent_ngUnsubscribe, "f")))
137
153
  .subscribe((tab) => {
138
154
  // Wait for the new tabs to render before activating.
139
155
  setTimeout(() => {
140
- this.tabsetService.activateNearestTab(tab.arrayIndex);
156
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").activateNearestTab(tab.arrayIndex);
141
157
  });
142
158
  });
143
159
  // Let the tabset render the initial active index before listening for changes.
144
160
  setTimeout(() => {
145
- this.listenTabComponentsStateChange();
146
- this.listenActiveIndexChange();
147
- this.permalinkService.init();
161
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_listenTabComponentsStateChange).call(this);
162
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_listenActiveIndexChange).call(this);
163
+ __classPrivateFieldGet(this, _SkyTabsetComponent_permalinkService, "f").init();
148
164
  });
149
165
  }
150
166
  ngOnDestroy() {
151
- this.ngUnsubscribe.next();
152
- this.ngUnsubscribe.complete();
153
- this.unsubscribeTabComponentsStateChange();
167
+ __classPrivateFieldGet(this, _SkyTabsetComponent_ngUnsubscribe, "f").next();
168
+ __classPrivateFieldGet(this, _SkyTabsetComponent_ngUnsubscribe, "f").complete();
169
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabComponentsChangeUnsubscribe, "f").next();
170
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabComponentsChangeUnsubscribe, "f").complete();
171
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_unsubscribeTabComponentsStateChange).call(this);
154
172
  if (this.permalinkId) {
155
- this.permalinkService.clearParam(this.permalinkId);
173
+ __classPrivateFieldGet(this, _SkyTabsetComponent_permalinkService, "f").clearParam(this.permalinkId);
156
174
  }
157
175
  }
158
176
  onWindowResize() {
159
- this.adapterService.detectOverflow();
177
+ __classPrivateFieldGet(this, _SkyTabsetComponent_adapterService, "f").detectOverflow();
160
178
  }
161
179
  onTabCloseClick(tabButton) {
162
- const tabComponent = this.tabs.find((tab) => this.tabsetService.tabIndexesEqual(tab.tabIndex, tabButton.tabIndex));
163
- tabComponent.close.emit();
180
+ const tabComponent = this.tabs?.find((tab) => __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").tabIndexesEqual(tab.tabIndex, tabButton.tabIndex));
181
+ tabComponent?.close.emit();
164
182
  }
165
183
  onTabButtonClick(tabButton) {
166
- this.tabsetService.setActiveTabIndex(tabButton.tabIndex);
184
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").setActiveTabIndex(tabButton.tabIndex);
167
185
  }
168
186
  onNewTabClick() {
169
187
  this.newTab.emit();
@@ -172,225 +190,200 @@ export class SkyTabsetComponent {
172
190
  this.openTab.emit();
173
191
  }
174
192
  onRightKeyDown() {
175
- this.tabsetService.focusNextTabBtn(this.tabButtons);
193
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").focusNextTabBtn(this.tabButtons);
176
194
  }
177
195
  onLeftKeyDown() {
178
- this.tabsetService.focusPrevTabBtn(this.tabButtons);
196
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").focusPrevTabBtn(this.tabButtons);
179
197
  }
180
198
  onHomeKeyDown() {
181
- this.tabsetService.focusFirstOrNearestTabBtn(this.tabButtons);
199
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").focusFirstOrNearestTabBtn(this.tabButtons);
182
200
  }
183
201
  onEndKeyDown() {
184
- this.tabsetService.focusLastOrNearestTabBtn(this.tabButtons);
202
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").focusLastOrNearestTabBtn(this.tabButtons);
185
203
  }
186
- /**
187
- * Sets the initial active tab index based on the following criteria.
188
- * 1. Does the URL include a query param that reflects this tabset's active tab?
189
- * 2. Does one of the tab components have their `active` property set to `true`?
190
- * 3. Is the tabset component's `active` property set to a specific tab index?
191
- */
192
- getInitialTabIndex() {
193
- let activeIndex = this.getActiveTabIndexByPermalinkId();
204
+ }
205
+ _SkyTabsetComponent_ngUnsubscribe = new WeakMap(), _SkyTabsetComponent_tabComponentsChangeUnsubscribe = new WeakMap(), _SkyTabsetComponent_tabComponentsStateChangeUnsubscribe = new WeakMap(), _SkyTabsetComponent__active = new WeakMap(), _SkyTabsetComponent__permalinkId = new WeakMap(), _SkyTabsetComponent__tabs = new WeakMap(), _SkyTabsetComponent__tabDisplayMode = new WeakMap(), _SkyTabsetComponent__tabStyle = new WeakMap(), _SkyTabsetComponent_changeDetector = new WeakMap(), _SkyTabsetComponent_elementRef = new WeakMap(), _SkyTabsetComponent_adapterService = new WeakMap(), _SkyTabsetComponent_permalinkService = new WeakMap(), _SkyTabsetComponent_tabsetService = new WeakMap(), _SkyTabsetComponent_instances = new WeakSet(), _SkyTabsetComponent_getInitialTabIndex = function _SkyTabsetComponent_getInitialTabIndex() {
206
+ let activeIndex = __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_getActiveTabIndexByPermalinkId).call(this);
207
+ if (activeIndex === undefined) {
208
+ activeIndex = __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_getActiveTabComponent).call(this)?.tabIndex;
194
209
  if (activeIndex === undefined) {
195
- activeIndex = this.getActiveTabComponent()?.tabIndex;
196
- if (activeIndex === undefined) {
197
- activeIndex = this.active;
198
- }
210
+ activeIndex = this.active;
199
211
  }
200
- return activeIndex;
201
- }
202
- listenActiveIndexChange() {
203
- this.tabsetService.activeTabIndex
204
- .pipe(distinctUntilChanged(), takeUntil(this.ngUnsubscribe))
205
- .subscribe((activeIndex) => {
206
- this.updateTabsetComponent(activeIndex);
207
- });
208
- }
209
- listenTabComponentsStructuralChange() {
210
- this.tabs.changes.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
211
- this.resetTabComponents();
212
- });
213
212
  }
214
- listenTabComponentsStateChange() {
213
+ return activeIndex;
214
+ }, _SkyTabsetComponent_listenActiveIndexChange = function _SkyTabsetComponent_listenActiveIndexChange() {
215
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").activeTabIndex
216
+ .pipe(distinctUntilChanged(), takeUntil(__classPrivateFieldGet(this, _SkyTabsetComponent_ngUnsubscribe, "f")))
217
+ .subscribe((activeIndex) => {
218
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_updateTabsetComponent).call(this, activeIndex);
219
+ });
220
+ }, _SkyTabsetComponent_listenTabComponentsStateChange = function _SkyTabsetComponent_listenTabComponentsStateChange() {
221
+ if (this.tabs) {
215
222
  combineLatest(this.tabs.map((tab) => tab.activeChange))
216
- .pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
223
+ .pipe(takeUntil(race(__classPrivateFieldGet(this, _SkyTabsetComponent_tabComponentsStateChangeUnsubscribe, "f"), __classPrivateFieldGet(this, _SkyTabsetComponent_ngUnsubscribe, "f"))))
217
224
  .subscribe(() => {
218
225
  // Wait for the tab components to render changes before finding the active one.
219
226
  setTimeout(() => {
220
- const tabIndex = this.getActiveTabComponent()?.tabIndex;
221
- this.tabsetService.setActiveTabIndex(tabIndex);
227
+ const tabIndex = __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_getActiveTabComponent).call(this)?.tabIndex;
228
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").setActiveTabIndex(tabIndex);
222
229
  });
223
230
  });
224
231
  combineLatest(this.tabs.map((tab) => tab.tabIndexChange))
225
- .pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
232
+ .pipe(takeUntil(race(__classPrivateFieldGet(this, _SkyTabsetComponent_tabComponentsStateChangeUnsubscribe, "f"), __classPrivateFieldGet(this, _SkyTabsetComponent_ngUnsubscribe, "f"))))
226
233
  .subscribe(() => {
227
234
  // Don't emit the first change.
228
235
  if (this.lastActiveTabIndex !== undefined) {
229
236
  // Wait for the tab components to render changes before updating the view.
230
237
  setTimeout(() => {
231
- this.updateTabsetComponent(this.tabsetService.currentActiveTabIndex, true);
232
- this.emitTabIndexChange();
238
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_updateTabsetComponent).call(this, __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").currentActiveTabIndex, true);
239
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_emitTabIndexChange).call(this);
233
240
  });
234
241
  }
235
242
  });
236
243
  combineLatest(this.tabs.map((tab) => tab.stateChange))
237
- .pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
244
+ .pipe(takeUntil(race(__classPrivateFieldGet(this, _SkyTabsetComponent_tabComponentsStateChangeUnsubscribe, "f"), __classPrivateFieldGet(this, _SkyTabsetComponent_ngUnsubscribe, "f"))))
238
245
  .subscribe(() => {
239
246
  // Wait for the tab components to render changes before finding the active one.
240
247
  setTimeout(() => {
241
- this.updateTabsetComponent(this.tabsetService.currentActiveTabIndex, true);
248
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_updateTabsetComponent).call(this, __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").currentActiveTabIndex, true);
242
249
  });
243
250
  });
244
251
  }
245
- initTabComponents() {
246
- this.tabs.forEach((tab) => tab.init());
247
- }
248
- resetTabComponents() {
249
- this.unsubscribeTabComponentsStateChange();
250
- this.tabsetService.unregisterAll();
251
- // If there are no tab components, do a hard reset of the view.
252
- if (this.tabs.length === 0) {
253
- this.updateTabsetComponent(0, true);
254
- return;
255
- }
256
- this.initTabComponents();
257
- const activeIndex = this.getActiveTabComponent()?.tabIndex;
258
- this.tabsetService.setActiveTabIndex(activeIndex, {
259
- emitChange: false,
260
- });
261
- this.listenTabComponentsStateChange();
262
- }
263
- emitTabIndexChange() {
264
- this.tabIndexesChange.emit({
265
- tabs: this.tabs.map((tab) => ({
266
- tabHeading: tab.tabHeading,
267
- tabIndex: tab.tabIndex,
268
- })),
269
- });
270
- }
271
- unsubscribeTabComponentsStateChange() {
272
- this.tabComponentsStateChangeUnsubscribe.next();
273
- this.tabComponentsStateChangeUnsubscribe.complete();
274
- this.tabComponentsStateChangeUnsubscribe = new Subject();
275
- }
276
- listenTabButtonsOverflowChange() {
277
- this.adapterService.registerTabset(this.elementRef);
278
- this.adapterService.overflowChange
279
- .pipe(takeUntil(this.ngUnsubscribe))
280
- .subscribe((isOverflowing) => {
281
- this.tabDisplayMode = isOverflowing ? 'dropdown' : 'tabs';
282
- this.changeDetector.markForCheck();
283
- });
284
- }
285
- /**
286
- * Listen for back/forward history button presses to detect query param changes in the URL.
287
- */
288
- listenLocationPopStateChange() {
289
- this.permalinkService.popStateChange
290
- .pipe(takeUntil(this.ngUnsubscribe))
291
- .subscribe(() => {
292
- this.setActiveTabIndexByPermalinkId();
293
- });
294
- }
295
- setActiveTabIndexByPermalinkId() {
296
- const activeIndex = this.getActiveTabIndexByPermalinkId();
297
- this.tabsetService.setActiveTabIndex(activeIndex);
298
- }
299
- getActiveTabIndexByPermalinkId() {
300
- if (this.permalinkId) {
301
- const paramValue = this.permalinkService.getParam(this.permalinkId);
302
- if (paramValue) {
303
- return this.tabs.find((tab) => tab.permalinkValue === paramValue)
304
- ?.tabIndex;
305
- }
306
- }
307
- }
308
- getActiveTabComponent() {
309
- return this.tabs
310
- .toArray()
311
- .reverse()
312
- .find((tab) => tab.active === true);
313
- }
314
- createTabButtons(activeIndex) {
315
- return this.tabs.map((tab) => ({
316
- active: this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex),
317
- closeable: tab.closeable,
318
- ariaControls: tab.tabPanelId,
319
- disabled: tab.disabled,
320
- buttonHref: tab.disabled
321
- ? null
322
- : this.permalinkService.getParamHref(this.permalinkId, tab.permalinkValue),
323
- buttonId: tab.tabButtonId,
324
- buttonTextCount: tab.tabHeaderCount,
325
- buttonText: tab.tabHeading,
252
+ }, _SkyTabsetComponent_initTabComponents = function _SkyTabsetComponent_initTabComponents() {
253
+ this.tabs?.forEach((tab) => tab.init());
254
+ }, _SkyTabsetComponent_resetTabComponents = function _SkyTabsetComponent_resetTabComponents() {
255
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_unsubscribeTabComponentsStateChange).call(this);
256
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").unregisterAll();
257
+ // If there are no tab components, do a hard reset of the view.
258
+ if (this.tabs?.length === 0) {
259
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_updateTabsetComponent).call(this, 0, true);
260
+ return;
261
+ }
262
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_initTabComponents).call(this);
263
+ const activeIndex = __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_getActiveTabComponent).call(this)?.tabIndex;
264
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").setActiveTabIndex(activeIndex, {
265
+ emitChange: false,
266
+ });
267
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_listenTabComponentsStateChange).call(this);
268
+ }, _SkyTabsetComponent_emitTabIndexChange = function _SkyTabsetComponent_emitTabIndexChange() {
269
+ this.tabIndexesChange.emit({
270
+ tabs: this.tabs?.map((tab) => ({
271
+ tabHeading: tab.tabHeading,
326
272
  tabIndex: tab.tabIndex,
327
- }));
328
- }
329
- updateTabButtons(activeIndex) {
330
- this.tabButtons.forEach((button) => {
331
- button.active = this.tabsetService.tabIndexesEqual(button.tabIndex, activeIndex);
332
- });
333
- }
334
- /**
335
- * Updates the UI and state of the tabset component after the tab index or
336
- * tab components have changed.
337
- * @param activeIndex The currently active tab index.
338
- * @param regenerateTabButtons Indicates if tab button view models should be regenerated.
339
- * Setting this value to `false` will simply update the existing tab buttons. Setting this value
340
- * to `true` is only necessary when the underlying tab components have changed and the tab
341
- * buttons must reflect those changes.
342
- */
343
- updateTabsetComponent(activeIndex, regenerateTabButtons = false) {
344
- // Activate/deactivate tab components.
345
- this.tabs.forEach((tab) => {
346
- this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex)
347
- ? tab.activate()
348
- : tab.deactivate();
349
- });
350
- // Update the tab button models.
351
- if (regenerateTabButtons || !this.tabButtons.length) {
352
- this.tabButtons = this.createTabButtons(activeIndex);
353
- }
354
- else {
355
- this.updateTabButtons(activeIndex);
273
+ })),
274
+ });
275
+ }, _SkyTabsetComponent_unsubscribeTabComponentsStateChange = function _SkyTabsetComponent_unsubscribeTabComponentsStateChange() {
276
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabComponentsStateChangeUnsubscribe, "f").next();
277
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabComponentsStateChangeUnsubscribe, "f").complete();
278
+ __classPrivateFieldSet(this, _SkyTabsetComponent_tabComponentsStateChangeUnsubscribe, new Subject(), "f");
279
+ }, _SkyTabsetComponent_listenTabButtonsOverflowChange = function _SkyTabsetComponent_listenTabButtonsOverflowChange() {
280
+ __classPrivateFieldGet(this, _SkyTabsetComponent_adapterService, "f").registerTabset(__classPrivateFieldGet(this, _SkyTabsetComponent_elementRef, "f"));
281
+ __classPrivateFieldGet(this, _SkyTabsetComponent_adapterService, "f").overflowChange
282
+ .pipe(takeUntil(__classPrivateFieldGet(this, _SkyTabsetComponent_ngUnsubscribe, "f")))
283
+ .subscribe((isOverflowing) => {
284
+ this.tabDisplayMode = isOverflowing ? 'dropdown' : 'tabs';
285
+ __classPrivateFieldGet(this, _SkyTabsetComponent_changeDetector, "f").markForCheck();
286
+ });
287
+ }, _SkyTabsetComponent_listenLocationPopStateChange = function _SkyTabsetComponent_listenLocationPopStateChange() {
288
+ __classPrivateFieldGet(this, _SkyTabsetComponent_permalinkService, "f").popStateChange
289
+ .pipe(takeUntil(__classPrivateFieldGet(this, _SkyTabsetComponent_ngUnsubscribe, "f")))
290
+ .subscribe(() => {
291
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_setActiveTabIndexByPermalinkId).call(this);
292
+ });
293
+ }, _SkyTabsetComponent_setActiveTabIndexByPermalinkId = function _SkyTabsetComponent_setActiveTabIndexByPermalinkId() {
294
+ const activeIndex = __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_getActiveTabIndexByPermalinkId).call(this);
295
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").setActiveTabIndex(activeIndex);
296
+ }, _SkyTabsetComponent_getActiveTabIndexByPermalinkId = function _SkyTabsetComponent_getActiveTabIndexByPermalinkId() {
297
+ if (this.permalinkId) {
298
+ const paramValue = __classPrivateFieldGet(this, _SkyTabsetComponent_permalinkService, "f").getParam(this.permalinkId);
299
+ if (paramValue) {
300
+ return this.tabs?.find((tab) => tab.permalinkValueOrDefault === paramValue)?.tabIndex;
356
301
  }
357
- // Update the dropdown trigger button text.
358
- this.dropdownTriggerButtonText = this.tabButtons.find((b) => {
359
- return this.tabsetService.tabIndexesEqual(b.tabIndex, activeIndex);
360
- })?.buttonText;
361
- // Set the query params based on active tab.
362
- if (this.permalinkId) {
363
- const activeTabComponent = this.tabs.find((tab) => {
364
- return this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex);
365
- });
366
- this.permalinkService.setParam(this.permalinkId, activeTabComponent.permalinkValue);
367
- }
368
- // Wait for tab button view models to render before gauging dimensions.
369
- setTimeout(() => {
370
- this.adapterService.detectOverflow();
302
+ return undefined;
303
+ }
304
+ return undefined;
305
+ }, _SkyTabsetComponent_getActiveTabComponent = function _SkyTabsetComponent_getActiveTabComponent() {
306
+ return this.tabs
307
+ ?.toArray()
308
+ .reverse()
309
+ .find((tab) => tab.active === true);
310
+ }, _SkyTabsetComponent_createTabButtons = function _SkyTabsetComponent_createTabButtons(activeIndex) {
311
+ // Safety check
312
+ /* istanbul ignore next */
313
+ if (!this.tabs) {
314
+ return [];
315
+ }
316
+ return this.tabs.map((tab, index) => ({
317
+ active: __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").tabIndexesEqual(tab.tabIndex, activeIndex),
318
+ closeable: tab.isCloseable(),
319
+ ariaControls: tab.tabPanelId,
320
+ disabled: tab.disabled,
321
+ buttonHref: tab.disabled
322
+ ? null
323
+ : __classPrivateFieldGet(this, _SkyTabsetComponent_permalinkService, "f").getParamHref(this.permalinkId, tab.permalinkValueOrDefault),
324
+ buttonId: tab.tabButtonId,
325
+ buttonTextCount: tab.tabHeaderCount,
326
+ buttonText: tab.tabHeading,
327
+ tabIndex: tab.tabIndex,
328
+ tabNumber: index + 1,
329
+ totalTabsCount: this.tabs.length,
330
+ }));
331
+ }, _SkyTabsetComponent_updateTabButtons = function _SkyTabsetComponent_updateTabButtons(activeIndex) {
332
+ this.tabButtons.forEach((button) => {
333
+ button.active = __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").tabIndexesEqual(button.tabIndex, activeIndex);
334
+ });
335
+ }, _SkyTabsetComponent_updateTabsetComponent = function _SkyTabsetComponent_updateTabsetComponent(activeIndex, regenerateTabButtons = false) {
336
+ // Activate/deactivate tab components.
337
+ this.tabs?.forEach((tab) => {
338
+ __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").tabIndexesEqual(tab.tabIndex, activeIndex)
339
+ ? tab.activate()
340
+ : tab.deactivate();
341
+ });
342
+ // Update the tab button models.
343
+ if (regenerateTabButtons || !this.tabButtons.length) {
344
+ this.tabButtons = __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_createTabButtons).call(this, activeIndex);
345
+ }
346
+ else {
347
+ __classPrivateFieldGet(this, _SkyTabsetComponent_instances, "m", _SkyTabsetComponent_updateTabButtons).call(this, activeIndex);
348
+ }
349
+ // Update the dropdown trigger button text.
350
+ this.dropdownTriggerButtonText =
351
+ this.tabButtons.find((b) => {
352
+ return __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").tabIndexesEqual(b.tabIndex, activeIndex);
353
+ })?.buttonText ?? '';
354
+ // Set the query params based on active tab.
355
+ if (this.permalinkId) {
356
+ const activeTabComponent = this.tabs?.find((tab) => {
357
+ return __classPrivateFieldGet(this, _SkyTabsetComponent_tabsetService, "f").tabIndexesEqual(tab.tabIndex, activeIndex);
371
358
  });
372
- this.changeDetector.markForCheck();
373
- // Emit the new active index value to consumers.
374
- if (this.lastActiveTabIndex !== activeIndex) {
375
- this.lastActiveTabIndex = activeIndex;
376
- this.activeChange.emit(activeIndex);
359
+ if (activeTabComponent) {
360
+ __classPrivateFieldGet(this, _SkyTabsetComponent_permalinkService, "f").setParam(this.permalinkId, activeTabComponent.permalinkValueOrDefault);
377
361
  }
378
362
  }
379
- }
380
- _SkyTabsetComponent__hasFinishButton = new WeakMap();
363
+ // Wait for tab button view models to render before gauging dimensions.
364
+ setTimeout(() => {
365
+ __classPrivateFieldGet(this, _SkyTabsetComponent_adapterService, "f").detectOverflow();
366
+ });
367
+ __classPrivateFieldGet(this, _SkyTabsetComponent_changeDetector, "f").markForCheck();
368
+ // Emit the new active index value to consumers.
369
+ if (this.lastActiveTabIndex !== activeIndex) {
370
+ this.lastActiveTabIndex = activeIndex;
371
+ this.activeChange.emit(activeIndex);
372
+ }
373
+ };
381
374
  SkyTabsetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: SkyTabsetComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyTabsetAdapterService }, { token: i2.SkyTabsetPermalinkService }, { token: i3.SkyTabsetService }], target: i0.ɵɵFactoryTarget.Component });
382
375
  SkyTabsetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: SkyTabsetComponent, selector: "sky-tabset", inputs: { active: "active", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", permalinkId: "permalinkId", tabStyle: "tabStyle" }, outputs: { activeChange: "activeChange", newTab: "newTab", openTab: "openTab", tabIndexesChange: "tabIndexesChange" }, providers: [
383
376
  SkyTabsetAdapterService,
384
377
  SkyTabsetPermalinkService,
385
378
  SkyTabsetService,
386
- ], queries: [{ propertyName: "tabs", predicate: SkyTabComponent }], ngImport: i0, template: "<div\n class=\"sky-tabset\"\n [attr.role]=\"elementRole\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [ngClass]=\"\n 'sky-tabset-mode-' + tabDisplayMode + ' sky-tabset-style-' + tabStyle\n \"\n (window:resize)=\"onWindowResize()\"\n (keydown.arrowright)=\"onRightKeyDown()\"\n (keydown.arrowleft)=\"onLeftKeyDown()\"\n (keydown.home)=\"onHomeKeyDown()\"\n (keydown.end)=\"onEndKeyDown()\"\n>\n <span class=\"sky-tabset-dropdown\">\n <sky-dropdown *ngIf=\"tabDisplayMode === 'dropdown'\" buttonType=\"tab\">\n <sky-dropdown-button>\n {{ dropdownTriggerButtonText }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item\n *ngFor=\"let tabButton of tabButtons\"\n class=\"sky-tab-dropdown-menu-item\"\n >\n <div\n class=\"sky-tab-dropdown-item\"\n [ngClass]=\"{\n 'sky-tab-dropdown-item-selected': tabButton.active\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </div>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </span>\n <span class=\"sky-tabset-tabs\">\n <ng-container *ngFor=\"let tabButton of tabButtons\">\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </ng-container>\n </span>\n <span class=\"sky-tabset-btns\">\n <button\n *ngIf=\"newTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-new sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_add' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onNewTabClick()\"\n >\n <sky-icon icon=\"plus-circle\" size=\"lg\"> </sky-icon>\n </button>\n <button\n *ngIf=\"openTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-open sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_open' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onOpenTabClick()\"\n >\n <sky-icon icon=\"folder-open-o\" size=\"lg\"> </sky-icon>\n </button>\n </span>\n</div>\n<ng-content></ng-content>\n\n<ng-template let-tabButton #tabButtonTemplate>\n <sky-tab-button\n [active]=\"tabButton.active\"\n [ariaControls]=\"tabButton.ariaControls\"\n [buttonHref]=\"tabButton.buttonHref\"\n [buttonId]=\"tabButton.buttonId\"\n [buttonText]=\"tabButton.buttonText\"\n [buttonTextCount]=\"tabButton.buttonTextCount\"\n [closeable]=\"tabButton.closeable\"\n [disabled]=\"tabButton.disabled\"\n [tabIndex]=\"tabButton.tabIndex\"\n [tabStyle]=\"tabStyle\"\n (buttonClick)=\"onTabButtonClick(tabButton)\"\n (closeClick)=\"onTabCloseClick(tabButton)\"\n ></sky-tab-button>\n</ng-template>\n", styles: [".sky-tabset{align-items:center;border-bottom:2px solid #0974a1;display:flex;list-style-type:none;margin:0;overflow:hidden;padding:0 0 0 15px;white-space:nowrap}.sky-tabset.sky-tabset-style-wizard{border-bottom:none;margin-bottom:10px;padding-left:0}.sky-tabset-btns{order:1;padding-left:10px}.sky-tabset-dropdown{order:0;max-width:100%}.sky-tabset-mode-dropdown{line-height:0}.sky-tabset-mode-dropdown .sky-tabset-tabs{visibility:hidden;order:2}.sky-tab-dropdown-menu-item sky-tab-button{display:flex;min-width:300px}.sky-tab-dropdown-menu-item .sky-dropdown-item{margin:0}.sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{width:100%;margin-right:0}.sky-tab-dropdown-menu-item .sky-btn-tab{margin:0;border-radius:0;width:100%;display:flex}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-tab-heading{flex:1 1 auto}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-btn-tab-close{flex:0 1 auto}.sky-tabset-tabs{order:0;white-space:nowrap}.sky-tabset-btn-new,.sky-tabset-btn-open{color:#0974a1}.sky-theme-modern .sky-modal-content .sky-tabset{margin:-10px -30px 30px;padding-left:30px;padding-right:30px}.sky-theme-modern .sky-tabset{border-bottom:1px solid #d2d2d2;overflow:visible}.sky-theme-modern .sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{margin-right:0}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.λ2, selector: "sky-dropdown-button" }, { kind: "component", type: i5.λ3, selector: "sky-dropdown", inputs: ["buttonStyle", "buttonType", "disabled", "dismissOnBlur", "label", "horizontalAlignment", "messageStream", "title", "trigger"] }, { kind: "component", type: i5.λ1, selector: "sky-dropdown-item", inputs: ["ariaRole"] }, { kind: "component", type: i5.λ4, selector: "sky-dropdown-menu", inputs: ["ariaLabelledBy", "ariaRole", "useNativeFocus"], outputs: ["menuChanges"] }, { kind: "component", type: i6.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i7.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { kind: "component", type: i8.SkyTabButtonComponent, selector: "sky-tab-button", inputs: ["active", "ariaControls", "buttonHref", "buttonId", "buttonText", "buttonTextCount", "closeable", "disabled", "tabIndex", "tabStyle"], outputs: ["buttonClick", "closeClick"] }, { kind: "pipe", type: i9.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
379
+ ], queries: [{ propertyName: "tabs", predicate: SkyTabComponent }], ngImport: i0, template: "<div\n class=\"sky-tabset\"\n role=\"tablist\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [ngClass]=\"\n 'sky-tabset-mode-' + tabDisplayMode + ' sky-tabset-style-' + tabStyle\n \"\n (window:resize)=\"onWindowResize()\"\n (keydown.arrowright)=\"onRightKeyDown()\"\n (keydown.arrowleft)=\"onLeftKeyDown()\"\n (keydown.home)=\"onHomeKeyDown()\"\n (keydown.end)=\"onEndKeyDown()\"\n>\n <span class=\"sky-tabset-dropdown\">\n <sky-dropdown *ngIf=\"tabDisplayMode === 'dropdown'\" buttonType=\"tab\">\n <sky-dropdown-button>\n {{ dropdownTriggerButtonText }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item\n *ngFor=\"let tabButton of tabButtons\"\n class=\"sky-tab-dropdown-menu-item\"\n >\n <div\n class=\"sky-tab-dropdown-item\"\n [ngClass]=\"{\n 'sky-tab-dropdown-item-selected': tabButton.active\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </div>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </span>\n <span class=\"sky-tabset-tabs\">\n <ng-container *ngFor=\"let tabButton of tabButtons\">\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </ng-container>\n </span>\n <span class=\"sky-tabset-btns\">\n <button\n *ngIf=\"newTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-new sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_add' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onNewTabClick()\"\n >\n <sky-icon icon=\"plus-circle\" size=\"lg\"> </sky-icon>\n </button>\n <button\n *ngIf=\"openTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-open sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_open' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onOpenTabClick()\"\n >\n <sky-icon icon=\"folder-open-o\" size=\"lg\"> </sky-icon>\n </button>\n </span>\n</div>\n<ng-content></ng-content>\n\n<ng-template let-tabButton #tabButtonTemplate>\n <sky-tab-button\n [active]=\"tabButton.active\"\n [ariaControls]=\"tabButton.ariaControls\"\n [buttonHref]=\"tabButton.buttonHref\"\n [buttonId]=\"tabButton.buttonId\"\n [buttonText]=\"tabButton.buttonText\"\n [buttonTextCount]=\"tabButton.buttonTextCount\"\n [closeable]=\"tabButton.closeable\"\n [disabled]=\"tabButton.disabled\"\n [tabIndex]=\"tabButton.tabIndex\"\n [tabStyle]=\"tabStyle\"\n [tabNumber]=\"tabButton.tabNumber\"\n [totalTabsCount]=\"tabButton.totalTabsCount\"\n (buttonClick)=\"onTabButtonClick(tabButton)\"\n (closeClick)=\"onTabCloseClick(tabButton)\"\n ></sky-tab-button>\n</ng-template>\n", styles: [".sky-tabset{align-items:center;border-bottom:2px solid #0974a1;display:flex;list-style-type:none;margin:0;overflow:hidden;padding:0 0 0 15px;white-space:nowrap}.sky-tabset.sky-tabset-style-wizard{border-bottom:none;margin-bottom:10px;padding-left:0}.sky-tabset-btns{order:1;padding-left:10px}.sky-tabset-dropdown{order:0;max-width:100%}.sky-tabset-mode-dropdown{line-height:0}.sky-tabset-mode-dropdown .sky-tabset-tabs{visibility:hidden;order:2}.sky-tab-dropdown-menu-item sky-tab-button{display:flex;min-width:300px}.sky-tab-dropdown-menu-item .sky-dropdown-item{margin:0}.sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{width:100%;margin-right:0}.sky-tab-dropdown-menu-item .sky-btn-tab{margin:0;border-radius:0;width:100%;display:flex}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-tab-heading{flex:1 1 auto}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-btn-tab-close{flex:0 1 auto}.sky-tabset-tabs{order:0;white-space:nowrap}.sky-tabset-btn-new,.sky-tabset-btn-open{color:#0974a1}.sky-theme-modern .sky-modal-content .sky-tabset{margin:-10px -30px 30px;padding-left:30px;padding-right:30px}.sky-theme-modern .sky-tabset{border-bottom:1px solid #d2d2d2;overflow:visible}.sky-theme-modern .sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{margin-right:0}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.λ2, selector: "sky-dropdown-button" }, { kind: "component", type: i5.λ3, selector: "sky-dropdown", inputs: ["buttonStyle", "buttonType", "disabled", "dismissOnBlur", "label", "horizontalAlignment", "messageStream", "title", "trigger"] }, { kind: "component", type: i5.λ1, selector: "sky-dropdown-item", inputs: ["ariaRole"] }, { kind: "component", type: i5.λ4, selector: "sky-dropdown-menu", inputs: ["ariaLabelledBy", "ariaRole", "useNativeFocus"], outputs: ["menuChanges"] }, { kind: "component", type: i6.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i7.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { kind: "component", type: i8.SkyTabButtonComponent, selector: "sky-tab-button", inputs: ["active", "ariaControls", "buttonHref", "buttonId", "buttonText", "buttonTextCount", "closeable", "disabled", "tabIndex", "tabNumber", "totalTabsCount", "tabStyle"], outputs: ["buttonClick", "closeClick"] }, { kind: "pipe", type: i9.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
387
380
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: SkyTabsetComponent, decorators: [{
388
381
  type: Component,
389
382
  args: [{ selector: 'sky-tabset', providers: [
390
383
  SkyTabsetAdapterService,
391
384
  SkyTabsetPermalinkService,
392
385
  SkyTabsetService,
393
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n class=\"sky-tabset\"\n [attr.role]=\"elementRole\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [ngClass]=\"\n 'sky-tabset-mode-' + tabDisplayMode + ' sky-tabset-style-' + tabStyle\n \"\n (window:resize)=\"onWindowResize()\"\n (keydown.arrowright)=\"onRightKeyDown()\"\n (keydown.arrowleft)=\"onLeftKeyDown()\"\n (keydown.home)=\"onHomeKeyDown()\"\n (keydown.end)=\"onEndKeyDown()\"\n>\n <span class=\"sky-tabset-dropdown\">\n <sky-dropdown *ngIf=\"tabDisplayMode === 'dropdown'\" buttonType=\"tab\">\n <sky-dropdown-button>\n {{ dropdownTriggerButtonText }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item\n *ngFor=\"let tabButton of tabButtons\"\n class=\"sky-tab-dropdown-menu-item\"\n >\n <div\n class=\"sky-tab-dropdown-item\"\n [ngClass]=\"{\n 'sky-tab-dropdown-item-selected': tabButton.active\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </div>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </span>\n <span class=\"sky-tabset-tabs\">\n <ng-container *ngFor=\"let tabButton of tabButtons\">\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </ng-container>\n </span>\n <span class=\"sky-tabset-btns\">\n <button\n *ngIf=\"newTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-new sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_add' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onNewTabClick()\"\n >\n <sky-icon icon=\"plus-circle\" size=\"lg\"> </sky-icon>\n </button>\n <button\n *ngIf=\"openTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-open sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_open' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onOpenTabClick()\"\n >\n <sky-icon icon=\"folder-open-o\" size=\"lg\"> </sky-icon>\n </button>\n </span>\n</div>\n<ng-content></ng-content>\n\n<ng-template let-tabButton #tabButtonTemplate>\n <sky-tab-button\n [active]=\"tabButton.active\"\n [ariaControls]=\"tabButton.ariaControls\"\n [buttonHref]=\"tabButton.buttonHref\"\n [buttonId]=\"tabButton.buttonId\"\n [buttonText]=\"tabButton.buttonText\"\n [buttonTextCount]=\"tabButton.buttonTextCount\"\n [closeable]=\"tabButton.closeable\"\n [disabled]=\"tabButton.disabled\"\n [tabIndex]=\"tabButton.tabIndex\"\n [tabStyle]=\"tabStyle\"\n (buttonClick)=\"onTabButtonClick(tabButton)\"\n (closeClick)=\"onTabCloseClick(tabButton)\"\n ></sky-tab-button>\n</ng-template>\n", styles: [".sky-tabset{align-items:center;border-bottom:2px solid #0974a1;display:flex;list-style-type:none;margin:0;overflow:hidden;padding:0 0 0 15px;white-space:nowrap}.sky-tabset.sky-tabset-style-wizard{border-bottom:none;margin-bottom:10px;padding-left:0}.sky-tabset-btns{order:1;padding-left:10px}.sky-tabset-dropdown{order:0;max-width:100%}.sky-tabset-mode-dropdown{line-height:0}.sky-tabset-mode-dropdown .sky-tabset-tabs{visibility:hidden;order:2}.sky-tab-dropdown-menu-item sky-tab-button{display:flex;min-width:300px}.sky-tab-dropdown-menu-item .sky-dropdown-item{margin:0}.sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{width:100%;margin-right:0}.sky-tab-dropdown-menu-item .sky-btn-tab{margin:0;border-radius:0;width:100%;display:flex}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-tab-heading{flex:1 1 auto}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-btn-tab-close{flex:0 1 auto}.sky-tabset-tabs{order:0;white-space:nowrap}.sky-tabset-btn-new,.sky-tabset-btn-open{color:#0974a1}.sky-theme-modern .sky-modal-content .sky-tabset{margin:-10px -30px 30px;padding-left:30px;padding-right:30px}.sky-theme-modern .sky-tabset{border-bottom:1px solid #d2d2d2;overflow:visible}.sky-theme-modern .sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{margin-right:0}\n"] }]
386
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n class=\"sky-tabset\"\n role=\"tablist\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [ngClass]=\"\n 'sky-tabset-mode-' + tabDisplayMode + ' sky-tabset-style-' + tabStyle\n \"\n (window:resize)=\"onWindowResize()\"\n (keydown.arrowright)=\"onRightKeyDown()\"\n (keydown.arrowleft)=\"onLeftKeyDown()\"\n (keydown.home)=\"onHomeKeyDown()\"\n (keydown.end)=\"onEndKeyDown()\"\n>\n <span class=\"sky-tabset-dropdown\">\n <sky-dropdown *ngIf=\"tabDisplayMode === 'dropdown'\" buttonType=\"tab\">\n <sky-dropdown-button>\n {{ dropdownTriggerButtonText }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item\n *ngFor=\"let tabButton of tabButtons\"\n class=\"sky-tab-dropdown-menu-item\"\n >\n <div\n class=\"sky-tab-dropdown-item\"\n [ngClass]=\"{\n 'sky-tab-dropdown-item-selected': tabButton.active\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </div>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </span>\n <span class=\"sky-tabset-tabs\">\n <ng-container *ngFor=\"let tabButton of tabButtons\">\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </ng-container>\n </span>\n <span class=\"sky-tabset-btns\">\n <button\n *ngIf=\"newTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-new sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_add' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onNewTabClick()\"\n >\n <sky-icon icon=\"plus-circle\" size=\"lg\"> </sky-icon>\n </button>\n <button\n *ngIf=\"openTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-open sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_open' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onOpenTabClick()\"\n >\n <sky-icon icon=\"folder-open-o\" size=\"lg\"> </sky-icon>\n </button>\n </span>\n</div>\n<ng-content></ng-content>\n\n<ng-template let-tabButton #tabButtonTemplate>\n <sky-tab-button\n [active]=\"tabButton.active\"\n [ariaControls]=\"tabButton.ariaControls\"\n [buttonHref]=\"tabButton.buttonHref\"\n [buttonId]=\"tabButton.buttonId\"\n [buttonText]=\"tabButton.buttonText\"\n [buttonTextCount]=\"tabButton.buttonTextCount\"\n [closeable]=\"tabButton.closeable\"\n [disabled]=\"tabButton.disabled\"\n [tabIndex]=\"tabButton.tabIndex\"\n [tabStyle]=\"tabStyle\"\n [tabNumber]=\"tabButton.tabNumber\"\n [totalTabsCount]=\"tabButton.totalTabsCount\"\n (buttonClick)=\"onTabButtonClick(tabButton)\"\n (closeClick)=\"onTabCloseClick(tabButton)\"\n ></sky-tab-button>\n</ng-template>\n", styles: [".sky-tabset{align-items:center;border-bottom:2px solid #0974a1;display:flex;list-style-type:none;margin:0;overflow:hidden;padding:0 0 0 15px;white-space:nowrap}.sky-tabset.sky-tabset-style-wizard{border-bottom:none;margin-bottom:10px;padding-left:0}.sky-tabset-btns{order:1;padding-left:10px}.sky-tabset-dropdown{order:0;max-width:100%}.sky-tabset-mode-dropdown{line-height:0}.sky-tabset-mode-dropdown .sky-tabset-tabs{visibility:hidden;order:2}.sky-tab-dropdown-menu-item sky-tab-button{display:flex;min-width:300px}.sky-tab-dropdown-menu-item .sky-dropdown-item{margin:0}.sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{width:100%;margin-right:0}.sky-tab-dropdown-menu-item .sky-btn-tab{margin:0;border-radius:0;width:100%;display:flex}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-tab-heading{flex:1 1 auto}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-btn-tab-close{flex:0 1 auto}.sky-tabset-tabs{order:0;white-space:nowrap}.sky-tabset-btn-new,.sky-tabset-btn-open{color:#0974a1}.sky-theme-modern .sky-modal-content .sky-tabset{margin:-10px -30px 30px;padding-left:30px;padding-right:30px}.sky-theme-modern .sky-tabset{border-bottom:1px solid #d2d2d2;overflow:visible}.sky-theme-modern .sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{margin-right:0}\n"] }]
394
387
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyTabsetAdapterService }, { type: i2.SkyTabsetPermalinkService }, { type: i3.SkyTabsetService }]; }, propDecorators: { active: [{
395
388
  type: Input
396
389
  }], ariaLabel: [{
@@ -413,4 +406,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImpor
413
406
  type: ContentChildren,
414
407
  args: [SkyTabComponent]
415
408
  }] } });
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy90YWJzL3NyYy9saWIvbW9kdWxlcy90YWJzL3RhYnNldC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdGFicy9zcmMvbGliL21vZHVsZXMvdGFicy90YWJzZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRW5FLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7OztBQUVwRCxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQWN2QyxNQUFNLE9BQU8sa0JBQWtCO0lBb0s3QixZQUNVLGNBQWlDLEVBQ2pDLFVBQXNCLEVBQ3RCLGNBQXVDLEVBQ3ZDLGdCQUEyQyxFQUMzQyxhQUErQjtRQUovQixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0Qixt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QkFDVCx1QkFBdUI7d0JBQ3ZCLHlCQUF5Qjt3QkFDekIsZ0JBQWdCO3FCQUNqQixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSTs4T0FPMUIsTUFBTTtzQkFEaEIsS0FBSztnQkF1Q0MsU0FBUztzQkFEZixLQUFLO2dCQVVDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBV0ssV0FBVztzQkFEckIsS0FBSztnQkFtQkssUUFBUTtzQkFEbEIsS0FBSztnQkFjQyxZQUFZO3NCQURsQixNQUFNO2dCQVNBLE1BQU07c0JBRFosTUFBTTtnQkFTQSxPQUFPO3NCQURiLE1BQU07Z0JBUUEsZ0JBQWdCO3NCQUR0QixNQUFNO2dCQXFCQSxJQUFJO3NCQURWLGVBQWU7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCwgY29tYmluZUxhdGVzdCwgcmFjZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVGFiQnV0dG9uVmlld01vZGVsIH0gZnJvbSAnLi90YWItYnV0dG9uLXZpZXctbW9kZWwnO1xuaW1wb3J0IHsgU2t5VGFiSW5kZXggfSBmcm9tICcuL3RhYi1pbmRleCc7XG5pbXBvcnQgeyBTa3lUYWJDb21wb25lbnQgfSBmcm9tICcuL3RhYi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5VGFic2V0QWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL3RhYnNldC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5VGFic2V0QnV0dG9uc0Rpc3BsYXlNb2RlIH0gZnJvbSAnLi90YWJzZXQtYnV0dG9ucy1kaXNwbGF5LW1vZGUnO1xuaW1wb3J0IHsgU2t5VGFic2V0UGVybWFsaW5rU2VydmljZSB9IGZyb20gJy4vdGFic2V0LXBlcm1hbGluay5zZXJ2aWNlJztcbmltcG9ydCB7IFNreVRhYnNldFN0eWxlIH0gZnJvbSAnLi90YWJzZXQtc3R5bGUnO1xuaW1wb3J0IHsgU2t5VGFic2V0VGFiSW5kZXhlc0NoYW5nZSB9IGZyb20gJy4vdGFic2V0LXRhYi1pbmRleGVzLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lUYWJzZXRTZXJ2aWNlIH0gZnJvbSAnLi90YWJzZXQuc2VydmljZSc7XG5cbmNvbnN0IERFRkFVTFRfRUxFTUVOVF9ST0xFID0gJ3RhYmxpc3QnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktdGFic2V0JyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFic2V0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJzZXQuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICBTa3lUYWJzZXRBZGFwdGVyU2VydmljZSxcbiAgICBTa3lUYWJzZXRQZXJtYWxpbmtTZXJ2aWNlLFxuICAgIFNreVRhYnNldFNlcnZpY2UsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lUYWJzZXRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogQWN0aXZhdGVzIGEgdGFiIGJ5IGl0cyBgdGFiSW5kZXhgIHByb3BlcnR5LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBhY3RpdmUodmFsdWU6IFNreVRhYkluZGV4KSB7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh2YWx1ZSwgdGhpcy5fYWN0aXZlKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMudGFicykge1xuICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT24gaW5pdCwgd2FpdCBmb3IgY2hpbGRyZW4gdGFicyB0byByZW5kZXIgYmVmb3JlIGJyb2FkY2FzdGluZyB0aGUgYWN0aXZlIHRhYiBpbmRleC5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy50YWJzZXRTZXJ2aWNlLmlzVmFsaWRUYWJJbmRleCh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBPbiBpbml0LCB5aWVsZCB0byB0aGUgcGVybWFsaW5rIElELCBpZiBpdCBleGlzdHMuXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWN0aXZhdGUgdGhlIGZpcnN0IHRhYiBpZiB0aGUgbmV3IHRhYiBpbmRleCBpcyBpbnZhbGlkLlxuICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRoaXMudGFic2V0U2VydmljZS5hY3RpdmF0ZUZpcnN0VGFiKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCk6IFNreVRhYkluZGV4IHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhbiBBUklBIGxhYmVsIGZvciB0aGUgdGFic2V0LiBUaGlzIHNldHMgdGhlIHRhYnNldCdzIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGVcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICogSWYgdGhlIHRhYnNldCBpbmNsdWRlcyBhIHZpc2libGUgbGFiZWwsIHVzZSBgYXJpYUxhYmVsbGVkQnlgIGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYXJpYUxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgSFRNTCBlbGVtZW50IElEICh3aXRob3V0IHRoZSBsZWFkaW5nIGAjYCkgb2YgdGhlIGVsZW1lbnQgdGhhdCBsYWJlbHNcbiAgICogdGhlIHRhYnNldC4gVGhpcyBzZXRzIHRoZSB0YWJzZXQncyBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGVcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICogSWYgdGhlIHRhYnNldCBkb2VzIG5vdCBpbmNsdWRlIGEgdmlzaWJsZSBsYWJlbCwgdXNlIGBhcmlhTGFiZWxgIGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYXJpYUxhYmVsbGVkQnk6IHN0cmluZztcblxuICAvKipcbiAgICogRGlzdGluZ3Vpc2hlcyBhIHRhYnNldCdzIHVuaXF1ZSBzdGF0ZSBpbiB0aGUgVVJMIGJ5IGdlbmVyYXRpbmcgYSBxdWVyeSBwYXJhbWV0ZXJcbiAgICogdGhhdCBpcyB3cml0dGVuIGFzIGA/PHF1ZXJ5UGFyYW0+LWFjdGl2ZS10YWI9PHNhbml0aXplZC10YWItaGVhZGluZz5gLlxuICAgKiBUaGUgcXVlcnkgcGFyYW1ldGVyJ3MgdmFsdWUgaXMgcGFyc2VkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgc2VsZWN0ZWQgdGFiJ3MgaGVhZGluZyB0ZXh0LFxuICAgKiBidXQgeW91IGNhbiBzdXBwbHkgYSBjdXN0b20gcXVlcnkgcGFyYW1ldGVyIHZhbHVlIGZvciBlYWNoIHRhYiB3aXRoIGl0cyBgcGVybWFsaW5rVmFsdWVgLlxuICAgKiBUaGlzIGlucHV0IG9ubHkgYXBwbGllcyB3aGVuIGB0YWJTdHlsZWAgaXMgYFwidGFic1wiYFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBwZXJtYWxpbmtJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNhbml0aXplZCA9IHRoaXMucGVybWFsaW5rU2VydmljZS51cmxpZnkodmFsdWUpO1xuICAgIHRoaXMuX3Blcm1hbGlua0lkID0gYCR7c2FuaXRpemVkfS1hY3RpdmUtdGFiYDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVybWFsaW5rSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGVybWFsaW5rSWQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBiZWhhdmlvciBmb3IgYSBzZXJpZXMgb2YgdGFicy5cbiAgICogQGRlZmF1bHQgXCJ0YWJzXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdGFiU3R5bGUodmFsdWU6IFNreVRhYnNldFN0eWxlKSB7XG4gICAgdGhpcy5fdGFiU3R5bGUgPSB2YWx1ZTtcbiAgICB0aGlzLmVsZW1lbnRSb2xlID0gdmFsdWUgPT09ICd0YWJzJyA/IERFRkFVTFRfRUxFTUVOVF9ST0xFIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJTdHlsZSgpOiBTa3lUYWJzZXRTdHlsZSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYlN0eWxlIHx8ICd0YWJzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBhY3RpdmUgdGFiIGNoYW5nZXMuIFRoaXMgZXZlbnQgZW1pdHMgdGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgdGFiLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBhY3RpdmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNreVRhYkluZGV4PigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIGNsaWNrIHRoZSBidXR0b24gdG8gYWRkIGEgbmV3IHRhYi5cbiAgICogVGhlIG5ldyB0YWIgYnV0dG9uIGlzIGFkZGVkIHRvIHRoZSB0YWIgYXJlYSB3aGVuIHlvdSBzcGVjaWZ5IGEgbGlzdGVuZXIgZm9yIHRoaXMgZXZlbnQuXG4gICAqIFRoaXMgZXZlbnQgb25seSBhcHBsaWVzIHdoZW4gYHRhYlN0eWxlYCBpcyBgXCJ0YWJzXCJgLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBuZXdUYWIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgY2xpY2sgdGhlIGJ1dHRvbiB0byBvcGVuIGEgdGFiLlxuICAgKiBUaGUgb3BlbiB0YWIgYnV0dG9uIGlzIGFkZGVkIHRvIHRoZSB0YWIgYXJlYSB3aGVuIHlvdSBzcGVjaWZ5IGEgbGlzdGVuZXIgZm9yIHRoaXMgZXZlbnQuXG4gICAqIFRoaXMgZXZlbnQgb25seSBhcHBsaWVzIHdoZW4gYHRhYlN0eWxlYCBpcyBgXCJ0YWJzXCJgLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvcGVuVGFiID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGFueSB0YWIncyBgdGFiSW5kZXhgIHZhbHVlIGNoYW5nZXMuXG4gICAqIFRoaXMgZXZlbnQgb25seSBhcHBsaWVzIHdoZW4gYHRhYlN0eWxlYCBpcyBgXCJ0YWJzXCJgLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyB0YWJJbmRleGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lUYWJzZXRUYWJJbmRleGVzQ2hhbmdlPigpO1xuXG4gIHB1YmxpYyBzZXQgdGFiRGlzcGxheU1vZGUodmFsdWU6IFNreVRhYnNldEJ1dHRvbnNEaXNwbGF5TW9kZSkge1xuICAgIHRoaXMuX3RhYkRpc3BsYXlNb2RlID0gdmFsdWU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFiRGlzcGxheU1vZGUoKTogU2t5VGFic2V0QnV0dG9uc0Rpc3BsYXlNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiRGlzcGxheU1vZGUgfHwgJ3RhYnMnO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNGaW5pc2hCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI19oYXNGaW5pc2hCdXR0b247XG4gIH1cblxuICBwdWJsaWMgc2V0IGhhc0ZpbmlzaEJ1dHRvbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuI19oYXNGaW5pc2hCdXR0b24gPSB2YWx1ZTtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGRyZW4oU2t5VGFiQ29tcG9uZW50KVxuICBwdWJsaWMgdGFiczogUXVlcnlMaXN0PFNreVRhYkNvbXBvbmVudD47XG5cbiAgcHVibGljIGRyb3Bkb3duVHJpZ2dlckJ1dHRvblRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IHRoZSBkZXByZWNhdGVkIHRhYnNldC1uYXYtYnV0dG9uIGNvbXBvbmVudC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgbGFzdEFjdGl2ZVRhYkluZGV4OiBTa3lUYWJJbmRleDtcblxuICBwdWJsaWMgdGFiQnV0dG9uczogVGFiQnV0dG9uVmlld01vZGVsW10gPSBbXTtcblxuICBwdWJsaWMgZWxlbWVudFJvbGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IERFRkFVTFRfRUxFTUVOVF9ST0xFO1xuXG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSB0YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBfYWN0aXZlOiBTa3lUYWJJbmRleDtcblxuICBwcml2YXRlIF9wZXJtYWxpbmtJZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgX3RhYkRpc3BsYXlNb2RlOiBTa3lUYWJzZXRCdXR0b25zRGlzcGxheU1vZGU7XG5cbiAgcHJpdmF0ZSBfdGFiU3R5bGU6IFNreVRhYnNldFN0eWxlO1xuXG4gICNfaGFzRmluaXNoQnV0dG9uID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgYWRhcHRlclNlcnZpY2U6IFNreVRhYnNldEFkYXB0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGVybWFsaW5rU2VydmljZTogU2t5VGFic2V0UGVybWFsaW5rU2VydmljZSxcbiAgICBwcml2YXRlIHRhYnNldFNlcnZpY2U6IFNreVRhYnNldFNlcnZpY2VcbiAgKSB7fVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0VGFiQ29tcG9uZW50cygpO1xuICAgIHRoaXMubGlzdGVuVGFiQ29tcG9uZW50c1N0cnVjdHVyYWxDaGFuZ2UoKTtcblxuICAgIGNvbnN0IGluaXRpYWxUYWJJbmRleCA9IHRoaXMuZ2V0SW5pdGlhbFRhYkluZGV4KCk7XG4gICAgdGhpcy50YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KGluaXRpYWxUYWJJbmRleCk7XG5cbiAgICB0aGlzLmxpc3RlblRhYkJ1dHRvbnNPdmVyZmxvd0NoYW5nZSgpO1xuICAgIHRoaXMubGlzdGVuTG9jYXRpb25Qb3BTdGF0ZUNoYW5nZSgpO1xuXG4gICAgLy8gSWYgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiIGlzIGdldHRpbmcgdW5yZWdpc3RlcmVkLCBhY3RpdmF0ZSB0aGUgbmV4dCBvbmUuXG4gICAgdGhpcy50YWJzZXRTZXJ2aWNlLmFjdGl2ZVRhYlVucmVnaXN0ZXJlZFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCh0YWIpID0+IHtcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG5ldyB0YWJzIHRvIHJlbmRlciBiZWZvcmUgYWN0aXZhdGluZy5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLmFjdGl2YXRlTmVhcmVzdFRhYih0YWIuYXJyYXlJbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAvLyBMZXQgdGhlIHRhYnNldCByZW5kZXIgdGhlIGluaXRpYWwgYWN0aXZlIGluZGV4IGJlZm9yZSBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxpc3RlblRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZSgpO1xuICAgICAgdGhpcy5saXN0ZW5BY3RpdmVJbmRleENoYW5nZSgpO1xuICAgICAgdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLmluaXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVUYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTtcbiAgICBpZiAodGhpcy5wZXJtYWxpbmtJZCkge1xuICAgICAgdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLmNsZWFyUGFyYW0odGhpcy5wZXJtYWxpbmtJZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuYWRhcHRlclNlcnZpY2UuZGV0ZWN0T3ZlcmZsb3coKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRhYkNsb3NlQ2xpY2sodGFiQnV0dG9uOiBUYWJCdXR0b25WaWV3TW9kZWwpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJDb21wb25lbnQgPSB0aGlzLnRhYnMuZmluZCgodGFiKSA9PlxuICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh0YWIudGFiSW5kZXgsIHRhYkJ1dHRvbi50YWJJbmRleClcbiAgICApO1xuXG4gICAgdGFiQ29tcG9uZW50LmNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRhYkJ1dHRvbkNsaWNrKHRhYkJ1dHRvbjogVGFiQnV0dG9uVmlld01vZGVsKTogdm9pZCB7XG4gICAgdGhpcy50YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KHRhYkJ1dHRvbi50YWJJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgb25OZXdUYWJDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm5ld1RhYi5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25PcGVuVGFiQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuVGFiLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJpZ2h0S2V5RG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2UuZm9jdXNOZXh0VGFiQnRuKHRoaXMudGFiQnV0dG9ucyk7XG4gIH1cblxuICBwdWJsaWMgb25MZWZ0S2V5RG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2UuZm9jdXNQcmV2VGFiQnRuKHRoaXMudGFiQnV0dG9ucyk7XG4gIH1cblxuICBwdWJsaWMgb25Ib21lS2V5RG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2UuZm9jdXNGaXJzdE9yTmVhcmVzdFRhYkJ0bih0aGlzLnRhYkJ1dHRvbnMpO1xuICB9XG5cbiAgcHVibGljIG9uRW5kS2V5RG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2UuZm9jdXNMYXN0T3JOZWFyZXN0VGFiQnRuKHRoaXMudGFiQnV0dG9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgaW5pdGlhbCBhY3RpdmUgdGFiIGluZGV4IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWEuXG4gICAqIDEuIERvZXMgdGhlIFVSTCBpbmNsdWRlIGEgcXVlcnkgcGFyYW0gdGhhdCByZWZsZWN0cyB0aGlzIHRhYnNldCdzIGFjdGl2ZSB0YWI/XG4gICAqIDIuIERvZXMgb25lIG9mIHRoZSB0YWIgY29tcG9uZW50cyBoYXZlIHRoZWlyIGBhY3RpdmVgIHByb3BlcnR5IHNldCB0byBgdHJ1ZWA/XG4gICAqIDMuIElzIHRoZSB0YWJzZXQgY29tcG9uZW50J3MgYGFjdGl2ZWAgcHJvcGVydHkgc2V0IHRvIGEgc3BlY2lmaWMgdGFiIGluZGV4P1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbml0aWFsVGFiSW5kZXgoKTogU2t5VGFiSW5kZXgge1xuICAgIGxldCBhY3RpdmVJbmRleDogU2t5VGFiSW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkluZGV4QnlQZXJtYWxpbmtJZCgpO1xuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3RpdmVJbmRleCA9IHRoaXMuZ2V0QWN0aXZlVGFiQ29tcG9uZW50KCk/LnRhYkluZGV4O1xuICAgICAgaWYgKGFjdGl2ZUluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWN0aXZlSW5kZXggPSB0aGlzLmFjdGl2ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aXZlSW5kZXg7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlbkFjdGl2ZUluZGV4Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMudGFic2V0U2VydmljZS5hY3RpdmVUYWJJbmRleFxuICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChhY3RpdmVJbmRleCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVRhYnNldENvbXBvbmVudChhY3RpdmVJbmRleCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuVGFiQ29tcG9uZW50c1N0cnVjdHVyYWxDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy50YWJzLmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucmVzZXRUYWJDb21wb25lbnRzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlblRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICBjb21iaW5lTGF0ZXN0KHRoaXMudGFicy5tYXAoKHRhYikgPT4gdGFiLmFjdGl2ZUNoYW5nZSkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKFxuICAgICAgICAgIHJhY2UodGhpcy50YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZSwgdGhpcy5uZ1Vuc3Vic2NyaWJlKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHRhYiBjb21wb25lbnRzIHRvIHJlbmRlciBjaGFuZ2VzIGJlZm9yZSBmaW5kaW5nIHRoZSBhY3RpdmUgb25lLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB0YWJJbmRleCA9IHRoaXMuZ2V0QWN0aXZlVGFiQ29tcG9uZW50KCk/LnRhYkluZGV4O1xuICAgICAgICAgIHRoaXMudGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleCh0YWJJbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KHRoaXMudGFicy5tYXAoKHRhYikgPT4gdGFiLnRhYkluZGV4Q2hhbmdlKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwoXG4gICAgICAgICAgcmFjZSh0aGlzLnRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLCB0aGlzLm5nVW5zdWJzY3JpYmUpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyBEb24ndCBlbWl0IHRoZSBmaXJzdCBjaGFuZ2UuXG4gICAgICAgIGlmICh0aGlzLmxhc3RBY3RpdmVUYWJJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHRhYiBjb21wb25lbnRzIHRvIHJlbmRlciBjaGFuZ2VzIGJlZm9yZSB1cGRhdGluZyB0aGUgdmlldy5cbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGFic2V0Q29tcG9uZW50KFxuICAgICAgICAgICAgICB0aGlzLnRhYnNldFNlcnZpY2UuY3VycmVudEFjdGl2ZVRhYkluZGV4LFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5lbWl0VGFiSW5kZXhDaGFuZ2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KHRoaXMudGFicy5tYXAoKHRhYikgPT4gdGFiLnN0YXRlQ2hhbmdlKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwoXG4gICAgICAgICAgcmFjZSh0aGlzLnRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLCB0aGlzLm5nVW5zdWJzY3JpYmUpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IGZvciB0aGUgdGFiIGNvbXBvbmVudHMgdG8gcmVuZGVyIGNoYW5nZXMgYmVmb3JlIGZpbmRpbmcgdGhlIGFjdGl2ZSBvbmUuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlVGFic2V0Q29tcG9uZW50KFxuICAgICAgICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLmN1cnJlbnRBY3RpdmVUYWJJbmRleCxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0VGFiQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnMuZm9yRWFjaCgodGFiKSA9PiB0YWIuaW5pdCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRUYWJDb21wb25lbnRzKCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmVUYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2UudW5yZWdpc3RlckFsbCgpO1xuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIHRhYiBjb21wb25lbnRzLCBkbyBhIGhhcmQgcmVzZXQgb2YgdGhlIHZpZXcuXG4gICAgaWYgKHRoaXMudGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudXBkYXRlVGFic2V0Q29tcG9uZW50KDAsIHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdFRhYkNvbXBvbmVudHMoKTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuZ2V0QWN0aXZlVGFiQ29tcG9uZW50KCk/LnRhYkluZGV4O1xuICAgIHRoaXMudGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleChhY3RpdmVJbmRleCwge1xuICAgICAgZW1pdENoYW5nZTogZmFsc2UsXG4gICAgfSk7XG4gICAgdGhpcy5saXN0ZW5UYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFRhYkluZGV4Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMudGFiSW5kZXhlc0NoYW5nZS5lbWl0KHtcbiAgICAgIHRhYnM6IHRoaXMudGFicy5tYXAoKHRhYikgPT4gKHtcbiAgICAgICAgdGFiSGVhZGluZzogdGFiLnRhYkhlYWRpbmcsXG4gICAgICAgIHRhYkluZGV4OiB0YWIudGFiSW5kZXgsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVuc3Vic2NyaWJlVGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMudGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMudGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLnRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuVGFiQnV0dG9uc092ZXJmbG93Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuYWRhcHRlclNlcnZpY2UucmVnaXN0ZXJUYWJzZXQodGhpcy5lbGVtZW50UmVmKTtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLm92ZXJmbG93Q2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGlzT3ZlcmZsb3dpbmcpID0+IHtcbiAgICAgICAgdGhpcy50YWJEaXNwbGF5TW9kZSA9IGlzT3ZlcmZsb3dpbmcgPyAnZHJvcGRvd24nIDogJ3RhYnMnO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBiYWNrL2ZvcndhcmQgaGlzdG9yeSBidXR0b24gcHJlc3NlcyB0byBkZXRlY3QgcXVlcnkgcGFyYW0gY2hhbmdlcyBpbiB0aGUgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBsaXN0ZW5Mb2NhdGlvblBvcFN0YXRlQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMucGVybWFsaW5rU2VydmljZS5wb3BTdGF0ZUNoYW5nZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkluZGV4QnlQZXJtYWxpbmtJZCgpO1xuICAgIHRoaXMudGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleChhY3RpdmVJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2ZVRhYkluZGV4QnlQZXJtYWxpbmtJZCgpOiBTa3lUYWJJbmRleCB7XG4gICAgaWYgKHRoaXMucGVybWFsaW5rSWQpIHtcbiAgICAgIGNvbnN0IHBhcmFtVmFsdWUgPSB0aGlzLnBlcm1hbGlua1NlcnZpY2UuZ2V0UGFyYW0odGhpcy5wZXJtYWxpbmtJZCk7XG4gICAgICBpZiAocGFyYW1WYWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJzLmZpbmQoKHRhYikgPT4gdGFiLnBlcm1hbGlua1ZhbHVlID09PSBwYXJhbVZhbHVlKVxuICAgICAgICAgID8udGFiSW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY3RpdmVUYWJDb21wb25lbnQoKTogU2t5VGFiQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJzXG4gICAgICAudG9BcnJheSgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmluZCgodGFiKSA9PiB0YWIuYWN0aXZlID09PSB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGFiQnV0dG9ucyhhY3RpdmVJbmRleDogU2t5VGFiSW5kZXgpOiBUYWJCdXR0b25WaWV3TW9kZWxbXSB7XG4gICAgcmV0dXJuIHRoaXMudGFicy5tYXAoKHRhYikgPT4gKHtcbiAgICAgIGFjdGl2ZTogdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh0YWIudGFiSW5kZXgsIGFjdGl2ZUluZGV4KSxcbiAgICAgIGNsb3NlYWJsZTogdGFiLmNsb3NlYWJsZSxcbiAgICAgIGFyaWFDb250cm9sczogdGFiLnRhYlBhbmVsSWQsXG4gICAgICBkaXNhYmxlZDogdGFiLmRpc2FibGVkLFxuICAgICAgYnV0dG9uSHJlZjogdGFiLmRpc2FibGVkXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMucGVybWFsaW5rU2VydmljZS5nZXRQYXJhbUhyZWYoXG4gICAgICAgICAgICB0aGlzLnBlcm1hbGlua0lkLFxuICAgICAgICAgICAgdGFiLnBlcm1hbGlua1ZhbHVlXG4gICAgICAgICAgKSxcbiAgICAgIGJ1dHRvbklkOiB0YWIudGFiQnV0dG9uSWQsXG4gICAgICBidXR0b25UZXh0Q291bnQ6IHRhYi50YWJIZWFkZXJDb3VudCxcbiAgICAgIGJ1dHRvblRleHQ6IHRhYi50YWJIZWFkaW5nLFxuICAgICAgdGFiSW5kZXg6IHRhYi50YWJJbmRleCxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRhYkJ1dHRvbnMoYWN0aXZlSW5kZXg6IFNreVRhYkluZGV4KTogdm9pZCB7XG4gICAgdGhpcy50YWJCdXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgYnV0dG9uLmFjdGl2ZSA9IHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwoXG4gICAgICAgIGJ1dHRvbi50YWJJbmRleCxcbiAgICAgICAgYWN0aXZlSW5kZXhcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgVUkgYW5kIHN0YXRlIG9mIHRoZSB0YWJzZXQgY29tcG9uZW50IGFmdGVyIHRoZSB0YWIgaW5kZXggb3JcbiAgICogdGFiIGNvbXBvbmVudHMgaGF2ZSBjaGFuZ2VkLlxuICAgKiBAcGFyYW0gYWN0aXZlSW5kZXggVGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiIGluZGV4LlxuICAgKiBAcGFyYW0gcmVnZW5lcmF0ZVRhYkJ1dHRvbnMgSW5kaWNhdGVzIGlmIHRhYiBidXR0b24gdmlldyBtb2RlbHMgc2hvdWxkIGJlIHJlZ2VuZXJhdGVkLlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gYGZhbHNlYCB3aWxsIHNpbXBseSB1cGRhdGUgdGhlIGV4aXN0aW5nIHRhYiBidXR0b25zLiBTZXR0aW5nIHRoaXMgdmFsdWVcbiAgICogdG8gYHRydWVgIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gdGhlIHVuZGVybHlpbmcgdGFiIGNvbXBvbmVudHMgaGF2ZSBjaGFuZ2VkIGFuZCB0aGUgdGFiXG4gICAqIGJ1dHRvbnMgbXVzdCByZWZsZWN0IHRob3NlIGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVRhYnNldENvbXBvbmVudChcbiAgICBhY3RpdmVJbmRleDogU2t5VGFiSW5kZXgsXG4gICAgcmVnZW5lcmF0ZVRhYkJ1dHRvbnMgPSBmYWxzZVxuICApOiB2b2lkIHtcbiAgICAvLyBBY3RpdmF0ZS9kZWFjdGl2YXRlIHRhYiBjb21wb25lbnRzLlxuICAgIHRoaXMudGFicy5mb3JFYWNoKCh0YWIpID0+IHtcbiAgICAgIHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwodGFiLnRhYkluZGV4LCBhY3RpdmVJbmRleClcbiAgICAgICAgPyB0YWIuYWN0aXZhdGUoKVxuICAgICAgICA6IHRhYi5kZWFjdGl2YXRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHRhYiBidXR0b24gbW9kZWxzLlxuICAgIGlmIChyZWdlbmVyYXRlVGFiQnV0dG9ucyB8fCAhdGhpcy50YWJCdXR0b25zLmxlbmd0aCkge1xuICAgICAgdGhpcy50YWJCdXR0b25zID0gdGhpcy5jcmVhdGVUYWJCdXR0b25zKGFjdGl2ZUluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVUYWJCdXR0b25zKGFjdGl2ZUluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRyb3Bkb3duIHRyaWdnZXIgYnV0dG9uIHRleHQuXG4gICAgdGhpcy5kcm9wZG93blRyaWdnZXJCdXR0b25UZXh0ID0gdGhpcy50YWJCdXR0b25zLmZpbmQoKGIpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnRhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKGIudGFiSW5kZXgsIGFjdGl2ZUluZGV4KTtcbiAgICB9KT8uYnV0dG9uVGV4dDtcblxuICAgIC8vIFNldCB0aGUgcXVlcnkgcGFyYW1zIGJhc2VkIG9uIGFjdGl2ZSB0YWIuXG4gICAgaWYgKHRoaXMucGVybWFsaW5rSWQpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZVRhYkNvbXBvbmVudCA9IHRoaXMudGFicy5maW5kKCh0YWIpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwodGFiLnRhYkluZGV4LCBhY3RpdmVJbmRleCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucGVybWFsaW5rU2VydmljZS5zZXRQYXJhbShcbiAgICAgICAgdGhpcy5wZXJtYWxpbmtJZCxcbiAgICAgICAgYWN0aXZlVGFiQ29tcG9uZW50LnBlcm1hbGlua1ZhbHVlXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIHRhYiBidXR0b24gdmlldyBtb2RlbHMgdG8gcmVuZGVyIGJlZm9yZSBnYXVnaW5nIGRpbWVuc2lvbnMuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmRldGVjdE92ZXJmbG93KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gRW1pdCB0aGUgbmV3IGFjdGl2ZSBpbmRleCB2YWx1ZSB0byBjb25zdW1lcnMuXG4gICAgaWYgKHRoaXMubGFzdEFjdGl2ZVRhYkluZGV4ICE9PSBhY3RpdmVJbmRleCkge1xuICAgICAgdGhpcy5sYXN0QWN0aXZlVGFiSW5kZXggPSBhY3RpdmVJbmRleDtcbiAgICAgIHRoaXMuYWN0aXZlQ2hhbmdlLmVtaXQoYWN0aXZlSW5kZXgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInNreS10YWJzZXRcIlxuICBbYXR0ci5yb2xlXT1cImVsZW1lbnRSb2xlXCJcbiAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxuICBbbmdDbGFzc109XCJcbiAgICAnc2t5LXRhYnNldC1tb2RlLScgKyB0YWJEaXNwbGF5TW9kZSArICcgc2t5LXRhYnNldC1zdHlsZS0nICsgdGFiU3R5bGVcbiAgXCJcbiAgKHdpbmRvdzpyZXNpemUpPVwib25XaW5kb3dSZXNpemUoKVwiXG4gIChrZXlkb3duLmFycm93cmlnaHQpPVwib25SaWdodEtleURvd24oKVwiXG4gIChrZXlkb3duLmFycm93bGVmdCk9XCJvbkxlZnRLZXlEb3duKClcIlxuICAoa2V5ZG93bi5ob21lKT1cIm9uSG9tZUtleURvd24oKVwiXG4gIChrZXlkb3duLmVuZCk9XCJvbkVuZEtleURvd24oKVwiXG4+XG4gIDxzcGFuIGNsYXNzPVwic2t5LXRhYnNldC1kcm9wZG93blwiPlxuICAgIDxza3ktZHJvcGRvd24gKm5nSWY9XCJ0YWJEaXNwbGF5TW9kZSA9PT0gJ2Ryb3Bkb3duJ1wiIGJ1dHRvblR5cGU9XCJ0YWJcIj5cbiAgICAgIDxza3ktZHJvcGRvd24tYnV0dG9uPlxuICAgICAgICB7eyBkcm9wZG93blRyaWdnZXJCdXR0b25UZXh0IH19XG4gICAgICA8L3NreS1kcm9wZG93bi1idXR0b24+XG4gICAgICA8c2t5LWRyb3Bkb3duLW1lbnU+XG4gICAgICAgIDxza3ktZHJvcGRvd24taXRlbVxuICAgICAgICAgICpuZ0Zvcj1cImxldCB0YWJCdXR0b24gb2YgdGFiQnV0dG9uc1wiXG4gICAgICAgICAgY2xhc3M9XCJza3ktdGFiLWRyb3Bkb3duLW1lbnUtaXRlbVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInNreS10YWItZHJvcGRvd24taXRlbVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdza3ktdGFiLWRyb3Bkb3duLWl0ZW0tc2VsZWN0ZWQnOiB0YWJCdXR0b24uYWN0aXZlXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgdGFiQnV0dG9uVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiB0YWJCdXR0b25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2t5LWRyb3Bkb3duLWl0ZW0+XG4gICAgICA8L3NreS1kcm9wZG93bi1tZW51PlxuICAgIDwvc2t5LWRyb3Bkb3duPlxuICA8L3NwYW4+XG4gIDxzcGFuIGNsYXNzPVwic2t5LXRhYnNldC10YWJzXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGFiQnV0dG9uIG9mIHRhYkJ1dHRvbnNcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICB0YWJCdXR0b25UZW1wbGF0ZTtcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRhYkJ1dHRvblxuICAgICAgICAgIH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9zcGFuPlxuICA8c3BhbiBjbGFzcz1cInNreS10YWJzZXQtYnRuc1wiPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwibmV3VGFiLm9ic2VydmVycy5sZW5ndGggPiAwXCJcbiAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWljb24gc2t5LXRhYnNldC1idG4tbmV3IHNreS1tYXJnaW4taW5saW5lLWNvbXBhY3RcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidza3l1eF90YWJfYWRkJyB8IHNreUxpYlJlc291cmNlc1wiXG4gICAgICBbc2t5VGhlbWVDbGFzc109XCJ7XG4gICAgICAgICdza3ktbWFyZ2luLWlubGluZS1zbSc6ICdtb2Rlcm4nXG4gICAgICB9XCJcbiAgICAgIChjbGljayk9XCJvbk5ld1RhYkNsaWNrKClcIlxuICAgID5cbiAgICAgIDxza3ktaWNvbiBpY29uPVwicGx1cy1jaXJjbGVcIiBzaXplPVwibGdcIj4gPC9za3ktaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cIm9wZW5UYWIub2JzZXJ2ZXJzLmxlbmd0aCA+IDBcIlxuICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4taWNvbiBza3ktdGFic2V0LWJ0bi1vcGVuIHNreS1tYXJnaW4taW5saW5lLWNvbXBhY3RcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidza3l1eF90YWJfb3BlbicgfCBza3lMaWJSZXNvdXJjZXNcIlxuICAgICAgW3NreVRoZW1lQ2xhc3NdPVwie1xuICAgICAgICAnc2t5LW1hcmdpbi1pbmxpbmUtc20nOiAnbW9kZXJuJ1xuICAgICAgfVwiXG4gICAgICAoY2xpY2spPVwib25PcGVuVGFiQ2xpY2soKVwiXG4gICAgPlxuICAgICAgPHNreS1pY29uIGljb249XCJmb2xkZXItb3Blbi1vXCIgc2l6ZT1cImxnXCI+IDwvc2t5LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvc3Bhbj5cbjwvZGl2PlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG48bmctdGVtcGxhdGUgbGV0LXRhYkJ1dHRvbiAjdGFiQnV0dG9uVGVtcGxhdGU+XG4gIDxza3ktdGFiLWJ1dHRvblxuICAgIFthY3RpdmVdPVwidGFiQnV0dG9uLmFjdGl2ZVwiXG4gICAgW2FyaWFDb250cm9sc109XCJ0YWJCdXR0b24uYXJpYUNvbnRyb2xzXCJcbiAgICBbYnV0dG9uSHJlZl09XCJ0YWJCdXR0b24uYnV0dG9uSHJlZlwiXG4gICAgW2J1dHRvbklkXT1cInRhYkJ1dHRvbi5idXR0b25JZFwiXG4gICAgW2J1dHRvblRleHRdPVwidGFiQnV0dG9uLmJ1dHRvblRleHRcIlxuICAgIFtidXR0b25UZXh0Q291bnRdPVwidGFiQnV0dG9uLmJ1dHRvblRleHRDb3VudFwiXG4gICAgW2Nsb3NlYWJsZV09XCJ0YWJCdXR0b24uY2xvc2VhYmxlXCJcbiAgICBbZGlzYWJsZWRdPVwidGFiQnV0dG9uLmRpc2FibGVkXCJcbiAgICBbdGFiSW5kZXhdPVwidGFiQnV0dG9uLnRhYkluZGV4XCJcbiAgICBbdGFiU3R5bGVdPVwidGFiU3R5bGVcIlxuICAgIChidXR0b25DbGljayk9XCJvblRhYkJ1dHRvbkNsaWNrKHRhYkJ1dHRvbilcIlxuICAgIChjbG9zZUNsaWNrKT1cIm9uVGFiQ2xvc2VDbGljayh0YWJCdXR0b24pXCJcbiAgPjwvc2t5LXRhYi1idXR0b24+XG48L25nLXRlbXBsYXRlPlxuIl19
409
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy90YWJzL3NyYy9saWIvbW9kdWxlcy90YWJzL3RhYnNldC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdGFicy9zcmMvbGliL21vZHVsZXMvdGFicy90YWJzZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFbkUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7O0FBY3BELE1BQU0sT0FBTyxrQkFBa0I7SUE2SzdCLFlBQ0UsY0FBaUMsRUFDakMsVUFBc0IsRUFDdEIsY0FBdUMsRUFDdkMsZ0JBQTJDLEVBQzNDLGFBQStCOztRQTFGakM7O1dBRUc7UUFFSSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7UUFFdEQ7Ozs7V0FJRztRQUVJLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXpDOzs7O1dBSUc7UUFFSSxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUUxQzs7O1dBR0c7UUFFSSxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztRQTJCakUsOEJBQXlCLEdBQUcsRUFBRSxDQUFDO1FBUS9CLGVBQVUsR0FBeUIsRUFBRSxDQUFDO1FBRTdDLDRDQUFpQixJQUFJLE9BQU8sRUFBUSxFQUFDO1FBRXJDLDZEQUFrQyxJQUFJLE9BQU8sRUFBUSxFQUFDO1FBQ3RELGtFQUF1QyxJQUFJLE9BQU8sRUFBUSxFQUFDO1FBRTNELDhDQUFrQztRQUVsQywyQ0FBZ0IsRUFBRSxFQUFDO1FBRW5CLDRDQUErQztRQUUvQyw4Q0FBZ0QsTUFBTSxFQUFDO1FBRXZELHdDQUE2QixNQUFNLEVBQUM7UUFFcEMscURBQW1DO1FBQ25DLGlEQUF3QjtRQUN4QixxREFBeUM7UUFDekMsdURBQTZDO1FBQzdDLG9EQUFpQztRQVMvQix1QkFBQSxJQUFJLHNDQUFtQixjQUFjLE1BQUEsQ0FBQztRQUN0Qyx1QkFBQSxJQUFJLGtDQUFlLFVBQVUsTUFBQSxDQUFDO1FBQzlCLHVCQUFBLElBQUksc0NBQW1CLGNBQWMsTUFBQSxDQUFDO1FBQ3RDLHVCQUFBLElBQUksd0NBQXFCLGdCQUFnQixNQUFBLENBQUM7UUFDMUMsdUJBQUEsSUFBSSxxQ0FBa0IsYUFBYSxNQUFBLENBQUM7SUFDdEMsQ0FBQztJQXhMRDs7T0FFRztJQUNILElBQ1csTUFBTSxDQUFDLEtBQThCO1FBQzlDLElBQ0UsS0FBSyxLQUFLLFNBQVM7WUFDbkIsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsdUJBQUEsSUFBSSxtQ0FBUyxDQUFDLEVBQ3pEO1lBQ0EsT0FBTztTQUNSO1FBRUQsdUJBQUEsSUFBSSwrQkFBWSxLQUFLLE1BQUEsQ0FBQztRQUV0QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDYix1QkFBQSxJQUFJLHlDQUFlLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNMLHNGQUFzRjtZQUN0RixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDOUMsb0RBQW9EO29CQUNwRCxJQUFJLHVCQUFBLElBQUkseUZBQWdDLE1BQXBDLElBQUksQ0FBa0MsS0FBSyxTQUFTLEVBQUU7d0JBQ3hELHVCQUFBLElBQUkseUNBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDOUM7aUJBQ0Y7cUJBQU07b0JBQ0wsMERBQTBEO29CQUMxRCx1QkFBQSxJQUFJLCtCQUFZLHVCQUFBLElBQUkseUNBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFBLENBQUM7aUJBQ3hEO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLHVCQUFBLElBQUksbUNBQVMsQ0FBQztJQUN2QixDQUFDO0lBbUJEOzs7Ozs7T0FNRztJQUNILElBQ1csV0FBVyxDQUFDLEtBQXlCO1FBQzlDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVix1QkFBQSxJQUFJLG9DQUFpQixFQUFFLE1BQUEsQ0FBQztTQUN6QjthQUFNO1lBQ0wsTUFBTSxTQUFTLEdBQUcsdUJBQUEsSUFBSSw0Q0FBa0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsdUJBQUEsSUFBSSxvQ0FBaUIsR0FBRyxTQUFTLGFBQWEsTUFBQSxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQztJQUVELElBQVcsV0FBVztRQUNwQixPQUFPLHVCQUFBLElBQUksd0NBQWMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFDVyxRQUFRLENBQUMsS0FBaUM7UUFDbkQsdUJBQUEsSUFBSSxpQ0FBYyxLQUFLLElBQUksTUFBTSxNQUFBLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLHVCQUFBLElBQUkscUNBQVcsQ0FBQztJQUN6QixDQUFDO0lBK0JELElBQVcsY0FBYyxDQUFDLEtBQWtDO1FBQzFELHVCQUFBLElBQUksdUNBQW9CLEtBQUssTUFBQSxDQUFDO1FBQzlCLHVCQUFBLElBQUksMENBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVcsY0FBYztRQUN2QixPQUFPLHVCQUFBLElBQUksMkNBQWlCLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQ1csSUFBSSxDQUFDLEtBQTZDO1FBQzNELHVCQUFBLElBQUksNkJBQVUsS0FBSyxNQUFBLENBQUM7UUFDcEIsdUJBQUEsSUFBSSwwREFBZ0MsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUU1QyxLQUFLLEVBQUUsT0FBTzthQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQUEsSUFBSSwwREFBZ0MsQ0FBQyxDQUFDO2FBQ3JELFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCx1QkFBQSxJQUFJLDZFQUFvQixNQUF4QixJQUFJLENBQXNCLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyx1QkFBQSxJQUFJLGlDQUFPLENBQUM7SUFDckIsQ0FBQztJQStDTSxlQUFlO1FBQ3BCLHVCQUFBLElBQUksNEVBQW1CLE1BQXZCLElBQUksQ0FBcUIsQ0FBQztRQUUxQixNQUFNLGVBQWUsR0FBRyx1QkFBQSxJQUFJLDZFQUFvQixNQUF4QixJQUFJLENBQXNCLENBQUM7UUFDbkQsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXZELHVCQUFBLElBQUkseUZBQWdDLE1BQXBDLElBQUksQ0FBa0MsQ0FBQztRQUN2Qyx1QkFBQSxJQUFJLHVGQUE4QixNQUFsQyxJQUFJLENBQWdDLENBQUM7UUFFckMsOEVBQThFO1FBQzlFLHVCQUFBLElBQUkseUNBQWUsQ0FBQyxxQkFBcUI7YUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBQSxJQUFJLHlDQUFlLENBQUMsQ0FBQzthQUNwQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNqQixxREFBcUQ7WUFDckQsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCx1QkFBQSxJQUFJLHlDQUFlLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFTCwrRUFBK0U7UUFDL0UsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLHVCQUFBLElBQUkseUZBQWdDLE1BQXBDLElBQUksQ0FBa0MsQ0FBQztZQUN2Qyx1QkFBQSxJQUFJLGtGQUF5QixNQUE3QixJQUFJLENBQTJCLENBQUM7WUFDaEMsdUJBQUEsSUFBSSw0Q0FBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxXQUFXO1FBQ2hCLHVCQUFBLElBQUkseUNBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQix1QkFBQSxJQUFJLHlDQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDL0IsdUJBQUEsSUFBSSwwREFBZ0MsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1Qyx1QkFBQSxJQUFJLDBEQUFnQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELHVCQUFBLElBQUksOEZBQXFDLE1BQXpDLElBQUksQ0FBdUMsQ0FBQztRQUM1QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsdUJBQUEsSUFBSSw0Q0FBa0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3JEO0lBQ0gsQ0FBQztJQUVNLGNBQWM7UUFDbkIsdUJBQUEsSUFBSSwwQ0FBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRU0sZUFBZSxDQUFDLFNBQTZCO1FBQ2xELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDM0MsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FDdEUsQ0FBQztRQUVGLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVNLGdCQUFnQixDQUFDLFNBQTZCO1FBQ25ELHVCQUFBLElBQUkseUNBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxjQUFjO1FBQ25CLHVCQUFBLElBQUkseUNBQWUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTSxhQUFhO1FBQ2xCLHVCQUFBLElBQUkseUNBQWUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTSxhQUFhO1FBQ2xCLHVCQUFBLElBQUkseUNBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVNLFlBQVk7UUFDakIsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDOzs7SUFTQyxJQUFJLFdBQVcsR0FDYix1QkFBQSxJQUFJLHlGQUFnQyxNQUFwQyxJQUFJLENBQWtDLENBQUM7SUFDekMsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1FBQzdCLFdBQVcsR0FBRyx1QkFBQSxJQUFJLGdGQUF1QixNQUEzQixJQUFJLENBQXlCLEVBQUUsUUFBUSxDQUFDO1FBQ3RELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUM3QixXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUMzQjtLQUNGO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztJQUdDLHVCQUFBLElBQUkseUNBQWUsQ0FBQyxjQUFjO1NBQy9CLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLFNBQVMsQ0FBQyx1QkFBQSxJQUFJLHlDQUFlLENBQUMsQ0FBQztTQUM1RCxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtRQUN6Qix1QkFBQSxJQUFJLGdGQUF1QixNQUEzQixJQUFJLEVBQXdCLFdBQVcsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztJQUdDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtRQUNiLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3BELElBQUksQ0FDSCxTQUFTLENBQ1AsSUFBSSxDQUFDLHVCQUFBLElBQUksK0RBQXFDLEVBQUUsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLENBQ3JFLENBQ0Y7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsK0VBQStFO1lBQy9FLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsTUFBTSxRQUFRLEdBQUcsdUJBQUEsSUFBSSxnRkFBdUIsTUFBM0IsSUFBSSxDQUF5QixFQUFFLFFBQVEsQ0FBQztnQkFDekQsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFTCxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUN0RCxJQUFJLENBQ0gsU0FBUyxDQUNQLElBQUksQ0FBQyx1QkFBQSxJQUFJLCtEQUFxQyxFQUFFLHVCQUFBLElBQUkseUNBQWUsQ0FBQyxDQUNyRSxDQUNGO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLCtCQUErQjtZQUMvQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLEVBQUU7Z0JBQ3pDLDBFQUEwRTtnQkFDMUUsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCx1QkFBQSxJQUFJLGdGQUF1QixNQUEzQixJQUFJLEVBQ0YsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLHFCQUFxQixFQUN6QyxJQUFJLENBQ0wsQ0FBQztvQkFDRix1QkFBQSxJQUFJLDZFQUFvQixNQUF4QixJQUFJLENBQXNCLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ25ELElBQUksQ0FDSCxTQUFTLENBQ1AsSUFBSSxDQUFDLHVCQUFBLElBQUksK0RBQXFDLEVBQUUsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLENBQ3JFLENBQ0Y7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsK0VBQStFO1lBQy9FLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsdUJBQUEsSUFBSSxnRkFBdUIsTUFBM0IsSUFBSSxFQUNGLHVCQUFBLElBQUkseUNBQWUsQ0FBQyxxQkFBcUIsRUFDekMsSUFBSSxDQUNMLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0tBQ047QUFDSCxDQUFDO0lBR0MsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUM7SUFHQyx1QkFBQSxJQUFJLDhGQUFxQyxNQUF6QyxJQUFJLENBQXVDLENBQUM7SUFDNUMsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBRXBDLCtEQUErRDtJQUMvRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMzQix1QkFBQSxJQUFJLGdGQUF1QixNQUEzQixJQUFJLEVBQXdCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyQyxPQUFPO0tBQ1I7SUFFRCx1QkFBQSxJQUFJLDRFQUFtQixNQUF2QixJQUFJLENBQXFCLENBQUM7SUFDMUIsTUFBTSxXQUFXLEdBQUcsdUJBQUEsSUFBSSxnRkFBdUIsTUFBM0IsSUFBSSxDQUF5QixFQUFFLFFBQVEsQ0FBQztJQUM1RCx1QkFBQSxJQUFJLHlDQUFlLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFO1FBQ2pELFVBQVUsRUFBRSxLQUFLO0tBQ2xCLENBQUMsQ0FBQztJQUNILHVCQUFBLElBQUkseUZBQWdDLE1BQXBDLElBQUksQ0FBa0MsQ0FBQztBQUN6QyxDQUFDO0lBR0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0IsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQzFCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtTQUN2QixDQUFDLENBQUM7S0FDSixDQUFDLENBQUM7QUFDTCxDQUFDO0lBR0MsdUJBQUEsSUFBSSwrREFBcUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqRCx1QkFBQSxJQUFJLCtEQUFxQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JELHVCQUFBLElBQUksMkRBQXdDLElBQUksT0FBTyxFQUFRLE1BQUEsQ0FBQztBQUNsRSxDQUFDO0lBR0MsdUJBQUEsSUFBSSwwQ0FBZ0IsQ0FBQyxjQUFjLENBQUMsdUJBQUEsSUFBSSxzQ0FBWSxDQUFDLENBQUM7SUFDdEQsdUJBQUEsSUFBSSwwQ0FBZ0IsQ0FBQyxjQUFjO1NBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLENBQUM7U0FDcEMsU0FBUyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzFELHVCQUFBLElBQUksMENBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0lBTUMsdUJBQUEsSUFBSSw0Q0FBa0IsQ0FBQyxjQUFjO1NBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLENBQUM7U0FDcEMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNkLHVCQUFBLElBQUkseUZBQWdDLE1BQXBDLElBQUksQ0FBa0MsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7SUFHQyxNQUFNLFdBQVcsR0FBRyx1QkFBQSxJQUFJLHlGQUFnQyxNQUFwQyxJQUFJLENBQWtDLENBQUM7SUFDM0QsdUJBQUEsSUFBSSx5Q0FBZSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3JELENBQUM7SUFHQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7UUFDcEIsTUFBTSxVQUFVLEdBQUcsdUJBQUEsSUFBSSw0Q0FBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JFLElBQUksVUFBVSxFQUFFO1lBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FDcEIsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsS0FBSyxVQUFVLENBQ3BELEVBQUUsUUFBUSxDQUFDO1NBQ2I7UUFDRCxPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7SUFHQyxPQUFPLElBQUksQ0FBQyxJQUFJO1FBQ2QsRUFBRSxPQUFPLEVBQUU7U0FDVixPQUFPLEVBQUU7U0FDVCxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDeEMsQ0FBQyx1RkFHQyxXQUFvQztJQUVwQyxlQUFlO0lBQ2YsMEJBQTBCO0lBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2QsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sRUFBRSx1QkFBQSxJQUFJLHlDQUFlLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDO1FBQ3RFLFNBQVMsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFO1FBQzVCLFlBQVksRUFBRSxHQUFHLENBQUMsVUFBVTtRQUM1QixRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDdEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1lBQ3RCLENBQUMsQ0FBQyxJQUFJO1lBQ04sQ0FBQyxDQUFDLHVCQUFBLElBQUksNENBQWtCLENBQUMsWUFBWSxDQUNqQyxJQUFJLENBQUMsV0FBVyxFQUNoQixHQUFHLENBQUMsdUJBQXVCLENBQzVCO1FBQ0wsUUFBUSxFQUFFLEdBQUcsQ0FBQyxXQUFXO1FBQ3pCLGVBQWUsRUFBRSxHQUFHLENBQUMsY0FBYztRQUNuQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDMUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3RCLFNBQVMsRUFBRSxLQUFLLEdBQUcsQ0FBQztRQUNwQixjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUssQ0FBQyxNQUFNO0tBQ2xDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyx1RkFFaUIsV0FBb0M7SUFDcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNqQyxNQUFNLENBQUMsTUFBTSxHQUFHLHVCQUFBLElBQUkseUNBQWUsQ0FBQyxlQUFlLENBQ2pELE1BQU0sQ0FBQyxRQUFRLEVBQ2YsV0FBVyxDQUNaLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsaUdBWUMsV0FBb0MsRUFDcEMsb0JBQW9CLEdBQUcsS0FBSztJQUU1QixzQ0FBc0M7SUFDdEMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUN6Qix1QkFBQSxJQUFJLHlDQUFlLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDO1lBQzVELENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQ2hCLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFFSCxnQ0FBZ0M7SUFDaEMsSUFBSSxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsdUJBQUEsSUFBSSwyRUFBa0IsTUFBdEIsSUFBSSxFQUFtQixXQUFXLENBQUMsQ0FBQztLQUN2RDtTQUFNO1FBQ0wsdUJBQUEsSUFBSSwyRUFBa0IsTUFBdEIsSUFBSSxFQUFtQixXQUFXLENBQUMsQ0FBQztLQUNyQztJQUVELDJDQUEyQztJQUMzQyxJQUFJLENBQUMseUJBQXlCO1FBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDekIsT0FBTyx1QkFBQSxJQUFJLHlDQUFlLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQztJQUV2Qiw0Q0FBNEM7SUFDNUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ3BCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNqRCxPQUFPLHVCQUFBLElBQUkseUNBQWUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksa0JBQWtCLEVBQUU7WUFDdEIsdUJBQUEsSUFBSSw0Q0FBa0IsQ0FBQyxRQUFRLENBQzdCLElBQUksQ0FBQyxXQUFXLEVBQ2hCLGtCQUFrQixDQUFDLHVCQUF1QixDQUMzQyxDQUFDO1NBQ0g7S0FDRjtJQUVELHVFQUF1RTtJQUN2RSxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsdUJBQUEsSUFBSSwwQ0FBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QyxDQUFDLENBQUMsQ0FBQztJQUVILHVCQUFBLElBQUksMENBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFcEMsZ0RBQWdEO0lBQ2hELElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFdBQVcsRUFBRTtRQUMzQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQ3JDO0FBQ0gsQ0FBQzsrR0E3Z0JVLGtCQUFrQjttR0FBbEIsa0JBQWtCLHNTQVJsQjtRQUNULHVCQUF1QjtRQUN2Qix5QkFBeUI7UUFDekIsZ0JBQWdCO0tBQ2pCLCtDQWtJZ0IsZUFBZSw2QkN0S2xDLHl1R0FzR0E7MkZEOURhLGtCQUFrQjtrQkFaOUIsU0FBUzsrQkFDRSxZQUFZLGFBR1g7d0JBQ1QsdUJBQXVCO3dCQUN2Qix5QkFBeUI7d0JBQ3pCLGdCQUFnQjtxQkFDakIsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7OE9BTzFCLE1BQU07c0JBRGhCLEtBQUs7Z0JBdUNDLFNBQVM7c0JBRGYsS0FBSztnQkFVQyxjQUFjO3NCQURwQixLQUFLO2dCQVdLLFdBQVc7c0JBRHJCLEtBQUs7Z0JBbUJLLFFBQVE7c0JBRGxCLEtBQUs7Z0JBYUMsWUFBWTtzQkFEbEIsTUFBTTtnQkFTQSxNQUFNO3NCQURaLE1BQU07Z0JBU0EsT0FBTztzQkFEYixNQUFNO2dCQVFBLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFhSSxJQUFJO3NCQURkLGVBQWU7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCwgY29tYmluZUxhdGVzdCwgcmFjZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVGFiQnV0dG9uVmlld01vZGVsIH0gZnJvbSAnLi90YWItYnV0dG9uLXZpZXctbW9kZWwnO1xuaW1wb3J0IHsgU2t5VGFiSW5kZXggfSBmcm9tICcuL3RhYi1pbmRleCc7XG5pbXBvcnQgeyBTa3lUYWJDb21wb25lbnQgfSBmcm9tICcuL3RhYi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5VGFic2V0QWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL3RhYnNldC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5VGFic2V0QnV0dG9uc0Rpc3BsYXlNb2RlIH0gZnJvbSAnLi90YWJzZXQtYnV0dG9ucy1kaXNwbGF5LW1vZGUnO1xuaW1wb3J0IHsgU2t5VGFic2V0UGVybWFsaW5rU2VydmljZSB9IGZyb20gJy4vdGFic2V0LXBlcm1hbGluay5zZXJ2aWNlJztcbmltcG9ydCB7IFNreVRhYnNldFN0eWxlIH0gZnJvbSAnLi90YWJzZXQtc3R5bGUnO1xuaW1wb3J0IHsgU2t5VGFic2V0VGFiSW5kZXhlc0NoYW5nZSB9IGZyb20gJy4vdGFic2V0LXRhYi1pbmRleGVzLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lUYWJzZXRTZXJ2aWNlIH0gZnJvbSAnLi90YWJzZXQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS10YWJzZXQnLFxuICBzdHlsZVVybHM6IFsnLi90YWJzZXQuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYnNldC5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIFNreVRhYnNldEFkYXB0ZXJTZXJ2aWNlLFxuICAgIFNreVRhYnNldFBlcm1hbGlua1NlcnZpY2UsXG4gICAgU2t5VGFic2V0U2VydmljZSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRhYnNldENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBBY3RpdmF0ZXMgYSB0YWIgYnkgaXRzIGB0YWJJbmRleGAgcHJvcGVydHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGFjdGl2ZSh2YWx1ZTogU2t5VGFiSW5kZXggfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLiN0YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh2YWx1ZSwgdGhpcy4jX2FjdGl2ZSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLiNfYWN0aXZlID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy50YWJzKSB7XG4gICAgICB0aGlzLiN0YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT24gaW5pdCwgd2FpdCBmb3IgY2hpbGRyZW4gdGFicyB0byByZW5kZXIgYmVmb3JlIGJyb2FkY2FzdGluZyB0aGUgYWN0aXZlIHRhYiBpbmRleC5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy4jdGFic2V0U2VydmljZS5pc1ZhbGlkVGFiSW5kZXgodmFsdWUpKSB7XG4gICAgICAgICAgLy8gT24gaW5pdCwgeWllbGQgdG8gdGhlIHBlcm1hbGluayBJRCwgaWYgaXQgZXhpc3RzLlxuICAgICAgICAgIGlmICh0aGlzLiNnZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLiN0YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWN0aXZhdGUgdGhlIGZpcnN0IHRhYiBpZiB0aGUgbmV3IHRhYiBpbmRleCBpcyBpbnZhbGlkLlxuICAgICAgICAgIHRoaXMuI19hY3RpdmUgPSB0aGlzLiN0YWJzZXRTZXJ2aWNlLmFjdGl2YXRlRmlyc3RUYWIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmUoKTogU2t5VGFiSW5kZXggfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNfYWN0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhbiBBUklBIGxhYmVsIGZvciB0aGUgdGFic2V0LiBUaGlzIHNldHMgdGhlIHRhYnNldCdzIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGVcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICogSWYgdGhlIHRhYnNldCBpbmNsdWRlcyBhIHZpc2libGUgbGFiZWwsIHVzZSBgYXJpYUxhYmVsbGVkQnlgIGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYXJpYUxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgSFRNTCBlbGVtZW50IElEICh3aXRob3V0IHRoZSBsZWFkaW5nIGAjYCkgb2YgdGhlIGVsZW1lbnQgdGhhdCBsYWJlbHNcbiAgICogdGhlIHRhYnNldC4gVGhpcyBzZXRzIHRoZSB0YWJzZXQncyBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGVcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICogSWYgdGhlIHRhYnNldCBkb2VzIG5vdCBpbmNsdWRlIGEgdmlzaWJsZSBsYWJlbCwgdXNlIGBhcmlhTGFiZWxgIGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYXJpYUxhYmVsbGVkQnk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGlzdGluZ3Vpc2hlcyBhIHRhYnNldCdzIHVuaXF1ZSBzdGF0ZSBpbiB0aGUgVVJMIGJ5IGdlbmVyYXRpbmcgYSBxdWVyeSBwYXJhbWV0ZXJcbiAgICogdGhhdCBpcyB3cml0dGVuIGFzIGA/PHF1ZXJ5UGFyYW0+LWFjdGl2ZS10YWI9PHNhbml0aXplZC10YWItaGVhZGluZz5gLlxuICAgKiBUaGUgcXVlcnkgcGFyYW1ldGVyJ3MgdmFsdWUgaXMgcGFyc2VkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgc2VsZWN0ZWQgdGFiJ3MgaGVhZGluZyB0ZXh0LFxuICAgKiBidXQgeW91IGNhbiBzdXBwbHkgYSBjdXN0b20gcXVlcnkgcGFyYW1ldGVyIHZhbHVlIGZvciBlYWNoIHRhYiB3aXRoIGl0cyBgcGVybWFsaW5rVmFsdWVgLlxuICAgKiBUaGlzIGlucHV0IG9ubHkgYXBwbGllcyB3aGVuIGB0YWJTdHlsZWAgaXMgYFwidGFic1wiYFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBwZXJtYWxpbmtJZCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhpcy4jX3Blcm1hbGlua0lkID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IHRoaXMuI3Blcm1hbGlua1NlcnZpY2UudXJsaWZ5KHZhbHVlKTtcbiAgICAgIHRoaXMuI19wZXJtYWxpbmtJZCA9IGAke3Nhbml0aXplZH0tYWN0aXZlLXRhYmA7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBwZXJtYWxpbmtJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNfcGVybWFsaW5rSWQ7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBiZWhhdmlvciBmb3IgYSBzZXJpZXMgb2YgdGFicy5cbiAgICogQGRlZmF1bHQgXCJ0YWJzXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdGFiU3R5bGUodmFsdWU6IFNreVRhYnNldFN0eWxlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX3RhYlN0eWxlID0gdmFsdWUgfHwgJ3RhYnMnO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJTdHlsZSgpOiBTa3lUYWJzZXRTdHlsZSB7XG4gICAgcmV0dXJuIHRoaXMuI190YWJTdHlsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBhY3RpdmUgdGFiIGNoYW5nZXMuIFRoaXMgZXZlbnQgZW1pdHMgdGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgdGFiLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBhY3RpdmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNreVRhYkluZGV4PigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIGNsaWNrIHRoZSBidXR0b24gdG8gYWRkIGEgbmV3IHRhYi5cbiAgICogVGhlIG5ldyB0YWIgYnV0dG9uIGlzIGFkZGVkIHRvIHRoZSB0YWIgYXJlYSB3aGVuIHlvdSBzcGVjaWZ5IGEgbGlzdGVuZXIgZm9yIHRoaXMgZXZlbnQuXG4gICAqIFRoaXMgZXZlbnQgb25seSBhcHBsaWVzIHdoZW4gYHRhYlN0eWxlYCBpcyBgXCJ0YWJzXCJgLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBuZXdUYWIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgY2xpY2sgdGhlIGJ1dHRvbiB0byBvcGVuIGEgdGFiLlxuICAgKiBUaGUgb3BlbiB0YWIgYnV0dG9uIGlzIGFkZGVkIHRvIHRoZSB0YWIgYXJlYSB3aGVuIHlvdSBzcGVjaWZ5IGEgbGlzdGVuZXIgZm9yIHRoaXMgZXZlbnQuXG4gICAqIFRoaXMgZXZlbnQgb25seSBhcHBsaWVzIHdoZW4gYHRhYlN0eWxlYCBpcyBgXCJ0YWJzXCJgLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvcGVuVGFiID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGFueSB0YWIncyBgdGFiSW5kZXhgIHZhbHVlIGNoYW5nZXMuXG4gICAqIFRoaXMgZXZlbnQgb25seSBhcHBsaWVzIHdoZW4gYHRhYlN0eWxlYCBpcyBgXCJ0YWJzXCJgLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyB0YWJJbmRleGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lUYWJzZXRUYWJJbmRleGVzQ2hhbmdlPigpO1xuXG4gIHB1YmxpYyBzZXQgdGFiRGlzcGxheU1vZGUodmFsdWU6IFNreVRhYnNldEJ1dHRvbnNEaXNwbGF5TW9kZSkge1xuICAgIHRoaXMuI190YWJEaXNwbGF5TW9kZSA9IHZhbHVlO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJEaXNwbGF5TW9kZSgpOiBTa3lUYWJzZXRCdXR0b25zRGlzcGxheU1vZGUge1xuICAgIHJldHVybiB0aGlzLiNfdGFiRGlzcGxheU1vZGU7XG4gIH1cblxuICBAQ29udGVudENoaWxkcmVuKFNreVRhYkNvbXBvbmVudClcbiAgcHVibGljIHNldCB0YWJzKHZhbHVlOiBRdWVyeUxpc3Q8U2t5VGFiQ29tcG9uZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI190YWJzID0gdmFsdWU7XG4gICAgdGhpcy4jdGFiQ29tcG9uZW50c0NoYW5nZVVuc3Vic2NyaWJlLm5leHQoKTtcblxuICAgIHZhbHVlPy5jaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jdGFiQ29tcG9uZW50c0NoYW5nZVVuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLiNyZXNldFRhYkNvbXBvbmVudHMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJzKCk6IFF1ZXJ5TGlzdDxTa3lUYWJDb21wb25lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX3RhYnM7XG4gIH1cblxuICBwdWJsaWMgZHJvcGRvd25UcmlnZ2VyQnV0dG9uVGV4dCA9ICcnO1xuXG4gIC8qKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgdGhlIGRlcHJlY2F0ZWQgdGFic2V0LW5hdi1idXR0b24gY29tcG9uZW50LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBsYXN0QWN0aXZlVGFiSW5kZXg6IFNreVRhYkluZGV4IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyB0YWJCdXR0b25zOiBUYWJCdXR0b25WaWV3TW9kZWxbXSA9IFtdO1xuXG4gICNuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAjdGFiQ29tcG9uZW50c0NoYW5nZVVuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgI3RhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAjX2FjdGl2ZTogU2t5VGFiSW5kZXggfCB1bmRlZmluZWQ7XG5cbiAgI19wZXJtYWxpbmtJZCA9ICcnO1xuXG4gICNfdGFiczogUXVlcnlMaXN0PFNreVRhYkNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XG5cbiAgI190YWJEaXNwbGF5TW9kZTogU2t5VGFic2V0QnV0dG9uc0Rpc3BsYXlNb2RlID0gJ3RhYnMnO1xuXG4gICNfdGFiU3R5bGU6IFNreVRhYnNldFN0eWxlID0gJ3RhYnMnO1xuXG4gICNjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWY7XG4gICNlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAjYWRhcHRlclNlcnZpY2U6IFNreVRhYnNldEFkYXB0ZXJTZXJ2aWNlO1xuICAjcGVybWFsaW5rU2VydmljZTogU2t5VGFic2V0UGVybWFsaW5rU2VydmljZTtcbiAgI3RhYnNldFNlcnZpY2U6IFNreVRhYnNldFNlcnZpY2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgYWRhcHRlclNlcnZpY2U6IFNreVRhYnNldEFkYXB0ZXJTZXJ2aWNlLFxuICAgIHBlcm1hbGlua1NlcnZpY2U6IFNreVRhYnNldFBlcm1hbGlua1NlcnZpY2UsXG4gICAgdGFic2V0U2VydmljZTogU2t5VGFic2V0U2VydmljZVxuICApIHtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3RvciA9IGNoYW5nZURldGVjdG9yO1xuICAgIHRoaXMuI2VsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlID0gYWRhcHRlclNlcnZpY2U7XG4gICAgdGhpcy4jcGVybWFsaW5rU2VydmljZSA9IHBlcm1hbGlua1NlcnZpY2U7XG4gICAgdGhpcy4jdGFic2V0U2VydmljZSA9IHRhYnNldFNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuI2luaXRUYWJDb21wb25lbnRzKCk7XG5cbiAgICBjb25zdCBpbml0aWFsVGFiSW5kZXggPSB0aGlzLiNnZXRJbml0aWFsVGFiSW5kZXgoKTtcbiAgICB0aGlzLiN0YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KGluaXRpYWxUYWJJbmRleCk7XG5cbiAgICB0aGlzLiNsaXN0ZW5UYWJCdXR0b25zT3ZlcmZsb3dDaGFuZ2UoKTtcbiAgICB0aGlzLiNsaXN0ZW5Mb2NhdGlvblBvcFN0YXRlQ2hhbmdlKCk7XG5cbiAgICAvLyBJZiB0aGUgY3VycmVudGx5IGFjdGl2ZSB0YWIgaXMgZ2V0dGluZyB1bnJlZ2lzdGVyZWQsIGFjdGl2YXRlIHRoZSBuZXh0IG9uZS5cbiAgICB0aGlzLiN0YWJzZXRTZXJ2aWNlLmFjdGl2ZVRhYlVucmVnaXN0ZXJlZFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgodGFiKSA9PiB7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBuZXcgdGFicyB0byByZW5kZXIgYmVmb3JlIGFjdGl2YXRpbmcuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3RhYnNldFNlcnZpY2UuYWN0aXZhdGVOZWFyZXN0VGFiKHRhYi5hcnJheUluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIC8vIExldCB0aGUgdGFic2V0IHJlbmRlciB0aGUgaW5pdGlhbCBhY3RpdmUgaW5kZXggYmVmb3JlIGxpc3RlbmluZyBmb3IgY2hhbmdlcy5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuI2xpc3RlblRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZSgpO1xuICAgICAgdGhpcy4jbGlzdGVuQWN0aXZlSW5kZXhDaGFuZ2UoKTtcbiAgICAgIHRoaXMuI3Blcm1hbGlua1NlcnZpY2UuaW5pdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLiN0YWJDb21wb25lbnRzQ2hhbmdlVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI3RhYkNvbXBvbmVudHNDaGFuZ2VVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuI3Vuc3Vic2NyaWJlVGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlKCk7XG4gICAgaWYgKHRoaXMucGVybWFsaW5rSWQpIHtcbiAgICAgIHRoaXMuI3Blcm1hbGlua1NlcnZpY2UuY2xlYXJQYXJhbSh0aGlzLnBlcm1hbGlua0lkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy4jYWRhcHRlclNlcnZpY2UuZGV0ZWN0T3ZlcmZsb3coKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRhYkNsb3NlQ2xpY2sodGFiQnV0dG9uOiBUYWJCdXR0b25WaWV3TW9kZWwpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJDb21wb25lbnQgPSB0aGlzLnRhYnM/LmZpbmQoKHRhYikgPT5cbiAgICAgIHRoaXMuI3RhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKHRhYi50YWJJbmRleCwgdGFiQnV0dG9uLnRhYkluZGV4KVxuICAgICk7XG5cbiAgICB0YWJDb21wb25lbnQ/LmNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRhYkJ1dHRvbkNsaWNrKHRhYkJ1dHRvbjogVGFiQnV0dG9uVmlld01vZGVsKTogdm9pZCB7XG4gICAgdGhpcy4jdGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleCh0YWJCdXR0b24udGFiSW5kZXgpO1xuICB9XG5cbiAgcHVibGljIG9uTmV3VGFiQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5uZXdUYWIuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIG9uT3BlblRhYkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMub3BlblRhYi5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25SaWdodEtleURvd24oKTogdm9pZCB7XG4gICAgdGhpcy4jdGFic2V0U2VydmljZS5mb2N1c05leHRUYWJCdG4odGhpcy50YWJCdXR0b25zKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkxlZnRLZXlEb3duKCk6IHZvaWQge1xuICAgIHRoaXMuI3RhYnNldFNlcnZpY2UuZm9jdXNQcmV2VGFiQnRuKHRoaXMudGFiQnV0dG9ucyk7XG4gIH1cblxuICBwdWJsaWMgb25Ib21lS2V5RG93bigpOiB2b2lkIHtcbiAgICB0aGlzLiN0YWJzZXRTZXJ2aWNlLmZvY3VzRmlyc3RPck5lYXJlc3RUYWJCdG4odGhpcy50YWJCdXR0b25zKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkVuZEtleURvd24oKTogdm9pZCB7XG4gICAgdGhpcy4jdGFic2V0U2VydmljZS5mb2N1c0xhc3RPck5lYXJlc3RUYWJCdG4odGhpcy50YWJCdXR0b25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbml0aWFsIGFjdGl2ZSB0YWIgaW5kZXggYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYS5cbiAgICogMS4gRG9lcyB0aGUgVVJMIGluY2x1ZGUgYSBxdWVyeSBwYXJhbSB0aGF0IHJlZmxlY3RzIHRoaXMgdGFic2V0J3MgYWN0aXZlIHRhYj9cbiAgICogMi4gRG9lcyBvbmUgb2YgdGhlIHRhYiBjb21wb25lbnRzIGhhdmUgdGhlaXIgYGFjdGl2ZWAgcHJvcGVydHkgc2V0IHRvIGB0cnVlYD9cbiAgICogMy4gSXMgdGhlIHRhYnNldCBjb21wb25lbnQncyBgYWN0aXZlYCBwcm9wZXJ0eSBzZXQgdG8gYSBzcGVjaWZpYyB0YWIgaW5kZXg/XG4gICAqL1xuICAjZ2V0SW5pdGlhbFRhYkluZGV4KCk6IFNreVRhYkluZGV4IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgYWN0aXZlSW5kZXg6IFNreVRhYkluZGV4IHwgdW5kZWZpbmVkID1cbiAgICAgIHRoaXMuI2dldEFjdGl2ZVRhYkluZGV4QnlQZXJtYWxpbmtJZCgpO1xuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3RpdmVJbmRleCA9IHRoaXMuI2dldEFjdGl2ZVRhYkNvbXBvbmVudCgpPy50YWJJbmRleDtcbiAgICAgIGlmIChhY3RpdmVJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGl2ZUluZGV4ID0gdGhpcy5hY3RpdmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGl2ZUluZGV4O1xuICB9XG5cbiAgI2xpc3RlbkFjdGl2ZUluZGV4Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuI3RhYnNldFNlcnZpY2UuYWN0aXZlVGFiSW5kZXhcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGFjdGl2ZUluZGV4KSA9PiB7XG4gICAgICAgIHRoaXMuI3VwZGF0ZVRhYnNldENvbXBvbmVudChhY3RpdmVJbmRleCk7XG4gICAgICB9KTtcbiAgfVxuXG4gICNsaXN0ZW5UYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGFicykge1xuICAgICAgY29tYmluZUxhdGVzdCh0aGlzLnRhYnMubWFwKCh0YWIpID0+IHRhYi5hY3RpdmVDaGFuZ2UpKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwoXG4gICAgICAgICAgICByYWNlKHRoaXMuI3RhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLCB0aGlzLiNuZ1Vuc3Vic2NyaWJlKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgdGFiIGNvbXBvbmVudHMgdG8gcmVuZGVyIGNoYW5nZXMgYmVmb3JlIGZpbmRpbmcgdGhlIGFjdGl2ZSBvbmUuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YWJJbmRleCA9IHRoaXMuI2dldEFjdGl2ZVRhYkNvbXBvbmVudCgpPy50YWJJbmRleDtcbiAgICAgICAgICAgIHRoaXMuI3RhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgodGFiSW5kZXgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgY29tYmluZUxhdGVzdCh0aGlzLnRhYnMubWFwKCh0YWIpID0+IHRhYi50YWJJbmRleENoYW5nZSkpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbChcbiAgICAgICAgICAgIHJhY2UodGhpcy4jdGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUsIHRoaXMuI25nVW5zdWJzY3JpYmUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIC8vIERvbid0IGVtaXQgdGhlIGZpcnN0IGNoYW5nZS5cbiAgICAgICAgICBpZiAodGhpcy5sYXN0QWN0aXZlVGFiSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHRhYiBjb21wb25lbnRzIHRvIHJlbmRlciBjaGFuZ2VzIGJlZm9yZSB1cGRhdGluZyB0aGUgdmlldy5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLiN1cGRhdGVUYWJzZXRDb21wb25lbnQoXG4gICAgICAgICAgICAgICAgdGhpcy4jdGFic2V0U2VydmljZS5jdXJyZW50QWN0aXZlVGFiSW5kZXgsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLiNlbWl0VGFiSW5kZXhDaGFuZ2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbWJpbmVMYXRlc3QodGhpcy50YWJzLm1hcCgodGFiKSA9PiB0YWIuc3RhdGVDaGFuZ2UpKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwoXG4gICAgICAgICAgICByYWNlKHRoaXMuI3RhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLCB0aGlzLiNuZ1Vuc3Vic2NyaWJlKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgdGFiIGNvbXBvbmVudHMgdG8gcmVuZGVyIGNoYW5nZXMgYmVmb3JlIGZpbmRpbmcgdGhlIGFjdGl2ZSBvbmUuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiN1cGRhdGVUYWJzZXRDb21wb25lbnQoXG4gICAgICAgICAgICAgIHRoaXMuI3RhYnNldFNlcnZpY2UuY3VycmVudEFjdGl2ZVRhYkluZGV4LFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAjaW5pdFRhYkNvbXBvbmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy50YWJzPy5mb3JFYWNoKCh0YWIpID0+IHRhYi5pbml0KCkpO1xuICB9XG5cbiAgI3Jlc2V0VGFiQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLiN1bnN1YnNjcmliZVRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZSgpO1xuICAgIHRoaXMuI3RhYnNldFNlcnZpY2UudW5yZWdpc3RlckFsbCgpO1xuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIHRhYiBjb21wb25lbnRzLCBkbyBhIGhhcmQgcmVzZXQgb2YgdGhlIHZpZXcuXG4gICAgaWYgKHRoaXMudGFicz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLiN1cGRhdGVUYWJzZXRDb21wb25lbnQoMCwgdHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy4jaW5pdFRhYkNvbXBvbmVudHMoKTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuI2dldEFjdGl2ZVRhYkNvbXBvbmVudCgpPy50YWJJbmRleDtcbiAgICB0aGlzLiN0YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KGFjdGl2ZUluZGV4LCB7XG4gICAgICBlbWl0Q2hhbmdlOiBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLiNsaXN0ZW5UYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTtcbiAgfVxuXG4gICNlbWl0VGFiSW5kZXhDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy50YWJJbmRleGVzQ2hhbmdlLmVtaXQoe1xuICAgICAgdGFiczogdGhpcy50YWJzPy5tYXAoKHRhYikgPT4gKHtcbiAgICAgICAgdGFiSGVhZGluZzogdGFiLnRhYkhlYWRpbmcsXG4gICAgICAgIHRhYkluZGV4OiB0YWIudGFiSW5kZXgsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICAjdW5zdWJzY3JpYmVUYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy4jdGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI3RhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy4jdGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICB9XG5cbiAgI2xpc3RlblRhYkJ1dHRvbnNPdmVyZmxvd0NoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5yZWdpc3RlclRhYnNldCh0aGlzLiNlbGVtZW50UmVmKTtcbiAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5vdmVyZmxvd0NoYW5nZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoaXNPdmVyZmxvd2luZykgPT4ge1xuICAgICAgICB0aGlzLnRhYkRpc3BsYXlNb2RlID0gaXNPdmVyZmxvd2luZyA/ICdkcm9wZG93bicgOiAndGFicyc7XG4gICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBiYWNrL2ZvcndhcmQgaGlzdG9yeSBidXR0b24gcHJlc3NlcyB0byBkZXRlY3QgcXVlcnkgcGFyYW0gY2hhbmdlcyBpbiB0aGUgVVJMLlxuICAgKi9cbiAgI2xpc3RlbkxvY2F0aW9uUG9wU3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy4jcGVybWFsaW5rU2VydmljZS5wb3BTdGF0ZUNoYW5nZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuI3NldEFjdGl2ZVRhYkluZGV4QnlQZXJtYWxpbmtJZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICAjc2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy4jZ2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCk7XG4gICAgdGhpcy4jdGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleChhY3RpdmVJbmRleCk7XG4gIH1cblxuICAjZ2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCk6IFNreVRhYkluZGV4IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5wZXJtYWxpbmtJZCkge1xuICAgICAgY29uc3QgcGFyYW1WYWx1ZSA9IHRoaXMuI3Blcm1hbGlua1NlcnZpY2UuZ2V0UGFyYW0odGhpcy5wZXJtYWxpbmtJZCk7XG4gICAgICBpZiAocGFyYW1WYWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJzPy5maW5kKFxuICAgICAgICAgICh0YWIpID0+IHRhYi5wZXJtYWxpbmtWYWx1ZU9yRGVmYXVsdCA9PT0gcGFyYW1WYWx1ZVxuICAgICAgICApPy50YWJJbmRleDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAjZ2V0QWN0aXZlVGFiQ29tcG9uZW50KCk6IFNreVRhYkNvbXBvbmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudGFic1xuICAgICAgPy50b0FycmF5KClcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5maW5kKCh0YWIpID0+IHRhYi5hY3RpdmUgPT09IHRydWUpO1xuICB9XG5cbiAgI2NyZWF0ZVRhYkJ1dHRvbnMoXG4gICAgYWN0aXZlSW5kZXg6IFNreVRhYkluZGV4IHwgdW5kZWZpbmVkXG4gICk6IFRhYkJ1dHRvblZpZXdNb2RlbFtdIHtcbiAgICAvLyBTYWZldHkgY2hlY2tcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICghdGhpcy50YWJzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudGFicy5tYXAoKHRhYiwgaW5kZXgpID0+ICh7XG4gICAgICBhY3RpdmU6IHRoaXMuI3RhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKHRhYi50YWJJbmRleCwgYWN0aXZlSW5kZXgpLFxuICAgICAgY2xvc2VhYmxlOiB0YWIuaXNDbG9zZWFibGUoKSxcbiAgICAgIGFyaWFDb250cm9sczogdGFiLnRhYlBhbmVsSWQsXG4gICAgICBkaXNhYmxlZDogdGFiLmRpc2FibGVkLFxuICAgICAgYnV0dG9uSHJlZjogdGFiLmRpc2FibGVkXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMuI3Blcm1hbGlua1NlcnZpY2UuZ2V0UGFyYW1IcmVmKFxuICAgICAgICAgICAgdGhpcy5wZXJtYWxpbmtJZCxcbiAgICAgICAgICAgIHRhYi5wZXJtYWxpbmtWYWx1ZU9yRGVmYXVsdFxuICAgICAgICAgICksXG4gICAgICBidXR0b25JZDogdGFiLnRhYkJ1dHRvbklkLFxuICAgICAgYnV0dG9uVGV4dENvdW50OiB0YWIudGFiSGVhZGVyQ291bnQsXG4gICAgICBidXR0b25UZXh0OiB0YWIudGFiSGVhZGluZyxcbiAgICAgIHRhYkluZGV4OiB0YWIudGFiSW5kZXgsXG4gICAgICB0YWJOdW1iZXI6IGluZGV4ICsgMSxcbiAgICAgIHRvdGFsVGFic0NvdW50OiB0aGlzLnRhYnMhLmxlbmd0aCxcbiAgICB9KSk7XG4gIH1cblxuICAjdXBkYXRlVGFiQnV0dG9ucyhhY3RpdmVJbmRleDogU2t5VGFiSW5kZXggfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnRhYkJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uYWN0aXZlID0gdGhpcy4jdGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwoXG4gICAgICAgIGJ1dHRvbi50YWJJbmRleCxcbiAgICAgICAgYWN0aXZlSW5kZXhcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgVUkgYW5kIHN0YXRlIG9mIHRoZSB0YWJzZXQgY29tcG9uZW50IGFmdGVyIHRoZSB0YWIgaW5kZXggb3JcbiAgICogdGFiIGNvbXBvbmVudHMgaGF2ZSBjaGFuZ2VkLlxuICAgKiBAcGFyYW0gYWN0aXZlSW5kZXggVGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiIGluZGV4LlxuICAgKiBAcGFyYW0gcmVnZW5lcmF0ZVRhYkJ1dHRvbnMgSW5kaWNhdGVzIGlmIHRhYiBidXR0b24gdmlldyBtb2RlbHMgc2hvdWxkIGJlIHJlZ2VuZXJhdGVkLlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gYGZhbHNlYCB3aWxsIHNpbXBseSB1cGRhdGUgdGhlIGV4aXN0aW5nIHRhYiBidXR0b25zLiBTZXR0aW5nIHRoaXMgdmFsdWVcbiAgICogdG8gYHRydWVgIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gdGhlIHVuZGVybHlpbmcgdGFiIGNvbXBvbmVudHMgaGF2ZSBjaGFuZ2VkIGFuZCB0aGUgdGFiXG4gICAqIGJ1dHRvbnMgbXVzdCByZWZsZWN0IHRob3NlIGNoYW5nZXMuXG4gICAqL1xuICAjdXBkYXRlVGFic2V0Q29tcG9uZW50KFxuICAgIGFjdGl2ZUluZGV4OiBTa3lUYWJJbmRleCB8IHVuZGVmaW5lZCxcbiAgICByZWdlbmVyYXRlVGFiQnV0dG9ucyA9IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIC8vIEFjdGl2YXRlL2RlYWN0aXZhdGUgdGFiIGNvbXBvbmVudHMuXG4gICAgdGhpcy50YWJzPy5mb3JFYWNoKCh0YWIpID0+IHtcbiAgICAgIHRoaXMuI3RhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKHRhYi50YWJJbmRleCwgYWN0aXZlSW5kZXgpXG4gICAgICAgID8gdGFiLmFjdGl2YXRlKClcbiAgICAgICAgOiB0YWIuZGVhY3RpdmF0ZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHRoZSB0YWIgYnV0dG9uIG1vZGVscy5cbiAgICBpZiAocmVnZW5lcmF0ZVRhYkJ1dHRvbnMgfHwgIXRoaXMudGFiQnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudGFiQnV0dG9ucyA9IHRoaXMuI2NyZWF0ZVRhYkJ1dHRvbnMoYWN0aXZlSW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiN1cGRhdGVUYWJCdXR0b25zKGFjdGl2ZUluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRyb3Bkb3duIHRyaWdnZXIgYnV0dG9uIHRleHQuXG4gICAgdGhpcy5kcm9wZG93blRyaWdnZXJCdXR0b25UZXh0ID1cbiAgICAgIHRoaXMudGFiQnV0dG9ucy5maW5kKChiKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbChiLnRhYkluZGV4LCBhY3RpdmVJbmRleCk7XG4gICAgICB9KT8uYnV0dG9uVGV4dCA/PyAnJztcblxuICAgIC8vIFNldCB0aGUgcXVlcnkgcGFyYW1zIGJhc2VkIG9uIGFjdGl2ZSB0YWIuXG4gICAgaWYgKHRoaXMucGVybWFsaW5rSWQpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZVRhYkNvbXBvbmVudCA9IHRoaXMudGFicz8uZmluZCgodGFiKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh0YWIudGFiSW5kZXgsIGFjdGl2ZUluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGFjdGl2ZVRhYkNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLiNwZXJtYWxpbmtTZXJ2aWNlLnNldFBhcmFtKFxuICAgICAgICAgIHRoaXMucGVybWFsaW5rSWQsXG4gICAgICAgICAgYWN0aXZlVGFiQ29tcG9uZW50LnBlcm1hbGlua1ZhbHVlT3JEZWZhdWx0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2FpdCBmb3IgdGFiIGJ1dHRvbiB2aWV3IG1vZGVscyB0byByZW5kZXIgYmVmb3JlIGdhdWdpbmcgZGltZW5zaW9ucy5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlLmRldGVjdE92ZXJmbG93KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIEVtaXQgdGhlIG5ldyBhY3RpdmUgaW5kZXggdmFsdWUgdG8gY29uc3VtZXJzLlxuICAgIGlmICh0aGlzLmxhc3RBY3RpdmVUYWJJbmRleCAhPT0gYWN0aXZlSW5kZXgpIHtcbiAgICAgIHRoaXMubGFzdEFjdGl2ZVRhYkluZGV4ID0gYWN0aXZlSW5kZXg7XG4gICAgICB0aGlzLmFjdGl2ZUNoYW5nZS5lbWl0KGFjdGl2ZUluZGV4KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJza3ktdGFic2V0XCJcbiAgcm9sZT1cInRhYmxpc3RcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gIFtuZ0NsYXNzXT1cIlxuICAgICdza3ktdGFic2V0LW1vZGUtJyArIHRhYkRpc3BsYXlNb2RlICsgJyBza3ktdGFic2V0LXN0eWxlLScgKyB0YWJTdHlsZVxuICBcIlxuICAod2luZG93OnJlc2l6ZSk9XCJvbldpbmRvd1Jlc2l6ZSgpXCJcbiAgKGtleWRvd24uYXJyb3dyaWdodCk9XCJvblJpZ2h0S2V5RG93bigpXCJcbiAgKGtleWRvd24uYXJyb3dsZWZ0KT1cIm9uTGVmdEtleURvd24oKVwiXG4gIChrZXlkb3duLmhvbWUpPVwib25Ib21lS2V5RG93bigpXCJcbiAgKGtleWRvd24uZW5kKT1cIm9uRW5kS2V5RG93bigpXCJcbj5cbiAgPHNwYW4gY2xhc3M9XCJza3ktdGFic2V0LWRyb3Bkb3duXCI+XG4gICAgPHNreS1kcm9wZG93biAqbmdJZj1cInRhYkRpc3BsYXlNb2RlID09PSAnZHJvcGRvd24nXCIgYnV0dG9uVHlwZT1cInRhYlwiPlxuICAgICAgPHNreS1kcm9wZG93bi1idXR0b24+XG4gICAgICAgIHt7IGRyb3Bkb3duVHJpZ2dlckJ1dHRvblRleHQgfX1cbiAgICAgIDwvc2t5LWRyb3Bkb3duLWJ1dHRvbj5cbiAgICAgIDxza3ktZHJvcGRvd24tbWVudT5cbiAgICAgICAgPHNreS1kcm9wZG93bi1pdGVtXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHRhYkJ1dHRvbiBvZiB0YWJCdXR0b25zXCJcbiAgICAgICAgICBjbGFzcz1cInNreS10YWItZHJvcGRvd24tbWVudS1pdGVtXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwic2t5LXRhYi1kcm9wZG93bi1pdGVtXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ3NreS10YWItZHJvcGRvd24taXRlbS1zZWxlY3RlZCc6IHRhYkJ1dHRvbi5hY3RpdmVcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICB0YWJCdXR0b25UZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHRhYkJ1dHRvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9za3ktZHJvcGRvd24taXRlbT5cbiAgICAgIDwvc2t5LWRyb3Bkb3duLW1lbnU+XG4gICAgPC9za3ktZHJvcGRvd24+XG4gIDwvc3Bhbj5cbiAgPHNwYW4gY2xhc3M9XCJza3ktdGFic2V0LXRhYnNcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0YWJCdXR0b24gb2YgdGFiQnV0dG9uc1wiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgIHRhYkJ1dHRvblRlbXBsYXRlO1xuICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogdGFiQnV0dG9uXG4gICAgICAgICAgfVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3NwYW4+XG4gIDxzcGFuIGNsYXNzPVwic2t5LXRhYnNldC1idG5zXCI+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJuZXdUYWIub2JzZXJ2ZXJzLmxlbmd0aCA+IDBcIlxuICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4taWNvbiBza3ktdGFic2V0LWJ0bi1uZXcgc2t5LW1hcmdpbi1pbmxpbmUtY29tcGFjdFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3NreXV4X3RhYl9hZGQnIHwgc2t5TGliUmVzb3VyY2VzXCJcbiAgICAgIFtza3lUaGVtZUNsYXNzXT1cIntcbiAgICAgICAgJ3NreS1tYXJnaW4taW5saW5lLXNtJzogJ21vZGVybidcbiAgICAgIH1cIlxuICAgICAgKGNsaWNrKT1cIm9uTmV3VGFiQ2xpY2soKVwiXG4gICAgPlxuICAgICAgPHNreS1pY29uIGljb249XCJwbHVzLWNpcmNsZVwiIHNpemU9XCJsZ1wiPiA8L3NreS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwib3BlblRhYi5vYnNlcnZlcnMubGVuZ3RoID4gMFwiXG4gICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1pY29uIHNreS10YWJzZXQtYnRuLW9wZW4gc2t5LW1hcmdpbi1pbmxpbmUtY29tcGFjdFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3NreXV4X3RhYl9vcGVuJyB8IHNreUxpYlJlc291cmNlc1wiXG4gICAgICBbc2t5VGhlbWVDbGFzc109XCJ7XG4gICAgICAgICdza3ktbWFyZ2luLWlubGluZS1zbSc6ICdtb2Rlcm4nXG4gICAgICB9XCJcbiAgICAgIChjbGljayk9XCJvbk9wZW5UYWJDbGljaygpXCJcbiAgICA+XG4gICAgICA8c2t5LWljb24gaWNvbj1cImZvbGRlci1vcGVuLW9cIiBzaXplPVwibGdcIj4gPC9za3ktaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9zcGFuPlxuPC9kaXY+XG48bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbjxuZy10ZW1wbGF0ZSBsZXQtdGFiQnV0dG9uICN0YWJCdXR0b25UZW1wbGF0ZT5cbiAgPHNreS10YWItYnV0dG9uXG4gICAgW2FjdGl2ZV09XCJ0YWJCdXR0b24uYWN0aXZlXCJcbiAgICBbYXJpYUNvbnRyb2xzXT1cInRhYkJ1dHRvbi5hcmlhQ29udHJvbHNcIlxuICAgIFtidXR0b25IcmVmXT1cInRhYkJ1dHRvbi5idXR0b25IcmVmXCJcbiAgICBbYnV0dG9uSWRdPVwidGFiQnV0dG9uLmJ1dHRvbklkXCJcbiAgICBbYnV0dG9uVGV4dF09XCJ0YWJCdXR0b24uYnV0dG9uVGV4dFwiXG4gICAgW2J1dHRvblRleHRDb3VudF09XCJ0YWJCdXR0b24uYnV0dG9uVGV4dENvdW50XCJcbiAgICBbY2xvc2VhYmxlXT1cInRhYkJ1dHRvbi5jbG9zZWFibGVcIlxuICAgIFtkaXNhYmxlZF09XCJ0YWJCdXR0b24uZGlzYWJsZWRcIlxuICAgIFt0YWJJbmRleF09XCJ0YWJCdXR0b24udGFiSW5kZXhcIlxuICAgIFt0YWJTdHlsZV09XCJ0YWJTdHlsZVwiXG4gICAgW3RhYk51bWJlcl09XCJ0YWJCdXR0b24udGFiTnVtYmVyXCJcbiAgICBbdG90YWxUYWJzQ291bnRdPVwidGFiQnV0dG9uLnRvdGFsVGFic0NvdW50XCJcbiAgICAoYnV0dG9uQ2xpY2spPVwib25UYWJCdXR0b25DbGljayh0YWJCdXR0b24pXCJcbiAgICAoY2xvc2VDbGljayk9XCJvblRhYkNsb3NlQ2xpY2sodGFiQnV0dG9uKVwiXG4gID48L3NreS10YWItYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==