@wavemaker/app-ng-runtime 11.14.2-1.6423 → 11.14.2-2.6435

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/components/base/bundles/index.umd.js +6 -12
  2. package/components/base/esm2022/widgets/common/base/base.component.mjs +8 -14
  3. package/components/base/fesm2022/index.mjs +7 -13
  4. package/components/base/fesm2022/index.mjs.map +1 -1
  5. package/components/data/table/bundles/index.umd.js +5 -5
  6. package/components/data/table/esm2022/table.component.mjs +7 -7
  7. package/components/data/table/fesm2022/index.mjs +6 -6
  8. package/components/data/table/fesm2022/index.mjs.map +1 -1
  9. package/components/prefab/bundles/index.umd.js +0 -4
  10. package/components/prefab/esm2022/prefab.directive.mjs +1 -5
  11. package/components/prefab/fesm2022/index.mjs +0 -4
  12. package/components/prefab/fesm2022/index.mjs.map +1 -1
  13. package/core/bundles/index.umd.js +187 -330
  14. package/core/esm2022/public_api.mjs +2 -2
  15. package/core/esm2022/utils/watcher.mjs +191 -327
  16. package/core/fesm2022/index.mjs +194 -330
  17. package/core/fesm2022/index.mjs.map +1 -1
  18. package/core/public_api.d.ts +1 -1
  19. package/core/utils/watcher.d.ts +5 -26
  20. package/npm-shrinkwrap.json +2 -2
  21. package/package-lock.json +2 -2
  22. package/package.json +1 -1
  23. package/runtime/base/bundles/index.umd.js +11 -171
  24. package/runtime/base/components/app-component/app.component.d.ts +0 -4
  25. package/runtime/base/esm2022/components/app-component/app.component.mjs +9 -40
  26. package/runtime/base/esm2022/components/base-page.component.mjs +3 -35
  27. package/runtime/base/esm2022/components/base-partial.component.mjs +3 -37
  28. package/runtime/base/esm2022/components/base-prefab.component.mjs +3 -32
  29. package/runtime/base/esm2022/components/base-spa-page.component.mjs +3 -37
  30. package/runtime/base/fesm2022/index.mjs +12 -172
  31. package/runtime/base/fesm2022/index.mjs.map +1 -1
  32. package/runtime/dynamic/bundles/index.umd.js +4 -0
  33. package/runtime/dynamic/esm2022/app/app.config.mjs +6 -2
  34. package/runtime/dynamic/fesm2022/index.mjs +5 -1
  35. package/runtime/dynamic/fesm2022/index.mjs.map +1 -1
@@ -2,25 +2,14 @@ import { IDGenerator } from './id-generator';
2
2
  import { $parseExpr } from './expression-parser';
3
3
  import { findValueOf } from './utils';
4
4
  import { clone, flatten, isArray, isEqual, isObject } from "lodash-es";
5
- // Constants
6
- const WIDGET_ID_REGEX = /^(widget-[^_]+)/;
7
- const WIDGET_PROPERTY_REGEX = /^widget-[^_]+_(.+)$/;
8
- const ARRAY_INDEX_PLACEHOLDER = '[$i]';
9
- const ARRAY_INDEX_ZERO = '[0]';
10
- const DEBOUNCE_WAIT = 100;
11
- const MAX_WATCH_CYCLES = 5;
12
5
  const registry = new Map();
13
6
  const watchIdGenerator = new IDGenerator('watch-id-');
14
- export const FIRST_TIME_WATCH = Object.freeze({});
15
- // State
7
+ export const FIRST_TIME_WATCH = {};
8
+ Object.freeze(FIRST_TIME_WATCH);
9
+ export const isFirstTimeChange = v => v === FIRST_TIME_WATCH;
16
10
  let muted = false;
17
- let changedByWatch = false;
18
- let skipWatchers = false;
19
- let ngZone;
20
11
  let appRef;
21
- // Utility functions
22
- export const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
23
- export const debounce = (fn, wait = DEBOUNCE_WAIT) => {
12
+ export const debounce = (fn, wait = 50) => {
24
13
  let timeout;
25
14
  return (...args) => {
26
15
  window['__zone_symbol__clearTimeout'](timeout);
@@ -32,362 +21,232 @@ export const muteWatchers = () => {
32
21
  };
33
22
  export const unMuteWatchers = () => {
34
23
  muted = false;
35
- triggerWatchers();
36
- };
37
- /**
38
- * Extracts widget ID from identifier (e.g., "widget-id23_eventsource" -> "widget-id23")
39
- */
40
- const getWidgetId = (identifier) => {
41
- if (!identifier || typeof identifier !== 'string') {
42
- return null;
43
- }
44
- const match = identifier.match(WIDGET_ID_REGEX);
45
- return match ? match[1] : null;
24
+ $invokeWatchers(true);
46
25
  };
47
- /**
48
- * Extracts property name from identifier (e.g., "widget-id23_eventsource" -> "eventsource")
49
- */
50
- const getPropertyName = (identifier) => {
51
- if (!identifier || typeof identifier !== 'string') {
52
- return identifier;
53
- }
54
- const match = identifier.match(WIDGET_PROPERTY_REGEX);
55
- return match ? match[1] : identifier;
56
- };
57
- /**
58
- * Array consumer wrapper for array-based expressions
59
- */
60
26
  const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
61
- if (!isArray(newVal)) {
62
- return;
63
- }
64
- let formattedData = newVal.map(datum => findValueOf(datum, restExpr));
65
- // Flatten if result is array of arrays
66
- if (isArray(formattedData[0])) {
67
- formattedData = flatten(formattedData);
27
+ let data = newVal, formattedData;
28
+ if (isArray(data)) {
29
+ formattedData = data.map(function (datum) {
30
+ return findValueOf(datum, restExpr);
31
+ });
32
+ // If resulting structure is an array of array, flatten it
33
+ if (isArray(formattedData[0])) {
34
+ formattedData = flatten(formattedData);
35
+ }
36
+ listenerFn(formattedData, oldVal);
68
37
  }
69
- listenerFn(formattedData, oldVal);
70
38
  };
71
- /**
72
- * Updates watch info for array expressions
73
- */
74
- const getUpdatedWatchInfo = (expr, acceptsArray, listener) => {
75
- const regex = /\[\$i\]/g;
39
+ const getUpdatedWatcInfo = (expr, acceptsArray, listener) => {
40
+ // listener doesn't accept array
41
+ // replace all `[$i]` with `[0]` and return the expression
42
+ let regex = /\[\$i\]/g, $I = '[$i]', $0 = '[0]';
76
43
  if (!acceptsArray) {
77
44
  return {
78
- expr: expr.replace(regex, ARRAY_INDEX_ZERO),
79
- listener
45
+ 'expr': expr.replace(regex, $0),
46
+ 'listener': listener
80
47
  };
81
48
  }
82
- const lastIndex = expr.lastIndexOf(ARRAY_INDEX_PLACEHOLDER);
83
- const baseExpr = expr.substring(0, lastIndex).replace(ARRAY_INDEX_PLACEHOLDER, ARRAY_INDEX_ZERO);
84
- const restExpr = expr.substring(lastIndex + 5);
85
- const arrayConsumerFn = restExpr
86
- ? arrayConsumer.bind(undefined, listener, restExpr)
87
- : listener;
49
+ // listener accepts array
50
+ // replace all except the last `[$i]` with `[0]` and return the expression.
51
+ var index = expr.lastIndexOf($I), _expr = expr.substr(0, index).replace($I, $0), restExpr = expr.substr(index + 5), arrayConsumerFn = listener;
52
+ if (restExpr) {
53
+ arrayConsumerFn = arrayConsumer.bind(undefined, listener, restExpr);
54
+ }
88
55
  return {
89
- expr: baseExpr,
90
- listener: arrayConsumerFn
56
+ 'expr': _expr,
57
+ 'listener': arrayConsumerFn
91
58
  };
92
59
  };
93
- /**
94
- * Determines if an expression is static (doesn't need to be watched)
95
- */
96
- const STATIC_EXPRESSION_NAMES = [
97
- "row.getProperty('investment')",
98
- "row.getProperty('factsheetLink')",
99
- "row.getProperty('isRebalanceEligible')"
100
- ];
101
- const isStaticExpression = (expr) => {
102
- if (typeof expr !== 'string') {
103
- return false;
104
- }
105
- const trimmedExpr = expr.trim();
106
- // Expressions that always evaluate to localization strings
107
- // if (trimmedExpr.includes('appLocale')) {
108
- // return true;
109
- // }
110
- // Hard-coded static expression names
111
- if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
112
- return true;
113
- }
114
- return false;
115
- };
116
- /**
117
- * Gets the scope type from the scope object
118
- */
119
- const getScopeType = ($scope) => {
120
- if (!$scope) {
121
- return null;
122
- }
123
- if ($scope.pageName)
124
- return 'Page';
125
- if ($scope.prefabName)
126
- return 'Prefab';
127
- if ($scope.partialName)
128
- return 'Partial';
129
- // Check for App scope
130
- if ($scope.Variables !== undefined &&
131
- $scope.Actions !== undefined &&
132
- !$scope.pageName &&
133
- !$scope.prefabName &&
134
- !$scope.partialName) {
135
- return 'App';
136
- }
137
- if ($scope.constructor?.name === 'AppRef') {
138
- return 'App';
139
- }
140
- return null;
141
- };
142
- /**
143
- * Gets scope name based on scope type
144
- */
145
- const getScopeName = ($scope, scopeType) => {
146
- if (!scopeType || !$scope) {
147
- return null;
148
- }
149
- switch (scopeType) {
150
- case 'Prefab': return $scope.prefabName || null;
151
- case 'Partial': return $scope.partialName || null;
152
- case 'Page': return $scope.pageName || null;
153
- default: return null;
154
- }
155
- };
156
- /**
157
- * Main watch function
158
- */
159
60
  export const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.nextUid(), doNotClone = false, config = {}, isMuted) => {
160
- // Handle array expressions
161
- if (expr.includes(ARRAY_INDEX_PLACEHOLDER)) {
162
- const watchInfo = getUpdatedWatchInfo(expr, config.arrayType || config.isList || false, listener);
61
+ if (expr.indexOf('[$i]') !== -1) {
62
+ let watchInfo = getUpdatedWatcInfo(expr, config && (config.arrayType || config.isList), listener);
163
63
  expr = watchInfo.expr;
164
64
  listener = watchInfo.listener;
165
65
  }
166
- // Handle static expressions
167
- if (isStaticExpression(expr)) {
168
- try {
169
- const fn = $parseExpr(expr);
170
- const staticValue = fn($scope, $locals);
171
- listener(staticValue, FIRST_TIME_WATCH);
172
- }
173
- catch (e) {
174
- console.warn(`Error evaluating static expression '${expr}':`, e);
175
- listener(undefined, FIRST_TIME_WATCH);
176
- }
177
- return () => { }; // No-op unsubscribe
178
- }
179
66
  const fn = $parseExpr(expr);
180
- const scopeType = getScopeType($scope);
181
- const scopeName = getScopeName($scope, scopeType);
182
- const watchInfo = {
183
- fn: fn.bind(null, $scope, $locals),
67
+ registry.set(identifier, {
68
+ fn: fn.bind(expr, $scope, $locals),
184
69
  listener,
185
70
  expr,
186
71
  last: FIRST_TIME_WATCH,
187
72
  doNotClone,
188
- isMuted,
189
- scopeType,
190
- scopeName
191
- };
192
- // Store in registry
193
- const widgetId = getWidgetId(identifier);
194
- if (widgetId) {
195
- const propertyName = getPropertyName(identifier);
196
- if (!registry.has(widgetId)) {
197
- registry.set(widgetId, {});
198
- }
199
- const widgetGroup = registry.get(widgetId);
200
- widgetGroup[propertyName] = watchInfo;
201
- }
202
- else {
203
- registry.set(identifier, watchInfo);
204
- }
205
- return () => $unwatch(identifier);
206
- };
207
- /**
208
- * Unwatches a single identifier
209
- */
210
- export const $unwatch = (identifier) => {
211
- const widgetId = getWidgetId(identifier);
212
- if (widgetId) {
213
- const propertyName = getPropertyName(identifier);
214
- const widgetGroup = registry.get(widgetId);
215
- if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
216
- const watchInfo = widgetGroup[propertyName];
217
- if (watchInfo) {
218
- delete widgetGroup[propertyName];
219
- // Clean up empty widget groups
220
- if (Object.keys(widgetGroup).length === 0) {
221
- registry.delete(widgetId);
222
- }
223
- return true;
224
- }
225
- }
226
- }
227
- // Fallback to direct lookup
228
- if (registry.has(identifier)) {
229
- registry.delete(identifier);
230
- return true;
231
- }
232
- return false;
233
- };
234
- /**
235
- * Unwatches all watchers for a specific widget ID
236
- */
237
- export const $unwatchAll = (widgetId) => {
238
- if (!widgetId || typeof widgetId !== 'string') {
239
- return 0;
240
- }
241
- const widgetGroup = registry.get(widgetId);
242
- if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
243
- const count = Object.keys(widgetGroup).length;
244
- registry.delete(widgetId);
245
- return count;
246
- }
247
- // Fallback: find all identifiers starting with this widget ID
248
- let removedCount = 0;
249
- const identifiersToRemove = [];
250
- registry.forEach((_, key) => {
251
- if (key.startsWith(widgetId + '_')) {
252
- identifiersToRemove.push(key);
253
- }
254
- });
255
- identifiersToRemove.forEach(identifier => {
256
- if ($unwatch(identifier)) {
257
- removedCount++;
258
- }
73
+ isMuted: isMuted
259
74
  });
260
- return removedCount;
261
- };
262
- /**
263
- * Unwatches all watchers for a specific scope (Page, Prefab, Partial, or App)
264
- * Now works directly with the main registry instead of separate scoped registries
265
- */
266
- export const $unwatchAllByScope = (scopeType, scopeName) => {
267
- if (!scopeType) {
268
- return 0;
269
- }
270
- let removedCount = 0;
271
- const identifiersToRemove = [];
272
- registry.forEach((value, key) => {
273
- // Handle grouped structure (widget groups)
274
- if (value && typeof value === 'object' && !value.fn) {
275
- Object.entries(value).forEach(([propertyName, watchInfo]) => {
276
- if (watchInfo?.scopeType === scopeType &&
277
- (!scopeName || watchInfo.scopeName === scopeName)) {
278
- identifiersToRemove.push(`${key}_${propertyName}`);
279
- }
280
- });
281
- }
282
- else {
283
- // Direct watchInfo
284
- const watchInfo = value;
285
- if (watchInfo?.scopeType === scopeType &&
286
- (!scopeName || watchInfo.scopeName === scopeName)) {
287
- identifiersToRemove.push(key);
288
- }
289
- }
290
- });
291
- // Unwatch all collected identifiers
292
- identifiersToRemove.forEach(identifier => {
293
- if ($unwatch(identifier)) {
294
- removedCount++;
295
- }
296
- });
297
- return removedCount;
298
- };
299
- /**
300
- * Processes a single watch info during trigger cycle
301
- */
302
- const processWatchInfo = (watchInfo) => {
303
- if (!watchInfo?.fn || (watchInfo.isMuted?.() ?? false)) {
304
- return false;
305
- }
306
- let newValue;
307
- try {
308
- newValue = watchInfo.fn();
309
- }
310
- catch (e) {
311
- console.warn(`Error executing expression: '${watchInfo.expr}'`, e);
312
- return false;
313
- }
314
- if (isEqual(newValue, watchInfo.last)) {
315
- return false;
316
- }
317
- // Change detected
318
- changedByWatch = true;
319
- watchInfo.last = isObject(newValue) && !watchInfo.doNotClone
320
- ? clone(newValue)
321
- : newValue;
322
- watchInfo.listener(newValue, watchInfo.last === newValue ? FIRST_TIME_WATCH : watchInfo.last);
323
- changedByWatch = false;
324
- return true;
75
+ return () => $unwatch(identifier);
325
76
  };
326
- /**
327
- * Triggers all watchers
328
- */
329
- const triggerWatchers = (ignoreMuted = false) => {
77
+ export const $unwatch = identifier => registry.delete(identifier);
78
+ let changedByWatch = false;
79
+ const $RAF = window.requestAnimationFrame;
80
+ let ngZone;
81
+ const triggerWatchers = (ignoreMuted) => {
330
82
  if (muted && !ignoreMuted) {
331
83
  return;
332
84
  }
85
+ log(".......................triggerWatchers.................................");
86
+ const limit = 5;
333
87
  let pass = 1;
334
88
  let changeDetected;
335
89
  do {
336
90
  changeDetected = false;
337
- registry.forEach((value) => {
338
- // Handle grouped structure
339
- if (value && typeof value === 'object' && !value.fn) {
340
- Object.values(value).forEach((watchInfo) => {
341
- if (processWatchInfo(watchInfo)) {
342
- changeDetected = true;
343
- }
344
- });
91
+ registry.forEach(watchInfo => {
92
+ if (watchInfo.isMuted && watchInfo.isMuted()) {
93
+ return;
345
94
  }
346
- else {
347
- // Direct watchInfo
348
- if (processWatchInfo(value)) {
349
- changeDetected = true;
95
+ const fn = watchInfo.fn;
96
+ const listener = watchInfo.listener;
97
+ const ov = watchInfo.last;
98
+ let nv;
99
+ try {
100
+ nv = fn();
101
+ }
102
+ catch (e) {
103
+ console.warn(`error in executing expression: '${watchInfo.expr}'`);
104
+ }
105
+ if (!isEqual(nv, ov)) {
106
+ changeDetected = true;
107
+ changedByWatch = true;
108
+ watchInfo.last = nv;
109
+ // @ts-ignore
110
+ if (isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
111
+ watchInfo.last = clone(nv);
350
112
  }
113
+ listener(nv, ov);
114
+ resetChangeFromWatch();
351
115
  }
352
116
  });
353
117
  pass++;
354
- } while (changeDetected && pass < MAX_WATCH_CYCLES);
355
- if (changeDetected && pass === MAX_WATCH_CYCLES) {
356
- console.warn(`Watch cycles exceeded limit of ${MAX_WATCH_CYCLES}`);
118
+ } while (changeDetected && pass < limit);
119
+ if (changeDetected && pass === limit) {
120
+ console.warn(`Number of watch cycles gone above set limit of: ${limit} `);
357
121
  }
358
122
  };
359
- // Angular zone integration
360
- export const setNgZone = (zone) => {
361
- ngZone = zone;
362
- };
363
- export const setAppRef = (ref) => {
123
+ export const setNgZone = zone => ngZone = zone;
124
+ export const setAppRef = ref => {
364
125
  appRef = ref;
365
126
  };
366
127
  export const isChangeFromWatch = () => changedByWatch;
367
- export const resetChangeFromWatch = () => {
368
- changedByWatch = false;
369
- };
370
- // Debounced trigger
371
- const debouncedTriggerWatchers = debounce(() => {
372
- skipWatchers = true;
373
- ngZone.run(() => triggerWatchers());
374
- }, DEBOUNCE_WAIT);
128
+ export const resetChangeFromWatch = () => changedByWatch = false;
129
+ window.watchRegistry = registry;
130
+ let skipWatchers;
131
+ let scheduled = false, rerunRequested = false, isRunning = false, consecutiveReruns = 0;
132
+ const MAX_PASSES = 5, DEBOUNCE_TIME = 200, MAX_CONSECUTIVE_RERUNS = 3;
133
+ window.__WM_DEBUG_WATCHERS__ = false;
375
134
  export const $invokeWatchers = (force = false, ignoreMuted = false) => {
376
135
  if (force) {
377
136
  triggerWatchers(ignoreMuted);
378
137
  }
379
138
  else {
139
+ scheduleExecution(ignoreMuted);
140
+ }
141
+ };
142
+ function scheduleExecution(ignoreMuted) {
143
+ if (scheduled) {
144
+ rerunRequested = true;
145
+ return;
146
+ }
147
+ scheduled = true;
148
+ // Reset consecutive rerun counter when scheduling from outside
149
+ // (not from within executeWatchers rerun logic)
150
+ if (!isRunning) {
151
+ consecutiveReruns = 0;
152
+ }
153
+ debouncedExecute(ignoreMuted);
154
+ }
155
+ const debouncedExecute = debounce((ignoreMuted) => {
156
+ scheduled = false;
157
+ executeWatchers(ignoreMuted);
158
+ }, DEBOUNCE_TIME);
159
+ function executeWatchers(ignoreMuted) {
160
+ if (isRunning) {
161
+ rerunRequested = true;
162
+ return;
163
+ }
164
+ isRunning = true;
165
+ let actuallyChanged = false;
166
+ ngZone.runOutsideAngular(() => {
167
+ let pass = 1;
168
+ let changeDetected;
169
+ do {
170
+ changeDetected = false;
171
+ log(`-------executeWatchers (run #${consecutiveReruns + 1})--------- `);
172
+ registry.forEach(watchInfo => {
173
+ if (watchInfo.isMuted && watchInfo.isMuted()) {
174
+ return;
175
+ }
176
+ const fn = watchInfo.fn;
177
+ const listener = watchInfo.listener;
178
+ const ov = watchInfo.last;
179
+ let nv;
180
+ try {
181
+ nv = fn();
182
+ }
183
+ catch (e) {
184
+ console.warn(`error in executing expression: '${watchInfo.expr}'`);
185
+ }
186
+ if (!isEqual(nv, ov)) {
187
+ changeDetected = true;
188
+ actuallyChanged = true;
189
+ changedByWatch = true;
190
+ watchInfo.last = nv;
191
+ // @ts-ignore
192
+ if (isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
193
+ watchInfo.last = clone(nv);
194
+ }
195
+ listener(nv, ov);
196
+ resetChangeFromWatch();
197
+ }
198
+ });
199
+ pass++;
200
+ } while (changeDetected && pass < MAX_PASSES);
201
+ });
202
+ isRunning = false;
203
+ // Trigger Angular change detection if watchers actually changed values
204
+ if (actuallyChanged) {
205
+ ngZone.run(() => {
206
+ log(`-------DONE (changes detected)--------- `);
207
+ });
208
+ }
209
+ else {
210
+ log(`-------DONE (no changes)--------- `);
211
+ }
212
+ // 🔥 collapse ALL mid-run triggers into ONE rerun
213
+ // BUT limit consecutive reruns to prevent infinite loops
214
+ if (rerunRequested) {
215
+ rerunRequested = false;
216
+ if (consecutiveReruns < MAX_CONSECUTIVE_RERUNS) {
217
+ consecutiveReruns++;
218
+ log(`[Watcher] Scheduling rerun #${consecutiveReruns} (requested during execution)`);
219
+ scheduleExecution(ignoreMuted);
220
+ }
221
+ else {
222
+ consecutiveReruns = 0;
223
+ log(`[Watcher] ⚠️ Stopped infinite loop! Max consecutive reruns (${MAX_CONSECUTIVE_RERUNS}) reached. This usually means watcher listeners are triggering more change detection.`);
224
+ }
225
+ }
226
+ else {
227
+ // No rerun requested - reset counter
228
+ consecutiveReruns = 0;
229
+ }
230
+ }
231
+ const debouncedTriggerWatchers = debounce(() => {
232
+ skipWatchers = true;
233
+ ngZone.runOutsideAngular(() => triggerWatchers());
234
+ }, 100);
235
+ /*export const $invokeWatchers = (force?: boolean, ignoreMuted?: boolean) => {
236
+ if (force) {
237
+ triggerWatchers(ignoreMuted);
238
+ } else {
239
+
380
240
  if (skipWatchers) {
381
241
  skipWatchers = false;
382
242
  return;
383
243
  }
384
244
  debouncedTriggerWatchers();
385
245
  }
386
- };
246
+ };*/
387
247
  export const $appDigest = (() => {
388
248
  let queued = false;
389
- const $RAF = window.requestAnimationFrame;
390
- return (force = false) => {
249
+ return (force) => {
391
250
  if (!appRef) {
392
251
  return;
393
252
  }
@@ -399,14 +258,19 @@ export const $appDigest = (() => {
399
258
  if (queued) {
400
259
  return;
401
260
  }
402
- queued = true;
403
- $RAF(() => {
404
- ngZone.run(() => appRef.tick());
405
- queued = false;
406
- });
261
+ else {
262
+ queued = true;
263
+ $RAF(() => {
264
+ ngZone.run(() => appRef.tick());
265
+ queued = false;
266
+ });
267
+ }
407
268
  }
408
269
  };
409
270
  })();
410
- // Export registry for debugging
411
- window.watchRegistry = registry;
412
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXZFLFlBQVk7QUFDWixNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztBQUMxQyxNQUFNLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0FBQ3BELE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUUzQixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQXFCbEQsUUFBUTtBQUNSLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFDM0IsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLElBQUksTUFBVyxDQUFDO0FBQ2hCLElBQUksTUFBVyxDQUFDO0FBRWhCLG9CQUFvQjtBQUNwQixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FB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S0FBSyxDQUFDO1FBQ25CLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDVCxPQUFPO1lBQ1gsQ0FBQztZQUNELE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDZCxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2hDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMLGdDQUFnQztBQUMvQixNQUFjLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElER2VuZXJhdG9yIH0gZnJvbSAnLi9pZC1nZW5lcmF0b3InO1xuaW1wb3J0IHsgJHBhcnNlRXhwciB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXInO1xuaW1wb3J0IHsgZmluZFZhbHVlT2YgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGNsb25lLCBmbGF0dGVuLCBpc0FycmF5LCBpc0VxdWFsLCBpc09iamVjdCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuLy8gQ29uc3RhbnRzXG5jb25zdCBXSURHRVRfSURfUkVHRVggPSAvXih3aWRnZXQtW15fXSspLztcbmNvbnN0IFdJREdFVF9QUk9QRVJUWV9SRUdFWCA9IC9ed2lkZ2V0LVteX10rXyguKykkLztcbmNvbnN0IEFSUkFZX0lOREVYX1BMQUNFSE9MREVSID0gJ1skaV0nO1xuY29uc3QgQVJSQVlfSU5ERVhfWkVSTyA9ICdbMF0nO1xuY29uc3QgREVCT1VOQ0VfV0FJVCA9IDEwMDtcbmNvbnN0IE1BWF9XQVRDSF9DWUNMRVMgPSA1O1xuXG5jb25zdCByZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG5jb25zdCB3YXRjaElkR2VuZXJhdG9yID0gbmV3IElER2VuZXJhdG9yKCd3YXRjaC1pZC0nKTtcblxuZXhwb3J0IGNvbnN0IEZJUlNUX1RJTUVfV0FUQ0ggPSBPYmplY3QuZnJlZXplKHt9KTtcblxuLy8gVHlwZSBkZWZpbml0aW9uc1xuaW50ZXJmYWNlIFdhdGNoSW5mbyB7XG4gICAgZm46ICgpID0+IGFueTtcbiAgICBsaXN0ZW5lcjogKG5ld1ZhbDogYW55LCBvbGRWYWw6IGFueSkgPT4gdm9pZDtcbiAgICBleHByOiBzdHJpbmc7XG4gICAgbGFzdDogYW55O1xuICAgIGRvTm90Q2xvbmU6IGJvb2xlYW47XG4gICAgaXNNdXRlZD86ICgpID0+IGJvb2xlYW47XG4gICAgc2NvcGVUeXBlOiBTY29wZVR5cGUgfCBudWxsO1xuICAgIHNjb3BlTmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cblxudHlwZSBTY29wZVR5cGUgPSAnUGFnZScgfCAnUHJlZmFiJyB8ICdQYXJ0aWFsJyB8ICdBcHAnO1xuXG5pbnRlcmZhY2UgV2F0Y2hDb25maWcge1xuICAgIGFycmF5VHlwZT86IGJvb2xlYW47XG4gICAgaXNMaXN0PzogYm9vbGVhbjtcbn1cblxuLy8gU3RhdGVcbmxldCBtdXRlZCA9IGZhbHNlO1xubGV0IGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5sZXQgc2tpcFdhdGNoZXJzID0gZmFsc2U7XG5sZXQgbmdab25lOiBhbnk7XG5sZXQgYXBwUmVmOiBhbnk7XG5cbi8vIFV0aWxpdHkgZnVuY3Rpb25zXG5leHBvcnQgY29uc3QgaXNGaXJzdFRpbWVDaGFuZ2UgPSAodjogYW55KTogYm9vbGVhbiA9PiB2ID09PSBGSVJTVF9USU1FX1dBVENIO1xuXG5leHBvcnQgY29uc3QgZGVib3VuY2UgPSAoZm46IEZ1bmN0aW9uLCB3YWl0OiBudW1iZXIgPSBERUJPVU5DRV9XQUlUKSA9PiB7XG4gICAgbGV0IHRpbWVvdXQ6IGFueTtcbiAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgIHdpbmRvd1snX196b25lX3N5bWJvbF9fY2xlYXJUaW1lb3V0J10odGltZW91dCk7XG4gICAgICAgIHRpbWVvdXQgPSB3aW5kb3dbJ19fem9uZV9zeW1ib2xfX3NldFRpbWVvdXQnXSgoKSA9PiBmbiguLi5hcmdzKSwgd2FpdCk7XG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBtdXRlV2F0Y2hlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgbXV0ZWQgPSB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IHVuTXV0ZVdhdGNoZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIG11dGVkID0gZmFsc2U7XG4gICAgdHJpZ2dlcldhdGNoZXJzKCk7XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIHdpZGdldCBJRCBmcm9tIGlkZW50aWZpZXIgKGUuZy4sIFwid2lkZ2V0LWlkMjNfZXZlbnRzb3VyY2VcIiAtPiBcIndpZGdldC1pZDIzXCIpXG4gKi9cbmNvbnN0IGdldFdpZGdldElkID0gKGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgIGlmICghaWRlbnRpZmllciB8fCB0eXBlb2YgaWRlbnRpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gaWRlbnRpZmllci5tYXRjaChXSURHRVRfSURfUkVHRVgpO1xuICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogbnVsbDtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgcHJvcGVydHkgbmFtZSBmcm9tIGlkZW50aWZpZXIgKGUuZy4sIFwid2lkZ2V0LWlkMjNfZXZlbnRzb3VyY2VcIiAtPiBcImV2ZW50c291cmNlXCIpXG4gKi9cbmNvbnN0IGdldFByb3BlcnR5TmFtZSA9IChpZGVudGlmaWVyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGlmICghaWRlbnRpZmllciB8fCB0eXBlb2YgaWRlbnRpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gaWRlbnRpZmllci5tYXRjaChXSURHRVRfUFJPUEVSVFlfUkVHRVgpO1xuICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogaWRlbnRpZmllcjtcbn07XG5cbi8qKlxuICogQXJyYXkgY29uc3VtZXIgd3JhcHBlciBmb3IgYXJyYXktYmFzZWQgZXhwcmVzc2lvbnNcbiAqL1xuY29uc3QgYXJyYXlDb25zdW1lciA9IChsaXN0ZW5lckZuOiBhbnksIHJlc3RFeHByOiBzdHJpbmcsIG5ld1ZhbDogYW55LCBvbGRWYWw6IGFueSk6IHZvaWQgPT4ge1xuICAgIGlmICghaXNBcnJheShuZXdWYWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZm9ybWF0dGVkRGF0YSA9IG5ld1ZhbC5tYXAoZGF0dW0gPT4gZmluZFZhbHVlT2YoZGF0dW0sIHJlc3RFeHByKSk7XG5cbiAgICAvLyBGbGF0dGVuIGlmIHJlc3VsdCBpcyBhcnJheSBvZiBhcnJheXNcbiAgICBpZiAoaXNBcnJheShmb3JtYXR0ZWREYXRhWzBdKSkge1xuICAgICAgICBmb3JtYXR0ZWREYXRhID0gZmxhdHRlbihmb3JtYXR0ZWREYXRhKTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lckZuKGZvcm1hdHRlZERhdGEsIG9sZFZhbCk7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgd2F0Y2ggaW5mbyBmb3IgYXJyYXkgZXhwcmVzc2lvbnNcbiAqL1xuY29uc3QgZ2V0VXBkYXRlZFdhdGNoSW5mbyA9IChleHByOiBzdHJpbmcsIGFjY2VwdHNBcnJheTogYm9vbGVhbiwgbGlzdGVuZXI6IGFueSkgPT4ge1xuICAgIGNvbnN0IHJlZ2V4ID0gL1xcW1xcJGlcXF0vZztcblxuICAgIGlmICghYWNjZXB0c0FycmF5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBleHByOiBleHByLnJlcGxhY2UocmVnZXgsIEFSUkFZX0lOREVYX1pFUk8pLFxuICAgICAgICAgICAgbGlzdGVuZXJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXN0SW5kZXggPSBleHByLmxhc3RJbmRleE9mKEFSUkFZX0lOREVYX1BMQUNFSE9MREVSKTtcbiAgICBjb25zdCBiYXNlRXhwciA9IGV4cHIuc3Vic3RyaW5nKDAsIGxhc3RJbmRleCkucmVwbGFjZShBUlJBWV9JTkRFWF9QTEFDRUhPTERFUiwgQVJSQVlfSU5ERVhfWkVSTyk7XG4gICAgY29uc3QgcmVzdEV4cHIgPSBleHByLnN1YnN0cmluZyhsYXN0SW5kZXggKyA1KTtcblxuICAgIGNvbnN0IGFycmF5Q29uc3VtZXJGbiA9IHJlc3RFeHByXG4gICAgICAgID8gYXJyYXlDb25zdW1lci5iaW5kKHVuZGVmaW5lZCwgbGlzdGVuZXIsIHJlc3RFeHByKVxuICAgICAgICA6IGxpc3RlbmVyO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXhwcjogYmFzZUV4cHIsXG4gICAgICAgIGxpc3RlbmVyOiBhcnJheUNvbnN1bWVyRm5cbiAgICB9O1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGFuIGV4cHJlc3Npb24gaXMgc3RhdGljIChkb2Vzbid0IG5lZWQgdG8gYmUgd2F0Y2hlZClcbiAqL1xuY29uc3QgU1RBVElDX0VYUFJFU1NJT05fTkFNRVMgPSBbXG4gICAgXCJyb3cuZ2V0UHJvcGVydHkoJ2ludmVzdG1lbnQnKVwiLFxuICAgIFwicm93LmdldFByb3BlcnR5KCdmYWN0c2hlZXRMaW5rJylcIixcbiAgICBcInJvdy5nZXRQcm9wZXJ0eSgnaXNSZWJhbGFuY2VFbGlnaWJsZScpXCJcbl07XG5cbmNvbnN0IGlzU3RhdGljRXhwcmVzc2lvbiA9IChleHByOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICBpZiAodHlwZW9mIGV4cHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmltbWVkRXhwciA9IGV4cHIudHJpbSgpO1xuXG4gICAgLy8gRXhwcmVzc2lvbnMgdGhhdCBhbHdheXMgZXZhbHVhdGUgdG8gbG9jYWxpemF0aW9uIHN0cmluZ3NcbiAgICAvLyBpZiAodHJpbW1lZEV4cHIuaW5jbHVkZXMoJ2FwcExvY2FsZScpKSB7XG4gICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgIC8vIH1cblxuICAgIC8vIEhhcmQtY29kZWQgc3RhdGljIGV4cHJlc3Npb24gbmFtZXNcbiAgICBpZiAoU1RBVElDX0VYUFJFU1NJT05fTkFNRVMuaW5jbHVkZXModHJpbW1lZEV4cHIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgc2NvcGUgdHlwZSBmcm9tIHRoZSBzY29wZSBvYmplY3RcbiAqL1xuY29uc3QgZ2V0U2NvcGVUeXBlID0gKCRzY29wZTogYW55KTogU2NvcGVUeXBlIHwgbnVsbCA9PiB7XG4gICAgaWYgKCEkc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCRzY29wZS5wYWdlTmFtZSkgcmV0dXJuICdQYWdlJztcbiAgICBpZiAoJHNjb3BlLnByZWZhYk5hbWUpIHJldHVybiAnUHJlZmFiJztcbiAgICBpZiAoJHNjb3BlLnBhcnRpYWxOYW1lKSByZXR1cm4gJ1BhcnRpYWwnO1xuXG4gICAgLy8gQ2hlY2sgZm9yIEFwcCBzY29wZVxuICAgIGlmICgkc2NvcGUuVmFyaWFibGVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgJHNjb3BlLkFjdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhJHNjb3BlLnBhZ2VOYW1lICYmXG4gICAgICAgICEkc2NvcGUucHJlZmFiTmFtZSAmJlxuICAgICAgICAhJHNjb3BlLnBhcnRpYWxOYW1lKSB7XG4gICAgICAgIHJldHVybiAnQXBwJztcbiAgICB9XG5cbiAgICBpZiAoJHNjb3BlLmNvbnN0cnVjdG9yPy5uYW1lID09PSAnQXBwUmVmJykge1xuICAgICAgICByZXR1cm4gJ0FwcCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEdldHMgc2NvcGUgbmFtZSBiYXNlZCBvbiBzY29wZSB0eXBlXG4gKi9cbmNvbnN0IGdldFNjb3BlTmFtZSA9ICgkc2NvcGU6IGFueSwgc2NvcGVUeXBlOiBTY29wZVR5cGUgfCBudWxsKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgaWYgKCFzY29wZVR5cGUgfHwgISRzY29wZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHNjb3BlVHlwZSkge1xuICAgICAgICBjYXNlICdQcmVmYWInOiByZXR1cm4gJHNjb3BlLnByZWZhYk5hbWUgfHwgbnVsbDtcbiAgICAgICAgY2FzZSAnUGFydGlhbCc6IHJldHVybiAkc2NvcGUucGFydGlhbE5hbWUgfHwgbnVsbDtcbiAgICAgICAgY2FzZSAnUGFnZSc6IHJldHVybiAkc2NvcGUucGFnZU5hbWUgfHwgbnVsbDtcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4gICAgfVxufTtcblxuLyoqXG4gKiBNYWluIHdhdGNoIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCAkd2F0Y2ggPSAoXG4gICAgZXhwcjogc3RyaW5nLFxuICAgICRzY29wZTogYW55LFxuICAgICRsb2NhbHM6IGFueSxcbiAgICBsaXN0ZW5lcjogYW55LFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyA9IHdhdGNoSWRHZW5lcmF0b3IubmV4dFVpZCgpLFxuICAgIGRvTm90Q2xvbmU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBjb25maWc6IFdhdGNoQ29uZmlnID0ge30sXG4gICAgaXNNdXRlZD86ICgpID0+IGJvb2xlYW5cbikgPT4ge1xuICAgIC8vIEhhbmRsZSBhcnJheSBleHByZXNzaW9uc1xuICAgIGlmIChleHByLmluY2x1ZGVzKEFSUkFZX0lOREVYX1BMQUNFSE9MREVSKSkge1xuICAgICAgICBjb25zdCB3YXRjaEluZm8gPSBnZXRVcGRhdGVkV2F0Y2hJbmZvKGV4cHIsIGNvbmZpZy5hcnJheVR5cGUgfHwgY29uZmlnLmlzTGlzdCB8fCBmYWxzZSwgbGlzdGVuZXIpO1xuICAgICAgICBleHByID0gd2F0Y2hJbmZvLmV4cHI7XG4gICAgICAgIGxpc3RlbmVyID0gd2F0Y2hJbmZvLmxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzdGF0aWMgZXhwcmVzc2lvbnNcbiAgICBpZiAoaXNTdGF0aWNFeHByZXNzaW9uKGV4cHIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmbiA9ICRwYXJzZUV4cHIoZXhwcik7XG4gICAgICAgICAgICBjb25zdCBzdGF0aWNWYWx1ZSA9IGZuKCRzY29wZSwgJGxvY2Fscyk7XG4gICAgICAgICAgICBsaXN0ZW5lcihzdGF0aWNWYWx1ZSwgRklSU1RfVElNRV9XQVRDSCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRXJyb3IgZXZhbHVhdGluZyBzdGF0aWMgZXhwcmVzc2lvbiAnJHtleHByfSc6YCwgZSk7XG4gICAgICAgICAgICBsaXN0ZW5lcih1bmRlZmluZWQsIEZJUlNUX1RJTUVfV0FUQ0gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiB7IH07IC8vIE5vLW9wIHVuc3Vic2NyaWJlXG4gICAgfVxuXG4gICAgY29uc3QgZm4gPSAkcGFyc2VFeHByKGV4cHIpO1xuICAgIGNvbnN0IHNjb3BlVHlwZSA9IGdldFNjb3BlVHlwZSgkc2NvcGUpO1xuICAgIGNvbnN0IHNjb3BlTmFtZSA9IGdldFNjb3BlTmFtZSgkc2NvcGUsIHNjb3BlVHlwZSk7XG5cbiAgICBjb25zdCB3YXRjaEluZm86IFdhdGNoSW5mbyA9IHtcbiAgICAgICAgZm46IGZuLmJpbmQobnVsbCwgJHNjb3BlLCAkbG9jYWxzKSxcbiAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgIGV4cHIsXG4gICAgICAgIGxhc3Q6IEZJUlNUX1RJTUVfV0FUQ0gsXG4gICAgICAgIGRvTm90Q2xvbmUsXG4gICAgICAgIGlzTXV0ZWQsXG4gICAgICAgIHNjb3BlVHlwZSxcbiAgICAgICAgc2NvcGVOYW1lXG4gICAgfTtcblxuICAgIC8vIFN0b3JlIGluIHJlZ2lzdHJ5XG4gICAgY29uc3Qgd2lkZ2V0SWQgPSBnZXRXaWRnZXRJZChpZGVudGlmaWVyKTtcblxuICAgIGlmICh3aWRnZXRJZCkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUoaWRlbnRpZmllcik7XG4gICAgICAgIGlmICghcmVnaXN0cnkuaGFzKHdpZGdldElkKSkge1xuICAgICAgICAgICAgcmVnaXN0cnkuc2V0KHdpZGdldElkLCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2lkZ2V0R3JvdXAgPSByZWdpc3RyeS5nZXQod2lkZ2V0SWQpO1xuICAgICAgICB3aWRnZXRHcm91cFtwcm9wZXJ0eU5hbWVdID0gd2F0Y2hJbmZvO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZ2lzdHJ5LnNldChpZGVudGlmaWVyLCB3YXRjaEluZm8pO1xuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiAkdW53YXRjaChpZGVudGlmaWVyKTtcbn07XG5cbi8qKlxuICogVW53YXRjaGVzIGEgc2luZ2xlIGlkZW50aWZpZXJcbiAqL1xuZXhwb3J0IGNvbnN0ICR1bndhdGNoID0gKGlkZW50aWZpZXI6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHdpZGdldElkID0gZ2V0V2lkZ2V0SWQoaWRlbnRpZmllcik7XG5cbiAgICBpZiAod2lkZ2V0SWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlOYW1lKGlkZW50aWZpZXIpO1xuICAgICAgICBjb25zdCB3aWRnZXRHcm91cCA9IHJlZ2lzdHJ5LmdldCh3aWRnZXRJZCk7XG5cbiAgICAgICAgaWYgKHdpZGdldEdyb3VwICYmIHR5cGVvZiB3aWRnZXRHcm91cCA9PT0gJ29iamVjdCcgJiYgIXdpZGdldEdyb3VwLmZuKSB7XG4gICAgICAgICAgICBjb25zdCB3YXRjaEluZm8gPSB3aWRnZXRHcm91cFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKHdhdGNoSW5mbykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB3aWRnZXRHcm91cFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIGVtcHR5IHdpZGdldCBncm91cHNcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMod2lkZ2V0R3JvdXApLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWdpc3RyeS5kZWxldGUod2lkZ2V0SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIGRpcmVjdCBsb29rdXBcbiAgICBpZiAocmVnaXN0cnkuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgIHJlZ2lzdHJ5LmRlbGV0ZShpZGVudGlmaWVyKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBVbndhdGNoZXMgYWxsIHdhdGNoZXJzIGZvciBhIHNwZWNpZmljIHdpZGdldCBJRFxuICovXG5leHBvcnQgY29uc3QgJHVud2F0Y2hBbGwgPSAod2lkZ2V0SWQ6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gICAgaWYgKCF3aWRnZXRJZCB8fCB0eXBlb2Ygd2lkZ2V0SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZGdldEdyb3VwID0gcmVnaXN0cnkuZ2V0KHdpZGdldElkKTtcblxuICAgIGlmICh3aWRnZXRHcm91cCAmJiB0eXBlb2Ygd2lkZ2V0R3JvdXAgPT09ICdvYmplY3QnICYmICF3aWRnZXRHcm91cC5mbikge1xuICAgICAgICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKHdpZGdldEdyb3VwKS5sZW5ndGg7XG4gICAgICAgIHJlZ2lzdHJ5LmRlbGV0ZSh3aWRnZXRJZCk7XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogZmluZCBhbGwgaWRlbnRpZmllcnMgc3RhcnRpbmcgd2l0aCB0aGlzIHdpZGdldCBJRFxuICAgIGxldCByZW1vdmVkQ291bnQgPSAwO1xuICAgIGNvbnN0IGlkZW50aWZpZXJzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XG5cbiAgICByZWdpc3RyeS5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHdpZGdldElkICsgJ18nKSkge1xuICAgICAgICAgICAgaWRlbnRpZmllcnNUb1JlbW92ZS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlkZW50aWZpZXJzVG9SZW1vdmUuZm9yRWFjaChpZGVudGlmaWVyID0+IHtcbiAgICAgICAgaWYgKCR1bndhdGNoKGlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlbW92ZWRDb3VudDtcbn07XG5cbi8qKlxuICogVW53YXRjaGVzIGFsbCB3YXRjaGVycyBmb3IgYSBzcGVjaWZpYyBzY29wZSAoUGFnZSwgUHJlZmFiLCBQYXJ0aWFsLCBvciBBcHApXG4gKiBOb3cgd29ya3MgZGlyZWN0bHkgd2l0aCB0aGUgbWFpbiByZWdpc3RyeSBpbnN0ZWFkIG9mIHNlcGFyYXRlIHNjb3BlZCByZWdpc3RyaWVzXG4gKi9cbmV4cG9ydCBjb25zdCAkdW53YXRjaEFsbEJ5U2NvcGUgPSAoc2NvcGVUeXBlOiBTY29wZVR5cGUsIHNjb3BlTmFtZT86IHN0cmluZyk6IG51bWJlciA9PiB7XG4gICAgaWYgKCFzY29wZVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgbGV0IHJlbW92ZWRDb3VudCA9IDA7XG4gICAgY29uc3QgaWRlbnRpZmllcnNUb1JlbW92ZTogc3RyaW5nW10gPSBbXTtcblxuICAgIHJlZ2lzdHJ5LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgLy8gSGFuZGxlIGdyb3VwZWQgc3RydWN0dXJlICh3aWRnZXQgZ3JvdXBzKVxuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhdmFsdWUuZm4pIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChbcHJvcGVydHlOYW1lLCB3YXRjaEluZm9dOiBbc3RyaW5nLCBhbnldKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHdhdGNoSW5mbz8uc2NvcGVUeXBlID09PSBzY29wZVR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFzY29wZU5hbWUgfHwgd2F0Y2hJbmZvLnNjb3BlTmFtZSA9PT0gc2NvcGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLnB1c2goYCR7a2V5fV8ke3Byb3BlcnR5TmFtZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERpcmVjdCB3YXRjaEluZm9cbiAgICAgICAgICAgIGNvbnN0IHdhdGNoSW5mbyA9IHZhbHVlIGFzIFdhdGNoSW5mbztcbiAgICAgICAgICAgIGlmICh3YXRjaEluZm8/LnNjb3BlVHlwZSA9PT0gc2NvcGVUeXBlICYmXG4gICAgICAgICAgICAgICAgKCFzY29wZU5hbWUgfHwgd2F0Y2hJbmZvLnNjb3BlTmFtZSA9PT0gc2NvcGVOYW1lKSkge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJzVG9SZW1vdmUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVbndhdGNoIGFsbCBjb2xsZWN0ZWQgaWRlbnRpZmllcnNcbiAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLmZvckVhY2goaWRlbnRpZmllciA9PiB7XG4gICAgICAgIGlmICgkdW53YXRjaChpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZW1vdmVkQ291bnQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBhIHNpbmdsZSB3YXRjaCBpbmZvIGR1cmluZyB0cmlnZ2VyIGN5Y2xlXG4gKi9cbmNvbnN0IHByb2Nlc3NXYXRjaEluZm8gPSAod2F0Y2hJbmZvOiBXYXRjaEluZm8pOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXdhdGNoSW5mbz8uZm4gfHwgKHdhdGNoSW5mby5pc011dGVkPy4oKSA/PyBmYWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBuZXdWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICAgIG5ld1ZhbHVlID0gd2F0Y2hJbmZvLmZuKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYEVycm9yIGV4ZWN1dGluZyBleHByZXNzaW9uOiAnJHt3YXRjaEluZm8uZXhwcn0nYCwgZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoaXNFcXVhbChuZXdWYWx1ZSwgd2F0Y2hJbmZvLmxhc3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgZGV0ZWN0ZWRcbiAgICBjaGFuZ2VkQnlXYXRjaCA9IHRydWU7XG4gICAgd2F0Y2hJbmZvLmxhc3QgPSBpc09iamVjdChuZXdWYWx1ZSkgJiYgIXdhdGNoSW5mby5kb05vdENsb25lXG4gICAgICAgID8gY2xvbmUobmV3VmFsdWUpXG4gICAgICAgIDogbmV3VmFsdWU7XG5cbiAgICB3YXRjaEluZm8ubGlzdGVuZXIobmV3VmFsdWUsIHdhdGNoSW5mby5sYXN0ID09PSBuZXdWYWx1ZSA/IEZJUlNUX1RJTUVfV0FUQ0ggOiB3YXRjaEluZm8ubGFzdCk7XG4gICAgY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VycyBhbGwgd2F0Y2hlcnNcbiAqL1xuY29uc3QgdHJpZ2dlcldhdGNoZXJzID0gKGlnbm9yZU11dGVkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkID0+IHtcbiAgICBpZiAobXV0ZWQgJiYgIWlnbm9yZU11dGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcGFzcyA9IDE7XG4gICAgbGV0IGNoYW5nZURldGVjdGVkOiBib29sZWFuO1xuXG4gICAgZG8ge1xuICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIHJlZ2lzdHJ5LmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgZ3JvdXBlZCBzdHJ1Y3R1cmVcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICF2YWx1ZS5mbikge1xuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXModmFsdWUpLmZvckVhY2goKHdhdGNoSW5mbzogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzV2F0Y2hJbmZvKHdhdGNoSW5mbykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3Qgd2F0Y2hJbmZvXG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NXYXRjaEluZm8odmFsdWUgYXMgV2F0Y2hJbmZvKSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBwYXNzKys7XG4gICAgfSB3aGlsZSAoY2hhbmdlRGV0ZWN0ZWQgJiYgcGFzcyA8IE1BWF9XQVRDSF9DWUNMRVMpO1xuXG4gICAgaWYgKGNoYW5nZURldGVjdGVkICYmIHBhc3MgPT09IE1BWF9XQVRDSF9DWUNMRVMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBXYXRjaCBjeWNsZXMgZXhjZWVkZWQgbGltaXQgb2YgJHtNQVhfV0FUQ0hfQ1lDTEVTfWApO1xuICAgIH1cbn07XG5cbi8vIEFuZ3VsYXIgem9uZSBpbnRlZ3JhdGlvblxuZXhwb3J0IGNvbnN0IHNldE5nWm9uZSA9ICh6b25lOiBhbnkpOiB2b2lkID0+IHtcbiAgICBuZ1pvbmUgPSB6b25lO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEFwcFJlZiA9IChyZWY6IGFueSk6IHZvaWQgPT4ge1xuICAgIGFwcFJlZiA9IHJlZjtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0NoYW5nZUZyb21XYXRjaCA9ICgpOiBib29sZWFuID0+IGNoYW5nZWRCeVdhdGNoO1xuZXhwb3J0IGNvbnN0IHJlc2V0Q2hhbmdlRnJvbVdhdGNoID0gKCk6IHZvaWQgPT4ge1xuICAgIGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG59O1xuXG4vLyBEZWJvdW5jZWQgdHJpZ2dlclxuY29uc3QgZGVib3VuY2VkVHJpZ2dlcldhdGNoZXJzID0gZGVib3VuY2UoKCkgPT4ge1xuICAgIHNraXBXYXRjaGVycyA9IHRydWU7XG4gICAgbmdab25lLnJ1bigoKSA9PiB0cmlnZ2VyV2F0Y2hlcnMoKSk7XG59LCBERUJPVU5DRV9XQUlUKTtcblxuZXhwb3J0IGNvbnN0ICRpbnZva2VXYXRjaGVycyA9IChmb3JjZTogYm9vbGVhbiA9IGZhbHNlLCBpZ25vcmVNdXRlZDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICAgIHRyaWdnZXJXYXRjaGVycyhpZ25vcmVNdXRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNraXBXYXRjaGVycykge1xuICAgICAgICAgICAgc2tpcFdhdGNoZXJzID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGVib3VuY2VkVHJpZ2dlcldhdGNoZXJzKCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0ICRhcHBEaWdlc3QgPSAoKCkgPT4ge1xuICAgIGxldCBxdWV1ZWQgPSBmYWxzZTtcbiAgICBjb25zdCAkUkFGID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTtcblxuICAgIHJldHVybiAoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIWFwcFJlZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICBuZ1pvbmUucnVuKCgpID0+IGFwcFJlZi50aWNrKCkpO1xuICAgICAgICAgICAgcXVldWVkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocXVldWVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVldWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICRSQUYoKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICAgICAgcXVldWVkID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG4vLyBFeHBvcnQgcmVnaXN0cnkgZm9yIGRlYnVnZ2luZ1xuKHdpbmRvdyBhcyBhbnkpLndhdGNoUmVnaXN0cnkgPSByZWdpc3RyeTsiXX0=
271
+ function log(message) {
272
+ if (window.__WM_DEBUG_WATCHERS__) {
273
+ console.log(message);
274
+ }
275
+ }
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRXJFLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7QUFFeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV0RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDO0FBRTdELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLE1BQU0sQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQVksRUFBRSxPQUFlLEVBQUUsRUFBRSxFQUFFO0lBQ3hELElBQUksT0FBTyxDQUFDO0lBQ1osT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxPQUFPLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVB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QztZQUNKLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsT0FBTztZQUNYLENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNkLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDaEMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFFTCxTQUFTLEdBQUcsQ0FBQyxPQUFlO0lBQ3hCLElBQUssTUFBYyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QixDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElER2VuZXJhdG9yIH0gZnJvbSAnLi9pZC1nZW5lcmF0b3InO1xuXG5pbXBvcnQgeyAkcGFyc2VFeHByIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlcic7XG5pbXBvcnQgeyBmaW5kVmFsdWVPZiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtjbG9uZSwgZmxhdHRlbiwgaXNBcnJheSwgaXNFcXVhbCwgaXNPYmplY3R9IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuY29uc3QgcmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuXG5jb25zdCB3YXRjaElkR2VuZXJhdG9yID0gbmV3IElER2VuZXJhdG9yKCd3YXRjaC1pZC0nKTtcblxuZXhwb3J0IGNvbnN0IEZJUlNUX1RJTUVfV0FUQ0ggPSB7fTtcblxuT2JqZWN0LmZyZWV6ZShGSVJTVF9USU1FX1dBVENIKTtcblxuZXhwb3J0IGNvbnN0IGlzRmlyc3RUaW1lQ2hhbmdlID0gdiA9PiB2ID09PSBGSVJTVF9USU1FX1dBVENIO1xuXG5sZXQgbXV0ZWQgPSBmYWxzZTtcbmxldCBhcHBSZWY7XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IChmbjogRnVuY3Rpb24sIHdhaXQ6IG51bWJlciA9IDUwKSA9PiB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgIHdpbmRvd1snX196b25lX3N5bWJvbF9fY2xlYXJUaW1lb3V0J10odGltZW91dCk7XG4gICAgICAgIHRpbWVvdXQgPSB3aW5kb3dbJ19fem9uZV9zeW1ib2xfX3NldFRpbWVvdXQnXSgoKSA9PiBmbiguLi5hcmdzKSwgd2FpdCk7XG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBtdXRlV2F0Y2hlcnMgPSAoKSA9PiB7XG4gICAgbXV0ZWQgPSB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IHVuTXV0ZVdhdGNoZXJzID0gKCkgPT4ge1xuICAgIG11dGVkID0gZmFsc2U7XG4gICAgJGludm9rZVdhdGNoZXJzKHRydWUpO1xufTtcblxuY29uc3QgYXJyYXlDb25zdW1lciA9IChsaXN0ZW5lckZuLCByZXN0RXhwciwgbmV3VmFsLCBvbGRWYWwpID0+IHtcbiAgICBsZXQgZGF0YSA9IG5ld1ZhbCxcbiAgICAgICAgZm9ybWF0dGVkRGF0YTtcblxuICAgIGlmIChpc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIGZvcm1hdHRlZERhdGEgPSBkYXRhLm1hcChmdW5jdGlvbiAoZGF0dW0pIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5kVmFsdWVPZihkYXR1bSwgcmVzdEV4cHIpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiByZXN1bHRpbmcgc3RydWN0dXJlIGlzIGFuIGFycmF5IG9mIGFycmF5LCBmbGF0dGVuIGl0XG4gICAgICAgIGlmIChpc0FycmF5KGZvcm1hdHRlZERhdGFbMF0pKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWREYXRhID0gZmxhdHRlbihmb3JtYXR0ZWREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3RlbmVyRm4oZm9ybWF0dGVkRGF0YSwgb2xkVmFsKTtcbiAgICB9XG59O1xuXG5jb25zdCBnZXRVcGRhdGVkV2F0Y0luZm8gPSAoZXhwciwgYWNjZXB0c0FycmF5LCBsaXN0ZW5lcikgPT4ge1xuICAgIC8vIGxpc3RlbmVyIGRvZXNuJ3QgYWNjZXB0IGFycmF5XG4gICAgLy8gcmVwbGFjZSBhbGwgYFskaV1gIHdpdGggYFswXWAgYW5kIHJldHVybiB0aGUgZXhwcmVzc2lvblxuICAgIGxldCByZWdleCA9IC9cXFtcXCRpXFxdL2csXG4gICAgICAgICRJICAgICAgICAgICAgICAgID0gJ1skaV0nLFxuICAgICAgICAkMCAgICAgICAgICAgICAgICA9ICdbMF0nO1xuICAgIGlmICghYWNjZXB0c0FycmF5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnZXhwcicgICAgIDogZXhwci5yZXBsYWNlKHJlZ2V4LCAkMCksXG4gICAgICAgICAgICAnbGlzdGVuZXInIDogbGlzdGVuZXJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBsaXN0ZW5lciBhY2NlcHRzIGFycmF5XG4gICAgLy8gcmVwbGFjZSBhbGwgZXhjZXB0IHRoZSBsYXN0IGBbJGldYCB3aXRoIGBbMF1gIGFuZCByZXR1cm4gdGhlIGV4cHJlc3Npb24uXG4gICAgdmFyIGluZGV4ICAgICAgICAgICA9IGV4cHIubGFzdEluZGV4T2YoJEkpLFxuICAgICAgICBfZXhwciAgICAgICAgICAgPSBleHByLnN1YnN0cigwLCBpbmRleCkucmVwbGFjZSgkSSwgJDApLFxuICAgICAgICByZXN0RXhwciAgICAgICAgPSBleHByLnN1YnN0cihpbmRleCArIDUpLFxuICAgICAgICBhcnJheUNvbnN1bWVyRm4gPSBsaXN0ZW5lcjtcblxuICAgIGlmIChyZXN0RXhwcikge1xuICAgICAgICBhcnJheUNvbnN1bWVyRm4gPSBhcnJheUNvbnN1bWVyLmJpbmQodW5kZWZpbmVkLCBsaXN0ZW5lciwgcmVzdEV4cHIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgICdleHByJyAgICAgOiBfZXhwcixcbiAgICAgICAgJ2xpc3RlbmVyJyA6IGFycmF5Q29uc3VtZXJGblxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgJHdhdGNoID0gKGV4cHIsICRzY29wZSwgJGxvY2FscywgbGlzdGVuZXIsIGlkZW50aWZpZXIgPSB3YXRjaElkR2VuZXJhdG9yLm5leHRVaWQoKSwgZG9Ob3RDbG9uZSA9IGZhbHNlLCBjb25maWc6YW55PXt9LCBpc011dGVkPzogKCkgPT4gYm9vbGVhbikgPT4ge1xuICAgIGlmIChleHByLmluZGV4T2YoJ1skaV0nKSAhPT0gLTEpIHtcbiAgICAgICAgbGV0IHdhdGNoSW5mbyA9IGdldFVwZGF0ZWRXYXRjSW5mbyhleHByLCBjb25maWcgJiYgKGNvbmZpZy5hcnJheVR5cGUgfHwgY29uZmlnLmlzTGlzdCksIGxpc3RlbmVyKTtcbiAgICAgICAgZXhwciA9IHdhdGNoSW5mby5leHByO1xuICAgICAgICBsaXN0ZW5lciA9IHdhdGNoSW5mby5saXN0ZW5lcjtcbiAgICB9XG4gICAgY29uc3QgZm4gPSAkcGFyc2VFeHByKGV4cHIpO1xuXG4gICAgcmVnaXN0cnkuc2V0KGlkZW50aWZpZXIsIHtcbiAgICAgICAgZm46IGZuLmJpbmQoZXhwciwgJHNjb3BlLCAkbG9jYWxzKSxcbiAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgIGV4cHIsXG4gICAgICAgIGxhc3Q6IEZJUlNUX1RJTUVfV0FUQ0gsXG4gICAgICAgIGRvTm90Q2xvbmUsXG4gICAgICAgIGlzTXV0ZWQ6IGlzTXV0ZWRcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiAkdW53YXRjaChpZGVudGlmaWVyKTtcbn07XG5cbmV4cG9ydCBjb25zdCAkdW53YXRjaCA9IGlkZW50aWZpZXIgPT4gcmVnaXN0cnkuZGVsZXRlKGlkZW50aWZpZXIpO1xuXG5sZXQgY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcblxuY29uc3QgJFJBRiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbmxldCBuZ1pvbmU7XG5cbmNvbnN0IHRyaWdnZXJXYXRjaGVycyA9IChpZ25vcmVNdXRlZD86IGJvb2xlYW4pID0+IHtcblxuICAgIGlmIChtdXRlZCAmJiAhaWdub3JlTXV0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2coXCIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLnRyaWdnZXJXYXRjaGVycy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlwiKTtcbiAgICBjb25zdCBsaW1pdCA9IDU7XG4gICAgbGV0IHBhc3MgPSAxO1xuICAgIGxldCBjaGFuZ2VEZXRlY3RlZDtcblxuICAgIGRvIHtcbiAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmVnaXN0cnkuZm9yRWFjaCh3YXRjaEluZm8gPT4ge1xuICAgICAgICAgICAgaWYod2F0Y2hJbmZvLmlzTXV0ZWQgJiYgd2F0Y2hJbmZvLmlzTXV0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZuID0gd2F0Y2hJbmZvLmZuO1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgICAgICAgICBjb25zdCBvdiA9IHdhdGNoSW5mby5sYXN0O1xuICAgICAgICAgICAgbGV0IG52O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG52ID0gZm4oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYGVycm9yIGluIGV4ZWN1dGluZyBleHByZXNzaW9uOiAnJHt3YXRjaEluZm8uZXhwcn0nYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXNFcXVhbChudiwgb3YpKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNoYW5nZWRCeVdhdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3YXRjaEluZm8ubGFzdCA9IG52O1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChudikgJiYgIXdhdGNoSW5mby5kb05vdENsb25lICYmIG52Ll9fY2xvbmVhYmxlX18gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhdGNoSW5mby5sYXN0ID0gY2xvbmUobnYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaXN0ZW5lcihudiwgb3YpO1xuICAgICAgICAgICAgICAgIHJlc2V0Q2hhbmdlRnJvbVdhdGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBwYXNzKys7XG5cbiAgICB9IHdoaWxlIChjaGFuZ2VEZXRlY3RlZCAmJiBwYXNzIDwgbGltaXQpO1xuXG4gICAgaWYgKGNoYW5nZURldGVjdGVkICYmIHBhc3MgPT09IGxpbWl0KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgTnVtYmVyIG9mIHdhdGNoIGN5Y2xlcyBnb25lIGFib3ZlIHNldCBsaW1pdCBvZjogJHtsaW1pdH0gYCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldE5nWm9uZSA9IHpvbmUgPT4gbmdab25lID0gem9uZTtcblxuZXhwb3J0IGNvbnN0IHNldEFwcFJlZiA9IHJlZiA9PiB7XG4gICAgYXBwUmVmID0gcmVmXG59O1xuXG5leHBvcnQgY29uc3QgaXNDaGFuZ2VGcm9tV2F0Y2ggPSAoKSA9PiBjaGFuZ2VkQnlXYXRjaDtcbmV4cG9ydCBjb25zdCByZXNldENoYW5nZUZyb21XYXRjaCA9ICgpID0+IGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5cbig8YW55PndpbmRvdykud2F0Y2hSZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuXG5sZXQgc2tpcFdhdGNoZXJzO1xuXG5sZXQgc2NoZWR1bGVkID0gZmFsc2UsXG4gICAgcmVydW5SZXF1ZXN0ZWQgPSBmYWxzZSxcbiAgICBpc1J1bm5pbmcgPSBmYWxzZSxcbiAgICBjb25zZWN1dGl2ZVJlcnVucyA9IDA7XG5cbmNvbnN0IE1BWF9QQVNTRVMgPSA1LFxuICAgIERFQk9VTkNFX1RJTUUgPSAyMDAsXG4gICAgTUFYX0NPTlNFQ1VUSVZFX1JFUlVOUyA9IDM7XG5cbih3aW5kb3cgYXMgYW55KS5fX1dNX0RFQlVHX1dBVENIRVJTX18gPSBmYWxzZTtcblxuZXhwb3J0IGNvbnN0ICRpbnZva2VXYXRjaGVycyA9IChcbiAgICBmb3JjZSA9IGZhbHNlLFxuICAgIGlnbm9yZU11dGVkID0gZmFsc2Vcbik6IHZvaWQgPT4ge1xuICAgIGlmIChmb3JjZSkge1xuICAgICAgICB0cmlnZ2VyV2F0Y2hlcnMoaWdub3JlTXV0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVkdWxlRXhlY3V0aW9uKGlnbm9yZU11dGVkKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBzY2hlZHVsZUV4ZWN1dGlvbihpZ25vcmVNdXRlZDogYm9vbGVhbikge1xuICAgIGlmIChzY2hlZHVsZWQpIHtcbiAgICAgICAgcmVydW5SZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2NoZWR1bGVkID0gdHJ1ZTtcblxuICAgIC8vIFJlc2V0IGNvbnNlY3V0aXZlIHJlcnVuIGNvdW50ZXIgd2hlbiBzY2hlZHVsaW5nIGZyb20gb3V0c2lkZVxuICAgIC8vIChub3QgZnJvbSB3aXRoaW4gZXhlY3V0ZVdhdGNoZXJzIHJlcnVuIGxvZ2ljKVxuICAgIGlmICghaXNSdW5uaW5nKSB7XG4gICAgICAgIGNvbnNlY3V0aXZlUmVydW5zID0gMDtcbiAgICB9XG5cbiAgICBkZWJvdW5jZWRFeGVjdXRlKGlnbm9yZU11dGVkKTtcbn1cblxuY29uc3QgZGVib3VuY2VkRXhlY3V0ZSA9IGRlYm91bmNlKChpZ25vcmVNdXRlZDogYm9vbGVhbikgPT4ge1xuICAgIHNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGV4ZWN1dGVXYXRjaGVycyhpZ25vcmVNdXRlZCk7XG59LCBERUJPVU5DRV9USU1FKTtcblxuZnVuY3Rpb24gZXhlY3V0ZVdhdGNoZXJzKGlnbm9yZU11dGVkOiBib29sZWFuKSB7XG4gICAgaWYgKGlzUnVubmluZykge1xuICAgICAgICByZXJ1blJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpc1J1bm5pbmcgPSB0cnVlO1xuXG4gICAgbGV0IGFjdHVhbGx5Q2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgbGV0IHBhc3MgPSAxO1xuICAgICAgICBsZXQgY2hhbmdlRGV0ZWN0ZWQ6IGJvb2xlYW47XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxvZyhgLS0tLS0tLWV4ZWN1dGVXYXRjaGVycyAocnVuICMke2NvbnNlY3V0aXZlUmVydW5zICsgMX0pLS0tLS0tLS0tIGApO1xuXG4gICAgICAgICAgICByZWdpc3RyeS5mb3JFYWNoKHdhdGNoSW5mbyA9PiB7XG4gICAgICAgICAgICAgICAgaWYod2F0Y2hJbmZvLmlzTXV0ZWQgJiYgd2F0Y2hJbmZvLmlzTXV0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gd2F0Y2hJbmZvLmZuO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gd2F0Y2hJbmZvLmxpc3RlbmVyO1xuICAgICAgICAgICAgICAgIGNvbnN0IG92ID0gd2F0Y2hJbmZvLmxhc3Q7XG4gICAgICAgICAgICAgICAgbGV0IG52O1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbnYgPSBmbigpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBlcnJvciBpbiBleGVjdXRpbmcgZXhwcmVzc2lvbjogJyR7d2F0Y2hJbmZvLmV4cHJ9J2ApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghaXNFcXVhbChudiwgb3YpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHlDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZEJ5V2F0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB3YXRjaEluZm8ubGFzdCA9IG52O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG52KSAmJiAhd2F0Y2hJbmZvLmRvTm90Q2xvbmUgJiYgbnYuX19jbG9uZWFibGVfXyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoSW5mby5sYXN0ID0gY2xvbmUobnYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKG52LCBvdik7XG4gICAgICAgICAgICAgICAgICAgIHJlc2V0Q2hhbmdlRnJvbVdhdGNoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHBhc3MrKztcbiAgICAgICAgfSB3aGlsZSAoY2hhbmdlRGV0ZWN0ZWQgJiYgcGFzcyA8IE1BWF9QQVNTRVMpO1xuICAgIH0pO1xuXG4gICAgaXNSdW5uaW5nID0gZmFsc2U7XG5cbiAgICAvLyBUcmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBpZiB3YXRjaGVycyBhY3R1YWxseSBjaGFuZ2VkIHZhbHVlc1xuICAgIGlmIChhY3R1YWxseUNoYW5nZWQpIHtcbiAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBsb2coYC0tLS0tLS1ET05FIChjaGFuZ2VzIGRldGVjdGVkKS0tLS0tLS0tLSBgKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKGAtLS0tLS0tRE9ORSAobm8gY2hhbmdlcyktLS0tLS0tLS0gYCk7XG4gICAgfVxuXG4gICAgLy8g8J+UpSBjb2xsYXBzZSBBTEwgbWlkLXJ1biB0cmlnZ2VycyBpbnRvIE9ORSByZXJ1blxuICAgIC8vIEJVVCBsaW1pdCBjb25zZWN1dGl2ZSByZXJ1bnMgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wc1xuICAgIGlmIChyZXJ1blJlcXVlc3RlZCkge1xuICAgICAgICByZXJ1blJlcXVlc3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChjb25zZWN1dGl2ZVJlcnVucyA8IE1BWF9DT05TRUNVVElWRV9SRVJVTlMpIHtcbiAgICAgICAgICAgIGNvbnNlY3V0aXZlUmVydW5zKys7XG4gICAgICAgICAgICBsb2coYFtXYXRjaGVyXSBTY2hlZHVsaW5nIHJlcnVuICMke2NvbnNlY3V0aXZlUmVydW5zfSAocmVxdWVzdGVkIGR1cmluZyBleGVjdXRpb24pYCk7XG4gICAgICAgICAgICBzY2hlZHVsZUV4ZWN1dGlvbihpZ25vcmVNdXRlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zZWN1dGl2ZVJlcnVucyA9IDA7XG4gICAgICAgICAgICBsb2coYFtXYXRjaGVyXSDimqDvuI8gU3RvcHBlZCBpbmZpbml0ZSBsb29wISBNYXggY29uc2VjdXRpdmUgcmVydW5zICgke01BWF9DT05TRUNVVElWRV9SRVJVTlN9KSByZWFjaGVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgd2F0Y2hlciBsaXN0ZW5lcnMgYXJlIHRyaWdnZXJpbmcgbW9yZSBjaGFuZ2UgZGV0ZWN0aW9uLmApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gcmVydW4gcmVxdWVzdGVkIC0gcmVzZXQgY291bnRlclxuICAgICAgICBjb25zZWN1dGl2ZVJlcnVucyA9IDA7XG4gICAgfVxufVxuXG5jb25zdCBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgc2tpcFdhdGNoZXJzID0gdHJ1ZTtcbiAgICBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdHJpZ2dlcldhdGNoZXJzKCkpO1xufSwgMTAwKTtcblxuLypleHBvcnQgY29uc3QgJGludm9rZVdhdGNoZXJzID0gKGZvcmNlPzogYm9vbGVhbiwgaWdub3JlTXV0ZWQ/OiBib29sZWFuKSA9PiB7XG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICAgIHRyaWdnZXJXYXRjaGVycyhpZ25vcmVNdXRlZCk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgICBpZiAoc2tpcFdhdGNoZXJzKSB7XG4gICAgICAgICAgICBza2lwV2F0Y2hlcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMoKTtcbiAgICB9XG59OyovXG5cbmV4cG9ydCBjb25zdCAkYXBwRGlnZXN0ID0gKCgpID0+IHtcbiAgICBsZXQgcXVldWVkID0gZmFsc2U7XG4gICAgcmV0dXJuIChmb3JjZT86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFhcHBSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICBxdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgJFJBRigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5cbmZ1bmN0aW9uIGxvZyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fV01fREVCVUdfV0FUQ0hFUlNfXykge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICB9XG59XG4iXX0=