pict-section-form 1.0.155 → 1.0.156
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/package.json
CHANGED
|
@@ -290,6 +290,8 @@ class PictFormMetacontroller extends libPictViewClass
|
|
|
290
290
|
*/
|
|
291
291
|
createDistinctManifest(pManifest, pUUID)
|
|
292
292
|
{
|
|
293
|
+
const tmpDescriptorHashes = Object.keys(pManifest?.Descriptors || {});
|
|
294
|
+
const tmpDescriptorHashSet = new Set(tmpDescriptorHashes);
|
|
293
295
|
const tmpUUID = pUUID != null ? pUUID : this.pict.getUUID().replace(/-/g, '');
|
|
294
296
|
const tmpManifest = JSON.parse(JSON.stringify(pManifest));
|
|
295
297
|
for (const tmpSection of tmpManifest.Sections || [])
|
|
@@ -305,8 +307,37 @@ class PictFormMetacontroller extends libPictViewClass
|
|
|
305
307
|
const tmpNewDescriptors = {};
|
|
306
308
|
for (const [ tmpKey, tmpDescriptor ] of Object.entries(tmpManifest.Descriptors || {}))
|
|
307
309
|
{
|
|
308
|
-
|
|
309
|
-
|
|
310
|
+
if (!tmpDescriptor.DataAddress)
|
|
311
|
+
{
|
|
312
|
+
tmpDescriptor.DataAddress = tmpKey;
|
|
313
|
+
}
|
|
314
|
+
tmpDescriptor.OriginalDataAddress = tmpDescriptor.DataAddress;
|
|
315
|
+
// we only make distinct top level properties to keep things as tidy as possible so do a split to isoloate that
|
|
316
|
+
//TODO: if we have .. dereferences (for example) in the data address, this will not work properly
|
|
317
|
+
|
|
318
|
+
let tmpArrayIndex = tmpDescriptor.DataAddress.indexOf('[');
|
|
319
|
+
let tmpDotIndex = tmpDescriptor.DataAddress.indexOf('.');
|
|
320
|
+
if (tmpDotIndex >= 0 && (tmpDotIndex < tmpArrayIndex || tmpArrayIndex < 0))
|
|
321
|
+
{
|
|
322
|
+
const tmpPrefixPart = tmpDescriptor.DataAddress.substring(0, tmpDotIndex);
|
|
323
|
+
const tmpPostfixPart = tmpDescriptor.DataAddress.substring(tmpDotIndex);
|
|
324
|
+
tmpDescriptor.DataAddress = `${tmpPrefixPart}_${tmpUUID}${tmpPostfixPart}`;
|
|
325
|
+
}
|
|
326
|
+
else if (tmpArrayIndex >= 0 && (tmpArrayIndex < tmpDotIndex || tmpDotIndex < 0))
|
|
327
|
+
{
|
|
328
|
+
const tmpArrayPart = tmpDescriptor.DataAddress.substring(0, tmpArrayIndex);
|
|
329
|
+
const tmpPostfixPart = tmpDescriptor.DataAddress.substring(tmpArrayIndex);
|
|
330
|
+
tmpDescriptor.DataAddress = `${tmpArrayPart}_${tmpUUID}${tmpPostfixPart}`;
|
|
331
|
+
}
|
|
332
|
+
else
|
|
333
|
+
{
|
|
334
|
+
//FIXME: do we want to allow prefixing the data address? (ex. nesting it under a parent object) - caller can still do this themselves.
|
|
335
|
+
tmpDescriptor.DataAddress = `${tmpDescriptor.OriginalDataAddress}_${tmpUUID}`;
|
|
336
|
+
}
|
|
337
|
+
if (tmpDescriptor.Address != null)
|
|
338
|
+
{
|
|
339
|
+
tmpDescriptor.Address = tmpDescriptor.DataAddress;
|
|
340
|
+
}
|
|
310
341
|
if (tmpDescriptor.Hash)
|
|
311
342
|
{
|
|
312
343
|
tmpDescriptor.OriginalHash = tmpDescriptor.Hash;
|
|
@@ -323,9 +354,127 @@ class PictFormMetacontroller extends libPictViewClass
|
|
|
323
354
|
tmpDescriptor.PictForm.Group = `${tmpDescriptor.PictForm.Group}_${tmpUUID}`;
|
|
324
355
|
}
|
|
325
356
|
}
|
|
326
|
-
tmpNewDescriptors[
|
|
357
|
+
tmpNewDescriptors[tmpDescriptor.DataAddress] = tmpDescriptor;
|
|
327
358
|
}
|
|
328
359
|
tmpManifest.Descriptors = tmpNewDescriptors;
|
|
360
|
+
const tmpAddressTranslation = {};
|
|
361
|
+
const tmpHashTranslation = {};
|
|
362
|
+
for (const tmpDescriptor of Object.values(tmpManifest?.Descriptors || {}))
|
|
363
|
+
{
|
|
364
|
+
if (tmpDescriptor.OriginalDataAddress)
|
|
365
|
+
{
|
|
366
|
+
tmpAddressTranslation[tmpDescriptor.OriginalDataAddress] = tmpDescriptor.DataAddress;
|
|
367
|
+
}
|
|
368
|
+
if (tmpDescriptor.OriginalHash)
|
|
369
|
+
{
|
|
370
|
+
tmpHashTranslation[tmpDescriptor.OriginalHash] = tmpDescriptor.Hash;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
for (const [ tmpOriginalAddress, tmpUpdatedAddress ] of Object.entries(tmpAddressTranslation))
|
|
374
|
+
{
|
|
375
|
+
for (const tmpIterAddress of Object.keys(tmpAddressTranslation))
|
|
376
|
+
{
|
|
377
|
+
if (tmpIterAddress === tmpOriginalAddress)
|
|
378
|
+
{
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
const tmpTranslatedAddress = tmpAddressTranslation[tmpIterAddress].replace(new RegExp(`\\b${tmpOriginalAddress}\\b`, 'g'), tmpUpdatedAddress);
|
|
382
|
+
if (tmpTranslatedAddress !== tmpAddressTranslation[tmpIterAddress])
|
|
383
|
+
{
|
|
384
|
+
//this.pict.log.info(`DocumentDynamicSectionManager._addTestSections: Updated address translation for "${tmpIterAddress}" from "${tmpAddressTranslation[tmpIterAddress]}" to "${tmpTranslatedAddress}".`);
|
|
385
|
+
tmpAddressTranslation[tmpIterAddress] = tmpTranslatedAddress;
|
|
386
|
+
const [ tmpCurrentKey, tmpOriginalDescriptor ] = Object.entries(tmpManifest.Descriptors).find(([ pKey, pDescriptor ]) => pDescriptor.OriginalDataAddress === tmpIterAddress);
|
|
387
|
+
tmpManifest.Descriptors[tmpCurrentKey].DataAddress = tmpTranslatedAddress;
|
|
388
|
+
if (tmpManifest.Descriptors[tmpCurrentKey].Address != null)
|
|
389
|
+
{
|
|
390
|
+
tmpManifest.Descriptors[tmpCurrentKey].Address = tmpManifest.Descriptors[tmpCurrentKey].DataAddress;
|
|
391
|
+
}
|
|
392
|
+
tmpManifest.Descriptors[tmpTranslatedAddress] = tmpManifest.Descriptors[tmpCurrentKey];
|
|
393
|
+
delete tmpManifest.Descriptors[tmpCurrentKey];
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
//TODO: should we merge these two together for solvers?
|
|
398
|
+
const tmpAddressMappings = Object.entries(tmpAddressTranslation).map(([ pOldAddress, pNewAddress ]) => ({ From: pOldAddress, To: pNewAddress }));
|
|
399
|
+
tmpAddressMappings.sort((a, b) => b.From.length - a.From.length);
|
|
400
|
+
const tmpHashMappings = Object.entries(tmpHashTranslation).map(([ pOldHash, pNewHash ]) => ({ From: pOldHash, To: pNewHash }));
|
|
401
|
+
tmpHashMappings.sort((a, b) => b.From.length - a.From.length);
|
|
402
|
+
const escapeRegExp = (string) =>
|
|
403
|
+
{
|
|
404
|
+
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
405
|
+
}
|
|
406
|
+
for (const tmpSection of tmpManifest.Sections || [])
|
|
407
|
+
{
|
|
408
|
+
if (Array.isArray(tmpSection.Solvers) && tmpSection.Solvers.length > 0)
|
|
409
|
+
{
|
|
410
|
+
for (let i = 0; i < tmpSection.Solvers.length; i++)
|
|
411
|
+
{
|
|
412
|
+
const tmpSolver = tmpSection.Solvers[i];
|
|
413
|
+
const tmpSolverExpression = typeof tmpSolver === 'string' ? tmpSolver : tmpSolver.Expression;
|
|
414
|
+
if (!tmpSolverExpression)
|
|
415
|
+
{
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
418
|
+
let tmpUpdatedSolver = tmpSolverExpression;
|
|
419
|
+
for (const tmpMapping of tmpAddressMappings)
|
|
420
|
+
{
|
|
421
|
+
tmpUpdatedSolver = tmpUpdatedSolver.replace(new RegExp(`\\b${escapeRegExp(tmpMapping.From)}\\b`, 'g'), tmpMapping.To);
|
|
422
|
+
}
|
|
423
|
+
for (const tmpMapping of tmpHashMappings)
|
|
424
|
+
{
|
|
425
|
+
tmpUpdatedSolver = tmpUpdatedSolver.replace(new RegExp(`\\b${escapeRegExp(tmpMapping.From)}\\b`, 'g'), tmpMapping.To);
|
|
426
|
+
}
|
|
427
|
+
if (tmpUpdatedSolver !== tmpSolver)
|
|
428
|
+
{
|
|
429
|
+
//this.pict.log.info(`DocumentDynamicSectionManager._addTestSections: Updated section solver reference ${i} from "${tmpSolverExpression}" to "${tmpUpdatedSolver}".`);
|
|
430
|
+
if (typeof tmpSolver === 'string')
|
|
431
|
+
{
|
|
432
|
+
tmpSection.Solvers[i] = tmpUpdatedSolver;
|
|
433
|
+
}
|
|
434
|
+
else
|
|
435
|
+
{
|
|
436
|
+
tmpSection.Solvers[i].Expression = tmpUpdatedSolver;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
for (const tmpGroup of tmpSection.Groups || [])
|
|
442
|
+
{
|
|
443
|
+
if (Array.isArray(tmpGroup.RecordSetSolvers) && tmpGroup.RecordSetSolvers.length > 0)
|
|
444
|
+
{
|
|
445
|
+
for (let i = 0; i < tmpGroup.RecordSetSolvers.length; i++)
|
|
446
|
+
{
|
|
447
|
+
const tmpSolver = tmpGroup.RecordSetSolvers[i];
|
|
448
|
+
const tmpSolverExpression = typeof tmpSolver === 'string' ? tmpSolver : tmpSolver.Expression;
|
|
449
|
+
if (!tmpSolverExpression)
|
|
450
|
+
{
|
|
451
|
+
continue;
|
|
452
|
+
}
|
|
453
|
+
let tmpUpdatedSolver = tmpSolverExpression;
|
|
454
|
+
for (const tmpMapping of tmpAddressMappings)
|
|
455
|
+
{
|
|
456
|
+
tmpUpdatedSolver = tmpUpdatedSolver.replace(new RegExp(`\\b${escapeRegExp(tmpMapping.From)}\\b`, 'g'), tmpMapping.To);
|
|
457
|
+
}
|
|
458
|
+
for (const tmpMapping of tmpHashMappings)
|
|
459
|
+
{
|
|
460
|
+
tmpUpdatedSolver = tmpUpdatedSolver.replace(new RegExp(`\\b${escapeRegExp(tmpMapping.From)}\\b`, 'g'), tmpMapping.To);
|
|
461
|
+
}
|
|
462
|
+
if (tmpUpdatedSolver !== tmpSolver)
|
|
463
|
+
{
|
|
464
|
+
//this.pict.log.info(`DocumentDynamicSectionManager._addTestSections: Updated group solver reference ${i} from "${tmpSolver}" to "${tmpUpdatedSolver}".`);
|
|
465
|
+
if (typeof tmpSolver === 'string')
|
|
466
|
+
{
|
|
467
|
+
tmpGroup.RecordSetSolvers[i] = tmpUpdatedSolver;
|
|
468
|
+
}
|
|
469
|
+
else
|
|
470
|
+
{
|
|
471
|
+
tmpGroup.RecordSetSolvers[i].Expression = tmpUpdatedSolver;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
329
478
|
return tmpManifest;
|
|
330
479
|
}
|
|
331
480
|
|
|
@@ -64,7 +64,7 @@ class OrderedSolverApplication extends DoNothingApplication
|
|
|
64
64
|
{
|
|
65
65
|
super.onAfterSolve();
|
|
66
66
|
this.pict.log.info('OrderedSolverApplication onAfterSolve called.');
|
|
67
|
-
this
|
|
67
|
+
this._testDone?.();
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
onAfterInitialize()
|
|
@@ -188,6 +188,486 @@ suite
|
|
|
188
188
|
});
|
|
189
189
|
}
|
|
190
190
|
);
|
|
191
|
+
test(
|
|
192
|
+
'Distinct Array Test',
|
|
193
|
+
(fDone) =>
|
|
194
|
+
{
|
|
195
|
+
//NOTE: code is a clone of Pict.safeLoadPictApplication
|
|
196
|
+
let _Pict;
|
|
197
|
+
const tmpApplicationClass = OrderedSolverApplication;
|
|
198
|
+
if (tmpApplicationClass && ('default_configuration' in tmpApplicationClass) && ('pict_configuration' in tmpApplicationClass.default_configuration))
|
|
199
|
+
{
|
|
200
|
+
_Pict = new libPict(tmpApplicationClass.default_configuration.pict_configuration);
|
|
201
|
+
}
|
|
202
|
+
else
|
|
203
|
+
{
|
|
204
|
+
_Pict = new libPict();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
//_Pict.LogNoisiness = 0;
|
|
208
|
+
|
|
209
|
+
let tmpApplicationHash = 'DefaultApplication';
|
|
210
|
+
let tmpDefaultConfiguration = {};
|
|
211
|
+
|
|
212
|
+
if ('default_configuration' in tmpApplicationClass)
|
|
213
|
+
{
|
|
214
|
+
tmpDefaultConfiguration = tmpApplicationClass.default_configuration;
|
|
215
|
+
|
|
216
|
+
if ('Hash' in tmpApplicationClass.default_configuration)
|
|
217
|
+
{
|
|
218
|
+
tmpDefaultConfiguration = tmpApplicationClass.default_configuration;
|
|
219
|
+
tmpApplicationHash = tmpApplicationClass.default_configuration.Hash;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
_Pict.log.info(`Loading the pict application [${tmpApplicationHash}] and associated views.`);
|
|
223
|
+
|
|
224
|
+
_Pict.addApplication(tmpApplicationHash, tmpDefaultConfiguration, tmpApplicationClass);
|
|
225
|
+
|
|
226
|
+
// Add the pict form service
|
|
227
|
+
_Pict.addServiceType('PictSectionForm', libPictSectionForm);
|
|
228
|
+
|
|
229
|
+
// Add the pict form metacontroller service, which provides programmaatic view construction from manifests and render/marshal methods.
|
|
230
|
+
_Pict.addView('PictFormMetacontroller', {}, libPictSectionForm.PictFormMetacontroller);
|
|
231
|
+
|
|
232
|
+
const tmpManifest =
|
|
233
|
+
{
|
|
234
|
+
Scope: 'OrderedSolverApplicationForm',
|
|
235
|
+
Descriptors:
|
|
236
|
+
{
|
|
237
|
+
DataTableAddress:
|
|
238
|
+
{
|
|
239
|
+
Hash: 'DataTable',
|
|
240
|
+
Name: 'Data Table',
|
|
241
|
+
DataAddress: 'DataTableAddress',
|
|
242
|
+
DataType: 'Array',
|
|
243
|
+
FormGroup: 'DataTableGroup',
|
|
244
|
+
FormSection: 'DataTableSection',
|
|
245
|
+
},
|
|
246
|
+
'DataTableAddress[].ValueAddress':
|
|
247
|
+
{
|
|
248
|
+
Hash: 'ValueArray',
|
|
249
|
+
Name: 'Data Value',
|
|
250
|
+
DataAddress: 'DataTableAddress[].ValueAddress',
|
|
251
|
+
DataType: 'Array',
|
|
252
|
+
FormGroup: 'DataTableGroup',
|
|
253
|
+
FormSection: 'DataTableSection',
|
|
254
|
+
},
|
|
255
|
+
AggregateValueAddress:
|
|
256
|
+
{
|
|
257
|
+
Hash: 'AggregateValue',
|
|
258
|
+
Name: 'Aggregate Value',
|
|
259
|
+
DataAddress: 'AggregateValueAddress',
|
|
260
|
+
DataType: 'PreciseNumber',
|
|
261
|
+
FormGroup: 'DataTableGroup',
|
|
262
|
+
FormSection: 'DataTableSection',
|
|
263
|
+
},
|
|
264
|
+
AggregateValueAddress2:
|
|
265
|
+
{
|
|
266
|
+
Hash: 'AggregateValue2',
|
|
267
|
+
Name: 'Aggregate Value 2',
|
|
268
|
+
DataAddress: 'AggregateValueAddress2',
|
|
269
|
+
DataType: 'PreciseNumber',
|
|
270
|
+
FormGroup: 'DataTableGroup',
|
|
271
|
+
FormSection: 'DataTableSection',
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
Sections:
|
|
275
|
+
[
|
|
276
|
+
{
|
|
277
|
+
Name: 'Ordered Solver Section',
|
|
278
|
+
Hash: 'OrderedSolverSection',
|
|
279
|
+
Solvers:
|
|
280
|
+
[
|
|
281
|
+
{ Ordinal: 5, Expression: 'AggregateValue = SUM(ValueArray)' },
|
|
282
|
+
{ Ordinal: 40, Expression: 'AggregateValue2 = SUM(DataTableAddress[].ValueAddress)' },
|
|
283
|
+
],
|
|
284
|
+
},
|
|
285
|
+
],
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
let tmpHashedAggregateValue = null;
|
|
289
|
+
let tmpHashedAggregateValue2 = null;
|
|
290
|
+
_Pict.PictApplication.initializeAsync(
|
|
291
|
+
function (pError)
|
|
292
|
+
{
|
|
293
|
+
if (pError)
|
|
294
|
+
{
|
|
295
|
+
_Pict.log.info('Error initializing the pict application: '+pError)
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
try
|
|
299
|
+
{
|
|
300
|
+
_Pict.log.info('Loading the Application and associated views.');
|
|
301
|
+
const tmpDistinctManifest = _Pict.views.PictFormMetacontroller.createDistinctManifest(tmpManifest);
|
|
302
|
+
_Pict.log.info('Distinct Manifest:', tmpDistinctManifest);
|
|
303
|
+
tmpHashedAggregateValue = Object.entries(tmpDistinctManifest.Descriptors).find(([pKey, pValue]) => pValue.OriginalHash == 'AggregateValue')[0];
|
|
304
|
+
tmpHashedAggregateValue2 = Object.entries(tmpDistinctManifest.Descriptors).find(([pKey, pValue]) => pValue.OriginalHash == 'AggregateValue2')[0];
|
|
305
|
+
const tmpInjectedSecionViews = _Pict.views.PictFormMetacontroller.injectManifest(tmpDistinctManifest);
|
|
306
|
+
_Pict.log.info('Injected Section Views:', tmpInjectedSecionViews.length);
|
|
307
|
+
_Pict.views.PictFormMetacontroller.updateMetatemplateInDOM();
|
|
308
|
+
setTimeout(() =>
|
|
309
|
+
{
|
|
310
|
+
for (const tmpView of tmpInjectedSecionViews)
|
|
311
|
+
{
|
|
312
|
+
tmpView.render();
|
|
313
|
+
}
|
|
314
|
+
for (const tmpView of tmpInjectedSecionViews)
|
|
315
|
+
{
|
|
316
|
+
tmpView.marshalToView();
|
|
317
|
+
}
|
|
318
|
+
//TODO: do we need to trigger a solve here?
|
|
319
|
+
}, 0);
|
|
320
|
+
_Pict.PictApplication.testDone = () =>
|
|
321
|
+
{
|
|
322
|
+
try
|
|
323
|
+
{
|
|
324
|
+
_Pict.log.info(`AppData after`, { AppData: _Pict.AppData, tmpHashedAggregateValue, tmpHashedAggregateValue2 });
|
|
325
|
+
Expect(_Pict.AppData[tmpHashedAggregateValue]).to.equal('15', 'AggregateValue should equal 15 (SUM of ValueArray via hash)');
|
|
326
|
+
Expect(_Pict.AppData[tmpHashedAggregateValue2]).to.equal('15', 'AggregateValue should equal 15 (SUM of ValueArray via address)');
|
|
327
|
+
}
|
|
328
|
+
catch (pError)
|
|
329
|
+
{
|
|
330
|
+
return fDone(pError);
|
|
331
|
+
}
|
|
332
|
+
fDone();
|
|
333
|
+
};
|
|
334
|
+
const [ tmpValueArrayKey, tmpValueArrayDescriptor ] = Object.entries(tmpDistinctManifest.Descriptors).find(([pKey, pDescriptor]) => pDescriptor.OriginalHash == 'ValueArray');
|
|
335
|
+
const tmpAddress = tmpValueArrayDescriptor.DataAddress;
|
|
336
|
+
_Pict.log.info('Setting up Distinct Array Test with address:', { tmpValueArrayKey, tmpValueArrayDescriptor, tmpAddress });
|
|
337
|
+
const tmpArrayAddress = tmpAddress.substring(0, tmpAddress.indexOf('[]'));
|
|
338
|
+
const tmpPropertyAddress = tmpAddress.substring(tmpAddress.indexOf('[]') + 3);
|
|
339
|
+
_Pict.manifest.setValueByHash(_Pict.AppData, tmpArrayAddress,
|
|
340
|
+
[
|
|
341
|
+
{ [tmpPropertyAddress]: '1' },
|
|
342
|
+
{ [tmpPropertyAddress]: '2' },
|
|
343
|
+
{ [tmpPropertyAddress]: '3' },
|
|
344
|
+
{ [tmpPropertyAddress]: '4' },
|
|
345
|
+
{ [tmpPropertyAddress]: '5' },
|
|
346
|
+
]);
|
|
347
|
+
_Pict.PictApplication.solve();
|
|
348
|
+
}
|
|
349
|
+
catch (pError)
|
|
350
|
+
{
|
|
351
|
+
_Pict.log.error('Error during Distinct Array Test:', pError);
|
|
352
|
+
return fDone(pError);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
);
|
|
357
|
+
test(
|
|
358
|
+
'Distinct Array Test 2',
|
|
359
|
+
(fDone) =>
|
|
360
|
+
{
|
|
361
|
+
//NOTE: code is a clone of Pict.safeLoadPictApplication
|
|
362
|
+
let _Pict;
|
|
363
|
+
const tmpApplicationClass = OrderedSolverApplication;
|
|
364
|
+
if (tmpApplicationClass && ('default_configuration' in tmpApplicationClass) && ('pict_configuration' in tmpApplicationClass.default_configuration))
|
|
365
|
+
{
|
|
366
|
+
_Pict = new libPict(tmpApplicationClass.default_configuration.pict_configuration);
|
|
367
|
+
}
|
|
368
|
+
else
|
|
369
|
+
{
|
|
370
|
+
_Pict = new libPict();
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
//_Pict.LogNoisiness = 0;
|
|
374
|
+
|
|
375
|
+
let tmpApplicationHash = 'DefaultApplication';
|
|
376
|
+
let tmpDefaultConfiguration = {};
|
|
377
|
+
|
|
378
|
+
if ('default_configuration' in tmpApplicationClass)
|
|
379
|
+
{
|
|
380
|
+
tmpDefaultConfiguration = tmpApplicationClass.default_configuration;
|
|
381
|
+
|
|
382
|
+
if ('Hash' in tmpApplicationClass.default_configuration)
|
|
383
|
+
{
|
|
384
|
+
tmpDefaultConfiguration = tmpApplicationClass.default_configuration;
|
|
385
|
+
tmpApplicationHash = tmpApplicationClass.default_configuration.Hash;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
_Pict.log.info(`Loading the pict application [${tmpApplicationHash}] and associated views.`);
|
|
389
|
+
|
|
390
|
+
_Pict.addApplication(tmpApplicationHash, tmpDefaultConfiguration, tmpApplicationClass);
|
|
391
|
+
|
|
392
|
+
// Add the pict form service
|
|
393
|
+
_Pict.addServiceType('PictSectionForm', libPictSectionForm);
|
|
394
|
+
|
|
395
|
+
// Add the pict form metacontroller service, which provides programmaatic view construction from manifests and render/marshal methods.
|
|
396
|
+
_Pict.addView('PictFormMetacontroller', {}, libPictSectionForm.PictFormMetacontroller);
|
|
397
|
+
|
|
398
|
+
const tmpManifest =
|
|
399
|
+
{
|
|
400
|
+
Scope: 'OrderedSolverApplicationForm',
|
|
401
|
+
Descriptors:
|
|
402
|
+
{
|
|
403
|
+
'DataTableAddress[].ValueAddress':
|
|
404
|
+
{
|
|
405
|
+
Hash: 'ValueArray',
|
|
406
|
+
Name: 'Data Value',
|
|
407
|
+
DataAddress: 'DataTableAddress[].ValueAddress',
|
|
408
|
+
DataType: 'Array',
|
|
409
|
+
FormGroup: 'DataTableGroup',
|
|
410
|
+
FormSection: 'DataTableSection',
|
|
411
|
+
},
|
|
412
|
+
AggregateValueAddress:
|
|
413
|
+
{
|
|
414
|
+
Hash: 'AggregateValue',
|
|
415
|
+
Name: 'Aggregate Value',
|
|
416
|
+
DataAddress: 'AggregateValueAddress',
|
|
417
|
+
DataType: 'PreciseNumber',
|
|
418
|
+
FormGroup: 'DataTableGroup',
|
|
419
|
+
FormSection: 'DataTableSection',
|
|
420
|
+
},
|
|
421
|
+
AggregateValueAddress2:
|
|
422
|
+
{
|
|
423
|
+
Hash: 'AggregateValue2',
|
|
424
|
+
Name: 'Aggregate Value 2',
|
|
425
|
+
DataAddress: 'AggregateValueAddress2',
|
|
426
|
+
DataType: 'PreciseNumber',
|
|
427
|
+
FormGroup: 'DataTableGroup',
|
|
428
|
+
FormSection: 'DataTableSection',
|
|
429
|
+
},
|
|
430
|
+
},
|
|
431
|
+
Sections:
|
|
432
|
+
[
|
|
433
|
+
{
|
|
434
|
+
Name: 'Ordered Solver Section',
|
|
435
|
+
Hash: 'OrderedSolverSection',
|
|
436
|
+
Solvers:
|
|
437
|
+
[
|
|
438
|
+
{ Ordinal: 5, Expression: 'AggregateValue = SUM(ValueArray)' },
|
|
439
|
+
{ Ordinal: 40, Expression: 'AggregateValue2 = SUM(DataTableAddress[].ValueAddress)' },
|
|
440
|
+
],
|
|
441
|
+
},
|
|
442
|
+
],
|
|
443
|
+
};
|
|
444
|
+
|
|
445
|
+
let tmpHashedAggregateValue = null;
|
|
446
|
+
let tmpHashedAggregateValue2 = null;
|
|
447
|
+
_Pict.PictApplication.initializeAsync(
|
|
448
|
+
function (pError)
|
|
449
|
+
{
|
|
450
|
+
if (pError)
|
|
451
|
+
{
|
|
452
|
+
_Pict.log.info('Error initializing the pict application: '+pError)
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
try
|
|
456
|
+
{
|
|
457
|
+
_Pict.log.info('Loading the Application and associated views.');
|
|
458
|
+
const tmpDistinctManifest = _Pict.views.PictFormMetacontroller.createDistinctManifest(tmpManifest);
|
|
459
|
+
_Pict.log.info('Distinct Manifest:', tmpDistinctManifest);
|
|
460
|
+
tmpHashedAggregateValue = Object.entries(tmpDistinctManifest.Descriptors).find(([pKey, pValue]) => pValue.OriginalHash == 'AggregateValue')[0];
|
|
461
|
+
tmpHashedAggregateValue2 = Object.entries(tmpDistinctManifest.Descriptors).find(([pKey, pValue]) => pValue.OriginalHash == 'AggregateValue2')[0];
|
|
462
|
+
const tmpInjectedSecionViews = _Pict.views.PictFormMetacontroller.injectManifest(tmpDistinctManifest);
|
|
463
|
+
_Pict.log.info('Injected Section Views:', tmpInjectedSecionViews.length);
|
|
464
|
+
_Pict.views.PictFormMetacontroller.updateMetatemplateInDOM();
|
|
465
|
+
setTimeout(() =>
|
|
466
|
+
{
|
|
467
|
+
for (const tmpView of tmpInjectedSecionViews)
|
|
468
|
+
{
|
|
469
|
+
tmpView.render();
|
|
470
|
+
}
|
|
471
|
+
for (const tmpView of tmpInjectedSecionViews)
|
|
472
|
+
{
|
|
473
|
+
tmpView.marshalToView();
|
|
474
|
+
}
|
|
475
|
+
//TODO: do we need to trigger a solve here?
|
|
476
|
+
}, 0);
|
|
477
|
+
_Pict.PictApplication.testDone = () =>
|
|
478
|
+
{
|
|
479
|
+
try
|
|
480
|
+
{
|
|
481
|
+
_Pict.log.info(`AppData after`, { AppData: _Pict.AppData, tmpHashedAggregateValue, tmpHashedAggregateValue2 });
|
|
482
|
+
Expect(_Pict.AppData[tmpHashedAggregateValue]).to.equal('15', 'AggregateValue should equal 15 (SUM of ValueArray via hash)');
|
|
483
|
+
Expect(_Pict.AppData[tmpHashedAggregateValue2]).to.equal('15', 'AggregateValue should equal 15 (SUM of ValueArray via address)');
|
|
484
|
+
}
|
|
485
|
+
catch (pError)
|
|
486
|
+
{
|
|
487
|
+
return fDone(pError);
|
|
488
|
+
}
|
|
489
|
+
fDone();
|
|
490
|
+
};
|
|
491
|
+
const [ tmpValueArrayKey, tmpValueArrayDescriptor ] = Object.entries(tmpDistinctManifest.Descriptors).find(([pKey, pDescriptor]) => pDescriptor.OriginalHash == 'ValueArray');
|
|
492
|
+
const tmpAddress = tmpValueArrayDescriptor.DataAddress;
|
|
493
|
+
_Pict.log.info('Setting up Distinct Array Test with address:', { tmpValueArrayKey, tmpValueArrayDescriptor, tmpAddress });
|
|
494
|
+
const tmpArrayAddress = tmpAddress.substring(0, tmpAddress.indexOf('[]'));
|
|
495
|
+
const tmpPropertyAddress = tmpAddress.substring(tmpAddress.indexOf('[]') + 3);
|
|
496
|
+
_Pict.manifest.setValueByHash(_Pict.AppData, tmpArrayAddress,
|
|
497
|
+
[
|
|
498
|
+
{ [tmpPropertyAddress]: '1' },
|
|
499
|
+
{ [tmpPropertyAddress]: '2' },
|
|
500
|
+
{ [tmpPropertyAddress]: '3' },
|
|
501
|
+
{ [tmpPropertyAddress]: '4' },
|
|
502
|
+
{ [tmpPropertyAddress]: '5' },
|
|
503
|
+
]);
|
|
504
|
+
_Pict.PictApplication.solve();
|
|
505
|
+
}
|
|
506
|
+
catch (pError)
|
|
507
|
+
{
|
|
508
|
+
_Pict.log.error('Error during Distinct Array Test:', pError);
|
|
509
|
+
return fDone(pError);
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
);
|
|
514
|
+
test(
|
|
515
|
+
'Distinct Array Test 3',
|
|
516
|
+
(fDone) =>
|
|
517
|
+
{
|
|
518
|
+
//NOTE: code is a clone of Pict.safeLoadPictApplication
|
|
519
|
+
let _Pict;
|
|
520
|
+
const tmpApplicationClass = OrderedSolverApplication;
|
|
521
|
+
if (tmpApplicationClass && ('default_configuration' in tmpApplicationClass) && ('pict_configuration' in tmpApplicationClass.default_configuration))
|
|
522
|
+
{
|
|
523
|
+
_Pict = new libPict(tmpApplicationClass.default_configuration.pict_configuration);
|
|
524
|
+
}
|
|
525
|
+
else
|
|
526
|
+
{
|
|
527
|
+
_Pict = new libPict();
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
//_Pict.LogNoisiness = 0;
|
|
531
|
+
|
|
532
|
+
let tmpApplicationHash = 'DefaultApplication';
|
|
533
|
+
let tmpDefaultConfiguration = {};
|
|
534
|
+
|
|
535
|
+
if ('default_configuration' in tmpApplicationClass)
|
|
536
|
+
{
|
|
537
|
+
tmpDefaultConfiguration = tmpApplicationClass.default_configuration;
|
|
538
|
+
|
|
539
|
+
if ('Hash' in tmpApplicationClass.default_configuration)
|
|
540
|
+
{
|
|
541
|
+
tmpDefaultConfiguration = tmpApplicationClass.default_configuration;
|
|
542
|
+
tmpApplicationHash = tmpApplicationClass.default_configuration.Hash;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
_Pict.log.info(`Loading the pict application [${tmpApplicationHash}] and associated views.`);
|
|
546
|
+
|
|
547
|
+
_Pict.addApplication(tmpApplicationHash, tmpDefaultConfiguration, tmpApplicationClass);
|
|
548
|
+
|
|
549
|
+
// Add the pict form service
|
|
550
|
+
_Pict.addServiceType('PictSectionForm', libPictSectionForm);
|
|
551
|
+
|
|
552
|
+
// Add the pict form metacontroller service, which provides programmaatic view construction from manifests and render/marshal methods.
|
|
553
|
+
_Pict.addView('PictFormMetacontroller', {}, libPictSectionForm.PictFormMetacontroller);
|
|
554
|
+
|
|
555
|
+
const tmpManifest =
|
|
556
|
+
{
|
|
557
|
+
Scope: 'OrderedSolverApplicationForm',
|
|
558
|
+
Descriptors:
|
|
559
|
+
{
|
|
560
|
+
'LevelOfIndirection.DataTableAddress[].ValueAddress':
|
|
561
|
+
{
|
|
562
|
+
Hash: 'ValueArray',
|
|
563
|
+
Name: 'Data Value',
|
|
564
|
+
DataAddress: 'LevelOfIndirection.DataTableAddress[].ValueAddress',
|
|
565
|
+
DataType: 'Array',
|
|
566
|
+
FormGroup: 'DataTableGroup',
|
|
567
|
+
FormSection: 'DataTableSection',
|
|
568
|
+
},
|
|
569
|
+
AggregateValueAddress:
|
|
570
|
+
{
|
|
571
|
+
Hash: 'AggregateValue',
|
|
572
|
+
Name: 'Aggregate Value',
|
|
573
|
+
DataAddress: 'AggregateValueAddress',
|
|
574
|
+
DataType: 'PreciseNumber',
|
|
575
|
+
FormGroup: 'DataTableGroup',
|
|
576
|
+
FormSection: 'DataTableSection',
|
|
577
|
+
},
|
|
578
|
+
AggregateValueAddress2:
|
|
579
|
+
{
|
|
580
|
+
Hash: 'AggregateValue2',
|
|
581
|
+
Name: 'Aggregate Value 2',
|
|
582
|
+
DataAddress: 'AggregateValueAddress2',
|
|
583
|
+
DataType: 'PreciseNumber',
|
|
584
|
+
FormGroup: 'DataTableGroup',
|
|
585
|
+
FormSection: 'DataTableSection',
|
|
586
|
+
},
|
|
587
|
+
},
|
|
588
|
+
Sections:
|
|
589
|
+
[
|
|
590
|
+
{
|
|
591
|
+
Name: 'Ordered Solver Section',
|
|
592
|
+
Hash: 'OrderedSolverSection',
|
|
593
|
+
Solvers:
|
|
594
|
+
[
|
|
595
|
+
{ Ordinal: 5, Expression: 'AggregateValue = SUM(ValueArray)' },
|
|
596
|
+
{ Ordinal: 40, Expression: 'AggregateValue2 = SUM(LevelOfIndirection.DataTableAddress[].ValueAddress)' },
|
|
597
|
+
],
|
|
598
|
+
},
|
|
599
|
+
],
|
|
600
|
+
};
|
|
601
|
+
|
|
602
|
+
let tmpHashedAggregateValue = null;
|
|
603
|
+
let tmpHashedAggregateValue2 = null;
|
|
604
|
+
_Pict.PictApplication.initializeAsync(
|
|
605
|
+
function (pError)
|
|
606
|
+
{
|
|
607
|
+
if (pError)
|
|
608
|
+
{
|
|
609
|
+
_Pict.log.info('Error initializing the pict application: '+pError)
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
try
|
|
613
|
+
{
|
|
614
|
+
_Pict.log.info('Loading the Application and associated views.');
|
|
615
|
+
const tmpDistinctManifest = _Pict.views.PictFormMetacontroller.createDistinctManifest(tmpManifest);
|
|
616
|
+
_Pict.log.info('Distinct Manifest:', tmpDistinctManifest);
|
|
617
|
+
tmpHashedAggregateValue = Object.entries(tmpDistinctManifest.Descriptors).find(([pKey, pValue]) => pValue.OriginalHash == 'AggregateValue')[0];
|
|
618
|
+
tmpHashedAggregateValue2 = Object.entries(tmpDistinctManifest.Descriptors).find(([pKey, pValue]) => pValue.OriginalHash == 'AggregateValue2')[0];
|
|
619
|
+
const tmpInjectedSecionViews = _Pict.views.PictFormMetacontroller.injectManifest(tmpDistinctManifest);
|
|
620
|
+
_Pict.log.info('Injected Section Views:', tmpInjectedSecionViews.length);
|
|
621
|
+
_Pict.views.PictFormMetacontroller.updateMetatemplateInDOM();
|
|
622
|
+
setTimeout(() =>
|
|
623
|
+
{
|
|
624
|
+
for (const tmpView of tmpInjectedSecionViews)
|
|
625
|
+
{
|
|
626
|
+
tmpView.render();
|
|
627
|
+
}
|
|
628
|
+
for (const tmpView of tmpInjectedSecionViews)
|
|
629
|
+
{
|
|
630
|
+
tmpView.marshalToView();
|
|
631
|
+
}
|
|
632
|
+
//TODO: do we need to trigger a solve here?
|
|
633
|
+
}, 0);
|
|
634
|
+
_Pict.PictApplication.testDone = () =>
|
|
635
|
+
{
|
|
636
|
+
try
|
|
637
|
+
{
|
|
638
|
+
_Pict.log.info(`AppData after`, { AppData: _Pict.AppData, tmpHashedAggregateValue, tmpHashedAggregateValue2 });
|
|
639
|
+
Expect(_Pict.AppData[tmpHashedAggregateValue]).to.equal('15', 'AggregateValue should equal 15 (SUM of ValueArray via hash)');
|
|
640
|
+
Expect(_Pict.AppData[tmpHashedAggregateValue2]).to.equal('15', 'AggregateValue should equal 15 (SUM of ValueArray via address)');
|
|
641
|
+
}
|
|
642
|
+
catch (pError)
|
|
643
|
+
{
|
|
644
|
+
return fDone(pError);
|
|
645
|
+
}
|
|
646
|
+
fDone();
|
|
647
|
+
};
|
|
648
|
+
const [ tmpValueArrayKey, tmpValueArrayDescriptor ] = Object.entries(tmpDistinctManifest.Descriptors).find(([pKey, pDescriptor]) => pDescriptor.OriginalHash == 'ValueArray');
|
|
649
|
+
const tmpAddress = tmpValueArrayDescriptor.DataAddress;
|
|
650
|
+
_Pict.log.info('Setting up Distinct Array Test with address:', { tmpValueArrayKey, tmpValueArrayDescriptor, tmpAddress });
|
|
651
|
+
const tmpArrayAddress = tmpAddress.substring(0, tmpAddress.indexOf('[]'));
|
|
652
|
+
const tmpPropertyAddress = tmpAddress.substring(tmpAddress.indexOf('[]') + 3);
|
|
653
|
+
_Pict.manifest.setValueByHash(_Pict.AppData, tmpArrayAddress,
|
|
654
|
+
[
|
|
655
|
+
{ [tmpPropertyAddress]: '1' },
|
|
656
|
+
{ [tmpPropertyAddress]: '2' },
|
|
657
|
+
{ [tmpPropertyAddress]: '3' },
|
|
658
|
+
{ [tmpPropertyAddress]: '4' },
|
|
659
|
+
{ [tmpPropertyAddress]: '5' },
|
|
660
|
+
]);
|
|
661
|
+
_Pict.PictApplication.solve();
|
|
662
|
+
}
|
|
663
|
+
catch (pError)
|
|
664
|
+
{
|
|
665
|
+
_Pict.log.error('Error during Distinct Array Test:', pError);
|
|
666
|
+
return fDone(pError);
|
|
667
|
+
}
|
|
668
|
+
});
|
|
669
|
+
}
|
|
670
|
+
);
|
|
191
671
|
test(
|
|
192
672
|
'Solve Ordinals',
|
|
193
673
|
(fDone) =>
|
|
@@ -242,7 +722,7 @@ suite
|
|
|
242
722
|
{
|
|
243
723
|
if (pError)
|
|
244
724
|
{
|
|
245
|
-
|
|
725
|
+
_Pict.log.info('Error initializing the pict application: '+pError)
|
|
246
726
|
}
|
|
247
727
|
_Pict.log.info('Loading the Application and associated views.');
|
|
248
728
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pict-Provider-DynamicSolver.d.ts","sourceRoot":"","sources":["../../../source/providers/Pict-Provider-DynamicSolver.js"],"names":[],"mappings":";AA+BA;;GAEG;AACH;IAEC;;;;;;OAMG;IACH,oBAJW,MAAM,YACN,MAAM,gBACN,MAAM,EAqChB;IA9BA,6BAA6B;IAC7B,MADW,OAAO,MAAM,CAAC,CAChB;IACT,uHAAuH;IACvH,OADW,OAAO,MAAM,CAAC,GAAG;QAAE,qCAAqC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;QAAC,gBAAgB,EAAE,GAAG,CAAA;KAAE,CACzG;IA6BX,uCAoBC;IAED;;;;;;;;;OASG;IACH,qBALW,MAAM,GAAC,MAAM,cACb,OAAO,aACP,MAAM,GACJ,MAAM,GAAC,SAAS,CA8B5B;IAED;;;;;;;OAOG;IACH,wDAFW,MAAM,QAyDhB;IAED;;;;;OAKG;IACH,gEAFW,MAAM,QAgChB;IAED;;;;;OAKG;IACH,sDAFW,MAAM,QAwBhB;IAED;;;;;;;;OAQG;IACH,gCAJW,MAAM,yBAWhB;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,yBAFW,QAAM,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"Pict-Provider-DynamicSolver.d.ts","sourceRoot":"","sources":["../../../source/providers/Pict-Provider-DynamicSolver.js"],"names":[],"mappings":";AA+BA;;GAEG;AACH;IAEC;;;;;;OAMG;IACH,oBAJW,MAAM,YACN,MAAM,gBACN,MAAM,EAqChB;IA9BA,6BAA6B;IAC7B,MADW,OAAO,MAAM,CAAC,CAChB;IACT,uHAAuH;IACvH,OADW,OAAO,MAAM,CAAC,GAAG;QAAE,qCAAqC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;QAAC,gBAAgB,EAAE,GAAG,CAAA;KAAE,CACzG;IA6BX,uCAoBC;IAED;;;;;;;;;OASG;IACH,qBALW,MAAM,GAAC,MAAM,cACb,OAAO,aACP,MAAM,GACJ,MAAM,GAAC,SAAS,CA8B5B;IAED;;;;;;;OAOG;IACH,wDAFW,MAAM,QAyDhB;IAED;;;;;OAKG;IACH,gEAFW,MAAM,QAgChB;IAED;;;;;OAKG;IACH,sDAFW,MAAM,QAwBhB;IAED;;;;;;;;OAQG;IACH,gCAJW,MAAM,yBAWhB;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,yBAFW,QAAM,MAAM,EAAE,QAwFxB;IADA;;;;;MAAuC;CAExC;;;;;AA9XD,kCAAkC;AAClC,6CADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAS3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pict-View-Form-Metacontroller.d.ts","sourceRoot":"","sources":["../../../source/views/Pict-View-Form-Metacontroller.js"],"names":[],"mappings":";AAaA;;GAEG;AAEH;;;;;;GAMG;AACH;IAEC,2DAyBC;IAjBA,yBAA2B;IAE3B,wBAAsF;IAEtF,cAAkC;IAElC,gCAAkC;IAClC,8BAAiC;IAEjC;;;;;;MAOE;IAQH,wCAGC;IARD,kCAGC;IAOD;;;;OAIG;IACH,qBAFa,GAAG,CAaf;IAED;;;;OAIG;IACH,mBAFa,GAAG,CAaf;IAED,yCAYC;IAED;;;;;OAKG;IACH,kCAHW,aAAa,GACX,IAAI,CAsBhB;IA8BD;;;;OAIG;IACH,WAFa,GAAG,CAMf;IAED,kCAGC;IAED,gDAGC;IAED,+CAGC;IAED;;;;OAIG;IACH,2DAJW,MAAM,GAEL,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAW9B;IAED;;;;;;OAMG;IACH,mCANW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,sBACnB,MAAM,UACN,MAAM,GAEL,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAwBtD;IAED;;;;;OAKG;IACH,0BALW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,sBACnB,MAAM,GAEL,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAgCtD;IAED;;;;;;;;;OASG;IACH,kCALW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,UACnB,MAAM,GAEL,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"Pict-View-Form-Metacontroller.d.ts","sourceRoot":"","sources":["../../../source/views/Pict-View-Form-Metacontroller.js"],"names":[],"mappings":";AAaA;;GAEG;AAEH;;;;;;GAMG;AACH;IAEC,2DAyBC;IAjBA,yBAA2B;IAE3B,wBAAsF;IAEtF,cAAkC;IAElC,gCAAkC;IAClC,8BAAiC;IAEjC;;;;;;MAOE;IAQH,wCAGC;IARD,kCAGC;IAOD;;;;OAIG;IACH,qBAFa,GAAG,CAaf;IAED;;;;OAIG;IACH,mBAFa,GAAG,CAaf;IAED,yCAYC;IAED;;;;;OAKG;IACH,kCAHW,aAAa,GACX,IAAI,CAsBhB;IA8BD;;;;OAIG;IACH,WAFa,GAAG,CAMf;IAED,kCAGC;IAED,gDAGC;IAED,+CAGC;IAED;;;;OAIG;IACH,2DAJW,MAAM,GAEL,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAW9B;IAED;;;;;;OAMG;IACH,mCANW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,sBACnB,MAAM,UACN,MAAM,GAEL,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAwBtD;IAED;;;;;OAKG;IACH,0BALW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,sBACnB,MAAM,GAEL,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAgCtD;IAED;;;;;;;;;OASG;IACH,kCALW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,UACnB,MAAM,GAEL,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CA8L9B;IAED;;;;OAIG;IACH,uCAJW,KAAK,CAAC,MAAM,CAAC,sBACb,MAAM,UACN,MAAM,QAuBhB;IAED;;;OAGG;IACH,6CAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,sBACnB,MAAM,SAehB;IAED;;;;;;;;OAQG;IACH,wDAHW,YAAY,SAoHtB;IAED;;;;;;;OAOG;IACH,4CAHW,MAAM,GACJ,IAAI,CAShB;IAED;;;;OAIG;IACH,6BAFa,IAAI,CAQhB;IAED;;;;;;;OAOG;IACH,+DAFW,YAAY,QAatB;IAED;;;;;;;OAOG;IACH,gEAFW,YAAY,QAatB;IAED;;;;;OAKG;IACH,8EAFW,YAAY,QAmBtB;IAED;;;;;;OAMG;IACH,oEAHW,YAAY,GACV,IAAI,CAkDhB;IAED;;;;;;;OAOG;IACH,uEAJW,YAAY,GAEX,IAAI,CAsFf;IAED;;;;;OAKG;IACH,qCAHW,MAAM,GACJ,MAAM,GAAC,OAAO,CA2C1B;IAED,+CAeC;IAED;;;;;;;OAOG;IACH,kFAJW,MAAM,GAEJ,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAoLtC;IA5JC,gCAA0D;IAC1D,yBAAiD;IA6JnD;;;;OAIG;IACH,gCAHW,MAAM,qBACN,MAAM,QA0BhB;IAED;;;OAGG;IACH,yDAHW,MAAM,uBACN,MAAM,QAKhB;IAED;;;;;OAKG;IACH,yDALW,MAAM,uBACN,MAAM,GAEL,OAAO,CAoDlB;IAED;;;;OAIG;IACH,sCAJW,MAAM,GAEL,OAAO,CA0ClB;IAED;;;OAGG;IACH,wDAHW,MAAM,6BAuBhB;IAED,oCAgBC;IAED;;;;OAIG;IACH,4BAFa,OAAO,CAKnB;CACD;;;;;qCAGU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;oBA5zCjB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,MAAM"}
|