@ruvector/ruvllm 3.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/GPU-LOOP.md +229 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +9 -0
  4. package/README.md +159 -360
  5. package/examples/gpu-loop.example.json +26 -0
  6. package/package.json +50 -121
  7. package/src/adapters-cli.mjs +23 -0
  8. package/src/adapters.mjs +91 -0
  9. package/src/cli.mjs +30 -0
  10. package/src/engine.mjs +238 -0
  11. package/src/fixture.mjs +38 -0
  12. package/src/gpu-host.mjs +47 -0
  13. package/src/gpu-loop-cli.mjs +67 -0
  14. package/src/gpu-loop.mjs +184 -0
  15. package/src/gpu-spool-adapter.mjs +80 -0
  16. package/src/vast-host-adapter.mjs +274 -0
  17. package/bin/cli.js +0 -1040
  18. package/dist/cjs/benchmarks/embedding-benchmark.d.ts +0 -102
  19. package/dist/cjs/benchmarks/embedding-benchmark.d.ts.map +0 -1
  20. package/dist/cjs/benchmarks/embedding-benchmark.js +0 -436
  21. package/dist/cjs/benchmarks/index.d.ts +0 -34
  22. package/dist/cjs/benchmarks/index.d.ts.map +0 -1
  23. package/dist/cjs/benchmarks/index.js +0 -132
  24. package/dist/cjs/benchmarks/model-comparison.d.ts +0 -71
  25. package/dist/cjs/benchmarks/model-comparison.d.ts.map +0 -1
  26. package/dist/cjs/benchmarks/model-comparison.js +0 -476
  27. package/dist/cjs/benchmarks/routing-benchmark.d.ts +0 -70
  28. package/dist/cjs/benchmarks/routing-benchmark.d.ts.map +0 -1
  29. package/dist/cjs/benchmarks/routing-benchmark.js +0 -289
  30. package/dist/cjs/contrastive.d.ts +0 -229
  31. package/dist/cjs/contrastive.d.ts.map +0 -1
  32. package/dist/cjs/contrastive.js +0 -589
  33. package/dist/cjs/engine.d.ts +0 -160
  34. package/dist/cjs/engine.d.ts.map +0 -1
  35. package/dist/cjs/engine.js +0 -552
  36. package/dist/cjs/export.d.ts +0 -182
  37. package/dist/cjs/export.d.ts.map +0 -1
  38. package/dist/cjs/export.js +0 -422
  39. package/dist/cjs/federated.d.ts +0 -233
  40. package/dist/cjs/federated.d.ts.map +0 -1
  41. package/dist/cjs/federated.js +0 -525
  42. package/dist/cjs/index.d.ts +0 -68
  43. package/dist/cjs/index.d.ts.map +0 -1
  44. package/dist/cjs/index.js +0 -104
  45. package/dist/cjs/intelligence.d.ts +0 -136
  46. package/dist/cjs/intelligence.d.ts.map +0 -1
  47. package/dist/cjs/intelligence.js +0 -226
  48. package/dist/cjs/lora.d.ts +0 -251
  49. package/dist/cjs/lora.d.ts.map +0 -1
  50. package/dist/cjs/lora.js +0 -509
  51. package/dist/cjs/models.d.ts +0 -129
  52. package/dist/cjs/models.d.ts.map +0 -1
  53. package/dist/cjs/models.js +0 -323
  54. package/dist/cjs/native.d.ts +0 -140
  55. package/dist/cjs/native.d.ts.map +0 -1
  56. package/dist/cjs/native.js +0 -98
  57. package/dist/cjs/session.d.ts +0 -80
  58. package/dist/cjs/session.d.ts.map +0 -1
  59. package/dist/cjs/session.js +0 -203
  60. package/dist/cjs/simd.d.ts +0 -90
  61. package/dist/cjs/simd.d.ts.map +0 -1
  62. package/dist/cjs/simd.js +0 -209
  63. package/dist/cjs/sona.d.ts +0 -223
  64. package/dist/cjs/sona.d.ts.map +0 -1
  65. package/dist/cjs/sona.js +0 -562
  66. package/dist/cjs/streaming.d.ts +0 -55
  67. package/dist/cjs/streaming.d.ts.map +0 -1
  68. package/dist/cjs/streaming.js +0 -131
  69. package/dist/cjs/training.d.ts +0 -312
  70. package/dist/cjs/training.d.ts.map +0 -1
  71. package/dist/cjs/training.js +0 -610
  72. package/dist/cjs/types.d.ts +0 -696
  73. package/dist/cjs/types.d.ts.map +0 -1
  74. package/dist/cjs/types.js +0 -6
  75. package/dist/esm/benchmarks/embedding-benchmark.d.ts +0 -102
  76. package/dist/esm/benchmarks/embedding-benchmark.d.ts.map +0 -1
  77. package/dist/esm/benchmarks/embedding-benchmark.js +0 -427
  78. package/dist/esm/benchmarks/index.d.ts +0 -34
  79. package/dist/esm/benchmarks/index.d.ts.map +0 -1
  80. package/dist/esm/benchmarks/index.js +0 -110
  81. package/dist/esm/benchmarks/model-comparison.d.ts +0 -71
  82. package/dist/esm/benchmarks/model-comparison.d.ts.map +0 -1
  83. package/dist/esm/benchmarks/model-comparison.js +0 -434
  84. package/dist/esm/benchmarks/routing-benchmark.d.ts +0 -70
  85. package/dist/esm/benchmarks/routing-benchmark.d.ts.map +0 -1
  86. package/dist/esm/benchmarks/routing-benchmark.js +0 -283
  87. package/dist/esm/contrastive.d.ts +0 -229
  88. package/dist/esm/contrastive.d.ts.map +0 -1
  89. package/dist/esm/contrastive.js +0 -578
  90. package/dist/esm/engine.d.ts +0 -160
  91. package/dist/esm/engine.d.ts.map +0 -1
  92. package/dist/esm/engine.js +0 -548
  93. package/dist/esm/export.d.ts +0 -182
  94. package/dist/esm/export.d.ts.map +0 -1
  95. package/dist/esm/export.js +0 -414
  96. package/dist/esm/federated.d.ts +0 -233
  97. package/dist/esm/federated.d.ts.map +0 -1
  98. package/dist/esm/federated.js +0 -520
  99. package/dist/esm/index.d.ts +0 -68
  100. package/dist/esm/index.d.ts.map +0 -1
  101. package/dist/esm/index.js +0 -84
  102. package/dist/esm/intelligence.d.ts +0 -136
  103. package/dist/esm/intelligence.d.ts.map +0 -1
  104. package/dist/esm/intelligence.js +0 -188
  105. package/dist/esm/lora.d.ts +0 -251
  106. package/dist/esm/lora.d.ts.map +0 -1
  107. package/dist/esm/lora.js +0 -504
  108. package/dist/esm/models.d.ts +0 -129
  109. package/dist/esm/models.d.ts.map +0 -1
  110. package/dist/esm/models.js +0 -282
  111. package/dist/esm/native.d.ts +0 -140
  112. package/dist/esm/native.d.ts.map +0 -1
  113. package/dist/esm/native.js +0 -93
  114. package/dist/esm/session.d.ts +0 -80
  115. package/dist/esm/session.d.ts.map +0 -1
  116. package/dist/esm/session.js +0 -199
  117. package/dist/esm/simd.d.ts +0 -90
  118. package/dist/esm/simd.d.ts.map +0 -1
  119. package/dist/esm/simd.js +0 -205
  120. package/dist/esm/sona.d.ts +0 -223
  121. package/dist/esm/sona.d.ts.map +0 -1
  122. package/dist/esm/sona.js +0 -556
  123. package/dist/esm/streaming.d.ts +0 -55
  124. package/dist/esm/streaming.d.ts.map +0 -1
  125. package/dist/esm/streaming.js +0 -126
  126. package/dist/esm/training.d.ts +0 -312
  127. package/dist/esm/training.d.ts.map +0 -1
  128. package/dist/esm/training.js +0 -603
  129. package/dist/esm/types.d.ts +0 -696
  130. package/dist/esm/types.d.ts.map +0 -1
  131. package/dist/esm/types.js +0 -5
  132. package/scripts/ensemble-model-compare.js +0 -287
  133. package/scripts/fix-esm-extensions.mjs +0 -181
  134. package/scripts/huggingface/README.md +0 -537
  135. package/scripts/huggingface/publish.sh +0 -112
  136. package/scripts/hybrid-model-compare.js +0 -373
  137. package/scripts/improved-model-compare.js +0 -288
  138. package/scripts/optimized-model-compare.js +0 -364
  139. package/scripts/real-model-compare.js +0 -280
  140. package/scripts/smoke-esm.mjs +0 -82
  141. package/scripts/training/agentic-flow-capabilities.json +0 -329
  142. package/scripts/training/claude-code-synth.js +0 -505
  143. package/scripts/training/claude-flow-capabilities.json +0 -1322
  144. package/scripts/training/claude-hard-negatives.js +0 -222
  145. package/scripts/training/contrastive-finetune.js +0 -517
  146. package/scripts/training/ecosystem-triplets.jsonl +0 -1467
  147. package/scripts/training/generate-ecosystem-triplets.js +0 -1324
  148. package/scripts/training/routing-dataset.js +0 -634
  149. package/scripts/training/ruvector-capabilities.json +0 -798
  150. package/scripts/training/validate-ecosystem.js +0 -381
  151. package/scripts/training/validation-results.json +0 -23
@@ -1,110 +0,0 @@
1
- /**
2
- * RuvLTRA Benchmark Suite
3
- *
4
- * Comprehensive benchmarks for evaluating RuvLTRA models
5
- * on Claude Code-specific use cases.
6
- */
7
- export * from './routing-benchmark.js';
8
- export * from './embedding-benchmark.js';
9
- export * from './model-comparison.js';
10
- import { runRoutingBenchmark, formatRoutingResults, ROUTING_TEST_CASES, } from './routing-benchmark.js';
11
- import { runEmbeddingBenchmark, formatEmbeddingResults, SIMILARITY_TEST_PAIRS, SEARCH_TEST_CASES, CLUSTER_TEST_CASES, } from './embedding-benchmark.js';
12
- /**
13
- * Run all benchmarks with a given model
14
- */
15
- export function runFullBenchmark(router, embedder, similarityFn, modelName = 'unknown') {
16
- const routing = runRoutingBenchmark(router);
17
- const embedding = runEmbeddingBenchmark(embedder, similarityFn);
18
- return {
19
- routing,
20
- embedding,
21
- timestamp: new Date().toISOString(),
22
- model: modelName,
23
- };
24
- }
25
- /**
26
- * Format full benchmark results
27
- */
28
- export function formatFullResults(results) {
29
- const lines = [];
30
- lines.push('');
31
- lines.push('╔═══════════════════════════════════════════════════════════════════════════╗');
32
- lines.push('║ RUVLTRA BENCHMARK SUITE ║');
33
- lines.push('║ Claude Code Use Case Evaluation ║');
34
- lines.push('╠═══════════════════════════════════════════════════════════════════════════╣');
35
- lines.push(`║ Model: ${results.model.padEnd(64)}║`);
36
- lines.push(`║ Date: ${results.timestamp.padEnd(64)}║`);
37
- lines.push('╚═══════════════════════════════════════════════════════════════════════════╝');
38
- lines.push(formatRoutingResults(results.routing));
39
- lines.push(formatEmbeddingResults(results.embedding));
40
- // Overall assessment
41
- lines.push('');
42
- lines.push('═══════════════════════════════════════════════════════════════');
43
- lines.push(' OVERALL ASSESSMENT');
44
- lines.push('═══════════════════════════════════════════════════════════════');
45
- const routingScore = results.routing.accuracy;
46
- const embeddingScore = (results.embedding.similarityAccuracy +
47
- results.embedding.searchMRR +
48
- results.embedding.clusterPurity) / 3;
49
- const overallScore = (routingScore + embeddingScore) / 2;
50
- lines.push('');
51
- lines.push(` Routing Score: ${(routingScore * 100).toFixed(1)}%`);
52
- lines.push(` Embedding Score: ${(embeddingScore * 100).toFixed(1)}%`);
53
- lines.push(` ─────────────────────────`);
54
- lines.push(` Overall Score: ${(overallScore * 100).toFixed(1)}%`);
55
- lines.push('');
56
- if (overallScore >= 0.8) {
57
- lines.push(' ✓ EXCELLENT - Highly suitable for Claude Code workflows');
58
- }
59
- else if (overallScore >= 0.6) {
60
- lines.push(' ~ GOOD - Suitable for most Claude Code use cases');
61
- }
62
- else if (overallScore >= 0.4) {
63
- lines.push(' ~ ACCEPTABLE - May work but consider alternatives');
64
- }
65
- else {
66
- lines.push(' ✗ NEEDS IMPROVEMENT - Consider different model or fine-tuning');
67
- }
68
- lines.push('');
69
- lines.push('═══════════════════════════════════════════════════════════════');
70
- return lines.join('\n');
71
- }
72
- /**
73
- * Compare two models
74
- */
75
- export function compareModels(results1, results2) {
76
- const lines = [];
77
- lines.push('');
78
- lines.push('╔═══════════════════════════════════════════════════════════════════════════╗');
79
- lines.push('║ MODEL COMPARISON ║');
80
- lines.push('╚═══════════════════════════════════════════════════════════════════════════╝');
81
- lines.push('');
82
- const metrics = [
83
- { name: 'Routing Accuracy', v1: results1.routing.accuracy, v2: results2.routing.accuracy },
84
- { name: 'Similarity Detection', v1: results1.embedding.similarityAccuracy, v2: results2.embedding.similarityAccuracy },
85
- { name: 'Search MRR', v1: results1.embedding.searchMRR, v2: results2.embedding.searchMRR },
86
- { name: 'Search NDCG', v1: results1.embedding.searchNDCG, v2: results2.embedding.searchNDCG },
87
- { name: 'Cluster Purity', v1: results1.embedding.clusterPurity, v2: results2.embedding.clusterPurity },
88
- { name: 'Routing Latency (ms)', v1: results1.routing.avgLatencyMs, v2: results2.routing.avgLatencyMs, lowerBetter: true },
89
- ];
90
- lines.push(`${'Metric'.padEnd(25)} ${results1.model.padEnd(15)} ${results2.model.padEnd(15)} Winner`);
91
- lines.push('─'.repeat(70));
92
- for (const m of metrics) {
93
- const val1 = m.lowerBetter ? m.v1 : m.v1;
94
- const val2 = m.lowerBetter ? m.v2 : m.v2;
95
- let winner;
96
- if (m.lowerBetter) {
97
- winner = val1 < val2 ? results1.model : val2 < val1 ? results2.model : 'tie';
98
- }
99
- else {
100
- winner = val1 > val2 ? results1.model : val2 > val1 ? results2.model : 'tie';
101
- }
102
- const v1Str = m.lowerBetter ? val1.toFixed(2) : (val1 * 100).toFixed(1) + '%';
103
- const v2Str = m.lowerBetter ? val2.toFixed(2) : (val2 * 100).toFixed(1) + '%';
104
- lines.push(`${m.name.padEnd(25)} ${v1Str.padEnd(15)} ${v2Str.padEnd(15)} ${winner}`);
105
- }
106
- return lines.join('\n');
107
- }
108
- // Export constants for external use
109
- export { ROUTING_TEST_CASES, SIMILARITY_TEST_PAIRS, SEARCH_TEST_CASES, CLUSTER_TEST_CASES, };
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmVuY2htYXJrcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBRW5DLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBRXBCLGtCQUFrQixHQUVuQixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIsa0JBQWtCLEdBRW5CLE1BQU0sdUJBQXVCLENBQUM7QUFTL0I7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLE1BQStELEVBQy9ELFFBQW9DLEVBQ3BDLFlBQWtELEVBQ2xELFlBQW9CLFNBQVM7SUFFN0IsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRWhFLE9BQU87UUFDTCxPQUFPO1FBQ1AsU0FBUztRQUNULFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtRQUNuQyxLQUFLLEVBQUUsU0FBUztLQUNqQixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE9BQTZCO0lBQzdELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2YsS0FBSyxDQUFDLElBQUksQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQzVGLEtBQUssQ0FBQyxJQUFJLENBQUMsK0VBQStFLENBQUMsQ0FBQztJQUM1RixLQUFLLENBQUMsSUFBSSxDQUFDLCtFQUErRSxDQUFDLENBQUM7SUFDNUYsS0FBSyxDQUFDLElBQUksQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQzVGLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckQsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6RCxLQUFLLENBQUMsSUFBSSxDQUFDLCtFQUErRSxDQUFDLENBQUM7SUFFNUYsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXRELHFCQUFxQjtJQUNyQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2YsS0FBSyxDQUFDLElBQUksQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO0lBQzlFLEtBQUssQ0FBQyxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUN2RCxLQUFLLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFFOUUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDOUMsTUFBTSxjQUFjLEdBQUcsQ0FDckIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0I7UUFDcEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTO1FBQzNCLE9BQU8sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUNoQyxHQUFHLENBQUMsQ0FBQztJQUVOLE1BQU0sWUFBWSxHQUFHLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV6RCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2YsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRSxLQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZFLEtBQUssQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUMxQyxLQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFZixJQUFJLFlBQVksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDMUUsQ0FBQztTQUFNLElBQUksWUFBWSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUNuRSxDQUFDO1NBQU0sSUFBSSxZQUFZLElBQUksR0FBRyxFQUFFLENBQUM7UUFDL0IsS0FBSyxDQUFDLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2YsS0FBSyxDQUFDLElBQUksQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO0lBRTlFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixRQUE4QixFQUM5QixRQUE4QjtJQUU5QixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFFM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNmLEtBQUssQ0FBQyxJQUFJLENBQUMsK0VBQStFLENBQUMsQ0FBQztJQUM1RixLQUFLLENBQUMsSUFBSSxDQUFDLCtFQUErRSxDQUFDLENBQUM7SUFDNUYsS0FBSyxDQUFDLElBQUksQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQzVGLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFZixNQUFNLE9BQU8sR0FBRztRQUNkLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7UUFDMUYsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUU7UUFDdEgsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUU7UUFDMUYsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUU7UUFDN0YsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRTtRQUN0RyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7S0FDMUgsQ0FBQztJQUVGLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUUzQixLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUV6QyxJQUFJLE1BQWMsQ0FBQztRQUNuQixJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQixNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQy9FLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMvRSxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRTlFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxvQ0FBb0M7QUFDcEMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGtCQUFrQixHQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSdXZMVFJBIEJlbmNobWFyayBTdWl0ZVxuICpcbiAqIENvbXByZWhlbnNpdmUgYmVuY2htYXJrcyBmb3IgZXZhbHVhdGluZyBSdXZMVFJBIG1vZGVsc1xuICogb24gQ2xhdWRlIENvZGUtc3BlY2lmaWMgdXNlIGNhc2VzLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcm91dGluZy1iZW5jaG1hcmsnO1xuZXhwb3J0ICogZnJvbSAnLi9lbWJlZGRpbmctYmVuY2htYXJrJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kZWwtY29tcGFyaXNvbic7XG5cbmltcG9ydCB7XG4gIHJ1blJvdXRpbmdCZW5jaG1hcmssXG4gIGZvcm1hdFJvdXRpbmdSZXN1bHRzLFxuICBiYXNlbGluZUtleXdvcmRSb3V0ZXIsXG4gIFJPVVRJTkdfVEVTVF9DQVNFUyxcbiAgdHlwZSBSb3V0aW5nQmVuY2htYXJrUmVzdWx0cyxcbn0gZnJvbSAnLi9yb3V0aW5nLWJlbmNobWFyayc7XG5cbmltcG9ydCB7XG4gIHJ1bkVtYmVkZGluZ0JlbmNobWFyayxcbiAgZm9ybWF0RW1iZWRkaW5nUmVzdWx0cyxcbiAgU0lNSUxBUklUWV9URVNUX1BBSVJTLFxuICBTRUFSQ0hfVEVTVF9DQVNFUyxcbiAgQ0xVU1RFUl9URVNUX0NBU0VTLFxuICB0eXBlIEVtYmVkZGluZ0JlbmNobWFya1Jlc3VsdHMsXG59IGZyb20gJy4vZW1iZWRkaW5nLWJlbmNobWFyayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVsbEJlbmNobWFya1Jlc3VsdHMge1xuICByb3V0aW5nOiBSb3V0aW5nQmVuY2htYXJrUmVzdWx0cztcbiAgZW1iZWRkaW5nOiBFbWJlZGRpbmdCZW5jaG1hcmtSZXN1bHRzO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgbW9kZWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSdW4gYWxsIGJlbmNobWFya3Mgd2l0aCBhIGdpdmVuIG1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5GdWxsQmVuY2htYXJrKFxuICByb3V0ZXI6ICh0YXNrOiBzdHJpbmcpID0+IHsgYWdlbnQ6IHN0cmluZzsgY29uZmlkZW5jZTogbnVtYmVyIH0sXG4gIGVtYmVkZGVyOiAodGV4dDogc3RyaW5nKSA9PiBudW1iZXJbXSxcbiAgc2ltaWxhcml0eUZuOiAoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKSA9PiBudW1iZXIsXG4gIG1vZGVsTmFtZTogc3RyaW5nID0gJ3Vua25vd24nXG4pOiBGdWxsQmVuY2htYXJrUmVzdWx0cyB7XG4gIGNvbnN0IHJvdXRpbmcgPSBydW5Sb3V0aW5nQmVuY2htYXJrKHJvdXRlcik7XG4gIGNvbnN0IGVtYmVkZGluZyA9IHJ1bkVtYmVkZGluZ0JlbmNobWFyayhlbWJlZGRlciwgc2ltaWxhcml0eUZuKTtcblxuICByZXR1cm4ge1xuICAgIHJvdXRpbmcsXG4gICAgZW1iZWRkaW5nLFxuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gIH07XG59XG5cbi8qKlxuICogRm9ybWF0IGZ1bGwgYmVuY2htYXJrIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZ1bGxSZXN1bHRzKHJlc3VsdHM6IEZ1bGxCZW5jaG1hcmtSZXN1bHRzKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgbGluZXMucHVzaCgnJyk7XG4gIGxpbmVzLnB1c2goJ+KVlOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVlycpO1xuICBsaW5lcy5wdXNoKCfilZEgICAgICAgICAgICAgICAgICAgIFJVVkxUUkEgQkVOQ0hNQVJLIFNVSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilZEnKTtcbiAgbGluZXMucHVzaCgn4pWRICAgICAgICAgICAgQ2xhdWRlIENvZGUgVXNlIENhc2UgRXZhbHVhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pWRJyk7XG4gIGxpbmVzLnB1c2goJ+KVoOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVoycpO1xuICBsaW5lcy5wdXNoKGDilZEgIE1vZGVsOiAke3Jlc3VsdHMubW9kZWwucGFkRW5kKDY0KX3ilZFgKTtcbiAgbGluZXMucHVzaChg4pWRICBEYXRlOiAgJHtyZXN1bHRzLnRpbWVzdGFtcC5wYWRFbmQoNjQpfeKVkWApO1xuICBsaW5lcy5wdXNoKCfilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ0nKTtcblxuICBsaW5lcy5wdXNoKGZvcm1hdFJvdXRpbmdSZXN1bHRzKHJlc3VsdHMucm91dGluZykpO1xuICBsaW5lcy5wdXNoKGZvcm1hdEVtYmVkZGluZ1Jlc3VsdHMocmVzdWx0cy5lbWJlZGRpbmcpKTtcblxuICAvLyBPdmVyYWxsIGFzc2Vzc21lbnRcbiAgbGluZXMucHVzaCgnJyk7XG4gIGxpbmVzLnB1c2goJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcpO1xuICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgICAgICAgT1ZFUkFMTCBBU1NFU1NNRU5UJyk7XG4gIGxpbmVzLnB1c2goJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcpO1xuXG4gIGNvbnN0IHJvdXRpbmdTY29yZSA9IHJlc3VsdHMucm91dGluZy5hY2N1cmFjeTtcbiAgY29uc3QgZW1iZWRkaW5nU2NvcmUgPSAoXG4gICAgcmVzdWx0cy5lbWJlZGRpbmcuc2ltaWxhcml0eUFjY3VyYWN5ICtcbiAgICByZXN1bHRzLmVtYmVkZGluZy5zZWFyY2hNUlIgK1xuICAgIHJlc3VsdHMuZW1iZWRkaW5nLmNsdXN0ZXJQdXJpdHlcbiAgKSAvIDM7XG5cbiAgY29uc3Qgb3ZlcmFsbFNjb3JlID0gKHJvdXRpbmdTY29yZSArIGVtYmVkZGluZ1Njb3JlKSAvIDI7XG5cbiAgbGluZXMucHVzaCgnJyk7XG4gIGxpbmVzLnB1c2goYCAgUm91dGluZyBTY29yZTogICAkeyhyb3V0aW5nU2NvcmUgKiAxMDApLnRvRml4ZWQoMSl9JWApO1xuICBsaW5lcy5wdXNoKGAgIEVtYmVkZGluZyBTY29yZTogJHsoZW1iZWRkaW5nU2NvcmUgKiAxMDApLnRvRml4ZWQoMSl9JWApO1xuICBsaW5lcy5wdXNoKGAgIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgGApO1xuICBsaW5lcy5wdXNoKGAgIE92ZXJhbGwgU2NvcmU6ICAgJHsob3ZlcmFsbFNjb3JlICogMTAwKS50b0ZpeGVkKDEpfSVgKTtcbiAgbGluZXMucHVzaCgnJyk7XG5cbiAgaWYgKG92ZXJhbGxTY29yZSA+PSAwLjgpIHtcbiAgICBsaW5lcy5wdXNoKCcgIOKckyBFWENFTExFTlQgLSBIaWdobHkgc3VpdGFibGUgZm9yIENsYXVkZSBDb2RlIHdvcmtmbG93cycpO1xuICB9IGVsc2UgaWYgKG92ZXJhbGxTY29yZSA+PSAwLjYpIHtcbiAgICBsaW5lcy5wdXNoKCcgIH4gR09PRCAtIFN1aXRhYmxlIGZvciBtb3N0IENsYXVkZSBDb2RlIHVzZSBjYXNlcycpO1xuICB9IGVsc2UgaWYgKG92ZXJhbGxTY29yZSA+PSAwLjQpIHtcbiAgICBsaW5lcy5wdXNoKCcgIH4gQUNDRVBUQUJMRSAtIE1heSB3b3JrIGJ1dCBjb25zaWRlciBhbHRlcm5hdGl2ZXMnKTtcbiAgfSBlbHNlIHtcbiAgICBsaW5lcy5wdXNoKCcgIOKclyBORUVEUyBJTVBST1ZFTUVOVCAtIENvbnNpZGVyIGRpZmZlcmVudCBtb2RlbCBvciBmaW5lLXR1bmluZycpO1xuICB9XG5cbiAgbGluZXMucHVzaCgnJyk7XG4gIGxpbmVzLnB1c2goJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcpO1xuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBDb21wYXJlIHR3byBtb2RlbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVNb2RlbHMoXG4gIHJlc3VsdHMxOiBGdWxsQmVuY2htYXJrUmVzdWx0cyxcbiAgcmVzdWx0czI6IEZ1bGxCZW5jaG1hcmtSZXN1bHRzXG4pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICBsaW5lcy5wdXNoKCcnKTtcbiAgbGluZXMucHVzaCgn4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXJyk7XG4gIGxpbmVzLnB1c2goJ+KVkSAgICAgICAgICAgICAgICAgICAgICAgTU9ERUwgQ09NUEFSSVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKVkScpO1xuICBsaW5lcy5wdXNoKCfilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ0nKTtcbiAgbGluZXMucHVzaCgnJyk7XG5cbiAgY29uc3QgbWV0cmljcyA9IFtcbiAgICB7IG5hbWU6ICdSb3V0aW5nIEFjY3VyYWN5JywgdjE6IHJlc3VsdHMxLnJvdXRpbmcuYWNjdXJhY3ksIHYyOiByZXN1bHRzMi5yb3V0aW5nLmFjY3VyYWN5IH0sXG4gICAgeyBuYW1lOiAnU2ltaWxhcml0eSBEZXRlY3Rpb24nLCB2MTogcmVzdWx0czEuZW1iZWRkaW5nLnNpbWlsYXJpdHlBY2N1cmFjeSwgdjI6IHJlc3VsdHMyLmVtYmVkZGluZy5zaW1pbGFyaXR5QWNjdXJhY3kgfSxcbiAgICB7IG5hbWU6ICdTZWFyY2ggTVJSJywgdjE6IHJlc3VsdHMxLmVtYmVkZGluZy5zZWFyY2hNUlIsIHYyOiByZXN1bHRzMi5lbWJlZGRpbmcuc2VhcmNoTVJSIH0sXG4gICAgeyBuYW1lOiAnU2VhcmNoIE5EQ0cnLCB2MTogcmVzdWx0czEuZW1iZWRkaW5nLnNlYXJjaE5EQ0csIHYyOiByZXN1bHRzMi5lbWJlZGRpbmcuc2VhcmNoTkRDRyB9LFxuICAgIHsgbmFtZTogJ0NsdXN0ZXIgUHVyaXR5JywgdjE6IHJlc3VsdHMxLmVtYmVkZGluZy5jbHVzdGVyUHVyaXR5LCB2MjogcmVzdWx0czIuZW1iZWRkaW5nLmNsdXN0ZXJQdXJpdHkgfSxcbiAgICB7IG5hbWU6ICdSb3V0aW5nIExhdGVuY3kgKG1zKScsIHYxOiByZXN1bHRzMS5yb3V0aW5nLmF2Z0xhdGVuY3lNcywgdjI6IHJlc3VsdHMyLnJvdXRpbmcuYXZnTGF0ZW5jeU1zLCBsb3dlckJldHRlcjogdHJ1ZSB9LFxuICBdO1xuXG4gIGxpbmVzLnB1c2goYCR7J01ldHJpYycucGFkRW5kKDI1KX0gJHtyZXN1bHRzMS5tb2RlbC5wYWRFbmQoMTUpfSAke3Jlc3VsdHMyLm1vZGVsLnBhZEVuZCgxNSl9IFdpbm5lcmApO1xuICBsaW5lcy5wdXNoKCfilIAnLnJlcGVhdCg3MCkpO1xuXG4gIGZvciAoY29uc3QgbSBvZiBtZXRyaWNzKSB7XG4gICAgY29uc3QgdmFsMSA9IG0ubG93ZXJCZXR0ZXIgPyBtLnYxIDogbS52MTtcbiAgICBjb25zdCB2YWwyID0gbS5sb3dlckJldHRlciA/IG0udjIgOiBtLnYyO1xuXG4gICAgbGV0IHdpbm5lcjogc3RyaW5nO1xuICAgIGlmIChtLmxvd2VyQmV0dGVyKSB7XG4gICAgICB3aW5uZXIgPSB2YWwxIDwgdmFsMiA/IHJlc3VsdHMxLm1vZGVsIDogdmFsMiA8IHZhbDEgPyByZXN1bHRzMi5tb2RlbCA6ICd0aWUnO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5uZXIgPSB2YWwxID4gdmFsMiA/IHJlc3VsdHMxLm1vZGVsIDogdmFsMiA+IHZhbDEgPyByZXN1bHRzMi5tb2RlbCA6ICd0aWUnO1xuICAgIH1cblxuICAgIGNvbnN0IHYxU3RyID0gbS5sb3dlckJldHRlciA/IHZhbDEudG9GaXhlZCgyKSA6ICh2YWwxICogMTAwKS50b0ZpeGVkKDEpICsgJyUnO1xuICAgIGNvbnN0IHYyU3RyID0gbS5sb3dlckJldHRlciA/IHZhbDIudG9GaXhlZCgyKSA6ICh2YWwyICogMTAwKS50b0ZpeGVkKDEpICsgJyUnO1xuXG4gICAgbGluZXMucHVzaChgJHttLm5hbWUucGFkRW5kKDI1KX0gJHt2MVN0ci5wYWRFbmQoMTUpfSAke3YyU3RyLnBhZEVuZCgxNSl9ICR7d2lubmVyfWApO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG4vLyBFeHBvcnQgY29uc3RhbnRzIGZvciBleHRlcm5hbCB1c2VcbmV4cG9ydCB7XG4gIFJPVVRJTkdfVEVTVF9DQVNFUyxcbiAgU0lNSUxBUklUWV9URVNUX1BBSVJTLFxuICBTRUFSQ0hfVEVTVF9DQVNFUyxcbiAgQ0xVU1RFUl9URVNUX0NBU0VTLFxufTtcbiJdfQ==
@@ -1,71 +0,0 @@
1
- /**
2
- * Model Comparison Benchmark
3
- *
4
- * Head-to-head comparison between:
5
- * - Qwen2.5-0.5B-Instruct (base model)
6
- * - RuvLTRA Claude Code 0.5B (fine-tuned for Claude Code)
7
- *
8
- * Tests routing accuracy and embedding quality for Claude Code use cases.
9
- */
10
- import { type RoutingBenchmarkResults } from './routing-benchmark.js';
11
- import { type EmbeddingBenchmarkResults } from './embedding-benchmark.js';
12
- /** Model configuration */
13
- export interface ModelConfig {
14
- id: string;
15
- name: string;
16
- url: string;
17
- filename: string;
18
- sizeBytes: number;
19
- description: string;
20
- }
21
- /** Comparison models */
22
- export declare const COMPARISON_MODELS: Record<string, ModelConfig>;
23
- /** Comparison result */
24
- export interface ComparisonResult {
25
- modelId: string;
26
- modelName: string;
27
- routing: RoutingBenchmarkResults;
28
- embedding: EmbeddingBenchmarkResults;
29
- overallScore: number;
30
- }
31
- /** Full comparison results */
32
- export interface FullComparisonResults {
33
- timestamp: string;
34
- baseline: ComparisonResult;
35
- models: ComparisonResult[];
36
- winner: string;
37
- summary: string;
38
- }
39
- /**
40
- * Get models directory
41
- */
42
- export declare function getModelsDir(): string;
43
- /**
44
- * Check if model is downloaded
45
- */
46
- export declare function isModelDownloaded(modelId: string): boolean;
47
- /**
48
- * Download a model with progress
49
- */
50
- export declare function downloadModel(modelId: string, onProgress?: (percent: number, speed: number) => void): Promise<string>;
51
- /**
52
- * Run comparison for a single model
53
- */
54
- export declare function runModelComparison(modelId: string, modelName: string, embedder: (text: string) => number[]): ComparisonResult;
55
- /**
56
- * Format comparison results
57
- */
58
- export declare function formatComparisonResults(results: FullComparisonResults): string;
59
- /**
60
- * Run full comparison
61
- */
62
- export declare function runFullComparison(): Promise<FullComparisonResults>;
63
- declare const _default: {
64
- COMPARISON_MODELS: Record<string, ModelConfig>;
65
- runFullComparison: typeof runFullComparison;
66
- formatComparisonResults: typeof formatComparisonResults;
67
- downloadModel: typeof downloadModel;
68
- isModelDownloaded: typeof isModelDownloaded;
69
- };
70
- export default _default;
71
- //# sourceMappingURL=model-comparison.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-comparison.d.ts","sourceRoot":"","sources":["../../../src/benchmarks/model-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,EAML,KAAK,uBAAuB,EAC7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AAE/B,0BAA0B;AAC1B,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAwB;AACxB,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAiBzD,CAAC;AAEF,wBAAwB;AACxB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,uBAAuB,CAAC;IACjC,SAAS,EAAE,yBAAyB,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,8BAA8B;AAC9B,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAS1D;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,MAAM,CAAC,CA2EjB;AAyJD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,GACnC,gBAAgB,CAyBlB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CA8E9E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAqGxE;;;;;;;;AAED,wBAME"}