@step-wise/module-tree-definition 0.1.0

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 (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/creation/creation.d.ts +3 -0
  4. package/dist/creation/creation.d.ts.map +1 -0
  5. package/dist/creation/creation.js +10 -0
  6. package/dist/creation/flattening.d.ts +3 -0
  7. package/dist/creation/flattening.d.ts.map +1 -0
  8. package/dist/creation/flattening.js +98 -0
  9. package/dist/creation/index.d.ts +4 -0
  10. package/dist/creation/index.d.ts.map +1 -0
  11. package/dist/creation/index.js +3 -0
  12. package/dist/creation/linkProcessing.d.ts +4 -0
  13. package/dist/creation/linkProcessing.d.ts.map +1 -0
  14. package/dist/creation/linkProcessing.js +92 -0
  15. package/dist/creation/prerequisiteProcessing.d.ts +3 -0
  16. package/dist/creation/prerequisiteProcessing.d.ts.map +1 -0
  17. package/dist/creation/prerequisiteProcessing.js +39 -0
  18. package/dist/creation/thresholdOptions.d.ts +4 -0
  19. package/dist/creation/thresholdOptions.d.ts.map +1 -0
  20. package/dist/creation/thresholdOptions.js +39 -0
  21. package/dist/creation/types.d.ts +60 -0
  22. package/dist/creation/types.d.ts.map +1 -0
  23. package/dist/creation/types.js +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +2 -0
  27. package/dist/searching/index.d.ts +5 -0
  28. package/dist/searching/index.d.ts.map +1 -0
  29. package/dist/searching/index.js +4 -0
  30. package/dist/searching/ordering.d.ts +4 -0
  31. package/dist/searching/ordering.d.ts.map +1 -0
  32. package/dist/searching/ordering.js +8 -0
  33. package/dist/searching/prerequisites.d.ts +7 -0
  34. package/dist/searching/prerequisites.d.ts.map +1 -0
  35. package/dist/searching/prerequisites.js +62 -0
  36. package/dist/searching/types.d.ts +4 -0
  37. package/dist/searching/types.d.ts.map +1 -0
  38. package/dist/searching/types.js +1 -0
  39. package/dist/searching/validation.d.ts +13 -0
  40. package/dist/searching/validation.d.ts.map +1 -0
  41. package/dist/searching/validation.js +42 -0
  42. package/dist/tsconfig.tsbuildinfo +1 -0
  43. package/package.json +48 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 Step-Wise
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,242 @@
1
+ # @step-wise/module-tree-definition
2
+
3
+ `@step-wise/module-tree-definition` provides the data structures and utilities needed to define, validate and search a tree of educational modules. Modules are either concepts or skills. The package does not contain a concrete tree and does not manage learner state.
4
+
5
+
6
+ ## Installation
7
+
8
+ ```bash
9
+ npm install @step-wise/module-tree-definition @step-wise/skill-setup
10
+ ```
11
+
12
+ `@step-wise/skill-setup` is only needed when skill definitions use setups.
13
+
14
+
15
+ ## Quick start
16
+
17
+ Creating a module tree has two stages: write a nested definition, then pass it to `createModuleTree` to obtain the validated and fully connected `ModuleTree` used at runtime.
18
+
19
+ ```ts
20
+ import { and } from '@step-wise/skill-setup'
21
+ import { createModuleTree } from '@step-wise/module-tree-definition'
22
+
23
+ const moduleTreeDefinition = {
24
+ mathematics: {
25
+ arithmetic: {
26
+ addNumbers: {
27
+ type: 'skill',
28
+ name: 'Add numbers',
29
+ },
30
+ multiplyNumbers: {
31
+ type: 'skill',
32
+ name: 'Multiply numbers',
33
+ prerequisites: ['addNumbers'],
34
+ },
35
+ },
36
+ algebra: {
37
+ solveLinearEquation: {
38
+ type: 'skill',
39
+ name: 'Solve a linear equation',
40
+ setup: and('addNumbers', 'multiplyNumbers'),
41
+ links: { skillId: 'rearrangeFormula', correlation: 0.6 },
42
+ },
43
+ rearrangeFormula: {
44
+ type: 'skill',
45
+ name: 'Rearrange a formula',
46
+ },
47
+ },
48
+ },
49
+ }
50
+
51
+ const moduleTree = createModuleTree(moduleTreeDefinition)
52
+ ```
53
+
54
+ The result is a flat, ID-keyed record. Prerequisite references are validated, setup skills are added to the prerequisites, continuation IDs are derived, and links are made symmetric.
55
+
56
+ ```ts
57
+ moduleTree.multiplyNumbers.prerequisiteIds // ['addNumbers']
58
+ moduleTree.addNumbers.continuationIds // ['multiplyNumbers', 'solveLinearEquation']
59
+ moduleTree.solveLinearEquation.linkedSkillIds // ['rearrangeFormula']
60
+ moduleTree.rearrangeFormula.linkedSkillIds // ['solveLinearEquation']
61
+ ```
62
+
63
+
64
+ ## Defining a module tree
65
+
66
+ A `ModuleTreeDefinition` is a nested record. Every property is either another group, a `ConceptDefinition` or a `SkillDefinition`. Groups may be nested to any depth, while every module ID must be unique throughout the complete tree regardless of casing.
67
+
68
+ ```ts
69
+ import type { ModuleTreeDefinition } from '@step-wise/module-tree-definition'
70
+
71
+ const moduleTreeDefinition: ModuleTreeDefinition = {
72
+ subject: {
73
+ category: {
74
+ firstSkill: { type: 'skill', name: 'First skill' },
75
+ secondSkill: { type: 'skill', name: 'Second skill' },
76
+ },
77
+ },
78
+ }
79
+ ```
80
+
81
+ ### Module properties
82
+
83
+ | Property | Required | Behavior |
84
+ | --- | --- | --- |
85
+ | `type` | Yes | Either `concept` or `skill`. |
86
+ | `name` | Yes | Non-empty display name for the module. |
87
+ | `prerequisites` | No | Direct prerequisite module IDs. Concepts cannot depend on skills. |
88
+ | `setup` | Skills only | A setup from `@step-wise/skill-setup`. Every referenced skill is also added as a prerequisite. |
89
+ | `links` | Skills only | One link or a list of link definitions. |
90
+ | `thresholds` | Skills only | Partial per-skill threshold options. |
91
+
92
+ Explicit and setup-derived prerequisites are combined and deduplicated in first-occurrence order.
93
+
94
+ ### Threshold options
95
+
96
+ Every threshold is a success probability between zero and one. Raw definitions may provide any subset of the options:
97
+
98
+ ```ts
99
+ const moduleTreeDefinition: ModuleTreeDefinition = {
100
+ advancedSkill: {
101
+ type: 'skill',
102
+ name: 'Advanced skill',
103
+ thresholds: {
104
+ mastery: 0.6,
105
+ recap: 0.5,
106
+ },
107
+ },
108
+ }
109
+ ```
110
+
111
+ | Option | Behavior |
112
+ | --- | --- |
113
+ | `mastery` | The regular threshold at which the skill is considered mastered. Defaults to `0.55`. |
114
+ | `recap` | The regular threshold below which mastered material should be recapped. Defaults to 90% of `mastery`. |
115
+ | `priorKnowledgeMastery` | The mastery threshold when treating the skill as prior knowledge. Defaults to `mastery`. |
116
+ | `priorKnowledgeRecap` | The recap threshold when treating the skill as prior knowledge. Defaults to 80% of `priorKnowledgeMastery`. |
117
+
118
+ Recap thresholds cannot exceed their corresponding mastery thresholds. The processed skill always contains all four values in `thresholds`, regardless of how many were supplied in the raw definition. The exported `defaultSkillThresholdOptions` contains the fully resolved defaults, while `resolveSkillThresholdOptions` resolves and validates a standalone `SkillThresholdOptionsInput`.
119
+
120
+
121
+ ## Links
122
+
123
+ Links describe symmetric relationships between skills. Declaring a relationship at one participant is sufficient; `createModuleTree` adds the corresponding processed link to every participant.
124
+
125
+ ### Shorthand forms
126
+
127
+ ```ts
128
+ links: 'otherSkill'
129
+ links: ['skillA', 'skillB']
130
+ ```
131
+
132
+ A string creates a two-skill relationship. An array of strings creates one multi-skill relationship between the declaring skill and every listed skill; it does not create several independent links.
133
+
134
+ ### Object forms
135
+
136
+ ```ts
137
+ links: { skillId: 'otherSkill', correlation: 0.5 }
138
+ links: { skillIds: ['skillA', 'skillB'], correlation: 0.5 }
139
+ links: [{ skillId: 'skillA' }, { skillId: 'skillB' }]
140
+ ```
141
+
142
+ Use `skillId` for one linked skill and `skillIds` for a multi-skill relationship. Supplying both is invalid. A correlation is optional and, when provided, must be a finite number strictly between zero and one.
143
+
144
+ Self-links, repeated participants, concept IDs, unknown IDs, duplicate reciprocal declarations and conflicting correlations are rejected. Processed participants, structured links and `linkedSkillIds` are ordered canonically according to module-tree order.
145
+
146
+
147
+ ## Creating the processed tree
148
+
149
+ ### `createModuleTree(moduleTreeDefinition)`
150
+
151
+ Returns a validated `ModuleTree` whose keys are the original module IDs. Indexing the tree produces a `Module`; use its `type` discriminator or `getSkill` when skill-specific properties are needed. The tree uses a null prototype so IDs such as `constructor`, `toString` and `__proto__` are safe.
152
+
153
+ Every processed `Module` contains:
154
+
155
+ | Property | Behavior |
156
+ | --- | --- |
157
+ | `id` | Canonical module ID taken from the definition key. |
158
+ | `type` | Either `concept` or `skill`. |
159
+ | `name` | Display name from the definition. |
160
+ | `groupPath` | Group path from the root to the containing group. |
161
+ | `groupModuleIds` | All modules directly contained in the same group, including the module itself. |
162
+ | `prerequisiteIds` | Direct prerequisite modules. |
163
+ | `continuationIds` | Modules that directly name this module as a prerequisite. |
164
+
165
+ Processed skills additionally contain:
166
+
167
+ | Property | Behavior |
168
+ | --- | --- |
169
+ | `setup` | Original optional setup. |
170
+ | `links` | Canonical `SkillLink` relationships, each containing `skillIds` and an optional `correlation`. |
171
+ | `linkedSkillIds` | Deduplicated IDs occurring across the skill's links. |
172
+ | `thresholds` | Fully resolved `SkillThresholdOptions`, including all four thresholds. |
173
+
174
+ Creation rejects malformed entries, empty IDs or names, exact and case-insensitive ID collisions, unknown references, prerequisite cycles, concepts depending on skills and inconsistent links.
175
+
176
+
177
+ ## Searching a module tree
178
+
179
+ All search and validation functions receive a processed `ModuleTree` as their first argument. Module-aware functions accept concepts and skills. Their skill-specific counterparts validate that every supplied endpoint is a skill and omit concepts from returned collections.
180
+
181
+ ### `ensureModuleId(moduleTree, moduleId, options?)`
182
+
183
+ Returns the canonical ID of a known concept or skill. Unknown IDs and casing differences throw by default. Set `allowCaseInsensitiveMatch` to `true` at boundaries where casing cannot be trusted.
184
+
185
+ ### `ensureModuleIds(moduleTree, moduleIds, options?)`
186
+
187
+ Validates a readonly array of concept and skill IDs while preserving their supplied order.
188
+
189
+ ### `getModule(moduleTree, moduleId, options?)`
190
+
191
+ Returns the corresponding `Module`. Use its `type` discriminator to distinguish concepts from skills.
192
+
193
+ ### `ensureSkillId(moduleTree, skillId, options?)`
194
+
195
+ Returns the known skill ID when it matches exactly. It rejects unknown IDs and IDs belonging to concepts. Set `allowCaseInsensitiveMatch` to `true` at boundaries where casing cannot be trusted, such as IDs read from URLs; the canonical ID from the tree is then returned.
196
+
197
+ ```ts
198
+ ensureSkillId(moduleTree, 'addNumbers') // 'addNumbers'
199
+ ensureSkillId(moduleTree, 'ADDNUMBERS', { allowCaseInsensitiveMatch: true }) // 'addNumbers'
200
+ ```
201
+
202
+ ### `ensureSkillIds(moduleTree, skillIds, options?)`
203
+
204
+ Accepts a readonly array and returns a new array containing the validated IDs in the supplied order. It supports the same `allowCaseInsensitiveMatch` option. Use `ensureSkillId` for a single ID.
205
+
206
+ ### `getSkill(moduleTree, skillId, options?)`
207
+
208
+ Returns the corresponding `Skill`, rejecting IDs that identify concepts. This is the convenient way to access skill-specific properties from a mixed module tree.
209
+
210
+ ### `ensureSkillSetup(moduleTree, setup)`
211
+
212
+ Normalizes a setup through `@step-wise/skill-setup`, verifies that every referenced skill exists and returns the resulting setup.
213
+
214
+ ### `isModulePrerequisiteOf(moduleTree, prerequisiteId, moduleId, options?)`
215
+
216
+ Checks whether the first module is a direct or transitive prerequisite of the second. A module is considered a prerequisite of itself. Set `includeConcepts` to `false` to exclude concepts and stop traversal when one is encountered.
217
+
218
+ ### `expandModuleIdsWithDirectPrerequisites(moduleTree, moduleIds, options?)`
219
+
220
+ Returns the requested modules and their direct prerequisites. It does not recurse. Set `includeConcepts` to `false` to omit concepts from the result.
221
+
222
+ ### `expandSkillIdsWithDirectPrerequisitesAndLinks(moduleTree, skillIds)`
223
+
224
+ Accepts a readonly array and returns the requested canonical IDs, their direct prerequisites and their directly linked skills. It does not recurse through either relationship.
225
+
226
+ ### `getModuleIdsBetweenGoalsAndPriorKnowledge(moduleTree, goals, priorKnowledge, options?)`
227
+
228
+ Returns the goals and their recursive prerequisites while excluding prior-knowledge modules and everything reached only by traversing beyond those boundaries. Set `includeConcepts` to `false` to omit concepts and stop traversing their prerequisites.
229
+
230
+ ```ts
231
+ getModuleIdsBetweenGoalsAndPriorKnowledge(moduleTree, ['solveLinearEquation'], ['addNumbers'], { includeConcepts: false })
232
+ // ['solveLinearEquation', 'multiplyNumbers']
233
+ ```
234
+
235
+ ### `sortModuleIdsByTreeOrder(moduleTree, moduleIds, options?)`
236
+
237
+ Validates the supplied module IDs, then returns a new array sorted by their order in the processed module tree. Duplicate IDs are preserved. Set `includeConcepts` to `false` to omit concepts.
238
+
239
+
240
+ ## TypeScript
241
+
242
+ The package includes TypeScript declarations. Its principal exported types include `ModuleId`, `ModuleType`, `ModuleDefinition`, `ConceptDefinition`, `SkillDefinition`, `ModuleTreeDefinition`, `Module`, `Concept`, `Skill`, `ModuleTree`, `EnsureModuleIdOptions`, `ModuleSearchOptions`, `SkillLinkDefinition` and `SkillLink`.
@@ -0,0 +1,3 @@
1
+ import type { ModuleTree, ModuleTreeDefinition } from './types.ts';
2
+ export declare function createModuleTree(moduleTreeDefinition: ModuleTreeDefinition): ModuleTree;
3
+ //# sourceMappingURL=creation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creation.d.ts","sourceRoot":"","sources":["../../src/creation/creation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAMlE,wBAAgB,gBAAgB,CAAC,oBAAoB,EAAE,oBAAoB,GAAG,UAAU,CAKvF"}
@@ -0,0 +1,10 @@
1
+ import { flattenModuleTreeDefinition } from './flattening.js';
2
+ import { validateAndProcessPrerequisites } from './prerequisiteProcessing.js';
3
+ import { validateAndProcessLinks } from './linkProcessing.js';
4
+ // Create a module tree from a module tree definition, validating and processing the prerequisites and links.
5
+ export function createModuleTree(moduleTreeDefinition) {
6
+ const moduleTree = flattenModuleTreeDefinition(moduleTreeDefinition);
7
+ validateAndProcessPrerequisites(moduleTree);
8
+ validateAndProcessLinks(moduleTree);
9
+ return moduleTree;
10
+ }
@@ -0,0 +1,3 @@
1
+ import type { ModuleTree, ModuleTreeDefinition } from './types.ts';
2
+ export declare function flattenModuleTreeDefinition(moduleTreeDefinition: ModuleTreeDefinition): ModuleTree;
3
+ //# sourceMappingURL=flattening.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattening.d.ts","sourceRoot":"","sources":["../../src/creation/flattening.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAA8B,UAAU,EAAE,oBAAoB,EAA4B,MAAM,YAAY,CAAA;AAGxH,wBAAgB,2BAA2B,CAAC,oBAAoB,EAAE,oBAAoB,GAAG,UAAU,CAuDlG"}
@@ -0,0 +1,98 @@
1
+ import { SkillSetup } from '@step-wise/skill-setup';
2
+ import { deduplicate, isPlainObject } from '@step-wise/js-utils';
3
+ import { normalizeSkillLinks } from './linkProcessing.js';
4
+ import { resolveSkillThresholdOptions } from './thresholdOptions.js';
5
+ // Flatten a module tree definition into a module tree, validating the module definitions and ensuring that module IDs are unique.
6
+ export function flattenModuleTreeDefinition(moduleTreeDefinition) {
7
+ const moduleTree = Object.create(null);
8
+ const registeredModuleIds = new Map();
9
+ // Recursively walk through the module tree definition, validating and flattening the module definitions.
10
+ const walk = (group, path = []) => {
11
+ if (!isPlainObject(group))
12
+ throw new TypeError(`Invalid module tree entry at "${path.join('/') || '<root>'}": expected a module or group object.`);
13
+ const groupModuleIds = [];
14
+ // Validate each module definition in the group.
15
+ for (const [key, value] of Object.entries(group)) {
16
+ if (isModuleDefinition(value)) {
17
+ // Validate the module ID and definition, ensuring uniqueness and proper structure.
18
+ const modulePath = [...path, key].join('/');
19
+ const moduleId = ensureValidModuleId(key, `module ID at "${modulePath}"`);
20
+ validateModuleDefinition(value, moduleId, modulePath);
21
+ // Check for duplicate module IDs, ignoring case sensitivity.
22
+ const normalizedModuleId = moduleId.toLowerCase();
23
+ const existingModule = registeredModuleIds.get(normalizedModuleId);
24
+ if (existingModule)
25
+ throw new Error(`Duplicate module ID: "${moduleId}" at "${modulePath}" conflicts with "${existingModule.id}" at "${existingModule.path}". Module IDs must be unique regardless of casing.`);
26
+ registeredModuleIds.set(normalizedModuleId, { id: moduleId, path: modulePath });
27
+ groupModuleIds.push(moduleId);
28
+ // Create a shared module object with common properties for both concepts and skills.
29
+ const sharedModule = { id: moduleId, name: value.name, groupPath: path, groupModuleIds, prerequisiteIds: [...(value.prerequisites ?? [])], continuationIds: [] };
30
+ // On a concept, validate and create the concept.
31
+ if (value.type === 'concept') {
32
+ moduleTree[moduleId] = { ...sharedModule, type: 'concept' };
33
+ continue;
34
+ }
35
+ // On a skill, validate and create the skill, processing its setup, links, and thresholds.
36
+ const skillId = moduleId;
37
+ validateSkillDefinition(value, skillId);
38
+ moduleTree[moduleId] = {
39
+ ...sharedModule,
40
+ id: skillId,
41
+ type: 'skill',
42
+ setup: value.setup,
43
+ prerequisiteIds: deduplicate([...(value.prerequisites ?? []), ...(value.setup?.getSkillList() ?? [])]),
44
+ links: normalizeSkillLinks(value.links).map(link => {
45
+ link.skillIds.forEach(linkedSkillId => ensureValidModuleId(linkedSkillId, `linked skill ID for skill "${skillId}"`));
46
+ return link;
47
+ }),
48
+ linkedSkillIds: [],
49
+ thresholds: resolveSkillThresholdOptions(value.thresholds),
50
+ };
51
+ }
52
+ else
53
+ walk(value, [...path, key]);
54
+ }
55
+ };
56
+ walk(moduleTreeDefinition);
57
+ return moduleTree;
58
+ }
59
+ // Check if a value is a valid module definition, either a concept or a skill.
60
+ function isModuleDefinition(value) {
61
+ return isPlainObject(value) && (value.type === 'concept' || value.type === 'skill') && typeof value.name === 'string';
62
+ }
63
+ // Ensure that a module ID is a valid non-empty string without leading or trailing whitespace.
64
+ function ensureValidModuleId(moduleId, description) {
65
+ if (typeof moduleId !== 'string')
66
+ throw new TypeError(`Invalid ${description}: expected a string, but received type "${typeof moduleId}".`);
67
+ if (moduleId.length === 0)
68
+ throw new RangeError(`Invalid ${description}: module IDs must not be empty.`);
69
+ if (moduleId.trim() !== moduleId)
70
+ throw new RangeError(`Invalid ${description} "${moduleId}": module IDs must not start or end with whitespace.`);
71
+ return moduleId;
72
+ }
73
+ // Validate a module definition, ensuring that its properties are appropriate for its type and that its prerequisites are valid. Throw an error if any validation fails.
74
+ function validateModuleDefinition(definition, moduleId, modulePath) {
75
+ if (definition.name.trim().length === 0)
76
+ throw new RangeError(`Invalid module name for "${moduleId}" at "${modulePath}": module names must not be empty or consist only of whitespace.`);
77
+ if (definition.type === 'concept') {
78
+ if ('setup' in definition)
79
+ throw new TypeError(`Invalid concept "${moduleId}": concepts cannot define a skill setup.`);
80
+ if ('links' in definition)
81
+ throw new TypeError(`Invalid concept "${moduleId}": concepts cannot define skill links.`);
82
+ if ('thresholds' in definition)
83
+ throw new TypeError(`Invalid concept "${moduleId}": concepts cannot define skill thresholds.`);
84
+ }
85
+ if (definition.prerequisites === undefined)
86
+ return;
87
+ if (!Array.isArray(definition.prerequisites))
88
+ throw new TypeError(`Invalid prerequisites for module "${moduleId}": expected an array of module IDs.`);
89
+ definition.prerequisites.forEach(prerequisiteId => ensureValidModuleId(prerequisiteId, `prerequisite module ID for module "${moduleId}"`));
90
+ }
91
+ // Validate a skill definition, ensuring that its setup is a valid SkillSetup instance and that any skills referenced in the setup are valid module IDs. Throw an error if any validation fails.
92
+ function validateSkillDefinition(definition, skillId) {
93
+ if (definition.setup === undefined)
94
+ return;
95
+ if (!(definition.setup instanceof SkillSetup))
96
+ throw new TypeError(`Invalid setup for skill "${skillId}": expected a SkillSetup instance.`);
97
+ definition.setup.getSkillList().forEach(setupSkillId => ensureValidModuleId(setupSkillId, `setup skill ID for skill "${skillId}"`));
98
+ }
@@ -0,0 +1,4 @@
1
+ export * from './types.ts';
2
+ export * from './thresholdOptions.ts';
3
+ export * from './creation.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creation/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,uBAAuB,CAAA;AACrC,cAAc,eAAe,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './thresholdOptions.js';
3
+ export * from './creation.js';
@@ -0,0 +1,4 @@
1
+ import type { ModuleTree, SkillLink, SkillLinkDefinition } from './types.ts';
2
+ export declare function normalizeSkillLinks(links?: SkillLinkDefinition | SkillLinkDefinition[]): SkillLink[];
3
+ export declare function validateAndProcessLinks(moduleTree: ModuleTree): void;
4
+ //# sourceMappingURL=linkProcessing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkProcessing.d.ts","sourceRoot":"","sources":["../../src/creation/linkProcessing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAkB,SAAS,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAG5F,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE,GAAG,SAAS,EAAE,CA8BpG;AAGD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAkDpE"}
@@ -0,0 +1,92 @@
1
+ import { deduplicate, ensureNumber, isPlainObject, sortBy } from '@step-wise/js-utils';
2
+ // Take a set of link definitions and turn it into a processed SkillLink object.
3
+ export function normalizeSkillLinks(links) {
4
+ // Ensure the links attribute is an array of links.
5
+ if (Array.isArray(links) && links.length === 0)
6
+ return [];
7
+ const list = links === undefined ? [] : Array.isArray(links) && !links.every(link => typeof link === 'string') ? links : [links];
8
+ return list.map(link => {
9
+ // Deal with strings or lists of strings.
10
+ if (typeof link === 'string') {
11
+ if (link.length === 0)
12
+ throw new Error('Invalid skill link: linked skill IDs must not be empty.');
13
+ return { skillIds: [link] };
14
+ }
15
+ if (Array.isArray(link) && link.every(elem => typeof elem === 'string')) {
16
+ const skillIds = link;
17
+ if (skillIds.length === 0)
18
+ throw new Error('Invalid skill link: expected at least one linked skill.');
19
+ if (skillIds.some(skillId => skillId.length === 0))
20
+ throw new Error('Invalid skill link: linked skill IDs must not be empty.');
21
+ return { skillIds };
22
+ }
23
+ if (!isPlainObject(link))
24
+ throw new Error(`Invalid skill link: expected a plain object, string or array, but got "${typeof link}".`);
25
+ // For an object, extract the skill IDs.
26
+ if (link.skillId !== undefined && link.skillIds !== undefined)
27
+ throw new Error('Invalid skill link: "skillId" and "skillIds" cannot both be specified.');
28
+ const skillIds = link.skillIds ?? (link.skillId === undefined ? undefined : Array.isArray(link.skillId) ? link.skillId : [link.skillId]);
29
+ if (!skillIds || !Array.isArray(skillIds) || skillIds.length === 0 || !skillIds.every(skillId => typeof skillId === 'string' && skillId.length > 0))
30
+ throw new Error(`Invalid skill link: linked skills were not properly given.`);
31
+ // Validate the correlation when provided.
32
+ const correlation = link.correlation === undefined ? undefined : ensureNumber(link.correlation);
33
+ if (correlation !== undefined && (correlation <= 0 || correlation >= 1))
34
+ throw new RangeError(`Invalid skill correlation "${correlation}": expected a value between 0 and 1.`);
35
+ // Return the processed skill link object.
36
+ return { skillIds, ...(correlation === undefined ? {} : { correlation }) };
37
+ });
38
+ }
39
+ // Set up the links and linked skill IDs for every skill.
40
+ export function validateAndProcessLinks(moduleTree) {
41
+ const skills = Object.values(moduleTree).filter((module) => module.type === 'skill');
42
+ const skillIds = skills.map(skill => skill.id);
43
+ const skillOrder = new Map(skillIds.map((skillId, index) => [skillId, index]));
44
+ const relationships = new Map();
45
+ const compareSkillIdLists = (list1, list2) => {
46
+ for (let index = 0; index < Math.min(list1.length, list2.length); index++) {
47
+ const difference = skillOrder.get(list1[index]) - skillOrder.get(list2[index]);
48
+ if (difference !== 0)
49
+ return difference;
50
+ }
51
+ return list1.length - list2.length;
52
+ };
53
+ // Validate and canonicalize every declared relationship.
54
+ for (const skill of skills) {
55
+ for (const link of skill.links) {
56
+ for (const linkedSkillId of link.skillIds) {
57
+ if (moduleTree[linkedSkillId]?.type !== 'skill')
58
+ throw new Error(`Invalid skill link: received unknown skill ID "${linkedSkillId}" in skill "${skill.id}".`);
59
+ if (linkedSkillId === skill.id)
60
+ throw new Error(`Invalid skill link: skill "${skill.id}" cannot link to itself.`);
61
+ }
62
+ if (new Set(link.skillIds).size !== link.skillIds.length)
63
+ throw new Error(`Invalid skill link in skill "${skill.id}": linked skill IDs must not be repeated.`);
64
+ const participants = sortBy([skill.id, ...link.skillIds], [skillOrder.get(skill.id), ...link.skillIds.map(skillId => skillOrder.get(skillId))]);
65
+ const relationshipKey = JSON.stringify(participants);
66
+ const existingRelationship = relationships.get(relationshipKey);
67
+ if (existingRelationship) {
68
+ const participantList = participants.map(skillId => `"${skillId}"`).join(', ');
69
+ if (existingRelationship.correlation !== link.correlation)
70
+ throw new Error(`Conflicting skill link: the relationship between ${participantList} is declared with different correlations.`);
71
+ throw new Error(`Duplicate skill link: the relationship between ${participantList} is declared more than once.`);
72
+ }
73
+ relationships.set(relationshipKey, { participants, ...(link.correlation === undefined ? {} : { correlation: link.correlation }) });
74
+ }
75
+ }
76
+ // Rebuild all derived links from the canonical relationships.
77
+ for (const skill of skills) {
78
+ skill.links = [];
79
+ skill.linkedSkillIds = [];
80
+ }
81
+ for (const relationship of relationships.values()) {
82
+ for (const participant of relationship.participants) {
83
+ const skill = moduleTree[participant];
84
+ skill.links.push({ skillIds: relationship.participants.filter(skillId => skillId !== participant), ...(relationship.correlation === undefined ? {} : { correlation: relationship.correlation }) });
85
+ }
86
+ }
87
+ for (const skill of skills) {
88
+ skill.links.sort((link1, link2) => compareSkillIdLists(link1.skillIds, link2.skillIds));
89
+ const linkedSkillIds = deduplicate(skill.links.flatMap(link => link.skillIds));
90
+ skill.linkedSkillIds = sortBy(linkedSkillIds, linkedSkillIds.map(skillId => skillOrder.get(skillId)));
91
+ }
92
+ }
@@ -0,0 +1,3 @@
1
+ import type { ModuleTree } from './types.ts';
2
+ export declare function validateAndProcessPrerequisites(moduleTree: ModuleTree): void;
3
+ //# sourceMappingURL=prerequisiteProcessing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerequisiteProcessing.d.ts","sourceRoot":"","sources":["../../src/creation/prerequisiteProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,UAAU,EAAE,MAAM,YAAY,CAAA;AAGtD,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAiC5E"}
@@ -0,0 +1,39 @@
1
+ // Validate and process the prerequisites for every module in the module tree, ensuring that all prerequisites exist, that concepts do not depend on skills, and that there are no cycles in the prerequisite graph. Also, populate the continuationIds for each module based on its prerequisites.
2
+ export function validateAndProcessPrerequisites(moduleTree) {
3
+ // Validate that all prerequisites exist and that concepts do not depend on skills.
4
+ for (const module of Object.values(moduleTree)) {
5
+ for (const prerequisiteId of module.prerequisiteIds) {
6
+ const prerequisite = moduleTree[prerequisiteId];
7
+ if (!prerequisite)
8
+ throw new Error(`Invalid prerequisite module "${prerequisiteId}" given for module "${module.id}".`);
9
+ if (module.type === 'concept' && prerequisite.type === 'skill')
10
+ throw new Error(`Invalid prerequisite module "${prerequisiteId}" given for concept "${module.id}": concepts cannot depend on skills.`);
11
+ }
12
+ }
13
+ // Detect cycles in the prerequisite graph using a depth-first search (DFS) approach.
14
+ const states = new Map();
15
+ const path = [];
16
+ const visit = (moduleId) => {
17
+ const state = states.get(moduleId);
18
+ if (state === 'visited')
19
+ return;
20
+ if (state === 'visiting') {
21
+ const cycleStart = path.indexOf(moduleId);
22
+ const cycle = [...path.slice(cycleStart), moduleId];
23
+ throw new Error(`Invalid module prerequisites: detected cycle ${cycle.map(id => `"${id}"`).join(' -> ')}.`);
24
+ }
25
+ states.set(moduleId, 'visiting');
26
+ path.push(moduleId);
27
+ for (const prerequisiteId of moduleTree[moduleId].prerequisiteIds)
28
+ visit(prerequisiteId);
29
+ path.pop();
30
+ states.set(moduleId, 'visited');
31
+ };
32
+ for (const moduleId of Object.keys(moduleTree))
33
+ visit(moduleId);
34
+ // Populate the continuationIds for each module based on its prerequisites.
35
+ for (const module of Object.values(moduleTree)) {
36
+ for (const prerequisiteId of module.prerequisiteIds)
37
+ moduleTree[prerequisiteId].continuationIds.push(module.id);
38
+ }
39
+ }
@@ -0,0 +1,4 @@
1
+ import type { SkillThresholdOptions, SkillThresholdOptionsInput } from './types.ts';
2
+ export declare const defaultSkillThresholdOptions: SkillThresholdOptions;
3
+ export declare function resolveSkillThresholdOptions(input?: SkillThresholdOptionsInput): SkillThresholdOptions;
4
+ //# sourceMappingURL=thresholdOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thresholdOptions.d.ts","sourceRoot":"","sources":["../../src/creation/thresholdOptions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAOnF,eAAO,MAAM,4BAA4B,EAAE,qBAKzC,CAAA;AAKF,wBAAgB,4BAA4B,CAAC,KAAK,GAAE,0BAA+B,GAAG,qBAAqB,CAiB1G"}
@@ -0,0 +1,39 @@
1
+ import { ensureNumber, hasOnlyKeys, isPlainObject } from '@step-wise/js-utils';
2
+ // Define default threshold values and factors for skills.
3
+ const defaultMasteryThreshold = 0.55;
4
+ const defaultRecapFactor = 0.9;
5
+ const defaultPriorKnowledgeRecapFactor = 0.8;
6
+ export const defaultSkillThresholdOptions = Object.freeze({
7
+ mastery: defaultMasteryThreshold,
8
+ recap: defaultMasteryThreshold * defaultRecapFactor,
9
+ priorKnowledgeMastery: defaultMasteryThreshold,
10
+ priorKnowledgeRecap: defaultMasteryThreshold * defaultPriorKnowledgeRecapFactor,
11
+ });
12
+ const skillThresholdOptionNames = Object.keys(defaultSkillThresholdOptions);
13
+ // Resolve and validate skill threshold options, applying defaults and ensuring that the provided values are within acceptable ranges. Throw an error if any validation fails.
14
+ export function resolveSkillThresholdOptions(input = {}) {
15
+ // Throw on invalid formats.
16
+ if (!isPlainObject(input))
17
+ throw new TypeError('Invalid skill threshold options: expected a plain object.');
18
+ if (!hasOnlyKeys(input, skillThresholdOptionNames))
19
+ throw new TypeError('Invalid skill threshold options: received an unsupported option.');
20
+ // Resolve each threshold option, applying defaults and validating the values.
21
+ const mastery = input.mastery === undefined ? defaultSkillThresholdOptions.mastery : ensureThreshold(input.mastery, 'mastery');
22
+ const recap = input.recap === undefined ? mastery * defaultRecapFactor : ensureThreshold(input.recap, 'recap');
23
+ const priorKnowledgeMastery = input.priorKnowledgeMastery === undefined ? mastery : ensureThreshold(input.priorKnowledgeMastery, 'priorKnowledgeMastery');
24
+ const priorKnowledgeRecap = input.priorKnowledgeRecap === undefined ? priorKnowledgeMastery * defaultPriorKnowledgeRecapFactor : ensureThreshold(input.priorKnowledgeRecap, 'priorKnowledgeRecap');
25
+ // Validate that the recap thresholds do not exceed their corresponding mastery thresholds.
26
+ if (recap > mastery)
27
+ throw new RangeError(`Invalid recap threshold "${recap}": it must not exceed the mastery threshold "${mastery}".`);
28
+ if (priorKnowledgeRecap > priorKnowledgeMastery)
29
+ throw new RangeError(`Invalid priorKnowledgeRecap threshold "${priorKnowledgeRecap}": it must not exceed the priorKnowledgeMastery threshold "${priorKnowledgeMastery}".`);
30
+ // Return the resolved and validated skill threshold options.
31
+ return { mastery, recap, priorKnowledgeMastery, priorKnowledgeRecap };
32
+ }
33
+ // Ensure that a threshold value is a number between 0 and 1, throwing an error if it is not.
34
+ function ensureThreshold(value, name) {
35
+ const threshold = ensureNumber(value);
36
+ if (threshold < 0 || threshold > 1)
37
+ throw new RangeError(`Invalid ${name} threshold "${threshold}": expected a value between 0 and 1.`);
38
+ return threshold;
39
+ }
@@ -0,0 +1,60 @@
1
+ import type { SkillId, SkillSetup } from '@step-wise/skill-setup';
2
+ export type { SkillId } from '@step-wise/skill-setup';
3
+ export type ModuleId = string;
4
+ export type ModuleType = 'concept' | 'skill';
5
+ export type SkillThresholdOptions = {
6
+ mastery: number;
7
+ recap: number;
8
+ priorKnowledgeMastery: number;
9
+ priorKnowledgeRecap: number;
10
+ };
11
+ export type SkillThresholdOptionsInput = Partial<SkillThresholdOptions>;
12
+ export type SkillLinkDefinition = string | string[] | {
13
+ skillId?: SkillId | SkillId[];
14
+ skillIds?: SkillId[];
15
+ correlation?: number;
16
+ };
17
+ export type BaseModuleDefinition = {
18
+ name: string;
19
+ prerequisites?: ModuleId[];
20
+ };
21
+ export type ConceptDefinition = BaseModuleDefinition & {
22
+ type: 'concept';
23
+ };
24
+ export type SkillDefinition = BaseModuleDefinition & {
25
+ type: 'skill';
26
+ setup?: SkillSetup<unknown>;
27
+ links?: SkillLinkDefinition | SkillLinkDefinition[];
28
+ thresholds?: SkillThresholdOptionsInput;
29
+ };
30
+ export type ModuleDefinition = ConceptDefinition | SkillDefinition;
31
+ export type ModuleTreeDefinition = {
32
+ [key: string]: ModuleDefinition | ModuleTreeDefinition;
33
+ };
34
+ export type SkillLink = {
35
+ skillIds: SkillId[];
36
+ correlation?: number;
37
+ };
38
+ export type BaseModule = {
39
+ id: ModuleId;
40
+ type: ModuleType;
41
+ name: string;
42
+ groupPath: string[];
43
+ groupModuleIds: ModuleId[];
44
+ prerequisiteIds: ModuleId[];
45
+ continuationIds: ModuleId[];
46
+ };
47
+ export type Concept = BaseModule & {
48
+ type: 'concept';
49
+ };
50
+ export type Skill = BaseModule & {
51
+ id: SkillId;
52
+ type: 'skill';
53
+ setup?: SkillSetup<unknown>;
54
+ links: SkillLink[];
55
+ linkedSkillIds: SkillId[];
56
+ thresholds: SkillThresholdOptions;
57
+ };
58
+ export type Module = Concept | Skill;
59
+ export type ModuleTree = Record<ModuleId, Module>;
60
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/creation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEjE,YAAY,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAGrD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAA;AAC7B,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,CAAA;AAG5C,MAAM,MAAM,qBAAqB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,qBAAqB,EAAE,MAAM,CAAA;IAC7B,mBAAmB,EAAE,MAAM,CAAA;CAC3B,CAAA;AACD,MAAM,MAAM,0BAA0B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;AACvE,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AACnI,MAAM,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAA;CAC1B,CAAA;AAGD,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,GAAG;IACtD,IAAI,EAAE,SAAS,CAAA;CACf,CAAA;AACD,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG;IACpD,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;IAC3B,KAAK,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE,CAAA;IACnD,UAAU,CAAC,EAAE,0BAA0B,CAAA;CACvC,CAAA;AACD,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,eAAe,CAAA;AAClE,MAAM,MAAM,oBAAoB,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,oBAAoB,CAAA;CAAE,CAAA;AAG7F,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AACrE,MAAM,MAAM,UAAU,GAAG;IACxB,EAAE,EAAE,QAAQ,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,cAAc,EAAE,QAAQ,EAAE,CAAA;IAC1B,eAAe,EAAE,QAAQ,EAAE,CAAA;IAC3B,eAAe,EAAE,QAAQ,EAAE,CAAA;CAC3B,CAAA;AACD,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG;IAClC,IAAI,EAAE,SAAS,CAAA;CACf,CAAA;AACD,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG;IAChC,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;IAC3B,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,cAAc,EAAE,OAAO,EAAE,CAAA;IACzB,UAAU,EAAE,qBAAqB,CAAA;CACjC,CAAA;AACD,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,CAAA;AACpC,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from './creation/index.ts';
2
+ export * from './searching/index.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './creation/index.js';
2
+ export * from './searching/index.js';
@@ -0,0 +1,5 @@
1
+ export * from './types.ts';
2
+ export * from './validation.ts';
3
+ export * from './prerequisites.ts';
4
+ export * from './ordering.ts';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/searching/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,eAAe,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './types.js';
2
+ export * from './validation.js';
3
+ export * from './prerequisites.js';
4
+ export * from './ordering.js';
@@ -0,0 +1,4 @@
1
+ import type { ModuleId, ModuleTree } from '../creation/index.ts';
2
+ import type { ModuleSearchOptions } from './types.ts';
3
+ export declare function sortModuleIdsByTreeOrder(moduleTree: ModuleTree, moduleIds: readonly ModuleId[], { includeConcepts }?: ModuleSearchOptions): ModuleId[];
4
+ //# sourceMappingURL=ordering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ordering.d.ts","sourceRoot":"","sources":["../../src/searching/ordering.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAIrD,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,EAAE,EAAE,eAAsB,EAAE,GAAE,mBAAwB,GAAG,QAAQ,EAAE,CAIjK"}
@@ -0,0 +1,8 @@
1
+ import { sortBy } from '@step-wise/js-utils';
2
+ import { ensureModuleIds } from './validation.js';
3
+ // Sort a list of module IDs based on their order in the module tree, optionally filtering out concepts.
4
+ export function sortModuleIdsByTreeOrder(moduleTree, moduleIds, { includeConcepts = true } = {}) {
5
+ const ensuredModuleIds = ensureModuleIds(moduleTree, moduleIds).filter(moduleId => includeConcepts || moduleTree[moduleId].type === 'skill');
6
+ const moduleOrder = new Map(Object.keys(moduleTree).map((moduleId, index) => [moduleId, index]));
7
+ return sortBy(ensuredModuleIds, ensuredModuleIds.map(moduleId => moduleOrder.get(moduleId)));
8
+ }
@@ -0,0 +1,7 @@
1
+ import type { ModuleId, ModuleTree, SkillId } from '../creation/index.ts';
2
+ import type { ModuleSearchOptions } from './types.ts';
3
+ export declare function isModulePrerequisiteOf(moduleTree: ModuleTree, prerequisiteId: ModuleId, moduleId: ModuleId, { includeConcepts }?: ModuleSearchOptions): boolean;
4
+ export declare function expandModuleIdsWithDirectPrerequisites(moduleTree: ModuleTree, moduleIds: readonly ModuleId[], { includeConcepts }?: ModuleSearchOptions): ModuleId[];
5
+ export declare function expandSkillIdsWithDirectPrerequisitesAndLinks(moduleTree: ModuleTree, skillIds: readonly SkillId[]): SkillId[];
6
+ export declare function getModuleIdsBetweenGoalsAndPriorKnowledge(moduleTree: ModuleTree, goals: ModuleId[], priorKnowledge: ModuleId[], { includeConcepts }?: ModuleSearchOptions): ModuleId[];
7
+ //# sourceMappingURL=prerequisites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerequisites.d.ts","sourceRoot":"","sources":["../../src/searching/prerequisites.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAIrD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,eAAsB,EAAE,GAAE,mBAAwB,GAAG,OAAO,CAW1K;AAGD,wBAAgB,sCAAsC,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,EAAE,EAAE,eAAsB,EAAE,GAAE,mBAAwB,GAAG,QAAQ,EAAE,CAU/K;AAGD,wBAAgB,6CAA6C,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,CAW7H;AAGD,wBAAgB,yCAAyC,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE,eAAsB,EAAE,GAAE,mBAAwB,GAAG,QAAQ,EAAE,CAYjM"}
@@ -0,0 +1,62 @@
1
+ import { ensureModuleIds, ensureSkillIds, getSkill } from './validation.js';
2
+ // Check if a module is a prerequisite of another module, optionally filtering out concepts.
3
+ export function isModulePrerequisiteOf(moduleTree, prerequisiteId, moduleId, { includeConcepts = true } = {}) {
4
+ const [ensuredPrerequisiteId, ensuredModuleId] = ensureModuleIds(moduleTree, [prerequisiteId, moduleId]);
5
+ if (!includeConcepts && (moduleTree[ensuredPrerequisiteId].type === 'concept' || moduleTree[ensuredModuleId].type === 'concept'))
6
+ return false;
7
+ const visited = new Set();
8
+ const searchPrerequisites = (currentModuleId) => {
9
+ if (ensuredPrerequisiteId === currentModuleId)
10
+ return true;
11
+ if (visited.has(currentModuleId))
12
+ return false;
13
+ visited.add(currentModuleId);
14
+ return moduleTree[currentModuleId].prerequisiteIds.some(currentPrerequisiteId => includeConcepts || moduleTree[currentPrerequisiteId].type === 'skill' ? searchPrerequisites(currentPrerequisiteId) : false);
15
+ };
16
+ return searchPrerequisites(ensuredModuleId);
17
+ }
18
+ // From a list of module IDs, add all modules that are direct prerequisites of the respective modules.
19
+ export function expandModuleIdsWithDirectPrerequisites(moduleTree, moduleIds, { includeConcepts = true } = {}) {
20
+ const result = new Set();
21
+ for (const moduleId of ensureModuleIds(moduleTree, moduleIds)) {
22
+ if (!includeConcepts && moduleTree[moduleId].type === 'concept')
23
+ continue;
24
+ result.add(moduleId);
25
+ for (const prerequisiteId of moduleTree[moduleId].prerequisiteIds) {
26
+ if (includeConcepts || moduleTree[prerequisiteId].type === 'skill')
27
+ result.add(prerequisiteId);
28
+ }
29
+ }
30
+ return [...result];
31
+ }
32
+ // From a list of skill IDs, add all skills that are direct prerequisites and/or direct links of the respective skills.
33
+ export function expandSkillIdsWithDirectPrerequisitesAndLinks(moduleTree, skillIds) {
34
+ const result = new Set();
35
+ for (const skillId of ensureSkillIds(moduleTree, skillIds)) {
36
+ const skill = getSkill(moduleTree, skillId);
37
+ result.add(skillId);
38
+ for (const prerequisiteId of skill.prerequisiteIds) {
39
+ if (moduleTree[prerequisiteId].type === 'skill')
40
+ result.add(prerequisiteId);
41
+ }
42
+ for (const linkedSkillId of skill.linkedSkillIds)
43
+ result.add(linkedSkillId);
44
+ }
45
+ return [...result];
46
+ }
47
+ // Find all module IDs of the modules that are required for the given goals, but are not part of and/or covered by the given prior knowledge.
48
+ export function getModuleIdsBetweenGoalsAndPriorKnowledge(moduleTree, goals, priorKnowledge, { includeConcepts = true } = {}) {
49
+ goals = ensureModuleIds(moduleTree, goals);
50
+ priorKnowledge = ensureModuleIds(moduleTree, priorKnowledge);
51
+ const contents = [];
52
+ const processModule = (moduleId) => {
53
+ if (!includeConcepts && moduleTree[moduleId].type === 'concept')
54
+ return;
55
+ if (priorKnowledge.includes(moduleId) || contents.includes(moduleId))
56
+ return;
57
+ contents.push(moduleId);
58
+ moduleTree[moduleId].prerequisiteIds.forEach(processModule);
59
+ };
60
+ goals.forEach(processModule);
61
+ return contents;
62
+ }
@@ -0,0 +1,4 @@
1
+ export type ModuleSearchOptions = {
2
+ includeConcepts?: boolean;
3
+ };
4
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/searching/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IACjC,eAAe,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import { type SkillSetup, type SkillSetupLike } from '@step-wise/skill-setup';
2
+ import type { Module, ModuleId, ModuleTree, Skill, SkillId } from '../creation/index.ts';
3
+ export type EnsureModuleIdOptions = {
4
+ allowCaseInsensitiveMatch?: boolean;
5
+ };
6
+ export declare function ensureModuleId(moduleTree: ModuleTree, moduleId: ModuleId, options?: EnsureModuleIdOptions): ModuleId;
7
+ export declare function ensureModuleIds(moduleTree: ModuleTree, moduleIds: readonly ModuleId[], options?: EnsureModuleIdOptions): ModuleId[];
8
+ export declare function getModule(moduleTree: ModuleTree, moduleId: ModuleId, options?: EnsureModuleIdOptions): Module;
9
+ export declare function ensureSkillId(moduleTree: ModuleTree, skillId: SkillId, options?: EnsureModuleIdOptions): SkillId;
10
+ export declare function ensureSkillIds(moduleTree: ModuleTree, skillIds: readonly SkillId[], options?: EnsureModuleIdOptions): SkillId[];
11
+ export declare function getSkill(moduleTree: ModuleTree, skillId: SkillId, options?: EnsureModuleIdOptions): Skill;
12
+ export declare function ensureSkillSetup(moduleTree: ModuleTree, setup: SkillSetupLike): SkillSetup;
13
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/searching/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAe,MAAM,wBAAwB,CAAA;AAE1F,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAExF,MAAM,MAAM,qBAAqB,GAAG;IACnC,yBAAyB,CAAC,EAAE,OAAO,CAAA;CACnC,CAAA;AAGD,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,qBAA0B,GAAG,QAAQ,CAQxH;AAGD,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,EAAE,OAAO,GAAE,qBAA0B,GAAG,QAAQ,EAAE,CAEvI;AAGD,wBAAgB,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,qBAA0B,GAAG,MAAM,CAEjH;AAGD,wBAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAEpH;AAGD,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,EAAE,CAEnI;AAGD,wBAAgB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,qBAA0B,GAAG,KAAK,CAI7G;AAGD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,GAAG,UAAU,CAI1F"}
@@ -0,0 +1,42 @@
1
+ import { ensureSetup } from '@step-wise/skill-setup';
2
+ // Ensure that a module ID exists in the module tree, optionally allowing case-insensitive matching.
3
+ export function ensureModuleId(moduleTree, moduleId, options = {}) {
4
+ if (Object.hasOwn(moduleTree, moduleId))
5
+ return moduleId;
6
+ if (!options.allowCaseInsensitiveMatch)
7
+ throw new Error(`Unknown module ID: "${moduleId}" is not known in the module tree.`);
8
+ const moduleIdLower = moduleId.toLowerCase();
9
+ const adjustedModuleId = Object.keys(moduleTree).find(id => id.toLowerCase() === moduleIdLower);
10
+ if (adjustedModuleId)
11
+ return adjustedModuleId;
12
+ throw new Error(`Unknown module ID: "${moduleId}" is not known in the module tree.`);
13
+ }
14
+ // Ensure that a list of module IDs exist in the module tree, optionally allowing case-insensitive matching.
15
+ export function ensureModuleIds(moduleTree, moduleIds, options = {}) {
16
+ return moduleIds.map(moduleId => ensureModuleId(moduleTree, moduleId, options));
17
+ }
18
+ // Get a module from the module tree by its ID, ensuring that it exists and optionally allowing case-insensitive matching.
19
+ export function getModule(moduleTree, moduleId, options = {}) {
20
+ return moduleTree[ensureModuleId(moduleTree, moduleId, options)];
21
+ }
22
+ // Ensure that a skill ID exists in the module tree, optionally allowing case-insensitive matching.
23
+ export function ensureSkillId(moduleTree, skillId, options = {}) {
24
+ return getSkill(moduleTree, skillId, options).id;
25
+ }
26
+ // Ensure that a list of skill IDs exist in the module tree, optionally allowing case-insensitive matching.
27
+ export function ensureSkillIds(moduleTree, skillIds, options = {}) {
28
+ return skillIds.map(skillId => ensureSkillId(moduleTree, skillId, options));
29
+ }
30
+ // Get a skill from the module tree by its ID, ensuring that it exists and is of type 'skill', optionally allowing case-insensitive matching.
31
+ export function getSkill(moduleTree, skillId, options = {}) {
32
+ const module = getModule(moduleTree, skillId, options);
33
+ if (module.type !== 'skill')
34
+ throw new Error(`Invalid skill ID: "${skillId}" identifies a concept rather than a skill.`);
35
+ return module;
36
+ }
37
+ // Ensure that a SkillSetup is valid and that all skill IDs it references exist in the module tree.
38
+ export function ensureSkillSetup(moduleTree, setup) {
39
+ const checkedSetup = ensureSetup(setup);
40
+ ensureSkillIds(moduleTree, checkedSetup.getSkillList());
41
+ return checkedSetup;
42
+ }
@@ -0,0 +1 @@
1
+ {"version":"7.0.2","root":[92,[137,148]],"packageJsons":["../../../node_modules/@types/node/package.json","../../../node_modules/punycode/package.json","../../../node_modules/undici-types/package.json","../../js-utils/package.json","../package.json","../../polynomials/package.json","../../skill-setup/package.json"],"missingPackageJsons":["../../../node_modules/@types/assert/package.json","../../../node_modules/@types/assert/strict/package.json","../../../node_modules/@types/async_hooks/package.json","../../../node_modules/@types/buffer/package.json","../../../node_modules/@types/child_process/package.json","../../../node_modules/@types/cluster/package.json","../../../node_modules/@types/console/package.json","../../../node_modules/@types/constants/package.json","../../../node_modules/@types/crypto/package.json","../../../node_modules/@types/dgram/package.json","../../../node_modules/@types/diagnostics_channel/package.json","../../../node_modules/@types/dns/package.json","../../../node_modules/@types/dns/promises/package.json","../../../node_modules/@types/domain/package.json","../../../node_modules/@types/events/package.json","../../../node_modules/@types/fs/package.json","../../../node_modules/@types/fs/promises/package.json","../../../node_modules/@types/http/package.json","../../../node_modules/@types/http2/package.json","../../../node_modules/@types/https/package.json","../../../node_modules/@types/inspector/package.json","../../../node_modules/@types/inspector/promises/package.json","../../../node_modules/@types/module/package.json","../../../node_modules/@types/net/package.json","../../../node_modules/@types/node/assert/package.json","../../../node_modules/@types/node/compatibility/package.json","../../../node_modules/@types/node/dns/package.json","../../../node_modules/@types/node/fs/package.json","../../../node_modules/@types/node/readline/package.json","../../../node_modules/@types/node/stream/package.json","../../../node_modules/@types/node/timers/package.json","../../../node_modules/@types/node/web-globals/package.json","../../../node_modules/@types/os/package.json","../../../node_modules/@types/path/package.json","../../../node_modules/@types/path/posix/package.json","../../../node_modules/@types/path/win32/package.json","../../../node_modules/@types/perf_hooks/package.json","../../../node_modules/@types/process/package.json","../../../node_modules/@types/punycode/package.json","../../../node_modules/@types/querystring/package.json","../../../node_modules/@types/readline/package.json","../../../node_modules/@types/readline/promises/package.json","../../../node_modules/@types/repl/package.json","../../../node_modules/@types/stream/consumers/package.json","../../../node_modules/@types/stream/package.json","../../../node_modules/@types/stream/promises/package.json","../../../node_modules/@types/stream/web/package.json","../../../node_modules/@types/string_decoder/package.json","../../../node_modules/@types/timers/package.json","../../../node_modules/@types/timers/promises/package.json","../../../node_modules/@types/tls/package.json","../../../node_modules/@types/trace_events/package.json","../../../node_modules/@types/tty/package.json","../../../node_modules/@types/url/package.json","../../../node_modules/@types/util/package.json","../../../node_modules/@types/util/types/package.json","../../../node_modules/@types/v8/package.json","../../../node_modules/@types/vm/package.json","../../../node_modules/@types/wasi/package.json","../../../node_modules/@types/worker_threads/package.json","../../../node_modules/@types/zlib/package.json","../../../node_modules/assert/package.json","../../../node_modules/assert/strict/package.json","../../../node_modules/async_hooks/package.json","../../../node_modules/buffer/package.json","../../../node_modules/child_process/package.json","../../../node_modules/cluster/package.json","../../../node_modules/console/package.json","../../../node_modules/constants/package.json","../../../node_modules/crypto/package.json","../../../node_modules/dgram/package.json","../../../node_modules/diagnostics_channel/package.json","../../../node_modules/dns/package.json","../../../node_modules/dns/promises/package.json","../../../node_modules/domain/package.json","../../../node_modules/events/package.json","../../../node_modules/fs/package.json","../../../node_modules/fs/promises/package.json","../../../node_modules/http/package.json","../../../node_modules/http2/package.json","../../../node_modules/https/package.json","../../../node_modules/inspector/package.json","../../../node_modules/inspector/promises/package.json","../../../node_modules/module/package.json","../../../node_modules/net/package.json","../../../node_modules/os/package.json","../../../node_modules/path/package.json","../../../node_modules/path/posix/package.json","../../../node_modules/path/win32/package.json","../../../node_modules/perf_hooks/package.json","../../../node_modules/process/package.json","../../../node_modules/querystring/package.json","../../../node_modules/readline/package.json","../../../node_modules/readline/promises/package.json","../../../node_modules/repl/package.json","../../../node_modules/stream/consumers/package.json","../../../node_modules/stream/package.json","../../../node_modules/stream/promises/package.json","../../../node_modules/stream/web/package.json","../../../node_modules/string_decoder/package.json","../../../node_modules/timers/package.json","../../../node_modules/timers/promises/package.json","../../../node_modules/tls/package.json","../../../node_modules/trace_events/package.json","../../../node_modules/tty/package.json","../../../node_modules/url/package.json","../../../node_modules/util/package.json","../../../node_modules/util/types/package.json","../../../node_modules/v8/package.json","../../../node_modules/vm/package.json","../../../node_modules/wasi/package.json","../../../node_modules/worker_threads/package.json","../../../node_modules/zlib/package.json"],"fileNames":["lib.es5.d.ts","lib.es2015.d.ts","lib.es2016.d.ts","lib.es2017.d.ts","lib.es2018.d.ts","lib.es2019.d.ts","lib.es2020.d.ts","lib.es2021.d.ts","lib.es2022.d.ts","lib.es2023.d.ts","lib.dom.d.ts","lib.dom.iterable.d.ts","lib.dom.asynciterable.d.ts","lib.webworker.importscripts.d.ts","lib.scripthost.d.ts","lib.es2015.core.d.ts","lib.es2015.collection.d.ts","lib.es2015.generator.d.ts","lib.es2015.iterable.d.ts","lib.es2015.promise.d.ts","lib.es2015.proxy.d.ts","lib.es2015.reflect.d.ts","lib.es2015.symbol.d.ts","lib.es2015.symbol.wellknown.d.ts","lib.es2016.array.include.d.ts","lib.es2016.intl.d.ts","lib.es2017.arraybuffer.d.ts","lib.es2017.date.d.ts","lib.es2017.object.d.ts","lib.es2017.sharedmemory.d.ts","lib.es2017.string.d.ts","lib.es2017.intl.d.ts","lib.es2017.typedarrays.d.ts","lib.es2018.asyncgenerator.d.ts","lib.es2018.asynciterable.d.ts","lib.es2018.intl.d.ts","lib.es2018.promise.d.ts","lib.es2018.regexp.d.ts","lib.es2019.array.d.ts","lib.es2019.object.d.ts","lib.es2019.string.d.ts","lib.es2019.symbol.d.ts","lib.es2019.intl.d.ts","lib.es2020.bigint.d.ts","lib.es2020.date.d.ts","lib.es2020.promise.d.ts","lib.es2020.sharedmemory.d.ts","lib.es2020.string.d.ts","lib.es2020.symbol.wellknown.d.ts","lib.es2020.intl.d.ts","lib.es2020.number.d.ts","lib.es2021.promise.d.ts","lib.es2021.string.d.ts","lib.es2021.weakref.d.ts","lib.es2021.intl.d.ts","lib.es2022.array.d.ts","lib.es2022.error.d.ts","lib.es2022.intl.d.ts","lib.es2022.object.d.ts","lib.es2022.string.d.ts","lib.es2022.regexp.d.ts","lib.es2023.array.d.ts","lib.es2023.collection.d.ts","lib.es2023.intl.d.ts","lib.es2025.float16.d.ts","lib.esnext.disposable.d.ts","lib.decorators.d.ts","lib.decorators.legacy.d.ts","lib.es2023.full.d.ts","../../polynomials/dist/types.d.ts","../../polynomials/dist/checks.d.ts","../../polynomials/dist/creation.d.ts","../../polynomials/dist/conversion.d.ts","../../polynomials/dist/display.d.ts","../../polynomials/dist/restructuring.d.ts","../../polynomials/dist/comparison.d.ts","../../polynomials/dist/manipulation.d.ts","../../polynomials/dist/index.d.ts","../../skill-setup/dist/abstracts/skillsetup.d.ts","../../skill-setup/dist/abstracts/skilllistsetup.d.ts","../../skill-setup/dist/abstracts/skillitemsetup.d.ts","../../skill-setup/dist/abstracts/index.d.ts","../../skill-setup/dist/setups/skill.d.ts","../../skill-setup/dist/setups/and.d.ts","../../skill-setup/dist/setups/or.d.ts","../../skill-setup/dist/setups/repeat.d.ts","../../skill-setup/dist/setups/pick.d.ts","../../skill-setup/dist/setups/part.d.ts","../../skill-setup/dist/setups/index.d.ts","../../skill-setup/dist/serialization.d.ts","../../skill-setup/dist/index.d.ts","../src/creation/types.ts","../../js-utils/dist/objects/checks.d.ts","../../js-utils/dist/objects/plainnesschecks.d.ts","../../js-utils/dist/objects/comparisons.d.ts","../../js-utils/dist/objects/nesting.d.ts","../../js-utils/dist/objects/creation.d.ts","../../js-utils/dist/objects/manipulation.d.ts","../../js-utils/dist/objects/index.d.ts","../../js-utils/dist/numbers/checks.d.ts","../../js-utils/dist/numbers/comparisons.d.ts","../../js-utils/dist/numbers/limiting.d.ts","../../js-utils/dist/numbers/rounding.d.ts","../../js-utils/dist/numbers/angles.d.ts","../../js-utils/dist/numbers/random.d.ts","../../js-utils/dist/numbers/index.d.ts","../../js-utils/dist/arrays/checks.d.ts","../../js-utils/dist/arrays/comparisons.d.ts","../../js-utils/dist/arrays/reading.d.ts","../../js-utils/dist/arrays/iteration.d.ts","../../js-utils/dist/arrays/finding.d.ts","../../js-utils/dist/arrays/creation.d.ts","../../js-utils/dist/arrays/manipulation.d.ts","../../js-utils/dist/arrays/shaping.d.ts","../../js-utils/dist/arrays/sorting.d.ts","../../js-utils/dist/arrays/random.d.ts","../../js-utils/dist/arrays/multidimensional.d.ts","../../js-utils/dist/arrays/index.d.ts","../../js-utils/dist/strings/checks.d.ts","../../js-utils/dist/strings/search.d.ts","../../js-utils/dist/strings/manipulation.d.ts","../../js-utils/dist/strings/creation.d.ts","../../js-utils/dist/strings/index.d.ts","../../js-utils/dist/functions/fundamentals.d.ts","../../js-utils/dist/functions/repeating.d.ts","../../js-utils/dist/functions/resolving.d.ts","../../js-utils/dist/functions/index.d.ts","../../js-utils/dist/sets/checks.d.ts","../../js-utils/dist/sets/manipulation.d.ts","../../js-utils/dist/sets/index.d.ts","../../js-utils/dist/errors/interpretationerror.d.ts","../../js-utils/dist/errors/index.d.ts","../../js-utils/dist/dates/checks.d.ts","../../js-utils/dist/dates/formatting.d.ts","../../js-utils/dist/dates/index.d.ts","../../js-utils/dist/index.d.ts","../src/creation/thresholdoptions.ts","../src/creation/linkprocessing.ts","../src/creation/flattening.ts","../src/creation/prerequisiteprocessing.ts","../src/creation/creation.ts","../src/creation/index.ts","../src/searching/types.ts","../src/searching/validation.ts","../src/searching/prerequisites.ts","../src/searching/ordering.ts","../src/searching/index.ts","../src/index.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/crypto.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/undici-types/utility.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client-stats.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/round-robin-pool.d.ts","../../../node_modules/undici-types/h2c-client.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-call-history.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/snapshot-agent.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/cache-interceptor.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts"],"fileInfos":[{"version":"16934abaab7026ac114da441aabea1a0","affectsGlobalScope":true,"impliedNodeFormat":1},"d4306fb2e47f74835e8674ffac07d76f","e437c5c1302869326c3bb93da85bbbcf","e4324975a566567b21d350615f1fc6ac","333b1b9a2a9ac3b8497dba5c63b5ba50","6cffacd662b6eb5fa7a36aa2ea366bfa","b4c34f9c23304dbef2d23698637ed638","e5cb86a5fc491796ecd1d2dd348d208f","feb6c6fb19cdb246a5d8acb36a6901c7","9443a7f109277ffaa79d893ed2549995",{"version":"aae8996e8b5684814785a42cbbefcd79","affectsGlobalScope":true,"impliedNodeFormat":1},"abad6dd56cc8caf095c165df8124d237","abad6dd56cc8caf095c165df8124d237",{"version":"2a9941db0809c9ad0e8837ed629b1dcc","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d051b93324f36bcc68d152a5ca0988cd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"926204c28cd3d073865348473ae28d2e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"f25e42c801b2cb3cf2b39792006a9beb","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6344b55f26a4e81d9608777dbfb877dd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3c0ed28e53d3695b363e256ec1c023fd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4c2761daba7f17141c25baa0821ac5da","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b87656acabd63e69379ff6ffcfe52fc7","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"597469522da047a5af5222cc6989f405","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1708ea4d34dc37fadadc63ca01127e80","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"55d97a8c6fbf34a30450a7b1e5f7a298","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0ee05eb59426d33e374226d8dcfa708b","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"e347c14030993906efcfbb88915b6a05","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b0231263857c9b6a03641acdc9280ceb","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3b15c4a83b598cacb4067676e6f0abed","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b417d97b7934cef63b1889abec0bbfbf","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"09a6cf4032ebba60ce22a501e663f881","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"2b056277dd138e8f5650fc04e20eaa8d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"e22cc07e3f3cc242ba52fa3f8ea1fc58","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"2c45da767a1bfbb220848df1bc4029e4","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b44c3e0fbaf2130cdcf6ac38b120ffa1","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b612fb5cf8e5d964b92063a75207632a","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"02705151a5e1551b9162a9ed8ab763f7","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"41025e398be9215d32e4337335da8f0b","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"52684c2b1f353a5538e4f275182a54cd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6dedb6a4f90d1df3a6fbe5693e44886c","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ca3f36fe3562c07e0f0d71c2bebd3f6d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"409974d6129befbb8226ddd1c6558568","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4d9cfde2a1ae1b4925f1f9bc10848e5d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7e1daecc66dd564144e3bb1a0266b5fd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a8e1d9bb35fd0637f2f9fd2b2a54f2ec","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4f168501772a6543182765bfd5f2fbfe","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a19c80aad1b2162103496f5ba293a732","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b69afa63cd5d059851c78adb2856ee09","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ae2fc5d954e9b0f5feee3d481b953c27","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1cfd3091a071d8b6feec15277643bafe","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1da2c1f258970fd3cc91184f69e91a9d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a0d87491913d843139e0c993650a3235","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4ef72aa378127e7b7abba915b0110b1e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3ec74c6a7d4463f0254db3a74cf75646","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"84c2bdfa470d075526cce6322d81b0b6","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0b3844c2b8c73e4e1ab91431411cad11","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4fc71cf4a15b8d99675a31df77f26e07","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d1b49564ddaeca3df5b6dbae925d2242","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6a25be566d60ccfc2d6e8b7bfdeefa83","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"8a20e27646985dfd58c57ca6566553dd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9969f02ad3cdcbf4f709405cda44167f","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9c9be4792a7a4f42c15ae7360bf28779","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"8cf777fe00349b71ee9c4b6f3fe7fd19","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"74f96bc192530c9723f572bfff3d3078","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1df91c56b25955c56387426f378173c5","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0219894bfe5042c7e1aa2d22e4a91ed0","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"be41035d7b941482a1e1ae6a5c5dcca5","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"f64453cbf9671f28158677fa5c43967a","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"33f317af5428801f944a478d2c1e38e5","affectsGlobalScope":true,"impliedNodeFormat":1},"e1c7e28ac89b8a663c388c275b41bf44",{"version":"31d509daa66ce2489b94bcd8746b4b0e","impliedNodeFormat":99},{"version":"abdf9fec62e086e2ee09f12f262ef089","impliedNodeFormat":99},{"version":"ab9864ab545be6c07f2a198e1255c63c","impliedNodeFormat":99},{"version":"7c2ca67b26ccf6464ef97dabe36b4360","impliedNodeFormat":99},{"version":"9deaf87d471d9faea3d94b2705850e54","impliedNodeFormat":99},{"version":"028b0dfbc78670a97d236aaaa4f33159","impliedNodeFormat":99},{"version":"ccd4e3a245e67caa589d93e789d0a2a6","impliedNodeFormat":99},{"version":"096250c296e3ca12b3dae43d6a6291e4","impliedNodeFormat":99},{"version":"ea50a96a56b8f4d68b7196ccf21064e7","impliedNodeFormat":99},{"version":"cf7959fe846b305e36fa1a72ed84ba1b","impliedNodeFormat":99},{"version":"60ac26e77ee1006b71d81be71ffcb85a","impliedNodeFormat":99},{"version":"05e626a21409465d17f3f320047db56c","impliedNodeFormat":99},{"version":"58ee06af65ddfee826d566951bcdf7f3","impliedNodeFormat":99},{"version":"37f0f18fa417be41b8566398c7c560e3","impliedNodeFormat":99},{"version":"2b95e28478277b571e2200e26d188361","impliedNodeFormat":99},{"version":"3fbec79763a8d1b6f98e7cbfe1a64817","impliedNodeFormat":99},{"version":"059a5721c11c5afb84a60db1f00a03b6","impliedNodeFormat":99},{"version":"711e626f0ef549b524848da235b1cf93","impliedNodeFormat":99},{"version":"8e96dd6cf12cc9cdea0fac62f631c06d","impliedNodeFormat":99},{"version":"88c2de37df8103d5802d68394879d8e9","impliedNodeFormat":99},{"version":"91ccb757d1419d7cf24639500630ff54","impliedNodeFormat":99},{"version":"173c4f2211cf9ed0afe7cb7d29a2d9a8","impliedNodeFormat":99},{"version":"b6bacfb81f1ad31f6672257423ddc3b4","signature":"ddb9dcaf333ea49809b51c373e3169af","impliedNodeFormat":99},{"version":"0a5f9ea1a2907d0c3acce959f667e7d6","impliedNodeFormat":99},{"version":"62064d4505a357a7b3bd5fc002f01a6c","impliedNodeFormat":99},{"version":"b261d377ba6cab61b65229f8926d6c96","impliedNodeFormat":99},{"version":"5192a8f4e703e7fde6730938025f5623","impliedNodeFormat":99},{"version":"be9bcaaed12642dcb4f4b544382c0358","impliedNodeFormat":99},{"version":"21ccea272ffdebf648e4836834ea03f0","impliedNodeFormat":99},{"version":"d270959207f8e0d77bc290cb9b9fd246","impliedNodeFormat":99},{"version":"0adefc42b494adacd96ce55e2f64f9da","impliedNodeFormat":99},{"version":"17e818460750c7024b6b3d9ef9d489ca","impliedNodeFormat":99},{"version":"4c488904ad7ff9227d0d8f3704a586f6","impliedNodeFormat":99},{"version":"af0629723a39c856ba0958eb355a5cbe","impliedNodeFormat":99},{"version":"81a34d18a0ae9698642df2775695856d","impliedNodeFormat":99},{"version":"de24a9130664ba61652244cd2a232aed","impliedNodeFormat":99},{"version":"22b5d13c1a4f6516b6d7983939a8afc8","impliedNodeFormat":99},{"version":"72eb493e0bdad7f4ce302f0dbcce2641","impliedNodeFormat":99},{"version":"8ea7ff3dda12c32e077979de0e96715a","impliedNodeFormat":99},{"version":"a72446394410a3b03a7944e1780db6d3","impliedNodeFormat":99},{"version":"ded14b0e81fbadee602d95eba42ff17f","impliedNodeFormat":99},{"version":"ecb00340e935f501e79ab8d899bc370e","impliedNodeFormat":99},{"version":"a087d7ff39aa2c3d8cc870d8f05110e3","impliedNodeFormat":99},{"version":"f1d1cd98c334c216129f02b5f2adf9ee","impliedNodeFormat":99},{"version":"ac9a7aeb0ced50c8f83b661dd3d07a81","impliedNodeFormat":99},{"version":"089d4dd21214ba138c00815377853c5a","impliedNodeFormat":99},{"version":"2e346c22cde3aa31556967609b18c3f1","impliedNodeFormat":99},{"version":"0c0bbfc7dc00995d89bd217b45988ebb","impliedNodeFormat":99},{"version":"3ce013a7452ce40a72df47bd8ec12c0d","impliedNodeFormat":99},{"version":"b96e5eb97d6ed420b3367ca1888799df","impliedNodeFormat":99},{"version":"fa30278ec533c6d335d9aa86c30a8e8c","impliedNodeFormat":99},{"version":"89eac0e3c015c350fe1ebac681a1a743","impliedNodeFormat":99},{"version":"34eeab91b34ead376cdf527ad00a7ca5","impliedNodeFormat":99},{"version":"c3dddbbb572f9063bc1dc3fc4a92eaf2","impliedNodeFormat":99},{"version":"78f92c2ed83abd1fad7a4bd2d60b303e","impliedNodeFormat":99},{"version":"ae7cbf0166aad0aa133e9822dc26111d","impliedNodeFormat":99},{"version":"2458cb653e64298b96bc887a530c517a","impliedNodeFormat":99},{"version":"8cdcb64a3be9d482f7122864d95a9397","impliedNodeFormat":99},{"version":"cca1fe32626ac20ce59f0cb719c8e76a","impliedNodeFormat":99},{"version":"a9132f160817b236f8ed6177f83d83f0","impliedNodeFormat":99},{"version":"c5bcd18cf7ef8e12a0b5622e135b7dd5","impliedNodeFormat":99},{"version":"e2cfa86440881bab6e1c64d446adc5e3","impliedNodeFormat":99},{"version":"1073ad741b156bbaa728b8ccc8445788","impliedNodeFormat":99},{"version":"4c8efa49ef555631b0239d6431361d61","impliedNodeFormat":99},{"version":"ab880af2d4e78f1be40ab8b6672342c4","impliedNodeFormat":99},{"version":"dd03d213f167f308786e240f22f88383","impliedNodeFormat":99},{"version":"7ae7b3c7d629106dbc4d3d9995cd61de","impliedNodeFormat":99},{"version":"a8492ae6a4973951c06a405cd33bb018","signature":"d5c111e08f7f6af6c4be1a5c04f49a25","impliedNodeFormat":99},{"version":"53a6f1fda2f02d8707254ec7a6f85001","signature":"ab63286a8e5116cac7bb286dedc56c6f","impliedNodeFormat":99},{"version":"793e341247d63a12bf80c60429abeafc","signature":"fa24e3c004d56b6dee776fdbebbd68c1","impliedNodeFormat":99},{"version":"e78948748a06416b73f9f18b0a8d18d4","signature":"eaa299603d0d0a4ea15c46ce915541d6","impliedNodeFormat":99},{"version":"3bbd8f30315147434cdd597de1c07b61","signature":"05d2ac286c055fc4608bbb24052a7d01","impliedNodeFormat":99},{"version":"2b5e47dd1160a0dd490bdd3cd17b27b8","signature":"6df9f9f7de9b81763d21351a49d47175","impliedNodeFormat":99},{"version":"7d32d78b31de2baad629410ecaab98b1","signature":"733510b4b4df9d530f856cd229d202e6","impliedNodeFormat":99},{"version":"2927146a876f5c17b2ee3284dd19902a","signature":"d81c904fb5fa68dc1f7ea62eafe183af","impliedNodeFormat":99},{"version":"75a9268814afbfdee876b25563ea5581","signature":"11df0829b52a4980dc28b99aa6c2954e","impliedNodeFormat":99},{"version":"b0af6ca31509178b688e6d7490fda5d6","signature":"0cb6fec14122487b188c9f6963f3c4b2","impliedNodeFormat":99},{"version":"8946a152de2e1dc56b48cb33acee9b5b","signature":"55d9b60cd603db9c98083d5294436c15","impliedNodeFormat":99},{"version":"6b75e1274b5bb00948d89af31d88d9fd","signature":"b6e8e3f515e3cae264f7967cd842ecbe","impliedNodeFormat":99},{"version":"2514e9a2749c0fc18d2f478e9e1e641e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6ae4c332ecb24e76c1e47c0e21d4663d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"69ee0752d1e70c56ca160360425752a9","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"bf33440030f0a0fae7d1efd6c293a8d2","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9af0a7e3ef1c42cd066b9f8d365cc1ba","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7b772cebc7136c34fc77954aef70519d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9eca652586205dc5b07f9ba57b1c8500","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ec5f75939754ce94652189ec7d0d3058","affectsGlobalScope":true,"impliedNodeFormat":1},"49133c0dfbc32ab95668c3443dea49e5","85c2cf74d24d4069fac4686501a2d7e3","9f970a4ba4bb3ed6326d46b3ddab3f63","f444b82bb192c8ecc7c9a06cba5c1fba","75de66fc4824402123c0d694ccc0a085","db51f206bae5021bd84c7079251e08e9","fcd1a513c1e5802916fa602e8b8e64bc","aedc93367cdc148d7dd56ef6fd5ef308","8e2bc11d0328ba95e490a741c44a215d","d63481078bffe02fbaf6694a35815dc7","705645fe223430c696f47b708d592ca8","28d57c837c94adb42add03d499793cab","8c01a9bbae8449be21b3e018d59a74ac","44d3b7d58481743f4726cf411e667164","679024f8e9f58a112f4badf119c4d612","74d351e4ed233e82c6d74c444c1a6b86","94d8e37d28e92494f484dd9afe8f043c","79db245997e9261ae21e5f3d93e3493b","c3659054228b00c4e2a22d9ebea8b4f0","d7e5f7a0f1f883f28458f684106e7643","c2364011a80b6a9e3cc0e77895bad577","38da5c670190f4a35cbc204ca6c616bf","d95cc0eb29beed58f5ce72db21398f53","ecd53256b1ec7379c73316eaf392a69c","db5a9211b779628398011a5b8f5b8b5d","69c7bb9c3befe9ae37eed0e6a6310fee","1cba93fafccb7b2655f0e75229185e83","094ecadae30f65a82b77343dde77a666","f75df12d75dd783b03a0329b95abdb25","b438b08b2f0ed94a95a75c8990d9021b","f2becd2589591db92ab14e803eb8bdd5","8dec66ce34e6fe771e58a92b7068edc0","30f12c2660896a33bd3c3a126392c80a","0468c0ccd0ec7770b76481b165564d62","188234d616a4f50ed9b14c8f84a39f33","4c116bcf0a47ea8fbf4072f380925fa7","22111ccb71c0e95ff0796144b40eed2b","add85ec26ba695fc99c698dbec065f8c","5bfde23f96fc502b5413d772c35e1abf","b744265d8ad12b7d4d5c5dc35d18d44e","eff32168b8348b822afeed9cbf61afa7","acaa6ef6fcd5ba662929d6036121a616",{"version":"dd1cf1cc3aa21cd78b4869a44d98c6d9","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"292c9398a407b33b1d9c9812b673387a","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"45df94b3c51b898624bacc2bcd6d9eb2","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7d352f71d1b1bcc12c79dd0e4597537c","affectsGlobalScope":true,"impliedNodeFormat":1},"db11b80743ed5356b81d763a708788e6","39078ea063fcaf72bd3cca7e0d13d017","f81aa09811fa65ac6f354ab0018d3c38",{"version":"282318b178d190157a4deacb14f3040a","affectsGlobalScope":true,"impliedNodeFormat":1},"aafe512c4216100fd65028f9b2afce83","54c5c3dcfdb5f7cf5fbbccfff6ead3fa",{"version":"dc14f078230582a2f8fb2138bfcf4f85","affectsGlobalScope":true,"impliedNodeFormat":1},"b2b472cd0bf0f8d5f022e00ca1c401f4","370d966b810b687a9e58851208cb3d4c","39b3089f3df8d14e0f2ddac0479872d9","cc7a57e86f908c313649aea8d90377e1","5c271f10d8a9b9a1206bc82a4fe5b84d","fbe31979333ec391d8b59e8f42236e8e","6751c8c175fac6bbe7b935582cdfdca7",{"version":"a3f111d2a29b6cdd04fc4b41aa560c86","affectsGlobalScope":true,"impliedNodeFormat":1},"5f4ac576bcdc670a8489c881b23a2b17","a500e7362abeae2d2f1fefea525dc869","02a1ccf1ef65bfbf65865ac4ce346974","d589d01c82f6793f20d2f5c838462e3d","dbe700f7f1fa52fd220c7ee2c6617ebc","579675a2c3b0f8c532a82ad9cbd5d384","b2e8f93606aeb2dee2a4cc9272c56973",{"version":"a8e5d3e42303570b1114b6cd9ef9f38a","affectsGlobalScope":true,"impliedNodeFormat":1},"0003c8459d069181cc4856724fcf2832","c9053dbbe4fa2853f2d3f73b9a2fee81","4e458316a6083cbd2bba2fd29f674dd5",{"version":"3cccee1f2c106192d18ac4e08119f872","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"057189402e597cd50262b082723f21ff","affectsGlobalScope":true,"impliedNodeFormat":1},"6b26581aa2587701d570206a0db8c9ee","88a29e2aac8082c0910733950159e1ca","10282f14d9c2a5cbf3bcf2b1c8cebeaf","0f80958d77cd6301b43c1d7904e3e4bc","3bdc645524ab0d2f6795d3a008833bd7","deb50b47eb75a5566532a763fa1324fa","6e61cd09c2e15845909de3ed59a00b37","3e4ffe5f2733e0589b2612bd86f6cec3","c8206d568b54e5ea06131963eecd576a","15878f4f50c2e562c0768eb735c2aed5",{"version":"cb8f7733bee3d973c152a75fad9f6da6","affectsGlobalScope":true,"impliedNodeFormat":1},"dd404118e8bd70aff746f7d31e46270b","a0fa4618173795c74b488178ea77f951",{"version":"6b8649a280031d9e86955db721cfad87","affectsGlobalScope":true,"impliedNodeFormat":1},"4bc8f13c472858fb74f77388c0c5d885","75ab229142dad0ca2ff14d02d52f11f9","c72d2516d1e8910caca33c4dff75fcd4","f0231f36cb7117fbe9271ff19ef0f5f4",{"version":"8a642eed2a45ac7028479b6089a04842","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1e6ddb6b86dc5d86e75ba797d5324346","affectsGlobalScope":true,"impliedNodeFormat":1},"701aef085585b152042aa216b06bb4b8","e9bc5b1de50e48fa9857b64091673883","9268959cff1006c82e6abbd73824db97",{"version":"8f1c048bd5761910f5ea340fe4d792cd","affectsGlobalScope":true,"impliedNodeFormat":1},"6b1f3649b0eabeaca20c778fcc5f270c","eb567c7b5824aab578f75bbccf9f4b05"],"fileIdsList":[[151,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,198,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[149,150,151,152,153,154,155,156,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,254,255],[151,198,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,198,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254],[151,163,166,169,170,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,166,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,166,170,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,160,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,164,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,162,163,166,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256],[151,160,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256],[151,162,166,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,157,158,159,161,165,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,166,175,183,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,158,164,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,166,192,193,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,158,161,166,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256],[151,157,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,160,161,162,164,165,166,167,168,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,193,194,195,196,197,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,166,185,188,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,166,175,176,177,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,164,166,176,178,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,165,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,158,160,166,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,166,170,176,178,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,170,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,164,166,169,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,158,162,166,175,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,166,185,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,178,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[151,160,166,192,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256],[106,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[107,108,109,110,111,112,113,114,115,116,117,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[99,109,111,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[111,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[133,134,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[131,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[124,125,126,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[118,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[99,106,118,123,127,130,132,135,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[100,101,102,103,104,105,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[93,94,95,96,97,98,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[128,129,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[119,120,121,122,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[92,138,139,140,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[91,92,136,137,138,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[92,137,141,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[92,136,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[92,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[91,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[142,147,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[143,144,145,146,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[136,142,143,144,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[142,143,144,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[91,142,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[70,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[70,71,72,73,74,75,76,77,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[79,80,81,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[79,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[78,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[82,89,90,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[82,89,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[78,82,83,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[83,84,85,86,87,88,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],[78,82,151,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255]],"options":{"composite":true,"declaration":true,"declarationMap":true,"module":199,"outDir":"./","rewriteRelativeImportExtensions":true,"rootDir":"../src","skipLibCheck":true,"strict":true,"target":10,"tsBuildInfoFile":"./tsconfig.tsbuildinfo","esModuleInterop":true},"referencedMap":[[203,1],[204,2],[205,3],[151,4],[206,5],[207,6],[208,7],[149,8],[209,9],[210,10],[211,11],[212,12],[213,13],[214,14],[215,15],[216,16],[217,17],[218,18],[219,19],[152,8],[150,8],[220,20],[221,21],[222,22],[256,23],[223,24],[224,25],[225,26],[226,27],[227,28],[228,29],[229,30],[230,31],[231,32],[232,33],[233,34],[234,35],[235,36],[236,37],[237,38],[238,39],[240,40],[239,41],[241,42],[242,43],[243,44],[244,45],[245,46],[246,47],[247,48],[248,49],[249,50],[250,51],[251,52],[252,53],[253,54],[153,8],[154,8],[155,8],[156,8],[199,55],[200,8],[201,8],[202,8],[254,56],[255,57],[67,8],[68,8],[13,8],[11,8],[12,8],[17,8],[16,8],[2,8],[18,8],[19,8],[20,8],[21,8],[22,8],[23,8],[24,8],[25,8],[3,8],[26,8],[27,8],[4,8],[28,8],[32,8],[29,8],[30,8],[31,8],[33,8],[34,8],[35,8],[5,8],[36,8],[37,8],[38,8],[39,8],[6,8],[43,8],[40,8],[41,8],[42,8],[44,8],[7,8],[45,8],[50,8],[51,8],[46,8],[47,8],[48,8],[49,8],[8,8],[55,8],[52,8],[53,8],[54,8],[56,8],[9,8],[57,8],[58,8],[59,8],[61,8],[60,8],[62,8],[63,8],[10,8],[69,8],[64,8],[65,8],[1,8],[66,8],[15,8],[14,8],[175,58],[187,59],[172,60],[188,8],[197,61],[163,62],[164,63],[162,8],[196,64],[191,65],[195,66],[166,67],[184,68],[165,69],[194,70],[160,71],[161,65],[167,59],[168,8],[174,66],[171,59],[158,72],[198,73],[189,74],[178,75],[177,59],[179,76],[182,77],[176,78],[180,79],[192,64],[169,80],[170,81],[183,82],[159,8],[186,83],[185,59],[173,81],[181,84],[190,8],[157,8],[193,85],[107,86],[108,8],[112,8],[111,8],[118,87],[110,8],[113,8],[117,88],[116,8],[109,8],[114,89],[115,8],[133,8],[134,8],[135,90],[132,91],[131,8],[124,8],[127,92],[125,93],[126,8],[136,94],[104,8],[100,8],[101,8],[106,95],[102,8],[105,8],[103,8],[93,8],[95,8],[97,8],[99,96],[98,8],[96,8],[94,8],[128,8],[130,97],[129,8],[119,8],[122,8],[123,98],[121,8],[120,8],[141,99],[139,100],[142,101],[138,102],[140,103],[137,102],[92,104],[148,105],[147,106],[146,107],[145,108],[143,8],[144,109],[71,110],[76,110],[73,110],[72,110],[74,110],[78,111],[77,110],[75,110],[70,8],[82,112],[81,113],[80,113],[79,114],[91,115],[90,116],[84,117],[89,118],[85,117],[88,117],[87,117],[86,117],[83,119]],"latestChangedDtsFile":"./index.d.ts"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@step-wise/module-tree-definition",
3
+ "version": "0.1.0",
4
+ "description": "Define, validate, and search configurable educational module trees.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/HildoBijl/stepwise.git",
9
+ "directory": "packages/module-tree-definition"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/HildoBijl/stepwise/issues"
13
+ },
14
+ "homepage": "https://github.com/HildoBijl/stepwise/tree/main/packages/module-tree-definition#readme",
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "engines": {
19
+ "node": ">=24.12.0"
20
+ },
21
+ "type": "module",
22
+ "main": "./dist/index.js",
23
+ "types": "./dist/index.d.ts",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "scripts": {
36
+ "build": "tsc -b tsconfig.build.json",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest",
39
+ "watch": "tsc -b tsconfig.build.json --watch"
40
+ },
41
+ "dependencies": {
42
+ "@step-wise/skill-setup": "^0.1.0",
43
+ "@step-wise/js-utils": "^0.1.0"
44
+ },
45
+ "devDependencies": {
46
+ "vitest": "^5.0.0"
47
+ }
48
+ }