@xpr-agents/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,25 @@
1
+ export { AgentRegistry } from './AgentRegistry';
2
+ export { FeedbackRegistry } from './FeedbackRegistry';
3
+ export { ValidationRegistry } from './ValidationRegistry';
4
+ export { EscrowRegistry } from './EscrowRegistry';
5
+ export type { Job, JobState, Milestone, MilestoneState, EscrowDispute, DisputeResolution, Arbitrator, CreateJobData, AddMilestoneData, JobListOptions, } from './EscrowRegistry';
6
+ export * from './types';
7
+ export { calculateTrustScore, getTrustRating, formatXpr, parseXpr, formatTimestamp, isValidAccountName, isValidUrl, getKycWeight, } from './utils';
8
+ export declare const CONTRACTS: {
9
+ readonly AGENT_CORE: "agentcore";
10
+ readonly AGENT_FEED: "agentfeed";
11
+ readonly AGENT_VALID: "agentvalid";
12
+ readonly AGENT_ESCROW: "agentescrow";
13
+ };
14
+ export declare const NETWORKS: {
15
+ readonly MAINNET: {
16
+ readonly rpc: "https://proton.eosusa.io";
17
+ readonly hyperion: "https://proton.eosusa.io";
18
+ readonly chainId: "384da888112027f0321850a169f737c33e53b388aad48b5adace4bab97f437e0";
19
+ };
20
+ readonly TESTNET: {
21
+ readonly rpc: "https://tn1.protonnz.com";
22
+ readonly hyperion: "https://proton-testnet.eosusa.io";
23
+ readonly chainId: "71ee83bcf52142d61019d95f9cc5427ba6a0d7ff8accd9e2088ae2abeaf3d3dd";
24
+ };
25
+ };
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.NETWORKS = exports.CONTRACTS = exports.getKycWeight = exports.isValidUrl = exports.isValidAccountName = exports.formatTimestamp = exports.parseXpr = exports.formatXpr = exports.getTrustRating = exports.calculateTrustScore = exports.EscrowRegistry = exports.ValidationRegistry = exports.FeedbackRegistry = exports.AgentRegistry = void 0;
18
+ // Main SDK exports
19
+ var AgentRegistry_1 = require("./AgentRegistry");
20
+ Object.defineProperty(exports, "AgentRegistry", { enumerable: true, get: function () { return AgentRegistry_1.AgentRegistry; } });
21
+ var FeedbackRegistry_1 = require("./FeedbackRegistry");
22
+ Object.defineProperty(exports, "FeedbackRegistry", { enumerable: true, get: function () { return FeedbackRegistry_1.FeedbackRegistry; } });
23
+ var ValidationRegistry_1 = require("./ValidationRegistry");
24
+ Object.defineProperty(exports, "ValidationRegistry", { enumerable: true, get: function () { return ValidationRegistry_1.ValidationRegistry; } });
25
+ var EscrowRegistry_1 = require("./EscrowRegistry");
26
+ Object.defineProperty(exports, "EscrowRegistry", { enumerable: true, get: function () { return EscrowRegistry_1.EscrowRegistry; } });
27
+ // Type exports
28
+ __exportStar(require("./types"), exports);
29
+ // Utility exports
30
+ var utils_1 = require("./utils");
31
+ Object.defineProperty(exports, "calculateTrustScore", { enumerable: true, get: function () { return utils_1.calculateTrustScore; } });
32
+ Object.defineProperty(exports, "getTrustRating", { enumerable: true, get: function () { return utils_1.getTrustRating; } });
33
+ Object.defineProperty(exports, "formatXpr", { enumerable: true, get: function () { return utils_1.formatXpr; } });
34
+ Object.defineProperty(exports, "parseXpr", { enumerable: true, get: function () { return utils_1.parseXpr; } });
35
+ Object.defineProperty(exports, "formatTimestamp", { enumerable: true, get: function () { return utils_1.formatTimestamp; } });
36
+ Object.defineProperty(exports, "isValidAccountName", { enumerable: true, get: function () { return utils_1.isValidAccountName; } });
37
+ Object.defineProperty(exports, "isValidUrl", { enumerable: true, get: function () { return utils_1.isValidUrl; } });
38
+ Object.defineProperty(exports, "getKycWeight", { enumerable: true, get: function () { return utils_1.getKycWeight; } });
39
+ // Default contract names
40
+ exports.CONTRACTS = {
41
+ AGENT_CORE: 'agentcore',
42
+ AGENT_FEED: 'agentfeed',
43
+ AGENT_VALID: 'agentvalid',
44
+ AGENT_ESCROW: 'agentescrow',
45
+ };
46
+ // Network endpoints
47
+ exports.NETWORKS = {
48
+ MAINNET: {
49
+ rpc: 'https://proton.eosusa.io',
50
+ hyperion: 'https://proton.eosusa.io',
51
+ chainId: '384da888112027f0321850a169f737c33e53b388aad48b5adace4bab97f437e0',
52
+ },
53
+ TESTNET: {
54
+ rpc: 'https://tn1.protonnz.com',
55
+ hyperion: 'https://proton-testnet.eosusa.io',
56
+ chainId: '71ee83bcf52142d61019d95f9cc5427ba6a0d7ff8accd9e2088ae2abeaf3d3dd',
57
+ },
58
+ };
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQkFBbUI7QUFDbkIsaURBQWdEO0FBQXZDLDhHQUFBLGFBQWEsT0FBQTtBQUN0Qix1REFBc0Q7QUFBN0Msb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsMkRBQTBEO0FBQWpELHdIQUFBLGtCQUFrQixPQUFBO0FBQzNCLG1EQUFrRDtBQUF6QyxnSEFBQSxjQUFjLE9BQUE7QUFnQnZCLGVBQWU7QUFDZiwwQ0FBd0I7QUFFeEIsa0JBQWtCO0FBQ2xCLGlDQVNpQjtBQVJmLDRHQUFBLG1CQUFtQixPQUFBO0FBQ25CLHVHQUFBLGNBQWMsT0FBQTtBQUNkLGtHQUFBLFNBQVMsT0FBQTtBQUNULGlHQUFBLFFBQVEsT0FBQTtBQUNSLHdHQUFBLGVBQWUsT0FBQTtBQUNmLDJHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLG1HQUFBLFVBQVUsT0FBQTtBQUNWLHFHQUFBLFlBQVksT0FBQTtBQUdkLHlCQUF5QjtBQUNaLFFBQUEsU0FBUyxHQUFHO0lBQ3ZCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFdBQVcsRUFBRSxZQUFZO0lBQ3pCLFlBQVksRUFBRSxhQUFhO0NBQ25CLENBQUM7QUFFWCxvQkFBb0I7QUFDUCxRQUFBLFFBQVEsR0FBRztJQUN0QixPQUFPLEVBQUU7UUFDUCxHQUFHLEVBQUUsMEJBQTBCO1FBQy9CLFFBQVEsRUFBRSwwQkFBMEI7UUFDcEMsT0FBTyxFQUFFLGtFQUFrRTtLQUM1RTtJQUNELE9BQU8sRUFBRTtRQUNQLEdBQUcsRUFBRSwwQkFBMEI7UUFDL0IsUUFBUSxFQUFFLGtDQUFrQztRQUM1QyxPQUFPLEVBQUUsa0VBQWtFO0tBQzVFO0NBQ08sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIE1haW4gU0RLIGV4cG9ydHNcbmV4cG9ydCB7IEFnZW50UmVnaXN0cnkgfSBmcm9tICcuL0FnZW50UmVnaXN0cnknO1xuZXhwb3J0IHsgRmVlZGJhY2tSZWdpc3RyeSB9IGZyb20gJy4vRmVlZGJhY2tSZWdpc3RyeSc7XG5leHBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuL1ZhbGlkYXRpb25SZWdpc3RyeSc7XG5leHBvcnQgeyBFc2Nyb3dSZWdpc3RyeSB9IGZyb20gJy4vRXNjcm93UmVnaXN0cnknO1xuXG4vLyBFc2Nyb3cgdHlwZXMgKGV4cG9ydGVkIHNlcGFyYXRlbHkgc2luY2UgdGhleSdyZSBkZWZpbmVkIGluIHRoZSByZWdpc3RyeSBmaWxlKVxuZXhwb3J0IHR5cGUge1xuICBKb2IsXG4gIEpvYlN0YXRlLFxuICBNaWxlc3RvbmUsXG4gIE1pbGVzdG9uZVN0YXRlLFxuICBFc2Nyb3dEaXNwdXRlLFxuICBEaXNwdXRlUmVzb2x1dGlvbixcbiAgQXJiaXRyYXRvcixcbiAgQ3JlYXRlSm9iRGF0YSxcbiAgQWRkTWlsZXN0b25lRGF0YSxcbiAgSm9iTGlzdE9wdGlvbnMsXG59IGZyb20gJy4vRXNjcm93UmVnaXN0cnknO1xuXG4vLyBUeXBlIGV4cG9ydHNcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuXG4vLyBVdGlsaXR5IGV4cG9ydHNcbmV4cG9ydCB7XG4gIGNhbGN1bGF0ZVRydXN0U2NvcmUsXG4gIGdldFRydXN0UmF0aW5nLFxuICBmb3JtYXRYcHIsXG4gIHBhcnNlWHByLFxuICBmb3JtYXRUaW1lc3RhbXAsXG4gIGlzVmFsaWRBY2NvdW50TmFtZSxcbiAgaXNWYWxpZFVybCxcbiAgZ2V0S3ljV2VpZ2h0LFxufSBmcm9tICcuL3V0aWxzJztcblxuLy8gRGVmYXVsdCBjb250cmFjdCBuYW1lc1xuZXhwb3J0IGNvbnN0IENPTlRSQUNUUyA9IHtcbiAgQUdFTlRfQ09SRTogJ2FnZW50Y29yZScsXG4gIEFHRU5UX0ZFRUQ6ICdhZ2VudGZlZWQnLFxuICBBR0VOVF9WQUxJRDogJ2FnZW50dmFsaWQnLFxuICBBR0VOVF9FU0NST1c6ICdhZ2VudGVzY3JvdycsXG59IGFzIGNvbnN0O1xuXG4vLyBOZXR3b3JrIGVuZHBvaW50c1xuZXhwb3J0IGNvbnN0IE5FVFdPUktTID0ge1xuICBNQUlOTkVUOiB7XG4gICAgcnBjOiAnaHR0cHM6Ly9wcm90b24uZW9zdXNhLmlvJyxcbiAgICBoeXBlcmlvbjogJ2h0dHBzOi8vcHJvdG9uLmVvc3VzYS5pbycsXG4gICAgY2hhaW5JZDogJzM4NGRhODg4MTEyMDI3ZjAzMjE4NTBhMTY5ZjczN2MzM2U1M2IzODhhYWQ0OGI1YWRhY2U0YmFiOTdmNDM3ZTAnLFxuICB9LFxuICBURVNUTkVUOiB7XG4gICAgcnBjOiAnaHR0cHM6Ly90bjEucHJvdG9ubnouY29tJyxcbiAgICBoeXBlcmlvbjogJ2h0dHBzOi8vcHJvdG9uLXRlc3RuZXQuZW9zdXNhLmlvJyxcbiAgICBjaGFpbklkOiAnNzFlZTgzYmNmNTIxNDJkNjEwMTlkOTVmOWNjNTQyN2JhNmEwZDdmZjhhY2NkOWUyMDg4YWUyYWJlYWYzZDNkZCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuIl19
@@ -0,0 +1,345 @@
1
+ export interface Agent {
2
+ account: string;
3
+ owner: string | null;
4
+ pending_owner: string | null;
5
+ name: string;
6
+ description: string;
7
+ endpoint: string;
8
+ protocol: string;
9
+ capabilities: string[];
10
+ total_jobs: number;
11
+ registered_at: number;
12
+ active: boolean;
13
+ claim_deposit: number;
14
+ deposit_payer: string | null;
15
+ }
16
+ export interface AgentRaw {
17
+ account: string;
18
+ owner: string;
19
+ pending_owner: string;
20
+ name: string;
21
+ description: string;
22
+ endpoint: string;
23
+ protocol: string;
24
+ capabilities: string;
25
+ total_jobs: string;
26
+ registered_at: string;
27
+ active: number;
28
+ claim_deposit: string;
29
+ deposit_payer: string;
30
+ }
31
+ export interface Plugin {
32
+ id: number;
33
+ name: string;
34
+ version: string;
35
+ contract: string;
36
+ action: string;
37
+ schema: object;
38
+ category: PluginCategory;
39
+ author: string;
40
+ verified: boolean;
41
+ }
42
+ export interface PluginRaw {
43
+ id: string;
44
+ name: string;
45
+ version: string;
46
+ contract: string;
47
+ action: string;
48
+ schema: string;
49
+ category: string;
50
+ author: string;
51
+ verified: number;
52
+ }
53
+ export interface AgentPlugin {
54
+ id: number;
55
+ agent: string;
56
+ plugin_id: number;
57
+ config: object;
58
+ enabled: boolean;
59
+ }
60
+ export interface AgentPluginRaw {
61
+ id: string;
62
+ agent: string;
63
+ plugin_id: string;
64
+ config: string;
65
+ enabled: number;
66
+ }
67
+ export interface Unstake {
68
+ id: number;
69
+ validator: string;
70
+ amount: number;
71
+ request_time: number;
72
+ available_at: number;
73
+ }
74
+ export interface AgentCoreConfig {
75
+ owner: string;
76
+ min_stake: number;
77
+ registration_fee: number;
78
+ claim_fee: number;
79
+ feed_contract: string;
80
+ valid_contract: string;
81
+ escrow_contract: string;
82
+ paused: boolean;
83
+ }
84
+ export interface FeedbackConfig {
85
+ owner: string;
86
+ core_contract: string;
87
+ min_score: number;
88
+ max_score: number;
89
+ dispute_window: number;
90
+ decay_period: number;
91
+ decay_floor: number;
92
+ paused: boolean;
93
+ feedback_fee: number;
94
+ }
95
+ export interface ValidationConfig {
96
+ owner: string;
97
+ core_contract: string;
98
+ min_stake: number;
99
+ challenge_stake: number;
100
+ unstake_delay: number;
101
+ challenge_window: number;
102
+ slash_percent: number;
103
+ dispute_period: number;
104
+ funded_challenge_timeout: number;
105
+ paused: boolean;
106
+ validation_fee: number;
107
+ }
108
+ export type PluginCategory = 'compute' | 'storage' | 'oracle' | 'payment' | 'messaging' | 'ai';
109
+ export interface Feedback {
110
+ id: number;
111
+ agent: string;
112
+ reviewer: string;
113
+ reviewer_kyc_level: number;
114
+ score: number;
115
+ tags: string[];
116
+ job_hash: string;
117
+ evidence_uri: string;
118
+ amount_paid: number;
119
+ timestamp: number;
120
+ disputed: boolean;
121
+ resolved: boolean;
122
+ }
123
+ export interface FeedbackRaw {
124
+ id: string;
125
+ agent: string;
126
+ reviewer: string;
127
+ reviewer_kyc_level: number;
128
+ score: number;
129
+ tags: string;
130
+ job_hash: string;
131
+ evidence_uri: string;
132
+ amount_paid: string;
133
+ timestamp: string;
134
+ disputed: number;
135
+ resolved: number;
136
+ }
137
+ export interface AgentScore {
138
+ agent: string;
139
+ total_score: number;
140
+ total_weight: number;
141
+ feedback_count: number;
142
+ avg_score: number;
143
+ last_updated: number;
144
+ }
145
+ export interface AgentScoreRaw {
146
+ agent: string;
147
+ total_score: string;
148
+ total_weight: string;
149
+ feedback_count: string;
150
+ avg_score: string;
151
+ last_updated: string;
152
+ }
153
+ export interface Dispute {
154
+ id: number;
155
+ feedback_id: number;
156
+ disputer: string;
157
+ reason: string;
158
+ evidence_uri: string;
159
+ status: DisputeStatus;
160
+ resolver: string;
161
+ resolution_notes: string;
162
+ created_at: number;
163
+ resolved_at: number;
164
+ }
165
+ export type DisputeStatus = 'pending' | 'upheld' | 'rejected' | 'cancelled';
166
+ export interface Validator {
167
+ account: string;
168
+ stake: number;
169
+ method: string;
170
+ specializations: string[];
171
+ total_validations: number;
172
+ incorrect_validations: number;
173
+ accuracy_score: number;
174
+ pending_challenges: number;
175
+ registered_at: number;
176
+ active: boolean;
177
+ }
178
+ export interface ValidatorRaw {
179
+ account: string;
180
+ stake: string;
181
+ method: string;
182
+ specializations: string;
183
+ total_validations: string;
184
+ incorrect_validations: string;
185
+ accuracy_score: string;
186
+ pending_challenges: string;
187
+ registered_at: string;
188
+ active: number;
189
+ }
190
+ export interface Validation {
191
+ id: number;
192
+ validator: string;
193
+ agent: string;
194
+ job_hash: string;
195
+ result: ValidationResult;
196
+ confidence: number;
197
+ evidence_uri: string;
198
+ challenged: boolean;
199
+ timestamp: number;
200
+ }
201
+ export interface ValidationRaw {
202
+ id: string;
203
+ validator: string;
204
+ agent: string;
205
+ job_hash: string;
206
+ result: number;
207
+ confidence: number;
208
+ evidence_uri: string;
209
+ challenged: number;
210
+ timestamp: string;
211
+ }
212
+ export type ValidationResult = 'fail' | 'pass' | 'partial';
213
+ export interface Challenge {
214
+ id: number;
215
+ validation_id: number;
216
+ challenger: string;
217
+ reason: string;
218
+ evidence_uri: string;
219
+ stake: number;
220
+ status: DisputeStatus;
221
+ resolver: string;
222
+ resolution_notes: string;
223
+ created_at: number;
224
+ resolved_at: number;
225
+ funding_deadline: number;
226
+ funded_at: number;
227
+ }
228
+ export interface TrustScore {
229
+ agent: string;
230
+ total: number;
231
+ breakdown: TrustScoreBreakdown;
232
+ rating: TrustRating;
233
+ }
234
+ export interface TrustScoreBreakdown {
235
+ kyc: number;
236
+ stake: number;
237
+ reputation: number;
238
+ longevity: number;
239
+ }
240
+ export type TrustRating = 'untrusted' | 'low' | 'medium' | 'high' | 'verified';
241
+ export interface PaginatedResult<T> {
242
+ items: T[];
243
+ hasMore: boolean;
244
+ nextCursor?: string;
245
+ total?: number;
246
+ }
247
+ export interface PaginationOptions {
248
+ limit?: number;
249
+ cursor?: string;
250
+ }
251
+ export interface ListOptions extends PaginationOptions {
252
+ active_only?: boolean;
253
+ }
254
+ export interface AgentListOptions extends ListOptions {
255
+ category?: PluginCategory;
256
+ min_trust_score?: number;
257
+ }
258
+ export interface FeedbackListOptions extends ListOptions {
259
+ agent?: string;
260
+ reviewer?: string;
261
+ min_score?: number;
262
+ max_score?: number;
263
+ }
264
+ export interface ValidatorListOptions extends ListOptions {
265
+ min_stake?: number;
266
+ min_accuracy?: number;
267
+ specialization?: string;
268
+ }
269
+ export interface TransactionResult {
270
+ transaction_id: string;
271
+ processed: {
272
+ block_num: number;
273
+ block_time: string;
274
+ };
275
+ }
276
+ export interface RegisterAgentData {
277
+ name: string;
278
+ description: string;
279
+ endpoint: string;
280
+ protocol: string;
281
+ capabilities: string[];
282
+ }
283
+ export interface UpdateAgentData {
284
+ name?: string;
285
+ description?: string;
286
+ endpoint?: string;
287
+ protocol?: string;
288
+ capabilities?: string[];
289
+ }
290
+ export interface SubmitFeedbackData {
291
+ agent: string;
292
+ score: number;
293
+ tags?: string[];
294
+ job_hash?: string;
295
+ evidence_uri?: string;
296
+ amount_paid?: number;
297
+ }
298
+ export interface SubmitValidationData {
299
+ agent: string;
300
+ job_hash: string;
301
+ result: ValidationResult;
302
+ confidence: number;
303
+ evidence_uri?: string;
304
+ }
305
+ export interface ProtonSession {
306
+ auth: {
307
+ actor: string;
308
+ permission: string;
309
+ };
310
+ link: {
311
+ transact: (args: TransactArgs) => Promise<TransactionResult>;
312
+ };
313
+ }
314
+ export interface TransactArgs {
315
+ actions: TransactAction[];
316
+ }
317
+ export interface TransactAction {
318
+ account: string;
319
+ name: string;
320
+ authorization: Array<{
321
+ actor: string;
322
+ permission: string;
323
+ }>;
324
+ data: Record<string, unknown>;
325
+ }
326
+ export interface JsonRpc {
327
+ get_table_rows<T>(params: GetTableRowsParams): Promise<GetTableRowsResult<T>>;
328
+ }
329
+ export interface GetTableRowsParams {
330
+ json: boolean;
331
+ code: string;
332
+ scope: string;
333
+ table: string;
334
+ lower_bound?: string;
335
+ upper_bound?: string;
336
+ limit?: number;
337
+ key_type?: string;
338
+ index_position?: number;
339
+ reverse?: boolean;
340
+ }
341
+ export interface GetTableRowsResult<T> {
342
+ rows: T[];
343
+ more: boolean;
344
+ next_key?: string;
345
+ }
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // ============== Agent Types ==============
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDRDQUE0QyIsInNvdXJjZXNDb250ZW50IjpbIi8vID09PT09PT09PT09PT09IEFnZW50IFR5cGVzID09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnQge1xuICBhY2NvdW50OiBzdHJpbmc7XG4gIG93bmVyOiBzdHJpbmcgfCBudWxsOyAgICAgICAgICAgLy8gS1lDJ2QgaHVtYW4gd2hvIHNwb25zb3JzIHRoaXMgYWdlbnQgKG51bGwgaWYgdW5vd25lZClcbiAgcGVuZGluZ19vd25lcjogc3RyaW5nIHwgbnVsbDsgICAvLyBBcHByb3ZlZCBjbGFpbWFudCBhd2FpdGluZyBjb21wbGV0aW9uICgyLXN0ZXAgY2xhaW0pXG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgZW5kcG9pbnQ6IHN0cmluZztcbiAgcHJvdG9jb2w6IHN0cmluZztcbiAgY2FwYWJpbGl0aWVzOiBzdHJpbmdbXTtcbiAgdG90YWxfam9iczogbnVtYmVyO1xuICByZWdpc3RlcmVkX2F0OiBudW1iZXI7XG4gIGFjdGl2ZTogYm9vbGVhbjtcbiAgY2xhaW1fZGVwb3NpdDogbnVtYmVyOyAgICAgICAgICAvLyBSZWZ1bmRhYmxlIGRlcG9zaXQgcGFpZCB3aGVuIGNsYWltaW5nXG4gIGRlcG9zaXRfcGF5ZXI6IHN0cmluZyB8IG51bGw7ICAgLy8gV2hvIHBhaWQgdGhlIGRlcG9zaXQgKG11c3QgbWF0Y2ggY2xhaW1hbnQpXG4gIC8vIE5vdGU6IEFnZW50cyBzdGFrZSB2aWEgc3lzdGVtIHN0YWtpbmcgKGVvc2lvOjp2b3RlcnMpLCBub3QgY29udHJhY3QtbWFuYWdlZCBzdGFraW5nXG4gIC8vIFVzZSBnZXRTeXN0ZW1TdGFrZSgpIGZyb20gYWdlbnRjb3JlOjpnZXRhZ2VudGluZm8gdG8gcXVlcnkgc3Rha2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZ2VudFJhdyB7XG4gIGFjY291bnQ6IHN0cmluZztcbiAgb3duZXI6IHN0cmluZztcbiAgcGVuZGluZ19vd25lcjogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGVuZHBvaW50OiBzdHJpbmc7XG4gIHByb3RvY29sOiBzdHJpbmc7XG4gIGNhcGFiaWxpdGllczogc3RyaW5nO1xuICB0b3RhbF9qb2JzOiBzdHJpbmc7XG4gIHJlZ2lzdGVyZWRfYXQ6IHN0cmluZztcbiAgYWN0aXZlOiBudW1iZXI7XG4gIGNsYWltX2RlcG9zaXQ6IHN0cmluZztcbiAgZGVwb3NpdF9wYXllcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBjb250cmFjdDogc3RyaW5nO1xuICBhY3Rpb246IHN0cmluZztcbiAgc2NoZW1hOiBvYmplY3Q7XG4gIGNhdGVnb3J5OiBQbHVnaW5DYXRlZ29yeTtcbiAgYXV0aG9yOiBzdHJpbmc7XG4gIHZlcmlmaWVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblJhdyB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBjb250cmFjdDogc3RyaW5nO1xuICBhY3Rpb246IHN0cmluZztcbiAgc2NoZW1hOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIGF1dGhvcjogc3RyaW5nO1xuICB2ZXJpZmllZDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50UGx1Z2luIHtcbiAgaWQ6IG51bWJlcjtcbiAgYWdlbnQ6IHN0cmluZztcbiAgcGx1Z2luX2lkOiBudW1iZXI7XG4gIGNvbmZpZzogb2JqZWN0O1xuICBlbmFibGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50UGx1Z2luUmF3IHtcbiAgaWQ6IHN0cmluZztcbiAgYWdlbnQ6IHN0cmluZztcbiAgcGx1Z2luX2lkOiBzdHJpbmc7XG4gIGNvbmZpZzogc3RyaW5nO1xuICBlbmFibGVkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVW5zdGFrZSB7XG4gIGlkOiBudW1iZXI7XG4gIHZhbGlkYXRvcjogc3RyaW5nOyAgLy8gSElHSCBGSVg6IENoYW5nZWQgZnJvbSAnYWdlbnQnIHRvIG1hdGNoIGFnZW50dmFsaWQ6OnVuc3Rha2VzIHRhYmxlXG4gIGFtb3VudDogbnVtYmVyO1xuICByZXF1ZXN0X3RpbWU6IG51bWJlcjtcbiAgYXZhaWxhYmxlX2F0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRDb3JlQ29uZmlnIHtcbiAgb3duZXI6IHN0cmluZztcbiAgbWluX3N0YWtlOiBudW1iZXI7XG4gIHJlZ2lzdHJhdGlvbl9mZWU6IG51bWJlcjtcbiAgY2xhaW1fZmVlOiBudW1iZXI7ICAgICAgICAgICAgICAvLyBGZWUgdG8gY2xhaW0gYW4gYWdlbnQgKHJlZnVuZGFibGUgb24gcmVsZWFzZSlcbiAgZmVlZF9jb250cmFjdDogc3RyaW5nO1xuICB2YWxpZF9jb250cmFjdDogc3RyaW5nO1xuICBlc2Nyb3dfY29udHJhY3Q6IHN0cmluZztcbiAgcGF1c2VkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZlZWRiYWNrQ29uZmlnIHtcbiAgb3duZXI6IHN0cmluZztcbiAgY29yZV9jb250cmFjdDogc3RyaW5nO1xuICBtaW5fc2NvcmU6IG51bWJlcjtcbiAgbWF4X3Njb3JlOiBudW1iZXI7XG4gIGRpc3B1dGVfd2luZG93OiBudW1iZXI7XG4gIGRlY2F5X3BlcmlvZDogbnVtYmVyO1xuICBkZWNheV9mbG9vcjogbnVtYmVyO1xuICBwYXVzZWQ6IGJvb2xlYW47XG4gIGZlZWRiYWNrX2ZlZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25Db25maWcge1xuICBvd25lcjogc3RyaW5nO1xuICBjb3JlX2NvbnRyYWN0OiBzdHJpbmc7XG4gIG1pbl9zdGFrZTogbnVtYmVyO1xuICBjaGFsbGVuZ2Vfc3Rha2U6IG51bWJlcjtcbiAgdW5zdGFrZV9kZWxheTogbnVtYmVyO1xuICBjaGFsbGVuZ2Vfd2luZG93OiBudW1iZXI7XG4gIHNsYXNoX3BlcmNlbnQ6IG51bWJlcjtcbiAgZGlzcHV0ZV9wZXJpb2Q6IG51bWJlcjtcbiAgZnVuZGVkX2NoYWxsZW5nZV90aW1lb3V0OiBudW1iZXI7XG4gIHBhdXNlZDogYm9vbGVhbjtcbiAgdmFsaWRhdGlvbl9mZWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgUGx1Z2luQ2F0ZWdvcnkgPSAnY29tcHV0ZScgfCAnc3RvcmFnZScgfCAnb3JhY2xlJyB8ICdwYXltZW50JyB8ICdtZXNzYWdpbmcnIHwgJ2FpJztcblxuLy8gPT09PT09PT09PT09PT0gRmVlZGJhY2sgVHlwZXMgPT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBGZWVkYmFjayB7XG4gIGlkOiBudW1iZXI7XG4gIGFnZW50OiBzdHJpbmc7XG4gIHJldmlld2VyOiBzdHJpbmc7XG4gIHJldmlld2VyX2t5Y19sZXZlbDogbnVtYmVyO1xuICBzY29yZTogbnVtYmVyO1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgam9iX2hhc2g6IHN0cmluZztcbiAgZXZpZGVuY2VfdXJpOiBzdHJpbmc7XG4gIGFtb3VudF9wYWlkOiBudW1iZXI7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBkaXNwdXRlZDogYm9vbGVhbjtcbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmVlZGJhY2tSYXcge1xuICBpZDogc3RyaW5nO1xuICBhZ2VudDogc3RyaW5nO1xuICByZXZpZXdlcjogc3RyaW5nO1xuICByZXZpZXdlcl9reWNfbGV2ZWw6IG51bWJlcjtcbiAgc2NvcmU6IG51bWJlcjtcbiAgdGFnczogc3RyaW5nO1xuICBqb2JfaGFzaDogc3RyaW5nO1xuICBldmlkZW5jZV91cmk6IHN0cmluZztcbiAgYW1vdW50X3BhaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIGRpc3B1dGVkOiBudW1iZXI7XG4gIHJlc29sdmVkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRTY29yZSB7XG4gIGFnZW50OiBzdHJpbmc7XG4gIHRvdGFsX3Njb3JlOiBudW1iZXI7XG4gIHRvdGFsX3dlaWdodDogbnVtYmVyO1xuICBmZWVkYmFja19jb3VudDogbnVtYmVyO1xuICBhdmdfc2NvcmU6IG51bWJlcjtcbiAgbGFzdF91cGRhdGVkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRTY29yZVJhdyB7XG4gIGFnZW50OiBzdHJpbmc7XG4gIHRvdGFsX3Njb3JlOiBzdHJpbmc7XG4gIHRvdGFsX3dlaWdodDogc3RyaW5nO1xuICBmZWVkYmFja19jb3VudDogc3RyaW5nO1xuICBhdmdfc2NvcmU6IHN0cmluZztcbiAgbGFzdF91cGRhdGVkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcHV0ZSB7XG4gIGlkOiBudW1iZXI7XG4gIGZlZWRiYWNrX2lkOiBudW1iZXI7XG4gIGRpc3B1dGVyOiBzdHJpbmc7XG4gIHJlYXNvbjogc3RyaW5nO1xuICBldmlkZW5jZV91cmk6IHN0cmluZztcbiAgc3RhdHVzOiBEaXNwdXRlU3RhdHVzO1xuICByZXNvbHZlcjogc3RyaW5nO1xuICByZXNvbHV0aW9uX25vdGVzOiBzdHJpbmc7XG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcbiAgcmVzb2x2ZWRfYXQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgRGlzcHV0ZVN0YXR1cyA9ICdwZW5kaW5nJyB8ICd1cGhlbGQnIHwgJ3JlamVjdGVkJyB8ICdjYW5jZWxsZWQnO1xuXG4vLyA9PT09PT09PT09PT09PSBWYWxpZGF0aW9uIFR5cGVzID09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgYWNjb3VudDogc3RyaW5nO1xuICBzdGFrZTogbnVtYmVyO1xuICBtZXRob2Q6IHN0cmluZztcbiAgc3BlY2lhbGl6YXRpb25zOiBzdHJpbmdbXTtcbiAgdG90YWxfdmFsaWRhdGlvbnM6IG51bWJlcjtcbiAgaW5jb3JyZWN0X3ZhbGlkYXRpb25zOiBudW1iZXI7XG4gIGFjY3VyYWN5X3Njb3JlOiBudW1iZXI7XG4gIHBlbmRpbmdfY2hhbGxlbmdlczogbnVtYmVyO1xuICByZWdpc3RlcmVkX2F0OiBudW1iZXI7XG4gIGFjdGl2ZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0b3JSYXcge1xuICBhY2NvdW50OiBzdHJpbmc7XG4gIHN0YWtlOiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBzcGVjaWFsaXphdGlvbnM6IHN0cmluZztcbiAgdG90YWxfdmFsaWRhdGlvbnM6IHN0cmluZztcbiAgaW5jb3JyZWN0X3ZhbGlkYXRpb25zOiBzdHJpbmc7XG4gIGFjY3VyYWN5X3Njb3JlOiBzdHJpbmc7XG4gIHBlbmRpbmdfY2hhbGxlbmdlczogc3RyaW5nO1xuICByZWdpc3RlcmVkX2F0OiBzdHJpbmc7XG4gIGFjdGl2ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb24ge1xuICBpZDogbnVtYmVyO1xuICB2YWxpZGF0b3I6IHN0cmluZztcbiAgYWdlbnQ6IHN0cmluZztcbiAgam9iX2hhc2g6IHN0cmluZztcbiAgcmVzdWx0OiBWYWxpZGF0aW9uUmVzdWx0O1xuICBjb25maWRlbmNlOiBudW1iZXI7XG4gIGV2aWRlbmNlX3VyaTogc3RyaW5nO1xuICBjaGFsbGVuZ2VkOiBib29sZWFuO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uUmF3IHtcbiAgaWQ6IHN0cmluZztcbiAgdmFsaWRhdG9yOiBzdHJpbmc7XG4gIGFnZW50OiBzdHJpbmc7XG4gIGpvYl9oYXNoOiBzdHJpbmc7XG4gIHJlc3VsdDogbnVtYmVyO1xuICBjb25maWRlbmNlOiBudW1iZXI7XG4gIGV2aWRlbmNlX3VyaTogc3RyaW5nO1xuICBjaGFsbGVuZ2VkOiBudW1iZXI7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uUmVzdWx0ID0gJ2ZhaWwnIHwgJ3Bhc3MnIHwgJ3BhcnRpYWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYWxsZW5nZSB7XG4gIGlkOiBudW1iZXI7XG4gIHZhbGlkYXRpb25faWQ6IG51bWJlcjtcbiAgY2hhbGxlbmdlcjogc3RyaW5nO1xuICByZWFzb246IHN0cmluZztcbiAgZXZpZGVuY2VfdXJpOiBzdHJpbmc7XG4gIHN0YWtlOiBudW1iZXI7XG4gIHN0YXR1czogRGlzcHV0ZVN0YXR1cztcbiAgcmVzb2x2ZXI6IHN0cmluZztcbiAgcmVzb2x1dGlvbl9ub3Rlczogc3RyaW5nO1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG4gIHJlc29sdmVkX2F0OiBudW1iZXI7XG4gIGZ1bmRpbmdfZGVhZGxpbmU6IG51bWJlcjtcbiAgZnVuZGVkX2F0OiBudW1iZXI7XG59XG5cbi8vID09PT09PT09PT09PT09IFRydXN0IFNjb3JlIFR5cGVzID09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJ1c3RTY29yZSB7XG4gIGFnZW50OiBzdHJpbmc7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGJyZWFrZG93bjogVHJ1c3RTY29yZUJyZWFrZG93bjtcbiAgcmF0aW5nOiBUcnVzdFJhdGluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcnVzdFNjb3JlQnJlYWtkb3duIHtcbiAga3ljOiBudW1iZXI7XG4gIHN0YWtlOiBudW1iZXI7XG4gIHJlcHV0YXRpb246IG51bWJlcjtcbiAgbG9uZ2V2aXR5OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFRydXN0UmF0aW5nID0gJ3VudHJ1c3RlZCcgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ3ZlcmlmaWVkJztcblxuLy8gPT09PT09PT09PT09PT0gUGFnaW5hdGlvbiBUeXBlcyA9PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlZFJlc3VsdDxUPiB7XG4gIGl0ZW1zOiBUW107XG4gIGhhc01vcmU6IGJvb2xlYW47XG4gIG5leHRDdXJzb3I/OiBzdHJpbmc7XG4gIHRvdGFsPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25PcHRpb25zIHtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIGN1cnNvcj86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT0gTGlzdCBPcHRpb25zID09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdE9wdGlvbnMgZXh0ZW5kcyBQYWdpbmF0aW9uT3B0aW9ucyB7XG4gIGFjdGl2ZV9vbmx5PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZ2VudExpc3RPcHRpb25zIGV4dGVuZHMgTGlzdE9wdGlvbnMge1xuICBjYXRlZ29yeT86IFBsdWdpbkNhdGVnb3J5O1xuICBtaW5fdHJ1c3Rfc2NvcmU/OiBudW1iZXI7XG4gIC8vIE5vdGU6IEFnZW50cyB1c2Ugc3lzdGVtIHN0YWtpbmcsIG5vdCBjb250cmFjdC1tYW5hZ2VkIHN0YWtpbmdcbiAgLy8gRmlsdGVyIGJ5IHN5c3RlbSBzdGFrZSB2aWEgc2VwYXJhdGUgcXVlcnkgdG8gZW9zaW86OnZvdGVycyB0YWJsZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZlZWRiYWNrTGlzdE9wdGlvbnMgZXh0ZW5kcyBMaXN0T3B0aW9ucyB7XG4gIGFnZW50Pzogc3RyaW5nO1xuICByZXZpZXdlcj86IHN0cmluZztcbiAgbWluX3Njb3JlPzogbnVtYmVyO1xuICBtYXhfc2NvcmU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yTGlzdE9wdGlvbnMgZXh0ZW5kcyBMaXN0T3B0aW9ucyB7XG4gIG1pbl9zdGFrZT86IG51bWJlcjtcbiAgbWluX2FjY3VyYWN5PzogbnVtYmVyO1xuICBzcGVjaWFsaXphdGlvbj86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT0gVHJhbnNhY3Rpb24gVHlwZXMgPT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblJlc3VsdCB7XG4gIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gIHByb2Nlc3NlZDoge1xuICAgIGJsb2NrX251bTogbnVtYmVyO1xuICAgIGJsb2NrX3RpbWU6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckFnZW50RGF0YSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgZW5kcG9pbnQ6IHN0cmluZztcbiAgcHJvdG9jb2w6IHN0cmluZztcbiAgY2FwYWJpbGl0aWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVBZ2VudERhdGEge1xuICBuYW1lPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIHByb3RvY29sPzogc3RyaW5nO1xuICBjYXBhYmlsaXRpZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJtaXRGZWVkYmFja0RhdGEge1xuICBhZ2VudDogc3RyaW5nO1xuICBzY29yZTogbnVtYmVyO1xuICB0YWdzPzogc3RyaW5nW107XG4gIGpvYl9oYXNoPzogc3RyaW5nO1xuICBldmlkZW5jZV91cmk/OiBzdHJpbmc7XG4gIGFtb3VudF9wYWlkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1Ym1pdFZhbGlkYXRpb25EYXRhIHtcbiAgYWdlbnQ6IHN0cmluZztcbiAgam9iX2hhc2g6IHN0cmluZztcbiAgcmVzdWx0OiBWYWxpZGF0aW9uUmVzdWx0O1xuICBjb25maWRlbmNlOiBudW1iZXI7XG4gIGV2aWRlbmNlX3VyaT86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT0gU2Vzc2lvbiBUeXBlcyA9PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3RvblNlc3Npb24ge1xuICBhdXRoOiB7XG4gICAgYWN0b3I6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uOiBzdHJpbmc7XG4gIH07XG4gIGxpbms6IHtcbiAgICB0cmFuc2FjdDogKGFyZ3M6IFRyYW5zYWN0QXJncykgPT4gUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD47XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3RBcmdzIHtcbiAgYWN0aW9uczogVHJhbnNhY3RBY3Rpb25bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdEFjdGlvbiB7XG4gIGFjY291bnQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBhdXRob3JpemF0aW9uOiBBcnJheTx7XG4gICAgYWN0b3I6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uOiBzdHJpbmc7XG4gIH0+O1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLy8gPT09PT09PT09PT09PT0gUlBDIFR5cGVzID09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvblJwYyB7XG4gIGdldF90YWJsZV9yb3dzPFQ+KHBhcmFtczogR2V0VGFibGVSb3dzUGFyYW1zKTogUHJvbWlzZTxHZXRUYWJsZVJvd3NSZXN1bHQ8VD4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFRhYmxlUm93c1BhcmFtcyB7XG4gIGpzb246IGJvb2xlYW47XG4gIGNvZGU6IHN0cmluZztcbiAgc2NvcGU6IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgbG93ZXJfYm91bmQ/OiBzdHJpbmc7XG4gIHVwcGVyX2JvdW5kPzogc3RyaW5nO1xuICBsaW1pdD86IG51bWJlcjtcbiAga2V5X3R5cGU/OiBzdHJpbmc7XG4gIGluZGV4X3Bvc2l0aW9uPzogbnVtYmVyO1xuICByZXZlcnNlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRUYWJsZVJvd3NSZXN1bHQ8VD4ge1xuICByb3dzOiBUW107XG4gIG1vcmU6IGJvb2xlYW47XG4gIG5leHRfa2V5Pzogc3RyaW5nO1xufVxuIl19
@@ -0,0 +1,79 @@
1
+ import { Agent, AgentScore, TrustScore, TrustRating, ValidationResult, DisputeStatus } from './types';
2
+ /**
3
+ * Calculate trust score for an agent
4
+ * Combines KYC level, stake, reputation, and longevity
5
+ * @param agent - Agent data
6
+ * @param agentScore - Aggregated score from feedback
7
+ * @param kycLevel - KYC verification level (0-4)
8
+ * @param stakeAmount - Staked XPR in smallest units (optional, fetched from system staking)
9
+ */
10
+ export declare function calculateTrustScore(agent: Agent, agentScore: AgentScore | null, kycLevel: number, stakeAmount?: number): TrustScore;
11
+ /**
12
+ * Get trust rating label from numeric score
13
+ */
14
+ export declare function getTrustRating(score: number): TrustRating;
15
+ /**
16
+ * Convert validation result number to string
17
+ */
18
+ export declare function validationResultFromNumber(result: number): ValidationResult;
19
+ /**
20
+ * Convert validation result string to number
21
+ */
22
+ export declare function validationResultToNumber(result: ValidationResult): number;
23
+ /**
24
+ * Convert dispute status number to string
25
+ */
26
+ export declare function disputeStatusFromNumber(status: number): DisputeStatus;
27
+ /**
28
+ * Parse JSON safely with fallback
29
+ */
30
+ export declare function safeJsonParse<T>(json: string, fallback: T): T;
31
+ /**
32
+ * Parse capabilities string to array
33
+ */
34
+ export declare function parseCapabilities(capabilities: string): string[];
35
+ /**
36
+ * Parse specializations string to array
37
+ */
38
+ export declare function parseSpecializations(specializations: string): string[];
39
+ /**
40
+ * Parse tags string to array (comma-separated)
41
+ */
42
+ export declare function parseTags(tags: string): string[];
43
+ /**
44
+ * Format XPR amount from smallest unit
45
+ */
46
+ export declare function formatXpr(amount: number): string;
47
+ /**
48
+ * Parse XPR amount string to smallest unit (integer math to avoid float precision issues)
49
+ * "100.5000 XPR" → 1005000, "0.7000 XPR" → 7000
50
+ */
51
+ export declare function parseXpr(amount: string): number;
52
+ /**
53
+ * Safe parseInt with fallback - returns fallback on NaN
54
+ */
55
+ export declare function safeParseInt(value: string | undefined | null, fallback?: number): number;
56
+ /**
57
+ * Format timestamp to ISO string
58
+ */
59
+ export declare function formatTimestamp(timestamp: number): string;
60
+ /**
61
+ * Calculate weighted average score
62
+ */
63
+ export declare function calculateWeightedAverage(scores: Array<{
64
+ score: number;
65
+ weight: number;
66
+ }>): number;
67
+ /**
68
+ * Validate XPR account name
69
+ * Must be 1-12 characters, a-z, 1-5, and .
70
+ */
71
+ export declare function isValidAccountName(name: string): boolean;
72
+ /**
73
+ * Validate URL format
74
+ */
75
+ export declare function isValidUrl(url: string): boolean;
76
+ /**
77
+ * Get KYC level weight for feedback scoring
78
+ */
79
+ export declare function getKycWeight(kycLevel: number): number;