@toclocoinc/lattice-grid 1.8.0 → 1.9.1
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/README.md +88 -14
- package/docs/API.html +263 -21
- package/docs/CHART-CODES.md +381 -0
- package/docs/api-detail.html +1 -1
- package/lattice-grid.d.ts +486 -8
- package/lattice-grid.esm.min.js +2527 -170
- package/lattice-grid.min.cjs +2524 -170
- package/lattice-grid.min.css +1 -1
- package/lattice-grid.min.js +2524 -170
- package/modules/charts.esm.min.js +671 -65
- package/modules/devtools.esm.min.js +2 -2
- package/modules/dhtmlx-compat.esm.min.js +2524 -170
- package/modules/htmx.esm.min.js +2521 -170
- package/modules/htmx.min.cjs +2521 -170
- package/modules/htmx.min.js +2521 -170
- package/modules/react.esm.min.js +2 -2
- package/modules/svelte.esm.min.js +2 -2
- package/modules/vue.esm.min.js +2 -2
- package/modules/webcomponent.esm.min.js +2524 -170
- package/package.json +5 -2
package/lattice-grid.min.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.
|
|
2
|
+
* Lattice Grid 1.9.1 — core + DOM renderer
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
@@ -53,7 +53,7 @@ Object.defineProperty(__exports,"cancelFrame",{enumerable:true,get:function(){re
|
|
|
53
53
|
Object.defineProperty(__exports,"frameBatched",{enumerable:true,get:function(){return frameBatched;}});
|
|
54
54
|
Object.defineProperty(__exports,"whenIdle",{enumerable:true,get:function(){return whenIdle;}});
|
|
55
55
|
Object.defineProperty(__exports,"uid",{enumerable:true,get:function(){return uid;}});
|
|
56
|
-
const VERSION='1.
|
|
56
|
+
const VERSION='1.9.0';
|
|
57
57
|
const warned=new Set();
|
|
58
58
|
const reported=[];
|
|
59
59
|
const REPORT_LIMIT=500;
|
|
@@ -911,7 +911,14 @@ STDEV:(a)=>spread(numbers(a),true),
|
|
|
911
911
|
STDEVP:(a)=>spread(numbers(a),false),
|
|
912
912
|
VAR:(a)=>{const sd=spread(numbers(a),true);return sd*sd;},
|
|
913
913
|
VARP:(a)=>{const sd=spread(numbers(a),false);return sd*sd;},
|
|
914
|
-
COUNTDISTINCT:(a)=>
|
|
914
|
+
COUNTDISTINCT:(a)=>{
|
|
915
|
+
const seen=new Set();
|
|
916
|
+
for(const arg of a){
|
|
917
|
+
const values=Array.isArray(arg)?arg:[arg];
|
|
918
|
+
for(const v of values)if(v!==null&&v!==undefined&&v!=='')seen.add(v);
|
|
919
|
+
}
|
|
920
|
+
return seen.size;
|
|
921
|
+
},
|
|
915
922
|
IQR:(a)=>{
|
|
916
923
|
const values=numbers(a);
|
|
917
924
|
return percentileOf(values,0.75)-percentileOf(values,0.25);
|
|
@@ -3398,9 +3405,65 @@ other:'{count} cells updated',
|
|
|
3398
3405
|
'panel.quickFilter':'Quick filter',
|
|
3399
3406
|
'panel.formatting':'Formatting',
|
|
3400
3407
|
'panel.statistics':'Statistics',
|
|
3408
|
+
'panel.compare':'Compare',
|
|
3409
|
+
'compare.first':'First column',
|
|
3410
|
+
'compare.second':'Second column',
|
|
3411
|
+
'compare.needTwo':'Two numeric columns are needed to compare',
|
|
3412
|
+
'compare.noPairs':'No rows have a value in both',
|
|
3413
|
+
'compare.pairs':'{count} pairs',
|
|
3414
|
+
'compare.pearson':'Correlation (Pearson)',
|
|
3415
|
+
'compare.spearman':'Rank correlation (Spearman)',
|
|
3416
|
+
'compare.kendall':'Kendall’s tau',
|
|
3417
|
+
'compare.covariance':'Covariance',
|
|
3418
|
+
'compare.slope':'Slope',
|
|
3419
|
+
'compare.intercept':'Intercept',
|
|
3420
|
+
'compare.r2':'R²',
|
|
3421
|
+
'compare.stdError':'Standard error',
|
|
3422
|
+
'compare.weighted':'Weighted average',
|
|
3401
3423
|
'panel.zone.group':'row groups',
|
|
3402
3424
|
'panel.zone.values':'values',
|
|
3403
3425
|
'panel.zone.pivot':'pivot columns',
|
|
3426
|
+
'total.sum':'Sum',
|
|
3427
|
+
'total.avg':'Average',
|
|
3428
|
+
'total.min':'Min',
|
|
3429
|
+
'total.max':'Max',
|
|
3430
|
+
'total.count':'Count',
|
|
3431
|
+
'total.countValues':'Count of values',
|
|
3432
|
+
'total.first':'First',
|
|
3433
|
+
'total.last':'Last',
|
|
3434
|
+
'total.median':'Median',
|
|
3435
|
+
'total.p25':'25th percentile',
|
|
3436
|
+
'total.p75':'75th percentile',
|
|
3437
|
+
'total.p90':'90th percentile',
|
|
3438
|
+
'total.p95':'95th percentile',
|
|
3439
|
+
'total.p99':'99th percentile',
|
|
3440
|
+
'total.iqr':'Interquartile range',
|
|
3441
|
+
'total.mad':'Median absolute deviation',
|
|
3442
|
+
'total.variance':'Variance',
|
|
3443
|
+
'total.varianceP':'Variance (population)',
|
|
3444
|
+
'total.stddev':'Standard deviation',
|
|
3445
|
+
'total.stddevP':'Standard deviation (population)',
|
|
3446
|
+
'total.range':'Range',
|
|
3447
|
+
'total.distinct':'Distinct',
|
|
3448
|
+
'total.mode':'Mode',
|
|
3449
|
+
'total.skewness':'Skewness',
|
|
3450
|
+
'total.kurtosis':'Kurtosis',
|
|
3451
|
+
'total.geomean':'Geometric mean',
|
|
3452
|
+
'total.harmean':'Harmonic mean',
|
|
3453
|
+
'total.sumSquares':'Sum of squares',
|
|
3454
|
+
'total.weightedAvg':'Weighted average',
|
|
3455
|
+
'total.argmin':'Lowest by',
|
|
3456
|
+
'total.argmax':'Highest by',
|
|
3457
|
+
'total.hhi':'Concentration (HHI)',
|
|
3458
|
+
'total.entropy':'Entropy',
|
|
3459
|
+
'total.evenness':'Evenness',
|
|
3460
|
+
'total.top3Share':'Top 3 share',
|
|
3461
|
+
'total.top10Share':'Top 10 share',
|
|
3462
|
+
'total.gini':'Gini coefficient',
|
|
3463
|
+
'total.trimmedMean':'Trimmed mean',
|
|
3464
|
+
'total.winsorizedMean':'Winsorized mean',
|
|
3465
|
+
'total.robustOutliers':'Outliers (robust)',
|
|
3466
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
3404
3467
|
'stats.column':'Column',
|
|
3405
3468
|
'stats.choose':'Choose a column to profile',
|
|
3406
3469
|
'stats.noColumns':'No numeric columns to profile',
|
|
@@ -3420,6 +3483,15 @@ other:'{count} cells updated',
|
|
|
3420
3483
|
'stats.outliers':'Outliers',
|
|
3421
3484
|
'stats.distribution':'Distribution',
|
|
3422
3485
|
'stats.bin':'{count} between {from} and {to}',
|
|
3486
|
+
'stats.section.shape':'Shape',
|
|
3487
|
+
'stats.section.robust':'Robust',
|
|
3488
|
+
'stats.section.concentration':'Concentration',
|
|
3489
|
+
'stats.section.capability':'Capability',
|
|
3490
|
+
'stats.cp':'Cp',
|
|
3491
|
+
'stats.cpk':'Cpk',
|
|
3492
|
+
'stats.pp':'Pp',
|
|
3493
|
+
'stats.ppk':'Ppk',
|
|
3494
|
+
'stats.outOfSpec':'Out of specification',
|
|
3423
3495
|
'stats.filtered':'Over the {count} filtered rows',
|
|
3424
3496
|
'menu.sortAscending':'Sort ascending',
|
|
3425
3497
|
'menu.sortDescending':'Sort descending',
|
|
@@ -4186,6 +4258,69 @@ unit('gon',Math.PI/200,['grad','gradian','gradians'],{auto:false}),
|
|
|
4186
4258
|
unit('rad',1,['radian','radians']),
|
|
4187
4259
|
unit('turn',2*Math.PI,['rev','revolution','revolutions'],{auto:false}),
|
|
4188
4260
|
]),
|
|
4261
|
+
angularVelocity:Object.freeze([
|
|
4262
|
+
unit('°/s',Math.PI/180,['degps','deg/s','degrees/s'],{auto:false}),
|
|
4263
|
+
unit('rad/s',1,['radps','radians/s']),
|
|
4264
|
+
unit('rpm',(2*Math.PI)/60,['rev/min','r/min','revolutions/min'],{auto:false}),
|
|
4265
|
+
unit('rps',2*Math.PI,['rev/s','r/s','revolutions/s'],{auto:false}),
|
|
4266
|
+
]),
|
|
4267
|
+
fraction:Object.freeze([
|
|
4268
|
+
unit('ppt',1e-12,['partspertrillion'],{auto:false}),
|
|
4269
|
+
unit('ppb',1e-9,['partsperbillion']),
|
|
4270
|
+
unit('ppm',1e-6,['partspermillion']),
|
|
4271
|
+
unit('bp',1e-4,['bps-finance','basispoint','basispoints','bips'],{auto:false}),
|
|
4272
|
+
unit('‰',1e-3,['permille','permil'],{auto:false}),
|
|
4273
|
+
unit('%',1e-2,['pct','percent']),
|
|
4274
|
+
unit('×',1,['x','ratio','times']),
|
|
4275
|
+
]),
|
|
4276
|
+
molarity:Object.freeze([
|
|
4277
|
+
unit('pM',1e-12,['picomolar','picomolarity']),
|
|
4278
|
+
unit('nM',1e-9,['nanomolar','nanomolarity']),
|
|
4279
|
+
unit('µM',1e-6,['um-molar','micromolar','micromolarity']),
|
|
4280
|
+
unit('mM',1e-3,['millimolar','millimolarity']),
|
|
4281
|
+
unit('M',1,['molar','mol/l','mol/L','molarity']),
|
|
4282
|
+
unit('mol/m³',1e-3,['mol/m3'],{auto:false}),
|
|
4283
|
+
]),
|
|
4284
|
+
massFlow:Object.freeze([
|
|
4285
|
+
unit('mg/s',1e-6,['milligrams/s']),
|
|
4286
|
+
unit('g/s',1e-3,['grams/s']),
|
|
4287
|
+
unit('kg/h',1/3600,['kilograms/h','kgph'],{auto:false}),
|
|
4288
|
+
unit('kg/s',1,['kilograms/s','kgps']),
|
|
4289
|
+
unit('t/h',1000/3600,['tonnes/h','tph'],{auto:false}),
|
|
4290
|
+
unit('lb/h',0.45359237/3600,['pounds/h','pph'],{auto:false}),
|
|
4291
|
+
unit('t/s',1000,['tonnes/s'],{auto:false}),
|
|
4292
|
+
]),
|
|
4293
|
+
viscosity:Object.freeze([
|
|
4294
|
+
unit('µPa·s',1e-6,['upas','micropascalsecond']),
|
|
4295
|
+
unit('cP',1e-3,['centipoise'],{auto:false}),
|
|
4296
|
+
unit('mPa·s',1e-3,['mpas','millipascalsecond']),
|
|
4297
|
+
unit('P',0.1,['poise'],{auto:false}),
|
|
4298
|
+
unit('Pa·s',1,['pas','pascalsecond']),
|
|
4299
|
+
]),
|
|
4300
|
+
kinematicViscosity:Object.freeze([
|
|
4301
|
+
unit('cSt',1e-6,['centistokes','centistoke']),
|
|
4302
|
+
unit('mm²/s',1e-6,['mm2/s'],{auto:false}),
|
|
4303
|
+
unit('St',1e-4,['stokes','stoke'],{auto:false}),
|
|
4304
|
+
unit('m²/s',1,['m2/s']),
|
|
4305
|
+
]),
|
|
4306
|
+
thermalConductivity:Object.freeze([
|
|
4307
|
+
unit('mW/(m·K)',1e-3,['mw/mk']),
|
|
4308
|
+
unit('W/(m·K)',1,['w/mk','wmk']),
|
|
4309
|
+
unit('kW/(m·K)',1e3,['kw/mk'],{auto:false}),
|
|
4310
|
+
unit('BTU/(hr·ft·°F)',1.730734666,['btu/hrftf'],{auto:false}),
|
|
4311
|
+
]),
|
|
4312
|
+
specificHeat:Object.freeze([
|
|
4313
|
+
unit('J/(kg·K)',1,['j/kgk','jkgk']),
|
|
4314
|
+
unit('kJ/(kg·K)',1e3,['kj/kgk']),
|
|
4315
|
+
unit('cal/(g·°C)',4184,['cal/gc'],{auto:false}),
|
|
4316
|
+
]),
|
|
4317
|
+
doseRate:Object.freeze([
|
|
4318
|
+
unit('nSv/h',1e-9,['nsvh']),
|
|
4319
|
+
unit('µSv/h',1e-6,['usv/h','usvh']),
|
|
4320
|
+
unit('mSv/h',1e-3,['msvh']),
|
|
4321
|
+
unit('Sv/h',1,['svh']),
|
|
4322
|
+
unit('mSv/a',1e-3/8766,['msv/year','msvpa'],{auto:false}),
|
|
4323
|
+
]),
|
|
4189
4324
|
});
|
|
4190
4325
|
const AMBIGUOUS=Symbol('ambiguous');
|
|
4191
4326
|
const indexes=new Map();
|
|
@@ -4306,6 +4441,7 @@ return out;
|
|
|
4306
4441
|
}
|
|
4307
4442
|
const SPACES=/[\s ]/g;
|
|
4308
4443
|
const NUMBER_HEAD=/^[+-]?[\d '’ .,]*(?:[eE][+-]?\d+)?/;
|
|
4444
|
+
const LEADING_SYMBOL=/^[^\d+\-(.,\s]+\s*/;
|
|
4309
4445
|
const PLAIN_NUMBER=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/;
|
|
4310
4446
|
function parseLocaleNumber(text,locale){
|
|
4311
4447
|
const{group,decimal}=localeSeparators(locale);
|
|
@@ -4345,11 +4481,18 @@ let s=String(text).trim();
|
|
|
4345
4481
|
if(s==='')return null;
|
|
4346
4482
|
let negative=false;
|
|
4347
4483
|
if(s.startsWith('(')&&s.endsWith(')')){negative=true;s=s.slice(1,-1).trim();}
|
|
4484
|
+
let leading=null;
|
|
4485
|
+
const front=LEADING_SYMBOL.exec(s);
|
|
4486
|
+
if(front&&front[0]){
|
|
4487
|
+
const candidate=resolveToken(front[0].trim(),ctx.index,ctx.binary);
|
|
4488
|
+
if(candidate){leading=candidate;s=s.slice(front[0].length).trim();}
|
|
4489
|
+
}
|
|
4348
4490
|
const head=NUMBER_HEAD.exec(s)[0];
|
|
4349
4491
|
const n=parseLocaleNumber(head,opts&&opts.locale);
|
|
4350
4492
|
if(n===null)return null;
|
|
4351
4493
|
const suffix=s.slice(head.length).trim();
|
|
4352
|
-
|
|
4494
|
+
if(leading&&suffix!=='')return null;
|
|
4495
|
+
const from=leading||(suffix===''?ctx.base:resolveToken(suffix,ctx.index,ctx.binary));
|
|
4353
4496
|
if(!from)return null;
|
|
4354
4497
|
const value=convert(n,from,ctx.base);
|
|
4355
4498
|
return negative?-value:value;
|
|
@@ -4429,7 +4572,10 @@ min=significantDecimals(shown,figures);
|
|
|
4429
4572
|
max=min;
|
|
4430
4573
|
}
|
|
4431
4574
|
const text=numberFormat(cfg.locale,min,max,cfg.group!==false).format(shown);
|
|
4432
|
-
|
|
4575
|
+
const gap=cfg.space??' ';
|
|
4576
|
+
return cfg.placement==='prefix'
|
|
4577
|
+
?`${target.symbol}${cfg.space??''}${text}`
|
|
4578
|
+
:`${text}${gap}${target.symbol}`;
|
|
4433
4579
|
}
|
|
4434
4580
|
function compareUnit(a,b){
|
|
4435
4581
|
const an=isNil(a)||Number.isNaN(a)?null:Number(a);
|
|
@@ -4557,6 +4703,21 @@ system:'angle',unit:'rad',maxDecimals:4,totals:angularTotals(2*Math.PI),
|
|
|
4557
4703
|
degrees:createUnitType({
|
|
4558
4704
|
system:'angle',unit:'°',maxDecimals:2,totals:angularTotals(360),
|
|
4559
4705
|
}),
|
|
4706
|
+
rpm:createUnitType({system:'angularVelocity',unit:'rpm',maxDecimals:0}),
|
|
4707
|
+
angularVelocity:createUnitType({system:'angularVelocity',unit:'rad/s',maxDecimals:3}),
|
|
4708
|
+
ppm:createUnitType({system:'fraction',unit:'ppm',maxDecimals:2}),
|
|
4709
|
+
ppb:createUnitType({system:'fraction',unit:'ppb',maxDecimals:2}),
|
|
4710
|
+
basisPoints:createUnitType({system:'fraction',unit:'bp',maxDecimals:1}),
|
|
4711
|
+
molarity:createUnitType({system:'molarity',unit:'M',display:'auto',maxDecimals:3}),
|
|
4712
|
+
massFlow:createUnitType({system:'massFlow',unit:'kg/s',maxDecimals:3}),
|
|
4713
|
+
tonnesPerHour:createUnitType({system:'massFlow',unit:'t/h',maxDecimals:2}),
|
|
4714
|
+
viscosity:createUnitType({system:'viscosity',unit:'Pa·s',display:'auto',maxDecimals:3}),
|
|
4715
|
+
kinematicViscosity:createUnitType({system:'kinematicViscosity',unit:'cSt',maxDecimals:2}),
|
|
4716
|
+
thermalConductivity:createUnitType({
|
|
4717
|
+
system:'thermalConductivity',unit:'W/(m·K)',maxDecimals:3,
|
|
4718
|
+
}),
|
|
4719
|
+
specificHeat:createUnitType({system:'specificHeat',unit:'J/(kg·K)',maxDecimals:1}),
|
|
4720
|
+
doseRate:createUnitType({system:'doseRate',unit:'µSv/h',display:'auto',maxDecimals:2}),
|
|
4560
4721
|
});
|
|
4561
4722
|
});
|
|
4562
4723
|
__def("packages/core/src/columns/types/si.js",function(__exports,__req){
|
|
@@ -4653,6 +4814,7 @@ extra:[defineUnit('G',1e-4,['gauss'],{auto:false})],
|
|
|
4653
4814
|
}),
|
|
4654
4815
|
luminousFlux:createSiType('luminousFlux',{base:'lm',name:'lumen',prefixes:['m','','k']}),
|
|
4655
4816
|
illuminance:createSiType('illuminance',{base:'lx',name:'lux',prefixes:['m','','k']}),
|
|
4817
|
+
luminousIntensity:createSiType('luminousIntensity',{base:'cd',name:'candela',prefixes:['m','','k']}),
|
|
4656
4818
|
substance:createSiType('substance',{
|
|
4657
4819
|
base:'mol',name:'mole',prefixes:['n','µ','m','','k'],
|
|
4658
4820
|
}),
|
|
@@ -6552,17 +6714,35 @@ compute:(deps,ctx)=>{
|
|
|
6552
6714
|
const api=ctx.grid&&ctx.grid.statistics;
|
|
6553
6715
|
if(!api)return null;
|
|
6554
6716
|
const key=(ctx.row&&ctx.row.key)||api.keyOf(ctx.data);
|
|
6555
|
-
return key?api.shadow(watched,spec.kind,key):null;
|
|
6717
|
+
return key?api.shadow(watched,spec.kind,key,spec.scope):null;
|
|
6556
6718
|
},
|
|
6557
6719
|
};
|
|
6558
6720
|
}
|
|
6721
|
+
if(def.running&&!isFunction(m.value&&m.value.compute)){
|
|
6722
|
+
const spec=typeof def.running==='string'?{kind:def.running}:def.running;
|
|
6723
|
+
const source=spec.of||def.field||id;
|
|
6724
|
+
m.value={
|
|
6725
|
+
...(m.value||{}),
|
|
6726
|
+
deps:[source],
|
|
6727
|
+
pure:false,
|
|
6728
|
+
compute:(deps,ctx)=>{
|
|
6729
|
+
const api=ctx.grid&&ctx.grid.statistics;
|
|
6730
|
+
if(!api||!isFunction(api.running))return null;
|
|
6731
|
+
const key=(ctx.row&&ctx.row.key)||api.keyOf(ctx.data);
|
|
6732
|
+
return key?api.running(source,spec.kind||'total',key):null;
|
|
6733
|
+
},
|
|
6734
|
+
};
|
|
6735
|
+
if(def.sort===undefined)m.sort={...(m.sort||{}),enabled:false};
|
|
6736
|
+
}
|
|
6559
6737
|
const field=def.field??(isFunction(m.value&&m.value.compute)?null:(def.id??null));
|
|
6560
6738
|
const computed=isFunction(m.value&&m.value.compute);
|
|
6561
6739
|
const column={
|
|
6562
6740
|
id,
|
|
6563
6741
|
field,
|
|
6564
6742
|
shadow:def.shadow||null,
|
|
6565
|
-
|
|
6743
|
+
running:def.running||null,
|
|
6744
|
+
spec:def.spec||null,
|
|
6745
|
+
volatile:!!(def.shadow||def.running),
|
|
6566
6746
|
title:m.title??humanise(field||id),
|
|
6567
6747
|
type:typeName,
|
|
6568
6748
|
dataType:type,
|
|
@@ -7198,6 +7378,7 @@ class ShadowTracker{
|
|
|
7198
7378
|
#max;
|
|
7199
7379
|
#now;
|
|
7200
7380
|
#summary=null;
|
|
7381
|
+
#filtered=null;
|
|
7201
7382
|
constructor(opts){
|
|
7202
7383
|
this.#colId=opts.colId;
|
|
7203
7384
|
this.#depth=Math.max(2,opts.depth||DEFAULT_DEPTH);
|
|
@@ -7212,6 +7393,7 @@ const value=toNumber(raw);
|
|
|
7212
7393
|
if(value===null)return;
|
|
7213
7394
|
if(!this.#latest.has(key)){
|
|
7214
7395
|
this.#summary=null;
|
|
7396
|
+
this.#filtered=null;
|
|
7215
7397
|
this.#evictIfFull();
|
|
7216
7398
|
this.#baseline.set(key,value);
|
|
7217
7399
|
this.#latest.set(key,value);
|
|
@@ -7224,6 +7406,7 @@ return;
|
|
|
7224
7406
|
const previous=this.#latest.get(key);
|
|
7225
7407
|
if(previous===value)return;
|
|
7226
7408
|
this.#summary=null;
|
|
7409
|
+
this.#filtered=null;
|
|
7227
7410
|
this.#latest.set(key,value);
|
|
7228
7411
|
this.#counts.set(key,(this.#counts.get(key)||0)+1);
|
|
7229
7412
|
this.#stamps.set(key,this.#now());
|
|
@@ -7250,6 +7433,7 @@ this.#forgotten++;
|
|
|
7250
7433
|
rebase(){
|
|
7251
7434
|
for(const[key,value]of this.#latest)this.#baseline.set(key,value);
|
|
7252
7435
|
this.#summary=null;
|
|
7436
|
+
this.#filtered=null;
|
|
7253
7437
|
}
|
|
7254
7438
|
reset(){
|
|
7255
7439
|
this.#baseline.clear();
|
|
@@ -7260,6 +7444,7 @@ this.#history.clear();
|
|
|
7260
7444
|
this.#streaks.clear();
|
|
7261
7445
|
this.#forgotten=0;
|
|
7262
7446
|
this.#summary=null;
|
|
7447
|
+
this.#filtered=null;
|
|
7263
7448
|
}
|
|
7264
7449
|
retain(keys){
|
|
7265
7450
|
const living=keys instanceof Set?keys:new Set(keys);
|
|
@@ -7274,10 +7459,10 @@ this.#history.delete(key);
|
|
|
7274
7459
|
this.#streaks.delete(key);
|
|
7275
7460
|
dropped++;
|
|
7276
7461
|
}
|
|
7277
|
-
if(dropped)this.#summary=null;
|
|
7462
|
+
if(dropped){this.#summary=null;this.#filtered=null;}
|
|
7278
7463
|
return dropped;
|
|
7279
7464
|
}
|
|
7280
|
-
read(kind,key){
|
|
7465
|
+
read(kind,key,only){
|
|
7281
7466
|
switch(kind){
|
|
7282
7467
|
case'updates':
|
|
7283
7468
|
return this.#counts.has(key)?this.#counts.get(key):0;
|
|
@@ -7314,12 +7499,27 @@ return this.#history.has(key)?[...this.#history.get(key)]:null;
|
|
|
7314
7499
|
case'streak':
|
|
7315
7500
|
return this.#streaks.has(key)?this.#streaks.get(key):0;
|
|
7316
7501
|
default:
|
|
7317
|
-
return POSITIONAL_KINDS.includes(kind)?this.#position(kind,key):null;
|
|
7502
|
+
return POSITIONAL_KINDS.includes(kind)?this.#position(kind,key,only):null;
|
|
7503
|
+
}
|
|
7318
7504
|
}
|
|
7505
|
+
#view(only){
|
|
7506
|
+
if(only){
|
|
7507
|
+
if(this.#filtered&&this.#filtered.only===only)return this.#filtered.view;
|
|
7508
|
+
const view=this.#build(only);
|
|
7509
|
+
this.#filtered={only,view};
|
|
7510
|
+
return view;
|
|
7319
7511
|
}
|
|
7320
|
-
#view(){
|
|
7321
7512
|
if(this.#summary)return this.#summary;
|
|
7322
|
-
|
|
7513
|
+
this.#summary=this.#build(null);
|
|
7514
|
+
return this.#summary;
|
|
7515
|
+
}
|
|
7516
|
+
#build(only){
|
|
7517
|
+
const values=[];
|
|
7518
|
+
for(const[key,value]of this.#latest){
|
|
7519
|
+
if(only&&!only.has(key))continue;
|
|
7520
|
+
values.push(value);
|
|
7521
|
+
}
|
|
7522
|
+
const sorted=values.sort((a,b)=>a-b);
|
|
7323
7523
|
let n=0;
|
|
7324
7524
|
let mean=0;
|
|
7325
7525
|
let m2=0;
|
|
@@ -7331,19 +7531,24 @@ const delta=x-mean;
|
|
|
7331
7531
|
mean+=delta/n;
|
|
7332
7532
|
m2+=delta*(x-mean);
|
|
7333
7533
|
}
|
|
7334
|
-
|
|
7534
|
+
const baseline=[];
|
|
7535
|
+
for(const[key,value]of this.#baseline){
|
|
7536
|
+
if(only&&!only.has(key))continue;
|
|
7537
|
+
baseline.push(value);
|
|
7538
|
+
}
|
|
7539
|
+
return{
|
|
7335
7540
|
sorted,
|
|
7336
|
-
baseline:
|
|
7541
|
+
baseline:baseline.sort((a,b)=>a-b),
|
|
7337
7542
|
sum,
|
|
7338
7543
|
mean:n?mean:0,
|
|
7339
7544
|
sd:n>1?Math.sqrt(m2/(n-1)):0,
|
|
7340
7545
|
};
|
|
7341
|
-
return this.#summary;
|
|
7342
7546
|
}
|
|
7343
|
-
#position(kind,key){
|
|
7547
|
+
#position(kind,key,only){
|
|
7344
7548
|
if(!this.#latest.has(key))return null;
|
|
7549
|
+
if(only&&!only.has(key))return null;
|
|
7345
7550
|
const value=this.#latest.get(key);
|
|
7346
|
-
const view=this.#view();
|
|
7551
|
+
const view=this.#view(only);
|
|
7347
7552
|
const n=view.sorted.length;
|
|
7348
7553
|
if(!n)return null;
|
|
7349
7554
|
switch(kind){
|
|
@@ -7603,8 +7808,15 @@ return v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v));
|
|
|
7603
7808
|
});
|
|
7604
7809
|
__def("packages/core/src/compute/statistics.js",function(__exports,__req){
|
|
7605
7810
|
'use strict';
|
|
7811
|
+
Object.defineProperty(__exports,"KENDALL_LIMIT",{enumerable:true,get:function(){return KENDALL_LIMIT;}});
|
|
7606
7812
|
Object.defineProperty(__exports,"MAINTENANCE",{enumerable:true,get:function(){return MAINTENANCE;}});
|
|
7607
7813
|
Object.defineProperty(__exports,"numbers",{enumerable:true,get:function(){return numbers;}});
|
|
7814
|
+
Object.defineProperty(__exports,"frequencies",{enumerable:true,get:function(){return frequencies;}});
|
|
7815
|
+
Object.defineProperty(__exports,"herfindahl",{enumerable:true,get:function(){return herfindahl;}});
|
|
7816
|
+
Object.defineProperty(__exports,"entropy",{enumerable:true,get:function(){return entropy;}});
|
|
7817
|
+
Object.defineProperty(__exports,"evenness",{enumerable:true,get:function(){return evenness;}});
|
|
7818
|
+
Object.defineProperty(__exports,"topShare",{enumerable:true,get:function(){return topShare;}});
|
|
7819
|
+
Object.defineProperty(__exports,"gini",{enumerable:true,get:function(){return gini;}});
|
|
7608
7820
|
Object.defineProperty(__exports,"moments",{enumerable:true,get:function(){return moments;}});
|
|
7609
7821
|
Object.defineProperty(__exports,"quantileSorted",{enumerable:true,get:function(){return quantileSorted;}});
|
|
7610
7822
|
Object.defineProperty(__exports,"quantile",{enumerable:true,get:function(){return quantile;}});
|
|
@@ -7613,11 +7825,28 @@ Object.defineProperty(__exports,"STAT_LABELS",{enumerable:true,get:function(){re
|
|
|
7613
7825
|
Object.defineProperty(__exports,"weightedAverage",{enumerable:true,get:function(){return weightedAverage;}});
|
|
7614
7826
|
Object.defineProperty(__exports,"extremeRow",{enumerable:true,get:function(){return extremeRow;}});
|
|
7615
7827
|
Object.defineProperty(__exports,"correlation",{enumerable:true,get:function(){return correlation;}});
|
|
7828
|
+
Object.defineProperty(__exports,"trimmedMean",{enumerable:true,get:function(){return trimmedMean;}});
|
|
7829
|
+
Object.defineProperty(__exports,"winsorizedMean",{enumerable:true,get:function(){return winsorizedMean;}});
|
|
7830
|
+
Object.defineProperty(__exports,"modifiedZOutliers",{enumerable:true,get:function(){return modifiedZOutliers;}});
|
|
7831
|
+
Object.defineProperty(__exports,"jarqueBera",{enumerable:true,get:function(){return jarqueBera;}});
|
|
7832
|
+
Object.defineProperty(__exports,"weightedQuantile",{enumerable:true,get:function(){return weightedQuantile;}});
|
|
7833
|
+
Object.defineProperty(__exports,"pairs",{enumerable:true,get:function(){return pairs;}});
|
|
7834
|
+
Object.defineProperty(__exports,"covariance",{enumerable:true,get:function(){return covariance;}});
|
|
7835
|
+
Object.defineProperty(__exports,"regression",{enumerable:true,get:function(){return regression;}});
|
|
7836
|
+
Object.defineProperty(__exports,"spearman",{enumerable:true,get:function(){return spearman;}});
|
|
7837
|
+
Object.defineProperty(__exports,"kendall",{enumerable:true,get:function(){return kendall;}});
|
|
7838
|
+
Object.defineProperty(__exports,"seriesStats",{enumerable:true,get:function(){return seriesStats;}});
|
|
7839
|
+
Object.defineProperty(__exports,"D2_N2",{enumerable:true,get:function(){return D2_N2;}});
|
|
7840
|
+
Object.defineProperty(__exports,"withinSigma",{enumerable:true,get:function(){return withinSigma;}});
|
|
7841
|
+
Object.defineProperty(__exports,"capability",{enumerable:true,get:function(){return capability;}});
|
|
7842
|
+
Object.defineProperty(__exports,"controlLimits",{enumerable:true,get:function(){return controlLimits;}});
|
|
7843
|
+
Object.defineProperty(__exports,"controlViolations",{enumerable:true,get:function(){return controlViolations;}});
|
|
7616
7844
|
Object.defineProperty(__exports,"countOutside",{enumerable:true,get:function(){return countOutside;}});
|
|
7617
7845
|
Object.defineProperty(__exports,"histogram",{enumerable:true,get:function(){return histogram;}});
|
|
7618
7846
|
const __m0=__req("packages/core/src/compute/handle.js");
|
|
7619
7847
|
const presenceReader=__m0["presenceReader"];
|
|
7620
7848
|
const valueReader=__m0["valueReader"];
|
|
7849
|
+
const KENDALL_LIMIT=5000;
|
|
7621
7850
|
const MAINTENANCE=Object.freeze({
|
|
7622
7851
|
variance:'maintained',
|
|
7623
7852
|
varianceP:'maintained',
|
|
@@ -7642,6 +7871,16 @@ harmean:'rescan',
|
|
|
7642
7871
|
mad:'rescan',
|
|
7643
7872
|
argmin:'rescan',
|
|
7644
7873
|
argmax:'rescan',
|
|
7874
|
+
hhi:'rescan',
|
|
7875
|
+
entropy:'rescan',
|
|
7876
|
+
evenness:'rescan',
|
|
7877
|
+
top3Share:'rescan',
|
|
7878
|
+
top10Share:'rescan',
|
|
7879
|
+
gini:'rescan',
|
|
7880
|
+
trimmedMean:'rescan',
|
|
7881
|
+
winsorizedMean:'rescan',
|
|
7882
|
+
robustOutliers:'rescan',
|
|
7883
|
+
jarqueBera:'rescan',
|
|
7645
7884
|
});
|
|
7646
7885
|
function numbers(handle,indices){
|
|
7647
7886
|
const n=indices.length;
|
|
@@ -7670,6 +7909,68 @@ out[count++]=v;
|
|
|
7670
7909
|
}
|
|
7671
7910
|
return out.subarray(0,count);
|
|
7672
7911
|
}
|
|
7912
|
+
function frequencies(handle,indices){
|
|
7913
|
+
const seen=new Map();
|
|
7914
|
+
const read=valueReader(handle);
|
|
7915
|
+
let total=0;
|
|
7916
|
+
for(let i=0;i<indices.length;i++){
|
|
7917
|
+
const raw=read(indices[i]);
|
|
7918
|
+
if(raw===null||raw===undefined||raw==='')continue;
|
|
7919
|
+
if(typeof raw==='number'&&Number.isNaN(raw))continue;
|
|
7920
|
+
const key=typeof raw==='object'?String(raw):raw;
|
|
7921
|
+
seen.set(key,(seen.get(key)||0)+1);
|
|
7922
|
+
total++;
|
|
7923
|
+
}
|
|
7924
|
+
const counts=[...seen.values()].sort((a,b)=>b-a);
|
|
7925
|
+
return{counts,total,distinct:counts.length};
|
|
7926
|
+
}
|
|
7927
|
+
function sharesOf(freq){
|
|
7928
|
+
return freq.total>0?freq.counts.map((c)=>c/freq.total):[];
|
|
7929
|
+
}
|
|
7930
|
+
function herfindahl(handle,indices){
|
|
7931
|
+
const freq=frequencies(handle,indices);
|
|
7932
|
+
if(!freq.total)return null;
|
|
7933
|
+
let sum=0;
|
|
7934
|
+
for(const share of sharesOf(freq))sum+=share*share;
|
|
7935
|
+
return sum;
|
|
7936
|
+
}
|
|
7937
|
+
function entropy(handle,indices){
|
|
7938
|
+
const freq=frequencies(handle,indices);
|
|
7939
|
+
if(!freq.total)return null;
|
|
7940
|
+
let sum=0;
|
|
7941
|
+
for(const share of sharesOf(freq))if(share>0)sum-=share*Math.log2(share);
|
|
7942
|
+
return sum;
|
|
7943
|
+
}
|
|
7944
|
+
function evenness(handle,indices){
|
|
7945
|
+
const freq=frequencies(handle,indices);
|
|
7946
|
+
if(!freq.total||freq.distinct<2)return freq.total?1:null;
|
|
7947
|
+
let sum=0;
|
|
7948
|
+
for(const share of sharesOf(freq))if(share>0)sum-=share*Math.log2(share);
|
|
7949
|
+
return sum/Math.log2(freq.distinct);
|
|
7950
|
+
}
|
|
7951
|
+
function topShare(handle,indices,n=3){
|
|
7952
|
+
const freq=frequencies(handle,indices);
|
|
7953
|
+
if(!freq.total)return null;
|
|
7954
|
+
const take=Math.max(1,Math.floor(n));
|
|
7955
|
+
let held=0;
|
|
7956
|
+
for(let i=0;i<Math.min(take,freq.counts.length);i++)held+=freq.counts[i];
|
|
7957
|
+
return held/freq.total;
|
|
7958
|
+
}
|
|
7959
|
+
function gini(handle,indices){
|
|
7960
|
+
const values=numbers(handle,indices);
|
|
7961
|
+
const n=values.length;
|
|
7962
|
+
if(!n)return null;
|
|
7963
|
+
const sorted=values.slice().sort();
|
|
7964
|
+
if(sorted[0]<0)return null;
|
|
7965
|
+
let total=0;
|
|
7966
|
+
let weighted=0;
|
|
7967
|
+
for(let i=0;i<n;i++){
|
|
7968
|
+
total+=sorted[i];
|
|
7969
|
+
weighted+=(i+1)*sorted[i];
|
|
7970
|
+
}
|
|
7971
|
+
if(total===0)return 0;
|
|
7972
|
+
return(2*weighted)/(n*total)-(n+1)/n;
|
|
7973
|
+
}
|
|
7673
7974
|
function moments(values){
|
|
7674
7975
|
let n=0;
|
|
7675
7976
|
let mean=0;
|
|
@@ -7699,6 +8000,16 @@ const sorted=values.slice().sort();
|
|
|
7699
8000
|
return quantileSorted(sorted,p);
|
|
7700
8001
|
}
|
|
7701
8002
|
const STAT_FNS=Object.freeze({
|
|
8003
|
+
hhi:(h,i)=>herfindahl(h,i),
|
|
8004
|
+
entropy:(h,i)=>entropy(h,i),
|
|
8005
|
+
evenness:(h,i)=>evenness(h,i),
|
|
8006
|
+
top3Share:(h,i)=>topShare(h,i,3),
|
|
8007
|
+
top10Share:(h,i)=>topShare(h,i,10),
|
|
8008
|
+
gini:(h,i)=>gini(h,i),
|
|
8009
|
+
trimmedMean:(h,i)=>trimmedMean(numbers(h,i),0.1),
|
|
8010
|
+
winsorizedMean:(h,i)=>winsorizedMean(numbers(h,i),0.1),
|
|
8011
|
+
robustOutliers:(h,i)=>modifiedZOutliers(numbers(h,i),3.5),
|
|
8012
|
+
jarqueBera:(h,i)=>jarqueBera(numbers(h,i)),
|
|
7702
8013
|
variance:(h,i)=>{
|
|
7703
8014
|
const{n,m2}=moments(numbers(h,i));
|
|
7704
8015
|
return n>1?m2/(n-1):null;
|
|
@@ -7841,6 +8152,16 @@ return sum;
|
|
|
7841
8152
|
},
|
|
7842
8153
|
});
|
|
7843
8154
|
const STAT_LABELS=Object.freeze({
|
|
8155
|
+
hhi:'Concentration (HHI)',
|
|
8156
|
+
entropy:'Entropy',
|
|
8157
|
+
evenness:'Evenness',
|
|
8158
|
+
top3Share:'Top 3 share',
|
|
8159
|
+
top10Share:'Top 10 share',
|
|
8160
|
+
gini:'Gini coefficient',
|
|
8161
|
+
trimmedMean:'Trimmed mean',
|
|
8162
|
+
winsorizedMean:'Winsorized mean',
|
|
8163
|
+
robustOutliers:'Outliers (robust)',
|
|
8164
|
+
jarqueBera:'Jarque–Bera',
|
|
7844
8165
|
median:'Median',
|
|
7845
8166
|
p25:'25th percentile',
|
|
7846
8167
|
p75:'75th percentile',
|
|
@@ -7923,6 +8244,393 @@ if(bottom===0)return null;
|
|
|
7923
8244
|
const r=top/bottom;
|
|
7924
8245
|
return Math.max(-1,Math.min(1,r));
|
|
7925
8246
|
}
|
|
8247
|
+
function trimmedMean(values,share=0.1){
|
|
8248
|
+
const n=values.length;
|
|
8249
|
+
if(!n)return null;
|
|
8250
|
+
const sorted=Array.from(values).sort((a,b)=>a-b);
|
|
8251
|
+
const cut=Math.floor(n*Math.min(0.49,Math.max(0,share)));
|
|
8252
|
+
const kept=sorted.slice(cut,n-cut);
|
|
8253
|
+
if(!kept.length)return quantileSorted(sorted,0.5);
|
|
8254
|
+
let sum=0;
|
|
8255
|
+
for(const v of kept)sum+=v;
|
|
8256
|
+
return sum/kept.length;
|
|
8257
|
+
}
|
|
8258
|
+
function winsorizedMean(values,share=0.1){
|
|
8259
|
+
const n=values.length;
|
|
8260
|
+
if(!n)return null;
|
|
8261
|
+
const sorted=Array.from(values).sort((a,b)=>a-b);
|
|
8262
|
+
const cut=Math.floor(n*Math.min(0.49,Math.max(0,share)));
|
|
8263
|
+
const low=sorted[cut];
|
|
8264
|
+
const high=sorted[n-1-cut];
|
|
8265
|
+
let sum=0;
|
|
8266
|
+
for(const v of sorted)sum+=Math.min(high,Math.max(low,v));
|
|
8267
|
+
return sum/n;
|
|
8268
|
+
}
|
|
8269
|
+
function modifiedZOutliers(values,threshold=3.5){
|
|
8270
|
+
const n=values.length;
|
|
8271
|
+
if(!n)return null;
|
|
8272
|
+
const sorted=Array.from(values).sort((a,b)=>a-b);
|
|
8273
|
+
const middle=quantileSorted(sorted,0.5);
|
|
8274
|
+
const deviations=sorted.map((v)=>Math.abs(v-middle)).sort((a,b)=>a-b);
|
|
8275
|
+
const mad=quantileSorted(deviations,0.5);
|
|
8276
|
+
if(mad===0)return null;
|
|
8277
|
+
let count=0;
|
|
8278
|
+
for(const v of sorted)if(Math.abs((0.6745*(v-middle))/mad)>threshold)count++;
|
|
8279
|
+
return count;
|
|
8280
|
+
}
|
|
8281
|
+
function jarqueBera(values){
|
|
8282
|
+
const n=values.length;
|
|
8283
|
+
if(n<8)return null;
|
|
8284
|
+
let mean=0;
|
|
8285
|
+
for(const v of values)mean+=v;
|
|
8286
|
+
mean/=n;
|
|
8287
|
+
let m2=0;
|
|
8288
|
+
let m3=0;
|
|
8289
|
+
let m4=0;
|
|
8290
|
+
for(const v of values){
|
|
8291
|
+
const d=v-mean;
|
|
8292
|
+
m2+=d*d;
|
|
8293
|
+
m3+=d*d*d;
|
|
8294
|
+
m4+=d*d*d*d;
|
|
8295
|
+
}
|
|
8296
|
+
m2/=n;
|
|
8297
|
+
m3/=n;
|
|
8298
|
+
m4/=n;
|
|
8299
|
+
if(m2===0)return null;
|
|
8300
|
+
const skew=m3/m2**1.5;
|
|
8301
|
+
const excess=m4/(m2*m2)-3;
|
|
8302
|
+
return(n/6)*(skew*skew+(excess*excess)/4);
|
|
8303
|
+
}
|
|
8304
|
+
function weightedQuantile(values,weights,p){
|
|
8305
|
+
const paired=[];
|
|
8306
|
+
let total=0;
|
|
8307
|
+
for(let i=0;i<values.length;i++){
|
|
8308
|
+
const v=Number(values[i]);
|
|
8309
|
+
const w=Number(weights[i]);
|
|
8310
|
+
if(!Number.isFinite(v)||!Number.isFinite(w)||w<=0)continue;
|
|
8311
|
+
paired.push([v,w]);
|
|
8312
|
+
total+=w;
|
|
8313
|
+
}
|
|
8314
|
+
if(!paired.length||total<=0)return null;
|
|
8315
|
+
paired.sort((a,b)=>a[0]-b[0]);
|
|
8316
|
+
if(paired.length===1)return paired[0][0];
|
|
8317
|
+
const at=[];
|
|
8318
|
+
let seen=0;
|
|
8319
|
+
for(const[,w]of paired){
|
|
8320
|
+
at.push((seen+w/2)/total);
|
|
8321
|
+
seen+=w;
|
|
8322
|
+
}
|
|
8323
|
+
const target=Math.max(0,Math.min(1,p));
|
|
8324
|
+
if(target<=at[0])return paired[0][0];
|
|
8325
|
+
if(target>=at[at.length-1])return paired[paired.length-1][0];
|
|
8326
|
+
for(let i=1;i<at.length;i++){
|
|
8327
|
+
if(target>at[i])continue;
|
|
8328
|
+
const span=at[i]-at[i-1];
|
|
8329
|
+
const within=span>0?(target-at[i-1])/span:0;
|
|
8330
|
+
return paired[i-1][0]+(paired[i][0]-paired[i-1][0])*within;
|
|
8331
|
+
}
|
|
8332
|
+
return paired[paired.length-1][0];
|
|
8333
|
+
}
|
|
8334
|
+
function pairs(a,b,indices){
|
|
8335
|
+
const readA=valueReader(a);
|
|
8336
|
+
const readB=valueReader(b);
|
|
8337
|
+
const xs=new Float64Array(indices.length);
|
|
8338
|
+
const ys=new Float64Array(indices.length);
|
|
8339
|
+
let n=0;
|
|
8340
|
+
for(let i=0;i<indices.length;i++){
|
|
8341
|
+
const row=indices[i];
|
|
8342
|
+
const x=Number(readA(row));
|
|
8343
|
+
const y=Number(readB(row));
|
|
8344
|
+
if(!Number.isFinite(x)||!Number.isFinite(y))continue;
|
|
8345
|
+
xs[n]=x;
|
|
8346
|
+
ys[n]=y;
|
|
8347
|
+
n++;
|
|
8348
|
+
}
|
|
8349
|
+
return{xs:xs.subarray(0,n),ys:ys.subarray(0,n),n};
|
|
8350
|
+
}
|
|
8351
|
+
function covariance(a,b,indices,population=false){
|
|
8352
|
+
const{xs,ys,n}=pairs(a,b,indices);
|
|
8353
|
+
if(n<2)return null;
|
|
8354
|
+
let mx=0;
|
|
8355
|
+
let my=0;
|
|
8356
|
+
for(let i=0;i<n;i++){mx+=xs[i];my+=ys[i];}
|
|
8357
|
+
mx/=n;
|
|
8358
|
+
my/=n;
|
|
8359
|
+
let sum=0;
|
|
8360
|
+
for(let i=0;i<n;i++)sum+=(xs[i]-mx)*(ys[i]-my);
|
|
8361
|
+
return sum/(population?n:n-1);
|
|
8362
|
+
}
|
|
8363
|
+
function regression(a,b,indices){
|
|
8364
|
+
const{xs,ys,n}=pairs(a,b,indices);
|
|
8365
|
+
if(n<2)return null;
|
|
8366
|
+
let mx=0;
|
|
8367
|
+
let my=0;
|
|
8368
|
+
for(let i=0;i<n;i++){mx+=xs[i];my+=ys[i];}
|
|
8369
|
+
mx/=n;
|
|
8370
|
+
my/=n;
|
|
8371
|
+
let sxx=0;
|
|
8372
|
+
let sxy=0;
|
|
8373
|
+
let syy=0;
|
|
8374
|
+
for(let i=0;i<n;i++){
|
|
8375
|
+
const dx=xs[i]-mx;
|
|
8376
|
+
const dy=ys[i]-my;
|
|
8377
|
+
sxx+=dx*dx;
|
|
8378
|
+
sxy+=dx*dy;
|
|
8379
|
+
syy+=dy*dy;
|
|
8380
|
+
}
|
|
8381
|
+
if(sxx===0)return null;
|
|
8382
|
+
const slope=sxy/sxx;
|
|
8383
|
+
const intercept=my-slope*mx;
|
|
8384
|
+
const r2=syy===0?1:Math.max(0,Math.min(1,(sxy*sxy)/(sxx*syy)));
|
|
8385
|
+
const residual=Math.max(0,syy-slope*sxy);
|
|
8386
|
+
const stdError=n>2?Math.sqrt(residual/(n-2)/sxx):0;
|
|
8387
|
+
return{slope,intercept,r2,stdError,n};
|
|
8388
|
+
}
|
|
8389
|
+
function ranksOf(values){
|
|
8390
|
+
const n=values.length;
|
|
8391
|
+
const order=Array.from({length:n},(unused,i)=>i)
|
|
8392
|
+
.sort((i,j)=>values[i]-values[j]);
|
|
8393
|
+
const ranks=new Float64Array(n);
|
|
8394
|
+
let i=0;
|
|
8395
|
+
while(i<n){
|
|
8396
|
+
let j=i;
|
|
8397
|
+
while(j+1<n&&values[order[j+1]]===values[order[i]])j++;
|
|
8398
|
+
const shared=(i+j)/2+1;
|
|
8399
|
+
for(let k=i;k<=j;k++)ranks[order[k]]=shared;
|
|
8400
|
+
i=j+1;
|
|
8401
|
+
}
|
|
8402
|
+
return ranks;
|
|
8403
|
+
}
|
|
8404
|
+
function spearman(a,b,indices){
|
|
8405
|
+
const{xs,ys,n}=pairs(a,b,indices);
|
|
8406
|
+
if(n<2)return null;
|
|
8407
|
+
const rx=ranksOf(xs);
|
|
8408
|
+
const ry=ranksOf(ys);
|
|
8409
|
+
let mx=0;
|
|
8410
|
+
let my=0;
|
|
8411
|
+
for(let i=0;i<n;i++){mx+=rx[i];my+=ry[i];}
|
|
8412
|
+
mx/=n;
|
|
8413
|
+
my/=n;
|
|
8414
|
+
let sxy=0;
|
|
8415
|
+
let sxx=0;
|
|
8416
|
+
let syy=0;
|
|
8417
|
+
for(let i=0;i<n;i++){
|
|
8418
|
+
const dx=rx[i]-mx;
|
|
8419
|
+
const dy=ry[i]-my;
|
|
8420
|
+
sxy+=dx*dy;
|
|
8421
|
+
sxx+=dx*dx;
|
|
8422
|
+
syy+=dy*dy;
|
|
8423
|
+
}
|
|
8424
|
+
if(sxx===0||syy===0)return null;
|
|
8425
|
+
return Math.max(-1,Math.min(1,sxy/Math.sqrt(sxx*syy)));
|
|
8426
|
+
}
|
|
8427
|
+
function kendall(a,b,indices){
|
|
8428
|
+
const{xs,ys,n}=pairs(a,b,indices);
|
|
8429
|
+
if(n<2||n>KENDALL_LIMIT)return null;
|
|
8430
|
+
let concordant=0;
|
|
8431
|
+
let discordant=0;
|
|
8432
|
+
let tiedXOnly=0;
|
|
8433
|
+
let tiedYOnly=0;
|
|
8434
|
+
for(let i=0;i<n;i++){
|
|
8435
|
+
for(let j=i+1;j<n;j++){
|
|
8436
|
+
const dx=Math.sign(xs[i]-xs[j]);
|
|
8437
|
+
const dy=Math.sign(ys[i]-ys[j]);
|
|
8438
|
+
const product=dx*dy;
|
|
8439
|
+
if(product>0)concordant++;
|
|
8440
|
+
else if(product<0)discordant++;
|
|
8441
|
+
else if(dx===0&&dy===0){}
|
|
8442
|
+
else if(dx===0)tiedXOnly++;
|
|
8443
|
+
else tiedYOnly++;
|
|
8444
|
+
}
|
|
8445
|
+
}
|
|
8446
|
+
const orderedByX=concordant+discordant+tiedYOnly;
|
|
8447
|
+
const orderedByY=concordant+discordant+tiedXOnly;
|
|
8448
|
+
if(orderedByX===0||orderedByY===0)return null;
|
|
8449
|
+
return(concordant-discordant)/Math.sqrt(orderedByX*orderedByY);
|
|
8450
|
+
}
|
|
8451
|
+
function seriesStats(ordered,opts={}){
|
|
8452
|
+
const n=ordered.length;
|
|
8453
|
+
if(n<2)return null;
|
|
8454
|
+
const first=ordered[0];
|
|
8455
|
+
const last=ordered[n-1];
|
|
8456
|
+
const returns=[];
|
|
8457
|
+
for(let i=1;i<n;i++){
|
|
8458
|
+
const previous=ordered[i-1];
|
|
8459
|
+
if(previous===0)continue;
|
|
8460
|
+
returns.push((ordered[i]-previous)/Math.abs(previous));
|
|
8461
|
+
}
|
|
8462
|
+
let volatility=null;
|
|
8463
|
+
if(returns.length>1){
|
|
8464
|
+
let mean=0;
|
|
8465
|
+
for(const r of returns)mean+=r;
|
|
8466
|
+
mean/=returns.length;
|
|
8467
|
+
let m2=0;
|
|
8468
|
+
for(const r of returns)m2+=(r-mean)**2;
|
|
8469
|
+
volatility=Math.sqrt(m2/(returns.length-1));
|
|
8470
|
+
}
|
|
8471
|
+
const periods=Number(opts.periodsPerYear)>0?Number(opts.periodsPerYear):null;
|
|
8472
|
+
let peak=ordered[0];
|
|
8473
|
+
let peakAt=0;
|
|
8474
|
+
let worst=0;
|
|
8475
|
+
let worstFrom=0;
|
|
8476
|
+
let worstTo=0;
|
|
8477
|
+
for(let i=1;i<n;i++){
|
|
8478
|
+
if(ordered[i]>peak){peak=ordered[i];peakAt=i;continue;}
|
|
8479
|
+
if(peak<=0)continue;
|
|
8480
|
+
const fall=(peak-ordered[i])/peak;
|
|
8481
|
+
if(fall>worst){worst=fall;worstFrom=peakAt;worstTo=i;}
|
|
8482
|
+
}
|
|
8483
|
+
let autocorrelation=null;
|
|
8484
|
+
if(n>2){
|
|
8485
|
+
let mean=0;
|
|
8486
|
+
for(let i=0;i<n;i++)mean+=ordered[i];
|
|
8487
|
+
mean/=n;
|
|
8488
|
+
let top=0;
|
|
8489
|
+
let bottom=0;
|
|
8490
|
+
for(let i=0;i<n;i++){
|
|
8491
|
+
const d=ordered[i]-mean;
|
|
8492
|
+
bottom+=d*d;
|
|
8493
|
+
if(i>0)top+=d*(ordered[i-1]-mean);
|
|
8494
|
+
}
|
|
8495
|
+
autocorrelation=bottom>0?top/bottom:null;
|
|
8496
|
+
}
|
|
8497
|
+
let up=0;
|
|
8498
|
+
let down=0;
|
|
8499
|
+
for(const r of returns){if(r>0)up++;else if(r<0)down++;}
|
|
8500
|
+
let growth=null;
|
|
8501
|
+
if(first>0&&last>0){
|
|
8502
|
+
const perPeriod=(last/first)**(1/(n-1))-1;
|
|
8503
|
+
growth=periods?(1+perPeriod)**periods-1:perPeriod;
|
|
8504
|
+
}
|
|
8505
|
+
return{
|
|
8506
|
+
n,
|
|
8507
|
+
first,
|
|
8508
|
+
last,
|
|
8509
|
+
change:last-first,
|
|
8510
|
+
changePercent:first===0?null:((last-first)/Math.abs(first))*100,
|
|
8511
|
+
volatility,
|
|
8512
|
+
annualisedVolatility:volatility!==null&&periods?volatility*Math.sqrt(periods):null,
|
|
8513
|
+
growth,
|
|
8514
|
+
maxDrawdown:worst,
|
|
8515
|
+
maxDrawdownFrom:worstFrom,
|
|
8516
|
+
maxDrawdownTo:worstTo,
|
|
8517
|
+
autocorrelation,
|
|
8518
|
+
upDays:up,
|
|
8519
|
+
downDays:down,
|
|
8520
|
+
};
|
|
8521
|
+
}
|
|
8522
|
+
const D2_N2=1.128;
|
|
8523
|
+
function withinSigma(ordered){
|
|
8524
|
+
const n=ordered.length;
|
|
8525
|
+
if(n<2)return null;
|
|
8526
|
+
let total=0;
|
|
8527
|
+
for(let i=1;i<n;i++)total+=Math.abs(ordered[i]-ordered[i-1]);
|
|
8528
|
+
const meanRange=total/(n-1);
|
|
8529
|
+
return{sigma:meanRange/D2_N2,meanRange};
|
|
8530
|
+
}
|
|
8531
|
+
function capability(ordered,spec){
|
|
8532
|
+
const n=ordered.length;
|
|
8533
|
+
if(n<2||!spec)return null;
|
|
8534
|
+
const lower=Number.isFinite(Number(spec.lower))?Number(spec.lower):null;
|
|
8535
|
+
const upper=Number.isFinite(Number(spec.upper))?Number(spec.upper):null;
|
|
8536
|
+
if(lower===null&&upper===null)return null;
|
|
8537
|
+
let mean=0;
|
|
8538
|
+
for(let i=0;i<n;i++)mean+=ordered[i];
|
|
8539
|
+
mean/=n;
|
|
8540
|
+
let m2=0;
|
|
8541
|
+
for(let i=0;i<n;i++)m2+=(ordered[i]-mean)**2;
|
|
8542
|
+
const overall=Math.sqrt(m2/(n-1));
|
|
8543
|
+
const within=withinSigma(ordered);
|
|
8544
|
+
const sigmaWithin=within?within.sigma:null;
|
|
8545
|
+
const indices=(sigma)=>{
|
|
8546
|
+
if(!sigma||sigma<=0)return{index:null,k:null};
|
|
8547
|
+
const both=lower!==null&&upper!==null;
|
|
8548
|
+
const index=both?(upper-lower)/(6*sigma):null;
|
|
8549
|
+
const upperSide=upper!==null?(upper-mean)/(3*sigma):Infinity;
|
|
8550
|
+
const lowerSide=lower!==null?(mean-lower)/(3*sigma):Infinity;
|
|
8551
|
+
return{index,k:Math.min(upperSide,lowerSide)};
|
|
8552
|
+
};
|
|
8553
|
+
const short=indices(sigmaWithin);
|
|
8554
|
+
const long=indices(overall);
|
|
8555
|
+
let outOfSpec=0;
|
|
8556
|
+
for(let i=0;i<n;i++){
|
|
8557
|
+
if(lower!==null&&ordered[i]<lower){outOfSpec++;continue;}
|
|
8558
|
+
if(upper!==null&&ordered[i]>upper)outOfSpec++;
|
|
8559
|
+
}
|
|
8560
|
+
return{
|
|
8561
|
+
n,
|
|
8562
|
+
mean,
|
|
8563
|
+
lower,
|
|
8564
|
+
upper,
|
|
8565
|
+
target:Number.isFinite(Number(spec.target))?Number(spec.target):null,
|
|
8566
|
+
sigmaWithin,
|
|
8567
|
+
sigmaOverall:overall,
|
|
8568
|
+
cp:short.index,
|
|
8569
|
+
cpk:short.k,
|
|
8570
|
+
pp:long.index,
|
|
8571
|
+
ppk:long.k,
|
|
8572
|
+
outOfSpec,
|
|
8573
|
+
defectRate:n?outOfSpec/n:null,
|
|
8574
|
+
};
|
|
8575
|
+
}
|
|
8576
|
+
function controlLimits(ordered){
|
|
8577
|
+
const n=ordered.length;
|
|
8578
|
+
if(n<2)return null;
|
|
8579
|
+
const within=withinSigma(ordered);
|
|
8580
|
+
if(!within||!(within.sigma>0))return null;
|
|
8581
|
+
let centre=0;
|
|
8582
|
+
for(let i=0;i<n;i++)centre+=ordered[i];
|
|
8583
|
+
centre/=n;
|
|
8584
|
+
return{
|
|
8585
|
+
centre,
|
|
8586
|
+
sigma:within.sigma,
|
|
8587
|
+
upper:centre+3*within.sigma,
|
|
8588
|
+
lower:centre-3*within.sigma,
|
|
8589
|
+
};
|
|
8590
|
+
}
|
|
8591
|
+
function controlViolations(ordered,limits){
|
|
8592
|
+
if(!limits||!(limits.sigma>0))return[];
|
|
8593
|
+
const n=ordered.length;
|
|
8594
|
+
const{centre,sigma}=limits;
|
|
8595
|
+
const z=(i)=>(ordered[i]-centre)/sigma;
|
|
8596
|
+
const out=[];
|
|
8597
|
+
for(let i=0;i<n;i++){
|
|
8598
|
+
if(Math.abs(z(i))>3){
|
|
8599
|
+
out.push({index:i,rule:1,description:'beyond three sigma'});
|
|
8600
|
+
}
|
|
8601
|
+
if(i>=2){
|
|
8602
|
+
for(const side of[1,-1]){
|
|
8603
|
+
let hits=0;
|
|
8604
|
+
for(let k=i-2;k<=i;k++)if(z(k)*side>2)hits++;
|
|
8605
|
+
if(hits>=2){
|
|
8606
|
+
out.push({index:i,rule:2,description:'two of three past two sigma'});
|
|
8607
|
+
break;
|
|
8608
|
+
}
|
|
8609
|
+
}
|
|
8610
|
+
}
|
|
8611
|
+
if(i>=4){
|
|
8612
|
+
for(const side of[1,-1]){
|
|
8613
|
+
let hits=0;
|
|
8614
|
+
for(let k=i-4;k<=i;k++)if(z(k)*side>1)hits++;
|
|
8615
|
+
if(hits>=4){
|
|
8616
|
+
out.push({index:i,rule:3,description:'four of five past one sigma'});
|
|
8617
|
+
break;
|
|
8618
|
+
}
|
|
8619
|
+
}
|
|
8620
|
+
}
|
|
8621
|
+
if(i>=7){
|
|
8622
|
+
for(const side of[1,-1]){
|
|
8623
|
+
let all=true;
|
|
8624
|
+
for(let k=i-7;k<=i;k++)if(z(k)*side<=0){all=false;break;}
|
|
8625
|
+
if(all){
|
|
8626
|
+
out.push({index:i,rule:4,description:'eight in a row on one side'});
|
|
8627
|
+
break;
|
|
8628
|
+
}
|
|
8629
|
+
}
|
|
8630
|
+
}
|
|
8631
|
+
}
|
|
8632
|
+
return out;
|
|
8633
|
+
}
|
|
7926
8634
|
function countOutside(values,low,high){
|
|
7927
8635
|
let count=0;
|
|
7928
8636
|
for(let i=0;i<values.length;i++){
|
|
@@ -12245,14 +12953,22 @@ return this.#keyIndex.get(key);
|
|
|
12245
12953
|
#changedColumns(previous,next){
|
|
12246
12954
|
const changed=[];
|
|
12247
12955
|
for(const colId of this.#queryColumns()){
|
|
12248
|
-
|
|
12249
|
-
if(!column)continue;
|
|
12250
|
-
const before=isFunction(column.getValue)?column.getValue(previous):undefined;
|
|
12251
|
-
const after=isFunction(column.getValue)?column.getValue(next):undefined;
|
|
12252
|
-
if(!Object.is(before,after))changed.push(colId);
|
|
12956
|
+
if(this.#column(colId)&&this.#moved(colId,previous,next,new Set()))changed.push(colId);
|
|
12253
12957
|
}
|
|
12254
12958
|
return changed;
|
|
12255
12959
|
}
|
|
12960
|
+
#moved(colId,previous,next,seen){
|
|
12961
|
+
if(seen.has(colId))return false;
|
|
12962
|
+
seen.add(colId);
|
|
12963
|
+
const column=this.#column(colId);
|
|
12964
|
+
if(!column)return false;
|
|
12965
|
+
const deps=column.value&&column.value.deps;
|
|
12966
|
+
if(Array.isArray(deps)&&deps.length){
|
|
12967
|
+
return deps.some((dep)=>this.#moved(String(dep),previous,next,seen));
|
|
12968
|
+
}
|
|
12969
|
+
if(!isFunction(column.getValue))return false;
|
|
12970
|
+
return!Object.is(column.getValue(previous),column.getValue(next));
|
|
12971
|
+
}
|
|
12256
12972
|
#queryColumns(){
|
|
12257
12973
|
const ids=new Set();
|
|
12258
12974
|
for(const entry of this.#state('sort',[]))ids.add(entry.col);
|
|
@@ -12401,7 +13117,16 @@ handleFor(colId){
|
|
|
12401
13117
|
return this.#handles.handle(colId);
|
|
12402
13118
|
}
|
|
12403
13119
|
#runSort(filtered){
|
|
12404
|
-
const entries=this.#state('sort',[])
|
|
13120
|
+
const entries=this.#state('sort',[]).filter((entry)=>{
|
|
13121
|
+
const column=this.#column(entry.col);
|
|
13122
|
+
if(!column||!column.running)return true;
|
|
13123
|
+
warnOnce(
|
|
13124
|
+
`source.sort.running.${entry.col}`,
|
|
13125
|
+
`sort ignores "${entry.col}": a running total is a function of the sort order, `
|
|
13126
|
+
+'so it cannot also decide it. Sort by the column it runs over instead.',
|
|
13127
|
+
);
|
|
13128
|
+
return false;
|
|
13129
|
+
});
|
|
12405
13130
|
if(!entries.length)return filtered;
|
|
12406
13131
|
const locale=(this.#ctx.config||{}).locale;
|
|
12407
13132
|
if(entries.length===1){
|
|
@@ -24451,132 +25176,143 @@ const ShadowTracker=__m8["ShadowTracker"];
|
|
|
24451
25176
|
const shadowsIn=__m8["shadowsIn"];
|
|
24452
25177
|
const __m9=__req("packages/core/src/compute/total.js");
|
|
24453
25178
|
const total=__m9["total"];
|
|
24454
|
-
const __m10=__req("packages/core/src/compute/
|
|
24455
|
-
const
|
|
24456
|
-
const
|
|
24457
|
-
const
|
|
24458
|
-
const
|
|
24459
|
-
const
|
|
24460
|
-
const
|
|
24461
|
-
const
|
|
24462
|
-
const
|
|
24463
|
-
const __m11
|
|
24464
|
-
const
|
|
24465
|
-
const
|
|
24466
|
-
const
|
|
24467
|
-
const
|
|
24468
|
-
const
|
|
24469
|
-
const
|
|
24470
|
-
const
|
|
24471
|
-
const
|
|
24472
|
-
const
|
|
24473
|
-
const
|
|
24474
|
-
const
|
|
24475
|
-
const
|
|
24476
|
-
const
|
|
24477
|
-
const
|
|
24478
|
-
const
|
|
24479
|
-
const
|
|
24480
|
-
const
|
|
24481
|
-
const
|
|
24482
|
-
const
|
|
24483
|
-
const
|
|
24484
|
-
const
|
|
24485
|
-
const
|
|
24486
|
-
const
|
|
24487
|
-
const
|
|
24488
|
-
const
|
|
24489
|
-
const
|
|
24490
|
-
const
|
|
24491
|
-
const
|
|
24492
|
-
const
|
|
24493
|
-
const
|
|
24494
|
-
const
|
|
24495
|
-
const
|
|
24496
|
-
const
|
|
24497
|
-
const
|
|
24498
|
-
const
|
|
24499
|
-
const
|
|
24500
|
-
const
|
|
24501
|
-
const
|
|
24502
|
-
const
|
|
24503
|
-
const
|
|
24504
|
-
const
|
|
24505
|
-
const
|
|
24506
|
-
const
|
|
24507
|
-
const
|
|
24508
|
-
const
|
|
24509
|
-
const
|
|
24510
|
-
const
|
|
24511
|
-
const
|
|
24512
|
-
const
|
|
24513
|
-
const
|
|
24514
|
-
const
|
|
24515
|
-
const
|
|
24516
|
-
const
|
|
24517
|
-
const
|
|
24518
|
-
const
|
|
24519
|
-
const
|
|
24520
|
-
const
|
|
24521
|
-
const
|
|
24522
|
-
const
|
|
24523
|
-
const
|
|
24524
|
-
const
|
|
24525
|
-
const
|
|
24526
|
-
const
|
|
24527
|
-
const
|
|
24528
|
-
const
|
|
24529
|
-
const
|
|
24530
|
-
const
|
|
24531
|
-
const
|
|
24532
|
-
const
|
|
24533
|
-
const
|
|
24534
|
-
const
|
|
24535
|
-
const
|
|
24536
|
-
const
|
|
24537
|
-
const
|
|
24538
|
-
const
|
|
24539
|
-
const
|
|
24540
|
-
const
|
|
24541
|
-
const
|
|
24542
|
-
const
|
|
24543
|
-
const
|
|
24544
|
-
const
|
|
24545
|
-
const
|
|
24546
|
-
const
|
|
24547
|
-
const
|
|
24548
|
-
const
|
|
24549
|
-
const
|
|
24550
|
-
const
|
|
24551
|
-
const
|
|
24552
|
-
const
|
|
24553
|
-
const
|
|
24554
|
-
const
|
|
24555
|
-
const
|
|
24556
|
-
const
|
|
24557
|
-
const
|
|
24558
|
-
const
|
|
24559
|
-
const
|
|
24560
|
-
const
|
|
24561
|
-
const
|
|
24562
|
-
const
|
|
24563
|
-
const
|
|
24564
|
-
const
|
|
24565
|
-
const
|
|
24566
|
-
const
|
|
24567
|
-
const
|
|
24568
|
-
const
|
|
24569
|
-
const
|
|
24570
|
-
const
|
|
24571
|
-
const
|
|
24572
|
-
const
|
|
24573
|
-
const
|
|
24574
|
-
const
|
|
24575
|
-
const
|
|
24576
|
-
const
|
|
24577
|
-
const
|
|
24578
|
-
const
|
|
24579
|
-
const
|
|
25179
|
+
const __m10=__req("packages/core/src/compute/handle.js");
|
|
25180
|
+
const statValueReader=__m10["valueReader"];
|
|
25181
|
+
const __m11=__req("packages/core/src/compute/statistics.js");
|
|
25182
|
+
const MAINTENANCE=__m11["MAINTENANCE"];
|
|
25183
|
+
const statCorrelation=__m11["correlation"];
|
|
25184
|
+
const statMoments=__m11["moments"];
|
|
25185
|
+
const countOutside=__m11["countOutside"];
|
|
25186
|
+
const statCapability=__m11["capability"];
|
|
25187
|
+
const statControlLimits=__m11["controlLimits"];
|
|
25188
|
+
const statControlViolations=__m11["controlViolations"];
|
|
25189
|
+
const statCovariance=__m11["covariance"];
|
|
25190
|
+
const statHistogram=__m11["histogram"];
|
|
25191
|
+
const statKendall=__m11["kendall"];
|
|
25192
|
+
const statRegression=__m11["regression"];
|
|
25193
|
+
const statSeries=__m11["seriesStats"];
|
|
25194
|
+
const statSpearman=__m11["spearman"];
|
|
25195
|
+
const statWeightedQuantile=__m11["weightedQuantile"];
|
|
25196
|
+
const statNumbers=__m11["numbers"];
|
|
25197
|
+
const statQuantileSorted=__m11["quantileSorted"];
|
|
25198
|
+
const statWeightedAverage=__m11["weightedAverage"];
|
|
25199
|
+
const __m12=__req("packages/core/src/columns/detailcolumn.js");
|
|
25200
|
+
const createDetailColumn=__m12["createDetailColumn"];
|
|
25201
|
+
const DETAIL_COLUMN_ID=__m12["DETAIL_COLUMN_ID"];
|
|
25202
|
+
const __m13=__req("packages/core/src/columns/treecolumn.js");
|
|
25203
|
+
const createTreeColumn=__m13["createTreeColumn"];
|
|
25204
|
+
const TREE_COLUMN_ID=__m13["TREE_COLUMN_ID"];
|
|
25205
|
+
const __m14=__req("packages/core/src/columns/pivotcolumns.js");
|
|
25206
|
+
const createPivotColumns=__m14["createPivotColumns"];
|
|
25207
|
+
const __m15=__req("packages/core/src/compute/pivot.js");
|
|
25208
|
+
const pivotKey=__m15["pivotKey"];
|
|
25209
|
+
const DEFAULT_PATH_SEPARATOR=__m15["DEFAULT_PATH_SEPARATOR"];
|
|
25210
|
+
const __m16=__req("packages/core/src/columns/value.js");
|
|
25211
|
+
const ValuePipeline=__m16["ValuePipeline"];
|
|
25212
|
+
const __m17=__req("packages/core/src/store/columnstore.js");
|
|
25213
|
+
const ColumnStore=__m17["ColumnStore"];
|
|
25214
|
+
const __m18=__req("packages/core/src/store/pool.js");
|
|
25215
|
+
const MaskPool=__m18["MaskPool"];
|
|
25216
|
+
const __m19=__req("packages/core/src/compute/index.js");
|
|
25217
|
+
const compute=__m19;
|
|
25218
|
+
const __m20=__req("packages/core/src/source/index.js");
|
|
25219
|
+
const createSource=__m20["createSource"];
|
|
25220
|
+
const __m21=__req("packages/core/src/source/rows.js");
|
|
25221
|
+
const pinnedRow=__m21["pinnedRow"];
|
|
25222
|
+
const DEFAULT_ROW_HEIGHT=__m21["DEFAULT_ROW_HEIGHT"];
|
|
25223
|
+
const __m22=__req("packages/core/src/model/rowkey.js");
|
|
25224
|
+
const createRowKey=__m22["createRowKey"];
|
|
25225
|
+
const __m23=__req("packages/core/src/model/rowmodel.js");
|
|
25226
|
+
const RowModel=__m23["RowModel"];
|
|
25227
|
+
const createRow=__m23["createRow"];
|
|
25228
|
+
const __m24=__req("packages/core/src/model/selection.js");
|
|
25229
|
+
const SelectionModel=__m24["SelectionModel"];
|
|
25230
|
+
const RangeModel=__m24["RangeModel"];
|
|
25231
|
+
const summarise=__m24["summarise"];
|
|
25232
|
+
const __m25=__req("packages/core/src/model/history.js");
|
|
25233
|
+
const HistoryModel=__m25["HistoryModel"];
|
|
25234
|
+
const __m26=__req("packages/core/src/model/diff.js");
|
|
25235
|
+
const DiffModel=__m26["DiffModel"];
|
|
25236
|
+
const readValue=__m26["readValue"];
|
|
25237
|
+
const __m27=__req("packages/core/src/model/views.js");
|
|
25238
|
+
const ViewStore=__m27["ViewStore"];
|
|
25239
|
+
const __m28=__req("packages/core/src/model/highlight.js");
|
|
25240
|
+
const HighlightModel=__m28["HighlightModel"];
|
|
25241
|
+
const __m29=__req("packages/core/src/model/redaction.js");
|
|
25242
|
+
const RedactionModel=__m29["RedactionModel"];
|
|
25243
|
+
const __m30=__req("packages/core/src/model/presentation.js");
|
|
25244
|
+
const PresentationModel=__m30["PresentationModel"];
|
|
25245
|
+
const __m31=__req("packages/core/src/model/timeline.js");
|
|
25246
|
+
const Timeline=__m31["Timeline"];
|
|
25247
|
+
const __m32=__req("packages/core/src/model/facets.js");
|
|
25248
|
+
const FacetModel=__m32["FacetModel"];
|
|
25249
|
+
const DEFAULT_DEBOUNCE=__m32["DEFAULT_DEBOUNCE"];
|
|
25250
|
+
const DEFAULT_ROW_CEILING=__m32["DEFAULT_ROW_CEILING"];
|
|
25251
|
+
const DEFAULT_FACET_HEIGHT=__m32["DEFAULT_FACET_HEIGHT"];
|
|
25252
|
+
const __m33=__req("packages/core/src/model/comments.js");
|
|
25253
|
+
const CommentModel=__m33["CommentModel"];
|
|
25254
|
+
const parseCommentKey=__m33["parseCellKey"];
|
|
25255
|
+
const DEFAULT_INDEX_DEBOUNCE=__m33["DEFAULT_INDEX_DEBOUNCE"];
|
|
25256
|
+
const DEFAULT_INDEX_LIMIT=__m33["DEFAULT_INDEX_LIMIT"];
|
|
25257
|
+
const __m34=__req("packages/core/src/model/diagnostics.js");
|
|
25258
|
+
const Diagnostics=__m34["Diagnostics"];
|
|
25259
|
+
const WARNING_IDS=__m34["WARNING_IDS"];
|
|
25260
|
+
const instrument=__m34["instrument"];
|
|
25261
|
+
const instrumentProvider=__m34["instrumentProvider"];
|
|
25262
|
+
const __m35=__req("packages/core/src/model/presence.js");
|
|
25263
|
+
const PresenceModel=__m35["PresenceModel"];
|
|
25264
|
+
const DEFAULT_THROTTLE_MS=__m35["DEFAULT_THROTTLE_MS"];
|
|
25265
|
+
const DEFAULT_IDLE_MS=__m35["DEFAULT_IDLE_MS"];
|
|
25266
|
+
const DEFAULT_REMOVE_MS=__m35["DEFAULT_REMOVE_MS"];
|
|
25267
|
+
const DEFAULT_LOCK_MS=__m35["DEFAULT_LOCK_MS"];
|
|
25268
|
+
const __m36=__req("packages/core/src/compute/facet.js");
|
|
25269
|
+
const facetKind=__m36["facetKind"];
|
|
25270
|
+
const DEFAULT_BUCKETS=__m36["DEFAULT_BUCKETS"];
|
|
25271
|
+
const DEFAULT_CARDINALITY_LIMIT=__m36["DEFAULT_CARDINALITY_LIMIT"];
|
|
25272
|
+
const __m37=__req("packages/worker/src/host.js");
|
|
25273
|
+
const createWorkerHost=__m37["createWorkerHost"];
|
|
25274
|
+
const __m38=__req("packages/core/src/i18n/index.js");
|
|
25275
|
+
const Messages=__m38["Messages"];
|
|
25276
|
+
const MESSAGE_KEYS=__m38["MESSAGE_KEYS"];
|
|
25277
|
+
const __m39=__req("packages/core/src/model/pending.js");
|
|
25278
|
+
const PendingWrites=__m39["PendingWrites"];
|
|
25279
|
+
const __m40=__req("packages/core/src/registry/licence.js");
|
|
25280
|
+
const setSharedLicence=__m40["setLicence"];
|
|
25281
|
+
const licenceInfo=__m40["licenceInfo"];
|
|
25282
|
+
const licenceWatermark=__m40["watermark"];
|
|
25283
|
+
const licenceState=__m40["licenceState"];
|
|
25284
|
+
const sharedLicence=__m40["sharedLicence"];
|
|
25285
|
+
const __m41=__req("packages/core/src/columns/permissions.js");
|
|
25286
|
+
const PermissionModel=__m41["PermissionModel"];
|
|
25287
|
+
const __m42=__req("packages/core/src/ai/schema.js");
|
|
25288
|
+
const describeGrid=__m42["describeGrid"];
|
|
25289
|
+
const promptText=__m42["promptText"];
|
|
25290
|
+
const toolDefinition=__m42["toolDefinition"];
|
|
25291
|
+
const __m43=__req("packages/core/src/ai/intent.js");
|
|
25292
|
+
const planIntent=__m43["planIntent"];
|
|
25293
|
+
const applyPlan=__m43["applyPlan"];
|
|
25294
|
+
const buildPrompt=__m43["buildPrompt"];
|
|
25295
|
+
const __m44=__req("packages/core/src/model/edit.js");
|
|
25296
|
+
const EditModel=__m44["EditModel"];
|
|
25297
|
+
const __m45=__req("packages/core/src/model/changes.js");
|
|
25298
|
+
const ChangeModel=__m45["ChangeModel"];
|
|
25299
|
+
const __m46=__req("packages/core/src/model/state.js");
|
|
25300
|
+
const StateModel=__m46["StateModel"];
|
|
25301
|
+
const __m47=__req("packages/core/src/formatting/model.js");
|
|
25302
|
+
const FormattingModel=__m47["FormattingModel"];
|
|
25303
|
+
const GRID_SCOPE=__m47["GRID_SCOPE"];
|
|
25304
|
+
const __m48=__req("packages/core/src/formatting/rules.js");
|
|
25305
|
+
const summariseColumn=__m48["summariseColumn"];
|
|
25306
|
+
const __m49=__req("packages/core/src/export/index.js");
|
|
25307
|
+
const exportCsv=__m49["exportCsv"];
|
|
25308
|
+
const exportExcel=__m49["exportExcel"];
|
|
25309
|
+
const copyToClipboard=__m49["copyToClipboard"];
|
|
25310
|
+
const writeClipboardText=__m49["writeClipboardText"];
|
|
25311
|
+
const printGrid=__m49["printGrid"];
|
|
25312
|
+
const buildClipboardText=__m49["buildClipboardText"];
|
|
25313
|
+
const pasteIntoRange=__m49["pasteIntoRange"];
|
|
25314
|
+
const writeHookFor=__m49["writeHookFor"];
|
|
25315
|
+
const parseClipboardText=__m49["parseClipboardText"];
|
|
24580
25316
|
const QUICK_MODES=['contains','words','fuzzy','regex'];
|
|
24581
25317
|
function canonicalise(column,value){
|
|
24582
25318
|
const lookup=column&&column.lookup;
|
|
@@ -24720,6 +25456,8 @@ pageSize:0,
|
|
|
24720
25456
|
#renderer=null;
|
|
24721
25457
|
#destroyed=false;
|
|
24722
25458
|
#shadows=new Map();
|
|
25459
|
+
#running=new Map();
|
|
25460
|
+
#filteredKeyCache=null;
|
|
24723
25461
|
#ready=false;
|
|
24724
25462
|
#teardown=new Set();
|
|
24725
25463
|
constructor(config={}){
|
|
@@ -25528,6 +26266,75 @@ return this.#store?this.#store.column(colId):undefined;
|
|
|
25528
26266
|
const handle=this.#handleFor(colId);
|
|
25529
26267
|
return handle?statNumbers(handle,this.#statIndices()):new Float64Array(0);
|
|
25530
26268
|
}
|
|
26269
|
+
#filteredKeys(){
|
|
26270
|
+
const indices=this.#statIndices();
|
|
26271
|
+
if(this.#filteredKeyCache&&this.#filteredKeyCache.indices===indices){
|
|
26272
|
+
return this.#filteredKeyCache.keys;
|
|
26273
|
+
}
|
|
26274
|
+
const keys=new Set();
|
|
26275
|
+
const all=isFunction(this.#source.rows)?this.#source.rows():null;
|
|
26276
|
+
for(let i=0;i<indices.length;i++){
|
|
26277
|
+
const data=all?all[indices[i]]:null;
|
|
26278
|
+
const key=data==null?null:this.#rowKey(data);
|
|
26279
|
+
if(key!==null&&key!==undefined)keys.add(String(key));
|
|
26280
|
+
}
|
|
26281
|
+
this.#filteredKeyCache={indices,keys};
|
|
26282
|
+
return keys;
|
|
26283
|
+
}
|
|
26284
|
+
#runningValues(colId,kind){
|
|
26285
|
+
const rows=this.#displayRows();
|
|
26286
|
+
const cached=this.#running.get(colId);
|
|
26287
|
+
if(cached&&cached.rows===rows&&cached.kind===kind)return cached.values;
|
|
26288
|
+
const values=new Map();
|
|
26289
|
+
let total=0;
|
|
26290
|
+
let grand=0;
|
|
26291
|
+
if(kind==='percent'){
|
|
26292
|
+
for(const row of rows){
|
|
26293
|
+
if(!row||row.kind)continue;
|
|
26294
|
+
const v=Number(this.#values.value(this.#columns.get(colId),row.data,row));
|
|
26295
|
+
if(Number.isFinite(v))grand+=v;
|
|
26296
|
+
}
|
|
26297
|
+
}
|
|
26298
|
+
for(const row of rows){
|
|
26299
|
+
if(!row||row.kind)continue;
|
|
26300
|
+
const v=Number(this.#values.value(this.#columns.get(colId),row.data,row));
|
|
26301
|
+
if(Number.isFinite(v))total+=v;
|
|
26302
|
+
const key=row.key===undefined||row.key===null?null:String(row.key);
|
|
26303
|
+
if(!key)continue;
|
|
26304
|
+
values.set(key,kind==='percent'?(grand?(total/grand)*100:null):total);
|
|
26305
|
+
}
|
|
26306
|
+
this.#running.set(colId,{rows,kind,values});
|
|
26307
|
+
return values;
|
|
26308
|
+
}
|
|
26309
|
+
#orderedValues(colId,by){
|
|
26310
|
+
const values=this.#handleFor(colId);
|
|
26311
|
+
if(!values)return null;
|
|
26312
|
+
const indices=this.#statIndices();
|
|
26313
|
+
const readValue=statValueReader(values);
|
|
26314
|
+
if(!by){
|
|
26315
|
+
const out=[];
|
|
26316
|
+
for(let i=0;i<indices.length;i++){
|
|
26317
|
+
const v=Number(readValue(indices[i]));
|
|
26318
|
+
if(Number.isFinite(v))out.push(v);
|
|
26319
|
+
}
|
|
26320
|
+
return out;
|
|
26321
|
+
}
|
|
26322
|
+
const order=this.#handleFor(by);
|
|
26323
|
+
if(!order)return null;
|
|
26324
|
+
const readOrder=statValueReader(order);
|
|
26325
|
+
const rows=[];
|
|
26326
|
+
for(let i=0;i<indices.length;i++){
|
|
26327
|
+
const row=indices[i];
|
|
26328
|
+
const v=Number(readValue(row));
|
|
26329
|
+
const raw=readOrder(row);
|
|
26330
|
+
const at=raw instanceof Date?raw.getTime()
|
|
26331
|
+
:(typeof raw==='number'?raw:Date.parse(String(raw)));
|
|
26332
|
+
if(!Number.isFinite(v)||!Number.isFinite(at))continue;
|
|
26333
|
+
rows.push([at,v]);
|
|
26334
|
+
}
|
|
26335
|
+
rows.sort((x,y)=>x[0]-y[0]);
|
|
26336
|
+
return rows.map((r)=>r[1]);
|
|
26337
|
+
}
|
|
25531
26338
|
#statIndices(){
|
|
25532
26339
|
const source=this.#source;
|
|
25533
26340
|
if(isFunction(source.filteredIndices))return source.filteredIndices();
|
|
@@ -26529,6 +27336,36 @@ return summarise(grid.#ranges.cells((i)=>grid.rows.get(i)).map(
|
|
|
26529
27336
|
({key,colId})=>grid.rows.value(key,colId),
|
|
26530
27337
|
));
|
|
26531
27338
|
},
|
|
27339
|
+
statistics(){
|
|
27340
|
+
const cells=grid.#ranges.cells((i)=>grid.rows.get(i));
|
|
27341
|
+
if(!cells.length)return null;
|
|
27342
|
+
const raw=cells.map(({key,colId})=>grid.rows.value(key,colId));
|
|
27343
|
+
const base=summarise(raw);
|
|
27344
|
+
const numbers=[];
|
|
27345
|
+
const seen=new Set();
|
|
27346
|
+
for(const v of raw){
|
|
27347
|
+
if(v===null||v===undefined||v==='')continue;
|
|
27348
|
+
seen.add(typeof v==='object'?String(v):v);
|
|
27349
|
+
const n=typeof v==='number'?v:Number(v);
|
|
27350
|
+
if(Number.isFinite(n))numbers.push(n);
|
|
27351
|
+
}
|
|
27352
|
+
if(!numbers.length)return{...base,cells:cells.length,distinct:seen.size};
|
|
27353
|
+
const sorted=numbers.slice().sort((a,b)=>a-b);
|
|
27354
|
+
const{n,mean,m2}=statMoments(Float64Array.from(sorted));
|
|
27355
|
+
const q1=statQuantileSorted(sorted,0.25);
|
|
27356
|
+
const q3=statQuantileSorted(sorted,0.75);
|
|
27357
|
+
return{
|
|
27358
|
+
...base,
|
|
27359
|
+
cells:cells.length,
|
|
27360
|
+
distinct:seen.size,
|
|
27361
|
+
median:statQuantileSorted(sorted,0.5),
|
|
27362
|
+
q1,
|
|
27363
|
+
q3,
|
|
27364
|
+
iqr:q3-q1,
|
|
27365
|
+
stddev:n>1?Math.sqrt(m2/(n-1)):null,
|
|
27366
|
+
outliers:countOutside(Float64Array.from(sorted),q1-1.5*(q3-q1),q3+1.5*(q3-q1)),
|
|
27367
|
+
};
|
|
27368
|
+
},
|
|
26532
27369
|
};
|
|
26533
27370
|
}
|
|
26534
27371
|
get filters(){
|
|
@@ -27354,9 +28191,9 @@ get active(){return grid.#redaction.active;},
|
|
|
27354
28191
|
get statistics(){
|
|
27355
28192
|
const grid=this;
|
|
27356
28193
|
return{
|
|
27357
|
-
shadow(colId,kind,rowKey){
|
|
28194
|
+
shadow(colId,kind,rowKey,scope){
|
|
27358
28195
|
const tracker=grid.#shadows.get(colId);
|
|
27359
|
-
return tracker?tracker.read(kind,rowKey):null;
|
|
28196
|
+
return tracker?tracker.read(kind,rowKey,scope==='filtered'?grid.#filteredKeys():undefined):null;
|
|
27360
28197
|
},
|
|
27361
28198
|
rebase(colId){
|
|
27362
28199
|
if(colId){
|
|
@@ -27414,6 +28251,79 @@ const second=grid.#handleFor(b);
|
|
|
27414
28251
|
if(!first||!second)return null;
|
|
27415
28252
|
return statCorrelation(first,second,grid.#statIndices());
|
|
27416
28253
|
},
|
|
28254
|
+
covariance(a,b,opts={}){
|
|
28255
|
+
const first=grid.#handleFor(a);
|
|
28256
|
+
const second=grid.#handleFor(b);
|
|
28257
|
+
if(!first||!second)return null;
|
|
28258
|
+
return statCovariance(first,second,grid.#statIndices(),opts.population===true);
|
|
28259
|
+
},
|
|
28260
|
+
regression(a,b){
|
|
28261
|
+
const first=grid.#handleFor(a);
|
|
28262
|
+
const second=grid.#handleFor(b);
|
|
28263
|
+
if(!first||!second)return null;
|
|
28264
|
+
return statRegression(first,second,grid.#statIndices());
|
|
28265
|
+
},
|
|
28266
|
+
spearman(a,b){
|
|
28267
|
+
const first=grid.#handleFor(a);
|
|
28268
|
+
const second=grid.#handleFor(b);
|
|
28269
|
+
if(!first||!second)return null;
|
|
28270
|
+
return statSpearman(first,second,grid.#statIndices());
|
|
28271
|
+
},
|
|
28272
|
+
kendall(a,b){
|
|
28273
|
+
const first=grid.#handleFor(a);
|
|
28274
|
+
const second=grid.#handleFor(b);
|
|
28275
|
+
if(!first||!second)return null;
|
|
28276
|
+
return statKendall(first,second,grid.#statIndices());
|
|
28277
|
+
},
|
|
28278
|
+
weightedQuantile(colId,weightId,p=0.5){
|
|
28279
|
+
const values=grid.#handleFor(colId);
|
|
28280
|
+
const weights=grid.#handleFor(weightId);
|
|
28281
|
+
if(!values||!weights)return null;
|
|
28282
|
+
const indices=grid.#statIndices();
|
|
28283
|
+
const readV=statValueReader(values);
|
|
28284
|
+
const readW=statValueReader(weights);
|
|
28285
|
+
const vs=[];
|
|
28286
|
+
const ws=[];
|
|
28287
|
+
for(let i=0;i<indices.length;i++){
|
|
28288
|
+
vs.push(Number(readV(indices[i])));
|
|
28289
|
+
ws.push(Number(readW(indices[i])));
|
|
28290
|
+
}
|
|
28291
|
+
return statWeightedQuantile(vs,ws,p);
|
|
28292
|
+
},
|
|
28293
|
+
running(colId,kind,rowKey){
|
|
28294
|
+
const values=grid.#runningValues(colId,kind);
|
|
28295
|
+
return values&&values.has(rowKey)?values.get(rowKey):null;
|
|
28296
|
+
},
|
|
28297
|
+
capability(colId,opts={}){
|
|
28298
|
+
const handle=grid.#handleFor(colId);
|
|
28299
|
+
if(!handle)return null;
|
|
28300
|
+
const column=grid.#columns.get(colId);
|
|
28301
|
+
const declared=(column&&column.spec)||{};
|
|
28302
|
+
const spec={
|
|
28303
|
+
lower:opts.lower===undefined?declared.lower:opts.lower,
|
|
28304
|
+
upper:opts.upper===undefined?declared.upper:opts.upper,
|
|
28305
|
+
target:opts.target===undefined?declared.target:opts.target,
|
|
28306
|
+
};
|
|
28307
|
+
const ordered=grid.#orderedValues(colId,opts.by);
|
|
28308
|
+
if(!ordered)return null;
|
|
28309
|
+
const result=statCapability(ordered,spec);
|
|
28310
|
+
if(!result)return null;
|
|
28311
|
+
const from=Number(opts.baseline)>1
|
|
28312
|
+
?ordered.slice(0,Math.min(ordered.length,Math.floor(Number(opts.baseline))))
|
|
28313
|
+
:ordered;
|
|
28314
|
+
const limits=statControlLimits(from);
|
|
28315
|
+
return{
|
|
28316
|
+
...result,
|
|
28317
|
+
limits,
|
|
28318
|
+
baseline:from.length,
|
|
28319
|
+
violations:limits?statControlViolations(ordered,limits):[],
|
|
28320
|
+
};
|
|
28321
|
+
},
|
|
28322
|
+
series(colId,opts){
|
|
28323
|
+
if(!opts||!opts.by)return null;
|
|
28324
|
+
const ordered=grid.#orderedValues(colId,opts.by);
|
|
28325
|
+
return ordered?statSeries(ordered,opts):null;
|
|
28326
|
+
},
|
|
27417
28327
|
weightedAverage(colId,weightId){
|
|
27418
28328
|
const values=grid.#handleFor(colId);
|
|
27419
28329
|
const weights=grid.#handleFor(weightId);
|
|
@@ -27742,6 +28652,8 @@ Object.defineProperty(__exports,"RADIX_PRESETS",{enumerable:true,get:function(){
|
|
|
27742
28652
|
Object.defineProperty(__exports,"parseRadix",{enumerable:true,get:function(){return parseRadix;}});
|
|
27743
28653
|
Object.defineProperty(__exports,"formatRadix",{enumerable:true,get:function(){return formatRadix;}});
|
|
27744
28654
|
Object.defineProperty(__exports,"createUnitType",{enumerable:true,get:function(){return createUnitType;}});
|
|
28655
|
+
Object.defineProperty(__exports,"registerUnitSystem",{enumerable:true,get:function(){return registerUnitSystem;}});
|
|
28656
|
+
Object.defineProperty(__exports,"defineUnit",{enumerable:true,get:function(){return defineUnit;}});
|
|
27745
28657
|
Object.defineProperty(__exports,"UNIT_SYSTEMS",{enumerable:true,get:function(){return UNIT_SYSTEMS;}});
|
|
27746
28658
|
Object.defineProperty(__exports,"parseUnit",{enumerable:true,get:function(){return parseUnit;}});
|
|
27747
28659
|
Object.defineProperty(__exports,"formatUnit",{enumerable:true,get:function(){return formatUnit;}});
|
|
@@ -27752,6 +28664,8 @@ const RADIX_PRESETS=__m0["RADIX_PRESETS"];
|
|
|
27752
28664
|
const parseRadix=__m0["parseRadix"];
|
|
27753
28665
|
const formatRadix=__m0["formatRadix"];
|
|
27754
28666
|
const createUnitType=__m0["createUnitType"];
|
|
28667
|
+
const registerUnitSystem=__m0["registerUnitSystem"];
|
|
28668
|
+
const defineUnit=__m0["defineUnit"];
|
|
27755
28669
|
const UNIT_SYSTEMS=__m0["UNIT_SYSTEMS"];
|
|
27756
28670
|
const parseUnit=__m0["parseUnit"];
|
|
27757
28671
|
const formatUnit=__m0["formatUnit"];
|
|
@@ -27901,6 +28815,62 @@ other:'{count} cellules mises à jour',
|
|
|
27901
28815
|
'panel.quickFilter':'Filtre rapide',
|
|
27902
28816
|
'panel.formatting':'Mise en forme',
|
|
27903
28817
|
'panel.statistics':'Statistiques',
|
|
28818
|
+
'panel.compare':'Comparer',
|
|
28819
|
+
'compare.first':'Première colonne',
|
|
28820
|
+
'compare.second':'Deuxième colonne',
|
|
28821
|
+
'compare.needTwo':'Deux colonnes numériques sont nécessaires',
|
|
28822
|
+
'compare.noPairs':'Aucune ligne n’a de valeur dans les deux',
|
|
28823
|
+
'compare.pairs':'{count} paires',
|
|
28824
|
+
'compare.pearson':'Corrélation (Pearson)',
|
|
28825
|
+
'compare.spearman':'Corrélation des rangs (Spearman)',
|
|
28826
|
+
'compare.kendall':'Tau de Kendall',
|
|
28827
|
+
'compare.covariance':'Covariance',
|
|
28828
|
+
'compare.slope':'Pente',
|
|
28829
|
+
'compare.intercept':'Ordonnée à l’origine',
|
|
28830
|
+
'compare.r2':'R²',
|
|
28831
|
+
'compare.stdError':'Erreur type',
|
|
28832
|
+
'compare.weighted':'Moyenne pondérée',
|
|
28833
|
+
'total.sum':'Somme',
|
|
28834
|
+
'total.avg':'Moyenne',
|
|
28835
|
+
'total.min':'Min',
|
|
28836
|
+
'total.max':'Max',
|
|
28837
|
+
'total.count':'Nombre',
|
|
28838
|
+
'total.countValues':'Nombre de valeurs',
|
|
28839
|
+
'total.first':'Premier',
|
|
28840
|
+
'total.last':'Dernier',
|
|
28841
|
+
'total.median':'Médiane',
|
|
28842
|
+
'total.p25':'25e centile',
|
|
28843
|
+
'total.p75':'75e centile',
|
|
28844
|
+
'total.p90':'90e centile',
|
|
28845
|
+
'total.p95':'95e centile',
|
|
28846
|
+
'total.p99':'99e centile',
|
|
28847
|
+
'total.iqr':'Écart interquartile',
|
|
28848
|
+
'total.mad':'Écart absolu médian',
|
|
28849
|
+
'total.variance':'Variance',
|
|
28850
|
+
'total.varianceP':'Variance (population)',
|
|
28851
|
+
'total.stddev':'Écart type',
|
|
28852
|
+
'total.stddevP':'Écart type (population)',
|
|
28853
|
+
'total.range':'Étendue',
|
|
28854
|
+
'total.distinct':'Valeurs distinctes',
|
|
28855
|
+
'total.mode':'Mode',
|
|
28856
|
+
'total.skewness':'Asymétrie',
|
|
28857
|
+
'total.kurtosis':'Aplatissement',
|
|
28858
|
+
'total.geomean':'Moyenne géométrique',
|
|
28859
|
+
'total.harmean':'Moyenne harmonique',
|
|
28860
|
+
'total.sumSquares':'Somme des carrés',
|
|
28861
|
+
'total.weightedAvg':'Moyenne pondérée',
|
|
28862
|
+
'total.argmin':'Plus bas selon',
|
|
28863
|
+
'total.argmax':'Plus haut selon',
|
|
28864
|
+
'total.hhi':'Concentration (IHH)',
|
|
28865
|
+
'total.entropy':'Entropie',
|
|
28866
|
+
'total.evenness':'Régularité',
|
|
28867
|
+
'total.top3Share':'Part des 3 premiers',
|
|
28868
|
+
'total.top10Share':'Part des 10 premiers',
|
|
28869
|
+
'total.gini':'Coefficient de Gini',
|
|
28870
|
+
'total.trimmedMean':'Moyenne tronquée',
|
|
28871
|
+
'total.winsorizedMean':'Moyenne winsorisée',
|
|
28872
|
+
'total.robustOutliers':'Valeurs aberrantes (robuste)',
|
|
28873
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
27904
28874
|
'stats.column':'Colonne',
|
|
27905
28875
|
'stats.choose':'Choisissez une colonne à analyser',
|
|
27906
28876
|
'stats.noColumns':'Aucune colonne numérique à analyser',
|
|
@@ -27920,6 +28890,15 @@ other:'{count} cellules mises à jour',
|
|
|
27920
28890
|
'stats.outliers':'Valeurs aberrantes',
|
|
27921
28891
|
'stats.distribution':'Distribution',
|
|
27922
28892
|
'stats.bin':'{count} entre {from} et {to}',
|
|
28893
|
+
'stats.section.shape':'Forme',
|
|
28894
|
+
'stats.section.robust':'Robuste',
|
|
28895
|
+
'stats.section.concentration':'Concentration',
|
|
28896
|
+
'stats.section.capability':'Capabilité',
|
|
28897
|
+
'stats.cp':'Cp',
|
|
28898
|
+
'stats.cpk':'Cpk',
|
|
28899
|
+
'stats.pp':'Pp',
|
|
28900
|
+
'stats.ppk':'Ppk',
|
|
28901
|
+
'stats.outOfSpec':'Hors spécification',
|
|
27923
28902
|
'stats.filtered':'Sur {count} lignes filtrées',
|
|
27924
28903
|
'panel.zone.group':'les regroupements de lignes',
|
|
27925
28904
|
'panel.zone.values':'les valeurs',
|
|
@@ -28312,6 +29291,62 @@ other:'{count} celle aggiornate',
|
|
|
28312
29291
|
'panel.quickFilter':'Filtro rapido',
|
|
28313
29292
|
'panel.formatting':'Formattazione',
|
|
28314
29293
|
'panel.statistics':'Statistiche',
|
|
29294
|
+
'panel.compare':'Confronta',
|
|
29295
|
+
'compare.first':'Prima colonna',
|
|
29296
|
+
'compare.second':'Seconda colonna',
|
|
29297
|
+
'compare.needTwo':'Servono due colonne numeriche',
|
|
29298
|
+
'compare.noPairs':'Nessuna riga ha un valore in entrambe',
|
|
29299
|
+
'compare.pairs':'{count} coppie',
|
|
29300
|
+
'compare.pearson':'Correlazione (Pearson)',
|
|
29301
|
+
'compare.spearman':'Correlazione per ranghi (Spearman)',
|
|
29302
|
+
'compare.kendall':'Tau di Kendall',
|
|
29303
|
+
'compare.covariance':'Covarianza',
|
|
29304
|
+
'compare.slope':'Pendenza',
|
|
29305
|
+
'compare.intercept':'Intercetta',
|
|
29306
|
+
'compare.r2':'R²',
|
|
29307
|
+
'compare.stdError':'Errore standard',
|
|
29308
|
+
'compare.weighted':'Media ponderata',
|
|
29309
|
+
'total.sum':'Somma',
|
|
29310
|
+
'total.avg':'Media',
|
|
29311
|
+
'total.min':'Min',
|
|
29312
|
+
'total.max':'Max',
|
|
29313
|
+
'total.count':'Conteggio',
|
|
29314
|
+
'total.countValues':'Conteggio valori',
|
|
29315
|
+
'total.first':'Primo',
|
|
29316
|
+
'total.last':'Ultimo',
|
|
29317
|
+
'total.median':'Mediana',
|
|
29318
|
+
'total.p25':'25° percentile',
|
|
29319
|
+
'total.p75':'75° percentile',
|
|
29320
|
+
'total.p90':'90° percentile',
|
|
29321
|
+
'total.p95':'95° percentile',
|
|
29322
|
+
'total.p99':'99° percentile',
|
|
29323
|
+
'total.iqr':'Scarto interquartile',
|
|
29324
|
+
'total.mad':'Deviazione assoluta mediana',
|
|
29325
|
+
'total.variance':'Varianza',
|
|
29326
|
+
'total.varianceP':'Varianza (popolazione)',
|
|
29327
|
+
'total.stddev':'Deviazione standard',
|
|
29328
|
+
'total.stddevP':'Deviazione standard (popolazione)',
|
|
29329
|
+
'total.range':'Intervallo',
|
|
29330
|
+
'total.distinct':'Distinti',
|
|
29331
|
+
'total.mode':'Moda',
|
|
29332
|
+
'total.skewness':'Asimmetria',
|
|
29333
|
+
'total.kurtosis':'Curtosi',
|
|
29334
|
+
'total.geomean':'Media geometrica',
|
|
29335
|
+
'total.harmean':'Media armonica',
|
|
29336
|
+
'total.sumSquares':'Somma dei quadrati',
|
|
29337
|
+
'total.weightedAvg':'Media ponderata',
|
|
29338
|
+
'total.argmin':'Più basso per',
|
|
29339
|
+
'total.argmax':'Più alto per',
|
|
29340
|
+
'total.hhi':'Concentrazione (HHI)',
|
|
29341
|
+
'total.entropy':'Entropia',
|
|
29342
|
+
'total.evenness':'Uniformità',
|
|
29343
|
+
'total.top3Share':'Quota primi 3',
|
|
29344
|
+
'total.top10Share':'Quota primi 10',
|
|
29345
|
+
'total.gini':'Coefficiente di Gini',
|
|
29346
|
+
'total.trimmedMean':'Media troncata',
|
|
29347
|
+
'total.winsorizedMean':'Media winsorizzata',
|
|
29348
|
+
'total.robustOutliers':'Valori anomali (robusto)',
|
|
29349
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
28315
29350
|
'stats.column':'Colonna',
|
|
28316
29351
|
'stats.choose':'Scegli una colonna da analizzare',
|
|
28317
29352
|
'stats.noColumns':'Nessuna colonna numerica da analizzare',
|
|
@@ -28331,6 +29366,15 @@ other:'{count} celle aggiornate',
|
|
|
28331
29366
|
'stats.outliers':'Valori anomali',
|
|
28332
29367
|
'stats.distribution':'Distribuzione',
|
|
28333
29368
|
'stats.bin':'{count} tra {from} e {to}',
|
|
29369
|
+
'stats.section.shape':'Forma',
|
|
29370
|
+
'stats.section.robust':'Robusto',
|
|
29371
|
+
'stats.section.concentration':'Concentrazione',
|
|
29372
|
+
'stats.section.capability':'Capacità',
|
|
29373
|
+
'stats.cp':'Cp',
|
|
29374
|
+
'stats.cpk':'Cpk',
|
|
29375
|
+
'stats.pp':'Pp',
|
|
29376
|
+
'stats.ppk':'Ppk',
|
|
29377
|
+
'stats.outOfSpec':'Fuori specifica',
|
|
28334
29378
|
'stats.filtered':'Su {count} righe filtrate',
|
|
28335
29379
|
'panel.zone.group':'i raggruppamenti di righe',
|
|
28336
29380
|
'panel.zone.values':'i valori',
|
|
@@ -28708,6 +29752,62 @@ other:'{count} celdas actualizadas',
|
|
|
28708
29752
|
'panel.quickFilter':'Filtro rápido',
|
|
28709
29753
|
'panel.formatting':'Formato',
|
|
28710
29754
|
'panel.statistics':'Estadísticas',
|
|
29755
|
+
'panel.compare':'Comparar',
|
|
29756
|
+
'compare.first':'Primera columna',
|
|
29757
|
+
'compare.second':'Segunda columna',
|
|
29758
|
+
'compare.needTwo':'Se necesitan dos columnas numéricas',
|
|
29759
|
+
'compare.noPairs':'Ninguna fila tiene valor en ambas',
|
|
29760
|
+
'compare.pairs':'{count} pares',
|
|
29761
|
+
'compare.pearson':'Correlación (Pearson)',
|
|
29762
|
+
'compare.spearman':'Correlación de rangos (Spearman)',
|
|
29763
|
+
'compare.kendall':'Tau de Kendall',
|
|
29764
|
+
'compare.covariance':'Covarianza',
|
|
29765
|
+
'compare.slope':'Pendiente',
|
|
29766
|
+
'compare.intercept':'Intersección',
|
|
29767
|
+
'compare.r2':'R²',
|
|
29768
|
+
'compare.stdError':'Error típico',
|
|
29769
|
+
'compare.weighted':'Media ponderada',
|
|
29770
|
+
'total.sum':'Suma',
|
|
29771
|
+
'total.avg':'Promedio',
|
|
29772
|
+
'total.min':'Mín',
|
|
29773
|
+
'total.max':'Máx',
|
|
29774
|
+
'total.count':'Recuento',
|
|
29775
|
+
'total.countValues':'Recuento de valores',
|
|
29776
|
+
'total.first':'Primero',
|
|
29777
|
+
'total.last':'Último',
|
|
29778
|
+
'total.median':'Mediana',
|
|
29779
|
+
'total.p25':'Percentil 25',
|
|
29780
|
+
'total.p75':'Percentil 75',
|
|
29781
|
+
'total.p90':'Percentil 90',
|
|
29782
|
+
'total.p95':'Percentil 95',
|
|
29783
|
+
'total.p99':'Percentil 99',
|
|
29784
|
+
'total.iqr':'Rango intercuartílico',
|
|
29785
|
+
'total.mad':'Desviación absoluta mediana',
|
|
29786
|
+
'total.variance':'Varianza',
|
|
29787
|
+
'total.varianceP':'Varianza (población)',
|
|
29788
|
+
'total.stddev':'Desviación típica',
|
|
29789
|
+
'total.stddevP':'Desviación típica (población)',
|
|
29790
|
+
'total.range':'Rango',
|
|
29791
|
+
'total.distinct':'Distintos',
|
|
29792
|
+
'total.mode':'Moda',
|
|
29793
|
+
'total.skewness':'Asimetría',
|
|
29794
|
+
'total.kurtosis':'Curtosis',
|
|
29795
|
+
'total.geomean':'Media geométrica',
|
|
29796
|
+
'total.harmean':'Media armónica',
|
|
29797
|
+
'total.sumSquares':'Suma de cuadrados',
|
|
29798
|
+
'total.weightedAvg':'Media ponderada',
|
|
29799
|
+
'total.argmin':'Menor por',
|
|
29800
|
+
'total.argmax':'Mayor por',
|
|
29801
|
+
'total.hhi':'Concentración (HHI)',
|
|
29802
|
+
'total.entropy':'Entropía',
|
|
29803
|
+
'total.evenness':'Uniformidad',
|
|
29804
|
+
'total.top3Share':'Cuota de los 3 mayores',
|
|
29805
|
+
'total.top10Share':'Cuota de los 10 mayores',
|
|
29806
|
+
'total.gini':'Coeficiente de Gini',
|
|
29807
|
+
'total.trimmedMean':'Media recortada',
|
|
29808
|
+
'total.winsorizedMean':'Media winsorizada',
|
|
29809
|
+
'total.robustOutliers':'Valores atípicos (robusto)',
|
|
29810
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
28711
29811
|
'stats.column':'Columna',
|
|
28712
29812
|
'stats.choose':'Elija una columna para analizar',
|
|
28713
29813
|
'stats.noColumns':'No hay columnas numéricas que analizar',
|
|
@@ -28727,6 +29827,15 @@ other:'{count} celdas actualizadas',
|
|
|
28727
29827
|
'stats.outliers':'Valores atípicos',
|
|
28728
29828
|
'stats.distribution':'Distribución',
|
|
28729
29829
|
'stats.bin':'{count} entre {from} y {to}',
|
|
29830
|
+
'stats.section.shape':'Forma',
|
|
29831
|
+
'stats.section.robust':'Robusto',
|
|
29832
|
+
'stats.section.concentration':'Concentración',
|
|
29833
|
+
'stats.section.capability':'Capacidad',
|
|
29834
|
+
'stats.cp':'Cp',
|
|
29835
|
+
'stats.cpk':'Cpk',
|
|
29836
|
+
'stats.pp':'Pp',
|
|
29837
|
+
'stats.ppk':'Ppk',
|
|
29838
|
+
'stats.outOfSpec':'Fuera de especificación',
|
|
28730
29839
|
'stats.filtered':'De las {count} filas filtradas',
|
|
28731
29840
|
'panel.zone.group':'las agrupaciones de filas',
|
|
28732
29841
|
'panel.zone.values':'los valores',
|
|
@@ -29131,6 +30240,62 @@ other:'{count} células atualizadas',
|
|
|
29131
30240
|
'panel.quickFilter':'Filtro rápido',
|
|
29132
30241
|
'panel.formatting':'Formatação',
|
|
29133
30242
|
'panel.statistics':'Estatísticas',
|
|
30243
|
+
'panel.compare':'Comparar',
|
|
30244
|
+
'compare.first':'Primeira coluna',
|
|
30245
|
+
'compare.second':'Segunda coluna',
|
|
30246
|
+
'compare.needTwo':'São necessárias duas colunas numéricas',
|
|
30247
|
+
'compare.noPairs':'Nenhuma linha tem valor em ambas',
|
|
30248
|
+
'compare.pairs':'{count} pares',
|
|
30249
|
+
'compare.pearson':'Correlação (Pearson)',
|
|
30250
|
+
'compare.spearman':'Correlação de postos (Spearman)',
|
|
30251
|
+
'compare.kendall':'Tau de Kendall',
|
|
30252
|
+
'compare.covariance':'Covariância',
|
|
30253
|
+
'compare.slope':'Inclinação',
|
|
30254
|
+
'compare.intercept':'Intercepto',
|
|
30255
|
+
'compare.r2':'R²',
|
|
30256
|
+
'compare.stdError':'Erro padrão',
|
|
30257
|
+
'compare.weighted':'Média ponderada',
|
|
30258
|
+
'total.sum':'Soma',
|
|
30259
|
+
'total.avg':'Média',
|
|
30260
|
+
'total.min':'Mín',
|
|
30261
|
+
'total.max':'Máx',
|
|
30262
|
+
'total.count':'Contagem',
|
|
30263
|
+
'total.countValues':'Contagem de valores',
|
|
30264
|
+
'total.first':'Primeiro',
|
|
30265
|
+
'total.last':'Último',
|
|
30266
|
+
'total.median':'Mediana',
|
|
30267
|
+
'total.p25':'Percentil 25',
|
|
30268
|
+
'total.p75':'Percentil 75',
|
|
30269
|
+
'total.p90':'Percentil 90',
|
|
30270
|
+
'total.p95':'Percentil 95',
|
|
30271
|
+
'total.p99':'Percentil 99',
|
|
30272
|
+
'total.iqr':'Intervalo interquartil',
|
|
30273
|
+
'total.mad':'Desvio absoluto mediano',
|
|
30274
|
+
'total.variance':'Variância',
|
|
30275
|
+
'total.varianceP':'Variância (população)',
|
|
30276
|
+
'total.stddev':'Desvio padrão',
|
|
30277
|
+
'total.stddevP':'Desvio padrão (população)',
|
|
30278
|
+
'total.range':'Amplitude',
|
|
30279
|
+
'total.distinct':'Distintos',
|
|
30280
|
+
'total.mode':'Moda',
|
|
30281
|
+
'total.skewness':'Assimetria',
|
|
30282
|
+
'total.kurtosis':'Curtose',
|
|
30283
|
+
'total.geomean':'Média geométrica',
|
|
30284
|
+
'total.harmean':'Média harmônica',
|
|
30285
|
+
'total.sumSquares':'Soma dos quadrados',
|
|
30286
|
+
'total.weightedAvg':'Média ponderada',
|
|
30287
|
+
'total.argmin':'Menor por',
|
|
30288
|
+
'total.argmax':'Maior por',
|
|
30289
|
+
'total.hhi':'Concentração (HHI)',
|
|
30290
|
+
'total.entropy':'Entropia',
|
|
30291
|
+
'total.evenness':'Uniformidade',
|
|
30292
|
+
'total.top3Share':'Participação dos 3 maiores',
|
|
30293
|
+
'total.top10Share':'Participação dos 10 maiores',
|
|
30294
|
+
'total.gini':'Coeficiente de Gini',
|
|
30295
|
+
'total.trimmedMean':'Média aparada',
|
|
30296
|
+
'total.winsorizedMean':'Média winsorizada',
|
|
30297
|
+
'total.robustOutliers':'Valores atípicos (robusto)',
|
|
30298
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
29134
30299
|
'stats.column':'Coluna',
|
|
29135
30300
|
'stats.choose':'Escolha uma coluna para analisar',
|
|
29136
30301
|
'stats.noColumns':'Nenhuma coluna numérica para analisar',
|
|
@@ -29150,6 +30315,15 @@ other:'{count} células atualizadas',
|
|
|
29150
30315
|
'stats.outliers':'Valores atípicos',
|
|
29151
30316
|
'stats.distribution':'Distribuição',
|
|
29152
30317
|
'stats.bin':'{count} entre {from} e {to}',
|
|
30318
|
+
'stats.section.shape':'Forma',
|
|
30319
|
+
'stats.section.robust':'Robusto',
|
|
30320
|
+
'stats.section.concentration':'Concentração',
|
|
30321
|
+
'stats.section.capability':'Capacidade',
|
|
30322
|
+
'stats.cp':'Cp',
|
|
30323
|
+
'stats.cpk':'Cpk',
|
|
30324
|
+
'stats.pp':'Pp',
|
|
30325
|
+
'stats.ppk':'Ppk',
|
|
30326
|
+
'stats.outOfSpec':'Fora da especificação',
|
|
29153
30327
|
'stats.filtered':'De {count} linhas filtradas',
|
|
29154
30328
|
'panel.zone.group':'os agrupamentos de linhas',
|
|
29155
30329
|
'panel.zone.values':'os valores',
|
|
@@ -29554,6 +30728,62 @@ other:'{count} Zellen aktualisiert',
|
|
|
29554
30728
|
'panel.quickFilter':'Schnellfilter',
|
|
29555
30729
|
'panel.formatting':'Formatierung',
|
|
29556
30730
|
'panel.statistics':'Statistik',
|
|
30731
|
+
'panel.compare':'Vergleichen',
|
|
30732
|
+
'compare.first':'Erste Spalte',
|
|
30733
|
+
'compare.second':'Zweite Spalte',
|
|
30734
|
+
'compare.needTwo':'Zum Vergleich sind zwei numerische Spalten nötig',
|
|
30735
|
+
'compare.noPairs':'Keine Zeile hat in beiden einen Wert',
|
|
30736
|
+
'compare.pairs':'{count} Paare',
|
|
30737
|
+
'compare.pearson':'Korrelation (Pearson)',
|
|
30738
|
+
'compare.spearman':'Rangkorrelation (Spearman)',
|
|
30739
|
+
'compare.kendall':'Kendalls Tau',
|
|
30740
|
+
'compare.covariance':'Kovarianz',
|
|
30741
|
+
'compare.slope':'Steigung',
|
|
30742
|
+
'compare.intercept':'Achsenabschnitt',
|
|
30743
|
+
'compare.r2':'R²',
|
|
30744
|
+
'compare.stdError':'Standardfehler',
|
|
30745
|
+
'compare.weighted':'Gewichteter Mittelwert',
|
|
30746
|
+
'total.sum':'Summe',
|
|
30747
|
+
'total.avg':'Durchschnitt',
|
|
30748
|
+
'total.min':'Min',
|
|
30749
|
+
'total.max':'Max',
|
|
30750
|
+
'total.count':'Anzahl',
|
|
30751
|
+
'total.countValues':'Anzahl Werte',
|
|
30752
|
+
'total.first':'Erster',
|
|
30753
|
+
'total.last':'Letzter',
|
|
30754
|
+
'total.median':'Median',
|
|
30755
|
+
'total.p25':'25. Perzentil',
|
|
30756
|
+
'total.p75':'75. Perzentil',
|
|
30757
|
+
'total.p90':'90. Perzentil',
|
|
30758
|
+
'total.p95':'95. Perzentil',
|
|
30759
|
+
'total.p99':'99. Perzentil',
|
|
30760
|
+
'total.iqr':'Interquartilsabstand',
|
|
30761
|
+
'total.mad':'Mittlere absolute Abweichung',
|
|
30762
|
+
'total.variance':'Varianz',
|
|
30763
|
+
'total.varianceP':'Varianz (Grundgesamtheit)',
|
|
30764
|
+
'total.stddev':'Standardabweichung',
|
|
30765
|
+
'total.stddevP':'Standardabweichung (Grundgesamtheit)',
|
|
30766
|
+
'total.range':'Spannweite',
|
|
30767
|
+
'total.distinct':'Eindeutige',
|
|
30768
|
+
'total.mode':'Modus',
|
|
30769
|
+
'total.skewness':'Schiefe',
|
|
30770
|
+
'total.kurtosis':'Wölbung',
|
|
30771
|
+
'total.geomean':'Geometrisches Mittel',
|
|
30772
|
+
'total.harmean':'Harmonisches Mittel',
|
|
30773
|
+
'total.sumSquares':'Quadratsumme',
|
|
30774
|
+
'total.weightedAvg':'Gewichteter Mittelwert',
|
|
30775
|
+
'total.argmin':'Niedrigster nach',
|
|
30776
|
+
'total.argmax':'Höchster nach',
|
|
30777
|
+
'total.hhi':'Konzentration (HHI)',
|
|
30778
|
+
'total.entropy':'Entropie',
|
|
30779
|
+
'total.evenness':'Gleichmäßigkeit',
|
|
30780
|
+
'total.top3Share':'Anteil Top 3',
|
|
30781
|
+
'total.top10Share':'Anteil Top 10',
|
|
30782
|
+
'total.gini':'Gini-Koeffizient',
|
|
30783
|
+
'total.trimmedMean':'Getrimmtes Mittel',
|
|
30784
|
+
'total.winsorizedMean':'Winsorisiertes Mittel',
|
|
30785
|
+
'total.robustOutliers':'Ausreißer (robust)',
|
|
30786
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
29557
30787
|
'stats.column':'Spalte',
|
|
29558
30788
|
'stats.choose':'Spalte zum Analysieren wählen',
|
|
29559
30789
|
'stats.noColumns':'Keine numerischen Spalten zum Analysieren',
|
|
@@ -29573,6 +30803,15 @@ other:'{count} Zellen aktualisiert',
|
|
|
29573
30803
|
'stats.outliers':'Ausreißer',
|
|
29574
30804
|
'stats.distribution':'Verteilung',
|
|
29575
30805
|
'stats.bin':'{count} zwischen {from} und {to}',
|
|
30806
|
+
'stats.section.shape':'Form',
|
|
30807
|
+
'stats.section.robust':'Robust',
|
|
30808
|
+
'stats.section.concentration':'Konzentration',
|
|
30809
|
+
'stats.section.capability':'Fähigkeit',
|
|
30810
|
+
'stats.cp':'Cp',
|
|
30811
|
+
'stats.cpk':'Cpk',
|
|
30812
|
+
'stats.pp':'Pp',
|
|
30813
|
+
'stats.ppk':'Ppk',
|
|
30814
|
+
'stats.outOfSpec':'Außerhalb der Spezifikation',
|
|
29576
30815
|
'stats.filtered':'Von {count} gefilterten Zeilen',
|
|
29577
30816
|
'panel.zone.group':'Zeilengruppen',
|
|
29578
30817
|
'panel.zone.values':'Werte',
|
|
@@ -29977,6 +31216,62 @@ other:'{count} cellen bijgewerkt',
|
|
|
29977
31216
|
'panel.quickFilter':'Snelfilter',
|
|
29978
31217
|
'panel.formatting':'Opmaak',
|
|
29979
31218
|
'panel.statistics':'Statistiek',
|
|
31219
|
+
'panel.compare':'Vergelijken',
|
|
31220
|
+
'compare.first':'Eerste kolom',
|
|
31221
|
+
'compare.second':'Tweede kolom',
|
|
31222
|
+
'compare.needTwo':'Er zijn twee numerieke kolommen nodig',
|
|
31223
|
+
'compare.noPairs':'Geen rij heeft een waarde in beide',
|
|
31224
|
+
'compare.pairs':'{count} paren',
|
|
31225
|
+
'compare.pearson':'Correlatie (Pearson)',
|
|
31226
|
+
'compare.spearman':'Rangcorrelatie (Spearman)',
|
|
31227
|
+
'compare.kendall':'Kendalls tau',
|
|
31228
|
+
'compare.covariance':'Covariantie',
|
|
31229
|
+
'compare.slope':'Helling',
|
|
31230
|
+
'compare.intercept':'Snijpunt',
|
|
31231
|
+
'compare.r2':'R²',
|
|
31232
|
+
'compare.stdError':'Standaardfout',
|
|
31233
|
+
'compare.weighted':'Gewogen gemiddelde',
|
|
31234
|
+
'total.sum':'Som',
|
|
31235
|
+
'total.avg':'Gemiddelde',
|
|
31236
|
+
'total.min':'Min',
|
|
31237
|
+
'total.max':'Max',
|
|
31238
|
+
'total.count':'Aantal',
|
|
31239
|
+
'total.countValues':'Aantal waarden',
|
|
31240
|
+
'total.first':'Eerste',
|
|
31241
|
+
'total.last':'Laatste',
|
|
31242
|
+
'total.median':'Mediaan',
|
|
31243
|
+
'total.p25':'25e percentiel',
|
|
31244
|
+
'total.p75':'75e percentiel',
|
|
31245
|
+
'total.p90':'90e percentiel',
|
|
31246
|
+
'total.p95':'95e percentiel',
|
|
31247
|
+
'total.p99':'99e percentiel',
|
|
31248
|
+
'total.iqr':'Interkwartielafstand',
|
|
31249
|
+
'total.mad':'Mediane absolute afwijking',
|
|
31250
|
+
'total.variance':'Variantie',
|
|
31251
|
+
'total.varianceP':'Variantie (populatie)',
|
|
31252
|
+
'total.stddev':'Standaardafwijking',
|
|
31253
|
+
'total.stddevP':'Standaardafwijking (populatie)',
|
|
31254
|
+
'total.range':'Bereik',
|
|
31255
|
+
'total.distinct':'Unieke waarden',
|
|
31256
|
+
'total.mode':'Modus',
|
|
31257
|
+
'total.skewness':'Scheefheid',
|
|
31258
|
+
'total.kurtosis':'Kurtosis',
|
|
31259
|
+
'total.geomean':'Meetkundig gemiddelde',
|
|
31260
|
+
'total.harmean':'Harmonisch gemiddelde',
|
|
31261
|
+
'total.sumSquares':'Kwadratensom',
|
|
31262
|
+
'total.weightedAvg':'Gewogen gemiddelde',
|
|
31263
|
+
'total.argmin':'Laagste op',
|
|
31264
|
+
'total.argmax':'Hoogste op',
|
|
31265
|
+
'total.hhi':'Concentratie (HHI)',
|
|
31266
|
+
'total.entropy':'Entropie',
|
|
31267
|
+
'total.evenness':'Gelijkmatigheid',
|
|
31268
|
+
'total.top3Share':'Aandeel top 3',
|
|
31269
|
+
'total.top10Share':'Aandeel top 10',
|
|
31270
|
+
'total.gini':'Gini-coëfficiënt',
|
|
31271
|
+
'total.trimmedMean':'Getrimd gemiddelde',
|
|
31272
|
+
'total.winsorizedMean':'Gewinsoriseerd gemiddelde',
|
|
31273
|
+
'total.robustOutliers':'Uitschieters (robuust)',
|
|
31274
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
29980
31275
|
'stats.column':'Kolom',
|
|
29981
31276
|
'stats.choose':'Kies een kolom om te analyseren',
|
|
29982
31277
|
'stats.noColumns':'Geen numerieke kolommen om te analyseren',
|
|
@@ -29996,6 +31291,15 @@ other:'{count} cellen bijgewerkt',
|
|
|
29996
31291
|
'stats.outliers':'Uitschieters',
|
|
29997
31292
|
'stats.distribution':'Verdeling',
|
|
29998
31293
|
'stats.bin':'{count} tussen {from} en {to}',
|
|
31294
|
+
'stats.section.shape':'Vorm',
|
|
31295
|
+
'stats.section.robust':'Robuust',
|
|
31296
|
+
'stats.section.concentration':'Concentratie',
|
|
31297
|
+
'stats.section.capability':'Capabiliteit',
|
|
31298
|
+
'stats.cp':'Cp',
|
|
31299
|
+
'stats.cpk':'Cpk',
|
|
31300
|
+
'stats.pp':'Pp',
|
|
31301
|
+
'stats.ppk':'Ppk',
|
|
31302
|
+
'stats.outOfSpec':'Buiten specificatie',
|
|
29999
31303
|
'stats.filtered':'Van {count} gefilterde rijen',
|
|
30000
31304
|
'panel.zone.group':'de rijgroepen',
|
|
30001
31305
|
'panel.zone.values':'de waarden',
|
|
@@ -30400,6 +31704,62 @@ other:'{count} celler uppdaterade',
|
|
|
30400
31704
|
'panel.quickFilter':'Snabbfilter',
|
|
30401
31705
|
'panel.formatting':'Formatering',
|
|
30402
31706
|
'panel.statistics':'Statistik',
|
|
31707
|
+
'panel.compare':'Jämför',
|
|
31708
|
+
'compare.first':'Första kolumnen',
|
|
31709
|
+
'compare.second':'Andra kolumnen',
|
|
31710
|
+
'compare.needTwo':'Två numeriska kolumner krävs',
|
|
31711
|
+
'compare.noPairs':'Ingen rad har värde i båda',
|
|
31712
|
+
'compare.pairs':'{count} par',
|
|
31713
|
+
'compare.pearson':'Korrelation (Pearson)',
|
|
31714
|
+
'compare.spearman':'Rangkorrelation (Spearman)',
|
|
31715
|
+
'compare.kendall':'Kendalls tau',
|
|
31716
|
+
'compare.covariance':'Kovarians',
|
|
31717
|
+
'compare.slope':'Lutning',
|
|
31718
|
+
'compare.intercept':'Intercept',
|
|
31719
|
+
'compare.r2':'R²',
|
|
31720
|
+
'compare.stdError':'Standardfel',
|
|
31721
|
+
'compare.weighted':'Viktat medelvärde',
|
|
31722
|
+
'total.sum':'Summa',
|
|
31723
|
+
'total.avg':'Medelvärde',
|
|
31724
|
+
'total.min':'Min',
|
|
31725
|
+
'total.max':'Max',
|
|
31726
|
+
'total.count':'Antal',
|
|
31727
|
+
'total.countValues':'Antal värden',
|
|
31728
|
+
'total.first':'Första',
|
|
31729
|
+
'total.last':'Sista',
|
|
31730
|
+
'total.median':'Median',
|
|
31731
|
+
'total.p25':'25:e percentilen',
|
|
31732
|
+
'total.p75':'75:e percentilen',
|
|
31733
|
+
'total.p90':'90:e percentilen',
|
|
31734
|
+
'total.p95':'95:e percentilen',
|
|
31735
|
+
'total.p99':'99:e percentilen',
|
|
31736
|
+
'total.iqr':'Kvartilavstånd',
|
|
31737
|
+
'total.mad':'Median absolutavvikelse',
|
|
31738
|
+
'total.variance':'Varians',
|
|
31739
|
+
'total.varianceP':'Varians (population)',
|
|
31740
|
+
'total.stddev':'Standardavvikelse',
|
|
31741
|
+
'total.stddevP':'Standardavvikelse (population)',
|
|
31742
|
+
'total.range':'Variationsbredd',
|
|
31743
|
+
'total.distinct':'Unika',
|
|
31744
|
+
'total.mode':'Typvärde',
|
|
31745
|
+
'total.skewness':'Skevhet',
|
|
31746
|
+
'total.kurtosis':'Toppighet',
|
|
31747
|
+
'total.geomean':'Geometriskt medelvärde',
|
|
31748
|
+
'total.harmean':'Harmoniskt medelvärde',
|
|
31749
|
+
'total.sumSquares':'Kvadratsumma',
|
|
31750
|
+
'total.weightedAvg':'Viktat medelvärde',
|
|
31751
|
+
'total.argmin':'Lägst efter',
|
|
31752
|
+
'total.argmax':'Högst efter',
|
|
31753
|
+
'total.hhi':'Koncentration (HHI)',
|
|
31754
|
+
'total.entropy':'Entropi',
|
|
31755
|
+
'total.evenness':'Jämnhet',
|
|
31756
|
+
'total.top3Share':'Andel topp 3',
|
|
31757
|
+
'total.top10Share':'Andel topp 10',
|
|
31758
|
+
'total.gini':'Ginikoefficient',
|
|
31759
|
+
'total.trimmedMean':'Trimmat medelvärde',
|
|
31760
|
+
'total.winsorizedMean':'Winsoriserat medelvärde',
|
|
31761
|
+
'total.robustOutliers':'Avvikande värden (robust)',
|
|
31762
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
30403
31763
|
'stats.column':'Kolumn',
|
|
30404
31764
|
'stats.choose':'Välj en kolumn att analysera',
|
|
30405
31765
|
'stats.noColumns':'Inga numeriska kolumner att analysera',
|
|
@@ -30419,6 +31779,15 @@ other:'{count} celler uppdaterade',
|
|
|
30419
31779
|
'stats.outliers':'Avvikande värden',
|
|
30420
31780
|
'stats.distribution':'Fördelning',
|
|
30421
31781
|
'stats.bin':'{count} mellan {from} och {to}',
|
|
31782
|
+
'stats.section.shape':'Form',
|
|
31783
|
+
'stats.section.robust':'Robust',
|
|
31784
|
+
'stats.section.concentration':'Koncentration',
|
|
31785
|
+
'stats.section.capability':'Duglighet',
|
|
31786
|
+
'stats.cp':'Cp',
|
|
31787
|
+
'stats.cpk':'Cpk',
|
|
31788
|
+
'stats.pp':'Pp',
|
|
31789
|
+
'stats.ppk':'Ppk',
|
|
31790
|
+
'stats.outOfSpec':'Utanför specifikation',
|
|
30422
31791
|
'stats.filtered':'Av {count} filtrerade rader',
|
|
30423
31792
|
'panel.zone.group':'radgrupperna',
|
|
30424
31793
|
'panel.zone.values':'värdena',
|
|
@@ -30823,6 +32192,62 @@ other:'{count} celler opdateret',
|
|
|
30823
32192
|
'panel.quickFilter':'Hurtigfilter',
|
|
30824
32193
|
'panel.formatting':'Formatering',
|
|
30825
32194
|
'panel.statistics':'Statistik',
|
|
32195
|
+
'panel.compare':'Sammenlign',
|
|
32196
|
+
'compare.first':'Første kolonne',
|
|
32197
|
+
'compare.second':'Anden kolonne',
|
|
32198
|
+
'compare.needTwo':'Der kræves to numeriske kolonner',
|
|
32199
|
+
'compare.noPairs':'Ingen rækker har værdi i begge',
|
|
32200
|
+
'compare.pairs':'{count} par',
|
|
32201
|
+
'compare.pearson':'Korrelation (Pearson)',
|
|
32202
|
+
'compare.spearman':'Rangkorrelation (Spearman)',
|
|
32203
|
+
'compare.kendall':'Kendalls tau',
|
|
32204
|
+
'compare.covariance':'Kovarians',
|
|
32205
|
+
'compare.slope':'Hældning',
|
|
32206
|
+
'compare.intercept':'Skæring',
|
|
32207
|
+
'compare.r2':'R²',
|
|
32208
|
+
'compare.stdError':'Standardfejl',
|
|
32209
|
+
'compare.weighted':'Vægtet gennemsnit',
|
|
32210
|
+
'total.sum':'Sum',
|
|
32211
|
+
'total.avg':'Gennemsnit',
|
|
32212
|
+
'total.min':'Min',
|
|
32213
|
+
'total.max':'Maks',
|
|
32214
|
+
'total.count':'Antal',
|
|
32215
|
+
'total.countValues':'Antal værdier',
|
|
32216
|
+
'total.first':'Første',
|
|
32217
|
+
'total.last':'Sidste',
|
|
32218
|
+
'total.median':'Median',
|
|
32219
|
+
'total.p25':'25. percentil',
|
|
32220
|
+
'total.p75':'75. percentil',
|
|
32221
|
+
'total.p90':'90. percentil',
|
|
32222
|
+
'total.p95':'95. percentil',
|
|
32223
|
+
'total.p99':'99. percentil',
|
|
32224
|
+
'total.iqr':'Interkvartilbredde',
|
|
32225
|
+
'total.mad':'Median absolut afvigelse',
|
|
32226
|
+
'total.variance':'Varians',
|
|
32227
|
+
'total.varianceP':'Varians (population)',
|
|
32228
|
+
'total.stddev':'Standardafvigelse',
|
|
32229
|
+
'total.stddevP':'Standardafvigelse (population)',
|
|
32230
|
+
'total.range':'Spændvidde',
|
|
32231
|
+
'total.distinct':'Unikke',
|
|
32232
|
+
'total.mode':'Typetal',
|
|
32233
|
+
'total.skewness':'Skævhed',
|
|
32234
|
+
'total.kurtosis':'Kurtosis',
|
|
32235
|
+
'total.geomean':'Geometrisk gennemsnit',
|
|
32236
|
+
'total.harmean':'Harmonisk gennemsnit',
|
|
32237
|
+
'total.sumSquares':'Kvadratsum',
|
|
32238
|
+
'total.weightedAvg':'Vægtet gennemsnit',
|
|
32239
|
+
'total.argmin':'Laveste efter',
|
|
32240
|
+
'total.argmax':'Højeste efter',
|
|
32241
|
+
'total.hhi':'Koncentration (HHI)',
|
|
32242
|
+
'total.entropy':'Entropi',
|
|
32243
|
+
'total.evenness':'Jævnhed',
|
|
32244
|
+
'total.top3Share':'Top 3-andel',
|
|
32245
|
+
'total.top10Share':'Top 10-andel',
|
|
32246
|
+
'total.gini':'Gini-koefficient',
|
|
32247
|
+
'total.trimmedMean':'Trimmet gennemsnit',
|
|
32248
|
+
'total.winsorizedMean':'Winsoriseret gennemsnit',
|
|
32249
|
+
'total.robustOutliers':'Outliere (robust)',
|
|
32250
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
30826
32251
|
'stats.column':'Kolonne',
|
|
30827
32252
|
'stats.choose':'Vælg en kolonne at analysere',
|
|
30828
32253
|
'stats.noColumns':'Ingen numeriske kolonner at analysere',
|
|
@@ -30842,6 +32267,15 @@ other:'{count} celler opdateret',
|
|
|
30842
32267
|
'stats.outliers':'Outliere',
|
|
30843
32268
|
'stats.distribution':'Fordeling',
|
|
30844
32269
|
'stats.bin':'{count} mellem {from} og {to}',
|
|
32270
|
+
'stats.section.shape':'Form',
|
|
32271
|
+
'stats.section.robust':'Robust',
|
|
32272
|
+
'stats.section.concentration':'Koncentration',
|
|
32273
|
+
'stats.section.capability':'Kapabilitet',
|
|
32274
|
+
'stats.cp':'Cp',
|
|
32275
|
+
'stats.cpk':'Cpk',
|
|
32276
|
+
'stats.pp':'Pp',
|
|
32277
|
+
'stats.ppk':'Ppk',
|
|
32278
|
+
'stats.outOfSpec':'Uden for specifikation',
|
|
30845
32279
|
'stats.filtered':'Ud af {count} filtrerede rækker',
|
|
30846
32280
|
'panel.zone.group':'rækkegrupperne',
|
|
30847
32281
|
'panel.zone.values':'værdierne',
|
|
@@ -31246,6 +32680,62 @@ other:'{count} celler oppdatert',
|
|
|
31246
32680
|
'panel.quickFilter':'Hurtigfilter',
|
|
31247
32681
|
'panel.formatting':'Formatering',
|
|
31248
32682
|
'panel.statistics':'Statistikk',
|
|
32683
|
+
'panel.compare':'Sammenlign',
|
|
32684
|
+
'compare.first':'Første kolonne',
|
|
32685
|
+
'compare.second':'Andre kolonne',
|
|
32686
|
+
'compare.needTwo':'Det trengs to numeriske kolonner',
|
|
32687
|
+
'compare.noPairs':'Ingen rader har verdi i begge',
|
|
32688
|
+
'compare.pairs':'{count} par',
|
|
32689
|
+
'compare.pearson':'Korrelasjon (Pearson)',
|
|
32690
|
+
'compare.spearman':'Rangkorrelasjon (Spearman)',
|
|
32691
|
+
'compare.kendall':'Kendalls tau',
|
|
32692
|
+
'compare.covariance':'Kovarians',
|
|
32693
|
+
'compare.slope':'Stigningstall',
|
|
32694
|
+
'compare.intercept':'Skjæringspunkt',
|
|
32695
|
+
'compare.r2':'R²',
|
|
32696
|
+
'compare.stdError':'Standardfeil',
|
|
32697
|
+
'compare.weighted':'Vektet gjennomsnitt',
|
|
32698
|
+
'total.sum':'Sum',
|
|
32699
|
+
'total.avg':'Gjennomsnitt',
|
|
32700
|
+
'total.min':'Min',
|
|
32701
|
+
'total.max':'Maks',
|
|
32702
|
+
'total.count':'Antall',
|
|
32703
|
+
'total.countValues':'Antall verdier',
|
|
32704
|
+
'total.first':'Første',
|
|
32705
|
+
'total.last':'Siste',
|
|
32706
|
+
'total.median':'Median',
|
|
32707
|
+
'total.p25':'25. persentil',
|
|
32708
|
+
'total.p75':'75. persentil',
|
|
32709
|
+
'total.p90':'90. persentil',
|
|
32710
|
+
'total.p95':'95. persentil',
|
|
32711
|
+
'total.p99':'99. persentil',
|
|
32712
|
+
'total.iqr':'Kvartilbredde',
|
|
32713
|
+
'total.mad':'Median absolutt avvik',
|
|
32714
|
+
'total.variance':'Varians',
|
|
32715
|
+
'total.varianceP':'Varians (populasjon)',
|
|
32716
|
+
'total.stddev':'Standardavvik',
|
|
32717
|
+
'total.stddevP':'Standardavvik (populasjon)',
|
|
32718
|
+
'total.range':'Variasjonsbredde',
|
|
32719
|
+
'total.distinct':'Unike',
|
|
32720
|
+
'total.mode':'Typetall',
|
|
32721
|
+
'total.skewness':'Skjevhet',
|
|
32722
|
+
'total.kurtosis':'Kurtose',
|
|
32723
|
+
'total.geomean':'Geometrisk gjennomsnitt',
|
|
32724
|
+
'total.harmean':'Harmonisk gjennomsnitt',
|
|
32725
|
+
'total.sumSquares':'Kvadratsum',
|
|
32726
|
+
'total.weightedAvg':'Vektet gjennomsnitt',
|
|
32727
|
+
'total.argmin':'Laveste etter',
|
|
32728
|
+
'total.argmax':'Høyeste etter',
|
|
32729
|
+
'total.hhi':'Konsentrasjon (HHI)',
|
|
32730
|
+
'total.entropy':'Entropi',
|
|
32731
|
+
'total.evenness':'Jevnhet',
|
|
32732
|
+
'total.top3Share':'Topp 3-andel',
|
|
32733
|
+
'total.top10Share':'Topp 10-andel',
|
|
32734
|
+
'total.gini':'Gini-koeffisient',
|
|
32735
|
+
'total.trimmedMean':'Trimmet gjennomsnitt',
|
|
32736
|
+
'total.winsorizedMean':'Winsorisert gjennomsnitt',
|
|
32737
|
+
'total.robustOutliers':'Uteliggere (robust)',
|
|
32738
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
31249
32739
|
'stats.column':'Kolonne',
|
|
31250
32740
|
'stats.choose':'Velg en kolonne å analysere',
|
|
31251
32741
|
'stats.noColumns':'Ingen numeriske kolonner å analysere',
|
|
@@ -31265,6 +32755,15 @@ other:'{count} celler oppdatert',
|
|
|
31265
32755
|
'stats.outliers':'Uteliggere',
|
|
31266
32756
|
'stats.distribution':'Fordeling',
|
|
31267
32757
|
'stats.bin':'{count} mellom {from} og {to}',
|
|
32758
|
+
'stats.section.shape':'Form',
|
|
32759
|
+
'stats.section.robust':'Robust',
|
|
32760
|
+
'stats.section.concentration':'Konsentrasjon',
|
|
32761
|
+
'stats.section.capability':'Kapabilitet',
|
|
32762
|
+
'stats.cp':'Cp',
|
|
32763
|
+
'stats.cpk':'Cpk',
|
|
32764
|
+
'stats.pp':'Pp',
|
|
32765
|
+
'stats.ppk':'Ppk',
|
|
32766
|
+
'stats.outOfSpec':'Utenfor spesifikasjon',
|
|
31268
32767
|
'stats.filtered':'Av {count} filtrerte rader',
|
|
31269
32768
|
'panel.zone.group':'radgruppene',
|
|
31270
32769
|
'panel.zone.values':'verdiene',
|
|
@@ -31669,6 +33168,62 @@ other:'{count} solua päivitetty',
|
|
|
31669
33168
|
'panel.quickFilter':'Pikasuodatin',
|
|
31670
33169
|
'panel.formatting':'Muotoilu',
|
|
31671
33170
|
'panel.statistics':'Tilastot',
|
|
33171
|
+
'panel.compare':'Vertaa',
|
|
33172
|
+
'compare.first':'Ensimmäinen sarake',
|
|
33173
|
+
'compare.second':'Toinen sarake',
|
|
33174
|
+
'compare.needTwo':'Vertailuun tarvitaan kaksi numeerista saraketta',
|
|
33175
|
+
'compare.noPairs':'Yhdelläkään rivillä ei ole arvoa molemmissa',
|
|
33176
|
+
'compare.pairs':'{count} paria',
|
|
33177
|
+
'compare.pearson':'Korrelaatio (Pearson)',
|
|
33178
|
+
'compare.spearman':'Järjestyskorrelaatio (Spearman)',
|
|
33179
|
+
'compare.kendall':'Kendallin tau',
|
|
33180
|
+
'compare.covariance':'Kovarianssi',
|
|
33181
|
+
'compare.slope':'Kulmakerroin',
|
|
33182
|
+
'compare.intercept':'Vakiotermi',
|
|
33183
|
+
'compare.r2':'R²',
|
|
33184
|
+
'compare.stdError':'Keskivirhe',
|
|
33185
|
+
'compare.weighted':'Painotettu keskiarvo',
|
|
33186
|
+
'total.sum':'Summa',
|
|
33187
|
+
'total.avg':'Keskiarvo',
|
|
33188
|
+
'total.min':'Pienin',
|
|
33189
|
+
'total.max':'Suurin',
|
|
33190
|
+
'total.count':'Lukumäärä',
|
|
33191
|
+
'total.countValues':'Arvojen määrä',
|
|
33192
|
+
'total.first':'Ensimmäinen',
|
|
33193
|
+
'total.last':'Viimeinen',
|
|
33194
|
+
'total.median':'Mediaani',
|
|
33195
|
+
'total.p25':'25. persentiili',
|
|
33196
|
+
'total.p75':'75. persentiili',
|
|
33197
|
+
'total.p90':'90. persentiili',
|
|
33198
|
+
'total.p95':'95. persentiili',
|
|
33199
|
+
'total.p99':'99. persentiili',
|
|
33200
|
+
'total.iqr':'Kvartiiliväli',
|
|
33201
|
+
'total.mad':'Mediaanin absoluuttinen poikkeama',
|
|
33202
|
+
'total.variance':'Varianssi',
|
|
33203
|
+
'total.varianceP':'Varianssi (populaatio)',
|
|
33204
|
+
'total.stddev':'Keskihajonta',
|
|
33205
|
+
'total.stddevP':'Keskihajonta (populaatio)',
|
|
33206
|
+
'total.range':'Vaihteluväli',
|
|
33207
|
+
'total.distinct':'Eri arvoja',
|
|
33208
|
+
'total.mode':'Moodi',
|
|
33209
|
+
'total.skewness':'Vinous',
|
|
33210
|
+
'total.kurtosis':'Huipukkuus',
|
|
33211
|
+
'total.geomean':'Geometrinen keskiarvo',
|
|
33212
|
+
'total.harmean':'Harmoninen keskiarvo',
|
|
33213
|
+
'total.sumSquares':'Neliösumma',
|
|
33214
|
+
'total.weightedAvg':'Painotettu keskiarvo',
|
|
33215
|
+
'total.argmin':'Pienin sarakkeen mukaan',
|
|
33216
|
+
'total.argmax':'Suurin sarakkeen mukaan',
|
|
33217
|
+
'total.hhi':'Keskittyminen (HHI)',
|
|
33218
|
+
'total.entropy':'Entropia',
|
|
33219
|
+
'total.evenness':'Tasaisuus',
|
|
33220
|
+
'total.top3Share':'Kolmen suurimman osuus',
|
|
33221
|
+
'total.top10Share':'Kymmenen suurimman osuus',
|
|
33222
|
+
'total.gini':'Gini-kerroin',
|
|
33223
|
+
'total.trimmedMean':'Typistetty keskiarvo',
|
|
33224
|
+
'total.winsorizedMean':'Winsoroitu keskiarvo',
|
|
33225
|
+
'total.robustOutliers':'Poikkeavat arvot (robusti)',
|
|
33226
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
31672
33227
|
'stats.column':'Sarake',
|
|
31673
33228
|
'stats.choose':'Valitse analysoitava sarake',
|
|
31674
33229
|
'stats.noColumns':'Ei numeerisia sarakkeita analysoitavaksi',
|
|
@@ -31688,6 +33243,15 @@ other:'{count} solua päivitetty',
|
|
|
31688
33243
|
'stats.outliers':'Poikkeavat arvot',
|
|
31689
33244
|
'stats.distribution':'Jakauma',
|
|
31690
33245
|
'stats.bin':'{count} välillä {from}–{to}',
|
|
33246
|
+
'stats.section.shape':'Muoto',
|
|
33247
|
+
'stats.section.robust':'Robusti',
|
|
33248
|
+
'stats.section.concentration':'Keskittyminen',
|
|
33249
|
+
'stats.section.capability':'Suorituskyky',
|
|
33250
|
+
'stats.cp':'Cp',
|
|
33251
|
+
'stats.cpk':'Cpk',
|
|
33252
|
+
'stats.pp':'Pp',
|
|
33253
|
+
'stats.ppk':'Ppk',
|
|
33254
|
+
'stats.outOfSpec':'Spesifikaation ulkopuolella',
|
|
31691
33255
|
'stats.filtered':'{count} suodatetusta rivistä',
|
|
31692
33256
|
'panel.zone.group':'riviryhmiin',
|
|
31693
33257
|
'panel.zone.values':'arvoihin',
|
|
@@ -32116,6 +33680,62 @@ other:'zaktualizowano {count} komórek',
|
|
|
32116
33680
|
'panel.quickFilter':'Szybki filtr',
|
|
32117
33681
|
'panel.formatting':'Formatowanie',
|
|
32118
33682
|
'panel.statistics':'Statystyki',
|
|
33683
|
+
'panel.compare':'Porównaj',
|
|
33684
|
+
'compare.first':'Pierwsza kolumna',
|
|
33685
|
+
'compare.second':'Druga kolumna',
|
|
33686
|
+
'compare.needTwo':'Do porównania potrzebne są dwie kolumny liczbowe',
|
|
33687
|
+
'compare.noPairs':'Żaden wiersz nie ma wartości w obu',
|
|
33688
|
+
'compare.pairs':'Liczba par: {count}',
|
|
33689
|
+
'compare.pearson':'Korelacja (Pearson)',
|
|
33690
|
+
'compare.spearman':'Korelacja rang (Spearman)',
|
|
33691
|
+
'compare.kendall':'Tau Kendalla',
|
|
33692
|
+
'compare.covariance':'Kowariancja',
|
|
33693
|
+
'compare.slope':'Nachylenie',
|
|
33694
|
+
'compare.intercept':'Wyraz wolny',
|
|
33695
|
+
'compare.r2':'R²',
|
|
33696
|
+
'compare.stdError':'Błąd standardowy',
|
|
33697
|
+
'compare.weighted':'Średnia ważona',
|
|
33698
|
+
'total.sum':'Suma',
|
|
33699
|
+
'total.avg':'Średnia',
|
|
33700
|
+
'total.min':'Min',
|
|
33701
|
+
'total.max':'Maks',
|
|
33702
|
+
'total.count':'Liczba',
|
|
33703
|
+
'total.countValues':'Liczba wartości',
|
|
33704
|
+
'total.first':'Pierwszy',
|
|
33705
|
+
'total.last':'Ostatni',
|
|
33706
|
+
'total.median':'Mediana',
|
|
33707
|
+
'total.p25':'25. percentyl',
|
|
33708
|
+
'total.p75':'75. percentyl',
|
|
33709
|
+
'total.p90':'90. percentyl',
|
|
33710
|
+
'total.p95':'95. percentyl',
|
|
33711
|
+
'total.p99':'99. percentyl',
|
|
33712
|
+
'total.iqr':'Rozstęp ćwiartkowy',
|
|
33713
|
+
'total.mad':'Mediana odchyleń bezwzględnych',
|
|
33714
|
+
'total.variance':'Wariancja',
|
|
33715
|
+
'total.varianceP':'Wariancja (populacja)',
|
|
33716
|
+
'total.stddev':'Odchylenie standardowe',
|
|
33717
|
+
'total.stddevP':'Odchylenie standardowe (populacja)',
|
|
33718
|
+
'total.range':'Rozstęp',
|
|
33719
|
+
'total.distinct':'Unikatowe',
|
|
33720
|
+
'total.mode':'Dominanta',
|
|
33721
|
+
'total.skewness':'Skośność',
|
|
33722
|
+
'total.kurtosis':'Kurtoza',
|
|
33723
|
+
'total.geomean':'Średnia geometryczna',
|
|
33724
|
+
'total.harmean':'Średnia harmoniczna',
|
|
33725
|
+
'total.sumSquares':'Suma kwadratów',
|
|
33726
|
+
'total.weightedAvg':'Średnia ważona',
|
|
33727
|
+
'total.argmin':'Najniższy wg',
|
|
33728
|
+
'total.argmax':'Najwyższy wg',
|
|
33729
|
+
'total.hhi':'Koncentracja (HHI)',
|
|
33730
|
+
'total.entropy':'Entropia',
|
|
33731
|
+
'total.evenness':'Równomierność',
|
|
33732
|
+
'total.top3Share':'Udział 3 największych',
|
|
33733
|
+
'total.top10Share':'Udział 10 największych',
|
|
33734
|
+
'total.gini':'Współczynnik Giniego',
|
|
33735
|
+
'total.trimmedMean':'Średnia ucinana',
|
|
33736
|
+
'total.winsorizedMean':'Średnia winsorowska',
|
|
33737
|
+
'total.robustOutliers':'Wartości odstające (odporne)',
|
|
33738
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
32119
33739
|
'stats.column':'Kolumna',
|
|
32120
33740
|
'stats.choose':'Wybierz kolumnę do analizy',
|
|
32121
33741
|
'stats.noColumns':'Brak kolumn liczbowych do analizy',
|
|
@@ -32135,6 +33755,15 @@ other:'zaktualizowano {count} komórek',
|
|
|
32135
33755
|
'stats.outliers':'Wartości odstające',
|
|
32136
33756
|
'stats.distribution':'Rozkład',
|
|
32137
33757
|
'stats.bin':'{count} między {from} a {to}',
|
|
33758
|
+
'stats.section.shape':'Kształt',
|
|
33759
|
+
'stats.section.robust':'Odporne',
|
|
33760
|
+
'stats.section.concentration':'Koncentracja',
|
|
33761
|
+
'stats.section.capability':'Zdolność',
|
|
33762
|
+
'stats.cp':'Cp',
|
|
33763
|
+
'stats.cpk':'Cpk',
|
|
33764
|
+
'stats.pp':'Pp',
|
|
33765
|
+
'stats.ppk':'Ppk',
|
|
33766
|
+
'stats.outOfSpec':'Poza specyfikacją',
|
|
32138
33767
|
'stats.filtered':'Z {count} przefiltrowanych wierszy',
|
|
32139
33768
|
'panel.zone.group':'grupowania wierszy',
|
|
32140
33769
|
'panel.zone.values':'wartości',
|
|
@@ -32567,6 +34196,62 @@ other:'aktualizováno {count} buněk',
|
|
|
32567
34196
|
'panel.quickFilter':'Rychlý filtr',
|
|
32568
34197
|
'panel.formatting':'Formátování',
|
|
32569
34198
|
'panel.statistics':'Statistika',
|
|
34199
|
+
'panel.compare':'Porovnat',
|
|
34200
|
+
'compare.first':'První sloupec',
|
|
34201
|
+
'compare.second':'Druhý sloupec',
|
|
34202
|
+
'compare.needTwo':'K porovnání jsou potřeba dva číselné sloupce',
|
|
34203
|
+
'compare.noPairs':'Žádné řádky nemají hodnotu v obou',
|
|
34204
|
+
'compare.pairs':'Počet dvojic: {count}',
|
|
34205
|
+
'compare.pearson':'Korelace (Pearson)',
|
|
34206
|
+
'compare.spearman':'Pořadová korelace (Spearman)',
|
|
34207
|
+
'compare.kendall':'Kendallovo tau',
|
|
34208
|
+
'compare.covariance':'Kovariance',
|
|
34209
|
+
'compare.slope':'Sklon',
|
|
34210
|
+
'compare.intercept':'Průsečík',
|
|
34211
|
+
'compare.r2':'R²',
|
|
34212
|
+
'compare.stdError':'Standardní chyba',
|
|
34213
|
+
'compare.weighted':'Vážený průměr',
|
|
34214
|
+
'total.sum':'Součet',
|
|
34215
|
+
'total.avg':'Průměr',
|
|
34216
|
+
'total.min':'Minimum',
|
|
34217
|
+
'total.max':'Maximum',
|
|
34218
|
+
'total.count':'Počet',
|
|
34219
|
+
'total.countValues':'Počet hodnot',
|
|
34220
|
+
'total.first':'První',
|
|
34221
|
+
'total.last':'Poslední',
|
|
34222
|
+
'total.median':'Medián',
|
|
34223
|
+
'total.p25':'25. percentil',
|
|
34224
|
+
'total.p75':'75. percentil',
|
|
34225
|
+
'total.p90':'90. percentil',
|
|
34226
|
+
'total.p95':'95. percentil',
|
|
34227
|
+
'total.p99':'99. percentil',
|
|
34228
|
+
'total.iqr':'Mezikvartilové rozpětí',
|
|
34229
|
+
'total.mad':'Mediánová absolutní odchylka',
|
|
34230
|
+
'total.variance':'Rozptyl',
|
|
34231
|
+
'total.varianceP':'Rozptyl (populace)',
|
|
34232
|
+
'total.stddev':'Směrodatná odchylka',
|
|
34233
|
+
'total.stddevP':'Směrodatná odchylka (populace)',
|
|
34234
|
+
'total.range':'Rozpětí',
|
|
34235
|
+
'total.distinct':'Jedinečných',
|
|
34236
|
+
'total.mode':'Modus',
|
|
34237
|
+
'total.skewness':'Šikmost',
|
|
34238
|
+
'total.kurtosis':'Špičatost',
|
|
34239
|
+
'total.geomean':'Geometrický průměr',
|
|
34240
|
+
'total.harmean':'Harmonický průměr',
|
|
34241
|
+
'total.sumSquares':'Součet čtverců',
|
|
34242
|
+
'total.weightedAvg':'Vážený průměr',
|
|
34243
|
+
'total.argmin':'Nejnižší podle',
|
|
34244
|
+
'total.argmax':'Nejvyšší podle',
|
|
34245
|
+
'total.hhi':'Koncentrace (HHI)',
|
|
34246
|
+
'total.entropy':'Entropie',
|
|
34247
|
+
'total.evenness':'Vyrovnanost',
|
|
34248
|
+
'total.top3Share':'Podíl top 3',
|
|
34249
|
+
'total.top10Share':'Podíl top 10',
|
|
34250
|
+
'total.gini':'Giniho koeficient',
|
|
34251
|
+
'total.trimmedMean':'Useknutý průměr',
|
|
34252
|
+
'total.winsorizedMean':'Winsorizovaný průměr',
|
|
34253
|
+
'total.robustOutliers':'Odlehlé hodnoty (robustní)',
|
|
34254
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
32570
34255
|
'stats.column':'Sloupec',
|
|
32571
34256
|
'stats.choose':'Vyberte sloupec k analýze',
|
|
32572
34257
|
'stats.noColumns':'Žádné číselné sloupce k analýze',
|
|
@@ -32586,6 +34271,15 @@ other:'aktualizováno {count} buněk',
|
|
|
32586
34271
|
'stats.outliers':'Odlehlé hodnoty',
|
|
32587
34272
|
'stats.distribution':'Rozdělení',
|
|
32588
34273
|
'stats.bin':'{count} mezi {from} a {to}',
|
|
34274
|
+
'stats.section.shape':'Tvar',
|
|
34275
|
+
'stats.section.robust':'Robustní',
|
|
34276
|
+
'stats.section.concentration':'Koncentrace',
|
|
34277
|
+
'stats.section.capability':'Způsobilost',
|
|
34278
|
+
'stats.cp':'Cp',
|
|
34279
|
+
'stats.cpk':'Cpk',
|
|
34280
|
+
'stats.pp':'Pp',
|
|
34281
|
+
'stats.ppk':'Ppk',
|
|
34282
|
+
'stats.outOfSpec':'Mimo specifikaci',
|
|
32589
34283
|
'stats.filtered':'Z {count} filtrovaných řádků',
|
|
32590
34284
|
'panel.zone.group':'seskupení řádků',
|
|
32591
34285
|
'panel.zone.values':'hodnot',
|
|
@@ -32994,6 +34688,62 @@ other:'{count} cella frissítve',
|
|
|
32994
34688
|
'panel.quickFilter':'Gyorsszűrő',
|
|
32995
34689
|
'panel.formatting':'Formázás',
|
|
32996
34690
|
'panel.statistics':'Statisztika',
|
|
34691
|
+
'panel.compare':'Összehasonlítás',
|
|
34692
|
+
'compare.first':'Első oszlop',
|
|
34693
|
+
'compare.second':'Második oszlop',
|
|
34694
|
+
'compare.needTwo':'Két numerikus oszlop szükséges',
|
|
34695
|
+
'compare.noPairs':'Egyetlen sorban sincs érték mindkettőben',
|
|
34696
|
+
'compare.pairs':'{count} pár',
|
|
34697
|
+
'compare.pearson':'Korreláció (Pearson)',
|
|
34698
|
+
'compare.spearman':'Rangkorreláció (Spearman)',
|
|
34699
|
+
'compare.kendall':'Kendall-féle tau',
|
|
34700
|
+
'compare.covariance':'Kovariancia',
|
|
34701
|
+
'compare.slope':'Meredekség',
|
|
34702
|
+
'compare.intercept':'Tengelymetszet',
|
|
34703
|
+
'compare.r2':'R²',
|
|
34704
|
+
'compare.stdError':'Standard hiba',
|
|
34705
|
+
'compare.weighted':'Súlyozott átlag',
|
|
34706
|
+
'total.sum':'Összeg',
|
|
34707
|
+
'total.avg':'Átlag',
|
|
34708
|
+
'total.min':'Minimum',
|
|
34709
|
+
'total.max':'Maximum',
|
|
34710
|
+
'total.count':'Darabszám',
|
|
34711
|
+
'total.countValues':'Értékek száma',
|
|
34712
|
+
'total.first':'Első',
|
|
34713
|
+
'total.last':'Utolsó',
|
|
34714
|
+
'total.median':'Medián',
|
|
34715
|
+
'total.p25':'25. percentilis',
|
|
34716
|
+
'total.p75':'75. percentilis',
|
|
34717
|
+
'total.p90':'90. percentilis',
|
|
34718
|
+
'total.p95':'95. percentilis',
|
|
34719
|
+
'total.p99':'99. percentilis',
|
|
34720
|
+
'total.iqr':'Interkvartilis terjedelem',
|
|
34721
|
+
'total.mad':'Medián abszolút eltérés',
|
|
34722
|
+
'total.variance':'Variancia',
|
|
34723
|
+
'total.varianceP':'Variancia (sokaság)',
|
|
34724
|
+
'total.stddev':'Szórás',
|
|
34725
|
+
'total.stddevP':'Szórás (sokaság)',
|
|
34726
|
+
'total.range':'Terjedelem',
|
|
34727
|
+
'total.distinct':'Egyedi',
|
|
34728
|
+
'total.mode':'Módusz',
|
|
34729
|
+
'total.skewness':'Ferdeség',
|
|
34730
|
+
'total.kurtosis':'Csúcsosság',
|
|
34731
|
+
'total.geomean':'Mértani átlag',
|
|
34732
|
+
'total.harmean':'Harmonikus átlag',
|
|
34733
|
+
'total.sumSquares':'Négyzetösszeg',
|
|
34734
|
+
'total.weightedAvg':'Súlyozott átlag',
|
|
34735
|
+
'total.argmin':'Legalacsonyabb eszerint',
|
|
34736
|
+
'total.argmax':'Legmagasabb eszerint',
|
|
34737
|
+
'total.hhi':'Koncentráció (HHI)',
|
|
34738
|
+
'total.entropy':'Entrópia',
|
|
34739
|
+
'total.evenness':'Egyenletesség',
|
|
34740
|
+
'total.top3Share':'Top 3 részesedés',
|
|
34741
|
+
'total.top10Share':'Top 10 részesedés',
|
|
34742
|
+
'total.gini':'Gini-együttható',
|
|
34743
|
+
'total.trimmedMean':'Nyesett átlag',
|
|
34744
|
+
'total.winsorizedMean':'Winsorizált átlag',
|
|
34745
|
+
'total.robustOutliers':'Kiugró értékek (robusztus)',
|
|
34746
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
32997
34747
|
'stats.column':'Oszlop',
|
|
32998
34748
|
'stats.choose':'Válasszon oszlopot az elemzéshez',
|
|
32999
34749
|
'stats.noColumns':'Nincs elemezhető numerikus oszlop',
|
|
@@ -33013,6 +34763,15 @@ other:'{count} cella frissítve',
|
|
|
33013
34763
|
'stats.outliers':'Kiugró értékek',
|
|
33014
34764
|
'stats.distribution':'Eloszlás',
|
|
33015
34765
|
'stats.bin':'{count} a(z) {from} és {to} között',
|
|
34766
|
+
'stats.section.shape':'Alak',
|
|
34767
|
+
'stats.section.robust':'Robusztus',
|
|
34768
|
+
'stats.section.concentration':'Koncentráció',
|
|
34769
|
+
'stats.section.capability':'Képesség',
|
|
34770
|
+
'stats.cp':'Cp',
|
|
34771
|
+
'stats.cpk':'Cpk',
|
|
34772
|
+
'stats.pp':'Pp',
|
|
34773
|
+
'stats.ppk':'Ppk',
|
|
34774
|
+
'stats.outOfSpec':'Specifikáción kívül',
|
|
33016
34775
|
'stats.filtered':'A {count} szűrt sorból',
|
|
33017
34776
|
'panel.zone.group':'a sorcsoportokból',
|
|
33018
34777
|
'panel.zone.values':'az értékekből',
|
|
@@ -33429,6 +35188,62 @@ other:'{count} de celule actualizate',
|
|
|
33429
35188
|
'panel.quickFilter':'Filtru rapid',
|
|
33430
35189
|
'panel.formatting':'Formatare',
|
|
33431
35190
|
'panel.statistics':'Statistici',
|
|
35191
|
+
'panel.compare':'Compară',
|
|
35192
|
+
'compare.first':'Prima coloană',
|
|
35193
|
+
'compare.second':'A doua coloană',
|
|
35194
|
+
'compare.needTwo':'Sunt necesare două coloane numerice',
|
|
35195
|
+
'compare.noPairs':'Niciun rând nu are valoare în ambele',
|
|
35196
|
+
'compare.pairs':'{count} perechi',
|
|
35197
|
+
'compare.pearson':'Corelație (Pearson)',
|
|
35198
|
+
'compare.spearman':'Corelație de rang (Spearman)',
|
|
35199
|
+
'compare.kendall':'Tau Kendall',
|
|
35200
|
+
'compare.covariance':'Covarianță',
|
|
35201
|
+
'compare.slope':'Panta',
|
|
35202
|
+
'compare.intercept':'Interceptul',
|
|
35203
|
+
'compare.r2':'R²',
|
|
35204
|
+
'compare.stdError':'Eroare standard',
|
|
35205
|
+
'compare.weighted':'Medie ponderată',
|
|
35206
|
+
'total.sum':'Sumă',
|
|
35207
|
+
'total.avg':'Medie',
|
|
35208
|
+
'total.min':'Min',
|
|
35209
|
+
'total.max':'Max',
|
|
35210
|
+
'total.count':'Număr',
|
|
35211
|
+
'total.countValues':'Număr de valori',
|
|
35212
|
+
'total.first':'Primul',
|
|
35213
|
+
'total.last':'Ultimul',
|
|
35214
|
+
'total.median':'Mediană',
|
|
35215
|
+
'total.p25':'Percentila 25',
|
|
35216
|
+
'total.p75':'Percentila 75',
|
|
35217
|
+
'total.p90':'Percentila 90',
|
|
35218
|
+
'total.p95':'Percentila 95',
|
|
35219
|
+
'total.p99':'Percentila 99',
|
|
35220
|
+
'total.iqr':'Interval intercuartilic',
|
|
35221
|
+
'total.mad':'Abatere absolută mediană',
|
|
35222
|
+
'total.variance':'Varianță',
|
|
35223
|
+
'total.varianceP':'Varianță (populație)',
|
|
35224
|
+
'total.stddev':'Abatere standard',
|
|
35225
|
+
'total.stddevP':'Abatere standard (populație)',
|
|
35226
|
+
'total.range':'Amplitudine',
|
|
35227
|
+
'total.distinct':'Distincte',
|
|
35228
|
+
'total.mode':'Mod',
|
|
35229
|
+
'total.skewness':'Asimetrie',
|
|
35230
|
+
'total.kurtosis':'Boltire',
|
|
35231
|
+
'total.geomean':'Medie geometrică',
|
|
35232
|
+
'total.harmean':'Medie armonică',
|
|
35233
|
+
'total.sumSquares':'Suma pătratelor',
|
|
35234
|
+
'total.weightedAvg':'Medie ponderată',
|
|
35235
|
+
'total.argmin':'Cel mai mic după',
|
|
35236
|
+
'total.argmax':'Cel mai mare după',
|
|
35237
|
+
'total.hhi':'Concentrare (HHI)',
|
|
35238
|
+
'total.entropy':'Entropie',
|
|
35239
|
+
'total.evenness':'Uniformitate',
|
|
35240
|
+
'total.top3Share':'Cota primelor 3',
|
|
35241
|
+
'total.top10Share':'Cota primelor 10',
|
|
35242
|
+
'total.gini':'Coeficient Gini',
|
|
35243
|
+
'total.trimmedMean':'Medie trunchiată',
|
|
35244
|
+
'total.winsorizedMean':'Medie winsorizată',
|
|
35245
|
+
'total.robustOutliers':'Valori aberante (robust)',
|
|
35246
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
33432
35247
|
'stats.column':'Coloană',
|
|
33433
35248
|
'stats.choose':'Alegeți o coloană de analizat',
|
|
33434
35249
|
'stats.noColumns':'Nicio coloană numerică de analizat',
|
|
@@ -33448,6 +35263,15 @@ other:'{count} de celule actualizate',
|
|
|
33448
35263
|
'stats.outliers':'Valori aberante',
|
|
33449
35264
|
'stats.distribution':'Distribuție',
|
|
33450
35265
|
'stats.bin':'{count} între {from} și {to}',
|
|
35266
|
+
'stats.section.shape':'Formă',
|
|
35267
|
+
'stats.section.robust':'Robust',
|
|
35268
|
+
'stats.section.concentration':'Concentrare',
|
|
35269
|
+
'stats.section.capability':'Capabilitate',
|
|
35270
|
+
'stats.cp':'Cp',
|
|
35271
|
+
'stats.cpk':'Cpk',
|
|
35272
|
+
'stats.pp':'Pp',
|
|
35273
|
+
'stats.ppk':'Ppk',
|
|
35274
|
+
'stats.outOfSpec':'În afara specificației',
|
|
33451
35275
|
'stats.filtered':'Din {count} rânduri filtrate',
|
|
33452
35276
|
'panel.zone.group':'grupările de rânduri',
|
|
33453
35277
|
'panel.zone.values':'valorile',
|
|
@@ -33878,6 +35702,62 @@ other:'оновлено {count} комірок',
|
|
|
33878
35702
|
'panel.quickFilter':'Швидкий фільтр',
|
|
33879
35703
|
'panel.formatting':'Форматування',
|
|
33880
35704
|
'panel.statistics':'Статистика',
|
|
35705
|
+
'panel.compare':'Порівняти',
|
|
35706
|
+
'compare.first':'Перший стовпець',
|
|
35707
|
+
'compare.second':'Другий стовпець',
|
|
35708
|
+
'compare.needTwo':'Потрібні два числові стовпці',
|
|
35709
|
+
'compare.noPairs':'Жоден рядок не має значення в обох',
|
|
35710
|
+
'compare.pairs':'{count} пар',
|
|
35711
|
+
'compare.pearson':'Кореляція (Пірсон)',
|
|
35712
|
+
'compare.spearman':'Рангова кореляція (Спірмен)',
|
|
35713
|
+
'compare.kendall':'Тау Кендала',
|
|
35714
|
+
'compare.covariance':'Коваріація',
|
|
35715
|
+
'compare.slope':'Нахил',
|
|
35716
|
+
'compare.intercept':'Перетин',
|
|
35717
|
+
'compare.r2':'R²',
|
|
35718
|
+
'compare.stdError':'Стандартна похибка',
|
|
35719
|
+
'compare.weighted':'Зважене середнє',
|
|
35720
|
+
'total.sum':'Сума',
|
|
35721
|
+
'total.avg':'Середнє',
|
|
35722
|
+
'total.min':'Мінімум',
|
|
35723
|
+
'total.max':'Максимум',
|
|
35724
|
+
'total.count':'Кількість',
|
|
35725
|
+
'total.countValues':'Кількість значень',
|
|
35726
|
+
'total.first':'Перше',
|
|
35727
|
+
'total.last':'Останнє',
|
|
35728
|
+
'total.median':'Медіана',
|
|
35729
|
+
'total.p25':'25-й процентиль',
|
|
35730
|
+
'total.p75':'75-й процентиль',
|
|
35731
|
+
'total.p90':'90-й процентиль',
|
|
35732
|
+
'total.p95':'95-й процентиль',
|
|
35733
|
+
'total.p99':'99-й процентиль',
|
|
35734
|
+
'total.iqr':'Міжквартильний розмах',
|
|
35735
|
+
'total.mad':'Медіанне абсолютне відхилення',
|
|
35736
|
+
'total.variance':'Дисперсія',
|
|
35737
|
+
'total.varianceP':'Дисперсія (генеральна)',
|
|
35738
|
+
'total.stddev':'Стандартне відхилення',
|
|
35739
|
+
'total.stddevP':'Стандартне відхилення (генеральна)',
|
|
35740
|
+
'total.range':'Розмах',
|
|
35741
|
+
'total.distinct':'Унікальних',
|
|
35742
|
+
'total.mode':'Мода',
|
|
35743
|
+
'total.skewness':'Асиметрія',
|
|
35744
|
+
'total.kurtosis':'Ексцес',
|
|
35745
|
+
'total.geomean':'Середнє геометричне',
|
|
35746
|
+
'total.harmean':'Середнє гармонійне',
|
|
35747
|
+
'total.sumSquares':'Сума квадратів',
|
|
35748
|
+
'total.weightedAvg':'Зважене середнє',
|
|
35749
|
+
'total.argmin':'Найменше за',
|
|
35750
|
+
'total.argmax':'Найбільше за',
|
|
35751
|
+
'total.hhi':'Концентрація (HHI)',
|
|
35752
|
+
'total.entropy':'Ентропія',
|
|
35753
|
+
'total.evenness':'Рівномірність',
|
|
35754
|
+
'total.top3Share':'Частка топ-3',
|
|
35755
|
+
'total.top10Share':'Частка топ-10',
|
|
35756
|
+
'total.gini':'Коефіцієнт Джині',
|
|
35757
|
+
'total.trimmedMean':'Зрізане середнє',
|
|
35758
|
+
'total.winsorizedMean':'Вінзоризоване середнє',
|
|
35759
|
+
'total.robustOutliers':'Викиди (стійкі)',
|
|
35760
|
+
'total.jarqueBera':'Жарк–Бера',
|
|
33881
35761
|
'stats.column':'Стовпець',
|
|
33882
35762
|
'stats.choose':'Виберіть стовпець для аналізу',
|
|
33883
35763
|
'stats.noColumns':'Немає числових стовпців для аналізу',
|
|
@@ -33897,6 +35777,15 @@ other:'оновлено {count} комірок',
|
|
|
33897
35777
|
'stats.outliers':'Викиди',
|
|
33898
35778
|
'stats.distribution':'Розподіл',
|
|
33899
35779
|
'stats.bin':'{count} між {from} і {to}',
|
|
35780
|
+
'stats.section.shape':'Форма',
|
|
35781
|
+
'stats.section.robust':'Стійкі',
|
|
35782
|
+
'stats.section.concentration':'Концентрація',
|
|
35783
|
+
'stats.section.capability':'Придатність',
|
|
35784
|
+
'stats.cp':'Cp',
|
|
35785
|
+
'stats.cpk':'Cpk',
|
|
35786
|
+
'stats.pp':'Pp',
|
|
35787
|
+
'stats.ppk':'Ppk',
|
|
35788
|
+
'stats.outOfSpec':'Поза специфікацією',
|
|
33900
35789
|
'stats.filtered':'З {count} відфільтрованих рядків',
|
|
33901
35790
|
'panel.zone.group':'групувань рядків',
|
|
33902
35791
|
'panel.zone.values':'значень',
|
|
@@ -34305,6 +36194,62 @@ other:'ενημερώθηκαν {count} κελιά',
|
|
|
34305
36194
|
'panel.quickFilter':'Γρήγορο φίλτρο',
|
|
34306
36195
|
'panel.formatting':'Μορφοποίηση',
|
|
34307
36196
|
'panel.statistics':'Στατιστικά',
|
|
36197
|
+
'panel.compare':'Σύγκριση',
|
|
36198
|
+
'compare.first':'Πρώτη στήλη',
|
|
36199
|
+
'compare.second':'Δεύτερη στήλη',
|
|
36200
|
+
'compare.needTwo':'Χρειάζονται δύο αριθμητικές στήλες',
|
|
36201
|
+
'compare.noPairs':'Καμία γραμμή δεν έχει τιμή και στις δύο',
|
|
36202
|
+
'compare.pairs':'{count} ζεύγη',
|
|
36203
|
+
'compare.pearson':'Συσχέτιση (Pearson)',
|
|
36204
|
+
'compare.spearman':'Συσχέτιση τάξης (Spearman)',
|
|
36205
|
+
'compare.kendall':'Tau του Kendall',
|
|
36206
|
+
'compare.covariance':'Συνδιακύμανση',
|
|
36207
|
+
'compare.slope':'Κλίση',
|
|
36208
|
+
'compare.intercept':'Τεταγμένη',
|
|
36209
|
+
'compare.r2':'R²',
|
|
36210
|
+
'compare.stdError':'Τυπικό σφάλμα',
|
|
36211
|
+
'compare.weighted':'Σταθμισμένος μέσος',
|
|
36212
|
+
'total.sum':'Άθροισμα',
|
|
36213
|
+
'total.avg':'Μέσος όρος',
|
|
36214
|
+
'total.min':'Ελάχιστο',
|
|
36215
|
+
'total.max':'Μέγιστο',
|
|
36216
|
+
'total.count':'Πλήθος',
|
|
36217
|
+
'total.countValues':'Πλήθος τιμών',
|
|
36218
|
+
'total.first':'Πρώτο',
|
|
36219
|
+
'total.last':'Τελευταίο',
|
|
36220
|
+
'total.median':'Διάμεσος',
|
|
36221
|
+
'total.p25':'25ο εκατοστημόριο',
|
|
36222
|
+
'total.p75':'75ο εκατοστημόριο',
|
|
36223
|
+
'total.p90':'90ό εκατοστημόριο',
|
|
36224
|
+
'total.p95':'95ο εκατοστημόριο',
|
|
36225
|
+
'total.p99':'99ο εκατοστημόριο',
|
|
36226
|
+
'total.iqr':'Ενδοτεταρτημοριακό εύρος',
|
|
36227
|
+
'total.mad':'Διάμεση απόλυτη απόκλιση',
|
|
36228
|
+
'total.variance':'Διακύμανση',
|
|
36229
|
+
'total.varianceP':'Διακύμανση (πληθυσμού)',
|
|
36230
|
+
'total.stddev':'Τυπική απόκλιση',
|
|
36231
|
+
'total.stddevP':'Τυπική απόκλιση (πληθυσμού)',
|
|
36232
|
+
'total.range':'Εύρος',
|
|
36233
|
+
'total.distinct':'Διακριτές',
|
|
36234
|
+
'total.mode':'Επικρατούσα τιμή',
|
|
36235
|
+
'total.skewness':'Ασυμμετρία',
|
|
36236
|
+
'total.kurtosis':'Κύρτωση',
|
|
36237
|
+
'total.geomean':'Γεωμετρικός μέσος',
|
|
36238
|
+
'total.harmean':'Αρμονικός μέσος',
|
|
36239
|
+
'total.sumSquares':'Άθροισμα τετραγώνων',
|
|
36240
|
+
'total.weightedAvg':'Σταθμισμένος μέσος',
|
|
36241
|
+
'total.argmin':'Χαμηλότερο κατά',
|
|
36242
|
+
'total.argmax':'Υψηλότερο κατά',
|
|
36243
|
+
'total.hhi':'Συγκέντρωση (HHI)',
|
|
36244
|
+
'total.entropy':'Εντροπία',
|
|
36245
|
+
'total.evenness':'Ομοιομορφία',
|
|
36246
|
+
'total.top3Share':'Μερίδιο top 3',
|
|
36247
|
+
'total.top10Share':'Μερίδιο top 10',
|
|
36248
|
+
'total.gini':'Συντελεστής Gini',
|
|
36249
|
+
'total.trimmedMean':'Περικομμένος μέσος',
|
|
36250
|
+
'total.winsorizedMean':'Winsorized μέσος',
|
|
36251
|
+
'total.robustOutliers':'Ακραίες τιμές (ανθεκτικό)',
|
|
36252
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
34308
36253
|
'stats.column':'Στήλη',
|
|
34309
36254
|
'stats.choose':'Επιλέξτε στήλη για ανάλυση',
|
|
34310
36255
|
'stats.noColumns':'Δεν υπάρχουν αριθμητικές στήλες για ανάλυση',
|
|
@@ -34324,6 +36269,15 @@ other:'ενημερώθηκαν {count} κελιά',
|
|
|
34324
36269
|
'stats.outliers':'Ακραίες τιμές',
|
|
34325
36270
|
'stats.distribution':'Κατανομή',
|
|
34326
36271
|
'stats.bin':'{count} μεταξύ {from} και {to}',
|
|
36272
|
+
'stats.section.shape':'Σχήμα',
|
|
36273
|
+
'stats.section.robust':'Ανθεκτικά',
|
|
36274
|
+
'stats.section.concentration':'Συγκέντρωση',
|
|
36275
|
+
'stats.section.capability':'Ικανότητα',
|
|
36276
|
+
'stats.cp':'Cp',
|
|
36277
|
+
'stats.cpk':'Cpk',
|
|
36278
|
+
'stats.pp':'Pp',
|
|
36279
|
+
'stats.ppk':'Ppk',
|
|
36280
|
+
'stats.outOfSpec':'Εκτός προδιαγραφής',
|
|
34327
36281
|
'stats.filtered':'Από {count} φιλτραρισμένες γραμμές',
|
|
34328
36282
|
'panel.zone.group':'τις ομαδοποιήσεις γραμμών',
|
|
34329
36283
|
'panel.zone.values':'τις τιμές',
|
|
@@ -34716,6 +36670,62 @@ other:'{count} セルを更新しました',
|
|
|
34716
36670
|
'panel.quickFilter':'クイックフィルター',
|
|
34717
36671
|
'panel.formatting':'書式',
|
|
34718
36672
|
'panel.statistics':'統計',
|
|
36673
|
+
'panel.compare':'比較',
|
|
36674
|
+
'compare.first':'1つ目の列',
|
|
36675
|
+
'compare.second':'2つ目の列',
|
|
36676
|
+
'compare.needTwo':'比較には数値列が2つ必要です',
|
|
36677
|
+
'compare.noPairs':'両方に値のある行がありません',
|
|
36678
|
+
'compare.pairs':'{count} 組',
|
|
36679
|
+
'compare.pearson':'相関(ピアソン)',
|
|
36680
|
+
'compare.spearman':'順位相関(スピアマン)',
|
|
36681
|
+
'compare.kendall':'ケンドールのタウ',
|
|
36682
|
+
'compare.covariance':'共分散',
|
|
36683
|
+
'compare.slope':'傾き',
|
|
36684
|
+
'compare.intercept':'切片',
|
|
36685
|
+
'compare.r2':'R²',
|
|
36686
|
+
'compare.stdError':'標準誤差',
|
|
36687
|
+
'compare.weighted':'加重平均',
|
|
36688
|
+
'total.sum':'合計',
|
|
36689
|
+
'total.avg':'平均',
|
|
36690
|
+
'total.min':'最小',
|
|
36691
|
+
'total.max':'最大',
|
|
36692
|
+
'total.count':'件数',
|
|
36693
|
+
'total.countValues':'値の件数',
|
|
36694
|
+
'total.first':'最初',
|
|
36695
|
+
'total.last':'最後',
|
|
36696
|
+
'total.median':'中央値',
|
|
36697
|
+
'total.p25':'第25パーセンタイル',
|
|
36698
|
+
'total.p75':'第75パーセンタイル',
|
|
36699
|
+
'total.p90':'第90パーセンタイル',
|
|
36700
|
+
'total.p95':'第95パーセンタイル',
|
|
36701
|
+
'total.p99':'第99パーセンタイル',
|
|
36702
|
+
'total.iqr':'四分位範囲',
|
|
36703
|
+
'total.mad':'中央絶対偏差',
|
|
36704
|
+
'total.variance':'分散',
|
|
36705
|
+
'total.varianceP':'分散(母集団)',
|
|
36706
|
+
'total.stddev':'標準偏差',
|
|
36707
|
+
'total.stddevP':'標準偏差(母集団)',
|
|
36708
|
+
'total.range':'範囲',
|
|
36709
|
+
'total.distinct':'一意の値',
|
|
36710
|
+
'total.mode':'最頻値',
|
|
36711
|
+
'total.skewness':'歪度',
|
|
36712
|
+
'total.kurtosis':'尖度',
|
|
36713
|
+
'total.geomean':'幾何平均',
|
|
36714
|
+
'total.harmean':'調和平均',
|
|
36715
|
+
'total.sumSquares':'平方和',
|
|
36716
|
+
'total.weightedAvg':'加重平均',
|
|
36717
|
+
'total.argmin':'最小(基準列)',
|
|
36718
|
+
'total.argmax':'最大(基準列)',
|
|
36719
|
+
'total.hhi':'集中度(HHI)',
|
|
36720
|
+
'total.entropy':'エントロピー',
|
|
36721
|
+
'total.evenness':'均等度',
|
|
36722
|
+
'total.top3Share':'上位3件の割合',
|
|
36723
|
+
'total.top10Share':'上位10件の割合',
|
|
36724
|
+
'total.gini':'ジニ係数',
|
|
36725
|
+
'total.trimmedMean':'トリム平均',
|
|
36726
|
+
'total.winsorizedMean':'ウィンザー化平均',
|
|
36727
|
+
'total.robustOutliers':'外れ値(頑健)',
|
|
36728
|
+
'total.jarqueBera':'ジャック–ベラ',
|
|
34719
36729
|
'stats.column':'列',
|
|
34720
36730
|
'stats.choose':'分析する列を選択',
|
|
34721
36731
|
'stats.noColumns':'分析できる数値列がありません',
|
|
@@ -34735,6 +36745,15 @@ other:'{count} セルを更新しました',
|
|
|
34735
36745
|
'stats.outliers':'外れ値',
|
|
34736
36746
|
'stats.distribution':'分布',
|
|
34737
36747
|
'stats.bin':'{from}~{to} に {count} 件',
|
|
36748
|
+
'stats.section.shape':'形状',
|
|
36749
|
+
'stats.section.robust':'頑健',
|
|
36750
|
+
'stats.section.concentration':'集中度',
|
|
36751
|
+
'stats.section.capability':'工程能力',
|
|
36752
|
+
'stats.cp':'Cp',
|
|
36753
|
+
'stats.cpk':'Cpk',
|
|
36754
|
+
'stats.pp':'Pp',
|
|
36755
|
+
'stats.ppk':'Ppk',
|
|
36756
|
+
'stats.outOfSpec':'規格外',
|
|
34738
36757
|
'stats.filtered':'フィルター後の {count} 行が対象',
|
|
34739
36758
|
'panel.zone.group':'行グループ',
|
|
34740
36759
|
'panel.zone.values':'値',
|
|
@@ -35168,6 +37187,62 @@ other:'تم تحديث {count} خلية',
|
|
|
35168
37187
|
'panel.quickFilter':'تصفية سريعة',
|
|
35169
37188
|
'panel.formatting':'التنسيق',
|
|
35170
37189
|
'panel.statistics':'الإحصاءات',
|
|
37190
|
+
'panel.compare':'قارن',
|
|
37191
|
+
'compare.first':'العمود الأول',
|
|
37192
|
+
'compare.second':'العمود الثاني',
|
|
37193
|
+
'compare.needTwo':'يلزم عمودان رقميان للمقارنة',
|
|
37194
|
+
'compare.noPairs':'لا توجد صفوف بقيمة في كليهما',
|
|
37195
|
+
'compare.pairs':'{count} زوجًا',
|
|
37196
|
+
'compare.pearson':'الارتباط (بيرسون)',
|
|
37197
|
+
'compare.spearman':'ارتباط الرتب (سبيرمان)',
|
|
37198
|
+
'compare.kendall':'تاو كندال',
|
|
37199
|
+
'compare.covariance':'التغاير',
|
|
37200
|
+
'compare.slope':'الميل',
|
|
37201
|
+
'compare.intercept':'التقاطع',
|
|
37202
|
+
'compare.r2':'R²',
|
|
37203
|
+
'compare.stdError':'الخطأ المعياري',
|
|
37204
|
+
'compare.weighted':'المتوسط المرجح',
|
|
37205
|
+
'total.sum':'المجموع',
|
|
37206
|
+
'total.avg':'المتوسط',
|
|
37207
|
+
'total.min':'الأدنى',
|
|
37208
|
+
'total.max':'الأعلى',
|
|
37209
|
+
'total.count':'العدد',
|
|
37210
|
+
'total.countValues':'عدد القيم',
|
|
37211
|
+
'total.first':'الأول',
|
|
37212
|
+
'total.last':'الأخير',
|
|
37213
|
+
'total.median':'الوسيط',
|
|
37214
|
+
'total.p25':'المئين 25',
|
|
37215
|
+
'total.p75':'المئين 75',
|
|
37216
|
+
'total.p90':'المئين 90',
|
|
37217
|
+
'total.p95':'المئين 95',
|
|
37218
|
+
'total.p99':'المئين 99',
|
|
37219
|
+
'total.iqr':'المدى الربيعي',
|
|
37220
|
+
'total.mad':'الانحراف المطلق الوسيط',
|
|
37221
|
+
'total.variance':'التباين',
|
|
37222
|
+
'total.varianceP':'التباين (المجتمع)',
|
|
37223
|
+
'total.stddev':'الانحراف المعياري',
|
|
37224
|
+
'total.stddevP':'الانحراف المعياري (المجتمع)',
|
|
37225
|
+
'total.range':'المدى',
|
|
37226
|
+
'total.distinct':'القيم المميزة',
|
|
37227
|
+
'total.mode':'المنوال',
|
|
37228
|
+
'total.skewness':'الالتواء',
|
|
37229
|
+
'total.kurtosis':'التفلطح',
|
|
37230
|
+
'total.geomean':'المتوسط الهندسي',
|
|
37231
|
+
'total.harmean':'المتوسط التوافقي',
|
|
37232
|
+
'total.sumSquares':'مجموع المربعات',
|
|
37233
|
+
'total.weightedAvg':'المتوسط المرجح',
|
|
37234
|
+
'total.argmin':'الأدنى حسب',
|
|
37235
|
+
'total.argmax':'الأعلى حسب',
|
|
37236
|
+
'total.hhi':'التركز (HHI)',
|
|
37237
|
+
'total.entropy':'الإنتروبيا',
|
|
37238
|
+
'total.evenness':'التجانس',
|
|
37239
|
+
'total.top3Share':'حصة أعلى 3',
|
|
37240
|
+
'total.top10Share':'حصة أعلى 10',
|
|
37241
|
+
'total.gini':'معامل جيني',
|
|
37242
|
+
'total.trimmedMean':'المتوسط المشذب',
|
|
37243
|
+
'total.winsorizedMean':'المتوسط الوينزوري',
|
|
37244
|
+
'total.robustOutliers':'القيم الشاذة (حصينة)',
|
|
37245
|
+
'total.jarqueBera':'جارك–بيرا',
|
|
35171
37246
|
'stats.column':'العمود',
|
|
35172
37247
|
'stats.choose':'اختر عمودًا لتحليله',
|
|
35173
37248
|
'stats.noColumns':'لا توجد أعمدة رقمية للتحليل',
|
|
@@ -35187,6 +37262,15 @@ other:'تم تحديث {count} خلية',
|
|
|
35187
37262
|
'stats.outliers':'القيم الشاذة',
|
|
35188
37263
|
'stats.distribution':'التوزيع',
|
|
35189
37264
|
'stats.bin':'{count} بين {from} و {to}',
|
|
37265
|
+
'stats.section.shape':'الشكل',
|
|
37266
|
+
'stats.section.robust':'حصين',
|
|
37267
|
+
'stats.section.concentration':'التركز',
|
|
37268
|
+
'stats.section.capability':'القدرة',
|
|
37269
|
+
'stats.cp':'Cp',
|
|
37270
|
+
'stats.cpk':'Cpk',
|
|
37271
|
+
'stats.pp':'Pp',
|
|
37272
|
+
'stats.ppk':'Ppk',
|
|
37273
|
+
'stats.outOfSpec':'خارج المواصفة',
|
|
35190
37274
|
'stats.filtered':'من بين {count} صفًا بعد التصفية',
|
|
35191
37275
|
'panel.zone.group':'تجميعات الصفوف',
|
|
35192
37276
|
'panel.zone.values':'القيم',
|
|
@@ -36033,6 +38117,8 @@ Object.defineProperty(__exports,"RADIX_PRESETS",{enumerable:true,get:function(){
|
|
|
36033
38117
|
Object.defineProperty(__exports,"parseRadix",{enumerable:true,get:function(){return __m5["parseRadix"];}});
|
|
36034
38118
|
Object.defineProperty(__exports,"formatRadix",{enumerable:true,get:function(){return __m5["formatRadix"];}});
|
|
36035
38119
|
Object.defineProperty(__exports,"createUnitType",{enumerable:true,get:function(){return __m5["createUnitType"];}});
|
|
38120
|
+
Object.defineProperty(__exports,"registerUnitSystem",{enumerable:true,get:function(){return __m5["registerUnitSystem"];}});
|
|
38121
|
+
Object.defineProperty(__exports,"defineUnit",{enumerable:true,get:function(){return __m5["defineUnit"];}});
|
|
36036
38122
|
Object.defineProperty(__exports,"UNIT_SYSTEMS",{enumerable:true,get:function(){return __m5["UNIT_SYSTEMS"];}});
|
|
36037
38123
|
Object.defineProperty(__exports,"parseUnit",{enumerable:true,get:function(){return __m5["parseUnit"];}});
|
|
36038
38124
|
Object.defineProperty(__exports,"formatUnit",{enumerable:true,get:function(){return __m5["formatUnit"];}});
|
|
@@ -53609,6 +55695,20 @@ const FIGURES=Object.freeze([
|
|
|
53609
55695
|
{key:'stddev',label:'stats.stddev',kind:'value'},
|
|
53610
55696
|
{key:'outliers',label:'stats.outliers',kind:'count'},
|
|
53611
55697
|
]);
|
|
55698
|
+
const SECTIONS=Object.freeze([
|
|
55699
|
+
{
|
|
55700
|
+
label:'stats.section.shape',
|
|
55701
|
+
kernels:['skewness','kurtosis','jarqueBera'],
|
|
55702
|
+
},
|
|
55703
|
+
{
|
|
55704
|
+
label:'stats.section.robust',
|
|
55705
|
+
kernels:['trimmedMean','winsorizedMean','mad','robustOutliers'],
|
|
55706
|
+
},
|
|
55707
|
+
{
|
|
55708
|
+
label:'stats.section.concentration',
|
|
55709
|
+
kernels:['gini','hhi','entropy','evenness','top3Share'],
|
|
55710
|
+
},
|
|
55711
|
+
]);
|
|
53612
55712
|
function readable(value){
|
|
53613
55713
|
if(value===null||value===undefined||!Number.isFinite(value))return'—';
|
|
53614
55714
|
if(Number.isInteger(value))return String(value);
|
|
@@ -53650,6 +55750,12 @@ class:`${CLS.panel}__count`,
|
|
|
53650
55750
|
text:this.t('stats.filtered',{count:profile.rows}),
|
|
53651
55751
|
}));
|
|
53652
55752
|
root.appendChild(this.#figures(profile));
|
|
55753
|
+
for(const section of SECTIONS){
|
|
55754
|
+
const rendered=this.#section(section);
|
|
55755
|
+
if(rendered)root.appendChild(rendered);
|
|
55756
|
+
}
|
|
55757
|
+
const capability=this.#capability();
|
|
55758
|
+
if(capability)root.appendChild(capability);
|
|
53653
55759
|
if(profile.histogram&&profile.histogram.length>1){
|
|
53654
55760
|
root.appendChild(this.#histogram(profile.histogram));
|
|
53655
55761
|
}
|
|
@@ -53679,6 +55785,60 @@ select,
|
|
|
53679
55785
|
],
|
|
53680
55786
|
});
|
|
53681
55787
|
}
|
|
55788
|
+
#section(section){
|
|
55789
|
+
const reduce=this.host.reduceColumn;
|
|
55790
|
+
if(!isFunction(reduce)||!this.column)return null;
|
|
55791
|
+
const rows=[];
|
|
55792
|
+
for(const kernel of section.kernels){
|
|
55793
|
+
const value=reduce(this.column,kernel);
|
|
55794
|
+
if(value===null||value===undefined||Number.isNaN(value))continue;
|
|
55795
|
+
rows.push([kernel,value]);
|
|
55796
|
+
}
|
|
55797
|
+
if(!rows.length)return null;
|
|
55798
|
+
const wrapper=this.doc.createElement('div');
|
|
55799
|
+
wrapper.appendChild(el(this.doc,'h4',{
|
|
55800
|
+
class:`${CLS.panel}__subtitle`,text:this.t(section.label),
|
|
55801
|
+
}));
|
|
55802
|
+
const list=el(this.doc,'dl',{class:`${CLS.panel}__stats`});
|
|
55803
|
+
for(const[kernel,value]of rows){
|
|
55804
|
+
list.appendChild(el(this.doc,'dt',{
|
|
55805
|
+
class:`${CLS.panel}__stat-name`,
|
|
55806
|
+
text:this.t(`total.${kernel}`),
|
|
55807
|
+
}));
|
|
55808
|
+
list.appendChild(el(this.doc,'dd',{
|
|
55809
|
+
class:`${CLS.panel}__stat-value`,
|
|
55810
|
+
text:typeof value==='number'?readable(value):String(value),
|
|
55811
|
+
}));
|
|
55812
|
+
}
|
|
55813
|
+
wrapper.appendChild(list);
|
|
55814
|
+
return wrapper;
|
|
55815
|
+
}
|
|
55816
|
+
#capability(){
|
|
55817
|
+
const read=this.host.columnCapability;
|
|
55818
|
+
if(!isFunction(read)||!this.column)return null;
|
|
55819
|
+
const c=read(this.column);
|
|
55820
|
+
if(!c)return null;
|
|
55821
|
+
const wrapper=this.doc.createElement('div');
|
|
55822
|
+
wrapper.appendChild(el(this.doc,'h4',{
|
|
55823
|
+
class:`${CLS.panel}__subtitle`,text:this.t('stats.section.capability'),
|
|
55824
|
+
}));
|
|
55825
|
+
const list=el(this.doc,'dl',{class:`${CLS.panel}__stats`});
|
|
55826
|
+
const pairs=[
|
|
55827
|
+
['stats.cp',c.cp],['stats.cpk',c.cpk],['stats.pp',c.pp],['stats.ppk',c.ppk],
|
|
55828
|
+
['stats.outOfSpec',c.outOfSpec],
|
|
55829
|
+
];
|
|
55830
|
+
for(const[key,value]of pairs){
|
|
55831
|
+
if(value===null||value===undefined)continue;
|
|
55832
|
+
list.appendChild(el(this.doc,'dt',{
|
|
55833
|
+
class:`${CLS.panel}__stat-name`,text:this.t(key),
|
|
55834
|
+
}));
|
|
55835
|
+
list.appendChild(el(this.doc,'dd',{
|
|
55836
|
+
class:`${CLS.panel}__stat-value`,text:readable(value),
|
|
55837
|
+
}));
|
|
55838
|
+
}
|
|
55839
|
+
wrapper.appendChild(list);
|
|
55840
|
+
return wrapper;
|
|
55841
|
+
}
|
|
53682
55842
|
#figures(profile){
|
|
53683
55843
|
const list=el(this.doc,'dl',{class:`${CLS.panel}__stats`});
|
|
53684
55844
|
for(const figure of FIGURES){
|
|
@@ -53718,6 +55878,122 @@ return chart;
|
|
|
53718
55878
|
}
|
|
53719
55879
|
}
|
|
53720
55880
|
});
|
|
55881
|
+
__def("packages/dom/src/comparepanel.js",function(__exports,__req){
|
|
55882
|
+
'use strict';
|
|
55883
|
+
Object.defineProperty(__exports,"ComparePanel",{enumerable:true,get:function(){return ComparePanel;}});
|
|
55884
|
+
const __m0=__req("packages/dom/src/editors/common.js");
|
|
55885
|
+
const CLS=__m0["CLS"];
|
|
55886
|
+
const el=__m0["el"];
|
|
55887
|
+
const on=__m0["on"];
|
|
55888
|
+
const clear=__m0["clear"];
|
|
55889
|
+
const __m1=__req("packages/core/src/internal/util.js");
|
|
55890
|
+
const isFunction=__m1["isFunction"];
|
|
55891
|
+
const __m2=__req("packages/dom/src/ui/panelbase.js");
|
|
55892
|
+
const ToolPanelBase=__m2["ToolPanelBase"];
|
|
55893
|
+
const FIGURES=Object.freeze([
|
|
55894
|
+
{key:'pearson',label:'compare.pearson'},
|
|
55895
|
+
{key:'spearman',label:'compare.spearman'},
|
|
55896
|
+
{key:'kendall',label:'compare.kendall'},
|
|
55897
|
+
{key:'slope',label:'compare.slope'},
|
|
55898
|
+
{key:'intercept',label:'compare.intercept'},
|
|
55899
|
+
{key:'r2',label:'compare.r2'},
|
|
55900
|
+
{key:'stdError',label:'compare.stdError'},
|
|
55901
|
+
{key:'covariance',label:'compare.covariance'},
|
|
55902
|
+
{key:'weighted',label:'compare.weighted'},
|
|
55903
|
+
]);
|
|
55904
|
+
function readable(value){
|
|
55905
|
+
if(value===null||value===undefined||!Number.isFinite(value))return'—';
|
|
55906
|
+
if(Number.isInteger(value))return String(value);
|
|
55907
|
+
const magnitude=Math.abs(value);
|
|
55908
|
+
if(magnitude!==0&&(magnitude<0.001||magnitude>=1e7))return value.toExponential(2);
|
|
55909
|
+
return String(Number(value.toPrecision(4)));
|
|
55910
|
+
}
|
|
55911
|
+
class ComparePanel extends ToolPanelBase{
|
|
55912
|
+
first=null;
|
|
55913
|
+
second=null;
|
|
55914
|
+
#columns(){
|
|
55915
|
+
return isFunction(this.host.profilableColumns)?this.host.profilableColumns():[];
|
|
55916
|
+
}
|
|
55917
|
+
refresh(){
|
|
55918
|
+
const root=this.root;
|
|
55919
|
+
if(!root)return;
|
|
55920
|
+
for(const off of this.off)off();
|
|
55921
|
+
this.off.length=0;
|
|
55922
|
+
clear(root);
|
|
55923
|
+
const columns=this.#columns();
|
|
55924
|
+
if(columns.length<2){
|
|
55925
|
+
root.appendChild(el(this.doc,'p',{
|
|
55926
|
+
class:`${CLS.panel}__empty`,text:this.t('compare.needTwo'),
|
|
55927
|
+
}));
|
|
55928
|
+
return;
|
|
55929
|
+
}
|
|
55930
|
+
if(!columns.some((c)=>c.id===this.first))this.first=columns[0].id;
|
|
55931
|
+
if(!columns.some((c)=>c.id===this.second)||this.second===this.first){
|
|
55932
|
+
this.second=(columns.find((c)=>c.id!==this.first)||columns[0]).id;
|
|
55933
|
+
}
|
|
55934
|
+
root.appendChild(this.#picker('compare.first',columns,this.first,(id)=>{
|
|
55935
|
+
this.first=id;
|
|
55936
|
+
if(this.second===id){
|
|
55937
|
+
this.second=(columns.find((c)=>c.id!==id)||columns[0]).id;
|
|
55938
|
+
}
|
|
55939
|
+
this.refresh();
|
|
55940
|
+
}));
|
|
55941
|
+
root.appendChild(this.#picker('compare.second',columns,this.second,(id)=>{
|
|
55942
|
+
this.second=id;
|
|
55943
|
+
if(this.first===id){
|
|
55944
|
+
this.first=(columns.find((c)=>c.id!==id)||columns[0]).id;
|
|
55945
|
+
}
|
|
55946
|
+
this.refresh();
|
|
55947
|
+
}));
|
|
55948
|
+
const figures=isFunction(this.host.compareColumns)
|
|
55949
|
+
?this.host.compareColumns(this.first,this.second)
|
|
55950
|
+
:null;
|
|
55951
|
+
if(!figures||!figures.n){
|
|
55952
|
+
root.appendChild(el(this.doc,'p',{
|
|
55953
|
+
class:`${CLS.panel}__empty`,text:this.t('compare.noPairs'),
|
|
55954
|
+
}));
|
|
55955
|
+
return;
|
|
55956
|
+
}
|
|
55957
|
+
root.appendChild(el(this.doc,'p',{
|
|
55958
|
+
class:`${CLS.panel}__count`,
|
|
55959
|
+
text:this.t('compare.pairs',{count:figures.n}),
|
|
55960
|
+
}));
|
|
55961
|
+
const list=el(this.doc,'dl',{class:`${CLS.panel}__stats`});
|
|
55962
|
+
for(const figure of FIGURES){
|
|
55963
|
+
const value=figures[figure.key];
|
|
55964
|
+
if(value===null||value===undefined)continue;
|
|
55965
|
+
list.appendChild(el(this.doc,'dt',{
|
|
55966
|
+
class:`${CLS.panel}__stat-name`,text:this.t(figure.label),
|
|
55967
|
+
}));
|
|
55968
|
+
list.appendChild(el(this.doc,'dd',{
|
|
55969
|
+
class:`${CLS.panel}__stat-value`,text:readable(value),
|
|
55970
|
+
}));
|
|
55971
|
+
}
|
|
55972
|
+
root.appendChild(list);
|
|
55973
|
+
}
|
|
55974
|
+
#picker(label,columns,current,choose){
|
|
55975
|
+
const select=el(this.doc,'select',{
|
|
55976
|
+
class:`${CLS.panel}__select`,
|
|
55977
|
+
attrs:{'aria-label':this.t(label)},
|
|
55978
|
+
});
|
|
55979
|
+
for(const column of columns){
|
|
55980
|
+
select.appendChild(el(this.doc,'option',{
|
|
55981
|
+
text:column.title,
|
|
55982
|
+
attrs:{value:column.id,selected:column.id===current?true:null},
|
|
55983
|
+
}));
|
|
55984
|
+
}
|
|
55985
|
+
(select).value=current;
|
|
55986
|
+
this.off.push(on(select,'change',()=>choose((select).value)));
|
|
55987
|
+
return el(this.doc,'label',{
|
|
55988
|
+
class:`${CLS.panel}__field`,
|
|
55989
|
+
children:[
|
|
55990
|
+
el(this.doc,'span',{class:`${CLS.panel}__label`,text:this.t(label)}),
|
|
55991
|
+
select,
|
|
55992
|
+
],
|
|
55993
|
+
});
|
|
55994
|
+
}
|
|
55995
|
+
}
|
|
55996
|
+
});
|
|
53721
55997
|
__def("packages/dom/src/ui/toolpanel.js",function(__exports,__req){
|
|
53722
55998
|
'use strict';
|
|
53723
55999
|
Object.defineProperty(__exports,"ColumnsPanel",{enumerable:true,get:function(){return ColumnsPanel;}});
|
|
@@ -53750,10 +56026,12 @@ const __m5=__req("packages/dom/src/formattingpanel.js");
|
|
|
53750
56026
|
const FormattingPanel=__m5["FormattingPanel"];
|
|
53751
56027
|
const __m6=__req("packages/dom/src/statisticspanel.js");
|
|
53752
56028
|
const StatisticsPanel=__m6["StatisticsPanel"];
|
|
53753
|
-
const __m7=__req("packages/dom/src/
|
|
53754
|
-
const
|
|
53755
|
-
const __m8=__req("packages/
|
|
53756
|
-
const
|
|
56029
|
+
const __m7=__req("packages/dom/src/comparepanel.js");
|
|
56030
|
+
const ComparePanel=__m7["ComparePanel"];
|
|
56031
|
+
const __m8=__req("packages/dom/src/ui/panelbase.js");
|
|
56032
|
+
const ToolPanelBase=__m8["ToolPanelBase"];
|
|
56033
|
+
const __m9=__req("packages/core/src/compute/total.js");
|
|
56034
|
+
const TOTAL_LABELS=__m9["TOTAL_LABELS"];
|
|
53757
56035
|
class ColumnsPanel extends ToolPanelBase{
|
|
53758
56036
|
dragging=null;
|
|
53759
56037
|
refresh(){
|
|
@@ -53951,7 +56229,7 @@ attrs:{'aria-label':`Calculation for ${this.titleOf(id)}`},
|
|
|
53951
56229
|
});
|
|
53952
56230
|
for(const fn of ColumnsPanel.aggregations){
|
|
53953
56231
|
select.appendChild(el(this.doc,'option',{
|
|
53954
|
-
text:fn.
|
|
56232
|
+
text:this.t(`total.${fn.name}`),
|
|
53955
56233
|
attrs:{value:fn.name,selected:fn.name===current?'':null},
|
|
53956
56234
|
}));
|
|
53957
56235
|
}
|
|
@@ -53981,7 +56259,7 @@ zone.appendChild(body);
|
|
|
53981
56259
|
return zone;
|
|
53982
56260
|
}
|
|
53983
56261
|
static aggregations=Object.freeze(
|
|
53984
|
-
Object.
|
|
56262
|
+
Object.keys(TOTAL_LABELS).map((name)=>({name})),
|
|
53985
56263
|
);
|
|
53986
56264
|
static zoneAbout=Object.freeze({
|
|
53987
56265
|
group:'Rows are grouped by these columns, in order.',
|
|
@@ -54243,6 +56521,7 @@ views:ViewPicker,
|
|
|
54243
56521
|
quick:QuickFilterPanel,
|
|
54244
56522
|
formatting:FormattingPanel,
|
|
54245
56523
|
statistics:StatisticsPanel,
|
|
56524
|
+
compare:ComparePanel,
|
|
54246
56525
|
});
|
|
54247
56526
|
const toolPanelTitles=Object.freeze({
|
|
54248
56527
|
columns:'panel.columns',
|
|
@@ -54251,6 +56530,7 @@ views:'panel.views',
|
|
|
54251
56530
|
quick:'panel.quickFilter',
|
|
54252
56531
|
formatting:'panel.formatting',
|
|
54253
56532
|
statistics:'panel.statistics',
|
|
56533
|
+
compare:'panel.compare',
|
|
54254
56534
|
});
|
|
54255
56535
|
const toolPanelIcons=Object.freeze({
|
|
54256
56536
|
columns:'columns',
|
|
@@ -54259,6 +56539,7 @@ views:'views',
|
|
|
54259
56539
|
quick:'search',
|
|
54260
56540
|
formatting:'palette',
|
|
54261
56541
|
statistics:'chart',
|
|
56542
|
+
compare:'link',
|
|
54262
56543
|
});
|
|
54263
56544
|
class ToolPanel{
|
|
54264
56545
|
panels=[];
|
|
@@ -56651,6 +58932,7 @@ this.#row=null;
|
|
|
56651
58932
|
});
|
|
56652
58933
|
__def("packages/dom/src/toolpanelmount.js",function(__exports,__req){
|
|
56653
58934
|
'use strict';
|
|
58935
|
+
Object.defineProperty(__exports,"mountPanel",{enumerable:true,get:function(){return mountPanel;}});
|
|
56654
58936
|
Object.defineProperty(__exports,"panelHost",{enumerable:true,get:function(){return panelHost;}});
|
|
56655
58937
|
Object.defineProperty(__exports,"ToolPanelDock",{enumerable:true,get:function(){return ToolPanelDock;}});
|
|
56656
58938
|
const __m0=__req("packages/core/src/internal/util.js");
|
|
@@ -56665,10 +58947,48 @@ const __m2=__req("packages/dom/src/filters/index.js");
|
|
|
56665
58947
|
const createFilter=__m2["createFilter"];
|
|
56666
58948
|
const __m3=__req("packages/dom/src/editors/common.js");
|
|
56667
58949
|
const CLS=__m3["CLS"];
|
|
58950
|
+
const documentFor=__m3["documentFor"];
|
|
56668
58951
|
const scannableRows=__m3["scannableRows"];
|
|
56669
58952
|
const __m4=__req("packages/dom/src/filtermenu.js");
|
|
56670
58953
|
const mergeColumnFilter=__m4["mergeColumnFilter"];
|
|
56671
58954
|
const branchFor=__m4["branchFor"];
|
|
58955
|
+
const REPAINT_ON=Object.freeze([
|
|
58956
|
+
'column:visible','column:moved','column:pinned',
|
|
58957
|
+
'column:grouped','column:pivoted','filter:changed','model:changed',
|
|
58958
|
+
'views:changed','sort:changed','history:changed','state:reset',
|
|
58959
|
+
'cell:changed','formatting:changed',
|
|
58960
|
+
]);
|
|
58961
|
+
function mountPanel(opts){
|
|
58962
|
+
const{grid,container}=opts||{};
|
|
58963
|
+
if(!grid)throw new Error('[lattice] mountPanel needs a grid');
|
|
58964
|
+
if(!container||!container.appendChild){
|
|
58965
|
+
throw new Error('[lattice] mountPanel needs a container element');
|
|
58966
|
+
}
|
|
58967
|
+
const Ctor=isFunction(opts.panel)?opts.panel:toolPanels[String(opts.panel)];
|
|
58968
|
+
if(!Ctor){
|
|
58969
|
+
throw new Error(`[lattice] unknown panel "${opts.panel}"; known panels are ${Object.keys(toolPanels).join(', ')}`);
|
|
58970
|
+
}
|
|
58971
|
+
const doc=container.ownerDocument||documentFor(container);
|
|
58972
|
+
const host=panelHost(grid,doc,opts.announce);
|
|
58973
|
+
const panel=new Ctor();
|
|
58974
|
+
panel.init({document:doc,host,grid,props:opts.props||{}});
|
|
58975
|
+
const element=panel.element();
|
|
58976
|
+
container.appendChild(element);
|
|
58977
|
+
const off=[];
|
|
58978
|
+
for(const event of REPAINT_ON){
|
|
58979
|
+
if(isFunction(grid.on))off.push(grid.on(event,()=>panel.refresh()));
|
|
58980
|
+
}
|
|
58981
|
+
return{
|
|
58982
|
+
element,
|
|
58983
|
+
refresh(){panel.refresh();},
|
|
58984
|
+
destroy(){
|
|
58985
|
+
for(const stop of off)stop();
|
|
58986
|
+
off.length=0;
|
|
58987
|
+
if(isFunction(panel.destroy))panel.destroy();
|
|
58988
|
+
if(element&&element.parentNode)element.parentNode.removeChild(element);
|
|
58989
|
+
},
|
|
58990
|
+
};
|
|
58991
|
+
}
|
|
56672
58992
|
const PANEL_WIDTH=260;
|
|
56673
58993
|
const RAIL_WIDTH=30;
|
|
56674
58994
|
const DOCK_CLASS=`${CLS.panel}-dock`;
|
|
@@ -56734,6 +59054,24 @@ profilableColumns:()=>grid.columns.visible()
|
|
|
56734
59054
|
||c.type==='percent'||c.type==='integer'))
|
|
56735
59055
|
.map((c)=>({id:c.id,title:String(c.title??c.id)})),
|
|
56736
59056
|
columnProfile:(colId)=>grid.statistics.profile(colId),
|
|
59057
|
+
reduceColumn:(colId,kernel)=>grid.statistics.reduce(colId,kernel),
|
|
59058
|
+
columnCapability:(colId)=>grid.statistics.capability(colId),
|
|
59059
|
+
compareColumns:(a,b)=>{
|
|
59060
|
+
if(!a||!b||a===b)return null;
|
|
59061
|
+
const fit=grid.statistics.regression(a,b);
|
|
59062
|
+
return{
|
|
59063
|
+
n:fit?fit.n:0,
|
|
59064
|
+
pearson:grid.statistics.correlation(a,b),
|
|
59065
|
+
spearman:grid.statistics.spearman(a,b),
|
|
59066
|
+
kendall:grid.statistics.kendall(a,b),
|
|
59067
|
+
covariance:grid.statistics.covariance(a,b),
|
|
59068
|
+
slope:fit?fit.slope:null,
|
|
59069
|
+
intercept:fit?fit.intercept:null,
|
|
59070
|
+
r2:fit?fit.r2:null,
|
|
59071
|
+
stdError:fit?fit.stdError:null,
|
|
59072
|
+
weighted:grid.statistics.weightedAverage(a,b),
|
|
59073
|
+
};
|
|
59074
|
+
},
|
|
56737
59075
|
addRule:(scope,rule)=>grid.formatting.add(scope,rule),
|
|
56738
59076
|
removeRule:(scope,id)=>grid.formatting.remove(scope,id),
|
|
56739
59077
|
updateRule:(scope,id,patch)=>grid.formatting.update(scope,id,patch),
|
|
@@ -56866,10 +59204,7 @@ const show=this.#panel.show.bind(this.#panel);
|
|
|
56866
59204
|
const hide=this.#panel.hide.bind(this.#panel);
|
|
56867
59205
|
this.#panel.show=(name)=>{const ok=show(name);this.#applyWidth();return ok;};
|
|
56868
59206
|
this.#panel.hide=()=>{hide();this.#applyWidth();};
|
|
56869
|
-
for(const event of[
|
|
56870
|
-
'column:grouped','column:pivoted','filter:changed','model:changed',
|
|
56871
|
-
'views:changed','sort:changed','history:changed','state:reset',
|
|
56872
|
-
'cell:changed','formatting:changed',
|
|
59207
|
+
for(const event of[...REPAINT_ON,
|
|
56873
59208
|
'rows:paused','rows:resumed','rows:queued']){
|
|
56874
59209
|
this.#off.push(this.#grid.on(event,()=>this.#panel.refresh()));
|
|
56875
59210
|
}
|
|
@@ -57357,6 +59692,12 @@ const __m3=__req("packages/dom/src/renderer/textentry.js");
|
|
|
57357
59692
|
const isTextEntry=__m3["isTextEntry"];
|
|
57358
59693
|
const IN_RANGE='lat-cell--range';
|
|
57359
59694
|
const RANGE_EDGE='lat-cell--range-edge';
|
|
59695
|
+
const EDGE_SIDES=Object.freeze({
|
|
59696
|
+
top:'lat-cell--range-top',
|
|
59697
|
+
right:'lat-cell--range-right',
|
|
59698
|
+
bottom:'lat-cell--range-bottom',
|
|
59699
|
+
left:'lat-cell--range-left',
|
|
59700
|
+
});
|
|
57360
59701
|
const DRAG_THRESHOLD=3;
|
|
57361
59702
|
class RangeController{
|
|
57362
59703
|
#grid;
|
|
@@ -57618,7 +59959,13 @@ if(!Number.isFinite(index)||index<0)continue;
|
|
|
57618
59959
|
const inRange=hasRange&&selection.inRange(index,colId);
|
|
57619
59960
|
const inPreview=!!preview&&this.#inFillPreview(index,colId,preview);
|
|
57620
59961
|
cell.classList.toggle(IN_RANGE,inRange||inPreview);
|
|
57621
|
-
|
|
59962
|
+
const edges=(inRange||inPreview)
|
|
59963
|
+
?this.#edgesOf(index,colId,selection)
|
|
59964
|
+
:null;
|
|
59965
|
+
cell.classList.toggle(RANGE_EDGE,!!edges&&edges.any);
|
|
59966
|
+
for(const[side,className]of Object.entries(EDGE_SIDES)){
|
|
59967
|
+
cell.classList.toggle(className,!!edges&&edges[side]);
|
|
59968
|
+
}
|
|
57622
59969
|
}
|
|
57623
59970
|
this.#placeHandle();
|
|
57624
59971
|
}
|
|
@@ -57630,15 +59977,19 @@ if(!columns.has(colId))return false;
|
|
|
57630
59977
|
const last=this.#indexOfKey([...new Set(cells.map((c)=>c.key))].pop());
|
|
57631
59978
|
return index>last&&index<=preview.rowIndex;
|
|
57632
59979
|
}
|
|
57633
|
-
#
|
|
59980
|
+
#edgesOf(index,colId,selection){
|
|
57634
59981
|
const columns=this.#grid.columns.visible().map((c)=>c.id);
|
|
57635
59982
|
const at=columns.indexOf(colId);
|
|
57636
|
-
const
|
|
57637
|
-
const
|
|
57638
|
-
|
|
57639
|
-
|
|
57640
|
-
|
|
57641
|
-
||!
|
|
59983
|
+
const before=at>0?columns[at-1]:null;
|
|
59984
|
+
const after=at>=0&&at<columns.length-1?columns[at+1]:null;
|
|
59985
|
+
const edges={
|
|
59986
|
+
top:!selection.inRange(index-1,colId),
|
|
59987
|
+
bottom:!selection.inRange(index+1,colId),
|
|
59988
|
+
left:!before||!selection.inRange(index,before),
|
|
59989
|
+
right:!after||!selection.inRange(index,after),
|
|
59990
|
+
};
|
|
59991
|
+
edges.any=edges.top||edges.bottom||edges.left||edges.right;
|
|
59992
|
+
return edges;
|
|
57642
59993
|
}
|
|
57643
59994
|
#placeHandle(){
|
|
57644
59995
|
const corner=this.#grid.selection.corner();
|
|
@@ -60741,6 +63092,8 @@ Object.defineProperty(__exports,"RADIX_PRESETS",{enumerable:true,get:function(){
|
|
|
60741
63092
|
Object.defineProperty(__exports,"parseRadix",{enumerable:true,get:function(){return __m4["parseRadix"];}});
|
|
60742
63093
|
Object.defineProperty(__exports,"formatRadix",{enumerable:true,get:function(){return __m4["formatRadix"];}});
|
|
60743
63094
|
Object.defineProperty(__exports,"createUnitType",{enumerable:true,get:function(){return __m4["createUnitType"];}});
|
|
63095
|
+
Object.defineProperty(__exports,"registerUnitSystem",{enumerable:true,get:function(){return __m4["registerUnitSystem"];}});
|
|
63096
|
+
Object.defineProperty(__exports,"defineUnit",{enumerable:true,get:function(){return __m4["defineUnit"];}});
|
|
60744
63097
|
Object.defineProperty(__exports,"UNIT_SYSTEMS",{enumerable:true,get:function(){return __m4["UNIT_SYSTEMS"];}});
|
|
60745
63098
|
Object.defineProperty(__exports,"parseUnit",{enumerable:true,get:function(){return __m4["parseUnit"];}});
|
|
60746
63099
|
Object.defineProperty(__exports,"formatUnit",{enumerable:true,get:function(){return __m4["formatUnit"];}});
|
|
@@ -60830,6 +63183,7 @@ Object.defineProperty(__exports,"layoutState",{enumerable:true,get:function(){re
|
|
|
60830
63183
|
const __m9=__req("packages/dom/src/toolpanelmount.js");
|
|
60831
63184
|
Object.defineProperty(__exports,"ToolPanelDock",{enumerable:true,get:function(){return __m9["ToolPanelDock"];}});
|
|
60832
63185
|
Object.defineProperty(__exports,"panelHost",{enumerable:true,get:function(){return __m9["panelHost"];}});
|
|
63186
|
+
Object.defineProperty(__exports,"mountPanel",{enumerable:true,get:function(){return __m9["mountPanel"];}});
|
|
60833
63187
|
const __m10=__req("packages/dom/src/celledit.js");
|
|
60834
63188
|
Object.defineProperty(__exports,"CellEditController",{enumerable:true,get:function(){return __m10["CellEditController"];}});
|
|
60835
63189
|
const __m11=__req("packages/dom/src/editbar.js");
|
|
@@ -60891,7 +63245,7 @@ createLocalViewStorage,
|
|
|
60891
63245
|
const __default=LatticeGrid;
|
|
60892
63246
|
});
|
|
60893
63247
|
try{
|
|
60894
|
-
__req("packages/worker/src/inline.js").setWorkerSource("(function(root){\n'use strict';\nvar __mods=Object.create(null);\nvar __cache=Object.create(null);\nfunction __def(id,fn){__mods[id]=fn;}\nfunction __req(id){\nvar hit=__cache[id];\nif(hit)return hit;\nvar exports=Object.create(null);\n__cache[id]=exports;\nvar fn=__mods[id];\nif(!fn)throw new Error('[lattice] missing module: '+id);\nfn(exports,__req);\nreturn exports;\n}\n__def(\"packages/core/src/internal/util.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"VERSION\",{enumerable:true,get:function(){return VERSION;}});\nObject.defineProperty(__exports,\"reportedWarnings\",{enumerable:true,get:function(){return reportedWarnings;}});\nObject.defineProperty(__exports,\"warnOnce\",{enumerable:true,get:function(){return warnOnce;}});\nObject.defineProperty(__exports,\"infoOnce\",{enumerable:true,get:function(){return infoOnce;}});\nObject.defineProperty(__exports,\"resetWarnings\",{enumerable:true,get:function(){return resetWarnings;}});\nObject.defineProperty(__exports,\"fail\",{enumerable:true,get:function(){return fail;}});\nObject.defineProperty(__exports,\"invariant\",{enumerable:true,get:function(){return invariant;}});\nObject.defineProperty(__exports,\"DEV\",{enumerable:true,get:function(){return DEV;}});\nObject.defineProperty(__exports,\"isObject\",{enumerable:true,get:function(){return isObject;}});\nObject.defineProperty(__exports,\"isFunction\",{enumerable:true,get:function(){return isFunction;}});\nObject.defineProperty(__exports,\"isNil\",{enumerable:true,get:function(){return isNil;}});\nObject.defineProperty(__exports,\"isBlank\",{enumerable:true,get:function(){return isBlank;}});\nObject.defineProperty(__exports,\"isCtor\",{enumerable:true,get:function(){return isCtor;}});\nObject.defineProperty(__exports,\"pathGetter\",{enumerable:true,get:function(){return pathGetter;}});\nObject.defineProperty(__exports,\"pathSetter\",{enumerable:true,get:function(){return pathSetter;}});\nObject.defineProperty(__exports,\"getPath\",{enumerable:true,get:function(){return getPath;}});\nObject.defineProperty(__exports,\"setPath\",{enumerable:true,get:function(){return setPath;}});\nObject.defineProperty(__exports,\"humanise\",{enumerable:true,get:function(){return humanise;}});\nObject.defineProperty(__exports,\"escapeHtml\",{enumerable:true,get:function(){return escapeHtml;}});\nObject.defineProperty(__exports,\"titleCase\",{enumerable:true,get:function(){return titleCase;}});\nObject.defineProperty(__exports,\"expand\",{enumerable:true,get:function(){return expand;}});\nObject.defineProperty(__exports,\"toArray\",{enumerable:true,get:function(){return toArray;}});\nObject.defineProperty(__exports,\"merge\",{enumerable:true,get:function(){return merge;}});\nObject.defineProperty(__exports,\"mergeRow\",{enumerable:true,get:function(){return mergeRow;}});\nObject.defineProperty(__exports,\"Lru\",{enumerable:true,get:function(){return Lru;}});\nObject.defineProperty(__exports,\"collator\",{enumerable:true,get:function(){return collator;}});\nObject.defineProperty(__exports,\"defaultCompare\",{enumerable:true,get:function(){return defaultCompare;}});\nObject.defineProperty(__exports,\"now\",{enumerable:true,get:function(){return now;}});\nObject.defineProperty(__exports,\"nextFrame\",{enumerable:true,get:function(){return nextFrame;}});\nObject.defineProperty(__exports,\"cancelFrame\",{enumerable:true,get:function(){return cancelFrame;}});\nObject.defineProperty(__exports,\"frameBatched\",{enumerable:true,get:function(){return frameBatched;}});\nObject.defineProperty(__exports,\"whenIdle\",{enumerable:true,get:function(){return whenIdle;}});\nObject.defineProperty(__exports,\"uid\",{enumerable:true,get:function(){return uid;}});\nconst VERSION='1.8.0';\nconst warned=new Set();\nconst reported=[];\nconst REPORT_LIMIT=500;\nfunction record(key,level,message){\nreported.push({\nkey,\nlevel,\nmessage:message.map((m)=>(typeof m==='string'?m:safeString(m))).join(' '),\nat:Date.now(),\n});\nif(reported.length>REPORT_LIMIT)reported.shift();\n}\nfunction safeString(value){\nif(value instanceof Error)return value.message;\ntry{return JSON.stringify(value);}catch{return String(value);}\n}\nfunction reportedWarnings(){return reported.map((r)=>({...r}));}\nfunction warnOnce(key,...message){\nif(warned.has(key))return;\nwarned.add(key);\nrecord(key,'warn',message);\nconsole.warn('[lattice]',...message);\n}\nfunction infoOnce(key,...message){\nif(warned.has(key))return;\nwarned.add(key);\nrecord(key,'info',message);\nconsole.info('[lattice]',...message);\n}\nfunction resetWarnings(){\nwarned.clear();\nreported.length=0;\n}\nfunction fail(message,extra){\nconst err=new Error(`[lattice] ${message}`);\nif(extra!==undefined)err.cause=extra;\nthrow err;\n}\nfunction invariant(condition,message){\nif(!condition)fail(message);\n}\nconst DEV=(()=>{\ntry{\nreturn!(typeof process!=='undefined'&&process.env\n&&process.env.NODE_ENV==='production');\n}catch{\nreturn true;\n}\n})();\nfunction isObject(v){\nreturn v!==null&&typeof v==='object'&&!Array.isArray(v);\n}\nfunction isFunction(v){\nreturn typeof v==='function';\n}\nfunction isNil(v){\nreturn v===null||v===undefined;\n}\nfunction isBlank(v){\nreturn v===null||v===undefined||v==='';\n}\nfunction isCtor(v){\nif(typeof v!=='function')return false;\nif(/^class[\\s{]/.test(Function.prototype.toString.call(v)))return true;\nreturn!!(v.prototype&&Object.getOwnPropertyNames(v.prototype).length>1);\n}\nconst pathCache=new Map();\nfunction pathGetter(path){\nlet fn=pathCache.get(path);\nif(fn)return fn;\nif(!path.includes('.')){\nfn=(o)=>(o==null?undefined:o[path]);\n}else{\nconst parts=path.split('.');\nconst n=parts.length;\nfn=(o)=>{\nlet cur=o;\nfor(let i=0;i<n;i++){\nif(cur==null)return undefined;\ncur=cur[parts[i]];\n}\nreturn cur;\n};\n}\npathCache.set(path,fn);\nreturn fn;\n}\nconst setterCache=new Map();\nfunction pathSetter(path){\nlet fn=setterCache.get(path);\nif(fn)return fn;\nif(!path.includes('.')){\nfn=(o,v)=>{if(o!=null)o[path]=v;};\n}else{\nconst parts=path.split('.');\nconst last=parts.length-1;\nfn=(o,v)=>{\nlet cur=o;\nfor(let i=0;i<last;i++){\nif(cur==null)return;\nconst k=parts[i];\nif(cur[k]==null)cur[k]={};\ncur=cur[k];\n}\nif(cur!=null)cur[parts[last]]=v;\n};\n}\nsetterCache.set(path,fn);\nreturn fn;\n}\nfunction getPath(obj,path){\nreturn pathGetter(path)(obj);\n}\nfunction setPath(obj,path,value){\npathSetter(path)(obj,value);\n}\nfunction humanise(field){\nif(!field)return'';\nconst leaf=field.includes('.')?field.slice(field.lastIndexOf('.')+1):field;\nreturn leaf\n.replace(/[_-]+/g,' ')\n.replace(/([a-z0-9])([A-Z])/g,'$1 $2')\n.replace(/([A-Z]+)([A-Z][a-z])/g,'$1 $2')\n.replace(/\\s+/g,' ')\n.trim()\n.replace(/^./,(c)=>c.toUpperCase());\n}\nconst ESCAPES={'&':'&','<':'<','>':'>','\"':'"',\"'\":'''};\nfunction escapeHtml(s){\nconst str=s==null?'':String(s);\nreturn/[&<>\"']/.test(str)?str.replace(/[&<>\"']/g,(c)=>ESCAPES[c]):str;\n}\nfunction titleCase(s){\nreturn String(s).replace(/\\w\\S*/g,(t)=>t[0].toUpperCase()+t.slice(1).toLowerCase());\n}\nfunction expand(value,key,whenTrue){\nif(value===undefined)return undefined;\nif(value===true)return{enabled:true,...whenTrue};\nif(value===false)return{enabled:false};\nif(isObject(value))return value;\nreturn{[key]:value,enabled:true};\n}\nfunction toArray(v){\nif(v===undefined||v===null)return[];\nreturn Array.isArray(v)?v:[v];\n}\nfunction merge(a,b){\nif(!isObject(a))return isObject(b)?{...b}:b;\nif(!isObject(b))return b===undefined?a:b;\nconst out={...a};\nfor(const k of Object.keys(b)){\nconst bv=b[k];\nif(bv===undefined)continue;\nout[k]=isObject(bv)&&isObject(out[k])?merge(out[k],bv):bv;\n}\nreturn out;\n}\nfunction mergeRow(previous,patch){\nif(!isObject(previous)||!isObject(patch)||previous===patch)return patch;\nconst out=Object.create(Object.getPrototypeOf(previous));\nObject.assign(out,previous,patch);\nreturn out;\n}\nclass Lru{\n#max;\n#map=new Map();\n#onEvict;\nconstructor(max=256,onEvict=null){\nthis.#max=max;\nthis.#onEvict=onEvict;\n}\nget size(){\nreturn this.#map.size;\n}\nget max(){\nreturn this.#max;\n}\nset max(v){\nthis.#max=v;\nthis.#trim();\n}\nhas(k){\nreturn this.#map.has(k);\n}\nget(k){\nconst m=this.#map;\nif(!m.has(k))return undefined;\nconst v=m.get(k);\nm.delete(k);\nm.set(k,v);\nreturn v;\n}\npeek(k){\nreturn this.#map.get(k);\n}\nset(k,v){\nconst m=this.#map;\nif(m.has(k))m.delete(k);\nm.set(k,v);\nthis.#trim();\nreturn v;\n}\ndelete(k){\nconst v=this.#map.get(k);\nif(this.#map.delete(k)&&this.#onEvict)this.#onEvict(v,k);\nreturn v;\n}\nclear(){\nif(this.#onEvict)for(const[k,v]of this.#map)this.#onEvict(v,k);\nthis.#map.clear();\n}\nkeys(){\nreturn this.#map.keys();\n}\nvalues(){\nreturn this.#map.values();\n}\n#trim(){\nconst m=this.#map;\nwhile(m.size>this.#max){\nconst oldest=m.keys().next().value;\nconst v=m.get(oldest);\nm.delete(oldest);\nif(this.#onEvict)this.#onEvict(v,oldest);\n}\n}\n}\nconst collators=new Map();\nfunction collator(locale,opts){\nconst key=`${locale||''}|${opts?JSON.stringify(opts):''}`;\nlet c=collators.get(key);\nif(!c){\nc=new Intl.Collator(locale||undefined,{\nnumeric:true,sensitivity:'variant',...opts,\n});\ncollators.set(key,c);\n}\nreturn c;\n}\nfunction defaultCompare(a,b){\nif(a===b)return 0;\nif(a===null||a===undefined)return 1;\nif(b===null||b===undefined)return-1;\nif(typeof a==='number'&&typeof b==='number'){\nif(Number.isNaN(a))return Number.isNaN(b)?0:1;\nif(Number.isNaN(b))return-1;\nreturn a<b?-1:a>b?1:0;\n}\nconst sa=String(a);\nconst sb=String(b);\nreturn sa<sb?-1:sa>sb?1:0;\n}\nfunction now(){\nreturn typeof performance!=='undefined'&&performance.now\n?performance.now()\n:Date.now();\n}\nconst hasRaf=typeof requestAnimationFrame==='function';\nfunction nextFrame(fn){\nif(hasRaf)return requestAnimationFrame(fn);\nreturn setTimeout(()=>fn(now()),16);\n}\nfunction cancelFrame(handle){\nif(handle==null)return;\nif(hasRaf)cancelAnimationFrame(handle);\nelse clearTimeout(handle);\n}\nfunction frameBatched(fn){\nlet handle=null;\nlet lastArgs=null;\nconst run=()=>{\nhandle=null;\nconst a=lastArgs;\nlastArgs=null;\nfn(...(a||[]));\n};\nconst wrapped=(...args)=>{\nlastArgs=args;\nif(handle===null)handle=nextFrame(run);\n};\nwrapped.cancel=()=>{\ncancelFrame(handle);\nhandle=null;\nlastArgs=null;\n};\nwrapped.flush=()=>{\nif(handle!==null){\ncancelFrame(handle);\nrun();\n}\n};\nreturn wrapped;\n}\nfunction whenIdle(fn,timeout=50){\nif(typeof requestIdleCallback==='function'){\nreturn requestIdleCallback(fn,{timeout});\n}\nreturn setTimeout(()=>fn({timeRemaining:()=>0,didTimeout:true}),1);\n}\nlet idSeq=0;\nfunction uid(prefix='l'){\nreturn`${prefix}${(++idSeq).toString(36)}`;\n}\n});\n__def(\"packages/worker/src/transport.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"PROTOCOL\",{enumerable:true,get:function(){return PROTOCOL;}});\nObject.defineProperty(__exports,\"OPS\",{enumerable:true,get:function(){return OPS;}});\nObject.defineProperty(__exports,\"CONTROL\",{enumerable:true,get:function(){return CONTROL;}});\nObject.defineProperty(__exports,\"ERRORS\",{enumerable:true,get:function(){return ERRORS;}});\nObject.defineProperty(__exports,\"packHandle\",{enumerable:true,get:function(){return packHandle;}});\nObject.defineProperty(__exports,\"packHandles\",{enumerable:true,get:function(){return packHandles;}});\nObject.defineProperty(__exports,\"TransportedDictionary\",{enumerable:true,get:function(){return TransportedDictionary;}});\nObject.defineProperty(__exports,\"unpackHandle\",{enumerable:true,get:function(){return unpackHandle;}});\nObject.defineProperty(__exports,\"unpackHandles\",{enumerable:true,get:function(){return unpackHandles;}});\nObject.defineProperty(__exports,\"createMaskPool\",{enumerable:true,get:function(){return createMaskPool;}});\nObject.defineProperty(__exports,\"isTransferable\",{enumerable:true,get:function(){return isTransferable;}});\nObject.defineProperty(__exports,\"collectTransfers\",{enumerable:true,get:function(){return collectTransfers;}});\nObject.defineProperty(__exports,\"isPortable\",{enumerable:true,get:function(){return isPortable;}});\nObject.defineProperty(__exports,\"filterColumnIds\",{enumerable:true,get:function(){return filterColumnIds;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst collator=__m0[\"collator\"];\nconst isFunction=__m0[\"isFunction\"];\nconst PROTOCOL=1;\nconst OPS=Object.freeze({\nSORT_COLUMN:'sortColumn',\nSORT_MULTI:'sortMulti',\nEVALUATE_FILTERS:'evaluateFilters',\nCOMPACT:'compact',\nGROUP_BY_COLUMNS:'groupByColumns',\nTOTAL:'total',\nPIVOT:'pivot',\nFACET:'facet',\n});\nconst CONTROL=Object.freeze({\nREADY:'ready',\nCANCEL:'cancel',\nPING:'ping',\n});\nconst ERRORS=Object.freeze({\nNO_COMPUTE:'E_NO_COMPUTE',\nNO_KERNEL:'E_NO_KERNEL',\nABORTED:'E_ABORTED',\nKERNEL:'E_KERNEL',\nPROTOCOL:'E_PROTOCOL',\n});\nfunction packHandle(handle){\nif(handle==null)return null;\nconst presence=handle.presence;\nreturn{\nid:handle.id,\nkind:handle.kind,\nnullable:!!handle.nullable,\nvalues:handle.values??null,\npresence:presence?(presence.words??presence):null,\npresenceBits:presence?(presence.size??(presence.words??presence).length*8):0,\ndict:handle.dict?sliceDictionary(handle.dict):null,\noffsets:handle.offsets??null,\nversion:handle.version??0,\n};\n}\nfunction sliceDictionary(dict){\nif(Array.isArray(dict))return dict;\nif(isFunction(dict.values))return dict.values();\nreturn[];\n}\nfunction packHandles(handles){\nconst out=new Array(handles.length);\nfor(let i=0;i<handles.length;i++)out[i]=packHandle(handles[i]);\nreturn out;\n}\nclass TransportedBitset{\n#words;\n#bits;\nconstructor(words,bits){\nthis.#words=words;\nthis.#bits=bits;\n}\nget words(){return this.#words;}\nget size(){return this.#bits;}\nget(i){return(this.#words[i>>>3]&(1<<(i&7)))!==0;}\ncount(){\nconst w=this.#words;\nlet n=0;\nfor(let i=0;i<w.length;i++){\nlet v=w[i];\nwhile(v){v&=v-1;n++;}\n}\nreturn n;\n}\n}\nclass TransportedDictionary{\n#values;\n#index=null;\n#version=0;\n#ranks=new Map();\nconstructor(values){\nthis.#values=values||[];\n}\nget size(){return this.#values.length;}\nget version(){return this.#version;}\ncodeOf(value){\nif(this.#index===null){\nthis.#index=new Map();\nfor(let i=0;i<this.#values.length;i++)this.#index.set(this.#values[i],i);\n}\nconst found=this.#index.get(value);\nif(found!==undefined)return found;\nconst code=this.#values.length;\nthis.#values.push(value);\nthis.#index.set(value,code);\nthis.#version++;\nreturn code;\n}\nvalueOf(code){return this.#values[code];}\nvalues(){return this.#values;}\nranks(locale){\nconst key=locale||'';\nconst cached=this.#ranks.get(key);\nif(cached&&cached.version===this.#version)return cached.ranks;\nconst n=this.#values.length;\nconst order=new Uint32Array(n);\nfor(let i=0;i<n;i++)order[i]=i;\nconst cmp=collator(locale).compare;\nconst vals=this.#values;\nconst sorted=Array.from(order).sort((a,b)=>{\nconst av=vals[a];\nconst bv=vals[b];\nif(av===bv)return 0;\nif(av===null||av===undefined)return 1;\nif(bv===null||bv===undefined)return-1;\nreturn cmp(String(av),String(bv));\n});\nconst ranks=new Uint32Array(n);\nfor(let r=0;r<sorted.length;r++)ranks[sorted[r]]=r;\nthis.#ranks.set(key,{version:this.#version,ranks});\nreturn ranks;\n}\n}\nfunction unpackHandle(packed){\nif(packed==null)return null;\nconst presence=packed.presence\n?new TransportedBitset(packed.presence,packed.presenceBits||packed.presence.length*8)\n:null;\nconst dict=packed.dict?new TransportedDictionary(packed.dict):null;\nconst values=packed.values;\nconst offsets=packed.offsets??null;\nconst kind=packed.kind;\nconst get=(physical)=>{\nif(presence&&!presence.get(physical))return null;\nswitch(kind){\ncase'dictionary':\nreturn dict?dict.valueOf(values[physical]):values[physical];\ncase'bitset':\nreturn(values[physical>>>3]&(1<<(physical&7)))!==0;\ncase'multi':{\nif(!offsets)return null;\nconst from=offsets[physical];\nconst to=offsets[physical+1];\nconst out=new Array(to-from);\nfor(let i=from;i<to;i++)out[i-from]=dict?dict.valueOf(values[i]):values[i];\nreturn out;\n}\ndefault:\nreturn values[physical];\n}\n};\nreturn{\nid:packed.id,\nkind,\nnullable:packed.nullable,\nvalues,\npresence,\ndict,\noffsets,\nget,\nversion:packed.version,\n};\n}\nfunction unpackHandles(packed){\nconst out=new Array(packed.length);\nfor(let i=0;i<packed.length;i++)out[i]=unpackHandle(packed[i]);\nreturn out;\n}\nfunction createMaskPool(){\nconst masks=[];\nconst indices=[];\nreturn{\nmask(n){\nfor(let i=0;i<masks.length;i++){\nif(masks[i].length>=n){\nconst buf=masks.splice(i,1)[0].subarray(0,n);\nbuf.fill(0);\nreturn buf;\n}\n}\nreturn new Uint8Array(n);\n},\nindices(n){\nfor(let i=0;i<indices.length;i++){\nif(indices[i].length>=n)return indices.splice(i,1)[0].subarray(0,n);\n}\nreturn new Uint32Array(n);\n},\nrelease(buf){\nif(!buf)return;\nif(buf instanceof Uint8Array)masks.push(buf);\nelse if(buf instanceof Uint32Array)indices.push(buf);\n},\nclear(){masks.length=0;indices.length=0;},\n};\n}\nfunction isTransferable(v){\nif(!ArrayBuffer.isView(v))return false;\nconst buf=(v).buffer;\nif(!buf)return false;\nreturn typeof SharedArrayBuffer==='undefined'||!(buf instanceof SharedArrayBuffer);\n}\nfunction collectTransfers(value,out=[]){\nconst add=(v)=>{\nif(!isTransferable(v))return;\nconst buf=(v).buffer;\nif(!out.includes(buf))out.push(buf);\n};\nif(value==null)return out;\nif(ArrayBuffer.isView(value)){add(value);return out;}\nif(Array.isArray(value)){\nfor(const item of value)add(item);\nreturn out;\n}\nif(typeof value==='object'){\nfor(const key of Object.keys(value)){\nconst item=(value)[key];\nif(Array.isArray(item))for(const sub of item)add(sub);\nelse add(item);\n}\n}\nreturn out;\n}\nfunction isPortable(value,depth=0){\nif(value==null)return true;\nconst t=typeof value;\nif(t==='function'||t==='symbol')return false;\nif(t!=='object')return true;\nif(depth>4)return true;\nif(ArrayBuffer.isView(value)||value instanceof ArrayBuffer||value instanceof Date)return true;\nif(Array.isArray(value)){\nfor(const item of value)if(!isPortable(item,depth+1))return false;\nreturn true;\n}\nfor(const key of Object.keys(value)){\nif(!isPortable((value)[key],depth+1))return false;\n}\nreturn true;\n}\nfunction filterColumnIds(filters,out=new Set()){\nif(!filters||typeof filters!=='object')return out;\nconst node=(filters);\nif(typeof node.col==='string')out.add(node.col);\nconst conditions=node.conditions;\nif(Array.isArray(conditions))for(const child of conditions)filterColumnIds(child,out);\nreturn out;\n}\n});\n__def(\"packages/core/src/compute/handle.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"identity\",{enumerable:true,get:function(){return identity;}});\nObject.defineProperty(__exports,\"rowCount\",{enumerable:true,get:function(){return rowCount;}});\nObject.defineProperty(__exports,\"bitReader\",{enumerable:true,get:function(){return bitReader;}});\nObject.defineProperty(__exports,\"presenceReader\",{enumerable:true,get:function(){return presenceReader;}});\nObject.defineProperty(__exports,\"dictSize\",{enumerable:true,get:function(){return dictSize;}});\nObject.defineProperty(__exports,\"dictValue\",{enumerable:true,get:function(){return dictValue;}});\nObject.defineProperty(__exports,\"multiValue\",{enumerable:true,get:function(){return multiValue;}});\nObject.defineProperty(__exports,\"valueReader\",{enumerable:true,get:function(){return valueReader;}});\nObject.defineProperty(__exports,\"numericTotalOrder\",{enumerable:true,get:function(){return numericTotalOrder;}});\nObject.defineProperty(__exports,\"valueComparator\",{enumerable:true,get:function(){return valueComparator;}});\nObject.defineProperty(__exports,\"dictRanks\",{enumerable:true,get:function(){return dictRanks;}});\nObject.defineProperty(__exports,\"isMissing\",{enumerable:true,get:function(){return isMissing;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst collator=__m0[\"collator\"];\nconst defaultCompare=__m0[\"defaultCompare\"];\nconst warnOnce=__m0[\"warnOnce\"];\nfunction identity(n){\nconst out=new Uint32Array(n);\nfor(let i=0;i<n;i++)out[i]=i;\nreturn out;\n}\nfunction rowCount(handle,opts){\nif(opts&&typeof opts.count==='number')return opts.count;\nif(!handle)return 0;\nif(typeof handle.count==='number')return handle.count;\nif(typeof handle.length==='number')return handle.length;\nconst values=handle.values;\nif(handle.kind==='multi'&&handle.offsets)return Math.max(0,handle.offsets.length-1);\nif(!values)return handle.presence&&typeof handle.presence.size==='number'?handle.presence.size:0;\nif(handle.kind==='bitset'){\nif(typeof values.size==='number')return values.size;\nif(handle.presence&&typeof handle.presence.size==='number')return handle.presence.size;\nwarnOnce(`count:${handle.id}`,`column \"${handle.id}\" is bitset-backed with no declared row count; assuming ${values.length*8}`);\nreturn values.length*8;\n}\nreturn values.length;\n}\nconst bitOrders=new WeakMap();\nfunction bitOrderOf(bitset){\nconst ctor=bitset.constructor;\nif(!ctor)return'unknown';\nconst cached=bitOrders.get(ctor);\nif(cached)return cached;\nlet order='unknown';\ntry{\nlet probe=null;\nif(typeof ctor.from==='function')probe=ctor.from([false,true]);\nelse{\nprobe=new ctor(8);\nprobe.set(1);\n}\nconst words=probe&&probe.words;\nif(words&&words.length){\nif(words[0]===0x02)order='lsb';\nelse if(words[0]===0x40)order='msb';\n}\n}catch{\norder='unknown';\n}\nbitOrders.set(ctor,order);\nreturn order;\n}\nfunction bitReader(bits){\nif(!bits)return()=>0;\nconst raw=bits instanceof Uint8Array?bits:bits.words;\nif(raw instanceof Uint8Array){\nconst order=bits instanceof Uint8Array?'lsb':bitOrderOf(bits);\nif(order==='lsb')return(i)=>(raw[i>>>3]>>>(i&7))&1;\nif(order==='msb')return(i)=>(raw[i>>>3]>>>(7-(i&7)))&1;\n}\nif(typeof bits.get==='function')return(i)=>(bits.get(i)?1:0);\nreturn()=>0;\n}\nfunction presenceReader(handle){\nif(!handle||!handle.presence)return null;\nreturn bitReader(handle.presence);\n}\nfunction dictSize(dict){\nif(!dict)return 0;\nif(typeof dict.size==='number')return dict.size;\nif(typeof dict.values==='function')return dict.values().length;\nreturn 0;\n}\nfunction dictValue(dict,code){\nif(!dict)return null;\nif(typeof dict.valueOf==='function')return dict.valueOf(code);\nif(typeof dict.values==='function')return dict.values()[code];\nreturn null;\n}\nfunction multiValue(handle,i){\nconst offsets=handle.offsets;\nconst values=handle.values;\nif(!offsets||!values)return[];\nconst from=offsets[i];\nconst to=offsets[i+1];\nif(!(to>from))return[];\nconst dict=handle.dict;\nconst out=new Array(to-from);\nfor(let k=from;k<to;k++)out[k-from]=dict?dictValue(dict,values[k]):values[k];\nreturn out;\n}\nfunction valueReader(handle){\nif(!handle)return()=>undefined;\nconst values=handle.values;\nconst present=presenceReader(handle);\nconst kind=handle.kind;\nif(kind==='dictionary'){\nconst dict=handle.dict;\nif(present)return(i)=>(present(i)?dictValue(dict,values[i]):null);\nreturn(i)=>dictValue(dict,values[i]);\n}\nif(kind==='bitset'){\nconst bit=bitReader(values);\nif(present)return(i)=>(present(i)?bit(i)===1:null);\nreturn(i)=>bit(i)===1;\n}\nif(kind==='multi'){\nif(present)return(i)=>(present(i)?multiValue(handle,i):null);\nreturn(i)=>multiValue(handle,i);\n}\nif(!values&&typeof handle.get==='function'){\nconst get=handle.get.bind(handle);\nreturn(i)=>{\nconst v=get(i);\nreturn v===undefined?null:v;\n};\n}\nif(present){\nreturn(i)=>{\nif(!present(i))return null;\nconst v=values[i];\nreturn v===undefined?null:v;\n};\n}\nreturn(i)=>{\nconst v=values[i];\nreturn v===undefined?null:v;\n};\n}\nfunction numericTotalOrder(a,b){\nif(a<b)return-1;\nif(a>b)return 1;\nif(a===b){\nconst na=Object.is(a,-0);\nconst nb=Object.is(b,-0);\nif(na===nb)return 0;\nreturn na?-1:1;\n}\nconst an=Number.isNaN(a);\nconst bn=Number.isNaN(b);\nif(an&&bn)return 0;\nreturn an?1:-1;\n}\nfunction valueComparator(locale){\nconst coll=collator(locale);\nreturn(a,b)=>{\nif(a===b)return 0;\nconst ta=typeof a;\nconst tb=typeof b;\nif(ta==='string'&&tb==='string')return coll.compare(a,b);\nif(ta==='number'&&tb==='number')return numericTotalOrder(a,b);\nif(ta==='boolean'&&tb==='boolean')return a===b?0:a?1:-1;\nif(a instanceof Date||b instanceof Date){\nconst na=a instanceof Date?a.getTime():Number(a);\nconst nb=b instanceof Date?b.getTime():Number(b);\nreturn numericTotalOrder(na,nb);\n}\nreturn defaultCompare(a,b);\n};\n}\nfunction dictRanks(dict,locale){\nif(dict&&typeof dict.ranks==='function')return dict.ranks(locale);\nconst table=dict&&typeof dict.values==='function'?dict.values():[];\nconst n=table.length;\nconst cmp=valueComparator(locale);\nconst order=new Array(n);\nfor(let i=0;i<n;i++)order[i]=i;\norder.sort((a,b)=>cmp(table[a],table[b])||a-b);\nconst ranks=new Uint32Array(n);\nfor(let r=0;r<n;r++)ranks[order[r]]=r;\nreturn ranks;\n}\nfunction isMissing(v){\nreturn v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v));\n}\n});\n__def(\"packages/core/src/compute/sort.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"radixSortFloat64\",{enumerable:true,get:function(){return radixSortFloat64;}});\nObject.defineProperty(__exports,\"radixSortInt32\",{enumerable:true,get:function(){return radixSortInt32;}});\nObject.defineProperty(__exports,\"rankSortDictionary\",{enumerable:true,get:function(){return rankSortDictionary;}});\nObject.defineProperty(__exports,\"mergeSortComparator\",{enumerable:true,get:function(){return mergeSortComparator;}});\nObject.defineProperty(__exports,\"sortColumn\",{enumerable:true,get:function(){return sortColumn;}});\nObject.defineProperty(__exports,\"sortMulti\",{enumerable:true,get:function(){return sortMulti;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst bitReader=__m0[\"bitReader\"];\nconst dictRanks=__m0[\"dictRanks\"];\nconst dictSize=__m0[\"dictSize\"];\nconst identity=__m0[\"identity\"];\nconst isMissing=__m0[\"isMissing\"];\nconst presenceReader=__m0[\"presenceReader\"];\nconst rowCount=__m0[\"rowCount\"];\nconst valueComparator=__m0[\"valueComparator\"];\nconst valueReader=__m0[\"valueReader\"];\nconst EMPTY_INDICES=new Uint32Array(0);\nconst SCRATCH=new ArrayBuffer(8);\nconst SCRATCH_F64=new Float64Array(SCRATCH);\nconst SCRATCH_U32=new Uint32Array(SCRATCH);\nconst HI=(()=>{\nSCRATCH_F64[0]=-1;\nreturn(SCRATCH_U32[1]&0x80000000)!==0?1:0;\n})();\nconst LO=HI===1?0:1;\nfunction transformDouble(value,out){\nSCRATCH_F64[0]=value;\nlet hi=SCRATCH_U32[HI];\nlet lo=SCRATCH_U32[LO];\nif((hi&0x80000000)!==0){\nhi=~hi>>>0;\nlo=~lo>>>0;\n}else{\nhi=(hi^0x80000000)>>>0;\n}\nout[0]=lo;\nout[1]=hi;\n}\nfunction radixLsd64(idx,lo,hi,n){\nif(n<2)return idx;\nconst hist=new Uint32Array(256*8);\nfor(let i=0;i<n;i++){\nconst l=lo[i];\nconst h=hi[i];\nhist[l&0xff]++;\nhist[256+((l>>>8)&0xff)]++;\nhist[512+((l>>>16)&0xff)]++;\nhist[768+((l>>>24)&0xff)]++;\nhist[1024+(h&0xff)]++;\nhist[1280+((h>>>8)&0xff)]++;\nhist[1536+((h>>>16)&0xff)]++;\nhist[1792+((h>>>24)&0xff)]++;\n}\nlet srcIdx=idx;\nlet srcLo=lo;\nlet srcHi=hi;\nlet dstIdx=new Uint32Array(n);\nlet dstLo=new Uint32Array(n);\nlet dstHi=new Uint32Array(n);\nconst offset=new Uint32Array(256);\nfor(let pass=0;pass<8;pass++){\nconst base=pass<<8;\nconst shift=(pass&3)<<3;\nconst useHi=pass>=4;\nlet skip=false;\nfor(let b=0;b<256;b++){\nif(hist[base+b]===n){skip=true;break;}\n}\nif(skip)continue;\nlet sum=0;\nfor(let b=0;b<256;b++){\noffset[b]=sum;\nsum+=hist[base+b];\n}\nfor(let i=0;i<n;i++){\nconst l=srcLo[i];\nconst h=srcHi[i];\nconst digit=((useHi?h:l)>>>shift)&0xff;\nconst p=offset[digit]++;\ndstIdx[p]=srcIdx[i];\ndstLo[p]=l;\ndstHi[p]=h;\n}\nlet t=srcIdx;srcIdx=dstIdx;dstIdx=t;\nt=srcLo;srcLo=dstLo;dstLo=t;\nt=srcHi;srcHi=dstHi;dstHi=t;\n}\nreturn srcIdx;\n}\nfunction radixLsd32(idx,keys,n){\nif(n<2)return idx;\nconst hist=new Uint32Array(256*4);\nfor(let i=0;i<n;i++){\nconst k=keys[i];\nhist[k&0xff]++;\nhist[256+((k>>>8)&0xff)]++;\nhist[512+((k>>>16)&0xff)]++;\nhist[768+((k>>>24)&0xff)]++;\n}\nlet srcIdx=idx;\nlet srcKeys=keys;\nlet dstIdx=new Uint32Array(n);\nlet dstKeys=new Uint32Array(n);\nconst offset=new Uint32Array(256);\nfor(let pass=0;pass<4;pass++){\nconst base=pass<<8;\nconst shift=pass<<3;\nlet skip=false;\nfor(let b=0;b<256;b++){\nif(hist[base+b]===n){skip=true;break;}\n}\nif(skip)continue;\nlet sum=0;\nfor(let b=0;b<256;b++){\noffset[b]=sum;\nsum+=hist[base+b];\n}\nfor(let i=0;i<n;i++){\nconst k=srcKeys[i];\nconst p=offset[(k>>>shift)&0xff]++;\ndstIdx[p]=srcIdx[i];\ndstKeys[p]=k;\n}\nlet t=srcIdx;srcIdx=dstIdx;dstIdx=t;\nt=srcKeys;srcKeys=dstKeys;dstKeys=t;\n}\nreturn srcIdx;\n}\nfunction countingSort(idx,keys,n,radix){\nconst counts=new Uint32Array(radix+1);\nfor(let i=0;i<n;i++)counts[keys[i]]++;\nlet sum=0;\nfor(let k=0;k<=radix;k++){\nconst c=counts[k];\ncounts[k]=sum;\nsum+=c;\n}\nconst out=new Uint32Array(n);\nfor(let i=0;i<n;i++)out[counts[keys[i]]++]=idx[i];\nreturn out;\n}\nfunction sortUint32Keys(idx,keys,n,radix){\nif(n<2)return idx;\nif(radix<=65536||radix<=n*2)return countingSort(idx,keys,n,radix);\nreturn radixLsd32(idx,keys,n);\n}\nfunction exact(buffer,n){\nif(buffer.length===n&&buffer.byteOffset===0)return buffer;\nreturn Uint32Array.prototype.slice.call(buffer,0,n);\n}\nfunction radixSortFloat64(values,order,descending=false){\nconst src=order||identity(values.length);\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst idx=new Uint32Array(n);\nconst lo=new Uint32Array(n);\nconst hi=new Uint32Array(n);\nconst nans=new Uint32Array(n);\nconst pair=new Uint32Array(2);\nlet m=0;\nlet nanCount=0;\nfor(let i=0;i<n;i++){\nconst row=src[i];\nconst v=values[row];\nif(Number.isNaN(v)){nans[nanCount++]=row;continue;}\ntransformDouble(v,pair);\nif(descending){\nlo[m]=~pair[0]>>>0;\nhi[m]=~pair[1]>>>0;\n}else{\nlo[m]=pair[0];\nhi[m]=pair[1];\n}\nidx[m++]=row;\n}\nconst sorted=radixLsd64(idx.subarray(0,m),lo.subarray(0,m),hi.subarray(0,m),m);\nif(nanCount===0)return exact(sorted,m);\nconst out=new Uint32Array(n);\nout.set(sorted.subarray(0,m),0);\nout.set(nans.subarray(0,nanCount),m);\nreturn out;\n}\nfunction radixSortInt32(values,order,descending=false){\nconst src=order||identity(values.length);\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst idx=Uint32Array.from(src);\nconst keys=new Uint32Array(n);\nfor(let i=0;i<n;i++){\nconst k=(values[idx[i]]^0x80000000)>>>0;\nkeys[i]=descending?(~k>>>0):k;\n}\nreturn exact(radixLsd32(idx,keys,n),n);\n}\nfunction rankSortDictionary(handle,order,opts={}){\nconst src=order||identity(rowCount(handle,opts));\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst ranks=dictRanks(handle.dict,opts.locale);\nconst codes=handle.values;\nconst present=presenceReader(handle);\nconst size=Math.max(dictSize(handle.dict),ranks.length);\nconst absentRank=size;\nconst idx=Uint32Array.from(src);\nconst keys=new Uint32Array(n);\nconst descending=!!opts.descending;\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nlet rank=present&&present(row)===0?absentRank:ranks[codes[row]];\nif(rank===undefined)rank=absentRank;\nkeys[i]=descending?absentRank-rank:rank;\n}\nreturn exact(sortUint32Keys(idx,keys,n,size+1),n);\n}\nfunction mergeSortComparator(values,order,compare){\nconst n=order.length;\nlet src=Uint32Array.from(order);\nif(n<2)return src;\nlet dst=new Uint32Array(n);\nfor(let width=1;width<n;width<<=1){\nfor(let start=0;start<n;start+=width<<1){\nconst mid=Math.min(start+width,n);\nconst end=Math.min(start+(width<<1),n);\nlet i=start;\nlet j=mid;\nlet k=start;\nwhile(i<mid&&j<end){\ndst[k++]=compare(values[src[i]],values[src[j]])<=0?src[i++]:src[j++];\n}\nwhile(i<mid)dst[k++]=src[i++];\nwhile(j<end)dst[k++]=src[j++];\n}\nconst t=src;src=dst;dst=t;\n}\nreturn src;\n}\nfunction sortBitsetColumn(handle,idx,descending){\nconst bit=bitReader(handle.values);\nconst n=idx.length;\nconst out=new Uint32Array(n);\nconst first=descending?1:0;\nlet k=0;\nfor(let i=0;i<n;i++)if(bit(idx[i])===first)out[k++]=idx[i];\nfor(let i=0;i<n;i++)if(bit(idx[i])!==first)out[k++]=idx[i];\nreturn out;\n}\nfunction indexableValues(handle,idx){\nconst values=handle.values;\nconst kind=handle.kind;\nconst direct=(kind==='object'||kind===undefined)&&(Array.isArray(values)||ArrayBuffer.isView(values));\nif(direct&&!handle.presence)return values;\nconst reader=valueReader(handle);\nconst materialised=new Array(rowCount(handle)||0);\nfor(let i=0;i<idx.length;i++){\nconst row=idx[i];\nmaterialised[row]=reader(row);\n}\nreturn materialised;\n}\nfunction sortByComparator(handle,idx,opts){\nconst values=indexableValues(handle,idx);\nconst base=valueComparator(opts.locale);\nconst compare=opts.descending?(a,b)=>base(b,a):base;\nreturn mergeSortComparator(values,idx,compare);\n}\nfunction sortByCompare(handle,idx,opts){\nconst values=indexableValues(handle,idx);\nconst user=opts.compare;\nconst descending=!!opts.descending;\nconst compare=descending\n?(a,b)=>-user(a,b,undefined,undefined,true)\n:(a,b)=>user(a,b,undefined,undefined,false);\nreturn mergeSortComparator(values,idx,compare);\n}\nfunction partitionPresent(handle,idx){\nconst n=idx.length;\nconst present=presenceReader(handle);\nconst values=handle.values;\nconst checkNaN=handle.kind==='float64'&&!!values;\nconst looseKind=handle.kind==='object'||handle.kind==='multi'||handle.kind===undefined;\nif(!present&&!checkNaN&&!looseKind)return{present:idx,absent:EMPTY_INDICES};\nconst keep=new Uint32Array(n);\nconst drop=new Uint32Array(n);\nlet p=0;\nlet a=0;\nif(present&&checkNaN){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(present(row)===1&&!Number.isNaN(values[row]))keep[p++]=row;else drop[a++]=row;\n}\n}else if(checkNaN&&!present){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(!Number.isNaN(values[row]))keep[p++]=row;else drop[a++]=row;\n}\n}else if(present&&!looseKind){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(present(row)===1)keep[p++]=row;else drop[a++]=row;\n}\n}else{\nconst reader=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(!isMissing(reader(row)))keep[p++]=row;else drop[a++]=row;\n}\n}\nif(a===0)return{present:idx,absent:EMPTY_INDICES};\nreturn{present:keep.subarray(0,p),absent:drop.subarray(0,a)};\n}\nfunction joinRuns(sorted,absent,nullsFirst){\nif(absent.length===0)return sorted;\nconst out=new Uint32Array(sorted.length+absent.length);\nif(nullsFirst){\nout.set(absent,0);\nout.set(sorted,absent.length);\n}else{\nout.set(sorted,0);\nout.set(absent,sorted.length);\n}\nreturn out;\n}\nfunction sortColumn(handle,order,opts={}){\nconst src=order||identity(rowCount(handle,opts));\nif(!handle||src.length<2)return Uint32Array.from(src);\nconst{present,absent}=partitionPresent(handle,src);\nif(present.length===0)return Uint32Array.from(src);\nconst descending=!!opts.descending;\nlet sorted;\nif(typeof opts.compare==='function'){\nsorted=sortByCompare(handle,present,opts);\n}else{\nswitch(handle.kind){\ncase'float64':\nsorted=radixSortFloat64(handle.values,present,descending);\nbreak;\ncase'int32':\nsorted=radixSortInt32(handle.values,present,descending);\nbreak;\ncase'dictionary':\nsorted=rankSortDictionary(handle,present,opts);\nbreak;\ncase'bitset':\nsorted=sortBitsetColumn(handle,present,descending);\nbreak;\ndefault:\nsorted=sortByComparator(handle,present,opts);\nbreak;\n}\n}\nreturn joinRuns(sorted,absent,!!opts.nullsFirst);\n}\nfunction sortMulti(handles,entries,order,opts={}){\nconst list=entries||[];\nconst first=(list.length&&(list[0].handle||byId(handles,list[0].col)))||(handles&&handles[0]);\nlet current=order||identity(rowCount(first,opts));\nfor(let i=list.length-1;i>=0;i--){\nconst entry=list[i];\nconst handle=entry.handle||byId(handles,entry.col)||(handles&&handles[i]);\nif(!handle)continue;\ncurrent=sortColumn(handle,current,{\ndescending:entry.descending!==undefined?!!entry.descending:entry.dir==='desc',\nnullsFirst:!!entry.nullsFirst,\nlocale:entry.locale!==undefined?entry.locale:opts.locale,\ncompare:entry.compare,\n});\n}\nreturn current instanceof Uint32Array?current:Uint32Array.from(current);\n}\nfunction byId(handles,id){\nif(!handles||id===undefined)return undefined;\nfor(let i=0;i<handles.length;i++)if(handles[i]&&handles[i].id===id)return handles[i];\nreturn undefined;\n}\n});\n__def(\"packages/core/src/format/date.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"scanPattern\",{enumerable:true,get:function(){return scanPattern;}});\nObject.defineProperty(__exports,\"toDate\",{enumerable:true,get:function(){return toDate;}});\nObject.defineProperty(__exports,\"compilePattern\",{enumerable:true,get:function(){return compilePattern;}});\nObject.defineProperty(__exports,\"compileDate\",{enumerable:true,get:function(){return compileDate;}});\nObject.defineProperty(__exports,\"toIsoDate\",{enumerable:true,get:function(){return toIsoDate;}});\nObject.defineProperty(__exports,\"toIsoDateTime\",{enumerable:true,get:function(){return toIsoDateTime;}});\nObject.defineProperty(__exports,\"compareIso\",{enumerable:true,get:function(){return compareIso;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isNil=__m0[\"isNil\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst TOKENS=[\n'yyyy','yy','MMMM','MMM','MM','M','dd','d',\n'EEEE','EEE','HH','H','hh','h','mm','m','ss','s','SSS','a',\n];\nfunction scanPattern(pattern){\nconst out=[];\nlet i=0;\nlet literal='';\nconst flush=()=>{if(literal){out.push({token:null,text:literal});literal='';}};\nwhile(i<pattern.length){\nconst ch=pattern[i];\nif(ch===\"'\"){\nif(pattern[i+1]===\"'\"){literal+=\"'\";i+=2;continue;}\nconst end=pattern.indexOf(\"'\",i+1);\nif(end===-1){literal+=pattern.slice(i+1);i=pattern.length;continue;}\nliteral+=pattern.slice(i+1,end);\ni=end+1;\ncontinue;\n}\nconst token=TOKENS.find((t)=>pattern.startsWith(t,i));\nif(token){flush();out.push({token,text:token});i+=token.length;continue;}\nif(/[A-Za-z]/.test(ch)){\nwarnOnce(\n`date.pattern.token:${ch}`,\n`the date pattern \"${pattern}\" contains '${ch}', which is not a supported token, `\n+'so it is rendered as text. Quote it as a literal to silence this. '\n+`Supported: ${TOKENS.join(' ')}.`,\n);\n}\nliteral+=ch;\ni+=1;\n}\nflush();\nreturn out;\n}\nconst WALL_CLOCK=/^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2}))?(?:\\.\\d+)?)?$/;\nfunction toDate(value){\nif(isNil(value)||value==='')return null;\nif(value instanceof Date)return Number.isNaN(value.getTime())?null:value;\nif(typeof value==='number')return Number.isNaN(value)?null:new Date(value);\nif(typeof value==='string'){\nconst wall=WALL_CLOCK.exec(value.trim());\nif(wall){\nconst[,y,mo,d,h='0',mi='0',sec='0']=wall;\nreturn new Date(+y,+mo-1,+d,+h,+mi,+sec);\n}\nconst d=new Date(value);\nreturn Number.isNaN(d.getTime())?null:d;\n}\nreturn null;\n}\nfunction pad(n,w){return String(n).padStart(w,'0');}\nfunction fieldReader(timeZone){\nif(!timeZone){\nreturn(d)=>({\nyear:d.getFullYear(),month:d.getMonth()+1,day:d.getDate(),\nhour:d.getHours(),minute:d.getMinutes(),second:d.getSeconds(),\nms:d.getMilliseconds(),weekday:d.getDay(),\n});\n}\nconst zoned=new Intl.DateTimeFormat('en-US',{\ntimeZone,year:'numeric',month:'2-digit',day:'2-digit',\nhour:'2-digit',minute:'2-digit',second:'2-digit',hour12:false,weekday:'short',\n});\nconst days={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};\nreturn(d)=>{\nconst f={year:0,month:1,day:1,hour:0,minute:0,second:0,ms:d.getMilliseconds(),weekday:0};\nfor(const part of zoned.formatToParts(d)){\nswitch(part.type){\ncase'year':f.year=Number(part.value);break;\ncase'month':f.month=Number(part.value);break;\ncase'day':f.day=Number(part.value);break;\ncase'hour':f.hour=Number(part.value)%24;break;\ncase'minute':f.minute=Number(part.value);break;\ncase'second':f.second=Number(part.value);break;\ncase'weekday':f.weekday=days[part.value]??0;break;\ndefault:break;\n}\n}\nreturn f;\n};\n}\nfunction compilePattern(pattern,locale,timeZone){\nconst segments=scanPattern(pattern);\nconst read=fieldReader(timeZone);\nconst used=new Set(segments.filter((s)=>s.token).map((s)=>s.token));\nconst monthShort=used.has('MMM')?new Intl.DateTimeFormat(locale,{month:'short',timeZone}):null;\nconst monthLong=used.has('MMMM')?new Intl.DateTimeFormat(locale,{month:'long',timeZone}):null;\nconst dayShort=used.has('EEE')?new Intl.DateTimeFormat(locale,{weekday:'short',timeZone}):null;\nconst dayLong=used.has('EEEE')?new Intl.DateTimeFormat(locale,{weekday:'long',timeZone}):null;\nreturn(d)=>{\nconst f=read(d);\nlet out='';\nfor(const seg of segments){\nif(!seg.token){out+=seg.text;continue;}\nswitch(seg.token){\ncase'yyyy':out+=pad(f.year,4);break;\ncase'yy':out+=pad(f.year%100,2);break;\ncase'MMMM':out+=monthLong.format(d);break;\ncase'MMM':out+=monthShort.format(d);break;\ncase'MM':out+=pad(f.month,2);break;\ncase'M':out+=String(f.month);break;\ncase'dd':out+=pad(f.day,2);break;\ncase'd':out+=String(f.day);break;\ncase'EEEE':out+=dayLong.format(d);break;\ncase'EEE':out+=dayShort.format(d);break;\ncase'HH':out+=pad(f.hour,2);break;\ncase'H':out+=String(f.hour);break;\ncase'hh':out+=pad(f.hour%12===0?12:f.hour%12,2);break;\ncase'h':out+=String(f.hour%12===0?12:f.hour%12);break;\ncase'mm':out+=pad(f.minute,2);break;\ncase'm':out+=String(f.minute);break;\ncase'ss':out+=pad(f.second,2);break;\ncase's':out+=String(f.second);break;\ncase'SSS':out+=pad(f.ms,3);break;\ncase'a':out+=f.hour<12?'AM':'PM';break;\ndefault:out+=seg.text;break;\n}\n}\nreturn out;\n};\n}\nconst UNITS=[\n['year',365*24*3600e3],\n['month',30*24*3600e3],\n['week',7*24*3600e3],\n['day',24*3600e3],\n['hour',3600e3],\n['minute',60e3],\n['second',1e3],\n];\nfunction compileDate(spec,locale){\nconst s=spec||{};\nconst loc=s.locale||locale||undefined;\nconst nullDisplay=s.nullDisplay??'';\nconst timeZone=s.timeZone;\nlet absolute;\nif(s.pattern){\nabsolute=compilePattern(s.pattern,loc,timeZone);\n}else if(s.dateStyle||s.timeStyle){\nconst opts={timeZone};\nif(s.dateStyle)opts.dateStyle=s.dateStyle;\nif(s.timeStyle)opts.timeStyle=s.timeStyle;\nconst dtf=new Intl.DateTimeFormat(loc,opts);\nabsolute=(d)=>dtf.format(d);\n}else{\nconst dtf=new Intl.DateTimeFormat(loc,{dateStyle:'medium',timeZone});\nabsolute=(d)=>dtf.format(d);\n}\nconst relative=s.relative?new Intl.RelativeTimeFormat(loc,{numeric:'auto'}):null;\nconst thresholdDays=typeof s.relative==='object'&&s.relative\n?(s.relative.threshold??7)\n:7;\nconst thresholdMs=thresholdDays*24*3600e3;\nconst format=(value,params)=>{\nconst d=toDate(value);\nif(!d)return nullDisplay;\nif(relative){\nconst now=params&&typeof params.now==='number'?params.now:Date.now();\nconst delta=d.getTime()-now;\nif(Math.abs(delta)<thresholdMs){\nfor(const[unit,ms]of UNITS){\nif(Math.abs(delta)>=ms||unit==='second'){\nreturn relative.format(Math.round(delta/ms),unit);\n}\n}\n}\n}\nreturn absolute(d);\n};\nformat.spec=s;\nreturn format;\n}\nfunction toIsoDate(value){\nif(isNil(value)||value==='')return null;\nif(typeof value==='string'){\nconst match=/^(\\d{4}-\\d{2}-\\d{2})/.exec(value.trim());\nif(match)return match[1];\nconst parsed=toDate(value);\nreturn parsed?toIsoDate(parsed):null;\n}\nconst date=toDate(value);\nif(!date)return null;\nconst pad=(n)=>String(n).padStart(2,'0');\nreturn`${date.getFullYear()}-${pad(date.getMonth()+1)}-${pad(date.getDate())}`;\n}\nfunction toIsoDateTime(value,timeZone){\nif(isNil(value)||value==='')return null;\nif(typeof value==='string'){\nconst text=value.trim();\nif(ZONE_SUFFIX.test(text)){\nconst instant=toDate(text);\nreturn instant?wallClockIn(instant,timeZone):null;\n}\nconst match=/^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}):(\\d{2})(?::(\\d{2}))?/.exec(text);\nif(match){\nconst[,day,hour,minute,second]=match;\nreturn`${day}T${hour}:${minute}${second&&second!=='00'?`:${second}`:''}`;\n}\nif(/^\\d{4}-\\d{2}-\\d{2}$/.test(text))return`${text}T00:00`;\nconst parsed=toDate(text);\nreturn parsed?toIsoDateTime(parsed):null;\n}\nconst date=toDate(value);\nif(!date)return null;\nreturn wallClockIn(date,timeZone);\n}\nconst ZONE_SUFFIX=/(?:Z|[+-]\\d{2}:?\\d{2})$/i;\nfunction wallClockIn(date,timeZone){\nconst pad=(n)=>String(n).padStart(2,'0');\nif(timeZone){\ntry{\nconst parts=new Intl.DateTimeFormat('en-CA',{\ntimeZone,\nyear:'numeric',month:'2-digit',day:'2-digit',\nhour:'2-digit',minute:'2-digit',second:'2-digit',\nhour12:false,\n}).formatToParts(date).reduce((out,part)=>{\nif(part.type!=='literal')out[part.type]=part.value;\nreturn out;\n},{});\nconst hour=parts.hour==='24'?'00':parts.hour;\nconst seconds=Number(parts.second);\nreturn`${parts.year}-${parts.month}-${parts.day}T${hour}:${parts.minute}`\n+(seconds?`:${parts.second}`:'');\n}catch{\n}\n}\nconst day=`${date.getFullYear()}-${pad(date.getMonth()+1)}-${pad(date.getDate())}`;\nconst seconds=date.getSeconds();\nconst clock=`${pad(date.getHours())}:${pad(date.getMinutes())}${seconds?`:${pad(seconds)}`:''}`;\nreturn`${day}T${clock}`;\n}\nfunction compareIso(a,b){\nconst left=isNil(a)||a===''?null:String(a);\nconst right=isNil(b)||b===''?null:String(b);\nif(left===null)return right===null?0:1;\nif(right===null)return-1;\nreturn left<right?-1:left>right?1:0;\n}\n});\n__def(\"packages/core/src/compute/filter.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"releaseMask\",{enumerable:true,get:function(){return releaseMask;}});\nObject.defineProperty(__exports,\"compilePredicate\",{enumerable:true,get:function(){return compilePredicate;}});\nObject.defineProperty(__exports,\"testValue\",{enumerable:true,get:function(){return testValue;}});\nObject.defineProperty(__exports,\"evaluateCondition\",{enumerable:true,get:function(){return evaluateCondition;}});\nObject.defineProperty(__exports,\"evaluateFilters\",{enumerable:true,get:function(){return evaluateFilters;}});\nObject.defineProperty(__exports,\"pruneColumn\",{enumerable:true,get:function(){return pruneColumn;}});\nObject.defineProperty(__exports,\"mentionsColumn\",{enumerable:true,get:function(){return mentionsColumn;}});\nObject.defineProperty(__exports,\"compact\",{enumerable:true,get:function(){return compact;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isBlank=__m0[\"isBlank\"];\nconst toArray=__m0[\"toArray\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/format/date.js\");\nconst toIsoDate=__m1[\"toIsoDate\"];\nconst __m2=__req(\"packages/core/src/compute/handle.js\");\nconst bitReader=__m2[\"bitReader\"];\nconst dictSize=__m2[\"dictSize\"];\nconst dictValue=__m2[\"dictValue\"];\nconst presenceReader=__m2[\"presenceReader\"];\nconst valueComparator=__m2[\"valueComparator\"];\nconst valueReader=__m2[\"valueReader\"];\nconst ISO_DAY=/^\\d{4}-\\d{2}-\\d{2}$/;\nconst NULL_KEY='\\u0000null\\u0000';\nfunction acquireMask(ctx,n){\nconst pool=ctx&&ctx.pool;\nif(pool){\nconst take=pool.mask||pool.acquireMask||pool.acquire||pool.take;\nif(typeof take==='function'){\nconst mask=take.call(pool,n);\nif(mask&&mask.length>=n)return mask;\n}\n}\nreturn new Uint8Array(n);\n}\nfunction releaseMask(ctx,mask){\nconst pool=ctx&&ctx.pool;\nif(!pool||!mask)return;\nconst give=pool.release||pool.releaseMask||pool.free||pool.recycle;\nif(typeof give==='function')give.call(pool,mask);\n}\nfunction fillMask(mask,n,value){\nmask.fill(value,0,n);\nreturn mask;\n}\nfunction unorderable(v){\nreturn v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v));\n}\nfunction coerceTarget(value,type){\nif(value===null||value===undefined)return value;\nif(type==='number')return typeof value==='number'?value:Number(value);\nif(type==='date'||type==='dateString'){\nconst iso=toIsoDate(value);\nreturn iso===null?toMillis(value):iso;\n}\nif(type==='boolean'){\nif(typeof value==='boolean')return value;\nif(value==='true'||value===1)return true;\nif(value==='false'||value===0)return false;\nreturn!!value;\n}\nreturn value;\n}\nfunction toMillis(value){\nif(value instanceof Date)return value.getTime();\nif(typeof value==='number')return value;\nreturn Date.parse(String(value));\n}\nfunction toNumber(value){\nif(typeof value==='number')return value;\nif(value instanceof Date)return value.getTime();\nif(value===null||value===undefined||value==='')return NaN;\nreturn Number(value);\n}\nfunction textOf(v,caseSensitive){\nconst s=typeof v==='string'?v:String(v);\nreturn caseSensitive?s:s.toLowerCase();\n}\nfunction setKey(v,caseSensitive){\nif(v===null||v===undefined)return NULL_KEY;\nif(typeof v==='string')return caseSensitive?v:v.toLowerCase();\nif(v instanceof Date)return v.getTime();\nreturn v;\n}\nfunction buildSet(value,caseSensitive,type){\nconst set=new Set();\nfor(const raw of toArray(value)){\nconst entry=coerceTarget(raw,type);\nset.add(setKey(entry,caseSensitive));\nif(typeof entry==='string'&&entry!==''&&Number.isFinite(Number(entry)))set.add(Number(entry));\nelse if(typeof entry==='number'&&Number.isFinite(entry))set.add(setKey(String(entry),caseSensitive));\n}\nreturn set;\n}\nfunction valueEquals(a,b,caseSensitive){\nif(a===null||a===undefined||b===null||b===undefined){\nreturn(a===null||a===undefined)&&(b===null||b===undefined);\n}\nconst ta=typeof a;\nconst tb=typeof b;\nif(ta==='string'&&tb==='string')return caseSensitive?a===b:a.toLowerCase()===b.toLowerCase();\nif(a instanceof Date||b instanceof Date)return toMillis(a)===toMillis(b);\nif(ta==='number'&&tb==='number')return a===b||(Number.isNaN(a)&&Number.isNaN(b));\nif(ta==='number'&&tb==='string')return a===Number(b);\nif(ta==='string'&&tb==='number')return Number(a)===b;\nif(ta==='boolean'||tb==='boolean')return a===b;\nif(Array.isArray(a)&&Array.isArray(b)){\nreturn a.length===b.length&&a.every((x,i)=>valueEquals(x,b[i],caseSensitive));\n}\nreturn a===b;\n}\nfunction compileRegExp(value,caseSensitive){\ntry{\nif(value instanceof RegExp){\nconst flags=value.flags.replace(/[gy]/g,'');\nreturn new RegExp(value.source,caseSensitive?flags:flags.includes('i')?flags:`${flags}i`);\n}\nreturn new RegExp(String(value),caseSensitive?'':'i');\n}catch(err){\nwarnOnce(`regex:${String(value)}`,`filter operator \"matches\" received an invalid pattern: ${String(value)}`,err);\nreturn null;\n}\n}\nfunction compilePredicate(condition,locale){\nconst predicate=compileValuePredicate(condition,locale);\nconst type=condition&&condition.type;\nif(type!=='date'&&type!=='dateString')return predicate;\nreturn(v)=>predicate(typeof v==='string'&&ISO_DAY.test(v)?v:(toIsoDate(v)??v));\n}\nfunction compileValuePredicate(condition,locale){\nconst op=condition&&condition.op;\nconst caseSensitive=!!(condition&&condition.caseSensitive);\nconst type=condition&&condition.type;\nconst cmp=valueComparator(locale);\nconst not=(p)=>(v)=>!p(v);\nswitch(op){\ncase'eq':{\nconst target=coerceTarget(condition.value,type);\nreturn(v)=>valueEquals(v,target,caseSensitive);\n}\ncase'ne':{\nconst target=coerceTarget(condition.value,type);\nreturn(v)=>!valueEquals(v,target,caseSensitive);\n}\ncase'lt':case'lte':case'gt':case'gte':{\nconst target=coerceTarget(condition.value,type);\nif(unorderable(target))return()=>false;\nconst want=op==='lt'?-1:op==='lte'?0:op==='gt'?1:2;\nreturn(v)=>{\nif(unorderable(v))return false;\nconst c=cmp(v,target);\nreturn want===-1?c<0:want===0?c<=0:want===1?c>0:c>=0;\n};\n}\ncase'between':case'notBetween':{\nconst pair=toArray(condition.value);\nconst lo=coerceTarget(pair[0],type);\nconst hi=coerceTarget(pair[1],type);\nconst bounds=condition.bounds||'[]';\nconst loInclusive=bounds.charAt(0)!=='(';\nconst hiInclusive=bounds.charAt(1)!==')';\nif(unorderable(lo)||unorderable(hi))return op==='between'?()=>false:()=>true;\nconst inRange=(v)=>{\nif(unorderable(v))return false;\nconst a=cmp(v,lo);\nconst b=cmp(v,hi);\nreturn(loInclusive?a>=0:a>0)&&(hiInclusive?b<=0:b<0);\n};\nreturn op==='between'?inRange:not(inRange);\n}\ncase'in':case'notIn':{\nconst set=buildSet(condition.value,caseSensitive,type);\nconst member=(v)=>set.has(setKey(v,caseSensitive));\nreturn op==='in'?member:not(member);\n}\ncase'contains':case'notContains':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nconst has=(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).includes(needle));\nreturn op==='contains'?has:not(has);\n}\ncase'startsWith':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nreturn(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).startsWith(needle));\n}\ncase'endsWith':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nreturn(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).endsWith(needle));\n}\ncase'matches':{\nconst re=compileRegExp(condition.value,caseSensitive);\nif(!re)return()=>false;\nreturn(v)=>(v===null||v===undefined?false:re.test(String(v)));\n}\ncase'blank':\nreturn(v)=>isBlank(v)||(Array.isArray(v)&&v.length===0);\ncase'notBlank':\nreturn(v)=>!(isBlank(v)||(Array.isArray(v)&&v.length===0));\ncase'containsAny':case'containsNone':{\nconst set=buildSet(condition.value,caseSensitive,type);\nconst any=(v)=>{\nconst list=v===null||v===undefined?[]:toArray(v);\nfor(let i=0;i<list.length;i++)if(set.has(setKey(list[i],caseSensitive)))return true;\nreturn false;\n};\nreturn op==='containsAny'?any:not(any);\n}\ncase'containsAll':{\nconst wanted=toArray(condition.value).map((x)=>setKey(coerceTarget(x,type),caseSensitive));\nreturn(v)=>{\nconst list=v===null||v===undefined?[]:toArray(v);\nif(wanted.length===0)return true;\nconst have=new Set(list.map((x)=>setKey(x,caseSensitive)));\nfor(let i=0;i<wanted.length;i++)if(!have.has(wanted[i]))return false;\nreturn true;\n};\n}\ndefault:\nwarnOnce(`op:${String(op)}`,`unknown filter operator \"${String(op)}\"; the condition passes every row`);\nreturn()=>true;\n}\n}\nfunction testValue(value,condition,locale){\nreturn compilePredicate(condition,locale)(value);\n}\nfunction presenceCondition(handle,wantPresent,mask,count){\nconst present=presenceReader(handle);\nif(present){\nconst target=wantPresent?1:0;\nfor(let i=0;i<count;i++)mask[i]=present(i)===target?1:0;\nreturn mask;\n}\nconst kind=handle.kind;\nif(kind==='float64'||kind==='int32'||kind==='bitset'){\nreturn fillMask(mask,count,wantPresent?1:0);\n}\nconst read=valueReader(handle);\nfor(let i=0;i<count;i++){\nconst v=read(i);\nconst blank=isBlank(v)||(Array.isArray(v)&&v.length===0);\nmask[i]=blank===wantPresent?0:1;\n}\nreturn mask;\n}\nfunction dictionaryCondition(handle,pred,mask,count){\nconst dict=handle.dict;\nconst size=dictSize(dict);\nconst allowed=new Uint8Array(size);\nfor(let code=0;code<size;code++)allowed[code]=pred(dictValue(dict,code))?1:0;\nconst codes=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<count;i++)mask[i]=allowed[codes[i]];\nreturn mask;\n}\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++)mask[i]=present(i)===1?allowed[codes[i]]:absentAnswer;\nreturn mask;\n}\nfunction booleanCondition(handle,pred,mask,count){\nconst bit=bitReader(handle.values);\nconst whenTrue=pred(true)?1:0;\nconst whenFalse=pred(false)?1:0;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<count;i++)mask[i]=bit(i)===1?whenTrue:whenFalse;\nreturn mask;\n}\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++){\nmask[i]=present(i)===0?absentAnswer:(bit(i)===1?whenTrue:whenFalse);\n}\nreturn mask;\n}\nfunction numericCondition(handle,condition,pred,mask,count){\nconst values=handle.values;\nconst type=condition.type;\nconst op=condition.op;\nlet handled=true;\nswitch(op){\ncase'eq':case'ne':{\nconst target=toNumber(coerceTarget(condition.value,type));\nconst wantNaN=typeof condition.value==='number'&&Number.isNaN(condition.value);\nconst invert=op==='ne'?1:0;\nif(wantNaN){\nfor(let i=0;i<count;i++)mask[i]=(Number.isNaN(values[i])?1:0)^invert;\n}else{\nfor(let i=0;i<count;i++)mask[i]=((values[i]===target)?1:0)^invert;\n}\nbreak;\n}\ncase'lt':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]<t?1:0;\nbreak;\n}\ncase'lte':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]<=t?1:0;\nbreak;\n}\ncase'gt':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]>t?1:0;\nbreak;\n}\ncase'gte':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]>=t?1:0;\nbreak;\n}\ncase'between':case'notBetween':{\nconst pair=toArray(condition.value);\nconst lo=toNumber(coerceTarget(pair[0],type));\nconst hi=toNumber(coerceTarget(pair[1],type));\nconst bounds=condition.bounds||'[]';\nconst loInclusive=bounds.charAt(0)!=='(';\nconst hiInclusive=bounds.charAt(1)!==')';\nconst invert=op==='notBetween'?1:0;\nif(loInclusive&&hiInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>=lo)&(values[i]<=hi))?1:0)^invert;\n}else if(loInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>=lo)&(values[i]<hi))?1:0)^invert;\n}else if(hiInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>lo)&(values[i]<=hi))?1:0)^invert;\n}else{\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>lo)&(values[i]<hi))?1:0)^invert;\n}\nbreak;\n}\ncase'in':case'notIn':{\nconst set=new Set();\nfor(const raw of toArray(condition.value)){\nconst n=toNumber(coerceTarget(raw,type));\nif(!Number.isNaN(n))set.add(n);\n}\nconst invert=op==='notIn'?1:0;\nfor(let i=0;i<count;i++)mask[i]=(set.has(values[i])?1:0)^invert;\nbreak;\n}\ndefault:\nhandled=false;\nbreak;\n}\nif(!handled)return false;\nconst present=presenceReader(handle);\nif(present){\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++)if(present(i)===0)mask[i]=absentAnswer;\n}\nreturn true;\n}\nfunction genericCondition(handle,pred,mask,count){\nconst read=valueReader(handle);\nfor(let i=0;i<count;i++)mask[i]=pred(read(i))?1:0;\nreturn mask;\n}\nfunction evaluateCondition(condition,ctx,out){\nconst count=ctx.count|0;\nconst mask=out||acquireMask(ctx,count);\nif(!condition)return fillMask(mask,count,1);\nconst handle=typeof ctx.handle==='function'?ctx.handle(condition.col):undefined;\nconst custom=typeof ctx.custom==='function'?ctx.custom:null;\nif(!handle){\nif(custom){\nfor(let i=0;i<count;i++)mask[i]=custom(condition,i)?1:0;\nreturn mask;\n}\nwarnOnce(`filter:col:${String(condition.col)}`,\n`filter references unknown column \"${String(condition.col)}\"; the condition passes every row`);\nreturn fillMask(mask,count,1);\n}\nconst op=condition.op;\nif(op==='blank'||op==='notBlank')return presenceCondition(handle,op==='notBlank',mask,count);\nconst pred=compilePredicate(condition,ctx.locale);\nswitch(handle.kind){\ncase'dictionary':\nreturn dictionaryCondition(handle,pred,mask,count);\ncase'bitset':\nreturn booleanCondition(handle,pred,mask,count);\ncase'float64':case'int32':\nif(numericCondition(handle,condition,pred,mask,count))return mask;\nreturn genericCondition(handle,pred,mask,count);\ndefault:\nreturn genericCondition(handle,pred,mask,count);\n}\n}\nfunction evaluateNode(node,ctx,count){\nif(!node)return fillMask(acquireMask(ctx,count),count,1);\nif(Array.isArray(node.conditions)){\nconst children=node.conditions.filter((c)=>c!=null);\nconst op=node.op==='or'?'or':node.op==='not'?'not':'and';\nif(children.length===0)return fillMask(acquireMask(ctx,count),count,1);\nconst acc=evaluateNode(children[0],ctx,count);\nfor(let k=1;k<children.length;k++){\nconst rhs=evaluateNode(children[k],ctx,count);\nif(op==='or')for(let i=0;i<count;i++)acc[i]|=rhs[i];\nelse for(let i=0;i<count;i++)acc[i]&=rhs[i];\nreleaseMask(ctx,rhs);\n}\nif(op==='not')for(let i=0;i<count;i++)acc[i]^=1;\nreturn acc;\n}\nreturn evaluateCondition(node,ctx,acquireMask(ctx,count));\n}\nfunction evaluateFilters(filters,ctx){\nreturn evaluateNode(filters,ctx,ctx.count|0);\n}\nfunction pruneColumn(filters,colId){\nif(!filters||!colId)return filters||null;\nconst node=(filters);\nif(Array.isArray(node.conditions)){\nconst op=node.op==='or'?'or':node.op==='not'?'not':'and';\nif(op!=='and'){\nreturn mentionsColumn(node,colId)?null:filters;\n}\nconst kept=[];\nfor(const child of node.conditions){\nconst pruned=pruneColumn(child,colId);\nif(pruned)kept.push(pruned);\n}\nif(!kept.length)return null;\nreturn{...node,op:'and',conditions:kept};\n}\nreturn node.col===colId?null:filters;\n}\nfunction mentionsColumn(filters,colId){\nif(!filters||typeof filters!=='object')return false;\nconst node=(filters);\nif(node.col===colId)return true;\nif(Array.isArray(node.conditions)){\nfor(const child of node.conditions)if(mentionsColumn(child,colId))return true;\n}\nreturn false;\n}\nfunction compact(mask,count,out){\nif(out&&out.length>=count){\nlet k=0;\nfor(let i=0;i<count;i++)if(mask[i])out[k++]=i;\nreturn out.subarray(0,k);\n}\nlet survivors=0;\nfor(let i=0;i<count;i++)survivors+=mask[i]?1:0;\nconst result=new Uint32Array(survivors);\nlet k=0;\nfor(let i=0;i<count;i++)if(mask[i])result[k++]=i;\nreturn result;\n}\n});\n__def(\"packages/core/src/compute/group.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"packKeys\",{enumerable:true,get:function(){return packKeys;}});\nObject.defineProperty(__exports,\"groupByColumns\",{enumerable:true,get:function(){return groupByColumns;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst dictSize=__m0[\"dictSize\"];\nconst identity=__m0[\"identity\"];\nconst presenceReader=__m0[\"presenceReader\"];\nconst rowCount=__m0[\"rowCount\"];\nconst valueReader=__m0[\"valueReader\"];\nconst KEY_SEPARATOR='\\u001F';\nconst NULL_MARKER='\\u0000';\nconst MAX_DIRECT_COUNTS=1<<20;\nfunction packKeys(handles,idx,n){\nconst k=handles.length;\nconst readers=handles.map((h)=>valueReader(h));\nconst allDictionary=k>0&&handles.every((h)=>h&&h.kind==='dictionary'&&h.dict);\nif(allDictionary){\nconst cards=handles.map((h)=>dictSize(h.dict)+1);\nlet product=1;\nfor(let j=0;j<k;j++)product*=cards[j];\nif(product<=Number.MAX_SAFE_INTEGER){\nconst codes=handles.map((h)=>h.values);\nconst presence=handles.map((h)=>presenceReader(h));\nconst keyOf=(row)=>{\nlet key=0;\nfor(let j=0;j<k;j++){\nconst present=presence[j];\nconst code=present&&present(row)===0?cards[j]-1:codes[j][row];\nkey=key*cards[j]+code;\n}\nreturn key;\n};\nconst packed=new Float64Array(n);\nfor(let i=0;i<n;i++)packed[i]=keyOf(idx[i]);\nreturn{packed,strings:null,product,readers,keyOf};\n}\n}\nconst keyOf=(row)=>{\nlet key='';\nfor(let j=0;j<k;j++){\nconst v=readers[j](row);\nkey+=(j===0?'':KEY_SEPARATOR)+(v===null||v===undefined?NULL_MARKER:String(v));\n}\nreturn key;\n};\nconst strings=new Array(n);\nfor(let i=0;i<n;i++)strings[i]=keyOf(idx[i]);\nreturn{packed:null,strings,product:Infinity,readers,keyOf};\n}\nfunction scatterBuckets(idx,ids,n,groups){\nconst offsets=new Uint32Array(groups+1);\nfor(let i=0;i<n;i++)offsets[ids[i]+1]++;\nfor(let g=0;g<groups;g++)offsets[g+1]+=offsets[g];\nconst scattered=new Uint32Array(n);\nconst cursor=offsets.slice(0,groups);\nfor(let i=0;i<n;i++)scattered[cursor[ids[i]]++]=idx[i];\nconst buckets=new Array(groups);\nfor(let g=0;g<groups;g++)buckets[g]=scattered.subarray(offsets[g],offsets[g+1]);\nreturn buckets;\n}\nfunction groupByColumns(handles,order,opts={}){\nconst list=handles||[];\nconst idx=order||identity(rowCount(list[0],opts));\nconst n=idx.length;\nif(list.length===0||n===0)return{keys:[],buckets:[]};\nconst{packed,strings,product,readers}=packKeys(list,idx,n);\nconst ids=new Uint32Array(n);\nlet groups=0;\nlet packedKeys=null;\nif(packed&&product<=Math.max(1024,Math.min(MAX_DIRECT_COUNTS,n*4))){\nconst size=product;\nconst seen=new Int32Array(size).fill(-1);\nfor(let i=0;i<n;i++)seen[packed[i]]=0;\nfor(let key=0;key<size;key++)if(seen[key]===0)seen[key]=groups++;\nfor(let i=0;i<n;i++)ids[i]=seen[packed[i]];\npackedKeys=new Float64Array(groups);\nfor(let key=0;key<size;key++)if(seen[key]>=0)packedKeys[seen[key]]=key;\n}else if(packed){\nconst seen=new Map();\nfor(let i=0;i<n;i++){\nconst key=packed[i];\nlet id=seen.get(key);\nif(id===undefined){id=groups++;seen.set(key,id);}\nids[i]=id;\n}\npackedKeys=new Float64Array(groups);\nfor(const[key,id]of seen)packedKeys[id]=key;\n}else{\nconst seen=new Map();\nfor(let i=0;i<n;i++){\nconst key=strings[i];\nlet id=seen.get(key);\nif(id===undefined){id=groups++;seen.set(key,id);}\nids[i]=id;\n}\n}\nconst buckets=scatterBuckets(idx,ids,n,groups);\nconst keys=new Array(groups);\nfor(let g=0;g<groups;g++){\nconst row=buckets[g][0];\nconst tuple=new Array(readers.length);\nfor(let j=0;j<readers.length;j++)tuple[j]=readers[j](row);\nkeys[g]=tuple;\n}\nconst result={keys,buckets};\nif(packedKeys)result.packed=packedKeys;\nreturn result;\n}\n});\n__def(\"packages/core/src/compute/facet.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"STRATEGIES\",{enumerable:true,get:function(){return STRATEGIES;}});\nObject.defineProperty(__exports,\"GRANULARITIES\",{enumerable:true,get:function(){return GRANULARITIES;}});\nObject.defineProperty(__exports,\"DEFAULT_BUCKETS\",{enumerable:true,get:function(){return DEFAULT_BUCKETS;}});\nObject.defineProperty(__exports,\"DEFAULT_CARDINALITY_LIMIT\",{enumerable:true,get:function(){return DEFAULT_CARDINALITY_LIMIT;}});\nObject.defineProperty(__exports,\"QUANTILE_SAMPLE\",{enumerable:true,get:function(){return QUANTILE_SAMPLE;}});\nObject.defineProperty(__exports,\"facetKind\",{enumerable:true,get:function(){return facetKind;}});\nObject.defineProperty(__exports,\"orderedReader\",{enumerable:true,get:function(){return orderedReader;}});\nObject.defineProperty(__exports,\"toNumeric\",{enumerable:true,get:function(){return toNumeric;}});\nObject.defineProperty(__exports,\"cardinalityOf\",{enumerable:true,get:function(){return cardinalityOf;}});\nObject.defineProperty(__exports,\"pickGranularity\",{enumerable:true,get:function(){return pickGranularity;}});\nObject.defineProperty(__exports,\"floorTo\",{enumerable:true,get:function(){return floorTo;}});\nObject.defineProperty(__exports,\"advance\",{enumerable:true,get:function(){return advance;}});\nObject.defineProperty(__exports,\"computeBounds\",{enumerable:true,get:function(){return computeBounds;}});\nObject.defineProperty(__exports,\"countInto\",{enumerable:true,get:function(){return countInto;}});\nObject.defineProperty(__exports,\"bucketOf\",{enumerable:true,get:function(){return bucketOf;}});\nObject.defineProperty(__exports,\"facet\",{enumerable:true,get:function(){return facet;}});\nObject.defineProperty(__exports,\"default\",{enumerable:true,get:function(){return __default;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m0[\"presenceReader\"];\nconst valueReader=__m0[\"valueReader\"];\nconst dictSize=__m0[\"dictSize\"];\nconst dictValue=__m0[\"dictValue\"];\nconst STRATEGIES=Object.freeze(['equal','quantile','log']);\nconst GRANULARITIES=Object.freeze(['hour','day','week','month','quarter','year']);\nconst DEFAULT_BUCKETS=20;\nconst DEFAULT_CARDINALITY_LIMIT=50;\nconst QUANTILE_SAMPLE=10_000;\nfunction facetKind(handle,type){\nif(!handle)return'none';\nconst base=type&&type.base;\nif(base==='date'||base==='datetime'||base==='time'||base==='dateString')return'date';\nswitch(handle.kind){\ncase'bitset':return'boolean';\ncase'float64':case'int32':return'numeric';\ncase'dictionary':return'category';\ncase'multi':return'category';\ndefault:\nif(base==='number')return'numeric';\nif(base==='boolean')return'boolean';\nif(base==='text')return'category';\nreturn'none';\n}\n}\nfunction orderedReader(handle){\nconst values=handle.values;\nconst kind=handle.kind;\nif((kind==='float64'||kind==='int32')&&values)return(i)=>values[i];\nconst read=valueReader(handle);\nreturn(i)=>toNumeric(read(i));\n}\nfunction toNumeric(v){\nif(typeof v==='number')return v;\nif(v instanceof Date)return v.getTime();\nif(v===null||v===undefined||v==='')return NaN;\nif(typeof v==='boolean')return v?1:0;\nif(typeof v==='string'){\nconst n=Number(v);\nif(Number.isFinite(n))return n;\nconst t=Date.parse(v);\nreturn Number.isFinite(t)?t:NaN;\n}\nreturn NaN;\n}\nfunction cardinalityOf(handle,indices,count,limit=DEFAULT_CARDINALITY_LIMIT){\nif(!handle)return{cardinality:0,exact:true};\nif(handle.dict)return{cardinality:dictSize(handle.dict),exact:true};\nif(handle.kind==='bitset')return{cardinality:2,exact:true};\nconst read=valueReader(handle);\nconst n=indices?indices.length:count;\nconst seen=new Set();\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined)continue;\nseen.add(v);\nif(seen.size>limit)return{cardinality:seen.size,exact:false};\n}\nreturn{cardinality:seen.size,exact:true};\n}\nconst HOUR_MS=3600_000;\nconst DAY_MS=86_400_000;\nfunction pickGranularity(span,target=DEFAULT_BUCKETS){\nconst ms=Number.isFinite(span)&&span>0?span:0;\nconst wide=Math.max(1,target)*2;\nif(ms/HOUR_MS<=wide)return'hour';\nif(ms/DAY_MS<=wide)return'day';\nif(ms/(7*DAY_MS)<=wide)return'week';\nif(ms/(30*DAY_MS)<=wide)return'month';\nif(ms/(91*DAY_MS)<=wide)return'quarter';\nreturn'year';\n}\nfunction floorTo(ms,granularity){\nif(!Number.isFinite(ms))return NaN;\nconst d=new Date(ms);\nswitch(granularity){\ncase'hour':d.setMinutes(0,0,0);return d.getTime();\ncase'day':d.setHours(0,0,0,0);return d.getTime();\ncase'week':{\nd.setHours(0,0,0,0);\nconst back=(d.getDay()+6)%7;\nd.setDate(d.getDate()-back);\nreturn d.getTime();\n}\ncase'month':d.setDate(1);d.setHours(0,0,0,0);return d.getTime();\ncase'quarter':\nd.setMonth(Math.floor(d.getMonth()/3)*3,1);\nd.setHours(0,0,0,0);\nreturn d.getTime();\ndefault:d.setMonth(0,1);d.setHours(0,0,0,0);return d.getTime();\n}\n}\nfunction advance(ms,granularity){\nconst d=new Date(ms);\nswitch(granularity){\ncase'hour':d.setHours(d.getHours()+1);break;\ncase'day':d.setDate(d.getDate()+1);break;\ncase'week':d.setDate(d.getDate()+7);break;\ncase'month':d.setMonth(d.getMonth()+1);break;\ncase'quarter':d.setMonth(d.getMonth()+3);break;\ndefault:d.setFullYear(d.getFullYear()+1);break;\n}\nreturn d.getTime();\n}\nfunction numericExtent(handle,indices,count){\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nconst n=indices?indices.length:count;\nlet min=Infinity;\nlet max=-Infinity;\nlet nulls=0;\nlet finite=0;\nfor(let k=0;k<n;k++){\nconst i=indices?indices[k]:k;\nif(present&&!present(i)){nulls++;continue;}\nconst v=read(i);\nif(!Number.isFinite(v)){nulls++;continue;}\nif(v<min)min=v;\nif(v>max)max=v;\nfinite++;\n}\nreturn{min,max,nulls,finite};\n}\nfunction sortedSample(handle,indices,count,cap){\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nconst n=indices?indices.length:count;\nconst step=n>cap?n/cap:1;\nconst out=[];\nfor(let s=0;s<n;s+=step){\nconst i=indices?indices[Math.floor(s)]:Math.floor(s);\nif(present&&!present(i))continue;\nconst v=read(i);\nif(Number.isFinite(v))out.push(v);\n}\nconst arr=Float64Array.from(out);\narr.sort();\nreturn arr;\n}\nfunction computeBounds(handle,indices,count,opts={}){\nconst kind=opts.kind||facetKind(handle,opts.type);\nif(kind==='none'||!handle)return{kind:'none',buckets:[],suppressed:'type'};\nif(kind==='boolean')return boundsForBoolean(handle,indices,count);\nif(kind==='category')return boundsForCategory(handle,indices,count,opts);\nreturn boundsForOrdered(handle,indices,count,kind,opts);\n}\nfunction boundsForBoolean(handle,indices,count){\nconst present=presenceReader(handle);\nlet nulls=0;\nif(present){\nconst n=indices?indices.length:count;\nfor(let k=0;k<n;k++)if(!present(indices?indices[k]:k))nulls++;\n}\nconst buckets=[{value:false,label:'false'},{value:true,label:'true'}];\nif(nulls>0)buckets.push({null:true,label:'Empty'});\nreturn{kind:'boolean',buckets};\n}\nfunction boundsForCategory(handle,indices,count,opts){\nconst limit=opts.cardinalityLimit??DEFAULT_CARDINALITY_LIMIT;\nconst{cardinality}=cardinalityOf(handle,indices,count,limit);\nif(cardinality>limit&&(opts.aboveLimit||'suppress')==='suppress'){\nreturn{kind:'category',buckets:[],suppressed:'cardinality',cardinality};\n}\nconst read=valueReader(handle);\nconst n=indices?indices.length:count;\nconst tally=new Map();\nlet nulls=0;\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined||v===''){nulls++;continue;}\nif(Array.isArray(v)){\nif(!v.length){nulls++;continue;}\nfor(const m of v)tally.set(m,(tally.get(m)||0)+1);\ncontinue;\n}\ntally.set(v,(tally.get(v)||0)+1);\n}\nlet entries=[...tally.entries()];\nif(opts.order==='alpha'){\nentries.sort((a,b)=>String(a[0]).localeCompare(String(b[0])));\n}else{\nentries.sort((a,b)=>b[1]-a[1]);\n}\nlet remainder=0;\nlet dropped=0;\nif(entries.length>limit){\ndropped=entries.length-limit;\nfor(let i=limit;i<entries.length;i++)remainder+=entries[i][1];\nentries=entries.slice(0,limit);\n}\nconst buckets=entries.map(([value])=>({value,label:String(value)}));\nif(remainder>0)buckets.push({remainder:true,label:`Other (${dropped} values)`});\nif(nulls>0)buckets.push({null:true,label:'Empty'});\nreturn{kind:'category',buckets,cardinality};\n}\nfunction boundsForOrdered(handle,indices,count,kind,opts){\nconst{min,max,nulls,finite}=numericExtent(handle,indices,count);\nif(!finite){\nreturn{kind,buckets:nulls?[{null:true,label:'Empty'}]:[],empty:true};\n}\nconst wanted=Math.max(1,Math.floor(opts.buckets||DEFAULT_BUCKETS));\nlet buckets=[];\nif(kind==='date'){\nconst granularity=GRANULARITIES.includes(opts.granularity)\n?opts.granularity:pickGranularity(max-min,wanted);\nlet edge=floorTo(min,granularity);\nwhile(edge<=max&&buckets.length<4096){\nconst next=advance(edge,granularity);\nif(!(next>edge))break;\nbuckets.push({from:edge,to:next});\nedge=next;\n}\nreturn{kind,buckets:withNull(buckets,nulls),granularity};\n}\nconst strategy=STRATEGIES.includes(opts.strategy)?opts.strategy:'equal';\nif(strategy==='quantile'){\nconst sample=sortedSample(handle,indices,count,QUANTILE_SAMPLE);\nif(sample.length){\nconst edges=[sample[0]];\nfor(let b=1;b<wanted;b++){\nconst v=sample[Math.min(sample.length-1,Math.floor((b/wanted)*sample.length))];\nif(v>edges[edges.length-1])edges.push(v);\n}\nedges.push(max);\nfor(let b=0;b<edges.length-1;b++)buckets.push({from:edges[b],to:edges[b+1]});\n}\n}else if(strategy==='log'&&min>0){\nconst lo=Math.log10(min);\nconst hi=Math.log10(max);\nconst step=(hi-lo)/wanted||1;\nfor(let b=0;b<wanted;b++){\nbuckets.push({from:10**(lo+b*step),to:10**(lo+(b+1)*step)});\n}\n}\nif(!buckets.length){\nconst width=(max-min)/wanted||1;\nfor(let b=0;b<wanted;b++)buckets.push({from:min+b*width,to:min+(b+1)*width});\n}\nbuckets[buckets.length-1].to=max;\nreturn{kind,buckets:withNull(buckets,nulls),strategy,min,max};\n}\nfunction withNull(buckets,nulls){\nreturn nulls>0?[...buckets,{null:true,label:'Empty'}]:buckets;\n}\nfunction countInto(handle,indices,count,bounds,out){\nconst buckets=(bounds&&bounds.buckets)||[];\nconst counts=out&&out.length>=buckets.length?out.subarray(0,buckets.length)\n:new Uint32Array(buckets.length);\ncounts.fill(0);\nif(!handle||!buckets.length)return counts;\nconst nullBucket=buckets.length-1;\nconst hasNull=!!buckets[nullBucket]&&buckets[nullBucket].null===true;\nconst n=indices?indices.length:count;\nif(bounds.kind==='boolean'){\nconst read=valueReader(handle);\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined){if(hasNull)counts[nullBucket]++;continue;}\ncounts[v?1:0]++;\n}\nreturn counts;\n}\nif(bounds.kind==='category'){\nconst slot=new Map();\nfor(let b=0;b<buckets.length;b++){\nif(!buckets[b].null&&!buckets[b].remainder)slot.set(buckets[b].value,b);\n}\nconst remainderAt=buckets.findIndex((b)=>b.remainder);\nconst read=valueReader(handle);\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined||v===''){if(hasNull)counts[nullBucket]++;continue;}\nif(Array.isArray(v)){\nif(!v.length){if(hasNull)counts[nullBucket]++;continue;}\nfor(const m of v){\nconst at=slot.get(m);\nif(at!==undefined)counts[at]++;\nelse if(remainderAt>=0)counts[remainderAt]++;\n}\ncontinue;\n}\nconst at=slot.get(v);\nif(at!==undefined)counts[at]++;\nelse if(remainderAt>=0)counts[remainderAt]++;\n}\nreturn counts;\n}\nconst ordered=hasNull?buckets.length-1:buckets.length;\nconst edges=new Float64Array(ordered+1);\nfor(let b=0;b<ordered;b++)edges[b]=buckets[b].from;\nedges[ordered]=ordered?buckets[ordered-1].to:0;\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nfor(let k=0;k<n;k++){\nconst i=indices?indices[k]:k;\nif(present&&!present(i)){if(hasNull)counts[nullBucket]++;continue;}\nconst v=read(i);\nif(!Number.isFinite(v)){if(hasNull)counts[nullBucket]++;continue;}\nconst at=bucketOf(edges,ordered,v);\nif(at>=0)counts[at]++;\n}\nreturn counts;\n}\nfunction bucketOf(edges,ordered,v){\nif(!ordered)return-1;\nif(v<edges[0])return-1;\nif(v>=edges[ordered])return v===edges[ordered]?ordered-1:-1;\nlet lo=0;\nlet hi=ordered-1;\nwhile(lo<hi){\nconst mid=(lo+hi+1)>>>1;\nif(v>=edges[mid])lo=mid;else hi=mid-1;\n}\nreturn lo;\n}\nfunction facet(handle,indices,count,opts={}){\nconst bounds=opts.bounds||computeBounds(handle,opts.boundsIndices??indices,count,opts);\nreturn{bounds,counts:countInto(handle,indices,count,bounds)};\n}\nconst __default=facet;\n});\n__def(\"packages/core/src/compute/statistics.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"MAINTENANCE\",{enumerable:true,get:function(){return MAINTENANCE;}});\nObject.defineProperty(__exports,\"numbers\",{enumerable:true,get:function(){return numbers;}});\nObject.defineProperty(__exports,\"moments\",{enumerable:true,get:function(){return moments;}});\nObject.defineProperty(__exports,\"quantileSorted\",{enumerable:true,get:function(){return quantileSorted;}});\nObject.defineProperty(__exports,\"quantile\",{enumerable:true,get:function(){return quantile;}});\nObject.defineProperty(__exports,\"STAT_FNS\",{enumerable:true,get:function(){return STAT_FNS;}});\nObject.defineProperty(__exports,\"STAT_LABELS\",{enumerable:true,get:function(){return STAT_LABELS;}});\nObject.defineProperty(__exports,\"weightedAverage\",{enumerable:true,get:function(){return weightedAverage;}});\nObject.defineProperty(__exports,\"extremeRow\",{enumerable:true,get:function(){return extremeRow;}});\nObject.defineProperty(__exports,\"correlation\",{enumerable:true,get:function(){return correlation;}});\nObject.defineProperty(__exports,\"countOutside\",{enumerable:true,get:function(){return countOutside;}});\nObject.defineProperty(__exports,\"histogram\",{enumerable:true,get:function(){return histogram;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m0[\"presenceReader\"];\nconst valueReader=__m0[\"valueReader\"];\nconst MAINTENANCE=Object.freeze({\nvariance:'maintained',\nvarianceP:'maintained',\nstddev:'maintained',\nstddevP:'maintained',\nsumSquares:'maintained',\nweightedAvg:'maintained',\nmedian:'rescan',\np25:'rescan',\np75:'rescan',\np90:'rescan',\np95:'rescan',\np99:'rescan',\niqr:'rescan',\nmode:'rescan',\ndistinct:'rescan',\nrange:'rescan',\nskewness:'rescan',\nkurtosis:'rescan',\ngeomean:'rescan',\nharmean:'rescan',\nmad:'rescan',\nargmin:'rescan',\nargmax:'rescan',\n});\nfunction numbers(handle,indices){\nconst n=indices.length;\nconst out=new Float64Array(n);\nlet count=0;\nconst numeric=handle&&(handle.kind==='float64'||handle.kind==='int32');\nif(numeric){\nconst values=handle.values;\nconst present=presenceReader(handle);\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present&&present(row)!==1)continue;\nconst v=values[row];\nif(Number.isNaN(v))continue;\nout[count++]=v;\n}\nreturn out.subarray(0,count);\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst raw=read(indices[i]);\nif(raw===null||raw===undefined||raw==='')continue;\nconst v=typeof raw==='number'?raw:Number(raw);\nif(!Number.isFinite(v))continue;\nout[count++]=v;\n}\nreturn out.subarray(0,count);\n}\nfunction moments(values){\nlet n=0;\nlet mean=0;\nlet m2=0;\nfor(let i=0;i<values.length;i++){\nconst x=values[i];\nn++;\nconst delta=x-mean;\nmean+=delta/n;\nm2+=delta*(x-mean);\n}\nreturn{n,mean,m2};\n}\nfunction quantileSorted(sorted,p){\nconst n=sorted.length;\nif(!n)return NaN;\nif(n===1)return sorted[0];\nconst h=(n-1)*Math.min(1,Math.max(0,p));\nconst lo=Math.floor(h);\nconst hi=Math.ceil(h);\nif(lo===hi)return sorted[lo];\nreturn sorted[lo]+(h-lo)*(sorted[hi]-sorted[lo]);\n}\nfunction quantile(values,p){\nif(!values.length)return NaN;\nconst sorted=values.slice().sort();\nreturn quantileSorted(sorted,p);\n}\nconst STAT_FNS=Object.freeze({\nvariance:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>1?m2/(n-1):null;\n},\nvarianceP:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>0?m2/n:null;\n},\nstddev:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>1?Math.sqrt(m2/(n-1)):null;\n},\nstddevP:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>0?Math.sqrt(m2/n):null;\n},\nmedian:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.5):null;\n},\np25:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.25):null;\n},\np75:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.75):null;\n},\np90:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.9):null;\n},\np95:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.95):null;\n},\np99:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.99):null;\n},\niqr:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nconst sorted=values.slice().sort();\nreturn quantileSorted(sorted,0.75)-quantileSorted(sorted,0.25);\n},\nmad:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nconst middle=quantile(values,0.5);\nconst deviations=new Float64Array(values.length);\nfor(let k=0;k<values.length;k++)deviations[k]=Math.abs(values[k]-middle);\nreturn quantile(deviations,0.5);\n},\nrange:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet lo=Infinity;\nlet hi=-Infinity;\nfor(let k=0;k<values.length;k++){\nif(values[k]<lo)lo=values[k];\nif(values[k]>hi)hi=values[k];\n}\nreturn hi-lo;\n},\ndistinct:(h,i)=>{\nconst read=valueReader(h);\nconst seen=new Set();\nfor(let k=0;k<i.length;k++){\nconst v=read(i[k]);\nif(v===null||v===undefined||v==='')continue;\nseen.add(v instanceof Date?v.getTime():v);\n}\nreturn seen.size;\n},\nmode:(h,i)=>{\nconst read=valueReader(h);\nconst counts=new Map();\nfor(let k=0;k<i.length;k++){\nconst v=read(i[k]);\nif(v===null||v===undefined||v==='')continue;\nconst id=v instanceof Date?v.getTime():v;\ncounts.set(id,(counts.get(id)||0)+1);\n}\nlet best=null;\nlet most=1;\nfor(const[value,times]of counts){\nif(times>most){\nmost=times;\nbest=value;\n}\n}\nreturn best;\n},\nskewness:(h,i)=>{\nconst values=numbers(h,i);\nconst{n,mean,m2}=moments(values);\nif(n<3||m2<=0)return null;\nconst sd=Math.sqrt(m2/(n-1));\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=((values[k]-mean)/sd)**3;\nreturn(n/((n-1)*(n-2)))*sum;\n},\nkurtosis:(h,i)=>{\nconst values=numbers(h,i);\nconst{n,mean,m2}=moments(values);\nif(n<4||m2<=0)return null;\nconst sd=Math.sqrt(m2/(n-1));\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=((values[k]-mean)/sd)**4;\nconst a=(n*(n+1))/((n-1)*(n-2)*(n-3));\nconst b=(3*(n-1)**2)/((n-2)*(n-3));\nreturn a*sum-b;\n},\ngeomean:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet sum=0;\nfor(let k=0;k<values.length;k++){\nif(values[k]<=0)return null;\nsum+=Math.log(values[k]);\n}\nreturn Math.exp(sum/values.length);\n},\nharmean:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet sum=0;\nfor(let k=0;k<values.length;k++){\nif(values[k]===0)return null;\nsum+=1/values[k];\n}\nreturn values.length/sum;\n},\nsumSquares:(h,i)=>{\nconst values=numbers(h,i);\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=values[k]*values[k];\nreturn sum;\n},\n});\nconst STAT_LABELS=Object.freeze({\nmedian:'Median',\np25:'25th percentile',\np75:'75th percentile',\np90:'90th percentile',\np95:'95th percentile',\np99:'99th percentile',\niqr:'Interquartile range',\nmad:'Median absolute deviation',\nvariance:'Variance',\nvarianceP:'Variance (population)',\nstddev:'Standard deviation',\nstddevP:'Standard deviation (population)',\nrange:'Range',\ndistinct:'Distinct',\nmode:'Mode',\nskewness:'Skewness',\nkurtosis:'Kurtosis',\ngeomean:'Geometric mean',\nharmean:'Harmonic mean',\nsumSquares:'Sum of squares',\nweightedAvg:'Weighted average',\nargmin:'Lowest by',\nargmax:'Highest by',\n});\nfunction weightedAverage(handle,weights,indices){\nconst readValue=valueReader(handle);\nconst readWeight=valueReader(weights);\nlet top=0;\nlet bottom=0;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst value=Number(readValue(row));\nconst weight=Number(readWeight(row));\nif(!Number.isFinite(value)||!Number.isFinite(weight))continue;\ntop+=value*weight;\nbottom+=weight;\n}\nreturn bottom===0?null:top/bottom;\n}\nfunction extremeRow(handle,indices,largest){\nconst read=valueReader(handle);\nlet best=null;\nlet bestValue=largest?-Infinity:Infinity;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst value=Number(read(row));\nif(!Number.isFinite(value))continue;\nif(largest?value>bestValue:value<bestValue){\nbestValue=value;\nbest=row;\n}\n}\nreturn best;\n}\nfunction correlation(a,b,indices){\nconst readA=valueReader(a);\nconst readB=valueReader(b);\nlet n=0;\nlet sx=0;\nlet sy=0;\nlet sxx=0;\nlet syy=0;\nlet sxy=0;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst x=Number(readA(row));\nconst y=Number(readB(row));\nif(!Number.isFinite(x)||!Number.isFinite(y))continue;\nn++;\nsx+=x;\nsy+=y;\nsxx+=x*x;\nsyy+=y*y;\nsxy+=x*y;\n}\nif(n<2)return null;\nconst top=n*sxy-sx*sy;\nconst bottom=Math.sqrt((n*sxx-sx*sx)*(n*syy-sy*sy));\nif(bottom===0)return null;\nconst r=top/bottom;\nreturn Math.max(-1,Math.min(1,r));\n}\nfunction countOutside(values,low,high){\nlet count=0;\nfor(let i=0;i<values.length;i++){\nif(values[i]<low||values[i]>high)count++;\n}\nreturn count;\n}\nfunction histogram(sorted,q1,q3,cap=20){\nconst n=sorted.length;\nif(!n)return[];\nconst min=sorted[0];\nconst max=sorted[n-1];\nif(max===min)return[{from:min,to:max,count:n}];\nconst iqr=q3-q1;\nconst fence=1.5*iqr;\nlet lo=iqr>0?Math.max(min,q1-fence):min;\nlet hi=iqr>0?Math.min(max,q3+fence):max;\nif(!(hi>lo)){lo=min;hi=max;}\nconst width=iqr>0?(2*iqr)/Math.cbrt(n):(hi-lo)/(Math.ceil(Math.log2(n))+1);\nconst count=width>0\n?Math.min(cap,Math.max(1,Math.ceil((hi-lo)/width)))\n:1;\nconst step=(hi-lo)/count;\nconst bins=[];\nfor(let i=0;i<count;i++){\nbins.push({from:lo+i*step,to:lo+(i+1)*step,count:0});\n}\nfor(let i=0;i<n;i++){\nconst at=Math.min(count-1,Math.max(0,Math.floor((sorted[i]-lo)/step)));\nbins[at].count++;\n}\nbins[0].from=min;\nbins[count-1].to=max;\nreturn bins;\n}\n});\n__def(\"packages/core/src/compute/total.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"TOTAL_FNS\",{enumerable:true,get:function(){return TOTAL_FNS;}});\nObject.defineProperty(__exports,\"TOTAL_LABELS\",{enumerable:true,get:function(){return TOTAL_LABELS;}});\nObject.defineProperty(__exports,\"totalLabel\",{enumerable:true,get:function(){return totalLabel;}});\nObject.defineProperty(__exports,\"collectValues\",{enumerable:true,get:function(){return collectValues;}});\nObject.defineProperty(__exports,\"total\",{enumerable:true,get:function(){return total;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isFunction=__m0[\"isFunction\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m1[\"presenceReader\"];\nconst valueComparator=__m1[\"valueComparator\"];\nconst valueReader=__m1[\"valueReader\"];\nconst __m2=__req(\"packages/core/src/compute/statistics.js\");\nconst STAT_FNS=__m2[\"STAT_FNS\"];\nconst STAT_LABELS=__m2[\"STAT_LABELS\"];\nfunction isNumericBacking(handle){\nreturn!!handle&&(handle.kind==='float64'||handle.kind==='int32');\n}\nfunction sum(handle,indices){\nconst n=indices.length;\nlet acc=0;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<n;i++){\nconst v=values[indices[i]];\nif(!Number.isNaN(v))acc+=v;\n}\nreturn acc;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===1){\nconst v=values[row];\nif(!Number.isNaN(v))acc+=v;\n}\n}\nreturn acc;\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst v=numberOf(read(indices[i]));\nif(v!==null)acc+=v;\n}\nreturn acc;\n}\nsum.kernel=true;\nfunction countValues(handle,indices){\nconst n=indices.length;\nlet count=0;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<n;i++)if(!Number.isNaN(values[indices[i]]))count++;\nreturn count;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===1&&!Number.isNaN(values[row]))count++;\n}\nreturn count;\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst v=read(indices[i]);\nif(v!==null&&v!==undefined&&!(typeof v==='number'&&Number.isNaN(v)))count++;\n}\nreturn count;\n}\ncountValues.kernel=true;\nfunction count(handle,indices){\nreturn indices.length;\n}\ncount.kernel=true;\nfunction avg(handle,indices){\nconst values=countValues(handle,indices);\nif(values===0)return null;\nreturn sum(handle,indices)/values;\n}\navg.kernel=true;\nfunction extreme(handle,indices,direction,locale){\nconst n=indices.length;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nlet best=null;\nif(!present){\nfor(let i=0;i<n;i++){\nconst v=values[indices[i]];\nif(Number.isNaN(v))continue;\nif(best===null||(direction<0?v<best:v>best))best=v;\n}\nreturn best;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===0)continue;\nconst v=values[row];\nif(Number.isNaN(v))continue;\nif(best===null||(direction<0?v<best:v>best))best=v;\n}\nreturn best;\n}\nconst read=valueReader(handle);\nconst cmp=valueComparator(locale);\nlet best=null;\nfor(let i=0;i<n;i++){\nconst v=read(indices[i]);\nif(v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v)))continue;\nif(best===null||(direction<0?cmp(v,best)<0:cmp(v,best)>0))best=v;\n}\nreturn best;\n}\nfunction min(handle,indices,ctx){\nreturn extreme(handle,indices,-1,ctx&&ctx.locale);\n}\nmin.kernel=true;\nfunction max(handle,indices,ctx){\nreturn extreme(handle,indices,1,ctx&&ctx.locale);\n}\nmax.kernel=true;\nfunction first(handle,indices){\nif(indices.length===0)return null;\nreturn valueReader(handle)(indices[0]);\n}\nfirst.kernel=true;\nfunction last(handle,indices){\nif(indices.length===0)return null;\nreturn valueReader(handle)(indices[indices.length-1]);\n}\nlast.kernel=true;\nfunction numberOf(v){\nif(typeof v==='number')return Number.isNaN(v)?null:v;\nif(v===null||v===undefined||v===''||typeof v==='boolean')return null;\nif(v instanceof Date)return v.getTime();\nconst n=Number(v);\nreturn Number.isNaN(n)?null:n;\n}\nconst TOTAL_FNS={\nsum,min,max,avg,count,first,last,countValues,\n...STAT_FNS,\n};\nconst TOTAL_LABELS=Object.freeze({\n...STAT_LABELS,\nsum:'Sum',\navg:'Average',\nmin:'Min',\nmax:'Max',\ncount:'Count',\ncountValues:'Count of values',\nfirst:'First',\nlast:'Last',\n});\nfunction totalLabel(fn){\nif(!fn)return'';\nif(typeof fn==='string')return TOTAL_LABELS[fn]||fn;\nreturn'Total';\n}\nfunction collectValues(handle,indices){\nconst read=valueReader(handle);\nconst out=[];\nfor(let i=0;i<indices.length;i++){\nconst v=read(indices[i]);\nif(v===null||v===undefined)continue;\nout.push(v);\n}\nreturn out;\n}\nfunction total(handle,indices,fn,ctx){\nconst list=indices||[];\nif(typeof fn==='string'){\nconst kernel=TOTAL_FNS[fn];\nif(!kernel){\nwarnOnce(`total:${fn}`,`unknown total function \"${fn}\"; register it in config.totalFns`);\nreturn null;\n}\nreturn kernel(handle,list,ctx);\n}\nif(isFunction(fn)){\nif(fn.kernel===true)return fn(handle,list,ctx);\nreturn fn(collectValues(handle,list),ctx||{});\n}\nreturn null;\n}\n});\n__def(\"packages/core/src/compute/pivot.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"KEY_DELIMITER\",{enumerable:true,get:function(){return KEY_DELIMITER;}});\nObject.defineProperty(__exports,\"DEFAULT_PATH_SEPARATOR\",{enumerable:true,get:function(){return DEFAULT_PATH_SEPARATOR;}});\nObject.defineProperty(__exports,\"DEFAULT_MAX_COLUMNS\",{enumerable:true,get:function(){return DEFAULT_MAX_COLUMNS;}});\nObject.defineProperty(__exports,\"pivotKey\",{enumerable:true,get:function(){return pivotKey;}});\nObject.defineProperty(__exports,\"joinPath\",{enumerable:true,get:function(){return joinPath;}});\nObject.defineProperty(__exports,\"resolvePivotKeys\",{enumerable:true,get:function(){return resolvePivotKeys;}});\nObject.defineProperty(__exports,\"pivot\",{enumerable:true,get:function(){return pivot;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst valueComparator=__m1[\"valueComparator\"];\nconst __m2=__req(\"packages/core/src/compute/group.js\");\nconst packKeys=__m2[\"packKeys\"];\nconst __m3=__req(\"packages/core/src/compute/total.js\");\nconst total=__m3[\"total\"];\nconst KEY_DELIMITER='|';\nconst DEFAULT_PATH_SEPARATOR='/';\nconst DEFAULT_MAX_COLUMNS=2000;\nfunction pivotKey(groupPath,pivotPath,colId){\nreturn`${groupPath}${KEY_DELIMITER}${pivotPath}${KEY_DELIMITER}${colId}`;\n}\nfunction joinPath(parts,separator){\nlet out='';\nfor(let i=0;i<parts.length;i++){\nconst v=parts[i];\nout+=(i===0?'':separator)+(v===null||v===undefined?'':String(v));\n}\nreturn out;\n}\nfunction resolvePivotKeys(handles,order,opts={}){\nconst separator=opts.separator||DEFAULT_PATH_SEPARATOR;\nconst n=order.length;\nconst{keyOf,readers}=packKeys(handles,order,0);\nconst seen=new Map();\nconst tuples=[];\nconst rawKeys=[];\nfor(let i=0;i<n;i++){\nconst row=order[i];\nconst key=keyOf(row);\nif(seen.has(key))continue;\nseen.set(key,tuples.length);\nrawKeys.push(key);\nconst tuple=new Array(readers.length);\nfor(let j=0;j<readers.length;j++)tuple[j]=readers[j](row);\ntuples.push(tuple);\n}\nconst cmp=valueComparator(opts.locale);\nconst rank=tuples.map((_,i)=>i);\nrank.sort((a,b)=>{\nconst ta=tuples[a];\nconst tb=tuples[b];\nfor(let j=0;j<ta.length;j++){\nconst c=compareNullable(ta[j],tb[j],cmp);\nif(c!==0)return c;\n}\nreturn a-b;\n});\nconst keys=new Array(rank.length);\nconst paths=new Array(rank.length);\nconst idByKey=new Map();\nfor(let position=0;position<rank.length;position++){\nconst from=rank[position];\nkeys[position]=tuples[from];\npaths[position]=joinPath(tuples[from],separator);\nidByKey.set(rawKeys[from],position);\n}\nconst idOf=(row)=>{\nconst id=idByKey.get(keyOf(row));\nreturn id===undefined?-1:id;\n};\nreturn{keys,paths,idOf};\n}\nfunction compareNullable(a,b,cmp){\nconst na=a===null||a===undefined;\nconst nb=b===null||b===undefined;\nif(na||nb)return na&&nb?0:na?1:-1;\nreturn cmp(a,b);\n}\nfunction resolveValueColumns(opts){\nconst declared=opts.values||opts.totals||[];\nif(declared.length&&typeof declared[0]==='object'&&declared[0]!==null){\nreturn declared.filter((entry)=>entry&&entry.handle);\n}\nconst resolve=typeof opts.handle==='function'?opts.handle:null;\nif(!resolve){\nif(declared.length){\nwarnOnce('pivot:handles',\n'pivot was given total column ids but no handle(colId) resolver, so no cell values were reduced. Pass values: [{ colId, handle, fn }] or opts.handle.');\n}\nreturn[];\n}\nconst totalOf=typeof opts.totalOf==='function'?opts.totalOf:null;\nconst out=[];\nfor(const colId of declared){\nconst handle=resolve(colId);\nif(!handle)continue;\nout.push({colId,handle,fn:totalOf?totalOf(colId):'sum'});\n}\nreturn out;\n}\nfunction normaliseArgs(a,b,c){\nif(Array.isArray(a)){\nconst opts=c||{};\nreturn{...opts,pivotHandles:a,order:b||null,groups:opts.groups||null};\n}\nreturn a||{};\n}\nfunction pivot(input,orderArg,optsArg){\nconst opts=normaliseArgs(input,orderArg,optsArg);\nconst separator=opts.separator||DEFAULT_PATH_SEPARATOR;\nconst valueColumns=resolveValueColumns(opts);\nconst maxColumns=opts.maxColumns===undefined?DEFAULT_MAX_COLUMNS:opts.maxColumns;\nconst groups=opts.groups&&opts.groups.buckets?opts.groups:null;\nconst buckets=groups?groups.buckets:[opts.order||new Uint32Array(0)];\nconst groupPaths=opts.groupPaths\n||(groups?groups.keys.map((tuple)=>joinPath(tuple,separator)):['']);\nconst scope=concatIndices(buckets);\nconst{keys,paths,idOf}=resolvePivotKeys(opts.pivotHandles||[],scope,opts);\nconst columns=paths.length*Math.max(1,valueColumns.length);\nconst fields=derivedFields(paths,valueColumns,separator);\nif(maxColumns&&columns>maxColumns){\nconst empty=new Map();\nreturn{\nkeys,\npaths,\nfields,\ngroupPaths,\ncolumns,\nvalues:empty,\ncells:empty,\nerror:{\ncode:'pivot-max-columns',\nmessage:`[lattice] pivot would generate ${columns} columns, above pivot.maxColumns of ${maxColumns}. Narrow the pivot columns or raise the limit.`,\ncolumns,\nmaxColumns,\n},\n};\n}\nconst cells=new Map();\nconst keyCount=paths.length;\nfor(let g=0;g<buckets.length;g++){\nconst bucket=buckets[g];\nconst groupPath=groupPaths[g]===undefined?'':groupPaths[g];\nconst n=bucket.length;\nif(n===0)continue;\nconst ids=new Int32Array(n);\nconst counts=new Uint32Array(keyCount+1);\nfor(let i=0;i<n;i++){\nconst id=idOf(bucket[i]);\nids[i]=id;\nif(id>=0)counts[id+1]++;\n}\nfor(let k=0;k<keyCount;k++)counts[k+1]+=counts[k];\nconst scattered=new Uint32Array(n);\nconst cursor=counts.slice(0,keyCount);\nfor(let i=0;i<n;i++){\nconst id=ids[i];\nif(id>=0)scattered[cursor[id]++]=bucket[i];\n}\nfor(let k=0;k<keyCount;k++){\nconst from=counts[k];\nconst to=counts[k+1];\nif(to===from)continue;\nconst slice=scattered.subarray(from,to);\nfor(let c=0;c<valueColumns.length;c++){\nconst column=valueColumns[c];\nconst result=total(column.handle,slice,column.fn,opts.totalContext||{locale:opts.locale});\ncells.set(pivotKey(groupPath,paths[k],column.colId),result);\n}\n}\n}\nreturn{keys,paths,fields,groupPaths,columns,values:cells,cells,error:null};\n}\nfunction derivedFields(paths,valueColumns,separator){\nif(valueColumns.length===0)return paths.slice();\nconst out=[];\nfor(const path of paths){\nfor(const column of valueColumns)out.push(`${path}${separator}${column.colId}`);\n}\nreturn out;\n}\nfunction concatIndices(buckets){\nif(buckets.length===1)return buckets[0]||new Uint32Array(0);\nlet n=0;\nfor(const b of buckets)n+=b?b.length:0;\nconst out=new Uint32Array(n);\nlet at=0;\nfor(const b of buckets){\nif(!b||b.length===0)continue;\nout.set(b,at);\nat+=b.length;\n}\nreturn out;\n}\n});\n__def(\"packages/core/src/compute/reference.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"referenceValue\",{enumerable:true,get:function(){return referenceValue;}});\nObject.defineProperty(__exports,\"referenceSort\",{enumerable:true,get:function(){return referenceSort;}});\nObject.defineProperty(__exports,\"referenceFilter\",{enumerable:true,get:function(){return referenceFilter;}});\nObject.defineProperty(__exports,\"referencePasses\",{enumerable:true,get:function(){return referencePasses;}});\nObject.defineProperty(__exports,\"referenceGroup\",{enumerable:true,get:function(){return referenceGroup;}});\nObject.defineProperty(__exports,\"referenceTotal\",{enumerable:true,get:function(){return referenceTotal;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst getPath=__m0[\"getPath\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst isMissing=__m1[\"isMissing\"];\nconst valueComparator=__m1[\"valueComparator\"];\nconst __m2=__req(\"packages/core/src/compute/filter.js\");\nconst testValue=__m2[\"testValue\"];\nconst KEY_SEPARATOR=String.fromCharCode(0x1f);\nconst NULL_MARKER=String.fromCharCode(0x00);\nfunction referenceValue(row,col){\nconst v=col.includes('.')?getPath(row,col):(row==null?undefined:row[col]);\nreturn v===undefined?null:v;\n}\nfunction referenceSort(rows,entries,opts={}){\nconst list=entries||[];\nlet order=rows.map((_,i)=>i);\nif(list.length===0)return order;\nfor(let e=list.length-1;e>=0;e--){\norder=referenceSortOne(rows,order,list[e],opts);\n}\nreturn order;\n}\nfunction referenceSortOne(rows,order,entry,opts){\nconst locale=entry.locale!==undefined?entry.locale:opts.locale;\nconst base=valueComparator(locale);\nconst descending=entry.descending!==undefined?!!entry.descending:entry.dir==='desc';\nconst present=[];\nconst absent=[];\nfor(const i of order){\nconst v=referenceValue(rows[i],entry.col);\nif(isMissing(v))absent.push(i);else present.push(i);\n}\nconst position=new Map();\nfor(let p=0;p<present.length;p++)position.set(present[p],p);\nconst compare=(a,b)=>{\nconst va=referenceValue(rows[a],entry.col);\nconst vb=referenceValue(rows[b],entry.col);\nlet c;\nif(typeof entry.compare==='function'){\nc=entry.compare(va,vb,rows[a],rows[b],descending);\nif(descending)c=-c;\n}else{\nc=descending?base(vb,va):base(va,vb);\n}\nreturn c!==0?c:position.get(a)-position.get(b);\n};\npresent.sort(compare);\nreturn entry.nullsFirst?absent.concat(present):present.concat(absent);\n}\nfunction referenceFilter(rows,filters,opts={}){\nconst out=[];\nfor(let i=0;i<rows.length;i++){\nif(referencePasses(rows[i],filters,opts,i))out.push(i);\n}\nreturn out;\n}\nfunction referencePasses(row,node,opts,index){\nif(!node)return true;\nif(Array.isArray(node.conditions)){\nconst children=node.conditions.filter((c)=>c!=null);\nif(children.length===0)return true;\nif(node.op==='or')return children.some((c)=>referencePasses(row,c,opts,index));\nconst all=children.every((c)=>referencePasses(row,c,opts,index));\nreturn node.op==='not'?!all:all;\n}\nif(node.col===undefined&&typeof opts.custom==='function')return!!opts.custom(node,row,index);\nreturn testValue(referenceValue(row,node.col),node,opts.locale);\n}\nfunction referenceGroup(rows,cols,order){\nconst source=order||rows.map((_,i)=>i);\nconst seen=new Map();\nconst keys=[];\nconst buckets=[];\nfor(const i of source){\nconst tuple=cols.map((col)=>referenceValue(rows[i],col));\nconst key=tuple\n.map((v)=>(v===null||v===undefined?NULL_MARKER:String(v)))\n.join(KEY_SEPARATOR);\nlet at=seen.get(key);\nif(at===undefined){\nat=keys.length;\nseen.set(key,at);\nkeys.push(tuple);\nbuckets.push([]);\n}\nbuckets[at].push(i);\n}\nreturn{keys,buckets};\n}\nfunction referenceTotal(values,fn,opts={}){\nconst cmp=valueComparator(opts.locale);\nconst live=values.filter((v)=>!isMissing(v));\nconst numbers=live.map(toNumberOrNull).filter((v)=>v!==null);\nswitch(fn){\ncase'count':return values.length;\ncase'countValues':return live.length;\ncase'sum':return numbers.reduce((a,b)=>a+b,0);\ncase'avg':return live.length===0?null:numbers.reduce((a,b)=>a+b,0)/live.length;\ncase'min':return live.length===0?null:live.reduce((a,b)=>(cmp(b,a)<0?b:a));\ncase'max':return live.length===0?null:live.reduce((a,b)=>(cmp(b,a)>0?b:a));\ncase'first':return values.length===0?null:normaliseNull(values[0]);\ncase'last':return values.length===0?null:normaliseNull(values[values.length-1]);\ndefault:return null;\n}\n}\nfunction toNumberOrNull(v){\nif(typeof v==='number')return Number.isNaN(v)?null:v;\nif(v===null||v===undefined||v===''||typeof v==='boolean')return null;\nif(v instanceof Date)return v.getTime();\nconst n=Number(v);\nreturn Number.isNaN(n)?null:n;\n}\nfunction normaliseNull(v){\nreturn v===undefined?null:v;\n}\n});\n__def(\"packages/core/src/compute/index.js\",function(__exports,__req){\n'use strict';\nconst __m0=__req(\"packages/core/src/compute/sort.js\");\nObject.defineProperty(__exports,\"sortColumn\",{enumerable:true,get:function(){return __m0[\"sortColumn\"];}});\nObject.defineProperty(__exports,\"sortMulti\",{enumerable:true,get:function(){return __m0[\"sortMulti\"];}});\nObject.defineProperty(__exports,\"radixSortFloat64\",{enumerable:true,get:function(){return __m0[\"radixSortFloat64\"];}});\nObject.defineProperty(__exports,\"radixSortInt32\",{enumerable:true,get:function(){return __m0[\"radixSortInt32\"];}});\nObject.defineProperty(__exports,\"rankSortDictionary\",{enumerable:true,get:function(){return __m0[\"rankSortDictionary\"];}});\nObject.defineProperty(__exports,\"mergeSortComparator\",{enumerable:true,get:function(){return __m0[\"mergeSortComparator\"];}});\nconst __m1=__req(\"packages/core/src/compute/filter.js\");\nObject.defineProperty(__exports,\"evaluateFilters\",{enumerable:true,get:function(){return __m1[\"evaluateFilters\"];}});\nObject.defineProperty(__exports,\"evaluateCondition\",{enumerable:true,get:function(){return __m1[\"evaluateCondition\"];}});\nObject.defineProperty(__exports,\"compact\",{enumerable:true,get:function(){return __m1[\"compact\"];}});\nObject.defineProperty(__exports,\"testValue\",{enumerable:true,get:function(){return __m1[\"testValue\"];}});\nObject.defineProperty(__exports,\"compilePredicate\",{enumerable:true,get:function(){return __m1[\"compilePredicate\"];}});\nObject.defineProperty(__exports,\"releaseMask\",{enumerable:true,get:function(){return __m1[\"releaseMask\"];}});\nObject.defineProperty(__exports,\"pruneColumn\",{enumerable:true,get:function(){return __m1[\"pruneColumn\"];}});\nObject.defineProperty(__exports,\"mentionsColumn\",{enumerable:true,get:function(){return __m1[\"mentionsColumn\"];}});\nconst __m2=__req(\"packages/core/src/compute/group.js\");\nObject.defineProperty(__exports,\"groupByColumns\",{enumerable:true,get:function(){return __m2[\"groupByColumns\"];}});\nObject.defineProperty(__exports,\"packKeys\",{enumerable:true,get:function(){return __m2[\"packKeys\"];}});\nconst __m3=__req(\"packages/core/src/compute/facet.js\");\nObject.defineProperty(__exports,\"facet\",{enumerable:true,get:function(){return __m3[\"facet\"];}});\nObject.defineProperty(__exports,\"computeBounds\",{enumerable:true,get:function(){return __m3[\"computeBounds\"];}});\nObject.defineProperty(__exports,\"countInto\",{enumerable:true,get:function(){return __m3[\"countInto\"];}});\nObject.defineProperty(__exports,\"bucketOf\",{enumerable:true,get:function(){return __m3[\"bucketOf\"];}});\nObject.defineProperty(__exports,\"facetKind\",{enumerable:true,get:function(){return __m3[\"facetKind\"];}});\nObject.defineProperty(__exports,\"cardinalityOf\",{enumerable:true,get:function(){return __m3[\"cardinalityOf\"];}});\nObject.defineProperty(__exports,\"pickGranularity\",{enumerable:true,get:function(){return __m3[\"pickGranularity\"];}});\nObject.defineProperty(__exports,\"floorTo\",{enumerable:true,get:function(){return __m3[\"floorTo\"];}});\nObject.defineProperty(__exports,\"advance\",{enumerable:true,get:function(){return __m3[\"advance\"];}});\nObject.defineProperty(__exports,\"STRATEGIES\",{enumerable:true,get:function(){return __m3[\"STRATEGIES\"];}});\nObject.defineProperty(__exports,\"GRANULARITIES\",{enumerable:true,get:function(){return __m3[\"GRANULARITIES\"];}});\nObject.defineProperty(__exports,\"DEFAULT_BUCKETS\",{enumerable:true,get:function(){return __m3[\"DEFAULT_BUCKETS\"];}});\nObject.defineProperty(__exports,\"DEFAULT_CARDINALITY_LIMIT\",{enumerable:true,get:function(){return __m3[\"DEFAULT_CARDINALITY_LIMIT\"];}});\nObject.defineProperty(__exports,\"QUANTILE_SAMPLE\",{enumerable:true,get:function(){return __m3[\"QUANTILE_SAMPLE\"];}});\nconst __m4=__req(\"packages/core/src/compute/total.js\");\nObject.defineProperty(__exports,\"TOTAL_FNS\",{enumerable:true,get:function(){return __m4[\"TOTAL_FNS\"];}});\nObject.defineProperty(__exports,\"TOTAL_LABELS\",{enumerable:true,get:function(){return __m4[\"TOTAL_LABELS\"];}});\nObject.defineProperty(__exports,\"totalLabel\",{enumerable:true,get:function(){return __m4[\"totalLabel\"];}});\nObject.defineProperty(__exports,\"total\",{enumerable:true,get:function(){return __m4[\"total\"];}});\nObject.defineProperty(__exports,\"collectValues\",{enumerable:true,get:function(){return __m4[\"collectValues\"];}});\nconst __m5=__req(\"packages/core/src/compute/pivot.js\");\nObject.defineProperty(__exports,\"pivot\",{enumerable:true,get:function(){return __m5[\"pivot\"];}});\nObject.defineProperty(__exports,\"resolvePivotKeys\",{enumerable:true,get:function(){return __m5[\"resolvePivotKeys\"];}});\nObject.defineProperty(__exports,\"pivotKey\",{enumerable:true,get:function(){return __m5[\"pivotKey\"];}});\nObject.defineProperty(__exports,\"joinPath\",{enumerable:true,get:function(){return __m5[\"joinPath\"];}});\nObject.defineProperty(__exports,\"KEY_DELIMITER\",{enumerable:true,get:function(){return __m5[\"KEY_DELIMITER\"];}});\nObject.defineProperty(__exports,\"DEFAULT_PATH_SEPARATOR\",{enumerable:true,get:function(){return __m5[\"DEFAULT_PATH_SEPARATOR\"];}});\nObject.defineProperty(__exports,\"DEFAULT_MAX_COLUMNS\",{enumerable:true,get:function(){return __m5[\"DEFAULT_MAX_COLUMNS\"];}});\nconst __m6=__req(\"packages/core/src/compute/reference.js\");\nObject.defineProperty(__exports,\"referenceSort\",{enumerable:true,get:function(){return __m6[\"referenceSort\"];}});\nObject.defineProperty(__exports,\"referenceFilter\",{enumerable:true,get:function(){return __m6[\"referenceFilter\"];}});\nObject.defineProperty(__exports,\"referenceGroup\",{enumerable:true,get:function(){return __m6[\"referenceGroup\"];}});\nObject.defineProperty(__exports,\"referenceTotal\",{enumerable:true,get:function(){return __m6[\"referenceTotal\"];}});\nObject.defineProperty(__exports,\"referencePasses\",{enumerable:true,get:function(){return __m6[\"referencePasses\"];}});\nObject.defineProperty(__exports,\"referenceValue\",{enumerable:true,get:function(){return __m6[\"referenceValue\"];}});\nconst __m7=__req(\"packages/core/src/compute/handle.js\");\nObject.defineProperty(__exports,\"identity\",{enumerable:true,get:function(){return __m7[\"identity\"];}});\nObject.defineProperty(__exports,\"rowCount\",{enumerable:true,get:function(){return __m7[\"rowCount\"];}});\nObject.defineProperty(__exports,\"presenceReader\",{enumerable:true,get:function(){return __m7[\"presenceReader\"];}});\nObject.defineProperty(__exports,\"bitReader\",{enumerable:true,get:function(){return __m7[\"bitReader\"];}});\nObject.defineProperty(__exports,\"valueReader\",{enumerable:true,get:function(){return __m7[\"valueReader\"];}});\nObject.defineProperty(__exports,\"valueComparator\",{enumerable:true,get:function(){return __m7[\"valueComparator\"];}});\nObject.defineProperty(__exports,\"numericTotalOrder\",{enumerable:true,get:function(){return __m7[\"numericTotalOrder\"];}});\nObject.defineProperty(__exports,\"dictRanks\",{enumerable:true,get:function(){return __m7[\"dictRanks\"];}});\nObject.defineProperty(__exports,\"dictSize\",{enumerable:true,get:function(){return __m7[\"dictSize\"];}});\nObject.defineProperty(__exports,\"dictValue\",{enumerable:true,get:function(){return __m7[\"dictValue\"];}});\nObject.defineProperty(__exports,\"multiValue\",{enumerable:true,get:function(){return __m7[\"multiValue\"];}});\nObject.defineProperty(__exports,\"isMissing\",{enumerable:true,get:function(){return __m7[\"isMissing\"];}});\n});\n__def(\"packages/worker/src/kernel.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"loadCompute\",{enumerable:true,get:function(){return loadCompute;}});\nObject.defineProperty(__exports,\"setCompute\",{enumerable:true,get:function(){return setCompute;}});\nObject.defineProperty(__exports,\"dispatch\",{enumerable:true,get:function(){return dispatch;}});\nObject.defineProperty(__exports,\"handleMessage\",{enumerable:true,get:function(){return handleMessage;}});\nObject.defineProperty(__exports,\"installKernel\",{enumerable:true,get:function(){return installKernel;}});\nconst __m0=__req(\"packages/worker/src/transport.js\");\nconst PROTOCOL=__m0[\"PROTOCOL\"];\nconst OPS=__m0[\"OPS\"];\nconst CONTROL=__m0[\"CONTROL\"];\nconst ERRORS=__m0[\"ERRORS\"];\nconst unpackHandle=__m0[\"unpackHandle\"];\nconst unpackHandles=__m0[\"unpackHandles\"];\nconst createMaskPool=__m0[\"createMaskPool\"];\nconst collectTransfers=__m0[\"collectTransfers\"];\nlet computeModule=null;\nlet computePromise=null;\nlet computeError=null;\nasync function loadCompute(loader){\nif(computeModule)return computeModule;\nif(!computePromise){\nconst load=loader||(()=>Promise.resolve(__req(\"packages/core/src/compute/index.js\")));\ncomputePromise=Promise.resolve()\n.then(load)\n.then((mod)=>{computeModule=mod;return mod;})\n.catch((err)=>{\ncomputeError=err;\ncomputeModule=null;\nreturn null;\n});\n}\nreturn computePromise;\n}\nfunction setCompute(mod){\ncomputeModule=mod;\ncomputePromise=mod?Promise.resolve(mod):null;\ncomputeError=mod?null:computeError;\n}\nfunction filterContext(handles,count,locale){\nconst byId=new Map();\nfor(const h of handles)if(h)byId.set(h.id,h);\nreturn{\nhandle(colId){return byId.get(colId);},\ncount,\npool:createMaskPool(),\nlocale,\n};\n}\nfunction dispatch(request,compute){\nconst{op,args}=request;\nconst fn=compute[op];\nif(typeof fn!=='function'){\nconst err=new Error(`[lattice] compute kernel '${op}' is not exported`);\n(err).code=ERRORS.NO_KERNEL;\nthrow err;\n}\nswitch(op){\ncase OPS.SORT_COLUMN:\nreturn fn(unpackHandle(args.handle),args.order??null,args.opts||{});\ncase OPS.SORT_MULTI:{\nconst handles=unpackHandles(args.handles||[]);\nconst entries=(args.entries||[]).map((e)=>({\n...e,\nhandle:handles[e.index],\n}));\nreturn fn(handles,entries,args.order??null);\n}\ncase OPS.EVALUATE_FILTERS:\nreturn fn(args.filters,filterContext(unpackHandles(args.handles||[]),args.count,args.locale));\ncase OPS.COMPACT:\nreturn fn(args.mask,args.count,undefined);\ncase OPS.GROUP_BY_COLUMNS:\nreturn fn(unpackHandles(args.handles||[]),args.order??null,args.opts||{});\ncase OPS.TOTAL:\nreturn fn(unpackHandle(args.handle),args.indices??null,args.fn);\ncase OPS.PIVOT:\nreturn fn(unpackHandles(args.handles||[]),args.order??null,args.opts||{});\ncase OPS.FACET:\nreturn fn(unpackHandle(args.handle),args.indices??null,args.count,args.opts||{});\ndefault:{\nconst err=new Error(`[lattice] unknown worker op '${op}'`);\n(err).code=ERRORS.PROTOCOL;\nthrow err;\n}\n}\n}\nasync function handleMessage(message,opts={}){\nif(!message||message.lattice!==PROTOCOL)return null;\nconst{id,op}=message;\nif(op===CONTROL.CANCEL){\nopts.cancelled?.add(message.target);\nreturn null;\n}\nif(op===CONTROL.PING){\nreturn{reply:{lattice:PROTOCOL,id,ok:true,result:'pong'},transfer:[]};\n}\nconst compute=await loadCompute(opts.loader);\nif(!compute){\nreturn{\nreply:{\nlattice:PROTOCOL,\nid,\nok:false,\nerror:{\ncode:ERRORS.NO_COMPUTE,\nmessage:`[lattice] compute kernels unavailable in worker: ${computeError?computeError.message:'module not found'}`,\n},\n},\ntransfer:[],\n};\n}\nif(opts.cancelled?.has(id)){\nopts.cancelled.delete(id);\nreturn{reply:{lattice:PROTOCOL,id,ok:false,error:{code:ERRORS.ABORTED,message:'[lattice] request superseded'}},transfer:[]};\n}\ntry{\nconst result=dispatch(message,compute);\nif(opts.cancelled?.has(id)){\nopts.cancelled.delete(id);\nreturn{reply:{lattice:PROTOCOL,id,ok:false,error:{code:ERRORS.ABORTED,message:'[lattice] request superseded'}},transfer:[]};\n}\nreturn{reply:{lattice:PROTOCOL,id,ok:true,result},transfer:collectTransfers(result)};\n}catch(err){\nconst e=(err);\nreturn{\nreply:{\nlattice:PROTOCOL,\nid,\nok:false,\nerror:{code:e.code||ERRORS.KERNEL,message:e.message||String(err),stack:e.stack},\n},\ntransfer:[],\n};\n}\n}\nfunction installKernel(scope,opts={}){\nconst cancelled=new Set();\nconst onMessage=async(event)=>{\nconst outcome=await handleMessage(event.data,{loader:opts.loader,cancelled});\nif(!outcome)return;\nscope.postMessage(outcome.reply,outcome.transfer);\n};\nscope.addEventListener('message',onMessage);\nloadCompute(opts.loader).then((mod)=>{\nscope.postMessage({lattice:PROTOCOL,id:0,op:CONTROL.READY,compute:!!mod});\n});\nreturn()=>scope.removeEventListener('message',onMessage);\n}\n});\nvar __entry=__req(\"packages/worker/src/kernel.js\");\nroot[\"__latticeKernel\"]=__entry;\n})(typeof globalThis!=='undefined'?globalThis:this);\n__latticeKernel.installKernel(self);\n",{type:'classic'});
|
|
63248
|
+
__req("packages/worker/src/inline.js").setWorkerSource("(function(root){\n'use strict';\nvar __mods=Object.create(null);\nvar __cache=Object.create(null);\nfunction __def(id,fn){__mods[id]=fn;}\nfunction __req(id){\nvar hit=__cache[id];\nif(hit)return hit;\nvar exports=Object.create(null);\n__cache[id]=exports;\nvar fn=__mods[id];\nif(!fn)throw new Error('[lattice] missing module: '+id);\nfn(exports,__req);\nreturn exports;\n}\n__def(\"packages/core/src/internal/util.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"VERSION\",{enumerable:true,get:function(){return VERSION;}});\nObject.defineProperty(__exports,\"reportedWarnings\",{enumerable:true,get:function(){return reportedWarnings;}});\nObject.defineProperty(__exports,\"warnOnce\",{enumerable:true,get:function(){return warnOnce;}});\nObject.defineProperty(__exports,\"infoOnce\",{enumerable:true,get:function(){return infoOnce;}});\nObject.defineProperty(__exports,\"resetWarnings\",{enumerable:true,get:function(){return resetWarnings;}});\nObject.defineProperty(__exports,\"fail\",{enumerable:true,get:function(){return fail;}});\nObject.defineProperty(__exports,\"invariant\",{enumerable:true,get:function(){return invariant;}});\nObject.defineProperty(__exports,\"DEV\",{enumerable:true,get:function(){return DEV;}});\nObject.defineProperty(__exports,\"isObject\",{enumerable:true,get:function(){return isObject;}});\nObject.defineProperty(__exports,\"isFunction\",{enumerable:true,get:function(){return isFunction;}});\nObject.defineProperty(__exports,\"isNil\",{enumerable:true,get:function(){return isNil;}});\nObject.defineProperty(__exports,\"isBlank\",{enumerable:true,get:function(){return isBlank;}});\nObject.defineProperty(__exports,\"isCtor\",{enumerable:true,get:function(){return isCtor;}});\nObject.defineProperty(__exports,\"pathGetter\",{enumerable:true,get:function(){return pathGetter;}});\nObject.defineProperty(__exports,\"pathSetter\",{enumerable:true,get:function(){return pathSetter;}});\nObject.defineProperty(__exports,\"getPath\",{enumerable:true,get:function(){return getPath;}});\nObject.defineProperty(__exports,\"setPath\",{enumerable:true,get:function(){return setPath;}});\nObject.defineProperty(__exports,\"humanise\",{enumerable:true,get:function(){return humanise;}});\nObject.defineProperty(__exports,\"escapeHtml\",{enumerable:true,get:function(){return escapeHtml;}});\nObject.defineProperty(__exports,\"titleCase\",{enumerable:true,get:function(){return titleCase;}});\nObject.defineProperty(__exports,\"expand\",{enumerable:true,get:function(){return expand;}});\nObject.defineProperty(__exports,\"toArray\",{enumerable:true,get:function(){return toArray;}});\nObject.defineProperty(__exports,\"merge\",{enumerable:true,get:function(){return merge;}});\nObject.defineProperty(__exports,\"mergeRow\",{enumerable:true,get:function(){return mergeRow;}});\nObject.defineProperty(__exports,\"Lru\",{enumerable:true,get:function(){return Lru;}});\nObject.defineProperty(__exports,\"collator\",{enumerable:true,get:function(){return collator;}});\nObject.defineProperty(__exports,\"defaultCompare\",{enumerable:true,get:function(){return defaultCompare;}});\nObject.defineProperty(__exports,\"now\",{enumerable:true,get:function(){return now;}});\nObject.defineProperty(__exports,\"nextFrame\",{enumerable:true,get:function(){return nextFrame;}});\nObject.defineProperty(__exports,\"cancelFrame\",{enumerable:true,get:function(){return cancelFrame;}});\nObject.defineProperty(__exports,\"frameBatched\",{enumerable:true,get:function(){return frameBatched;}});\nObject.defineProperty(__exports,\"whenIdle\",{enumerable:true,get:function(){return whenIdle;}});\nObject.defineProperty(__exports,\"uid\",{enumerable:true,get:function(){return uid;}});\nconst VERSION='1.9.0';\nconst warned=new Set();\nconst reported=[];\nconst REPORT_LIMIT=500;\nfunction record(key,level,message){\nreported.push({\nkey,\nlevel,\nmessage:message.map((m)=>(typeof m==='string'?m:safeString(m))).join(' '),\nat:Date.now(),\n});\nif(reported.length>REPORT_LIMIT)reported.shift();\n}\nfunction safeString(value){\nif(value instanceof Error)return value.message;\ntry{return JSON.stringify(value);}catch{return String(value);}\n}\nfunction reportedWarnings(){return reported.map((r)=>({...r}));}\nfunction warnOnce(key,...message){\nif(warned.has(key))return;\nwarned.add(key);\nrecord(key,'warn',message);\nconsole.warn('[lattice]',...message);\n}\nfunction infoOnce(key,...message){\nif(warned.has(key))return;\nwarned.add(key);\nrecord(key,'info',message);\nconsole.info('[lattice]',...message);\n}\nfunction resetWarnings(){\nwarned.clear();\nreported.length=0;\n}\nfunction fail(message,extra){\nconst err=new Error(`[lattice] ${message}`);\nif(extra!==undefined)err.cause=extra;\nthrow err;\n}\nfunction invariant(condition,message){\nif(!condition)fail(message);\n}\nconst DEV=(()=>{\ntry{\nreturn!(typeof process!=='undefined'&&process.env\n&&process.env.NODE_ENV==='production');\n}catch{\nreturn true;\n}\n})();\nfunction isObject(v){\nreturn v!==null&&typeof v==='object'&&!Array.isArray(v);\n}\nfunction isFunction(v){\nreturn typeof v==='function';\n}\nfunction isNil(v){\nreturn v===null||v===undefined;\n}\nfunction isBlank(v){\nreturn v===null||v===undefined||v==='';\n}\nfunction isCtor(v){\nif(typeof v!=='function')return false;\nif(/^class[\\s{]/.test(Function.prototype.toString.call(v)))return true;\nreturn!!(v.prototype&&Object.getOwnPropertyNames(v.prototype).length>1);\n}\nconst pathCache=new Map();\nfunction pathGetter(path){\nlet fn=pathCache.get(path);\nif(fn)return fn;\nif(!path.includes('.')){\nfn=(o)=>(o==null?undefined:o[path]);\n}else{\nconst parts=path.split('.');\nconst n=parts.length;\nfn=(o)=>{\nlet cur=o;\nfor(let i=0;i<n;i++){\nif(cur==null)return undefined;\ncur=cur[parts[i]];\n}\nreturn cur;\n};\n}\npathCache.set(path,fn);\nreturn fn;\n}\nconst setterCache=new Map();\nfunction pathSetter(path){\nlet fn=setterCache.get(path);\nif(fn)return fn;\nif(!path.includes('.')){\nfn=(o,v)=>{if(o!=null)o[path]=v;};\n}else{\nconst parts=path.split('.');\nconst last=parts.length-1;\nfn=(o,v)=>{\nlet cur=o;\nfor(let i=0;i<last;i++){\nif(cur==null)return;\nconst k=parts[i];\nif(cur[k]==null)cur[k]={};\ncur=cur[k];\n}\nif(cur!=null)cur[parts[last]]=v;\n};\n}\nsetterCache.set(path,fn);\nreturn fn;\n}\nfunction getPath(obj,path){\nreturn pathGetter(path)(obj);\n}\nfunction setPath(obj,path,value){\npathSetter(path)(obj,value);\n}\nfunction humanise(field){\nif(!field)return'';\nconst leaf=field.includes('.')?field.slice(field.lastIndexOf('.')+1):field;\nreturn leaf\n.replace(/[_-]+/g,' ')\n.replace(/([a-z0-9])([A-Z])/g,'$1 $2')\n.replace(/([A-Z]+)([A-Z][a-z])/g,'$1 $2')\n.replace(/\\s+/g,' ')\n.trim()\n.replace(/^./,(c)=>c.toUpperCase());\n}\nconst ESCAPES={'&':'&','<':'<','>':'>','\"':'"',\"'\":'''};\nfunction escapeHtml(s){\nconst str=s==null?'':String(s);\nreturn/[&<>\"']/.test(str)?str.replace(/[&<>\"']/g,(c)=>ESCAPES[c]):str;\n}\nfunction titleCase(s){\nreturn String(s).replace(/\\w\\S*/g,(t)=>t[0].toUpperCase()+t.slice(1).toLowerCase());\n}\nfunction expand(value,key,whenTrue){\nif(value===undefined)return undefined;\nif(value===true)return{enabled:true,...whenTrue};\nif(value===false)return{enabled:false};\nif(isObject(value))return value;\nreturn{[key]:value,enabled:true};\n}\nfunction toArray(v){\nif(v===undefined||v===null)return[];\nreturn Array.isArray(v)?v:[v];\n}\nfunction merge(a,b){\nif(!isObject(a))return isObject(b)?{...b}:b;\nif(!isObject(b))return b===undefined?a:b;\nconst out={...a};\nfor(const k of Object.keys(b)){\nconst bv=b[k];\nif(bv===undefined)continue;\nout[k]=isObject(bv)&&isObject(out[k])?merge(out[k],bv):bv;\n}\nreturn out;\n}\nfunction mergeRow(previous,patch){\nif(!isObject(previous)||!isObject(patch)||previous===patch)return patch;\nconst out=Object.create(Object.getPrototypeOf(previous));\nObject.assign(out,previous,patch);\nreturn out;\n}\nclass Lru{\n#max;\n#map=new Map();\n#onEvict;\nconstructor(max=256,onEvict=null){\nthis.#max=max;\nthis.#onEvict=onEvict;\n}\nget size(){\nreturn this.#map.size;\n}\nget max(){\nreturn this.#max;\n}\nset max(v){\nthis.#max=v;\nthis.#trim();\n}\nhas(k){\nreturn this.#map.has(k);\n}\nget(k){\nconst m=this.#map;\nif(!m.has(k))return undefined;\nconst v=m.get(k);\nm.delete(k);\nm.set(k,v);\nreturn v;\n}\npeek(k){\nreturn this.#map.get(k);\n}\nset(k,v){\nconst m=this.#map;\nif(m.has(k))m.delete(k);\nm.set(k,v);\nthis.#trim();\nreturn v;\n}\ndelete(k){\nconst v=this.#map.get(k);\nif(this.#map.delete(k)&&this.#onEvict)this.#onEvict(v,k);\nreturn v;\n}\nclear(){\nif(this.#onEvict)for(const[k,v]of this.#map)this.#onEvict(v,k);\nthis.#map.clear();\n}\nkeys(){\nreturn this.#map.keys();\n}\nvalues(){\nreturn this.#map.values();\n}\n#trim(){\nconst m=this.#map;\nwhile(m.size>this.#max){\nconst oldest=m.keys().next().value;\nconst v=m.get(oldest);\nm.delete(oldest);\nif(this.#onEvict)this.#onEvict(v,oldest);\n}\n}\n}\nconst collators=new Map();\nfunction collator(locale,opts){\nconst key=`${locale||''}|${opts?JSON.stringify(opts):''}`;\nlet c=collators.get(key);\nif(!c){\nc=new Intl.Collator(locale||undefined,{\nnumeric:true,sensitivity:'variant',...opts,\n});\ncollators.set(key,c);\n}\nreturn c;\n}\nfunction defaultCompare(a,b){\nif(a===b)return 0;\nif(a===null||a===undefined)return 1;\nif(b===null||b===undefined)return-1;\nif(typeof a==='number'&&typeof b==='number'){\nif(Number.isNaN(a))return Number.isNaN(b)?0:1;\nif(Number.isNaN(b))return-1;\nreturn a<b?-1:a>b?1:0;\n}\nconst sa=String(a);\nconst sb=String(b);\nreturn sa<sb?-1:sa>sb?1:0;\n}\nfunction now(){\nreturn typeof performance!=='undefined'&&performance.now\n?performance.now()\n:Date.now();\n}\nconst hasRaf=typeof requestAnimationFrame==='function';\nfunction nextFrame(fn){\nif(hasRaf)return requestAnimationFrame(fn);\nreturn setTimeout(()=>fn(now()),16);\n}\nfunction cancelFrame(handle){\nif(handle==null)return;\nif(hasRaf)cancelAnimationFrame(handle);\nelse clearTimeout(handle);\n}\nfunction frameBatched(fn){\nlet handle=null;\nlet lastArgs=null;\nconst run=()=>{\nhandle=null;\nconst a=lastArgs;\nlastArgs=null;\nfn(...(a||[]));\n};\nconst wrapped=(...args)=>{\nlastArgs=args;\nif(handle===null)handle=nextFrame(run);\n};\nwrapped.cancel=()=>{\ncancelFrame(handle);\nhandle=null;\nlastArgs=null;\n};\nwrapped.flush=()=>{\nif(handle!==null){\ncancelFrame(handle);\nrun();\n}\n};\nreturn wrapped;\n}\nfunction whenIdle(fn,timeout=50){\nif(typeof requestIdleCallback==='function'){\nreturn requestIdleCallback(fn,{timeout});\n}\nreturn setTimeout(()=>fn({timeRemaining:()=>0,didTimeout:true}),1);\n}\nlet idSeq=0;\nfunction uid(prefix='l'){\nreturn`${prefix}${(++idSeq).toString(36)}`;\n}\n});\n__def(\"packages/worker/src/transport.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"PROTOCOL\",{enumerable:true,get:function(){return PROTOCOL;}});\nObject.defineProperty(__exports,\"OPS\",{enumerable:true,get:function(){return OPS;}});\nObject.defineProperty(__exports,\"CONTROL\",{enumerable:true,get:function(){return CONTROL;}});\nObject.defineProperty(__exports,\"ERRORS\",{enumerable:true,get:function(){return ERRORS;}});\nObject.defineProperty(__exports,\"packHandle\",{enumerable:true,get:function(){return packHandle;}});\nObject.defineProperty(__exports,\"packHandles\",{enumerable:true,get:function(){return packHandles;}});\nObject.defineProperty(__exports,\"TransportedDictionary\",{enumerable:true,get:function(){return TransportedDictionary;}});\nObject.defineProperty(__exports,\"unpackHandle\",{enumerable:true,get:function(){return unpackHandle;}});\nObject.defineProperty(__exports,\"unpackHandles\",{enumerable:true,get:function(){return unpackHandles;}});\nObject.defineProperty(__exports,\"createMaskPool\",{enumerable:true,get:function(){return createMaskPool;}});\nObject.defineProperty(__exports,\"isTransferable\",{enumerable:true,get:function(){return isTransferable;}});\nObject.defineProperty(__exports,\"collectTransfers\",{enumerable:true,get:function(){return collectTransfers;}});\nObject.defineProperty(__exports,\"isPortable\",{enumerable:true,get:function(){return isPortable;}});\nObject.defineProperty(__exports,\"filterColumnIds\",{enumerable:true,get:function(){return filterColumnIds;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst collator=__m0[\"collator\"];\nconst isFunction=__m0[\"isFunction\"];\nconst PROTOCOL=1;\nconst OPS=Object.freeze({\nSORT_COLUMN:'sortColumn',\nSORT_MULTI:'sortMulti',\nEVALUATE_FILTERS:'evaluateFilters',\nCOMPACT:'compact',\nGROUP_BY_COLUMNS:'groupByColumns',\nTOTAL:'total',\nPIVOT:'pivot',\nFACET:'facet',\n});\nconst CONTROL=Object.freeze({\nREADY:'ready',\nCANCEL:'cancel',\nPING:'ping',\n});\nconst ERRORS=Object.freeze({\nNO_COMPUTE:'E_NO_COMPUTE',\nNO_KERNEL:'E_NO_KERNEL',\nABORTED:'E_ABORTED',\nKERNEL:'E_KERNEL',\nPROTOCOL:'E_PROTOCOL',\n});\nfunction packHandle(handle){\nif(handle==null)return null;\nconst presence=handle.presence;\nreturn{\nid:handle.id,\nkind:handle.kind,\nnullable:!!handle.nullable,\nvalues:handle.values??null,\npresence:presence?(presence.words??presence):null,\npresenceBits:presence?(presence.size??(presence.words??presence).length*8):0,\ndict:handle.dict?sliceDictionary(handle.dict):null,\noffsets:handle.offsets??null,\nversion:handle.version??0,\n};\n}\nfunction sliceDictionary(dict){\nif(Array.isArray(dict))return dict;\nif(isFunction(dict.values))return dict.values();\nreturn[];\n}\nfunction packHandles(handles){\nconst out=new Array(handles.length);\nfor(let i=0;i<handles.length;i++)out[i]=packHandle(handles[i]);\nreturn out;\n}\nclass TransportedBitset{\n#words;\n#bits;\nconstructor(words,bits){\nthis.#words=words;\nthis.#bits=bits;\n}\nget words(){return this.#words;}\nget size(){return this.#bits;}\nget(i){return(this.#words[i>>>3]&(1<<(i&7)))!==0;}\ncount(){\nconst w=this.#words;\nlet n=0;\nfor(let i=0;i<w.length;i++){\nlet v=w[i];\nwhile(v){v&=v-1;n++;}\n}\nreturn n;\n}\n}\nclass TransportedDictionary{\n#values;\n#index=null;\n#version=0;\n#ranks=new Map();\nconstructor(values){\nthis.#values=values||[];\n}\nget size(){return this.#values.length;}\nget version(){return this.#version;}\ncodeOf(value){\nif(this.#index===null){\nthis.#index=new Map();\nfor(let i=0;i<this.#values.length;i++)this.#index.set(this.#values[i],i);\n}\nconst found=this.#index.get(value);\nif(found!==undefined)return found;\nconst code=this.#values.length;\nthis.#values.push(value);\nthis.#index.set(value,code);\nthis.#version++;\nreturn code;\n}\nvalueOf(code){return this.#values[code];}\nvalues(){return this.#values;}\nranks(locale){\nconst key=locale||'';\nconst cached=this.#ranks.get(key);\nif(cached&&cached.version===this.#version)return cached.ranks;\nconst n=this.#values.length;\nconst order=new Uint32Array(n);\nfor(let i=0;i<n;i++)order[i]=i;\nconst cmp=collator(locale).compare;\nconst vals=this.#values;\nconst sorted=Array.from(order).sort((a,b)=>{\nconst av=vals[a];\nconst bv=vals[b];\nif(av===bv)return 0;\nif(av===null||av===undefined)return 1;\nif(bv===null||bv===undefined)return-1;\nreturn cmp(String(av),String(bv));\n});\nconst ranks=new Uint32Array(n);\nfor(let r=0;r<sorted.length;r++)ranks[sorted[r]]=r;\nthis.#ranks.set(key,{version:this.#version,ranks});\nreturn ranks;\n}\n}\nfunction unpackHandle(packed){\nif(packed==null)return null;\nconst presence=packed.presence\n?new TransportedBitset(packed.presence,packed.presenceBits||packed.presence.length*8)\n:null;\nconst dict=packed.dict?new TransportedDictionary(packed.dict):null;\nconst values=packed.values;\nconst offsets=packed.offsets??null;\nconst kind=packed.kind;\nconst get=(physical)=>{\nif(presence&&!presence.get(physical))return null;\nswitch(kind){\ncase'dictionary':\nreturn dict?dict.valueOf(values[physical]):values[physical];\ncase'bitset':\nreturn(values[physical>>>3]&(1<<(physical&7)))!==0;\ncase'multi':{\nif(!offsets)return null;\nconst from=offsets[physical];\nconst to=offsets[physical+1];\nconst out=new Array(to-from);\nfor(let i=from;i<to;i++)out[i-from]=dict?dict.valueOf(values[i]):values[i];\nreturn out;\n}\ndefault:\nreturn values[physical];\n}\n};\nreturn{\nid:packed.id,\nkind,\nnullable:packed.nullable,\nvalues,\npresence,\ndict,\noffsets,\nget,\nversion:packed.version,\n};\n}\nfunction unpackHandles(packed){\nconst out=new Array(packed.length);\nfor(let i=0;i<packed.length;i++)out[i]=unpackHandle(packed[i]);\nreturn out;\n}\nfunction createMaskPool(){\nconst masks=[];\nconst indices=[];\nreturn{\nmask(n){\nfor(let i=0;i<masks.length;i++){\nif(masks[i].length>=n){\nconst buf=masks.splice(i,1)[0].subarray(0,n);\nbuf.fill(0);\nreturn buf;\n}\n}\nreturn new Uint8Array(n);\n},\nindices(n){\nfor(let i=0;i<indices.length;i++){\nif(indices[i].length>=n)return indices.splice(i,1)[0].subarray(0,n);\n}\nreturn new Uint32Array(n);\n},\nrelease(buf){\nif(!buf)return;\nif(buf instanceof Uint8Array)masks.push(buf);\nelse if(buf instanceof Uint32Array)indices.push(buf);\n},\nclear(){masks.length=0;indices.length=0;},\n};\n}\nfunction isTransferable(v){\nif(!ArrayBuffer.isView(v))return false;\nconst buf=(v).buffer;\nif(!buf)return false;\nreturn typeof SharedArrayBuffer==='undefined'||!(buf instanceof SharedArrayBuffer);\n}\nfunction collectTransfers(value,out=[]){\nconst add=(v)=>{\nif(!isTransferable(v))return;\nconst buf=(v).buffer;\nif(!out.includes(buf))out.push(buf);\n};\nif(value==null)return out;\nif(ArrayBuffer.isView(value)){add(value);return out;}\nif(Array.isArray(value)){\nfor(const item of value)add(item);\nreturn out;\n}\nif(typeof value==='object'){\nfor(const key of Object.keys(value)){\nconst item=(value)[key];\nif(Array.isArray(item))for(const sub of item)add(sub);\nelse add(item);\n}\n}\nreturn out;\n}\nfunction isPortable(value,depth=0){\nif(value==null)return true;\nconst t=typeof value;\nif(t==='function'||t==='symbol')return false;\nif(t!=='object')return true;\nif(depth>4)return true;\nif(ArrayBuffer.isView(value)||value instanceof ArrayBuffer||value instanceof Date)return true;\nif(Array.isArray(value)){\nfor(const item of value)if(!isPortable(item,depth+1))return false;\nreturn true;\n}\nfor(const key of Object.keys(value)){\nif(!isPortable((value)[key],depth+1))return false;\n}\nreturn true;\n}\nfunction filterColumnIds(filters,out=new Set()){\nif(!filters||typeof filters!=='object')return out;\nconst node=(filters);\nif(typeof node.col==='string')out.add(node.col);\nconst conditions=node.conditions;\nif(Array.isArray(conditions))for(const child of conditions)filterColumnIds(child,out);\nreturn out;\n}\n});\n__def(\"packages/core/src/compute/handle.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"identity\",{enumerable:true,get:function(){return identity;}});\nObject.defineProperty(__exports,\"rowCount\",{enumerable:true,get:function(){return rowCount;}});\nObject.defineProperty(__exports,\"bitReader\",{enumerable:true,get:function(){return bitReader;}});\nObject.defineProperty(__exports,\"presenceReader\",{enumerable:true,get:function(){return presenceReader;}});\nObject.defineProperty(__exports,\"dictSize\",{enumerable:true,get:function(){return dictSize;}});\nObject.defineProperty(__exports,\"dictValue\",{enumerable:true,get:function(){return dictValue;}});\nObject.defineProperty(__exports,\"multiValue\",{enumerable:true,get:function(){return multiValue;}});\nObject.defineProperty(__exports,\"valueReader\",{enumerable:true,get:function(){return valueReader;}});\nObject.defineProperty(__exports,\"numericTotalOrder\",{enumerable:true,get:function(){return numericTotalOrder;}});\nObject.defineProperty(__exports,\"valueComparator\",{enumerable:true,get:function(){return valueComparator;}});\nObject.defineProperty(__exports,\"dictRanks\",{enumerable:true,get:function(){return dictRanks;}});\nObject.defineProperty(__exports,\"isMissing\",{enumerable:true,get:function(){return isMissing;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst collator=__m0[\"collator\"];\nconst defaultCompare=__m0[\"defaultCompare\"];\nconst warnOnce=__m0[\"warnOnce\"];\nfunction identity(n){\nconst out=new Uint32Array(n);\nfor(let i=0;i<n;i++)out[i]=i;\nreturn out;\n}\nfunction rowCount(handle,opts){\nif(opts&&typeof opts.count==='number')return opts.count;\nif(!handle)return 0;\nif(typeof handle.count==='number')return handle.count;\nif(typeof handle.length==='number')return handle.length;\nconst values=handle.values;\nif(handle.kind==='multi'&&handle.offsets)return Math.max(0,handle.offsets.length-1);\nif(!values)return handle.presence&&typeof handle.presence.size==='number'?handle.presence.size:0;\nif(handle.kind==='bitset'){\nif(typeof values.size==='number')return values.size;\nif(handle.presence&&typeof handle.presence.size==='number')return handle.presence.size;\nwarnOnce(`count:${handle.id}`,`column \"${handle.id}\" is bitset-backed with no declared row count; assuming ${values.length*8}`);\nreturn values.length*8;\n}\nreturn values.length;\n}\nconst bitOrders=new WeakMap();\nfunction bitOrderOf(bitset){\nconst ctor=bitset.constructor;\nif(!ctor)return'unknown';\nconst cached=bitOrders.get(ctor);\nif(cached)return cached;\nlet order='unknown';\ntry{\nlet probe=null;\nif(typeof ctor.from==='function')probe=ctor.from([false,true]);\nelse{\nprobe=new ctor(8);\nprobe.set(1);\n}\nconst words=probe&&probe.words;\nif(words&&words.length){\nif(words[0]===0x02)order='lsb';\nelse if(words[0]===0x40)order='msb';\n}\n}catch{\norder='unknown';\n}\nbitOrders.set(ctor,order);\nreturn order;\n}\nfunction bitReader(bits){\nif(!bits)return()=>0;\nconst raw=bits instanceof Uint8Array?bits:bits.words;\nif(raw instanceof Uint8Array){\nconst order=bits instanceof Uint8Array?'lsb':bitOrderOf(bits);\nif(order==='lsb')return(i)=>(raw[i>>>3]>>>(i&7))&1;\nif(order==='msb')return(i)=>(raw[i>>>3]>>>(7-(i&7)))&1;\n}\nif(typeof bits.get==='function')return(i)=>(bits.get(i)?1:0);\nreturn()=>0;\n}\nfunction presenceReader(handle){\nif(!handle||!handle.presence)return null;\nreturn bitReader(handle.presence);\n}\nfunction dictSize(dict){\nif(!dict)return 0;\nif(typeof dict.size==='number')return dict.size;\nif(typeof dict.values==='function')return dict.values().length;\nreturn 0;\n}\nfunction dictValue(dict,code){\nif(!dict)return null;\nif(typeof dict.valueOf==='function')return dict.valueOf(code);\nif(typeof dict.values==='function')return dict.values()[code];\nreturn null;\n}\nfunction multiValue(handle,i){\nconst offsets=handle.offsets;\nconst values=handle.values;\nif(!offsets||!values)return[];\nconst from=offsets[i];\nconst to=offsets[i+1];\nif(!(to>from))return[];\nconst dict=handle.dict;\nconst out=new Array(to-from);\nfor(let k=from;k<to;k++)out[k-from]=dict?dictValue(dict,values[k]):values[k];\nreturn out;\n}\nfunction valueReader(handle){\nif(!handle)return()=>undefined;\nconst values=handle.values;\nconst present=presenceReader(handle);\nconst kind=handle.kind;\nif(kind==='dictionary'){\nconst dict=handle.dict;\nif(present)return(i)=>(present(i)?dictValue(dict,values[i]):null);\nreturn(i)=>dictValue(dict,values[i]);\n}\nif(kind==='bitset'){\nconst bit=bitReader(values);\nif(present)return(i)=>(present(i)?bit(i)===1:null);\nreturn(i)=>bit(i)===1;\n}\nif(kind==='multi'){\nif(present)return(i)=>(present(i)?multiValue(handle,i):null);\nreturn(i)=>multiValue(handle,i);\n}\nif(!values&&typeof handle.get==='function'){\nconst get=handle.get.bind(handle);\nreturn(i)=>{\nconst v=get(i);\nreturn v===undefined?null:v;\n};\n}\nif(present){\nreturn(i)=>{\nif(!present(i))return null;\nconst v=values[i];\nreturn v===undefined?null:v;\n};\n}\nreturn(i)=>{\nconst v=values[i];\nreturn v===undefined?null:v;\n};\n}\nfunction numericTotalOrder(a,b){\nif(a<b)return-1;\nif(a>b)return 1;\nif(a===b){\nconst na=Object.is(a,-0);\nconst nb=Object.is(b,-0);\nif(na===nb)return 0;\nreturn na?-1:1;\n}\nconst an=Number.isNaN(a);\nconst bn=Number.isNaN(b);\nif(an&&bn)return 0;\nreturn an?1:-1;\n}\nfunction valueComparator(locale){\nconst coll=collator(locale);\nreturn(a,b)=>{\nif(a===b)return 0;\nconst ta=typeof a;\nconst tb=typeof b;\nif(ta==='string'&&tb==='string')return coll.compare(a,b);\nif(ta==='number'&&tb==='number')return numericTotalOrder(a,b);\nif(ta==='boolean'&&tb==='boolean')return a===b?0:a?1:-1;\nif(a instanceof Date||b instanceof Date){\nconst na=a instanceof Date?a.getTime():Number(a);\nconst nb=b instanceof Date?b.getTime():Number(b);\nreturn numericTotalOrder(na,nb);\n}\nreturn defaultCompare(a,b);\n};\n}\nfunction dictRanks(dict,locale){\nif(dict&&typeof dict.ranks==='function')return dict.ranks(locale);\nconst table=dict&&typeof dict.values==='function'?dict.values():[];\nconst n=table.length;\nconst cmp=valueComparator(locale);\nconst order=new Array(n);\nfor(let i=0;i<n;i++)order[i]=i;\norder.sort((a,b)=>cmp(table[a],table[b])||a-b);\nconst ranks=new Uint32Array(n);\nfor(let r=0;r<n;r++)ranks[order[r]]=r;\nreturn ranks;\n}\nfunction isMissing(v){\nreturn v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v));\n}\n});\n__def(\"packages/core/src/compute/sort.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"radixSortFloat64\",{enumerable:true,get:function(){return radixSortFloat64;}});\nObject.defineProperty(__exports,\"radixSortInt32\",{enumerable:true,get:function(){return radixSortInt32;}});\nObject.defineProperty(__exports,\"rankSortDictionary\",{enumerable:true,get:function(){return rankSortDictionary;}});\nObject.defineProperty(__exports,\"mergeSortComparator\",{enumerable:true,get:function(){return mergeSortComparator;}});\nObject.defineProperty(__exports,\"sortColumn\",{enumerable:true,get:function(){return sortColumn;}});\nObject.defineProperty(__exports,\"sortMulti\",{enumerable:true,get:function(){return sortMulti;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst bitReader=__m0[\"bitReader\"];\nconst dictRanks=__m0[\"dictRanks\"];\nconst dictSize=__m0[\"dictSize\"];\nconst identity=__m0[\"identity\"];\nconst isMissing=__m0[\"isMissing\"];\nconst presenceReader=__m0[\"presenceReader\"];\nconst rowCount=__m0[\"rowCount\"];\nconst valueComparator=__m0[\"valueComparator\"];\nconst valueReader=__m0[\"valueReader\"];\nconst EMPTY_INDICES=new Uint32Array(0);\nconst SCRATCH=new ArrayBuffer(8);\nconst SCRATCH_F64=new Float64Array(SCRATCH);\nconst SCRATCH_U32=new Uint32Array(SCRATCH);\nconst HI=(()=>{\nSCRATCH_F64[0]=-1;\nreturn(SCRATCH_U32[1]&0x80000000)!==0?1:0;\n})();\nconst LO=HI===1?0:1;\nfunction transformDouble(value,out){\nSCRATCH_F64[0]=value;\nlet hi=SCRATCH_U32[HI];\nlet lo=SCRATCH_U32[LO];\nif((hi&0x80000000)!==0){\nhi=~hi>>>0;\nlo=~lo>>>0;\n}else{\nhi=(hi^0x80000000)>>>0;\n}\nout[0]=lo;\nout[1]=hi;\n}\nfunction radixLsd64(idx,lo,hi,n){\nif(n<2)return idx;\nconst hist=new Uint32Array(256*8);\nfor(let i=0;i<n;i++){\nconst l=lo[i];\nconst h=hi[i];\nhist[l&0xff]++;\nhist[256+((l>>>8)&0xff)]++;\nhist[512+((l>>>16)&0xff)]++;\nhist[768+((l>>>24)&0xff)]++;\nhist[1024+(h&0xff)]++;\nhist[1280+((h>>>8)&0xff)]++;\nhist[1536+((h>>>16)&0xff)]++;\nhist[1792+((h>>>24)&0xff)]++;\n}\nlet srcIdx=idx;\nlet srcLo=lo;\nlet srcHi=hi;\nlet dstIdx=new Uint32Array(n);\nlet dstLo=new Uint32Array(n);\nlet dstHi=new Uint32Array(n);\nconst offset=new Uint32Array(256);\nfor(let pass=0;pass<8;pass++){\nconst base=pass<<8;\nconst shift=(pass&3)<<3;\nconst useHi=pass>=4;\nlet skip=false;\nfor(let b=0;b<256;b++){\nif(hist[base+b]===n){skip=true;break;}\n}\nif(skip)continue;\nlet sum=0;\nfor(let b=0;b<256;b++){\noffset[b]=sum;\nsum+=hist[base+b];\n}\nfor(let i=0;i<n;i++){\nconst l=srcLo[i];\nconst h=srcHi[i];\nconst digit=((useHi?h:l)>>>shift)&0xff;\nconst p=offset[digit]++;\ndstIdx[p]=srcIdx[i];\ndstLo[p]=l;\ndstHi[p]=h;\n}\nlet t=srcIdx;srcIdx=dstIdx;dstIdx=t;\nt=srcLo;srcLo=dstLo;dstLo=t;\nt=srcHi;srcHi=dstHi;dstHi=t;\n}\nreturn srcIdx;\n}\nfunction radixLsd32(idx,keys,n){\nif(n<2)return idx;\nconst hist=new Uint32Array(256*4);\nfor(let i=0;i<n;i++){\nconst k=keys[i];\nhist[k&0xff]++;\nhist[256+((k>>>8)&0xff)]++;\nhist[512+((k>>>16)&0xff)]++;\nhist[768+((k>>>24)&0xff)]++;\n}\nlet srcIdx=idx;\nlet srcKeys=keys;\nlet dstIdx=new Uint32Array(n);\nlet dstKeys=new Uint32Array(n);\nconst offset=new Uint32Array(256);\nfor(let pass=0;pass<4;pass++){\nconst base=pass<<8;\nconst shift=pass<<3;\nlet skip=false;\nfor(let b=0;b<256;b++){\nif(hist[base+b]===n){skip=true;break;}\n}\nif(skip)continue;\nlet sum=0;\nfor(let b=0;b<256;b++){\noffset[b]=sum;\nsum+=hist[base+b];\n}\nfor(let i=0;i<n;i++){\nconst k=srcKeys[i];\nconst p=offset[(k>>>shift)&0xff]++;\ndstIdx[p]=srcIdx[i];\ndstKeys[p]=k;\n}\nlet t=srcIdx;srcIdx=dstIdx;dstIdx=t;\nt=srcKeys;srcKeys=dstKeys;dstKeys=t;\n}\nreturn srcIdx;\n}\nfunction countingSort(idx,keys,n,radix){\nconst counts=new Uint32Array(radix+1);\nfor(let i=0;i<n;i++)counts[keys[i]]++;\nlet sum=0;\nfor(let k=0;k<=radix;k++){\nconst c=counts[k];\ncounts[k]=sum;\nsum+=c;\n}\nconst out=new Uint32Array(n);\nfor(let i=0;i<n;i++)out[counts[keys[i]]++]=idx[i];\nreturn out;\n}\nfunction sortUint32Keys(idx,keys,n,radix){\nif(n<2)return idx;\nif(radix<=65536||radix<=n*2)return countingSort(idx,keys,n,radix);\nreturn radixLsd32(idx,keys,n);\n}\nfunction exact(buffer,n){\nif(buffer.length===n&&buffer.byteOffset===0)return buffer;\nreturn Uint32Array.prototype.slice.call(buffer,0,n);\n}\nfunction radixSortFloat64(values,order,descending=false){\nconst src=order||identity(values.length);\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst idx=new Uint32Array(n);\nconst lo=new Uint32Array(n);\nconst hi=new Uint32Array(n);\nconst nans=new Uint32Array(n);\nconst pair=new Uint32Array(2);\nlet m=0;\nlet nanCount=0;\nfor(let i=0;i<n;i++){\nconst row=src[i];\nconst v=values[row];\nif(Number.isNaN(v)){nans[nanCount++]=row;continue;}\ntransformDouble(v,pair);\nif(descending){\nlo[m]=~pair[0]>>>0;\nhi[m]=~pair[1]>>>0;\n}else{\nlo[m]=pair[0];\nhi[m]=pair[1];\n}\nidx[m++]=row;\n}\nconst sorted=radixLsd64(idx.subarray(0,m),lo.subarray(0,m),hi.subarray(0,m),m);\nif(nanCount===0)return exact(sorted,m);\nconst out=new Uint32Array(n);\nout.set(sorted.subarray(0,m),0);\nout.set(nans.subarray(0,nanCount),m);\nreturn out;\n}\nfunction radixSortInt32(values,order,descending=false){\nconst src=order||identity(values.length);\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst idx=Uint32Array.from(src);\nconst keys=new Uint32Array(n);\nfor(let i=0;i<n;i++){\nconst k=(values[idx[i]]^0x80000000)>>>0;\nkeys[i]=descending?(~k>>>0):k;\n}\nreturn exact(radixLsd32(idx,keys,n),n);\n}\nfunction rankSortDictionary(handle,order,opts={}){\nconst src=order||identity(rowCount(handle,opts));\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst ranks=dictRanks(handle.dict,opts.locale);\nconst codes=handle.values;\nconst present=presenceReader(handle);\nconst size=Math.max(dictSize(handle.dict),ranks.length);\nconst absentRank=size;\nconst idx=Uint32Array.from(src);\nconst keys=new Uint32Array(n);\nconst descending=!!opts.descending;\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nlet rank=present&&present(row)===0?absentRank:ranks[codes[row]];\nif(rank===undefined)rank=absentRank;\nkeys[i]=descending?absentRank-rank:rank;\n}\nreturn exact(sortUint32Keys(idx,keys,n,size+1),n);\n}\nfunction mergeSortComparator(values,order,compare){\nconst n=order.length;\nlet src=Uint32Array.from(order);\nif(n<2)return src;\nlet dst=new Uint32Array(n);\nfor(let width=1;width<n;width<<=1){\nfor(let start=0;start<n;start+=width<<1){\nconst mid=Math.min(start+width,n);\nconst end=Math.min(start+(width<<1),n);\nlet i=start;\nlet j=mid;\nlet k=start;\nwhile(i<mid&&j<end){\ndst[k++]=compare(values[src[i]],values[src[j]])<=0?src[i++]:src[j++];\n}\nwhile(i<mid)dst[k++]=src[i++];\nwhile(j<end)dst[k++]=src[j++];\n}\nconst t=src;src=dst;dst=t;\n}\nreturn src;\n}\nfunction sortBitsetColumn(handle,idx,descending){\nconst bit=bitReader(handle.values);\nconst n=idx.length;\nconst out=new Uint32Array(n);\nconst first=descending?1:0;\nlet k=0;\nfor(let i=0;i<n;i++)if(bit(idx[i])===first)out[k++]=idx[i];\nfor(let i=0;i<n;i++)if(bit(idx[i])!==first)out[k++]=idx[i];\nreturn out;\n}\nfunction indexableValues(handle,idx){\nconst values=handle.values;\nconst kind=handle.kind;\nconst direct=(kind==='object'||kind===undefined)&&(Array.isArray(values)||ArrayBuffer.isView(values));\nif(direct&&!handle.presence)return values;\nconst reader=valueReader(handle);\nconst materialised=new Array(rowCount(handle)||0);\nfor(let i=0;i<idx.length;i++){\nconst row=idx[i];\nmaterialised[row]=reader(row);\n}\nreturn materialised;\n}\nfunction sortByComparator(handle,idx,opts){\nconst values=indexableValues(handle,idx);\nconst base=valueComparator(opts.locale);\nconst compare=opts.descending?(a,b)=>base(b,a):base;\nreturn mergeSortComparator(values,idx,compare);\n}\nfunction sortByCompare(handle,idx,opts){\nconst values=indexableValues(handle,idx);\nconst user=opts.compare;\nconst descending=!!opts.descending;\nconst compare=descending\n?(a,b)=>-user(a,b,undefined,undefined,true)\n:(a,b)=>user(a,b,undefined,undefined,false);\nreturn mergeSortComparator(values,idx,compare);\n}\nfunction partitionPresent(handle,idx){\nconst n=idx.length;\nconst present=presenceReader(handle);\nconst values=handle.values;\nconst checkNaN=handle.kind==='float64'&&!!values;\nconst looseKind=handle.kind==='object'||handle.kind==='multi'||handle.kind===undefined;\nif(!present&&!checkNaN&&!looseKind)return{present:idx,absent:EMPTY_INDICES};\nconst keep=new Uint32Array(n);\nconst drop=new Uint32Array(n);\nlet p=0;\nlet a=0;\nif(present&&checkNaN){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(present(row)===1&&!Number.isNaN(values[row]))keep[p++]=row;else drop[a++]=row;\n}\n}else if(checkNaN&&!present){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(!Number.isNaN(values[row]))keep[p++]=row;else drop[a++]=row;\n}\n}else if(present&&!looseKind){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(present(row)===1)keep[p++]=row;else drop[a++]=row;\n}\n}else{\nconst reader=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(!isMissing(reader(row)))keep[p++]=row;else drop[a++]=row;\n}\n}\nif(a===0)return{present:idx,absent:EMPTY_INDICES};\nreturn{present:keep.subarray(0,p),absent:drop.subarray(0,a)};\n}\nfunction joinRuns(sorted,absent,nullsFirst){\nif(absent.length===0)return sorted;\nconst out=new Uint32Array(sorted.length+absent.length);\nif(nullsFirst){\nout.set(absent,0);\nout.set(sorted,absent.length);\n}else{\nout.set(sorted,0);\nout.set(absent,sorted.length);\n}\nreturn out;\n}\nfunction sortColumn(handle,order,opts={}){\nconst src=order||identity(rowCount(handle,opts));\nif(!handle||src.length<2)return Uint32Array.from(src);\nconst{present,absent}=partitionPresent(handle,src);\nif(present.length===0)return Uint32Array.from(src);\nconst descending=!!opts.descending;\nlet sorted;\nif(typeof opts.compare==='function'){\nsorted=sortByCompare(handle,present,opts);\n}else{\nswitch(handle.kind){\ncase'float64':\nsorted=radixSortFloat64(handle.values,present,descending);\nbreak;\ncase'int32':\nsorted=radixSortInt32(handle.values,present,descending);\nbreak;\ncase'dictionary':\nsorted=rankSortDictionary(handle,present,opts);\nbreak;\ncase'bitset':\nsorted=sortBitsetColumn(handle,present,descending);\nbreak;\ndefault:\nsorted=sortByComparator(handle,present,opts);\nbreak;\n}\n}\nreturn joinRuns(sorted,absent,!!opts.nullsFirst);\n}\nfunction sortMulti(handles,entries,order,opts={}){\nconst list=entries||[];\nconst first=(list.length&&(list[0].handle||byId(handles,list[0].col)))||(handles&&handles[0]);\nlet current=order||identity(rowCount(first,opts));\nfor(let i=list.length-1;i>=0;i--){\nconst entry=list[i];\nconst handle=entry.handle||byId(handles,entry.col)||(handles&&handles[i]);\nif(!handle)continue;\ncurrent=sortColumn(handle,current,{\ndescending:entry.descending!==undefined?!!entry.descending:entry.dir==='desc',\nnullsFirst:!!entry.nullsFirst,\nlocale:entry.locale!==undefined?entry.locale:opts.locale,\ncompare:entry.compare,\n});\n}\nreturn current instanceof Uint32Array?current:Uint32Array.from(current);\n}\nfunction byId(handles,id){\nif(!handles||id===undefined)return undefined;\nfor(let i=0;i<handles.length;i++)if(handles[i]&&handles[i].id===id)return handles[i];\nreturn undefined;\n}\n});\n__def(\"packages/core/src/format/date.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"scanPattern\",{enumerable:true,get:function(){return scanPattern;}});\nObject.defineProperty(__exports,\"toDate\",{enumerable:true,get:function(){return toDate;}});\nObject.defineProperty(__exports,\"compilePattern\",{enumerable:true,get:function(){return compilePattern;}});\nObject.defineProperty(__exports,\"compileDate\",{enumerable:true,get:function(){return compileDate;}});\nObject.defineProperty(__exports,\"toIsoDate\",{enumerable:true,get:function(){return toIsoDate;}});\nObject.defineProperty(__exports,\"toIsoDateTime\",{enumerable:true,get:function(){return toIsoDateTime;}});\nObject.defineProperty(__exports,\"compareIso\",{enumerable:true,get:function(){return compareIso;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isNil=__m0[\"isNil\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst TOKENS=[\n'yyyy','yy','MMMM','MMM','MM','M','dd','d',\n'EEEE','EEE','HH','H','hh','h','mm','m','ss','s','SSS','a',\n];\nfunction scanPattern(pattern){\nconst out=[];\nlet i=0;\nlet literal='';\nconst flush=()=>{if(literal){out.push({token:null,text:literal});literal='';}};\nwhile(i<pattern.length){\nconst ch=pattern[i];\nif(ch===\"'\"){\nif(pattern[i+1]===\"'\"){literal+=\"'\";i+=2;continue;}\nconst end=pattern.indexOf(\"'\",i+1);\nif(end===-1){literal+=pattern.slice(i+1);i=pattern.length;continue;}\nliteral+=pattern.slice(i+1,end);\ni=end+1;\ncontinue;\n}\nconst token=TOKENS.find((t)=>pattern.startsWith(t,i));\nif(token){flush();out.push({token,text:token});i+=token.length;continue;}\nif(/[A-Za-z]/.test(ch)){\nwarnOnce(\n`date.pattern.token:${ch}`,\n`the date pattern \"${pattern}\" contains '${ch}', which is not a supported token, `\n+'so it is rendered as text. Quote it as a literal to silence this. '\n+`Supported: ${TOKENS.join(' ')}.`,\n);\n}\nliteral+=ch;\ni+=1;\n}\nflush();\nreturn out;\n}\nconst WALL_CLOCK=/^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2}))?(?:\\.\\d+)?)?$/;\nfunction toDate(value){\nif(isNil(value)||value==='')return null;\nif(value instanceof Date)return Number.isNaN(value.getTime())?null:value;\nif(typeof value==='number')return Number.isNaN(value)?null:new Date(value);\nif(typeof value==='string'){\nconst wall=WALL_CLOCK.exec(value.trim());\nif(wall){\nconst[,y,mo,d,h='0',mi='0',sec='0']=wall;\nreturn new Date(+y,+mo-1,+d,+h,+mi,+sec);\n}\nconst d=new Date(value);\nreturn Number.isNaN(d.getTime())?null:d;\n}\nreturn null;\n}\nfunction pad(n,w){return String(n).padStart(w,'0');}\nfunction fieldReader(timeZone){\nif(!timeZone){\nreturn(d)=>({\nyear:d.getFullYear(),month:d.getMonth()+1,day:d.getDate(),\nhour:d.getHours(),minute:d.getMinutes(),second:d.getSeconds(),\nms:d.getMilliseconds(),weekday:d.getDay(),\n});\n}\nconst zoned=new Intl.DateTimeFormat('en-US',{\ntimeZone,year:'numeric',month:'2-digit',day:'2-digit',\nhour:'2-digit',minute:'2-digit',second:'2-digit',hour12:false,weekday:'short',\n});\nconst days={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};\nreturn(d)=>{\nconst f={year:0,month:1,day:1,hour:0,minute:0,second:0,ms:d.getMilliseconds(),weekday:0};\nfor(const part of zoned.formatToParts(d)){\nswitch(part.type){\ncase'year':f.year=Number(part.value);break;\ncase'month':f.month=Number(part.value);break;\ncase'day':f.day=Number(part.value);break;\ncase'hour':f.hour=Number(part.value)%24;break;\ncase'minute':f.minute=Number(part.value);break;\ncase'second':f.second=Number(part.value);break;\ncase'weekday':f.weekday=days[part.value]??0;break;\ndefault:break;\n}\n}\nreturn f;\n};\n}\nfunction compilePattern(pattern,locale,timeZone){\nconst segments=scanPattern(pattern);\nconst read=fieldReader(timeZone);\nconst used=new Set(segments.filter((s)=>s.token).map((s)=>s.token));\nconst monthShort=used.has('MMM')?new Intl.DateTimeFormat(locale,{month:'short',timeZone}):null;\nconst monthLong=used.has('MMMM')?new Intl.DateTimeFormat(locale,{month:'long',timeZone}):null;\nconst dayShort=used.has('EEE')?new Intl.DateTimeFormat(locale,{weekday:'short',timeZone}):null;\nconst dayLong=used.has('EEEE')?new Intl.DateTimeFormat(locale,{weekday:'long',timeZone}):null;\nreturn(d)=>{\nconst f=read(d);\nlet out='';\nfor(const seg of segments){\nif(!seg.token){out+=seg.text;continue;}\nswitch(seg.token){\ncase'yyyy':out+=pad(f.year,4);break;\ncase'yy':out+=pad(f.year%100,2);break;\ncase'MMMM':out+=monthLong.format(d);break;\ncase'MMM':out+=monthShort.format(d);break;\ncase'MM':out+=pad(f.month,2);break;\ncase'M':out+=String(f.month);break;\ncase'dd':out+=pad(f.day,2);break;\ncase'd':out+=String(f.day);break;\ncase'EEEE':out+=dayLong.format(d);break;\ncase'EEE':out+=dayShort.format(d);break;\ncase'HH':out+=pad(f.hour,2);break;\ncase'H':out+=String(f.hour);break;\ncase'hh':out+=pad(f.hour%12===0?12:f.hour%12,2);break;\ncase'h':out+=String(f.hour%12===0?12:f.hour%12);break;\ncase'mm':out+=pad(f.minute,2);break;\ncase'm':out+=String(f.minute);break;\ncase'ss':out+=pad(f.second,2);break;\ncase's':out+=String(f.second);break;\ncase'SSS':out+=pad(f.ms,3);break;\ncase'a':out+=f.hour<12?'AM':'PM';break;\ndefault:out+=seg.text;break;\n}\n}\nreturn out;\n};\n}\nconst UNITS=[\n['year',365*24*3600e3],\n['month',30*24*3600e3],\n['week',7*24*3600e3],\n['day',24*3600e3],\n['hour',3600e3],\n['minute',60e3],\n['second',1e3],\n];\nfunction compileDate(spec,locale){\nconst s=spec||{};\nconst loc=s.locale||locale||undefined;\nconst nullDisplay=s.nullDisplay??'';\nconst timeZone=s.timeZone;\nlet absolute;\nif(s.pattern){\nabsolute=compilePattern(s.pattern,loc,timeZone);\n}else if(s.dateStyle||s.timeStyle){\nconst opts={timeZone};\nif(s.dateStyle)opts.dateStyle=s.dateStyle;\nif(s.timeStyle)opts.timeStyle=s.timeStyle;\nconst dtf=new Intl.DateTimeFormat(loc,opts);\nabsolute=(d)=>dtf.format(d);\n}else{\nconst dtf=new Intl.DateTimeFormat(loc,{dateStyle:'medium',timeZone});\nabsolute=(d)=>dtf.format(d);\n}\nconst relative=s.relative?new Intl.RelativeTimeFormat(loc,{numeric:'auto'}):null;\nconst thresholdDays=typeof s.relative==='object'&&s.relative\n?(s.relative.threshold??7)\n:7;\nconst thresholdMs=thresholdDays*24*3600e3;\nconst format=(value,params)=>{\nconst d=toDate(value);\nif(!d)return nullDisplay;\nif(relative){\nconst now=params&&typeof params.now==='number'?params.now:Date.now();\nconst delta=d.getTime()-now;\nif(Math.abs(delta)<thresholdMs){\nfor(const[unit,ms]of UNITS){\nif(Math.abs(delta)>=ms||unit==='second'){\nreturn relative.format(Math.round(delta/ms),unit);\n}\n}\n}\n}\nreturn absolute(d);\n};\nformat.spec=s;\nreturn format;\n}\nfunction toIsoDate(value){\nif(isNil(value)||value==='')return null;\nif(typeof value==='string'){\nconst match=/^(\\d{4}-\\d{2}-\\d{2})/.exec(value.trim());\nif(match)return match[1];\nconst parsed=toDate(value);\nreturn parsed?toIsoDate(parsed):null;\n}\nconst date=toDate(value);\nif(!date)return null;\nconst pad=(n)=>String(n).padStart(2,'0');\nreturn`${date.getFullYear()}-${pad(date.getMonth()+1)}-${pad(date.getDate())}`;\n}\nfunction toIsoDateTime(value,timeZone){\nif(isNil(value)||value==='')return null;\nif(typeof value==='string'){\nconst text=value.trim();\nif(ZONE_SUFFIX.test(text)){\nconst instant=toDate(text);\nreturn instant?wallClockIn(instant,timeZone):null;\n}\nconst match=/^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}):(\\d{2})(?::(\\d{2}))?/.exec(text);\nif(match){\nconst[,day,hour,minute,second]=match;\nreturn`${day}T${hour}:${minute}${second&&second!=='00'?`:${second}`:''}`;\n}\nif(/^\\d{4}-\\d{2}-\\d{2}$/.test(text))return`${text}T00:00`;\nconst parsed=toDate(text);\nreturn parsed?toIsoDateTime(parsed):null;\n}\nconst date=toDate(value);\nif(!date)return null;\nreturn wallClockIn(date,timeZone);\n}\nconst ZONE_SUFFIX=/(?:Z|[+-]\\d{2}:?\\d{2})$/i;\nfunction wallClockIn(date,timeZone){\nconst pad=(n)=>String(n).padStart(2,'0');\nif(timeZone){\ntry{\nconst parts=new Intl.DateTimeFormat('en-CA',{\ntimeZone,\nyear:'numeric',month:'2-digit',day:'2-digit',\nhour:'2-digit',minute:'2-digit',second:'2-digit',\nhour12:false,\n}).formatToParts(date).reduce((out,part)=>{\nif(part.type!=='literal')out[part.type]=part.value;\nreturn out;\n},{});\nconst hour=parts.hour==='24'?'00':parts.hour;\nconst seconds=Number(parts.second);\nreturn`${parts.year}-${parts.month}-${parts.day}T${hour}:${parts.minute}`\n+(seconds?`:${parts.second}`:'');\n}catch{\n}\n}\nconst day=`${date.getFullYear()}-${pad(date.getMonth()+1)}-${pad(date.getDate())}`;\nconst seconds=date.getSeconds();\nconst clock=`${pad(date.getHours())}:${pad(date.getMinutes())}${seconds?`:${pad(seconds)}`:''}`;\nreturn`${day}T${clock}`;\n}\nfunction compareIso(a,b){\nconst left=isNil(a)||a===''?null:String(a);\nconst right=isNil(b)||b===''?null:String(b);\nif(left===null)return right===null?0:1;\nif(right===null)return-1;\nreturn left<right?-1:left>right?1:0;\n}\n});\n__def(\"packages/core/src/compute/filter.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"releaseMask\",{enumerable:true,get:function(){return releaseMask;}});\nObject.defineProperty(__exports,\"compilePredicate\",{enumerable:true,get:function(){return compilePredicate;}});\nObject.defineProperty(__exports,\"testValue\",{enumerable:true,get:function(){return testValue;}});\nObject.defineProperty(__exports,\"evaluateCondition\",{enumerable:true,get:function(){return evaluateCondition;}});\nObject.defineProperty(__exports,\"evaluateFilters\",{enumerable:true,get:function(){return evaluateFilters;}});\nObject.defineProperty(__exports,\"pruneColumn\",{enumerable:true,get:function(){return pruneColumn;}});\nObject.defineProperty(__exports,\"mentionsColumn\",{enumerable:true,get:function(){return mentionsColumn;}});\nObject.defineProperty(__exports,\"compact\",{enumerable:true,get:function(){return compact;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isBlank=__m0[\"isBlank\"];\nconst toArray=__m0[\"toArray\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/format/date.js\");\nconst toIsoDate=__m1[\"toIsoDate\"];\nconst __m2=__req(\"packages/core/src/compute/handle.js\");\nconst bitReader=__m2[\"bitReader\"];\nconst dictSize=__m2[\"dictSize\"];\nconst dictValue=__m2[\"dictValue\"];\nconst presenceReader=__m2[\"presenceReader\"];\nconst valueComparator=__m2[\"valueComparator\"];\nconst valueReader=__m2[\"valueReader\"];\nconst ISO_DAY=/^\\d{4}-\\d{2}-\\d{2}$/;\nconst NULL_KEY='\\u0000null\\u0000';\nfunction acquireMask(ctx,n){\nconst pool=ctx&&ctx.pool;\nif(pool){\nconst take=pool.mask||pool.acquireMask||pool.acquire||pool.take;\nif(typeof take==='function'){\nconst mask=take.call(pool,n);\nif(mask&&mask.length>=n)return mask;\n}\n}\nreturn new Uint8Array(n);\n}\nfunction releaseMask(ctx,mask){\nconst pool=ctx&&ctx.pool;\nif(!pool||!mask)return;\nconst give=pool.release||pool.releaseMask||pool.free||pool.recycle;\nif(typeof give==='function')give.call(pool,mask);\n}\nfunction fillMask(mask,n,value){\nmask.fill(value,0,n);\nreturn mask;\n}\nfunction unorderable(v){\nreturn v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v));\n}\nfunction coerceTarget(value,type){\nif(value===null||value===undefined)return value;\nif(type==='number')return typeof value==='number'?value:Number(value);\nif(type==='date'||type==='dateString'){\nconst iso=toIsoDate(value);\nreturn iso===null?toMillis(value):iso;\n}\nif(type==='boolean'){\nif(typeof value==='boolean')return value;\nif(value==='true'||value===1)return true;\nif(value==='false'||value===0)return false;\nreturn!!value;\n}\nreturn value;\n}\nfunction toMillis(value){\nif(value instanceof Date)return value.getTime();\nif(typeof value==='number')return value;\nreturn Date.parse(String(value));\n}\nfunction toNumber(value){\nif(typeof value==='number')return value;\nif(value instanceof Date)return value.getTime();\nif(value===null||value===undefined||value==='')return NaN;\nreturn Number(value);\n}\nfunction textOf(v,caseSensitive){\nconst s=typeof v==='string'?v:String(v);\nreturn caseSensitive?s:s.toLowerCase();\n}\nfunction setKey(v,caseSensitive){\nif(v===null||v===undefined)return NULL_KEY;\nif(typeof v==='string')return caseSensitive?v:v.toLowerCase();\nif(v instanceof Date)return v.getTime();\nreturn v;\n}\nfunction buildSet(value,caseSensitive,type){\nconst set=new Set();\nfor(const raw of toArray(value)){\nconst entry=coerceTarget(raw,type);\nset.add(setKey(entry,caseSensitive));\nif(typeof entry==='string'&&entry!==''&&Number.isFinite(Number(entry)))set.add(Number(entry));\nelse if(typeof entry==='number'&&Number.isFinite(entry))set.add(setKey(String(entry),caseSensitive));\n}\nreturn set;\n}\nfunction valueEquals(a,b,caseSensitive){\nif(a===null||a===undefined||b===null||b===undefined){\nreturn(a===null||a===undefined)&&(b===null||b===undefined);\n}\nconst ta=typeof a;\nconst tb=typeof b;\nif(ta==='string'&&tb==='string')return caseSensitive?a===b:a.toLowerCase()===b.toLowerCase();\nif(a instanceof Date||b instanceof Date)return toMillis(a)===toMillis(b);\nif(ta==='number'&&tb==='number')return a===b||(Number.isNaN(a)&&Number.isNaN(b));\nif(ta==='number'&&tb==='string')return a===Number(b);\nif(ta==='string'&&tb==='number')return Number(a)===b;\nif(ta==='boolean'||tb==='boolean')return a===b;\nif(Array.isArray(a)&&Array.isArray(b)){\nreturn a.length===b.length&&a.every((x,i)=>valueEquals(x,b[i],caseSensitive));\n}\nreturn a===b;\n}\nfunction compileRegExp(value,caseSensitive){\ntry{\nif(value instanceof RegExp){\nconst flags=value.flags.replace(/[gy]/g,'');\nreturn new RegExp(value.source,caseSensitive?flags:flags.includes('i')?flags:`${flags}i`);\n}\nreturn new RegExp(String(value),caseSensitive?'':'i');\n}catch(err){\nwarnOnce(`regex:${String(value)}`,`filter operator \"matches\" received an invalid pattern: ${String(value)}`,err);\nreturn null;\n}\n}\nfunction compilePredicate(condition,locale){\nconst predicate=compileValuePredicate(condition,locale);\nconst type=condition&&condition.type;\nif(type!=='date'&&type!=='dateString')return predicate;\nreturn(v)=>predicate(typeof v==='string'&&ISO_DAY.test(v)?v:(toIsoDate(v)??v));\n}\nfunction compileValuePredicate(condition,locale){\nconst op=condition&&condition.op;\nconst caseSensitive=!!(condition&&condition.caseSensitive);\nconst type=condition&&condition.type;\nconst cmp=valueComparator(locale);\nconst not=(p)=>(v)=>!p(v);\nswitch(op){\ncase'eq':{\nconst target=coerceTarget(condition.value,type);\nreturn(v)=>valueEquals(v,target,caseSensitive);\n}\ncase'ne':{\nconst target=coerceTarget(condition.value,type);\nreturn(v)=>!valueEquals(v,target,caseSensitive);\n}\ncase'lt':case'lte':case'gt':case'gte':{\nconst target=coerceTarget(condition.value,type);\nif(unorderable(target))return()=>false;\nconst want=op==='lt'?-1:op==='lte'?0:op==='gt'?1:2;\nreturn(v)=>{\nif(unorderable(v))return false;\nconst c=cmp(v,target);\nreturn want===-1?c<0:want===0?c<=0:want===1?c>0:c>=0;\n};\n}\ncase'between':case'notBetween':{\nconst pair=toArray(condition.value);\nconst lo=coerceTarget(pair[0],type);\nconst hi=coerceTarget(pair[1],type);\nconst bounds=condition.bounds||'[]';\nconst loInclusive=bounds.charAt(0)!=='(';\nconst hiInclusive=bounds.charAt(1)!==')';\nif(unorderable(lo)||unorderable(hi))return op==='between'?()=>false:()=>true;\nconst inRange=(v)=>{\nif(unorderable(v))return false;\nconst a=cmp(v,lo);\nconst b=cmp(v,hi);\nreturn(loInclusive?a>=0:a>0)&&(hiInclusive?b<=0:b<0);\n};\nreturn op==='between'?inRange:not(inRange);\n}\ncase'in':case'notIn':{\nconst set=buildSet(condition.value,caseSensitive,type);\nconst member=(v)=>set.has(setKey(v,caseSensitive));\nreturn op==='in'?member:not(member);\n}\ncase'contains':case'notContains':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nconst has=(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).includes(needle));\nreturn op==='contains'?has:not(has);\n}\ncase'startsWith':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nreturn(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).startsWith(needle));\n}\ncase'endsWith':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nreturn(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).endsWith(needle));\n}\ncase'matches':{\nconst re=compileRegExp(condition.value,caseSensitive);\nif(!re)return()=>false;\nreturn(v)=>(v===null||v===undefined?false:re.test(String(v)));\n}\ncase'blank':\nreturn(v)=>isBlank(v)||(Array.isArray(v)&&v.length===0);\ncase'notBlank':\nreturn(v)=>!(isBlank(v)||(Array.isArray(v)&&v.length===0));\ncase'containsAny':case'containsNone':{\nconst set=buildSet(condition.value,caseSensitive,type);\nconst any=(v)=>{\nconst list=v===null||v===undefined?[]:toArray(v);\nfor(let i=0;i<list.length;i++)if(set.has(setKey(list[i],caseSensitive)))return true;\nreturn false;\n};\nreturn op==='containsAny'?any:not(any);\n}\ncase'containsAll':{\nconst wanted=toArray(condition.value).map((x)=>setKey(coerceTarget(x,type),caseSensitive));\nreturn(v)=>{\nconst list=v===null||v===undefined?[]:toArray(v);\nif(wanted.length===0)return true;\nconst have=new Set(list.map((x)=>setKey(x,caseSensitive)));\nfor(let i=0;i<wanted.length;i++)if(!have.has(wanted[i]))return false;\nreturn true;\n};\n}\ndefault:\nwarnOnce(`op:${String(op)}`,`unknown filter operator \"${String(op)}\"; the condition passes every row`);\nreturn()=>true;\n}\n}\nfunction testValue(value,condition,locale){\nreturn compilePredicate(condition,locale)(value);\n}\nfunction presenceCondition(handle,wantPresent,mask,count){\nconst present=presenceReader(handle);\nif(present){\nconst target=wantPresent?1:0;\nfor(let i=0;i<count;i++)mask[i]=present(i)===target?1:0;\nreturn mask;\n}\nconst kind=handle.kind;\nif(kind==='float64'||kind==='int32'||kind==='bitset'){\nreturn fillMask(mask,count,wantPresent?1:0);\n}\nconst read=valueReader(handle);\nfor(let i=0;i<count;i++){\nconst v=read(i);\nconst blank=isBlank(v)||(Array.isArray(v)&&v.length===0);\nmask[i]=blank===wantPresent?0:1;\n}\nreturn mask;\n}\nfunction dictionaryCondition(handle,pred,mask,count){\nconst dict=handle.dict;\nconst size=dictSize(dict);\nconst allowed=new Uint8Array(size);\nfor(let code=0;code<size;code++)allowed[code]=pred(dictValue(dict,code))?1:0;\nconst codes=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<count;i++)mask[i]=allowed[codes[i]];\nreturn mask;\n}\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++)mask[i]=present(i)===1?allowed[codes[i]]:absentAnswer;\nreturn mask;\n}\nfunction booleanCondition(handle,pred,mask,count){\nconst bit=bitReader(handle.values);\nconst whenTrue=pred(true)?1:0;\nconst whenFalse=pred(false)?1:0;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<count;i++)mask[i]=bit(i)===1?whenTrue:whenFalse;\nreturn mask;\n}\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++){\nmask[i]=present(i)===0?absentAnswer:(bit(i)===1?whenTrue:whenFalse);\n}\nreturn mask;\n}\nfunction numericCondition(handle,condition,pred,mask,count){\nconst values=handle.values;\nconst type=condition.type;\nconst op=condition.op;\nlet handled=true;\nswitch(op){\ncase'eq':case'ne':{\nconst target=toNumber(coerceTarget(condition.value,type));\nconst wantNaN=typeof condition.value==='number'&&Number.isNaN(condition.value);\nconst invert=op==='ne'?1:0;\nif(wantNaN){\nfor(let i=0;i<count;i++)mask[i]=(Number.isNaN(values[i])?1:0)^invert;\n}else{\nfor(let i=0;i<count;i++)mask[i]=((values[i]===target)?1:0)^invert;\n}\nbreak;\n}\ncase'lt':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]<t?1:0;\nbreak;\n}\ncase'lte':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]<=t?1:0;\nbreak;\n}\ncase'gt':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]>t?1:0;\nbreak;\n}\ncase'gte':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]>=t?1:0;\nbreak;\n}\ncase'between':case'notBetween':{\nconst pair=toArray(condition.value);\nconst lo=toNumber(coerceTarget(pair[0],type));\nconst hi=toNumber(coerceTarget(pair[1],type));\nconst bounds=condition.bounds||'[]';\nconst loInclusive=bounds.charAt(0)!=='(';\nconst hiInclusive=bounds.charAt(1)!==')';\nconst invert=op==='notBetween'?1:0;\nif(loInclusive&&hiInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>=lo)&(values[i]<=hi))?1:0)^invert;\n}else if(loInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>=lo)&(values[i]<hi))?1:0)^invert;\n}else if(hiInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>lo)&(values[i]<=hi))?1:0)^invert;\n}else{\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>lo)&(values[i]<hi))?1:0)^invert;\n}\nbreak;\n}\ncase'in':case'notIn':{\nconst set=new Set();\nfor(const raw of toArray(condition.value)){\nconst n=toNumber(coerceTarget(raw,type));\nif(!Number.isNaN(n))set.add(n);\n}\nconst invert=op==='notIn'?1:0;\nfor(let i=0;i<count;i++)mask[i]=(set.has(values[i])?1:0)^invert;\nbreak;\n}\ndefault:\nhandled=false;\nbreak;\n}\nif(!handled)return false;\nconst present=presenceReader(handle);\nif(present){\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++)if(present(i)===0)mask[i]=absentAnswer;\n}\nreturn true;\n}\nfunction genericCondition(handle,pred,mask,count){\nconst read=valueReader(handle);\nfor(let i=0;i<count;i++)mask[i]=pred(read(i))?1:0;\nreturn mask;\n}\nfunction evaluateCondition(condition,ctx,out){\nconst count=ctx.count|0;\nconst mask=out||acquireMask(ctx,count);\nif(!condition)return fillMask(mask,count,1);\nconst handle=typeof ctx.handle==='function'?ctx.handle(condition.col):undefined;\nconst custom=typeof ctx.custom==='function'?ctx.custom:null;\nif(!handle){\nif(custom){\nfor(let i=0;i<count;i++)mask[i]=custom(condition,i)?1:0;\nreturn mask;\n}\nwarnOnce(`filter:col:${String(condition.col)}`,\n`filter references unknown column \"${String(condition.col)}\"; the condition passes every row`);\nreturn fillMask(mask,count,1);\n}\nconst op=condition.op;\nif(op==='blank'||op==='notBlank')return presenceCondition(handle,op==='notBlank',mask,count);\nconst pred=compilePredicate(condition,ctx.locale);\nswitch(handle.kind){\ncase'dictionary':\nreturn dictionaryCondition(handle,pred,mask,count);\ncase'bitset':\nreturn booleanCondition(handle,pred,mask,count);\ncase'float64':case'int32':\nif(numericCondition(handle,condition,pred,mask,count))return mask;\nreturn genericCondition(handle,pred,mask,count);\ndefault:\nreturn genericCondition(handle,pred,mask,count);\n}\n}\nfunction evaluateNode(node,ctx,count){\nif(!node)return fillMask(acquireMask(ctx,count),count,1);\nif(Array.isArray(node.conditions)){\nconst children=node.conditions.filter((c)=>c!=null);\nconst op=node.op==='or'?'or':node.op==='not'?'not':'and';\nif(children.length===0)return fillMask(acquireMask(ctx,count),count,1);\nconst acc=evaluateNode(children[0],ctx,count);\nfor(let k=1;k<children.length;k++){\nconst rhs=evaluateNode(children[k],ctx,count);\nif(op==='or')for(let i=0;i<count;i++)acc[i]|=rhs[i];\nelse for(let i=0;i<count;i++)acc[i]&=rhs[i];\nreleaseMask(ctx,rhs);\n}\nif(op==='not')for(let i=0;i<count;i++)acc[i]^=1;\nreturn acc;\n}\nreturn evaluateCondition(node,ctx,acquireMask(ctx,count));\n}\nfunction evaluateFilters(filters,ctx){\nreturn evaluateNode(filters,ctx,ctx.count|0);\n}\nfunction pruneColumn(filters,colId){\nif(!filters||!colId)return filters||null;\nconst node=(filters);\nif(Array.isArray(node.conditions)){\nconst op=node.op==='or'?'or':node.op==='not'?'not':'and';\nif(op!=='and'){\nreturn mentionsColumn(node,colId)?null:filters;\n}\nconst kept=[];\nfor(const child of node.conditions){\nconst pruned=pruneColumn(child,colId);\nif(pruned)kept.push(pruned);\n}\nif(!kept.length)return null;\nreturn{...node,op:'and',conditions:kept};\n}\nreturn node.col===colId?null:filters;\n}\nfunction mentionsColumn(filters,colId){\nif(!filters||typeof filters!=='object')return false;\nconst node=(filters);\nif(node.col===colId)return true;\nif(Array.isArray(node.conditions)){\nfor(const child of node.conditions)if(mentionsColumn(child,colId))return true;\n}\nreturn false;\n}\nfunction compact(mask,count,out){\nif(out&&out.length>=count){\nlet k=0;\nfor(let i=0;i<count;i++)if(mask[i])out[k++]=i;\nreturn out.subarray(0,k);\n}\nlet survivors=0;\nfor(let i=0;i<count;i++)survivors+=mask[i]?1:0;\nconst result=new Uint32Array(survivors);\nlet k=0;\nfor(let i=0;i<count;i++)if(mask[i])result[k++]=i;\nreturn result;\n}\n});\n__def(\"packages/core/src/compute/group.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"packKeys\",{enumerable:true,get:function(){return packKeys;}});\nObject.defineProperty(__exports,\"groupByColumns\",{enumerable:true,get:function(){return groupByColumns;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst dictSize=__m0[\"dictSize\"];\nconst identity=__m0[\"identity\"];\nconst presenceReader=__m0[\"presenceReader\"];\nconst rowCount=__m0[\"rowCount\"];\nconst valueReader=__m0[\"valueReader\"];\nconst KEY_SEPARATOR='\\u001F';\nconst NULL_MARKER='\\u0000';\nconst MAX_DIRECT_COUNTS=1<<20;\nfunction packKeys(handles,idx,n){\nconst k=handles.length;\nconst readers=handles.map((h)=>valueReader(h));\nconst allDictionary=k>0&&handles.every((h)=>h&&h.kind==='dictionary'&&h.dict);\nif(allDictionary){\nconst cards=handles.map((h)=>dictSize(h.dict)+1);\nlet product=1;\nfor(let j=0;j<k;j++)product*=cards[j];\nif(product<=Number.MAX_SAFE_INTEGER){\nconst codes=handles.map((h)=>h.values);\nconst presence=handles.map((h)=>presenceReader(h));\nconst keyOf=(row)=>{\nlet key=0;\nfor(let j=0;j<k;j++){\nconst present=presence[j];\nconst code=present&&present(row)===0?cards[j]-1:codes[j][row];\nkey=key*cards[j]+code;\n}\nreturn key;\n};\nconst packed=new Float64Array(n);\nfor(let i=0;i<n;i++)packed[i]=keyOf(idx[i]);\nreturn{packed,strings:null,product,readers,keyOf};\n}\n}\nconst keyOf=(row)=>{\nlet key='';\nfor(let j=0;j<k;j++){\nconst v=readers[j](row);\nkey+=(j===0?'':KEY_SEPARATOR)+(v===null||v===undefined?NULL_MARKER:String(v));\n}\nreturn key;\n};\nconst strings=new Array(n);\nfor(let i=0;i<n;i++)strings[i]=keyOf(idx[i]);\nreturn{packed:null,strings,product:Infinity,readers,keyOf};\n}\nfunction scatterBuckets(idx,ids,n,groups){\nconst offsets=new Uint32Array(groups+1);\nfor(let i=0;i<n;i++)offsets[ids[i]+1]++;\nfor(let g=0;g<groups;g++)offsets[g+1]+=offsets[g];\nconst scattered=new Uint32Array(n);\nconst cursor=offsets.slice(0,groups);\nfor(let i=0;i<n;i++)scattered[cursor[ids[i]]++]=idx[i];\nconst buckets=new Array(groups);\nfor(let g=0;g<groups;g++)buckets[g]=scattered.subarray(offsets[g],offsets[g+1]);\nreturn buckets;\n}\nfunction groupByColumns(handles,order,opts={}){\nconst list=handles||[];\nconst idx=order||identity(rowCount(list[0],opts));\nconst n=idx.length;\nif(list.length===0||n===0)return{keys:[],buckets:[]};\nconst{packed,strings,product,readers}=packKeys(list,idx,n);\nconst ids=new Uint32Array(n);\nlet groups=0;\nlet packedKeys=null;\nif(packed&&product<=Math.max(1024,Math.min(MAX_DIRECT_COUNTS,n*4))){\nconst size=product;\nconst seen=new Int32Array(size).fill(-1);\nfor(let i=0;i<n;i++)seen[packed[i]]=0;\nfor(let key=0;key<size;key++)if(seen[key]===0)seen[key]=groups++;\nfor(let i=0;i<n;i++)ids[i]=seen[packed[i]];\npackedKeys=new Float64Array(groups);\nfor(let key=0;key<size;key++)if(seen[key]>=0)packedKeys[seen[key]]=key;\n}else if(packed){\nconst seen=new Map();\nfor(let i=0;i<n;i++){\nconst key=packed[i];\nlet id=seen.get(key);\nif(id===undefined){id=groups++;seen.set(key,id);}\nids[i]=id;\n}\npackedKeys=new Float64Array(groups);\nfor(const[key,id]of seen)packedKeys[id]=key;\n}else{\nconst seen=new Map();\nfor(let i=0;i<n;i++){\nconst key=strings[i];\nlet id=seen.get(key);\nif(id===undefined){id=groups++;seen.set(key,id);}\nids[i]=id;\n}\n}\nconst buckets=scatterBuckets(idx,ids,n,groups);\nconst keys=new Array(groups);\nfor(let g=0;g<groups;g++){\nconst row=buckets[g][0];\nconst tuple=new Array(readers.length);\nfor(let j=0;j<readers.length;j++)tuple[j]=readers[j](row);\nkeys[g]=tuple;\n}\nconst result={keys,buckets};\nif(packedKeys)result.packed=packedKeys;\nreturn result;\n}\n});\n__def(\"packages/core/src/compute/facet.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"STRATEGIES\",{enumerable:true,get:function(){return STRATEGIES;}});\nObject.defineProperty(__exports,\"GRANULARITIES\",{enumerable:true,get:function(){return GRANULARITIES;}});\nObject.defineProperty(__exports,\"DEFAULT_BUCKETS\",{enumerable:true,get:function(){return DEFAULT_BUCKETS;}});\nObject.defineProperty(__exports,\"DEFAULT_CARDINALITY_LIMIT\",{enumerable:true,get:function(){return DEFAULT_CARDINALITY_LIMIT;}});\nObject.defineProperty(__exports,\"QUANTILE_SAMPLE\",{enumerable:true,get:function(){return QUANTILE_SAMPLE;}});\nObject.defineProperty(__exports,\"facetKind\",{enumerable:true,get:function(){return facetKind;}});\nObject.defineProperty(__exports,\"orderedReader\",{enumerable:true,get:function(){return orderedReader;}});\nObject.defineProperty(__exports,\"toNumeric\",{enumerable:true,get:function(){return toNumeric;}});\nObject.defineProperty(__exports,\"cardinalityOf\",{enumerable:true,get:function(){return cardinalityOf;}});\nObject.defineProperty(__exports,\"pickGranularity\",{enumerable:true,get:function(){return pickGranularity;}});\nObject.defineProperty(__exports,\"floorTo\",{enumerable:true,get:function(){return floorTo;}});\nObject.defineProperty(__exports,\"advance\",{enumerable:true,get:function(){return advance;}});\nObject.defineProperty(__exports,\"computeBounds\",{enumerable:true,get:function(){return computeBounds;}});\nObject.defineProperty(__exports,\"countInto\",{enumerable:true,get:function(){return countInto;}});\nObject.defineProperty(__exports,\"bucketOf\",{enumerable:true,get:function(){return bucketOf;}});\nObject.defineProperty(__exports,\"facet\",{enumerable:true,get:function(){return facet;}});\nObject.defineProperty(__exports,\"default\",{enumerable:true,get:function(){return __default;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m0[\"presenceReader\"];\nconst valueReader=__m0[\"valueReader\"];\nconst dictSize=__m0[\"dictSize\"];\nconst dictValue=__m0[\"dictValue\"];\nconst STRATEGIES=Object.freeze(['equal','quantile','log']);\nconst GRANULARITIES=Object.freeze(['hour','day','week','month','quarter','year']);\nconst DEFAULT_BUCKETS=20;\nconst DEFAULT_CARDINALITY_LIMIT=50;\nconst QUANTILE_SAMPLE=10_000;\nfunction facetKind(handle,type){\nif(!handle)return'none';\nconst base=type&&type.base;\nif(base==='date'||base==='datetime'||base==='time'||base==='dateString')return'date';\nswitch(handle.kind){\ncase'bitset':return'boolean';\ncase'float64':case'int32':return'numeric';\ncase'dictionary':return'category';\ncase'multi':return'category';\ndefault:\nif(base==='number')return'numeric';\nif(base==='boolean')return'boolean';\nif(base==='text')return'category';\nreturn'none';\n}\n}\nfunction orderedReader(handle){\nconst values=handle.values;\nconst kind=handle.kind;\nif((kind==='float64'||kind==='int32')&&values)return(i)=>values[i];\nconst read=valueReader(handle);\nreturn(i)=>toNumeric(read(i));\n}\nfunction toNumeric(v){\nif(typeof v==='number')return v;\nif(v instanceof Date)return v.getTime();\nif(v===null||v===undefined||v==='')return NaN;\nif(typeof v==='boolean')return v?1:0;\nif(typeof v==='string'){\nconst n=Number(v);\nif(Number.isFinite(n))return n;\nconst t=Date.parse(v);\nreturn Number.isFinite(t)?t:NaN;\n}\nreturn NaN;\n}\nfunction cardinalityOf(handle,indices,count,limit=DEFAULT_CARDINALITY_LIMIT){\nif(!handle)return{cardinality:0,exact:true};\nif(handle.dict)return{cardinality:dictSize(handle.dict),exact:true};\nif(handle.kind==='bitset')return{cardinality:2,exact:true};\nconst read=valueReader(handle);\nconst n=indices?indices.length:count;\nconst seen=new Set();\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined)continue;\nseen.add(v);\nif(seen.size>limit)return{cardinality:seen.size,exact:false};\n}\nreturn{cardinality:seen.size,exact:true};\n}\nconst HOUR_MS=3600_000;\nconst DAY_MS=86_400_000;\nfunction pickGranularity(span,target=DEFAULT_BUCKETS){\nconst ms=Number.isFinite(span)&&span>0?span:0;\nconst wide=Math.max(1,target)*2;\nif(ms/HOUR_MS<=wide)return'hour';\nif(ms/DAY_MS<=wide)return'day';\nif(ms/(7*DAY_MS)<=wide)return'week';\nif(ms/(30*DAY_MS)<=wide)return'month';\nif(ms/(91*DAY_MS)<=wide)return'quarter';\nreturn'year';\n}\nfunction floorTo(ms,granularity){\nif(!Number.isFinite(ms))return NaN;\nconst d=new Date(ms);\nswitch(granularity){\ncase'hour':d.setMinutes(0,0,0);return d.getTime();\ncase'day':d.setHours(0,0,0,0);return d.getTime();\ncase'week':{\nd.setHours(0,0,0,0);\nconst back=(d.getDay()+6)%7;\nd.setDate(d.getDate()-back);\nreturn d.getTime();\n}\ncase'month':d.setDate(1);d.setHours(0,0,0,0);return d.getTime();\ncase'quarter':\nd.setMonth(Math.floor(d.getMonth()/3)*3,1);\nd.setHours(0,0,0,0);\nreturn d.getTime();\ndefault:d.setMonth(0,1);d.setHours(0,0,0,0);return d.getTime();\n}\n}\nfunction advance(ms,granularity){\nconst d=new Date(ms);\nswitch(granularity){\ncase'hour':d.setHours(d.getHours()+1);break;\ncase'day':d.setDate(d.getDate()+1);break;\ncase'week':d.setDate(d.getDate()+7);break;\ncase'month':d.setMonth(d.getMonth()+1);break;\ncase'quarter':d.setMonth(d.getMonth()+3);break;\ndefault:d.setFullYear(d.getFullYear()+1);break;\n}\nreturn d.getTime();\n}\nfunction numericExtent(handle,indices,count){\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nconst n=indices?indices.length:count;\nlet min=Infinity;\nlet max=-Infinity;\nlet nulls=0;\nlet finite=0;\nfor(let k=0;k<n;k++){\nconst i=indices?indices[k]:k;\nif(present&&!present(i)){nulls++;continue;}\nconst v=read(i);\nif(!Number.isFinite(v)){nulls++;continue;}\nif(v<min)min=v;\nif(v>max)max=v;\nfinite++;\n}\nreturn{min,max,nulls,finite};\n}\nfunction sortedSample(handle,indices,count,cap){\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nconst n=indices?indices.length:count;\nconst step=n>cap?n/cap:1;\nconst out=[];\nfor(let s=0;s<n;s+=step){\nconst i=indices?indices[Math.floor(s)]:Math.floor(s);\nif(present&&!present(i))continue;\nconst v=read(i);\nif(Number.isFinite(v))out.push(v);\n}\nconst arr=Float64Array.from(out);\narr.sort();\nreturn arr;\n}\nfunction computeBounds(handle,indices,count,opts={}){\nconst kind=opts.kind||facetKind(handle,opts.type);\nif(kind==='none'||!handle)return{kind:'none',buckets:[],suppressed:'type'};\nif(kind==='boolean')return boundsForBoolean(handle,indices,count);\nif(kind==='category')return boundsForCategory(handle,indices,count,opts);\nreturn boundsForOrdered(handle,indices,count,kind,opts);\n}\nfunction boundsForBoolean(handle,indices,count){\nconst present=presenceReader(handle);\nlet nulls=0;\nif(present){\nconst n=indices?indices.length:count;\nfor(let k=0;k<n;k++)if(!present(indices?indices[k]:k))nulls++;\n}\nconst buckets=[{value:false,label:'false'},{value:true,label:'true'}];\nif(nulls>0)buckets.push({null:true,label:'Empty'});\nreturn{kind:'boolean',buckets};\n}\nfunction boundsForCategory(handle,indices,count,opts){\nconst limit=opts.cardinalityLimit??DEFAULT_CARDINALITY_LIMIT;\nconst{cardinality}=cardinalityOf(handle,indices,count,limit);\nif(cardinality>limit&&(opts.aboveLimit||'suppress')==='suppress'){\nreturn{kind:'category',buckets:[],suppressed:'cardinality',cardinality};\n}\nconst read=valueReader(handle);\nconst n=indices?indices.length:count;\nconst tally=new Map();\nlet nulls=0;\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined||v===''){nulls++;continue;}\nif(Array.isArray(v)){\nif(!v.length){nulls++;continue;}\nfor(const m of v)tally.set(m,(tally.get(m)||0)+1);\ncontinue;\n}\ntally.set(v,(tally.get(v)||0)+1);\n}\nlet entries=[...tally.entries()];\nif(opts.order==='alpha'){\nentries.sort((a,b)=>String(a[0]).localeCompare(String(b[0])));\n}else{\nentries.sort((a,b)=>b[1]-a[1]);\n}\nlet remainder=0;\nlet dropped=0;\nif(entries.length>limit){\ndropped=entries.length-limit;\nfor(let i=limit;i<entries.length;i++)remainder+=entries[i][1];\nentries=entries.slice(0,limit);\n}\nconst buckets=entries.map(([value])=>({value,label:String(value)}));\nif(remainder>0)buckets.push({remainder:true,label:`Other (${dropped} values)`});\nif(nulls>0)buckets.push({null:true,label:'Empty'});\nreturn{kind:'category',buckets,cardinality};\n}\nfunction boundsForOrdered(handle,indices,count,kind,opts){\nconst{min,max,nulls,finite}=numericExtent(handle,indices,count);\nif(!finite){\nreturn{kind,buckets:nulls?[{null:true,label:'Empty'}]:[],empty:true};\n}\nconst wanted=Math.max(1,Math.floor(opts.buckets||DEFAULT_BUCKETS));\nlet buckets=[];\nif(kind==='date'){\nconst granularity=GRANULARITIES.includes(opts.granularity)\n?opts.granularity:pickGranularity(max-min,wanted);\nlet edge=floorTo(min,granularity);\nwhile(edge<=max&&buckets.length<4096){\nconst next=advance(edge,granularity);\nif(!(next>edge))break;\nbuckets.push({from:edge,to:next});\nedge=next;\n}\nreturn{kind,buckets:withNull(buckets,nulls),granularity};\n}\nconst strategy=STRATEGIES.includes(opts.strategy)?opts.strategy:'equal';\nif(strategy==='quantile'){\nconst sample=sortedSample(handle,indices,count,QUANTILE_SAMPLE);\nif(sample.length){\nconst edges=[sample[0]];\nfor(let b=1;b<wanted;b++){\nconst v=sample[Math.min(sample.length-1,Math.floor((b/wanted)*sample.length))];\nif(v>edges[edges.length-1])edges.push(v);\n}\nedges.push(max);\nfor(let b=0;b<edges.length-1;b++)buckets.push({from:edges[b],to:edges[b+1]});\n}\n}else if(strategy==='log'&&min>0){\nconst lo=Math.log10(min);\nconst hi=Math.log10(max);\nconst step=(hi-lo)/wanted||1;\nfor(let b=0;b<wanted;b++){\nbuckets.push({from:10**(lo+b*step),to:10**(lo+(b+1)*step)});\n}\n}\nif(!buckets.length){\nconst width=(max-min)/wanted||1;\nfor(let b=0;b<wanted;b++)buckets.push({from:min+b*width,to:min+(b+1)*width});\n}\nbuckets[buckets.length-1].to=max;\nreturn{kind,buckets:withNull(buckets,nulls),strategy,min,max};\n}\nfunction withNull(buckets,nulls){\nreturn nulls>0?[...buckets,{null:true,label:'Empty'}]:buckets;\n}\nfunction countInto(handle,indices,count,bounds,out){\nconst buckets=(bounds&&bounds.buckets)||[];\nconst counts=out&&out.length>=buckets.length?out.subarray(0,buckets.length)\n:new Uint32Array(buckets.length);\ncounts.fill(0);\nif(!handle||!buckets.length)return counts;\nconst nullBucket=buckets.length-1;\nconst hasNull=!!buckets[nullBucket]&&buckets[nullBucket].null===true;\nconst n=indices?indices.length:count;\nif(bounds.kind==='boolean'){\nconst read=valueReader(handle);\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined){if(hasNull)counts[nullBucket]++;continue;}\ncounts[v?1:0]++;\n}\nreturn counts;\n}\nif(bounds.kind==='category'){\nconst slot=new Map();\nfor(let b=0;b<buckets.length;b++){\nif(!buckets[b].null&&!buckets[b].remainder)slot.set(buckets[b].value,b);\n}\nconst remainderAt=buckets.findIndex((b)=>b.remainder);\nconst read=valueReader(handle);\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined||v===''){if(hasNull)counts[nullBucket]++;continue;}\nif(Array.isArray(v)){\nif(!v.length){if(hasNull)counts[nullBucket]++;continue;}\nfor(const m of v){\nconst at=slot.get(m);\nif(at!==undefined)counts[at]++;\nelse if(remainderAt>=0)counts[remainderAt]++;\n}\ncontinue;\n}\nconst at=slot.get(v);\nif(at!==undefined)counts[at]++;\nelse if(remainderAt>=0)counts[remainderAt]++;\n}\nreturn counts;\n}\nconst ordered=hasNull?buckets.length-1:buckets.length;\nconst edges=new Float64Array(ordered+1);\nfor(let b=0;b<ordered;b++)edges[b]=buckets[b].from;\nedges[ordered]=ordered?buckets[ordered-1].to:0;\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nfor(let k=0;k<n;k++){\nconst i=indices?indices[k]:k;\nif(present&&!present(i)){if(hasNull)counts[nullBucket]++;continue;}\nconst v=read(i);\nif(!Number.isFinite(v)){if(hasNull)counts[nullBucket]++;continue;}\nconst at=bucketOf(edges,ordered,v);\nif(at>=0)counts[at]++;\n}\nreturn counts;\n}\nfunction bucketOf(edges,ordered,v){\nif(!ordered)return-1;\nif(v<edges[0])return-1;\nif(v>=edges[ordered])return v===edges[ordered]?ordered-1:-1;\nlet lo=0;\nlet hi=ordered-1;\nwhile(lo<hi){\nconst mid=(lo+hi+1)>>>1;\nif(v>=edges[mid])lo=mid;else hi=mid-1;\n}\nreturn lo;\n}\nfunction facet(handle,indices,count,opts={}){\nconst bounds=opts.bounds||computeBounds(handle,opts.boundsIndices??indices,count,opts);\nreturn{bounds,counts:countInto(handle,indices,count,bounds)};\n}\nconst __default=facet;\n});\n__def(\"packages/core/src/compute/statistics.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"KENDALL_LIMIT\",{enumerable:true,get:function(){return KENDALL_LIMIT;}});\nObject.defineProperty(__exports,\"MAINTENANCE\",{enumerable:true,get:function(){return MAINTENANCE;}});\nObject.defineProperty(__exports,\"numbers\",{enumerable:true,get:function(){return numbers;}});\nObject.defineProperty(__exports,\"frequencies\",{enumerable:true,get:function(){return frequencies;}});\nObject.defineProperty(__exports,\"herfindahl\",{enumerable:true,get:function(){return herfindahl;}});\nObject.defineProperty(__exports,\"entropy\",{enumerable:true,get:function(){return entropy;}});\nObject.defineProperty(__exports,\"evenness\",{enumerable:true,get:function(){return evenness;}});\nObject.defineProperty(__exports,\"topShare\",{enumerable:true,get:function(){return topShare;}});\nObject.defineProperty(__exports,\"gini\",{enumerable:true,get:function(){return gini;}});\nObject.defineProperty(__exports,\"moments\",{enumerable:true,get:function(){return moments;}});\nObject.defineProperty(__exports,\"quantileSorted\",{enumerable:true,get:function(){return quantileSorted;}});\nObject.defineProperty(__exports,\"quantile\",{enumerable:true,get:function(){return quantile;}});\nObject.defineProperty(__exports,\"STAT_FNS\",{enumerable:true,get:function(){return STAT_FNS;}});\nObject.defineProperty(__exports,\"STAT_LABELS\",{enumerable:true,get:function(){return STAT_LABELS;}});\nObject.defineProperty(__exports,\"weightedAverage\",{enumerable:true,get:function(){return weightedAverage;}});\nObject.defineProperty(__exports,\"extremeRow\",{enumerable:true,get:function(){return extremeRow;}});\nObject.defineProperty(__exports,\"correlation\",{enumerable:true,get:function(){return correlation;}});\nObject.defineProperty(__exports,\"trimmedMean\",{enumerable:true,get:function(){return trimmedMean;}});\nObject.defineProperty(__exports,\"winsorizedMean\",{enumerable:true,get:function(){return winsorizedMean;}});\nObject.defineProperty(__exports,\"modifiedZOutliers\",{enumerable:true,get:function(){return modifiedZOutliers;}});\nObject.defineProperty(__exports,\"jarqueBera\",{enumerable:true,get:function(){return jarqueBera;}});\nObject.defineProperty(__exports,\"weightedQuantile\",{enumerable:true,get:function(){return weightedQuantile;}});\nObject.defineProperty(__exports,\"pairs\",{enumerable:true,get:function(){return pairs;}});\nObject.defineProperty(__exports,\"covariance\",{enumerable:true,get:function(){return covariance;}});\nObject.defineProperty(__exports,\"regression\",{enumerable:true,get:function(){return regression;}});\nObject.defineProperty(__exports,\"spearman\",{enumerable:true,get:function(){return spearman;}});\nObject.defineProperty(__exports,\"kendall\",{enumerable:true,get:function(){return kendall;}});\nObject.defineProperty(__exports,\"seriesStats\",{enumerable:true,get:function(){return seriesStats;}});\nObject.defineProperty(__exports,\"D2_N2\",{enumerable:true,get:function(){return D2_N2;}});\nObject.defineProperty(__exports,\"withinSigma\",{enumerable:true,get:function(){return withinSigma;}});\nObject.defineProperty(__exports,\"capability\",{enumerable:true,get:function(){return capability;}});\nObject.defineProperty(__exports,\"controlLimits\",{enumerable:true,get:function(){return controlLimits;}});\nObject.defineProperty(__exports,\"controlViolations\",{enumerable:true,get:function(){return controlViolations;}});\nObject.defineProperty(__exports,\"countOutside\",{enumerable:true,get:function(){return countOutside;}});\nObject.defineProperty(__exports,\"histogram\",{enumerable:true,get:function(){return histogram;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m0[\"presenceReader\"];\nconst valueReader=__m0[\"valueReader\"];\nconst KENDALL_LIMIT=5000;\nconst MAINTENANCE=Object.freeze({\nvariance:'maintained',\nvarianceP:'maintained',\nstddev:'maintained',\nstddevP:'maintained',\nsumSquares:'maintained',\nweightedAvg:'maintained',\nmedian:'rescan',\np25:'rescan',\np75:'rescan',\np90:'rescan',\np95:'rescan',\np99:'rescan',\niqr:'rescan',\nmode:'rescan',\ndistinct:'rescan',\nrange:'rescan',\nskewness:'rescan',\nkurtosis:'rescan',\ngeomean:'rescan',\nharmean:'rescan',\nmad:'rescan',\nargmin:'rescan',\nargmax:'rescan',\nhhi:'rescan',\nentropy:'rescan',\nevenness:'rescan',\ntop3Share:'rescan',\ntop10Share:'rescan',\ngini:'rescan',\ntrimmedMean:'rescan',\nwinsorizedMean:'rescan',\nrobustOutliers:'rescan',\njarqueBera:'rescan',\n});\nfunction numbers(handle,indices){\nconst n=indices.length;\nconst out=new Float64Array(n);\nlet count=0;\nconst numeric=handle&&(handle.kind==='float64'||handle.kind==='int32');\nif(numeric){\nconst values=handle.values;\nconst present=presenceReader(handle);\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present&&present(row)!==1)continue;\nconst v=values[row];\nif(Number.isNaN(v))continue;\nout[count++]=v;\n}\nreturn out.subarray(0,count);\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst raw=read(indices[i]);\nif(raw===null||raw===undefined||raw==='')continue;\nconst v=typeof raw==='number'?raw:Number(raw);\nif(!Number.isFinite(v))continue;\nout[count++]=v;\n}\nreturn out.subarray(0,count);\n}\nfunction frequencies(handle,indices){\nconst seen=new Map();\nconst read=valueReader(handle);\nlet total=0;\nfor(let i=0;i<indices.length;i++){\nconst raw=read(indices[i]);\nif(raw===null||raw===undefined||raw==='')continue;\nif(typeof raw==='number'&&Number.isNaN(raw))continue;\nconst key=typeof raw==='object'?String(raw):raw;\nseen.set(key,(seen.get(key)||0)+1);\ntotal++;\n}\nconst counts=[...seen.values()].sort((a,b)=>b-a);\nreturn{counts,total,distinct:counts.length};\n}\nfunction sharesOf(freq){\nreturn freq.total>0?freq.counts.map((c)=>c/freq.total):[];\n}\nfunction herfindahl(handle,indices){\nconst freq=frequencies(handle,indices);\nif(!freq.total)return null;\nlet sum=0;\nfor(const share of sharesOf(freq))sum+=share*share;\nreturn sum;\n}\nfunction entropy(handle,indices){\nconst freq=frequencies(handle,indices);\nif(!freq.total)return null;\nlet sum=0;\nfor(const share of sharesOf(freq))if(share>0)sum-=share*Math.log2(share);\nreturn sum;\n}\nfunction evenness(handle,indices){\nconst freq=frequencies(handle,indices);\nif(!freq.total||freq.distinct<2)return freq.total?1:null;\nlet sum=0;\nfor(const share of sharesOf(freq))if(share>0)sum-=share*Math.log2(share);\nreturn sum/Math.log2(freq.distinct);\n}\nfunction topShare(handle,indices,n=3){\nconst freq=frequencies(handle,indices);\nif(!freq.total)return null;\nconst take=Math.max(1,Math.floor(n));\nlet held=0;\nfor(let i=0;i<Math.min(take,freq.counts.length);i++)held+=freq.counts[i];\nreturn held/freq.total;\n}\nfunction gini(handle,indices){\nconst values=numbers(handle,indices);\nconst n=values.length;\nif(!n)return null;\nconst sorted=values.slice().sort();\nif(sorted[0]<0)return null;\nlet total=0;\nlet weighted=0;\nfor(let i=0;i<n;i++){\ntotal+=sorted[i];\nweighted+=(i+1)*sorted[i];\n}\nif(total===0)return 0;\nreturn(2*weighted)/(n*total)-(n+1)/n;\n}\nfunction moments(values){\nlet n=0;\nlet mean=0;\nlet m2=0;\nfor(let i=0;i<values.length;i++){\nconst x=values[i];\nn++;\nconst delta=x-mean;\nmean+=delta/n;\nm2+=delta*(x-mean);\n}\nreturn{n,mean,m2};\n}\nfunction quantileSorted(sorted,p){\nconst n=sorted.length;\nif(!n)return NaN;\nif(n===1)return sorted[0];\nconst h=(n-1)*Math.min(1,Math.max(0,p));\nconst lo=Math.floor(h);\nconst hi=Math.ceil(h);\nif(lo===hi)return sorted[lo];\nreturn sorted[lo]+(h-lo)*(sorted[hi]-sorted[lo]);\n}\nfunction quantile(values,p){\nif(!values.length)return NaN;\nconst sorted=values.slice().sort();\nreturn quantileSorted(sorted,p);\n}\nconst STAT_FNS=Object.freeze({\nhhi:(h,i)=>herfindahl(h,i),\nentropy:(h,i)=>entropy(h,i),\nevenness:(h,i)=>evenness(h,i),\ntop3Share:(h,i)=>topShare(h,i,3),\ntop10Share:(h,i)=>topShare(h,i,10),\ngini:(h,i)=>gini(h,i),\ntrimmedMean:(h,i)=>trimmedMean(numbers(h,i),0.1),\nwinsorizedMean:(h,i)=>winsorizedMean(numbers(h,i),0.1),\nrobustOutliers:(h,i)=>modifiedZOutliers(numbers(h,i),3.5),\njarqueBera:(h,i)=>jarqueBera(numbers(h,i)),\nvariance:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>1?m2/(n-1):null;\n},\nvarianceP:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>0?m2/n:null;\n},\nstddev:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>1?Math.sqrt(m2/(n-1)):null;\n},\nstddevP:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>0?Math.sqrt(m2/n):null;\n},\nmedian:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.5):null;\n},\np25:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.25):null;\n},\np75:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.75):null;\n},\np90:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.9):null;\n},\np95:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.95):null;\n},\np99:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.99):null;\n},\niqr:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nconst sorted=values.slice().sort();\nreturn quantileSorted(sorted,0.75)-quantileSorted(sorted,0.25);\n},\nmad:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nconst middle=quantile(values,0.5);\nconst deviations=new Float64Array(values.length);\nfor(let k=0;k<values.length;k++)deviations[k]=Math.abs(values[k]-middle);\nreturn quantile(deviations,0.5);\n},\nrange:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet lo=Infinity;\nlet hi=-Infinity;\nfor(let k=0;k<values.length;k++){\nif(values[k]<lo)lo=values[k];\nif(values[k]>hi)hi=values[k];\n}\nreturn hi-lo;\n},\ndistinct:(h,i)=>{\nconst read=valueReader(h);\nconst seen=new Set();\nfor(let k=0;k<i.length;k++){\nconst v=read(i[k]);\nif(v===null||v===undefined||v==='')continue;\nseen.add(v instanceof Date?v.getTime():v);\n}\nreturn seen.size;\n},\nmode:(h,i)=>{\nconst read=valueReader(h);\nconst counts=new Map();\nfor(let k=0;k<i.length;k++){\nconst v=read(i[k]);\nif(v===null||v===undefined||v==='')continue;\nconst id=v instanceof Date?v.getTime():v;\ncounts.set(id,(counts.get(id)||0)+1);\n}\nlet best=null;\nlet most=1;\nfor(const[value,times]of counts){\nif(times>most){\nmost=times;\nbest=value;\n}\n}\nreturn best;\n},\nskewness:(h,i)=>{\nconst values=numbers(h,i);\nconst{n,mean,m2}=moments(values);\nif(n<3||m2<=0)return null;\nconst sd=Math.sqrt(m2/(n-1));\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=((values[k]-mean)/sd)**3;\nreturn(n/((n-1)*(n-2)))*sum;\n},\nkurtosis:(h,i)=>{\nconst values=numbers(h,i);\nconst{n,mean,m2}=moments(values);\nif(n<4||m2<=0)return null;\nconst sd=Math.sqrt(m2/(n-1));\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=((values[k]-mean)/sd)**4;\nconst a=(n*(n+1))/((n-1)*(n-2)*(n-3));\nconst b=(3*(n-1)**2)/((n-2)*(n-3));\nreturn a*sum-b;\n},\ngeomean:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet sum=0;\nfor(let k=0;k<values.length;k++){\nif(values[k]<=0)return null;\nsum+=Math.log(values[k]);\n}\nreturn Math.exp(sum/values.length);\n},\nharmean:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet sum=0;\nfor(let k=0;k<values.length;k++){\nif(values[k]===0)return null;\nsum+=1/values[k];\n}\nreturn values.length/sum;\n},\nsumSquares:(h,i)=>{\nconst values=numbers(h,i);\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=values[k]*values[k];\nreturn sum;\n},\n});\nconst STAT_LABELS=Object.freeze({\nhhi:'Concentration (HHI)',\nentropy:'Entropy',\nevenness:'Evenness',\ntop3Share:'Top 3 share',\ntop10Share:'Top 10 share',\ngini:'Gini coefficient',\ntrimmedMean:'Trimmed mean',\nwinsorizedMean:'Winsorized mean',\nrobustOutliers:'Outliers (robust)',\njarqueBera:'Jarque–Bera',\nmedian:'Median',\np25:'25th percentile',\np75:'75th percentile',\np90:'90th percentile',\np95:'95th percentile',\np99:'99th percentile',\niqr:'Interquartile range',\nmad:'Median absolute deviation',\nvariance:'Variance',\nvarianceP:'Variance (population)',\nstddev:'Standard deviation',\nstddevP:'Standard deviation (population)',\nrange:'Range',\ndistinct:'Distinct',\nmode:'Mode',\nskewness:'Skewness',\nkurtosis:'Kurtosis',\ngeomean:'Geometric mean',\nharmean:'Harmonic mean',\nsumSquares:'Sum of squares',\nweightedAvg:'Weighted average',\nargmin:'Lowest by',\nargmax:'Highest by',\n});\nfunction weightedAverage(handle,weights,indices){\nconst readValue=valueReader(handle);\nconst readWeight=valueReader(weights);\nlet top=0;\nlet bottom=0;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst value=Number(readValue(row));\nconst weight=Number(readWeight(row));\nif(!Number.isFinite(value)||!Number.isFinite(weight))continue;\ntop+=value*weight;\nbottom+=weight;\n}\nreturn bottom===0?null:top/bottom;\n}\nfunction extremeRow(handle,indices,largest){\nconst read=valueReader(handle);\nlet best=null;\nlet bestValue=largest?-Infinity:Infinity;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst value=Number(read(row));\nif(!Number.isFinite(value))continue;\nif(largest?value>bestValue:value<bestValue){\nbestValue=value;\nbest=row;\n}\n}\nreturn best;\n}\nfunction correlation(a,b,indices){\nconst readA=valueReader(a);\nconst readB=valueReader(b);\nlet n=0;\nlet sx=0;\nlet sy=0;\nlet sxx=0;\nlet syy=0;\nlet sxy=0;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst x=Number(readA(row));\nconst y=Number(readB(row));\nif(!Number.isFinite(x)||!Number.isFinite(y))continue;\nn++;\nsx+=x;\nsy+=y;\nsxx+=x*x;\nsyy+=y*y;\nsxy+=x*y;\n}\nif(n<2)return null;\nconst top=n*sxy-sx*sy;\nconst bottom=Math.sqrt((n*sxx-sx*sx)*(n*syy-sy*sy));\nif(bottom===0)return null;\nconst r=top/bottom;\nreturn Math.max(-1,Math.min(1,r));\n}\nfunction trimmedMean(values,share=0.1){\nconst n=values.length;\nif(!n)return null;\nconst sorted=Array.from(values).sort((a,b)=>a-b);\nconst cut=Math.floor(n*Math.min(0.49,Math.max(0,share)));\nconst kept=sorted.slice(cut,n-cut);\nif(!kept.length)return quantileSorted(sorted,0.5);\nlet sum=0;\nfor(const v of kept)sum+=v;\nreturn sum/kept.length;\n}\nfunction winsorizedMean(values,share=0.1){\nconst n=values.length;\nif(!n)return null;\nconst sorted=Array.from(values).sort((a,b)=>a-b);\nconst cut=Math.floor(n*Math.min(0.49,Math.max(0,share)));\nconst low=sorted[cut];\nconst high=sorted[n-1-cut];\nlet sum=0;\nfor(const v of sorted)sum+=Math.min(high,Math.max(low,v));\nreturn sum/n;\n}\nfunction modifiedZOutliers(values,threshold=3.5){\nconst n=values.length;\nif(!n)return null;\nconst sorted=Array.from(values).sort((a,b)=>a-b);\nconst middle=quantileSorted(sorted,0.5);\nconst deviations=sorted.map((v)=>Math.abs(v-middle)).sort((a,b)=>a-b);\nconst mad=quantileSorted(deviations,0.5);\nif(mad===0)return null;\nlet count=0;\nfor(const v of sorted)if(Math.abs((0.6745*(v-middle))/mad)>threshold)count++;\nreturn count;\n}\nfunction jarqueBera(values){\nconst n=values.length;\nif(n<8)return null;\nlet mean=0;\nfor(const v of values)mean+=v;\nmean/=n;\nlet m2=0;\nlet m3=0;\nlet m4=0;\nfor(const v of values){\nconst d=v-mean;\nm2+=d*d;\nm3+=d*d*d;\nm4+=d*d*d*d;\n}\nm2/=n;\nm3/=n;\nm4/=n;\nif(m2===0)return null;\nconst skew=m3/m2**1.5;\nconst excess=m4/(m2*m2)-3;\nreturn(n/6)*(skew*skew+(excess*excess)/4);\n}\nfunction weightedQuantile(values,weights,p){\nconst paired=[];\nlet total=0;\nfor(let i=0;i<values.length;i++){\nconst v=Number(values[i]);\nconst w=Number(weights[i]);\nif(!Number.isFinite(v)||!Number.isFinite(w)||w<=0)continue;\npaired.push([v,w]);\ntotal+=w;\n}\nif(!paired.length||total<=0)return null;\npaired.sort((a,b)=>a[0]-b[0]);\nif(paired.length===1)return paired[0][0];\nconst at=[];\nlet seen=0;\nfor(const[,w]of paired){\nat.push((seen+w/2)/total);\nseen+=w;\n}\nconst target=Math.max(0,Math.min(1,p));\nif(target<=at[0])return paired[0][0];\nif(target>=at[at.length-1])return paired[paired.length-1][0];\nfor(let i=1;i<at.length;i++){\nif(target>at[i])continue;\nconst span=at[i]-at[i-1];\nconst within=span>0?(target-at[i-1])/span:0;\nreturn paired[i-1][0]+(paired[i][0]-paired[i-1][0])*within;\n}\nreturn paired[paired.length-1][0];\n}\nfunction pairs(a,b,indices){\nconst readA=valueReader(a);\nconst readB=valueReader(b);\nconst xs=new Float64Array(indices.length);\nconst ys=new Float64Array(indices.length);\nlet n=0;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst x=Number(readA(row));\nconst y=Number(readB(row));\nif(!Number.isFinite(x)||!Number.isFinite(y))continue;\nxs[n]=x;\nys[n]=y;\nn++;\n}\nreturn{xs:xs.subarray(0,n),ys:ys.subarray(0,n),n};\n}\nfunction covariance(a,b,indices,population=false){\nconst{xs,ys,n}=pairs(a,b,indices);\nif(n<2)return null;\nlet mx=0;\nlet my=0;\nfor(let i=0;i<n;i++){mx+=xs[i];my+=ys[i];}\nmx/=n;\nmy/=n;\nlet sum=0;\nfor(let i=0;i<n;i++)sum+=(xs[i]-mx)*(ys[i]-my);\nreturn sum/(population?n:n-1);\n}\nfunction regression(a,b,indices){\nconst{xs,ys,n}=pairs(a,b,indices);\nif(n<2)return null;\nlet mx=0;\nlet my=0;\nfor(let i=0;i<n;i++){mx+=xs[i];my+=ys[i];}\nmx/=n;\nmy/=n;\nlet sxx=0;\nlet sxy=0;\nlet syy=0;\nfor(let i=0;i<n;i++){\nconst dx=xs[i]-mx;\nconst dy=ys[i]-my;\nsxx+=dx*dx;\nsxy+=dx*dy;\nsyy+=dy*dy;\n}\nif(sxx===0)return null;\nconst slope=sxy/sxx;\nconst intercept=my-slope*mx;\nconst r2=syy===0?1:Math.max(0,Math.min(1,(sxy*sxy)/(sxx*syy)));\nconst residual=Math.max(0,syy-slope*sxy);\nconst stdError=n>2?Math.sqrt(residual/(n-2)/sxx):0;\nreturn{slope,intercept,r2,stdError,n};\n}\nfunction ranksOf(values){\nconst n=values.length;\nconst order=Array.from({length:n},(unused,i)=>i)\n.sort((i,j)=>values[i]-values[j]);\nconst ranks=new Float64Array(n);\nlet i=0;\nwhile(i<n){\nlet j=i;\nwhile(j+1<n&&values[order[j+1]]===values[order[i]])j++;\nconst shared=(i+j)/2+1;\nfor(let k=i;k<=j;k++)ranks[order[k]]=shared;\ni=j+1;\n}\nreturn ranks;\n}\nfunction spearman(a,b,indices){\nconst{xs,ys,n}=pairs(a,b,indices);\nif(n<2)return null;\nconst rx=ranksOf(xs);\nconst ry=ranksOf(ys);\nlet mx=0;\nlet my=0;\nfor(let i=0;i<n;i++){mx+=rx[i];my+=ry[i];}\nmx/=n;\nmy/=n;\nlet sxy=0;\nlet sxx=0;\nlet syy=0;\nfor(let i=0;i<n;i++){\nconst dx=rx[i]-mx;\nconst dy=ry[i]-my;\nsxy+=dx*dy;\nsxx+=dx*dx;\nsyy+=dy*dy;\n}\nif(sxx===0||syy===0)return null;\nreturn Math.max(-1,Math.min(1,sxy/Math.sqrt(sxx*syy)));\n}\nfunction kendall(a,b,indices){\nconst{xs,ys,n}=pairs(a,b,indices);\nif(n<2||n>KENDALL_LIMIT)return null;\nlet concordant=0;\nlet discordant=0;\nlet tiedXOnly=0;\nlet tiedYOnly=0;\nfor(let i=0;i<n;i++){\nfor(let j=i+1;j<n;j++){\nconst dx=Math.sign(xs[i]-xs[j]);\nconst dy=Math.sign(ys[i]-ys[j]);\nconst product=dx*dy;\nif(product>0)concordant++;\nelse if(product<0)discordant++;\nelse if(dx===0&&dy===0){}\nelse if(dx===0)tiedXOnly++;\nelse tiedYOnly++;\n}\n}\nconst orderedByX=concordant+discordant+tiedYOnly;\nconst orderedByY=concordant+discordant+tiedXOnly;\nif(orderedByX===0||orderedByY===0)return null;\nreturn(concordant-discordant)/Math.sqrt(orderedByX*orderedByY);\n}\nfunction seriesStats(ordered,opts={}){\nconst n=ordered.length;\nif(n<2)return null;\nconst first=ordered[0];\nconst last=ordered[n-1];\nconst returns=[];\nfor(let i=1;i<n;i++){\nconst previous=ordered[i-1];\nif(previous===0)continue;\nreturns.push((ordered[i]-previous)/Math.abs(previous));\n}\nlet volatility=null;\nif(returns.length>1){\nlet mean=0;\nfor(const r of returns)mean+=r;\nmean/=returns.length;\nlet m2=0;\nfor(const r of returns)m2+=(r-mean)**2;\nvolatility=Math.sqrt(m2/(returns.length-1));\n}\nconst periods=Number(opts.periodsPerYear)>0?Number(opts.periodsPerYear):null;\nlet peak=ordered[0];\nlet peakAt=0;\nlet worst=0;\nlet worstFrom=0;\nlet worstTo=0;\nfor(let i=1;i<n;i++){\nif(ordered[i]>peak){peak=ordered[i];peakAt=i;continue;}\nif(peak<=0)continue;\nconst fall=(peak-ordered[i])/peak;\nif(fall>worst){worst=fall;worstFrom=peakAt;worstTo=i;}\n}\nlet autocorrelation=null;\nif(n>2){\nlet mean=0;\nfor(let i=0;i<n;i++)mean+=ordered[i];\nmean/=n;\nlet top=0;\nlet bottom=0;\nfor(let i=0;i<n;i++){\nconst d=ordered[i]-mean;\nbottom+=d*d;\nif(i>0)top+=d*(ordered[i-1]-mean);\n}\nautocorrelation=bottom>0?top/bottom:null;\n}\nlet up=0;\nlet down=0;\nfor(const r of returns){if(r>0)up++;else if(r<0)down++;}\nlet growth=null;\nif(first>0&&last>0){\nconst perPeriod=(last/first)**(1/(n-1))-1;\ngrowth=periods?(1+perPeriod)**periods-1:perPeriod;\n}\nreturn{\nn,\nfirst,\nlast,\nchange:last-first,\nchangePercent:first===0?null:((last-first)/Math.abs(first))*100,\nvolatility,\nannualisedVolatility:volatility!==null&&periods?volatility*Math.sqrt(periods):null,\ngrowth,\nmaxDrawdown:worst,\nmaxDrawdownFrom:worstFrom,\nmaxDrawdownTo:worstTo,\nautocorrelation,\nupDays:up,\ndownDays:down,\n};\n}\nconst D2_N2=1.128;\nfunction withinSigma(ordered){\nconst n=ordered.length;\nif(n<2)return null;\nlet total=0;\nfor(let i=1;i<n;i++)total+=Math.abs(ordered[i]-ordered[i-1]);\nconst meanRange=total/(n-1);\nreturn{sigma:meanRange/D2_N2,meanRange};\n}\nfunction capability(ordered,spec){\nconst n=ordered.length;\nif(n<2||!spec)return null;\nconst lower=Number.isFinite(Number(spec.lower))?Number(spec.lower):null;\nconst upper=Number.isFinite(Number(spec.upper))?Number(spec.upper):null;\nif(lower===null&&upper===null)return null;\nlet mean=0;\nfor(let i=0;i<n;i++)mean+=ordered[i];\nmean/=n;\nlet m2=0;\nfor(let i=0;i<n;i++)m2+=(ordered[i]-mean)**2;\nconst overall=Math.sqrt(m2/(n-1));\nconst within=withinSigma(ordered);\nconst sigmaWithin=within?within.sigma:null;\nconst indices=(sigma)=>{\nif(!sigma||sigma<=0)return{index:null,k:null};\nconst both=lower!==null&&upper!==null;\nconst index=both?(upper-lower)/(6*sigma):null;\nconst upperSide=upper!==null?(upper-mean)/(3*sigma):Infinity;\nconst lowerSide=lower!==null?(mean-lower)/(3*sigma):Infinity;\nreturn{index,k:Math.min(upperSide,lowerSide)};\n};\nconst short=indices(sigmaWithin);\nconst long=indices(overall);\nlet outOfSpec=0;\nfor(let i=0;i<n;i++){\nif(lower!==null&&ordered[i]<lower){outOfSpec++;continue;}\nif(upper!==null&&ordered[i]>upper)outOfSpec++;\n}\nreturn{\nn,\nmean,\nlower,\nupper,\ntarget:Number.isFinite(Number(spec.target))?Number(spec.target):null,\nsigmaWithin,\nsigmaOverall:overall,\ncp:short.index,\ncpk:short.k,\npp:long.index,\nppk:long.k,\noutOfSpec,\ndefectRate:n?outOfSpec/n:null,\n};\n}\nfunction controlLimits(ordered){\nconst n=ordered.length;\nif(n<2)return null;\nconst within=withinSigma(ordered);\nif(!within||!(within.sigma>0))return null;\nlet centre=0;\nfor(let i=0;i<n;i++)centre+=ordered[i];\ncentre/=n;\nreturn{\ncentre,\nsigma:within.sigma,\nupper:centre+3*within.sigma,\nlower:centre-3*within.sigma,\n};\n}\nfunction controlViolations(ordered,limits){\nif(!limits||!(limits.sigma>0))return[];\nconst n=ordered.length;\nconst{centre,sigma}=limits;\nconst z=(i)=>(ordered[i]-centre)/sigma;\nconst out=[];\nfor(let i=0;i<n;i++){\nif(Math.abs(z(i))>3){\nout.push({index:i,rule:1,description:'beyond three sigma'});\n}\nif(i>=2){\nfor(const side of[1,-1]){\nlet hits=0;\nfor(let k=i-2;k<=i;k++)if(z(k)*side>2)hits++;\nif(hits>=2){\nout.push({index:i,rule:2,description:'two of three past two sigma'});\nbreak;\n}\n}\n}\nif(i>=4){\nfor(const side of[1,-1]){\nlet hits=0;\nfor(let k=i-4;k<=i;k++)if(z(k)*side>1)hits++;\nif(hits>=4){\nout.push({index:i,rule:3,description:'four of five past one sigma'});\nbreak;\n}\n}\n}\nif(i>=7){\nfor(const side of[1,-1]){\nlet all=true;\nfor(let k=i-7;k<=i;k++)if(z(k)*side<=0){all=false;break;}\nif(all){\nout.push({index:i,rule:4,description:'eight in a row on one side'});\nbreak;\n}\n}\n}\n}\nreturn out;\n}\nfunction countOutside(values,low,high){\nlet count=0;\nfor(let i=0;i<values.length;i++){\nif(values[i]<low||values[i]>high)count++;\n}\nreturn count;\n}\nfunction histogram(sorted,q1,q3,cap=20){\nconst n=sorted.length;\nif(!n)return[];\nconst min=sorted[0];\nconst max=sorted[n-1];\nif(max===min)return[{from:min,to:max,count:n}];\nconst iqr=q3-q1;\nconst fence=1.5*iqr;\nlet lo=iqr>0?Math.max(min,q1-fence):min;\nlet hi=iqr>0?Math.min(max,q3+fence):max;\nif(!(hi>lo)){lo=min;hi=max;}\nconst width=iqr>0?(2*iqr)/Math.cbrt(n):(hi-lo)/(Math.ceil(Math.log2(n))+1);\nconst count=width>0\n?Math.min(cap,Math.max(1,Math.ceil((hi-lo)/width)))\n:1;\nconst step=(hi-lo)/count;\nconst bins=[];\nfor(let i=0;i<count;i++){\nbins.push({from:lo+i*step,to:lo+(i+1)*step,count:0});\n}\nfor(let i=0;i<n;i++){\nconst at=Math.min(count-1,Math.max(0,Math.floor((sorted[i]-lo)/step)));\nbins[at].count++;\n}\nbins[0].from=min;\nbins[count-1].to=max;\nreturn bins;\n}\n});\n__def(\"packages/core/src/compute/total.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"TOTAL_FNS\",{enumerable:true,get:function(){return TOTAL_FNS;}});\nObject.defineProperty(__exports,\"TOTAL_LABELS\",{enumerable:true,get:function(){return TOTAL_LABELS;}});\nObject.defineProperty(__exports,\"totalLabel\",{enumerable:true,get:function(){return totalLabel;}});\nObject.defineProperty(__exports,\"collectValues\",{enumerable:true,get:function(){return collectValues;}});\nObject.defineProperty(__exports,\"total\",{enumerable:true,get:function(){return total;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isFunction=__m0[\"isFunction\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m1[\"presenceReader\"];\nconst valueComparator=__m1[\"valueComparator\"];\nconst valueReader=__m1[\"valueReader\"];\nconst __m2=__req(\"packages/core/src/compute/statistics.js\");\nconst STAT_FNS=__m2[\"STAT_FNS\"];\nconst STAT_LABELS=__m2[\"STAT_LABELS\"];\nfunction isNumericBacking(handle){\nreturn!!handle&&(handle.kind==='float64'||handle.kind==='int32');\n}\nfunction sum(handle,indices){\nconst n=indices.length;\nlet acc=0;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<n;i++){\nconst v=values[indices[i]];\nif(!Number.isNaN(v))acc+=v;\n}\nreturn acc;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===1){\nconst v=values[row];\nif(!Number.isNaN(v))acc+=v;\n}\n}\nreturn acc;\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst v=numberOf(read(indices[i]));\nif(v!==null)acc+=v;\n}\nreturn acc;\n}\nsum.kernel=true;\nfunction countValues(handle,indices){\nconst n=indices.length;\nlet count=0;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<n;i++)if(!Number.isNaN(values[indices[i]]))count++;\nreturn count;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===1&&!Number.isNaN(values[row]))count++;\n}\nreturn count;\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst v=read(indices[i]);\nif(v!==null&&v!==undefined&&!(typeof v==='number'&&Number.isNaN(v)))count++;\n}\nreturn count;\n}\ncountValues.kernel=true;\nfunction count(handle,indices){\nreturn indices.length;\n}\ncount.kernel=true;\nfunction avg(handle,indices){\nconst values=countValues(handle,indices);\nif(values===0)return null;\nreturn sum(handle,indices)/values;\n}\navg.kernel=true;\nfunction extreme(handle,indices,direction,locale){\nconst n=indices.length;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nlet best=null;\nif(!present){\nfor(let i=0;i<n;i++){\nconst v=values[indices[i]];\nif(Number.isNaN(v))continue;\nif(best===null||(direction<0?v<best:v>best))best=v;\n}\nreturn best;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===0)continue;\nconst v=values[row];\nif(Number.isNaN(v))continue;\nif(best===null||(direction<0?v<best:v>best))best=v;\n}\nreturn best;\n}\nconst read=valueReader(handle);\nconst cmp=valueComparator(locale);\nlet best=null;\nfor(let i=0;i<n;i++){\nconst v=read(indices[i]);\nif(v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v)))continue;\nif(best===null||(direction<0?cmp(v,best)<0:cmp(v,best)>0))best=v;\n}\nreturn best;\n}\nfunction min(handle,indices,ctx){\nreturn extreme(handle,indices,-1,ctx&&ctx.locale);\n}\nmin.kernel=true;\nfunction max(handle,indices,ctx){\nreturn extreme(handle,indices,1,ctx&&ctx.locale);\n}\nmax.kernel=true;\nfunction first(handle,indices){\nif(indices.length===0)return null;\nreturn valueReader(handle)(indices[0]);\n}\nfirst.kernel=true;\nfunction last(handle,indices){\nif(indices.length===0)return null;\nreturn valueReader(handle)(indices[indices.length-1]);\n}\nlast.kernel=true;\nfunction numberOf(v){\nif(typeof v==='number')return Number.isNaN(v)?null:v;\nif(v===null||v===undefined||v===''||typeof v==='boolean')return null;\nif(v instanceof Date)return v.getTime();\nconst n=Number(v);\nreturn Number.isNaN(n)?null:n;\n}\nconst TOTAL_FNS={\nsum,min,max,avg,count,first,last,countValues,\n...STAT_FNS,\n};\nconst TOTAL_LABELS=Object.freeze({\n...STAT_LABELS,\nsum:'Sum',\navg:'Average',\nmin:'Min',\nmax:'Max',\ncount:'Count',\ncountValues:'Count of values',\nfirst:'First',\nlast:'Last',\n});\nfunction totalLabel(fn){\nif(!fn)return'';\nif(typeof fn==='string')return TOTAL_LABELS[fn]||fn;\nreturn'Total';\n}\nfunction collectValues(handle,indices){\nconst read=valueReader(handle);\nconst out=[];\nfor(let i=0;i<indices.length;i++){\nconst v=read(indices[i]);\nif(v===null||v===undefined)continue;\nout.push(v);\n}\nreturn out;\n}\nfunction total(handle,indices,fn,ctx){\nconst list=indices||[];\nif(typeof fn==='string'){\nconst kernel=TOTAL_FNS[fn];\nif(!kernel){\nwarnOnce(`total:${fn}`,`unknown total function \"${fn}\"; register it in config.totalFns`);\nreturn null;\n}\nreturn kernel(handle,list,ctx);\n}\nif(isFunction(fn)){\nif(fn.kernel===true)return fn(handle,list,ctx);\nreturn fn(collectValues(handle,list),ctx||{});\n}\nreturn null;\n}\n});\n__def(\"packages/core/src/compute/pivot.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"KEY_DELIMITER\",{enumerable:true,get:function(){return KEY_DELIMITER;}});\nObject.defineProperty(__exports,\"DEFAULT_PATH_SEPARATOR\",{enumerable:true,get:function(){return DEFAULT_PATH_SEPARATOR;}});\nObject.defineProperty(__exports,\"DEFAULT_MAX_COLUMNS\",{enumerable:true,get:function(){return DEFAULT_MAX_COLUMNS;}});\nObject.defineProperty(__exports,\"pivotKey\",{enumerable:true,get:function(){return pivotKey;}});\nObject.defineProperty(__exports,\"joinPath\",{enumerable:true,get:function(){return joinPath;}});\nObject.defineProperty(__exports,\"resolvePivotKeys\",{enumerable:true,get:function(){return resolvePivotKeys;}});\nObject.defineProperty(__exports,\"pivot\",{enumerable:true,get:function(){return pivot;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst valueComparator=__m1[\"valueComparator\"];\nconst __m2=__req(\"packages/core/src/compute/group.js\");\nconst packKeys=__m2[\"packKeys\"];\nconst __m3=__req(\"packages/core/src/compute/total.js\");\nconst total=__m3[\"total\"];\nconst KEY_DELIMITER='|';\nconst DEFAULT_PATH_SEPARATOR='/';\nconst DEFAULT_MAX_COLUMNS=2000;\nfunction pivotKey(groupPath,pivotPath,colId){\nreturn`${groupPath}${KEY_DELIMITER}${pivotPath}${KEY_DELIMITER}${colId}`;\n}\nfunction joinPath(parts,separator){\nlet out='';\nfor(let i=0;i<parts.length;i++){\nconst v=parts[i];\nout+=(i===0?'':separator)+(v===null||v===undefined?'':String(v));\n}\nreturn out;\n}\nfunction resolvePivotKeys(handles,order,opts={}){\nconst separator=opts.separator||DEFAULT_PATH_SEPARATOR;\nconst n=order.length;\nconst{keyOf,readers}=packKeys(handles,order,0);\nconst seen=new Map();\nconst tuples=[];\nconst rawKeys=[];\nfor(let i=0;i<n;i++){\nconst row=order[i];\nconst key=keyOf(row);\nif(seen.has(key))continue;\nseen.set(key,tuples.length);\nrawKeys.push(key);\nconst tuple=new Array(readers.length);\nfor(let j=0;j<readers.length;j++)tuple[j]=readers[j](row);\ntuples.push(tuple);\n}\nconst cmp=valueComparator(opts.locale);\nconst rank=tuples.map((_,i)=>i);\nrank.sort((a,b)=>{\nconst ta=tuples[a];\nconst tb=tuples[b];\nfor(let j=0;j<ta.length;j++){\nconst c=compareNullable(ta[j],tb[j],cmp);\nif(c!==0)return c;\n}\nreturn a-b;\n});\nconst keys=new Array(rank.length);\nconst paths=new Array(rank.length);\nconst idByKey=new Map();\nfor(let position=0;position<rank.length;position++){\nconst from=rank[position];\nkeys[position]=tuples[from];\npaths[position]=joinPath(tuples[from],separator);\nidByKey.set(rawKeys[from],position);\n}\nconst idOf=(row)=>{\nconst id=idByKey.get(keyOf(row));\nreturn id===undefined?-1:id;\n};\nreturn{keys,paths,idOf};\n}\nfunction compareNullable(a,b,cmp){\nconst na=a===null||a===undefined;\nconst nb=b===null||b===undefined;\nif(na||nb)return na&&nb?0:na?1:-1;\nreturn cmp(a,b);\n}\nfunction resolveValueColumns(opts){\nconst declared=opts.values||opts.totals||[];\nif(declared.length&&typeof declared[0]==='object'&&declared[0]!==null){\nreturn declared.filter((entry)=>entry&&entry.handle);\n}\nconst resolve=typeof opts.handle==='function'?opts.handle:null;\nif(!resolve){\nif(declared.length){\nwarnOnce('pivot:handles',\n'pivot was given total column ids but no handle(colId) resolver, so no cell values were reduced. Pass values: [{ colId, handle, fn }] or opts.handle.');\n}\nreturn[];\n}\nconst totalOf=typeof opts.totalOf==='function'?opts.totalOf:null;\nconst out=[];\nfor(const colId of declared){\nconst handle=resolve(colId);\nif(!handle)continue;\nout.push({colId,handle,fn:totalOf?totalOf(colId):'sum'});\n}\nreturn out;\n}\nfunction normaliseArgs(a,b,c){\nif(Array.isArray(a)){\nconst opts=c||{};\nreturn{...opts,pivotHandles:a,order:b||null,groups:opts.groups||null};\n}\nreturn a||{};\n}\nfunction pivot(input,orderArg,optsArg){\nconst opts=normaliseArgs(input,orderArg,optsArg);\nconst separator=opts.separator||DEFAULT_PATH_SEPARATOR;\nconst valueColumns=resolveValueColumns(opts);\nconst maxColumns=opts.maxColumns===undefined?DEFAULT_MAX_COLUMNS:opts.maxColumns;\nconst groups=opts.groups&&opts.groups.buckets?opts.groups:null;\nconst buckets=groups?groups.buckets:[opts.order||new Uint32Array(0)];\nconst groupPaths=opts.groupPaths\n||(groups?groups.keys.map((tuple)=>joinPath(tuple,separator)):['']);\nconst scope=concatIndices(buckets);\nconst{keys,paths,idOf}=resolvePivotKeys(opts.pivotHandles||[],scope,opts);\nconst columns=paths.length*Math.max(1,valueColumns.length);\nconst fields=derivedFields(paths,valueColumns,separator);\nif(maxColumns&&columns>maxColumns){\nconst empty=new Map();\nreturn{\nkeys,\npaths,\nfields,\ngroupPaths,\ncolumns,\nvalues:empty,\ncells:empty,\nerror:{\ncode:'pivot-max-columns',\nmessage:`[lattice] pivot would generate ${columns} columns, above pivot.maxColumns of ${maxColumns}. Narrow the pivot columns or raise the limit.`,\ncolumns,\nmaxColumns,\n},\n};\n}\nconst cells=new Map();\nconst keyCount=paths.length;\nfor(let g=0;g<buckets.length;g++){\nconst bucket=buckets[g];\nconst groupPath=groupPaths[g]===undefined?'':groupPaths[g];\nconst n=bucket.length;\nif(n===0)continue;\nconst ids=new Int32Array(n);\nconst counts=new Uint32Array(keyCount+1);\nfor(let i=0;i<n;i++){\nconst id=idOf(bucket[i]);\nids[i]=id;\nif(id>=0)counts[id+1]++;\n}\nfor(let k=0;k<keyCount;k++)counts[k+1]+=counts[k];\nconst scattered=new Uint32Array(n);\nconst cursor=counts.slice(0,keyCount);\nfor(let i=0;i<n;i++){\nconst id=ids[i];\nif(id>=0)scattered[cursor[id]++]=bucket[i];\n}\nfor(let k=0;k<keyCount;k++){\nconst from=counts[k];\nconst to=counts[k+1];\nif(to===from)continue;\nconst slice=scattered.subarray(from,to);\nfor(let c=0;c<valueColumns.length;c++){\nconst column=valueColumns[c];\nconst result=total(column.handle,slice,column.fn,opts.totalContext||{locale:opts.locale});\ncells.set(pivotKey(groupPath,paths[k],column.colId),result);\n}\n}\n}\nreturn{keys,paths,fields,groupPaths,columns,values:cells,cells,error:null};\n}\nfunction derivedFields(paths,valueColumns,separator){\nif(valueColumns.length===0)return paths.slice();\nconst out=[];\nfor(const path of paths){\nfor(const column of valueColumns)out.push(`${path}${separator}${column.colId}`);\n}\nreturn out;\n}\nfunction concatIndices(buckets){\nif(buckets.length===1)return buckets[0]||new Uint32Array(0);\nlet n=0;\nfor(const b of buckets)n+=b?b.length:0;\nconst out=new Uint32Array(n);\nlet at=0;\nfor(const b of buckets){\nif(!b||b.length===0)continue;\nout.set(b,at);\nat+=b.length;\n}\nreturn out;\n}\n});\n__def(\"packages/core/src/compute/reference.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"referenceValue\",{enumerable:true,get:function(){return referenceValue;}});\nObject.defineProperty(__exports,\"referenceSort\",{enumerable:true,get:function(){return referenceSort;}});\nObject.defineProperty(__exports,\"referenceFilter\",{enumerable:true,get:function(){return referenceFilter;}});\nObject.defineProperty(__exports,\"referencePasses\",{enumerable:true,get:function(){return referencePasses;}});\nObject.defineProperty(__exports,\"referenceGroup\",{enumerable:true,get:function(){return referenceGroup;}});\nObject.defineProperty(__exports,\"referenceTotal\",{enumerable:true,get:function(){return referenceTotal;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst getPath=__m0[\"getPath\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst isMissing=__m1[\"isMissing\"];\nconst valueComparator=__m1[\"valueComparator\"];\nconst __m2=__req(\"packages/core/src/compute/filter.js\");\nconst testValue=__m2[\"testValue\"];\nconst KEY_SEPARATOR=String.fromCharCode(0x1f);\nconst NULL_MARKER=String.fromCharCode(0x00);\nfunction referenceValue(row,col){\nconst v=col.includes('.')?getPath(row,col):(row==null?undefined:row[col]);\nreturn v===undefined?null:v;\n}\nfunction referenceSort(rows,entries,opts={}){\nconst list=entries||[];\nlet order=rows.map((_,i)=>i);\nif(list.length===0)return order;\nfor(let e=list.length-1;e>=0;e--){\norder=referenceSortOne(rows,order,list[e],opts);\n}\nreturn order;\n}\nfunction referenceSortOne(rows,order,entry,opts){\nconst locale=entry.locale!==undefined?entry.locale:opts.locale;\nconst base=valueComparator(locale);\nconst descending=entry.descending!==undefined?!!entry.descending:entry.dir==='desc';\nconst present=[];\nconst absent=[];\nfor(const i of order){\nconst v=referenceValue(rows[i],entry.col);\nif(isMissing(v))absent.push(i);else present.push(i);\n}\nconst position=new Map();\nfor(let p=0;p<present.length;p++)position.set(present[p],p);\nconst compare=(a,b)=>{\nconst va=referenceValue(rows[a],entry.col);\nconst vb=referenceValue(rows[b],entry.col);\nlet c;\nif(typeof entry.compare==='function'){\nc=entry.compare(va,vb,rows[a],rows[b],descending);\nif(descending)c=-c;\n}else{\nc=descending?base(vb,va):base(va,vb);\n}\nreturn c!==0?c:position.get(a)-position.get(b);\n};\npresent.sort(compare);\nreturn entry.nullsFirst?absent.concat(present):present.concat(absent);\n}\nfunction referenceFilter(rows,filters,opts={}){\nconst out=[];\nfor(let i=0;i<rows.length;i++){\nif(referencePasses(rows[i],filters,opts,i))out.push(i);\n}\nreturn out;\n}\nfunction referencePasses(row,node,opts,index){\nif(!node)return true;\nif(Array.isArray(node.conditions)){\nconst children=node.conditions.filter((c)=>c!=null);\nif(children.length===0)return true;\nif(node.op==='or')return children.some((c)=>referencePasses(row,c,opts,index));\nconst all=children.every((c)=>referencePasses(row,c,opts,index));\nreturn node.op==='not'?!all:all;\n}\nif(node.col===undefined&&typeof opts.custom==='function')return!!opts.custom(node,row,index);\nreturn testValue(referenceValue(row,node.col),node,opts.locale);\n}\nfunction referenceGroup(rows,cols,order){\nconst source=order||rows.map((_,i)=>i);\nconst seen=new Map();\nconst keys=[];\nconst buckets=[];\nfor(const i of source){\nconst tuple=cols.map((col)=>referenceValue(rows[i],col));\nconst key=tuple\n.map((v)=>(v===null||v===undefined?NULL_MARKER:String(v)))\n.join(KEY_SEPARATOR);\nlet at=seen.get(key);\nif(at===undefined){\nat=keys.length;\nseen.set(key,at);\nkeys.push(tuple);\nbuckets.push([]);\n}\nbuckets[at].push(i);\n}\nreturn{keys,buckets};\n}\nfunction referenceTotal(values,fn,opts={}){\nconst cmp=valueComparator(opts.locale);\nconst live=values.filter((v)=>!isMissing(v));\nconst numbers=live.map(toNumberOrNull).filter((v)=>v!==null);\nswitch(fn){\ncase'count':return values.length;\ncase'countValues':return live.length;\ncase'sum':return numbers.reduce((a,b)=>a+b,0);\ncase'avg':return live.length===0?null:numbers.reduce((a,b)=>a+b,0)/live.length;\ncase'min':return live.length===0?null:live.reduce((a,b)=>(cmp(b,a)<0?b:a));\ncase'max':return live.length===0?null:live.reduce((a,b)=>(cmp(b,a)>0?b:a));\ncase'first':return values.length===0?null:normaliseNull(values[0]);\ncase'last':return values.length===0?null:normaliseNull(values[values.length-1]);\ndefault:return null;\n}\n}\nfunction toNumberOrNull(v){\nif(typeof v==='number')return Number.isNaN(v)?null:v;\nif(v===null||v===undefined||v===''||typeof v==='boolean')return null;\nif(v instanceof Date)return v.getTime();\nconst n=Number(v);\nreturn Number.isNaN(n)?null:n;\n}\nfunction normaliseNull(v){\nreturn v===undefined?null:v;\n}\n});\n__def(\"packages/core/src/compute/index.js\",function(__exports,__req){\n'use strict';\nconst __m0=__req(\"packages/core/src/compute/sort.js\");\nObject.defineProperty(__exports,\"sortColumn\",{enumerable:true,get:function(){return __m0[\"sortColumn\"];}});\nObject.defineProperty(__exports,\"sortMulti\",{enumerable:true,get:function(){return __m0[\"sortMulti\"];}});\nObject.defineProperty(__exports,\"radixSortFloat64\",{enumerable:true,get:function(){return __m0[\"radixSortFloat64\"];}});\nObject.defineProperty(__exports,\"radixSortInt32\",{enumerable:true,get:function(){return __m0[\"radixSortInt32\"];}});\nObject.defineProperty(__exports,\"rankSortDictionary\",{enumerable:true,get:function(){return __m0[\"rankSortDictionary\"];}});\nObject.defineProperty(__exports,\"mergeSortComparator\",{enumerable:true,get:function(){return __m0[\"mergeSortComparator\"];}});\nconst __m1=__req(\"packages/core/src/compute/filter.js\");\nObject.defineProperty(__exports,\"evaluateFilters\",{enumerable:true,get:function(){return __m1[\"evaluateFilters\"];}});\nObject.defineProperty(__exports,\"evaluateCondition\",{enumerable:true,get:function(){return __m1[\"evaluateCondition\"];}});\nObject.defineProperty(__exports,\"compact\",{enumerable:true,get:function(){return __m1[\"compact\"];}});\nObject.defineProperty(__exports,\"testValue\",{enumerable:true,get:function(){return __m1[\"testValue\"];}});\nObject.defineProperty(__exports,\"compilePredicate\",{enumerable:true,get:function(){return __m1[\"compilePredicate\"];}});\nObject.defineProperty(__exports,\"releaseMask\",{enumerable:true,get:function(){return __m1[\"releaseMask\"];}});\nObject.defineProperty(__exports,\"pruneColumn\",{enumerable:true,get:function(){return __m1[\"pruneColumn\"];}});\nObject.defineProperty(__exports,\"mentionsColumn\",{enumerable:true,get:function(){return __m1[\"mentionsColumn\"];}});\nconst __m2=__req(\"packages/core/src/compute/group.js\");\nObject.defineProperty(__exports,\"groupByColumns\",{enumerable:true,get:function(){return __m2[\"groupByColumns\"];}});\nObject.defineProperty(__exports,\"packKeys\",{enumerable:true,get:function(){return __m2[\"packKeys\"];}});\nconst __m3=__req(\"packages/core/src/compute/facet.js\");\nObject.defineProperty(__exports,\"facet\",{enumerable:true,get:function(){return __m3[\"facet\"];}});\nObject.defineProperty(__exports,\"computeBounds\",{enumerable:true,get:function(){return __m3[\"computeBounds\"];}});\nObject.defineProperty(__exports,\"countInto\",{enumerable:true,get:function(){return __m3[\"countInto\"];}});\nObject.defineProperty(__exports,\"bucketOf\",{enumerable:true,get:function(){return __m3[\"bucketOf\"];}});\nObject.defineProperty(__exports,\"facetKind\",{enumerable:true,get:function(){return __m3[\"facetKind\"];}});\nObject.defineProperty(__exports,\"cardinalityOf\",{enumerable:true,get:function(){return __m3[\"cardinalityOf\"];}});\nObject.defineProperty(__exports,\"pickGranularity\",{enumerable:true,get:function(){return __m3[\"pickGranularity\"];}});\nObject.defineProperty(__exports,\"floorTo\",{enumerable:true,get:function(){return __m3[\"floorTo\"];}});\nObject.defineProperty(__exports,\"advance\",{enumerable:true,get:function(){return __m3[\"advance\"];}});\nObject.defineProperty(__exports,\"STRATEGIES\",{enumerable:true,get:function(){return __m3[\"STRATEGIES\"];}});\nObject.defineProperty(__exports,\"GRANULARITIES\",{enumerable:true,get:function(){return __m3[\"GRANULARITIES\"];}});\nObject.defineProperty(__exports,\"DEFAULT_BUCKETS\",{enumerable:true,get:function(){return __m3[\"DEFAULT_BUCKETS\"];}});\nObject.defineProperty(__exports,\"DEFAULT_CARDINALITY_LIMIT\",{enumerable:true,get:function(){return __m3[\"DEFAULT_CARDINALITY_LIMIT\"];}});\nObject.defineProperty(__exports,\"QUANTILE_SAMPLE\",{enumerable:true,get:function(){return __m3[\"QUANTILE_SAMPLE\"];}});\nconst __m4=__req(\"packages/core/src/compute/total.js\");\nObject.defineProperty(__exports,\"TOTAL_FNS\",{enumerable:true,get:function(){return __m4[\"TOTAL_FNS\"];}});\nObject.defineProperty(__exports,\"TOTAL_LABELS\",{enumerable:true,get:function(){return __m4[\"TOTAL_LABELS\"];}});\nObject.defineProperty(__exports,\"totalLabel\",{enumerable:true,get:function(){return __m4[\"totalLabel\"];}});\nObject.defineProperty(__exports,\"total\",{enumerable:true,get:function(){return __m4[\"total\"];}});\nObject.defineProperty(__exports,\"collectValues\",{enumerable:true,get:function(){return __m4[\"collectValues\"];}});\nconst __m5=__req(\"packages/core/src/compute/pivot.js\");\nObject.defineProperty(__exports,\"pivot\",{enumerable:true,get:function(){return __m5[\"pivot\"];}});\nObject.defineProperty(__exports,\"resolvePivotKeys\",{enumerable:true,get:function(){return __m5[\"resolvePivotKeys\"];}});\nObject.defineProperty(__exports,\"pivotKey\",{enumerable:true,get:function(){return __m5[\"pivotKey\"];}});\nObject.defineProperty(__exports,\"joinPath\",{enumerable:true,get:function(){return __m5[\"joinPath\"];}});\nObject.defineProperty(__exports,\"KEY_DELIMITER\",{enumerable:true,get:function(){return __m5[\"KEY_DELIMITER\"];}});\nObject.defineProperty(__exports,\"DEFAULT_PATH_SEPARATOR\",{enumerable:true,get:function(){return __m5[\"DEFAULT_PATH_SEPARATOR\"];}});\nObject.defineProperty(__exports,\"DEFAULT_MAX_COLUMNS\",{enumerable:true,get:function(){return __m5[\"DEFAULT_MAX_COLUMNS\"];}});\nconst __m6=__req(\"packages/core/src/compute/reference.js\");\nObject.defineProperty(__exports,\"referenceSort\",{enumerable:true,get:function(){return __m6[\"referenceSort\"];}});\nObject.defineProperty(__exports,\"referenceFilter\",{enumerable:true,get:function(){return __m6[\"referenceFilter\"];}});\nObject.defineProperty(__exports,\"referenceGroup\",{enumerable:true,get:function(){return __m6[\"referenceGroup\"];}});\nObject.defineProperty(__exports,\"referenceTotal\",{enumerable:true,get:function(){return __m6[\"referenceTotal\"];}});\nObject.defineProperty(__exports,\"referencePasses\",{enumerable:true,get:function(){return __m6[\"referencePasses\"];}});\nObject.defineProperty(__exports,\"referenceValue\",{enumerable:true,get:function(){return __m6[\"referenceValue\"];}});\nconst __m7=__req(\"packages/core/src/compute/handle.js\");\nObject.defineProperty(__exports,\"identity\",{enumerable:true,get:function(){return __m7[\"identity\"];}});\nObject.defineProperty(__exports,\"rowCount\",{enumerable:true,get:function(){return __m7[\"rowCount\"];}});\nObject.defineProperty(__exports,\"presenceReader\",{enumerable:true,get:function(){return __m7[\"presenceReader\"];}});\nObject.defineProperty(__exports,\"bitReader\",{enumerable:true,get:function(){return __m7[\"bitReader\"];}});\nObject.defineProperty(__exports,\"valueReader\",{enumerable:true,get:function(){return __m7[\"valueReader\"];}});\nObject.defineProperty(__exports,\"valueComparator\",{enumerable:true,get:function(){return __m7[\"valueComparator\"];}});\nObject.defineProperty(__exports,\"numericTotalOrder\",{enumerable:true,get:function(){return __m7[\"numericTotalOrder\"];}});\nObject.defineProperty(__exports,\"dictRanks\",{enumerable:true,get:function(){return __m7[\"dictRanks\"];}});\nObject.defineProperty(__exports,\"dictSize\",{enumerable:true,get:function(){return __m7[\"dictSize\"];}});\nObject.defineProperty(__exports,\"dictValue\",{enumerable:true,get:function(){return __m7[\"dictValue\"];}});\nObject.defineProperty(__exports,\"multiValue\",{enumerable:true,get:function(){return __m7[\"multiValue\"];}});\nObject.defineProperty(__exports,\"isMissing\",{enumerable:true,get:function(){return __m7[\"isMissing\"];}});\n});\n__def(\"packages/worker/src/kernel.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"loadCompute\",{enumerable:true,get:function(){return loadCompute;}});\nObject.defineProperty(__exports,\"setCompute\",{enumerable:true,get:function(){return setCompute;}});\nObject.defineProperty(__exports,\"dispatch\",{enumerable:true,get:function(){return dispatch;}});\nObject.defineProperty(__exports,\"handleMessage\",{enumerable:true,get:function(){return handleMessage;}});\nObject.defineProperty(__exports,\"installKernel\",{enumerable:true,get:function(){return installKernel;}});\nconst __m0=__req(\"packages/worker/src/transport.js\");\nconst PROTOCOL=__m0[\"PROTOCOL\"];\nconst OPS=__m0[\"OPS\"];\nconst CONTROL=__m0[\"CONTROL\"];\nconst ERRORS=__m0[\"ERRORS\"];\nconst unpackHandle=__m0[\"unpackHandle\"];\nconst unpackHandles=__m0[\"unpackHandles\"];\nconst createMaskPool=__m0[\"createMaskPool\"];\nconst collectTransfers=__m0[\"collectTransfers\"];\nlet computeModule=null;\nlet computePromise=null;\nlet computeError=null;\nasync function loadCompute(loader){\nif(computeModule)return computeModule;\nif(!computePromise){\nconst load=loader||(()=>Promise.resolve(__req(\"packages/core/src/compute/index.js\")));\ncomputePromise=Promise.resolve()\n.then(load)\n.then((mod)=>{computeModule=mod;return mod;})\n.catch((err)=>{\ncomputeError=err;\ncomputeModule=null;\nreturn null;\n});\n}\nreturn computePromise;\n}\nfunction setCompute(mod){\ncomputeModule=mod;\ncomputePromise=mod?Promise.resolve(mod):null;\ncomputeError=mod?null:computeError;\n}\nfunction filterContext(handles,count,locale){\nconst byId=new Map();\nfor(const h of handles)if(h)byId.set(h.id,h);\nreturn{\nhandle(colId){return byId.get(colId);},\ncount,\npool:createMaskPool(),\nlocale,\n};\n}\nfunction dispatch(request,compute){\nconst{op,args}=request;\nconst fn=compute[op];\nif(typeof fn!=='function'){\nconst err=new Error(`[lattice] compute kernel '${op}' is not exported`);\n(err).code=ERRORS.NO_KERNEL;\nthrow err;\n}\nswitch(op){\ncase OPS.SORT_COLUMN:\nreturn fn(unpackHandle(args.handle),args.order??null,args.opts||{});\ncase OPS.SORT_MULTI:{\nconst handles=unpackHandles(args.handles||[]);\nconst entries=(args.entries||[]).map((e)=>({\n...e,\nhandle:handles[e.index],\n}));\nreturn fn(handles,entries,args.order??null);\n}\ncase OPS.EVALUATE_FILTERS:\nreturn fn(args.filters,filterContext(unpackHandles(args.handles||[]),args.count,args.locale));\ncase OPS.COMPACT:\nreturn fn(args.mask,args.count,undefined);\ncase OPS.GROUP_BY_COLUMNS:\nreturn fn(unpackHandles(args.handles||[]),args.order??null,args.opts||{});\ncase OPS.TOTAL:\nreturn fn(unpackHandle(args.handle),args.indices??null,args.fn);\ncase OPS.PIVOT:\nreturn fn(unpackHandles(args.handles||[]),args.order??null,args.opts||{});\ncase OPS.FACET:\nreturn fn(unpackHandle(args.handle),args.indices??null,args.count,args.opts||{});\ndefault:{\nconst err=new Error(`[lattice] unknown worker op '${op}'`);\n(err).code=ERRORS.PROTOCOL;\nthrow err;\n}\n}\n}\nasync function handleMessage(message,opts={}){\nif(!message||message.lattice!==PROTOCOL)return null;\nconst{id,op}=message;\nif(op===CONTROL.CANCEL){\nopts.cancelled?.add(message.target);\nreturn null;\n}\nif(op===CONTROL.PING){\nreturn{reply:{lattice:PROTOCOL,id,ok:true,result:'pong'},transfer:[]};\n}\nconst compute=await loadCompute(opts.loader);\nif(!compute){\nreturn{\nreply:{\nlattice:PROTOCOL,\nid,\nok:false,\nerror:{\ncode:ERRORS.NO_COMPUTE,\nmessage:`[lattice] compute kernels unavailable in worker: ${computeError?computeError.message:'module not found'}`,\n},\n},\ntransfer:[],\n};\n}\nif(opts.cancelled?.has(id)){\nopts.cancelled.delete(id);\nreturn{reply:{lattice:PROTOCOL,id,ok:false,error:{code:ERRORS.ABORTED,message:'[lattice] request superseded'}},transfer:[]};\n}\ntry{\nconst result=dispatch(message,compute);\nif(opts.cancelled?.has(id)){\nopts.cancelled.delete(id);\nreturn{reply:{lattice:PROTOCOL,id,ok:false,error:{code:ERRORS.ABORTED,message:'[lattice] request superseded'}},transfer:[]};\n}\nreturn{reply:{lattice:PROTOCOL,id,ok:true,result},transfer:collectTransfers(result)};\n}catch(err){\nconst e=(err);\nreturn{\nreply:{\nlattice:PROTOCOL,\nid,\nok:false,\nerror:{code:e.code||ERRORS.KERNEL,message:e.message||String(err),stack:e.stack},\n},\ntransfer:[],\n};\n}\n}\nfunction installKernel(scope,opts={}){\nconst cancelled=new Set();\nconst onMessage=async(event)=>{\nconst outcome=await handleMessage(event.data,{loader:opts.loader,cancelled});\nif(!outcome)return;\nscope.postMessage(outcome.reply,outcome.transfer);\n};\nscope.addEventListener('message',onMessage);\nloadCompute(opts.loader).then((mod)=>{\nscope.postMessage({lattice:PROTOCOL,id:0,op:CONTROL.READY,compute:!!mod});\n});\nreturn()=>scope.removeEventListener('message',onMessage);\n}\n});\nvar __entry=__req(\"packages/worker/src/kernel.js\");\nroot[\"__latticeKernel\"]=__entry;\n})(typeof globalThis!=='undefined'?globalThis:this);\n__latticeKernel.installKernel(self);\n",{type:'classic'});
|
|
60895
63249
|
}catch(err){}
|
|
60896
63250
|
var __entry=__req("packages/dom/src/index.js");
|
|
60897
63251
|
if(typeof module==='object'&&module.exports){module.exports=__entry;}
|