@wavemaker/app-ng-runtime 11.14.1-3.6306 → 11.14.1-32.647748
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 -22
- package/components/base/esm2022/pipes/custom-pipes.mjs +1 -1
- package/components/base/esm2022/widgets/common/base/base.component.mjs +8 -24
- package/components/base/fesm2022/index.mjs +7 -23
- package/components/base/fesm2022/index.mjs.map +1 -1
- package/components/chart/bundles/index.umd.js +2 -2
- package/components/chart/esm2022/chart.utils.mjs +3 -3
- package/components/chart/fesm2022/index.mjs +2 -2
- package/components/chart/fesm2022/index.mjs.map +1 -1
- package/components/containers/wizard/bundles/index.umd.js +21 -2
- package/components/containers/wizard/esm2022/wizard-step/wizard-step.component.mjs +3 -1
- package/components/containers/wizard/esm2022/wizard.component.mjs +20 -3
- package/components/containers/wizard/fesm2022/index.mjs +21 -2
- package/components/containers/wizard/fesm2022/index.mjs.map +1 -1
- package/components/containers/wizard/wizard-step/wizard-step.component.d.ts +2 -0
- package/components/data/pagination/bundles/index.umd.js +6 -1
- package/components/data/pagination/esm2022/pagination.component.mjs +7 -2
- package/components/data/pagination/fesm2022/index.mjs +6 -1
- package/components/data/pagination/fesm2022/index.mjs.map +1 -1
- package/components/data/table/bundles/index.umd.js +331 -23
- package/components/data/table/esm2022/table-action/table-action.directive.mjs +8 -1
- package/components/data/table/esm2022/table-column/table-column.directive.mjs +108 -4
- package/components/data/table/esm2022/table-column-group/table-column-group.directive.mjs +9 -1
- package/components/data/table/esm2022/table-cud.directive.mjs +22 -5
- package/components/data/table/esm2022/table-filter.directive.mjs +43 -4
- package/components/data/table/esm2022/table-row/table-row.directive.mjs +8 -1
- package/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +8 -1
- package/components/data/table/esm2022/table.component.mjs +134 -15
- package/components/data/table/fesm2022/index.mjs +333 -25
- package/components/data/table/fesm2022/index.mjs.map +1 -1
- package/components/data/table/table-action/table-action.directive.d.ts +3 -2
- package/components/data/table/table-column/table-column.directive.d.ts +3 -2
- package/components/data/table/table-column-group/table-column-group.directive.d.ts +3 -2
- package/components/data/table/table-cud.directive.d.ts +3 -1
- package/components/data/table/table-filter.directive.d.ts +3 -1
- package/components/data/table/table-row/table-row.directive.d.ts +3 -2
- package/components/data/table/table-row-action/table-row-action.directive.d.ts +3 -2
- package/components/data/table/table.component.d.ts +10 -0
- package/components/page/default/bundles/index.umd.js +1 -0
- package/components/page/default/esm2022/page.directive.mjs +2 -1
- package/components/page/default/fesm2022/index.mjs +1 -0
- package/components/page/default/fesm2022/index.mjs.map +1 -1
- package/core/bundles/index.umd.js +185 -330
- package/core/esm2022/public_api.mjs +2 -2
- package/core/esm2022/utils/watcher.mjs +189 -328
- package/core/fesm2022/index.mjs +192 -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/locales/moment-timezone/moment-timezone-with-data.js +179 -27
- package/npm-shrinkwrap.json +2 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/runtime/base/bundles/index.umd.js +20 -46
- package/runtime/base/components/base-prefab.component.d.ts +6 -4
- package/runtime/base/esm2022/components/app-component/app.component.mjs +2 -7
- package/runtime/base/esm2022/components/base-page.component.mjs +2 -8
- package/runtime/base/esm2022/components/base-partial.component.mjs +3 -11
- package/runtime/base/esm2022/components/base-prefab.component.mjs +21 -21
- package/runtime/base/esm2022/components/base-spa-page.component.mjs +2 -9
- package/runtime/base/fesm2022/index.mjs +21 -47
- 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
- package/scripts/datatable/datatable.js +336 -33
|
@@ -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
|
});
|
|
@@ -2191,25 +2191,14 @@
|
|
|
2191
2191
|
return fnExecutor(expr, ExpressionType.Action);
|
|
2192
2192
|
};
|
|
2193
2193
|
|
|
2194
|
-
// Constants
|
|
2195
|
-
const WIDGET_ID_REGEX = /^(widget-[^_]+)/;
|
|
2196
|
-
const WIDGET_PROPERTY_REGEX = /^widget-[^_]+_(.+)$/;
|
|
2197
|
-
const ARRAY_INDEX_PLACEHOLDER = '[$i]';
|
|
2198
|
-
const ARRAY_INDEX_ZERO = '[0]';
|
|
2199
|
-
const DEBOUNCE_WAIT = 100;
|
|
2200
|
-
const MAX_WATCH_CYCLES = 5;
|
|
2201
2194
|
const registry = new Map();
|
|
2202
2195
|
const watchIdGenerator = new IDGenerator('watch-id-');
|
|
2203
|
-
const FIRST_TIME_WATCH =
|
|
2204
|
-
|
|
2196
|
+
const FIRST_TIME_WATCH = {};
|
|
2197
|
+
Object.freeze(FIRST_TIME_WATCH);
|
|
2198
|
+
const isFirstTimeChange = v => v === FIRST_TIME_WATCH;
|
|
2205
2199
|
let muted = false;
|
|
2206
|
-
let changedByWatch = false;
|
|
2207
|
-
let skipWatchers = false;
|
|
2208
|
-
let ngZone;
|
|
2209
2200
|
let appRef;
|
|
2210
|
-
|
|
2211
|
-
const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
|
|
2212
|
-
const debounce = (fn, wait = DEBOUNCE_WAIT) => {
|
|
2201
|
+
const debounce = (fn, wait = 50) => {
|
|
2213
2202
|
let timeout;
|
|
2214
2203
|
return (...args) => {
|
|
2215
2204
|
window['__zone_symbol__clearTimeout'](timeout);
|
|
@@ -2221,362 +2210,225 @@
|
|
|
2221
2210
|
};
|
|
2222
2211
|
const unMuteWatchers = () => {
|
|
2223
2212
|
muted = false;
|
|
2224
|
-
|
|
2225
|
-
};
|
|
2226
|
-
/**
|
|
2227
|
-
* Extracts widget ID from identifier (e.g., "widget-id23_eventsource" -> "widget-id23")
|
|
2228
|
-
*/
|
|
2229
|
-
const getWidgetId = (identifier) => {
|
|
2230
|
-
if (!identifier || typeof identifier !== 'string') {
|
|
2231
|
-
return null;
|
|
2232
|
-
}
|
|
2233
|
-
const match = identifier.match(WIDGET_ID_REGEX);
|
|
2234
|
-
return match ? match[1] : null;
|
|
2213
|
+
$invokeWatchers(true);
|
|
2235
2214
|
};
|
|
2236
|
-
/**
|
|
2237
|
-
* Extracts property name from identifier (e.g., "widget-id23_eventsource" -> "eventsource")
|
|
2238
|
-
*/
|
|
2239
|
-
const getPropertyName = (identifier) => {
|
|
2240
|
-
if (!identifier || typeof identifier !== 'string') {
|
|
2241
|
-
return identifier;
|
|
2242
|
-
}
|
|
2243
|
-
const match = identifier.match(WIDGET_PROPERTY_REGEX);
|
|
2244
|
-
return match ? match[1] : identifier;
|
|
2245
|
-
};
|
|
2246
|
-
/**
|
|
2247
|
-
* Array consumer wrapper for array-based expressions
|
|
2248
|
-
*/
|
|
2249
2215
|
const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2216
|
+
let data = newVal, formattedData;
|
|
2217
|
+
if (_.isArray(data)) {
|
|
2218
|
+
formattedData = data.map(function (datum) {
|
|
2219
|
+
return findValueOf(datum, restExpr);
|
|
2220
|
+
});
|
|
2221
|
+
// If resulting structure is an array of array, flatten it
|
|
2222
|
+
if (_.isArray(formattedData[0])) {
|
|
2223
|
+
formattedData = _.flatten(formattedData);
|
|
2224
|
+
}
|
|
2225
|
+
listenerFn(formattedData, oldVal);
|
|
2257
2226
|
}
|
|
2258
|
-
listenerFn(formattedData, oldVal);
|
|
2259
2227
|
};
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
const regex = /\[\$i\]/g;
|
|
2228
|
+
const getUpdatedWatcInfo = (expr, acceptsArray, listener) => {
|
|
2229
|
+
// listener doesn't accept array
|
|
2230
|
+
// replace all `[$i]` with `[0]` and return the expression
|
|
2231
|
+
let regex = /\[\$i\]/g, $I = '[$i]', $0 = '[0]';
|
|
2265
2232
|
if (!acceptsArray) {
|
|
2266
2233
|
return {
|
|
2267
|
-
expr: expr.replace(regex,
|
|
2268
|
-
listener
|
|
2234
|
+
'expr': expr.replace(regex, $0),
|
|
2235
|
+
'listener': listener
|
|
2269
2236
|
};
|
|
2270
2237
|
}
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2238
|
+
// listener accepts array
|
|
2239
|
+
// replace all except the last `[$i]` with `[0]` and return the expression.
|
|
2240
|
+
var index = expr.lastIndexOf($I), _expr = expr.substr(0, index).replace($I, $0), restExpr = expr.substr(index + 5), arrayConsumerFn = listener;
|
|
2241
|
+
if (restExpr) {
|
|
2242
|
+
arrayConsumerFn = arrayConsumer.bind(undefined, listener, restExpr);
|
|
2243
|
+
}
|
|
2277
2244
|
return {
|
|
2278
|
-
expr:
|
|
2279
|
-
listener: arrayConsumerFn
|
|
2245
|
+
'expr': _expr,
|
|
2246
|
+
'listener': arrayConsumerFn
|
|
2280
2247
|
};
|
|
2281
2248
|
};
|
|
2282
|
-
/**
|
|
2283
|
-
* Determines if an expression is static (doesn't need to be watched)
|
|
2284
|
-
*/
|
|
2285
|
-
const STATIC_EXPRESSION_NAMES = [
|
|
2286
|
-
"row.getProperty('investment')",
|
|
2287
|
-
"row.getProperty('factsheetLink')",
|
|
2288
|
-
"row.getProperty('isRebalanceEligible')"
|
|
2289
|
-
];
|
|
2290
|
-
const isStaticExpression = (expr) => {
|
|
2291
|
-
if (typeof expr !== 'string') {
|
|
2292
|
-
return false;
|
|
2293
|
-
}
|
|
2294
|
-
const trimmedExpr = expr.trim();
|
|
2295
|
-
// Expressions that always evaluate to localization strings
|
|
2296
|
-
if (trimmedExpr.includes('appLocale')) {
|
|
2297
|
-
return true;
|
|
2298
|
-
}
|
|
2299
|
-
// Hard-coded static expression names
|
|
2300
|
-
if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
|
|
2301
|
-
return true;
|
|
2302
|
-
}
|
|
2303
|
-
return false;
|
|
2304
|
-
};
|
|
2305
|
-
/**
|
|
2306
|
-
* Gets the scope type from the scope object
|
|
2307
|
-
*/
|
|
2308
|
-
const getScopeType = ($scope) => {
|
|
2309
|
-
if (!$scope) {
|
|
2310
|
-
return null;
|
|
2311
|
-
}
|
|
2312
|
-
if ($scope.pageName)
|
|
2313
|
-
return 'Page';
|
|
2314
|
-
if ($scope.prefabName)
|
|
2315
|
-
return 'Prefab';
|
|
2316
|
-
if ($scope.partialName)
|
|
2317
|
-
return 'Partial';
|
|
2318
|
-
// Check for App scope
|
|
2319
|
-
if ($scope.Variables !== undefined &&
|
|
2320
|
-
$scope.Actions !== undefined &&
|
|
2321
|
-
!$scope.pageName &&
|
|
2322
|
-
!$scope.prefabName &&
|
|
2323
|
-
!$scope.partialName) {
|
|
2324
|
-
return 'App';
|
|
2325
|
-
}
|
|
2326
|
-
if ($scope.constructor?.name === 'AppRef') {
|
|
2327
|
-
return 'App';
|
|
2328
|
-
}
|
|
2329
|
-
return null;
|
|
2330
|
-
};
|
|
2331
|
-
/**
|
|
2332
|
-
* Gets scope name based on scope type
|
|
2333
|
-
*/
|
|
2334
|
-
const getScopeName = ($scope, scopeType) => {
|
|
2335
|
-
if (!scopeType || !$scope) {
|
|
2336
|
-
return null;
|
|
2337
|
-
}
|
|
2338
|
-
switch (scopeType) {
|
|
2339
|
-
case 'Prefab': return $scope.prefabName || null;
|
|
2340
|
-
case 'Partial': return $scope.partialName || null;
|
|
2341
|
-
case 'Page': return $scope.pageName || null;
|
|
2342
|
-
default: return null;
|
|
2343
|
-
}
|
|
2344
|
-
};
|
|
2345
|
-
/**
|
|
2346
|
-
* Main watch function
|
|
2347
|
-
*/
|
|
2348
2249
|
const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.nextUid(), doNotClone = false, config = {}, isMuted) => {
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
const watchInfo = getUpdatedWatchInfo(expr, config.arrayType || config.isList || false, listener);
|
|
2250
|
+
if (expr.indexOf('[$i]') !== -1) {
|
|
2251
|
+
let watchInfo = getUpdatedWatcInfo(expr, config && (config.arrayType || config.isList), listener);
|
|
2352
2252
|
expr = watchInfo.expr;
|
|
2353
2253
|
listener = watchInfo.listener;
|
|
2354
2254
|
}
|
|
2355
|
-
// Handle static expressions
|
|
2356
|
-
if (isStaticExpression(expr)) {
|
|
2357
|
-
try {
|
|
2358
|
-
const fn = $parseExpr(expr);
|
|
2359
|
-
const staticValue = fn($scope, $locals);
|
|
2360
|
-
listener(staticValue, FIRST_TIME_WATCH);
|
|
2361
|
-
}
|
|
2362
|
-
catch (e) {
|
|
2363
|
-
console.warn(`Error evaluating static expression '${expr}':`, e);
|
|
2364
|
-
listener(undefined, FIRST_TIME_WATCH);
|
|
2365
|
-
}
|
|
2366
|
-
return () => { }; // No-op unsubscribe
|
|
2367
|
-
}
|
|
2368
2255
|
const fn = $parseExpr(expr);
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
const watchInfo = {
|
|
2372
|
-
fn: fn.bind(null, $scope, $locals),
|
|
2256
|
+
registry.set(identifier, {
|
|
2257
|
+
fn: fn.bind(expr, $scope, $locals),
|
|
2373
2258
|
listener,
|
|
2374
2259
|
expr,
|
|
2375
2260
|
last: FIRST_TIME_WATCH,
|
|
2376
2261
|
doNotClone,
|
|
2377
|
-
isMuted
|
|
2378
|
-
scopeType,
|
|
2379
|
-
scopeName
|
|
2380
|
-
};
|
|
2381
|
-
// Store in registry
|
|
2382
|
-
const widgetId = getWidgetId(identifier);
|
|
2383
|
-
if (widgetId) {
|
|
2384
|
-
const propertyName = getPropertyName(identifier);
|
|
2385
|
-
if (!registry.has(widgetId)) {
|
|
2386
|
-
registry.set(widgetId, {});
|
|
2387
|
-
}
|
|
2388
|
-
const widgetGroup = registry.get(widgetId);
|
|
2389
|
-
widgetGroup[propertyName] = watchInfo;
|
|
2390
|
-
}
|
|
2391
|
-
else {
|
|
2392
|
-
registry.set(identifier, watchInfo);
|
|
2393
|
-
}
|
|
2394
|
-
return () => $unwatch(identifier);
|
|
2395
|
-
};
|
|
2396
|
-
/**
|
|
2397
|
-
* Unwatches a single identifier
|
|
2398
|
-
*/
|
|
2399
|
-
const $unwatch = (identifier) => {
|
|
2400
|
-
const widgetId = getWidgetId(identifier);
|
|
2401
|
-
if (widgetId) {
|
|
2402
|
-
const propertyName = getPropertyName(identifier);
|
|
2403
|
-
const widgetGroup = registry.get(widgetId);
|
|
2404
|
-
if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
|
|
2405
|
-
const watchInfo = widgetGroup[propertyName];
|
|
2406
|
-
if (watchInfo) {
|
|
2407
|
-
delete widgetGroup[propertyName];
|
|
2408
|
-
// Clean up empty widget groups
|
|
2409
|
-
if (Object.keys(widgetGroup).length === 0) {
|
|
2410
|
-
registry.delete(widgetId);
|
|
2411
|
-
}
|
|
2412
|
-
return true;
|
|
2413
|
-
}
|
|
2414
|
-
}
|
|
2415
|
-
}
|
|
2416
|
-
// Fallback to direct lookup
|
|
2417
|
-
if (registry.has(identifier)) {
|
|
2418
|
-
registry.delete(identifier);
|
|
2419
|
-
return true;
|
|
2420
|
-
}
|
|
2421
|
-
return false;
|
|
2422
|
-
};
|
|
2423
|
-
/**
|
|
2424
|
-
* Unwatches all watchers for a specific widget ID
|
|
2425
|
-
*/
|
|
2426
|
-
const $unwatchAll = (widgetId) => {
|
|
2427
|
-
if (!widgetId || typeof widgetId !== 'string') {
|
|
2428
|
-
return 0;
|
|
2429
|
-
}
|
|
2430
|
-
const widgetGroup = registry.get(widgetId);
|
|
2431
|
-
if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
|
|
2432
|
-
const count = Object.keys(widgetGroup).length;
|
|
2433
|
-
registry.delete(widgetId);
|
|
2434
|
-
return count;
|
|
2435
|
-
}
|
|
2436
|
-
// Fallback: find all identifiers starting with this widget ID
|
|
2437
|
-
let removedCount = 0;
|
|
2438
|
-
const identifiersToRemove = [];
|
|
2439
|
-
registry.forEach((_, key) => {
|
|
2440
|
-
if (key.startsWith(widgetId + '_')) {
|
|
2441
|
-
identifiersToRemove.push(key);
|
|
2442
|
-
}
|
|
2443
|
-
});
|
|
2444
|
-
identifiersToRemove.forEach(identifier => {
|
|
2445
|
-
if ($unwatch(identifier)) {
|
|
2446
|
-
removedCount++;
|
|
2447
|
-
}
|
|
2448
|
-
});
|
|
2449
|
-
return removedCount;
|
|
2450
|
-
};
|
|
2451
|
-
/**
|
|
2452
|
-
* Unwatches all watchers for a specific scope (Page, Prefab, Partial, or App)
|
|
2453
|
-
* Now works directly with the main registry instead of separate scoped registries
|
|
2454
|
-
*/
|
|
2455
|
-
const $unwatchAllByScope = (scopeType, scopeName) => {
|
|
2456
|
-
if (!scopeType) {
|
|
2457
|
-
return 0;
|
|
2458
|
-
}
|
|
2459
|
-
let removedCount = 0;
|
|
2460
|
-
const identifiersToRemove = [];
|
|
2461
|
-
registry.forEach((value, key) => {
|
|
2462
|
-
// Handle grouped structure (widget groups)
|
|
2463
|
-
if (value && typeof value === 'object' && !value.fn) {
|
|
2464
|
-
Object.entries(value).forEach(([propertyName, watchInfo]) => {
|
|
2465
|
-
if (watchInfo?.scopeType === scopeType &&
|
|
2466
|
-
(!scopeName || watchInfo.scopeName === scopeName)) {
|
|
2467
|
-
identifiersToRemove.push(`${key}_${propertyName}`);
|
|
2468
|
-
}
|
|
2469
|
-
});
|
|
2470
|
-
}
|
|
2471
|
-
else {
|
|
2472
|
-
// Direct watchInfo
|
|
2473
|
-
const watchInfo = value;
|
|
2474
|
-
if (watchInfo?.scopeType === scopeType &&
|
|
2475
|
-
(!scopeName || watchInfo.scopeName === scopeName)) {
|
|
2476
|
-
identifiersToRemove.push(key);
|
|
2477
|
-
}
|
|
2478
|
-
}
|
|
2262
|
+
isMuted: isMuted
|
|
2479
2263
|
});
|
|
2480
|
-
|
|
2481
|
-
identifiersToRemove.forEach(identifier => {
|
|
2482
|
-
if ($unwatch(identifier)) {
|
|
2483
|
-
removedCount++;
|
|
2484
|
-
}
|
|
2485
|
-
});
|
|
2486
|
-
return removedCount;
|
|
2487
|
-
};
|
|
2488
|
-
/**
|
|
2489
|
-
* Processes a single watch info during trigger cycle
|
|
2490
|
-
*/
|
|
2491
|
-
const processWatchInfo = (watchInfo) => {
|
|
2492
|
-
if (!watchInfo?.fn || (watchInfo.isMuted?.() ?? false)) {
|
|
2493
|
-
return false;
|
|
2494
|
-
}
|
|
2495
|
-
let newValue;
|
|
2496
|
-
try {
|
|
2497
|
-
newValue = watchInfo.fn();
|
|
2498
|
-
}
|
|
2499
|
-
catch (e) {
|
|
2500
|
-
console.warn(`Error executing expression: '${watchInfo.expr}'`, e);
|
|
2501
|
-
return false;
|
|
2502
|
-
}
|
|
2503
|
-
if (lodashEs.isEqual(newValue, watchInfo.last)) {
|
|
2504
|
-
return false;
|
|
2505
|
-
}
|
|
2506
|
-
// Change detected
|
|
2507
|
-
changedByWatch = true;
|
|
2508
|
-
watchInfo.last = lodashEs.isObject(newValue) && !watchInfo.doNotClone
|
|
2509
|
-
? lodashEs.clone(newValue)
|
|
2510
|
-
: newValue;
|
|
2511
|
-
watchInfo.listener(newValue, watchInfo.last === newValue ? FIRST_TIME_WATCH : watchInfo.last);
|
|
2512
|
-
changedByWatch = false;
|
|
2513
|
-
return true;
|
|
2264
|
+
return () => $unwatch(identifier);
|
|
2514
2265
|
};
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2266
|
+
const $unwatch = identifier => registry.delete(identifier);
|
|
2267
|
+
let changedByWatch = false;
|
|
2268
|
+
const $RAF = window.requestAnimationFrame;
|
|
2269
|
+
let ngZone;
|
|
2270
|
+
const triggerWatchers = (ignoreMuted) => {
|
|
2519
2271
|
if (muted && !ignoreMuted) {
|
|
2520
2272
|
return;
|
|
2521
2273
|
}
|
|
2274
|
+
log(".......................triggerWatchers.................................");
|
|
2275
|
+
const limit = 5;
|
|
2522
2276
|
let pass = 1;
|
|
2523
2277
|
let changeDetected;
|
|
2524
2278
|
do {
|
|
2525
2279
|
changeDetected = false;
|
|
2526
|
-
registry.forEach(
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
Object.values(value).forEach((watchInfo) => {
|
|
2530
|
-
if (processWatchInfo(watchInfo)) {
|
|
2531
|
-
changeDetected = true;
|
|
2532
|
-
}
|
|
2533
|
-
});
|
|
2280
|
+
registry.forEach(watchInfo => {
|
|
2281
|
+
if (watchInfo.isMuted && watchInfo.isMuted()) {
|
|
2282
|
+
return;
|
|
2534
2283
|
}
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2284
|
+
const fn = watchInfo.fn;
|
|
2285
|
+
const listener = watchInfo.listener;
|
|
2286
|
+
const ov = watchInfo.last;
|
|
2287
|
+
let nv;
|
|
2288
|
+
try {
|
|
2289
|
+
nv = fn();
|
|
2290
|
+
}
|
|
2291
|
+
catch (e) {
|
|
2292
|
+
console.warn(`error in executing expression: '${watchInfo.expr}'`);
|
|
2293
|
+
}
|
|
2294
|
+
if (!_.isEqual(nv, ov)) {
|
|
2295
|
+
changeDetected = true;
|
|
2296
|
+
changedByWatch = true;
|
|
2297
|
+
watchInfo.last = nv;
|
|
2298
|
+
if (_.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
|
|
2299
|
+
watchInfo.last = _.clone(nv);
|
|
2539
2300
|
}
|
|
2301
|
+
listener(nv, ov);
|
|
2302
|
+
resetChangeFromWatch();
|
|
2540
2303
|
}
|
|
2541
2304
|
});
|
|
2542
2305
|
pass++;
|
|
2543
|
-
} while (changeDetected && pass <
|
|
2544
|
-
if (changeDetected && pass ===
|
|
2545
|
-
console.warn(`
|
|
2306
|
+
} while (changeDetected && pass < limit);
|
|
2307
|
+
if (changeDetected && pass === limit) {
|
|
2308
|
+
console.warn(`Number of watch cycles gone above set limit of: ${limit} `);
|
|
2546
2309
|
}
|
|
2547
2310
|
};
|
|
2548
|
-
|
|
2549
|
-
const
|
|
2550
|
-
ngZone = zone;
|
|
2551
|
-
};
|
|
2552
|
-
const setAppRef = (ref) => {
|
|
2311
|
+
const setNgZone = zone => ngZone = zone;
|
|
2312
|
+
const setAppRef = ref => {
|
|
2553
2313
|
appRef = ref;
|
|
2554
2314
|
};
|
|
2555
2315
|
const isChangeFromWatch = () => changedByWatch;
|
|
2556
|
-
const resetChangeFromWatch = () =>
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
skipWatchers = true;
|
|
2562
|
-
ngZone.run(() => triggerWatchers());
|
|
2563
|
-
}, DEBOUNCE_WAIT);
|
|
2316
|
+
const resetChangeFromWatch = () => changedByWatch = false;
|
|
2317
|
+
window.watchRegistry = registry;
|
|
2318
|
+
let scheduled = false, rerunRequested = false, isRunning = false, consecutiveReruns = 0;
|
|
2319
|
+
const MAX_PASSES = 5, DEBOUNCE_TIME = 200, MAX_CONSECUTIVE_RERUNS = 3;
|
|
2320
|
+
window.__WM_DEBUG_WATCHERS__ = false;
|
|
2564
2321
|
const $invokeWatchers = (force = false, ignoreMuted = false) => {
|
|
2565
2322
|
if (force) {
|
|
2566
2323
|
triggerWatchers(ignoreMuted);
|
|
2567
2324
|
}
|
|
2568
2325
|
else {
|
|
2326
|
+
scheduleExecution(ignoreMuted);
|
|
2327
|
+
}
|
|
2328
|
+
};
|
|
2329
|
+
function scheduleExecution(ignoreMuted) {
|
|
2330
|
+
if (scheduled) {
|
|
2331
|
+
rerunRequested = true;
|
|
2332
|
+
return;
|
|
2333
|
+
}
|
|
2334
|
+
scheduled = true;
|
|
2335
|
+
// Reset consecutive rerun counter when scheduling from outside
|
|
2336
|
+
// (not from within executeWatchers rerun logic)
|
|
2337
|
+
if (!isRunning) {
|
|
2338
|
+
consecutiveReruns = 0;
|
|
2339
|
+
}
|
|
2340
|
+
debouncedExecute(ignoreMuted);
|
|
2341
|
+
}
|
|
2342
|
+
const debouncedExecute = debounce((ignoreMuted) => {
|
|
2343
|
+
scheduled = false;
|
|
2344
|
+
executeWatchers(ignoreMuted);
|
|
2345
|
+
}, DEBOUNCE_TIME);
|
|
2346
|
+
function executeWatchers(ignoreMuted) {
|
|
2347
|
+
if (isRunning) {
|
|
2348
|
+
rerunRequested = true;
|
|
2349
|
+
return;
|
|
2350
|
+
}
|
|
2351
|
+
isRunning = true;
|
|
2352
|
+
let actuallyChanged = false;
|
|
2353
|
+
ngZone.runOutsideAngular(() => {
|
|
2354
|
+
let pass = 1;
|
|
2355
|
+
let changeDetected;
|
|
2356
|
+
do {
|
|
2357
|
+
changeDetected = false;
|
|
2358
|
+
log(`-------executeWatchers (run #${consecutiveReruns + 1})--------- `);
|
|
2359
|
+
registry.forEach(watchInfo => {
|
|
2360
|
+
if (watchInfo.isMuted && watchInfo.isMuted()) {
|
|
2361
|
+
return;
|
|
2362
|
+
}
|
|
2363
|
+
const fn = watchInfo.fn;
|
|
2364
|
+
const listener = watchInfo.listener;
|
|
2365
|
+
const ov = watchInfo.last;
|
|
2366
|
+
let nv;
|
|
2367
|
+
try {
|
|
2368
|
+
nv = fn();
|
|
2369
|
+
}
|
|
2370
|
+
catch (e) {
|
|
2371
|
+
console.warn(`error in executing expression: '${watchInfo.expr}'`);
|
|
2372
|
+
}
|
|
2373
|
+
if (!_.isEqual(nv, ov)) {
|
|
2374
|
+
changeDetected = true;
|
|
2375
|
+
actuallyChanged = true;
|
|
2376
|
+
changedByWatch = true;
|
|
2377
|
+
watchInfo.last = nv;
|
|
2378
|
+
if (_.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
|
|
2379
|
+
watchInfo.last = _.clone(nv);
|
|
2380
|
+
}
|
|
2381
|
+
listener(nv, ov);
|
|
2382
|
+
resetChangeFromWatch();
|
|
2383
|
+
}
|
|
2384
|
+
});
|
|
2385
|
+
pass++;
|
|
2386
|
+
} while (changeDetected && pass < MAX_PASSES);
|
|
2387
|
+
});
|
|
2388
|
+
isRunning = false;
|
|
2389
|
+
// Trigger Angular change detection if watchers actually changed values
|
|
2390
|
+
if (actuallyChanged) {
|
|
2391
|
+
ngZone.run(() => {
|
|
2392
|
+
log(`-------DONE (changes detected)--------- `);
|
|
2393
|
+
});
|
|
2394
|
+
}
|
|
2395
|
+
else {
|
|
2396
|
+
log(`-------DONE (no changes)--------- `);
|
|
2397
|
+
}
|
|
2398
|
+
// 🔥 collapse ALL mid-run triggers into ONE rerun
|
|
2399
|
+
// BUT limit consecutive reruns to prevent infinite loops
|
|
2400
|
+
if (rerunRequested) {
|
|
2401
|
+
rerunRequested = false;
|
|
2402
|
+
if (consecutiveReruns < MAX_CONSECUTIVE_RERUNS) {
|
|
2403
|
+
consecutiveReruns++;
|
|
2404
|
+
log(`[Watcher] Scheduling rerun #${consecutiveReruns} (requested during execution)`);
|
|
2405
|
+
scheduleExecution(ignoreMuted);
|
|
2406
|
+
}
|
|
2407
|
+
else {
|
|
2408
|
+
consecutiveReruns = 0;
|
|
2409
|
+
log(`[Watcher] ⚠️ Stopped infinite loop! Max consecutive reruns (${MAX_CONSECUTIVE_RERUNS}) reached. This usually means watcher listeners are triggering more change detection.`);
|
|
2410
|
+
}
|
|
2411
|
+
}
|
|
2412
|
+
else {
|
|
2413
|
+
// No rerun requested - reset counter
|
|
2414
|
+
consecutiveReruns = 0;
|
|
2415
|
+
}
|
|
2416
|
+
}
|
|
2417
|
+
/*export const $invokeWatchers = (force?: boolean, ignoreMuted?: boolean) => {
|
|
2418
|
+
if (force) {
|
|
2419
|
+
triggerWatchers(ignoreMuted);
|
|
2420
|
+
} else {
|
|
2421
|
+
|
|
2569
2422
|
if (skipWatchers) {
|
|
2570
2423
|
skipWatchers = false;
|
|
2571
2424
|
return;
|
|
2572
2425
|
}
|
|
2573
2426
|
debouncedTriggerWatchers();
|
|
2574
2427
|
}
|
|
2575
|
-
}
|
|
2428
|
+
};*/
|
|
2576
2429
|
const $appDigest = (() => {
|
|
2577
2430
|
let queued = false;
|
|
2578
|
-
|
|
2579
|
-
return (force = false) => {
|
|
2431
|
+
return (force) => {
|
|
2580
2432
|
if (!appRef) {
|
|
2581
2433
|
return;
|
|
2582
2434
|
}
|
|
@@ -2588,16 +2440,21 @@
|
|
|
2588
2440
|
if (queued) {
|
|
2589
2441
|
return;
|
|
2590
2442
|
}
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2443
|
+
else {
|
|
2444
|
+
queued = true;
|
|
2445
|
+
$RAF(() => {
|
|
2446
|
+
ngZone.run(() => appRef.tick());
|
|
2447
|
+
queued = false;
|
|
2448
|
+
});
|
|
2449
|
+
}
|
|
2596
2450
|
}
|
|
2597
2451
|
};
|
|
2598
2452
|
})();
|
|
2599
|
-
|
|
2600
|
-
|
|
2453
|
+
function log(message) {
|
|
2454
|
+
if (window.__WM_DEBUG_WATCHERS__) {
|
|
2455
|
+
console.log(message);
|
|
2456
|
+
}
|
|
2457
|
+
}
|
|
2601
2458
|
|
|
2602
2459
|
exports.ComponentType = void 0;
|
|
2603
2460
|
(function (ComponentType) {
|
|
@@ -5406,8 +5263,6 @@
|
|
|
5406
5263
|
exports.$parseEvent = $parseEvent;
|
|
5407
5264
|
exports.$parseExpr = $parseExpr;
|
|
5408
5265
|
exports.$unwatch = $unwatch;
|
|
5409
|
-
exports.$unwatchAll = $unwatchAll;
|
|
5410
|
-
exports.$unwatchAllByScope = $unwatchAllByScope;
|
|
5411
5266
|
exports.$watch = $watch;
|
|
5412
5267
|
exports.AbstractDialogService = AbstractDialogService;
|
|
5413
5268
|
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==
|