@tolle_/tolle-ui 18.2.6 → 18.2.7
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/theme.service.mjs +95 -119
- package/fesm2022/tolle-ui.mjs +93 -117
- package/fesm2022/tolle-ui.mjs.map +1 -1
- package/lib/button.component.d.ts +2 -2
- package/lib/theme.service.d.ts +4 -38
- package/lib/toggle.component.d.ts +1 -1
- package/package.json +1 -1
- package/theme.css +33 -0
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { Injectable, Inject, PLATFORM_ID, Optional } from '@angular/core';
|
|
2
2
|
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
|
|
3
|
-
import { BehaviorSubject } from 'rxjs';
|
|
4
3
|
import { TOLLE_CONFIG } from './tolle-config';
|
|
4
|
+
import { BehaviorSubject } from 'rxjs';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
export class ThemeService {
|
|
7
7
|
document;
|
|
8
8
|
platformId;
|
|
9
9
|
config;
|
|
10
10
|
renderer;
|
|
11
|
-
|
|
12
|
-
isDark$ = this.
|
|
11
|
+
_isDark = new BehaviorSubject(false);
|
|
12
|
+
isDark$ = this._isDark.asObservable();
|
|
13
13
|
styleId = 'tolle-dynamic-theme';
|
|
14
14
|
constructor(document, platformId, config, rendererFactory) {
|
|
15
15
|
this.document = document;
|
|
@@ -26,130 +26,143 @@ export class ThemeService {
|
|
|
26
26
|
const savedPrimary = localStorage.getItem('tolle-primary-color');
|
|
27
27
|
const savedRadius = localStorage.getItem('tolle-radius');
|
|
28
28
|
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
savedPrimary,
|
|
32
|
-
savedRadius,
|
|
33
|
-
config: this.config,
|
|
34
|
-
systemPrefersDark
|
|
35
|
-
});
|
|
36
|
-
// 1. Determine Dark/Light Mode
|
|
37
|
-
// Priority: Saved Theme > Config Default > System Preference
|
|
38
|
-
let shouldBeDark = systemPrefersDark; // Start with system
|
|
29
|
+
// Determine Dark/Light Mode
|
|
30
|
+
let shouldBeDark = systemPrefersDark;
|
|
39
31
|
if (savedTheme) {
|
|
40
|
-
// User has saved preference
|
|
41
32
|
shouldBeDark = savedTheme === 'dark';
|
|
42
33
|
}
|
|
43
34
|
else if (this.config?.darkByDefault !== undefined) {
|
|
44
|
-
// Use config default if no user preference
|
|
45
35
|
shouldBeDark = this.config.darkByDefault;
|
|
46
36
|
}
|
|
47
37
|
// Apply theme mode
|
|
48
38
|
if (shouldBeDark) {
|
|
49
|
-
this.enableDarkMode(false);
|
|
39
|
+
this.enableDarkMode(false);
|
|
50
40
|
}
|
|
51
41
|
else {
|
|
52
42
|
this.disableDarkMode(false);
|
|
53
43
|
}
|
|
54
|
-
//
|
|
55
|
-
// Priority: Saved Color > Config Color
|
|
44
|
+
// Apply Primary Color
|
|
56
45
|
if (savedPrimary) {
|
|
57
|
-
|
|
58
|
-
this.setPrimaryColor(savedPrimary, false); // Don't save again
|
|
46
|
+
this.setPrimaryColor(savedPrimary, false);
|
|
59
47
|
}
|
|
60
48
|
else if (this.config?.primaryColor) {
|
|
61
|
-
|
|
62
|
-
this.setPrimaryColor(this.config.primaryColor, false); // Save this as user preference
|
|
49
|
+
this.setPrimaryColor(this.config.primaryColor, false);
|
|
63
50
|
}
|
|
64
|
-
//
|
|
65
|
-
// Priority: Saved Radius > Config Radius
|
|
51
|
+
// Apply Radius
|
|
66
52
|
if (savedRadius) {
|
|
67
|
-
// User has saved radius preference
|
|
68
53
|
this.setRadius(savedRadius, false);
|
|
69
54
|
}
|
|
70
55
|
else if (this.config?.radius) {
|
|
71
|
-
// Use config default if no user preference
|
|
72
56
|
this.setRadius(this.config.radius, false);
|
|
73
57
|
}
|
|
74
|
-
// Save theme mode preference if it came from config or system
|
|
75
58
|
if (!savedTheme) {
|
|
76
59
|
localStorage.setItem('tolle-theme', shouldBeDark ? 'dark' : 'light');
|
|
77
60
|
}
|
|
78
61
|
}
|
|
79
|
-
/**
|
|
80
|
-
* Sets the border radius for all components
|
|
81
|
-
*/
|
|
82
62
|
setRadius(radius, persist = true) {
|
|
83
63
|
if (!isPlatformBrowser(this.platformId))
|
|
84
64
|
return;
|
|
85
65
|
const root = this.document.documentElement;
|
|
86
|
-
// Set the CSS variable
|
|
87
66
|
this.renderer.setStyle(root, '--radius', radius);
|
|
88
|
-
// Also update the dynamic styles to include radius calculations
|
|
89
67
|
this.updateRadiusInDynamicStyles(radius);
|
|
90
|
-
|
|
68
|
+
this.updateAllRadiusVariables(radius);
|
|
91
69
|
if (persist) {
|
|
92
70
|
localStorage.setItem('tolle-radius', radius);
|
|
93
71
|
}
|
|
94
72
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
73
|
+
updateAllRadiusVariables(baseRadius) {
|
|
74
|
+
const root = this.document.documentElement;
|
|
75
|
+
// Parse the radius to extract numeric value and unit
|
|
76
|
+
const radiusMatch = baseRadius.match(/^(\d*\.?\d+)([a-z]+|%)$/);
|
|
77
|
+
if (!radiusMatch) {
|
|
78
|
+
console.warn(`Invalid radius format: ${baseRadius}. Using default values.`);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const numericValue = parseFloat(radiusMatch[1]);
|
|
82
|
+
const unit = radiusMatch[2];
|
|
83
|
+
// Set all radius variables according to your CSS classes
|
|
84
|
+
this.renderer.setStyle(root, '--radius-sm', `${numericValue * 0.5}${unit}`);
|
|
85
|
+
this.renderer.setStyle(root, '--radius-md', `${numericValue}${unit}`);
|
|
86
|
+
this.renderer.setStyle(root, '--radius-lg', `${numericValue * 1.5}${unit}`);
|
|
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');
|
|
91
|
+
}
|
|
98
92
|
updateRadiusInDynamicStyles(radius) {
|
|
99
93
|
const existingStyle = this.document.getElementById(this.styleId);
|
|
100
94
|
if (existingStyle) {
|
|
101
95
|
let css = existingStyle.textContent || '';
|
|
102
|
-
//
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
96
|
+
// Parse the radius to calculate derived values
|
|
97
|
+
const radiusMatch = radius.match(/^(\d*\.?\d+)([a-z]+|%)$/);
|
|
98
|
+
if (radiusMatch) {
|
|
99
|
+
const numericValue = parseFloat(radiusMatch[1]);
|
|
100
|
+
const unit = radiusMatch[2];
|
|
101
|
+
const derivedRadii = {
|
|
102
|
+
'--radius-sm': `${numericValue * 0.5}${unit}`,
|
|
103
|
+
'--radius-md': `${numericValue}${unit}`,
|
|
104
|
+
'--radius-lg': `${numericValue * 1.5}${unit}`,
|
|
105
|
+
'--radius-xl': `${numericValue * 2}${unit}`,
|
|
106
|
+
'--radius-2xl': `${numericValue * 3}${unit}`,
|
|
107
|
+
'--radius-3xl': `${numericValue * 4}${unit}`,
|
|
108
|
+
'--radius-full': '9999px'
|
|
109
|
+
};
|
|
110
|
+
// Update base radius
|
|
111
|
+
if (css.includes('--radius:')) {
|
|
112
|
+
css = css.replace(/--radius:[^;]+;/g, `--radius: ${radius};`);
|
|
116
113
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
114
|
+
// Update all derived radius variables
|
|
115
|
+
Object.entries(derivedRadii).forEach(([varName, value]) => {
|
|
116
|
+
if (css.includes(varName)) {
|
|
117
|
+
const regex = new RegExp(`${varName}:[^;]+;`, 'g');
|
|
118
|
+
css = css.replace(regex, `${varName}: ${value};`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Add the variable if it doesn't exist
|
|
122
|
+
css = css.replace(/:root\s*{/, `:root {\n ${varName}: ${value};`);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
122
126
|
existingStyle.textContent = css;
|
|
123
127
|
}
|
|
124
128
|
}
|
|
125
|
-
/**
|
|
126
|
-
* Generates full primary color palette (50-900) based on base color
|
|
127
|
-
*/
|
|
128
129
|
generatePrimaryShades(baseColor) {
|
|
129
|
-
// Convert hex to RGB
|
|
130
130
|
const rgb = this.hexToRgb(baseColor);
|
|
131
131
|
const rgbString = rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '37 99 235';
|
|
132
|
-
// Create lighter ring colors in RGB
|
|
133
132
|
const ringLight = this.lightenColor(baseColor, 40);
|
|
134
133
|
const ringLightRgb = this.hexToRgb(ringLight);
|
|
135
134
|
const ringLightRgbString = ringLightRgb ? `${ringLightRgb.r} ${ringLightRgb.g} ${ringLightRgb.b}` : '96 165 250';
|
|
136
135
|
const ringDark = this.lightenColor(baseColor, 20);
|
|
137
136
|
const ringDarkRgb = this.hexToRgb(ringDark);
|
|
138
137
|
const ringDarkRgbString = ringDarkRgb ? `${ringDarkRgb.r} ${ringDarkRgb.g} ${ringDarkRgb.b}` : '147 197 253';
|
|
139
|
-
// Get current radius or
|
|
138
|
+
// Get current radius or default
|
|
140
139
|
const root = this.document.documentElement;
|
|
141
140
|
const currentRadius = getComputedStyle(root).getPropertyValue('--radius').trim() || '0.5rem';
|
|
141
|
+
// Calculate all derived radius values
|
|
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
|
+
}
|
|
142
161
|
const css = `
|
|
143
|
-
/* Override primary colors - this needs to come AFTER your main CSS */
|
|
144
162
|
:root {
|
|
145
|
-
/* Primary in RGB format for Tailwind opacity support */
|
|
146
163
|
--primary: ${rgbString};
|
|
147
164
|
--primary-foreground: ${this.getContrastColorRgb(baseColor)};
|
|
148
|
-
|
|
149
|
-
/* Radius */
|
|
150
|
-
--radius: ${currentRadius};
|
|
151
|
-
|
|
152
|
-
/* Primary shades for light mode */
|
|
165
|
+
${radiusVariables}
|
|
153
166
|
--primary-50: ${this.hexToRgbString(this.lightenColor(baseColor, 90))};
|
|
154
167
|
--primary-100: ${this.hexToRgbString(this.lightenColor(baseColor, 80))};
|
|
155
168
|
--primary-200: ${this.hexToRgbString(this.lightenColor(baseColor, 60))};
|
|
@@ -160,17 +173,13 @@ export class ThemeService {
|
|
|
160
173
|
--primary-700: ${this.hexToRgbString(this.darkenColor(baseColor, 40))};
|
|
161
174
|
--primary-800: ${this.hexToRgbString(this.darkenColor(baseColor, 60))};
|
|
162
175
|
--primary-900: ${this.hexToRgbString(this.darkenColor(baseColor, 80))};
|
|
163
|
-
|
|
164
|
-
/* Update ring color to be lighter */
|
|
165
176
|
--ring: ${ringLightRgbString};
|
|
166
177
|
}
|
|
167
178
|
|
|
168
179
|
.dark {
|
|
169
|
-
/* For dark mode, we keep the primary color but adjust shades */
|
|
170
180
|
--primary: ${rgbString};
|
|
171
181
|
--primary-foreground: ${this.getContrastColorRgb(baseColor)};
|
|
172
|
-
|
|
173
|
-
/* Dark mode shades */
|
|
182
|
+
${radiusVariables}
|
|
174
183
|
--primary-50: ${this.hexToRgbString(this.darkenColor(baseColor, 85))};
|
|
175
184
|
--primary-100: ${this.hexToRgbString(this.darkenColor(baseColor, 75))};
|
|
176
185
|
--primary-200: ${this.hexToRgbString(this.darkenColor(baseColor, 65))};
|
|
@@ -181,18 +190,12 @@ export class ThemeService {
|
|
|
181
190
|
--primary-700: ${this.hexToRgbString(this.lightenColor(baseColor, 35))};
|
|
182
191
|
--primary-800: ${this.hexToRgbString(this.lightenColor(baseColor, 50))};
|
|
183
192
|
--primary-900: ${this.hexToRgbString(this.lightenColor(baseColor, 65))};
|
|
184
|
-
|
|
185
|
-
/* Update ring color for dark mode - lighter variant */
|
|
186
193
|
--ring: ${ringDarkRgbString};
|
|
187
194
|
}
|
|
188
195
|
`;
|
|
189
196
|
this.injectDynamicStyles(css);
|
|
190
197
|
}
|
|
191
|
-
/**
|
|
192
|
-
* Convert hex color to RGB object
|
|
193
|
-
*/
|
|
194
198
|
hexToRgb(hex) {
|
|
195
|
-
// Remove # if present
|
|
196
199
|
const cleanedHex = hex.replace('#', '');
|
|
197
200
|
let r = 0, g = 0, b = 0;
|
|
198
201
|
if (cleanedHex.length === 3) {
|
|
@@ -209,38 +212,24 @@ export class ThemeService {
|
|
|
209
212
|
}
|
|
210
213
|
return null;
|
|
211
214
|
}
|
|
212
|
-
/**
|
|
213
|
-
* Convert hex to RGB string format for CSS (space-separated)
|
|
214
|
-
*/
|
|
215
215
|
hexToRgbString(hexColor) {
|
|
216
216
|
const rgb = this.hexToRgb(hexColor);
|
|
217
217
|
return rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '37 99 235';
|
|
218
218
|
}
|
|
219
|
-
/**
|
|
220
|
-
* Get contrast color in RGB format
|
|
221
|
-
*/
|
|
222
219
|
getContrastColorRgb(hexColor) {
|
|
223
220
|
const contrast = this.getContrastColor(hexColor);
|
|
224
221
|
const rgb = this.hexToRgb(contrast);
|
|
225
222
|
return rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '255 255 255';
|
|
226
223
|
}
|
|
227
|
-
/**
|
|
228
|
-
* Lighten a hex color by a percentage
|
|
229
|
-
*/
|
|
230
224
|
lightenColor(color, percent) {
|
|
231
225
|
const rgb = this.hexToRgb(color);
|
|
232
226
|
if (!rgb)
|
|
233
227
|
return color;
|
|
234
|
-
// Lighten by percentage
|
|
235
228
|
const r = Math.min(255, Math.floor(rgb.r + (255 - rgb.r) * (percent / 100)));
|
|
236
229
|
const g = Math.min(255, Math.floor(rgb.g + (255 - rgb.g) * (percent / 100)));
|
|
237
230
|
const b = Math.min(255, Math.floor(rgb.b + (255 - rgb.b) * (percent / 100)));
|
|
238
|
-
// Convert back to hex
|
|
239
231
|
return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
|
|
240
232
|
}
|
|
241
|
-
/**
|
|
242
|
-
* Darken a hex color by a percentage
|
|
243
|
-
*/
|
|
244
233
|
darkenColor(color, percent) {
|
|
245
234
|
const rgb = this.hexToRgb(color);
|
|
246
235
|
if (!rgb)
|
|
@@ -251,16 +240,11 @@ export class ThemeService {
|
|
|
251
240
|
const b = Math.max(0, Math.floor(rgb.b * factor));
|
|
252
241
|
return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;
|
|
253
242
|
}
|
|
254
|
-
/**
|
|
255
|
-
* Calculate contrast color (black or white) based on background color
|
|
256
|
-
*/
|
|
257
243
|
getContrastColor(hexColor) {
|
|
258
244
|
const rgb = this.hexToRgb(hexColor);
|
|
259
245
|
if (!rgb)
|
|
260
246
|
return '#ffffff';
|
|
261
|
-
// Calculate relative luminance
|
|
262
247
|
const luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
|
|
263
|
-
// Return black for light colors, white for dark colors
|
|
264
248
|
return luminance > 0.5 ? '#000000' : '#ffffff';
|
|
265
249
|
}
|
|
266
250
|
injectDynamicStyles(css) {
|
|
@@ -284,20 +268,19 @@ export class ThemeService {
|
|
|
284
268
|
if (saveToStorage) {
|
|
285
269
|
localStorage.setItem('tolle-theme', 'dark');
|
|
286
270
|
}
|
|
287
|
-
this.
|
|
271
|
+
this._isDark.next(true);
|
|
288
272
|
}
|
|
289
273
|
disableDarkMode(saveToStorage = true) {
|
|
290
274
|
this.renderer.removeClass(this.document.documentElement, 'dark');
|
|
291
275
|
if (saveToStorage) {
|
|
292
276
|
localStorage.setItem('tolle-theme', 'light');
|
|
293
277
|
}
|
|
294
|
-
this.
|
|
278
|
+
this._isDark.next(false);
|
|
295
279
|
}
|
|
296
280
|
setPrimaryColor(color, persist = true) {
|
|
297
281
|
if (!isPlatformBrowser(this.platformId))
|
|
298
282
|
return;
|
|
299
283
|
this.generatePrimaryShades(color);
|
|
300
|
-
// Also set inline for immediate update
|
|
301
284
|
const rgb = this.hexToRgb(color);
|
|
302
285
|
if (rgb) {
|
|
303
286
|
this.renderer.setStyle(this.document.documentElement, '--primary', `${rgb.r} ${rgb.g} ${rgb.b}`);
|
|
@@ -307,7 +290,10 @@ export class ThemeService {
|
|
|
307
290
|
}
|
|
308
291
|
}
|
|
309
292
|
get currentTheme() {
|
|
310
|
-
return this.
|
|
293
|
+
return this._isDark.getValue() ? 'dark' : 'light';
|
|
294
|
+
}
|
|
295
|
+
get isDark() {
|
|
296
|
+
return this._isDark.getValue();
|
|
311
297
|
}
|
|
312
298
|
get primaryColor() {
|
|
313
299
|
if (!isPlatformBrowser(this.platformId))
|
|
@@ -315,7 +301,6 @@ export class ThemeService {
|
|
|
315
301
|
const root = this.document.documentElement;
|
|
316
302
|
const cssValue = getComputedStyle(root).getPropertyValue('--primary').trim();
|
|
317
303
|
if (cssValue && cssValue !== '') {
|
|
318
|
-
// Convert RGB string back to hex for external use
|
|
319
304
|
const rgbParts = cssValue.split(' ').map(Number);
|
|
320
305
|
if (rgbParts.length === 3) {
|
|
321
306
|
return `#${rgbParts[0].toString(16).padStart(2, '0')}${rgbParts[1].toString(16).padStart(2, '0')}${rgbParts[2].toString(16).padStart(2, '0')}`;
|
|
@@ -323,22 +308,14 @@ export class ThemeService {
|
|
|
323
308
|
}
|
|
324
309
|
return localStorage.getItem('tolle-primary-color');
|
|
325
310
|
}
|
|
326
|
-
/**
|
|
327
|
-
* Reset to config defaults (clears user preferences)
|
|
328
|
-
*/
|
|
329
311
|
resetToConfigDefaults() {
|
|
330
312
|
if (!isPlatformBrowser(this.platformId))
|
|
331
313
|
return;
|
|
332
|
-
// Clear user preferences
|
|
333
314
|
localStorage.removeItem('tolle-theme');
|
|
334
315
|
localStorage.removeItem('tolle-primary-color');
|
|
335
316
|
localStorage.removeItem('tolle-radius');
|
|
336
|
-
// Re-initialize with config defaults
|
|
337
317
|
this.initializeTheme();
|
|
338
318
|
}
|
|
339
|
-
/**
|
|
340
|
-
* Get current user preferences
|
|
341
|
-
*/
|
|
342
319
|
getUserPreferences() {
|
|
343
320
|
if (!isPlatformBrowser(this.platformId))
|
|
344
321
|
return null;
|
|
@@ -348,16 +325,12 @@ export class ThemeService {
|
|
|
348
325
|
radius: localStorage.getItem('tolle-radius')
|
|
349
326
|
};
|
|
350
327
|
}
|
|
351
|
-
/**
|
|
352
|
-
* Clear all user preferences
|
|
353
|
-
*/
|
|
354
328
|
clearUserPreferences() {
|
|
355
329
|
if (!isPlatformBrowser(this.platformId))
|
|
356
330
|
return;
|
|
357
331
|
localStorage.removeItem('tolle-theme');
|
|
358
332
|
localStorage.removeItem('tolle-primary-color');
|
|
359
333
|
localStorage.removeItem('tolle-radius');
|
|
360
|
-
// Reset to system defaults (not config defaults)
|
|
361
334
|
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
362
335
|
if (systemPrefersDark) {
|
|
363
336
|
this.enableDarkMode(false);
|
|
@@ -365,11 +338,14 @@ export class ThemeService {
|
|
|
365
338
|
else {
|
|
366
339
|
this.disableDarkMode(false);
|
|
367
340
|
}
|
|
368
|
-
// Remove CSS variables
|
|
369
341
|
const root = this.document.documentElement;
|
|
370
342
|
this.renderer.removeStyle(root, '--primary');
|
|
371
343
|
this.renderer.removeStyle(root, '--radius');
|
|
372
|
-
//
|
|
344
|
+
// Also remove all derived radius variables
|
|
345
|
+
['--radius-sm', '--radius-md', '--radius-lg', '--radius-xl', '--radius-2xl', '--radius-3xl', '--radius-full']
|
|
346
|
+
.forEach(varName => {
|
|
347
|
+
this.renderer.removeStyle(root, varName);
|
|
348
|
+
});
|
|
373
349
|
const existingStyle = this.document.getElementById(this.styleId);
|
|
374
350
|
if (existingStyle) {
|
|
375
351
|
existingStyle.remove();
|
|
@@ -384,7 +360,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
384
360
|
}], ctorParameters: () => [{ type: Document, decorators: [{
|
|
385
361
|
type: Inject,
|
|
386
362
|
args: [DOCUMENT]
|
|
387
|
-
}] }, { type:
|
|
363
|
+
}] }, { type: undefined, decorators: [{
|
|
388
364
|
type: Inject,
|
|
389
365
|
args: [PLATFORM_ID]
|
|
390
366
|
}] }, { type: undefined, decorators: [{
|
|
@@ -393,4 +369,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
393
369
|
type: Inject,
|
|
394
370
|
args: [TOLLE_CONFIG]
|
|
395
371
|
}] }, { type: i0.RendererFactory2 }] });
|
|
396
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7O0FBRzNELE1BQU0sT0FBTyxZQUFZO0lBT0s7SUFDRztJQUNhO0lBUnBDLFFBQVEsQ0FBWTtJQUNwQixhQUFhLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDNUQsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEMsT0FBTyxHQUFHLHFCQUFxQixDQUFDO0lBRXhDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFFaEQsc0VBQXNFO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxD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QyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdFLHNCQUFzQjtRQUN0QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLEtBQWEsRUFBRSxPQUFlO1FBQ2hELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV2QixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFbEQsT0FBTyxJQUFJLENBQUMs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QixZQUFZLGNBREMsTUFBTTs7NEZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFRN0IsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIFBMQVRGT1JNX0lELCBPcHRpb25hbCwgUmVuZGVyZXIyLCBSZW5kZXJlckZhY3RvcnkyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUT0xMRV9DT05GSUcsIFRvbGxlQ29uZmlnIH0gZnJvbSAnLi90b2xsZS1jb25maWcnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFRoZW1lU2VydmljZSB7XG4gIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgcHJpdmF0ZSBpc0RhcmtTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGlzRGFyayQgPSB0aGlzLmlzRGFya1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHByaXZhdGUgc3R5bGVJZCA9ICd0b2xsZS1keW5hbWljLXRoZW1lJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRPTExFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRvbGxlQ29uZmlnLFxuICAgIHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5MlxuICApIHtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRoZW1lKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUaGVtZSgpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIC8vIExPR0lDOiBVc2VyIFNhdmVkIFByZWZlcmVuY2VzID4gQ29uZmlnIERlZmF1bHRzID4gU3lzdGVtIFByZWZlcmVuY2VcbiAgICBjb25zdCBzYXZlZFRoZW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXRoZW1lJyk7XG4gICAgY29uc3Qgc2F2ZWRQcmltYXJ5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKTtcbiAgICBjb25zdCBzYXZlZFJhZGl1cyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1yYWRpdXMnKTtcbiAgICBjb25zdCBzeXN0ZW1QcmVmZXJzRGFyayA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcztcblxuICAgIGNvbnNvbGUubG9nKCdUaGVtZSBpbml0aWFsaXphdGlvbjonLCB7XG4gICAgICBzYXZlZFRoZW1lLFxuICAgICAgc2F2ZWRQcmltYXJ5LFxuICAgICAgc2F2ZWRSYWRpdXMsXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgc3lzdGVtUHJlZmVyc0RhcmtcbiAgICB9KTtcblxuICAgIC8vIDEuIERldGVybWluZSBEYXJrL0xpZ2h0IE1vZGVcbiAgICAvLyBQcmlvcml0eTogU2F2ZWQgVGhlbWUgPiBDb25maWcgRGVmYXVsdCA+IFN5c3RlbSBQcmVmZXJlbmNlXG4gICAgbGV0IHNob3VsZEJlRGFyayA9IHN5c3RlbVByZWZlcnNEYXJrOyAvLyBTdGFydCB3aXRoIHN5c3RlbVxuXG4gICAgaWYgKHNhdmVkVGhlbWUpIHtcbiAgICAgIC8vIFVzZXIgaGFzIHNhdmVkIHByZWZlcmVuY2VcbiAgICAgIHNob3VsZEJlRGFyayA9IHNhdmVkVGhlbWUgPT09ICdkYXJrJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5kYXJrQnlEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFVzZSBjb25maWcgZGVmYXVsdCBpZiBubyB1c2VyIHByZWZlcmVuY2VcbiAgICAgIHNob3VsZEJlRGFyayA9IHRoaXMuY29uZmlnLmRhcmtCeURlZmF1bHQ7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgdGhlbWUgbW9kZVxuICAgIGlmIChzaG91bGRCZURhcmspIHtcbiAgICAgIHRoaXMuZW5hYmxlRGFya01vZGUoZmFsc2UpOyAvLyBEb24ndCBzYXZlLCB3ZSdsbCBzYXZlIGFmdGVyIGNoZWNraW5nIGFsbCBwcmVmZXJlbmNlc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVEYXJrTW9kZShmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gQXBwbHkgUHJpbWFyeSBDb2xvclxuICAgIC8vIFByaW9yaXR5OiBTYXZlZCBDb2xvciA+IENvbmZpZyBDb2xvclxuICAgIGlmIChzYXZlZFByaW1hcnkpIHtcbiAgICAgIC8vIFVzZXIgaGFzIHNhdmVkIGNvbG9yIHByZWZlcmVuY2VcbiAgICAgIHRoaXMuc2V0UHJpbWFyeUNvbG9yKHNhdmVkUHJpbWFyeSwgZmFsc2UpOyAvLyBEb24ndCBzYXZlIGFnYWluXG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8ucHJpbWFyeUNvbG9yKSB7XG4gICAgICAvLyBVc2UgY29uZmlnIGRlZmF1bHQgaWYgbm8gdXNlciBwcmVmZXJlbmNlXG4gICAgICB0aGlzLnNldFByaW1hcnlDb2xvcih0aGlzLmNvbmZpZy5wcmltYXJ5Q29sb3IsIGZhbHNlKTsgLy8gU2F2ZSB0aGlzIGFzIHVzZXIgcHJlZmVyZW5jZVxuICAgIH1cblxuICAgIC8vIDMuIEFwcGx5IFJhZGl1c1xuICAgIC8vIFByaW9yaXR5OiBTYXZlZCBSYWRpdXMgPiBDb25maWcgUmFkaXVzXG4gICAgaWYgKHNhdmVkUmFkaXVzKSB7XG4gICAgICAvLyBVc2VyIGhhcyBzYXZlZCByYWRpdXMgcHJlZmVyZW5jZVxuICAgICAgdGhpcy5zZXRSYWRpdXMoc2F2ZWRSYWRpdXMsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5yYWRpdXMpIHtcbiAgICAgIC8vIFVzZSBjb25maWcgZGVmYXVsdCBpZiBubyB1c2VyIHByZWZlcmVuY2VcbiAgICAgIHRoaXMuc2V0UmFkaXVzKHRoaXMuY29uZmlnLnJhZGl1cywgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNhdmUgdGhlbWUgbW9kZSBwcmVmZXJlbmNlIGlmIGl0IGNhbWUgZnJvbSBjb25maWcgb3Igc3lzdGVtXG4gICAgaWYgKCFzYXZlZFRoZW1lKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCBzaG91bGRCZURhcmsgPyAnZGFyaycgOiAnbGlnaHQnKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIGJvcmRlciByYWRpdXMgZm9yIGFsbCBjb21wb25lbnRzXG4gICAqL1xuICBzZXRSYWRpdXMocmFkaXVzOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAvLyBTZXQgdGhlIENTUyB2YXJpYWJsZVxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm9vdCwgJy0tcmFkaXVzJywgcmFkaXVzKTtcblxuICAgIC8vIEFsc28gdXBkYXRlIHRoZSBkeW5hbWljIHN0eWxlcyB0byBpbmNsdWRlIHJhZGl1cyBjYWxjdWxhdGlvbnNcbiAgICB0aGlzLnVwZGF0ZVJhZGl1c0luRHluYW1pY1N0eWxlcyhyYWRpdXMpO1xuXG4gICAgLy8gUGVyc2lzdCBpZiBuZWVkZWRcbiAgICBpZiAocGVyc2lzdCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RvbGxlLXJhZGl1cycsIHJhZGl1cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHJhZGl1cyBjYWxjdWxhdGlvbnMgaW4gZHluYW1pYyBzdHlsZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlUmFkaXVzSW5EeW5hbWljU3R5bGVzKHJhZGl1czogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmdTdHlsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdHlsZUlkKTtcblxuICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICBsZXQgY3NzID0gZXhpc3RpbmdTdHlsZS50ZXh0Q29udGVudCB8fCAnJztcblxuICAgICAgLy8gVXBkYXRlIG9yIGFkZCByYWRpdXMgY2FsY3VsYXRpb25zXG4gICAgICBpZiAoY3NzLmluY2x1ZGVzKCctLXJhZGl1czonKSkge1xuICAgICAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJhZGl1cyBkZWNsYXJhdGlvbnNcbiAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UoLy0tcmFkaXVzOlteO10rOy9nLCBgLS1yYWRpdXM6ICR7cmFkaXVzfTtgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFkZCByYWRpdXMgdG8gdGhlIGJlZ2lubmluZyBvZiA6cm9vdFxuICAgICAgICBjc3MgPSBjc3MucmVwbGFjZSgvOnJvb3RcXHMqey8sIGA6cm9vdCB7XFxuICAgICAgLS1yYWRpdXM6ICR7cmFkaXVzfTtgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSBjYWxjdWxhdGVkIHJhZGl1cyB2YWx1ZXMgaW4gdGhlIENTU1xuICAgICAgY29uc3QgcmFkaXVzQ2FsY1JlZ2V4ID0gL2NhbGNcXCh2YXJcXCgtLXJhZGl1c1teKV0rXFwpL2c7XG4gICAgICBjc3MgPSBjc3MucmVwbGFjZShyYWRpdXNDYWxjUmVnZXgsIChtYXRjaCkgPT4ge1xuICAgICAgICBpZiAobWF0Y2guaW5jbHVkZXMoJy0gMnB4JykpIHtcbiAgICAgICAgICByZXR1cm4gYGNhbGMoJHtyYWRpdXN9IC0gMnB4KWA7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2guaW5jbHVkZXMoJy0gNHB4JykpIHtcbiAgICAgICAgICByZXR1cm4gYGNhbGMoJHtyYWRpdXN9IC0gNHB4KWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfSk7XG5cbiAgICAgIGV4aXN0aW5nU3R5bGUudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBmdWxsIHByaW1hcnkgY29sb3IgcGFsZXR0ZSAoNTAtOTAwKSBiYXNlZCBvbiBiYXNlIGNvbG9yXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlUHJpbWFyeVNoYWRlcyhiYXNlQ29sb3I6IHN0cmluZykge1xuICAgIC8vIENvbnZlcnQgaGV4IHRvIFJHQlxuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoYmFzZUNvbG9yKTtcbiAgICBjb25zdCByZ2JTdHJpbmcgPSByZ2IgPyBgJHtyZ2Iucn0gJHtyZ2IuZ30gJHtyZ2IuYn1gIDogJzM3IDk5IDIzNSc7XG5cbiAgICAvLyBDcmVhdGUgbGlnaHRlciByaW5nIGNvbG9ycyBpbiBSR0JcbiAgICBjb25zdCByaW5nTGlnaHQgPSB0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDQwKTtcbiAgICBjb25zdCByaW5nTGlnaHRSZ2IgPSB0aGlzLmhleFRvUmdiKHJpbmdMaWdodCk7XG4gICAgY29uc3QgcmluZ0xpZ2h0UmdiU3RyaW5nID0gcmluZ0xpZ2h0UmdiID8gYCR7cmluZ0xpZ2h0UmdiLnJ9ICR7cmluZ0xpZ2h0UmdiLmd9ICR7cmluZ0xpZ2h0UmdiLmJ9YCA6ICc5NiAxNjUgMjUwJztcblxuICAgIGNvbnN0IHJpbmdEYXJrID0gdGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAyMCk7XG4gICAgY29uc3QgcmluZ0RhcmtSZ2IgPSB0aGlzLmhleFRvUmdiKHJpbmdEYXJrKTtcbiAgICBjb25zdCByaW5nRGFya1JnYlN0cmluZyA9IHJpbmdEYXJrUmdiID8gYCR7cmluZ0RhcmtSZ2Iucn0gJHtyaW5nRGFya1JnYi5nfSAke3JpbmdEYXJrUmdiLmJ9YCA6ICcxNDcgMTk3IDI1Myc7XG5cbiAgICAvLyBHZXQgY3VycmVudCByYWRpdXMgb3IgdXNlIGRlZmF1bHRcbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgY29uc3QgY3VycmVudFJhZGl1cyA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1yYWRpdXMnKS50cmltKCkgfHwgJzAuNXJlbSc7XG5cbiAgICBjb25zdCBjc3MgPSBgXG4gICAgICAvKiBPdmVycmlkZSBwcmltYXJ5IGNvbG9ycyAtIHRoaXMgbmVlZHMgdG8gY29tZSBBRlRFUiB5b3VyIG1haW4gQ1NTICovXG4gICAgICA6cm9vdCB7XG4gICAgICAgIC8qIFByaW1hcnkgaW4gUkdCIGZvcm1hdCBmb3IgVGFpbHdpbmQgb3BhY2l0eSBzdXBwb3J0ICovXG4gICAgICAgIC0tcHJpbWFyeTogJHtyZ2JTdHJpbmd9O1xuICAgICAgICAtLXByaW1hcnktZm9yZWdyb3VuZDogJHt0aGlzLmdldENvbnRyYXN0Q29sb3JSZ2IoYmFzZUNvbG9yKX07XG5cbiAgICAgICAgLyogUmFkaXVzICovXG4gICAgICAgIC0tcmFkaXVzOiAke2N1cnJlbnRSYWRpdXN9O1xuXG4gICAgICAgIC8qIFByaW1hcnkgc2hhZGVzIGZvciBsaWdodCBtb2RlICovXG4gICAgICAgIC0tcHJpbWFyeS01MDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgOTApKX07XG4gICAgICAgIC0tcHJpbWFyeS0xMDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDgwKSl9O1xuICAgICAgICAtLXByaW1hcnktMjAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA2MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTMwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgNDApKX07XG4gICAgICAgIC0tcHJpbWFyeS00MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDIwKSl9O1xuICAgICAgICAtLXByaW1hcnktNTAwOiAke3JnYlN0cmluZ307XG4gICAgICAgIC0tcHJpbWFyeS02MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmRhcmtlbkNvbG9yKGJhc2VDb2xvciwgMjApKX07XG4gICAgICAgIC0tcHJpbWFyeS03MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmRhcmtlbkNvbG9yKGJhc2VDb2xvciwgNDApKX07XG4gICAgICAgIC0tcHJpbWFyeS04MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmRhcmtlbkNvbG9yKGJhc2VDb2xvciwgNjApKX07XG4gICAgICAgIC0tcHJpbWFyeS05MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmRhcmtlbkNvbG9yKGJhc2VDb2xvciwgODApKX07XG5cbiAgICAgICAgLyogVXBkYXRlIHJpbmcgY29sb3IgdG8gYmUgbGlnaHRlciAqL1xuICAgICAgICAtLXJpbmc6ICR7cmluZ0xpZ2h0UmdiU3RyaW5nfTtcbiAgICAgIH1cblxuICAgICAgLmRhcmsge1xuICAgICAgICAvKiBGb3IgZGFyayBtb2RlLCB3ZSBrZWVwIHRoZSBwcmltYXJ5IGNvbG9yIGJ1dCBhZGp1c3Qgc2hhZGVzICovXG4gICAgICAgIC0tcHJpbWFyeTogJHtyZ2JTdHJpbmd9O1xuICAgICAgICAtLXByaW1hcnktZm9yZWdyb3VuZDogJHt0aGlzLmdldENvbnRyYXN0Q29sb3JSZ2IoYmFzZUNvbG9yKX07XG5cbiAgICAgICAgLyogRGFyayBtb2RlIHNoYWRlcyAqL1xuICAgICAgICAtLXByaW1hcnktNTA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmRhcmtlbkNvbG9yKGJhc2VDb2xvciwgODUpKX07XG4gICAgICAgIC0tcHJpbWFyeS0xMDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmRhcmtlbkNvbG9yKGJhc2VDb2xvciwgNzUpKX07XG4gICAgICAgIC0tcHJpbWFyeS0yMDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmRhcmtlbkNvbG9yKGJhc2VDb2xvciwgNjUpKX07XG4gICAgICAgIC0tcHJpbWFyeS0zMDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmRhcmtlbkNvbG9yKGJhc2VDb2xvciwgNTUpKX07XG4gICAgICAgIC0tcHJpbWFyeS00MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmRhcmtlbkNvbG9yKGJhc2VDb2xvciwgNDUpKX07XG4gICAgICAgIC0tcHJpbWFyeS01MDA6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LTYwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgMjApKX07XG4gICAgICAgIC0tcHJpbWFyeS03MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDM1KSl9O1xuICAgICAgICAtLXByaW1hcnktODAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA1MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTkwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgNjUpKX07XG5cbiAgICAgICAgLyogVXBkYXRlIHJpbmcgY29sb3IgZm9yIGRhcmsgbW9kZSAtIGxpZ2h0ZXIgdmFyaWFudCAqL1xuICAgICAgICAtLXJpbmc6ICR7cmluZ0RhcmtSZ2JTdHJpbmd9O1xuICAgICAgfVxuICAgIGA7XG5cbiAgICB0aGlzLmluamVjdER5bmFtaWNTdHlsZXMoY3NzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGhleCBjb2xvciB0byBSR0Igb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIGhleFRvUmdiKGhleDogc3RyaW5nKTogeyByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyIH0gfCBudWxsIHtcbiAgICAvLyBSZW1vdmUgIyBpZiBwcmVzZW50XG4gICAgY29uc3QgY2xlYW5lZEhleCA9IGhleC5yZXBsYWNlKCcjJywgJycpO1xuXG4gICAgbGV0IHIgPSAwLCBnID0gMCwgYiA9IDA7XG5cbiAgICBpZiAoY2xlYW5lZEhleC5sZW5ndGggPT09IDMpIHtcbiAgICAgIHIgPSBwYXJzZUludChjbGVhbmVkSGV4WzBdICsgY2xlYW5lZEhleFswXSwgMTYpO1xuICAgICAgZyA9IHBhcnNlSW50KGNsZWFuZWRIZXhbMV0gKyBjbGVhbmVkSGV4WzFdLCAxNik7XG4gICAgICBiID0gcGFyc2VJbnQoY2xlYW5lZEhleFsyXSArIGNsZWFuZWRIZXhbMl0sIDE2KTtcbiAgICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbiAgICB9XG5cbiAgICBpZiAoY2xlYW5lZEhleC5sZW5ndGggPT09IDYpIHtcbiAgICAgIHIgPSBwYXJzZUludChjbGVhbmVkSGV4LnN1YnN0cmluZygwLCAyKSwgMTYpO1xuICAgICAgZyA9IHBhcnNlSW50KGNsZWFuZWRIZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XG4gICAgICBiID0gcGFyc2VJbnQoY2xlYW5lZEhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcbiAgICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGhleCB0byBSR0Igc3RyaW5nIGZvcm1hdCBmb3IgQ1NTIChzcGFjZS1zZXBhcmF0ZWQpXG4gICAqL1xuICBwcml2YXRlIGhleFRvUmdiU3RyaW5nKGhleENvbG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoaGV4Q29sb3IpO1xuICAgIHJldHVybiByZ2IgPyBgJHtyZ2Iucn0gJHtyZ2IuZ30gJHtyZ2IuYn1gIDogJzM3IDk5IDIzNSc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbnRyYXN0IGNvbG9yIGluIFJHQiBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29udHJhc3RDb2xvclJnYihoZXhDb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cmFzdCA9IHRoaXMuZ2V0Q29udHJhc3RDb2xvcihoZXhDb2xvcik7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihjb250cmFzdCk7XG4gICAgcmV0dXJuIHJnYiA/IGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWAgOiAnMjU1IDI1NSAyNTUnO1xuICB9XG5cbiAgLyoqXG4gICAqIExpZ2h0ZW4gYSBoZXggY29sb3IgYnkgYSBwZXJjZW50YWdlXG4gICAqL1xuICBwcml2YXRlIGxpZ2h0ZW5Db2xvcihjb2xvcjogc3RyaW5nLCBwZXJjZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoY29sb3IpO1xuICAgIGlmICghcmdiKSByZXR1cm4gY29sb3I7XG5cbiAgICAvLyBMaWdodGVuIGJ5IHBlcmNlbnRhZ2VcbiAgICBjb25zdCByID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHJnYi5yICsgKDI1NSAtIHJnYi5yKSAqIChwZXJjZW50IC8gMTAwKSkpO1xuICAgIGNvbnN0IGcgPSBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IocmdiLmcgKyAoMjU1IC0gcmdiLmcpICogKHBlcmNlbnQgLyAxMDApKSk7XG4gICAgY29uc3QgYiA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyZ2IuYiArICgyNTUgLSByZ2IuYikgKiAocGVyY2VudCAvIDEwMCkpKTtcblxuICAgIC8vIENvbnZlcnQgYmFjayB0byBoZXhcbiAgICByZXR1cm4gYCMkeygoMSA8PCAyNCkgKyAociA8PCAxNikgKyAoZyA8PCA4KSArIGIpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIERhcmtlbiBhIGhleCBjb2xvciBieSBhIHBlcmNlbnRhZ2VcbiAgICovXG4gIHByaXZhdGUgZGFya2VuQ29sb3IoY29sb3I6IHN0cmluZywgcGVyY2VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcbiAgICBpZiAoIXJnYikgcmV0dXJuIGNvbG9yO1xuXG4gICAgY29uc3QgZmFjdG9yID0gMSAtIChwZXJjZW50IC8gMTAwKTtcbiAgICBjb25zdCByID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihyZ2IuciAqIGZhY3RvcikpO1xuICAgIGNvbnN0IGcgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHJnYi5nICogZmFjdG9yKSk7XG4gICAgY29uc3QgYiA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmdiLmIgKiBmYWN0b3IpKTtcblxuICAgIHJldHVybiBgIyR7ci50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke2cudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGNvbnRyYXN0IGNvbG9yIChibGFjayBvciB3aGl0ZSkgYmFzZWQgb24gYmFja2dyb3VuZCBjb2xvclxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb250cmFzdENvbG9yKGhleENvbG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoaGV4Q29sb3IpO1xuICAgIGlmICghcmdiKSByZXR1cm4gJyNmZmZmZmYnO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHJlbGF0aXZlIGx1bWluYW5jZVxuICAgIGNvbnN0IGx1bWluYW5jZSA9ICgwLjI5OSAqIHJnYi5yICsgMC41ODcgKiByZ2IuZyArIDAuMTE0ICogcmdiLmIpIC8gMjU1O1xuXG4gICAgLy8gUmV0dXJuIGJsYWNrIGZvciBsaWdodCBjb2xvcnMsIHdoaXRlIGZvciBkYXJrIGNvbG9yc1xuICAgIHJldHVybiBsdW1pbmFuY2UgPiAwLjUgPyAnIzAwMDAwMCcgOiAnI2ZmZmZmZic7XG4gIH1cblxuICBwcml2YXRlIGluamVjdER5bmFtaWNTdHlsZXMoY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGV4aXN0aW5nU3R5bGUucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWxlbWVudC5pZCA9IHRoaXMuc3R5bGVJZDtcbiAgICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICB0b2dnbGVUaGVtZSgpIHtcbiAgICBjb25zdCBpc0N1cnJlbnRseURhcmsgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RhcmsnKTtcbiAgICBpc0N1cnJlbnRseURhcmsgPyB0aGlzLmRpc2FibGVEYXJrTW9kZSgpIDogdGhpcy5lbmFibGVEYXJrTW9kZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVEYXJrTW9kZShzYXZlVG9TdG9yYWdlID0gdHJ1ZSkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdkYXJrJyk7XG4gICAgaWYgKHNhdmVUb1N0b3JhZ2UpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS10aGVtZScsICdkYXJrJyk7XG4gICAgfVxuICAgIHRoaXMuaXNEYXJrU3ViamVjdC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlRGFya01vZGUoc2F2ZVRvU3RvcmFnZSA9IHRydWUpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnZGFyaycpO1xuICAgIGlmIChzYXZlVG9TdG9yYWdlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnbGlnaHQnKTtcbiAgICB9XG4gICAgdGhpcy5pc0RhcmtTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICB9XG4gIHNldFByaW1hcnlDb2xvcihjb2xvcjogc3RyaW5nLCBwZXJzaXN0ID0gdHJ1ZSkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5nZW5lcmF0ZVByaW1hcnlTaGFkZXMoY29sb3IpO1xuXG4gICAgLy8gQWxzbyBzZXQgaW5saW5lIGZvciBpbW1lZGlhdGUgdXBkYXRlXG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihjb2xvcik7XG4gICAgaWYgKHJnYikge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgICctLXByaW1hcnknLFxuICAgICAgICBgJHtyZ2Iucn0gJHtyZ2IuZ30gJHtyZ2IuYn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicsIGNvbG9yKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY3VycmVudFRoZW1lKCk6ICdkYXJrJyB8ICdsaWdodCcge1xuICAgIHJldHVybiB0aGlzLmlzRGFya1N1YmplY3QudmFsdWUgPyAnZGFyaycgOiAnbGlnaHQnO1xuICB9XG5cbiAgZ2V0IHByaW1hcnlDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IGNzc1ZhbHVlID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXByaW1hcnknKS50cmltKCk7XG5cbiAgICBpZiAoY3NzVmFsdWUgJiYgY3NzVmFsdWUgIT09ICcnKSB7XG4gICAgICAvLyBDb252ZXJ0IFJHQiBzdHJpbmcgYmFjayB0byBoZXggZm9yIGV4dGVybmFsIHVzZVxuICAgICAgY29uc3QgcmdiUGFydHMgPSBjc3NWYWx1ZS5zcGxpdCgnICcpLm1hcChOdW1iZXIpO1xuICAgICAgaWYgKHJnYlBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gYCMke3JnYlBhcnRzWzBdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7cmdiUGFydHNbMV0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtyZ2JQYXJ0c1syXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRvIGNvbmZpZyBkZWZhdWx0cyAoY2xlYXJzIHVzZXIgcHJlZmVyZW5jZXMpXG4gICAqL1xuICByZXNldFRvQ29uZmlnRGVmYXVsdHMoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICAvLyBDbGVhciB1c2VyIHByZWZlcmVuY2VzXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvbGxlLXRoZW1lJyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKTtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtcmFkaXVzJyk7XG5cbiAgICAvLyBSZS1pbml0aWFsaXplIHdpdGggY29uZmlnIGRlZmF1bHRzXG4gICAgdGhpcy5pbml0aWFsaXplVGhlbWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIHByZWZlcmVuY2VzXG4gICAqL1xuICBnZXRVc2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICB0aGVtZTogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXRoZW1lJyksXG4gICAgICBwcmltYXJ5Q29sb3I6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyksXG4gICAgICByYWRpdXM6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1yYWRpdXMnKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIHVzZXIgcHJlZmVyZW5jZXNcbiAgICovXG4gIGNsZWFyVXNlclByZWZlcmVuY2VzKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvbGxlLXRoZW1lJyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKTtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtcmFkaXVzJyk7XG5cbiAgICAvLyBSZXNldCB0byBzeXN0ZW0gZGVmYXVsdHMgKG5vdCBjb25maWcgZGVmYXVsdHMpXG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG4gICAgaWYgKHN5c3RlbVByZWZlcnNEYXJrKSB7XG4gICAgICB0aGlzLmVuYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBDU1MgdmFyaWFibGVzXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUocm9vdCwgJy0tcHJpbWFyeScpO1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUocm9vdCwgJy0tcmFkaXVzJyk7XG5cbiAgICAvLyBDbGVhciBkeW5hbWljIHN0eWxlc1xuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGV4aXN0aW5nU3R5bGUucmVtb3ZlKCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
372
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBR3ZDLE1BQU0sT0FBTyxZQUFZO0lBUUs7SUFDRztJQUNhO0lBVHBDLFFBQVEsQ0FBWTtJQUNwQixPQUFPLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFckMsT0FBTyxHQUFHLHFCQUFxQixDQUFDO0lBRXhDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFFaEQsc0VBQXNFO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkQsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLENBQUMsT0FBTyxDQUFDO1FBRXBGLDRCQUE0QjtRQUM1QixJQUFJLFlBQVksR0FBRyxpQkFBaUIsQ0FBQztRQUVyQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsWUFBWSxHQUFHLFVBQVUsS0FBSyxNQUFNLENBQUM7UUFDdkMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDcEQsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQzNDLENBQUM7UUFFRCxtQkFBbUI7UUFDbkIsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxlQUFlO1FBQ2YsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkUsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsTUFBYyxFQUFFLE9BQU8sR0FBRyxJQUFJO1FBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQUUsT0FBTztRQUVoRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRU8sd0JBQXdCLENBQUMsVUFBa0I7UUFDakQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFFM0MscURBQXFEO1FBQ3JELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQywwQkFBMEIsVUFBVSx5QkFBeUIsQ0FBQyxDQUFDO1lBQzVFLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1Qix5REFBeUQ7UUFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLEdBQUcsWUFBWSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLEdBQUcsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsR0FBRyxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxHQUFHLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTywyQkFBMkIsQ0FBQyxNQUFjO1FBQ2hELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVqRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLElBQUksR0FBRyxHQUFHLGFBQWEsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1lBRTFDLCtDQUErQztZQUMvQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFDNUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTVCLE1BQU0sWUFBWSxHQUFHO29CQUNuQixhQUFhLEVBQUUsR0FBRyxZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRTtvQkFDN0MsYUFBYSxFQUFFLEdBQUcsWUFBWSxHQUFHLElBQUksRUFBRTtvQkFDdkMsYUFBYSxFQUFFLEdBQUcsWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUU7b0JBQzdDLGFBQWEsRUFBRSxHQUFHLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFO29CQUMzQyxjQUFjLEVBQUUsR0FBRyxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRTtvQkFDNUMsY0FBYyxFQUFFLEdBQUcsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUU7b0JBQzVDLGVBQWUsRUFBRSxRQUFRO2lCQUMxQixDQUFDO2dCQUVGLHFCQUFxQjtnQkFDckIsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7b0JBQzlCLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLGFBQWEsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDaEUsQ0FBQztnQkFFRCxzQ0FBc0M7Z0JBQ3RDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtvQkFDeEQsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsT0FBTyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ25ELEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLE9BQU8sS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDO29CQUNwRCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sdUNBQXVDO3dCQUN2QyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLE9BQU8sS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDO29CQUN6RSxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELGFBQWEsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsU0FBaUI7UUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBRW5FLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1FBRWpILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO1FBRTdHLGdDQUFnQztRQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUMzQyxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxRQUFRLENBQUM7UUFFN0Ysc0NBQXNDO1FBQ3RDLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNuRSxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFFekIsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTVCLGVBQWUsR0FBRztvQkFDSixhQUFhO3VCQUNWLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSTt1QkFDekIsWUFBWSxHQUFHLElBQUk7dUJBQ25CLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSTt1QkFDekIsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJO3dCQUN0QixZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUk7d0JBQ3ZCLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSTs7T0FFeEMsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sZUFBZSxHQUFHLGFBQWEsYUFBYSxHQUFHLENBQUM7UUFDbEQsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHOztxQkFFSyxTQUFTO2dDQUNFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7VUFDekQsZUFBZTt3QkFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUNwRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUNyRCxTQUFTO3lCQUNULElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7eUJBQ3BELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7eUJBQ3BELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7eUJBQ3BELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7a0JBQzNELGtCQUFrQjs7OztxQkFJZixTQUFTO2dDQUNFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7VUFDekQsZUFBZTt3QkFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUNuRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUNwRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUNwRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUNwRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUNwRCxTQUFTO3lCQUNULElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7eUJBQ3JELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7eUJBQ3JELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7eUJBQ3JELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7a0JBQzVELGlCQUFpQjs7S0FFOUIsQ0FBQztRQUVGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sUUFBUSxDQUFDLEdBQVc7UUFDMUIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV4QixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRCxDQUFDLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEQsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUVELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixDQUFDLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0MsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sY0FBYyxDQUFDLFFBQWdCO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQzFELENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxRQUFnQjtRQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDNUQsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFhLEVBQUUsT0FBZTtRQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFdkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0UsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0UsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0UsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFTyxXQUFXLENBQUMsS0FBYSxFQUFFLE9BQWU7UUFDaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUVsRCxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFB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QVZ2QixZQUFZLGNBREMsTUFBTTs7NEZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFTN0IsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIFBMQVRGT1JNX0lELCBPcHRpb25hbCwgUmVuZGVyZXIyLCBSZW5kZXJlckZhY3RvcnkyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3Nlcn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRPTExFX0NPTkZJRywgVG9sbGVDb25maWcgfSBmcm9tICcuL3RvbGxlLWNvbmZpZyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHByaXZhdGUgX2lzRGFyayA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgaXNEYXJrJCA9IHRoaXMuX2lzRGFyay5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHN0eWxlSWQgPSAndG9sbGUtZHluYW1pYy10aGVtZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBvYmplY3QsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChUT0xMRV9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBUb2xsZUNvbmZpZyxcbiAgICByZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTJcbiAgKSB7XG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcbiAgICB0aGlzLmluaXRpYWxpemVUaGVtZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGhlbWUoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICAvLyBMT0dJQzogVXNlciBTYXZlZCBQcmVmZXJlbmNlcyA+IENvbmZpZyBEZWZhdWx0cyA+IFN5c3RlbSBQcmVmZXJlbmNlXG4gICAgY29uc3Qgc2F2ZWRUaGVtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS10aGVtZScpO1xuICAgIGNvbnN0IHNhdmVkUHJpbWFyeSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gICAgY29uc3Qgc2F2ZWRSYWRpdXMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcmFkaXVzJyk7XG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG5cbiAgICAvLyBEZXRlcm1pbmUgRGFyay9MaWdodCBNb2RlXG4gICAgbGV0IHNob3VsZEJlRGFyayA9IHN5c3RlbVByZWZlcnNEYXJrO1xuXG4gICAgaWYgKHNhdmVkVGhlbWUpIHtcbiAgICAgIHNob3VsZEJlRGFyayA9IHNhdmVkVGhlbWUgPT09ICdkYXJrJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5kYXJrQnlEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNob3VsZEJlRGFyayA9IHRoaXMuY29uZmlnLmRhcmtCeURlZmF1bHQ7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgdGhlbWUgbW9kZVxuICAgIGlmIChzaG91bGRCZURhcmspIHtcbiAgICAgIHRoaXMuZW5hYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVEYXJrTW9kZShmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgUHJpbWFyeSBDb2xvclxuICAgIGlmIChzYXZlZFByaW1hcnkpIHtcbiAgICAgIHRoaXMuc2V0UHJpbWFyeUNvbG9yKHNhdmVkUHJpbWFyeSwgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LnByaW1hcnlDb2xvcikge1xuICAgICAgdGhpcy5zZXRQcmltYXJ5Q29sb3IodGhpcy5jb25maWcucHJpbWFyeUNvbG9yLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgUmFkaXVzXG4gICAgaWYgKHNhdmVkUmFkaXVzKSB7XG4gICAgICB0aGlzLnNldFJhZGl1cyhzYXZlZFJhZGl1cywgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LnJhZGl1cykge1xuICAgICAgdGhpcy5zZXRSYWRpdXModGhpcy5jb25maWcucmFkaXVzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKCFzYXZlZFRoZW1lKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCBzaG91bGRCZURhcmsgPyAnZGFyaycgOiAnbGlnaHQnKTtcbiAgICB9XG4gIH1cblxuICBzZXRSYWRpdXMocmFkaXVzOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCAnLS1yYWRpdXMnLCByYWRpdXMpO1xuICAgIHRoaXMudXBkYXRlUmFkaXVzSW5EeW5hbWljU3R5bGVzKHJhZGl1cyk7XG4gICAgdGhpcy51cGRhdGVBbGxSYWRpdXNWYXJpYWJsZXMocmFkaXVzKTtcblxuICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtcmFkaXVzJywgcmFkaXVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUFsbFJhZGl1c1ZhcmlhYmxlcyhiYXNlUmFkaXVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAvLyBQYXJzZSB0aGUgcmFkaXVzIHRvIGV4dHJhY3QgbnVtZXJpYyB2YWx1ZSBhbmQgdW5pdFxuICAgIGNvbnN0IHJhZGl1c01hdGNoID0gYmFzZVJhZGl1cy5tYXRjaCgvXihcXGQqXFwuP1xcZCspKFthLXpdK3wlKSQvKTtcbiAgICBpZiAoIXJhZGl1c01hdGNoKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEludmFsaWQgcmFkaXVzIGZvcm1hdDogJHtiYXNlUmFkaXVzfS4gVXNpbmcgZGVmYXVsdCB2YWx1ZXMuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgY29uc3QgdW5pdCA9IHJhZGl1c01hdGNoWzJdO1xuXG4gICAgLy8gU2V0IGFsbCByYWRpdXMgdmFyaWFibGVzIGFjY29yZGluZyB0byB5b3VyIENTUyBjbGFzc2VzXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCAnLS1yYWRpdXMtc20nLCBgJHtudW1lcmljVmFsdWUgKiAwLjV9JHt1bml0fWApO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm9vdCwgJy0tcmFkaXVzLW1kJywgYCR7bnVtZXJpY1ZhbHVlfSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy1sZycsIGAke251bWVyaWNWYWx1ZSAqIDEuNX0ke3VuaXR9YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCAnLS1yYWRpdXMteGwnLCBgJHtudW1lcmljVmFsdWUgKiAyfSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy0yeGwnLCBgJHtudW1lcmljVmFsdWUgKiAzfSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy0zeGwnLCBgJHtudW1lcmljVmFsdWUgKiA0fSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy1mdWxsJywgJzk5OTlweCcpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSYWRpdXNJbkR5bmFtaWNTdHlsZXMocmFkaXVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuXG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGxldCBjc3MgPSBleGlzdGluZ1N0eWxlLnRleHRDb250ZW50IHx8ICcnO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgcmFkaXVzIHRvIGNhbGN1bGF0ZSBkZXJpdmVkIHZhbHVlc1xuICAgICAgY29uc3QgcmFkaXVzTWF0Y2ggPSByYWRpdXMubWF0Y2goL14oXFxkKlxcLj9cXGQrKShbYS16XSt8JSkkLyk7XG4gICAgICBpZiAocmFkaXVzTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgICAgIGNvbnN0IHVuaXQgPSByYWRpdXNNYXRjaFsyXTtcblxuICAgICAgICBjb25zdCBkZXJpdmVkUmFkaWkgPSB7XG4gICAgICAgICAgJy0tcmFkaXVzLXNtJzogYCR7bnVtZXJpY1ZhbHVlICogMC41fSR7dW5pdH1gLFxuICAgICAgICAgICctLXJhZGl1cy1tZCc6IGAke251bWVyaWNWYWx1ZX0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtbGcnOiBgJHtudW1lcmljVmFsdWUgKiAxLjV9JHt1bml0fWAsXG4gICAgICAgICAgJy0tcmFkaXVzLXhsJzogYCR7bnVtZXJpY1ZhbHVlICogMn0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtMnhsJzogYCR7bnVtZXJpY1ZhbHVlICogM30ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtM3hsJzogYCR7bnVtZXJpY1ZhbHVlICogNH0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtZnVsbCc6ICc5OTk5cHgnXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVXBkYXRlIGJhc2UgcmFkaXVzXG4gICAgICAgIGlmIChjc3MuaW5jbHVkZXMoJy0tcmFkaXVzOicpKSB7XG4gICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UoLy0tcmFkaXVzOlteO10rOy9nLCBgLS1yYWRpdXM6ICR7cmFkaXVzfTtgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBhbGwgZGVyaXZlZCByYWRpdXMgdmFyaWFibGVzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGRlcml2ZWRSYWRpaSkuZm9yRWFjaCgoW3Zhck5hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGlmIChjc3MuaW5jbHVkZXModmFyTmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgJHt2YXJOYW1lfTpbXjtdKztgLCAnZycpO1xuICAgICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UocmVnZXgsIGAke3Zhck5hbWV9OiAke3ZhbHVlfTtgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSB2YXJpYWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICBjc3MgPSBjc3MucmVwbGFjZSgvOnJvb3RcXHMqey8sIGA6cm9vdCB7XFxuICAgICAgJHt2YXJOYW1lfTogJHt2YWx1ZX07YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZXhpc3RpbmdTdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUHJpbWFyeVNoYWRlcyhiYXNlQ29sb3I6IHN0cmluZykge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoYmFzZUNvbG9yKTtcbiAgICBjb25zdCByZ2JTdHJpbmcgPSByZ2IgPyBgJHtyZ2Iucn0gJHtyZ2IuZ30gJHtyZ2IuYn1gIDogJzM3IDk5IDIzNSc7XG5cbiAgICBjb25zdCByaW5nTGlnaHQgPSB0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDQwKTtcbiAgICBjb25zdCByaW5nTGlnaHRSZ2IgPSB0aGlzLmhleFRvUmdiKHJpbmdMaWdodCk7XG4gICAgY29uc3QgcmluZ0xpZ2h0UmdiU3RyaW5nID0gcmluZ0xpZ2h0UmdiID8gYCR7cmluZ0xpZ2h0UmdiLnJ9ICR7cmluZ0xpZ2h0UmdiLmd9ICR7cmluZ0xpZ2h0UmdiLmJ9YCA6ICc5NiAxNjUgMjUwJztcblxuICAgIGNvbnN0IHJpbmdEYXJrID0gdGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAyMCk7XG4gICAgY29uc3QgcmluZ0RhcmtSZ2IgPSB0aGlzLmhleFRvUmdiKHJpbmdEYXJrKTtcbiAgICBjb25zdCByaW5nRGFya1JnYlN0cmluZyA9IHJpbmdEYXJrUmdiID8gYCR7cmluZ0RhcmtSZ2Iucn0gJHtyaW5nRGFya1JnYi5nfSAke3JpbmdEYXJrUmdiLmJ9YCA6ICcxNDcgMTk3IDI1Myc7XG5cbiAgICAvLyBHZXQgY3VycmVudCByYWRpdXMgb3IgZGVmYXVsdFxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50UmFkaXVzID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXJhZGl1cycpLnRyaW0oKSB8fCAnMC41cmVtJztcblxuICAgIC8vIENhbGN1bGF0ZSBhbGwgZGVyaXZlZCByYWRpdXMgdmFsdWVzXG4gICAgY29uc3QgcmFkaXVzTWF0Y2ggPSBjdXJyZW50UmFkaXVzLm1hdGNoKC9eKFxcZCpcXC4/XFxkKykoW2Etel0rfCUpJC8pO1xuICAgIGxldCByYWRpdXNWYXJpYWJsZXMgPSAnJztcblxuICAgIGlmIChyYWRpdXNNYXRjaCkge1xuICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgICBjb25zdCB1bml0ID0gcmFkaXVzTWF0Y2hbMl07XG5cbiAgICAgIHJhZGl1c1ZhcmlhYmxlcyA9IGBcbiAgICAgICAgLS1yYWRpdXM6ICR7Y3VycmVudFJhZGl1c307XG4gICAgICAgIC0tcmFkaXVzLXNtOiAke251bWVyaWNWYWx1ZSAqIDAuNX0ke3VuaXR9O1xuICAgICAgICAtLXJhZGl1cy1tZDogJHtudW1lcmljVmFsdWV9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtbGc6ICR7bnVtZXJpY1ZhbHVlICogMS41fSR7dW5pdH07XG4gICAgICAgIC0tcmFkaXVzLXhsOiAke251bWVyaWNWYWx1ZSAqIDJ9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtMnhsOiAke251bWVyaWNWYWx1ZSAqIDN9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtM3hsOiAke251bWVyaWNWYWx1ZSAqIDR9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuICAgICAgYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFkaXVzVmFyaWFibGVzID0gYC0tcmFkaXVzOiAke2N1cnJlbnRSYWRpdXN9O2A7XG4gICAgfVxuXG4gICAgY29uc3QgY3NzID0gYFxuICAgICAgOnJvb3Qge1xuICAgICAgICAtLXByaW1hcnk6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LWZvcmVncm91bmQ6ICR7dGhpcy5nZXRDb250cmFzdENvbG9yUmdiKGJhc2VDb2xvcil9O1xuICAgICAgICAke3JhZGl1c1ZhcmlhYmxlc31cbiAgICAgICAgLS1wcmltYXJ5LTUwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA5MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTEwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgODApKX07XG4gICAgICAgIC0tcHJpbWFyeS0yMDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDYwKSl9O1xuICAgICAgICAtLXByaW1hcnktMzAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA0MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTQwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgMjApKX07XG4gICAgICAgIC0tcHJpbWFyeS01MDA6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LTYwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCAyMCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTcwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA0MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTgwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA2MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTkwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA4MCkpfTtcbiAgICAgICAgLS1yaW5nOiAke3JpbmdMaWdodFJnYlN0cmluZ307XG4gICAgICB9XG5cbiAgICAgIC5kYXJrIHtcbiAgICAgICAgLS1wcmltYXJ5OiAke3JnYlN0cmluZ307XG4gICAgICAgIC0tcHJpbWFyeS1mb3JlZ3JvdW5kOiAke3RoaXMuZ2V0Q29udHJhc3RDb2xvclJnYihiYXNlQ29sb3IpfTtcbiAgICAgICAgJHtyYWRpdXNWYXJpYWJsZXN9XG4gICAgICAgIC0tcHJpbWFyeS01MDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA4NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTEwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA3NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTIwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA2NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTMwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA1NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTQwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA0NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTUwMDogJHtyZ2JTdHJpbmd9O1xuICAgICAgICAtLXByaW1hcnktNjAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAyMCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTcwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgMzUpKX07XG4gICAgICAgIC0tcHJpbWFyeS04MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDUwKSl9O1xuICAgICAgICAtLXByaW1hcnktOTAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA2NSkpfTtcbiAgICAgICAgLS1yaW5nOiAke3JpbmdEYXJrUmdiU3RyaW5nfTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgdGhpcy5pbmplY3REeW5hbWljU3R5bGVzKGNzcyk7XG4gIH1cblxuICBwcml2YXRlIGhleFRvUmdiKGhleDogc3RyaW5nKTogeyByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBjbGVhbmVkSGV4ID0gaGV4LnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgbGV0IHIgPSAwLCBnID0gMCwgYiA9IDA7XG5cbiAgICBpZiAoY2xlYW5lZEhleC5sZW5ndGggPT09IDMpIHtcbiAgICAgIHIgPSBwYXJzZUludChjbGVhbmVkSGV4WzBdICsgY2xlYW5lZEhleFswXSwgMTYpO1xuICAgICAgZyA9IHBhcnNlSW50KGNsZWFuZWRIZXhbMV0gKyBjbGVhbmVkSGV4WzFdLCAxNik7XG4gICAgICBiID0gcGFyc2VJbnQoY2xlYW5lZEhleFsyXSArIGNsZWFuZWRIZXhbMl0sIDE2KTtcbiAgICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbiAgICB9XG5cbiAgICBpZiAoY2xlYW5lZEhleC5sZW5ndGggPT09IDYpIHtcbiAgICAgIHIgPSBwYXJzZUludChjbGVhbmVkSGV4LnN1YnN0cmluZygwLCAyKSwgMTYpO1xuICAgICAgZyA9IHBhcnNlSW50KGNsZWFuZWRIZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XG4gICAgICBiID0gcGFyc2VJbnQoY2xlYW5lZEhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcbiAgICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGV4VG9SZ2JTdHJpbmcoaGV4Q29sb3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihoZXhDb2xvcik7XG4gICAgcmV0dXJuIHJnYiA/IGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWAgOiAnMzcgOTkgMjM1JztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udHJhc3RDb2xvclJnYihoZXhDb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cmFzdCA9IHRoaXMuZ2V0Q29udHJhc3RDb2xvcihoZXhDb2xvcik7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihjb250cmFzdCk7XG4gICAgcmV0dXJuIHJnYiA/IGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWAgOiAnMjU1IDI1NSAyNTUnO1xuICB9XG5cbiAgcHJpdmF0ZSBsaWdodGVuQ29sb3IoY29sb3I6IHN0cmluZywgcGVyY2VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcbiAgICBpZiAoIXJnYikgcmV0dXJuIGNvbG9yO1xuXG4gICAgY29uc3QgciA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyZ2IuciArICgyNTUgLSByZ2IucikgKiAocGVyY2VudCAvIDEwMCkpKTtcbiAgICBjb25zdCBnID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHJnYi5nICsgKDI1NSAtIHJnYi5nKSAqIChwZXJjZW50IC8gMTAwKSkpO1xuICAgIGNvbnN0IGIgPSBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IocmdiLmIgKyAoMjU1IC0gcmdiLmIpICogKHBlcmNlbnQgLyAxMDApKSk7XG5cbiAgICByZXR1cm4gYCMkeygoMSA8PCAyNCkgKyAociA8PCAxNikgKyAoZyA8PCA4KSArIGIpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBkYXJrZW5Db2xvcihjb2xvcjogc3RyaW5nLCBwZXJjZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoY29sb3IpO1xuICAgIGlmICghcmdiKSByZXR1cm4gY29sb3I7XG5cbiAgICBjb25zdCBmYWN0b3IgPSAxIC0gKHBlcmNlbnQgLyAxMDApO1xuICAgIGNvbnN0IHIgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHJnYi5yICogZmFjdG9yKSk7XG4gICAgY29uc3QgZyA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmdiLmcgKiBmYWN0b3IpKTtcbiAgICBjb25zdCBiID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihyZ2IuYiAqIGZhY3RvcikpO1xuXG4gICAgcmV0dXJuIGAjJHtyLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7Zy50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke2IudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udHJhc3RDb2xvcihoZXhDb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGhleENvbG9yKTtcbiAgICBpZiAoIXJnYikgcmV0dXJuICcjZmZmZmZmJztcblxuICAgIGNvbnN0IGx1bWluYW5jZSA9ICgwLjI5OSAqIHJnYi5yICsgMC41ODcgKiByZ2IuZyArIDAuMTE0ICogcmdiLmIpIC8gMjU1O1xuICAgIHJldHVybiBsdW1pbmFuY2UgPiAwLjUgPyAnIzAwMDAwMCcgOiAnI2ZmZmZmZic7XG4gIH1cblxuICBwcml2YXRlIGluamVjdER5bmFtaWNTdHlsZXMoY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGV4aXN0aW5nU3R5bGUucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWxlbWVudC5pZCA9IHRoaXMuc3R5bGVJZDtcbiAgICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICB0b2dnbGVUaGVtZSgpIHtcbiAgICBjb25zdCBpc0N1cnJlbnRseURhcmsgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RhcmsnKTtcbiAgICBpc0N1cnJlbnRseURhcmsgPyB0aGlzLmRpc2FibGVEYXJrTW9kZSgpIDogdGhpcy5lbmFibGVEYXJrTW9kZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVEYXJrTW9kZShzYXZlVG9TdG9yYWdlID0gdHJ1ZSkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdkYXJrJyk7XG4gICAgaWYgKHNhdmVUb1N0b3JhZ2UpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS10aGVtZScsICdkYXJrJyk7XG4gICAgfVxuICAgIHRoaXMuX2lzRGFyay5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlRGFya01vZGUoc2F2ZVRvU3RvcmFnZSA9IHRydWUpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnZGFyaycpO1xuICAgIGlmIChzYXZlVG9TdG9yYWdlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnbGlnaHQnKTtcbiAgICB9XG4gICAgdGhpcy5faXNEYXJrLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgc2V0UHJpbWFyeUNvbG9yKGNvbG9yOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICB0aGlzLmdlbmVyYXRlUHJpbWFyeVNoYWRlcyhjb2xvcik7XG5cbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcbiAgICBpZiAocmdiKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgJy0tcHJpbWFyeScsXG4gICAgICAgIGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJywgY29sb3IpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjdXJyZW50VGhlbWUoKTogJ2RhcmsnIHwgJ2xpZ2h0JyB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGFyay5nZXRWYWx1ZSgpID8gJ2RhcmsnIDogJ2xpZ2h0JztcbiAgfVxuXG4gIGdldCBpc0RhcmsoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGFyay5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgZ2V0IHByaW1hcnlDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IGNzc1ZhbHVlID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXByaW1hcnknKS50cmltKCk7XG5cbiAgICBpZiAoY3NzVmFsdWUgJiYgY3NzVmFsdWUgIT09ICcnKSB7XG4gICAgICBjb25zdCByZ2JQYXJ0cyA9IGNzc1ZhbHVlLnNwbGl0KCcgJykubWFwKE51bWJlcik7XG4gICAgICBpZiAocmdiUGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBgIyR7cmdiUGFydHNbMF0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtyZ2JQYXJ0c1sxXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke3JnYlBhcnRzWzJdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gIH1cblxuICByZXNldFRvQ29uZmlnRGVmYXVsdHMoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtdGhlbWUnKTtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS1yYWRpdXMnKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZVRoZW1lKCk7XG4gIH1cblxuICBnZXRVc2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICB0aGVtZTogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXRoZW1lJyksXG4gICAgICBwcmltYXJ5Q29sb3I6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyksXG4gICAgICByYWRpdXM6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1yYWRpdXMnKVxuICAgIH07XG4gIH1cblxuICBjbGVhclVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS10aGVtZScpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvbGxlLXJhZGl1cycpO1xuXG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG4gICAgaWYgKHN5c3RlbVByZWZlcnNEYXJrKSB7XG4gICAgICB0aGlzLmVuYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXByaW1hcnknKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXJhZGl1cycpO1xuXG4gICAgLy8gQWxzbyByZW1vdmUgYWxsIGRlcml2ZWQgcmFkaXVzIHZhcmlhYmxlc1xuICAgIFsnLS1yYWRpdXMtc20nLCAnLS1yYWRpdXMtbWQnLCAnLS1yYWRpdXMtbGcnLCAnLS1yYWRpdXMteGwnLCAnLS1yYWRpdXMtMnhsJywgJy0tcmFkaXVzLTN4bCcsICctLXJhZGl1cy1mdWxsJ11cbiAgICAgIC5mb3JFYWNoKHZhck5hbWUgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsIHZhck5hbWUpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICBleGlzdGluZ1N0eWxlLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIl19
|