@tolle_/tolle-ui 18.2.24 → 18.2.25
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/esm2022/lib/accordion-item.component.mjs +17 -5
- package/esm2022/lib/alert-dialog-dynamic.component.mjs +1 -1
- package/esm2022/lib/alert-dialog.component.mjs +48 -10
- package/esm2022/lib/alert-dialog.service.mjs +13 -2
- package/esm2022/lib/alert.component.mjs +5 -5
- package/esm2022/lib/avatar.component.mjs +30 -9
- package/esm2022/lib/badge.component.mjs +41 -15
- package/esm2022/lib/breadcrumb-link.component.mjs +5 -5
- package/esm2022/lib/button.component.mjs +14 -3
- package/esm2022/lib/calendar.component.mjs +99 -17
- package/esm2022/lib/card.component.mjs +29 -9
- package/esm2022/lib/carousel/carousel.component.mjs +19 -3
- package/esm2022/lib/checkbox.component.mjs +44 -21
- package/esm2022/lib/collapsible.component.mjs +12 -4
- package/esm2022/lib/country-selector.component.mjs +140 -20
- package/esm2022/lib/data-table.component.mjs +27 -16
- package/esm2022/lib/date-picker.component.mjs +24 -4
- package/esm2022/lib/date-range-picker.component.mjs +37 -9
- package/esm2022/lib/dropdown-item.component.mjs +19 -5
- package/esm2022/lib/dropdown-label.component.mjs +3 -3
- package/esm2022/lib/dropdown-menu.component.mjs +3 -3
- package/esm2022/lib/dropdown-separator.component.mjs +3 -3
- package/esm2022/lib/dropdown-trigger.directive.mjs +7 -3
- package/esm2022/lib/empty-state.component.mjs +3 -3
- package/esm2022/lib/hover-card.component.mjs +4 -2
- package/esm2022/lib/input.component.mjs +7 -5
- package/esm2022/lib/label.component.mjs +2 -2
- package/esm2022/lib/masked-input.component.mjs +3 -3
- package/esm2022/lib/modal.component.mjs +58 -22
- package/esm2022/lib/modal.service.mjs +13 -1
- package/esm2022/lib/multi-select.component.mjs +228 -20
- package/esm2022/lib/otp.component.mjs +6 -3
- package/esm2022/lib/pagination.component.mjs +19 -9
- package/esm2022/lib/progress.component.mjs +8 -5
- package/esm2022/lib/radio-group.component.mjs +51 -3
- package/esm2022/lib/radio-item.component.mjs +46 -8
- package/esm2022/lib/radio-service.mjs +60 -1
- package/esm2022/lib/range-calendar.component.mjs +317 -98
- package/esm2022/lib/resizable-panel.component.mjs +5 -4
- package/esm2022/lib/scroll-area.component.mjs +5 -5
- package/esm2022/lib/segment.component.mjs +73 -7
- package/esm2022/lib/select-item.component.mjs +20 -2
- package/esm2022/lib/select-separator.component.mjs +3 -3
- package/esm2022/lib/select.component.mjs +221 -14
- package/esm2022/lib/separator.component.mjs +12 -6
- package/esm2022/lib/sheet-ref.mjs +8 -1
- package/esm2022/lib/sheet-wrapper.component.mjs +27 -11
- package/esm2022/lib/sheet.component.mjs +57 -16
- package/esm2022/lib/sheet.service.mjs +5 -1
- package/esm2022/lib/sidebar.component.mjs +73 -15
- package/esm2022/lib/skeleton.component.mjs +19 -5
- package/esm2022/lib/switch.component.mjs +59 -53
- package/esm2022/lib/tabs.component.mjs +75 -13
- package/esm2022/lib/tag-input.component.mjs +6 -3
- package/esm2022/lib/textarea.component.mjs +9 -7
- package/esm2022/lib/theme.service.mjs +114 -138
- package/esm2022/lib/toaster.component.mjs +19 -9
- package/esm2022/lib/toggle-group.component.mjs +76 -4
- package/esm2022/lib/tolle-config.mjs +1 -1
- package/esm2022/lib/tooltip.directive.mjs +41 -17
- package/esm2022/lib/utils/color.mjs +324 -0
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/tolle-ui.mjs +2645 -637
- package/fesm2022/tolle-ui.mjs.map +1 -1
- package/lib/alert-dialog.component.d.ts +10 -1
- package/lib/avatar.component.d.ts +16 -3
- package/lib/badge.component.d.ts +17 -5
- package/lib/button.component.d.ts +10 -3
- package/lib/calendar.component.d.ts +21 -3
- package/lib/card.component.d.ts +6 -0
- package/lib/carousel/carousel.component.d.ts +1 -0
- package/lib/checkbox.component.d.ts +12 -4
- package/lib/country-selector.component.d.ts +11 -2
- package/lib/date-picker.component.d.ts +1 -0
- package/lib/date-range-picker.component.d.ts +4 -1
- package/lib/dropdown-item.component.d.ts +4 -2
- package/lib/dropdown-trigger.directive.d.ts +1 -1
- package/lib/modal.component.d.ts +6 -0
- package/lib/multi-select.component.d.ts +20 -0
- package/lib/otp.component.d.ts +1 -0
- package/lib/progress.component.d.ts +1 -0
- package/lib/radio-group.component.d.ts +8 -0
- package/lib/radio-item.component.d.ts +10 -4
- package/lib/radio-service.d.ts +29 -0
- package/lib/range-calendar.component.d.ts +33 -4
- package/lib/segment.component.d.ts +13 -0
- package/lib/select-item.component.d.ts +4 -1
- package/lib/select.component.d.ts +20 -0
- package/lib/separator.component.d.ts +2 -0
- package/lib/sheet-wrapper.component.d.ts +4 -0
- package/lib/sheet.component.d.ts +10 -1
- package/lib/sidebar.component.d.ts +2 -0
- package/lib/skeleton.component.d.ts +9 -3
- package/lib/switch.component.d.ts +13 -20
- package/lib/tabs.component.d.ts +11 -1
- package/lib/theme.service.d.ts +21 -6
- package/lib/toaster.component.d.ts +2 -2
- package/lib/toggle-group.component.d.ts +20 -2
- package/lib/toggle.component.d.ts +1 -1
- package/lib/tolle-config.d.ts +8 -0
- package/lib/tooltip.directive.d.ts +3 -0
- package/lib/utils/color.d.ts +87 -0
- package/package.json +4 -1
- package/preset.js +28 -0
- package/public-api.d.ts +1 -0
- package/registry/docs-content.json +4214 -0
- package/registry/llms-full.txt +1599 -0
- package/registry/llms.txt +83 -0
- package/registry/manifest.json +4925 -0
- package/registry/r/accordion-item.json +21 -0
- package/registry/r/accordion.json +23 -0
- package/registry/r/alert-dialog-dynamic.json +31 -0
- package/registry/r/alert-dialog.json +26 -0
- package/registry/r/alert.json +23 -0
- package/registry/r/aspect-ratio.json +21 -0
- package/registry/r/avatar-fallback.json +16 -0
- package/registry/r/avatar.json +23 -0
- package/registry/r/badge.json +23 -0
- package/registry/r/breadcrumb-item.json +16 -0
- package/registry/r/breadcrumb-link.json +16 -0
- package/registry/r/breadcrumb-separator.json +16 -0
- package/registry/r/breadcrumb.json +21 -0
- package/registry/r/button-group.json +21 -0
- package/registry/r/button.json +23 -0
- package/registry/r/calendar.json +23 -0
- package/registry/r/card.json +21 -0
- package/registry/r/carousel.json +18 -0
- package/registry/r/checkbox.json +23 -0
- package/registry/r/collapsible.json +21 -0
- package/registry/r/context-menu-trigger.json +23 -0
- package/registry/r/context-menu.json +28 -0
- package/registry/r/country-selector.json +31 -0
- package/registry/r/data-table.json +38 -0
- package/registry/r/date-picker.json +27 -0
- package/registry/r/date-range-picker.json +32 -0
- package/registry/r/dropdown-item.json +21 -0
- package/registry/r/dropdown-label.json +16 -0
- package/registry/r/dropdown-menu.json +16 -0
- package/registry/r/dropdown-separator.json +16 -0
- package/registry/r/dropdown-trigger.json +20 -0
- package/registry/r/empty-state.json +23 -0
- package/registry/r/hover-card.json +23 -0
- package/registry/r/input.json +21 -0
- package/registry/r/label.json +21 -0
- package/registry/r/masked-input.json +21 -0
- package/registry/r/modal.json +36 -0
- package/registry/r/multi-select.json +33 -0
- package/registry/r/otp-group.json +16 -0
- package/registry/r/otp-slot.json +21 -0
- package/registry/r/otp.json +21 -0
- package/registry/r/pagination.json +32 -0
- package/registry/r/phone-number-input.json +34 -0
- package/registry/r/popover-content.json +21 -0
- package/registry/r/popover.json +18 -0
- package/registry/r/progress.json +21 -0
- package/registry/r/radio-group.json +26 -0
- package/registry/r/radio-item.json +26 -0
- package/registry/r/range-calendar.json +28 -0
- package/registry/r/resizable-panel-item.json +23 -0
- package/registry/r/resizable-panel.json +23 -0
- package/registry/r/resizable.json +21 -0
- package/registry/r/scroll-area.json +21 -0
- package/registry/r/segment.json +21 -0
- package/registry/r/select-group.json +21 -0
- package/registry/r/select-item.json +26 -0
- package/registry/r/select-separator.json +21 -0
- package/registry/r/select.json +31 -0
- package/registry/r/separator.json +21 -0
- package/registry/r/sheet-wrapper.json +31 -0
- package/registry/r/sheet.json +21 -0
- package/registry/r/sidebar.json +21 -0
- package/registry/r/skeleton.json +23 -0
- package/registry/r/slider.json +21 -0
- package/registry/r/switch.json +23 -0
- package/registry/r/tabs.json +23 -0
- package/registry/r/tag-input.json +25 -0
- package/registry/r/textarea.json +21 -0
- package/registry/r/toaster.json +26 -0
- package/registry/r/toggle-group.json +25 -0
- package/registry/r/toggle.json +23 -0
- package/registry/r/tolle-cell.json +16 -0
- package/registry/r/tooltip.json +23 -0
- package/registry/registry.json +1540 -0
- package/theme.css +56 -1
|
@@ -2,6 +2,7 @@ import { Injectable, Inject, PLATFORM_ID, Optional } from '@angular/core';
|
|
|
2
2
|
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
|
|
3
3
|
import { TOLLE_CONFIG } from './tolle-config';
|
|
4
4
|
import { BehaviorSubject } from 'rxjs';
|
|
5
|
+
import { hexToRgb, radiusScale, generateThemeCss, generateBaseCss, generateChartCss } from './utils/color';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
export class ThemeService {
|
|
7
8
|
document;
|
|
@@ -11,6 +12,8 @@ export class ThemeService {
|
|
|
11
12
|
_isDark = new BehaviorSubject(false);
|
|
12
13
|
isDark$ = this._isDark.asObservable();
|
|
13
14
|
styleId = 'tolle-dynamic-theme';
|
|
15
|
+
baseStyleId = 'tolle-base-theme';
|
|
16
|
+
chartStyleId = 'tolle-chart-theme';
|
|
14
17
|
constructor(document, platformId, config, rendererFactory) {
|
|
15
18
|
this.document = document;
|
|
16
19
|
this.platformId = platformId;
|
|
@@ -55,10 +58,99 @@ export class ThemeService {
|
|
|
55
58
|
else if (this.config?.radius) {
|
|
56
59
|
this.setRadius(this.config.radius, false);
|
|
57
60
|
}
|
|
61
|
+
// Apply Base (neutral) color (saved > config > theme.css default = zinc)
|
|
62
|
+
const savedBase = localStorage.getItem('tolle-base-color');
|
|
63
|
+
if (savedBase) {
|
|
64
|
+
this.setBaseColor(savedBase, false);
|
|
65
|
+
}
|
|
66
|
+
else if (this.config?.baseColor) {
|
|
67
|
+
this.setBaseColor(this.config.baseColor, false);
|
|
68
|
+
}
|
|
69
|
+
// Apply Chart color (saved > config)
|
|
70
|
+
const savedChart = localStorage.getItem('tolle-chart-color');
|
|
71
|
+
if (savedChart) {
|
|
72
|
+
this.setChartColor(savedChart, false);
|
|
73
|
+
}
|
|
74
|
+
else if (this.config?.chartColor) {
|
|
75
|
+
this.setChartColor(this.config.chartColor, false);
|
|
76
|
+
}
|
|
77
|
+
// Apply Typography (saved preference > config default > theme.css default)
|
|
78
|
+
for (const kind of ['sans', 'serif', 'mono']) {
|
|
79
|
+
const saved = localStorage.getItem(`tolle-font-${kind}`);
|
|
80
|
+
const fromConfig = this.config?.[`font${kind[0].toUpperCase()}${kind.slice(1)}`];
|
|
81
|
+
if (saved) {
|
|
82
|
+
this.setFont(kind, saved, false);
|
|
83
|
+
}
|
|
84
|
+
else if (fromConfig) {
|
|
85
|
+
this.setFont(kind, fromConfig, false);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
58
88
|
if (!savedTheme) {
|
|
59
89
|
localStorage.setItem('tolle-theme', shouldBeDark ? 'dark' : 'light');
|
|
60
90
|
}
|
|
61
91
|
}
|
|
92
|
+
/** Set a typography stack (`--font-sans` / `--font-serif` / `--font-mono`). */
|
|
93
|
+
setFont(kind, stack, persist = true) {
|
|
94
|
+
if (!isPlatformBrowser(this.platformId))
|
|
95
|
+
return;
|
|
96
|
+
this.renderer.setStyle(this.document.documentElement, `--font-${kind}`, stack);
|
|
97
|
+
if (persist) {
|
|
98
|
+
localStorage.setItem(`tolle-font-${kind}`, stack);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Read the current stack for a font role from the live document. */
|
|
102
|
+
getFont(kind) {
|
|
103
|
+
if (!isPlatformBrowser(this.platformId))
|
|
104
|
+
return '';
|
|
105
|
+
return getComputedStyle(this.document.documentElement).getPropertyValue(`--font-${kind}`).trim();
|
|
106
|
+
}
|
|
107
|
+
/** Set light/dark explicitly (a directional companion to `toggleTheme`). */
|
|
108
|
+
setAppearance(mode, persist = true) {
|
|
109
|
+
mode === 'dark' ? this.enableDarkMode(persist) : this.disableDarkMode(persist);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Set the neutral base-color family (background/foreground/card/muted/border…).
|
|
113
|
+
* Accepts a family id: `zinc` | `slate` | `gray` | `neutral` | `stone`.
|
|
114
|
+
*/
|
|
115
|
+
setBaseColor(baseId, persist = true) {
|
|
116
|
+
if (!isPlatformBrowser(this.platformId))
|
|
117
|
+
return;
|
|
118
|
+
this.injectStyleById(this.baseStyleId, generateBaseCss(baseId));
|
|
119
|
+
if (persist)
|
|
120
|
+
localStorage.setItem('tolle-base-color', baseId);
|
|
121
|
+
}
|
|
122
|
+
/** Set the chart palette from a base hex; derives `--chart-1…5`. */
|
|
123
|
+
setChartColor(hex, persist = true) {
|
|
124
|
+
if (!isPlatformBrowser(this.platformId))
|
|
125
|
+
return;
|
|
126
|
+
this.injectStyleById(this.chartStyleId, generateChartCss(hex));
|
|
127
|
+
if (persist)
|
|
128
|
+
localStorage.setItem('tolle-chart-color', hex);
|
|
129
|
+
}
|
|
130
|
+
/** Read the current base-color family id (persisted), or null. */
|
|
131
|
+
get baseColor() {
|
|
132
|
+
if (!isPlatformBrowser(this.platformId))
|
|
133
|
+
return null;
|
|
134
|
+
return localStorage.getItem('tolle-base-color');
|
|
135
|
+
}
|
|
136
|
+
/** Read the current chart base color (persisted), or null. */
|
|
137
|
+
get chartColor() {
|
|
138
|
+
if (!isPlatformBrowser(this.platformId))
|
|
139
|
+
return null;
|
|
140
|
+
return localStorage.getItem('tolle-chart-color');
|
|
141
|
+
}
|
|
142
|
+
/** Upsert a keyed <style> element in <head> with the given CSS text. */
|
|
143
|
+
injectStyleById(id, css) {
|
|
144
|
+
if (!isPlatformBrowser(this.platformId))
|
|
145
|
+
return;
|
|
146
|
+
const existing = this.document.getElementById(id);
|
|
147
|
+
if (existing)
|
|
148
|
+
existing.remove();
|
|
149
|
+
const el = this.document.createElement('style');
|
|
150
|
+
el.id = id;
|
|
151
|
+
el.textContent = css;
|
|
152
|
+
this.renderer.appendChild(this.document.head, el);
|
|
153
|
+
}
|
|
62
154
|
setRadius(radius, persist = true) {
|
|
63
155
|
if (!isPlatformBrowser(this.platformId))
|
|
64
156
|
return;
|
|
@@ -72,22 +164,17 @@ export class ThemeService {
|
|
|
72
164
|
}
|
|
73
165
|
updateAllRadiusVariables(baseRadius) {
|
|
74
166
|
const root = this.document.documentElement;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if (!radiusMatch) {
|
|
167
|
+
const scale = radiusScale(baseRadius);
|
|
168
|
+
if (!scale) {
|
|
78
169
|
console.warn(`Invalid radius format: ${baseRadius}. Using default values.`);
|
|
79
170
|
return;
|
|
80
171
|
}
|
|
81
|
-
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
this.renderer.setStyle(root, '--radius-xl', `${numericValue * 2}${unit}`);
|
|
88
|
-
this.renderer.setStyle(root, '--radius-2xl', `${numericValue * 3}${unit}`);
|
|
89
|
-
this.renderer.setStyle(root, '--radius-3xl', `${numericValue * 4}${unit}`);
|
|
90
|
-
this.renderer.setStyle(root, '--radius-full', '9999px');
|
|
172
|
+
// `--radius` itself is set by setRadius(); apply the derived scale here.
|
|
173
|
+
for (const [name, value] of Object.entries(scale)) {
|
|
174
|
+
if (name === '--radius')
|
|
175
|
+
continue;
|
|
176
|
+
this.renderer.setStyle(root, name, value);
|
|
177
|
+
}
|
|
91
178
|
}
|
|
92
179
|
updateRadiusInDynamicStyles(radius) {
|
|
93
180
|
const existingStyle = this.document.getElementById(this.styleId);
|
|
@@ -127,125 +214,10 @@ export class ThemeService {
|
|
|
127
214
|
}
|
|
128
215
|
}
|
|
129
216
|
generatePrimaryShades(baseColor) {
|
|
130
|
-
|
|
131
|
-
const rgbString = rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '37 99 235';
|
|
132
|
-
const ringLight = this.lightenColor(baseColor, 40);
|
|
133
|
-
const ringLightRgb = this.hexToRgb(ringLight);
|
|
134
|
-
const ringLightRgbString = ringLightRgb ? `${ringLightRgb.r} ${ringLightRgb.g} ${ringLightRgb.b}` : '96 165 250';
|
|
135
|
-
const ringDark = this.lightenColor(baseColor, 20);
|
|
136
|
-
const ringDarkRgb = this.hexToRgb(ringDark);
|
|
137
|
-
const ringDarkRgbString = ringDarkRgb ? `${ringDarkRgb.r} ${ringDarkRgb.g} ${ringDarkRgb.b}` : '147 197 253';
|
|
138
|
-
// Get current radius or default
|
|
217
|
+
// Radius is read from the DOM here; the token math lives in utils/color.
|
|
139
218
|
const root = this.document.documentElement;
|
|
140
219
|
const currentRadius = getComputedStyle(root).getPropertyValue('--radius').trim() || '0.5rem';
|
|
141
|
-
|
|
142
|
-
const radiusMatch = currentRadius.match(/^(\d*\.?\d+)([a-z]+|%)$/);
|
|
143
|
-
let radiusVariables = '';
|
|
144
|
-
if (radiusMatch) {
|
|
145
|
-
const numericValue = parseFloat(radiusMatch[1]);
|
|
146
|
-
const unit = radiusMatch[2];
|
|
147
|
-
radiusVariables = `
|
|
148
|
-
--radius: ${currentRadius};
|
|
149
|
-
--radius-sm: ${numericValue * 0.5}${unit};
|
|
150
|
-
--radius-md: ${numericValue}${unit};
|
|
151
|
-
--radius-lg: ${numericValue * 1.5}${unit};
|
|
152
|
-
--radius-xl: ${numericValue * 2}${unit};
|
|
153
|
-
--radius-2xl: ${numericValue * 3}${unit};
|
|
154
|
-
--radius-3xl: ${numericValue * 4}${unit};
|
|
155
|
-
--radius-full: 9999px;
|
|
156
|
-
`;
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
radiusVariables = `--radius: ${currentRadius};`;
|
|
160
|
-
}
|
|
161
|
-
const css = `
|
|
162
|
-
:root {
|
|
163
|
-
--primary: ${rgbString};
|
|
164
|
-
--primary-foreground: ${this.getContrastColorRgb(baseColor)};
|
|
165
|
-
${radiusVariables}
|
|
166
|
-
--primary-50: ${this.hexToRgbString(this.lightenColor(baseColor, 90))};
|
|
167
|
-
--primary-100: ${this.hexToRgbString(this.lightenColor(baseColor, 80))};
|
|
168
|
-
--primary-200: ${this.hexToRgbString(this.lightenColor(baseColor, 60))};
|
|
169
|
-
--primary-300: ${this.hexToRgbString(this.lightenColor(baseColor, 40))};
|
|
170
|
-
--primary-400: ${this.hexToRgbString(this.lightenColor(baseColor, 20))};
|
|
171
|
-
--primary-500: ${rgbString};
|
|
172
|
-
--primary-600: ${this.hexToRgbString(this.darkenColor(baseColor, 20))};
|
|
173
|
-
--primary-700: ${this.hexToRgbString(this.darkenColor(baseColor, 40))};
|
|
174
|
-
--primary-800: ${this.hexToRgbString(this.darkenColor(baseColor, 60))};
|
|
175
|
-
--primary-900: ${this.hexToRgbString(this.darkenColor(baseColor, 80))};
|
|
176
|
-
--ring: ${ringLightRgbString};
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
.dark {
|
|
180
|
-
--primary: ${rgbString};
|
|
181
|
-
--primary-foreground: ${this.getContrastColorRgb(baseColor)};
|
|
182
|
-
${radiusVariables}
|
|
183
|
-
--primary-50: ${this.hexToRgbString(this.darkenColor(baseColor, 85))};
|
|
184
|
-
--primary-100: ${this.hexToRgbString(this.darkenColor(baseColor, 75))};
|
|
185
|
-
--primary-200: ${this.hexToRgbString(this.darkenColor(baseColor, 65))};
|
|
186
|
-
--primary-300: ${this.hexToRgbString(this.darkenColor(baseColor, 55))};
|
|
187
|
-
--primary-400: ${this.hexToRgbString(this.darkenColor(baseColor, 45))};
|
|
188
|
-
--primary-500: ${rgbString};
|
|
189
|
-
--primary-600: ${this.hexToRgbString(this.lightenColor(baseColor, 20))};
|
|
190
|
-
--primary-700: ${this.hexToRgbString(this.lightenColor(baseColor, 35))};
|
|
191
|
-
--primary-800: ${this.hexToRgbString(this.lightenColor(baseColor, 50))};
|
|
192
|
-
--primary-900: ${this.hexToRgbString(this.lightenColor(baseColor, 65))};
|
|
193
|
-
--ring: ${ringDarkRgbString};
|
|
194
|
-
}
|
|
195
|
-
`;
|
|
196
|
-
this.injectDynamicStyles(css);
|
|
197
|
-
}
|
|
198
|
-
hexToRgb(hex) {
|
|
199
|
-
const cleanedHex = hex.replace('#', '');
|
|
200
|
-
let r = 0, g = 0, b = 0;
|
|
201
|
-
if (cleanedHex.length === 3) {
|
|
202
|
-
r = parseInt(cleanedHex[0] + cleanedHex[0], 16);
|
|
203
|
-
g = parseInt(cleanedHex[1] + cleanedHex[1], 16);
|
|
204
|
-
b = parseInt(cleanedHex[2] + cleanedHex[2], 16);
|
|
205
|
-
return { r, g, b };
|
|
206
|
-
}
|
|
207
|
-
if (cleanedHex.length === 6) {
|
|
208
|
-
r = parseInt(cleanedHex.substring(0, 2), 16);
|
|
209
|
-
g = parseInt(cleanedHex.substring(2, 4), 16);
|
|
210
|
-
b = parseInt(cleanedHex.substring(4, 6), 16);
|
|
211
|
-
return { r, g, b };
|
|
212
|
-
}
|
|
213
|
-
return null;
|
|
214
|
-
}
|
|
215
|
-
hexToRgbString(hexColor) {
|
|
216
|
-
const rgb = this.hexToRgb(hexColor);
|
|
217
|
-
return rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '37 99 235';
|
|
218
|
-
}
|
|
219
|
-
getContrastColorRgb(hexColor) {
|
|
220
|
-
const contrast = this.getContrastColor(hexColor);
|
|
221
|
-
const rgb = this.hexToRgb(contrast);
|
|
222
|
-
return rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '255 255 255';
|
|
223
|
-
}
|
|
224
|
-
lightenColor(color, percent) {
|
|
225
|
-
const rgb = this.hexToRgb(color);
|
|
226
|
-
if (!rgb)
|
|
227
|
-
return color;
|
|
228
|
-
const r = Math.min(255, Math.floor(rgb.r + (255 - rgb.r) * (percent / 100)));
|
|
229
|
-
const g = Math.min(255, Math.floor(rgb.g + (255 - rgb.g) * (percent / 100)));
|
|
230
|
-
const b = Math.min(255, Math.floor(rgb.b + (255 - rgb.b) * (percent / 100)));
|
|
231
|
-
return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
|
|
232
|
-
}
|
|
233
|
-
darkenColor(color, percent) {
|
|
234
|
-
const rgb = this.hexToRgb(color);
|
|
235
|
-
if (!rgb)
|
|
236
|
-
return color;
|
|
237
|
-
const factor = 1 - (percent / 100);
|
|
238
|
-
const r = Math.max(0, Math.floor(rgb.r * factor));
|
|
239
|
-
const g = Math.max(0, Math.floor(rgb.g * factor));
|
|
240
|
-
const b = Math.max(0, Math.floor(rgb.b * factor));
|
|
241
|
-
return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;
|
|
242
|
-
}
|
|
243
|
-
getContrastColor(hexColor) {
|
|
244
|
-
const rgb = this.hexToRgb(hexColor);
|
|
245
|
-
if (!rgb)
|
|
246
|
-
return '#ffffff';
|
|
247
|
-
const luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
|
|
248
|
-
return luminance > 0.5 ? '#000000' : '#ffffff';
|
|
220
|
+
this.injectDynamicStyles(generateThemeCss(baseColor, currentRadius));
|
|
249
221
|
}
|
|
250
222
|
injectDynamicStyles(css) {
|
|
251
223
|
if (!isPlatformBrowser(this.platformId))
|
|
@@ -281,7 +253,7 @@ export class ThemeService {
|
|
|
281
253
|
if (!isPlatformBrowser(this.platformId))
|
|
282
254
|
return;
|
|
283
255
|
this.generatePrimaryShades(color);
|
|
284
|
-
const rgb =
|
|
256
|
+
const rgb = hexToRgb(color);
|
|
285
257
|
if (rgb) {
|
|
286
258
|
this.renderer.setStyle(this.document.documentElement, '--primary', `${rgb.r} ${rgb.g} ${rgb.b}`);
|
|
287
259
|
}
|
|
@@ -311,9 +283,11 @@ export class ThemeService {
|
|
|
311
283
|
resetToConfigDefaults() {
|
|
312
284
|
if (!isPlatformBrowser(this.platformId))
|
|
313
285
|
return;
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
286
|
+
['tolle-theme', 'tolle-primary-color', 'tolle-radius', 'tolle-base-color', 'tolle-chart-color',
|
|
287
|
+
'tolle-font-sans', 'tolle-font-serif', 'tolle-font-mono']
|
|
288
|
+
.forEach((k) => localStorage.removeItem(k));
|
|
289
|
+
this.document.getElementById(this.baseStyleId)?.remove();
|
|
290
|
+
this.document.getElementById(this.chartStyleId)?.remove();
|
|
317
291
|
this.initializeTheme();
|
|
318
292
|
}
|
|
319
293
|
getUserPreferences() {
|
|
@@ -328,9 +302,11 @@ export class ThemeService {
|
|
|
328
302
|
clearUserPreferences() {
|
|
329
303
|
if (!isPlatformBrowser(this.platformId))
|
|
330
304
|
return;
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
305
|
+
['tolle-theme', 'tolle-primary-color', 'tolle-radius', 'tolle-base-color', 'tolle-chart-color',
|
|
306
|
+
'tolle-font-sans', 'tolle-font-serif', 'tolle-font-mono']
|
|
307
|
+
.forEach((k) => localStorage.removeItem(k));
|
|
308
|
+
this.document.getElementById(this.baseStyleId)?.remove();
|
|
309
|
+
this.document.getElementById(this.chartStyleId)?.remove();
|
|
334
310
|
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
335
311
|
if (systemPrefersDark) {
|
|
336
312
|
this.enableDarkMode(false);
|
|
@@ -369,4 +345,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
369
345
|
type: Inject,
|
|
370
346
|
args: [TOLLE_CONFIG]
|
|
371
347
|
}] }, { type: i0.RendererFactory2 }] });
|
|
372
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBR3ZDLE1BQU0sT0FBTyxZQUFZO0lBUUs7SUFDRztJQUNhO0lBVHBDLFFBQVEsQ0FBWTtJQUNwQixPQUFPLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFckMsT0FBTyxHQUFHLHFCQUFxQixDQUFDO0lBRXhDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFFaEQsc0VBQXNFO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxD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QUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0UsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFTyxXQUFXLENBQUMsS0FBYSxFQUFFLE9BQWU7UUFDaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUVsRCxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFB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QVZ2QixZQUFZLGNBREMsTUFBTTs7NEZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFTN0IsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIFBMQVRGT1JNX0lELCBPcHRpb25hbCwgUmVuZGVyZXIyLCBSZW5kZXJlckZhY3RvcnkyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3Nlcn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRPTExFX0NPTkZJRywgVG9sbGVDb25maWcgfSBmcm9tICcuL3RvbGxlLWNvbmZpZyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHByaXZhdGUgX2lzRGFyayA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgaXNEYXJrJCA9IHRoaXMuX2lzRGFyay5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHN0eWxlSWQgPSAndG9sbGUtZHluYW1pYy10aGVtZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBvYmplY3QsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChUT0xMRV9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBUb2xsZUNvbmZpZyxcbiAgICByZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTJcbiAgKSB7XG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcbiAgICB0aGlzLmluaXRpYWxpemVUaGVtZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGhlbWUoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICAvLyBMT0dJQzogVXNlciBTYXZlZCBQcmVmZXJlbmNlcyA+IENvbmZpZyBEZWZhdWx0cyA+IFN5c3RlbSBQcmVmZXJlbmNlXG4gICAgY29uc3Qgc2F2ZWRUaGVtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS10aGVtZScpO1xuICAgIGNvbnN0IHNhdmVkUHJpbWFyeSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gICAgY29uc3Qgc2F2ZWRSYWRpdXMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcmFkaXVzJyk7XG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG5cbiAgICAvLyBEZXRlcm1pbmUgRGFyay9MaWdodCBNb2RlXG4gICAgbGV0IHNob3VsZEJlRGFyayA9IHN5c3RlbVByZWZlcnNEYXJrO1xuXG4gICAgaWYgKHNhdmVkVGhlbWUpIHtcbiAgICAgIHNob3VsZEJlRGFyayA9IHNhdmVkVGhlbWUgPT09ICdkYXJrJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5kYXJrQnlEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNob3VsZEJlRGFyayA9IHRoaXMuY29uZmlnLmRhcmtCeURlZmF1bHQ7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgdGhlbWUgbW9kZVxuICAgIGlmIChzaG91bGRCZURhcmspIHtcbiAgICAgIHRoaXMuZW5hYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVEYXJrTW9kZShmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgUHJpbWFyeSBDb2xvclxuICAgIGlmIChzYXZlZFByaW1hcnkpIHtcbiAgICAgIHRoaXMuc2V0UHJpbWFyeUNvbG9yKHNhdmVkUHJpbWFyeSwgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LnByaW1hcnlDb2xvcikge1xuICAgICAgdGhpcy5zZXRQcmltYXJ5Q29sb3IodGhpcy5jb25maWcucHJpbWFyeUNvbG9yLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgUmFkaXVzXG4gICAgaWYgKHNhdmVkUmFkaXVzKSB7XG4gICAgICB0aGlzLnNldFJhZGl1cyhzYXZlZFJhZGl1cywgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LnJhZGl1cykge1xuICAgICAgdGhpcy5zZXRSYWRpdXModGhpcy5jb25maWcucmFkaXVzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKCFzYXZlZFRoZW1lKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCBzaG91bGRCZURhcmsgPyAnZGFyaycgOiAnbGlnaHQnKTtcbiAgICB9XG4gIH1cblxuICBzZXRSYWRpdXMocmFkaXVzOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCAnLS1yYWRpdXMnLCByYWRpdXMpO1xuICAgIHRoaXMudXBkYXRlUmFkaXVzSW5EeW5hbWljU3R5bGVzKHJhZGl1cyk7XG4gICAgdGhpcy51cGRhdGVBbGxSYWRpdXNWYXJpYWJsZXMocmFkaXVzKTtcblxuICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtcmFkaXVzJywgcmFkaXVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUFsbFJhZGl1c1ZhcmlhYmxlcyhiYXNlUmFkaXVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAvLyBQYXJzZSB0aGUgcmFkaXVzIHRvIGV4dHJhY3QgbnVtZXJpYyB2YWx1ZSBhbmQgdW5pdFxuICAgIGNvbnN0IHJhZGl1c01hdGNoID0gYmFzZVJhZGl1cy5tYXRjaCgvXihcXGQqXFwuP1xcZCspKFthLXpdK3wlKSQvKTtcbiAgICBpZiAoIXJhZGl1c01hdGNoKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEludmFsaWQgcmFkaXVzIGZvcm1hdDogJHtiYXNlUmFkaXVzfS4gVXNpbmcgZGVmYXVsdCB2YWx1ZXMuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgY29uc3QgdW5pdCA9IHJhZGl1c01hdGNoWzJdO1xuXG4gICAgLy8gU2V0IGFsbCByYWRpdXMgdmFyaWFibGVzIGFjY29yZGluZyB0byB5b3VyIENTUyBjbGFzc2VzXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCAnLS1yYWRpdXMtc20nLCBgJHtudW1lcmljVmFsdWUgKiAwLjV9JHt1bml0fWApO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm9vdCwgJy0tcmFkaXVzLW1kJywgYCR7bnVtZXJpY1ZhbHVlfSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy1sZycsIGAke251bWVyaWNWYWx1ZSAqIDEuNX0ke3VuaXR9YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCAnLS1yYWRpdXMteGwnLCBgJHtudW1lcmljVmFsdWUgKiAyfSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy0yeGwnLCBgJHtudW1lcmljVmFsdWUgKiAzfSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy0zeGwnLCBgJHtudW1lcmljVmFsdWUgKiA0fSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy1mdWxsJywgJzk5OTlweCcpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSYWRpdXNJbkR5bmFtaWNTdHlsZXMocmFkaXVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuXG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGxldCBjc3MgPSBleGlzdGluZ1N0eWxlLnRleHRDb250ZW50IHx8ICcnO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgcmFkaXVzIHRvIGNhbGN1bGF0ZSBkZXJpdmVkIHZhbHVlc1xuICAgICAgY29uc3QgcmFkaXVzTWF0Y2ggPSByYWRpdXMubWF0Y2goL14oXFxkKlxcLj9cXGQrKShbYS16XSt8JSkkLyk7XG4gICAgICBpZiAocmFkaXVzTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgICAgIGNvbnN0IHVuaXQgPSByYWRpdXNNYXRjaFsyXTtcblxuICAgICAgICBjb25zdCBkZXJpdmVkUmFkaWkgPSB7XG4gICAgICAgICAgJy0tcmFkaXVzLXNtJzogYCR7bnVtZXJpY1ZhbHVlICogMC41fSR7dW5pdH1gLFxuICAgICAgICAgICctLXJhZGl1cy1tZCc6IGAke251bWVyaWNWYWx1ZX0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtbGcnOiBgJHtudW1lcmljVmFsdWUgKiAxLjV9JHt1bml0fWAsXG4gICAgICAgICAgJy0tcmFkaXVzLXhsJzogYCR7bnVtZXJpY1ZhbHVlICogMn0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtMnhsJzogYCR7bnVtZXJpY1ZhbHVlICogM30ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtM3hsJzogYCR7bnVtZXJpY1ZhbHVlICogNH0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtZnVsbCc6ICc5OTk5cHgnXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVXBkYXRlIGJhc2UgcmFkaXVzXG4gICAgICAgIGlmIChjc3MuaW5jbHVkZXMoJy0tcmFkaXVzOicpKSB7XG4gICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UoLy0tcmFkaXVzOlteO10rOy9nLCBgLS1yYWRpdXM6ICR7cmFkaXVzfTtgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBhbGwgZGVyaXZlZCByYWRpdXMgdmFyaWFibGVzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGRlcml2ZWRSYWRpaSkuZm9yRWFjaCgoW3Zhck5hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGlmIChjc3MuaW5jbHVkZXModmFyTmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgJHt2YXJOYW1lfTpbXjtdKztgLCAnZycpO1xuICAgICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UocmVnZXgsIGAke3Zhck5hbWV9OiAke3ZhbHVlfTtgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSB2YXJpYWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICBjc3MgPSBjc3MucmVwbGFjZSgvOnJvb3RcXHMqey8sIGA6cm9vdCB7XFxuICAgICAgJHt2YXJOYW1lfTogJHt2YWx1ZX07YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZXhpc3RpbmdTdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUHJpbWFyeVNoYWRlcyhiYXNlQ29sb3I6IHN0cmluZykge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoYmFzZUNvbG9yKTtcbiAgICBjb25zdCByZ2JTdHJpbmcgPSByZ2IgPyBgJHtyZ2Iucn0gJHtyZ2IuZ30gJHtyZ2IuYn1gIDogJzM3IDk5IDIzNSc7XG5cbiAgICBjb25zdCByaW5nTGlnaHQgPSB0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDQwKTtcbiAgICBjb25zdCByaW5nTGlnaHRSZ2IgPSB0aGlzLmhleFRvUmdiKHJpbmdMaWdodCk7XG4gICAgY29uc3QgcmluZ0xpZ2h0UmdiU3RyaW5nID0gcmluZ0xpZ2h0UmdiID8gYCR7cmluZ0xpZ2h0UmdiLnJ9ICR7cmluZ0xpZ2h0UmdiLmd9ICR7cmluZ0xpZ2h0UmdiLmJ9YCA6ICc5NiAxNjUgMjUwJztcblxuICAgIGNvbnN0IHJpbmdEYXJrID0gdGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAyMCk7XG4gICAgY29uc3QgcmluZ0RhcmtSZ2IgPSB0aGlzLmhleFRvUmdiKHJpbmdEYXJrKTtcbiAgICBjb25zdCByaW5nRGFya1JnYlN0cmluZyA9IHJpbmdEYXJrUmdiID8gYCR7cmluZ0RhcmtSZ2Iucn0gJHtyaW5nRGFya1JnYi5nfSAke3JpbmdEYXJrUmdiLmJ9YCA6ICcxNDcgMTk3IDI1Myc7XG5cbiAgICAvLyBHZXQgY3VycmVudCByYWRpdXMgb3IgZGVmYXVsdFxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50UmFkaXVzID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXJhZGl1cycpLnRyaW0oKSB8fCAnMC41cmVtJztcblxuICAgIC8vIENhbGN1bGF0ZSBhbGwgZGVyaXZlZCByYWRpdXMgdmFsdWVzXG4gICAgY29uc3QgcmFkaXVzTWF0Y2ggPSBjdXJyZW50UmFkaXVzLm1hdGNoKC9eKFxcZCpcXC4/XFxkKykoW2Etel0rfCUpJC8pO1xuICAgIGxldCByYWRpdXNWYXJpYWJsZXMgPSAnJztcblxuICAgIGlmIChyYWRpdXNNYXRjaCkge1xuICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgICBjb25zdCB1bml0ID0gcmFkaXVzTWF0Y2hbMl07XG5cbiAgICAgIHJhZGl1c1ZhcmlhYmxlcyA9IGBcbiAgICAgICAgLS1yYWRpdXM6ICR7Y3VycmVudFJhZGl1c307XG4gICAgICAgIC0tcmFkaXVzLXNtOiAke251bWVyaWNWYWx1ZSAqIDAuNX0ke3VuaXR9O1xuICAgICAgICAtLXJhZGl1cy1tZDogJHtudW1lcmljVmFsdWV9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtbGc6ICR7bnVtZXJpY1ZhbHVlICogMS41fSR7dW5pdH07XG4gICAgICAgIC0tcmFkaXVzLXhsOiAke251bWVyaWNWYWx1ZSAqIDJ9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtMnhsOiAke251bWVyaWNWYWx1ZSAqIDN9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtM3hsOiAke251bWVyaWNWYWx1ZSAqIDR9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuICAgICAgYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFkaXVzVmFyaWFibGVzID0gYC0tcmFkaXVzOiAke2N1cnJlbnRSYWRpdXN9O2A7XG4gICAgfVxuXG4gICAgY29uc3QgY3NzID0gYFxuICAgICAgOnJvb3Qge1xuICAgICAgICAtLXByaW1hcnk6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LWZvcmVncm91bmQ6ICR7dGhpcy5nZXRDb250cmFzdENvbG9yUmdiKGJhc2VDb2xvcil9O1xuICAgICAgICAke3JhZGl1c1ZhcmlhYmxlc31cbiAgICAgICAgLS1wcmltYXJ5LTUwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA5MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTEwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgODApKX07XG4gICAgICAgIC0tcHJpbWFyeS0yMDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDYwKSl9O1xuICAgICAgICAtLXByaW1hcnktMzAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA0MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTQwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgMjApKX07XG4gICAgICAgIC0tcHJpbWFyeS01MDA6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LTYwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCAyMCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTcwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA0MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTgwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA2MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTkwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA4MCkpfTtcbiAgICAgICAgLS1yaW5nOiAke3JpbmdMaWdodFJnYlN0cmluZ307XG4gICAgICB9XG5cbiAgICAgIC5kYXJrIHtcbiAgICAgICAgLS1wcmltYXJ5OiAke3JnYlN0cmluZ307XG4gICAgICAgIC0tcHJpbWFyeS1mb3JlZ3JvdW5kOiAke3RoaXMuZ2V0Q29udHJhc3RDb2xvclJnYihiYXNlQ29sb3IpfTtcbiAgICAgICAgJHtyYWRpdXNWYXJpYWJsZXN9XG4gICAgICAgIC0tcHJpbWFyeS01MDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA4NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTEwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA3NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTIwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA2NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTMwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA1NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTQwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA0NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTUwMDogJHtyZ2JTdHJpbmd9O1xuICAgICAgICAtLXByaW1hcnktNjAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAyMCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTcwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgMzUpKX07XG4gICAgICAgIC0tcHJpbWFyeS04MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDUwKSl9O1xuICAgICAgICAtLXByaW1hcnktOTAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA2NSkpfTtcbiAgICAgICAgLS1yaW5nOiAke3JpbmdEYXJrUmdiU3RyaW5nfTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgdGhpcy5pbmplY3REeW5hbWljU3R5bGVzKGNzcyk7XG4gIH1cblxuICBwcml2YXRlIGhleFRvUmdiKGhleDogc3RyaW5nKTogeyByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBjbGVhbmVkSGV4ID0gaGV4LnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgbGV0IHIgPSAwLCBnID0gMCwgYiA9IDA7XG5cbiAgICBpZiAoY2xlYW5lZEhleC5sZW5ndGggPT09IDMpIHtcbiAgICAgIHIgPSBwYXJzZUludChjbGVhbmVkSGV4WzBdICsgY2xlYW5lZEhleFswXSwgMTYpO1xuICAgICAgZyA9IHBhcnNlSW50KGNsZWFuZWRIZXhbMV0gKyBjbGVhbmVkSGV4WzFdLCAxNik7XG4gICAgICBiID0gcGFyc2VJbnQoY2xlYW5lZEhleFsyXSArIGNsZWFuZWRIZXhbMl0sIDE2KTtcbiAgICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbiAgICB9XG5cbiAgICBpZiAoY2xlYW5lZEhleC5sZW5ndGggPT09IDYpIHtcbiAgICAgIHIgPSBwYXJzZUludChjbGVhbmVkSGV4LnN1YnN0cmluZygwLCAyKSwgMTYpO1xuICAgICAgZyA9IHBhcnNlSW50KGNsZWFuZWRIZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XG4gICAgICBiID0gcGFyc2VJbnQoY2xlYW5lZEhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcbiAgICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGV4VG9SZ2JTdHJpbmcoaGV4Q29sb3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihoZXhDb2xvcik7XG4gICAgcmV0dXJuIHJnYiA/IGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWAgOiAnMzcgOTkgMjM1JztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udHJhc3RDb2xvclJnYihoZXhDb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cmFzdCA9IHRoaXMuZ2V0Q29udHJhc3RDb2xvcihoZXhDb2xvcik7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihjb250cmFzdCk7XG4gICAgcmV0dXJuIHJnYiA/IGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWAgOiAnMjU1IDI1NSAyNTUnO1xuICB9XG5cbiAgcHJpdmF0ZSBsaWdodGVuQ29sb3IoY29sb3I6IHN0cmluZywgcGVyY2VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcbiAgICBpZiAoIXJnYikgcmV0dXJuIGNvbG9yO1xuXG4gICAgY29uc3QgciA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyZ2IuciArICgyNTUgLSByZ2IucikgKiAocGVyY2VudCAvIDEwMCkpKTtcbiAgICBjb25zdCBnID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHJnYi5nICsgKDI1NSAtIHJnYi5nKSAqIChwZXJjZW50IC8gMTAwKSkpO1xuICAgIGNvbnN0IGIgPSBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IocmdiLmIgKyAoMjU1IC0gcmdiLmIpICogKHBlcmNlbnQgLyAxMDApKSk7XG5cbiAgICByZXR1cm4gYCMkeygoMSA8PCAyNCkgKyAociA8PCAxNikgKyAoZyA8PCA4KSArIGIpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBkYXJrZW5Db2xvcihjb2xvcjogc3RyaW5nLCBwZXJjZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoY29sb3IpO1xuICAgIGlmICghcmdiKSByZXR1cm4gY29sb3I7XG5cbiAgICBjb25zdCBmYWN0b3IgPSAxIC0gKHBlcmNlbnQgLyAxMDApO1xuICAgIGNvbnN0IHIgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHJnYi5yICogZmFjdG9yKSk7XG4gICAgY29uc3QgZyA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmdiLmcgKiBmYWN0b3IpKTtcbiAgICBjb25zdCBiID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihyZ2IuYiAqIGZhY3RvcikpO1xuXG4gICAgcmV0dXJuIGAjJHtyLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7Zy50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke2IudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udHJhc3RDb2xvcihoZXhDb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGhleENvbG9yKTtcbiAgICBpZiAoIXJnYikgcmV0dXJuICcjZmZmZmZmJztcblxuICAgIGNvbnN0IGx1bWluYW5jZSA9ICgwLjI5OSAqIHJnYi5yICsgMC41ODcgKiByZ2IuZyArIDAuMTE0ICogcmdiLmIpIC8gMjU1O1xuICAgIHJldHVybiBsdW1pbmFuY2UgPiAwLjUgPyAnIzAwMDAwMCcgOiAnI2ZmZmZmZic7XG4gIH1cblxuICBwcml2YXRlIGluamVjdER5bmFtaWNTdHlsZXMoY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGV4aXN0aW5nU3R5bGUucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWxlbWVudC5pZCA9IHRoaXMuc3R5bGVJZDtcbiAgICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICB0b2dnbGVUaGVtZSgpIHtcbiAgICBjb25zdCBpc0N1cnJlbnRseURhcmsgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RhcmsnKTtcbiAgICBpc0N1cnJlbnRseURhcmsgPyB0aGlzLmRpc2FibGVEYXJrTW9kZSgpIDogdGhpcy5lbmFibGVEYXJrTW9kZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVEYXJrTW9kZShzYXZlVG9TdG9yYWdlID0gdHJ1ZSkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdkYXJrJyk7XG4gICAgaWYgKHNhdmVUb1N0b3JhZ2UpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS10aGVtZScsICdkYXJrJyk7XG4gICAgfVxuICAgIHRoaXMuX2lzRGFyay5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlRGFya01vZGUoc2F2ZVRvU3RvcmFnZSA9IHRydWUpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnZGFyaycpO1xuICAgIGlmIChzYXZlVG9TdG9yYWdlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnbGlnaHQnKTtcbiAgICB9XG4gICAgdGhpcy5faXNEYXJrLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgc2V0UHJpbWFyeUNvbG9yKGNvbG9yOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICB0aGlzLmdlbmVyYXRlUHJpbWFyeVNoYWRlcyhjb2xvcik7XG5cbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcbiAgICBpZiAocmdiKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgJy0tcHJpbWFyeScsXG4gICAgICAgIGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJywgY29sb3IpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjdXJyZW50VGhlbWUoKTogJ2RhcmsnIHwgJ2xpZ2h0JyB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGFyay5nZXRWYWx1ZSgpID8gJ2RhcmsnIDogJ2xpZ2h0JztcbiAgfVxuXG4gIGdldCBpc0RhcmsoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGFyay5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgZ2V0IHByaW1hcnlDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IGNzc1ZhbHVlID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXByaW1hcnknKS50cmltKCk7XG5cbiAgICBpZiAoY3NzVmFsdWUgJiYgY3NzVmFsdWUgIT09ICcnKSB7XG4gICAgICBjb25zdCByZ2JQYXJ0cyA9IGNzc1ZhbHVlLnNwbGl0KCcgJykubWFwKE51bWJlcik7XG4gICAgICBpZiAocmdiUGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBgIyR7cmdiUGFydHNbMF0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtyZ2JQYXJ0c1sxXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke3JnYlBhcnRzWzJdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gIH1cblxuICByZXNldFRvQ29uZmlnRGVmYXVsdHMoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtdGhlbWUnKTtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS1yYWRpdXMnKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZVRoZW1lKCk7XG4gIH1cblxuICBnZXRVc2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICB0aGVtZTogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXRoZW1lJyksXG4gICAgICBwcmltYXJ5Q29sb3I6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyksXG4gICAgICByYWRpdXM6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1yYWRpdXMnKVxuICAgIH07XG4gIH1cblxuICBjbGVhclVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS10aGVtZScpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvbGxlLXJhZGl1cycpO1xuXG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG4gICAgaWYgKHN5c3RlbVByZWZlcnNEYXJrKSB7XG4gICAgICB0aGlzLmVuYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXByaW1hcnknKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXJhZGl1cycpO1xuXG4gICAgLy8gQWxzbyByZW1vdmUgYWxsIGRlcml2ZWQgcmFkaXVzIHZhcmlhYmxlc1xuICAgIFsnLS1yYWRpdXMtc20nLCAnLS1yYWRpdXMtbWQnLCAnLS1yYWRpdXMtbGcnLCAnLS1yYWRpdXMteGwnLCAnLS1yYWRpdXMtMnhsJywgJy0tcmFkaXVzLTN4bCcsICctLXJhZGl1cy1mdWxsJ11cbiAgICAgIC5mb3JFYWNoKHZhck5hbWUgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsIHZhck5hbWUpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICBleGlzdGluZ1N0eWxlLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
348
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczRyxNQUFNLE9BQU8sWUFBWTtJQVVLO0lBQ0c7SUFDYTtJQVhwQyxRQUFRLENBQVk7SUFDcEIsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXJDLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQztJQUNoQyxXQUFXLEdBQUcsa0JBQWtCLENBQUM7SUFDakMsWUFBWSxHQUFHLG1CQUFtQixDQUFDO0lBRTNDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FB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Q0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1QywyQ0FBMkM7UUFDM0MsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUM7YUFDMUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVMLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQzt3R0F2V1UsWUFBWSxrQkFVYixRQUFRLGFBQ1IsV0FBVyxhQUNDLFlBQVk7NEdBWnZCLFlBQVksY0FEQyxNQUFNOzs0RkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQVc3QixNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQsIE9wdGlvbmFsLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVE9MTEVfQ09ORklHLCBUb2xsZUNvbmZpZyB9IGZyb20gJy4vdG9sbGUtY29uZmlnJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaGV4VG9SZ2IsIHJhZGl1c1NjYWxlLCBnZW5lcmF0ZVRoZW1lQ3NzLCBnZW5lcmF0ZUJhc2VDc3MsIGdlbmVyYXRlQ2hhcnRDc3MgfSBmcm9tICcuL3V0aWxzL2NvbG9yJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHByaXZhdGUgX2lzRGFyayA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgaXNEYXJrJCA9IHRoaXMuX2lzRGFyay5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHN0eWxlSWQgPSAndG9sbGUtZHluYW1pYy10aGVtZSc7XG4gIHByaXZhdGUgYmFzZVN0eWxlSWQgPSAndG9sbGUtYmFzZS10aGVtZSc7XG4gIHByaXZhdGUgY2hhcnRTdHlsZUlkID0gJ3RvbGxlLWNoYXJ0LXRoZW1lJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IG9iamVjdCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRPTExFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRvbGxlQ29uZmlnLFxuICAgIHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5MlxuICApIHtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRoZW1lKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUaGVtZSgpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIC8vIExPR0lDOiBVc2VyIFNhdmVkIFByZWZlcmVuY2VzID4gQ29uZmlnIERlZmF1bHRzID4gU3lzdGVtIFByZWZlcmVuY2VcbiAgICBjb25zdCBzYXZlZFRoZW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXRoZW1lJyk7XG4gICAgY29uc3Qgc2F2ZWRQcmltYXJ5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKTtcbiAgICBjb25zdCBzYXZlZFJhZGl1cyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1yYWRpdXMnKTtcbiAgICBjb25zdCBzeXN0ZW1QcmVmZXJzRGFyayA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcztcblxuICAgIC8vIERldGVybWluZSBEYXJrL0xpZ2h0IE1vZGVcbiAgICBsZXQgc2hvdWxkQmVEYXJrID0gc3lzdGVtUHJlZmVyc0Rhcms7XG5cbiAgICBpZiAoc2F2ZWRUaGVtZSkge1xuICAgICAgc2hvdWxkQmVEYXJrID0gc2F2ZWRUaGVtZSA9PT0gJ2RhcmsnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LmRhcmtCeURlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2hvdWxkQmVEYXJrID0gdGhpcy5jb25maWcuZGFya0J5RGVmYXVsdDtcbiAgICB9XG5cbiAgICAvLyBBcHBseSB0aGVtZSBtb2RlXG4gICAgaWYgKHNob3VsZEJlRGFyaykge1xuICAgICAgdGhpcy5lbmFibGVEYXJrTW9kZShmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBQcmltYXJ5IENvbG9yXG4gICAgaWYgKHNhdmVkUHJpbWFyeSkge1xuICAgICAgdGhpcy5zZXRQcmltYXJ5Q29sb3Ioc2F2ZWRQcmltYXJ5LCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8ucHJpbWFyeUNvbG9yKSB7XG4gICAgICB0aGlzLnNldFByaW1hcnlDb2xvcih0aGlzLmNvbmZpZy5wcmltYXJ5Q29sb3IsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBSYWRpdXNcbiAgICBpZiAoc2F2ZWRSYWRpdXMpIHtcbiAgICAgIHRoaXMuc2V0UmFkaXVzKHNhdmVkUmFkaXVzLCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8ucmFkaXVzKSB7XG4gICAgICB0aGlzLnNldFJhZGl1cyh0aGlzLmNvbmZpZy5yYWRpdXMsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBCYXNlIChuZXV0cmFsKSBjb2xvciAoc2F2ZWQgPiBjb25maWcgPiB0aGVtZS5jc3MgZGVmYXVsdCA9IHppbmMpXG4gICAgY29uc3Qgc2F2ZWRCYXNlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWJhc2UtY29sb3InKTtcbiAgICBpZiAoc2F2ZWRCYXNlKSB7XG4gICAgICB0aGlzLnNldEJhc2VDb2xvcihzYXZlZEJhc2UsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5iYXNlQ29sb3IpIHtcbiAgICAgIHRoaXMuc2V0QmFzZUNvbG9yKHRoaXMuY29uZmlnLmJhc2VDb2xvciwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IENoYXJ0IGNvbG9yIChzYXZlZCA+IGNvbmZpZylcbiAgICBjb25zdCBzYXZlZENoYXJ0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWNoYXJ0LWNvbG9yJyk7XG4gICAgaWYgKHNhdmVkQ2hhcnQpIHtcbiAgICAgIHRoaXMuc2V0Q2hhcnRDb2xvcihzYXZlZENoYXJ0LCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uY2hhcnRDb2xvcikge1xuICAgICAgdGhpcy5zZXRDaGFydENvbG9yKHRoaXMuY29uZmlnLmNoYXJ0Q29sb3IsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBUeXBvZ3JhcGh5IChzYXZlZCBwcmVmZXJlbmNlID4gY29uZmlnIGRlZmF1bHQgPiB0aGVtZS5jc3MgZGVmYXVsdClcbiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWydzYW5zJywgJ3NlcmlmJywgJ21vbm8nXSBhcyBjb25zdCkge1xuICAgICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgdG9sbGUtZm9udC0ke2tpbmR9YCk7XG4gICAgICBjb25zdCBmcm9tQ29uZmlnID0gdGhpcy5jb25maWc/LltgZm9udCR7a2luZFswXS50b1VwcGVyQ2FzZSgpfSR7a2luZC5zbGljZSgxKX1gIGFzICdmb250U2FucycgfCAnZm9udFNlcmlmJyB8ICdmb250TW9ubyddO1xuICAgICAgaWYgKHNhdmVkKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9udChraW5kLCBzYXZlZCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIGlmIChmcm9tQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9udChraW5kLCBmcm9tQ29uZmlnLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzYXZlZFRoZW1lKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCBzaG91bGRCZURhcmsgPyAnZGFyaycgOiAnbGlnaHQnKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0IGEgdHlwb2dyYXBoeSBzdGFjayAoYC0tZm9udC1zYW5zYCAvIGAtLWZvbnQtc2VyaWZgIC8gYC0tZm9udC1tb25vYCkuICovXG4gIHNldEZvbnQoa2luZDogJ3NhbnMnIHwgJ3NlcmlmJyB8ICdtb25vJywgc3RhY2s6IHN0cmluZywgcGVyc2lzdCA9IHRydWUpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBgLS1mb250LSR7a2luZH1gLCBzdGFjayk7XG4gICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGB0b2xsZS1mb250LSR7a2luZH1gLCBzdGFjayk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlYWQgdGhlIGN1cnJlbnQgc3RhY2sgZm9yIGEgZm9udCByb2xlIGZyb20gdGhlIGxpdmUgZG9jdW1lbnQuICovXG4gIGdldEZvbnQoa2luZDogJ3NhbnMnIHwgJ3NlcmlmJyB8ICdtb25vJyk6IHN0cmluZyB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUodGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoYC0tZm9udC0ke2tpbmR9YCkudHJpbSgpO1xuICB9XG5cbiAgLyoqIFNldCBsaWdodC9kYXJrIGV4cGxpY2l0bHkgKGEgZGlyZWN0aW9uYWwgY29tcGFuaW9uIHRvIGB0b2dnbGVUaGVtZWApLiAqL1xuICBzZXRBcHBlYXJhbmNlKG1vZGU6ICdsaWdodCcgfCAnZGFyaycsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgbW9kZSA9PT0gJ2RhcmsnID8gdGhpcy5lbmFibGVEYXJrTW9kZShwZXJzaXN0KSA6IHRoaXMuZGlzYWJsZURhcmtNb2RlKHBlcnNpc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbmV1dHJhbCBiYXNlLWNvbG9yIGZhbWlseSAoYmFja2dyb3VuZC9mb3JlZ3JvdW5kL2NhcmQvbXV0ZWQvYm9yZGVy4oCmKS5cbiAgICogQWNjZXB0cyBhIGZhbWlseSBpZDogYHppbmNgIHwgYHNsYXRlYCB8IGBncmF5YCB8IGBuZXV0cmFsYCB8IGBzdG9uZWAuXG4gICAqL1xuICBzZXRCYXNlQ29sb3IoYmFzZUlkOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgdGhpcy5pbmplY3RTdHlsZUJ5SWQodGhpcy5iYXNlU3R5bGVJZCwgZ2VuZXJhdGVCYXNlQ3NzKGJhc2VJZCkpO1xuICAgIGlmIChwZXJzaXN0KSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtYmFzZS1jb2xvcicsIGJhc2VJZCk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBjaGFydCBwYWxldHRlIGZyb20gYSBiYXNlIGhleDsgZGVyaXZlcyBgLS1jaGFydC0x4oCmNWAuICovXG4gIHNldENoYXJ0Q29sb3IoaGV4OiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgdGhpcy5pbmplY3RTdHlsZUJ5SWQodGhpcy5jaGFydFN0eWxlSWQsIGdlbmVyYXRlQ2hhcnRDc3MoaGV4KSk7XG4gICAgaWYgKHBlcnNpc3QpIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS1jaGFydC1jb2xvcicsIGhleCk7XG4gIH1cblxuICAvKiogUmVhZCB0aGUgY3VycmVudCBiYXNlLWNvbG9yIGZhbWlseSBpZCAocGVyc2lzdGVkKSwgb3IgbnVsbC4gKi9cbiAgZ2V0IGJhc2VDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtYmFzZS1jb2xvcicpO1xuICB9XG5cbiAgLyoqIFJlYWQgdGhlIGN1cnJlbnQgY2hhcnQgYmFzZSBjb2xvciAocGVyc2lzdGVkKSwgb3IgbnVsbC4gKi9cbiAgZ2V0IGNoYXJ0Q29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWNoYXJ0LWNvbG9yJyk7XG4gIH1cblxuICAvKiogVXBzZXJ0IGEga2V5ZWQgPHN0eWxlPiBlbGVtZW50IGluIDxoZWFkPiB3aXRoIHRoZSBnaXZlbiBDU1MgdGV4dC4gKi9cbiAgcHJpdmF0ZSBpbmplY3RTdHlsZUJ5SWQoaWQ6IHN0cmluZywgY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG4gICAgY29uc3QgZWwgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgZWwuaWQgPSBpZDtcbiAgICBlbC50ZXh0Q29udGVudCA9IGNzcztcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuaGVhZCwgZWwpO1xuICB9XG5cbiAgc2V0UmFkaXVzKHJhZGl1czogc3RyaW5nLCBwZXJzaXN0ID0gdHJ1ZSkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm9vdCwgJy0tcmFkaXVzJywgcmFkaXVzKTtcbiAgICB0aGlzLnVwZGF0ZVJhZGl1c0luRHluYW1pY1N0eWxlcyhyYWRpdXMpO1xuICAgIHRoaXMudXBkYXRlQWxsUmFkaXVzVmFyaWFibGVzKHJhZGl1cyk7XG5cbiAgICBpZiAocGVyc2lzdCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RvbGxlLXJhZGl1cycsIHJhZGl1cyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBbGxSYWRpdXNWYXJpYWJsZXMoYmFzZVJhZGl1czogc3RyaW5nKSB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IHNjYWxlID0gcmFkaXVzU2NhbGUoYmFzZVJhZGl1cyk7XG4gICAgaWYgKCFzY2FsZSkge1xuICAgICAgY29uc29sZS53YXJuKGBJbnZhbGlkIHJhZGl1cyBmb3JtYXQ6ICR7YmFzZVJhZGl1c30uIFVzaW5nIGRlZmF1bHQgdmFsdWVzLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBgLS1yYWRpdXNgIGl0c2VsZiBpcyBzZXQgYnkgc2V0UmFkaXVzKCk7IGFwcGx5IHRoZSBkZXJpdmVkIHNjYWxlIGhlcmUuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjYWxlKSkge1xuICAgICAgaWYgKG5hbWUgPT09ICctLXJhZGl1cycpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSYWRpdXNJbkR5bmFtaWNTdHlsZXMocmFkaXVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuXG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGxldCBjc3MgPSBleGlzdGluZ1N0eWxlLnRleHRDb250ZW50IHx8ICcnO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgcmFkaXVzIHRvIGNhbGN1bGF0ZSBkZXJpdmVkIHZhbHVlc1xuICAgICAgY29uc3QgcmFkaXVzTWF0Y2ggPSByYWRpdXMubWF0Y2goL14oXFxkKlxcLj9cXGQrKShbYS16XSt8JSkkLyk7XG4gICAgICBpZiAocmFkaXVzTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgICAgIGNvbnN0IHVuaXQgPSByYWRpdXNNYXRjaFsyXTtcblxuICAgICAgICBjb25zdCBkZXJpdmVkUmFkaWkgPSB7XG4gICAgICAgICAgJy0tcmFkaXVzLXNtJzogYCR7bnVtZXJpY1ZhbHVlICogMC41fSR7dW5pdH1gLFxuICAgICAgICAgICctLXJhZGl1cy1tZCc6IGAke251bWVyaWNWYWx1ZX0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtbGcnOiBgJHtudW1lcmljVmFsdWUgKiAxLjV9JHt1bml0fWAsXG4gICAgICAgICAgJy0tcmFkaXVzLXhsJzogYCR7bnVtZXJpY1ZhbHVlICogMn0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtMnhsJzogYCR7bnVtZXJpY1ZhbHVlICogM30ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtM3hsJzogYCR7bnVtZXJpY1ZhbHVlICogNH0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtZnVsbCc6ICc5OTk5cHgnXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVXBkYXRlIGJhc2UgcmFkaXVzXG4gICAgICAgIGlmIChjc3MuaW5jbHVkZXMoJy0tcmFkaXVzOicpKSB7XG4gICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UoLy0tcmFkaXVzOlteO10rOy9nLCBgLS1yYWRpdXM6ICR7cmFkaXVzfTtgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBhbGwgZGVyaXZlZCByYWRpdXMgdmFyaWFibGVzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGRlcml2ZWRSYWRpaSkuZm9yRWFjaCgoW3Zhck5hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGlmIChjc3MuaW5jbHVkZXModmFyTmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgJHt2YXJOYW1lfTpbXjtdKztgLCAnZycpO1xuICAgICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UocmVnZXgsIGAke3Zhck5hbWV9OiAke3ZhbHVlfTtgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSB2YXJpYWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICBjc3MgPSBjc3MucmVwbGFjZSgvOnJvb3RcXHMqey8sIGA6cm9vdCB7XFxuICAgICAgJHt2YXJOYW1lfTogJHt2YWx1ZX07YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZXhpc3RpbmdTdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUHJpbWFyeVNoYWRlcyhiYXNlQ29sb3I6IHN0cmluZykge1xuICAgIC8vIFJhZGl1cyBpcyByZWFkIGZyb20gdGhlIERPTSBoZXJlOyB0aGUgdG9rZW4gbWF0aCBsaXZlcyBpbiB1dGlscy9jb2xvci5cbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgY29uc3QgY3VycmVudFJhZGl1cyA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1yYWRpdXMnKS50cmltKCkgfHwgJzAuNXJlbSc7XG4gICAgdGhpcy5pbmplY3REeW5hbWljU3R5bGVzKGdlbmVyYXRlVGhlbWVDc3MoYmFzZUNvbG9yLCBjdXJyZW50UmFkaXVzKSk7XG4gIH1cblxuICBwcml2YXRlIGluamVjdER5bmFtaWNTdHlsZXMoY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGV4aXN0aW5nU3R5bGUucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWxlbWVudC5pZCA9IHRoaXMuc3R5bGVJZDtcbiAgICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICB0b2dnbGVUaGVtZSgpIHtcbiAgICBjb25zdCBpc0N1cnJlbnRseURhcmsgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RhcmsnKTtcbiAgICBpc0N1cnJlbnRseURhcmsgPyB0aGlzLmRpc2FibGVEYXJrTW9kZSgpIDogdGhpcy5lbmFibGVEYXJrTW9kZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVEYXJrTW9kZShzYXZlVG9TdG9yYWdlID0gdHJ1ZSkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdkYXJrJyk7XG4gICAgaWYgKHNhdmVUb1N0b3JhZ2UpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS10aGVtZScsICdkYXJrJyk7XG4gICAgfVxuICAgIHRoaXMuX2lzRGFyay5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlRGFya01vZGUoc2F2ZVRvU3RvcmFnZSA9IHRydWUpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnZGFyaycpO1xuICAgIGlmIChzYXZlVG9TdG9yYWdlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnbGlnaHQnKTtcbiAgICB9XG4gICAgdGhpcy5faXNEYXJrLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgc2V0UHJpbWFyeUNvbG9yKGNvbG9yOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICB0aGlzLmdlbmVyYXRlUHJpbWFyeVNoYWRlcyhjb2xvcik7XG5cbiAgICBjb25zdCByZ2IgPSBoZXhUb1JnYihjb2xvcik7XG4gICAgaWYgKHJnYikge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgICctLXByaW1hcnknLFxuICAgICAgICBgJHtyZ2Iucn0gJHtyZ2IuZ30gJHtyZ2IuYn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicsIGNvbG9yKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY3VycmVudFRoZW1lKCk6ICdkYXJrJyB8ICdsaWdodCcge1xuICAgIHJldHVybiB0aGlzLl9pc0RhcmsuZ2V0VmFsdWUoKSA/ICdkYXJrJyA6ICdsaWdodCc7XG4gIH1cblxuICBnZXQgaXNEYXJrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0RhcmsuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCBwcmltYXJ5Q29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjc3NWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1wcmltYXJ5JykudHJpbSgpO1xuXG4gICAgaWYgKGNzc1ZhbHVlICYmIGNzc1ZhbHVlICE9PSAnJykge1xuICAgICAgY29uc3QgcmdiUGFydHMgPSBjc3NWYWx1ZS5zcGxpdCgnICcpLm1hcChOdW1iZXIpO1xuICAgICAgaWYgKHJnYlBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gYCMke3JnYlBhcnRzWzBdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7cmdiUGFydHNbMV0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtyZ2JQYXJ0c1syXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuICB9XG5cbiAgcmVzZXRUb0NvbmZpZ0RlZmF1bHRzKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgWyd0b2xsZS10aGVtZScsICd0b2xsZS1wcmltYXJ5LWNvbG9yJywgJ3RvbGxlLXJhZGl1cycsICd0b2xsZS1iYXNlLWNvbG9yJywgJ3RvbGxlLWNoYXJ0LWNvbG9yJyxcbiAgICAgJ3RvbGxlLWZvbnQtc2FucycsICd0b2xsZS1mb250LXNlcmlmJywgJ3RvbGxlLWZvbnQtbW9ubyddXG4gICAgICAuZm9yRWFjaCgoaykgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oaykpO1xuXG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmJhc2VTdHlsZUlkKT8ucmVtb3ZlKCk7XG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNoYXJ0U3R5bGVJZCk/LnJlbW92ZSgpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplVGhlbWUoKTtcbiAgfVxuXG4gIGdldFVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtdGhlbWUnKSxcbiAgICAgIHByaW1hcnlDb2xvcjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKSxcbiAgICAgIHJhZGl1czogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXJhZGl1cycpXG4gICAgfTtcbiAgfVxuXG4gIGNsZWFyVXNlclByZWZlcmVuY2VzKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgWyd0b2xsZS10aGVtZScsICd0b2xsZS1wcmltYXJ5LWNvbG9yJywgJ3RvbGxlLXJhZGl1cycsICd0b2xsZS1iYXNlLWNvbG9yJywgJ3RvbGxlLWNoYXJ0LWNvbG9yJyxcbiAgICAgJ3RvbGxlLWZvbnQtc2FucycsICd0b2xsZS1mb250LXNlcmlmJywgJ3RvbGxlLWZvbnQtbW9ubyddXG4gICAgICAuZm9yRWFjaCgoaykgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oaykpO1xuXG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmJhc2VTdHlsZUlkKT8ucmVtb3ZlKCk7XG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNoYXJ0U3R5bGVJZCk/LnJlbW92ZSgpO1xuXG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG4gICAgaWYgKHN5c3RlbVByZWZlcnNEYXJrKSB7XG4gICAgICB0aGlzLmVuYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXByaW1hcnknKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXJhZGl1cycpO1xuXG4gICAgLy8gQWxzbyByZW1vdmUgYWxsIGRlcml2ZWQgcmFkaXVzIHZhcmlhYmxlc1xuICAgIFsnLS1yYWRpdXMtc20nLCAnLS1yYWRpdXMtbWQnLCAnLS1yYWRpdXMtbGcnLCAnLS1yYWRpdXMteGwnLCAnLS1yYWRpdXMtMnhsJywgJy0tcmFkaXVzLTN4bCcsICctLXJhZGl1cy1mdWxsJ11cbiAgICAgIC5mb3JFYWNoKHZhck5hbWUgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsIHZhck5hbWUpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICBleGlzdGluZ1N0eWxlLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -10,16 +10,16 @@ export class ToastContainerComponent {
|
|
|
10
10
|
position = 'bottom-right';
|
|
11
11
|
toasts$ = this.toastService.toasts$;
|
|
12
12
|
icons = {
|
|
13
|
-
destructive: 'ri-error-warning-line text-destructive
|
|
14
|
-
success: 'ri-checkbox-circle-line text-
|
|
13
|
+
destructive: 'ri-error-warning-line text-destructive',
|
|
14
|
+
success: 'ri-checkbox-circle-line text-success',
|
|
15
15
|
default: 'ri-information-line text-primary'
|
|
16
16
|
};
|
|
17
17
|
getVariantClasses(variant = 'default') {
|
|
18
18
|
switch (variant) {
|
|
19
19
|
case 'destructive':
|
|
20
|
-
return 'border-destructive/50 bg-destructive/
|
|
20
|
+
return 'border-destructive/50 bg-destructive/10 text-destructive';
|
|
21
21
|
case 'success':
|
|
22
|
-
return 'border-
|
|
22
|
+
return 'border-success/50 bg-success/10 text-success';
|
|
23
23
|
default:
|
|
24
24
|
return 'bg-background text-foreground border-border';
|
|
25
25
|
}
|
|
@@ -27,9 +27,9 @@ export class ToastContainerComponent {
|
|
|
27
27
|
getProgressClasses(variant = 'default') {
|
|
28
28
|
switch (variant) {
|
|
29
29
|
case 'destructive':
|
|
30
|
-
return 'bg-destructive
|
|
30
|
+
return 'bg-destructive';
|
|
31
31
|
case 'success':
|
|
32
|
-
return 'bg-
|
|
32
|
+
return 'bg-success';
|
|
33
33
|
default:
|
|
34
34
|
return 'bg-primary';
|
|
35
35
|
}
|
|
@@ -51,6 +51,9 @@ export class ToastContainerComponent {
|
|
|
51
51
|
<div [class]="cn('fixed z-[100] flex flex-col gap-2 w-full max-w-[380px] p-4', positionClasses)">
|
|
52
52
|
<div
|
|
53
53
|
*ngFor="let toast of toasts$ | async"
|
|
54
|
+
role="status"
|
|
55
|
+
[attr.aria-live]="toast.variant === 'destructive' ? 'assertive' : 'polite'"
|
|
56
|
+
aria-atomic="true"
|
|
54
57
|
(mouseenter)="toastService.setPaused(toast.id, true)"
|
|
55
58
|
(mouseleave)="toastService.setPaused(toast.id, false)"
|
|
56
59
|
[class]="cn(
|
|
@@ -67,11 +70,13 @@ export class ToastContainerComponent {
|
|
|
67
70
|
</div>
|
|
68
71
|
</div>
|
|
69
72
|
|
|
70
|
-
<button (click)="toastService.remove(toast.id)" class="opacity-50 hover:opacity-100 transition-opacity">
|
|
73
|
+
<button type="button" aria-label="Close" (click)="toastService.remove(toast.id)" class="opacity-50 hover:opacity-100 transition-opacity">
|
|
74
|
+
<span class="sr-only">Close</span>
|
|
71
75
|
<i class="ri-close-line text-lg"></i>
|
|
72
76
|
</button>
|
|
73
77
|
|
|
74
78
|
<div
|
|
79
|
+
aria-hidden="true"
|
|
75
80
|
class="absolute bottom-0 left-0 h-1 transition-all duration-100 ease-linear"
|
|
76
81
|
[style.width.%]="(toast.remainingTime / (toast.duration || 3000)) * 100"
|
|
77
82
|
[class]="getProgressClasses(toast.variant)"
|
|
@@ -90,6 +95,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
90
95
|
<div [class]="cn('fixed z-[100] flex flex-col gap-2 w-full max-w-[380px] p-4', positionClasses)">
|
|
91
96
|
<div
|
|
92
97
|
*ngFor="let toast of toasts$ | async"
|
|
98
|
+
role="status"
|
|
99
|
+
[attr.aria-live]="toast.variant === 'destructive' ? 'assertive' : 'polite'"
|
|
100
|
+
aria-atomic="true"
|
|
93
101
|
(mouseenter)="toastService.setPaused(toast.id, true)"
|
|
94
102
|
(mouseleave)="toastService.setPaused(toast.id, false)"
|
|
95
103
|
[class]="cn(
|
|
@@ -106,11 +114,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
106
114
|
</div>
|
|
107
115
|
</div>
|
|
108
116
|
|
|
109
|
-
<button (click)="toastService.remove(toast.id)" class="opacity-50 hover:opacity-100 transition-opacity">
|
|
117
|
+
<button type="button" aria-label="Close" (click)="toastService.remove(toast.id)" class="opacity-50 hover:opacity-100 transition-opacity">
|
|
118
|
+
<span class="sr-only">Close</span>
|
|
110
119
|
<i class="ri-close-line text-lg"></i>
|
|
111
120
|
</button>
|
|
112
121
|
|
|
113
122
|
<div
|
|
123
|
+
aria-hidden="true"
|
|
114
124
|
class="absolute bottom-0 left-0 h-1 transition-all duration-100 ease-linear"
|
|
115
125
|
[style.width.%]="(toast.remainingTime / (toast.duration || 3000)) * 100"
|
|
116
126
|
[class]="getProgressClasses(toast.variant)"
|
|
@@ -122,4 +132,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
122
132
|
}], propDecorators: { position: [{
|
|
123
133
|
type: Input
|
|
124
134
|
}] } });
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Rlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL3RvYXN0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQXdCLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBNENoQyxNQUFNLE9BQU8sdUJBQXVCO0lBQ2xDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0IsUUFBUSxHQUFrQixjQUFjLENBQUM7SUFDbEQsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO0lBRXBDLEtBQUssR0FBRztRQUNOLFdBQVcsRUFBRSx3Q0FBd0M7UUFDckQsT0FBTyxFQUFFLHNDQUFzQztRQUMvQyxPQUFPLEVBQUUsa0NBQWtDO0tBQzVDLENBQUM7SUFFRixpQkFBaUIsQ0FBQyxVQUFrQixTQUFTO1FBQzNDLFFBQVEsT0FBTyxFQUFFLENBQUM7WUFDaEIsS0FBSyxhQUFhO2dCQUNoQixPQUFPLDBEQUEwRCxDQUFDO1lBQ3BFLEtBQUssU0FBUztnQkFDWixPQUFPLDhDQUE4QyxDQUFDO1lBQ3hEO2dCQUNFLE9BQU8sNkNBQTZDLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxVQUFrQixTQUFTO1FBQzVDLFFBQVEsT0FBTyxFQUFFLENBQUM7WUFDaEIsS0FBSyxhQUFhO2dCQUNoQixPQUFPLGdCQUFnQixDQUFDO1lBQzFCLEtBQUssU0FBUztnQkFDWixPQUFPLFlBQVksQ0FBQztZQUN0QjtnQkFDRSxPQUFPLFlBQVksQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixNQUFNLEdBQUcsR0FBRztZQUNWLFdBQVcsRUFBRSxnQ0FBZ0M7WUFDN0MsVUFBVSxFQUFFLCtCQUErQjtZQUMzQyxjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLGFBQWEsRUFBRSxpQkFBaUI7WUFDaEMsWUFBWSxFQUFFLGtEQUFrRDtZQUNoRSxlQUFlLEVBQUUsb0NBQW9DO1NBQ3RELENBQUM7UUFDRixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNTLEVBQUUsR0FBRyxFQUFFLENBQUM7d0dBNUNQLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDJHQXRDeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DVCwyREFyQ1MsWUFBWTs7NEZBdUNYLHVCQUF1QjtrQkExQ25DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0NUO2lCQUNGOzhCQUdVLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwcm9qZWN0cy90b2xsZS9zcmMvbGliL3RvYXN0LWNvbnRhaW5lci5jb21wb25lbnQudHNcbmltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSwgVG9hc3QsIFRvYXN0UG9zaXRpb24gfSBmcm9tICcuL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtdG9hc3RlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNuKCdmaXhlZCB6LVsxMDBdIGZsZXggZmxleC1jb2wgZ2FwLTIgdy1mdWxsIG1heC13LVszODBweF0gcC00JywgcG9zaXRpb25DbGFzc2VzKVwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgdG9hc3Qgb2YgdG9hc3RzJCB8IGFzeW5jXCJcbiAgICAgICAgcm9sZT1cInN0YXR1c1wiXG4gICAgICAgIFthdHRyLmFyaWEtbGl2ZV09XCJ0b2FzdC52YXJpYW50ID09PSAnZGVzdHJ1Y3RpdmUnID8gJ2Fzc2VydGl2ZScgOiAncG9saXRlJ1wiXG4gICAgICAgIGFyaWEtYXRvbWljPVwidHJ1ZVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cInRvYXN0U2VydmljZS5zZXRQYXVzZWQodG9hc3QuaWQsIHRydWUpXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwidG9hc3RTZXJ2aWNlLnNldFBhdXNlZCh0b2FzdC5pZCwgZmFsc2UpXCJcbiAgICAgICAgW2NsYXNzXT1cImNuKFxuICAgICAgICAgICdyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4gcC00IHJvdW5kZWQtbWQgYm9yZGVyIHNoYWRvdy1sZyBmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtNCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAnLFxuICAgICAgICAgIGdldFZhcmlhbnRDbGFzc2VzKHRvYXN0LnZhcmlhbnQpXG4gICAgICAgIClcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtM1wiPlxuICAgICAgICAgIDxpICpuZ0lmPVwidG9hc3QudmFyaWFudCAmJiBpY29uc1t0b2FzdC52YXJpYW50XVwiIFtjbGFzc109XCJjbigndGV4dC1sZycsIGljb25zW3RvYXN0LnZhcmlhbnRdKVwiPjwvaT5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBnYXAtMVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRvYXN0LnRpdGxlXCIgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgbGVhZGluZy1ub25lXCI+e3sgdG9hc3QudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG9wYWNpdHktOTAgbGVhZGluZy1yZWxheGVkXCI+e3sgdG9hc3QuZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cInRvYXN0U2VydmljZS5yZW1vdmUodG9hc3QuaWQpXCIgY2xhc3M9XCJvcGFjaXR5LTUwIGhvdmVyOm9wYWNpdHktMTAwIHRyYW5zaXRpb24tb3BhY2l0eVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxuICAgICAgICAgIDxpIGNsYXNzPVwicmktY2xvc2UtbGluZSB0ZXh0LWxnXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGJvdHRvbS0wIGxlZnQtMCBoLTEgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMTAwIGVhc2UtbGluZWFyXCJcbiAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCIodG9hc3QucmVtYWluaW5nVGltZSAvICh0b2FzdC5kdXJhdGlvbiB8fCAzMDAwKSkgKiAxMDBcIlxuICAgICAgICAgIFtjbGFzc109XCJnZXRQcm9ncmVzc0NsYXNzZXModG9hc3QudmFyaWFudClcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBUb2FzdENvbnRhaW5lckNvbXBvbmVudCB7XG4gIHRvYXN0U2VydmljZSA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICBASW5wdXQoKSBwb3NpdGlvbjogVG9hc3RQb3NpdGlvbiA9ICdib3R0b20tcmlnaHQnO1xuICB0b2FzdHMkID0gdGhpcy50b2FzdFNlcnZpY2UudG9hc3RzJDtcblxuICBpY29ucyA9IHtcbiAgICBkZXN0cnVjdGl2ZTogJ3JpLWVycm9yLXdhcm5pbmctbGluZSB0ZXh0LWRlc3RydWN0aXZlJyxcbiAgICBzdWNjZXNzOiAncmktY2hlY2tib3gtY2lyY2xlLWxpbmUgdGV4dC1zdWNjZXNzJyxcbiAgICBkZWZhdWx0OiAncmktaW5mb3JtYXRpb24tbGluZSB0ZXh0LXByaW1hcnknXG4gIH07XG5cbiAgZ2V0VmFyaWFudENsYXNzZXModmFyaWFudDogc3RyaW5nID0gJ2RlZmF1bHQnKSB7XG4gICAgc3dpdGNoICh2YXJpYW50KSB7XG4gICAgICBjYXNlICdkZXN0cnVjdGl2ZSc6XG4gICAgICAgIHJldHVybiAnYm9yZGVyLWRlc3RydWN0aXZlLzUwIGJnLWRlc3RydWN0aXZlLzEwIHRleHQtZGVzdHJ1Y3RpdmUnO1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIHJldHVybiAnYm9yZGVyLXN1Y2Nlc3MvNTAgYmctc3VjY2Vzcy8xMCB0ZXh0LXN1Y2Nlc3MnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdiZy1iYWNrZ3JvdW5kIHRleHQtZm9yZWdyb3VuZCBib3JkZXItYm9yZGVyJztcbiAgICB9XG4gIH1cblxuICBnZXRQcm9ncmVzc0NsYXNzZXModmFyaWFudDogc3RyaW5nID0gJ2RlZmF1bHQnKSB7XG4gICAgc3dpdGNoICh2YXJpYW50KSB7XG4gICAgICBjYXNlICdkZXN0cnVjdGl2ZSc6XG4gICAgICAgIHJldHVybiAnYmctZGVzdHJ1Y3RpdmUnO1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIHJldHVybiAnYmctc3VjY2Vzcyc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2JnLXByaW1hcnknO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwb3NpdGlvbkNsYXNzZXMoKSB7XG4gICAgY29uc3QgcG9zID0ge1xuICAgICAgJ3RvcC1yaWdodCc6ICd0b3AtMCByaWdodC0wIGZsZXgtY29sLXJldmVyc2UnLFxuICAgICAgJ3RvcC1sZWZ0JzogJ3RvcC0wIGxlZnQtMCBmbGV4LWNvbC1yZXZlcnNlJyxcbiAgICAgICdib3R0b20tcmlnaHQnOiAnYm90dG9tLTAgcmlnaHQtMCcsXG4gICAgICAnYm90dG9tLWxlZnQnOiAnYm90dG9tLTAgbGVmdC0wJyxcbiAgICAgICd0b3AtY2VudGVyJzogJ3RvcC0wIGxlZnQtMS8yIC10cmFuc2xhdGUteC0xLzIgZmxleC1jb2wtcmV2ZXJzZScsXG4gICAgICAnYm90dG9tLWNlbnRlcic6ICdib3R0b20tMCBsZWZ0LTEvMiAtdHJhbnNsYXRlLXgtMS8yJ1xuICAgIH07XG4gICAgcmV0dXJuIHBvc1t0aGlzLnBvc2l0aW9uXTtcbiAgfVxuICBwcm90ZWN0ZWQgY24gPSBjbjtcbn1cbiJdfQ==
|