@oneluiz/dual-datepicker 3.5.1 → 3.6.0

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.
@@ -10,77 +10,116 @@
10
10
  * v3.5.1: Timezone-Safe via DateAdapter
11
11
  * All date operations use DateAdapter for consistent behavior
12
12
  * Fixes timezone bugs common in ERP/BI/POS systems
13
+ *
14
+ * v3.6.0: Plugin-Driven Architecture
15
+ * Preset Engine now uses PresetRegistry for plugin-based extensibility
16
+ * Follows Open/Closed Principle - extend without modifying core
17
+ * Supports external preset packages for industry-specific needs
13
18
  */
14
19
  import { Injectable, inject } from '@angular/core';
15
20
  import { DATE_CLOCK } from './date-clock';
16
21
  import { SystemClock } from './system-clock';
17
22
  import { DATE_ADAPTER } from './date-adapter';
18
23
  import { NativeDateAdapter } from './native-date-adapter';
24
+ import { PresetRegistry } from './preset-registry';
19
25
  import * as i0 from "@angular/core";
20
26
  /**
21
- * Registry of built-in presets
22
- * Can be extended by consumers
27
+ * Preset Engine - Plugin-Driven Architecture
28
+ *
29
+ * ARCHITECTURE (v3.6.0):
30
+ * - NO longer contains presets internally
31
+ * - Uses PresetRegistry for plugin management
32
+ * - Injects DateClock for SSR-safe time
33
+ * - Injects DateAdapter for timezone-safe operations
34
+ * - Follows Open/Closed Principle
23
35
  *
24
- * SSR-Safe Architecture:
25
- * - Injects DateClock via DI
26
- * - All presets use clock.now() instead of new Date()
27
- * - Deterministic: same clock.now() same preset
28
- * - Override DATE_CLOCK token in SSR to ensure consistency
36
+ * BACKWARD COMPATIBILITY:
37
+ * - Old API unchanged: resolve(), register(), getPresetKeys()
38
+ * - Built-in presets auto-registered via provider
39
+ * - Existing code continues to work
40
+ *
41
+ * EXTENSIBILITY:
42
+ * ```typescript
43
+ * // Register custom preset via registry
44
+ * const registry = inject(PresetRegistry);
45
+ * registry.register({
46
+ * key: 'MY_PRESET',
47
+ * resolve: (clock, adapter) => {
48
+ * const now = clock.now();
49
+ * return { start: now, end: now };
50
+ * }
51
+ * });
29
52
  *
30
- * Timezone-Safe Architecture:
31
- * - Injects DateAdapter via DI
32
- * - All date operations use adapter methods
33
- * - Prevents timezone bugs in cross-timezone scenarios
34
- * - Override DATE_ADAPTER for Luxon/DayJS/custom implementations
53
+ * // Use via engine
54
+ * const engine = inject(PresetEngine);
55
+ * const range = engine.resolve('MY_PRESET');
56
+ * ```
35
57
  */
36
58
  export class PresetEngine {
37
- presets = new Map();
38
59
  clock;
39
60
  adapter;
61
+ registry;
40
62
  constructor() {
41
- // Try to inject DATE_CLOCK, fallback to SystemClock if not provided
63
+ // Inject dependencies with fallbacks
42
64
  try {
43
65
  this.clock = inject(DATE_CLOCK, { optional: true }) ?? new SystemClock();
44
- }
45
- catch {
46
- // In case inject() fails (e.g., called outside injection context)
47
- this.clock = new SystemClock();
48
- }
49
- // Try to inject DATE_ADAPTER, fallback to NativeDateAdapter if not provided
50
- try {
51
66
  this.adapter = inject(DATE_ADAPTER, { optional: true }) ?? new NativeDateAdapter();
67
+ this.registry = inject(PresetRegistry);
52
68
  }
53
69
  catch {
54
- // In case inject() fails (e.g., called outside injection context)
70
+ // Fallback if inject() fails outside injection context
71
+ this.clock = new SystemClock();
55
72
  this.adapter = new NativeDateAdapter();
73
+ this.registry = new PresetRegistry();
56
74
  }
57
- this.registerBuiltInPresets();
58
75
  }
59
76
  /**
60
77
  * Register a custom preset
78
+ *
79
+ * @deprecated Use PresetRegistry.register() directly for new code
80
+ * Kept for backward compatibility
81
+ *
82
+ * @param key - Preset key (e.g., 'MY_CUSTOM_PRESET')
83
+ * @param preset - Legacy RangePreset object
61
84
  */
62
85
  register(key, preset) {
63
- this.presets.set(key, preset);
86
+ // Convert legacy RangePreset to RangePresetPlugin
87
+ this.registry.register({
88
+ key: key,
89
+ resolve: (clock, adapter) => {
90
+ const now = clock.now();
91
+ return preset.resolve(now);
92
+ }
93
+ });
64
94
  }
65
95
  /**
66
96
  * Resolve a preset to date range
67
97
  *
68
- * SSR Note: Uses injected DateClock for deterministic resolution
69
- * Timezone Note: Uses injected DateAdapter for consistent date operations
98
+ * Plugin Architecture:
99
+ * 1. Looks up plugin in PresetRegistry
100
+ * 2. Calls plugin.resolve(clock, adapter)
101
+ * 3. Returns ISO date range
70
102
  *
71
- * Override tokens in SSR scenarios:
72
- * - DATE_CLOCK: Control current time
73
- * - DATE_ADAPTER: Control date operations (e.g., Luxon for timezone support)
103
+ * SSR Note: Uses injected DateClock for deterministic resolution
104
+ * Timezone Note: Uses injected DateAdapter for consistent operations
74
105
  *
75
106
  * @param key - Preset key (e.g., 'TODAY', 'LAST_7_DAYS')
76
107
  * @param now - Optional override for current date (defaults to clock.now())
108
+ * @returns ISO date range or null if preset not found
77
109
  */
78
110
  resolve(key, now) {
79
- const preset = this.presets.get(key);
80
- if (!preset)
111
+ const plugin = this.registry.get(key);
112
+ if (!plugin) {
113
+ console.warn(`[PresetEngine] Preset "${key}" not found in registry`);
81
114
  return null;
82
- const currentDate = now ?? this.clock.now();
83
- const { start, end } = preset.resolve(currentDate);
115
+ }
116
+ // Create temporary clock if now is provided
117
+ const effectiveClock = now
118
+ ? { now: () => now }
119
+ : this.clock;
120
+ // Resolve via plugin
121
+ const { start, end } = plugin.resolve(effectiveClock, this.adapter);
122
+ // Convert to ISO format
84
123
  return {
85
124
  start: this.adapter.toISODate(start),
86
125
  end: this.adapter.toISODate(end)
@@ -88,188 +127,22 @@ export class PresetEngine {
88
127
  }
89
128
  /**
90
129
  * Get all available preset keys
130
+ *
131
+ * Delegates to PresetRegistry
132
+ *
133
+ * @returns Array of registered preset keys
91
134
  */
92
135
  getPresetKeys() {
93
- return Array.from(this.presets.keys());
136
+ return this.registry.getAllKeys();
94
137
  }
95
138
  /**
96
- * Register all built-in presets
139
+ * Check if a preset exists
97
140
  *
98
- * All presets now use DateAdapter for timezone-safe operations
141
+ * @param key - Preset key to check
142
+ * @returns true if preset is registered
99
143
  */
100
- registerBuiltInPresets() {
101
- const adapter = this.adapter;
102
- // Today
103
- this.register('TODAY', {
104
- resolve: (now) => {
105
- const normalized = adapter.normalize(now);
106
- return { start: normalized, end: normalized };
107
- }
108
- });
109
- // Yesterday
110
- this.register('YESTERDAY', {
111
- resolve: (now) => {
112
- const date = adapter.addDays(now, -1);
113
- return { start: date, end: date };
114
- }
115
- });
116
- // Last N Days
117
- this.register('LAST_7_DAYS', {
118
- resolve: (now) => {
119
- const end = adapter.normalize(now);
120
- const start = adapter.addDays(now, -6);
121
- return { start, end };
122
- }
123
- });
124
- this.register('LAST_14_DAYS', {
125
- resolve: (now) => {
126
- const end = adapter.normalize(now);
127
- const start = adapter.addDays(now, -13);
128
- return { start, end };
129
- }
130
- });
131
- this.register('LAST_30_DAYS', {
132
- resolve: (now) => {
133
- const end = adapter.normalize(now);
134
- const start = adapter.addDays(now, -29);
135
- return { start, end };
136
- }
137
- });
138
- this.register('LAST_60_DAYS', {
139
- resolve: (now) => {
140
- const end = adapter.normalize(now);
141
- const start = adapter.addDays(now, -59);
142
- return { start, end };
143
- }
144
- });
145
- this.register('LAST_90_DAYS', {
146
- resolve: (now) => {
147
- const end = adapter.normalize(now);
148
- const start = adapter.addDays(now, -89);
149
- return { start, end };
150
- }
151
- });
152
- // This Week (Monday to Sunday)
153
- this.register('THIS_WEEK', {
154
- resolve: (now) => {
155
- const dayOfWeek = adapter.getDay(now);
156
- const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
157
- const start = adapter.addDays(now, -daysToMonday);
158
- const end = adapter.addDays(start, 6);
159
- return { start, end };
160
- }
161
- });
162
- // Last Week
163
- this.register('LAST_WEEK', {
164
- resolve: (now) => {
165
- const dayOfWeek = adapter.getDay(now);
166
- const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
167
- const lastMonday = adapter.addDays(now, -daysToMonday - 7);
168
- const lastSunday = adapter.addDays(lastMonday, 6);
169
- return { start: lastMonday, end: lastSunday };
170
- }
171
- });
172
- // This Month
173
- this.register('THIS_MONTH', {
174
- resolve: (now) => {
175
- const start = adapter.startOfMonth(now);
176
- const end = adapter.endOfMonth(now);
177
- return { start, end };
178
- }
179
- });
180
- // Last Month
181
- this.register('LAST_MONTH', {
182
- resolve: (now) => {
183
- const lastMonth = adapter.addMonths(now, -1);
184
- const start = adapter.startOfMonth(lastMonth);
185
- const end = adapter.endOfMonth(lastMonth);
186
- return { start, end };
187
- }
188
- });
189
- // Month to Date
190
- this.register('MONTH_TO_DATE', {
191
- resolve: (now) => {
192
- const start = adapter.startOfMonth(now);
193
- const end = adapter.normalize(now);
194
- return { start, end };
195
- }
196
- });
197
- // This Quarter
198
- this.register('THIS_QUARTER', {
199
- resolve: (now) => {
200
- const currentMonth = adapter.getMonth(now);
201
- const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
202
- const year = adapter.getYear(now);
203
- // Construct start of quarter
204
- const start = new Date(year, quarterStartMonth, 1);
205
- const normalizedStart = adapter.normalize(start);
206
- // Construct end of quarter (last day of 3rd month)
207
- const end = new Date(year, quarterStartMonth + 3, 0);
208
- const normalizedEnd = adapter.normalize(end);
209
- return { start: normalizedStart, end: normalizedEnd };
210
- }
211
- });
212
- // Last Quarter
213
- this.register('LAST_QUARTER', {
214
- resolve: (now) => {
215
- const currentMonth = adapter.getMonth(now);
216
- const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;
217
- const year = adapter.getYear(now);
218
- // Handle year rollover (Q1 - 1 = Q4 of previous year)
219
- const adjustedYear = lastQuarterStartMonth < 0 ? year - 1 : year;
220
- const adjustedMonth = lastQuarterStartMonth < 0 ? 9 : lastQuarterStartMonth;
221
- const start = new Date(adjustedYear, adjustedMonth, 1);
222
- const normalizedStart = adapter.normalize(start);
223
- const end = new Date(adjustedYear, adjustedMonth + 3, 0);
224
- const normalizedEnd = adapter.normalize(end);
225
- return { start: normalizedStart, end: normalizedEnd };
226
- }
227
- });
228
- // Quarter to Date
229
- this.register('QUARTER_TO_DATE', {
230
- resolve: (now) => {
231
- const currentMonth = adapter.getMonth(now);
232
- const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
233
- const year = adapter.getYear(now);
234
- const start = new Date(year, quarterStartMonth, 1);
235
- const normalizedStart = adapter.normalize(start);
236
- const end = adapter.normalize(now);
237
- return { start: normalizedStart, end };
238
- }
239
- });
240
- // This Year
241
- this.register('THIS_YEAR', {
242
- resolve: (now) => {
243
- const year = adapter.getYear(now);
244
- const start = new Date(year, 0, 1);
245
- const end = new Date(year, 11, 31);
246
- return {
247
- start: adapter.normalize(start),
248
- end: adapter.normalize(end)
249
- };
250
- }
251
- });
252
- // Last Year
253
- this.register('LAST_YEAR', {
254
- resolve: (now) => {
255
- const year = adapter.getYear(now);
256
- const start = new Date(year - 1, 0, 1);
257
- const end = new Date(year - 1, 11, 31);
258
- return {
259
- start: adapter.normalize(start),
260
- end: adapter.normalize(end)
261
- };
262
- }
263
- });
264
- // Year to Date
265
- this.register('YEAR_TO_DATE', {
266
- resolve: (now) => {
267
- const year = adapter.getYear(now);
268
- const start = new Date(year, 0, 1);
269
- const end = adapter.normalize(now);
270
- return { start: adapter.normalize(start), end };
271
- }
272
- });
144
+ hasPreset(key) {
145
+ return this.registry.has(key);
273
146
  }
274
147
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetEngine, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
275
148
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetEngine, providedIn: 'root' });
@@ -282,6 +155,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
282
155
  }], ctorParameters: () => [] });
283
156
  /**
284
157
  * Create a custom preset from a function
158
+ *
159
+ * @deprecated Use RangePresetPlugin interface instead
160
+ * Kept for backward compatibility
285
161
  */
286
162
  export function createPreset(resolver) {
287
163
  return { resolve: resolver };
@@ -300,4 +176,4 @@ export function createPreset(resolver) {
300
176
  * This export will be removed in v4.0.0
301
177
  */
302
178
  export const presetEngine = new PresetEngine();
303
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LmVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3ByZXNldC5lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQWUxRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sWUFBWTtJQUNmLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztJQUN6QyxLQUFLLENBQVk7SUFDakIsT0FBTyxDQUFjO0lBRTdCO1FBQ0Usb0VBQW9FO1FBQ3BFLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGtFQUFrRTtZQUNsRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDckYsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGtFQUFrRTtZQUNsRSxJQUFJLENBQUMsT0FB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Q0FBQztvQkFDL0IsR0FBRyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO2lCQUM1QixDQUFDO1lBQ0osQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILGVBQWU7UUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRTtZQUM1QixPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDZixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDbEQsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBN1FVLFlBQVk7NEdBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COztBQWlSRDs7R0FFRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLFFBQW1EO0lBRW5ELE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIZWFkbGVzcyBQcmVzZXQgRW5naW5lXG4gKiBQdXJlIGZ1bmN0aW9ucyB0aGF0IHJlc29sdmUgZGF0ZSByYW5nZXMgV0lUSE9VVCByZW5kZXIgZGVwZW5kZW5jeVxuICogUGVyZmVjdCBmb3IgU1NSLCBnbG9iYWwgc3RhdGUsIGRhc2hib2FyZCBmaWx0ZXJzXG4gKiBcbiAqIHYzLjUuMDogU1NSLVNhZmUgdmlhIENsb2NrIEluamVjdGlvblxuICogQWxsIGRhdGUgY2FsY3VsYXRpb25zIHVzZSBEYXRlQ2xvY2sgaW5zdGVhZCBvZiBuZXcgRGF0ZSgpXG4gKiBUaGlzIGVuc3VyZXMgc2VydmVyIGFuZCBjbGllbnQgcmVzb2x2ZSBpZGVudGljYWwgcHJlc2V0c1xuICogXG4gKiB2My41LjE6IFRpbWV6b25lLVNhZmUgdmlhIERhdGVBZGFwdGVyXG4gKiBBbGwgZGF0ZSBvcGVyYXRpb25zIHVzZSBEYXRlQWRhcHRlciBmb3IgY29uc2lzdGVudCBiZWhhdmlvclxuICogRml4ZXMgdGltZXpvbmUgYnVncyBjb21tb24gaW4gRVJQL0JJL1BPUyBzeXN0ZW1zXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZUNsb2NrLCBEQVRFX0NMT0NLIH0gZnJvbSAnLi9kYXRlLWNsb2NrJztcbmltcG9ydCB7IFN5c3RlbUNsb2NrIH0gZnJvbSAnLi9zeXN0ZW0tY2xvY2snO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIERBVEVfQURBUFRFUiB9IGZyb20gJy4vZGF0ZS1hZGFwdGVyJztcbmltcG9ydCB7IE5hdGl2ZURhdGVBZGFwdGVyIH0gZnJvbSAnLi9uYXRpdmUtZGF0ZS1hZGFwdGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBSYW5nZVByZXNldCB7XG4gIC8qKlxuICAgKiBSZXNvbHZlIHByZXNldCB0byBhY3R1YWwgZGF0ZSByYW5nZVxuICAgKiBAcGFyYW0gbm93IC0gQ3VycmVudCBkYXRlIGZvciBkZXRlcm1pbmlzdGljIGNhbGN1bGF0aW9uXG4gICAqL1xuICByZXNvbHZlKG5vdzogRGF0ZSk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXNldFJhbmdlIHtcbiAgc3RhcnQ6IHN0cmluZzsgLy8gSVNPIGZvcm1hdFxuICBlbmQ6IHN0cmluZzsgLy8gSVNPIGZvcm1hdFxufVxuXG4vKipcbiAqIFJlZ2lzdHJ5IG9mIGJ1aWx0LWluIHByZXNldHNcbiAqIENhbiBiZSBleHRlbmRlZCBieSBjb25zdW1lcnNcbiAqIFxuICogU1NSLVNhZmUgQXJjaGl0ZWN0dXJlOlxuICogLSBJbmplY3RzIERhdGVDbG9jayB2aWEgRElcbiAqIC0gQWxsIHByZXNldHMgdXNlIGNsb2NrLm5vdygpIGluc3RlYWQgb2YgbmV3IERhdGUoKVxuICogLSBEZXRlcm1pbmlzdGljOiBzYW1lIGNsb2NrLm5vdygpIOKGkiBzYW1lIHByZXNldFxuICogLSBPdmVycmlkZSBEQVRFX0NMT0NLIHRva2VuIGluIFNTUiB0byBlbnN1cmUgY29uc2lzdGVuY3lcbiAqIFxuICogVGltZXpvbmUtU2FmZSBBcmNoaXRlY3R1cmU6XG4gKiAtIEluamVjdHMgRGF0ZUFkYXB0ZXIgdmlhIERJXG4gKiAtIEFsbCBkYXRlIG9wZXJhdGlvbnMgdXNlIGFkYXB0ZXIgbWV0aG9kc1xuICogLSBQcmV2ZW50cyB0aW1lem9uZSBidWdzIGluIGNyb3NzLXRpbWV6b25lIHNjZW5hcmlvc1xuICogLSBPdmVycmlkZSBEQVRFX0FEQVBURVIgZm9yIEx1eG9uL0RheUpTL2N1c3RvbSBpbXBsZW1lbnRhdGlvbnNcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJlc2V0RW5naW5lIHtcbiAgcHJpdmF0ZSBwcmVzZXRzID0gbmV3IE1hcDxzdHJpbmcsIFJhbmdlUHJlc2V0PigpO1xuICBwcml2YXRlIGNsb2NrOiBEYXRlQ2xvY2s7XG4gIHByaXZhdGUgYWRhcHRlcjogRGF0ZUFkYXB0ZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gVHJ5IHRvIGluamVjdCBEQVRFX0NMT0NLLCBmYWxsYmFjayB0byBTeXN0ZW1DbG9jayBpZiBub3QgcHJvdmlkZWRcbiAgICB0cnkge1xuICAgICAgdGhpcy5jbG9jayA9IGluamVjdChEQVRFX0NMT0NLLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBTeXN0ZW1DbG9jaygpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSW4gY2FzZSBpbmplY3QoKSBmYWlscyAoZS5nLiwgY2FsbGVkIG91dHNpZGUgaW5qZWN0aW9uIGNvbnRleHQpXG4gICAgICB0aGlzLmNsb2NrID0gbmV3IFN5c3RlbUNsb2NrKCk7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGluamVjdCBEQVRFX0FEQVBURVIsIGZhbGxiYWNrIHRvIE5hdGl2ZURhdGVBZGFwdGVyIGlmIG5vdCBwcm92aWRlZFxuICAgIHRyeSB7XG4gICAgICB0aGlzLmFkYXB0ZXIgPSBpbmplY3QoREFURV9BREFQVEVSLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBOYXRpdmVEYXRlQWRhcHRlcigpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSW4gY2FzZSBpbmplY3QoKSBmYWlscyAoZS5nLiwgY2FsbGVkIG91dHNpZGUgaW5qZWN0aW9uIGNvbnRleHQpXG4gICAgICB0aGlzLmFkYXB0ZXIgPSBuZXcgTmF0aXZlRGF0ZUFkYXB0ZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdGVyQnVpbHRJblByZXNldHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGN1c3RvbSBwcmVzZXRcbiAgICovXG4gIHJlZ2lzdGVyKGtleTogc3RyaW5nLCBwcmVzZXQ6IFJhbmdlUHJlc2V0KTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRzLnNldChrZXksIHByZXNldCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHByZXNldCB0byBkYXRlIHJhbmdlXG4gICAqIFxuICAgKiBTU1IgTm90ZTogVXNlcyBpbmplY3RlZCBEYXRlQ2xvY2sgZm9yIGRldGVybWluaXN0aWMgcmVzb2x1dGlvblxuICAgKiBUaW1lem9uZSBOb3RlOiBVc2VzIGluamVjdGVkIERhdGVBZGFwdGVyIGZvciBjb25zaXN0ZW50IGRhdGUgb3BlcmF0aW9uc1xuICAgKiBcbiAgICogT3ZlcnJpZGUgdG9rZW5zIGluIFNTUiBzY2VuYXJpb3M6XG4gICAqIC0gREFURV9DTE9DSzogQ29udHJvbCBjdXJyZW50IHRpbWVcbiAgICogLSBEQVRFX0FEQVBURVI6IENvbnRyb2wgZGF0ZSBvcGVyYXRpb25zIChlLmcuLCBMdXhvbiBmb3IgdGltZXpvbmUgc3VwcG9ydClcbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcmVzZXQga2V5IChlLmcuLCAnVE9EQVknLCAnTEFTVF83X0RBWVMnKVxuICAgKiBAcGFyYW0gbm93IC0gT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIGN1cnJlbnQgZGF0ZSAoZGVmYXVsdHMgdG8gY2xvY2subm93KCkpXG4gICAqL1xuICByZXNvbHZlKGtleTogc3RyaW5nLCBub3c/OiBEYXRlKTogUHJlc2V0UmFuZ2UgfCBudWxsIHtcbiAgICBjb25zdCBwcmVzZXQgPSB0aGlzLnByZXNldHMuZ2V0KGtleSk7XG4gICAgaWYgKCFwcmVzZXQpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY3VycmVudERhdGUgPSBub3cgPz8gdGhpcy5jbG9jay5ub3coKTtcbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHByZXNldC5yZXNvbHZlKGN1cnJlbnREYXRlKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHRoaXMuYWRhcHRlci50b0lTT0RhdGUoc3RhcnQpLFxuICAgICAgZW5kOiB0aGlzLmFkYXB0ZXIudG9JU09EYXRlKGVuZClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYXZhaWxhYmxlIHByZXNldCBrZXlzXG4gICAqL1xuICBnZXRQcmVzZXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnByZXNldHMua2V5cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbGwgYnVpbHQtaW4gcHJlc2V0c1xuICAgKiBcbiAgICogQWxsIHByZXNldHMgbm93IHVzZSBEYXRlQWRhcHRlciBmb3IgdGltZXpvbmUtc2FmZSBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyQnVpbHRJblByZXNldHMoKTogdm9pZCB7XG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYWRhcHRlcjtcblxuICAgIC8vIFRvZGF5XG4gICAgdGhpcy5yZWdpc3RlcignVE9EQVknLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBhZGFwdGVyLm5vcm1hbGl6ZShub3cpO1xuICAgICAgICByZXR1cm4geyBzdGFydDogbm9ybWFsaXplZCwgZW5kOiBub3JtYWxpemVkIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBZZXN0ZXJkYXlcbiAgICB0aGlzLnJlZ2lzdGVyKCdZRVNURVJEQVknLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBhZGFwdGVyLmFkZERheXMobm93LCAtMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBkYXRlLCBlbmQ6IGRhdGUgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgTiBEYXlzXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF83X0RBWVMnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYWRhcHRlci5hZGREYXlzKG5vdywgLTYpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUXzE0X0RBWVMnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYWRhcHRlci5hZGREYXlzKG5vdywgLTEzKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF8zMF9EQVlTJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBlbmQgPSBhZGFwdGVyLm5vcm1hbGl6ZShub3cpO1xuICAgICAgICBjb25zdCBzdGFydCA9IGFkYXB0ZXIuYWRkRGF5cyhub3csIC0yOSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXIoJ0xBU1RfNjBfREFZUycsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgZW5kID0gYWRhcHRlci5ub3JtYWxpemUobm93KTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhZGFwdGVyLmFkZERheXMobm93LCAtNTkpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUXzkwX0RBWVMnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYWRhcHRlci5hZGREYXlzKG5vdywgLTg5KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhpcyBXZWVrIChNb25kYXkgdG8gU3VuZGF5KVxuICAgIHRoaXMucmVnaXN0ZXIoJ1RISVNfV0VFSycsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgZGF5T2ZXZWVrID0gYWRhcHRlci5nZXREYXkobm93KTtcbiAgICAgICAgY29uc3QgZGF5c1RvTW9uZGF5ID0gZGF5T2ZXZWVrID09PSAwID8gNiA6IGRheU9mV2VlayAtIDE7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYWRhcHRlci5hZGREYXlzKG5vdywgLWRheXNUb01vbmRheSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIuYWRkRGF5cyhzdGFydCwgNik7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgV2Vla1xuICAgIHRoaXMucmVnaXN0ZXIoJ0xBU1RfV0VFSycsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgZGF5T2ZXZWVrID0gYWRhcHRlci5nZXREYXkobm93KTtcbiAgICAgICAgY29uc3QgZGF5c1RvTW9uZGF5ID0gZGF5T2ZXZWVrID09PSAwID8gNiA6IGRheU9mV2VlayAtIDE7XG4gICAgICAgIGNvbnN0IGxhc3RNb25kYXkgPSBhZGFwdGVyLmFkZERheXMobm93LCAtZGF5c1RvTW9uZGF5IC0gNyk7XG4gICAgICAgIGNvbnN0IGxhc3RTdW5kYXkgPSBhZGFwdGVyLmFkZERheXMobGFzdE1vbmRheSwgNik7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBsYXN0TW9uZGF5LCBlbmQ6IGxhc3RTdW5kYXkgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRoaXMgTW9udGhcbiAgICB0aGlzLnJlZ2lzdGVyKCdUSElTX01PTlRIJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IGFkYXB0ZXIuc3RhcnRPZk1vbnRoKG5vdyk7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIuZW5kT2ZNb250aChub3cpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMYXN0IE1vbnRoXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF9NT05USCcsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgbGFzdE1vbnRoID0gYWRhcHRlci5hZGRNb250aHMobm93LCAtMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYWRhcHRlci5zdGFydE9mTW9udGgobGFzdE1vbnRoKTtcbiAgICAgICAgY29uc3QgZW5kID0gYWRhcHRlci5lbmRPZk1vbnRoKGxhc3RNb250aCk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE1vbnRoIHRvIERhdGVcbiAgICB0aGlzLnJlZ2lzdGVyKCdNT05USF9UT19EQVRFJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IGFkYXB0ZXIuc3RhcnRPZk1vbnRoKG5vdyk7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRoaXMgUXVhcnRlclxuICAgIHRoaXMucmVnaXN0ZXIoJ1RISVNfUVVBUlRFUicsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gYWRhcHRlci5nZXRNb250aChub3cpO1xuICAgICAgICBjb25zdCBxdWFydGVyU3RhcnRNb250aCA9IE1hdGguZmxvb3IoY3VycmVudE1vbnRoIC8gMykgKiAzO1xuICAgICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdyk7XG4gICAgICAgIFxuICAgICAgICAvLyBDb25zdHJ1Y3Qgc3RhcnQgb2YgcXVhcnRlclxuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKHllYXIsIHF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN0YXJ0ID0gYWRhcHRlci5ub3JtYWxpemUoc3RhcnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ29uc3RydWN0IGVuZCBvZiBxdWFydGVyIChsYXN0IGRheSBvZiAzcmQgbW9udGgpXG4gICAgICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKHllYXIsIHF1YXJ0ZXJTdGFydE1vbnRoICsgMywgMCk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFbmQgPSBhZGFwdGVyLm5vcm1hbGl6ZShlbmQpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG5vcm1hbGl6ZWRTdGFydCwgZW5kOiBub3JtYWxpemVkRW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMYXN0IFF1YXJ0ZXJcbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUX1FVQVJURVInLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IGFkYXB0ZXIuZ2V0TW9udGgobm93KTtcbiAgICAgICAgY29uc3QgbGFzdFF1YXJ0ZXJTdGFydE1vbnRoID0gTWF0aC5mbG9vcihjdXJyZW50TW9udGggLyAzKSAqIDMgLSAzO1xuICAgICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdyk7XG4gICAgICAgIFxuICAgICAgICAvLyBIYW5kbGUgeWVhciByb2xsb3ZlciAoUTEgLSAxID0gUTQgb2YgcHJldmlvdXMgeWVhcilcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRZZWFyID0gbGFzdFF1YXJ0ZXJTdGFydE1vbnRoIDwgMCA/IHllYXIgLSAxIDogeWVhcjtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRNb250aCA9IGxhc3RRdWFydGVyU3RhcnRNb250aCA8IDAgPyA5IDogbGFzdFF1YXJ0ZXJTdGFydE1vbnRoO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShhZGp1c3RlZFllYXIsIGFkanVzdGVkTW9udGgsIDEpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU3RhcnQgPSBhZGFwdGVyLm5vcm1hbGl6ZShzdGFydCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShhZGp1c3RlZFllYXIsIGFkanVzdGVkTW9udGggKyAzLCAwKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKGVuZCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4geyBzdGFydDogbm9ybWFsaXplZFN0YXJ0LCBlbmQ6IG5vcm1hbGl6ZWRFbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFF1YXJ0ZXIgdG8gRGF0ZVxuICAgIHRoaXMucmVnaXN0ZXIoJ1FVQVJURVJfVE9fREFURScsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gYWRhcHRlci5nZXRNb250aChub3cpO1xuICAgICAgICBjb25zdCBxdWFydGVyU3RhcnRNb250aCA9IE1hdGguZmxvb3IoY3VycmVudE1vbnRoIC8gMykgKiAzO1xuICAgICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdyk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKHllYXIsIHF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN0YXJ0ID0gYWRhcHRlci5ub3JtYWxpemUoc3RhcnQpO1xuICAgICAgICBjb25zdCBlbmQgPSBhZGFwdGVyLm5vcm1hbGl6ZShub3cpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG5vcm1hbGl6ZWRTdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBUaGlzIFllYXJcbiAgICB0aGlzLnJlZ2lzdGVyKCdUSElTX1lFQVInLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IHllYXIgPSBhZGFwdGVyLmdldFllYXIobm93KTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSh5ZWFyLCAwLCAxKTtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoeWVhciwgMTEsIDMxKTtcbiAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgc3RhcnQ6IGFkYXB0ZXIubm9ybWFsaXplKHN0YXJ0KSwgXG4gICAgICAgICAgZW5kOiBhZGFwdGVyLm5vcm1hbGl6ZShlbmQpIFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTGFzdCBZZWFyXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF9ZRUFSJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoeWVhciAtIDEsIDAsIDEpO1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZSh5ZWFyIC0gMSwgMTEsIDMxKTtcbiAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgc3RhcnQ6IGFkYXB0ZXIubm9ybWFsaXplKHN0YXJ0KSwgXG4gICAgICAgICAgZW5kOiBhZGFwdGVyLm5vcm1hbGl6ZShlbmQpIFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gWWVhciB0byBEYXRlXG4gICAgdGhpcy5yZWdpc3RlcignWUVBUl9UT19EQVRFJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoeWVhciwgMCwgMSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBhZGFwdGVyLm5vcm1hbGl6ZShzdGFydCksIGVuZCB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY3VzdG9tIHByZXNldCBmcm9tIGEgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByZXNldChcbiAgcmVzb2x2ZXI6IChub3c6IERhdGUpID0+IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9XG4pOiBSYW5nZVByZXNldCB7XG4gIHJldHVybiB7IHJlc29sdmU6IHJlc29sdmVyIH07XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluc3RlYWQ6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBwcml2YXRlIGVuZ2luZSA9IGluamVjdChQcmVzZXRFbmdpbmUpO1xuICogYGBgXG4gKiBcbiAqIFNpbmdsZXRvbiBwcmVzZXQgZW5naW5lIGluc3RhbmNlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gKiBcbiAqIFdBUk5JTkc6IFRoaXMgc2luZ2xldG9uIHVzZXMgU3lzdGVtQ2xvY2sgZGlyZWN0bHkgYW5kIGlzIE5PVCBTU1Itc2FmZS5cbiAqIEZvciBTU1IgYXBwbGljYXRpb25zLCBpbmplY3QgUHJlc2V0RW5naW5lIGFuZCBvdmVycmlkZSBEQVRFX0NMT0NLIHRva2VuLlxuICogXG4gKiBUaGlzIGV4cG9ydCB3aWxsIGJlIHJlbW92ZWQgaW4gdjQuMC4wXG4gKi9cbmV4cG9ydCBjb25zdCBwcmVzZXRFbmdpbmUgPSBuZXcgUHJlc2V0RW5naW5lKCk7XG4iXX0=
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LmVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3ByZXNldC5lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFtQm5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBSUgsTUFBTSxPQUFPLFlBQVk7SUFDZixLQUFLLENBQVk7SUFDakIsT0FBTyxDQUFjO0lBQ3JCLFFBQVEsQ0FBaUI7SUFFakM7UUFDRSxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDbkYsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxRQUFRLENBQUMsR0FBVyxFQUFFLE1BQW1CO1FBQ3ZDLGtEQUFrRDtRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNyQixHQUFHLEVBQUUsR0FBRztZQUNSLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDMUIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBVTtRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLHlCQUF5QixDQUFDLENBQUM7WUFDckUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsNENBQTRDO1FBQzVDLE1BQU0sY0FBYyxHQUFHLEdBQUc7WUFDeEIsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRTtZQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUVmLHFCQUFxQjtRQUNyQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVwRSx3QkFBd0I7UUFDeEIsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDcEMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztTQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLEdBQVc7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO3dHQWhHVSxZQUFZOzRHQUFaLFlBQVksY0FGWCxNQUFNOzs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUFvR0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixRQUFtRDtJQUVuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGVhZGxlc3MgUHJlc2V0IEVuZ2luZVxuICogUHVyZSBmdW5jdGlvbnMgdGhhdCByZXNvbHZlIGRhdGUgcmFuZ2VzIFdJVEhPVVQgcmVuZGVyIGRlcGVuZGVuY3lcbiAqIFBlcmZlY3QgZm9yIFNTUiwgZ2xvYmFsIHN0YXRlLCBkYXNoYm9hcmQgZmlsdGVyc1xuICogXG4gKiB2My41LjA6IFNTUi1TYWZlIHZpYSBDbG9jayBJbmplY3Rpb25cbiAqIEFsbCBkYXRlIGNhbGN1bGF0aW9ucyB1c2UgRGF0ZUNsb2NrIGluc3RlYWQgb2YgbmV3IERhdGUoKVxuICogVGhpcyBlbnN1cmVzIHNlcnZlciBhbmQgY2xpZW50IHJlc29sdmUgaWRlbnRpY2FsIHByZXNldHNcbiAqIFxuICogdjMuNS4xOiBUaW1lem9uZS1TYWZlIHZpYSBEYXRlQWRhcHRlclxuICogQWxsIGRhdGUgb3BlcmF0aW9ucyB1c2UgRGF0ZUFkYXB0ZXIgZm9yIGNvbnNpc3RlbnQgYmVoYXZpb3JcbiAqIEZpeGVzIHRpbWV6b25lIGJ1Z3MgY29tbW9uIGluIEVSUC9CSS9QT1Mgc3lzdGVtc1xuICogXG4gKiB2My42LjA6IFBsdWdpbi1Ecml2ZW4gQXJjaGl0ZWN0dXJlXG4gKiBQcmVzZXQgRW5naW5lIG5vdyB1c2VzIFByZXNldFJlZ2lzdHJ5IGZvciBwbHVnaW4tYmFzZWQgZXh0ZW5zaWJpbGl0eVxuICogRm9sbG93cyBPcGVuL0Nsb3NlZCBQcmluY2lwbGUgLSBleHRlbmQgd2l0aG91dCBtb2RpZnlpbmcgY29yZVxuICogU3VwcG9ydHMgZXh0ZXJuYWwgcHJlc2V0IHBhY2thZ2VzIGZvciBpbmR1c3RyeS1zcGVjaWZpYyBuZWVkc1xuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZUNsb2NrLCBEQVRFX0NMT0NLIH0gZnJvbSAnLi9kYXRlLWNsb2NrJztcbmltcG9ydCB7IFN5c3RlbUNsb2NrIH0gZnJvbSAnLi9zeXN0ZW0tY2xvY2snO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIERBVEVfQURBUFRFUiB9IGZyb20gJy4vZGF0ZS1hZGFwdGVyJztcbmltcG9ydCB7IE5hdGl2ZURhdGVBZGFwdGVyIH0gZnJvbSAnLi9uYXRpdmUtZGF0ZS1hZGFwdGVyJztcbmltcG9ydCB7IFByZXNldFJlZ2lzdHJ5IH0gZnJvbSAnLi9wcmVzZXQtcmVnaXN0cnknO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBSYW5nZVByZXNldFBsdWdpbiBmcm9tICcuL3JhbmdlLXByZXNldC5wbHVnaW4nIGluc3RlYWRcbiAqIEtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZVByZXNldCB7XG4gIC8qKlxuICAgKiBSZXNvbHZlIHByZXNldCB0byBhY3R1YWwgZGF0ZSByYW5nZVxuICAgKiBAcGFyYW0gbm93IC0gQ3VycmVudCBkYXRlIGZvciBkZXRlcm1pbmlzdGljIGNhbGN1bGF0aW9uXG4gICAqL1xuICByZXNvbHZlKG5vdzogRGF0ZSk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXNldFJhbmdlIHtcbiAgc3RhcnQ6IHN0cmluZzsgLy8gSVNPIGZvcm1hdFxuICBlbmQ6IHN0cmluZzsgLy8gSVNPIGZvcm1hdFxufVxuXG4vKipcbiAqIFByZXNldCBFbmdpbmUgLSBQbHVnaW4tRHJpdmVuIEFyY2hpdGVjdHVyZVxuICogXG4gKiBBUkNISVRFQ1RVUkUgKHYzLjYuMCk6XG4gKiAtIE5PIGxvbmdlciBjb250YWlucyBwcmVzZXRzIGludGVybmFsbHlcbiAqIC0gVXNlcyBQcmVzZXRSZWdpc3RyeSBmb3IgcGx1Z2luIG1hbmFnZW1lbnRcbiAqIC0gSW5qZWN0cyBEYXRlQ2xvY2sgZm9yIFNTUi1zYWZlIHRpbWVcbiAqIC0gSW5qZWN0cyBEYXRlQWRhcHRlciBmb3IgdGltZXpvbmUtc2FmZSBvcGVyYXRpb25zXG4gKiAtIEZvbGxvd3MgT3Blbi9DbG9zZWQgUHJpbmNpcGxlXG4gKiBcbiAqIEJBQ0tXQVJEIENPTVBBVElCSUxJVFk6XG4gKiAtIE9sZCBBUEkgdW5jaGFuZ2VkOiByZXNvbHZlKCksIHJlZ2lzdGVyKCksIGdldFByZXNldEtleXMoKVxuICogLSBCdWlsdC1pbiBwcmVzZXRzIGF1dG8tcmVnaXN0ZXJlZCB2aWEgcHJvdmlkZXJcbiAqIC0gRXhpc3RpbmcgY29kZSBjb250aW51ZXMgdG8gd29ya1xuICogXG4gKiBFWFRFTlNJQklMSVRZOlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gUmVnaXN0ZXIgY3VzdG9tIHByZXNldCB2aWEgcmVnaXN0cnlcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gaW5qZWN0KFByZXNldFJlZ2lzdHJ5KTtcbiAqIHJlZ2lzdHJ5LnJlZ2lzdGVyKHtcbiAqICAga2V5OiAnTVlfUFJFU0VUJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgcmV0dXJuIHsgc3RhcnQ6IG5vdywgZW5kOiBub3cgfTtcbiAqICAgfVxuICogfSk7XG4gKiBcbiAqIC8vIFVzZSB2aWEgZW5naW5lXG4gKiBjb25zdCBlbmdpbmUgPSBpbmplY3QoUHJlc2V0RW5naW5lKTtcbiAqIGNvbnN0IHJhbmdlID0gZW5naW5lLnJlc29sdmUoJ01ZX1BSRVNFVCcpO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFByZXNldEVuZ2luZSB7XG4gIHByaXZhdGUgY2xvY2s6IERhdGVDbG9jaztcbiAgcHJpdmF0ZSBhZGFwdGVyOiBEYXRlQWRhcHRlcjtcbiAgcHJpdmF0ZSByZWdpc3RyeTogUHJlc2V0UmVnaXN0cnk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5qZWN0IGRlcGVuZGVuY2llcyB3aXRoIGZhbGxiYWNrc1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNsb2NrID0gaW5qZWN0KERBVEVfQ0xPQ0ssIHsgb3B0aW9uYWw6IHRydWUgfSkgPz8gbmV3IFN5c3RlbUNsb2NrKCk7XG4gICAgICB0aGlzLmFkYXB0ZXIgPSBpbmplY3QoREFURV9BREFQVEVSLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBOYXRpdmVEYXRlQWRhcHRlcigpO1xuICAgICAgdGhpcy5yZWdpc3RyeSA9IGluamVjdChQcmVzZXRSZWdpc3RyeSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsYmFjayBpZiBpbmplY3QoKSBmYWlscyBvdXRzaWRlIGluamVjdGlvbiBjb250ZXh0XG4gICAgICB0aGlzLmNsb2NrID0gbmV3IFN5c3RlbUNsb2NrKCk7XG4gICAgICB0aGlzLmFkYXB0ZXIgPSBuZXcgTmF0aXZlRGF0ZUFkYXB0ZXIoKTtcbiAgICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgUHJlc2V0UmVnaXN0cnkoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjdXN0b20gcHJlc2V0XG4gICAqIFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgUHJlc2V0UmVnaXN0cnkucmVnaXN0ZXIoKSBkaXJlY3RseSBmb3IgbmV3IGNvZGVcbiAgICogS2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByZXNldCBrZXkgKGUuZy4sICdNWV9DVVNUT01fUFJFU0VUJylcbiAgICogQHBhcmFtIHByZXNldCAtIExlZ2FjeSBSYW5nZVByZXNldCBvYmplY3RcbiAgICovXG4gIHJlZ2lzdGVyKGtleTogc3RyaW5nLCBwcmVzZXQ6IFJhbmdlUHJlc2V0KTogdm9pZCB7XG4gICAgLy8gQ29udmVydCBsZWdhY3kgUmFuZ2VQcmVzZXQgdG8gUmFuZ2VQcmVzZXRQbHVnaW5cbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKHtcbiAgICAgIGtleToga2V5LFxuICAgICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IGNsb2NrLm5vdygpO1xuICAgICAgICByZXR1cm4gcHJlc2V0LnJlc29sdmUobm93KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgcHJlc2V0IHRvIGRhdGUgcmFuZ2VcbiAgICogXG4gICAqIFBsdWdpbiBBcmNoaXRlY3R1cmU6XG4gICAqIDEuIExvb2tzIHVwIHBsdWdpbiBpbiBQcmVzZXRSZWdpc3RyeVxuICAgKiAyLiBDYWxscyBwbHVnaW4ucmVzb2x2ZShjbG9jaywgYWRhcHRlcilcbiAgICogMy4gUmV0dXJucyBJU08gZGF0ZSByYW5nZVxuICAgKiBcbiAgICogU1NSIE5vdGU6IFVzZXMgaW5qZWN0ZWQgRGF0ZUNsb2NrIGZvciBkZXRlcm1pbmlzdGljIHJlc29sdXRpb25cbiAgICogVGltZXpvbmUgTm90ZTogVXNlcyBpbmplY3RlZCBEYXRlQWRhcHRlciBmb3IgY29uc2lzdGVudCBvcGVyYXRpb25zXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJlc2V0IGtleSAoZS5nLiwgJ1RPREFZJywgJ0xBU1RfN19EQVlTJylcbiAgICogQHBhcmFtIG5vdyAtIE9wdGlvbmFsIG92ZXJyaWRlIGZvciBjdXJyZW50IGRhdGUgKGRlZmF1bHRzIHRvIGNsb2NrLm5vdygpKVxuICAgKiBAcmV0dXJucyBJU08gZGF0ZSByYW5nZSBvciBudWxsIGlmIHByZXNldCBub3QgZm91bmRcbiAgICovXG4gIHJlc29sdmUoa2V5OiBzdHJpbmcsIG5vdz86IERhdGUpOiBQcmVzZXRSYW5nZSB8IG51bGwge1xuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMucmVnaXN0cnkuZ2V0KGtleSk7XG4gICAgXG4gICAgaWYgKCFwbHVnaW4pIHtcbiAgICAgIGNvbnNvbGUud2FybihgW1ByZXNldEVuZ2luZV0gUHJlc2V0IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHJlZ2lzdHJ5YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGVtcG9yYXJ5IGNsb2NrIGlmIG5vdyBpcyBwcm92aWRlZFxuICAgIGNvbnN0IGVmZmVjdGl2ZUNsb2NrID0gbm93IFxuICAgICAgPyB7IG5vdzogKCkgPT4gbm93IH0gXG4gICAgICA6IHRoaXMuY2xvY2s7XG5cbiAgICAvLyBSZXNvbHZlIHZpYSBwbHVnaW5cbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHBsdWdpbi5yZXNvbHZlKGVmZmVjdGl2ZUNsb2NrLCB0aGlzLmFkYXB0ZXIpO1xuXG4gICAgLy8gQ29udmVydCB0byBJU08gZm9ybWF0XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiB0aGlzLmFkYXB0ZXIudG9JU09EYXRlKHN0YXJ0KSxcbiAgICAgIGVuZDogdGhpcy5hZGFwdGVyLnRvSVNPRGF0ZShlbmQpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGF2YWlsYWJsZSBwcmVzZXQga2V5c1xuICAgKiBcbiAgICogRGVsZWdhdGVzIHRvIFByZXNldFJlZ2lzdHJ5XG4gICAqIFxuICAgKiBAcmV0dXJucyBBcnJheSBvZiByZWdpc3RlcmVkIHByZXNldCBrZXlzXG4gICAqL1xuICBnZXRQcmVzZXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXRBbGxLZXlzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBwcmVzZXQgZXhpc3RzXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJlc2V0IGtleSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHByZXNldCBpcyByZWdpc3RlcmVkXG4gICAqL1xuICBoYXNQcmVzZXQoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5oYXMoa2V5KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGN1c3RvbSBwcmVzZXQgZnJvbSBhIGZ1bmN0aW9uXG4gKiBcbiAqIEBkZXByZWNhdGVkIFVzZSBSYW5nZVByZXNldFBsdWdpbiBpbnRlcmZhY2UgaW5zdGVhZFxuICogS2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJlc2V0KFxuICByZXNvbHZlcjogKG5vdzogRGF0ZSkgPT4geyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH1cbik6IFJhbmdlUHJlc2V0IHtcbiAgcmV0dXJuIHsgcmVzb2x2ZTogcmVzb2x2ZXIgfTtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgZGVwZW5kZW5jeSBpbmplY3Rpb24gaW5zdGVhZDpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHByaXZhdGUgZW5naW5lID0gaW5qZWN0KFByZXNldEVuZ2luZSk7XG4gKiBgYGBcbiAqIFxuICogU2luZ2xldG9uIHByZXNldCBlbmdpbmUgaW5zdGFuY2UgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAqIFxuICogV0FSTklORzogVGhpcyBzaW5nbGV0b24gdXNlcyBTeXN0ZW1DbG9jayBkaXJlY3RseSBhbmQgaXMgTk9UIFNTUi1zYWZlLlxuICogRm9yIFNTUiBhcHBsaWNhdGlvbnMsIGluamVjdCBQcmVzZXRFbmdpbmUgYW5kIG92ZXJyaWRlIERBVEVfQ0xPQ0sgdG9rZW4uXG4gKiBcbiAqIFRoaXMgZXhwb3J0IHdpbGwgYmUgcmVtb3ZlZCBpbiB2NC4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IHByZXNldEVuZ2luZSA9IG5ldyBQcmVzZXRFbmdpbmUoKTtcbiJdfQ==
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Range Preset Plugin System
3
+ *
4
+ * Version: 3.6.0
5
+ *
6
+ * Plugin-based architecture for date range presets following Open/Closed Principle.
7
+ *
8
+ * WHY THIS EXISTS:
9
+ * - Enterprise apps need industry-specific presets (fiscal, hotel, logistics)
10
+ * - Presets should be distributable as external packages
11
+ * - Core should NOT know about all possible presets
12
+ * - Users should extend presets without modifying library code
13
+ *
14
+ * ARCHITECTURE:
15
+ * ```
16
+ * RangePresetPlugin (interface) - Contract for all presets
17
+ * ↓
18
+ * PresetRegistry (service) - Manages plugin registration
19
+ * ↓
20
+ * PresetEngine (refactored) - Resolves presets via registry
21
+ * ↓
22
+ * DualDateRangeStore - No changes, backward compatible
23
+ * ```
24
+ *
25
+ * USAGE:
26
+ * ```typescript
27
+ * // Built-in presets work automatically
28
+ * store.applyPreset('LAST_7_DAYS'); // ✅ Works
29
+ *
30
+ * // Register custom preset
31
+ * const registry = inject(PresetRegistry);
32
+ * registry.register({
33
+ * key: 'THIS_FISCAL_QUARTER',
34
+ * resolve: (clock, adapter) => {
35
+ * const now = clock.now();
36
+ * const fiscalStart = adapter.startOfMonth(now);
37
+ * const fiscalEnd = adapter.endOfMonth(now);
38
+ * return { start: fiscalStart, end: fiscalEnd };
39
+ * }
40
+ * });
41
+ *
42
+ * // Use custom preset
43
+ * store.applyPreset('THIS_FISCAL_QUARTER'); // ✅ Works
44
+ * ```
45
+ *
46
+ * EXTERNAL PACKAGES:
47
+ * ```typescript
48
+ * // @acme/fiscal-presets package
49
+ * export const FISCAL_PRESETS: RangePresetPlugin[] = [
50
+ * { key: 'FISCAL_Q1', resolve: ... },
51
+ * { key: 'FISCAL_Q2', resolve: ... }
52
+ * ];
53
+ *
54
+ * // In app
55
+ * FISCAL_PRESETS.forEach(p => registry.register(p));
56
+ * ```
57
+ */
58
+ /**
59
+ * Type guard to check if object is a valid RangePresetPlugin
60
+ *
61
+ * @param obj - Object to check
62
+ * @returns true if object implements RangePresetPlugin interface
63
+ */
64
+ export function isRangePresetPlugin(obj) {
65
+ return (obj &&
66
+ typeof obj === 'object' &&
67
+ typeof obj.key === 'string' &&
68
+ typeof obj.resolve === 'function');
69
+ }
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtcHJlc2V0LnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3JhbmdlLXByZXNldC5wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0RHO0FBbUlIOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEdBQVE7SUFDMUMsT0FBTyxDQUNMLEdBQUc7UUFDSCxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDLEdBQUcsS0FBSyxRQUFRO1FBQzNCLE9BQU8sR0FBRyxDQUFDLE9BQU8sS0FBSyxVQUFVLENBQ2xDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSYW5nZSBQcmVzZXQgUGx1Z2luIFN5c3RlbVxuICogXG4gKiBWZXJzaW9uOiAzLjYuMFxuICogXG4gKiBQbHVnaW4tYmFzZWQgYXJjaGl0ZWN0dXJlIGZvciBkYXRlIHJhbmdlIHByZXNldHMgZm9sbG93aW5nIE9wZW4vQ2xvc2VkIFByaW5jaXBsZS5cbiAqIFxuICogV0hZIFRISVMgRVhJU1RTOlxuICogLSBFbnRlcnByaXNlIGFwcHMgbmVlZCBpbmR1c3RyeS1zcGVjaWZpYyBwcmVzZXRzIChmaXNjYWwsIGhvdGVsLCBsb2dpc3RpY3MpXG4gKiAtIFByZXNldHMgc2hvdWxkIGJlIGRpc3RyaWJ1dGFibGUgYXMgZXh0ZXJuYWwgcGFja2FnZXNcbiAqIC0gQ29yZSBzaG91bGQgTk9UIGtub3cgYWJvdXQgYWxsIHBvc3NpYmxlIHByZXNldHNcbiAqIC0gVXNlcnMgc2hvdWxkIGV4dGVuZCBwcmVzZXRzIHdpdGhvdXQgbW9kaWZ5aW5nIGxpYnJhcnkgY29kZVxuICogXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiBgYGBcbiAqIFJhbmdlUHJlc2V0UGx1Z2luIChpbnRlcmZhY2UpIC0gQ29udHJhY3QgZm9yIGFsbCBwcmVzZXRzXG4gKiAgICAg4oaTXG4gKiBQcmVzZXRSZWdpc3RyeSAoc2VydmljZSkgLSBNYW5hZ2VzIHBsdWdpbiByZWdpc3RyYXRpb25cbiAqICAgICDihpNcbiAqIFByZXNldEVuZ2luZSAocmVmYWN0b3JlZCkgLSBSZXNvbHZlcyBwcmVzZXRzIHZpYSByZWdpc3RyeVxuICogICAgIOKGk1xuICogRHVhbERhdGVSYW5nZVN0b3JlIC0gTm8gY2hhbmdlcywgYmFja3dhcmQgY29tcGF0aWJsZVxuICogYGBgXG4gKiBcbiAqIFVTQUdFOlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQnVpbHQtaW4gcHJlc2V0cyB3b3JrIGF1dG9tYXRpY2FsbHlcbiAqIHN0b3JlLmFwcGx5UHJlc2V0KCdMQVNUXzdfREFZUycpOyAvLyDinIUgV29ya3NcbiAqIFxuICogLy8gUmVnaXN0ZXIgY3VzdG9tIHByZXNldFxuICogY29uc3QgcmVnaXN0cnkgPSBpbmplY3QoUHJlc2V0UmVnaXN0cnkpO1xuICogcmVnaXN0cnkucmVnaXN0ZXIoe1xuICogICBrZXk6ICdUSElTX0ZJU0NBTF9RVUFSVEVSJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgY29uc3QgZmlzY2FsU3RhcnQgPSBhZGFwdGVyLnN0YXJ0T2ZNb250aChub3cpO1xuICogICAgIGNvbnN0IGZpc2NhbEVuZCA9IGFkYXB0ZXIuZW5kT2ZNb250aChub3cpO1xuICogICAgIHJldHVybiB7IHN0YXJ0OiBmaXNjYWxTdGFydCwgZW5kOiBmaXNjYWxFbmQgfTtcbiAqICAgfVxuICogfSk7XG4gKiBcbiAqIC8vIFVzZSBjdXN0b20gcHJlc2V0XG4gKiBzdG9yZS5hcHBseVByZXNldCgnVEhJU19GSVNDQUxfUVVBUlRFUicpOyAvLyDinIUgV29ya3NcbiAqIGBgYFxuICogXG4gKiBFWFRFUk5BTCBQQUNLQUdFUzpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEBhY21lL2Zpc2NhbC1wcmVzZXRzIHBhY2thZ2VcbiAqIGV4cG9ydCBjb25zdCBGSVNDQUxfUFJFU0VUUzogUmFuZ2VQcmVzZXRQbHVnaW5bXSA9IFtcbiAqICAgeyBrZXk6ICdGSVNDQUxfUTEnLCByZXNvbHZlOiAuLi4gfSxcbiAqICAgeyBrZXk6ICdGSVNDQUxfUTInLCByZXNvbHZlOiAuLi4gfVxuICogXTtcbiAqIFxuICogLy8gSW4gYXBwXG4gKiBGSVNDQUxfUFJFU0VUUy5mb3JFYWNoKHAgPT4gcmVnaXN0cnkucmVnaXN0ZXIocCkpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgRGF0ZUNsb2NrIH0gZnJvbSAnLi9kYXRlLWNsb2NrJztcbmltcG9ydCB7IERhdGVBZGFwdGVyIH0gZnJvbSAnLi9kYXRlLWFkYXB0ZXInO1xuXG4vKipcbiAqIERhdGUgcmFuZ2UgcmV0dXJuZWQgYnkgcHJlc2V0IHBsdWdpbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICAvKipcbiAgICogU3RhcnQgZGF0ZSBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSlcbiAgICovXG4gIHN0YXJ0OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBFbmQgZGF0ZSBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSlcbiAgICovXG4gIGVuZDogRGF0ZTtcbn1cblxuLyoqXG4gKiBSYW5nZSBQcmVzZXQgUGx1Z2luIEludGVyZmFjZVxuICogXG4gKiBBbGwgZGF0ZSByYW5nZSBwcmVzZXRzIChidWlsdC1pbiBvciBleHRlcm5hbCkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLlxuICogXG4gKiBERVNJR04gUFJJTkNJUExFUzpcbiAqIC0gKipEZXRlcm1pbmlzdGljKio6IEdpdmVuIHRoZSBzYW1lIGNsb2NrLm5vdygpLCBhbHdheXMgcmV0dXJucyBzYW1lIHJhbmdlXG4gKiAtICoqVGltZXpvbmUtc2FmZSoqOiBVc2VzIERhdGVBZGFwdGVyIGZvciBhbGwgZGF0ZSBvcGVyYXRpb25zXG4gKiAtICoqU1NSLWNvbXBhdGlibGUqKjogVXNlcyBEYXRlQ2xvY2sgaW5qZWN0aW9uLCBubyBnbG9iYWwgRGF0ZSgpXG4gKiAtICoqVGVzdGFibGUqKjogUHVyZSBmdW5jdGlvbiwgbm8gc2lkZSBlZmZlY3RzXG4gKiBcbiAqIEVYQU1QTEUgLSBCdWlsdC1pbiBwcmVzZXQ6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB0b2RheVByZXNldDogUmFuZ2VQcmVzZXRQbHVnaW4gPSB7XG4gKiAgIGtleTogJ1RPREFZJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gKiAgICAgcmV0dXJuIHsgc3RhcnQ6IG5vcm1hbGl6ZWQsIGVuZDogbm9ybWFsaXplZCB9O1xuICogICB9XG4gKiB9O1xuICogYGBgXG4gKiBcbiAqIEVYQU1QTEUgLSBDdXN0b20gZmlzY2FsIHByZXNldDpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpc2NhbFF1YXJ0ZXJQcmVzZXQ6IFJhbmdlUHJlc2V0UGx1Z2luID0ge1xuICogICBrZXk6ICdUSElTX0ZJU0NBTF9RVUFSVEVSJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgY29uc3QgbW9udGggPSBhZGFwdGVyLmdldE1vbnRoKG5vdyk7IC8vIDAtMTFcbiAqICAgICBcbiAqICAgICAvLyBGaXNjYWwgeWVhciBzdGFydHMgaW4gQXByaWwgKG1vbnRoIDMpXG4gKiAgICAgY29uc3QgZmlzY2FsTW9udGggPSAobW9udGggKyA5KSAlIDEyOyAvLyBPZmZzZXQgdG8gZmlzY2FsIGNhbGVuZGFyXG4gKiAgICAgY29uc3QgcXVhcnRlclN0YXJ0TW9udGggPSBNYXRoLmZsb29yKGZpc2NhbE1vbnRoIC8gMykgKiAzO1xuICogICAgIGNvbnN0IGFkanVzdGVkTW9udGggPSAocXVhcnRlclN0YXJ0TW9udGggLSA5ICsgMTIpICUgMTI7XG4gKiAgICAgXG4gKiAgICAgY29uc3QgeWVhck9mZnNldCA9IG1vbnRoIDwgMyA/IC0xIDogMDtcbiAqICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdykgKyB5ZWFyT2Zmc2V0O1xuICogICAgIFxuICogICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoeWVhciwgYWRqdXN0ZWRNb250aCwgMSk7XG4gKiAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoeWVhciwgYWRqdXN0ZWRNb250aCArIDMsIDApO1xuICogICAgIFxuICogICAgIHJldHVybiB7XG4gKiAgICAgICBzdGFydDogYWRhcHRlci5ub3JtYWxpemUoc3RhcnQpLFxuICogICAgICAgZW5kOiBhZGFwdGVyLm5vcm1hbGl6ZShlbmQpXG4gKiAgICAgfTtcbiAqICAgfVxuICogfTtcbiAqIGBgYFxuICogXG4gKiBFWEFNUExFIC0gSG90ZWwgaW5kdXN0cnkgcHJlc2V0OlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2hlY2tJbldlZWtQcmVzZXQ6IFJhbmdlUHJlc2V0UGx1Z2luID0ge1xuICogICBrZXk6ICdDSEVDS19JTl9XRUVLJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgLy8gSG90ZWwgY2hlY2staW5zIGFyZSBGcmlkYXkgdG8gRnJpZGF5XG4gKiAgICAgY29uc3QgZGF5T2ZXZWVrID0gYWRhcHRlci5nZXREYXlPZldlZWsobm93KTtcbiAqICAgICBjb25zdCBkYXlzVG9GcmlkYXkgPSBkYXlPZldlZWsgPD0gNSA/IDUgLSBkYXlPZldlZWsgOiA3IC0gZGF5T2ZXZWVrICsgNTtcbiAqICAgICBcbiAqICAgICBjb25zdCBuZXh0RnJpZGF5ID0gYWRhcHRlci5hZGREYXlzKG5vdywgZGF5c1RvRnJpZGF5KTtcbiAqICAgICBjb25zdCBmb2xsb3dpbmdGcmlkYXkgPSBhZGFwdGVyLmFkZERheXMobmV4dEZyaWRheSwgNyk7XG4gKiAgICAgXG4gKiAgICAgcmV0dXJuIHsgc3RhcnQ6IG5leHRGcmlkYXksIGVuZDogZm9sbG93aW5nRnJpZGF5IH07XG4gKiAgIH1cbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZVByZXNldFBsdWdpbiB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHByZXNldFxuICAgKiBcbiAgICogQ29udmVudGlvbjogU0NSRUFNSU5HX1NOQUtFX0NBU0VcbiAgICogXG4gICAqIEV4YW1wbGVzOlxuICAgKiAtIEJ1aWx0LWluOiAnVE9EQVknLCAnTEFTVF83X0RBWVMnLCAnVEhJU19NT05USCdcbiAgICogLSBGaXNjYWw6ICdGSVNDQUxfUTEnLCAnRklTQ0FMX1lFQVJfVE9fREFURSdcbiAgICogLSBIb3RlbDogJ0NIRUNLX0lOX1dFRUsnLCAnTkVYVF8zMF9OSUdIVFMnXG4gICAqIC0gTG9naXN0aWNzOiAnU0hJUFBJTkdfV0VFSycsICdERUxJVkVSWV9XSU5ET1cnXG4gICAqL1xuICBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgZGF0ZSByYW5nZSBmb3IgdGhpcyBwcmVzZXRcbiAgICogXG4gICAqIE1VU1QgdXNlOlxuICAgKiAtIGBjbG9jay5ub3coKWAgZm9yIGN1cnJlbnQgdGltZSAoU1NSLXNhZmUsIGRldGVybWluaXN0aWMpXG4gICAqIC0gYGFkYXB0ZXIuKmAgZm9yIGFsbCBkYXRlIG9wZXJhdGlvbnMgKHRpbWV6b25lLXNhZmUpXG4gICAqIFxuICAgKiBNVVNUIE5PVCB1c2U6XG4gICAqIC0gYG5ldyBEYXRlKClgIGRpcmVjdGx5IChicmVha3MgU1NSIGRldGVybWluaXNtKVxuICAgKiAtIGBkYXRlLnRvSVNPU3RyaW5nKClgICh0aW1lem9uZSBidWdzKVxuICAgKiAtIGBkYXRlLnNldERhdGUoKWAgKG11dGF0ZXMsIHVzZSBhZGFwdGVyLmFkZERheXMoKSBpbnN0ZWFkKVxuICAgKiBcbiAgICogQHBhcmFtIGNsb2NrIC0gSW5qZWN0ZWQgRGF0ZUNsb2NrIGZvciBTU1Itc2FmZSB0aW1lIGFjY2Vzc1xuICAgKiBAcGFyYW0gYWRhcHRlciAtIEluamVjdGVkIERhdGVBZGFwdGVyIGZvciB0aW1lem9uZS1zYWZlIG9wZXJhdGlvbnNcbiAgICogQHJldHVybnMgRGF0ZSByYW5nZSB3aXRoIHN0YXJ0IGFuZCBlbmQgZGF0ZXMgKGJvdGggaW5jbHVzaXZlKVxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZXNvbHZlOiAoY2xvY2ssIGFkYXB0ZXIpID0+IHtcbiAgICogICBjb25zdCBub3cgPSBjbG9jay5ub3coKTtcbiAgICogICBjb25zdCBzdGFydCA9IGFkYXB0ZXIuYWRkRGF5cyhub3csIC03KTtcbiAgICogICBjb25zdCBlbmQgPSBhZGFwdGVyLm5vcm1hbGl6ZShub3cpO1xuICAgKiAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHJlc29sdmUoY2xvY2s6IERhdGVDbG9jaywgYWRhcHRlcjogRGF0ZUFkYXB0ZXIpOiBEYXRlUmFuZ2U7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBvYmplY3QgaXMgYSB2YWxpZCBSYW5nZVByZXNldFBsdWdpblxuICogXG4gKiBAcGFyYW0gb2JqIC0gT2JqZWN0IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB0cnVlIGlmIG9iamVjdCBpbXBsZW1lbnRzIFJhbmdlUHJlc2V0UGx1Z2luIGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSYW5nZVByZXNldFBsdWdpbihvYmo6IGFueSk6IG9iaiBpcyBSYW5nZVByZXNldFBsdWdpbiB7XG4gIHJldHVybiAoXG4gICAgb2JqICYmXG4gICAgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2Ygb2JqLmtleSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2Ygb2JqLnJlc29sdmUgPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cbiJdfQ==