fit-file-parser 3.1.3 → 4.0.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.
@@ -1,4 +1,4 @@
1
- import { calculateCRC, getArrayBuffer, readRecord } from './binary.js';
1
+ import { calculateCRC, readRecord } from './binary.js';
2
2
  import { mapDataIntoLap, mapDataIntoSession } from './helper.js';
3
3
  export { FitBaseType, FitEncoder } from './fit-encoder.js';
4
4
  export default class FitParser {
@@ -27,7 +27,10 @@ export default class FitParser {
27
27
  }
28
28
  parse(content, callback) {
29
29
  var _a;
30
- const blob = new Uint8Array(getArrayBuffer(content));
30
+ const blob = content instanceof ArrayBuffer
31
+ ? new Uint8Array(content)
32
+ : new Uint8Array(content.buffer, content.byteOffset, content.byteLength);
33
+ const dataView = new DataView(blob.buffer, blob.byteOffset, blob.byteLength);
31
34
  if (blob.length < 12) {
32
35
  callback('File to small to be a FIT file', undefined);
33
36
  if (!this.options.force) {
@@ -51,27 +54,25 @@ export default class FitParser {
51
54
  return;
52
55
  }
53
56
  }
54
- if (headerLength === 14) {
57
+ if (headerLength === 14 && !this.options.force) {
55
58
  const crcHeader = blob[12] + (blob[13] << 8);
56
59
  const crcHeaderCalc = calculateCRC(blob, 0, 12);
57
60
  if (crcHeader !== crcHeaderCalc) {
58
61
  // callback('Header CRC mismatch', {});
59
62
  // TODO: fix Header CRC check
60
- if (!this.options.force) {
61
- return;
62
- }
63
+ return;
63
64
  }
64
65
  }
65
66
  const protocolVersion = blob[1];
66
67
  const profileVersion = blob[2] + (blob[3] << 8);
67
68
  const dataLength = blob[4] + (blob[5] << 8) + (blob[6] << 16) + (blob[7] << 24);
68
69
  const crcStart = dataLength + headerLength;
69
- const crcFile = blob[crcStart] + (blob[crcStart + 1] << 8);
70
- const crcFileCalc = calculateCRC(blob, headerLength === 12 ? 0 : headerLength, crcStart);
71
- if (crcFile !== crcFileCalc) {
72
- // callback('File CRC mismatch', {});
73
- // TODO: fix File CRC check
74
- if (!this.options.force) {
70
+ if (!this.options.force) {
71
+ const crcFile = blob[crcStart] + (blob[crcStart + 1] << 8);
72
+ const crcFileCalc = calculateCRC(blob, headerLength === 12 ? 0 : headerLength, crcStart);
73
+ if (crcFile !== crcFileCalc) {
74
+ // callback('File CRC mismatch', {});
75
+ // TODO: fix File CRC check
75
76
  return;
76
77
  }
77
78
  }
@@ -115,7 +116,7 @@ export default class FitParser {
115
116
  let lastStopTimestamp;
116
117
  let pausedTime = 0;
117
118
  while (loopIndex < crcStart) {
118
- const { nextIndex, messageType, message } = readRecord(blob, messageTypes, developerFields, loopIndex, this.options, startDate, pausedTime);
119
+ const { nextIndex, messageType, message } = readRecord(blob, messageTypes, developerFields, loopIndex, this.options, startDate, pausedTime, dataView);
119
120
  loopIndex = nextIndex;
120
121
  switch (messageType) {
121
122
  case 'lap':
package/dist/fit.d.ts CHANGED
@@ -8,8 +8,9 @@ export interface FieldDefinition {
8
8
  baseTypeNo: number;
9
9
  name: string;
10
10
  dataType: string;
11
- scale?: number;
11
+ scale?: number | null;
12
12
  offset?: number;
13
+ requiresBoundedDataView?: boolean;
13
14
  developerDataIndex?: number;
14
15
  isDeveloperField?: boolean;
15
16
  }
package/dist/fit.js CHANGED
@@ -6350,164 +6350,484 @@ export const FIT = {
6350
6350
  5759: 'actigraphcorp',
6351
6351
  },
6352
6352
  garmin_product: {
6353
- 0: 'hrm_bike',
6354
6353
  1: 'hrm1',
6355
6354
  2: 'axh01',
6356
6355
  3: 'axb01',
6357
6356
  4: 'axb02',
6358
6357
  5: 'hrm2ss',
6359
- 6: 'dsi_alf02',
6358
+ 6: 'dsiAlf02',
6360
6359
  7: 'hrm3ss',
6361
- 8: 'hrm_run_single_byte_product_id',
6360
+ 8: 'hrmRunSingleByteProductId',
6362
6361
  9: 'bsm',
6363
6362
  10: 'bcm',
6364
6363
  11: 'axs01',
6365
- 12: 'hrm_tri_single_byte_product_id',
6366
- 14: 'fr225_single_byte_product_id',
6367
- 473: 'fr301_china',
6368
- 474: 'fr301_japan',
6369
- 475: 'fr301_korea',
6370
- 494: 'fr301_taiwan',
6364
+ 12: 'hrmTriSingleByteProductId',
6365
+ 13: 'hrm4RunSingleByteProductId',
6366
+ 14: 'fr225SingleByteProductId',
6367
+ 15: 'gen3BsmSingleByteProductId',
6368
+ 16: 'gen3BcmSingleByteProductId',
6369
+ 22: 'hrmFitSingleByteProductId',
6370
+ 255: 'oHR',
6371
+ 473: 'fr301China',
6372
+ 474: 'fr301Japan',
6373
+ 475: 'fr301Korea',
6374
+ 494: 'fr301Taiwan',
6371
6375
  717: 'fr405',
6372
6376
  782: 'fr50',
6373
- 987: 'fr405_japan',
6377
+ 987: 'fr405Japan',
6374
6378
  988: 'fr60',
6375
- 1011: 'dsi_alf01',
6379
+ 1011: 'dsiAlf01',
6376
6380
  1018: 'fr310xt',
6377
6381
  1036: 'edge500',
6378
6382
  1124: 'fr110',
6379
6383
  1169: 'edge800',
6380
- 1199: 'edge500_taiwan',
6381
- 1213: 'edge500_japan',
6384
+ 1199: 'edge500Taiwan',
6385
+ 1213: 'edge500Japan',
6382
6386
  1253: 'chirp',
6383
- 1274: 'fr110_japan',
6387
+ 1274: 'fr110Japan',
6384
6388
  1325: 'edge200',
6385
6389
  1328: 'fr910xt',
6386
- 1333: 'edge800_taiwan',
6387
- 1334: 'edge800_japan',
6390
+ 1333: 'edge800Taiwan',
6391
+ 1334: 'edge800Japan',
6388
6392
  1341: 'alf04',
6389
6393
  1345: 'fr610',
6390
- 1360: 'fr210_japan',
6391
- 1380: 'vector_ss',
6392
- 1381: 'vector_cp',
6393
- 1386: 'edge800_china',
6394
- 1387: 'edge500_china',
6395
- 1410: 'fr610_japan',
6396
- 1422: 'edge500_korea',
6394
+ 1360: 'fr210Japan',
6395
+ 1380: 'vectorSs',
6396
+ 1381: 'vectorCp',
6397
+ 1386: 'edge800China',
6398
+ 1387: 'edge500China',
6399
+ 1405: 'approachG10',
6400
+ 1410: 'fr610Japan',
6401
+ 1422: 'edge500Korea',
6397
6402
  1436: 'fr70',
6398
- 1446: 'fr310xt_4t',
6403
+ 1446: 'fr310xt4t',
6399
6404
  1461: 'amx',
6400
6405
  1482: 'fr10',
6401
- 1497: 'edge800_korea',
6406
+ 1497: 'edge800Korea',
6402
6407
  1499: 'swim',
6403
- 1537: 'fr910xt_china',
6408
+ 1537: 'fr910xtChina',
6404
6409
  1551: 'fenix',
6405
- 1555: 'edge200_taiwan',
6410
+ 1555: 'edge200Taiwan',
6406
6411
  1561: 'edge510',
6407
6412
  1567: 'edge810',
6408
6413
  1570: 'tempe',
6409
- 1600: 'fr910xt_japan',
6414
+ 1600: 'fr910xtJapan',
6410
6415
  1623: 'fr620',
6411
6416
  1632: 'fr220',
6412
- 1664: 'fr910xt_korea',
6413
- 1688: 'fr10_japan',
6414
- 1721: 'edge810_japan',
6415
- 1735: 'virb_elite',
6416
- 1736: 'edge_touring',
6417
- 1742: 'edge510_japan',
6418
- 1743: 'hrm_tri',
6419
- 1752: 'hrm_run',
6417
+ 1664: 'fr910xtKorea',
6418
+ 1688: 'fr10Japan',
6419
+ 1721: 'edge810Japan',
6420
+ 1735: 'virbElite',
6421
+ 1736: 'edgeTouring',
6422
+ 1742: 'edge510Japan',
6423
+ 1743: 'hrmTri',
6424
+ 1752: 'hrmRun',
6420
6425
  1765: 'fr920xt',
6421
- 1821: 'edge510_asia',
6422
- 1822: 'edge810_china',
6423
- 1823: 'edge810_taiwan',
6426
+ 1821: 'edge510Asia',
6427
+ 1822: 'edge810China',
6428
+ 1823: 'edge810Taiwan',
6424
6429
  1836: 'edge1000',
6425
- 1837: 'vivo_fit',
6426
- 1853: 'virb_remote',
6427
- 1885: 'vivo_ki',
6430
+ 1837: 'vivoFit',
6431
+ 1853: 'virbRemote',
6432
+ 1885: 'vivoKi',
6428
6433
  1903: 'fr15',
6429
- 1907: 'vivo_active',
6430
- 1918: 'edge510_korea',
6431
- 1928: 'fr620_japan',
6432
- 1929: 'fr620_china',
6433
- 1930: 'fr220_japan',
6434
- 1931: 'fr220_china',
6435
- 1936: 'approach_s6',
6436
- 1956: 'vivo_smart',
6434
+ 1907: 'vivoActive',
6435
+ 1918: 'edge510Korea',
6436
+ 1928: 'fr620Japan',
6437
+ 1929: 'fr620China',
6438
+ 1930: 'fr220Japan',
6439
+ 1931: 'fr220China',
6440
+ 1936: 'approachS6',
6441
+ 1956: 'vivoSmart',
6437
6442
  1967: 'fenix2',
6438
6443
  1988: 'epix',
6439
6444
  2050: 'fenix3',
6440
- 2052: 'edge1000_taiwan',
6441
- 2053: 'edge1000_japan',
6442
- 2061: 'fr15_japan',
6445
+ 2052: 'edge1000Taiwan',
6446
+ 2053: 'edge1000Japan',
6447
+ 2061: 'fr15Japan',
6443
6448
  2067: 'edge520',
6444
- 2070: 'edge1000_china',
6445
- 2072: 'fr620_russia',
6446
- 2073: 'fr220_russia',
6447
- 2079: 'vector_s',
6448
- 2100: 'edge1000_korea',
6449
- 2130: 'fr920xt_taiwan',
6450
- 2131: 'fr920xt_china',
6451
- 2132: 'fr920xt_japan',
6449
+ 2070: 'edge1000China',
6450
+ 2072: 'fr620Russia',
6451
+ 2073: 'fr220Russia',
6452
+ 2079: 'vectorS',
6453
+ 2100: 'edge1000Korea',
6454
+ 2130: 'fr920xtTaiwan',
6455
+ 2131: 'fr920xtChina',
6456
+ 2132: 'fr920xtJapan',
6452
6457
  2134: 'virbx',
6453
- 2135: 'vivo_smart_apac',
6454
- 2140: 'etrex_touch',
6458
+ 2135: 'vivoSmartApac',
6459
+ 2140: 'etrexTouch',
6455
6460
  2147: 'edge25',
6456
6461
  2148: 'fr25',
6457
- 2150: 'vivo_fit2',
6462
+ 2150: 'vivoFit2',
6458
6463
  2153: 'fr225',
6459
6464
  2156: 'fr630',
6460
6465
  2157: 'fr230',
6461
6466
  2158: 'fr735xt',
6462
- 2160: 'vivo_active_apac',
6463
- 2161: 'vector_2',
6464
- 2162: 'vector_2s',
6467
+ 2160: 'vivoActiveApac',
6468
+ 2161: 'vector2',
6469
+ 2162: 'vector2s',
6465
6470
  2172: 'virbxe',
6466
- 2173: 'fr620_taiwan',
6467
- 2174: 'fr220_taiwan',
6471
+ 2173: 'fr620Taiwan',
6472
+ 2174: 'fr220Taiwan',
6468
6473
  2175: 'truswing',
6469
- 2188: 'fenix3_china',
6470
- 2189: 'fenix3_twn',
6471
- 2192: 'varia_headlight',
6472
- 2193: 'varia_taillight_old',
6473
- 2204: 'edge_explore_1000',
6474
- 2219: 'fr225_asia',
6475
- 2225: 'varia_radar_taillight',
6476
- 2226: 'varia_radar_display',
6474
+ 2187: 'd2airvenu',
6475
+ 2188: 'fenix3China',
6476
+ 2189: 'fenix3Twn',
6477
+ 2192: 'variaHeadlight',
6478
+ 2193: 'variaTaillightOld',
6479
+ 2204: 'edgeExplore1000',
6480
+ 2219: 'fr225Asia',
6481
+ 2225: 'variaRadarTaillight',
6482
+ 2226: 'variaRadarDisplay',
6477
6483
  2238: 'edge20',
6478
- 2262: 'd2_bravo',
6479
- 2266: 'approach_s20',
6480
- 2276: 'varia_remote',
6481
- 2327: 'hrm4_run',
6482
- 2337: 'vivo_active_hr',
6483
- 2348: 'vivo_smart_hr',
6484
- 2368: 'vivo_move',
6485
- 2398: 'varia_vision',
6486
- 2406: 'vivo_fit3',
6487
- 2413: 'fenix3_hr',
6488
- 2417: 'virb_ultra_30',
6489
- 2429: 'index_smart_scale',
6484
+ 2260: 'edge520Asia',
6485
+ 2261: 'edge520Japan',
6486
+ 2262: 'd2Bravo',
6487
+ 2266: 'approachS20',
6488
+ 2271: 'vivoSmart2',
6489
+ 2274: 'edge1000Thai',
6490
+ 2276: 'variaRemote',
6491
+ 2288: 'edge25Asia',
6492
+ 2289: 'edge25Jpn',
6493
+ 2290: 'edge20Asia',
6494
+ 2292: 'approachX40',
6495
+ 2293: 'fenix3Japan',
6496
+ 2294: 'vivoSmartEmea',
6497
+ 2310: 'fr630Asia',
6498
+ 2311: 'fr630Jpn',
6499
+ 2313: 'fr230Jpn',
6500
+ 2327: 'hrm4Run',
6501
+ 2332: 'epixJapan',
6502
+ 2337: 'vivoActiveHr',
6503
+ 2347: 'vivoSmartGpsHr',
6504
+ 2348: 'vivoSmartHr',
6505
+ 2361: 'vivoSmartHrAsia',
6506
+ 2362: 'vivoSmartGpsHrAsia',
6507
+ 2368: 'vivoMove',
6508
+ 2379: 'variaTaillight',
6509
+ 2396: 'fr235Asia',
6510
+ 2397: 'fr235Japan',
6511
+ 2398: 'variaVision',
6512
+ 2406: 'vivoFit3',
6513
+ 2407: 'fenix3Korea',
6514
+ 2408: 'fenix3Sea',
6515
+ 2413: 'fenix3Hr',
6516
+ 2417: 'virbUltra30',
6517
+ 2429: 'indexSmartScale',
6490
6518
  2431: 'fr235',
6491
- 2432: 'fenix3_chronos',
6519
+ 2432: 'fenix3Chronos',
6492
6520
  2441: 'oregon7xx',
6493
6521
  2444: 'rino7xx',
6522
+ 2457: 'epixKorea',
6523
+ 2473: 'fenix3HrChn',
6524
+ 2474: 'fenix3HrTwn',
6525
+ 2475: 'fenix3HrJpn',
6526
+ 2476: 'fenix3HrSea',
6527
+ 2477: 'fenix3HrKor',
6494
6528
  2496: 'nautix',
6495
- 2530: 'edge_820',
6496
- 2531: 'edge_explore_820',
6529
+ 2497: 'vivoActiveHrApac',
6530
+ 2503: 'fr35',
6531
+ 2512: 'oregon7xxWw',
6532
+ 2530: 'edge820',
6533
+ 2531: 'edgeExplore820',
6534
+ 2533: 'fr735xtApac',
6535
+ 2534: 'fr735xtJapan',
6497
6536
  2544: 'fenix5s',
6498
- 2547: 'd2_bravo_titanium',
6499
- 2567: 'varia_ut800',
6500
- 2593: 'running_dynamics_pod',
6537
+ 2547: 'd2BravoTitanium',
6538
+ 2567: 'variaUt800',
6539
+ 2593: 'runningDynamicsPod',
6540
+ 2599: 'edge820China',
6541
+ 2600: 'edge820Japan',
6501
6542
  2604: 'fenix5x',
6502
- 2606: 'vivo_fit_jr',
6543
+ 2606: 'vivoFitJr',
6544
+ 2622: 'vivoSmart3',
6545
+ 2623: 'vivoSport',
6546
+ 2628: 'edge820Taiwan',
6547
+ 2629: 'edge820Korea',
6548
+ 2630: 'edge820Sea',
6549
+ 2650: 'fr35Hebrew',
6550
+ 2656: 'approachS60',
6551
+ 2667: 'fr35Apac',
6552
+ 2668: 'fr35Japan',
6553
+ 2675: 'fenix3ChronosAsia',
6554
+ 2687: 'virb360',
6503
6555
  2691: 'fr935',
6504
6556
  2697: 'fenix5',
6557
+ 2700: 'vivoactive3',
6558
+ 2713: 'edge1030',
6559
+ 2727: 'fr35Sea',
6560
+ 2733: 'fr235ChinaNfc',
6561
+ 2769: 'foretrex601_701',
6562
+ 2772: 'vivoMoveHr',
6563
+ 2787: 'vector3',
6564
+ 2796: 'fenix5Asia',
6565
+ 2797: 'fenix5sAsia',
6566
+ 2798: 'fenix5xAsia',
6567
+ 2806: 'approachZ80',
6568
+ 2814: 'fr35Korea',
6569
+ 2819: 'd2charlie',
6570
+ 2831: 'vivoSmart3Apac',
6571
+ 2832: 'vivoSportApac',
6572
+ 2833: 'fr935Asia',
6505
6573
  2859: 'descent',
6574
+ 2878: 'vivoFit4',
6575
+ 2886: 'fr645',
6576
+ 2888: 'fr645m',
6577
+ 2891: 'fr30',
6578
+ 2900: 'fenix5sPlus',
6579
+ 2909: 'edge130',
6580
+ 2924: 'edge1030Asia',
6581
+ 2927: 'vivosmart4',
6582
+ 2945: 'vivoMoveHrAsia',
6583
+ 2962: 'approachX10',
6584
+ 2977: 'fr30Asia',
6585
+ 2988: 'vivoactive3mW',
6586
+ 3003: 'fr645Asia',
6587
+ 3004: 'fr645mAsia',
6588
+ 3011: 'edgeExplore',
6589
+ 3028: 'gpsmap66',
6590
+ 3049: 'approachS10',
6591
+ 3066: 'vivoactive3mL',
6592
+ 3076: 'fr245',
6593
+ 3077: 'fr245Music',
6594
+ 3085: 'approachG80',
6595
+ 3092: 'edge130Asia',
6596
+ 3095: 'edge1030Bontrager',
6597
+ 3110: 'fenix5Plus',
6598
+ 3111: 'fenix5xPlus',
6599
+ 3112: 'edge520Plus',
6600
+ 3113: 'fr945',
6601
+ 3121: 'edge530',
6602
+ 3122: 'edge830',
6603
+ 3126: 'instinctEsports',
6604
+ 3134: 'fenix5sPlusApac',
6605
+ 3135: 'fenix5xPlusApac',
6606
+ 3142: 'edge520PlusApac',
6607
+ 3143: 'descentT1',
6608
+ 3144: 'fr235lAsia',
6609
+ 3145: 'fr245Asia',
6610
+ 3163: 'vivoActive3mApac',
6611
+ 3192: 'gen3Bsm',
6612
+ 3193: 'gen3Bcm',
6613
+ 3218: 'vivoSmart4Asia',
6614
+ 3224: 'vivoactive4Small',
6615
+ 3225: 'vivoactive4Large',
6616
+ 3226: 'venu',
6617
+ 3246: 'marqDriver',
6618
+ 3247: 'marqAviator',
6619
+ 3248: 'marqCaptain',
6620
+ 3249: 'marqCommander',
6621
+ 3250: 'marqExpedition',
6622
+ 3251: 'marqAthlete',
6623
+ 3258: 'descentMk2',
6624
+ 3282: 'fr45',
6625
+ 3284: 'gpsmap66i',
6626
+ 3287: 'fenix6SSport',
6627
+ 3288: 'fenix6S',
6628
+ 3289: 'fenix6Sport',
6629
+ 3290: 'fenix6',
6630
+ 3291: 'fenix6x',
6631
+ 3299: 'hrmDual',
6632
+ 3300: 'hrmPro',
6633
+ 3308: 'vivoMove3Premium',
6634
+ 3314: 'approachS40',
6635
+ 3321: 'fr245mAsia',
6636
+ 3349: 'edge530Apac',
6637
+ 3350: 'edge830Apac',
6638
+ 3378: 'vivoMove3',
6639
+ 3387: 'vivoActive4SmallAsia',
6640
+ 3388: 'vivoActive4LargeAsia',
6641
+ 3389: 'vivoActive4OledAsia',
6642
+ 3405: 'swim2',
6643
+ 3420: 'marqDriverAsia',
6644
+ 3421: 'marqAviatorAsia',
6645
+ 3422: 'vivoMove3Asia',
6646
+ 3441: 'fr945Asia',
6647
+ 3446: 'vivoActive3tChn',
6648
+ 3448: 'marqCaptainAsia',
6649
+ 3449: 'marqCommanderAsia',
6650
+ 3450: 'marqExpeditionAsia',
6651
+ 3451: 'marqAthleteAsia',
6652
+ 3461: 'indexSmartScale2',
6653
+ 3466: 'instinctSolar',
6654
+ 3469: 'fr45Asia',
6655
+ 3473: 'vivoactive3Daimler',
6656
+ 3498: 'legacyRey',
6657
+ 3499: 'legacyDarthVader',
6658
+ 3500: 'legacyCaptainMarvel',
6659
+ 3501: 'legacyFirstAvenger',
6660
+ 3512: 'fenix6sSportAsia',
6661
+ 3513: 'fenix6sAsia',
6662
+ 3514: 'fenix6SportAsia',
6663
+ 3515: 'fenix6Asia',
6664
+ 3516: 'fenix6xAsia',
6665
+ 3535: 'legacyCaptainMarvelAsia',
6666
+ 3536: 'legacyFirstAvengerAsia',
6667
+ 3537: 'legacyReyAsia',
6668
+ 3538: 'legacyDarthVaderAsia',
6669
+ 3542: 'descentMk2s',
6670
+ 3558: 'edge130Plus',
6671
+ 3570: 'edge1030Plus',
6672
+ 3578: 'rally200',
6673
+ 3589: 'fr745',
6674
+ 3596: 'venusqMusic',
6675
+ 3599: 'venusqMusicV2',
6676
+ 3600: 'venusq',
6677
+ 3615: 'lily',
6678
+ 3624: 'marqAdventurer',
6679
+ 3638: 'enduro',
6680
+ 3639: 'swim2Apac',
6681
+ 3648: 'marqAdventurerAsia',
6682
+ 3652: 'fr945Lte',
6683
+ 3702: 'descentMk2Asia',
6684
+ 3703: 'venu2',
6685
+ 3704: 'venu2s',
6686
+ 3737: 'venuDaimlerAsia',
6687
+ 3739: 'marqGolfer',
6688
+ 3740: 'venuDaimler',
6689
+ 3794: 'fr745Asia',
6690
+ 3808: 'variaRct715',
6691
+ 3809: 'lilyAsia',
6692
+ 3812: 'edge1030PlusAsia',
6693
+ 3813: 'edge130PlusAsia',
6694
+ 3823: 'approachS12',
6695
+ 3837: 'venusqAsia',
6696
+ 3843: 'edge1040',
6697
+ 3850: 'marqGolferAsia',
6698
+ 3851: 'venu2Plus',
6699
+ 3865: 'gnss',
6700
+ 3869: 'fr55',
6701
+ 3872: 'enduroAsia',
6702
+ 3888: 'instinct2',
6703
+ 3889: 'instinct2s',
6704
+ 3905: 'fenix7s',
6705
+ 3906: 'fenix7',
6706
+ 3907: 'fenix7x',
6707
+ 3908: 'fenix7sApac',
6708
+ 3909: 'fenix7Apac',
6709
+ 3910: 'fenix7xApac',
6710
+ 3927: 'approachG12',
6711
+ 3930: 'descentMk2sAsia',
6712
+ 3934: 'approachS42',
6713
+ 3943: 'epixGen2',
6714
+ 3944: 'epixGen2Apac',
6715
+ 3949: 'venu2sAsia',
6716
+ 3950: 'venu2Asia',
6717
+ 3978: 'fr945LteAsia',
6718
+ 3982: 'vivoMoveSport',
6719
+ 3983: 'vivomoveTrend',
6720
+ 3986: 'approachS12Asia',
6721
+ 3990: 'fr255Music',
6722
+ 3991: 'fr255SmallMusic',
6723
+ 3992: 'fr255',
6724
+ 3993: 'fr255Small',
6725
+ 4001: 'approachG12Asia',
6726
+ 4002: 'approachS42Asia',
6727
+ 4005: 'descentG1',
6728
+ 4017: 'venu2PlusAsia',
6729
+ 4024: 'fr955',
6730
+ 4033: 'fr55Asia',
6731
+ 4061: 'edge540',
6732
+ 4062: 'edge840',
6733
+ 4063: 'vivosmart5',
6734
+ 4071: 'instinct2Asia',
6735
+ 4105: 'marqGen2',
6736
+ 4115: 'venusq2',
6737
+ 4116: 'venusq2music',
6738
+ 4124: 'marqGen2Aviator',
6739
+ 4125: 'd2AirX10',
6740
+ 4130: 'hrmProPlus',
6741
+ 4132: 'descentG1Asia',
6742
+ 4135: 'tactix7',
6743
+ 4155: 'instinctCrossover',
6744
+ 4169: 'edgeExplore2',
6745
+ 4222: 'descentMk3',
6746
+ 4223: 'descentMk3i',
6747
+ 4233: 'approachS70',
6748
+ 4257: 'fr265Large',
6749
+ 4258: 'fr265Small',
6750
+ 4260: 'venu3',
6751
+ 4261: 'venu3s',
6752
+ 4265: 'tacxNeoSmart',
6753
+ 4266: 'tacxNeo2Smart',
6754
+ 4267: 'tacxNeo2TSmart',
6755
+ 4268: 'tacxNeoSmartBike',
6756
+ 4269: 'tacxSatoriSmart',
6757
+ 4270: 'tacxFlowSmart',
6758
+ 4271: 'tacxVortexSmart',
6759
+ 4272: 'tacxBushidoSmart',
6760
+ 4273: 'tacxGeniusSmart',
6761
+ 4274: 'tacxFluxFluxSSmart',
6762
+ 4275: 'tacxFlux2Smart',
6763
+ 4276: 'tacxMagnum',
6764
+ 4305: 'edge1040Asia',
6765
+ 4312: 'epixGen2Pro42',
6766
+ 4313: 'epixGen2Pro47',
6767
+ 4314: 'epixGen2Pro51',
6768
+ 4315: 'fr965',
6769
+ 4341: 'enduro2',
6770
+ 4374: 'fenix7sProSolar',
6771
+ 4375: 'fenix7ProSolar',
6772
+ 4376: 'fenix7xProSolar',
6773
+ 4380: 'lily2',
6774
+ 4394: 'instinct2x',
6775
+ 4426: 'vivoactive5',
6776
+ 4432: 'fr165',
6777
+ 4433: 'fr165Music',
6778
+ 4440: 'edge1050',
6779
+ 4442: 'descentT2',
6780
+ 4446: 'hrmFit',
6781
+ 4472: 'marqGen2Commander',
6782
+ 4477: 'lilyAthlete',
6783
+ 4525: 'rallyX10',
6784
+ 4532: 'fenix8Solar',
6785
+ 4533: 'fenix8SolarLarge',
6786
+ 4534: 'fenix8Small',
6787
+ 4536: 'fenix8',
6788
+ 4556: 'd2Mach1Pro',
6789
+ 4575: 'enduro3',
6790
+ 4583: 'instinctE40mm',
6791
+ 4584: 'instinctE45mm',
6792
+ 4585: 'instinct3Solar45mm',
6793
+ 4586: 'instinct3Amoled45mm',
6794
+ 4587: 'instinct3Amoled50mm',
6795
+ 4588: 'descentG2',
6796
+ 4603: 'venuX1',
6797
+ 4606: 'hrm200',
6798
+ 4625: 'vivoactive6',
6799
+ 4631: 'fenix8Pro',
6800
+ 4633: 'edge550',
6801
+ 4634: 'edge850',
6802
+ 4643: 'venu4',
6803
+ 4644: 'venu4s',
6804
+ 4647: 'approachS44',
6805
+ 4655: 'edgeMtb',
6806
+ 4656: 'approachS50',
6807
+ 4666: 'fenixE',
6808
+ 4678: 'instinctCrossoverAmoled',
6809
+ 4745: 'bounce2',
6810
+ 4759: 'instinct3Solar50mm',
6811
+ 4775: 'tactix8Amoled',
6812
+ 4776: 'tactix8Solar',
6813
+ 4814: 'fr170Music',
6814
+ 4815: 'fr170',
6815
+ 4825: 'approachJ1',
6816
+ 4879: 'd2Mach2',
6817
+ 4916: 'fr702026',
6818
+ 4944: 'd2AirX15',
6819
+ 5056: 'd2Mach2Pro',
6506
6820
  10007: 'sdm4',
6507
- 10014: 'edge_remote',
6508
- 20119: 'training_center',
6509
- 65531: 'connectiq_simulator',
6510
- 65532: 'android_antplus_plugin',
6821
+ 10014: 'edgeRemote',
6822
+ 20119: 'trainingCenter',
6823
+ 20533: 'tacxTrainingAppWin',
6824
+ 20534: 'tacxTrainingAppMac',
6825
+ 20565: 'tacxTrainingAppMacCatalyst',
6826
+ 30045: 'tacxTrainingAppAndroid',
6827
+ 30046: 'tacxTrainingAppIos',
6828
+ 30047: 'tacxTrainingAppLegacy',
6829
+ 65531: 'connectiqSimulator',
6830
+ 65532: 'androidAntplusPlugin',
6511
6831
  65534: 'connect',
6512
6832
  },
6513
6833
  antplus_device_type: {