@sbb-esta/lyne-elements-experimental 4.11.0 → 5.0.0-next
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.
- package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +15 -18
- package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +6 -11
- package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +1 -1
- package/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +1 -1
- package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +1 -1
- package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +1 -1
- package/{autocomplete-grid-cell.component-DkD9aFKc.js → autocomplete-grid-cell.component-BFzREPWp.js} +1 -2
- package/{autocomplete-grid-option.component-CtATJy7n.js → autocomplete-grid-option.component-DhmoLeEw.js} +5 -7
- package/{autocomplete-grid-row.component-6nJv5PMj.js → autocomplete-grid-row.component-BQxCxOI6.js} +1 -2
- package/autocomplete-grid.js +3 -3
- package/autocomplete-grid.pure.js +3 -3
- package/core/datetime/date-helper.js +1 -1
- package/core/timetable/access-leg-helper.js +27 -27
- package/core.js +5 -0
- package/custom-elements.json +226 -453
- package/{date-helper-CGproP5d.js → date-helper-CuMnZCsr.js} +1 -1
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.d.ts +1 -1
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +3 -6
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.d.ts +2 -2
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +3 -8
- package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.d.ts +1 -1
- package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +1 -1
- package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.d.ts +1 -1
- package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +2 -2
- package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts +1 -1
- package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +1 -1
- package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.d.ts +1 -1
- package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +1 -1
- package/development/autocomplete-grid-cell.component-Buvsof-Y.js +33 -0
- package/development/{autocomplete-grid-option.component-5mPGswUO.js → autocomplete-grid-option.component-B4SXR9_v.js} +3 -5
- package/development/{autocomplete-grid-row.component-DEm6zyHZ.js → autocomplete-grid-row.component-CY4UDuuj.js} +2 -3
- package/development/autocomplete-grid.js +3 -3
- package/development/autocomplete-grid.pure.js +3 -3
- package/development/core/datetime/date-helper.js +1 -1
- package/development/core/timetable/access-leg-helper.d.ts.map +1 -1
- package/development/core/timetable/access-leg-helper.js +3 -3
- package/development/core.d.ts +6 -0
- package/development/core.d.ts.map +1 -0
- package/development/core.js +5 -0
- package/development/{date-helper-qNdwgC9O.js → date-helper-DGz-ztQM.js} +2 -2
- package/development/journey-summary/journey-summary.component.d.ts +4 -3
- package/development/journey-summary/journey-summary.component.d.ts.map +1 -1
- package/development/journey-summary/journey-summary.component.js +1 -1
- package/development/{journey-summary.component-BZwgD4im.js → journey-summary.component-B9P1PAJv.js} +14 -12
- package/development/journey-summary.js +1 -1
- package/development/journey-summary.pure.js +1 -1
- package/development/pearl-chain/pearl-chain.component.d.ts +2 -2
- package/development/pearl-chain/pearl-chain.component.d.ts.map +1 -1
- package/development/pearl-chain/pearl-chain.component.js +1 -1
- package/development/pearl-chain-time/pearl-chain-time.component.d.ts +3 -2
- package/development/pearl-chain-time/pearl-chain-time.component.d.ts.map +1 -1
- package/development/pearl-chain-time/pearl-chain-time.component.js +1 -1
- package/development/{pearl-chain-time.component-B2_BI6E_.js → pearl-chain-time.component-DDnGnI77.js} +8 -10
- package/development/pearl-chain-time.js +1 -1
- package/development/pearl-chain-time.pure.js +1 -1
- package/development/pearl-chain-vertical/pearl-chain-vertical.component.d.ts +1 -1
- package/development/pearl-chain-vertical/pearl-chain-vertical.component.d.ts.map +1 -1
- package/development/pearl-chain-vertical/pearl-chain-vertical.component.js +1 -1
- package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.d.ts +1 -1
- package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.d.ts.map +1 -1
- package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +1 -1
- package/development/{pearl-chain-vertical-item.component-DcmH13Vb.js → pearl-chain-vertical-item.component-CRh0l20F.js} +2 -4
- package/development/pearl-chain-vertical-item.js +1 -1
- package/development/pearl-chain-vertical-item.pure.js +1 -1
- package/development/pearl-chain-vertical.component-Cmc3QXgd.js +30 -0
- package/development/pearl-chain-vertical.js +1 -1
- package/development/pearl-chain-vertical.pure.js +1 -1
- package/development/{pearl-chain.component-oQZUzsyW.js → pearl-chain.component-Dl2RvtJo.js} +3 -7
- package/development/pearl-chain.js +1 -1
- package/development/pearl-chain.pure.js +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +2 -4
- package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts +2 -0
- package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
- package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.d.ts +1 -1
- package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.d.ts +2 -1
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
- package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts +2 -1
- package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
- package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.d.ts +2 -1
- package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +1 -1
- package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts +2 -1
- package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +1 -1
- package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.d.ts +1 -1
- package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +1 -1
- package/development/{seat-reservation-area.component-DbeuTnXT.js → seat-reservation-area.component-BQEtJhk0.js} +2 -4
- package/development/{seat-reservation-graphic.component-DlrHtlia.js → seat-reservation-graphic.component-XpqxL5nq.js} +7 -7
- package/development/{seat-reservation-navigation-coach.component-CjoDkcVU.js → seat-reservation-navigation-coach.component-DRCcI2ss.js} +5 -7
- package/development/{seat-reservation-navigation-services.component-CGel7__P.js → seat-reservation-navigation-services.component-ZNm77ZG-.js} +5 -7
- package/development/{seat-reservation-place-control.component-CM9efId7.js → seat-reservation-place-control.component-QF_px_in.js} +5 -6
- package/development/{seat-reservation-scoped.component-CFA_bJ3o.js → seat-reservation-scoped.component-X-Kq0-w5.js} +2 -3
- package/development/seat-reservation.component-C-ttTPW5.js +515 -0
- package/development/seat-reservation.js +9 -10
- package/development/seat-reservation.pure.d.ts +0 -1
- package/development/seat-reservation.pure.d.ts.map +1 -1
- package/development/seat-reservation.pure.js +8 -9
- package/development/timetable-duration/timetable-duration.component.d.ts +1 -1
- package/development/timetable-duration/timetable-duration.component.d.ts.map +1 -1
- package/development/timetable-duration/timetable-duration.component.js +1 -1
- package/development/timetable-duration.component-2JBYobDt.js +96 -0
- package/development/timetable-duration.js +1 -1
- package/development/timetable-duration.pure.js +1 -1
- package/development/timetable-row/timetable-row.component.d.ts +3 -2
- package/development/timetable-row/timetable-row.component.d.ts.map +1 -1
- package/development/timetable-row/timetable-row.component.js +1 -1
- package/development/timetable-row.component-Binmks-o.js +732 -0
- package/development/timetable-row.js +1 -1
- package/development/timetable-row.pure.js +1 -1
- package/journey-summary/journey-summary.component.js +1 -1
- package/{journey-summary.component-OFYXlkzg.js → journey-summary.component-C7WPKx8k.js} +56 -54
- package/journey-summary.js +1 -1
- package/journey-summary.pure.js +1 -1
- package/package.json +6 -81
- package/pearl-chain/pearl-chain.component.js +1 -1
- package/pearl-chain-time/pearl-chain-time.component.js +1 -1
- package/{pearl-chain-time.component-CNKsGfIp.js → pearl-chain-time.component-awU4lFdO.js} +41 -43
- package/pearl-chain-time.js +1 -1
- package/pearl-chain-time.pure.js +1 -1
- package/pearl-chain-vertical/pearl-chain-vertical.component.js +1 -1
- package/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +1 -1
- package/{pearl-chain-vertical-item.component-BUqZ-3Ay.js → pearl-chain-vertical-item.component-BynmUBXa.js} +3 -5
- package/pearl-chain-vertical-item.js +1 -1
- package/pearl-chain-vertical-item.pure.js +1 -1
- package/{pearl-chain-vertical.component-Df9CvRxo.js → pearl-chain-vertical.component-Lx47SlJU.js} +1 -2
- package/pearl-chain-vertical.js +1 -1
- package/pearl-chain-vertical.pure.js +1 -1
- package/{pearl-chain.component-CpISVoAu.js → pearl-chain.component-BAtmfmpA.js} +22 -26
- package/pearl-chain.js +1 -1
- package/pearl-chain.pure.js +1 -1
- package/seat-reservation/seat-reservation/seat-reservation-base-element.js +5 -7
- package/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
- package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
- package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
- package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
- package/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +1 -1
- package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +1 -1
- package/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +1 -1
- package/{seat-reservation-area.component-CtYawDjE.js → seat-reservation-area.component-CVc6uuMG.js} +3 -5
- package/{seat-reservation-graphic.component-Cm_pVxaB.js → seat-reservation-graphic.component-Dzkv9tyR.js} +26 -26
- package/{seat-reservation-navigation-coach.component-sug9IBTH.js → seat-reservation-navigation-coach.component-CGfmiQJq.js} +51 -56
- package/{seat-reservation-navigation-services.component-C9dDYD_M.js → seat-reservation-navigation-services.component-DQviLWvy.js} +28 -33
- package/{seat-reservation-place-control.component-CE7d9M2b.js → seat-reservation-place-control.component-BYJi6aYS.js} +43 -47
- package/{seat-reservation-scoped.component-DVyP2JGE.js → seat-reservation-scoped.component-CdB7HYzl.js} +1 -2
- package/{seat-reservation.component-DajC6fqU.js → seat-reservation.component-DBtJhrR_.js} +115 -107
- package/seat-reservation.js +10 -11
- package/seat-reservation.pure.js +9 -10
- package/timetable-duration/timetable-duration.component.js +1 -1
- package/{timetable-duration.component-BnJA8wSb.js → timetable-duration.component-PmvoOKVw.js} +6 -10
- package/timetable-duration.js +1 -1
- package/timetable-duration.pure.js +1 -1
- package/timetable-row/timetable-row.component.js +1 -1
- package/{timetable-row.component-Cd_7Pu_E.js → timetable-row.component-BnmrhD2d.js} +119 -116
- package/timetable-row.js +1 -1
- package/timetable-row.pure.js +1 -1
- package/autocomplete-grid/autocomplete-grid-button.js +0 -4
- package/autocomplete-grid/autocomplete-grid-cell.js +0 -4
- package/autocomplete-grid/autocomplete-grid-optgroup.js +0 -4
- package/autocomplete-grid/autocomplete-grid-option.js +0 -4
- package/autocomplete-grid/autocomplete-grid-row.js +0 -4
- package/autocomplete-grid/autocomplete-grid.js +0 -4
- package/core/datetime.js +0 -2
- package/core/timetable.js +0 -4
- package/development/autocomplete-grid/autocomplete-grid-button.d.ts +0 -2
- package/development/autocomplete-grid/autocomplete-grid-button.d.ts.map +0 -1
- package/development/autocomplete-grid/autocomplete-grid-button.js +0 -10
- package/development/autocomplete-grid/autocomplete-grid-cell.d.ts +0 -2
- package/development/autocomplete-grid/autocomplete-grid-cell.d.ts.map +0 -1
- package/development/autocomplete-grid/autocomplete-grid-cell.js +0 -10
- package/development/autocomplete-grid/autocomplete-grid-optgroup.d.ts +0 -2
- package/development/autocomplete-grid/autocomplete-grid-optgroup.d.ts.map +0 -1
- package/development/autocomplete-grid/autocomplete-grid-optgroup.js +0 -10
- package/development/autocomplete-grid/autocomplete-grid-option.d.ts +0 -2
- package/development/autocomplete-grid/autocomplete-grid-option.d.ts.map +0 -1
- package/development/autocomplete-grid/autocomplete-grid-option.js +0 -10
- package/development/autocomplete-grid/autocomplete-grid-row.d.ts +0 -2
- package/development/autocomplete-grid/autocomplete-grid-row.d.ts.map +0 -1
- package/development/autocomplete-grid/autocomplete-grid-row.js +0 -10
- package/development/autocomplete-grid/autocomplete-grid.d.ts +0 -2
- package/development/autocomplete-grid/autocomplete-grid.d.ts.map +0 -1
- package/development/autocomplete-grid/autocomplete-grid.js +0 -10
- package/development/autocomplete-grid-cell.component-BxkWGaX0.js +0 -34
- package/development/core/datetime.d.ts +0 -3
- package/development/core/datetime.d.ts.map +0 -1
- package/development/core/datetime.js +0 -2
- package/development/core/timetable.d.ts +0 -5
- package/development/core/timetable.d.ts.map +0 -1
- package/development/core/timetable.js +0 -4
- package/development/pearl-chain-vertical.component-CpcNFl-x.js +0 -31
- package/development/seat-reservation/common.d.ts +0 -6
- package/development/seat-reservation/common.d.ts.map +0 -1
- package/development/seat-reservation/common.js +0 -12
- package/development/seat-reservation/seat-reservation-area.d.ts +0 -2
- package/development/seat-reservation/seat-reservation-area.d.ts.map +0 -1
- package/development/seat-reservation/seat-reservation-area.js +0 -10
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.d.ts +0 -9
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.d.ts.map +0 -1
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +0 -306
- package/development/seat-reservation/seat-reservation-graphic.d.ts +0 -2
- package/development/seat-reservation/seat-reservation-graphic.d.ts.map +0 -1
- package/development/seat-reservation/seat-reservation-graphic.js +0 -10
- package/development/seat-reservation/seat-reservation-navigation-coach.d.ts +0 -2
- package/development/seat-reservation/seat-reservation-navigation-coach.d.ts.map +0 -1
- package/development/seat-reservation/seat-reservation-navigation-coach.js +0 -10
- package/development/seat-reservation/seat-reservation-navigation-services.d.ts +0 -2
- package/development/seat-reservation/seat-reservation-navigation-services.d.ts.map +0 -1
- package/development/seat-reservation/seat-reservation-navigation-services.js +0 -10
- package/development/seat-reservation/seat-reservation-place-control.d.ts +0 -2
- package/development/seat-reservation/seat-reservation-place-control.d.ts.map +0 -1
- package/development/seat-reservation/seat-reservation-place-control.js +0 -10
- package/development/seat-reservation/seat-reservation-scoped.d.ts +0 -2
- package/development/seat-reservation/seat-reservation-scoped.d.ts.map +0 -1
- package/development/seat-reservation/seat-reservation-scoped.js +0 -10
- package/development/seat-reservation/seat-reservation.d.ts +0 -3
- package/development/seat-reservation/seat-reservation.d.ts.map +0 -1
- package/development/seat-reservation/seat-reservation.js +0 -11
- package/development/seat-reservation.component-DFJVFmrI.js +0 -510
- package/development/timetable-duration.component-BhFlqYbV.js +0 -100
- package/development/timetable-row.component-Dko8laRT.js +0 -729
- package/seat-reservation/common.js +0 -9
- package/seat-reservation/seat-reservation-area.js +0 -4
- package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +0 -291
- package/seat-reservation/seat-reservation-graphic.js +0 -4
- package/seat-reservation/seat-reservation-navigation-coach.js +0 -4
- package/seat-reservation/seat-reservation-navigation-services.js +0 -4
- package/seat-reservation/seat-reservation-place-control.js +0 -4
- package/seat-reservation/seat-reservation-scoped.js +0 -4
- package/seat-reservation/seat-reservation.js +0 -5
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
import { SeatReservationBaseElement } from "./seat-reservation/seat-reservation/seat-reservation-base-element.js";
|
|
2
|
+
import { SbbSecondaryButtonElement } from "@sbb-esta/lyne-elements/button.pure.js";
|
|
3
|
+
import { SbbLanguageController, SbbScreenReaderOnlyElement, boxSizingStyles } from "@sbb-esta/lyne-elements/core.js";
|
|
4
|
+
import { html, isServer, nothing, unsafeCSS } from "lit";
|
|
5
|
+
import { styleMap } from "lit/directives/style-map.js";
|
|
6
|
+
import { classMap } from "lit/directives/class-map.js";
|
|
7
|
+
import { getI18nSeatReservation } from "./seat-reservation/common/translations.js";
|
|
8
|
+
import { SbbSeatReservationGraphicElement } from "./seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js";
|
|
9
|
+
import { SbbPopoverElement } from "@sbb-esta/lyne-elements/popover.pure.js";
|
|
10
|
+
import { repeat } from "lit/directives/repeat.js";
|
|
11
|
+
import { SbbSeatReservationAreaElement } from "./seat-reservation/seat-reservation-area/seat-reservation-area.component.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
|
+
//#region src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.scss?inline
|
|
16
|
+
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}";
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.component.ts
|
|
19
|
+
/**
|
|
20
|
+
* Main component for the seat reservation.
|
|
21
|
+
*
|
|
22
|
+
*/
|
|
23
|
+
var SbbSeatReservationElement = class extends SeatReservationBaseElement {
|
|
24
|
+
constructor() {
|
|
25
|
+
super(...arguments);
|
|
26
|
+
this._language = new SbbLanguageController(this);
|
|
27
|
+
this._notFixedRotatableAreaIcons = ["ENTRY_EXIT"];
|
|
28
|
+
}
|
|
29
|
+
static {
|
|
30
|
+
this.elementName = "sbb-seat-reservation";
|
|
31
|
+
}
|
|
32
|
+
static {
|
|
33
|
+
this.elementDependencies = [
|
|
34
|
+
SbbSecondaryButtonElement,
|
|
35
|
+
SbbScreenReaderOnlyElement,
|
|
36
|
+
SbbPopoverElement,
|
|
37
|
+
SbbSeatReservationAreaElement,
|
|
38
|
+
SbbSeatReservationGraphicElement,
|
|
39
|
+
SbbSeatReservationPlaceControlElement,
|
|
40
|
+
SbbSeatReservationNavigationCoachElement,
|
|
41
|
+
SbbSeatReservationScopedElement
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
static {
|
|
45
|
+
this.styles = [boxSizingStyles, unsafeCSS(seat_reservation_default)];
|
|
46
|
+
}
|
|
47
|
+
willUpdate(changedProperties) {
|
|
48
|
+
super.willUpdate(changedProperties);
|
|
49
|
+
if (changedProperties.has("hasNavigation")) if (this.hasNavigation) this.shadowRoot?.querySelectorAll("table").forEach((table) => table.removeAttribute("tabindex"));
|
|
50
|
+
else this.shadowRoot?.querySelectorAll("table").forEach((table) => table.setAttribute("tabindex", "0"));
|
|
51
|
+
}
|
|
52
|
+
firstUpdated(changedProperties) {
|
|
53
|
+
super.firstUpdated(changedProperties);
|
|
54
|
+
this.updateComplete.then(() => {
|
|
55
|
+
this.initNavigationSelectionByScrollEvent();
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
render() {
|
|
59
|
+
this._initVehicleSeatReservationConstruction();
|
|
60
|
+
return this._coachesHtmlTemplate || null;
|
|
61
|
+
}
|
|
62
|
+
_initVehicleSeatReservationConstruction() {
|
|
63
|
+
this._coachesHtmlTemplate = html`
|
|
64
|
+
${this._renderTravelDirection()}
|
|
65
|
+
<div class="sbb-sr__component">
|
|
66
|
+
${this._renderNavigation()}
|
|
67
|
+
<div
|
|
68
|
+
class="sbb-sr__wrapper-coach-decks"
|
|
69
|
+
@keydown=${(evt) => this.keyboardSeatmapEventHandling(evt)}
|
|
70
|
+
>
|
|
71
|
+
<div class="sbb-sr__wrapper-deck-labels">${this._renderDeckLabels()}</div>
|
|
72
|
+
<div
|
|
73
|
+
@scroll=${() => this.coachAreaScrollend()}
|
|
74
|
+
id="sbb-sr__wrapper-scrollarea"
|
|
75
|
+
class="sbb-sr__wrapper-scrollarea"
|
|
76
|
+
tabindex="-1"
|
|
77
|
+
>
|
|
78
|
+
<div id="sbb-sr__parent-area" class="sbb-sr__parent">
|
|
79
|
+
<ul
|
|
80
|
+
class="${classMap({
|
|
81
|
+
"sbb-sr__list-decks": true,
|
|
82
|
+
"sbb-sr__list-decks--gap": this.hasMultipleDecks
|
|
83
|
+
})}"
|
|
84
|
+
>
|
|
85
|
+
${this.seatReservations?.map((seatReservation, coachDeckIndex) => {
|
|
86
|
+
return html`<li class="sbb-sr__list-item-deck">
|
|
87
|
+
<ul class="sbb-sr__list-coaches" role="presentation">
|
|
88
|
+
${this._renderCoaches(seatReservation, coachDeckIndex)}
|
|
89
|
+
</ul>
|
|
90
|
+
</li>`;
|
|
91
|
+
})}
|
|
92
|
+
</ul>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
`;
|
|
98
|
+
}
|
|
99
|
+
_renderDeckLabels() {
|
|
100
|
+
if (!this.hasMultipleDecks) return null;
|
|
101
|
+
return this.seatReservations.map((seatReservation) => {
|
|
102
|
+
return html`<b aria-hidden="true">${getI18nSeatReservation(seatReservation.deckCoachLevel, this._language.current)}</b>`;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
_renderNavigationControlButton(btnDirection) {
|
|
106
|
+
if (!this.hasNavigation || !this.seatReservations) return null;
|
|
107
|
+
const btnNavigationDirectionId = btnDirection == "DIRECTION_RIGHT" ? "sbb-sr-navigation__wrapper-button-direction--right" : "sbb-sr-navigation__wrapper-button-direction--left";
|
|
108
|
+
const btnIcon = btnDirection == "DIRECTION_RIGHT" ? "chevron-small-right-small" : "chevron-small-left-small";
|
|
109
|
+
const btnAriaDescription = btnDirection == "DIRECTION_RIGHT" ? getI18nSeatReservation("SEAT_RESERVATION_END", this._language.current) : getI18nSeatReservation("SEAT_RESERVATION_BEGIN", this._language.current);
|
|
110
|
+
let btnDisabled = true;
|
|
111
|
+
if (btnDirection == "DIRECTION_LEFT" && this.selectedCoachIndex > 0) btnDisabled = false;
|
|
112
|
+
else if (btnDirection == "DIRECTION_RIGHT" && this.selectedCoachIndex < this.coachItemDetailsElements.length - 1) btnDisabled = false;
|
|
113
|
+
return html`<div class="sbb-sr-navigation__wrapper-button-direction">
|
|
114
|
+
<sbb-secondary-button
|
|
115
|
+
@click="${() => this.navigateByDirectionBtn(btnDirection)}"
|
|
116
|
+
@focus="${() => this.onFocusNavDirectionButton()}"
|
|
117
|
+
id="${btnNavigationDirectionId}"
|
|
118
|
+
class="sbb-sr__navigation-control-button"
|
|
119
|
+
size="m"
|
|
120
|
+
icon-name="${btnIcon}"
|
|
121
|
+
type="button"
|
|
122
|
+
aria-label="${btnAriaDescription}"
|
|
123
|
+
role="button"
|
|
124
|
+
.disabledInteractive="${btnDisabled || nothing}"
|
|
125
|
+
.disabled="${btnDisabled || nothing}"
|
|
126
|
+
></sbb-secondary-button>
|
|
127
|
+
</div>`;
|
|
128
|
+
}
|
|
129
|
+
_renderTravelDirection() {
|
|
130
|
+
if (!this.travelDirection || this.travelDirection === "NONE") return null;
|
|
131
|
+
const labelText = getI18nSeatReservation("SEAT_RESERVATION_TRAVEL_DIRECTION", this._language.current);
|
|
132
|
+
return html`<div class="sbb-sr-travel-direction-wrapper">
|
|
133
|
+
<div class="sbb-sr__travel-direction--arrow">
|
|
134
|
+
<sbb-icon slot="icon" name="${`arrow-${this.alignVertical ? this.travelDirection === "RIGHT" ? "down" : "up" : this.travelDirection === "RIGHT" ? "right" : "left"}-small`}"></sbb-icon>
|
|
135
|
+
</div>
|
|
136
|
+
<div class="sbb-sr__travel-direction--label">${labelText}</div>
|
|
137
|
+
</div>`;
|
|
138
|
+
}
|
|
139
|
+
_renderNavigation() {
|
|
140
|
+
if (isServer || !this.hasNavigation || !this.seatReservations) return null;
|
|
141
|
+
return html`<div class="sbb-sr-navigation-wrapper">
|
|
142
|
+
<nav id="sbb-sr-navigation" class="sbb-sr-navigation">
|
|
143
|
+
${this._renderNavigationControlButton("DIRECTION_LEFT")}
|
|
144
|
+
<ul
|
|
145
|
+
id="sbb-sr__navigation-list-coaches"
|
|
146
|
+
class="sbb-sr-navigation__list-coaches"
|
|
147
|
+
aria-label="${getI18nSeatReservation("SEAT_RESERVATION_NAVIGATION", this._language.current)}"
|
|
148
|
+
>
|
|
149
|
+
${this.coachItemDetailsElements.map((coachItemDetails, index) => {
|
|
150
|
+
return html`<li>
|
|
151
|
+
<sbb-seat-reservation-navigation-coach
|
|
152
|
+
@selectcoach=${(event) => this._onSelectNavCoach(event)}
|
|
153
|
+
@focuscoach=${() => this._onFocusNavCoach()}
|
|
154
|
+
@keyup=${(evt) => this.onKeyNavigationNavCoachButton(evt, index)}
|
|
155
|
+
index="${index}"
|
|
156
|
+
.selected=${this.selectedCoachIndex === index}
|
|
157
|
+
.focused=${this.focusedCoachIndex === index}
|
|
158
|
+
.hovered=${this.hoveredCoachIndex === index}
|
|
159
|
+
.nativeFocusActive=${this.hasSeatReservationNativeFocus}
|
|
160
|
+
.coachItemDetails="${coachItemDetails}"
|
|
161
|
+
?vertical="${this.alignVertical}"
|
|
162
|
+
?showTitleInfo="${this.showTitleInfo}"
|
|
163
|
+
>
|
|
164
|
+
</sbb-seat-reservation-navigation-coach>
|
|
165
|
+
</li>`;
|
|
166
|
+
})}
|
|
167
|
+
</ul>
|
|
168
|
+
${this._renderNavigationControlButton("DIRECTION_RIGHT")}
|
|
169
|
+
</nav>
|
|
170
|
+
</div>`;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
*
|
|
174
|
+
* @returns
|
|
175
|
+
* @param seatReservation
|
|
176
|
+
* @param coachDeckIndex
|
|
177
|
+
*/
|
|
178
|
+
_renderCoaches(seatReservation, coachDeckIndex) {
|
|
179
|
+
const coaches = JSON.parse(JSON.stringify(seatReservation?.coachItems));
|
|
180
|
+
if (!coaches || isServer) return null;
|
|
181
|
+
return coaches.map((coachItem, coachIndex) => {
|
|
182
|
+
return html`
|
|
183
|
+
<li class="sbb-sr__item-coach">
|
|
184
|
+
${this._renderCoachElement(coachItem, coachIndex, coachDeckIndex, seatReservation.deckCoachIndex)}
|
|
185
|
+
</li>
|
|
186
|
+
`;
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
_renderCoachElement(coachItem, coachIndex, coachDeckIndex, placeCoachDeckIndex) {
|
|
190
|
+
const calculatedCoachDimension = this.getCalculatedDimension(coachItem.dimension);
|
|
191
|
+
const descriptionTableCoachWithServices = this._getDescriptionTableCoach(coachItem);
|
|
192
|
+
return html`<sbb-seat-reservation-scoped
|
|
193
|
+
style=${styleMap({
|
|
194
|
+
"--sbb-seat-reservation-scoped-width": calculatedCoachDimension.w,
|
|
195
|
+
"--sbb-seat-reservation-scoped-height": calculatedCoachDimension.h
|
|
196
|
+
})}
|
|
197
|
+
>
|
|
198
|
+
${this._getRenderedCoachBorders(coachItem, coachIndex)}
|
|
199
|
+
${this._getRenderedGraphicalElements(coachItem.graphicElements || [], coachItem.dimension, coachIndex, coachDeckIndex)}
|
|
200
|
+
${this._getRenderedServiceElements(coachIndex, coachDeckIndex, coachItem.serviceElements)}
|
|
201
|
+
|
|
202
|
+
<table
|
|
203
|
+
@focus=${() => this.onFocusTableCoachAndPreselectPlace(coachIndex)}
|
|
204
|
+
id="sbb-sr-coach-${coachIndex}"
|
|
205
|
+
class="sbb-sr-coach-wrapper__table"
|
|
206
|
+
aria-describedby="sbb-sr-coach-caption-${coachIndex}"
|
|
207
|
+
tabindex="-1"
|
|
208
|
+
>
|
|
209
|
+
<caption id="sbb-sr-coach-caption-${coachIndex}" tabindex="-1">
|
|
210
|
+
<sbb-screen-reader-only>${descriptionTableCoachWithServices}</sbb-screen-reader-only>
|
|
211
|
+
</caption>
|
|
212
|
+
${this._getRenderedRowPlaces(coachItem, coachIndex, coachDeckIndex, placeCoachDeckIndex)}
|
|
213
|
+
</table>
|
|
214
|
+
</sbb-seat-reservation-scoped>`;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* @returns Returns the border graphic (COACH_BORDER_MIDDLE) of a coach with calculated border gap and coach width,
|
|
218
|
+
* depending on whether the coach is with a driver area or without.
|
|
219
|
+
*/
|
|
220
|
+
_getRenderedCoachBorders(coachItem, coachIndex) {
|
|
221
|
+
if (!coachItem.graphicElements) return null;
|
|
222
|
+
const COACH_PASSAGE_WIDTH = 1;
|
|
223
|
+
const driverArea = this.coachItemDetailsElements[coachIndex]?.driverAreaElements?.driverArea;
|
|
224
|
+
const driverAreaNoVerticalWall = this.coachItemDetailsElements[coachIndex]?.driverAreaElements?.driverAreaNoVerticalWall;
|
|
225
|
+
let borderWidth = driverArea ? coachItem.dimension.w - driverArea.dimension.w - COACH_PASSAGE_WIDTH : coachItem.dimension.w - COACH_PASSAGE_WIDTH * 2;
|
|
226
|
+
borderWidth *= this.baseGridSize;
|
|
227
|
+
const borderHeight = (coachItem.dimension.h + this.coachBorderOffset * 2) * this.baseGridSize;
|
|
228
|
+
let borderOffsetX = driverArea && driverArea.position.x === 0 ? driverArea?.dimension.w * this.baseGridSize : this.baseGridSize;
|
|
229
|
+
if (driverAreaNoVerticalWall) {
|
|
230
|
+
borderWidth = this.getCalculatedDimension(coachItem.dimension).w - 2 * (driverAreaNoVerticalWall.dimension.w * this.baseGridSize);
|
|
231
|
+
borderOffsetX = driverAreaNoVerticalWall.dimension.w * this.baseGridSize;
|
|
232
|
+
}
|
|
233
|
+
const currentCoachOverlappingInfo = this.overHangingElementInformation.find((el) => el.coachId === coachItem.id);
|
|
234
|
+
if (currentCoachOverlappingInfo?.overhangingPlaces || currentCoachOverlappingInfo?.overhangingGraphicAreas) {
|
|
235
|
+
borderWidth += 2 * this.baseGridSize;
|
|
236
|
+
borderOffsetX = 0;
|
|
237
|
+
}
|
|
238
|
+
return html`
|
|
239
|
+
<sbb-seat-reservation-graphic
|
|
240
|
+
class="${classMap({ "sbb-sr-coach-has-overhanging-elements": currentCoachOverlappingInfo?.overhangingPlaces || currentCoachOverlappingInfo?.overhangingGraphicAreas || false })}"
|
|
241
|
+
style=${styleMap({
|
|
242
|
+
"--sbb-seat-reservation-graphic-width": borderWidth,
|
|
243
|
+
"--sbb-seat-reservation-graphic-height": borderHeight,
|
|
244
|
+
"--sbb-seat-reservation-graphic-top": this.coachBorderPadding * -1,
|
|
245
|
+
"--sbb-seat-reservation-graphic-left": borderOffsetX,
|
|
246
|
+
"--sbb-seat-reservation-graphic-position": "absolute"
|
|
247
|
+
})}
|
|
248
|
+
name="COACH_BORDER_MIDDLE"
|
|
249
|
+
?stretch=${true}
|
|
250
|
+
role="presentation"
|
|
251
|
+
></sbb-seat-reservation-graphic>
|
|
252
|
+
`;
|
|
253
|
+
}
|
|
254
|
+
_getRenderedRowPlaces(coach, coachIndex, coachDeckIndex, placeCoachDeckIndex) {
|
|
255
|
+
if (!coach.places) return null;
|
|
256
|
+
const tableRowPlaces = {};
|
|
257
|
+
for (const place of coach.places) if (!tableRowPlaces[place.position.y]) tableRowPlaces[place.position.y] = [place];
|
|
258
|
+
else tableRowPlaces[place.position.y].push(place);
|
|
259
|
+
return Object.values(tableRowPlaces).map((rowPlaces, index) => {
|
|
260
|
+
return html`
|
|
261
|
+
<tr id="row-${coachIndex}-${rowPlaces[0].position.y}" data-row-index=${index}>
|
|
262
|
+
${this._getRenderedColumnPlaces(rowPlaces, coachIndex, coachDeckIndex, placeCoachDeckIndex)}
|
|
263
|
+
</tr>
|
|
264
|
+
`;
|
|
265
|
+
}).flatMap((rowTemplate) => rowTemplate);
|
|
266
|
+
}
|
|
267
|
+
_getRenderedColumnPlaces(places, coachIndex, deckIndex, placeCoachDeckIndex) {
|
|
268
|
+
places.sort((placeA, placeB) => Number(placeA.position.x) - Number(placeB.position.x));
|
|
269
|
+
const trackPlaceId = coachIndex + "-" + placeCoachDeckIndex;
|
|
270
|
+
return html`${repeat(places, (place) => trackPlaceId + "-" + place.number, (place, index) => {
|
|
271
|
+
const calculatedDimension = this.getCalculatedDimension(place.dimension);
|
|
272
|
+
const calculatedPosition = this.getCalculatedPosition(place.position);
|
|
273
|
+
const rotation = place.rotation || 0;
|
|
274
|
+
const textRotation = this.alignVertical ? -90 : 0;
|
|
275
|
+
const placeId = this.getPlaceElementId(deckIndex, coachIndex, place.number);
|
|
276
|
+
return html`
|
|
277
|
+
<td
|
|
278
|
+
id="cell-${deckIndex}-${coachIndex}-${place.position.y}-${index}"
|
|
279
|
+
class="graphical-element"
|
|
280
|
+
>
|
|
281
|
+
<sbb-seat-reservation-place-control
|
|
282
|
+
style=${styleMap({
|
|
283
|
+
"--sbb-seat-reservation-place-control-text-scale-value": Math.min(calculatedDimension.w, calculatedDimension.h),
|
|
284
|
+
"--sbb-seat-reservation-place-control-width": calculatedDimension.w,
|
|
285
|
+
"--sbb-seat-reservation-place-control-height": calculatedDimension.h,
|
|
286
|
+
"--sbb-seat-reservation-place-control-top": calculatedPosition.y,
|
|
287
|
+
"--sbb-seat-reservation-place-control-left": calculatedPosition.x,
|
|
288
|
+
"--sbb-seat-reservation-place-control-rotation": rotation,
|
|
289
|
+
"--sbb-seat-reservation-place-control-text-rotation": textRotation
|
|
290
|
+
})}
|
|
291
|
+
@selectplace=${(selectPlaceEvent) => this._onSelectPlace(selectPlaceEvent)}
|
|
292
|
+
exportparts="sbb-sr-place-part"
|
|
293
|
+
id=${placeId}
|
|
294
|
+
class="seat-reservation-place-control"
|
|
295
|
+
text=${place.number}
|
|
296
|
+
type=${place.type}
|
|
297
|
+
state=${place.state}
|
|
298
|
+
travel-direction=${this.travelDirection}
|
|
299
|
+
coach-index=${coachIndex}
|
|
300
|
+
deck-index=${placeCoachDeckIndex}
|
|
301
|
+
data-deck-index=${deckIndex}
|
|
302
|
+
.propertyIds=${place.propertyIds}
|
|
303
|
+
.preventClick=${this.preventPlaceClick}
|
|
304
|
+
?showTitleInfo="${this.showTitleInfo}"
|
|
305
|
+
></sbb-seat-reservation-place-control>
|
|
306
|
+
</td>
|
|
307
|
+
`;
|
|
308
|
+
})}`;
|
|
309
|
+
}
|
|
310
|
+
_getRenderedGraphicalElements(graphicalElements, coachDimension, coachIndex, coachDeckIndex) {
|
|
311
|
+
if (!graphicalElements) return null;
|
|
312
|
+
return graphicalElements?.map((graphicalElement) => {
|
|
313
|
+
const icon = graphicalElement.icon ?? "";
|
|
314
|
+
const elementRotation = graphicalElement.rotation || 0;
|
|
315
|
+
const isNotFixedRotationGraphicalElement = this._notFixedRotatableAreaIcons.indexOf(graphicalElement.icon) === -1;
|
|
316
|
+
const elementFixedRotation = this.alignVertical && isNotFixedRotationGraphicalElement ? elementRotation - 90 : elementRotation;
|
|
317
|
+
if (this.notAreaElements.findIndex((notAreaElement) => notAreaElement === icon) > -1) return this._getRenderElementWithoutArea(graphicalElement, elementRotation, coachDimension);
|
|
318
|
+
return this._getRenderElementWithArea(graphicalElement, elementFixedRotation, coachDimension, coachIndex, coachDeckIndex);
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* creates a rendered element with an area component
|
|
323
|
+
* @param graphicalElement
|
|
324
|
+
* @param rotation
|
|
325
|
+
* @param coachDimension
|
|
326
|
+
* @param coachIndex used to generate a unique id for the popover trigger
|
|
327
|
+
* @param coachDeckIndex used to generate a unique id
|
|
328
|
+
* @private
|
|
329
|
+
*/
|
|
330
|
+
_getRenderElementWithArea(graphicalElement, rotation, coachDimension, coachIndex, coachDeckIndex) {
|
|
331
|
+
const isNotTableGraphic = graphicalElement.icon?.indexOf("TABLE") === -1;
|
|
332
|
+
const areaProperty = graphicalElement.icon && isNotTableGraphic ? graphicalElement.icon : null;
|
|
333
|
+
const stretchHeight = this.isElementDirectlyOnBorder(graphicalElement, coachDimension) && areaProperty !== "ENTRY_EXIT";
|
|
334
|
+
const ariaLabelForArea = graphicalElement.icon ? getI18nSeatReservation(graphicalElement.icon, this._language.current) : nothing;
|
|
335
|
+
const calculatedDimension = this.getCalculatedDimension(graphicalElement.dimension, coachDimension, true, stretchHeight);
|
|
336
|
+
const calculatedPosition = this.getCalculatedPosition(graphicalElement.position, graphicalElement.dimension, coachDimension, true);
|
|
337
|
+
const triggerId = `popover-trigger-${coachDeckIndex}-${coachIndex}-${calculatedPosition.x}-${calculatedPosition.y}`;
|
|
338
|
+
let elementMounting = "free";
|
|
339
|
+
if (graphicalElement.position.y === this.coachBorderOffset * -1) elementMounting = "upper-border";
|
|
340
|
+
else if (graphicalElement.position.y + graphicalElement.dimension.h === coachDimension.h + this.coachBorderOffset) elementMounting = "lower-border";
|
|
341
|
+
if (elementMounting !== "free") {
|
|
342
|
+
calculatedPosition.y += elementMounting === "upper-border" ? 2 : 1;
|
|
343
|
+
calculatedDimension.h -= 3;
|
|
344
|
+
}
|
|
345
|
+
return html`
|
|
346
|
+
<sbb-seat-reservation-area
|
|
347
|
+
id="${triggerId}"
|
|
348
|
+
class="${classMap({ "sbb-seat-reservation-area--cursor-pointer": areaProperty !== null })}"
|
|
349
|
+
style=${styleMap({
|
|
350
|
+
"--sbb-seat-reservation-area-width": calculatedDimension.w,
|
|
351
|
+
"--sbb-seat-reservation-area-height": calculatedDimension.h,
|
|
352
|
+
"--sbb-seat-reservation-area-top": calculatedPosition.y,
|
|
353
|
+
"--sbb-seat-reservation-area-left": calculatedPosition.x
|
|
354
|
+
})}
|
|
355
|
+
mounting=${elementMounting}
|
|
356
|
+
background="dark"
|
|
357
|
+
aria-hidden="true"
|
|
358
|
+
>
|
|
359
|
+
${areaProperty ? html`
|
|
360
|
+
<sbb-seat-reservation-graphic
|
|
361
|
+
style=${styleMap({
|
|
362
|
+
"--sbb-seat-reservation-graphic-max-width": this.globalAreaIconDim.w,
|
|
363
|
+
"--sbb-seat-reservation-graphic-max-height": this.globalAreaIconDim.h,
|
|
364
|
+
"--sbb-seat-reservation-graphic-width": calculatedDimension.w,
|
|
365
|
+
"--sbb-seat-reservation-graphic-height": calculatedDimension.h,
|
|
366
|
+
"--sbb-seat-reservation-graphic-rotation": rotation,
|
|
367
|
+
"--sbb-seat-reservation-graphic-padding-percent": areaProperty !== "ENTRY_EXIT" ? this.globalAreaIconPadding : 1
|
|
368
|
+
})}
|
|
369
|
+
name=${areaProperty}
|
|
370
|
+
role="img"
|
|
371
|
+
aria-hidden="true"
|
|
372
|
+
class="sbb-sr-graphic__dimension--square-dim"
|
|
373
|
+
></sbb-seat-reservation-graphic>
|
|
374
|
+
` : nothing}
|
|
375
|
+
</sbb-seat-reservation-area>
|
|
376
|
+
${areaProperty ? this._popover(triggerId, ariaLabelForArea) : nothing}
|
|
377
|
+
`;
|
|
378
|
+
}
|
|
379
|
+
_getRenderElementWithoutArea(graphicalElement, rotation, coachDimension) {
|
|
380
|
+
const calculatedDimension = this.getCalculatedDimension(graphicalElement.dimension, coachDimension);
|
|
381
|
+
const calculatedPosition = this.getCalculatedPosition(graphicalElement.position, graphicalElement.dimension, coachDimension);
|
|
382
|
+
const icon = graphicalElement.icon && graphicalElement.icon.endsWith("DRIVER_AREA") ? graphicalElement.icon?.concat("_", this.seatReservations[this.currSelectedDeckIndex].vehicleType) : graphicalElement.icon;
|
|
383
|
+
return html` <sbb-seat-reservation-graphic
|
|
384
|
+
style=${styleMap({
|
|
385
|
+
"--sbb-seat-reservation-graphic-width": calculatedDimension.w,
|
|
386
|
+
"--sbb-seat-reservation-graphic-height": calculatedDimension.h,
|
|
387
|
+
"--sbb-seat-reservation-graphic-top": calculatedPosition.y,
|
|
388
|
+
"--sbb-seat-reservation-graphic-left": calculatedPosition.x,
|
|
389
|
+
"--sbb-seat-reservation-graphic-position": "absolute",
|
|
390
|
+
"--sbb-seat-reservation-graphic-rotation": rotation
|
|
391
|
+
})}
|
|
392
|
+
name=${icon ?? nothing}
|
|
393
|
+
aria-hidden="true"
|
|
394
|
+
?stretch=${true}
|
|
395
|
+
></sbb-seat-reservation-graphic>`;
|
|
396
|
+
}
|
|
397
|
+
_getRenderedServiceElements(coachIndex, coachDeckIndex, serviceElements) {
|
|
398
|
+
if (!serviceElements) return null;
|
|
399
|
+
return serviceElements?.map((serviceElement) => {
|
|
400
|
+
const titleDescription = serviceElement.icon ? getI18nSeatReservation(serviceElement.icon, this._language.current) : null;
|
|
401
|
+
const calculatedDimension = this.getCalculatedDimension(serviceElement.dimension);
|
|
402
|
+
const calculatedPosition = this.getCalculatedPosition(serviceElement.position);
|
|
403
|
+
const elementRotation = serviceElement.rotation || 0;
|
|
404
|
+
const elementFixedRotation = this.alignVertical ? elementRotation - 90 : elementRotation;
|
|
405
|
+
const triggerId = `popover-trigger-${coachDeckIndex}-${coachIndex}-${calculatedPosition.x}-${calculatedPosition.y}`;
|
|
406
|
+
return html`
|
|
407
|
+
<sbb-seat-reservation-graphic
|
|
408
|
+
id="${triggerId}"
|
|
409
|
+
style=${styleMap({
|
|
410
|
+
"--sbb-seat-reservation-graphic-width": calculatedDimension.w,
|
|
411
|
+
"--sbb-seat-reservation-graphic-height": calculatedDimension.h,
|
|
412
|
+
"--sbb-seat-reservation-graphic-top": calculatedPosition.y,
|
|
413
|
+
"--sbb-seat-reservation-graphic-left": calculatedPosition.x,
|
|
414
|
+
"--sbb-seat-reservation-graphic-position": "absolute",
|
|
415
|
+
"--sbb-seat-reservation-graphic-rotation": elementFixedRotation
|
|
416
|
+
})}
|
|
417
|
+
class="sbb-seat-reservation-graphic--cursor-pointer"
|
|
418
|
+
name=${serviceElement.icon ?? nothing}
|
|
419
|
+
role="img"
|
|
420
|
+
aria-hidden="true"
|
|
421
|
+
></sbb-seat-reservation-graphic>
|
|
422
|
+
${this._popover(triggerId, titleDescription)}
|
|
423
|
+
`;
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Manages the selected place event triggered from the place
|
|
428
|
+
* Each selection emits an array of all selected places
|
|
429
|
+
* @param selectPlaceEvent
|
|
430
|
+
*/
|
|
431
|
+
_onSelectPlace(selectPlaceEvent) {
|
|
432
|
+
const selectedPlace = selectPlaceEvent.detail;
|
|
433
|
+
this.preventCoachScrollByPlaceClick = true;
|
|
434
|
+
this.isCoachGridFocusable = false;
|
|
435
|
+
this.focusedCoachIndex = -1;
|
|
436
|
+
if (!this.hasSeatReservationNativeFocus) this.hasSeatReservationNativeFocus = true;
|
|
437
|
+
if (!this.preventPlaceClick) {
|
|
438
|
+
this.updateSelectedSeatReservationPlaces(selectedPlace);
|
|
439
|
+
this.updateCurrentSelectedPlaceInCoach(selectedPlace);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
_onSelectNavCoach(event) {
|
|
443
|
+
const selectedNavCoachIndex = event.detail;
|
|
444
|
+
this.isKeyboardNavigation = false;
|
|
445
|
+
this.preventCoachScrollByPlaceClick = false;
|
|
446
|
+
this.hasSeatReservationNativeFocus = true;
|
|
447
|
+
if (selectedNavCoachIndex !== null && selectedNavCoachIndex !== this.currSelectedCoachIndex) {
|
|
448
|
+
this.unfocusPlaceElement();
|
|
449
|
+
this.scrollToSelectedNavCoach(selectedNavCoachIndex);
|
|
450
|
+
} else if (selectedNavCoachIndex === this.currSelectedCoachIndex) {
|
|
451
|
+
this.updateCurrentSelectedCoach();
|
|
452
|
+
this.preselectPlaceInCoach();
|
|
453
|
+
}
|
|
454
|
+
this._closePopover();
|
|
455
|
+
}
|
|
456
|
+
_onFocusNavCoach() {
|
|
457
|
+
if (!this.preventCoachScrollByPlaceClick) this.preselectPlaceInCoach();
|
|
458
|
+
else this.focusPlaceElement(this.currSelectedPlace);
|
|
459
|
+
this.isAutoScrolling = false;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Creates a popover for extra service information
|
|
463
|
+
* @param triggerId
|
|
464
|
+
* @param popoverContent
|
|
465
|
+
* @private
|
|
466
|
+
*/
|
|
467
|
+
_popover(triggerId, popoverContent) {
|
|
468
|
+
return html`
|
|
469
|
+
<sbb-popover trigger="${triggerId}" hover-trigger="">
|
|
470
|
+
<p class="sbb-text-s sbb-sr-popover">${popoverContent}</p>
|
|
471
|
+
</sbb-popover>
|
|
472
|
+
`;
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* trigger to close all opened popovers (normally only one is opened at a time)
|
|
476
|
+
* @private
|
|
477
|
+
*/
|
|
478
|
+
_closePopover() {
|
|
479
|
+
this.shadowRoot?.querySelectorAll("sbb-popover:is(:state(state-opened),[state--state-opened])").forEach((popover) => popover.close());
|
|
480
|
+
}
|
|
481
|
+
_getDescriptionTableCoach(coachItem) {
|
|
482
|
+
if (coachItem.type === "LOCOMOTIVE_COACH") return getI18nSeatReservation("COACH_LOCOMOTIVE", this._language.current);
|
|
483
|
+
if (!coachItem.places?.length) return getI18nSeatReservation("COACH_BLOCKED_TABLE_CAPTION", this._language.current, [coachItem.id]);
|
|
484
|
+
let tableCoachDescription;
|
|
485
|
+
const areaDescriptions = this._getTitleDescriptionListString(coachItem.graphicElements);
|
|
486
|
+
const serviceDescriptions = this._getTitleDescriptionListString(coachItem.serviceElements);
|
|
487
|
+
tableCoachDescription = getI18nSeatReservation("COACH_TABLE_CAPTION", this._language.current, [coachItem.id]);
|
|
488
|
+
if (!this.hasNavigation) {
|
|
489
|
+
const freePlaces = this.getAvailableFreePlacesNumFromCoach(coachItem.places);
|
|
490
|
+
const freePlacesTxt = getI18nSeatReservation("COACH_AVAILABLE_NUMBER_OF_PLACES", this._language.current, [freePlaces.seats, freePlaces.bicycles]);
|
|
491
|
+
tableCoachDescription = tableCoachDescription.concat(". ").concat(freePlacesTxt).concat(". ");
|
|
492
|
+
}
|
|
493
|
+
if (!!areaDescriptions || !!serviceDescriptions) {
|
|
494
|
+
tableCoachDescription += ". " + getI18nSeatReservation("COACH_AVAILABLE_SERVICES", this._language.current) + ": ";
|
|
495
|
+
tableCoachDescription += serviceDescriptions + ", " + areaDescriptions + ".";
|
|
496
|
+
}
|
|
497
|
+
return tableCoachDescription;
|
|
498
|
+
}
|
|
499
|
+
_getTitleDescriptionListString(descriptionsElements) {
|
|
500
|
+
const uniqueDescriptions = [];
|
|
501
|
+
return descriptionsElements?.map((descriptionElement) => {
|
|
502
|
+
const icon = descriptionElement.icon;
|
|
503
|
+
if (!icon) return null;
|
|
504
|
+
const descriptionAlreadyExist = uniqueDescriptions.indexOf(icon) > -1;
|
|
505
|
+
const translation = getI18nSeatReservation(descriptionElement.icon, this._language.current);
|
|
506
|
+
const isValidDescription = this._notFixedRotatableAreaIcons.indexOf(icon) === -1 && this.notAreaElements.indexOf(icon) === -1;
|
|
507
|
+
if (!descriptionAlreadyExist) uniqueDescriptions.push(descriptionElement.icon);
|
|
508
|
+
return !!translation && !descriptionAlreadyExist && isValidDescription ? translation : null;
|
|
509
|
+
}).filter((description) => !!description).join(", ");
|
|
510
|
+
}
|
|
511
|
+
};
|
|
512
|
+
//#endregion
|
|
513
|
+
export { SbbSeatReservationElement as t };
|
|
514
|
+
|
|
515
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi5jb21wb25lbnQtQy10dFRQVzUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24uY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5AdXNlICcuLi9jb21tb24vc3R5bGVzL3NlYXQtcmVzZXJ2YXRpb24tbWl4aW5zJyBhcyBzYmItc3ItbWl4aW5zO1xuQHVzZSAnLi4vY29tbW9uL3N0eWxlcy9zZWF0LXJlc2VydmF0aW9uLWZ1bmN0aW9ucycgYXMgc2JiLXNyLWZ1bmN0aW9ucztcblxuLy8gTWF4aW11bSByZXNwb25zaXZlIG5hdmlnYXRpb24gd2lkdGgsIGNvbnNpc3RzIG9mIHRoZSBtYXhpbXVtIG5hdmlnYXRpb24gZXh0ZW50IG1pbnVzIDJ4IG5hdiBkaXJlY3Rpb24gYnV0dG9ucyA5NnB4IGFuZCA4cHggcGFkZGluZy5cbiRtYXgtY29hY2gtbmF2aWdhdGlvbi13aWR0aDogY2FsYyg5NjBweCAtIDk2cHggLSA4cHgpO1xuJHNjcm9sbGJhci1oZWlnaHQ6IDE2cHg7XG5cbjpob3N0IHtcbiAgLy8gTm90ZTogVGhlIHVzZSBvZiBweCBpcyBpbnRlbnRpb25hbCBoZXJlLCBiZWNhdXNlIG1hbnkgd2lkdGhzL2hlaWdodHMsIHJvdGF0aW9ucywgc2NhbGVzLCBldGMuIGRlcGVuZHMgb24gdGhpcy5cbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemU6IDE2cHg7XG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0OiAwO1xuICAtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWRlY2tzOiAxO1xuXG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgOjpwYXJ0KGNvYWNoLWZsb29yKSB7XG4gICAgZmlsbDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMik7XG5cbiAgICAvLyBJbiBIaWdoIENvbnRyYXN0IE1vZGUgd2Ugc2V0IGZsb29yIGNvbG9yIHRvIHRyYW5zcGFyZW50XG4gICAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgICAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8vIHJvdGF0ZXMgdGhlIERPTS1wYXJ0IFwiY29hY2gtZmxvb3JcIiBieSAxODAgZGVncmVlcyBpZiB0aGUgaG9zdCBpcyBpbiBSVEwgbW9kZS5cbkBpbmNsdWRlIHNiYi1zci1taXhpbnMucm90YXRlLWRvbS1wYXJ0KGNvYWNoLWZsb29yKTtcblxuW3BvcG92ZXJdOndoZXJlKHNiYi1wb3BvdmVyKSB7XG4gIEBpbmNsdWRlIHNiYi5wb3BvdmVyLXJlc2V0O1xuXG4gIC5zYmItc3ItcG9wb3ZlciB7XG4gICAgbWFyZ2luLWJsb2NrOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBTVEFSVCAtIFZlcnRpY2FsIG1vZGVcbjpob3N0KFthbGlnbi12ZXJ0aWNhbF0pIHtcbiAgJGNvYWNoLW5hdmlnYXRpb24tcGFkZGluZzogNTtcbiAgJGNvYWNoLXNjcm9sbGJhci13aWR0aDogMjQ7XG4gICRjb2FjaC1ncmlkLXdpZHRoOiBjYWxjKHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCkgKyAkY29hY2gtc2Nyb2xsYmFyLXdpZHRoKTtcblxuICAuc2JiLXNyX19jb21wb25lbnQge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjIpO1xuICAgIGhlaWdodDogaW5oZXJpdDtcblxuICAgIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogc21hbGwpIHtcbiAgICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNTQpO1xuICAgIH1cblxuICAgIG5hdi5zYmItc3ItbmF2aWdhdGlvbixcbiAgICB1bC5zYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgbmF2LnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgICAgIHBhZGRpbmc6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KSAwO1xuXG4gICAgICAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMSk7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgcm90YXRlOiA5MGRlZztcblxuICAgICAgICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oLTEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVsLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICAgICAgICBtYXgtd2lkdGg6IGluaXRpYWw7XG5cbiAgICAgICAgLy8gUGFkZGluZyBuZWVkcyB0byB2aXN1YWwgZm9jdXMtdmlzaWJsZSBzdHlsZSBmb3IgbmF2IGJ1dHRvbiBpbnNpZGUgb3ZlcmZsb3cgY29udGVudCxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZvY3VzLXZpc2libGUgc3R5bGUgaXMgY3V0dGVkLlxuICAgICAgICBwYWRkaW5nOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtbmF2aWdhdGlvbi1wYWRkaW5nKTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbiBzY3JvbGw7XG5cbiAgICAgICAgLy8gaW4gdmVydGljYWwgbW9kZSwgdGhlIGxpIG11c3QgYmUgZmxleGVkOyBvdGhlcndpc2UgaXQgd291bGQgY2FsY3VsYXRlIHRoZSB3cm9uZyBoZWlnaHRcbiAgICAgICAgLy8gZHVlIHRvIHVzZXJhZ2VudCBzdHlsZSBzZXQgdG8gXCJsaXN0LWl0ZW1cIiBmb3IgZGlzcGxheVxuICAgICAgICBsaSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBMQUJFTE1VTFRJUExFIERFQ0tTIC0gTEFCRUxTXG4gIC5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAuc2JiLXNyX193cmFwcGVyLWRlY2stbGFiZWxzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtZ3JpZC13aWR0aCk7XG4gICAgICBoZWlnaHQ6IGluaXRpYWw7XG5cbiAgICAgIGIge1xuICAgICAgICBpbmxpbmUtc2l6ZTogY2FsYyg1MCUgLSBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNikpO1xuICAgICAgICBibG9jay1zaXplOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KTtcbiAgICAgICAgcm90YXRlOiBpbml0aWFsO1xuICAgICAgICB3cml0aW5nLW1vZGU6IGluaXRpYWw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVkVSVElDQUwgTU9ERSAtIFNFQVRNQVAgU0NST0xMIEFSRUFcbiAgLnNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oJGNvYWNoLWdyaWQtd2lkdGgpO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuIHNjcm9sbDtcblxuICAgIC5zYmItc3JfX3BhcmVudCB7XG4gICAgICByb3RhdGU6IDkwZGVnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBUUkFWRUwtRElSRUNUSU9OXG4gIC5zYmItc3ItdHJhdmVsLWRpcmVjdGlvbi13cmFwcGVyIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0odmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0KSk7XG4gICAgbWFyZ2luLWJsb2NrLXN0YXJ0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBFTkQgLSBWZXJ0aWNhbCBtb2RlXG5cbi5zYmItc3ItbmF2aWdhdGlvbiB7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMyk7XG59XG5cbi5zYmItc3ItbmF2aWdhdGlvbiAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDIpO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICB0b3A6IDA7XG4gIH1cbn1cblxuLnNiYi1zcl9fY29tcG9uZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiBjYWxjKHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDY0KSAtICRzY3JvbGxiYXItaGVpZ2h0KTtcbn1cblxuLy8gVFJBVkVMIERJUkVDVElPTlxuLnNiYi1zci10cmF2ZWwtZGlyZWN0aW9uLXdyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sdW1uLWdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIG1hcmdpbi1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCkgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tc2JiLXRleHQtZm9udC1zaXplLXMpO1xuXG4gIC5zYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWFycm93IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cbn1cblxuLy8gTkFWSUdBVElPTiBORVdcbi5zYmItc3ItbmF2aWdhdGlvbi13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nLWlubGluZTogMTZweDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcbiAgQGluY2x1ZGUgc2JiLnNjcm9sbGJhcjtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgcGFkZGluZzogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNikgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNSkgMDtcbiAgbWF4LXdpZHRoOiAkbWF4LWNvYWNoLW5hdmlnYXRpb24td2lkdGg7XG5cbiAgLy8gU2V0IHNiYiBzY3JvbGxiYXIgdHJhbnNwYXJlbnQgYnkgZGVmYXVsdFxuICAtLXNiYi1zY3JvbGxiYXItY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIG92ZXJmbG93OiBzY3JvbGwgaGlkZGVuO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLSBTZWF0IFJlc2VydmF0aW9uIE1haW4gTmF2aWdhdGlvbiAtIEVORCAtLS0tLS0tLS0tLS0tLS0tXG5cbi8vIC0tLS0tLS0tLS0tLS0gU2VhdCBSZXNlcnZhdGlvbiBDb2FjaGVzIC0gU1RBUlQgLS0tLS0tLS0tLS0tLS0tLS1cbi5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICBkaXNwbGF5OiBmbGV4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgLnNiYi1zcl9fd3JhcHBlci1kZWNrLWxhYmVscyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgaGVpZ2h0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSh2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQpKTtcbiAgICB3cml0aW5nLW1vZGU6IHZlcnRpY2FsLWxyO1xuXG4gICAgYiB7XG4gICAgICBoZWlnaHQ6IGNhbGMoNTAlIC0gc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpKTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICBtYXJnaW4tYmxvY2stZW5kOiAxNnB4O1xuICAgICAgcm90YXRlOiAxODBkZWc7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBsaW5lLWhlaWdodDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjApO1xuICAgIH1cbiAgfVxufVxuXG4uc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEge1xuICBAaW5jbHVkZSBzYmIuc2Nyb2xsYmFyO1xuXG4gIG92ZXJmbG93OiBzY3JvbGwgaGlkZGVuO1xuICBwYWRkaW5nLWJsb2NrOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg4KSBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNik7XG5cbiAgLnNiYi1zcl9fcGFyZW50IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB9XG59XG5cbi5zYmItc3JfX2xpc3QtZGVja3Mge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4uc2JiLXNyX19saXN0LWRlY2tzLS1nYXAge1xuICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQ4KTtcbn1cblxuLnNiYi1zcl9fbGlzdC1pdGVtLWRlY2sge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5zYmItc3JfX2xpc3QtY29hY2hlcyB7XG4gIEBpbmNsdWRlIHNiYi5saXN0LXJlc2V0O1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG59XG5cbi8vIElmIHRoZXJlIGFyZSBvdmVyaGFuZ2luZyBlbGVtZW50cyB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBnYXAgYmV0d2VlbiBjb2FjaGVzXG4uc2JiLXNyX19saXN0LWRlY2tzOmhhcyguc2JiLXNyLWNvYWNoLWhhcy1vdmVyaGFuZ2luZy1lbGVtZW50cykgLnNiYi1zcl9fbGlzdC1jb2FjaGVzIHtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg4KTtcbn1cblxuLnNiYi1zcl9faXRlbS1jb2FjaCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnNiYi1zci1jb2FjaC13cmFwcGVyX190YWJsZSB7XG4gIG91dGxpbmU6IDA7XG59XG4iLCJpbXBvcnQgeyBTYmJTZWNvbmRhcnlCdXR0b25FbGVtZW50IH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvYnV0dG9uLnB1cmUuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJFbGVtZW50VHlwZSB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUuanMnO1xuaW1wb3J0IHtcbiAgU2JiTGFuZ3VhZ2VDb250cm9sbGVyLFxuICBTYmJTY3JlZW5SZWFkZXJPbmx5RWxlbWVudCxcbiAgYm94U2l6aW5nU3R5bGVzLFxufSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlLmpzJztcbmltcG9ydCB7IFNiYlBvcG92ZXJFbGVtZW50IH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvcG9wb3Zlci5wdXJlLmpzJztcbmltcG9ydCB7IGh0bWwsIGlzU2VydmVyLCBub3RoaW5nLCB1bnNhZmVDU1MgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCwgUHJvcGVydHlWYWx1ZXMsIFRlbXBsYXRlUmVzdWx0IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBzdHlsZU1hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3N0eWxlLW1hcC5qcyc7XG5cbmltcG9ydCB7IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24gfSBmcm9tICcuLi9jb21tb24vdHJhbnNsYXRpb25zLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29hY2hJdGVtLFxuICBDb2FjaEl0ZW1EZXRhaWxzLFxuICBQbGFjZSxcbiAgRWxlbWVudERpbWVuc2lvbixcbiAgQmFzZUVsZW1lbnQsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb24sXG59IGZyb20gJy4uL2NvbW1vbi90eXBlcy50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25BcmVhRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tYXJlYS9zZWF0LXJlc2VydmF0aW9uLWFyZWEuY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvbkdyYXBoaWNFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljL3NlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uTmF2aWdhdGlvbkNvYWNoRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaC9zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2guY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25TY29wZWRFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQvc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQuY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgfSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzJztcbmltcG9ydCBzdHlsZSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24uc2Nzcz9pbmxpbmUnO1xuXG4vKipcbiAqIE1haW4gY29tcG9uZW50IGZvciB0aGUgc2VhdCByZXNlcnZhdGlvbi5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBTYmJTZWF0UmVzZXJ2YXRpb25FbGVtZW50IGV4dGVuZHMgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXNlYXQtcmVzZXJ2YXRpb24nO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGVsZW1lbnREZXBlbmRlbmNpZXM6IFNiYkVsZW1lbnRUeXBlW10gPSBbXG4gICAgU2JiU2Vjb25kYXJ5QnV0dG9uRWxlbWVudCxcbiAgICBTYmJTY3JlZW5SZWFkZXJPbmx5RWxlbWVudCxcbiAgICBTYmJQb3BvdmVyRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25BcmVhRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25HcmFwaGljRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50LFxuICAgIFNiYlNlYXRSZXNlcnZhdGlvbk5hdmlnYXRpb25Db2FjaEVsZW1lbnQsXG4gICAgU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudCxcbiAgXTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgdW5zYWZlQ1NTKHN0eWxlKV07XG5cbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9jb2FjaGVzSHRtbFRlbXBsYXRlPzogVGVtcGxhdGVSZXN1bHQ7XG5cbiAgLy8gQXJlYSBpY29ucyB0aGF0IHNob3VsZCBub3QgYmUgZml4ZWQgZHVyaW5nIHJvdGF0aW9uIHdoZW4gdmVydGljYWwgbW9kZSBpcyBzZWxlY3RlZFxuICBwcml2YXRlIF9ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucyA9IFsnRU5UUllfRVhJVCddO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGFzTmF2aWdhdGlvbicpKSB7XG4gICAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICAgID8ucXVlcnlTZWxlY3RvckFsbCgndGFibGUnKVxuICAgICAgICAgIC5mb3JFYWNoKCh0YWJsZSkgPT4gdGFibGUucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICAgID8ucXVlcnlTZWxlY3RvckFsbCgndGFibGUnKVxuICAgICAgICAgIC5mb3JFYWNoKCh0YWJsZSkgPT4gdGFibGUuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgZmlyc3QgdXBkYXRlIGlzIGNvbXBsZXRlIHRvIGluaXQgZGlmZmVyZW50IEhUTUwgZWxlbWVudCBkaW1lbnNpb25zXG4gICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgdGhpcy5faW5pdFZlaGljbGVTZWF0UmVzZXJ2YXRpb25Db25zdHJ1Y3Rpb24oKTtcbiAgICByZXR1cm4gdGhpcy5fY29hY2hlc0h0bWxUZW1wbGF0ZSB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFZlaGljbGVTZWF0UmVzZXJ2YXRpb25Db25zdHJ1Y3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fY29hY2hlc0h0bWxUZW1wbGF0ZSA9IGh0bWxgXG4gICAgICAke3RoaXMuX3JlbmRlclRyYXZlbERpcmVjdGlvbigpfVxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fY29tcG9uZW50XCI+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbigpfVxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3NcIlxuICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5rZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nKGV2dCl9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX193cmFwcGVyLWRlY2stbGFiZWxzXCI+JHt0aGlzLl9yZW5kZXJEZWNrTGFiZWxzKCl9PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgQHNjcm9sbD0keygpID0+IHRoaXMuY29hY2hBcmVhU2Nyb2xsZW5kKCl9XG4gICAgICAgICAgICBpZD1cInNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWFcIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNiYi1zcl9fcGFyZW50LWFyZWFcIiBjbGFzcz1cInNiYi1zcl9fcGFyZW50XCI+XG4gICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICAgICAnc2JiLXNyX19saXN0LWRlY2tzJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICdzYmItc3JfX2xpc3QtZGVja3MtLWdhcCc6IHRoaXMuaGFzTXVsdGlwbGVEZWNrcyxcbiAgICAgICAgICAgICAgICB9KX1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgJHt0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lm1hcChcbiAgICAgICAgICAgICAgICAgIChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8bGkgY2xhc3M9XCJzYmItc3JfX2xpc3QtaXRlbS1kZWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwic2JiLXNyX19saXN0LWNvYWNoZXNcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuX3JlbmRlckNvYWNoZXMoc2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgPC9saT5gO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckRlY2tMYWJlbHMoKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZURlY2tzKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubWFwKChzZWF0UmVzZXJ2YXRpb24pID0+IHtcbiAgICAgIGNvbnN0IGRlY2tEZXNjcmlwdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbi5kZWNrQ29hY2hMZXZlbCxcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gaHRtbGA8YiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2RlY2tEZXNjcmlwdGlvbn08L2I+YDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlck5hdmlnYXRpb25Db250cm9sQnV0dG9uKGJ0bkRpcmVjdGlvbjogc3RyaW5nKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbiB8fCAhdGhpcy5zZWF0UmVzZXJ2YXRpb25zKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBidG5OYXZpZ2F0aW9uRGlyZWN0aW9uSWQgPVxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnXG4gICAgICAgID8gJ3NiYi1zci1uYXZpZ2F0aW9uX193cmFwcGVyLWJ1dHRvbi1kaXJlY3Rpb24tLXJpZ2h0J1xuICAgICAgICA6ICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1sZWZ0JztcbiAgICBjb25zdCBidG5JY29uID1cbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyA/ICdjaGV2cm9uLXNtYWxsLXJpZ2h0LXNtYWxsJyA6ICdjaGV2cm9uLXNtYWxsLWxlZnQtc21hbGwnO1xuICAgIGNvbnN0IGJ0bkFyaWFEZXNjcmlwdGlvbiA9XG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCdcbiAgICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdTRUFUX1JFU0VSVkFUSU9OX0VORCcsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICAgIDogZ2V0STE4blNlYXRSZXNlcnZhdGlvbignU0VBVF9SRVNFUlZBVElPTl9CRUdJTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpO1xuICAgIGxldCBidG5EaXNhYmxlZCA9IHRydWU7XG5cbiAgICBpZiAoYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fTEVGVCcgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPiAwKSB7XG4gICAgICBidG5EaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCcgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4IDwgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgYnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25fX3dyYXBwZXItYnV0dG9uLWRpcmVjdGlvblwiPlxuICAgICAgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICAgIEBjbGljaz1cIiR7KCkgPT4gdGhpcy5uYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbil9XCJcbiAgICAgICAgQGZvY3VzPVwiJHsoKSA9PiB0aGlzLm9uRm9jdXNOYXZEaXJlY3Rpb25CdXR0b24oKX1cIlxuICAgICAgICBpZD1cIiR7YnRuTmF2aWdhdGlvbkRpcmVjdGlvbklkfVwiXG4gICAgICAgIGNsYXNzPVwic2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICBpY29uLW5hbWU9XCIke2J0bkljb259XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2J0bkFyaWFEZXNjcmlwdGlvbn1cIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgLmRpc2FibGVkSW50ZXJhY3RpdmU9XCIke2J0bkRpc2FibGVkIHx8IG5vdGhpbmd9XCJcbiAgICAgICAgLmRpc2FibGVkPVwiJHtidG5EaXNhYmxlZCB8fCBub3RoaW5nfVwiXG4gICAgICA+PC9zYmItc2Vjb25kYXJ5LWJ1dHRvbj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyVHJhdmVsRGlyZWN0aW9uKCk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnRyYXZlbERpcmVjdGlvbiB8fCB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ05PTkUnKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxhYmVsVGV4dCA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAnU0VBVF9SRVNFUlZBVElPTl9UUkFWRUxfRElSRUNUSU9OJyxcbiAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgKTtcblxuICAgIGNvbnN0IGFycm93RGlyZWN0aW9uID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMudHJhdmVsRGlyZWN0aW9uID09PSAnUklHSFQnXG4gICAgICAgID8gJ2Rvd24nXG4gICAgICAgIDogJ3VwJ1xuICAgICAgOiB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ1JJR0hUJ1xuICAgICAgICA/ICdyaWdodCdcbiAgICAgICAgOiAnbGVmdCc7XG5cbiAgICBjb25zdCBpY29uTmFtZSA9IGBhcnJvdy0ke2Fycm93RGlyZWN0aW9ufS1zbWFsbGA7XG5cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLXRyYXZlbC1kaXJlY3Rpb24td3JhcHBlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fdHJhdmVsLWRpcmVjdGlvbi0tYXJyb3dcIj5cbiAgICAgICAgPHNiYi1pY29uIHNsb3Q9XCJpY29uXCIgbmFtZT1cIiR7aWNvbk5hbWV9XCI+PC9zYmItaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fdHJhdmVsLWRpcmVjdGlvbi0tbGFiZWxcIj4ke2xhYmVsVGV4dH08L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTmF2aWdhdGlvbigpOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmIChpc1NlcnZlciB8fCAhdGhpcy5oYXNOYXZpZ2F0aW9uIHx8ICF0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvbi13cmFwcGVyXCI+XG4gICAgICA8bmF2IGlkPVwic2JiLXNyLW5hdmlnYXRpb25cIiBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uXCI+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oJ0RJUkVDVElPTl9MRUZUJyl9XG4gICAgICAgIDx1bFxuICAgICAgICAgIGlkPVwic2JiLXNyX19uYXZpZ2F0aW9uLWxpc3QtY29hY2hlc1wiXG4gICAgICAgICAgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiJHtnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAgICAgJ1NFQVRfUkVTRVJWQVRJT05fTkFWSUdBVElPTicsXG4gICAgICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICAgICl9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7dGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubWFwKFxuICAgICAgICAgICAgKGNvYWNoSXRlbURldGFpbHM6IENvYWNoSXRlbURldGFpbHMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPGxpPlxuICAgICAgICAgICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoXG4gICAgICAgICAgICAgICAgICBAc2VsZWN0Y29hY2g9JHsoZXZlbnQ6IEN1c3RvbUV2ZW50PG51bWJlcj4pID0+IHRoaXMuX29uU2VsZWN0TmF2Q29hY2goZXZlbnQpfVxuICAgICAgICAgICAgICAgICAgQGZvY3VzY29hY2g9JHsoKSA9PiB0aGlzLl9vbkZvY3VzTmF2Q29hY2goKX1cbiAgICAgICAgICAgICAgICAgIEBrZXl1cD0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMub25LZXlOYXZpZ2F0aW9uTmF2Q29hY2hCdXR0b24oZXZ0LCBpbmRleCl9XG4gICAgICAgICAgICAgICAgICBpbmRleD1cIiR7aW5kZXh9XCJcbiAgICAgICAgICAgICAgICAgIC5zZWxlY3RlZD0ke3RoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID09PSBpbmRleH1cbiAgICAgICAgICAgICAgICAgIC5mb2N1c2VkPSR7dGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgICAuaG92ZXJlZD0ke3RoaXMuaG92ZXJlZENvYWNoSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgICAgLm5hdGl2ZUZvY3VzQWN0aXZlPSR7dGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1c31cbiAgICAgICAgICAgICAgICAgIC5jb2FjaEl0ZW1EZXRhaWxzPVwiJHtjb2FjaEl0ZW1EZXRhaWxzfVwiXG4gICAgICAgICAgICAgICAgICA/dmVydGljYWw9XCIke3RoaXMuYWxpZ25WZXJ0aWNhbH1cIlxuICAgICAgICAgICAgICAgICAgP3Nob3dUaXRsZUluZm89XCIke3RoaXMuc2hvd1RpdGxlSW5mb31cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2g+XG4gICAgICAgICAgICAgIDwvbGk+YDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKX1cbiAgICAgICAgPC91bD5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uQ29udHJvbEJ1dHRvbignRElSRUNUSU9OX1JJR0hUJyl9XG4gICAgICA8L25hdj5cbiAgICA8L2Rpdj5gO1xuICB9XG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBAcGFyYW0gc2VhdFJlc2VydmF0aW9uXG4gICAqIEBwYXJhbSBjb2FjaERlY2tJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyQ29hY2hlcyhcbiAgICBzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgY29uc3QgY29hY2hlczogQ29hY2hJdGVtW10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtcykpO1xuXG4gICAgaWYgKCFjb2FjaGVzIHx8IGlzU2VydmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvYWNoZXMubWFwKChjb2FjaEl0ZW06IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPGxpIGNsYXNzPVwic2JiLXNyX19pdGVtLWNvYWNoXCI+XG4gICAgICAgICAgJHt0aGlzLl9yZW5kZXJDb2FjaEVsZW1lbnQoXG4gICAgICAgICAgICBjb2FjaEl0ZW0sXG4gICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgY29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoSW5kZXgsXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9saT5cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJDb2FjaEVsZW1lbnQoXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgcGxhY2VDb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgY2FsY3VsYXRlZENvYWNoRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKGNvYWNoSXRlbS5kaW1lbnNpb24pO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uVGFibGVDb2FjaFdpdGhTZXJ2aWNlcyA9IHRoaXMuX2dldERlc2NyaXB0aW9uVGFibGVDb2FjaChjb2FjaEl0ZW0pO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZFxuICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC13aWR0aCc6IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbi53LFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtaGVpZ2h0JzogY2FsY3VsYXRlZENvYWNoRGltZW5zaW9uLmgsXG4gICAgICB9KX1cbiAgICA+XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkQ29hY2hCb3JkZXJzKGNvYWNoSXRlbSwgY29hY2hJbmRleCl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkR3JhcGhpY2FsRWxlbWVudHMoXG4gICAgICAgIGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHMgfHwgW10sXG4gICAgICAgIGNvYWNoSXRlbS5kaW1lbnNpb24sXG4gICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgKX1cbiAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRTZXJ2aWNlRWxlbWVudHMoY29hY2hJbmRleCwgY29hY2hEZWNrSW5kZXgsIGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMpfVxuXG4gICAgICA8dGFibGVcbiAgICAgICAgQGZvY3VzPSR7KCkgPT4gdGhpcy5vbkZvY3VzVGFibGVDb2FjaEFuZFByZXNlbGVjdFBsYWNlKGNvYWNoSW5kZXgpfVxuICAgICAgICBpZD1cInNiYi1zci1jb2FjaC0ke2NvYWNoSW5kZXh9XCJcbiAgICAgICAgY2xhc3M9XCJzYmItc3ItY29hY2gtd3JhcHBlcl9fdGFibGVcIlxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwic2JiLXNyLWNvYWNoLWNhcHRpb24tJHtjb2FjaEluZGV4fVwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgPlxuICAgICAgICA8Y2FwdGlvbiBpZD1cInNiYi1zci1jb2FjaC1jYXB0aW9uLSR7Y29hY2hJbmRleH1cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHk+JHtkZXNjcmlwdGlvblRhYmxlQ29hY2hXaXRoU2VydmljZXN9PC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICA8L2NhcHRpb24+XG4gICAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRSb3dQbGFjZXMoY29hY2hJdGVtLCBjb2FjaEluZGV4LCBjb2FjaERlY2tJbmRleCwgcGxhY2VDb2FjaERlY2tJbmRleCl9XG4gICAgICA8L3RhYmxlPlxuICAgIDwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkPmA7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgYm9yZGVyIGdyYXBoaWMgKENPQUNIX0JPUkRFUl9NSURETEUpIG9mIGEgY29hY2ggd2l0aCBjYWxjdWxhdGVkIGJvcmRlciBnYXAgYW5kIGNvYWNoIHdpZHRoLFxuICAgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29hY2ggaXMgd2l0aCBhIGRyaXZlciBhcmVhIG9yIHdpdGhvdXQuXG4gICAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJlZENvYWNoQm9yZGVycyhcbiAgICBjb2FjaEl0ZW06IENvYWNoSXRlbSxcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCFjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IENPQUNIX1BBU1NBR0VfV0lEVEggPSAxO1xuICAgIGNvbnN0IGRyaXZlckFyZWEgPSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1tjb2FjaEluZGV4XT8uZHJpdmVyQXJlYUVsZW1lbnRzPy5kcml2ZXJBcmVhO1xuICAgIGNvbnN0IGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbCA9XG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1tjb2FjaEluZGV4XT8uZHJpdmVyQXJlYUVsZW1lbnRzPy5kcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGw7XG5cbiAgICBsZXQgYm9yZGVyV2lkdGggPSBkcml2ZXJBcmVhXG4gICAgICA/IGNvYWNoSXRlbS5kaW1lbnNpb24udyAtIGRyaXZlckFyZWEuZGltZW5zaW9uLncgLSBDT0FDSF9QQVNTQUdFX1dJRFRIXG4gICAgICA6IGNvYWNoSXRlbS5kaW1lbnNpb24udyAtIENPQUNIX1BBU1NBR0VfV0lEVEggKiAyO1xuXG4gICAgLy9tdWx0aXBseSB3aXRoIGJhc2UgZ3JpZCBzaXplIGFsd2F5cyBmb3IgYWxsIGtpbmQgb2YgYm9yZGVyV2lkdGhcbiAgICBib3JkZXJXaWR0aCAqPSB0aGlzLmJhc2VHcmlkU2l6ZTtcblxuICAgIGNvbnN0IGJvcmRlckhlaWdodCA9IChjb2FjaEl0ZW0uZGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMikgKiB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICBsZXQgYm9yZGVyT2Zmc2V0WCA9XG4gICAgICBkcml2ZXJBcmVhICYmIGRyaXZlckFyZWEucG9zaXRpb24ueCA9PT0gMFxuICAgICAgICA/IGRyaXZlckFyZWE/LmRpbWVuc2lvbi53ICogdGhpcy5iYXNlR3JpZFNpemVcbiAgICAgICAgOiB0aGlzLmJhc2VHcmlkU2l6ZTtcblxuICAgIC8vcmVjYWxjdWxhdGUgdGhlIGJvcmRlciB3aWR0aCBhbmQgb2Zmc2V0IGlmIHRoZXJlIGlzIGEgZHJpdmVyIGFyZWEgd2l0aG91dCB2ZXJ0aWNhbCB3YWxsIG9uIGJvdGggc2lkZXNcbiAgICBpZiAoZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsKSB7XG4gICAgICBjb25zdCBjb2FjaFdpZHRoID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKGNvYWNoSXRlbS5kaW1lbnNpb24pLnc7XG5cbiAgICAgIC8vcmVjYWxjdWxhdGVkIGJvcmRlcldpZHRoID0gY29hY2hXaWR0aCAtIDIgKiBkcml2ZXIgYXJlYSB3aWR0aCwgc2luY2UgdGhlIGRyaXZlciBhcmVhIGlzIG9uIGJvdGggc2lkZXNcbiAgICAgIGJvcmRlcldpZHRoID0gY29hY2hXaWR0aCAtIDIgKiAoZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsLmRpbWVuc2lvbi53ICogdGhpcy5iYXNlR3JpZFNpemUpO1xuXG4gICAgICAvL3JlY2FsY3VsYXRlZCBib3JkZXJPZmZzZXRYID0gZHJpdmVyIGFyZWEgd2lkdGgsIHNpbmNlIHRoZSBib3JkZXIgc3RhcnRzIGFmdGVyIHRoZSBkcml2ZXIgYXJlYSBvbiB0aGUgbGVmdCBzaWRlXG4gICAgICBib3JkZXJPZmZzZXRYID0gZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsLmRpbWVuc2lvbi53ICogdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudENvYWNoT3ZlcmxhcHBpbmdJbmZvID0gdGhpcy5vdmVySGFuZ2luZ0VsZW1lbnRJbmZvcm1hdGlvbi5maW5kKFxuICAgICAgKGVsKSA9PiBlbC5jb2FjaElkID09PSBjb2FjaEl0ZW0uaWQsXG4gICAgKTtcblxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBvdmVyaGFuZ2luZyBwbGFjZXMgb3IgZ3JhcGhpY2FsIGVsZW1lbnRzIHRvIGFkanVzdCB0aGUgYm9yZGVyIHdpZHRoIGFuZCBvZmZzZXQgKyBnYXBcbiAgICAvLyBXZSBkbyBub3QgZGlmZmVyZW50aWF0ZSB3aGV0aGVyIHRoZXJlIGlzIHNvbWV0aGluZyB0byBiZSBkb25lIG9uIGJvdGggc2lkZXMgYXMgdGhpcyB3b3VsZCBsZWFkIHRvIHVubmVjZXNzYXJ5XG4gICAgLy8gY29tcGxleGl0eS4gU28gaWYgdGhlcmUgaXMgc29tZXRoaW5nIG9uIG9uZSBzaWRlLCB3ZSBqdXN0IGluY3JlYXNlIHRoZSBjb2FjaC1ib3JkZXIgb24gYm90aCBzaWRlcy5cbiAgICBpZiAoXG4gICAgICBjdXJyZW50Q29hY2hPdmVybGFwcGluZ0luZm8/Lm92ZXJoYW5naW5nUGxhY2VzIHx8XG4gICAgICBjdXJyZW50Q29hY2hPdmVybGFwcGluZ0luZm8/Lm92ZXJoYW5naW5nR3JhcGhpY0FyZWFzXG4gICAgKSB7XG4gICAgICBib3JkZXJXaWR0aCArPSAyICogdGhpcy5iYXNlR3JpZFNpemU7IC8vIHdlIGluY3JlYXNlIHRoZSB3aWR0aCBieSAyIGdyaWQgc2l6ZXMgdG8gaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHByb3RydWRlZCBwbGFjZXMgb24gYm90aCBzaWRlc1xuICAgICAgYm9yZGVyT2Zmc2V0WCA9IDA7IC8vIHdlIHN0YXJ0IGF0IDAgdG8gaGF2ZSBlbm91Z2ggc3BhY2Ugb24gdGhlIGxlZnQgc2lkZSBhcyB3ZWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICdzYmItc3ItY29hY2gtaGFzLW92ZXJoYW5naW5nLWVsZW1lbnRzJzpcbiAgICAgICAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdQbGFjZXMgfHxcbiAgICAgICAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdHcmFwaGljQXJlYXMgfHxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICB9KX1cIlxuICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogYm9yZGVyV2lkdGgsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiBib3JkZXJIZWlnaHQsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAqIC0xLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbGVmdCc6IGJvcmRlck9mZnNldFgsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgIH0pfVxuICAgICAgICBuYW1lPVwiQ09BQ0hfQk9SREVSX01JRERMRVwiXG4gICAgICAgID9zdHJldGNoPSR7dHJ1ZX1cbiAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZFJvd1BsYWNlcyhcbiAgICBjb2FjaDogQ29hY2hJdGVtLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghY29hY2gucGxhY2VzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHJvd3Mgd2l0aCB0aGUgcGxhY2VzIHRvIHJlbmRlciBhIHRhYmxlXG4gICAgY29uc3QgdGFibGVSb3dQbGFjZXM6IFJlY29yZDxudW1iZXIsIFBsYWNlW10+ID0ge307XG4gICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaC5wbGFjZXMpIHtcbiAgICAgIGlmICghdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0pIHtcbiAgICAgICAgdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0gPSBbcGxhY2VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0ucHVzaChwbGFjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGFibGVSb3dQbGFjZXMpXG4gICAgICAubWFwKChyb3dQbGFjZXM6IFBsYWNlW10sIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgIDx0ciBpZD1cInJvdy0ke2NvYWNoSW5kZXh9LSR7cm93UGxhY2VzWzBdLnBvc2l0aW9uLnl9XCIgZGF0YS1yb3ctaW5kZXg9JHtpbmRleH0+XG4gICAgICAgICAgICAke3RoaXMuX2dldFJlbmRlcmVkQ29sdW1uUGxhY2VzKFxuICAgICAgICAgICAgICByb3dQbGFjZXMsXG4gICAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgICBwbGFjZUNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICBgO1xuICAgICAgfSlcbiAgICAgIC5mbGF0TWFwKChyb3dUZW1wbGF0ZSkgPT4gcm93VGVtcGxhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRDb2x1bW5QbGFjZXMoXG4gICAgcGxhY2VzOiBQbGFjZVtdLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBkZWNrSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZUNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgLy9Tb3J0cyBlYWNoIHBsYWNlIGJ5IGl0cyBhc2NlbmRpbmcgeCBjb29yZGluYXRlXG4gICAgcGxhY2VzLnNvcnQoXG4gICAgICAocGxhY2VBOiBQbGFjZSwgcGxhY2VCOiBQbGFjZSkgPT4gTnVtYmVyKHBsYWNlQS5wb3NpdGlvbi54KSAtIE51bWJlcihwbGFjZUIucG9zaXRpb24ueCksXG4gICAgKTtcblxuICAgIC8vIEZvciByZW5kZXJpbmcgdGhlIHBsYWNlcyB3aXRoaW4gYSB0ZCBlbGVtZW50LCBoZXJlIHdlIHVzZSByZXBlYXQgZGlyZWN0aXZlIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgZm9yIHJldXNpbmcgZWxlbWVudHMgKHRyYWNrIGJ5IGlkKS5cbiAgICBjb25zdCB0cmFja1BsYWNlSWQgPSBjb2FjaEluZGV4ICsgJy0nICsgcGxhY2VDb2FjaERlY2tJbmRleDtcbiAgICByZXR1cm4gaHRtbGAke3JlcGVhdChcbiAgICAgIHBsYWNlcyxcbiAgICAgIChwbGFjZSkgPT4gdHJhY2tQbGFjZUlkICsgJy0nICsgcGxhY2UubnVtYmVyLFxuICAgICAgKHBsYWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVkRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHBsYWNlLmRpbWVuc2lvbik7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKHBsYWNlLnBvc2l0aW9uKTtcbiAgICAgICAgY29uc3Qgcm90YXRpb24gPSBwbGFjZS5yb3RhdGlvbiB8fCAwO1xuICAgICAgICBjb25zdCB0ZXh0Um90YXRpb24gPSB0aGlzLmFsaWduVmVydGljYWwgPyAtOTAgOiAwO1xuICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChkZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgaWQ9XCJjZWxsLSR7ZGVja0luZGV4fS0ke2NvYWNoSW5kZXh9LSR7cGxhY2UucG9zaXRpb24ueX0tJHtpbmRleH1cIlxuICAgICAgICAgICAgY2xhc3M9XCJncmFwaGljYWwtZWxlbWVudFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2xcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10ZXh0LXNjYWxlLXZhbHVlJzogTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1yb3RhdGlvbic6IHJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtdGV4dC1yb3RhdGlvbic6IHRleHRSb3RhdGlvbixcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIEBzZWxlY3RwbGFjZT0keyhzZWxlY3RQbGFjZUV2ZW50OiBDdXN0b21FdmVudDxQbGFjZVNlbGVjdGlvbj4pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5fb25TZWxlY3RQbGFjZShzZWxlY3RQbGFjZUV2ZW50KX1cbiAgICAgICAgICAgICAgZXhwb3J0cGFydHM9XCJzYmItc3ItcGxhY2UtcGFydFwiXG4gICAgICAgICAgICAgIGlkPSR7cGxhY2VJZH1cbiAgICAgICAgICAgICAgY2xhc3M9XCJzZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2xcIlxuICAgICAgICAgICAgICB0ZXh0PSR7cGxhY2UubnVtYmVyfVxuICAgICAgICAgICAgICB0eXBlPSR7cGxhY2UudHlwZX1cbiAgICAgICAgICAgICAgc3RhdGU9JHtwbGFjZS5zdGF0ZX1cbiAgICAgICAgICAgICAgdHJhdmVsLWRpcmVjdGlvbj0ke3RoaXMudHJhdmVsRGlyZWN0aW9ufVxuICAgICAgICAgICAgICBjb2FjaC1pbmRleD0ke2NvYWNoSW5kZXh9XG4gICAgICAgICAgICAgIGRlY2staW5kZXg9JHtwbGFjZUNvYWNoRGVja0luZGV4fVxuICAgICAgICAgICAgICBkYXRhLWRlY2staW5kZXg9JHtkZWNrSW5kZXh9XG4gICAgICAgICAgICAgIC5wcm9wZXJ0eUlkcz0ke3BsYWNlLnByb3BlcnR5SWRzfVxuICAgICAgICAgICAgICAucHJldmVudENsaWNrPSR7dGhpcy5wcmV2ZW50UGxhY2VDbGlja31cbiAgICAgICAgICAgICAgP3Nob3dUaXRsZUluZm89XCIke3RoaXMuc2hvd1RpdGxlSW5mb31cIlxuICAgICAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICBgO1xuICAgICAgfSxcbiAgICApfWA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZEdyYXBoaWNhbEVsZW1lbnRzKFxuICAgIGdyYXBoaWNhbEVsZW1lbnRzOiBCYXNlRWxlbWVudFtdLFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgaWYgKCFncmFwaGljYWxFbGVtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gZ3JhcGhpY2FsRWxlbWVudHM/Lm1hcCgoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGljb24gPSBncmFwaGljYWxFbGVtZW50Lmljb24gPz8gJyc7XG4gICAgICBjb25zdCBlbGVtZW50Um90YXRpb24gPSBncmFwaGljYWxFbGVtZW50LnJvdGF0aW9uIHx8IDA7XG4gICAgICBjb25zdCBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50ID1cbiAgICAgICAgdGhpcy5fbm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMuaW5kZXhPZihncmFwaGljYWxFbGVtZW50Lmljb24hKSA9PT0gLTE7XG4gICAgICBjb25zdCBlbGVtZW50Rml4ZWRSb3RhdGlvbiA9XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCAmJiBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50XG4gICAgICAgICAgPyBlbGVtZW50Um90YXRpb24gLSA5MFxuICAgICAgICAgIDogZWxlbWVudFJvdGF0aW9uO1xuXG4gICAgICAvL2NoZWNrIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgbm90IGFuIGFyZWEgZWxlbWVudCwgc2luY2UgdGhpcyBlbGVtZW50IGlzIGRyYXduIHdpdGhvdXQgYW4gYXJlYSBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLm5vdEFyZWFFbGVtZW50cy5maW5kSW5kZXgoKG5vdEFyZWFFbGVtZW50KSA9PiBub3RBcmVhRWxlbWVudCA9PT0gaWNvbikgPiAtMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UmVuZGVyRWxlbWVudFdpdGhvdXRBcmVhKGdyYXBoaWNhbEVsZW1lbnQsIGVsZW1lbnRSb3RhdGlvbiwgY29hY2hEaW1lbnNpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2dldFJlbmRlckVsZW1lbnRXaXRoQXJlYShcbiAgICAgICAgZ3JhcGhpY2FsRWxlbWVudCxcbiAgICAgICAgZWxlbWVudEZpeGVkUm90YXRpb24sXG4gICAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlcyBhIHJlbmRlcmVkIGVsZW1lbnQgd2l0aCBhbiBhcmVhIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gZ3JhcGhpY2FsRWxlbWVudFxuICAgKiBAcGFyYW0gcm90YXRpb25cbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwYXJhbSBjb2FjaEluZGV4IHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaWQgZm9yIHRoZSBwb3BvdmVyIHRyaWdnZXJcbiAgICogQHBhcmFtIGNvYWNoRGVja0luZGV4IHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaWRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2dldFJlbmRlckVsZW1lbnRXaXRoQXJlYShcbiAgICBncmFwaGljYWxFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICByb3RhdGlvbjogbnVtYmVyLFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgLy8gZm9yIFRBQkxFLCB3ZSB1c2UgdGhlIGFyZWEgY29tcG9uZW50IGl0c2VsZiB0byBkaXNwbGF5IHRoZSB0YWJsZSBpbnN0ZWFkIG9mIHRoZSBTVkcgZ3JhcGhpYy5cbiAgICAvLyBEdWUgdG8gZGlmZmVyZW50IGhlaWdodHMgYW5kIHdpZHRocywgaXQgd291bGRuJ3Qgc2hvdyBjb3JyZWN0bHkuIFRvIGNvcnJlY3QgdGhpcywgd2Ugd291bGRcbiAgICAvLyBuZWVkIGRpZmZpY3VsdCBjYWxjdWxhdGlvbnMgZm9yIHBvc2l0aW9uLCByb3RhdGlvbiBhbmQgZGltZW5zaW9uLlxuICAgIGNvbnN0IGlzTm90VGFibGVHcmFwaGljID0gZ3JhcGhpY2FsRWxlbWVudC5pY29uPy5pbmRleE9mKCdUQUJMRScpID09PSAtMTtcbiAgICBjb25zdCBhcmVhUHJvcGVydHkgPSBncmFwaGljYWxFbGVtZW50Lmljb24gJiYgaXNOb3RUYWJsZUdyYXBoaWMgPyBncmFwaGljYWxFbGVtZW50Lmljb24gOiBudWxsO1xuICAgIGNvbnN0IHN0cmV0Y2hIZWlnaHQgPVxuICAgICAgdGhpcy5pc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKGdyYXBoaWNhbEVsZW1lbnQsIGNvYWNoRGltZW5zaW9uKSAmJlxuICAgICAgYXJlYVByb3BlcnR5ICE9PSAnRU5UUllfRVhJVCc7XG4gICAgY29uc3QgYXJpYUxhYmVsRm9yQXJlYSA9IGdyYXBoaWNhbEVsZW1lbnQuaWNvblxuICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudClcbiAgICAgIDogbm90aGluZztcblxuICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICAgdHJ1ZSxcbiAgICAgIHN0cmV0Y2hIZWlnaHQsXG4gICAgKTtcblxuICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5wb3NpdGlvbixcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQuZGltZW5zaW9uLFxuICAgICAgY29hY2hEaW1lbnNpb24sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICAvL2dlbmVyYXRlIHVuaXF1ZSBpbmRleCBudW1iZXIgZm9yIHRoZSB0cmlnZ2VyIGVsZW1lbnRcbiAgICBjb25zdCB0cmlnZ2VySWQgPSBgcG9wb3Zlci10cmlnZ2VyLSR7Y29hY2hEZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueX1gO1xuICAgIGxldCBlbGVtZW50TW91bnRpbmcgPSAnZnJlZSc7XG5cbiAgICBpZiAoZ3JhcGhpY2FsRWxlbWVudC5wb3NpdGlvbi55ID09PSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogLTEpIHtcbiAgICAgIGVsZW1lbnRNb3VudGluZyA9ICd1cHBlci1ib3JkZXInO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBncmFwaGljYWxFbGVtZW50LnBvc2l0aW9uLnkgKyBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbi5oID09PVxuICAgICAgY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXRcbiAgICApIHtcbiAgICAgIGVsZW1lbnRNb3VudGluZyA9ICdsb3dlci1ib3JkZXInO1xuICAgIH1cblxuICAgIC8vIFRJTU8tNDU4MzBcbiAgICAvLyBJZiBhcmVhIGVsZW1lbnRzIGFyZSBsb2NhdGVkIGF0IHRoZSBib3JkZXIgb2YgY29hY2gsXG4gICAgLy8gd2UgaGF2ZSB0byBtYW51YWxseSBtb2RpZnkgdGhlIHBvc2l0aW9uIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgZWxlbWVudCxcbiAgICAvLyBzbyB0aGF0IHdlIGdldCBhIGdhcCBmcm9tIHRoZSB2aXN1ZWwgY29hY2ggYm9yZGVyXG4gICAgaWYgKGVsZW1lbnRNb3VudGluZyAhPT0gJ2ZyZWUnKSB7XG4gICAgICBjYWxjdWxhdGVkUG9zaXRpb24ueSArPSBlbGVtZW50TW91bnRpbmcgPT09ICd1cHBlci1ib3JkZXInID8gMiA6IDE7XG4gICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLmggLT0gMztcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYVxuICAgICAgICBpZD1cIiR7dHJpZ2dlcklkfVwiXG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7ICdzYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLS1jdXJzb3ItcG9pbnRlcic6IGFyZWFQcm9wZXJ0eSAhPT0gbnVsbCB9KX1cIlxuICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgIH0pfVxuICAgICAgICBtb3VudGluZz0ke2VsZW1lbnRNb3VudGluZ31cbiAgICAgICAgYmFja2dyb3VuZD1cImRhcmtcIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgPlxuICAgICAgICAke2FyZWFQcm9wZXJ0eVxuICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbWF4LXdpZHRoJzogdGhpcy5nbG9iYWxBcmVhSWNvbkRpbS53LFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1tYXgtaGVpZ2h0JzogdGhpcy5nbG9iYWxBcmVhSWNvbkRpbS5oLFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IHJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wYWRkaW5nLXBlcmNlbnQnOlxuICAgICAgICAgICAgICAgICAgICBhcmVhUHJvcGVydHkgIT09ICdFTlRSWV9FWElUJyA/IHRoaXMuZ2xvYmFsQXJlYUljb25QYWRkaW5nIDogMSxcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICBuYW1lPSR7YXJlYVByb3BlcnR5fVxuICAgICAgICAgICAgICAgIHJvbGU9XCJpbWdcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzYmItc3ItZ3JhcGhpY19fZGltZW5zaW9uLS1zcXVhcmUtZGltXCJcbiAgICAgICAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICAgICAgICAgIGBcbiAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWE+XG4gICAgICAke2FyZWFQcm9wZXJ0eSA/IHRoaXMuX3BvcG92ZXIodHJpZ2dlcklkLCBhcmlhTGFiZWxGb3JBcmVhKSA6IG5vdGhpbmd9XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlckVsZW1lbnRXaXRob3V0QXJlYShcbiAgICBncmFwaGljYWxFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICByb3RhdGlvbjogbnVtYmVyLFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgY2FsY3VsYXRlZERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQuZGltZW5zaW9uLFxuICAgICAgY29hY2hEaW1lbnNpb24sXG4gICAgKTtcbiAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQucG9zaXRpb24sXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICk7XG5cbiAgICAvLyBJZiB0aGUgaWNvbiBpcyB0aGUgZHJpdmVyIGFyZWEsIHRoZW4gaGVyZSBjb25jYXQgdGhlIHZlaGljbGUgdHlwZSB0byBnZXQgdGhlIHJpZ2h0IHZlaGljbGUgY2hhc3NpcyBpY29uXG4gICAgY29uc3QgaWNvbiA9XG4gICAgICBncmFwaGljYWxFbGVtZW50Lmljb24gJiYgZ3JhcGhpY2FsRWxlbWVudC5pY29uLmVuZHNXaXRoKCdEUklWRVJfQVJFQScpXG4gICAgICAgID8gZ3JhcGhpY2FsRWxlbWVudC5pY29uPy5jb25jYXQoXG4gICAgICAgICAgICAnXycsXG4gICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLnZlaGljbGVUeXBlLFxuICAgICAgICAgIClcbiAgICAgICAgOiBncmFwaGljYWxFbGVtZW50Lmljb247XG5cbiAgICByZXR1cm4gaHRtbGAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiBjYWxjdWxhdGVkUG9zaXRpb24ueSxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXJvdGF0aW9uJzogcm90YXRpb24sXG4gICAgICB9KX1cbiAgICAgIG5hbWU9JHtpY29uID8/IG5vdGhpbmd9XG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgP3N0cmV0Y2g9JHt0cnVlfVxuICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+YDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkU2VydmljZUVsZW1lbnRzKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHNlcnZpY2VFbGVtZW50cz86IEJhc2VFbGVtZW50W10sXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIXNlcnZpY2VFbGVtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gc2VydmljZUVsZW1lbnRzPy5tYXAoKHNlcnZpY2VFbGVtZW50OiBCYXNlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgdGl0bGVEZXNjcmlwdGlvbiA9IHNlcnZpY2VFbGVtZW50Lmljb25cbiAgICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKHNlcnZpY2VFbGVtZW50Lmljb24sIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oc2VydmljZUVsZW1lbnQuZGltZW5zaW9uKTtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKHNlcnZpY2VFbGVtZW50LnBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRSb3RhdGlvbiA9IHNlcnZpY2VFbGVtZW50LnJvdGF0aW9uIHx8IDA7XG4gICAgICBjb25zdCBlbGVtZW50Rml4ZWRSb3RhdGlvbiA9IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IGVsZW1lbnRSb3RhdGlvbiAtIDkwIDogZWxlbWVudFJvdGF0aW9uO1xuXG4gICAgICAvL2dlbmVyYXRlIHVuaXF1ZSBpbmRleCBudW1iZXIgZm9yIHRoZSB0cmlnZ2VyIGVsZW1lbnRcbiAgICAgIGNvbnN0IHRyaWdnZXJJZCA9IGBwb3BvdmVyLXRyaWdnZXItJHtjb2FjaERlY2tJbmRleH0tJHtjb2FjaEluZGV4fS0ke2NhbGN1bGF0ZWRQb3NpdGlvbi54fS0ke2NhbGN1bGF0ZWRQb3NpdGlvbi55fWA7XG5cbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICAgIGlkPVwiJHt0cmlnZ2VySWR9XCJcbiAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWxlZnQnOiBjYWxjdWxhdGVkUG9zaXRpb24ueCxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IGVsZW1lbnRGaXhlZFJvdGF0aW9uLFxuICAgICAgICAgIH0pfVxuICAgICAgICAgIGNsYXNzPVwic2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy0tY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIG5hbWU9JHtzZXJ2aWNlRWxlbWVudC5pY29uID8/IG5vdGhpbmd9XG4gICAgICAgICAgcm9sZT1cImltZ1wiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICAgICAgJHt0aGlzLl9wb3BvdmVyKHRyaWdnZXJJZCwgdGl0bGVEZXNjcmlwdGlvbil9XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmFnZXMgdGhlIHNlbGVjdGVkIHBsYWNlIGV2ZW50IHRyaWdnZXJlZCBmcm9tIHRoZSBwbGFjZVxuICAgKiBFYWNoIHNlbGVjdGlvbiBlbWl0cyBhbiBhcnJheSBvZiBhbGwgc2VsZWN0ZWQgcGxhY2VzXG4gICAqIEBwYXJhbSBzZWxlY3RQbGFjZUV2ZW50XG4gICAqL1xuICBwcml2YXRlIF9vblNlbGVjdFBsYWNlKHNlbGVjdFBsYWNlRXZlbnQ6IEN1c3RvbUV2ZW50PFBsYWNlU2VsZWN0aW9uPik6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2UgPSBzZWxlY3RQbGFjZUV2ZW50LmRldGFpbDtcbiAgICAvLyBXZSBoYXZlIHRvIHNldCBwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgdG8gdHJ1ZSwgdG8gcHJldmVudCBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBuZXcgZm9jdXNlZCBwbGFjZVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIC8vIENoZWNrIGFueSBrZXlib2FyZCBldmVudCB3YXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQsXG4gICAgLy8gc28gd2UgY2FuIHNheSB0aGUgbmF0aXZlIGJyb3dzZXIgZm9jdXMgbGllcyBvbiB0aGUgY29tcG9uZW50XG4gICAgaWYgKCF0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJldmVudFBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIEFkZCBwbGFjZSB0byBwbGFjZSBjb2xsZWN0aW9uXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHNlbGVjdGVkUGxhY2UpO1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRQbGFjZUluQ29hY2goc2VsZWN0ZWRQbGFjZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25TZWxlY3ROYXZDb2FjaChldmVudDogQ3VzdG9tRXZlbnQ8bnVtYmVyPik6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkTmF2Q29hY2hJbmRleCA9IGV2ZW50LmRldGFpbDtcblxuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSB0cnVlO1xuXG4gICAgaWYgKHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gbnVsbCAmJiBzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROYXZDb2FjaEluZGV4ID09PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfVxuXG4gICAgLy9jbG9zZSBhbGwgb3BlbmVkIHBvcG92ZXJzXG4gICAgdGhpcy5fY2xvc2VQb3BvdmVyKCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkZvY3VzTmF2Q29hY2goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykge1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwb3BvdmVyIGZvciBleHRyYSBzZXJ2aWNlIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB0cmlnZ2VySWRcbiAgICogQHBhcmFtIHBvcG92ZXJDb250ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9wb3BvdmVyKFxuICAgIHRyaWdnZXJJZDogc3RyaW5nLFxuICAgIHBvcG92ZXJDb250ZW50OiBzdHJpbmcgfCBudWxsIHwgdHlwZW9mIG5vdGhpbmcsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItcG9wb3ZlciB0cmlnZ2VyPVwiJHt0cmlnZ2VySWR9XCIgaG92ZXItdHJpZ2dlcj1cIlwiPlxuICAgICAgICA8cCBjbGFzcz1cInNiYi10ZXh0LXMgc2JiLXNyLXBvcG92ZXJcIj4ke3BvcG92ZXJDb250ZW50fTwvcD5cbiAgICAgIDwvc2JiLXBvcG92ZXI+XG4gICAgYDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyIHRvIGNsb3NlIGFsbCBvcGVuZWQgcG9wb3ZlcnMgKG5vcm1hbGx5IG9ubHkgb25lIGlzIG9wZW5lZCBhdCBhIHRpbWUpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9jbG9zZVBvcG92ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGw8U2JiUG9wb3ZlckVsZW1lbnQ+KCdzYmItcG9wb3ZlcjpzdGF0ZShzdGF0ZS1vcGVuZWQpJylcbiAgICAgIC5mb3JFYWNoKChwb3BvdmVyKSA9PiBwb3BvdmVyLmNsb3NlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RGVzY3JpcHRpb25UYWJsZUNvYWNoKGNvYWNoSXRlbTogQ29hY2hJdGVtKTogc3RyaW5nIHtcbiAgICAvL3Nob3cgZGlmZmVyZW50IHRhYmxlIGNhcHRpb24gZm9yIHNjcmVlbnJlYWRlciBpZiBpdCBpcyBhIGxvY29tb3RpdmVcbiAgICBpZiAoY29hY2hJdGVtLnR5cGUgPT09ICdMT0NPTU9USVZFX0NPQUNIJykge1xuICAgICAgcmV0dXJuIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0xPQ09NT1RJVkUnLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIWNvYWNoSXRlbS5wbGFjZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0JMT0NLRURfVEFCTEVfQ0FQVElPTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsIFtcbiAgICAgICAgY29hY2hJdGVtLmlkLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgbGV0IHRhYmxlQ29hY2hEZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbnN0IGFyZWFEZXNjcmlwdGlvbnMgPSB0aGlzLl9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzISk7XG4gICAgY29uc3Qgc2VydmljZURlc2NyaXB0aW9ucyA9IHRoaXMuX2dldFRpdGxlRGVzY3JpcHRpb25MaXN0U3RyaW5nKGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMhKTtcblxuICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX1RBQkxFX0NBUFRJT04nLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LCBbXG4gICAgICBjb2FjaEl0ZW0uaWQsXG4gICAgXSk7XG5cbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgLy8gRXhwYW5kcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBzZWF0cyBhbmQgYmljeWNsZSBzcGFjZXMgYXMgaW5mb1xuICAgICAgY29uc3QgZnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaEl0ZW0ucGxhY2VzKTtcbiAgICAgIGNvbnN0IGZyZWVQbGFjZXNUeHQgPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAnQ09BQ0hfQVZBSUxBQkxFX05VTUJFUl9PRl9QTEFDRVMnLFxuICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICBbZnJlZVBsYWNlcy5zZWF0cywgZnJlZVBsYWNlcy5iaWN5Y2xlc10sXG4gICAgICApO1xuICAgICAgdGFibGVDb2FjaERlc2NyaXB0aW9uID0gdGFibGVDb2FjaERlc2NyaXB0aW9uLmNvbmNhdCgnLiAnKS5jb25jYXQoZnJlZVBsYWNlc1R4dCkuY29uY2F0KCcuICcpO1xuICAgIH1cblxuICAgIGlmICghIWFyZWFEZXNjcmlwdGlvbnMgfHwgISFzZXJ2aWNlRGVzY3JpcHRpb25zKSB7XG4gICAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gKz1cbiAgICAgICAgJy4gJyArIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0FWQUlMQUJMRV9TRVJWSUNFUycsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpICsgJzogJztcbiAgICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiArPSBzZXJ2aWNlRGVzY3JpcHRpb25zICsgJywgJyArIGFyZWFEZXNjcmlwdGlvbnMgKyAnLic7XG4gICAgfVxuICAgIHJldHVybiB0YWJsZUNvYWNoRGVzY3JpcHRpb247XG4gIH1cblxuICBwcml2YXRlIF9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhkZXNjcmlwdGlvbnNFbGVtZW50czogQmFzZUVsZW1lbnRbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgdW5pcXVlRGVzY3JpcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uc0VsZW1lbnRzXG4gICAgICA/Lm1hcCgoZGVzY3JpcHRpb25FbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGljb24gPSBkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbjtcbiAgICAgICAgaWYgKCFpY29uKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbkFscmVhZHlFeGlzdCA9IHVuaXF1ZURlc2NyaXB0aW9ucy5pbmRleE9mKGljb24pID4gLTE7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbiEsXG4gICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZERlc2NyaXB0aW9uID1cbiAgICAgICAgICB0aGlzLl9ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucy5pbmRleE9mKGljb24pID09PSAtMSAmJlxuICAgICAgICAgIHRoaXMubm90QXJlYUVsZW1lbnRzLmluZGV4T2YoaWNvbikgPT09IC0xO1xuXG4gICAgICAgIGlmICghZGVzY3JpcHRpb25BbHJlYWR5RXhpc3QpIHtcbiAgICAgICAgICB1bmlxdWVEZXNjcmlwdGlvbnMucHVzaChkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbiEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXRyYW5zbGF0aW9uICYmICFkZXNjcmlwdGlvbkFscmVhZHlFeGlzdCAmJiBpc1ZhbGlkRGVzY3JpcHRpb24gPyB0cmFuc2xhdGlvbiA6IG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZGVzY3JpcHRpb24pID0+ICEhZGVzY3JpcHRpb24pXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNlYXQtcmVzZXJ2YXRpb24nOiBTYmJTZWF0UmVzZXJ2YXRpb25FbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNxQ0EsSUFBYSw0QkFBYixjQUErQywyQkFBMEI7Q0FBekUsY0FBQTs7QUFjVSxPQUFBLFlBQVksSUFBSSxzQkFBc0IsS0FBSztBQUkzQyxPQUFBLDhCQUE4QixDQUFDLGFBQWE7OztBQWpCcEIsT0FBQSxjQUFzQjs7O0FBQy9CLE9BQUEsc0JBQXdDO0dBQzdEO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7R0FDRDs7O0FBQ3NCLE9BQUEsU0FBeUIsQ0FBQyxpQkFBaUIsVUFBVSx5QkFBTSxDQUFDOztDQVFoRSxXQUFXLG1CQUF1QztBQUNuRSxRQUFNLFdBQVcsa0JBQWtCO0FBRW5DLE1BQUksa0JBQWtCLElBQUksZ0JBQWdCLENBQ3hDLEtBQUksS0FBSyxjQUNQLE1BQUssWUFDRCxpQkFBaUIsUUFBUSxDQUMxQixTQUFTLFVBQVUsTUFBTSxnQkFBZ0IsV0FBVyxDQUFDO01BRXhELE1BQUssWUFDRCxpQkFBaUIsUUFBUSxDQUMxQixTQUFTLFVB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
|