ts-flp 1.0.0 → 1.0.2

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.
@@ -29,9 +29,9 @@
29
29
  * fs.writeFileSync("project_modified.flp", serializeFlp(modified));
30
30
  * ```
31
31
  */
32
- export { createEvent, createNumberPayload, createTextPayload, findEvents, findFirstEvent, getEventNumber, getEventString, parseFlp, patchEvents, serializeFlp, type FlpEvent, type ParsedFlp } from "./parser/FlpParser.js";
33
- export { getFlVersion, getPPQ, listPlugins, listSamples, readProjectMeta, readProjectTimeInfo, rewriteSamplePaths, writeProjectMeta, writeProjectTimeInfo, type PluginRef, type ProjectMeta, type ProjectTimeInfo, type SampleRef } from "./api/ProjectApi.js";
34
- export { EVENT_ID, EVENT_KIND, getEventFixedSize, getEventKind } from "./generated/events.generated.js";
35
- export { BinaryReader } from "./io/BinaryReader.js";
36
- export { BinaryWriter, encodeVarInt, varIntSize } from "./io/BinaryWriter.js";
32
+ export { createEvent, createNumberPayload, createTextPayload, findEvents, findFirstEvent, getEventNumber, getEventString, parseFlp, patchEvents, serializeFlp, type FlpEvent, type ParsedFlp } from "./src/parser/FlpParser.js";
33
+ export { getFlVersion, getPPQ, listPlugins, listSamples, readProjectMeta, readProjectTimeInfo, rewriteSamplePaths, writeProjectMeta, writeProjectTimeInfo, type PluginRef, type ProjectMeta, type ProjectTimeInfo, type SampleRef } from "./src/api/ProjectApi.js";
34
+ export { EVENT_ID, EVENT_KIND, getEventFixedSize, getEventKind } from "./src/generated/events.generated.js";
35
+ export { BinaryReader } from "./src/io/BinaryReader.js";
36
+ export { BinaryWriter, encodeVarInt, varIntSize } from "./src/io/BinaryWriter.js";
37
37
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EACL,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,UAAU,EAC/D,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EACnH,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,YAAY,EACZ,MAAM,EACN,WAAW,EACX,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,SAAS,EACf,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAG5G,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC"}
@@ -30,12 +30,12 @@
30
30
  * ```
31
31
  */
32
32
  // Re-export parser functions
33
- export { createEvent, createNumberPayload, createTextPayload, findEvents, findFirstEvent, getEventNumber, getEventString, parseFlp, patchEvents, serializeFlp } from "./parser/FlpParser.js";
33
+ export { createEvent, createNumberPayload, createTextPayload, findEvents, findFirstEvent, getEventNumber, getEventString, parseFlp, patchEvents, serializeFlp } from "./src/parser/FlpParser.js";
34
34
  // Re-export API functions
35
- export { getFlVersion, getPPQ, listPlugins, listSamples, readProjectMeta, readProjectTimeInfo, rewriteSamplePaths, writeProjectMeta, writeProjectTimeInfo } from "./api/ProjectApi.js";
35
+ export { getFlVersion, getPPQ, listPlugins, listSamples, readProjectMeta, readProjectTimeInfo, rewriteSamplePaths, writeProjectMeta, writeProjectTimeInfo } from "./src/api/ProjectApi.js";
36
36
  // Re-export event constants
37
- export { EVENT_ID, EVENT_KIND, getEventFixedSize, getEventKind } from "./generated/events.generated.js";
37
+ export { EVENT_ID, EVENT_KIND, getEventFixedSize, getEventKind } from "./src/generated/events.generated.js";
38
38
  // Re-export IO utilities for advanced usage
39
- export { BinaryReader } from "./io/BinaryReader.js";
40
- export { BinaryWriter, encodeVarInt, varIntSize } from "./io/BinaryWriter.js";
39
+ export { BinaryReader } from "./src/io/BinaryReader.js";
40
+ export { BinaryWriter, encodeVarInt, varIntSize } from "./src/io/BinaryWriter.js";
41
41
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,6BAA6B;AAC7B,OAAO,EACL,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,UAAU,EAC/D,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EACpF,MAAM,2BAA2B,CAAC;AAEnC,0BAA0B;AAC1B,OAAO,EACL,YAAY,EACZ,MAAM,EACN,WAAW,EACX,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EAKrB,MAAM,yBAAyB,CAAC;AAEjC,4BAA4B;AAC5B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAE5G,4CAA4C;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * FLP Parser unit tests
3
+ * Converted from flparser_unitest.py
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=flparser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flparser.test.d.ts","sourceRoot":"","sources":["../../test/flparser.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,345 @@
1
+ /**
2
+ * FLP Parser unit tests
3
+ * Converted from flparser_unitest.py
4
+ */
5
+ import * as fs from "fs";
6
+ import * as path from "path";
7
+ import { beforeAll, describe, expect, it } from "vitest";
8
+ import { getFlVersion, listPlugins, listSamples, parseFlp, readProjectMeta, readProjectTimeInfo, rewriteSamplePaths, serializeFlp, writeProjectMeta, writeProjectTimeInfo } from "../index.js";
9
+ // Test configuration
10
+ const TEST_PROJS_DIR = path.join(import.meta.dirname, "..", "test_projs");
11
+ const EXPECTED_FL_VERSION = "24"; // Update this to match your FL Studio version
12
+ /**
13
+ * Helper function to get test FLP files
14
+ */
15
+ function getTestableProjects() {
16
+ if (!fs.existsSync(TEST_PROJS_DIR)) {
17
+ return [];
18
+ }
19
+ return fs.readdirSync(TEST_PROJS_DIR).filter((f) => f.endsWith(".flp"));
20
+ }
21
+ /**
22
+ * Helper function to load and parse a test FLP file
23
+ */
24
+ function loadTestProject(filename) {
25
+ const filepath = path.join(TEST_PROJS_DIR, filename);
26
+ const buffer = fs.readFileSync(filepath);
27
+ return parseFlp(buffer);
28
+ }
29
+ function randomString(length) {
30
+ let result = "";
31
+ while (result.length < length) {
32
+ result += Math.random().toString(36).substring(2);
33
+ }
34
+ return result.substring(0, length);
35
+ }
36
+ function randomBPM() {
37
+ // return a random BPM between 50 and 190
38
+ return Math.floor(Math.random() * 140) + 50;
39
+ }
40
+ function randomDecimalBPM() {
41
+ // Random BPM with decimals between 60 and 200
42
+ return Math.floor(Math.random() * 140000 + 60000) / 1000;
43
+ }
44
+ function randomTimestamp() {
45
+ // Random date between 2020 and 2025
46
+ const start = new Date(2020, 0, 1).getTime();
47
+ const end = new Date(2025, 11, 31).getTime();
48
+ return new Date(start + Math.random() * (end - start));
49
+ }
50
+ function randomWorkTime() {
51
+ // Random work time between 0 and 1000000 seconds (~277 hours)
52
+ return Math.floor(Math.random() * 1000000);
53
+ }
54
+ function randomEmoji() {
55
+ const emojis = ["🎵", "🎹", "🎸", "🥁", "🎤", "🔊", "🎧", "🎼", "🤓", "👨‍🍳", "🔥", "💯", "✨", "🚀"];
56
+ return emojis[Math.floor(Math.random() * emojis.length)];
57
+ }
58
+ describe("FLP Parser", () => {
59
+ const testProjects = getTestableProjects();
60
+ beforeAll(() => {
61
+ if (testProjects.length === 0) {
62
+ console.warn(`No test projects found in ${TEST_PROJS_DIR}`);
63
+ console.warn("Create a 'test_projs' folder with .flp files to run tests");
64
+ }
65
+ });
66
+ describe("Basic Parsing", () => {
67
+ it.skipIf(testProjects.length === 0)("should parse FLP file without errors", () => {
68
+ const project = loadTestProject(testProjects[0]);
69
+ expect(project).toBeDefined();
70
+ expect(project.events).toBeDefined();
71
+ expect(project.events.length).toBeGreaterThan(0);
72
+ });
73
+ it.skipIf(testProjects.length === 0)("should detect FL version", () => {
74
+ const project = loadTestProject(testProjects[0]);
75
+ const version = getFlVersion(project);
76
+ expect(version).toBeDefined();
77
+ expect(version.length).toBeGreaterThan(0);
78
+ console.log(`Detected FL version: ${version}`);
79
+ });
80
+ it.skipIf(testProjects.length === 0)(`should be FL Studio version ${EXPECTED_FL_VERSION}.x`, () => {
81
+ const project = loadTestProject(testProjects[0]);
82
+ const version = getFlVersion(project);
83
+ expect(version.startsWith(EXPECTED_FL_VERSION)).toBe(true);
84
+ });
85
+ });
86
+ describe("Round-trip Stability", () => {
87
+ it.skipIf(testProjects.length === 0)("should produce identical output when parsing and re-serializing without changes", () => {
88
+ const filepath = path.join(TEST_PROJS_DIR, testProjects[0]);
89
+ const originalBuffer = fs.readFileSync(filepath);
90
+ const parsed = parseFlp(originalBuffer);
91
+ const reserialized = serializeFlp(parsed);
92
+ expect(reserialized.length).toBe(originalBuffer.length);
93
+ expect(reserialized.equals(originalBuffer)).toBe(true);
94
+ });
95
+ });
96
+ describe("Case 1: Basic metadata (title, artist, description, genre)", () => {
97
+ it.skipIf(testProjects.length === 0)("should read and write basic metadata", () => {
98
+ const project = loadTestProject(testProjects[0]);
99
+ const name = randomString(10);
100
+ const artist = randomString(10);
101
+ const description = randomString(100);
102
+ const genre = randomString(15);
103
+ const modified = writeProjectMeta(project, {
104
+ name: name,
105
+ artist: artist,
106
+ description: description,
107
+ genre: genre,
108
+ });
109
+ const meta = readProjectMeta(modified);
110
+ expect(meta.name).toBe(name);
111
+ expect(meta.artist).toBe(artist);
112
+ expect(meta.description).toContain(description);
113
+ expect(meta.genre).toBe(genre);
114
+ });
115
+ });
116
+ describe("Case 2: Metadata with genre and tempo", () => {
117
+ it.skipIf(testProjects.length === 0)("should read and write metadata with genre and tempo", () => {
118
+ const project = loadTestProject(testProjects[0]);
119
+ const name = randomString(10);
120
+ const artist = randomString(10);
121
+ const description = randomString(100);
122
+ const genre = randomString(15);
123
+ const bpm = randomBPM();
124
+ const modified = writeProjectMeta(project, {
125
+ name: name,
126
+ artist: artist,
127
+ description: description,
128
+ genre: genre,
129
+ bpm: bpm,
130
+ });
131
+ const meta = readProjectMeta(modified);
132
+ expect(meta.name).toBe(name);
133
+ expect(meta.artist).toBe(artist);
134
+ expect(meta.description).toContain(description);
135
+ expect(meta.genre).toBe(genre);
136
+ expect(meta.bpm).toBe(bpm);
137
+ });
138
+ });
139
+ describe("Case 3: Decimal tempo", () => {
140
+ it.skipIf(testProjects.length === 0)("should handle decimal tempo values", () => {
141
+ const project = loadTestProject(testProjects[0]);
142
+ const name = randomString(10);
143
+ const bpm = randomBPM();
144
+ const modified = writeProjectMeta(project, {
145
+ name: name,
146
+ bpm: bpm,
147
+ });
148
+ const meta = readProjectMeta(modified);
149
+ // BPM is stored as integer * 1000, so we get 3 decimal places precision
150
+ expect(meta.bpm).toBeCloseTo(bpm, 3);
151
+ });
152
+ });
153
+ describe("Case 4: Type coercion", () => {
154
+ it.skipIf(testProjects.length === 0)("should handle numeric values as strings", () => {
155
+ const project = loadTestProject(testProjects[0]);
156
+ const bpm = randomBPM();
157
+ // In TypeScript we enforce types, but we test that numeric strings work
158
+ const modified = writeProjectMeta(project, {
159
+ name: String(89465),
160
+ description: String(10231658784241),
161
+ bpm: bpm,
162
+ });
163
+ const meta = readProjectMeta(modified);
164
+ expect(meta.name).toBe("89465");
165
+ expect(meta.description).toBe("10231658784241");
166
+ expect(meta.bpm).toBeCloseTo(bpm, 3);
167
+ });
168
+ });
169
+ describe("Case 5: Samples", () => {
170
+ it.skipIf(testProjects.length === 0)("should list samples", () => {
171
+ const project = loadTestProject(testProjects[0]);
172
+ const samples = listSamples(project);
173
+ // Just verify we can list samples without error
174
+ expect(Array.isArray(samples)).toBe(true);
175
+ console.log(`Found ${samples.length} samples`);
176
+ if (samples.length > 0) {
177
+ expect(samples[0]).toHaveProperty("path");
178
+ expect(samples[0]).toHaveProperty("eventIndex");
179
+ }
180
+ });
181
+ it.skipIf(testProjects.length === 0)("should rewrite sample paths with random prefix", () => {
182
+ const project = loadTestProject(testProjects[0]);
183
+ const originalSamples = listSamples(project);
184
+ if (originalSamples.length > 0) {
185
+ const randomPrefix = randomString(8);
186
+ const modified = rewriteSamplePaths(project, (oldPath) => oldPath.replace("C:\\", `${randomPrefix}:\\`));
187
+ const newSamples = listSamples(modified);
188
+ expect(newSamples.length).toBe(originalSamples.length);
189
+ // Verify at least one path was modified
190
+ const modifiedPaths = newSamples.filter((s) => s.path.includes(randomPrefix));
191
+ if (originalSamples.some((s) => s.path.includes("C:\\"))) {
192
+ expect(modifiedPaths.length).toBeGreaterThan(0);
193
+ }
194
+ }
195
+ });
196
+ });
197
+ describe("Case 6: Unicode/Emoji support", () => {
198
+ it.skipIf(testProjects.length === 0)("should handle emojis in metadata", () => {
199
+ const project = loadTestProject(testProjects[0]);
200
+ const emoji1 = randomEmoji();
201
+ const emoji2 = randomEmoji();
202
+ const baseName = randomString(10);
203
+ const artist = randomString(10);
204
+ const description = randomString(50);
205
+ const nameWithEmoji = `${baseName} ${emoji1}${emoji2}`;
206
+ const descWithEmoji = `${description} ${emoji1}`;
207
+ const modified = writeProjectMeta(project, {
208
+ name: nameWithEmoji,
209
+ artist: artist,
210
+ description: descWithEmoji,
211
+ });
212
+ const meta = readProjectMeta(modified);
213
+ expect(meta.name).toBe(nameWithEmoji);
214
+ expect(meta.artist).toBe(artist);
215
+ expect(meta.description).toBe(descWithEmoji);
216
+ });
217
+ });
218
+ describe("Case 7: createdAt timestamp", () => {
219
+ it.skipIf(testProjects.length === 0)("should read and write creation date", () => {
220
+ const project = loadTestProject(testProjects[0]);
221
+ const testDate = randomTimestamp();
222
+ const modified = writeProjectTimeInfo(project, {
223
+ creationDate: testDate,
224
+ });
225
+ const timeInfo = readProjectTimeInfo(modified);
226
+ expect(timeInfo.creationDate).toBeDefined();
227
+ if (timeInfo.creationDate) {
228
+ // Allow 1 second tolerance due to float precision
229
+ const diff = Math.abs(timeInfo.creationDate.getTime() - testDate.getTime());
230
+ expect(diff).toBeLessThan(1000);
231
+ }
232
+ });
233
+ });
234
+ describe("Case 8: workTime = 0", () => {
235
+ it.skipIf(testProjects.length === 0)("should handle zero work time", () => {
236
+ const project = loadTestProject(testProjects[0]);
237
+ const modified = writeProjectTimeInfo(project, {
238
+ workTimeSeconds: 0,
239
+ });
240
+ const timeInfo = readProjectTimeInfo(modified);
241
+ expect(timeInfo.workTimeSeconds).toBe(0);
242
+ });
243
+ });
244
+ describe("Case 9: workTime with value", () => {
245
+ it.skipIf(testProjects.length === 0)("should read and write work time", () => {
246
+ const project = loadTestProject(testProjects[0]);
247
+ const workTime = randomWorkTime();
248
+ const modified = writeProjectTimeInfo(project, {
249
+ workTimeSeconds: workTime,
250
+ });
251
+ const timeInfo = readProjectTimeInfo(modified);
252
+ expect(timeInfo.workTimeSeconds).toBeCloseTo(workTime, 1);
253
+ });
254
+ });
255
+ describe("Plugins", () => {
256
+ it.skipIf(testProjects.length === 0)("should list plugins", () => {
257
+ const project = loadTestProject(testProjects[0]);
258
+ const plugins = listPlugins(project);
259
+ expect(Array.isArray(plugins)).toBe(true);
260
+ console.log(`Found ${plugins.length} plugins`);
261
+ for (const plugin of plugins) {
262
+ console.log(` - ${plugin.name} (${plugin.vendor ?? "N/A"})`);
263
+ }
264
+ });
265
+ });
266
+ describe("Combined metadata and time info", () => {
267
+ it.skipIf(testProjects.length === 0)("should handle all modifications together", () => {
268
+ const project = loadTestProject(testProjects[0]);
269
+ // Generate random test data
270
+ const emoji = randomEmoji();
271
+ const name = `${randomString(10)} ${emoji}`;
272
+ const artist = randomString(10);
273
+ const description = randomString(100);
274
+ const genre = randomString(15);
275
+ const bpm = randomDecimalBPM();
276
+ const testDate = randomTimestamp();
277
+ const workTime = randomWorkTime();
278
+ // Apply metadata changes
279
+ let modified = writeProjectMeta(project, {
280
+ name: name,
281
+ artist: artist,
282
+ description: description,
283
+ genre: genre,
284
+ bpm: bpm,
285
+ });
286
+ // Apply time info changes
287
+ modified = writeProjectTimeInfo(modified, {
288
+ creationDate: testDate,
289
+ workTimeSeconds: workTime,
290
+ });
291
+ // Verify all changes
292
+ const meta = readProjectMeta(modified);
293
+ expect(meta.name).toBe(name);
294
+ expect(meta.artist).toBe(artist);
295
+ expect(meta.description).toBe(description);
296
+ expect(meta.genre).toBe(genre);
297
+ expect(meta.bpm).toBeCloseTo(bpm, 3);
298
+ const timeInfo = readProjectTimeInfo(modified);
299
+ expect(timeInfo.workTimeSeconds).toBeCloseTo(workTime, 1);
300
+ // Verify round-trip works
301
+ const serialized = serializeFlp(modified);
302
+ const reparsed = parseFlp(serialized);
303
+ const reMeta = readProjectMeta(reparsed);
304
+ expect(reMeta.name).toBe(name);
305
+ expect(reMeta.artist).toBe(artist);
306
+ expect(reMeta.genre).toBe(genre);
307
+ expect(reMeta.bpm).toBeCloseTo(bpm, 3);
308
+ // Save the modified FLP to demo folder
309
+ const demoDir = path.join(TEST_PROJS_DIR, "demo");
310
+ if (!fs.existsSync(demoDir)) {
311
+ fs.mkdirSync(demoDir, { recursive: true });
312
+ }
313
+ const outputPath = path.join(demoDir, `modified_${testProjects[0]}`);
314
+ fs.writeFileSync(outputPath, serialized);
315
+ console.log(`Saved modified FLP to: ${outputPath}`);
316
+ });
317
+ });
318
+ });
319
+ // Run all tests on each available test project
320
+ describe.skipIf(getTestableProjects().length === 0)("All test projects", () => {
321
+ const projects = getTestableProjects();
322
+ for (const projectFile of projects) {
323
+ describe(`Project: ${projectFile}`, () => {
324
+ it("should parse without errors", () => {
325
+ const project = loadTestProject(projectFile);
326
+ expect(project).toBeDefined();
327
+ expect(project.events.length).toBeGreaterThan(0);
328
+ });
329
+ it("should round-trip without data loss", () => {
330
+ const filepath = path.join(TEST_PROJS_DIR, projectFile);
331
+ const original = fs.readFileSync(filepath);
332
+ const parsed = parseFlp(original);
333
+ const reserialized = serializeFlp(parsed);
334
+ expect(reserialized.equals(original)).toBe(true);
335
+ });
336
+ it("should read metadata", () => {
337
+ const project = loadTestProject(projectFile);
338
+ const meta = readProjectMeta(project);
339
+ expect(meta).toBeDefined();
340
+ console.log(` ${projectFile}: "${meta.name}" @ ${meta.bpm} BPM`);
341
+ });
342
+ });
343
+ }
344
+ });
345
+ //# sourceMappingURL=flparser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flparser.test.js","sourceRoot":"","sources":["../../test/flparser.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,EACX,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EAErB,MAAM,aAAa,CAAC;AAErB,qBAAqB;AACrB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;AAC1E,MAAM,mBAAmB,GAAG,IAAI,CAAC,CAAC,8CAA8C;AAEhF;;GAEG;AACH,SAAS,mBAAmB;IAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,SAAS;IAChB,yCAAyC;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,gBAAgB;IACvB,8CAA8C;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC;AAC3D,CAAC;AAED,SAAS,eAAe;IACtB,oCAAoC;IACpC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,cAAc;IACrB,8DAA8D;IAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACtG,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAE,CAAC;AAC5D,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;IAE3C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,6BAA6B,cAAc,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAChF,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACpE,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAClC,+BAA+B,mBAAmB,IAAI,EACtD,GAAG,EAAE;YACH,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAClC,iFAAiF,EACjF,GAAG,EAAE;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAC7D,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;YACxC,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4DAA4D,EAAE,GAAG,EAAE;QAC1E,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAChF,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAElD,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAE/B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE;gBACzC,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACrD,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAClC,qDAAqD,EACrD,GAAG,EAAE;YACH,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAElD,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;YAExB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE;gBACzC,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,KAAK;gBACZ,GAAG,EAAE,GAAG;aACT,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC9E,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAElD,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;YAExB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE;gBACzC,IAAI,EAAE,IAAI;gBACV,GAAG,EAAE,GAAG;aACT,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACvC,wEAAwE;YACxE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAClC,yCAAyC,EACzC,GAAG,EAAE;YACH,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAElD,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;YAExB,wEAAwE;YACxE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE;gBACzC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC;gBACnB,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC;gBACnC,GAAG,EAAE,GAAG;aACT,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC/D,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAErC,gDAAgD;YAChD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;YAE/C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAClD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,gDAAgD,EAAE,GAAG,EAAE;YAC1F,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAClD,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAE7C,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBACrC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACvD,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAC9C,CAAC;gBAEF,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACzC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBAEvD,wCAAwC;gBACxC,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC9E,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;oBACzD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAClC,kCAAkC,EAClC,GAAG,EAAE;YACH,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAElD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAErC,MAAM,aAAa,GAAG,GAAG,QAAQ,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;YACvD,MAAM,aAAa,GAAG,GAAG,WAAW,IAAI,MAAM,EAAE,CAAC;YAEjD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE;gBACzC,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,aAAa;aAC3B,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAClC,qCAAqC,EACrC,GAAG,EAAE;YACH,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAElD,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;YAEnC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,EAAE;gBAC7C,YAAY,EAAE,QAAQ;aACvB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YAE5C,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;gBAC1B,kDAAkD;gBAClD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CACrD,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAClC,8BAA8B,EAC9B,GAAG,EAAE;YACH,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAElD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,EAAE;gBAC7C,eAAe,EAAE,CAAC;aACnB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAClC,iCAAiC,EACjC,GAAG,EAAE;YACH,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAElD,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;YAElC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,EAAE;gBAC7C,eAAe,EAAE,QAAQ;aAC1B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC/D,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAErC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;YAE/C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,CAAC;YAChE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAClC,0CAA0C,EAC1C,GAAG,EAAE;YACH,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;YAElD,4BAA4B;YAC5B,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;YAElC,yBAAyB;YACzB,IAAI,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE;gBACvC,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,KAAK;gBACZ,GAAG,EAAE,GAAG;aACT,CAAC,CAAC;YAEH,0BAA0B;YAC1B,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,EAAE;gBACxC,YAAY,EAAE,QAAQ;gBACtB,eAAe,EAAE,QAAQ;aAC1B,CAAC,CAAC;YAEH,qBAAqB;YACrB,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAErC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAE1D,0BAA0B;YAC1B,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAEvC,uCAAuC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;QACtD,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+CAA+C;AAC/C,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CACjD,mBAAmB,EACnB,GAAG,EAAE;IACH,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IAEvC,KAAK,MAAM,WAAW,IAAI,QAAQ,EAAE,CAAC;QACnC,QAAQ,CAAC,YAAY,WAAW,EAAE,EAAE,GAAG,EAAE;YACvC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;gBACrC,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;gBAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC9B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;gBAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAClC,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;gBAC9B,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,MAAM,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("vite").UserConfig;
2
+ export default _default;
3
+ //# sourceMappingURL=vitest.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":";AAEA,wBAOG"}
@@ -0,0 +1,10 @@
1
+ import { defineConfig } from "vitest/config";
2
+ export default defineConfig({
3
+ test: {
4
+ include: ["test/**/*.test.ts"],
5
+ globals: false,
6
+ environment: "node",
7
+ testTimeout: 30000,
8
+ },
9
+ });
10
+ //# sourceMappingURL=vitest.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE;QACJ,OAAO,EAAE,CAAC,mBAAmB,CAAC;QAC9B,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,KAAK;KACnB;CACF,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "name": "ts-flp",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Minimalist TypeScript library for parsing and modifying FL Studio project files (.flp)",
5
5
  "type": "module",
6
- "main": "dist/src/index.js",
7
- "module": "dist/src/index.js",
8
- "types": "dist/src/index.d.ts",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
9
  "exports": {
10
10
  ".": {
11
- "import": "./dist/src/index.js",
12
- "types": "./dist/src/index.d.ts"
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
13
  }
14
14
  },
15
15
  "files": [
16
- "dist/src",
16
+ "dist",
17
17
  "README.md",
18
18
  "LICENSE"
19
19
  ],
20
20
  "scripts": {
21
- "dev": "ts-node src/index.ts",
21
+ "dev": "ts-node index.ts",
22
22
  "build": "npm run clean && tsc",
23
23
  "clean": "node -e \"require('fs').rmSync('dist', {recursive:true, force:true})\"",
24
24
  "start": "node dist/index.js",
@@ -45,12 +45,12 @@
45
45
  "license": "GPL-3.0",
46
46
  "repository": {
47
47
  "type": "git",
48
- "url": ""
48
+ "url": "https://github.com/SpendLessDaw/ts-flp"
49
49
  },
50
50
  "bugs": {
51
- "url": ""
51
+ "url": "https://github.com/SpendLessDaw/ts-flp/issues"
52
52
  },
53
- "homepage": "",
53
+ "homepage": "https://github.com/SpendLessDaw/ts-flp",
54
54
  "engines": {
55
55
  "node": ">=18.0.0"
56
56
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EACL,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,UAAU,EAC/D,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EACnH,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,YAAY,EACZ,MAAM,EACN,WAAW,EACX,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAGxG,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,6BAA6B;AAC7B,OAAO,EACL,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,UAAU,EAC/D,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EACpF,MAAM,uBAAuB,CAAC;AAE/B,0BAA0B;AAC1B,OAAO,EACL,YAAY,EACZ,MAAM,EACN,WAAW,EACX,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EAKrB,MAAM,qBAAqB,CAAC;AAE7B,4BAA4B;AAC5B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAExG,4CAA4C;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC"}