@sbb-esta/lyne-elements-dev 5.0.0-next.1-dev.1777358786 → 5.0.0-next.1-dev.1777393579

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/core/i18n/i18n.js +103 -98
  2. package/core/styles/core.scss +15 -38
  3. package/core.css +57 -31
  4. package/core.js +22 -22
  5. package/custom-elements.json +6013 -2585
  6. package/development/core/i18n/i18n.d.ts +1 -0
  7. package/development/core/i18n/i18n.d.ts.map +1 -1
  8. package/development/core/i18n/i18n.js +8 -2
  9. package/development/core.js +2 -2
  10. package/development/train/train/train.component.d.ts +2 -5
  11. package/development/train/train/train.component.d.ts.map +1 -1
  12. package/development/train/train/train.component.js +1 -1
  13. package/development/train/train-blocked-passage/train-blocked-passage.component.d.ts +4 -3
  14. package/development/train/train-blocked-passage/train-blocked-passage.component.d.ts.map +1 -1
  15. package/development/train/train-blocked-passage/train-blocked-passage.component.js +1 -1
  16. package/development/train/train-formation/train-formation.component.d.ts +6 -2
  17. package/development/train/train-formation/train-formation.component.d.ts.map +1 -1
  18. package/development/train/train-formation/train-formation.component.js +1 -1
  19. package/development/train/train-formation-orientation-mixin.d.ts +12 -0
  20. package/development/train/train-formation-orientation-mixin.d.ts.map +1 -0
  21. package/development/train/train-formation-orientation-mixin.js +62 -0
  22. package/development/train/train-wagon/train-wagon.component.d.ts +5 -32
  23. package/development/train/train-wagon/train-wagon.component.d.ts.map +1 -1
  24. package/development/train/train-wagon/train-wagon.component.js +19 -1
  25. package/development/train/train-wagon-button/train-wagon-button.component.d.ts +18 -0
  26. package/development/train/train-wagon-button/train-wagon-button.component.d.ts.map +1 -0
  27. package/development/train/train-wagon-button/train-wagon-button.component.js +18 -0
  28. package/development/train/train-wagon-common.d.ts +15 -0
  29. package/development/train/train-wagon-common.d.ts.map +1 -0
  30. package/development/train/train-wagon-common.js +2 -0
  31. package/development/train/train-wagon-link/train-wagon-link.component.d.ts +18 -0
  32. package/development/train/train-wagon-link/train-wagon-link.component.d.ts.map +1 -0
  33. package/development/train/train-wagon-link/train-wagon-link.component.js +18 -0
  34. package/development/train-blocked-passage.component-BgBnEOfh.js +22 -0
  35. package/development/train-formation.component-CDKR5KCm.js +194 -0
  36. package/development/train-wagon-common-S3OJdguG.js +441 -0
  37. package/development/train.component-CP9QaQk8.js +239 -0
  38. package/development/train.d.ts.map +1 -1
  39. package/development/train.js +13 -7
  40. package/development/train.pure.d.ts +4 -0
  41. package/development/train.pure.d.ts.map +1 -1
  42. package/development/train.pure.js +9 -5
  43. package/index.d.ts +3 -1
  44. package/index.js +3 -1
  45. package/off-brand-theme.css +57 -31
  46. package/package.json +2 -2
  47. package/safety-theme.css +57 -31
  48. package/standard-theme.css +57 -31
  49. package/train/train/train.component.js +1 -1
  50. package/train/train-blocked-passage/train-blocked-passage.component.js +1 -1
  51. package/train/train-formation/train-formation.component.js +1 -1
  52. package/train/train-formation-orientation-mixin.js +45 -0
  53. package/train/train-wagon/train-wagon.component.js +13 -2
  54. package/train/train-wagon-button/train-wagon-button.component.js +10 -0
  55. package/train/train-wagon-common.js +2 -0
  56. package/train/train-wagon-link/train-wagon-link.component.js +10 -0
  57. package/train-blocked-passage.component-voZ8fxiB.js +14 -0
  58. package/train-formation.component-6XQVXPue.js +147 -0
  59. package/train-wagon-common-DTN_G78z.js +354 -0
  60. package/train.component-3vmLxVCZ.js +181 -0
  61. package/train.js +10 -6
  62. package/train.pure.js +9 -5
  63. package/development/train-blocked-passage.component-Bh2dR1gn.js +0 -30
  64. package/development/train-formation.component-Dm0t9N_h.js +0 -149
  65. package/development/train-wagon.component-B6V4dPKn.js +0 -334
  66. package/development/train.component-BvbNBkZF.js +0 -229
  67. package/train-blocked-passage.component-DIh8dbU9.js +0 -22
  68. package/train-formation.component-DS4EDwPY.js +0 -117
  69. package/train-wagon.component-LwKwwuta.js +0 -257
  70. package/train.component-DuFi_iBX.js +0 -174
@@ -1,149 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { html, nothing, unsafeCSS } from "lit";
3
- import { property, state } from "lit/decorators.js";
4
- import { SbbElement, SbbLanguageController, SbbNamedSlotListMixin, boxSizingStyles, i18nSector, i18nSectorShort, i18nTrains } from "./core.js";
5
- import { styleMap } from "lit/directives/style-map.js";
6
- //#region src/elements/train/train-formation/train-formation.scss?inline
7
- var train_formation_default = ":host {\n display: block;\n --sbb-train-formation-sector-line-color: var(--sbb-color-cement);\n --sbb-train-formation-sector-line-color: light-dark(\n var(--sbb-color-cement),\n var(--sbb-color-smoke)\n );\n --sbb-train-formation-sector-line-width: var(--sbb-border-width-1x);\n --sbb-train-formation-blocked-passage-width: 1rem;\n --sbb-train-formation-text-color: var(--sbb-color-3);\n --sbb-train-formation-vertical-gap: var(--sbb-spacing-fixed-2x);\n}\n@media (forced-colors: active) {\n :host {\n --sbb-train-formation-sector-line-color: CanvasText;\n }\n}\n\n.sbb-train-formation {\n --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);\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}\n.sbb-train-formation::-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-train-formation::-webkit-scrollbar-corner {\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-train-formation::-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-train-formation::-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-train-formation::-webkit-scrollbar-button, .sbb-train-formation::-webkit-scrollbar-corner {\n display: none;\n}\n@supports not selector(::-webkit-scrollbar) {\n .sbb-train-formation {\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-train-formation {\n display: grid;\n grid-template: \"start sectors end\" auto \"start trains end\" auto/auto 1fr auto;\n position: relative;\n overflow-x: auto;\n row-gap: calc(var(--sbb-train-formation-show-sectors-gap, 0) * var(--sbb-train-formation-vertical-gap));\n padding-block-end: var(--sbb-train-formation-vertical-gap);\n color: var(--sbb-train-formation-text-color);\n}\n.sbb-train-formation:focus-visible {\n outline-offset: var(--sbb-focus-outline-offset);\n outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);\n}\n.sbb-train-formation::before, .sbb-train-formation::after {\n content: \"\";\n display: block;\n width: var(--sbb-train-formation-padding-inline);\n}\n.sbb-train-formation::before {\n grid-area: start;\n}\n.sbb-train-formation::after {\n grid-area: end;\n}\n\n.sbb-train-formation__sectors {\n display: flex;\n grid-area: sectors;\n gap: var(--sbb-train-formation-wagon-gap);\n}\n\n.sbb-train-formation__sector {\n --_wagon-sum: var(--sbb-train-formation-wagon-count) * var(--sbb-train-formation-wagon-width);\n --_blocked-passage-sum: var(--sbb-train-formation-wagon-blocked-passage-count) *\n var(--sbb-train-formation-blocked-passage-width);\n --_total-count: calc(\n var(--sbb-train-formation-wagon-count) + var(--sbb-train-formation-wagon-blocked-passage-count)\n );\n --_gap-sum: calc((var(--_total-count) - 1) * var(--sbb-train-formation-wagon-gap));\n --_sector-width: calc(var(--_wagon-sum) + var(--_blocked-passage-sum) + var(--_gap-sum));\n --sbb-text-font-size: var(--sbb-text-font-size-xs);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n flex: 0 0 var(--_sector-width);\n text-align: center;\n overflow-x: clip;\n}\n\n.sbb-train-formation__sector-sticky-wrapper {\n position: sticky;\n inset: auto 0;\n padding: 0 var(--sbb-spacing-fixed-1x);\n margin: 0 var(--sbb-spacing-fixed-2x);\n overflow: hidden;\n white-space: nowrap;\n}\n.sbb-train-formation__sector-sticky-wrapper::before, .sbb-train-formation__sector-sticky-wrapper::after {\n content: \"\";\n position: absolute;\n inset-block: calc(50% - var(--sbb-train-formation-sector-line-width) / 2);\n border-block-end: var(--sbb-train-formation-sector-line-width) solid var(--sbb-train-formation-sector-line-color);\n width: calc(0.5 * var(--_sector-width));\n}\n.sbb-train-formation__sector-sticky-wrapper::before {\n inset-inline-end: 100%;\n}\n.sbb-train-formation__sector-sticky-wrapper::after {\n inset-inline-start: 100%;\n}\n\n.sbb-train-formation__trains {\n grid-area: trains;\n}\n\n.sbb-train-formation__train-list {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n display: flex;\n gap: var(--sbb-train-formation-wagon-gap);\n}\n\n.sbb-train-formation__train-list > :is(li, span) {\n display: inline-flex;\n}";
8
- //#endregion
9
- //#region src/elements/train/train-formation/train-formation.component.ts
10
- /**
11
- * It displays a train composition, acting as a container for one or more `sbb-train` component.
12
- *
13
- * @slot - Use the unnamed slot to add 'sbb-train' elements to the `sbb-train-formation`.
14
- * @cssprop [--sbb-train-formation-padding-inline=0px] - Defines the inline padding inside the horizontal scrolling area.
15
- */
16
- var SbbTrainFormationElement = (() => {
17
- let _classSuper = SbbNamedSlotListMixin(SbbElement);
18
- let _view_decorators;
19
- let _view_initializers = [];
20
- let _view_extraInitializers = [];
21
- let __sectors_decorators;
22
- let __sectors_initializers = [];
23
- let __sectors_extraInitializers = [];
24
- return class SbbTrainFormationElement extends _classSuper {
25
- static {
26
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
27
- _view_decorators = [property({ reflect: true })];
28
- __sectors_decorators = [state()];
29
- __esDecorate(this, null, _view_decorators, {
30
- kind: "accessor",
31
- name: "view",
32
- static: false,
33
- private: false,
34
- access: {
35
- has: (obj) => "view" in obj,
36
- get: (obj) => obj.view,
37
- set: (obj, value) => {
38
- obj.view = value;
39
- }
40
- },
41
- metadata: _metadata
42
- }, _view_initializers, _view_extraInitializers);
43
- __esDecorate(this, null, __sectors_decorators, {
44
- kind: "accessor",
45
- name: "_sectors",
46
- static: false,
47
- private: false,
48
- access: {
49
- has: (obj) => "_sectors" in obj,
50
- get: (obj) => obj._sectors,
51
- set: (obj, value) => {
52
- obj._sectors = value;
53
- }
54
- },
55
- metadata: _metadata
56
- }, __sectors_initializers, __sectors_extraInitializers);
57
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
58
- enumerable: true,
59
- configurable: true,
60
- writable: true,
61
- value: _metadata
62
- });
63
- }
64
- static {
65
- this.elementName = "sbb-train-formation";
66
- }
67
- static {
68
- this.styles = [boxSizingStyles, unsafeCSS(train_formation_default)];
69
- }
70
- #view_accessor_storage;
71
- /** Whether the view of the wagons is from side or top perspective. */
72
- get view() {
73
- return this.#view_accessor_storage;
74
- }
75
- set view(value) {
76
- this.#view_accessor_storage = value;
77
- }
78
- #_sectors_accessor_storage;
79
- get _sectors() {
80
- return this.#_sectors_accessor_storage;
81
- }
82
- set _sectors(value) {
83
- this.#_sectors_accessor_storage = value;
84
- }
85
- constructor() {
86
- super();
87
- this.listChildLocalNames = ["sbb-train"];
88
- this.#view_accessor_storage = __runInitializers(this, _view_initializers, "side");
89
- this.#_sectors_accessor_storage = (__runInitializers(this, _view_extraInitializers), __runInitializers(this, __sectors_initializers, []));
90
- this._language = (__runInitializers(this, __sectors_extraInitializers), new SbbLanguageController(this));
91
- this.addEventListener?.("trainslotchange", (e) => this._readSectors(e));
92
- this.addEventListener?.("sectorchange", (e) => this._readSectors(e));
93
- }
94
- _readSectors(event) {
95
- event?.stopPropagation();
96
- this._sectors = Array.from(this.querySelectorAll?.("sbb-train-wagon,sbb-train-blocked-passage") ?? []).reduce((aggregatedSectors, item) => {
97
- const currentAggregatedSector = aggregatedSectors[aggregatedSectors.length - 1];
98
- if (item.localName === "sbb-train-wagon") {
99
- const sectorAttribute = item.sector ?? item.getAttribute("sector");
100
- if (!currentAggregatedSector.label && sectorAttribute) currentAggregatedSector.label = sectorAttribute;
101
- if (!sectorAttribute || currentAggregatedSector.label === sectorAttribute) currentAggregatedSector.wagonCount++;
102
- else aggregatedSectors.push({
103
- label: sectorAttribute,
104
- wagonCount: 1,
105
- blockedPassageCount: 0
106
- });
107
- } else if (item.localName === "sbb-train-blocked-passage") currentAggregatedSector.blockedPassageCount++;
108
- return aggregatedSectors;
109
- }, [{
110
- wagonCount: 0,
111
- blockedPassageCount: 0
112
- }]);
113
- }
114
- willUpdate(changedProperties) {
115
- super.willUpdate(changedProperties);
116
- if (changedProperties.has("listChildren")) this._readSectors();
117
- }
118
- render() {
119
- return html`
120
- <div class="sbb-train-formation">
121
- ${this._sectors.length && this._sectors[0].label !== void 0 ? html`<div class="sbb-train-formation__sectors" aria-hidden="true">
122
- ${this._sectors.map((aggregatedSector) => html`<span
123
- class="sbb-train-formation__sector"
124
- style=${styleMap({
125
- "--sbb-train-formation-wagon-count": aggregatedSector.wagonCount,
126
- "--sbb-train-formation-wagon-blocked-passage-count": aggregatedSector.blockedPassageCount
127
- })}
128
- >
129
- <span class="sbb-train-formation__sector-sticky-wrapper">
130
- ${`${aggregatedSector.wagonCount === 1 && aggregatedSector.label ? i18nSectorShort[this._language.current] : i18nSector[this._language.current]} ${aggregatedSector.label ? aggregatedSector.label : ""}`}
131
- </span>
132
- </span>`)}
133
- </div>` : nothing}
134
-
135
- <div class="sbb-train-formation__trains">
136
- ${this.renderList({
137
- class: "sbb-train-formation__train-list",
138
- ariaLabel: i18nTrains[this._language.current]
139
- })}
140
- </div>
141
- </div>
142
- `;
143
- }
144
- };
145
- })();
146
- //#endregion
147
- export { SbbTrainFormationElement as t };
148
-
149
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW4tZm9ybWF0aW9uLmNvbXBvbmVudC1EbTB0OU5faC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvdHJhaW4vdHJhaW4tZm9ybWF0aW9uL3RyYWluLWZvcm1hdGlvbi5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90cmFpbi90cmFpbi1mb3JtYXRpb24vdHJhaW4tZm9ybWF0aW9uLmNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlICcuLi8uLi9jb3JlL3N0eWxlcycgYXMgc2JiO1xuXG46aG9zdCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuXG4gIC0tc2JiLXRyYWluLWZvcm1hdGlvbi1zZWN0b3ItbGluZS1jb2xvcjogbGlnaHQtZGFyayhcbiAgICB2YXIoLS1zYmItY29sb3ItY2VtZW50KSxcbiAgICB2YXIoLS1zYmItY29sb3Itc21va2UpXG4gICk7XG4gIC0tc2JiLXRyYWluLWZvcm1hdGlvbi1zZWN0b3ItbGluZS13aWR0aDogdmFyKC0tc2JiLWJvcmRlci13aWR0aC0xeCk7XG4gIC0tc2JiLXRyYWluLWZvcm1hdGlvbi1ibG9ja2VkLXBhc3NhZ2Utd2lkdGg6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCgxNil9O1xuICAtLXNiYi10cmFpbi1mb3JtYXRpb24tdGV4dC1jb2xvcjogdmFyKC0tc2JiLWNvbG9yLTMpO1xuICAtLXNiYi10cmFpbi1mb3JtYXRpb24tdmVydGljYWwtZ2FwOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCk7XG5cbiAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgIC0tc2JiLXRyYWluLWZvcm1hdGlvbi1zZWN0b3ItbGluZS1jb2xvcjogQ2FudmFzVGV4dDtcbiAgfVxufVxuXG4uc2JiLXRyYWluLWZvcm1hdGlvbiB7XG4gIEBpbmNsdWRlIHNiYi5zY3JvbGxiYXI7XG5cbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZTpcbiAgICAnc3RhcnQgc2VjdG9ycyBlbmQnIGF1dG9cbiAgICAnc3RhcnQgdHJhaW5zIGVuZCcgYXV0byAvIGF1dG8gMWZyIGF1dG87XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgcm93LWdhcDogY2FsYyhcbiAgICB2YXIoLS1zYmItdHJhaW4tZm9ybWF0aW9uLXNob3ctc2VjdG9ycy1nYXAsIDApICogdmFyKC0tc2JiLXRyYWluLWZvcm1hdGlvbi12ZXJ0aWNhbC1nYXApXG4gICk7XG4gIHBhZGRpbmctYmxvY2stZW5kOiB2YXIoLS1zYmItdHJhaW4tZm9ybWF0aW9uLXZlcnRpY2FsLWdhcCk7XG4gIGNvbG9yOiB2YXIoLS1zYmItdHJhaW4tZm9ybWF0aW9uLXRleHQtY29sb3IpO1xuXG4gICY6Zm9jdXMtdmlzaWJsZSB7XG4gICAgQGluY2x1ZGUgc2JiLmZvY3VzLW91dGxpbmU7XG4gIH1cblxuICAvLyBFbmFibGUgaW5saW5lIHBhZGRpbmdcbiAgJjo6YmVmb3JlLFxuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IHZhcigtLXNiYi10cmFpbi1mb3JtYXRpb24tcGFkZGluZy1pbmxpbmUpO1xuICB9XG5cbiAgJjo6YmVmb3JlIHtcbiAgICBncmlkLWFyZWE6IHN0YXJ0O1xuICB9XG5cbiAgJjo6YWZ0ZXIge1xuICAgIGdyaWQtYXJlYTogZW5kO1xuICB9XG59XG5cbi5zYmItdHJhaW4tZm9ybWF0aW9uX19zZWN0b3JzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ3JpZC1hcmVhOiBzZWN0b3JzO1xuICBnYXA6IHZhcigtLXNiYi10cmFpbi1mb3JtYXRpb24td2Fnb24tZ2FwKTtcbn1cblxuLnNiYi10cmFpbi1mb3JtYXRpb25fX3NlY3RvciB7XG4gIC0tX3dhZ29uLXN1bTogdmFyKC0tc2JiLXRyYWluLWZvcm1hdGlvbi13YWdvbi1jb3VudCkgKiB2YXIoLS1zYmItdHJhaW4tZm9ybWF0aW9uLXdhZ29uLXdpZHRoKTtcbiAgLS1fYmxvY2tlZC1wYXNzYWdlLXN1bTogdmFyKC0tc2JiLXRyYWluLWZvcm1hdGlvbi13YWdvbi1ibG9ja2VkLXBhc3NhZ2UtY291bnQpICpcbiAgICB2YXIoLS1zYmItdHJhaW4tZm9ybWF0aW9uLWJsb2NrZWQtcGFzc2FnZS13aWR0aCk7XG4gIC0tX3RvdGFsLWNvdW50OiBjYWxjKFxuICAgIHZhcigtLXNiYi10cmFpbi1mb3JtYXRpb24td2Fnb24tY291bnQpICsgdmFyKC0tc2JiLXRyYWluLWZvcm1hdGlvbi13YWdvbi1ibG9ja2VkLXBhc3NhZ2UtY291bnQpXG4gICk7XG4gIC0tX2dhcC1zdW06IGNhbGMoKHZhcigtLV90b3RhbC1jb3VudCkgLSAxKSAqIHZhcigtLXNiYi10cmFpbi1mb3JtYXRpb24td2Fnb24tZ2FwKSk7XG4gIC0tX3NlY3Rvci13aWR0aDogY2FsYyh2YXIoLS1fd2Fnb24tc3VtKSArIHZhcigtLV9ibG9ja2VkLXBhc3NhZ2Utc3VtKSArIHZhcigtLV9nYXAtc3VtKSk7XG5cbiAgQGluY2x1ZGUgc2JiLnRleHQteHMtLXJlZ3VsYXI7XG5cbiAgZmxleDogMCAwIHZhcigtLV9zZWN0b3Itd2lkdGgpO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG92ZXJmbG93LXg6IGNsaXA7XG59XG5cbi5zYmItdHJhaW4tZm9ybWF0aW9uX19zZWN0b3Itc3RpY2t5LXdyYXBwZXIge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICBpbnNldDogYXV0byAwO1xuICBwYWRkaW5nOiAwIHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTF4KTtcbiAgbWFyZ2luOiAwIHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTJ4KTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcblxuICAvLyBMaW5lcyBiZXNpZGUgdGhlIHNlY3Rvci1sYWJlbFxuICAmOjpiZWZvcmUsXG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG5cbiAgICAvLyBFeGFjdGx5IGNlbnRlciB0aGUgbGluZSBieSBzdWJ0cmFjdGluZyBoYWxmIG9mIHRoZSBib3JkZXIgd2lkdGhcbiAgICBpbnNldC1ibG9jazogY2FsYyg1MCUgLSB2YXIoLS1zYmItdHJhaW4tZm9ybWF0aW9uLXNlY3Rvci1saW5lLXdpZHRoKSAvIDIpO1xuICAgIGJvcmRlci1ibG9jay1lbmQ6IHZhcigtLXNiYi10cmFpbi1mb3JtYXRpb24tc2VjdG9yLWxpbmUtd2lkdGgpIHNvbGlkXG4gICAgICB2YXIoLS1zYmItdHJhaW4tZm9ybWF0aW9uLXNlY3Rvci1saW5lLWNvbG9yKTtcbiAgICB3aWR0aDogY2FsYygwLjUgKiB2YXIoLS1fc2VjdG9yLXdpZHRoKSk7XG4gIH1cblxuICAmOjpiZWZvcmUge1xuICAgIGluc2V0LWlubGluZS1lbmQ6IDEwMCU7XG4gIH1cblxuICAmOjphZnRlciB7XG4gICAgaW5zZXQtaW5saW5lLXN0YXJ0OiAxMDAlO1xuICB9XG59XG5cbi5zYmItdHJhaW4tZm9ybWF0aW9uX190cmFpbnMge1xuICBncmlkLWFyZWE6IHRyYWlucztcbn1cblxuLnNiYi10cmFpbi1mb3JtYXRpb25fX3RyYWluLWxpc3Qge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IHZhcigtLXNiYi10cmFpbi1mb3JtYXRpb24td2Fnb24tZ2FwKTtcbn1cblxuLy8gVXNpbmcgLi4uIGxpIHNlbGVjdG9yLCBiZWNhdXNlIHRoZSBsaSBnZW5lcmF0aW9uXG4vLyBpcyBoYW5kbGVkIGluIHRoZSBjb21wb25lbnQgYmFzZSBjbGFzcy5cbi5zYmItdHJhaW4tZm9ybWF0aW9uX190cmFpbi1saXN0ID4gOmlzKGxpLCBzcGFuKSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuIiwiaW1wb3J0IHtcbiAgdHlwZSBDU1NSZXN1bHRHcm91cCxcbiAgaHRtbCxcbiAgbm90aGluZyxcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbiAgdW5zYWZlQ1NTLFxufSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgc3R5bGVNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9zdHlsZS1tYXAuanMnO1xuXG5pbXBvcnQge1xuICBTYmJFbGVtZW50LFxuICBTYmJMYW5ndWFnZUNvbnRyb2xsZXIsXG4gIGkxOG5TZWN0b3IsXG4gIGkxOG5TZWN0b3JTaG9ydCxcbiAgaTE4blRyYWlucyxcbiAgYm94U2l6aW5nU3R5bGVzLFxufSBmcm9tICcuLi8uLi9jb3JlLnRzJztcbmltcG9ydCB7IFNiYk5hbWVkU2xvdExpc3RNaXhpbiwgdHlwZSBXaXRoTGlzdENoaWxkcmVuIH0gZnJvbSAnLi4vLi4vY29yZS50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYlRyYWluRWxlbWVudCB9IGZyb20gJy4uL3RyYWluL3RyYWluLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYlRyYWluQmxvY2tlZFBhc3NhZ2VFbGVtZW50IH0gZnJvbSAnLi4vdHJhaW4tYmxvY2tlZC1wYXNzYWdlL3RyYWluLWJsb2NrZWQtcGFzc2FnZS5jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJUcmFpbldhZ29uRWxlbWVudCB9IGZyb20gJy4uL3RyYWluLXdhZ29uL3RyYWluLXdhZ29uLmNvbXBvbmVudC50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3RyYWluLWZvcm1hdGlvbi5zY3NzP2lubGluZSc7XG5cbmludGVyZmFjZSBBZ2dyZWdhdGVkU2VjdG9yIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgd2Fnb25Db3VudDogbnVtYmVyO1xuICBibG9ja2VkUGFzc2FnZUNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogSXQgZGlzcGxheXMgYSB0cmFpbiBjb21wb3NpdGlvbiwgYWN0aW5nIGFzIGEgY29udGFpbmVyIGZvciBvbmUgb3IgbW9yZSBgc2JiLXRyYWluYCBjb21wb25lbnQuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgJ3NiYi10cmFpbicgZWxlbWVudHMgdG8gdGhlIGBzYmItdHJhaW4tZm9ybWF0aW9uYC5cbiAqIEBjc3Nwcm9wIFstLXNiYi10cmFpbi1mb3JtYXRpb24tcGFkZGluZy1pbmxpbmU9MHB4XSAtIERlZmluZXMgdGhlIGlubGluZSBwYWRkaW5nIGluc2lkZSB0aGUgaG9yaXpvbnRhbCBzY3JvbGxpbmcgYXJlYS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNiYlRyYWluRm9ybWF0aW9uRWxlbWVudCBleHRlbmRzIFNiYk5hbWVkU2xvdExpc3RNaXhpbjxcbiAgU2JiVHJhaW5FbGVtZW50LFxuICB0eXBlb2YgU2JiRWxlbWVudFxuPihTYmJFbGVtZW50KSB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZWxlbWVudE5hbWU6IHN0cmluZyA9ICdzYmItdHJhaW4tZm9ybWF0aW9uJztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgdW5zYWZlQ1NTKHN0eWxlKV07XG4gIHByb3RlY3RlZCBvdmVycmlkZSByZWFkb25seSBsaXN0Q2hpbGRMb2NhbE5hbWVzID0gWydzYmItdHJhaW4nXTtcblxuICAvKiogV2hldGhlciB0aGUgdmlldyBvZiB0aGUgd2Fnb25zIGlzIGZyb20gc2lkZSBvciB0b3AgcGVyc3BlY3RpdmUuICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUgfSkgcHVibGljIGFjY2Vzc29yIHZpZXc6ICdzaWRlJyB8ICd0b3AnID0gJ3NpZGUnO1xuXG4gIEBzdGF0ZSgpIHByaXZhdGUgYWNjZXNzb3IgX3NlY3RvcnM6IEFnZ3JlZ2F0ZWRTZWN0b3JbXSA9IFtdO1xuXG4gIHByaXZhdGUgX2xhbmd1YWdlID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/LigndHJhaW5zbG90Y2hhbmdlJywgKGUpID0+IHRoaXMuX3JlYWRTZWN0b3JzKGUpKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Lignc2VjdG9yY2hhbmdlJywgKGUpID0+IHRoaXMuX3JlYWRTZWN0b3JzKGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlYWRTZWN0b3JzKGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBLZWVwIHRoZSBldmVudCBpbnRlcm5hbC5cbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLl9zZWN0b3JzID0gQXJyYXkuZnJvbShcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbD8uPFNiYlRyYWluV2Fnb25FbGVtZW50IHwgU2JiVHJhaW5CbG9ja2VkUGFzc2FnZUVsZW1lbnQ+KFxuICAgICAgICAnc2JiLXRyYWluLXdhZ29uLHNiYi10cmFpbi1ibG9ja2VkLXBhc3NhZ2UnLFxuICAgICAgKSA/PyBbXSxcbiAgICApLnJlZHVjZShcbiAgICAgIChcbiAgICAgICAgYWdncmVnYXRlZFNlY3RvcnM6IEFnZ3JlZ2F0ZWRTZWN0b3JbXSxcbiAgICAgICAgaXRlbTogU2JiVHJhaW5XYWdvbkVsZW1lbnQgfCBTYmJUcmFpbkJsb2NrZWRQYXNzYWdlRWxlbWVudCxcbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50QWdncmVnYXRlZFNlY3RvciA9IGFnZ3JlZ2F0ZWRTZWN0b3JzW2FnZ3JlZ2F0ZWRTZWN0b3JzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIGlmIChpdGVtLmxvY2FsTmFtZSA9PT0gJ3NiYi10cmFpbi13YWdvbicpIHtcbiAgICAgICAgICBjb25zdCBzZWN0b3JBdHRyaWJ1dGUgPVxuICAgICAgICAgICAgKGl0ZW0gYXMgU2JiVHJhaW5XYWdvbkVsZW1lbnQpLnNlY3RvciA/PyBpdGVtLmdldEF0dHJpYnV0ZSgnc2VjdG9yJyk7XG5cbiAgICAgICAgICBpZiAoIWN1cnJlbnRBZ2dyZWdhdGVkU2VjdG9yLmxhYmVsICYmIHNlY3RvckF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgY3VycmVudEFnZ3JlZ2F0ZWRTZWN0b3IubGFiZWwgPSBzZWN0b3JBdHRyaWJ1dGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzZWN0b3JBdHRyaWJ1dGUgfHwgY3VycmVudEFnZ3JlZ2F0ZWRTZWN0b3IubGFiZWwgPT09IHNlY3RvckF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgY3VycmVudEFnZ3JlZ2F0ZWRTZWN0b3Iud2Fnb25Db3VudCsrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZ2dyZWdhdGVkU2VjdG9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgbGFiZWw6IHNlY3RvckF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgd2Fnb25Db3VudDogMSxcbiAgICAgICAgICAgICAgYmxvY2tlZFBhc3NhZ2VDb3VudDogMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLmxvY2FsTmFtZSA9PT0gJ3NiYi10cmFpbi1ibG9ja2VkLXBhc3NhZ2UnKSB7XG4gICAgICAgICAgY3VycmVudEFnZ3JlZ2F0ZWRTZWN0b3IuYmxvY2tlZFBhc3NhZ2VDb3VudCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZWRTZWN0b3JzO1xuICAgICAgfSxcbiAgICAgIFt7IHdhZ29uQ291bnQ6IDAsIGJsb2NrZWRQYXNzYWdlQ291bnQ6IDAgfSBhcyBBZ2dyZWdhdGVkU2VjdG9yXSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPFdpdGhMaXN0Q2hpbGRyZW48dGhpcz4+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdsaXN0Q2hpbGRyZW4nKSkge1xuICAgICAgdGhpcy5fcmVhZFNlY3RvcnMoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItdHJhaW4tZm9ybWF0aW9uXCI+XG4gICAgICAgICR7dGhpcy5fc2VjdG9ycy5sZW5ndGggJiYgdGhpcy5fc2VjdG9yc1swXS5sYWJlbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBodG1sYDxkaXYgY2xhc3M9XCJzYmItdHJhaW4tZm9ybWF0aW9uX19zZWN0b3JzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICR7dGhpcy5fc2VjdG9ycy5tYXAoXG4gICAgICAgICAgICAgICAgKGFnZ3JlZ2F0ZWRTZWN0b3IpID0+XG4gICAgICAgICAgICAgICAgICBodG1sYDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLXRyYWluLWZvcm1hdGlvbl9fc2VjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgICAgICAgJy0tc2JiLXRyYWluLWZvcm1hdGlvbi13YWdvbi1jb3VudCc6IGFnZ3JlZ2F0ZWRTZWN0b3Iud2Fnb25Db3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAnLS1zYmItdHJhaW4tZm9ybWF0aW9uLXdhZ29uLWJsb2NrZWQtcGFzc2FnZS1jb3VudCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVkU2VjdG9yLmJsb2NrZWRQYXNzYWdlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi10cmFpbi1mb3JtYXRpb25fX3NlY3Rvci1zdGlja3ktd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICR7YCR7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVkU2VjdG9yLndhZ29uQ291bnQgPT09IDEgJiYgYWdncmVnYXRlZFNlY3Rvci5sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IGkxOG5TZWN0b3JTaG9ydFt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGkxOG5TZWN0b3JbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF1cbiAgICAgICAgICAgICAgICAgICAgICB9ICR7YWdncmVnYXRlZFNlY3Rvci5sYWJlbCA/IGFnZ3JlZ2F0ZWRTZWN0b3IubGFiZWwgOiAnJ31gfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+YCxcbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgICA6IG5vdGhpbmd9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10cmFpbi1mb3JtYXRpb25fX3RyYWluc1wiPlxuICAgICAgICAgICR7dGhpcy5yZW5kZXJMaXN0KHtcbiAgICAgICAgICAgIGNsYXNzOiAnc2JiLXRyYWluLWZvcm1hdGlvbl9fdHJhaW4tbGlzdCcsXG4gICAgICAgICAgICBhcmlhTGFiZWw6IGkxOG5UcmFpbnNbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXRyYWluLWZvcm1h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
@@ -1,334 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { nothing, unsafeCSS } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbElement, SbbLanguageController, SbbNamedSlotListMixin, boxSizingStyles, forceType, handleDistinctChange, i18nAdditionalWagonInformationHeading, i18nBlockedPassage, i18nClass, i18nClosedCompartmentLabel, i18nCouchetteWagonLabel, i18nLocomotiveLabel, i18nRestaurantWagonLabel, i18nSector, i18nSleepingWagonLabel, i18nWagonLabel, i18nWagonLabelNumber, omitEmptyConverter } from "./core.js";
5
- import { html as html$1 } from "lit/static-html.js";
6
- import { SbbIconElement } from "./icon.pure.js";
7
- import { SbbTimetableOccupancyIconElement } from "./timetable-occupancy-icon.pure.js";
8
- import { when } from "lit/directives/when.js";
9
- //#region src/elements/train/train-wagon/train-wagon.scss?inline
10
- var train_wagon_default = ":host {\n display: block;\n --sbb-train-wagon-width: var(--sbb-train-formation-wagon-width);\n --sbb-train-wagon-height: var(--sbb-train-formation-wagon-height);\n --sbb-train-wagon-shape-color: var(--sbb-color-3);\n --sbb-train-wagon-main-icon-height: 1.25rem;\n --sbb-train-wagon-main-icon-margin-block-start: 0.625rem;\n --sbb-train-wagon-attribute-icon-gap: var(--sbb-spacing-fixed-1x);\n --sbb-train-wagon-attribute-icon-height: 0.875rem;\n --sbb-train-wagon-attribute-icon-color: var(--sbb-color-1);\n --sbb-train-wagon-occupancy-height: 0.75rem;\n}\n@media (forced-colors: active) {\n :host {\n --sbb-train-wagon-shape-color: CanvasText;\n }\n}\n\n@media (forced-colors: active) {\n :host([type=closed]) {\n --sbb-train-wagon-shape-color: GrayText;\n }\n}\n\n:host(:is([type=sleeping], [type=couchette])) {\n --sbb-train-wagon-main-icon-margin-block-start: 0.390625rem;\n}\n\n:host(:is([type=wagon], [type=restaurant], [type=sleeping], [type=couchette])) {\n --sbb-train-wagon-shape: var(--sbb-train-wagon-wagon-shape);\n}\n\n:host([type=closed]) {\n --sbb-train-wagon-shape: var(--sbb-train-wagon-wagon-closed-shape);\n}\n\n:host([type=locomotive]) {\n --sbb-train-wagon-shape: var(--sbb-train-wagon-locomotive-shape);\n}\n\n:host([type=wagon-end-left]) {\n --sbb-train-wagon-shape: var(--sbb-train-wagon-wagon-end-left-shape);\n}\n\n:host([type=wagon-end-right]) {\n --sbb-train-wagon-shape: var(--sbb-train-wagon-wagon-end-right-shape);\n}\n\n.sbb-train-wagon {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: var(--sbb-train-wagon-width);\n gap: var(--sbb-train-formation-vertical-gap);\n}\n\n.sbb-train-wagon__compartment {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n display: grid;\n grid-template: \"label label\" auto \"occupancy class\" 1fr/1fr 1fr;\n}\n.sbb-train-wagon__compartment::before {\n content: \"\";\n grid-column: occupancy/class;\n grid-row: occupancy;\n pointer-events: none;\n width: var(--sbb-train-wagon-width);\n height: var(--sbb-train-wagon-height);\n background-color: var(--sbb-train-wagon-shape-color);\n mask-image: var(--sbb-train-wagon-shape);\n}\n\n.sbb-train-wagon__main-icon {\n --sbb-icon-svg-height: var(--sbb-train-wagon-main-icon-height);\n grid-column: occupancy/class;\n grid-row: occupancy;\n margin-block-start: var(--sbb-train-wagon-main-icon-margin-block-start);\n justify-self: center;\n}\n\n.sbb-train-wagon__label {\n --sbb-text-font-size: var(--sbb-text-font-size-xxs);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n grid-area: label;\n text-align: center;\n display: var(--sbb-train-formation-wagon-label-display, inline-block);\n min-height: calc(1em * var(--sbb-typo-line-height-text));\n}\n\n.sbb-train-wagon__occupancy,\n.sbb-train-wagon__class {\n height: var(--sbb-train-wagon-height);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.sbb-train-wagon__occupancy {\n --sbb-icon-svg-height: var(--sbb-train-wagon-occupancy-height);\n grid-area: occupancy;\n}\n\n.sbb-train-wagon__class {\n --sbb-title-font-size: var(--sbb-title-font-size-level-6-lean, var(--sbb-heading-font-size-6));\n --sbb-title-line-height: var(--sbb-typo-line-height-text);\n margin-block: var(--sbb-title-margin-block, 0);\n margin-inline: 0;\n font-family: var(--sbb-typo-font-family);\n font-weight: bold;\n font-size: var(--sbb-title-font-size);\n letter-spacing: var(--sbb-typo-letter-spacing-heading);\n line-height: var(--sbb-title-line-height, var(--sbb-typo-line-height-heading));\n grid-area: class;\n}\n\n.sbb-train-wagon__attribute-icon-list {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n --sbb-icon-svg-height: var(--sbb-train-wagon-attribute-icon-height);\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: var(--sbb-train-wagon-attribute-icon-gap);\n color: var(--sbb-train-wagon-attribute-icon-color);\n}\n\n.sbb-train-wagon__attribute-icon-list > :is(li, span) {\n display: inline-flex;\n}\n\n.sbb-screen-reader-only {\n border: 0;\n clip-path: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}";
11
- //#endregion
12
- //#region src/elements/train/train-wagon/train-wagon.component.ts
13
- var typeToIconMap = {
14
- couchette: "sa-cc",
15
- sleeping: "sa-wl",
16
- restaurant: "sa-wr"
17
- };
18
- /**
19
- * It displays a train compartment within a `sbb-train` component.
20
- *
21
- * @slot - Use the unnamed slot to add one or more `sbb-icon` for meta-information of the `sbb-train-wagon`.
22
- */
23
- var SbbTrainWagonElement = (() => {
24
- let _classSuper = SbbNamedSlotListMixin(SbbElement);
25
- let _type_decorators;
26
- let _type_initializers = [];
27
- let _type_extraInitializers = [];
28
- let _occupancy_decorators;
29
- let _occupancy_initializers = [];
30
- let _occupancy_extraInitializers = [];
31
- let _sector_decorators;
32
- let _sector_initializers = [];
33
- let _sector_extraInitializers = [];
34
- let _blockedPassage_decorators;
35
- let _blockedPassage_initializers = [];
36
- let _blockedPassage_extraInitializers = [];
37
- let _wagonClass_decorators;
38
- let _wagonClass_initializers = [];
39
- let _wagonClass_extraInitializers = [];
40
- let _label_decorators;
41
- let _label_initializers = [];
42
- let _label_extraInitializers = [];
43
- let _additionalAccessibilityText_decorators;
44
- let _additionalAccessibilityText_initializers = [];
45
- let _additionalAccessibilityText_extraInitializers = [];
46
- return class SbbTrainWagonElement extends _classSuper {
47
- constructor() {
48
- super(...arguments);
49
- this.#type_accessor_storage = __runInitializers(this, _type_initializers, "wagon");
50
- this.listChildLocalNames = (__runInitializers(this, _type_extraInitializers), ["sbb-icon"]);
51
- this.#occupancy_accessor_storage = __runInitializers(this, _occupancy_initializers, null);
52
- this.#sector_accessor_storage = (__runInitializers(this, _occupancy_extraInitializers), __runInitializers(this, _sector_initializers, ""));
53
- this.#blockedPassage_accessor_storage = (__runInitializers(this, _sector_extraInitializers), __runInitializers(this, _blockedPassage_initializers, "none"));
54
- this.#wagonClass_accessor_storage = (__runInitializers(this, _blockedPassage_extraInitializers), __runInitializers(this, _wagonClass_initializers, null));
55
- this.#label_accessor_storage = (__runInitializers(this, _wagonClass_extraInitializers), __runInitializers(this, _label_initializers, ""));
56
- this.#additionalAccessibilityText_accessor_storage = (__runInitializers(this, _label_extraInitializers), __runInitializers(this, _additionalAccessibilityText_initializers, ""));
57
- this._language = (__runInitializers(this, _additionalAccessibilityText_extraInitializers), new SbbLanguageController(this));
58
- }
59
- static {
60
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
61
- _type_decorators = [property({ reflect: true })];
62
- _occupancy_decorators = [property()];
63
- _sector_decorators = [
64
- forceType(),
65
- handleDistinctChange((e) => e._sectorChanged()),
66
- property({
67
- reflect: true,
68
- converter: omitEmptyConverter
69
- })
70
- ];
71
- _blockedPassage_decorators = [property({ attribute: "blocked-passage" })];
72
- _wagonClass_decorators = [property({ attribute: "wagon-class" })];
73
- _label_decorators = [forceType(), property({
74
- reflect: true,
75
- converter: omitEmptyConverter
76
- })];
77
- _additionalAccessibilityText_decorators = [forceType(), property({ attribute: "additional-accessibility-text" })];
78
- __esDecorate(this, null, _type_decorators, {
79
- kind: "accessor",
80
- name: "type",
81
- static: false,
82
- private: false,
83
- access: {
84
- has: (obj) => "type" in obj,
85
- get: (obj) => obj.type,
86
- set: (obj, value) => {
87
- obj.type = value;
88
- }
89
- },
90
- metadata: _metadata
91
- }, _type_initializers, _type_extraInitializers);
92
- __esDecorate(this, null, _occupancy_decorators, {
93
- kind: "accessor",
94
- name: "occupancy",
95
- static: false,
96
- private: false,
97
- access: {
98
- has: (obj) => "occupancy" in obj,
99
- get: (obj) => obj.occupancy,
100
- set: (obj, value) => {
101
- obj.occupancy = value;
102
- }
103
- },
104
- metadata: _metadata
105
- }, _occupancy_initializers, _occupancy_extraInitializers);
106
- __esDecorate(this, null, _sector_decorators, {
107
- kind: "accessor",
108
- name: "sector",
109
- static: false,
110
- private: false,
111
- access: {
112
- has: (obj) => "sector" in obj,
113
- get: (obj) => obj.sector,
114
- set: (obj, value) => {
115
- obj.sector = value;
116
- }
117
- },
118
- metadata: _metadata
119
- }, _sector_initializers, _sector_extraInitializers);
120
- __esDecorate(this, null, _blockedPassage_decorators, {
121
- kind: "accessor",
122
- name: "blockedPassage",
123
- static: false,
124
- private: false,
125
- access: {
126
- has: (obj) => "blockedPassage" in obj,
127
- get: (obj) => obj.blockedPassage,
128
- set: (obj, value) => {
129
- obj.blockedPassage = value;
130
- }
131
- },
132
- metadata: _metadata
133
- }, _blockedPassage_initializers, _blockedPassage_extraInitializers);
134
- __esDecorate(this, null, _wagonClass_decorators, {
135
- kind: "accessor",
136
- name: "wagonClass",
137
- static: false,
138
- private: false,
139
- access: {
140
- has: (obj) => "wagonClass" in obj,
141
- get: (obj) => obj.wagonClass,
142
- set: (obj, value) => {
143
- obj.wagonClass = value;
144
- }
145
- },
146
- metadata: _metadata
147
- }, _wagonClass_initializers, _wagonClass_extraInitializers);
148
- __esDecorate(this, null, _label_decorators, {
149
- kind: "accessor",
150
- name: "label",
151
- static: false,
152
- private: false,
153
- access: {
154
- has: (obj) => "label" in obj,
155
- get: (obj) => obj.label,
156
- set: (obj, value) => {
157
- obj.label = value;
158
- }
159
- },
160
- metadata: _metadata
161
- }, _label_initializers, _label_extraInitializers);
162
- __esDecorate(this, null, _additionalAccessibilityText_decorators, {
163
- kind: "accessor",
164
- name: "additionalAccessibilityText",
165
- static: false,
166
- private: false,
167
- access: {
168
- has: (obj) => "additionalAccessibilityText" in obj,
169
- get: (obj) => obj.additionalAccessibilityText,
170
- set: (obj, value) => {
171
- obj.additionalAccessibilityText = value;
172
- }
173
- },
174
- metadata: _metadata
175
- }, _additionalAccessibilityText_initializers, _additionalAccessibilityText_extraInitializers);
176
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
177
- enumerable: true,
178
- configurable: true,
179
- writable: true,
180
- value: _metadata
181
- });
182
- }
183
- static {
184
- this.elementName = "sbb-train-wagon";
185
- }
186
- static {
187
- this.elementDependencies = [SbbIconElement, SbbTimetableOccupancyIconElement];
188
- }
189
- static {
190
- this.styles = [boxSizingStyles, unsafeCSS(train_wagon_default)];
191
- }
192
- static {
193
- this.events = { sectorchange: "sectorchange" };
194
- }
195
- #type_accessor_storage;
196
- /**
197
- * Wagon type.
198
- * For `wagon-end-left` and `wagon-end-right`, please set the corresponding value of the `blockedPassage` property.
199
- */
200
- get type() {
201
- return this.#type_accessor_storage;
202
- }
203
- set type(value) {
204
- this.#type_accessor_storage = value;
205
- }
206
- #occupancy_accessor_storage;
207
- /** Occupancy of a wagon. */
208
- get occupancy() {
209
- return this.#occupancy_accessor_storage;
210
- }
211
- set occupancy(value) {
212
- this.#occupancy_accessor_storage = value;
213
- }
214
- #sector_accessor_storage;
215
- /** Sector in which the wagon stops. */
216
- get sector() {
217
- return this.#sector_accessor_storage;
218
- }
219
- set sector(value) {
220
- this.#sector_accessor_storage = value;
221
- }
222
- #blockedPassage_accessor_storage;
223
- /** Accessibility text for blocked passages of the wagon. */
224
- get blockedPassage() {
225
- return this.#blockedPassage_accessor_storage;
226
- }
227
- set blockedPassage(value) {
228
- this.#blockedPassage_accessor_storage = value;
229
- }
230
- #wagonClass_accessor_storage;
231
- /** Class label */
232
- get wagonClass() {
233
- return this.#wagonClass_accessor_storage;
234
- }
235
- set wagonClass(value) {
236
- this.#wagonClass_accessor_storage = value;
237
- }
238
- #label_accessor_storage;
239
- /** Wagon number */
240
- get label() {
241
- return this.#label_accessor_storage;
242
- }
243
- set label(value) {
244
- this.#label_accessor_storage = value;
245
- }
246
- #additionalAccessibilityText_accessor_storage;
247
- /** Additional accessibility text which will be appended to the end. */
248
- get additionalAccessibilityText() {
249
- return this.#additionalAccessibilityText_accessor_storage;
250
- }
251
- set additionalAccessibilityText(value) {
252
- this.#additionalAccessibilityText_accessor_storage = value;
253
- }
254
- _sectorChanged() {
255
- /** @internal */
256
- this.dispatchEvent(new Event("sectorchange", {
257
- bubbles: true,
258
- composed: true
259
- }));
260
- }
261
- _typeLabel() {
262
- if (this.type === "closed") return i18nClosedCompartmentLabel[this._language.current];
263
- else if (this.type === "locomotive") return i18nLocomotiveLabel[this._language.current];
264
- else if (this.type === "couchette") return i18nCouchetteWagonLabel[this._language.current];
265
- else if (this.type === "sleeping") return i18nSleepingWagonLabel[this._language.current];
266
- else if (this.type === "restaurant") return i18nRestaurantWagonLabel[this._language.current];
267
- return i18nWagonLabel[this._language.current];
268
- }
269
- render() {
270
- const blockedPassage = this.type === "wagon-end-left" && this.blockedPassage === "none" ? "previous" : this.type === "wagon-end-right" && this.blockedPassage === "none" ? "next" : this.blockedPassage ?? "none";
271
- const hasBlockedPassageEntry = blockedPassage !== "none";
272
- const listEntriesCount = +!!this.sector + +!!this.label + +(!!this.wagonClass && this.type !== "closed") + +(!!this.occupancy && this.type !== "closed") + +hasBlockedPassageEntry;
273
- const sectorString = `${i18nSector[this._language.current]}, ${this.sector}`;
274
- const labelContent = this.label ? html$1`<span class="sbb-screen-reader-only">
275
- ${`${i18nWagonLabelNumber[this._language.current]}, ${this.label}`}
276
- </span>
277
- <span aria-hidden="true">${this.label}</span>` : nothing;
278
- const wagonClassContent = html$1`<span class="sbb-screen-reader-only">
279
- ${this.wagonClass === "1" ? i18nClass["first"][this._language.current] : i18nClass["second"][this._language.current]}
280
- </span>
281
- <span aria-hidden="true">${this.wagonClass}</span>`;
282
- const mainIcon = typeToIconMap[this.type] ? html$1`<sbb-icon
283
- name=${typeToIconMap[this.type]}
284
- class="sbb-train-wagon__main-icon"
285
- ></sbb-icon>` : nothing;
286
- return html$1`
287
- <div class="sbb-train-wagon">
288
- ${when(listEntriesCount > 1, () => html$1`<ul aria-label=${this._typeLabel()} class="sbb-train-wagon__compartment">
289
- ${this.sector ? html$1`<li class="sbb-screen-reader-only">${sectorString}</li>` : nothing}
290
- <li class="sbb-train-wagon__label" aria-hidden=${`${!this.label}`}>
291
- ${labelContent}
292
- </li>
293
- ${this.wagonClass && this.type !== "closed" ? html$1`<li class="sbb-train-wagon__class">${wagonClassContent}</li>` : nothing}
294
- ${this.occupancy && this.type !== "closed" ? html$1`<sbb-timetable-occupancy-icon
295
- class="sbb-train-wagon__occupancy"
296
- role="listitem"
297
- occupancy=${this.occupancy}
298
- ></sbb-timetable-occupancy-icon>` : nothing}
299
- ${hasBlockedPassageEntry ? html$1`<li class="sbb-screen-reader-only">
300
- ${i18nBlockedPassage[blockedPassage][this._language.current]}
301
- </li>` : nothing}
302
- ${mainIcon}
303
- </ul>`, () => html$1`<div class="sbb-train-wagon__compartment">
304
- <span class="sbb-screen-reader-only">
305
- ${`${this._typeLabel()}${this.sector ? `, ${sectorString}` : ""}`}
306
- </span>
307
- <span class="sbb-train-wagon__label" aria-hidden=${`${!this.label}`}>
308
- ${labelContent}
309
- </span>
310
-
311
- ${this.wagonClass && this.type !== "closed" ? html$1`<span class="sbb-train-wagon__class">${wagonClassContent}</span>` : nothing}
312
- ${this.occupancy && this.type !== "closed" ? html$1`<sbb-timetable-occupancy-icon
313
- class="sbb-train-wagon__occupancy"
314
- occupancy=${this.occupancy}
315
- ></sbb-timetable-occupancy-icon>` : nothing}
316
- ${hasBlockedPassageEntry ? html$1`<span class="sbb-screen-reader-only">
317
- ${i18nBlockedPassage[blockedPassage][this._language.current]}
318
- </span>` : nothing}
319
- ${mainIcon}
320
- </div> `)}
321
- ${this.additionalAccessibilityText ? html$1`<span class="sbb-screen-reader-only">, ${this.additionalAccessibilityText}</span>` : nothing}
322
- ${this.renderList({
323
- class: "sbb-train-wagon__attribute-icon-list",
324
- ariaLabel: i18nAdditionalWagonInformationHeading[this._language.current]
325
- })}
326
- </div>
327
- `;
328
- }
329
- };
330
- })();
331
- //#endregion
332
- export { SbbTrainWagonElement as t };
333
-
334
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW4td2Fnb24uY29tcG9uZW50LUI2VjRkUEtuLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90cmFpbi90cmFpbi13YWdvbi90cmFpbi13YWdvbi5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90cmFpbi90cmFpbi13YWdvbi90cmFpbi13YWdvbi5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICBkaXNwbGF5OiBibG9jaztcblxuICAtLXNiYi10cmFpbi13YWdvbi13aWR0aDogdmFyKC0tc2JiLXRyYWluLWZvcm1hdGlvbi13YWdvbi13aWR0aCk7XG4gIC0tc2JiLXRyYWluLXdhZ29uLWhlaWdodDogdmFyKC0tc2JiLXRyYWluLWZvcm1hdGlvbi13YWdvbi1oZWlnaHQpO1xuICAtLXNiYi10cmFpbi13YWdvbi1zaGFwZS1jb2xvcjogdmFyKC0tc2JiLWNvbG9yLTMpO1xuICAtLXNiYi10cmFpbi13YWdvbi1tYWluLWljb24taGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMjApfTtcbiAgLS1zYmItdHJhaW4td2Fnb24tbWFpbi1pY29uLW1hcmdpbi1ibG9jay1zdGFydDogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDEwKX07XG4gIC0tc2JiLXRyYWluLXdhZ29uLWF0dHJpYnV0ZS1pY29uLWdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMXgpO1xuICAtLXNiYi10cmFpbi13YWdvbi1hdHRyaWJ1dGUtaWNvbi1oZWlnaHQ6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCgxNCl9O1xuICAtLXNiYi10cmFpbi13YWdvbi1hdHRyaWJ1dGUtaWNvbi1jb2xvcjogdmFyKC0tc2JiLWNvbG9yLTEpO1xuICAtLXNiYi10cmFpbi13YWdvbi1vY2N1cGFuY3ktaGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMTIpfTtcblxuICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgLS1zYmItdHJhaW4td2Fnb24tc2hhcGUtY29sb3I6IENhbnZhc1RleHQ7XG4gIH1cbn1cblxuLy8gOmhvc3QoOmlzKFt0eXBlPSdjbG9zZWQnXSwgW3R5cGU9J2xvY29tb3RpdmUnXSkpIHtcbi8vICAtLXNiYi10cmFpbi13YWdvbi1zaGFwZS1jb2xvcjogdmFyKC0tc2JiLWNvbG9yLW1ldGFsKTtcbi8vXG4vLyAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuLy8gICAgLS1zYmItdHJhaW4td2Fnb24tc2hhcGUtY29sb3I6IENhbnZhc1RleHQ7XG4vLyAgfVxuLy8gfVxuXG46aG9zdChbdHlwZT0nY2xvc2VkJ10pIHtcbiAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgIC0tc2JiLXRyYWluLXdhZ29uLXNoYXBlLWNvbG9yOiBHcmF5VGV4dDtcbiAgfVxufVxuXG46aG9zdCg6aXMoW3R5cGU9J3NsZWVwaW5nJ10sIFt0eXBlPSdjb3VjaGV0dGUnXSkpIHtcbiAgLS1zYmItdHJhaW4td2Fnb24tbWFpbi1pY29uLW1hcmdpbi1ibG9jay1zdGFydDogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDYuMjUpfTtcbn1cblxuOmhvc3QoOmlzKFt0eXBlPSd3YWdvbiddLCBbdHlwZT0ncmVzdGF1cmFudCddLCBbdHlwZT0nc2xlZXBpbmcnXSwgW3R5cGU9J2NvdWNoZXR0ZSddKSkge1xuICAtLXNiYi10cmFpbi13YWdvbi1zaGFwZTogdmFyKC0tc2JiLXRyYWluLXdhZ29uLXdhZ29uLXNoYXBlKTtcbn1cblxuOmhvc3QoW3R5cGU9J2Nsb3NlZCddKSB7XG4gIC0tc2JiLXRyYWluLXdhZ29uLXNoYXBlOiB2YXIoLS1zYmItdHJhaW4td2Fnb24td2Fnb24tY2xvc2VkLXNoYXBlKTtcbn1cblxuOmhvc3QoW3R5cGU9J2xvY29tb3RpdmUnXSkge1xuICAtLXNiYi10cmFpbi13YWdvbi1zaGFwZTogdmFyKC0tc2JiLXRyYWluLXdhZ29uLWxvY29tb3RpdmUtc2hhcGUpO1xufVxuXG46aG9zdChbdHlwZT0nd2Fnb24tZW5kLWxlZnQnXSkge1xuICAtLXNiYi10cmFpbi13YWdvbi1zaGFwZTogdmFyKC0tc2JiLXRyYWluLXdhZ29uLXdhZ29uLWVuZC1sZWZ0LXNoYXBlKTtcbn1cblxuOmhvc3QoW3R5cGU9J3dhZ29uLWVuZC1yaWdodCddKSB7XG4gIC0tc2JiLXRyYWluLXdhZ29uLXNoYXBlOiB2YXIoLS1zYmItdHJhaW4td2Fnb24td2Fnb24tZW5kLXJpZ2h0LXNoYXBlKTtcbn1cblxuLnNiYi10cmFpbi13YWdvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiB2YXIoLS1zYmItdHJhaW4td2Fnb24td2lkdGgpO1xuICBnYXA6IHZhcigtLXNiYi10cmFpbi1mb3JtYXRpb24tdmVydGljYWwtZ2FwKTtcbn1cblxuLnNiYi10cmFpbi13YWdvbl9fY29tcGFydG1lbnQge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlOlxuICAgICdsYWJlbCBsYWJlbCcgYXV0b1xuICAgICdvY2N1cGFuY3kgY2xhc3MnIDFmciAvIDFmciAxZnI7XG5cbiAgLy8gVHlwZSBzaGFwZVxuICAmOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIGdyaWQtY29sdW1uOiBvY2N1cGFuY3kgLyBjbGFzcztcbiAgICBncmlkLXJvdzogb2NjdXBhbmN5O1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHdpZHRoOiB2YXIoLS1zYmItdHJhaW4td2Fnb24td2lkdGgpO1xuICAgIGhlaWdodDogdmFyKC0tc2JiLXRyYWluLXdhZ29uLWhlaWdodCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLXRyYWluLXdhZ29uLXNoYXBlLWNvbG9yKTtcblxuICAgIC8vIFVzaW5nIG1hc2staW1hZ2UgdGFrZXMgdGhlIGJhY2tncm91bmQtY29sb3IgYXMgc3Ryb2tlIGNvbG9yXG4gICAgbWFzay1pbWFnZTogdmFyKC0tc2JiLXRyYWluLXdhZ29uLXNoYXBlKTtcbiAgfVxufVxuXG4uc2JiLXRyYWluLXdhZ29uX19tYWluLWljb24ge1xuICAtLXNiYi1pY29uLXN2Zy1oZWlnaHQ6IHZhcigtLXNiYi10cmFpbi13YWdvbi1tYWluLWljb24taGVpZ2h0KTtcblxuICBncmlkLWNvbHVtbjogb2NjdXBhbmN5IC8gY2xhc3M7XG4gIGdyaWQtcm93OiBvY2N1cGFuY3k7XG4gIG1hcmdpbi1ibG9jay1zdGFydDogdmFyKC0tc2JiLXRyYWluLXdhZ29uLW1haW4taWNvbi1tYXJnaW4tYmxvY2stc3RhcnQpO1xuICBqdXN0aWZ5LXNlbGY6IGNlbnRlcjtcbn1cblxuLnNiYi10cmFpbi13YWdvbl9fbGFiZWwge1xuICBAaW5jbHVkZSBzYmIudGV4dC14eHMtLXJlZ3VsYXI7XG5cbiAgZ3JpZC1hcmVhOiBsYWJlbDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBkaXNwbGF5OiB2YXIoLS1zYmItdHJhaW4tZm9ybWF0aW9uLXdhZ29uLWxhYmVsLWRpc3BsYXksIGlubGluZS1ibG9jayk7XG4gIG1pbi1oZWlnaHQ6IGNhbGMoMWVtICogdmFyKC0tc2JiLXR5cG8tbGluZS1oZWlnaHQtdGV4dCkpO1xufVxuXG4uc2JiLXRyYWluLXdhZ29uX19vY2N1cGFuY3ksXG4uc2JiLXRyYWluLXdhZ29uX19jbGFzcyB7XG4gIGhlaWdodDogdmFyKC0tc2JiLXRyYWluLXdhZ29uLWhlaWdodCk7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uc2JiLXRyYWluLXdhZ29uX19vY2N1cGFuY3kge1xuICAtLXNiYi1pY29uLXN2Zy1oZWlnaHQ6IHZhcigtLXNiYi10cmFpbi13YWdvbi1vY2N1cGFuY3ktaGVpZ2h0KTtcblxuICBncmlkLWFyZWE6IG9jY3VwYW5jeTtcbn1cblxuLnNiYi10cmFpbi13YWdvbl9fY2xhc3Mge1xuICBAaW5jbHVkZSBzYmIudGl0bGUtNigkZXhjbHVkZS1zcGFjaW5nOiB0cnVlKTtcblxuICBncmlkLWFyZWE6IGNsYXNzO1xufVxuXG4uc2JiLXRyYWluLXdhZ29uX19hdHRyaWJ1dGUtaWNvbi1saXN0IHtcbiAgQGluY2x1ZGUgc2JiLmxpc3QtcmVzZXQ7XG5cbiAgLS1zYmItaWNvbi1zdmctaGVpZ2h0OiB2YXIoLS1zYmItdHJhaW4td2Fnb24tYXR0cmlidXRlLWljb24taGVpZ2h0KTtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBnYXA6IHZhcigtLXNiYi10cmFpbi13YWdvbi1hdHRyaWJ1dGUtaWNvbi1nYXApO1xuICBjb2xvcjogdmFyKC0tc2JiLXRyYWluLXdhZ29uLWF0dHJpYnV0ZS1pY29uLWNvbG9yKTtcbn1cblxuLy8gVXNpbmcgLi4uIGxpIHNlbGVjdG9yLCBiZWNhdXNlIHRoZSBsaSBnZW5lcmF0aW9uXG4vLyBpcyBoYW5kbGVkIGluIHRoZSBjb21wb25lbnQgYmFzZSBjbGFzcy5cbi5zYmItdHJhaW4td2Fnb25fX2F0dHJpYnV0ZS1pY29uLWxpc3QgPiA6aXMobGksIHNwYW4pIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG59XG5cbi5zYmItc2NyZWVuLXJlYWRlci1vbmx5IHtcbiAgQGluY2x1ZGUgc2JiLnNjcmVlbi1yZWFkZXItb25seTtcbn1cbiIsImltcG9ydCB7IHR5cGUgQ1NTUmVzdWx0R3JvdXAsIG5vdGhpbmcsIHR5cGUgVGVtcGxhdGVSZXN1bHQsIHVuc2FmZUNTUyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdoZW4gfSBmcm9tICdsaXQvZGlyZWN0aXZlcy93aGVuLmpzJztcbmltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQvc3RhdGljLWh0bWwuanMnO1xuXG5pbXBvcnQgeyB0eXBlIFNiYk9jY3VwYW5jeSwgU2JiRWxlbWVudCwgdHlwZSBTYmJFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL2NvcmUudHMnO1xuaW1wb3J0IHtcbiAgU2JiTGFuZ3VhZ2VDb250cm9sbGVyLFxuICBmb3JjZVR5cGUsXG4gIGhhbmRsZURpc3RpbmN0Q2hhbmdlLFxuICBvbWl0RW1wdHlDb252ZXJ0ZXIsXG4gIGkxOG5BZGRpdGlvbmFsV2Fnb25JbmZvcm1hdGlvbkhlYWRpbmcsXG4gIGkxOG5CbG9ja2VkUGFzc2FnZSxcbiAgaTE4bkNsYXNzLFxuICBpMThuQ2xvc2VkQ29tcGFydG1lbnRMYWJlbCxcbiAgaTE4bkNvdWNoZXR0ZVdhZ29uTGFiZWwsXG4gIGkxOG5Mb2NvbW90aXZlTGFiZWwsXG4gIGkxOG5SZXN0YXVyYW50V2Fnb25MYWJlbCxcbiAgaTE4blNlY3RvcixcbiAgaTE4blNsZWVwaW5nV2Fnb25MYWJlbCxcbiAgaTE4bldhZ29uTGFiZWwsXG4gIGkxOG5XYWdvbkxhYmVsTnVtYmVyLFxuICBTYmJOYW1lZFNsb3RMaXN0TWl4aW4sXG4gIGJveFNpemluZ1N0eWxlcyxcbn0gZnJvbSAnLi4vLi4vY29yZS50cyc7XG5pbXBvcnQgeyBTYmJJY29uRWxlbWVudCB9IGZyb20gJy4uLy4uL2ljb24ucHVyZS50cyc7XG5pbXBvcnQgeyBTYmJUaW1ldGFibGVPY2N1cGFuY3lJY29uRWxlbWVudCB9IGZyb20gJy4uLy4uL3RpbWV0YWJsZS1vY2N1cGFuY3ktaWNvbi5wdXJlLnRzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vdHJhaW4td2Fnb24uc2Nzcz9pbmxpbmUnO1xuXG5jb25zdCB0eXBlVG9JY29uTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBjb3VjaGV0dGU6ICdzYS1jYycsXG4gIHNsZWVwaW5nOiAnc2Etd2wnLFxuICByZXN0YXVyYW50OiAnc2Etd3InLFxufTtcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhIHRyYWluIGNvbXBhcnRtZW50IHdpdGhpbiBhIGBzYmItdHJhaW5gIGNvbXBvbmVudC5cbiAqXG4gKiBAc2xvdCAtIFVzZSB0aGUgdW5uYW1lZCBzbG90IHRvIGFkZCBvbmUgb3IgbW9yZSBgc2JiLWljb25gIGZvciBtZXRhLWluZm9ybWF0aW9uIG9mIHRoZSBgc2JiLXRyYWluLXdhZ29uYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNiYlRyYWluV2Fnb25FbGVtZW50IGV4dGVuZHMgU2JiTmFtZWRTbG90TGlzdE1peGluPFNiYkljb25FbGVtZW50LCB0eXBlb2YgU2JiRWxlbWVudD4oXG4gIFNiYkVsZW1lbnQsXG4pIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi10cmFpbi13YWdvbic7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZWxlbWVudERlcGVuZGVuY2llczogU2JiRWxlbWVudFR5cGVbXSA9IFtcbiAgICBTYmJJY29uRWxlbWVudCxcbiAgICBTYmJUaW1ldGFibGVPY2N1cGFuY3lJY29uRWxlbWVudCxcbiAgXTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgdW5zYWZlQ1NTKHN0eWxlKV07XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlY3RvcmNoYW5nZTogJ3NlY3RvcmNoYW5nZScsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqXG4gICAqIFdhZ29uIHR5cGUuXG4gICAqIEZvciBgd2Fnb24tZW5kLWxlZnRgIGFuZCBgd2Fnb24tZW5kLXJpZ2h0YCwgcGxlYXNlIHNldCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZiB0aGUgYGJsb2NrZWRQYXNzYWdlYCBwcm9wZXJ0eS5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUgfSkgcHVibGljIGFjY2Vzc29yIHR5cGU6XG4gICAgfCAnd2Fnb24nXG4gICAgfCAnd2Fnb24tZW5kLWxlZnQnXG4gICAgfCAnd2Fnb24tZW5kLXJpZ2h0J1xuICAgIHwgJ2NvdWNoZXR0ZSdcbiAgICB8ICdzbGVlcGluZydcbiAgICB8ICdyZXN0YXVyYW50J1xuICAgIHwgJ2xvY29tb3RpdmUnXG4gICAgfCAnY2xvc2VkJyA9ICd3YWdvbic7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlYWRvbmx5IGxpc3RDaGlsZExvY2FsTmFtZXMgPSBbJ3NiYi1pY29uJ107XG5cbiAgLyoqIE9jY3VwYW5jeSBvZiBhIHdhZ29uLiAqL1xuICBAcHJvcGVydHkoKSBwdWJsaWMgYWNjZXNzb3Igb2NjdXBhbmN5OiBTYmJPY2N1cGFuY3kgfCBudWxsID0gbnVsbDtcblxuICAvKiogU2VjdG9yIGluIHdoaWNoIHRoZSB3YWdvbiBzdG9wcy4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBoYW5kbGVEaXN0aW5jdENoYW5nZSgoZTogU2JiVHJhaW5XYWdvbkVsZW1lbnQpID0+IGUuX3NlY3RvckNoYW5nZWQoKSlcbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgY29udmVydGVyOiBvbWl0RW1wdHlDb252ZXJ0ZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIHNlY3Rvcjogc3RyaW5nID0gJyc7XG5cbiAgLyoqIEFjY2Vzc2liaWxpdHkgdGV4dCBmb3IgYmxvY2tlZCBwYXNzYWdlcyBvZiB0aGUgd2Fnb24uICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Jsb2NrZWQtcGFzc2FnZScgfSlcbiAgcHVibGljIGFjY2Vzc29yIGJsb2NrZWRQYXNzYWdlOiAncHJldmlvdXMnIHwgJ25leHQnIHwgJ2JvdGgnIHwgJ25vbmUnID0gJ25vbmUnO1xuXG4gIC8qKiBDbGFzcyBsYWJlbCAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd3YWdvbi1jbGFzcycgfSkgcHVibGljIGFjY2Vzc29yIHdhZ29uQ2xhc3M6ICcxJyB8ICcyJyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBXYWdvbiBudW1iZXIgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIGNvbnZlcnRlcjogb21pdEVtcHR5Q29udmVydGVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBsYWJlbDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIEFkZGl0aW9uYWwgYWNjZXNzaWJpbGl0eSB0ZXh0IHdoaWNoIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGVuZC4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FkZGl0aW9uYWwtYWNjZXNzaWJpbGl0eS10ZXh0JyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWRkaXRpb25hbEFjY2Vzc2liaWxpdHlUZXh0OiBzdHJpbmcgPSAnJztcblxuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG5cbiAgcHJpdmF0ZSBfc2VjdG9yQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnc2VjdG9yY2hhbmdlJywgeyBidWJibGVzOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSB9KSk7XG4gIH1cblxuICBwcml2YXRlIF90eXBlTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAnY2xvc2VkJykge1xuICAgICAgcmV0dXJuIGkxOG5DbG9zZWRDb21wYXJ0bWVudExhYmVsW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnbG9jb21vdGl2ZScpIHtcbiAgICAgIHJldHVybiBpMThuTG9jb21vdGl2ZUxhYmVsW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnY291Y2hldHRlJykge1xuICAgICAgcmV0dXJuIGkxOG5Db3VjaGV0dGVXYWdvbkxhYmVsW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnc2xlZXBpbmcnKSB7XG4gICAgICByZXR1cm4gaTE4blNsZWVwaW5nV2Fnb25MYWJlbFt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ3Jlc3RhdXJhbnQnKSB7XG4gICAgICByZXR1cm4gaTE4blJlc3RhdXJhbnRXYWdvbkxhYmVsW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdO1xuICAgIH1cbiAgICByZXR1cm4gaTE4bldhZ29uTGFiZWxbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF07XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBibG9ja2VkUGFzc2FnZSA9XG4gICAgICB0aGlzLnR5cGUgPT09ICd3YWdvbi1lbmQtbGVmdCcgJiYgdGhpcy5ibG9ja2VkUGFzc2FnZSA9PT0gJ25vbmUnXG4gICAgICAgID8gJ3ByZXZpb3VzJ1xuICAgICAgICA6IHRoaXMudHlwZSA9PT0gJ3dhZ29uLWVuZC1yaWdodCcgJiYgdGhpcy5ibG9ja2VkUGFzc2FnZSA9PT0gJ25vbmUnXG4gICAgICAgICAgPyAnbmV4dCdcbiAgICAgICAgICA6ICh0aGlzLmJsb2NrZWRQYXNzYWdlID8/ICdub25lJyk7XG5cbiAgICBjb25zdCBoYXNCbG9ja2VkUGFzc2FnZUVudHJ5ID0gYmxvY2tlZFBhc3NhZ2UgIT09ICdub25lJztcblxuICAgIC8vIEZyb20gYWNjZXNzaWJpbGl0eSBwZXJzcGVjdGl2ZSB3ZSBjYW5ub3QgY3JlYXRlIGEgbGlzdCB3aXRoIG9ubHkgb25lIGVudHJ5LlxuICAgIC8vIFdlIG5lZWQgdG8ga25vdyB3aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFuZCBzd2l0Y2ggc2VtYW50aWNzIGJhc2VkIG9uIGNvdW50LlxuICAgIGNvbnN0IGxpc3RFbnRyaWVzQ291bnQgPVxuICAgICAgKyEhdGhpcy5zZWN0b3IgK1xuICAgICAgKyEhdGhpcy5sYWJlbCArXG4gICAgICArKCEhdGhpcy53YWdvbkNsYXNzICYmIHRoaXMudHlwZSAhPT0gJ2Nsb3NlZCcpICtcbiAgICAgICsoISF0aGlzLm9jY3VwYW5jeSAmJiB0aGlzLnR5cGUgIT09ICdjbG9zZWQnKSArXG4gICAgICAraGFzQmxvY2tlZFBhc3NhZ2VFbnRyeTtcblxuICAgIGNvbnN0IHNlY3RvclN0cmluZyA9IGAke2kxOG5TZWN0b3JbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19LCAke3RoaXMuc2VjdG9yfWA7XG5cbiAgICBjb25zdCBsYWJlbENvbnRlbnQgPSB0aGlzLmxhYmVsXG4gICAgICA/IGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+XG4gICAgICAgICAgICAke2Ake2kxOG5XYWdvbkxhYmVsTnVtYmVyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSwgJHt0aGlzLmxhYmVsfWB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7dGhpcy5sYWJlbH08L3NwYW4+YFxuICAgICAgOiBub3RoaW5nO1xuXG4gICAgY29uc3Qgd2Fnb25DbGFzc0NvbnRlbnQgPSBodG1sYDxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiPlxuICAgICAgICAke3RoaXMud2Fnb25DbGFzcyA9PT0gJzEnXG4gICAgICAgICAgPyBpMThuQ2xhc3NbJ2ZpcnN0J11bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF1cbiAgICAgICAgICA6IGkxOG5DbGFzc1snc2Vjb25kJ11bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke3RoaXMud2Fnb25DbGFzc308L3NwYW4+YDtcblxuICAgIGNvbnN0IG1haW5JY29uID0gdHlwZVRvSWNvbk1hcFt0aGlzLnR5cGVdXG4gICAgICA/IGh0bWxgPHNiYi1pY29uXG4gICAgICAgICAgbmFtZT0ke3R5cGVUb0ljb25NYXBbdGhpcy50eXBlXX1cbiAgICAgICAgICBjbGFzcz1cInNiYi10cmFpbi13YWdvbl9fbWFpbi1pY29uXCJcbiAgICAgICAgPjwvc2JiLWljb24+YFxuICAgICAgOiBub3RoaW5nO1xuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXRyYWluLXdhZ29uXCI+XG4gICAgICAgICR7d2hlbihcbiAgICAgICAgICBsaXN0RW50cmllc0NvdW50ID4gMSxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgaHRtbGA8dWwgYXJpYS1sYWJlbD0ke3RoaXMuX3R5cGVMYWJlbCgpfSBjbGFzcz1cInNiYi10cmFpbi13YWdvbl9fY29tcGFydG1lbnRcIj5cbiAgICAgICAgICAgICAgJHt0aGlzLnNlY3RvclxuICAgICAgICAgICAgICAgID8gaHRtbGA8bGkgY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+JHtzZWN0b3JTdHJpbmd9PC9saT5gXG4gICAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJzYmItdHJhaW4td2Fnb25fX2xhYmVsXCIgYXJpYS1oaWRkZW49JHtgJHshdGhpcy5sYWJlbH1gfT5cbiAgICAgICAgICAgICAgICAke2xhYmVsQ29udGVudH1cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgJHt0aGlzLndhZ29uQ2xhc3MgJiYgdGhpcy50eXBlICE9PSAnY2xvc2VkJ1xuICAgICAgICAgICAgICAgID8gaHRtbGA8bGkgY2xhc3M9XCJzYmItdHJhaW4td2Fnb25fX2NsYXNzXCI+JHt3YWdvbkNsYXNzQ29udGVudH08L2xpPmBcbiAgICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgICR7dGhpcy5vY2N1cGFuY3kgJiYgdGhpcy50eXBlICE9PSAnY2xvc2VkJ1xuICAgICAgICAgICAgICAgID8gaHRtbGA8c2JiLXRpbWV0YWJsZS1vY2N1cGFuY3ktaWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNiYi10cmFpbi13YWdvbl9fb2NjdXBhbmN5XCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImxpc3RpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgb2NjdXBhbmN5PSR7dGhpcy5vY2N1cGFuY3l9XG4gICAgICAgICAgICAgICAgICA+PC9zYmItdGltZXRhYmxlLW9jY3VwYW5jeS1pY29uPmBcbiAgICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgICR7aGFzQmxvY2tlZFBhc3NhZ2VFbnRyeVxuICAgICAgICAgICAgICAgID8gaHRtbGA8bGkgY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICR7aTE4bkJsb2NrZWRQYXNzYWdlW2Jsb2NrZWRQYXNzYWdlXVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX1cbiAgICAgICAgICAgICAgICAgIDwvbGk+YFxuICAgICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICAgICAgJHttYWluSWNvbn1cbiAgICAgICAgICAgIDwvdWw+YCxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXRyYWluLXdhZ29uX19jb21wYXJ0bWVudFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAke2Ake3RoaXMuX3R5cGVMYWJlbCgpfSR7dGhpcy5zZWN0b3IgPyBgLCAke3NlY3RvclN0cmluZ31gIDogJyd9YH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi10cmFpbi13YWdvbl9fbGFiZWxcIiBhcmlhLWhpZGRlbj0ke2AkeyF0aGlzLmxhYmVsfWB9PlxuICAgICAgICAgICAgICAgICR7bGFiZWxDb250ZW50fVxuICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgJHt0aGlzLndhZ29uQ2xhc3MgJiYgdGhpcy50eXBlICE9PSAnY2xvc2VkJ1xuICAgICAgICAgICAgICAgID8gaHRtbGA8c3BhbiBjbGFzcz1cInNiYi10cmFpbi13YWdvbl9fY2xhc3NcIj4ke3dhZ29uQ2xhc3NDb250ZW50fTwvc3Bhbj5gXG4gICAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICAke3RoaXMub2NjdXBhbmN5ICYmIHRoaXMudHlwZSAhPT0gJ2Nsb3NlZCdcbiAgICAgICAgICAgICAgICA/IGh0bWxgPHNiYi10aW1ldGFibGUtb2NjdXBhbmN5LWljb25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzYmItdHJhaW4td2Fnb25fX29jY3VwYW5jeVwiXG4gICAgICAgICAgICAgICAgICAgIG9jY3VwYW5jeT0ke3RoaXMub2NjdXBhbmN5fVxuICAgICAgICAgICAgICAgICAgPjwvc2JiLXRpbWV0YWJsZS1vY2N1cGFuY3ktaWNvbj5gXG4gICAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICAke2hhc0Jsb2NrZWRQYXNzYWdlRW50cnlcbiAgICAgICAgICAgICAgICA/IGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICR7aTE4bkJsb2NrZWRQYXNzYWdlW2Jsb2NrZWRQYXNzYWdlXVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5gXG4gICAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICAke21haW5JY29ufVxuICAgICAgICAgICAgPC9kaXY+IGAsXG4gICAgICAgICl9XG4gICAgICAgICR7dGhpcy5hZGRpdGlvbmFsQWNjZXNzaWJpbGl0eVRleHRcbiAgICAgICAgICA/IGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+LCAke3RoaXMuYWRkaXRpb25hbEFjY2Vzc2liaWxpdHlUZXh0fTwvc3Bhbj5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAke3RoaXMucmVuZGVyTGlzdCh7XG4gICAgICAgICAgY2xhc3M6ICdzYmItdHJhaW4td2Fnb25fX2F0dHJpYnV0ZS1pY29uLWxpc3QnLFxuICAgICAgICAgIGFyaWFMYWJlbDogaTE4bkFkZGl0aW9uYWxXYWdvbkluZm9ybWF0aW9uSGVhZGluZ1t0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItdHJhaW4td2Fnb24nOiBTYmJUcmFpbldhZ29uRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUM4QkEsSUFBTSxnQkFBd0M7Q0FDNUMsV0FBVztDQUNYLFVBQVU7Q0FDVixZQUFZO0NBQ2I7Ozs7OztJQU9ZLDhCQUFvQjttQkFBUyxzQkFDeEMsV0FDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQUZZLDZCQUE2QixZQUV6Qzs7O0FBZThDLFNBQUEsd0JBQUEsa0JBQUEsTUFBQSxvQkFROUIsUUFBTztBQUVNLFFBQUEsdUJBQW1CLGtCQUFBLE1BQUEsd0JBQUEsRUFBRyxDQUFDLFdBQVc7QUFHbEMsU0FBQSw2QkFBQSxrQkFBQSxNQUFBLHlCQUFpQyxLQUFJO0FBTWpELFNBQUEsMkJBQUEsa0JBQUEsTUFBQSw2QkFBQSxFQUFBLGtCQUFBLE1BQUEsc0JBQWlCLEdBQUU7QUFJbkIsU0FBQSxtQ0FBQSxrQkFBQSxNQUFBLDBCQUFBLEVBQUEsa0JBQUEsTUFBQSw4QkFBd0QsT0FBTTtBQUd0QixTQUFBLCtCQUFB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