/////////////////////////////////////////////////////////////////////////////////////////////
// Copyright 2024 Garmin International, Inc.
// Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you
// may not use this file except in compliance with the Flexible and Interoperable Data
// Transfer (FIT) Protocol License.
/////////////////////////////////////////////////////////////////////////////////////////////
// ****WARNING****  This file is auto-generated!  Do NOT edit this file.
// Profile Version = 21.158.0Release
// Tag = production/release/21.158.0-0-gc9428aa
/////////////////////////////////////////////////////////////////////////////////////////////


#include "fit_profile.hpp"

namespace fit
{

static const Profile::SUBFIELD_MAP fileIdProductFaveroProductMaps[] =
{
   { 263, 1 }, // manufacturer == favero_electronics
};

static const Profile::SUBFIELD_MAP fileIdProductGarminProductMaps[] =
{
   { 1, 1 }, // manufacturer == garmin
   { 15, 1 }, // manufacturer == dynastream
   { 13, 1 }, // manufacturer == dynastream_oem
   { 89, 1 }, // manufacturer == tacx
};

static const Profile::SUBFIELD fileIdProductSubFields[] =
{
   { fileIdProductFaveroProductMaps, 0, "favero_product", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { fileIdProductGarminProductMaps, 0, "garmin_product", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 4, 0, 132 },
};

static const Profile::FIELD fileIdFields[] =
{
{ 0, 0, "type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::File },
{ 0, 0, "manufacturer", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Manufacturer },
{ 0, fileIdProductSubFields, "product", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 2, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "serial_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 140, false, Profile::Type::Uint32z },
{ 0, 0, "time_created", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::DateTime },
{ 0, 0, "number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 132, false, Profile::Type::Uint16 },
{ 0, 0, "product_name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 7, false, Profile::Type::String },
};

static const Profile::FIELD fileCreatorFields[] =
{
{ 0, 0, "software_version", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "hardware_version", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD timestampCorrelationFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "fractional_timestamp", "s", (FIT_FLOAT64)32768, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "system_timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::DateTime },
{ 0, 0, "fractional_system_timestamp", "s", (FIT_FLOAT64)32768, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "local_timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::LocalDateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "system_timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD softwareFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "version", "", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "part_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 7, false, Profile::Type::String },
};

static const Profile::SUBFIELD_MAP slaveDeviceProductFaveroProductMaps[] =
{
   { 263, 0 }, // manufacturer == favero_electronics
};

static const Profile::SUBFIELD_MAP slaveDeviceProductGarminProductMaps[] =
{
   { 1, 0 }, // manufacturer == garmin
   { 15, 0 }, // manufacturer == dynastream
   { 13, 0 }, // manufacturer == dynastream_oem
   { 89, 0 }, // manufacturer == tacx
};

static const Profile::SUBFIELD slaveDeviceProductSubFields[] =
{
   { slaveDeviceProductFaveroProductMaps, 0, "favero_product", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { slaveDeviceProductGarminProductMaps, 0, "garmin_product", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 4, 0, 132 },
};

static const Profile::FIELD slaveDeviceFields[] =
{
{ 0, 0, "manufacturer", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Manufacturer },
{ 0, slaveDeviceProductSubFields, "product", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 2, 1, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD capabilitiesFields[] =
{
{ 0, 0, "languages", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 10, false, Profile::Type::Uint8z },
{ 0, 0, "sports", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 10, false, Profile::Type::SportBits0 },
{ 0, 0, "workouts_supported", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 21, 140, false, Profile::Type::WorkoutCapabilities },
{ 0, 0, "connectivity_supported", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 23, 140, false, Profile::Type::ConnectivityCapabilities },
};

static const Profile::FIELD fileCapabilitiesFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::File },
{ 0, 0, "flags", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 10, false, Profile::Type::FileFlags },
{ 0, 0, "directory", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 7, false, Profile::Type::String },
{ 0, 0, "max_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_size", "bytes", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
};

static const Profile::SUBFIELD_MAP mesgCapabilitiesCountNumPerFileMaps[] =
{
   { 0, 2 }, // count_type == num_per_file
};

static const Profile::SUBFIELD_MAP mesgCapabilitiesCountMaxPerFileMaps[] =
{
   { 1, 2 }, // count_type == max_per_file
};

static const Profile::SUBFIELD_MAP mesgCapabilitiesCountMaxPerFileTypeMaps[] =
{
   { 2, 2 }, // count_type == max_per_file_type
};

static const Profile::SUBFIELD mesgCapabilitiesCountSubFields[] =
{
   { mesgCapabilitiesCountNumPerFileMaps, 0, "num_per_file", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { mesgCapabilitiesCountMaxPerFileMaps, 0, "max_per_file", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { mesgCapabilitiesCountMaxPerFileTypeMaps, 0, "max_per_file_type", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
};

static const Profile::FIELD mesgCapabilitiesFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "file", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::File },
{ 0, 0, "mesg_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::MesgNum },
{ 0, 0, "count_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::MesgCount },
{ 0, mesgCapabilitiesCountSubFields, "count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 3, 3, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD fieldCapabilitiesFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "file", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::File },
{ 0, 0, "mesg_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::MesgNum },
{ 0, 0, "field_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::Uint8 },
{ 0, 0, "count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD deviceSettingsFields[] =
{
{ 0, 0, "active_time_zone", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
{ 0, 0, "utc_offset", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_offset", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_mode", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::TimeMode },
{ 0, 0, "time_zone_offset", "hr", (FIT_FLOAT64)4, (FIT_FLOAT64)0, 0, 0, 5, 1, false, Profile::Type::Sint8 },
{ 0, 0, "backlight_mode", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 0, false, Profile::Type::BacklightMode },
{ 0, 0, "activity_tracker_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 36, 0, false, Profile::Type::Bool },
{ 0, 0, "clock_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 39, 134, false, Profile::Type::DateTime },
{ 0, 0, "pages_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 40, 132, false, Profile::Type::Uint16 },
{ 0, 0, "move_alert_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 46, 0, false, Profile::Type::Bool },
{ 0, 0, "date_mode", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 47, 0, false, Profile::Type::DateMode },
{ 0, 0, "display_orientation", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 55, 0, false, Profile::Type::DisplayOrientation },
{ 0, 0, "mounting_side", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 56, 0, false, Profile::Type::Side },
{ 0, 0, "default_page", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 57, 132, false, Profile::Type::Uint16 },
{ 0, 0, "autosync_min_steps", "steps", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 58, 132, false, Profile::Type::Uint16 },
{ 0, 0, "autosync_min_time", "minutes", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 59, 132, false, Profile::Type::Uint16 },
{ 0, 0, "lactate_threshold_autodetect_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 80, 0, false, Profile::Type::Bool },
{ 0, 0, "ble_auto_upload_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 86, 0, false, Profile::Type::Bool },
{ 0, 0, "auto_sync_frequency", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 89, 0, false, Profile::Type::AutoSyncFrequency },
{ 0, 0, "auto_activity_detect", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 90, 134, false, Profile::Type::AutoActivityDetect },
{ 0, 0, "number_of_screens", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 94, 2, false, Profile::Type::Uint8 },
{ 0, 0, "smart_notification_display_orientation", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 95, 0, false, Profile::Type::DisplayOrientation },
{ 0, 0, "tap_interface", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 134, 0, false, Profile::Type::Switch },
{ 0, 0, "tap_sensitivity", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 174, 0, false, Profile::Type::TapSensitivity },
};

static const Profile::FIELD userProfileFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "friendly_name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 7, false, Profile::Type::String },
{ 0, 0, "gender", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::Gender },
{ 0, 0, "age", "years", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::Uint8 },
{ 0, 0, "height", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "weight", "kg", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "language", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 0, false, Profile::Type::Language },
{ 0, 0, "elev_setting", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 0, false, Profile::Type::DisplayMeasure },
{ 0, 0, "weight_setting", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::DisplayMeasure },
{ 0, 0, "resting_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 2, false, Profile::Type::Uint8 },
{ 0, 0, "default_max_running_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 2, false, Profile::Type::Uint8 },
{ 0, 0, "default_max_biking_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 2, false, Profile::Type::Uint8 },
{ 0, 0, "default_max_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 2, false, Profile::Type::Uint8 },
{ 0, 0, "hr_setting", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 0, false, Profile::Type::DisplayHeart },
{ 0, 0, "speed_setting", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 0, false, Profile::Type::DisplayMeasure },
{ 0, 0, "dist_setting", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 14, 0, false, Profile::Type::DisplayMeasure },
{ 0, 0, "power_setting", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 16, 0, false, Profile::Type::DisplayPower },
{ 0, 0, "activity_class", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 17, 0, false, Profile::Type::ActivityClass },
{ 0, 0, "position_setting", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 18, 0, false, Profile::Type::DisplayPosition },
{ 0, 0, "temperature_setting", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 21, 0, false, Profile::Type::DisplayMeasure },
{ 0, 0, "local_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 22, 132, false, Profile::Type::UserLocalId },
{ 0, 0, "global_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 23, 13, false, Profile::Type::Byte },
{ 0, 0, "wake_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 28, 134, false, Profile::Type::LocaltimeIntoDay },
{ 0, 0, "sleep_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 29, 134, false, Profile::Type::LocaltimeIntoDay },
{ 0, 0, "height_setting", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 30, 0, false, Profile::Type::DisplayMeasure },
{ 0, 0, "user_running_step_length", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 31, 132, false, Profile::Type::Uint16 },
{ 0, 0, "user_walking_step_length", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 32, 132, false, Profile::Type::Uint16 },
{ 0, 0, "depth_setting", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 47, 0, false, Profile::Type::DisplayMeasure },
{ 0, 0, "dive_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 49, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD hrmProfileFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Bool },
{ 0, 0, "hrm_ant_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 139, false, Profile::Type::Uint16z },
{ 0, 0, "log_hrv", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::Bool },
{ 0, 0, "hrm_ant_id_trans_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 10, false, Profile::Type::Uint8z },
};

static const Profile::FIELD sdmProfileFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Bool },
{ 0, 0, "sdm_ant_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 139, false, Profile::Type::Uint16z },
{ 0, 0, "sdm_cal_factor", "%", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "odometer", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "speed_source", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::Bool },
{ 0, 0, "sdm_ant_id_trans_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 10, false, Profile::Type::Uint8z },
{ 0, 0, "odometer_rollover", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD bikeProfileFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 7, false, Profile::Type::String },
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::Sport },
{ 0, 0, "sub_sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::SubSport },
{ 0, 0, "odometer", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "bike_spd_ant_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 139, false, Profile::Type::Uint16z },
{ 0, 0, "bike_cad_ant_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 139, false, Profile::Type::Uint16z },
{ 0, 0, "bike_spdcad_ant_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 139, false, Profile::Type::Uint16z },
{ 0, 0, "bike_power_ant_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 139, false, Profile::Type::Uint16z },
{ 0, 0, "custom_wheelsize", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 8, 132, false, Profile::Type::Uint16 },
{ 0, 0, "auto_wheelsize", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 9, 132, false, Profile::Type::Uint16 },
{ 0, 0, "bike_weight", "kg", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 10, 132, false, Profile::Type::Uint16 },
{ 0, 0, "power_cal_factor", "%", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 11, 132, false, Profile::Type::Uint16 },
{ 0, 0, "auto_wheel_cal", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 0, false, Profile::Type::Bool },
{ 0, 0, "auto_power_zero", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 0, false, Profile::Type::Bool },
{ 0, 0, "id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 14, 2, false, Profile::Type::Uint8 },
{ 0, 0, "spd_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 15, 0, false, Profile::Type::Bool },
{ 0, 0, "cad_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 16, 0, false, Profile::Type::Bool },
{ 0, 0, "spdcad_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 17, 0, false, Profile::Type::Bool },
{ 0, 0, "power_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 18, 0, false, Profile::Type::Bool },
{ 0, 0, "crank_length", "mm", (FIT_FLOAT64)2, (FIT_FLOAT64)-110, 0, 0, 19, 2, false, Profile::Type::Uint8 },
{ 0, 0, "enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 20, 0, false, Profile::Type::Bool },
{ 0, 0, "bike_spd_ant_id_trans_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 21, 10, false, Profile::Type::Uint8z },
{ 0, 0, "bike_cad_ant_id_trans_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 22, 10, false, Profile::Type::Uint8z },
{ 0, 0, "bike_spdcad_ant_id_trans_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 23, 10, false, Profile::Type::Uint8z },
{ 0, 0, "bike_power_ant_id_trans_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 24, 10, false, Profile::Type::Uint8z },
{ 0, 0, "odometer_rollover", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 37, 2, false, Profile::Type::Uint8 },
{ 0, 0, "front_gear_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 38, 10, false, Profile::Type::Uint8z },
{ 0, 0, "front_gear", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 39, 10, false, Profile::Type::Uint8z },
{ 0, 0, "rear_gear_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 40, 10, false, Profile::Type::Uint8z },
{ 0, 0, "rear_gear", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 41, 10, false, Profile::Type::Uint8z },
{ 0, 0, "shimano_di2_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 44, 0, false, Profile::Type::Bool },
};

static const Profile::FIELD connectivityFields[] =
{
{ 0, 0, "bluetooth_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Bool },
{ 0, 0, "bluetooth_le_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::Bool },
{ 0, 0, "ant_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::Bool },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 7, false, Profile::Type::String },
{ 0, 0, "live_tracking_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::Bool },
{ 0, 0, "weather_conditions_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 0, false, Profile::Type::Bool },
{ 0, 0, "weather_alerts_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 0, false, Profile::Type::Bool },
{ 0, 0, "auto_activity_upload_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::Bool },
{ 0, 0, "course_download_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 0, false, Profile::Type::Bool },
{ 0, 0, "workout_download_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 0, false, Profile::Type::Bool },
{ 0, 0, "gps_ephemeris_download_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 0, false, Profile::Type::Bool },
{ 0, 0, "incident_detection_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 0, false, Profile::Type::Bool },
{ 0, 0, "grouptrack_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 0, false, Profile::Type::Bool },
};

static const Profile::SUBFIELD_MAP watchfaceSettingsLayoutDigitalLayoutMaps[] =
{
   { 0, 0 }, // mode == digital
};

static const Profile::SUBFIELD_MAP watchfaceSettingsLayoutAnalogLayoutMaps[] =
{
   { 1, 0 }, // mode == analog
};

static const Profile::SUBFIELD watchfaceSettingsLayoutSubFields[] =
{
   { watchfaceSettingsLayoutDigitalLayoutMaps, 0, "digital_layout", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 0 },
   { watchfaceSettingsLayoutAnalogLayoutMaps, 0, "analog_layout", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 0 },
};

static const Profile::FIELD watchfaceSettingsFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "mode", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::WatchfaceMode },
{ 0, watchfaceSettingsLayoutSubFields, "layout", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 2, 1, 13, false, Profile::Type::Byte },
};

static const Profile::FIELD ohrSettingsFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Switch },
};

static const Profile::FIELD timeInZoneFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "reference_mesg", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::MesgNum },
{ 0, 0, "reference_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "time_in_hr_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_speed_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_cadence_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_power_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 5, 134, false, Profile::Type::Uint32 },
{ 0, 0, "hr_zone_high_boundary", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 2, false, Profile::Type::Uint8 },
{ 0, 0, "speed_zone_high_boundary", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 7, 132, false, Profile::Type::Uint16 },
{ 0, 0, "cadence_zone_high_bondary", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 2, false, Profile::Type::Uint8 },
{ 0, 0, "power_zone_high_boundary", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 132, false, Profile::Type::Uint16 },
{ 0, 0, "hr_calc_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 0, false, Profile::Type::HrZoneCalc },
{ 0, 0, "max_heart_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 2, false, Profile::Type::Uint8 },
{ 0, 0, "resting_heart_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 2, false, Profile::Type::Uint8 },
{ 0, 0, "threshold_heart_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 2, false, Profile::Type::Uint8 },
{ 0, 0, "pwr_calc_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 14, 0, false, Profile::Type::PwrZoneCalc },
{ 0, 0, "functional_threshold_power", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 15, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD zonesTargetFields[] =
{
{ 0, 0, "max_heart_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "threshold_heart_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::Uint8 },
{ 0, 0, "functional_threshold_power", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "hr_calc_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 0, false, Profile::Type::HrZoneCalc },
{ 0, 0, "pwr_calc_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::PwrZoneCalc },
};

static const Profile::FIELD sportFields[] =
{
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Sport },
{ 0, 0, "sub_sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::SubSport },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 7, false, Profile::Type::String },
};

static const Profile::FIELD hrZoneFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "high_bpm", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 7, false, Profile::Type::String },
};

static const Profile::FIELD speedZoneFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "high_value", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 7, false, Profile::Type::String },
};

static const Profile::FIELD cadenceZoneFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "high_value", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 7, false, Profile::Type::String },
};

static const Profile::FIELD powerZoneFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "high_value", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 7, false, Profile::Type::String },
};

static const Profile::FIELD metZoneFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "high_bpm", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "calories", "kcal / min", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "fat_calories", "kcal / min", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
};

static const Profile::SUBFIELD_MAP diveSettingsHeartRateSourceHeartRateAntplusDeviceTypeMaps[] =
{
   { 1, 19 }, // heart_rate_source_type == antplus
};

static const Profile::SUBFIELD_MAP diveSettingsHeartRateSourceHeartRateLocalDeviceTypeMaps[] =
{
   { 5, 19 }, // heart_rate_source_type == local
};

static const Profile::SUBFIELD diveSettingsHeartRateSourceSubFields[] =
{
   { diveSettingsHeartRateSourceHeartRateAntplusDeviceTypeMaps, 0, "heart_rate_antplus_device_type", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
   { diveSettingsHeartRateSourceHeartRateLocalDeviceTypeMaps, 0, "heart_rate_local_device_type", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
};

static const Profile::FIELD diveSettingsFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 7, false, Profile::Type::String },
{ 0, 0, "model", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::TissueModelType },
{ 0, 0, "gf_low", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::Uint8 },
{ 0, 0, "gf_high", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "water_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::WaterType },
{ 0, 0, "water_density", "kg/m^3", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 136, false, Profile::Type::Float32 },
{ 0, 0, "po2_warn", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 6, 2, false, Profile::Type::Uint8 },
{ 0, 0, "po2_critical", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 7, 2, false, Profile::Type::Uint8 },
{ 0, 0, "po2_deco", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 8, 2, false, Profile::Type::Uint8 },
{ 0, 0, "safety_stop_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 0, false, Profile::Type::Bool },
{ 0, 0, "bottom_depth", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 136, false, Profile::Type::Float32 },
{ 0, 0, "bottom_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 134, false, Profile::Type::Uint32 },
{ 0, 0, "apnea_countdown_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 0, false, Profile::Type::Bool },
{ 0, 0, "apnea_countdown_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 134, false, Profile::Type::Uint32 },
{ 0, 0, "backlight_mode", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 14, 0, false, Profile::Type::DiveBacklightMode },
{ 0, 0, "backlight_brightness", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 15, 2, false, Profile::Type::Uint8 },
{ 0, 0, "backlight_timeout", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 16, 2, false, Profile::Type::BacklightTimeout },
{ 0, 0, "repeat_dive_interval", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 17, 132, false, Profile::Type::Uint16 },
{ 0, 0, "safety_stop_time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 18, 132, false, Profile::Type::Uint16 },
{ 0, 0, "heart_rate_source_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 19, 0, false, Profile::Type::SourceType },
{ 0, diveSettingsHeartRateSourceSubFields, "heart_rate_source", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 2, 20, 2, false, Profile::Type::Uint8 },
{ 0, 0, "travel_gas", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 21, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "ccr_low_setpoint_switch_mode", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 22, 0, false, Profile::Type::CcrSetpointSwitchMode },
{ 0, 0, "ccr_low_setpoint", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 23, 2, false, Profile::Type::Uint8 },
{ 0, 0, "ccr_low_setpoint_depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 24, 134, false, Profile::Type::Uint32 },
{ 0, 0, "ccr_high_setpoint_switch_mode", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 25, 0, false, Profile::Type::CcrSetpointSwitchMode },
{ 0, 0, "ccr_high_setpoint", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 26, 2, false, Profile::Type::Uint8 },
{ 0, 0, "ccr_high_setpoint_depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 27, 134, false, Profile::Type::Uint32 },
{ 0, 0, "gas_consumption_display", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 29, 0, false, Profile::Type::GasConsumptionRateType },
{ 0, 0, "up_key_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 30, 0, false, Profile::Type::Bool },
{ 0, 0, "dive_sounds", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 35, 0, false, Profile::Type::Tone },
{ 0, 0, "last_stop_multiple", "", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 36, 2, false, Profile::Type::Uint8 },
{ 0, 0, "no_fly_time_mode", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 37, 0, false, Profile::Type::NoFlyTimeMode },
};

static const Profile::FIELD diveAlarmFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 0, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 133, false, Profile::Type::Sint32 },
{ 0, 0, "enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::Bool },
{ 0, 0, "alarm_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 0, false, Profile::Type::DiveAlarmType },
{ 0, 0, "sound", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::Tone },
{ 0, 0, "dive_types", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 0, false, Profile::Type::SubSport },
{ 0, 0, "id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 134, false, Profile::Type::Uint32 },
{ 0, 0, "popup_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::Bool },
{ 0, 0, "trigger_on_descent", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 0, false, Profile::Type::Bool },
{ 0, 0, "trigger_on_ascent", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 0, false, Profile::Type::Bool },
{ 0, 0, "repeating", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 0, false, Profile::Type::Bool },
{ 0, 0, "speed", "mps", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 11, 133, false, Profile::Type::Sint32 },
};

static const Profile::FIELD diveApneaAlarmFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 0, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 133, false, Profile::Type::Sint32 },
{ 0, 0, "enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::Bool },
{ 0, 0, "alarm_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 0, false, Profile::Type::DiveAlarmType },
{ 0, 0, "sound", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::Tone },
{ 0, 0, "dive_types", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 0, false, Profile::Type::SubSport },
{ 0, 0, "id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 134, false, Profile::Type::Uint32 },
{ 0, 0, "popup_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::Bool },
{ 0, 0, "trigger_on_descent", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 0, false, Profile::Type::Bool },
{ 0, 0, "trigger_on_ascent", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 0, false, Profile::Type::Bool },
{ 0, 0, "repeating", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 0, false, Profile::Type::Bool },
{ 0, 0, "speed", "mps", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 11, 133, false, Profile::Type::Sint32 },
};

static const Profile::FIELD diveGasFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "helium_content", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
{ 0, 0, "oxygen_content", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "status", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::DiveGasStatus },
{ 0, 0, "mode", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 0, false, Profile::Type::DiveGasMode },
};

static const Profile::FIELD goalFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Sport },
{ 0, 0, "sub_sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::SubSport },
{ 0, 0, "start_date", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::DateTime },
{ 0, 0, "end_date", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::DateTime },
{ 0, 0, "type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::Goal },
{ 0, 0, "value", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 134, false, Profile::Type::Uint32 },
{ 0, 0, "repeat", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 0, false, Profile::Type::Bool },
{ 0, 0, "target_value", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 134, false, Profile::Type::Uint32 },
{ 0, 0, "recurrence", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 0, false, Profile::Type::GoalRecurrence },
{ 0, 0, "recurrence_value", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 132, false, Profile::Type::Uint16 },
{ 0, 0, "enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 0, false, Profile::Type::Bool },
{ 0, 0, "source", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 0, false, Profile::Type::GoalSource },
};

static const Profile::FIELD activityFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "total_timer_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 0, 134, false, Profile::Type::Uint32 },
{ 0, 0, "num_sessions", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::Activity },
{ 0, 0, "event", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 0, false, Profile::Type::Event },
{ 0, 0, "event_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::EventType },
{ 0, 0, "local_timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 134, false, Profile::Type::LocalDateTime },
{ 0, 0, "event_group", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD_COMPONENT sessionAvgSpeedComponents[] =
{
   { (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 124, 16, FIT_FALSE }, // enhanced_avg_speed
};

static const Profile::FIELD_COMPONENT sessionMaxSpeedComponents[] =
{
   { (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 125, 16, FIT_FALSE }, // enhanced_max_speed
};

static const Profile::FIELD_COMPONENT sessionAvgAltitudeComponents[] =
{
   { (FIT_FLOAT64)5, (FIT_FLOAT64)500, 126, 16, FIT_FALSE }, // enhanced_avg_altitude
};

static const Profile::FIELD_COMPONENT sessionMaxAltitudeComponents[] =
{
   { (FIT_FLOAT64)5, (FIT_FLOAT64)500, 128, 16, FIT_FALSE }, // enhanced_max_altitude
};

static const Profile::FIELD_COMPONENT sessionMinAltitudeComponents[] =
{
   { (FIT_FLOAT64)5, (FIT_FLOAT64)500, 127, 16, FIT_FALSE }, // enhanced_min_altitude
};

static const Profile::FIELD_COMPONENT sessionAvgRespirationRateComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 169, 8, FIT_FALSE }, // enhanced_avg_respiration_rate
};

static const Profile::FIELD_COMPONENT sessionMaxRespirationRateComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 170, 8, FIT_FALSE }, // enhanced_max_respiration_rate
};

static const Profile::FIELD_COMPONENT sessionMinRespirationRateComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 180, 8, FIT_FALSE }, // enhanced_min_respiration_rate
};

static const Profile::SUBFIELD_MAP sessionTotalCyclesTotalStridesMaps[] =
{
   { 1, 5 }, // sport == running
   { 11, 5 }, // sport == walking
};

static const Profile::SUBFIELD_MAP sessionTotalCyclesTotalStrokesMaps[] =
{
   { 2, 5 }, // sport == cycling
   { 5, 5 }, // sport == swimming
   { 15, 5 }, // sport == rowing
   { 37, 5 }, // sport == stand_up_paddleboarding
};

static const Profile::SUBFIELD_MAP sessionAvgCadenceAvgRunningCadenceMaps[] =
{
   { 1, 5 }, // sport == running
};

static const Profile::SUBFIELD_MAP sessionMaxCadenceMaxRunningCadenceMaps[] =
{
   { 1, 5 }, // sport == running
};

static const Profile::SUBFIELD sessionTotalCyclesSubFields[] =
{
   { sessionTotalCyclesTotalStridesMaps, 0, "total_strides", "strides", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 2, 0, 134 },
   { sessionTotalCyclesTotalStrokesMaps, 0, "total_strokes", "strokes", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 4, 0, 134 },
};

static const Profile::SUBFIELD sessionAvgCadenceSubFields[] =
{
   { sessionAvgCadenceAvgRunningCadenceMaps, 0, "avg_running_cadence", "strides/min", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
};

static const Profile::SUBFIELD sessionMaxCadenceSubFields[] =
{
   { sessionMaxCadenceMaxRunningCadenceMaps, 0, "max_running_cadence", "strides/min", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
};

static const Profile::FIELD sessionFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "event", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Event },
{ 0, 0, "event_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::EventType },
{ 0, 0, "start_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::DateTime },
{ 0, 0, "start_position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 133, false, Profile::Type::Sint32 },
{ 0, 0, "start_position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 133, false, Profile::Type::Sint32 },
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 0, false, Profile::Type::Sport },
{ 0, 0, "sub_sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 0, false, Profile::Type::SubSport },
{ 0, 0, "total_elapsed_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 7, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_timer_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 8, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_distance", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 9, 134, false, Profile::Type::Uint32 },
{ 0, sessionTotalCyclesSubFields, "total_cycles", "cycles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 2, 10, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_fat_calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 132, false, Profile::Type::Uint16 },
{ sessionAvgSpeedComponents, 0, "avg_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 1, 0, 14, 132, false, Profile::Type::Uint16 },
{ sessionMaxSpeedComponents, 0, "max_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 1, 0, 15, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 16, 2, false, Profile::Type::Uint8 },
{ 0, 0, "max_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 17, 2, false, Profile::Type::Uint8 },
{ 0, sessionAvgCadenceSubFields, "avg_cadence", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 1, 18, 2, false, Profile::Type::Uint8 },
{ 0, sessionMaxCadenceSubFields, "max_cadence", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 1, 19, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 20, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 21, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_ascent", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 22, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_descent", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 23, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_training_effect", "", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 24, 2, false, Profile::Type::Uint8 },
{ 0, 0, "first_lap_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 25, 132, false, Profile::Type::Uint16 },
{ 0, 0, "num_laps", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 26, 132, false, Profile::Type::Uint16 },
{ 0, 0, "event_group", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 27, 2, false, Profile::Type::Uint8 },
{ 0, 0, "trigger", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 28, 0, false, Profile::Type::SessionTrigger },
{ 0, 0, "nec_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 29, 133, false, Profile::Type::Sint32 },
{ 0, 0, "nec_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 30, 133, false, Profile::Type::Sint32 },
{ 0, 0, "swc_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 31, 133, false, Profile::Type::Sint32 },
{ 0, 0, "swc_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 32, 133, false, Profile::Type::Sint32 },
{ 0, 0, "num_lengths", "lengths", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 33, 132, false, Profile::Type::Uint16 },
{ 0, 0, "normalized_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 34, 132, false, Profile::Type::Uint16 },
{ 0, 0, "training_stress_score", "tss", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 35, 132, false, Profile::Type::Uint16 },
{ 0, 0, "intensity_factor", "if", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 36, 132, false, Profile::Type::Uint16 },
{ 0, 0, "left_right_balance", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 37, 132, false, Profile::Type::LeftRightBalance100 },
{ 0, 0, "end_position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 38, 133, false, Profile::Type::Sint32 },
{ 0, 0, "end_position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 39, 133, false, Profile::Type::Sint32 },
{ 0, 0, "avg_stroke_count", "strokes/lap", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 41, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_stroke_distance", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 42, 132, false, Profile::Type::Uint16 },
{ 0, 0, "swim_stroke", "swim_stroke", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 43, 0, false, Profile::Type::SwimStroke },
{ 0, 0, "pool_length", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 44, 132, false, Profile::Type::Uint16 },
{ 0, 0, "threshold_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 45, 132, false, Profile::Type::Uint16 },
{ 0, 0, "pool_length_unit", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 46, 0, false, Profile::Type::DisplayMeasure },
{ 0, 0, "num_active_lengths", "lengths", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 47, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_work", "J", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 48, 134, false, Profile::Type::Uint32 },
{ sessionAvgAltitudeComponents, 0, "avg_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 1, 0, 49, 132, false, Profile::Type::Uint16 },
{ sessionMaxAltitudeComponents, 0, "max_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 1, 0, 50, 132, false, Profile::Type::Uint16 },
{ 0, 0, "gps_accuracy", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 51, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 52, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_pos_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 53, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_neg_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 54, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_pos_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 55, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_neg_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 56, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 57, 1, false, Profile::Type::Sint8 },
{ 0, 0, "max_temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 58, 1, false, Profile::Type::Sint8 },
{ 0, 0, "total_moving_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 59, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_pos_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 60, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_neg_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 61, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_pos_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 62, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_neg_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 63, 131, false, Profile::Type::Sint16 },
{ 0, 0, "min_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 64, 2, false, Profile::Type::Uint8 },
{ 0, 0, "time_in_hr_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 65, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_speed_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 66, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_cadence_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 67, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_power_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 68, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_lap_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 69, 134, false, Profile::Type::Uint32 },
{ 0, 0, "best_lap_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 70, 132, false, Profile::Type::Uint16 },
{ sessionMinAltitudeComponents, 0, "min_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 1, 0, 71, 132, false, Profile::Type::Uint16 },
{ 0, 0, "player_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 82, 132, false, Profile::Type::Uint16 },
{ 0, 0, "opponent_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 83, 132, false, Profile::Type::Uint16 },
{ 0, 0, "opponent_name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 84, 7, false, Profile::Type::String },
{ 0, 0, "stroke_count", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 85, 132, false, Profile::Type::Uint16 },
{ 0, 0, "zone_count", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 86, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_ball_speed", "m/s", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 87, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_ball_speed", "m/s", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 88, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_vertical_oscillation", "mm", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 89, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_stance_time_percent", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 90, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_stance_time", "ms", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 91, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_fractional_cadence", "rpm", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 92, 2, false, Profile::Type::Uint8 },
{ 0, 0, "max_fractional_cadence", "rpm", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 93, 2, false, Profile::Type::Uint8 },
{ 0, 0, "total_fractional_cycles", "cycles", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 94, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_total_hemoglobin_conc", "g/dL", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 95, 132, false, Profile::Type::Uint16 },
{ 0, 0, "min_total_hemoglobin_conc", "g/dL", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 96, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_total_hemoglobin_conc", "g/dL", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 97, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_saturated_hemoglobin_percent", "%", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 98, 132, false, Profile::Type::Uint16 },
{ 0, 0, "min_saturated_hemoglobin_percent", "%", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 99, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_saturated_hemoglobin_percent", "%", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 100, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_left_torque_effectiveness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 101, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_torque_effectiveness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 102, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_left_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 103, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 104, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_combined_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 105, 2, false, Profile::Type::Uint8 },
{ 0, 0, "sport_profile_name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 110, 7, false, Profile::Type::String },
{ 0, 0, "sport_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 111, 2, false, Profile::Type::Uint8 },
{ 0, 0, "time_standing", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 112, 134, false, Profile::Type::Uint32 },
{ 0, 0, "stand_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 113, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_left_pco", "mm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 114, 1, false, Profile::Type::Sint8 },
{ 0, 0, "avg_right_pco", "mm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 115, 1, false, Profile::Type::Sint8 },
{ 0, 0, "avg_left_power_phase", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 116, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_left_power_phase_peak", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 117, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_power_phase", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 118, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_power_phase_peak", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 119, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_power_position", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 120, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_power_position", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 121, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_cadence_position", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 122, 2, false, Profile::Type::Uint8 },
{ 0, 0, "max_cadence_position", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 123, 2, false, Profile::Type::Uint8 },
{ 0, 0, "enhanced_avg_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 124, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_max_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 125, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_avg_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 126, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_min_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 127, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_max_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 128, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_lev_motor_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 129, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_lev_motor_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 130, 132, false, Profile::Type::Uint16 },
{ 0, 0, "lev_battery_consumption", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 131, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_vertical_ratio", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 132, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_stance_time_balance", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 133, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_step_length", "mm", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 134, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_anaerobic_training_effect", "", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 137, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_vam", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 139, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 140, 134, false, Profile::Type::Uint32 },
{ 0, 0, "max_depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 141, 134, false, Profile::Type::Uint32 },
{ 0, 0, "surface_interval", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 142, 134, false, Profile::Type::Uint32 },
{ 0, 0, "start_cns", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 143, 2, false, Profile::Type::Uint8 },
{ 0, 0, "end_cns", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 144, 2, false, Profile::Type::Uint8 },
{ 0, 0, "start_n2", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 145, 132, false, Profile::Type::Uint16 },
{ 0, 0, "end_n2", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 146, 132, false, Profile::Type::Uint16 },
{ sessionAvgRespirationRateComponents, 0, "avg_respiration_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 1, 0, 147, 2, false, Profile::Type::Uint8 },
{ sessionMaxRespirationRateComponents, 0, "max_respiration_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 1, 0, 148, 2, false, Profile::Type::Uint8 },
{ sessionMinRespirationRateComponents, 0, "min_respiration_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 1, 0, 149, 2, false, Profile::Type::Uint8 },
{ 0, 0, "min_temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 150, 1, false, Profile::Type::Sint8 },
{ 0, 0, "o2_toxicity", "OTUs", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 155, 132, false, Profile::Type::Uint16 },
{ 0, 0, "dive_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 156, 134, false, Profile::Type::Uint32 },
{ 0, 0, "training_load_peak", "", (FIT_FLOAT64)65536, (FIT_FLOAT64)0, 0, 0, 168, 133, false, Profile::Type::Sint32 },
{ 0, 0, "enhanced_avg_respiration_rate", "Breaths/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 169, 132, false, Profile::Type::Uint16 },
{ 0, 0, "enhanced_max_respiration_rate", "Breaths/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 170, 132, false, Profile::Type::Uint16 },
{ 0, 0, "enhanced_min_respiration_rate", "", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 180, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_grit", "kGrit", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 181, 136, false, Profile::Type::Float32 },
{ 0, 0, "total_flow", "Flow", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 182, 136, false, Profile::Type::Float32 },
{ 0, 0, "jump_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 183, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_grit", "kGrit", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 186, 136, false, Profile::Type::Float32 },
{ 0, 0, "avg_flow", "Flow", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 187, 136, false, Profile::Type::Float32 },
{ 0, 0, "workout_feel", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 192, 2, false, Profile::Type::Uint8 },
{ 0, 0, "workout_rpe", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 193, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_spo2", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 194, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_stress", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 195, 2, false, Profile::Type::Uint8 },
{ 0, 0, "sdrr_hrv", "mS", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 197, 2, false, Profile::Type::Uint8 },
{ 0, 0, "rmssd_hrv", "mS", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 198, 2, false, Profile::Type::Uint8 },
{ 0, 0, "total_fractional_ascent", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 199, 2, false, Profile::Type::Uint8 },
{ 0, 0, "total_fractional_descent", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 200, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_core_temperature", "C", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 208, 132, false, Profile::Type::Uint16 },
{ 0, 0, "min_core_temperature", "C", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 209, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_core_temperature", "C", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 210, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD_COMPONENT lapAvgSpeedComponents[] =
{
   { (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 110, 16, FIT_FALSE }, // enhanced_avg_speed
};

static const Profile::FIELD_COMPONENT lapMaxSpeedComponents[] =
{
   { (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 111, 16, FIT_FALSE }, // enhanced_max_speed
};

static const Profile::FIELD_COMPONENT lapAvgAltitudeComponents[] =
{
   { (FIT_FLOAT64)5, (FIT_FLOAT64)500, 112, 16, FIT_FALSE }, // enhanced_avg_altitude
};

static const Profile::FIELD_COMPONENT lapMaxAltitudeComponents[] =
{
   { (FIT_FLOAT64)5, (FIT_FLOAT64)500, 114, 16, FIT_FALSE }, // enhanced_max_altitude
};

static const Profile::FIELD_COMPONENT lapMinAltitudeComponents[] =
{
   { (FIT_FLOAT64)5, (FIT_FLOAT64)500, 113, 16, FIT_FALSE }, // enhanced_min_altitude
};

static const Profile::FIELD_COMPONENT lapAvgRespirationRateComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 136, 8, FIT_FALSE }, // enhanced_avg_respiration_rate
};

static const Profile::FIELD_COMPONENT lapMaxRespirationRateComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 137, 8, FIT_FALSE }, // enhanced_max_respiration_rate
};

static const Profile::SUBFIELD_MAP lapTotalCyclesTotalStridesMaps[] =
{
   { 1, 25 }, // sport == running
   { 11, 25 }, // sport == walking
};

static const Profile::SUBFIELD_MAP lapTotalCyclesTotalStrokesMaps[] =
{
   { 2, 25 }, // sport == cycling
   { 5, 25 }, // sport == swimming
   { 15, 25 }, // sport == rowing
   { 37, 25 }, // sport == stand_up_paddleboarding
};

static const Profile::SUBFIELD_MAP lapAvgCadenceAvgRunningCadenceMaps[] =
{
   { 1, 25 }, // sport == running
};

static const Profile::SUBFIELD_MAP lapMaxCadenceMaxRunningCadenceMaps[] =
{
   { 1, 25 }, // sport == running
};

static const Profile::SUBFIELD lapTotalCyclesSubFields[] =
{
   { lapTotalCyclesTotalStridesMaps, 0, "total_strides", "strides", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 2, 0, 134 },
   { lapTotalCyclesTotalStrokesMaps, 0, "total_strokes", "strokes", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 4, 0, 134 },
};

static const Profile::SUBFIELD lapAvgCadenceSubFields[] =
{
   { lapAvgCadenceAvgRunningCadenceMaps, 0, "avg_running_cadence", "strides/min", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
};

static const Profile::SUBFIELD lapMaxCadenceSubFields[] =
{
   { lapMaxCadenceMaxRunningCadenceMaps, 0, "max_running_cadence", "strides/min", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
};

static const Profile::FIELD lapFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "event", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Event },
{ 0, 0, "event_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::EventType },
{ 0, 0, "start_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::DateTime },
{ 0, 0, "start_position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 133, false, Profile::Type::Sint32 },
{ 0, 0, "start_position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 133, false, Profile::Type::Sint32 },
{ 0, 0, "end_position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 133, false, Profile::Type::Sint32 },
{ 0, 0, "end_position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 133, false, Profile::Type::Sint32 },
{ 0, 0, "total_elapsed_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 7, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_timer_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 8, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_distance", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 9, 134, false, Profile::Type::Uint32 },
{ 0, lapTotalCyclesSubFields, "total_cycles", "cycles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 2, 10, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_fat_calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 132, false, Profile::Type::Uint16 },
{ lapAvgSpeedComponents, 0, "avg_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 1, 0, 13, 132, false, Profile::Type::Uint16 },
{ lapMaxSpeedComponents, 0, "max_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 1, 0, 14, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 15, 2, false, Profile::Type::Uint8 },
{ 0, 0, "max_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 16, 2, false, Profile::Type::Uint8 },
{ 0, lapAvgCadenceSubFields, "avg_cadence", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 1, 17, 2, false, Profile::Type::Uint8 },
{ 0, lapMaxCadenceSubFields, "max_cadence", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 1, 18, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 19, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 20, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_ascent", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 21, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_descent", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 22, 132, false, Profile::Type::Uint16 },
{ 0, 0, "intensity", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 23, 0, false, Profile::Type::Intensity },
{ 0, 0, "lap_trigger", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 24, 0, false, Profile::Type::LapTrigger },
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 25, 0, false, Profile::Type::Sport },
{ 0, 0, "event_group", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 26, 2, false, Profile::Type::Uint8 },
{ 0, 0, "num_lengths", "lengths", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 32, 132, false, Profile::Type::Uint16 },
{ 0, 0, "normalized_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 33, 132, false, Profile::Type::Uint16 },
{ 0, 0, "left_right_balance", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 34, 132, false, Profile::Type::LeftRightBalance100 },
{ 0, 0, "first_length_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 35, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_stroke_distance", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 37, 132, false, Profile::Type::Uint16 },
{ 0, 0, "swim_stroke", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 38, 0, false, Profile::Type::SwimStroke },
{ 0, 0, "sub_sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 39, 0, false, Profile::Type::SubSport },
{ 0, 0, "num_active_lengths", "lengths", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 40, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_work", "J", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 41, 134, false, Profile::Type::Uint32 },
{ lapAvgAltitudeComponents, 0, "avg_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 1, 0, 42, 132, false, Profile::Type::Uint16 },
{ lapMaxAltitudeComponents, 0, "max_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 1, 0, 43, 132, false, Profile::Type::Uint16 },
{ 0, 0, "gps_accuracy", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 44, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 45, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_pos_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 46, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_neg_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 47, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_pos_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 48, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_neg_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 49, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 50, 1, false, Profile::Type::Sint8 },
{ 0, 0, "max_temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 51, 1, false, Profile::Type::Sint8 },
{ 0, 0, "total_moving_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 52, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_pos_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 53, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_neg_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 54, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_pos_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 55, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_neg_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 56, 131, false, Profile::Type::Sint16 },
{ 0, 0, "time_in_hr_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 57, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_speed_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 58, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_cadence_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 59, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_power_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 60, 134, false, Profile::Type::Uint32 },
{ 0, 0, "repetition_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 61, 132, false, Profile::Type::Uint16 },
{ lapMinAltitudeComponents, 0, "min_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 1, 0, 62, 132, false, Profile::Type::Uint16 },
{ 0, 0, "min_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 63, 2, false, Profile::Type::Uint8 },
{ 0, 0, "wkt_step_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 71, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "opponent_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 74, 132, false, Profile::Type::Uint16 },
{ 0, 0, "stroke_count", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 75, 132, false, Profile::Type::Uint16 },
{ 0, 0, "zone_count", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 76, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_vertical_oscillation", "mm", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 77, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_stance_time_percent", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 78, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_stance_time", "ms", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 79, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_fractional_cadence", "rpm", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 80, 2, false, Profile::Type::Uint8 },
{ 0, 0, "max_fractional_cadence", "rpm", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 81, 2, false, Profile::Type::Uint8 },
{ 0, 0, "total_fractional_cycles", "cycles", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 82, 2, false, Profile::Type::Uint8 },
{ 0, 0, "player_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 83, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_total_hemoglobin_conc", "g/dL", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 84, 132, false, Profile::Type::Uint16 },
{ 0, 0, "min_total_hemoglobin_conc", "g/dL", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 85, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_total_hemoglobin_conc", "g/dL", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 86, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_saturated_hemoglobin_percent", "%", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 87, 132, false, Profile::Type::Uint16 },
{ 0, 0, "min_saturated_hemoglobin_percent", "%", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 88, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_saturated_hemoglobin_percent", "%", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 89, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_left_torque_effectiveness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 91, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_torque_effectiveness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 92, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_left_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 93, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 94, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_combined_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 95, 2, false, Profile::Type::Uint8 },
{ 0, 0, "time_standing", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 98, 134, false, Profile::Type::Uint32 },
{ 0, 0, "stand_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 99, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_left_pco", "mm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 100, 1, false, Profile::Type::Sint8 },
{ 0, 0, "avg_right_pco", "mm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 101, 1, false, Profile::Type::Sint8 },
{ 0, 0, "avg_left_power_phase", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 102, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_left_power_phase_peak", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 103, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_power_phase", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 104, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_power_phase_peak", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 105, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_power_position", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 106, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_power_position", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 107, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_cadence_position", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 108, 2, false, Profile::Type::Uint8 },
{ 0, 0, "max_cadence_position", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 109, 2, false, Profile::Type::Uint8 },
{ 0, 0, "enhanced_avg_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 110, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_max_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 111, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_avg_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 112, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_min_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 113, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_max_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 114, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_lev_motor_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 115, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_lev_motor_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 116, 132, false, Profile::Type::Uint16 },
{ 0, 0, "lev_battery_consumption", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 117, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_vertical_ratio", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 118, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_stance_time_balance", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 119, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_step_length", "mm", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 120, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_vam", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 121, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 122, 134, false, Profile::Type::Uint32 },
{ 0, 0, "max_depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 123, 134, false, Profile::Type::Uint32 },
{ 0, 0, "min_temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 124, 1, false, Profile::Type::Sint8 },
{ 0, 0, "enhanced_avg_respiration_rate", "Breaths/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 136, 132, false, Profile::Type::Uint16 },
{ 0, 0, "enhanced_max_respiration_rate", "Breaths/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 137, 132, false, Profile::Type::Uint16 },
{ lapAvgRespirationRateComponents, 0, "avg_respiration_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 1, 0, 147, 2, false, Profile::Type::Uint8 },
{ lapMaxRespirationRateComponents, 0, "max_respiration_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 1, 0, 148, 2, false, Profile::Type::Uint8 },
{ 0, 0, "total_grit", "kGrit", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 149, 136, false, Profile::Type::Float32 },
{ 0, 0, "total_flow", "Flow", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 150, 136, false, Profile::Type::Float32 },
{ 0, 0, "jump_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 151, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_grit", "kGrit", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 153, 136, false, Profile::Type::Float32 },
{ 0, 0, "avg_flow", "Flow", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 154, 136, false, Profile::Type::Float32 },
{ 0, 0, "total_fractional_ascent", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 156, 2, false, Profile::Type::Uint8 },
{ 0, 0, "total_fractional_descent", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 157, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_core_temperature", "C", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 158, 132, false, Profile::Type::Uint16 },
{ 0, 0, "min_core_temperature", "C", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 159, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_core_temperature", "C", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 160, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD_COMPONENT lengthAvgRespirationRateComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 22, 8, FIT_FALSE }, // enhanced_avg_respiration_rate
};

static const Profile::FIELD_COMPONENT lengthMaxRespirationRateComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 23, 8, FIT_FALSE }, // enhanced_max_respiration_rate
};

static const Profile::FIELD lengthFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "event", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Event },
{ 0, 0, "event_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::EventType },
{ 0, 0, "start_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::DateTime },
{ 0, 0, "total_elapsed_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_timer_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_strokes", "strokes", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 6, 132, false, Profile::Type::Uint16 },
{ 0, 0, "swim_stroke", "swim_stroke", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::SwimStroke },
{ 0, 0, "avg_swimming_cadence", "strokes/min", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 2, false, Profile::Type::Uint8 },
{ 0, 0, "event_group", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 2, false, Profile::Type::Uint8 },
{ 0, 0, "total_calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 132, false, Profile::Type::Uint16 },
{ 0, 0, "length_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 0, false, Profile::Type::LengthType },
{ 0, 0, "player_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 18, 132, false, Profile::Type::Uint16 },
{ 0, 0, "opponent_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 19, 132, false, Profile::Type::Uint16 },
{ 0, 0, "stroke_count", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 20, 132, false, Profile::Type::Uint16 },
{ 0, 0, "zone_count", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 21, 132, false, Profile::Type::Uint16 },
{ 0, 0, "enhanced_avg_respiration_rate", "Breaths/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 22, 132, false, Profile::Type::Uint16 },
{ 0, 0, "enhanced_max_respiration_rate", "Breaths/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 23, 132, false, Profile::Type::Uint16 },
{ lengthAvgRespirationRateComponents, 0, "avg_respiration_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 1, 0, 24, 2, false, Profile::Type::Uint8 },
{ lengthMaxRespirationRateComponents, 0, "max_respiration_rate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 1, 0, 25, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD_COMPONENT recordAltitudeComponents[] =
{
   { (FIT_FLOAT64)5, (FIT_FLOAT64)500, 78, 16, FIT_FALSE }, // enhanced_altitude
};

static const Profile::FIELD_COMPONENT recordSpeedComponents[] =
{
   { (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 73, 16, FIT_FALSE }, // enhanced_speed
};

static const Profile::FIELD_COMPONENT recordCompressedSpeedDistanceComponents[] =
{
   { (FIT_FLOAT64)100, (FIT_FLOAT64)0, 6, 12, FIT_FALSE }, // speed
   { (FIT_FLOAT64)16, (FIT_FLOAT64)0, 5, 12, FIT_TRUE }, // distance
};

static const Profile::FIELD_COMPONENT recordCyclesComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 19, 8, FIT_TRUE }, // total_cycles
};

static const Profile::FIELD_COMPONENT recordCompressedAccumulatedPowerComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 29, 16, FIT_TRUE }, // accumulated_power
};

static const Profile::FIELD_COMPONENT recordRespirationRateComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 108, 8, FIT_FALSE }, // enhanced_respiration_rate
};

static const Profile::FIELD recordFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 133, false, Profile::Type::Sint32 },
{ 0, 0, "position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 133, false, Profile::Type::Sint32 },
{ recordAltitudeComponents, 0, "altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 1, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "cadence", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 2, false, Profile::Type::Uint8 },
{ 0, 0, "distance", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 5, 134, true, Profile::Type::Uint32 },
{ recordSpeedComponents, 0, "speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 1, 0, 6, 132, false, Profile::Type::Uint16 },
{ 0, 0, "power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 132, false, Profile::Type::Uint16 },
{ recordCompressedSpeedDistanceComponents, 0, "compressed_speed_distance", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 0, 8, 13, false, Profile::Type::Byte },
{ 0, 0, "grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 9, 131, false, Profile::Type::Sint16 },
{ 0, 0, "resistance", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 2, false, Profile::Type::Uint8 },
{ 0, 0, "time_from_course", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 11, 133, false, Profile::Type::Sint32 },
{ 0, 0, "cycle_length", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 12, 2, false, Profile::Type::Uint8 },
{ 0, 0, "temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 1, false, Profile::Type::Sint8 },
{ 0, 0, "speed_1s", "m/s", (FIT_FLOAT64)16, (FIT_FLOAT64)0, 0, 0, 17, 2, false, Profile::Type::Uint8 },
{ recordCyclesComponents, 0, "cycles", "cycles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 1, 0, 18, 2, false, Profile::Type::Uint8 },
{ 0, 0, "total_cycles", "cycles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 19, 134, true, Profile::Type::Uint32 },
{ recordCompressedAccumulatedPowerComponents, 0, "compressed_accumulated_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 1, 0, 28, 132, false, Profile::Type::Uint16 },
{ 0, 0, "accumulated_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 29, 134, true, Profile::Type::Uint32 },
{ 0, 0, "left_right_balance", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 30, 2, false, Profile::Type::LeftRightBalance },
{ 0, 0, "gps_accuracy", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 31, 2, false, Profile::Type::Uint8 },
{ 0, 0, "vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 32, 131, false, Profile::Type::Sint16 },
{ 0, 0, "calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 33, 132, false, Profile::Type::Uint16 },
{ 0, 0, "vertical_oscillation", "mm", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 39, 132, false, Profile::Type::Uint16 },
{ 0, 0, "stance_time_percent", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 40, 132, false, Profile::Type::Uint16 },
{ 0, 0, "stance_time", "ms", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 41, 132, false, Profile::Type::Uint16 },
{ 0, 0, "activity_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 42, 0, false, Profile::Type::ActivityType },
{ 0, 0, "left_torque_effectiveness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 43, 2, false, Profile::Type::Uint8 },
{ 0, 0, "right_torque_effectiveness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 44, 2, false, Profile::Type::Uint8 },
{ 0, 0, "left_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 45, 2, false, Profile::Type::Uint8 },
{ 0, 0, "right_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 46, 2, false, Profile::Type::Uint8 },
{ 0, 0, "combined_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 47, 2, false, Profile::Type::Uint8 },
{ 0, 0, "time128", "s", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 48, 2, false, Profile::Type::Uint8 },
{ 0, 0, "stroke_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 49, 0, false, Profile::Type::StrokeType },
{ 0, 0, "zone", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 50, 2, false, Profile::Type::Uint8 },
{ 0, 0, "ball_speed", "m/s", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 51, 132, false, Profile::Type::Uint16 },
{ 0, 0, "cadence256", "rpm", (FIT_FLOAT64)256, (FIT_FLOAT64)0, 0, 0, 52, 132, false, Profile::Type::Uint16 },
{ 0, 0, "fractional_cadence", "rpm", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 53, 2, false, Profile::Type::Uint8 },
{ 0, 0, "total_hemoglobin_conc", "g/dL", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 54, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_hemoglobin_conc_min", "g/dL", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 55, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_hemoglobin_conc_max", "g/dL", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 56, 132, false, Profile::Type::Uint16 },
{ 0, 0, "saturated_hemoglobin_percent", "%", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 57, 132, false, Profile::Type::Uint16 },
{ 0, 0, "saturated_hemoglobin_percent_min", "%", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 58, 132, false, Profile::Type::Uint16 },
{ 0, 0, "saturated_hemoglobin_percent_max", "%", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 59, 132, false, Profile::Type::Uint16 },
{ 0, 0, "device_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 62, 2, false, Profile::Type::DeviceIndex },
{ 0, 0, "left_pco", "mm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 67, 1, false, Profile::Type::Sint8 },
{ 0, 0, "right_pco", "mm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 68, 1, false, Profile::Type::Sint8 },
{ 0, 0, "left_power_phase", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 69, 2, false, Profile::Type::Uint8 },
{ 0, 0, "left_power_phase_peak", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 70, 2, false, Profile::Type::Uint8 },
{ 0, 0, "right_power_phase", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 71, 2, false, Profile::Type::Uint8 },
{ 0, 0, "right_power_phase_peak", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 72, 2, false, Profile::Type::Uint8 },
{ 0, 0, "enhanced_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 73, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 78, 134, false, Profile::Type::Uint32 },
{ 0, 0, "battery_soc", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 81, 2, false, Profile::Type::Uint8 },
{ 0, 0, "motor_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 82, 132, false, Profile::Type::Uint16 },
{ 0, 0, "vertical_ratio", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 83, 132, false, Profile::Type::Uint16 },
{ 0, 0, "stance_time_balance", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 84, 132, false, Profile::Type::Uint16 },
{ 0, 0, "step_length", "mm", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 85, 132, false, Profile::Type::Uint16 },
{ 0, 0, "cycle_length16", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 87, 132, false, Profile::Type::Uint16 },
{ 0, 0, "absolute_pressure", "Pa", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 91, 134, false, Profile::Type::Uint32 },
{ 0, 0, "depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 92, 134, false, Profile::Type::Uint32 },
{ 0, 0, "next_stop_depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 93, 134, false, Profile::Type::Uint32 },
{ 0, 0, "next_stop_time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 94, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_to_surface", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 95, 134, false, Profile::Type::Uint32 },
{ 0, 0, "ndl_time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 96, 134, false, Profile::Type::Uint32 },
{ 0, 0, "cns_load", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 97, 2, false, Profile::Type::Uint8 },
{ 0, 0, "n2_load", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 98, 132, false, Profile::Type::Uint16 },
{ recordRespirationRateComponents, 0, "respiration_rate", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 1, 0, 99, 2, false, Profile::Type::Uint8 },
{ 0, 0, "enhanced_respiration_rate", "Breaths/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 108, 132, false, Profile::Type::Uint16 },
{ 0, 0, "grit", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 114, 136, false, Profile::Type::Float32 },
{ 0, 0, "flow", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 115, 136, false, Profile::Type::Float32 },
{ 0, 0, "current_stress", "", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 116, 132, false, Profile::Type::Uint16 },
{ 0, 0, "ebike_travel_range", "km", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 117, 132, false, Profile::Type::Uint16 },
{ 0, 0, "ebike_battery_level", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 118, 2, false, Profile::Type::Uint8 },
{ 0, 0, "ebike_assist_mode", "depends on sensor", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 119, 2, false, Profile::Type::Uint8 },
{ 0, 0, "ebike_assist_level_percent", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 120, 2, false, Profile::Type::Uint8 },
{ 0, 0, "air_time_remaining", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 123, 134, false, Profile::Type::Uint32 },
{ 0, 0, "pressure_sac", "bar/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 124, 132, false, Profile::Type::Uint16 },
{ 0, 0, "volume_sac", "L/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 125, 132, false, Profile::Type::Uint16 },
{ 0, 0, "rmv", "L/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 126, 132, false, Profile::Type::Uint16 },
{ 0, 0, "ascent_rate", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 127, 133, false, Profile::Type::Sint32 },
{ 0, 0, "po2", "percent", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 129, 2, false, Profile::Type::Uint8 },
{ 0, 0, "core_temperature", "C", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 139, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD_COMPONENT eventData16Components[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 16, FIT_FALSE }, // data
};

static const Profile::SUBFIELD_MAP eventDataTimerTriggerMaps[] =
{
   { 0, 0 }, // event == timer
};

static const Profile::SUBFIELD_MAP eventDataCoursePointIndexMaps[] =
{
   { 10, 0 }, // event == course_point
};

static const Profile::SUBFIELD_MAP eventDataBatteryLevelMaps[] =
{
   { 11, 0 }, // event == battery
};

static const Profile::SUBFIELD_MAP eventDataVirtualPartnerSpeedMaps[] =
{
   { 12, 0 }, // event == virtual_partner_pace
};

static const Profile::SUBFIELD_MAP eventDataHrHighAlertMaps[] =
{
   { 13, 0 }, // event == hr_high_alert
};

static const Profile::SUBFIELD_MAP eventDataHrLowAlertMaps[] =
{
   { 14, 0 }, // event == hr_low_alert
};

static const Profile::SUBFIELD_MAP eventDataSpeedHighAlertMaps[] =
{
   { 15, 0 }, // event == speed_high_alert
};

static const Profile::SUBFIELD_MAP eventDataSpeedLowAlertMaps[] =
{
   { 16, 0 }, // event == speed_low_alert
};

static const Profile::SUBFIELD_MAP eventDataCadHighAlertMaps[] =
{
   { 17, 0 }, // event == cad_high_alert
};

static const Profile::SUBFIELD_MAP eventDataCadLowAlertMaps[] =
{
   { 18, 0 }, // event == cad_low_alert
};

static const Profile::SUBFIELD_MAP eventDataPowerHighAlertMaps[] =
{
   { 19, 0 }, // event == power_high_alert
};

static const Profile::SUBFIELD_MAP eventDataPowerLowAlertMaps[] =
{
   { 20, 0 }, // event == power_low_alert
};

static const Profile::SUBFIELD_MAP eventDataTimeDurationAlertMaps[] =
{
   { 23, 0 }, // event == time_duration_alert
};

static const Profile::SUBFIELD_MAP eventDataDistanceDurationAlertMaps[] =
{
   { 24, 0 }, // event == distance_duration_alert
};

static const Profile::SUBFIELD_MAP eventDataCalorieDurationAlertMaps[] =
{
   { 25, 0 }, // event == calorie_duration_alert
};

static const Profile::SUBFIELD_MAP eventDataFitnessEquipmentStateMaps[] =
{
   { 27, 0 }, // event == fitness_equipment
};

static const Profile::SUBFIELD_MAP eventDataSportPointMaps[] =
{
   { 33, 0 }, // event == sport_point
};

static const Profile::FIELD_COMPONENT eventDataSportPointComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 7, 16, FIT_FALSE }, // score
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 8, 16, FIT_FALSE }, // opponent_score
};

static const Profile::SUBFIELD_MAP eventDataGearChangeDataMaps[] =
{
   { 42, 0 }, // event == front_gear_change
   { 43, 0 }, // event == rear_gear_change
};

static const Profile::FIELD_COMPONENT eventDataGearChangeDataComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 11, 8, FIT_FALSE }, // rear_gear_num
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 12, 8, FIT_FALSE }, // rear_gear
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 9, 8, FIT_FALSE }, // front_gear_num
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 10, 8, FIT_FALSE }, // front_gear
};

static const Profile::SUBFIELD_MAP eventDataRiderPositionMaps[] =
{
   { 44, 0 }, // event == rider_position_change
};

static const Profile::SUBFIELD_MAP eventDataCommTimeoutMaps[] =
{
   { 47, 0 }, // event == comm_timeout
};

static const Profile::SUBFIELD_MAP eventDataDiveAlertMaps[] =
{
   { 56, 0 }, // event == dive_alert
};

static const Profile::SUBFIELD_MAP eventDataAutoActivityDetectDurationMaps[] =
{
   { 54, 0 }, // event == auto_activity_detect
};

static const Profile::SUBFIELD_MAP eventDataRadarThreatAlertMaps[] =
{
   { 75, 0 }, // event == radar_threat_alert
};

static const Profile::FIELD_COMPONENT eventDataRadarThreatAlertComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 21, 8, FIT_FALSE }, // radar_threat_level_max
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 22, 8, FIT_FALSE }, // radar_threat_count
   { (FIT_FLOAT64)10, (FIT_FLOAT64)0, 23, 8, FIT_FALSE }, // radar_threat_avg_approach_speed
   { (FIT_FLOAT64)10, (FIT_FLOAT64)0, 24, 8, FIT_FALSE }, // radar_threat_max_approach_speed
};

static const Profile::SUBFIELD_MAP eventStartTimestampAutoActivityDetectStartTimestampMaps[] =
{
   { 54, 0 }, // event == auto_activity_detect
};

static const Profile::SUBFIELD eventDataSubFields[] =
{
   { eventDataTimerTriggerMaps, 0, "timer_trigger", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 0 },
   { eventDataCoursePointIndexMaps, 0, "course_point_index", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { eventDataBatteryLevelMaps, 0, "battery_level", "V", (FIT_FLOAT32)1000, (FIT_FLOAT32)0, 1, 0, 132 },
   { eventDataVirtualPartnerSpeedMaps, 0, "virtual_partner_speed", "m/s", (FIT_FLOAT32)1000, (FIT_FLOAT32)0, 1, 0, 132 },
   { eventDataHrHighAlertMaps, 0, "hr_high_alert", "bpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
   { eventDataHrLowAlertMaps, 0, "hr_low_alert", "bpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
   { eventDataSpeedHighAlertMaps, 0, "speed_high_alert", "m/s", (FIT_FLOAT32)1000, (FIT_FLOAT32)0, 1, 0, 134 },
   { eventDataSpeedLowAlertMaps, 0, "speed_low_alert", "m/s", (FIT_FLOAT32)1000, (FIT_FLOAT32)0, 1, 0, 134 },
   { eventDataCadHighAlertMaps, 0, "cad_high_alert", "rpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { eventDataCadLowAlertMaps, 0, "cad_low_alert", "rpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { eventDataPowerHighAlertMaps, 0, "power_high_alert", "watts", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { eventDataPowerLowAlertMaps, 0, "power_low_alert", "watts", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { eventDataTimeDurationAlertMaps, 0, "time_duration_alert", "s", (FIT_FLOAT32)1000, (FIT_FLOAT32)0, 1, 0, 134 },
   { eventDataDistanceDurationAlertMaps, 0, "distance_duration_alert", "m", (FIT_FLOAT32)100, (FIT_FLOAT32)0, 1, 0, 134 },
   { eventDataCalorieDurationAlertMaps, 0, "calorie_duration_alert", "calories", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { eventDataFitnessEquipmentStateMaps, 0, "fitness_equipment_state", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 0 },
   { eventDataSportPointMaps, eventDataSportPointComponents, "sport_point", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 2, 134 },
   { eventDataGearChangeDataMaps, eventDataGearChangeDataComponents, "gear_change_data", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 2, 4, 134 },
   { eventDataRiderPositionMaps, 0, "rider_position", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 0 },
   { eventDataCommTimeoutMaps, 0, "comm_timeout", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { eventDataDiveAlertMaps, 0, "dive_alert", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 0 },
   { eventDataAutoActivityDetectDurationMaps, 0, "auto_activity_detect_duration", "min", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { eventDataRadarThreatAlertMaps, eventDataRadarThreatAlertComponents, "radar_threat_alert", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 4, 134 },
};

static const Profile::SUBFIELD eventStartTimestampSubFields[] =
{
   { eventStartTimestampAutoActivityDetectStartTimestampMaps, 0, "auto_activity_detect_start_timestamp", "s", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
};

static const Profile::FIELD eventFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "event", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Event },
{ 0, 0, "event_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::EventType },
{ eventData16Components, 0, "data16", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 1, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, eventDataSubFields, "data", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 23, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "event_group", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 2, false, Profile::Type::Uint8 },
{ 0, 0, "score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 132, false, Profile::Type::Uint16 },
{ 0, 0, "opponent_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 132, false, Profile::Type::Uint16 },
{ 0, 0, "front_gear_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 10, false, Profile::Type::Uint8z },
{ 0, 0, "front_gear", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 10, false, Profile::Type::Uint8z },
{ 0, 0, "rear_gear_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 10, false, Profile::Type::Uint8z },
{ 0, 0, "rear_gear", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 10, false, Profile::Type::Uint8z },
{ 0, 0, "device_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 2, false, Profile::Type::DeviceIndex },
{ 0, 0, "activity_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 14, 0, false, Profile::Type::ActivityType },
{ 0, eventStartTimestampSubFields, "start_timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 1, 15, 134, false, Profile::Type::DateTime },
{ 0, 0, "radar_threat_level_max", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 21, 0, false, Profile::Type::RadarThreatLevelType },
{ 0, 0, "radar_threat_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 22, 2, false, Profile::Type::Uint8 },
{ 0, 0, "radar_threat_avg_approach_speed", "m/s", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 23, 2, false, Profile::Type::Uint8 },
{ 0, 0, "radar_threat_max_approach_speed", "m/s", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 24, 2, false, Profile::Type::Uint8 },
};

static const Profile::SUBFIELD_MAP deviceInfoDeviceTypeBleDeviceTypeMaps[] =
{
   { 3, 25 }, // source_type == bluetooth_low_energy
};

static const Profile::SUBFIELD_MAP deviceInfoDeviceTypeAntplusDeviceTypeMaps[] =
{
   { 1, 25 }, // source_type == antplus
};

static const Profile::SUBFIELD_MAP deviceInfoDeviceTypeAntDeviceTypeMaps[] =
{
   { 0, 25 }, // source_type == ant
};

static const Profile::SUBFIELD_MAP deviceInfoDeviceTypeLocalDeviceTypeMaps[] =
{
   { 5, 25 }, // source_type == local
};

static const Profile::SUBFIELD_MAP deviceInfoProductFaveroProductMaps[] =
{
   { 263, 2 }, // manufacturer == favero_electronics
};

static const Profile::SUBFIELD_MAP deviceInfoProductGarminProductMaps[] =
{
   { 1, 2 }, // manufacturer == garmin
   { 15, 2 }, // manufacturer == dynastream
   { 13, 2 }, // manufacturer == dynastream_oem
   { 89, 2 }, // manufacturer == tacx
};

static const Profile::SUBFIELD deviceInfoDeviceTypeSubFields[] =
{
   { deviceInfoDeviceTypeBleDeviceTypeMaps, 0, "ble_device_type", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
   { deviceInfoDeviceTypeAntplusDeviceTypeMaps, 0, "antplus_device_type", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
   { deviceInfoDeviceTypeAntDeviceTypeMaps, 0, "ant_device_type", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
   { deviceInfoDeviceTypeLocalDeviceTypeMaps, 0, "local_device_type", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 2 },
};

static const Profile::SUBFIELD deviceInfoProductSubFields[] =
{
   { deviceInfoProductFaveroProductMaps, 0, "favero_product", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { deviceInfoProductGarminProductMaps, 0, "garmin_product", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 4, 0, 132 },
};

static const Profile::FIELD deviceInfoFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "device_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::DeviceIndex },
{ 0, deviceInfoDeviceTypeSubFields, "device_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 4, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "manufacturer", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Manufacturer },
{ 0, 0, "serial_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 140, false, Profile::Type::Uint32z },
{ 0, deviceInfoProductSubFields, "product", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 2, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "software_version", "", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 5, 132, false, Profile::Type::Uint16 },
{ 0, 0, "hardware_version", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 2, false, Profile::Type::Uint8 },
{ 0, 0, "cum_operating_time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 134, false, Profile::Type::Uint32 },
{ 0, 0, "battery_voltage", "V", (FIT_FLOAT64)256, (FIT_FLOAT64)0, 0, 0, 10, 132, false, Profile::Type::Uint16 },
{ 0, 0, "battery_status", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 2, false, Profile::Type::BatteryStatus },
{ 0, 0, "sensor_position", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 18, 0, false, Profile::Type::BodyLocation },
{ 0, 0, "descriptor", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 19, 7, false, Profile::Type::String },
{ 0, 0, "ant_transmission_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 20, 10, false, Profile::Type::Uint8z },
{ 0, 0, "ant_device_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 21, 139, false, Profile::Type::Uint16z },
{ 0, 0, "ant_network", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 22, 0, false, Profile::Type::AntNetwork },
{ 0, 0, "source_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 25, 0, false, Profile::Type::SourceType },
{ 0, 0, "product_name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 27, 7, false, Profile::Type::String },
{ 0, 0, "battery_level", "%", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 32, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD deviceAuxBatteryInfoFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "device_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::DeviceIndex },
{ 0, 0, "battery_voltage", "V", (FIT_FLOAT64)256, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "battery_status", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::BatteryStatus },
{ 0, 0, "battery_identifier", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
};

static const Profile::SUBFIELD_MAP trainingFileProductFaveroProductMaps[] =
{
   { 263, 1 }, // manufacturer == favero_electronics
};

static const Profile::SUBFIELD_MAP trainingFileProductGarminProductMaps[] =
{
   { 1, 1 }, // manufacturer == garmin
   { 15, 1 }, // manufacturer == dynastream
   { 13, 1 }, // manufacturer == dynastream_oem
   { 89, 1 }, // manufacturer == tacx
};

static const Profile::SUBFIELD trainingFileProductSubFields[] =
{
   { trainingFileProductFaveroProductMaps, 0, "favero_product", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { trainingFileProductGarminProductMaps, 0, "garmin_product", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 4, 0, 132 },
};

static const Profile::FIELD trainingFileFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::File },
{ 0, 0, "manufacturer", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Manufacturer },
{ 0, trainingFileProductSubFields, "product", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 2, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "serial_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 140, false, Profile::Type::Uint32z },
{ 0, 0, "time_created", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::DateTime },
};

static const Profile::FIELD weatherConditionsFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "weather_report", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::WeatherReport },
{ 0, 0, "temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 1, false, Profile::Type::Sint8 },
{ 0, 0, "condition", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::WeatherStatus },
{ 0, 0, "wind_direction", "degrees", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "wind_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "precipitation_probability", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 2, false, Profile::Type::Uint8 },
{ 0, 0, "temperature_feels_like", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 1, false, Profile::Type::Sint8 },
{ 0, 0, "relative_humidity", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 2, false, Profile::Type::Uint8 },
{ 0, 0, "location", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 7, false, Profile::Type::String },
{ 0, 0, "observed_at_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 134, false, Profile::Type::DateTime },
{ 0, 0, "observed_location_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 133, false, Profile::Type::Sint32 },
{ 0, 0, "observed_location_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 133, false, Profile::Type::Sint32 },
{ 0, 0, "day_of_week", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 0, false, Profile::Type::DayOfWeek },
{ 0, 0, "high_temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 1, false, Profile::Type::Sint8 },
{ 0, 0, "low_temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 14, 1, false, Profile::Type::Sint8 },
};

static const Profile::FIELD weatherAlertFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "report_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 7, false, Profile::Type::String },
{ 0, 0, "issue_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::DateTime },
{ 0, 0, "expire_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::DateTime },
{ 0, 0, "severity", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 0, false, Profile::Type::WeatherSeverity },
{ 0, 0, "type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::WeatherSevereType },
};

static const Profile::FIELD gpsMetadataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 133, false, Profile::Type::Sint32 },
{ 0, 0, "position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 133, false, Profile::Type::Sint32 },
{ 0, 0, "enhanced_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "heading", "degrees", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 5, 132, false, Profile::Type::Uint16 },
{ 0, 0, "utc_timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 134, false, Profile::Type::DateTime },
{ 0, 0, "velocity", "m/s", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 7, 131, false, Profile::Type::Sint16 },
};

static const Profile::FIELD cameraEventFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "camera_event_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::CameraEventType },
{ 0, 0, "camera_file_uuid", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 7, false, Profile::Type::String },
{ 0, 0, "camera_orientation", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 0, false, Profile::Type::CameraOrientationType },
};

static const Profile::FIELD gyroscopeDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "sample_time_offset", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "gyro_x", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "gyro_y", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "gyro_z", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "calibrated_gyro_x", "deg/s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 136, false, Profile::Type::Float32 },
{ 0, 0, "calibrated_gyro_y", "deg/s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 136, false, Profile::Type::Float32 },
{ 0, 0, "calibrated_gyro_z", "deg/s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 136, false, Profile::Type::Float32 },
};

static const Profile::FIELD accelerometerDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "sample_time_offset", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "accel_x", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "accel_y", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "accel_z", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "calibrated_accel_x", "g", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 136, false, Profile::Type::Float32 },
{ 0, 0, "calibrated_accel_y", "g", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 136, false, Profile::Type::Float32 },
{ 0, 0, "calibrated_accel_z", "g", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 136, false, Profile::Type::Float32 },
{ 0, 0, "compressed_calibrated_accel_x", "mG", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 131, false, Profile::Type::Sint16 },
{ 0, 0, "compressed_calibrated_accel_y", "mG", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 131, false, Profile::Type::Sint16 },
{ 0, 0, "compressed_calibrated_accel_z", "mG", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 131, false, Profile::Type::Sint16 },
};

static const Profile::FIELD magnetometerDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "sample_time_offset", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "mag_x", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "mag_y", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "mag_z", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "calibrated_mag_x", "G", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 136, false, Profile::Type::Float32 },
{ 0, 0, "calibrated_mag_y", "G", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 136, false, Profile::Type::Float32 },
{ 0, 0, "calibrated_mag_z", "G", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 136, false, Profile::Type::Float32 },
};

static const Profile::FIELD barometerDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "sample_time_offset", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "baro_pres", "Pa", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
};

static const Profile::SUBFIELD_MAP threeDSensorCalibrationCalibrationFactorAccelCalFactorMaps[] =
{
   { 0, 0 }, // sensor_type == accelerometer
};

static const Profile::SUBFIELD_MAP threeDSensorCalibrationCalibrationFactorGyroCalFactorMaps[] =
{
   { 1, 0 }, // sensor_type == gyroscope
};

static const Profile::SUBFIELD threeDSensorCalibrationCalibrationFactorSubFields[] =
{
   { threeDSensorCalibrationCalibrationFactorAccelCalFactorMaps, 0, "accel_cal_factor", "g", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { threeDSensorCalibrationCalibrationFactorGyroCalFactorMaps, 0, "gyro_cal_factor", "deg/s", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
};

static const Profile::FIELD threeDSensorCalibrationFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "sensor_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::SensorType },
{ 0, threeDSensorCalibrationCalibrationFactorSubFields, "calibration_factor", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 2, 1, 134, false, Profile::Type::Uint32 },
{ 0, 0, "calibration_divisor", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
{ 0, 0, "level_shift", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "offset_cal", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 133, false, Profile::Type::Sint32 },
{ 0, 0, "orientation_matrix", "", (FIT_FLOAT64)65535, (FIT_FLOAT64)0, 0, 0, 5, 133, false, Profile::Type::Sint32 },
};

static const Profile::SUBFIELD_MAP oneDSensorCalibrationCalibrationFactorBaroCalFactorMaps[] =
{
   { 3, 0 }, // sensor_type == barometer
};

static const Profile::SUBFIELD oneDSensorCalibrationCalibrationFactorSubFields[] =
{
   { oneDSensorCalibrationCalibrationFactorBaroCalFactorMaps, 0, "baro_cal_factor", "Pa", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
};

static const Profile::FIELD oneDSensorCalibrationFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "sensor_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::SensorType },
{ 0, oneDSensorCalibrationCalibrationFactorSubFields, "calibration_factor", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 1, 1, 134, false, Profile::Type::Uint32 },
{ 0, 0, "calibration_divisor", "counts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
{ 0, 0, "level_shift", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "offset_cal", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 133, false, Profile::Type::Sint32 },
};

static const Profile::FIELD videoFrameFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "frame_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD obdiiDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "time_offset", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "pid", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 13, false, Profile::Type::Byte },
{ 0, 0, "raw_data", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 13, false, Profile::Type::Byte },
{ 0, 0, "pid_data_size", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 2, false, Profile::Type::Uint8 },
{ 0, 0, "system_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 134, false, Profile::Type::Uint32 },
{ 0, 0, "start_timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 134, false, Profile::Type::DateTime },
{ 0, 0, "start_timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD nmeaSentenceFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "sentence", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 7, false, Profile::Type::String },
};

static const Profile::FIELD aviationAttitudeFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "system_time", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::Uint32 },
{ 0, 0, "pitch", "radians", (FIT_FLOAT64)10430.38, (FIT_FLOAT64)0, 0, 0, 2, 131, false, Profile::Type::Sint16 },
{ 0, 0, "roll", "radians", (FIT_FLOAT64)10430.38, (FIT_FLOAT64)0, 0, 0, 3, 131, false, Profile::Type::Sint16 },
{ 0, 0, "accel_lateral", "m/s^2", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 4, 131, false, Profile::Type::Sint16 },
{ 0, 0, "accel_normal", "m/s^2", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 5, 131, false, Profile::Type::Sint16 },
{ 0, 0, "turn_rate", "radians/second", (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 0, 0, 6, 131, false, Profile::Type::Sint16 },
{ 0, 0, "stage", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::AttitudeStage },
{ 0, 0, "attitude_stage_complete", "%", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 2, false, Profile::Type::Uint8 },
{ 0, 0, "track", "radians", (FIT_FLOAT64)10430.38, (FIT_FLOAT64)0, 0, 0, 9, 132, false, Profile::Type::Uint16 },
{ 0, 0, "validity", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 132, false, Profile::Type::AttitudeValidity },
};

static const Profile::FIELD videoFields[] =
{
{ 0, 0, "url", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 7, false, Profile::Type::String },
{ 0, 0, "hosting_provider", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 7, false, Profile::Type::String },
{ 0, 0, "duration", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD videoTitleFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "message_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "text", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 7, false, Profile::Type::String },
};

static const Profile::FIELD videoDescriptionFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "message_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "text", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 7, false, Profile::Type::String },
};

static const Profile::FIELD videoClipFields[] =
{
{ 0, 0, "clip_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "start_timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::DateTime },
{ 0, 0, "start_timestamp_ms", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "end_timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::DateTime },
{ 0, 0, "end_timestamp_ms", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "clip_start", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 134, false, Profile::Type::Uint32 },
{ 0, 0, "clip_end", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD setFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 134, false, Profile::Type::DateTime },
{ 0, 0, "duration", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 0, 134, false, Profile::Type::Uint32 },
{ 0, 0, "repetitions", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "weight", "kg", (FIT_FLOAT64)16, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "set_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 2, false, Profile::Type::SetType },
{ 0, 0, "start_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 134, false, Profile::Type::DateTime },
{ 0, 0, "category", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 132, false, Profile::Type::ExerciseCategory },
{ 0, 0, "category_subtype", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 132, false, Profile::Type::Uint16 },
{ 0, 0, "weight_display_unit", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 132, false, Profile::Type::FitBaseUnit },
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "wkt_step_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 132, false, Profile::Type::MessageIndex },
};

static const Profile::FIELD_COMPONENT jumpSpeedComponents[] =
{
   { (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 8, 16, FIT_FALSE }, // enhanced_speed
};

static const Profile::FIELD jumpFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "distance", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 136, false, Profile::Type::Float32 },
{ 0, 0, "height", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 136, false, Profile::Type::Float32 },
{ 0, 0, "rotations", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::Uint8 },
{ 0, 0, "hang_time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 136, false, Profile::Type::Float32 },
{ 0, 0, "score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 136, false, Profile::Type::Float32 },
{ 0, 0, "position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 133, false, Profile::Type::Sint32 },
{ 0, 0, "position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 133, false, Profile::Type::Sint32 },
{ jumpSpeedComponents, 0, "speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 1, 0, 7, 132, false, Profile::Type::Uint16 },
{ 0, 0, "enhanced_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 8, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD splitFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "split_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::SplitType },
{ 0, 0, "total_elapsed_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_timer_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_distance", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "start_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 134, false, Profile::Type::DateTime },
{ 0, 0, "total_ascent", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_descent", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 14, 132, false, Profile::Type::Uint16 },
{ 0, 0, "start_position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 21, 133, false, Profile::Type::Sint32 },
{ 0, 0, "start_position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 22, 133, false, Profile::Type::Sint32 },
{ 0, 0, "end_position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 23, 133, false, Profile::Type::Sint32 },
{ 0, 0, "end_position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 24, 133, false, Profile::Type::Sint32 },
{ 0, 0, "max_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 25, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_vert_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 26, 133, false, Profile::Type::Sint32 },
{ 0, 0, "end_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 27, 134, false, Profile::Type::DateTime },
{ 0, 0, "total_calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 28, 134, false, Profile::Type::Uint32 },
{ 0, 0, "start_elevation", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 74, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_moving_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 110, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD splitSummaryFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "split_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::SplitType },
{ 0, 0, "num_splits", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_timer_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_distance", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 5, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 6, 134, false, Profile::Type::Uint32 },
{ 0, 0, "max_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 7, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_ascent", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_descent", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 2, false, Profile::Type::Uint8 },
{ 0, 0, "max_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_vert_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 12, 133, false, Profile::Type::Sint32 },
{ 0, 0, "total_calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_moving_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 77, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD climbProFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 133, false, Profile::Type::Sint32 },
{ 0, 0, "position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 133, false, Profile::Type::Sint32 },
{ 0, 0, "climb_pro_event", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::ClimbProEvent },
{ 0, 0, "climb_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "climb_category", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 2, false, Profile::Type::Uint8 },
{ 0, 0, "current_dist", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 136, false, Profile::Type::Float32 },
};

static const Profile::FIELD fieldDescriptionFields[] =
{
{ 0, 0, "developer_data_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
{ 0, 0, "field_definition_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "fit_base_type_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::FitBaseType },
{ 0, 0, "field_name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 7, false, Profile::Type::String },
{ 0, 0, "array", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 2, false, Profile::Type::Uint8 },
{ 0, 0, "components", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 7, false, Profile::Type::String },
{ 0, 0, "scale", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 2, false, Profile::Type::Uint8 },
{ 0, 0, "offset", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 1, false, Profile::Type::Sint8 },
{ 0, 0, "units", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 7, false, Profile::Type::String },
{ 0, 0, "bits", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 7, false, Profile::Type::String },
{ 0, 0, "accumulate", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 7, false, Profile::Type::String },
{ 0, 0, "fit_base_unit_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 132, false, Profile::Type::FitBaseUnit },
{ 0, 0, "native_mesg_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 14, 132, false, Profile::Type::MesgNum },
{ 0, 0, "native_field_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 15, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD developerDataIdFields[] =
{
{ 0, 0, "developer_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 13, false, Profile::Type::Byte },
{ 0, 0, "application_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 13, false, Profile::Type::Byte },
{ 0, 0, "manufacturer_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Manufacturer },
{ 0, 0, "developer_data_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "application_version", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD courseFields[] =
{
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::Sport },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 7, false, Profile::Type::String },
{ 0, 0, "capabilities", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 140, false, Profile::Type::CourseCapabilities },
{ 0, 0, "sub_sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::SubSport },
};

static const Profile::FIELD coursePointFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::DateTime },
{ 0, 0, "position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 133, false, Profile::Type::Sint32 },
{ 0, 0, "position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 133, false, Profile::Type::Sint32 },
{ 0, 0, "distance", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 0, false, Profile::Type::CoursePoint },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 7, false, Profile::Type::String },
{ 0, 0, "favorite", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 0, false, Profile::Type::Bool },
};

static const Profile::FIELD segmentIdFields[] =
{
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 7, false, Profile::Type::String },
{ 0, 0, "uuid", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 7, false, Profile::Type::String },
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::Sport },
{ 0, 0, "enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 0, false, Profile::Type::Bool },
{ 0, 0, "user_profile_primary_key", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "device_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 134, false, Profile::Type::Uint32 },
{ 0, 0, "default_race_leader", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 2, false, Profile::Type::Uint8 },
{ 0, 0, "delete_status", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::SegmentDeleteStatus },
{ 0, 0, "selection_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 0, false, Profile::Type::SegmentSelectionType },
};

static const Profile::FIELD segmentLeaderboardEntryFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 7, false, Profile::Type::String },
{ 0, 0, "type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::SegmentLeaderboardType },
{ 0, 0, "group_primary_key", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
{ 0, 0, "activity_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "segment_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "activity_id_string", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 7, false, Profile::Type::String },
};

static const Profile::FIELD_COMPONENT segmentPointAltitudeComponents[] =
{
   { (FIT_FLOAT64)5, (FIT_FLOAT64)500, 6, 16, FIT_FALSE }, // enhanced_altitude
};

static const Profile::FIELD segmentPointFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 133, false, Profile::Type::Sint32 },
{ 0, 0, "position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 133, false, Profile::Type::Sint32 },
{ 0, 0, "distance", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::Uint32 },
{ segmentPointAltitudeComponents, 0, "altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 1, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "leader_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 5, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 6, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD_COMPONENT segmentLapAvgAltitudeComponents[] =
{
   { (FIT_FLOAT64)5, (FIT_FLOAT64)500, 91, 16, FIT_FALSE }, // enhanced_avg_altitude
};

static const Profile::FIELD_COMPONENT segmentLapMaxAltitudeComponents[] =
{
   { (FIT_FLOAT64)5, (FIT_FLOAT64)500, 92, 16, FIT_FALSE }, // enhanced_max_altitude
};

static const Profile::FIELD_COMPONENT segmentLapMinAltitudeComponents[] =
{
   { (FIT_FLOAT64)5, (FIT_FLOAT64)500, 93, 16, FIT_FALSE }, // enhanced_min_altitude
};

static const Profile::SUBFIELD_MAP segmentLapTotalCyclesTotalStrokesMaps[] =
{
   { 2, 23 }, // sport == cycling
};

static const Profile::SUBFIELD segmentLapTotalCyclesSubFields[] =
{
   { segmentLapTotalCyclesTotalStrokesMaps, 0, "total_strokes", "strokes", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
};

static const Profile::FIELD segmentLapFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "event", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Event },
{ 0, 0, "event_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::EventType },
{ 0, 0, "start_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::DateTime },
{ 0, 0, "start_position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 133, false, Profile::Type::Sint32 },
{ 0, 0, "start_position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 133, false, Profile::Type::Sint32 },
{ 0, 0, "end_position_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 133, false, Profile::Type::Sint32 },
{ 0, 0, "end_position_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 133, false, Profile::Type::Sint32 },
{ 0, 0, "total_elapsed_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 7, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_timer_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 8, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_distance", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 9, 134, false, Profile::Type::Uint32 },
{ 0, segmentLapTotalCyclesSubFields, "total_cycles", "cycles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 1, 10, 134, false, Profile::Type::Uint32 },
{ 0, 0, "total_calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_fat_calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 13, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 14, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 15, 2, false, Profile::Type::Uint8 },
{ 0, 0, "max_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 16, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_cadence", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 17, 2, false, Profile::Type::Uint8 },
{ 0, 0, "max_cadence", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 18, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 19, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 20, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_ascent", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 21, 132, false, Profile::Type::Uint16 },
{ 0, 0, "total_descent", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 22, 132, false, Profile::Type::Uint16 },
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 23, 0, false, Profile::Type::Sport },
{ 0, 0, "event_group", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 24, 2, false, Profile::Type::Uint8 },
{ 0, 0, "nec_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 25, 133, false, Profile::Type::Sint32 },
{ 0, 0, "nec_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 26, 133, false, Profile::Type::Sint32 },
{ 0, 0, "swc_lat", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 27, 133, false, Profile::Type::Sint32 },
{ 0, 0, "swc_long", "semicircles", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 28, 133, false, Profile::Type::Sint32 },
{ 0, 0, "name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 29, 7, false, Profile::Type::String },
{ 0, 0, "normalized_power", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 30, 132, false, Profile::Type::Uint16 },
{ 0, 0, "left_right_balance", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 31, 132, false, Profile::Type::LeftRightBalance100 },
{ 0, 0, "sub_sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 32, 0, false, Profile::Type::SubSport },
{ 0, 0, "total_work", "J", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 33, 134, false, Profile::Type::Uint32 },
{ segmentLapAvgAltitudeComponents, 0, "avg_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 1, 0, 34, 132, false, Profile::Type::Uint16 },
{ segmentLapMaxAltitudeComponents, 0, "max_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 1, 0, 35, 132, false, Profile::Type::Uint16 },
{ 0, 0, "gps_accuracy", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 36, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 37, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_pos_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 38, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_neg_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 39, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_pos_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 40, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_neg_grade", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 41, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 42, 1, false, Profile::Type::Sint8 },
{ 0, 0, "max_temperature", "C", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 43, 1, false, Profile::Type::Sint8 },
{ 0, 0, "total_moving_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 44, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_pos_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 45, 131, false, Profile::Type::Sint16 },
{ 0, 0, "avg_neg_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 46, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_pos_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 47, 131, false, Profile::Type::Sint16 },
{ 0, 0, "max_neg_vertical_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 48, 131, false, Profile::Type::Sint16 },
{ 0, 0, "time_in_hr_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 49, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_speed_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 50, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_cadence_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 51, 134, false, Profile::Type::Uint32 },
{ 0, 0, "time_in_power_zone", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 52, 134, false, Profile::Type::Uint32 },
{ 0, 0, "repetition_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 53, 132, false, Profile::Type::Uint16 },
{ segmentLapMinAltitudeComponents, 0, "min_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 1, 0, 54, 132, false, Profile::Type::Uint16 },
{ 0, 0, "min_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 55, 2, false, Profile::Type::Uint8 },
{ 0, 0, "active_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 56, 134, false, Profile::Type::Uint32 },
{ 0, 0, "wkt_step_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 57, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "sport_event", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 58, 0, false, Profile::Type::SportEvent },
{ 0, 0, "avg_left_torque_effectiveness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 59, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_torque_effectiveness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 60, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_left_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 61, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 62, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_combined_pedal_smoothness", "percent", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 0, 63, 2, false, Profile::Type::Uint8 },
{ 0, 0, "status", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 64, 0, false, Profile::Type::SegmentLapStatus },
{ 0, 0, "uuid", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 65, 7, false, Profile::Type::String },
{ 0, 0, "avg_fractional_cadence", "rpm", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 66, 2, false, Profile::Type::Uint8 },
{ 0, 0, "max_fractional_cadence", "rpm", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 67, 2, false, Profile::Type::Uint8 },
{ 0, 0, "total_fractional_cycles", "cycles", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 68, 2, false, Profile::Type::Uint8 },
{ 0, 0, "front_gear_shift_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 69, 132, false, Profile::Type::Uint16 },
{ 0, 0, "rear_gear_shift_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 70, 132, false, Profile::Type::Uint16 },
{ 0, 0, "time_standing", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 71, 134, false, Profile::Type::Uint32 },
{ 0, 0, "stand_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 72, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_left_pco", "mm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 73, 1, false, Profile::Type::Sint8 },
{ 0, 0, "avg_right_pco", "mm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 74, 1, false, Profile::Type::Sint8 },
{ 0, 0, "avg_left_power_phase", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 75, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_left_power_phase_peak", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 76, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_power_phase", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 77, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_right_power_phase_peak", "degrees", (FIT_FLOAT64)0.7111111, (FIT_FLOAT64)0, 0, 0, 78, 2, false, Profile::Type::Uint8 },
{ 0, 0, "avg_power_position", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 79, 132, false, Profile::Type::Uint16 },
{ 0, 0, "max_power_position", "watts", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 80, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_cadence_position", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 81, 2, false, Profile::Type::Uint8 },
{ 0, 0, "max_cadence_position", "rpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 82, 2, false, Profile::Type::Uint8 },
{ 0, 0, "manufacturer", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 83, 132, false, Profile::Type::Manufacturer },
{ 0, 0, "total_grit", "kGrit", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 84, 136, false, Profile::Type::Float32 },
{ 0, 0, "total_flow", "Flow", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 85, 136, false, Profile::Type::Float32 },
{ 0, 0, "avg_grit", "kGrit", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 86, 136, false, Profile::Type::Float32 },
{ 0, 0, "avg_flow", "Flow", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 87, 136, false, Profile::Type::Float32 },
{ 0, 0, "total_fractional_ascent", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 89, 2, false, Profile::Type::Uint8 },
{ 0, 0, "total_fractional_descent", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 90, 2, false, Profile::Type::Uint8 },
{ 0, 0, "enhanced_avg_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 91, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_max_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 92, 134, false, Profile::Type::Uint32 },
{ 0, 0, "enhanced_min_altitude", "m", (FIT_FLOAT64)5, (FIT_FLOAT64)500, 0, 0, 93, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD segmentFileFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "file_uuid", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 7, false, Profile::Type::String },
{ 0, 0, "enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 0, false, Profile::Type::Bool },
{ 0, 0, "user_profile_primary_key", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "leader_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::SegmentLeaderboardType },
{ 0, 0, "leader_group_primary_key", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 134, false, Profile::Type::Uint32 },
{ 0, 0, "leader_activity_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 134, false, Profile::Type::Uint32 },
{ 0, 0, "leader_activity_id_string", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 7, false, Profile::Type::String },
{ 0, 0, "default_race_leader", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD workoutFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::Sport },
{ 0, 0, "capabilities", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 140, false, Profile::Type::WorkoutCapabilities },
{ 0, 0, "num_valid_steps", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 132, false, Profile::Type::Uint16 },
{ 0, 0, "wkt_name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 7, false, Profile::Type::String },
{ 0, 0, "sub_sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 0, false, Profile::Type::SubSport },
{ 0, 0, "pool_length", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 14, 132, false, Profile::Type::Uint16 },
{ 0, 0, "pool_length_unit", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 15, 0, false, Profile::Type::DisplayMeasure },
{ 0, 0, "wkt_description", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 17, 7, false, Profile::Type::String },
};

static const Profile::FIELD workoutSessionFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::Sport },
{ 0, 0, "sub_sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::SubSport },
{ 0, 0, "num_valid_steps", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "first_step_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "pool_length", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "pool_length_unit", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 0, false, Profile::Type::DisplayMeasure },
};

static const Profile::SUBFIELD_MAP workoutStepDurationValueDurationTimeMaps[] =
{
   { 0, 1 }, // duration_type == time
   { 28, 1 }, // duration_type == repetition_time
};

static const Profile::SUBFIELD_MAP workoutStepDurationValueDurationDistanceMaps[] =
{
   { 1, 1 }, // duration_type == distance
};

static const Profile::SUBFIELD_MAP workoutStepDurationValueDurationHrMaps[] =
{
   { 2, 1 }, // duration_type == hr_less_than
   { 3, 1 }, // duration_type == hr_greater_than
};

static const Profile::SUBFIELD_MAP workoutStepDurationValueDurationCaloriesMaps[] =
{
   { 4, 1 }, // duration_type == calories
};

static const Profile::SUBFIELD_MAP workoutStepDurationValueDurationStepMaps[] =
{
   { 6, 1 }, // duration_type == repeat_until_steps_cmplt
   { 7, 1 }, // duration_type == repeat_until_time
   { 8, 1 }, // duration_type == repeat_until_distance
   { 9, 1 }, // duration_type == repeat_until_calories
   { 10, 1 }, // duration_type == repeat_until_hr_less_than
   { 11, 1 }, // duration_type == repeat_until_hr_greater_than
   { 12, 1 }, // duration_type == repeat_until_power_less_than
   { 13, 1 }, // duration_type == repeat_until_power_greater_than
};

static const Profile::SUBFIELD_MAP workoutStepDurationValueDurationPowerMaps[] =
{
   { 14, 1 }, // duration_type == power_less_than
   { 15, 1 }, // duration_type == power_greater_than
};

static const Profile::SUBFIELD_MAP workoutStepDurationValueDurationRepsMaps[] =
{
   { 29, 1 }, // duration_type == reps
};

static const Profile::SUBFIELD_MAP workoutStepTargetValueTargetSpeedZoneMaps[] =
{
   { 0, 3 }, // target_type == speed
};

static const Profile::SUBFIELD_MAP workoutStepTargetValueTargetHrZoneMaps[] =
{
   { 1, 3 }, // target_type == heart_rate
};

static const Profile::SUBFIELD_MAP workoutStepTargetValueTargetCadenceZoneMaps[] =
{
   { 3, 3 }, // target_type == cadence
};

static const Profile::SUBFIELD_MAP workoutStepTargetValueTargetPowerZoneMaps[] =
{
   { 4, 3 }, // target_type == power
};

static const Profile::SUBFIELD_MAP workoutStepTargetValueRepeatStepsMaps[] =
{
   { 6, 1 }, // duration_type == repeat_until_steps_cmplt
};

static const Profile::SUBFIELD_MAP workoutStepTargetValueRepeatTimeMaps[] =
{
   { 7, 1 }, // duration_type == repeat_until_time
};

static const Profile::SUBFIELD_MAP workoutStepTargetValueRepeatDistanceMaps[] =
{
   { 8, 1 }, // duration_type == repeat_until_distance
};

static const Profile::SUBFIELD_MAP workoutStepTargetValueRepeatCaloriesMaps[] =
{
   { 9, 1 }, // duration_type == repeat_until_calories
};

static const Profile::SUBFIELD_MAP workoutStepTargetValueRepeatHrMaps[] =
{
   { 10, 1 }, // duration_type == repeat_until_hr_less_than
   { 11, 1 }, // duration_type == repeat_until_hr_greater_than
};

static const Profile::SUBFIELD_MAP workoutStepTargetValueRepeatPowerMaps[] =
{
   { 12, 1 }, // duration_type == repeat_until_power_less_than
   { 13, 1 }, // duration_type == repeat_until_power_greater_than
};

static const Profile::SUBFIELD_MAP workoutStepTargetValueTargetStrokeTypeMaps[] =
{
   { 11, 3 }, // target_type == swim_stroke
};

static const Profile::SUBFIELD_MAP workoutStepCustomTargetValueLowCustomTargetSpeedLowMaps[] =
{
   { 0, 3 }, // target_type == speed
};

static const Profile::SUBFIELD_MAP workoutStepCustomTargetValueLowCustomTargetHeartRateLowMaps[] =
{
   { 1, 3 }, // target_type == heart_rate
};

static const Profile::SUBFIELD_MAP workoutStepCustomTargetValueLowCustomTargetCadenceLowMaps[] =
{
   { 3, 3 }, // target_type == cadence
};

static const Profile::SUBFIELD_MAP workoutStepCustomTargetValueLowCustomTargetPowerLowMaps[] =
{
   { 4, 3 }, // target_type == power
};

static const Profile::SUBFIELD_MAP workoutStepCustomTargetValueHighCustomTargetSpeedHighMaps[] =
{
   { 0, 3 }, // target_type == speed
};

static const Profile::SUBFIELD_MAP workoutStepCustomTargetValueHighCustomTargetHeartRateHighMaps[] =
{
   { 1, 3 }, // target_type == heart_rate
};

static const Profile::SUBFIELD_MAP workoutStepCustomTargetValueHighCustomTargetCadenceHighMaps[] =
{
   { 3, 3 }, // target_type == cadence
};

static const Profile::SUBFIELD_MAP workoutStepCustomTargetValueHighCustomTargetPowerHighMaps[] =
{
   { 4, 3 }, // target_type == power
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryTargetValueSecondaryTargetSpeedZoneMaps[] =
{
   { 0, 19 }, // secondary_target_type == speed
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryTargetValueSecondaryTargetHrZoneMaps[] =
{
   { 1, 19 }, // secondary_target_type == heart_rate
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryTargetValueSecondaryTargetCadenceZoneMaps[] =
{
   { 3, 19 }, // secondary_target_type == cadence
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryTargetValueSecondaryTargetPowerZoneMaps[] =
{
   { 4, 19 }, // secondary_target_type == power
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryTargetValueSecondaryTargetStrokeTypeMaps[] =
{
   { 11, 19 }, // secondary_target_type == swim_stroke
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryCustomTargetValueLowSecondaryCustomTargetSpeedLowMaps[] =
{
   { 0, 19 }, // secondary_target_type == speed
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryCustomTargetValueLowSecondaryCustomTargetHeartRateLowMaps[] =
{
   { 1, 19 }, // secondary_target_type == heart_rate
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryCustomTargetValueLowSecondaryCustomTargetCadenceLowMaps[] =
{
   { 3, 19 }, // secondary_target_type == cadence
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryCustomTargetValueLowSecondaryCustomTargetPowerLowMaps[] =
{
   { 4, 19 }, // secondary_target_type == power
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryCustomTargetValueHighSecondaryCustomTargetSpeedHighMaps[] =
{
   { 0, 19 }, // secondary_target_type == speed
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryCustomTargetValueHighSecondaryCustomTargetHeartRateHighMaps[] =
{
   { 1, 19 }, // secondary_target_type == heart_rate
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryCustomTargetValueHighSecondaryCustomTargetCadenceHighMaps[] =
{
   { 3, 19 }, // secondary_target_type == cadence
};

static const Profile::SUBFIELD_MAP workoutStepSecondaryCustomTargetValueHighSecondaryCustomTargetPowerHighMaps[] =
{
   { 4, 19 }, // secondary_target_type == power
};

static const Profile::SUBFIELD workoutStepDurationValueSubFields[] =
{
   { workoutStepDurationValueDurationTimeMaps, 0, "duration_time", "s", (FIT_FLOAT32)1000, (FIT_FLOAT32)0, 2, 0, 134 },
   { workoutStepDurationValueDurationDistanceMaps, 0, "duration_distance", "m", (FIT_FLOAT32)100, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepDurationValueDurationHrMaps, 0, "duration_hr", "% or bpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 2, 0, 134 },
   { workoutStepDurationValueDurationCaloriesMaps, 0, "duration_calories", "calories", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepDurationValueDurationStepMaps, 0, "duration_step", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 8, 0, 134 },
   { workoutStepDurationValueDurationPowerMaps, 0, "duration_power", "% or watts", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 2, 0, 134 },
   { workoutStepDurationValueDurationRepsMaps, 0, "duration_reps", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
};

static const Profile::SUBFIELD workoutStepTargetValueSubFields[] =
{
   { workoutStepTargetValueTargetSpeedZoneMaps, 0, "target_speed_zone", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepTargetValueTargetHrZoneMaps, 0, "target_hr_zone", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepTargetValueTargetCadenceZoneMaps, 0, "target_cadence_zone", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepTargetValueTargetPowerZoneMaps, 0, "target_power_zone", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepTargetValueRepeatStepsMaps, 0, "repeat_steps", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepTargetValueRepeatTimeMaps, 0, "repeat_time", "s", (FIT_FLOAT32)1000, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepTargetValueRepeatDistanceMaps, 0, "repeat_distance", "m", (FIT_FLOAT32)100, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepTargetValueRepeatCaloriesMaps, 0, "repeat_calories", "calories", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepTargetValueRepeatHrMaps, 0, "repeat_hr", "% or bpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 2, 0, 134 },
   { workoutStepTargetValueRepeatPowerMaps, 0, "repeat_power", "% or watts", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 2, 0, 134 },
   { workoutStepTargetValueTargetStrokeTypeMaps, 0, "target_stroke_type", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 0 },
};

static const Profile::SUBFIELD workoutStepCustomTargetValueLowSubFields[] =
{
   { workoutStepCustomTargetValueLowCustomTargetSpeedLowMaps, 0, "custom_target_speed_low", "m/s", (FIT_FLOAT32)1000, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepCustomTargetValueLowCustomTargetHeartRateLowMaps, 0, "custom_target_heart_rate_low", "% or bpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepCustomTargetValueLowCustomTargetCadenceLowMaps, 0, "custom_target_cadence_low", "rpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepCustomTargetValueLowCustomTargetPowerLowMaps, 0, "custom_target_power_low", "% or watts", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
};

static const Profile::SUBFIELD workoutStepCustomTargetValueHighSubFields[] =
{
   { workoutStepCustomTargetValueHighCustomTargetSpeedHighMaps, 0, "custom_target_speed_high", "m/s", (FIT_FLOAT32)1000, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepCustomTargetValueHighCustomTargetHeartRateHighMaps, 0, "custom_target_heart_rate_high", "% or bpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepCustomTargetValueHighCustomTargetCadenceHighMaps, 0, "custom_target_cadence_high", "rpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepCustomTargetValueHighCustomTargetPowerHighMaps, 0, "custom_target_power_high", "% or watts", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
};

static const Profile::SUBFIELD workoutStepSecondaryTargetValueSubFields[] =
{
   { workoutStepSecondaryTargetValueSecondaryTargetSpeedZoneMaps, 0, "secondary_target_speed_zone", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepSecondaryTargetValueSecondaryTargetHrZoneMaps, 0, "secondary_target_hr_zone", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepSecondaryTargetValueSecondaryTargetCadenceZoneMaps, 0, "secondary_target_cadence_zone", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepSecondaryTargetValueSecondaryTargetPowerZoneMaps, 0, "secondary_target_power_zone", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepSecondaryTargetValueSecondaryTargetStrokeTypeMaps, 0, "secondary_target_stroke_type", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 0 },
};

static const Profile::SUBFIELD workoutStepSecondaryCustomTargetValueLowSubFields[] =
{
   { workoutStepSecondaryCustomTargetValueLowSecondaryCustomTargetSpeedLowMaps, 0, "secondary_custom_target_speed_low", "m/s", (FIT_FLOAT32)1000, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepSecondaryCustomTargetValueLowSecondaryCustomTargetHeartRateLowMaps, 0, "secondary_custom_target_heart_rate_low", "% or bpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepSecondaryCustomTargetValueLowSecondaryCustomTargetCadenceLowMaps, 0, "secondary_custom_target_cadence_low", "rpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepSecondaryCustomTargetValueLowSecondaryCustomTargetPowerLowMaps, 0, "secondary_custom_target_power_low", "% or watts", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
};

static const Profile::SUBFIELD workoutStepSecondaryCustomTargetValueHighSubFields[] =
{
   { workoutStepSecondaryCustomTargetValueHighSecondaryCustomTargetSpeedHighMaps, 0, "secondary_custom_target_speed_high", "m/s", (FIT_FLOAT32)1000, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepSecondaryCustomTargetValueHighSecondaryCustomTargetHeartRateHighMaps, 0, "secondary_custom_target_heart_rate_high", "% or bpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepSecondaryCustomTargetValueHighSecondaryCustomTargetCadenceHighMaps, 0, "secondary_custom_target_cadence_high", "rpm", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
   { workoutStepSecondaryCustomTargetValueHighSecondaryCustomTargetPowerHighMaps, 0, "secondary_custom_target_power_high", "% or watts", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 134 },
};

static const Profile::FIELD workoutStepFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "wkt_step_name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 7, false, Profile::Type::String },
{ 0, 0, "duration_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::WktStepDuration },
{ 0, workoutStepDurationValueSubFields, "duration_value", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 7, 2, 134, false, Profile::Type::Uint32 },
{ 0, 0, "target_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 0, false, Profile::Type::WktStepTarget },
{ 0, workoutStepTargetValueSubFields, "target_value", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 11, 4, 134, false, Profile::Type::Uint32 },
{ 0, workoutStepCustomTargetValueLowSubFields, "custom_target_value_low", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 4, 5, 134, false, Profile::Type::Uint32 },
{ 0, workoutStepCustomTargetValueHighSubFields, "custom_target_value_high", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 4, 6, 134, false, Profile::Type::Uint32 },
{ 0, 0, "intensity", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::Intensity },
{ 0, 0, "notes", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 7, false, Profile::Type::String },
{ 0, 0, "equipment", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 0, false, Profile::Type::WorkoutEquipment },
{ 0, 0, "exercise_category", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 132, false, Profile::Type::ExerciseCategory },
{ 0, 0, "exercise_name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 132, false, Profile::Type::Uint16 },
{ 0, 0, "exercise_weight", "kg", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 12, 132, false, Profile::Type::Uint16 },
{ 0, 0, "weight_display_unit", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 132, false, Profile::Type::FitBaseUnit },
{ 0, 0, "secondary_target_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 19, 0, false, Profile::Type::WktStepTarget },
{ 0, workoutStepSecondaryTargetValueSubFields, "secondary_target_value", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 5, 20, 134, false, Profile::Type::Uint32 },
{ 0, workoutStepSecondaryCustomTargetValueLowSubFields, "secondary_custom_target_value_low", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 4, 21, 134, false, Profile::Type::Uint32 },
{ 0, workoutStepSecondaryCustomTargetValueHighSubFields, "secondary_custom_target_value_high", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 4, 22, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD exerciseTitleFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "exercise_category", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::ExerciseCategory },
{ 0, 0, "exercise_name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "wkt_step_name", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 7, false, Profile::Type::String },
};

static const Profile::SUBFIELD_MAP scheduleProductFaveroProductMaps[] =
{
   { 263, 0 }, // manufacturer == favero_electronics
};

static const Profile::SUBFIELD_MAP scheduleProductGarminProductMaps[] =
{
   { 1, 0 }, // manufacturer == garmin
   { 15, 0 }, // manufacturer == dynastream
   { 13, 0 }, // manufacturer == dynastream_oem
   { 89, 0 }, // manufacturer == tacx
};

static const Profile::SUBFIELD scheduleProductSubFields[] =
{
   { scheduleProductFaveroProductMaps, 0, "favero_product", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 1, 0, 132 },
   { scheduleProductGarminProductMaps, 0, "garmin_product", "", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 4, 0, 132 },
};

static const Profile::FIELD scheduleFields[] =
{
{ 0, 0, "manufacturer", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Manufacturer },
{ 0, scheduleProductSubFields, "product", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 2, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "serial_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 140, false, Profile::Type::Uint32z },
{ 0, 0, "time_created", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::DateTime },
{ 0, 0, "completed", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::Bool },
{ 0, 0, "type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 0, false, Profile::Type::Schedule },
{ 0, 0, "scheduled_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 134, false, Profile::Type::LocalDateTime },
};

static const Profile::FIELD totalsFields[] =
{
{ 0, 0, "message_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 254, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timer_time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 134, false, Profile::Type::Uint32 },
{ 0, 0, "distance", "m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::Uint32 },
{ 0, 0, "calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 0, false, Profile::Type::Sport },
{ 0, 0, "elapsed_time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "sessions", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 132, false, Profile::Type::Uint16 },
{ 0, 0, "active_time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 134, false, Profile::Type::Uint32 },
{ 0, 0, "sport_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD weightScaleFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "weight", "kg", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Weight },
{ 0, 0, "percent_fat", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "percent_hydration", "%", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "visceral_fat_mass", "kg", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "bone_mass", "kg", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "muscle_mass", "kg", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 5, 132, false, Profile::Type::Uint16 },
{ 0, 0, "basal_met", "kcal/day", (FIT_FLOAT64)4, (FIT_FLOAT64)0, 0, 0, 7, 132, false, Profile::Type::Uint16 },
{ 0, 0, "physique_rating", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 2, false, Profile::Type::Uint8 },
{ 0, 0, "active_met", "kcal/day", (FIT_FLOAT64)4, (FIT_FLOAT64)0, 0, 0, 9, 132, false, Profile::Type::Uint16 },
{ 0, 0, "metabolic_age", "years", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 2, false, Profile::Type::Uint8 },
{ 0, 0, "visceral_fat_rating", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 2, false, Profile::Type::Uint8 },
{ 0, 0, "user_profile_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "bmi", "kg/m^2", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 13, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD bloodPressureFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "systolic_pressure", "mmHg", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "diastolic_pressure", "mmHg", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "mean_arterial_pressure", "mmHg", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "map_3_sample_mean", "mmHg", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "map_morning_values", "mmHg", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "map_evening_values", "mmHg", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 132, false, Profile::Type::Uint16 },
{ 0, 0, "heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 2, false, Profile::Type::Uint8 },
{ 0, 0, "heart_rate_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::HrType },
{ 0, 0, "status", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 0, false, Profile::Type::BpStatus },
{ 0, 0, "user_profile_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 132, false, Profile::Type::MessageIndex },
};

static const Profile::FIELD monitoringInfoFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "local_timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 134, false, Profile::Type::LocalDateTime },
{ 0, 0, "activity_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 0, false, Profile::Type::ActivityType },
{ 0, 0, "cycles_to_distance", "m/cycle", (FIT_FLOAT64)5000, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "cycles_to_calories", "kcal/cycle", (FIT_FLOAT64)5000, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "resting_metabolic_rate", "kcal / day", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD_COMPONENT monitoringCurrentActivityTypeIntensityComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 5, 5, FIT_FALSE }, // activity_type
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 28, 3, FIT_FALSE }, // intensity
};

static const Profile::SUBFIELD_MAP monitoringCyclesStepsMaps[] =
{
   { 6, 5 }, // activity_type == walking
   { 1, 5 }, // activity_type == running
};

static const Profile::SUBFIELD_MAP monitoringCyclesStrokesMaps[] =
{
   { 2, 5 }, // activity_type == cycling
   { 5, 5 }, // activity_type == swimming
};

static const Profile::SUBFIELD monitoringCyclesSubFields[] =
{
   { monitoringCyclesStepsMaps, 0, "steps", "steps", (FIT_FLOAT32)1, (FIT_FLOAT32)0, 2, 0, 134 },
   { monitoringCyclesStrokesMaps, 0, "strokes", "strokes", (FIT_FLOAT32)2, (FIT_FLOAT32)0, 2, 0, 134 },
};

static const Profile::FIELD monitoringFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "device_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::DeviceIndex },
{ 0, 0, "calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "distance", "m", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
{ 0, monitoringCyclesSubFields, "cycles", "cycles", (FIT_FLOAT64)2, (FIT_FLOAT64)0, 0, 2, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "active_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "activity_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 0, false, Profile::Type::ActivityType },
{ 0, 0, "activity_subtype", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 0, false, Profile::Type::ActivitySubtype },
{ 0, 0, "activity_level", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 0, false, Profile::Type::ActivityLevel },
{ 0, 0, "distance_16", "100 * m", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 132, false, Profile::Type::Uint16 },
{ 0, 0, "cycles_16", "2 * cycles (steps)", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 132, false, Profile::Type::Uint16 },
{ 0, 0, "active_time_16", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 132, false, Profile::Type::Uint16 },
{ 0, 0, "local_timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 134, false, Profile::Type::LocalDateTime },
{ 0, 0, "temperature", "C", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 12, 131, false, Profile::Type::Sint16 },
{ 0, 0, "temperature_min", "C", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 14, 131, false, Profile::Type::Sint16 },
{ 0, 0, "temperature_max", "C", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 15, 131, false, Profile::Type::Sint16 },
{ 0, 0, "activity_time", "minutes", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 16, 132, false, Profile::Type::Uint16 },
{ 0, 0, "active_calories", "kcal", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 19, 132, false, Profile::Type::Uint16 },
{ monitoringCurrentActivityTypeIntensityComponents, 0, "current_activity_type_intensity", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 0, 24, 13, false, Profile::Type::Byte },
{ 0, 0, "timestamp_min_8", "min", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 25, 2, false, Profile::Type::Uint8 },
{ 0, 0, "timestamp_16", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 26, 132, false, Profile::Type::Uint16 },
{ 0, 0, "heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 27, 2, false, Profile::Type::Uint8 },
{ 0, 0, "intensity", "", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 28, 2, false, Profile::Type::Uint8 },
{ 0, 0, "duration_min", "min", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 29, 132, false, Profile::Type::Uint16 },
{ 0, 0, "duration", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 30, 134, false, Profile::Type::Uint32 },
{ 0, 0, "ascent", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 31, 134, false, Profile::Type::Uint32 },
{ 0, 0, "descent", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 32, 134, false, Profile::Type::Uint32 },
{ 0, 0, "moderate_activity_minutes", "minutes", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 33, 132, false, Profile::Type::Uint16 },
{ 0, 0, "vigorous_activity_minutes", "minutes", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 34, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD monitoringHrDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "resting_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
{ 0, 0, "current_day_resting_heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD spo2DataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "reading_spo2", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
{ 0, 0, "reading_confidence", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "mode", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::Spo2MeasurementType },
};

static const Profile::FIELD_COMPONENT hrTime256Components[] =
{
   { (FIT_FLOAT64)256, (FIT_FLOAT64)0, 0, 8, FIT_FALSE }, // fractional_timestamp
};

static const Profile::FIELD_COMPONENT hrEventTimestamp12Components[] =
{
   { (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 9, 12, FIT_TRUE }, // event_timestamp
   { (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 9, 12, FIT_TRUE }, // event_timestamp
   { (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 9, 12, FIT_TRUE }, // event_timestamp
   { (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 9, 12, FIT_TRUE }, // event_timestamp
   { (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 9, 12, FIT_TRUE }, // event_timestamp
   { (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 9, 12, FIT_TRUE }, // event_timestamp
   { (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 9, 12, FIT_TRUE }, // event_timestamp
   { (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 9, 12, FIT_TRUE }, // event_timestamp
   { (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 9, 12, FIT_TRUE }, // event_timestamp
   { (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 9, 12, FIT_TRUE }, // event_timestamp
};

static const Profile::FIELD hrFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "fractional_timestamp", "s", (FIT_FLOAT64)32768, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ hrTime256Components, 0, "time256", "s", (FIT_FLOAT64)256, (FIT_FLOAT64)0, 1, 0, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "filtered_bpm", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 2, false, Profile::Type::Uint8 },
{ 0, 0, "event_timestamp", "s", (FIT_FLOAT64)1024, (FIT_FLOAT64)0, 0, 0, 9, 134, true, Profile::Type::Uint32 },
{ hrEventTimestamp12Components, 0, "event_timestamp_12", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 10, 0, 10, 13, false, Profile::Type::Byte },
};

static const Profile::FIELD stressLevelFields[] =
{
{ 0, 0, "stress_level_value", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 131, false, Profile::Type::Sint16 },
{ 0, 0, "stress_level_time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::DateTime },
};

static const Profile::FIELD maxMetDataFields[] =
{
{ 0, 0, "update_time", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 134, false, Profile::Type::DateTime },
{ 0, 0, "vo2_max", "mL/kg/min", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 0, false, Profile::Type::Sport },
{ 0, 0, "sub_sport", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 0, false, Profile::Type::SubSport },
{ 0, 0, "max_met_category", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 0, false, Profile::Type::MaxMetCategory },
{ 0, 0, "calibrated_data", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 0, false, Profile::Type::Bool },
{ 0, 0, "hr_source", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 12, 0, false, Profile::Type::MaxMetHeartRateSource },
{ 0, 0, "speed_source", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 13, 0, false, Profile::Type::MaxMetSpeedSource },
};

static const Profile::FIELD hsaBodyBatteryDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "processing_interval", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "level", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 1, false, Profile::Type::Sint8 },
{ 0, 0, "charged", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 131, false, Profile::Type::Sint16 },
{ 0, 0, "uncharged", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 131, false, Profile::Type::Sint16 },
};

static const Profile::FIELD hsaEventFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "event_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD hsaAccelerometerDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "sampling_interval", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "accel_x", "mG", (FIT_FLOAT64)1.024, (FIT_FLOAT64)0, 0, 0, 2, 131, false, Profile::Type::Sint16 },
{ 0, 0, "accel_y", "mG", (FIT_FLOAT64)1.024, (FIT_FLOAT64)0, 0, 0, 3, 131, false, Profile::Type::Sint16 },
{ 0, 0, "accel_z", "mG", (FIT_FLOAT64)1.024, (FIT_FLOAT64)0, 0, 0, 4, 131, false, Profile::Type::Sint16 },
{ 0, 0, "timestamp_32k", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD hsaGyroscopeDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "sampling_interval", "1/32768 s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "gyro_x", "deg/s", (FIT_FLOAT64)28.57143, (FIT_FLOAT64)0, 0, 0, 2, 131, false, Profile::Type::Sint16 },
{ 0, 0, "gyro_y", "deg/s", (FIT_FLOAT64)28.57143, (FIT_FLOAT64)0, 0, 0, 3, 131, false, Profile::Type::Sint16 },
{ 0, 0, "gyro_z", "deg/s", (FIT_FLOAT64)28.57143, (FIT_FLOAT64)0, 0, 0, 4, 131, false, Profile::Type::Sint16 },
{ 0, 0, "timestamp_32k", "1/32768 s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD hsaStepDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "processing_interval", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "steps", "steps", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD hsaSpo2DataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "processing_interval", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "reading_spo2", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "confidence", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD hsaStressDataFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "processing_interval", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "stress_level", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 1, false, Profile::Type::Sint8 },
};

static const Profile::FIELD hsaRespirationDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "processing_interval", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "respiration_rate", "breaths/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 1, 131, false, Profile::Type::Sint16 },
};

static const Profile::FIELD hsaHeartRateDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "processing_interval", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "status", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "heart_rate", "bpm", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD hsaConfigurationDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "data", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 13, false, Profile::Type::Byte },
{ 0, 0, "data_size", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD hsaWristTemperatureDataFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "processing_interval", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "value", "degC", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD memoGlobFields[] =
{
{ 0, 0, "part_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 250, 134, false, Profile::Type::Uint32 },
{ 0, 0, "memo", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 13, false, Profile::Type::Byte },
{ 0, 0, "mesg_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::MesgNum },
{ 0, 0, "parent_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "field_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "data", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 10, false, Profile::Type::Uint8z },
};

static const Profile::FIELD sleepLevelFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "sleep_level", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 0, false, Profile::Type::SleepLevel },
};

static const Profile::FIELD antChannelIdFields[] =
{
{ 0, 0, "channel_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
{ 0, 0, "device_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 10, false, Profile::Type::Uint8z },
{ 0, 0, "device_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 139, false, Profile::Type::Uint16z },
{ 0, 0, "transmission_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 10, false, Profile::Type::Uint8z },
{ 0, 0, "device_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 2, false, Profile::Type::DeviceIndex },
};

static const Profile::FIELD_COMPONENT antRxMesgDataComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 8, FIT_FALSE }, // channel_number
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
};

static const Profile::FIELD antRxFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "fractional_timestamp", "s", (FIT_FLOAT64)32768, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "mesg_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 13, false, Profile::Type::Byte },
{ antRxMesgDataComponents, 0, "mesg_data", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 9, 0, 2, 13, false, Profile::Type::Byte },
{ 0, 0, "channel_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "data", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 13, false, Profile::Type::Byte },
};

static const Profile::FIELD_COMPONENT antTxMesgDataComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 8, FIT_FALSE }, // channel_number
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 8, FIT_FALSE }, // data
};

static const Profile::FIELD antTxFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "fractional_timestamp", "s", (FIT_FLOAT64)32768, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "mesg_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 13, false, Profile::Type::Byte },
{ antTxMesgDataComponents, 0, "mesg_data", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 9, 0, 2, 13, false, Profile::Type::Byte },
{ 0, 0, "channel_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "data", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 13, false, Profile::Type::Byte },
};

static const Profile::FIELD exdScreenConfigurationFields[] =
{
{ 0, 0, "screen_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
{ 0, 0, "field_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "layout", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 0, false, Profile::Type::ExdLayout },
{ 0, 0, "screen_enabled", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 0, false, Profile::Type::Bool },
};

static const Profile::FIELD_COMPONENT exdDataFieldConfigurationConceptFieldComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 4, FIT_FALSE }, // field_id
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 4, FIT_FALSE }, // concept_count
};

static const Profile::FIELD exdDataFieldConfigurationFields[] =
{
{ 0, 0, "screen_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
{ exdDataFieldConfigurationConceptFieldComponents, 0, "concept_field", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 0, 1, 13, false, Profile::Type::Byte },
{ 0, 0, "field_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::Uint8 },
{ 0, 0, "concept_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "display_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::ExdDisplayType },
{ 0, 0, "title", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 7, false, Profile::Type::String },
};

static const Profile::FIELD_COMPONENT exdDataConceptConfigurationConceptFieldComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 4, FIT_FALSE }, // field_id
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 4, FIT_FALSE }, // concept_index
};

static const Profile::FIELD exdDataConceptConfigurationFields[] =
{
{ 0, 0, "screen_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
{ exdDataConceptConfigurationConceptFieldComponents, 0, "concept_field", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 0, 1, 13, false, Profile::Type::Byte },
{ 0, 0, "field_id", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::Uint8 },
{ 0, 0, "concept_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "data_page", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 2, false, Profile::Type::Uint8 },
{ 0, 0, "concept_key", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 2, false, Profile::Type::Uint8 },
{ 0, 0, "scaling", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 2, false, Profile::Type::Uint8 },
{ 0, 0, "data_units", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 0, false, Profile::Type::ExdDataUnits },
{ 0, 0, "qualifier", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 0, false, Profile::Type::ExdQualifiers },
{ 0, 0, "descriptor", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 0, false, Profile::Type::ExdDescriptors },
{ 0, 0, "is_signed", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 0, false, Profile::Type::Bool },
};

static const Profile::FIELD diveSummaryFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "reference_mesg", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::MesgNum },
{ 0, 0, "reference_index", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::MessageIndex },
{ 0, 0, "avg_depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
{ 0, 0, "max_depth", "m", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::Uint32 },
{ 0, 0, "surface_interval", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 134, false, Profile::Type::Uint32 },
{ 0, 0, "start_cns", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 2, false, Profile::Type::Uint8 },
{ 0, 0, "end_cns", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 2, false, Profile::Type::Uint8 },
{ 0, 0, "start_n2", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 132, false, Profile::Type::Uint16 },
{ 0, 0, "end_n2", "percent", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 132, false, Profile::Type::Uint16 },
{ 0, 0, "o2_toxicity", "OTUs", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 132, false, Profile::Type::Uint16 },
{ 0, 0, "dive_number", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 134, false, Profile::Type::Uint32 },
{ 0, 0, "bottom_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 11, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_pressure_sac", "bar/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 12, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_volume_sac", "L/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 13, 132, false, Profile::Type::Uint16 },
{ 0, 0, "avg_rmv", "L/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 14, 132, false, Profile::Type::Uint16 },
{ 0, 0, "descent_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 15, 134, false, Profile::Type::Uint32 },
{ 0, 0, "ascent_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 16, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_ascent_rate", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 17, 133, false, Profile::Type::Sint32 },
{ 0, 0, "avg_descent_rate", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 22, 134, false, Profile::Type::Uint32 },
{ 0, 0, "max_ascent_rate", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 23, 134, false, Profile::Type::Uint32 },
{ 0, 0, "max_descent_rate", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 24, 134, false, Profile::Type::Uint32 },
{ 0, 0, "hang_time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 25, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD aadAccelFeaturesFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "time", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "energy_total", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::Uint32 },
{ 0, 0, "zero_cross_cnt", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "instance", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "time_above_threshold", "s", (FIT_FLOAT64)25, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD hrvFields[] =
{
{ 0, 0, "time", "s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD beatIntervalsFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "time", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD hrvStatusSummaryFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "weekly_average", "ms", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ 0, 0, "last_night_average", "ms", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "last_night_5_min_high", "ms", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "baseline_low_upper", "ms", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "baseline_balanced_lower", "ms", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 4, 132, false, Profile::Type::Uint16 },
{ 0, 0, "baseline_balanced_upper", "ms", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 5, 132, false, Profile::Type::Uint16 },
{ 0, 0, "status", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 0, false, Profile::Type::HrvStatus },
};

static const Profile::FIELD hrvValueFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "value", "ms", (FIT_FLOAT64)128, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD_COMPONENT rawBbiDataComponents[] =
{
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 2, 14, FIT_FALSE }, // time
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 3, 1, FIT_FALSE }, // quality
   { (FIT_FLOAT64)1, (FIT_FLOAT64)0, 4, 1, FIT_FALSE }, // gap
};

static const Profile::FIELD rawBbiFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "timestamp_ms", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 132, false, Profile::Type::Uint16 },
{ rawBbiDataComponents, 0, "data", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 45, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "time", "ms", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "quality", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "gap", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 2, false, Profile::Type::Uint8 },
};

static const Profile::FIELD respirationRateFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "respiration_rate", "breaths/min", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 0, 131, false, Profile::Type::Sint16 },
};

static const Profile::FIELD chronoShotSessionFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "min_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 0, 134, false, Profile::Type::Uint32 },
{ 0, 0, "max_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 1, 134, false, Profile::Type::Uint32 },
{ 0, 0, "avg_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 2, 134, false, Profile::Type::Uint32 },
{ 0, 0, "shot_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 132, false, Profile::Type::Uint16 },
{ 0, 0, "projectile_type", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 0, false, Profile::Type::ProjectileType },
{ 0, 0, "grain_weight", "gr", (FIT_FLOAT64)10, (FIT_FLOAT64)0, 0, 0, 5, 134, false, Profile::Type::Uint32 },
{ 0, 0, "standard_deviation", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 6, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD chronoShotDataFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "shot_speed", "m/s", (FIT_FLOAT64)1000, (FIT_FLOAT64)0, 0, 0, 0, 134, false, Profile::Type::Uint32 },
{ 0, 0, "shot_num", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD tankUpdateFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "sensor", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 140, false, Profile::Type::AntChannelId },
{ 0, 0, "pressure", "bar", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD tankSummaryFields[] =
{
{ 0, 0, "timestamp", "s", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "sensor", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 140, false, Profile::Type::AntChannelId },
{ 0, 0, "start_pressure", "bar", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 1, 132, false, Profile::Type::Uint16 },
{ 0, 0, "end_pressure", "bar", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 2, 132, false, Profile::Type::Uint16 },
{ 0, 0, "volume_used", "L", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 3, 134, false, Profile::Type::Uint32 },
};

static const Profile::FIELD sleepAssessmentFields[] =
{
{ 0, 0, "combined_awake_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 2, false, Profile::Type::Uint8 },
{ 0, 0, "awake_time_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 2, false, Profile::Type::Uint8 },
{ 0, 0, "awakenings_count_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 2, false, Profile::Type::Uint8 },
{ 0, 0, "deep_sleep_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 3, 2, false, Profile::Type::Uint8 },
{ 0, 0, "sleep_duration_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 2, false, Profile::Type::Uint8 },
{ 0, 0, "light_sleep_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 5, 2, false, Profile::Type::Uint8 },
{ 0, 0, "overall_sleep_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 6, 2, false, Profile::Type::Uint8 },
{ 0, 0, "sleep_quality_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 7, 2, false, Profile::Type::Uint8 },
{ 0, 0, "sleep_recovery_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 8, 2, false, Profile::Type::Uint8 },
{ 0, 0, "rem_sleep_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 9, 2, false, Profile::Type::Uint8 },
{ 0, 0, "sleep_restlessness_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 10, 2, false, Profile::Type::Uint8 },
{ 0, 0, "awakenings_count", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 11, 2, false, Profile::Type::Uint8 },
{ 0, 0, "interruptions_score", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 14, 2, false, Profile::Type::Uint8 },
{ 0, 0, "average_stress_during_sleep", "", (FIT_FLOAT64)100, (FIT_FLOAT64)0, 0, 0, 15, 132, false, Profile::Type::Uint16 },
};

static const Profile::FIELD skinTempOvernightFields[] =
{
{ 0, 0, "timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 253, 134, false, Profile::Type::DateTime },
{ 0, 0, "local_timestamp", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 0, 134, false, Profile::Type::LocalDateTime },
{ 0, 0, "average_deviation", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 1, 136, false, Profile::Type::Float32 },
{ 0, 0, "average_7_day_deviation", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 2, 136, false, Profile::Type::Float32 },
{ 0, 0, "nightly_value", "", (FIT_FLOAT64)1, (FIT_FLOAT64)0, 0, 0, 4, 136, false, Profile::Type::Float32 },
};

const Profile::MESG Profile::mesgs[MESGS] =
{
   { fileIdFields, "file_id", FIT_MESG_NUM_FILE_ID, 7 },
   { fileCreatorFields, "file_creator", FIT_MESG_NUM_FILE_CREATOR, 2 },
   { timestampCorrelationFields, "timestamp_correlation", FIT_MESG_NUM_TIMESTAMP_CORRELATION, 7 },
   { softwareFields, "software", FIT_MESG_NUM_SOFTWARE, 3 },
   { slaveDeviceFields, "slave_device", FIT_MESG_NUM_SLAVE_DEVICE, 2 },
   { capabilitiesFields, "capabilities", FIT_MESG_NUM_CAPABILITIES, 4 },
   { fileCapabilitiesFields, "file_capabilities", FIT_MESG_NUM_FILE_CAPABILITIES, 6 },
   { mesgCapabilitiesFields, "mesg_capabilities", FIT_MESG_NUM_MESG_CAPABILITIES, 5 },
   { fieldCapabilitiesFields, "field_capabilities", FIT_MESG_NUM_FIELD_CAPABILITIES, 5 },
   { deviceSettingsFields, "device_settings", FIT_MESG_NUM_DEVICE_SETTINGS, 24 },
   { userProfileFields, "user_profile", FIT_MESG_NUM_USER_PROFILE, 29 },
   { hrmProfileFields, "hrm_profile", FIT_MESG_NUM_HRM_PROFILE, 5 },
   { sdmProfileFields, "sdm_profile", FIT_MESG_NUM_SDM_PROFILE, 8 },
   { bikeProfileFields, "bike_profile", FIT_MESG_NUM_BIKE_PROFILE, 32 },
   { connectivityFields, "connectivity", FIT_MESG_NUM_CONNECTIVITY, 13 },
   { watchfaceSettingsFields, "watchface_settings", FIT_MESG_NUM_WATCHFACE_SETTINGS, 3 },
   { ohrSettingsFields, "ohr_settings", FIT_MESG_NUM_OHR_SETTINGS, 2 },
   { timeInZoneFields, "time_in_zone", FIT_MESG_NUM_TIME_IN_ZONE, 17 },
   { zonesTargetFields, "zones_target", FIT_MESG_NUM_ZONES_TARGET, 5 },
   { sportFields, "sport", FIT_MESG_NUM_SPORT, 3 },
   { hrZoneFields, "hr_zone", FIT_MESG_NUM_HR_ZONE, 3 },
   { speedZoneFields, "speed_zone", FIT_MESG_NUM_SPEED_ZONE, 3 },
   { cadenceZoneFields, "cadence_zone", FIT_MESG_NUM_CADENCE_ZONE, 3 },
   { powerZoneFields, "power_zone", FIT_MESG_NUM_POWER_ZONE, 3 },
   { metZoneFields, "met_zone", FIT_MESG_NUM_MET_ZONE, 4 },
   { diveSettingsFields, "dive_settings", FIT_MESG_NUM_DIVE_SETTINGS, 35 },
   { diveAlarmFields, "dive_alarm", FIT_MESG_NUM_DIVE_ALARM, 13 },
   { diveApneaAlarmFields, "dive_apnea_alarm", FIT_MESG_NUM_DIVE_APNEA_ALARM, 13 },
   { diveGasFields, "dive_gas", FIT_MESG_NUM_DIVE_GAS, 5 },
   { goalFields, "goal", FIT_MESG_NUM_GOAL, 13 },
   { activityFields, "activity", FIT_MESG_NUM_ACTIVITY, 8 },
   { sessionFields, "session", FIT_MESG_NUM_SESSION, 156 },
   { lapFields, "lap", FIT_MESG_NUM_LAP, 123 },
   { lengthFields, "length", FIT_MESG_NUM_LENGTH, 22 },
   { recordFields, "record", FIT_MESG_NUM_RECORD, 84 },
   { eventFields, "event", FIT_MESG_NUM_EVENT, 19 },
   { deviceInfoFields, "device_info", FIT_MESG_NUM_DEVICE_INFO, 19 },
   { deviceAuxBatteryInfoFields, "device_aux_battery_info", FIT_MESG_NUM_DEVICE_AUX_BATTERY_INFO, 5 },
   { trainingFileFields, "training_file", FIT_MESG_NUM_TRAINING_FILE, 6 },
   { weatherConditionsFields, "weather_conditions", FIT_MESG_NUM_WEATHER_CONDITIONS, 16 },
   { weatherAlertFields, "weather_alert", FIT_MESG_NUM_WEATHER_ALERT, 6 },
   { gpsMetadataFields, "gps_metadata", FIT_MESG_NUM_GPS_METADATA, 9 },
   { cameraEventFields, "camera_event", FIT_MESG_NUM_CAMERA_EVENT, 5 },
   { gyroscopeDataFields, "gyroscope_data", FIT_MESG_NUM_GYROSCOPE_DATA, 9 },
   { accelerometerDataFields, "accelerometer_data", FIT_MESG_NUM_ACCELEROMETER_DATA, 12 },
   { magnetometerDataFields, "magnetometer_data", FIT_MESG_NUM_MAGNETOMETER_DATA, 9 },
   { barometerDataFields, "barometer_data", FIT_MESG_NUM_BAROMETER_DATA, 4 },
   { threeDSensorCalibrationFields, "three_d_sensor_calibration", FIT_MESG_NUM_THREE_D_SENSOR_CALIBRATION, 7 },
   { oneDSensorCalibrationFields, "one_d_sensor_calibration", FIT_MESG_NUM_ONE_D_SENSOR_CALIBRATION, 6 },
   { videoFrameFields, "video_frame", FIT_MESG_NUM_VIDEO_FRAME, 3 },
   { obdiiDataFields, "obdii_data", FIT_MESG_NUM_OBDII_DATA, 9 },
   { nmeaSentenceFields, "nmea_sentence", FIT_MESG_NUM_NMEA_SENTENCE, 3 },
   { aviationAttitudeFields, "aviation_attitude", FIT_MESG_NUM_AVIATION_ATTITUDE, 12 },
   { videoFields, "video", FIT_MESG_NUM_VIDEO, 3 },
   { videoTitleFields, "video_title", FIT_MESG_NUM_VIDEO_TITLE, 3 },
   { videoDescriptionFields, "video_description", FIT_MESG_NUM_VIDEO_DESCRIPTION, 3 },
   { videoClipFields, "video_clip", FIT_MESG_NUM_VIDEO_CLIP, 7 },
   { setFields, "set", FIT_MESG_NUM_SET, 11 },
   { jumpFields, "jump", FIT_MESG_NUM_JUMP, 10 },
   { splitFields, "split", FIT_MESG_NUM_SPLIT, 19 },
   { splitSummaryFields, "split_summary", FIT_MESG_NUM_SPLIT_SUMMARY, 14 },
   { climbProFields, "climb_pro", FIT_MESG_NUM_CLIMB_PRO, 7 },
   { fieldDescriptionFields, "field_description", FIT_MESG_NUM_FIELD_DESCRIPTION, 14 },
   { developerDataIdFields, "developer_data_id", FIT_MESG_NUM_DEVELOPER_DATA_ID, 5 },
   { courseFields, "course", FIT_MESG_NUM_COURSE, 4 },
   { coursePointFields, "course_point", FIT_MESG_NUM_COURSE_POINT, 8 },
   { segmentIdFields, "segment_id", FIT_MESG_NUM_SEGMENT_ID, 9 },
   { segmentLeaderboardEntryFields, "segment_leaderboard_entry", FIT_MESG_NUM_SEGMENT_LEADERBOARD_ENTRY, 7 },
   { segmentPointFields, "segment_point", FIT_MESG_NUM_SEGMENT_POINT, 7 },
   { segmentLapFields, "segment_lap", FIT_MESG_NUM_SEGMENT_LAP, 95 },
   { segmentFileFields, "segment_file", FIT_MESG_NUM_SEGMENT_FILE, 9 },
   { workoutFields, "workout", FIT_MESG_NUM_WORKOUT, 9 },
   { workoutSessionFields, "workout_session", FIT_MESG_NUM_WORKOUT_SESSION, 7 },
   { workoutStepFields, "workout_step", FIT_MESG_NUM_WORKOUT_STEP, 19 },
   { exerciseTitleFields, "exercise_title", FIT_MESG_NUM_EXERCISE_TITLE, 4 },
   { scheduleFields, "schedule", FIT_MESG_NUM_SCHEDULE, 7 },
   { totalsFields, "totals", FIT_MESG_NUM_TOTALS, 10 },
   { weightScaleFields, "weight_scale", FIT_MESG_NUM_WEIGHT_SCALE, 14 },
   { bloodPressureFields, "blood_pressure", FIT_MESG_NUM_BLOOD_PRESSURE, 11 },
   { monitoringInfoFields, "monitoring_info", FIT_MESG_NUM_MONITORING_INFO, 6 },
   { monitoringFields, "monitoring", FIT_MESG_NUM_MONITORING, 29 },
   { monitoringHrDataFields, "monitoring_hr_data", FIT_MESG_NUM_MONITORING_HR_DATA, 3 },
   { spo2DataFields, "spo2_data", FIT_MESG_NUM_SPO2_DATA, 4 },
   { hrFields, "hr", FIT_MESG_NUM_HR, 6 },
   { stressLevelFields, "stress_level", FIT_MESG_NUM_STRESS_LEVEL, 2 },
   { maxMetDataFields, "max_met_data", FIT_MESG_NUM_MAX_MET_DATA, 8 },
   { hsaBodyBatteryDataFields, "hsa_body_battery_data", FIT_MESG_NUM_HSA_BODY_BATTERY_DATA, 5 },
   { hsaEventFields, "hsa_event", FIT_MESG_NUM_HSA_EVENT, 2 },
   { hsaAccelerometerDataFields, "hsa_accelerometer_data", FIT_MESG_NUM_HSA_ACCELEROMETER_DATA, 7 },
   { hsaGyroscopeDataFields, "hsa_gyroscope_data", FIT_MESG_NUM_HSA_GYROSCOPE_DATA, 7 },
   { hsaStepDataFields, "hsa_step_data", FIT_MESG_NUM_HSA_STEP_DATA, 3 },
   { hsaSpo2DataFields, "hsa_spo2_data", FIT_MESG_NUM_HSA_SPO2_DATA, 4 },
   { hsaStressDataFields, "hsa_stress_data", FIT_MESG_NUM_HSA_STRESS_DATA, 3 },
   { hsaRespirationDataFields, "hsa_respiration_data", FIT_MESG_NUM_HSA_RESPIRATION_DATA, 3 },
   { hsaHeartRateDataFields, "hsa_heart_rate_data", FIT_MESG_NUM_HSA_HEART_RATE_DATA, 4 },
   { hsaConfigurationDataFields, "hsa_configuration_data", FIT_MESG_NUM_HSA_CONFIGURATION_DATA, 3 },
   { hsaWristTemperatureDataFields, "hsa_wrist_temperature_data", FIT_MESG_NUM_HSA_WRIST_TEMPERATURE_DATA, 3 },
   { memoGlobFields, "memo_glob", FIT_MESG_NUM_MEMO_GLOB, 6 },
   { sleepLevelFields, "sleep_level", FIT_MESG_NUM_SLEEP_LEVEL, 2 },
   { antChannelIdFields, "ant_channel_id", FIT_MESG_NUM_ANT_CHANNEL_ID, 5 },
   { antRxFields, "ant_rx", FIT_MESG_NUM_ANT_RX, 6 },
   { antTxFields, "ant_tx", FIT_MESG_NUM_ANT_TX, 6 },
   { exdScreenConfigurationFields, "exd_screen_configuration", FIT_MESG_NUM_EXD_SCREEN_CONFIGURATION, 4 },
   { exdDataFieldConfigurationFields, "exd_data_field_configuration", FIT_MESG_NUM_EXD_DATA_FIELD_CONFIGURATION, 6 },
   { exdDataConceptConfigurationFields, "exd_data_concept_configuration", FIT_MESG_NUM_EXD_DATA_CONCEPT_CONFIGURATION, 11 },
   { diveSummaryFields, "dive_summary", FIT_MESG_NUM_DIVE_SUMMARY, 23 },
   { aadAccelFeaturesFields, "aad_accel_features", FIT_MESG_NUM_AAD_ACCEL_FEATURES, 6 },
   { hrvFields, "hrv", FIT_MESG_NUM_HRV, 1 },
   { beatIntervalsFields, "beat_intervals", FIT_MESG_NUM_BEAT_INTERVALS, 3 },
   { hrvStatusSummaryFields, "hrv_status_summary", FIT_MESG_NUM_HRV_STATUS_SUMMARY, 8 },
   { hrvValueFields, "hrv_value", FIT_MESG_NUM_HRV_VALUE, 2 },
   { rawBbiFields, "raw_bbi", FIT_MESG_NUM_RAW_BBI, 6 },
   { respirationRateFields, "respiration_rate", FIT_MESG_NUM_RESPIRATION_RATE, 2 },
   { chronoShotSessionFields, "chrono_shot_session", FIT_MESG_NUM_CHRONO_SHOT_SESSION, 8 },
   { chronoShotDataFields, "chrono_shot_data", FIT_MESG_NUM_CHRONO_SHOT_DATA, 3 },
   { tankUpdateFields, "tank_update", FIT_MESG_NUM_TANK_UPDATE, 3 },
   { tankSummaryFields, "tank_summary", FIT_MESG_NUM_TANK_SUMMARY, 5 },
   { sleepAssessmentFields, "sleep_assessment", FIT_MESG_NUM_SLEEP_ASSESSMENT, 14 },
   { skinTempOvernightFields, "skin_temp_overnight", FIT_MESG_NUM_SKIN_TEMP_OVERNIGHT, 5 },
   { NULL, "pad", FIT_MESG_NUM_PAD, 0 },
};

const Profile::MESG* Profile::GetMesg(const FIT_UINT16 num)
{
    for (int i = 0; i < MESGS; i++)
    {
        if (mesgs[i].num == num)
            return &mesgs[i];
    }

    return NULL;
}

const Profile::MESG* Profile::GetMesg(const std::string& name)
{
    for (int i = 0; i < MESGS; i++)
    {
        if (mesgs[i].name == name)
            return &mesgs[i];
    }

    return NULL;
}

const FIT_UINT16 Profile::GetFieldIndex(const FIT_UINT16 mesgNum, const FIT_UINT8 fieldNum)
{
    const MESG *mesg = GetMesg(mesgNum);

    if (mesg == NULL)
        return FIT_UINT16_INVALID;

    for (FIT_UINT16 i = 0; i < mesg->numFields; i++)
    {
        if (mesg->fields[i].num == fieldNum)
            return i;
    }

    return FIT_UINT16_INVALID;
}

const FIT_UINT16 Profile::GetFieldIndex(const std::string& mesgName, const std::string& fieldName)
{
    const MESG *mesg = GetMesg(mesgName);

    if (mesg == NULL)
        return FIT_UINT16_INVALID;

    for (FIT_UINT16 i = 0; i < mesg->numFields; i++)
    {
        if (mesg->fields[i].name == fieldName)
            return i;

        for (FIT_UINT16 j = 0; j < mesg->fields[i].numSubFields; j++)
        {
            if (mesg->fields[i].subFields[j].name == fieldName)
                return i;
        }
    }

    return FIT_UINT16_INVALID;
}

const Profile::FIELD* Profile::GetField(const FIT_UINT16 mesgNum, const FIT_UINT8 fieldNum)
{
    const MESG *mesg = GetMesg(mesgNum);

    if (mesg == NULL)
        return NULL;

    FIT_UINT16 fieldIndex = GetFieldIndex(mesgNum, fieldNum);

    if (fieldIndex >= mesg->numFields)
        return NULL;

    return &(mesg->fields[fieldIndex]);
}

const Profile::FIELD* Profile::GetField(const std::string& mesgName, const std::string& fieldName)
{
    const MESG *mesg = GetMesg(mesgName);

    if (mesg == NULL)
        return NULL;

    FIT_UINT16 fieldIndex = GetFieldIndex(mesgName, fieldName);

    if (fieldIndex >= mesg->numFields)
        return NULL;

    return &(mesg->fields[fieldIndex]);
}

const FIT_UINT16 Profile::GetSubFieldIndex(const std::string& mesgName, const std::string& fieldName, const std::string& subFieldName)
{
    const FIELD *field = GetField(mesgName, fieldName);

    if (field == NULL)
        return FIT_SUBFIELD_INDEX_MAIN_FIELD;

    for (FIT_UINT16 i = 0; i < field->numSubFields; i++)
    {
        if (field->subFields[i].name == subFieldName)
            return i;
    }

    return FIT_SUBFIELD_INDEX_MAIN_FIELD;
}

const Profile::SUBFIELD* Profile::GetSubField(const FIT_UINT16 mesgNum, const FIT_UINT8 fieldNum, const FIT_UINT16 subFieldIndex)
{
    const MESG *mesg = GetMesg(mesgNum);

    if (mesg == NULL)
        return NULL;

    FIT_UINT16 fieldIndex = GetFieldIndex(mesgNum, fieldNum);

    if (fieldIndex >= mesg->numFields)
        return NULL;

    if (subFieldIndex >= mesg->fields[fieldIndex].numSubFields)
        return NULL;

    return &(mesg->fields[fieldIndex].subFields[subFieldIndex]);
}

const Profile::SUBFIELD* Profile::GetSubField(const std::string& mesgName, const std::string& fieldName, const std::string& subFieldName)
{
    const MESG *mesg = GetMesg(mesgName);

    if (mesg == NULL)
        return NULL;

    FIT_UINT16 fieldIndex = GetFieldIndex(mesgName, fieldName);

    if (fieldIndex >= mesg->numFields)
        return NULL;

    FIT_UINT16 subFieldIndex = GetSubFieldIndex(mesgName, fieldName, subFieldName);

    if (subFieldIndex >= mesg->fields[fieldIndex].numSubFields)
        return NULL;

    return &(mesg->fields[fieldIndex].subFields[subFieldIndex]);
}

} // namespace fit

