@thinkhive/sdk 3.1.0 → 3.3.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,275 @@
1
+ /**
2
+ * ThinkHive SDK v3.0 - Human Review API
3
+ *
4
+ * API for managing human review queue, calibration sets, and reviewer management
5
+ */
6
+ export type HumanReviewStatus = 'pending' | 'in_progress' | 'completed' | 'skipped' | 'expired';
7
+ export type HumanReviewType = 'disagreement' | 'low_confidence' | 'calibration' | 'random_sample' | 'flagged';
8
+ export interface HumanReviewQueueItem {
9
+ id: string;
10
+ companyId: string;
11
+ agentId: string;
12
+ traceId: string;
13
+ criterionId?: string;
14
+ reviewType: HumanReviewType;
15
+ priority: number;
16
+ status: HumanReviewStatus;
17
+ llmScore?: number;
18
+ llmPassed?: boolean;
19
+ llmReasoning?: string;
20
+ llmConfidence?: number;
21
+ reviewerId?: string;
22
+ humanScore?: number;
23
+ humanPassed?: boolean;
24
+ humanReasoning?: string;
25
+ reviewDurationMs?: number;
26
+ isCalibrationSample?: boolean;
27
+ calibrationSetId?: string;
28
+ expectedScore?: number;
29
+ expectedPassed?: boolean;
30
+ expiresAt?: string;
31
+ claimedAt?: string;
32
+ completedAt?: string;
33
+ createdAt: string;
34
+ }
35
+ export interface AddToQueueOptions {
36
+ traceId: string;
37
+ criterionId?: string;
38
+ agentId: string;
39
+ reviewType: HumanReviewType;
40
+ priority?: number;
41
+ llmScore?: number;
42
+ llmPassed?: boolean;
43
+ llmReasoning?: string;
44
+ llmConfidence?: number;
45
+ isCalibrationSample?: boolean;
46
+ calibrationSetId?: string;
47
+ expectedScore?: number;
48
+ expectedPassed?: boolean;
49
+ expiresInMs?: number;
50
+ metadata?: Record<string, unknown>;
51
+ }
52
+ export interface SubmitReviewOptions {
53
+ passed: boolean;
54
+ score: number;
55
+ reasoning: string;
56
+ durationMs: number;
57
+ }
58
+ export interface CalibrationSet {
59
+ id: string;
60
+ companyId: string;
61
+ agentId?: string;
62
+ name: string;
63
+ description?: string;
64
+ targetSampleCount: number;
65
+ currentSampleCount: number;
66
+ minAgreementRate: number;
67
+ passingScoreThreshold: number;
68
+ criteriaIds: string[];
69
+ isActive: boolean;
70
+ createdBy?: string;
71
+ createdAt: string;
72
+ }
73
+ export interface CreateCalibrationSetOptions {
74
+ name: string;
75
+ description?: string;
76
+ agentId: string;
77
+ criterionId?: string;
78
+ targetAgreement?: number;
79
+ minSamples?: number;
80
+ }
81
+ export interface ReviewerCalibration {
82
+ id: string;
83
+ userId: string;
84
+ calibrationSetId: string;
85
+ totalReviews: number;
86
+ agreementRate: number;
87
+ meanAbsoluteError: number;
88
+ isCertified: boolean;
89
+ certifiedAt?: string;
90
+ lastReviewAt?: string;
91
+ }
92
+ export interface QueueStats {
93
+ pending: number;
94
+ inProgress: number;
95
+ completed: number;
96
+ skipped: number;
97
+ expired: number;
98
+ avgReviewDurationMs?: number;
99
+ avgAgreementRate?: number;
100
+ }
101
+ export interface ListQueueOptions {
102
+ agentId?: string;
103
+ status?: HumanReviewStatus;
104
+ reviewType?: HumanReviewType;
105
+ isCalibration?: boolean;
106
+ minPriority?: number;
107
+ limit?: number;
108
+ offset?: number;
109
+ }
110
+ /**
111
+ * Human Review API client for managing human review queue and calibration
112
+ */
113
+ export declare const humanReview: {
114
+ /**
115
+ * Get pending review queue items
116
+ *
117
+ * @example
118
+ * ```typescript
119
+ * const items = await humanReview.getQueue({
120
+ * agentId: 'agent_123',
121
+ * status: 'pending',
122
+ * limit: 20,
123
+ * });
124
+ * ```
125
+ */
126
+ getQueue(options?: ListQueueOptions): Promise<HumanReviewQueueItem[]>;
127
+ /**
128
+ * Add an item to the review queue
129
+ *
130
+ * @example
131
+ * ```typescript
132
+ * const item = await humanReview.addToQueue({
133
+ * traceId: 'trace_123',
134
+ * agentId: 'agent_123',
135
+ * reviewType: 'disagreement',
136
+ * priority: 80,
137
+ * llmScore: 65,
138
+ * llmPassed: true,
139
+ * });
140
+ * ```
141
+ */
142
+ addToQueue(options: AddToQueueOptions): Promise<HumanReviewQueueItem>;
143
+ /**
144
+ * Get a specific review item
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * const item = await humanReview.getItem('item_123');
149
+ * ```
150
+ */
151
+ getItem(itemId: string): Promise<HumanReviewQueueItem>;
152
+ /**
153
+ * Claim a review item for processing
154
+ *
155
+ * @example
156
+ * ```typescript
157
+ * const item = await humanReview.claim('item_123');
158
+ * ```
159
+ */
160
+ claim(itemId: string): Promise<HumanReviewQueueItem>;
161
+ /**
162
+ * Release a claimed review item
163
+ *
164
+ * @example
165
+ * ```typescript
166
+ * await humanReview.release('item_123');
167
+ * ```
168
+ */
169
+ release(itemId: string): Promise<HumanReviewQueueItem>;
170
+ /**
171
+ * Skip a review item
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * await humanReview.skip('item_123');
176
+ * ```
177
+ */
178
+ skip(itemId: string): Promise<HumanReviewQueueItem>;
179
+ /**
180
+ * Submit a review
181
+ *
182
+ * @example
183
+ * ```typescript
184
+ * const result = await humanReview.submit('item_123', {
185
+ * passed: true,
186
+ * score: 85,
187
+ * reasoning: 'Response accurately addressed the query',
188
+ * durationMs: 45000,
189
+ * });
190
+ * ```
191
+ */
192
+ submit(itemId: string, review: SubmitReviewOptions): Promise<HumanReviewQueueItem>;
193
+ /**
194
+ * Get queue statistics
195
+ *
196
+ * @example
197
+ * ```typescript
198
+ * const stats = await humanReview.getStats('agent_123');
199
+ * ```
200
+ */
201
+ getStats(agentId?: string): Promise<QueueStats>;
202
+ /**
203
+ * Get next item for a reviewer
204
+ *
205
+ * @example
206
+ * ```typescript
207
+ * const nextItem = await humanReview.getNextItem('agent_123');
208
+ * ```
209
+ */
210
+ getNextItem(agentId?: string): Promise<HumanReviewQueueItem | null>;
211
+ /**
212
+ * Get available review types
213
+ *
214
+ * @example
215
+ * ```typescript
216
+ * const types = await humanReview.getReviewTypes();
217
+ * ```
218
+ */
219
+ getReviewTypes(): Promise<Array<{
220
+ id: string;
221
+ name: string;
222
+ description: string;
223
+ autoTrigger: boolean;
224
+ }>>;
225
+ /**
226
+ * Get calibration sets
227
+ *
228
+ * @example
229
+ * ```typescript
230
+ * const sets = await humanReview.getCalibrationSets('agent_123');
231
+ * ```
232
+ */
233
+ getCalibrationSets(agentId?: string): Promise<CalibrationSet[]>;
234
+ /**
235
+ * Create a calibration set
236
+ *
237
+ * @example
238
+ * ```typescript
239
+ * const set = await humanReview.createCalibrationSet({
240
+ * name: 'Quality Calibration Q1',
241
+ * agentId: 'agent_123',
242
+ * targetAgreement: 0.85,
243
+ * minSamples: 50,
244
+ * });
245
+ * ```
246
+ */
247
+ createCalibrationSet(options: CreateCalibrationSetOptions): Promise<CalibrationSet>;
248
+ /**
249
+ * Get a calibration set by ID
250
+ *
251
+ * @example
252
+ * ```typescript
253
+ * const set = await humanReview.getCalibrationSet('set_123');
254
+ * ```
255
+ */
256
+ getCalibrationSet(setId: string): Promise<CalibrationSet>;
257
+ /**
258
+ * Get certified reviewers for a calibration set
259
+ *
260
+ * @example
261
+ * ```typescript
262
+ * const reviewers = await humanReview.getCertifiedReviewers('set_123');
263
+ * ```
264
+ */
265
+ getCertifiedReviewers(calibrationSetId: string): Promise<ReviewerCalibration[]>;
266
+ /**
267
+ * Get reviewer calibration status
268
+ *
269
+ * @example
270
+ * ```typescript
271
+ * const calibrations = await humanReview.getReviewerCalibrations('user_123');
272
+ * ```
273
+ */
274
+ getReviewerCalibrations(userId: string): Promise<ReviewerCalibration[]>;
275
+ };
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ /**
3
+ * ThinkHive SDK v3.0 - Human Review API
4
+ *
5
+ * API for managing human review queue, calibration sets, and reviewer management
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.humanReview = void 0;
9
+ const client_1 = require("../core/client");
10
+ // ============================================================================
11
+ // HUMAN REVIEW API CLIENT
12
+ // ============================================================================
13
+ /**
14
+ * Human Review API client for managing human review queue and calibration
15
+ */
16
+ exports.humanReview = {
17
+ /**
18
+ * Get pending review queue items
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const items = await humanReview.getQueue({
23
+ * agentId: 'agent_123',
24
+ * status: 'pending',
25
+ * limit: 20,
26
+ * });
27
+ * ```
28
+ */
29
+ async getQueue(options = {}) {
30
+ const params = new URLSearchParams();
31
+ if (options.agentId)
32
+ params.set('agentId', options.agentId);
33
+ if (options.status)
34
+ params.set('status', options.status);
35
+ if (options.reviewType)
36
+ params.set('reviewType', options.reviewType);
37
+ if (options.isCalibration !== undefined)
38
+ params.set('isCalibration', String(options.isCalibration));
39
+ if (options.minPriority !== undefined)
40
+ params.set('minPriority', String(options.minPriority));
41
+ if (options.limit)
42
+ params.set('limit', String(options.limit));
43
+ if (options.offset)
44
+ params.set('offset', String(options.offset));
45
+ return (0, client_1.apiRequestWithData)(`/human-review/queue?${params.toString()}`, { apiVersion: 'v1' });
46
+ },
47
+ /**
48
+ * Add an item to the review queue
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * const item = await humanReview.addToQueue({
53
+ * traceId: 'trace_123',
54
+ * agentId: 'agent_123',
55
+ * reviewType: 'disagreement',
56
+ * priority: 80,
57
+ * llmScore: 65,
58
+ * llmPassed: true,
59
+ * });
60
+ * ```
61
+ */
62
+ async addToQueue(options) {
63
+ return (0, client_1.apiRequestWithData)('/human-review/queue', {
64
+ method: 'POST',
65
+ body: options,
66
+ apiVersion: 'v1',
67
+ });
68
+ },
69
+ /**
70
+ * Get a specific review item
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const item = await humanReview.getItem('item_123');
75
+ * ```
76
+ */
77
+ async getItem(itemId) {
78
+ return (0, client_1.apiRequestWithData)(`/human-review/queue/${itemId}`, { apiVersion: 'v1' });
79
+ },
80
+ /**
81
+ * Claim a review item for processing
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * const item = await humanReview.claim('item_123');
86
+ * ```
87
+ */
88
+ async claim(itemId) {
89
+ return (0, client_1.apiRequestWithData)(`/human-review/queue/${itemId}/claim`, { method: 'POST', apiVersion: 'v1' });
90
+ },
91
+ /**
92
+ * Release a claimed review item
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * await humanReview.release('item_123');
97
+ * ```
98
+ */
99
+ async release(itemId) {
100
+ return (0, client_1.apiRequestWithData)(`/human-review/queue/${itemId}/release`, { method: 'POST', apiVersion: 'v1' });
101
+ },
102
+ /**
103
+ * Skip a review item
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * await humanReview.skip('item_123');
108
+ * ```
109
+ */
110
+ async skip(itemId) {
111
+ return (0, client_1.apiRequestWithData)(`/human-review/queue/${itemId}/skip`, { method: 'POST', apiVersion: 'v1' });
112
+ },
113
+ /**
114
+ * Submit a review
115
+ *
116
+ * @example
117
+ * ```typescript
118
+ * const result = await humanReview.submit('item_123', {
119
+ * passed: true,
120
+ * score: 85,
121
+ * reasoning: 'Response accurately addressed the query',
122
+ * durationMs: 45000,
123
+ * });
124
+ * ```
125
+ */
126
+ async submit(itemId, review) {
127
+ return (0, client_1.apiRequestWithData)(`/human-review/queue/${itemId}/submit`, { method: 'POST', body: review, apiVersion: 'v1' });
128
+ },
129
+ /**
130
+ * Get queue statistics
131
+ *
132
+ * @example
133
+ * ```typescript
134
+ * const stats = await humanReview.getStats('agent_123');
135
+ * ```
136
+ */
137
+ async getStats(agentId) {
138
+ const params = agentId ? `?agentId=${agentId}` : '';
139
+ return (0, client_1.apiRequestWithData)(`/human-review/stats${params}`, { apiVersion: 'v1' });
140
+ },
141
+ /**
142
+ * Get next item for a reviewer
143
+ *
144
+ * @example
145
+ * ```typescript
146
+ * const nextItem = await humanReview.getNextItem('agent_123');
147
+ * ```
148
+ */
149
+ async getNextItem(agentId) {
150
+ const params = agentId ? `?agentId=${agentId}` : '';
151
+ return (0, client_1.apiRequestWithData)(`/human-review/next-item${params}`, { apiVersion: 'v1' });
152
+ },
153
+ /**
154
+ * Get available review types
155
+ *
156
+ * @example
157
+ * ```typescript
158
+ * const types = await humanReview.getReviewTypes();
159
+ * ```
160
+ */
161
+ async getReviewTypes() {
162
+ return (0, client_1.apiRequestWithData)('/human-review/review-types', { apiVersion: 'v1' });
163
+ },
164
+ // ---------------------------------------------------------------------------
165
+ // CALIBRATION SETS
166
+ // ---------------------------------------------------------------------------
167
+ /**
168
+ * Get calibration sets
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * const sets = await humanReview.getCalibrationSets('agent_123');
173
+ * ```
174
+ */
175
+ async getCalibrationSets(agentId) {
176
+ const params = agentId ? `?agentId=${agentId}` : '';
177
+ return (0, client_1.apiRequestWithData)(`/human-review/calibration-sets${params}`, { apiVersion: 'v1' });
178
+ },
179
+ /**
180
+ * Create a calibration set
181
+ *
182
+ * @example
183
+ * ```typescript
184
+ * const set = await humanReview.createCalibrationSet({
185
+ * name: 'Quality Calibration Q1',
186
+ * agentId: 'agent_123',
187
+ * targetAgreement: 0.85,
188
+ * minSamples: 50,
189
+ * });
190
+ * ```
191
+ */
192
+ async createCalibrationSet(options) {
193
+ return (0, client_1.apiRequestWithData)('/human-review/calibration-sets', {
194
+ method: 'POST',
195
+ body: options,
196
+ apiVersion: 'v1',
197
+ });
198
+ },
199
+ /**
200
+ * Get a calibration set by ID
201
+ *
202
+ * @example
203
+ * ```typescript
204
+ * const set = await humanReview.getCalibrationSet('set_123');
205
+ * ```
206
+ */
207
+ async getCalibrationSet(setId) {
208
+ return (0, client_1.apiRequestWithData)(`/human-review/calibration-sets/${setId}`, { apiVersion: 'v1' });
209
+ },
210
+ // ---------------------------------------------------------------------------
211
+ // REVIEWER CALIBRATION
212
+ // ---------------------------------------------------------------------------
213
+ /**
214
+ * Get certified reviewers for a calibration set
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * const reviewers = await humanReview.getCertifiedReviewers('set_123');
219
+ * ```
220
+ */
221
+ async getCertifiedReviewers(calibrationSetId) {
222
+ return (0, client_1.apiRequestWithData)(`/human-review/reviewers?calibrationSetId=${calibrationSetId}`, { apiVersion: 'v1' });
223
+ },
224
+ /**
225
+ * Get reviewer calibration status
226
+ *
227
+ * @example
228
+ * ```typescript
229
+ * const calibrations = await humanReview.getReviewerCalibrations('user_123');
230
+ * ```
231
+ */
232
+ async getReviewerCalibrations(userId) {
233
+ return (0, client_1.apiRequestWithData)(`/human-review/calibration/${userId}`, { apiVersion: 'v1' });
234
+ },
235
+ };
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVtYW4tcmV2aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9odW1hbi1yZXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVILDJDQUFnRTtBQXVIaEUsK0VBQStFO0FBQy9FLDBCQUEwQjtBQUMxQiwrRUFBK0U7QUFFL0U7O0dBRUc7QUFDVSxRQUFBLFdBQVcsR0FBRztJQUN6Qjs7Ozs7Ozs7Ozs7T0FXRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBNEIsRUFBRTtRQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3JDLElBQUksT0FBTyxDQUFDLE9BQU87WUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUQsSUFBSSxPQUFPLENBQUMsTUFBTTtZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RCxJQUFJLE9BQU8sQ0FBQyxVQUFVO1lBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksT0FBTyxDQUFDLGFBQWEsS0FBSyxTQUFTO1lBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxTQUFTO1lBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzlGLElBQUksT0FBTyxDQUFDLEtBQUs7WUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxPQUFPLENBQUMsTUFBTTtZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUVqRSxPQUFPLElBQUEsMkJBQWtCLEVBQ3ZCLHVCQUF1QixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFDMUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQTBCO1FBQ3pDLE9BQU8sSUFBQSwyQkFBa0IsRUFBdUIscUJBQXFCLEVBQUU7WUFDckUsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsT0FBTztZQUNiLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFjO1FBQzFCLE9BQU8sSUFBQSwyQkFBa0IsRUFDdkIsdUJBQXVCLE1BQU0sRUFBRSxFQUMvQixFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FDckIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFjO1FBQ3hCLE9BQU8sSUFBQSwyQkFBa0IsRUFDdkIsdUJBQXVCLE1BQU0sUUFBUSxFQUNyQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQWM7UUFDMUIsT0FBTyxJQUFBLDJCQUFrQixFQUN2Qix1QkFBdUIsTUFBTSxVQUFVLEVBQ3ZDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBYztRQUN2QixPQUFPLElBQUEsMkJBQWtCLEVBQ3ZCLHVCQUF1QixNQUFNLE9BQU8sRUFDcEMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWMsRUFBRSxNQUEyQjtRQUN0RCxPQUFPLElBQUEsMkJBQWtCLEVBQ3ZCLHVCQUF1QixNQUFNLFNBQVMsRUFDdEMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQWdCO1FBQzdCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BELE9BQU8sSUFBQSwyQkFBa0IsRUFDdkIsc0JBQXNCLE1BQU0sRUFBRSxFQUM5QixFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FDckIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFnQjtRQUNoQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxPQUFPLElBQUEsMkJBQWtCLEVBQ3ZCLDBCQUEwQixNQUFNLEVBQUUsRUFDbEMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxjQUFjO1FBTWxCLE9BQU8sSUFBQSwyQkFBa0IsRUFBQyw0QkFBNEIsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsbUJBQW1CO0lBQ25CLDhFQUE4RTtJQUU5RTs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQWdCO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BELE9BQU8sSUFBQSwyQkFBa0IsRUFDdkIsaUNBQWlDLE1BQU0sRUFBRSxFQUN6QyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FDckIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBb0M7UUFDN0QsT0FBTyxJQUFBLDJCQUFrQixFQUFpQixnQ0FBZ0MsRUFBRTtZQUMxRSxNQUFNLEVBQUUsTUFBTTtZQUNkLElBQUksRUFBRSxPQUFPO1lBQ2IsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBYTtRQUNuQyxPQUFPLElBQUEsMkJBQWtCLEVBQ3ZCLGtDQUFrQyxLQUFLLEVBQUUsRUFDekMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLHVCQUF1QjtJQUN2Qiw4RUFBOEU7SUFFOUU7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBd0I7UUFDbEQsT0FBTyxJQUFBLDJCQUFrQixFQUN2Qiw0Q0FBNEMsZ0JBQWdCLEVBQUUsRUFDOUQsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxNQUFjO1FBQzFDLE9BQU8sSUFBQSwyQkFBa0IsRUFDdkIsNkJBQTZCLE1BQU0sRUFBRSxFQUNyQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FDckIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlua0hpdmUgU0RLIHYzLjAgLSBIdW1hbiBSZXZpZXcgQVBJXG4gKlxuICogQVBJIGZvciBtYW5hZ2luZyBodW1hbiByZXZpZXcgcXVldWUsIGNhbGlicmF0aW9uIHNldHMsIGFuZCByZXZpZXdlciBtYW5hZ2VtZW50XG4gKi9cblxuaW1wb3J0IHsgYXBpUmVxdWVzdCwgYXBpUmVxdWVzdFdpdGhEYXRhIH0gZnJvbSAnLi4vY29yZS9jbGllbnQnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBIdW1hblJldmlld1N0YXR1cyA9ICdwZW5kaW5nJyB8ICdpbl9wcm9ncmVzcycgfCAnY29tcGxldGVkJyB8ICdza2lwcGVkJyB8ICdleHBpcmVkJztcbmV4cG9ydCB0eXBlIEh1bWFuUmV2aWV3VHlwZSA9ICdkaXNhZ3JlZW1lbnQnIHwgJ2xvd19jb25maWRlbmNlJyB8ICdjYWxpYnJhdGlvbicgfCAncmFuZG9tX3NhbXBsZScgfCAnZmxhZ2dlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHVtYW5SZXZpZXdRdWV1ZUl0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBjb21wYW55SWQ6IHN0cmluZztcbiAgYWdlbnRJZDogc3RyaW5nO1xuICB0cmFjZUlkOiBzdHJpbmc7XG4gIGNyaXRlcmlvbklkPzogc3RyaW5nO1xuICByZXZpZXdUeXBlOiBIdW1hblJldmlld1R5cGU7XG4gIHByaW9yaXR5OiBudW1iZXI7XG4gIHN0YXR1czogSHVtYW5SZXZpZXdTdGF0dXM7XG4gIGxsbVNjb3JlPzogbnVtYmVyO1xuICBsbG1QYXNzZWQ/OiBib29sZWFuO1xuICBsbG1SZWFzb25pbmc/OiBzdHJpbmc7XG4gIGxsbUNvbmZpZGVuY2U/OiBudW1iZXI7XG4gIHJldmlld2VySWQ/OiBzdHJpbmc7XG4gIGh1bWFuU2NvcmU/OiBudW1iZXI7XG4gIGh1bWFuUGFzc2VkPzogYm9vbGVhbjtcbiAgaHVtYW5SZWFzb25pbmc/OiBzdHJpbmc7XG4gIHJldmlld0R1cmF0aW9uTXM/OiBudW1iZXI7XG4gIGlzQ2FsaWJyYXRpb25TYW1wbGU/OiBib29sZWFuO1xuICBjYWxpYnJhdGlvblNldElkPzogc3RyaW5nO1xuICBleHBlY3RlZFNjb3JlPzogbnVtYmVyO1xuICBleHBlY3RlZFBhc3NlZD86IGJvb2xlYW47XG4gIGV4cGlyZXNBdD86IHN0cmluZztcbiAgY2xhaW1lZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVG9RdWV1ZU9wdGlvbnMge1xuICB0cmFjZUlkOiBzdHJpbmc7XG4gIGNyaXRlcmlvbklkPzogc3RyaW5nO1xuICBhZ2VudElkOiBzdHJpbmc7XG4gIHJldmlld1R5cGU6IEh1bWFuUmV2aWV3VHlwZTtcbiAgcHJpb3JpdHk/OiBudW1iZXI7XG4gIGxsbVNjb3JlPzogbnVtYmVyO1xuICBsbG1QYXNzZWQ/OiBib29sZWFuO1xuICBsbG1SZWFzb25pbmc/OiBzdHJpbmc7XG4gIGxsbUNvbmZpZGVuY2U/OiBudW1iZXI7XG4gIGlzQ2FsaWJyYXRpb25TYW1wbGU/OiBib29sZWFuO1xuICBjYWxpYnJhdGlvblNldElkPzogc3RyaW5nO1xuICBleHBlY3RlZFNjb3JlPzogbnVtYmVyO1xuICBleHBlY3RlZFBhc3NlZD86IGJvb2xlYW47XG4gIGV4cGlyZXNJbk1zPzogbnVtYmVyO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1Ym1pdFJldmlld09wdGlvbnMge1xuICBwYXNzZWQ6IGJvb2xlYW47XG4gIHNjb3JlOiBudW1iZXI7XG4gIHJlYXNvbmluZzogc3RyaW5nO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsaWJyYXRpb25TZXQge1xuICBpZDogc3RyaW5nO1xuICBjb21wYW55SWQ6IHN0cmluZztcbiAgYWdlbnRJZD86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdGFyZ2V0U2FtcGxlQ291bnQ6IG51bWJlcjtcbiAgY3VycmVudFNhbXBsZUNvdW50OiBudW1iZXI7XG4gIG1pbkFncmVlbWVudFJhdGU6IG51bWJlcjtcbiAgcGFzc2luZ1Njb3JlVGhyZXNob2xkOiBudW1iZXI7XG4gIGNyaXRlcmlhSWRzOiBzdHJpbmdbXTtcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIGNyZWF0ZWRCeT86IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQ2FsaWJyYXRpb25TZXRPcHRpb25zIHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgYWdlbnRJZDogc3RyaW5nO1xuICBjcml0ZXJpb25JZD86IHN0cmluZztcbiAgdGFyZ2V0QWdyZWVtZW50PzogbnVtYmVyO1xuICBtaW5TYW1wbGVzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldmlld2VyQ2FsaWJyYXRpb24ge1xuICBpZDogc3RyaW5nO1xuICB1c2VySWQ6IHN0cmluZztcbiAgY2FsaWJyYXRpb25TZXRJZDogc3RyaW5nO1xuICB0b3RhbFJldmlld3M6IG51bWJlcjtcbiAgYWdyZWVtZW50UmF0ZTogbnVtYmVyO1xuICBtZWFuQWJzb2x1dGVFcnJvcjogbnVtYmVyO1xuICBpc0NlcnRpZmllZDogYm9vbGVhbjtcbiAgY2VydGlmaWVkQXQ/OiBzdHJpbmc7XG4gIGxhc3RSZXZpZXdBdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWV1ZVN0YXRzIHtcbiAgcGVuZGluZzogbnVtYmVyO1xuICBpblByb2dyZXNzOiBudW1iZXI7XG4gIGNvbXBsZXRlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG4gIGV4cGlyZWQ6IG51bWJlcjtcbiAgYXZnUmV2aWV3RHVyYXRpb25Ncz86IG51bWJlcjtcbiAgYXZnQWdyZWVtZW50UmF0ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0UXVldWVPcHRpb25zIHtcbiAgYWdlbnRJZD86IHN0cmluZztcbiAgc3RhdHVzPzogSHVtYW5SZXZpZXdTdGF0dXM7XG4gIHJldmlld1R5cGU/OiBIdW1hblJldmlld1R5cGU7XG4gIGlzQ2FsaWJyYXRpb24/OiBib29sZWFuO1xuICBtaW5Qcmlvcml0eT86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSFVNQU4gUkVWSUVXIEFQSSBDTElFTlRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBIdW1hbiBSZXZpZXcgQVBJIGNsaWVudCBmb3IgbWFuYWdpbmcgaHVtYW4gcmV2aWV3IHF1ZXVlIGFuZCBjYWxpYnJhdGlvblxuICovXG5leHBvcnQgY29uc3QgaHVtYW5SZXZpZXcgPSB7XG4gIC8qKlxuICAgKiBHZXQgcGVuZGluZyByZXZpZXcgcXVldWUgaXRlbXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBpdGVtcyA9IGF3YWl0IGh1bWFuUmV2aWV3LmdldFF1ZXVlKHtcbiAgICogICBhZ2VudElkOiAnYWdlbnRfMTIzJyxcbiAgICogICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICogICBsaW1pdDogMjAsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldFF1ZXVlKG9wdGlvbnM6IExpc3RRdWV1ZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8SHVtYW5SZXZpZXdRdWV1ZUl0ZW1bXT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBpZiAob3B0aW9ucy5hZ2VudElkKSBwYXJhbXMuc2V0KCdhZ2VudElkJywgb3B0aW9ucy5hZ2VudElkKTtcbiAgICBpZiAob3B0aW9ucy5zdGF0dXMpIHBhcmFtcy5zZXQoJ3N0YXR1cycsIG9wdGlvbnMuc3RhdHVzKTtcbiAgICBpZiAob3B0aW9ucy5yZXZpZXdUeXBlKSBwYXJhbXMuc2V0KCdyZXZpZXdUeXBlJywgb3B0aW9ucy5yZXZpZXdUeXBlKTtcbiAgICBpZiAob3B0aW9ucy5pc0NhbGlicmF0aW9uICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ2lzQ2FsaWJyYXRpb24nLCBTdHJpbmcob3B0aW9ucy5pc0NhbGlicmF0aW9uKSk7XG4gICAgaWYgKG9wdGlvbnMubWluUHJpb3JpdHkgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgnbWluUHJpb3JpdHknLCBTdHJpbmcob3B0aW9ucy5taW5Qcmlvcml0eSkpO1xuICAgIGlmIChvcHRpb25zLmxpbWl0KSBwYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhvcHRpb25zLmxpbWl0KSk7XG4gICAgaWYgKG9wdGlvbnMub2Zmc2V0KSBwYXJhbXMuc2V0KCdvZmZzZXQnLCBTdHJpbmcob3B0aW9ucy5vZmZzZXQpKTtcblxuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8SHVtYW5SZXZpZXdRdWV1ZUl0ZW1bXT4oXG4gICAgICBgL2h1bWFuLXJldmlldy9xdWV1ZT8ke3BhcmFtcy50b1N0cmluZygpfWAsXG4gICAgICB7IGFwaVZlcnNpb246ICd2MScgfVxuICAgICk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFkZCBhbiBpdGVtIHRvIHRoZSByZXZpZXcgcXVldWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBpdGVtID0gYXdhaXQgaHVtYW5SZXZpZXcuYWRkVG9RdWV1ZSh7XG4gICAqICAgdHJhY2VJZDogJ3RyYWNlXzEyMycsXG4gICAqICAgYWdlbnRJZDogJ2FnZW50XzEyMycsXG4gICAqICAgcmV2aWV3VHlwZTogJ2Rpc2FncmVlbWVudCcsXG4gICAqICAgcHJpb3JpdHk6IDgwLFxuICAgKiAgIGxsbVNjb3JlOiA2NSxcbiAgICogICBsbG1QYXNzZWQ6IHRydWUsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGFkZFRvUXVldWUob3B0aW9uczogQWRkVG9RdWV1ZU9wdGlvbnMpOiBQcm9taXNlPEh1bWFuUmV2aWV3UXVldWVJdGVtPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxIdW1hblJldmlld1F1ZXVlSXRlbT4oJy9odW1hbi1yZXZpZXcvcXVldWUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICBhcGlWZXJzaW9uOiAndjEnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgYSBzcGVjaWZpYyByZXZpZXcgaXRlbVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGl0ZW0gPSBhd2FpdCBodW1hblJldmlldy5nZXRJdGVtKCdpdGVtXzEyMycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldEl0ZW0oaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPEh1bWFuUmV2aWV3UXVldWVJdGVtPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxIdW1hblJldmlld1F1ZXVlSXRlbT4oXG4gICAgICBgL2h1bWFuLXJldmlldy9xdWV1ZS8ke2l0ZW1JZH1gLFxuICAgICAgeyBhcGlWZXJzaW9uOiAndjEnIH1cbiAgICApO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDbGFpbSBhIHJldmlldyBpdGVtIGZvciBwcm9jZXNzaW5nXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgaXRlbSA9IGF3YWl0IGh1bWFuUmV2aWV3LmNsYWltKCdpdGVtXzEyMycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNsYWltKGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxIdW1hblJldmlld1F1ZXVlSXRlbT4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8SHVtYW5SZXZpZXdRdWV1ZUl0ZW0+KFxuICAgICAgYC9odW1hbi1yZXZpZXcvcXVldWUvJHtpdGVtSWR9L2NsYWltYCxcbiAgICAgIHsgbWV0aG9kOiAnUE9TVCcsIGFwaVZlcnNpb246ICd2MScgfVxuICAgICk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgYSBjbGFpbWVkIHJldmlldyBpdGVtXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgaHVtYW5SZXZpZXcucmVsZWFzZSgnaXRlbV8xMjMnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZWxlYXNlKGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxIdW1hblJldmlld1F1ZXVlSXRlbT4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8SHVtYW5SZXZpZXdRdWV1ZUl0ZW0+KFxuICAgICAgYC9odW1hbi1yZXZpZXcvcXVldWUvJHtpdGVtSWR9L3JlbGVhc2VgLFxuICAgICAgeyBtZXRob2Q6ICdQT1NUJywgYXBpVmVyc2lvbjogJ3YxJyB9XG4gICAgKTtcbiAgfSxcblxuICAvKipcbiAgICogU2tpcCBhIHJldmlldyBpdGVtXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgaHVtYW5SZXZpZXcuc2tpcCgnaXRlbV8xMjMnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBza2lwKGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxIdW1hblJldmlld1F1ZXVlSXRlbT4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8SHVtYW5SZXZpZXdRdWV1ZUl0ZW0+KFxuICAgICAgYC9odW1hbi1yZXZpZXcvcXVldWUvJHtpdGVtSWR9L3NraXBgLFxuICAgICAgeyBtZXRob2Q6ICdQT1NUJywgYXBpVmVyc2lvbjogJ3YxJyB9XG4gICAgKTtcbiAgfSxcblxuICAvKipcbiAgICogU3VibWl0IGEgcmV2aWV3XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgaHVtYW5SZXZpZXcuc3VibWl0KCdpdGVtXzEyMycsIHtcbiAgICogICBwYXNzZWQ6IHRydWUsXG4gICAqICAgc2NvcmU6IDg1LFxuICAgKiAgIHJlYXNvbmluZzogJ1Jlc3BvbnNlIGFjY3VyYXRlbHkgYWRkcmVzc2VkIHRoZSBxdWVyeScsXG4gICAqICAgZHVyYXRpb25NczogNDUwMDAsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHN1Ym1pdChpdGVtSWQ6IHN0cmluZywgcmV2aWV3OiBTdWJtaXRSZXZpZXdPcHRpb25zKTogUHJvbWlzZTxIdW1hblJldmlld1F1ZXVlSXRlbT4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8SHVtYW5SZXZpZXdRdWV1ZUl0ZW0+KFxuICAgICAgYC9odW1hbi1yZXZpZXcvcXVldWUvJHtpdGVtSWR9L3N1Ym1pdGAsXG4gICAgICB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiByZXZpZXcsIGFwaVZlcnNpb246ICd2MScgfVxuICAgICk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBxdWV1ZSBzdGF0aXN0aWNzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdHMgPSBhd2FpdCBodW1hblJldmlldy5nZXRTdGF0cygnYWdlbnRfMTIzJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHMoYWdlbnRJZD86IHN0cmluZyk6IFByb21pc2U8UXVldWVTdGF0cz4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IGFnZW50SWQgPyBgP2FnZW50SWQ9JHthZ2VudElkfWAgOiAnJztcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPFF1ZXVlU3RhdHM+KFxuICAgICAgYC9odW1hbi1yZXZpZXcvc3RhdHMke3BhcmFtc31gLFxuICAgICAgeyBhcGlWZXJzaW9uOiAndjEnIH1cbiAgICApO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgbmV4dCBpdGVtIGZvciBhIHJldmlld2VyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgbmV4dEl0ZW0gPSBhd2FpdCBodW1hblJldmlldy5nZXROZXh0SXRlbSgnYWdlbnRfMTIzJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TmV4dEl0ZW0oYWdlbnRJZD86IHN0cmluZyk6IFByb21pc2U8SHVtYW5SZXZpZXdRdWV1ZUl0ZW0gfCBudWxsPiB7XG4gICAgY29uc3QgcGFyYW1zID0gYWdlbnRJZCA/IGA/YWdlbnRJZD0ke2FnZW50SWR9YCA6ICcnO1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8SHVtYW5SZXZpZXdRdWV1ZUl0ZW0gfCBudWxsPihcbiAgICAgIGAvaHVtYW4tcmV2aWV3L25leHQtaXRlbSR7cGFyYW1zfWAsXG4gICAgICB7IGFwaVZlcnNpb246ICd2MScgfVxuICAgICk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBhdmFpbGFibGUgcmV2aWV3IHR5cGVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdHlwZXMgPSBhd2FpdCBodW1hblJldmlldy5nZXRSZXZpZXdUeXBlcygpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldFJldmlld1R5cGVzKCk6IFByb21pc2U8QXJyYXk8e1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgYXV0b1RyaWdnZXI6IGJvb2xlYW47XG4gIH0+PiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YSgnL2h1bWFuLXJldmlldy9yZXZpZXctdHlwZXMnLCB7IGFwaVZlcnNpb246ICd2MScgfSk7XG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENBTElCUkFUSU9OIFNFVFNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEdldCBjYWxpYnJhdGlvbiBzZXRzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2V0cyA9IGF3YWl0IGh1bWFuUmV2aWV3LmdldENhbGlicmF0aW9uU2V0cygnYWdlbnRfMTIzJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0Q2FsaWJyYXRpb25TZXRzKGFnZW50SWQ/OiBzdHJpbmcpOiBQcm9taXNlPENhbGlicmF0aW9uU2V0W10+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBhZ2VudElkID8gYD9hZ2VudElkPSR7YWdlbnRJZH1gIDogJyc7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxDYWxpYnJhdGlvblNldFtdPihcbiAgICAgIGAvaHVtYW4tcmV2aWV3L2NhbGlicmF0aW9uLXNldHMke3BhcmFtc31gLFxuICAgICAgeyBhcGlWZXJzaW9uOiAndjEnIH1cbiAgICApO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjYWxpYnJhdGlvbiBzZXRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZXQgPSBhd2FpdCBodW1hblJldmlldy5jcmVhdGVDYWxpYnJhdGlvblNldCh7XG4gICAqICAgbmFtZTogJ1F1YWxpdHkgQ2FsaWJyYXRpb24gUTEnLFxuICAgKiAgIGFnZW50SWQ6ICdhZ2VudF8xMjMnLFxuICAgKiAgIHRhcmdldEFncmVlbWVudDogMC44NSxcbiAgICogICBtaW5TYW1wbGVzOiA1MCxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQ2FsaWJyYXRpb25TZXQob3B0aW9uczogQ3JlYXRlQ2FsaWJyYXRpb25TZXRPcHRpb25zKTogUHJvbWlzZTxDYWxpYnJhdGlvblNldD4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8Q2FsaWJyYXRpb25TZXQ+KCcvaHVtYW4tcmV2aWV3L2NhbGlicmF0aW9uLXNldHMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICBhcGlWZXJzaW9uOiAndjEnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgYSBjYWxpYnJhdGlvbiBzZXQgYnkgSURcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZXQgPSBhd2FpdCBodW1hblJldmlldy5nZXRDYWxpYnJhdGlvblNldCgnc2V0XzEyMycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldENhbGlicmF0aW9uU2V0KHNldElkOiBzdHJpbmcpOiBQcm9taXNlPENhbGlicmF0aW9uU2V0PiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxDYWxpYnJhdGlvblNldD4oXG4gICAgICBgL2h1bWFuLXJldmlldy9jYWxpYnJhdGlvbi1zZXRzLyR7c2V0SWR9YCxcbiAgICAgIHsgYXBpVmVyc2lvbjogJ3YxJyB9XG4gICAgKTtcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUkVWSUVXRVIgQ0FMSUJSQVRJT05cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEdldCBjZXJ0aWZpZWQgcmV2aWV3ZXJzIGZvciBhIGNhbGlicmF0aW9uIHNldFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJldmlld2VycyA9IGF3YWl0IGh1bWFuUmV2aWV3LmdldENlcnRpZmllZFJldmlld2Vycygnc2V0XzEyMycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldENlcnRpZmllZFJldmlld2VycyhjYWxpYnJhdGlvblNldElkOiBzdHJpbmcpOiBQcm9taXNlPFJldmlld2VyQ2FsaWJyYXRpb25bXT4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8UmV2aWV3ZXJDYWxpYnJhdGlvbltdPihcbiAgICAgIGAvaHVtYW4tcmV2aWV3L3Jldmlld2Vycz9jYWxpYnJhdGlvblNldElkPSR7Y2FsaWJyYXRpb25TZXRJZH1gLFxuICAgICAgeyBhcGlWZXJzaW9uOiAndjEnIH1cbiAgICApO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgcmV2aWV3ZXIgY2FsaWJyYXRpb24gc3RhdHVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2FsaWJyYXRpb25zID0gYXdhaXQgaHVtYW5SZXZpZXcuZ2V0UmV2aWV3ZXJDYWxpYnJhdGlvbnMoJ3VzZXJfMTIzJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0UmV2aWV3ZXJDYWxpYnJhdGlvbnModXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFJldmlld2VyQ2FsaWJyYXRpb25bXT4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8UmV2aWV3ZXJDYWxpYnJhdGlvbltdPihcbiAgICAgIGAvaHVtYW4tcmV2aWV3L2NhbGlicmF0aW9uLyR7dXNlcklkfWAsXG4gICAgICB7IGFwaVZlcnNpb246ICd2MScgfVxuICAgICk7XG4gIH0sXG59O1xuIl19