@wavemaker/app-ng-runtime 11.14.2-1.6424 → 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.
- package/components/base/bundles/index.umd.js +6 -12
- package/components/base/esm2022/widgets/common/base/base.component.mjs +8 -14
- package/components/base/fesm2022/index.mjs +7 -13
- package/components/base/fesm2022/index.mjs.map +1 -1
- package/components/data/table/bundles/index.umd.js +5 -5
- package/components/data/table/esm2022/table.component.mjs +7 -7
- package/components/data/table/fesm2022/index.mjs +6 -6
- package/components/data/table/fesm2022/index.mjs.map +1 -1
- package/components/prefab/bundles/index.umd.js +0 -4
- package/components/prefab/esm2022/prefab.directive.mjs +1 -5
- package/components/prefab/fesm2022/index.mjs +0 -4
- package/components/prefab/fesm2022/index.mjs.map +1 -1
- package/core/bundles/index.umd.js +187 -330
- package/core/esm2022/public_api.mjs +2 -2
- package/core/esm2022/utils/watcher.mjs +191 -327
- package/core/fesm2022/index.mjs +194 -330
- package/core/fesm2022/index.mjs.map +1 -1
- package/core/public_api.d.ts +1 -1
- package/core/utils/watcher.d.ts +5 -26
- package/npm-shrinkwrap.json +2 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/runtime/base/bundles/index.umd.js +11 -171
- package/runtime/base/components/app-component/app.component.d.ts +0 -4
- package/runtime/base/esm2022/components/app-component/app.component.mjs +9 -40
- package/runtime/base/esm2022/components/base-page.component.mjs +3 -35
- package/runtime/base/esm2022/components/base-partial.component.mjs +3 -37
- package/runtime/base/esm2022/components/base-prefab.component.mjs +3 -32
- package/runtime/base/esm2022/components/base-spa-page.component.mjs +3 -37
- package/runtime/base/fesm2022/index.mjs +12 -172
- package/runtime/base/fesm2022/index.mjs.map +1 -1
- package/runtime/dynamic/bundles/index.umd.js +4 -0
- package/runtime/dynamic/esm2022/app/app.config.mjs +6 -2
- package/runtime/dynamic/fesm2022/index.mjs +5 -1
- package/runtime/dynamic/fesm2022/index.mjs.map +1 -1
|
@@ -1450,11 +1450,11 @@
|
|
|
1450
1450
|
}
|
|
1451
1451
|
};
|
|
1452
1452
|
|
|
1453
|
-
const $RAF = window.requestAnimationFrame;
|
|
1453
|
+
const $RAF$1 = window.requestAnimationFrame;
|
|
1454
1454
|
const $RAFQueue = [];
|
|
1455
1455
|
const invokeLater = fn => {
|
|
1456
1456
|
if (!$RAFQueue.length) {
|
|
1457
|
-
$RAF(() => {
|
|
1457
|
+
$RAF$1(() => {
|
|
1458
1458
|
$RAFQueue.forEach(f => f());
|
|
1459
1459
|
$RAFQueue.length = 0;
|
|
1460
1460
|
});
|
|
@@ -2207,25 +2207,14 @@
|
|
|
2207
2207
|
return fnExecutor(expr, ExpressionType.Action);
|
|
2208
2208
|
};
|
|
2209
2209
|
|
|
2210
|
-
// Constants
|
|
2211
|
-
const WIDGET_ID_REGEX = /^(widget-[^_]+)/;
|
|
2212
|
-
const WIDGET_PROPERTY_REGEX = /^widget-[^_]+_(.+)$/;
|
|
2213
|
-
const ARRAY_INDEX_PLACEHOLDER = '[$i]';
|
|
2214
|
-
const ARRAY_INDEX_ZERO = '[0]';
|
|
2215
|
-
const DEBOUNCE_WAIT = 100;
|
|
2216
|
-
const MAX_WATCH_CYCLES = 5;
|
|
2217
2210
|
const registry = new Map();
|
|
2218
2211
|
const watchIdGenerator = new IDGenerator('watch-id-');
|
|
2219
|
-
const FIRST_TIME_WATCH =
|
|
2220
|
-
|
|
2212
|
+
const FIRST_TIME_WATCH = {};
|
|
2213
|
+
Object.freeze(FIRST_TIME_WATCH);
|
|
2214
|
+
const isFirstTimeChange = v => v === FIRST_TIME_WATCH;
|
|
2221
2215
|
let muted = false;
|
|
2222
|
-
let changedByWatch = false;
|
|
2223
|
-
let skipWatchers = false;
|
|
2224
|
-
let ngZone;
|
|
2225
2216
|
let appRef;
|
|
2226
|
-
|
|
2227
|
-
const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
|
|
2228
|
-
const debounce = (fn, wait = DEBOUNCE_WAIT) => {
|
|
2217
|
+
const debounce = (fn, wait = 50) => {
|
|
2229
2218
|
let timeout;
|
|
2230
2219
|
return (...args) => {
|
|
2231
2220
|
window['__zone_symbol__clearTimeout'](timeout);
|
|
@@ -2237,362 +2226,227 @@
|
|
|
2237
2226
|
};
|
|
2238
2227
|
const unMuteWatchers = () => {
|
|
2239
2228
|
muted = false;
|
|
2240
|
-
|
|
2241
|
-
};
|
|
2242
|
-
/**
|
|
2243
|
-
* Extracts widget ID from identifier (e.g., "widget-id23_eventsource" -> "widget-id23")
|
|
2244
|
-
*/
|
|
2245
|
-
const getWidgetId = (identifier) => {
|
|
2246
|
-
if (!identifier || typeof identifier !== 'string') {
|
|
2247
|
-
return null;
|
|
2248
|
-
}
|
|
2249
|
-
const match = identifier.match(WIDGET_ID_REGEX);
|
|
2250
|
-
return match ? match[1] : null;
|
|
2229
|
+
$invokeWatchers(true);
|
|
2251
2230
|
};
|
|
2252
|
-
/**
|
|
2253
|
-
* Extracts property name from identifier (e.g., "widget-id23_eventsource" -> "eventsource")
|
|
2254
|
-
*/
|
|
2255
|
-
const getPropertyName = (identifier) => {
|
|
2256
|
-
if (!identifier || typeof identifier !== 'string') {
|
|
2257
|
-
return identifier;
|
|
2258
|
-
}
|
|
2259
|
-
const match = identifier.match(WIDGET_PROPERTY_REGEX);
|
|
2260
|
-
return match ? match[1] : identifier;
|
|
2261
|
-
};
|
|
2262
|
-
/**
|
|
2263
|
-
* Array consumer wrapper for array-based expressions
|
|
2264
|
-
*/
|
|
2265
2231
|
const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2232
|
+
let data = newVal, formattedData;
|
|
2233
|
+
if (lodashEs.isArray(data)) {
|
|
2234
|
+
formattedData = data.map(function (datum) {
|
|
2235
|
+
return findValueOf(datum, restExpr);
|
|
2236
|
+
});
|
|
2237
|
+
// If resulting structure is an array of array, flatten it
|
|
2238
|
+
if (lodashEs.isArray(formattedData[0])) {
|
|
2239
|
+
formattedData = lodashEs.flatten(formattedData);
|
|
2240
|
+
}
|
|
2241
|
+
listenerFn(formattedData, oldVal);
|
|
2273
2242
|
}
|
|
2274
|
-
listenerFn(formattedData, oldVal);
|
|
2275
2243
|
};
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
const regex = /\[\$i\]/g;
|
|
2244
|
+
const getUpdatedWatcInfo = (expr, acceptsArray, listener) => {
|
|
2245
|
+
// listener doesn't accept array
|
|
2246
|
+
// replace all `[$i]` with `[0]` and return the expression
|
|
2247
|
+
let regex = /\[\$i\]/g, $I = '[$i]', $0 = '[0]';
|
|
2281
2248
|
if (!acceptsArray) {
|
|
2282
2249
|
return {
|
|
2283
|
-
expr: expr.replace(regex,
|
|
2284
|
-
listener
|
|
2250
|
+
'expr': expr.replace(regex, $0),
|
|
2251
|
+
'listener': listener
|
|
2285
2252
|
};
|
|
2286
2253
|
}
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2254
|
+
// listener accepts array
|
|
2255
|
+
// replace all except the last `[$i]` with `[0]` and return the expression.
|
|
2256
|
+
var index = expr.lastIndexOf($I), _expr = expr.substr(0, index).replace($I, $0), restExpr = expr.substr(index + 5), arrayConsumerFn = listener;
|
|
2257
|
+
if (restExpr) {
|
|
2258
|
+
arrayConsumerFn = arrayConsumer.bind(undefined, listener, restExpr);
|
|
2259
|
+
}
|
|
2293
2260
|
return {
|
|
2294
|
-
expr:
|
|
2295
|
-
listener: arrayConsumerFn
|
|
2261
|
+
'expr': _expr,
|
|
2262
|
+
'listener': arrayConsumerFn
|
|
2296
2263
|
};
|
|
2297
2264
|
};
|
|
2298
|
-
/**
|
|
2299
|
-
* Determines if an expression is static (doesn't need to be watched)
|
|
2300
|
-
*/
|
|
2301
|
-
const STATIC_EXPRESSION_NAMES = [
|
|
2302
|
-
"row.getProperty('investment')",
|
|
2303
|
-
"row.getProperty('factsheetLink')",
|
|
2304
|
-
"row.getProperty('isRebalanceEligible')"
|
|
2305
|
-
];
|
|
2306
|
-
const isStaticExpression = (expr) => {
|
|
2307
|
-
if (typeof expr !== 'string') {
|
|
2308
|
-
return false;
|
|
2309
|
-
}
|
|
2310
|
-
const trimmedExpr = expr.trim();
|
|
2311
|
-
// Expressions that always evaluate to localization strings
|
|
2312
|
-
// if (trimmedExpr.includes('appLocale')) {
|
|
2313
|
-
// return true;
|
|
2314
|
-
// }
|
|
2315
|
-
// Hard-coded static expression names
|
|
2316
|
-
if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
|
|
2317
|
-
return true;
|
|
2318
|
-
}
|
|
2319
|
-
return false;
|
|
2320
|
-
};
|
|
2321
|
-
/**
|
|
2322
|
-
* Gets the scope type from the scope object
|
|
2323
|
-
*/
|
|
2324
|
-
const getScopeType = ($scope) => {
|
|
2325
|
-
if (!$scope) {
|
|
2326
|
-
return null;
|
|
2327
|
-
}
|
|
2328
|
-
if ($scope.pageName)
|
|
2329
|
-
return 'Page';
|
|
2330
|
-
if ($scope.prefabName)
|
|
2331
|
-
return 'Prefab';
|
|
2332
|
-
if ($scope.partialName)
|
|
2333
|
-
return 'Partial';
|
|
2334
|
-
// Check for App scope
|
|
2335
|
-
if ($scope.Variables !== undefined &&
|
|
2336
|
-
$scope.Actions !== undefined &&
|
|
2337
|
-
!$scope.pageName &&
|
|
2338
|
-
!$scope.prefabName &&
|
|
2339
|
-
!$scope.partialName) {
|
|
2340
|
-
return 'App';
|
|
2341
|
-
}
|
|
2342
|
-
if ($scope.constructor?.name === 'AppRef') {
|
|
2343
|
-
return 'App';
|
|
2344
|
-
}
|
|
2345
|
-
return null;
|
|
2346
|
-
};
|
|
2347
|
-
/**
|
|
2348
|
-
* Gets scope name based on scope type
|
|
2349
|
-
*/
|
|
2350
|
-
const getScopeName = ($scope, scopeType) => {
|
|
2351
|
-
if (!scopeType || !$scope) {
|
|
2352
|
-
return null;
|
|
2353
|
-
}
|
|
2354
|
-
switch (scopeType) {
|
|
2355
|
-
case 'Prefab': return $scope.prefabName || null;
|
|
2356
|
-
case 'Partial': return $scope.partialName || null;
|
|
2357
|
-
case 'Page': return $scope.pageName || null;
|
|
2358
|
-
default: return null;
|
|
2359
|
-
}
|
|
2360
|
-
};
|
|
2361
|
-
/**
|
|
2362
|
-
* Main watch function
|
|
2363
|
-
*/
|
|
2364
2265
|
const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.nextUid(), doNotClone = false, config = {}, isMuted) => {
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
const watchInfo = getUpdatedWatchInfo(expr, config.arrayType || config.isList || false, listener);
|
|
2266
|
+
if (expr.indexOf('[$i]') !== -1) {
|
|
2267
|
+
let watchInfo = getUpdatedWatcInfo(expr, config && (config.arrayType || config.isList), listener);
|
|
2368
2268
|
expr = watchInfo.expr;
|
|
2369
2269
|
listener = watchInfo.listener;
|
|
2370
2270
|
}
|
|
2371
|
-
// Handle static expressions
|
|
2372
|
-
if (isStaticExpression(expr)) {
|
|
2373
|
-
try {
|
|
2374
|
-
const fn = $parseExpr(expr);
|
|
2375
|
-
const staticValue = fn($scope, $locals);
|
|
2376
|
-
listener(staticValue, FIRST_TIME_WATCH);
|
|
2377
|
-
}
|
|
2378
|
-
catch (e) {
|
|
2379
|
-
console.warn(`Error evaluating static expression '${expr}':`, e);
|
|
2380
|
-
listener(undefined, FIRST_TIME_WATCH);
|
|
2381
|
-
}
|
|
2382
|
-
return () => { }; // No-op unsubscribe
|
|
2383
|
-
}
|
|
2384
2271
|
const fn = $parseExpr(expr);
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
const watchInfo = {
|
|
2388
|
-
fn: fn.bind(null, $scope, $locals),
|
|
2272
|
+
registry.set(identifier, {
|
|
2273
|
+
fn: fn.bind(expr, $scope, $locals),
|
|
2389
2274
|
listener,
|
|
2390
2275
|
expr,
|
|
2391
2276
|
last: FIRST_TIME_WATCH,
|
|
2392
2277
|
doNotClone,
|
|
2393
|
-
isMuted
|
|
2394
|
-
scopeType,
|
|
2395
|
-
scopeName
|
|
2396
|
-
};
|
|
2397
|
-
// Store in registry
|
|
2398
|
-
const widgetId = getWidgetId(identifier);
|
|
2399
|
-
if (widgetId) {
|
|
2400
|
-
const propertyName = getPropertyName(identifier);
|
|
2401
|
-
if (!registry.has(widgetId)) {
|
|
2402
|
-
registry.set(widgetId, {});
|
|
2403
|
-
}
|
|
2404
|
-
const widgetGroup = registry.get(widgetId);
|
|
2405
|
-
widgetGroup[propertyName] = watchInfo;
|
|
2406
|
-
}
|
|
2407
|
-
else {
|
|
2408
|
-
registry.set(identifier, watchInfo);
|
|
2409
|
-
}
|
|
2410
|
-
return () => $unwatch(identifier);
|
|
2411
|
-
};
|
|
2412
|
-
/**
|
|
2413
|
-
* Unwatches a single identifier
|
|
2414
|
-
*/
|
|
2415
|
-
const $unwatch = (identifier) => {
|
|
2416
|
-
const widgetId = getWidgetId(identifier);
|
|
2417
|
-
if (widgetId) {
|
|
2418
|
-
const propertyName = getPropertyName(identifier);
|
|
2419
|
-
const widgetGroup = registry.get(widgetId);
|
|
2420
|
-
if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
|
|
2421
|
-
const watchInfo = widgetGroup[propertyName];
|
|
2422
|
-
if (watchInfo) {
|
|
2423
|
-
delete widgetGroup[propertyName];
|
|
2424
|
-
// Clean up empty widget groups
|
|
2425
|
-
if (Object.keys(widgetGroup).length === 0) {
|
|
2426
|
-
registry.delete(widgetId);
|
|
2427
|
-
}
|
|
2428
|
-
return true;
|
|
2429
|
-
}
|
|
2430
|
-
}
|
|
2431
|
-
}
|
|
2432
|
-
// Fallback to direct lookup
|
|
2433
|
-
if (registry.has(identifier)) {
|
|
2434
|
-
registry.delete(identifier);
|
|
2435
|
-
return true;
|
|
2436
|
-
}
|
|
2437
|
-
return false;
|
|
2438
|
-
};
|
|
2439
|
-
/**
|
|
2440
|
-
* Unwatches all watchers for a specific widget ID
|
|
2441
|
-
*/
|
|
2442
|
-
const $unwatchAll = (widgetId) => {
|
|
2443
|
-
if (!widgetId || typeof widgetId !== 'string') {
|
|
2444
|
-
return 0;
|
|
2445
|
-
}
|
|
2446
|
-
const widgetGroup = registry.get(widgetId);
|
|
2447
|
-
if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
|
|
2448
|
-
const count = Object.keys(widgetGroup).length;
|
|
2449
|
-
registry.delete(widgetId);
|
|
2450
|
-
return count;
|
|
2451
|
-
}
|
|
2452
|
-
// Fallback: find all identifiers starting with this widget ID
|
|
2453
|
-
let removedCount = 0;
|
|
2454
|
-
const identifiersToRemove = [];
|
|
2455
|
-
registry.forEach((_, key) => {
|
|
2456
|
-
if (key.startsWith(widgetId + '_')) {
|
|
2457
|
-
identifiersToRemove.push(key);
|
|
2458
|
-
}
|
|
2459
|
-
});
|
|
2460
|
-
identifiersToRemove.forEach(identifier => {
|
|
2461
|
-
if ($unwatch(identifier)) {
|
|
2462
|
-
removedCount++;
|
|
2463
|
-
}
|
|
2464
|
-
});
|
|
2465
|
-
return removedCount;
|
|
2466
|
-
};
|
|
2467
|
-
/**
|
|
2468
|
-
* Unwatches all watchers for a specific scope (Page, Prefab, Partial, or App)
|
|
2469
|
-
* Now works directly with the main registry instead of separate scoped registries
|
|
2470
|
-
*/
|
|
2471
|
-
const $unwatchAllByScope = (scopeType, scopeName) => {
|
|
2472
|
-
if (!scopeType) {
|
|
2473
|
-
return 0;
|
|
2474
|
-
}
|
|
2475
|
-
let removedCount = 0;
|
|
2476
|
-
const identifiersToRemove = [];
|
|
2477
|
-
registry.forEach((value, key) => {
|
|
2478
|
-
// Handle grouped structure (widget groups)
|
|
2479
|
-
if (value && typeof value === 'object' && !value.fn) {
|
|
2480
|
-
Object.entries(value).forEach(([propertyName, watchInfo]) => {
|
|
2481
|
-
if (watchInfo?.scopeType === scopeType &&
|
|
2482
|
-
(!scopeName || watchInfo.scopeName === scopeName)) {
|
|
2483
|
-
identifiersToRemove.push(`${key}_${propertyName}`);
|
|
2484
|
-
}
|
|
2485
|
-
});
|
|
2486
|
-
}
|
|
2487
|
-
else {
|
|
2488
|
-
// Direct watchInfo
|
|
2489
|
-
const watchInfo = value;
|
|
2490
|
-
if (watchInfo?.scopeType === scopeType &&
|
|
2491
|
-
(!scopeName || watchInfo.scopeName === scopeName)) {
|
|
2492
|
-
identifiersToRemove.push(key);
|
|
2493
|
-
}
|
|
2494
|
-
}
|
|
2278
|
+
isMuted: isMuted
|
|
2495
2279
|
});
|
|
2496
|
-
|
|
2497
|
-
identifiersToRemove.forEach(identifier => {
|
|
2498
|
-
if ($unwatch(identifier)) {
|
|
2499
|
-
removedCount++;
|
|
2500
|
-
}
|
|
2501
|
-
});
|
|
2502
|
-
return removedCount;
|
|
2503
|
-
};
|
|
2504
|
-
/**
|
|
2505
|
-
* Processes a single watch info during trigger cycle
|
|
2506
|
-
*/
|
|
2507
|
-
const processWatchInfo = (watchInfo) => {
|
|
2508
|
-
if (!watchInfo?.fn || (watchInfo.isMuted?.() ?? false)) {
|
|
2509
|
-
return false;
|
|
2510
|
-
}
|
|
2511
|
-
let newValue;
|
|
2512
|
-
try {
|
|
2513
|
-
newValue = watchInfo.fn();
|
|
2514
|
-
}
|
|
2515
|
-
catch (e) {
|
|
2516
|
-
console.warn(`Error executing expression: '${watchInfo.expr}'`, e);
|
|
2517
|
-
return false;
|
|
2518
|
-
}
|
|
2519
|
-
if (lodashEs.isEqual(newValue, watchInfo.last)) {
|
|
2520
|
-
return false;
|
|
2521
|
-
}
|
|
2522
|
-
// Change detected
|
|
2523
|
-
changedByWatch = true;
|
|
2524
|
-
watchInfo.last = lodashEs.isObject(newValue) && !watchInfo.doNotClone
|
|
2525
|
-
? lodashEs.clone(newValue)
|
|
2526
|
-
: newValue;
|
|
2527
|
-
watchInfo.listener(newValue, watchInfo.last === newValue ? FIRST_TIME_WATCH : watchInfo.last);
|
|
2528
|
-
changedByWatch = false;
|
|
2529
|
-
return true;
|
|
2280
|
+
return () => $unwatch(identifier);
|
|
2530
2281
|
};
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2282
|
+
const $unwatch = identifier => registry.delete(identifier);
|
|
2283
|
+
let changedByWatch = false;
|
|
2284
|
+
const $RAF = window.requestAnimationFrame;
|
|
2285
|
+
let ngZone;
|
|
2286
|
+
const triggerWatchers = (ignoreMuted) => {
|
|
2535
2287
|
if (muted && !ignoreMuted) {
|
|
2536
2288
|
return;
|
|
2537
2289
|
}
|
|
2290
|
+
log(".......................triggerWatchers.................................");
|
|
2291
|
+
const limit = 5;
|
|
2538
2292
|
let pass = 1;
|
|
2539
2293
|
let changeDetected;
|
|
2540
2294
|
do {
|
|
2541
2295
|
changeDetected = false;
|
|
2542
|
-
registry.forEach(
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
Object.values(value).forEach((watchInfo) => {
|
|
2546
|
-
if (processWatchInfo(watchInfo)) {
|
|
2547
|
-
changeDetected = true;
|
|
2548
|
-
}
|
|
2549
|
-
});
|
|
2296
|
+
registry.forEach(watchInfo => {
|
|
2297
|
+
if (watchInfo.isMuted && watchInfo.isMuted()) {
|
|
2298
|
+
return;
|
|
2550
2299
|
}
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2300
|
+
const fn = watchInfo.fn;
|
|
2301
|
+
const listener = watchInfo.listener;
|
|
2302
|
+
const ov = watchInfo.last;
|
|
2303
|
+
let nv;
|
|
2304
|
+
try {
|
|
2305
|
+
nv = fn();
|
|
2306
|
+
}
|
|
2307
|
+
catch (e) {
|
|
2308
|
+
console.warn(`error in executing expression: '${watchInfo.expr}'`);
|
|
2309
|
+
}
|
|
2310
|
+
if (!lodashEs.isEqual(nv, ov)) {
|
|
2311
|
+
changeDetected = true;
|
|
2312
|
+
changedByWatch = true;
|
|
2313
|
+
watchInfo.last = nv;
|
|
2314
|
+
// @ts-ignore
|
|
2315
|
+
if (lodashEs.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
|
|
2316
|
+
watchInfo.last = lodashEs.clone(nv);
|
|
2555
2317
|
}
|
|
2318
|
+
listener(nv, ov);
|
|
2319
|
+
resetChangeFromWatch();
|
|
2556
2320
|
}
|
|
2557
2321
|
});
|
|
2558
2322
|
pass++;
|
|
2559
|
-
} while (changeDetected && pass <
|
|
2560
|
-
if (changeDetected && pass ===
|
|
2561
|
-
console.warn(`
|
|
2323
|
+
} while (changeDetected && pass < limit);
|
|
2324
|
+
if (changeDetected && pass === limit) {
|
|
2325
|
+
console.warn(`Number of watch cycles gone above set limit of: ${limit} `);
|
|
2562
2326
|
}
|
|
2563
2327
|
};
|
|
2564
|
-
|
|
2565
|
-
const
|
|
2566
|
-
ngZone = zone;
|
|
2567
|
-
};
|
|
2568
|
-
const setAppRef = (ref) => {
|
|
2328
|
+
const setNgZone = zone => ngZone = zone;
|
|
2329
|
+
const setAppRef = ref => {
|
|
2569
2330
|
appRef = ref;
|
|
2570
2331
|
};
|
|
2571
2332
|
const isChangeFromWatch = () => changedByWatch;
|
|
2572
|
-
const resetChangeFromWatch = () =>
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
skipWatchers = true;
|
|
2578
|
-
ngZone.run(() => triggerWatchers());
|
|
2579
|
-
}, DEBOUNCE_WAIT);
|
|
2333
|
+
const resetChangeFromWatch = () => changedByWatch = false;
|
|
2334
|
+
window.watchRegistry = registry;
|
|
2335
|
+
let scheduled = false, rerunRequested = false, isRunning = false, consecutiveReruns = 0;
|
|
2336
|
+
const MAX_PASSES = 5, DEBOUNCE_TIME = 200, MAX_CONSECUTIVE_RERUNS = 3;
|
|
2337
|
+
window.__WM_DEBUG_WATCHERS__ = false;
|
|
2580
2338
|
const $invokeWatchers = (force = false, ignoreMuted = false) => {
|
|
2581
2339
|
if (force) {
|
|
2582
2340
|
triggerWatchers(ignoreMuted);
|
|
2583
2341
|
}
|
|
2584
2342
|
else {
|
|
2343
|
+
scheduleExecution(ignoreMuted);
|
|
2344
|
+
}
|
|
2345
|
+
};
|
|
2346
|
+
function scheduleExecution(ignoreMuted) {
|
|
2347
|
+
if (scheduled) {
|
|
2348
|
+
rerunRequested = true;
|
|
2349
|
+
return;
|
|
2350
|
+
}
|
|
2351
|
+
scheduled = true;
|
|
2352
|
+
// Reset consecutive rerun counter when scheduling from outside
|
|
2353
|
+
// (not from within executeWatchers rerun logic)
|
|
2354
|
+
if (!isRunning) {
|
|
2355
|
+
consecutiveReruns = 0;
|
|
2356
|
+
}
|
|
2357
|
+
debouncedExecute(ignoreMuted);
|
|
2358
|
+
}
|
|
2359
|
+
const debouncedExecute = debounce((ignoreMuted) => {
|
|
2360
|
+
scheduled = false;
|
|
2361
|
+
executeWatchers(ignoreMuted);
|
|
2362
|
+
}, DEBOUNCE_TIME);
|
|
2363
|
+
function executeWatchers(ignoreMuted) {
|
|
2364
|
+
if (isRunning) {
|
|
2365
|
+
rerunRequested = true;
|
|
2366
|
+
return;
|
|
2367
|
+
}
|
|
2368
|
+
isRunning = true;
|
|
2369
|
+
let actuallyChanged = false;
|
|
2370
|
+
ngZone.runOutsideAngular(() => {
|
|
2371
|
+
let pass = 1;
|
|
2372
|
+
let changeDetected;
|
|
2373
|
+
do {
|
|
2374
|
+
changeDetected = false;
|
|
2375
|
+
log(`-------executeWatchers (run #${consecutiveReruns + 1})--------- `);
|
|
2376
|
+
registry.forEach(watchInfo => {
|
|
2377
|
+
if (watchInfo.isMuted && watchInfo.isMuted()) {
|
|
2378
|
+
return;
|
|
2379
|
+
}
|
|
2380
|
+
const fn = watchInfo.fn;
|
|
2381
|
+
const listener = watchInfo.listener;
|
|
2382
|
+
const ov = watchInfo.last;
|
|
2383
|
+
let nv;
|
|
2384
|
+
try {
|
|
2385
|
+
nv = fn();
|
|
2386
|
+
}
|
|
2387
|
+
catch (e) {
|
|
2388
|
+
console.warn(`error in executing expression: '${watchInfo.expr}'`);
|
|
2389
|
+
}
|
|
2390
|
+
if (!lodashEs.isEqual(nv, ov)) {
|
|
2391
|
+
changeDetected = true;
|
|
2392
|
+
actuallyChanged = true;
|
|
2393
|
+
changedByWatch = true;
|
|
2394
|
+
watchInfo.last = nv;
|
|
2395
|
+
// @ts-ignore
|
|
2396
|
+
if (lodashEs.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
|
|
2397
|
+
watchInfo.last = lodashEs.clone(nv);
|
|
2398
|
+
}
|
|
2399
|
+
listener(nv, ov);
|
|
2400
|
+
resetChangeFromWatch();
|
|
2401
|
+
}
|
|
2402
|
+
});
|
|
2403
|
+
pass++;
|
|
2404
|
+
} while (changeDetected && pass < MAX_PASSES);
|
|
2405
|
+
});
|
|
2406
|
+
isRunning = false;
|
|
2407
|
+
// Trigger Angular change detection if watchers actually changed values
|
|
2408
|
+
if (actuallyChanged) {
|
|
2409
|
+
ngZone.run(() => {
|
|
2410
|
+
log(`-------DONE (changes detected)--------- `);
|
|
2411
|
+
});
|
|
2412
|
+
}
|
|
2413
|
+
else {
|
|
2414
|
+
log(`-------DONE (no changes)--------- `);
|
|
2415
|
+
}
|
|
2416
|
+
// 🔥 collapse ALL mid-run triggers into ONE rerun
|
|
2417
|
+
// BUT limit consecutive reruns to prevent infinite loops
|
|
2418
|
+
if (rerunRequested) {
|
|
2419
|
+
rerunRequested = false;
|
|
2420
|
+
if (consecutiveReruns < MAX_CONSECUTIVE_RERUNS) {
|
|
2421
|
+
consecutiveReruns++;
|
|
2422
|
+
log(`[Watcher] Scheduling rerun #${consecutiveReruns} (requested during execution)`);
|
|
2423
|
+
scheduleExecution(ignoreMuted);
|
|
2424
|
+
}
|
|
2425
|
+
else {
|
|
2426
|
+
consecutiveReruns = 0;
|
|
2427
|
+
log(`[Watcher] ⚠️ Stopped infinite loop! Max consecutive reruns (${MAX_CONSECUTIVE_RERUNS}) reached. This usually means watcher listeners are triggering more change detection.`);
|
|
2428
|
+
}
|
|
2429
|
+
}
|
|
2430
|
+
else {
|
|
2431
|
+
// No rerun requested - reset counter
|
|
2432
|
+
consecutiveReruns = 0;
|
|
2433
|
+
}
|
|
2434
|
+
}
|
|
2435
|
+
/*export const $invokeWatchers = (force?: boolean, ignoreMuted?: boolean) => {
|
|
2436
|
+
if (force) {
|
|
2437
|
+
triggerWatchers(ignoreMuted);
|
|
2438
|
+
} else {
|
|
2439
|
+
|
|
2585
2440
|
if (skipWatchers) {
|
|
2586
2441
|
skipWatchers = false;
|
|
2587
2442
|
return;
|
|
2588
2443
|
}
|
|
2589
2444
|
debouncedTriggerWatchers();
|
|
2590
2445
|
}
|
|
2591
|
-
}
|
|
2446
|
+
};*/
|
|
2592
2447
|
const $appDigest = (() => {
|
|
2593
2448
|
let queued = false;
|
|
2594
|
-
|
|
2595
|
-
return (force = false) => {
|
|
2449
|
+
return (force) => {
|
|
2596
2450
|
if (!appRef) {
|
|
2597
2451
|
return;
|
|
2598
2452
|
}
|
|
@@ -2604,16 +2458,21 @@
|
|
|
2604
2458
|
if (queued) {
|
|
2605
2459
|
return;
|
|
2606
2460
|
}
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2461
|
+
else {
|
|
2462
|
+
queued = true;
|
|
2463
|
+
$RAF(() => {
|
|
2464
|
+
ngZone.run(() => appRef.tick());
|
|
2465
|
+
queued = false;
|
|
2466
|
+
});
|
|
2467
|
+
}
|
|
2612
2468
|
}
|
|
2613
2469
|
};
|
|
2614
2470
|
})();
|
|
2615
|
-
|
|
2616
|
-
|
|
2471
|
+
function log(message) {
|
|
2472
|
+
if (window.__WM_DEBUG_WATCHERS__) {
|
|
2473
|
+
console.log(message);
|
|
2474
|
+
}
|
|
2475
|
+
}
|
|
2617
2476
|
|
|
2618
2477
|
exports.ComponentType = void 0;
|
|
2619
2478
|
(function (ComponentType) {
|
|
@@ -5453,8 +5312,6 @@
|
|
|
5453
5312
|
exports.$parseEvent = $parseEvent;
|
|
5454
5313
|
exports.$parseExpr = $parseExpr;
|
|
5455
5314
|
exports.$unwatch = $unwatch;
|
|
5456
|
-
exports.$unwatchAll = $unwatchAll;
|
|
5457
|
-
exports.$unwatchAllByScope = $unwatchAllByScope;
|
|
5458
5315
|
exports.$watch = $watch;
|
|
5459
5316
|
exports.AbstractDialogService = AbstractDialogService;
|
|
5460
5317
|
exports.AbstractHttpService = AbstractHttpService;
|
|
@@ -8,7 +8,7 @@ export * from './enums/enums';
|
|
|
8
8
|
export * from './utils/event-notifier';
|
|
9
9
|
export { $parseExpr, $parseEvent, registerFnByExpr, setPipeProvider, getFnByExpr, getFnForBindExpr, getFnForEventExpr } from './utils/expression-parser';
|
|
10
10
|
export { isDefined, isObject, toBoolean, isIE, isAndroid, isAndroidTablet, isIphone, isIpod, isIpad, isIos, isSafari, isLargeTabletLandscape, isLargeTabletPortrait, isMobile, getAndroidVersion, isKitkatDevice, encodeUrl, encodeUrlParams, initCaps, spaceSeparate, replaceAt, periodSeparate, prettifyLabel, deHyphenate, prettifyLabels, isInsecureContentRequest, stringStartsWith, getEvaluatedExprValue, isImageFile, isAudioFile, isVideoFile, isValidImageUrl, isValidWebURL, getResourceURL, triggerFn, hasOffsetStr, getFormattedDate, getDateObj, addEventListenerOnElement, getClonedObject, getFiles, generateGUId, validateAccessRoles, getValidJSON, xmlToJson, findValueOf, extractType, isNumberType, isEmptyObject, scrollToElement, isElementInViewport, isPageable, replace, isDateTimeType, getValidDateObject, getNativeDateObject, getBlob, isEqualWithFields, loadStyleSheet, loadStyleSheets, loadScript, loadScripts, _WM_APP_PROJECT, setSessionStorageItem, getSessionStorageItem, noop, convertToBlob, AppConstants, openLink, fetchContent, toPromise, retryIfFails, getAbortableDefer, createCSSRule, getUrlParams, getMomentLocaleObject, getRouteNameFromLink, isAppleProduct, defer, executePromiseChain, isDataSourceEqual, validateDataSourceCtx, processFilterExpBindNode, extendProto, removeExtraSlashes, getDisplayDateTimeFormat, addForIdAttributes, adjustContainerPosition, adjustContainerRightEdges, setTranslation3dPosition, getWebkitTraslationMatrix, closePopover, detectChanges, triggerItemAction, getDatasourceFromExpr, extractCurrentItemExpr, findRootContainer, VALIDATOR, transformFileURI, appendScriptToHead, getAppSetting, setListClass, findParent, getNavClass, getSheetPositionClass } from './utils/utils';
|
|
11
|
-
export { FIRST_TIME_WATCH, isFirstTimeChange, debounce, muteWatchers, unMuteWatchers, $watch, $unwatch,
|
|
11
|
+
export { FIRST_TIME_WATCH, isFirstTimeChange, debounce, muteWatchers, unMuteWatchers, $watch, $unwatch, setNgZone, setAppRef, isChangeFromWatch, resetChangeFromWatch, $invokeWatchers, $appDigest } from './utils/watcher';
|
|
12
12
|
export * from './utils/id-generator';
|
|
13
13
|
export * from './types/types';
|
|
14
14
|
export { Viewport } from './services/viewport.service';
|
|
@@ -23,4 +23,4 @@ export { StatePersistence } from './services/state-persistence.service';
|
|
|
23
23
|
export { PaginationService } from './services/pagination.service';
|
|
24
24
|
export * from './utils/wm-project-properties';
|
|
25
25
|
export * from './utils/lru-cache';
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsT0FBTyxFQUNILFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLFdBQVcsRUFDWCxXQUFXLEVBQ1gsTUFBTSxFQUNOLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsYUFBYSxFQUNiLFdBQVcsRUFDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFFSCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDcEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBRUgsU0FBUyxFQUNULFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixhQUFhLEVBQ2IsY0FBYyxFQUNkLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLFlBQVksRUFDWixTQUFTLEVBQ1QsV0FBVyxFQUNYLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLE9BQU8sRUFDUCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osYUFBYSxFQUNiLFlBQVksRUFDWixRQUFRLEVBQ1IsWUFBWSxFQUNaLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsS0FBSyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLFlBQVksRUFDWixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxxQkFBcUIsRUFDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFlBQVksRUFDWixjQUFjLEVBQ2QsTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixFQUNqQixvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLFVBQVUsRUFDYixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxlQUFlLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBaUIsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgY29yZVxuICovXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2J1aWxkLXV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzL2N1cnJlbmN5LWNvbnN0YW50cyc7XG5leHBvcnQge1xuICAgIGFwcGVuZE5vZGUsXG4gICAgaW5zZXJ0QmVmb3JlLFxuICAgIGluc2VydEFmdGVyLFxuICAgIHJlbW92ZU5vZGUsXG4gICAgcmVtb3ZlQ2xhc3MsXG4gICAgYWRkQ2xhc3MsXG4gICAgc3dpdGNoQ2xhc3MsXG4gICAgdG9nZ2xlQ2xhc3MsXG4gICAgc2V0Q1NTLFxuICAgIHNldENTU0Zyb21PYmosXG4gICAgc2V0UHJvcGVydHksXG4gICAgc2V0QXR0cixcbiAgICBzZXRIdG1sLFxuICAgIHJlbW92ZUF0dHIsXG4gICAgY3JlYXRlRWxlbWVudCxcbiAgICB0b0RpbWVuc2lvblxufSBmcm9tICcuL3V0aWxzL2RvbSc7XG5leHBvcnQgKiBmcm9tICcuL2VudW1zL2VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvZXZlbnQtbm90aWZpZXInO1xuZXhwb3J0IHtcbiAgICBQYXJzZUV4cHJSZXN1bHQsXG4gICAgJHBhcnNlRXhwcixcbiAgICAkcGFyc2VFdmVudCxcbiAgICByZWdpc3RlckZuQnlFeHByLFxuICAgIHNldFBpcGVQcm92aWRlcixcbiAgICBnZXRGbkJ5RXhwcixcbiAgICBnZXRGbkZvckJpbmRFeHByLFxuICAgIGdldEZuRm9yRXZlbnRFeHByXG59IGZyb20gJy4vdXRpbHMvZXhwcmVzc2lvbi1wYXJzZXInO1xuZXhwb3J0IHtcbiAgICBFVkVOVF9MSUZFLFxuICAgIGlzRGVmaW5lZCxcbiAgICBpc09iamVjdCxcbiAgICB0b0Jvb2xlYW4sXG4gICAgaXNJRSxcbiAgICBpc0FuZHJvaWQsXG4gICAgaXNBbmRyb2lkVGFibGV0LFxuICAgIGlzSXBob25lLFxuICAgIGlzSXBvZCxcbiAgICBpc0lwYWQsXG4gICAgaXNJb3MsXG4gICAgaXNTYWZhcmksXG4gICAgaXNMYXJnZVRhYmxldExhbmRzY2FwZSxcbiAgICBpc0xhcmdlVGFibGV0UG9ydHJhaXQsXG4gICAgaXNNb2JpbGUsXG4gICAgZ2V0QW5kcm9pZFZlcnNpb24sXG4gICAgaXNLaXRrYXREZXZpY2UsXG4gICAgZW5jb2RlVXJsLFxuICAgIGVuY29kZVVybFBhcmFtcyxcbiAgICBpbml0Q2FwcyxcbiAgICBzcGFjZVNlcGFyYXRlLFxuICAgIHJlcGxhY2VBdCxcbiAgICBwZXJpb2RTZXBhcmF0ZSxcbiAgICBwcmV0dGlmeUxhYmVsLFxuICAgIGRlSHlwaGVuYXRlLFxuICAgIHByZXR0aWZ5TGFiZWxzLFxuICAgIGlzSW5zZWN1cmVDb250ZW50UmVxdWVzdCxcbiAgICBzdHJpbmdTdGFydHNXaXRoLFxuICAgIGdldEV2YWx1YXRlZEV4cHJWYWx1ZSxcbiAgICBpc0ltYWdlRmlsZSxcbiAgICBpc0F1ZGlvRmlsZSxcbiAgICBpc1ZpZGVvRmlsZSxcbiAgICBpc1ZhbGlkSW1hZ2VVcmwsXG4gICAgaXNWYWxpZFdlYlVSTCxcbiAgICBnZXRSZXNvdXJjZVVSTCxcbiAgICB0cmlnZ2VyRm4sXG4gICAgaGFzT2Zmc2V0U3RyLFxuICAgIGdldEZvcm1hdHRlZERhdGUsXG4gICAgZ2V0RGF0ZU9iaixcbiAgICBhZGRFdmVudExpc3RlbmVyT25FbGVtZW50LFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBnZXRGaWxlcyxcbiAgICBnZW5lcmF0ZUdVSWQsXG4gICAgdmFsaWRhdGVBY2Nlc3NSb2xlcyxcbiAgICBnZXRWYWxpZEpTT04sXG4gICAgeG1sVG9Kc29uLFxuICAgIGZpbmRWYWx1ZU9mLFxuICAgIGV4dHJhY3RUeXBlLFxuICAgIGlzTnVtYmVyVHlwZSxcbiAgICBpc0VtcHR5T2JqZWN0LFxuICAgIHNjcm9sbFRvRWxlbWVudCxcbiAgICBpc0VsZW1lbnRJblZpZXdwb3J0LFxuICAgIGlzUGFnZWFibGUsXG4gICAgcmVwbGFjZSxcbiAgICBpc0RhdGVUaW1lVHlwZSxcbiAgICBnZXRWYWxpZERhdGVPYmplY3QsXG4gICAgZ2V0TmF0aXZlRGF0ZU9iamVjdCxcbiAgICBnZXRCbG9iLFxuICAgIGlzRXF1YWxXaXRoRmllbGRzLFxuICAgIGxvYWRTdHlsZVNoZWV0LFxuICAgIGxvYWRTdHlsZVNoZWV0cyxcbiAgICBsb2FkU2NyaXB0LFxuICAgIGxvYWRTY3JpcHRzLFxuICAgIF9XTV9BUFBfUFJPSkVDVCxcbiAgICBzZXRTZXNzaW9uU3RvcmFnZUl0ZW0sXG4gICAgZ2V0U2Vzc2lvblN0b3JhZ2VJdGVtLFxuICAgIG5vb3AsXG4gICAgY29udmVydFRvQmxvYixcbiAgICBBcHBDb25zdGFudHMsXG4gICAgb3BlbkxpbmssXG4gICAgZmV0Y2hDb250ZW50LFxuICAgIHRvUHJvbWlzZSxcbiAgICByZXRyeUlmRmFpbHMsXG4gICAgZ2V0QWJvcnRhYmxlRGVmZXIsXG4gICAgY3JlYXRlQ1NTUnVsZSxcbiAgICBnZXRVcmxQYXJhbXMsXG4gICAgZ2V0TW9tZW50TG9jYWxlT2JqZWN0LFxuICAgIGdldFJvdXRlTmFtZUZyb21MaW5rLFxuICAgIGlzQXBwbGVQcm9kdWN0LFxuICAgIGRlZmVyLFxuICAgIGV4ZWN1dGVQcm9taXNlQ2hhaW4sXG4gICAgaXNEYXRhU291cmNlRXF1YWwsXG4gICAgdmFsaWRhdGVEYXRhU291cmNlQ3R4LFxuICAgIHByb2Nlc3NGaWx0ZXJFeHBCaW5kTm9kZSxcbiAgICBleHRlbmRQcm90byxcbiAgICByZW1vdmVFeHRyYVNsYXNoZXMsXG4gICAgZ2V0RGlzcGxheURhdGVUaW1lRm9ybWF0LFxuICAgIGFkZEZvcklkQXR0cmlidXRlcyxcbiAgICBhZGp1c3RDb250YWluZXJQb3NpdGlvbixcbiAgICBhZGp1c3RDb250YWluZXJSaWdodEVkZ2VzLFxuICAgIHNldFRyYW5zbGF0aW9uM2RQb3NpdGlvbixcbiAgICBnZXRXZWJraXRUcmFzbGF0aW9uTWF0cml4LFxuICAgIGNsb3NlUG9wb3ZlcixcbiAgICBkZXRlY3RDaGFuZ2VzLFxuICAgIHRyaWdnZXJJdGVtQWN0aW9uLFxuICAgIGdldERhdGFzb3VyY2VGcm9tRXhwcixcbiAgICBleHRyYWN0Q3VycmVudEl0ZW1FeHByLFxuICAgIGZpbmRSb290Q29udGFpbmVyLFxuICAgIFZBTElEQVRPUixcbiAgICB0cmFuc2Zvcm1GaWxlVVJJLFxuICAgIGFwcGVuZFNjcmlwdFRvSGVhZCxcbiAgICBnZXRBcHBTZXR0aW5nLFxuICAgIHNldExpc3RDbGFzcyxcbiAgICBmaW5kUGFyZW50LFxuICAgIGdldE5hdkNsYXNzLFxuICAgIGdldFNoZWV0UG9zaXRpb25DbGFzc1xufSBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmV4cG9ydCB7XG4gICAgRklSU1RfVElNRV9XQVRDSCxcbiAgICBpc0ZpcnN0VGltZUNoYW5nZSxcbiAgICBkZWJvdW5jZSxcbiAgICBtdXRlV2F0Y2hlcnMsXG4gICAgdW5NdXRlV2F0Y2hlcnMsXG4gICAgJHdhdGNoLFxuICAgICR1bndhdGNoLFxuICAgIHNldE5nWm9uZSxcbiAgICBzZXRBcHBSZWYsXG4gICAgaXNDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgcmVzZXRDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgICRhcHBEaWdlc3Rcbn0gZnJvbSAnLi91dGlscy93YXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvaWQtZ2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0IHsgVmlld3BvcnQsIFZpZXdwb3J0RXZlbnQgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jb25zdGFudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXR5cGUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXdpZGdldC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXNlci1jdXN0b20tcGlwZS1tYW5hZ2VyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jdXN0b20taWNvbnMtbG9hZGVyLnNlcnZpY2UnO1xuZXhwb3J0IHsgU3RhdGVQZXJzaXN0ZW5jZSB9IGZyb20gJy4vc2VydmljZXMvc3RhdGUtcGVyc2lzdGVuY2Uuc2VydmljZSc7XG5leHBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcGFnaW5hdGlvbi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvd20tcHJvamVjdC1wcm9wZXJ0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvbHJ1LWNhY2hlJztcbiJdfQ==
|