@sbb-esta/lyne-elements-experimental-dev 4.12.0-dev.1777535350 → 4.12.0-dev.1777543950

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 (45) hide show
  1. package/custom-elements.json +220 -99
  2. package/development/seat-reservation/common/types.d.ts +3 -4
  3. package/development/seat-reservation/common/types.d.ts.map +1 -1
  4. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +38 -7
  5. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
  6. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +143 -32
  7. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts +2 -13
  8. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
  9. package/development/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  10. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
  11. package/development/seat-reservation/seat-reservation-area.js +1 -1
  12. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +1 -1
  13. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  14. package/development/seat-reservation/seat-reservation-graphic.js +1 -1
  15. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts.map +1 -1
  16. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
  17. package/development/seat-reservation/seat-reservation-navigation-coach.js +1 -1
  18. package/development/seat-reservation/seat-reservation.js +1 -1
  19. package/development/seat-reservation-area.component-BWdrKqek.js +96 -0
  20. package/development/seat-reservation-graphic.component-CN5sWn0I.js +129 -0
  21. package/development/{seat-reservation-navigation-coach.component-CjoDkcVU.js → seat-reservation-navigation-coach.component-tDZkXl-3.js} +3 -3
  22. package/development/seat-reservation.component-DyB5FVpD.js +464 -0
  23. package/development/seat-reservation.js +4 -4
  24. package/development/seat-reservation.pure.js +4 -4
  25. package/package.json +2 -2
  26. package/seat-reservation/seat-reservation/seat-reservation-base-element.js +130 -77
  27. package/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  28. package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
  29. package/seat-reservation/seat-reservation-area.js +1 -1
  30. package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +1 -1
  31. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  32. package/seat-reservation/seat-reservation-graphic.js +1 -1
  33. package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
  34. package/seat-reservation/seat-reservation-navigation-coach.js +1 -1
  35. package/seat-reservation/seat-reservation.js +1 -1
  36. package/{seat-reservation-area.component-CtYawDjE.js → seat-reservation-area.component-B5_N7H_a.js} +1 -1
  37. package/seat-reservation-graphic.component-Dh1e2Pve.js +102 -0
  38. package/{seat-reservation-navigation-coach.component-sug9IBTH.js → seat-reservation-navigation-coach.component-BdCUfksf.js} +2 -2
  39. package/{seat-reservation.component-DajC6fqU.js → seat-reservation.component-DEtsEzex.js} +74 -81
  40. package/seat-reservation.js +4 -4
  41. package/seat-reservation.pure.js +4 -4
  42. package/development/seat-reservation-area.component-DbeuTnXT.js +0 -96
  43. package/development/seat-reservation-graphic.component-DlrHtlia.js +0 -129
  44. package/development/seat-reservation.component-DFJVFmrI.js +0 -510
  45. package/seat-reservation-graphic.component-Cm_pVxaB.js +0 -102
@@ -0,0 +1,464 @@
1
+ import { SeatReservationBaseElement } from "./seat-reservation/seat-reservation/seat-reservation-base-element.js";
2
+ import { SbbLanguageController } from "@sbb-esta/lyne-elements/core/controllers.js";
3
+ import { boxSizingStyles } from "@sbb-esta/lyne-elements/core/styles.js";
4
+ import { html, isServer, nothing, unsafeCSS } from "lit";
5
+ import "@sbb-esta/lyne-elements/screen-reader-only.js";
6
+ import { styleMap } from "lit/directives/style-map.js";
7
+ import { SbbSeatReservationAreaElement } from "./seat-reservation/seat-reservation-area/seat-reservation-area.component.js";
8
+ import { classMap } from "lit/directives/class-map.js";
9
+ import { getI18nSeatReservation } from "./seat-reservation/common/translations.js";
10
+ import { SbbSeatReservationGraphicElement } from "./seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js";
11
+ import { repeat } from "lit/directives/repeat.js";
12
+ import { SbbSeatReservationNavigationCoachElement } from "./seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js";
13
+ import { SbbSeatReservationPlaceControlElement } from "./seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js";
14
+ import { SbbSeatReservationScopedElement } from "./seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js";
15
+ import "@sbb-esta/lyne-elements/button.js";
16
+ import "@sbb-esta/lyne-elements/popover.js";
17
+ //#region src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.scss?inline
18
+ var seat_reservation_default = ":host {\n --sbb-seat-reservation-grid-size: 16px;\n --sbb-seat-reservation-height: 0;\n --sbb-seat-reservation-decks: 1;\n display: block;\n height: inherit;\n}\n:host ::part(coach-floor) {\n fill: var(--sbb-background-color-2);\n}\n@media (forced-colors: active) {\n :host ::part(coach-floor) {\n fill: transparent;\n }\n}\n\n:host(:dir(rtl)) :not(.sbb-sr-place-ctrl--type-bicycle,\n.sbb-sr-place-ctrl--orientation-90,\n.sbb-sr-place-ctrl--orientation-270,\n.sbb-sr-place-ctrl--state-selected) ::part(coach-floor) {\n rotate: calc(180 * 1deg);\n}\n\n[popover]:where(sbb-popover) {\n margin: 0;\n padding: 0;\n border: none;\n width: auto;\n height: auto;\n background-color: transparent;\n color: inherit;\n pointer-events: none;\n}\n[popover]:where(sbb-popover) .sbb-sr-popover {\n margin-block: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n:host([align-vertical]) .sbb-sr__component {\n flex-direction: row-reverse;\n justify-content: flex-end;\n gap: calc(22 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n height: inherit;\n}\n@media (min-width: calc(37.5rem)) {\n :host([align-vertical]) .sbb-sr__component {\n gap: calc(54 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n }\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation,\n:host([align-vertical]) .sbb-sr__component ul.sbb-sr-navigation__list-coaches {\n flex-direction: column;\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation {\n padding: calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) 0;\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation .sbb-sr__navigation-control-button {\n left: calc(1 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n top: 0;\n rotate: 90deg;\n}\n@media (min-width: calc(64rem)) {\n :host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation .sbb-sr__navigation-control-button {\n left: calc(-1 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n }\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation ul.sbb-sr-navigation__list-coaches {\n max-width: initial;\n padding: calc(5 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n overflow: hidden scroll;\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation ul.sbb-sr-navigation__list-coaches li {\n display: flex;\n}\n:host([align-vertical]) .sbb-sr__wrapper-coach-decks {\n flex-direction: column;\n}\n:host([align-vertical]) .sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels {\n flex-direction: column-reverse;\n width: calc((var(--sbb-seat-reservation-height) + 24) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n height: initial;\n}\n:host([align-vertical]) .sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels b {\n inline-size: calc(50% - 16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n block-size: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-bottom: calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n rotate: initial;\n writing-mode: initial;\n}\n:host([align-vertical]) .sbb-sr__wrapper-scrollarea {\n width: calc((var(--sbb-seat-reservation-height) + 24) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n height: 100%;\n overflow: hidden scroll;\n}\n:host([align-vertical]) .sbb-sr__wrapper-scrollarea .sbb-sr__parent {\n rotate: 90deg;\n}\n:host([align-vertical]) .sbb-sr-travel-direction-wrapper {\n width: calc(var(--sbb-seat-reservation-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-block-start: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr-navigation {\n gap: calc(3 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr-navigation .sbb-sr__navigation-control-button {\n position: relative;\n top: calc(2 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n@media (min-width: calc(64rem)) {\n .sbb-sr-navigation .sbb-sr__navigation-control-button {\n top: 0;\n }\n}\n\n.sbb-sr__component {\n display: flex;\n flex-direction: column;\n gap: calc(64 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem) - 16px);\n}\n\n.sbb-sr-travel-direction-wrapper {\n display: flex;\n justify-content: center;\n align-items: center;\n column-gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-block: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n font-size: var(--sbb-text-font-size-s);\n}\n.sbb-sr-travel-direction-wrapper .sbb-sr__travel-direction--arrow {\n display: flex;\n align-items: center;\n}\n\n.sbb-sr-navigation-wrapper {\n display: flex;\n}\n\n.sbb-sr-navigation {\n display: flex;\n justify-content: center;\n width: 100%;\n padding-inline: 16px;\n}\n\n.sbb-sr-navigation__list-coaches {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n --sbb-scrollbar-thumb-width: 0.125rem;\n --sbb-scrollbar-thumb-width-hover: 0.25rem;\n --sbb-scrollbar-width-firefox: thin;\n --sbb-scrollbar-color: color-mix(in srgb, var(--sbb-color-black) 30%, transparent);\n --sbb-scrollbar-color: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 30%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 30%, transparent)\n );\n --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);\n --sbb-scrollbar-color-hover: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 60%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 60%, transparent)\n );\n --sbb-scrollbar-track-color: transparent;\n --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);\n}\n.sbb-sr-navigation__list-coaches::-webkit-scrollbar {\n width: var(--sbb-scrollbar-width);\n height: var(--sbb-scrollbar-width);\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-sr-navigation__list-coaches::-webkit-scrollbar-corner {\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-sr-navigation__list-coaches::-webkit-scrollbar-thumb {\n background-color: var(--sbb-scrollbar-color, currentcolor);\n border: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width))) solid transparent;\n border-radius: var(--sbb-border-radius-4x);\n background-clip: padding-box;\n}\n.sbb-sr-navigation__list-coaches::-webkit-scrollbar-thumb:hover {\n background-color: var(--sbb-scrollbar-color-hover, currentcolor);\n border-width: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width-hover)));\n}\n.sbb-sr-navigation__list-coaches::-webkit-scrollbar-button, .sbb-sr-navigation__list-coaches::-webkit-scrollbar-corner {\n display: none;\n}\n@supports not selector(::-webkit-scrollbar) {\n .sbb-sr-navigation__list-coaches {\n scrollbar-width: var(--sbb-scrollbar-width-firefox);\n scrollbar-color: var(--sbb-scrollbar-color, currentcolor) var(--sbb-scrollbar-track-color, transparent);\n }\n}\n.sbb-sr-navigation__list-coaches {\n display: flex;\n flex-wrap: nowrap;\n gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n padding: calc(6 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(5 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) 0;\n max-width: 856px;\n --sbb-scrollbar-color: transparent;\n overflow: scroll hidden;\n position: relative;\n}\n\n.sbb-sr__wrapper-coach-decks {\n display: flex;\n overflow: hidden;\n height: inherit;\n}\n.sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels {\n display: flex;\n justify-content: space-between;\n height: calc(var(--sbb-seat-reservation-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n writing-mode: vertical-lr;\n}\n.sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels b {\n height: calc(50% - 16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n width: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-block-end: 16px;\n rotate: 180deg;\n text-align: center;\n line-height: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__wrapper-scrollarea {\n --sbb-scrollbar-thumb-width: 0.125rem;\n --sbb-scrollbar-thumb-width-hover: 0.25rem;\n --sbb-scrollbar-width-firefox: thin;\n --sbb-scrollbar-color: color-mix(in srgb, var(--sbb-color-black) 30%, transparent);\n --sbb-scrollbar-color: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 30%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 30%, transparent)\n );\n --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);\n --sbb-scrollbar-color-hover: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 60%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 60%, transparent)\n );\n --sbb-scrollbar-track-color: transparent;\n --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);\n}\n.sbb-sr__wrapper-scrollarea::-webkit-scrollbar {\n width: var(--sbb-scrollbar-width);\n height: var(--sbb-scrollbar-width);\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-sr__wrapper-scrollarea::-webkit-scrollbar-corner {\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-sr__wrapper-scrollarea::-webkit-scrollbar-thumb {\n background-color: var(--sbb-scrollbar-color, currentcolor);\n border: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width))) solid transparent;\n border-radius: var(--sbb-border-radius-4x);\n background-clip: padding-box;\n}\n.sbb-sr__wrapper-scrollarea::-webkit-scrollbar-thumb:hover {\n background-color: var(--sbb-scrollbar-color-hover, currentcolor);\n border-width: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width-hover)));\n}\n.sbb-sr__wrapper-scrollarea::-webkit-scrollbar-button, .sbb-sr__wrapper-scrollarea::-webkit-scrollbar-corner {\n display: none;\n}\n@supports not selector(::-webkit-scrollbar) {\n .sbb-sr__wrapper-scrollarea {\n scrollbar-width: var(--sbb-scrollbar-width-firefox);\n scrollbar-color: var(--sbb-scrollbar-color, currentcolor) var(--sbb-scrollbar-track-color, transparent);\n }\n}\n.sbb-sr__wrapper-scrollarea {\n overflow: scroll hidden;\n padding-block: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n.sbb-sr__wrapper-scrollarea .sbb-sr__parent {\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.sbb-sr__list-decks {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n display: flex;\n flex-direction: column;\n}\n\n.sbb-sr__list-decks--gap {\n gap: calc(48 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__list-item-deck {\n position: relative;\n}\n\n.sbb-sr__list-coaches {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n display: flex;\n gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__list-decks:has(.sbb-sr-coach-has-overhanging-elements) .sbb-sr__list-coaches {\n gap: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__item-coach {\n position: relative;\n}\n\n.sbb-sr-coach-wrapper__table {\n outline: 0;\n}";
19
+ //#endregion
20
+ //#region src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.component.ts
21
+ SbbSeatReservationAreaElement.define();
22
+ SbbSeatReservationGraphicElement.define();
23
+ SbbSeatReservationPlaceControlElement.define();
24
+ SbbSeatReservationNavigationCoachElement.define();
25
+ SbbSeatReservationScopedElement.define();
26
+ /**
27
+ * Main component for the seat reservation.
28
+ *
29
+ */
30
+ var SbbSeatReservationElement = class extends SeatReservationBaseElement {
31
+ constructor() {
32
+ super(...arguments);
33
+ this._language = new SbbLanguageController(this);
34
+ }
35
+ static {
36
+ this.elementName = "sbb-seat-reservation";
37
+ }
38
+ static {
39
+ this.styles = [boxSizingStyles, unsafeCSS(seat_reservation_default)];
40
+ }
41
+ willUpdate(changedProperties) {
42
+ super.willUpdate(changedProperties);
43
+ if (changedProperties.has("hasNavigation")) if (this.hasNavigation) this.shadowRoot?.querySelectorAll("table").forEach((table) => table.removeAttribute("tabindex"));
44
+ else this.shadowRoot?.querySelectorAll("table").forEach((table) => table.setAttribute("tabindex", "0"));
45
+ }
46
+ firstUpdated(changedProperties) {
47
+ super.firstUpdated(changedProperties);
48
+ this.updateComplete.then(() => {
49
+ this.initNavigationSelectionByScrollEvent();
50
+ });
51
+ }
52
+ render() {
53
+ this._initVehicleSeatReservationConstruction();
54
+ return this._coachesHtmlTemplate || null;
55
+ }
56
+ _initVehicleSeatReservationConstruction() {
57
+ this._coachesHtmlTemplate = html`
58
+ ${this._renderTravelDirection()}
59
+ <div class="sbb-sr__component">
60
+ ${this._renderNavigation()}
61
+ <div
62
+ class="sbb-sr__wrapper-coach-decks"
63
+ @keydown=${(evt) => this.keyboardSeatmapEventHandling(evt)}
64
+ >
65
+ <div class="sbb-sr__wrapper-deck-labels">${this._renderDeckLabels()}</div>
66
+ <div
67
+ @scroll=${() => this.coachAreaScrollend()}
68
+ id="sbb-sr__wrapper-scrollarea"
69
+ class="sbb-sr__wrapper-scrollarea"
70
+ tabindex="-1"
71
+ >
72
+ <div id="sbb-sr__parent-area" class="sbb-sr__parent">
73
+ <ul
74
+ class="${classMap({
75
+ "sbb-sr__list-decks": true,
76
+ "sbb-sr__list-decks--gap": this.hasMultipleDecks
77
+ })}"
78
+ >
79
+ ${this.seatReservations?.map((seatReservation, coachDeckIndex) => {
80
+ return html`<li class="sbb-sr__list-item-deck">
81
+ <ul class="sbb-sr__list-coaches" role="presentation">
82
+ ${this._renderCoaches(seatReservation, coachDeckIndex)}
83
+ </ul>
84
+ </li>`;
85
+ })}
86
+ </ul>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ </div>
91
+ `;
92
+ }
93
+ _renderDeckLabels() {
94
+ if (!this.hasMultipleDecks) return null;
95
+ return this.seatReservations.map((seatReservation) => {
96
+ return html`<b aria-hidden="true">${getI18nSeatReservation(seatReservation.deckCoachLevel, this._language.current)}</b>`;
97
+ });
98
+ }
99
+ _renderNavigationControlButton(btnDirection) {
100
+ if (!this.hasNavigation || !this.seatReservations) return null;
101
+ const btnNavigationDirectionId = btnDirection == "DIRECTION_RIGHT" ? "sbb-sr-navigation__wrapper-button-direction--right" : "sbb-sr-navigation__wrapper-button-direction--left";
102
+ const btnIcon = btnDirection == "DIRECTION_RIGHT" ? "chevron-small-right-small" : "chevron-small-left-small";
103
+ const btnAriaDescription = btnDirection == "DIRECTION_RIGHT" ? getI18nSeatReservation("SEAT_RESERVATION_END", this._language.current) : getI18nSeatReservation("SEAT_RESERVATION_BEGIN", this._language.current);
104
+ let btnDisabled = true;
105
+ if (btnDirection == "DIRECTION_LEFT" && this.selectedCoachIndex > 0) btnDisabled = false;
106
+ else if (btnDirection == "DIRECTION_RIGHT" && this.selectedCoachIndex < this.coachItemDetailsElements.length - 1) btnDisabled = false;
107
+ return html`<div class="sbb-sr-navigation__wrapper-button-direction">
108
+ <sbb-secondary-button
109
+ @click="${() => this.navigateByDirectionBtn(btnDirection)}"
110
+ @focus="${() => this.onFocusNavDirectionButton()}"
111
+ id="${btnNavigationDirectionId}"
112
+ class="sbb-sr__navigation-control-button"
113
+ size="m"
114
+ icon-name="${btnIcon}"
115
+ type="button"
116
+ aria-label="${btnAriaDescription}"
117
+ role="button"
118
+ .disabledInteractive="${btnDisabled || nothing}"
119
+ .disabled="${btnDisabled || nothing}"
120
+ ></sbb-secondary-button>
121
+ </div>`;
122
+ }
123
+ _renderTravelDirection() {
124
+ if (!this.travelDirection || this.travelDirection === "NONE") return null;
125
+ const labelText = getI18nSeatReservation("SEAT_RESERVATION_TRAVEL_DIRECTION", this._language.current);
126
+ return html`<div class="sbb-sr-travel-direction-wrapper">
127
+ <div class="sbb-sr__travel-direction--arrow">
128
+ <sbb-icon slot="icon" name="${`arrow-${this.alignVertical ? this.travelDirection === "RIGHT" ? "down" : "up" : this.travelDirection === "RIGHT" ? "right" : "left"}-small`}"></sbb-icon>
129
+ </div>
130
+ <div class="sbb-sr__travel-direction--label">${labelText}</div>
131
+ </div>`;
132
+ }
133
+ _renderNavigation() {
134
+ if (isServer || !this.hasNavigation || !this.seatReservations) return null;
135
+ return html`<div class="sbb-sr-navigation-wrapper">
136
+ <nav id="sbb-sr-navigation" class="sbb-sr-navigation">
137
+ ${this._renderNavigationControlButton("DIRECTION_LEFT")}
138
+ <ul
139
+ id="sbb-sr__navigation-list-coaches"
140
+ class="sbb-sr-navigation__list-coaches"
141
+ aria-label="${getI18nSeatReservation("SEAT_RESERVATION_NAVIGATION", this._language.current)}"
142
+ >
143
+ ${this.coachItemDetailsElements.map((coachItemDetails, index) => {
144
+ return html`<li>
145
+ <sbb-seat-reservation-navigation-coach
146
+ @selectcoach=${(event) => this._onSelectNavCoach(event)}
147
+ @focuscoach=${() => this._onFocusNavCoach()}
148
+ @keyup=${(evt) => this.onKeyNavigationNavCoachButton(evt, index)}
149
+ index="${index}"
150
+ .selected=${this.selectedCoachIndex === index}
151
+ .focused=${this.focusedCoachIndex === index}
152
+ .hovered=${this.hoveredCoachIndex === index}
153
+ .nativeFocusActive=${this.hasSeatReservationNativeFocus}
154
+ .coachItemDetails="${coachItemDetails}"
155
+ ?vertical="${this.alignVertical}"
156
+ ?showTitleInfo="${this.showTitleInfo}"
157
+ >
158
+ </sbb-seat-reservation-navigation-coach>
159
+ </li>`;
160
+ })}
161
+ </ul>
162
+ ${this._renderNavigationControlButton("DIRECTION_RIGHT")}
163
+ </nav>
164
+ </div>`;
165
+ }
166
+ /**
167
+ *
168
+ * @returns
169
+ * @param seatReservation
170
+ * @param coachDeckIndex
171
+ */
172
+ _renderCoaches(seatReservation, coachDeckIndex) {
173
+ const coaches = JSON.parse(JSON.stringify(seatReservation?.coachItems));
174
+ if (!coaches || isServer) return null;
175
+ return coaches.map((coachItem, coachIndex) => {
176
+ return html`
177
+ <li class="sbb-sr__item-coach">
178
+ ${this._renderCoachElement(coachItem, coachIndex, coachDeckIndex, seatReservation.deckCoachIndex)}
179
+ </li>
180
+ `;
181
+ });
182
+ }
183
+ _renderCoachElement(coachItem, coachIndex, coachDeckIndex, placeCoachDeckIndex) {
184
+ const calculatedCoachDimension = this.getCalculatedDimension(coachItem.dimension);
185
+ const descriptionTableCoachWithServices = this._getDescriptionTableCoach(coachItem);
186
+ return html`<sbb-seat-reservation-scoped
187
+ style=${styleMap({
188
+ "--sbb-seat-reservation-scoped-width": calculatedCoachDimension.w,
189
+ "--sbb-seat-reservation-scoped-height": calculatedCoachDimension.h
190
+ })}
191
+ >
192
+ ${this._getRenderedCoachBorders(coachItem, coachDeckIndex, coachIndex)}
193
+ ${this._getRenderedCoachElements(coachDeckIndex, coachIndex)}
194
+ ${this._getRenderedAreaElements(coachDeckIndex, coachIndex)}
195
+ ${this._getRenderedServiceElements(coachDeckIndex, coachIndex)}
196
+
197
+ <table
198
+ @focus=${() => this.onFocusTableCoachAndPreselectPlace(coachIndex)}
199
+ id="sbb-sr-coach-${coachIndex}"
200
+ class="sbb-sr-coach-wrapper__table"
201
+ aria-describedby="sbb-sr-coach-caption-${coachIndex}"
202
+ tabindex="-1"
203
+ >
204
+ <caption id="sbb-sr-coach-caption-${coachIndex}" tabindex="-1">
205
+ <sbb-screen-reader-only>${descriptionTableCoachWithServices}</sbb-screen-reader-only>
206
+ </caption>
207
+ ${this._getRenderedRowPlaces(coachItem, coachIndex, coachDeckIndex, placeCoachDeckIndex)}
208
+ </table>
209
+ </sbb-seat-reservation-scoped>`;
210
+ }
211
+ /**
212
+ * @returns Returns the border graphic (COACH_BORDER_MIDDLE) of a coach with calculated border gap and coach width,
213
+ * depending on whether the coach is with a driver area or without.
214
+ */
215
+ _getRenderedCoachBorders(coachItem, deckCoachIndex, coachIndex) {
216
+ if (!coachItem.graphicElements) return null;
217
+ const currCoachStructure = this.seatReservationStructure.decks[deckCoachIndex].deckCoaches[coachIndex];
218
+ const coachBorderElement = currCoachStructure.borderMiddleElement;
219
+ const hasOverhangingElements = currCoachStructure.hasOverhangingElements;
220
+ return html`
221
+ <sbb-seat-reservation-graphic
222
+ class="${classMap({ "sbb-sr-coach-has-overhanging-elements": hasOverhangingElements || false })}"
223
+ style=${styleMap({
224
+ "--sbb-seat-reservation-graphic-width": coachBorderElement.dimension.w,
225
+ "--sbb-seat-reservation-graphic-height": coachBorderElement.dimension.h,
226
+ "--sbb-seat-reservation-graphic-top": coachBorderElement.position.y,
227
+ "--sbb-seat-reservation-graphic-left": coachBorderElement.position.x,
228
+ "--sbb-seat-reservation-graphic-position": "absolute"
229
+ })}
230
+ name="COACH_BORDER_MIDDLE"
231
+ ?stretch=${true}
232
+ role="presentation"
233
+ ></sbb-seat-reservation-graphic>
234
+ `;
235
+ }
236
+ _getRenderedRowPlaces(coach, coachIndex, coachDeckIndex, placeCoachDeckIndex) {
237
+ if (!coach.places) return null;
238
+ const tableRowPlaces = {};
239
+ for (const place of coach.places) if (!tableRowPlaces[place.position.y]) tableRowPlaces[place.position.y] = [place];
240
+ else tableRowPlaces[place.position.y].push(place);
241
+ return Object.values(tableRowPlaces).map((rowPlaces, index) => {
242
+ return html`
243
+ <tr id="row-${coachIndex}-${rowPlaces[0].position.y}" data-row-index=${index}>
244
+ ${this._getRenderedColumnPlaces(rowPlaces, coachIndex, coachDeckIndex, placeCoachDeckIndex)}
245
+ </tr>
246
+ `;
247
+ }).flatMap((rowTemplate) => rowTemplate);
248
+ }
249
+ _getRenderedColumnPlaces(places, coachIndex, deckIndex, placeCoachDeckIndex) {
250
+ places.sort((placeA, placeB) => Number(placeA.position.x) - Number(placeB.position.x));
251
+ const trackPlaceId = coachIndex + "-" + placeCoachDeckIndex;
252
+ return html`${repeat(places, (place) => trackPlaceId + "-" + place.number, (place, index) => {
253
+ const calculatedDimension = this.getCalculatedDimension(place.dimension);
254
+ const calculatedPosition = this.getCalculatedPosition(place.position);
255
+ const rotation = place.rotation || 0;
256
+ const textRotation = this.alignVertical ? -90 : 0;
257
+ const placeId = this.getPlaceElementId(deckIndex, coachIndex, place.number);
258
+ return html`
259
+ <td
260
+ id="cell-${deckIndex}-${coachIndex}-${place.position.y}-${index}"
261
+ class="graphical-element"
262
+ >
263
+ <sbb-seat-reservation-place-control
264
+ style=${styleMap({
265
+ "--sbb-seat-reservation-place-control-text-scale-value": Math.min(calculatedDimension.w, calculatedDimension.h),
266
+ "--sbb-seat-reservation-place-control-width": calculatedDimension.w,
267
+ "--sbb-seat-reservation-place-control-height": calculatedDimension.h,
268
+ "--sbb-seat-reservation-place-control-top": calculatedPosition.y,
269
+ "--sbb-seat-reservation-place-control-left": calculatedPosition.x,
270
+ "--sbb-seat-reservation-place-control-rotation": rotation,
271
+ "--sbb-seat-reservation-place-control-text-rotation": textRotation
272
+ })}
273
+ @selectplace=${(selectPlaceEvent) => this._onSelectPlace(selectPlaceEvent)}
274
+ exportparts="sbb-sr-place-part"
275
+ id=${placeId}
276
+ class="seat-reservation-place-control"
277
+ text=${place.number}
278
+ type=${place.type}
279
+ state=${place.state}
280
+ travel-direction=${this.travelDirection}
281
+ coach-index=${coachIndex}
282
+ deck-index=${placeCoachDeckIndex}
283
+ data-deck-index=${deckIndex}
284
+ .propertyIds=${place.propertyIds}
285
+ .preventClick=${this.preventPlaceClick}
286
+ ?showTitleInfo="${this.showTitleInfo}"
287
+ ></sbb-seat-reservation-place-control>
288
+ </td>
289
+ `;
290
+ })}`;
291
+ }
292
+ _getRenderedCoachElements(coachDeckIndex, coachIndex) {
293
+ return this.seatReservationStructure.decks[coachDeckIndex].deckCoaches[coachIndex].otherElements.map((graphicElement) => {
294
+ return html` <sbb-seat-reservation-graphic
295
+ style=${styleMap({
296
+ "--sbb-seat-reservation-graphic-width": graphicElement.dimension.w,
297
+ "--sbb-seat-reservation-graphic-height": graphicElement.dimension.h,
298
+ "--sbb-seat-reservation-graphic-top": graphicElement.position.y,
299
+ "--sbb-seat-reservation-graphic-left": graphicElement.position.x,
300
+ "--sbb-seat-reservation-graphic-position": "absolute",
301
+ "--sbb-seat-reservation-graphic-rotation": graphicElement.rotation
302
+ })}
303
+ name=${graphicElement.icon ?? nothing}
304
+ aria-hidden="true"
305
+ ?stretch=${true}
306
+ ></sbb-seat-reservation-graphic>`;
307
+ });
308
+ }
309
+ _getRenderedAreaElements(coachDeckIndex, coachIndex) {
310
+ return this.seatReservationStructure.decks[coachDeckIndex].deckCoaches[coachIndex].areaElements.map((graphicElement) => {
311
+ const triggerId = `popover-trigger-${coachDeckIndex}-${coachIndex}-${graphicElement.position.x}-${graphicElement.position.y}`;
312
+ const isNotTableGraphic = graphicElement.icon?.indexOf("TABLE") === -1;
313
+ const areaProperty = graphicElement.icon && isNotTableGraphic ? graphicElement.icon : null;
314
+ const ariaLabelForArea = graphicElement.icon ? getI18nSeatReservation(graphicElement.icon, this._language.current) : nothing;
315
+ return html`
316
+ <sbb-seat-reservation-area
317
+ id="${triggerId}"
318
+ class="${classMap({ "sbb-seat-reservation-area--cursor-pointer": areaProperty !== null })}"
319
+ style=${styleMap({
320
+ "--sbb-seat-reservation-area-width": graphicElement.dimension.w,
321
+ "--sbb-seat-reservation-area-height": graphicElement.dimension.h,
322
+ "--sbb-seat-reservation-area-top": graphicElement.position.y,
323
+ "--sbb-seat-reservation-area-left": graphicElement.position.x,
324
+ "--sbb-seat-reservation-area-z-index": graphicElement.position.z
325
+ })}
326
+ mounting=${graphicElement.mounting ?? nothing}
327
+ background="dark"
328
+ aria-hidden="true"
329
+ >
330
+ ${areaProperty ? html`
331
+ <sbb-seat-reservation-graphic
332
+ style=${styleMap({
333
+ "--sbb-seat-reservation-graphic-max-width": this.globalAreaIconDim.w,
334
+ "--sbb-seat-reservation-graphic-max-height": this.globalAreaIconDim.h,
335
+ "--sbb-seat-reservation-graphic-width": graphicElement.dimension.w,
336
+ "--sbb-seat-reservation-graphic-height": graphicElement.dimension.h,
337
+ "--sbb-seat-reservation-graphic-rotation": graphicElement.rotation,
338
+ "--sbb-seat-reservation-graphic-padding-percent": areaProperty !== "ENTRY_EXIT" ? this.globalAreaIconPadding : 1
339
+ })}
340
+ name=${areaProperty}
341
+ role="img"
342
+ aria-hidden="true"
343
+ class="sbb-sr-graphic__dimension--square-dim"
344
+ ></sbb-seat-reservation-graphic>
345
+ ` : nothing}
346
+ </sbb-seat-reservation-area>
347
+ ${areaProperty ? this._popover(triggerId, ariaLabelForArea) : nothing}
348
+ `;
349
+ });
350
+ }
351
+ _getRenderedServiceElements(coachDeckIndex, coachIndex) {
352
+ return this.seatReservationStructure.decks[coachDeckIndex].deckCoaches[coachIndex].serviceElements.map((serviceElement) => {
353
+ const triggerId = `popover-trigger-${coachDeckIndex}-${coachIndex}-${serviceElement.position.x}-${serviceElement.position.y}`;
354
+ const titleDescription = serviceElement.icon ? getI18nSeatReservation(serviceElement.icon, this._language.current) : null;
355
+ return html`
356
+ <sbb-seat-reservation-graphic
357
+ id="${triggerId}"
358
+ style=${styleMap({
359
+ "--sbb-seat-reservation-graphic-width": serviceElement.dimension.w,
360
+ "--sbb-seat-reservation-graphic-height": serviceElement.dimension.h,
361
+ "--sbb-seat-reservation-graphic-top": serviceElement.position.y,
362
+ "--sbb-seat-reservation-graphic-left": serviceElement.position.x,
363
+ "--sbb-seat-reservation-graphic-position": "absolute",
364
+ "--sbb-seat-reservation-graphic-rotation": serviceElement.rotation
365
+ })}
366
+ class="sbb-seat-reservation-graphic--cursor-pointer"
367
+ name=${serviceElement.icon ?? nothing}
368
+ role="img"
369
+ aria-hidden="true"
370
+ ></sbb-seat-reservation-graphic>
371
+ ${this._popover(triggerId, titleDescription)}
372
+ `;
373
+ });
374
+ }
375
+ /**
376
+ * Manages the selected place event triggered from the place
377
+ * Each selection emits an array of all selected places
378
+ * @param selectPlaceEvent
379
+ */
380
+ _onSelectPlace(selectPlaceEvent) {
381
+ const selectedPlace = selectPlaceEvent.detail;
382
+ this.preventCoachScrollByPlaceClick = true;
383
+ this.isCoachGridFocusable = false;
384
+ this.focusedCoachIndex = -1;
385
+ if (!this.hasSeatReservationNativeFocus) this.hasSeatReservationNativeFocus = true;
386
+ if (!this.preventPlaceClick) {
387
+ this.updateSelectedSeatReservationPlaces(selectedPlace);
388
+ this.updateCurrentSelectedPlaceInCoach(selectedPlace);
389
+ }
390
+ }
391
+ _onSelectNavCoach(event) {
392
+ const selectedNavCoachIndex = event.detail;
393
+ this.isKeyboardNavigation = false;
394
+ this.preventCoachScrollByPlaceClick = false;
395
+ this.hasSeatReservationNativeFocus = true;
396
+ if (selectedNavCoachIndex !== null && selectedNavCoachIndex !== this.currSelectedCoachIndex) {
397
+ this.unfocusPlaceElement();
398
+ this.scrollToSelectedNavCoach(selectedNavCoachIndex);
399
+ } else if (selectedNavCoachIndex === this.currSelectedCoachIndex) {
400
+ this.updateCurrentSelectedCoach();
401
+ this.preselectPlaceInCoach();
402
+ }
403
+ this._closePopover();
404
+ }
405
+ _onFocusNavCoach() {
406
+ if (!this.preventCoachScrollByPlaceClick) this.preselectPlaceInCoach();
407
+ else this.focusPlaceElement(this.currSelectedPlace);
408
+ this.isAutoScrolling = false;
409
+ }
410
+ /**
411
+ * Creates a popover for extra service information
412
+ * @param triggerId
413
+ * @param popoverContent
414
+ * @private
415
+ */
416
+ _popover(triggerId, popoverContent) {
417
+ return html`
418
+ <sbb-popover trigger="${triggerId}" hover-trigger="">
419
+ <p class="sbb-text-s sbb-sr-popover">${popoverContent}</p>
420
+ </sbb-popover>
421
+ `;
422
+ }
423
+ /**
424
+ * trigger to close all opened popovers (normally only one is opened at a time)
425
+ * @private
426
+ */
427
+ _closePopover() {
428
+ this.shadowRoot?.querySelectorAll("sbb-popover:is(:state(state-opened),[state--state-opened])").forEach((popover) => popover.close());
429
+ }
430
+ _getDescriptionTableCoach(coachItem) {
431
+ if (coachItem.type === "LOCOMOTIVE_COACH") return getI18nSeatReservation("COACH_LOCOMOTIVE", this._language.current);
432
+ if (!coachItem.places?.length) return getI18nSeatReservation("COACH_BLOCKED_TABLE_CAPTION", this._language.current, [coachItem.id]);
433
+ let tableCoachDescription;
434
+ const areaDescriptions = this._getTitleDescriptionListString(coachItem.graphicElements);
435
+ const serviceDescriptions = this._getTitleDescriptionListString(coachItem.serviceElements);
436
+ tableCoachDescription = getI18nSeatReservation("COACH_TABLE_CAPTION", this._language.current, [coachItem.id]);
437
+ if (!this.hasNavigation) {
438
+ const freePlaces = this.getAvailableFreePlacesNumFromCoach(coachItem.places);
439
+ const freePlacesTxt = getI18nSeatReservation("COACH_AVAILABLE_NUMBER_OF_PLACES", this._language.current, [freePlaces.seats, freePlaces.bicycles]);
440
+ tableCoachDescription = tableCoachDescription.concat(". ").concat(freePlacesTxt).concat(". ");
441
+ }
442
+ if (!!areaDescriptions || !!serviceDescriptions) {
443
+ tableCoachDescription += ". " + getI18nSeatReservation("COACH_AVAILABLE_SERVICES", this._language.current) + ": ";
444
+ tableCoachDescription += serviceDescriptions + ", " + areaDescriptions + ".";
445
+ }
446
+ return tableCoachDescription;
447
+ }
448
+ _getTitleDescriptionListString(descriptionsElements) {
449
+ const uniqueDescriptions = [];
450
+ return descriptionsElements?.map((descriptionElement) => {
451
+ const icon = descriptionElement.icon;
452
+ if (!icon) return null;
453
+ const descriptionAlreadyExist = uniqueDescriptions.indexOf(icon) > -1;
454
+ const translation = getI18nSeatReservation(descriptionElement.icon, this._language.current);
455
+ const isValidDescription = this.notFixedRotatableAreaIcons.indexOf(icon) === -1 && this.notAreaElements.indexOf(icon) === -1;
456
+ if (!descriptionAlreadyExist) uniqueDescriptions.push(descriptionElement.icon);
457
+ return !!translation && !descriptionAlreadyExist && isValidDescription ? translation : null;
458
+ }).filter((description) => !!description).join(", ");
459
+ }
460
+ };
461
+ //#endregion
462
+ export { SbbSeatReservationElement as t };
463
+
464
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi5jb21wb25lbnQtRHlCNUZWcEQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24uY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5AdXNlICcuLi9jb21tb24vc3R5bGVzL3NlYXQtcmVzZXJ2YXRpb24tbWl4aW5zJyBhcyBzYmItc3ItbWl4aW5zO1xuQHVzZSAnLi4vY29tbW9uL3N0eWxlcy9zZWF0LXJlc2VydmF0aW9uLWZ1bmN0aW9ucycgYXMgc2JiLXNyLWZ1bmN0aW9ucztcblxuLy8gTWF4aW11bSByZXNwb25zaXZlIG5hdmlnYXRpb24gd2lkdGgsIGNvbnNpc3RzIG9mIHRoZSBtYXhpbXVtIG5hdmlnYXRpb24gZXh0ZW50IG1pbnVzIDJ4IG5hdiBkaXJlY3Rpb24gYnV0dG9ucyA5NnB4IGFuZCA4cHggcGFkZGluZy5cbiRtYXgtY29hY2gtbmF2aWdhdGlvbi13aWR0aDogY2FsYyg5NjBweCAtIDk2cHggLSA4cHgpO1xuJHNjcm9sbGJhci1oZWlnaHQ6IDE2cHg7XG5cbjpob3N0IHtcbiAgLy8gTm90ZTogVGhlIHVzZSBvZiBweCBpcyBpbnRlbnRpb25hbCBoZXJlLCBiZWNhdXNlIG1hbnkgd2lkdGhzL2hlaWdodHMsIHJvdGF0aW9ucywgc2NhbGVzLCBldGMuIGRlcGVuZHMgb24gdGhpcy5cbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemU6IDE2cHg7XG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0OiAwO1xuICAtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWRlY2tzOiAxO1xuXG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgOjpwYXJ0KGNvYWNoLWZsb29yKSB7XG4gICAgZmlsbDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMik7XG5cbiAgICAvLyBJbiBIaWdoIENvbnRyYXN0IE1vZGUgd2Ugc2V0IGZsb29yIGNvbG9yIHRvIHRyYW5zcGFyZW50XG4gICAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgICAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8vIHJvdGF0ZXMgdGhlIERPTS1wYXJ0IFwiY29hY2gtZmxvb3JcIiBieSAxODAgZGVncmVlcyBpZiB0aGUgaG9zdCBpcyBpbiBSVEwgbW9kZS5cbkBpbmNsdWRlIHNiYi1zci1taXhpbnMucm90YXRlLWRvbS1wYXJ0KGNvYWNoLWZsb29yKTtcblxuW3BvcG92ZXJdOndoZXJlKHNiYi1wb3BvdmVyKSB7XG4gIEBpbmNsdWRlIHNiYi5wb3BvdmVyLXJlc2V0O1xuXG4gIC5zYmItc3ItcG9wb3ZlciB7XG4gICAgbWFyZ2luLWJsb2NrOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBTVEFSVCAtIFZlcnRpY2FsIG1vZGVcbjpob3N0KFthbGlnbi12ZXJ0aWNhbF0pIHtcbiAgJGNvYWNoLW5hdmlnYXRpb24tcGFkZGluZzogNTtcbiAgJGNvYWNoLXNjcm9sbGJhci13aWR0aDogMjQ7XG4gICRjb2FjaC1ncmlkLXdpZHRoOiBjYWxjKHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCkgKyAkY29hY2gtc2Nyb2xsYmFyLXdpZHRoKTtcblxuICAuc2JiLXNyX19jb21wb25lbnQge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjIpO1xuICAgIGhlaWdodDogaW5oZXJpdDtcblxuICAgIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogc21hbGwpIHtcbiAgICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNTQpO1xuICAgIH1cblxuICAgIG5hdi5zYmItc3ItbmF2aWdhdGlvbixcbiAgICB1bC5zYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgbmF2LnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgICAgIHBhZGRpbmc6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KSAwO1xuXG4gICAgICAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMSk7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgcm90YXRlOiA5MGRlZztcblxuICAgICAgICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oLTEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVsLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICAgICAgICBtYXgtd2lkdGg6IGluaXRpYWw7XG5cbiAgICAgICAgLy8gUGFkZGluZyBuZWVkcyB0byB2aXN1YWwgZm9jdXMtdmlzaWJsZSBzdHlsZSBmb3IgbmF2IGJ1dHRvbiBpbnNpZGUgb3ZlcmZsb3cgY29udGVudCxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZvY3VzLXZpc2libGUgc3R5bGUgaXMgY3V0dGVkLlxuICAgICAgICBwYWRkaW5nOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtbmF2aWdhdGlvbi1wYWRkaW5nKTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbiBzY3JvbGw7XG5cbiAgICAgICAgLy8gaW4gdmVydGljYWwgbW9kZSwgdGhlIGxpIG11c3QgYmUgZmxleGVkOyBvdGhlcndpc2UgaXQgd291bGQgY2FsY3VsYXRlIHRoZSB3cm9uZyBoZWlnaHRcbiAgICAgICAgLy8gZHVlIHRvIHVzZXJhZ2VudCBzdHlsZSBzZXQgdG8gXCJsaXN0LWl0ZW1cIiBmb3IgZGlzcGxheVxuICAgICAgICBsaSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBMQUJFTE1VTFRJUExFIERFQ0tTIC0gTEFCRUxTXG4gIC5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAuc2JiLXNyX193cmFwcGVyLWRlY2stbGFiZWxzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtZ3JpZC13aWR0aCk7XG4gICAgICBoZWlnaHQ6IGluaXRpYWw7XG5cbiAgICAgIGIge1xuICAgICAgICBpbmxpbmUtc2l6ZTogY2FsYyg1MCUgLSBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNikpO1xuICAgICAgICBibG9jay1zaXplOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KTtcbiAgICAgICAgcm90YXRlOiBpbml0aWFsO1xuICAgICAgICB3cml0aW5nLW1vZGU6IGluaXRpYWw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVkVSVElDQUwgTU9ERSAtIFNFQVRNQVAgU0NST0xMIEFSRUFcbiAgLnNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oJGNvYWNoLWdyaWQtd2lkdGgpO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuIHNjcm9sbDtcblxuICAgIC5zYmItc3JfX3BhcmVudCB7XG4gICAgICByb3RhdGU6IDkwZGVnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBUUkFWRUwtRElSRUNUSU9OXG4gIC5zYmItc3ItdHJhdmVsLWRpcmVjdGlvbi13cmFwcGVyIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0odmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0KSk7XG4gICAgbWFyZ2luLWJsb2NrLXN0YXJ0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBFTkQgLSBWZXJ0aWNhbCBtb2RlXG5cbi5zYmItc3ItbmF2aWdhdGlvbiB7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMyk7XG59XG5cbi5zYmItc3ItbmF2aWdhdGlvbiAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDIpO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICB0b3A6IDA7XG4gIH1cbn1cblxuLnNiYi1zcl9fY29tcG9uZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiBjYWxjKHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDY0KSAtICRzY3JvbGxiYXItaGVpZ2h0KTtcbn1cblxuLy8gVFJBVkVMIERJUkVDVElPTlxuLnNiYi1zci10cmF2ZWwtZGlyZWN0aW9uLXdyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sdW1uLWdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIG1hcmdpbi1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCkgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tc2JiLXRleHQtZm9udC1zaXplLXMpO1xuXG4gIC5zYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWFycm93IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cbn1cblxuLy8gTkFWSUdBVElPTiBORVdcbi5zYmItc3ItbmF2aWdhdGlvbi13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nLWlubGluZTogMTZweDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcbiAgQGluY2x1ZGUgc2JiLnNjcm9sbGJhcjtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgcGFkZGluZzogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNikgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNSkgMDtcbiAgbWF4LXdpZHRoOiAkbWF4LWNvYWNoLW5hdmlnYXRpb24td2lkdGg7XG5cbiAgLy8gU2V0IHNiYiBzY3JvbGxiYXIgdHJhbnNwYXJlbnQgYnkgZGVmYXVsdFxuICAtLXNiYi1zY3JvbGxiYXItY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIG92ZXJmbG93OiBzY3JvbGwgaGlkZGVuO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLSBTZWF0IFJlc2VydmF0aW9uIE1haW4gTmF2aWdhdGlvbiAtIEVORCAtLS0tLS0tLS0tLS0tLS0tXG5cbi8vIC0tLS0tLS0tLS0tLS0gU2VhdCBSZXNlcnZhdGlvbiBDb2FjaGVzIC0gU1RBUlQgLS0tLS0tLS0tLS0tLS0tLS1cbi5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICBkaXNwbGF5OiBmbGV4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgLnNiYi1zcl9fd3JhcHBlci1kZWNrLWxhYmVscyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgaGVpZ2h0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSh2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQpKTtcbiAgICB3cml0aW5nLW1vZGU6IHZlcnRpY2FsLWxyO1xuXG4gICAgYiB7XG4gICAgICBoZWlnaHQ6IGNhbGMoNTAlIC0gc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpKTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICBtYXJnaW4tYmxvY2stZW5kOiAxNnB4O1xuICAgICAgcm90YXRlOiAxODBkZWc7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBsaW5lLWhlaWdodDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjApO1xuICAgIH1cbiAgfVxufVxuXG4uc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEge1xuICBAaW5jbHVkZSBzYmIuc2Nyb2xsYmFyO1xuXG4gIG92ZXJmbG93OiBzY3JvbGwgaGlkZGVuO1xuICBwYWRkaW5nLWJsb2NrOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg4KSBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNik7XG5cbiAgLnNiYi1zcl9fcGFyZW50IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB9XG59XG5cbi5zYmItc3JfX2xpc3QtZGVja3Mge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4uc2JiLXNyX19saXN0LWRlY2tzLS1nYXAge1xuICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQ4KTtcbn1cblxuLnNiYi1zcl9fbGlzdC1pdGVtLWRlY2sge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5zYmItc3JfX2xpc3QtY29hY2hlcyB7XG4gIEBpbmNsdWRlIHNiYi5saXN0LXJlc2V0O1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG59XG5cbi8vIElmIHRoZXJlIGFyZSBvdmVyaGFuZ2luZyBlbGVtZW50cyB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBnYXAgYmV0d2VlbiBjb2FjaGVzXG4uc2JiLXNyX19saXN0LWRlY2tzOmhhcyguc2JiLXNyLWNvYWNoLWhhcy1vdmVyaGFuZ2luZy1lbGVtZW50cykgLnNiYi1zcl9fbGlzdC1jb2FjaGVzIHtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg4KTtcbn1cblxuLnNiYi1zcl9faXRlbS1jb2FjaCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnNiYi1zci1jb2FjaC13cmFwcGVyX190YWJsZSB7XG4gIG91dGxpbmU6IDA7XG59XG4iLCJpbXBvcnQgeyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGJveFNpemluZ1N0eWxlcyB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvc3R5bGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2JiUG9wb3ZlckVsZW1lbnQgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9wb3BvdmVyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQ1NTUmVzdWx0R3JvdXAsXG4gIGh0bWwsXG4gIGlzU2VydmVyLFxuICBub3RoaW5nLFxuICB0eXBlIFByb3BlcnR5VmFsdWVzLFxuICB0eXBlIFRlbXBsYXRlUmVzdWx0LFxuICB1bnNhZmVDU1MsXG59IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjbGFzc01hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2NsYXNzLW1hcC5qcyc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQuanMnO1xuaW1wb3J0IHsgc3R5bGVNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9zdHlsZS1tYXAuanMnO1xuXG5pbXBvcnQgeyBnZXRJMThuU2VhdFJlc2VydmF0aW9uIH0gZnJvbSAnLi4vY29tbW9uL3RyYW5zbGF0aW9ucy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIFBsYWNlLFxuICBQbGFjZVNlbGVjdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uLFxufSBmcm9tICcuLi9jb21tb24vdHlwZXMudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uQXJlYUVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLWFyZWEvc2VhdC1yZXNlcnZhdGlvbi1hcmVhLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25HcmFwaGljRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy9zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMuY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvbk5hdmlnYXRpb25Db2FjaEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2gvc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tc2NvcGVkL3NlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLmNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IH0gZnJvbSAnLi9zZWF0LXJlc2VydmF0aW9uLWJhc2UtZWxlbWVudC50cyc7XG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9zZWF0LXJlc2VydmF0aW9uLnNjc3M/aW5saW5lJztcblxuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9idXR0b24uanMnO1xuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9zY3JlZW4tcmVhZGVyLW9ubHkuanMnO1xuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9wb3BvdmVyLmpzJztcblxuU2JiU2VhdFJlc2VydmF0aW9uQXJlYUVsZW1lbnQuZGVmaW5lKCk7XG5TYmJTZWF0UmVzZXJ2YXRpb25HcmFwaGljRWxlbWVudC5kZWZpbmUoKTtcblNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQuZGVmaW5lKCk7XG5TYmJTZWF0UmVzZXJ2YXRpb25OYXZpZ2F0aW9uQ29hY2hFbGVtZW50LmRlZmluZSgpO1xuU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudC5kZWZpbmUoKTtcblxuLyoqXG4gKiBNYWluIGNvbXBvbmVudCBmb3IgdGhlIHNlYXQgcmVzZXJ2YXRpb24uXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2JiU2VhdFJlc2VydmF0aW9uRWxlbWVudCBleHRlbmRzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi1zZWF0LXJlc2VydmF0aW9uJztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgdW5zYWZlQ1NTKHN0eWxlKV07XG5cbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9jb2FjaGVzSHRtbFRlbXBsYXRlPzogVGVtcGxhdGVSZXN1bHQ7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdoYXNOYXZpZ2F0aW9uJykpIHtcbiAgICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4JykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBmaXJzdCB1cGRhdGUgaXMgY29tcGxldGUgdG8gaW5pdCBkaWZmZXJlbnQgSFRNTCBlbGVtZW50IGRpbWVuc2lvbnNcbiAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICB0aGlzLl9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpO1xuICAgIHJldHVybiB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlID0gaHRtbGBcbiAgICAgICR7dGhpcy5fcmVuZGVyVHJhdmVsRGlyZWN0aW9uKCl9XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX19jb21wb25lbnRcIj5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uKCl9XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNiYi1zcl9fd3JhcHBlci1jb2FjaC1kZWNrc1wiXG4gICAgICAgICAgQGtleWRvd249JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLmtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmcoZXZ0KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItZGVjay1sYWJlbHNcIj4ke3RoaXMuX3JlbmRlckRlY2tMYWJlbHMoKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBAc2Nyb2xsPSR7KCkgPT4gdGhpcy5jb2FjaEFyZWFTY3JvbGxlbmQoKX1cbiAgICAgICAgICAgIGlkPVwic2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWFcIlxuICAgICAgICAgICAgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYVwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2JiLXNyX19wYXJlbnQtYXJlYVwiIGNsYXNzPVwic2JiLXNyX19wYXJlbnRcIj5cbiAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCIke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICAgICAgICdzYmItc3JfX2xpc3QtZGVja3MnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgJ3NiYi1zcl9fbGlzdC1kZWNrcy0tZ2FwJzogdGhpcy5oYXNNdWx0aXBsZURlY2tzLFxuICAgICAgICAgICAgICAgIH0pfVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAke3RoaXMuc2VhdFJlc2VydmF0aW9ucz8ubWFwKFxuICAgICAgICAgICAgICAgICAgKHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sYDxsaSBjbGFzcz1cInNiYi1zcl9fbGlzdC1pdGVtLWRlY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJzYmItc3JfX2xpc3QtY29hY2hlc1wiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5fcmVuZGVyQ29hY2hlcyhzZWF0UmVzZXJ2YXRpb24sIGNvYWNoRGVja0luZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPmA7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyRGVja0xhYmVscygpOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlRGVja3MpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5tYXAoKHNlYXRSZXNlcnZhdGlvbikgPT4ge1xuICAgICAgY29uc3QgZGVja0Rlc2NyaXB0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaExldmVsLFxuICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBodG1sYDxiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7ZGVja0Rlc2NyaXB0aW9ufTwvYj5gO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uIHx8ICF0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJ0bk5hdmlnYXRpb25EaXJlY3Rpb25JZCA9XG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCdcbiAgICAgICAgPyAnc2JiLXNyLW5hdmlnYXRpb25fX3dyYXBwZXItYnV0dG9uLWRpcmVjdGlvbi0tcmlnaHQnXG4gICAgICAgIDogJ3NiYi1zci1uYXZpZ2F0aW9uX193cmFwcGVyLWJ1dHRvbi1kaXJlY3Rpb24tLWxlZnQnO1xuICAgIGNvbnN0IGJ0bkljb24gPVxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnID8gJ2NoZXZyb24tc21hbGwtcmlnaHQtc21hbGwnIDogJ2NoZXZyb24tc21hbGwtbGVmdC1zbWFsbCc7XG4gICAgY29uc3QgYnRuQXJpYURlc2NyaXB0aW9uID1cbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJ1xuICAgICAgICA/IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ1NFQVRfUkVTRVJWQVRJT05fRU5EJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudClcbiAgICAgICAgOiBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdTRUFUX1JFU0VSVkFUSU9OX0JFR0lOJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCk7XG4gICAgbGV0IGJ0bkRpc2FibGVkID0gdHJ1ZTtcblxuICAgIGlmIChidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9MRUZUJyAmJiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA+IDApIHtcbiAgICAgIGJ0bkRpc2FibGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyAmJlxuICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPCB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxXG4gICAgKSB7XG4gICAgICBidG5EaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uXCI+XG4gICAgICA8c2JiLXNlY29uZGFyeS1idXR0b25cbiAgICAgICAgQGNsaWNrPVwiJHsoKSA9PiB0aGlzLm5hdmlnYXRlQnlEaXJlY3Rpb25CdG4oYnRuRGlyZWN0aW9uKX1cIlxuICAgICAgICBAZm9jdXM9XCIkeygpID0+IHRoaXMub25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpfVwiXG4gICAgICAgIGlkPVwiJHtidG5OYXZpZ2F0aW9uRGlyZWN0aW9uSWR9XCJcbiAgICAgICAgY2xhc3M9XCJzYmItc3JfX25hdmlnYXRpb24tY29udHJvbC1idXR0b25cIlxuICAgICAgICBzaXplPVwibVwiXG4gICAgICAgIGljb24tbmFtZT1cIiR7YnRuSWNvbn1cIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIiR7YnRuQXJpYURlc2NyaXB0aW9ufVwiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAuZGlzYWJsZWRJbnRlcmFjdGl2ZT1cIiR7YnRuRGlzYWJsZWQgfHwgbm90aGluZ31cIlxuICAgICAgICAuZGlzYWJsZWQ9XCIke2J0bkRpc2FibGVkIHx8IG5vdGhpbmd9XCJcbiAgICAgID48L3NiYi1zZWNvbmRhcnktYnV0dG9uPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJUcmF2ZWxEaXJlY3Rpb24oKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudHJhdmVsRGlyZWN0aW9uIHx8IHRoaXMudHJhdmVsRGlyZWN0aW9uID09PSAnTk9ORScpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbGFiZWxUZXh0ID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICdTRUFUX1JFU0VSVkFUSU9OX1RSQVZFTF9ESVJFQ1RJT04nLFxuICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICApO1xuXG4gICAgY29uc3QgYXJyb3dEaXJlY3Rpb24gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy50cmF2ZWxEaXJlY3Rpb24gPT09ICdSSUdIVCdcbiAgICAgICAgPyAnZG93bidcbiAgICAgICAgOiAndXAnXG4gICAgICA6IHRoaXMudHJhdmVsRGlyZWN0aW9uID09PSAnUklHSFQnXG4gICAgICAgID8gJ3JpZ2h0J1xuICAgICAgICA6ICdsZWZ0JztcblxuICAgIGNvbnN0IGljb25OYW1lID0gYGFycm93LSR7YXJyb3dEaXJlY3Rpb259LXNtYWxsYDtcblxuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJzYmItc3ItdHJhdmVsLWRpcmVjdGlvbi13cmFwcGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX190cmF2ZWwtZGlyZWN0aW9uLS1hcnJvd1wiPlxuICAgICAgICA8c2JiLWljb24gc2xvdD1cImljb25cIiBuYW1lPVwiJHtpY29uTmFtZX1cIj48L3NiYi1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX190cmF2ZWwtZGlyZWN0aW9uLS1sYWJlbFwiPiR7bGFiZWxUZXh0fTwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJOYXZpZ2F0aW9uKCk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKGlzU2VydmVyIHx8ICF0aGlzLmhhc05hdmlnYXRpb24gfHwgIXRoaXMuc2VhdFJlc2VydmF0aW9ucykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uLXdyYXBwZXJcIj5cbiAgICAgIDxuYXYgaWQ9XCJzYmItc3ItbmF2aWdhdGlvblwiIGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25cIj5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uQ29udHJvbEJ1dHRvbignRElSRUNUSU9OX0xFRlQnKX1cbiAgICAgICAgPHVsXG4gICAgICAgICAgaWQ9XCJzYmItc3JfX25hdmlnYXRpb24tbGlzdC1jb2FjaGVzXCJcbiAgICAgICAgICBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXNcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCIke2dldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgICAgICAnU0VBVF9SRVNFUlZBVElPTl9OQVZJR0FUSU9OJyxcbiAgICAgICAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICAgICAgKX1cIlxuICAgICAgICA+XG4gICAgICAgICAgJHt0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5tYXAoXG4gICAgICAgICAgICAoY29hY2hJdGVtRGV0YWlsczogQ29hY2hJdGVtRGV0YWlscywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8bGk+XG4gICAgICAgICAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2hcbiAgICAgICAgICAgICAgICAgIEBzZWxlY3Rjb2FjaD0keyhldmVudDogQ3VzdG9tRXZlbnQ8bnVtYmVyPikgPT4gdGhpcy5fb25TZWxlY3ROYXZDb2FjaChldmVudCl9XG4gICAgICAgICAgICAgICAgICBAZm9jdXNjb2FjaD0keygpID0+IHRoaXMuX29uRm9jdXNOYXZDb2FjaCgpfVxuICAgICAgICAgICAgICAgICAgQGtleXVwPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5vbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihldnQsIGluZGV4KX1cbiAgICAgICAgICAgICAgICAgIGluZGV4PVwiJHtpbmRleH1cIlxuICAgICAgICAgICAgICAgICAgLnNlbGVjdGVkPSR7dGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgICAgLmZvY3VzZWQ9JHt0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09PSBpbmRleH1cbiAgICAgICAgICAgICAgICAgIC5ob3ZlcmVkPSR7dGhpcy5ob3ZlcmVkQ29hY2hJbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgICAubmF0aXZlRm9jdXNBY3RpdmU9JHt0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzfVxuICAgICAgICAgICAgICAgICAgLmNvYWNoSXRlbURldGFpbHM9XCIke2NvYWNoSXRlbURldGFpbHN9XCJcbiAgICAgICAgICAgICAgICAgID92ZXJ0aWNhbD1cIiR7dGhpcy5hbGlnblZlcnRpY2FsfVwiXG4gICAgICAgICAgICAgICAgICA/c2hvd1RpdGxlSW5mbz1cIiR7dGhpcy5zaG93VGl0bGVJbmZvfVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaD5cbiAgICAgICAgICAgICAgPC9saT5gO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApfVxuICAgICAgICA8L3VsPlxuICAgICAgICAke3RoaXMuX3JlbmRlck5hdmlnYXRpb25Db250cm9sQnV0dG9uKCdESVJFQ1RJT05fUklHSFQnKX1cbiAgICAgIDwvbmF2PlxuICAgIDwvZGl2PmA7XG4gIH1cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEBwYXJhbSBzZWF0UmVzZXJ2YXRpb25cbiAgICogQHBhcmFtIGNvYWNoRGVja0luZGV4XG4gICAqL1xuICBwcml2YXRlIF9yZW5kZXJDb2FjaGVzKFxuICAgIHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBjb25zdCBjb2FjaGVzOiBDb2FjaEl0ZW1bXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2VhdFJlc2VydmF0aW9uPy5jb2FjaEl0ZW1zKSk7XG5cbiAgICBpZiAoIWNvYWNoZXMgfHwgaXNTZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY29hY2hlcy5tYXAoKGNvYWNoSXRlbTogQ29hY2hJdGVtLCBjb2FjaEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8bGkgY2xhc3M9XCJzYmItc3JfX2l0ZW0tY29hY2hcIj5cbiAgICAgICAgICAke3RoaXMuX3JlbmRlckNvYWNoRWxlbWVudChcbiAgICAgICAgICAgIGNvYWNoSXRlbSxcbiAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICAgICAgIHNlYXRSZXNlcnZhdGlvbi5kZWNrQ29hY2hJbmRleCxcbiAgICAgICAgICApfVxuICAgICAgICA8L2xpPlxuICAgICAgYDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckNvYWNoRWxlbWVudChcbiAgICBjb2FjaEl0ZW06IENvYWNoSXRlbSxcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZUNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBjYWxjdWxhdGVkQ29hY2hEaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oY29hY2hJdGVtLmRpbWVuc2lvbik7XG4gICAgY29uc3QgZGVzY3JpcHRpb25UYWJsZUNvYWNoV2l0aFNlcnZpY2VzID0gdGhpcy5fZ2V0RGVzY3JpcHRpb25UYWJsZUNvYWNoKGNvYWNoSXRlbSk7XG5cbiAgICByZXR1cm4gaHRtbGA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkXG4gICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLXdpZHRoJzogY2FsY3VsYXRlZENvYWNoRGltZW5zaW9uLncsXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC1oZWlnaHQnOiBjYWxjdWxhdGVkQ29hY2hEaW1lbnNpb24uaCxcbiAgICAgIH0pfVxuICAgID5cbiAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRDb2FjaEJvcmRlcnMoY29hY2hJdGVtLCBjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkQ29hY2hFbGVtZW50cyhjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkQXJlYUVsZW1lbnRzKGNvYWNoRGVja0luZGV4LCBjb2FjaEluZGV4KX1cbiAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRTZXJ2aWNlRWxlbWVudHMoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgpfVxuXG4gICAgICA8dGFibGVcbiAgICAgICAgQGZvY3VzPSR7KCkgPT4gdGhpcy5vbkZvY3VzVGFibGVDb2FjaEFuZFByZXNlbGVjdFBsYWNlKGNvYWNoSW5kZXgpfVxuICAgICAgICBpZD1cInNiYi1zci1jb2FjaC0ke2NvYWNoSW5kZXh9XCJcbiAgICAgICAgY2xhc3M9XCJzYmItc3ItY29hY2gtd3JhcHBlcl9fdGFibGVcIlxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwic2JiLXNyLWNvYWNoLWNhcHRpb24tJHtjb2FjaEluZGV4fVwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgPlxuICAgICAgICA8Y2FwdGlvbiBpZD1cInNiYi1zci1jb2FjaC1jYXB0aW9uLSR7Y29hY2hJbmRleH1cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHk+JHtkZXNjcmlwdGlvblRhYmxlQ29hY2hXaXRoU2VydmljZXN9PC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICA8L2NhcHRpb24+XG4gICAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRSb3dQbGFjZXMoY29hY2hJdGVtLCBjb2FjaEluZGV4LCBjb2FjaERlY2tJbmRleCwgcGxhY2VDb2FjaERlY2tJbmRleCl9XG4gICAgICA8L3RhYmxlPlxuICAgIDwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkPmA7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgYm9yZGVyIGdyYXBoaWMgKENPQUNIX0JPUkRFUl9NSURETEUpIG9mIGEgY29hY2ggd2l0aCBjYWxjdWxhdGVkIGJvcmRlciBnYXAgYW5kIGNvYWNoIHdpZHRoLFxuICAgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29hY2ggaXMgd2l0aCBhIGRyaXZlciBhcmVhIG9yIHdpdGhvdXQuXG4gICAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJlZENvYWNoQm9yZGVycyhcbiAgICBjb2FjaEl0ZW06IENvYWNoSXRlbSxcbiAgICBkZWNrQ29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoIWNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY3VyckNvYWNoU3RydWN0dXJlID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW2RlY2tDb2FjaEluZGV4XS5kZWNrQ29hY2hlc1tjb2FjaEluZGV4XTtcbiAgICBjb25zdCBjb2FjaEJvcmRlckVsZW1lbnQgPSBjdXJyQ29hY2hTdHJ1Y3R1cmUuYm9yZGVyTWlkZGxlRWxlbWVudDtcbiAgICBjb25zdCBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzID0gY3VyckNvYWNoU3RydWN0dXJlLmhhc092ZXJoYW5naW5nRWxlbWVudHM7XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgJ3NiYi1zci1jb2FjaC1oYXMtb3ZlcmhhbmdpbmctZWxlbWVudHMnOiBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzIHx8IGZhbHNlLFxuICAgICAgICB9KX1cIlxuICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogY29hY2hCb3JkZXJFbGVtZW50LmRpbWVuc2lvbi53LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogY29hY2hCb3JkZXJFbGVtZW50LmRpbWVuc2lvbi5oLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtdG9wJzogY29hY2hCb3JkZXJFbGVtZW50LnBvc2l0aW9uLnksXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0JzogY29hY2hCb3JkZXJFbGVtZW50LnBvc2l0aW9uLngsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgIH0pfVxuICAgICAgICBuYW1lPVwiQ09BQ0hfQk9SREVSX01JRERMRVwiXG4gICAgICAgID9zdHJldGNoPSR7dHJ1ZX1cbiAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZFJvd1BsYWNlcyhcbiAgICBjb2FjaDogQ29hY2hJdGVtLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghY29hY2gucGxhY2VzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gUHJlcGFyZSByb3dzIHdpdGggdGhlIHBsYWNlcyB0byByZW5kZXIgYSB0YWJsZVxuICAgIGNvbnN0IHRhYmxlUm93UGxhY2VzOiBSZWNvcmQ8bnVtYmVyLCBQbGFjZVtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2gucGxhY2VzKSB7XG4gICAgICBpZiAoIXRhYmxlUm93UGxhY2VzW3BsYWNlLnBvc2l0aW9uLnldKSB7XG4gICAgICAgIHRhYmxlUm93UGxhY2VzW3BsYWNlLnBvc2l0aW9uLnldID0gW3BsYWNlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhYmxlUm93UGxhY2VzW3BsYWNlLnBvc2l0aW9uLnldLnB1c2gocGxhY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRhYmxlUm93UGxhY2VzKVxuICAgICAgLm1hcCgocm93UGxhY2VzOiBQbGFjZVtdLCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICA8dHIgaWQ9XCJyb3ctJHtjb2FjaEluZGV4fS0ke3Jvd1BsYWNlc1swXS5wb3NpdGlvbi55fVwiIGRhdGEtcm93LWluZGV4PSR7aW5kZXh9PlxuICAgICAgICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZENvbHVtblBsYWNlcyhcbiAgICAgICAgICAgICAgcm93UGxhY2VzLFxuICAgICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICAgICAgICAgcGxhY2VDb2FjaERlY2tJbmRleCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgYDtcbiAgICAgIH0pXG4gICAgICAuZmxhdE1hcCgocm93VGVtcGxhdGUpID0+IHJvd1RlbXBsYXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkQ29sdW1uUGxhY2VzKFxuICAgIHBsYWNlczogUGxhY2VbXSxcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgZGVja0luZGV4OiBudW1iZXIsXG4gICAgcGxhY2VDb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIC8vU29ydHMgZWFjaCBwbGFjZSBieSBpdHMgYXNjZW5kaW5nIHggY29vcmRpbmF0ZVxuICAgIHBsYWNlcy5zb3J0KFxuICAgICAgKHBsYWNlQTogUGxhY2UsIHBsYWNlQjogUGxhY2UpID0+IE51bWJlcihwbGFjZUEucG9zaXRpb24ueCkgLSBOdW1iZXIocGxhY2VCLnBvc2l0aW9uLngpLFxuICAgICk7XG5cbiAgICAvLyBGb3IgcmVuZGVyaW5nIHRoZSBwbGFjZXMgd2l0aGluIGEgdGQgZWxlbWVudCwgaGVyZSB3ZSB1c2UgcmVwZWF0IGRpcmVjdGl2ZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIGZvciByZXVzaW5nIGVsZW1lbnRzICh0cmFjayBieSBpZCkuXG4gICAgY29uc3QgdHJhY2tQbGFjZUlkID0gY29hY2hJbmRleCArICctJyArIHBsYWNlQ29hY2hEZWNrSW5kZXg7XG4gICAgcmV0dXJuIGh0bWxgJHtyZXBlYXQoXG4gICAgICBwbGFjZXMsXG4gICAgICAocGxhY2UpID0+IHRyYWNrUGxhY2VJZCArICctJyArIHBsYWNlLm51bWJlcixcbiAgICAgIChwbGFjZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihwbGFjZS5kaW1lbnNpb24pO1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihwbGFjZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHJvdGF0aW9uID0gcGxhY2Uucm90YXRpb24gfHwgMDtcbiAgICAgICAgY29uc3QgdGV4dFJvdGF0aW9uID0gdGhpcy5hbGlnblZlcnRpY2FsID8gLTkwIDogMDtcbiAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoZGVja0luZGV4LCBjb2FjaEluZGV4LCBwbGFjZS5udW1iZXIpO1xuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGlkPVwiY2VsbC0ke2RlY2tJbmRleH0tJHtjb2FjaEluZGV4fS0ke3BsYWNlLnBvc2l0aW9uLnl9LSR7aW5kZXh9XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JhcGhpY2FsLWVsZW1lbnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sXG4gICAgICAgICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtdGV4dC1zY2FsZS12YWx1ZSc6IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXRvcCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi55LFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtbGVmdCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi54LFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtcm90YXRpb24nOiByb3RhdGlvbixcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXRleHQtcm90YXRpb24nOiB0ZXh0Um90YXRpb24sXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBAc2VsZWN0cGxhY2U9JHsoc2VsZWN0UGxhY2VFdmVudDogQ3VzdG9tRXZlbnQ8UGxhY2VTZWxlY3Rpb24+KSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX29uU2VsZWN0UGxhY2Uoc2VsZWN0UGxhY2VFdmVudCl9XG4gICAgICAgICAgICAgIGV4cG9ydHBhcnRzPVwic2JiLXNyLXBsYWNlLXBhcnRcIlxuICAgICAgICAgICAgICBpZD0ke3BsYWNlSWR9XG4gICAgICAgICAgICAgIGNsYXNzPVwic2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sXCJcbiAgICAgICAgICAgICAgdGV4dD0ke3BsYWNlLm51bWJlcn1cbiAgICAgICAgICAgICAgdHlwZT0ke3BsYWNlLnR5cGV9XG4gICAgICAgICAgICAgIHN0YXRlPSR7cGxhY2Uuc3RhdGV9XG4gICAgICAgICAgICAgIHRyYXZlbC1kaXJlY3Rpb249JHt0aGlzLnRyYXZlbERpcmVjdGlvbn1cbiAgICAgICAgICAgICAgY29hY2gtaW5kZXg9JHtjb2FjaEluZGV4fVxuICAgICAgICAgICAgICBkZWNrLWluZGV4PSR7cGxhY2VDb2FjaERlY2tJbmRleH1cbiAgICAgICAgICAgICAgZGF0YS1kZWNrLWluZGV4PSR7ZGVja0luZGV4fVxuICAgICAgICAgICAgICAucHJvcGVydHlJZHM9JHtwbGFjZS5wcm9wZXJ0eUlkc31cbiAgICAgICAgICAgICAgLnByZXZlbnRDbGljaz0ke3RoaXMucHJldmVudFBsYWNlQ2xpY2t9XG4gICAgICAgICAgICAgID9zaG93VGl0bGVJbmZvPVwiJHt0aGlzLnNob3dUaXRsZUluZm99XCJcbiAgICAgICAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2w+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgYDtcbiAgICAgIH0sXG4gICAgKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRDb2FjaEVsZW1lbnRzKFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgY29uc3QgY3VyckNvYWNoU3RydWN0dXJlID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW2NvYWNoRGVja0luZGV4XS5kZWNrQ29hY2hlc1tjb2FjaEluZGV4XTtcblxuICAgIHJldHVybiBjdXJyQ29hY2hTdHJ1Y3R1cmUub3RoZXJFbGVtZW50cy5tYXAoKGdyYXBoaWNFbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gaHRtbGAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGdyYXBoaWNFbGVtZW50LmRpbWVuc2lvbi53LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogZ3JhcGhpY0VsZW1lbnQuZGltZW5zaW9uLmgsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiBncmFwaGljRWxlbWVudC5wb3NpdGlvbi55LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbGVmdCc6IGdyYXBoaWNFbGVtZW50LnBvc2l0aW9uLngsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IGdyYXBoaWNFbGVtZW50LnJvdGF0aW9uLFxuICAgICAgICB9KX1cbiAgICAgICAgbmFtZT0ke2dyYXBoaWNFbGVtZW50Lmljb24gPz8gbm90aGluZ31cbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgP3N0cmV0Y2g9JHt0cnVlfVxuICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5gO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRBcmVhRWxlbWVudHMoXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBjb25zdCBjdXJyQ29hY2hTdHJ1Y3R1cmUgPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUuZGVja3NbY29hY2hEZWNrSW5kZXhdLmRlY2tDb2FjaGVzW2NvYWNoSW5kZXhdO1xuXG4gICAgcmV0dXJuIGN1cnJDb2FjaFN0cnVjdHVyZS5hcmVhRWxlbWVudHMubWFwKChncmFwaGljRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgdHJpZ2dlcklkID0gYHBvcG92ZXItdHJpZ2dlci0ke2NvYWNoRGVja0luZGV4fS0ke2NvYWNoSW5kZXh9LSR7Z3JhcGhpY0VsZW1lbnQucG9zaXRpb24ueH0tJHtncmFwaGljRWxlbWVudC5wb3NpdGlvbi55fWA7XG4gICAgICBjb25zdCBpc05vdFRhYmxlR3JhcGhpYyA9IGdyYXBoaWNFbGVtZW50Lmljb24/LmluZGV4T2YoJ1RBQkxFJykgPT09IC0xO1xuICAgICAgY29uc3QgYXJlYVByb3BlcnR5ID0gZ3JhcGhpY0VsZW1lbnQuaWNvbiAmJiBpc05vdFRhYmxlR3JhcGhpYyA/IGdyYXBoaWNFbGVtZW50Lmljb24gOiBudWxsO1xuICAgICAgY29uc3QgYXJpYUxhYmVsRm9yQXJlYSA9IGdyYXBoaWNFbGVtZW50Lmljb25cbiAgICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKGdyYXBoaWNFbGVtZW50Lmljb24sIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICAgIDogbm90aGluZztcblxuICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhXG4gICAgICAgICAgaWQ9XCIke3RyaWdnZXJJZH1cIlxuICAgICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgICAnc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS0tY3Vyc29yLXBvaW50ZXInOiBhcmVhUHJvcGVydHkgIT09IG51bGwsXG4gICAgICAgICAgfSl9XCJcbiAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtd2lkdGgnOiBncmFwaGljRWxlbWVudC5kaW1lbnNpb24udyxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtaGVpZ2h0JzogZ3JhcGhpY0VsZW1lbnQuZGltZW5zaW9uLmgsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLXRvcCc6IGdyYXBoaWNFbGVtZW50LnBvc2l0aW9uLnksXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLWxlZnQnOiBncmFwaGljRWxlbWVudC5wb3NpdGlvbi54LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS16LWluZGV4JzogZ3JhcGhpY0VsZW1lbnQucG9zaXRpb24ueixcbiAgICAgICAgICB9KX1cbiAgICAgICAgICBtb3VudGluZz0ke2dyYXBoaWNFbGVtZW50Lm1vdW50aW5nID8/IG5vdGhpbmd9XG4gICAgICAgICAgYmFja2dyb3VuZD1cImRhcmtcIlxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAke2FyZWFQcm9wZXJ0eVxuICAgICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1tYXgtd2lkdGgnOiB0aGlzLmdsb2JhbEFyZWFJY29uRGltLncsXG4gICAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbWF4LWhlaWdodCc6IHRoaXMuZ2xvYmFsQXJlYUljb25EaW0uaCxcbiAgICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGdyYXBoaWNFbGVtZW50LmRpbWVuc2lvbi53LFxuICAgICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGdyYXBoaWNFbGVtZW50LmRpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXJvdGF0aW9uJzogZ3JhcGhpY0VsZW1lbnQucm90YXRpb24sXG4gICAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcGFkZGluZy1wZXJjZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICBhcmVhUHJvcGVydHkgIT09ICdFTlRSWV9FWElUJyA/IHRoaXMuZ2xvYmFsQXJlYUljb25QYWRkaW5nIDogMSxcbiAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgbmFtZT0ke2FyZWFQcm9wZXJ0eX1cbiAgICAgICAgICAgICAgICAgIHJvbGU9XCJpbWdcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLXNyLWdyYXBoaWNfX2RpbWVuc2lvbi0tc3F1YXJlLWRpbVwiXG4gICAgICAgICAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWE+XG4gICAgICAgICR7YXJlYVByb3BlcnR5ID8gdGhpcy5fcG9wb3Zlcih0cmlnZ2VySWQsIGFyaWFMYWJlbEZvckFyZWEpIDogbm90aGluZ31cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZFNlcnZpY2VFbGVtZW50cyhcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGNvbnN0IGN1cnJDb2FjaFN0cnVjdHVyZSA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrc1tjb2FjaERlY2tJbmRleF0uZGVja0NvYWNoZXNbY29hY2hJbmRleF07XG5cbiAgICByZXR1cm4gY3VyckNvYWNoU3RydWN0dXJlLnNlcnZpY2VFbGVtZW50cy5tYXAoKHNlcnZpY2VFbGVtZW50OiBCYXNlRWxlbWVudCkgPT4ge1xuICAgICAgLy9nZW5lcmF0ZSB1bmlxdWUgaW5kZXggbnVtYmVyIGZvciB0aGUgdHJpZ2dlciBlbGVtZW50XG4gICAgICBjb25zdCB0cmlnZ2VySWQgPSBgcG9wb3Zlci10cmlnZ2VyLSR7Y29hY2hEZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtzZXJ2aWNlRWxlbWVudC5wb3NpdGlvbi54fS0ke3NlcnZpY2VFbGVtZW50LnBvc2l0aW9uLnl9YDtcbiAgICAgIGNvbnN0IHRpdGxlRGVzY3JpcHRpb24gPSBzZXJ2aWNlRWxlbWVudC5pY29uXG4gICAgICAgID8gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihzZXJ2aWNlRWxlbWVudC5pY29uLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KVxuICAgICAgICA6IG51bGw7XG5cbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICAgIGlkPVwiJHt0cmlnZ2VySWR9XCJcbiAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBzZXJ2aWNlRWxlbWVudC5kaW1lbnNpb24udyxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0Jzogc2VydmljZUVsZW1lbnQuZGltZW5zaW9uLmgsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXRvcCc6IHNlcnZpY2VFbGVtZW50LnBvc2l0aW9uLnksXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWxlZnQnOiBzZXJ2aWNlRWxlbWVudC5wb3NpdGlvbi54LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXJvdGF0aW9uJzogc2VydmljZUVsZW1lbnQucm90YXRpb24sXG4gICAgICAgICAgfSl9XG4gICAgICAgICAgY2xhc3M9XCJzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgbmFtZT0ke3NlcnZpY2VFbGVtZW50Lmljb24gPz8gbm90aGluZ31cbiAgICAgICAgICByb2xlPVwiaW1nXCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPlxuICAgICAgICAke3RoaXMuX3BvcG92ZXIodHJpZ2dlcklkLCB0aXRsZURlc2NyaXB0aW9uKX1cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFuYWdlcyB0aGUgc2VsZWN0ZWQgcGxhY2UgZXZlbnQgdHJpZ2dlcmVkIGZyb20gdGhlIHBsYWNlXG4gICAqIEVhY2ggc2VsZWN0aW9uIGVtaXRzIGFuIGFycmF5IG9mIGFsbCBzZWxlY3RlZCBwbGFjZXNcbiAgICogQHBhcmFtIHNlbGVjdFBsYWNlRXZlbnRcbiAgICovXG4gIHByaXZhdGUgX29uU2VsZWN0UGxhY2Uoc2VsZWN0UGxhY2VFdmVudDogQ3VzdG9tRXZlbnQ8UGxhY2VTZWxlY3Rpb24+KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRQbGFjZSA9IHNlbGVjdFBsYWNlRXZlbnQuZGV0YWlsO1xuICAgIC8vIFdlIGhhdmUgdG8gc2V0IHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayB0byB0cnVlLCB0byBwcmV2ZW50IGF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIG5ldyBmb2N1c2VkIHBsYWNlXG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSB0cnVlO1xuICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcmV2ZW50UGxhY2VDbGljaykge1xuICAgICAgLy8gQWRkIHBsYWNlIHRvIHBsYWNlIGNvbGxlY3Rpb25cbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoc2VsZWN0ZWRQbGFjZSk7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChzZWxlY3RlZFBsYWNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9vblNlbGVjdE5hdkNvYWNoKGV2ZW50OiBDdXN0b21FdmVudDxudW1iZXI+KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWROYXZDb2FjaEluZGV4ID0gZXZlbnQuZGV0YWlsO1xuXG4gICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IHRydWU7XG5cbiAgICBpZiAoc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSBudWxsICYmIHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleCk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5hdkNvYWNoSW5kZXggPT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9XG5cbiAgICAvL2Nsb3NlIGFsbCBvcGVuZWQgcG9wb3ZlcnNcbiAgICB0aGlzLl9jbG9zZVBvcG92ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uRm9jdXNOYXZDb2FjaCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrKSB7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpO1xuICAgIH1cblxuICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBvcG92ZXIgZm9yIGV4dHJhIHNlcnZpY2UgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHRyaWdnZXJJZFxuICAgKiBAcGFyYW0gcG9wb3ZlckNvbnRlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX3BvcG92ZXIoXG4gICAgdHJpZ2dlcklkOiBzdHJpbmcsXG4gICAgcG9wb3ZlckNvbnRlbnQ6IHN0cmluZyB8IG51bGwgfCB0eXBlb2Ygbm90aGluZyxcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNiYi1wb3BvdmVyIHRyaWdnZXI9XCIke3RyaWdnZXJJZH1cIiBob3Zlci10cmlnZ2VyPVwiXCI+XG4gICAgICAgIDxwIGNsYXNzPVwic2JiLXRleHQtcyBzYmItc3ItcG9wb3ZlclwiPiR7cG9wb3ZlckNvbnRlbnR9PC9wPlxuICAgICAgPC9zYmItcG9wb3Zlcj5cbiAgICBgO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXIgdG8gY2xvc2UgYWxsIG9wZW5lZCBwb3BvdmVycyAobm9ybWFsbHkgb25seSBvbmUgaXMgb3BlbmVkIGF0IGEgdGltZSlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2Nsb3NlUG9wb3ZlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgID8ucXVlcnlTZWxlY3RvckFsbDxTYmJQb3BvdmVyRWxlbWVudD4oJ3NiYi1wb3BvdmVyOnN0YXRlKHN0YXRlLW9wZW5lZCknKVxuICAgICAgLmZvckVhY2goKHBvcG92ZXIpID0+IHBvcG92ZXIuY2xvc2UoKSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXREZXNjcmlwdGlvblRhYmxlQ29hY2goY29hY2hJdGVtOiBDb2FjaEl0ZW0pOiBzdHJpbmcge1xuICAgIC8vc2hvdyBkaWZmZXJlbnQgdGFibGUgY2FwdGlvbiBmb3Igc2NyZWVucmVhZGVyIGlmIGl0IGlzIGEgbG9jb21vdGl2ZVxuICAgIGlmIChjb2FjaEl0ZW0udHlwZSA9PT0gJ0xPQ09NT1RJVkVfQ09BQ0gnKSB7XG4gICAgICByZXR1cm4gZ2V0STE4blNlYXRSZXNlcnZhdGlvbignQ09BQ0hfTE9DT01PVElWRScsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpO1xuICAgIH1cblxuICAgIGlmICghY29hY2hJdGVtLnBsYWNlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZ2V0STE4blNlYXRSZXNlcnZhdGlvbignQ09BQ0hfQkxPQ0tFRF9UQUJMRV9DQVBUSU9OJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCwgW1xuICAgICAgICBjb2FjaEl0ZW0uaWQsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBsZXQgdGFibGVDb2FjaERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29uc3QgYXJlYURlc2NyaXB0aW9ucyA9IHRoaXMuX2dldFRpdGxlRGVzY3JpcHRpb25MaXN0U3RyaW5nKGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHMhKTtcbiAgICBjb25zdCBzZXJ2aWNlRGVzY3JpcHRpb25zID0gdGhpcy5fZ2V0VGl0bGVEZXNjcmlwdGlvbkxpc3RTdHJpbmcoY29hY2hJdGVtLnNlcnZpY2VFbGVtZW50cyEpO1xuXG4gICAgdGFibGVDb2FjaERlc2NyaXB0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbignQ09BQ0hfVEFCTEVfQ0FQVElPTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsIFtcbiAgICAgIGNvYWNoSXRlbS5pZCxcbiAgICBdKTtcblxuICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICAvLyBFeHBhbmRzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHNlYXRzIGFuZCBiaWN5Y2xlIHNwYWNlcyBhcyBpbmZvXG4gICAgICBjb25zdCBmcmVlUGxhY2VzID0gdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKGNvYWNoSXRlbS5wbGFjZXMpO1xuICAgICAgY29uc3QgZnJlZVBsYWNlc1R4dCA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgICdDT0FDSF9BVkFJTEFCTEVfTlVNQkVSX09GX1BMQUNFUycsXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICAgIFtmcmVlUGxhY2VzLnNlYXRzLCBmcmVlUGxhY2VzLmJpY3ljbGVzXSxcbiAgICAgICk7XG4gICAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gPSB0YWJsZUNvYWNoRGVzY3JpcHRpb24uY29uY2F0KCcuICcpLmNvbmNhdChmcmVlUGxhY2VzVHh0KS5jb25jYXQoJy4gJyk7XG4gICAgfVxuXG4gICAgaWYgKCEhYXJlYURlc2NyaXB0aW9ucyB8fCAhIXNlcnZpY2VEZXNjcmlwdGlvbnMpIHtcbiAgICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiArPVxuICAgICAgICAnLiAnICsgZ2V0STE4blNlYXRSZXNlcnZhdGlvbignQ09BQ0hfQVZBSUxBQkxFX1NFUlZJQ0VTJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCkgKyAnOiAnO1xuICAgICAgdGFibGVDb2FjaERlc2NyaXB0aW9uICs9IHNlcnZpY2VEZXNjcmlwdGlvbnMgKyAnLCAnICsgYXJlYURlc2NyaXB0aW9ucyArICcuJztcbiAgICB9XG4gICAgcmV0dXJuIHRhYmxlQ29hY2hEZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFRpdGxlRGVzY3JpcHRpb25MaXN0U3RyaW5nKGRlc2NyaXB0aW9uc0VsZW1lbnRzOiBCYXNlRWxlbWVudFtdKTogc3RyaW5nIHtcbiAgICBjb25zdCB1bmlxdWVEZXNjcmlwdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICByZXR1cm4gZGVzY3JpcHRpb25zRWxlbWVudHNcbiAgICAgID8ubWFwKChkZXNjcmlwdGlvbkVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgaWNvbiA9IGRlc2NyaXB0aW9uRWxlbWVudC5pY29uO1xuICAgICAgICBpZiAoIWljb24pIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uQWxyZWFkeUV4aXN0ID0gdW5pcXVlRGVzY3JpcHRpb25zLmluZGV4T2YoaWNvbikgPiAtMTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5pY29uISxcbiAgICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpc1ZhbGlkRGVzY3JpcHRpb24gPVxuICAgICAgICAgIHRoaXMubm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMuaW5kZXhPZihpY29uKSA9PT0gLTEgJiZcbiAgICAgICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmRleE9mKGljb24pID09PSAtMTtcblxuICAgICAgICBpZiAoIWRlc2NyaXB0aW9uQWxyZWFkeUV4aXN0KSB7XG4gICAgICAgICAgdW5pcXVlRGVzY3JpcHRpb25zLnB1c2goZGVzY3JpcHRpb25FbGVtZW50Lmljb24hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISF0cmFuc2xhdGlvbiAmJiAhZGVzY3JpcHRpb25BbHJlYWR5RXhpc3QgJiYgaXNWYWxpZERlc2NyaXB0aW9uID8gdHJhbnNsYXRpb24gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGRlc2NyaXB0aW9uKSA9PiAhIWRlc2NyaXB0aW9uKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1zZWF0LXJlc2VydmF0aW9uJzogU2JiU2VhdFJlc2VydmF0aW9uRWxlbWVudDtc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
@@ -2,15 +2,15 @@ import { i as mapRawDataToSeatReservation, n as mapPlaceAndCoachToSeatReservatio
2
2
  import { mapIconToSvg } from "./seat-reservation/common/mapper/icon-mapper.js";
3
3
  import { t as svgs } from "./svgs-kDpBCto5.js";
4
4
  import { getI18nSeatReservation } from "./seat-reservation/common/translations/i18n.js";
5
- import { t as SbbSeatReservationAreaElement } from "./seat-reservation-area.component-DbeuTnXT.js";
6
- import { t as SbbSeatReservationGraphicElement } from "./seat-reservation-graphic.component-DlrHtlia.js";
5
+ import { t as SbbSeatReservationAreaElement } from "./seat-reservation-area.component-BWdrKqek.js";
6
+ import { t as SbbSeatReservationGraphicElement } from "./seat-reservation-graphic.component-CN5sWn0I.js";
7
7
  import { assetsTemplate, svgImageByOSDMCode } from "./seat-reservation/seat-reservation-graphic/seat-reservation-assets.js";
8
- import { t as SbbSeatReservationNavigationCoachElement } from "./seat-reservation-navigation-coach.component-CjoDkcVU.js";
8
+ import { t as SbbSeatReservationNavigationCoachElement } from "./seat-reservation-navigation-coach.component-tDZkXl-3.js";
9
9
  import { t as SbbSeatReservationNavigationServicesElement } from "./seat-reservation-navigation-services.component-CGel7__P.js";
10
10
  import { t as SbbSeatReservationPlaceControlElement } from "./seat-reservation-place-control.component-CM9efId7.js";
11
11
  import { t as SbbSeatReservationScopedElement } from "./seat-reservation-scoped.component-CFA_bJ3o.js";
12
12
  import { SeatReservationBaseElement } from "./seat-reservation/seat-reservation/seat-reservation-base-element.js";
13
- import { t as SbbSeatReservationElement } from "./seat-reservation.component-DFJVFmrI.js";
13
+ import { t as SbbSeatReservationElement } from "./seat-reservation.component-DyB5FVpD.js";
14
14
  import "./seat-reservation.pure.js";
15
15
  //#region src/elements-experimental/seat-reservation.ts
16
16
  /** @entrypoint */