diff --git a/apps/api/src/database/seed.ts b/apps/api/src/database/seed.ts index 09b7342..1f8266d 100644 --- a/apps/api/src/database/seed.ts +++ b/apps/api/src/database/seed.ts @@ -1,5 +1,5 @@ import { - DEFAULT_STANDARDS_CONFIG, + FALLBACK_STANDARDS_CONFIG, StandardsDataSchema, StandardsParamsSchema, } from "@blade-and-brawn/calculator"; @@ -19,9 +19,9 @@ async function seedStandardsDataset(): Promise { return existing.id; } - Value.Assert(StandardsDataSchema, DEFAULT_STANDARDS_CONFIG.data); + Value.Assert(StandardsDataSchema, FALLBACK_STANDARDS_CONFIG.data); const result = await db.insertInto("standards_datasets") - .values({ name: DEFAULT_NAME, data: DEFAULT_STANDARDS_CONFIG.data }) + .values({ name: DEFAULT_NAME, data: FALLBACK_STANDARDS_CONFIG.data }) .returning("id") .executeTakeFirstOrThrow(); log.info({ id: result.id }, "seeded default standards dataset"); @@ -43,12 +43,12 @@ async function seedStandardsConfig(datasetId: string): Promise { .where("is_selected", "=", true) .executeTakeFirst(); - Value.Assert(StandardsParamsSchema, DEFAULT_STANDARDS_CONFIG.params); + Value.Assert(StandardsParamsSchema, FALLBACK_STANDARDS_CONFIG.params); const result = await db.insertInto("standards_configs") .values({ name: DEFAULT_NAME, dataset_id: datasetId, - params: DEFAULT_STANDARDS_CONFIG.params, + params: FALLBACK_STANDARDS_CONFIG.params, is_selected: !hasSelected, }) .returning("id") diff --git a/apps/api/src/scripts/analyze.ts b/apps/api/src/scripts/analyze.ts index 771f591..d7386b6 100644 --- a/apps/api/src/scripts/analyze.ts +++ b/apps/api/src/scripts/analyze.ts @@ -1,6 +1,6 @@ import { type Levels, - DEFAULT_STANDARDS_CONFIG, + FALLBACK_STANDARDS_CONFIG, } from "@blade-and-brawn/calculator"; import { Activity, clamp, Gender, range } from "@blade-and-brawn/domain"; import { levenbergMarquardt as LM } from "ml-levenberg-marquardt"; @@ -15,7 +15,7 @@ for (const activity of Object.values(Activity)) { } for (const gender of Object.values(Gender)) { - const standardsByGender = DEFAULT_STANDARDS_CONFIG.data[ + const standardsByGender = FALLBACK_STANDARDS_CONFIG.data[ activity ].standards.filter((s) => s["metrics"].gender === gender); const ages = [...new Set(standardsByGender.map((s) => s.metrics.age))]; diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts index f5d98ec..f554e00 100644 --- a/apps/api/src/server.ts +++ b/apps/api/src/server.ts @@ -104,7 +104,7 @@ export const app = new Elysia() (app) => app // Non-authenticated .post("/calculate", async ({ body }) => { - return { levels: s.Calculator.calculate(body.player, body.activityPerformances) }; + return { levels: await s.Calculator.calculate(body.player, body.activityPerformances) }; }, { body: t.Object({ player: PlayerSchema, diff --git a/apps/api/src/services/calculator.ts b/apps/api/src/services/calculator.ts index 72ff756..bfba18e 100644 --- a/apps/api/src/services/calculator.ts +++ b/apps/api/src/services/calculator.ts @@ -1,14 +1,25 @@ -import { LevelCalculator, Standards, DEFAULT_STANDARDS_CONFIG, type StandardsParams, StandardsParamsSchema, StandardsDataSchema, type StandardsConfig } from "@blade-and-brawn/calculator"; +import { LevelCalculator, Standards, FALLBACK_STANDARDS_CONFIG, type StandardsParams, StandardsParamsSchema, StandardsDataSchema, type StandardsConfig } from "@blade-and-brawn/calculator"; import type { ActivityPerformance, Player } from "@blade-and-brawn/domain"; import { db } from "../database/db"; import { Value } from "@sinclair/typebox/value"; import { log } from "../util"; export class CalculatorService { - private Calculator = new LevelCalculator(new Standards(DEFAULT_STANDARDS_CONFIG)); + private Calculator = new LevelCalculator(new Standards(FALLBACK_STANDARDS_CONFIG)); Standards: StandardsService = new StandardsService(this.Calculator); + private ready: Promise; - calculate(player: Player, activityPerformances: ActivityPerformance[]) { + constructor() { + // Load the selected config on startup instead of waiting for the + // first `calculate()` call. If it fails (e.g. no config selected + // yet, DB unreachable at boot), fall back to DEFAULT_STANDARDS_CONFIG + // and keep serving — it'll retry on the next refresh. + this.ready = this.Standards.Config.refresh() + .catch((err) => log.error({ err }, "failed to load initial standards config, falling back to defaults")); + } + + async calculate(player: Player, activityPerformances: ActivityPerformance[]) { + await this.ready; this.Standards.Config.refresh({ onlyIfStale: true }).catch((err) => log.error({ err }, "failed to refresh standards config")); return this.Calculator.calculate(player, activityPerformances); } @@ -92,7 +103,7 @@ class StandardsConfigService { .set({ is_selected: true }) .where("id", "=", id) .execute(); - if (result[0]?.numUpdatedRows === 0n) throw new Error(`No config with id "${id}"`); + if (result[0]?.numUpdatedRows === 0n) throw new Error(`No standards config with id "${id}"`); }); } } diff --git a/apps/portal/src/lib/components/StandardsTable.svelte b/apps/portal/src/lib/components/StandardsTable.svelte index 18e9c3f..f0fd821 100644 --- a/apps/portal/src/lib/components/StandardsTable.svelte +++ b/apps/portal/src/lib/components/StandardsTable.svelte @@ -2,7 +2,7 @@ import { Standards, type Standard, - type StandardsParams, + type StandardsConfig, } from "@blade-and-brawn/calculator"; import { Activity, @@ -17,7 +17,7 @@ selected: { activity: Activity; metrics: Metrics; - params: StandardsParams; + standardsConfig: StandardsConfig; }; } @@ -52,7 +52,7 @@

- {#if selected.params.activity[selected.activity].enableGeneration && allStandards + {#if selected.standardsConfig.params.activity[selected.activity].enableGeneration && allStandards .byActivity(selected.activity) .getMetadata().generators.length} (Generated data: {allStandards @@ -87,7 +87,7 @@ ? parseFloat(kgToLb(standard.metrics.weight).toFixed(2)) : "None"} - {#each range(selected.params.global.maxLevel).map((i) => ++i) as lvl} + {#each range(selected.standardsConfig.params.global.maxLevel).map((i) => ++i) as lvl} {getLvlValue(activity, standard, lvl)} {/each} @@ -99,7 +99,7 @@ Body weight - {#each range(selected.params.global.maxLevel).map((i) => ++i) as lvl} + {#each range(selected.standardsConfig.params.global.maxLevel).map((i) => ++i) as lvl} {lvl} {/each} diff --git a/apps/portal/src/routes/(app)/calculator/+page.svelte b/apps/portal/src/routes/(app)/calculator/+page.svelte index 960ff3f..2771ea0 100644 --- a/apps/portal/src/routes/(app)/calculator/+page.svelte +++ b/apps/portal/src/routes/(app)/calculator/+page.svelte @@ -1,8 +1,8 @@ -

-
- Data +{#if !(input.standardsConfig && allStandards)} +
+ {#if standardsConfigLoadError} + + {:else} + + {/if} +
+{:else} + {@const standardsConfig = input.standardsConfig} +
+
+ + Data + -
-
- - General +
+
+ + General + + +
+ + +
+
+ +
+ + Data Generation + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + Stretch + + + +
+
+
+
+
+ + {#if activeTab === "standards"} +
+ + Metrics - -
+
+ + +
+ {/if} +
-
- - Data Generation - +
-
- - - - - - - - - - - - - - - - - - - - - +
+ -
- - Stretch - - - -
-
-
-
- + +
{#if activeTab === "standards"} -
- - Metrics - -
- - - - - -
-
+ {/if} - -
- -
- - - -
- -{#if activeTab === "standards"} - -{/if} - -{#if activeTab === "players"} - + {#if activeTab === "players"} + + {/if} {/if} diff --git a/packages/calculator/src/data/standards/default-data.json b/misc/backup/standards/data.json similarity index 100% rename from packages/calculator/src/data/standards/default-data.json rename to misc/backup/standards/data.json diff --git a/packages/calculator/src/data/standards/default-params.json b/misc/backup/standards/params.json similarity index 100% rename from packages/calculator/src/data/standards/default-params.json rename to misc/backup/standards/params.json diff --git a/packages/calculator/src/data/standards/fallback-data.json b/packages/calculator/src/data/standards/fallback-data.json new file mode 100644 index 0000000..4383735 --- /dev/null +++ b/packages/calculator/src/data/standards/fallback-data.json @@ -0,0 +1,5316 @@ +{ + "BackSquat": { + "metadata": { + "attribute": "Strength", + "generators": [], + "unit": "kg", + "name": "Squat" + }, + "standards": [ + { + "metrics": { + "age": 17, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 34, + "2": 59, + "3": 78, + "4": 107, + "5": 136 + } + }, + { + "metrics": { + "age": 17, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 38, + "2": 65, + "3": 87, + "4": 120, + "5": 158 + } + }, + { + "metrics": { + "age": 17, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 46, + "2": 80, + "3": 106, + "4": 146, + "5": 192 + } + }, + { + "metrics": { + "age": 17, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 49, + "2": 85, + "3": 113, + "4": 155, + "5": 205 + } + }, + { + "metrics": { + "age": 17, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 52, + "2": 89, + "3": 118, + "4": 162, + "5": 209 + } + }, + { + "metrics": { + "age": 17, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 53, + "2": 90, + "3": 120, + "4": 165, + "5": 213 + } + }, + { + "metrics": { + "age": 17, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 56, + "2": 97, + "3": 129, + "4": 177, + "5": 219 + } + }, + { + "metrics": { + "age": 25, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 38, + "2": 65, + "3": 87, + "4": 120, + "5": 153 + } + }, + { + "metrics": { + "age": 25, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 46, + "2": 78, + "3": 104, + "4": 143, + "5": 189 + } + }, + { + "metrics": { + "age": 25, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 51, + "2": 87, + "3": 116, + "4": 160, + "5": 210 + } + }, + { + "metrics": { + "age": 25, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 58, + "2": 98, + "3": 130, + "4": 179, + "5": 236 + } + }, + { + "metrics": { + "age": 25, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 57, + "2": 98, + "3": 131, + "4": 180, + "5": 232 + } + }, + { + "metrics": { + "age": 25, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 70, + "2": 120, + "3": 160, + "4": 220, + "5": 285 + } + }, + { + "metrics": { + "age": 25, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 68, + "2": 116, + "3": 164, + "4": 226, + "5": 282 + } + }, + { + "metrics": { + "age": 35, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 40, + "2": 68, + "3": 91, + "4": 125, + "5": 159 + } + }, + { + "metrics": { + "age": 35, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 48, + "2": 82, + "3": 110, + "4": 151, + "5": 199 + } + }, + { + "metrics": { + "age": 35, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 53, + "2": 91, + "3": 122, + "4": 167, + "5": 220 + } + }, + { + "metrics": { + "age": 35, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 58, + "2": 99, + "3": 132, + "4": 181, + "5": 238 + } + }, + { + "metrics": { + "age": 35, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 62, + "2": 106, + "3": 142, + "4": 195, + "5": 252 + } + }, + { + "metrics": { + "age": 35, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 66, + "2": 113, + "3": 150, + "4": 206, + "5": 267 + } + }, + { + "metrics": { + "age": 35, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 74, + "2": 127, + "3": 169, + "4": 232, + "5": 291 + } + }, + { + "metrics": { + "age": 45, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 38, + "2": 65, + "3": 86, + "4": 118, + "5": 142 + } + }, + { + "metrics": { + "age": 45, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 43, + "2": 73, + "3": 98, + "4": 134, + "5": 161 + } + }, + { + "metrics": { + "age": 45, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 46, + "2": 79, + "3": 105, + "4": 144, + "5": 173 + } + }, + { + "metrics": { + "age": 45, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 54, + "2": 92, + "3": 123, + "4": 169, + "5": 203 + } + }, + { + "metrics": { + "age": 45, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 56, + "2": 97, + "3": 129, + "4": 177, + "5": 213 + } + }, + { + "metrics": { + "age": 45, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 61, + "2": 104, + "3": 139, + "4": 191, + "5": 229 + } + }, + { + "metrics": { + "age": 45, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 66, + "2": 113, + "3": 150, + "4": 206, + "5": 248 + } + }, + { + "metrics": { + "age": 55, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 32, + "2": 55, + "3": 73, + "4": 100, + "5": 132 + } + }, + { + "metrics": { + "age": 55, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 37, + "2": 64, + "3": 85, + "4": 117, + "5": 154 + } + }, + { + "metrics": { + "age": 55, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 42, + "2": 71, + "3": 95, + "4": 131, + "5": 172 + } + }, + { + "metrics": { + "age": 55, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 46, + "2": 80, + "3": 106, + "4": 146, + "5": 192 + } + }, + { + "metrics": { + "age": 55, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 50, + "2": 86, + "3": 114, + "4": 157, + "5": 207 + } + }, + { + "metrics": { + "age": 55, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 53, + "2": 90, + "3": 120, + "4": 165, + "5": 218 + } + }, + { + "metrics": { + "age": 55, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 54, + "2": 93, + "3": 124, + "4": 171, + "5": 225 + } + }, + { + "metrics": { + "age": 65, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 23, + "2": 40, + "3": 53, + "4": 73, + "5": 96 + } + }, + { + "metrics": { + "age": 65, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 33, + "2": 57, + "3": 76, + "4": 105, + "5": 138 + } + }, + { + "metrics": { + "age": 65, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 40, + "2": 68, + "3": 91, + "4": 125, + "5": 165 + } + }, + { + "metrics": { + "age": 65, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 43, + "2": 74, + "3": 98, + "4": 135, + "5": 178 + } + }, + { + "metrics": { + "age": 65, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 47, + "2": 80, + "3": 107, + "4": 147, + "5": 194 + } + }, + { + "metrics": { + "age": 65, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 48, + "2": 83, + "3": 110, + "4": 151, + "5": 199 + } + }, + { + "metrics": { + "age": 65, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 50, + "2": 86, + "3": 115, + "4": 158, + "5": 208 + } + }, + { + "metrics": { + "age": 75, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 22, + "2": 38, + "3": 51, + "4": 70, + "5": 92 + } + }, + { + "metrics": { + "age": 75, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 30, + "2": 51, + "3": 68, + "4": 94, + "5": 123 + } + }, + { + "metrics": { + "age": 75, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 33, + "2": 56, + "3": 75, + "4": 103, + "5": 136 + } + }, + { + "metrics": { + "age": 75, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 34, + "2": 59, + "3": 78, + "4": 107, + "5": 141 + } + }, + { + "metrics": { + "age": 75, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 35, + "2": 59, + "3": 79, + "4": 109, + "5": 143 + } + }, + { + "metrics": { + "age": 75, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 35, + "2": 60, + "3": 80, + "4": 110, + "5": 145 + } + }, + { + "metrics": { + "age": 75, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 36, + "2": 62, + "3": 82, + "4": 113, + "5": 149 + } + }, + { + "metrics": { + "age": 85, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 18, + "2": 30, + "3": 40, + "4": 55, + "5": 73 + } + }, + { + "metrics": { + "age": 85, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 24, + "2": 40, + "3": 54, + "4": 74, + "5": 97 + } + }, + { + "metrics": { + "age": 85, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 26, + "2": 44, + "3": 59, + "4": 81, + "5": 107 + } + }, + { + "metrics": { + "age": 85, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 27, + "2": 46, + "3": 62, + "4": 85, + "5": 112 + } + }, + { + "metrics": { + "age": 85, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 28, + "2": 46, + "3": 62, + "4": 86, + "5": 113 + } + }, + { + "metrics": { + "age": 85, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 28, + "2": 47, + "3": 63, + "4": 87, + "5": 115 + } + }, + { + "metrics": { + "age": 85, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 28, + "2": 49, + "3": 65, + "4": 89, + "5": 117 + } + }, + { + "metrics": { + "age": 17, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 23, + "2": 32, + "3": 44, + "4": 61, + "5": 84 + } + }, + { + "metrics": { + "age": 17, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 29, + "2": 41, + "3": 56, + "4": 77, + "5": 106 + } + }, + { + "metrics": { + "age": 17, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 32, + "2": 44, + "3": 61, + "4": 84, + "5": 116 + } + }, + { + "metrics": { + "age": 17, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 35, + "2": 48, + "3": 66, + "4": 91, + "5": 126 + } + }, + { + "metrics": { + "age": 17, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 35, + "2": 48, + "3": 66, + "4": 91, + "5": 125 + } + }, + { + "metrics": { + "age": 17, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 36, + "2": 50, + "3": 68, + "4": 94, + "5": 130 + } + }, + { + "metrics": { + "age": 17, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 53, + "2": 73, + "3": 100, + "4": 138, + "5": 190 + } + }, + { + "metrics": { + "age": 25, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 27, + "2": 37, + "3": 51, + "4": 70, + "5": 97 + } + }, + { + "metrics": { + "age": 25, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 32, + "2": 45, + "3": 61, + "4": 85, + "5": 118 + } + }, + { + "metrics": { + "age": 25, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 35, + "2": 49, + "3": 67, + "4": 93, + "5": 128 + } + }, + { + "metrics": { + "age": 25, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 36, + "2": 50, + "3": 69, + "4": 95, + "5": 132 + } + }, + { + "metrics": { + "age": 25, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 40, + "2": 55, + "3": 76, + "4": 105, + "5": 145 + } + }, + { + "metrics": { + "age": 25, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 46, + "2": 63, + "3": 87, + "4": 120, + "5": 165 + } + }, + { + "metrics": { + "age": 25, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 57, + "2": 75, + "3": 105, + "4": 140, + "5": 195 + } + }, + { + "metrics": { + "age": 35, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 28, + "2": 43, + "3": 65, + "4": 89, + "5": 112 + } + }, + { + "metrics": { + "age": 35, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 34, + "2": 48, + "3": 71, + "4": 97, + "5": 128 + } + }, + { + "metrics": { + "age": 35, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 36, + "2": 55, + "3": 80, + "4": 110, + "5": 144 + } + }, + { + "metrics": { + "age": 35, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 38, + "2": 59, + "3": 85, + "4": 117, + "5": 154 + } + }, + { + "metrics": { + "age": 35, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 44, + "2": 62, + "3": 89, + "4": 123, + "5": 157 + } + }, + { + "metrics": { + "age": 35, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 51, + "2": 68, + "3": 97, + "4": 134, + "5": 171 + } + }, + { + "metrics": { + "age": 35, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 60, + "2": 81, + "3": 114, + "4": 157, + "5": 192 + } + }, + { + "metrics": { + "age": 45, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 23, + "2": 38, + "3": 41, + "4": 69, + "5": 78 + } + }, + { + "metrics": { + "age": 45, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 30, + "2": 49, + "3": 55, + "4": 90, + "5": 100 + } + }, + { + "metrics": { + "age": 45, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 33, + "2": 53, + "3": 59, + "4": 96, + "5": 108 + } + }, + { + "metrics": { + "age": 45, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 34, + "2": 55, + "3": 62, + "4": 101, + "5": 114 + } + }, + { + "metrics": { + "age": 45, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 36, + "2": 58, + "3": 65, + "4": 105, + "5": 119 + } + }, + { + "metrics": { + "age": 45, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 38, + "2": 61, + "3": 69, + "4": 111, + "5": 126 + } + }, + { + "metrics": { + "age": 45, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 40, + "2": 64, + "3": 73, + "4": 117, + "5": 133 + } + }, + { + "metrics": { + "age": 55, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 19, + "2": 33, + "3": 40, + "4": 60, + "5": 76 + } + }, + { + "metrics": { + "age": 55, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 24, + "2": 41, + "3": 54, + "4": 74, + "5": 97 + } + }, + { + "metrics": { + "age": 55, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 25, + "2": 42, + "3": 56, + "4": 76, + "5": 102 + } + }, + { + "metrics": { + "age": 55, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 26, + "2": 44, + "3": 59, + "4": 81, + "5": 107 + } + }, + { + "metrics": { + "age": 55, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 29, + "2": 49, + "3": 64, + "4": 90, + "5": 118 + } + }, + { + "metrics": { + "age": 55, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 29, + "2": 50, + "3": 67, + "4": 92, + "5": 121 + } + }, + { + "metrics": { + "age": 55, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 35, + "2": 59, + "3": 70, + "4": 111, + "5": 130 + } + }, + { + "metrics": { + "age": 65, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 15, + "2": 26, + "3": 35, + "4": 48, + "5": 63 + } + }, + { + "metrics": { + "age": 65, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 33, + "3": 44, + "4": 62, + "5": 81 + } + }, + { + "metrics": { + "age": 65, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 20, + "2": 35, + "3": 47, + "4": 65, + "5": 83 + } + }, + { + "metrics": { + "age": 65, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 22, + "2": 37, + "3": 48, + "4": 66, + "5": 85 + } + }, + { + "metrics": { + "age": 65, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 24, + "2": 40, + "3": 54, + "4": 74, + "5": 93 + } + }, + { + "metrics": { + "age": 65, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 25, + "2": 42, + "3": 56, + "4": 78, + "5": 99 + } + }, + { + "metrics": { + "age": 65, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 26, + "2": 45, + "3": 58, + "4": 79, + "5": 102 + } + }, + { + "metrics": { + "age": 75, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 14, + "2": 24, + "3": 32, + "4": 44, + "5": 58 + } + }, + { + "metrics": { + "age": 75, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 15, + "2": 25, + "3": 33, + "4": 46, + "5": 60 + } + }, + { + "metrics": { + "age": 75, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 16, + "2": 27, + "3": 36, + "4": 50, + "5": 65 + } + }, + { + "metrics": { + "age": 75, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 17, + "2": 28, + "3": 37, + "4": 52, + "5": 69 + } + }, + { + "metrics": { + "age": 75, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 17, + "2": 29, + "3": 39, + "4": 54, + "5": 71 + } + }, + { + "metrics": { + "age": 75, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 30, + "3": 40, + "4": 55, + "5": 73 + } + }, + { + "metrics": { + "age": 75, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 30, + "3": 40, + "4": 55, + "5": 73 + } + }, + { + "metrics": { + "age": 85, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 11, + "2": 19, + "3": 25, + "4": 35, + "5": 46 + } + }, + { + "metrics": { + "age": 85, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 11, + "2": 20, + "3": 26, + "4": 36, + "5": 48 + } + }, + { + "metrics": { + "age": 85, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 12, + "2": 21, + "3": 28, + "4": 39, + "5": 52 + } + }, + { + "metrics": { + "age": 85, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 13, + "2": 23, + "3": 30, + "4": 41, + "5": 54 + } + }, + { + "metrics": { + "age": 85, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 13, + "2": 23, + "3": 31, + "4": 42, + "5": 56 + } + }, + { + "metrics": { + "age": 85, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 14, + "2": 24, + "3": 32, + "4": 43, + "5": 57 + } + }, + { + "metrics": { + "age": 85, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 14, + "2": 24, + "3": 32, + "4": 43, + "5": 57 + } + } + ] + }, + "Deadlift": { + "metadata": { + "attribute": "Strength", + "generators": [], + "unit": "kg", + "name": "Deadlift" + }, + "standards": [ + { + "metrics": { + "age": 17, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 45, + "2": 74, + "3": 93, + "4": 103, + "5": 115 + } + }, + { + "metrics": { + "age": 17, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 58, + "2": 97, + "3": 121, + "4": 134, + "5": 149 + } + }, + { + "metrics": { + "age": 17, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 73, + "2": 122, + "3": 152, + "4": 169, + "5": 188 + } + }, + { + "metrics": { + "age": 17, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 77, + "2": 129, + "3": 161, + "4": 179, + "5": 199 + } + }, + { + "metrics": { + "age": 17, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 81, + "2": 135, + "3": 169, + "4": 188, + "5": 209 + } + }, + { + "metrics": { + "age": 17, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 82, + "2": 137, + "3": 172, + "4": 191, + "5": 212 + } + }, + { + "metrics": { + "age": 17, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 84, + "2": 139, + "3": 174, + "4": 194, + "5": 215 + } + }, + { + "metrics": { + "age": 25, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 47, + "2": 81, + "3": 101, + "4": 127, + "5": 141 + } + }, + { + "metrics": { + "age": 25, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 64, + "2": 112, + "3": 139, + "4": 186, + "5": 207 + } + }, + { + "metrics": { + "age": 25, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 76, + "2": 131, + "3": 164, + "4": 219, + "5": 243 + } + }, + { + "metrics": { + "age": 25, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 83, + "2": 144, + "3": 180, + "4": 240, + "5": 266 + } + }, + { + "metrics": { + "age": 25, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 84, + "2": 146, + "3": 182, + "4": 243, + "5": 270 + } + }, + { + "metrics": { + "age": 25, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 85, + "2": 147, + "3": 184, + "4": 245, + "5": 273 + } + }, + { + "metrics": { + "age": 25, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 86, + "2": 149, + "3": 187, + "4": 249, + "5": 276 + } + }, + { + "metrics": { + "age": 35, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 51, + "2": 89, + "3": 112, + "4": 149, + "5": 175 + } + }, + { + "metrics": { + "age": 35, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 64, + "2": 112, + "3": 140, + "4": 186, + "5": 219 + } + }, + { + "metrics": { + "age": 35, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 76, + "2": 132, + "3": 165, + "4": 220, + "5": 259 + } + }, + { + "metrics": { + "age": 35, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 81, + "2": 142, + "3": 177, + "4": 236, + "5": 278 + } + }, + { + "metrics": { + "age": 35, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 83, + "2": 145, + "3": 181, + "4": 242, + "5": 284 + } + }, + { + "metrics": { + "age": 35, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 84, + "2": 146, + "3": 183, + "4": 244, + "5": 287 + } + }, + { + "metrics": { + "age": 35, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 89, + "2": 154, + "3": 192, + "4": 257, + "5": 302 + } + }, + { + "metrics": { + "age": 45, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 46, + "2": 80, + "3": 100, + "4": 118, + "5": 131 + } + }, + { + "metrics": { + "age": 45, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 53, + "2": 92, + "3": 115, + "4": 154, + "5": 181 + } + }, + { + "metrics": { + "age": 45, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 63, + "2": 109, + "3": 137, + "4": 182, + "5": 214 + } + }, + { + "metrics": { + "age": 45, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 65, + "2": 113, + "3": 141, + "4": 188, + "5": 222 + } + }, + { + "metrics": { + "age": 45, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 71, + "2": 124, + "3": 154, + "4": 206, + "5": 242 + } + }, + { + "metrics": { + "age": 45, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 75, + "2": 130, + "3": 162, + "4": 217, + "5": 255 + } + }, + { + "metrics": { + "age": 45, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 76, + "2": 133, + "3": 166, + "4": 221, + "5": 260 + } + }, + { + "metrics": { + "age": 55, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 40, + "2": 69, + "3": 86, + "4": 102, + "5": 113 + } + }, + { + "metrics": { + "age": 55, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 48, + "2": 84, + "3": 105, + "4": 140, + "5": 164 + } + }, + { + "metrics": { + "age": 55, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 56, + "2": 97, + "3": 121, + "4": 161, + "5": 190 + } + }, + { + "metrics": { + "age": 55, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 60, + "2": 104, + "3": 130, + "4": 173, + "5": 204 + } + }, + { + "metrics": { + "age": 55, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 63, + "2": 110, + "3": 138, + "4": 183, + "5": 216 + } + }, + { + "metrics": { + "age": 55, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 64, + "2": 111, + "3": 139, + "4": 185, + "5": 218 + } + }, + { + "metrics": { + "age": 55, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 65, + "2": 114, + "3": 142, + "4": 190, + "5": 223 + } + }, + { + "metrics": { + "age": 65, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 35, + "2": 61, + "3": 79, + "4": 95, + "5": 109 + } + }, + { + "metrics": { + "age": 65, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 46, + "2": 79, + "3": 103, + "4": 124, + "5": 142 + } + }, + { + "metrics": { + "age": 65, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 52, + "2": 90, + "3": 117, + "4": 141, + "5": 162 + } + }, + { + "metrics": { + "age": 65, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 57, + "2": 98, + "3": 128, + "4": 155, + "5": 177 + } + }, + { + "metrics": { + "age": 65, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 61, + "2": 107, + "3": 138, + "4": 167, + "5": 191 + } + }, + { + "metrics": { + "age": 65, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 62, + "2": 109, + "3": 140, + "4": 170, + "5": 194 + } + }, + { + "metrics": { + "age": 65, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 64, + "2": 112, + "3": 144, + "4": 175, + "5": 200 + } + }, + { + "metrics": { + "age": 75, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 29, + "2": 51, + "3": 68, + "4": 85, + "5": 98 + } + }, + { + "metrics": { + "age": 75, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 36, + "2": 62, + "3": 82, + "4": 103, + "5": 121 + } + }, + { + "metrics": { + "age": 75, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 42, + "2": 74, + "3": 98, + "4": 123, + "5": 144 + } + }, + { + "metrics": { + "age": 75, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 45, + "2": 79, + "3": 105, + "4": 131, + "5": 155 + } + }, + { + "metrics": { + "age": 75, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 49, + "2": 86, + "3": 114, + "4": 143, + "5": 168 + } + }, + { + "metrics": { + "age": 75, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 50, + "2": 87, + "3": 116, + "4": 145, + "5": 170 + } + }, + { + "metrics": { + "age": 75, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 52, + "2": 90, + "3": 120, + "4": 150, + "5": 176 + } + }, + { + "metrics": { + "age": 85, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 21, + "2": 36, + "3": 48, + "4": 60, + "5": 68 + } + }, + { + "metrics": { + "age": 85, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 25, + "2": 43, + "3": 58, + "4": 72, + "5": 85 + } + }, + { + "metrics": { + "age": 85, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 30, + "2": 51, + "3": 69, + "4": 86, + "5": 101 + } + }, + { + "metrics": { + "age": 85, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 32, + "2": 55, + "3": 74, + "4": 92, + "5": 108 + } + }, + { + "metrics": { + "age": 85, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 35, + "2": 60, + "3": 80, + "4": 100, + "5": 118 + } + }, + { + "metrics": { + "age": 85, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 35, + "2": 61, + "3": 81, + "4": 101, + "5": 119 + } + }, + { + "metrics": { + "age": 85, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 36, + "2": 63, + "3": 84, + "4": 105, + "5": 123 + } + }, + { + "metrics": { + "age": 17, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 17, + "2": 39, + "3": 51, + "4": 62, + "5": 82 + } + }, + { + "metrics": { + "age": 17, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 22, + "2": 51, + "3": 65, + "4": 80, + "5": 102 + } + }, + { + "metrics": { + "age": 17, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 24, + "2": 56, + "3": 72, + "4": 88, + "5": 108 + } + }, + { + "metrics": { + "age": 17, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 25, + "2": 59, + "3": 75, + "4": 92, + "5": 113 + } + }, + { + "metrics": { + "age": 17, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 26, + "2": 61, + "3": 79, + "4": 99, + "5": 118 + } + }, + { + "metrics": { + "age": 17, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 27, + "2": 62, + "3": 80, + "4": 103, + "5": 123 + } + }, + { + "metrics": { + "age": 17, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 29, + "2": 69, + "3": 89, + "4": 109, + "5": 129 + } + }, + { + "metrics": { + "age": 25, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 25, + "2": 58, + "3": 74, + "4": 91, + "5": 120 + } + }, + { + "metrics": { + "age": 25, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 30, + "2": 70, + "3": 90, + "4": 110, + "5": 140 + } + }, + { + "metrics": { + "age": 25, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 33, + "2": 77, + "3": 99, + "4": 121, + "5": 150 + } + }, + { + "metrics": { + "age": 25, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 34, + "2": 79, + "3": 101, + "4": 124, + "5": 154 + } + }, + { + "metrics": { + "age": 25, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 35, + "2": 82, + "3": 107, + "4": 133, + "5": 162 + } + }, + { + "metrics": { + "age": 25, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 35, + "2": 82, + "3": 106, + "4": 134, + "5": 164 + } + }, + { + "metrics": { + "age": 25, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 36, + "2": 84, + "3": 108, + "4": 132, + "5": 159 + } + }, + { + "metrics": { + "age": 35, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 30, + "2": 70, + "3": 90, + "4": 110, + "5": 145 + } + }, + { + "metrics": { + "age": 35, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 32, + "2": 74, + "3": 96, + "4": 117, + "5": 149 + } + }, + { + "metrics": { + "age": 35, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 35, + "2": 81, + "3": 104, + "4": 127, + "5": 157 + } + }, + { + "metrics": { + "age": 35, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 36, + "2": 83, + "3": 107, + "4": 131, + "5": 162 + } + }, + { + "metrics": { + "age": 35, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 39, + "2": 91, + "3": 118, + "4": 147, + "5": 179 + } + }, + { + "metrics": { + "age": 35, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 40, + "2": 93, + "3": 119, + "4": 151, + "5": 185 + } + }, + { + "metrics": { + "age": 35, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 40, + "2": 94, + "3": 120, + "4": 147, + "5": 178 + } + }, + { + "metrics": { + "age": 45, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 23, + "2": 54, + "3": 70, + "4": 85, + "5": 112 + } + }, + { + "metrics": { + "age": 45, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 29, + "2": 67, + "3": 86, + "4": 105, + "5": 133 + } + }, + { + "metrics": { + "age": 45, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 30, + "2": 69, + "3": 89, + "4": 109, + "5": 134 + } + }, + { + "metrics": { + "age": 45, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 32, + "2": 74, + "3": 95, + "4": 116, + "5": 143 + } + }, + { + "metrics": { + "age": 45, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 33, + "2": 78, + "3": 101, + "4": 126, + "5": 153 + } + }, + { + "metrics": { + "age": 45, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 35, + "2": 81, + "3": 104, + "4": 132, + "5": 160 + } + }, + { + "metrics": { + "age": 45, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 35, + "2": 82, + "3": 106, + "4": 129, + "5": 156 + } + }, + { + "metrics": { + "age": 55, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 22, + "2": 51, + "3": 65, + "4": 80, + "5": 105 + } + }, + { + "metrics": { + "age": 55, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 24, + "2": 57, + "3": 73, + "4": 89, + "5": 114 + } + }, + { + "metrics": { + "age": 55, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 26, + "2": 60, + "3": 78, + "4": 95, + "5": 117 + } + }, + { + "metrics": { + "age": 55, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 28, + "2": 65, + "3": 83, + "4": 102, + "5": 126 + } + }, + { + "metrics": { + "age": 55, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 29, + "2": 69, + "3": 90, + "4": 112, + "5": 136 + } + }, + { + "metrics": { + "age": 55, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 30, + "2": 69, + "3": 89, + "4": 114, + "5": 137 + } + }, + { + "metrics": { + "age": 55, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 31, + "2": 72, + "3": 92, + "4": 113, + "5": 135 + } + }, + { + "metrics": { + "age": 65, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 43, + "3": 55, + "4": 67, + "5": 89 + } + }, + { + "metrics": { + "age": 65, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 23, + "2": 53, + "3": 69, + "4": 84, + "5": 107 + } + }, + { + "metrics": { + "age": 65, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 24, + "2": 56, + "3": 72, + "4": 89, + "5": 109 + } + }, + { + "metrics": { + "age": 65, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 25, + "2": 58, + "3": 74, + "4": 91, + "5": 112 + } + }, + { + "metrics": { + "age": 65, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 25, + "2": 60, + "3": 77, + "4": 97, + "5": 116 + } + }, + { + "metrics": { + "age": 65, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 26, + "2": 60, + "3": 77, + "4": 99, + "5": 118 + } + }, + { + "metrics": { + "age": 65, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 26, + "2": 60, + "3": 78, + "4": 95, + "5": 112 + } + }, + { + "metrics": { + "age": 75, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 42, + "3": 53, + "4": 66, + "5": 84 + } + }, + { + "metrics": { + "age": 75, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 43, + "3": 55, + "4": 67, + "5": 86 + } + }, + { + "metrics": { + "age": 75, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 20, + "2": 46, + "3": 59, + "4": 72, + "5": 92 + } + }, + { + "metrics": { + "age": 75, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 20, + "2": 47, + "3": 60, + "4": 73, + "5": 93 + } + }, + { + "metrics": { + "age": 75, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 20, + "2": 47, + "3": 61, + "4": 79, + "5": 94 + } + }, + { + "metrics": { + "age": 75, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 20, + "2": 47, + "3": 61, + "4": 79, + "5": 95 + } + }, + { + "metrics": { + "age": 75, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 20, + "2": 48, + "3": 61, + "4": 79, + "5": 95 + } + }, + { + "metrics": { + "age": 85, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 15, + "2": 34, + "3": 44, + "4": 53, + "5": 68 + } + }, + { + "metrics": { + "age": 85, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 15, + "2": 35, + "3": 45, + "4": 55, + "5": 69 + } + }, + { + "metrics": { + "age": 85, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 16, + "2": 37, + "3": 48, + "4": 58, + "5": 74 + } + }, + { + "metrics": { + "age": 85, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 16, + "2": 38, + "3": 48, + "4": 59, + "5": 75 + } + }, + { + "metrics": { + "age": 85, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 16, + "2": 38, + "3": 50, + "4": 65, + "5": 76 + } + }, + { + "metrics": { + "age": 85, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 16, + "2": 38, + "3": 49, + "4": 65, + "5": 77 + } + }, + { + "metrics": { + "age": 85, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 17, + "2": 39, + "3": 50, + "4": 65, + "5": 77 + } + } + ] + }, + "BenchPress": { + "metadata": { + "attribute": "Strength", + "generators": [], + "unit": "kg", + "name": "Bench Press" + }, + "standards": [ + { + "metrics": { + "age": 17, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 34, + "2": 47, + "3": 61, + "4": 74, + "5": 85 + } + }, + { + "metrics": { + "age": 17, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 42, + "2": 59, + "3": 76, + "4": 92, + "5": 107 + } + }, + { + "metrics": { + "age": 17, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 43, + "2": 60, + "3": 77, + "4": 94, + "5": 110 + } + }, + { + "metrics": { + "age": 17, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 51, + "2": 71, + "3": 91, + "4": 111, + "5": 132 + } + }, + { + "metrics": { + "age": 17, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 53, + "2": 74, + "3": 95, + "4": 116, + "5": 134 + } + }, + { + "metrics": { + "age": 17, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 53, + "2": 74, + "3": 96, + "4": 117, + "5": 137 + } + }, + { + "metrics": { + "age": 17, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 53, + "2": 74, + "3": 95, + "4": 116, + "5": 138 + } + }, + { + "metrics": { + "age": 25, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 36, + "2": 51, + "3": 65, + "4": 80, + "5": 92 + } + }, + { + "metrics": { + "age": 25, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 50, + "2": 70, + "3": 90, + "4": 110, + "5": 130 + } + }, + { + "metrics": { + "age": 25, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 50, + "2": 70, + "3": 90, + "4": 110, + "5": 150 + } + }, + { + "metrics": { + "age": 25, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 52, + "2": 73, + "3": 93, + "4": 114, + "5": 161 + } + }, + { + "metrics": { + "age": 25, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 55, + "2": 77, + "3": 99, + "4": 121, + "5": 170 + } + }, + { + "metrics": { + "age": 25, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 59, + "2": 82, + "3": 106, + "4": 129, + "5": 181 + } + }, + { + "metrics": { + "age": 25, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 61, + "2": 85, + "3": 109, + "4": 133, + "5": 182 + } + }, + { + "metrics": { + "age": 35, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 39, + "2": 55, + "3": 71, + "4": 87, + "5": 114 + } + }, + { + "metrics": { + "age": 35, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 53, + "2": 75, + "3": 96, + "4": 117, + "5": 155 + } + }, + { + "metrics": { + "age": 35, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 54, + "2": 75, + "3": 97, + "4": 119, + "5": 156 + } + }, + { + "metrics": { + "age": 35, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 59, + "2": 83, + "3": 107, + "4": 131, + "5": 173 + } + }, + { + "metrics": { + "age": 35, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 61, + "2": 84, + "3": 108, + "4": 135, + "5": 176 + } + }, + { + "metrics": { + "age": 35, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 62, + "2": 85, + "3": 110, + "4": 139, + "5": 177 + } + }, + { + "metrics": { + "age": 35, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 67, + "2": 94, + "3": 121, + "4": 148, + "5": 195 + } + }, + { + "metrics": { + "age": 45, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 37, + "2": 52, + "3": 66, + "4": 81, + "5": 105 + } + }, + { + "metrics": { + "age": 45, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 41, + "2": 57, + "3": 73, + "4": 89, + "5": 116 + } + }, + { + "metrics": { + "age": 45, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 48, + "2": 67, + "3": 86, + "4": 105, + "5": 135 + } + }, + { + "metrics": { + "age": 45, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 54, + "2": 75, + "3": 97, + "4": 118, + "5": 143 + } + }, + { + "metrics": { + "age": 45, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 56, + "2": 78, + "3": 100, + "4": 122, + "5": 154 + } + }, + { + "metrics": { + "age": 45, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 58, + "2": 81, + "3": 104, + "4": 127, + "5": 164 + } + }, + { + "metrics": { + "age": 45, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 62, + "2": 87, + "3": 111, + "4": 136, + "5": 166 + } + }, + { + "metrics": { + "age": 55, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 29, + "2": 41, + "3": 53, + "4": 65, + "5": 74 + } + }, + { + "metrics": { + "age": 55, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 40, + "2": 56, + "3": 72, + "4": 88, + "5": 104 + } + }, + { + "metrics": { + "age": 55, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 43, + "2": 60, + "3": 77, + "4": 94, + "5": 111 + } + }, + { + "metrics": { + "age": 55, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 49, + "2": 68, + "3": 88, + "4": 107, + "5": 129 + } + }, + { + "metrics": { + "age": 55, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 53, + "2": 74, + "3": 95, + "4": 116, + "5": 140 + } + }, + { + "metrics": { + "age": 55, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 54, + "2": 75, + "3": 97, + "4": 118, + "5": 143 + } + }, + { + "metrics": { + "age": 55, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 54, + "2": 76, + "3": 98, + "4": 120, + "5": 145 + } + }, + { + "metrics": { + "age": 65, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 25, + "2": 35, + "3": 45, + "4": 55, + "5": 68 + } + }, + { + "metrics": { + "age": 65, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 32, + "2": 45, + "3": 57, + "4": 70, + "5": 88 + } + }, + { + "metrics": { + "age": 65, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 36, + "2": 50, + "3": 64, + "4": 78, + "5": 99 + } + }, + { + "metrics": { + "age": 65, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 47, + "2": 66, + "3": 84, + "4": 103, + "5": 131 + } + }, + { + "metrics": { + "age": 65, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 48, + "2": 67, + "3": 87, + "4": 106, + "5": 134 + } + }, + { + "metrics": { + "age": 65, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 49, + "2": 68, + "3": 88, + "4": 107, + "5": 136 + } + }, + { + "metrics": { + "age": 65, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 50, + "2": 69, + "3": 89, + "4": 109, + "5": 138 + } + }, + { + "metrics": { + "age": 75, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 23, + "2": 32, + "3": 41, + "4": 50, + "5": 60 + } + }, + { + "metrics": { + "age": 75, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 29, + "2": 40, + "3": 52, + "4": 63, + "5": 78 + } + }, + { + "metrics": { + "age": 75, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 33, + "2": 46, + "3": 59, + "4": 72, + "5": 89 + } + }, + { + "metrics": { + "age": 75, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 34, + "2": 48, + "3": 62, + "4": 76, + "5": 94 + } + }, + { + "metrics": { + "age": 75, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 36, + "2": 51, + "3": 65, + "4": 80, + "5": 99 + } + }, + { + "metrics": { + "age": 75, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 44, + "2": 61, + "3": 79, + "4": 96, + "5": 121 + } + }, + { + "metrics": { + "age": 75, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 48, + "2": 67, + "3": 86, + "4": 105, + "5": 131 + } + }, + { + "metrics": { + "age": 85, + "weight": 57, + "gender": "Male" + }, + "levels": { + "1": 16, + "2": 22, + "3": 28, + "4": 34, + "5": 41 + } + }, + { + "metrics": { + "age": 85, + "weight": 68, + "gender": "Male" + }, + "levels": { + "1": 20, + "2": 28, + "3": 36, + "4": 44, + "5": 54 + } + }, + { + "metrics": { + "age": 85, + "weight": 79, + "gender": "Male" + }, + "levels": { + "1": 22, + "2": 31, + "3": 40, + "4": 49, + "5": 61 + } + }, + { + "metrics": { + "age": 85, + "weight": 91, + "gender": "Male" + }, + "levels": { + "1": 24, + "2": 33, + "3": 43, + "4": 52, + "5": 65 + } + }, + { + "metrics": { + "age": 85, + "weight": 102, + "gender": "Male" + }, + "levels": { + "1": 25, + "2": 35, + "3": 45, + "4": 55, + "5": 69 + } + }, + { + "metrics": { + "age": 85, + "weight": 113, + "gender": "Male" + }, + "levels": { + "1": 30, + "2": 42, + "3": 54, + "4": 66, + "5": 83 + } + }, + { + "metrics": { + "age": 85, + "weight": 136, + "gender": "Male" + }, + "levels": { + "1": 33, + "2": 46, + "3": 59, + "4": 72, + "5": 91 + } + }, + { + "metrics": { + "age": 17, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 14, + "2": 19, + "3": 27, + "4": 37, + "5": 51 + } + }, + { + "metrics": { + "age": 17, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 17, + "2": 23, + "3": 32, + "4": 44, + "5": 61 + } + }, + { + "metrics": { + "age": 17, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 19, + "2": 27, + "3": 37, + "4": 51, + "5": 70 + } + }, + { + "metrics": { + "age": 17, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 21, + "2": 28, + "3": 39, + "4": 54, + "5": 75 + } + }, + { + "metrics": { + "age": 17, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 22, + "2": 30, + "3": 41, + "4": 57, + "5": 78 + } + }, + { + "metrics": { + "age": 17, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 22, + "2": 31, + "3": 42, + "4": 58, + "5": 81 + } + }, + { + "metrics": { + "age": 17, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 23, + "2": 32, + "3": 44, + "4": 61, + "5": 84 + } + }, + { + "metrics": { + "age": 25, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 14, + "2": 19, + "3": 26, + "4": 36, + "5": 49 + } + }, + { + "metrics": { + "age": 25, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 19, + "2": 27, + "3": 37, + "4": 51, + "5": 70 + } + }, + { + "metrics": { + "age": 25, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 21, + "2": 29, + "3": 40, + "4": 56, + "5": 77 + } + }, + { + "metrics": { + "age": 25, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 22, + "2": 30, + "3": 42, + "4": 57, + "5": 79 + } + }, + { + "metrics": { + "age": 25, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 25, + "2": 34, + "3": 47, + "4": 64, + "5": 89 + } + }, + { + "metrics": { + "age": 25, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 25, + "2": 35, + "3": 48, + "4": 66, + "5": 91 + } + }, + { + "metrics": { + "age": 25, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 28, + "2": 39, + "3": 54, + "4": 75, + "5": 103 + } + }, + { + "metrics": { + "age": 35, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 12, + "2": 17, + "3": 22, + "4": 27, + "5": 57 + } + }, + { + "metrics": { + "age": 35, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 30, + "2": 41, + "3": 53, + "4": 65, + "5": 83 + } + }, + { + "metrics": { + "age": 35, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 33, + "2": 45, + "3": 60, + "4": 73, + "5": 89 + } + }, + { + "metrics": { + "age": 35, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 35, + "2": 51, + "3": 66, + "4": 80, + "5": 98 + } + }, + { + "metrics": { + "age": 35, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 38, + "2": 51, + "3": 67, + "4": 84, + "5": 100 + } + }, + { + "metrics": { + "age": 35, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 39, + "2": 52, + "3": 66, + "4": 86, + "5": 102 + } + }, + { + "metrics": { + "age": 35, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 41, + "2": 58, + "3": 74, + "4": 90, + "5": 106 + } + }, + { + "metrics": { + "age": 45, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 14, + "2": 14, + "3": 25, + "4": 25, + "5": 46 + } + }, + { + "metrics": { + "age": 45, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 20, + "2": 31, + "3": 36, + "4": 56, + "5": 66 + } + }, + { + "metrics": { + "age": 45, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 23, + "2": 37, + "3": 41, + "4": 67, + "5": 75 + } + }, + { + "metrics": { + "age": 45, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 24, + "2": 44, + "3": 44, + "4": 80, + "5": 81 + } + }, + { + "metrics": { + "age": 45, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 26, + "2": 32, + "3": 44, + "4": 59, + "5": 85 + } + }, + { + "metrics": { + "age": 45, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 26, + "2": 41, + "3": 48, + "4": 75, + "5": 87 + } + }, + { + "metrics": { + "age": 45, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 28, + "2": 44, + "3": 51, + "4": 79, + "5": 93 + } + }, + { + "metrics": { + "age": 55, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 7, + "2": 13, + "3": 17, + "4": 23, + "5": 43 + } + }, + { + "metrics": { + "age": 55, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 16, + "2": 22, + "3": 32, + "4": 37, + "5": 61 + } + }, + { + "metrics": { + "age": 55, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 30, + "3": 40, + "4": 55, + "5": 68 + } + }, + { + "metrics": { + "age": 55, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 31, + "3": 41, + "4": 56, + "5": 69 + } + }, + { + "metrics": { + "age": 55, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 15, + "2": 27, + "3": 35, + "4": 49, + "5": 72 + } + }, + { + "metrics": { + "age": 55, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 32, + "3": 42, + "4": 58, + "5": 75 + } + }, + { + "metrics": { + "age": 55, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 21, + "2": 36, + "3": 48, + "4": 66, + "5": 82 + } + }, + { + "metrics": { + "age": 65, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 9, + "2": 13, + "3": 17, + "4": 38, + "5": 38 + } + }, + { + "metrics": { + "age": 65, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 33, + "3": 44, + "4": 40, + "5": 53 + } + }, + { + "metrics": { + "age": 65, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 20, + "2": 25, + "3": 34, + "4": 46, + "5": 61 + } + }, + { + "metrics": { + "age": 65, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 22, + "2": 33, + "3": 48, + "4": 66, + "5": 62 + } + }, + { + "metrics": { + "age": 65, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 12, + "2": 20, + "3": 27, + "4": 37, + "5": 65 + } + }, + { + "metrics": { + "age": 65, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 31, + "3": 41, + "4": 56, + "5": 69 + } + }, + { + "metrics": { + "age": 65, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 20, + "2": 45, + "3": 58, + "4": 65, + "5": 70 + } + }, + { + "metrics": { + "age": 75, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 9, + "2": 12, + "3": 16, + "4": 21, + "5": 28 + } + }, + { + "metrics": { + "age": 75, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 14, + "2": 18, + "3": 24, + "4": 32, + "5": 43 + } + }, + { + "metrics": { + "age": 75, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 16, + "2": 21, + "3": 28, + "4": 37, + "5": 49 + } + }, + { + "metrics": { + "age": 75, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 17, + "2": 23, + "3": 30, + "4": 40, + "5": 54 + } + }, + { + "metrics": { + "age": 75, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 17, + "2": 23, + "3": 31, + "4": 41, + "5": 55 + } + }, + { + "metrics": { + "age": 75, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 18, + "2": 24, + "3": 32, + "4": 42, + "5": 56 + } + }, + { + "metrics": { + "age": 75, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 19, + "2": 25, + "3": 33, + "4": 44, + "5": 59 + } + }, + { + "metrics": { + "age": 85, + "weight": 57, + "gender": "Female" + }, + "levels": { + "1": 8, + "2": 10, + "3": 14, + "4": 18, + "5": 24 + } + }, + { + "metrics": { + "age": 85, + "weight": 68, + "gender": "Female" + }, + "levels": { + "1": 9, + "2": 14, + "3": 19, + "4": 25, + "5": 34 + } + }, + { + "metrics": { + "age": 85, + "weight": 79, + "gender": "Female" + }, + "levels": { + "1": 12, + "2": 16, + "3": 22, + "4": 29, + "5": 39 + } + }, + { + "metrics": { + "age": 85, + "weight": 91, + "gender": "Female" + }, + "levels": { + "1": 13, + "2": 18, + "3": 24, + "4": 32, + "5": 43 + } + }, + { + "metrics": { + "age": 85, + "weight": 102, + "gender": "Female" + }, + "levels": { + "1": 14, + "2": 19, + "3": 25, + "4": 33, + "5": 44 + } + }, + { + "metrics": { + "age": 85, + "weight": 113, + "gender": "Female" + }, + "levels": { + "1": 15, + "2": 19, + "3": 26, + "4": 34, + "5": 46 + } + }, + { + "metrics": { + "age": 85, + "weight": 136, + "gender": "Female" + }, + "levels": { + "1": 15, + "2": 20, + "3": 27, + "4": 36, + "5": 48 + } + } + ] + }, + "Run": { + "metadata": { + "attribute": "Endurance", + "generators": [ + { + "metric": "weight" + } + ], + "unit": "ms", + "name": "Mile Run" + }, + "standards": [ + { + "metrics": { + "age": 10, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 676000, + "2": 560000, + "3": 475000, + "4": 414000, + "5": 369000 + } + }, + { + "metrics": { + "age": 15, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 585000, + "2": 485000, + "3": 411000, + "4": 358000, + "5": 319000 + } + }, + { + "metrics": { + "age": 20, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 565000, + "2": 468000, + "3": 398000, + "4": 346000, + "5": 308000 + } + }, + { + "metrics": { + "age": 25, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 565000, + "2": 468000, + "3": 398000, + "4": 346000, + "5": 308000 + } + }, + { + "metrics": { + "age": 30, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 566000, + "2": 469000, + "3": 398000, + "4": 346000, + "5": 309000 + } + }, + { + "metrics": { + "age": 35, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 575000, + "2": 476000, + "3": 404000, + "4": 352000, + "5": 314000 + } + }, + { + "metrics": { + "age": 40, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 595000, + "2": 493000, + "3": 418000, + "4": 364000, + "5": 325000 + } + }, + { + "metrics": { + "age": 45, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 617000, + "2": 511000, + "3": 434000, + "4": 378000, + "5": 337000 + } + }, + { + "metrics": { + "age": 50, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 642000, + "2": 531000, + "3": 451000, + "4": 393000, + "5": 350000 + } + }, + { + "metrics": { + "age": 55, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 668000, + "2": 553000, + "3": 469000, + "4": 409000, + "5": 364000 + } + }, + { + "metrics": { + "age": 60, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 696000, + "2": 577000, + "3": 489000, + "4": 426000, + "5": 380000 + } + }, + { + "metrics": { + "age": 65, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 727000, + "2": 602000, + "3": 511000, + "4": 445000, + "5": 397000 + } + }, + { + "metrics": { + "age": 70, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 763000, + "2": 632000, + "3": 537000, + "4": 467000, + "5": 417000 + } + }, + { + "metrics": { + "age": 75, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 820000, + "2": 680000, + "3": 577000, + "4": 502000, + "5": 448000 + } + }, + { + "metrics": { + "age": 80, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 908000, + "2": 752000, + "3": 638000, + "4": 556000, + "5": 495000 + } + }, + { + "metrics": { + "age": 85, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 1045000, + "2": 866000, + "3": 735000, + "4": 640000, + "5": 570000 + } + }, + { + "metrics": { + "age": 90, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 1273000, + "2": 1055000, + "3": 895000, + "4": 779000, + "5": 695000 + } + }, + { + "metrics": { + "age": 10, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 749000, + "2": 632000, + "3": 543000, + "4": 477000, + "5": 428000 + } + }, + { + "metrics": { + "age": 15, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 672000, + "2": 567000, + "3": 488000, + "4": 428000, + "5": 384000 + } + }, + { + "metrics": { + "age": 20, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 640000, + "2": 540000, + "3": 464000, + "4": 408000, + "5": 366000 + } + }, + { + "metrics": { + "age": 25, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 640000, + "2": 540000, + "3": 464000, + "4": 408000, + "5": 366000 + } + }, + { + "metrics": { + "age": 30, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 640000, + "2": 540000, + "3": 464000, + "4": 408000, + "5": 366000 + } + }, + { + "metrics": { + "age": 35, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 644000, + "2": 544000, + "3": 467000, + "4": 410000, + "5": 368000 + } + }, + { + "metrics": { + "age": 40, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 658000, + "2": 555000, + "3": 477000, + "4": 419000, + "5": 376000 + } + }, + { + "metrics": { + "age": 45, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 681000, + "2": 575000, + "3": 494000, + "4": 434000, + "5": 389000 + } + }, + { + "metrics": { + "age": 50, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 716000, + "2": 604000, + "3": 520000, + "4": 456000, + "5": 409000 + } + }, + { + "metrics": { + "age": 55, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 757000, + "2": 639000, + "3": 550000, + "4": 482000, + "5": 433000 + } + }, + { + "metrics": { + "age": 60, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 804000, + "2": 678000, + "3": 583000, + "4": 512000, + "5": 459000 + } + }, + { + "metrics": { + "age": 65, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 856000, + "2": 722000, + "3": 621000, + "4": 545000, + "5": 489000 + } + }, + { + "metrics": { + "age": 70, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 915000, + "2": 772000, + "3": 664000, + "4": 583000, + "5": 523000 + } + }, + { + "metrics": { + "age": 75, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 983000, + "2": 830000, + "3": 713000, + "4": 626000, + "5": 562000 + } + }, + { + "metrics": { + "age": 80, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 1065000, + "2": 898000, + "3": 772000, + "4": 678000, + "5": 608000 + } + }, + { + "metrics": { + "age": 85, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 1199000, + "2": 1012000, + "3": 870000, + "4": 763000, + "5": 685000 + } + }, + { + "metrics": { + "age": 90, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 1445000, + "2": 1219000, + "3": 1048000, + "4": 920000, + "5": 825000 + } + } + ] + }, + "BroadJump": { + "metadata": { + "attribute": "Power", + "generators": [ + { + "metric": "age" + }, + { + "metric": "weight" + } + ], + "unit": "cm", + "name": "Broad Jump" + }, + "standards": [ + { + "metrics": { + "age": 27, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 200, + "2": 230, + "3": 250, + "4": 270, + "5": 300 + } + }, + { + "metrics": { + "age": 27, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 170, + "2": 190, + "3": 220, + "4": 250, + "5": 280 + } + } + ] + }, + "ConeDrill": { + "metadata": { + "attribute": "Agility", + "generators": [ + { + "metric": "weight" + }, + { + "metric": "age" + } + ], + "unit": "ms", + "name": "3 Cone Drill" + }, + "standards": [ + { + "metrics": { + "age": 27, + "weight": 0, + "gender": "Male" + }, + "levels": { + "1": 9500, + "2": 8700, + "3": 7800, + "4": 7000, + "5": 6000 + } + }, + { + "metrics": { + "age": 27, + "weight": 0, + "gender": "Female" + }, + "levels": { + "1": 10500, + "2": 9600, + "3": 8700, + "4": 7800, + "5": 6700 + } + } + ] + } +} diff --git a/packages/calculator/src/data/standards/fallback-params.json b/packages/calculator/src/data/standards/fallback-params.json new file mode 100644 index 0000000..a71140c --- /dev/null +++ b/packages/calculator/src/data/standards/fallback-params.json @@ -0,0 +1,79 @@ +{ + "global": { + "maxLevel": 100 + }, + "activity": { + "BackSquat": { + "enableGeneration": true, + "weightModifier": 0, + "weightSkew": 0, + "ageModifier": 0, + "difficultyModifier": 0.3, + "peakAge": 0, + "stretch": { + "upper": 0, + "lower": 1 + } + }, + "BenchPress": { + "enableGeneration": true, + "weightModifier": 0, + "weightSkew": 0, + "ageModifier": 0, + "difficultyModifier": 0.05, + "peakAge": 0, + "stretch": { + "upper": 1, + "lower": 0 + } + }, + "Deadlift": { + "enableGeneration": true, + "weightModifier": 0, + "weightSkew": 0, + "ageModifier": 0, + "difficultyModifier": -0.05, + "peakAge": 0, + "stretch": { + "upper": 1, + "lower": 0 + } + }, + "Run": { + "enableGeneration": true, + "weightModifier": 0.1, + "weightSkew": 0, + "ageModifier": 0, + "difficultyModifier": 0.35, + "peakAge": 0, + "stretch": { + "upper": 1, + "lower": 1 + } + }, + "BroadJump": { + "enableGeneration": true, + "weightModifier": -0.1, + "weightSkew": 0, + "ageModifier": -0.25, + "difficultyModifier": -0.15, + "peakAge": 23, + "stretch": { + "upper": 3, + "lower": 1 + } + }, + "ConeDrill": { + "enableGeneration": true, + "weightModifier": -0.1, + "weightSkew": 0, + "ageModifier": -0.25, + "difficultyModifier": 0.15, + "peakAge": 23, + "stretch": { + "upper": 0, + "lower": 2 + } + } + } +} diff --git a/packages/calculator/src/index.ts b/packages/calculator/src/index.ts index a4e3419..d394e41 100644 --- a/packages/calculator/src/index.ts +++ b/packages/calculator/src/index.ts @@ -10,8 +10,8 @@ import { type Player, } from "@blade-and-brawn/domain"; import { levenbergMarquardt as LM } from "ml-levenberg-marquardt"; -import defaultStandardsParamsJson from "./data/standards/default-params.json" with { type: "json" }; -import defaultStandardsDataJson from "./data/standards/default-data.json" with { type: "json" }; +import defaultStandardsParamsJson from "./data/standards/fallback-params.json" with { type: "json" }; +import defaultStandardsDataJson from "./data/standards/fallback-data.json" with { type: "json" }; import { getAvgWeight } from "./avg-weights"; import { StandardsDataSchema, StandardsParamsSchema, type LevelCalculatorOutput, type Levels, type NumberMetric, type Standard, type StandardsConfig, type StandardsData } from "./models"; import { Value } from "@sinclair/typebox/value"; @@ -36,7 +36,7 @@ const metricPriority = (m: NumberMetric) => { Value.Assert(StandardsDataSchema, defaultStandardsDataJson); Value.Assert(StandardsParamsSchema, defaultStandardsParamsJson); -export const DEFAULT_STANDARDS_CONFIG: StandardsConfig = { +export const FALLBACK_STANDARDS_CONFIG: StandardsConfig = { data: defaultStandardsDataJson, params: defaultStandardsParamsJson };