@sbb-esta/lyne-elements-experimental 2.10.0 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/custom-elements.json +4286 -0
  2. package/development/seat-reservation/common/mapper/icon-mapper.d.ts +112 -0
  3. package/development/seat-reservation/common/mapper/icon-mapper.d.ts.map +1 -0
  4. package/development/seat-reservation/common/mapper/icon-mapper.js +72 -0
  5. package/development/seat-reservation/common/mapper/mapper.d.ts +29 -0
  6. package/development/seat-reservation/common/mapper/mapper.d.ts.map +1 -0
  7. package/development/seat-reservation/common/mapper/mapper.js +117 -0
  8. package/development/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts +225 -0
  9. package/development/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts.map +1 -0
  10. package/development/seat-reservation/common/mapper/seat-reservation-sample-data.js +6152 -0
  11. package/development/seat-reservation/common/mapper.d.ts +3 -0
  12. package/development/seat-reservation/common/mapper.d.ts.map +1 -0
  13. package/development/seat-reservation/common/mapper.js +10 -0
  14. package/development/seat-reservation/common/svgs.d.ts +25 -0
  15. package/development/seat-reservation/common/svgs.d.ts.map +1 -0
  16. package/development/seat-reservation/common/svgs.js +48 -0
  17. package/development/seat-reservation/common/translations/i18n.d.ts +19 -0
  18. package/development/seat-reservation/common/translations/i18n.d.ts.map +1 -0
  19. package/development/seat-reservation/common/translations/i18n.js +462 -0
  20. package/development/seat-reservation/common/translations.d.ts +2 -0
  21. package/development/seat-reservation/common/translations.d.ts.map +1 -0
  22. package/development/seat-reservation/common/translations.js +5 -0
  23. package/development/seat-reservation/common.d.ts +5 -0
  24. package/development/seat-reservation/common.d.ts.map +1 -0
  25. package/development/seat-reservation/common.js +18 -0
  26. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +156 -0
  27. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -0
  28. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +706 -0
  29. package/development/seat-reservation/seat-reservation/seat-reservation-scoped-component/seat-reservation-scoped.component.d.ts +29 -0
  30. package/development/seat-reservation/seat-reservation/seat-reservation-scoped-component/seat-reservation-scoped.component.d.ts.map +1 -0
  31. package/development/seat-reservation/seat-reservation/seat-reservation-scoped-component/seat-reservation-scoped.component.js +196 -0
  32. package/development/seat-reservation/seat-reservation/seat-reservation-scoped-component.d.ts +2 -0
  33. package/development/seat-reservation/seat-reservation/seat-reservation-scoped-component.d.ts.map +1 -0
  34. package/development/seat-reservation/seat-reservation/seat-reservation-scoped-component.js +5 -0
  35. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts +62 -0
  36. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -0
  37. package/development/seat-reservation/seat-reservation/seat-reservation.component.js +615 -0
  38. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.d.ts +18 -0
  39. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.d.ts.map +1 -0
  40. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +108 -0
  41. package/development/seat-reservation/seat-reservation-area.d.ts +2 -0
  42. package/development/seat-reservation/seat-reservation-area.d.ts.map +1 -0
  43. package/development/seat-reservation/seat-reservation-area.js +5 -0
  44. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.d.ts +9 -0
  45. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.d.ts.map +1 -0
  46. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +326 -0
  47. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.d.ts +29 -0
  48. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.d.ts.map +1 -0
  49. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +224 -0
  50. package/development/seat-reservation/seat-reservation-graphic.d.ts +2 -0
  51. package/development/seat-reservation/seat-reservation-graphic.d.ts.map +1 -0
  52. package/development/seat-reservation/seat-reservation-graphic.js +5 -0
  53. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts +65 -0
  54. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts.map +1 -0
  55. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +576 -0
  56. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach.d.ts +2 -0
  57. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach.d.ts.map +1 -0
  58. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach.js +5 -0
  59. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.d.ts +21 -0
  60. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.d.ts.map +1 -0
  61. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +123 -0
  62. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services.d.ts +2 -0
  63. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services.d.ts.map +1 -0
  64. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services.js +5 -0
  65. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts +53 -0
  66. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts.map +1 -0
  67. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +446 -0
  68. package/development/seat-reservation/seat-reservation-place-control.d.ts +2 -0
  69. package/development/seat-reservation/seat-reservation-place-control.d.ts.map +1 -0
  70. package/development/seat-reservation/seat-reservation-place-control.js +5 -0
  71. package/development/seat-reservation/seat-reservation.d.ts +73 -0
  72. package/development/seat-reservation/seat-reservation.d.ts.map +1 -0
  73. package/development/seat-reservation/seat-reservation.js +7 -0
  74. package/development/seat-reservation.d.ts +5 -0
  75. package/development/seat-reservation.d.ts.map +1 -0
  76. package/development/seat-reservation.js +7 -0
  77. package/index.d.ts +14 -0
  78. package/index.js +14 -0
  79. package/package.json +7 -2
  80. package/seat-reservation/common/mapper/icon-mapper.d.ts +112 -0
  81. package/seat-reservation/common/mapper/icon-mapper.d.ts.map +1 -0
  82. package/seat-reservation/common/mapper/icon-mapper.js +71 -0
  83. package/seat-reservation/common/mapper/mapper.d.ts +29 -0
  84. package/seat-reservation/common/mapper/mapper.d.ts.map +1 -0
  85. package/seat-reservation/common/mapper/mapper.js +87 -0
  86. package/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts +225 -0
  87. package/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts.map +1 -0
  88. package/seat-reservation/common/mapper/seat-reservation-sample-data.js +6149 -0
  89. package/seat-reservation/common/mapper.d.ts +3 -0
  90. package/seat-reservation/common/mapper.d.ts.map +1 -0
  91. package/seat-reservation/common/mapper.js +9 -0
  92. package/seat-reservation/common/svgs.d.ts +25 -0
  93. package/seat-reservation/common/svgs.d.ts.map +1 -0
  94. package/seat-reservation/common/svgs.js +250 -0
  95. package/seat-reservation/common/translations/i18n.d.ts +19 -0
  96. package/seat-reservation/common/translations/i18n.d.ts.map +1 -0
  97. package/seat-reservation/common/translations/i18n.js +460 -0
  98. package/seat-reservation/common/translations.d.ts +2 -0
  99. package/seat-reservation/common/translations.d.ts.map +1 -0
  100. package/seat-reservation/common/translations.js +4 -0
  101. package/seat-reservation/common.d.ts +5 -0
  102. package/seat-reservation/common.d.ts.map +1 -0
  103. package/seat-reservation/common.js +17 -0
  104. package/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +156 -0
  105. package/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -0
  106. package/seat-reservation/seat-reservation/seat-reservation-base-element.js +435 -0
  107. package/seat-reservation/seat-reservation/seat-reservation-scoped-component/seat-reservation-scoped.component.d.ts +29 -0
  108. package/seat-reservation/seat-reservation/seat-reservation-scoped-component/seat-reservation-scoped.component.d.ts.map +1 -0
  109. package/seat-reservation/seat-reservation/seat-reservation-scoped-component/seat-reservation-scoped.component.js +107 -0
  110. package/seat-reservation/seat-reservation/seat-reservation-scoped-component.d.ts +2 -0
  111. package/seat-reservation/seat-reservation/seat-reservation-scoped-component.d.ts.map +1 -0
  112. package/seat-reservation/seat-reservation/seat-reservation-scoped-component.js +4 -0
  113. package/seat-reservation/seat-reservation/seat-reservation.component.d.ts +62 -0
  114. package/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -0
  115. package/seat-reservation/seat-reservation/seat-reservation.component.js +404 -0
  116. package/seat-reservation/seat-reservation-area/seat-reservation-area.component.d.ts +18 -0
  117. package/seat-reservation/seat-reservation-area/seat-reservation-area.component.d.ts.map +1 -0
  118. package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +49 -0
  119. package/seat-reservation/seat-reservation-area.d.ts +2 -0
  120. package/seat-reservation/seat-reservation-area.d.ts.map +1 -0
  121. package/seat-reservation/seat-reservation-area.js +4 -0
  122. package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.d.ts +9 -0
  123. package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.d.ts.map +1 -0
  124. package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +317 -0
  125. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.d.ts +29 -0
  126. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.d.ts.map +1 -0
  127. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +113 -0
  128. package/seat-reservation/seat-reservation-graphic.d.ts +2 -0
  129. package/seat-reservation/seat-reservation-graphic.d.ts.map +1 -0
  130. package/seat-reservation/seat-reservation-graphic.js +4 -0
  131. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts +65 -0
  132. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts.map +1 -0
  133. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +248 -0
  134. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach.d.ts +2 -0
  135. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach.d.ts.map +1 -0
  136. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach.js +4 -0
  137. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.d.ts +21 -0
  138. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.d.ts.map +1 -0
  139. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +80 -0
  140. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services.d.ts +2 -0
  141. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services.d.ts.map +1 -0
  142. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services.js +4 -0
  143. package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts +53 -0
  144. package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts.map +1 -0
  145. package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +190 -0
  146. package/seat-reservation/seat-reservation-place-control.d.ts +2 -0
  147. package/seat-reservation/seat-reservation-place-control.d.ts.map +1 -0
  148. package/seat-reservation/seat-reservation-place-control.js +4 -0
  149. package/seat-reservation/seat-reservation.d.ts +73 -0
  150. package/seat-reservation/seat-reservation.d.ts.map +1 -0
  151. package/seat-reservation/seat-reservation.js +6 -0
  152. package/seat-reservation.d.ts +5 -0
  153. package/seat-reservation.d.ts.map +1 -0
  154. package/seat-reservation.js +6 -0
@@ -0,0 +1,706 @@
1
+ var __typeError = (msg) => {
2
+ throw TypeError(msg);
3
+ };
4
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
5
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
6
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
8
+ import { __runInitializers, __esDecorate } from "tslib";
9
+ import { isArrowKeyOrPageKeysPressed } from "@sbb-esta/lyne-elements/core/a11y.js";
10
+ import { forceType } from "@sbb-esta/lyne-elements/core/decorators.js";
11
+ import { EventEmitter } from "@sbb-esta/lyne-elements/core/eventing.js";
12
+ import { LitElement } from "lit";
13
+ import { property, state } from "lit/decorators.js";
14
+ import { mapPlaceInfosToPlaceSelection, mapPlaceAndCoachToSeatReservationPlaceSelection, mapCoachInfosToCoachSelection } from "../common/mapper.js";
15
+ var ScrollDirection;
16
+ (function(ScrollDirection2) {
17
+ ScrollDirection2["right"] = "right";
18
+ ScrollDirection2["left"] = "left";
19
+ })(ScrollDirection || (ScrollDirection = {}));
20
+ let SeatReservationBaseElement = (() => {
21
+ var _seatReservation_accessor_storage, _hasNavigation_accessor_storage, _alignVertical_accessor_storage, _baseGridSize_accessor_storage, _height_accessor_storage, _maxReservations_accessor_storage, _preventPlaceClick_accessor_storage, _selectedCoachIndex_accessor_storage, _focusedCoachIndex_accessor_storage, _a;
22
+ let _classSuper = LitElement;
23
+ let _seatReservation_decorators;
24
+ let _seatReservation_initializers = [];
25
+ let _seatReservation_extraInitializers = [];
26
+ let _hasNavigation_decorators;
27
+ let _hasNavigation_initializers = [];
28
+ let _hasNavigation_extraInitializers = [];
29
+ let _alignVertical_decorators;
30
+ let _alignVertical_initializers = [];
31
+ let _alignVertical_extraInitializers = [];
32
+ let _baseGridSize_decorators;
33
+ let _baseGridSize_initializers = [];
34
+ let _baseGridSize_extraInitializers = [];
35
+ let _height_decorators;
36
+ let _height_initializers = [];
37
+ let _height_extraInitializers = [];
38
+ let _maxReservations_decorators;
39
+ let _maxReservations_initializers = [];
40
+ let _maxReservations_extraInitializers = [];
41
+ let _preventPlaceClick_decorators;
42
+ let _preventPlaceClick_initializers = [];
43
+ let _preventPlaceClick_extraInitializers = [];
44
+ let _selectedCoachIndex_decorators;
45
+ let _selectedCoachIndex_initializers = [];
46
+ let _selectedCoachIndex_extraInitializers = [];
47
+ let _focusedCoachIndex_decorators;
48
+ let _focusedCoachIndex_initializers = [];
49
+ let _focusedCoachIndex_extraInitializers = [];
50
+ return _a = class extends _classSuper {
51
+ constructor() {
52
+ super(...arguments);
53
+ __privateAdd(this, _seatReservation_accessor_storage);
54
+ __privateAdd(this, _hasNavigation_accessor_storage);
55
+ __privateAdd(this, _alignVertical_accessor_storage);
56
+ __privateAdd(this, _baseGridSize_accessor_storage);
57
+ __privateAdd(this, _height_accessor_storage);
58
+ __privateAdd(this, _maxReservations_accessor_storage);
59
+ __privateAdd(this, _preventPlaceClick_accessor_storage);
60
+ __privateAdd(this, _selectedCoachIndex_accessor_storage);
61
+ __privateAdd(this, _focusedCoachIndex_accessor_storage);
62
+ __privateSet(this, _seatReservation_accessor_storage, __runInitializers(this, _seatReservation_initializers, null));
63
+ __privateSet(this, _hasNavigation_accessor_storage, (__runInitializers(this, _seatReservation_extraInitializers), __runInitializers(this, _hasNavigation_initializers, true)));
64
+ __privateSet(this, _alignVertical_accessor_storage, (__runInitializers(this, _hasNavigation_extraInitializers), __runInitializers(this, _alignVertical_initializers, false)));
65
+ __privateSet(this, _baseGridSize_accessor_storage, (__runInitializers(this, _alignVertical_extraInitializers), __runInitializers(this, _baseGridSize_initializers, 16)));
66
+ __privateSet(this, _height_accessor_storage, (__runInitializers(this, _baseGridSize_extraInitializers), __runInitializers(this, _height_initializers, null)));
67
+ __privateSet(this, _maxReservations_accessor_storage, (__runInitializers(this, _height_extraInitializers), __runInitializers(this, _maxReservations_initializers, null)));
68
+ __privateSet(this, _preventPlaceClick_accessor_storage, (__runInitializers(this, _maxReservations_extraInitializers), __runInitializers(this, _preventPlaceClick_initializers, false)));
69
+ __privateSet(this, _selectedCoachIndex_accessor_storage, (__runInitializers(this, _preventPlaceClick_extraInitializers), __runInitializers(this, _selectedCoachIndex_initializers, -1)));
70
+ __privateSet(this, _focusedCoachIndex_accessor_storage, (__runInitializers(this, _selectedCoachIndex_extraInitializers), __runInitializers(this, _focusedCoachIndex_initializers, -1)));
71
+ this.selectedPlaces = (__runInitializers(this, _focusedCoachIndex_extraInitializers), new EventEmitter(this, _a.events.selectedPlaces));
72
+ this.selectedCoach = new EventEmitter(this, _a.events.selectedCoach);
73
+ this.coachBorderPadding = 6;
74
+ this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
75
+ this.currScrollDirection = ScrollDirection.right;
76
+ this.maxCalcCoachsWidth = 0;
77
+ this.scrollCoachsAreaWidth = 0;
78
+ this.triggerCoachPositionsCollection = [];
79
+ this.firstTabElement = null;
80
+ this.lastTabElement = null;
81
+ this.coachScrollArea = null;
82
+ this.currSelectedPlace = null;
83
+ this.currSelectedPlaceElementId = null;
84
+ this.currSelectedCoachIndex = -1;
85
+ this.preventCoachScrollByPlaceClick = false;
86
+ this.selectedSeatReservationPlaces = [];
87
+ this.seatReservationWithoutNavigationHasFocus = false;
88
+ this.isCochGridFocusable = false;
89
+ this.isAutoScrolling = false;
90
+ this.isKeyboardNavigation = false;
91
+ this.keyboardNavigationEvents = {
92
+ ArrowLeft: "ArrowLeft",
93
+ ArrowRight: "ArrowRight",
94
+ ArrowUp: "ArrowUp",
95
+ ArrowDown: "ArrowDown",
96
+ Tab: "Tab",
97
+ Enter: "Enter"
98
+ };
99
+ }
100
+ /** The seat reservation object which contains all coaches and places */
101
+ get seatReservation() {
102
+ return __privateGet(this, _seatReservation_accessor_storage);
103
+ }
104
+ set seatReservation(value) {
105
+ __privateSet(this, _seatReservation_accessor_storage, value);
106
+ }
107
+ /** The seat resvervation navigation can be toggled by this property */
108
+ get hasNavigation() {
109
+ return __privateGet(this, _hasNavigation_accessor_storage);
110
+ }
111
+ set hasNavigation(value) {
112
+ __privateSet(this, _hasNavigation_accessor_storage, value);
113
+ }
114
+ /** The seat reservation area is aligned vertically */
115
+ get alignVertical() {
116
+ return __privateGet(this, _alignVertical_accessor_storage);
117
+ }
118
+ set alignVertical(value) {
119
+ __privateSet(this, _alignVertical_accessor_storage, value);
120
+ }
121
+ /** The seat reservation area's base grid size */
122
+ get baseGridSize() {
123
+ return __privateGet(this, _baseGridSize_accessor_storage);
124
+ }
125
+ set baseGridSize(value) {
126
+ __privateSet(this, _baseGridSize_accessor_storage, value);
127
+ }
128
+ /** The seat reservation area's width */
129
+ get height() {
130
+ return __privateGet(this, _height_accessor_storage);
131
+ }
132
+ set height(value) {
133
+ __privateSet(this, _height_accessor_storage, value);
134
+ }
135
+ /** Maximal number of possible clickable seats */
136
+ get maxReservations() {
137
+ return __privateGet(this, _maxReservations_accessor_storage);
138
+ }
139
+ set maxReservations(value) {
140
+ __privateSet(this, _maxReservations_accessor_storage, value);
141
+ }
142
+ /** Any click functionality is prevented */
143
+ get preventPlaceClick() {
144
+ return __privateGet(this, _preventPlaceClick_accessor_storage);
145
+ }
146
+ set preventPlaceClick(value) {
147
+ __privateSet(this, _preventPlaceClick_accessor_storage, value);
148
+ }
149
+ get selectedCoachIndex() {
150
+ return __privateGet(this, _selectedCoachIndex_accessor_storage);
151
+ }
152
+ set selectedCoachIndex(value) {
153
+ __privateSet(this, _selectedCoachIndex_accessor_storage, value);
154
+ }
155
+ get focusedCoachIndex() {
156
+ return __privateGet(this, _focusedCoachIndex_accessor_storage);
157
+ }
158
+ set focusedCoachIndex(value) {
159
+ __privateSet(this, _focusedCoachIndex_accessor_storage, value);
160
+ }
161
+ willUpdate(changedProperties) {
162
+ var _a2, _b;
163
+ super.willUpdate(changedProperties);
164
+ if (changedProperties.has("seatReservation")) {
165
+ this._initSeatReservationPlaceSelection();
166
+ }
167
+ if (changedProperties.has("baseGridSize")) {
168
+ this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
169
+ (_a2 = this.style) == null ? void 0 : _a2.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
170
+ if (this.alignVertical) {
171
+ this._setVerticalAlignmentOffset();
172
+ }
173
+ }
174
+ if (changedProperties.has("height") && !!this.height) {
175
+ if (this.seatReservation.coachItems.length) {
176
+ this.baseGridSize = this.height / this.seatReservation.coachItems[0].dimension.h;
177
+ this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
178
+ (_b = this.style) == null ? void 0 : _b.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
179
+ if (this.alignVertical) {
180
+ this._setVerticalAlignmentOffset();
181
+ }
182
+ }
183
+ }
184
+ if (changedProperties.has("alignVertical") && this.alignVertical) {
185
+ this._setVerticalAlignmentOffset();
186
+ }
187
+ }
188
+ /* Init scroll event handling for coach navigation */
189
+ initNavigationSelectionByScrollEvent() {
190
+ var _a2, _b, _c;
191
+ this.firstTabElement = (_a2 = this.shadowRoot) == null ? void 0 : _a2.getElementById("first-tab-element");
192
+ this.lastTabElement = (_b = this.shadowRoot) == null ? void 0 : _b.getElementById("last-tab-element");
193
+ this.coachScrollArea = (_c = this.shadowRoot) == null ? void 0 : _c.getElementById("sbb-sr__parent-area");
194
+ if (this.coachScrollArea) {
195
+ let currCalcTriggerPos = 0;
196
+ this.scrollCoachsAreaWidth = this.coachScrollArea.getBoundingClientRect().width;
197
+ this.triggerCoachPositionsCollection = this.seatReservation.coachItems.map((coach) => {
198
+ const startPosX = currCalcTriggerPos;
199
+ const coachWidth = this.getCalculatedDimension(coach.dimension).w;
200
+ currCalcTriggerPos += coachWidth;
201
+ return {
202
+ start: startPosX,
203
+ end: currCalcTriggerPos,
204
+ width: coachWidth
205
+ };
206
+ });
207
+ this.maxCalcCoachsWidth = currCalcTriggerPos;
208
+ this.coachScrollArea.addEventListener("scrollend", () => {
209
+ const findScrollCoachIndex = this.isAutoScrolling ? this.currSelectedCoachIndex : this._getCoachIndexByScrollTriggerPosition();
210
+ if (this._isScrollableToSelectedCoach()) {
211
+ this.currSelectedCoachIndex = findScrollCoachIndex;
212
+ } else {
213
+ this.currSelectedCoachIndex = findScrollCoachIndex < this.currSelectedCoachIndex ? this.currSelectedCoachIndex : findScrollCoachIndex;
214
+ }
215
+ this.preventCoachScrollByPlaceClick = false;
216
+ this.updateCurrentSelectedCoach();
217
+ if (!this.hasNavigation) {
218
+ this.preselectPlaceInCoach();
219
+ this.isAutoScrolling = false;
220
+ }
221
+ });
222
+ if (this.alignVertical) {
223
+ this._setVerticalAlignmentOffset();
224
+ }
225
+ }
226
+ }
227
+ /**
228
+ * If no navigation exists (property setting -> hasNavigation) and a table coach gets the focus,
229
+ * the first place in the coach must be automatically preselected to control the place navigation via keyboard
230
+ *
231
+ * @param focusCoachIndex
232
+ */
233
+ onFocusTableCoachAndPreselectPlace(focusCoachIndex) {
234
+ if (!this.seatReservationWithoutNavigationHasFocus && !this.hasNavigation) {
235
+ this.seatReservationWithoutNavigationHasFocus = true;
236
+ this.currSelectedCoachIndex = focusCoachIndex === 0 ? this.getNextAvailableCoachIndex(-1) : this.getPrevAvailableCoachIndex(focusCoachIndex);
237
+ this.preselectPlaceInCoach();
238
+ }
239
+ }
240
+ /**
241
+ * Initialisation of Keyboard event handling to navigation between each places inside a selected coach by using [arrow] keys.
242
+ * With the [TAB] key the user navigation goes to the next coach navigation element and the currently selected place is automatically reset.
243
+ */
244
+ handleKeyboardEvent(event) {
245
+ const pressedKey = event.key;
246
+ if (this.currSelectedPlace) {
247
+ if (event.shiftKey && event.keyCode === 9) {
248
+ this._navigateCoachNavigationByKeyboard("PREV_TAB");
249
+ event.preventDefault();
250
+ return;
251
+ }
252
+ if (pressedKey === this.keyboardNavigationEvents.Tab) {
253
+ this._navigateCoachNavigationByKeyboard("NEXT_TAB");
254
+ event.preventDefault();
255
+ return;
256
+ }
257
+ }
258
+ if (this.currSelectedCoachIndex !== -1 && isArrowKeyOrPageKeysPressed(event)) {
259
+ event.preventDefault();
260
+ switch (pressedKey) {
261
+ case this.keyboardNavigationEvents.ArrowLeft:
262
+ {
263
+ const pressedLeftKeyMapping = this.alignVertical ? this.keyboardNavigationEvents.ArrowDown : pressedKey;
264
+ this._navigateToPlaceByKeyboard(pressedLeftKeyMapping);
265
+ }
266
+ break;
267
+ case this.keyboardNavigationEvents.ArrowRight:
268
+ {
269
+ const pressedRightKeyMapping = this.alignVertical ? this.keyboardNavigationEvents.ArrowUp : pressedKey;
270
+ this._navigateToPlaceByKeyboard(pressedRightKeyMapping);
271
+ }
272
+ break;
273
+ case this.keyboardNavigationEvents.ArrowUp:
274
+ {
275
+ const pressedUpKeyMapping = this.alignVertical ? this.keyboardNavigationEvents.ArrowLeft : pressedKey;
276
+ this._navigateToPlaceByKeyboard(pressedUpKeyMapping);
277
+ }
278
+ break;
279
+ case this.keyboardNavigationEvents.ArrowDown:
280
+ {
281
+ const pressedDownKeyMapping = this.alignVertical ? this.keyboardNavigationEvents.ArrowRight : pressedKey;
282
+ this._navigateToPlaceByKeyboard(pressedDownKeyMapping);
283
+ }
284
+ break;
285
+ }
286
+ }
287
+ }
288
+ /**
289
+ * Selects a place inside the coach if navigated via keyboard,
290
+ * otherwise the coach grid is selected (necessary for ScreenReader)
291
+ */
292
+ preselectPlaceInCoach() {
293
+ const closestPlace = this._getClosestPlaceByKeyDirection();
294
+ if (closestPlace) {
295
+ this.unfocusPlaceElement();
296
+ }
297
+ if (this.isKeyboardNavigation && this.isAutoScrolling) {
298
+ if (closestPlace) {
299
+ this.focusPlaceElement(closestPlace);
300
+ }
301
+ } else {
302
+ this.currSelectedPlace = closestPlace;
303
+ this._setFocusToSelectedCoachGrid();
304
+ }
305
+ }
306
+ scrollToSelectedNavCoach(selectedNavCoachIndex) {
307
+ if (selectedNavCoachIndex !== this.currSelectedCoachIndex) {
308
+ this.isAutoScrolling = true;
309
+ this.isCochGridFocusable = true;
310
+ this.currSelectedCoachIndex = selectedNavCoachIndex;
311
+ this._setScrollDirectionByCoachIndex();
312
+ const scrollToCoachPosX = this._getCoachScrollPositionX();
313
+ const isSelectedCoachIndexScrollable = this.selectedCoachIndex !== -1 || this.currSelectedCoachIndex > 0;
314
+ if (isSelectedCoachIndexScrollable && this._isScrollableToSelectedCoach()) {
315
+ this.coachScrollArea.scrollTo({
316
+ top: 0,
317
+ left: scrollToCoachPosX,
318
+ behavior: "smooth"
319
+ });
320
+ } else {
321
+ this.updateCurrentSelectedCoach();
322
+ }
323
+ }
324
+ }
325
+ /**
326
+ * Sets the new ScrollDirection by the new given target coach index.
327
+ */
328
+ _setScrollDirectionByCoachIndex() {
329
+ this.currScrollDirection = this.currSelectedCoachIndex > this.selectedCoachIndex ? ScrollDirection.right : ScrollDirection.left;
330
+ }
331
+ /**
332
+ * Returns the scroll start or end position X from the selected coach.
333
+ * In case the user is curretnly navigate throught places by keyboard and goes to previous coach,
334
+ * then we return the end position of the coach to get clostest next scroll position of the next focus place.
335
+ * @returns number
336
+ */
337
+ _getCoachScrollPositionX() {
338
+ const coachTriggerPoint = this.triggerCoachPositionsCollection[this.currSelectedCoachIndex];
339
+ const isFocusPlaceFromPreviousCoachPosition = this.isKeyboardNavigation && this.currScrollDirection === ScrollDirection.left && coachTriggerPoint.width > this.scrollCoachsAreaWidth;
340
+ return isFocusPlaceFromPreviousCoachPosition ? coachTriggerPoint.end - this.scrollCoachsAreaWidth : coachTriggerPoint.start;
341
+ }
342
+ /**
343
+ * Sets the focus on the HTML table (grid) caption element so that the heading is read out when using a ScreenReader.
344
+ */
345
+ _setFocusToSelectedCoachGrid() {
346
+ var _a2;
347
+ if (this.isCochGridFocusable) {
348
+ this.isCochGridFocusable = false;
349
+ const coachTableCaptionElement = (_a2 = this.shadowRoot) == null ? void 0 : _a2.querySelector("#sbb-sr-coach-caption-" + this.currSelectedCoachIndex);
350
+ if (coachTableCaptionElement) {
351
+ coachTableCaptionElement.focus();
352
+ }
353
+ }
354
+ }
355
+ /**
356
+ * Returns whether the current scrolled position can be used to scroll to the selected wagon
357
+ * @returns boolean
358
+ */
359
+ _isScrollableToSelectedCoach() {
360
+ const currScrollPosX = this.coachScrollArea.scrollLeft;
361
+ const coachScrollWindowWidth = this.coachScrollArea.getBoundingClientRect().width;
362
+ const maxScrollWidthArea = this.maxCalcCoachsWidth - coachScrollWindowWidth;
363
+ const currCoachTrigger = this.triggerCoachPositionsCollection[this.currSelectedCoachIndex];
364
+ const isScrollPosSameToCurrCoachPos = currScrollPosX === this.triggerCoachPositionsCollection[this.currSelectedCoachIndex].start;
365
+ return (currScrollPosX < maxScrollWidthArea || currScrollPosX > currCoachTrigger.start) && !isScrollPosSameToCurrCoachPos;
366
+ }
367
+ /**
368
+ * Returns the coach index which is currently visible in the scroll area
369
+ * @returns number
370
+ */
371
+ _getCoachIndexByScrollTriggerPosition() {
372
+ const scrollOffsetX = this.coachScrollArea.scrollLeft + this.scrollCoachsAreaWidth / 2;
373
+ return this.triggerCoachPositionsCollection.findIndex((coachTrigger) => scrollOffsetX >= coachTrigger.start && scrollOffsetX <= coachTrigger.end);
374
+ }
375
+ /**
376
+ * Get the first place of current selected coach by table cell coordinate 0-0 id.
377
+ * @returns Place or null
378
+ */
379
+ _getFirstPlaceInSelecedCoach() {
380
+ var _a2, _b, _c, _d, _e;
381
+ let firstPlace = null;
382
+ const coach = (_a2 = this.seatReservation) == null ? void 0 : _a2.coachItems[this.currSelectedCoachIndex];
383
+ const firstCellId = "cell-" + this.currSelectedCoachIndex + "-0-0";
384
+ const placeNumber = ((_d = (_c = (_b = this.shadowRoot) == null ? void 0 : _b.querySelector("[cell-id='" + firstCellId + "']")) == null ? void 0 : _c.querySelector("sbb-seat-reservation-place-control")) == null ? void 0 : _d.getAttribute("text")) || null;
385
+ if (coach && placeNumber) {
386
+ firstPlace = ((_e = coach.places) == null ? void 0 : _e.find((place) => place.number === placeNumber)) || null;
387
+ }
388
+ return firstPlace;
389
+ }
390
+ /**
391
+ * To get the correct closest place of current pressed key and the current selected place,
392
+ * we have to investigate the coordinates of each place to find the closest place of the currSelectedPlaceElementId.
393
+ * @param pressedKey
394
+ * @returns Place or null
395
+ */
396
+ _getClosestPlaceByKeyDirection(pressedKey) {
397
+ var _a2, _b, _c, _d, _e;
398
+ const coach = (_a2 = this.seatReservation) == null ? void 0 : _a2.coachItems[this.currSelectedCoachIndex];
399
+ let closestPlace = null;
400
+ if (coach.places) {
401
+ if (!this.currSelectedPlaceElementId) {
402
+ return this._getFirstPlaceInSelecedCoach();
403
+ } else {
404
+ if (this.currSelectedPlace) {
405
+ for (const place of coach.places) {
406
+ if (!pressedKey) {
407
+ if (this.currScrollDirection === ScrollDirection.right && place.position.y === ((_b = this.currSelectedPlace) == null ? void 0 : _b.position.y) && (!closestPlace || place.position.x < closestPlace.position.x)) {
408
+ closestPlace = place;
409
+ } else if (this.currScrollDirection === ScrollDirection.left && place.position.y === ((_c = this.currSelectedPlace) == null ? void 0 : _c.position.y) && (!closestPlace || place.position.x > closestPlace.position.x)) {
410
+ closestPlace = place;
411
+ }
412
+ } else {
413
+ if (place.number !== ((_d = this.currSelectedPlace) == null ? void 0 : _d.number)) {
414
+ if (pressedKey === this.keyboardNavigationEvents.ArrowRight && (place.position.y === this.currSelectedPlace.position.y || place.position.y === this.currSelectedPlace.position.y - 1) && place.position.x > this.currSelectedPlace.position.x && (!closestPlace || place.position.x < closestPlace.position.x)) {
415
+ closestPlace = place;
416
+ } else if (pressedKey === this.keyboardNavigationEvents.ArrowDown && (place.position.x === this.currSelectedPlace.position.x || place.position.x === this.currSelectedPlace.position.x + 1) && place.position.y > this.currSelectedPlace.position.y && (!closestPlace || place.position.y < closestPlace.position.y)) {
417
+ closestPlace = place;
418
+ } else if (pressedKey === this.keyboardNavigationEvents.ArrowLeft && (place.position.y === this.currSelectedPlace.position.y || place.position.y === this.currSelectedPlace.position.y + 1) && place.position.x < this.currSelectedPlace.position.x && (!closestPlace || place.position.x > closestPlace.position.x)) {
419
+ closestPlace = place;
420
+ } else if (pressedKey === this.keyboardNavigationEvents.ArrowUp && (place.position.x === this.currSelectedPlace.position.x || place.position.x === this.currSelectedPlace.position.x - 1) && place.position.y < ((_e = this.currSelectedPlace) == null ? void 0 : _e.position.y) && (!closestPlace || place.position.y > closestPlace.position.y)) {
421
+ closestPlace = place;
422
+ }
423
+ }
424
+ }
425
+ }
426
+ }
427
+ }
428
+ }
429
+ return closestPlace;
430
+ }
431
+ focusPlaceElement(place, coachIndex) {
432
+ this.unfocusPlaceElement();
433
+ if (place) {
434
+ this.currSelectedPlace = place;
435
+ if (coachIndex) {
436
+ this.currSelectedCoachIndex = coachIndex;
437
+ }
438
+ this._setCurrSelectedPlaceElementId(place);
439
+ const selectedPlaceElement = this._getPlaceHtmlElement();
440
+ if (selectedPlaceElement) {
441
+ selectedPlaceElement.setAttribute("keyfocus", "focus");
442
+ }
443
+ }
444
+ }
445
+ unfocusPlaceElement() {
446
+ const selectedPlaceElement = this._getPlaceHtmlElement();
447
+ if (selectedPlaceElement) {
448
+ selectedPlaceElement.setAttribute("keyfocus", "unfocus");
449
+ this._setCurrSelectedPlaceElementId(null);
450
+ this.currSelectedPlace = null;
451
+ }
452
+ }
453
+ getCalculatedDimension(elementDimension, coachDimension, isOriginHeight, isStretchHeight) {
454
+ if (coachDimension && !isOriginHeight) {
455
+ elementDimension.h += this.coachBorderOffset * 2;
456
+ }
457
+ if (isStretchHeight) {
458
+ elementDimension.h += this.coachBorderOffset;
459
+ }
460
+ return {
461
+ w: this.baseGridSize * elementDimension.w,
462
+ h: this.baseGridSize * elementDimension.h
463
+ };
464
+ }
465
+ getCalculatedPosition(elementPosition, elementDimension, coachDimension, isOriginHeight) {
466
+ if (coachDimension && elementDimension) {
467
+ const endPosHeight = isOriginHeight ? coachDimension.h : coachDimension.h + this.coachBorderOffset;
468
+ if (elementPosition.y === 0) {
469
+ elementPosition.y -= this.coachBorderOffset;
470
+ } else if (elementPosition.y + elementDimension.h === endPosHeight) {
471
+ elementPosition.y += this.coachBorderOffset;
472
+ }
473
+ }
474
+ return {
475
+ x: this.baseGridSize * elementPosition.x,
476
+ y: this.baseGridSize * elementPosition.y,
477
+ z: elementPosition.z
478
+ };
479
+ }
480
+ // Handling for Tab navigation if an place is selected inside the coach.
481
+ // This controls the focused coach from the current selected coach.
482
+ _navigateCoachNavigationByKeyboard(tabDirection) {
483
+ const currFocusIndex = this.focusedCoachIndex === -1 ? this.currSelectedCoachIndex === -1 ? 0 : this.currSelectedCoachIndex : this.focusedCoachIndex;
484
+ const newFocusableIndex = tabDirection === "NEXT_TAB" ? this.getNextAvailableCoachIndex(currFocusIndex) : this.getPrevAvailableCoachIndex(currFocusIndex);
485
+ if (currFocusIndex === newFocusableIndex) {
486
+ this.unfocusPlaceElement();
487
+ this.selectedCoachIndex = -1;
488
+ this.currSelectedCoachIndex = -1;
489
+ this.seatReservationWithoutNavigationHasFocus = false;
490
+ if (tabDirection === "NEXT_TAB")
491
+ this.lastTabElement.focus();
492
+ else
493
+ this.firstTabElement.focus();
494
+ return;
495
+ }
496
+ if (this.hasNavigation) {
497
+ const selectedPlaceElement = this._getPlaceHtmlElement();
498
+ const placeInCoachHasFocus = selectedPlaceElement ? selectedPlaceElement.getAttribute("keyfocus") === "focus" : false;
499
+ if (tabDirection === "PREV_TAB" && this.selectedCoachIndex === currFocusIndex) {
500
+ if (placeInCoachHasFocus) {
501
+ this.focusedCoachIndex = currFocusIndex;
502
+ this.unfocusPlaceElement();
503
+ } else {
504
+ this.focusedCoachIndex = newFocusableIndex;
505
+ }
506
+ } else if (newFocusableIndex !== this.currSelectedCoachIndex) {
507
+ this.focusedCoachIndex = newFocusableIndex;
508
+ } else {
509
+ this.focusedCoachIndex = -1;
510
+ this.selectedCoachIndex = newFocusableIndex;
511
+ if (placeInCoachHasFocus) {
512
+ this.focusPlaceElement(this.currSelectedPlace);
513
+ } else {
514
+ this.isCochGridFocusable = true;
515
+ this._setFocusToSelectedCoachGrid();
516
+ }
517
+ }
518
+ } else {
519
+ this.scrollToSelectedNavCoach(newFocusableIndex);
520
+ }
521
+ }
522
+ _navigateToPlaceByKeyboard(pressedKey) {
523
+ this.preventCoachScrollByPlaceClick = false;
524
+ this.isKeyboardNavigation = true;
525
+ if (this.focusedCoachIndex !== -1) {
526
+ this.focusedCoachIndex = -1;
527
+ }
528
+ if (!this.preventPlaceClick) {
529
+ const findClosestPlace = this._getClosestPlaceByKeyDirection(pressedKey);
530
+ if (findClosestPlace) {
531
+ this.focusPlaceElement(findClosestPlace);
532
+ } else {
533
+ if (pressedKey === this.keyboardNavigationEvents.ArrowRight || pressedKey === this.keyboardNavigationEvents.ArrowLeft || this.alignVertical && (pressedKey === this.keyboardNavigationEvents.ArrowUp || pressedKey === this.keyboardNavigationEvents.ArrowDown)) {
534
+ const newSelectedCoachIndex = pressedKey === this.keyboardNavigationEvents.ArrowRight ? this.getNextAvailableCoachIndex() : this.getPrevAvailableCoachIndex();
535
+ this.scrollToSelectedNavCoach(newSelectedCoachIndex);
536
+ }
537
+ }
538
+ }
539
+ }
540
+ getNextAvailableCoachIndex(currentIndex) {
541
+ const startIndex = currentIndex ?? this.currSelectedCoachIndex;
542
+ return startIndex < this.seatReservation.coachItems.length - 1 ? startIndex + 1 : startIndex;
543
+ }
544
+ getPrevAvailableCoachIndex(currentIndex) {
545
+ const startIndex = currentIndex ?? this.currSelectedCoachIndex;
546
+ return startIndex > 0 ? startIndex - 1 : startIndex;
547
+ }
548
+ updateSelectedSeatReservationPlaces(placeSelection) {
549
+ if (placeSelection.state === "SELECTED") {
550
+ const seatReservationSelection = this._getSeatReservationPlaceSelection(placeSelection);
551
+ if (seatReservationSelection) {
552
+ this.selectedSeatReservationPlaces.push(seatReservationSelection);
553
+ }
554
+ } else {
555
+ this.selectedSeatReservationPlaces = this.selectedSeatReservationPlaces.filter((_selectedPlace) => _selectedPlace.id !== placeSelection.id);
556
+ }
557
+ if (this.maxReservations && this.selectedSeatReservationPlaces.length > this.maxReservations) {
558
+ this._resetAllPlaceSelections(placeSelection);
559
+ }
560
+ this.selectedPlaces.emit(this.selectedSeatReservationPlaces);
561
+ }
562
+ updateCurrentSelectedPlaceInCoach(placeSelection) {
563
+ var _a2;
564
+ const coachIndex = placeSelection.coachIndex;
565
+ const place = (_a2 = this.seatReservation.coachItems[coachIndex].places) == null ? void 0 : _a2.find((place2) => place2.number == placeSelection.number);
566
+ if (!place)
567
+ return;
568
+ this.currSelectedCoachIndex = coachIndex;
569
+ this.currSelectedPlace = place;
570
+ if (this.currSelectedCoachIndex !== this.selectedCoachIndex) {
571
+ this.updateCurrentSelectedCoach();
572
+ }
573
+ this._setCurrSelectedPlaceElementId(place);
574
+ }
575
+ updateCurrentSelectedCoach() {
576
+ this.selectedCoachIndex = this.currSelectedCoachIndex;
577
+ this.focusedCoachIndex = -1;
578
+ const coachSelection = this._getSeatReservationCoachSelection(this.selectedCoachIndex);
579
+ if (coachSelection) {
580
+ this.selectedCoach.emit(coachSelection);
581
+ }
582
+ }
583
+ /**
584
+ * Initialization of SeatReservationPlaceSelection Array based on the transferred places
585
+ * that have the state SELECTED within the seatReservation object
586
+ */
587
+ _initSeatReservationPlaceSelection() {
588
+ this.seatReservation.coachItems.map((coach, coachIndex) => {
589
+ var _a2, _b;
590
+ (_b = (_a2 = coach.places) == null ? void 0 : _a2.filter((place) => place.state === "SELECTED")) == null ? void 0 : _b.forEach((place) => {
591
+ const preselectedPlaceSelection = mapPlaceInfosToPlaceSelection(place, coachIndex);
592
+ const seatReservationPlaceSelection = this._getSeatReservationPlaceSelection(preselectedPlaceSelection);
593
+ if (seatReservationPlaceSelection)
594
+ this.selectedSeatReservationPlaces.push(seatReservationPlaceSelection);
595
+ });
596
+ });
597
+ }
598
+ /**
599
+ * All selected places will be reset or the currentSelectedPlace was given, then we reset all except currentSelectedPlace
600
+ * @param currSelectedPlace
601
+ */
602
+ _resetAllPlaceSelections(currSelectedPlace) {
603
+ var _a2;
604
+ for (const placeSelection of this.selectedSeatReservationPlaces) {
605
+ if (!currSelectedPlace || currSelectedPlace.id !== placeSelection.id) {
606
+ const placeElement = (_a2 = this.shadowRoot) == null ? void 0 : _a2.getElementById(placeSelection.id);
607
+ placeElement.setAttribute("state", "FREE");
608
+ }
609
+ }
610
+ if (currSelectedPlace) {
611
+ this.selectedSeatReservationPlaces = this.selectedSeatReservationPlaces.filter((_selectedPlace) => _selectedPlace.id === currSelectedPlace.id);
612
+ } else {
613
+ this.selectedSeatReservationPlaces = [];
614
+ }
615
+ }
616
+ _getSeatReservationPlaceSelection(currSelectedPlace) {
617
+ var _a2;
618
+ const coach = this.seatReservation.coachItems[currSelectedPlace.coachIndex];
619
+ const place = (_a2 = coach.places) == null ? void 0 : _a2.find((place2) => place2.number === currSelectedPlace.number);
620
+ return place ? mapPlaceAndCoachToSeatReservationPlaceSelection(place, coach, currSelectedPlace.coachIndex) : null;
621
+ }
622
+ _getSeatReservationCoachSelection(coachIndex) {
623
+ if (!this.seatReservation.coachItems[coachIndex])
624
+ return null;
625
+ const coach = this.seatReservation.coachItems[coachIndex];
626
+ return mapCoachInfosToCoachSelection(coachIndex, coach);
627
+ }
628
+ _setCurrSelectedPlaceElementId(place) {
629
+ if (place) {
630
+ this.currSelectedPlaceElementId = "seat-reservation__place-button-" + this.currSelectedCoachIndex + "-" + place.number;
631
+ } else {
632
+ this.currSelectedPlaceElementId = null;
633
+ }
634
+ }
635
+ /**
636
+ * Returns the current selected place HTML element by given placeNumber and coachIndex.
637
+ * If both doesnt exist, we try to return the place HTML element by the _currentSelectedPlaceElementId
638
+ * @param placeNumber optional as string
639
+ * @param coachIndex optional as string
640
+ * @returns HTMLElement or null
641
+ */
642
+ _getPlaceHtmlElement(placeNumber, coachIndex) {
643
+ var _a2;
644
+ const currCoachIndex = coachIndex ? coachIndex : this.currSelectedCoachIndex;
645
+ const coachPlaceNumberId = placeNumber ? "seat-reservation__place-button-" + currCoachIndex + "-" + placeNumber : this.currSelectedPlaceElementId;
646
+ return coachPlaceNumberId ? ((_a2 = this.shadowRoot) == null ? void 0 : _a2.getElementById(coachPlaceNumberId)) || null : null;
647
+ }
648
+ //Set the vertical offset
649
+ _setVerticalAlignmentOffset() {
650
+ setTimeout(() => {
651
+ var _a2, _b;
652
+ const seatReservationWrapperElement = (_a2 = this.shadowRoot) == null ? void 0 : _a2.querySelector(".sbb-sr__wrapper");
653
+ if (seatReservationWrapperElement) {
654
+ const seatReservationVerticalOffset = seatReservationWrapperElement.getBoundingClientRect().width;
655
+ (_b = this.style) == null ? void 0 : _b.setProperty("--sbb-seat-reservation-vertical-offset", `${seatReservationVerticalOffset}px`);
656
+ }
657
+ });
658
+ }
659
+ }, _seatReservation_accessor_storage = new WeakMap(), _hasNavigation_accessor_storage = new WeakMap(), _alignVertical_accessor_storage = new WeakMap(), _baseGridSize_accessor_storage = new WeakMap(), _height_accessor_storage = new WeakMap(), _maxReservations_accessor_storage = new WeakMap(), _preventPlaceClick_accessor_storage = new WeakMap(), _selectedCoachIndex_accessor_storage = new WeakMap(), _focusedCoachIndex_accessor_storage = new WeakMap(), (() => {
660
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
661
+ _seatReservation_decorators = [property({ attribute: "seat-reservation", type: Object })];
662
+ _hasNavigation_decorators = [forceType(), property({ attribute: "has-navigation", type: Boolean })];
663
+ _alignVertical_decorators = [forceType(), property({ attribute: "align-vertical", type: Boolean })];
664
+ _baseGridSize_decorators = [forceType(), property({ attribute: "base-grid-size", type: Number })];
665
+ _height_decorators = [forceType(), property({ attribute: "height", type: Number })];
666
+ _maxReservations_decorators = [forceType(), property({ attribute: "max-reservations", type: Number })];
667
+ _preventPlaceClick_decorators = [forceType(), property({ attribute: "prevent-place-click", type: Boolean })];
668
+ _selectedCoachIndex_decorators = [state()];
669
+ _focusedCoachIndex_decorators = [state()];
670
+ __esDecorate(_a, null, _seatReservation_decorators, { kind: "accessor", name: "seatReservation", static: false, private: false, access: { has: (obj) => "seatReservation" in obj, get: (obj) => obj.seatReservation, set: (obj, value) => {
671
+ obj.seatReservation = value;
672
+ } }, metadata: _metadata }, _seatReservation_initializers, _seatReservation_extraInitializers);
673
+ __esDecorate(_a, null, _hasNavigation_decorators, { kind: "accessor", name: "hasNavigation", static: false, private: false, access: { has: (obj) => "hasNavigation" in obj, get: (obj) => obj.hasNavigation, set: (obj, value) => {
674
+ obj.hasNavigation = value;
675
+ } }, metadata: _metadata }, _hasNavigation_initializers, _hasNavigation_extraInitializers);
676
+ __esDecorate(_a, null, _alignVertical_decorators, { kind: "accessor", name: "alignVertical", static: false, private: false, access: { has: (obj) => "alignVertical" in obj, get: (obj) => obj.alignVertical, set: (obj, value) => {
677
+ obj.alignVertical = value;
678
+ } }, metadata: _metadata }, _alignVertical_initializers, _alignVertical_extraInitializers);
679
+ __esDecorate(_a, null, _baseGridSize_decorators, { kind: "accessor", name: "baseGridSize", static: false, private: false, access: { has: (obj) => "baseGridSize" in obj, get: (obj) => obj.baseGridSize, set: (obj, value) => {
680
+ obj.baseGridSize = value;
681
+ } }, metadata: _metadata }, _baseGridSize_initializers, _baseGridSize_extraInitializers);
682
+ __esDecorate(_a, null, _height_decorators, { kind: "accessor", name: "height", static: false, private: false, access: { has: (obj) => "height" in obj, get: (obj) => obj.height, set: (obj, value) => {
683
+ obj.height = value;
684
+ } }, metadata: _metadata }, _height_initializers, _height_extraInitializers);
685
+ __esDecorate(_a, null, _maxReservations_decorators, { kind: "accessor", name: "maxReservations", static: false, private: false, access: { has: (obj) => "maxReservations" in obj, get: (obj) => obj.maxReservations, set: (obj, value) => {
686
+ obj.maxReservations = value;
687
+ } }, metadata: _metadata }, _maxReservations_initializers, _maxReservations_extraInitializers);
688
+ __esDecorate(_a, null, _preventPlaceClick_decorators, { kind: "accessor", name: "preventPlaceClick", static: false, private: false, access: { has: (obj) => "preventPlaceClick" in obj, get: (obj) => obj.preventPlaceClick, set: (obj, value) => {
689
+ obj.preventPlaceClick = value;
690
+ } }, metadata: _metadata }, _preventPlaceClick_initializers, _preventPlaceClick_extraInitializers);
691
+ __esDecorate(_a, null, _selectedCoachIndex_decorators, { kind: "accessor", name: "selectedCoachIndex", static: false, private: false, access: { has: (obj) => "selectedCoachIndex" in obj, get: (obj) => obj.selectedCoachIndex, set: (obj, value) => {
692
+ obj.selectedCoachIndex = value;
693
+ } }, metadata: _metadata }, _selectedCoachIndex_initializers, _selectedCoachIndex_extraInitializers);
694
+ __esDecorate(_a, null, _focusedCoachIndex_decorators, { kind: "accessor", name: "focusedCoachIndex", static: false, private: false, access: { has: (obj) => "focusedCoachIndex" in obj, get: (obj) => obj.focusedCoachIndex, set: (obj, value) => {
695
+ obj.focusedCoachIndex = value;
696
+ } }, metadata: _metadata }, _focusedCoachIndex_initializers, _focusedCoachIndex_extraInitializers);
697
+ if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
698
+ })(), _a.events = {
699
+ selectedPlaces: "selectedPlaces",
700
+ selectedCoach: "selectedCoach"
701
+ }, _a;
702
+ })();
703
+ export {
704
+ SeatReservationBaseElement
705
+ };
706
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9ldmVudGluZy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCB0eXBlIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHtcbiAgbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24sXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvYWNoSXRlbSxcbiAgRWxlbWVudERpbWVuc2lvbixcbiAgRWxlbWVudFBvc2l0aW9uLFxuICBQbGFjZSxcbiAgUGxhY2VTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxufSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLmpzJztcblxuaW1wb3J0IHR5cGUgeyBTYmJTZWF0UmVzZXJ2YXRpb25TY29wZWRFbGVtZW50IH0gZnJvbSAnLi9zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC1jb21wb25lbnQvc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQuY29tcG9uZW50LmpzJztcblxuZW51bSBTY3JvbGxEaXJlY3Rpb24ge1xuICByaWdodCA9ICdyaWdodCcsXG4gIGxlZnQgPSAnbGVmdCcsXG59XG5cbmludGVyZmFjZSBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgc2VsZWN0ZWRQbGFjZXM6ICdzZWxlY3RlZFBsYWNlcycsXG4gICAgc2VsZWN0ZWRDb2FjaDogJ3NlbGVjdGVkQ29hY2gnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgYWxsIGNvYWNoZXMgYW5kIHBsYWNlcyAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdzZWF0LXJlc2VydmF0aW9uJywgdHlwZTogT2JqZWN0IH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiA9IG51bGwhO1xuXG4gIC8qKiBUaGUgc2VhdCByZXN2ZXJ2YXRpb24gbmF2aWdhdGlvbiBjYW4gYmUgdG9nZ2xlZCBieSB0aGlzIHByb3BlcnR5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoYXMtbmF2aWdhdGlvbicsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGhhc05hdmlnYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhIGlzIGFsaWduZWQgdmVydGljYWxseSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYWxpZ24tdmVydGljYWwnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhbGlnblZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyBiYXNlIGdyaWQgc2l6ZSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYmFzZS1ncmlkLXNpemUnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGJhc2VHcmlkU2l6ZTogbnVtYmVyID0gMTY7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyB3aWR0aCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGVpZ2h0JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoZWlnaHQ6IG51bWJlciA9IG51bGwhO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgc2VhdHMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFJlc2VydmF0aW9uczogbnVtYmVyID0gbnVsbCE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIHNlbGVjdGVkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBmb2N1c2VkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYnkgdXNlci4gKi9cbiAgcHJvdGVjdGVkIHNlbGVjdGVkUGxhY2VzOiBFdmVudEVtaXR0ZXI8U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXT4gPSBuZXcgRXZlbnRFbWl0dGVyKFxuICAgIHRoaXMsXG4gICAgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQuZXZlbnRzLnNlbGVjdGVkUGxhY2VzLFxuICApO1xuXG4gIC8qKiBFbWl0cyB3aGVuIGEgY29hY2ggd2FzIHNlbGVjdGVkIGJ5IHVzZXIuICovXG4gIHByb3RlY3RlZCBzZWxlY3RlZENvYWNoOiBFdmVudEVtaXR0ZXI8U2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcihcbiAgICB0aGlzLFxuICAgIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50LmV2ZW50cy5zZWxlY3RlZENvYWNoLFxuICApO1xuXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlclBhZGRpbmcgPSA2O1xuICBwcm90ZWN0ZWQgY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICBwcm90ZWN0ZWQgY3VyclNjcm9sbERpcmVjdGlvbjogU2Nyb2xsRGlyZWN0aW9uID0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0O1xuICBwcm90ZWN0ZWQgbWF4Q2FsY0NvYWNoc1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsQ29hY2hzQXJlYVdpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgZmlyc3RUYWJFbGVtZW50OiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgbGFzdFRhYkVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjb2FjaFNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBwcm90ZWN0ZWQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSA9IFtdO1xuICBwcm90ZWN0ZWQgc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNDb2NoR3JpZEZvY3VzYWJsZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0tleWJvYXJkTmF2aWdhdGlvbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdzZWF0UmVzZXJ2YXRpb24nKSkge1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnYmFzZUdyaWRTaXplJykpIHtcbiAgICAgIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICB0aGlzLl9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBoZWlnaHQgaXMgdXNlZCwgdGhlIGJhc2VHcmlkU2l6ZSBtdXN0IGJlIHJlY2FsY3VsYXRlZFxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2hlaWdodCcpICYmICEhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmJhc2VHcmlkU2l6ZSA9IHRoaXMuaGVpZ2h0IC8gdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaDtcbiAgICAgICAgdGhpcy5jb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgIHRoaXMuX3NldFZlcnRpY2FsQWxpZ25tZW50T2Zmc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdhbGlnblZlcnRpY2FsJykgJiYgdGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICB0aGlzLl9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qIEluaXQgc2Nyb2xsIGV2ZW50IGhhbmRsaW5nIGZvciBjb2FjaCBuYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBpbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5maXJzdFRhYkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKCdmaXJzdC10YWItZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMubGFzdFRhYkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKCdsYXN0LXRhYi1lbGVtZW50JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKCdzYmItc3JfX3BhcmVudC1hcmVhJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGhpcy5jb2FjaFNjcm9sbEFyZWEpIHtcbiAgICAgIGxldCBjdXJyQ2FsY1RyaWdnZXJQb3MgPSAwO1xuICAgICAgdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGggPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gUHJlY2FsY3VsYXRlIHRyaWdnZXIgc2Nyb2xsIHBvc2l0aW9uIGFycmF5IGRlcGVuZHMgZnJvbSBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtcy5tYXAoKGNvYWNoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zWCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcbiAgICAgICAgY29uc3QgY29hY2hXaWR0aCA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihjb2FjaC5kaW1lbnNpb24pLnc7XG4gICAgICAgIGN1cnJDYWxjVHJpZ2dlclBvcyArPSBjb2FjaFdpZHRoO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFBvc1gsXG4gICAgICAgICAgZW5kOiBjdXJyQ2FsY1RyaWdnZXJQb3MsXG4gICAgICAgICAgd2lkdGg6IGNvYWNoV2lkdGgsXG4gICAgICAgIH0gYXMgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IG1heGltdW0gY2FsY3VsYXRlZCBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy5tYXhDYWxjQ29hY2hzV2lkdGggPSBjdXJyQ2FsY1RyaWdnZXJQb3M7XG5cbiAgICAgIC8vIEF0IHRoZSBlbmQgb2YgYSBzY3JvbGwgRXZlbnRzIHRvIGEgY29hY2gsIHRoZSByZWFjaGVkIHdhZ29uIGlzIG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsZW5kJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBmaW5kU2Nyb2xsQ29hY2hJbmRleCA9IHRoaXMuaXNBdXRvU2Nyb2xsaW5nXG4gICAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA6IHRoaXMuX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICAgICAgOiBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgICAgICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIER1cmluZyBpbml0aWFsaXphdGlvbiB3ZSBjaGVjayB2ZXJ0aWNhbCBhbGlnbm1lbnQgbW9kZS4gSW4gVmVydGljYWwgbW9kZSB3ZSBoYXZlIHRvIHNldCB0aGUgdmVydGljYWwgb2Zmc2V0IG1hbnVhbCBmb3IgdGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSxcbiAgICAgIC8vIGJlY3Vhc2Ugd2Ugcm90YXRlIHRoZSBlbnRpcmUgY29tcG9uZW50IGJ5IDkwIGRlZ3JlZXMgYW5kIHRyYW5zZm9ybSB0aGUgb3JpZ2luIHBvaW50IHRvIHRvcCBsZWZ0LlxuICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICB0aGlzLl9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0cyAocHJvcGVydHkgc2V0dGluZyAtPiBoYXNOYXZpZ2F0aW9uKSBhbmQgYSB0YWJsZSBjb2FjaCBnZXRzIHRoZSBmb2N1cyxcbiAgICogdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaCBtdXN0IGJlIGF1dG9tYXRpY2FsbHkgcHJlc2VsZWN0ZWQgdG8gY29udHJvbCB0aGUgcGxhY2UgbmF2aWdhdGlvbiB2aWEga2V5Ym9hcmRcbiAgICpcbiAgICogQHBhcmFtIGZvY3VzQ29hY2hJbmRleFxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNUYWJsZUNvYWNoQW5kUHJlc2VsZWN0UGxhY2UoZm9jdXNDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyAmJiAhdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZm9jdXNDb2FjaEluZGV4ID09PSAwXG4gICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KC0xKVxuICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChmb2N1c0NvYWNoSW5kZXgpO1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzYXRpb24gb2YgS2V5Ym9hcmQgZXZlbnQgaGFuZGxpbmcgdG8gbmF2aWdhdGlvbiBiZXR3ZWVuIGVhY2ggcGxhY2VzIGluc2lkZSBhIHNlbGVjdGVkIGNvYWNoIGJ5IHVzaW5nIFthcnJvd10ga2V5cy5cbiAgICogV2l0aCB0aGUgW1RBQl0ga2V5IHRoZSB1c2VyIG5hdmlnYXRpb24gZ29lcyB0byB0aGUgbmV4dCBjb2FjaCBuYXZpZ2F0aW9uIGVsZW1lbnQgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2UgaXMgYXV0b21hdGljYWxseSByZXNldC5cbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcblxuICAgIC8vIElmIGFueSBwbGFjZSBpcyBzZWxlY3RlZCBhbmQgVEFCIEtleSBjb21iaW5hdGlvbiBpc3QgcHJlc3NlZCxcbiAgICAvLyB0aGVuIHdlIGhhbmRsZSB0aGUgbmV4dCBvciBwcmV2aW91cyBjb2FjaCBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleUNvZGUgPT09IDkpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdORVhUX1RBQicpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYSBjaG9hY2ggaXMgc2VsZWN0ZWQgYW5kIHRoZSBhcnJvdyBrZXkgaXMgcHJlc3NlZFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIGNvbnN0IGNsb3Nlc3RQbGFjZSA9IHRoaXMuX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKCk7XG4gICAgLy9JZiBjbG9zZXN0UGxhY2UgZXhpc3QsIHdlIGhhdmUgdG8gdW5mb2N1cyBwcmV2aW91c2UgZm9jdXNlZCBwbGFjZVxuICAgIGlmIChjbG9zZXN0UGxhY2UpIHtcbiAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgd2hlbiBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIHVzZWQgYW5kIGNvYWNoZXMgYXJlIHNjcm9sbGVkIGJ5IGF1dG8gc2Nyb2xsaW5nLFxuICAgIC8vIHRoZW4gd2UgY2FuIHNldCB0aGUgZm9jdXMgb24gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaC5cbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJiB0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgaWYgKGNsb3Nlc3RQbGFjZSkge1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGNsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEluIGNhc2VzIHdoZXJlIHRoZSBwcmVzZWxlY3Rpb24gZnVuY3Rpb24gaXMgdHJpZ2dlcmVkIGJ5IG5vcm1hbCBjbGlja2luZyBvciB2aWEgc2NyZWVucmVhZGVyIHZpYSB0YWIsXG4gICAgLy8gd2Ugb25seSBmb2N1cyB0aGUgdGFibGUgd2l0aG91dCBkaXJlY3RseSBmb2N1c2luZyB0aGUgcGxhY2UuXG4gICAgZWxzZSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgY3VyclNlbGVjdGVkUGxhY2UgaGVyZSBmb3IgZnVydGhlciBjb3JyZWN0IGZ1bmN0aW9uaW5nIG5hdmlnYXRpb24gdmlhIHRhYi5cbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBjbG9zZXN0UGxhY2U7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ29jaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4O1xuICAgICAgdGhpcy5fc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk7XG5cbiAgICAgIGNvbnN0IHNjcm9sbFRvQ29hY2hQb3NYID0gdGhpcy5fZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSB8fCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiAwO1xuXG4gICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYWxsb3dzIHNjcm9sbGluZyB0byB0aGUgbmV4dCB3YWdvbiBvciBub3RcbiAgICAgIGlmIChpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgJiYgdGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICBsZWZ0OiBzY3JvbGxUb0NvYWNoUG9zWCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgU2Nyb2xsRGlyZWN0aW9uIGJ5IHRoZSBuZXcgZ2l2ZW4gdGFyZ2V0IGNvYWNoIGluZGV4LlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk6IHZvaWQge1xuICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICA/IFNjcm9sbERpcmVjdGlvbi5yaWdodFxuICAgICAgICA6IFNjcm9sbERpcmVjdGlvbi5sZWZ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNjcm9sbCBzdGFydCBvciBlbmQgcG9zaXRpb24gWCBmcm9tIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogSW4gY2FzZSB0aGUgdXNlciBpcyBjdXJyZXRubHkgbmF2aWdhdGUgdGhyb3VnaHQgcGxhY2VzIGJ5IGtleWJvYXJkIGFuZCBnb2VzIHRvIHByZXZpb3VzIGNvYWNoLFxuICAgKiB0aGVuIHdlIHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb2FjaCB0byBnZXQgY2xvc3Rlc3QgbmV4dCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIG5leHQgZm9jdXMgcGxhY2UuXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2FjaFRyaWdnZXJQb2ludCA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb24gPVxuICAgICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJlxuICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ubGVmdCAmJlxuICAgICAgY29hY2hUcmlnZ2VyUG9pbnQud2lkdGggPiB0aGlzLnNjcm9sbENvYWNoc0FyZWFXaWR0aDtcbiAgICByZXR1cm4gaXNGb2N1c1BsYWNlRnJvbVByZXZpb3VzQ29hY2hQb3NpdGlvblxuICAgICAgPyBjb2FjaFRyaWdnZXJQb2ludC5lbmQgLSB0aGlzLnNjcm9sbENvYWNoc0FyZWFXaWR0aFxuICAgICAgOiBjb2FjaFRyaWdnZXJQb2ludC5zdGFydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBmb2N1cyBvbiB0aGUgSFRNTCB0YWJsZSAoZ3JpZCkgY2FwdGlvbiBlbGVtZW50IHNvIHRoYXQgdGhlIGhlYWRpbmcgaXMgcmVhZCBvdXQgd2hlbiB1c2luZyBhIFNjcmVlblJlYWRlci5cbiAgICovXG4gIHByaXZhdGUgX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpOiB2b2lkIHtcbiAgICAvLyBXaGVuIHRoZSB1c2VyIHBlcmZvcm1zIGFuIGFjdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGNvYWNoIG5hdmlnYXRpb24sIHRoZW4gdGhlIG5hdmlnYXRlZCB0YWJsZSBpcyBmb2N1c2FibGUuXG4gICAgaWYgKHRoaXMuaXNDb2NoR3JpZEZvY3VzYWJsZSkge1xuICAgICAgdGhpcy5pc0NvY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IGNvYWNoU2Nyb2xsV2luZG93V2lkdGggPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBtYXhTY3JvbGxXaWR0aEFyZWEgPSB0aGlzLm1heENhbGNDb2FjaHNXaWR0aCAtIGNvYWNoU2Nyb2xsV2luZG93V2lkdGg7XG4gICAgY29uc3QgY3VyckNvYWNoVHJpZ2dlciA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zID1cbiAgICAgIGN1cnJTY3JvbGxQb3NYID09PSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5zdGFydDtcblxuICAgIHJldHVybiAoXG4gICAgICAoY3VyclNjcm9sbFBvc1ggPCBtYXhTY3JvbGxXaWR0aEFyZWEgfHwgY3VyclNjcm9sbFBvc1ggPiBjdXJyQ29hY2hUcmlnZ2VyLnN0YXJ0KSAmJlxuICAgICAgIWlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2FjaCBpbmRleCB3aGljaCBpcyBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgc2Nyb2xsIGFyZWFcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTogbnVtYmVyIHtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXRYID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdCArIHRoaXMuc2Nyb2xsQ29hY2hzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY2VkQ29hY2goKTogUGxhY2UgfCBudWxsIHtcbiAgICBsZXQgZmlyc3RQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uPy5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPSAnY2VsbC0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudD4oXCJbY2VsbC1pZD0nXCIgKyBmaXJzdENlbGxJZCArIFwiJ11cIilcbiAgICAgICAgPy5xdWVyeVNlbGVjdG9yPFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQ+KCdzYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sJylcbiAgICAgICAgPy5nZXRBdHRyaWJ1dGUoJ3RleHQnKSB8fCBudWxsO1xuXG4gICAgaWYgKGNvYWNoICYmIHBsYWNlTnVtYmVyKSB7XG4gICAgICBmaXJzdFBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBwbGFjZU51bWJlcikgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpcnN0UGxhY2U7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBsZXQgY2xvc2VzdFBsYWNlID0gbnVsbDtcbiAgICBpZiAoY29hY2gucGxhY2VzKSB7XG4gICAgICAvL0lmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZW4gdXNlIGluaXRpYWwgdGhlIGxlZnQtdG9wIHBsYWNlIG9uIHRoZSBjb2FjaFxuICAgICAgaWYgKCF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGaXJzdFBsYWNlSW5TZWxlY2VkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaC5wbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy9GaW5kIHBsYWNlIGZyb20gdGhlIGxlZnQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBSSUdIVClcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ucG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9GaW5kIHBsYWNlIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgTEVGVFxuICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5sZWZ0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ucG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChwbGFjZS5udW1iZXIgIT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/Lm51bWJlcikge1xuICAgICAgICAgICAgICAgIC8vS2V5IFtSaWdodF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID4gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0Rvd25dIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24gJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi54ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbTGVmdF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbVXBdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA8IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/LnBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvc2VzdFBsYWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZvY3VzUGxhY2VFbGVtZW50KHBsYWNlOiBQbGFjZSB8IG51bGwsIGNvYWNoSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBpZiAocGxhY2UpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcbiAgICAgIGlmIChjb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICdmb2N1cycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1bmZvY3VzUGxhY2VFbGVtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICd1bmZvY3VzJyk7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChudWxsKTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkRGltZW5zaW9uKFxuICAgIGVsZW1lbnREaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgICBpc1N0cmV0Y2hIZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50RGltZW5zaW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgIWlzT3JpZ2luSGVpZ2h0KSB7XG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDI7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyZXRjaEhlaWdodCkge1xuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHc6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudERpbWVuc2lvbi53LFxuICAgICAgaDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLmgsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgZWxlbWVudFBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24sXG4gICAgZWxlbWVudERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudFBvc2l0aW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgZWxlbWVudERpbWVuc2lvbikge1xuICAgICAgY29uc3QgZW5kUG9zSGVpZ2h0ID0gaXNPcmlnaW5IZWlnaHRcbiAgICAgICAgPyBjb2FjaERpbWVuc2lvbi5oXG4gICAgICAgIDogY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICAvL0lmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGNvYWNoLCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBZIGNvb3JkaW5hdGUgd2l0aCB0aGUgYWRkaXRpb25hbCBib3JkZXIgcGFkZGluZ1xuICAgICAgaWYgKGVsZW1lbnRQb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnRQb3NpdGlvbi55ICsgZWxlbWVudERpbWVuc2lvbi5oID09PSBlbmRQb3NIZWlnaHQpIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCxcbiAgICAgIHk6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnksXG4gICAgICB6OiBlbGVtZW50UG9zaXRpb24ueixcbiAgICB9O1xuICB9XG5cbiAgLy8gSGFuZGxpbmcgZm9yIFRhYiBuYXZpZ2F0aW9uIGlmIGFuIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuICAgIC8vQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICAvLyBJZiB0aGUgY3VyckZvY3VzSW5kZXggZXF1YWxzIHRoZSBuZXdGb2N1c2FibGVJbmRleCB0aGVuIHdlIGhhdmUgcmVhY2hlZCB0aGUgZmlyc3Qgb3IgbGFzdCB0YWJhYmxlIG5hdmlnYXRpb24gY29hY2ggRWxlbWVudCBhbmQgd2UgaGF2ZSB0byB0aGUgc2V0IHRoZSBmb2N1cyBtYW51YWwgdG8gdGhlIGZpcnN0VGFiRWxlbWVudCBvciBsYXN0VGFiRWxlbWVudC5cbiAgICBpZiAoY3VyckZvY3VzSW5kZXggPT09IG5ld0ZvY3VzYWJsZUluZGV4KSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IGZhbHNlO1xuXG4gICAgICBpZiAodGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInKSB0aGlzLmxhc3RUYWJFbGVtZW50LmZvY3VzKCk7XG4gICAgICBlbHNlIHRoaXMuZmlyc3RUYWJFbGVtZW50LmZvY3VzKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyRm9jdXNJbmRleDtcbiAgICAgICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgc2V0cyB0aGUgZm9jdXMgb24gdGhlIG5ldyBuYXZpZ2F0aW9uIGNvYWNoXG4gICAgICBlbHNlIGlmIChuZXdGb2N1c2FibGVJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgICAgLy9JZiBhbnkgcGxhY2Ugd2FzIGZvY3VzZWQgaW4gY29hY2gsIHNvIHdlIHNldCBmb2N1c2VkIGFnYWluXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9JZiBubyBwbGFjZSB3YXMgc2VsZWN0ZWQsIHRoZW4gd2Ugc2VsZWN0IHRoZSBjb2FjaCBncmlkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNDb2NoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy9JZiBubyBuYXZpZ2F0aW9uIGV4aXN0LCB3ZSBzY3JvbGwgZGlyZWN0bHkgdG8gdGhlIG5leHQgdGFiYWJsZSBjb2FjaFxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2gobmV3Rm9jdXNhYmxlSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLmZvY3VzZWRDb2FjaEluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcmV2ZW50UGxhY2VDbGljaykge1xuICAgICAgY29uc3QgZmluZENsb3Nlc3RQbGFjZSA9IHRoaXMuX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXkpO1xuICAgICAgaWYgKGZpbmRDbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudChmaW5kQ2xvc2VzdFBsYWNlKTtcbiAgICAgIH1cbiAgICAgIC8vTm8gY2xvc3Rlc3QgcGxhY2UgZm91bmQgYnkga2V5IG5hdmlnYXRpb25cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCB8fFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdCB8fFxuICAgICAgICAgICh0aGlzLmFsaWduVmVydGljYWwgJiZcbiAgICAgICAgICAgIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwIHx8XG4gICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bikpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vQ2hlY2sgdGhlIGN1cnJlbnQgcHJlc3NlZCBrZXkgdG8gZ2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBjb2FjaCBpbmRleFxuICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleCgpXG4gICAgICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleCgpO1xuXG4gICAgICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2gobmV3U2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyZW50SW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJyZW50SW5kZXggPz8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIHJldHVybiBzdGFydEluZGV4IDwgdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtcy5sZW5ndGggLSAxID8gc3RhcnRJbmRleCArIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIC8vQWRkIHNlbGVjdGVkIHBsYWNlIHRvIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzXG4gICAgaWYgKHBsYWNlU2VsZWN0aW9uLnN0YXRlID09PSAnU0VMRUNURUQnKSB7XG4gICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihwbGFjZVNlbGVjdGlvbik7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvL1JlbW92ZSBzZWxlY3RlZCBwbGFjZSBmcm9tIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzID0gdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvL0NoZWNrcyB3aGV0aGVyIG1heFJlc2VydmF0aW9uIGlzIGFjdGl2YXRlZCBhbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGVkIHBsYWNlcyBpcyByZWFjaGVkXG4gICAgaWYgKHRoaXMubWF4UmVzZXJ2YXRpb25zICYmIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gdGhpcy5tYXhSZXNlcnZhdGlvbnMpIHtcbiAgICAgIHRoaXMuX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKHBsYWNlU2VsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvL0VtaXRzIHRoZSBzZWF0IHJlc2VydmF0aW9uIHBsYWNlIHNlbGVjdGlvblxuICAgIHRoaXMuc2VsZWN0ZWRQbGFjZXMuZW1pdCh0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVDdXJyZW50U2VsZWN0ZWRQbGFjZUluQ29hY2gocGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG4gICAgY29uc3QgcGxhY2UgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdLnBsYWNlcz8uZmluZChcbiAgICAgIChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09IHBsYWNlU2VsZWN0aW9uLm51bWJlcixcbiAgICApO1xuXG4gICAgaWYgKCFwbGFjZSkgcmV0dXJuO1xuICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICBjb25zdCBjb2FjaFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvbkNvYWNoU2VsZWN0aW9uKHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICBpZiAoY29hY2hTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaC5lbWl0KGNvYWNoU2VsZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubWFwKChjb2FjaDogQ29hY2hJdGVtLCBjb2FjaEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvYWNoLnBsYWNlc1xuICAgICAgICA/LmZpbHRlcigocGxhY2UpID0+IHBsYWNlLnN0YXRlID09PSAnU0VMRUNURUQnKVxuICAgICAgICA/LmZvckVhY2goKHBsYWNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24gPSBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiB8IG51bGwgPVxuICAgICAgICAgICAgdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsIHNlbGVjdGVkIHBsYWNlcyB3aWxsIGJlIHJlc2V0IG9yIHRoZSBjdXJyZW50U2VsZWN0ZWRQbGFjZSB3YXMgZ2l2ZW4sIHRoZW4gd2UgcmVzZXQgYWxsIGV4Y2VwdCBjdXJyZW50U2VsZWN0ZWRQbGFjZVxuICAgKiBAcGFyYW0gY3VyclNlbGVjdGVkUGxhY2VcbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKGN1cnJTZWxlY3RlZFBsYWNlPzogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICAvL0ZpbmQgYWxsIHBsYWNlcyB0byBiZSBuZWVkZWQgdW5zZWxlY3RcbiAgICBmb3IgKGNvbnN0IHBsYWNlU2VsZWN0aW9uIG9mIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMpIHtcbiAgICAgIGlmICghY3VyclNlbGVjdGVkUGxhY2UgfHwgY3VyclNlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQocGxhY2VTZWxlY3Rpb24uaWQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBwbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdGF0ZScsICdGUkVFJyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgcGxhY2VzIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgaWYgKGN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzID0gdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgPT09IGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZVNlbGVjdGlvbixcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsIHtcbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleF07XG4gICAgY29uc3QgcGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IGN1cnJTZWxlY3RlZFBsYWNlLm51bWJlcik7XG5cbiAgICByZXR1cm4gcGxhY2VcbiAgICAgID8gbWFwUGxhY2VBbmRDb2FjaFRvU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocGxhY2UsIGNvYWNoLCBjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4KVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24oXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBTZWF0UmVzZXJ2YXRpb25Db2FjaFNlbGVjdGlvbiB8IG51bGwge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1tjb2FjaEluZGV4XSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbY29hY2hJbmRleF07XG4gICAgcmV0dXJuIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uKGNvYWNoSW5kZXgsIGNvYWNoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocGxhY2UpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPVxuICAgICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAnLScgKyBwbGFjZS5udW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBnaXZlbiBwbGFjZU51bWJlciBhbmQgY29hY2hJbmRleC5cbiAgICogSWYgYm90aCBkb2VzbnQgZXhpc3QsIHdlIHRyeSB0byByZXR1cm4gdGhlIHBsYWNlIEhUTUwgZWxlbWVudCBieSB0aGUgX2N1cnJlbnRTZWxlY3RlZFBsYWNlRWxlbWVudElkXG4gICAqIEBwYXJhbSBwbGFjZU51bWJlciBvcHRpb25hbCBhcyBzdHJpbmdcbiAgICogQHBhcmFtIGNvYWNoSW5kZXggb3B0aW9uYWwgYXMgc3RyaW5nXG4gICAqIEByZXR1cm5zIEhUTUxFbGVtZW50IG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldFBsYWNlSHRtbEVsZW1lbnQocGxhY2VOdW1iZXI/OiBzdHJpbmcsIGNvYWNoSW5kZXg/OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IGN1cnJDb2FjaEluZGV4ID0gY29hY2hJbmRleCA/IGNvYWNoSW5kZXggOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgY29uc3QgY29hY2hQbGFjZU51bWJlcklkID0gcGxhY2VOdW1iZXJcbiAgICAgID8gJ3NlYXQtcmVzZXJ2YXRpb25fX3BsYWNlLWJ1dHRvbi0nICsgY3VyckNvYWNoSW5kZXggKyAnLScgKyBwbGFjZU51bWJlclxuICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkO1xuICAgIHJldHVybiBjb2FjaFBsYWNlTnVtYmVySWQgPyB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKGNvYWNoUGxhY2VOdW1iZXJJZCkgfHwgbnVsbCA6IG51bGw7XG4gIH1cblxuICAvL1NldCB0aGUgdmVydGljYWwgb2Zmc2V0XG4gIHByaXZhdGUgX3NldFZlcnRpY2FsQWxpZ25tZW50T2Zmc2V0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uV3JhcHBlckVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcuc2JiLXNyX193cmFwcGVyJyxcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uV3JhcHBlckVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uVmVydGljYWxPZmZzZXQgPVxuICAgICAgICAgIHNlYXRSZXNlcnZhdGlvbldyYXBwZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi12ZXJ0aWNhbC1vZmZzZXQnLFxuICAgICAgICAgIGAke3NlYXRSZXNlcnZhdGlvblZlcnRpY2FsT2Zmc2V0fXB4YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIlNjcm9sbERpcmVjdGlvbiIsIlNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IiwiX2EiLCJwbGFjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUF5QkEsSUFBSztBQUFBLENBQUwsU0FBS0Esa0JBQWU7QUFDbEJBLG1CQUFBLE9BQUEsSUFBQTtBQUNBQSxtQkFBQSxNQUFBLElBQUE7QUFDRixHQUhLLG9CQUFBLGtCQUdKLENBQUEsRUFBQTtJQVFZLDhCQUEwQixNQUFBOztvQkFBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFuQyxTQUFBLG1CQUFtQyxZQUFVO0FBQUE7O0FBUXhEO0FBS0E7QUFLQTtBQUtBO0FBS0E7QUFLQTtBQUtBO0FBRVM7QUFDQTtBQWpDTyx5QkFBQSxtQ0FBQSxrQkFBQSxNQUFBLCtCQUFtQyxJQUFLO0FBS3hDLHlCQUFBLGtDQUFBLGtCQUFBLE1BQUEsa0NBQUEsR0FBQSxrQkFBQSxNQUFBLDZCQUF5QixJQUFJO0FBSzdCLHlCQUFBLGtDQUFBLGtCQUFBLE1BQUEsZ0NBQUEsR0FBQSxrQkFBQSxNQUFBLDZCQUF5QixLQUFLO0FBSzlCLHlCQUFBLGlDQUFBLGtCQUFBLE1BQUEsZ0NBQUEsR0FBQSxrQkFBQSxNQUFBLDRCQUF1QixFQUFFO0FBS3pCLHlCQUFBLDJCQUFBLGtCQUFBLE1BQUEsK0JBQUEsR0FBQSxrQkFBQSxNQUFBLHNCQUFpQixJQUFLO0FBS3RCLHlCQUFBLG9DQUFBLGtCQUFBLE1BQUEseUJBQUEsR0FBQSxrQkFBQSxNQUFBLCtCQUEwQixJQUFLO0FBSy9CLHlCQUFBLHNDQUFBLGtCQUFBLE1BQUEsa0NBQUEsR0FBQSxrQkFBQSxNQUFBLGlDQUE2QixLQUFLO0FBRU8seUJBQUEsdUNBQUEsa0JBQUEsTUFBQSxvQ0FBQSxHQUFBLGtCQUFBLE1BQUEsa0NBQUEs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