trackswap 0.0.18 → 0.0.20

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.
@@ -53,8 +53,8 @@ export interface MetadataType {
53
53
  [key: string]: any;
54
54
  }
55
55
  export interface WptType {
56
- lat: LatitudeType;
57
- lon: LongitudeType;
56
+ lat?: LatitudeType;
57
+ lon?: LongitudeType;
58
58
  ele?: number;
59
59
  time?: Date;
60
60
  speed?: number;
package/dist/index.cjs CHANGED
@@ -1,16 +1,16 @@
1
- "use strict";var it=Object.create;var Y=Object.defineProperty;var st=Object.getOwnPropertyDescriptor;var ot=Object.getOwnPropertyNames;var at=Object.getPrototypeOf,ct=Object.prototype.hasOwnProperty;var pt=(c,e)=>{for(var t in e)Y(c,t,{get:e[t],enumerable:!0})},We=(c,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ot(e))!ct.call(c,i)&&i!==t&&Y(c,i,{get:()=>e[i],enumerable:!(r=st(e,i))||r.enumerable});return c};var g=(c,e,t)=>(t=c!=null?it(at(c)):{},We(e||!c||!c.__esModule?Y(t,"default",{value:c,enumerable:!0}):t,c)),dt=c=>We(Y({},"__esModule",{value:!0}),c);var wt={};pt(wt,{ActivityProcessor:()=>V,ActivityToFITEncoder:()=>B,ActivityToGPXEncoder:()=>G,ActivityToTCXEncoder:()=>H,BaseActivityConverter:()=>R,BaseActivityEncoder:()=>X,BaseActivityMiddleware:()=>Be,FITDecoder:()=>x,FITEncoder:()=>C,FITToActivityConverter:()=>O,GPXDecoder:()=>k,GPXEncoder:()=>F,GPXToActivityConverter:()=>M,PipelineStage:()=>N,TCXDecoder:()=>S,TCXEncoder:()=>D,TCXToActivityConverter:()=>$,TrackSwap:()=>z,default:()=>Pt,registerDefaultMiddlewares:()=>Oe});module.exports=dt(wt);var Z=class{constructor(){this.stage="parse"}async process(e){let t=Date.now();if(!e.rawData)throw new Error("FIT data cannot be empty");try{let r=await this.parseWithFitSDK(e.rawData);return e.rawMessages=r,e.performance.parseTime=Date.now()-t,e}catch(r){throw new Error(`FIT parsing failed: ${r.message}`)}}async parseWithFitSDK(e){let{Decoder:t,Stream:r}=await import("@garmin/fitsdk"),i=r.fromBuffer(e);if(!t.isFIT(i))throw new Error("Not a valid FIT file");let n=new t(i),{messages:s,errors:o}=n.read();return o&&o.length>0,s}},q=class{constructor(e){this.getConverters=e;this.stage="extract"}async process(e){let t=Date.now();if(!e.rawMessages)throw new Error("Raw messages cannot be empty");let r={};for(let[i,n]of Object.entries(e.rawMessages)){if(!Array.isArray(n)||n.length===0){r[i]=n;continue}let s=this.getConverters(i);if(s.length===0)r[i]=n;else{let o=s[0];try{let a=o.convertMessages(n,e);r[i]=a}catch(a){e.errors.push(a),r[i]=n}}}return e.rawMessages=r,e.performance.extractTime=Date.now()-t,e}},J=class{constructor(e){this.getStructurePlugins=e;this.stage="structure"}async process(e){let t=Date.now();if(!e.rawMessages)throw new Error("Message data cannot be empty");let r={},i=this.getStructurePlugins();for(let n of i)try{let s=n.structureData(e.rawMessages,e);r={...r,...s}}catch(s){e.errors.push(s)}return e.result=r,e.performance.structureTime=Date.now()-t,e}},Q=class{constructor(){this.stage="complete"}async process(e){e.performance.endTime=Date.now();let t=e.performance.endTime-e.performance.startTime;return e.metadata.set("performance",{totalTime:t,parseTime:e.performance.parseTime,extractTime:e.performance.extractTime,structureTime:e.performance.structureTime}),e.stats&&(e.stats.endTime=Date.now(),e.rawMessages&&(e.stats.processedTokens=this.countTotalMessages(e.rawMessages))),e}countTotalMessages(e){let t=0;return Object.values(e).forEach(r=>{Array.isArray(r)&&(t+=r.length)}),t}};var v=g(require("dayjs"));var A=class{constructor(){this.version="1.0.0";this.priority=100}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}};var W=class extends A{constructor(){super(...arguments);this.name="SessionStructurePlugin";this.priority=10}structureData(t,r){let{sessionMesgs:i,lapMesgs:n,recordMesgs:s}=t;return i!=null&&i.length?{sessionMesgs:i.map(a=>{let p=(0,v.default)(a.startTime).valueOf(),d=p+a.totalElapsedTime*1e3,w=((n==null?void 0:n.filter(u=>{let T=(0,v.default)(u.startTime).valueOf(),E=T+(u.totalElapsedTime??0)*1e3;return T>=p&&E<=d}))||[]).map(u=>{let T=(0,v.default)(u.startTime).valueOf(),E=T+(u.totalElapsedTime??0)*1e3,_=(s==null?void 0:s.filter(nt=>{let ze=(0,v.default)(nt.timestamp).valueOf();return ze>=T&&ze<E}))||[];return{...u,recordMesgs:_,messageIndex:u.messageIndex!==void 0?u.messageIndex:0}});return{...a,lapMesgs:w,messageIndex:a.messageIndex!==void 0?a.messageIndex:0}})}:{}}},U=class extends A{constructor(){super(...arguments);this.name="CourseStructurePlugin";this.priority=10}structureData(t,r){let{courseMesgs:i,lapMesgs:n,recordMesgs:s}=t;if(!(i!=null&&i.length))return{};let o=2e3;return{courseMesgs:i.map(p=>{let d=(n==null?void 0:n.map(l=>{let w=(0,v.default)(l.startTime).valueOf(),u=(0,v.default)(l.timestamp).valueOf(),T=(s==null?void 0:s.filter(E=>{let _=(0,v.default)(E.timestamp).valueOf();return _>=w-o&&_<=u+o}))||[];return{...l,recordMesgs:T}}))||[];return{...p,lapMesgs:d}})}}},j=class extends A{constructor(){super(...arguments);this.name="FileHeaderPlugin";this.priority=1}structureData(t,r){let{fileIdMesgs:i}=t;if(i!=null&&i.length&&i[0]){let n=i[0];r.fileHeader={type:n.type,manufacturer:n.manufacturer,product:n.product}}return{}}};var x=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.structurePlugins=[];this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultPluginsRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new Z,new q(e=>this.getConverters(e)),new J(()=>this.structurePlugins),new Q]}async registerDefaultPlugins(){if(this.defaultPluginsRegistered)return;let e=[new j,new W,new U];for(let t of e)this.addStructurePlugin(t),this.registeredPlugins.add(t.name);this.defaultPluginsRegistered=!0}addConverterForMessageType(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}addStructurePlugin(e){this.structurePlugins.push(e),this.structurePlugins.sort((t,r)=>(t.priority||100)-(r.priority||100))}async registerMessageConverter(e){if(this.registeredPlugins.has(e.name))throw new Error(`Message converter plugin ${e.name} already exists`);e.supportedMessageTypes.forEach(r=>{this.addConverterForMessageType(r,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";e.supportedMessageTypes.forEach(r=>{let n=(this.converterPlugins.get(r)||[]).map(s=>`${s.name}(${s.priority||100})`)})}async registerStructurePlugin(e){if(this.registeredPlugins.has(e.name))throw new Error(`Structure plugin ${e.name} already exists`);this.addStructurePlugin(e),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:""}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:(this.middlewarePlugins.push(e),this.middlewarePlugins.sort((i,n)=>(i.priority||100)-(n.priority||100)));let r=[];e.onParse&&r.push("onParse"),e.onExtractMessages&&r.push("onExtractMessages"),e.onStructure&&r.push("onStructure"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getConverters(e){return this.converterPlugins.get(e)||[]}unregisterPlugin(e){if(!this.registeredPlugins.has(e))return!1;for(let[i,n]of this.converterPlugins){let s=n.findIndex(o=>o.name===e);s!==-1&&(n.splice(s,1),n.length===0&&this.converterPlugins.delete(i))}let t=this.structurePlugins.findIndex(i=>i.name===e);t!==-1&&this.structurePlugins.splice(t,1);let r=this.middlewarePlugins.findIndex(i=>i.name===e);return r!==-1&&this.middlewarePlugins.splice(r,1),this.registeredPlugins.delete(e),!0}async initialize(){var r;if(this.initialized)return;await this.registerDefaultPlugins();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parseByBuffer(e,t={}){var i;await this.initialize();let r=this.createContext();r.rawData=e,r.userData=t.userData,r.metadata.set("decoder",this);try{for(let n of this.processors)try{switch(r=await n.process(r),n.stage){case"parse":r.rawData&&(r.rawData=await this.executeMiddlewareHook("onParse",r.rawData,r));break;case"extract":r.rawMessages&&(r.rawMessages=await this.executeMiddlewareHook("onExtractMessages",r.rawMessages,r));break;case"structure":r.result&&(r.result=await this.executeMiddlewareHook("onStructure",r.result,r));break;case"complete":r.result&&(r.result=await this.executeMiddlewareHook("onComplete",r.result,r));break}}catch(s){r.errors.push(s);for(let o of this.middlewarePlugins)await((i=o.onError)==null?void 0:i.call(o,s,r))}return r.result}catch(n){throw n}}};var lt={file:{course:6,device:1,settings:2,sport:3,activity:4,workout:5,schedules:7,weight:9,totals:10,goals:11,blood_pressure:14,monitoring_a:15,activity_summary:20,monitoring_daily:28,monitoring_b:32,segment_list:35,exd_configuration:40,invalid:0},sport:{generic:0,running:1,cycling:2,transition:3,fitness_equipment:4,swimming:5,basketball:6,soccer:7,tennis:8,american_football:9,training:10,walking:11,cross_country_skiing:12,alpine_skiing:13,snowboarding:14,rowing:15,mountaineering:16,hiking:17,multisport:18,paddling:19,invalid:254},event:{timer:0,workout:3,workout_step:4,power_down:5,power_up:6,off_course:7,session:8,lap:9,course_point:10,battery:11,virtual_partner_pace:12,hr_high_alert:13,hr_low_alert:14,speed_high_alert:15,speed_low_alert:16,cad_high_alert:17,cad_low_alert:18,power_high_alert:19,power_low_alert:20,recovery_hr:21,battery_low:22,time_duration_alert:23,distance_duration_alert:24,calorie_duration_alert:25,activity:26,fitness_equipment:27,length:28,user_marker:32,sport_point:33,calibration:36,front_gear_change:42,rear_gear_change:43,rider_position_change:44,elev_high_alert:45,elev_low_alert:46,comm_timeout:47,invalid:255},event_type:{start:0,stop:1,consecutive_depreciated:2,marker:3,stop_all:4,begin_depreciated:5,end_depreciated:6,end_all_depreciated:7,stop_disable:8,stop_disable_all:9,invalid:255},course_point:{generic:0,summit:1,valley:2,water:3,food:4,danger:5,left:6,right:7,straight:8,first_aid:9,fourth_category:10,third_category:11,second_category:12,first_category:13,hors_category:14,sprint:15,left_fork:16,right_fork:17,middle_fork:18,slight_left:19,sharp_left:20,slight_right:21,sharp_right:22,u_turn:23,segment_start:24,segment_end:25,invalid:255}},b=c=>{let e=lt[c];return{size:1,baseType:0,mapValue:t=>typeof t=="string"?e[t]??255:t,setValue:function(t,r){this.setUint8(t,r)}}},Se={enum_file:b("file"),enum_activity:b("sport"),enum_sport:b("sport"),enum_sub_sport:b("sport"),enum_event:b("event"),enum_event_type:b("event_type"),enum_course_point:b("course_point"),uint8:{size:1,baseType:2,setValue:DataView.prototype.setUint8},sint8:{size:1,baseType:1,setValue:DataView.prototype.setInt8},uint16:{size:2,baseType:132,setValue:DataView.prototype.setUint16},sint16:{size:2,baseType:131,setValue:DataView.prototype.setInt16},uint32:{size:4,baseType:134,setValue:DataView.prototype.setUint32},sint32:{size:4,baseType:133,setValue:DataView.prototype.setInt32},string:{size:0,baseType:7,mapValue:c=>Array.from(je(c)),setValue:mt},distance:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>Math.round(c*1e3)},speed:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:c=>Math.round(c*100)},altitude:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:c=>Math.round((c+500)*5)},seconds:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>Math.round(c*1e3)},date_time:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>{let e;return c instanceof Date?(e=Math.floor(c.getTime()/1e3),e-631065600):typeof c=="string"?(e=Math.floor(new Date(c).getTime()/1e3),e-631065600):c<631065600?Math.floor(c):(c>9999999999?e=Math.floor(c/1e3):e=Math.floor(c),e-631065600)}},semicircles:{size:4,baseType:133,setValue:DataView.prototype.setInt32,mapValue:c=>Math.round(c/180*2147483648)}};function Ue(c){return Array.from(je(c)).length+1}function*je(c){for(let e of ut(c))e<128?yield e:e<2048?(yield 192|e>>6,yield 128|e&63):e<65536?(yield 224|e>>12,yield 128|e>>6&63,yield 128|e&63):(yield 240|e>>18,yield 128|e>>12&63,yield 128|e>>6&63,yield 128|e&63);yield 0}function*ut(c){for(let e=0;e<c.length;){let t=c.codePointAt(e);if(t===void 0)break;yield t,e+=t>65535?2:1}}function mt(c,e){for(let t=0;t<e.length;t++)this.setUint8(c+t,e[t])}var Tt={file_id:{mesgNum:0,fieldDefns:[{name:"type",number:0,type:"enum_file"},{name:"time_created",number:4,type:"date_time"}]},session:{mesgNum:18,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"},{name:"sport",number:5,type:"enum_sport"},{name:"sub_sport",number:6,type:"enum_sub_sport"},{name:"first_lap_index",number:11,type:"uint16"},{name:"num_laps",number:26,type:"uint16"}]},lap:{mesgNum:19,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"end_position_lat",number:5,type:"semicircles"},{name:"end_position_long",number:6,type:"semicircles"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"}]},record:{mesgNum:20,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"position_lat",number:0,type:"semicircles"},{name:"position_long",number:1,type:"semicircles"},{name:"altitude",number:2,type:"altitude"},{name:"distance",number:5,type:"distance"},{name:"heart_rate",number:3,type:"uint8"},{name:"cadence",number:4,type:"uint8"},{name:"speed",number:6,type:"speed"},{name:"power",number:7,type:"uint16"}]},event:{mesgNum:21,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"event",number:0,type:"enum_event"},{name:"event_type",number:1,type:"enum_event_type"},{name:"event_group",number:4,type:"uint8"}]},course:{mesgNum:31,fieldDefns:[{name:"name",number:5,type:"string"},{name:"sport",number:4,type:"enum_sport"},{name:"sub_sport",number:7,type:"enum_sub_sport"}]},activity:{mesgNum:34,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"total_timer_time",number:0,type:"seconds"},{name:"num_sessions",number:1,type:"uint16"},{name:"type",number:2,type:"enum_activity"},{name:"event",number:3,type:"enum_event"},{name:"event_type",number:4,type:"enum_event_type"},{name:"local_timestamp",number:5,type:"date_time"},{name:"event_group",number:6,type:"uint8"}]},course_point:{mesgNum:32,fieldDefns:[{name:"timestamp",number:1,type:"date_time"},{name:"position_lat",number:2,type:"semicircles"},{name:"position_long",number:3,type:"semicircles"},{name:"distance",number:4,type:"distance"},{name:"type",number:5,type:"enum_course_point"}]}},ft=(c,e)=>c.map(t=>({...t,value:e[t.name]})).filter(({value:t})=>t!==void 0),ee=class c{static check(e,t,r,i){if(t===void 0)throw new Error(`Message '${e}' not known`);if(r===void 0)throw new Error(`Message '${e}' has no field definitions`);let n=r.map(o=>o.name),s=Object.keys(i).filter(o=>!n.includes(o));if(s.length)throw new Error(`Message '${e}' has no field definitions named '${s}'`)}constructor(e,t,r){let i=Tt[t];if(!i)throw new Error(`Unknown message type: ${t}`);let{mesgNum:n,fieldDefns:s}=i;c.check(t,n,s,r),this.localNum=e,this.mesgNum=n,this.fields=ft(s,r)}get mesgDefn(){let e=this.fields.map(({number:t,type:r,value:i})=>{let n=Se[r];if(!n)throw new Error(`Unknown type: ${r}`);let{size:s,baseType:o}=n;return r==="string"?{number:t,size:Ue(i),baseType:o}:{number:t,size:s,baseType:o}});return{localNum:this.localNum,mesgNum:this.mesgNum,fieldDefns:e}}isSameDefn(e){let t=(o,a)=>o.number===a.number&&o.size===a.size&&o.baseType===a.baseType,r=(o,a)=>o.length===a.length&&o.every((p,d)=>t(p,a[d])),{localNum:i,mesgNum:n,fieldDefns:s}=this.mesgDefn;return n===e.mesgNum&&i===e.localNum&&r(s,e.fieldDefns)}get defnRecord(){let{localNum:e,mesgNum:t,fieldDefns:r}=this.mesgDefn,i=6+3*r.length,n=new DataView(new ArrayBuffer(i));n.setUint8(0,64|e),n.setUint8(2,1),n.setUint16(3,t),n.setUint8(5,r.length);let s=6;for(let o of r)n.setUint8(s++,o.number),n.setUint8(s++,o.size),n.setUint8(s++,o.baseType);return n.buffer}get dataRecord(){let{fieldDefns:e}=this.mesgDefn,t=1+e.reduce((n,{size:s})=>n+s,0),r=new DataView(new ArrayBuffer(t));r.setUint8(0,this.localNum);let i=1;for(let{number:n,type:s,value:o}of this.fields){let a=Se[s];if(!a)throw new Error(`Unknown type: ${s}`);let{size:p,setValue:d}=a,l;"mapValue"in a?l=a.mapValue(o):l=o,d&&d.call(r,i,l),i+=p}return r.buffer}};var gt=[0,52225,55297,5120,61441,15360,10240,58369,40961,27648,30720,46081,20480,39937,34817,17408],Ke=(c,e)=>(c>>>4^gt[c&15^e])&65535,yt=(c,e,t)=>Ke(Ke(c,e),t),ht=(c,e)=>yt(c,e&15,e>>>4);function De(c,e=0){let t=e,r=c instanceof ArrayBuffer?new Uint8Array(c):c;for(let i=0;i<r.length;i++)t=ht(t,r[i]);return t}var Ye=g(require("dayjs")),Ne=14,vt=16,xt=2078,Ct=776358228,C=class{constructor(e={}){this.localNum={};this.mesgDefn=[];this.messages=[];this.options={compact:e.compact??!0,defaultActivity:e.defaultActivity??"cycling",defaultSubActivity:e.defaultSubActivity??"generic"}}async encode(e){return this.reset(),this.buildFITContent(e,"activity"),Buffer.from(await this.blob.arrayBuffer())}async encodeCourse(e){return this.reset(),this.buildFITContent(e,"course"),Buffer.from(await this.blob.arrayBuffer())}async encodeToBlob(e,t="activity"){return this.reset(),this.buildFITContent(e,t),this.blob}reset(){this.localNum={},this.mesgDefn=[],this.messages=[]}buildFITContent(e,t){this.buildFileId(e,t),t==="course"?this.buildCourseContent(e):this.buildActivityContent(e)}buildActivityContent(e){let t=e.sessionMesgs||[];if(t.length===0)throw new Error("Activity file must contain at least one Session");let r=0,i=[],n=[];for(let s of t){if(s.lapMesgs&&this.buildEventsFromLaps(s.lapMesgs,i),s.lapMesgs)for(let o of s.lapMesgs)o.recordMesgs&&this.buildRecords(o.recordMesgs);s.lapMesgs&&this.buildLaps(s.lapMesgs),this.buildSession(s),r++,this.buildActivityFromSession(s,n)}i.forEach(s=>this.buildEvent(s)),n.forEach(s=>this.buildActivity(s))}buildCourseContent(e){let t=e.sessionMesgs||[];if(t.length===0)throw new Error("Course file must contain track data");let r=t[0];if(this.buildCourse({name:"course",sport:this.options.defaultActivity}),r.lapMesgs){let i=[];for(let o of r.lapMesgs)o.recordMesgs&&i.push(...o.recordMesgs);i.sort((o,a)=>o.timestamp&&a.timestamp?new Date(o.timestamp).getTime()-new Date(a.timestamp).getTime():(o.distance||0)-(a.distance||0));let n=i[0],s=i[i.length-1];if(r.startTime&&this.buildEvent({timestamp:r.startTime,event:"timer",eventType:"start",eventGroup:0}),i.forEach(o=>this.buildRecord(o)),s.timestamp&&this.buildEvent({timestamp:s.timestamp,event:"timer",eventType:"stop_all",eventGroup:0}),r.lapMesgs)for(let o=0;o<r.lapMesgs.length;o++)this.buildLap(r.lapMesgs[o])}}buildFileId(e,t){var i;let r=((i=e.fileIdMesgs)==null?void 0:i[0])||{};this.writeMesg("file_id",{type:t,time_created:r.timeCreated?this.parseTimestamp(r.timeCreated):Date.now(),manufacturer:r.manufacturer,product:r.product,serial_number:r.serialNumber})}buildSession(e){var t;this.writeMesg("session",{timestamp:e.timestamp?e.timestamp:void 0,start_time:e.startTime?e.startTime:void 0,total_elapsed_time:e.totalElapsedTime,total_timer_time:e.totalTimerTime,start_position_lat:this.convertToSemicircles(e.startPositionLat),start_position_long:this.convertToSemicircles(e.startPositionLong),total_distance:e.totalDistance,total_ascent:e.totalAscent,total_descent:e.totalDescent,sport:e.sport||this.options.defaultActivity,sub_sport:e.subSport||this.options.defaultSubActivity,first_lap_index:e.firstLapIndex||0,num_laps:e.numLaps||((t=e.lapMesgs)==null?void 0:t.length)||1})}buildLaps(e){e.forEach(t=>this.buildLap(t))}buildLap(e){this.writeMesg("lap",{timestamp:e.timestamp?e.timestamp:void 0,start_time:e.startTime?e.startTime:void 0,start_position_lat:this.convertToSemicircles(e.startPositionLat),start_position_long:this.convertToSemicircles(e.startPositionLong),end_position_lat:this.convertToSemicircles(e.endPositionLat),end_position_long:this.convertToSemicircles(e.endPositionLong),total_elapsed_time:e.totalElapsedTime,total_timer_time:e.totalTimerTime,total_distance:e.totalDistance,total_ascent:e.totalAscent,total_descent:e.totalDescent})}buildRecords(e){e.forEach(t=>this.buildRecord(t))}buildRecord(e){this.writeMesg("record",{timestamp:e.timestamp?e.timestamp:void 0,position_lat:this.convertToSemicircles(e.positionLat),position_long:this.convertToSemicircles(e.positionLong),altitude:e.enhancedAltitude||e.altitude,distance:e.distance,heart_rate:e.heartRate,cadence:e.cadence,speed:e.enhancedSpeed||e.speed,power:e.power})}buildEvent(e){this.writeMesg("event",{timestamp:e.timestamp?e.timestamp:void 0,event:e.event,event_type:e.eventType,event_group:e.eventGroup})}buildActivity(e){this.writeMesg("activity",{timestamp:e.timestamp?e.timestamp:void 0,total_timer_time:e.totalTimerTime,num_sessions:e.numSessions,type:e.type,event:e.event,event_type:e.eventType,local_timestamp:e.localTimestamp?this.parseTimestamp(e.localTimestamp):void 0,event_group:e.eventGroup})}buildCourse(e){this.writeMesg("course",{name:e.name,sport:e.sport})}buildEventsFromLaps(e,t){e.forEach((r,i)=>{r.startTime&&t.push({timestamp:r.startTime,event:"timer",eventType:"start",eventGroup:i}),r.timestamp&&t.push({timestamp:r.timestamp,event:"timer",eventType:i===e.length-1?"stop_all":"stop",eventGroup:i})})}buildActivityFromSession(e,t){t.push({timestamp:e.timestamp,totalTimerTime:e.totalTimerTime,numSessions:1,type:e.sport||this.options.defaultActivity,event:"activity",eventType:"stop",eventGroup:0})}parseTimestamp(e){return typeof e=="number"?e:(0,Ye.default)(e).valueOf()}convertToSemicircles(e){if(e!=null)return Math.round(e*2**31/180)}validateRequiredFields(e){if(!e.sessionMesgs||e.sessionMesgs.length===0)throw new Error("FIT file must contain at least one Session")}writeMesg(e,t){let r=Object.fromEntries(Object.entries(t).filter(([o,a])=>a!==void 0));if(Object.keys(r).length===0)return;let i=this.localNum[e];i===void 0&&(i=this.localNum[e]=Object.keys(this.localNum).length);let n=new ee(i,e,r),s=this.mesgDefn[i];(!s||!n.isSameDefn(s))&&(this.messages.push(n.defnRecord),this.mesgDefn[i]=n.mesgDefn),this.messages.push(n.dataRecord)}get blob(){let e=[this.header,...this.messages,this.trailer];return new Blob(e,{type:"application/octet-stream"})}get dataLen(){return this.messages.reduce((e,t)=>e+t.byteLength,0)}get dataCrc(){return this.messages.reduce((e,t)=>De(t,e),0)}get header(){let e=new DataView(new ArrayBuffer(Ne));return e.setUint8(0,Ne),e.setUint8(1,vt),e.setUint16(2,xt,!0),e.setUint32(4,this.dataLen,!0),e.setUint32(8,Ct),e.setUint16(12,De(e.buffer.slice(0,12)),!0),e.buffer}get trailer(){let e=new DataView(new ArrayBuffer(2));return e.setUint16(0,this.dataCrc,!0),e.buffer}async encoder(e){return this.encode(e)}};var P=class{constructor(){this.version="1.0.0";this.priority=100}supports(e){return this.supportedTags.includes(e)}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}parseFloat(e){if(!(typeof e>"u"))return typeof e=="number"?e:typeof e=="string"&&parseFloat(e)||0}parseInt(e){return typeof e=="number"?Math.floor(e):typeof e=="string"&&parseInt(e,10)||0}parseString(e){return String(e||"")}parseBoolean(e){return typeof e=="boolean"?e:typeof e=="string"?e.toLowerCase()==="true":!1}parseDate(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}hasRequiredAttributes(e,t){return t.every(r=>{var i;return(i=e.attributes)==null?void 0:i[r]})}extractAttributes(e,t,r){e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{let s=r[i];s&&s in t&&(t[s]=String(n||""))})}processChildren(e,t,r){var i;(i=e.children)==null||i.forEach(n=>{let s=r[n.tag];s&&s(n,t)})}getChildValue(e,t){var i;let r=(i=e.children)==null?void 0:i.find(n=>n.tag===t);return r!=null&&r.value?String(r.value):void 0}getChildByTag(e,t){var r;return(r=e.children)==null?void 0:r.find(i=>i.tag===t)}getChildrenByTag(e,t){var r;return((r=e.children)==null?void 0:r.filter(i=>i.tag===t))||[]}convertExtensions(e){var r;let t={};return(r=e.children)==null||r.forEach(i=>{t[i.tag]=this.convertExtensionContent(i)}),t}convertExtensionContent(e){var t;if((t=e.children)!=null&&t.length){let r={};return e.children.forEach(i=>{r[i.tag]=this.convertExtensionContent(i)}),r}else return e.value}},I=class{constructor(){this.version="1.0.0";this.description=""}async initialize(e){}async destroy(e){}async validate(e){return!0}async onTokenize(e,t){return e}async onAstGenerate(e,t){return e}async onConvert(e,t){return e}async onComplete(e,t){return e}async onError(e,t){}};var m=class extends P{parseCoordinate(e){let t=this.parseFloat(e);return t===0?void 0:t}parseGPXTime(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}extractNumericAttributes(e,t,r){e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{let s=r[i];s&&s in t&&typeof n<"u"&&(t[s]=this.parseFloat(n))})}},K=class extends I{async onError(e,t){t.warnings.push(`Middleware ${this.name} error: ${e.message}`)}};var te=class extends m{constructor(){super(...arguments);this.name="wpt-converter";this.supportedTags=["wpt","trkpt","rtept"];this.version="1.0.0"}convert(t,r){var n,s;if(!this.hasRequiredAttributes(t,["lat","lon"]))return;let i={lat:this.parseFloat((n=t.attributes)==null?void 0:n.lat),lon:this.parseFloat((s=t.attributes)==null?void 0:s.lon)};return this.processChildren(t,i,{ele:(o,a)=>a.ele=this.parseFloat(o.value),time:(o,a)=>a.time=new Date(this.parseString(o.value)),speed:(o,a)=>a.speed=this.parseFloat(o.value),power:(o,a)=>a.power=this.parseFloat(o.value),cadence:(o,a)=>a.cadence=this.parseFloat(o.value),heartRate:(o,a)=>a.heartRate=this.parseFloat(o.value),course:(o,a)=>a.course=this.parseFloat(o.value),name:(o,a)=>a.name=this.parseString(o.value),cmt:(o,a)=>a.cmt=this.parseString(o.value),desc:(o,a)=>a.desc=this.parseString(o.value),src:(o,a)=>a.src=this.parseString(o.value),sym:(o,a)=>a.sym=this.parseString(o.value),type:(o,a)=>a.type=this.parseString(o.value),fix:(o,a)=>a.fix=this.parseString(o.value),sat:(o,a)=>a.sat=this.parseString(o.value),hdop:(o,a)=>a.hdop=this.parseFloat(o.value),vdop:(o,a)=>a.vdop=this.parseFloat(o.value),pdop:(o,a)=>a.pdop=this.parseFloat(o.value),ageofdgpsdata:(o,a)=>a.ageofdgpsdata=this.parseFloat(o.value),geoidheight:(o,a)=>a.geoidheight=this.parseFloat(o.value),magvar:(o,a)=>a.magvar=this.parseFloat(o.value),dgpsid:(o,a)=>a.dgpsid=this.parseFloat(o.value),extensions:(o,a)=>{let p=r.metadata.get("decoder"),d=p==null?void 0:p.getConverter("extensions");if(d){let l=d.convert(o,r);l&&(this.mapExtensionsToPoint(l,a),a.extensions=l)}},link:(o,a)=>{var l;a.link||(a.link=[]);let p=r.metadata.get("decoder"),d=(l=p==null?void 0:p.getConverter("link"))==null?void 0:l.convert(o,r);d&&a.link&&a.link.push(d)}}),i}mapExtensionsToPoint(t,r){Object.entries(t).forEach(([i,n])=>{if(n!==void 0&&(typeof n=="string"||typeof n=="number")){let s=o=>(Array.isArray(o)?o:[o]).some(p=>{let d=i.toLowerCase(),l=p.toLowerCase();return d===l||d.endsWith(`:${l}`)});s("speed")?r.speed=this.parseFloat(n):s("hr")?r.heartRate=this.parseFloat(n):s(["cad","cadence"])?r.cadence=this.parseFloat(n):s(["PowerInWatts","power"])&&(r.power=this.parseFloat(n))}})}},re=class extends m{constructor(){super(...arguments);this.name="rte-converter";this.supportedTags=["rte"]}convert(t,r){let i={rtept:[]};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),cmt:(n,s)=>s.cmt=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),src:(n,s)=>s.src=this.parseString(n.value),number:(n,s)=>s.number=this.parseFloat(n.value),type:(n,s)=>s.type=this.parseString(n.value),rtept:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("wpt"))==null?void 0:p.convert(n,r);a&&s.rtept&&s.rtept.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var a;s.link||(s.link=[]);let o=r.metadata.get("decoder");(a=n.children)==null||a.forEach(p=>{var l;let d=(l=o==null?void 0:o.getConverter("link"))==null?void 0:l.convert(p,r);d&&s.link&&s.link.push(d)})}}),i}},ne=class extends m{constructor(){super(...arguments);this.name="trk-converter";this.supportedTags=["trk"]}convert(t,r){let i={trkseg:[]};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),cmt:(n,s)=>s.cmt=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),src:(n,s)=>s.src=this.parseString(n.value),number:(n,s)=>s.number=this.parseFloat(n.value),type:(n,s)=>s.type=this.parseString(n.value),trkseg:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("trkseg"))==null?void 0:p.convert(n,r);a&&s.trkseg&&s.trkseg.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var a;s.link||(s.link=[]);let o=r.metadata.get("decoder");(a=n.children)==null||a.forEach(p=>{var l;let d=(l=o==null?void 0:o.getConverter("link"))==null?void 0:l.convert(p,r);d&&s.link&&s.link.push(d)})}}),i}},ie=class extends m{constructor(){super(...arguments);this.name="trkseg-converter";this.supportedTags=["trkseg"]}convert(t,r){let i={trkpt:[]};return this.processChildren(t,i,{trkpt:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("wpt"))==null?void 0:p.convert(n,r);a&&s.trkpt&&s.trkpt.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))}}),i}},se=class extends m{constructor(){super(...arguments);this.name="link-converter";this.supportedTags=["link"]}convert(t,r){var n;let i={};return(n=t.attributes)!=null&&n.href&&(i.href=t.attributes.href),this.processChildren(t,i,{text:(s,o)=>o.text=this.parseString(s.value),type:(s,o)=>o.type=this.parseString(s.value)}),i}},oe=class extends m{constructor(){super(...arguments);this.name="metadata-converter";this.supportedTags=["metadata"]}convert(t,r){let i={};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),keywords:(n,s)=>s.keywords=this.parseString(n.value),time:(n,s)=>s.time=new Date(this.parseString(n.value)),author:(n,s)=>{var a;let o=r.metadata.get("decoder");s.author=(a=o==null?void 0:o.getConverter("author"))==null?void 0:a.convert(n,r)},copyright:(n,s)=>{var a;let o=r.metadata.get("decoder");s.copyright=(a=o==null?void 0:o.getConverter("copyright"))==null?void 0:a.convert(n,r)},bounds:(n,s)=>{var a;let o=r.metadata.get("decoder");s.bounds=(a=o==null?void 0:o.getConverter("bounds"))==null?void 0:a.convert(n,r)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var p;s.link||(s.link=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("link"))==null?void 0:p.convert(n,r);a&&s.link&&s.link.push(a)}}),i}},ae=class extends m{constructor(){super(...arguments);this.name="person-converter";this.supportedTags=["author"]}convert(t,r){var n;let i={};return t.value&&!((n=t.children)!=null&&n.length)?(i.name=this.parseString(t.value),i):(this.processChildren(t,i,{name:(s,o)=>o.name=this.parseString(s.value),email:(s,o)=>{var p;let a=r.metadata.get("decoder");o.email=(p=a==null?void 0:a.getConverter("email"))==null?void 0:p.convert(s,r)},link:(s,o)=>{var p;let a=r.metadata.get("decoder");o.link=(p=a==null?void 0:a.getConverter("link"))==null?void 0:p.convert(s,r)}}),i)}},ce=class extends m{constructor(){super(...arguments);this.name="email-converter";this.supportedTags=["email"]}convert(t,r){let i={};return this.processChildren(t,i,{id:(n,s)=>s.id=this.parseString(n.value),domain:(n,s)=>s.domain=this.parseString(n.value)}),i}},pe=class extends m{constructor(){super(...arguments);this.name="copyright-converter";this.supportedTags=["copyright"]}convert(t,r){var n;let i={};return(n=t.attributes)!=null&&n.author&&(i.author=t.attributes.author),this.processChildren(t,i,{year:(s,o)=>o.year=this.parseString(s.value),license:(s,o)=>o.license=this.parseString(s.value)}),i}},de=class extends m{constructor(){super(...arguments);this.name="bounds-converter";this.supportedTags=["bounds"]}convert(t,r){let i={};return this.extractAttributes(t,i,{minlat:"minlat",minlon:"minlon",maxlat:"maxlat",maxlon:"maxlon"}),i}},le=class extends m{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["extensions"]}convert(t,r){var n;let i={};return(n=t.children)==null||n.forEach(s=>{this.flattenExtensionElement(s,i)}),i}flattenExtensionElement(t,r){var i,n;if(!((i=t.children)!=null&&i.length)&&t.value!==void 0){r[t.tag]=this.parseExtensionValue(t.value);return}(n=t.children)!=null&&n.length&&t.children.forEach(s=>{this.flattenExtensionElement(s,r)})}parseExtensionValue(t){if(t===void 0)return;let r=String(t),i=parseFloat(r);return!isNaN(i)&&isFinite(i)?i:r}};var Ze=require("htmlparser2"),N=(i=>(i.TOKENIZE="tokenize",i.AST_GENERATE="ast_generate",i.CONVERT="convert",i.COMPLETE="complete",i))(N||{}),ue=class{constructor(){this.stage="tokenize"}async process(e){let t=Date.now();if(!e.xmlContent)throw new Error("XML content cannot be empty");let r=[],i=new Ze.Parser({onopentag(n,s){r.push({type:"open",tag:n,attributes:s})},ontext(n){let s=n.replace(/\n/g,"").trim();s&&r.push({type:"text",tag:"text",value:s})},onclosetag(n){r.push({type:"close",tag:n})}},{xmlMode:!0});return i.write(e.xmlContent),i.end(),e.tokens=r,e.performance.tokenizeTime=Date.now()-t,e}},me=class{constructor(){this.stage="ast_generate"}async process(e){var s;let t=Date.now();if(!e.tokens)throw new Error("Tokens cannot be empty");let r=[],i,n=null;for(let o of e.tokens)if(o.type==="open"){let a={tag:o.tag,attributes:o.attributes||{},children:[]};i?n&&((s=n.children)==null||s.push(a)):i=a,r.push(a),n=a}else o.type==="text"&&n?n.value=o.value:o.type==="close"&&(r.pop(),n=r[r.length-1]||null);return e.ast=i,e.performance.astTime=Date.now()-t,e}},Te=class{constructor(e){this.getConverter=e;this.stage="convert"}async process(e){var i;let t=Date.now();if(!e.ast)throw new Error("AST cannot be empty");let r={};return e.ast.attributes&&Object.entries(e.ast.attributes).forEach(([n,s])=>{n.startsWith("xmlns:")?r[n]=s.replace(/&#39;/g,"'"):n==="xsi:schemaLocation"?r[n]=s.replace(/&#39;/g,"'"):r[n]=s}),(i=e.ast.children)==null||i.forEach(n=>{let s=this.getConverter(n.tag);try{let o=s.convert(n,e);o&&this.assignResult(r,n.tag,o)}catch(o){e.errors.push(o)}}),e.result=r,e.performance.convertTime=Date.now()-t,e}assignResult(e,t,r){switch(t){case"metadata":e.metadata=r;break;case"wpt":e.wpt||(e.wpt=[]),e.wpt.push(r);break;case"rte":e.rte||(e.rte=[]),e.rte.push(r);break;case"trk":e.trk||(e.trk=[]),e.trk.push(r);break;case"extensions":e.extensions=r;break}}},fe=class{constructor(){this.stage="complete"}async process(e){e.performance.endTime=Date.now();let t=e.performance.endTime-e.performance.startTime;return e.metadata.set("performance",{totalTime:t,tokenizeTime:e.performance.tokenizeTime,astTime:e.performance.astTime,convertTime:e.performance.convertTime}),e}};var k=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultConvertersRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new ue,new me,new Te(e=>this.getConverter(e)),new fe]}async registerDefaultConverters(){var t;if(this.defaultConvertersRegistered)return;let e=[new te,new re,new ne,new ie,new se,new oe,new ae,new ce,new pe,new de,new le];for(let r of e)(t=r.supportedTags)==null||t.forEach(i=>{this.addConverterForTag(i,r)}),this.registeredPlugins.add(r.name);this.defaultConvertersRegistered=!0}addConverterForTag(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}async registerConverter(e){var r,n;if(this.registeredPlugins.has(e.name))throw new Error(`Converter plugin ${e.name} already exists`);(r=e.supportedTags)==null||r.forEach(s=>{this.addConverterForTag(s,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";(n=e.supportedTags)==null||n.forEach(s=>{let a=(this.converterPlugins.get(s)||[]).map(p=>`${p.name}(${p.priority||100})`)})}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:this.middlewarePlugins.push(e);let r=[];e.onTokenize&&r.push("onTokenize"),e.onAstGenerate&&r.push("onAstGenerate"),e.onConvert&&r.push("onConvert"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getAllConverters(e){return this.converterPlugins.get(e)||[]}unregisterConverter(e){let t;for(let[r,i]of this.converterPlugins){let n=i.findIndex(s=>s.name===e);n!==-1&&(t=i[n],i.splice(n,1),i.length===0&&this.converterPlugins.delete(r))}t&&this.registeredPlugins.delete(e)}unregisterMiddleware(e){let t=this.middlewarePlugins.findIndex(r=>r.name===e);t!==-1&&this.middlewarePlugins.splice(t,1)}listConverters(){return Array.from(this.converterPlugins.keys())}listConverterPlugins(){return Array.from(this.registeredPlugins)}listMiddlewares(){return this.middlewarePlugins.map(e=>e.name)}listProcessors(){return this.processors.map(e=>e.constructor.name)}getConverterDetails(e){let t={};if(e){let r=this.converterPlugins.get(e);r&&(t[e]=r.map(i=>({name:i.name,priority:i.priority||100})))}else for(let[r,i]of this.converterPlugins)t[r]=i.map(n=>({name:n.name,priority:n.priority||100}));return t}getMiddlewareDetails(){return this.middlewarePlugins.map(e=>{let t=[];return e.onTokenize&&t.push("onTokenize"),e.onAstGenerate&&t.push("onAstGenerate"),e.onConvert&&t.push("onConvert"),e.onComplete&&t.push("onComplete"),e.onError&&t.push("onError"),{name:e.name,hooks:t}})}async initialize(){var r;if(this.initialized)return;await this.registerDefaultConverters();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parserByBuffer(e){var r;await this.initialize();let t=this.createContext();t.rawData=e,t.xmlContent=e.toString("utf-8"),t.metadata.set("decoder",this);try{for(let i of this.processors)try{switch(t=await i.process(t),i.stage){case"tokenize":t.tokens&&(t.tokens=await this.executeMiddlewareHook("onTokenize",t.tokens,t));break;case"ast_generate":t.ast&&(t.ast=await this.executeMiddlewareHook("onAstGenerate",t.ast,t));break;case"convert":t.result&&(t.result=await this.executeMiddlewareHook("onConvert",t.result,t));break;case"complete":t.result&&(t.result=await this.executeMiddlewareHook("onComplete",t.result,t));break}}catch(n){t.errors.push(n);for(let s of this.middlewarePlugins)await((r=s.onError)==null?void 0:r.call(s,n,t))}return t.result}catch(i){throw i}}convertExtensions(e){var s,o;let t={},{attributes:r,tag:i,value:n}=e;if(r&&Object.entries(r).forEach(([a,p])=>{t[a]=p}),(s=e==null?void 0:e.children)!=null&&s.length)(o=e.children)==null||o.forEach(a=>{t[a.tag]=this.convertExtensions(a)});else if(n!==void 0)return n;return t}};var Le=g(require("dayjs")),qe=g(require("dayjs/plugin/utc.js"));var Re={temperature:"atemp",wtemp:"wtemp",heartRate:"hr",cadence:"cad"};var Xe={temperature:"Temperature",Depth:"Depth"};Le.default.extend(qe.default);var F=class{constructor(e={}){this.formatElevation=e=>{let t=parseFloat(e);return isNaN(t)?e:this.roundTo(t,2).toString()};this.compact=e.compact??!0}async encode(e){let t=this.buildGPXXML(e);return Buffer.from(t,"utf-8")}encodeToString(e){return this.buildGPXXML(e)}buildGPXXML(e){let t=this.buildXMLHeader(),r=this.buildGPXContent(e),n=`${t}${r}
1
+ "use strict";var it=Object.create;var Y=Object.defineProperty;var st=Object.getOwnPropertyDescriptor;var ot=Object.getOwnPropertyNames;var at=Object.getPrototypeOf,ct=Object.prototype.hasOwnProperty;var pt=(c,e)=>{for(var t in e)Y(c,t,{get:e[t],enumerable:!0})},We=(c,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ot(e))!ct.call(c,i)&&i!==t&&Y(c,i,{get:()=>e[i],enumerable:!(r=st(e,i))||r.enumerable});return c};var f=(c,e,t)=>(t=c!=null?it(at(c)):{},We(e||!c||!c.__esModule?Y(t,"default",{value:c,enumerable:!0}):t,c)),dt=c=>We(Y({},"__esModule",{value:!0}),c);var wt={};pt(wt,{ActivityProcessor:()=>G,ActivityToFITEncoder:()=>O,ActivityToGPXEncoder:()=>M,ActivityToTCXEncoder:()=>$,BaseActivityConverter:()=>S,BaseActivityEncoder:()=>D,BaseActivityMiddleware:()=>Be,FITDecoder:()=>x,FITEncoder:()=>C,FITToActivityConverter:()=>L,GPXDecoder:()=>b,GPXEncoder:()=>I,GPXToActivityConverter:()=>R,PipelineStage:()=>K,TCXDecoder:()=>k,TCXEncoder:()=>F,TCXToActivityConverter:()=>_,TrackSwap:()=>B,default:()=>Pt,registerDefaultMiddlewares:()=>Oe});module.exports=dt(wt);var Z=class{constructor(){this.stage="parse"}async process(e){let t=Date.now();if(!e.rawData)throw new Error("FIT data cannot be empty");try{let r=await this.parseWithFitSDK(e.rawData);return e.rawMessages=r,e.performance.parseTime=Date.now()-t,e}catch(r){throw new Error(`FIT parsing failed: ${r.message}`)}}async parseWithFitSDK(e){let{Decoder:t,Stream:r}=await import("@garmin/fitsdk"),i=r.fromBuffer(e);if(!t.isFIT(i))throw new Error("Not a valid FIT file");let n=new t(i),{messages:s,errors:o}=n.read();return o&&o.length>0,s}},q=class{constructor(e){this.getConverters=e;this.stage="extract"}async process(e){let t=Date.now();if(!e.rawMessages)throw new Error("Raw messages cannot be empty");let r={};for(let[i,n]of Object.entries(e.rawMessages)){if(!Array.isArray(n)||n.length===0){r[i]=n;continue}let s=this.getConverters(i);if(s.length===0)r[i]=n;else{let o=s[0];try{let a=o.convertMessages(n,e);r[i]=a}catch(a){e.errors.push(a),r[i]=n}}}return e.rawMessages=r,e.performance.extractTime=Date.now()-t,e}},J=class{constructor(e){this.getStructurePlugins=e;this.stage="structure"}async process(e){let t=Date.now();if(!e.rawMessages)throw new Error("Message data cannot be empty");let r={},i=this.getStructurePlugins();for(let n of i)try{let s=n.structureData(e.rawMessages,e);r={...r,...s}}catch(s){e.errors.push(s)}return e.result=r,e.performance.structureTime=Date.now()-t,e}},Q=class{constructor(){this.stage="complete"}async process(e){e.performance.endTime=Date.now();let t=e.performance.endTime-e.performance.startTime;return e.metadata.set("performance",{totalTime:t,parseTime:e.performance.parseTime,extractTime:e.performance.extractTime,structureTime:e.performance.structureTime}),e.stats&&(e.stats.endTime=Date.now(),e.rawMessages&&(e.stats.processedTokens=this.countTotalMessages(e.rawMessages))),e}countTotalMessages(e){let t=0;return Object.values(e).forEach(r=>{Array.isArray(r)&&(t+=r.length)}),t}};var v=f(require("dayjs"));var w=class{constructor(){this.version="1.0.0";this.priority=100}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}};var z=class extends w{constructor(){super(...arguments);this.name="SessionStructurePlugin";this.priority=10}structureData(t,r){let{sessionMesgs:i,lapMesgs:n,recordMesgs:s}=t;return i!=null&&i.length?{sessionMesgs:i.map(a=>{let p=(0,v.default)(a.startTime).valueOf(),d=p+a.totalElapsedTime*1e3,H=((n==null?void 0:n.filter(m=>{let y=(0,v.default)(m.startTime).valueOf(),V=y+(m.totalElapsedTime??0)*1e3;return y>=p&&V<=d}))||[]).map(m=>{let y=(0,v.default)(m.startTime).valueOf(),V=y+(m.totalElapsedTime??0)*1e3,N=(s==null?void 0:s.filter(nt=>{let ze=(0,v.default)(nt.timestamp).valueOf();return ze>=y&&ze<V}))||[];return{...m,recordMesgs:N,messageIndex:m.messageIndex!==void 0?m.messageIndex:0}});return{...a,lapMesgs:H,messageIndex:a.messageIndex!==void 0?a.messageIndex:0}})}:{}}},W=class extends w{constructor(){super(...arguments);this.name="CourseStructurePlugin";this.priority=10}structureData(t,r){let{courseMesgs:i,lapMesgs:n,recordMesgs:s}=t;if(!(i!=null&&i.length))return{};let o=2e3;return{courseMesgs:i.map(p=>{let d=(n==null?void 0:n.map(l=>{let H=(0,v.default)(l.startTime).valueOf(),m=(0,v.default)(l.timestamp).valueOf(),y=(s==null?void 0:s.filter(V=>{let N=(0,v.default)(V.timestamp).valueOf();return N>=H-o&&N<=m+o}))||[];return{...l,recordMesgs:y}}))||[];return{...p,lapMesgs:d}})}}},U=class extends w{constructor(){super(...arguments);this.name="FileHeaderPlugin";this.priority=1}structureData(t,r){let{fileIdMesgs:i}=t;if(i!=null&&i.length&&i[0]){let n=i[0];r.fileHeader={type:n.type,manufacturer:n.manufacturer,product:n.product}}return{}}};var x=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.structurePlugins=[];this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultPluginsRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new Z,new q(e=>this.getConverters(e)),new J(()=>this.structurePlugins),new Q]}async registerDefaultPlugins(){if(this.defaultPluginsRegistered)return;let e=[new U,new z,new W];for(let t of e)this.addStructurePlugin(t),this.registeredPlugins.add(t.name);this.defaultPluginsRegistered=!0}addConverterForMessageType(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}addStructurePlugin(e){this.structurePlugins.push(e),this.structurePlugins.sort((t,r)=>(t.priority||100)-(r.priority||100))}async registerMessageConverter(e){if(this.registeredPlugins.has(e.name))throw new Error(`Message converter plugin ${e.name} already exists`);e.supportedMessageTypes.forEach(r=>{this.addConverterForMessageType(r,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";e.supportedMessageTypes.forEach(r=>{let n=(this.converterPlugins.get(r)||[]).map(s=>`${s.name}(${s.priority||100})`)})}async registerStructurePlugin(e){if(this.registeredPlugins.has(e.name))throw new Error(`Structure plugin ${e.name} already exists`);this.addStructurePlugin(e),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:""}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:(this.middlewarePlugins.push(e),this.middlewarePlugins.sort((i,n)=>(i.priority||100)-(n.priority||100)));let r=[];e.onParse&&r.push("onParse"),e.onExtractMessages&&r.push("onExtractMessages"),e.onStructure&&r.push("onStructure"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getConverters(e){return this.converterPlugins.get(e)||[]}unregisterPlugin(e){if(!this.registeredPlugins.has(e))return!1;for(let[i,n]of this.converterPlugins){let s=n.findIndex(o=>o.name===e);s!==-1&&(n.splice(s,1),n.length===0&&this.converterPlugins.delete(i))}let t=this.structurePlugins.findIndex(i=>i.name===e);t!==-1&&this.structurePlugins.splice(t,1);let r=this.middlewarePlugins.findIndex(i=>i.name===e);return r!==-1&&this.middlewarePlugins.splice(r,1),this.registeredPlugins.delete(e),!0}async initialize(){var r;if(this.initialized)return;await this.registerDefaultPlugins();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parseByBuffer(e,t={}){var i;await this.initialize();let r=this.createContext();r.rawData=e,r.userData=t.userData,r.metadata.set("decoder",this);try{for(let n of this.processors)try{switch(r=await n.process(r),n.stage){case"parse":r.rawData&&(r.rawData=await this.executeMiddlewareHook("onParse",r.rawData,r));break;case"extract":r.rawMessages&&(r.rawMessages=await this.executeMiddlewareHook("onExtractMessages",r.rawMessages,r));break;case"structure":r.result&&(r.result=await this.executeMiddlewareHook("onStructure",r.result,r));break;case"complete":r.result&&(r.result=await this.executeMiddlewareHook("onComplete",r.result,r));break}}catch(s){r.errors.push(s);for(let o of this.middlewarePlugins)await((i=o.onError)==null?void 0:i.call(o,s,r))}return r.result}catch(n){throw n}}};var lt={file:{course:6,device:1,settings:2,sport:3,activity:4,workout:5,schedules:7,weight:9,totals:10,goals:11,blood_pressure:14,monitoring_a:15,activity_summary:20,monitoring_daily:28,monitoring_b:32,segment_list:35,exd_configuration:40,invalid:0},sport:{generic:0,running:1,cycling:2,transition:3,fitness_equipment:4,swimming:5,basketball:6,soccer:7,tennis:8,american_football:9,training:10,walking:11,cross_country_skiing:12,alpine_skiing:13,snowboarding:14,rowing:15,mountaineering:16,hiking:17,multisport:18,paddling:19,invalid:254},event:{timer:0,workout:3,workout_step:4,power_down:5,power_up:6,off_course:7,session:8,lap:9,course_point:10,battery:11,virtual_partner_pace:12,hr_high_alert:13,hr_low_alert:14,speed_high_alert:15,speed_low_alert:16,cad_high_alert:17,cad_low_alert:18,power_high_alert:19,power_low_alert:20,recovery_hr:21,battery_low:22,time_duration_alert:23,distance_duration_alert:24,calorie_duration_alert:25,activity:26,fitness_equipment:27,length:28,user_marker:32,sport_point:33,calibration:36,front_gear_change:42,rear_gear_change:43,rider_position_change:44,elev_high_alert:45,elev_low_alert:46,comm_timeout:47,invalid:255},event_type:{start:0,stop:1,consecutive_depreciated:2,marker:3,stop_all:4,begin_depreciated:5,end_depreciated:6,end_all_depreciated:7,stop_disable:8,stop_disable_all:9,invalid:255},course_point:{generic:0,summit:1,valley:2,water:3,food:4,danger:5,left:6,right:7,straight:8,first_aid:9,fourth_category:10,third_category:11,second_category:12,first_category:13,hors_category:14,sprint:15,left_fork:16,right_fork:17,middle_fork:18,slight_left:19,sharp_left:20,slight_right:21,sharp_right:22,u_turn:23,segment_start:24,segment_end:25,invalid:255}},E=c=>{let e=lt[c];return{size:1,baseType:0,mapValue:t=>typeof t=="string"?e[t]??255:t,setValue:function(t,r){this.setUint8(t,r)}}},Se={enum_file:E("file"),enum_activity:E("sport"),enum_sport:E("sport"),enum_sub_sport:E("sport"),enum_event:E("event"),enum_event_type:E("event_type"),enum_course_point:E("course_point"),uint8:{size:1,baseType:2,setValue:DataView.prototype.setUint8},sint8:{size:1,baseType:1,setValue:DataView.prototype.setInt8},uint16:{size:2,baseType:132,setValue:DataView.prototype.setUint16},sint16:{size:2,baseType:131,setValue:DataView.prototype.setInt16},uint32:{size:4,baseType:134,setValue:DataView.prototype.setUint32},sint32:{size:4,baseType:133,setValue:DataView.prototype.setInt32},string:{size:0,baseType:7,mapValue:c=>Array.from(je(c)),setValue:mt},distance:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>Math.round(c*1e3)},speed:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:c=>Math.round(c*100)},altitude:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:c=>Math.round((c+500)*5)},seconds:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>Math.round(c*1e3)},date_time:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>{let e;return c instanceof Date?(e=Math.floor(c.getTime()/1e3),e-631065600):typeof c=="string"?(e=Math.floor(new Date(c).getTime()/1e3),e-631065600):c<631065600?Math.floor(c):(c>9999999999?e=Math.floor(c/1e3):e=Math.floor(c),e-631065600)}},semicircles:{size:4,baseType:133,setValue:DataView.prototype.setInt32,mapValue:c=>Math.round(c/180*2147483648)}};function Ue(c){return Array.from(je(c)).length+1}function*je(c){for(let e of ut(c))e<128?yield e:e<2048?(yield 192|e>>6,yield 128|e&63):e<65536?(yield 224|e>>12,yield 128|e>>6&63,yield 128|e&63):(yield 240|e>>18,yield 128|e>>12&63,yield 128|e>>6&63,yield 128|e&63);yield 0}function*ut(c){for(let e=0;e<c.length;){let t=c.codePointAt(e);if(t===void 0)break;yield t,e+=t>65535?2:1}}function mt(c,e){for(let t=0;t<e.length;t++)this.setUint8(c+t,e[t])}var Tt={file_id:{mesgNum:0,fieldDefns:[{name:"type",number:0,type:"enum_file"},{name:"time_created",number:4,type:"date_time"}]},session:{mesgNum:18,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"},{name:"sport",number:5,type:"enum_sport"},{name:"sub_sport",number:6,type:"enum_sub_sport"},{name:"first_lap_index",number:11,type:"uint16"},{name:"num_laps",number:26,type:"uint16"}]},lap:{mesgNum:19,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"end_position_lat",number:5,type:"semicircles"},{name:"end_position_long",number:6,type:"semicircles"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"}]},record:{mesgNum:20,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"position_lat",number:0,type:"semicircles"},{name:"position_long",number:1,type:"semicircles"},{name:"altitude",number:2,type:"altitude"},{name:"distance",number:5,type:"distance"},{name:"heart_rate",number:3,type:"uint8"},{name:"cadence",number:4,type:"uint8"},{name:"speed",number:6,type:"speed"},{name:"power",number:7,type:"uint16"}]},event:{mesgNum:21,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"event",number:0,type:"enum_event"},{name:"event_type",number:1,type:"enum_event_type"},{name:"event_group",number:4,type:"uint8"}]},course:{mesgNum:31,fieldDefns:[{name:"name",number:5,type:"string"},{name:"sport",number:4,type:"enum_sport"},{name:"sub_sport",number:7,type:"enum_sub_sport"}]},activity:{mesgNum:34,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"total_timer_time",number:0,type:"seconds"},{name:"num_sessions",number:1,type:"uint16"},{name:"type",number:2,type:"enum_activity"},{name:"event",number:3,type:"enum_event"},{name:"event_type",number:4,type:"enum_event_type"},{name:"local_timestamp",number:5,type:"date_time"},{name:"event_group",number:6,type:"uint8"}]},course_point:{mesgNum:32,fieldDefns:[{name:"timestamp",number:1,type:"date_time"},{name:"position_lat",number:2,type:"semicircles"},{name:"position_long",number:3,type:"semicircles"},{name:"distance",number:4,type:"distance"},{name:"type",number:5,type:"enum_course_point"}]}},ft=(c,e)=>c.map(t=>({...t,value:e[t.name]})).filter(({value:t})=>t!==void 0),ee=class c{static check(e,t,r,i){if(t===void 0)throw new Error(`Message '${e}' not known`);if(r===void 0)throw new Error(`Message '${e}' has no field definitions`);let n=r.map(o=>o.name),s=Object.keys(i).filter(o=>!n.includes(o));if(s.length)throw new Error(`Message '${e}' has no field definitions named '${s}'`)}constructor(e,t,r){let i=Tt[t];if(!i)throw new Error(`Unknown message type: ${t}`);let{mesgNum:n,fieldDefns:s}=i;c.check(t,n,s,r),this.localNum=e,this.mesgNum=n,this.fields=ft(s,r)}get mesgDefn(){let e=this.fields.map(({number:t,type:r,value:i})=>{let n=Se[r];if(!n)throw new Error(`Unknown type: ${r}`);let{size:s,baseType:o}=n;return r==="string"?{number:t,size:Ue(i),baseType:o}:{number:t,size:s,baseType:o}});return{localNum:this.localNum,mesgNum:this.mesgNum,fieldDefns:e}}isSameDefn(e){let t=(o,a)=>o.number===a.number&&o.size===a.size&&o.baseType===a.baseType,r=(o,a)=>o.length===a.length&&o.every((p,d)=>t(p,a[d])),{localNum:i,mesgNum:n,fieldDefns:s}=this.mesgDefn;return n===e.mesgNum&&i===e.localNum&&r(s,e.fieldDefns)}get defnRecord(){let{localNum:e,mesgNum:t,fieldDefns:r}=this.mesgDefn,i=6+3*r.length,n=new DataView(new ArrayBuffer(i));n.setUint8(0,64|e),n.setUint8(2,1),n.setUint16(3,t),n.setUint8(5,r.length);let s=6;for(let o of r)n.setUint8(s++,o.number),n.setUint8(s++,o.size),n.setUint8(s++,o.baseType);return n.buffer}get dataRecord(){let{fieldDefns:e}=this.mesgDefn,t=1+e.reduce((n,{size:s})=>n+s,0),r=new DataView(new ArrayBuffer(t));r.setUint8(0,this.localNum);let i=1;for(let{number:n,type:s,value:o}of this.fields){let a=Se[s];if(!a)throw new Error(`Unknown type: ${s}`);let{size:p,setValue:d}=a,l;"mapValue"in a?l=a.mapValue(o):l=o,d&&d.call(r,i,l),i+=p}return r.buffer}};var gt=[0,52225,55297,5120,61441,15360,10240,58369,40961,27648,30720,46081,20480,39937,34817,17408],Ke=(c,e)=>(c>>>4^gt[c&15^e])&65535,yt=(c,e,t)=>Ke(Ke(c,e),t),ht=(c,e)=>yt(c,e&15,e>>>4);function De(c,e=0){let t=e,r=c instanceof ArrayBuffer?new Uint8Array(c):c;for(let i=0;i<r.length;i++)t=ht(t,r[i]);return t}var Ye=f(require("dayjs")),Ne=14,vt=16,xt=2078,Ct=776358228,C=class{constructor(e={}){this.localNum={};this.mesgDefn=[];this.messages=[];this.options={compact:e.compact??!0,defaultActivity:e.defaultActivity??"cycling",defaultSubActivity:e.defaultSubActivity??"generic"}}async encode(e){return this.reset(),this.buildFITContent(e,"activity"),Buffer.from(await this.blob.arrayBuffer())}async encodeCourse(e){return this.reset(),this.buildFITContent(e,"course"),Buffer.from(await this.blob.arrayBuffer())}async encodeToBlob(e,t="activity"){return this.reset(),this.buildFITContent(e,t),this.blob}reset(){this.localNum={},this.mesgDefn=[],this.messages=[]}buildFITContent(e,t){this.buildFileId(e,t),t==="course"?this.buildCourseContent(e):this.buildActivityContent(e)}buildActivityContent(e){let t=e.sessionMesgs||[];if(t.length===0)throw new Error("Activity file must contain at least one Session");let r=0,i=[],n=[];for(let s of t){if(s.lapMesgs&&this.buildEventsFromLaps(s.lapMesgs,i),s.lapMesgs)for(let o of s.lapMesgs)o.recordMesgs&&this.buildRecords(o.recordMesgs);s.lapMesgs&&this.buildLaps(s.lapMesgs),this.buildSession(s),r++,this.buildActivityFromSession(s,n)}i.forEach(s=>this.buildEvent(s)),n.forEach(s=>this.buildActivity(s))}buildCourseContent(e){let t=e.sessionMesgs||[];if(t.length===0)throw new Error("Course file must contain track data");let r=t[0];if(this.buildCourse({name:"course",sport:this.options.defaultActivity}),r.lapMesgs){let i=[];for(let o of r.lapMesgs)o.recordMesgs&&i.push(...o.recordMesgs);i.sort((o,a)=>o.timestamp&&a.timestamp?new Date(o.timestamp).getTime()-new Date(a.timestamp).getTime():(o.distance||0)-(a.distance||0));let n=i[0],s=i[i.length-1];if(r.startTime&&this.buildEvent({timestamp:r.startTime,event:"timer",eventType:"start",eventGroup:0}),i.forEach(o=>this.buildRecord(o)),s.timestamp&&this.buildEvent({timestamp:s.timestamp,event:"timer",eventType:"stop_all",eventGroup:0}),r.lapMesgs)for(let o=0;o<r.lapMesgs.length;o++)this.buildLap(r.lapMesgs[o])}}buildFileId(e,t){var i;let r=((i=e.fileIdMesgs)==null?void 0:i[0])||{};this.writeMesg("file_id",{type:t,time_created:r.timeCreated?this.parseTimestamp(r.timeCreated):Date.now(),manufacturer:r.manufacturer,product:r.product,serial_number:r.serialNumber})}buildSession(e){var t;this.writeMesg("session",{timestamp:e.timestamp?e.timestamp:void 0,start_time:e.startTime?e.startTime:void 0,total_elapsed_time:e.totalElapsedTime,total_timer_time:e.totalTimerTime,start_position_lat:e.startPositionLat?this.convertToSemicircles(e.startPositionLat):void 0,start_position_long:e.startPositionLong?this.convertToSemicircles(e.startPositionLong):void 0,total_distance:e.totalDistance,total_ascent:e.totalAscent,total_descent:e.totalDescent,sport:e.sport||this.options.defaultActivity,sub_sport:e.subSport||this.options.defaultSubActivity,first_lap_index:e.firstLapIndex||0,num_laps:e.numLaps||((t=e.lapMesgs)==null?void 0:t.length)||1})}buildLaps(e){e.forEach(t=>this.buildLap(t))}buildLap(e){this.writeMesg("lap",{timestamp:e!=null&&e.timestamp?e.timestamp:void 0,start_time:e!=null&&e.startTime?e.startTime:void 0,start_position_lat:e!=null&&e.startPositionLat?this.convertToSemicircles(e.startPositionLat):void 0,start_position_long:e!=null&&e.startPositionLong?this.convertToSemicircles(e.startPositionLong):void 0,end_position_lat:e!=null&&e.endPositionLat?this.convertToSemicircles(e.endPositionLat):void 0,end_position_long:e!=null&&e.endPositionLong?this.convertToSemicircles(e.endPositionLong):void 0,total_elapsed_time:e==null?void 0:e.totalElapsedTime,total_timer_time:e==null?void 0:e.totalTimerTime,total_distance:e==null?void 0:e.totalDistance,total_ascent:e==null?void 0:e.totalAscent,total_descent:e==null?void 0:e.totalDescent})}buildRecords(e){e.forEach(t=>this.buildRecord(t))}buildRecord(e){this.writeMesg("record",{timestamp:e.timestamp,position_lat:e!=null&&e.positionLat?this.convertToSemicircles(e.positionLat):void 0,position_long:e!=null&&e.positionLong?this.convertToSemicircles(e.positionLong):void 0,altitude:(e==null?void 0:e.enhancedAltitude)||(e==null?void 0:e.altitude),distance:e==null?void 0:e.distance,heart_rate:e==null?void 0:e.heartRate,cadence:e==null?void 0:e.cadence,speed:(e==null?void 0:e.enhancedSpeed)||(e==null?void 0:e.speed),power:e==null?void 0:e.power})}buildEvent(e){this.writeMesg("event",{timestamp:e.timestamp?e.timestamp:void 0,event:e.event,event_type:e.eventType,event_group:e.eventGroup})}buildActivity(e){this.writeMesg("activity",{timestamp:e.timestamp?e.timestamp:void 0,total_timer_time:e.totalTimerTime,num_sessions:e.numSessions,type:e.type,event:e.event,event_type:e.eventType,local_timestamp:e.localTimestamp?this.parseTimestamp(e.localTimestamp):void 0,event_group:e.eventGroup})}buildCourse(e){this.writeMesg("course",{name:e.name,sport:e.sport})}buildEventsFromLaps(e,t){e.forEach((r,i)=>{r.startTime&&t.push({timestamp:r.startTime,event:"timer",eventType:"start",eventGroup:i}),r.timestamp&&t.push({timestamp:r.timestamp,event:"timer",eventType:i===e.length-1?"stop_all":"stop",eventGroup:i})})}buildActivityFromSession(e,t){t.push({timestamp:e.timestamp,totalTimerTime:e.totalTimerTime,numSessions:1,type:e.sport||this.options.defaultActivity,event:"activity",eventType:"stop",eventGroup:0})}parseTimestamp(e){return typeof e=="number"?e:(0,Ye.default)(e).valueOf()}convertToSemicircles(e){if(e!=null)return Math.round(e*2**31/180)}validateRequiredFields(e){if(!e.sessionMesgs||e.sessionMesgs.length===0)throw new Error("FIT file must contain at least one Session")}writeMesg(e,t){let r=Object.fromEntries(Object.entries(t).filter(([o,a])=>a!==void 0));if(Object.keys(r).length===0)return;let i=this.localNum[e];i===void 0&&(i=this.localNum[e]=Object.keys(this.localNum).length);let n=new ee(i,e,r),s=this.mesgDefn[i];(!s||!n.isSameDefn(s))&&(this.messages.push(n.defnRecord),this.mesgDefn[i]=n.mesgDefn),this.messages.push(n.dataRecord)}get blob(){let e=[this.header,...this.messages,this.trailer];return new Blob(e,{type:"application/octet-stream"})}get dataLen(){return this.messages.reduce((e,t)=>e+t.byteLength,0)}get dataCrc(){return this.messages.reduce((e,t)=>De(t,e),0)}get header(){let e=new DataView(new ArrayBuffer(Ne));return e.setUint8(0,Ne),e.setUint8(1,vt),e.setUint16(2,xt,!0),e.setUint32(4,this.dataLen,!0),e.setUint32(8,Ct),e.setUint16(12,De(e.buffer.slice(0,12)),!0),e.buffer}get trailer(){let e=new DataView(new ArrayBuffer(2));return e.setUint16(0,this.dataCrc,!0),e.buffer}async encoder(e){return this.encode(e)}};var P=class{constructor(){this.version="1.0.0";this.priority=100}supports(e){return this.supportedTags.includes(e)}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}parseFloat(e){if(!(typeof e>"u"))return typeof e=="number"?e:typeof e=="string"&&parseFloat(e)||0}parseInt(e){return typeof e=="number"?Math.floor(e):typeof e=="string"&&parseInt(e,10)||0}parseString(e){return String(e||"")}parseBoolean(e){return typeof e=="boolean"?e:typeof e=="string"?e.toLowerCase()==="true":!1}parseDate(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}hasRequiredAttributes(e,t){return t.every(r=>{var i;return(i=e.attributes)==null?void 0:i[r]})}extractAttributes(e,t,r){e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{let s=r[i];s&&s in t&&(t[s]=String(n||""))})}processChildren(e,t,r){var i;(i=e.children)==null||i.forEach(n=>{let s=r[n.tag];s&&s(n,t)})}getChildValue(e,t){var i;let r=(i=e.children)==null?void 0:i.find(n=>n.tag===t);return r!=null&&r.value?String(r.value):void 0}getChildByTag(e,t){var r;return(r=e.children)==null?void 0:r.find(i=>i.tag===t)}getChildrenByTag(e,t){var r;return((r=e.children)==null?void 0:r.filter(i=>i.tag===t))||[]}convertExtensions(e){var r;let t={};return(r=e.children)==null||r.forEach(i=>{t[i.tag]=this.convertExtensionContent(i)}),t}convertExtensionContent(e){var t;if((t=e.children)!=null&&t.length){let r={};return e.children.forEach(i=>{r[i.tag]=this.convertExtensionContent(i)}),r}else return e.value}},A=class{constructor(){this.version="1.0.0";this.description=""}async initialize(e){}async destroy(e){}async validate(e){return!0}async onTokenize(e,t){return e}async onAstGenerate(e,t){return e}async onConvert(e,t){return e}async onComplete(e,t){return e}async onError(e,t){}};var u=class extends P{parseCoordinate(e){let t=this.parseFloat(e);return t===0?void 0:t}parseGPXTime(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}extractNumericAttributes(e,t,r){e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{let s=r[i];s&&s in t&&typeof n<"u"&&(t[s]=this.parseFloat(n))})}},j=class extends A{async onError(e,t){t.warnings.push(`Middleware ${this.name} error: ${e.message}`)}};var te=class extends u{constructor(){super(...arguments);this.name="wpt-converter";this.supportedTags=["wpt","trkpt","rtept"];this.version="1.0.0"}convert(t,r){var n,s;if(!this.hasRequiredAttributes(t,["lat","lon"]))return;let i={lat:this.parseFloat((n=t.attributes)==null?void 0:n.lat),lon:this.parseFloat((s=t.attributes)==null?void 0:s.lon)};return this.processChildren(t,i,{ele:(o,a)=>a.ele=this.parseFloat(o.value),time:(o,a)=>a.time=new Date(this.parseString(o.value)),speed:(o,a)=>a.speed=this.parseFloat(o.value),power:(o,a)=>a.power=this.parseFloat(o.value),cadence:(o,a)=>a.cadence=this.parseFloat(o.value),heartRate:(o,a)=>a.heartRate=this.parseFloat(o.value),course:(o,a)=>a.course=this.parseFloat(o.value),name:(o,a)=>a.name=this.parseString(o.value),cmt:(o,a)=>a.cmt=this.parseString(o.value),desc:(o,a)=>a.desc=this.parseString(o.value),src:(o,a)=>a.src=this.parseString(o.value),sym:(o,a)=>a.sym=this.parseString(o.value),type:(o,a)=>a.type=this.parseString(o.value),fix:(o,a)=>a.fix=this.parseString(o.value),sat:(o,a)=>a.sat=this.parseString(o.value),hdop:(o,a)=>a.hdop=this.parseFloat(o.value),vdop:(o,a)=>a.vdop=this.parseFloat(o.value),pdop:(o,a)=>a.pdop=this.parseFloat(o.value),ageofdgpsdata:(o,a)=>a.ageofdgpsdata=this.parseFloat(o.value),geoidheight:(o,a)=>a.geoidheight=this.parseFloat(o.value),magvar:(o,a)=>a.magvar=this.parseFloat(o.value),dgpsid:(o,a)=>a.dgpsid=this.parseFloat(o.value),extensions:(o,a)=>{let p=r.metadata.get("decoder"),d=p==null?void 0:p.getConverter("extensions");if(d){let l=d.convert(o,r);l&&(this.mapExtensionsToPoint(l,a),a.extensions=l)}},link:(o,a)=>{var l;a.link||(a.link=[]);let p=r.metadata.get("decoder"),d=(l=p==null?void 0:p.getConverter("link"))==null?void 0:l.convert(o,r);d&&a.link&&a.link.push(d)}}),i}mapExtensionsToPoint(t,r){Object.entries(t).forEach(([i,n])=>{if(n!==void 0&&(typeof n=="string"||typeof n=="number")){let s=o=>(Array.isArray(o)?o:[o]).some(p=>{let d=i.toLowerCase(),l=p.toLowerCase();return d===l||d.endsWith(`:${l}`)});s("speed")?r.speed=this.parseFloat(n):s("hr")?r.heartRate=this.parseFloat(n):s(["cad","cadence"])?r.cadence=this.parseFloat(n):s(["PowerInWatts","power"])&&(r.power=this.parseFloat(n))}})}},re=class extends u{constructor(){super(...arguments);this.name="rte-converter";this.supportedTags=["rte"]}convert(t,r){let i={rtept:[]};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),cmt:(n,s)=>s.cmt=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),src:(n,s)=>s.src=this.parseString(n.value),number:(n,s)=>s.number=this.parseFloat(n.value),type:(n,s)=>s.type=this.parseString(n.value),rtept:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("wpt"))==null?void 0:p.convert(n,r);a&&s.rtept&&s.rtept.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var a;s.link||(s.link=[]);let o=r.metadata.get("decoder");(a=n.children)==null||a.forEach(p=>{var l;let d=(l=o==null?void 0:o.getConverter("link"))==null?void 0:l.convert(p,r);d&&s.link&&s.link.push(d)})}}),i}},ne=class extends u{constructor(){super(...arguments);this.name="trk-converter";this.supportedTags=["trk"]}convert(t,r){let i={trkseg:[]};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),cmt:(n,s)=>s.cmt=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),src:(n,s)=>s.src=this.parseString(n.value),number:(n,s)=>s.number=this.parseFloat(n.value),type:(n,s)=>s.type=this.parseString(n.value),trkseg:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("trkseg"))==null?void 0:p.convert(n,r);a&&s.trkseg&&s.trkseg.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var a;s.link||(s.link=[]);let o=r.metadata.get("decoder");(a=n.children)==null||a.forEach(p=>{var l;let d=(l=o==null?void 0:o.getConverter("link"))==null?void 0:l.convert(p,r);d&&s.link&&s.link.push(d)})}}),i}},ie=class extends u{constructor(){super(...arguments);this.name="trkseg-converter";this.supportedTags=["trkseg"]}convert(t,r){let i={trkpt:[]};return this.processChildren(t,i,{trkpt:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("wpt"))==null?void 0:p.convert(n,r);a&&s.trkpt&&s.trkpt.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))}}),i}},se=class extends u{constructor(){super(...arguments);this.name="link-converter";this.supportedTags=["link"]}convert(t,r){var n;let i={};return(n=t.attributes)!=null&&n.href&&(i.href=t.attributes.href),this.processChildren(t,i,{text:(s,o)=>o.text=this.parseString(s.value),type:(s,o)=>o.type=this.parseString(s.value)}),i}},oe=class extends u{constructor(){super(...arguments);this.name="metadata-converter";this.supportedTags=["metadata"]}convert(t,r){let i={};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),keywords:(n,s)=>s.keywords=this.parseString(n.value),time:(n,s)=>s.time=new Date(this.parseString(n.value)),author:(n,s)=>{var a;let o=r.metadata.get("decoder");s.author=(a=o==null?void 0:o.getConverter("author"))==null?void 0:a.convert(n,r)},copyright:(n,s)=>{var a;let o=r.metadata.get("decoder");s.copyright=(a=o==null?void 0:o.getConverter("copyright"))==null?void 0:a.convert(n,r)},bounds:(n,s)=>{var a;let o=r.metadata.get("decoder");s.bounds=(a=o==null?void 0:o.getConverter("bounds"))==null?void 0:a.convert(n,r)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var p;s.link||(s.link=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("link"))==null?void 0:p.convert(n,r);a&&s.link&&s.link.push(a)}}),i}},ae=class extends u{constructor(){super(...arguments);this.name="person-converter";this.supportedTags=["author"]}convert(t,r){var n;let i={};return t.value&&!((n=t.children)!=null&&n.length)?(i.name=this.parseString(t.value),i):(this.processChildren(t,i,{name:(s,o)=>o.name=this.parseString(s.value),email:(s,o)=>{var p;let a=r.metadata.get("decoder");o.email=(p=a==null?void 0:a.getConverter("email"))==null?void 0:p.convert(s,r)},link:(s,o)=>{var p;let a=r.metadata.get("decoder");o.link=(p=a==null?void 0:a.getConverter("link"))==null?void 0:p.convert(s,r)}}),i)}},ce=class extends u{constructor(){super(...arguments);this.name="email-converter";this.supportedTags=["email"]}convert(t,r){let i={};return this.processChildren(t,i,{id:(n,s)=>s.id=this.parseString(n.value),domain:(n,s)=>s.domain=this.parseString(n.value)}),i}},pe=class extends u{constructor(){super(...arguments);this.name="copyright-converter";this.supportedTags=["copyright"]}convert(t,r){var n;let i={};return(n=t.attributes)!=null&&n.author&&(i.author=t.attributes.author),this.processChildren(t,i,{year:(s,o)=>o.year=this.parseString(s.value),license:(s,o)=>o.license=this.parseString(s.value)}),i}},de=class extends u{constructor(){super(...arguments);this.name="bounds-converter";this.supportedTags=["bounds"]}convert(t,r){let i={};return this.extractAttributes(t,i,{minlat:"minlat",minlon:"minlon",maxlat:"maxlat",maxlon:"maxlon"}),i}},le=class extends u{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["extensions"]}convert(t,r){var n;let i={};return(n=t.children)==null||n.forEach(s=>{this.flattenExtensionElement(s,i)}),i}flattenExtensionElement(t,r){var i,n;if(!((i=t.children)!=null&&i.length)&&t.value!==void 0){r[t.tag]=this.parseExtensionValue(t.value);return}(n=t.children)!=null&&n.length&&t.children.forEach(s=>{this.flattenExtensionElement(s,r)})}parseExtensionValue(t){if(t===void 0)return;let r=String(t),i=parseFloat(r);return!isNaN(i)&&isFinite(i)?i:r}};var Ze=require("htmlparser2"),K=(i=>(i.TOKENIZE="tokenize",i.AST_GENERATE="ast_generate",i.CONVERT="convert",i.COMPLETE="complete",i))(K||{}),ue=class{constructor(){this.stage="tokenize"}async process(e){let t=Date.now();if(!e.xmlContent)throw new Error("XML content cannot be empty");let r=[],i=new Ze.Parser({onopentag(n,s){r.push({type:"open",tag:n,attributes:s})},ontext(n){let s=n.replace(/\n/g,"").trim();s&&r.push({type:"text",tag:"text",value:s})},onclosetag(n){r.push({type:"close",tag:n})}},{xmlMode:!0});return i.write(e.xmlContent),i.end(),e.tokens=r,e.performance.tokenizeTime=Date.now()-t,e}},me=class{constructor(){this.stage="ast_generate"}async process(e){var s;let t=Date.now();if(!e.tokens)throw new Error("Tokens cannot be empty");let r=[],i,n=null;for(let o of e.tokens)if(o.type==="open"){let a={tag:o.tag,attributes:o.attributes||{},children:[]};i?n&&((s=n.children)==null||s.push(a)):i=a,r.push(a),n=a}else o.type==="text"&&n?n.value=o.value:o.type==="close"&&(r.pop(),n=r[r.length-1]||null);return e.ast=i,e.performance.astTime=Date.now()-t,e}},Te=class{constructor(e){this.getConverter=e;this.stage="convert"}async process(e){var i;let t=Date.now();if(!e.ast)throw new Error("AST cannot be empty");let r={};return e.ast.attributes&&Object.entries(e.ast.attributes).forEach(([n,s])=>{n.startsWith("xmlns:")?r[n]=s.replace(/&#39;/g,"'"):n==="xsi:schemaLocation"?r[n]=s.replace(/&#39;/g,"'"):r[n]=s}),(i=e.ast.children)==null||i.forEach(n=>{let s=this.getConverter(n.tag);try{let o=s.convert(n,e);o&&this.assignResult(r,n.tag,o)}catch(o){e.errors.push(o)}}),e.result=r,e.performance.convertTime=Date.now()-t,e}assignResult(e,t,r){switch(t){case"metadata":e.metadata=r;break;case"wpt":e.wpt||(e.wpt=[]),e.wpt.push(r);break;case"rte":e.rte||(e.rte=[]),e.rte.push(r);break;case"trk":e.trk||(e.trk=[]),e.trk.push(r);break;case"extensions":e.extensions=r;break}}},fe=class{constructor(){this.stage="complete"}async process(e){e.performance.endTime=Date.now();let t=e.performance.endTime-e.performance.startTime;return e.metadata.set("performance",{totalTime:t,tokenizeTime:e.performance.tokenizeTime,astTime:e.performance.astTime,convertTime:e.performance.convertTime}),e}};var b=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultConvertersRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new ue,new me,new Te(e=>this.getConverter(e)),new fe]}async registerDefaultConverters(){var t;if(this.defaultConvertersRegistered)return;let e=[new te,new re,new ne,new ie,new se,new oe,new ae,new ce,new pe,new de,new le];for(let r of e)(t=r.supportedTags)==null||t.forEach(i=>{this.addConverterForTag(i,r)}),this.registeredPlugins.add(r.name);this.defaultConvertersRegistered=!0}addConverterForTag(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}async registerConverter(e){var r,n;if(this.registeredPlugins.has(e.name))throw new Error(`Converter plugin ${e.name} already exists`);(r=e.supportedTags)==null||r.forEach(s=>{this.addConverterForTag(s,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";(n=e.supportedTags)==null||n.forEach(s=>{let a=(this.converterPlugins.get(s)||[]).map(p=>`${p.name}(${p.priority||100})`)})}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:this.middlewarePlugins.push(e);let r=[];e.onTokenize&&r.push("onTokenize"),e.onAstGenerate&&r.push("onAstGenerate"),e.onConvert&&r.push("onConvert"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getAllConverters(e){return this.converterPlugins.get(e)||[]}unregisterConverter(e){let t;for(let[r,i]of this.converterPlugins){let n=i.findIndex(s=>s.name===e);n!==-1&&(t=i[n],i.splice(n,1),i.length===0&&this.converterPlugins.delete(r))}t&&this.registeredPlugins.delete(e)}unregisterMiddleware(e){let t=this.middlewarePlugins.findIndex(r=>r.name===e);t!==-1&&this.middlewarePlugins.splice(t,1)}listConverters(){return Array.from(this.converterPlugins.keys())}listConverterPlugins(){return Array.from(this.registeredPlugins)}listMiddlewares(){return this.middlewarePlugins.map(e=>e.name)}listProcessors(){return this.processors.map(e=>e.constructor.name)}getConverterDetails(e){let t={};if(e){let r=this.converterPlugins.get(e);r&&(t[e]=r.map(i=>({name:i.name,priority:i.priority||100})))}else for(let[r,i]of this.converterPlugins)t[r]=i.map(n=>({name:n.name,priority:n.priority||100}));return t}getMiddlewareDetails(){return this.middlewarePlugins.map(e=>{let t=[];return e.onTokenize&&t.push("onTokenize"),e.onAstGenerate&&t.push("onAstGenerate"),e.onConvert&&t.push("onConvert"),e.onComplete&&t.push("onComplete"),e.onError&&t.push("onError"),{name:e.name,hooks:t}})}async initialize(){var r;if(this.initialized)return;await this.registerDefaultConverters();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parserByBuffer(e){var r;await this.initialize();let t=this.createContext();t.rawData=e,t.xmlContent=e.toString("utf-8"),t.metadata.set("decoder",this);try{for(let i of this.processors)try{switch(t=await i.process(t),i.stage){case"tokenize":t.tokens&&(t.tokens=await this.executeMiddlewareHook("onTokenize",t.tokens,t));break;case"ast_generate":t.ast&&(t.ast=await this.executeMiddlewareHook("onAstGenerate",t.ast,t));break;case"convert":t.result&&(t.result=await this.executeMiddlewareHook("onConvert",t.result,t));break;case"complete":t.result&&(t.result=await this.executeMiddlewareHook("onComplete",t.result,t));break}}catch(n){t.errors.push(n);for(let s of this.middlewarePlugins)await((r=s.onError)==null?void 0:r.call(s,n,t))}return t.result}catch(i){throw i}}convertExtensions(e){var s,o;let t={},{attributes:r,tag:i,value:n}=e;if(r&&Object.entries(r).forEach(([a,p])=>{t[a]=p}),(s=e==null?void 0:e.children)!=null&&s.length)(o=e.children)==null||o.forEach(a=>{t[a.tag]=this.convertExtensions(a)});else if(n!==void 0)return n;return t}};var Le=f(require("dayjs")),qe=f(require("dayjs/plugin/utc.js"));var Xe={temperature:"atemp",wtemp:"wtemp",heartRate:"hr",cadence:"cad"};var Re={temperature:"Temperature",Depth:"Depth"};Le.default.extend(qe.default);var I=class{constructor(e={}){this.formatElevation=e=>{let t=parseFloat(e);return isNaN(t)?e:this.roundTo(t,2).toString()};this.compact=e.compact??!0}async encode(e){let t=this.buildGPXXML(e);return Buffer.from(t,"utf-8")}encodeToString(e){return this.buildGPXXML(e)}buildGPXXML(e){let t=this.buildXMLHeader(),r=this.buildGPXContent(e),n=`${t}${r}
2
2
  </gpx>`;return this.compact?this.compressXML(n):n}compressXML(e){return e.replace(/>\s+</g,"><").replace(/^\s+|\s+$/gm,"").replace(/\s+/g," ").trim()}buildXMLHeader(){return['<?xml version="1.0" encoding="UTF-8"?>','<gpx creator="https://gpxonline.net" version="1.1"',' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',' xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd'," http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd"," http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd"," http://www.garmin.com/xmlschemas/PowerExtension/v1 http://www.garmin.com/xmlschemas/PowerExtensionv1.xsd",' http://www.topografix.com/GPX/gpx_style/0/2 http://www.topografix.com/GPX/gpx_style/0/2/gpx_style.xsd"',' xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"',' xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"',' xmlns:gpxpx="http://www.garmin.com/xmlschemas/PowerExtension/v1"',' xmlns:gpx_style="http://www.topografix.com/GPX/gpx_style/0/2"',' xmlns="http://www.topografix.com/GPX/1/1">'].join(`
3
3
  `)}buildGPXContent(e){let{metadata:t,wpt:r=[],rte:i=[],trk:n=[]}=e,s=[];return t&&s.push(this.buildMetadata(t)),r.forEach(o=>{s.push(this.buildWaypoint(o,"wpt"))}),i.forEach(o=>{s.push(this.buildRoute(o))}),n.forEach(o=>{s.push(this.buildTrack(o))}),s.join(`
4
4
  `)}buildMetadata(e){let t=["<metadata>"];return this.addOptionalElement(t,"name",e.name),this.addOptionalElement(t,"desc",e.desc),e.author&&t.push(this.buildAuthor(e.author)),e.copyright&&t.push(this.buildCopyright(e.copyright)),e.link&&this.addLinks(t,e.link),e.time&&t.push(this.buildTimeElement(e.time)),this.addOptionalElement(t,"keywords",e.keywords),e.bounds&&t.push(this.buildBounds(e.bounds)),e.extensions&&t.push(this.buildExtensions(e.extensions)),t.push("</metadata>"),t.join(`
5
5
  `)}buildAuthor(e){let t=["<author>"];return this.addOptionalElement(t,"name",e.name),e.email&&t.push(`<email id="${this.escapeXML(e.email.id||"")}" domain="${this.escapeXML(e.email.domain||"")}"/>`),e.link&&t.push(this.buildLink(e.link)),t.push("</author>"),t.join(`
6
6
  `)}buildCopyright(e){let t=[`<copyright author="${this.escapeXML(e.author||"")}">`];return this.addOptionalElement(t,"year",e.year),this.addOptionalElement(t,"license",e.license),t.push("</copyright>"),t.join(`
7
- `)}buildBounds(e){let t=this.escapeXMLAttribute((e.minlat||0).toString()),r=this.escapeXMLAttribute((e.minlon||0).toString()),i=this.escapeXMLAttribute((e.maxlat||0).toString()),n=this.escapeXMLAttribute((e.maxlon||0).toString());return`<bounds minlat="${t}" minlon="${r}" maxlat="${i}" maxlon="${n}"/>`}buildWaypoint(e,t){var i,n,s;if(!this.isValidCoordinate(e.lat,e.lon))return"";let r=[`<${t} lat="${this.escapeXMLAttribute(this.formatCoordinate(e.lat))}" lon="${this.escapeXMLAttribute(this.formatCoordinate(e.lon))}">`];if(this.addOptionalElement(r,"ele",(i=e.ele)==null?void 0:i.toString(),this.formatElevation),e.time&&r.push(this.buildTimeElement(e.time)),this.addOptionalElement(r,"speed",(n=e.speed)==null?void 0:n.toString()),this.addOptionalElement(r,"course",(s=e.course)==null?void 0:s.toString()),this.addStandardWaypointElements(r,e),e.extensions){let o=this.processPointExtensions(e,e.extensions);Object.keys(o).length>0&&r.push(this.buildExtensions(o))}return r.push(`</${t}>`),r.join(`
7
+ `)}buildBounds(e){let t=this.escapeXMLAttribute((e.minlat||0).toString()),r=this.escapeXMLAttribute((e.minlon||0).toString()),i=this.escapeXMLAttribute((e.maxlat||0).toString()),n=this.escapeXMLAttribute((e.maxlon||0).toString());return`<bounds minlat="${t}" minlon="${r}" maxlat="${i}" maxlon="${n}"/>`}buildWaypoint(e,t){var i,n,s;if(e.time===void 0)return"";let r=[`<${t} lat="${this.escapeXMLAttribute(e.lat?this.formatCoordinate(e.lat):"")}" lon="${this.escapeXMLAttribute(e.lon?this.formatCoordinate(e.lon):"")}">`];if(this.addOptionalElement(r,"ele",(i=e.ele)==null?void 0:i.toString(),this.formatElevation),e!=null&&e.time&&r.push(this.buildTimeElement(e.time)),this.addOptionalElement(r,"speed",(n=e.speed)==null?void 0:n.toString()),this.addOptionalElement(r,"course",(s=e.course)==null?void 0:s.toString()),this.addStandardWaypointElements(r,e),e.extensions){let o=this.processPointExtensions(e,e.extensions);Object.keys(o).length>0&&r.push(this.buildExtensions(o))}return r.push(`</${t}>`),r.join(`
8
8
  `)}addStandardWaypointElements(e,t){var r,i,n,s,o,a,p;this.addOptionalElement(e,"magvar",(r=t.magvar)==null?void 0:r.toString()),this.addOptionalElement(e,"geoidheight",(i=t.geoidheight)==null?void 0:i.toString()),this.addOptionalElement(e,"name",t.name),this.addOptionalElement(e,"cmt",t.cmt),this.addOptionalElement(e,"desc",t.desc),this.addOptionalElement(e,"src",t.src),t.link&&this.addLinks(e,t.link),this.addOptionalElement(e,"sym",t.sym),this.addOptionalElement(e,"type",t.type),this.addOptionalElement(e,"fix",t.fix),this.addOptionalElement(e,"sat",t.sat),this.addOptionalElement(e,"hdop",(n=t.hdop)==null?void 0:n.toString()),this.addOptionalElement(e,"vdop",(s=t.vdop)==null?void 0:s.toString()),this.addOptionalElement(e,"pdop",(o=t.pdop)==null?void 0:o.toString()),this.addOptionalElement(e,"ageofdgpsdata",(a=t.ageofdgpsdata)==null?void 0:a.toString()),this.addOptionalElement(e,"dgpsid",(p=t.dgpsid)==null?void 0:p.toString())}buildRoute(e){var r;let t=["<rte>"];return this.addRouteTrackCommonElements(t,e),e.rtept&&((r=e.rtept)==null||r.forEach(i=>{t.push(this.buildWaypoint(i,"rtept"))})),e.extensions&&t.push(this.buildExtensions(e.extensions)),t.push("</rte>"),t.join(`
9
9
  `)}buildTrack(e){let t=["<trk>"];return this.addRouteTrackCommonElements(t,e),e.trkseg&&e.trkseg.forEach(r=>{t.push(this.buildTrackSegment(r))}),e.extensions&&t.push(this.buildExtensions(e.extensions)),t.push("</trk>"),t.join(`
10
10
  `)}buildTrackSegment(e){let t=["<trkseg>"];return e.trkpt&&e.trkpt.forEach(r=>{t.push(this.buildWaypoint(r,"trkpt"))}),e.extensions&&t.push(this.buildExtensions(e.extensions)),t.push("</trkseg>"),t.join(`
11
- `)}addRouteTrackCommonElements(e,t){var r;this.addOptionalElement(e,"name",t.name),this.addOptionalElement(e,"cmt",t.cmt),this.addOptionalElement(e,"desc",t.desc),this.addOptionalElement(e,"src",t.src),t.link&&this.addLinks(e,t.link),this.addOptionalElement(e,"number",(r=t.number)==null?void 0:r.toString()),this.addOptionalElement(e,"type",t.type)}processPointExtensions(e,t){let r={};return Object.entries({"gpxtpx:TrackPointExtension":{"gpxtpx:hr":"heartRate","gpxtpx:cad":"cadence","gpxtpx:speed":"speed","gpxtpx:atemp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:temp":"temperature"},"gpxpx:PowerExtension":{"gpxpx:PowerInWatts":"power"},"gpxx:GpxExtensions":{"gpxx:Temperature":"temperature","gpxx:Depth":"depth"}}).forEach(([n,s])=>{let o={},a=!1;Object.entries(s).forEach(([p,d])=>{let l;if(e[d]!==void 0)l=e[d];else if(t)if(t[p]!==void 0)l=t[p];else{let w=p.split(":").pop();Object.entries(t).forEach(([u,T])=>{u.endsWith(`:${w}`)&&T!==void 0&&(l=T)})}l!==void 0&&(o[p]=l,a=!0)}),a&&(r[n]=o)}),r}buildTrackPointExtension(e,t){let r=this.deepClone(t["gpxtpx:TrackPointExtension"]||{}),i=Object.keys(Re);return Object.keys(e).filter(n=>i.includes(n)).forEach(n=>{let s=Re[n];s&&e[n]!==void 0&&(r[`gpxtpx:${s}`]=e[n])}),r}buildPowerExtension(e,t){return this.deepClone(t["gpxpx:PowerExtension"]||{})}buildGpxExtensions(e,t){let r=this.deepClone(t["gpxx:GpxExtensions"]||{}),i=Object.keys(Xe);return Object.keys(e).filter(n=>i.includes(n)).forEach(n=>{let s=Xe[n];s&&e[n]!==void 0&&(r[`gpxx:${s}`]=e[n])}),r}buildExtensions(e){let t=this.buildExtensionContent(e);return t?`<extensions>${t}</extensions>`:""}buildExtensionContent(e){return Object.entries(e).filter(([t])=>!t.startsWith("xmlns")).map(([t,r])=>{if(r&&typeof r=="object"){let i=this.buildExtensionContent(r);return`<${t}>${i}</${t}>`}else if(r!=null)return`<${t}>${this.escapeXML(String(r))}</${t}>`;return""}).filter(t=>t).join("")}buildLink(e){let t=[`<link href="${this.escapeXMLAttribute(e.href||"")}">`];return this.addOptionalElement(t,"text",e.text),this.addOptionalElement(t,"type",e.type),t.push("</link>"),t.join("")}addLinks(e,t){(Array.isArray(t)?t:[t]).forEach(i=>{e.push(this.buildLink(i))})}buildTimeElement(e){return typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z?$/.test(e)?`<time>${e}</time>`:`<time>${(0,Le.default)(e).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}</time>`}addOptionalElement(e,t,r,i){if(r!=null&&r!==""){let n=i?i(r):this.escapeXML(r);e.push(`<${t}>${n}</${t}>`)}}isValidCoordinate(e,t){return e!=null&&t!==void 0&&t!==null&&!isNaN(e)&&!isNaN(t)}formatCoordinate(e){return this.roundTo(e,6).toString()}roundTo(e,t){let r=Math.pow(10,t);return Math.round(e*r)/r}escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}escapeXMLAttribute(e){return typeof e!="string"?String(e||""):e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r/g,"&#13;").replace(/\n/g,"&#10;").replace(/\t/g,"&#9;")}deepClone(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map(r=>this.deepClone(r));let t={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=this.deepClone(e[r]));return t}encoder(e){return this.encode(e)}};var _e=class extends K{constructor(){super(...arguments);this.name="performance-middleware";this.description="Monitor parsing performance"}async onTokenize(t,r){return t}async onAstGenerate(t,r){let i=this.countNodes(t);return t}async onComplete(t,r){let i=r.metadata.get("performance");return t}countNodes(t){let r=1;if(t.children)for(let i of t.children)r+=this.countNodes(i);return r}},Me=class extends K{constructor(){super(...arguments);this.name="validation-middleware";this.description="Validate GPX data integrity"}async onComplete(t,r){let i=this.validateGPX(t);return i.length>0&&r.metadata.set("validation-errors",i),t}validateGPX(t){let r=[];if(t.version||r.push("Missing GPX version information"),t.creator||r.push("Missing GPX creator information"),t.trk){for(let i of t.trk)if(i.trkseg){for(let n of i.trkseg)if(n.trkpt)for(let s of n.trkpt)(typeof s.lat!="number"||typeof s.lon!="number")&&r.push("Invalid track point coordinates")}}return r}};async function Oe(c){let e=[new _e,new Me];for(let t of e)await c.registerMiddleware(t)}var f=class extends P{parseHeartRate(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>0&&t<300?t:void 0}parseTCXTime(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}parseDistance(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>0?t:void 0}parseSpeed(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>=0?t:void 0}parseAltitude(e){return this.parseFloat(e)}parseCoordinate(e){let t=this.parseFloat(e);return t!==0?t:void 0}};var ge=class extends f{constructor(){super(...arguments);this.name="PositionConverter";this.supportedTags=["Position"]}convert(t,r){let i={};return this.processChildren(t,i,{LatitudeDegrees:(n,s)=>s.LatitudeDegrees=this.parseString(n.value),LongitudeDegrees:(n,s)=>s.LongitudeDegrees=this.parseString(n.value)}),i}},ye=class extends f{constructor(){super(...arguments);this.name="TrackpointConverter";this.supportedTags=["Trackpoint"]}convert(t,r){let i={};return this.processChildren(t,i,{Time:(n,s)=>s.Time=this.parseString(n.value),Position:(n,s)=>{var a;let o=r.metadata.get("decoder");s.Position=(a=o==null?void 0:o.getConverter("Position"))==null?void 0:a.convert(n,r)},AltitudeMeters:(n,s)=>s.AltitudeMeters=this.parseFloat(n.value),DistanceMeters:(n,s)=>s.DistanceMeters=this.parseFloat(n.value),HeartRateBpm:(n,s)=>{if(n.value)s.HeartRateBpm=this.parseFloat(n.value);else{let o=this.getChildByTag(n,"Value");o!=null&&o.value&&(s.HeartRateBpm=this.parseFloat(o.value))}},Cadence:(n,s)=>{let o={Low:0,High:0};this.processChildren(n,o,{Low:(a,p)=>p.Low=this.parseFloat(a.value)||0,High:(a,p)=>p.High=this.parseFloat(a.value)||0}),s.Cadence=o},SensorState:(n,s)=>s.SensorState=n.value,Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}},he=class extends f{constructor(){super(...arguments);this.name="TrackConverter";this.supportedTags=["Track"]}convert(t,r){let i={Trackpoint:[]};return this.processChildren(t,i,{Trackpoint:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Trackpoint"))==null?void 0:p.convert(n,r);a&&s.Trackpoint&&s.Trackpoint.push(a)}}),i}},ve=class extends f{constructor(){super(...arguments);this.name="ActivityLapConverter";this.supportedTags=["Lap"]}convert(t,r){let i={};return this.extractAttributes(t,i,{StartTime:"Id"}),this.processChildren(t,i,{TotalTimeSeconds:(n,s)=>s.TotalTimeSeconds=this.parseFloat(n.value),DistanceMeters:(n,s)=>s.DistanceMeters=this.parseFloat(n.value),MaximumSpeed:(n,s)=>s.MaximumSpeed=this.parseFloat(n.value),Calories:(n,s)=>s.Calories=this.parseFloat(n.value),AverageHeartRateBpm:(n,s)=>s.AverageHeartRateBpm=this.parseFloat(n.value),MaximumHeartRateBpm:(n,s)=>s.MaximumHeartRateBpm=this.parseFloat(n.value),Intensity:(n,s)=>s.Intensity=n.value,TriggerMethod:(n,s)=>s.TriggerMethod=n.value,Track:(n,s)=>{var p;s.Track||(s.Track=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Track"))==null?void 0:p.convert(n,r);a&&s.Track.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value),Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}},xe=class extends f{constructor(){super(...arguments);this.name="ActivityConverter";this.supportedTags=["Activity"]}convert(t,r){let i={Id:"",Lap:[]};return this.extractAttributes(t,i,{Activity:"Activity"}),this.processChildren(t,i,{Id:(n,s)=>s.Id=this.parseString(n.value),Lap:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Lap"))==null?void 0:p.convert(n,r);a&&s.Lap.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value),Training:(n,s)=>s.Training=this.convertTraining(n),Creator:(n,s)=>s.Creator=this.convertCreator(n),Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}convertTraining(t){var i;let r={};return t.attributes&&Object.entries(t.attributes).forEach(([n,s])=>{r[n]=s}),(i=t.children)==null||i.forEach(n=>{r[n.tag]=this.convertExtensionContent(n)}),r}convertCreator(t){var i;let r={};return(i=t.children)==null||i.forEach(n=>{r[n.tag]=this.convertExtensionContent(n)}),r}},Ce=class extends f{constructor(){super(...arguments);this.name="ActivityListConverter";this.supportedTags=["Activities"]}convert(t,r){let i={Activity:[],MultiActivitySession:[]};return this.processChildren(t,i,{Activity:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Activity"))==null?void 0:p.convert(n,r);a&&s.Activity&&s.Activity.push(a)},MultiActivitySession:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("MultiActivitySession"))==null?void 0:p.convert(n,r);a&&s.MultiActivitySession&&s.MultiActivitySession.push(a)}}),i}},Pe=class extends f{constructor(){super(...arguments);this.name="MultiActivitySessionConverter";this.supportedTags=["MultiActivitySession"]}convert(t,r){let i={};return this.processChildren(t,i,{Id:(n,s)=>s.Id=this.parseString(n.value),FirstActivity:(n,s)=>{var a;let o=r.metadata.get("decoder");s.FirstActivity=(a=o==null?void 0:o.getConverter("FirstActivity"))==null?void 0:a.convert(n,r)},NextActivity:(n,s)=>{var p;s.NextActivity||(s.NextActivity=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("NextActivity"))==null?void 0:p.convert(n,r);a&&s.NextActivity.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value)}),i}},we=class extends f{constructor(){super(...arguments);this.name="AbstractSourceConverter";this.supportedTags=["Author","Creator"]}convert(t,r){let i={};return this.processChildren(t,i,{Name:(n,s)=>s.Name=this.parseString(n.value)}),i}},Ee=class extends f{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["Extensions"]}convert(t,r){let i={};return this.flattenExtensionElement(t,i),i}flattenExtensionElement(t,r){var i,n;if(!((i=t.children)!=null&&i.length)&&t.value!==void 0){r[t.tag]=this.parseExtensionValue(t.value);return}(n=t.children)!=null&&n.length&&t.children.forEach(s=>{this.flattenExtensionElement(s,r)})}parseExtensionValue(t){if(t===void 0)return;let r=String(t),i=parseFloat(r);return!isNaN(i)&&isFinite(i)?i:r}};var $e=require("htmlparser2"),Ae=class{static tokenizeXML(e){let t=[],r=new $e.Parser({onopentag(i,n){t.push({type:"open",tag:i,attributes:n})},ontext(i){let n=i.replace(/\n/g,"").trim();n&&t.push({type:"text",tag:"text",value:n})},onclosetag(i){t.push({type:"close",tag:i})}},{xmlMode:!0});return r.write(e),r.end(),t}static compressXML(e){return e.replace(/>\s+</g,"><").replace(/\s+/g," ").trim()}static formatXML(e,t=2){let r=" ".repeat(t),i="",n=0,s=!1;for(let o=0;o<e.length;o++){let a=e[o],p=e[o+1];a==="<"?(p==="/"?(n--,s||(i+=`
11
+ `)}addRouteTrackCommonElements(e,t){var r;this.addOptionalElement(e,"name",t.name),this.addOptionalElement(e,"cmt",t.cmt),this.addOptionalElement(e,"desc",t.desc),this.addOptionalElement(e,"src",t.src),t.link&&this.addLinks(e,t.link),this.addOptionalElement(e,"number",(r=t.number)==null?void 0:r.toString()),this.addOptionalElement(e,"type",t.type)}processPointExtensions(e,t){let r={};return Object.entries({"gpxtpx:TrackPointExtension":{"gpxtpx:hr":"heartRate","gpxtpx:cad":"cadence","gpxtpx:speed":"speed","gpxtpx:atemp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:temp":"temperature"},"gpxpx:PowerExtension":{"gpxpx:PowerInWatts":"power"},"gpxx:GpxExtensions":{"gpxx:Temperature":"temperature","gpxx:Depth":"depth"}}).forEach(([n,s])=>{let o={},a=!1;Object.entries(s).forEach(([p,d])=>{let l;if(e[d]!==void 0)l=e[d];else if(t)if(t[p]!==void 0)l=t[p];else{let H=p.split(":").pop();Object.entries(t).forEach(([m,y])=>{m.endsWith(`:${H}`)&&y!==void 0&&(l=y)})}l!==void 0&&(o[p]=l,a=!0)}),a&&(r[n]=o)}),r}buildTrackPointExtension(e,t){let r=this.deepClone(t["gpxtpx:TrackPointExtension"]||{}),i=Object.keys(Xe);return Object.keys(e).filter(n=>i.includes(n)).forEach(n=>{let s=Xe[n];s&&e[n]!==void 0&&(r[`gpxtpx:${s}`]=e[n])}),r}buildPowerExtension(e,t){return this.deepClone(t["gpxpx:PowerExtension"]||{})}buildGpxExtensions(e,t){let r=this.deepClone(t["gpxx:GpxExtensions"]||{}),i=Object.keys(Re);return Object.keys(e).filter(n=>i.includes(n)).forEach(n=>{let s=Re[n];s&&e[n]!==void 0&&(r[`gpxx:${s}`]=e[n])}),r}buildExtensions(e){let t=this.buildExtensionContent(e);return t?`<extensions>${t}</extensions>`:""}buildExtensionContent(e){return Object.entries(e).filter(([t])=>!t.startsWith("xmlns")).map(([t,r])=>{if(r&&typeof r=="object"){let i=this.buildExtensionContent(r);return`<${t}>${i}</${t}>`}else if(r!=null)return`<${t}>${this.escapeXML(String(r))}</${t}>`;return""}).filter(t=>t).join("")}buildLink(e){let t=[`<link href="${this.escapeXMLAttribute(e.href||"")}">`];return this.addOptionalElement(t,"text",e.text),this.addOptionalElement(t,"type",e.type),t.push("</link>"),t.join("")}addLinks(e,t){(Array.isArray(t)?t:[t]).forEach(i=>{e.push(this.buildLink(i))})}buildTimeElement(e){return typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z?$/.test(e)?`<time>${e}</time>`:`<time>${(0,Le.default)(e).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}</time>`}addOptionalElement(e,t,r,i){if(r!=null&&r!==""){let n=i?i(r):this.escapeXML(r);e.push(`<${t}>${n}</${t}>`)}}isValidCoordinate(e,t){return e!=null&&t!==void 0&&t!==null&&!isNaN(e)&&!isNaN(t)}formatCoordinate(e){return this.roundTo(e,6).toString()}roundTo(e,t){let r=Math.pow(10,t);return Math.round(e*r)/r}escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}escapeXMLAttribute(e){return typeof e!="string"?String(e||""):e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r/g,"&#13;").replace(/\n/g,"&#10;").replace(/\t/g,"&#9;")}deepClone(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map(r=>this.deepClone(r));let t={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=this.deepClone(e[r]));return t}encoder(e){return this.encode(e)}};var _e=class extends j{constructor(){super(...arguments);this.name="performance-middleware";this.description="Monitor parsing performance"}async onTokenize(t,r){return t}async onAstGenerate(t,r){let i=this.countNodes(t);return t}async onComplete(t,r){let i=r.metadata.get("performance");return t}countNodes(t){let r=1;if(t.children)for(let i of t.children)r+=this.countNodes(i);return r}},Me=class extends j{constructor(){super(...arguments);this.name="validation-middleware";this.description="Validate GPX data integrity"}async onComplete(t,r){let i=this.validateGPX(t);return i.length>0&&r.metadata.set("validation-errors",i),t}validateGPX(t){let r=[];if(t.version||r.push("Missing GPX version information"),t.creator||r.push("Missing GPX creator information"),t.trk){for(let i of t.trk)if(i.trkseg){for(let n of i.trkseg)if(n.trkpt)for(let s of n.trkpt)s.time&&r.push("Invalid track point time")}}return r}};async function Oe(c){let e=[new _e,new Me];for(let t of e)await c.registerMiddleware(t)}var T=class extends P{parseHeartRate(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>0&&t<300?t:void 0}parseTCXTime(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}parseDistance(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>0?t:void 0}parseSpeed(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>=0?t:void 0}parseAltitude(e){return this.parseFloat(e)}parseCoordinate(e){let t=this.parseFloat(e);return t!==0?t:void 0}};var ge=class extends T{constructor(){super(...arguments);this.name="PositionConverter";this.supportedTags=["Position"]}convert(t,r){let i={};return this.processChildren(t,i,{LatitudeDegrees:(n,s)=>s.LatitudeDegrees=this.parseString(n.value),LongitudeDegrees:(n,s)=>s.LongitudeDegrees=this.parseString(n.value)}),i}},ye=class extends T{constructor(){super(...arguments);this.name="TrackpointConverter";this.supportedTags=["Trackpoint"]}convert(t,r){let i={};return this.processChildren(t,i,{Time:(n,s)=>s.Time=this.parseString(n.value),Position:(n,s)=>{var a;let o=r.metadata.get("decoder");s.Position=(a=o==null?void 0:o.getConverter("Position"))==null?void 0:a.convert(n,r)},AltitudeMeters:(n,s)=>s.AltitudeMeters=this.parseFloat(n.value),DistanceMeters:(n,s)=>s.DistanceMeters=this.parseFloat(n.value),HeartRateBpm:(n,s)=>{if(n.value)s.HeartRateBpm=this.parseFloat(n.value);else{let o=this.getChildByTag(n,"Value");o!=null&&o.value&&(s.HeartRateBpm=this.parseFloat(o.value))}},Cadence:(n,s)=>{let o={Low:0,High:0};this.processChildren(n,o,{Low:(a,p)=>p.Low=this.parseFloat(a.value)||0,High:(a,p)=>p.High=this.parseFloat(a.value)||0}),s.Cadence=o},SensorState:(n,s)=>s.SensorState=n.value,Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}},he=class extends T{constructor(){super(...arguments);this.name="TrackConverter";this.supportedTags=["Track"]}convert(t,r){let i={Trackpoint:[]};return this.processChildren(t,i,{Trackpoint:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Trackpoint"))==null?void 0:p.convert(n,r);a&&s.Trackpoint&&s.Trackpoint.push(a)}}),i}},ve=class extends T{constructor(){super(...arguments);this.name="ActivityLapConverter";this.supportedTags=["Lap"]}convert(t,r){let i={};return this.extractAttributes(t,i,{StartTime:"Id"}),this.processChildren(t,i,{TotalTimeSeconds:(n,s)=>s.TotalTimeSeconds=this.parseFloat(n.value),DistanceMeters:(n,s)=>s.DistanceMeters=this.parseFloat(n.value),MaximumSpeed:(n,s)=>s.MaximumSpeed=this.parseFloat(n.value),Calories:(n,s)=>s.Calories=this.parseFloat(n.value),AverageHeartRateBpm:(n,s)=>s.AverageHeartRateBpm=this.parseFloat(n.value),MaximumHeartRateBpm:(n,s)=>s.MaximumHeartRateBpm=this.parseFloat(n.value),Intensity:(n,s)=>s.Intensity=n.value,TriggerMethod:(n,s)=>s.TriggerMethod=n.value,Track:(n,s)=>{var p;s.Track||(s.Track=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Track"))==null?void 0:p.convert(n,r);a&&s.Track.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value),Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}},xe=class extends T{constructor(){super(...arguments);this.name="ActivityConverter";this.supportedTags=["Activity"]}convert(t,r){let i={Id:"",Lap:[]};return this.extractAttributes(t,i,{Activity:"Activity"}),this.processChildren(t,i,{Id:(n,s)=>s.Id=this.parseString(n.value),Lap:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Lap"))==null?void 0:p.convert(n,r);a&&s.Lap.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value),Training:(n,s)=>s.Training=this.convertTraining(n),Creator:(n,s)=>s.Creator=this.convertCreator(n),Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}convertTraining(t){var i;let r={};return t.attributes&&Object.entries(t.attributes).forEach(([n,s])=>{r[n]=s}),(i=t.children)==null||i.forEach(n=>{r[n.tag]=this.convertExtensionContent(n)}),r}convertCreator(t){var i;let r={};return(i=t.children)==null||i.forEach(n=>{r[n.tag]=this.convertExtensionContent(n)}),r}},Ce=class extends T{constructor(){super(...arguments);this.name="ActivityListConverter";this.supportedTags=["Activities"]}convert(t,r){let i={Activity:[],MultiActivitySession:[]};return this.processChildren(t,i,{Activity:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Activity"))==null?void 0:p.convert(n,r);a&&s.Activity&&s.Activity.push(a)},MultiActivitySession:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("MultiActivitySession"))==null?void 0:p.convert(n,r);a&&s.MultiActivitySession&&s.MultiActivitySession.push(a)}}),i}},Pe=class extends T{constructor(){super(...arguments);this.name="MultiActivitySessionConverter";this.supportedTags=["MultiActivitySession"]}convert(t,r){let i={};return this.processChildren(t,i,{Id:(n,s)=>s.Id=this.parseString(n.value),FirstActivity:(n,s)=>{var a;let o=r.metadata.get("decoder");s.FirstActivity=(a=o==null?void 0:o.getConverter("FirstActivity"))==null?void 0:a.convert(n,r)},NextActivity:(n,s)=>{var p;s.NextActivity||(s.NextActivity=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("NextActivity"))==null?void 0:p.convert(n,r);a&&s.NextActivity.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value)}),i}},we=class extends T{constructor(){super(...arguments);this.name="AbstractSourceConverter";this.supportedTags=["Author","Creator"]}convert(t,r){let i={};return this.processChildren(t,i,{Name:(n,s)=>s.Name=this.parseString(n.value)}),i}},Ee=class extends T{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["Extensions"]}convert(t,r){let i={};return this.flattenExtensionElement(t,i),i}flattenExtensionElement(t,r){var i,n;if(!((i=t.children)!=null&&i.length)&&t.value!==void 0){r[t.tag]=this.parseExtensionValue(t.value);return}(n=t.children)!=null&&n.length&&t.children.forEach(s=>{this.flattenExtensionElement(s,r)})}parseExtensionValue(t){if(t===void 0)return;let r=String(t),i=parseFloat(r);return!isNaN(i)&&isFinite(i)?i:r}};var $e=require("htmlparser2"),Ae=class{static tokenizeXML(e){let t=[],r=new $e.Parser({onopentag(i,n){t.push({type:"open",tag:i,attributes:n})},ontext(i){let n=i.replace(/\n/g,"").trim();n&&t.push({type:"text",tag:"text",value:n})},onclosetag(i){t.push({type:"close",tag:i})}},{xmlMode:!0});return r.write(e),r.end(),t}static compressXML(e){return e.replace(/>\s+</g,"><").replace(/\s+/g," ").trim()}static formatXML(e,t=2){let r=" ".repeat(t),i="",n=0,s=!1;for(let o=0;o<e.length;o++){let a=e[o],p=e[o+1];a==="<"?(p==="/"?(n--,s||(i+=`
12
12
  `+r.repeat(n))):p!=="?"&&p!=="!"&&(s||(i+=`
13
- `+r.repeat(n)),n++),s=!0):a===">"&&(s=!1,p==="<"&&e[o+2]==="/"&&n--),i+=a}return i.trim()}static validateXML(e){try{let t=new $e.Parser({},{xmlMode:!0});return t.write(e),t.end(),{isValid:!0}}catch(t){return{isValid:!1,error:t.message}}}static extractXMLDeclaration(e){let t=e.match(/<\?xml\s+([^>]+)\?>/);if(!t)return{};let r=t[1],i={},n=r.match(/version=["']([^"']+)["']/);n&&(i.version=n[1]);let s=r.match(/encoding=["']([^"']+)["']/);s&&(i.encoding=s[1]);let o=r.match(/standalone=["']([^"']+)["']/);return o&&(i.standalone=o[1]),i}static escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}static unescapeXML(e){return e.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&amp;/g,"&")}};var be=class{constructor(){this.stage="tokenize";this.name="tokenize-processor"}async process(e){if(!e.xmlContent)throw new Error("TCX data cannot be empty");let t=Ae.tokenizeXML(e.xmlContent);if(t.length===0)throw new Error("Not a valid TCX file");return e.tokens=t,e.stats.processedTokens=t.length,e}},Ie=class{constructor(){this.stage="ast-generate";this.name="ast-generate-processor"}async process(e){var s;let t=Date.now();if(!e.tokens)throw new Error("Tokens cannot be empty");let r=[],i,n=null;for(let o of e.tokens)if(o.type==="open"){let a={tag:o.tag,attributes:o.attributes||{},children:[]};i?n&&((s=n.children)==null||s.push(a)):i=a,r.push(a),n=a}else o.type==="text"&&n?n.value=o.value:o.type==="close"&&(r.pop(),n=r[r.length-1]||null);return e.ast=i,e.performance.astTime=Date.now()-t,e}},ke=class{constructor(e){this.getConverter=e;this.stage="convert";this.name="convert-processor"}async process(e){if(!e.ast)throw new Error("AST is empty, cannot convert");let t=this.findTCXRoot(e.ast);if(!t)throw new Error("Not a valid TCX file: TrainingCenterDatabase element not found");let r=this.convertAST(t,e);return e.result=r,e.stats.convertedElements=this.countElements(e.ast),e}findTCXRoot(e){if(e.tag==="TrainingCenterDatabase")return e;if(e.children)for(let t of e.children){let r=this.findTCXRoot(t);if(r)return r}}convertAST(e,t){let r=this.getConverter(e.tag);return r?r.convert(e,t):this.genericConvert(e,t)}genericConvert(e,t){let r={};if(e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{r[i]=n}),e.value!==void 0)if(e.children&&e.children.length>0)r._value=e.value;else return e.value;return e.children&&e.children.forEach(i=>{let n=this.convertAST(i,t);r[i.tag]?(Array.isArray(r[i.tag])||(r[i.tag]=[r[i.tag]]),r[i.tag].push(n)):r[i.tag]=n}),r}countElements(e){let t=1;if(e.children)for(let r of e.children)t+=this.countElements(r);return t}},Fe=class{constructor(){this.stage="complete";this.name="complete-processor"}async process(e){if(!e.result)throw new Error("No conversion result found");let t=Date.now(),r=t-e.performance.startTime;return e.performance.endTime=t,e.performance.processingTime=r,e.metadata.set("performance",{processingTime:r,processedTokens:e.stats.processedTokens,convertedElements:e.stats.convertedElements}),e}};var S=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultConvertersRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new be,new Ie,new ke(e=>this.getConverter(e)),new Fe]}async registerDefaultConverters(){var t;if(this.defaultConvertersRegistered)return;let e=[new ge,new ye,new he,new ve,new xe,new Ce,new Pe,new we,new Ee];for(let r of e)(t=r.supportedTags)==null||t.forEach(i=>{this.addConverterForTag(i,r)}),this.registeredPlugins.add(r.name);this.defaultConvertersRegistered=!0}addConverterForTag(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}async registerConverter(e){var r,n;if(this.registeredPlugins.has(e.name))throw new Error(`Converter plugin ${e.name} already exists`);(r=e.supportedTags)==null||r.forEach(s=>{this.addConverterForTag(s,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";(n=e.supportedTags)==null||n.forEach(s=>{let a=(this.converterPlugins.get(s)||[]).map(p=>`${p.name}(${p.priority||100})`)})}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:this.middlewarePlugins.push(e);let r=[];e.onTokenize&&r.push("onTokenize"),e.onAstGenerate&&r.push("onAstGenerate"),e.onConvert&&r.push("onConvert"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getAllConverters(e){return this.converterPlugins.get(e)||[]}unregisterConverter(e){let t;for(let[r,i]of this.converterPlugins){let n=i.findIndex(s=>s.name===e);n!==-1&&(t=i[n],i.splice(n,1),i.length===0&&this.converterPlugins.delete(r))}t&&this.registeredPlugins.delete(e)}unregisterMiddleware(e){let t=this.middlewarePlugins.findIndex(r=>r.name===e);t!==-1&&this.middlewarePlugins.splice(t,1)}async initialize(){var r;if(this.initialized)return;await this.registerDefaultConverters();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parseByBuffer(e){var r;await this.initialize();let t=this.createContext();t.rawData=e,t.xmlContent=e.toString("utf-8"),t.metadata.set("decoder",this);try{for(let i of this.processors)try{switch(t=await i.process(t),i.stage){case"tokenize":t.tokens&&(t.tokens=await this.executeMiddlewareHook("onTokenize",t.tokens,t));break;case"ast-generate":t.ast&&(t.ast=await this.executeMiddlewareHook("onAstGenerate",t.ast,t));break;case"convert":t.result&&(t.result=await this.executeMiddlewareHook("onConvert",t.result,t));break;case"complete":t.result&&(t.result=await this.executeMiddlewareHook("onComplete",t.result,t));break}}catch(n){t.errors.push(n);for(let s of this.middlewarePlugins)await((r=s.onError)==null?void 0:r.call(s,n,t))}return t.result}catch(i){throw i}}convertExtensions(e){var s,o;let t={},{attributes:r,tag:i,value:n}=e;if(r&&Object.entries(r).forEach(([a,p])=>{t[a]=p}),(s=e==null?void 0:e.children)!=null&&s.length)(o=e.children)==null||o.forEach(a=>{t[a.tag]=this.convertExtensions(a)});else if(n!==void 0)return n;return t}async parserByBuffer(e){return this.parseByBuffer(e)}async parseByString(e){let t=Buffer.from(e,"utf-8");return this.parseByBuffer(t)}};var Ge=g(require("dayjs")),Je=g(require("dayjs/plugin/utc.js"));Ge.default.extend(Je.default);var D=class{constructor(e={}){this.compact=e.compact??!0}async encode(e){let t=this.buildTCXXML(e);return Buffer.from(t,"utf-8")}encodeToString(e){return this.buildTCXXML(e)}buildTCXXML(e){let t=this.buildXMLHeader(e),r=this.buildTCXContent(e),n=`${t}${r}
13
+ `+r.repeat(n)),n++),s=!0):a===">"&&(s=!1,p==="<"&&e[o+2]==="/"&&n--),i+=a}return i.trim()}static validateXML(e){try{let t=new $e.Parser({},{xmlMode:!0});return t.write(e),t.end(),{isValid:!0}}catch(t){return{isValid:!1,error:t.message}}}static extractXMLDeclaration(e){let t=e.match(/<\?xml\s+([^>]+)\?>/);if(!t)return{};let r=t[1],i={},n=r.match(/version=["']([^"']+)["']/);n&&(i.version=n[1]);let s=r.match(/encoding=["']([^"']+)["']/);s&&(i.encoding=s[1]);let o=r.match(/standalone=["']([^"']+)["']/);return o&&(i.standalone=o[1]),i}static escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}static unescapeXML(e){return e.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&amp;/g,"&")}};var be=class{constructor(){this.stage="tokenize";this.name="tokenize-processor"}async process(e){if(!e.xmlContent)throw new Error("TCX data cannot be empty");let t=Ae.tokenizeXML(e.xmlContent);if(t.length===0)throw new Error("Not a valid TCX file");return e.tokens=t,e.stats.processedTokens=t.length,e}},Ie=class{constructor(){this.stage="ast-generate";this.name="ast-generate-processor"}async process(e){var s;let t=Date.now();if(!e.tokens)throw new Error("Tokens cannot be empty");let r=[],i,n=null;for(let o of e.tokens)if(o.type==="open"){let a={tag:o.tag,attributes:o.attributes||{},children:[]};i?n&&((s=n.children)==null||s.push(a)):i=a,r.push(a),n=a}else o.type==="text"&&n?n.value=o.value:o.type==="close"&&(r.pop(),n=r[r.length-1]||null);return e.ast=i,e.performance.astTime=Date.now()-t,e}},ke=class{constructor(e){this.getConverter=e;this.stage="convert";this.name="convert-processor"}async process(e){if(!e.ast)throw new Error("AST is empty, cannot convert");let t=this.findTCXRoot(e.ast);if(!t)throw new Error("Not a valid TCX file: TrainingCenterDatabase element not found");let r=this.convertAST(t,e);return e.result=r,e.stats.convertedElements=this.countElements(e.ast),e}findTCXRoot(e){if(e.tag==="TrainingCenterDatabase")return e;if(e.children)for(let t of e.children){let r=this.findTCXRoot(t);if(r)return r}}convertAST(e,t){let r=this.getConverter(e.tag);return r?r.convert(e,t):this.genericConvert(e,t)}genericConvert(e,t){let r={};if(e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{r[i]=n}),e.value!==void 0)if(e.children&&e.children.length>0)r._value=e.value;else return e.value;return e.children&&e.children.forEach(i=>{let n=this.convertAST(i,t);r[i.tag]?(Array.isArray(r[i.tag])||(r[i.tag]=[r[i.tag]]),r[i.tag].push(n)):r[i.tag]=n}),r}countElements(e){let t=1;if(e.children)for(let r of e.children)t+=this.countElements(r);return t}},Fe=class{constructor(){this.stage="complete";this.name="complete-processor"}async process(e){if(!e.result)throw new Error("No conversion result found");let t=Date.now(),r=t-e.performance.startTime;return e.performance.endTime=t,e.performance.processingTime=r,e.metadata.set("performance",{processingTime:r,processedTokens:e.stats.processedTokens,convertedElements:e.stats.convertedElements}),e}};var k=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultConvertersRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new be,new Ie,new ke(e=>this.getConverter(e)),new Fe]}async registerDefaultConverters(){var t;if(this.defaultConvertersRegistered)return;let e=[new ge,new ye,new he,new ve,new xe,new Ce,new Pe,new we,new Ee];for(let r of e)(t=r.supportedTags)==null||t.forEach(i=>{this.addConverterForTag(i,r)}),this.registeredPlugins.add(r.name);this.defaultConvertersRegistered=!0}addConverterForTag(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}async registerConverter(e){var r,n;if(this.registeredPlugins.has(e.name))throw new Error(`Converter plugin ${e.name} already exists`);(r=e.supportedTags)==null||r.forEach(s=>{this.addConverterForTag(s,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";(n=e.supportedTags)==null||n.forEach(s=>{let a=(this.converterPlugins.get(s)||[]).map(p=>`${p.name}(${p.priority||100})`)})}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:this.middlewarePlugins.push(e);let r=[];e.onTokenize&&r.push("onTokenize"),e.onAstGenerate&&r.push("onAstGenerate"),e.onConvert&&r.push("onConvert"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getAllConverters(e){return this.converterPlugins.get(e)||[]}unregisterConverter(e){let t;for(let[r,i]of this.converterPlugins){let n=i.findIndex(s=>s.name===e);n!==-1&&(t=i[n],i.splice(n,1),i.length===0&&this.converterPlugins.delete(r))}t&&this.registeredPlugins.delete(e)}unregisterMiddleware(e){let t=this.middlewarePlugins.findIndex(r=>r.name===e);t!==-1&&this.middlewarePlugins.splice(t,1)}async initialize(){var r;if(this.initialized)return;await this.registerDefaultConverters();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parseByBuffer(e){var r;await this.initialize();let t=this.createContext();t.rawData=e,t.xmlContent=e.toString("utf-8"),t.metadata.set("decoder",this);try{for(let i of this.processors)try{switch(t=await i.process(t),i.stage){case"tokenize":t.tokens&&(t.tokens=await this.executeMiddlewareHook("onTokenize",t.tokens,t));break;case"ast-generate":t.ast&&(t.ast=await this.executeMiddlewareHook("onAstGenerate",t.ast,t));break;case"convert":t.result&&(t.result=await this.executeMiddlewareHook("onConvert",t.result,t));break;case"complete":t.result&&(t.result=await this.executeMiddlewareHook("onComplete",t.result,t));break}}catch(n){t.errors.push(n);for(let s of this.middlewarePlugins)await((r=s.onError)==null?void 0:r.call(s,n,t))}return t.result}catch(i){throw i}}convertExtensions(e){var s,o;let t={},{attributes:r,tag:i,value:n}=e;if(r&&Object.entries(r).forEach(([a,p])=>{t[a]=p}),(s=e==null?void 0:e.children)!=null&&s.length)(o=e.children)==null||o.forEach(a=>{t[a.tag]=this.convertExtensions(a)});else if(n!==void 0)return n;return t}async parserByBuffer(e){return this.parseByBuffer(e)}async parseByString(e){let t=Buffer.from(e,"utf-8");return this.parseByBuffer(t)}};var Ge=f(require("dayjs")),Je=f(require("dayjs/plugin/utc.js"));Ge.default.extend(Je.default);var F=class{constructor(e={}){this.compact=e.compact??!0}async encode(e){let t=this.buildTCXXML(e);return Buffer.from(t,"utf-8")}encodeToString(e){return this.buildTCXXML(e)}buildTCXXML(e){let t=this.buildXMLHeader(e),r=this.buildTCXContent(e),n=`${t}${r}
14
14
  </TrainingCenterDatabase>`;return this.compact?this.compressXML(n):n}compressXML(e){return e.replace(/>\s+</g,"><").replace(/^\s+|\s+$/gm,"").replace(/\s+/g," ").trim()}buildXMLHeader(e){let t=e.version||"1.0",r=e.creator||"trackswap",i=e.xmlns||"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2",n=e["xmlns:xsi"]||"http://www.w3.org/2001/XMLSchema-instance",s=e["xsi:schemaLocation"]||"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www8.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd";return['<?xml version="1.0" encoding="UTF-8"?>',`<TrainingCenterDatabase version="${this.escapeXMLAttribute(t)}"`,` creator="${this.escapeXMLAttribute(r)}"`,` xmlns="${this.escapeXMLAttribute(i)}"`,` xmlns:xsi="${this.escapeXMLAttribute(n)}"`,` xsi:schemaLocation="${this.escapeXMLAttribute(s)}">`].join(`
15
15
  `)}buildTCXContent(e){let t=[];return e.Folders&&t.push(this.buildFolders(e.Folders)),e.Activities&&t.push(this.buildActivities(e.Activities)),e.Workouts&&t.push(this.buildWorkouts(e.Workouts)),e.Courses&&t.push(this.buildCourses(e.Courses)),e.Author&&t.push(this.buildAuthor(e.Author)),e.Extensions&&t.push(this.buildExtensions(e.Extensions)),t.join(`
16
16
  `)}buildFolders(e){let t=["<Folders>"];return e.History&&t.push(this.buildHistory(e.History)),e.Workouts&&t.push(this.buildWorkouts(e.Workouts)),e.Courses,t.push("</Folders>"),t.join(`
@@ -19,8 +19,8 @@
19
19
  `)}buildActivity(e){let r=[`<Activity Activity="${e.Activity||"Other"}">`];return r.push(`<Id>${this.formatTime(e.Id)}</Id>`),e.Lap&&e.Lap.length>0&&e.Lap.forEach(i=>{r.push(this.buildActivityLap(i))}),this.addOptionalElement(r,"Notes",e.Notes),e.Training,e.Creator,e.Extensions&&r.push(this.buildExtensions(e.Extensions)),r.push("</Activity>"),r.join(`
20
20
  `)}buildActivityLap(e){let t=["<Lap>"];return this.addOptionalNumericElement(t,"TotalTimeSeconds",e.TotalTimeSeconds),this.addOptionalNumericElement(t,"DistanceMeters",e.DistanceMeters),this.addOptionalNumericElement(t,"MaximumSpeed",e.MaximumSpeed),this.addOptionalNumericElement(t,"Calories",e.Calories),e.AverageHeartRateBpm&&t.push(`<AverageHeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"><Value>${e.AverageHeartRateBpm}</Value></AverageHeartRateBpm>`),e.MaximumHeartRateBpm&&t.push(`<MaximumHeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"><Value>${e.MaximumHeartRateBpm}</Value></MaximumHeartRateBpm>`),this.addOptionalElement(t,"Intensity",e.Intensity),e.Cadence&&t.push(this.buildCadence(e.Cadence)),this.addOptionalElement(t,"TriggerMethod",e.TriggerMethod),e.Track&&e.Track.forEach(r=>{t.push(this.buildTrack(r))}),this.addOptionalElement(t,"Notes",e.Notes),e.Extensions&&t.push(this.buildExtensions(e.Extensions)),t.push("</Lap>"),t.join(`
21
21
  `)}buildTrack(e){let t=["<Track>"];return e.Trackpoint&&e.Trackpoint.forEach(r=>{t.push(this.buildTrackpoint(r))}),t.push("</Track>"),t.join(`
22
- `)}buildTrackpoint(e){let t=["<Trackpoint>"];return e.Time&&t.push(`<Time>${this.formatTime(e.Time)}</Time>`),e.Position&&t.push(this.buildPosition(e.Position)),this.addOptionalNumericElement(t,"AltitudeMeters",e.AltitudeMeters),this.addOptionalNumericElement(t,"DistanceMeters",e.DistanceMeters),e.HeartRateBpm&&t.push(`<HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"><Value>${e.HeartRateBpm}</Value></HeartRateBpm>`),e.Cadence&&t.push(this.buildCadence(e.Cadence)),this.addOptionalElement(t,"SensorState",e.SensorState),e.Extensions&&t.push(this.buildExtensions(e.Extensions)),t.push("</Trackpoint>"),t.join(`
23
- `)}buildPosition(e){let t=["<Position>"];return e.LatitudeDegrees&&t.push(`<LatitudeDegrees>${this.formatCoordinate(parseFloat(e.LatitudeDegrees))}</LatitudeDegrees>`),e.LongitudeDegrees&&t.push(`<LongitudeDegrees>${this.formatCoordinate(parseFloat(e.LongitudeDegrees))}</LongitudeDegrees>`),t.push("</Position>"),t.join("")}buildCadence(e){return`<Cadence><Low>${e.Low}</Low><High>${e.High}</High></Cadence>`}buildMultiActivitySession(e){let t=["<MultiActivitySession>"];return e.Id&&t.push(`<Id>${this.formatTime(e.Id)}</Id>`),e.FirstActivity&&t.push(this.buildFirstActivity(e.FirstActivity)),e.NextActivity&&e.NextActivity.forEach(r=>{t.push(this.buildNextActivity(r))}),this.addOptionalElement(t,"Notes",e.Notes),t.push("</MultiActivitySession>"),t.join(`
22
+ `)}buildTrackpoint(e){let t=["<Trackpoint>"];return e.Time?(t.push(`<Time>${this.formatTime(e.Time)}</Time>`),e.Position&&t.push(this.buildPosition(e.Position)),this.addOptionalNumericElement(t,"AltitudeMeters",e.AltitudeMeters),this.addOptionalNumericElement(t,"DistanceMeters",e.DistanceMeters),e.HeartRateBpm&&t.push(`<HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"><Value>${e.HeartRateBpm}</Value></HeartRateBpm>`),e.Cadence&&t.push(this.buildCadence(e.Cadence)),this.addOptionalElement(t,"SensorState",e.SensorState),e.Extensions&&t.push(this.buildExtensions(e.Extensions)),t.push("</Trackpoint>"),t.join(`
23
+ `)):""}buildPosition(e){let t=["<Position>"];return e!=null&&e.LatitudeDegrees&&t.push(`<LatitudeDegrees>${this.formatCoordinate(parseFloat(e.LatitudeDegrees))}</LatitudeDegrees>`),e!=null&&e.LongitudeDegrees&&t.push(`<LongitudeDegrees>${this.formatCoordinate(parseFloat(e.LongitudeDegrees))}</LongitudeDegrees>`),t.push("</Position>"),t.join("")}buildCadence(e){return`<Cadence><Low>${e.Low}</Low><High>${e.High}</High></Cadence>`}buildMultiActivitySession(e){let t=["<MultiActivitySession>"];return e.Id&&t.push(`<Id>${this.formatTime(e.Id)}</Id>`),e.FirstActivity&&t.push(this.buildFirstActivity(e.FirstActivity)),e.NextActivity&&e.NextActivity.forEach(r=>{t.push(this.buildNextActivity(r))}),this.addOptionalElement(t,"Notes",e.Notes),t.push("</MultiActivitySession>"),t.join(`
24
24
  `)}buildFirstActivity(e){let t=["<FirstActivity>"];return e.Activity&&t.push(this.buildActivity(e.Activity)),t.push("</FirstActivity>"),t.join(`
25
25
  `)}buildNextActivity(e){let t=["<NextActivity>"];return e.Transition&&t.push(`<Transition>${this.buildActivityLap(e.Transition)}</Transition>`),e.Activity&&t.push(this.buildActivity(e.Activity)),t.push("</NextActivity>"),t.join(`
26
- `)}buildWorkouts(e){return"<Workouts></Workouts>"}buildCourses(e){return"<Courses></Courses>"}buildAuthor(e){let t=["<Author>"];return this.addOptionalElement(t,"Name",e.Name),t.push("</Author>"),t.join("")}buildExtensions(e){let t=this.buildExtensionContent(e);return t?`<Extensions>${t}</Extensions>`:""}buildExtensionContent(e){return Object.entries(e).filter(([t])=>!t.startsWith("xmlns")).map(([t,r])=>{if(r&&typeof r=="object"){let i=this.buildExtensionContent(r);return`<${t}>${i}</${t}>`}else if(r!=null)return`<${t}>${this.escapeXML(String(r))}</${t}>`;return""}).filter(t=>t).join("")}formatTime(e){return typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(e)?e:(0,Ge.default)(e).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}addOptionalElement(e,t,r,i){if(r!=null&&r!==""){let n=i?i(r):this.escapeXML(r);e.push(`<${t}>${n}</${t}>`)}}addOptionalNumericElement(e,t,r){r!=null&&!isNaN(r)&&e.push(`<${t}>${r}</${t}>`)}isValidCoordinate(e,t){return e!=null&&t!==void 0&&t!==null&&!isNaN(e)&&!isNaN(t)}formatCoordinate(e){return this.roundTo(e,6).toString()}roundTo(e,t){let r=Math.pow(10,t);return Math.round(e*r)/r}escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}escapeXMLAttribute(e){return typeof e!="string"?String(e||""):e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r/g,"&#13;").replace(/\n/g,"&#10;").replace(/\t/g,"&#9;")}deepClone(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map(r=>this.deepClone(r));let t={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=this.deepClone(e[r]));return t}encoder(e){return this.encode(e)}};var Qe=g(require("dayjs")),R=class extends P{convertPoints(e){return e.map(t=>this.convertPoint(t)).filter(t=>t!==void 0)}convertTime(e){if(!e)return;if(typeof e=="number")return e;let t=(0,Qe.default)(e);return t.isValid()?t.valueOf():void 0}},X=class{constructor(){this.version="1.0.0";this.priority=100}supports(e){return this.supportedTags.includes(e)}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}convertTimeToDate(e){return e?new Date(e):new Date}convertTimeToString(e){return this.convertTimeToDate(e).toISOString()}ensureValidCoordinates(e,t){return e>=-90&&e<=90&&t>=-180&&t<=180}round(e,t=6){let r=Math.pow(10,t);return Math.round(e*r)/r}},Be=class extends I{async onError(e,t){t.warnings.push(`Middleware ${this.name} error: ${e.message}`)}validateActivityFile(e){if(!e.metadata)return!1;if(e.routes){for(let t of e.routes)if(!this.validateRoute(t))return!1}if(e.points){for(let t of e.points)if(!this.validatePoint(t))return!1}if(e.activities){for(let t of e.activities)if(!this.validateActivity(t))return!1}return!0}validateActivity(e){return!!(e&&typeof e.index>"u"&&e.laps&&e.laps.length>0)}validateRoute(e){return!!(e.records&&e.records.length>0)}validatePoint(e){return!!(e.positionLat&&e.positionLong&&e.positionLat>=-90&&e.positionLat<=90&&e.positionLong>=-180&&e.positionLong<=180)}};var et={heartrate:"heartRate","gpxtpx:hr":"heartRate","ns3:hr":"heartRate","gpxdata:hr":"heartRate","gpxdata:cadence":"cadence","gpxtpx:cad":"cadence","ns3:cad":"cadence",cadence:"cadence","gpxtpx:speed":"speed","ns3:speed":"speed",speed:"speed",power:"power","gpxdata:power":"power","gpxpx:PowerInWatts":"power",PowerInWatts:"power","gpxtpx:temp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:atemp":"atemp","gpxx:Temperature":"temperature","gpxx:Depth":"depth"},y=c=>c*(180/Math.pow(2,31));var Ve=g(require("dayjs"));var He=g(require("dayjs")),tt=require("geolib"),L=class{calculateRecordsAggMetrics(e){if(!e||e.length===0)return;let t={records:this.preprocessRecords(e)},r=0;for(let i=0;i<t.records.length;i++){let n=t.records[i];if(!(!n.positionLat||!n.positionLong)){if(t!=null&&t.startPositionLat||(t.startPositionLat=n.positionLat),t!=null&&t.startPositionLong||(t.startPositionLong=n.positionLong),t.endPositionLat=n.positionLat,t.endPositionLong=n.positionLong,t.timestamp=n.timestamp,t!=null&&t.startTime||(t.startTime=n.timestamp),t.endTime=n.timestamp,n!=null&&n.distance?t.totalDistance=n.distance:i>0&&(r+=this.calculatePointDistance(e[i-1],n)||0,t.totalDistance=r),n!=null&&n.speed&&(t.avgSpeed=t.avgSpeed?(t.avgSpeed+n.speed)/2:n.speed,t.maxSpeed=Math.max(t.maxSpeed||0,n.speed)),n!=null&&n.heartRate&&(t.maxHeartRate=Math.max(t.maxHeartRate||0,n.heartRate),t.minHeartRate=Math.min(t.minHeartRate||n.heartRate,n.heartRate),t.avgHeartRate?t.avgHeartRate=(t.avgHeartRate+n.heartRate)/2:t.avgHeartRate=n.heartRate),n!=null&&n.altitude&&(t.maxAltitude=Math.max(t.maxAltitude||0,n.altitude),t.minAltitude=Math.min(t.minAltitude||n.altitude,n.altitude),t.avgAltitude=t.avgAltitude?(t.avgAltitude+n.altitude)/2:n.altitude,i>0&&e[i-1].altitude)){let s=this.calculateElevationChanges(e[i-1],n);t.totalAscent=(t.totalAscent||0)+s.ascent,t.totalDescent=(t.totalDescent||0)+s.descent}if(n!=null&&n.cadence&&(t.maxCadence=Math.max(t.maxCadence||0,n.cadence),t.avgCadence?t.avgCadence=(t.avgCadence+n.cadence)/2:t.avgCadence=n.cadence),n!=null&&n.power){t.maxPower=Math.max(t.maxPower||0,n.power),t.avgPower?t.avgPower=(t.avgPower+n.power)/2:t.avgPower=n.power;let s=this.calculateAccumulatedPower(i>0?e[i-1]:n,n,t.totalWork||0);t.totalWork=s.newAccumulatedWork,t.normalizedPower=void 0}n!=null&&n.temperature&&(t.avgTemperature?t.avgTemperature=(t.avgTemperature+n.temperature)/2:t.avgTemperature=n.temperature,t.maxTemperature=Math.max(t.maxTemperature||0,n.temperature),t.minTemperature=Math.min(t.minTemperature||n.temperature,n.temperature))}}return t}calculateLapAggMetrics(e){var r;if(!e||e.length===0)return;let t={laps:e,timestamp:((r=e[0])==null?void 0:r.timestamp)||new Date};for(let i=0;i<e.length;i++){let n=e[i];n.startPositionLat&&n.startPositionLong&&!(t!=null&&t.startPositionLat)&&!(t!=null&&t.startPositionLong)&&(t.startPositionLat=n.startPositionLat,t.startPositionLong=n.startPositionLong),n.endPositionLat&&n.endPositionLong&&(t.endPositionLat=n.endPositionLat,t.endPositionLong=n.endPositionLong),n.startTime&&!(t!=null&&t.startTime)&&(t.startTime=n.startTime),n.endTime&&(t.endTime=n.endTime),t.timestamp=n.timestamp||n.endTime||t.timestamp,n.totalDistance&&(t.totalDistance=(t.totalDistance||0)+n.totalDistance),n.totalElapsedTime&&(t.totalElapsedTime=(t.totalElapsedTime||0)+n.totalElapsedTime),n.maxSpeed&&(t.maxSpeed=Math.max(t.maxSpeed||0,n.maxSpeed)),n.avgSpeed&&(t.avgSpeed?t.avgSpeed=(t.avgSpeed+n.avgSpeed)/2:t.avgSpeed=n.avgSpeed),n.maxHeartRate&&(t.maxHeartRate=Math.max(t.maxHeartRate||0,n.maxHeartRate)),n.minHeartRate&&(t.minHeartRate=t.minHeartRate?Math.min(t.minHeartRate,n.minHeartRate):n.minHeartRate),n.avgHeartRate&&(t.avgHeartRate?t.avgHeartRate=(t.avgHeartRate+n.avgHeartRate)/2:t.avgHeartRate=n.avgHeartRate),n.maxAltitude&&(t.maxAltitude=Math.max(t.maxAltitude||0,n.maxAltitude)),n.minAltitude&&(t.minAltitude=t.minAltitude?Math.min(t.minAltitude,n.minAltitude):n.minAltitude),n.avgAltitude&&(t.avgAltitude?t.avgAltitude=(t.avgAltitude+n.avgAltitude)/2:t.avgAltitude=n.avgAltitude),n.totalAscent&&(t.totalAscent=(t.totalAscent||0)+n.totalAscent),n.totalDescent&&(t.totalDescent=(t.totalDescent||0)+n.totalDescent),n.maxCadence&&(t.maxCadence=Math.max(t.maxCadence||0,n.maxCadence)),n.avgCadence&&(t.avgCadence?t.avgCadence=(t.avgCadence+n.avgCadence)/2:t.avgCadence=n.avgCadence),n.maxPower&&(t.maxPower=Math.max(t.maxPower||0,n.maxPower)),n.avgPower&&(t.avgPower?t.avgPower=(t.avgPower+n.avgPower)/2:t.avgPower=n.avgPower),n.totalWork&&(t.totalWork=(t.totalWork||0)+n.totalWork),n.maxTemperature&&(t.maxTemperature=Math.max(t.maxTemperature||0,n.maxTemperature)),n.minTemperature&&(t.minTemperature=t.minTemperature?Math.min(t.minTemperature,n.minTemperature):n.minTemperature),n.avgTemperature&&(t.avgTemperature?t.avgTemperature=(t.avgTemperature+n.avgTemperature)/2:t.avgTemperature=n.avgTemperature)}return t}preprocessRecords(e){if(!e||e.length===0)return e;let t=e.filter(s=>s.timestamp).sort((s,o)=>s.timestamp.valueOf()-o.timestamp.valueOf()),r=0,i=[],n=null;for(let s=0;s<t.length;s++){let o=t[s],a={...o};if(!(!a.positionLat||!a.positionLong)){if(s>0&&n&&(o.distance||(a.distance=this.calculatePointDistance(n,a)||0),o.speed||(a.speed=this.calculateInstantSpeed(n,a,a.distance)),o.power)){let p=this.calculateAccumulatedPower(n,a,r);a.accumulatedPower=p.accumulatedPower,r=p.newAccumulatedWork}n=a,i.push(a)}}return i}calculatePointDistance(e,t){if(!e.positionLat||!e.positionLong||!t.positionLat||!t.positionLong)return 0;try{return(0,tt.getPreciseDistance)({latitude:e.positionLat,longitude:e.positionLong},{latitude:t.positionLat,longitude:t.positionLong})}catch{return 0}}calculateInstantSpeed(e,t,r){if(!e.timestamp||!t.timestamp||!r)return;let i=((0,He.default)(t.timestamp).valueOf()-(0,He.default)(e.timestamp).valueOf())/1e3;if(!(i<=0))return r/i}calculateAccumulatedPower(e,t,r){var a,p;if(e.power===void 0||t.power===void 0||!e.timestamp||!t.timestamp)return{accumulatedPower:r,newAccumulatedWork:r};let i=((a=t.timestamp)==null?void 0:a.valueOf())-((p=e.timestamp)==null?void 0:p.valueOf());if(i<=0)return{accumulatedPower:r,newAccumulatedWork:r};let s=(e.power+t.power)/2*i,o=r+s;return{accumulatedPower:o,newAccumulatedWork:o}}calculateElevationChanges(e,t){let r=0,i=0;return t.altitude!==void 0&&e.altitude!==void 0&&(t.altitude>e.altitude?r=t.altitude-e.altitude:t.altitude<=e.altitude&&(i=e.altitude-t.altitude)),{ascent:r,descent:i}}};function h(c,e=0){let t=Math.pow(10,e);return Math.round(c*t)/t}var M=class extends R{constructor(){super(...arguments);this.name="gpx-to-activity-converter";this.supportedTags=["gpx"];this.convertGPXExtensions=t=>{let r={};return Object.entries(t).forEach(([i,n])=>{if(typeof n<"u"&&n!=="undefined"){let s=et[i]||i;r[s]=this.autoNumber(n)}}),r}}convert(t,r){if(r.sourceFormat!=="gpx")return;let i=r.sourceData;return this.convertGPX(i)}convertGPX(t){let r={metadata:{originType:"GPX",fileType:"gpx"},activities:[]};return t.wpt&&(r.points=this.convertWpts2Points(t.wpt)),t.trk&&(r.activities=t.trk.map((i,n)=>this.convertTrk2Activity(i,n))),t.rte&&(r.routes=t.rte.map((i,n)=>this.convertTrackSeg2Lap(i,n))),r}convertPoint(t,r){let{extensions:i}=t,n=i?this.convertGPXExtensions(i):{};return{index:r||0,positionLat:t.lat,positionLong:t.lon,altitude:t.ele,heartRate:t==null?void 0:t.heartRate,speed:t==null?void 0:t.speed,power:t==null?void 0:t.power,cadence:t==null?void 0:t.cadence,timestamp:(0,Ve.default)(t.time).toDate(),...n}}convertTrk2Activity(t,r){var s;let i=((s=t.trkseg)==null?void 0:s.map((o,a)=>this.convertTrackSeg2Lap(o,a)))||[],n=new L().calculateLapAggMetrics(i);return{index:r,messageIndex:r,laps:i,...n}}convertTrackSeg2Lap(t,r){var a,p;let i=((p=(a=t.trkpt)==null?void 0:a.filter(d=>d!==void 0&&d.lat&&d.lon))==null?void 0:p.map((d,l)=>this.convertPoint(d,l)))||[],s=new L().calculateRecordsAggMetrics(i);return{index:r,messageIndex:r,...s,records:(s==null?void 0:s.records)||[]}}convertWpts2Points(t){let r=[];for(let i=0;i<t.length;i++){let n=t[i];if(n.lat!=null&&n.lon!=null){let s=this.convertPoint(n,i);s&&r.push(s)}}return r}autoNumber(t){return typeof t=="string"&&t.trim()!==""&&!isNaN(t)?Number(t):t}},O=class extends R{constructor(){super(...arguments);this.name="fit-to-activity-converter";this.supportedTags=["fit"]}convert(t,r){if(r.sourceFormat!=="fit")return;let i=r.sourceData;return this.convertFIT(i)}convertFIT(t){var i,n;let r={metadata:{originType:"FIT",fileType:"fit"},activities:[]};return(i=t.sessionMesgs)!=null&&i.length?r.activities=t.sessionMesgs.map((s,o)=>({index:o,...s,startPositionLat:s.startPositionLat?h(y(Number(s.startPositionLat)),6):void 0,startPositionLong:s.startPositionLong?h(y(Number(s.startPositionLong)),6):void 0,endPositionLat:s.endPositionLat?h(y(Number(s.endPositionLat)),6):void 0,endPositionLong:s.endPositionLong?h(y(Number(s.endPositionLong)),6):void 0,laps:this.convertFITLap2Trackseg(s==null?void 0:s.lapMesgs)})):(n=t.courseMesgs)!=null&&n.length&&(r.routes=t.courseMesgs.map((s,o)=>({index:o,...s,records:this.convertLap2Points(s==null?void 0:s.lapMesgs)}))),r}convertPoint(t,r){let{positionLong:i,positionLat:n,altitude:s,timestamp:o,heartRate:a,cadence:p,distance:d,power:l,enhancedAltitude:w,enhancedSpeed:u,speed:T,temperature:E,..._}=t;if(!(i==null||n==null))return{index:r||0,positionLat:h(y(Number(n)),6),positionLong:h(y(Number(i)),6),altitude:s||w,distance:d,speed:T||u,heartRate:a,power:l,cadence:p,temperature:E,timestamp:o,..._}}convertFITLap2Trackseg(t){var n;let r=[];if(!(t!=null&&t.length))return[];for(let s of t){let o=((n=s==null?void 0:s.recordMesgs)==null?void 0:n.map((a,p)=>this.convertPoint(a,p)).filter(a=>a!==void 0))||[];r.push({index:r.length,...s,startPositionLat:s.startPositionLat?h(y(Number(s.startPositionLat)),6):void 0,startPositionLong:s.startPositionLong?h(y(Number(s.startPositionLong)),6):void 0,endPositionLat:s.endPositionLat?h(y(Number(s.endPositionLat)),6):void 0,endPositionLong:s.endPositionLong?h(y(Number(s.endPositionLong)),6):void 0,records:o})}return r}convertLap2Points(t){var n;let r=[];if(!(t!=null&&t.length))return[];for(let s of t){let o=((n=s.recordMesgs)==null?void 0:n.map((a,p)=>this.convertPoint(a,p)).filter(a=>a!==void 0))||[];o.length&&(r=[...r,...o])}return r}},$=class extends R{constructor(){super(...arguments);this.name="tcx-to-activity-converter";this.supportedTags=["tcx"]}convert(t,r){if(r.sourceFormat!=="tcx")return;let i=r.sourceData;return this.convertTCX(i)}convertTCX(t){var i,n,s,o;let r={metadata:{originType:"TCX",fileType:"tcx"},activities:[]};return(n=(i=t.Activities)==null?void 0:i.Activity)!=null&&n.length&&(r.activities=t.Activities.Activity.map((a,p)=>this.convertTCXActivityToActivity(a,p))),(o=(s=t.Courses)==null?void 0:s.Course)!=null&&o.length,r}convertTCXActivityToActivity(t,r){var s;let i=((s=t.Lap)==null?void 0:s.map((o,a)=>this.convertTCXLap2Lap(o,a)))||[],n=new L().calculateLapAggMetrics(i);return{index:r,messageIndex:r,laps:i,...n}}convertTCXLap2Lap(t,r){var a;let i=((a=t==null?void 0:t.Track)==null?void 0:a.flatMap(p=>p.Trackpoint))||[],n=(i==null?void 0:i.filter(p=>{var d;return p!==void 0&&((d=p.Position)==null?void 0:d.LatitudeDegrees)!==void 0&&p.Position.LongitudeDegrees!==void 0&&p.Time!==void 0}).map((p,d)=>this.convertPoint(p,d)))||[],o=new L().calculateRecordsAggMetrics(n);return{index:r,messageIndex:r,...o,records:(o==null?void 0:o.records)||[]}}convertPoint(t,r){let{Position:i,Time:n,DistanceMeters:s,AltitudeMeters:o}=t;return{index:r||0,positionLat:Number(i.LatitudeDegrees),positionLong:Number(i.LongitudeDegrees),timestamp:(0,Ve.default)(n).toDate(),distance:s,altitude:o}}};var rt=g(require("dayjs"));var G=class extends X{constructor(){super(...arguments);this.name="activity-to-gpx-encoder";this.supportedTags=["gpx"]}encode(t,r){var s,o,a,p,d;if(r.targetFormat!=="gpx"||!((s=t==null?void 0:t.activities)!=null&&s.length))return;let n={version:"1.1",creator:"TrackSwap",metadata:{time:((o=t.activities)==null?void 0:o[0]).timestamp}};return(a=t.points)!=null&&a.length&&(n.wpt=this.convertRecords2Wpts(t.points)),(p=t.routes)!=null&&p.length&&(n.rte=t.routes.map(l=>this.convertRoute2GPXRoute(l))),(d=t.activities)!=null&&d.length&&(n.trk=t.activities.map(l=>this.convertActivity2GPXTrack(l))),n}convertRecords2Wpts(t){return t==null?void 0:t.filter(r=>typeof r.positionLat=="number"&&typeof r.positionLong=="number").map(r=>({lat:r.positionLat,lon:r.positionLong,ele:r==null?void 0:r.altitude,time:r==null?void 0:r.timestamp,speed:r==null?void 0:r.speed,hdop:r==null?void 0:r.hdop,vdop:r==null?void 0:r.vdop,pdop:r==null?void 0:r.pdop,extensions:this.extractGPXExtensions(r)}))}convertRoute2GPXRoute(t){return{rtept:t.records?this.convertRecords2Wpts(t.records):[]}}convertActivity2GPXTrack(t){var r;return{trkseg:((r=t.laps)==null?void 0:r.map(i=>({trkpt:i.records?this.convertRecords2Wpts(i.records):[]})))||[]}}extractGPXExtensions(t){let r={},i={};return typeof(t==null?void 0:t.heartRate)<"u"&&(i["gpxtpx:hr"]=t.heartRate),typeof(t==null?void 0:t.cadence)<"u"&&(i["gpxtpx:cad"]=t.cadence),typeof(t==null?void 0:t.temperature)<"u"&&(i["gpxtpx:atemp"]=t.temperature),Object.keys(i).length>0&&(r["gpxtpx:TrackPointExtension"]=i),typeof(t==null?void 0:t.power)<"u"&&(r["gpxpx:PowerExtension"]={"gpxpx:PowerInWatts":t.power}),Object.keys(r).length>0?r:void 0}},B=class extends X{constructor(){super(...arguments);this.name="activity-to-fit-encoder";this.supportedTags=["fit"]}encode(t,r){var n,s;if(r.targetFormat!=="fit"||!((n=t==null?void 0:t.activities)!=null&&n.length))return;let i={};return i.sessionMesgs=(s=t.activities)==null?void 0:s.map(o=>this.convertActivity2FITSession(o)),i}convertActivity2FITSession(t){var i;return{...t,event:(t==null?void 0:t.event)||"session",sport:(t==null?void 0:t.sport)||"generic",lapMesgs:((i=t.laps)==null?void 0:i.map(n=>this.convertLap2FITLap(n)))||[]}}convertLap2FITLap(t){var i;return{startTime:t.startTime,...t,recordMesgs:((i=t.records)==null?void 0:i.map(n=>this.convertPoint2FITRecord(n)))||[]}}convertPoint2FITRecord(t){return t}},H=class extends X{constructor(){super(...arguments);this.name="sport-to-tcx-encoder";this.supportedTags=["tcx"]}encode(t,r){var n;if(r.targetFormat!=="tcx"||!((n=t==null?void 0:t.activities)!=null&&n.length))return;let i={Author:{Name:"TrackSwap"}};return i.Activities={Activity:t.activities.map(s=>this.convertActivity2TCXActivity(s))},i}convertActivity2TCXActivity(t){var i;let r="Other";return(t.sport==="Running"||t.sport==="Biking")&&(r=t.sport),{Id:`Activity_${Date.now()}`,Activity:r,Lap:((i=t.laps)==null?void 0:i.map(n=>this.convertLap2TCXLap(n)))||[]}}convertLap2TCXLap(t){let r={TotalTimeSeconds:t.totalElapsedTime,DistanceMeters:t.totalDistance,MaximumSpeed:t.maxSpeed,Calories:t.totalCalories,AverageHeartRateBpm:t.avgHeartRate,MaximumHeartRateBpm:t.maxHeartRate,Intensity:"Active",TriggerMethod:"Manual",Track:t.records?[this.convertRecords2TCXTrack(t.records)]:[]};return(t.avgCadence!==void 0||t.maxCadence!==void 0)&&(r.Cadence={Low:t.avgCadence||0,High:t.maxCadence||0}),r}convertRecords2TCXTrack(t){return{Trackpoint:t.map(r=>this.convertPoint2TCXTrackpoint(r))}}convertPoint2TCXTrackpoint(t){var i,n;let r={Time:(0,rt.default)(t.timestamp).toISOString(),Position:{LatitudeDegrees:((i=t.positionLat)==null?void 0:i.toString())||"0",LongitudeDegrees:((n=t.positionLong)==null?void 0:n.toString())||"0"},AltitudeMeters:t.altitude,DistanceMeters:t.distance};return t.heartRate&&(r.HeartRateBpm=t.heartRate),t.cadence&&(r.Cadence={Low:t.cadence,High:t.cadence}),t.power&&(r.Extensions={"ns3:TPX":{"ns3:Watts":t.power}}),r}convertRoute2TCXCourse(t){return{Name:`Course_${Date.now()}`,Track:t.records?[this.convertRecords2TCXTrack(t.records)]:[]}}};var V=class{constructor(){this.converters=new Map;this.encoders=new Map;this.registerDefaultConverters(),this.registerDefaultEncoders()}registerDefaultConverters(){this.registerConverter(new M),this.registerConverter(new O),this.registerConverter(new $)}registerDefaultEncoders(){this.registerEncoder(new G),this.registerEncoder(new B),this.registerEncoder(new H)}registerConverter(e){this.converters.set(e.name,e)}registerEncoder(e){this.encoders.set(e.name,e)}async convertToActivity(e,t){let r={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},sourceFormat:t,sourceData:e,performance:{startTime:Date.now()}};try{let s=this.findConverter(t);if(!s)throw new Error(`No converter found for format "${t}"`);let o=Date.now(),a=s.convert(e,r);if(r.performance.convertTime=Date.now()-o,!a)throw new Error(`Converter "${s.name}" returned empty result`);let p=a;return r.result=p,r.performance.endTime=Date.now(),r.stats.endTime=Date.now(),p}catch(s){throw r.errors.push(s),s}}async encodeActivity(e,t){let r={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},targetFormat:t,performance:{startTime:Date.now()}};try{let i=this.findEncoder(t);if(!i)throw new Error(`No encoder found for format "${t}"`);let n=Date.now(),s=i.encode(e,r);if(r.performance.encodeTime=Date.now()-n,!s)throw new Error(`Encoder "${i.name}" returned empty result`);return r.result=s,r.performance.endTime=Date.now(),r.stats.endTime=Date.now(),s}catch(i){throw r.errors.push(i),i}}findConverter(e){return Array.from(this.converters.values()).find(t=>{var r;return(r=t.supportedTags)==null?void 0:r.includes(e)})}findEncoder(e){return Array.from(this.encoders.values()).find(t=>{var r;return(r=t.supportedTags)==null?void 0:r.includes(e)})}async destroy(){this.converters.clear(),this.encoders.clear()}};var z=class{constructor(){this.gpxDecoder=new k,this.gpxEncoder=new F,this.fitDecoder=new x,this.fitEncoder=new C,this.tcxDecoder=new S,this.tcxEncoder=new D,this.activityProcessor=new V}async parseGPX(e){try{return await this.gpxDecoder.parserByBuffer(e)}catch(t){throw new Error(`GPX parsing failed: ${t.message}`)}}async parseGPXString(e){let t=Buffer.from(e,"utf-8");return this.parseGPX(t)}async encodeGPX(e){try{return await this.gpxEncoder.encode(e)}catch(t){throw new Error(`GPX encoding failed: ${t.message}`)}}encodeGPXString(e){try{return this.gpxEncoder.encodeToString(e)}catch(t){throw new Error(`GPX encoding failed: ${t.message}`)}}async parseFIT(e){try{return await this.fitDecoder.parseByBuffer(e)}catch(t){throw new Error(`FIT parsing failed: ${t.message}`)}}async encodeFIT(e){try{return await this.fitEncoder.encode(e)}catch(t){throw new Error(`FIT encoding failed: ${t.message}`)}}async encodeFITCourse(e){try{return await this.fitEncoder.encodeCourse(e)}catch(t){throw new Error(`FIT Course encoding failed: ${t.message}`)}}async parseTCXString(e){let t=Buffer.from(e,"utf-8");return this.parseTCX(t)}async parseTCX(e){try{let t=await this.tcxDecoder.parseByBuffer(e);if(!t)throw new Error("TCX parsing result is empty");return t}catch(t){throw new Error(`TCX parsing failed: ${t.message}`)}}async encodeTCX(e){try{return await this.tcxEncoder.encode(e)}catch(t){throw new Error(`TCX encoding failed: ${t.message}`)}}async encodeTCXString(e){try{return await this.tcxEncoder.encodeToString(e)}catch(t){throw new Error(`TCX encoding failed: ${t.message}`)}}async convertGPXToActivity(e){return await this.activityProcessor.convertToActivity(e,"gpx")}async convertFITToActivity(e){return await this.activityProcessor.convertToActivity(e,"fit")}async convertTCXToActivity(e){return await this.activityProcessor.convertToActivity(e,"tcx")}async convertActivityToGPX(e){return await this.activityProcessor.encodeActivity(e,"gpx")}async convertActivityToFIT(e){return await this.activityProcessor.encodeActivity(e,"fit")}async convertActivityToTCX(e){return await this.activityProcessor.encodeActivity(e,"tcx")}async convertFile(e,t,r){try{let i=r||this.detectFormat(e);if(i==="unknown"||i==null)throw new Error("Unable to recognize source file format, please specify sourceType parameter");if(i===t)return e;let n;switch(i){case"gpx":let o=await this.parseGPX(e);if(!o)throw new Error("GPX file parsing failed");n=o;break;case"fit":n=await this.parseFIT(e);break;case"tcx":n=await this.parseTCX(e);break;default:throw new Error(`Unsupported source file format: ${i}`)}let s;switch(i){case"gpx":s=await this.convertGPXToActivity(n);break;case"fit":s=await this.convertFITToActivity(n);break;case"tcx":s=await this.convertTCXToActivity(n);break;default:throw new Error(`Unsupported source file format conversion: ${i}`)}switch(t){case"gpx":let o=await this.convertActivityToGPX(s);return await this.encodeGPX(o);case"fit":let a=await this.convertActivityToFIT(s);return await this.encodeFIT(a);case"tcx":let p=await this.convertActivityToTCX(s);return await this.encodeTCX(p);default:throw new Error(`Unsupported target file format: ${t}`)}}catch(i){let n=r||"auto-detect";throw new Error(`${n} to ${t.toUpperCase()} failed: ${i.message}`)}}detectFormat(e){let t=e.toString("utf-8",0,Math.min(1024,e.length));if(e.length>=12&&e.toString("ascii",8,12)===".FIT")return"fit";if(t.includes("<?xml")){if(t.includes("<gpx")||t.includes("http://www.topografix.com/GPX/"))return"gpx";if(t.includes("<TrainingCenterDatabase")||t.includes("http://www.garmin.com/xmlschemas/TrainingCenterDatabase/"))return"tcx"}return"unknown"}async parseFile(e,t){let r=t||this.detectFormat(e);if(r==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");switch(r){case"gpx":let i=await this.parseGPX(e);if(!i)throw new Error("GPX parsing failed");return i;case"fit":return await this.parseFIT(e);case"tcx":return await this.parseTCX(e);default:throw new Error(`Unsupported file format: ${r}`)}}async parseToActivity(e,t){let r=t||this.detectFormat(e);if(r==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");let i;switch(r){case"gpx":let n=await this.parseGPX(e);if(!n)throw new Error("GPX parsing failed");i=await this.convertGPXToActivity(n);break;case"fit":let s=await this.parseFIT(e);s&&(i=await this.convertFITToActivity(s));break;case"tcx":let o=await this.parseTCX(e);i=await this.convertTCXToActivity(o);break;default:throw new Error(`Unsupported file format: ${r}`)}return i}getActivityProcessor(){return this.activityProcessor}getGPXDecoder(){return this.gpxDecoder}getGPXEncoder(){return this.gpxEncoder}getFITDecoder(){return this.fitDecoder}getFITEncoder(){return this.fitEncoder}getTCXDecoder(){return this.tcxDecoder}getTCXEncoder(){return this.tcxEncoder}async destroy(){await this.gpxDecoder.destroy(),await this.fitDecoder.destroy(),await this.tcxDecoder.destroy(),await this.activityProcessor.destroy()}};var Pt=z;0&&(module.exports={ActivityProcessor,ActivityToFITEncoder,ActivityToGPXEncoder,ActivityToTCXEncoder,BaseActivityConverter,BaseActivityEncoder,BaseActivityMiddleware,FITDecoder,FITEncoder,FITToActivityConverter,GPXDecoder,GPXEncoder,GPXToActivityConverter,PipelineStage,TCXDecoder,TCXEncoder,TCXToActivityConverter,TrackSwap,registerDefaultMiddlewares});
26
+ `)}buildWorkouts(e){return"<Workouts></Workouts>"}buildCourses(e){return"<Courses></Courses>"}buildAuthor(e){let t=["<Author>"];return this.addOptionalElement(t,"Name",e.Name),t.push("</Author>"),t.join("")}buildExtensions(e){let t=this.buildExtensionContent(e);return t?`<Extensions>${t}</Extensions>`:""}buildExtensionContent(e){return Object.entries(e).filter(([t])=>!t.startsWith("xmlns")).map(([t,r])=>{if(r&&typeof r=="object"){let i=this.buildExtensionContent(r);return`<${t}>${i}</${t}>`}else if(r!=null)return`<${t}>${this.escapeXML(String(r))}</${t}>`;return""}).filter(t=>t).join("")}formatTime(e){return typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(e)?e:(0,Ge.default)(e).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}addOptionalElement(e,t,r,i){if(r!=null&&r!==""){let n=i?i(r):this.escapeXML(r);e.push(`<${t}>${n}</${t}>`)}}addOptionalNumericElement(e,t,r){r!=null&&!isNaN(r)&&e.push(`<${t}>${r}</${t}>`)}isValidCoordinate(e,t){return e!=null&&t!==void 0&&t!==null&&!isNaN(e)&&!isNaN(t)}formatCoordinate(e){return this.roundTo(e,6).toString()}roundTo(e,t){let r=Math.pow(10,t);return Math.round(e*r)/r}escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}escapeXMLAttribute(e){return typeof e!="string"?String(e||""):e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r/g,"&#13;").replace(/\n/g,"&#10;").replace(/\t/g,"&#9;")}deepClone(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map(r=>this.deepClone(r));let t={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=this.deepClone(e[r]));return t}encoder(e){return this.encode(e)}};var Qe=f(require("dayjs")),S=class extends P{convertPoints(e){return e.map(t=>this.convertPoint(t)).filter(t=>t!==void 0)}convertTime(e){if(!e)return;if(typeof e=="number")return e;let t=(0,Qe.default)(e);return t.isValid()?t.valueOf():void 0}},D=class{constructor(){this.version="1.0.0";this.priority=100}supports(e){return this.supportedTags.includes(e)}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}convertTimeToDate(e){return e?new Date(e):new Date}convertTimeToString(e){return this.convertTimeToDate(e).toISOString()}ensureValidCoordinates(e,t){return e>=-90&&e<=90&&t>=-180&&t<=180}round(e,t=6){let r=Math.pow(10,t);return Math.round(e*r)/r}},Be=class extends A{async onError(e,t){t.warnings.push(`Middleware ${this.name} error: ${e.message}`)}validateActivityFile(e){if(!e.metadata)return!1;if(e.routes){for(let t of e.routes)if(!this.validateRoute(t))return!1}if(e.points){for(let t of e.points)if(!this.validatePoint(t))return!1}if(e.activities){for(let t of e.activities)if(!this.validateActivity(t))return!1}return!0}validateActivity(e){return!!(e&&typeof e.index>"u"&&e.laps&&e.laps.length>0)}validateRoute(e){return!!(e.records&&e.records.length>0)}validatePoint(e){return!!e.timestamp}};var et={heartrate:"heartRate","gpxtpx:hr":"heartRate","ns3:hr":"heartRate","gpxdata:hr":"heartRate","gpxdata:cadence":"cadence","gpxtpx:cad":"cadence","ns3:cad":"cadence",cadence:"cadence","gpxtpx:speed":"speed","ns3:speed":"speed",speed:"speed",power:"power","gpxdata:power":"power","gpxpx:PowerInWatts":"power",PowerInWatts:"power","gpxtpx:temp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:atemp":"atemp","gpxx:Temperature":"temperature","gpxx:Depth":"depth"},g=c=>c*(180/Math.pow(2,31));var Ve=f(require("dayjs"));var He=f(require("dayjs")),tt=require("geolib"),X=class{calculateRecordsAggMetrics(e){if(!e||e.length===0)return;let t={records:this.preprocessRecords(e)},r=0;for(let i=0;i<t.records.length;i++){let n=t.records[i];if(!(!n.positionLat||!n.positionLong)){if(t!=null&&t.startPositionLat||(t.startPositionLat=n.positionLat),t!=null&&t.startPositionLong||(t.startPositionLong=n.positionLong),t.endPositionLat=n.positionLat,t.endPositionLong=n.positionLong,t.timestamp=n.timestamp,t!=null&&t.startTime||(t.startTime=n.timestamp),t.endTime=n.timestamp,n!=null&&n.distance?t.totalDistance=n.distance:i>0&&(r+=this.calculatePointDistanceByPosition(e[i-1],n)||0,t.totalDistance=r),n!=null&&n.speed&&(t.avgSpeed=t.avgSpeed?(t.avgSpeed+n.speed)/2:n.speed,t.maxSpeed=Math.max(t.maxSpeed||0,n.speed)),n!=null&&n.heartRate&&(t.maxHeartRate=Math.max(t.maxHeartRate||0,n.heartRate),t.minHeartRate=Math.min(t.minHeartRate||n.heartRate,n.heartRate),t.avgHeartRate?t.avgHeartRate=(t.avgHeartRate+n.heartRate)/2:t.avgHeartRate=n.heartRate),n!=null&&n.altitude&&(t.maxAltitude=Math.max(t.maxAltitude||0,n.altitude),t.minAltitude=Math.min(t.minAltitude||n.altitude,n.altitude),t.avgAltitude=t.avgAltitude?(t.avgAltitude+n.altitude)/2:n.altitude,i>0&&e[i-1].altitude)){let s=this.calculateElevationChanges(e[i-1],n);t.totalAscent=(t.totalAscent||0)+s.ascent,t.totalDescent=(t.totalDescent||0)+s.descent}if(n!=null&&n.cadence&&(t.maxCadence=Math.max(t.maxCadence||0,n.cadence),t.avgCadence?t.avgCadence=(t.avgCadence+n.cadence)/2:t.avgCadence=n.cadence),n!=null&&n.power){t.maxPower=Math.max(t.maxPower||0,n.power),t.avgPower?t.avgPower=(t.avgPower+n.power)/2:t.avgPower=n.power;let s=this.calculateAccumulatedPower(i>0?e[i-1]:n,n,t.totalWork||0);t.totalWork=s.newAccumulatedWork,t.normalizedPower=void 0}n!=null&&n.temperature&&(t.avgTemperature?t.avgTemperature=(t.avgTemperature+n.temperature)/2:t.avgTemperature=n.temperature,t.maxTemperature=Math.max(t.maxTemperature||0,n.temperature),t.minTemperature=Math.min(t.minTemperature||n.temperature,n.temperature))}}return t}calculateLapAggMetrics(e){var r;if(!e||e.length===0)return;let t={laps:e,timestamp:((r=e[0])==null?void 0:r.timestamp)||new Date};for(let i=0;i<e.length;i++){let n=e[i];n.startPositionLat&&n.startPositionLong&&!(t!=null&&t.startPositionLat)&&!(t!=null&&t.startPositionLong)&&(t.startPositionLat=n.startPositionLat,t.startPositionLong=n.startPositionLong),n.endPositionLat&&n.endPositionLong&&(t.endPositionLat=n.endPositionLat,t.endPositionLong=n.endPositionLong),n.startTime&&!(t!=null&&t.startTime)&&(t.startTime=n.startTime),n.endTime&&(t.endTime=n.endTime),t.timestamp=n.timestamp||n.endTime||t.timestamp,n.totalDistance&&(t.totalDistance=(t.totalDistance||0)+n.totalDistance),n.totalElapsedTime&&(t.totalElapsedTime=(t.totalElapsedTime||0)+n.totalElapsedTime),n.maxSpeed&&(t.maxSpeed=Math.max(t.maxSpeed||0,n.maxSpeed)),n.avgSpeed&&(t.avgSpeed?t.avgSpeed=(t.avgSpeed+n.avgSpeed)/2:t.avgSpeed=n.avgSpeed),n.maxHeartRate&&(t.maxHeartRate=Math.max(t.maxHeartRate||0,n.maxHeartRate)),n.minHeartRate&&(t.minHeartRate=t.minHeartRate?Math.min(t.minHeartRate,n.minHeartRate):n.minHeartRate),n.avgHeartRate&&(t.avgHeartRate?t.avgHeartRate=(t.avgHeartRate+n.avgHeartRate)/2:t.avgHeartRate=n.avgHeartRate),n.maxAltitude&&(t.maxAltitude=Math.max(t.maxAltitude||0,n.maxAltitude)),n.minAltitude&&(t.minAltitude=t.minAltitude?Math.min(t.minAltitude,n.minAltitude):n.minAltitude),n.avgAltitude&&(t.avgAltitude?t.avgAltitude=(t.avgAltitude+n.avgAltitude)/2:t.avgAltitude=n.avgAltitude),n.totalAscent&&(t.totalAscent=(t.totalAscent||0)+n.totalAscent),n.totalDescent&&(t.totalDescent=(t.totalDescent||0)+n.totalDescent),n.maxCadence&&(t.maxCadence=Math.max(t.maxCadence||0,n.maxCadence)),n.avgCadence&&(t.avgCadence?t.avgCadence=(t.avgCadence+n.avgCadence)/2:t.avgCadence=n.avgCadence),n.maxPower&&(t.maxPower=Math.max(t.maxPower||0,n.maxPower)),n.avgPower&&(t.avgPower?t.avgPower=(t.avgPower+n.avgPower)/2:t.avgPower=n.avgPower),n.totalWork&&(t.totalWork=(t.totalWork||0)+n.totalWork),n.maxTemperature&&(t.maxTemperature=Math.max(t.maxTemperature||0,n.maxTemperature)),n.minTemperature&&(t.minTemperature=t.minTemperature?Math.min(t.minTemperature,n.minTemperature):n.minTemperature),n.avgTemperature&&(t.avgTemperature?t.avgTemperature=(t.avgTemperature+n.avgTemperature)/2:t.avgTemperature=n.avgTemperature)}return t}preprocessRecords(e){if(!e||e.length===0)return e;let t=e.filter(s=>s.timestamp).sort((s,o)=>s.timestamp.valueOf()-o.timestamp.valueOf()),r=0,i=[],n=null;for(let s=0;s<t.length;s++){let o=t[s],a={...o};if(s>0&&n&&(a.distance||(a.distance=this.calculatePointDistanceByPosition(n,a)||0),o.speed||(a.speed=this.calculateInstantSpeed(n,a,a.distance)),o.power)){let p=this.calculateAccumulatedPower(n,a,r);a.accumulatedPower=p.accumulatedPower,r=p.newAccumulatedWork}n=a,i.push(a)}return i}calculatePointDistanceByPosition(e,t){if(!(!e.positionLat||!e.positionLong||!t.positionLat||!t.positionLong))try{return(0,tt.getPreciseDistance)({latitude:e.positionLat,longitude:e.positionLong},{latitude:t.positionLat,longitude:t.positionLong})}catch{return}}calculateInstantSpeed(e,t,r){if(!e.timestamp||!t.timestamp||!r)return;let i=((0,He.default)(t.timestamp).valueOf()-(0,He.default)(e.timestamp).valueOf())/1e3;if(!(i<=0))return r/i}calculateAccumulatedPower(e,t,r){var a,p;if(e.power===void 0||t.power===void 0||!e.timestamp||!t.timestamp)return{accumulatedPower:r,newAccumulatedWork:r};let i=((a=t.timestamp)==null?void 0:a.valueOf())-((p=e.timestamp)==null?void 0:p.valueOf());if(i<=0)return{accumulatedPower:r,newAccumulatedWork:r};let s=(e.power+t.power)/2*i,o=r+s;return{accumulatedPower:o,newAccumulatedWork:o}}calculateElevationChanges(e,t){let r=0,i=0;return t.altitude!==void 0&&e.altitude!==void 0&&(t.altitude>e.altitude?r=t.altitude-e.altitude:t.altitude<=e.altitude&&(i=e.altitude-t.altitude)),{ascent:r,descent:i}}};function h(c,e=0){let t=Math.pow(10,e);return Math.round(c*t)/t}var R=class extends S{constructor(){super(...arguments);this.name="gpx-to-activity-converter";this.supportedTags=["gpx"];this.convertGPXExtensions=t=>{let r={};return Object.entries(t).forEach(([i,n])=>{if(typeof n<"u"&&n!=="undefined"){let s=et[i]||i;r[s]=this.autoNumber(n)}}),r}}convert(t,r){if(r.sourceFormat!=="gpx")return;let i=r.sourceData;return this.convertGPX(i)}convertGPX(t){let r={metadata:{originType:"GPX",fileType:"gpx"},activities:[]};return t.wpt&&(r.points=this.convertWpts2Points(t.wpt)),t.trk&&(r.activities=t.trk.map((i,n)=>this.convertTrk2Activity(i,n))),t.rte&&(r.routes=t.rte.map((i,n)=>this.convertTrackSeg2Lap(i,n))),r}convertPoint(t,r){let{extensions:i}=t,n=i?this.convertGPXExtensions(i):{};return{index:r||0,positionLat:t==null?void 0:t.lat,positionLong:t==null?void 0:t.lon,altitude:t==null?void 0:t.ele,heartRate:t==null?void 0:t.heartRate,speed:t==null?void 0:t.speed,power:t==null?void 0:t.power,cadence:t==null?void 0:t.cadence,timestamp:(0,Ve.default)(t.time).toDate(),...n}}convertTrk2Activity(t,r){var s;let i=((s=t.trkseg)==null?void 0:s.map((o,a)=>this.convertTrackSeg2Lap(o,a)))||[],n=new X().calculateLapAggMetrics(i);return{index:r,messageIndex:r,laps:i,...n}}convertTrackSeg2Lap(t,r){var o,a;let i=((a=(o=t.trkpt)==null?void 0:o.filter(p=>p!==void 0&&p.time))==null?void 0:a.map((p,d)=>this.convertPoint(p,d)))||[],s=new X().calculateRecordsAggMetrics(i);return{index:r,messageIndex:r,...s,records:(s==null?void 0:s.records)||[]}}convertWpts2Points(t){let r=[];for(let i=0;i<t.length;i++){let n=this.convertPoint(t[i],i);n&&r.push(n)}return r}autoNumber(t){return typeof t=="string"&&t.trim()!==""&&!isNaN(t)?Number(t):t}},L=class extends S{constructor(){super(...arguments);this.name="fit-to-activity-converter";this.supportedTags=["fit"]}convert(t,r){if(r.sourceFormat!=="fit")return;let i=r.sourceData;return this.convertFIT(i)}convertFIT(t){var i,n;let r={metadata:{originType:"FIT",fileType:"fit"},activities:[]};return(i=t.sessionMesgs)!=null&&i.length?r.activities=t.sessionMesgs.map((s,o)=>({index:o,...s,startPositionLat:s!=null&&s.startPositionLat?h(g(Number(s.startPositionLat)),6):void 0,startPositionLong:s!=null&&s.startPositionLong?h(g(Number(s.startPositionLong)),6):void 0,endPositionLat:s!=null&&s.endPositionLat?h(g(Number(s.endPositionLat)),6):void 0,endPositionLong:s!=null&&s.endPositionLong?h(g(Number(s.endPositionLong)),6):void 0,laps:this.convertFITLap2Trackseg(s==null?void 0:s.lapMesgs)})):(n=t.courseMesgs)!=null&&n.length&&(r.routes=t.courseMesgs.map((s,o)=>({index:o,...s,records:this.convertLap2Points(s==null?void 0:s.lapMesgs)}))),r}convertPoint(t,r){let{positionLong:i,positionLat:n,altitude:s,enhancedAltitude:o,enhancedSpeed:a,speed:p,...d}=t;return{index:r||0,positionLat:n?h(g(Number(n)),6):void 0,positionLong:i?h(g(Number(i)),6):void 0,altitude:s||o||void 0,speed:p||a||void 0,...d}}convertFITLap2Trackseg(t){var i;let r=[];if(!(t!=null&&t.length))return[];for(let n=0;n<t.length;n++){let s=t[n],o=((i=s==null?void 0:s.recordMesgs)==null?void 0:i.map((a,p)=>this.convertPoint(a,p)).filter(a=>a!==void 0))||[];r.push({index:n,...s,startPositionLat:s!=null&&s.startPositionLat?h(g(Number(s.startPositionLat)),6):void 0,startPositionLong:s!=null&&s.startPositionLong?h(g(Number(s.startPositionLong)),6):void 0,endPositionLat:s!=null&&s.endPositionLat?h(g(Number(s.endPositionLat)),6):void 0,endPositionLong:s!=null&&s.endPositionLong?h(g(Number(s.endPositionLong)),6):void 0,records:o})}return r}convertLap2Points(t){var i;let r=[];if(!(t!=null&&t.length))return[];for(let n of t){let s=((i=n.recordMesgs)==null?void 0:i.map((o,a)=>this.convertPoint(o,a)).filter(o=>o!==void 0))||[];s.length&&(r=[...r,...s])}return r}},_=class extends S{constructor(){super(...arguments);this.name="tcx-to-activity-converter";this.supportedTags=["tcx"]}convert(t,r){if(r.sourceFormat!=="tcx")return;let i=r.sourceData;return this.convertTCX(i)}convertTCX(t){var i,n,s,o;let r={metadata:{originType:"TCX",fileType:"tcx"},activities:[]};return(n=(i=t.Activities)==null?void 0:i.Activity)!=null&&n.length&&(r.activities=t.Activities.Activity.map((a,p)=>this.convertTCXActivityToActivity(a,p))),(o=(s=t.Courses)==null?void 0:s.Course)!=null&&o.length,r}convertTCXActivityToActivity(t,r){var s;let i=((s=t.Lap)==null?void 0:s.map((o,a)=>this.convertTCXLap2Lap(o,a)))||[],n=new X().calculateLapAggMetrics(i);return{index:r,messageIndex:r,laps:i,...n}}convertTCXLap2Lap(t,r){var a;let i=((a=t==null?void 0:t.Track)==null?void 0:a.flatMap(p=>p.Trackpoint))||[],n=(i==null?void 0:i.filter(p=>p!==void 0&&p.Time!==void 0).map((p,d)=>this.convertPoint(p,d)))||[],o=new X().calculateRecordsAggMetrics(n);return{index:r,messageIndex:r,...o,records:(o==null?void 0:o.records)||[]}}convertPoint(t,r){let{Position:i,Time:n,DistanceMeters:s,AltitudeMeters:o}=t;return{index:r||0,positionLat:i!=null&&i.LatitudeDegrees?Number(i.LatitudeDegrees):void 0,positionLong:i!=null&&i.LongitudeDegrees?Number(i.LongitudeDegrees):void 0,timestamp:(0,Ve.default)(n).toDate(),distance:s,altitude:o}}};var rt=f(require("dayjs"));var M=class extends D{constructor(){super(...arguments);this.name="activity-to-gpx-encoder";this.supportedTags=["gpx"]}encode(t,r){var s,o,a,p,d;if(r.targetFormat!=="gpx"||!((s=t==null?void 0:t.activities)!=null&&s.length))return;let n={version:"1.1",creator:"TrackSwap",metadata:{time:((o=t.activities)==null?void 0:o[0]).timestamp}};return(a=t.points)!=null&&a.length&&(n.wpt=this.convertRecords2Wpts(t.points)),(p=t.routes)!=null&&p.length&&(n.rte=t.routes.map(l=>this.convertRoute2GPXRoute(l))),(d=t.activities)!=null&&d.length&&(n.trk=t.activities.map(l=>this.convertActivity2GPXTrack(l))),n}convertRecords2Wpts(t){return t==null?void 0:t.filter(r=>r.timestamp).map(r=>({lat:r==null?void 0:r.positionLat,lon:r==null?void 0:r.positionLong,ele:r==null?void 0:r.altitude,time:r==null?void 0:r.timestamp,speed:r==null?void 0:r.speed,hdop:r==null?void 0:r.hdop,vdop:r==null?void 0:r.vdop,pdop:r==null?void 0:r.pdop,extensions:this.extractGPXExtensions(r)}))}convertRoute2GPXRoute(t){return{rtept:t.records?this.convertRecords2Wpts(t.records):[]}}convertActivity2GPXTrack(t){var r;return{trkseg:((r=t.laps)==null?void 0:r.map(i=>({trkpt:i.records?this.convertRecords2Wpts(i.records):[]})))||[]}}extractGPXExtensions(t){let r={},i={};return typeof(t==null?void 0:t.heartRate)<"u"&&(i["gpxtpx:hr"]=t.heartRate),typeof(t==null?void 0:t.cadence)<"u"&&(i["gpxtpx:cad"]=t.cadence),typeof(t==null?void 0:t.temperature)<"u"&&(i["gpxtpx:atemp"]=t.temperature),Object.keys(i).length>0&&(r["gpxtpx:TrackPointExtension"]=i),typeof(t==null?void 0:t.power)<"u"&&(r["gpxpx:PowerExtension"]={"gpxpx:PowerInWatts":t.power}),Object.keys(r).length>0?r:void 0}},O=class extends D{constructor(){super(...arguments);this.name="activity-to-fit-encoder";this.supportedTags=["fit"]}encode(t,r){var n,s;if(r.targetFormat!=="fit"||!((n=t==null?void 0:t.activities)!=null&&n.length))return;let i={};return i.sessionMesgs=(s=t.activities)==null?void 0:s.map(o=>this.convertActivity2FITSession(o)),i}convertActivity2FITSession(t){var i;return{...t,event:(t==null?void 0:t.event)||"session",sport:(t==null?void 0:t.sport)||"generic",lapMesgs:((i=t.laps)==null?void 0:i.map(n=>this.convertLap2FITLap(n)))||[]}}convertLap2FITLap(t){var i;return{startTime:t.startTime,...t,recordMesgs:((i=t.records)==null?void 0:i.map(n=>this.convertPoint2FITRecord(n)))||[]}}convertPoint2FITRecord(t){return t}},$=class extends D{constructor(){super(...arguments);this.name="sport-to-tcx-encoder";this.supportedTags=["tcx"]}encode(t,r){var n;if(r.targetFormat!=="tcx"||!((n=t==null?void 0:t.activities)!=null&&n.length))return;let i={Author:{Name:"TrackSwap"}};return i.Activities={Activity:t.activities.map(s=>this.convertActivity2TCXActivity(s))},i}convertActivity2TCXActivity(t){var i;let r="Other";return(t.sport==="Running"||t.sport==="Biking")&&(r=t.sport),{Id:`Activity_${Date.now()}`,Activity:r,Lap:((i=t.laps)==null?void 0:i.map(n=>this.convertLap2TCXLap(n)))||[]}}convertLap2TCXLap(t){let r={TotalTimeSeconds:t.totalElapsedTime,DistanceMeters:t.totalDistance,MaximumSpeed:t.maxSpeed,Calories:t.totalCalories,AverageHeartRateBpm:t.avgHeartRate,MaximumHeartRateBpm:t.maxHeartRate,Intensity:"Active",TriggerMethod:"Manual",Track:t.records?[this.convertRecords2TCXTrack(t.records)]:[]};return(t.avgCadence!==void 0||t.maxCadence!==void 0)&&(r.Cadence={Low:t.avgCadence||0,High:t.maxCadence||0}),r}convertRecords2TCXTrack(t){return{Trackpoint:t.map(r=>this.convertPoint2TCXTrackpoint(r))}}convertPoint2TCXTrackpoint(t){var i,n;let r={Time:(0,rt.default)(t.timestamp).toISOString(),Position:{LatitudeDegrees:(i=t==null?void 0:t.positionLat)==null?void 0:i.toString(),LongitudeDegrees:(n=t==null?void 0:t.positionLong)==null?void 0:n.toString()},AltitudeMeters:t.altitude,DistanceMeters:t.distance};return t.heartRate&&(r.HeartRateBpm=t.heartRate),t.cadence&&(r.Cadence={Low:t.cadence,High:t.cadence256||t.cadence}),t.power&&(r.Extensions={"ns3:TPX":{"ns3:Watts":t.power}}),r}convertRoute2TCXCourse(t){return{Name:`Course_${Date.now()}`,Track:t.records?[this.convertRecords2TCXTrack(t.records)]:[]}}};var G=class{constructor(){this.converters=new Map;this.encoders=new Map;this.registerDefaultConverters(),this.registerDefaultEncoders()}registerDefaultConverters(){this.registerConverter(new R),this.registerConverter(new L),this.registerConverter(new _)}registerDefaultEncoders(){this.registerEncoder(new M),this.registerEncoder(new O),this.registerEncoder(new $)}registerConverter(e){this.converters.set(e.name,e)}registerEncoder(e){this.encoders.set(e.name,e)}async convertToActivity(e,t){let r={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},sourceFormat:t,sourceData:e,performance:{startTime:Date.now()}};try{let i=this.findConverter(t);if(!i)throw new Error(`No converter found for format "${t}"`);let n=Date.now(),s=i.convert(e,r);if(r.performance.convertTime=Date.now()-n,!s)throw new Error(`Converter "${i.name}" returned empty result`);let o=s;return r.result=o,r.performance.endTime=Date.now(),r.stats.endTime=Date.now(),o}catch(i){throw r.errors.push(i),i}}async encodeActivity(e,t){let r={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},targetFormat:t,performance:{startTime:Date.now()}};try{let i=this.findEncoder(t);if(!i)throw new Error(`No encoder found for format "${t}"`);let n=Date.now(),s=i.encode(e,r);if(r.performance.encodeTime=Date.now()-n,!s)throw new Error(`Encoder "${i.name}" returned empty result`);return r.result=s,r.performance.endTime=Date.now(),r.stats.endTime=Date.now(),s}catch(i){throw r.errors.push(i),i}}findConverter(e){return Array.from(this.converters.values()).find(t=>{var r;return(r=t.supportedTags)==null?void 0:r.includes(e)})}findEncoder(e){return Array.from(this.encoders.values()).find(t=>{var r;return(r=t.supportedTags)==null?void 0:r.includes(e)})}async destroy(){this.converters.clear(),this.encoders.clear()}};var B=class{constructor(){this.gpxDecoder=new b,this.gpxEncoder=new I,this.fitDecoder=new x,this.fitEncoder=new C,this.tcxDecoder=new k,this.tcxEncoder=new F,this.activityProcessor=new G}async parseGPX(e){try{return await this.gpxDecoder.parserByBuffer(e)}catch(t){throw new Error(`GPX parsing failed: ${t.message}`)}}async parseGPXString(e){let t=Buffer.from(e,"utf-8");return this.parseGPX(t)}async encodeGPX(e){try{return await this.gpxEncoder.encode(e)}catch(t){throw new Error(`GPX encoding failed: ${t.message}`)}}encodeGPXString(e){try{return this.gpxEncoder.encodeToString(e)}catch(t){throw new Error(`GPX encoding failed: ${t.message}`)}}async parseFIT(e){try{return await this.fitDecoder.parseByBuffer(e)}catch(t){throw new Error(`FIT parsing failed: ${t.message}`)}}async encodeFIT(e){try{return await this.fitEncoder.encode(e)}catch(t){throw new Error(`FIT encoding failed: ${t.message}`)}}async encodeFITCourse(e){try{return await this.fitEncoder.encodeCourse(e)}catch(t){throw new Error(`FIT Course encoding failed: ${t.message}`)}}async parseTCXString(e){let t=Buffer.from(e,"utf-8");return this.parseTCX(t)}async parseTCX(e){try{let t=await this.tcxDecoder.parseByBuffer(e);if(!t)throw new Error("TCX parsing result is empty");return t}catch(t){throw new Error(`TCX parsing failed: ${t.message}`)}}async encodeTCX(e){try{return await this.tcxEncoder.encode(e)}catch(t){throw new Error(`TCX encoding failed: ${t.message}`)}}async encodeTCXString(e){try{return await this.tcxEncoder.encodeToString(e)}catch(t){throw new Error(`TCX encoding failed: ${t.message}`)}}async convertGPXToActivity(e){return await this.activityProcessor.convertToActivity(e,"gpx")}async convertFITToActivity(e){return await this.activityProcessor.convertToActivity(e,"fit")}async convertTCXToActivity(e){return await this.activityProcessor.convertToActivity(e,"tcx")}async convertActivityToGPX(e){return await this.activityProcessor.encodeActivity(e,"gpx")}async convertActivityToFIT(e){return await this.activityProcessor.encodeActivity(e,"fit")}async convertActivityToTCX(e){return await this.activityProcessor.encodeActivity(e,"tcx")}async convertFile(e,t,r){try{let i=r||this.detectFormat(e);if(i==="unknown"||i==null)throw new Error("Unable to recognize source file format, please specify sourceType parameter");if(i===t)return e;let n;switch(i){case"gpx":let o=await this.parseGPX(e);if(!o)throw new Error("GPX file parsing failed");n=o;break;case"fit":n=await this.parseFIT(e);break;case"tcx":n=await this.parseTCX(e);break;default:throw new Error(`Unsupported source file format: ${i}`)}let s;switch(i){case"gpx":s=await this.convertGPXToActivity(n);break;case"fit":s=await this.convertFITToActivity(n);break;case"tcx":s=await this.convertTCXToActivity(n);break;default:throw new Error(`Unsupported source file format conversion: ${i}`)}switch(t){case"gpx":let o=await this.convertActivityToGPX(s);return await this.encodeGPX(o);case"fit":let a=await this.convertActivityToFIT(s);return await this.encodeFIT(a);case"tcx":let p=await this.convertActivityToTCX(s);return await this.encodeTCX(p);default:throw new Error(`Unsupported target file format: ${t}`)}}catch(i){let n=r||"auto-detect";throw new Error(`${n} to ${t.toUpperCase()} failed: ${i.message}`)}}detectFormat(e){let t=e.toString("utf-8",0,Math.min(1024,e.length));if(e.length>=12&&e.toString("ascii",8,12)===".FIT")return"fit";if(t.includes("<?xml")){if(t.includes("<gpx")||t.includes("http://www.topografix.com/GPX/"))return"gpx";if(t.includes("<TrainingCenterDatabase")||t.includes("http://www.garmin.com/xmlschemas/TrainingCenterDatabase/"))return"tcx"}return"unknown"}async parseFile(e,t){let r=t||this.detectFormat(e);if(r==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");switch(r){case"gpx":let i=await this.parseGPX(e);if(!i)throw new Error("GPX parsing failed");return i;case"fit":return await this.parseFIT(e);case"tcx":return await this.parseTCX(e);default:throw new Error(`Unsupported file format: ${r}`)}}async parseToActivity(e,t){let r=t||this.detectFormat(e);if(r==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");let i;switch(r){case"gpx":let n=await this.parseGPX(e);if(!n)throw new Error("GPX parsing failed");i=await this.convertGPXToActivity(n);break;case"fit":let s=await this.parseFIT(e);s&&(i=await this.convertFITToActivity(s));break;case"tcx":let o=await this.parseTCX(e);i=await this.convertTCXToActivity(o);break;default:throw new Error(`Unsupported file format: ${r}`)}return i}getActivityProcessor(){return this.activityProcessor}getGPXDecoder(){return this.gpxDecoder}getGPXEncoder(){return this.gpxEncoder}getFITDecoder(){return this.fitDecoder}getFITEncoder(){return this.fitEncoder}getTCXDecoder(){return this.tcxDecoder}getTCXEncoder(){return this.tcxEncoder}async destroy(){await this.gpxDecoder.destroy(),await this.fitDecoder.destroy(),await this.tcxDecoder.destroy(),await this.activityProcessor.destroy()}};var Pt=B;0&&(module.exports={ActivityProcessor,ActivityToFITEncoder,ActivityToGPXEncoder,ActivityToTCXEncoder,BaseActivityConverter,BaseActivityEncoder,BaseActivityMiddleware,FITDecoder,FITEncoder,FITToActivityConverter,GPXDecoder,GPXEncoder,GPXToActivityConverter,PipelineStage,TCXDecoder,TCXEncoder,TCXToActivityConverter,TrackSwap,registerDefaultMiddlewares});
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
- var K=class{constructor(){this.stage="parse"}async process(e){let t=Date.now();if(!e.rawData)throw new Error("FIT data cannot be empty");try{let r=await this.parseWithFitSDK(e.rawData);return e.rawMessages=r,e.performance.parseTime=Date.now()-t,e}catch(r){throw new Error(`FIT parsing failed: ${r.message}`)}}async parseWithFitSDK(e){let{Decoder:t,Stream:r}=await import("@garmin/fitsdk"),i=r.fromBuffer(e);if(!t.isFIT(i))throw new Error("Not a valid FIT file");let n=new t(i),{messages:s,errors:o}=n.read();return o&&o.length>0,s}},N=class{constructor(e){this.getConverters=e;this.stage="extract"}async process(e){let t=Date.now();if(!e.rawMessages)throw new Error("Raw messages cannot be empty");let r={};for(let[i,n]of Object.entries(e.rawMessages)){if(!Array.isArray(n)||n.length===0){r[i]=n;continue}let s=this.getConverters(i);if(s.length===0)r[i]=n;else{let o=s[0];try{let a=o.convertMessages(n,e);r[i]=a}catch(a){e.errors.push(a),r[i]=n}}}return e.rawMessages=r,e.performance.extractTime=Date.now()-t,e}},Y=class{constructor(e){this.getStructurePlugins=e;this.stage="structure"}async process(e){let t=Date.now();if(!e.rawMessages)throw new Error("Message data cannot be empty");let r={},i=this.getStructurePlugins();for(let n of i)try{let s=n.structureData(e.rawMessages,e);r={...r,...s}}catch(s){e.errors.push(s)}return e.result=r,e.performance.structureTime=Date.now()-t,e}},Z=class{constructor(){this.stage="complete"}async process(e){e.performance.endTime=Date.now();let t=e.performance.endTime-e.performance.startTime;return e.metadata.set("performance",{totalTime:t,parseTime:e.performance.parseTime,extractTime:e.performance.extractTime,structureTime:e.performance.structureTime}),e.stats&&(e.stats.endTime=Date.now(),e.rawMessages&&(e.stats.processedTokens=this.countTotalMessages(e.rawMessages))),e}countTotalMessages(e){let t=0;return Object.values(e).forEach(r=>{Array.isArray(r)&&(t+=r.length)}),t}};import P from"dayjs";var C=class{constructor(){this.version="1.0.0";this.priority=100}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}};var _=class extends C{constructor(){super(...arguments);this.name="SessionStructurePlugin";this.priority=10}structureData(t,r){let{sessionMesgs:i,lapMesgs:n,recordMesgs:s}=t;return i!=null&&i.length?{sessionMesgs:i.map(a=>{let c=P(a.startTime).valueOf(),d=c+a.totalElapsedTime*1e3,v=((n==null?void 0:n.filter(u=>{let T=P(u.startTime).valueOf(),x=T+(u.totalElapsedTime??0)*1e3;return T>=c&&x<=d}))||[]).map(u=>{let T=P(u.startTime).valueOf(),x=T+(u.totalElapsedTime??0)*1e3,k=(s==null?void 0:s.filter(Ke=>{let Le=P(Ke.timestamp).valueOf();return Le>=T&&Le<x}))||[];return{...u,recordMesgs:k,messageIndex:u.messageIndex!==void 0?u.messageIndex:0}});return{...a,lapMesgs:v,messageIndex:a.messageIndex!==void 0?a.messageIndex:0}})}:{}}},M=class extends C{constructor(){super(...arguments);this.name="CourseStructurePlugin";this.priority=10}structureData(t,r){let{courseMesgs:i,lapMesgs:n,recordMesgs:s}=t;if(!(i!=null&&i.length))return{};let o=2e3;return{courseMesgs:i.map(c=>{let d=(n==null?void 0:n.map(l=>{let v=P(l.startTime).valueOf(),u=P(l.timestamp).valueOf(),T=(s==null?void 0:s.filter(x=>{let k=P(x.timestamp).valueOf();return k>=v-o&&k<=u+o}))||[];return{...l,recordMesgs:T}}))||[];return{...c,lapMesgs:d}})}}},O=class extends C{constructor(){super(...arguments);this.name="FileHeaderPlugin";this.priority=1}structureData(t,r){let{fileIdMesgs:i}=t;if(i!=null&&i.length&&i[0]){let n=i[0];r.fileHeader={type:n.type,manufacturer:n.manufacturer,product:n.product}}return{}}};var w=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.structurePlugins=[];this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultPluginsRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new K,new N(e=>this.getConverters(e)),new Y(()=>this.structurePlugins),new Z]}async registerDefaultPlugins(){if(this.defaultPluginsRegistered)return;let e=[new O,new _,new M];for(let t of e)this.addStructurePlugin(t),this.registeredPlugins.add(t.name);this.defaultPluginsRegistered=!0}addConverterForMessageType(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}addStructurePlugin(e){this.structurePlugins.push(e),this.structurePlugins.sort((t,r)=>(t.priority||100)-(r.priority||100))}async registerMessageConverter(e){if(this.registeredPlugins.has(e.name))throw new Error(`Message converter plugin ${e.name} already exists`);e.supportedMessageTypes.forEach(r=>{this.addConverterForMessageType(r,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";e.supportedMessageTypes.forEach(r=>{let n=(this.converterPlugins.get(r)||[]).map(s=>`${s.name}(${s.priority||100})`)})}async registerStructurePlugin(e){if(this.registeredPlugins.has(e.name))throw new Error(`Structure plugin ${e.name} already exists`);this.addStructurePlugin(e),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:""}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:(this.middlewarePlugins.push(e),this.middlewarePlugins.sort((i,n)=>(i.priority||100)-(n.priority||100)));let r=[];e.onParse&&r.push("onParse"),e.onExtractMessages&&r.push("onExtractMessages"),e.onStructure&&r.push("onStructure"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getConverters(e){return this.converterPlugins.get(e)||[]}unregisterPlugin(e){if(!this.registeredPlugins.has(e))return!1;for(let[i,n]of this.converterPlugins){let s=n.findIndex(o=>o.name===e);s!==-1&&(n.splice(s,1),n.length===0&&this.converterPlugins.delete(i))}let t=this.structurePlugins.findIndex(i=>i.name===e);t!==-1&&this.structurePlugins.splice(t,1);let r=this.middlewarePlugins.findIndex(i=>i.name===e);return r!==-1&&this.middlewarePlugins.splice(r,1),this.registeredPlugins.delete(e),!0}async initialize(){var r;if(this.initialized)return;await this.registerDefaultPlugins();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parseByBuffer(e,t={}){var i;await this.initialize();let r=this.createContext();r.rawData=e,r.userData=t.userData,r.metadata.set("decoder",this);try{for(let n of this.processors)try{switch(r=await n.process(r),n.stage){case"parse":r.rawData&&(r.rawData=await this.executeMiddlewareHook("onParse",r.rawData,r));break;case"extract":r.rawMessages&&(r.rawMessages=await this.executeMiddlewareHook("onExtractMessages",r.rawMessages,r));break;case"structure":r.result&&(r.result=await this.executeMiddlewareHook("onStructure",r.result,r));break;case"complete":r.result&&(r.result=await this.executeMiddlewareHook("onComplete",r.result,r));break}}catch(s){r.errors.push(s);for(let o of this.middlewarePlugins)await((i=o.onError)==null?void 0:i.call(o,s,r))}return r.result}catch(n){throw n}}};var Ne={file:{course:6,device:1,settings:2,sport:3,activity:4,workout:5,schedules:7,weight:9,totals:10,goals:11,blood_pressure:14,monitoring_a:15,activity_summary:20,monitoring_daily:28,monitoring_b:32,segment_list:35,exd_configuration:40,invalid:0},sport:{generic:0,running:1,cycling:2,transition:3,fitness_equipment:4,swimming:5,basketball:6,soccer:7,tennis:8,american_football:9,training:10,walking:11,cross_country_skiing:12,alpine_skiing:13,snowboarding:14,rowing:15,mountaineering:16,hiking:17,multisport:18,paddling:19,invalid:254},event:{timer:0,workout:3,workout_step:4,power_down:5,power_up:6,off_course:7,session:8,lap:9,course_point:10,battery:11,virtual_partner_pace:12,hr_high_alert:13,hr_low_alert:14,speed_high_alert:15,speed_low_alert:16,cad_high_alert:17,cad_low_alert:18,power_high_alert:19,power_low_alert:20,recovery_hr:21,battery_low:22,time_duration_alert:23,distance_duration_alert:24,calorie_duration_alert:25,activity:26,fitness_equipment:27,length:28,user_marker:32,sport_point:33,calibration:36,front_gear_change:42,rear_gear_change:43,rider_position_change:44,elev_high_alert:45,elev_low_alert:46,comm_timeout:47,invalid:255},event_type:{start:0,stop:1,consecutive_depreciated:2,marker:3,stop_all:4,begin_depreciated:5,end_depreciated:6,end_all_depreciated:7,stop_disable:8,stop_disable_all:9,invalid:255},course_point:{generic:0,summit:1,valley:2,water:3,food:4,danger:5,left:6,right:7,straight:8,first_aid:9,fourth_category:10,third_category:11,second_category:12,first_category:13,hors_category:14,sprint:15,left_fork:16,right_fork:17,middle_fork:18,slight_left:19,sharp_left:20,slight_right:21,sharp_right:22,u_turn:23,segment_start:24,segment_end:25,invalid:255}},E=p=>{let e=Ne[p];return{size:1,baseType:0,mapValue:t=>typeof t=="string"?e[t]??255:t,setValue:function(t,r){this.setUint8(t,r)}}},ke={enum_file:E("file"),enum_activity:E("sport"),enum_sport:E("sport"),enum_sub_sport:E("sport"),enum_event:E("event"),enum_event_type:E("event_type"),enum_course_point:E("course_point"),uint8:{size:1,baseType:2,setValue:DataView.prototype.setUint8},sint8:{size:1,baseType:1,setValue:DataView.prototype.setInt8},uint16:{size:2,baseType:132,setValue:DataView.prototype.setUint16},sint16:{size:2,baseType:131,setValue:DataView.prototype.setInt16},uint32:{size:4,baseType:134,setValue:DataView.prototype.setUint32},sint32:{size:4,baseType:133,setValue:DataView.prototype.setInt32},string:{size:0,baseType:7,mapValue:p=>Array.from(Me(p)),setValue:Ze},distance:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:p=>Math.round(p*1e3)},speed:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:p=>Math.round(p*100)},altitude:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:p=>Math.round((p+500)*5)},seconds:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:p=>Math.round(p*1e3)},date_time:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:p=>{let e;return p instanceof Date?(e=Math.floor(p.getTime()/1e3),e-631065600):typeof p=="string"?(e=Math.floor(new Date(p).getTime()/1e3),e-631065600):p<631065600?Math.floor(p):(p>9999999999?e=Math.floor(p/1e3):e=Math.floor(p),e-631065600)}},semicircles:{size:4,baseType:133,setValue:DataView.prototype.setInt32,mapValue:p=>Math.round(p/180*2147483648)}};function _e(p){return Array.from(Me(p)).length+1}function*Me(p){for(let e of Ye(p))e<128?yield e:e<2048?(yield 192|e>>6,yield 128|e&63):e<65536?(yield 224|e>>12,yield 128|e>>6&63,yield 128|e&63):(yield 240|e>>18,yield 128|e>>12&63,yield 128|e>>6&63,yield 128|e&63);yield 0}function*Ye(p){for(let e=0;e<p.length;){let t=p.codePointAt(e);if(t===void 0)break;yield t,e+=t>65535?2:1}}function Ze(p,e){for(let t=0;t<e.length;t++)this.setUint8(p+t,e[t])}var qe={file_id:{mesgNum:0,fieldDefns:[{name:"type",number:0,type:"enum_file"},{name:"time_created",number:4,type:"date_time"}]},session:{mesgNum:18,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"},{name:"sport",number:5,type:"enum_sport"},{name:"sub_sport",number:6,type:"enum_sub_sport"},{name:"first_lap_index",number:11,type:"uint16"},{name:"num_laps",number:26,type:"uint16"}]},lap:{mesgNum:19,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"end_position_lat",number:5,type:"semicircles"},{name:"end_position_long",number:6,type:"semicircles"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"}]},record:{mesgNum:20,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"position_lat",number:0,type:"semicircles"},{name:"position_long",number:1,type:"semicircles"},{name:"altitude",number:2,type:"altitude"},{name:"distance",number:5,type:"distance"},{name:"heart_rate",number:3,type:"uint8"},{name:"cadence",number:4,type:"uint8"},{name:"speed",number:6,type:"speed"},{name:"power",number:7,type:"uint16"}]},event:{mesgNum:21,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"event",number:0,type:"enum_event"},{name:"event_type",number:1,type:"enum_event_type"},{name:"event_group",number:4,type:"uint8"}]},course:{mesgNum:31,fieldDefns:[{name:"name",number:5,type:"string"},{name:"sport",number:4,type:"enum_sport"},{name:"sub_sport",number:7,type:"enum_sub_sport"}]},activity:{mesgNum:34,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"total_timer_time",number:0,type:"seconds"},{name:"num_sessions",number:1,type:"uint16"},{name:"type",number:2,type:"enum_activity"},{name:"event",number:3,type:"enum_event"},{name:"event_type",number:4,type:"enum_event_type"},{name:"local_timestamp",number:5,type:"date_time"},{name:"event_group",number:6,type:"uint8"}]},course_point:{mesgNum:32,fieldDefns:[{name:"timestamp",number:1,type:"date_time"},{name:"position_lat",number:2,type:"semicircles"},{name:"position_long",number:3,type:"semicircles"},{name:"distance",number:4,type:"distance"},{name:"type",number:5,type:"enum_course_point"}]}},Je=(p,e)=>p.map(t=>({...t,value:e[t.name]})).filter(({value:t})=>t!==void 0),q=class p{static check(e,t,r,i){if(t===void 0)throw new Error(`Message '${e}' not known`);if(r===void 0)throw new Error(`Message '${e}' has no field definitions`);let n=r.map(o=>o.name),s=Object.keys(i).filter(o=>!n.includes(o));if(s.length)throw new Error(`Message '${e}' has no field definitions named '${s}'`)}constructor(e,t,r){let i=qe[t];if(!i)throw new Error(`Unknown message type: ${t}`);let{mesgNum:n,fieldDefns:s}=i;p.check(t,n,s,r),this.localNum=e,this.mesgNum=n,this.fields=Je(s,r)}get mesgDefn(){let e=this.fields.map(({number:t,type:r,value:i})=>{let n=ke[r];if(!n)throw new Error(`Unknown type: ${r}`);let{size:s,baseType:o}=n;return r==="string"?{number:t,size:_e(i),baseType:o}:{number:t,size:s,baseType:o}});return{localNum:this.localNum,mesgNum:this.mesgNum,fieldDefns:e}}isSameDefn(e){let t=(o,a)=>o.number===a.number&&o.size===a.size&&o.baseType===a.baseType,r=(o,a)=>o.length===a.length&&o.every((c,d)=>t(c,a[d])),{localNum:i,mesgNum:n,fieldDefns:s}=this.mesgDefn;return n===e.mesgNum&&i===e.localNum&&r(s,e.fieldDefns)}get defnRecord(){let{localNum:e,mesgNum:t,fieldDefns:r}=this.mesgDefn,i=6+3*r.length,n=new DataView(new ArrayBuffer(i));n.setUint8(0,64|e),n.setUint8(2,1),n.setUint16(3,t),n.setUint8(5,r.length);let s=6;for(let o of r)n.setUint8(s++,o.number),n.setUint8(s++,o.size),n.setUint8(s++,o.baseType);return n.buffer}get dataRecord(){let{fieldDefns:e}=this.mesgDefn,t=1+e.reduce((n,{size:s})=>n+s,0),r=new DataView(new ArrayBuffer(t));r.setUint8(0,this.localNum);let i=1;for(let{number:n,type:s,value:o}of this.fields){let a=ke[s];if(!a)throw new Error(`Unknown type: ${s}`);let{size:c,setValue:d}=a,l;"mapValue"in a?l=a.mapValue(o):l=o,d&&d.call(r,i,l),i+=c}return r.buffer}};var Qe=[0,52225,55297,5120,61441,15360,10240,58369,40961,27648,30720,46081,20480,39937,34817,17408],Oe=(p,e)=>(p>>>4^Qe[p&15^e])&65535,et=(p,e,t)=>Oe(Oe(p,e),t),tt=(p,e)=>et(p,e&15,e>>>4);function Fe(p,e=0){let t=e,r=p instanceof ArrayBuffer?new Uint8Array(p):p;for(let i=0;i<r.length;i++)t=tt(t,r[i]);return t}import rt from"dayjs";var $e=14,nt=16,it=2078,st=776358228,A=class{constructor(e={}){this.localNum={};this.mesgDefn=[];this.messages=[];this.options={compact:e.compact??!0,defaultActivity:e.defaultActivity??"cycling",defaultSubActivity:e.defaultSubActivity??"generic"}}async encode(e){return this.reset(),this.buildFITContent(e,"activity"),Buffer.from(await this.blob.arrayBuffer())}async encodeCourse(e){return this.reset(),this.buildFITContent(e,"course"),Buffer.from(await this.blob.arrayBuffer())}async encodeToBlob(e,t="activity"){return this.reset(),this.buildFITContent(e,t),this.blob}reset(){this.localNum={},this.mesgDefn=[],this.messages=[]}buildFITContent(e,t){this.buildFileId(e,t),t==="course"?this.buildCourseContent(e):this.buildActivityContent(e)}buildActivityContent(e){let t=e.sessionMesgs||[];if(t.length===0)throw new Error("Activity file must contain at least one Session");let r=0,i=[],n=[];for(let s of t){if(s.lapMesgs&&this.buildEventsFromLaps(s.lapMesgs,i),s.lapMesgs)for(let o of s.lapMesgs)o.recordMesgs&&this.buildRecords(o.recordMesgs);s.lapMesgs&&this.buildLaps(s.lapMesgs),this.buildSession(s),r++,this.buildActivityFromSession(s,n)}i.forEach(s=>this.buildEvent(s)),n.forEach(s=>this.buildActivity(s))}buildCourseContent(e){let t=e.sessionMesgs||[];if(t.length===0)throw new Error("Course file must contain track data");let r=t[0];if(this.buildCourse({name:"course",sport:this.options.defaultActivity}),r.lapMesgs){let i=[];for(let o of r.lapMesgs)o.recordMesgs&&i.push(...o.recordMesgs);i.sort((o,a)=>o.timestamp&&a.timestamp?new Date(o.timestamp).getTime()-new Date(a.timestamp).getTime():(o.distance||0)-(a.distance||0));let n=i[0],s=i[i.length-1];if(r.startTime&&this.buildEvent({timestamp:r.startTime,event:"timer",eventType:"start",eventGroup:0}),i.forEach(o=>this.buildRecord(o)),s.timestamp&&this.buildEvent({timestamp:s.timestamp,event:"timer",eventType:"stop_all",eventGroup:0}),r.lapMesgs)for(let o=0;o<r.lapMesgs.length;o++)this.buildLap(r.lapMesgs[o])}}buildFileId(e,t){var i;let r=((i=e.fileIdMesgs)==null?void 0:i[0])||{};this.writeMesg("file_id",{type:t,time_created:r.timeCreated?this.parseTimestamp(r.timeCreated):Date.now(),manufacturer:r.manufacturer,product:r.product,serial_number:r.serialNumber})}buildSession(e){var t;this.writeMesg("session",{timestamp:e.timestamp?e.timestamp:void 0,start_time:e.startTime?e.startTime:void 0,total_elapsed_time:e.totalElapsedTime,total_timer_time:e.totalTimerTime,start_position_lat:this.convertToSemicircles(e.startPositionLat),start_position_long:this.convertToSemicircles(e.startPositionLong),total_distance:e.totalDistance,total_ascent:e.totalAscent,total_descent:e.totalDescent,sport:e.sport||this.options.defaultActivity,sub_sport:e.subSport||this.options.defaultSubActivity,first_lap_index:e.firstLapIndex||0,num_laps:e.numLaps||((t=e.lapMesgs)==null?void 0:t.length)||1})}buildLaps(e){e.forEach(t=>this.buildLap(t))}buildLap(e){this.writeMesg("lap",{timestamp:e.timestamp?e.timestamp:void 0,start_time:e.startTime?e.startTime:void 0,start_position_lat:this.convertToSemicircles(e.startPositionLat),start_position_long:this.convertToSemicircles(e.startPositionLong),end_position_lat:this.convertToSemicircles(e.endPositionLat),end_position_long:this.convertToSemicircles(e.endPositionLong),total_elapsed_time:e.totalElapsedTime,total_timer_time:e.totalTimerTime,total_distance:e.totalDistance,total_ascent:e.totalAscent,total_descent:e.totalDescent})}buildRecords(e){e.forEach(t=>this.buildRecord(t))}buildRecord(e){this.writeMesg("record",{timestamp:e.timestamp?e.timestamp:void 0,position_lat:this.convertToSemicircles(e.positionLat),position_long:this.convertToSemicircles(e.positionLong),altitude:e.enhancedAltitude||e.altitude,distance:e.distance,heart_rate:e.heartRate,cadence:e.cadence,speed:e.enhancedSpeed||e.speed,power:e.power})}buildEvent(e){this.writeMesg("event",{timestamp:e.timestamp?e.timestamp:void 0,event:e.event,event_type:e.eventType,event_group:e.eventGroup})}buildActivity(e){this.writeMesg("activity",{timestamp:e.timestamp?e.timestamp:void 0,total_timer_time:e.totalTimerTime,num_sessions:e.numSessions,type:e.type,event:e.event,event_type:e.eventType,local_timestamp:e.localTimestamp?this.parseTimestamp(e.localTimestamp):void 0,event_group:e.eventGroup})}buildCourse(e){this.writeMesg("course",{name:e.name,sport:e.sport})}buildEventsFromLaps(e,t){e.forEach((r,i)=>{r.startTime&&t.push({timestamp:r.startTime,event:"timer",eventType:"start",eventGroup:i}),r.timestamp&&t.push({timestamp:r.timestamp,event:"timer",eventType:i===e.length-1?"stop_all":"stop",eventGroup:i})})}buildActivityFromSession(e,t){t.push({timestamp:e.timestamp,totalTimerTime:e.totalTimerTime,numSessions:1,type:e.sport||this.options.defaultActivity,event:"activity",eventType:"stop",eventGroup:0})}parseTimestamp(e){return typeof e=="number"?e:rt(e).valueOf()}convertToSemicircles(e){if(e!=null)return Math.round(e*2**31/180)}validateRequiredFields(e){if(!e.sessionMesgs||e.sessionMesgs.length===0)throw new Error("FIT file must contain at least one Session")}writeMesg(e,t){let r=Object.fromEntries(Object.entries(t).filter(([o,a])=>a!==void 0));if(Object.keys(r).length===0)return;let i=this.localNum[e];i===void 0&&(i=this.localNum[e]=Object.keys(this.localNum).length);let n=new q(i,e,r),s=this.mesgDefn[i];(!s||!n.isSameDefn(s))&&(this.messages.push(n.defnRecord),this.mesgDefn[i]=n.mesgDefn),this.messages.push(n.dataRecord)}get blob(){let e=[this.header,...this.messages,this.trailer];return new Blob(e,{type:"application/octet-stream"})}get dataLen(){return this.messages.reduce((e,t)=>e+t.byteLength,0)}get dataCrc(){return this.messages.reduce((e,t)=>Fe(t,e),0)}get header(){let e=new DataView(new ArrayBuffer($e));return e.setUint8(0,$e),e.setUint8(1,nt),e.setUint16(2,it,!0),e.setUint32(4,this.dataLen,!0),e.setUint32(8,st),e.setUint16(12,Fe(e.buffer.slice(0,12)),!0),e.buffer}get trailer(){let e=new DataView(new ArrayBuffer(2));return e.setUint16(0,this.dataCrc,!0),e.buffer}async encoder(e){return this.encode(e)}};var h=class{constructor(){this.version="1.0.0";this.priority=100}supports(e){return this.supportedTags.includes(e)}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}parseFloat(e){if(!(typeof e>"u"))return typeof e=="number"?e:typeof e=="string"&&parseFloat(e)||0}parseInt(e){return typeof e=="number"?Math.floor(e):typeof e=="string"&&parseInt(e,10)||0}parseString(e){return String(e||"")}parseBoolean(e){return typeof e=="boolean"?e:typeof e=="string"?e.toLowerCase()==="true":!1}parseDate(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}hasRequiredAttributes(e,t){return t.every(r=>{var i;return(i=e.attributes)==null?void 0:i[r]})}extractAttributes(e,t,r){e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{let s=r[i];s&&s in t&&(t[s]=String(n||""))})}processChildren(e,t,r){var i;(i=e.children)==null||i.forEach(n=>{let s=r[n.tag];s&&s(n,t)})}getChildValue(e,t){var i;let r=(i=e.children)==null?void 0:i.find(n=>n.tag===t);return r!=null&&r.value?String(r.value):void 0}getChildByTag(e,t){var r;return(r=e.children)==null?void 0:r.find(i=>i.tag===t)}getChildrenByTag(e,t){var r;return((r=e.children)==null?void 0:r.filter(i=>i.tag===t))||[]}convertExtensions(e){var r;let t={};return(r=e.children)==null||r.forEach(i=>{t[i.tag]=this.convertExtensionContent(i)}),t}convertExtensionContent(e){var t;if((t=e.children)!=null&&t.length){let r={};return e.children.forEach(i=>{r[i.tag]=this.convertExtensionContent(i)}),r}else return e.value}},b=class{constructor(){this.version="1.0.0";this.description=""}async initialize(e){}async destroy(e){}async validate(e){return!0}async onTokenize(e,t){return e}async onAstGenerate(e,t){return e}async onConvert(e,t){return e}async onComplete(e,t){return e}async onError(e,t){}};var m=class extends h{parseCoordinate(e){let t=this.parseFloat(e);return t===0?void 0:t}parseGPXTime(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}extractNumericAttributes(e,t,r){e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{let s=r[i];s&&s in t&&typeof n<"u"&&(t[s]=this.parseFloat(n))})}},$=class extends b{async onError(e,t){t.warnings.push(`Middleware ${this.name} error: ${e.message}`)}};var J=class extends m{constructor(){super(...arguments);this.name="wpt-converter";this.supportedTags=["wpt","trkpt","rtept"];this.version="1.0.0"}convert(t,r){var n,s;if(!this.hasRequiredAttributes(t,["lat","lon"]))return;let i={lat:this.parseFloat((n=t.attributes)==null?void 0:n.lat),lon:this.parseFloat((s=t.attributes)==null?void 0:s.lon)};return this.processChildren(t,i,{ele:(o,a)=>a.ele=this.parseFloat(o.value),time:(o,a)=>a.time=new Date(this.parseString(o.value)),speed:(o,a)=>a.speed=this.parseFloat(o.value),power:(o,a)=>a.power=this.parseFloat(o.value),cadence:(o,a)=>a.cadence=this.parseFloat(o.value),heartRate:(o,a)=>a.heartRate=this.parseFloat(o.value),course:(o,a)=>a.course=this.parseFloat(o.value),name:(o,a)=>a.name=this.parseString(o.value),cmt:(o,a)=>a.cmt=this.parseString(o.value),desc:(o,a)=>a.desc=this.parseString(o.value),src:(o,a)=>a.src=this.parseString(o.value),sym:(o,a)=>a.sym=this.parseString(o.value),type:(o,a)=>a.type=this.parseString(o.value),fix:(o,a)=>a.fix=this.parseString(o.value),sat:(o,a)=>a.sat=this.parseString(o.value),hdop:(o,a)=>a.hdop=this.parseFloat(o.value),vdop:(o,a)=>a.vdop=this.parseFloat(o.value),pdop:(o,a)=>a.pdop=this.parseFloat(o.value),ageofdgpsdata:(o,a)=>a.ageofdgpsdata=this.parseFloat(o.value),geoidheight:(o,a)=>a.geoidheight=this.parseFloat(o.value),magvar:(o,a)=>a.magvar=this.parseFloat(o.value),dgpsid:(o,a)=>a.dgpsid=this.parseFloat(o.value),extensions:(o,a)=>{let c=r.metadata.get("decoder"),d=c==null?void 0:c.getConverter("extensions");if(d){let l=d.convert(o,r);l&&(this.mapExtensionsToPoint(l,a),a.extensions=l)}},link:(o,a)=>{var l;a.link||(a.link=[]);let c=r.metadata.get("decoder"),d=(l=c==null?void 0:c.getConverter("link"))==null?void 0:l.convert(o,r);d&&a.link&&a.link.push(d)}}),i}mapExtensionsToPoint(t,r){Object.entries(t).forEach(([i,n])=>{if(n!==void 0&&(typeof n=="string"||typeof n=="number")){let s=o=>(Array.isArray(o)?o:[o]).some(c=>{let d=i.toLowerCase(),l=c.toLowerCase();return d===l||d.endsWith(`:${l}`)});s("speed")?r.speed=this.parseFloat(n):s("hr")?r.heartRate=this.parseFloat(n):s(["cad","cadence"])?r.cadence=this.parseFloat(n):s(["PowerInWatts","power"])&&(r.power=this.parseFloat(n))}})}},Q=class extends m{constructor(){super(...arguments);this.name="rte-converter";this.supportedTags=["rte"]}convert(t,r){let i={rtept:[]};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),cmt:(n,s)=>s.cmt=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),src:(n,s)=>s.src=this.parseString(n.value),number:(n,s)=>s.number=this.parseFloat(n.value),type:(n,s)=>s.type=this.parseString(n.value),rtept:(n,s)=>{var c;let o=r.metadata.get("decoder"),a=(c=o==null?void 0:o.getConverter("wpt"))==null?void 0:c.convert(n,r);a&&s.rtept&&s.rtept.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var a;s.link||(s.link=[]);let o=r.metadata.get("decoder");(a=n.children)==null||a.forEach(c=>{var l;let d=(l=o==null?void 0:o.getConverter("link"))==null?void 0:l.convert(c,r);d&&s.link&&s.link.push(d)})}}),i}},ee=class extends m{constructor(){super(...arguments);this.name="trk-converter";this.supportedTags=["trk"]}convert(t,r){let i={trkseg:[]};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),cmt:(n,s)=>s.cmt=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),src:(n,s)=>s.src=this.parseString(n.value),number:(n,s)=>s.number=this.parseFloat(n.value),type:(n,s)=>s.type=this.parseString(n.value),trkseg:(n,s)=>{var c;let o=r.metadata.get("decoder"),a=(c=o==null?void 0:o.getConverter("trkseg"))==null?void 0:c.convert(n,r);a&&s.trkseg&&s.trkseg.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var a;s.link||(s.link=[]);let o=r.metadata.get("decoder");(a=n.children)==null||a.forEach(c=>{var l;let d=(l=o==null?void 0:o.getConverter("link"))==null?void 0:l.convert(c,r);d&&s.link&&s.link.push(d)})}}),i}},te=class extends m{constructor(){super(...arguments);this.name="trkseg-converter";this.supportedTags=["trkseg"]}convert(t,r){let i={trkpt:[]};return this.processChildren(t,i,{trkpt:(n,s)=>{var c;let o=r.metadata.get("decoder"),a=(c=o==null?void 0:o.getConverter("wpt"))==null?void 0:c.convert(n,r);a&&s.trkpt&&s.trkpt.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))}}),i}},re=class extends m{constructor(){super(...arguments);this.name="link-converter";this.supportedTags=["link"]}convert(t,r){var n;let i={};return(n=t.attributes)!=null&&n.href&&(i.href=t.attributes.href),this.processChildren(t,i,{text:(s,o)=>o.text=this.parseString(s.value),type:(s,o)=>o.type=this.parseString(s.value)}),i}},ne=class extends m{constructor(){super(...arguments);this.name="metadata-converter";this.supportedTags=["metadata"]}convert(t,r){let i={};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),keywords:(n,s)=>s.keywords=this.parseString(n.value),time:(n,s)=>s.time=new Date(this.parseString(n.value)),author:(n,s)=>{var a;let o=r.metadata.get("decoder");s.author=(a=o==null?void 0:o.getConverter("author"))==null?void 0:a.convert(n,r)},copyright:(n,s)=>{var a;let o=r.metadata.get("decoder");s.copyright=(a=o==null?void 0:o.getConverter("copyright"))==null?void 0:a.convert(n,r)},bounds:(n,s)=>{var a;let o=r.metadata.get("decoder");s.bounds=(a=o==null?void 0:o.getConverter("bounds"))==null?void 0:a.convert(n,r)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var c;s.link||(s.link=[]);let o=r.metadata.get("decoder"),a=(c=o==null?void 0:o.getConverter("link"))==null?void 0:c.convert(n,r);a&&s.link&&s.link.push(a)}}),i}},ie=class extends m{constructor(){super(...arguments);this.name="person-converter";this.supportedTags=["author"]}convert(t,r){var n;let i={};return t.value&&!((n=t.children)!=null&&n.length)?(i.name=this.parseString(t.value),i):(this.processChildren(t,i,{name:(s,o)=>o.name=this.parseString(s.value),email:(s,o)=>{var c;let a=r.metadata.get("decoder");o.email=(c=a==null?void 0:a.getConverter("email"))==null?void 0:c.convert(s,r)},link:(s,o)=>{var c;let a=r.metadata.get("decoder");o.link=(c=a==null?void 0:a.getConverter("link"))==null?void 0:c.convert(s,r)}}),i)}},se=class extends m{constructor(){super(...arguments);this.name="email-converter";this.supportedTags=["email"]}convert(t,r){let i={};return this.processChildren(t,i,{id:(n,s)=>s.id=this.parseString(n.value),domain:(n,s)=>s.domain=this.parseString(n.value)}),i}},oe=class extends m{constructor(){super(...arguments);this.name="copyright-converter";this.supportedTags=["copyright"]}convert(t,r){var n;let i={};return(n=t.attributes)!=null&&n.author&&(i.author=t.attributes.author),this.processChildren(t,i,{year:(s,o)=>o.year=this.parseString(s.value),license:(s,o)=>o.license=this.parseString(s.value)}),i}},ae=class extends m{constructor(){super(...arguments);this.name="bounds-converter";this.supportedTags=["bounds"]}convert(t,r){let i={};return this.extractAttributes(t,i,{minlat:"minlat",minlon:"minlon",maxlat:"maxlat",maxlon:"maxlon"}),i}},ce=class extends m{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["extensions"]}convert(t,r){var n;let i={};return(n=t.children)==null||n.forEach(s=>{this.flattenExtensionElement(s,i)}),i}flattenExtensionElement(t,r){var i,n;if(!((i=t.children)!=null&&i.length)&&t.value!==void 0){r[t.tag]=this.parseExtensionValue(t.value);return}(n=t.children)!=null&&n.length&&t.children.forEach(s=>{this.flattenExtensionElement(s,r)})}parseExtensionValue(t){if(t===void 0)return;let r=String(t),i=parseFloat(r);return!isNaN(i)&&isFinite(i)?i:r}};import{Parser as ot}from"htmlparser2";var me=(i=>(i.TOKENIZE="tokenize",i.AST_GENERATE="ast_generate",i.CONVERT="convert",i.COMPLETE="complete",i))(me||{}),pe=class{constructor(){this.stage="tokenize"}async process(e){let t=Date.now();if(!e.xmlContent)throw new Error("XML content cannot be empty");let r=[],i=new ot({onopentag(n,s){r.push({type:"open",tag:n,attributes:s})},ontext(n){let s=n.replace(/\n/g,"").trim();s&&r.push({type:"text",tag:"text",value:s})},onclosetag(n){r.push({type:"close",tag:n})}},{xmlMode:!0});return i.write(e.xmlContent),i.end(),e.tokens=r,e.performance.tokenizeTime=Date.now()-t,e}},de=class{constructor(){this.stage="ast_generate"}async process(e){var s;let t=Date.now();if(!e.tokens)throw new Error("Tokens cannot be empty");let r=[],i,n=null;for(let o of e.tokens)if(o.type==="open"){let a={tag:o.tag,attributes:o.attributes||{},children:[]};i?n&&((s=n.children)==null||s.push(a)):i=a,r.push(a),n=a}else o.type==="text"&&n?n.value=o.value:o.type==="close"&&(r.pop(),n=r[r.length-1]||null);return e.ast=i,e.performance.astTime=Date.now()-t,e}},le=class{constructor(e){this.getConverter=e;this.stage="convert"}async process(e){var i;let t=Date.now();if(!e.ast)throw new Error("AST cannot be empty");let r={};return e.ast.attributes&&Object.entries(e.ast.attributes).forEach(([n,s])=>{n.startsWith("xmlns:")?r[n]=s.replace(/&#39;/g,"'"):n==="xsi:schemaLocation"?r[n]=s.replace(/&#39;/g,"'"):r[n]=s}),(i=e.ast.children)==null||i.forEach(n=>{let s=this.getConverter(n.tag);try{let o=s.convert(n,e);o&&this.assignResult(r,n.tag,o)}catch(o){e.errors.push(o)}}),e.result=r,e.performance.convertTime=Date.now()-t,e}assignResult(e,t,r){switch(t){case"metadata":e.metadata=r;break;case"wpt":e.wpt||(e.wpt=[]),e.wpt.push(r);break;case"rte":e.rte||(e.rte=[]),e.rte.push(r);break;case"trk":e.trk||(e.trk=[]),e.trk.push(r);break;case"extensions":e.extensions=r;break}}},ue=class{constructor(){this.stage="complete"}async process(e){e.performance.endTime=Date.now();let t=e.performance.endTime-e.performance.startTime;return e.metadata.set("performance",{totalTime:t,tokenizeTime:e.performance.tokenizeTime,astTime:e.performance.astTime,convertTime:e.performance.convertTime}),e}};var F=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultConvertersRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new pe,new de,new le(e=>this.getConverter(e)),new ue]}async registerDefaultConverters(){var t;if(this.defaultConvertersRegistered)return;let e=[new J,new Q,new ee,new te,new re,new ne,new ie,new se,new oe,new ae,new ce];for(let r of e)(t=r.supportedTags)==null||t.forEach(i=>{this.addConverterForTag(i,r)}),this.registeredPlugins.add(r.name);this.defaultConvertersRegistered=!0}addConverterForTag(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}async registerConverter(e){var r,n;if(this.registeredPlugins.has(e.name))throw new Error(`Converter plugin ${e.name} already exists`);(r=e.supportedTags)==null||r.forEach(s=>{this.addConverterForTag(s,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";(n=e.supportedTags)==null||n.forEach(s=>{let a=(this.converterPlugins.get(s)||[]).map(c=>`${c.name}(${c.priority||100})`)})}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:this.middlewarePlugins.push(e);let r=[];e.onTokenize&&r.push("onTokenize"),e.onAstGenerate&&r.push("onAstGenerate"),e.onConvert&&r.push("onConvert"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getAllConverters(e){return this.converterPlugins.get(e)||[]}unregisterConverter(e){let t;for(let[r,i]of this.converterPlugins){let n=i.findIndex(s=>s.name===e);n!==-1&&(t=i[n],i.splice(n,1),i.length===0&&this.converterPlugins.delete(r))}t&&this.registeredPlugins.delete(e)}unregisterMiddleware(e){let t=this.middlewarePlugins.findIndex(r=>r.name===e);t!==-1&&this.middlewarePlugins.splice(t,1)}listConverters(){return Array.from(this.converterPlugins.keys())}listConverterPlugins(){return Array.from(this.registeredPlugins)}listMiddlewares(){return this.middlewarePlugins.map(e=>e.name)}listProcessors(){return this.processors.map(e=>e.constructor.name)}getConverterDetails(e){let t={};if(e){let r=this.converterPlugins.get(e);r&&(t[e]=r.map(i=>({name:i.name,priority:i.priority||100})))}else for(let[r,i]of this.converterPlugins)t[r]=i.map(n=>({name:n.name,priority:n.priority||100}));return t}getMiddlewareDetails(){return this.middlewarePlugins.map(e=>{let t=[];return e.onTokenize&&t.push("onTokenize"),e.onAstGenerate&&t.push("onAstGenerate"),e.onConvert&&t.push("onConvert"),e.onComplete&&t.push("onComplete"),e.onError&&t.push("onError"),{name:e.name,hooks:t}})}async initialize(){var r;if(this.initialized)return;await this.registerDefaultConverters();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parserByBuffer(e){var r;await this.initialize();let t=this.createContext();t.rawData=e,t.xmlContent=e.toString("utf-8"),t.metadata.set("decoder",this);try{for(let i of this.processors)try{switch(t=await i.process(t),i.stage){case"tokenize":t.tokens&&(t.tokens=await this.executeMiddlewareHook("onTokenize",t.tokens,t));break;case"ast_generate":t.ast&&(t.ast=await this.executeMiddlewareHook("onAstGenerate",t.ast,t));break;case"convert":t.result&&(t.result=await this.executeMiddlewareHook("onConvert",t.result,t));break;case"complete":t.result&&(t.result=await this.executeMiddlewareHook("onComplete",t.result,t));break}}catch(n){t.errors.push(n);for(let s of this.middlewarePlugins)await((r=s.onError)==null?void 0:r.call(s,n,t))}return t.result}catch(i){throw i}}convertExtensions(e){var s,o;let t={},{attributes:r,tag:i,value:n}=e;if(r&&Object.entries(r).forEach(([a,c])=>{t[a]=c}),(s=e==null?void 0:e.children)!=null&&s.length)(o=e.children)==null||o.forEach(a=>{t[a.tag]=this.convertExtensions(a)});else if(n!==void 0)return n;return t}};import Ge from"dayjs";import at from"dayjs/plugin/utc.js";var Se={temperature:"atemp",wtemp:"wtemp",heartRate:"hr",cadence:"cad"};var De={temperature:"Temperature",Depth:"Depth"};Ge.extend(at);var S=class{constructor(e={}){this.formatElevation=e=>{let t=parseFloat(e);return isNaN(t)?e:this.roundTo(t,2).toString()};this.compact=e.compact??!0}async encode(e){let t=this.buildGPXXML(e);return Buffer.from(t,"utf-8")}encodeToString(e){return this.buildGPXXML(e)}buildGPXXML(e){let t=this.buildXMLHeader(),r=this.buildGPXContent(e),n=`${t}${r}
1
+ var K=class{constructor(){this.stage="parse"}async process(e){let t=Date.now();if(!e.rawData)throw new Error("FIT data cannot be empty");try{let r=await this.parseWithFitSDK(e.rawData);return e.rawMessages=r,e.performance.parseTime=Date.now()-t,e}catch(r){throw new Error(`FIT parsing failed: ${r.message}`)}}async parseWithFitSDK(e){let{Decoder:t,Stream:r}=await import("@garmin/fitsdk"),i=r.fromBuffer(e);if(!t.isFIT(i))throw new Error("Not a valid FIT file");let n=new t(i),{messages:s,errors:o}=n.read();return o&&o.length>0,s}},N=class{constructor(e){this.getConverters=e;this.stage="extract"}async process(e){let t=Date.now();if(!e.rawMessages)throw new Error("Raw messages cannot be empty");let r={};for(let[i,n]of Object.entries(e.rawMessages)){if(!Array.isArray(n)||n.length===0){r[i]=n;continue}let s=this.getConverters(i);if(s.length===0)r[i]=n;else{let o=s[0];try{let a=o.convertMessages(n,e);r[i]=a}catch(a){e.errors.push(a),r[i]=n}}}return e.rawMessages=r,e.performance.extractTime=Date.now()-t,e}},Y=class{constructor(e){this.getStructurePlugins=e;this.stage="structure"}async process(e){let t=Date.now();if(!e.rawMessages)throw new Error("Message data cannot be empty");let r={},i=this.getStructurePlugins();for(let n of i)try{let s=n.structureData(e.rawMessages,e);r={...r,...s}}catch(s){e.errors.push(s)}return e.result=r,e.performance.structureTime=Date.now()-t,e}},Z=class{constructor(){this.stage="complete"}async process(e){e.performance.endTime=Date.now();let t=e.performance.endTime-e.performance.startTime;return e.metadata.set("performance",{totalTime:t,parseTime:e.performance.parseTime,extractTime:e.performance.extractTime,structureTime:e.performance.structureTime}),e.stats&&(e.stats.endTime=Date.now(),e.rawMessages&&(e.stats.processedTokens=this.countTotalMessages(e.rawMessages))),e}countTotalMessages(e){let t=0;return Object.values(e).forEach(r=>{Array.isArray(r)&&(t+=r.length)}),t}};import x from"dayjs";var v=class{constructor(){this.version="1.0.0";this.priority=100}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}};var L=class extends v{constructor(){super(...arguments);this.name="SessionStructurePlugin";this.priority=10}structureData(t,r){let{sessionMesgs:i,lapMesgs:n,recordMesgs:s}=t;return i!=null&&i.length?{sessionMesgs:i.map(a=>{let p=x(a.startTime).valueOf(),d=p+a.totalElapsedTime*1e3,X=((n==null?void 0:n.filter(m=>{let g=x(m.startTime).valueOf(),R=g+(m.totalElapsedTime??0)*1e3;return g>=p&&R<=d}))||[]).map(m=>{let g=x(m.startTime).valueOf(),R=g+(m.totalElapsedTime??0)*1e3,j=(s==null?void 0:s.filter(Ke=>{let Le=x(Ke.timestamp).valueOf();return Le>=g&&Le<R}))||[];return{...m,recordMesgs:j,messageIndex:m.messageIndex!==void 0?m.messageIndex:0}});return{...a,lapMesgs:X,messageIndex:a.messageIndex!==void 0?a.messageIndex:0}})}:{}}},_=class extends v{constructor(){super(...arguments);this.name="CourseStructurePlugin";this.priority=10}structureData(t,r){let{courseMesgs:i,lapMesgs:n,recordMesgs:s}=t;if(!(i!=null&&i.length))return{};let o=2e3;return{courseMesgs:i.map(p=>{let d=(n==null?void 0:n.map(l=>{let X=x(l.startTime).valueOf(),m=x(l.timestamp).valueOf(),g=(s==null?void 0:s.filter(R=>{let j=x(R.timestamp).valueOf();return j>=X-o&&j<=m+o}))||[];return{...l,recordMesgs:g}}))||[];return{...p,lapMesgs:d}})}}},M=class extends v{constructor(){super(...arguments);this.name="FileHeaderPlugin";this.priority=1}structureData(t,r){let{fileIdMesgs:i}=t;if(i!=null&&i.length&&i[0]){let n=i[0];r.fileHeader={type:n.type,manufacturer:n.manufacturer,product:n.product}}return{}}};var C=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.structurePlugins=[];this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultPluginsRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new K,new N(e=>this.getConverters(e)),new Y(()=>this.structurePlugins),new Z]}async registerDefaultPlugins(){if(this.defaultPluginsRegistered)return;let e=[new M,new L,new _];for(let t of e)this.addStructurePlugin(t),this.registeredPlugins.add(t.name);this.defaultPluginsRegistered=!0}addConverterForMessageType(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}addStructurePlugin(e){this.structurePlugins.push(e),this.structurePlugins.sort((t,r)=>(t.priority||100)-(r.priority||100))}async registerMessageConverter(e){if(this.registeredPlugins.has(e.name))throw new Error(`Message converter plugin ${e.name} already exists`);e.supportedMessageTypes.forEach(r=>{this.addConverterForMessageType(r,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";e.supportedMessageTypes.forEach(r=>{let n=(this.converterPlugins.get(r)||[]).map(s=>`${s.name}(${s.priority||100})`)})}async registerStructurePlugin(e){if(this.registeredPlugins.has(e.name))throw new Error(`Structure plugin ${e.name} already exists`);this.addStructurePlugin(e),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:""}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:(this.middlewarePlugins.push(e),this.middlewarePlugins.sort((i,n)=>(i.priority||100)-(n.priority||100)));let r=[];e.onParse&&r.push("onParse"),e.onExtractMessages&&r.push("onExtractMessages"),e.onStructure&&r.push("onStructure"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getConverters(e){return this.converterPlugins.get(e)||[]}unregisterPlugin(e){if(!this.registeredPlugins.has(e))return!1;for(let[i,n]of this.converterPlugins){let s=n.findIndex(o=>o.name===e);s!==-1&&(n.splice(s,1),n.length===0&&this.converterPlugins.delete(i))}let t=this.structurePlugins.findIndex(i=>i.name===e);t!==-1&&this.structurePlugins.splice(t,1);let r=this.middlewarePlugins.findIndex(i=>i.name===e);return r!==-1&&this.middlewarePlugins.splice(r,1),this.registeredPlugins.delete(e),!0}async initialize(){var r;if(this.initialized)return;await this.registerDefaultPlugins();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.structurePlugins,...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parseByBuffer(e,t={}){var i;await this.initialize();let r=this.createContext();r.rawData=e,r.userData=t.userData,r.metadata.set("decoder",this);try{for(let n of this.processors)try{switch(r=await n.process(r),n.stage){case"parse":r.rawData&&(r.rawData=await this.executeMiddlewareHook("onParse",r.rawData,r));break;case"extract":r.rawMessages&&(r.rawMessages=await this.executeMiddlewareHook("onExtractMessages",r.rawMessages,r));break;case"structure":r.result&&(r.result=await this.executeMiddlewareHook("onStructure",r.result,r));break;case"complete":r.result&&(r.result=await this.executeMiddlewareHook("onComplete",r.result,r));break}}catch(s){r.errors.push(s);for(let o of this.middlewarePlugins)await((i=o.onError)==null?void 0:i.call(o,s,r))}return r.result}catch(n){throw n}}};var Ne={file:{course:6,device:1,settings:2,sport:3,activity:4,workout:5,schedules:7,weight:9,totals:10,goals:11,blood_pressure:14,monitoring_a:15,activity_summary:20,monitoring_daily:28,monitoring_b:32,segment_list:35,exd_configuration:40,invalid:0},sport:{generic:0,running:1,cycling:2,transition:3,fitness_equipment:4,swimming:5,basketball:6,soccer:7,tennis:8,american_football:9,training:10,walking:11,cross_country_skiing:12,alpine_skiing:13,snowboarding:14,rowing:15,mountaineering:16,hiking:17,multisport:18,paddling:19,invalid:254},event:{timer:0,workout:3,workout_step:4,power_down:5,power_up:6,off_course:7,session:8,lap:9,course_point:10,battery:11,virtual_partner_pace:12,hr_high_alert:13,hr_low_alert:14,speed_high_alert:15,speed_low_alert:16,cad_high_alert:17,cad_low_alert:18,power_high_alert:19,power_low_alert:20,recovery_hr:21,battery_low:22,time_duration_alert:23,distance_duration_alert:24,calorie_duration_alert:25,activity:26,fitness_equipment:27,length:28,user_marker:32,sport_point:33,calibration:36,front_gear_change:42,rear_gear_change:43,rider_position_change:44,elev_high_alert:45,elev_low_alert:46,comm_timeout:47,invalid:255},event_type:{start:0,stop:1,consecutive_depreciated:2,marker:3,stop_all:4,begin_depreciated:5,end_depreciated:6,end_all_depreciated:7,stop_disable:8,stop_disable_all:9,invalid:255},course_point:{generic:0,summit:1,valley:2,water:3,food:4,danger:5,left:6,right:7,straight:8,first_aid:9,fourth_category:10,third_category:11,second_category:12,first_category:13,hors_category:14,sprint:15,left_fork:16,right_fork:17,middle_fork:18,slight_left:19,sharp_left:20,slight_right:21,sharp_right:22,u_turn:23,segment_start:24,segment_end:25,invalid:255}},P=c=>{let e=Ne[c];return{size:1,baseType:0,mapValue:t=>typeof t=="string"?e[t]??255:t,setValue:function(t,r){this.setUint8(t,r)}}},ke={enum_file:P("file"),enum_activity:P("sport"),enum_sport:P("sport"),enum_sub_sport:P("sport"),enum_event:P("event"),enum_event_type:P("event_type"),enum_course_point:P("course_point"),uint8:{size:1,baseType:2,setValue:DataView.prototype.setUint8},sint8:{size:1,baseType:1,setValue:DataView.prototype.setInt8},uint16:{size:2,baseType:132,setValue:DataView.prototype.setUint16},sint16:{size:2,baseType:131,setValue:DataView.prototype.setInt16},uint32:{size:4,baseType:134,setValue:DataView.prototype.setUint32},sint32:{size:4,baseType:133,setValue:DataView.prototype.setInt32},string:{size:0,baseType:7,mapValue:c=>Array.from(Me(c)),setValue:Ze},distance:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>Math.round(c*1e3)},speed:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:c=>Math.round(c*100)},altitude:{size:2,baseType:132,setValue:DataView.prototype.setUint16,mapValue:c=>Math.round((c+500)*5)},seconds:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>Math.round(c*1e3)},date_time:{size:4,baseType:134,setValue:DataView.prototype.setUint32,mapValue:c=>{let e;return c instanceof Date?(e=Math.floor(c.getTime()/1e3),e-631065600):typeof c=="string"?(e=Math.floor(new Date(c).getTime()/1e3),e-631065600):c<631065600?Math.floor(c):(c>9999999999?e=Math.floor(c/1e3):e=Math.floor(c),e-631065600)}},semicircles:{size:4,baseType:133,setValue:DataView.prototype.setInt32,mapValue:c=>Math.round(c/180*2147483648)}};function _e(c){return Array.from(Me(c)).length+1}function*Me(c){for(let e of Ye(c))e<128?yield e:e<2048?(yield 192|e>>6,yield 128|e&63):e<65536?(yield 224|e>>12,yield 128|e>>6&63,yield 128|e&63):(yield 240|e>>18,yield 128|e>>12&63,yield 128|e>>6&63,yield 128|e&63);yield 0}function*Ye(c){for(let e=0;e<c.length;){let t=c.codePointAt(e);if(t===void 0)break;yield t,e+=t>65535?2:1}}function Ze(c,e){for(let t=0;t<e.length;t++)this.setUint8(c+t,e[t])}var qe={file_id:{mesgNum:0,fieldDefns:[{name:"type",number:0,type:"enum_file"},{name:"time_created",number:4,type:"date_time"}]},session:{mesgNum:18,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"},{name:"sport",number:5,type:"enum_sport"},{name:"sub_sport",number:6,type:"enum_sub_sport"},{name:"first_lap_index",number:11,type:"uint16"},{name:"num_laps",number:26,type:"uint16"}]},lap:{mesgNum:19,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"start_time",number:2,type:"date_time"},{name:"start_position_lat",number:3,type:"semicircles"},{name:"start_position_long",number:4,type:"semicircles"},{name:"end_position_lat",number:5,type:"semicircles"},{name:"end_position_long",number:6,type:"semicircles"},{name:"total_elapsed_time",number:7,type:"seconds"},{name:"total_timer_time",number:8,type:"seconds"},{name:"total_distance",number:9,type:"distance"},{name:"total_ascent",number:21,type:"uint16"},{name:"total_descent",number:22,type:"uint16"}]},record:{mesgNum:20,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"position_lat",number:0,type:"semicircles"},{name:"position_long",number:1,type:"semicircles"},{name:"altitude",number:2,type:"altitude"},{name:"distance",number:5,type:"distance"},{name:"heart_rate",number:3,type:"uint8"},{name:"cadence",number:4,type:"uint8"},{name:"speed",number:6,type:"speed"},{name:"power",number:7,type:"uint16"}]},event:{mesgNum:21,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"event",number:0,type:"enum_event"},{name:"event_type",number:1,type:"enum_event_type"},{name:"event_group",number:4,type:"uint8"}]},course:{mesgNum:31,fieldDefns:[{name:"name",number:5,type:"string"},{name:"sport",number:4,type:"enum_sport"},{name:"sub_sport",number:7,type:"enum_sub_sport"}]},activity:{mesgNum:34,fieldDefns:[{name:"timestamp",number:253,type:"date_time"},{name:"total_timer_time",number:0,type:"seconds"},{name:"num_sessions",number:1,type:"uint16"},{name:"type",number:2,type:"enum_activity"},{name:"event",number:3,type:"enum_event"},{name:"event_type",number:4,type:"enum_event_type"},{name:"local_timestamp",number:5,type:"date_time"},{name:"event_group",number:6,type:"uint8"}]},course_point:{mesgNum:32,fieldDefns:[{name:"timestamp",number:1,type:"date_time"},{name:"position_lat",number:2,type:"semicircles"},{name:"position_long",number:3,type:"semicircles"},{name:"distance",number:4,type:"distance"},{name:"type",number:5,type:"enum_course_point"}]}},Je=(c,e)=>c.map(t=>({...t,value:e[t.name]})).filter(({value:t})=>t!==void 0),q=class c{static check(e,t,r,i){if(t===void 0)throw new Error(`Message '${e}' not known`);if(r===void 0)throw new Error(`Message '${e}' has no field definitions`);let n=r.map(o=>o.name),s=Object.keys(i).filter(o=>!n.includes(o));if(s.length)throw new Error(`Message '${e}' has no field definitions named '${s}'`)}constructor(e,t,r){let i=qe[t];if(!i)throw new Error(`Unknown message type: ${t}`);let{mesgNum:n,fieldDefns:s}=i;c.check(t,n,s,r),this.localNum=e,this.mesgNum=n,this.fields=Je(s,r)}get mesgDefn(){let e=this.fields.map(({number:t,type:r,value:i})=>{let n=ke[r];if(!n)throw new Error(`Unknown type: ${r}`);let{size:s,baseType:o}=n;return r==="string"?{number:t,size:_e(i),baseType:o}:{number:t,size:s,baseType:o}});return{localNum:this.localNum,mesgNum:this.mesgNum,fieldDefns:e}}isSameDefn(e){let t=(o,a)=>o.number===a.number&&o.size===a.size&&o.baseType===a.baseType,r=(o,a)=>o.length===a.length&&o.every((p,d)=>t(p,a[d])),{localNum:i,mesgNum:n,fieldDefns:s}=this.mesgDefn;return n===e.mesgNum&&i===e.localNum&&r(s,e.fieldDefns)}get defnRecord(){let{localNum:e,mesgNum:t,fieldDefns:r}=this.mesgDefn,i=6+3*r.length,n=new DataView(new ArrayBuffer(i));n.setUint8(0,64|e),n.setUint8(2,1),n.setUint16(3,t),n.setUint8(5,r.length);let s=6;for(let o of r)n.setUint8(s++,o.number),n.setUint8(s++,o.size),n.setUint8(s++,o.baseType);return n.buffer}get dataRecord(){let{fieldDefns:e}=this.mesgDefn,t=1+e.reduce((n,{size:s})=>n+s,0),r=new DataView(new ArrayBuffer(t));r.setUint8(0,this.localNum);let i=1;for(let{number:n,type:s,value:o}of this.fields){let a=ke[s];if(!a)throw new Error(`Unknown type: ${s}`);let{size:p,setValue:d}=a,l;"mapValue"in a?l=a.mapValue(o):l=o,d&&d.call(r,i,l),i+=p}return r.buffer}};var Qe=[0,52225,55297,5120,61441,15360,10240,58369,40961,27648,30720,46081,20480,39937,34817,17408],Oe=(c,e)=>(c>>>4^Qe[c&15^e])&65535,et=(c,e,t)=>Oe(Oe(c,e),t),tt=(c,e)=>et(c,e&15,e>>>4);function Fe(c,e=0){let t=e,r=c instanceof ArrayBuffer?new Uint8Array(c):c;for(let i=0;i<r.length;i++)t=tt(t,r[i]);return t}import rt from"dayjs";var $e=14,nt=16,it=2078,st=776358228,w=class{constructor(e={}){this.localNum={};this.mesgDefn=[];this.messages=[];this.options={compact:e.compact??!0,defaultActivity:e.defaultActivity??"cycling",defaultSubActivity:e.defaultSubActivity??"generic"}}async encode(e){return this.reset(),this.buildFITContent(e,"activity"),Buffer.from(await this.blob.arrayBuffer())}async encodeCourse(e){return this.reset(),this.buildFITContent(e,"course"),Buffer.from(await this.blob.arrayBuffer())}async encodeToBlob(e,t="activity"){return this.reset(),this.buildFITContent(e,t),this.blob}reset(){this.localNum={},this.mesgDefn=[],this.messages=[]}buildFITContent(e,t){this.buildFileId(e,t),t==="course"?this.buildCourseContent(e):this.buildActivityContent(e)}buildActivityContent(e){let t=e.sessionMesgs||[];if(t.length===0)throw new Error("Activity file must contain at least one Session");let r=0,i=[],n=[];for(let s of t){if(s.lapMesgs&&this.buildEventsFromLaps(s.lapMesgs,i),s.lapMesgs)for(let o of s.lapMesgs)o.recordMesgs&&this.buildRecords(o.recordMesgs);s.lapMesgs&&this.buildLaps(s.lapMesgs),this.buildSession(s),r++,this.buildActivityFromSession(s,n)}i.forEach(s=>this.buildEvent(s)),n.forEach(s=>this.buildActivity(s))}buildCourseContent(e){let t=e.sessionMesgs||[];if(t.length===0)throw new Error("Course file must contain track data");let r=t[0];if(this.buildCourse({name:"course",sport:this.options.defaultActivity}),r.lapMesgs){let i=[];for(let o of r.lapMesgs)o.recordMesgs&&i.push(...o.recordMesgs);i.sort((o,a)=>o.timestamp&&a.timestamp?new Date(o.timestamp).getTime()-new Date(a.timestamp).getTime():(o.distance||0)-(a.distance||0));let n=i[0],s=i[i.length-1];if(r.startTime&&this.buildEvent({timestamp:r.startTime,event:"timer",eventType:"start",eventGroup:0}),i.forEach(o=>this.buildRecord(o)),s.timestamp&&this.buildEvent({timestamp:s.timestamp,event:"timer",eventType:"stop_all",eventGroup:0}),r.lapMesgs)for(let o=0;o<r.lapMesgs.length;o++)this.buildLap(r.lapMesgs[o])}}buildFileId(e,t){var i;let r=((i=e.fileIdMesgs)==null?void 0:i[0])||{};this.writeMesg("file_id",{type:t,time_created:r.timeCreated?this.parseTimestamp(r.timeCreated):Date.now(),manufacturer:r.manufacturer,product:r.product,serial_number:r.serialNumber})}buildSession(e){var t;this.writeMesg("session",{timestamp:e.timestamp?e.timestamp:void 0,start_time:e.startTime?e.startTime:void 0,total_elapsed_time:e.totalElapsedTime,total_timer_time:e.totalTimerTime,start_position_lat:e.startPositionLat?this.convertToSemicircles(e.startPositionLat):void 0,start_position_long:e.startPositionLong?this.convertToSemicircles(e.startPositionLong):void 0,total_distance:e.totalDistance,total_ascent:e.totalAscent,total_descent:e.totalDescent,sport:e.sport||this.options.defaultActivity,sub_sport:e.subSport||this.options.defaultSubActivity,first_lap_index:e.firstLapIndex||0,num_laps:e.numLaps||((t=e.lapMesgs)==null?void 0:t.length)||1})}buildLaps(e){e.forEach(t=>this.buildLap(t))}buildLap(e){this.writeMesg("lap",{timestamp:e!=null&&e.timestamp?e.timestamp:void 0,start_time:e!=null&&e.startTime?e.startTime:void 0,start_position_lat:e!=null&&e.startPositionLat?this.convertToSemicircles(e.startPositionLat):void 0,start_position_long:e!=null&&e.startPositionLong?this.convertToSemicircles(e.startPositionLong):void 0,end_position_lat:e!=null&&e.endPositionLat?this.convertToSemicircles(e.endPositionLat):void 0,end_position_long:e!=null&&e.endPositionLong?this.convertToSemicircles(e.endPositionLong):void 0,total_elapsed_time:e==null?void 0:e.totalElapsedTime,total_timer_time:e==null?void 0:e.totalTimerTime,total_distance:e==null?void 0:e.totalDistance,total_ascent:e==null?void 0:e.totalAscent,total_descent:e==null?void 0:e.totalDescent})}buildRecords(e){e.forEach(t=>this.buildRecord(t))}buildRecord(e){this.writeMesg("record",{timestamp:e.timestamp,position_lat:e!=null&&e.positionLat?this.convertToSemicircles(e.positionLat):void 0,position_long:e!=null&&e.positionLong?this.convertToSemicircles(e.positionLong):void 0,altitude:(e==null?void 0:e.enhancedAltitude)||(e==null?void 0:e.altitude),distance:e==null?void 0:e.distance,heart_rate:e==null?void 0:e.heartRate,cadence:e==null?void 0:e.cadence,speed:(e==null?void 0:e.enhancedSpeed)||(e==null?void 0:e.speed),power:e==null?void 0:e.power})}buildEvent(e){this.writeMesg("event",{timestamp:e.timestamp?e.timestamp:void 0,event:e.event,event_type:e.eventType,event_group:e.eventGroup})}buildActivity(e){this.writeMesg("activity",{timestamp:e.timestamp?e.timestamp:void 0,total_timer_time:e.totalTimerTime,num_sessions:e.numSessions,type:e.type,event:e.event,event_type:e.eventType,local_timestamp:e.localTimestamp?this.parseTimestamp(e.localTimestamp):void 0,event_group:e.eventGroup})}buildCourse(e){this.writeMesg("course",{name:e.name,sport:e.sport})}buildEventsFromLaps(e,t){e.forEach((r,i)=>{r.startTime&&t.push({timestamp:r.startTime,event:"timer",eventType:"start",eventGroup:i}),r.timestamp&&t.push({timestamp:r.timestamp,event:"timer",eventType:i===e.length-1?"stop_all":"stop",eventGroup:i})})}buildActivityFromSession(e,t){t.push({timestamp:e.timestamp,totalTimerTime:e.totalTimerTime,numSessions:1,type:e.sport||this.options.defaultActivity,event:"activity",eventType:"stop",eventGroup:0})}parseTimestamp(e){return typeof e=="number"?e:rt(e).valueOf()}convertToSemicircles(e){if(e!=null)return Math.round(e*2**31/180)}validateRequiredFields(e){if(!e.sessionMesgs||e.sessionMesgs.length===0)throw new Error("FIT file must contain at least one Session")}writeMesg(e,t){let r=Object.fromEntries(Object.entries(t).filter(([o,a])=>a!==void 0));if(Object.keys(r).length===0)return;let i=this.localNum[e];i===void 0&&(i=this.localNum[e]=Object.keys(this.localNum).length);let n=new q(i,e,r),s=this.mesgDefn[i];(!s||!n.isSameDefn(s))&&(this.messages.push(n.defnRecord),this.mesgDefn[i]=n.mesgDefn),this.messages.push(n.dataRecord)}get blob(){let e=[this.header,...this.messages,this.trailer];return new Blob(e,{type:"application/octet-stream"})}get dataLen(){return this.messages.reduce((e,t)=>e+t.byteLength,0)}get dataCrc(){return this.messages.reduce((e,t)=>Fe(t,e),0)}get header(){let e=new DataView(new ArrayBuffer($e));return e.setUint8(0,$e),e.setUint8(1,nt),e.setUint16(2,it,!0),e.setUint32(4,this.dataLen,!0),e.setUint32(8,st),e.setUint16(12,Fe(e.buffer.slice(0,12)),!0),e.buffer}get trailer(){let e=new DataView(new ArrayBuffer(2));return e.setUint16(0,this.dataCrc,!0),e.buffer}async encoder(e){return this.encode(e)}};var h=class{constructor(){this.version="1.0.0";this.priority=100}supports(e){return this.supportedTags.includes(e)}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}parseFloat(e){if(!(typeof e>"u"))return typeof e=="number"?e:typeof e=="string"&&parseFloat(e)||0}parseInt(e){return typeof e=="number"?Math.floor(e):typeof e=="string"&&parseInt(e,10)||0}parseString(e){return String(e||"")}parseBoolean(e){return typeof e=="boolean"?e:typeof e=="string"?e.toLowerCase()==="true":!1}parseDate(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}hasRequiredAttributes(e,t){return t.every(r=>{var i;return(i=e.attributes)==null?void 0:i[r]})}extractAttributes(e,t,r){e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{let s=r[i];s&&s in t&&(t[s]=String(n||""))})}processChildren(e,t,r){var i;(i=e.children)==null||i.forEach(n=>{let s=r[n.tag];s&&s(n,t)})}getChildValue(e,t){var i;let r=(i=e.children)==null?void 0:i.find(n=>n.tag===t);return r!=null&&r.value?String(r.value):void 0}getChildByTag(e,t){var r;return(r=e.children)==null?void 0:r.find(i=>i.tag===t)}getChildrenByTag(e,t){var r;return((r=e.children)==null?void 0:r.filter(i=>i.tag===t))||[]}convertExtensions(e){var r;let t={};return(r=e.children)==null||r.forEach(i=>{t[i.tag]=this.convertExtensionContent(i)}),t}convertExtensionContent(e){var t;if((t=e.children)!=null&&t.length){let r={};return e.children.forEach(i=>{r[i.tag]=this.convertExtensionContent(i)}),r}else return e.value}},E=class{constructor(){this.version="1.0.0";this.description=""}async initialize(e){}async destroy(e){}async validate(e){return!0}async onTokenize(e,t){return e}async onAstGenerate(e,t){return e}async onConvert(e,t){return e}async onComplete(e,t){return e}async onError(e,t){}};var u=class extends h{parseCoordinate(e){let t=this.parseFloat(e);return t===0?void 0:t}parseGPXTime(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}extractNumericAttributes(e,t,r){e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{let s=r[i];s&&s in t&&typeof n<"u"&&(t[s]=this.parseFloat(n))})}},O=class extends E{async onError(e,t){t.warnings.push(`Middleware ${this.name} error: ${e.message}`)}};var J=class extends u{constructor(){super(...arguments);this.name="wpt-converter";this.supportedTags=["wpt","trkpt","rtept"];this.version="1.0.0"}convert(t,r){var n,s;if(!this.hasRequiredAttributes(t,["lat","lon"]))return;let i={lat:this.parseFloat((n=t.attributes)==null?void 0:n.lat),lon:this.parseFloat((s=t.attributes)==null?void 0:s.lon)};return this.processChildren(t,i,{ele:(o,a)=>a.ele=this.parseFloat(o.value),time:(o,a)=>a.time=new Date(this.parseString(o.value)),speed:(o,a)=>a.speed=this.parseFloat(o.value),power:(o,a)=>a.power=this.parseFloat(o.value),cadence:(o,a)=>a.cadence=this.parseFloat(o.value),heartRate:(o,a)=>a.heartRate=this.parseFloat(o.value),course:(o,a)=>a.course=this.parseFloat(o.value),name:(o,a)=>a.name=this.parseString(o.value),cmt:(o,a)=>a.cmt=this.parseString(o.value),desc:(o,a)=>a.desc=this.parseString(o.value),src:(o,a)=>a.src=this.parseString(o.value),sym:(o,a)=>a.sym=this.parseString(o.value),type:(o,a)=>a.type=this.parseString(o.value),fix:(o,a)=>a.fix=this.parseString(o.value),sat:(o,a)=>a.sat=this.parseString(o.value),hdop:(o,a)=>a.hdop=this.parseFloat(o.value),vdop:(o,a)=>a.vdop=this.parseFloat(o.value),pdop:(o,a)=>a.pdop=this.parseFloat(o.value),ageofdgpsdata:(o,a)=>a.ageofdgpsdata=this.parseFloat(o.value),geoidheight:(o,a)=>a.geoidheight=this.parseFloat(o.value),magvar:(o,a)=>a.magvar=this.parseFloat(o.value),dgpsid:(o,a)=>a.dgpsid=this.parseFloat(o.value),extensions:(o,a)=>{let p=r.metadata.get("decoder"),d=p==null?void 0:p.getConverter("extensions");if(d){let l=d.convert(o,r);l&&(this.mapExtensionsToPoint(l,a),a.extensions=l)}},link:(o,a)=>{var l;a.link||(a.link=[]);let p=r.metadata.get("decoder"),d=(l=p==null?void 0:p.getConverter("link"))==null?void 0:l.convert(o,r);d&&a.link&&a.link.push(d)}}),i}mapExtensionsToPoint(t,r){Object.entries(t).forEach(([i,n])=>{if(n!==void 0&&(typeof n=="string"||typeof n=="number")){let s=o=>(Array.isArray(o)?o:[o]).some(p=>{let d=i.toLowerCase(),l=p.toLowerCase();return d===l||d.endsWith(`:${l}`)});s("speed")?r.speed=this.parseFloat(n):s("hr")?r.heartRate=this.parseFloat(n):s(["cad","cadence"])?r.cadence=this.parseFloat(n):s(["PowerInWatts","power"])&&(r.power=this.parseFloat(n))}})}},Q=class extends u{constructor(){super(...arguments);this.name="rte-converter";this.supportedTags=["rte"]}convert(t,r){let i={rtept:[]};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),cmt:(n,s)=>s.cmt=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),src:(n,s)=>s.src=this.parseString(n.value),number:(n,s)=>s.number=this.parseFloat(n.value),type:(n,s)=>s.type=this.parseString(n.value),rtept:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("wpt"))==null?void 0:p.convert(n,r);a&&s.rtept&&s.rtept.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var a;s.link||(s.link=[]);let o=r.metadata.get("decoder");(a=n.children)==null||a.forEach(p=>{var l;let d=(l=o==null?void 0:o.getConverter("link"))==null?void 0:l.convert(p,r);d&&s.link&&s.link.push(d)})}}),i}},ee=class extends u{constructor(){super(...arguments);this.name="trk-converter";this.supportedTags=["trk"]}convert(t,r){let i={trkseg:[]};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),cmt:(n,s)=>s.cmt=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),src:(n,s)=>s.src=this.parseString(n.value),number:(n,s)=>s.number=this.parseFloat(n.value),type:(n,s)=>s.type=this.parseString(n.value),trkseg:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("trkseg"))==null?void 0:p.convert(n,r);a&&s.trkseg&&s.trkseg.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var a;s.link||(s.link=[]);let o=r.metadata.get("decoder");(a=n.children)==null||a.forEach(p=>{var l;let d=(l=o==null?void 0:o.getConverter("link"))==null?void 0:l.convert(p,r);d&&s.link&&s.link.push(d)})}}),i}},te=class extends u{constructor(){super(...arguments);this.name="trkseg-converter";this.supportedTags=["trkseg"]}convert(t,r){let i={trkpt:[]};return this.processChildren(t,i,{trkpt:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("wpt"))==null?void 0:p.convert(n,r);a&&s.trkpt&&s.trkpt.push(a)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))}}),i}},re=class extends u{constructor(){super(...arguments);this.name="link-converter";this.supportedTags=["link"]}convert(t,r){var n;let i={};return(n=t.attributes)!=null&&n.href&&(i.href=t.attributes.href),this.processChildren(t,i,{text:(s,o)=>o.text=this.parseString(s.value),type:(s,o)=>o.type=this.parseString(s.value)}),i}},ne=class extends u{constructor(){super(...arguments);this.name="metadata-converter";this.supportedTags=["metadata"]}convert(t,r){let i={};return this.processChildren(t,i,{name:(n,s)=>s.name=this.parseString(n.value),desc:(n,s)=>s.desc=this.parseString(n.value),keywords:(n,s)=>s.keywords=this.parseString(n.value),time:(n,s)=>s.time=new Date(this.parseString(n.value)),author:(n,s)=>{var a;let o=r.metadata.get("decoder");s.author=(a=o==null?void 0:o.getConverter("author"))==null?void 0:a.convert(n,r)},copyright:(n,s)=>{var a;let o=r.metadata.get("decoder");s.copyright=(a=o==null?void 0:o.getConverter("copyright"))==null?void 0:a.convert(n,r)},bounds:(n,s)=>{var a;let o=r.metadata.get("decoder");s.bounds=(a=o==null?void 0:o.getConverter("bounds"))==null?void 0:a.convert(n,r)},extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("extensions");a&&(s.extensions=a.convert(n,r))},link:(n,s)=>{var p;s.link||(s.link=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("link"))==null?void 0:p.convert(n,r);a&&s.link&&s.link.push(a)}}),i}},ie=class extends u{constructor(){super(...arguments);this.name="person-converter";this.supportedTags=["author"]}convert(t,r){var n;let i={};return t.value&&!((n=t.children)!=null&&n.length)?(i.name=this.parseString(t.value),i):(this.processChildren(t,i,{name:(s,o)=>o.name=this.parseString(s.value),email:(s,o)=>{var p;let a=r.metadata.get("decoder");o.email=(p=a==null?void 0:a.getConverter("email"))==null?void 0:p.convert(s,r)},link:(s,o)=>{var p;let a=r.metadata.get("decoder");o.link=(p=a==null?void 0:a.getConverter("link"))==null?void 0:p.convert(s,r)}}),i)}},se=class extends u{constructor(){super(...arguments);this.name="email-converter";this.supportedTags=["email"]}convert(t,r){let i={};return this.processChildren(t,i,{id:(n,s)=>s.id=this.parseString(n.value),domain:(n,s)=>s.domain=this.parseString(n.value)}),i}},oe=class extends u{constructor(){super(...arguments);this.name="copyright-converter";this.supportedTags=["copyright"]}convert(t,r){var n;let i={};return(n=t.attributes)!=null&&n.author&&(i.author=t.attributes.author),this.processChildren(t,i,{year:(s,o)=>o.year=this.parseString(s.value),license:(s,o)=>o.license=this.parseString(s.value)}),i}},ae=class extends u{constructor(){super(...arguments);this.name="bounds-converter";this.supportedTags=["bounds"]}convert(t,r){let i={};return this.extractAttributes(t,i,{minlat:"minlat",minlon:"minlon",maxlat:"maxlat",maxlon:"maxlon"}),i}},ce=class extends u{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["extensions"]}convert(t,r){var n;let i={};return(n=t.children)==null||n.forEach(s=>{this.flattenExtensionElement(s,i)}),i}flattenExtensionElement(t,r){var i,n;if(!((i=t.children)!=null&&i.length)&&t.value!==void 0){r[t.tag]=this.parseExtensionValue(t.value);return}(n=t.children)!=null&&n.length&&t.children.forEach(s=>{this.flattenExtensionElement(s,r)})}parseExtensionValue(t){if(t===void 0)return;let r=String(t),i=parseFloat(r);return!isNaN(i)&&isFinite(i)?i:r}};import{Parser as ot}from"htmlparser2";var me=(i=>(i.TOKENIZE="tokenize",i.AST_GENERATE="ast_generate",i.CONVERT="convert",i.COMPLETE="complete",i))(me||{}),pe=class{constructor(){this.stage="tokenize"}async process(e){let t=Date.now();if(!e.xmlContent)throw new Error("XML content cannot be empty");let r=[],i=new ot({onopentag(n,s){r.push({type:"open",tag:n,attributes:s})},ontext(n){let s=n.replace(/\n/g,"").trim();s&&r.push({type:"text",tag:"text",value:s})},onclosetag(n){r.push({type:"close",tag:n})}},{xmlMode:!0});return i.write(e.xmlContent),i.end(),e.tokens=r,e.performance.tokenizeTime=Date.now()-t,e}},de=class{constructor(){this.stage="ast_generate"}async process(e){var s;let t=Date.now();if(!e.tokens)throw new Error("Tokens cannot be empty");let r=[],i,n=null;for(let o of e.tokens)if(o.type==="open"){let a={tag:o.tag,attributes:o.attributes||{},children:[]};i?n&&((s=n.children)==null||s.push(a)):i=a,r.push(a),n=a}else o.type==="text"&&n?n.value=o.value:o.type==="close"&&(r.pop(),n=r[r.length-1]||null);return e.ast=i,e.performance.astTime=Date.now()-t,e}},le=class{constructor(e){this.getConverter=e;this.stage="convert"}async process(e){var i;let t=Date.now();if(!e.ast)throw new Error("AST cannot be empty");let r={};return e.ast.attributes&&Object.entries(e.ast.attributes).forEach(([n,s])=>{n.startsWith("xmlns:")?r[n]=s.replace(/&#39;/g,"'"):n==="xsi:schemaLocation"?r[n]=s.replace(/&#39;/g,"'"):r[n]=s}),(i=e.ast.children)==null||i.forEach(n=>{let s=this.getConverter(n.tag);try{let o=s.convert(n,e);o&&this.assignResult(r,n.tag,o)}catch(o){e.errors.push(o)}}),e.result=r,e.performance.convertTime=Date.now()-t,e}assignResult(e,t,r){switch(t){case"metadata":e.metadata=r;break;case"wpt":e.wpt||(e.wpt=[]),e.wpt.push(r);break;case"rte":e.rte||(e.rte=[]),e.rte.push(r);break;case"trk":e.trk||(e.trk=[]),e.trk.push(r);break;case"extensions":e.extensions=r;break}}},ue=class{constructor(){this.stage="complete"}async process(e){e.performance.endTime=Date.now();let t=e.performance.endTime-e.performance.startTime;return e.metadata.set("performance",{totalTime:t,tokenizeTime:e.performance.tokenizeTime,astTime:e.performance.astTime,convertTime:e.performance.convertTime}),e}};var b=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultConvertersRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new pe,new de,new le(e=>this.getConverter(e)),new ue]}async registerDefaultConverters(){var t;if(this.defaultConvertersRegistered)return;let e=[new J,new Q,new ee,new te,new re,new ne,new ie,new se,new oe,new ae,new ce];for(let r of e)(t=r.supportedTags)==null||t.forEach(i=>{this.addConverterForTag(i,r)}),this.registeredPlugins.add(r.name);this.defaultConvertersRegistered=!0}addConverterForTag(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}async registerConverter(e){var r,n;if(this.registeredPlugins.has(e.name))throw new Error(`Converter plugin ${e.name} already exists`);(r=e.supportedTags)==null||r.forEach(s=>{this.addConverterForTag(s,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";(n=e.supportedTags)==null||n.forEach(s=>{let a=(this.converterPlugins.get(s)||[]).map(p=>`${p.name}(${p.priority||100})`)})}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:this.middlewarePlugins.push(e);let r=[];e.onTokenize&&r.push("onTokenize"),e.onAstGenerate&&r.push("onAstGenerate"),e.onConvert&&r.push("onConvert"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getAllConverters(e){return this.converterPlugins.get(e)||[]}unregisterConverter(e){let t;for(let[r,i]of this.converterPlugins){let n=i.findIndex(s=>s.name===e);n!==-1&&(t=i[n],i.splice(n,1),i.length===0&&this.converterPlugins.delete(r))}t&&this.registeredPlugins.delete(e)}unregisterMiddleware(e){let t=this.middlewarePlugins.findIndex(r=>r.name===e);t!==-1&&this.middlewarePlugins.splice(t,1)}listConverters(){return Array.from(this.converterPlugins.keys())}listConverterPlugins(){return Array.from(this.registeredPlugins)}listMiddlewares(){return this.middlewarePlugins.map(e=>e.name)}listProcessors(){return this.processors.map(e=>e.constructor.name)}getConverterDetails(e){let t={};if(e){let r=this.converterPlugins.get(e);r&&(t[e]=r.map(i=>({name:i.name,priority:i.priority||100})))}else for(let[r,i]of this.converterPlugins)t[r]=i.map(n=>({name:n.name,priority:n.priority||100}));return t}getMiddlewareDetails(){return this.middlewarePlugins.map(e=>{let t=[];return e.onTokenize&&t.push("onTokenize"),e.onAstGenerate&&t.push("onAstGenerate"),e.onConvert&&t.push("onConvert"),e.onComplete&&t.push("onComplete"),e.onError&&t.push("onError"),{name:e.name,hooks:t}})}async initialize(){var r;if(this.initialized)return;await this.registerDefaultConverters();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parserByBuffer(e){var r;await this.initialize();let t=this.createContext();t.rawData=e,t.xmlContent=e.toString("utf-8"),t.metadata.set("decoder",this);try{for(let i of this.processors)try{switch(t=await i.process(t),i.stage){case"tokenize":t.tokens&&(t.tokens=await this.executeMiddlewareHook("onTokenize",t.tokens,t));break;case"ast_generate":t.ast&&(t.ast=await this.executeMiddlewareHook("onAstGenerate",t.ast,t));break;case"convert":t.result&&(t.result=await this.executeMiddlewareHook("onConvert",t.result,t));break;case"complete":t.result&&(t.result=await this.executeMiddlewareHook("onComplete",t.result,t));break}}catch(n){t.errors.push(n);for(let s of this.middlewarePlugins)await((r=s.onError)==null?void 0:r.call(s,n,t))}return t.result}catch(i){throw i}}convertExtensions(e){var s,o;let t={},{attributes:r,tag:i,value:n}=e;if(r&&Object.entries(r).forEach(([a,p])=>{t[a]=p}),(s=e==null?void 0:e.children)!=null&&s.length)(o=e.children)==null||o.forEach(a=>{t[a.tag]=this.convertExtensions(a)});else if(n!==void 0)return n;return t}};import Ge from"dayjs";import at from"dayjs/plugin/utc.js";var Se={temperature:"atemp",wtemp:"wtemp",heartRate:"hr",cadence:"cad"};var De={temperature:"Temperature",Depth:"Depth"};Ge.extend(at);var I=class{constructor(e={}){this.formatElevation=e=>{let t=parseFloat(e);return isNaN(t)?e:this.roundTo(t,2).toString()};this.compact=e.compact??!0}async encode(e){let t=this.buildGPXXML(e);return Buffer.from(t,"utf-8")}encodeToString(e){return this.buildGPXXML(e)}buildGPXXML(e){let t=this.buildXMLHeader(),r=this.buildGPXContent(e),n=`${t}${r}
2
2
  </gpx>`;return this.compact?this.compressXML(n):n}compressXML(e){return e.replace(/>\s+</g,"><").replace(/^\s+|\s+$/gm,"").replace(/\s+/g," ").trim()}buildXMLHeader(){return['<?xml version="1.0" encoding="UTF-8"?>','<gpx creator="https://gpxonline.net" version="1.1"',' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',' xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd'," http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd"," http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd"," http://www.garmin.com/xmlschemas/PowerExtension/v1 http://www.garmin.com/xmlschemas/PowerExtensionv1.xsd",' http://www.topografix.com/GPX/gpx_style/0/2 http://www.topografix.com/GPX/gpx_style/0/2/gpx_style.xsd"',' xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"',' xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"',' xmlns:gpxpx="http://www.garmin.com/xmlschemas/PowerExtension/v1"',' xmlns:gpx_style="http://www.topografix.com/GPX/gpx_style/0/2"',' xmlns="http://www.topografix.com/GPX/1/1">'].join(`
3
3
  `)}buildGPXContent(e){let{metadata:t,wpt:r=[],rte:i=[],trk:n=[]}=e,s=[];return t&&s.push(this.buildMetadata(t)),r.forEach(o=>{s.push(this.buildWaypoint(o,"wpt"))}),i.forEach(o=>{s.push(this.buildRoute(o))}),n.forEach(o=>{s.push(this.buildTrack(o))}),s.join(`
4
4
  `)}buildMetadata(e){let t=["<metadata>"];return this.addOptionalElement(t,"name",e.name),this.addOptionalElement(t,"desc",e.desc),e.author&&t.push(this.buildAuthor(e.author)),e.copyright&&t.push(this.buildCopyright(e.copyright)),e.link&&this.addLinks(t,e.link),e.time&&t.push(this.buildTimeElement(e.time)),this.addOptionalElement(t,"keywords",e.keywords),e.bounds&&t.push(this.buildBounds(e.bounds)),e.extensions&&t.push(this.buildExtensions(e.extensions)),t.push("</metadata>"),t.join(`
5
5
  `)}buildAuthor(e){let t=["<author>"];return this.addOptionalElement(t,"name",e.name),e.email&&t.push(`<email id="${this.escapeXML(e.email.id||"")}" domain="${this.escapeXML(e.email.domain||"")}"/>`),e.link&&t.push(this.buildLink(e.link)),t.push("</author>"),t.join(`
6
6
  `)}buildCopyright(e){let t=[`<copyright author="${this.escapeXML(e.author||"")}">`];return this.addOptionalElement(t,"year",e.year),this.addOptionalElement(t,"license",e.license),t.push("</copyright>"),t.join(`
7
- `)}buildBounds(e){let t=this.escapeXMLAttribute((e.minlat||0).toString()),r=this.escapeXMLAttribute((e.minlon||0).toString()),i=this.escapeXMLAttribute((e.maxlat||0).toString()),n=this.escapeXMLAttribute((e.maxlon||0).toString());return`<bounds minlat="${t}" minlon="${r}" maxlat="${i}" maxlon="${n}"/>`}buildWaypoint(e,t){var i,n,s;if(!this.isValidCoordinate(e.lat,e.lon))return"";let r=[`<${t} lat="${this.escapeXMLAttribute(this.formatCoordinate(e.lat))}" lon="${this.escapeXMLAttribute(this.formatCoordinate(e.lon))}">`];if(this.addOptionalElement(r,"ele",(i=e.ele)==null?void 0:i.toString(),this.formatElevation),e.time&&r.push(this.buildTimeElement(e.time)),this.addOptionalElement(r,"speed",(n=e.speed)==null?void 0:n.toString()),this.addOptionalElement(r,"course",(s=e.course)==null?void 0:s.toString()),this.addStandardWaypointElements(r,e),e.extensions){let o=this.processPointExtensions(e,e.extensions);Object.keys(o).length>0&&r.push(this.buildExtensions(o))}return r.push(`</${t}>`),r.join(`
8
- `)}addStandardWaypointElements(e,t){var r,i,n,s,o,a,c;this.addOptionalElement(e,"magvar",(r=t.magvar)==null?void 0:r.toString()),this.addOptionalElement(e,"geoidheight",(i=t.geoidheight)==null?void 0:i.toString()),this.addOptionalElement(e,"name",t.name),this.addOptionalElement(e,"cmt",t.cmt),this.addOptionalElement(e,"desc",t.desc),this.addOptionalElement(e,"src",t.src),t.link&&this.addLinks(e,t.link),this.addOptionalElement(e,"sym",t.sym),this.addOptionalElement(e,"type",t.type),this.addOptionalElement(e,"fix",t.fix),this.addOptionalElement(e,"sat",t.sat),this.addOptionalElement(e,"hdop",(n=t.hdop)==null?void 0:n.toString()),this.addOptionalElement(e,"vdop",(s=t.vdop)==null?void 0:s.toString()),this.addOptionalElement(e,"pdop",(o=t.pdop)==null?void 0:o.toString()),this.addOptionalElement(e,"ageofdgpsdata",(a=t.ageofdgpsdata)==null?void 0:a.toString()),this.addOptionalElement(e,"dgpsid",(c=t.dgpsid)==null?void 0:c.toString())}buildRoute(e){var r;let t=["<rte>"];return this.addRouteTrackCommonElements(t,e),e.rtept&&((r=e.rtept)==null||r.forEach(i=>{t.push(this.buildWaypoint(i,"rtept"))})),e.extensions&&t.push(this.buildExtensions(e.extensions)),t.push("</rte>"),t.join(`
7
+ `)}buildBounds(e){let t=this.escapeXMLAttribute((e.minlat||0).toString()),r=this.escapeXMLAttribute((e.minlon||0).toString()),i=this.escapeXMLAttribute((e.maxlat||0).toString()),n=this.escapeXMLAttribute((e.maxlon||0).toString());return`<bounds minlat="${t}" minlon="${r}" maxlat="${i}" maxlon="${n}"/>`}buildWaypoint(e,t){var i,n,s;if(e.time===void 0)return"";let r=[`<${t} lat="${this.escapeXMLAttribute(e.lat?this.formatCoordinate(e.lat):"")}" lon="${this.escapeXMLAttribute(e.lon?this.formatCoordinate(e.lon):"")}">`];if(this.addOptionalElement(r,"ele",(i=e.ele)==null?void 0:i.toString(),this.formatElevation),e!=null&&e.time&&r.push(this.buildTimeElement(e.time)),this.addOptionalElement(r,"speed",(n=e.speed)==null?void 0:n.toString()),this.addOptionalElement(r,"course",(s=e.course)==null?void 0:s.toString()),this.addStandardWaypointElements(r,e),e.extensions){let o=this.processPointExtensions(e,e.extensions);Object.keys(o).length>0&&r.push(this.buildExtensions(o))}return r.push(`</${t}>`),r.join(`
8
+ `)}addStandardWaypointElements(e,t){var r,i,n,s,o,a,p;this.addOptionalElement(e,"magvar",(r=t.magvar)==null?void 0:r.toString()),this.addOptionalElement(e,"geoidheight",(i=t.geoidheight)==null?void 0:i.toString()),this.addOptionalElement(e,"name",t.name),this.addOptionalElement(e,"cmt",t.cmt),this.addOptionalElement(e,"desc",t.desc),this.addOptionalElement(e,"src",t.src),t.link&&this.addLinks(e,t.link),this.addOptionalElement(e,"sym",t.sym),this.addOptionalElement(e,"type",t.type),this.addOptionalElement(e,"fix",t.fix),this.addOptionalElement(e,"sat",t.sat),this.addOptionalElement(e,"hdop",(n=t.hdop)==null?void 0:n.toString()),this.addOptionalElement(e,"vdop",(s=t.vdop)==null?void 0:s.toString()),this.addOptionalElement(e,"pdop",(o=t.pdop)==null?void 0:o.toString()),this.addOptionalElement(e,"ageofdgpsdata",(a=t.ageofdgpsdata)==null?void 0:a.toString()),this.addOptionalElement(e,"dgpsid",(p=t.dgpsid)==null?void 0:p.toString())}buildRoute(e){var r;let t=["<rte>"];return this.addRouteTrackCommonElements(t,e),e.rtept&&((r=e.rtept)==null||r.forEach(i=>{t.push(this.buildWaypoint(i,"rtept"))})),e.extensions&&t.push(this.buildExtensions(e.extensions)),t.push("</rte>"),t.join(`
9
9
  `)}buildTrack(e){let t=["<trk>"];return this.addRouteTrackCommonElements(t,e),e.trkseg&&e.trkseg.forEach(r=>{t.push(this.buildTrackSegment(r))}),e.extensions&&t.push(this.buildExtensions(e.extensions)),t.push("</trk>"),t.join(`
10
10
  `)}buildTrackSegment(e){let t=["<trkseg>"];return e.trkpt&&e.trkpt.forEach(r=>{t.push(this.buildWaypoint(r,"trkpt"))}),e.extensions&&t.push(this.buildExtensions(e.extensions)),t.push("</trkseg>"),t.join(`
11
- `)}addRouteTrackCommonElements(e,t){var r;this.addOptionalElement(e,"name",t.name),this.addOptionalElement(e,"cmt",t.cmt),this.addOptionalElement(e,"desc",t.desc),this.addOptionalElement(e,"src",t.src),t.link&&this.addLinks(e,t.link),this.addOptionalElement(e,"number",(r=t.number)==null?void 0:r.toString()),this.addOptionalElement(e,"type",t.type)}processPointExtensions(e,t){let r={};return Object.entries({"gpxtpx:TrackPointExtension":{"gpxtpx:hr":"heartRate","gpxtpx:cad":"cadence","gpxtpx:speed":"speed","gpxtpx:atemp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:temp":"temperature"},"gpxpx:PowerExtension":{"gpxpx:PowerInWatts":"power"},"gpxx:GpxExtensions":{"gpxx:Temperature":"temperature","gpxx:Depth":"depth"}}).forEach(([n,s])=>{let o={},a=!1;Object.entries(s).forEach(([c,d])=>{let l;if(e[d]!==void 0)l=e[d];else if(t)if(t[c]!==void 0)l=t[c];else{let v=c.split(":").pop();Object.entries(t).forEach(([u,T])=>{u.endsWith(`:${v}`)&&T!==void 0&&(l=T)})}l!==void 0&&(o[c]=l,a=!0)}),a&&(r[n]=o)}),r}buildTrackPointExtension(e,t){let r=this.deepClone(t["gpxtpx:TrackPointExtension"]||{}),i=Object.keys(Se);return Object.keys(e).filter(n=>i.includes(n)).forEach(n=>{let s=Se[n];s&&e[n]!==void 0&&(r[`gpxtpx:${s}`]=e[n])}),r}buildPowerExtension(e,t){return this.deepClone(t["gpxpx:PowerExtension"]||{})}buildGpxExtensions(e,t){let r=this.deepClone(t["gpxx:GpxExtensions"]||{}),i=Object.keys(De);return Object.keys(e).filter(n=>i.includes(n)).forEach(n=>{let s=De[n];s&&e[n]!==void 0&&(r[`gpxx:${s}`]=e[n])}),r}buildExtensions(e){let t=this.buildExtensionContent(e);return t?`<extensions>${t}</extensions>`:""}buildExtensionContent(e){return Object.entries(e).filter(([t])=>!t.startsWith("xmlns")).map(([t,r])=>{if(r&&typeof r=="object"){let i=this.buildExtensionContent(r);return`<${t}>${i}</${t}>`}else if(r!=null)return`<${t}>${this.escapeXML(String(r))}</${t}>`;return""}).filter(t=>t).join("")}buildLink(e){let t=[`<link href="${this.escapeXMLAttribute(e.href||"")}">`];return this.addOptionalElement(t,"text",e.text),this.addOptionalElement(t,"type",e.type),t.push("</link>"),t.join("")}addLinks(e,t){(Array.isArray(t)?t:[t]).forEach(i=>{e.push(this.buildLink(i))})}buildTimeElement(e){return typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z?$/.test(e)?`<time>${e}</time>`:`<time>${Ge(e).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}</time>`}addOptionalElement(e,t,r,i){if(r!=null&&r!==""){let n=i?i(r):this.escapeXML(r);e.push(`<${t}>${n}</${t}>`)}}isValidCoordinate(e,t){return e!=null&&t!==void 0&&t!==null&&!isNaN(e)&&!isNaN(t)}formatCoordinate(e){return this.roundTo(e,6).toString()}roundTo(e,t){let r=Math.pow(10,t);return Math.round(e*r)/r}escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}escapeXMLAttribute(e){return typeof e!="string"?String(e||""):e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r/g,"&#13;").replace(/\n/g,"&#10;").replace(/\t/g,"&#9;")}deepClone(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map(r=>this.deepClone(r));let t={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=this.deepClone(e[r]));return t}encoder(e){return this.encode(e)}};var Re=class extends ${constructor(){super(...arguments);this.name="performance-middleware";this.description="Monitor parsing performance"}async onTokenize(t,r){return t}async onAstGenerate(t,r){let i=this.countNodes(t);return t}async onComplete(t,r){let i=r.metadata.get("performance");return t}countNodes(t){let r=1;if(t.children)for(let i of t.children)r+=this.countNodes(i);return r}},Xe=class extends ${constructor(){super(...arguments);this.name="validation-middleware";this.description="Validate GPX data integrity"}async onComplete(t,r){let i=this.validateGPX(t);return i.length>0&&r.metadata.set("validation-errors",i),t}validateGPX(t){let r=[];if(t.version||r.push("Missing GPX version information"),t.creator||r.push("Missing GPX creator information"),t.trk){for(let i of t.trk)if(i.trkseg){for(let n of i.trkseg)if(n.trkpt)for(let s of n.trkpt)(typeof s.lat!="number"||typeof s.lon!="number")&&r.push("Invalid track point coordinates")}}return r}};async function Be(p){let e=[new Re,new Xe];for(let t of e)await p.registerMiddleware(t)}var f=class extends h{parseHeartRate(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>0&&t<300?t:void 0}parseTCXTime(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}parseDistance(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>0?t:void 0}parseSpeed(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>=0?t:void 0}parseAltitude(e){return this.parseFloat(e)}parseCoordinate(e){let t=this.parseFloat(e);return t!==0?t:void 0}};var Te=class extends f{constructor(){super(...arguments);this.name="PositionConverter";this.supportedTags=["Position"]}convert(t,r){let i={};return this.processChildren(t,i,{LatitudeDegrees:(n,s)=>s.LatitudeDegrees=this.parseString(n.value),LongitudeDegrees:(n,s)=>s.LongitudeDegrees=this.parseString(n.value)}),i}},fe=class extends f{constructor(){super(...arguments);this.name="TrackpointConverter";this.supportedTags=["Trackpoint"]}convert(t,r){let i={};return this.processChildren(t,i,{Time:(n,s)=>s.Time=this.parseString(n.value),Position:(n,s)=>{var a;let o=r.metadata.get("decoder");s.Position=(a=o==null?void 0:o.getConverter("Position"))==null?void 0:a.convert(n,r)},AltitudeMeters:(n,s)=>s.AltitudeMeters=this.parseFloat(n.value),DistanceMeters:(n,s)=>s.DistanceMeters=this.parseFloat(n.value),HeartRateBpm:(n,s)=>{if(n.value)s.HeartRateBpm=this.parseFloat(n.value);else{let o=this.getChildByTag(n,"Value");o!=null&&o.value&&(s.HeartRateBpm=this.parseFloat(o.value))}},Cadence:(n,s)=>{let o={Low:0,High:0};this.processChildren(n,o,{Low:(a,c)=>c.Low=this.parseFloat(a.value)||0,High:(a,c)=>c.High=this.parseFloat(a.value)||0}),s.Cadence=o},SensorState:(n,s)=>s.SensorState=n.value,Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}},ge=class extends f{constructor(){super(...arguments);this.name="TrackConverter";this.supportedTags=["Track"]}convert(t,r){let i={Trackpoint:[]};return this.processChildren(t,i,{Trackpoint:(n,s)=>{var c;let o=r.metadata.get("decoder"),a=(c=o==null?void 0:o.getConverter("Trackpoint"))==null?void 0:c.convert(n,r);a&&s.Trackpoint&&s.Trackpoint.push(a)}}),i}},ye=class extends f{constructor(){super(...arguments);this.name="ActivityLapConverter";this.supportedTags=["Lap"]}convert(t,r){let i={};return this.extractAttributes(t,i,{StartTime:"Id"}),this.processChildren(t,i,{TotalTimeSeconds:(n,s)=>s.TotalTimeSeconds=this.parseFloat(n.value),DistanceMeters:(n,s)=>s.DistanceMeters=this.parseFloat(n.value),MaximumSpeed:(n,s)=>s.MaximumSpeed=this.parseFloat(n.value),Calories:(n,s)=>s.Calories=this.parseFloat(n.value),AverageHeartRateBpm:(n,s)=>s.AverageHeartRateBpm=this.parseFloat(n.value),MaximumHeartRateBpm:(n,s)=>s.MaximumHeartRateBpm=this.parseFloat(n.value),Intensity:(n,s)=>s.Intensity=n.value,TriggerMethod:(n,s)=>s.TriggerMethod=n.value,Track:(n,s)=>{var c;s.Track||(s.Track=[]);let o=r.metadata.get("decoder"),a=(c=o==null?void 0:o.getConverter("Track"))==null?void 0:c.convert(n,r);a&&s.Track.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value),Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}},he=class extends f{constructor(){super(...arguments);this.name="ActivityConverter";this.supportedTags=["Activity"]}convert(t,r){let i={Id:"",Lap:[]};return this.extractAttributes(t,i,{Activity:"Activity"}),this.processChildren(t,i,{Id:(n,s)=>s.Id=this.parseString(n.value),Lap:(n,s)=>{var c;let o=r.metadata.get("decoder"),a=(c=o==null?void 0:o.getConverter("Lap"))==null?void 0:c.convert(n,r);a&&s.Lap.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value),Training:(n,s)=>s.Training=this.convertTraining(n),Creator:(n,s)=>s.Creator=this.convertCreator(n),Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}convertTraining(t){var i;let r={};return t.attributes&&Object.entries(t.attributes).forEach(([n,s])=>{r[n]=s}),(i=t.children)==null||i.forEach(n=>{r[n.tag]=this.convertExtensionContent(n)}),r}convertCreator(t){var i;let r={};return(i=t.children)==null||i.forEach(n=>{r[n.tag]=this.convertExtensionContent(n)}),r}},ve=class extends f{constructor(){super(...arguments);this.name="ActivityListConverter";this.supportedTags=["Activities"]}convert(t,r){let i={Activity:[],MultiActivitySession:[]};return this.processChildren(t,i,{Activity:(n,s)=>{var c;let o=r.metadata.get("decoder"),a=(c=o==null?void 0:o.getConverter("Activity"))==null?void 0:c.convert(n,r);a&&s.Activity&&s.Activity.push(a)},MultiActivitySession:(n,s)=>{var c;let o=r.metadata.get("decoder"),a=(c=o==null?void 0:o.getConverter("MultiActivitySession"))==null?void 0:c.convert(n,r);a&&s.MultiActivitySession&&s.MultiActivitySession.push(a)}}),i}},xe=class extends f{constructor(){super(...arguments);this.name="MultiActivitySessionConverter";this.supportedTags=["MultiActivitySession"]}convert(t,r){let i={};return this.processChildren(t,i,{Id:(n,s)=>s.Id=this.parseString(n.value),FirstActivity:(n,s)=>{var a;let o=r.metadata.get("decoder");s.FirstActivity=(a=o==null?void 0:o.getConverter("FirstActivity"))==null?void 0:a.convert(n,r)},NextActivity:(n,s)=>{var c;s.NextActivity||(s.NextActivity=[]);let o=r.metadata.get("decoder"),a=(c=o==null?void 0:o.getConverter("NextActivity"))==null?void 0:c.convert(n,r);a&&s.NextActivity.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value)}),i}},Ce=class extends f{constructor(){super(...arguments);this.name="AbstractSourceConverter";this.supportedTags=["Author","Creator"]}convert(t,r){let i={};return this.processChildren(t,i,{Name:(n,s)=>s.Name=this.parseString(n.value)}),i}},Pe=class extends f{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["Extensions"]}convert(t,r){let i={};return this.flattenExtensionElement(t,i),i}flattenExtensionElement(t,r){var i,n;if(!((i=t.children)!=null&&i.length)&&t.value!==void 0){r[t.tag]=this.parseExtensionValue(t.value);return}(n=t.children)!=null&&n.length&&t.children.forEach(s=>{this.flattenExtensionElement(s,r)})}parseExtensionValue(t){if(t===void 0)return;let r=String(t),i=parseFloat(r);return!isNaN(i)&&isFinite(i)?i:r}};import{Parser as He}from"htmlparser2";var we=class{static tokenizeXML(e){let t=[],r=new He({onopentag(i,n){t.push({type:"open",tag:i,attributes:n})},ontext(i){let n=i.replace(/\n/g,"").trim();n&&t.push({type:"text",tag:"text",value:n})},onclosetag(i){t.push({type:"close",tag:i})}},{xmlMode:!0});return r.write(e),r.end(),t}static compressXML(e){return e.replace(/>\s+</g,"><").replace(/\s+/g," ").trim()}static formatXML(e,t=2){let r=" ".repeat(t),i="",n=0,s=!1;for(let o=0;o<e.length;o++){let a=e[o],c=e[o+1];a==="<"?(c==="/"?(n--,s||(i+=`
12
- `+r.repeat(n))):c!=="?"&&c!=="!"&&(s||(i+=`
13
- `+r.repeat(n)),n++),s=!0):a===">"&&(s=!1,c==="<"&&e[o+2]==="/"&&n--),i+=a}return i.trim()}static validateXML(e){try{let t=new He({},{xmlMode:!0});return t.write(e),t.end(),{isValid:!0}}catch(t){return{isValid:!1,error:t.message}}}static extractXMLDeclaration(e){let t=e.match(/<\?xml\s+([^>]+)\?>/);if(!t)return{};let r=t[1],i={},n=r.match(/version=["']([^"']+)["']/);n&&(i.version=n[1]);let s=r.match(/encoding=["']([^"']+)["']/);s&&(i.encoding=s[1]);let o=r.match(/standalone=["']([^"']+)["']/);return o&&(i.standalone=o[1]),i}static escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}static unescapeXML(e){return e.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&amp;/g,"&")}};var Ee=class{constructor(){this.stage="tokenize";this.name="tokenize-processor"}async process(e){if(!e.xmlContent)throw new Error("TCX data cannot be empty");let t=we.tokenizeXML(e.xmlContent);if(t.length===0)throw new Error("Not a valid TCX file");return e.tokens=t,e.stats.processedTokens=t.length,e}},Ae=class{constructor(){this.stage="ast-generate";this.name="ast-generate-processor"}async process(e){var s;let t=Date.now();if(!e.tokens)throw new Error("Tokens cannot be empty");let r=[],i,n=null;for(let o of e.tokens)if(o.type==="open"){let a={tag:o.tag,attributes:o.attributes||{},children:[]};i?n&&((s=n.children)==null||s.push(a)):i=a,r.push(a),n=a}else o.type==="text"&&n?n.value=o.value:o.type==="close"&&(r.pop(),n=r[r.length-1]||null);return e.ast=i,e.performance.astTime=Date.now()-t,e}},be=class{constructor(e){this.getConverter=e;this.stage="convert";this.name="convert-processor"}async process(e){if(!e.ast)throw new Error("AST is empty, cannot convert");let t=this.findTCXRoot(e.ast);if(!t)throw new Error("Not a valid TCX file: TrainingCenterDatabase element not found");let r=this.convertAST(t,e);return e.result=r,e.stats.convertedElements=this.countElements(e.ast),e}findTCXRoot(e){if(e.tag==="TrainingCenterDatabase")return e;if(e.children)for(let t of e.children){let r=this.findTCXRoot(t);if(r)return r}}convertAST(e,t){let r=this.getConverter(e.tag);return r?r.convert(e,t):this.genericConvert(e,t)}genericConvert(e,t){let r={};if(e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{r[i]=n}),e.value!==void 0)if(e.children&&e.children.length>0)r._value=e.value;else return e.value;return e.children&&e.children.forEach(i=>{let n=this.convertAST(i,t);r[i.tag]?(Array.isArray(r[i.tag])||(r[i.tag]=[r[i.tag]]),r[i.tag].push(n)):r[i.tag]=n}),r}countElements(e){let t=1;if(e.children)for(let r of e.children)t+=this.countElements(r);return t}},Ie=class{constructor(){this.stage="complete";this.name="complete-processor"}async process(e){if(!e.result)throw new Error("No conversion result found");let t=Date.now(),r=t-e.performance.startTime;return e.performance.endTime=t,e.performance.processingTime=r,e.metadata.set("performance",{processingTime:r,processedTokens:e.stats.processedTokens,convertedElements:e.stats.convertedElements}),e}};var D=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultConvertersRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new Ee,new Ae,new be(e=>this.getConverter(e)),new Ie]}async registerDefaultConverters(){var t;if(this.defaultConvertersRegistered)return;let e=[new Te,new fe,new ge,new ye,new he,new ve,new xe,new Ce,new Pe];for(let r of e)(t=r.supportedTags)==null||t.forEach(i=>{this.addConverterForTag(i,r)}),this.registeredPlugins.add(r.name);this.defaultConvertersRegistered=!0}addConverterForTag(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}async registerConverter(e){var r,n;if(this.registeredPlugins.has(e.name))throw new Error(`Converter plugin ${e.name} already exists`);(r=e.supportedTags)==null||r.forEach(s=>{this.addConverterForTag(s,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";(n=e.supportedTags)==null||n.forEach(s=>{let a=(this.converterPlugins.get(s)||[]).map(c=>`${c.name}(${c.priority||100})`)})}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:this.middlewarePlugins.push(e);let r=[];e.onTokenize&&r.push("onTokenize"),e.onAstGenerate&&r.push("onAstGenerate"),e.onConvert&&r.push("onConvert"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getAllConverters(e){return this.converterPlugins.get(e)||[]}unregisterConverter(e){let t;for(let[r,i]of this.converterPlugins){let n=i.findIndex(s=>s.name===e);n!==-1&&(t=i[n],i.splice(n,1),i.length===0&&this.converterPlugins.delete(r))}t&&this.registeredPlugins.delete(e)}unregisterMiddleware(e){let t=this.middlewarePlugins.findIndex(r=>r.name===e);t!==-1&&this.middlewarePlugins.splice(t,1)}async initialize(){var r;if(this.initialized)return;await this.registerDefaultConverters();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parseByBuffer(e){var r;await this.initialize();let t=this.createContext();t.rawData=e,t.xmlContent=e.toString("utf-8"),t.metadata.set("decoder",this);try{for(let i of this.processors)try{switch(t=await i.process(t),i.stage){case"tokenize":t.tokens&&(t.tokens=await this.executeMiddlewareHook("onTokenize",t.tokens,t));break;case"ast-generate":t.ast&&(t.ast=await this.executeMiddlewareHook("onAstGenerate",t.ast,t));break;case"convert":t.result&&(t.result=await this.executeMiddlewareHook("onConvert",t.result,t));break;case"complete":t.result&&(t.result=await this.executeMiddlewareHook("onComplete",t.result,t));break}}catch(n){t.errors.push(n);for(let s of this.middlewarePlugins)await((r=s.onError)==null?void 0:r.call(s,n,t))}return t.result}catch(i){throw i}}convertExtensions(e){var s,o;let t={},{attributes:r,tag:i,value:n}=e;if(r&&Object.entries(r).forEach(([a,c])=>{t[a]=c}),(s=e==null?void 0:e.children)!=null&&s.length)(o=e.children)==null||o.forEach(a=>{t[a.tag]=this.convertExtensions(a)});else if(n!==void 0)return n;return t}async parserByBuffer(e){return this.parseByBuffer(e)}async parseByString(e){let t=Buffer.from(e,"utf-8");return this.parseByBuffer(t)}};import Ve from"dayjs";import ct from"dayjs/plugin/utc.js";Ve.extend(ct);var R=class{constructor(e={}){this.compact=e.compact??!0}async encode(e){let t=this.buildTCXXML(e);return Buffer.from(t,"utf-8")}encodeToString(e){return this.buildTCXXML(e)}buildTCXXML(e){let t=this.buildXMLHeader(e),r=this.buildTCXContent(e),n=`${t}${r}
11
+ `)}addRouteTrackCommonElements(e,t){var r;this.addOptionalElement(e,"name",t.name),this.addOptionalElement(e,"cmt",t.cmt),this.addOptionalElement(e,"desc",t.desc),this.addOptionalElement(e,"src",t.src),t.link&&this.addLinks(e,t.link),this.addOptionalElement(e,"number",(r=t.number)==null?void 0:r.toString()),this.addOptionalElement(e,"type",t.type)}processPointExtensions(e,t){let r={};return Object.entries({"gpxtpx:TrackPointExtension":{"gpxtpx:hr":"heartRate","gpxtpx:cad":"cadence","gpxtpx:speed":"speed","gpxtpx:atemp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:temp":"temperature"},"gpxpx:PowerExtension":{"gpxpx:PowerInWatts":"power"},"gpxx:GpxExtensions":{"gpxx:Temperature":"temperature","gpxx:Depth":"depth"}}).forEach(([n,s])=>{let o={},a=!1;Object.entries(s).forEach(([p,d])=>{let l;if(e[d]!==void 0)l=e[d];else if(t)if(t[p]!==void 0)l=t[p];else{let X=p.split(":").pop();Object.entries(t).forEach(([m,g])=>{m.endsWith(`:${X}`)&&g!==void 0&&(l=g)})}l!==void 0&&(o[p]=l,a=!0)}),a&&(r[n]=o)}),r}buildTrackPointExtension(e,t){let r=this.deepClone(t["gpxtpx:TrackPointExtension"]||{}),i=Object.keys(Se);return Object.keys(e).filter(n=>i.includes(n)).forEach(n=>{let s=Se[n];s&&e[n]!==void 0&&(r[`gpxtpx:${s}`]=e[n])}),r}buildPowerExtension(e,t){return this.deepClone(t["gpxpx:PowerExtension"]||{})}buildGpxExtensions(e,t){let r=this.deepClone(t["gpxx:GpxExtensions"]||{}),i=Object.keys(De);return Object.keys(e).filter(n=>i.includes(n)).forEach(n=>{let s=De[n];s&&e[n]!==void 0&&(r[`gpxx:${s}`]=e[n])}),r}buildExtensions(e){let t=this.buildExtensionContent(e);return t?`<extensions>${t}</extensions>`:""}buildExtensionContent(e){return Object.entries(e).filter(([t])=>!t.startsWith("xmlns")).map(([t,r])=>{if(r&&typeof r=="object"){let i=this.buildExtensionContent(r);return`<${t}>${i}</${t}>`}else if(r!=null)return`<${t}>${this.escapeXML(String(r))}</${t}>`;return""}).filter(t=>t).join("")}buildLink(e){let t=[`<link href="${this.escapeXMLAttribute(e.href||"")}">`];return this.addOptionalElement(t,"text",e.text),this.addOptionalElement(t,"type",e.type),t.push("</link>"),t.join("")}addLinks(e,t){(Array.isArray(t)?t:[t]).forEach(i=>{e.push(this.buildLink(i))})}buildTimeElement(e){return typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z?$/.test(e)?`<time>${e}</time>`:`<time>${Ge(e).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}</time>`}addOptionalElement(e,t,r,i){if(r!=null&&r!==""){let n=i?i(r):this.escapeXML(r);e.push(`<${t}>${n}</${t}>`)}}isValidCoordinate(e,t){return e!=null&&t!==void 0&&t!==null&&!isNaN(e)&&!isNaN(t)}formatCoordinate(e){return this.roundTo(e,6).toString()}roundTo(e,t){let r=Math.pow(10,t);return Math.round(e*r)/r}escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}escapeXMLAttribute(e){return typeof e!="string"?String(e||""):e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r/g,"&#13;").replace(/\n/g,"&#10;").replace(/\t/g,"&#9;")}deepClone(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map(r=>this.deepClone(r));let t={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=this.deepClone(e[r]));return t}encoder(e){return this.encode(e)}};var Xe=class extends O{constructor(){super(...arguments);this.name="performance-middleware";this.description="Monitor parsing performance"}async onTokenize(t,r){return t}async onAstGenerate(t,r){let i=this.countNodes(t);return t}async onComplete(t,r){let i=r.metadata.get("performance");return t}countNodes(t){let r=1;if(t.children)for(let i of t.children)r+=this.countNodes(i);return r}},Re=class extends O{constructor(){super(...arguments);this.name="validation-middleware";this.description="Validate GPX data integrity"}async onComplete(t,r){let i=this.validateGPX(t);return i.length>0&&r.metadata.set("validation-errors",i),t}validateGPX(t){let r=[];if(t.version||r.push("Missing GPX version information"),t.creator||r.push("Missing GPX creator information"),t.trk){for(let i of t.trk)if(i.trkseg){for(let n of i.trkseg)if(n.trkpt)for(let s of n.trkpt)s.time&&r.push("Invalid track point time")}}return r}};async function Be(c){let e=[new Xe,new Re];for(let t of e)await c.registerMiddleware(t)}var T=class extends h{parseHeartRate(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>0&&t<300?t:void 0}parseTCXTime(e){if(!e)return;let t=new Date(e);return isNaN(t.getTime())?void 0:t}parseDistance(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>0?t:void 0}parseSpeed(e){let t=this.parseFloat(e);if(!(typeof t>"u"))return t>=0?t:void 0}parseAltitude(e){return this.parseFloat(e)}parseCoordinate(e){let t=this.parseFloat(e);return t!==0?t:void 0}};var Te=class extends T{constructor(){super(...arguments);this.name="PositionConverter";this.supportedTags=["Position"]}convert(t,r){let i={};return this.processChildren(t,i,{LatitudeDegrees:(n,s)=>s.LatitudeDegrees=this.parseString(n.value),LongitudeDegrees:(n,s)=>s.LongitudeDegrees=this.parseString(n.value)}),i}},fe=class extends T{constructor(){super(...arguments);this.name="TrackpointConverter";this.supportedTags=["Trackpoint"]}convert(t,r){let i={};return this.processChildren(t,i,{Time:(n,s)=>s.Time=this.parseString(n.value),Position:(n,s)=>{var a;let o=r.metadata.get("decoder");s.Position=(a=o==null?void 0:o.getConverter("Position"))==null?void 0:a.convert(n,r)},AltitudeMeters:(n,s)=>s.AltitudeMeters=this.parseFloat(n.value),DistanceMeters:(n,s)=>s.DistanceMeters=this.parseFloat(n.value),HeartRateBpm:(n,s)=>{if(n.value)s.HeartRateBpm=this.parseFloat(n.value);else{let o=this.getChildByTag(n,"Value");o!=null&&o.value&&(s.HeartRateBpm=this.parseFloat(o.value))}},Cadence:(n,s)=>{let o={Low:0,High:0};this.processChildren(n,o,{Low:(a,p)=>p.Low=this.parseFloat(a.value)||0,High:(a,p)=>p.High=this.parseFloat(a.value)||0}),s.Cadence=o},SensorState:(n,s)=>s.SensorState=n.value,Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}},ge=class extends T{constructor(){super(...arguments);this.name="TrackConverter";this.supportedTags=["Track"]}convert(t,r){let i={Trackpoint:[]};return this.processChildren(t,i,{Trackpoint:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Trackpoint"))==null?void 0:p.convert(n,r);a&&s.Trackpoint&&s.Trackpoint.push(a)}}),i}},ye=class extends T{constructor(){super(...arguments);this.name="ActivityLapConverter";this.supportedTags=["Lap"]}convert(t,r){let i={};return this.extractAttributes(t,i,{StartTime:"Id"}),this.processChildren(t,i,{TotalTimeSeconds:(n,s)=>s.TotalTimeSeconds=this.parseFloat(n.value),DistanceMeters:(n,s)=>s.DistanceMeters=this.parseFloat(n.value),MaximumSpeed:(n,s)=>s.MaximumSpeed=this.parseFloat(n.value),Calories:(n,s)=>s.Calories=this.parseFloat(n.value),AverageHeartRateBpm:(n,s)=>s.AverageHeartRateBpm=this.parseFloat(n.value),MaximumHeartRateBpm:(n,s)=>s.MaximumHeartRateBpm=this.parseFloat(n.value),Intensity:(n,s)=>s.Intensity=n.value,TriggerMethod:(n,s)=>s.TriggerMethod=n.value,Track:(n,s)=>{var p;s.Track||(s.Track=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Track"))==null?void 0:p.convert(n,r);a&&s.Track.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value),Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}},he=class extends T{constructor(){super(...arguments);this.name="ActivityConverter";this.supportedTags=["Activity"]}convert(t,r){let i={Id:"",Lap:[]};return this.extractAttributes(t,i,{Activity:"Activity"}),this.processChildren(t,i,{Id:(n,s)=>s.Id=this.parseString(n.value),Lap:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Lap"))==null?void 0:p.convert(n,r);a&&s.Lap.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value),Training:(n,s)=>s.Training=this.convertTraining(n),Creator:(n,s)=>s.Creator=this.convertCreator(n),Extensions:(n,s)=>{let o=r.metadata.get("decoder"),a=o==null?void 0:o.getConverter("Extensions");a&&(s.Extensions=a.convert(n,r))}}),i}convertTraining(t){var i;let r={};return t.attributes&&Object.entries(t.attributes).forEach(([n,s])=>{r[n]=s}),(i=t.children)==null||i.forEach(n=>{r[n.tag]=this.convertExtensionContent(n)}),r}convertCreator(t){var i;let r={};return(i=t.children)==null||i.forEach(n=>{r[n.tag]=this.convertExtensionContent(n)}),r}},ve=class extends T{constructor(){super(...arguments);this.name="ActivityListConverter";this.supportedTags=["Activities"]}convert(t,r){let i={Activity:[],MultiActivitySession:[]};return this.processChildren(t,i,{Activity:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("Activity"))==null?void 0:p.convert(n,r);a&&s.Activity&&s.Activity.push(a)},MultiActivitySession:(n,s)=>{var p;let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("MultiActivitySession"))==null?void 0:p.convert(n,r);a&&s.MultiActivitySession&&s.MultiActivitySession.push(a)}}),i}},xe=class extends T{constructor(){super(...arguments);this.name="MultiActivitySessionConverter";this.supportedTags=["MultiActivitySession"]}convert(t,r){let i={};return this.processChildren(t,i,{Id:(n,s)=>s.Id=this.parseString(n.value),FirstActivity:(n,s)=>{var a;let o=r.metadata.get("decoder");s.FirstActivity=(a=o==null?void 0:o.getConverter("FirstActivity"))==null?void 0:a.convert(n,r)},NextActivity:(n,s)=>{var p;s.NextActivity||(s.NextActivity=[]);let o=r.metadata.get("decoder"),a=(p=o==null?void 0:o.getConverter("NextActivity"))==null?void 0:p.convert(n,r);a&&s.NextActivity.push(a)},Notes:(n,s)=>s.Notes=this.parseString(n.value)}),i}},Ce=class extends T{constructor(){super(...arguments);this.name="AbstractSourceConverter";this.supportedTags=["Author","Creator"]}convert(t,r){let i={};return this.processChildren(t,i,{Name:(n,s)=>s.Name=this.parseString(n.value)}),i}},Pe=class extends T{constructor(){super(...arguments);this.name="extensions-converter";this.supportedTags=["Extensions"]}convert(t,r){let i={};return this.flattenExtensionElement(t,i),i}flattenExtensionElement(t,r){var i,n;if(!((i=t.children)!=null&&i.length)&&t.value!==void 0){r[t.tag]=this.parseExtensionValue(t.value);return}(n=t.children)!=null&&n.length&&t.children.forEach(s=>{this.flattenExtensionElement(s,r)})}parseExtensionValue(t){if(t===void 0)return;let r=String(t),i=parseFloat(r);return!isNaN(i)&&isFinite(i)?i:r}};import{Parser as He}from"htmlparser2";var we=class{static tokenizeXML(e){let t=[],r=new He({onopentag(i,n){t.push({type:"open",tag:i,attributes:n})},ontext(i){let n=i.replace(/\n/g,"").trim();n&&t.push({type:"text",tag:"text",value:n})},onclosetag(i){t.push({type:"close",tag:i})}},{xmlMode:!0});return r.write(e),r.end(),t}static compressXML(e){return e.replace(/>\s+</g,"><").replace(/\s+/g," ").trim()}static formatXML(e,t=2){let r=" ".repeat(t),i="",n=0,s=!1;for(let o=0;o<e.length;o++){let a=e[o],p=e[o+1];a==="<"?(p==="/"?(n--,s||(i+=`
12
+ `+r.repeat(n))):p!=="?"&&p!=="!"&&(s||(i+=`
13
+ `+r.repeat(n)),n++),s=!0):a===">"&&(s=!1,p==="<"&&e[o+2]==="/"&&n--),i+=a}return i.trim()}static validateXML(e){try{let t=new He({},{xmlMode:!0});return t.write(e),t.end(),{isValid:!0}}catch(t){return{isValid:!1,error:t.message}}}static extractXMLDeclaration(e){let t=e.match(/<\?xml\s+([^>]+)\?>/);if(!t)return{};let r=t[1],i={},n=r.match(/version=["']([^"']+)["']/);n&&(i.version=n[1]);let s=r.match(/encoding=["']([^"']+)["']/);s&&(i.encoding=s[1]);let o=r.match(/standalone=["']([^"']+)["']/);return o&&(i.standalone=o[1]),i}static escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}static unescapeXML(e){return e.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&amp;/g,"&")}};var Ee=class{constructor(){this.stage="tokenize";this.name="tokenize-processor"}async process(e){if(!e.xmlContent)throw new Error("TCX data cannot be empty");let t=we.tokenizeXML(e.xmlContent);if(t.length===0)throw new Error("Not a valid TCX file");return e.tokens=t,e.stats.processedTokens=t.length,e}},Ae=class{constructor(){this.stage="ast-generate";this.name="ast-generate-processor"}async process(e){var s;let t=Date.now();if(!e.tokens)throw new Error("Tokens cannot be empty");let r=[],i,n=null;for(let o of e.tokens)if(o.type==="open"){let a={tag:o.tag,attributes:o.attributes||{},children:[]};i?n&&((s=n.children)==null||s.push(a)):i=a,r.push(a),n=a}else o.type==="text"&&n?n.value=o.value:o.type==="close"&&(r.pop(),n=r[r.length-1]||null);return e.ast=i,e.performance.astTime=Date.now()-t,e}},be=class{constructor(e){this.getConverter=e;this.stage="convert";this.name="convert-processor"}async process(e){if(!e.ast)throw new Error("AST is empty, cannot convert");let t=this.findTCXRoot(e.ast);if(!t)throw new Error("Not a valid TCX file: TrainingCenterDatabase element not found");let r=this.convertAST(t,e);return e.result=r,e.stats.convertedElements=this.countElements(e.ast),e}findTCXRoot(e){if(e.tag==="TrainingCenterDatabase")return e;if(e.children)for(let t of e.children){let r=this.findTCXRoot(t);if(r)return r}}convertAST(e,t){let r=this.getConverter(e.tag);return r?r.convert(e,t):this.genericConvert(e,t)}genericConvert(e,t){let r={};if(e.attributes&&Object.entries(e.attributes).forEach(([i,n])=>{r[i]=n}),e.value!==void 0)if(e.children&&e.children.length>0)r._value=e.value;else return e.value;return e.children&&e.children.forEach(i=>{let n=this.convertAST(i,t);r[i.tag]?(Array.isArray(r[i.tag])||(r[i.tag]=[r[i.tag]]),r[i.tag].push(n)):r[i.tag]=n}),r}countElements(e){let t=1;if(e.children)for(let r of e.children)t+=this.countElements(r);return t}},Ie=class{constructor(){this.stage="complete";this.name="complete-processor"}async process(e){if(!e.result)throw new Error("No conversion result found");let t=Date.now(),r=t-e.performance.startTime;return e.performance.endTime=t,e.performance.processingTime=r,e.metadata.set("performance",{processingTime:r,processedTokens:e.stats.processedTokens,convertedElements:e.stats.convertedElements}),e}};var k=class{constructor(){this.converterPlugins=new Map;this.registeredPlugins=new Set;this.middlewarePlugins=[];this.processors=[];this.initialized=!1;this.defaultConvertersRegistered=!1;this.initializePipeline()}initializePipeline(){this.processors=[new Ee,new Ae,new be(e=>this.getConverter(e)),new Ie]}async registerDefaultConverters(){var t;if(this.defaultConvertersRegistered)return;let e=[new Te,new fe,new ge,new ye,new he,new ve,new xe,new Ce,new Pe];for(let r of e)(t=r.supportedTags)==null||t.forEach(i=>{this.addConverterForTag(i,r)}),this.registeredPlugins.add(r.name);this.defaultConvertersRegistered=!0}addConverterForTag(e,t){this.converterPlugins.has(e)||this.converterPlugins.set(e,[]);let r=this.converterPlugins.get(e);r.push(t),r.sort((i,n)=>(i.priority||100)-(n.priority||100))}async registerConverter(e){var r,n;if(this.registeredPlugins.has(e.name))throw new Error(`Converter plugin ${e.name} already exists`);(r=e.supportedTags)==null||r.forEach(s=>{this.addConverterForTag(s,e)}),this.registeredPlugins.add(e.name);let t=e.priority!==void 0?` (priority: ${e.priority})`:"";(n=e.supportedTags)==null||n.forEach(s=>{let a=(this.converterPlugins.get(s)||[]).map(p=>`${p.name}(${p.priority||100})`)})}async registerMiddleware(e){let t=this.middlewarePlugins.findIndex(i=>i.name===e.name);t!==-1?this.middlewarePlugins[t]=e:this.middlewarePlugins.push(e);let r=[];e.onTokenize&&r.push("onTokenize"),e.onAstGenerate&&r.push("onAstGenerate"),e.onConvert&&r.push("onConvert"),e.onComplete&&r.push("onComplete"),e.onError&&r.push("onError"),r.length>0}getConverter(e){let t=this.converterPlugins.get(e);return t&&t.length>0?t[0]:void 0}getAllConverters(e){return this.converterPlugins.get(e)||[]}unregisterConverter(e){let t;for(let[r,i]of this.converterPlugins){let n=i.findIndex(s=>s.name===e);n!==-1&&(t=i[n],i.splice(n,1),i.length===0&&this.converterPlugins.delete(r))}t&&this.registeredPlugins.delete(e)}unregisterMiddleware(e){let t=this.middlewarePlugins.findIndex(r=>r.name===e);t!==-1&&this.middlewarePlugins.splice(t,1)}async initialize(){var r;if(this.initialized)return;await this.registerDefaultConverters();let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.initialize)==null?void 0:r.call(i,e))}catch{}this.initialized=!0}async destroy(){var r;if(!this.initialized)return;let e=this.createContext(),t=[...Array.from(this.converterPlugins.values()).flat(),...this.middlewarePlugins];for(let i of t)try{await((r=i.destroy)==null?void 0:r.call(i,e))}catch{}this.initialized=!1}createContext(){return{metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},performance:{startTime:Date.now()}}}async executeMiddlewareHook(e,t,r){var n;let i=t;for(let s of this.middlewarePlugins){let o=s[e];if(o)try{i=await o.call(s,i,r)||i}catch(a){r.errors.push(a),await((n=s.onError)==null?void 0:n.call(s,a,r))}}return i}async parseByBuffer(e){var r;await this.initialize();let t=this.createContext();t.rawData=e,t.xmlContent=e.toString("utf-8"),t.metadata.set("decoder",this);try{for(let i of this.processors)try{switch(t=await i.process(t),i.stage){case"tokenize":t.tokens&&(t.tokens=await this.executeMiddlewareHook("onTokenize",t.tokens,t));break;case"ast-generate":t.ast&&(t.ast=await this.executeMiddlewareHook("onAstGenerate",t.ast,t));break;case"convert":t.result&&(t.result=await this.executeMiddlewareHook("onConvert",t.result,t));break;case"complete":t.result&&(t.result=await this.executeMiddlewareHook("onComplete",t.result,t));break}}catch(n){t.errors.push(n);for(let s of this.middlewarePlugins)await((r=s.onError)==null?void 0:r.call(s,n,t))}return t.result}catch(i){throw i}}convertExtensions(e){var s,o;let t={},{attributes:r,tag:i,value:n}=e;if(r&&Object.entries(r).forEach(([a,p])=>{t[a]=p}),(s=e==null?void 0:e.children)!=null&&s.length)(o=e.children)==null||o.forEach(a=>{t[a.tag]=this.convertExtensions(a)});else if(n!==void 0)return n;return t}async parserByBuffer(e){return this.parseByBuffer(e)}async parseByString(e){let t=Buffer.from(e,"utf-8");return this.parseByBuffer(t)}};import Ve from"dayjs";import ct from"dayjs/plugin/utc.js";Ve.extend(ct);var F=class{constructor(e={}){this.compact=e.compact??!0}async encode(e){let t=this.buildTCXXML(e);return Buffer.from(t,"utf-8")}encodeToString(e){return this.buildTCXXML(e)}buildTCXXML(e){let t=this.buildXMLHeader(e),r=this.buildTCXContent(e),n=`${t}${r}
14
14
  </TrainingCenterDatabase>`;return this.compact?this.compressXML(n):n}compressXML(e){return e.replace(/>\s+</g,"><").replace(/^\s+|\s+$/gm,"").replace(/\s+/g," ").trim()}buildXMLHeader(e){let t=e.version||"1.0",r=e.creator||"trackswap",i=e.xmlns||"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2",n=e["xmlns:xsi"]||"http://www.w3.org/2001/XMLSchema-instance",s=e["xsi:schemaLocation"]||"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www8.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd";return['<?xml version="1.0" encoding="UTF-8"?>',`<TrainingCenterDatabase version="${this.escapeXMLAttribute(t)}"`,` creator="${this.escapeXMLAttribute(r)}"`,` xmlns="${this.escapeXMLAttribute(i)}"`,` xmlns:xsi="${this.escapeXMLAttribute(n)}"`,` xsi:schemaLocation="${this.escapeXMLAttribute(s)}">`].join(`
15
15
  `)}buildTCXContent(e){let t=[];return e.Folders&&t.push(this.buildFolders(e.Folders)),e.Activities&&t.push(this.buildActivities(e.Activities)),e.Workouts&&t.push(this.buildWorkouts(e.Workouts)),e.Courses&&t.push(this.buildCourses(e.Courses)),e.Author&&t.push(this.buildAuthor(e.Author)),e.Extensions&&t.push(this.buildExtensions(e.Extensions)),t.join(`
16
16
  `)}buildFolders(e){let t=["<Folders>"];return e.History&&t.push(this.buildHistory(e.History)),e.Workouts&&t.push(this.buildWorkouts(e.Workouts)),e.Courses,t.push("</Folders>"),t.join(`
@@ -19,8 +19,8 @@ var K=class{constructor(){this.stage="parse"}async process(e){let t=Date.now();i
19
19
  `)}buildActivity(e){let r=[`<Activity Activity="${e.Activity||"Other"}">`];return r.push(`<Id>${this.formatTime(e.Id)}</Id>`),e.Lap&&e.Lap.length>0&&e.Lap.forEach(i=>{r.push(this.buildActivityLap(i))}),this.addOptionalElement(r,"Notes",e.Notes),e.Training,e.Creator,e.Extensions&&r.push(this.buildExtensions(e.Extensions)),r.push("</Activity>"),r.join(`
20
20
  `)}buildActivityLap(e){let t=["<Lap>"];return this.addOptionalNumericElement(t,"TotalTimeSeconds",e.TotalTimeSeconds),this.addOptionalNumericElement(t,"DistanceMeters",e.DistanceMeters),this.addOptionalNumericElement(t,"MaximumSpeed",e.MaximumSpeed),this.addOptionalNumericElement(t,"Calories",e.Calories),e.AverageHeartRateBpm&&t.push(`<AverageHeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"><Value>${e.AverageHeartRateBpm}</Value></AverageHeartRateBpm>`),e.MaximumHeartRateBpm&&t.push(`<MaximumHeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"><Value>${e.MaximumHeartRateBpm}</Value></MaximumHeartRateBpm>`),this.addOptionalElement(t,"Intensity",e.Intensity),e.Cadence&&t.push(this.buildCadence(e.Cadence)),this.addOptionalElement(t,"TriggerMethod",e.TriggerMethod),e.Track&&e.Track.forEach(r=>{t.push(this.buildTrack(r))}),this.addOptionalElement(t,"Notes",e.Notes),e.Extensions&&t.push(this.buildExtensions(e.Extensions)),t.push("</Lap>"),t.join(`
21
21
  `)}buildTrack(e){let t=["<Track>"];return e.Trackpoint&&e.Trackpoint.forEach(r=>{t.push(this.buildTrackpoint(r))}),t.push("</Track>"),t.join(`
22
- `)}buildTrackpoint(e){let t=["<Trackpoint>"];return e.Time&&t.push(`<Time>${this.formatTime(e.Time)}</Time>`),e.Position&&t.push(this.buildPosition(e.Position)),this.addOptionalNumericElement(t,"AltitudeMeters",e.AltitudeMeters),this.addOptionalNumericElement(t,"DistanceMeters",e.DistanceMeters),e.HeartRateBpm&&t.push(`<HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"><Value>${e.HeartRateBpm}</Value></HeartRateBpm>`),e.Cadence&&t.push(this.buildCadence(e.Cadence)),this.addOptionalElement(t,"SensorState",e.SensorState),e.Extensions&&t.push(this.buildExtensions(e.Extensions)),t.push("</Trackpoint>"),t.join(`
23
- `)}buildPosition(e){let t=["<Position>"];return e.LatitudeDegrees&&t.push(`<LatitudeDegrees>${this.formatCoordinate(parseFloat(e.LatitudeDegrees))}</LatitudeDegrees>`),e.LongitudeDegrees&&t.push(`<LongitudeDegrees>${this.formatCoordinate(parseFloat(e.LongitudeDegrees))}</LongitudeDegrees>`),t.push("</Position>"),t.join("")}buildCadence(e){return`<Cadence><Low>${e.Low}</Low><High>${e.High}</High></Cadence>`}buildMultiActivitySession(e){let t=["<MultiActivitySession>"];return e.Id&&t.push(`<Id>${this.formatTime(e.Id)}</Id>`),e.FirstActivity&&t.push(this.buildFirstActivity(e.FirstActivity)),e.NextActivity&&e.NextActivity.forEach(r=>{t.push(this.buildNextActivity(r))}),this.addOptionalElement(t,"Notes",e.Notes),t.push("</MultiActivitySession>"),t.join(`
22
+ `)}buildTrackpoint(e){let t=["<Trackpoint>"];return e.Time?(t.push(`<Time>${this.formatTime(e.Time)}</Time>`),e.Position&&t.push(this.buildPosition(e.Position)),this.addOptionalNumericElement(t,"AltitudeMeters",e.AltitudeMeters),this.addOptionalNumericElement(t,"DistanceMeters",e.DistanceMeters),e.HeartRateBpm&&t.push(`<HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"><Value>${e.HeartRateBpm}</Value></HeartRateBpm>`),e.Cadence&&t.push(this.buildCadence(e.Cadence)),this.addOptionalElement(t,"SensorState",e.SensorState),e.Extensions&&t.push(this.buildExtensions(e.Extensions)),t.push("</Trackpoint>"),t.join(`
23
+ `)):""}buildPosition(e){let t=["<Position>"];return e!=null&&e.LatitudeDegrees&&t.push(`<LatitudeDegrees>${this.formatCoordinate(parseFloat(e.LatitudeDegrees))}</LatitudeDegrees>`),e!=null&&e.LongitudeDegrees&&t.push(`<LongitudeDegrees>${this.formatCoordinate(parseFloat(e.LongitudeDegrees))}</LongitudeDegrees>`),t.push("</Position>"),t.join("")}buildCadence(e){return`<Cadence><Low>${e.Low}</Low><High>${e.High}</High></Cadence>`}buildMultiActivitySession(e){let t=["<MultiActivitySession>"];return e.Id&&t.push(`<Id>${this.formatTime(e.Id)}</Id>`),e.FirstActivity&&t.push(this.buildFirstActivity(e.FirstActivity)),e.NextActivity&&e.NextActivity.forEach(r=>{t.push(this.buildNextActivity(r))}),this.addOptionalElement(t,"Notes",e.Notes),t.push("</MultiActivitySession>"),t.join(`
24
24
  `)}buildFirstActivity(e){let t=["<FirstActivity>"];return e.Activity&&t.push(this.buildActivity(e.Activity)),t.push("</FirstActivity>"),t.join(`
25
25
  `)}buildNextActivity(e){let t=["<NextActivity>"];return e.Transition&&t.push(`<Transition>${this.buildActivityLap(e.Transition)}</Transition>`),e.Activity&&t.push(this.buildActivity(e.Activity)),t.push("</NextActivity>"),t.join(`
26
- `)}buildWorkouts(e){return"<Workouts></Workouts>"}buildCourses(e){return"<Courses></Courses>"}buildAuthor(e){let t=["<Author>"];return this.addOptionalElement(t,"Name",e.Name),t.push("</Author>"),t.join("")}buildExtensions(e){let t=this.buildExtensionContent(e);return t?`<Extensions>${t}</Extensions>`:""}buildExtensionContent(e){return Object.entries(e).filter(([t])=>!t.startsWith("xmlns")).map(([t,r])=>{if(r&&typeof r=="object"){let i=this.buildExtensionContent(r);return`<${t}>${i}</${t}>`}else if(r!=null)return`<${t}>${this.escapeXML(String(r))}</${t}>`;return""}).filter(t=>t).join("")}formatTime(e){return typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(e)?e:Ve(e).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}addOptionalElement(e,t,r,i){if(r!=null&&r!==""){let n=i?i(r):this.escapeXML(r);e.push(`<${t}>${n}</${t}>`)}}addOptionalNumericElement(e,t,r){r!=null&&!isNaN(r)&&e.push(`<${t}>${r}</${t}>`)}isValidCoordinate(e,t){return e!=null&&t!==void 0&&t!==null&&!isNaN(e)&&!isNaN(t)}formatCoordinate(e){return this.roundTo(e,6).toString()}roundTo(e,t){let r=Math.pow(10,t);return Math.round(e*r)/r}escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}escapeXMLAttribute(e){return typeof e!="string"?String(e||""):e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r/g,"&#13;").replace(/\n/g,"&#10;").replace(/\t/g,"&#9;")}deepClone(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map(r=>this.deepClone(r));let t={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=this.deepClone(e[r]));return t}encoder(e){return this.encode(e)}};import pt from"dayjs";var X=class extends h{convertPoints(e){return e.map(t=>this.convertPoint(t)).filter(t=>t!==void 0)}convertTime(e){if(!e)return;if(typeof e=="number")return e;let t=pt(e);return t.isValid()?t.valueOf():void 0}},L=class{constructor(){this.version="1.0.0";this.priority=100}supports(e){return this.supportedTags.includes(e)}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}convertTimeToDate(e){return e?new Date(e):new Date}convertTimeToString(e){return this.convertTimeToDate(e).toISOString()}ensureValidCoordinates(e,t){return e>=-90&&e<=90&&t>=-180&&t<=180}round(e,t=6){let r=Math.pow(10,t);return Math.round(e*r)/r}},ze=class extends b{async onError(e,t){t.warnings.push(`Middleware ${this.name} error: ${e.message}`)}validateActivityFile(e){if(!e.metadata)return!1;if(e.routes){for(let t of e.routes)if(!this.validateRoute(t))return!1}if(e.points){for(let t of e.points)if(!this.validatePoint(t))return!1}if(e.activities){for(let t of e.activities)if(!this.validateActivity(t))return!1}return!0}validateActivity(e){return!!(e&&typeof e.index>"u"&&e.laps&&e.laps.length>0)}validateRoute(e){return!!(e.records&&e.records.length>0)}validatePoint(e){return!!(e.positionLat&&e.positionLong&&e.positionLat>=-90&&e.positionLat<=90&&e.positionLong>=-180&&e.positionLong<=180)}};var We={heartrate:"heartRate","gpxtpx:hr":"heartRate","ns3:hr":"heartRate","gpxdata:hr":"heartRate","gpxdata:cadence":"cadence","gpxtpx:cad":"cadence","ns3:cad":"cadence",cadence:"cadence","gpxtpx:speed":"speed","ns3:speed":"speed",speed:"speed",power:"power","gpxdata:power":"power","gpxpx:PowerInWatts":"power",PowerInWatts:"power","gpxtpx:temp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:atemp":"atemp","gpxx:Temperature":"temperature","gpxx:Depth":"depth"},g=p=>p*(180/Math.pow(2,31));import je from"dayjs";import Ue from"dayjs";import{getPreciseDistance as dt}from"geolib";var I=class{calculateRecordsAggMetrics(e){if(!e||e.length===0)return;let t={records:this.preprocessRecords(e)},r=0;for(let i=0;i<t.records.length;i++){let n=t.records[i];if(!(!n.positionLat||!n.positionLong)){if(t!=null&&t.startPositionLat||(t.startPositionLat=n.positionLat),t!=null&&t.startPositionLong||(t.startPositionLong=n.positionLong),t.endPositionLat=n.positionLat,t.endPositionLong=n.positionLong,t.timestamp=n.timestamp,t!=null&&t.startTime||(t.startTime=n.timestamp),t.endTime=n.timestamp,n!=null&&n.distance?t.totalDistance=n.distance:i>0&&(r+=this.calculatePointDistance(e[i-1],n)||0,t.totalDistance=r),n!=null&&n.speed&&(t.avgSpeed=t.avgSpeed?(t.avgSpeed+n.speed)/2:n.speed,t.maxSpeed=Math.max(t.maxSpeed||0,n.speed)),n!=null&&n.heartRate&&(t.maxHeartRate=Math.max(t.maxHeartRate||0,n.heartRate),t.minHeartRate=Math.min(t.minHeartRate||n.heartRate,n.heartRate),t.avgHeartRate?t.avgHeartRate=(t.avgHeartRate+n.heartRate)/2:t.avgHeartRate=n.heartRate),n!=null&&n.altitude&&(t.maxAltitude=Math.max(t.maxAltitude||0,n.altitude),t.minAltitude=Math.min(t.minAltitude||n.altitude,n.altitude),t.avgAltitude=t.avgAltitude?(t.avgAltitude+n.altitude)/2:n.altitude,i>0&&e[i-1].altitude)){let s=this.calculateElevationChanges(e[i-1],n);t.totalAscent=(t.totalAscent||0)+s.ascent,t.totalDescent=(t.totalDescent||0)+s.descent}if(n!=null&&n.cadence&&(t.maxCadence=Math.max(t.maxCadence||0,n.cadence),t.avgCadence?t.avgCadence=(t.avgCadence+n.cadence)/2:t.avgCadence=n.cadence),n!=null&&n.power){t.maxPower=Math.max(t.maxPower||0,n.power),t.avgPower?t.avgPower=(t.avgPower+n.power)/2:t.avgPower=n.power;let s=this.calculateAccumulatedPower(i>0?e[i-1]:n,n,t.totalWork||0);t.totalWork=s.newAccumulatedWork,t.normalizedPower=void 0}n!=null&&n.temperature&&(t.avgTemperature?t.avgTemperature=(t.avgTemperature+n.temperature)/2:t.avgTemperature=n.temperature,t.maxTemperature=Math.max(t.maxTemperature||0,n.temperature),t.minTemperature=Math.min(t.minTemperature||n.temperature,n.temperature))}}return t}calculateLapAggMetrics(e){var r;if(!e||e.length===0)return;let t={laps:e,timestamp:((r=e[0])==null?void 0:r.timestamp)||new Date};for(let i=0;i<e.length;i++){let n=e[i];n.startPositionLat&&n.startPositionLong&&!(t!=null&&t.startPositionLat)&&!(t!=null&&t.startPositionLong)&&(t.startPositionLat=n.startPositionLat,t.startPositionLong=n.startPositionLong),n.endPositionLat&&n.endPositionLong&&(t.endPositionLat=n.endPositionLat,t.endPositionLong=n.endPositionLong),n.startTime&&!(t!=null&&t.startTime)&&(t.startTime=n.startTime),n.endTime&&(t.endTime=n.endTime),t.timestamp=n.timestamp||n.endTime||t.timestamp,n.totalDistance&&(t.totalDistance=(t.totalDistance||0)+n.totalDistance),n.totalElapsedTime&&(t.totalElapsedTime=(t.totalElapsedTime||0)+n.totalElapsedTime),n.maxSpeed&&(t.maxSpeed=Math.max(t.maxSpeed||0,n.maxSpeed)),n.avgSpeed&&(t.avgSpeed?t.avgSpeed=(t.avgSpeed+n.avgSpeed)/2:t.avgSpeed=n.avgSpeed),n.maxHeartRate&&(t.maxHeartRate=Math.max(t.maxHeartRate||0,n.maxHeartRate)),n.minHeartRate&&(t.minHeartRate=t.minHeartRate?Math.min(t.minHeartRate,n.minHeartRate):n.minHeartRate),n.avgHeartRate&&(t.avgHeartRate?t.avgHeartRate=(t.avgHeartRate+n.avgHeartRate)/2:t.avgHeartRate=n.avgHeartRate),n.maxAltitude&&(t.maxAltitude=Math.max(t.maxAltitude||0,n.maxAltitude)),n.minAltitude&&(t.minAltitude=t.minAltitude?Math.min(t.minAltitude,n.minAltitude):n.minAltitude),n.avgAltitude&&(t.avgAltitude?t.avgAltitude=(t.avgAltitude+n.avgAltitude)/2:t.avgAltitude=n.avgAltitude),n.totalAscent&&(t.totalAscent=(t.totalAscent||0)+n.totalAscent),n.totalDescent&&(t.totalDescent=(t.totalDescent||0)+n.totalDescent),n.maxCadence&&(t.maxCadence=Math.max(t.maxCadence||0,n.maxCadence)),n.avgCadence&&(t.avgCadence?t.avgCadence=(t.avgCadence+n.avgCadence)/2:t.avgCadence=n.avgCadence),n.maxPower&&(t.maxPower=Math.max(t.maxPower||0,n.maxPower)),n.avgPower&&(t.avgPower?t.avgPower=(t.avgPower+n.avgPower)/2:t.avgPower=n.avgPower),n.totalWork&&(t.totalWork=(t.totalWork||0)+n.totalWork),n.maxTemperature&&(t.maxTemperature=Math.max(t.maxTemperature||0,n.maxTemperature)),n.minTemperature&&(t.minTemperature=t.minTemperature?Math.min(t.minTemperature,n.minTemperature):n.minTemperature),n.avgTemperature&&(t.avgTemperature?t.avgTemperature=(t.avgTemperature+n.avgTemperature)/2:t.avgTemperature=n.avgTemperature)}return t}preprocessRecords(e){if(!e||e.length===0)return e;let t=e.filter(s=>s.timestamp).sort((s,o)=>s.timestamp.valueOf()-o.timestamp.valueOf()),r=0,i=[],n=null;for(let s=0;s<t.length;s++){let o=t[s],a={...o};if(!(!a.positionLat||!a.positionLong)){if(s>0&&n&&(o.distance||(a.distance=this.calculatePointDistance(n,a)||0),o.speed||(a.speed=this.calculateInstantSpeed(n,a,a.distance)),o.power)){let c=this.calculateAccumulatedPower(n,a,r);a.accumulatedPower=c.accumulatedPower,r=c.newAccumulatedWork}n=a,i.push(a)}}return i}calculatePointDistance(e,t){if(!e.positionLat||!e.positionLong||!t.positionLat||!t.positionLong)return 0;try{return dt({latitude:e.positionLat,longitude:e.positionLong},{latitude:t.positionLat,longitude:t.positionLong})}catch{return 0}}calculateInstantSpeed(e,t,r){if(!e.timestamp||!t.timestamp||!r)return;let i=(Ue(t.timestamp).valueOf()-Ue(e.timestamp).valueOf())/1e3;if(!(i<=0))return r/i}calculateAccumulatedPower(e,t,r){var a,c;if(e.power===void 0||t.power===void 0||!e.timestamp||!t.timestamp)return{accumulatedPower:r,newAccumulatedWork:r};let i=((a=t.timestamp)==null?void 0:a.valueOf())-((c=e.timestamp)==null?void 0:c.valueOf());if(i<=0)return{accumulatedPower:r,newAccumulatedWork:r};let s=(e.power+t.power)/2*i,o=r+s;return{accumulatedPower:o,newAccumulatedWork:o}}calculateElevationChanges(e,t){let r=0,i=0;return t.altitude!==void 0&&e.altitude!==void 0&&(t.altitude>e.altitude?r=t.altitude-e.altitude:t.altitude<=e.altitude&&(i=e.altitude-t.altitude)),{ascent:r,descent:i}}};function y(p,e=0){let t=Math.pow(10,e);return Math.round(p*t)/t}var G=class extends X{constructor(){super(...arguments);this.name="gpx-to-activity-converter";this.supportedTags=["gpx"];this.convertGPXExtensions=t=>{let r={};return Object.entries(t).forEach(([i,n])=>{if(typeof n<"u"&&n!=="undefined"){let s=We[i]||i;r[s]=this.autoNumber(n)}}),r}}convert(t,r){if(r.sourceFormat!=="gpx")return;let i=r.sourceData;return this.convertGPX(i)}convertGPX(t){let r={metadata:{originType:"GPX",fileType:"gpx"},activities:[]};return t.wpt&&(r.points=this.convertWpts2Points(t.wpt)),t.trk&&(r.activities=t.trk.map((i,n)=>this.convertTrk2Activity(i,n))),t.rte&&(r.routes=t.rte.map((i,n)=>this.convertTrackSeg2Lap(i,n))),r}convertPoint(t,r){let{extensions:i}=t,n=i?this.convertGPXExtensions(i):{};return{index:r||0,positionLat:t.lat,positionLong:t.lon,altitude:t.ele,heartRate:t==null?void 0:t.heartRate,speed:t==null?void 0:t.speed,power:t==null?void 0:t.power,cadence:t==null?void 0:t.cadence,timestamp:je(t.time).toDate(),...n}}convertTrk2Activity(t,r){var s;let i=((s=t.trkseg)==null?void 0:s.map((o,a)=>this.convertTrackSeg2Lap(o,a)))||[],n=new I().calculateLapAggMetrics(i);return{index:r,messageIndex:r,laps:i,...n}}convertTrackSeg2Lap(t,r){var a,c;let i=((c=(a=t.trkpt)==null?void 0:a.filter(d=>d!==void 0&&d.lat&&d.lon))==null?void 0:c.map((d,l)=>this.convertPoint(d,l)))||[],s=new I().calculateRecordsAggMetrics(i);return{index:r,messageIndex:r,...s,records:(s==null?void 0:s.records)||[]}}convertWpts2Points(t){let r=[];for(let i=0;i<t.length;i++){let n=t[i];if(n.lat!=null&&n.lon!=null){let s=this.convertPoint(n,i);s&&r.push(s)}}return r}autoNumber(t){return typeof t=="string"&&t.trim()!==""&&!isNaN(t)?Number(t):t}},B=class extends X{constructor(){super(...arguments);this.name="fit-to-activity-converter";this.supportedTags=["fit"]}convert(t,r){if(r.sourceFormat!=="fit")return;let i=r.sourceData;return this.convertFIT(i)}convertFIT(t){var i,n;let r={metadata:{originType:"FIT",fileType:"fit"},activities:[]};return(i=t.sessionMesgs)!=null&&i.length?r.activities=t.sessionMesgs.map((s,o)=>({index:o,...s,startPositionLat:s.startPositionLat?y(g(Number(s.startPositionLat)),6):void 0,startPositionLong:s.startPositionLong?y(g(Number(s.startPositionLong)),6):void 0,endPositionLat:s.endPositionLat?y(g(Number(s.endPositionLat)),6):void 0,endPositionLong:s.endPositionLong?y(g(Number(s.endPositionLong)),6):void 0,laps:this.convertFITLap2Trackseg(s==null?void 0:s.lapMesgs)})):(n=t.courseMesgs)!=null&&n.length&&(r.routes=t.courseMesgs.map((s,o)=>({index:o,...s,records:this.convertLap2Points(s==null?void 0:s.lapMesgs)}))),r}convertPoint(t,r){let{positionLong:i,positionLat:n,altitude:s,timestamp:o,heartRate:a,cadence:c,distance:d,power:l,enhancedAltitude:v,enhancedSpeed:u,speed:T,temperature:x,...k}=t;if(!(i==null||n==null))return{index:r||0,positionLat:y(g(Number(n)),6),positionLong:y(g(Number(i)),6),altitude:s||v,distance:d,speed:T||u,heartRate:a,power:l,cadence:c,temperature:x,timestamp:o,...k}}convertFITLap2Trackseg(t){var n;let r=[];if(!(t!=null&&t.length))return[];for(let s of t){let o=((n=s==null?void 0:s.recordMesgs)==null?void 0:n.map((a,c)=>this.convertPoint(a,c)).filter(a=>a!==void 0))||[];r.push({index:r.length,...s,startPositionLat:s.startPositionLat?y(g(Number(s.startPositionLat)),6):void 0,startPositionLong:s.startPositionLong?y(g(Number(s.startPositionLong)),6):void 0,endPositionLat:s.endPositionLat?y(g(Number(s.endPositionLat)),6):void 0,endPositionLong:s.endPositionLong?y(g(Number(s.endPositionLong)),6):void 0,records:o})}return r}convertLap2Points(t){var n;let r=[];if(!(t!=null&&t.length))return[];for(let s of t){let o=((n=s.recordMesgs)==null?void 0:n.map((a,c)=>this.convertPoint(a,c)).filter(a=>a!==void 0))||[];o.length&&(r=[...r,...o])}return r}},H=class extends X{constructor(){super(...arguments);this.name="tcx-to-activity-converter";this.supportedTags=["tcx"]}convert(t,r){if(r.sourceFormat!=="tcx")return;let i=r.sourceData;return this.convertTCX(i)}convertTCX(t){var i,n,s,o;let r={metadata:{originType:"TCX",fileType:"tcx"},activities:[]};return(n=(i=t.Activities)==null?void 0:i.Activity)!=null&&n.length&&(r.activities=t.Activities.Activity.map((a,c)=>this.convertTCXActivityToActivity(a,c))),(o=(s=t.Courses)==null?void 0:s.Course)!=null&&o.length,r}convertTCXActivityToActivity(t,r){var s;let i=((s=t.Lap)==null?void 0:s.map((o,a)=>this.convertTCXLap2Lap(o,a)))||[],n=new I().calculateLapAggMetrics(i);return{index:r,messageIndex:r,laps:i,...n}}convertTCXLap2Lap(t,r){var a;let i=((a=t==null?void 0:t.Track)==null?void 0:a.flatMap(c=>c.Trackpoint))||[],n=(i==null?void 0:i.filter(c=>{var d;return c!==void 0&&((d=c.Position)==null?void 0:d.LatitudeDegrees)!==void 0&&c.Position.LongitudeDegrees!==void 0&&c.Time!==void 0}).map((c,d)=>this.convertPoint(c,d)))||[],o=new I().calculateRecordsAggMetrics(n);return{index:r,messageIndex:r,...o,records:(o==null?void 0:o.records)||[]}}convertPoint(t,r){let{Position:i,Time:n,DistanceMeters:s,AltitudeMeters:o}=t;return{index:r||0,positionLat:Number(i.LatitudeDegrees),positionLong:Number(i.LongitudeDegrees),timestamp:je(n).toDate(),distance:s,altitude:o}}};import lt from"dayjs";var V=class extends L{constructor(){super(...arguments);this.name="activity-to-gpx-encoder";this.supportedTags=["gpx"]}encode(t,r){var s,o,a,c,d;if(r.targetFormat!=="gpx"||!((s=t==null?void 0:t.activities)!=null&&s.length))return;let n={version:"1.1",creator:"TrackSwap",metadata:{time:((o=t.activities)==null?void 0:o[0]).timestamp}};return(a=t.points)!=null&&a.length&&(n.wpt=this.convertRecords2Wpts(t.points)),(c=t.routes)!=null&&c.length&&(n.rte=t.routes.map(l=>this.convertRoute2GPXRoute(l))),(d=t.activities)!=null&&d.length&&(n.trk=t.activities.map(l=>this.convertActivity2GPXTrack(l))),n}convertRecords2Wpts(t){return t==null?void 0:t.filter(r=>typeof r.positionLat=="number"&&typeof r.positionLong=="number").map(r=>({lat:r.positionLat,lon:r.positionLong,ele:r==null?void 0:r.altitude,time:r==null?void 0:r.timestamp,speed:r==null?void 0:r.speed,hdop:r==null?void 0:r.hdop,vdop:r==null?void 0:r.vdop,pdop:r==null?void 0:r.pdop,extensions:this.extractGPXExtensions(r)}))}convertRoute2GPXRoute(t){return{rtept:t.records?this.convertRecords2Wpts(t.records):[]}}convertActivity2GPXTrack(t){var r;return{trkseg:((r=t.laps)==null?void 0:r.map(i=>({trkpt:i.records?this.convertRecords2Wpts(i.records):[]})))||[]}}extractGPXExtensions(t){let r={},i={};return typeof(t==null?void 0:t.heartRate)<"u"&&(i["gpxtpx:hr"]=t.heartRate),typeof(t==null?void 0:t.cadence)<"u"&&(i["gpxtpx:cad"]=t.cadence),typeof(t==null?void 0:t.temperature)<"u"&&(i["gpxtpx:atemp"]=t.temperature),Object.keys(i).length>0&&(r["gpxtpx:TrackPointExtension"]=i),typeof(t==null?void 0:t.power)<"u"&&(r["gpxpx:PowerExtension"]={"gpxpx:PowerInWatts":t.power}),Object.keys(r).length>0?r:void 0}},z=class extends L{constructor(){super(...arguments);this.name="activity-to-fit-encoder";this.supportedTags=["fit"]}encode(t,r){var n,s;if(r.targetFormat!=="fit"||!((n=t==null?void 0:t.activities)!=null&&n.length))return;let i={};return i.sessionMesgs=(s=t.activities)==null?void 0:s.map(o=>this.convertActivity2FITSession(o)),i}convertActivity2FITSession(t){var i;return{...t,event:(t==null?void 0:t.event)||"session",sport:(t==null?void 0:t.sport)||"generic",lapMesgs:((i=t.laps)==null?void 0:i.map(n=>this.convertLap2FITLap(n)))||[]}}convertLap2FITLap(t){var i;return{startTime:t.startTime,...t,recordMesgs:((i=t.records)==null?void 0:i.map(n=>this.convertPoint2FITRecord(n)))||[]}}convertPoint2FITRecord(t){return t}},W=class extends L{constructor(){super(...arguments);this.name="sport-to-tcx-encoder";this.supportedTags=["tcx"]}encode(t,r){var n;if(r.targetFormat!=="tcx"||!((n=t==null?void 0:t.activities)!=null&&n.length))return;let i={Author:{Name:"TrackSwap"}};return i.Activities={Activity:t.activities.map(s=>this.convertActivity2TCXActivity(s))},i}convertActivity2TCXActivity(t){var i;let r="Other";return(t.sport==="Running"||t.sport==="Biking")&&(r=t.sport),{Id:`Activity_${Date.now()}`,Activity:r,Lap:((i=t.laps)==null?void 0:i.map(n=>this.convertLap2TCXLap(n)))||[]}}convertLap2TCXLap(t){let r={TotalTimeSeconds:t.totalElapsedTime,DistanceMeters:t.totalDistance,MaximumSpeed:t.maxSpeed,Calories:t.totalCalories,AverageHeartRateBpm:t.avgHeartRate,MaximumHeartRateBpm:t.maxHeartRate,Intensity:"Active",TriggerMethod:"Manual",Track:t.records?[this.convertRecords2TCXTrack(t.records)]:[]};return(t.avgCadence!==void 0||t.maxCadence!==void 0)&&(r.Cadence={Low:t.avgCadence||0,High:t.maxCadence||0}),r}convertRecords2TCXTrack(t){return{Trackpoint:t.map(r=>this.convertPoint2TCXTrackpoint(r))}}convertPoint2TCXTrackpoint(t){var i,n;let r={Time:lt(t.timestamp).toISOString(),Position:{LatitudeDegrees:((i=t.positionLat)==null?void 0:i.toString())||"0",LongitudeDegrees:((n=t.positionLong)==null?void 0:n.toString())||"0"},AltitudeMeters:t.altitude,DistanceMeters:t.distance};return t.heartRate&&(r.HeartRateBpm=t.heartRate),t.cadence&&(r.Cadence={Low:t.cadence,High:t.cadence}),t.power&&(r.Extensions={"ns3:TPX":{"ns3:Watts":t.power}}),r}convertRoute2TCXCourse(t){return{Name:`Course_${Date.now()}`,Track:t.records?[this.convertRecords2TCXTrack(t.records)]:[]}}};var U=class{constructor(){this.converters=new Map;this.encoders=new Map;this.registerDefaultConverters(),this.registerDefaultEncoders()}registerDefaultConverters(){this.registerConverter(new G),this.registerConverter(new B),this.registerConverter(new H)}registerDefaultEncoders(){this.registerEncoder(new V),this.registerEncoder(new z),this.registerEncoder(new W)}registerConverter(e){this.converters.set(e.name,e)}registerEncoder(e){this.encoders.set(e.name,e)}async convertToActivity(e,t){let r={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},sourceFormat:t,sourceData:e,performance:{startTime:Date.now()}};try{let s=this.findConverter(t);if(!s)throw new Error(`No converter found for format "${t}"`);let o=Date.now(),a=s.convert(e,r);if(r.performance.convertTime=Date.now()-o,!a)throw new Error(`Converter "${s.name}" returned empty result`);let c=a;return r.result=c,r.performance.endTime=Date.now(),r.stats.endTime=Date.now(),c}catch(s){throw r.errors.push(s),s}}async encodeActivity(e,t){let r={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},targetFormat:t,performance:{startTime:Date.now()}};try{let i=this.findEncoder(t);if(!i)throw new Error(`No encoder found for format "${t}"`);let n=Date.now(),s=i.encode(e,r);if(r.performance.encodeTime=Date.now()-n,!s)throw new Error(`Encoder "${i.name}" returned empty result`);return r.result=s,r.performance.endTime=Date.now(),r.stats.endTime=Date.now(),s}catch(i){throw r.errors.push(i),i}}findConverter(e){return Array.from(this.converters.values()).find(t=>{var r;return(r=t.supportedTags)==null?void 0:r.includes(e)})}findEncoder(e){return Array.from(this.encoders.values()).find(t=>{var r;return(r=t.supportedTags)==null?void 0:r.includes(e)})}async destroy(){this.converters.clear(),this.encoders.clear()}};var j=class{constructor(){this.gpxDecoder=new F,this.gpxEncoder=new S,this.fitDecoder=new w,this.fitEncoder=new A,this.tcxDecoder=new D,this.tcxEncoder=new R,this.activityProcessor=new U}async parseGPX(e){try{return await this.gpxDecoder.parserByBuffer(e)}catch(t){throw new Error(`GPX parsing failed: ${t.message}`)}}async parseGPXString(e){let t=Buffer.from(e,"utf-8");return this.parseGPX(t)}async encodeGPX(e){try{return await this.gpxEncoder.encode(e)}catch(t){throw new Error(`GPX encoding failed: ${t.message}`)}}encodeGPXString(e){try{return this.gpxEncoder.encodeToString(e)}catch(t){throw new Error(`GPX encoding failed: ${t.message}`)}}async parseFIT(e){try{return await this.fitDecoder.parseByBuffer(e)}catch(t){throw new Error(`FIT parsing failed: ${t.message}`)}}async encodeFIT(e){try{return await this.fitEncoder.encode(e)}catch(t){throw new Error(`FIT encoding failed: ${t.message}`)}}async encodeFITCourse(e){try{return await this.fitEncoder.encodeCourse(e)}catch(t){throw new Error(`FIT Course encoding failed: ${t.message}`)}}async parseTCXString(e){let t=Buffer.from(e,"utf-8");return this.parseTCX(t)}async parseTCX(e){try{let t=await this.tcxDecoder.parseByBuffer(e);if(!t)throw new Error("TCX parsing result is empty");return t}catch(t){throw new Error(`TCX parsing failed: ${t.message}`)}}async encodeTCX(e){try{return await this.tcxEncoder.encode(e)}catch(t){throw new Error(`TCX encoding failed: ${t.message}`)}}async encodeTCXString(e){try{return await this.tcxEncoder.encodeToString(e)}catch(t){throw new Error(`TCX encoding failed: ${t.message}`)}}async convertGPXToActivity(e){return await this.activityProcessor.convertToActivity(e,"gpx")}async convertFITToActivity(e){return await this.activityProcessor.convertToActivity(e,"fit")}async convertTCXToActivity(e){return await this.activityProcessor.convertToActivity(e,"tcx")}async convertActivityToGPX(e){return await this.activityProcessor.encodeActivity(e,"gpx")}async convertActivityToFIT(e){return await this.activityProcessor.encodeActivity(e,"fit")}async convertActivityToTCX(e){return await this.activityProcessor.encodeActivity(e,"tcx")}async convertFile(e,t,r){try{let i=r||this.detectFormat(e);if(i==="unknown"||i==null)throw new Error("Unable to recognize source file format, please specify sourceType parameter");if(i===t)return e;let n;switch(i){case"gpx":let o=await this.parseGPX(e);if(!o)throw new Error("GPX file parsing failed");n=o;break;case"fit":n=await this.parseFIT(e);break;case"tcx":n=await this.parseTCX(e);break;default:throw new Error(`Unsupported source file format: ${i}`)}let s;switch(i){case"gpx":s=await this.convertGPXToActivity(n);break;case"fit":s=await this.convertFITToActivity(n);break;case"tcx":s=await this.convertTCXToActivity(n);break;default:throw new Error(`Unsupported source file format conversion: ${i}`)}switch(t){case"gpx":let o=await this.convertActivityToGPX(s);return await this.encodeGPX(o);case"fit":let a=await this.convertActivityToFIT(s);return await this.encodeFIT(a);case"tcx":let c=await this.convertActivityToTCX(s);return await this.encodeTCX(c);default:throw new Error(`Unsupported target file format: ${t}`)}}catch(i){let n=r||"auto-detect";throw new Error(`${n} to ${t.toUpperCase()} failed: ${i.message}`)}}detectFormat(e){let t=e.toString("utf-8",0,Math.min(1024,e.length));if(e.length>=12&&e.toString("ascii",8,12)===".FIT")return"fit";if(t.includes("<?xml")){if(t.includes("<gpx")||t.includes("http://www.topografix.com/GPX/"))return"gpx";if(t.includes("<TrainingCenterDatabase")||t.includes("http://www.garmin.com/xmlschemas/TrainingCenterDatabase/"))return"tcx"}return"unknown"}async parseFile(e,t){let r=t||this.detectFormat(e);if(r==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");switch(r){case"gpx":let i=await this.parseGPX(e);if(!i)throw new Error("GPX parsing failed");return i;case"fit":return await this.parseFIT(e);case"tcx":return await this.parseTCX(e);default:throw new Error(`Unsupported file format: ${r}`)}}async parseToActivity(e,t){let r=t||this.detectFormat(e);if(r==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");let i;switch(r){case"gpx":let n=await this.parseGPX(e);if(!n)throw new Error("GPX parsing failed");i=await this.convertGPXToActivity(n);break;case"fit":let s=await this.parseFIT(e);s&&(i=await this.convertFITToActivity(s));break;case"tcx":let o=await this.parseTCX(e);i=await this.convertTCXToActivity(o);break;default:throw new Error(`Unsupported file format: ${r}`)}return i}getActivityProcessor(){return this.activityProcessor}getGPXDecoder(){return this.gpxDecoder}getGPXEncoder(){return this.gpxEncoder}getFITDecoder(){return this.fitDecoder}getFITEncoder(){return this.fitEncoder}getTCXDecoder(){return this.tcxDecoder}getTCXEncoder(){return this.tcxEncoder}async destroy(){await this.gpxDecoder.destroy(),await this.fitDecoder.destroy(),await this.tcxDecoder.destroy(),await this.activityProcessor.destroy()}};var Mn=j;export{U as ActivityProcessor,z as ActivityToFITEncoder,V as ActivityToGPXEncoder,W as ActivityToTCXEncoder,X as BaseActivityConverter,L as BaseActivityEncoder,ze as BaseActivityMiddleware,w as FITDecoder,A as FITEncoder,B as FITToActivityConverter,F as GPXDecoder,S as GPXEncoder,G as GPXToActivityConverter,me as PipelineStage,D as TCXDecoder,R as TCXEncoder,H as TCXToActivityConverter,j as TrackSwap,Mn as default,Be as registerDefaultMiddlewares};
26
+ `)}buildWorkouts(e){return"<Workouts></Workouts>"}buildCourses(e){return"<Courses></Courses>"}buildAuthor(e){let t=["<Author>"];return this.addOptionalElement(t,"Name",e.Name),t.push("</Author>"),t.join("")}buildExtensions(e){let t=this.buildExtensionContent(e);return t?`<Extensions>${t}</Extensions>`:""}buildExtensionContent(e){return Object.entries(e).filter(([t])=>!t.startsWith("xmlns")).map(([t,r])=>{if(r&&typeof r=="object"){let i=this.buildExtensionContent(r);return`<${t}>${i}</${t}>`}else if(r!=null)return`<${t}>${this.escapeXML(String(r))}</${t}>`;return""}).filter(t=>t).join("")}formatTime(e){return typeof e=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(e)?e:Ve(e).utc().format("YYYY-MM-DDTHH:mm:ss[Z]")}addOptionalElement(e,t,r,i){if(r!=null&&r!==""){let n=i?i(r):this.escapeXML(r);e.push(`<${t}>${n}</${t}>`)}}addOptionalNumericElement(e,t,r){r!=null&&!isNaN(r)&&e.push(`<${t}>${r}</${t}>`)}isValidCoordinate(e,t){return e!=null&&t!==void 0&&t!==null&&!isNaN(e)&&!isNaN(t)}formatCoordinate(e){return this.roundTo(e,6).toString()}roundTo(e,t){let r=Math.pow(10,t);return Math.round(e*r)/r}escapeXML(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}escapeXMLAttribute(e){return typeof e!="string"?String(e||""):e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r/g,"&#13;").replace(/\n/g,"&#10;").replace(/\t/g,"&#9;")}deepClone(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map(r=>this.deepClone(r));let t={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=this.deepClone(e[r]));return t}encoder(e){return this.encode(e)}};import pt from"dayjs";var S=class extends h{convertPoints(e){return e.map(t=>this.convertPoint(t)).filter(t=>t!==void 0)}convertTime(e){if(!e)return;if(typeof e=="number")return e;let t=pt(e);return t.isValid()?t.valueOf():void 0}},D=class{constructor(){this.version="1.0.0";this.priority=100}supports(e){return this.supportedTags.includes(e)}async initialize(e){e.metadata.set(`plugin:${this.name}:initialized`,!0)}async destroy(e){e.metadata.delete(`plugin:${this.name}:initialized`)}async validate(e){return!0}convertTimeToDate(e){return e?new Date(e):new Date}convertTimeToString(e){return this.convertTimeToDate(e).toISOString()}ensureValidCoordinates(e,t){return e>=-90&&e<=90&&t>=-180&&t<=180}round(e,t=6){let r=Math.pow(10,t);return Math.round(e*r)/r}},ze=class extends E{async onError(e,t){t.warnings.push(`Middleware ${this.name} error: ${e.message}`)}validateActivityFile(e){if(!e.metadata)return!1;if(e.routes){for(let t of e.routes)if(!this.validateRoute(t))return!1}if(e.points){for(let t of e.points)if(!this.validatePoint(t))return!1}if(e.activities){for(let t of e.activities)if(!this.validateActivity(t))return!1}return!0}validateActivity(e){return!!(e&&typeof e.index>"u"&&e.laps&&e.laps.length>0)}validateRoute(e){return!!(e.records&&e.records.length>0)}validatePoint(e){return!!e.timestamp}};var We={heartrate:"heartRate","gpxtpx:hr":"heartRate","ns3:hr":"heartRate","gpxdata:hr":"heartRate","gpxdata:cadence":"cadence","gpxtpx:cad":"cadence","ns3:cad":"cadence",cadence:"cadence","gpxtpx:speed":"speed","ns3:speed":"speed",speed:"speed",power:"power","gpxdata:power":"power","gpxpx:PowerInWatts":"power",PowerInWatts:"power","gpxtpx:temp":"temperature","gpxtpx:wtemp":"wtemp","gpxtpx:atemp":"atemp","gpxx:Temperature":"temperature","gpxx:Depth":"depth"},f=c=>c*(180/Math.pow(2,31));import je from"dayjs";import Ue from"dayjs";import{getPreciseDistance as dt}from"geolib";var A=class{calculateRecordsAggMetrics(e){if(!e||e.length===0)return;let t={records:this.preprocessRecords(e)},r=0;for(let i=0;i<t.records.length;i++){let n=t.records[i];if(!(!n.positionLat||!n.positionLong)){if(t!=null&&t.startPositionLat||(t.startPositionLat=n.positionLat),t!=null&&t.startPositionLong||(t.startPositionLong=n.positionLong),t.endPositionLat=n.positionLat,t.endPositionLong=n.positionLong,t.timestamp=n.timestamp,t!=null&&t.startTime||(t.startTime=n.timestamp),t.endTime=n.timestamp,n!=null&&n.distance?t.totalDistance=n.distance:i>0&&(r+=this.calculatePointDistanceByPosition(e[i-1],n)||0,t.totalDistance=r),n!=null&&n.speed&&(t.avgSpeed=t.avgSpeed?(t.avgSpeed+n.speed)/2:n.speed,t.maxSpeed=Math.max(t.maxSpeed||0,n.speed)),n!=null&&n.heartRate&&(t.maxHeartRate=Math.max(t.maxHeartRate||0,n.heartRate),t.minHeartRate=Math.min(t.minHeartRate||n.heartRate,n.heartRate),t.avgHeartRate?t.avgHeartRate=(t.avgHeartRate+n.heartRate)/2:t.avgHeartRate=n.heartRate),n!=null&&n.altitude&&(t.maxAltitude=Math.max(t.maxAltitude||0,n.altitude),t.minAltitude=Math.min(t.minAltitude||n.altitude,n.altitude),t.avgAltitude=t.avgAltitude?(t.avgAltitude+n.altitude)/2:n.altitude,i>0&&e[i-1].altitude)){let s=this.calculateElevationChanges(e[i-1],n);t.totalAscent=(t.totalAscent||0)+s.ascent,t.totalDescent=(t.totalDescent||0)+s.descent}if(n!=null&&n.cadence&&(t.maxCadence=Math.max(t.maxCadence||0,n.cadence),t.avgCadence?t.avgCadence=(t.avgCadence+n.cadence)/2:t.avgCadence=n.cadence),n!=null&&n.power){t.maxPower=Math.max(t.maxPower||0,n.power),t.avgPower?t.avgPower=(t.avgPower+n.power)/2:t.avgPower=n.power;let s=this.calculateAccumulatedPower(i>0?e[i-1]:n,n,t.totalWork||0);t.totalWork=s.newAccumulatedWork,t.normalizedPower=void 0}n!=null&&n.temperature&&(t.avgTemperature?t.avgTemperature=(t.avgTemperature+n.temperature)/2:t.avgTemperature=n.temperature,t.maxTemperature=Math.max(t.maxTemperature||0,n.temperature),t.minTemperature=Math.min(t.minTemperature||n.temperature,n.temperature))}}return t}calculateLapAggMetrics(e){var r;if(!e||e.length===0)return;let t={laps:e,timestamp:((r=e[0])==null?void 0:r.timestamp)||new Date};for(let i=0;i<e.length;i++){let n=e[i];n.startPositionLat&&n.startPositionLong&&!(t!=null&&t.startPositionLat)&&!(t!=null&&t.startPositionLong)&&(t.startPositionLat=n.startPositionLat,t.startPositionLong=n.startPositionLong),n.endPositionLat&&n.endPositionLong&&(t.endPositionLat=n.endPositionLat,t.endPositionLong=n.endPositionLong),n.startTime&&!(t!=null&&t.startTime)&&(t.startTime=n.startTime),n.endTime&&(t.endTime=n.endTime),t.timestamp=n.timestamp||n.endTime||t.timestamp,n.totalDistance&&(t.totalDistance=(t.totalDistance||0)+n.totalDistance),n.totalElapsedTime&&(t.totalElapsedTime=(t.totalElapsedTime||0)+n.totalElapsedTime),n.maxSpeed&&(t.maxSpeed=Math.max(t.maxSpeed||0,n.maxSpeed)),n.avgSpeed&&(t.avgSpeed?t.avgSpeed=(t.avgSpeed+n.avgSpeed)/2:t.avgSpeed=n.avgSpeed),n.maxHeartRate&&(t.maxHeartRate=Math.max(t.maxHeartRate||0,n.maxHeartRate)),n.minHeartRate&&(t.minHeartRate=t.minHeartRate?Math.min(t.minHeartRate,n.minHeartRate):n.minHeartRate),n.avgHeartRate&&(t.avgHeartRate?t.avgHeartRate=(t.avgHeartRate+n.avgHeartRate)/2:t.avgHeartRate=n.avgHeartRate),n.maxAltitude&&(t.maxAltitude=Math.max(t.maxAltitude||0,n.maxAltitude)),n.minAltitude&&(t.minAltitude=t.minAltitude?Math.min(t.minAltitude,n.minAltitude):n.minAltitude),n.avgAltitude&&(t.avgAltitude?t.avgAltitude=(t.avgAltitude+n.avgAltitude)/2:t.avgAltitude=n.avgAltitude),n.totalAscent&&(t.totalAscent=(t.totalAscent||0)+n.totalAscent),n.totalDescent&&(t.totalDescent=(t.totalDescent||0)+n.totalDescent),n.maxCadence&&(t.maxCadence=Math.max(t.maxCadence||0,n.maxCadence)),n.avgCadence&&(t.avgCadence?t.avgCadence=(t.avgCadence+n.avgCadence)/2:t.avgCadence=n.avgCadence),n.maxPower&&(t.maxPower=Math.max(t.maxPower||0,n.maxPower)),n.avgPower&&(t.avgPower?t.avgPower=(t.avgPower+n.avgPower)/2:t.avgPower=n.avgPower),n.totalWork&&(t.totalWork=(t.totalWork||0)+n.totalWork),n.maxTemperature&&(t.maxTemperature=Math.max(t.maxTemperature||0,n.maxTemperature)),n.minTemperature&&(t.minTemperature=t.minTemperature?Math.min(t.minTemperature,n.minTemperature):n.minTemperature),n.avgTemperature&&(t.avgTemperature?t.avgTemperature=(t.avgTemperature+n.avgTemperature)/2:t.avgTemperature=n.avgTemperature)}return t}preprocessRecords(e){if(!e||e.length===0)return e;let t=e.filter(s=>s.timestamp).sort((s,o)=>s.timestamp.valueOf()-o.timestamp.valueOf()),r=0,i=[],n=null;for(let s=0;s<t.length;s++){let o=t[s],a={...o};if(s>0&&n&&(a.distance||(a.distance=this.calculatePointDistanceByPosition(n,a)||0),o.speed||(a.speed=this.calculateInstantSpeed(n,a,a.distance)),o.power)){let p=this.calculateAccumulatedPower(n,a,r);a.accumulatedPower=p.accumulatedPower,r=p.newAccumulatedWork}n=a,i.push(a)}return i}calculatePointDistanceByPosition(e,t){if(!(!e.positionLat||!e.positionLong||!t.positionLat||!t.positionLong))try{return dt({latitude:e.positionLat,longitude:e.positionLong},{latitude:t.positionLat,longitude:t.positionLong})}catch{return}}calculateInstantSpeed(e,t,r){if(!e.timestamp||!t.timestamp||!r)return;let i=(Ue(t.timestamp).valueOf()-Ue(e.timestamp).valueOf())/1e3;if(!(i<=0))return r/i}calculateAccumulatedPower(e,t,r){var a,p;if(e.power===void 0||t.power===void 0||!e.timestamp||!t.timestamp)return{accumulatedPower:r,newAccumulatedWork:r};let i=((a=t.timestamp)==null?void 0:a.valueOf())-((p=e.timestamp)==null?void 0:p.valueOf());if(i<=0)return{accumulatedPower:r,newAccumulatedWork:r};let s=(e.power+t.power)/2*i,o=r+s;return{accumulatedPower:o,newAccumulatedWork:o}}calculateElevationChanges(e,t){let r=0,i=0;return t.altitude!==void 0&&e.altitude!==void 0&&(t.altitude>e.altitude?r=t.altitude-e.altitude:t.altitude<=e.altitude&&(i=e.altitude-t.altitude)),{ascent:r,descent:i}}};function y(c,e=0){let t=Math.pow(10,e);return Math.round(c*t)/t}var $=class extends S{constructor(){super(...arguments);this.name="gpx-to-activity-converter";this.supportedTags=["gpx"];this.convertGPXExtensions=t=>{let r={};return Object.entries(t).forEach(([i,n])=>{if(typeof n<"u"&&n!=="undefined"){let s=We[i]||i;r[s]=this.autoNumber(n)}}),r}}convert(t,r){if(r.sourceFormat!=="gpx")return;let i=r.sourceData;return this.convertGPX(i)}convertGPX(t){let r={metadata:{originType:"GPX",fileType:"gpx"},activities:[]};return t.wpt&&(r.points=this.convertWpts2Points(t.wpt)),t.trk&&(r.activities=t.trk.map((i,n)=>this.convertTrk2Activity(i,n))),t.rte&&(r.routes=t.rte.map((i,n)=>this.convertTrackSeg2Lap(i,n))),r}convertPoint(t,r){let{extensions:i}=t,n=i?this.convertGPXExtensions(i):{};return{index:r||0,positionLat:t==null?void 0:t.lat,positionLong:t==null?void 0:t.lon,altitude:t==null?void 0:t.ele,heartRate:t==null?void 0:t.heartRate,speed:t==null?void 0:t.speed,power:t==null?void 0:t.power,cadence:t==null?void 0:t.cadence,timestamp:je(t.time).toDate(),...n}}convertTrk2Activity(t,r){var s;let i=((s=t.trkseg)==null?void 0:s.map((o,a)=>this.convertTrackSeg2Lap(o,a)))||[],n=new A().calculateLapAggMetrics(i);return{index:r,messageIndex:r,laps:i,...n}}convertTrackSeg2Lap(t,r){var o,a;let i=((a=(o=t.trkpt)==null?void 0:o.filter(p=>p!==void 0&&p.time))==null?void 0:a.map((p,d)=>this.convertPoint(p,d)))||[],s=new A().calculateRecordsAggMetrics(i);return{index:r,messageIndex:r,...s,records:(s==null?void 0:s.records)||[]}}convertWpts2Points(t){let r=[];for(let i=0;i<t.length;i++){let n=this.convertPoint(t[i],i);n&&r.push(n)}return r}autoNumber(t){return typeof t=="string"&&t.trim()!==""&&!isNaN(t)?Number(t):t}},G=class extends S{constructor(){super(...arguments);this.name="fit-to-activity-converter";this.supportedTags=["fit"]}convert(t,r){if(r.sourceFormat!=="fit")return;let i=r.sourceData;return this.convertFIT(i)}convertFIT(t){var i,n;let r={metadata:{originType:"FIT",fileType:"fit"},activities:[]};return(i=t.sessionMesgs)!=null&&i.length?r.activities=t.sessionMesgs.map((s,o)=>({index:o,...s,startPositionLat:s!=null&&s.startPositionLat?y(f(Number(s.startPositionLat)),6):void 0,startPositionLong:s!=null&&s.startPositionLong?y(f(Number(s.startPositionLong)),6):void 0,endPositionLat:s!=null&&s.endPositionLat?y(f(Number(s.endPositionLat)),6):void 0,endPositionLong:s!=null&&s.endPositionLong?y(f(Number(s.endPositionLong)),6):void 0,laps:this.convertFITLap2Trackseg(s==null?void 0:s.lapMesgs)})):(n=t.courseMesgs)!=null&&n.length&&(r.routes=t.courseMesgs.map((s,o)=>({index:o,...s,records:this.convertLap2Points(s==null?void 0:s.lapMesgs)}))),r}convertPoint(t,r){let{positionLong:i,positionLat:n,altitude:s,enhancedAltitude:o,enhancedSpeed:a,speed:p,...d}=t;return{index:r||0,positionLat:n?y(f(Number(n)),6):void 0,positionLong:i?y(f(Number(i)),6):void 0,altitude:s||o||void 0,speed:p||a||void 0,...d}}convertFITLap2Trackseg(t){var i;let r=[];if(!(t!=null&&t.length))return[];for(let n=0;n<t.length;n++){let s=t[n],o=((i=s==null?void 0:s.recordMesgs)==null?void 0:i.map((a,p)=>this.convertPoint(a,p)).filter(a=>a!==void 0))||[];r.push({index:n,...s,startPositionLat:s!=null&&s.startPositionLat?y(f(Number(s.startPositionLat)),6):void 0,startPositionLong:s!=null&&s.startPositionLong?y(f(Number(s.startPositionLong)),6):void 0,endPositionLat:s!=null&&s.endPositionLat?y(f(Number(s.endPositionLat)),6):void 0,endPositionLong:s!=null&&s.endPositionLong?y(f(Number(s.endPositionLong)),6):void 0,records:o})}return r}convertLap2Points(t){var i;let r=[];if(!(t!=null&&t.length))return[];for(let n of t){let s=((i=n.recordMesgs)==null?void 0:i.map((o,a)=>this.convertPoint(o,a)).filter(o=>o!==void 0))||[];s.length&&(r=[...r,...s])}return r}},B=class extends S{constructor(){super(...arguments);this.name="tcx-to-activity-converter";this.supportedTags=["tcx"]}convert(t,r){if(r.sourceFormat!=="tcx")return;let i=r.sourceData;return this.convertTCX(i)}convertTCX(t){var i,n,s,o;let r={metadata:{originType:"TCX",fileType:"tcx"},activities:[]};return(n=(i=t.Activities)==null?void 0:i.Activity)!=null&&n.length&&(r.activities=t.Activities.Activity.map((a,p)=>this.convertTCXActivityToActivity(a,p))),(o=(s=t.Courses)==null?void 0:s.Course)!=null&&o.length,r}convertTCXActivityToActivity(t,r){var s;let i=((s=t.Lap)==null?void 0:s.map((o,a)=>this.convertTCXLap2Lap(o,a)))||[],n=new A().calculateLapAggMetrics(i);return{index:r,messageIndex:r,laps:i,...n}}convertTCXLap2Lap(t,r){var a;let i=((a=t==null?void 0:t.Track)==null?void 0:a.flatMap(p=>p.Trackpoint))||[],n=(i==null?void 0:i.filter(p=>p!==void 0&&p.Time!==void 0).map((p,d)=>this.convertPoint(p,d)))||[],o=new A().calculateRecordsAggMetrics(n);return{index:r,messageIndex:r,...o,records:(o==null?void 0:o.records)||[]}}convertPoint(t,r){let{Position:i,Time:n,DistanceMeters:s,AltitudeMeters:o}=t;return{index:r||0,positionLat:i!=null&&i.LatitudeDegrees?Number(i.LatitudeDegrees):void 0,positionLong:i!=null&&i.LongitudeDegrees?Number(i.LongitudeDegrees):void 0,timestamp:je(n).toDate(),distance:s,altitude:o}}};import lt from"dayjs";var H=class extends D{constructor(){super(...arguments);this.name="activity-to-gpx-encoder";this.supportedTags=["gpx"]}encode(t,r){var s,o,a,p,d;if(r.targetFormat!=="gpx"||!((s=t==null?void 0:t.activities)!=null&&s.length))return;let n={version:"1.1",creator:"TrackSwap",metadata:{time:((o=t.activities)==null?void 0:o[0]).timestamp}};return(a=t.points)!=null&&a.length&&(n.wpt=this.convertRecords2Wpts(t.points)),(p=t.routes)!=null&&p.length&&(n.rte=t.routes.map(l=>this.convertRoute2GPXRoute(l))),(d=t.activities)!=null&&d.length&&(n.trk=t.activities.map(l=>this.convertActivity2GPXTrack(l))),n}convertRecords2Wpts(t){return t==null?void 0:t.filter(r=>r.timestamp).map(r=>({lat:r==null?void 0:r.positionLat,lon:r==null?void 0:r.positionLong,ele:r==null?void 0:r.altitude,time:r==null?void 0:r.timestamp,speed:r==null?void 0:r.speed,hdop:r==null?void 0:r.hdop,vdop:r==null?void 0:r.vdop,pdop:r==null?void 0:r.pdop,extensions:this.extractGPXExtensions(r)}))}convertRoute2GPXRoute(t){return{rtept:t.records?this.convertRecords2Wpts(t.records):[]}}convertActivity2GPXTrack(t){var r;return{trkseg:((r=t.laps)==null?void 0:r.map(i=>({trkpt:i.records?this.convertRecords2Wpts(i.records):[]})))||[]}}extractGPXExtensions(t){let r={},i={};return typeof(t==null?void 0:t.heartRate)<"u"&&(i["gpxtpx:hr"]=t.heartRate),typeof(t==null?void 0:t.cadence)<"u"&&(i["gpxtpx:cad"]=t.cadence),typeof(t==null?void 0:t.temperature)<"u"&&(i["gpxtpx:atemp"]=t.temperature),Object.keys(i).length>0&&(r["gpxtpx:TrackPointExtension"]=i),typeof(t==null?void 0:t.power)<"u"&&(r["gpxpx:PowerExtension"]={"gpxpx:PowerInWatts":t.power}),Object.keys(r).length>0?r:void 0}},V=class extends D{constructor(){super(...arguments);this.name="activity-to-fit-encoder";this.supportedTags=["fit"]}encode(t,r){var n,s;if(r.targetFormat!=="fit"||!((n=t==null?void 0:t.activities)!=null&&n.length))return;let i={};return i.sessionMesgs=(s=t.activities)==null?void 0:s.map(o=>this.convertActivity2FITSession(o)),i}convertActivity2FITSession(t){var i;return{...t,event:(t==null?void 0:t.event)||"session",sport:(t==null?void 0:t.sport)||"generic",lapMesgs:((i=t.laps)==null?void 0:i.map(n=>this.convertLap2FITLap(n)))||[]}}convertLap2FITLap(t){var i;return{startTime:t.startTime,...t,recordMesgs:((i=t.records)==null?void 0:i.map(n=>this.convertPoint2FITRecord(n)))||[]}}convertPoint2FITRecord(t){return t}},z=class extends D{constructor(){super(...arguments);this.name="sport-to-tcx-encoder";this.supportedTags=["tcx"]}encode(t,r){var n;if(r.targetFormat!=="tcx"||!((n=t==null?void 0:t.activities)!=null&&n.length))return;let i={Author:{Name:"TrackSwap"}};return i.Activities={Activity:t.activities.map(s=>this.convertActivity2TCXActivity(s))},i}convertActivity2TCXActivity(t){var i;let r="Other";return(t.sport==="Running"||t.sport==="Biking")&&(r=t.sport),{Id:`Activity_${Date.now()}`,Activity:r,Lap:((i=t.laps)==null?void 0:i.map(n=>this.convertLap2TCXLap(n)))||[]}}convertLap2TCXLap(t){let r={TotalTimeSeconds:t.totalElapsedTime,DistanceMeters:t.totalDistance,MaximumSpeed:t.maxSpeed,Calories:t.totalCalories,AverageHeartRateBpm:t.avgHeartRate,MaximumHeartRateBpm:t.maxHeartRate,Intensity:"Active",TriggerMethod:"Manual",Track:t.records?[this.convertRecords2TCXTrack(t.records)]:[]};return(t.avgCadence!==void 0||t.maxCadence!==void 0)&&(r.Cadence={Low:t.avgCadence||0,High:t.maxCadence||0}),r}convertRecords2TCXTrack(t){return{Trackpoint:t.map(r=>this.convertPoint2TCXTrackpoint(r))}}convertPoint2TCXTrackpoint(t){var i,n;let r={Time:lt(t.timestamp).toISOString(),Position:{LatitudeDegrees:(i=t==null?void 0:t.positionLat)==null?void 0:i.toString(),LongitudeDegrees:(n=t==null?void 0:t.positionLong)==null?void 0:n.toString()},AltitudeMeters:t.altitude,DistanceMeters:t.distance};return t.heartRate&&(r.HeartRateBpm=t.heartRate),t.cadence&&(r.Cadence={Low:t.cadence,High:t.cadence256||t.cadence}),t.power&&(r.Extensions={"ns3:TPX":{"ns3:Watts":t.power}}),r}convertRoute2TCXCourse(t){return{Name:`Course_${Date.now()}`,Track:t.records?[this.convertRecords2TCXTrack(t.records)]:[]}}};var W=class{constructor(){this.converters=new Map;this.encoders=new Map;this.registerDefaultConverters(),this.registerDefaultEncoders()}registerDefaultConverters(){this.registerConverter(new $),this.registerConverter(new G),this.registerConverter(new B)}registerDefaultEncoders(){this.registerEncoder(new H),this.registerEncoder(new V),this.registerEncoder(new z)}registerConverter(e){this.converters.set(e.name,e)}registerEncoder(e){this.encoders.set(e.name,e)}async convertToActivity(e,t){let r={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},sourceFormat:t,sourceData:e,performance:{startTime:Date.now()}};try{let i=this.findConverter(t);if(!i)throw new Error(`No converter found for format "${t}"`);let n=Date.now(),s=i.convert(e,r);if(r.performance.convertTime=Date.now()-n,!s)throw new Error(`Converter "${i.name}" returned empty result`);let o=s;return r.result=o,r.performance.endTime=Date.now(),r.stats.endTime=Date.now(),o}catch(i){throw r.errors.push(i),i}}async encodeActivity(e,t){let r={metadata:new Map,errors:[],warnings:[],stats:{startTime:Date.now(),processedTokens:0,convertedElements:0},targetFormat:t,performance:{startTime:Date.now()}};try{let i=this.findEncoder(t);if(!i)throw new Error(`No encoder found for format "${t}"`);let n=Date.now(),s=i.encode(e,r);if(r.performance.encodeTime=Date.now()-n,!s)throw new Error(`Encoder "${i.name}" returned empty result`);return r.result=s,r.performance.endTime=Date.now(),r.stats.endTime=Date.now(),s}catch(i){throw r.errors.push(i),i}}findConverter(e){return Array.from(this.converters.values()).find(t=>{var r;return(r=t.supportedTags)==null?void 0:r.includes(e)})}findEncoder(e){return Array.from(this.encoders.values()).find(t=>{var r;return(r=t.supportedTags)==null?void 0:r.includes(e)})}async destroy(){this.converters.clear(),this.encoders.clear()}};var U=class{constructor(){this.gpxDecoder=new b,this.gpxEncoder=new I,this.fitDecoder=new C,this.fitEncoder=new w,this.tcxDecoder=new k,this.tcxEncoder=new F,this.activityProcessor=new W}async parseGPX(e){try{return await this.gpxDecoder.parserByBuffer(e)}catch(t){throw new Error(`GPX parsing failed: ${t.message}`)}}async parseGPXString(e){let t=Buffer.from(e,"utf-8");return this.parseGPX(t)}async encodeGPX(e){try{return await this.gpxEncoder.encode(e)}catch(t){throw new Error(`GPX encoding failed: ${t.message}`)}}encodeGPXString(e){try{return this.gpxEncoder.encodeToString(e)}catch(t){throw new Error(`GPX encoding failed: ${t.message}`)}}async parseFIT(e){try{return await this.fitDecoder.parseByBuffer(e)}catch(t){throw new Error(`FIT parsing failed: ${t.message}`)}}async encodeFIT(e){try{return await this.fitEncoder.encode(e)}catch(t){throw new Error(`FIT encoding failed: ${t.message}`)}}async encodeFITCourse(e){try{return await this.fitEncoder.encodeCourse(e)}catch(t){throw new Error(`FIT Course encoding failed: ${t.message}`)}}async parseTCXString(e){let t=Buffer.from(e,"utf-8");return this.parseTCX(t)}async parseTCX(e){try{let t=await this.tcxDecoder.parseByBuffer(e);if(!t)throw new Error("TCX parsing result is empty");return t}catch(t){throw new Error(`TCX parsing failed: ${t.message}`)}}async encodeTCX(e){try{return await this.tcxEncoder.encode(e)}catch(t){throw new Error(`TCX encoding failed: ${t.message}`)}}async encodeTCXString(e){try{return await this.tcxEncoder.encodeToString(e)}catch(t){throw new Error(`TCX encoding failed: ${t.message}`)}}async convertGPXToActivity(e){return await this.activityProcessor.convertToActivity(e,"gpx")}async convertFITToActivity(e){return await this.activityProcessor.convertToActivity(e,"fit")}async convertTCXToActivity(e){return await this.activityProcessor.convertToActivity(e,"tcx")}async convertActivityToGPX(e){return await this.activityProcessor.encodeActivity(e,"gpx")}async convertActivityToFIT(e){return await this.activityProcessor.encodeActivity(e,"fit")}async convertActivityToTCX(e){return await this.activityProcessor.encodeActivity(e,"tcx")}async convertFile(e,t,r){try{let i=r||this.detectFormat(e);if(i==="unknown"||i==null)throw new Error("Unable to recognize source file format, please specify sourceType parameter");if(i===t)return e;let n;switch(i){case"gpx":let o=await this.parseGPX(e);if(!o)throw new Error("GPX file parsing failed");n=o;break;case"fit":n=await this.parseFIT(e);break;case"tcx":n=await this.parseTCX(e);break;default:throw new Error(`Unsupported source file format: ${i}`)}let s;switch(i){case"gpx":s=await this.convertGPXToActivity(n);break;case"fit":s=await this.convertFITToActivity(n);break;case"tcx":s=await this.convertTCXToActivity(n);break;default:throw new Error(`Unsupported source file format conversion: ${i}`)}switch(t){case"gpx":let o=await this.convertActivityToGPX(s);return await this.encodeGPX(o);case"fit":let a=await this.convertActivityToFIT(s);return await this.encodeFIT(a);case"tcx":let p=await this.convertActivityToTCX(s);return await this.encodeTCX(p);default:throw new Error(`Unsupported target file format: ${t}`)}}catch(i){let n=r||"auto-detect";throw new Error(`${n} to ${t.toUpperCase()} failed: ${i.message}`)}}detectFormat(e){let t=e.toString("utf-8",0,Math.min(1024,e.length));if(e.length>=12&&e.toString("ascii",8,12)===".FIT")return"fit";if(t.includes("<?xml")){if(t.includes("<gpx")||t.includes("http://www.topografix.com/GPX/"))return"gpx";if(t.includes("<TrainingCenterDatabase")||t.includes("http://www.garmin.com/xmlschemas/TrainingCenterDatabase/"))return"tcx"}return"unknown"}async parseFile(e,t){let r=t||this.detectFormat(e);if(r==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");switch(r){case"gpx":let i=await this.parseGPX(e);if(!i)throw new Error("GPX parsing failed");return i;case"fit":return await this.parseFIT(e);case"tcx":return await this.parseTCX(e);default:throw new Error(`Unsupported file format: ${r}`)}}async parseToActivity(e,t){let r=t||this.detectFormat(e);if(r==="unknown")throw new Error("Unable to recognize file format, please specify sourceType parameter");let i;switch(r){case"gpx":let n=await this.parseGPX(e);if(!n)throw new Error("GPX parsing failed");i=await this.convertGPXToActivity(n);break;case"fit":let s=await this.parseFIT(e);s&&(i=await this.convertFITToActivity(s));break;case"tcx":let o=await this.parseTCX(e);i=await this.convertTCXToActivity(o);break;default:throw new Error(`Unsupported file format: ${r}`)}return i}getActivityProcessor(){return this.activityProcessor}getGPXDecoder(){return this.gpxDecoder}getGPXEncoder(){return this.gpxEncoder}getFITDecoder(){return this.fitDecoder}getFITEncoder(){return this.fitEncoder}getTCXDecoder(){return this.tcxDecoder}getTCXEncoder(){return this.tcxEncoder}async destroy(){await this.gpxDecoder.destroy(),await this.fitDecoder.destroy(),await this.tcxDecoder.destroy(),await this.activityProcessor.destroy()}};var Mn=U;export{W as ActivityProcessor,V as ActivityToFITEncoder,H as ActivityToGPXEncoder,z as ActivityToTCXEncoder,S as BaseActivityConverter,D as BaseActivityEncoder,ze as BaseActivityMiddleware,C as FITDecoder,w as FITEncoder,G as FITToActivityConverter,b as GPXDecoder,I as GPXEncoder,$ as GPXToActivityConverter,me as PipelineStage,k as TCXDecoder,F as TCXEncoder,B as TCXToActivityConverter,U as TrackSwap,Mn as default,Be as registerDefaultMiddlewares};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trackswap",
3
- "version": "0.0.18",
3
+ "version": "0.0.20",
4
4
  "description": "A powerful and flexible GPX parser and encoder library for Node.js and TypeScript. TrackSwap provides comprehensive support for GPX 1.1 format with advanced features like plugin system, middleware support, and optimized performance.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",