@baozi.bet/mcp-server 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +294 -0
  2. package/dist/__tests__/full-test.d.ts +1 -0
  3. package/dist/__tests__/full-test.js +291 -0
  4. package/dist/builders/affiliate-transaction.d.ts +41 -0
  5. package/dist/builders/affiliate-transaction.js +123 -0
  6. package/dist/builders/bet-transaction.d.ts +70 -0
  7. package/dist/builders/bet-transaction.js +323 -0
  8. package/dist/builders/claim-transaction.d.ts +57 -0
  9. package/dist/builders/claim-transaction.js +196 -0
  10. package/dist/builders/creator-transaction.d.ts +49 -0
  11. package/dist/builders/creator-transaction.js +177 -0
  12. package/dist/builders/dispute-transaction.d.ts +81 -0
  13. package/dist/builders/dispute-transaction.js +215 -0
  14. package/dist/builders/index.d.ts +14 -0
  15. package/dist/builders/index.js +15 -0
  16. package/dist/builders/market-creation-tx.d.ts +65 -0
  17. package/dist/builders/market-creation-tx.js +362 -0
  18. package/dist/builders/market-management-transaction.d.ts +85 -0
  19. package/dist/builders/market-management-transaction.js +239 -0
  20. package/dist/builders/race-transaction.d.ts +67 -0
  21. package/dist/builders/race-transaction.js +242 -0
  22. package/dist/builders/resolution-transaction.d.ts +108 -0
  23. package/dist/builders/resolution-transaction.js +250 -0
  24. package/dist/builders/whitelist-transaction.d.ts +72 -0
  25. package/dist/builders/whitelist-transaction.js +179 -0
  26. package/dist/config.d.ts +138 -0
  27. package/dist/config.js +307 -0
  28. package/dist/handlers/agent-network.d.ts +81 -0
  29. package/dist/handlers/agent-network.js +332 -0
  30. package/dist/handlers/claims.d.ts +47 -0
  31. package/dist/handlers/claims.js +218 -0
  32. package/dist/handlers/market-creation.d.ts +154 -0
  33. package/dist/handlers/market-creation.js +290 -0
  34. package/dist/handlers/markets.d.ts +41 -0
  35. package/dist/handlers/markets.js +319 -0
  36. package/dist/handlers/positions.d.ts +40 -0
  37. package/dist/handlers/positions.js +244 -0
  38. package/dist/handlers/quote.d.ts +33 -0
  39. package/dist/handlers/quote.js +144 -0
  40. package/dist/handlers/race-markets.d.ts +54 -0
  41. package/dist/handlers/race-markets.js +308 -0
  42. package/dist/handlers/resolution.d.ts +43 -0
  43. package/dist/handlers/resolution.js +194 -0
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.js +109 -0
  46. package/dist/resources.d.ts +13 -0
  47. package/dist/resources.js +336 -0
  48. package/dist/tools.d.ts +3109 -0
  49. package/dist/tools.js +1956 -0
  50. package/dist/validation/bet-rules.d.ts +82 -0
  51. package/dist/validation/bet-rules.js +276 -0
  52. package/dist/validation/creation-rules.d.ts +69 -0
  53. package/dist/validation/creation-rules.js +302 -0
  54. package/dist/validation/index.d.ts +6 -0
  55. package/dist/validation/index.js +7 -0
  56. package/dist/validation/market-rules.d.ts +60 -0
  57. package/dist/validation/market-rules.js +237 -0
  58. package/dist/validation/parimutuel-rules.d.ts +117 -0
  59. package/dist/validation/parimutuel-rules.js +270 -0
  60. package/package.json +52 -0
@@ -0,0 +1,270 @@
1
+ /**
2
+ * BAOZI PARIMUTUEL MARKET RULES v6.2
3
+ *
4
+ * STRICT ENFORCEMENT - All Lab markets MUST comply with these rules.
5
+ * AI agents creating markets through MCP MUST validate against these rules.
6
+ * Markets that don't comply will be BLOCKED from creation.
7
+ */
8
+ // =============================================================================
9
+ // MANDATORY RULES - MARKETS WILL BE BLOCKED IF VIOLATED
10
+ // =============================================================================
11
+ export const PARIMUTUEL_RULES = {
12
+ version: '6.2',
13
+ /**
14
+ * RULE A: Event-Based Markets
15
+ *
16
+ * For markets about specific events (sports, elections, announcements):
17
+ * - Betting must close AT LEAST 12 hours BEFORE the event
18
+ * - Recommended buffer: 18-24 hours
19
+ * - Event time must be explicitly specified
20
+ *
21
+ * RATIONALE: Prevents late-breaking information from giving unfair advantage
22
+ *
23
+ * Examples:
24
+ * ✅ "Will Team A win vs Team B?" + event_time = game_start
25
+ * ✅ "Will Company X announce earnings above $1B?" + event_time = announcement
26
+ * ❌ "Will it rain tomorrow?" (no clear event time)
27
+ */
28
+ RULE_A: {
29
+ name: 'Event-Based Markets',
30
+ minBufferHours: 12,
31
+ recommendedBufferHours: 24,
32
+ requirement: 'Betting must close 12+ hours BEFORE the event',
33
+ rationale: 'Prevents information advantage from late-breaking news',
34
+ },
35
+ /**
36
+ * RULE B: Measurement-Period Markets
37
+ *
38
+ * For markets about measured values (prices, temperatures, metrics):
39
+ * - Betting must close BEFORE the measurement period starts
40
+ * - measurement_start must be explicitly specified
41
+ * - Recommended: betting closes 1-2 hours before measurement
42
+ *
43
+ * RATIONALE: Prevents anyone from betting with foreknowledge of measurements
44
+ *
45
+ * Examples:
46
+ * ✅ "Will BTC be above $100k at 00:00 UTC Feb 1?" + measurement_start = Feb 1 00:00
47
+ * ✅ "Will Tokyo have snowfall on Feb 4?" + measurement_start = Feb 4 00:00
48
+ * ❌ "Will BTC close above $100k on Feb 2?" + betting_closes = Feb 2 23:59 (VIOLATION!)
49
+ */
50
+ RULE_B: {
51
+ name: 'Measurement-Period Markets',
52
+ requirement: 'Betting must close BEFORE measurement period starts',
53
+ rationale: 'Prevents betting with foreknowledge of measured values',
54
+ recommendedBufferHours: 2,
55
+ },
56
+ /**
57
+ * MANDATORY: Verifiable Data Source
58
+ *
59
+ * Every market question MUST specify or clearly imply a verifiable data source.
60
+ * This ensures objective resolution and prevents disputes.
61
+ *
62
+ * Examples:
63
+ * ✅ "Will BTC be above $100k? (Source: CoinGecko)"
64
+ * ✅ "Will it snow in Tokyo? (JMA official record)"
65
+ * ✅ "Will Real Madrid win?" (Implied: official UEFA result)
66
+ * ❌ "Will the economy improve?" (No verifiable source)
67
+ * ❌ "Will Claude be the best AI?" (Subjective, no source)
68
+ */
69
+ DATA_SOURCE: {
70
+ name: 'Verifiable Data Source',
71
+ requirement: 'Question must specify or clearly imply a verifiable data source',
72
+ rationale: 'Ensures objective resolution and prevents disputes',
73
+ },
74
+ /**
75
+ * MANDATORY: Clear YES/NO Criteria
76
+ *
77
+ * The market question must have clear, unambiguous YES/NO criteria.
78
+ * There should be no room for interpretation in the resolution.
79
+ *
80
+ * Examples:
81
+ * ✅ "Will BTC be above $100,000 at 00:00 UTC Feb 1, 2026?"
82
+ * ✅ "Will Team A score 3+ goals?"
83
+ * ❌ "Will BTC perform well?" (Subjective)
84
+ * ❌ "Will the game be exciting?" (Subjective)
85
+ */
86
+ CLEAR_CRITERIA: {
87
+ name: 'Clear Resolution Criteria',
88
+ requirement: 'Question must have unambiguous YES/NO criteria',
89
+ rationale: 'Prevents disputes and ensures fair resolution',
90
+ },
91
+ };
92
+ /**
93
+ * Validate market against parimutuel rules
94
+ * Returns BLOCKED=true if market violates mandatory rules
95
+ */
96
+ export function validateParimutuelRules(params) {
97
+ const errors = [];
98
+ const warnings = [];
99
+ const ruleViolations = [];
100
+ const rulesChecked = [];
101
+ // Only strictly enforce for Lab markets
102
+ const isLabMarket = params.layer === 'lab';
103
+ // =========================================================================
104
+ // CHECK: Market Type Classification
105
+ // =========================================================================
106
+ rulesChecked.push('Market Type Classification');
107
+ const hasEventTime = !!params.eventTime;
108
+ const hasMeasurementStart = !!params.measurementStart;
109
+ const isEventBased = params.marketType === 'event' || hasEventTime;
110
+ const isMeasurementBased = params.marketType === 'measurement' || hasMeasurementStart;
111
+ if (isLabMarket && !isEventBased && !isMeasurementBased) {
112
+ ruleViolations.push({
113
+ rule: 'Market Classification',
114
+ description: 'Lab markets MUST specify either event_time (Rule A) or measurement_start (Rule B). ' +
115
+ 'Without this, the market cannot be validated for fair betting windows.',
116
+ severity: 'CRITICAL',
117
+ });
118
+ errors.push('BLOCKED: Market must be classified as event-based (with event_time) or measurement-based (with measurement_start)');
119
+ }
120
+ // =========================================================================
121
+ // CHECK: Rule A - Event Buffer
122
+ // =========================================================================
123
+ if (isEventBased && params.eventTime) {
124
+ rulesChecked.push('Rule A: Event Buffer');
125
+ const bufferMs = params.eventTime.getTime() - params.closingTime.getTime();
126
+ const bufferHours = bufferMs / (1000 * 60 * 60);
127
+ if (bufferHours < PARIMUTUEL_RULES.RULE_A.minBufferHours) {
128
+ ruleViolations.push({
129
+ rule: 'Rule A',
130
+ description: `Event buffer is ${bufferHours.toFixed(1)}h but minimum is ${PARIMUTUEL_RULES.RULE_A.minBufferHours}h. ` +
131
+ `Betting must close at least 12 hours BEFORE the event to prevent information advantage.`,
132
+ severity: 'CRITICAL',
133
+ });
134
+ errors.push(`BLOCKED: Betting must close ${PARIMUTUEL_RULES.RULE_A.minBufferHours}+ hours before event (currently ${bufferHours.toFixed(1)}h)`);
135
+ }
136
+ else if (bufferHours < 18) {
137
+ warnings.push(`Event buffer is ${bufferHours.toFixed(1)}h. Recommend 18-24h for safety margin.`);
138
+ }
139
+ }
140
+ // =========================================================================
141
+ // CHECK: Rule B - Measurement Period
142
+ // =========================================================================
143
+ if (isMeasurementBased && params.measurementStart) {
144
+ rulesChecked.push('Rule B: Measurement Period');
145
+ if (params.closingTime >= params.measurementStart) {
146
+ const overlapMs = params.closingTime.getTime() - params.measurementStart.getTime();
147
+ const overlapHours = overlapMs / (1000 * 60 * 60);
148
+ ruleViolations.push({
149
+ rule: 'Rule B',
150
+ description: `CRITICAL VIOLATION: Betting closes ${overlapHours.toFixed(1)}h AFTER measurement starts! ` +
151
+ `This allows bettors to bet with foreknowledge of the outcome. ` +
152
+ `Betting MUST close BEFORE the measurement period begins.`,
153
+ severity: 'CRITICAL',
154
+ });
155
+ errors.push(`BLOCKED: Betting must close BEFORE measurement starts (currently closes ${overlapHours.toFixed(1)}h AFTER)`);
156
+ }
157
+ }
158
+ // =========================================================================
159
+ // CHECK: Data Source
160
+ // =========================================================================
161
+ rulesChecked.push('Verifiable Data Source');
162
+ const questionLower = params.question.toLowerCase();
163
+ const hasDataSource = questionLower.includes('source:') ||
164
+ questionLower.includes('coingecko') ||
165
+ questionLower.includes('coinmarketcap') ||
166
+ questionLower.includes('official') ||
167
+ questionLower.includes('nws') ||
168
+ questionLower.includes('jma') ||
169
+ questionLower.includes('ufc') ||
170
+ questionLower.includes('uefa') ||
171
+ questionLower.includes('fifa') ||
172
+ questionLower.includes('nba') ||
173
+ questionLower.includes('nfl') ||
174
+ questionLower.includes('mlb') ||
175
+ // Sports/events typically have implied official sources
176
+ questionLower.includes(' win ') ||
177
+ questionLower.includes(' defeat ') ||
178
+ questionLower.includes(' advance ') ||
179
+ questionLower.includes('championship') ||
180
+ questionLower.includes('election');
181
+ if (isLabMarket && !hasDataSource) {
182
+ warnings.push('Recommended: Include data source in question (e.g., "(Source: CoinGecko)" or "(Official: UEFA)"). ' +
183
+ 'This ensures objective resolution.');
184
+ }
185
+ // =========================================================================
186
+ // CHECK: Clear Criteria
187
+ // =========================================================================
188
+ rulesChecked.push('Clear Resolution Criteria');
189
+ const hasNumericThreshold = /\$[\d,]+/.test(params.question) || // Dollar amounts
190
+ /\d+%/.test(params.question) || // Percentages
191
+ /above|below|over|under|at least|more than|less than/i.test(params.question);
192
+ const hasClearBinaryOutcome = /will .+ (win|lose|defeat|advance|qualify|score|achieve)/i.test(params.question) ||
193
+ /will .+ (snow|rain|happen|occur)/i.test(params.question);
194
+ if (isLabMarket && !hasNumericThreshold && !hasClearBinaryOutcome) {
195
+ warnings.push('Question should have clear numeric threshold or binary outcome. ' +
196
+ 'Example: "above $X", "at least Y goals", "will Team A win"');
197
+ }
198
+ // =========================================================================
199
+ // RESULT
200
+ // =========================================================================
201
+ const hasCriticalViolation = ruleViolations.some(v => v.severity === 'CRITICAL');
202
+ return {
203
+ valid: errors.length === 0,
204
+ blocked: isLabMarket && hasCriticalViolation,
205
+ errors,
206
+ warnings,
207
+ ruleViolations,
208
+ rulesChecked,
209
+ };
210
+ }
211
+ // =============================================================================
212
+ // RULES DOCUMENTATION (for AI agents)
213
+ // =============================================================================
214
+ export const PARIMUTUEL_RULES_DOCUMENTATION = `
215
+ # BAOZI PARIMUTUEL MARKET RULES v6.2
216
+
217
+ ## MANDATORY FOR ALL LAB MARKETS
218
+
219
+ ### Rule A: Event-Based Markets
220
+ Markets about specific events (sports, elections, announcements):
221
+ - Betting MUST close AT LEAST 12 hours BEFORE the event
222
+ - You MUST specify event_time parameter
223
+ - Recommended buffer: 18-24 hours
224
+
225
+ Example:
226
+ - Question: "Will Team A win vs Team B?"
227
+ - Event time: Game start (e.g., 2026-02-15T20:00:00Z)
228
+ - Closing time: At least 12h before (e.g., 2026-02-15T08:00:00Z)
229
+
230
+ ### Rule B: Measurement-Period Markets
231
+ Markets about measured values (prices, temperatures, metrics):
232
+ - Betting MUST close BEFORE the measurement period starts
233
+ - You MUST specify measurement_start parameter
234
+ - Recommended: betting closes 1-2 hours before measurement
235
+
236
+ Example:
237
+ - Question: "Will BTC be above $100k at 00:00 UTC Feb 1?"
238
+ - Measurement start: 2026-02-01T00:00:00Z
239
+ - Closing time: BEFORE measurement (e.g., 2026-01-31T22:00:00Z)
240
+
241
+ ### Data Source Requirement
242
+ - Include verifiable data source in question
243
+ - Examples: "(Source: CoinGecko)", "(Official: UEFA)", "(NWS Los Angeles)"
244
+
245
+ ### Clear Criteria
246
+ - Question must have unambiguous YES/NO resolution
247
+ - Include specific thresholds: "$100,000", "3+ goals", etc.
248
+
249
+ ## VIOLATIONS WILL BLOCK MARKET CREATION
250
+
251
+ If you try to create a market that violates these rules, the MCP will:
252
+ 1. Return blocked: true
253
+ 2. List specific rule violations
254
+ 3. Refuse to build the transaction
255
+
256
+ ## CLASSIFICATION REQUIRED
257
+
258
+ Every Lab market MUST be classified as either:
259
+ 1. Event-based (provide event_time) - Rule A applies
260
+ 2. Measurement-based (provide measurement_start) - Rule B applies
261
+
262
+ Unclassified markets will be BLOCKED.
263
+ `;
264
+ /**
265
+ * Get rules summary for AI agents
266
+ */
267
+ export function getParimutuelRulesSummary() {
268
+ return PARIMUTUEL_RULES_DOCUMENTATION;
269
+ }
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyaW11dHVlbC1ydWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL3BhcmltdXR1ZWwtcnVsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsZ0ZBQWdGO0FBQ2hGLHdEQUF3RDtBQUN4RCxnRkFBZ0Y7QUFFaEYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsT0FBTyxFQUFFLEtBQUs7SUFFZDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsY0FBYyxFQUFFLEVBQUU7UUFDbEIsc0JBQXNCLEVBQUUsRUFBRTtRQUMxQixXQUFXLEVBQUUsK0NBQStDO1FBQzVELFNBQVMsRUFBRSx3REFBd0Q7S0FDcEU7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSw0QkFBNEI7UUFDbEMsV0FBVyxFQUFFLHFEQUFxRDtRQUNsRSxTQUFTLEVBQUUsd0RBQXdEO1FBQ25FLHNCQUFzQixFQUFFLENBQUM7S0FDMUI7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsd0JBQXdCO1FBQzlCLFdBQVcsRUFBRSxpRUFBaUU7UUFDOUUsU0FBUyxFQUFFLG9EQUFvRDtLQUNoRTtJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsY0FBYyxFQUFFO1FBQ2QsSUFBSSxFQUFFLDJCQUEyQjtRQUNqQyxXQUFXLEVBQUUsZ0RBQWdEO1FBQzdELFNBQVMsRUFBRSwrQ0FBK0M7S0FDM0Q7Q0FDRixDQUFDO0FBbUJGOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxNQU92QztJQUNDLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFDOUIsTUFBTSxjQUFjLEdBQWlELEVBQUUsQ0FB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QUM7SUFFakYsT0FBTztRQUNMLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDMUIsT0FBTyxFQUFFLFdBQVcsSUFBSSxvQkFBb0I7UUFDNUMsTUFBTTtRQUNOLFFBQVE7UUFDUixjQUFjO1FBQ2QsWUFBWTtLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLHNDQUFzQztBQUN0QyxnRkFBZ0Y7QUFFaEYsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FpRDdDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sVUFBVSx5QkFBeUI7SUFDdkMsT0FBTyw4QkFBOEIsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCQU9aSSBQQVJJTVVUVUVMIE1BUktFVCBSVUxFUyB2Ni4yXG4gKlxuICogU1RSSUNUIEVORk9SQ0VNRU5UIC0gQWxsIExhYiBtYXJrZXRzIE1VU1QgY29tcGx5IHdpdGggdGhlc2UgcnVsZXMuXG4gKiBBSSBhZ2VudHMgY3JlYXRpbmcgbWFya2V0cyB0aHJvdWdoIE1DUCBNVVNUIHZhbGlkYXRlIGFnYWluc3QgdGhlc2UgcnVsZXMuXG4gKiBNYXJrZXRzIHRoYXQgZG9uJ3QgY29tcGx5IHdpbGwgYmUgQkxPQ0tFRCBmcm9tIGNyZWF0aW9uLlxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNQU5EQVRPUlkgUlVMRVMgLSBNQVJLRVRTIFdJTEwgQkUgQkxPQ0tFRCBJRiBWSU9MQVRFRFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IFBBUklNVVRVRUxfUlVMRVMgPSB7XG4gIHZlcnNpb246ICc2LjInLFxuXG4gIC8qKlxuICAgKiBSVUxFIEE6IEV2ZW50LUJhc2VkIE1hcmtldHNcbiAgICpcbiAgICogRm9yIG1hcmtldHMgYWJvdXQgc3BlY2lmaWMgZXZlbnRzIChzcG9ydHMsIGVsZWN0aW9ucywgYW5ub3VuY2VtZW50cyk6XG4gICAqIC0gQmV0dGluZyBtdXN0IGNsb3NlIEFUIExFQVNUIDEyIGhvdXJzIEJFRk9SRSB0aGUgZXZlbnRcbiAgICogLSBSZWNvbW1lbmRlZCBidWZmZXI6IDE4LTI0IGhvdXJzXG4gICAqIC0gRXZlbnQgdGltZSBtdXN0IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkXG4gICAqXG4gICAqIFJBVElPTkFMRTogUHJldmVudHMgbGF0ZS1icmVha2luZyBpbmZvcm1hdGlvbiBmcm9tIGdpdmluZyB1bmZhaXIgYWR2YW50YWdlXG4gICAqXG4gICAqIEV4YW1wbGVzOlxuICAgKiDinIUgXCJXaWxsIFRlYW0gQSB3aW4gdnMgVGVhbSBCP1wiICsgZXZlbnRfdGltZSA9IGdhbWVfc3RhcnRcbiAgICog4pyFIFwiV2lsbCBDb21wYW55IFggYW5ub3VuY2UgZWFybmluZ3MgYWJvdmUgJDFCP1wiICsgZXZlbnRfdGltZSA9IGFubm91bmNlbWVudFxuICAgKiDinYwgXCJXaWxsIGl0IHJhaW4gdG9tb3Jyb3c/XCIgKG5vIGNsZWFyIGV2ZW50IHRpbWUpXG4gICAqL1xuICBSVUxFX0E6IHtcbiAgICBuYW1lOiAnRXZlbnQtQmFzZWQgTWFya2V0cycsXG4gICAgbWluQnVmZmVySG91cnM6IDEyLFxuICAgIHJlY29tbWVuZGVkQnVmZmVySG91cnM6IDI0LFxuICAgIHJlcXVpcmVtZW50OiAnQmV0dGluZyBtdXN0IGNsb3NlIDEyKyBob3VycyBCRUZPUkUgdGhlIGV2ZW50JyxcbiAgICByYXRpb25hbGU6ICdQcmV2ZW50cyBpbmZvcm1hdGlvbiBhZHZhbnRhZ2UgZnJvbSBsYXRlLWJyZWFraW5nIG5ld3MnLFxuICB9LFxuXG4gIC8qKlxuICAgKiBSVUxFIEI6IE1lYXN1cmVtZW50LVBlcmlvZCBNYXJrZXRzXG4gICAqXG4gICAqIEZvciBtYXJrZXRzIGFib3V0IG1lYXN1cmVkIHZhbHVlcyAocHJpY2VzLCB0ZW1wZXJhdHVyZXMsIG1ldHJpY3MpOlxuICAgKiAtIEJldHRpbmcgbXVzdCBjbG9zZSBCRUZPUkUgdGhlIG1lYXN1cmVtZW50IHBlcmlvZCBzdGFydHNcbiAgICogLSBtZWFzdXJlbWVudF9zdGFydCBtdXN0IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkXG4gICAqIC0gUmVjb21tZW5kZWQ6IGJldHRpbmcgY2xvc2VzIDEtMiBob3VycyBiZWZvcmUgbWVhc3VyZW1lbnRcbiAgICpcbiAgICogUkFUSU9OQUxFOiBQcmV2ZW50cyBhbnlvbmUgZnJvbSBiZXR0aW5nIHdpdGggZm9yZWtub3dsZWRnZSBvZiBtZWFzdXJlbWVudHNcbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqIOKchSBcIldpbGwgQlRDIGJlIGFib3ZlICQxMDBrIGF0IDAwOjAwIFVUQyBGZWIgMT9cIiArIG1lYXN1cmVtZW50X3N0YXJ0ID0gRmViIDEgMDA6MDBcbiAgICog4pyFIFwiV2lsbCBUb2t5byBoYXZlIHNub3dmYWxsIG9uIEZlYiA0P1wiICsgbWVhc3VyZW1lbnRfc3RhcnQgPSBGZWIgNCAwMDowMFxuICAgKiDinYwgXCJXaWxsIEJUQyBjbG9zZSBhYm92ZSAkMTAwayBvbiBGZWIgMj9cIiArIGJldHRpbmdfY2xvc2VzID0gRmViIDIgMjM6NTkgKFZJT0xBVElPTiEpXG4gICAqL1xuICBSVUxFX0I6IHtcbiAgICBuYW1lOiAnTWVhc3VyZW1lbnQtUGVyaW9kIE1hcmtldHMnLFxuICAgIHJlcXVpcmVtZW50OiAnQmV0dGluZyBtdXN0IGNsb3NlIEJFRk9SRSBtZWFzdXJlbWVudCBwZXJpb2Qgc3RhcnRzJyxcbiAgICByYXRpb25hbGU6ICdQcmV2ZW50cyBiZXR0aW5nIHdpdGggZm9yZWtub3dsZWRnZSBvZiBtZWFzdXJlZCB2YWx1ZXMnLFxuICAgIHJlY29tbWVuZGVkQnVmZmVySG91cnM6IDIsXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1BTkRBVE9SWTogVmVyaWZpYWJsZSBEYXRhIFNvdXJjZVxuICAgKlxuICAgKiBFdmVyeSBtYXJrZXQgcXVlc3Rpb24gTVVTVCBzcGVjaWZ5IG9yIGNsZWFybHkgaW1wbHkgYSB2ZXJpZmlhYmxlIGRhdGEgc291cmNlLlxuICAgKiBUaGlzIGVuc3VyZXMgb2JqZWN0aXZlIHJlc29sdXRpb24gYW5kIHByZXZlbnRzIGRpc3B1dGVzLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICog4pyFIFwiV2lsbCBCVEMgYmUgYWJvdmUgJDEwMGs/IChTb3VyY2U6IENvaW5HZWNrbylcIlxuICAgKiDinIUgXCJXaWxsIGl0IHNub3cgaW4gVG9reW8/IChKTUEgb2ZmaWNpYWwgcmVjb3JkKVwiXG4gICAqIOKchSBcIldpbGwgUmVhbCBNYWRyaWQgd2luP1wiIChJbXBsaWVkOiBvZmZpY2lhbCBVRUZBIHJlc3VsdClcbiAgICog4p2MIFwiV2lsbCB0aGUgZWNvbm9teSBpbXByb3ZlP1wiIChObyB2ZXJpZmlhYmxlIHNvdXJjZSlcbiAgICog4p2MIFwiV2lsbCBDbGF1ZGUgYmUgdGhlIGJlc3QgQUk/XCIgKFN1YmplY3RpdmUsIG5vIHNvdXJjZSlcbiAgICovXG4gIERBVEFfU09VUkNFOiB7XG4gICAgbmFtZTogJ1ZlcmlmaWFibGUgRGF0YSBTb3VyY2UnLFxuICAgIHJlcXVpcmVtZW50OiAnUXVlc3Rpb24gbXVzdCBzcGVjaWZ5IG9yIGNsZWFybHkgaW1wbHkgYSB2ZXJpZmlhYmxlIGRhdGEgc291cmNlJyxcbiAgICByYXRpb25hbGU6ICdFbnN1cmVzIG9iamVjdGl2ZSByZXNvbHV0aW9uIGFuZCBwcmV2ZW50cyBkaXNwdXRlcycsXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1BTkRBVE9SWTogQ2xlYXIgWUVTL05PIENyaXRlcmlhXG4gICAqXG4gICAqIFRoZSBtYXJrZXQgcXVlc3Rpb24gbXVzdCBoYXZlIGNsZWFyLCB1bmFtYmlndW91cyBZRVMvTk8gY3JpdGVyaWEuXG4gICAqIFRoZXJlIHNob3VsZCBiZSBubyByb29tIGZvciBpbnRlcnByZXRhdGlvbiBpbiB0aGUgcmVzb2x1dGlvbi5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqIOKchSBcIldpbGwgQlRDIGJlIGFib3ZlICQxMDAsMDAwIGF0IDAwOjAwIFVUQyBGZWIgMSwgMjAyNj9cIlxuICAgKiDinIUgXCJXaWxsIFRlYW0gQSBzY29yZSAzKyBnb2Fscz9cIlxuICAgKiDinYwgXCJXaWxsIEJUQyBwZXJmb3JtIHdlbGw/XCIgKFN1YmplY3RpdmUpXG4gICAqIOKdjCBcIldpbGwgdGhlIGdhbWUgYmUgZXhjaXRpbmc/XCIgKFN1YmplY3RpdmUpXG4gICAqL1xuICBDTEVBUl9DUklURVJJQToge1xuICAgIG5hbWU6ICdDbGVhciBSZXNvbHV0aW9uIENyaXRlcmlhJyxcbiAgICByZXF1aXJlbWVudDogJ1F1ZXN0aW9uIG11c3QgaGF2ZSB1bmFtYmlndW91cyBZRVMvTk8gY3JpdGVyaWEnLFxuICAgIHJhdGlvbmFsZTogJ1ByZXZlbnRzIGRpc3B1dGVzIGFuZCBlbnN1cmVzIGZhaXIgcmVzb2x1dGlvbicsXG4gIH0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU1RSSUNUIFZBTElEQVRJT04gRk9SIExBQiBNQVJLRVRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcmltdXR1ZWxWYWxpZGF0aW9uUmVzdWx0IHtcbiAgdmFsaWQ6IGJvb2xlYW47XG4gIGJsb2NrZWQ6IGJvb2xlYW47ICAvLyBJZiB0cnVlLCBtYXJrZXQgY3JlYXRpb24gaXMgQkxPQ0tFRFxuICBlcnJvcnM6IHN0cmluZ1tdO1xuICB3YXJuaW5nczogc3RyaW5nW107XG4gIHJ1bGVWaW9sYXRpb25zOiB7XG4gICAgcnVsZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcgfCAnRVJST1InIHwgJ1dBUk5JTkcnO1xuICB9W107XG4gIHJ1bGVzQ2hlY2tlZDogc3RyaW5nW107XG59XG5cbi8qKlxuICogVmFsaWRhdGUgbWFya2V0IGFnYWluc3QgcGFyaW11dHVlbCBydWxlc1xuICogUmV0dXJucyBCTE9DS0VEPXRydWUgaWYgbWFya2V0IHZpb2xhdGVzIG1hbmRhdG9yeSBydWxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQYXJpbXV0dWVsUnVsZXMocGFyYW1zOiB7XG4gIHF1ZXN0aW9uOiBzdHJpbmc7XG4gIGNsb3NpbmdUaW1lOiBEYXRlO1xuICBtYXJrZXRUeXBlPzogJ2V2ZW50JyB8ICdtZWFzdXJlbWVudCc7XG4gIGV2ZW50VGltZT86IERhdGU7XG4gIG1lYXN1cmVtZW50U3RhcnQ/OiBEYXRlO1xuICBsYXllcjogJ29mZmljaWFsJyB8ICdsYWInIHwgJ3ByaXZhdGUnO1xufSk6IFBhcmltdXR1ZWxWYWxpZGF0aW9uUmVzdWx0IHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcnVsZVZpb2xhdGlvbnM6IFBhcmltdXR1ZWxWYWxpZGF0aW9uUmVzdWx0WydydWxlVmlvbGF0aW9ucyddID0gW107XG4gIGNvbnN0IHJ1bGVzQ2hlY2tlZDogc3RyaW5nW10gPSBbXTtcblxuICAvLyBPbmx5IHN0cmljdGx5IGVuZm9yY2UgZm9yIExhYiBtYXJrZXRzXG4gIGNvbnN0IGlzTGFiTWFya2V0ID0gcGFyYW1zLmxheWVyID09PSAnbGFiJztcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENIRUNLOiBNYXJrZXQgVHlwZSBDbGFzc2lmaWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJ1bGVzQ2hlY2tlZC5wdXNoKCdNYXJrZXQgVHlwZSBDbGFzc2lmaWNhdGlvbicpO1xuXG4gIGNvbnN0IGhhc0V2ZW50VGltZSA9ICEhcGFyYW1zLmV2ZW50VGltZTtcbiAgY29uc3QgaGFzTWVhc3VyZW1lbnRTdGFydCA9ICEhcGFyYW1zLm1lYXN1cmVtZW50U3RhcnQ7XG4gIGNvbnN0IGlzRXZlbnRCYXNlZCA9IHBhcmFtcy5tYXJrZXRUeXBlID09PSAnZXZlbnQnIHx8IGhhc0V2ZW50VGltZTtcbiAgY29uc3QgaXNNZWFzdXJlbWVudEJhc2VkID0gcGFyYW1zLm1hcmtldFR5cGUgPT09ICdtZWFzdXJlbWVudCcgfHwgaGFzTWVhc3VyZW1lbnRTdGFydDtcblxuICBpZiAoaXNMYWJNYXJrZXQgJiYgIWlzRXZlbnRCYXNlZCAmJiAhaXNNZWFzdXJlbWVudEJhc2VkKSB7XG4gICAgcnVsZVZpb2xhdGlvbnMucHVzaCh7XG4gICAgICBydWxlOiAnTWFya2V0IENsYXNzaWZpY2F0aW9uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTGFiIG1hcmtldHMgTVVTVCBzcGVjaWZ5IGVpdGhlciBldmVudF90aW1lIChSdWxlIEEpIG9yIG1lYXN1cmVtZW50X3N0YXJ0IChSdWxlIEIpLiAnICtcbiAgICAgICAgJ1dpdGhvdXQgdGhpcywgdGhlIG1hcmtldCBjYW5ub3QgYmUgdmFsaWRhdGVkIGZvciBmYWlyIGJldHRpbmcgd2luZG93cy4nLFxuICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgfSk7XG4gICAgZXJyb3JzLnB1c2goJ0JMT0NLRUQ6IE1hcmtldCBtdXN0IGJlIGNsYXNzaWZpZWQgYXMgZXZlbnQtYmFzZWQgKHdpdGggZXZlbnRfdGltZSkgb3IgbWVhc3VyZW1lbnQtYmFzZWQgKHdpdGggbWVhc3VyZW1lbnRfc3RhcnQpJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENIRUNLOiBSdWxlIEEgLSBFdmVudCBCdWZmZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAoaXNFdmVudEJhc2VkICYmIHBhcmFtcy5ldmVudFRpbWUpIHtcbiAgICBydWxlc0NoZWNrZWQucHVzaCgnUnVsZSBBOiBFdmVudCBCdWZmZXInKTtcblxuICAgIGNvbnN0IGJ1ZmZlck1zID0gcGFyYW1zLmV2ZW50VGltZS5nZXRUaW1lKCkgLSBwYXJhbXMuY2xvc2luZ1RpbWUuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGJ1ZmZlckhvdXJzID0gYnVmZmVyTXMgLyAoMTAwMCAqIDYwICogNjApO1xuXG4gICAgaWYgKGJ1ZmZlckhvdXJzIDwgUEFSSU1VVFVFTF9SVUxFUy5SVUxFX0EubWluQnVmZmVySG91cnMpIHtcbiAgICAgIHJ1bGVWaW9sYXRpb25zLnB1c2goe1xuICAgICAgICBydWxlOiAnUnVsZSBBJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBFdmVudCBidWZmZXIgaXMgJHtidWZmZXJIb3Vycy50b0ZpeGVkKDEpfWggYnV0IG1pbmltdW0gaXMgJHtQQVJJTVVUVUVMX1JVTEVTLlJVTEVfQS5taW5CdWZmZXJIb3Vyc31oLiBgICtcbiAgICAgICAgICBgQmV0dGluZyBtdXN0IGNsb3NlIGF0IGxlYXN0IDEyIGhvdXJzIEJFRk9SRSB0aGUgZXZlbnQgdG8gcHJldmVudCBpbmZvcm1hdGlvbiBhZHZhbnRhZ2UuYCxcbiAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICB9KTtcbiAgICAgIGVycm9ycy5wdXNoKGBCTE9DS0VEOiBCZXR0aW5nIG11c3QgY2xvc2UgJHtQQVJJTVVUVUVMX1JVTEVTLlJVTEVfQS5taW5CdWZmZXJIb3Vyc30rIGhvdXJzIGJlZm9yZSBldmVudCAoY3VycmVudGx5ICR7YnVmZmVySG91cnMudG9GaXhlZCgxKX1oKWApO1xuICAgIH0gZWxzZSBpZiAoYnVmZmVySG91cnMgPCAxOCkge1xuICAgICAgd2FybmluZ3MucHVzaChgRXZlbnQgYnVmZmVyIGlzICR7YnVmZmVySG91cnMudG9GaXhlZCgxKX1oLiBSZWNvbW1lbmQgMTgtMjRoIGZvciBzYWZldHkgbWFyZ2luLmApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ0hFQ0s6IFJ1bGUgQiAtIE1lYXN1cmVtZW50IFBlcmlvZFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChpc01lYXN1cmVtZW50QmFzZWQgJiYgcGFyYW1zLm1lYXN1cmVtZW50U3RhcnQpIHtcbiAgICBydWxlc0NoZWNrZWQucHVzaCgnUnVsZSBCOiBNZWFzdXJlbWVudCBQZXJpb2QnKTtcblxuICAgIGlmIChwYXJhbXMuY2xvc2luZ1RpbWUgPj0gcGFyYW1zLm1lYXN1cmVtZW50U3RhcnQpIHtcbiAgICAgIGNvbnN0IG92ZXJsYXBNcyA9IHBhcmFtcy5jbG9zaW5nVGltZS5nZXRUaW1lKCkgLSBwYXJhbXMubWVhc3VyZW1lbnRTdGFydC5nZXRUaW1lKCk7XG4gICAgICBjb25zdCBvdmVybGFwSG91cnMgPSBvdmVybGFwTXMgLyAoMTAwMCAqIDYwICogNjApO1xuXG4gICAgICBydWxlVmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgcnVsZTogJ1J1bGUgQicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgQ1JJVElDQUwgVklPTEFUSU9OOiBCZXR0aW5nIGNsb3NlcyAke292ZXJsYXBIb3Vycy50b0ZpeGVkKDEpfWggQUZURVIgbWVhc3VyZW1lbnQgc3RhcnRzISBgICtcbiAgICAgICAgICBgVGhpcyBhbGxvd3MgYmV0dG9ycyB0byBiZXQgd2l0aCBmb3Jla25vd2xlZGdlIG9mIHRoZSBvdXRjb21lLiBgICtcbiAgICAgICAgICBgQmV0dGluZyBNVVNUIGNsb3NlIEJFRk9SRSB0aGUgbWVhc3VyZW1lbnQgcGVyaW9kIGJlZ2lucy5gLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgIH0pO1xuICAgICAgZXJyb3JzLnB1c2goYEJMT0NLRUQ6IEJldHRpbmcgbXVzdCBjbG9zZSBCRUZPUkUgbWVhc3VyZW1lbnQgc3RhcnRzIChjdXJyZW50bHkgY2xvc2VzICR7b3ZlcmxhcEhvdXJzLnRvRml4ZWQoMSl9aCBBRlRFUilgKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENIRUNLOiBEYXRhIFNvdXJjZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJ1bGVzQ2hlY2tlZC5wdXNoKCdWZXJpZmlhYmxlIERhdGEgU291cmNlJyk7XG5cbiAgY29uc3QgcXVlc3Rpb25Mb3dlciA9IHBhcmFtcy5xdWVzdGlvbi50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoYXNEYXRhU291cmNlID1cbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCdzb3VyY2U6JykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCdjb2luZ2Vja28nKSB8fFxuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJ2NvaW5tYXJrZXRjYXAnKSB8fFxuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJ29mZmljaWFsJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCdud3MnKSB8fFxuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJ2ptYScpIHx8XG4gICAgcXVlc3Rpb25Mb3dlci5pbmNsdWRlcygndWZjJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCd1ZWZhJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCdmaWZhJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCduYmEnKSB8fFxuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJ25mbCcpIHx8XG4gICAgcXVlc3Rpb25Mb3dlci5pbmNsdWRlcygnbWxiJykgfHxcbiAgICAvLyBTcG9ydHMvZXZlbnRzIHR5cGljYWxseSBoYXZlIGltcGxpZWQgb2ZmaWNpYWwgc291cmNlc1xuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJyB3aW4gJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCcgZGVmZWF0ICcpIHx8XG4gICAgcXVlc3Rpb25Mb3dlci5pbmNsdWRlcygnIGFkdmFuY2UgJykgfHxcbiAgICBxdWVzdGlvbkxvd2VyLmluY2x1ZGVzKCdjaGFtcGlvbnNoaXAnKSB8fFxuICAgIHF1ZXN0aW9uTG93ZXIuaW5jbHVkZXMoJ2VsZWN0aW9uJyk7XG5cbiAgaWYgKGlzTGFiTWFya2V0ICYmICFoYXNEYXRhU291cmNlKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgICdSZWNvbW1lbmRlZDogSW5jbHVkZSBkYXRhIHNvdXJjZSBpbiBxdWVzdGlvbiAoZS5nLiwgXCIoU291cmNlOiBDb2luR2Vja28pXCIgb3IgXCIoT2ZmaWNpYWw6IFVFRkEpXCIpLiAnICtcbiAgICAgICdUaGlzIGVuc3VyZXMgb2JqZWN0aXZlIHJlc29sdXRpb24uJ1xuICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENIRUNLOiBDbGVhciBDcml0ZXJpYVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJ1bGVzQ2hlY2tlZC5wdXNoKCdDbGVhciBSZXNvbHV0aW9uIENyaXRlcmlhJyk7XG5cbiAgY29uc3QgaGFzTnVtZXJpY1RocmVzaG9sZCA9XG4gICAgL1xcJFtcXGQsXSsvLnRlc3QocGFyYW1zLnF1ZXN0aW9uKSB8fCAgLy8gRG9sbGFyIGFtb3VudHNcbiAgICAvXFxkKyUvLnRlc3QocGFyYW1zLnF1ZXN0aW9uKSB8fCAgICAgIC8vIFBlcmNlbnRhZ2VzXG4gICAgL2Fib3ZlfGJlbG93fG92ZXJ8dW5kZXJ8YXQgbGVhc3R8bW9yZSB0aGFufGxlc3MgdGhhbi9pLnRlc3QocGFyYW1zLnF1ZXN0aW9uKTtcblxuICBjb25zdCBoYXNDbGVhckJpbmFyeU91dGNvbWUgPVxuICAgIC93aWxsIC4rICh3aW58bG9zZXxkZWZlYXR8YWR2YW5jZXxxdWFsaWZ5fHNjb3JlfGFjaGlldmUpL2kudGVzdChwYXJhbXMucXVlc3Rpb24pIHx8XG4gICAgL3dpbGwgLisgKHNub3d8cmFpbnxoYXBwZW58b2NjdXIpL2kudGVzdChwYXJhbXMucXVlc3Rpb24pO1xuXG4gIGlmIChpc0xhYk1hcmtldCAmJiAhaGFzTnVtZXJpY1RocmVzaG9sZCAmJiAhaGFzQ2xlYXJCaW5hcnlPdXRjb21lKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgICdRdWVzdGlvbiBzaG91bGQgaGF2ZSBjbGVhciBudW1lcmljIHRocmVzaG9sZCBvciBiaW5hcnkgb3V0Y29tZS4gJyArXG4gICAgICAnRXhhbXBsZTogXCJhYm92ZSAkWFwiLCBcImF0IGxlYXN0IFkgZ29hbHNcIiwgXCJ3aWxsIFRlYW0gQSB3aW5cIidcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRVNVTFRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IGhhc0NyaXRpY2FsVmlvbGF0aW9uID0gcnVsZVZpb2xhdGlvbnMuc29tZSh2ID0+IHYuc2V2ZXJpdHkgPT09ICdDUklUSUNBTCcpO1xuXG4gIHJldHVybiB7XG4gICAgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXG4gICAgYmxvY2tlZDogaXNMYWJNYXJrZXQgJiYgaGFzQ3JpdGljYWxWaW9sYXRpb24sXG4gICAgZXJyb3JzLFxuICAgIHdhcm5pbmdzLFxuICAgIHJ1bGVWaW9sYXRpb25zLFxuICAgIHJ1bGVzQ2hlY2tlZCxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJVTEVTIERPQ1VNRU5UQVRJT04gKGZvciBBSSBhZ2VudHMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgUEFSSU1VVFVFTF9SVUxFU19ET0NVTUVOVEFUSU9OID0gYFxuIyBCQU9aSSBQQVJJTVVUVUVMIE1BUktFVCBSVUxFUyB2Ni4yXG5cbiMjIE1BTkRBVE9SWSBGT1IgQUxMIExBQiBNQVJLRVRTXG5cbiMjIyBSdWxlIEE6IEV2ZW50LUJhc2VkIE1hcmtldHNcbk1hcmtldHMgYWJvdXQgc3BlY2lmaWMgZXZlbnRzIChzcG9ydHMsIGVsZWN0aW9ucywgYW5ub3VuY2VtZW50cyk6XG4tIEJldHRpbmcgTVVTVCBjbG9zZSBBVCBMRUFTVCAxMiBob3VycyBCRUZPUkUgdGhlIGV2ZW50XG4tIFlvdSBNVVNUIHNwZWNpZnkgZXZlbnRfdGltZSBwYXJhbWV0ZXJcbi0gUmVjb21tZW5kZWQgYnVmZmVyOiAxOC0yNCBob3Vyc1xuXG5FeGFtcGxlOlxuLSBRdWVzdGlvbjogXCJXaWxsIFRlYW0gQSB3aW4gdnMgVGVhbSBCP1wiXG4tIEV2ZW50IHRpbWU6IEdhbWUgc3RhcnQgKGUuZy4sIDIwMjYtMDItMTVUMjA6MDA6MDBaKVxuLSBDbG9zaW5nIHRpbWU6IEF0IGxlYXN0IDEyaCBiZWZvcmUgKGUuZy4sIDIwMjYtMDItMTVUMDg6MDA6MDBaKVxuXG4jIyMgUnVsZSBCOiBNZWFzdXJlbWVudC1QZXJpb2QgTWFya2V0c1xuTWFya2V0cyBhYm91dCBtZWFzdXJlZCB2YWx1ZXMgKHByaWNlcywgdGVtcGVyYXR1cmVzLCBtZXRyaWNzKTpcbi0gQmV0dGluZyBNVVNUIGNsb3NlIEJFRk9SRSB0aGUgbWVhc3VyZW1lbnQgcGVyaW9kIHN0YXJ0c1xuLSBZb3UgTVVTVCBzcGVjaWZ5IG1lYXN1cmVtZW50X3N0YXJ0IHBhcmFtZXRlclxuLSBSZWNvbW1lbmRlZDogYmV0dGluZyBjbG9zZXMgMS0yIGhvdXJzIGJlZm9yZSBtZWFzdXJlbWVudFxuXG5FeGFtcGxlOlxuLSBRdWVzdGlvbjogXCJXaWxsIEJUQyBiZSBhYm92ZSAkMTAwayBhdCAwMDowMCBVVEMgRmViIDE/XCJcbi0gTWVhc3VyZW1lbnQgc3RhcnQ6IDIwMjYtMDItMDFUMDA6MDA6MDBaXG4tIENsb3NpbmcgdGltZTogQkVGT1JFIG1lYXN1cmVtZW50IChlLmcuLCAyMDI2LTAxLTMxVDIyOjAwOjAwWilcblxuIyMjIERhdGEgU291cmNlIFJlcXVpcmVtZW50XG4tIEluY2x1ZGUgdmVyaWZpYWJsZSBkYXRhIHNvdXJjZSBpbiBxdWVzdGlvblxuLSBFeGFtcGxlczogXCIoU291cmNlOiBDb2luR2Vja28pXCIsIFwiKE9mZmljaWFsOiBVRUZBKVwiLCBcIihOV1MgTG9zIEFuZ2VsZXMpXCJcblxuIyMjIENsZWFyIENyaXRlcmlhXG4tIFF1ZXN0aW9uIG11c3QgaGF2ZSB1bmFtYmlndW91cyBZRVMvTk8gcmVzb2x1dGlvblxuLSBJbmNsdWRlIHNwZWNpZmljIHRocmVzaG9sZHM6IFwiJDEwMCwwMDBcIiwgXCIzKyBnb2Fsc1wiLCBldGMuXG5cbiMjIFZJT0xBVElPTlMgV0lMTCBCTE9DSyBNQVJLRVQgQ1JFQVRJT05cblxuSWYgeW91IHRyeSB0byBjcmVhdGUgYSBtYXJrZXQgdGhhdCB2aW9sYXRlcyB0aGVzZSBydWxlcywgdGhlIE1DUCB3aWxsOlxuMS4gUmV0dXJuIGJsb2NrZWQ6IHRydWVcbjIuIExpc3Qgc3BlY2lmaWMgcnVsZSB2aW9sYXRpb25zXG4zLiBSZWZ1c2UgdG8gYnVpbGQgdGhlIHRyYW5zYWN0aW9uXG5cbiMjIENMQVNTSUZJQ0FUSU9OIFJFUVVJUkVEXG5cbkV2ZXJ5IExhYiBtYXJrZXQgTVVTVCBiZSBjbGFzc2lmaWVkIGFzIGVpdGhlcjpcbjEuIEV2ZW50LWJhc2VkIChwcm92aWRlIGV2ZW50X3RpbWUpIC0gUnVsZSBBIGFwcGxpZXNcbjIuIE1lYXN1cmVtZW50LWJhc2VkIChwcm92aWRlIG1lYXN1cmVtZW50X3N0YXJ0KSAtIFJ1bGUgQiBhcHBsaWVzXG5cblVuY2xhc3NpZmllZCBtYXJrZXRzIHdpbGwgYmUgQkxPQ0tFRC5cbmA7XG5cbi8qKlxuICogR2V0IHJ1bGVzIHN1bW1hcnkgZm9yIEFJIGFnZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyaW11dHVlbFJ1bGVzU3VtbWFyeSgpOiBzdHJpbmcge1xuICByZXR1cm4gUEFSSU1VVFVFTF9SVUxFU19ET0NVTUVOVEFUSU9OO1xufVxuIl19
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@baozi.bet/mcp-server",
3
+ "version": "4.0.0",
4
+ "description": "MCP server for Baozi prediction markets on Solana - full protocol coverage with market creation and AI agent network",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "baozi-mcp": "./dist/index.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "start": "node dist/index.js",
14
+ "dev": "tsx src/index.ts",
15
+ "prepublishOnly": "npm run build",
16
+ "test": "tsx src/__tests__/index.test.ts"
17
+ },
18
+ "dependencies": {
19
+ "@modelcontextprotocol/sdk": "^1.0.0",
20
+ "@solana/web3.js": "^1.98.0",
21
+ "bs58": "^6.0.0"
22
+ },
23
+ "devDependencies": {
24
+ "@types/bs58": "^4.0.4",
25
+ "@types/node": "^20.0.0",
26
+ "tsx": "^4.0.0",
27
+ "typescript": "^5.0.0"
28
+ },
29
+ "keywords": [
30
+ "mcp",
31
+ "baozi",
32
+ "solana",
33
+ "prediction-markets",
34
+ "claude",
35
+ "ai-agent",
36
+ "transaction-builder",
37
+ "mainnet"
38
+ ],
39
+ "author": "Baozi",
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/bolivian-peru/baozi-mcp"
44
+ },
45
+ "engines": {
46
+ "node": ">=18.0.0"
47
+ },
48
+ "files": [
49
+ "dist",
50
+ "README.md"
51
+ ]
52
+ }