@wavemaker/app-ng-runtime 11.14.1-8.6337 → 11.14.1-9.6343
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/base/bundles/index.umd.js +8 -77
- package/components/base/esm2022/pipes/custom-pipes.mjs +1 -1
- package/components/base/esm2022/widgets/common/base/base.component.mjs +7 -67
- package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +3 -7
- package/components/base/esm2022/widgets/framework/property-change-handler.mjs +2 -7
- package/components/base/fesm2022/index.mjs +9 -78
- package/components/base/fesm2022/index.mjs.map +1 -1
- package/components/basic/label/bundles/index.umd.js +1 -9
- package/components/basic/label/esm2022/label.directive.mjs +2 -10
- package/components/basic/label/fesm2022/index.mjs +1 -9
- package/components/basic/label/fesm2022/index.mjs.map +1 -1
- package/components/data/pagination/bundles/index.umd.js +0 -4
- package/components/data/pagination/esm2022/pagination.component.mjs +1 -5
- package/components/data/pagination/fesm2022/index.mjs +0 -4
- package/components/data/pagination/fesm2022/index.mjs.map +1 -1
- package/components/data/table/bundles/index.umd.js +12 -219
- package/components/data/table/esm2022/table-cud.directive.mjs +2 -2
- package/components/data/table/esm2022/table.component.mjs +12 -219
- package/components/data/table/fesm2022/index.mjs +12 -219
- package/components/data/table/fesm2022/index.mjs.map +1 -1
- package/components/data/table/table.component.d.ts +2 -6
- package/components/navigation/menu/bundles/index.umd.js +0 -5
- package/components/navigation/menu/esm2022/menu.component.mjs +1 -6
- package/components/navigation/menu/fesm2022/index.mjs +0 -5
- package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
- package/components/navigation/popover/bundles/index.umd.js +6 -6
- package/components/navigation/popover/esm2022/popover.component.mjs +4 -4
- package/components/navigation/popover/fesm2022/index.mjs +3 -3
- package/components/navigation/popover/fesm2022/index.mjs.map +1 -1
- package/components/navigation/popover/popover.component.d.ts +0 -6
- package/core/bundles/index.umd.js +82 -395
- package/core/esm2022/public_api.mjs +2 -2
- package/core/esm2022/utils/watcher.mjs +81 -392
- package/core/fesm2022/index.mjs +84 -395
- package/core/fesm2022/index.mjs.map +1 -1
- package/core/public_api.d.ts +1 -1
- package/core/utils/watcher.d.ts +5 -28
- package/npm-shrinkwrap.json +2 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/runtime/base/bundles/index.umd.js +0 -20
- package/runtime/base/esm2022/components/app-component/app.component.mjs +2 -4
- package/runtime/base/esm2022/components/base-page.component.mjs +2 -6
- package/runtime/base/esm2022/components/base-partial.component.mjs +2 -7
- package/runtime/base/esm2022/components/base-prefab.component.mjs +2 -7
- package/runtime/base/esm2022/components/base-spa-page.component.mjs +2 -6
- package/runtime/base/fesm2022/index.mjs +1 -21
- package/runtime/base/fesm2022/index.mjs.map +1 -1
- package/scripts/datatable/datatable.js +2 -34
|
@@ -2,89 +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 =
|
|
15
|
-
|
|
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
|
-
|
|
22
|
-
* CLEANUP SCHEDULER WITH:
|
|
23
|
-
* - Significant watcher delta trigger (+/-)
|
|
24
|
-
* - UI stabilization delay (1–2 seconds)
|
|
25
|
-
* - Cooldown to prevent repeated scheduling
|
|
26
|
-
********************************************************************/
|
|
27
|
-
const CLEANUP_TRIGGER_DELTA = 300; // watcher change threshold
|
|
28
|
-
const CLEANUP_DELAY = 1500; // delay before running cleanup
|
|
29
|
-
const CLEANUP_COOLDOWN = 4000; // prevent re-scheduling for 4s
|
|
30
|
-
let lastWatcherCount = 0;
|
|
31
|
-
let scheduledCleanup = null;
|
|
32
|
-
let lastScheduledTime = 0;
|
|
33
|
-
function getWatcherCount() {
|
|
34
|
-
let count = 0;
|
|
35
|
-
registry.forEach(bucket => count += bucket.size);
|
|
36
|
-
return count;
|
|
37
|
-
}
|
|
38
|
-
export const cleanupStaleWatchers = () => {
|
|
39
|
-
// console.log(".........Cleaning up stale watchers...registry.size....", registry.size);
|
|
40
|
-
let removed = 0;
|
|
41
|
-
registry.forEach((bucket, widgetId) => {
|
|
42
|
-
if (!document.querySelector(`[widget-id="${widgetId}"]`)) {
|
|
43
|
-
for (const key in bucket) {
|
|
44
|
-
if (bucket.hasOwnProperty(key) && key !== "scopeType" && key !== "scopeName" && typeof bucket[key] !== "function") {
|
|
45
|
-
let watchInfo = bucket[key];
|
|
46
|
-
if (watchInfo && watchInfo.destroyFn) {
|
|
47
|
-
watchInfo.destroyFn();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
removed++;
|
|
52
|
-
registry.delete(widgetId);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
return removed;
|
|
57
|
-
};
|
|
58
|
-
export const scheduleThresholdCleanup = () => {
|
|
59
|
-
const now = performance.now();
|
|
60
|
-
let lastTriggerPeriod = now - lastScheduledTime;
|
|
61
|
-
// If a cleanup was scheduled recently, skip scheduling
|
|
62
|
-
if (lastTriggerPeriod < CLEANUP_COOLDOWN) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
const current = getWatcherCount();
|
|
66
|
-
const delta = Math.abs(current - lastWatcherCount); // significant + or -
|
|
67
|
-
// If change not large enough, skip scheduling
|
|
68
|
-
if (delta <= CLEANUP_TRIGGER_DELTA) {
|
|
69
|
-
lastWatcherCount = current;
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
// Prevent re-scheduling: set timestamp early
|
|
73
|
-
lastScheduledTime = now;
|
|
74
|
-
// Clear previous scheduled cleanup (if any)
|
|
75
|
-
if (scheduledCleanup) {
|
|
76
|
-
clearTimeout(scheduledCleanup);
|
|
77
|
-
}
|
|
78
|
-
// Schedule cleanup after UI stabilizes (delay prevents aggressive cleanup)
|
|
79
|
-
scheduledCleanup = setTimeout(() => {
|
|
80
|
-
cleanupStaleWatchers();
|
|
81
|
-
scheduledCleanup = null;
|
|
82
|
-
}, CLEANUP_DELAY);
|
|
83
|
-
lastWatcherCount = current;
|
|
84
|
-
};
|
|
85
|
-
// Utility functions
|
|
86
|
-
export const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
|
|
87
|
-
export const debounce = (fn, wait = DEBOUNCE_WAIT) => {
|
|
12
|
+
export const debounce = (fn, wait = 50) => {
|
|
88
13
|
let timeout;
|
|
89
14
|
return (...args) => {
|
|
90
15
|
window['__zone_symbol__clearTimeout'](timeout);
|
|
@@ -98,350 +23,115 @@ export const unMuteWatchers = () => {
|
|
|
98
23
|
muted = false;
|
|
99
24
|
triggerWatchers();
|
|
100
25
|
};
|
|
101
|
-
/**
|
|
102
|
-
* Extracts widget ID from identifier (e.g., "widget-id23_eventsource" -> "widget-id23")
|
|
103
|
-
*/
|
|
104
|
-
const getWidgetId = (identifier) => {
|
|
105
|
-
if (!identifier || typeof identifier !== 'string') {
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
const match = identifier.match(WIDGET_ID_REGEX);
|
|
109
|
-
return match ? match[1] : null;
|
|
110
|
-
};
|
|
111
|
-
/**
|
|
112
|
-
* Extracts property name from identifier (e.g., "widget-id23_eventsource" -> "eventsource")
|
|
113
|
-
*/
|
|
114
|
-
const getPropertyName = (identifier) => {
|
|
115
|
-
if (!identifier || typeof identifier !== 'string') {
|
|
116
|
-
return identifier;
|
|
117
|
-
}
|
|
118
|
-
const match = identifier.match(WIDGET_PROPERTY_REGEX);
|
|
119
|
-
return match ? match[1] : identifier;
|
|
120
|
-
};
|
|
121
|
-
/**
|
|
122
|
-
* Array consumer wrapper for array-based expressions
|
|
123
|
-
*/
|
|
124
26
|
const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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);
|
|
132
37
|
}
|
|
133
|
-
listenerFn(formattedData, oldVal);
|
|
134
38
|
};
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
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]';
|
|
140
43
|
if (!acceptsArray) {
|
|
141
44
|
return {
|
|
142
|
-
expr: expr.replace(regex,
|
|
143
|
-
listener
|
|
45
|
+
'expr': expr.replace(regex, $0),
|
|
46
|
+
'listener': listener
|
|
144
47
|
};
|
|
145
48
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
+
}
|
|
152
55
|
return {
|
|
153
|
-
expr:
|
|
154
|
-
listener: arrayConsumerFn
|
|
56
|
+
'expr': _expr,
|
|
57
|
+
'listener': arrayConsumerFn
|
|
155
58
|
};
|
|
156
59
|
};
|
|
157
|
-
/**
|
|
158
|
-
* Determines if an expression is static (doesn't need to be watched)
|
|
159
|
-
*/
|
|
160
|
-
const STATIC_EXPRESSION_NAMES = [
|
|
161
|
-
"row.getProperty('investment')",
|
|
162
|
-
"row.getProperty('factsheetLink')",
|
|
163
|
-
"row.getProperty('isRebalanceEligible')"
|
|
164
|
-
];
|
|
165
|
-
const isStaticExpression = (expr) => {
|
|
166
|
-
if (typeof expr !== 'string') {
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
const trimmedExpr = expr.trim();
|
|
170
|
-
// Expressions that always evaluate to localization strings
|
|
171
|
-
// if (trimmedExpr.includes('appLocale')) {
|
|
172
|
-
// return true;
|
|
173
|
-
// }
|
|
174
|
-
// Hard-coded static expression names
|
|
175
|
-
if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
return false;
|
|
179
|
-
};
|
|
180
|
-
/**
|
|
181
|
-
* Gets the scope type from the scope object
|
|
182
|
-
*/
|
|
183
|
-
const getScopeType = ($scope) => {
|
|
184
|
-
if (!$scope) {
|
|
185
|
-
return null;
|
|
186
|
-
}
|
|
187
|
-
if ($scope.pageName)
|
|
188
|
-
return 'Page';
|
|
189
|
-
if ($scope.prefabName)
|
|
190
|
-
return 'Prefab';
|
|
191
|
-
if ($scope.partialName)
|
|
192
|
-
return 'Partial';
|
|
193
|
-
// Check for App scope
|
|
194
|
-
if ($scope.Variables !== undefined &&
|
|
195
|
-
$scope.Actions !== undefined &&
|
|
196
|
-
!$scope.pageName &&
|
|
197
|
-
!$scope.prefabName &&
|
|
198
|
-
!$scope.partialName) {
|
|
199
|
-
return 'App';
|
|
200
|
-
}
|
|
201
|
-
if ($scope.constructor?.name === 'AppRef') {
|
|
202
|
-
return 'App';
|
|
203
|
-
}
|
|
204
|
-
return null;
|
|
205
|
-
};
|
|
206
|
-
/**
|
|
207
|
-
* Gets scope name based on scope type
|
|
208
|
-
*/
|
|
209
|
-
const getScopeName = ($scope, scopeType) => {
|
|
210
|
-
if (!scopeType || !$scope) {
|
|
211
|
-
return null;
|
|
212
|
-
}
|
|
213
|
-
switch (scopeType) {
|
|
214
|
-
case 'Prefab': return $scope.prefabName || null;
|
|
215
|
-
case 'Partial': return $scope.partialName || null;
|
|
216
|
-
case 'Page': return $scope.pageName || null;
|
|
217
|
-
default: return null;
|
|
218
|
-
}
|
|
219
|
-
};
|
|
220
|
-
/**
|
|
221
|
-
* Main watch function
|
|
222
|
-
*/
|
|
223
60
|
export const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.nextUid(), doNotClone = false, config = {}, isMuted) => {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
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);
|
|
227
63
|
expr = watchInfo.expr;
|
|
228
64
|
listener = watchInfo.listener;
|
|
229
65
|
}
|
|
230
|
-
// Handle static expressions
|
|
231
|
-
if (isStaticExpression(expr)) {
|
|
232
|
-
try {
|
|
233
|
-
const fn = $parseExpr(expr);
|
|
234
|
-
const staticValue = fn($scope, $locals);
|
|
235
|
-
listener(staticValue, FIRST_TIME_WATCH);
|
|
236
|
-
}
|
|
237
|
-
catch (e) {
|
|
238
|
-
console.warn(`Error evaluating static expression '${expr}':`, e);
|
|
239
|
-
listener(undefined, FIRST_TIME_WATCH);
|
|
240
|
-
}
|
|
241
|
-
return () => { }; // No-op unsubscribe
|
|
242
|
-
}
|
|
243
66
|
const fn = $parseExpr(expr);
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
const destroyFn = () => $unwatch(identifier);
|
|
247
|
-
const watchInfo = {
|
|
248
|
-
fn: fn.bind(null, $scope, $locals),
|
|
67
|
+
registry.set(identifier, {
|
|
68
|
+
fn: fn.bind(expr, $scope, $locals),
|
|
249
69
|
listener,
|
|
250
70
|
expr,
|
|
251
71
|
last: FIRST_TIME_WATCH,
|
|
252
72
|
doNotClone,
|
|
253
|
-
isMuted
|
|
254
|
-
scopeType,
|
|
255
|
-
scopeName,
|
|
256
|
-
destroyFn
|
|
257
|
-
};
|
|
258
|
-
// Store in registry
|
|
259
|
-
const widgetId = getWidgetId(identifier);
|
|
260
|
-
if (widgetId) {
|
|
261
|
-
const propertyName = getPropertyName(identifier);
|
|
262
|
-
if (!registry.has(widgetId)) {
|
|
263
|
-
registry.set(widgetId, {});
|
|
264
|
-
}
|
|
265
|
-
const widgetGroup = registry.get(widgetId);
|
|
266
|
-
widgetGroup[propertyName] = watchInfo;
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
registry.set(identifier, watchInfo);
|
|
270
|
-
}
|
|
271
|
-
return destroyFn;
|
|
272
|
-
};
|
|
273
|
-
/**
|
|
274
|
-
* Unwatches a single identifier
|
|
275
|
-
*/
|
|
276
|
-
export const $unwatch = (identifier) => {
|
|
277
|
-
const widgetId = getWidgetId(identifier);
|
|
278
|
-
if (widgetId) {
|
|
279
|
-
const propertyName = getPropertyName(identifier);
|
|
280
|
-
const widgetGroup = registry.get(widgetId);
|
|
281
|
-
//@ts-ignore
|
|
282
|
-
if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
|
|
283
|
-
const watchInfo = widgetGroup[propertyName];
|
|
284
|
-
if (watchInfo) {
|
|
285
|
-
delete widgetGroup[propertyName];
|
|
286
|
-
// Clean up empty widget groups
|
|
287
|
-
if (Object.keys(widgetGroup).length === 0) {
|
|
288
|
-
registry.delete(widgetId);
|
|
289
|
-
}
|
|
290
|
-
return true;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
// Fallback to direct lookup
|
|
295
|
-
if (registry.has(identifier)) {
|
|
296
|
-
registry.delete(identifier);
|
|
297
|
-
return true;
|
|
298
|
-
}
|
|
299
|
-
return false;
|
|
300
|
-
};
|
|
301
|
-
/**
|
|
302
|
-
* Unwatches all watchers for a specific widget ID
|
|
303
|
-
*/
|
|
304
|
-
export const $unwatchAll = (widgetId) => {
|
|
305
|
-
if (!widgetId || typeof widgetId !== 'string') {
|
|
306
|
-
return 0;
|
|
307
|
-
}
|
|
308
|
-
const widgetGroup = registry.get(widgetId);
|
|
309
|
-
if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
|
|
310
|
-
const count = Object.keys(widgetGroup).length;
|
|
311
|
-
registry.delete(widgetId);
|
|
312
|
-
return count;
|
|
313
|
-
}
|
|
314
|
-
// Fallback: find all identifiers starting with this widget ID
|
|
315
|
-
let removedCount = 0;
|
|
316
|
-
const identifiersToRemove = [];
|
|
317
|
-
registry.forEach((_, key) => {
|
|
318
|
-
if (key.startsWith(widgetId + '_')) {
|
|
319
|
-
identifiersToRemove.push(key);
|
|
320
|
-
}
|
|
73
|
+
isMuted: isMuted
|
|
321
74
|
});
|
|
322
|
-
|
|
323
|
-
if ($unwatch(identifier)) {
|
|
324
|
-
removedCount++;
|
|
325
|
-
}
|
|
326
|
-
});
|
|
327
|
-
return removedCount;
|
|
75
|
+
return () => $unwatch(identifier);
|
|
328
76
|
};
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
if (!scopeType) {
|
|
335
|
-
return 0;
|
|
336
|
-
}
|
|
337
|
-
let removedCount = 0;
|
|
338
|
-
const identifiersToRemove = [];
|
|
339
|
-
registry.forEach((value, key) => {
|
|
340
|
-
// Handle grouped structure (widget groups)
|
|
341
|
-
if (value && typeof value === 'object' && !value.fn) {
|
|
342
|
-
Object.entries(value).forEach(([propertyName, watchInfo]) => {
|
|
343
|
-
if (watchInfo?.scopeType === scopeType &&
|
|
344
|
-
(!scopeName || watchInfo.scopeName === scopeName)) {
|
|
345
|
-
identifiersToRemove.push(`${key}_${propertyName}`);
|
|
346
|
-
}
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
else {
|
|
350
|
-
// Direct watchInfo
|
|
351
|
-
const watchInfo = value;
|
|
352
|
-
if (watchInfo?.scopeType === scopeType &&
|
|
353
|
-
(!scopeName || watchInfo.scopeName === scopeName)) {
|
|
354
|
-
identifiersToRemove.push(key);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
// Unwatch all collected identifiers
|
|
359
|
-
identifiersToRemove.forEach(identifier => {
|
|
360
|
-
if ($unwatch(identifier)) {
|
|
361
|
-
removedCount++;
|
|
362
|
-
}
|
|
363
|
-
});
|
|
364
|
-
return removedCount;
|
|
365
|
-
};
|
|
366
|
-
/**
|
|
367
|
-
* Processes a single watch info during trigger cycle
|
|
368
|
-
*/
|
|
369
|
-
const processWatchInfo = (watchInfo) => {
|
|
370
|
-
if (!watchInfo?.fn || (watchInfo.isMuted?.() ?? false)) {
|
|
371
|
-
return false;
|
|
372
|
-
}
|
|
373
|
-
let newValue;
|
|
374
|
-
try {
|
|
375
|
-
newValue = watchInfo.fn();
|
|
376
|
-
}
|
|
377
|
-
catch (e) {
|
|
378
|
-
console.warn(`Error executing expression: '${watchInfo.expr}'`, e);
|
|
379
|
-
return false;
|
|
380
|
-
}
|
|
381
|
-
if (isEqual(newValue, watchInfo.last)) {
|
|
382
|
-
return false;
|
|
383
|
-
}
|
|
384
|
-
// Change detected
|
|
385
|
-
changedByWatch = true;
|
|
386
|
-
watchInfo.last = isObject(newValue) && !watchInfo.doNotClone
|
|
387
|
-
? clone(newValue)
|
|
388
|
-
: newValue;
|
|
389
|
-
watchInfo.listener(newValue, watchInfo.last === newValue ? FIRST_TIME_WATCH : watchInfo.last);
|
|
390
|
-
changedByWatch = false;
|
|
391
|
-
return true;
|
|
392
|
-
};
|
|
393
|
-
/**
|
|
394
|
-
* Triggers all watchers
|
|
395
|
-
*/
|
|
396
|
-
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) => {
|
|
397
82
|
if (muted && !ignoreMuted) {
|
|
398
83
|
return;
|
|
399
84
|
}
|
|
85
|
+
const limit = 5;
|
|
400
86
|
let pass = 1;
|
|
401
87
|
let changeDetected;
|
|
402
88
|
do {
|
|
403
89
|
changeDetected = false;
|
|
404
|
-
registry.forEach(
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
Object.values(value).forEach((watchInfo) => {
|
|
408
|
-
if (processWatchInfo(watchInfo)) {
|
|
409
|
-
changeDetected = true;
|
|
410
|
-
}
|
|
411
|
-
});
|
|
90
|
+
registry.forEach(watchInfo => {
|
|
91
|
+
if (watchInfo.isMuted && watchInfo.isMuted()) {
|
|
92
|
+
return;
|
|
412
93
|
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
94
|
+
const fn = watchInfo.fn;
|
|
95
|
+
const listener = watchInfo.listener;
|
|
96
|
+
const ov = watchInfo.last;
|
|
97
|
+
let nv;
|
|
98
|
+
try {
|
|
99
|
+
nv = fn();
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
console.warn(`error in executing expression: '${watchInfo.expr}'`);
|
|
103
|
+
}
|
|
104
|
+
if (!isEqual(nv, ov)) {
|
|
105
|
+
changeDetected = true;
|
|
106
|
+
changedByWatch = true;
|
|
107
|
+
watchInfo.last = nv;
|
|
108
|
+
// @ts-ignore
|
|
109
|
+
if (isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
|
|
110
|
+
watchInfo.last = clone(nv);
|
|
417
111
|
}
|
|
112
|
+
listener(nv, ov);
|
|
113
|
+
resetChangeFromWatch();
|
|
418
114
|
}
|
|
419
115
|
});
|
|
420
116
|
pass++;
|
|
421
|
-
} while (changeDetected && pass <
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
if (changeDetected && pass === MAX_WATCH_CYCLES) {
|
|
425
|
-
console.warn(`Watch cycles exceeded limit of ${MAX_WATCH_CYCLES}`);
|
|
117
|
+
} while (changeDetected && pass < limit);
|
|
118
|
+
if (changeDetected && pass === limit) {
|
|
119
|
+
console.warn(`Number of watch cycles gone above set limit of: ${limit} `);
|
|
426
120
|
}
|
|
427
121
|
};
|
|
428
|
-
|
|
429
|
-
export const
|
|
430
|
-
ngZone = zone;
|
|
431
|
-
};
|
|
432
|
-
export const setAppRef = (ref) => {
|
|
122
|
+
export const setNgZone = zone => ngZone = zone;
|
|
123
|
+
export const setAppRef = ref => {
|
|
433
124
|
appRef = ref;
|
|
434
125
|
};
|
|
435
126
|
export const isChangeFromWatch = () => changedByWatch;
|
|
436
|
-
export const resetChangeFromWatch = () =>
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
// Debounced trigger
|
|
127
|
+
export const resetChangeFromWatch = () => changedByWatch = false;
|
|
128
|
+
window.watchRegistry = registry;
|
|
129
|
+
let skipWatchers;
|
|
440
130
|
const debouncedTriggerWatchers = debounce(() => {
|
|
441
131
|
skipWatchers = true;
|
|
442
132
|
ngZone.run(() => triggerWatchers());
|
|
443
|
-
},
|
|
444
|
-
export const $invokeWatchers = (force
|
|
133
|
+
}, 100);
|
|
134
|
+
export const $invokeWatchers = (force, ignoreMuted) => {
|
|
445
135
|
if (force) {
|
|
446
136
|
triggerWatchers(ignoreMuted);
|
|
447
137
|
}
|
|
@@ -455,8 +145,7 @@ export const $invokeWatchers = (force = false, ignoreMuted = false) => {
|
|
|
455
145
|
};
|
|
456
146
|
export const $appDigest = (() => {
|
|
457
147
|
let queued = false;
|
|
458
|
-
|
|
459
|
-
return (force = false) => {
|
|
148
|
+
return (force) => {
|
|
460
149
|
if (!appRef) {
|
|
461
150
|
return;
|
|
462
151
|
}
|
|
@@ -468,14 +157,14 @@ export const $appDigest = (() => {
|
|
|
468
157
|
if (queued) {
|
|
469
158
|
return;
|
|
470
159
|
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
160
|
+
else {
|
|
161
|
+
queued = true;
|
|
162
|
+
$RAF(() => {
|
|
163
|
+
ngZone.run(() => appRef.tick());
|
|
164
|
+
queued = false;
|
|
165
|
+
});
|
|
166
|
+
}
|
|
476
167
|
}
|
|
477
168
|
};
|
|
478
169
|
})();
|
|
479
|
-
// Export registry for debugging
|
|
480
|
-
window.watchRegistry = registry;
|
|
481
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXZFLFlBQVk7QUFDWixNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztBQUMxQyxNQUFNLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0FBQ3BELE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUUzQixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQXNCbEQsUUFBUTtBQUNSLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFDM0IsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLElBQUksTUFBVyxDQUFDO0FBQ2hCLElBQUksTUFBVyxDQUFDO0FBRWhCOzs7OztzRUFLc0U7QUFDdEUsTUFBTSxxQkFBcUIsR0FBRyxHQUFH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QUUsQ0FBQztZQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDaEMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsT0FBTztZQUNYLENBQUM7WUFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFFTCxnQ0FBZ0M7QUFDL0IsTUFBYyxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJREdlbmVyYXRvciB9IGZyb20gJy4vaWQtZ2VuZXJhdG9yJztcbmltcG9ydCB7ICRwYXJzZUV4cHIgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyJztcbmltcG9ydCB7IGZpbmRWYWx1ZU9mIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBjbG9uZSwgZmxhdHRlbiwgaXNBcnJheSwgaXNFcXVhbCwgaXNPYmplY3QgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5cbi8vIENvbnN0YW50c1xuY29uc3QgV0lER0VUX0lEX1JFR0VYID0gL14od2lkZ2V0LVteX10rKS87XG5jb25zdCBXSURHRVRfUFJPUEVSVFlfUkVHRVggPSAvXndpZGdldC1bXl9dK18oLispJC87XG5jb25zdCBBUlJBWV9JTkRFWF9QTEFDRUhPTERFUiA9ICdbJGldJztcbmNvbnN0IEFSUkFZX0lOREVYX1pFUk8gPSAnWzBdJztcbmNvbnN0IERFQk9VTkNFX1dBSVQgPSAxMDA7XG5jb25zdCBNQVhfV0FUQ0hfQ1lDTEVTID0gNTtcblxuY29uc3QgcmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuY29uc3Qgd2F0Y2hJZEdlbmVyYXRvciA9IG5ldyBJREdlbmVyYXRvcignd2F0Y2gtaWQtJyk7XG5cbmV4cG9ydCBjb25zdCBGSVJTVF9USU1FX1dBVENIID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG5cbi8vIFR5cGUgZGVmaW5pdGlvbnNcbmludGVyZmFjZSBXYXRjaEluZm8ge1xuICAgIGZuOiAoKSA9PiBhbnk7XG4gICAgbGlzdGVuZXI6IChuZXdWYWw6IGFueSwgb2xkVmFsOiBhbnkpID0+IHZvaWQ7XG4gICAgZXhwcjogc3RyaW5nO1xuICAgIGxhc3Q6IGFueTtcbiAgICBkb05vdENsb25lOiBib29sZWFuO1xuICAgIGlzTXV0ZWQ/OiAoKSA9PiBib29sZWFuO1xuICAgIHNjb3BlVHlwZTogU2NvcGVUeXBlIHwgbnVsbDtcbiAgICBzY29wZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgZGVzdHJveUZuPzogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBTY29wZVR5cGUgPSAnUGFnZScgfCAnUHJlZmFiJyB8ICdQYXJ0aWFsJyB8ICdBcHAnO1xuXG5pbnRlcmZhY2UgV2F0Y2hDb25maWcge1xuICAgIGFycmF5VHlwZT86IGJvb2xlYW47XG4gICAgaXNMaXN0PzogYm9vbGVhbjtcbn1cblxuLy8gU3RhdGVcbmxldCBtdXRlZCA9IGZhbHNlO1xubGV0IGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5sZXQgc2tpcFdhdGNoZXJzID0gZmFsc2U7XG5sZXQgbmdab25lOiBhbnk7XG5sZXQgYXBwUmVmOiBhbnk7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ0xFQU5VUCBTQ0hFRFVMRVIgV0lUSDpcbiAqICAtIFNpZ25pZmljYW50IHdhdGNoZXIgZGVsdGEgdHJpZ2dlciAoKy8tKVxuICogIC0gVUkgc3RhYmlsaXphdGlvbiBkZWxheSAoMeKAkzIgc2Vjb25kcylcbiAqICAtIENvb2xkb3duIHRvIHByZXZlbnQgcmVwZWF0ZWQgc2NoZWR1bGluZ1xuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuY29uc3QgQ0xFQU5VUF9UUklHR0VSX0RFTFRBID0gMzAwOyAgIC8vIHdhdGNoZXIgY2hhbmdlIHRocmVzaG9sZFxuY29uc3QgQ0xFQU5VUF9ERUxBWSA9IDE1MDA7ICAgICAgICAgIC8vIGRlbGF5IGJlZm9yZSBydW5uaW5nIGNsZWFudXBcbmNvbnN0IENMRUFOVVBfQ09PTERPV04gPSA0MDAwOyAgICAgICAvLyBwcmV2ZW50IHJlLXNjaGVkdWxpbmcgZm9yIDRzXG5cbmxldCBsYXN0V2F0Y2hlckNvdW50ID0gMDtcbmxldCBzY2hlZHVsZWRDbGVhbnVwOiBhbnkgPSBudWxsO1xubGV0IGxhc3RTY2hlZHVsZWRUaW1lID0gMDtcblxuZnVuY3Rpb24gZ2V0V2F0Y2hlckNvdW50KCk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICByZWdpc3RyeS5mb3JFYWNoKGJ1Y2tldCA9PiBjb3VudCArPSBidWNrZXQuc2l6ZSk7XG4gICAgcmV0dXJuIGNvdW50O1xufVxuXG5leHBvcnQgY29uc3QgY2xlYW51cFN0YWxlV2F0Y2hlcnMgPSAoKTogbnVtYmVyID0+IHtcbiAgICAvLyBjb25zb2xlLmxvZyhcIi4uLi4uLi4uLkNsZWFuaW5nIHVwIHN0YWxlIHdhdGNoZXJzLi4ucmVnaXN0cnkuc2l6ZS4uLi5cIiwgcmVnaXN0cnkuc2l6ZSk7XG4gICAgbGV0IHJlbW92ZWQgPSAwO1xuXG4gICAgcmVnaXN0cnkuZm9yRWFjaCgoYnVja2V0LCB3aWRnZXRJZCkgPT4ge1xuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFt3aWRnZXQtaWQ9XCIke3dpZGdldElkfVwiXWApKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBidWNrZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnVja2V0Lmhhc093blByb3BlcnR5KGtleSkgJiYga2V5ICE9PSBcInNjb3BlVHlwZVwiICYmIGtleSAhPT0gXCJzY29wZU5hbWVcIiAmJiB0eXBlb2YgYnVja2V0W2tleV0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2F0Y2hJbmZvID0gYnVja2V0W2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YXRjaEluZm8gJiYgd2F0Y2hJbmZvLmRlc3Ryb3lGbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hJbmZvLmRlc3Ryb3lGbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVtb3ZlZCsrO1xuICAgICAgICAgICAgcmVnaXN0cnkuZGVsZXRlKHdpZGdldElkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZW1vdmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IHNjaGVkdWxlVGhyZXNob2xkQ2xlYW51cCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBsZXQgbGFzdFRyaWdnZXJQZXJpb2QgPSBub3cgLSBsYXN0U2NoZWR1bGVkVGltZTtcbiAgICAvLyBJZiBhIGNsZWFudXAgd2FzIHNjaGVkdWxlZCByZWNlbnRseSwgc2tpcCBzY2hlZHVsaW5nXG4gICAgaWYgKGxhc3RUcmlnZ2VyUGVyaW9kIDwgQ0xFQU5VUF9DT09MRE9XTikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IGdldFdhdGNoZXJDb3VudCgpO1xuICAgIGNvbnN0IGRlbHRhID0gTWF0aC5hYnMoY3VycmVudCAtIGxhc3RXYXRjaGVyQ291bnQpOyAgLy8gc2lnbmlmaWNhbnQgKyBvciAtXG5cbiAgICAvLyBJZiBjaGFuZ2Ugbm90IGxhcmdlIGVub3VnaCwgc2tpcCBzY2hlZHVsaW5nXG4gICAgaWYgKGRlbHRhIDw9IENMRUFOVVBfVFJJR0dFUl9ERUxUQSkge1xuICAgICAgICBsYXN0V2F0Y2hlckNvdW50ID0gY3VycmVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgcmUtc2NoZWR1bGluZzogc2V0IHRpbWVzdGFtcCBlYXJseVxuICAgIGxhc3RTY2hlZHVsZWRUaW1lID0gbm93O1xuXG4gICAgLy8gQ2xlYXIgcHJldmlvdXMgc2NoZWR1bGVkIGNsZWFudXAgKGlmIGFueSlcbiAgICBpZiAoc2NoZWR1bGVkQ2xlYW51cCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoc2NoZWR1bGVkQ2xlYW51cCk7XG4gICAgfVxuXG4gICAgLy8gU2NoZWR1bGUgY2xlYW51cCBhZnRlciBVSSBzdGFiaWxpemVzIChkZWxheSBwcmV2ZW50cyBhZ2dyZXNzaXZlIGNsZWFudXApXG4gICAgc2NoZWR1bGVkQ2xlYW51cCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjbGVhbnVwU3RhbGVXYXRjaGVycygpO1xuICAgICAgICBzY2hlZHVsZWRDbGVhbnVwID0gbnVsbDtcbiAgICB9LCBDTEVBTlVQX0RFTEFZKTtcblxuICAgIGxhc3RXYXRjaGVyQ291bnQgPSBjdXJyZW50O1xufTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbnNcbmV4cG9ydCBjb25zdCBpc0ZpcnN0VGltZUNoYW5nZSA9ICh2OiBhbnkpOiBib29sZWFuID0+IHYgPT09IEZJUlNUX1RJTUVfV0FUQ0g7XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IChmbjogRnVuY3Rpb24sIHdhaXQ6IG51bWJlciA9IERFQk9VTkNFX1dBSVQpID0+IHtcbiAgICBsZXQgdGltZW91dDogYW55O1xuICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgd2luZG93WydfX3pvbmVfc3ltYm9sX19jbGVhclRpbWVvdXQnXSh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHdpbmRvd1snX196b25lX3N5bWJvbF9fc2V0VGltZW91dCddKCgpID0+IGZuKC4uLmFyZ3MpLCB3YWl0KTtcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG11dGVXYXRjaGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBtdXRlZCA9IHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdW5NdXRlV2F0Y2hlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgbXV0ZWQgPSBmYWxzZTtcbiAgICB0cmlnZ2VyV2F0Y2hlcnMoKTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgd2lkZ2V0IElEIGZyb20gaWRlbnRpZmllciAoZS5nLiwgXCJ3aWRnZXQtaWQyM19ldmVudHNvdXJjZVwiIC0+IFwid2lkZ2V0LWlkMjNcIilcbiAqL1xuY29uc3QgZ2V0V2lkZ2V0SWQgPSAoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgaWYgKCFpZGVudGlmaWVyIHx8IHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBpZGVudGlmaWVyLm1hdGNoKFdJREdFVF9JRF9SRUdFWCk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBwcm9wZXJ0eSBuYW1lIGZyb20gaWRlbnRpZmllciAoZS5nLiwgXCJ3aWRnZXQtaWQyM19ldmVudHNvdXJjZVwiIC0+IFwiZXZlbnRzb3VyY2VcIilcbiAqL1xuY29uc3QgZ2V0UHJvcGVydHlOYW1lID0gKGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgaWYgKCFpZGVudGlmaWVyIHx8IHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBpZGVudGlmaWVyLm1hdGNoKFdJREdFVF9QUk9QRVJUWV9SRUdFWCk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBpZGVudGlmaWVyO1xufTtcblxuLyoqXG4gKiBBcnJheSBjb25zdW1lciB3cmFwcGVyIGZvciBhcnJheS1iYXNlZCBleHByZXNzaW9uc1xuICovXG5jb25zdCBhcnJheUNvbnN1bWVyID0gKGxpc3RlbmVyRm46IGFueSwgcmVzdEV4cHI6IHN0cmluZywgbmV3VmFsOiBhbnksIG9sZFZhbDogYW55KTogdm9pZCA9PiB7XG4gICAgaWYgKCFpc0FycmF5KG5ld1ZhbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmb3JtYXR0ZWREYXRhID0gbmV3VmFsLm1hcChkYXR1bSA9PiBmaW5kVmFsdWVPZihkYXR1bSwgcmVzdEV4cHIpKTtcblxuICAgIC8vIEZsYXR0ZW4gaWYgcmVzdWx0IGlzIGFycmF5IG9mIGFycmF5c1xuICAgIGlmIChpc0FycmF5KGZvcm1hdHRlZERhdGFbMF0pKSB7XG4gICAgICAgIGZvcm1hdHRlZERhdGEgPSBmbGF0dGVuKGZvcm1hdHRlZERhdGEpO1xuICAgIH1cblxuICAgIGxpc3RlbmVyRm4oZm9ybWF0dGVkRGF0YSwgb2xkVmFsKTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyB3YXRjaCBpbmZvIGZvciBhcnJheSBleHByZXNzaW9uc1xuICovXG5jb25zdCBnZXRVcGRhdGVkV2F0Y2hJbmZvID0gKGV4cHI6IHN0cmluZywgYWNjZXB0c0FycmF5OiBib29sZWFuLCBsaXN0ZW5lcjogYW55KSA9PiB7XG4gICAgY29uc3QgcmVnZXggPSAvXFxbXFwkaVxcXS9nO1xuXG4gICAgaWYgKCFhY2NlcHRzQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4cHI6IGV4cHIucmVwbGFjZShyZWdleCwgQVJSQVlfSU5ERVhfWkVSTyksXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RJbmRleCA9IGV4cHIubGFzdEluZGV4T2YoQVJSQVlfSU5ERVhfUExBQ0VIT0xERVIpO1xuICAgIGNvbnN0IGJhc2VFeHByID0gZXhwci5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KS5yZXBsYWNlKEFSUkFZX0lOREVYX1BMQUNFSE9MREVSLCBBUlJBWV9JTkRFWF9aRVJPKTtcbiAgICBjb25zdCByZXN0RXhwciA9IGV4cHIuc3Vic3RyaW5nKGxhc3RJbmRleCArIDUpO1xuXG4gICAgY29uc3QgYXJyYXlDb25zdW1lckZuID0gcmVzdEV4cHJcbiAgICAgICAgPyBhcnJheUNvbnN1bWVyLmJpbmQodW5kZWZpbmVkLCBsaXN0ZW5lciwgcmVzdEV4cHIpXG4gICAgICAgIDogbGlzdGVuZXI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBleHByOiBiYXNlRXhwcixcbiAgICAgICAgbGlzdGVuZXI6IGFycmF5Q29uc3VtZXJGblxuICAgIH07XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYW4gZXhwcmVzc2lvbiBpcyBzdGF0aWMgKGRvZXNuJ3QgbmVlZCB0byBiZSB3YXRjaGVkKVxuICovXG5jb25zdCBTVEFUSUNfRVhQUkVTU0lPTl9OQU1FUyA9IFtcbiAgICBcInJvdy5nZXRQcm9wZXJ0eSgnaW52ZXN0bWVudCcpXCIsXG4gICAgXCJyb3cuZ2V0UHJvcGVydHkoJ2ZhY3RzaGVldExpbmsnKVwiLFxuICAgIFwicm93LmdldFByb3BlcnR5KCdpc1JlYmFsYW5jZUVsaWdpYmxlJylcIlxuXTtcblxuY29uc3QgaXNTdGF0aWNFeHByZXNzaW9uID0gKGV4cHI6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh0eXBlb2YgZXhwciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWRFeHByID0gZXhwci50cmltKCk7XG5cbiAgICAvLyBFeHByZXNzaW9ucyB0aGF0IGFsd2F5cyBldmFsdWF0ZSB0byBsb2NhbGl6YXRpb24gc3RyaW5nc1xuICAgIC8vIGlmICh0cmltbWVkRXhwci5pbmNsdWRlcygnYXBwTG9jYWxlJykpIHtcbiAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gfVxuXG4gICAgLy8gSGFyZC1jb2RlZCBzdGF0aWMgZXhwcmVzc2lvbiBuYW1lc1xuICAgIGlmIChTVEFUSUNfRVhQUkVTU0lPTl9OQU1FUy5pbmNsdWRlcyh0cmltbWVkRXhwcikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzY29wZSB0eXBlIGZyb20gdGhlIHNjb3BlIG9iamVjdFxuICovXG5jb25zdCBnZXRTY29wZVR5cGUgPSAoJHNjb3BlOiBhbnkpOiBTY29wZVR5cGUgfCBudWxsID0+IHtcbiAgICBpZiAoISRzY29wZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoJHNjb3BlLnBhZ2VOYW1lKSByZXR1cm4gJ1BhZ2UnO1xuICAgIGlmICgkc2NvcGUucHJlZmFiTmFtZSkgcmV0dXJuICdQcmVmYWInO1xuICAgIGlmICgkc2NvcGUucGFydGlhbE5hbWUpIHJldHVybiAnUGFydGlhbCc7XG5cbiAgICAvLyBDaGVjayBmb3IgQXBwIHNjb3BlXG4gICAgaWYgKCRzY29wZS5WYXJpYWJsZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAkc2NvcGUuQWN0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICEkc2NvcGUucGFnZU5hbWUgJiZcbiAgICAgICAgISRzY29wZS5wcmVmYWJOYW1lICYmXG4gICAgICAgICEkc2NvcGUucGFydGlhbE5hbWUpIHtcbiAgICAgICAgcmV0dXJuICdBcHAnO1xuICAgIH1cblxuICAgIGlmICgkc2NvcGUuY29uc3RydWN0b3I/Lm5hbWUgPT09ICdBcHBSZWYnKSB7XG4gICAgICAgIHJldHVybiAnQXBwJztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogR2V0cyBzY29wZSBuYW1lIGJhc2VkIG9uIHNjb3BlIHR5cGVcbiAqL1xuY29uc3QgZ2V0U2NvcGVOYW1lID0gKCRzY29wZTogYW55LCBzY29wZVR5cGU6IFNjb3BlVHlwZSB8IG51bGwpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICBpZiAoIXNjb3BlVHlwZSB8fCAhJHNjb3BlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc2NvcGVUeXBlKSB7XG4gICAgICAgIGNhc2UgJ1ByZWZhYic6IHJldHVybiAkc2NvcGUucHJlZmFiTmFtZSB8fCBudWxsO1xuICAgICAgICBjYXNlICdQYXJ0aWFsJzogcmV0dXJuICRzY29wZS5wYXJ0aWFsTmFtZSB8fCBudWxsO1xuICAgICAgICBjYXNlICdQYWdlJzogcmV0dXJuICRzY29wZS5wYWdlTmFtZSB8fCBudWxsO1xuICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiAgICB9XG59O1xuXG4vKipcbiAqIE1haW4gd2F0Y2ggZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0ICR3YXRjaCA9IChcbiAgICBleHByOiBzdHJpbmcsXG4gICAgJHNjb3BlOiBhbnksXG4gICAgJGxvY2FsczogYW55LFxuICAgIGxpc3RlbmVyOiBhbnksXG4gICAgaWRlbnRpZmllcjogc3RyaW5nID0gd2F0Y2hJZEdlbmVyYXRvci5uZXh0VWlkKCksXG4gICAgZG9Ob3RDbG9uZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGNvbmZpZzogV2F0Y2hDb25maWcgPSB7fSxcbiAgICBpc011dGVkPzogKCkgPT4gYm9vbGVhblxuKSA9PiB7XG4gICAgLy8gSGFuZGxlIGFycmF5IGV4cHJlc3Npb25zXG4gICAgaWYgKGV4cHIuaW5jbHVkZXMoQVJSQVlfSU5ERVhfUExBQ0VIT0xERVIpKSB7XG4gICAgICAgIGNvbnN0IHdhdGNoSW5mbyA9IGdldFVwZGF0ZWRXYXRjaEluZm8oZXhwciwgY29uZmlnLmFycmF5VHlwZSB8fCBjb25maWcuaXNMaXN0IHx8IGZhbHNlLCBsaXN0ZW5lcik7XG4gICAgICAgIGV4cHIgPSB3YXRjaEluZm8uZXhwcjtcbiAgICAgICAgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHN0YXRpYyBleHByZXNzaW9uc1xuICAgIGlmIChpc1N0YXRpY0V4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZuID0gJHBhcnNlRXhwcihleHByKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRpY1ZhbHVlID0gZm4oJHNjb3BlLCAkbG9jYWxzKTtcbiAgICAgICAgICAgIGxpc3RlbmVyKHN0YXRpY1ZhbHVlLCBGSVJTVF9USU1FX1dBVENIKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBFcnJvciBldmFsdWF0aW5nIHN0YXRpYyBleHByZXNzaW9uICcke2V4cHJ9JzpgLCBlKTtcbiAgICAgICAgICAgIGxpc3RlbmVyKHVuZGVmaW5lZCwgRklSU1RfVElNRV9XQVRDSCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IHsgfTsgLy8gTm8tb3AgdW5zdWJzY3JpYmVcbiAgICB9XG5cbiAgICBjb25zdCBmbiA9ICRwYXJzZUV4cHIoZXhwcik7XG4gICAgY29uc3Qgc2NvcGVUeXBlID0gZ2V0U2NvcGVUeXBlKCRzY29wZSk7XG4gICAgY29uc3Qgc2NvcGVOYW1lID0gZ2V0U2NvcGVOYW1lKCRzY29wZSwgc2NvcGVUeXBlKTtcblxuICAgIGNvbnN0IGRlc3Ryb3lGbiA9ICgpID0+ICR1bndhdGNoKGlkZW50aWZpZXIpO1xuICAgIGNvbnN0IHdhdGNoSW5mbzogV2F0Y2hJbmZvID0ge1xuICAgICAgICBmbjogZm4uYmluZChudWxsLCAkc2NvcGUsICRsb2NhbHMpLFxuICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgZXhwcixcbiAgICAgICAgbGFzdDogRklSU1RfVElNRV9XQVRDSCxcbiAgICAgICAgZG9Ob3RDbG9uZSxcbiAgICAgICAgaXNNdXRlZCxcbiAgICAgICAgc2NvcGVUeXBlLFxuICAgICAgICBzY29wZU5hbWUsXG4gICAgICAgIGRlc3Ryb3lGblxuICAgIH07XG5cbiAgICAvLyBTdG9yZSBpbiByZWdpc3RyeVxuICAgIGNvbnN0IHdpZGdldElkID0gZ2V0V2lkZ2V0SWQoaWRlbnRpZmllcik7XG5cbiAgICBpZiAod2lkZ2V0SWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlOYW1lKGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoIXJlZ2lzdHJ5Lmhhcyh3aWRnZXRJZCkpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5LnNldCh3aWRnZXRJZCwge30pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpZGdldEdyb3VwID0gcmVnaXN0cnkuZ2V0KHdpZGdldElkKTtcbiAgICAgICAgd2lkZ2V0R3JvdXBbcHJvcGVydHlOYW1lXSA9IHdhdGNoSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZWdpc3RyeS5zZXQoaWRlbnRpZmllciwgd2F0Y2hJbmZvKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVzdHJveUZuO1xufTtcblxuLyoqXG4gKiBVbndhdGNoZXMgYSBzaW5nbGUgaWRlbnRpZmllclxuICovXG5leHBvcnQgY29uc3QgJHVud2F0Y2ggPSAoaWRlbnRpZmllcjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3Qgd2lkZ2V0SWQgPSBnZXRXaWRnZXRJZChpZGVudGlmaWVyKTtcblxuICAgIGlmICh3aWRnZXRJZCkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUoaWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IHdpZGdldEdyb3VwID0gcmVnaXN0cnkuZ2V0KHdpZGdldElkKTtcblxuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgaWYgKHdpZGdldEdyb3VwICYmIHR5cGVvZiB3aWRnZXRHcm91cCA9PT0gJ29iamVjdCcgJiYgIXdpZGdldEdyb3VwLmZuKSB7XG4gICAgICAgICAgICBjb25zdCB3YXRjaEluZm8gPSB3aWRnZXRHcm91cFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKHdhdGNoSW5mbykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB3aWRnZXRHcm91cFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIGVtcHR5IHdpZGdldCBncm91cHNcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMod2lkZ2V0R3JvdXApLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWdpc3RyeS5kZWxldGUod2lkZ2V0SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIGRpcmVjdCBsb29rdXBcbiAgICBpZiAocmVnaXN0cnkuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgIHJlZ2lzdHJ5LmRlbGV0ZShpZGVudGlmaWVyKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBVbndhdGNoZXMgYWxsIHdhdGNoZXJzIGZvciBhIHNwZWNpZmljIHdpZGdldCBJRFxuICovXG5leHBvcnQgY29uc3QgJHVud2F0Y2hBbGwgPSAod2lkZ2V0SWQ6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gICAgaWYgKCF3aWRnZXRJZCB8fCB0eXBlb2Ygd2lkZ2V0SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZGdldEdyb3VwID0gcmVnaXN0cnkuZ2V0KHdpZGdldElkKTtcblxuICAgIGlmICh3aWRnZXRHcm91cCAmJiB0eXBlb2Ygd2lkZ2V0R3JvdXAgPT09ICdvYmplY3QnICYmICF3aWRnZXRHcm91cC5mbikge1xuICAgICAgICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKHdpZGdldEdyb3VwKS5sZW5ndGg7XG4gICAgICAgIHJlZ2lzdHJ5LmRlbGV0ZSh3aWRnZXRJZCk7XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogZmluZCBhbGwgaWRlbnRpZmllcnMgc3RhcnRpbmcgd2l0aCB0aGlzIHdpZGdldCBJRFxuICAgIGxldCByZW1vdmVkQ291bnQgPSAwO1xuICAgIGNvbnN0IGlkZW50aWZpZXJzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XG5cbiAgICByZWdpc3RyeS5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHdpZGdldElkICsgJ18nKSkge1xuICAgICAgICAgICAgaWRlbnRpZmllcnNUb1JlbW92ZS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlkZW50aWZpZXJzVG9SZW1vdmUuZm9yRWFjaChpZGVudGlmaWVyID0+IHtcbiAgICAgICAgaWYgKCR1bndhdGNoKGlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlbW92ZWRDb3VudDtcbn07XG5cbi8qKlxuICogVW53YXRjaGVzIGFsbCB3YXRjaGVycyBmb3IgYSBzcGVjaWZpYyBzY29wZSAoUGFnZSwgUHJlZmFiLCBQYXJ0aWFsLCBvciBBcHApXG4gKiBOb3cgd29ya3MgZGlyZWN0bHkgd2l0aCB0aGUgbWFpbiByZWdpc3RyeSBpbnN0ZWFkIG9mIHNlcGFyYXRlIHNjb3BlZCByZWdpc3RyaWVzXG4gKi9cbmV4cG9ydCBjb25zdCAkdW53YXRjaEFsbEJ5U2NvcGUgPSAoc2NvcGVUeXBlOiBTY29wZVR5cGUsIHNjb3BlTmFtZT86IHN0cmluZyk6IG51bWJlciA9PiB7XG4gICAgaWYgKCFzY29wZVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgbGV0IHJlbW92ZWRDb3VudCA9IDA7XG4gICAgY29uc3QgaWRlbnRpZmllcnNUb1JlbW92ZTogc3RyaW5nW10gPSBbXTtcblxuICAgIHJlZ2lzdHJ5LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgLy8gSGFuZGxlIGdyb3VwZWQgc3RydWN0dXJlICh3aWRnZXQgZ3JvdXBzKVxuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhdmFsdWUuZm4pIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChbcHJvcGVydHlOYW1lLCB3YXRjaEluZm9dOiBbc3RyaW5nLCBhbnldKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHdhdGNoSW5mbz8uc2NvcGVUeXBlID09PSBzY29wZVR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFzY29wZU5hbWUgfHwgd2F0Y2hJbmZvLnNjb3BlTmFtZSA9PT0gc2NvcGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLnB1c2goYCR7a2V5fV8ke3Byb3BlcnR5TmFtZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERpcmVjdCB3YXRjaEluZm9cbiAgICAgICAgICAgIGNvbnN0IHdhdGNoSW5mbyA9IHZhbHVlIGFzIFdhdGNoSW5mbztcbiAgICAgICAgICAgIGlmICh3YXRjaEluZm8/LnNjb3BlVHlwZSA9PT0gc2NvcGVUeXBlICYmXG4gICAgICAgICAgICAgICAgKCFzY29wZU5hbWUgfHwgd2F0Y2hJbmZvLnNjb3BlTmFtZSA9PT0gc2NvcGVOYW1lKSkge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJzVG9SZW1vdmUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVbndhdGNoIGFsbCBjb2xsZWN0ZWQgaWRlbnRpZmllcnNcbiAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLmZvckVhY2goaWRlbnRpZmllciA9PiB7XG4gICAgICAgIGlmICgkdW53YXRjaChpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZW1vdmVkQ291bnQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBhIHNpbmdsZSB3YXRjaCBpbmZvIGR1cmluZyB0cmlnZ2VyIGN5Y2xlXG4gKi9cbmNvbnN0IHByb2Nlc3NXYXRjaEluZm8gPSAod2F0Y2hJbmZvOiBXYXRjaEluZm8pOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXdhdGNoSW5mbz8uZm4gfHwgKHdhdGNoSW5mby5pc011dGVkPy4oKSA/PyBmYWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBuZXdWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICAgIG5ld1ZhbHVlID0gd2F0Y2hJbmZvLmZuKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYEVycm9yIGV4ZWN1dGluZyBleHByZXNzaW9uOiAnJHt3YXRjaEluZm8uZXhwcn0nYCwgZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoaXNFcXVhbChuZXdWYWx1ZSwgd2F0Y2hJbmZvLmxhc3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgZGV0ZWN0ZWRcbiAgICBjaGFuZ2VkQnlXYXRjaCA9IHRydWU7XG4gICAgd2F0Y2hJbmZvLmxhc3QgPSBpc09iamVjdChuZXdWYWx1ZSkgJiYgIXdhdGNoSW5mby5kb05vdENsb25lXG4gICAgICAgID8gY2xvbmUobmV3VmFsdWUpXG4gICAgICAgIDogbmV3VmFsdWU7XG5cbiAgICB3YXRjaEluZm8ubGlzdGVuZXIobmV3VmFsdWUsIHdhdGNoSW5mby5sYXN0ID09PSBuZXdWYWx1ZSA/IEZJUlNUX1RJTUVfV0FUQ0ggOiB3YXRjaEluZm8ubGFzdCk7XG4gICAgY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VycyBhbGwgd2F0Y2hlcnNcbiAqL1xuY29uc3QgdHJpZ2dlcldhdGNoZXJzID0gKGlnbm9yZU11dGVkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkID0+IHtcbiAgICBpZiAobXV0ZWQgJiYgIWlnbm9yZU11dGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcGFzcyA9IDE7XG4gICAgbGV0IGNoYW5nZURldGVjdGVkOiBib29sZWFuO1xuXG4gICAgZG8ge1xuICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIHJlZ2lzdHJ5LmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgZ3JvdXBlZCBzdHJ1Y3R1cmVcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICF2YWx1ZS5mbikge1xuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXModmFsdWUpLmZvckVhY2goKHdhdGNoSW5mbzogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzV2F0Y2hJbmZvKHdhdGNoSW5mbykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3Qgd2F0Y2hJbmZvXG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NXYXRjaEluZm8odmFsdWUgYXMgV2F0Y2hJbmZvKSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBwYXNzKys7XG4gICAgfSB3aGlsZSAoY2hhbmdlRGV0ZWN0ZWQgJiYgcGFzcyA8IE1BWF9XQVRDSF9DWUNMRVMpO1xuXG4gICAgLy8gU2NoZWR1bGUgY2xlYW51cCBhZnRlciB3YXRjaGVycyBhcmUgdHJpZ2dlcmVkXG4gICAgc2NoZWR1bGVUaHJlc2hvbGRDbGVhbnVwKCk7XG5cbiAgICBpZiAoY2hhbmdlRGV0ZWN0ZWQgJiYgcGFzcyA9PT0gTUFYX1dBVENIX0NZQ0xFUykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFdhdGNoIGN5Y2xlcyBleGNlZWRlZCBsaW1pdCBvZiAke01BWF9XQVRDSF9DWUNMRVN9YCk7XG4gICAgfVxufTtcblxuLy8gQW5ndWxhciB6b25lIGludGVncmF0aW9uXG5leHBvcnQgY29uc3Qgc2V0Tmdab25lID0gKHpvbmU6IGFueSk6IHZvaWQgPT4ge1xuICAgIG5nWm9uZSA9IHpvbmU7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0QXBwUmVmID0gKHJlZjogYW55KTogdm9pZCA9PiB7XG4gICAgYXBwUmVmID0gcmVmO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQ2hhbmdlRnJvbVdhdGNoID0gKCk6IGJvb2xlYW4gPT4gY2hhbmdlZEJ5V2F0Y2g7XG5leHBvcnQgY29uc3QgcmVzZXRDaGFuZ2VGcm9tV2F0Y2ggPSAoKTogdm9pZCA9PiB7XG4gICAgY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcbn07XG5cbi8vIERlYm91bmNlZCB0cmlnZ2VyXG5jb25zdCBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgc2tpcFdhdGNoZXJzID0gdHJ1ZTtcbiAgICBuZ1pvbmUucnVuKCgpID0+IHRyaWdnZXJXYXRjaGVycygpKTtcbn0sIERFQk9VTkNFX1dBSVQpO1xuXG5leHBvcnQgY29uc3QgJGludm9rZVdhdGNoZXJzID0gKGZvcmNlOiBib29sZWFuID0gZmFsc2UsIGlnbm9yZU11dGVkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkID0+IHtcbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgdHJpZ2dlcldhdGNoZXJzKGlnbm9yZU11dGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2tpcFdhdGNoZXJzKSB7XG4gICAgICAgICAgICBza2lwV2F0Y2hlcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMoKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgJGFwcERpZ2VzdCA9ICgoKSA9PiB7XG4gICAgbGV0IHF1ZXVlZCA9IGZhbHNlO1xuICAgIGNvbnN0ICRSQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG4gICAgcmV0dXJuIChmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghYXBwUmVmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICBxdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZWQgPSB0cnVlO1xuICAgICAgICAgICAgJFJBRigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbmdab25lLnJ1bigoKSA9PiBhcHBSZWYudGljaygpKTtcbiAgICAgICAgICAgICAgICBxdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5cbi8vIEV4cG9ydCByZWdpc3RyeSBmb3IgZGVidWdnaW5nXG4od2luZG93IGFzIGFueSkud2F0Y2hSZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuIl19
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRXJFLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7QUFFeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV0RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDO0FBRTdELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLE1BQU0sQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQVksRUFBRSxPQUFlLEVBQUUsRUFBRSxFQUFFO0lBQ3hELElBQUksT0FBTyxDQUFDO0lBQ1osT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxPQUFPLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVB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QUNELElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULE9BQU87WUFDWCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDZCxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2hDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURHZW5lcmF0b3IgfSBmcm9tICcuL2lkLWdlbmVyYXRvcic7XG5cbmltcG9ydCB7ICRwYXJzZUV4cHIgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyJztcbmltcG9ydCB7IGZpbmRWYWx1ZU9mIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge2Nsb25lLCBmbGF0dGVuLCBpc0FycmF5LCBpc0VxdWFsLCBpc09iamVjdH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5jb25zdCByZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG5cbmNvbnN0IHdhdGNoSWRHZW5lcmF0b3IgPSBuZXcgSURHZW5lcmF0b3IoJ3dhdGNoLWlkLScpO1xuXG5leHBvcnQgY29uc3QgRklSU1RfVElNRV9XQVRDSCA9IHt9O1xuXG5PYmplY3QuZnJlZXplKEZJUlNUX1RJTUVfV0FUQ0gpO1xuXG5leHBvcnQgY29uc3QgaXNGaXJzdFRpbWVDaGFuZ2UgPSB2ID0+IHYgPT09IEZJUlNUX1RJTUVfV0FUQ0g7XG5cbmxldCBtdXRlZCA9IGZhbHNlO1xubGV0IGFwcFJlZjtcblxuZXhwb3J0IGNvbnN0IGRlYm91bmNlID0gKGZuOiBGdW5jdGlvbiwgd2FpdDogbnVtYmVyID0gNTApID0+IHtcbiAgICBsZXQgdGltZW91dDtcbiAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgd2luZG93WydfX3pvbmVfc3ltYm9sX19jbGVhclRpbWVvdXQnXSh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHdpbmRvd1snX196b25lX3N5bWJvbF9fc2V0VGltZW91dCddKCgpID0+IGZuKC4uLmFyZ3MpLCB3YWl0KTtcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG11dGVXYXRjaGVycyA9ICgpID0+IHtcbiAgICBtdXRlZCA9IHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdW5NdXRlV2F0Y2hlcnMgPSAoKSA9PiB7XG4gICAgbXV0ZWQgPSBmYWxzZTtcbiAgICB0cmlnZ2VyV2F0Y2hlcnMoKTtcbn07XG5cbmNvbnN0IGFycmF5Q29uc3VtZXIgPSAobGlzdGVuZXJGbiwgcmVzdEV4cHIsIG5ld1ZhbCwgb2xkVmFsKSA9PiB7XG4gICAgbGV0IGRhdGEgPSBuZXdWYWwsXG4gICAgICAgIGZvcm1hdHRlZERhdGE7XG5cbiAgICBpZiAoaXNBcnJheShkYXRhKSkge1xuICAgICAgICBmb3JtYXR0ZWREYXRhID0gZGF0YS5tYXAoZnVuY3Rpb24gKGRhdHVtKSB7XG4gICAgICAgICAgICByZXR1cm4gZmluZFZhbHVlT2YoZGF0dW0sIHJlc3RFeHByKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSWYgcmVzdWx0aW5nIHN0cnVjdHVyZSBpcyBhbiBhcnJheSBvZiBhcnJheSwgZmxhdHRlbiBpdFxuICAgICAgICBpZiAoaXNBcnJheShmb3JtYXR0ZWREYXRhWzBdKSkge1xuICAgICAgICAgICAgZm9ybWF0dGVkRGF0YSA9IGZsYXR0ZW4oZm9ybWF0dGVkRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0ZW5lckZuKGZvcm1hdHRlZERhdGEsIG9sZFZhbCk7XG4gICAgfVxufTtcblxuY29uc3QgZ2V0VXBkYXRlZFdhdGNJbmZvID0gKGV4cHIsIGFjY2VwdHNBcnJheSwgbGlzdGVuZXIpID0+IHtcbiAgICAvLyBsaXN0ZW5lciBkb2Vzbid0IGFjY2VwdCBhcnJheVxuICAgIC8vIHJlcGxhY2UgYWxsIGBbJGldYCB3aXRoIGBbMF1gIGFuZCByZXR1cm4gdGhlIGV4cHJlc3Npb25cbiAgICBsZXQgcmVnZXggPSAvXFxbXFwkaVxcXS9nLFxuICAgICAgICAkSSAgICAgICAgICAgICAgICA9ICdbJGldJyxcbiAgICAgICAgJDAgICAgICAgICAgICAgICAgPSAnWzBdJztcbiAgICBpZiAoIWFjY2VwdHNBcnJheSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2V4cHInICAgICA6IGV4cHIucmVwbGFjZShyZWdleCwgJDApLFxuICAgICAgICAgICAgJ2xpc3RlbmVyJyA6IGxpc3RlbmVyXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gbGlzdGVuZXIgYWNjZXB0cyBhcnJheVxuICAgIC8vIHJlcGxhY2UgYWxsIGV4Y2VwdCB0aGUgbGFzdCBgWyRpXWAgd2l0aCBgWzBdYCBhbmQgcmV0dXJuIHRoZSBleHByZXNzaW9uLlxuICAgIHZhciBpbmRleCAgICAgICAgICAgPSBleHByLmxhc3RJbmRleE9mKCRJKSxcbiAgICAgICAgX2V4cHIgICAgICAgICAgID0gZXhwci5zdWJzdHIoMCwgaW5kZXgpLnJlcGxhY2UoJEksICQwKSxcbiAgICAgICAgcmVzdEV4cHIgICAgICAgID0gZXhwci5zdWJzdHIoaW5kZXggKyA1KSxcbiAgICAgICAgYXJyYXlDb25zdW1lckZuID0gbGlzdGVuZXI7XG5cbiAgICBpZiAocmVzdEV4cHIpIHtcbiAgICAgICAgYXJyYXlDb25zdW1lckZuID0gYXJyYXlDb25zdW1lci5iaW5kKHVuZGVmaW5lZCwgbGlzdGVuZXIsIHJlc3RFeHByKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAnZXhwcicgICAgIDogX2V4cHIsXG4gICAgICAgICdsaXN0ZW5lcicgOiBhcnJheUNvbnN1bWVyRm5cbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0ICR3YXRjaCA9IChleHByLCAkc2NvcGUsICRsb2NhbHMsIGxpc3RlbmVyLCBpZGVudGlmaWVyID0gd2F0Y2hJZEdlbmVyYXRvci5uZXh0VWlkKCksIGRvTm90Q2xvbmUgPSBmYWxzZSwgY29uZmlnOmFueT17fSwgaXNNdXRlZD86ICgpID0+IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoZXhwci5pbmRleE9mKCdbJGldJykgIT09IC0xKSB7XG4gICAgICAgIGxldCB3YXRjaEluZm8gPSBnZXRVcGRhdGVkV2F0Y0luZm8oZXhwciwgY29uZmlnICYmIChjb25maWcuYXJyYXlUeXBlIHx8IGNvbmZpZy5pc0xpc3QpLCBsaXN0ZW5lcik7XG4gICAgICAgIGV4cHIgPSB3YXRjaEluZm8uZXhwcjtcbiAgICAgICAgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgfVxuICAgIGNvbnN0IGZuID0gJHBhcnNlRXhwcihleHByKTtcblxuICAgIHJlZ2lzdHJ5LnNldChpZGVudGlmaWVyLCB7XG4gICAgICAgIGZuOiBmbi5iaW5kKGV4cHIsICRzY29wZSwgJGxvY2FscyksXG4gICAgICAgIGxpc3RlbmVyLFxuICAgICAgICBleHByLFxuICAgICAgICBsYXN0OiBGSVJTVF9USU1FX1dBVENILFxuICAgICAgICBkb05vdENsb25lLFxuICAgICAgICBpc011dGVkOiBpc011dGVkXG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4gJHVud2F0Y2goaWRlbnRpZmllcik7XG59O1xuXG5leHBvcnQgY29uc3QgJHVud2F0Y2ggPSBpZGVudGlmaWVyID0+IHJlZ2lzdHJ5LmRlbGV0ZShpZGVudGlmaWVyKTtcblxubGV0IGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5cbmNvbnN0ICRSQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG5sZXQgbmdab25lO1xuXG5jb25zdCB0cmlnZ2VyV2F0Y2hlcnMgPSAoaWdub3JlTXV0ZWQ/OiBib29sZWFuKSA9PiB7XG5cbiAgICBpZiAobXV0ZWQgJiYgIWlnbm9yZU11dGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaW1pdCA9IDU7XG4gICAgbGV0IHBhc3MgPSAxO1xuICAgIGxldCBjaGFuZ2VEZXRlY3RlZDtcblxuICAgIGRvIHtcbiAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmVnaXN0cnkuZm9yRWFjaCh3YXRjaEluZm8gPT4ge1xuICAgICAgICAgICAgaWYod2F0Y2hJbmZvLmlzTXV0ZWQgJiYgd2F0Y2hJbmZvLmlzTXV0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZuID0gd2F0Y2hJbmZvLmZuO1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgICAgICAgICBjb25zdCBvdiA9IHdhdGNoSW5mby5sYXN0O1xuICAgICAgICAgICAgbGV0IG52O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG52ID0gZm4oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYGVycm9yIGluIGV4ZWN1dGluZyBleHByZXNzaW9uOiAnJHt3YXRjaEluZm8uZXhwcn0nYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXNFcXVhbChudiwgb3YpKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNoYW5nZWRCeVdhdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3YXRjaEluZm8ubGFzdCA9IG52O1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChudikgJiYgIXdhdGNoSW5mby5kb05vdENsb25lICYmIG52Ll9fY2xvbmVhYmxlX18gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhdGNoSW5mby5sYXN0ID0gY2xvbmUobnYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaXN0ZW5lcihudiwgb3YpO1xuICAgICAgICAgICAgICAgIHJlc2V0Q2hhbmdlRnJvbVdhdGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBwYXNzKys7XG5cbiAgICB9IHdoaWxlIChjaGFuZ2VEZXRlY3RlZCAmJiBwYXNzIDwgbGltaXQpO1xuXG4gICAgaWYgKGNoYW5nZURldGVjdGVkICYmIHBhc3MgPT09IGxpbWl0KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgTnVtYmVyIG9mIHdhdGNoIGN5Y2xlcyBnb25lIGFib3ZlIHNldCBsaW1pdCBvZjogJHtsaW1pdH0gYCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldE5nWm9uZSA9IHpvbmUgPT4gbmdab25lID0gem9uZTtcblxuZXhwb3J0IGNvbnN0IHNldEFwcFJlZiA9IHJlZiA9PiB7XG4gICAgYXBwUmVmID0gcmVmXG59O1xuXG5leHBvcnQgY29uc3QgaXNDaGFuZ2VGcm9tV2F0Y2ggPSAoKSA9PiBjaGFuZ2VkQnlXYXRjaDtcbmV4cG9ydCBjb25zdCByZXNldENoYW5nZUZyb21XYXRjaCA9ICgpID0+IGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5cbig8YW55PndpbmRvdykud2F0Y2hSZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuXG5sZXQgc2tpcFdhdGNoZXJzO1xuXG5jb25zdCBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgc2tpcFdhdGNoZXJzID0gdHJ1ZTtcbiAgICBuZ1pvbmUucnVuKCgpID0+IHRyaWdnZXJXYXRjaGVycygpKTtcbn0sIDEwMCk7XG5cbmV4cG9ydCBjb25zdCAkaW52b2tlV2F0Y2hlcnMgPSAoZm9yY2U/OiBib29sZWFuLCBpZ25vcmVNdXRlZD86IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgdHJpZ2dlcldhdGNoZXJzKGlnbm9yZU11dGVkKTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmIChza2lwV2F0Y2hlcnMpIHtcbiAgICAgICAgICAgIHNraXBXYXRjaGVycyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlYm91bmNlZFRyaWdnZXJXYXRjaGVycygpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCAkYXBwRGlnZXN0ID0gKCgpID0+IHtcbiAgICBsZXQgcXVldWVkID0gZmFsc2U7XG4gICAgcmV0dXJuIChmb3JjZT86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFhcHBSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICBxdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgJFJBRigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG4iXX0=
|