@tolle_/tolle-ui 0.0.21-beta → 0.0.23-beta
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 +87 -34
- package/fesm2022/tolle-ui.mjs +86 -33
- package/fesm2022/tolle-ui.mjs.map +1 -1
- package/lib/button.component.d.ts +1 -1
- package/lib/theme.service.d.ts +14 -3
- package/package.json +1 -1
|
@@ -21,29 +21,51 @@ export class ThemeService {
|
|
|
21
21
|
initializeTheme() {
|
|
22
22
|
if (!isPlatformBrowser(this.platformId))
|
|
23
23
|
return;
|
|
24
|
-
//
|
|
24
|
+
// LOGIC: User Saved Preferences > Config Defaults > System Preference
|
|
25
25
|
const savedTheme = localStorage.getItem('tolle-theme');
|
|
26
|
+
const savedPrimary = localStorage.getItem('tolle-primary-color');
|
|
27
|
+
const savedRadius = localStorage.getItem('tolle-radius');
|
|
26
28
|
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
console.log('Theme initialization:', {
|
|
30
|
+
savedTheme,
|
|
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
|
|
39
|
+
if (savedTheme) {
|
|
40
|
+
// User has saved preference
|
|
41
|
+
shouldBeDark = savedTheme === 'dark';
|
|
42
|
+
}
|
|
43
|
+
else if (this.config?.darkByDefault !== undefined) {
|
|
44
|
+
// Use config default if no user preference
|
|
45
|
+
shouldBeDark = this.config.darkByDefault;
|
|
46
|
+
}
|
|
47
|
+
// Apply theme mode
|
|
31
48
|
if (shouldBeDark) {
|
|
32
|
-
this.enableDarkMode();
|
|
49
|
+
this.enableDarkMode(false); // Don't save, we'll save after checking all preferences
|
|
33
50
|
}
|
|
34
51
|
else {
|
|
35
|
-
this.disableDarkMode();
|
|
52
|
+
this.disableDarkMode(false);
|
|
36
53
|
}
|
|
37
|
-
|
|
54
|
+
// 2. Apply Primary Color
|
|
55
|
+
// Priority: Saved Color > Config Color
|
|
38
56
|
if (savedPrimary) {
|
|
39
|
-
|
|
57
|
+
// User has saved color preference
|
|
58
|
+
this.setPrimaryColor(savedPrimary, false); // Don't save again
|
|
40
59
|
}
|
|
41
|
-
|
|
42
|
-
|
|
60
|
+
// 3. Apply Radius
|
|
61
|
+
// Priority: Saved Radius > Config Radius
|
|
62
|
+
if (savedRadius) {
|
|
63
|
+
// User has saved radius preference
|
|
64
|
+
this.setRadius(savedRadius, false);
|
|
43
65
|
}
|
|
44
|
-
//
|
|
45
|
-
if (
|
|
46
|
-
|
|
66
|
+
// Save theme mode preference if it came from config or system
|
|
67
|
+
if (!savedTheme) {
|
|
68
|
+
localStorage.setItem('tolle-theme', shouldBeDark ? 'dark' : 'light');
|
|
47
69
|
}
|
|
48
70
|
}
|
|
49
71
|
/**
|
|
@@ -249,14 +271,18 @@ export class ThemeService {
|
|
|
249
271
|
const isCurrentlyDark = this.document.documentElement.classList.contains('dark');
|
|
250
272
|
isCurrentlyDark ? this.disableDarkMode() : this.enableDarkMode();
|
|
251
273
|
}
|
|
252
|
-
enableDarkMode() {
|
|
274
|
+
enableDarkMode(saveToStorage = true) {
|
|
253
275
|
this.renderer.addClass(this.document.documentElement, 'dark');
|
|
254
|
-
|
|
276
|
+
if (saveToStorage) {
|
|
277
|
+
localStorage.setItem('tolle-theme', 'dark');
|
|
278
|
+
}
|
|
255
279
|
this.isDarkSubject.next(true);
|
|
256
280
|
}
|
|
257
|
-
disableDarkMode() {
|
|
281
|
+
disableDarkMode(saveToStorage = true) {
|
|
258
282
|
this.renderer.removeClass(this.document.documentElement, 'dark');
|
|
259
|
-
|
|
283
|
+
if (saveToStorage) {
|
|
284
|
+
localStorage.setItem('tolle-theme', 'light');
|
|
285
|
+
}
|
|
260
286
|
this.isDarkSubject.next(false);
|
|
261
287
|
}
|
|
262
288
|
setPrimaryColor(color, persist = true) {
|
|
@@ -289,29 +315,56 @@ export class ThemeService {
|
|
|
289
315
|
}
|
|
290
316
|
return localStorage.getItem('tolle-primary-color');
|
|
291
317
|
}
|
|
292
|
-
|
|
318
|
+
/**
|
|
319
|
+
* Reset to config defaults (clears user preferences)
|
|
320
|
+
*/
|
|
321
|
+
resetToConfigDefaults() {
|
|
322
|
+
if (!isPlatformBrowser(this.platformId))
|
|
323
|
+
return;
|
|
324
|
+
// Clear user preferences
|
|
325
|
+
localStorage.removeItem('tolle-theme');
|
|
326
|
+
localStorage.removeItem('tolle-primary-color');
|
|
327
|
+
localStorage.removeItem('tolle-radius');
|
|
328
|
+
// Re-initialize with config defaults
|
|
329
|
+
this.initializeTheme();
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Get current user preferences
|
|
333
|
+
*/
|
|
334
|
+
getUserPreferences() {
|
|
293
335
|
if (!isPlatformBrowser(this.platformId))
|
|
294
336
|
return null;
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
}
|
|
300
|
-
return localStorage.getItem('tolle-radius') || '0.5rem';
|
|
337
|
+
return {
|
|
338
|
+
theme: localStorage.getItem('tolle-theme'),
|
|
339
|
+
primaryColor: localStorage.getItem('tolle-primary-color'),
|
|
340
|
+
radius: localStorage.getItem('tolle-radius')
|
|
341
|
+
};
|
|
301
342
|
}
|
|
302
343
|
/**
|
|
303
|
-
*
|
|
344
|
+
* Clear all user preferences
|
|
304
345
|
*/
|
|
305
|
-
|
|
346
|
+
clearUserPreferences() {
|
|
306
347
|
if (!isPlatformBrowser(this.platformId))
|
|
307
348
|
return;
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
349
|
+
localStorage.removeItem('tolle-theme');
|
|
350
|
+
localStorage.removeItem('tolle-primary-color');
|
|
351
|
+
localStorage.removeItem('tolle-radius');
|
|
352
|
+
// Reset to system defaults (not config defaults)
|
|
353
|
+
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
354
|
+
if (systemPrefersDark) {
|
|
355
|
+
this.enableDarkMode(false);
|
|
311
356
|
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
357
|
+
else {
|
|
358
|
+
this.disableDarkMode(false);
|
|
359
|
+
}
|
|
360
|
+
// Remove CSS variables
|
|
361
|
+
const root = this.document.documentElement;
|
|
362
|
+
this.renderer.removeStyle(root, '--primary');
|
|
363
|
+
this.renderer.removeStyle(root, '--radius');
|
|
364
|
+
// Clear dynamic styles
|
|
365
|
+
const existingStyle = this.document.getElementById(this.styleId);
|
|
366
|
+
if (existingStyle) {
|
|
367
|
+
existingStyle.remove();
|
|
315
368
|
}
|
|
316
369
|
}
|
|
317
370
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ThemeService, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: TOLLE_CONFIG, optional: true }, { token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -332,4 +385,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
332
385
|
type: Inject,
|
|
333
386
|
args: [TOLLE_CONFIG]
|
|
334
387
|
}] }, { type: i0.RendererFactory2 }] });
|
|
335
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7O0FBRzNELE1BQU0sT0FBTyxZQUFZO0lBT0s7SUFDRztJQUNhO0lBUnBDLFFBQVEsQ0FBWTtJQUNwQixhQUFhLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDNUQsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEMsT0FBTyxHQUFHLHFCQUFxQixDQUFDO0lBRXhDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFFaEQseUNBQXlDO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxD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QUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdFLHNCQUFzQjtRQUN0QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLEtBQWEsRUFBRSxPQUFlO1FBQ2hELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV2QixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFD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TUFBbUI7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFBRSxPQUFPO1FBRWhELGdDQUFnQztRQUNoQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELGdDQUFnQztRQUNoQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7d0dBeldVLFlBQVksa0JBT2IsUUFBUSxhQUNSLFdBQVcsYUFDQyxZQUFZOzRHQVR2QixZQUFZLGNBREMsTUFBTTs7NEZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFRN0IsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIFBMQVRGT1JNX0lELCBPcHRpb25hbCwgUmVuZGVyZXIyLCBSZW5kZXJlckZhY3RvcnkyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUT0xMRV9DT05GSUcsIFRvbGxlQ29uZmlnIH0gZnJvbSAnLi90b2xsZS1jb25maWcnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFRoZW1lU2VydmljZSB7XG4gIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgcHJpdmF0ZSBpc0RhcmtTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGlzRGFyayQgPSB0aGlzLmlzRGFya1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHByaXZhdGUgc3R5bGVJZCA9ICd0b2xsZS1keW5hbWljLXRoZW1lJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRPTExFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRvbGxlQ29uZmlnLFxuICAgIHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5MlxuICApIHtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRoZW1lKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUaGVtZSgpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIC8vIDEuIERldGVybWluZSBJbml0aWFsIE1vZGUgKERhcmsvTGlnaHQpXG4gICAgY29uc3Qgc2F2ZWRUaGVtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS10aGVtZScpO1xuICAgIGNvbnN0IHN5c3RlbVByZWZlcnNEYXJrID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzO1xuXG4gICAgLy8gTG9naWM6IFNhdmVkIFByZWZlcmVuY2UgPiBDb25maWcgRGVmYXVsdCA+IFN5c3RlbSBQcmVmZXJlbmNlXG4gICAgY29uc3Qgc2hvdWxkQmVEYXJrID0gc2F2ZWRUaGVtZVxuICAgICAgPyBzYXZlZFRoZW1lID09PSAnZGFyaydcbiAgICAgIDogKHRoaXMuY29uZmlnPy5kYXJrQnlEZWZhdWx0ID8/IHN5c3RlbVByZWZlcnNEYXJrKTtcblxuICAgIGlmIChzaG91bGRCZURhcmspIHtcbiAgICAgIHRoaXMuZW5hYmxlRGFya01vZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlRGFya01vZGUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlZFByaW1hcnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuXG4gICAgaWYgKHNhdmVkUHJpbWFyeSkge1xuICAgICAgdGhpcy5zZXRQcmltYXJ5Q29sb3Ioc2F2ZWRQcmltYXJ5LCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8ucHJpbWFyeUNvbG9yKSB7XG4gICAgICB0aGlzLnNldFByaW1hcnlDb2xvcih0aGlzLmNvbmZpZy5wcmltYXJ5Q29sb3IsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgcmFkaXVzIGZyb20gY29uZmlnXG4gICAgaWYgKHRoaXMuY29uZmlnPy5yYWRpdXMpIHtcbiAgICAgIHRoaXMuc2V0UmFkaXVzKHRoaXMuY29uZmlnLnJhZGl1cywgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBib3JkZXIgcmFkaXVzIGZvciBhbGwgY29tcG9uZW50c1xuICAgKi9cbiAgc2V0UmFkaXVzKHJhZGl1czogc3RyaW5nLCBwZXJzaXN0ID0gdHJ1ZSkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgLy8gU2V0IHRoZSBDU1MgdmFyaWFibGVcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cycsIHJhZGl1cyk7XG5cbiAgICAvLyBBbHNvIHVwZGF0ZSB0aGUgZHluYW1pYyBzdHlsZXMgdG8gaW5jbHVkZSByYWRpdXMgY2FsY3VsYXRpb25zXG4gICAgdGhpcy51cGRhdGVSYWRpdXNJbkR5bmFtaWNTdHlsZXMocmFkaXVzKTtcblxuICAgIC8vIFBlcnNpc3QgaWYgbmVlZGVkXG4gICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS1yYWRpdXMnLCByYWRpdXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSByYWRpdXMgY2FsY3VsYXRpb25zIGluIGR5bmFtaWMgc3R5bGVzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVJhZGl1c0luRHluYW1pY1N0eWxlcyhyYWRpdXM6IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG5cbiAgICBpZiAoZXhpc3RpbmdTdHlsZSkge1xuICAgICAgbGV0IGNzcyA9IGV4aXN0aW5nU3R5bGUudGV4dENvbnRlbnQgfHwgJyc7XG5cbiAgICAgIC8vIFVwZGF0ZSBvciBhZGQgcmFkaXVzIGNhbGN1bGF0aW9uc1xuICAgICAgaWYgKGNzcy5pbmNsdWRlcygnLS1yYWRpdXM6JykpIHtcbiAgICAgICAgLy8gUmVwbGFjZSBleGlzdGluZyByYWRpdXMgZGVjbGFyYXRpb25zXG4gICAgICAgIGNzcyA9IGNzcy5yZXBsYWNlKC8tLXJhZGl1czpbXjtdKzsvZywgYC0tcmFkaXVzOiAke3JhZGl1c307YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBZGQgcmFkaXVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgOnJvb3RcbiAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UoLzpyb290XFxzKnsvLCBgOnJvb3Qge1xcbiAgICAgIC0tcmFkaXVzOiAke3JhZGl1c307YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgY2FsY3VsYXRlZCByYWRpdXMgdmFsdWVzIGluIHRoZSBDU1NcbiAgICAgIGNvbnN0IHJhZGl1c0NhbGNSZWdleCA9IC9jYWxjXFwodmFyXFwoLS1yYWRpdXNbXildK1xcKS9nO1xuICAgICAgY3NzID0gY3NzLnJlcGxhY2UocmFkaXVzQ2FsY1JlZ2V4LCAobWF0Y2gpID0+IHtcbiAgICAgICAgaWYgKG1hdGNoLmluY2x1ZGVzKCctIDJweCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGBjYWxjKCR7cmFkaXVzfSAtIDJweClgO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoLmluY2x1ZGVzKCctIDRweCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGBjYWxjKCR7cmFkaXVzfSAtIDRweClgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH0pO1xuXG4gICAgICBleGlzdGluZ1N0eWxlLnRleHRDb250ZW50ID0gY3NzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgZnVsbCBwcmltYXJ5IGNvbG9yIHBhbGV0dGUgKDUwLTkwMCkgYmFzZWQgb24gYmFzZSBjb2xvclxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZVByaW1hcnlTaGFkZXMoYmFzZUNvbG9yOiBzdHJpbmcpIHtcbiAgICAvLyBDb252ZXJ0IGhleCB0byBSR0JcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGJhc2VDb2xvcik7XG4gICAgY29uc3QgcmdiU3RyaW5nID0gcmdiID8gYCR7cmdiLnJ9ICR7cmdiLmd9ICR7cmdiLmJ9YCA6ICczNyA5OSAyMzUnO1xuXG4gICAgLy8gQ3JlYXRlIGxpZ2h0ZXIgcmluZyBjb2xvcnMgaW4gUkdCXG4gICAgY29uc3QgcmluZ0xpZ2h0ID0gdGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA0MCk7XG4gICAgY29uc3QgcmluZ0xpZ2h0UmdiID0gdGhpcy5oZXhUb1JnYihyaW5nTGlnaHQpO1xuICAgIGNvbnN0IHJpbmdMaWdodFJnYlN0cmluZyA9IHJpbmdMaWdodFJnYiA/IGAke3JpbmdMaWdodFJnYi5yfSAke3JpbmdMaWdodFJnYi5nfSAke3JpbmdMaWdodFJnYi5ifWAgOiAnOTYgMTY1IDI1MCc7XG5cbiAgICBjb25zdCByaW5nRGFyayA9IHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgMjApO1xuICAgIGNvbnN0IHJpbmdEYXJrUmdiID0gdGhpcy5oZXhUb1JnYihyaW5nRGFyayk7XG4gICAgY29uc3QgcmluZ0RhcmtSZ2JTdHJpbmcgPSByaW5nRGFya1JnYiA/IGAke3JpbmdEYXJrUmdiLnJ9ICR7cmluZ0RhcmtSZ2IuZ30gJHtyaW5nRGFya1JnYi5ifWAgOiAnMTQ3IDE5NyAyNTMnO1xuXG4gICAgLy8gR2V0IGN1cnJlbnQgcmFkaXVzIG9yIHVzZSBkZWZhdWx0XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IGN1cnJlbnRSYWRpdXMgPSBnZXRDb21wdXRlZFN0eWxlKHJvb3QpLmdldFByb3BlcnR5VmFsdWUoJy0tcmFkaXVzJykudHJpbSgpIHx8ICcwLjVyZW0nO1xuXG4gICAgY29uc3QgY3NzID0gYFxuICAgICAgLyogT3ZlcnJpZGUgcHJpbWFyeSBjb2xvcnMgLSB0aGlzIG5lZWRzIHRvIGNvbWUgQUZURVIgeW91ciBtYWluIENTUyAqL1xuICAgICAgOnJvb3Qge1xuICAgICAgICAvKiBQcmltYXJ5IGluIFJHQiBmb3JtYXQgZm9yIFRhaWx3aW5kIG9wYWNpdHkgc3VwcG9ydCAqL1xuICAgICAgICAtLXByaW1hcnk6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LWZvcmVncm91bmQ6ICR7dGhpcy5nZXRDb250cmFzdENvbG9yUmdiKGJhc2VDb2xvcil9O1xuXG4gICAgICAgIC8qIFJhZGl1cyAqL1xuICAgICAgICAtLXJhZGl1czogJHtjdXJyZW50UmFkaXVzfTtcblxuICAgICAgICAvKiBQcmltYXJ5IHNoYWRlcyBmb3IgbGlnaHQgbW9kZSAqL1xuICAgICAgICAtLXByaW1hcnktNTA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDkwKSl9O1xuICAgICAgICAtLXByaW1hcnktMTAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA4MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTIwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgNjApKX07XG4gICAgICAgIC0tcHJpbWFyeS0zMDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDQwKSl9O1xuICAgICAgICAtLXByaW1hcnktNDAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAyMCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTUwMDogJHtyZ2JTdHJpbmd9O1xuICAgICAgICAtLXByaW1hcnktNjAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDIwKSl9O1xuICAgICAgICAtLXByaW1hcnktNzAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDQwKSl9O1xuICAgICAgICAtLXByaW1hcnktODAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDYwKSl9O1xuICAgICAgICAtLXByaW1hcnktOTAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDgwKSl9O1xuXG4gICAgICAgIC8qIFVwZGF0ZSByaW5nIGNvbG9yIHRvIGJlIGxpZ2h0ZXIgKi9cbiAgICAgICAgLS1yaW5nOiAke3JpbmdMaWdodFJnYlN0cmluZ307XG4gICAgICB9XG5cbiAgICAgIC5kYXJrIHtcbiAgICAgICAgLyogRm9yIGRhcmsgbW9kZSwgd2Uga2VlcCB0aGUgcHJpbWFyeSBjb2xvciBidXQgYWRqdXN0IHNoYWRlcyAqL1xuICAgICAgICAtLXByaW1hcnk6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LWZvcmVncm91bmQ6ICR7dGhpcy5nZXRDb250cmFzdENvbG9yUmdiKGJhc2VDb2xvcil9O1xuXG4gICAgICAgIC8qIERhcmsgbW9kZSBzaGFkZXMgKi9cbiAgICAgICAgLS1wcmltYXJ5LTUwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDg1KSl9O1xuICAgICAgICAtLXByaW1hcnktMTAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDc1KSl9O1xuICAgICAgICAtLXByaW1hcnktMjAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDY1KSl9O1xuICAgICAgICAtLXByaW1hcnktMzAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDU1KSl9O1xuICAgICAgICAtLXByaW1hcnktNDAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDQ1KSl9O1xuICAgICAgICAtLXByaW1hcnktNTAwOiAke3JnYlN0cmluZ307XG4gICAgICAgIC0tcHJpbWFyeS02MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDIwKSl9O1xuICAgICAgICAtLXByaW1hcnktNzAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAzNSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTgwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgNTApKX07XG4gICAgICAgIC0tcHJpbWFyeS05MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDY1KSl9O1xuXG4gICAgICAgIC8qIFVwZGF0ZSByaW5nIGNvbG9yIGZvciBkYXJrIG1vZGUgLSBsaWdodGVyIHZhcmlhbnQgKi9cbiAgICAgICAgLS1yaW5nOiAke3JpbmdEYXJrUmdiU3RyaW5nfTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgdGhpcy5pbmplY3REeW5hbWljU3R5bGVzKGNzcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBoZXggY29sb3IgdG8gUkdCIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBoZXhUb1JnYihoZXg6IHN0cmluZyk6IHsgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgLy8gUmVtb3ZlICMgaWYgcHJlc2VudFxuICAgIGNvbnN0IGNsZWFuZWRIZXggPSBoZXgucmVwbGFjZSgnIycsICcnKTtcblxuICAgIGxldCByID0gMCwgZyA9IDAsIGIgPSAwO1xuXG4gICAgaWYgKGNsZWFuZWRIZXgubGVuZ3RoID09PSAzKSB7XG4gICAgICByID0gcGFyc2VJbnQoY2xlYW5lZEhleFswXSArIGNsZWFuZWRIZXhbMF0sIDE2KTtcbiAgICAgIGcgPSBwYXJzZUludChjbGVhbmVkSGV4WzFdICsgY2xlYW5lZEhleFsxXSwgMTYpO1xuICAgICAgYiA9IHBhcnNlSW50KGNsZWFuZWRIZXhbMl0gKyBjbGVhbmVkSGV4WzJdLCAxNik7XG4gICAgICByZXR1cm4geyByLCBnLCBiIH07XG4gICAgfVxuXG4gICAgaWYgKGNsZWFuZWRIZXgubGVuZ3RoID09PSA2KSB7XG4gICAgICByID0gcGFyc2VJbnQoY2xlYW5lZEhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcbiAgICAgIGcgPSBwYXJzZUludChjbGVhbmVkSGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xuICAgICAgYiA9IHBhcnNlSW50KGNsZWFuZWRIZXguc3Vic3RyaW5nKDQsIDYpLCAxNik7XG4gICAgICByZXR1cm4geyByLCBnLCBiIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBoZXggdG8gUkdCIHN0cmluZyBmb3JtYXQgZm9yIENTUyAoc3BhY2Utc2VwYXJhdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBoZXhUb1JnYlN0cmluZyhoZXhDb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGhleENvbG9yKTtcbiAgICByZXR1cm4gcmdiID8gYCR7cmdiLnJ9ICR7cmdiLmd9ICR7cmdiLmJ9YCA6ICczNyA5OSAyMzUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb250cmFzdCBjb2xvciBpbiBSR0IgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGdldENvbnRyYXN0Q29sb3JSZ2IoaGV4Q29sb3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29udHJhc3QgPSB0aGlzLmdldENvbnRyYXN0Q29sb3IoaGV4Q29sb3IpO1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoY29udHJhc3QpO1xuICAgIHJldHVybiByZ2IgPyBgJHtyZ2Iucn0gJHtyZ2IuZ30gJHtyZ2IuYn1gIDogJzI1NSAyNTUgMjU1JztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWdodGVuIGEgaGV4IGNvbG9yIGJ5IGEgcGVyY2VudGFnZVxuICAgKi9cbiAgcHJpdmF0ZSBsaWdodGVuQ29sb3IoY29sb3I6IHN0cmluZywgcGVyY2VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcbiAgICBpZiAoIXJnYikgcmV0dXJuIGNvbG9yO1xuXG4gICAgLy8gTGlnaHRlbiBieSBwZXJjZW50YWdlXG4gICAgY29uc3QgciA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyZ2IuciArICgyNTUgLSByZ2IucikgKiAocGVyY2VudCAvIDEwMCkpKTtcbiAgICBjb25zdCBnID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHJnYi5nICsgKDI1NSAtIHJnYi5nKSAqIChwZXJjZW50IC8gMTAwKSkpO1xuICAgIGNvbnN0IGIgPSBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IocmdiLmIgKyAoMjU1IC0gcmdiLmIpICogKHBlcmNlbnQgLyAxMDApKSk7XG5cbiAgICAvLyBDb252ZXJ0IGJhY2sgdG8gaGV4XG4gICAgcmV0dXJuIGAjJHsoKDEgPDwgMjQpICsgKHIgPDwgMTYpICsgKGcgPDwgOCkgKyBiKS50b1N0cmluZygxNikuc2xpY2UoMSl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXJrZW4gYSBoZXggY29sb3IgYnkgYSBwZXJjZW50YWdlXG4gICAqL1xuICBwcml2YXRlIGRhcmtlbkNvbG9yKGNvbG9yOiBzdHJpbmcsIHBlcmNlbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihjb2xvcik7XG4gICAgaWYgKCFyZ2IpIHJldHVybiBjb2xvcjtcblxuICAgIGNvbnN0IGZhY3RvciA9IDEgLSAocGVyY2VudCAvIDEwMCk7XG4gICAgY29uc3QgciA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmdiLnIgKiBmYWN0b3IpKTtcbiAgICBjb25zdCBnID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihyZ2IuZyAqIGZhY3RvcikpO1xuICAgIGNvbnN0IGIgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHJnYi5iICogZmFjdG9yKSk7XG5cbiAgICByZXR1cm4gYCMke3IudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtnLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7Yi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBjb250cmFzdCBjb2xvciAoYmxhY2sgb3Igd2hpdGUpIGJhc2VkIG9uIGJhY2tncm91bmQgY29sb3JcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29udHJhc3RDb2xvcihoZXhDb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGhleENvbG9yKTtcbiAgICBpZiAoIXJnYikgcmV0dXJuICcjZmZmZmZmJztcblxuICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBsdW1pbmFuY2VcbiAgICBjb25zdCBsdW1pbmFuY2UgPSAoMC4yOTkgKiByZ2IuciArIDAuNTg3ICogcmdiLmcgKyAwLjExNCAqIHJnYi5iKSAvIDI1NTtcblxuICAgIC8vIFJldHVybiBibGFjayBmb3IgbGlnaHQgY29sb3JzLCB3aGl0ZSBmb3IgZGFyayBjb2xvcnNcbiAgICByZXR1cm4gbHVtaW5hbmNlID4gMC41ID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmplY3REeW5hbWljU3R5bGVzKGNzczogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICBleGlzdGluZ1N0eWxlLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZUVsZW1lbnQuaWQgPSB0aGlzLnN0eWxlSWQ7XG4gICAgc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gY3NzO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5oZWFkLCBzdHlsZUVsZW1lbnQpO1xuICB9XG5cbiAgdG9nZ2xlVGhlbWUoKSB7XG4gICAgY29uc3QgaXNDdXJyZW50bHlEYXJrID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkYXJrJyk7XG4gICAgaXNDdXJyZW50bHlEYXJrID8gdGhpcy5kaXNhYmxlRGFya01vZGUoKSA6IHRoaXMuZW5hYmxlRGFya01vZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlRGFya01vZGUoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ2RhcmsnKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnZGFyaycpO1xuICAgIHRoaXMuaXNEYXJrU3ViamVjdC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlRGFya01vZGUoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ2RhcmsnKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnbGlnaHQnKTtcbiAgICB0aGlzLmlzRGFya1N1YmplY3QubmV4dChmYWxzZSk7XG4gIH1cblxuICBzZXRQcmltYXJ5Q29sb3IoY29sb3I6IHN0cmluZywgcGVyc2lzdCA9IHRydWUpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIHRoaXMuZ2VuZXJhdGVQcmltYXJ5U2hhZGVzKGNvbG9yKTtcblxuICAgIC8vIEFsc28gc2V0IGlubGluZSBmb3IgaW1tZWRpYXRlIHVwZGF0ZVxuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoY29sb3IpO1xuICAgIGlmIChyZ2IpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgICAnLS1wcmltYXJ5JyxcbiAgICAgICAgYCR7cmdiLnJ9ICR7cmdiLmd9ICR7cmdiLmJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGVyc2lzdCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InLCBjb2xvcik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGN1cnJlbnRUaGVtZSgpOiAnZGFyaycgfCAnbGlnaHQnIHtcbiAgICByZXR1cm4gdGhpcy5pc0RhcmtTdWJqZWN0LnZhbHVlID8gJ2RhcmsnIDogJ2xpZ2h0JztcbiAgfVxuXG4gIGdldCBwcmltYXJ5Q29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjc3NWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1wcmltYXJ5JykudHJpbSgpO1xuXG4gICAgaWYgKGNzc1ZhbHVlICYmIGNzc1ZhbHVlICE9PSAnJykge1xuICAgICAgLy8gQ29udmVydCBSR0Igc3RyaW5nIGJhY2sgdG8gaGV4IGZvciBleHRlcm5hbCB1c2VcbiAgICAgIGNvbnN0IHJnYlBhcnRzID0gY3NzVmFsdWUuc3BsaXQoJyAnKS5tYXAoTnVtYmVyKTtcbiAgICAgIGlmIChyZ2JQYXJ0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIGAjJHtyZ2JQYXJ0c1swXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke3JnYlBhcnRzWzFdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7cmdiUGFydHNbMl0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKTtcbiAgfVxuXG4gIGdldCByYWRpdXMoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjc3NWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1yYWRpdXMnKS50cmltKCk7XG5cbiAgICBpZiAoY3NzVmFsdWUgJiYgY3NzVmFsdWUgIT09ICcnKSB7XG4gICAgICByZXR1cm4gY3NzVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1yYWRpdXMnKSB8fCAnMC41cmVtJztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBicmFuZCBpZGVudGl0eSB2YXJpYWJsZXMgd2l0aCBmdWxsIHNoYWRlIHBhbGV0dGVcbiAgICovXG4gIGFwcGx5QnJhbmRDb25maWcoY29uZmlnOiBUb2xsZUNvbmZpZykge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgLy8gU2V0IHByaW1hcnkgY29sb3IgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLnByaW1hcnlDb2xvcikge1xuICAgICAgdGhpcy5zZXRQcmltYXJ5Q29sb3IoY29uZmlnLnByaW1hcnlDb2xvciwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNldCBib3JkZXIgcmFkaXVzIGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5yYWRpdXMpIHtcbiAgICAgIHRoaXMuc2V0UmFkaXVzKGNvbmZpZy5yYWRpdXMsIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
388
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7O0FBRzNELE1BQU0sT0FBTyxZQUFZO0lBT0s7SUFDRztJQUNhO0lBUnBDLFFBQVEsQ0FBWTtJQUNwQixhQUFhLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDNUQsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEMsT0FBTyxHQUFHLHFCQUFxQixDQUFDO0lBRXhDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFFaEQsc0VBQXNFO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxD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akQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3BGLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFNUMsdUJBQXVCO1FBQ3ZCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQzt3R0EvWlUsWUFBWSxrQkFPYixRQUFRLGFBQ1IsV0FBVyxhQUNDLFlBQVk7NEdBVHZCLFlBQVksY0FEQyxNQUFNOzs0RkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQVE3QixNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQsIE9wdGlvbmFsLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRPTExFX0NPTkZJRywgVG9sbGVDb25maWcgfSBmcm9tICcuL3RvbGxlLWNvbmZpZyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgVGhlbWVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyO1xuICBwcml2YXRlIGlzRGFya1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgaXNEYXJrJCA9IHRoaXMuaXNEYXJrU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHJpdmF0ZSBzdHlsZUlkID0gJ3RvbGxlLWR5bmFtaWMtdGhlbWUnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVE9MTEVfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVG9sbGVDb25maWcsXG4gICAgcmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyXG4gICkge1xuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgbnVsbCk7XG4gICAgdGhpcy5pbml0aWFsaXplVGhlbWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRoZW1lKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgLy8gTE9HSUM6IFVzZXIgU2F2ZWQgUHJlZmVyZW5jZXMgPiBDb25maWcgRGVmYXVsdHMgPiBTeXN0ZW0gUHJlZmVyZW5jZVxuICAgIGNvbnN0IHNhdmVkVGhlbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtdGhlbWUnKTtcbiAgICBjb25zdCBzYXZlZFByaW1hcnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuICAgIGNvbnN0IHNhdmVkUmFkaXVzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXJhZGl1cycpO1xuICAgIGNvbnN0IHN5c3RlbVByZWZlcnNEYXJrID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzO1xuXG4gICAgY29uc29sZS5sb2coJ1RoZW1lIGluaXRpYWxpemF0aW9uOicsIHtcbiAgICAgIHNhdmVkVGhlbWUsXG4gICAgICBzYXZlZFByaW1hcnksXG4gICAgICBzYXZlZFJhZGl1cyxcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBzeXN0ZW1QcmVmZXJzRGFya1xuICAgIH0pO1xuXG4gICAgLy8gMS4gRGV0ZXJtaW5lIERhcmsvTGlnaHQgTW9kZVxuICAgIC8vIFByaW9yaXR5OiBTYXZlZCBUaGVtZSA+IENvbmZpZyBEZWZhdWx0ID4gU3lzdGVtIFByZWZlcmVuY2VcbiAgICBsZXQgc2hvdWxkQmVEYXJrID0gc3lzdGVtUHJlZmVyc0Rhcms7IC8vIFN0YXJ0IHdpdGggc3lzdGVtXG5cbiAgICBpZiAoc2F2ZWRUaGVtZSkge1xuICAgICAgLy8gVXNlciBoYXMgc2F2ZWQgcHJlZmVyZW5jZVxuICAgICAgc2hvdWxkQmVEYXJrID0gc2F2ZWRUaGVtZSA9PT0gJ2RhcmsnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LmRhcmtCeURlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVXNlIGNvbmZpZyBkZWZhdWx0IGlmIG5vIHVzZXIgcHJlZmVyZW5jZVxuICAgICAgc2hvdWxkQmVEYXJrID0gdGhpcy5jb25maWcuZGFya0J5RGVmYXVsdDtcbiAgICB9XG5cbiAgICAvLyBBcHBseSB0aGVtZSBtb2RlXG4gICAgaWYgKHNob3VsZEJlRGFyaykge1xuICAgICAgdGhpcy5lbmFibGVEYXJrTW9kZShmYWxzZSk7IC8vIERvbid0IHNhdmUsIHdlJ2xsIHNhdmUgYWZ0ZXIgY2hlY2tpbmcgYWxsIHByZWZlcmVuY2VzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyAyLiBBcHBseSBQcmltYXJ5IENvbG9yXG4gICAgLy8gUHJpb3JpdHk6IFNhdmVkIENvbG9yID4gQ29uZmlnIENvbG9yXG4gICAgaWYgKHNhdmVkUHJpbWFyeSkge1xuICAgICAgLy8gVXNlciBoYXMgc2F2ZWQgY29sb3IgcHJlZmVyZW5jZVxuICAgICAgdGhpcy5zZXRQcmltYXJ5Q29sb3Ioc2F2ZWRQcmltYXJ5LCBmYWxzZSk7IC8vIERvbid0IHNhdmUgYWdhaW5cbiAgICB9XG5cbiAgICAvLyAzLiBBcHBseSBSYWRpdXNcbiAgICAvLyBQcmlvcml0eTogU2F2ZWQgUmFkaXVzID4gQ29uZmlnIFJhZGl1c1xuICAgIGlmIChzYXZlZFJhZGl1cykge1xuICAgICAgLy8gVXNlciBoYXMgc2F2ZWQgcmFkaXVzIHByZWZlcmVuY2VcbiAgICAgIHRoaXMuc2V0UmFkaXVzKHNhdmVkUmFkaXVzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSB0aGVtZSBtb2RlIHByZWZlcmVuY2UgaWYgaXQgY2FtZSBmcm9tIGNvbmZpZyBvciBzeXN0ZW1cbiAgICBpZiAoIXNhdmVkVGhlbWUpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS10aGVtZScsIHNob3VsZEJlRGFyayA/ICdkYXJrJyA6ICdsaWdodCcpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgYm9yZGVyIHJhZGl1cyBmb3IgYWxsIGNvbXBvbmVudHNcbiAgICovXG4gIHNldFJhZGl1cyhyYWRpdXM6IHN0cmluZywgcGVyc2lzdCA9IHRydWUpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuICAgIC8vIFNldCB0aGUgQ1NTIHZhcmlhYmxlXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCAnLS1yYWRpdXMnLCByYWRpdXMpO1xuXG4gICAgLy8gQWxzbyB1cGRhdGUgdGhlIGR5bmFtaWMgc3R5bGVzIHRvIGluY2x1ZGUgcmFkaXVzIGNhbGN1bGF0aW9uc1xuICAgIHRoaXMudXBkYXRlUmFkaXVzSW5EeW5hbWljU3R5bGVzKHJhZGl1cyk7XG5cbiAgICAvLyBQZXJzaXN0IGlmIG5lZWRlZFxuICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtcmFkaXVzJywgcmFkaXVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcmFkaXVzIGNhbGN1bGF0aW9ucyBpbiBkeW5hbWljIHN0eWxlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVSYWRpdXNJbkR5bmFtaWNTdHlsZXMocmFkaXVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuXG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGxldCBjc3MgPSBleGlzdGluZ1N0eWxlLnRleHRDb250ZW50IHx8ICcnO1xuXG4gICAgICAvLyBVcGRhdGUgb3IgYWRkIHJhZGl1cyBjYWxjdWxhdGlvbnNcbiAgICAgIGlmIChjc3MuaW5jbHVkZXMoJy0tcmFkaXVzOicpKSB7XG4gICAgICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgcmFkaXVzIGRlY2xhcmF0aW9uc1xuICAgICAgICBjc3MgPSBjc3MucmVwbGFjZSgvLS1yYWRpdXM6W147XSs7L2csIGAtLXJhZGl1czogJHtyYWRpdXN9O2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWRkIHJhZGl1cyB0byB0aGUgYmVnaW5uaW5nIG9mIDpyb290XG4gICAgICAgIGNzcyA9IGNzcy5yZXBsYWNlKC86cm9vdFxccyp7LywgYDpyb290IHtcXG4gICAgICAtLXJhZGl1czogJHtyYWRpdXN9O2ApO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGhlIGNhbGN1bGF0ZWQgcmFkaXVzIHZhbHVlcyBpbiB0aGUgQ1NTXG4gICAgICBjb25zdCByYWRpdXNDYWxjUmVnZXggPSAvY2FsY1xcKHZhclxcKC0tcmFkaXVzW14pXStcXCkvZztcbiAgICAgIGNzcyA9IGNzcy5yZXBsYWNlKHJhZGl1c0NhbGNSZWdleCwgKG1hdGNoKSA9PiB7XG4gICAgICAgIGlmIChtYXRjaC5pbmNsdWRlcygnLSAycHgnKSkge1xuICAgICAgICAgIHJldHVybiBgY2FsYygke3JhZGl1c30gLSAycHgpYDtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaC5pbmNsdWRlcygnLSA0cHgnKSkge1xuICAgICAgICAgIHJldHVybiBgY2FsYygke3JhZGl1c30gLSA0cHgpYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9KTtcblxuICAgICAgZXhpc3RpbmdTdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGZ1bGwgcHJpbWFyeSBjb2xvciBwYWxldHRlICg1MC05MDApIGJhc2VkIG9uIGJhc2UgY29sb3JcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVQcmltYXJ5U2hhZGVzKGJhc2VDb2xvcjogc3RyaW5nKSB7XG4gICAgLy8gQ29udmVydCBoZXggdG8gUkdCXG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihiYXNlQ29sb3IpO1xuICAgIGNvbnN0IHJnYlN0cmluZyA9IHJnYiA/IGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWAgOiAnMzcgOTkgMjM1JztcblxuICAgIC8vIENyZWF0ZSBsaWdodGVyIHJpbmcgY29sb3JzIGluIFJHQlxuICAgIGNvbnN0IHJpbmdMaWdodCA9IHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgNDApO1xuICAgIGNvbnN0IHJpbmdMaWdodFJnYiA9IHRoaXMuaGV4VG9SZ2IocmluZ0xpZ2h0KTtcbiAgICBjb25zdCByaW5nTGlnaHRSZ2JTdHJpbmcgPSByaW5nTGlnaHRSZ2IgPyBgJHtyaW5nTGlnaHRSZ2Iucn0gJHtyaW5nTGlnaHRSZ2IuZ30gJHtyaW5nTGlnaHRSZ2IuYn1gIDogJzk2IDE2NSAyNTAnO1xuXG4gICAgY29uc3QgcmluZ0RhcmsgPSB0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDIwKTtcbiAgICBjb25zdCByaW5nRGFya1JnYiA9IHRoaXMuaGV4VG9SZ2IocmluZ0RhcmspO1xuICAgIGNvbnN0IHJpbmdEYXJrUmdiU3RyaW5nID0gcmluZ0RhcmtSZ2IgPyBgJHtyaW5nRGFya1JnYi5yfSAke3JpbmdEYXJrUmdiLmd9ICR7cmluZ0RhcmtSZ2IuYn1gIDogJzE0NyAxOTcgMjUzJztcblxuICAgIC8vIEdldCBjdXJyZW50IHJhZGl1cyBvciB1c2UgZGVmYXVsdFxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50UmFkaXVzID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXJhZGl1cycpLnRyaW0oKSB8fCAnMC41cmVtJztcblxuICAgIGNvbnN0IGNzcyA9IGBcbiAgICAgIC8qIE92ZXJyaWRlIHByaW1hcnkgY29sb3JzIC0gdGhpcyBuZWVkcyB0byBjb21lIEFGVEVSIHlvdXIgbWFpbiBDU1MgKi9cbiAgICAgIDpyb290IHtcbiAgICAgICAgLyogUHJpbWFyeSBpbiBSR0IgZm9ybWF0IGZvciBUYWlsd2luZCBvcGFjaXR5IHN1cHBvcnQgKi9cbiAgICAgICAgLS1wcmltYXJ5OiAke3JnYlN0cmluZ307XG4gICAgICAgIC0tcHJpbWFyeS1mb3JlZ3JvdW5kOiAke3RoaXMuZ2V0Q29udHJhc3RDb2xvclJnYihiYXNlQ29sb3IpfTtcblxuICAgICAgICAvKiBSYWRpdXMgKi9cbiAgICAgICAgLS1yYWRpdXM6ICR7Y3VycmVudFJhZGl1c307XG5cbiAgICAgICAgLyogUHJpbWFyeSBzaGFkZXMgZm9yIGxpZ2h0IG1vZGUgKi9cbiAgICAgICAgLS1wcmltYXJ5LTUwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA5MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTEwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgODApKX07XG4gICAgICAgIC0tcHJpbWFyeS0yMDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDYwKSl9O1xuICAgICAgICAtLXByaW1hcnktMzAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA0MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTQwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgMjApKX07XG4gICAgICAgIC0tcHJpbWFyeS01MDA6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LTYwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCAyMCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTcwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA0MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTgwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA2MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTkwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA4MCkpfTtcblxuICAgICAgICAvKiBVcGRhdGUgcmluZyBjb2xvciB0byBiZSBsaWdodGVyICovXG4gICAgICAgIC0tcmluZzogJHtyaW5nTGlnaHRSZ2JTdHJpbmd9O1xuICAgICAgfVxuXG4gICAgICAuZGFyayB7XG4gICAgICAgIC8qIEZvciBkYXJrIG1vZGUsIHdlIGtlZXAgdGhlIHByaW1hcnkgY29sb3IgYnV0IGFkanVzdCBzaGFkZXMgKi9cbiAgICAgICAgLS1wcmltYXJ5OiAke3JnYlN0cmluZ307XG4gICAgICAgIC0tcHJpbWFyeS1mb3JlZ3JvdW5kOiAke3RoaXMuZ2V0Q29udHJhc3RDb2xvclJnYihiYXNlQ29sb3IpfTtcblxuICAgICAgICAvKiBEYXJrIG1vZGUgc2hhZGVzICovXG4gICAgICAgIC0tcHJpbWFyeS01MDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA4NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTEwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA3NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTIwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA2NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTMwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA1NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTQwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA0NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTUwMDogJHtyZ2JTdHJpbmd9O1xuICAgICAgICAtLXByaW1hcnktNjAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAyMCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTcwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgMzUpKX07XG4gICAgICAgIC0tcHJpbWFyeS04MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDUwKSl9O1xuICAgICAgICAtLXByaW1hcnktOTAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA2NSkpfTtcblxuICAgICAgICAvKiBVcGRhdGUgcmluZyBjb2xvciBmb3IgZGFyayBtb2RlIC0gbGlnaHRlciB2YXJpYW50ICovXG4gICAgICAgIC0tcmluZzogJHtyaW5nRGFya1JnYlN0cmluZ307XG4gICAgICB9XG4gICAgYDtcblxuICAgIHRoaXMuaW5qZWN0RHluYW1pY1N0eWxlcyhjc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgaGV4IGNvbG9yIHRvIFJHQiBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgaGV4VG9SZ2IoaGV4OiBzdHJpbmcpOiB7IHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIgfSB8IG51bGwge1xuICAgIC8vIFJlbW92ZSAjIGlmIHByZXNlbnRcbiAgICBjb25zdCBjbGVhbmVkSGV4ID0gaGV4LnJlcGxhY2UoJyMnLCAnJyk7XG5cbiAgICBsZXQgciA9IDAsIGcgPSAwLCBiID0gMDtcblxuICAgIGlmIChjbGVhbmVkSGV4Lmxlbmd0aCA9PT0gMykge1xuICAgICAgciA9IHBhcnNlSW50KGNsZWFuZWRIZXhbMF0gKyBjbGVhbmVkSGV4WzBdLCAxNik7XG4gICAgICBnID0gcGFyc2VJbnQoY2xlYW5lZEhleFsxXSArIGNsZWFuZWRIZXhbMV0sIDE2KTtcbiAgICAgIGIgPSBwYXJzZUludChjbGVhbmVkSGV4WzJdICsgY2xlYW5lZEhleFsyXSwgMTYpO1xuICAgICAgcmV0dXJuIHsgciwgZywgYiB9O1xuICAgIH1cblxuICAgIGlmIChjbGVhbmVkSGV4Lmxlbmd0aCA9PT0gNikge1xuICAgICAgciA9IHBhcnNlSW50KGNsZWFuZWRIZXguc3Vic3RyaW5nKDAsIDIpLCAxNik7XG4gICAgICBnID0gcGFyc2VJbnQoY2xlYW5lZEhleC5zdWJzdHJpbmcoMiwgNCksIDE2KTtcbiAgICAgIGIgPSBwYXJzZUludChjbGVhbmVkSGV4LnN1YnN0cmluZyg0LCA2KSwgMTYpO1xuICAgICAgcmV0dXJuIHsgciwgZywgYiB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgaGV4IHRvIFJHQiBzdHJpbmcgZm9ybWF0IGZvciBDU1MgKHNwYWNlLXNlcGFyYXRlZClcbiAgICovXG4gIHByaXZhdGUgaGV4VG9SZ2JTdHJpbmcoaGV4Q29sb3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihoZXhDb2xvcik7XG4gICAgcmV0dXJuIHJnYiA/IGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWAgOiAnMzcgOTkgMjM1JztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29udHJhc3QgY29sb3IgaW4gUkdCIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb250cmFzdENvbG9yUmdiKGhleENvbG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRyYXN0ID0gdGhpcy5nZXRDb250cmFzdENvbG9yKGhleENvbG9yKTtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbnRyYXN0KTtcbiAgICByZXR1cm4gcmdiID8gYCR7cmdiLnJ9ICR7cmdiLmd9ICR7cmdiLmJ9YCA6ICcyNTUgMjU1IDI1NSc7XG4gIH1cblxuICAvKipcbiAgICogTGlnaHRlbiBhIGhleCBjb2xvciBieSBhIHBlcmNlbnRhZ2VcbiAgICovXG4gIHByaXZhdGUgbGlnaHRlbkNvbG9yKGNvbG9yOiBzdHJpbmcsIHBlcmNlbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihjb2xvcik7XG4gICAgaWYgKCFyZ2IpIHJldHVybiBjb2xvcjtcblxuICAgIC8vIExpZ2h0ZW4gYnkgcGVyY2VudGFnZVxuICAgIGNvbnN0IHIgPSBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IocmdiLnIgKyAoMjU1IC0gcmdiLnIpICogKHBlcmNlbnQgLyAxMDApKSk7XG4gICAgY29uc3QgZyA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyZ2IuZyArICgyNTUgLSByZ2IuZykgKiAocGVyY2VudCAvIDEwMCkpKTtcbiAgICBjb25zdCBiID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHJnYi5iICsgKDI1NSAtIHJnYi5iKSAqIChwZXJjZW50IC8gMTAwKSkpO1xuXG4gICAgLy8gQ29udmVydCBiYWNrIHRvIGhleFxuICAgIHJldHVybiBgIyR7KCgxIDw8IDI0KSArIChyIDw8IDE2KSArIChnIDw8IDgpICsgYikudG9TdHJpbmcoMTYpLnNsaWNlKDEpfWA7XG4gIH1cblxuICAvKipcbiAgICogRGFya2VuIGEgaGV4IGNvbG9yIGJ5IGEgcGVyY2VudGFnZVxuICAgKi9cbiAgcHJpdmF0ZSBkYXJrZW5Db2xvcihjb2xvcjogc3RyaW5nLCBwZXJjZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoY29sb3IpO1xuICAgIGlmICghcmdiKSByZXR1cm4gY29sb3I7XG5cbiAgICBjb25zdCBmYWN0b3IgPSAxIC0gKHBlcmNlbnQgLyAxMDApO1xuICAgIGNvbnN0IHIgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHJnYi5yICogZmFjdG9yKSk7XG4gICAgY29uc3QgZyA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmdiLmcgKiBmYWN0b3IpKTtcbiAgICBjb25zdCBiID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihyZ2IuYiAqIGZhY3RvcikpO1xuXG4gICAgcmV0dXJuIGAjJHtyLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7Zy50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke2IudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgY29udHJhc3QgY29sb3IgKGJsYWNrIG9yIHdoaXRlKSBiYXNlZCBvbiBiYWNrZ3JvdW5kIGNvbG9yXG4gICAqL1xuICBwcml2YXRlIGdldENvbnRyYXN0Q29sb3IoaGV4Q29sb3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihoZXhDb2xvcik7XG4gICAgaWYgKCFyZ2IpIHJldHVybiAnI2ZmZmZmZic7XG5cbiAgICAvLyBDYWxjdWxhdGUgcmVsYXRpdmUgbHVtaW5hbmNlXG4gICAgY29uc3QgbHVtaW5hbmNlID0gKDAuMjk5ICogcmdiLnIgKyAwLjU4NyAqIHJnYi5nICsgMC4xMTQgKiByZ2IuYikgLyAyNTU7XG5cbiAgICAvLyBSZXR1cm4gYmxhY2sgZm9yIGxpZ2h0IGNvbG9ycywgd2hpdGUgZm9yIGRhcmsgY29sb3JzXG4gICAgcmV0dXJuIGx1bWluYW5jZSA+IDAuNSA/ICcjMDAwMDAwJyA6ICcjZmZmZmZmJztcbiAgfVxuXG4gIHByaXZhdGUgaW5qZWN0RHluYW1pY1N0eWxlcyhjc3M6IHN0cmluZykge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXhpc3RpbmdTdHlsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdHlsZUlkKTtcbiAgICBpZiAoZXhpc3RpbmdTdHlsZSkge1xuICAgICAgZXhpc3RpbmdTdHlsZS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbGVtZW50LmlkID0gdGhpcy5zdHlsZUlkO1xuICAgIHN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGNzcztcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuaGVhZCwgc3R5bGVFbGVtZW50KTtcbiAgfVxuXG4gIHRvZ2dsZVRoZW1lKCkge1xuICAgIGNvbnN0IGlzQ3VycmVudGx5RGFyayA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGFyaycpO1xuICAgIGlzQ3VycmVudGx5RGFyayA/IHRoaXMuZGlzYWJsZURhcmtNb2RlKCkgOiB0aGlzLmVuYWJsZURhcmtNb2RlKCk7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZURhcmtNb2RlKHNhdmVUb1N0b3JhZ2UgPSB0cnVlKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ2RhcmsnKTtcbiAgICBpZiAoc2F2ZVRvU3RvcmFnZSkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RvbGxlLXRoZW1lJywgJ2RhcmsnKTtcbiAgICB9XG4gICAgdGhpcy5pc0RhcmtTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVEYXJrTW9kZShzYXZlVG9TdG9yYWdlID0gdHJ1ZSkge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdkYXJrJyk7XG4gICAgaWYgKHNhdmVUb1N0b3JhZ2UpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS10aGVtZScsICdsaWdodCcpO1xuICAgIH1cbiAgICB0aGlzLmlzRGFya1N1YmplY3QubmV4dChmYWxzZSk7XG4gIH1cbiAgc2V0UHJpbWFyeUNvbG9yKGNvbG9yOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICB0aGlzLmdlbmVyYXRlUHJpbWFyeVNoYWRlcyhjb2xvcik7XG5cbiAgICAvLyBBbHNvIHNldCBpbmxpbmUgZm9yIGltbWVkaWF0ZSB1cGRhdGVcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcbiAgICBpZiAocmdiKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgJy0tcHJpbWFyeScsXG4gICAgICAgIGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJywgY29sb3IpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjdXJyZW50VGhlbWUoKTogJ2RhcmsnIHwgJ2xpZ2h0JyB7XG4gICAgcmV0dXJuIHRoaXMuaXNEYXJrU3ViamVjdC52YWx1ZSA/ICdkYXJrJyA6ICdsaWdodCc7XG4gIH1cblxuICBnZXQgcHJpbWFyeUNvbG9yKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgY29uc3QgY3NzVmFsdWUgPSBnZXRDb21wdXRlZFN0eWxlKHJvb3QpLmdldFByb3BlcnR5VmFsdWUoJy0tcHJpbWFyeScpLnRyaW0oKTtcblxuICAgIGlmIChjc3NWYWx1ZSAmJiBjc3NWYWx1ZSAhPT0gJycpIHtcbiAgICAgIC8vIENvbnZlcnQgUkdCIHN0cmluZyBiYWNrIHRvIGhleCBmb3IgZXh0ZXJuYWwgdXNlXG4gICAgICBjb25zdCByZ2JQYXJ0cyA9IGNzc1ZhbHVlLnNwbGl0KCcgJykubWFwKE51bWJlcik7XG4gICAgICBpZiAocmdiUGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBgIyR7cmdiUGFydHNbMF0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtyZ2JQYXJ0c1sxXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke3JnYlBhcnRzWzJdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdG8gY29uZmlnIGRlZmF1bHRzIChjbGVhcnMgdXNlciBwcmVmZXJlbmNlcylcbiAgICovXG4gIHJlc2V0VG9Db25maWdEZWZhdWx0cygpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIC8vIENsZWFyIHVzZXIgcHJlZmVyZW5jZXNcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtdGhlbWUnKTtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS1yYWRpdXMnKTtcblxuICAgIC8vIFJlLWluaXRpYWxpemUgd2l0aCBjb25maWcgZGVmYXVsdHNcbiAgICB0aGlzLmluaXRpYWxpemVUaGVtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHVzZXIgcHJlZmVyZW5jZXNcbiAgICovXG4gIGdldFVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtdGhlbWUnKSxcbiAgICAgIHByaW1hcnlDb2xvcjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKSxcbiAgICAgIHJhZGl1czogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXJhZGl1cycpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgdXNlciBwcmVmZXJlbmNlc1xuICAgKi9cbiAgY2xlYXJVc2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtdGhlbWUnKTtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS1yYWRpdXMnKTtcblxuICAgIC8vIFJlc2V0IHRvIHN5c3RlbSBkZWZhdWx0cyAobm90IGNvbmZpZyBkZWZhdWx0cylcbiAgICBjb25zdCBzeXN0ZW1QcmVmZXJzRGFyayA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcztcbiAgICBpZiAoc3lzdGVtUHJlZmVyc0RhcmspIHtcbiAgICAgIHRoaXMuZW5hYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVEYXJrTW9kZShmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIENTUyB2YXJpYWJsZXNcbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZShyb290LCAnLS1wcmltYXJ5Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZShyb290LCAnLS1yYWRpdXMnKTtcblxuICAgIC8vIENsZWFyIGR5bmFtaWMgc3R5bGVzXG4gICAgY29uc3QgZXhpc3RpbmdTdHlsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdHlsZUlkKTtcbiAgICBpZiAoZXhpc3RpbmdTdHlsZSkge1xuICAgICAgZXhpc3RpbmdTdHlsZS5yZW1vdmUoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
package/fesm2022/tolle-ui.mjs
CHANGED
|
@@ -1470,29 +1470,51 @@ class ThemeService {
|
|
|
1470
1470
|
initializeTheme() {
|
|
1471
1471
|
if (!isPlatformBrowser(this.platformId))
|
|
1472
1472
|
return;
|
|
1473
|
-
//
|
|
1473
|
+
// LOGIC: User Saved Preferences > Config Defaults > System Preference
|
|
1474
1474
|
const savedTheme = localStorage.getItem('tolle-theme');
|
|
1475
|
+
const savedPrimary = localStorage.getItem('tolle-primary-color');
|
|
1476
|
+
const savedRadius = localStorage.getItem('tolle-radius');
|
|
1475
1477
|
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1478
|
+
console.log('Theme initialization:', {
|
|
1479
|
+
savedTheme,
|
|
1480
|
+
savedPrimary,
|
|
1481
|
+
savedRadius,
|
|
1482
|
+
config: this.config,
|
|
1483
|
+
systemPrefersDark
|
|
1484
|
+
});
|
|
1485
|
+
// 1. Determine Dark/Light Mode
|
|
1486
|
+
// Priority: Saved Theme > Config Default > System Preference
|
|
1487
|
+
let shouldBeDark = systemPrefersDark; // Start with system
|
|
1488
|
+
if (savedTheme) {
|
|
1489
|
+
// User has saved preference
|
|
1490
|
+
shouldBeDark = savedTheme === 'dark';
|
|
1491
|
+
}
|
|
1492
|
+
else if (this.config?.darkByDefault !== undefined) {
|
|
1493
|
+
// Use config default if no user preference
|
|
1494
|
+
shouldBeDark = this.config.darkByDefault;
|
|
1495
|
+
}
|
|
1496
|
+
// Apply theme mode
|
|
1480
1497
|
if (shouldBeDark) {
|
|
1481
|
-
this.enableDarkMode();
|
|
1498
|
+
this.enableDarkMode(false); // Don't save, we'll save after checking all preferences
|
|
1482
1499
|
}
|
|
1483
1500
|
else {
|
|
1484
|
-
this.disableDarkMode();
|
|
1501
|
+
this.disableDarkMode(false);
|
|
1485
1502
|
}
|
|
1486
|
-
|
|
1503
|
+
// 2. Apply Primary Color
|
|
1504
|
+
// Priority: Saved Color > Config Color
|
|
1487
1505
|
if (savedPrimary) {
|
|
1488
|
-
|
|
1506
|
+
// User has saved color preference
|
|
1507
|
+
this.setPrimaryColor(savedPrimary, false); // Don't save again
|
|
1489
1508
|
}
|
|
1490
|
-
|
|
1491
|
-
|
|
1509
|
+
// 3. Apply Radius
|
|
1510
|
+
// Priority: Saved Radius > Config Radius
|
|
1511
|
+
if (savedRadius) {
|
|
1512
|
+
// User has saved radius preference
|
|
1513
|
+
this.setRadius(savedRadius, false);
|
|
1492
1514
|
}
|
|
1493
|
-
//
|
|
1494
|
-
if (
|
|
1495
|
-
|
|
1515
|
+
// Save theme mode preference if it came from config or system
|
|
1516
|
+
if (!savedTheme) {
|
|
1517
|
+
localStorage.setItem('tolle-theme', shouldBeDark ? 'dark' : 'light');
|
|
1496
1518
|
}
|
|
1497
1519
|
}
|
|
1498
1520
|
/**
|
|
@@ -1698,14 +1720,18 @@ class ThemeService {
|
|
|
1698
1720
|
const isCurrentlyDark = this.document.documentElement.classList.contains('dark');
|
|
1699
1721
|
isCurrentlyDark ? this.disableDarkMode() : this.enableDarkMode();
|
|
1700
1722
|
}
|
|
1701
|
-
enableDarkMode() {
|
|
1723
|
+
enableDarkMode(saveToStorage = true) {
|
|
1702
1724
|
this.renderer.addClass(this.document.documentElement, 'dark');
|
|
1703
|
-
|
|
1725
|
+
if (saveToStorage) {
|
|
1726
|
+
localStorage.setItem('tolle-theme', 'dark');
|
|
1727
|
+
}
|
|
1704
1728
|
this.isDarkSubject.next(true);
|
|
1705
1729
|
}
|
|
1706
|
-
disableDarkMode() {
|
|
1730
|
+
disableDarkMode(saveToStorage = true) {
|
|
1707
1731
|
this.renderer.removeClass(this.document.documentElement, 'dark');
|
|
1708
|
-
|
|
1732
|
+
if (saveToStorage) {
|
|
1733
|
+
localStorage.setItem('tolle-theme', 'light');
|
|
1734
|
+
}
|
|
1709
1735
|
this.isDarkSubject.next(false);
|
|
1710
1736
|
}
|
|
1711
1737
|
setPrimaryColor(color, persist = true) {
|
|
@@ -1738,29 +1764,56 @@ class ThemeService {
|
|
|
1738
1764
|
}
|
|
1739
1765
|
return localStorage.getItem('tolle-primary-color');
|
|
1740
1766
|
}
|
|
1741
|
-
|
|
1767
|
+
/**
|
|
1768
|
+
* Reset to config defaults (clears user preferences)
|
|
1769
|
+
*/
|
|
1770
|
+
resetToConfigDefaults() {
|
|
1771
|
+
if (!isPlatformBrowser(this.platformId))
|
|
1772
|
+
return;
|
|
1773
|
+
// Clear user preferences
|
|
1774
|
+
localStorage.removeItem('tolle-theme');
|
|
1775
|
+
localStorage.removeItem('tolle-primary-color');
|
|
1776
|
+
localStorage.removeItem('tolle-radius');
|
|
1777
|
+
// Re-initialize with config defaults
|
|
1778
|
+
this.initializeTheme();
|
|
1779
|
+
}
|
|
1780
|
+
/**
|
|
1781
|
+
* Get current user preferences
|
|
1782
|
+
*/
|
|
1783
|
+
getUserPreferences() {
|
|
1742
1784
|
if (!isPlatformBrowser(this.platformId))
|
|
1743
1785
|
return null;
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
}
|
|
1749
|
-
return localStorage.getItem('tolle-radius') || '0.5rem';
|
|
1786
|
+
return {
|
|
1787
|
+
theme: localStorage.getItem('tolle-theme'),
|
|
1788
|
+
primaryColor: localStorage.getItem('tolle-primary-color'),
|
|
1789
|
+
radius: localStorage.getItem('tolle-radius')
|
|
1790
|
+
};
|
|
1750
1791
|
}
|
|
1751
1792
|
/**
|
|
1752
|
-
*
|
|
1793
|
+
* Clear all user preferences
|
|
1753
1794
|
*/
|
|
1754
|
-
|
|
1795
|
+
clearUserPreferences() {
|
|
1755
1796
|
if (!isPlatformBrowser(this.platformId))
|
|
1756
1797
|
return;
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1798
|
+
localStorage.removeItem('tolle-theme');
|
|
1799
|
+
localStorage.removeItem('tolle-primary-color');
|
|
1800
|
+
localStorage.removeItem('tolle-radius');
|
|
1801
|
+
// Reset to system defaults (not config defaults)
|
|
1802
|
+
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
1803
|
+
if (systemPrefersDark) {
|
|
1804
|
+
this.enableDarkMode(false);
|
|
1760
1805
|
}
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1806
|
+
else {
|
|
1807
|
+
this.disableDarkMode(false);
|
|
1808
|
+
}
|
|
1809
|
+
// Remove CSS variables
|
|
1810
|
+
const root = this.document.documentElement;
|
|
1811
|
+
this.renderer.removeStyle(root, '--primary');
|
|
1812
|
+
this.renderer.removeStyle(root, '--radius');
|
|
1813
|
+
// Clear dynamic styles
|
|
1814
|
+
const existingStyle = this.document.getElementById(this.styleId);
|
|
1815
|
+
if (existingStyle) {
|
|
1816
|
+
existingStyle.remove();
|
|
1764
1817
|
}
|
|
1765
1818
|
}
|
|
1766
1819
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ThemeService, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: TOLLE_CONFIG, optional: true }, { token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable });
|