@lycoristech/azurdata 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +123 -0
  3. package/data/.gitkeep +0 -0
  4. package/data/id-map.json +3530 -0
  5. package/data/ship-list.json +4478 -0
  6. package/data/ships.json +143282 -0
  7. package/data/version.json +5 -0
  8. package/dist/cjs/client/AzurData.js +69 -0
  9. package/dist/cjs/client/fetcher.js +121 -0
  10. package/dist/cjs/client/index.js +7 -0
  11. package/dist/cjs/client/ships.js +80 -0
  12. package/dist/cjs/config.js +14 -0
  13. package/dist/cjs/index.js +6 -0
  14. package/dist/cjs/ingest/files.js +134 -0
  15. package/dist/cjs/ingest/index.js +18 -0
  16. package/dist/cjs/ingest/upstream.js +12 -0
  17. package/dist/cjs/normalize/construction.js +186 -0
  18. package/dist/cjs/normalize/identity.js +131 -0
  19. package/dist/cjs/normalize/index.js +25 -0
  20. package/dist/cjs/normalize/misc.js +31 -0
  21. package/dist/cjs/normalize/retrofit.js +21 -0
  22. package/dist/cjs/normalize/ship.js +406 -0
  23. package/dist/cjs/normalize/skills.js +194 -0
  24. package/dist/cjs/normalize/skins.js +141 -0
  25. package/dist/cjs/normalize/slots.js +35 -0
  26. package/dist/cjs/normalize/stats.js +182 -0
  27. package/dist/cjs/output/index.js +20 -0
  28. package/dist/cjs/output/writeIdMap.js +52 -0
  29. package/dist/cjs/output/writeShipList.js +31 -0
  30. package/dist/cjs/output/writeShips.js +33 -0
  31. package/dist/cjs/output/writeVersion.js +23 -0
  32. package/dist/cjs/package.json +1 -0
  33. package/dist/cjs/schema/output/index.js +17 -0
  34. package/dist/cjs/schema/output/ship.js +169 -0
  35. package/dist/cjs/schema/raw/attributeInfoByType.js +11 -0
  36. package/dist/cjs/schema/raw/equipDataByType.js +12 -0
  37. package/dist/cjs/schema/raw/fleetTechGroup.js +10 -0
  38. package/dist/cjs/schema/raw/fleetTechShipClass.js +15 -0
  39. package/dist/cjs/schema/raw/fleetTechShipTemplate.js +20 -0
  40. package/dist/cjs/schema/raw/index.js +38 -0
  41. package/dist/cjs/schema/raw/shipDataBlueprint.js +11 -0
  42. package/dist/cjs/schema/raw/shipDataBreakout.js +17 -0
  43. package/dist/cjs/schema/raw/shipDataByStar.js +10 -0
  44. package/dist/cjs/schema/raw/shipDataByType.js +13 -0
  45. package/dist/cjs/schema/raw/shipDataCreateExchange.js +10 -0
  46. package/dist/cjs/schema/raw/shipDataGroup.js +22 -0
  47. package/dist/cjs/schema/raw/shipDataStatistics.js +24 -0
  48. package/dist/cjs/schema/raw/shipDataStrengthen.js +12 -0
  49. package/dist/cjs/schema/raw/shipDataTemplate.js +26 -0
  50. package/dist/cjs/schema/raw/shipDataTrans.js +13 -0
  51. package/dist/cjs/schema/raw/shipSkinTemplate.js +23 -0
  52. package/dist/cjs/schema/raw/shipSkinWords.js +11 -0
  53. package/dist/cjs/schema/raw/shopTemplate.js +14 -0
  54. package/dist/cjs/schema/raw/skillDataDisplay.js +11 -0
  55. package/dist/cjs/schema/raw/skillDataTemplate.js +17 -0
  56. package/dist/cjs/schema/raw/transformDataTemplate.js +18 -0
  57. package/dist/cjs/schema/raw/voiceActorCn.js +11 -0
  58. package/dist/cjs/translate/enums.js +131 -0
  59. package/dist/cjs/translate/index.js +19 -0
  60. package/dist/cjs/translate/lookups.js +63 -0
  61. package/dist/cjs/translate/strings.js +98 -0
  62. package/dist/client/AzurData.d.ts +25 -0
  63. package/dist/client/AzurData.d.ts.map +1 -0
  64. package/dist/client/AzurData.js +63 -0
  65. package/dist/client/AzurData.js.map +1 -0
  66. package/dist/client/fetcher.d.ts +25 -0
  67. package/dist/client/fetcher.d.ts.map +1 -0
  68. package/dist/client/fetcher.js +116 -0
  69. package/dist/client/fetcher.js.map +1 -0
  70. package/dist/client/index.d.ts +4 -0
  71. package/dist/client/index.d.ts.map +1 -0
  72. package/dist/client/index.js +3 -0
  73. package/dist/client/index.js.map +1 -0
  74. package/dist/client/ships.d.ts +20 -0
  75. package/dist/client/ships.d.ts.map +1 -0
  76. package/dist/client/ships.js +74 -0
  77. package/dist/client/ships.js.map +1 -0
  78. package/dist/config.d.ts +5 -0
  79. package/dist/config.d.ts.map +1 -0
  80. package/dist/config.js +12 -0
  81. package/dist/config.js.map +1 -0
  82. package/dist/index.d.ts +3 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +2 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/ingest/files.d.ts +25 -0
  87. package/dist/ingest/files.d.ts.map +1 -0
  88. package/dist/ingest/files.js +108 -0
  89. package/dist/ingest/files.js.map +1 -0
  90. package/dist/ingest/index.d.ts +3 -0
  91. package/dist/ingest/index.d.ts.map +1 -0
  92. package/dist/ingest/index.js +3 -0
  93. package/dist/ingest/index.js.map +1 -0
  94. package/dist/ingest/upstream.d.ts +4 -0
  95. package/dist/ingest/upstream.d.ts.map +1 -0
  96. package/dist/ingest/upstream.js +6 -0
  97. package/dist/ingest/upstream.js.map +1 -0
  98. package/dist/normalize/construction.d.ts +30 -0
  99. package/dist/normalize/construction.d.ts.map +1 -0
  100. package/dist/normalize/construction.js +184 -0
  101. package/dist/normalize/construction.js.map +1 -0
  102. package/dist/normalize/identity.d.ts +47 -0
  103. package/dist/normalize/identity.d.ts.map +1 -0
  104. package/dist/normalize/identity.js +129 -0
  105. package/dist/normalize/identity.js.map +1 -0
  106. package/dist/normalize/index.d.ts +10 -0
  107. package/dist/normalize/index.d.ts.map +1 -0
  108. package/dist/normalize/index.js +10 -0
  109. package/dist/normalize/index.js.map +1 -0
  110. package/dist/normalize/misc.d.ts +15 -0
  111. package/dist/normalize/misc.d.ts.map +1 -0
  112. package/dist/normalize/misc.js +29 -0
  113. package/dist/normalize/misc.js.map +1 -0
  114. package/dist/normalize/retrofit.d.ts +14 -0
  115. package/dist/normalize/retrofit.d.ts.map +1 -0
  116. package/dist/normalize/retrofit.js +19 -0
  117. package/dist/normalize/retrofit.js.map +1 -0
  118. package/dist/normalize/ship.d.ts +67 -0
  119. package/dist/normalize/ship.d.ts.map +1 -0
  120. package/dist/normalize/ship.js +369 -0
  121. package/dist/normalize/ship.js.map +1 -0
  122. package/dist/normalize/skills.d.ts +20 -0
  123. package/dist/normalize/skills.d.ts.map +1 -0
  124. package/dist/normalize/skills.js +192 -0
  125. package/dist/normalize/skills.js.map +1 -0
  126. package/dist/normalize/skins.d.ts +14 -0
  127. package/dist/normalize/skins.d.ts.map +1 -0
  128. package/dist/normalize/skins.js +139 -0
  129. package/dist/normalize/skins.js.map +1 -0
  130. package/dist/normalize/slots.d.ts +14 -0
  131. package/dist/normalize/slots.d.ts.map +1 -0
  132. package/dist/normalize/slots.js +33 -0
  133. package/dist/normalize/slots.js.map +1 -0
  134. package/dist/normalize/stats.d.ts +19 -0
  135. package/dist/normalize/stats.d.ts.map +1 -0
  136. package/dist/normalize/stats.js +180 -0
  137. package/dist/normalize/stats.js.map +1 -0
  138. package/dist/output/index.d.ts +5 -0
  139. package/dist/output/index.d.ts.map +1 -0
  140. package/dist/output/index.js +5 -0
  141. package/dist/output/index.js.map +1 -0
  142. package/dist/output/writeIdMap.d.ts +16 -0
  143. package/dist/output/writeIdMap.d.ts.map +1 -0
  144. package/dist/output/writeIdMap.js +47 -0
  145. package/dist/output/writeIdMap.js.map +1 -0
  146. package/dist/output/writeShipList.d.ts +9 -0
  147. package/dist/output/writeShipList.d.ts.map +1 -0
  148. package/dist/output/writeShipList.js +26 -0
  149. package/dist/output/writeShipList.js.map +1 -0
  150. package/dist/output/writeShips.d.ts +15 -0
  151. package/dist/output/writeShips.d.ts.map +1 -0
  152. package/dist/output/writeShips.js +28 -0
  153. package/dist/output/writeShips.js.map +1 -0
  154. package/dist/output/writeVersion.d.ts +11 -0
  155. package/dist/output/writeVersion.d.ts.map +1 -0
  156. package/dist/output/writeVersion.js +18 -0
  157. package/dist/output/writeVersion.js.map +1 -0
  158. package/dist/schema/output/index.d.ts +2 -0
  159. package/dist/schema/output/index.d.ts.map +1 -0
  160. package/dist/schema/output/index.js +2 -0
  161. package/dist/schema/output/index.js.map +1 -0
  162. package/dist/schema/output/ship.d.ts +977 -0
  163. package/dist/schema/output/ship.d.ts.map +1 -0
  164. package/dist/schema/output/ship.js +167 -0
  165. package/dist/schema/output/ship.js.map +1 -0
  166. package/dist/schema/raw/attributeInfoByType.d.ts +25 -0
  167. package/dist/schema/raw/attributeInfoByType.d.ts.map +1 -0
  168. package/dist/schema/raw/attributeInfoByType.js +9 -0
  169. package/dist/schema/raw/attributeInfoByType.js.map +1 -0
  170. package/dist/schema/raw/equipDataByType.d.ts +31 -0
  171. package/dist/schema/raw/equipDataByType.d.ts.map +1 -0
  172. package/dist/schema/raw/equipDataByType.js +10 -0
  173. package/dist/schema/raw/equipDataByType.js.map +1 -0
  174. package/dist/schema/raw/fleetTechGroup.d.ts +19 -0
  175. package/dist/schema/raw/fleetTechGroup.d.ts.map +1 -0
  176. package/dist/schema/raw/fleetTechGroup.js +8 -0
  177. package/dist/schema/raw/fleetTechGroup.js.map +1 -0
  178. package/dist/schema/raw/fleetTechShipClass.d.ts +49 -0
  179. package/dist/schema/raw/fleetTechShipClass.d.ts.map +1 -0
  180. package/dist/schema/raw/fleetTechShipClass.js +13 -0
  181. package/dist/schema/raw/fleetTechShipClass.js.map +1 -0
  182. package/dist/schema/raw/fleetTechShipTemplate.d.ts +79 -0
  183. package/dist/schema/raw/fleetTechShipTemplate.d.ts.map +1 -0
  184. package/dist/schema/raw/fleetTechShipTemplate.js +18 -0
  185. package/dist/schema/raw/fleetTechShipTemplate.js.map +1 -0
  186. package/dist/schema/raw/index.d.ts +23 -0
  187. package/dist/schema/raw/index.d.ts.map +1 -0
  188. package/dist/schema/raw/index.js +23 -0
  189. package/dist/schema/raw/index.js.map +1 -0
  190. package/dist/schema/raw/shipDataBlueprint.d.ts +25 -0
  191. package/dist/schema/raw/shipDataBlueprint.d.ts.map +1 -0
  192. package/dist/schema/raw/shipDataBlueprint.js +9 -0
  193. package/dist/schema/raw/shipDataBlueprint.js.map +1 -0
  194. package/dist/schema/raw/shipDataBreakout.d.ts +61 -0
  195. package/dist/schema/raw/shipDataBreakout.d.ts.map +1 -0
  196. package/dist/schema/raw/shipDataBreakout.js +15 -0
  197. package/dist/schema/raw/shipDataBreakout.js.map +1 -0
  198. package/dist/schema/raw/shipDataByStar.d.ts +19 -0
  199. package/dist/schema/raw/shipDataByStar.d.ts.map +1 -0
  200. package/dist/schema/raw/shipDataByStar.js +8 -0
  201. package/dist/schema/raw/shipDataByStar.js.map +1 -0
  202. package/dist/schema/raw/shipDataByType.d.ts +37 -0
  203. package/dist/schema/raw/shipDataByType.d.ts.map +1 -0
  204. package/dist/schema/raw/shipDataByType.js +11 -0
  205. package/dist/schema/raw/shipDataByType.js.map +1 -0
  206. package/dist/schema/raw/shipDataCreateExchange.d.ts +19 -0
  207. package/dist/schema/raw/shipDataCreateExchange.d.ts.map +1 -0
  208. package/dist/schema/raw/shipDataCreateExchange.js +8 -0
  209. package/dist/schema/raw/shipDataCreateExchange.js.map +1 -0
  210. package/dist/schema/raw/shipDataGroup.d.ts +79 -0
  211. package/dist/schema/raw/shipDataGroup.d.ts.map +1 -0
  212. package/dist/schema/raw/shipDataGroup.js +20 -0
  213. package/dist/schema/raw/shipDataGroup.js.map +1 -0
  214. package/dist/schema/raw/shipDataStatistics.d.ts +103 -0
  215. package/dist/schema/raw/shipDataStatistics.d.ts.map +1 -0
  216. package/dist/schema/raw/shipDataStatistics.js +22 -0
  217. package/dist/schema/raw/shipDataStatistics.js.map +1 -0
  218. package/dist/schema/raw/shipDataStrengthen.d.ts +31 -0
  219. package/dist/schema/raw/shipDataStrengthen.d.ts.map +1 -0
  220. package/dist/schema/raw/shipDataStrengthen.js +10 -0
  221. package/dist/schema/raw/shipDataStrengthen.js.map +1 -0
  222. package/dist/schema/raw/shipDataTemplate.d.ts +115 -0
  223. package/dist/schema/raw/shipDataTemplate.d.ts.map +1 -0
  224. package/dist/schema/raw/shipDataTemplate.js +24 -0
  225. package/dist/schema/raw/shipDataTemplate.js.map +1 -0
  226. package/dist/schema/raw/shipDataTrans.d.ts +37 -0
  227. package/dist/schema/raw/shipDataTrans.d.ts.map +1 -0
  228. package/dist/schema/raw/shipDataTrans.js +11 -0
  229. package/dist/schema/raw/shipDataTrans.js.map +1 -0
  230. package/dist/schema/raw/shipSkinTemplate.d.ts +97 -0
  231. package/dist/schema/raw/shipSkinTemplate.d.ts.map +1 -0
  232. package/dist/schema/raw/shipSkinTemplate.js +21 -0
  233. package/dist/schema/raw/shipSkinTemplate.js.map +1 -0
  234. package/dist/schema/raw/shipSkinWords.d.ts +25 -0
  235. package/dist/schema/raw/shipSkinWords.d.ts.map +1 -0
  236. package/dist/schema/raw/shipSkinWords.js +9 -0
  237. package/dist/schema/raw/shipSkinWords.js.map +1 -0
  238. package/dist/schema/raw/shopTemplate.d.ts +43 -0
  239. package/dist/schema/raw/shopTemplate.d.ts.map +1 -0
  240. package/dist/schema/raw/shopTemplate.js +12 -0
  241. package/dist/schema/raw/shopTemplate.js.map +1 -0
  242. package/dist/schema/raw/skillDataDisplay.d.ts +25 -0
  243. package/dist/schema/raw/skillDataDisplay.d.ts.map +1 -0
  244. package/dist/schema/raw/skillDataDisplay.js +9 -0
  245. package/dist/schema/raw/skillDataDisplay.js.map +1 -0
  246. package/dist/schema/raw/skillDataTemplate.d.ts +61 -0
  247. package/dist/schema/raw/skillDataTemplate.d.ts.map +1 -0
  248. package/dist/schema/raw/skillDataTemplate.js +15 -0
  249. package/dist/schema/raw/skillDataTemplate.js.map +1 -0
  250. package/dist/schema/raw/transformDataTemplate.d.ts +67 -0
  251. package/dist/schema/raw/transformDataTemplate.d.ts.map +1 -0
  252. package/dist/schema/raw/transformDataTemplate.js +16 -0
  253. package/dist/schema/raw/transformDataTemplate.js.map +1 -0
  254. package/dist/schema/raw/voiceActorCn.d.ts +25 -0
  255. package/dist/schema/raw/voiceActorCn.d.ts.map +1 -0
  256. package/dist/schema/raw/voiceActorCn.js +9 -0
  257. package/dist/schema/raw/voiceActorCn.js.map +1 -0
  258. package/dist/translate/enums.d.ts +34 -0
  259. package/dist/translate/enums.d.ts.map +1 -0
  260. package/dist/translate/enums.js +126 -0
  261. package/dist/translate/enums.js.map +1 -0
  262. package/dist/translate/index.d.ts +4 -0
  263. package/dist/translate/index.d.ts.map +1 -0
  264. package/dist/translate/index.js +4 -0
  265. package/dist/translate/index.js.map +1 -0
  266. package/dist/translate/lookups.d.ts +37 -0
  267. package/dist/translate/lookups.d.ts.map +1 -0
  268. package/dist/translate/lookups.js +61 -0
  269. package/dist/translate/lookups.js.map +1 -0
  270. package/dist/translate/strings.d.ts +40 -0
  271. package/dist/translate/strings.d.ts.map +1 -0
  272. package/dist/translate/strings.js +92 -0
  273. package/dist/translate/strings.js.map +1 -0
  274. package/package.json +37 -0
@@ -0,0 +1,369 @@
1
+ import { ShipSchema } from "../schema/output/ship.js";
2
+ import { normalizeIdentity } from "./identity.js";
3
+ import { normalizeStats } from "./stats.js";
4
+ import { normalizeSlots } from "./slots.js";
5
+ import { normalizeSkills } from "./skills.js";
6
+ import { normalizeConstruction } from "./construction.js";
7
+ import { normalizeRetrofit } from "./retrofit.js";
8
+ import { normalizeMisc } from "./misc.js";
9
+ import { normalizeSkins } from "./skins.js";
10
+ function buildIndexes(ctx) {
11
+ // Build groupByGroupType: scan ship_data_group and index by group_type
12
+ const groupByGroupType = new Map();
13
+ for (const row of Object.values(ctx.en.group)) {
14
+ if (row === undefined)
15
+ continue;
16
+ groupByGroupType.set(String(row.group_type), row);
17
+ }
18
+ // Build researchGroupTypes: blueprint keys are themselves group_types
19
+ // (confirmed: all 42 blueprint keys appear as group_type values in ship_data_template)
20
+ const researchGroupTypes = new Set();
21
+ const blueprintVersionMap = new Map();
22
+ for (const [key, bpRow] of Object.entries(ctx.en.blueprint)) {
23
+ researchGroupTypes.add(key);
24
+ if (bpRow?.blueprint_version !== undefined) {
25
+ blueprintVersionMap.set(key, bpRow.blueprint_version);
26
+ }
27
+ }
28
+ return { groupByGroupType, researchGroupTypes, blueprintVersionMap };
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // buildShip
32
+ // ---------------------------------------------------------------------------
33
+ export function buildShip(groupType, ctx, indexes) {
34
+ const idx = indexes ?? buildIndexes(ctx);
35
+ // -------------------------------------------------------------------------
36
+ // 1. Resolve LB rows for this group_type
37
+ // -------------------------------------------------------------------------
38
+ const rowIds = [];
39
+ for (const [key, row] of Object.entries(ctx.en.template)) {
40
+ if (row === undefined)
41
+ continue;
42
+ if (String(row.group_type) !== groupType)
43
+ continue;
44
+ // Skip 9-prefix rows (promo/alt forms)
45
+ if (key.startsWith("9"))
46
+ continue;
47
+ rowIds.push(key);
48
+ }
49
+ if (rowIds.length === 0) {
50
+ return null;
51
+ }
52
+ // Sort by last digit (LB stage suffix: 1/2/3/4)
53
+ rowIds.sort((a, b) => {
54
+ const lastA = a[a.length - 1] ?? "0";
55
+ const lastB = b[b.length - 1] ?? "0";
56
+ return lastA.localeCompare(lastB);
57
+ });
58
+ // lb0RowId = row ending in "1", lb3RowId = row ending in "4"
59
+ const lb0RowId = rowIds.find((id) => id.endsWith("1")) ?? rowIds[0];
60
+ const lb3RowId = rowIds.find((id) => id.endsWith("4")) ?? rowIds[rowIds.length - 1];
61
+ if (lb0RowId === undefined || lb3RowId === undefined) {
62
+ return null;
63
+ }
64
+ // -------------------------------------------------------------------------
65
+ // 2. Resolve the group row (pre-indexed)
66
+ // -------------------------------------------------------------------------
67
+ const groupRow = idx.groupByGroupType.get(groupType);
68
+ if (groupRow === undefined) {
69
+ return null;
70
+ }
71
+ // -------------------------------------------------------------------------
72
+ // 3. Determine isResearch and blueprintVersion
73
+ // -------------------------------------------------------------------------
74
+ const isResearch = idx.researchGroupTypes.has(groupType);
75
+ const blueprintVersion = idx.blueprintVersionMap.get(groupType);
76
+ // -------------------------------------------------------------------------
77
+ // 4. Determine isEnReleased
78
+ // True if the LB3 statistics row has a non-empty, non-Chinese name
79
+ // -------------------------------------------------------------------------
80
+ function isLikelyChinese(s) {
81
+ return /[\u4e00-\u9fff]/.test(s);
82
+ }
83
+ const lb3Stats = ctx.en.statistics[lb3RowId];
84
+ const lb3Name = lb3Stats?.name ?? "";
85
+ const isEnReleased = lb3Name.trim().length > 0 && !isLikelyChinese(lb3Name);
86
+ // -------------------------------------------------------------------------
87
+ // 5. Determine strengthen_id from lb0 template row
88
+ // -------------------------------------------------------------------------
89
+ const lb0Template = ctx.en.template[lb0RowId];
90
+ const strengthenId = lb0Template !== undefined
91
+ ? String(lb0Template.strengthen_id)
92
+ : groupType;
93
+ // ship type from lb3 template
94
+ const lb3Template = ctx.en.template[lb3RowId];
95
+ const shipType = lb3Template?.type ?? 0;
96
+ const starMax = lb3Template?.star_max ?? 6;
97
+ // initialStar: use rarity (from statistics) for the scrap medal lookup.
98
+ // AzurAPI historically mapped rarity → ship_data_by_star tier for medals:
99
+ // rarity 5 (Super Rare) → star 5 → 10 medals.
100
+ const initialStar = lb3Stats?.rarity ?? starMax;
101
+ // -------------------------------------------------------------------------
102
+ // 6. Call each normalizer
103
+ // -------------------------------------------------------------------------
104
+ // Identity
105
+ const identityOutput = normalizeIdentity({
106
+ groupType,
107
+ rowIds,
108
+ en: {
109
+ template: ctx.en.template,
110
+ statistics: ctx.en.statistics,
111
+ group: ctx.en.group,
112
+ blueprint: ctx.en.blueprint,
113
+ fleetTechShipTemplate: ctx.en.fleetTechShipTemplate,
114
+ fleetTechShipClass: ctx.en.fleetTechShipClass,
115
+ shipDataByType: ctx.en.shipDataByType,
116
+ },
117
+ cn: ctx.cn !== undefined ? { statistics: ctx.cn.statistics } : undefined,
118
+ jp: ctx.jp !== undefined ? { statistics: ctx.jp.statistics } : undefined,
119
+ isEnReleased,
120
+ isResearch,
121
+ blueprintVersion,
122
+ groupRow,
123
+ lookups: ctx.lookups,
124
+ });
125
+ // Stats
126
+ const statsOutput = normalizeStats({
127
+ lb3RowId,
128
+ groupType,
129
+ strengthenId,
130
+ en: {
131
+ statistics: ctx.en.statistics,
132
+ strengthen: ctx.en.strengthen,
133
+ trans: ctx.en.trans,
134
+ transformDataTemplate: ctx.en.transformDataTemplate,
135
+ },
136
+ });
137
+ // Slots
138
+ const slots = normalizeSlots({
139
+ lb0RowId,
140
+ lb3RowId,
141
+ template: ctx.en.template,
142
+ statistics: ctx.en.statistics,
143
+ lookups: ctx.lookups,
144
+ });
145
+ // Skills
146
+ const skillsOutput = normalizeSkills({
147
+ rowIds,
148
+ groupType,
149
+ en: {
150
+ template: ctx.en.template,
151
+ breakout: ctx.en.breakout,
152
+ skillDataTemplate: ctx.en.skillDataTemplate,
153
+ skillDataDisplay: ctx.en.skillDataDisplay,
154
+ trans: ctx.en.trans,
155
+ transformDataTemplate: ctx.en.transformDataTemplate,
156
+ },
157
+ });
158
+ // Construction
159
+ const constructionOutput = normalizeConstruction({
160
+ groupType,
161
+ groupRow,
162
+ lb3RowId,
163
+ shipType,
164
+ starMax,
165
+ initialStar,
166
+ fleetTechShipTemplate: ctx.en.fleetTechShipTemplate,
167
+ shipDataCreateExchange: ctx.en.exchange,
168
+ shipDataByType: ctx.en.shipDataByType,
169
+ shipDataByStar: ctx.en.shipDataByStar,
170
+ lookups: ctx.lookups,
171
+ constructionTimeOverride: ctx.overrides?.constructionTimes?.[groupType],
172
+ });
173
+ // Retrofit
174
+ const retrofitOutput = normalizeRetrofit({
175
+ groupType,
176
+ groupRow,
177
+ trans: ctx.en.trans,
178
+ lookups: ctx.lookups,
179
+ });
180
+ // Misc
181
+ const miscOutput = normalizeMisc({
182
+ defaultSkinId: `${groupType}0`,
183
+ skinTemplate: ctx.en.skinTemplate,
184
+ lookups: ctx.lookups,
185
+ artistOverride: ctx.overrides?.artists?.[groupType],
186
+ });
187
+ // Skins
188
+ const skinsOutput = normalizeSkins({
189
+ groupType,
190
+ skinTemplate: ctx.en.skinTemplate,
191
+ shopTemplate: ctx.en.shopTemplate,
192
+ thumbnailBaseUrl: ctx.thumbnailBaseUrl,
193
+ availablePaintings: ctx.availablePaintings,
194
+ });
195
+ // -------------------------------------------------------------------------
196
+ // 7. Merge all partials into a Ship object
197
+ // -------------------------------------------------------------------------
198
+ const shipCandidate = {
199
+ id: identityOutput.id,
200
+ names: identityOutput.names,
201
+ rarity: identityOutput.rarity,
202
+ stars: identityOutput.stars,
203
+ thumbnail: identityOutput.thumbnail,
204
+ class: identityOutput.class,
205
+ hullType: identityOutput.hullType,
206
+ nationality: identityOutput.nationality,
207
+ stats: statsOutput.stats,
208
+ enhanceValue: statsOutput.enhanceValue,
209
+ slots,
210
+ skills: skillsOutput.skills,
211
+ retrofit: retrofitOutput.retrofit,
212
+ skins: skinsOutput.skins,
213
+ };
214
+ if (identityOutput.wikiUrl !== undefined) {
215
+ shipCandidate.wikiUrl = identityOutput.wikiUrl;
216
+ }
217
+ if (identityOutput.isEnReleased === false) {
218
+ shipCandidate.isEnReleased = false;
219
+ }
220
+ if (skillsOutput.limitBreaks !== undefined) {
221
+ shipCandidate.limitBreaks = skillsOutput.limitBreaks;
222
+ }
223
+ if (constructionOutput.construction !== undefined) {
224
+ shipCandidate.construction = constructionOutput.construction;
225
+ }
226
+ if (constructionOutput.scrapValue !== undefined) {
227
+ shipCandidate.scrapValue = constructionOutput.scrapValue;
228
+ }
229
+ if (constructionOutput.fleetTech !== undefined) {
230
+ shipCandidate.fleetTech = constructionOutput.fleetTech;
231
+ }
232
+ if (constructionOutput.obtainedFrom !== undefined) {
233
+ shipCandidate.obtainedFrom = constructionOutput.obtainedFrom;
234
+ }
235
+ if (retrofitOutput.retrofitHullType !== undefined) {
236
+ shipCandidate.retrofitHullType = retrofitOutput.retrofitHullType;
237
+ }
238
+ if (miscOutput.misc !== undefined) {
239
+ shipCandidate.misc = miscOutput.misc;
240
+ }
241
+ // -------------------------------------------------------------------------
242
+ // 8. Validate with ShipSchema.parse
243
+ // -------------------------------------------------------------------------
244
+ const parseResult = ShipSchema.safeParse(shipCandidate);
245
+ if (!parseResult.success) {
246
+ console.error(`[buildShip] ShipSchema.parse failed for group_type="${groupType}":`, parseResult.error.message);
247
+ return null;
248
+ }
249
+ return parseResult.data;
250
+ }
251
+ // ---------------------------------------------------------------------------
252
+ // buildAllShips
253
+ // ---------------------------------------------------------------------------
254
+ export function buildAllShips(ctx) {
255
+ // Pre-build shared indexes once for O(n) total cost
256
+ const indexes = buildIndexes(ctx);
257
+ // Collect all unique group_types from EN template, excluding 9-prefix rows
258
+ const groupTypeSet = new Set();
259
+ for (const [key, row] of Object.entries(ctx.en.template)) {
260
+ if (row === undefined)
261
+ continue;
262
+ if (key.startsWith("9"))
263
+ continue;
264
+ groupTypeSet.add(String(row.group_type));
265
+ }
266
+ const ships = [];
267
+ let failCount = 0;
268
+ for (const groupType of groupTypeSet) {
269
+ try {
270
+ const ship = buildShip(groupType, ctx, indexes);
271
+ if (ship !== null) {
272
+ ships.push(ship);
273
+ }
274
+ }
275
+ catch (err) {
276
+ failCount++;
277
+ console.error(`[buildAllShips] Unexpected error for group_type="${groupType}":`, err instanceof Error ? err.message : String(err));
278
+ }
279
+ }
280
+ if (failCount > 0) {
281
+ console.warn(`[buildAllShips] ${failCount} ships threw unexpected errors and were skipped.`);
282
+ }
283
+ // Sort by id numerically
284
+ ships.sort((a, b) => Number(a.id) - Number(b.id));
285
+ return ships;
286
+ }
287
+ // ---------------------------------------------------------------------------
288
+ // createBuildContext
289
+ // ---------------------------------------------------------------------------
290
+ /**
291
+ * Create a BuildContext by loading all EN raw tables plus optional CN/JP overlays.
292
+ * This is a convenience function for scripts/build-data.ts.
293
+ */
294
+ export async function createBuildContext(options) {
295
+ const { loadShipDataTemplate, loadShipDataStatistics, loadShipDataBreakout, loadShipDataStrengthen, loadShipDataBlueprint, loadShipDataTrans, loadShipDataGroup, loadShipSkinTemplate, loadShopTemplate, loadShipDataCreateExchange, loadShipDataByType, loadShipDataByStar, loadFleetTechShipTemplate, loadFleetTechShipClass, loadSkillDataTemplate, loadSkillDataDisplay, loadTransformDataTemplate, loadEquipDataByType, loadVoiceActorCn, loadAttributeInfoByType, } = await import("../ingest/files.js");
296
+ const { createLookups } = await import("../translate/lookups.js");
297
+ const enTemplate = loadShipDataTemplate("EN");
298
+ const enStatistics = loadShipDataStatistics("EN");
299
+ const enBreakout = loadShipDataBreakout("EN");
300
+ const enStrengthen = loadShipDataStrengthen("EN");
301
+ const enBlueprint = loadShipDataBlueprint("EN");
302
+ const enTrans = loadShipDataTrans("EN");
303
+ const enGroup = loadShipDataGroup("EN");
304
+ const enSkinTemplate = loadShipSkinTemplate("EN");
305
+ const enShopTemplate = loadShopTemplate("EN");
306
+ const enExchange = loadShipDataCreateExchange("EN");
307
+ const enShipDataByType = loadShipDataByType("EN");
308
+ const enShipDataByStar = loadShipDataByStar("EN");
309
+ const enFleetTechShipTemplate = loadFleetTechShipTemplate("EN");
310
+ const enFleetTechShipClass = loadFleetTechShipClass("EN");
311
+ const enSkillDataTemplate = loadSkillDataTemplate("EN");
312
+ const enSkillDataDisplay = loadSkillDataDisplay("EN");
313
+ const enTransformDataTemplate = loadTransformDataTemplate("EN");
314
+ const enEquipDataByType = loadEquipDataByType("EN");
315
+ const enVoiceActorCn = loadVoiceActorCn("EN");
316
+ const enAttributeInfoByType = loadAttributeInfoByType("EN");
317
+ const lookups = createLookups({
318
+ fleetTechShipTemplate: enFleetTechShipTemplate,
319
+ fleetTechShipClass: enFleetTechShipClass,
320
+ shipDataByType: enShipDataByType,
321
+ equipDataByType: enEquipDataByType,
322
+ skillDataTemplate: enSkillDataTemplate,
323
+ skillDataDisplay: enSkillDataDisplay,
324
+ voiceActorCn: enVoiceActorCn,
325
+ });
326
+ let cn;
327
+ if (options?.loadCn === true) {
328
+ const cnStats = loadShipDataStatistics("CN");
329
+ const cnGroup = loadShipDataGroup("CN");
330
+ const cnTemplate = loadShipDataTemplate("CN");
331
+ cn = { statistics: cnStats, group: cnGroup, template: cnTemplate };
332
+ }
333
+ let jp;
334
+ if (options?.loadJp === true) {
335
+ const jpStats = loadShipDataStatistics("JP");
336
+ jp = { statistics: jpStats };
337
+ }
338
+ return {
339
+ region: "EN",
340
+ en: {
341
+ template: enTemplate,
342
+ statistics: enStatistics,
343
+ breakout: enBreakout,
344
+ strengthen: enStrengthen,
345
+ blueprint: enBlueprint,
346
+ trans: enTrans,
347
+ group: enGroup,
348
+ skinTemplate: enSkinTemplate,
349
+ shopTemplate: enShopTemplate,
350
+ exchange: enExchange,
351
+ shipDataByType: enShipDataByType,
352
+ shipDataByStar: enShipDataByStar,
353
+ fleetTechShipTemplate: enFleetTechShipTemplate,
354
+ fleetTechShipClass: enFleetTechShipClass,
355
+ skillDataTemplate: enSkillDataTemplate,
356
+ skillDataDisplay: enSkillDataDisplay,
357
+ transformDataTemplate: enTransformDataTemplate,
358
+ equipDataByType: enEquipDataByType,
359
+ voiceActorCn: enVoiceActorCn,
360
+ attributeInfoByType: enAttributeInfoByType,
361
+ },
362
+ cn,
363
+ jp,
364
+ overrides: options?.overrides,
365
+ thumbnailBaseUrl: options?.thumbnailBaseUrl,
366
+ lookups,
367
+ };
368
+ }
369
+ //# sourceMappingURL=ship.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship.js","sourceRoot":"","sources":["../../src/normalize/ship.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Ship } from "../schema/output/ship.js";
2
+ import type { ShipDataTemplate, ShipDataBreakout, SkillDataTemplate, SkillDataDisplay, ShipDataTrans, TransformDataTemplate } from "../schema/raw/index.js";
3
+ export interface SkillsInputs {
4
+ rowIds: string[];
5
+ en: {
6
+ template: ShipDataTemplate;
7
+ breakout: ShipDataBreakout;
8
+ skillDataTemplate: SkillDataTemplate;
9
+ skillDataDisplay: SkillDataDisplay;
10
+ trans?: ShipDataTrans;
11
+ transformDataTemplate?: TransformDataTemplate;
12
+ };
13
+ groupType: string;
14
+ }
15
+ export interface SkillsOutput {
16
+ skills: Ship["skills"];
17
+ limitBreaks?: Ship["limitBreaks"];
18
+ }
19
+ export declare function normalizeSkills(inputs: SkillsInputs): SkillsOutput;
20
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/normalize/skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAYhC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,EAAE,EAAE;QACF,QAAQ,EAAE,gBAAgB,CAAC;QAC3B,QAAQ,EAAE,gBAAgB,CAAC;QAC3B,iBAAiB,EAAE,iBAAiB,CAAC;QACrC,gBAAgB,EAAE,gBAAgB,CAAC;QACnC,KAAK,CAAC,EAAE,aAAa,CAAC;QACtB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;KAC/C,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,WAAW,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;CACnC;AAsDD,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CA8KlE"}
@@ -0,0 +1,192 @@
1
+ import { skillColor } from "../translate/enums.js";
2
+ import { extractMaxLevelSubstitutions, substitutePlaceholders, splitLimitBreakBonuses, } from "../translate/strings.js";
3
+ // ---------------------------------------------------------------------------
4
+ // Internal helpers
5
+ // ---------------------------------------------------------------------------
6
+ /**
7
+ * Strip trailing Roman numeral suffix (Ⅰ–Ⅴ or ASCII I/II/III/IV/V) from a skill
8
+ * name, returning just the "root" portion for comparison purposes.
9
+ *
10
+ * Examples:
11
+ * "All Out Assault Ⅰ" → "All Out Assault"
12
+ * "All Out Assault Ⅱ" → "All Out Assault"
13
+ * "Smokescreen: Light Cruisers" → "Smokescreen: Light Cruisers"
14
+ * "Burn Order" → "Burn Order"
15
+ */
16
+ function rootSkillName(name) {
17
+ // Trim Unicode Roman numerals (Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ) and ASCII (I–X variants)
18
+ // at end of string, optionally preceded by a colon/period and more text.
19
+ return name
20
+ .replace(/\s+[ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩiIvVxX]+(?:[:.][^\s]*)*\s*$/, "")
21
+ .trim();
22
+ }
23
+ /**
24
+ * Normalize a `skill_id` value (number | number[] | undefined) to a number[].
25
+ */
26
+ function normalizeSkillIdList(raw) {
27
+ if (raw === undefined)
28
+ return [];
29
+ if (Array.isArray(raw))
30
+ return raw;
31
+ return [raw];
32
+ }
33
+ /**
34
+ * Build the description string for a skill.
35
+ */
36
+ function buildDescription(skillTemplate, idStr) {
37
+ const row = skillTemplate[idStr];
38
+ if (row === undefined)
39
+ return "";
40
+ const rawDesc = row.desc;
41
+ if (rawDesc === undefined || rawDesc === "")
42
+ return "";
43
+ const substitutions = extractMaxLevelSubstitutions(row.desc_add, row.max_level ?? 10);
44
+ return substitutePlaceholders(rawDesc, substitutions);
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // Main
48
+ // ---------------------------------------------------------------------------
49
+ export function normalizeSkills(inputs) {
50
+ const { rowIds, en, groupType } = inputs;
51
+ const { template, breakout, skillDataTemplate, skillDataDisplay, trans, transformDataTemplate, } = en;
52
+ // -------------------------------------------------------------------------
53
+ // 1. Resolve the LB3 row ID (the row whose key ends with "4", or last entry).
54
+ // -------------------------------------------------------------------------
55
+ const lb3RowId = rowIds.find((id) => id.endsWith("4")) ?? rowIds[rowIds.length - 1] ?? groupType;
56
+ // -------------------------------------------------------------------------
57
+ // 2. Get the base skill ID list from the LB3 row.
58
+ // -------------------------------------------------------------------------
59
+ const lb3Template = template[lb3RowId];
60
+ const baseSkillIds = lb3Template?.buff_list_display ?? [];
61
+ // -------------------------------------------------------------------------
62
+ // 3. Apply retrofit skill upgrades (if any).
63
+ //
64
+ // TODO: The retrofit skill-upgrade/replace logic is a best-effort
65
+ // approximation. AzurAPI's historical output was inconsistent here; some
66
+ // versions replaced the base skill, others appended. The implementation
67
+ // below attempts a root-name match and replaces when found, otherwise
68
+ // appends. If this causes issues, simplify to just using `baseSkillIds`
69
+ // directly.
70
+ // -------------------------------------------------------------------------
71
+ let finalSkillIds = [...baseSkillIds];
72
+ if (trans !== undefined && transformDataTemplate !== undefined) {
73
+ const transRow = trans[groupType];
74
+ if (transRow !== undefined) {
75
+ // Collect all retrofit skill IDs: from trans.skill_id + each transform node's skill_id
76
+ const retrofitSkillIds = new Set();
77
+ // From the top-level trans row
78
+ const topSkillIds = normalizeSkillIdList(transRow.skill_id);
79
+ for (const sid of topSkillIds) {
80
+ if (sid !== 0)
81
+ retrofitSkillIds.add(sid);
82
+ }
83
+ // From each transform_data_template node referenced in transform_list
84
+ const seenTransformIds = new Set();
85
+ for (const outerList of transRow.transform_list) {
86
+ for (const pair of outerList) {
87
+ const transformId = pair[1];
88
+ if (transformId === undefined || seenTransformIds.has(transformId))
89
+ continue;
90
+ seenTransformIds.add(transformId);
91
+ const tRow = transformDataTemplate[String(transformId)];
92
+ if (tRow === undefined)
93
+ continue;
94
+ const tSkillIds = normalizeSkillIdList(tRow.skill_id);
95
+ for (const sid of tSkillIds) {
96
+ if (sid !== 0)
97
+ retrofitSkillIds.add(sid);
98
+ }
99
+ }
100
+ }
101
+ // Merge retrofit skills: replace base skill if root names match, else append
102
+ for (const retrofitId of retrofitSkillIds) {
103
+ const retrofitRow = skillDataTemplate[String(retrofitId)];
104
+ if (retrofitRow === undefined)
105
+ continue;
106
+ const retrofitName = retrofitRow.name;
107
+ if (retrofitName === undefined)
108
+ continue;
109
+ const retrofitRoot = rootSkillName(retrofitName);
110
+ // Try to find a base skill with the same root name
111
+ let replaced = false;
112
+ for (let i = 0; i < finalSkillIds.length; i++) {
113
+ const baseId = finalSkillIds[i];
114
+ if (baseId === undefined)
115
+ continue;
116
+ const baseRow = skillDataTemplate[String(baseId)];
117
+ if (baseRow === undefined)
118
+ continue;
119
+ const baseName = baseRow.name;
120
+ if (baseName === undefined)
121
+ continue;
122
+ const baseRoot = rootSkillName(baseName);
123
+ if (baseRoot === retrofitRoot && baseRoot.length > 0) {
124
+ finalSkillIds[i] = retrofitId;
125
+ replaced = true;
126
+ break;
127
+ }
128
+ }
129
+ if (!replaced) {
130
+ // No matching base skill — append if not already present
131
+ if (!finalSkillIds.includes(retrofitId)) {
132
+ finalSkillIds.push(retrofitId);
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ // -------------------------------------------------------------------------
139
+ // 4. Build skill objects.
140
+ // -------------------------------------------------------------------------
141
+ const skills = [];
142
+ for (const skillId of finalSkillIds) {
143
+ const idStr = String(skillId);
144
+ const skillRow = skillDataTemplate[idStr];
145
+ const displayRow = skillDataDisplay[idStr];
146
+ // Resolve name: prefer skill_data_template, fallback to skill_data_display
147
+ let nameEn = skillRow?.name ?? displayRow?.name;
148
+ if (nameEn === undefined || nameEn.trim() === "") {
149
+ // No name at all — skip this skill
150
+ console.warn(`normalizeSkills: skill ID ${skillId} has no name in skill_data_template or skill_data_display — skipping (group_type ${groupType})`);
151
+ continue;
152
+ }
153
+ nameEn = nameEn.trim();
154
+ const type = skillRow?.type ?? 0;
155
+ const color = skillColor(type);
156
+ const description = buildDescription(skillDataTemplate, idStr);
157
+ skills.push({
158
+ color,
159
+ names: { en: nameEn },
160
+ description,
161
+ });
162
+ }
163
+ // -------------------------------------------------------------------------
164
+ // 5. Build limit breaks.
165
+ //
166
+ // rowIds[0..2] correspond to LB1/LB2/LB3 source rows.
167
+ // The terminal row (index 3, ending in "4") has breakout_view: "None" → skip.
168
+ // -------------------------------------------------------------------------
169
+ // We want the first THREE non-terminal rows: rowIds[0], [1], [2]
170
+ const limitBreaks = [];
171
+ for (let i = 0; i < 3; i++) {
172
+ const rowId = rowIds[i];
173
+ if (rowId === undefined) {
174
+ // Fewer than 3 rows — some ships (e.g. META 4-star ships) may have fewer LB stages
175
+ continue;
176
+ }
177
+ const breakoutRow = breakout[rowId];
178
+ if (breakoutRow === undefined) {
179
+ // Row missing from breakout table — skip
180
+ continue;
181
+ }
182
+ const bonuses = splitLimitBreakBonuses(breakoutRow.breakout_view);
183
+ limitBreaks.push(bonuses);
184
+ }
185
+ // If all three limit-break arrays are empty/absent, omit the field
186
+ const hasLimitBreaks = limitBreaks.length > 0 && limitBreaks.some((lb) => lb.length > 0);
187
+ return {
188
+ skills,
189
+ limitBreaks: hasLimitBreaks ? limitBreaks : undefined,
190
+ };
191
+ }
192
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/normalize/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Ship } from "../schema/output/ship.js";
2
+ import type { ShipSkinTemplate, ShopTemplate } from "../schema/raw/index.js";
3
+ export interface SkinsInputs {
4
+ groupType: string;
5
+ skinTemplate: ShipSkinTemplate;
6
+ shopTemplate: ShopTemplate;
7
+ thumbnailBaseUrl?: string;
8
+ /** Set of available painting filenames (lowercase, no extension) for variant lookup. */
9
+ availablePaintings?: Set<string>;
10
+ }
11
+ export declare function normalizeSkins(inputs: SkinsInputs): {
12
+ skins: Ship["skins"];
13
+ };
14
+ //# sourceMappingURL=skins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skins.d.ts","sourceRoot":"","sources":["../../src/normalize/skins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,wBAAwB,CAAC;AAOhC,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wFAAwF;IACxF,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAClC;AAsED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;CAAE,CAuF5E"}