@f-o-t/rules-engine 3.0.1 → 3.0.5

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 (61) hide show
  1. package/dist/analyzer/analysis.d.ts +72 -0
  2. package/dist/analyzer/analysis.d.ts.map +1 -0
  3. package/dist/builder/conditions.d.ts +29 -0
  4. package/dist/builder/conditions.d.ts.map +1 -0
  5. package/dist/builder/rule.d.ts +40 -0
  6. package/dist/builder/rule.d.ts.map +1 -0
  7. package/dist/cache/cache.d.ts +21 -0
  8. package/dist/cache/cache.d.ts.map +1 -0
  9. package/dist/cache/noop.d.ts +3 -0
  10. package/dist/cache/noop.d.ts.map +1 -0
  11. package/dist/core/evaluate.d.ts +21 -0
  12. package/dist/core/evaluate.d.ts.map +1 -0
  13. package/dist/core/filter.d.ts +8 -0
  14. package/dist/core/filter.d.ts.map +1 -0
  15. package/dist/core/group.d.ts +10 -0
  16. package/dist/core/group.d.ts.map +1 -0
  17. package/dist/core/sort.d.ts +14 -0
  18. package/dist/core/sort.d.ts.map +1 -0
  19. package/dist/engine/engine.d.ts +27 -0
  20. package/dist/engine/engine.d.ts.map +1 -0
  21. package/dist/engine/hooks.d.ts +16 -0
  22. package/dist/engine/hooks.d.ts.map +1 -0
  23. package/dist/engine/state.d.ts +19 -0
  24. package/dist/engine/state.d.ts.map +1 -0
  25. package/dist/index.d.ts +33 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +3083 -0
  28. package/dist/index.js.map +37 -0
  29. package/dist/optimizer/index-builder.d.ts +48 -0
  30. package/dist/optimizer/index-builder.d.ts.map +1 -0
  31. package/dist/serialization/serializer.d.ts +79 -0
  32. package/dist/serialization/serializer.d.ts.map +1 -0
  33. package/dist/simulation/simulator.d.ts +65 -0
  34. package/dist/simulation/simulator.d.ts.map +1 -0
  35. package/dist/types/config.d.ts +87 -0
  36. package/dist/types/config.d.ts.map +1 -0
  37. package/dist/types/consequence.d.ts +21 -0
  38. package/dist/types/consequence.d.ts.map +1 -0
  39. package/dist/types/evaluation.d.ts +70 -0
  40. package/dist/types/evaluation.d.ts.map +1 -0
  41. package/dist/types/rule.d.ts +114 -0
  42. package/dist/types/rule.d.ts.map +1 -0
  43. package/dist/types/state.d.ts +65 -0
  44. package/dist/types/state.d.ts.map +1 -0
  45. package/dist/utils/conditions.d.ts +24 -0
  46. package/dist/utils/conditions.d.ts.map +1 -0
  47. package/dist/utils/hash.d.ts +3 -0
  48. package/dist/utils/hash.d.ts.map +1 -0
  49. package/dist/utils/id.d.ts +2 -0
  50. package/dist/utils/id.d.ts.map +1 -0
  51. package/dist/utils/time.d.ts +8 -0
  52. package/dist/utils/time.d.ts.map +1 -0
  53. package/dist/validation/conflicts.d.ts +25 -0
  54. package/dist/validation/conflicts.d.ts.map +1 -0
  55. package/dist/validation/integrity.d.ts +38 -0
  56. package/dist/validation/integrity.d.ts.map +1 -0
  57. package/dist/validation/schema.d.ts +69 -0
  58. package/dist/validation/schema.d.ts.map +1 -0
  59. package/dist/versioning/version-store.d.ts +50 -0
  60. package/dist/versioning/version-store.d.ts.map +1 -0
  61. package/package.json +35 -34
@@ -0,0 +1,37 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/analyzer/analysis.ts", "../src/utils/conditions.ts", "../src/builder/conditions.ts", "../src/builder/rule.ts", "../src/cache/cache.ts", "../src/cache/noop.ts", "../src/utils/time.ts", "../src/core/evaluate.ts", "../src/core/filter.ts", "../src/core/group.ts", "../src/core/sort.ts", "../src/engine/engine.ts", "../src/types/config.ts", "../src/types/state.ts", "../src/utils/hash.ts", "../src/utils/id.ts", "../src/engine/hooks.ts", "../src/engine/state.ts", "../src/optimizer/index-builder.ts", "../src/serialization/serializer.ts", "../src/simulation/simulator.ts", "../src/types/evaluation.ts", "../src/types/rule.ts", "../src/validation/conflicts.ts", "../src/validation/integrity.ts", "../src/validation/schema.ts", "../src/versioning/version-store.ts"],
4
+ "sourcesContent": [
5
+ "export type {\n ArrayCondition,\n ArrayOperator,\n BooleanCondition,\n BooleanOperator,\n Condition,\n ConditionGroup,\n CustomCondition,\n DateCondition,\n DateOperator,\n EvaluationResult,\n GroupEvaluationResult,\n LogicalOperator,\n NumberCondition,\n NumberOperator,\n StringCondition,\n StringOperator,\n} from \"@f-o-t/condition-evaluator\";\nexport {\n ConditionGroup as ConditionGroupSchema,\n isConditionGroup,\n createEvaluator,\n createOperator,\n} from \"@f-o-t/condition-evaluator\";\nexport {\n analyzeConsequenceUsage,\n analyzeFieldUsage,\n analyzeOperatorUsage,\n analyzeRuleComplexity,\n analyzeRuleSet,\n type ConsequenceUsage,\n type FieldUsage,\n findLeastUsedFields,\n findMostComplexRules,\n formatRuleSetAnalysis,\n type OperatorUsage,\n type RuleComplexity,\n type RuleSetAnalysis,\n} from \"./analyzer/analysis\";\nexport {\n all,\n and,\n any,\n arr,\n bool,\n type ConditionBuilder,\n type ConditionBuilderState,\n conditions,\n date,\n num,\n or,\n resetBuilderIds,\n str,\n} from \"./builder/conditions\";\nexport {\n createRule,\n type RuleBuilder,\n type RuleBuilderState,\n rule,\n} from \"./builder/rule\";\nexport {\n type Cache,\n type CacheEntry,\n type CacheOptions,\n createCache,\n} from \"./cache/cache\";\nexport { createNoopCache } from \"./cache/noop\";\nexport {\n type EvaluateRuleOptions,\n type EvaluateRulesOptions,\n type EvaluateRulesResult,\n evaluateRule,\n evaluateRules,\n} from \"./core/evaluate\";\nexport {\n filterByCategory,\n filterByEnabled,\n filterByIds,\n filterByTags,\n filterRules,\n} from \"./core/filter\";\nexport {\n type GroupByField,\n type GroupedRules,\n groupByCategory,\n groupByCustom,\n groupByEnabled,\n groupByPriority,\n groupRules,\n} from \"./core/group\";\nexport {\n type SortDirection,\n type SortField,\n type SortOptions,\n sortByCreatedAt,\n sortByName,\n sortByPriority,\n sortByUpdatedAt,\n sortRules,\n} from \"./core/sort\";\nexport { createEngine, type Engine } from \"./engine/engine\";\nexport {\n addRule,\n addRuleSet,\n addRules,\n clearRules,\n cloneState,\n disableRule,\n enableRule,\n getRule,\n getRuleSet,\n getRuleSets,\n getRules,\n getRulesInSet,\n removeRule,\n removeRuleSet,\n updateRule,\n} from \"./engine/state\";\nexport {\n analyzeOptimizations,\n buildIndex,\n type CategoryIndex,\n type FieldIndex,\n filterRulesForContext,\n getIndexStats,\n getRuleById,\n getRulesByCategory,\n getRulesByField,\n getRulesByFields,\n getRulesByPriority,\n getRulesByPriorityRange,\n getRulesByTag,\n getRulesByTags,\n type IndexOptions,\n type OptimizationSuggestion,\n type PriorityIndex,\n type RuleIndex,\n type TagIndex,\n} from \"./optimizer/index-builder\";\nexport {\n cloneRule,\n deserializeRule,\n deserializeRuleSet,\n diffRuleSets,\n type ExportFormat,\n exportRules,\n exportToJson,\n type ImportOptions,\n type ImportResult,\n importFromJson,\n importRules,\n mergeRuleSets,\n type OrphanedReference,\n type SerializedRule,\n type SerializedRuleSet,\n serializeRule,\n serializeRuleSet,\n} from \"./serialization/serializer\";\nexport {\n type BatchSimulationResult,\n batchSimulate,\n findRulesAffectedByContextChange,\n formatSimulationResult,\n type SimulationContext,\n type SimulationResult,\n simulate,\n simulateSingleRule,\n type WhatIfResult,\n whatIf,\n} from \"./simulation/simulator\";\nexport type {\n CacheConfig,\n EngineConfig,\n EngineHooks,\n Logger,\n LogLevel,\n ResolvedEngineConfig,\n ValidationConfig,\n VersioningConfig,\n} from \"./types/config\";\nexport {\n CacheConfigSchema,\n getDefaultCacheConfig,\n getDefaultConflictResolution,\n getDefaultLogLevel,\n getDefaultValidationConfig,\n getDefaultVersioningConfig,\n LogLevelSchema,\n parseCacheConfig,\n parseValidationConfig,\n parseVersioningConfig,\n ValidationConfigSchema,\n VersioningConfigSchema,\n} from \"./types/config\";\nexport type {\n AggregatedConsequence,\n Consequence,\n ConsequenceDefinitions,\n ConsequenceInput,\n DefaultConsequences,\n InferConsequencePayload,\n InferConsequenceType,\n} from \"./types/consequence\";\nexport type {\n ConflictResolutionStrategy,\n EngineExecutionResult,\n EvaluateConfig,\n EvaluateOptions,\n EvaluationContext,\n RuleEvaluationResult,\n} from \"./types/evaluation\";\nexport {\n ConflictResolutionStrategySchema,\n EvaluateConfigSchema,\n EvaluateOptionsSchema,\n} from \"./types/evaluation\";\nexport type {\n Rule,\n RuleFilters,\n RuleInput,\n RuleSchemaType,\n RuleSet,\n RuleSetInput,\n RuleSetSchemaType,\n} from \"./types/rule\";\nexport { RuleSchema, RuleSetSchema } from \"./types/rule\";\nexport type {\n CacheStats,\n EngineState,\n EngineStats,\n OptimizerState,\n RuleStats,\n} from \"./types/state\";\nexport {\n CacheStatsSchema,\n createInitialOptimizerState,\n createInitialRuleStats,\n createInitialState,\n EngineStatsSchema,\n RuleStatsSchema,\n} from \"./types/state\";\nexport { hashContext, hashRules } from \"./utils/hash\";\nexport { generateId } from \"./utils/id\";\nexport {\n measureTime,\n measureTimeAsync,\n type TimingResult,\n withTimeout,\n} from \"./utils/time\";\nexport {\n type Conflict,\n type ConflictDetectionOptions,\n type ConflictType,\n detectConflicts,\n formatConflicts,\n getConflictsBySeverity,\n getConflictsByType,\n hasConflicts,\n hasErrors,\n} from \"./validation/conflicts\";\nexport {\n checkIntegrity,\n checkRuleFieldCoverage,\n formatIntegrityResult,\n getUsedFields,\n getUsedOperators,\n type IntegrityCheckOptions,\n type IntegrityCheckResult,\n type IntegrityIssue,\n} from \"./validation/integrity\";\nexport {\n createRuleValidator,\n parseRule,\n type ResolvedValidationOptions,\n safeParseRule,\n type ValidationError,\n ValidationErrorSchema,\n type ValidationOptions,\n ValidationOptionsSchema,\n type ValidationResult,\n ValidationResultSchema,\n validateConditions,\n validateRule,\n validateRuleSet,\n validateRules,\n} from \"./validation/schema\";\nexport {\n addVersion,\n compareVersions,\n createVersionStore,\n formatVersionHistory,\n getAllVersions,\n getHistory,\n getLatestVersion,\n getVersion,\n getVersionsByChangeType,\n getVersionsByDateRange,\n pruneOldVersions,\n type RuleVersion,\n rollbackToVersion,\n type VersionHistory,\n type VersionStore,\n} from \"./versioning/version-store\";\n",
6
+ "import {\n type Condition,\n type ConditionGroup,\n isConditionGroup,\n} from \"@f-o-t/condition-evaluator\";\nimport type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type { Rule } from \"../types/rule\";\nimport {\n calculateMaxDepth,\n collectConditionFields,\n countConditionGroups,\n countConditions,\n} from \"../utils/conditions\";\n\nexport type RuleComplexity = {\n readonly ruleId: string;\n readonly ruleName: string;\n readonly totalConditions: number;\n readonly maxDepth: number;\n readonly groupCount: number;\n readonly uniqueFields: number;\n readonly uniqueOperators: number;\n readonly consequenceCount: number;\n readonly complexityScore: number;\n};\n\nexport type RuleSetAnalysis = {\n readonly ruleCount: number;\n readonly enabledCount: number;\n readonly disabledCount: number;\n readonly totalConditions: number;\n readonly totalConsequences: number;\n readonly uniqueFields: ReadonlyArray<string>;\n readonly uniqueOperators: ReadonlyArray<string>;\n readonly uniqueConsequenceTypes: ReadonlyArray<string>;\n readonly uniqueCategories: ReadonlyArray<string>;\n readonly uniqueTags: ReadonlyArray<string>;\n readonly priorityRange: { min: number; max: number };\n readonly averageComplexity: number;\n readonly complexityDistribution: {\n readonly low: number;\n readonly medium: number;\n readonly high: number;\n };\n readonly ruleComplexities: ReadonlyArray<RuleComplexity>;\n};\n\nexport type FieldUsage = {\n readonly field: string;\n readonly count: number;\n readonly types: ReadonlyArray<string>;\n readonly operators: ReadonlyArray<string>;\n readonly rules: ReadonlyArray<{ id: string; name: string }>;\n};\n\nexport type OperatorUsage = {\n readonly operator: string;\n readonly type: string;\n readonly count: number;\n readonly rules: ReadonlyArray<{ id: string; name: string }>;\n};\n\nexport type ConsequenceUsage = {\n readonly type: string;\n readonly count: number;\n readonly rules: ReadonlyArray<{ id: string; name: string }>;\n};\n\nconst collectOperators = (\n condition: Condition | ConditionGroup,\n): Set<string> => {\n const operators = new Set<string>();\n\n const traverse = (c: Condition | ConditionGroup) => {\n if (isConditionGroup(c)) {\n operators.add(c.operator);\n for (const child of c.conditions) {\n traverse(child as Condition | ConditionGroup);\n }\n } else {\n operators.add(c.operator);\n }\n };\n\n traverse(condition);\n return operators;\n};\n\nconst calculateComplexityScore = (\n totalConditions: number,\n maxDepth: number,\n groupCount: number,\n uniqueFields: number,\n): number => {\n return (\n totalConditions * 1 + maxDepth * 2 + groupCount * 1.5 + uniqueFields * 0.5\n );\n};\n\nexport const analyzeRuleComplexity = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rule: Rule<TContext, TConsequences>,\n): RuleComplexity => {\n const totalConditions = countConditions(rule.conditions);\n const maxDepth = calculateMaxDepth(rule.conditions);\n const groupCount = countConditionGroups(rule.conditions);\n const uniqueFields = collectConditionFields(rule.conditions).size;\n const uniqueOperators = collectOperators(rule.conditions).size;\n const consequenceCount = rule.consequences.length;\n\n const complexityScore = calculateComplexityScore(\n totalConditions,\n maxDepth,\n groupCount,\n uniqueFields,\n );\n\n return {\n ruleId: rule.id,\n ruleName: rule.name,\n totalConditions,\n maxDepth,\n groupCount,\n uniqueFields,\n uniqueOperators,\n consequenceCount,\n complexityScore,\n };\n};\n\nexport const analyzeRuleSet = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): RuleSetAnalysis => {\n const complexities = rules.map(analyzeRuleComplexity);\n\n const allFields = new Set<string>();\n const allOperators = new Set<string>();\n const allConsequenceTypes = new Set<string>();\n const allCategories = new Set<string>();\n const allTags = new Set<string>();\n\n let totalConditions = 0;\n let totalConsequences = 0;\n let minPriority = Number.POSITIVE_INFINITY;\n let maxPriority = Number.NEGATIVE_INFINITY;\n let enabledCount = 0;\n\n for (const rule of rules) {\n totalConditions += countConditions(rule.conditions);\n totalConsequences += rule.consequences.length;\n\n if (rule.priority < minPriority) minPriority = rule.priority;\n if (rule.priority > maxPriority) maxPriority = rule.priority;\n\n if (rule.enabled) enabledCount++;\n\n for (const field of collectConditionFields(rule.conditions)) {\n allFields.add(field);\n }\n\n for (const operator of collectOperators(rule.conditions)) {\n allOperators.add(operator);\n }\n\n for (const consequence of rule.consequences) {\n allConsequenceTypes.add(consequence.type as string);\n }\n\n if (rule.category) allCategories.add(rule.category);\n for (const tag of rule.tags) allTags.add(tag);\n }\n\n const averageComplexity =\n complexities.length > 0\n ? complexities.reduce((sum, c) => sum + c.complexityScore, 0) /\n complexities.length\n : 0;\n\n const complexityDistribution = {\n low: complexities.filter((c) => c.complexityScore < 5).length,\n medium: complexities.filter(\n (c) => c.complexityScore >= 5 && c.complexityScore < 15,\n ).length,\n high: complexities.filter((c) => c.complexityScore >= 15).length,\n };\n\n return {\n ruleCount: rules.length,\n enabledCount,\n disabledCount: rules.length - enabledCount,\n totalConditions,\n totalConsequences,\n uniqueFields: [...allFields].sort(),\n uniqueOperators: [...allOperators].sort(),\n uniqueConsequenceTypes: [...allConsequenceTypes].sort(),\n uniqueCategories: [...allCategories].sort(),\n uniqueTags: [...allTags].sort(),\n priorityRange: {\n min: minPriority === Number.POSITIVE_INFINITY ? 0 : minPriority,\n max: maxPriority === Number.NEGATIVE_INFINITY ? 0 : maxPriority,\n },\n averageComplexity,\n complexityDistribution,\n ruleComplexities: complexities,\n };\n};\n\nexport const analyzeFieldUsage = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<FieldUsage> => {\n const fieldMap = new Map<\n string,\n {\n types: Set<string>;\n operators: Set<string>;\n rules: Array<{ id: string; name: string }>;\n }\n >();\n\n for (const rule of rules) {\n const traverse = (c: Condition | ConditionGroup) => {\n if (isConditionGroup(c)) {\n for (const child of c.conditions) {\n traverse(child as Condition | ConditionGroup);\n }\n } else {\n const existing = fieldMap.get(c.field) ?? {\n types: new Set(),\n operators: new Set(),\n rules: [],\n };\n existing.types.add(c.type);\n existing.operators.add(c.operator);\n if (!existing.rules.some((r) => r.id === rule.id)) {\n existing.rules.push({ id: rule.id, name: rule.name });\n }\n fieldMap.set(c.field, existing);\n }\n };\n\n traverse(rule.conditions);\n }\n\n return [...fieldMap.entries()]\n .map(([field, data]) => ({\n field,\n count: data.rules.length,\n types: [...data.types].sort(),\n operators: [...data.operators].sort(),\n rules: data.rules,\n }))\n .sort((a, b) => b.count - a.count);\n};\n\nexport const analyzeOperatorUsage = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<OperatorUsage> => {\n const operatorMap = new Map<\n string,\n { type: string; rules: Array<{ id: string; name: string }> }\n >();\n\n for (const rule of rules) {\n const traverse = (c: Condition | ConditionGroup) => {\n if (isConditionGroup(c)) {\n for (const child of c.conditions) {\n traverse(child as Condition | ConditionGroup);\n }\n } else {\n const key = `${c.type}:${c.operator}`;\n const existing = operatorMap.get(key) ?? {\n type: c.type,\n rules: [] as Array<{ id: string; name: string }>,\n };\n if (!existing.rules.some((r) => r.id === rule.id)) {\n existing.rules.push({ id: rule.id, name: rule.name });\n }\n operatorMap.set(key, existing);\n }\n };\n\n traverse(rule.conditions);\n }\n\n return [...operatorMap.entries()]\n .map(([key, data]) => {\n const parts = key.split(\":\");\n return {\n operator: parts[1] ?? \"\",\n type: data.type,\n count: data.rules.length,\n rules: data.rules,\n };\n })\n .sort((a, b) => b.count - a.count);\n};\n\nexport const analyzeConsequenceUsage = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<ConsequenceUsage> => {\n const consequenceMap = new Map<\n string,\n Array<{ id: string; name: string }>\n >();\n\n for (const rule of rules) {\n for (const consequence of rule.consequences) {\n const type = consequence.type as string;\n const existing = consequenceMap.get(type) ?? [];\n if (!existing.some((r) => r.id === rule.id)) {\n existing.push({ id: rule.id, name: rule.name });\n }\n consequenceMap.set(type, existing);\n }\n }\n\n return [...consequenceMap.entries()]\n .map(([type, rules]) => ({\n type,\n count: rules.length,\n rules,\n }))\n .sort((a, b) => b.count - a.count);\n};\n\nexport const findMostComplexRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n limit = 10,\n): ReadonlyArray<RuleComplexity> => {\n return rules\n .map(analyzeRuleComplexity)\n .sort((a, b) => b.complexityScore - a.complexityScore)\n .slice(0, limit);\n};\n\nexport const findLeastUsedFields = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n limit = 10,\n): ReadonlyArray<FieldUsage> => {\n return [...analyzeFieldUsage(rules)]\n .sort((a, b) => a.count - b.count)\n .slice(0, limit);\n};\n\nexport const formatRuleSetAnalysis = (analysis: RuleSetAnalysis): string => {\n const lines: string[] = [\n \"=== Rule Set Analysis ===\",\n \"\",\n `Rules: ${analysis.ruleCount} (${analysis.enabledCount} enabled, ${analysis.disabledCount} disabled)`,\n `Total Conditions: ${analysis.totalConditions}`,\n `Total Consequences: ${analysis.totalConsequences}`,\n \"\",\n `Unique Fields: ${analysis.uniqueFields.length}`,\n ` ${analysis.uniqueFields.join(\", \") || \"(none)\"}`,\n \"\",\n `Unique Operators: ${analysis.uniqueOperators.length}`,\n ` ${analysis.uniqueOperators.join(\", \") || \"(none)\"}`,\n \"\",\n `Consequence Types: ${analysis.uniqueConsequenceTypes.length}`,\n ` ${analysis.uniqueConsequenceTypes.join(\", \") || \"(none)\"}`,\n \"\",\n `Categories: ${analysis.uniqueCategories.length}`,\n ` ${analysis.uniqueCategories.join(\", \") || \"(none)\"}`,\n \"\",\n `Tags: ${analysis.uniqueTags.length}`,\n ` ${analysis.uniqueTags.join(\", \") || \"(none)\"}`,\n \"\",\n `Priority Range: ${analysis.priorityRange.min} - ${analysis.priorityRange.max}`,\n \"\",\n `Average Complexity: ${analysis.averageComplexity.toFixed(2)}`,\n `Complexity Distribution:`,\n ` Low (< 5): ${analysis.complexityDistribution.low}`,\n ` Medium (5-15): ${analysis.complexityDistribution.medium}`,\n ` High (> 15): ${analysis.complexityDistribution.high}`,\n ];\n\n return lines.join(\"\\n\");\n};\n",
7
+ "import {\n type Condition,\n type ConditionGroup,\n isConditionGroup,\n} from \"@f-o-t/condition-evaluator\";\n\n/**\n * Collects all unique field names from a condition tree.\n * Traverses nested condition groups recursively.\n */\nexport const collectConditionFields = (\n condition: ConditionGroup,\n): Set<string> => {\n const fields = new Set<string>();\n\n const traverse = (c: Condition | ConditionGroup) => {\n if (isConditionGroup(c)) {\n for (const child of c.conditions) {\n traverse(child as Condition | ConditionGroup);\n }\n } else {\n fields.add(c.field);\n }\n };\n\n traverse(condition);\n return fields;\n};\n\n/**\n * Collects all unique operators from a condition tree.\n * Returns a map of operator to its type (e.g., \"equals\" -> \"string\").\n */\nexport const collectConditionOperators = (\n condition: ConditionGroup,\n): Map<string, Set<string>> => {\n const operators = new Map<string, Set<string>>();\n\n const traverse = (c: Condition | ConditionGroup) => {\n if (isConditionGroup(c)) {\n for (const child of c.conditions) {\n traverse(child as Condition | ConditionGroup);\n }\n } else {\n const existing = operators.get(c.operator) ?? new Set<string>();\n existing.add(c.type);\n operators.set(c.operator, existing);\n }\n };\n\n traverse(condition);\n return operators;\n};\n\n/**\n * Counts the total number of leaf conditions in a condition tree.\n */\nexport const countConditions = (\n condition: Condition | ConditionGroup,\n): number => {\n if (isConditionGroup(condition)) {\n return condition.conditions.reduce(\n (sum: number, c: Condition | ConditionGroup) => sum + countConditions(c as Condition | ConditionGroup),\n 0,\n );\n }\n return 1;\n};\n\n/**\n * Calculates the maximum depth of a condition tree.\n */\nexport const calculateMaxDepth = (\n condition: Condition | ConditionGroup,\n currentDepth = 1,\n): number => {\n if (isConditionGroup(condition)) {\n if (condition.conditions.length === 0) return currentDepth;\n return Math.max(\n ...condition.conditions.map((c: Condition | ConditionGroup) =>\n calculateMaxDepth(\n c as Condition | ConditionGroup,\n currentDepth + 1,\n ),\n ),\n );\n }\n return currentDepth;\n};\n\n/**\n * Counts the number of condition groups in a condition tree.\n */\nexport const countConditionGroups = (\n condition: Condition | ConditionGroup,\n): number => {\n if (isConditionGroup(condition)) {\n return (\n 1 +\n condition.conditions.reduce(\n (sum: number, c: Condition | ConditionGroup) =>\n sum + countConditionGroups(c as Condition | ConditionGroup),\n 0,\n )\n );\n }\n return 0;\n};\n",
8
+ "import type { Condition, ConditionGroup } from \"@f-o-t/condition-evaluator\";\n\nexport type ConditionBuilderState = {\n readonly conditions: (Condition | ConditionGroup)[];\n};\n\nexport type ConditionBuilder = {\n readonly number: (\n field: string,\n operator: \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"eq\" | \"neq\",\n value: number,\n ) => ConditionBuilder;\n\n readonly string: (\n field: string,\n operator:\n | \"eq\"\n | \"neq\"\n | \"contains\"\n | \"not_contains\"\n | \"starts_with\"\n | \"ends_with\"\n | \"in\"\n | \"not_in\"\n | \"like\"\n | \"not_like\"\n | \"ilike\"\n | \"not_ilike\"\n | \"regex\"\n | \"not_regex\",\n value: string | string[],\n ) => ConditionBuilder;\n\n readonly boolean: (\n field: string,\n operator: \"eq\" | \"neq\",\n value: boolean,\n ) => ConditionBuilder;\n\n readonly date: (\n field: string,\n operator: \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"eq\" | \"neq\" | \"between\",\n value: string | Date | [string | Date, string | Date],\n ) => ConditionBuilder;\n\n readonly array: (\n field: string,\n operator:\n | \"contains\"\n | \"not_contains\"\n | \"contains_all\"\n | \"contains_any\"\n | \"is_empty\"\n | \"is_not_empty\"\n | \"length_eq\"\n | \"length_gt\"\n | \"length_lt\",\n value: unknown,\n ) => ConditionBuilder;\n\n readonly ref: (\n field: string,\n operator: string,\n valueRef: string,\n ) => ConditionBuilder;\n\n readonly and: (\n builder: (cb: ConditionBuilder) => ConditionBuilder,\n ) => ConditionBuilder;\n\n readonly or: (\n builder: (cb: ConditionBuilder) => ConditionBuilder,\n ) => ConditionBuilder;\n\n readonly raw: (condition: Condition | ConditionGroup) => ConditionBuilder;\n\n readonly build: () => ConditionGroup;\n\n readonly getConditions: () => ReadonlyArray<Condition | ConditionGroup>;\n};\n\nlet conditionIdCounter = 0;\nlet groupIdCounter = 0;\n\nconst generateConditionId = (): string => `cond-${++conditionIdCounter}`;\nconst generateGroupId = (): string => `group-${++groupIdCounter}`;\n\nexport const resetBuilderIds = (): void => {\n conditionIdCounter = 0;\n groupIdCounter = 0;\n};\n\nconst createConditionBuilder = (\n state: ConditionBuilderState = { conditions: [] },\n operator: \"AND\" | \"OR\" = \"AND\",\n): ConditionBuilder => {\n const addCondition = (\n condition: Condition | ConditionGroup,\n ): ConditionBuilder => {\n return createConditionBuilder(\n { conditions: [...state.conditions, condition] },\n operator,\n );\n };\n\n return {\n number: (field, op, value) =>\n addCondition({\n id: generateConditionId(),\n type: \"number\",\n field,\n operator: op,\n value,\n }),\n\n string: (field, op, value) =>\n addCondition({\n id: generateConditionId(),\n type: \"string\",\n field,\n operator: op,\n value: value as string,\n } as Condition),\n\n boolean: (field, op, value) =>\n addCondition({\n id: generateConditionId(),\n type: \"boolean\",\n field,\n operator: op,\n value,\n }),\n\n date: (field, op, value) => {\n const normalizedValue =\n value instanceof Date\n ? value.toISOString()\n : Array.isArray(value)\n ? value.map((v) => (v instanceof Date ? v.toISOString() : v))\n : value;\n\n return addCondition({\n id: generateConditionId(),\n type: \"date\",\n field,\n operator: op,\n value: normalizedValue as string,\n } as Condition);\n },\n\n array: (field, op, value) =>\n addCondition({\n id: generateConditionId(),\n type: \"array\",\n field,\n operator: op,\n value,\n } as Condition),\n\n ref: (field, op, valueRef) =>\n addCondition({\n id: generateConditionId(),\n type: \"number\",\n field,\n operator: op,\n valueRef,\n } as Condition),\n\n and: (builderFn) => {\n const nestedBuilder = createConditionBuilder(\n { conditions: [] },\n \"AND\",\n );\n const result = builderFn(nestedBuilder);\n return addCondition(result.build());\n },\n\n or: (builderFn) => {\n const nestedBuilder = createConditionBuilder({ conditions: [] }, \"OR\");\n const result = builderFn(nestedBuilder);\n return addCondition(result.build());\n },\n\n raw: (condition) => addCondition(condition),\n\n build: (): ConditionGroup => ({\n id: generateGroupId(),\n operator,\n conditions: state.conditions,\n }),\n\n getConditions: () => state.conditions,\n };\n};\n\nexport const conditions = (): ConditionBuilder =>\n createConditionBuilder({ conditions: [] }, \"AND\");\n\nexport const and = (\n builderFn: (cb: ConditionBuilder) => ConditionBuilder,\n): ConditionGroup => {\n const builder = createConditionBuilder({ conditions: [] }, \"AND\");\n return builderFn(builder).build();\n};\n\nexport const or = (\n builderFn: (cb: ConditionBuilder) => ConditionBuilder,\n): ConditionGroup => {\n const builder = createConditionBuilder({ conditions: [] }, \"OR\");\n return builderFn(builder).build();\n};\n\nexport const all = (\n ...items: (Condition | ConditionGroup)[]\n): ConditionGroup => ({\n id: generateGroupId(),\n operator: \"AND\",\n conditions: items,\n});\n\nexport const any = (\n ...items: (Condition | ConditionGroup)[]\n): ConditionGroup => ({\n id: generateGroupId(),\n operator: \"OR\",\n conditions: items,\n});\n\nexport const num = (\n field: string,\n operator: \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"eq\" | \"neq\",\n value: number,\n): Condition => ({\n id: generateConditionId(),\n type: \"number\",\n field,\n operator,\n value,\n});\n\nexport const str = (\n field: string,\n operator:\n | \"eq\"\n | \"neq\"\n | \"contains\"\n | \"not_contains\"\n | \"starts_with\"\n | \"ends_with\"\n | \"in\"\n | \"not_in\"\n | \"like\"\n | \"not_like\"\n | \"ilike\"\n | \"not_ilike\"\n | \"regex\"\n | \"not_regex\",\n value: string | string[],\n): Condition =>\n ({\n id: generateConditionId(),\n type: \"string\",\n field,\n operator,\n value,\n }) as Condition;\n\nexport const bool = (\n field: string,\n operator: \"eq\" | \"neq\",\n value: boolean,\n): Condition => ({\n id: generateConditionId(),\n type: \"boolean\",\n field,\n operator,\n value,\n});\n\nexport const date = (\n field: string,\n operator: \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"eq\" | \"neq\" | \"between\",\n value: string | Date | [string | Date, string | Date],\n): Condition => {\n const normalizedValue =\n value instanceof Date\n ? value.toISOString()\n : Array.isArray(value)\n ? value.map((v) => (v instanceof Date ? v.toISOString() : v))\n : value;\n\n return {\n id: generateConditionId(),\n type: \"date\",\n field,\n operator,\n value: normalizedValue as string,\n } as Condition;\n};\n\nexport const arr = (\n field: string,\n operator:\n | \"contains\"\n | \"not_contains\"\n | \"contains_all\"\n | \"contains_any\"\n | \"is_empty\"\n | \"is_not_empty\"\n | \"length_eq\"\n | \"length_gt\"\n | \"length_lt\",\n value?: unknown,\n): Condition =>\n ({\n id: generateConditionId(),\n type: \"array\",\n field,\n operator,\n value,\n }) as Condition;\n",
9
+ "import type { ConditionGroup } from \"@f-o-t/condition-evaluator\";\nimport type { z } from \"zod\";\nimport type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type { RuleInput } from \"../types/rule\";\nimport {\n type ConditionBuilder,\n conditions as createConditions,\n} from \"./conditions\";\n\nexport type RuleBuilderState<\n _TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly id?: string;\n readonly name?: string;\n readonly description?: string;\n readonly conditions?: ConditionGroup;\n readonly consequences: Array<{\n type: keyof TConsequences;\n payload: z.infer<TConsequences[keyof TConsequences]>;\n }>;\n readonly priority: number;\n readonly enabled: boolean;\n readonly stopOnMatch: boolean;\n readonly tags: string[];\n readonly category?: string;\n readonly metadata?: Record<string, unknown>;\n};\n\nexport type RuleBuilder<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly id: (id: string) => RuleBuilder<TContext, TConsequences>;\n\n readonly named: (name: string) => RuleBuilder<TContext, TConsequences>;\n\n readonly describedAs: (\n description: string,\n ) => RuleBuilder<TContext, TConsequences>;\n\n readonly when: (\n conditions: ConditionGroup | ((cb: ConditionBuilder) => ConditionBuilder),\n ) => RuleBuilder<TContext, TConsequences>;\n\n readonly then: <K extends keyof TConsequences>(\n type: K,\n payload: z.infer<TConsequences[K]>,\n ) => RuleBuilder<TContext, TConsequences>;\n\n readonly withPriority: (\n priority: number,\n ) => RuleBuilder<TContext, TConsequences>;\n\n readonly enabled: (\n enabled?: boolean,\n ) => RuleBuilder<TContext, TConsequences>;\n\n readonly disabled: () => RuleBuilder<TContext, TConsequences>;\n\n readonly stopOnMatch: (\n stop?: boolean,\n ) => RuleBuilder<TContext, TConsequences>;\n\n readonly tagged: (...tags: string[]) => RuleBuilder<TContext, TConsequences>;\n\n readonly inCategory: (\n category: string,\n ) => RuleBuilder<TContext, TConsequences>;\n\n readonly withMetadata: (\n metadata: Record<string, unknown>,\n ) => RuleBuilder<TContext, TConsequences>;\n\n readonly build: () => RuleInput<TContext, TConsequences>;\n\n readonly getState: () => RuleBuilderState<TContext, TConsequences>;\n};\n\nconst createRuleBuilder = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: RuleBuilderState<TContext, TConsequences> = {\n consequences: [],\n priority: 0,\n enabled: true,\n stopOnMatch: false,\n tags: [],\n },\n): RuleBuilder<TContext, TConsequences> => {\n const update = (\n updates: Partial<RuleBuilderState<TContext, TConsequences>>,\n ): RuleBuilder<TContext, TConsequences> => {\n return createRuleBuilder({ ...state, ...updates });\n };\n\n return {\n id: (id) => update({ id }),\n\n named: (name) => update({ name }),\n\n describedAs: (description) => update({ description }),\n\n when: (conditionsOrBuilder) => {\n if (typeof conditionsOrBuilder === \"function\") {\n const builder = createConditions();\n const result = conditionsOrBuilder(builder);\n return update({ conditions: result.build() });\n }\n return update({ conditions: conditionsOrBuilder });\n },\n\n // biome-ignore lint/suspicious/noThenProperty: Intentional fluent API method for rule builder (when().then())\n then: (type, payload) => {\n return update({\n consequences: [\n ...state.consequences,\n { type, payload } as {\n type: keyof TConsequences;\n payload: z.infer<TConsequences[keyof TConsequences]>;\n },\n ],\n });\n },\n\n withPriority: (priority) => update({ priority }),\n\n enabled: (enabled = true) => update({ enabled }),\n\n disabled: () => update({ enabled: false }),\n\n stopOnMatch: (stop = true) => update({ stopOnMatch: stop }),\n\n tagged: (...tags) => update({ tags: [...state.tags, ...tags] }),\n\n inCategory: (category) => update({ category }),\n\n withMetadata: (metadata) =>\n update({ metadata: { ...state.metadata, ...metadata } }),\n\n build: (): RuleInput<TContext, TConsequences> => {\n if (!state.name) {\n throw new Error(\"Rule must have a name\");\n }\n if (!state.conditions) {\n throw new Error(\"Rule must have conditions\");\n }\n if (state.consequences.length === 0) {\n throw new Error(\"Rule must have at least one consequence\");\n }\n\n return {\n id: state.id,\n name: state.name,\n description: state.description,\n conditions: state.conditions,\n consequences: state.consequences,\n priority: state.priority,\n enabled: state.enabled,\n stopOnMatch: state.stopOnMatch,\n tags: state.tags,\n category: state.category,\n metadata: state.metadata,\n };\n },\n\n getState: () => state,\n };\n};\n\nexport const rule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(): RuleBuilder<TContext, TConsequences> => {\n return createRuleBuilder<TContext, TConsequences>();\n};\n\nexport const createRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n builderFn: (\n rb: RuleBuilder<TContext, TConsequences>,\n ) => RuleBuilder<TContext, TConsequences>,\n): RuleInput<TContext, TConsequences> => {\n const builder = createRuleBuilder<TContext, TConsequences>();\n return builderFn(builder).build();\n};\n",
10
+ "import type { CacheStats } from \"../types/state\";\n\nexport type CacheEntry<T> = {\n value: T;\n expiresAt: number;\n createdAt: number;\n};\n\nexport type Cache<T> = {\n readonly get: (key: string) => T | undefined;\n readonly set: (key: string, value: T) => void;\n readonly has: (key: string) => boolean;\n readonly delete: (key: string) => boolean;\n readonly clear: () => void;\n readonly getStats: () => CacheStats;\n};\n\nexport type CacheOptions = {\n readonly ttl: number;\n readonly maxSize: number;\n readonly onEvict?: (key: string, value: unknown) => void;\n};\n\nexport const createCache = <T>(options: CacheOptions): Cache<T> => {\n const entries = new Map<string, CacheEntry<T>>();\n let hits = 0;\n let misses = 0;\n let evictions = 0;\n\n const isExpired = (entry: CacheEntry<T>): boolean => {\n return Date.now() > entry.expiresAt;\n };\n\n const evictExpired = (): void => {\n const now = Date.now();\n for (const [key, entry] of entries) {\n if (now > entry.expiresAt) {\n entries.delete(key);\n evictions++;\n options.onEvict?.(key, entry.value);\n }\n }\n };\n\n const evictOldest = (): void => {\n if (entries.size === 0) return;\n\n // ES6 Maps maintain insertion order - first key is oldest (O(1) lookup)\n const oldestKey = entries.keys().next().value;\n if (oldestKey !== undefined) {\n const entry = entries.get(oldestKey);\n entries.delete(oldestKey);\n evictions++;\n if (entry) {\n options.onEvict?.(oldestKey, entry.value);\n }\n }\n };\n\n const get = (key: string): T | undefined => {\n const entry = entries.get(key);\n\n if (!entry) {\n misses++;\n return undefined;\n }\n\n if (isExpired(entry)) {\n entries.delete(key);\n evictions++;\n options.onEvict?.(key, entry.value);\n misses++;\n return undefined;\n }\n\n hits++;\n return entry.value;\n };\n\n const set = (key: string, value: T): void => {\n evictExpired();\n\n while (entries.size >= options.maxSize) {\n evictOldest();\n }\n\n const now = Date.now();\n entries.set(key, {\n value,\n expiresAt: now + options.ttl,\n createdAt: now,\n });\n };\n\n const has = (key: string): boolean => {\n const entry = entries.get(key);\n if (!entry) return false;\n if (isExpired(entry)) {\n entries.delete(key);\n evictions++;\n options.onEvict?.(key, entry.value);\n return false;\n }\n return true;\n };\n\n const deleteEntry = (key: string): boolean => {\n return entries.delete(key);\n };\n\n const clear = (): void => {\n entries.clear();\n };\n\n const getStats = (): CacheStats => {\n const totalRequests = hits + misses;\n return {\n size: entries.size,\n maxSize: options.maxSize,\n hits,\n misses,\n hitRate: totalRequests > 0 ? hits / totalRequests : 0,\n evictions,\n };\n };\n\n return {\n get,\n set,\n has,\n delete: deleteEntry,\n clear,\n getStats,\n };\n};\n",
11
+ "import type { CacheStats } from \"../types/state\";\nimport type { Cache } from \"./cache\";\n\nexport const createNoopCache = <T>(): Cache<T> => {\n return {\n get: () => undefined,\n set: () => {},\n has: () => false,\n delete: () => false,\n clear: () => {},\n getStats: (): CacheStats => ({\n size: 0,\n maxSize: 0,\n hits: 0,\n misses: 0,\n hitRate: 0,\n evictions: 0,\n }),\n };\n};\n",
12
+ "export type TimingResult<T> = {\n readonly result: T;\n readonly durationMs: number;\n};\n\nexport const measureTime = <T>(fn: () => T): TimingResult<T> => {\n const start = performance.now();\n const result = fn();\n const durationMs = performance.now() - start;\n return { result, durationMs };\n};\n\nexport const measureTimeAsync = async <T>(\n fn: () => Promise<T>,\n): Promise<TimingResult<T>> => {\n const start = performance.now();\n const result = await fn();\n const durationMs = performance.now() - start;\n return { result, durationMs };\n};\n\nexport const withTimeout = <T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage = \"Operation timed out\",\n): Promise<T> => {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(errorMessage));\n }, timeoutMs);\n\n promise\n .then((result) => {\n clearTimeout(timer);\n resolve(result);\n })\n .catch((error) => {\n clearTimeout(timer);\n reject(error);\n });\n });\n};\n",
13
+ "import {\n createEvaluator,\n type GroupEvaluationResult,\n} from \"@f-o-t/condition-evaluator\";\nimport type {\n AggregatedConsequence,\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type {\n EvaluateConfig,\n EvaluationContext,\n RuleEvaluationResult,\n} from \"../types/evaluation\";\nimport type { Rule } from \"../types/rule\";\nimport { measureTime } from \"../utils/time\";\n\nexport type EvaluateRuleOptions = {\n readonly skipDisabled?: boolean;\n};\n\nexport const evaluateRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rule: Rule<TContext, TConsequences>,\n context: EvaluationContext<TContext>,\n evaluator: ReturnType<typeof createEvaluator>,\n options: EvaluateRuleOptions = {},\n): RuleEvaluationResult<TContext, TConsequences> => {\n if (options.skipDisabled && !rule.enabled) {\n return {\n ruleId: rule.id,\n ruleName: rule.name,\n matched: false,\n conditionResult: createEmptyGroupResult(rule.conditions.id),\n consequences: [],\n evaluationTimeMs: 0,\n skipped: true,\n skipReason: \"Rule is disabled\",\n };\n }\n\n const { result: conditionResult, durationMs } = measureTime(() => {\n try {\n const evalContext = {\n data: context.data as Record<string, unknown>,\n metadata: context.metadata as Record<string, unknown> | undefined,\n };\n // Use the provided evaluator instead of hardcoded evaluateConditionGroup\n return evaluator.evaluateConditionGroup(rule.conditions, evalContext);\n } catch (error) {\n return {\n error,\n result: createEmptyGroupResult(rule.conditions.id),\n };\n }\n });\n\n if (\"error\" in conditionResult) {\n return {\n ruleId: rule.id,\n ruleName: rule.name,\n matched: false,\n conditionResult: conditionResult.result,\n consequences: [],\n evaluationTimeMs: durationMs,\n skipped: false,\n error:\n conditionResult.error instanceof Error\n ? conditionResult.error\n : new Error(String(conditionResult.error)),\n };\n }\n\n const matched = conditionResult.passed;\n\n const consequences: AggregatedConsequence<TConsequences>[] = matched\n ? rule.consequences.map((consequence) => ({\n type: consequence.type,\n payload: consequence.payload,\n ruleId: rule.id,\n ruleName: rule.name,\n priority: rule.priority,\n }))\n : [];\n\n return {\n ruleId: rule.id,\n ruleName: rule.name,\n matched,\n conditionResult,\n consequences,\n evaluationTimeMs: durationMs,\n skipped: false,\n };\n};\n\nconst createEmptyGroupResult = (groupId: string): GroupEvaluationResult => ({\n groupId,\n operator: \"AND\",\n passed: false,\n results: [],\n});\n\nexport type EvaluateRulesOptions<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly config?: Partial<EvaluateConfig>;\n readonly onRuleEvaluated?: (\n result: RuleEvaluationResult<TContext, TConsequences>,\n ) => void;\n};\n\nexport type EvaluateRulesResult<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly results: ReadonlyArray<\n RuleEvaluationResult<TContext, TConsequences>\n >;\n readonly matchedRules: ReadonlyArray<Rule<TContext, TConsequences>>;\n readonly consequences: ReadonlyArray<AggregatedConsequence<TConsequences>>;\n readonly stoppedEarly: boolean;\n readonly stoppedByRuleId?: string;\n};\n\nexport const evaluateRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n context: EvaluationContext<TContext>,\n evaluator: ReturnType<typeof createEvaluator>,\n options: EvaluateRulesOptions<TContext, TConsequences> = {},\n): EvaluateRulesResult<TContext, TConsequences> => {\n const config: EvaluateConfig = {\n conflictResolution: options.config?.conflictResolution ?? \"priority\",\n continueOnError: options.config?.continueOnError ?? true,\n collectAllConsequences: options.config?.collectAllConsequences ?? true,\n };\n\n const results: RuleEvaluationResult<TContext, TConsequences>[] = [];\n const matchedRules: Rule<TContext, TConsequences>[] = [];\n const consequences: AggregatedConsequence<TConsequences>[] = [];\n let stoppedEarly = false;\n let stoppedByRuleId: string | undefined;\n\n for (const rule of rules) {\n const result = evaluateRule(rule, context, evaluator, { skipDisabled: true });\n results.push(result);\n\n options.onRuleEvaluated?.(result);\n\n if (result.error && !config.continueOnError) {\n break;\n }\n\n if (result.matched) {\n matchedRules.push(rule);\n consequences.push(...result.consequences);\n\n if (rule.stopOnMatch) {\n stoppedEarly = true;\n stoppedByRuleId = rule.id;\n break;\n }\n\n if (config.conflictResolution === \"first-match\") {\n stoppedEarly = true;\n stoppedByRuleId = rule.id;\n break;\n }\n }\n }\n\n return {\n results,\n matchedRules,\n consequences,\n stoppedEarly,\n stoppedByRuleId,\n };\n};\n",
14
+ "import type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type { Rule, RuleFilters } from \"../types/rule\";\n\nexport const filterRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n filters: RuleFilters,\n) => {\n return (\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n ): ReadonlyArray<Rule<TContext, TConsequences>> => {\n return rules.filter((rule) => {\n if (\n filters.enabled !== undefined &&\n rule.enabled !== filters.enabled\n ) {\n return false;\n }\n\n if (filters.tags && filters.tags.length > 0) {\n const hasMatchingTag = filters.tags.some((tag) =>\n rule.tags.includes(tag),\n );\n if (!hasMatchingTag) {\n return false;\n }\n }\n\n if (\n filters.category !== undefined &&\n rule.category !== filters.category\n ) {\n return false;\n }\n\n if (filters.ids && filters.ids.length > 0) {\n if (!filters.ids.includes(rule.id)) {\n return false;\n }\n }\n\n return true;\n });\n };\n};\n\nexport const filterByEnabled = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n enabled: boolean,\n) => {\n return filterRules<TContext, TConsequences>({ enabled });\n};\n\nexport const filterByTags = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n tags: ReadonlyArray<string>,\n) => {\n return filterRules<TContext, TConsequences>({ tags });\n};\n\nexport const filterByCategory = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n category: string,\n) => {\n return filterRules<TContext, TConsequences>({ category });\n};\n\nexport const filterByIds = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n ids: ReadonlyArray<string>,\n) => {\n return filterRules<TContext, TConsequences>({ ids });\n};\n",
15
+ "import type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type { Rule } from \"../types/rule\";\n\nexport type GroupByField = \"category\" | \"priority\" | \"enabled\";\n\nexport type GroupedRules<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = ReadonlyMap<\n string | number | boolean,\n ReadonlyArray<Rule<TContext, TConsequences>>\n>;\n\nexport const groupRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n field: GroupByField,\n) => {\n return (\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n ): GroupedRules<TContext, TConsequences> => {\n const groups = new Map<\n string | number | boolean,\n Rule<TContext, TConsequences>[]\n >();\n\n for (const rule of rules) {\n let key: string | number | boolean;\n\n switch (field) {\n case \"category\":\n key = rule.category ?? \"uncategorized\";\n break;\n case \"priority\":\n key = rule.priority;\n break;\n case \"enabled\":\n key = rule.enabled;\n break;\n }\n\n const existing = groups.get(key);\n if (existing) {\n existing.push(rule);\n } else {\n groups.set(key, [rule]);\n }\n }\n\n return groups;\n };\n};\n\nexport const groupByCategory = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>() => {\n return groupRules<TContext, TConsequences>(\"category\");\n};\n\nexport const groupByPriority = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>() => {\n return groupRules<TContext, TConsequences>(\"priority\");\n};\n\nexport const groupByEnabled = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>() => {\n return groupRules<TContext, TConsequences>(\"enabled\");\n};\n\nexport const groupByCustom = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n TKey extends string | number | boolean = string,\n>(\n keyFn: (rule: Rule<TContext, TConsequences>) => TKey,\n) => {\n return (\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n ): ReadonlyMap<TKey, ReadonlyArray<Rule<TContext, TConsequences>>> => {\n const groups = new Map<TKey, Rule<TContext, TConsequences>[]>();\n\n for (const rule of rules) {\n const key = keyFn(rule);\n const existing = groups.get(key);\n if (existing) {\n existing.push(rule);\n } else {\n groups.set(key, [rule]);\n }\n }\n\n return groups;\n };\n};\n",
16
+ "import type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type { Rule } from \"../types/rule\";\n\nexport type SortField = \"priority\" | \"name\" | \"createdAt\" | \"updatedAt\";\nexport type SortDirection = \"asc\" | \"desc\";\n\nexport type SortOptions = {\n readonly field: SortField;\n readonly direction?: SortDirection;\n};\n\nexport const sortRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n options: SortField | SortOptions,\n) => {\n const normalizedOptions: SortOptions =\n typeof options === \"string\"\n ? { field: options, direction: \"desc\" }\n : options;\n\n const { field, direction = \"desc\" } = normalizedOptions;\n\n return (\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n ): ReadonlyArray<Rule<TContext, TConsequences>> => {\n const sorted = [...rules].sort((a, b) => {\n let comparison = 0;\n\n switch (field) {\n case \"priority\":\n comparison = a.priority - b.priority;\n break;\n case \"name\":\n comparison = a.name.localeCompare(b.name);\n break;\n case \"createdAt\":\n comparison = a.createdAt.getTime() - b.createdAt.getTime();\n break;\n case \"updatedAt\":\n comparison = a.updatedAt.getTime() - b.updatedAt.getTime();\n break;\n }\n\n return direction === \"desc\" ? -comparison : comparison;\n });\n\n return sorted;\n };\n};\n\nexport const sortByPriority = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n direction: SortDirection = \"desc\",\n) => {\n return sortRules<TContext, TConsequences>({ field: \"priority\", direction });\n};\n\nexport const sortByName = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n direction: SortDirection = \"asc\",\n) => {\n return sortRules<TContext, TConsequences>({ field: \"name\", direction });\n};\n\nexport const sortByCreatedAt = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n direction: SortDirection = \"desc\",\n) => {\n return sortRules<TContext, TConsequences>({ field: \"createdAt\", direction });\n};\n\nexport const sortByUpdatedAt = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n direction: SortDirection = \"desc\",\n) => {\n return sortRules<TContext, TConsequences>({ field: \"updatedAt\", direction });\n};\n",
17
+ "import { type Cache, createCache } from \"../cache/cache\";\nimport { createNoopCache } from \"../cache/noop\";\nimport { evaluateRule } from \"../core/evaluate\";\nimport { createEvaluator } from \"@f-o-t/condition-evaluator\";\nimport {\n type EngineConfig,\n getDefaultCacheConfig,\n getDefaultConflictResolution,\n getDefaultLogLevel,\n getDefaultValidationConfig,\n getDefaultVersioningConfig,\n type ResolvedEngineConfig,\n} from \"../types/config\";\nimport type {\n AggregatedConsequence,\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type {\n EngineExecutionResult,\n EvaluateOptions,\n EvaluationContext,\n} from \"../types/evaluation\";\nimport type {\n Rule,\n RuleFilters,\n RuleInput,\n RuleSet,\n RuleSetInput,\n} from \"../types/rule\";\nimport type {\n CacheStats,\n EngineState,\n EngineStats,\n MutableEngineState,\n} from \"../types/state\";\nimport { createInitialState } from \"../types/state\";\nimport { hashContext, hashRules } from \"../utils/hash\";\nimport { generateId } from \"../utils/id\";\nimport { measureTime } from \"../utils/time\";\nimport {\n executeAfterEvaluation,\n executeAfterRuleEvaluation,\n executeBeforeEvaluation,\n executeBeforeRuleEvaluation,\n executeOnCacheHit,\n executeOnCacheMiss,\n executeOnConsequenceCollected,\n executeOnRuleError,\n executeOnRuleMatch,\n executeOnRuleSkip,\n executeOnSlowRule,\n} from \"./hooks\";\nimport {\n addRule,\n addRuleSet,\n addRules,\n clearRules,\n disableRule,\n enableRule,\n getRule,\n getRuleSet,\n getRuleSets,\n getRules,\n getRulesInSet,\n removeRule,\n removeRuleSet,\n updateRule,\n} from \"./state\";\n\nexport type Engine<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly addRule: (\n input: RuleInput<TContext, TConsequences>,\n ) => Rule<TContext, TConsequences>;\n readonly addRules: (\n inputs: RuleInput<TContext, TConsequences>[],\n ) => Rule<TContext, TConsequences>[];\n readonly removeRule: (ruleId: string) => boolean;\n readonly updateRule: (\n ruleId: string,\n updates: Partial<RuleInput<TContext, TConsequences>>,\n ) => Rule<TContext, TConsequences> | undefined;\n readonly getRule: (\n ruleId: string,\n ) => Rule<TContext, TConsequences> | undefined;\n readonly getRules: (\n filters?: RuleFilters,\n ) => ReadonlyArray<Rule<TContext, TConsequences>>;\n readonly enableRule: (ruleId: string) => boolean;\n readonly disableRule: (ruleId: string) => boolean;\n readonly clearRules: () => void;\n\n readonly addRuleSet: (input: RuleSetInput) => RuleSet;\n readonly getRuleSet: (ruleSetId: string) => RuleSet | undefined;\n readonly getRuleSets: () => ReadonlyArray<RuleSet>;\n readonly removeRuleSet: (ruleSetId: string) => boolean;\n\n readonly evaluate: (\n context: TContext,\n options?: EvaluateOptions,\n ) => Promise<EngineExecutionResult<TContext, TConsequences>>;\n\n readonly clearCache: () => void;\n readonly getCacheStats: () => CacheStats;\n\n readonly getState: () => Readonly<EngineState<TContext, TConsequences>>;\n readonly getStats: () => EngineStats;\n};\n\nconst resolveConfig = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n config: EngineConfig<TContext, TConsequences>,\n): ResolvedEngineConfig<TContext, TConsequences> => {\n // Validate evaluator config\n if (!config.evaluator && !config.operators) {\n throw new Error(\n \"Engine requires either 'evaluator' or 'operators' config. \" +\n \"Pass { evaluator: createEvaluator() } for built-in operators only, \" +\n \"or { operators: customOperators } to use custom operators.\"\n );\n }\n\n // Create evaluator from config\n const evaluator = config.evaluator\n ? config.evaluator\n : createEvaluator({ operators: config.operators });\n\n return {\n consequences: config.consequences,\n conflictResolution:\n config.conflictResolution ?? getDefaultConflictResolution(),\n cache: {\n ...getDefaultCacheConfig(),\n ...config.cache,\n },\n validation: {\n ...getDefaultValidationConfig(),\n ...config.validation,\n },\n versioning: {\n ...getDefaultVersioningConfig(),\n ...config.versioning,\n },\n hooks: config.hooks ?? {},\n logLevel: config.logLevel ?? getDefaultLogLevel(),\n logger: config.logger ?? console,\n continueOnError: config.continueOnError ?? true,\n slowRuleThresholdMs: config.slowRuleThresholdMs ?? 10,\n hookTimeoutMs: config.hookTimeoutMs,\n evaluator, // Add to resolved config\n };\n};\n\nexport const createEngine = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n config: EngineConfig<TContext, TConsequences> = {},\n): Engine<TContext, TConsequences> => {\n const resolvedConfig = resolveConfig(config);\n const state: MutableEngineState<TContext, TConsequences> =\n createInitialState();\n\n const cache: Cache<EngineExecutionResult<TContext, TConsequences>> =\n resolvedConfig.cache.enabled\n ? createCache({\n ttl: resolvedConfig.cache.ttl,\n maxSize: resolvedConfig.cache.maxSize,\n })\n : createNoopCache();\n\n let totalEvaluations = 0;\n let totalMatches = 0;\n let totalErrors = 0;\n let cacheHits = 0;\n let cacheMisses = 0;\n let totalEvaluationTime = 0;\n\n const evaluate = async (\n contextData: TContext,\n options: EvaluateOptions = {},\n ): Promise<EngineExecutionResult<TContext, TConsequences>> => {\n const context: EvaluationContext<TContext> = {\n data: contextData,\n timestamp: new Date(),\n correlationId: generateId(),\n };\n\n let rulesToEvaluate = getRules(state, {\n enabled: options.skipDisabled !== false ? true : undefined,\n tags: options.tags,\n category: options.category,\n });\n\n if (options.ruleSetId) {\n const ruleSetRules = getRulesInSet(state, options.ruleSetId);\n const ruleSetIds = new Set(ruleSetRules.map((r) => r.id));\n rulesToEvaluate = rulesToEvaluate.filter((r) => ruleSetIds.has(r.id));\n }\n\n // Rules are already sorted by priority via state.ruleOrder (sorted on add/update)\n\n if (options.maxRules && options.maxRules > 0) {\n rulesToEvaluate = rulesToEvaluate.slice(0, options.maxRules);\n }\n\n const cacheKey = !options.bypassCache\n ? `${hashContext(contextData)}:${hashRules(rulesToEvaluate.map((r) => r.id))}`\n : null;\n\n if (cacheKey && cache.has(cacheKey)) {\n const cached = cache.get(cacheKey);\n if (cached) {\n cacheHits++;\n await executeOnCacheHit(\n resolvedConfig.hooks,\n cacheKey,\n cached,\n resolvedConfig.hookTimeoutMs,\n );\n return { ...cached, cacheHit: true };\n }\n }\n\n if (cacheKey) {\n cacheMisses++;\n await executeOnCacheMiss(\n resolvedConfig.hooks,\n cacheKey,\n resolvedConfig.hookTimeoutMs,\n );\n }\n\n await executeBeforeEvaluation(\n resolvedConfig.hooks,\n context,\n rulesToEvaluate,\n resolvedConfig.hookTimeoutMs,\n );\n\n const { result: evaluationResult, durationMs } = measureTime(() => {\n const results: Array<{\n rule: Rule<TContext, TConsequences>;\n result: ReturnType<typeof evaluateRule<TContext, TConsequences>>;\n }> = [];\n\n for (const rule of rulesToEvaluate) {\n const result = evaluateRule(rule, context, resolvedConfig.evaluator, { skipDisabled: true });\n results.push({ rule, result });\n }\n\n return results;\n });\n\n const ruleResults: ReturnType<\n typeof evaluateRule<TContext, TConsequences>\n >[] = [];\n const matchedRules: Rule<TContext, TConsequences>[] = [];\n const consequences: AggregatedConsequence<TConsequences>[] = [];\n let stoppedEarly = false;\n let stoppedByRuleId: string | undefined;\n let rulesErrored = 0;\n\n const conflictResolution =\n options.conflictResolution ?? resolvedConfig.conflictResolution;\n\n for (const { rule, result } of evaluationResult) {\n await executeBeforeRuleEvaluation(\n resolvedConfig.hooks,\n rule,\n context,\n resolvedConfig.hookTimeoutMs,\n );\n\n ruleResults.push(result);\n\n if (result.error) {\n rulesErrored++;\n await executeOnRuleError(\n resolvedConfig.hooks,\n rule,\n result.error,\n resolvedConfig.hookTimeoutMs,\n );\n if (!resolvedConfig.continueOnError) {\n break;\n }\n }\n\n if (result.skipped) {\n await executeOnRuleSkip(\n resolvedConfig.hooks,\n rule,\n result.skipReason ?? \"Unknown\",\n resolvedConfig.hookTimeoutMs,\n );\n }\n\n if (result.evaluationTimeMs > resolvedConfig.slowRuleThresholdMs) {\n await executeOnSlowRule(\n resolvedConfig.hooks,\n rule,\n result.evaluationTimeMs,\n resolvedConfig.slowRuleThresholdMs,\n resolvedConfig.hookTimeoutMs,\n );\n }\n\n await executeAfterRuleEvaluation(\n resolvedConfig.hooks,\n rule,\n result,\n resolvedConfig.hookTimeoutMs,\n );\n\n if (result.matched) {\n matchedRules.push(rule);\n\n for (const consequence of result.consequences) {\n consequences.push(consequence);\n await executeOnConsequenceCollected(\n resolvedConfig.hooks,\n rule,\n consequence,\n resolvedConfig.hookTimeoutMs,\n );\n }\n\n await executeOnRuleMatch(\n resolvedConfig.hooks,\n rule,\n context,\n resolvedConfig.hookTimeoutMs,\n );\n\n if (rule.stopOnMatch) {\n stoppedEarly = true;\n stoppedByRuleId = rule.id;\n break;\n }\n\n if (conflictResolution === \"first-match\") {\n stoppedEarly = true;\n stoppedByRuleId = rule.id;\n break;\n }\n }\n }\n\n totalEvaluations++;\n totalMatches += matchedRules.length;\n totalErrors += rulesErrored;\n totalEvaluationTime += durationMs;\n\n const executionResult: EngineExecutionResult<TContext, TConsequences> = {\n context,\n results: ruleResults,\n matchedRules,\n consequences,\n totalRulesEvaluated: ruleResults.length,\n totalRulesMatched: matchedRules.length,\n totalRulesSkipped: ruleResults.filter((r) => r.skipped).length,\n totalRulesErrored: rulesErrored,\n executionTimeMs: durationMs,\n stoppedEarly,\n stoppedByRuleId,\n cacheHit: false,\n };\n\n if (cacheKey) {\n cache.set(cacheKey, executionResult);\n }\n\n await executeAfterEvaluation(\n resolvedConfig.hooks,\n executionResult,\n resolvedConfig.hookTimeoutMs,\n );\n\n return executionResult;\n };\n\n return {\n addRule: (input) => addRule(state, input),\n addRules: (inputs) => addRules(state, inputs),\n removeRule: (ruleId) => {\n const result = removeRule(state, ruleId);\n if (result) cache.clear();\n return result;\n },\n updateRule: (ruleId, updates) => {\n const result = updateRule(state, ruleId, updates);\n if (result) cache.clear();\n return result;\n },\n getRule: (ruleId) => getRule(state, ruleId),\n getRules: (filters) => getRules(state, filters),\n enableRule: (ruleId) => {\n const result = enableRule(state, ruleId);\n if (result) cache.clear();\n return result;\n },\n disableRule: (ruleId) => {\n const result = disableRule(state, ruleId);\n if (result) cache.clear();\n return result;\n },\n clearRules: () => {\n clearRules(state);\n cache.clear();\n },\n\n addRuleSet: (input) => addRuleSet(state, input),\n getRuleSet: (ruleSetId) => getRuleSet(state, ruleSetId),\n getRuleSets: () => getRuleSets(state),\n removeRuleSet: (ruleSetId) => removeRuleSet(state, ruleSetId),\n\n evaluate,\n\n clearCache: () => cache.clear(),\n getCacheStats: () => cache.getStats(),\n\n getState: () => ({\n rules: state.rules as ReadonlyMap<\n string,\n Rule<TContext, TConsequences>\n >,\n ruleSets: state.ruleSets as ReadonlyMap<string, RuleSet>,\n ruleOrder: state.ruleOrder,\n }),\n\n getStats: () => {\n const enabledRules = Array.from(state.rules.values()).filter(\n (r) => r.enabled,\n ).length;\n return {\n totalRules: state.rules.size,\n enabledRules,\n disabledRules: state.rules.size - enabledRules,\n totalRuleSets: state.ruleSets.size,\n totalEvaluations,\n totalMatches,\n totalErrors,\n avgEvaluationTimeMs:\n totalEvaluations > 0\n ? totalEvaluationTime / totalEvaluations\n : 0,\n cacheHits,\n cacheMisses,\n cacheHitRate:\n cacheHits + cacheMisses > 0\n ? cacheHits / (cacheHits + cacheMisses)\n : 0,\n };\n },\n };\n};\n",
18
+ "import { z } from \"zod\";\nimport type { OperatorMap } from \"@f-o-t/condition-evaluator\";\nimport type {\n AggregatedConsequence,\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"./consequence\";\nimport type {\n ConflictResolutionStrategy,\n EngineExecutionResult,\n EvaluationContext,\n RuleEvaluationResult,\n} from \"./evaluation\";\nimport type { Rule } from \"./rule\";\n\n// ============================================================================\n// Zod Schemas - Define schemas first, then infer types\n// ============================================================================\n\nexport const LogLevelSchema = z.enum([\n \"none\",\n \"error\",\n \"warn\",\n \"info\",\n \"debug\",\n]);\nexport type LogLevel = z.infer<typeof LogLevelSchema>;\n\nexport const CacheConfigSchema = z.object({\n enabled: z.boolean().default(true),\n ttl: z.number().int().positive().default(60000),\n maxSize: z.number().int().positive().default(1000),\n});\nexport type CacheConfig = z.infer<typeof CacheConfigSchema>;\n\nexport const ValidationConfigSchema = z.object({\n enabled: z.boolean().default(true),\n strict: z.boolean().default(false),\n});\nexport type ValidationConfig = z.infer<typeof ValidationConfigSchema>;\n\nexport const VersioningConfigSchema = z.object({\n enabled: z.boolean().default(false),\n maxVersions: z.number().int().positive().default(10),\n});\nexport type VersioningConfig = z.infer<typeof VersioningConfigSchema>;\n\n// ============================================================================\n// Types that cannot be Zod schemas (contain functions or generics)\n// ============================================================================\n\nexport type Logger = {\n readonly error: (...args: unknown[]) => void;\n readonly warn: (...args: unknown[]) => void;\n readonly info: (...args: unknown[]) => void;\n readonly debug: (...args: unknown[]) => void;\n};\n\nexport type EngineHooks<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly beforeEvaluation?: (\n context: EvaluationContext<TContext>,\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n ) => void | Promise<void>;\n\n readonly afterEvaluation?: (\n result: EngineExecutionResult<TContext, TConsequences>,\n ) => void | Promise<void>;\n\n readonly beforeRuleEvaluation?: (\n rule: Rule<TContext, TConsequences>,\n context: EvaluationContext<TContext>,\n ) => void | Promise<void>;\n\n readonly afterRuleEvaluation?: (\n rule: Rule<TContext, TConsequences>,\n result: RuleEvaluationResult<TContext, TConsequences>,\n ) => void | Promise<void>;\n\n readonly onRuleMatch?: (\n rule: Rule<TContext, TConsequences>,\n context: EvaluationContext<TContext>,\n ) => void | Promise<void>;\n\n readonly onRuleSkip?: (\n rule: Rule<TContext, TConsequences>,\n reason: string,\n ) => void | Promise<void>;\n\n readonly onRuleError?: (\n rule: Rule<TContext, TConsequences>,\n error: Error,\n ) => void | Promise<void>;\n\n readonly onConsequenceCollected?: (\n rule: Rule<TContext, TConsequences>,\n consequence: AggregatedConsequence<TConsequences>,\n ) => void | Promise<void>;\n\n readonly onCacheHit?: (\n key: string,\n result: EngineExecutionResult<TContext, TConsequences>,\n ) => void | Promise<void>;\n\n readonly onCacheMiss?: (key: string) => void | Promise<void>;\n\n readonly onSlowRule?: (\n rule: Rule<TContext, TConsequences>,\n timeMs: number,\n threshold: number,\n ) => void | Promise<void>;\n\n readonly onHookError?: (hookName: string, error: Error) => void;\n};\n\nexport type EngineConfig<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly consequences?: TConsequences;\n readonly conflictResolution?: ConflictResolutionStrategy;\n readonly cache?: Partial<CacheConfig>;\n readonly validation?: Partial<ValidationConfig>;\n readonly versioning?: Partial<VersioningConfig>;\n readonly hooks?: EngineHooks<TContext, TConsequences>;\n readonly logLevel?: LogLevel;\n readonly logger?: Logger;\n readonly continueOnError?: boolean;\n readonly slowRuleThresholdMs?: number;\n readonly hookTimeoutMs?: number;\n // NEW: Evaluator configuration (mutually exclusive)\n readonly evaluator?: ReturnType<typeof import(\"@f-o-t/condition-evaluator\").createEvaluator>;\n readonly operators?: OperatorMap;\n};\n\nexport type ResolvedEngineConfig<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly consequences: TConsequences | undefined;\n readonly conflictResolution: ConflictResolutionStrategy;\n readonly cache: CacheConfig;\n readonly validation: ValidationConfig;\n readonly versioning: VersioningConfig;\n readonly hooks: EngineHooks<TContext, TConsequences>;\n readonly logLevel: LogLevel;\n readonly logger: Logger;\n readonly continueOnError: boolean;\n readonly slowRuleThresholdMs: number;\n readonly hookTimeoutMs: number | undefined;\n // NEW: Resolved evaluator instance\n readonly evaluator: ReturnType<typeof import(\"@f-o-t/condition-evaluator\").createEvaluator>;\n};\n\n// ============================================================================\n// Helper functions for parsing/resolving configs with defaults\n// ============================================================================\n\nexport const parseCacheConfig = (input?: Partial<CacheConfig>): CacheConfig =>\n CacheConfigSchema.parse(input ?? {});\n\nexport const parseValidationConfig = (\n input?: Partial<ValidationConfig>,\n): ValidationConfig => ValidationConfigSchema.parse(input ?? {});\n\nexport const parseVersioningConfig = (\n input?: Partial<VersioningConfig>,\n): VersioningConfig => VersioningConfigSchema.parse(input ?? {});\n\nexport const getDefaultCacheConfig = (): CacheConfig =>\n CacheConfigSchema.parse({});\n\nexport const getDefaultValidationConfig = (): ValidationConfig =>\n ValidationConfigSchema.parse({});\n\nexport const getDefaultVersioningConfig = (): VersioningConfig =>\n VersioningConfigSchema.parse({});\n\nexport const getDefaultLogLevel = (): LogLevel => \"warn\";\n\nexport const getDefaultConflictResolution = (): ConflictResolutionStrategy =>\n \"priority\";\n",
19
+ "import { z } from \"zod\";\nimport type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"./consequence\";\nimport type { Rule, RuleSet } from \"./rule\";\n\n// ============================================================================\n// Zod Schemas - Define schemas first, then infer types\n// ============================================================================\n\nexport const RuleStatsSchema = z.object({\n evaluations: z.number().int().nonnegative(),\n matches: z.number().int().nonnegative(),\n errors: z.number().int().nonnegative(),\n totalTimeMs: z.number().nonnegative(),\n avgTimeMs: z.number().nonnegative(),\n lastEvaluated: z.date().optional(),\n});\nexport type RuleStats = z.infer<typeof RuleStatsSchema>;\n\nexport const CacheStatsSchema = z.object({\n size: z.number().int().nonnegative(),\n maxSize: z.number().int().positive(),\n hits: z.number().int().nonnegative(),\n misses: z.number().int().nonnegative(),\n hitRate: z.number().min(0).max(1),\n evictions: z.number().int().nonnegative(),\n});\nexport type CacheStats = z.infer<typeof CacheStatsSchema>;\n\nexport const EngineStatsSchema = z.object({\n totalRules: z.number().int().nonnegative(),\n enabledRules: z.number().int().nonnegative(),\n disabledRules: z.number().int().nonnegative(),\n totalRuleSets: z.number().int().nonnegative(),\n totalEvaluations: z.number().int().nonnegative(),\n totalMatches: z.number().int().nonnegative(),\n totalErrors: z.number().int().nonnegative(),\n avgEvaluationTimeMs: z.number().nonnegative(),\n cacheHits: z.number().int().nonnegative(),\n cacheMisses: z.number().int().nonnegative(),\n cacheHitRate: z.number().min(0).max(1),\n});\nexport type EngineStats = z.infer<typeof EngineStatsSchema>;\n\n// ============================================================================\n// Types that cannot be Zod schemas (contain Maps or complex generics)\n// ============================================================================\n\nexport type EngineState<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly rules: ReadonlyMap<string, Rule<TContext, TConsequences>>;\n readonly ruleSets: ReadonlyMap<string, RuleSet>;\n readonly ruleOrder: ReadonlyArray<string>;\n};\n\n// Internal mutable version - not exported from index.ts\nexport type MutableEngineState<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n rules: Map<string, Rule<TContext, TConsequences>>;\n ruleSets: Map<string, RuleSet>;\n ruleOrder: string[];\n};\n\n// Internal mutable version - not exported from index.ts\nexport type MutableRuleStats = {\n evaluations: number;\n matches: number;\n errors: number;\n totalTimeMs: number;\n avgTimeMs: number;\n lastEvaluated?: Date;\n};\n\nexport type OptimizerState = {\n readonly ruleStats: ReadonlyMap<string, RuleStats>;\n readonly lastOptimized?: Date;\n};\n\n// Internal mutable version - not exported from index.ts\nexport type MutableOptimizerState = {\n ruleStats: Map<string, MutableRuleStats>;\n lastOptimized?: Date;\n};\n\n// ============================================================================\n// Factory functions\n// ============================================================================\n\nexport const createInitialState = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(): MutableEngineState<TContext, TConsequences> => ({\n rules: new Map(),\n ruleSets: new Map(),\n ruleOrder: [],\n});\n\nexport const createInitialOptimizerState = (): MutableOptimizerState => ({\n ruleStats: new Map(),\n lastOptimized: undefined,\n});\n\nexport const createInitialRuleStats = (): MutableRuleStats => ({\n evaluations: 0,\n matches: 0,\n errors: 0,\n totalTimeMs: 0,\n avgTimeMs: 0,\n lastEvaluated: undefined,\n});\n",
20
+ "export const hashContext = (context: unknown): string => {\n const str = JSON.stringify(context, (_, value) => {\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (value instanceof Map) {\n return Object.fromEntries(value);\n }\n if (value instanceof Set) {\n return Array.from(value);\n }\n return value;\n });\n\n if (typeof Bun !== \"undefined\" && Bun.hash) {\n return Bun.hash(str).toString(16);\n }\n\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16);\n};\n\nexport const hashRules = (ruleIds: ReadonlyArray<string>): string => {\n return hashContext(ruleIds.slice().sort());\n};\n",
21
+ "export const generateId = (): string => {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).substring(2, 11)}`;\n};\n",
22
+ "import type { EngineHooks } from \"../types/config\";\nimport type {\n AggregatedConsequence,\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type {\n EngineExecutionResult,\n EvaluationContext,\n RuleEvaluationResult,\n} from \"../types/evaluation\";\nimport type { Rule } from \"../types/rule\";\nimport { withTimeout } from \"../utils/time\";\n\nconst toError = (error: unknown): Error =>\n error instanceof Error ? error : new Error(String(error));\n\nconst executeWithTimeout = async (\n hookName: string,\n hookFn: () => void | Promise<void>,\n hooks: EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs?: number,\n): Promise<void> => {\n try {\n const promise = Promise.resolve(hookFn());\n if (timeoutMs !== undefined && timeoutMs > 0) {\n await withTimeout(\n promise,\n timeoutMs,\n `Hook '${hookName}' timed out after ${timeoutMs}ms`,\n );\n } else {\n await promise;\n }\n } catch (error) {\n hooks.onHookError?.(hookName, toError(error));\n }\n};\n\nexport const executeBeforeEvaluation = async <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n hooks: EngineHooks<TContext, TConsequences>,\n context: EvaluationContext<TContext>,\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n timeoutMs?: number,\n): Promise<void> => {\n if (!hooks.beforeEvaluation) return;\n await executeWithTimeout(\n \"beforeEvaluation\",\n () => hooks.beforeEvaluation?.(context, rules),\n hooks as EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs,\n );\n};\n\nexport const executeAfterEvaluation = async <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n hooks: EngineHooks<TContext, TConsequences>,\n result: EngineExecutionResult<TContext, TConsequences>,\n timeoutMs?: number,\n): Promise<void> => {\n if (!hooks.afterEvaluation) return;\n await executeWithTimeout(\n \"afterEvaluation\",\n () => hooks.afterEvaluation?.(result),\n hooks as EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs,\n );\n};\n\nexport const executeBeforeRuleEvaluation = async <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n hooks: EngineHooks<TContext, TConsequences>,\n rule: Rule<TContext, TConsequences>,\n context: EvaluationContext<TContext>,\n timeoutMs?: number,\n): Promise<void> => {\n if (!hooks.beforeRuleEvaluation) return;\n await executeWithTimeout(\n \"beforeRuleEvaluation\",\n () => hooks.beforeRuleEvaluation?.(rule, context),\n hooks as EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs,\n );\n};\n\nexport const executeAfterRuleEvaluation = async <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n hooks: EngineHooks<TContext, TConsequences>,\n rule: Rule<TContext, TConsequences>,\n result: RuleEvaluationResult<TContext, TConsequences>,\n timeoutMs?: number,\n): Promise<void> => {\n if (!hooks.afterRuleEvaluation) return;\n await executeWithTimeout(\n \"afterRuleEvaluation\",\n () => hooks.afterRuleEvaluation?.(rule, result),\n hooks as EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs,\n );\n};\n\nexport const executeOnRuleMatch = async <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n hooks: EngineHooks<TContext, TConsequences>,\n rule: Rule<TContext, TConsequences>,\n context: EvaluationContext<TContext>,\n timeoutMs?: number,\n): Promise<void> => {\n if (!hooks.onRuleMatch) return;\n await executeWithTimeout(\n \"onRuleMatch\",\n () => hooks.onRuleMatch?.(rule, context),\n hooks as EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs,\n );\n};\n\nexport const executeOnRuleSkip = async <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n hooks: EngineHooks<TContext, TConsequences>,\n rule: Rule<TContext, TConsequences>,\n reason: string,\n timeoutMs?: number,\n): Promise<void> => {\n if (!hooks.onRuleSkip) return;\n await executeWithTimeout(\n \"onRuleSkip\",\n () => hooks.onRuleSkip?.(rule, reason),\n hooks as EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs,\n );\n};\n\nexport const executeOnRuleError = async <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n hooks: EngineHooks<TContext, TConsequences>,\n rule: Rule<TContext, TConsequences>,\n ruleError: Error,\n timeoutMs?: number,\n): Promise<void> => {\n if (!hooks.onRuleError) return;\n await executeWithTimeout(\n \"onRuleError\",\n () => hooks.onRuleError?.(rule, ruleError),\n hooks as EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs,\n );\n};\n\nexport const executeOnConsequenceCollected = async <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n hooks: EngineHooks<TContext, TConsequences>,\n rule: Rule<TContext, TConsequences>,\n consequence: AggregatedConsequence<TConsequences>,\n timeoutMs?: number,\n): Promise<void> => {\n if (!hooks.onConsequenceCollected) return;\n await executeWithTimeout(\n \"onConsequenceCollected\",\n () => hooks.onConsequenceCollected?.(rule, consequence),\n hooks as EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs,\n );\n};\n\nexport const executeOnCacheHit = async <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n hooks: EngineHooks<TContext, TConsequences>,\n key: string,\n result: EngineExecutionResult<TContext, TConsequences>,\n timeoutMs?: number,\n): Promise<void> => {\n if (!hooks.onCacheHit) return;\n await executeWithTimeout(\n \"onCacheHit\",\n () => hooks.onCacheHit?.(key, result),\n hooks as EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs,\n );\n};\n\nexport const executeOnCacheMiss = async <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n hooks: EngineHooks<TContext, TConsequences>,\n key: string,\n timeoutMs?: number,\n): Promise<void> => {\n if (!hooks.onCacheMiss) return;\n await executeWithTimeout(\n \"onCacheMiss\",\n () => hooks.onCacheMiss?.(key),\n hooks as EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs,\n );\n};\n\nexport const executeOnSlowRule = async <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n hooks: EngineHooks<TContext, TConsequences>,\n rule: Rule<TContext, TConsequences>,\n timeMs: number,\n threshold: number,\n timeoutMs?: number,\n): Promise<void> => {\n if (!hooks.onSlowRule) return;\n await executeWithTimeout(\n \"onSlowRule\",\n () => hooks.onSlowRule?.(rule, timeMs, threshold),\n hooks as EngineHooks<unknown, ConsequenceDefinitions>,\n timeoutMs,\n );\n};\n",
23
+ "import type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type {\n Rule,\n RuleFilters,\n RuleInput,\n RuleSet,\n RuleSetInput,\n} from \"../types/rule\";\nimport type { MutableEngineState } from \"../types/state\";\nimport { createInitialState } from \"../types/state\";\nimport { generateId } from \"../utils/id\";\n\nexport const addRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n input: RuleInput<TContext, TConsequences>,\n): Rule<TContext, TConsequences> => {\n const now = new Date();\n const rule: Rule<TContext, TConsequences> = {\n id: input.id ?? generateId(),\n name: input.name,\n description: input.description,\n conditions: input.conditions,\n consequences: input.consequences.map((c) => ({\n type: c.type,\n payload: c.payload,\n })) as Rule<TContext, TConsequences>[\"consequences\"],\n priority: input.priority ?? 0,\n enabled: input.enabled ?? true,\n stopOnMatch: input.stopOnMatch ?? false,\n tags: input.tags ?? [],\n category: input.category,\n metadata: input.metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n state.rules.set(rule.id, rule);\n\n if (!state.ruleOrder.includes(rule.id)) {\n state.ruleOrder.push(rule.id);\n sortRuleOrder(state);\n }\n\n return rule;\n};\n\nexport const addRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n inputs: RuleInput<TContext, TConsequences>[],\n): Rule<TContext, TConsequences>[] => {\n return inputs.map((input) => addRule(state, input));\n};\n\nexport const removeRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n ruleId: string,\n): boolean => {\n const deleted = state.rules.delete(ruleId);\n if (deleted) {\n const index = state.ruleOrder.indexOf(ruleId);\n if (index !== -1) {\n state.ruleOrder.splice(index, 1);\n }\n }\n return deleted;\n};\n\nexport const updateRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n ruleId: string,\n updates: Partial<RuleInput<TContext, TConsequences>>,\n): Rule<TContext, TConsequences> | undefined => {\n const existing = state.rules.get(ruleId);\n if (!existing) return undefined;\n\n const updated: Rule<TContext, TConsequences> = {\n ...existing,\n ...(updates.name !== undefined && { name: updates.name }),\n ...(updates.description !== undefined && {\n description: updates.description,\n }),\n ...(updates.conditions !== undefined && {\n conditions: updates.conditions,\n }),\n ...(updates.consequences !== undefined && {\n consequences: updates.consequences.map((c) => ({\n type: c.type,\n payload: c.payload,\n })) as Rule<TContext, TConsequences>[\"consequences\"],\n }),\n ...(updates.priority !== undefined && { priority: updates.priority }),\n ...(updates.enabled !== undefined && { enabled: updates.enabled }),\n ...(updates.stopOnMatch !== undefined && {\n stopOnMatch: updates.stopOnMatch,\n }),\n ...(updates.tags !== undefined && { tags: updates.tags }),\n ...(updates.category !== undefined && { category: updates.category }),\n ...(updates.metadata !== undefined && { metadata: updates.metadata }),\n updatedAt: new Date(),\n };\n\n state.rules.set(ruleId, updated);\n\n if (updates.priority !== undefined) {\n sortRuleOrder(state);\n }\n\n return updated;\n};\n\nexport const getRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n ruleId: string,\n): Rule<TContext, TConsequences> | undefined => {\n return state.rules.get(ruleId);\n};\n\nexport const getRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n filters?: RuleFilters,\n): ReadonlyArray<Rule<TContext, TConsequences>> => {\n const rules: Rule<TContext, TConsequences>[] = [];\n\n for (const id of state.ruleOrder) {\n const rule = state.rules.get(id);\n if (!rule) continue;\n\n if (filters) {\n if (\n filters.enabled !== undefined &&\n rule.enabled !== filters.enabled\n ) {\n continue;\n }\n if (filters.tags && filters.tags.length > 0) {\n const hasTag = filters.tags.some((tag) => rule.tags.includes(tag));\n if (!hasTag) continue;\n }\n if (\n filters.category !== undefined &&\n rule.category !== filters.category\n ) {\n continue;\n }\n if (\n filters.ids &&\n filters.ids.length > 0 &&\n !filters.ids.includes(rule.id)\n ) {\n continue;\n }\n }\n\n rules.push(rule);\n }\n\n return rules;\n};\n\nexport const enableRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n ruleId: string,\n): boolean => {\n const rule = state.rules.get(ruleId);\n if (!rule) return false;\n\n state.rules.set(ruleId, { ...rule, enabled: true, updatedAt: new Date() });\n return true;\n};\n\nexport const disableRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n ruleId: string,\n): boolean => {\n const rule = state.rules.get(ruleId);\n if (!rule) return false;\n\n state.rules.set(ruleId, { ...rule, enabled: false, updatedAt: new Date() });\n return true;\n};\n\nexport const clearRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n): void => {\n state.rules.clear();\n state.ruleOrder.length = 0;\n};\n\nexport const addRuleSet = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n input: RuleSetInput,\n): RuleSet => {\n const ruleSet: RuleSet = {\n id: input.id ?? generateId(),\n name: input.name,\n description: input.description,\n ruleIds: input.ruleIds,\n enabled: input.enabled ?? true,\n metadata: input.metadata,\n };\n\n state.ruleSets.set(ruleSet.id, ruleSet);\n return ruleSet;\n};\n\nexport const getRuleSet = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n ruleSetId: string,\n): RuleSet | undefined => {\n return state.ruleSets.get(ruleSetId);\n};\n\nexport const getRuleSets = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n): ReadonlyArray<RuleSet> => {\n return Array.from(state.ruleSets.values());\n};\n\nexport const removeRuleSet = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n ruleSetId: string,\n): boolean => {\n return state.ruleSets.delete(ruleSetId);\n};\n\nexport const getRulesInSet = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n ruleSetId: string,\n): ReadonlyArray<Rule<TContext, TConsequences>> => {\n const ruleSet = state.ruleSets.get(ruleSetId);\n if (!ruleSet || !ruleSet.enabled) return [];\n\n const rules: Rule<TContext, TConsequences>[] = [];\n for (const ruleId of ruleSet.ruleIds) {\n const rule = state.rules.get(ruleId);\n if (rule) {\n rules.push(rule);\n }\n }\n\n return rules;\n};\n\nconst sortRuleOrder = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n): void => {\n state.ruleOrder.sort((a, b) => {\n const ruleA = state.rules.get(a);\n const ruleB = state.rules.get(b);\n if (!ruleA || !ruleB) return 0;\n return ruleB.priority - ruleA.priority;\n });\n};\n\nexport const cloneState = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n state: MutableEngineState<TContext, TConsequences>,\n): MutableEngineState<TContext, TConsequences> => {\n const newState = createInitialState<TContext, TConsequences>();\n\n for (const [id, rule] of state.rules) {\n newState.rules.set(id, { ...rule });\n }\n\n for (const [id, ruleSet] of state.ruleSets) {\n newState.ruleSets.set(id, { ...ruleSet, ruleIds: [...ruleSet.ruleIds] });\n }\n\n newState.ruleOrder.push(...state.ruleOrder);\n\n return newState;\n};\n",
24
+ "import type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type { Rule } from \"../types/rule\";\nimport { collectConditionFields } from \"../utils/conditions\";\n\nexport type FieldIndex<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = Map<string, ReadonlyArray<Rule<TContext, TConsequences>>>;\n\nexport type TagIndex<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = Map<string, ReadonlyArray<Rule<TContext, TConsequences>>>;\n\nexport type CategoryIndex<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = Map<string, ReadonlyArray<Rule<TContext, TConsequences>>>;\n\nexport type PriorityIndex<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = Map<number, ReadonlyArray<Rule<TContext, TConsequences>>>;\n\nexport type RuleIndex<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly byField: FieldIndex<TContext, TConsequences>;\n readonly byTag: TagIndex<TContext, TConsequences>;\n readonly byCategory: CategoryIndex<TContext, TConsequences>;\n readonly byPriority: PriorityIndex<TContext, TConsequences>;\n readonly byId: Map<string, Rule<TContext, TConsequences>>;\n readonly sortedByPriority: ReadonlyArray<Rule<TContext, TConsequences>>;\n};\n\nexport type IndexOptions = {\n readonly indexByField?: boolean;\n readonly indexByTag?: boolean;\n readonly indexByCategory?: boolean;\n readonly indexByPriority?: boolean;\n};\n\nconst DEFAULT_OPTIONS: IndexOptions = {\n indexByField: true,\n indexByTag: true,\n indexByCategory: true,\n indexByPriority: true,\n};\n\nexport const buildIndex = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n options: IndexOptions = {},\n): RuleIndex<TContext, TConsequences> => {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const byId = new Map<string, Rule<TContext, TConsequences>>();\n const byField = new Map<string, Rule<TContext, TConsequences>[]>();\n const byTag = new Map<string, Rule<TContext, TConsequences>[]>();\n const byCategory = new Map<string, Rule<TContext, TConsequences>[]>();\n const byPriority = new Map<number, Rule<TContext, TConsequences>[]>();\n\n for (const rule of rules) {\n byId.set(rule.id, rule);\n\n if (opts.indexByField) {\n const fields = collectConditionFields(rule.conditions);\n for (const field of fields) {\n const existing = byField.get(field) ?? [];\n existing.push(rule);\n byField.set(field, existing);\n }\n }\n\n if (opts.indexByTag) {\n for (const tag of rule.tags) {\n const existing = byTag.get(tag) ?? [];\n existing.push(rule);\n byTag.set(tag, existing);\n }\n }\n\n if (opts.indexByCategory && rule.category) {\n const existing = byCategory.get(rule.category) ?? [];\n existing.push(rule);\n byCategory.set(rule.category, existing);\n }\n\n if (opts.indexByPriority) {\n const existing = byPriority.get(rule.priority) ?? [];\n existing.push(rule);\n byPriority.set(rule.priority, existing);\n }\n }\n\n const sortedByPriority = [...rules].sort((a, b) => b.priority - a.priority);\n\n return {\n byField: byField as FieldIndex<TContext, TConsequences>,\n byTag: byTag as TagIndex<TContext, TConsequences>,\n byCategory: byCategory as CategoryIndex<TContext, TConsequences>,\n byPriority: byPriority as PriorityIndex<TContext, TConsequences>,\n byId,\n sortedByPriority,\n };\n};\n\nexport const getRulesByField = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n index: RuleIndex<TContext, TConsequences>,\n field: string,\n): ReadonlyArray<Rule<TContext, TConsequences>> => {\n return index.byField.get(field) ?? [];\n};\n\nexport const getRulesByFields = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n index: RuleIndex<TContext, TConsequences>,\n fields: ReadonlyArray<string>,\n mode: \"any\" | \"all\" = \"any\",\n): ReadonlyArray<Rule<TContext, TConsequences>> => {\n if (fields.length === 0) return [];\n\n const ruleSets = fields.map((f) => new Set(getRulesByField(index, f)));\n\n if (mode === \"any\") {\n const combined = new Set<Rule<TContext, TConsequences>>();\n for (const ruleSet of ruleSets) {\n for (const rule of ruleSet) {\n combined.add(rule);\n }\n }\n return [...combined];\n }\n\n const [first, ...rest] = ruleSets;\n if (!first) return [];\n\n return [...first].filter((rule) => rest.every((set) => set.has(rule)));\n};\n\nexport const getRulesByTag = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n index: RuleIndex<TContext, TConsequences>,\n tag: string,\n): ReadonlyArray<Rule<TContext, TConsequences>> => {\n return index.byTag.get(tag) ?? [];\n};\n\nexport const getRulesByTags = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n index: RuleIndex<TContext, TConsequences>,\n tags: ReadonlyArray<string>,\n mode: \"any\" | \"all\" = \"any\",\n): ReadonlyArray<Rule<TContext, TConsequences>> => {\n if (tags.length === 0) return [];\n\n const ruleSets = tags.map((t) => new Set(getRulesByTag(index, t)));\n\n if (mode === \"any\") {\n const combined = new Set<Rule<TContext, TConsequences>>();\n for (const ruleSet of ruleSets) {\n for (const rule of ruleSet) {\n combined.add(rule);\n }\n }\n return [...combined];\n }\n\n const [first, ...rest] = ruleSets;\n if (!first) return [];\n\n return [...first].filter((rule) => rest.every((set) => set.has(rule)));\n};\n\nexport const getRulesByCategory = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n index: RuleIndex<TContext, TConsequences>,\n category: string,\n): ReadonlyArray<Rule<TContext, TConsequences>> => {\n return index.byCategory.get(category) ?? [];\n};\n\nexport const getRulesByPriority = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n index: RuleIndex<TContext, TConsequences>,\n priority: number,\n): ReadonlyArray<Rule<TContext, TConsequences>> => {\n return index.byPriority.get(priority) ?? [];\n};\n\nexport const getRulesByPriorityRange = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n index: RuleIndex<TContext, TConsequences>,\n minPriority: number,\n maxPriority: number,\n): ReadonlyArray<Rule<TContext, TConsequences>> => {\n return index.sortedByPriority.filter(\n (rule) => rule.priority >= minPriority && rule.priority <= maxPriority,\n );\n};\n\nexport const getRuleById = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n index: RuleIndex<TContext, TConsequences>,\n id: string,\n): Rule<TContext, TConsequences> | undefined => {\n return index.byId.get(id);\n};\n\nexport const filterRulesForContext = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n index: RuleIndex<TContext, TConsequences>,\n contextFields: ReadonlyArray<string>,\n): ReadonlyArray<Rule<TContext, TConsequences>> => {\n const relevantRules = new Set<Rule<TContext, TConsequences>>();\n\n for (const field of contextFields) {\n const rules = index.byField.get(field);\n if (rules) {\n for (const rule of rules) {\n relevantRules.add(rule);\n }\n }\n }\n\n return [...relevantRules].sort((a, b) => b.priority - a.priority);\n};\n\nexport type OptimizationSuggestion = {\n readonly type: \"INDEX\" | \"CACHE\" | \"MERGE\" | \"SIMPLIFY\" | \"REORDER\";\n readonly severity: \"high\" | \"medium\" | \"low\";\n readonly message: string;\n readonly ruleIds?: ReadonlyArray<string>;\n readonly details?: Readonly<Record<string, unknown>>;\n};\n\nexport const analyzeOptimizations = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<OptimizationSuggestion> => {\n const suggestions: OptimizationSuggestion[] = [];\n\n const fieldUsage = new Map<string, number>();\n for (const rule of rules) {\n const fields = collectConditionFields(rule.conditions);\n for (const field of fields) {\n fieldUsage.set(field, (fieldUsage.get(field) ?? 0) + 1);\n }\n }\n\n const frequentFields = [...fieldUsage.entries()]\n .filter(([, count]) => count > rules.length * 0.5)\n .map(([field]) => field);\n\n if (frequentFields.length > 0) {\n suggestions.push({\n type: \"INDEX\",\n severity: \"medium\",\n message: `Consider creating indexes for frequently used fields: ${frequentFields.join(\", \")}`,\n details: {\n fields: frequentFields,\n usagePercentage: frequentFields.map((f) => ({\n field: f,\n percentage: ((fieldUsage.get(f) ?? 0) / rules.length) * 100,\n })),\n },\n });\n }\n\n const priorityGroups = new Map<number, Rule<TContext, TConsequences>[]>();\n for (const rule of rules) {\n const existing = priorityGroups.get(rule.priority) ?? [];\n existing.push(rule);\n priorityGroups.set(rule.priority, existing);\n }\n\n const largePriorityGroups = [...priorityGroups.entries()].filter(\n ([, group]) => group.length > 5,\n );\n\n if (largePriorityGroups.length > 0) {\n for (const [priority, group] of largePriorityGroups) {\n suggestions.push({\n type: \"REORDER\",\n severity: \"low\",\n message: `${group.length} rules share priority ${priority}. Consider differentiating priorities for more predictable execution order.`,\n ruleIds: group.map((r) => r.id),\n details: { priority, count: group.length },\n });\n }\n }\n\n const disabledRules = rules.filter((r) => !r.enabled);\n if (disabledRules.length > rules.length * 0.3) {\n suggestions.push({\n type: \"SIMPLIFY\",\n severity: \"low\",\n message: `${disabledRules.length} rules (${((disabledRules.length / rules.length) * 100).toFixed(1)}%) are disabled. Consider removing unused rules.`,\n ruleIds: disabledRules.map((r) => r.id),\n details: {\n disabledCount: disabledRules.length,\n totalCount: rules.length,\n },\n });\n }\n\n if (rules.length > 100) {\n suggestions.push({\n type: \"CACHE\",\n severity: \"high\",\n message: `Rule set contains ${rules.length} rules. Enable caching for better performance.`,\n details: { ruleCount: rules.length },\n });\n }\n\n return suggestions;\n};\n\nexport const getIndexStats = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n index: RuleIndex<TContext, TConsequences>,\n): {\n totalRules: number;\n uniqueFields: number;\n uniqueTags: number;\n uniqueCategories: number;\n uniquePriorities: number;\n averageRulesPerField: number;\n averageRulesPerTag: number;\n} => {\n const totalRules = index.byId.size;\n\n const fieldRuleCounts = [...index.byField.values()].map((r) => r.length);\n const tagRuleCounts = [...index.byTag.values()].map((r) => r.length);\n\n return {\n totalRules,\n uniqueFields: index.byField.size,\n uniqueTags: index.byTag.size,\n uniqueCategories: index.byCategory.size,\n uniquePriorities: index.byPriority.size,\n averageRulesPerField:\n fieldRuleCounts.length > 0\n ? fieldRuleCounts.reduce((a, b) => a + b, 0) /\n fieldRuleCounts.length\n : 0,\n averageRulesPerTag:\n tagRuleCounts.length > 0\n ? tagRuleCounts.reduce((a, b) => a + b, 0) / tagRuleCounts.length\n : 0,\n };\n};\n",
25
+ "import type { ConditionGroup } from \"@f-o-t/condition-evaluator\";\nimport type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type { Rule, RuleSet } from \"../types/rule\";\nimport { generateId } from \"../utils/id\";\n\nexport type SerializedRule = {\n readonly id: string;\n readonly name: string;\n readonly description?: string;\n readonly conditions: ConditionGroup;\n readonly consequences: ReadonlyArray<{\n type: string;\n payload: unknown;\n }>;\n readonly priority: number;\n readonly enabled: boolean;\n readonly stopOnMatch: boolean;\n readonly tags: ReadonlyArray<string>;\n readonly category?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly createdAt: string;\n readonly updatedAt: string;\n};\n\nexport type SerializedRuleSet = {\n readonly id: string;\n readonly name: string;\n readonly description?: string;\n readonly ruleIds: ReadonlyArray<string>;\n readonly enabled: boolean;\n readonly metadata?: Readonly<Record<string, unknown>>;\n};\n\nexport type ExportFormat = {\n readonly version: string;\n readonly exportedAt: string;\n readonly rules: ReadonlyArray<SerializedRule>;\n readonly ruleSets?: ReadonlyArray<SerializedRuleSet>;\n readonly metadata?: Readonly<Record<string, unknown>>;\n};\n\nexport type ImportOptions = {\n readonly generateNewIds?: boolean;\n readonly idPrefix?: string;\n readonly preserveDates?: boolean;\n readonly validateSchema?: boolean;\n};\n\nexport type OrphanedReference = {\n readonly ruleSetId: string;\n readonly ruleSetName: string;\n readonly missingRuleIds: ReadonlyArray<string>;\n};\n\nexport type ImportResult<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly success: boolean;\n readonly rules: ReadonlyArray<Rule<TContext, TConsequences>>;\n readonly ruleSets: ReadonlyArray<RuleSet>;\n readonly errors: ReadonlyArray<{\n index: number;\n type: \"rule\" | \"ruleSet\";\n message: string;\n }>;\n readonly idMapping: ReadonlyMap<string, string>;\n readonly orphanedReferences: ReadonlyArray<OrphanedReference>;\n};\n\nconst EXPORT_VERSION = \"1.0.0\";\n\nexport const serializeRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rule: Rule<TContext, TConsequences>,\n): SerializedRule => ({\n id: rule.id,\n name: rule.name,\n description: rule.description,\n conditions: rule.conditions,\n consequences: rule.consequences.map((c) => ({\n type: c.type as string,\n payload: c.payload,\n })),\n priority: rule.priority,\n enabled: rule.enabled,\n stopOnMatch: rule.stopOnMatch,\n tags: rule.tags,\n category: rule.category,\n metadata: rule.metadata,\n createdAt: rule.createdAt.toISOString(),\n updatedAt: rule.updatedAt.toISOString(),\n});\n\nexport const deserializeRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n serialized: SerializedRule,\n options: ImportOptions = {},\n): Rule<TContext, TConsequences> => {\n const id = options.generateNewIds\n ? `${options.idPrefix ?? \"\"}${generateId()}`\n : serialized.id;\n\n const now = new Date();\n\n return {\n id,\n name: serialized.name,\n description: serialized.description,\n conditions: serialized.conditions,\n consequences: serialized.consequences as Rule<\n TContext,\n TConsequences\n >[\"consequences\"],\n priority: serialized.priority,\n enabled: serialized.enabled,\n stopOnMatch: serialized.stopOnMatch,\n tags: serialized.tags,\n category: serialized.category,\n metadata: serialized.metadata,\n createdAt: options.preserveDates ? new Date(serialized.createdAt) : now,\n updatedAt: options.preserveDates ? new Date(serialized.updatedAt) : now,\n };\n};\n\nexport const serializeRuleSet = (ruleSet: RuleSet): SerializedRuleSet => ({\n id: ruleSet.id,\n name: ruleSet.name,\n description: ruleSet.description,\n ruleIds: ruleSet.ruleIds,\n enabled: ruleSet.enabled,\n metadata: ruleSet.metadata,\n});\n\nexport const deserializeRuleSet = (\n serialized: SerializedRuleSet,\n idMapping: Map<string, string>,\n options: ImportOptions = {},\n): RuleSet => {\n const id = options.generateNewIds\n ? `${options.idPrefix ?? \"\"}${generateId()}`\n : serialized.id;\n\n const ruleIds = serialized.ruleIds.map(\n (oldId) => idMapping.get(oldId) ?? oldId,\n );\n\n return {\n id,\n name: serialized.name,\n description: serialized.description,\n ruleIds,\n enabled: serialized.enabled,\n metadata: serialized.metadata,\n };\n};\n\nexport const exportRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n ruleSets?: ReadonlyArray<RuleSet>,\n metadata?: Record<string, unknown>,\n): ExportFormat => ({\n version: EXPORT_VERSION,\n exportedAt: new Date().toISOString(),\n rules: rules.map(serializeRule),\n ruleSets: ruleSets?.map(serializeRuleSet),\n metadata,\n});\n\nexport const exportToJson = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n ruleSets?: ReadonlyArray<RuleSet>,\n metadata?: Record<string, unknown>,\n): string => {\n const exportData = exportRules(rules, ruleSets, metadata);\n return JSON.stringify(exportData, null, 2);\n};\n\nexport const importRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n data: ExportFormat,\n options: ImportOptions = {},\n): ImportResult<TContext, TConsequences> => {\n const rules: Rule<TContext, TConsequences>[] = [];\n const ruleSets: RuleSet[] = [];\n const errors: Array<{\n index: number;\n type: \"rule\" | \"ruleSet\";\n message: string;\n }> = [];\n const idMapping = new Map<string, string>();\n\n for (let i = 0; i < data.rules.length; i++) {\n try {\n const serialized = data.rules[i];\n if (!serialized) continue;\n const rule = deserializeRule<TContext, TConsequences>(\n serialized,\n options,\n );\n idMapping.set(serialized.id, rule.id);\n rules.push(rule);\n } catch (error) {\n errors.push({\n index: i,\n type: \"rule\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n if (data.ruleSets) {\n for (let i = 0; i < data.ruleSets.length; i++) {\n try {\n const serialized = data.ruleSets[i];\n if (!serialized) continue;\n const ruleSet = deserializeRuleSet(serialized, idMapping, options);\n ruleSets.push(ruleSet);\n } catch (error) {\n errors.push({\n index: i,\n type: \"ruleSet\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n\n // Detect orphaned references (ruleSets referencing non-existent rules)\n const importedRuleIds = new Set(rules.map((r) => r.id));\n const orphanedReferences: OrphanedReference[] = [];\n\n for (const ruleSet of ruleSets) {\n const missingRuleIds = ruleSet.ruleIds.filter(\n (id) => !importedRuleIds.has(id),\n );\n if (missingRuleIds.length > 0) {\n orphanedReferences.push({\n ruleSetId: ruleSet.id,\n ruleSetName: ruleSet.name,\n missingRuleIds,\n });\n }\n }\n\n return {\n success: errors.length === 0,\n rules,\n ruleSets,\n errors,\n idMapping,\n orphanedReferences,\n };\n};\n\nexport const importFromJson = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n json: string,\n options: ImportOptions = {},\n): ImportResult<TContext, TConsequences> => {\n try {\n const data = JSON.parse(json) as ExportFormat;\n return importRules<TContext, TConsequences>(data, options);\n } catch (error) {\n return {\n success: false,\n rules: [],\n ruleSets: [],\n errors: [\n {\n index: -1,\n type: \"rule\",\n message: `Invalid JSON: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n idMapping: new Map(),\n orphanedReferences: [],\n };\n }\n};\n\nexport const cloneRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rule: Rule<TContext, TConsequences>,\n newId?: string,\n newName?: string,\n): Rule<TContext, TConsequences> => {\n const now = new Date();\n return {\n ...rule,\n id: newId ?? generateId(),\n name: newName ?? `${rule.name} (Copy)`,\n createdAt: now,\n updatedAt: now,\n };\n};\n\nexport const mergeRuleSets = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n baseRules: ReadonlyArray<Rule<TContext, TConsequences>>,\n incomingRules: ReadonlyArray<Rule<TContext, TConsequences>>,\n strategy: \"replace\" | \"skip\" | \"merge\" = \"replace\",\n): ReadonlyArray<Rule<TContext, TConsequences>> => {\n const ruleMap = new Map<string, Rule<TContext, TConsequences>>();\n\n for (const rule of baseRules) {\n ruleMap.set(rule.id, rule);\n }\n\n for (const rule of incomingRules) {\n const existing = ruleMap.get(rule.id);\n\n if (!existing) {\n ruleMap.set(rule.id, rule);\n } else {\n switch (strategy) {\n case \"replace\":\n ruleMap.set(rule.id, rule);\n break;\n case \"skip\":\n break;\n case \"merge\": {\n const merged: Rule<TContext, TConsequences> = {\n ...existing,\n ...rule,\n tags: [...new Set([...existing.tags, ...rule.tags])],\n metadata: { ...existing.metadata, ...rule.metadata },\n updatedAt: new Date(),\n };\n ruleMap.set(rule.id, merged);\n break;\n }\n }\n }\n }\n\n return [...ruleMap.values()];\n};\n\nexport const diffRuleSets = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n oldRules: ReadonlyArray<Rule<TContext, TConsequences>>,\n newRules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): {\n added: ReadonlyArray<Rule<TContext, TConsequences>>;\n removed: ReadonlyArray<Rule<TContext, TConsequences>>;\n modified: ReadonlyArray<{\n old: Rule<TContext, TConsequences>;\n new: Rule<TContext, TConsequences>;\n }>;\n unchanged: ReadonlyArray<Rule<TContext, TConsequences>>;\n} => {\n const oldMap = new Map(oldRules.map((r) => [r.id, r]));\n const newMap = new Map(newRules.map((r) => [r.id, r]));\n\n const added: Rule<TContext, TConsequences>[] = [];\n const removed: Rule<TContext, TConsequences>[] = [];\n const modified: Array<{\n old: Rule<TContext, TConsequences>;\n new: Rule<TContext, TConsequences>;\n }> = [];\n const unchanged: Rule<TContext, TConsequences>[] = [];\n\n for (const [id, newRule] of newMap) {\n const oldRule = oldMap.get(id);\n if (!oldRule) {\n added.push(newRule);\n } else if (\n JSON.stringify({ ...oldRule, updatedAt: null, createdAt: null }) !==\n JSON.stringify({ ...newRule, updatedAt: null, createdAt: null })\n ) {\n modified.push({ old: oldRule, new: newRule });\n } else {\n unchanged.push(newRule);\n }\n }\n\n for (const [id, oldRule] of oldMap) {\n if (!newMap.has(id)) {\n removed.push(oldRule);\n }\n }\n\n return { added, removed, modified, unchanged };\n};\n",
26
+ "import { createEvaluator } from \"@f-o-t/condition-evaluator\";\nimport { evaluateRule, evaluateRules } from \"../core/evaluate\";\nimport type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type {\n EvaluationContext,\n RuleEvaluationResult,\n} from \"../types/evaluation\";\nimport type { Rule } from \"../types/rule\";\n\nexport type SimulationContext<TContext = unknown> = {\n readonly data: TContext;\n readonly metadata?: Record<string, unknown>;\n};\n\nexport type SimulationResult<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly context: SimulationContext<TContext>;\n readonly matchedRules: ReadonlyArray<\n RuleEvaluationResult<TContext, TConsequences>\n >;\n readonly unmatchedRules: ReadonlyArray<{\n ruleId: string;\n ruleName: string;\n reason: string;\n }>;\n readonly consequences: ReadonlyArray<{\n type: keyof TConsequences;\n payload: unknown;\n ruleId: string;\n ruleName: string;\n }>;\n readonly executionTimeMs: number;\n};\n\nexport type WhatIfResult<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly original: SimulationResult<TContext, TConsequences>;\n readonly modified: SimulationResult<TContext, TConsequences>;\n readonly differences: {\n readonly newMatches: ReadonlyArray<string>;\n readonly lostMatches: ReadonlyArray<string>;\n readonly consequenceChanges: ReadonlyArray<{\n type: \"added\" | \"removed\" | \"modified\";\n consequenceType: string;\n ruleId: string;\n }>;\n };\n};\n\nexport type BatchSimulationResult<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly results: ReadonlyArray<SimulationResult<TContext, TConsequences>>;\n readonly summary: {\n readonly totalContexts: number;\n readonly averageMatchedRules: number;\n readonly ruleMatchFrequency: ReadonlyMap<string, number>;\n readonly consequenceFrequency: ReadonlyMap<string, number>;\n readonly averageExecutionTimeMs: number;\n };\n};\n\nconst toEvaluationContext = <TContext>(\n simContext: SimulationContext<TContext>,\n): EvaluationContext<TContext> => ({\n data: simContext.data,\n timestamp: new Date(),\n metadata: simContext.metadata,\n});\n\nexport const simulate = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n context: SimulationContext<TContext>,\n evaluator: ReturnType<typeof createEvaluator> = createEvaluator(),\n): SimulationResult<TContext, TConsequences> => {\n const startTime = performance.now();\n\n const enabledRules = rules.filter((r) => r.enabled);\n const evalContext = toEvaluationContext(context);\n const results = evaluateRules(enabledRules, evalContext, evaluator);\n\n const matchedRules = results.results.filter((r) => r.matched);\n const unmatchedRules: Array<{\n ruleId: string;\n ruleName: string;\n reason: string;\n }> = [];\n\n for (const result of results.results) {\n if (!result.matched) {\n const reason = result.skipped\n ? (result.skipReason ?? \"Skipped\")\n : result.error\n ? `Error: ${result.error.message}`\n : \"Conditions not met\";\n unmatchedRules.push({\n ruleId: result.ruleId,\n ruleName: result.ruleName,\n reason,\n });\n }\n }\n\n const consequences: Array<{\n type: keyof TConsequences;\n payload: unknown;\n ruleId: string;\n ruleName: string;\n }> = [];\n\n for (const match of matchedRules) {\n for (const consequence of match.consequences) {\n consequences.push({\n type: consequence.type,\n payload: consequence.payload,\n ruleId: consequence.ruleId,\n ruleName: consequence.ruleName ?? match.ruleName,\n });\n }\n }\n\n const executionTimeMs = performance.now() - startTime;\n\n return {\n context,\n matchedRules,\n unmatchedRules,\n consequences,\n executionTimeMs,\n };\n};\n\nexport const simulateSingleRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rule: Rule<TContext, TConsequences>,\n context: SimulationContext<TContext>,\n evaluator: ReturnType<typeof createEvaluator> = createEvaluator(),\n): {\n matched: boolean;\n conditionResult: unknown;\n consequences: ReadonlyArray<{ type: keyof TConsequences; payload: unknown }>;\n} => {\n const evalContext = toEvaluationContext(context);\n const result = evaluateRule(rule, evalContext, evaluator);\n\n return {\n matched: result.matched,\n conditionResult: result.conditionResult,\n consequences: result.matched\n ? rule.consequences.map((c) => ({ type: c.type, payload: c.payload }))\n : [],\n };\n};\n\nexport const whatIf = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n originalRules: ReadonlyArray<Rule<TContext, TConsequences>>,\n modifiedRules: ReadonlyArray<Rule<TContext, TConsequences>>,\n context: SimulationContext<TContext>,\n evaluator: ReturnType<typeof createEvaluator> = createEvaluator(),\n): WhatIfResult<TContext, TConsequences> => {\n const original = simulate(originalRules, context, evaluator);\n const modified = simulate(modifiedRules, context, evaluator);\n\n const originalMatchIds = new Set(original.matchedRules.map((r) => r.ruleId));\n const modifiedMatchIds = new Set(modified.matchedRules.map((r) => r.ruleId));\n\n const newMatches = [...modifiedMatchIds].filter(\n (id) => !originalMatchIds.has(id),\n );\n const lostMatches = [...originalMatchIds].filter(\n (id) => !modifiedMatchIds.has(id),\n );\n\n const consequenceChanges: Array<{\n type: \"added\" | \"removed\" | \"modified\";\n consequenceType: string;\n ruleId: string;\n }> = [];\n\n const originalConsequenceKeys = new Set(\n original.consequences.map((c) => `${c.ruleId}:${c.type as string}`),\n );\n const modifiedConsequenceKeys = new Set(\n modified.consequences.map((c) => `${c.ruleId}:${c.type as string}`),\n );\n\n for (const key of modifiedConsequenceKeys) {\n if (!originalConsequenceKeys.has(key)) {\n const [ruleId, consequenceType] = key.split(\":\");\n consequenceChanges.push({\n type: \"added\",\n consequenceType: consequenceType ?? \"\",\n ruleId: ruleId ?? \"\",\n });\n }\n }\n\n for (const key of originalConsequenceKeys) {\n if (!modifiedConsequenceKeys.has(key)) {\n const [ruleId, consequenceType] = key.split(\":\");\n consequenceChanges.push({\n type: \"removed\",\n consequenceType: consequenceType ?? \"\",\n ruleId: ruleId ?? \"\",\n });\n }\n }\n\n return {\n original,\n modified,\n differences: {\n newMatches,\n lostMatches,\n consequenceChanges,\n },\n };\n};\n\nexport const batchSimulate = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n contexts: ReadonlyArray<SimulationContext<TContext>>,\n evaluator: ReturnType<typeof createEvaluator> = createEvaluator(),\n): BatchSimulationResult<TContext, TConsequences> => {\n const results = contexts.map((context) => simulate(rules, context, evaluator));\n\n const ruleMatchFrequency = new Map<string, number>();\n const consequenceFrequency = new Map<string, number>();\n let totalMatchedRules = 0;\n let totalExecutionTime = 0;\n\n for (const result of results) {\n totalMatchedRules += result.matchedRules.length;\n totalExecutionTime += result.executionTimeMs;\n\n for (const match of result.matchedRules) {\n const count = ruleMatchFrequency.get(match.ruleId) ?? 0;\n ruleMatchFrequency.set(match.ruleId, count + 1);\n }\n\n for (const consequence of result.consequences) {\n const key = consequence.type as string;\n const count = consequenceFrequency.get(key) ?? 0;\n consequenceFrequency.set(key, count + 1);\n }\n }\n\n return {\n results,\n summary: {\n totalContexts: contexts.length,\n averageMatchedRules:\n contexts.length > 0 ? totalMatchedRules / contexts.length : 0,\n ruleMatchFrequency,\n consequenceFrequency,\n averageExecutionTimeMs:\n contexts.length > 0 ? totalExecutionTime / contexts.length : 0,\n },\n };\n};\n\nexport const findRulesAffectedByContextChange = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n originalContext: SimulationContext<TContext>,\n modifiedContext: SimulationContext<TContext>,\n evaluator: ReturnType<typeof createEvaluator> = createEvaluator(),\n): {\n becameTrue: ReadonlyArray<Rule<TContext, TConsequences>>;\n becameFalse: ReadonlyArray<Rule<TContext, TConsequences>>;\n unchanged: ReadonlyArray<Rule<TContext, TConsequences>>;\n} => {\n const originalResult = simulate(rules, originalContext, evaluator);\n const modifiedResult = simulate(rules, modifiedContext, evaluator);\n\n const originalMatchIds = new Set(\n originalResult.matchedRules.map((r) => r.ruleId),\n );\n const modifiedMatchIds = new Set(\n modifiedResult.matchedRules.map((r) => r.ruleId),\n );\n\n const becameTrue: Rule<TContext, TConsequences>[] = [];\n const becameFalse: Rule<TContext, TConsequences>[] = [];\n const unchanged: Rule<TContext, TConsequences>[] = [];\n\n for (const rule of rules) {\n const wasMatched = originalMatchIds.has(rule.id);\n const isMatched = modifiedMatchIds.has(rule.id);\n\n if (!wasMatched && isMatched) {\n becameTrue.push(rule);\n } else if (wasMatched && !isMatched) {\n becameFalse.push(rule);\n } else {\n unchanged.push(rule);\n }\n }\n\n return { becameTrue, becameFalse, unchanged };\n};\n\nexport const formatSimulationResult = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n result: SimulationResult<TContext, TConsequences>,\n): string => {\n const lines: string[] = [\n \"=== Simulation Result ===\",\n \"\",\n `Execution Time: ${result.executionTimeMs.toFixed(2)}ms`,\n \"\",\n `Matched Rules (${result.matchedRules.length}):`,\n ];\n\n for (const match of result.matchedRules) {\n lines.push(` - ${match.ruleName} (${match.ruleId})`);\n }\n\n lines.push(\"\");\n lines.push(`Unmatched Rules (${result.unmatchedRules.length}):`);\n\n for (const unmatched of result.unmatchedRules) {\n lines.push(` - ${unmatched.ruleName}: ${unmatched.reason}`);\n }\n\n lines.push(\"\");\n lines.push(`Consequences (${result.consequences.length}):`);\n\n for (const consequence of result.consequences) {\n lines.push(\n ` - ${consequence.type as string} from \"${consequence.ruleName}\"`,\n );\n }\n\n return lines.join(\"\\n\");\n};\n",
27
+ "import type { GroupEvaluationResult } from \"@f-o-t/condition-evaluator\";\nimport { z } from \"zod\";\nimport type {\n AggregatedConsequence,\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"./consequence\";\nimport type { Rule } from \"./rule\";\n\n// ============================================================================\n// Zod Schemas - Define schemas first, then infer types\n// ============================================================================\n\nexport const ConflictResolutionStrategySchema = z.enum([\n \"priority\",\n \"first-match\",\n \"all\",\n \"most-specific\",\n]);\nexport type ConflictResolutionStrategy = z.infer<\n typeof ConflictResolutionStrategySchema\n>;\n\nexport const EvaluateOptionsSchema = z.object({\n conflictResolution: ConflictResolutionStrategySchema.optional(),\n maxRules: z.number().int().positive().optional(),\n timeout: z.number().int().positive().optional(),\n skipDisabled: z.boolean().optional(),\n tags: z.array(z.string()).optional(),\n category: z.string().optional(),\n ruleSetId: z.string().optional(),\n bypassCache: z.boolean().optional(),\n});\nexport type EvaluateOptions = z.infer<typeof EvaluateOptionsSchema>;\n\nexport const EvaluateConfigSchema = z.object({\n conflictResolution: ConflictResolutionStrategySchema,\n continueOnError: z.boolean(),\n collectAllConsequences: z.boolean(),\n});\nexport type EvaluateConfig = z.infer<typeof EvaluateConfigSchema>;\n\n// ============================================================================\n// Types that cannot be Zod schemas (contain complex generics)\n// ============================================================================\n\nexport type EvaluationContext<TContext = unknown> = {\n readonly data: TContext;\n readonly timestamp: Date;\n readonly correlationId?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n};\n\nexport type RuleEvaluationResult<\n _TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly ruleId: string;\n readonly ruleName: string;\n readonly matched: boolean;\n readonly conditionResult: GroupEvaluationResult;\n readonly consequences: ReadonlyArray<AggregatedConsequence<TConsequences>>;\n readonly evaluationTimeMs: number;\n readonly skipped: boolean;\n readonly skipReason?: string;\n readonly error?: Error;\n};\n\nexport type EngineExecutionResult<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly context: EvaluationContext<TContext>;\n readonly results: ReadonlyArray<\n RuleEvaluationResult<TContext, TConsequences>\n >;\n readonly matchedRules: ReadonlyArray<Rule<TContext, TConsequences>>;\n readonly consequences: ReadonlyArray<AggregatedConsequence<TConsequences>>;\n readonly totalRulesEvaluated: number;\n readonly totalRulesMatched: number;\n readonly totalRulesSkipped: number;\n readonly totalRulesErrored: number;\n readonly executionTimeMs: number;\n readonly stoppedEarly: boolean;\n readonly stoppedByRuleId?: string;\n readonly cacheHit: boolean;\n};\n",
28
+ "import type { ConditionGroup } from \"@f-o-t/condition-evaluator\";\nimport { z } from \"zod\";\nimport type {\n Consequence,\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"./consequence\";\n\nexport type Rule<\n _TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly id: string;\n readonly name: string;\n readonly description?: string;\n readonly conditions: ConditionGroup;\n readonly consequences: ReadonlyArray<Consequence<TConsequences>>;\n readonly priority: number;\n readonly enabled: boolean;\n readonly stopOnMatch: boolean;\n readonly tags: ReadonlyArray<string>;\n readonly category?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly createdAt: Date;\n readonly updatedAt: Date;\n};\n\nexport type RuleInput<\n _TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n id?: string;\n name: string;\n description?: string;\n conditions: ConditionGroup;\n consequences: Array<{\n type: keyof TConsequences;\n payload: z.infer<TConsequences[keyof TConsequences]>;\n }>;\n priority?: number;\n enabled?: boolean;\n stopOnMatch?: boolean;\n tags?: string[];\n category?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type RuleSet = {\n readonly id: string;\n readonly name: string;\n readonly description?: string;\n readonly ruleIds: ReadonlyArray<string>;\n readonly enabled: boolean;\n readonly metadata?: Readonly<Record<string, unknown>>;\n};\n\nexport type RuleSetInput = {\n id?: string;\n name: string;\n description?: string;\n ruleIds: string[];\n enabled?: boolean;\n metadata?: Record<string, unknown>;\n};\n\nexport type RuleFilters = {\n readonly enabled?: boolean;\n readonly tags?: ReadonlyArray<string>;\n readonly category?: string;\n readonly ruleSetId?: string;\n readonly ids?: ReadonlyArray<string>;\n};\n\nexport const RuleSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n conditions: z.custom<ConditionGroup>((val) => {\n return (\n typeof val === \"object\" &&\n val !== null &&\n \"id\" in val &&\n \"operator\" in val\n );\n }, \"Invalid condition group\"),\n consequences: z.array(\n z.object({\n type: z.string(),\n payload: z.unknown(),\n }),\n ),\n priority: z.number().int().default(0),\n enabled: z.boolean().default(true),\n stopOnMatch: z.boolean().default(false),\n tags: z.array(z.string()).default([]),\n category: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n createdAt: z.date().default(() => new Date()),\n updatedAt: z.date().default(() => new Date()),\n});\n\nexport const RuleSetSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n ruleIds: z.array(z.string()),\n enabled: z.boolean().default(true),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type RuleSchemaType = z.infer<typeof RuleSchema>;\nexport type RuleSetSchemaType = z.infer<typeof RuleSetSchema>;\n",
29
+ "import {\n type Condition,\n type ConditionGroup,\n isConditionGroup,\n} from \"@f-o-t/condition-evaluator\";\nimport type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type { Rule } from \"../types/rule\";\n\nexport type ConflictType =\n | \"DUPLICATE_ID\"\n | \"DUPLICATE_CONDITIONS\"\n | \"OVERLAPPING_CONDITIONS\"\n | \"CONTRADICTORY_CONSEQUENCES\"\n | \"PRIORITY_COLLISION\"\n | \"UNREACHABLE_RULE\";\n\nexport type Conflict<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly type: ConflictType;\n readonly severity: \"error\" | \"warning\" | \"info\";\n readonly message: string;\n readonly ruleIds: ReadonlyArray<string>;\n readonly rules: ReadonlyArray<Rule<TContext, TConsequences>>;\n readonly details?: Readonly<Record<string, unknown>>;\n};\n\nexport type ConflictDetectionOptions = {\n readonly checkDuplicateIds?: boolean;\n readonly checkDuplicateConditions?: boolean;\n readonly checkOverlappingConditions?: boolean;\n readonly checkPriorityCollisions?: boolean;\n readonly checkUnreachableRules?: boolean;\n};\n\nconst DEFAULT_OPTIONS: ConflictDetectionOptions = {\n checkDuplicateIds: true,\n checkDuplicateConditions: true,\n checkOverlappingConditions: true,\n checkPriorityCollisions: true,\n checkUnreachableRules: true,\n};\n\nconst collectConditionFields = (\n condition: Condition | ConditionGroup,\n): Set<string> => {\n const fields = new Set<string>();\n\n if (isConditionGroup(condition)) {\n for (const child of condition.conditions) {\n const childFields = collectConditionFields(\n child as Condition | ConditionGroup,\n );\n for (const field of childFields) {\n fields.add(field);\n }\n }\n } else {\n fields.add(condition.field);\n }\n\n return fields;\n};\n\nconst hashConditionGroup = (condition: ConditionGroup): string => {\n const serialize = (c: Condition | ConditionGroup): string => {\n if (isConditionGroup(c)) {\n const sortedConditions = [...c.conditions]\n .map((child) => serialize(child as Condition | ConditionGroup))\n .sort();\n return `GROUP:${c.operator}:[${sortedConditions.join(\",\")}]`;\n }\n return `COND:${c.type}:${c.field}:${c.operator}:${JSON.stringify(c.value)}`;\n };\n return serialize(condition);\n};\n\nconst getConditionOperatorValues = (\n condition: ConditionGroup,\n field: string,\n): Array<{ operator: string; value: unknown }> => {\n const results: Array<{ operator: string; value: unknown }> = [];\n\n const traverse = (c: Condition | ConditionGroup) => {\n if (isConditionGroup(c)) {\n for (const child of c.conditions) {\n traverse(child as Condition | ConditionGroup);\n }\n } else if (c.field === field) {\n results.push({ operator: c.operator, value: c.value });\n }\n };\n\n traverse(condition);\n return results;\n};\n\nconst areConditionsOverlapping = (\n conditions1: ConditionGroup,\n conditions2: ConditionGroup,\n): boolean => {\n const fields1 = collectConditionFields(conditions1);\n const fields2 = collectConditionFields(conditions2);\n\n const commonFields = new Set([...fields1].filter((f) => fields2.has(f)));\n if (commonFields.size === 0) return false;\n\n for (const field of commonFields) {\n const ops1 = getConditionOperatorValues(conditions1, field);\n const ops2 = getConditionOperatorValues(conditions2, field);\n\n for (const op1 of ops1) {\n for (const op2 of ops2) {\n if (op1.operator === op2.operator && op1.value === op2.value) {\n return true;\n }\n\n if (\n (op1.operator === \"gt\" && op2.operator === \"lt\") ||\n (op1.operator === \"lt\" && op2.operator === \"gt\") ||\n (op1.operator === \"gte\" && op2.operator === \"lte\") ||\n (op1.operator === \"lte\" && op2.operator === \"gte\")\n ) {\n const val1 = op1.value as number;\n const val2 = op2.value as number;\n if (typeof val1 === \"number\" && typeof val2 === \"number\") {\n if (op1.operator === \"gt\" && op2.operator === \"lt\") {\n if (val1 < val2) return true;\n }\n if (op1.operator === \"lt\" && op2.operator === \"gt\") {\n if (val1 > val2) return true;\n }\n }\n }\n }\n }\n }\n\n return false;\n};\n\nconst findDuplicateIds = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<Conflict<TContext, TConsequences>> => {\n const conflicts: Conflict<TContext, TConsequences>[] = [];\n const idMap = new Map<string, Rule<TContext, TConsequences>[]>();\n\n for (const rule of rules) {\n const existing = idMap.get(rule.id) ?? [];\n existing.push(rule);\n idMap.set(rule.id, existing);\n }\n\n for (const [id, duplicates] of idMap) {\n if (duplicates.length > 1) {\n conflicts.push({\n type: \"DUPLICATE_ID\",\n severity: \"error\",\n message: `Multiple rules share the same ID: ${id}`,\n ruleIds: duplicates.map((r) => r.id),\n rules: duplicates,\n details: { duplicateId: id, count: duplicates.length },\n });\n }\n }\n\n return conflicts;\n};\n\nconst findDuplicateConditions = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<Conflict<TContext, TConsequences>> => {\n const conflicts: Conflict<TContext, TConsequences>[] = [];\n const hashMap = new Map<string, Rule<TContext, TConsequences>[]>();\n\n for (const rule of rules) {\n const hash = hashConditionGroup(rule.conditions);\n const existing = hashMap.get(hash) ?? [];\n existing.push(rule);\n hashMap.set(hash, existing);\n }\n\n for (const [hash, duplicates] of hashMap) {\n if (duplicates.length > 1) {\n conflicts.push({\n type: \"DUPLICATE_CONDITIONS\",\n severity: \"warning\",\n message: `Multiple rules have identical conditions: ${duplicates.map((r) => r.name).join(\", \")}`,\n ruleIds: duplicates.map((r) => r.id),\n rules: duplicates,\n details: { conditionHash: hash, count: duplicates.length },\n });\n }\n }\n\n return conflicts;\n};\n\nconst findOverlappingConditions = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<Conflict<TContext, TConsequences>> => {\n const conflicts: Conflict<TContext, TConsequences>[] = [];\n const checked = new Set<string>();\n\n for (let i = 0; i < rules.length; i++) {\n for (let j = i + 1; j < rules.length; j++) {\n const rule1 = rules[i];\n const rule2 = rules[j];\n if (!rule1 || !rule2) continue;\n const key = [rule1.id, rule2.id].sort().join(\":\");\n\n if (checked.has(key)) continue;\n checked.add(key);\n\n if (areConditionsOverlapping(rule1.conditions, rule2.conditions)) {\n conflicts.push({\n type: \"OVERLAPPING_CONDITIONS\",\n severity: \"info\",\n message: `Rules \"${rule1.name}\" and \"${rule2.name}\" have overlapping conditions`,\n ruleIds: [rule1.id, rule2.id],\n rules: [rule1, rule2],\n details: {\n rule1Fields: [...collectConditionFields(rule1.conditions)],\n rule2Fields: [...collectConditionFields(rule2.conditions)],\n },\n });\n }\n }\n }\n\n return conflicts;\n};\n\nconst findPriorityCollisions = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<Conflict<TContext, TConsequences>> => {\n const conflicts: Conflict<TContext, TConsequences>[] = [];\n const priorityMap = new Map<number, Rule<TContext, TConsequences>[]>();\n\n for (const rule of rules) {\n const existing = priorityMap.get(rule.priority) ?? [];\n existing.push(rule);\n priorityMap.set(rule.priority, existing);\n }\n\n for (const [priority, rulesWithPriority] of priorityMap) {\n if (rulesWithPriority.length > 1) {\n const overlappingPairs: Set<string> = new Set();\n\n for (let i = 0; i < rulesWithPriority.length; i++) {\n for (let j = i + 1; j < rulesWithPriority.length; j++) {\n const r1 = rulesWithPriority[i];\n const r2 = rulesWithPriority[j];\n if (!r1 || !r2) continue;\n if (areConditionsOverlapping(r1.conditions, r2.conditions)) {\n overlappingPairs.add(r1.id);\n overlappingPairs.add(r2.id);\n }\n }\n }\n\n if (overlappingPairs.size > 1) {\n const overlapping = rulesWithPriority.filter((r) =>\n overlappingPairs.has(r.id),\n );\n conflicts.push({\n type: \"PRIORITY_COLLISION\",\n severity: \"warning\",\n message: `Multiple overlapping rules share priority ${priority}: ${overlapping.map((r) => r.name).join(\", \")}`,\n ruleIds: overlapping.map((r) => r.id),\n rules: overlapping,\n details: { priority, count: overlapping.length },\n });\n }\n }\n }\n\n return conflicts;\n};\n\nconst findUnreachableRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<Conflict<TContext, TConsequences>> => {\n const conflicts: Conflict<TContext, TConsequences>[] = [];\n const sortedRules = [...rules].sort((a, b) => b.priority - a.priority);\n\n for (let i = 0; i < sortedRules.length; i++) {\n const rule = sortedRules[i];\n if (!rule) continue;\n\n if (!rule.enabled) continue;\n\n for (let j = 0; j < i; j++) {\n const higherPriorityRule = sortedRules[j];\n if (!higherPriorityRule) continue;\n\n if (!higherPriorityRule.enabled || !higherPriorityRule.stopOnMatch) {\n continue;\n }\n\n if (\n hashConditionGroup(rule.conditions) ===\n hashConditionGroup(higherPriorityRule.conditions)\n ) {\n conflicts.push({\n type: \"UNREACHABLE_RULE\",\n severity: \"warning\",\n message: `Rule \"${rule.name}\" may be unreachable because rule \"${higherPriorityRule.name}\" has higher priority and stops on match`,\n ruleIds: [rule.id, higherPriorityRule.id],\n rules: [rule, higherPriorityRule],\n details: {\n unreachableRule: rule.id,\n blockingRule: higherPriorityRule.id,\n priorityDifference:\n higherPriorityRule.priority - rule.priority,\n },\n });\n }\n }\n }\n\n return conflicts;\n};\n\nexport const detectConflicts = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n options: ConflictDetectionOptions = {},\n): ReadonlyArray<Conflict<TContext, TConsequences>> => {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const conflicts: Conflict<TContext, TConsequences>[] = [];\n\n if (opts.checkDuplicateIds) {\n conflicts.push(...findDuplicateIds(rules));\n }\n\n if (opts.checkDuplicateConditions) {\n conflicts.push(...findDuplicateConditions(rules));\n }\n\n if (opts.checkOverlappingConditions) {\n conflicts.push(...findOverlappingConditions(rules));\n }\n\n if (opts.checkPriorityCollisions) {\n conflicts.push(...findPriorityCollisions(rules));\n }\n\n if (opts.checkUnreachableRules) {\n conflicts.push(...findUnreachableRules(rules));\n }\n\n return conflicts;\n};\n\nexport const hasConflicts = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n options: ConflictDetectionOptions = {},\n): boolean => {\n return detectConflicts(rules, options).length > 0;\n};\n\nexport const hasErrors = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n options: ConflictDetectionOptions = {},\n): boolean => {\n return detectConflicts(rules, options).some((c) => c.severity === \"error\");\n};\n\nexport const getConflictsByType = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n conflicts: ReadonlyArray<Conflict<TContext, TConsequences>>,\n type: ConflictType,\n): ReadonlyArray<Conflict<TContext, TConsequences>> => {\n return conflicts.filter((c) => c.type === type);\n};\n\nexport const getConflictsBySeverity = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n conflicts: ReadonlyArray<Conflict<TContext, TConsequences>>,\n severity: \"error\" | \"warning\" | \"info\",\n): ReadonlyArray<Conflict<TContext, TConsequences>> => {\n return conflicts.filter((c) => c.severity === severity);\n};\n\nexport const formatConflicts = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n conflicts: ReadonlyArray<Conflict<TContext, TConsequences>>,\n): string => {\n if (conflicts.length === 0) {\n return \"No conflicts detected\";\n }\n\n const lines: string[] = [`Found ${conflicts.length} conflict(s):`];\n\n for (const conflict of conflicts) {\n const severityIcon =\n conflict.severity === \"error\"\n ? \"[ERROR]\"\n : conflict.severity === \"warning\"\n ? \"[WARN]\"\n : \"[INFO]\";\n lines.push(` ${severityIcon} ${conflict.type}: ${conflict.message}`);\n }\n\n return lines.join(\"\\n\");\n};\n",
30
+ "import {\n type Condition,\n type ConditionGroup,\n isConditionGroup,\n} from \"@f-o-t/condition-evaluator\";\nimport type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type { Rule, RuleSet } from \"../types/rule\";\n\nexport type IntegrityIssue = {\n readonly code: string;\n readonly message: string;\n readonly severity: \"error\" | \"warning\" | \"info\";\n readonly path?: string;\n readonly ruleId?: string;\n readonly details?: Readonly<Record<string, unknown>>;\n};\n\nexport type IntegrityCheckResult = {\n readonly valid: boolean;\n readonly issues: ReadonlyArray<IntegrityIssue>;\n};\n\nexport type IntegrityCheckOptions = {\n readonly checkCircularReferences?: boolean;\n readonly checkOrphanedRuleSets?: boolean;\n readonly checkMissingReferences?: boolean;\n readonly checkFieldConsistency?: boolean;\n readonly requiredFields?: ReadonlyArray<string>;\n readonly allowedCategories?: ReadonlyArray<string>;\n readonly allowedTags?: ReadonlyArray<string>;\n};\n\nconst DEFAULT_OPTIONS: IntegrityCheckOptions = {\n checkCircularReferences: true,\n checkOrphanedRuleSets: true,\n checkMissingReferences: true,\n checkFieldConsistency: true,\n};\n\nconst createIssue = (\n code: string,\n message: string,\n severity: \"error\" | \"warning\" | \"info\",\n details?: {\n path?: string;\n ruleId?: string;\n extra?: Record<string, unknown>;\n },\n): IntegrityIssue => ({\n code,\n message,\n severity,\n path: details?.path,\n ruleId: details?.ruleId,\n details: details?.extra,\n});\n\nconst collectAllFields = (condition: ConditionGroup): Set<string> => {\n const fields = new Set<string>();\n\n const traverse = (c: Condition | ConditionGroup) => {\n if (isConditionGroup(c)) {\n for (const child of c.conditions) {\n traverse(child as Condition | ConditionGroup);\n }\n } else {\n fields.add(c.field);\n }\n };\n\n traverse(condition);\n return fields;\n};\n\nconst checkDuplicateConditionIds = (\n condition: ConditionGroup,\n ruleId: string,\n): ReadonlyArray<IntegrityIssue> => {\n const issues: IntegrityIssue[] = [];\n const seenIds = new Map<string, number>();\n\n const traverse = (c: Condition | ConditionGroup, path: string) => {\n const id = c.id;\n const count = seenIds.get(id) ?? 0;\n seenIds.set(id, count + 1);\n\n if (count > 0) {\n issues.push(\n createIssue(\n \"DUPLICATE_CONDITION_ID\",\n `Duplicate condition ID \"${id}\" found within rule`,\n \"error\",\n { path, ruleId, extra: { conditionId: id } },\n ),\n );\n }\n\n if (isConditionGroup(c)) {\n c.conditions.forEach((child, i) => {\n traverse(child as Condition | ConditionGroup, `${path}[${i}]`);\n });\n }\n };\n\n traverse(condition, \"conditions\");\n return issues;\n};\n\nconst checkRuleIntegrity = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rule: Rule<TContext, TConsequences>,\n options: IntegrityCheckOptions,\n): ReadonlyArray<IntegrityIssue> => {\n const issues: IntegrityIssue[] = [];\n\n issues.push(...checkDuplicateConditionIds(rule.conditions, rule.id));\n\n if (rule.priority < 0) {\n issues.push(\n createIssue(\n \"NEGATIVE_PRIORITY\",\n `Rule \"${rule.name}\" has negative priority: ${rule.priority}`,\n \"warning\",\n { ruleId: rule.id, extra: { priority: rule.priority } },\n ),\n );\n }\n\n if (rule.priority > 1000) {\n issues.push(\n createIssue(\n \"EXTREME_PRIORITY\",\n `Rule \"${rule.name}\" has very high priority: ${rule.priority}`,\n \"info\",\n { ruleId: rule.id, extra: { priority: rule.priority } },\n ),\n );\n }\n\n if (rule.consequences.length === 0) {\n issues.push(\n createIssue(\n \"NO_CONSEQUENCES\",\n `Rule \"${rule.name}\" has no consequences defined`,\n \"warning\",\n { ruleId: rule.id },\n ),\n );\n }\n\n if (options.allowedCategories && rule.category) {\n if (!options.allowedCategories.includes(rule.category)) {\n issues.push(\n createIssue(\n \"INVALID_CATEGORY\",\n `Rule \"${rule.name}\" has invalid category: ${rule.category}`,\n \"error\",\n {\n ruleId: rule.id,\n extra: {\n category: rule.category,\n allowedCategories: [...options.allowedCategories],\n },\n },\n ),\n );\n }\n }\n\n if (options.allowedTags) {\n const invalidTags = rule.tags.filter(\n (t) => !options.allowedTags?.includes(t),\n );\n if (invalidTags.length > 0) {\n issues.push(\n createIssue(\n \"INVALID_TAGS\",\n `Rule \"${rule.name}\" has invalid tags: ${invalidTags.join(\", \")}`,\n \"warning\",\n {\n ruleId: rule.id,\n extra: {\n invalidTags,\n allowedTags: [...options.allowedTags],\n },\n },\n ),\n );\n }\n }\n\n if (options.requiredFields) {\n const ruleFields = collectAllFields(rule.conditions);\n const missingFields = options.requiredFields.filter(\n (f) => !ruleFields.has(f),\n );\n if (missingFields.length > 0) {\n issues.push(\n createIssue(\n \"MISSING_REQUIRED_FIELDS\",\n `Rule \"${rule.name}\" is missing required fields: ${missingFields.join(\", \")}`,\n \"warning\",\n { ruleId: rule.id, extra: { missingFields } },\n ),\n );\n }\n }\n\n return issues;\n};\n\nconst checkRuleSetIntegrity = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n ruleSet: RuleSet,\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<IntegrityIssue> => {\n const issues: IntegrityIssue[] = [];\n const ruleIds = new Set(rules.map((r) => r.id));\n\n for (const ruleId of ruleSet.ruleIds) {\n if (!ruleIds.has(ruleId)) {\n issues.push(\n createIssue(\n \"MISSING_RULE_REFERENCE\",\n `RuleSet \"${ruleSet.name}\" references non-existent rule: ${ruleId}`,\n \"error\",\n { extra: { ruleSetId: ruleSet.id, missingRuleId: ruleId } },\n ),\n );\n }\n }\n\n if (ruleSet.ruleIds.length === 0) {\n issues.push(\n createIssue(\n \"EMPTY_RULESET\",\n `RuleSet \"${ruleSet.name}\" contains no rules`,\n \"warning\",\n { extra: { ruleSetId: ruleSet.id } },\n ),\n );\n }\n\n const duplicateIds = ruleSet.ruleIds.filter(\n (id, i) => ruleSet.ruleIds.indexOf(id) !== i,\n );\n if (duplicateIds.length > 0) {\n issues.push(\n createIssue(\n \"DUPLICATE_RULESET_ENTRIES\",\n `RuleSet \"${ruleSet.name}\" contains duplicate rule references: ${[...new Set(duplicateIds)].join(\", \")}`,\n \"warning\",\n { extra: { ruleSetId: ruleSet.id, duplicateIds } },\n ),\n );\n }\n\n return issues;\n};\n\nconst checkFieldConsistency = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<IntegrityIssue> => {\n const issues: IntegrityIssue[] = [];\n const fieldTypes = new Map<\n string,\n { type: string; ruleId: string; ruleName: string }[]\n >();\n\n for (const rule of rules) {\n const traverse = (c: Condition | ConditionGroup) => {\n if (isConditionGroup(c)) {\n for (const child of c.conditions) {\n traverse(child as Condition | ConditionGroup);\n }\n } else {\n const existing = fieldTypes.get(c.field) ?? [];\n existing.push({\n type: c.type,\n ruleId: rule.id,\n ruleName: rule.name,\n });\n fieldTypes.set(c.field, existing);\n }\n };\n\n traverse(rule.conditions);\n }\n\n for (const [field, types] of fieldTypes) {\n const uniqueTypes = [...new Set(types.map((t) => t.type))];\n if (uniqueTypes.length > 1) {\n issues.push(\n createIssue(\n \"INCONSISTENT_FIELD_TYPE\",\n `Field \"${field}\" is used with different types: ${uniqueTypes.join(\", \")}`,\n \"warning\",\n {\n extra: {\n field,\n types: uniqueTypes,\n rules: types.map((t) => ({\n id: t.ruleId,\n name: t.ruleName,\n type: t.type,\n })),\n },\n },\n ),\n );\n }\n }\n\n return issues;\n};\n\nexport const checkIntegrity = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n ruleSets: ReadonlyArray<RuleSet> = [],\n options: IntegrityCheckOptions = {},\n): IntegrityCheckResult => {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const issues: IntegrityIssue[] = [];\n\n for (const rule of rules) {\n issues.push(...checkRuleIntegrity(rule, opts));\n }\n\n for (const ruleSet of ruleSets) {\n issues.push(...checkRuleSetIntegrity(ruleSet, rules));\n }\n\n if (opts.checkFieldConsistency) {\n issues.push(...checkFieldConsistency(rules));\n }\n\n return {\n valid: issues.filter((i) => i.severity === \"error\").length === 0,\n issues,\n };\n};\n\nexport const checkRuleFieldCoverage = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n expectedFields: ReadonlyArray<string>,\n): {\n coveredFields: ReadonlyArray<string>;\n uncoveredFields: ReadonlyArray<string>;\n extraFields: ReadonlyArray<string>;\n coveragePercentage: number;\n} => {\n const allFields = new Set<string>();\n\n for (const rule of rules) {\n const ruleFields = collectAllFields(rule.conditions);\n for (const field of ruleFields) {\n allFields.add(field);\n }\n }\n\n const expectedSet = new Set(expectedFields);\n const coveredFields = [...expectedFields].filter((f) => allFields.has(f));\n const uncoveredFields = [...expectedFields].filter((f) => !allFields.has(f));\n const extraFields = [...allFields].filter((f) => !expectedSet.has(f));\n\n return {\n coveredFields,\n uncoveredFields,\n extraFields,\n coveragePercentage:\n expectedFields.length > 0\n ? (coveredFields.length / expectedFields.length) * 100\n : 100,\n };\n};\n\nexport const getUsedFields = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<string> => {\n const fields = new Set<string>();\n\n for (const rule of rules) {\n const ruleFields = collectAllFields(rule.conditions);\n for (const field of ruleFields) {\n fields.add(field);\n }\n }\n\n return [...fields].sort();\n};\n\nexport const getUsedOperators = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<Rule<TContext, TConsequences>>,\n): ReadonlyArray<{ field: string; operator: string; type: string }> => {\n const operators: Array<{ field: string; operator: string; type: string }> =\n [];\n const seen = new Set<string>();\n\n for (const rule of rules) {\n const traverse = (c: Condition | ConditionGroup) => {\n if (isConditionGroup(c)) {\n for (const child of c.conditions) {\n traverse(child as Condition | ConditionGroup);\n }\n } else {\n const key = `${c.field}:${c.operator}:${c.type}`;\n if (!seen.has(key)) {\n seen.add(key);\n operators.push({\n field: c.field,\n operator: c.operator,\n type: c.type,\n });\n }\n }\n };\n\n traverse(rule.conditions);\n }\n\n return operators;\n};\n\nexport const formatIntegrityResult = (result: IntegrityCheckResult): string => {\n if (result.valid && result.issues.length === 0) {\n return \"Integrity check passed - no issues found\";\n }\n\n const lines: string[] = [\n result.valid\n ? `Integrity check passed with ${result.issues.length} warning(s)`\n : `Integrity check failed with ${result.issues.filter((i) => i.severity === \"error\").length} error(s)`,\n ];\n\n const grouped = {\n error: result.issues.filter((i) => i.severity === \"error\"),\n warning: result.issues.filter((i) => i.severity === \"warning\"),\n info: result.issues.filter((i) => i.severity === \"info\"),\n };\n\n for (const [severity, issues] of Object.entries(grouped)) {\n if (issues.length > 0) {\n lines.push(`\\n${severity.toUpperCase()}S (${issues.length}):`);\n for (const issue of issues) {\n lines.push(` - [${issue.code}] ${issue.message}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n};\n",
31
+ "import {\n type Condition,\n type ConditionGroup,\n isConditionGroup,\n} from \"@f-o-t/condition-evaluator\";\nimport { z } from \"zod\";\nimport type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport { type Rule, RuleSchema, RuleSetSchema } from \"../types/rule\";\n\n// ============================================================================\n// Zod Schemas - Define schemas first, then infer types\n// ============================================================================\n\nexport const ValidationErrorSchema = z.object({\n path: z.string(),\n message: z.string(),\n code: z.string(),\n});\nexport type ValidationError = z.infer<typeof ValidationErrorSchema>;\n\nexport const ValidationResultSchema = z.object({\n valid: z.boolean(),\n errors: z.array(ValidationErrorSchema),\n});\nexport type ValidationResult = z.infer<typeof ValidationResultSchema>;\n\nexport const ValidationOptionsSchema = z.object({\n validateConditions: z.boolean().optional(),\n validateConsequences: z.boolean().optional(),\n strictMode: z.boolean().optional(),\n});\nexport type ValidationOptions = z.infer<typeof ValidationOptionsSchema>;\n\n// Resolved options with defaults applied\nexport type ResolvedValidationOptions = {\n validateConditions: boolean;\n validateConsequences: boolean;\n strictMode: boolean;\n};\n\n// ============================================================================\n// Default options (derived from schema)\n// ============================================================================\n\nconst DEFAULT_OPTIONS: ValidationOptions = ValidationOptionsSchema.parse({});\n\nconst createError = (\n path: string,\n message: string,\n code: string,\n): ValidationError => ({\n path,\n message,\n code,\n});\n\nconst validResult = (): ValidationResult => ({\n valid: true,\n errors: [],\n});\n\nconst invalidResult = (\n errors: ReadonlyArray<ValidationError>,\n): ValidationResult => ({\n valid: false,\n errors: [...errors],\n});\n\nconst validateConditionStructure = (\n condition: Condition | ConditionGroup,\n path: string,\n): ReadonlyArray<ValidationError> => {\n const errors: ValidationError[] = [];\n\n if (isConditionGroup(condition)) {\n if (!condition.id || typeof condition.id !== \"string\") {\n errors.push(\n createError(\n `${path}.id`,\n \"Condition group must have a string id\",\n \"MISSING_GROUP_ID\",\n ),\n );\n }\n\n if (![\"AND\", \"OR\"].includes(condition.operator)) {\n errors.push(\n createError(\n `${path}.operator`,\n `Invalid operator: ${condition.operator}. Must be \"AND\" or \"OR\"`,\n \"INVALID_GROUP_OPERATOR\",\n ),\n );\n }\n\n if (!Array.isArray(condition.conditions)) {\n errors.push(\n createError(\n `${path}.conditions`,\n \"Condition group must have a conditions array\",\n \"MISSING_CONDITIONS_ARRAY\",\n ),\n );\n } else if (condition.conditions.length === 0) {\n errors.push(\n createError(\n `${path}.conditions`,\n \"Condition group must have at least one condition\",\n \"EMPTY_CONDITIONS_ARRAY\",\n ),\n );\n } else {\n for (let i = 0; i < condition.conditions.length; i++) {\n const nestedErrors = validateConditionStructure(\n condition.conditions[i] as Condition | ConditionGroup,\n `${path}.conditions[${i}]`,\n );\n errors.push(...nestedErrors);\n }\n }\n } else {\n if (!condition.id || typeof condition.id !== \"string\") {\n errors.push(\n createError(\n `${path}.id`,\n \"Condition must have a string id\",\n \"MISSING_CONDITION_ID\",\n ),\n );\n }\n\n if (!condition.type || typeof condition.type !== \"string\") {\n errors.push(\n createError(\n `${path}.type`,\n \"Condition must have a type\",\n \"MISSING_CONDITION_TYPE\",\n ),\n );\n }\n\n if (!condition.field || typeof condition.field !== \"string\") {\n errors.push(\n createError(\n `${path}.field`,\n \"Condition must have a field\",\n \"MISSING_CONDITION_FIELD\",\n ),\n );\n }\n\n if (!condition.operator || typeof condition.operator !== \"string\") {\n errors.push(\n createError(\n `${path}.operator`,\n \"Condition must have an operator\",\n \"MISSING_CONDITION_OPERATOR\",\n ),\n );\n }\n }\n\n return errors;\n};\n\nconst validateConsequenceStructure = <\n TConsequences extends ConsequenceDefinitions,\n>(\n consequences: ReadonlyArray<{ type: unknown; payload: unknown }>,\n consequenceSchemas?: TConsequences,\n strictMode = false,\n): ReadonlyArray<ValidationError> => {\n const errors: ValidationError[] = [];\n\n for (let i = 0; i < consequences.length; i++) {\n const consequence = consequences[i];\n if (!consequence) continue;\n const path = `consequences[${i}]`;\n\n if (!consequence.type || typeof consequence.type !== \"string\") {\n errors.push(\n createError(\n `${path}.type`,\n \"Consequence must have a type\",\n \"MISSING_CONSEQUENCE_TYPE\",\n ),\n );\n continue;\n }\n\n if (strictMode && consequenceSchemas) {\n const schema = consequenceSchemas[consequence.type as string];\n if (!schema) {\n errors.push(\n createError(\n `${path}.type`,\n `Unknown consequence type: ${consequence.type}`,\n \"UNKNOWN_CONSEQUENCE_TYPE\",\n ),\n );\n } else {\n const result = schema.safeParse(consequence.payload);\n if (!result.success) {\n for (const issue of result.error.issues) {\n errors.push(\n createError(\n `${path}.payload.${issue.path.join(\".\")}`,\n issue.message,\n \"INVALID_CONSEQUENCE_PAYLOAD\",\n ),\n );\n }\n }\n }\n }\n }\n\n return errors;\n};\n\nexport const validateRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rule: unknown,\n options: ValidationOptions & { consequenceSchemas?: TConsequences } = {},\n): ValidationResult => {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const errors: ValidationError[] = [];\n\n const schemaResult = RuleSchema.safeParse(rule);\n if (!schemaResult.success) {\n for (const issue of schemaResult.error.issues) {\n errors.push(\n createError(\n issue.path.join(\".\"),\n issue.message,\n \"SCHEMA_VALIDATION_FAILED\",\n ),\n );\n }\n return invalidResult(errors);\n }\n\n const validRule = schemaResult.data as Rule<TContext, TConsequences>;\n\n if (opts.validateConditions) {\n const conditionErrors = validateConditionStructure(\n validRule.conditions,\n \"conditions\",\n );\n errors.push(...conditionErrors);\n }\n\n if (opts.validateConsequences || opts.strictMode) {\n const consequenceErrors = validateConsequenceStructure(\n validRule.consequences as ReadonlyArray<{\n type: unknown;\n payload: unknown;\n }>,\n opts.consequenceSchemas,\n opts.strictMode ?? false,\n );\n errors.push(...consequenceErrors);\n }\n\n return errors.length > 0 ? invalidResult(errors) : validResult();\n};\n\nexport const validateRules = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rules: ReadonlyArray<unknown>,\n options: ValidationOptions & { consequenceSchemas?: TConsequences } = {},\n): ValidationResult => {\n const errors: ValidationError[] = [];\n\n for (let i = 0; i < rules.length; i++) {\n const result = validateRule<TContext, TConsequences>(rules[i], options);\n if (!result.valid) {\n for (const error of result.errors) {\n errors.push(\n createError(\n `rules[${i}].${error.path}`,\n error.message,\n error.code,\n ),\n );\n }\n }\n }\n\n return errors.length > 0 ? invalidResult(errors) : validResult();\n};\n\nexport const validateRuleSet = (ruleSet: unknown): ValidationResult => {\n const errors: ValidationError[] = [];\n\n const schemaResult = RuleSetSchema.safeParse(ruleSet);\n if (!schemaResult.success) {\n for (const issue of schemaResult.error.issues) {\n errors.push(\n createError(\n issue.path.join(\".\"),\n issue.message,\n \"SCHEMA_VALIDATION_FAILED\",\n ),\n );\n }\n return invalidResult(errors);\n }\n\n return validResult();\n};\n\nexport const validateConditions = (\n conditions: ConditionGroup,\n): ValidationResult => {\n const errors = validateConditionStructure(conditions, \"conditions\");\n return errors.length > 0 ? invalidResult(errors) : validResult();\n};\n\nexport const parseRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rule: unknown,\n options: ValidationOptions & { consequenceSchemas?: TConsequences } = {},\n): Rule<TContext, TConsequences> => {\n const result = validateRule<TContext, TConsequences>(rule, options);\n if (!result.valid) {\n throw new Error(\n `Invalid rule: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n return rule as Rule<TContext, TConsequences>;\n};\n\nexport const safeParseRule = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n rule: unknown,\n options: ValidationOptions & { consequenceSchemas?: TConsequences } = {},\n):\n | { success: true; data: Rule<TContext, TConsequences> }\n | { success: false; errors: ReadonlyArray<ValidationError> } => {\n const result = validateRule<TContext, TConsequences>(rule, options);\n if (!result.valid) {\n return { success: false, errors: result.errors };\n }\n return { success: true, data: rule as Rule<TContext, TConsequences> };\n};\n\nexport const createRuleValidator = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n consequenceSchemas: TConsequences,\n defaultOptions: ValidationOptions = {},\n) => {\n return {\n validate: (rule: unknown, options: ValidationOptions = {}) =>\n validateRule<TContext, TConsequences>(rule, {\n ...defaultOptions,\n ...options,\n consequenceSchemas,\n }),\n parse: (rule: unknown, options: ValidationOptions = {}) =>\n parseRule<TContext, TConsequences>(rule, {\n ...defaultOptions,\n ...options,\n consequenceSchemas,\n }),\n safeParse: (rule: unknown, options: ValidationOptions = {}) =>\n safeParseRule<TContext, TConsequences>(rule, {\n ...defaultOptions,\n ...options,\n consequenceSchemas,\n }),\n };\n};\n",
32
+ "import type {\n ConsequenceDefinitions,\n DefaultConsequences,\n} from \"../types/consequence\";\nimport type { Rule } from \"../types/rule\";\nimport { generateId } from \"../utils/id\";\n\nexport type RuleVersion<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly versionId: string;\n readonly ruleId: string;\n readonly version: number;\n readonly rule: Rule<TContext, TConsequences>;\n readonly createdAt: Date;\n readonly createdBy?: string;\n readonly comment?: string;\n readonly changeType: \"create\" | \"update\" | \"delete\" | \"enable\" | \"disable\";\n};\n\nexport type VersionHistory<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly ruleId: string;\n readonly currentVersion: number;\n readonly versions: ReadonlyArray<RuleVersion<TContext, TConsequences>>;\n};\n\nexport type VersionStore<\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n> = {\n readonly histories: ReadonlyMap<\n string,\n VersionHistory<TContext, TConsequences>\n >;\n};\n\nexport const createVersionStore = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(): VersionStore<TContext, TConsequences> => ({\n histories: new Map(),\n});\n\nexport const addVersion = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n store: VersionStore<TContext, TConsequences>,\n rule: Rule<TContext, TConsequences>,\n changeType: RuleVersion<TContext, TConsequences>[\"changeType\"],\n options: { createdBy?: string; comment?: string } = {},\n): VersionStore<TContext, TConsequences> => {\n const histories = new Map(store.histories);\n const existingHistory = histories.get(rule.id);\n\n const currentVersion = existingHistory\n ? existingHistory.currentVersion + 1\n : 1;\n\n const version: RuleVersion<TContext, TConsequences> = {\n versionId: generateId(),\n ruleId: rule.id,\n version: currentVersion,\n rule: { ...rule },\n createdAt: new Date(),\n createdBy: options.createdBy,\n comment: options.comment,\n changeType,\n };\n\n const newHistory: VersionHistory<TContext, TConsequences> = {\n ruleId: rule.id,\n currentVersion,\n versions: existingHistory\n ? [...existingHistory.versions, version]\n : [version],\n };\n\n histories.set(rule.id, newHistory);\n\n return { histories };\n};\n\nexport const getHistory = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n store: VersionStore<TContext, TConsequences>,\n ruleId: string,\n): VersionHistory<TContext, TConsequences> | undefined => {\n return store.histories.get(ruleId);\n};\n\nexport const getVersion = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n store: VersionStore<TContext, TConsequences>,\n ruleId: string,\n version: number,\n): RuleVersion<TContext, TConsequences> | undefined => {\n const history = store.histories.get(ruleId);\n if (!history) return undefined;\n return history.versions.find((v) => v.version === version);\n};\n\nexport const getLatestVersion = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n store: VersionStore<TContext, TConsequences>,\n ruleId: string,\n): RuleVersion<TContext, TConsequences> | undefined => {\n const history = store.histories.get(ruleId);\n if (!history || history.versions.length === 0) return undefined;\n return history.versions[history.versions.length - 1];\n};\n\nexport const getAllVersions = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n store: VersionStore<TContext, TConsequences>,\n ruleId: string,\n): ReadonlyArray<RuleVersion<TContext, TConsequences>> => {\n const history = store.histories.get(ruleId);\n return history?.versions ?? [];\n};\n\nexport const rollbackToVersion = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n store: VersionStore<TContext, TConsequences>,\n ruleId: string,\n targetVersion: number,\n options: { createdBy?: string; comment?: string } = {},\n): {\n store: VersionStore<TContext, TConsequences>;\n rule: Rule<TContext, TConsequences> | undefined;\n} => {\n const targetVersionRecord = getVersion(store, ruleId, targetVersion);\n if (!targetVersionRecord) {\n return { store, rule: undefined };\n }\n\n const rolledBackRule: Rule<TContext, TConsequences> = {\n ...targetVersionRecord.rule,\n updatedAt: new Date(),\n };\n\n const newStore = addVersion(store, rolledBackRule, \"update\", {\n createdBy: options.createdBy,\n comment: options.comment ?? `Rollback to version ${targetVersion}`,\n });\n\n return { store: newStore, rule: rolledBackRule };\n};\n\nexport const compareVersions = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n store: VersionStore<TContext, TConsequences>,\n ruleId: string,\n version1: number,\n version2: number,\n): {\n version1: RuleVersion<TContext, TConsequences> | undefined;\n version2: RuleVersion<TContext, TConsequences> | undefined;\n differences: ReadonlyArray<{\n field: string;\n oldValue: unknown;\n newValue: unknown;\n }>;\n} | null => {\n const v1 = getVersion(store, ruleId, version1);\n const v2 = getVersion(store, ruleId, version2);\n\n if (!v1 || !v2) {\n return null;\n }\n\n const differences: Array<{\n field: string;\n oldValue: unknown;\n newValue: unknown;\n }> = [];\n\n const compareFields = [\n \"name\",\n \"description\",\n \"priority\",\n \"enabled\",\n \"stopOnMatch\",\n \"category\",\n ] as const;\n\n for (const field of compareFields) {\n const oldValue = v1.rule[field];\n const newValue = v2.rule[field];\n if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) {\n differences.push({ field, oldValue, newValue });\n }\n }\n\n if (\n JSON.stringify(v1.rule.conditions) !== JSON.stringify(v2.rule.conditions)\n ) {\n differences.push({\n field: \"conditions\",\n oldValue: v1.rule.conditions,\n newValue: v2.rule.conditions,\n });\n }\n\n if (\n JSON.stringify(v1.rule.consequences) !==\n JSON.stringify(v2.rule.consequences)\n ) {\n differences.push({\n field: \"consequences\",\n oldValue: v1.rule.consequences,\n newValue: v2.rule.consequences,\n });\n }\n\n if (JSON.stringify(v1.rule.tags) !== JSON.stringify(v2.rule.tags)) {\n differences.push({\n field: \"tags\",\n oldValue: v1.rule.tags,\n newValue: v2.rule.tags,\n });\n }\n\n return { version1: v1, version2: v2, differences };\n};\n\nexport const getVersionsByDateRange = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n store: VersionStore<TContext, TConsequences>,\n startDate: Date,\n endDate: Date,\n): ReadonlyArray<RuleVersion<TContext, TConsequences>> => {\n const versions: RuleVersion<TContext, TConsequences>[] = [];\n\n for (const history of store.histories.values()) {\n for (const version of history.versions) {\n if (version.createdAt >= startDate && version.createdAt <= endDate) {\n versions.push(version);\n }\n }\n }\n\n return versions.sort(\n (a, b) => a.createdAt.getTime() - b.createdAt.getTime(),\n );\n};\n\nexport const getVersionsByChangeType = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n store: VersionStore<TContext, TConsequences>,\n changeType: RuleVersion<TContext, TConsequences>[\"changeType\"],\n): ReadonlyArray<RuleVersion<TContext, TConsequences>> => {\n const versions: RuleVersion<TContext, TConsequences>[] = [];\n\n for (const history of store.histories.values()) {\n for (const version of history.versions) {\n if (version.changeType === changeType) {\n versions.push(version);\n }\n }\n }\n\n return versions;\n};\n\nexport const pruneOldVersions = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n store: VersionStore<TContext, TConsequences>,\n keepCount: number,\n): VersionStore<TContext, TConsequences> => {\n const histories = new Map<string, VersionHistory<TContext, TConsequences>>();\n\n for (const [ruleId, history] of store.histories) {\n const prunedVersions =\n history.versions.length > keepCount\n ? history.versions.slice(-keepCount)\n : history.versions;\n\n histories.set(ruleId, {\n ruleId,\n currentVersion: history.currentVersion,\n versions: prunedVersions,\n });\n }\n\n return { histories };\n};\n\nexport const formatVersionHistory = <\n TContext = unknown,\n TConsequences extends ConsequenceDefinitions = DefaultConsequences,\n>(\n history: VersionHistory<TContext, TConsequences>,\n): string => {\n const lines: string[] = [\n `=== Version History for Rule: ${history.ruleId} ===`,\n `Current Version: ${history.currentVersion}`,\n `Total Versions: ${history.versions.length}`,\n \"\",\n ];\n\n for (const version of history.versions) {\n lines.push(\n `v${version.version} - ${version.changeType} (${version.createdAt.toISOString()})`,\n );\n if (version.createdBy) {\n lines.push(` By: ${version.createdBy}`);\n }\n if (version.comment) {\n lines.push(` Comment: ${version.comment}`);\n }\n }\n\n return lines.join(\"\\n\");\n};\n"
33
+ ],
34
+ "mappings": ";;AAkBA;AAAA;AAAA,sBAEG;AAAA,qBACA;AAAA;AAAA;;;ACrBH;AAAA,sBAGG;AAAA;;;ACHH;AAAA;AAAA;AAUO,IAAM,yBAAyB,CACnC,cACe;AAAA,EACf,MAAM,SAAS,IAAI;AAAA,EAEnB,MAAM,WAAW,CAAC,MAAkC;AAAA,IACjD,IAAI,iBAAiB,CAAC,GAAG;AAAA,MACtB,WAAW,SAAS,EAAE,YAAY;AAAA,QAC/B,SAAS,KAAmC;AAAA,MAC/C;AAAA,IACH,EAAO;AAAA,MACJ,OAAO,IAAI,EAAE,KAAK;AAAA;AAAA;AAAA,EAIxB,SAAS,SAAS;AAAA,EAClB,OAAO;AAAA;AA+BH,IAAM,kBAAkB,CAC5B,cACU;AAAA,EACV,IAAI,iBAAiB,SAAS,GAAG;AAAA,IAC9B,OAAO,UAAU,WAAW,OACzB,CAAC,KAAa,MAAkC,MAAM,gBAAgB,CAA+B,GACrG,CACH;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAMH,IAAM,oBAAoB,CAC9B,WACA,eAAe,MACL;AAAA,EACV,IAAI,iBAAiB,SAAS,GAAG;AAAA,IAC9B,IAAI,UAAU,WAAW,WAAW;AAAA,MAAG,OAAO;AAAA,IAC9C,OAAO,KAAK,IACT,GAAG,UAAU,WAAW,IAAI,CAAC,MAC1B,kBACG,GACA,eAAe,CAClB,CACH,CACH;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAMH,IAAM,uBAAuB,CACjC,cACU;AAAA,EACV,IAAI,iBAAiB,SAAS,GAAG;AAAA,IAC9B,OACG,IACA,UAAU,WAAW,OAClB,CAAC,KAAa,MACX,MAAM,qBAAqB,CAA+B,GAC7D,CACH;AAAA,EAEN;AAAA,EACA,OAAO;AAAA;;;ADnCV,IAAM,mBAAmB,CACtB,cACe;AAAA,EACf,MAAM,YAAY,IAAI;AAAA,EAEtB,MAAM,WAAW,CAAC,MAAkC;AAAA,IACjD,IAAI,kBAAiB,CAAC,GAAG;AAAA,MACtB,UAAU,IAAI,EAAE,QAAQ;AAAA,MACxB,WAAW,SAAS,EAAE,YAAY;AAAA,QAC/B,SAAS,KAAmC;AAAA,MAC/C;AAAA,IACH,EAAO;AAAA,MACJ,UAAU,IAAI,EAAE,QAAQ;AAAA;AAAA;AAAA,EAI9B,SAAS,SAAS;AAAA,EAClB,OAAO;AAAA;AAGV,IAAM,2BAA2B,CAC9B,iBACA,UACA,YACA,iBACU;AAAA,EACV,OACG,kBAAkB,IAAI,WAAW,IAAI,aAAa,MAAM,eAAe;AAAA;AAItE,IAAM,wBAAwB,CAIlC,SACkB;AAAA,EAClB,MAAM,kBAAkB,gBAAgB,KAAK,UAAU;AAAA,EACvD,MAAM,WAAW,kBAAkB,KAAK,UAAU;AAAA,EAClD,MAAM,aAAa,qBAAqB,KAAK,UAAU;AAAA,EACvD,MAAM,eAAe,uBAAuB,KAAK,UAAU,EAAE;AAAA,EAC7D,MAAM,kBAAkB,iBAAiB,KAAK,UAAU,EAAE;AAAA,EAC1D,MAAM,mBAAmB,KAAK,aAAa;AAAA,EAE3C,MAAM,kBAAkB,yBACrB,iBACA,UACA,YACA,YACH;AAAA,EAEA,OAAO;AAAA,IACJ,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACH;AAAA;AAGI,IAAM,iBAAiB,CAI3B,UACmB;AAAA,EACnB,MAAM,eAAe,MAAM,IAAI,qBAAqB;AAAA,EAEpD,MAAM,YAAY,IAAI;AAAA,EACtB,MAAM,eAAe,IAAI;AAAA,EACzB,MAAM,sBAAsB,IAAI;AAAA,EAChC,MAAM,gBAAgB,IAAI;AAAA,EAC1B,MAAM,UAAU,IAAI;AAAA,EAEpB,IAAI,kBAAkB;AAAA,EACtB,IAAI,oBAAoB;AAAA,EACxB,IAAI,cAAc,OAAO;AAAA,EACzB,IAAI,cAAc,OAAO;AAAA,EACzB,IAAI,eAAe;AAAA,EAEnB,WAAW,QAAQ,OAAO;AAAA,IACvB,mBAAmB,gBAAgB,KAAK,UAAU;AAAA,IAClD,qBAAqB,KAAK,aAAa;AAAA,IAEvC,IAAI,KAAK,WAAW;AAAA,MAAa,cAAc,KAAK;AAAA,IACpD,IAAI,KAAK,WAAW;AAAA,MAAa,cAAc,KAAK;AAAA,IAEpD,IAAI,KAAK;AAAA,MAAS;AAAA,IAElB,WAAW,SAAS,uBAAuB,KAAK,UAAU,GAAG;AAAA,MAC1D,UAAU,IAAI,KAAK;AAAA,IACtB;AAAA,IAEA,WAAW,YAAY,iBAAiB,KAAK,UAAU,GAAG;AAAA,MACvD,aAAa,IAAI,QAAQ;AAAA,IAC5B;AAAA,IAEA,WAAW,eAAe,KAAK,cAAc;AAAA,MAC1C,oBAAoB,IAAI,YAAY,IAAc;AAAA,IACrD;AAAA,IAEA,IAAI,KAAK;AAAA,MAAU,cAAc,IAAI,KAAK,QAAQ;AAAA,IAClD,WAAW,OAAO,KAAK;AAAA,MAAM,QAAQ,IAAI,GAAG;AAAA,EAC/C;AAAA,EAEA,MAAM,oBACH,aAAa,SAAS,IACjB,aAAa,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,iBAAiB,CAAC,IAC1D,aAAa,SACb;AAAA,EAER,MAAM,yBAAyB;AAAA,IAC5B,KAAK,aAAa,OAAO,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE;AAAA,IACvD,QAAQ,aAAa,OAClB,CAAC,MAAM,EAAE,mBAAmB,KAAK,EAAE,kBAAkB,EACxD,EAAE;AAAA,IACF,MAAM,aAAa,OAAO,CAAC,MAAM,EAAE,mBAAmB,EAAE,EAAE;AAAA,EAC7D;AAAA,EAEA,OAAO;AAAA,IACJ,WAAW,MAAM;AAAA,IACjB;AAAA,IACA,eAAe,MAAM,SAAS;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,cAAc,CAAC,GAAG,SAAS,EAAE,KAAK;AAAA,IAClC,iBAAiB,CAAC,GAAG,YAAY,EAAE,KAAK;AAAA,IACxC,wBAAwB,CAAC,GAAG,mBAAmB,EAAE,KAAK;AAAA,IACtD,kBAAkB,CAAC,GAAG,aAAa,EAAE,KAAK;AAAA,IAC1C,YAAY,CAAC,GAAG,OAAO,EAAE,KAAK;AAAA,IAC9B,eAAe;AAAA,MACZ,KAAK,gBAAgB,OAAO,oBAAoB,IAAI;AAAA,MACpD,KAAK,gBAAgB,OAAO,oBAAoB,IAAI;AAAA,IACvD;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,EACrB;AAAA;AAGI,IAAM,oBAAoB,CAI9B,UAC6B;AAAA,EAC7B,MAAM,WAAW,IAAI;AAAA,EASrB,WAAW,QAAQ,OAAO;AAAA,IACvB,MAAM,WAAW,CAAC,MAAkC;AAAA,MACjD,IAAI,kBAAiB,CAAC,GAAG;AAAA,QACtB,WAAW,SAAS,EAAE,YAAY;AAAA,UAC/B,SAAS,KAAmC;AAAA,QAC/C;AAAA,MACH,EAAO;AAAA,QACJ,MAAM,WAAW,SAAS,IAAI,EAAE,KAAK,KAAK;AAAA,UACvC,OAAO,IAAI;AAAA,UACX,WAAW,IAAI;AAAA,UACf,OAAO,CAAC;AAAA,QACX;AAAA,QACA,SAAS,MAAM,IAAI,EAAE,IAAI;AAAA,QACzB,SAAS,UAAU,IAAI,EAAE,QAAQ;AAAA,QACjC,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,GAAG;AAAA,UAChD,SAAS,MAAM,KAAK,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,KAAK,CAAC;AAAA,QACvD;AAAA,QACA,SAAS,IAAI,EAAE,OAAO,QAAQ;AAAA;AAAA;AAAA,IAIpC,SAAS,KAAK,UAAU;AAAA,EAC3B;AAAA,EAEA,OAAO,CAAC,GAAG,SAAS,QAAQ,CAAC,EACzB,IAAI,EAAE,OAAO,WAAW;AAAA,IACtB;AAAA,IACA,OAAO,KAAK,MAAM;AAAA,IAClB,OAAO,CAAC,GAAG,KAAK,KAAK,EAAE,KAAK;AAAA,IAC5B,WAAW,CAAC,GAAG,KAAK,SAAS,EAAE,KAAK;AAAA,IACpC,OAAO,KAAK;AAAA,EACf,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA;AAGhC,IAAM,uBAAuB,CAIjC,UACgC;AAAA,EAChC,MAAM,cAAc,IAAI;AAAA,EAKxB,WAAW,QAAQ,OAAO;AAAA,IACvB,MAAM,WAAW,CAAC,MAAkC;AAAA,MACjD,IAAI,kBAAiB,CAAC,GAAG;AAAA,QACtB,WAAW,SAAS,EAAE,YAAY;AAAA,UAC/B,SAAS,KAAmC;AAAA,QAC/C;AAAA,MACH,EAAO;AAAA,QACJ,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE;AAAA,QAC3B,MAAM,WAAW,YAAY,IAAI,GAAG,KAAK;AAAA,UACtC,MAAM,EAAE;AAAA,UACR,OAAO,CAAC;AAAA,QACX;AAAA,QACA,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,GAAG;AAAA,UAChD,SAAS,MAAM,KAAK,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,KAAK,CAAC;AAAA,QACvD;AAAA,QACA,YAAY,IAAI,KAAK,QAAQ;AAAA;AAAA;AAAA,IAInC,SAAS,KAAK,UAAU;AAAA,EAC3B;AAAA,EAEA,OAAO,CAAC,GAAG,YAAY,QAAQ,CAAC,EAC5B,IAAI,EAAE,KAAK,UAAU;AAAA,IACnB,MAAM,QAAQ,IAAI,MAAM,GAAG;AAAA,IAC3B,OAAO;AAAA,MACJ,UAAU,MAAM,MAAM;AAAA,MACtB,MAAM,KAAK;AAAA,MACX,OAAO,KAAK,MAAM;AAAA,MAClB,OAAO,KAAK;AAAA,IACf;AAAA,GACF,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA;AAGhC,IAAM,0BAA0B,CAIpC,UACmC;AAAA,EACnC,MAAM,iBAAiB,IAAI;AAAA,EAK3B,WAAW,QAAQ,OAAO;AAAA,IACvB,WAAW,eAAe,KAAK,cAAc;AAAA,MAC1C,MAAM,OAAO,YAAY;AAAA,MACzB,MAAM,WAAW,eAAe,IAAI,IAAI,KAAK,CAAC;AAAA,MAC9C,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,GAAG;AAAA,QAC1C,SAAS,KAAK,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,KAAK,CAAC;AAAA,MACjD;AAAA,MACA,eAAe,IAAI,MAAM,QAAQ;AAAA,IACpC;AAAA,EACH;AAAA,EAEA,OAAO,CAAC,GAAG,eAAe,QAAQ,CAAC,EAC/B,IAAI,EAAE,MAAM,aAAY;AAAA,IACtB;AAAA,IACA,OAAO,OAAM;AAAA,IACb;AAAA,EACH,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA;AAGhC,IAAM,uBAAuB,CAIjC,OACA,QAAQ,OACyB;AAAA,EACjC,OAAO,MACH,IAAI,qBAAqB,EACzB,KAAK,CAAC,GAAG,MAAM,EAAE,kBAAkB,EAAE,eAAe,EACpD,MAAM,GAAG,KAAK;AAAA;AAGd,IAAM,sBAAsB,CAIhC,OACA,QAAQ,OACqB;AAAA,EAC7B,OAAO,CAAC,GAAG,kBAAkB,KAAK,CAAC,EAC/B,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,KAAK;AAAA;AAGd,IAAM,wBAAwB,CAAC,aAAsC;AAAA,EACzE,MAAM,QAAkB;AAAA,IACrB;AAAA,IACA;AAAA,IACA,UAAU,SAAS,cAAc,SAAS,yBAAyB,SAAS;AAAA,IAC5E,qBAAqB,SAAS;AAAA,IAC9B,uBAAuB,SAAS;AAAA,IAChC;AAAA,IACA,kBAAkB,SAAS,aAAa;AAAA,IACxC,KAAK,SAAS,aAAa,KAAK,IAAI,KAAK;AAAA,IACzC;AAAA,IACA,qBAAqB,SAAS,gBAAgB;AAAA,IAC9C,KAAK,SAAS,gBAAgB,KAAK,IAAI,KAAK;AAAA,IAC5C;AAAA,IACA,sBAAsB,SAAS,uBAAuB;AAAA,IACtD,KAAK,SAAS,uBAAuB,KAAK,IAAI,KAAK;AAAA,IACnD;AAAA,IACA,eAAe,SAAS,iBAAiB;AAAA,IACzC,KAAK,SAAS,iBAAiB,KAAK,IAAI,KAAK;AAAA,IAC7C;AAAA,IACA,SAAS,SAAS,WAAW;AAAA,IAC7B,KAAK,SAAS,WAAW,KAAK,IAAI,KAAK;AAAA,IACvC;AAAA,IACA,mBAAmB,SAAS,cAAc,SAAS,SAAS,cAAc;AAAA,IAC1E;AAAA,IACA,uBAAuB,SAAS,kBAAkB,QAAQ,CAAC;AAAA,IAC3D;AAAA,IACA,gBAAgB,SAAS,uBAAuB;AAAA,IAChD,oBAAoB,SAAS,uBAAuB;AAAA,IACpD,kBAAkB,SAAS,uBAAuB;AAAA,EACrD;AAAA,EAEA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;;AE9TzB,IAAI,qBAAqB;AACzB,IAAI,iBAAiB;AAErB,IAAM,sBAAsB,MAAc,QAAQ,EAAE;AACpD,IAAM,kBAAkB,MAAc,SAAS,EAAE;AAE1C,IAAM,kBAAkB,MAAY;AAAA,EACxC,qBAAqB;AAAA,EACrB,iBAAiB;AAAA;AAGpB,IAAM,yBAAyB,CAC5B,QAA+B,EAAE,YAAY,CAAC,EAAE,GAChD,WAAyB,UACL;AAAA,EACpB,MAAM,eAAe,CAClB,cACoB;AAAA,IACpB,OAAO,uBACJ,EAAE,YAAY,CAAC,GAAG,MAAM,YAAY,SAAS,EAAE,GAC/C,QACH;AAAA;AAAA,EAGH,OAAO;AAAA,IACJ,QAAQ,CAAC,OAAO,IAAI,UACjB,aAAa;AAAA,MACV,IAAI,oBAAoB;AAAA,MACxB,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACH,CAAC;AAAA,IAEJ,QAAQ,CAAC,OAAO,IAAI,UACjB,aAAa;AAAA,MACV,IAAI,oBAAoB;AAAA,MACxB,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACH,CAAc;AAAA,IAEjB,SAAS,CAAC,OAAO,IAAI,UAClB,aAAa;AAAA,MACV,IAAI,oBAAoB;AAAA,MACxB,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACH,CAAC;AAAA,IAEJ,MAAM,CAAC,OAAO,IAAI,UAAU;AAAA,MACzB,MAAM,kBACH,iBAAiB,OACZ,MAAM,YAAY,IAClB,MAAM,QAAQ,KAAK,IACjB,MAAM,IAAI,CAAC,MAAO,aAAa,OAAO,EAAE,YAAY,IAAI,CAAE,IAC1D;AAAA,MAEV,OAAO,aAAa;AAAA,QACjB,IAAI,oBAAoB;AAAA,QACxB,MAAM;AAAA,QACN;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,MACV,CAAc;AAAA;AAAA,IAGjB,OAAO,CAAC,OAAO,IAAI,UAChB,aAAa;AAAA,MACV,IAAI,oBAAoB;AAAA,MACxB,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACH,CAAc;AAAA,IAEjB,KAAK,CAAC,OAAO,IAAI,aACd,aAAa;AAAA,MACV,IAAI,oBAAoB;AAAA,MACxB,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACH,CAAc;AAAA,IAEjB,KAAK,CAAC,cAAc;AAAA,MACjB,MAAM,gBAAgB,uBACnB,EAAE,YAAY,CAAC,EAAE,GACjB,KACH;AAAA,MACA,MAAM,SAAS,UAAU,aAAa;AAAA,MACtC,OAAO,aAAa,OAAO,MAAM,CAAC;AAAA;AAAA,IAGrC,IAAI,CAAC,cAAc;AAAA,MAChB,MAAM,gBAAgB,uBAAuB,EAAE,YAAY,CAAC,EAAE,GAAG,IAAI;AAAA,MACrE,MAAM,SAAS,UAAU,aAAa;AAAA,MACtC,OAAO,aAAa,OAAO,MAAM,CAAC;AAAA;AAAA,IAGrC,KAAK,CAAC,cAAc,aAAa,SAAS;AAAA,IAE1C,OAAO,OAAuB;AAAA,MAC3B,IAAI,gBAAgB;AAAA,MACpB;AAAA,MACA,YAAY,MAAM;AAAA,IACrB;AAAA,IAEA,eAAe,MAAM,MAAM;AAAA,EAC9B;AAAA;AAGI,IAAM,aAAa,MACvB,uBAAuB,EAAE,YAAY,CAAC,EAAE,GAAG,KAAK;AAE5C,IAAM,MAAM,CAChB,cACkB;AAAA,EAClB,MAAM,UAAU,uBAAuB,EAAE,YAAY,CAAC,EAAE,GAAG,KAAK;AAAA,EAChE,OAAO,UAAU,OAAO,EAAE,MAAM;AAAA;AAG5B,IAAM,KAAK,CACf,cACkB;AAAA,EAClB,MAAM,UAAU,uBAAuB,EAAE,YAAY,CAAC,EAAE,GAAG,IAAI;AAAA,EAC/D,OAAO,UAAU,OAAO,EAAE,MAAM;AAAA;AAG5B,IAAM,MAAM,IACb,WACgB;AAAA,EACnB,IAAI,gBAAgB;AAAA,EACpB,UAAU;AAAA,EACV,YAAY;AACf;AAEO,IAAM,MAAM,IACb,WACgB;AAAA,EACnB,IAAI,gBAAgB;AAAA,EACpB,UAAU;AAAA,EACV,YAAY;AACf;AAEO,IAAM,MAAM,CAChB,OACA,UACA,WACc;AAAA,EACd,IAAI,oBAAoB;AAAA,EACxB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACH;AAEO,IAAM,MAAM,CAChB,OACA,UAeA,WAEC;AAAA,EACE,IAAI,oBAAoB;AAAA,EACxB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACH;AAEI,IAAM,OAAO,CACjB,OACA,UACA,WACc;AAAA,EACd,IAAI,oBAAoB;AAAA,EACxB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACH;AAEO,IAAM,OAAO,CACjB,OACA,UACA,UACa;AAAA,EACb,MAAM,kBACH,iBAAiB,OACZ,MAAM,YAAY,IAClB,MAAM,QAAQ,KAAK,IACjB,MAAM,IAAI,CAAC,MAAO,aAAa,OAAO,EAAE,YAAY,IAAI,CAAE,IAC1D;AAAA,EAEV,OAAO;AAAA,IACJ,IAAI,oBAAoB;AAAA,IACxB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACV;AAAA;AAGI,IAAM,MAAM,CAChB,OACA,UAUA,WAEC;AAAA,EACE,IAAI,oBAAoB;AAAA,EACxB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACH;;AC9OH,IAAM,oBAAoB,CAIvB,QAAmD;AAAA,EAChD,cAAc,CAAC;AAAA,EACf,UAAU;AAAA,EACV,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM,CAAC;AACV,MACwC;AAAA,EACxC,MAAM,SAAS,CACZ,YACwC;AAAA,IACxC,OAAO,kBAAkB,KAAK,UAAU,QAAQ,CAAC;AAAA;AAAA,EAGpD,OAAO;AAAA,IACJ,IAAI,CAAC,OAAO,OAAO,EAAE,GAAG,CAAC;AAAA,IAEzB,OAAO,CAAC,SAAS,OAAO,EAAE,KAAK,CAAC;AAAA,IAEhC,aAAa,CAAC,gBAAgB,OAAO,EAAE,YAAY,CAAC;AAAA,IAEpD,MAAM,CAAC,wBAAwB;AAAA,MAC5B,IAAI,OAAO,wBAAwB,YAAY;AAAA,QAC5C,MAAM,UAAU,WAAiB;AAAA,QACjC,MAAM,SAAS,oBAAoB,OAAO;AAAA,QAC1C,OAAO,OAAO,EAAE,YAAY,OAAO,MAAM,EAAE,CAAC;AAAA,MAC/C;AAAA,MACA,OAAO,OAAO,EAAE,YAAY,oBAAoB,CAAC;AAAA;AAAA,IAIpD,MAAM,CAAC,MAAM,YAAY;AAAA,MACtB,OAAO,OAAO;AAAA,QACX,cAAc;AAAA,UACX,GAAG,MAAM;AAAA,UACT,EAAE,MAAM,QAAQ;AAAA,QAInB;AAAA,MACH,CAAC;AAAA;AAAA,IAGJ,cAAc,CAAC,aAAa,OAAO,EAAE,SAAS,CAAC;AAAA,IAE/C,SAAS,CAAC,UAAU,SAAS,OAAO,EAAE,QAAQ,CAAC;AAAA,IAE/C,UAAU,MAAM,OAAO,EAAE,SAAS,MAAM,CAAC;AAAA,IAEzC,aAAa,CAAC,OAAO,SAAS,OAAO,EAAE,aAAa,KAAK,CAAC;AAAA,IAE1D,QAAQ,IAAI,SAAS,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC;AAAA,IAE9D,YAAY,CAAC,aAAa,OAAO,EAAE,SAAS,CAAC;AAAA,IAE7C,cAAc,CAAC,aACZ,OAAO,EAAE,UAAU,KAAK,MAAM,aAAa,SAAS,EAAE,CAAC;AAAA,IAE1D,OAAO,MAA0C;AAAA,MAC9C,IAAI,CAAC,MAAM,MAAM;AAAA,QACd,MAAM,IAAI,MAAM,uBAAuB;AAAA,MAC1C;AAAA,MACA,IAAI,CAAC,MAAM,YAAY;AAAA,QACpB,MAAM,IAAI,MAAM,2BAA2B;AAAA,MAC9C;AAAA,MACA,IAAI,MAAM,aAAa,WAAW,GAAG;AAAA,QAClC,MAAM,IAAI,MAAM,yCAAyC;AAAA,MAC5D;AAAA,MAEA,OAAO;AAAA,QACJ,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,YAAY,MAAM;AAAA,QAClB,cAAc,MAAM;AAAA,QACpB,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM;AAAA,QACf,aAAa,MAAM;AAAA,QACnB,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,MACnB;AAAA;AAAA,IAGH,UAAU,MAAM;AAAA,EACnB;AAAA;AAGI,IAAM,OAAO,MAGyB;AAAA,EAC1C,OAAO,kBAA2C;AAAA;AAG9C,IAAM,aAAa,CAIvB,cAGsC;AAAA,EACtC,MAAM,UAAU,kBAA2C;AAAA,EAC3D,OAAO,UAAU,OAAO,EAAE,MAAM;AAAA;;ACvK5B,IAAM,cAAc,CAAI,YAAoC;AAAA,EAChE,MAAM,UAAU,IAAI;AAAA,EACpB,IAAI,OAAO;AAAA,EACX,IAAI,SAAS;AAAA,EACb,IAAI,YAAY;AAAA,EAEhB,MAAM,YAAY,CAAC,UAAkC;AAAA,IAClD,OAAO,KAAK,IAAI,IAAI,MAAM;AAAA;AAAA,EAG7B,MAAM,eAAe,MAAY;AAAA,IAC9B,MAAM,MAAM,KAAK,IAAI;AAAA,IACrB,YAAY,KAAK,UAAU,SAAS;AAAA,MACjC,IAAI,MAAM,MAAM,WAAW;AAAA,QACxB,QAAQ,OAAO,GAAG;AAAA,QAClB;AAAA,QACA,QAAQ,UAAU,KAAK,MAAM,KAAK;AAAA,MACrC;AAAA,IACH;AAAA;AAAA,EAGH,MAAM,cAAc,MAAY;AAAA,IAC7B,IAAI,QAAQ,SAAS;AAAA,MAAG;AAAA,IAGxB,MAAM,YAAY,QAAQ,KAAK,EAAE,KAAK,EAAE;AAAA,IACxC,IAAI,cAAc,WAAW;AAAA,MAC1B,MAAM,QAAQ,QAAQ,IAAI,SAAS;AAAA,MACnC,QAAQ,OAAO,SAAS;AAAA,MACxB;AAAA,MACA,IAAI,OAAO;AAAA,QACR,QAAQ,UAAU,WAAW,MAAM,KAAK;AAAA,MAC3C;AAAA,IACH;AAAA;AAAA,EAGH,MAAM,MAAM,CAAC,QAA+B;AAAA,IACzC,MAAM,QAAQ,QAAQ,IAAI,GAAG;AAAA,IAE7B,IAAI,CAAC,OAAO;AAAA,MACT;AAAA,MACA;AAAA,IACH;AAAA,IAEA,IAAI,UAAU,KAAK,GAAG;AAAA,MACnB,QAAQ,OAAO,GAAG;AAAA,MAClB;AAAA,MACA,QAAQ,UAAU,KAAK,MAAM,KAAK;AAAA,MAClC;AAAA,MACA;AAAA,IACH;AAAA,IAEA;AAAA,IACA,OAAO,MAAM;AAAA;AAAA,EAGhB,MAAM,MAAM,CAAC,KAAa,UAAmB;AAAA,IAC1C,aAAa;AAAA,IAEb,OAAO,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC,YAAY;AAAA,IACf;AAAA,IAEA,MAAM,MAAM,KAAK,IAAI;AAAA,IACrB,QAAQ,IAAI,KAAK;AAAA,MACd;AAAA,MACA,WAAW,MAAM,QAAQ;AAAA,MACzB,WAAW;AAAA,IACd,CAAC;AAAA;AAAA,EAGJ,MAAM,MAAM,CAAC,QAAyB;AAAA,IACnC,MAAM,QAAQ,QAAQ,IAAI,GAAG;AAAA,IAC7B,IAAI,CAAC;AAAA,MAAO,OAAO;AAAA,IACnB,IAAI,UAAU,KAAK,GAAG;AAAA,MACnB,QAAQ,OAAO,GAAG;AAAA,MAClB;AAAA,MACA,QAAQ,UAAU,KAAK,MAAM,KAAK;AAAA,MAClC,OAAO;AAAA,IACV;AAAA,IACA,OAAO;AAAA;AAAA,EAGV,MAAM,cAAc,CAAC,QAAyB;AAAA,IAC3C,OAAO,QAAQ,OAAO,GAAG;AAAA;AAAA,EAG5B,MAAM,QAAQ,MAAY;AAAA,IACvB,QAAQ,MAAM;AAAA;AAAA,EAGjB,MAAM,WAAW,MAAkB;AAAA,IAChC,MAAM,gBAAgB,OAAO;AAAA,IAC7B,OAAO;AAAA,MACJ,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,MACA,SAAS,gBAAgB,IAAI,OAAO,gBAAgB;AAAA,MACpD;AAAA,IACH;AAAA;AAAA,EAGH,OAAO;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACH;AAAA;;AClII,IAAM,kBAAkB,MAAmB;AAAA,EAC/C,OAAO;AAAA,IACJ,KAAK,MAAG;AAAA,MAAG;AAAA;AAAA,IACX,KAAK,MAAM;AAAA,IACX,KAAK,MAAM;AAAA,IACX,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,IACb,UAAU,OAAmB;AAAA,MAC1B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,WAAW;AAAA,IACd;AAAA,EACH;AAAA;;ACbI,IAAM,cAAc,CAAI,OAAiC;AAAA,EAC7D,MAAM,QAAQ,YAAY,IAAI;AAAA,EAC9B,MAAM,SAAS,GAAG;AAAA,EAClB,MAAM,aAAa,YAAY,IAAI,IAAI;AAAA,EACvC,OAAO,EAAE,QAAQ,WAAW;AAAA;AAGxB,IAAM,mBAAmB,OAC7B,OAC4B;AAAA,EAC5B,MAAM,QAAQ,YAAY,IAAI;AAAA,EAC9B,MAAM,SAAS,MAAM,GAAG;AAAA,EACxB,MAAM,aAAa,YAAY,IAAI,IAAI;AAAA,EACvC,OAAO,EAAE,QAAQ,WAAW;AAAA;AAGxB,IAAM,cAAc,CACxB,SACA,WACA,eAAe,0BACD;AAAA,EACd,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACrC,MAAM,QAAQ,WAAW,MAAM;AAAA,MAC5B,OAAO,IAAI,MAAM,YAAY,CAAC;AAAA,OAC9B,SAAS;AAAA,IAEZ,QACI,KAAK,CAAC,WAAW;AAAA,MACf,aAAa,KAAK;AAAA,MAClB,QAAQ,MAAM;AAAA,KAChB,EACA,MAAM,CAAC,UAAU;AAAA,MACf,aAAa,KAAK;AAAA,MAClB,OAAO,KAAK;AAAA,KACd;AAAA,GACN;AAAA;;;ACnBG,IAAM,eAAe,CAIzB,OACA,SACA,WACA,UAA+B,CAAC,MACiB;AAAA,EACjD,IAAI,QAAQ,gBAAgB,CAAC,MAAK,SAAS;AAAA,IACxC,OAAO;AAAA,MACJ,QAAQ,MAAK;AAAA,MACb,UAAU,MAAK;AAAA,MACf,SAAS;AAAA,MACT,iBAAiB,uBAAuB,MAAK,WAAW,EAAE;AAAA,MAC1D,cAAc,CAAC;AAAA,MACf,kBAAkB;AAAA,MAClB,SAAS;AAAA,MACT,YAAY;AAAA,IACf;AAAA,EACH;AAAA,EAEA,QAAQ,QAAQ,iBAAiB,eAAe,YAAY,MAAM;AAAA,IAC/D,IAAI;AAAA,MACD,MAAM,cAAc;AAAA,QACjB,MAAM,QAAQ;AAAA,QACd,UAAU,QAAQ;AAAA,MACrB;AAAA,MAEA,OAAO,UAAU,uBAAuB,MAAK,YAAY,WAAW;AAAA,MACrE,OAAO,OAAO;AAAA,MACb,OAAO;AAAA,QACJ;AAAA,QACA,QAAQ,uBAAuB,MAAK,WAAW,EAAE;AAAA,MACpD;AAAA;AAAA,GAEL;AAAA,EAED,IAAI,WAAW,iBAAiB;AAAA,IAC7B,OAAO;AAAA,MACJ,QAAQ,MAAK;AAAA,MACb,UAAU,MAAK;AAAA,MACf,SAAS;AAAA,MACT,iBAAiB,gBAAgB;AAAA,MACjC,cAAc,CAAC;AAAA,MACf,kBAAkB;AAAA,MAClB,SAAS;AAAA,MACT,OACG,gBAAgB,iBAAiB,QAC5B,gBAAgB,QAChB,IAAI,MAAM,OAAO,gBAAgB,KAAK,CAAC;AAAA,IAClD;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,gBAAgB;AAAA,EAEhC,MAAM,eAAuD,UACxD,MAAK,aAAa,IAAI,CAAC,iBAAiB;AAAA,IACrC,MAAM,YAAY;AAAA,IAClB,SAAS,YAAY;AAAA,IACrB,QAAQ,MAAK;AAAA,IACb,UAAU,MAAK;AAAA,IACf,UAAU,MAAK;AAAA,EAClB,EAAE,IACF,CAAC;AAAA,EAEN,OAAO;AAAA,IACJ,QAAQ,MAAK;AAAA,IACb,UAAU,MAAK;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB,SAAS;AAAA,EACZ;AAAA;AAGH,IAAM,yBAAyB,CAAC,aAA4C;AAAA,EACzE;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS,CAAC;AACb;AAyBO,IAAM,gBAAgB,CAI1B,OACA,SACA,WACA,UAAyD,CAAC,MACV;AAAA,EAChD,MAAM,SAAyB;AAAA,IAC5B,oBAAoB,QAAQ,QAAQ,sBAAsB;AAAA,IAC1D,iBAAiB,QAAQ,QAAQ,mBAAmB;AAAA,IACpD,wBAAwB,QAAQ,QAAQ,0BAA0B;AAAA,EACrE;AAAA,EAEA,MAAM,UAA2D,CAAC;AAAA,EAClE,MAAM,eAAgD,CAAC;AAAA,EACvD,MAAM,eAAuD,CAAC;AAAA,EAC9D,IAAI,eAAe;AAAA,EACnB,IAAI;AAAA,EAEJ,WAAW,SAAQ,OAAO;AAAA,IACvB,MAAM,SAAS,aAAa,OAAM,SAAS,WAAW,EAAE,cAAc,KAAK,CAAC;AAAA,IAC5E,QAAQ,KAAK,MAAM;AAAA,IAEnB,QAAQ,kBAAkB,MAAM;AAAA,IAEhC,IAAI,OAAO,SAAS,CAAC,OAAO,iBAAiB;AAAA,MAC1C;AAAA,IACH;AAAA,IAEA,IAAI,OAAO,SAAS;AAAA,MACjB,aAAa,KAAK,KAAI;AAAA,MACtB,aAAa,KAAK,GAAG,OAAO,YAAY;AAAA,MAExC,IAAI,MAAK,aAAa;AAAA,QACnB,eAAe;AAAA,QACf,kBAAkB,MAAK;AAAA,QACvB;AAAA,MACH;AAAA,MAEA,IAAI,OAAO,uBAAuB,eAAe;AAAA,QAC9C,eAAe;AAAA,QACf,kBAAkB,MAAK;AAAA,QACvB;AAAA,MACH;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACH;AAAA;;ACjLI,IAAM,cAAc,CAIxB,YACE;AAAA,EACF,OAAO,CACJ,UACgD;AAAA,IAChD,OAAO,MAAM,OAAO,CAAC,UAAS;AAAA,MAC3B,IACG,QAAQ,YAAY,aACpB,MAAK,YAAY,QAAQ,SAC1B;AAAA,QACC,OAAO;AAAA,MACV;AAAA,MAEA,IAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAAA,QAC1C,MAAM,iBAAiB,QAAQ,KAAK,KAAK,CAAC,QACvC,MAAK,KAAK,SAAS,GAAG,CACzB;AAAA,QACA,IAAI,CAAC,gBAAgB;AAAA,UAClB,OAAO;AAAA,QACV;AAAA,MACH;AAAA,MAEA,IACG,QAAQ,aAAa,aACrB,MAAK,aAAa,QAAQ,UAC3B;AAAA,QACC,OAAO;AAAA,MACV;AAAA,MAEA,IAAI,QAAQ,OAAO,QAAQ,IAAI,SAAS,GAAG;AAAA,QACxC,IAAI,CAAC,QAAQ,IAAI,SAAS,MAAK,EAAE,GAAG;AAAA,UACjC,OAAO;AAAA,QACV;AAAA,MACH;AAAA,MAEA,OAAO;AAAA,KACT;AAAA;AAAA;AAIA,IAAM,kBAAkB,CAI5B,YACE;AAAA,EACF,OAAO,YAAqC,EAAE,QAAQ,CAAC;AAAA;AAGnD,IAAM,eAAe,CAIzB,SACE;AAAA,EACF,OAAO,YAAqC,EAAE,KAAK,CAAC;AAAA;AAGhD,IAAM,mBAAmB,CAI7B,aACE;AAAA,EACF,OAAO,YAAqC,EAAE,SAAS,CAAC;AAAA;AAGpD,IAAM,cAAc,CAIxB,QACE;AAAA,EACF,OAAO,YAAqC,EAAE,IAAI,CAAC;AAAA;;ACnE/C,IAAM,aAAa,CAIvB,UACE;AAAA,EACF,OAAO,CACJ,UACyC;AAAA,IACzC,MAAM,SAAS,IAAI;AAAA,IAKnB,WAAW,SAAQ,OAAO;AAAA,MACvB,IAAI;AAAA,MAEJ,QAAQ;AAAA,aACA;AAAA,UACF,MAAM,MAAK,YAAY;AAAA,UACvB;AAAA,aACE;AAAA,UACF,MAAM,MAAK;AAAA,UACX;AAAA,aACE;AAAA,UACF,MAAM,MAAK;AAAA,UACX;AAAA;AAAA,MAGN,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,MAC/B,IAAI,UAAU;AAAA,QACX,SAAS,KAAK,KAAI;AAAA,MACrB,EAAO;AAAA,QACJ,OAAO,IAAI,KAAK,CAAC,KAAI,CAAC;AAAA;AAAA,IAE5B;AAAA,IAEA,OAAO;AAAA;AAAA;AAIN,IAAM,kBAAkB,MAGxB;AAAA,EACJ,OAAO,WAAoC,UAAU;AAAA;AAGjD,IAAM,kBAAkB,MAGxB;AAAA,EACJ,OAAO,WAAoC,UAAU;AAAA;AAGjD,IAAM,iBAAiB,MAGvB;AAAA,EACJ,OAAO,WAAoC,SAAS;AAAA;AAGhD,IAAM,gBAAgB,CAK1B,UACE;AAAA,EACF,OAAO,CACJ,UACmE;AAAA,IACnE,MAAM,SAAS,IAAI;AAAA,IAEnB,WAAW,SAAQ,OAAO;AAAA,MACvB,MAAM,MAAM,MAAM,KAAI;AAAA,MACtB,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,MAC/B,IAAI,UAAU;AAAA,QACX,SAAS,KAAK,KAAI;AAAA,MACrB,EAAO;AAAA,QACJ,OAAO,IAAI,KAAK,CAAC,KAAI,CAAC;AAAA;AAAA,IAE5B;AAAA,IAEA,OAAO;AAAA;AAAA;;ACtFN,IAAM,YAAY,CAItB,YACE;AAAA,EACF,MAAM,oBACH,OAAO,YAAY,WACd,EAAE,OAAO,SAAS,WAAW,OAAO,IACpC;AAAA,EAER,QAAQ,OAAO,YAAY,WAAW;AAAA,EAEtC,OAAO,CACJ,UACgD;AAAA,IAChD,MAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM;AAAA,MACtC,IAAI,aAAa;AAAA,MAEjB,QAAQ;AAAA,aACA;AAAA,UACF,aAAa,EAAE,WAAW,EAAE;AAAA,UAC5B;AAAA,aACE;AAAA,UACF,aAAa,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,UACxC;AAAA,aACE;AAAA,UACF,aAAa,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ;AAAA,UACzD;AAAA,aACE;AAAA,UACF,aAAa,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ;AAAA,UACzD;AAAA;AAAA,MAGN,OAAO,cAAc,SAAS,CAAC,aAAa;AAAA,KAC9C;AAAA,IAED,OAAO;AAAA;AAAA;AAIN,IAAM,iBAAiB,CAI3B,YAA2B,WACzB;AAAA,EACF,OAAO,UAAmC,EAAE,OAAO,YAAY,UAAU,CAAC;AAAA;AAGtE,IAAM,aAAa,CAIvB,YAA2B,UACzB;AAAA,EACF,OAAO,UAAmC,EAAE,OAAO,QAAQ,UAAU,CAAC;AAAA;AAGlE,IAAM,kBAAkB,CAI5B,YAA2B,WACzB;AAAA,EACF,OAAO,UAAmC,EAAE,OAAO,aAAa,UAAU,CAAC;AAAA;AAGvE,IAAM,kBAAkB,CAI5B,YAA2B,WACzB;AAAA,EACF,OAAO,UAAmC,EAAE,OAAO,aAAa,UAAU,CAAC;AAAA;;ACrF9E;;;ACHA;AAmBO,IAAM,iBAAiB,EAAE,KAAK;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACH,CAAC;AAGM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACvC,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC9C,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,IAAI;AACpD,CAAC;AAGM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC5C,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACpC,CAAC;AAGM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC5C,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAClC,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE;AACtD,CAAC;AAoHM,IAAM,mBAAmB,CAAC,UAC9B,kBAAkB,MAAM,SAAS,CAAC,CAAC;AAE/B,IAAM,wBAAwB,CAClC,UACoB,uBAAuB,MAAM,SAAS,CAAC,CAAC;AAExD,IAAM,wBAAwB,CAClC,UACoB,uBAAuB,MAAM,SAAS,CAAC,CAAC;AAExD,IAAM,wBAAwB,MAClC,kBAAkB,MAAM,CAAC,CAAC;AAEtB,IAAM,6BAA6B,MACvC,uBAAuB,MAAM,CAAC,CAAC;AAE3B,IAAM,6BAA6B,MACvC,uBAAuB,MAAM,CAAC,CAAC;AAE3B,IAAM,qBAAqB,MAAgB;AAE3C,IAAM,+BAA+B,MACzC;;;ACvLH,cAAS;AAWF,IAAM,kBAAkB,GAAE,OAAO;AAAA,EACrC,aAAa,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC1C,SAAS,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACtC,QAAQ,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACrC,aAAa,GAAE,OAAO,EAAE,YAAY;AAAA,EACpC,WAAW,GAAE,OAAO,EAAE,YAAY;AAAA,EAClC,eAAe,GAAE,KAAK,EAAE,SAAS;AACpC,CAAC;AAGM,IAAM,mBAAmB,GAAE,OAAO;AAAA,EACtC,MAAM,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACnC,SAAS,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACnC,MAAM,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACnC,QAAQ,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACrC,SAAS,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAChC,WAAW,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAC3C,CAAC;AAGM,IAAM,oBAAoB,GAAE,OAAO;AAAA,EACvC,YAAY,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACzC,cAAc,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC3C,eAAe,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC5C,eAAe,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC5C,kBAAkB,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC/C,cAAc,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC3C,aAAa,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC1C,qBAAqB,GAAE,OAAO,EAAE,YAAY;AAAA,EAC5C,WAAW,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACxC,aAAa,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC1C,cAAc,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AACxC,CAAC;AAmDM,IAAM,qBAAqB,OAGmB;AAAA,EAClD,OAAO,IAAI;AAAA,EACX,UAAU,IAAI;AAAA,EACd,WAAW,CAAC;AACf;AAEO,IAAM,8BAA8B,OAA8B;AAAA,EACtE,WAAW,IAAI;AAAA,EACf,eAAe;AAClB;AAEO,IAAM,yBAAyB,OAAyB;AAAA,EAC5D,aAAa;AAAA,EACb,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,eAAe;AAClB;;;ACnHO,IAAM,cAAc,CAAC,YAA6B;AAAA,EACtD,MAAM,OAAM,KAAK,UAAU,SAAS,CAAC,GAAG,UAAU;AAAA,IAC/C,IAAI,iBAAiB,MAAM;AAAA,MACxB,OAAO,MAAM,YAAY;AAAA,IAC5B;AAAA,IACA,IAAI,iBAAiB,KAAK;AAAA,MACvB,OAAO,OAAO,YAAY,KAAK;AAAA,IAClC;AAAA,IACA,IAAI,iBAAiB,KAAK;AAAA,MACvB,OAAO,MAAM,KAAK,KAAK;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA,GACT;AAAA,EAED,IAAI,OAAO,QAAQ,eAAe,IAAI,MAAM;AAAA,IACzC,OAAO,IAAI,KAAK,IAAG,EAAE,SAAS,EAAE;AAAA,EACnC;AAAA,EAEA,IAAI,OAAO;AAAA,EACX,SAAS,IAAI,EAAG,IAAI,KAAI,QAAQ,KAAK;AAAA,IAClC,MAAM,OAAO,KAAI,WAAW,CAAC;AAAA,IAC7B,QAAQ,QAAQ,KAAK,OAAO;AAAA,IAC5B,OAAO,OAAO;AAAA,EACjB;AAAA,EACA,OAAO,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE;AAAA;AAG7B,IAAM,YAAY,CAAC,YAA2C;AAAA,EAClE,OAAO,YAAY,QAAQ,MAAM,EAAE,KAAK,CAAC;AAAA;;;AC5BrC,IAAM,aAAa,MAAc;AAAA,EACrC,IAAI,OAAO,WAAW,eAAe,OAAO,YAAY;AAAA,IACrD,OAAO,OAAO,WAAW;AAAA,EAC5B;AAAA,EACA,OAAO,GAAG,KAAK,IAAI,EAAE,SAAS,EAAE,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAAA;;;ACUlF,IAAM,UAAU,CAAC,UACd,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAE3D,IAAM,qBAAqB,OACxB,UACA,QACA,OACA,cACiB;AAAA,EACjB,IAAI;AAAA,IACD,MAAM,UAAU,QAAQ,QAAQ,OAAO,CAAC;AAAA,IACxC,IAAI,cAAc,aAAa,YAAY,GAAG;AAAA,MAC3C,MAAM,YACH,SACA,WACA,SAAS,6BAA6B,aACzC;AAAA,IACH,EAAO;AAAA,MACJ,MAAM;AAAA;AAAA,IAEV,OAAO,OAAO;AAAA,IACb,MAAM,cAAc,UAAU,QAAQ,KAAK,CAAC;AAAA;AAAA;AAI3C,IAAM,0BAA0B,OAIpC,OACA,SACA,OACA,cACiB;AAAA,EACjB,IAAI,CAAC,MAAM;AAAA,IAAkB;AAAA,EAC7B,MAAM,mBACH,oBACA,MAAM,MAAM,mBAAmB,SAAS,KAAK,GAC7C,OACA,SACH;AAAA;AAGI,IAAM,yBAAyB,OAInC,OACA,QACA,cACiB;AAAA,EACjB,IAAI,CAAC,MAAM;AAAA,IAAiB;AAAA,EAC5B,MAAM,mBACH,mBACA,MAAM,MAAM,kBAAkB,MAAM,GACpC,OACA,SACH;AAAA;AAGI,IAAM,8BAA8B,OAIxC,OACA,OACA,SACA,cACiB;AAAA,EACjB,IAAI,CAAC,MAAM;AAAA,IAAsB;AAAA,EACjC,MAAM,mBACH,wBACA,MAAM,MAAM,uBAAuB,OAAM,OAAO,GAChD,OACA,SACH;AAAA;AAGI,IAAM,6BAA6B,OAIvC,OACA,OACA,QACA,cACiB;AAAA,EACjB,IAAI,CAAC,MAAM;AAAA,IAAqB;AAAA,EAChC,MAAM,mBACH,uBACA,MAAM,MAAM,sBAAsB,OAAM,MAAM,GAC9C,OACA,SACH;AAAA;AAGI,IAAM,qBAAqB,OAI/B,OACA,OACA,SACA,cACiB;AAAA,EACjB,IAAI,CAAC,MAAM;AAAA,IAAa;AAAA,EACxB,MAAM,mBACH,eACA,MAAM,MAAM,cAAc,OAAM,OAAO,GACvC,OACA,SACH;AAAA;AAGI,IAAM,oBAAoB,OAI9B,OACA,OACA,QACA,cACiB;AAAA,EACjB,IAAI,CAAC,MAAM;AAAA,IAAY;AAAA,EACvB,MAAM,mBACH,cACA,MAAM,MAAM,aAAa,OAAM,MAAM,GACrC,OACA,SACH;AAAA;AAGI,IAAM,qBAAqB,OAI/B,OACA,OACA,WACA,cACiB;AAAA,EACjB,IAAI,CAAC,MAAM;AAAA,IAAa;AAAA,EACxB,MAAM,mBACH,eACA,MAAM,MAAM,cAAc,OAAM,SAAS,GACzC,OACA,SACH;AAAA;AAGI,IAAM,gCAAgC,OAI1C,OACA,OACA,aACA,cACiB;AAAA,EACjB,IAAI,CAAC,MAAM;AAAA,IAAwB;AAAA,EACnC,MAAM,mBACH,0BACA,MAAM,MAAM,yBAAyB,OAAM,WAAW,GACtD,OACA,SACH;AAAA;AAGI,IAAM,oBAAoB,OAI9B,OACA,KACA,QACA,cACiB;AAAA,EACjB,IAAI,CAAC,MAAM;AAAA,IAAY;AAAA,EACvB,MAAM,mBACH,cACA,MAAM,MAAM,aAAa,KAAK,MAAM,GACpC,OACA,SACH;AAAA;AAGI,IAAM,qBAAqB,OAI/B,OACA,KACA,cACiB;AAAA,EACjB,IAAI,CAAC,MAAM;AAAA,IAAa;AAAA,EACxB,MAAM,mBACH,eACA,MAAM,MAAM,cAAc,GAAG,GAC7B,OACA,SACH;AAAA;AAGI,IAAM,oBAAoB,OAI9B,OACA,OACA,QACA,WACA,cACiB;AAAA,EACjB,IAAI,CAAC,MAAM;AAAA,IAAY;AAAA,EACvB,MAAM,mBACH,cACA,MAAM,MAAM,aAAa,OAAM,QAAQ,SAAS,GAChD,OACA,SACH;AAAA;;;AC1NI,IAAM,UAAU,CAIpB,OACA,UACiC;AAAA,EACjC,MAAM,MAAM,IAAI;AAAA,EAChB,MAAM,QAAsC;AAAA,IACzC,IAAI,MAAM,MAAM,WAAW;AAAA,IAC3B,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,YAAY,MAAM;AAAA,IAClB,cAAc,MAAM,aAAa,IAAI,CAAC,OAAO;AAAA,MAC1C,MAAM,EAAE;AAAA,MACR,SAAS,EAAE;AAAA,IACd,EAAE;AAAA,IACF,UAAU,MAAM,YAAY;AAAA,IAC5B,SAAS,MAAM,WAAW;AAAA,IAC1B,aAAa,MAAM,eAAe;AAAA,IAClC,MAAM,MAAM,QAAQ,CAAC;AAAA,IACrB,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,WAAW;AAAA,IACX,WAAW;AAAA,EACd;AAAA,EAEA,MAAM,MAAM,IAAI,MAAK,IAAI,KAAI;AAAA,EAE7B,IAAI,CAAC,MAAM,UAAU,SAAS,MAAK,EAAE,GAAG;AAAA,IACrC,MAAM,UAAU,KAAK,MAAK,EAAE;AAAA,IAC5B,cAAc,KAAK;AAAA,EACtB;AAAA,EAEA,OAAO;AAAA;AAGH,IAAM,WAAW,CAIrB,OACA,WACmC;AAAA,EACnC,OAAO,OAAO,IAAI,CAAC,UAAU,QAAQ,OAAO,KAAK,CAAC;AAAA;AAG9C,IAAM,aAAa,CAIvB,OACA,WACW;AAAA,EACX,MAAM,UAAU,MAAM,MAAM,OAAO,MAAM;AAAA,EACzC,IAAI,SAAS;AAAA,IACV,MAAM,QAAQ,MAAM,UAAU,QAAQ,MAAM;AAAA,IAC5C,IAAI,UAAU,IAAI;AAAA,MACf,MAAM,UAAU,OAAO,OAAO,CAAC;AAAA,IAClC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAGH,IAAM,aAAa,CAIvB,OACA,QACA,YAC6C;AAAA,EAC7C,MAAM,WAAW,MAAM,MAAM,IAAI,MAAM;AAAA,EACvC,IAAI,CAAC;AAAA,IAAU;AAAA,EAEf,MAAM,UAAyC;AAAA,OACzC;AAAA,OACC,QAAQ,SAAS,aAAa,EAAE,MAAM,QAAQ,KAAK;AAAA,OACnD,QAAQ,gBAAgB,aAAa;AAAA,MACtC,aAAa,QAAQ;AAAA,IACxB;AAAA,OACI,QAAQ,eAAe,aAAa;AAAA,MACrC,YAAY,QAAQ;AAAA,IACvB;AAAA,OACI,QAAQ,iBAAiB,aAAa;AAAA,MACvC,cAAc,QAAQ,aAAa,IAAI,CAAC,OAAO;AAAA,QAC5C,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,MACd,EAAE;AAAA,IACL;AAAA,OACI,QAAQ,aAAa,aAAa,EAAE,UAAU,QAAQ,SAAS;AAAA,OAC/D,QAAQ,YAAY,aAAa,EAAE,SAAS,QAAQ,QAAQ;AAAA,OAC5D,QAAQ,gBAAgB,aAAa;AAAA,MACtC,aAAa,QAAQ;AAAA,IACxB;AAAA,OACI,QAAQ,SAAS,aAAa,EAAE,MAAM,QAAQ,KAAK;AAAA,OACnD,QAAQ,aAAa,aAAa,EAAE,UAAU,QAAQ,SAAS;AAAA,OAC/D,QAAQ,aAAa,aAAa,EAAE,UAAU,QAAQ,SAAS;AAAA,IACnE,WAAW,IAAI;AAAA,EAClB;AAAA,EAEA,MAAM,MAAM,IAAI,QAAQ,OAAO;AAAA,EAE/B,IAAI,QAAQ,aAAa,WAAW;AAAA,IACjC,cAAc,KAAK;AAAA,EACtB;AAAA,EAEA,OAAO;AAAA;AAGH,IAAM,UAAU,CAIpB,OACA,WAC6C;AAAA,EAC7C,OAAO,MAAM,MAAM,IAAI,MAAM;AAAA;AAGzB,IAAM,WAAW,CAIrB,OACA,YACgD;AAAA,EAChD,MAAM,QAAyC,CAAC;AAAA,EAEhD,WAAW,MAAM,MAAM,WAAW;AAAA,IAC/B,MAAM,QAAO,MAAM,MAAM,IAAI,EAAE;AAAA,IAC/B,IAAI,CAAC;AAAA,MAAM;AAAA,IAEX,IAAI,SAAS;AAAA,MACV,IACG,QAAQ,YAAY,aACpB,MAAK,YAAY,QAAQ,SAC1B;AAAA,QACC;AAAA,MACH;AAAA,MACA,IAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAAA,QAC1C,MAAM,SAAS,QAAQ,KAAK,KAAK,CAAC,QAAQ,MAAK,KAAK,SAAS,GAAG,CAAC;AAAA,QACjE,IAAI,CAAC;AAAA,UAAQ;AAAA,MAChB;AAAA,MACA,IACG,QAAQ,aAAa,aACrB,MAAK,aAAa,QAAQ,UAC3B;AAAA,QACC;AAAA,MACH;AAAA,MACA,IACG,QAAQ,OACR,QAAQ,IAAI,SAAS,KACrB,CAAC,QAAQ,IAAI,SAAS,MAAK,EAAE,GAC9B;AAAA,QACC;AAAA,MACH;AAAA,IACH;AAAA,IAEA,MAAM,KAAK,KAAI;AAAA,EAClB;AAAA,EAEA,OAAO;AAAA;AAGH,IAAM,aAAa,CAIvB,OACA,WACW;AAAA,EACX,MAAM,QAAO,MAAM,MAAM,IAAI,MAAM;AAAA,EACnC,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAElB,MAAM,MAAM,IAAI,QAAQ,KAAK,OAAM,SAAS,MAAM,WAAW,IAAI,KAAO,CAAC;AAAA,EACzE,OAAO;AAAA;AAGH,IAAM,cAAc,CAIxB,OACA,WACW;AAAA,EACX,MAAM,QAAO,MAAM,MAAM,IAAI,MAAM;AAAA,EACnC,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAElB,MAAM,MAAM,IAAI,QAAQ,KAAK,OAAM,SAAS,OAAO,WAAW,IAAI,KAAO,CAAC;AAAA,EAC1E,OAAO;AAAA;AAGH,IAAM,aAAa,CAIvB,UACQ;AAAA,EACR,MAAM,MAAM,MAAM;AAAA,EAClB,MAAM,UAAU,SAAS;AAAA;AAGrB,IAAM,aAAa,CAIvB,OACA,UACW;AAAA,EACX,MAAM,UAAmB;AAAA,IACtB,IAAI,MAAM,MAAM,WAAW;AAAA,IAC3B,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,SAAS,MAAM;AAAA,IACf,SAAS,MAAM,WAAW;AAAA,IAC1B,UAAU,MAAM;AAAA,EACnB;AAAA,EAEA,MAAM,SAAS,IAAI,QAAQ,IAAI,OAAO;AAAA,EACtC,OAAO;AAAA;AAGH,IAAM,aAAa,CAIvB,OACA,cACuB;AAAA,EACvB,OAAO,MAAM,SAAS,IAAI,SAAS;AAAA;AAG/B,IAAM,cAAc,CAIxB,UAC0B;AAAA,EAC1B,OAAO,MAAM,KAAK,MAAM,SAAS,OAAO,CAAC;AAAA;AAGrC,IAAM,gBAAgB,CAI1B,OACA,cACW;AAAA,EACX,OAAO,MAAM,SAAS,OAAO,SAAS;AAAA;AAGlC,IAAM,gBAAgB,CAI1B,OACA,cACgD;AAAA,EAChD,MAAM,UAAU,MAAM,SAAS,IAAI,SAAS;AAAA,EAC5C,IAAI,CAAC,WAAW,CAAC,QAAQ;AAAA,IAAS,OAAO,CAAC;AAAA,EAE1C,MAAM,QAAyC,CAAC;AAAA,EAChD,WAAW,UAAU,QAAQ,SAAS;AAAA,IACnC,MAAM,QAAO,MAAM,MAAM,IAAI,MAAM;AAAA,IACnC,IAAI,OAAM;AAAA,MACP,MAAM,KAAK,KAAI;AAAA,IAClB;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGV,IAAM,gBAAgB,CAInB,UACQ;AAAA,EACR,MAAM,UAAU,KAAK,CAAC,GAAG,MAAM;AAAA,IAC5B,MAAM,QAAQ,MAAM,MAAM,IAAI,CAAC;AAAA,IAC/B,MAAM,QAAQ,MAAM,MAAM,IAAI,CAAC;AAAA,IAC/B,IAAI,CAAC,SAAS,CAAC;AAAA,MAAO,OAAO;AAAA,IAC7B,OAAO,MAAM,WAAW,MAAM;AAAA,GAChC;AAAA;AAGG,IAAM,aAAa,CAIvB,UAC+C;AAAA,EAC/C,MAAM,WAAW,mBAA4C;AAAA,EAE7D,YAAY,IAAI,UAAS,MAAM,OAAO;AAAA,IACnC,SAAS,MAAM,IAAI,IAAI,KAAK,MAAK,CAAC;AAAA,EACrC;AAAA,EAEA,YAAY,IAAI,YAAY,MAAM,UAAU;AAAA,IACzC,SAAS,SAAS,IAAI,IAAI,KAAK,SAAS,SAAS,CAAC,GAAG,QAAQ,OAAO,EAAE,CAAC;AAAA,EAC1E;AAAA,EAEA,SAAS,UAAU,KAAK,GAAG,MAAM,SAAS;AAAA,EAE1C,OAAO;AAAA;;;ANhNV,IAAM,gBAAgB,CAInB,WACiD;AAAA,EAEjD,IAAI,CAAC,OAAO,aAAa,CAAC,OAAO,WAAW;AAAA,IACzC,MAAM,IAAI,MACP,+DACA,wEACA,4DACH;AAAA,EACH;AAAA,EAGA,MAAM,YAAY,OAAO,YACpB,OAAO,YACP,gBAAgB,EAAE,WAAW,OAAO,UAAU,CAAC;AAAA,EAEpD,OAAO;AAAA,IACJ,cAAc,OAAO;AAAA,IACrB,oBACG,OAAO,sBAAsB,6BAA6B;AAAA,IAC7D,OAAO;AAAA,SACD,sBAAsB;AAAA,SACtB,OAAO;AAAA,IACb;AAAA,IACA,YAAY;AAAA,SACN,2BAA2B;AAAA,SAC3B,OAAO;AAAA,IACb;AAAA,IACA,YAAY;AAAA,SACN,2BAA2B;AAAA,SAC3B,OAAO;AAAA,IACb;AAAA,IACA,OAAO,OAAO,SAAS,CAAC;AAAA,IACxB,UAAU,OAAO,YAAY,mBAAmB;AAAA,IAChD,QAAQ,OAAO,UAAU;AAAA,IACzB,iBAAiB,OAAO,mBAAmB;AAAA,IAC3C,qBAAqB,OAAO,uBAAuB;AAAA,IACnD,eAAe,OAAO;AAAA,IACtB;AAAA,EACH;AAAA;AAGI,IAAM,eAAe,CAIzB,SAAgD,CAAC,MACd;AAAA,EACnC,MAAM,iBAAiB,cAAc,MAAM;AAAA,EAC3C,MAAM,QACH,mBAAmB;AAAA,EAEtB,MAAM,QACH,eAAe,MAAM,UAChB,YAAY;AAAA,IACT,KAAK,eAAe,MAAM;AAAA,IAC1B,SAAS,eAAe,MAAM;AAAA,EACjC,CAAC,IACD,gBAAgB;AAAA,EAExB,IAAI,mBAAmB;AAAA,EACvB,IAAI,eAAe;AAAA,EACnB,IAAI,cAAc;AAAA,EAClB,IAAI,YAAY;AAAA,EAChB,IAAI,cAAc;AAAA,EAClB,IAAI,sBAAsB;AAAA,EAE1B,MAAM,WAAW,OACd,aACA,UAA2B,CAAC,MAC+B;AAAA,IAC3D,MAAM,UAAuC;AAAA,MAC1C,MAAM;AAAA,MACN,WAAW,IAAI;AAAA,MACf,eAAe,WAAW;AAAA,IAC7B;AAAA,IAEA,IAAI,kBAAkB,SAAS,OAAO;AAAA,MACnC,SAAS,QAAQ,iBAAiB,QAAQ,OAAO;AAAA,MACjD,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,IACrB,CAAC;AAAA,IAED,IAAI,QAAQ,WAAW;AAAA,MACpB,MAAM,eAAe,cAAc,OAAO,QAAQ,SAAS;AAAA,MAC3D,MAAM,aAAa,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,MACxD,kBAAkB,gBAAgB,OAAO,CAAC,MAAM,WAAW,IAAI,EAAE,EAAE,CAAC;AAAA,IACvE;AAAA,IAIA,IAAI,QAAQ,YAAY,QAAQ,WAAW,GAAG;AAAA,MAC3C,kBAAkB,gBAAgB,MAAM,GAAG,QAAQ,QAAQ;AAAA,IAC9D;AAAA,IAEA,MAAM,WAAW,CAAC,QAAQ,cACrB,GAAG,YAAY,WAAW,KAAK,UAAU,gBAAgB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MACzE;AAAA,IAEL,IAAI,YAAY,MAAM,IAAI,QAAQ,GAAG;AAAA,MAClC,MAAM,SAAS,MAAM,IAAI,QAAQ;AAAA,MACjC,IAAI,QAAQ;AAAA,QACT;AAAA,QACA,MAAM,kBACH,eAAe,OACf,UACA,QACA,eAAe,aAClB;AAAA,QACA,OAAO,KAAK,QAAQ,UAAU,KAAK;AAAA,MACtC;AAAA,IACH;AAAA,IAEA,IAAI,UAAU;AAAA,MACX;AAAA,MACA,MAAM,mBACH,eAAe,OACf,UACA,eAAe,aAClB;AAAA,IACH;AAAA,IAEA,MAAM,wBACH,eAAe,OACf,SACA,iBACA,eAAe,aAClB;AAAA,IAEA,QAAQ,QAAQ,kBAAkB,eAAe,YAAY,MAAM;AAAA,MAChE,MAAM,UAGD,CAAC;AAAA,MAEN,WAAW,SAAQ,iBAAiB;AAAA,QACjC,MAAM,SAAS,aAAa,OAAM,SAAS,eAAe,WAAW,EAAE,cAAc,KAAK,CAAC;AAAA,QAC3F,QAAQ,KAAK,EAAE,aAAM,OAAO,CAAC;AAAA,MAChC;AAAA,MAEA,OAAO;AAAA,KACT;AAAA,IAED,MAAM,cAEA,CAAC;AAAA,IACP,MAAM,eAAgD,CAAC;AAAA,IACvD,MAAM,eAAuD,CAAC;AAAA,IAC9D,IAAI,eAAe;AAAA,IACnB,IAAI;AAAA,IACJ,IAAI,eAAe;AAAA,IAEnB,MAAM,qBACH,QAAQ,sBAAsB,eAAe;AAAA,IAEhD,aAAa,aAAM,YAAY,kBAAkB;AAAA,MAC9C,MAAM,4BACH,eAAe,OACf,OACA,SACA,eAAe,aAClB;AAAA,MAEA,YAAY,KAAK,MAAM;AAAA,MAEvB,IAAI,OAAO,OAAO;AAAA,QACf;AAAA,QACA,MAAM,mBACH,eAAe,OACf,OACA,OAAO,OACP,eAAe,aAClB;AAAA,QACA,IAAI,CAAC,eAAe,iBAAiB;AAAA,UAClC;AAAA,QACH;AAAA,MACH;AAAA,MAEA,IAAI,OAAO,SAAS;AAAA,QACjB,MAAM,kBACH,eAAe,OACf,OACA,OAAO,cAAc,WACrB,eAAe,aAClB;AAAA,MACH;AAAA,MAEA,IAAI,OAAO,mBAAmB,eAAe,qBAAqB;AAAA,QAC/D,MAAM,kBACH,eAAe,OACf,OACA,OAAO,kBACP,eAAe,qBACf,eAAe,aAClB;AAAA,MACH;AAAA,MAEA,MAAM,2BACH,eAAe,OACf,OACA,QACA,eAAe,aAClB;AAAA,MAEA,IAAI,OAAO,SAAS;AAAA,QACjB,aAAa,KAAK,KAAI;AAAA,QAEtB,WAAW,eAAe,OAAO,cAAc;AAAA,UAC5C,aAAa,KAAK,WAAW;AAAA,UAC7B,MAAM,8BACH,eAAe,OACf,OACA,aACA,eAAe,aAClB;AAAA,QACH;AAAA,QAEA,MAAM,mBACH,eAAe,OACf,OACA,SACA,eAAe,aAClB;AAAA,QAEA,IAAI,MAAK,aAAa;AAAA,UACnB,eAAe;AAAA,UACf,kBAAkB,MAAK;AAAA,UACvB;AAAA,QACH;AAAA,QAEA,IAAI,uBAAuB,eAAe;AAAA,UACvC,eAAe;AAAA,UACf,kBAAkB,MAAK;AAAA,UACvB;AAAA,QACH;AAAA,MACH;AAAA,IACH;AAAA,IAEA;AAAA,IACA,gBAAgB,aAAa;AAAA,IAC7B,eAAe;AAAA,IACf,uBAAuB;AAAA,IAEvB,MAAM,kBAAkE;AAAA,MACrE;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,qBAAqB,YAAY;AAAA,MACjC,mBAAmB,aAAa;AAAA,MAChC,mBAAmB,YAAY,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,MACxD,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACb;AAAA,IAEA,IAAI,UAAU;AAAA,MACX,MAAM,IAAI,UAAU,eAAe;AAAA,IACtC;AAAA,IAEA,MAAM,uBACH,eAAe,OACf,iBACA,eAAe,aAClB;AAAA,IAEA,OAAO;AAAA;AAAA,EAGV,OAAO;AAAA,IACJ,SAAS,CAAC,UAAU,QAAQ,OAAO,KAAK;AAAA,IACxC,UAAU,CAAC,WAAW,SAAS,OAAO,MAAM;AAAA,IAC5C,YAAY,CAAC,WAAW;AAAA,MACrB,MAAM,SAAS,WAAW,OAAO,MAAM;AAAA,MACvC,IAAI;AAAA,QAAQ,MAAM,MAAM;AAAA,MACxB,OAAO;AAAA;AAAA,IAEV,YAAY,CAAC,QAAQ,YAAY;AAAA,MAC9B,MAAM,SAAS,WAAW,OAAO,QAAQ,OAAO;AAAA,MAChD,IAAI;AAAA,QAAQ,MAAM,MAAM;AAAA,MACxB,OAAO;AAAA;AAAA,IAEV,SAAS,CAAC,WAAW,QAAQ,OAAO,MAAM;AAAA,IAC1C,UAAU,CAAC,YAAY,SAAS,OAAO,OAAO;AAAA,IAC9C,YAAY,CAAC,WAAW;AAAA,MACrB,MAAM,SAAS,WAAW,OAAO,MAAM;AAAA,MACvC,IAAI;AAAA,QAAQ,MAAM,MAAM;AAAA,MACxB,OAAO;AAAA;AAAA,IAEV,aAAa,CAAC,WAAW;AAAA,MACtB,MAAM,SAAS,YAAY,OAAO,MAAM;AAAA,MACxC,IAAI;AAAA,QAAQ,MAAM,MAAM;AAAA,MACxB,OAAO;AAAA;AAAA,IAEV,YAAY,MAAM;AAAA,MACf,WAAW,KAAK;AAAA,MAChB,MAAM,MAAM;AAAA;AAAA,IAGf,YAAY,CAAC,UAAU,WAAW,OAAO,KAAK;AAAA,IAC9C,YAAY,CAAC,cAAc,WAAW,OAAO,SAAS;AAAA,IACtD,aAAa,MAAM,YAAY,KAAK;AAAA,IACpC,eAAe,CAAC,cAAc,cAAc,OAAO,SAAS;AAAA,IAE5D;AAAA,IAEA,YAAY,MAAM,MAAM,MAAM;AAAA,IAC9B,eAAe,MAAM,MAAM,SAAS;AAAA,IAEpC,UAAU,OAAO;AAAA,MACd,OAAO,MAAM;AAAA,MAIb,UAAU,MAAM;AAAA,MAChB,WAAW,MAAM;AAAA,IACpB;AAAA,IAEA,UAAU,MAAM;AAAA,MACb,MAAM,eAAe,MAAM,KAAK,MAAM,MAAM,OAAO,CAAC,EAAE,OACnD,CAAC,MAAM,EAAE,OACZ,EAAE;AAAA,MACF,OAAO;AAAA,QACJ,YAAY,MAAM,MAAM;AAAA,QACxB;AAAA,QACA,eAAe,MAAM,MAAM,OAAO;AAAA,QAClC,eAAe,MAAM,SAAS;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA,qBACG,mBAAmB,IACd,sBAAsB,mBACtB;AAAA,QACR;AAAA,QACA;AAAA,QACA,cACG,YAAY,cAAc,IACrB,aAAa,YAAY,eACzB;AAAA,MACX;AAAA;AAAA,EAEN;AAAA;;AO9ZH,IAAM,kBAAgC;AAAA,EACnC,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,iBAAiB;AACpB;AAEO,IAAM,aAAa,CAIvB,OACA,UAAwB,CAAC,MACa;AAAA,EACtC,MAAM,OAAO,KAAK,oBAAoB,QAAQ;AAAA,EAE9C,MAAM,OAAO,IAAI;AAAA,EACjB,MAAM,UAAU,IAAI;AAAA,EACpB,MAAM,QAAQ,IAAI;AAAA,EAClB,MAAM,aAAa,IAAI;AAAA,EACvB,MAAM,aAAa,IAAI;AAAA,EAEvB,WAAW,SAAQ,OAAO;AAAA,IACvB,KAAK,IAAI,MAAK,IAAI,KAAI;AAAA,IAEtB,IAAI,KAAK,cAAc;AAAA,MACpB,MAAM,SAAS,uBAAuB,MAAK,UAAU;AAAA,MACrD,WAAW,SAAS,QAAQ;AAAA,QACzB,MAAM,WAAW,QAAQ,IAAI,KAAK,KAAK,CAAC;AAAA,QACxC,SAAS,KAAK,KAAI;AAAA,QAClB,QAAQ,IAAI,OAAO,QAAQ;AAAA,MAC9B;AAAA,IACH;AAAA,IAEA,IAAI,KAAK,YAAY;AAAA,MAClB,WAAW,OAAO,MAAK,MAAM;AAAA,QAC1B,MAAM,WAAW,MAAM,IAAI,GAAG,KAAK,CAAC;AAAA,QACpC,SAAS,KAAK,KAAI;AAAA,QAClB,MAAM,IAAI,KAAK,QAAQ;AAAA,MAC1B;AAAA,IACH;AAAA,IAEA,IAAI,KAAK,mBAAmB,MAAK,UAAU;AAAA,MACxC,MAAM,WAAW,WAAW,IAAI,MAAK,QAAQ,KAAK,CAAC;AAAA,MACnD,SAAS,KAAK,KAAI;AAAA,MAClB,WAAW,IAAI,MAAK,UAAU,QAAQ;AAAA,IACzC;AAAA,IAEA,IAAI,KAAK,iBAAiB;AAAA,MACvB,MAAM,WAAW,WAAW,IAAI,MAAK,QAAQ,KAAK,CAAC;AAAA,MACnD,SAAS,KAAK,KAAI;AAAA,MAClB,WAAW,IAAI,MAAK,UAAU,QAAQ;AAAA,IACzC;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAAA,EAE1E,OAAO;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACH;AAAA;AAGI,IAAM,kBAAkB,CAI5B,OACA,UACgD;AAAA,EAChD,OAAO,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC;AAAA;AAGhC,IAAM,mBAAmB,CAI7B,OACA,QACA,OAAsB,UAC0B;AAAA,EAChD,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO,CAAC;AAAA,EAEjC,MAAM,WAAW,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,gBAAgB,OAAO,CAAC,CAAC,CAAC;AAAA,EAErE,IAAI,SAAS,OAAO;AAAA,IACjB,MAAM,WAAW,IAAI;AAAA,IACrB,WAAW,WAAW,UAAU;AAAA,MAC7B,WAAW,SAAQ,SAAS;AAAA,QACzB,SAAS,IAAI,KAAI;AAAA,MACpB;AAAA,IACH;AAAA,IACA,OAAO,CAAC,GAAG,QAAQ;AAAA,EACtB;AAAA,EAEA,OAAO,UAAU,QAAQ;AAAA,EACzB,IAAI,CAAC;AAAA,IAAO,OAAO,CAAC;AAAA,EAEpB,OAAO,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,UAAS,KAAK,MAAM,CAAC,QAAQ,IAAI,IAAI,KAAI,CAAC,CAAC;AAAA;AAGjE,IAAM,gBAAgB,CAI1B,OACA,QACgD;AAAA,EAChD,OAAO,MAAM,MAAM,IAAI,GAAG,KAAK,CAAC;AAAA;AAG5B,IAAM,iBAAiB,CAI3B,OACA,MACA,OAAsB,UAC0B;AAAA,EAChD,IAAI,KAAK,WAAW;AAAA,IAAG,OAAO,CAAC;AAAA,EAE/B,MAAM,WAAW,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,cAAc,OAAO,CAAC,CAAC,CAAC;AAAA,EAEjE,IAAI,SAAS,OAAO;AAAA,IACjB,MAAM,WAAW,IAAI;AAAA,IACrB,WAAW,WAAW,UAAU;AAAA,MAC7B,WAAW,SAAQ,SAAS;AAAA,QACzB,SAAS,IAAI,KAAI;AAAA,MACpB;AAAA,IACH;AAAA,IACA,OAAO,CAAC,GAAG,QAAQ;AAAA,EACtB;AAAA,EAEA,OAAO,UAAU,QAAQ;AAAA,EACzB,IAAI,CAAC;AAAA,IAAO,OAAO,CAAC;AAAA,EAEpB,OAAO,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,UAAS,KAAK,MAAM,CAAC,QAAQ,IAAI,IAAI,KAAI,CAAC,CAAC;AAAA;AAGjE,IAAM,qBAAqB,CAI/B,OACA,aACgD;AAAA,EAChD,OAAO,MAAM,WAAW,IAAI,QAAQ,KAAK,CAAC;AAAA;AAGtC,IAAM,qBAAqB,CAI/B,OACA,aACgD;AAAA,EAChD,OAAO,MAAM,WAAW,IAAI,QAAQ,KAAK,CAAC;AAAA;AAGtC,IAAM,0BAA0B,CAIpC,OACA,aACA,gBACgD;AAAA,EAChD,OAAO,MAAM,iBAAiB,OAC3B,CAAC,UAAS,MAAK,YAAY,eAAe,MAAK,YAAY,WAC9D;AAAA;AAGI,IAAM,cAAc,CAIxB,OACA,OAC6C;AAAA,EAC7C,OAAO,MAAM,KAAK,IAAI,EAAE;AAAA;AAGpB,IAAM,wBAAwB,CAIlC,OACA,kBACgD;AAAA,EAChD,MAAM,gBAAgB,IAAI;AAAA,EAE1B,WAAW,SAAS,eAAe;AAAA,IAChC,MAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK;AAAA,IACrC,IAAI,OAAO;AAAA,MACR,WAAW,SAAQ,OAAO;AAAA,QACvB,cAAc,IAAI,KAAI;AAAA,MACzB;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO,CAAC,GAAG,aAAa,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAAA;AAW5D,IAAM,uBAAuB,CAIjC,UACyC;AAAA,EACzC,MAAM,cAAwC,CAAC;AAAA,EAE/C,MAAM,aAAa,IAAI;AAAA,EACvB,WAAW,SAAQ,OAAO;AAAA,IACvB,MAAM,SAAS,uBAAuB,MAAK,UAAU;AAAA,IACrD,WAAW,SAAS,QAAQ;AAAA,MACzB,WAAW,IAAI,QAAQ,WAAW,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,IACzD;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,CAAC,GAAG,WAAW,QAAQ,CAAC,EAC3C,OAAO,IAAI,WAAW,QAAQ,MAAM,SAAS,GAAG,EAChD,IAAI,EAAE,WAAW,KAAK;AAAA,EAE1B,IAAI,eAAe,SAAS,GAAG;AAAA,IAC5B,YAAY,KAAK;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,yDAAyD,eAAe,KAAK,IAAI;AAAA,MAC1F,SAAS;AAAA,QACN,QAAQ;AAAA,QACR,iBAAiB,eAAe,IAAI,CAAC,OAAO;AAAA,UACzC,OAAO;AAAA,UACP,aAAc,WAAW,IAAI,CAAC,KAAK,KAAK,MAAM,SAAU;AAAA,QAC3D,EAAE;AAAA,MACL;AAAA,IACH,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAiB,IAAI;AAAA,EAC3B,WAAW,SAAQ,OAAO;AAAA,IACvB,MAAM,WAAW,eAAe,IAAI,MAAK,QAAQ,KAAK,CAAC;AAAA,IACvD,SAAS,KAAK,KAAI;AAAA,IAClB,eAAe,IAAI,MAAK,UAAU,QAAQ;AAAA,EAC7C;AAAA,EAEA,MAAM,sBAAsB,CAAC,GAAG,eAAe,QAAQ,CAAC,EAAE,OACvD,IAAI,WAAW,MAAM,SAAS,CACjC;AAAA,EAEA,IAAI,oBAAoB,SAAS,GAAG;AAAA,IACjC,YAAY,UAAU,UAAU,qBAAqB;AAAA,MAClD,YAAY,KAAK;AAAA,QACd,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,GAAG,MAAM,+BAA+B;AAAA,QACjD,SAAS,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QAC9B,SAAS,EAAE,UAAU,OAAO,MAAM,OAAO;AAAA,MAC5C,CAAC;AAAA,IACJ;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO;AAAA,EACpD,IAAI,cAAc,SAAS,MAAM,SAAS,KAAK;AAAA,IAC5C,YAAY,KAAK;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,GAAG,cAAc,kBAAmB,cAAc,SAAS,MAAM,SAAU,KAAK,QAAQ,CAAC;AAAA,MAClG,SAAS,cAAc,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MACtC,SAAS;AAAA,QACN,eAAe,cAAc;AAAA,QAC7B,YAAY,MAAM;AAAA,MACrB;AAAA,IACH,CAAC;AAAA,EACJ;AAAA,EAEA,IAAI,MAAM,SAAS,KAAK;AAAA,IACrB,YAAY,KAAK;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,qBAAqB,MAAM;AAAA,MACpC,SAAS,EAAE,WAAW,MAAM,OAAO;AAAA,IACtC,CAAC;AAAA,EACJ;AAAA,EAEA,OAAO;AAAA;AAGH,IAAM,gBAAgB,CAI1B,UASE;AAAA,EACF,MAAM,aAAa,MAAM,KAAK;AAAA,EAE9B,MAAM,kBAAkB,CAAC,GAAG,MAAM,QAAQ,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,EACvE,MAAM,gBAAgB,CAAC,GAAG,MAAM,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,EAEnE,OAAO;AAAA,IACJ;AAAA,IACA,cAAc,MAAM,QAAQ;AAAA,IAC5B,YAAY,MAAM,MAAM;AAAA,IACxB,kBAAkB,MAAM,WAAW;AAAA,IACnC,kBAAkB,MAAM,WAAW;AAAA,IACnC,sBACG,gBAAgB,SAAS,IACpB,gBAAgB,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IACzC,gBAAgB,SAChB;AAAA,IACR,oBACG,cAAc,SAAS,IAClB,cAAc,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,cAAc,SACzD;AAAA,EACX;AAAA;;AClTH,IAAM,iBAAiB;AAEhB,IAAM,gBAAgB,CAI1B,WACmB;AAAA,EACnB,IAAI,MAAK;AAAA,EACT,MAAM,MAAK;AAAA,EACX,aAAa,MAAK;AAAA,EAClB,YAAY,MAAK;AAAA,EACjB,cAAc,MAAK,aAAa,IAAI,CAAC,OAAO;AAAA,IACzC,MAAM,EAAE;AAAA,IACR,SAAS,EAAE;AAAA,EACd,EAAE;AAAA,EACF,UAAU,MAAK;AAAA,EACf,SAAS,MAAK;AAAA,EACd,aAAa,MAAK;AAAA,EAClB,MAAM,MAAK;AAAA,EACX,UAAU,MAAK;AAAA,EACf,UAAU,MAAK;AAAA,EACf,WAAW,MAAK,UAAU,YAAY;AAAA,EACtC,WAAW,MAAK,UAAU,YAAY;AACzC;AAEO,IAAM,kBAAkB,CAI5B,YACA,UAAyB,CAAC,MACO;AAAA,EACjC,MAAM,KAAK,QAAQ,iBACd,GAAG,QAAQ,YAAY,KAAK,WAAW,MACvC,WAAW;AAAA,EAEhB,MAAM,MAAM,IAAI;AAAA,EAEhB,OAAO;AAAA,IACJ;AAAA,IACA,MAAM,WAAW;AAAA,IACjB,aAAa,WAAW;AAAA,IACxB,YAAY,WAAW;AAAA,IACvB,cAAc,WAAW;AAAA,IAIzB,UAAU,WAAW;AAAA,IACrB,SAAS,WAAW;AAAA,IACpB,aAAa,WAAW;AAAA,IACxB,MAAM,WAAW;AAAA,IACjB,UAAU,WAAW;AAAA,IACrB,UAAU,WAAW;AAAA,IACrB,WAAW,QAAQ,gBAAgB,IAAI,KAAK,WAAW,SAAS,IAAI;AAAA,IACpE,WAAW,QAAQ,gBAAgB,IAAI,KAAK,WAAW,SAAS,IAAI;AAAA,EACvE;AAAA;AAGI,IAAM,mBAAmB,CAAC,aAAyC;AAAA,EACvE,IAAI,QAAQ;AAAA,EACZ,MAAM,QAAQ;AAAA,EACd,aAAa,QAAQ;AAAA,EACrB,SAAS,QAAQ;AAAA,EACjB,SAAS,QAAQ;AAAA,EACjB,UAAU,QAAQ;AACrB;AAEO,IAAM,qBAAqB,CAC/B,YACA,WACA,UAAyB,CAAC,MACf;AAAA,EACX,MAAM,KAAK,QAAQ,iBACd,GAAG,QAAQ,YAAY,KAAK,WAAW,MACvC,WAAW;AAAA,EAEhB,MAAM,UAAU,WAAW,QAAQ,IAChC,CAAC,UAAU,UAAU,IAAI,KAAK,KAAK,KACtC;AAAA,EAEA,OAAO;AAAA,IACJ;AAAA,IACA,MAAM,WAAW;AAAA,IACjB,aAAa,WAAW;AAAA,IACxB;AAAA,IACA,SAAS,WAAW;AAAA,IACpB,UAAU,WAAW;AAAA,EACxB;AAAA;AAGI,IAAM,cAAc,CAIxB,OACA,UACA,cACiB;AAAA,EACjB,SAAS;AAAA,EACT,YAAY,IAAI,KAAK,EAAE,YAAY;AAAA,EACnC,OAAO,MAAM,IAAI,aAAa;AAAA,EAC9B,UAAU,UAAU,IAAI,gBAAgB;AAAA,EACxC;AACH;AAEO,IAAM,eAAe,CAIzB,OACA,UACA,aACU;AAAA,EACV,MAAM,aAAa,YAAY,OAAO,UAAU,QAAQ;AAAA,EACxD,OAAO,KAAK,UAAU,YAAY,MAAM,CAAC;AAAA;AAGrC,IAAM,cAAc,CAIxB,MACA,UAAyB,CAAC,MACe;AAAA,EACzC,MAAM,QAAyC,CAAC;AAAA,EAChD,MAAM,WAAsB,CAAC;AAAA,EAC7B,MAAM,SAID,CAAC;AAAA,EACN,MAAM,YAAY,IAAI;AAAA,EAEtB,SAAS,IAAI,EAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAAA,IACzC,IAAI;AAAA,MACD,MAAM,aAAa,KAAK,MAAM;AAAA,MAC9B,IAAI,CAAC;AAAA,QAAY;AAAA,MACjB,MAAM,QAAO,gBACV,YACA,OACH;AAAA,MACA,UAAU,IAAI,WAAW,IAAI,MAAK,EAAE;AAAA,MACpC,MAAM,KAAK,KAAI;AAAA,MAChB,OAAO,OAAO;AAAA,MACb,OAAO,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACjE,CAAC;AAAA;AAAA,EAEP;AAAA,EAEA,IAAI,KAAK,UAAU;AAAA,IAChB,SAAS,IAAI,EAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAAA,MAC5C,IAAI;AAAA,QACD,MAAM,aAAa,KAAK,SAAS;AAAA,QACjC,IAAI,CAAC;AAAA,UAAY;AAAA,QACjB,MAAM,UAAU,mBAAmB,YAAY,WAAW,OAAO;AAAA,QACjE,SAAS,KAAK,OAAO;AAAA,QACtB,OAAO,OAAO;AAAA,QACb,OAAO,KAAK;AAAA,UACT,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QACjE,CAAC;AAAA;AAAA,IAEP;AAAA,EACH;AAAA,EAGA,MAAM,kBAAkB,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,EACtD,MAAM,qBAA0C,CAAC;AAAA,EAEjD,WAAW,WAAW,UAAU;AAAA,IAC7B,MAAM,iBAAiB,QAAQ,QAAQ,OACpC,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAClC;AAAA,IACA,IAAI,eAAe,SAAS,GAAG;AAAA,MAC5B,mBAAmB,KAAK;AAAA,QACrB,WAAW,QAAQ;AAAA,QACnB,aAAa,QAAQ;AAAA,QACrB;AAAA,MACH,CAAC;AAAA,IACJ;AAAA,EACH;AAAA,EAEA,OAAO;AAAA,IACJ,SAAS,OAAO,WAAW;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACH;AAAA;AAGI,IAAM,iBAAiB,CAI3B,MACA,UAAyB,CAAC,MACe;AAAA,EACzC,IAAI;AAAA,IACD,MAAM,OAAO,KAAK,MAAM,IAAI;AAAA,IAC5B,OAAO,YAAqC,MAAM,OAAO;AAAA,IAC1D,OAAO,OAAO;AAAA,IACb,OAAO;AAAA,MACJ,SAAS;AAAA,MACT,OAAO,CAAC;AAAA,MACR,UAAU,CAAC;AAAA,MACX,QAAQ;AAAA,QACL;AAAA,UACG,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAAS,iBAAiB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAClF;AAAA,MACH;AAAA,MACA,WAAW,IAAI;AAAA,MACf,oBAAoB,CAAC;AAAA,IACxB;AAAA;AAAA;AAIC,IAAM,YAAY,CAItB,OACA,OACA,YACiC;AAAA,EACjC,MAAM,MAAM,IAAI;AAAA,EAChB,OAAO;AAAA,OACD;AAAA,IACH,IAAI,SAAS,WAAW;AAAA,IACxB,MAAM,WAAW,GAAG,MAAK;AAAA,IACzB,WAAW;AAAA,IACX,WAAW;AAAA,EACd;AAAA;AAGI,IAAM,gBAAgB,CAI1B,WACA,eACA,WAAyC,cACO;AAAA,EAChD,MAAM,UAAU,IAAI;AAAA,EAEpB,WAAW,SAAQ,WAAW;AAAA,IAC3B,QAAQ,IAAI,MAAK,IAAI,KAAI;AAAA,EAC5B;AAAA,EAEA,WAAW,SAAQ,eAAe;AAAA,IAC/B,MAAM,WAAW,QAAQ,IAAI,MAAK,EAAE;AAAA,IAEpC,IAAI,CAAC,UAAU;AAAA,MACZ,QAAQ,IAAI,MAAK,IAAI,KAAI;AAAA,IAC5B,EAAO;AAAA,MACJ,QAAQ;AAAA,aACA;AAAA,UACF,QAAQ,IAAI,MAAK,IAAI,KAAI;AAAA,UACzB;AAAA,aACE;AAAA,UACF;AAAA,aACE,SAAS;AAAA,UACX,MAAM,SAAwC;AAAA,eACxC;AAAA,eACA;AAAA,YACH,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,SAAS,MAAM,GAAG,MAAK,IAAI,CAAC,CAAC;AAAA,YACnD,UAAU,KAAK,SAAS,aAAa,MAAK,SAAS;AAAA,YACnD,WAAW,IAAI;AAAA,UAClB;AAAA,UACA,QAAQ,IAAI,MAAK,IAAI,MAAM;AAAA,UAC3B;AAAA,QACH;AAAA;AAAA;AAAA,EAGT;AAAA,EAEA,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;AAAA;AAGvB,IAAM,eAAe,CAIzB,UACA,aASE;AAAA,EACF,MAAM,SAAS,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,EACrD,MAAM,SAAS,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,EAErD,MAAM,QAAyC,CAAC;AAAA,EAChD,MAAM,UAA2C,CAAC;AAAA,EAClD,MAAM,WAGD,CAAC;AAAA,EACN,MAAM,YAA6C,CAAC;AAAA,EAEpD,YAAY,IAAI,YAAY,QAAQ;AAAA,IACjC,MAAM,UAAU,OAAO,IAAI,EAAE;AAAA,IAC7B,IAAI,CAAC,SAAS;AAAA,MACX,MAAM,KAAK,OAAO;AAAA,IACrB,EAAO,SACJ,KAAK,UAAU,KAAK,SAAS,WAAW,MAAM,WAAW,KAAK,CAAC,MAC/D,KAAK,UAAU,KAAK,SAAS,WAAW,MAAM,WAAW,KAAK,CAAC,GAChE;AAAA,MACC,SAAS,KAAK,EAAE,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA,IAC/C,EAAO;AAAA,MACJ,UAAU,KAAK,OAAO;AAAA;AAAA,EAE5B;AAAA,EAEA,YAAY,IAAI,YAAY,QAAQ;AAAA,IACjC,IAAI,CAAC,OAAO,IAAI,EAAE,GAAG;AAAA,MAClB,QAAQ,KAAK,OAAO;AAAA,IACvB;AAAA,EACH;AAAA,EAEA,OAAO,EAAE,OAAO,SAAS,UAAU,UAAU;AAAA;;ACtZhD,4BAAS;AAsET,IAAM,sBAAsB,CACzB,gBACgC;AAAA,EAChC,MAAM,WAAW;AAAA,EACjB,WAAW,IAAI;AAAA,EACf,UAAU,WAAW;AACxB;AAEO,IAAM,WAAW,CAIrB,OACA,SACA,YAAgD,iBAAgB,MACnB;AAAA,EAC7C,MAAM,YAAY,YAAY,IAAI;AAAA,EAElC,MAAM,eAAe,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO;AAAA,EAClD,MAAM,cAAc,oBAAoB,OAAO;AAAA,EAC/C,MAAM,UAAU,cAAc,cAAc,aAAa,SAAS;AAAA,EAElE,MAAM,eAAe,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO;AAAA,EAC5D,MAAM,iBAID,CAAC;AAAA,EAEN,WAAW,UAAU,QAAQ,SAAS;AAAA,IACnC,IAAI,CAAC,OAAO,SAAS;AAAA,MAClB,MAAM,SAAS,OAAO,UAChB,OAAO,cAAc,YACtB,OAAO,QACL,UAAU,OAAO,MAAM,YACvB;AAAA,MACP,eAAe,KAAK;AAAA,QACjB,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB;AAAA,MACH,CAAC;AAAA,IACJ;AAAA,EACH;AAAA,EAEA,MAAM,eAKD,CAAC;AAAA,EAEN,WAAW,SAAS,cAAc;AAAA,IAC/B,WAAW,eAAe,MAAM,cAAc;AAAA,MAC3C,aAAa,KAAK;AAAA,QACf,MAAM,YAAY;AAAA,QAClB,SAAS,YAAY;AAAA,QACrB,QAAQ,YAAY;AAAA,QACpB,UAAU,YAAY,YAAY,MAAM;AAAA,MAC3C,CAAC;AAAA,IACJ;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,YAAY,IAAI,IAAI;AAAA,EAE5C,OAAO;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACH;AAAA;AAGI,IAAM,qBAAqB,CAI/B,OACA,SACA,YAAgD,iBAAgB,MAK9D;AAAA,EACF,MAAM,cAAc,oBAAoB,OAAO;AAAA,EAC/C,MAAM,SAAS,aAAa,OAAM,aAAa,SAAS;AAAA,EAExD,OAAO;AAAA,IACJ,SAAS,OAAO;AAAA,IAChB,iBAAiB,OAAO;AAAA,IACxB,cAAc,OAAO,UAChB,MAAK,aAAa,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE,IACnE,CAAC;AAAA,EACT;AAAA;AAGI,IAAM,SAAS,CAInB,eACA,eACA,SACA,YAAgD,iBAAgB,MACvB;AAAA,EACzC,MAAM,WAAW,SAAS,eAAe,SAAS,SAAS;AAAA,EAC3D,MAAM,WAAW,SAAS,eAAe,SAAS,SAAS;AAAA,EAE3D,MAAM,mBAAmB,IAAI,IAAI,SAAS,aAAa,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAAA,EAC3E,MAAM,mBAAmB,IAAI,IAAI,SAAS,aAAa,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAAA,EAE3E,MAAM,aAAa,CAAC,GAAG,gBAAgB,EAAE,OACtC,CAAC,OAAO,CAAC,iBAAiB,IAAI,EAAE,CACnC;AAAA,EACA,MAAM,cAAc,CAAC,GAAG,gBAAgB,EAAE,OACvC,CAAC,OAAO,CAAC,iBAAiB,IAAI,EAAE,CACnC;AAAA,EAEA,MAAM,qBAID,CAAC;AAAA,EAEN,MAAM,0BAA0B,IAAI,IACjC,SAAS,aAAa,IAAI,CAAC,MAAM,GAAG,EAAE,UAAU,EAAE,MAAgB,CACrE;AAAA,EACA,MAAM,0BAA0B,IAAI,IACjC,SAAS,aAAa,IAAI,CAAC,MAAM,GAAG,EAAE,UAAU,EAAE,MAAgB,CACrE;AAAA,EAEA,WAAW,OAAO,yBAAyB;AAAA,IACxC,IAAI,CAAC,wBAAwB,IAAI,GAAG,GAAG;AAAA,MACpC,OAAO,QAAQ,mBAAmB,IAAI,MAAM,GAAG;AAAA,MAC/C,mBAAmB,KAAK;AAAA,QACrB,MAAM;AAAA,QACN,iBAAiB,mBAAmB;AAAA,QACpC,QAAQ,UAAU;AAAA,MACrB,CAAC;AAAA,IACJ;AAAA,EACH;AAAA,EAEA,WAAW,OAAO,yBAAyB;AAAA,IACxC,IAAI,CAAC,wBAAwB,IAAI,GAAG,GAAG;AAAA,MACpC,OAAO,QAAQ,mBAAmB,IAAI,MAAM,GAAG;AAAA,MAC/C,mBAAmB,KAAK;AAAA,QACrB,MAAM;AAAA,QACN,iBAAiB,mBAAmB;AAAA,QACpC,QAAQ,UAAU;AAAA,MACrB,CAAC;AAAA,IACJ;AAAA,EACH;AAAA,EAEA,OAAO;AAAA,IACJ;AAAA,IACA;AAAA,IACA,aAAa;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACH;AAAA,EACH;AAAA;AAGI,IAAM,gBAAgB,CAI1B,OACA,UACA,YAAgD,iBAAgB,MACd;AAAA,EAClD,MAAM,UAAU,SAAS,IAAI,CAAC,YAAY,SAAS,OAAO,SAAS,SAAS,CAAC;AAAA,EAE7E,MAAM,qBAAqB,IAAI;AAAA,EAC/B,MAAM,uBAAuB,IAAI;AAAA,EACjC,IAAI,oBAAoB;AAAA,EACxB,IAAI,qBAAqB;AAAA,EAEzB,WAAW,UAAU,SAAS;AAAA,IAC3B,qBAAqB,OAAO,aAAa;AAAA,IACzC,sBAAsB,OAAO;AAAA,IAE7B,WAAW,SAAS,OAAO,cAAc;AAAA,MACtC,MAAM,QAAQ,mBAAmB,IAAI,MAAM,MAAM,KAAK;AAAA,MACtD,mBAAmB,IAAI,MAAM,QAAQ,QAAQ,CAAC;AAAA,IACjD;AAAA,IAEA,WAAW,eAAe,OAAO,cAAc;AAAA,MAC5C,MAAM,MAAM,YAAY;AAAA,MACxB,MAAM,QAAQ,qBAAqB,IAAI,GAAG,KAAK;AAAA,MAC/C,qBAAqB,IAAI,KAAK,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACH;AAAA,EAEA,OAAO;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACN,eAAe,SAAS;AAAA,MACxB,qBACG,SAAS,SAAS,IAAI,oBAAoB,SAAS,SAAS;AAAA,MAC/D;AAAA,MACA;AAAA,MACA,wBACG,SAAS,SAAS,IAAI,qBAAqB,SAAS,SAAS;AAAA,IACnE;AAAA,EACH;AAAA;AAGI,IAAM,mCAAmC,CAI7C,OACA,iBACA,iBACA,YAAgD,iBAAgB,MAK9D;AAAA,EACF,MAAM,iBAAiB,SAAS,OAAO,iBAAiB,SAAS;AAAA,EACjE,MAAM,iBAAiB,SAAS,OAAO,iBAAiB,SAAS;AAAA,EAEjE,MAAM,mBAAmB,IAAI,IAC1B,eAAe,aAAa,IAAI,CAAC,MAAM,EAAE,MAAM,CAClD;AAAA,EACA,MAAM,mBAAmB,IAAI,IAC1B,eAAe,aAAa,IAAI,CAAC,MAAM,EAAE,MAAM,CAClD;AAAA,EAEA,MAAM,aAA8C,CAAC;AAAA,EACrD,MAAM,cAA+C,CAAC;AAAA,EACtD,MAAM,YAA6C,CAAC;AAAA,EAEpD,WAAW,SAAQ,OAAO;AAAA,IACvB,MAAM,aAAa,iBAAiB,IAAI,MAAK,EAAE;AAAA,IAC/C,MAAM,YAAY,iBAAiB,IAAI,MAAK,EAAE;AAAA,IAE9C,IAAI,CAAC,cAAc,WAAW;AAAA,MAC3B,WAAW,KAAK,KAAI;AAAA,IACvB,EAAO,SAAI,cAAc,CAAC,WAAW;AAAA,MAClC,YAAY,KAAK,KAAI;AAAA,IACxB,EAAO;AAAA,MACJ,UAAU,KAAK,KAAI;AAAA;AAAA,EAEzB;AAAA,EAEA,OAAO,EAAE,YAAY,aAAa,UAAU;AAAA;AAGxC,IAAM,yBAAyB,CAInC,WACU;AAAA,EACV,MAAM,QAAkB;AAAA,IACrB;AAAA,IACA;AAAA,IACA,mBAAmB,OAAO,gBAAgB,QAAQ,CAAC;AAAA,IACnD;AAAA,IACA,kBAAkB,OAAO,aAAa;AAAA,EACzC;AAAA,EAEA,WAAW,SAAS,OAAO,cAAc;AAAA,IACtC,MAAM,KAAK,OAAO,MAAM,aAAa,MAAM,SAAS;AAAA,EACvD;AAAA,EAEA,MAAM,KAAK,EAAE;AAAA,EACb,MAAM,KAAK,oBAAoB,OAAO,eAAe,UAAU;AAAA,EAE/D,WAAW,aAAa,OAAO,gBAAgB;AAAA,IAC5C,MAAM,KAAK,OAAO,UAAU,aAAa,UAAU,QAAQ;AAAA,EAC9D;AAAA,EAEA,MAAM,KAAK,EAAE;AAAA,EACb,MAAM,KAAK,iBAAiB,OAAO,aAAa,UAAU;AAAA,EAE1D,WAAW,eAAe,OAAO,cAAc;AAAA,IAC5C,MAAM,KACH,OAAO,YAAY,cAAwB,YAAY,WAC1D;AAAA,EACH;AAAA,EAEA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;;ACpWzB,cAAS;AAYF,IAAM,mCAAmC,GAAE,KAAK;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACH,CAAC;AAKM,IAAM,wBAAwB,GAAE,OAAO;AAAA,EAC3C,oBAAoB,iCAAiC,SAAS;AAAA,EAC9D,UAAU,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/C,SAAS,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,cAAc,GAAE,QAAQ,EAAE,SAAS;AAAA,EACnC,MAAM,GAAE,MAAM,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,UAAU,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,WAAW,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,aAAa,GAAE,QAAQ,EAAE,SAAS;AACrC,CAAC;AAGM,IAAM,uBAAuB,GAAE,OAAO;AAAA,EAC1C,oBAAoB;AAAA,EACpB,iBAAiB,GAAE,QAAQ;AAAA,EAC3B,wBAAwB,GAAE,QAAQ;AACrC,CAAC;;ACtCD,cAAS;AAwEF,IAAM,aAAa,GAAE,OAAO;AAAA,EAChC,IAAI,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,MAAM,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,YAAY,GAAE,OAAuB,CAAC,QAAQ;AAAA,IAC3C,OACG,OAAO,QAAQ,YACf,QAAQ,QACR,QAAQ,OACR,cAAc;AAAA,KAEjB,yBAAyB;AAAA,EAC5B,cAAc,GAAE,MACb,GAAE,OAAO;AAAA,IACN,MAAM,GAAE,OAAO;AAAA,IACf,SAAS,GAAE,QAAQ;AAAA,EACtB,CAAC,CACJ;AAAA,EACA,UAAU,GAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,EACpC,SAAS,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,aAAa,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACtC,MAAM,GAAE,MAAM,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,UAAU,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,UAAU,GAAE,OAAO,GAAE,OAAO,GAAG,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACrD,WAAW,GAAE,KAAK,EAAE,QAAQ,MAAM,IAAI,IAAM;AAAA,EAC5C,WAAW,GAAE,KAAK,EAAE,QAAQ,MAAM,IAAI,IAAM;AAC/C,CAAC;AAEM,IAAM,gBAAgB,GAAE,OAAO;AAAA,EACnC,IAAI,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,MAAM,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAAS,GAAE,MAAM,GAAE,OAAO,CAAC;AAAA,EAC3B,SAAS,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,UAAU,GAAE,OAAO,GAAE,OAAO,GAAG,GAAE,QAAQ,CAAC,EAAE,SAAS;AACxD,CAAC;;AC5GD;AAAA,sBAGG;AAAA;AAoCH,IAAM,mBAA4C;AAAA,EAC/C,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,yBAAyB;AAAA,EACzB,uBAAuB;AAC1B;AAEA,IAAM,0BAAyB,CAC5B,cACe;AAAA,EACf,MAAM,SAAS,IAAI;AAAA,EAEnB,IAAI,kBAAiB,SAAS,GAAG;AAAA,IAC9B,WAAW,SAAS,UAAU,YAAY;AAAA,MACvC,MAAM,cAAc,wBACjB,KACH;AAAA,MACA,WAAW,SAAS,aAAa;AAAA,QAC9B,OAAO,IAAI,KAAK;AAAA,MACnB;AAAA,IACH;AAAA,EACH,EAAO;AAAA,IACJ,OAAO,IAAI,UAAU,KAAK;AAAA;AAAA,EAG7B,OAAO;AAAA;AAGV,IAAM,qBAAqB,CAAC,cAAsC;AAAA,EAC/D,MAAM,YAAY,CAAC,MAA0C;AAAA,IAC1D,IAAI,kBAAiB,CAAC,GAAG;AAAA,MACtB,MAAM,mBAAmB,CAAC,GAAG,EAAE,UAAU,EACrC,IAAI,CAAC,UAAU,UAAU,KAAmC,CAAC,EAC7D,KAAK;AAAA,MACT,OAAO,SAAS,EAAE,aAAa,iBAAiB,KAAK,GAAG;AAAA,IAC3D;AAAA,IACA,OAAO,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,KAAK,UAAU,EAAE,KAAK;AAAA;AAAA,EAE3E,OAAO,UAAU,SAAS;AAAA;AAG7B,IAAM,6BAA6B,CAChC,WACA,UAC+C;AAAA,EAC/C,MAAM,UAAuD,CAAC;AAAA,EAE9D,MAAM,WAAW,CAAC,MAAkC;AAAA,IACjD,IAAI,kBAAiB,CAAC,GAAG;AAAA,MACtB,WAAW,SAAS,EAAE,YAAY;AAAA,QAC/B,SAAS,KAAmC;AAAA,MAC/C;AAAA,IACH,EAAO,SAAI,EAAE,UAAU,OAAO;AAAA,MAC3B,QAAQ,KAAK,EAAE,UAAU,EAAE,UAAU,OAAO,EAAE,MAAM,CAAC;AAAA,IACxD;AAAA;AAAA,EAGH,SAAS,SAAS;AAAA,EAClB,OAAO;AAAA;AAGV,IAAM,2BAA2B,CAC9B,aACA,gBACW;AAAA,EACX,MAAM,UAAU,wBAAuB,WAAW;AAAA,EAClD,MAAM,UAAU,wBAAuB,WAAW;AAAA,EAElD,MAAM,eAAe,IAAI,IAAI,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC,CAAC;AAAA,EACvE,IAAI,aAAa,SAAS;AAAA,IAAG,OAAO;AAAA,EAEpC,WAAW,SAAS,cAAc;AAAA,IAC/B,MAAM,OAAO,2BAA2B,aAAa,KAAK;AAAA,IAC1D,MAAM,OAAO,2BAA2B,aAAa,KAAK;AAAA,IAE1D,WAAW,OAAO,MAAM;AAAA,MACrB,WAAW,OAAO,MAAM;AAAA,QACrB,IAAI,IAAI,aAAa,IAAI,YAAY,IAAI,UAAU,IAAI,OAAO;AAAA,UAC3D,OAAO;AAAA,QACV;AAAA,QAEA,IACI,IAAI,aAAa,QAAQ,IAAI,aAAa,QAC1C,IAAI,aAAa,QAAQ,IAAI,aAAa,QAC1C,IAAI,aAAa,SAAS,IAAI,aAAa,SAC3C,IAAI,aAAa,SAAS,IAAI,aAAa,OAC7C;AAAA,UACC,MAAM,OAAO,IAAI;AAAA,UACjB,MAAM,OAAO,IAAI;AAAA,UACjB,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AAAA,YACvD,IAAI,IAAI,aAAa,QAAQ,IAAI,aAAa,MAAM;AAAA,cACjD,IAAI,OAAO;AAAA,gBAAM,OAAO;AAAA,YAC3B;AAAA,YACA,IAAI,IAAI,aAAa,QAAQ,IAAI,aAAa,MAAM;AAAA,cACjD,IAAI,OAAO;AAAA,gBAAM,OAAO;AAAA,YAC3B;AAAA,UACH;AAAA,QACH;AAAA,MACH;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGV,IAAM,mBAAmB,CAItB,UACoD;AAAA,EACpD,MAAM,YAAiD,CAAC;AAAA,EACxD,MAAM,QAAQ,IAAI;AAAA,EAElB,WAAW,SAAQ,OAAO;AAAA,IACvB,MAAM,WAAW,MAAM,IAAI,MAAK,EAAE,KAAK,CAAC;AAAA,IACxC,SAAS,KAAK,KAAI;AAAA,IAClB,MAAM,IAAI,MAAK,IAAI,QAAQ;AAAA,EAC9B;AAAA,EAEA,YAAY,IAAI,eAAe,OAAO;AAAA,IACnC,IAAI,WAAW,SAAS,GAAG;AAAA,MACxB,UAAU,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,qCAAqC;AAAA,QAC9C,SAAS,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QACnC,OAAO;AAAA,QACP,SAAS,EAAE,aAAa,IAAI,OAAO,WAAW,OAAO;AAAA,MACxD,CAAC;AAAA,IACJ;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGV,IAAM,0BAA0B,CAI7B,UACoD;AAAA,EACpD,MAAM,YAAiD,CAAC;AAAA,EACxD,MAAM,UAAU,IAAI;AAAA,EAEpB,WAAW,SAAQ,OAAO;AAAA,IACvB,MAAM,OAAO,mBAAmB,MAAK,UAAU;AAAA,IAC/C,MAAM,WAAW,QAAQ,IAAI,IAAI,KAAK,CAAC;AAAA,IACvC,SAAS,KAAK,KAAI;AAAA,IAClB,QAAQ,IAAI,MAAM,QAAQ;AAAA,EAC7B;AAAA,EAEA,YAAY,MAAM,eAAe,SAAS;AAAA,IACvC,IAAI,WAAW,SAAS,GAAG;AAAA,MACxB,UAAU,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,6CAA6C,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAAA,QAC7F,SAAS,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QACnC,OAAO;AAAA,QACP,SAAS,EAAE,eAAe,MAAM,OAAO,WAAW,OAAO;AAAA,MAC5D,CAAC;AAAA,IACJ;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGV,IAAM,4BAA4B,CAI/B,UACoD;AAAA,EACpD,MAAM,YAAiD,CAAC;AAAA,EACxD,MAAM,UAAU,IAAI;AAAA,EAEpB,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACpC,SAAS,IAAI,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,MACxC,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,QAAQ,MAAM;AAAA,MACpB,IAAI,CAAC,SAAS,CAAC;AAAA,QAAO;AAAA,MACtB,MAAM,MAAM,CAAC,MAAM,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG;AAAA,MAEhD,IAAI,QAAQ,IAAI,GAAG;AAAA,QAAG;AAAA,MACtB,QAAQ,IAAI,GAAG;AAAA,MAEf,IAAI,yBAAyB,MAAM,YAAY,MAAM,UAAU,GAAG;AAAA,QAC/D,UAAU,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,UAAU,MAAM,cAAc,MAAM;AAAA,UAC7C,SAAS,CAAC,MAAM,IAAI,MAAM,EAAE;AAAA,UAC5B,OAAO,CAAC,OAAO,KAAK;AAAA,UACpB,SAAS;AAAA,YACN,aAAa,CAAC,GAAG,wBAAuB,MAAM,UAAU,CAAC;AAAA,YACzD,aAAa,CAAC,GAAG,wBAAuB,MAAM,UAAU,CAAC;AAAA,UAC5D;AAAA,QACH,CAAC;AAAA,MACJ;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGV,IAAM,yBAAyB,CAI5B,UACoD;AAAA,EACpD,MAAM,YAAiD,CAAC;AAAA,EACxD,MAAM,cAAc,IAAI;AAAA,EAExB,WAAW,SAAQ,OAAO;AAAA,IACvB,MAAM,WAAW,YAAY,IAAI,MAAK,QAAQ,KAAK,CAAC;AAAA,IACpD,SAAS,KAAK,KAAI;AAAA,IAClB,YAAY,IAAI,MAAK,UAAU,QAAQ;AAAA,EAC1C;AAAA,EAEA,YAAY,UAAU,sBAAsB,aAAa;AAAA,IACtD,IAAI,kBAAkB,SAAS,GAAG;AAAA,MAC/B,MAAM,mBAAgC,IAAI;AAAA,MAE1C,SAAS,IAAI,EAAG,IAAI,kBAAkB,QAAQ,KAAK;AAAA,QAChD,SAAS,IAAI,IAAI,EAAG,IAAI,kBAAkB,QAAQ,KAAK;AAAA,UACpD,MAAM,KAAK,kBAAkB;AAAA,UAC7B,MAAM,KAAK,kBAAkB;AAAA,UAC7B,IAAI,CAAC,MAAM,CAAC;AAAA,YAAI;AAAA,UAChB,IAAI,yBAAyB,GAAG,YAAY,GAAG,UAAU,GAAG;AAAA,YACzD,iBAAiB,IAAI,GAAG,EAAE;AAAA,YAC1B,iBAAiB,IAAI,GAAG,EAAE;AAAA,UAC7B;AAAA,QACH;AAAA,MACH;AAAA,MAEA,IAAI,iBAAiB,OAAO,GAAG;AAAA,QAC5B,MAAM,cAAc,kBAAkB,OAAO,CAAC,MAC3C,iBAAiB,IAAI,EAAE,EAAE,CAC5B;AAAA,QACA,UAAU,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,6CAA6C,aAAa,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAAA,UAC3G,SAAS,YAAY,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,UACpC,OAAO;AAAA,UACP,SAAS,EAAE,UAAU,OAAO,YAAY,OAAO;AAAA,QAClD,CAAC;AAAA,MACJ;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGV,IAAM,uBAAuB,CAI1B,UACoD;AAAA,EACpD,MAAM,YAAiD,CAAC;AAAA,EACxD,MAAM,cAAc,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAAA,EAErE,SAAS,IAAI,EAAG,IAAI,YAAY,QAAQ,KAAK;AAAA,IAC1C,MAAM,QAAO,YAAY;AAAA,IACzB,IAAI,CAAC;AAAA,MAAM;AAAA,IAEX,IAAI,CAAC,MAAK;AAAA,MAAS;AAAA,IAEnB,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,MACzB,MAAM,qBAAqB,YAAY;AAAA,MACvC,IAAI,CAAC;AAAA,QAAoB;AAAA,MAEzB,IAAI,CAAC,mBAAmB,WAAW,CAAC,mBAAmB,aAAa;AAAA,QACjE;AAAA,MACH;AAAA,MAEA,IACG,mBAAmB,MAAK,UAAU,MAClC,mBAAmB,mBAAmB,UAAU,GACjD;AAAA,QACC,UAAU,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,SAAS,MAAK,0CAA0C,mBAAmB;AAAA,UACpF,SAAS,CAAC,MAAK,IAAI,mBAAmB,EAAE;AAAA,UACxC,OAAO,CAAC,OAAM,kBAAkB;AAAA,UAChC,SAAS;AAAA,YACN,iBAAiB,MAAK;AAAA,YACtB,cAAc,mBAAmB;AAAA,YACjC,oBACG,mBAAmB,WAAW,MAAK;AAAA,UACzC;AAAA,QACH,CAAC;AAAA,MACJ;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGH,IAAM,kBAAkB,CAI5B,OACA,UAAoC,CAAC,MACe;AAAA,EACpD,MAAM,OAAO,KAAK,qBAAoB,QAAQ;AAAA,EAC9C,MAAM,YAAiD,CAAC;AAAA,EAExD,IAAI,KAAK,mBAAmB;AAAA,IACzB,UAAU,KAAK,GAAG,iBAAiB,KAAK,CAAC;AAAA,EAC5C;AAAA,EAEA,IAAI,KAAK,0BAA0B;AAAA,IAChC,UAAU,KAAK,GAAG,wBAAwB,KAAK,CAAC;AAAA,EACnD;AAAA,EAEA,IAAI,KAAK,4BAA4B;AAAA,IAClC,UAAU,KAAK,GAAG,0BAA0B,KAAK,CAAC;AAAA,EACrD;AAAA,EAEA,IAAI,KAAK,yBAAyB;AAAA,IAC/B,UAAU,KAAK,GAAG,uBAAuB,KAAK,CAAC;AAAA,EAClD;AAAA,EAEA,IAAI,KAAK,uBAAuB;AAAA,IAC7B,UAAU,KAAK,GAAG,qBAAqB,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,OAAO;AAAA;AAGH,IAAM,eAAe,CAIzB,OACA,UAAoC,CAAC,MAC1B;AAAA,EACX,OAAO,gBAAgB,OAAO,OAAO,EAAE,SAAS;AAAA;AAG5C,IAAM,YAAY,CAItB,OACA,UAAoC,CAAC,MAC1B;AAAA,EACX,OAAO,gBAAgB,OAAO,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO;AAAA;AAGrE,IAAM,qBAAqB,CAI/B,WACA,SACoD;AAAA,EACpD,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA;AAG1C,IAAM,yBAAyB,CAInC,WACA,aACoD;AAAA,EACpD,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AAAA;AAGlD,IAAM,kBAAkB,CAI5B,cACU;AAAA,EACV,IAAI,UAAU,WAAW,GAAG;AAAA,IACzB,OAAO;AAAA,EACV;AAAA,EAEA,MAAM,QAAkB,CAAC,SAAS,UAAU,qBAAqB;AAAA,EAEjE,WAAW,YAAY,WAAW;AAAA,IAC/B,MAAM,eACH,SAAS,aAAa,UACjB,YACA,SAAS,aAAa,YACpB,WACA;AAAA,IACV,MAAM,KAAK,KAAK,gBAAgB,SAAS,SAAS,SAAS,SAAS;AAAA,EACvE;AAAA,EAEA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;;ACtbzB;AAAA,sBAGG;AAAA;AAgCH,IAAM,mBAAyC;AAAA,EAC5C,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,uBAAuB;AAC1B;AAEA,IAAM,cAAc,CACjB,MACA,SACA,UACA,aAKmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM,SAAS;AAAA,EACf,QAAQ,SAAS;AAAA,EACjB,SAAS,SAAS;AACrB;AAEA,IAAM,mBAAmB,CAAC,cAA2C;AAAA,EAClE,MAAM,SAAS,IAAI;AAAA,EAEnB,MAAM,WAAW,CAAC,MAAkC;AAAA,IACjD,IAAI,kBAAiB,CAAC,GAAG;AAAA,MACtB,WAAW,SAAS,EAAE,YAAY;AAAA,QAC/B,SAAS,KAAmC;AAAA,MAC/C;AAAA,IACH,EAAO;AAAA,MACJ,OAAO,IAAI,EAAE,KAAK;AAAA;AAAA;AAAA,EAIxB,SAAS,SAAS;AAAA,EAClB,OAAO;AAAA;AAGV,IAAM,6BAA6B,CAChC,WACA,WACiC;AAAA,EACjC,MAAM,SAA2B,CAAC;AAAA,EAClC,MAAM,UAAU,IAAI;AAAA,EAEpB,MAAM,WAAW,CAAC,GAA+B,SAAiB;AAAA,IAC/D,MAAM,KAAK,EAAE;AAAA,IACb,MAAM,QAAQ,QAAQ,IAAI,EAAE,KAAK;AAAA,IACjC,QAAQ,IAAI,IAAI,QAAQ,CAAC;AAAA,IAEzB,IAAI,QAAQ,GAAG;AAAA,MACZ,OAAO,KACJ,YACG,0BACA,2BAA2B,yBAC3B,SACA,EAAE,MAAM,QAAQ,OAAO,EAAE,aAAa,GAAG,EAAE,CAC9C,CACH;AAAA,IACH;AAAA,IAEA,IAAI,kBAAiB,CAAC,GAAG;AAAA,MACtB,EAAE,WAAW,QAAQ,CAAC,OAAO,MAAM;AAAA,QAChC,SAAS,OAAqC,GAAG,QAAQ,IAAI;AAAA,OAC/D;AAAA,IACJ;AAAA;AAAA,EAGH,SAAS,WAAW,YAAY;AAAA,EAChC,OAAO;AAAA;AAGV,IAAM,qBAAqB,CAIxB,OACA,YACiC;AAAA,EACjC,MAAM,SAA2B,CAAC;AAAA,EAElC,OAAO,KAAK,GAAG,2BAA2B,MAAK,YAAY,MAAK,EAAE,CAAC;AAAA,EAEnE,IAAI,MAAK,WAAW,GAAG;AAAA,IACpB,OAAO,KACJ,YACG,qBACA,SAAS,MAAK,gCAAgC,MAAK,YACnD,WACA,EAAE,QAAQ,MAAK,IAAI,OAAO,EAAE,UAAU,MAAK,SAAS,EAAE,CACzD,CACH;AAAA,EACH;AAAA,EAEA,IAAI,MAAK,WAAW,MAAM;AAAA,IACvB,OAAO,KACJ,YACG,oBACA,SAAS,MAAK,iCAAiC,MAAK,YACpD,QACA,EAAE,QAAQ,MAAK,IAAI,OAAO,EAAE,UAAU,MAAK,SAAS,EAAE,CACzD,CACH;AAAA,EACH;AAAA,EAEA,IAAI,MAAK,aAAa,WAAW,GAAG;AAAA,IACjC,OAAO,KACJ,YACG,mBACA,SAAS,MAAK,qCACd,WACA,EAAE,QAAQ,MAAK,GAAG,CACrB,CACH;AAAA,EACH;AAAA,EAEA,IAAI,QAAQ,qBAAqB,MAAK,UAAU;AAAA,IAC7C,IAAI,CAAC,QAAQ,kBAAkB,SAAS,MAAK,QAAQ,GAAG;AAAA,MACrD,OAAO,KACJ,YACG,oBACA,SAAS,MAAK,+BAA+B,MAAK,YAClD,SACA;AAAA,QACG,QAAQ,MAAK;AAAA,QACb,OAAO;AAAA,UACJ,UAAU,MAAK;AAAA,UACf,mBAAmB,CAAC,GAAG,QAAQ,iBAAiB;AAAA,QACnD;AAAA,MACH,CACH,CACH;AAAA,IACH;AAAA,EACH;AAAA,EAEA,IAAI,QAAQ,aAAa;AAAA,IACtB,MAAM,cAAc,MAAK,KAAK,OAC3B,CAAC,MAAM,CAAC,QAAQ,aAAa,SAAS,CAAC,CAC1C;AAAA,IACA,IAAI,YAAY,SAAS,GAAG;AAAA,MACzB,OAAO,KACJ,YACG,gBACA,SAAS,MAAK,2BAA2B,YAAY,KAAK,IAAI,KAC9D,WACA;AAAA,QACG,QAAQ,MAAK;AAAA,QACb,OAAO;AAAA,UACJ;AAAA,UACA,aAAa,CAAC,GAAG,QAAQ,WAAW;AAAA,QACvC;AAAA,MACH,CACH,CACH;AAAA,IACH;AAAA,EACH;AAAA,EAEA,IAAI,QAAQ,gBAAgB;AAAA,IACzB,MAAM,aAAa,iBAAiB,MAAK,UAAU;AAAA,IACnD,MAAM,gBAAgB,QAAQ,eAAe,OAC1C,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAC3B;AAAA,IACA,IAAI,cAAc,SAAS,GAAG;AAAA,MAC3B,OAAO,KACJ,YACG,2BACA,SAAS,MAAK,qCAAqC,cAAc,KAAK,IAAI,KAC1E,WACA,EAAE,QAAQ,MAAK,IAAI,OAAO,EAAE,cAAc,EAAE,CAC/C,CACH;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGV,IAAM,wBAAwB,CAI3B,SACA,UACiC;AAAA,EACjC,MAAM,SAA2B,CAAC;AAAA,EAClC,MAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,EAE9C,WAAW,UAAU,QAAQ,SAAS;AAAA,IACnC,IAAI,CAAC,QAAQ,IAAI,MAAM,GAAG;AAAA,MACvB,OAAO,KACJ,YACG,0BACA,YAAY,QAAQ,uCAAuC,UAC3D,SACA,EAAE,OAAO,EAAE,WAAW,QAAQ,IAAI,eAAe,OAAO,EAAE,CAC7D,CACH;AAAA,IACH;AAAA,EACH;AAAA,EAEA,IAAI,QAAQ,QAAQ,WAAW,GAAG;AAAA,IAC/B,OAAO,KACJ,YACG,iBACA,YAAY,QAAQ,2BACpB,WACA,EAAE,OAAO,EAAE,WAAW,QAAQ,GAAG,EAAE,CACtC,CACH;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,QAAQ,QAAQ,OAClC,CAAC,IAAI,MAAM,QAAQ,QAAQ,QAAQ,EAAE,MAAM,CAC9C;AAAA,EACA,IAAI,aAAa,SAAS,GAAG;AAAA,IAC1B,OAAO,KACJ,YACG,6BACA,YAAY,QAAQ,6CAA6C,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC,EAAE,KAAK,IAAI,KACrG,WACA,EAAE,OAAO,EAAE,WAAW,QAAQ,IAAI,aAAa,EAAE,CACpD,CACH;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGV,IAAM,wBAAwB,CAI3B,UACiC;AAAA,EACjC,MAAM,SAA2B,CAAC;AAAA,EAClC,MAAM,aAAa,IAAI;AAAA,EAKvB,WAAW,SAAQ,OAAO;AAAA,IACvB,MAAM,WAAW,CAAC,MAAkC;AAAA,MACjD,IAAI,kBAAiB,CAAC,GAAG;AAAA,QACtB,WAAW,SAAS,EAAE,YAAY;AAAA,UAC/B,SAAS,KAAmC;AAAA,QAC/C;AAAA,MACH,EAAO;AAAA,QACJ,MAAM,WAAW,WAAW,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,QAC7C,SAAS,KAAK;AAAA,UACX,MAAM,EAAE;AAAA,UACR,QAAQ,MAAK;AAAA,UACb,UAAU,MAAK;AAAA,QAClB,CAAC;AAAA,QACD,WAAW,IAAI,EAAE,OAAO,QAAQ;AAAA;AAAA;AAAA,IAItC,SAAS,MAAK,UAAU;AAAA,EAC3B;AAAA,EAEA,YAAY,OAAO,UAAU,YAAY;AAAA,IACtC,MAAM,cAAc,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAAA,IACzD,IAAI,YAAY,SAAS,GAAG;AAAA,MACzB,OAAO,KACJ,YACG,2BACA,UAAU,wCAAwC,YAAY,KAAK,IAAI,KACvE,WACA;AAAA,QACG,OAAO;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,OAAO,MAAM,IAAI,CAAC,OAAO;AAAA,YACtB,IAAI,EAAE;AAAA,YACN,MAAM,EAAE;AAAA,YACR,MAAM,EAAE;AAAA,UACX,EAAE;AAAA,QACL;AAAA,MACH,CACH,CACH;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGH,IAAM,iBAAiB,CAI3B,OACA,WAAmC,CAAC,GACpC,UAAiC,CAAC,MACV;AAAA,EACxB,MAAM,OAAO,KAAK,qBAAoB,QAAQ;AAAA,EAC9C,MAAM,SAA2B,CAAC;AAAA,EAElC,WAAW,SAAQ,OAAO;AAAA,IACvB,OAAO,KAAK,GAAG,mBAAmB,OAAM,IAAI,CAAC;AAAA,EAChD;AAAA,EAEA,WAAW,WAAW,UAAU;AAAA,IAC7B,OAAO,KAAK,GAAG,sBAAsB,SAAS,KAAK,CAAC;AAAA,EACvD;AAAA,EAEA,IAAI,KAAK,uBAAuB;AAAA,IAC7B,OAAO,KAAK,GAAG,sBAAsB,KAAK,CAAC;AAAA,EAC9C;AAAA,EAEA,OAAO;AAAA,IACJ,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,EAAE,WAAW;AAAA,IAC/D;AAAA,EACH;AAAA;AAGI,IAAM,yBAAyB,CAInC,OACA,mBAME;AAAA,EACF,MAAM,YAAY,IAAI;AAAA,EAEtB,WAAW,SAAQ,OAAO;AAAA,IACvB,MAAM,aAAa,iBAAiB,MAAK,UAAU;AAAA,IACnD,WAAW,SAAS,YAAY;AAAA,MAC7B,UAAU,IAAI,KAAK;AAAA,IACtB;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,IAAI,IAAI,cAAc;AAAA,EAC1C,MAAM,gBAAgB,CAAC,GAAG,cAAc,EAAE,OAAO,CAAC,MAAM,UAAU,IAAI,CAAC,CAAC;AAAA,EACxE,MAAM,kBAAkB,CAAC,GAAG,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;AAAA,EAC3E,MAAM,cAAc,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;AAAA,EAEpE,OAAO;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBACG,eAAe,SAAS,IAClB,cAAc,SAAS,eAAe,SAAU,MACjD;AAAA,EACX;AAAA;AAGI,IAAM,gBAAgB,CAI1B,UACyB;AAAA,EACzB,MAAM,SAAS,IAAI;AAAA,EAEnB,WAAW,SAAQ,OAAO;AAAA,IACvB,MAAM,aAAa,iBAAiB,MAAK,UAAU;AAAA,IACnD,WAAW,SAAS,YAAY;AAAA,MAC7B,OAAO,IAAI,KAAK;AAAA,IACnB;AAAA,EACH;AAAA,EAEA,OAAO,CAAC,GAAG,MAAM,EAAE,KAAK;AAAA;AAGpB,IAAM,mBAAmB,CAI7B,UACoE;AAAA,EACpE,MAAM,YACH,CAAC;AAAA,EACJ,MAAM,OAAO,IAAI;AAAA,EAEjB,WAAW,SAAQ,OAAO;AAAA,IACvB,MAAM,WAAW,CAAC,MAAkC;AAAA,MACjD,IAAI,kBAAiB,CAAC,GAAG;AAAA,QACtB,WAAW,SAAS,EAAE,YAAY;AAAA,UAC/B,SAAS,KAAmC;AAAA,QAC/C;AAAA,MACH,EAAO;AAAA,QACJ,MAAM,MAAM,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE;AAAA,QAC1C,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAAA,UACjB,KAAK,IAAI,GAAG;AAAA,UACZ,UAAU,KAAK;AAAA,YACZ,OAAO,EAAE;AAAA,YACT,UAAU,EAAE;AAAA,YACZ,MAAM,EAAE;AAAA,UACX,CAAC;AAAA,QACJ;AAAA;AAAA;AAAA,IAIN,SAAS,MAAK,UAAU;AAAA,EAC3B;AAAA,EAEA,OAAO;AAAA;AAGH,IAAM,wBAAwB,CAAC,WAAyC;AAAA,EAC5E,IAAI,OAAO,SAAS,OAAO,OAAO,WAAW,GAAG;AAAA,IAC7C,OAAO;AAAA,EACV;AAAA,EAEA,MAAM,QAAkB;AAAA,IACrB,OAAO,QACF,+BAA+B,OAAO,OAAO,sBAC7C,+BAA+B,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,EAAE;AAAA,EAC3F;AAAA,EAEA,MAAM,UAAU;AAAA,IACb,OAAO,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO;AAAA,IACzD,SAAS,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS;AAAA,IAC7D,MAAM,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM;AAAA,EAC1D;AAAA,EAEA,YAAY,UAAU,WAAW,OAAO,QAAQ,OAAO,GAAG;AAAA,IACvD,IAAI,OAAO,SAAS,GAAG;AAAA,MACpB,MAAM,KAAK;AAAA,EAAK,SAAS,YAAY,OAAO,OAAO,UAAU;AAAA,MAC7D,WAAW,SAAS,QAAQ;AAAA,QACzB,MAAM,KAAK,QAAQ,MAAM,SAAS,MAAM,SAAS;AAAA,MACpD;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;;ACvdzB;AAAA,sBAGG;AAAA;AAEH,cAAS;AAWF,IAAM,wBAAwB,GAAE,OAAO;AAAA,EAC3C,MAAM,GAAE,OAAO;AAAA,EACf,SAAS,GAAE,OAAO;AAAA,EAClB,MAAM,GAAE,OAAO;AAClB,CAAC;AAGM,IAAM,yBAAyB,GAAE,OAAO;AAAA,EAC5C,OAAO,GAAE,QAAQ;AAAA,EACjB,QAAQ,GAAE,MAAM,qBAAqB;AACxC,CAAC;AAGM,IAAM,0BAA0B,GAAE,OAAO;AAAA,EAC7C,oBAAoB,GAAE,QAAQ,EAAE,SAAS;AAAA,EACzC,sBAAsB,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC3C,YAAY,GAAE,QAAQ,EAAE,SAAS;AACpC,CAAC;AAcD,IAAM,mBAAqC,wBAAwB,MAAM,CAAC,CAAC;AAE3E,IAAM,cAAc,CACjB,MACA,SACA,UACoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACH;AAEA,IAAM,cAAc,OAAyB;AAAA,EAC1C,OAAO;AAAA,EACP,QAAQ,CAAC;AACZ;AAEA,IAAM,gBAAgB,CACnB,YACqB;AAAA,EACrB,OAAO;AAAA,EACP,QAAQ,CAAC,GAAG,MAAM;AACrB;AAEA,IAAM,6BAA6B,CAChC,WACA,SACkC;AAAA,EAClC,MAAM,SAA4B,CAAC;AAAA,EAEnC,IAAI,kBAAiB,SAAS,GAAG;AAAA,IAC9B,IAAI,CAAC,UAAU,MAAM,OAAO,UAAU,OAAO,UAAU;AAAA,MACpD,OAAO,KACJ,YACG,GAAG,WACH,yCACA,kBACH,CACH;AAAA,IACH;AAAA,IAEA,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,SAAS,UAAU,QAAQ,GAAG;AAAA,MAC9C,OAAO,KACJ,YACG,GAAG,iBACH,qBAAqB,UAAU,mCAC/B,wBACH,CACH;AAAA,IACH;AAAA,IAEA,IAAI,CAAC,MAAM,QAAQ,UAAU,UAAU,GAAG;AAAA,MACvC,OAAO,KACJ,YACG,GAAG,mBACH,gDACA,0BACH,CACH;AAAA,IACH,EAAO,SAAI,UAAU,WAAW,WAAW,GAAG;AAAA,MAC3C,OAAO,KACJ,YACG,GAAG,mBACH,oDACA,wBACH,CACH;AAAA,IACH,EAAO;AAAA,MACJ,SAAS,IAAI,EAAG,IAAI,UAAU,WAAW,QAAQ,KAAK;AAAA,QACnD,MAAM,eAAe,2BAClB,UAAU,WAAW,IACrB,GAAG,mBAAmB,IACzB;AAAA,QACA,OAAO,KAAK,GAAG,YAAY;AAAA,MAC9B;AAAA;AAAA,EAEN,EAAO;AAAA,IACJ,IAAI,CAAC,UAAU,MAAM,OAAO,UAAU,OAAO,UAAU;AAAA,MACpD,OAAO,KACJ,YACG,GAAG,WACH,mCACA,sBACH,CACH;AAAA,IACH;AAAA,IAEA,IAAI,CAAC,UAAU,QAAQ,OAAO,UAAU,SAAS,UAAU;AAAA,MACxD,OAAO,KACJ,YACG,GAAG,aACH,8BACA,wBACH,CACH;AAAA,IACH;AAAA,IAEA,IAAI,CAAC,UAAU,SAAS,OAAO,UAAU,UAAU,UAAU;AAAA,MAC1D,OAAO,KACJ,YACG,GAAG,cACH,+BACA,yBACH,CACH;AAAA,IACH;AAAA,IAEA,IAAI,CAAC,UAAU,YAAY,OAAO,UAAU,aAAa,UAAU;AAAA,MAChE,OAAO,KACJ,YACG,GAAG,iBACH,mCACA,4BACH,CACH;AAAA,IACH;AAAA;AAAA,EAGH,OAAO;AAAA;AAGV,IAAM,+BAA+B,CAGlC,cACA,oBACA,aAAa,UACqB;AAAA,EAClC,MAAM,SAA4B,CAAC;AAAA,EAEnC,SAAS,IAAI,EAAG,IAAI,aAAa,QAAQ,KAAK;AAAA,IAC3C,MAAM,cAAc,aAAa;AAAA,IACjC,IAAI,CAAC;AAAA,MAAa;AAAA,IAClB,MAAM,OAAO,gBAAgB;AAAA,IAE7B,IAAI,CAAC,YAAY,QAAQ,OAAO,YAAY,SAAS,UAAU;AAAA,MAC5D,OAAO,KACJ,YACG,GAAG,aACH,gCACA,0BACH,CACH;AAAA,MACA;AAAA,IACH;AAAA,IAEA,IAAI,cAAc,oBAAoB;AAAA,MACnC,MAAM,SAAS,mBAAmB,YAAY;AAAA,MAC9C,IAAI,CAAC,QAAQ;AAAA,QACV,OAAO,KACJ,YACG,GAAG,aACH,6BAA6B,YAAY,QACzC,0BACH,CACH;AAAA,MACH,EAAO;AAAA,QACJ,MAAM,SAAS,OAAO,UAAU,YAAY,OAAO;AAAA,QACnD,IAAI,CAAC,OAAO,SAAS;AAAA,UAClB,WAAW,SAAS,OAAO,MAAM,QAAQ;AAAA,YACtC,OAAO,KACJ,YACG,GAAG,gBAAgB,MAAM,KAAK,KAAK,GAAG,KACtC,MAAM,SACN,6BACH,CACH;AAAA,UACH;AAAA,QACH;AAAA;AAAA,IAEN;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGH,IAAM,eAAe,CAIzB,OACA,UAAsE,CAAC,MACnD;AAAA,EACpB,MAAM,OAAO,KAAK,qBAAoB,QAAQ;AAAA,EAC9C,MAAM,SAA4B,CAAC;AAAA,EAEnC,MAAM,eAAe,WAAW,UAAU,KAAI;AAAA,EAC9C,IAAI,CAAC,aAAa,SAAS;AAAA,IACxB,WAAW,SAAS,aAAa,MAAM,QAAQ;AAAA,MAC5C,OAAO,KACJ,YACG,MAAM,KAAK,KAAK,GAAG,GACnB,MAAM,SACN,0BACH,CACH;AAAA,IACH;AAAA,IACA,OAAO,cAAc,MAAM;AAAA,EAC9B;AAAA,EAEA,MAAM,YAAY,aAAa;AAAA,EAE/B,IAAI,KAAK,oBAAoB;AAAA,IAC1B,MAAM,kBAAkB,2BACrB,UAAU,YACV,YACH;AAAA,IACA,OAAO,KAAK,GAAG,eAAe;AAAA,EACjC;AAAA,EAEA,IAAI,KAAK,wBAAwB,KAAK,YAAY;AAAA,IAC/C,MAAM,oBAAoB,6BACvB,UAAU,cAIV,KAAK,oBACL,KAAK,cAAc,KACtB;AAAA,IACA,OAAO,KAAK,GAAG,iBAAiB;AAAA,EACnC;AAAA,EAEA,OAAO,OAAO,SAAS,IAAI,cAAc,MAAM,IAAI,YAAY;AAAA;AAG3D,IAAM,gBAAgB,CAI1B,OACA,UAAsE,CAAC,MACnD;AAAA,EACpB,MAAM,SAA4B,CAAC;AAAA,EAEnC,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACpC,MAAM,SAAS,aAAsC,MAAM,IAAI,OAAO;AAAA,IACtE,IAAI,CAAC,OAAO,OAAO;AAAA,MAChB,WAAW,SAAS,OAAO,QAAQ;AAAA,QAChC,OAAO,KACJ,YACG,SAAS,MAAM,MAAM,QACrB,MAAM,SACN,MAAM,IACT,CACH;AAAA,MACH;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO,OAAO,SAAS,IAAI,cAAc,MAAM,IAAI,YAAY;AAAA;AAG3D,IAAM,kBAAkB,CAAC,YAAuC;AAAA,EACpE,MAAM,SAA4B,CAAC;AAAA,EAEnC,MAAM,eAAe,cAAc,UAAU,OAAO;AAAA,EACpD,IAAI,CAAC,aAAa,SAAS;AAAA,IACxB,WAAW,SAAS,aAAa,MAAM,QAAQ;AAAA,MAC5C,OAAO,KACJ,YACG,MAAM,KAAK,KAAK,GAAG,GACnB,MAAM,SACN,0BACH,CACH;AAAA,IACH;AAAA,IACA,OAAO,cAAc,MAAM;AAAA,EAC9B;AAAA,EAEA,OAAO,YAAY;AAAA;AAGf,IAAM,qBAAqB,CAC/B,gBACoB;AAAA,EACpB,MAAM,SAAS,2BAA2B,aAAY,YAAY;AAAA,EAClE,OAAO,OAAO,SAAS,IAAI,cAAc,MAAM,IAAI,YAAY;AAAA;AAG3D,IAAM,YAAY,CAItB,OACA,UAAsE,CAAC,MACtC;AAAA,EACjC,MAAM,SAAS,aAAsC,OAAM,OAAO;AAAA,EAClE,IAAI,CAAC,OAAO,OAAO;AAAA,IAChB,MAAM,IAAI,MACP,iBAAiB,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GACjE;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAGH,IAAM,gBAAgB,CAI1B,OACA,UAAsE,CAAC,MAGP;AAAA,EAChE,MAAM,SAAS,aAAsC,OAAM,OAAO;AAAA,EAClE,IAAI,CAAC,OAAO,OAAO;AAAA,IAChB,OAAO,EAAE,SAAS,OAAO,QAAQ,OAAO,OAAO;AAAA,EAClD;AAAA,EACA,OAAO,EAAE,SAAS,MAAM,MAAM,MAAsC;AAAA;AAGhE,IAAM,sBAAsB,CAIhC,oBACA,iBAAoC,CAAC,MACnC;AAAA,EACF,OAAO;AAAA,IACJ,UAAU,CAAC,OAAe,UAA6B,CAAC,MACrD,aAAsC,OAAM;AAAA,SACtC;AAAA,SACA;AAAA,MACH;AAAA,IACH,CAAC;AAAA,IACJ,OAAO,CAAC,OAAe,UAA6B,CAAC,MAClD,UAAmC,OAAM;AAAA,SACnC;AAAA,SACA;AAAA,MACH;AAAA,IACH,CAAC;AAAA,IACJ,WAAW,CAAC,OAAe,UAA6B,CAAC,MACtD,cAAuC,OAAM;AAAA,SACvC;AAAA,SACA;AAAA,MACH;AAAA,IACH,CAAC;AAAA,EACP;AAAA;;ACxVI,IAAM,qBAAqB,OAGa;AAAA,EAC5C,WAAW,IAAI;AAClB;AAEO,IAAM,aAAa,CAIvB,OACA,OACA,YACA,UAAoD,CAAC,MACZ;AAAA,EACzC,MAAM,YAAY,IAAI,IAAI,MAAM,SAAS;AAAA,EACzC,MAAM,kBAAkB,UAAU,IAAI,MAAK,EAAE;AAAA,EAE7C,MAAM,iBAAiB,kBAClB,gBAAgB,iBAAiB,IACjC;AAAA,EAEL,MAAM,UAAgD;AAAA,IACnD,WAAW,WAAW;AAAA,IACtB,QAAQ,MAAK;AAAA,IACb,SAAS;AAAA,IACT,MAAM,KAAK,MAAK;AAAA,IAChB,WAAW,IAAI;AAAA,IACf,WAAW,QAAQ;AAAA,IACnB,SAAS,QAAQ;AAAA,IACjB;AAAA,EACH;AAAA,EAEA,MAAM,aAAsD;AAAA,IACzD,QAAQ,MAAK;AAAA,IACb;AAAA,IACA,UAAU,kBACL,CAAC,GAAG,gBAAgB,UAAU,OAAO,IACrC,CAAC,OAAO;AAAA,EAChB;AAAA,EAEA,UAAU,IAAI,MAAK,IAAI,UAAU;AAAA,EAEjC,OAAO,EAAE,UAAU;AAAA;AAGf,IAAM,aAAa,CAIvB,OACA,WACuD;AAAA,EACvD,OAAO,MAAM,UAAU,IAAI,MAAM;AAAA;AAG7B,IAAM,aAAa,CAIvB,OACA,QACA,YACoD;AAAA,EACpD,MAAM,UAAU,MAAM,UAAU,IAAI,MAAM;AAAA,EAC1C,IAAI,CAAC;AAAA,IAAS;AAAA,EACd,OAAO,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO;AAAA;AAGrD,IAAM,mBAAmB,CAI7B,OACA,WACoD;AAAA,EACpD,MAAM,UAAU,MAAM,UAAU,IAAI,MAAM;AAAA,EAC1C,IAAI,CAAC,WAAW,QAAQ,SAAS,WAAW;AAAA,IAAG;AAAA,EAC/C,OAAO,QAAQ,SAAS,QAAQ,SAAS,SAAS;AAAA;AAG9C,IAAM,iBAAiB,CAI3B,OACA,WACuD;AAAA,EACvD,MAAM,UAAU,MAAM,UAAU,IAAI,MAAM;AAAA,EAC1C,OAAO,SAAS,YAAY,CAAC;AAAA;AAGzB,IAAM,oBAAoB,CAI9B,OACA,QACA,eACA,UAAoD,CAAC,MAInD;AAAA,EACF,MAAM,sBAAsB,WAAW,OAAO,QAAQ,aAAa;AAAA,EACnE,IAAI,CAAC,qBAAqB;AAAA,IACvB,OAAO,EAAE,OAAO,MAAM,UAAU;AAAA,EACnC;AAAA,EAEA,MAAM,iBAAgD;AAAA,OAChD,oBAAoB;AAAA,IACvB,WAAW,IAAI;AAAA,EAClB;AAAA,EAEA,MAAM,WAAW,WAAW,OAAO,gBAAgB,UAAU;AAAA,IAC1D,WAAW,QAAQ;AAAA,IACnB,SAAS,QAAQ,WAAW,uBAAuB;AAAA,EACtD,CAAC;AAAA,EAED,OAAO,EAAE,OAAO,UAAU,MAAM,eAAe;AAAA;AAG3C,IAAM,kBAAkB,CAI5B,OACA,QACA,UACA,aASS;AAAA,EACT,MAAM,KAAK,WAAW,OAAO,QAAQ,QAAQ;AAAA,EAC7C,MAAM,KAAK,WAAW,OAAO,QAAQ,QAAQ;AAAA,EAE7C,IAAI,CAAC,MAAM,CAAC,IAAI;AAAA,IACb,OAAO;AAAA,EACV;AAAA,EAEA,MAAM,cAID,CAAC;AAAA,EAEN,MAAM,gBAAgB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACH;AAAA,EAEA,WAAW,SAAS,eAAe;AAAA,IAChC,MAAM,WAAW,GAAG,KAAK;AAAA,IACzB,MAAM,WAAW,GAAG,KAAK;AAAA,IACzB,IAAI,KAAK,UAAU,QAAQ,MAAM,KAAK,UAAU,QAAQ,GAAG;AAAA,MACxD,YAAY,KAAK,EAAE,OAAO,UAAU,SAAS,CAAC;AAAA,IACjD;AAAA,EACH;AAAA,EAEA,IACG,KAAK,UAAU,GAAG,KAAK,UAAU,MAAM,KAAK,UAAU,GAAG,KAAK,UAAU,GACzE;AAAA,IACC,YAAY,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU,GAAG,KAAK;AAAA,MAClB,UAAU,GAAG,KAAK;AAAA,IACrB,CAAC;AAAA,EACJ;AAAA,EAEA,IACG,KAAK,UAAU,GAAG,KAAK,YAAY,MACnC,KAAK,UAAU,GAAG,KAAK,YAAY,GACpC;AAAA,IACC,YAAY,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU,GAAG,KAAK;AAAA,MAClB,UAAU,GAAG,KAAK;AAAA,IACrB,CAAC;AAAA,EACJ;AAAA,EAEA,IAAI,KAAK,UAAU,GAAG,KAAK,IAAI,MAAM,KAAK,UAAU,GAAG,KAAK,IAAI,GAAG;AAAA,IAChE,YAAY,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU,GAAG,KAAK;AAAA,MAClB,UAAU,GAAG,KAAK;AAAA,IACrB,CAAC;AAAA,EACJ;AAAA,EAEA,OAAO,EAAE,UAAU,IAAI,UAAU,IAAI,YAAY;AAAA;AAG7C,IAAM,yBAAyB,CAInC,OACA,WACA,YACuD;AAAA,EACvD,MAAM,WAAmD,CAAC;AAAA,EAE1D,WAAW,WAAW,MAAM,UAAU,OAAO,GAAG;AAAA,IAC7C,WAAW,WAAW,QAAQ,UAAU;AAAA,MACrC,IAAI,QAAQ,aAAa,aAAa,QAAQ,aAAa,SAAS;AAAA,QACjE,SAAS,KAAK,OAAO;AAAA,MACxB;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO,SAAS,KACb,CAAC,GAAG,MAAM,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CACzD;AAAA;AAGI,IAAM,0BAA0B,CAIpC,OACA,eACuD;AAAA,EACvD,MAAM,WAAmD,CAAC;AAAA,EAE1D,WAAW,WAAW,MAAM,UAAU,OAAO,GAAG;AAAA,IAC7C,WAAW,WAAW,QAAQ,UAAU;AAAA,MACrC,IAAI,QAAQ,eAAe,YAAY;AAAA,QACpC,SAAS,KAAK,OAAO;AAAA,MACxB;AAAA,IACH;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGH,IAAM,mBAAmB,CAI7B,OACA,cACyC;AAAA,EACzC,MAAM,YAAY,IAAI;AAAA,EAEtB,YAAY,QAAQ,YAAY,MAAM,WAAW;AAAA,IAC9C,MAAM,iBACH,QAAQ,SAAS,SAAS,YACrB,QAAQ,SAAS,MAAM,CAAC,SAAS,IACjC,QAAQ;AAAA,IAEhB,UAAU,IAAI,QAAQ;AAAA,MACnB;AAAA,MACA,gBAAgB,QAAQ;AAAA,MACxB,UAAU;AAAA,IACb,CAAC;AAAA,EACJ;AAAA,EAEA,OAAO,EAAE,UAAU;AAAA;AAGf,IAAM,uBAAuB,CAIjC,YACU;AAAA,EACV,MAAM,QAAkB;AAAA,IACrB,iCAAiC,QAAQ;AAAA,IACzC,oBAAoB,QAAQ;AAAA,IAC5B,mBAAmB,QAAQ,SAAS;AAAA,IACpC;AAAA,EACH;AAAA,EAEA,WAAW,WAAW,QAAQ,UAAU;AAAA,IACrC,MAAM,KACH,IAAI,QAAQ,aAAa,QAAQ,eAAe,QAAQ,UAAU,YAAY,IACjF;AAAA,IACA,IAAI,QAAQ,WAAW;AAAA,MACpB,MAAM,KAAK,SAAS,QAAQ,WAAW;AAAA,IAC1C;AAAA,IACA,IAAI,QAAQ,SAAS;AAAA,MAClB,MAAM,KAAK,cAAc,QAAQ,SAAS;AAAA,IAC7C;AAAA,EACH;AAAA,EAEA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;",
35
+ "debugId": "FB71FB159972A03264756E2164756E21",
36
+ "names": []
37
+ }