@nlabs/reaktor 1.13.0 → 1.15.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.
- package/docs/GENERATION.md +72 -1
- package/lib/actions/contentGeneration.d.ts +7 -7
- package/lib/actions/contentGeneration.js +19 -9
- package/lib/actions/contentGenerationErrors.d.ts +6 -0
- package/lib/actions/contentGenerationErrors.js +6 -0
- package/lib/actions/ollamaGeneration.d.ts +3 -0
- package/lib/actions/ollamaGeneration.js +128 -0
- package/package.json +1 -1
package/docs/GENERATION.md
CHANGED
|
@@ -6,7 +6,7 @@ Reaktor provides reusable server actions and authenticated GraphQL mutations. Ap
|
|
|
6
6
|
|
|
7
7
|
| Operation | Explicit providers | GraphQL mutation |
|
|
8
8
|
| --- | --- | --- |
|
|
9
|
-
| Text | `claude`, `gemini`, `openai` | `contents.generateContent` |
|
|
9
|
+
| Text | `claude`, `gemini`, `openai`; `ollama` through the server action only | `contents.generateContent` (excludes Ollama) |
|
|
10
10
|
| Images | `gemini`, `higgsfield`, `openai` | `images.generateImage` |
|
|
11
11
|
| Video | `gemini`, `higgsfield` | `videos.generateVideo` |
|
|
12
12
|
|
|
@@ -213,3 +213,74 @@ and reasoning effort remain OpenAI-only. This addition is generic provider trans
|
|
|
213
213
|
it contains no application prompts, reviewer choices, or writing policies.
|
|
214
214
|
|
|
215
215
|
Reference: [Gemini generation configuration](https://ai.google.dev/api/generate-content#v1beta.GenerationConfig).
|
|
216
|
+
|
|
217
|
+
### Ollama text transport (1.14.0)
|
|
218
|
+
|
|
219
|
+
The TypeScript action accepts `provider: 'ollama'` with an explicit model and a
|
|
220
|
+
server-owned `config.ollama` destination:
|
|
221
|
+
|
|
222
|
+
```ts
|
|
223
|
+
const result = await generateContent({
|
|
224
|
+
model: selectedModel,
|
|
225
|
+
prompt: userText,
|
|
226
|
+
provider: 'ollama',
|
|
227
|
+
system: systemText,
|
|
228
|
+
temperature: 0,
|
|
229
|
+
timeoutMs: 600000
|
|
230
|
+
}, {
|
|
231
|
+
ollama: {
|
|
232
|
+
endpoint: 'http://localhost:11434/api/generate',
|
|
233
|
+
protocol: 'generate'
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Protocols are `generate` (native `/api/generate` envelope), `chat` (native
|
|
239
|
+
`/api/chat` envelope), and `openai-chat` (OpenAI-compatible chat completions).
|
|
240
|
+
Supply the full endpoint URL, including any proxy prefix. Reaktor uses that URL
|
|
241
|
+
without appending or discovering paths. This supports `/v1/chat/completions`,
|
|
242
|
+
`/api/v1/chat/completions`, `/chat/completions`, and prefixed deployments without
|
|
243
|
+
rewriting them. URLs must use HTTP(S), without embedded credentials, query, or
|
|
244
|
+
fragment. No host/model defaults, model discovery, endpoint fallback, or model
|
|
245
|
+
switching are performed. Do not pass untrusted client input as server configuration.
|
|
246
|
+
|
|
247
|
+
Input is `prompt` plus optional `system`; message arrays, images, tools, search,
|
|
248
|
+
reasoning effort, and JSON schemas are outside this text-only operation. Optional
|
|
249
|
+
`maxTokens` maps to native `options.num_predict` or compatible `max_tokens`.
|
|
250
|
+
Nonnegative finite `temperature` preserves zero. Omitted token/temperature controls
|
|
251
|
+
remain omitted. Explicit `json_object` output maps to native `format: 'json'` or
|
|
252
|
+
compatible `response_format`; `text` uses the normal text output. Returned text is
|
|
253
|
+
not trimmed or reformatted.
|
|
254
|
+
|
|
255
|
+
The action submits once through Rip-Hunter. Native output requires `done: true`,
|
|
256
|
+
`done_reason: 'stop'`, and nonempty text; native chat also requires an assistant
|
|
257
|
+
message. Compatible output requires one completed assistant choice with
|
|
258
|
+
`finish_reason: 'stop'`. Refusal and tool/function-call output are rejected.
|
|
259
|
+
Older servers without a completion reason must use a compatible adapter that can
|
|
260
|
+
confirm completion; the action does not guess that incomplete envelopes succeeded.
|
|
261
|
+
|
|
262
|
+
Invalid destination/input fails before submission with
|
|
263
|
+
`ContentGenerationRejectedError`. Network/timeout failures and unusable responses
|
|
264
|
+
raise `ContentGenerationResponseError`. Rip-Hunter's JSON convenience API does not
|
|
265
|
+
expose HTTP status metadata, so provider error bodies (including model-not-found)
|
|
266
|
+
are conservatively unconfirmed, not proof that generation never began. The timeout
|
|
267
|
+
bounds the caller's wait; it does not confirm cancellation on the server. Callers
|
|
268
|
+
must not automatically resubmit, try another endpoint/model, or infer a safe retry
|
|
269
|
+
from an error string. Durable plans, discovery policy, request identities, and
|
|
270
|
+
saved-result reuse belong to the application.
|
|
271
|
+
|
|
272
|
+
Reference: [Ollama API](https://github.com/ollama/ollama/blob/main/docs/api.md).
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
### Ollama nucleus sampling (1.15.0)
|
|
276
|
+
|
|
277
|
+
The server action accepts optional `topP` for Ollama text generation. It must be a
|
|
278
|
+
finite number between 0 and 1 inclusive; explicit zero is preserved. Native generate
|
|
279
|
+
and chat map it to `options.top_p`; compatible chat maps it to top-level `top_p`.
|
|
280
|
+
Omission leaves the parameter absent, including an otherwise empty options object.
|
|
281
|
+
Reaktor supplies no sampling default. Existing temperature, token-limit, prompt,
|
|
282
|
+
completion-validation and single-submission behavior is unchanged.
|
|
283
|
+
|
|
284
|
+
Other providers and image generation reject this option before submission. This is
|
|
285
|
+
a server-action capability; it does not enable Ollama through GraphQL. Applications
|
|
286
|
+
retain ownership of sampling values and writing policy.
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
export { ContentGenerationRejectedError, ContentGenerationResponseError } from './contentGenerationErrors.js';
|
|
1
2
|
export interface ContentGenerationConfig {
|
|
2
3
|
claudeKey?: string;
|
|
3
4
|
claudeModel?: string;
|
|
4
5
|
geminiImageModel?: string;
|
|
5
6
|
geminiKey?: string;
|
|
6
7
|
geminiModel?: string;
|
|
8
|
+
ollama?: {
|
|
9
|
+
endpoint: string;
|
|
10
|
+
protocol: 'generate' | 'chat' | 'openai-chat';
|
|
11
|
+
};
|
|
7
12
|
openaiKey?: string;
|
|
8
13
|
openaiModel?: string;
|
|
9
14
|
}
|
|
@@ -40,13 +45,14 @@ export interface ContentGenerationInput {
|
|
|
40
45
|
modality?: 'image' | 'text';
|
|
41
46
|
model?: string;
|
|
42
47
|
prompt?: string;
|
|
43
|
-
provider: 'claude' | 'gemini' | 'openai';
|
|
48
|
+
provider: 'claude' | 'gemini' | 'ollama' | 'openai';
|
|
44
49
|
reasoningEffort?: ContentGenerationReasoningEffort;
|
|
45
50
|
responseFormat?: ContentGenerationResponseFormat;
|
|
46
51
|
search?: boolean;
|
|
47
52
|
system?: string;
|
|
48
53
|
temperature?: number;
|
|
49
54
|
timeoutMs?: number;
|
|
55
|
+
topP?: number;
|
|
50
56
|
}
|
|
51
57
|
export interface GeneratedContent {
|
|
52
58
|
image?: {
|
|
@@ -60,11 +66,5 @@ export interface GeneratedContent {
|
|
|
60
66
|
}[];
|
|
61
67
|
text: string;
|
|
62
68
|
}
|
|
63
|
-
/** A confirmed rejection is distinct from an unknown paid submission outcome. */
|
|
64
|
-
export declare class ContentGenerationRejectedError extends Error {
|
|
65
|
-
}
|
|
66
|
-
/** An accepted generation did not produce usable output; do not automatically resubmit it. */
|
|
67
|
-
export declare class ContentGenerationResponseError extends Error {
|
|
68
|
-
}
|
|
69
69
|
/** Single submission through Rip-Hunter; callers own durable jobs and reconciliation. */
|
|
70
70
|
export declare const generateContent: (input: ContentGenerationInput, config?: ContentGenerationConfig) => Promise<GeneratedContent>;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
+
import { generateOllamaContent } from './ollamaGeneration.js';
|
|
2
|
+
import { ContentGenerationRejectedError, ContentGenerationResponseError } from './contentGenerationErrors.js';
|
|
3
|
+
export { ContentGenerationRejectedError, ContentGenerationResponseError } from './contentGenerationErrors.js';
|
|
1
4
|
import { post } from '@nlabs/rip-hunter';
|
|
2
5
|
import { Config } from '../config.js';
|
|
3
|
-
/** A confirmed rejection is distinct from an unknown paid submission outcome. */ export class ContentGenerationRejectedError extends Error {
|
|
4
|
-
}
|
|
5
|
-
/** An accepted generation did not produce usable output; do not automatically resubmit it. */ export class ContentGenerationResponseError extends Error {
|
|
6
|
-
}
|
|
7
6
|
const validMessageContent = (message)=>{
|
|
8
7
|
if (typeof message.content === 'string') return !!message.content.trim();
|
|
9
8
|
return Array.isArray(message.content) && message.content.length > 0 && message.content.every((part)=>{
|
|
@@ -20,6 +19,7 @@ const validMessageContent = (message)=>{
|
|
|
20
19
|
if (![
|
|
21
20
|
'claude',
|
|
22
21
|
'gemini',
|
|
22
|
+
'ollama',
|
|
23
23
|
'openai'
|
|
24
24
|
].includes(input.provider)) {
|
|
25
25
|
throw new ContentGenerationRejectedError('A supported provider is required.');
|
|
@@ -61,11 +61,20 @@ const validMessageContent = (message)=>{
|
|
|
61
61
|
].includes(format.type) || format.type === 'json_schema' && (typeof format.name !== 'string' || !/^[a-zA-Z0-9_-]{1,64}$/.test(format.name) || !format.schema || typeof format.schema !== 'object' || Array.isArray(format.schema) || format.strict !== undefined && typeof format.strict !== 'boolean'))) {
|
|
62
62
|
throw new ContentGenerationRejectedError('Invalid response format. JSON schemas require a name and schema object.');
|
|
63
63
|
}
|
|
64
|
-
if (
|
|
65
|
-
|
|
64
|
+
if ([
|
|
65
|
+
'gemini',
|
|
66
|
+
'ollama'
|
|
67
|
+
].includes(input.provider) && format !== undefined && (format.type === 'json_schema' || input.modality === 'image')) {
|
|
68
|
+
throw new ContentGenerationRejectedError('This provider supports text or json_object for text generation only.');
|
|
69
|
+
}
|
|
70
|
+
if (input.topP !== undefined && (input.provider !== 'ollama' || input.modality === 'image' || !Number.isFinite(input.topP) || input.topP < 0 || input.topP > 1)) {
|
|
71
|
+
throw new ContentGenerationRejectedError('topP requires an Ollama text request and a finite value between 0 and 1.');
|
|
66
72
|
}
|
|
67
|
-
if (input.temperature !== undefined && (
|
|
68
|
-
|
|
73
|
+
if (input.temperature !== undefined && (![
|
|
74
|
+
'gemini',
|
|
75
|
+
'ollama'
|
|
76
|
+
].includes(input.provider) || input.modality === 'image' || !Number.isFinite(input.temperature) || input.temperature < 0 || input.provider === 'gemini' && input.temperature > 2)) {
|
|
77
|
+
throw new ContentGenerationRejectedError('temperature requires a nonnegative finite value for Ollama text or a value between 0 and 2 for Gemini text.');
|
|
69
78
|
}
|
|
70
79
|
if (input.maxTokens !== undefined && (!Number.isInteger(input.maxTokens) || input.maxTokens < 1)) {
|
|
71
80
|
throw new ContentGenerationRejectedError('maxTokens must be a positive integer.');
|
|
@@ -73,6 +82,7 @@ const validMessageContent = (message)=>{
|
|
|
73
82
|
if (input.provider !== 'gemini' && (input.images?.length || input.modality === 'image' || input.search)) {
|
|
74
83
|
throw new ContentGenerationRejectedError('This provider operation supports text input and output only.');
|
|
75
84
|
}
|
|
85
|
+
if (input.provider === 'ollama') return generateOllamaContent(input, config);
|
|
76
86
|
const { prompt, images = [] } = input;
|
|
77
87
|
if (input.provider === 'claude') {
|
|
78
88
|
if (!config.claudeKey) {
|
|
@@ -302,4 +312,4 @@ const validMessageContent = (message)=>{
|
|
|
302
312
|
};
|
|
303
313
|
};
|
|
304
314
|
|
|
305
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3Bvc3R9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25Db25maWcge1xuICBjbGF1ZGVLZXk/OiBzdHJpbmc7XG4gIGNsYXVkZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlJbWFnZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlLZXk/OiBzdHJpbmc7XG4gIGdlbWluaU1vZGVsPzogc3RyaW5nO1xuICBvcGVuYWlLZXk/OiBzdHJpbmc7XG4gIG9wZW5haU1vZGVsPzogc3RyaW5nO1xufVxuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25QYXJ0ID0ge3RleHQ6IHN0cmluZzsgdHlwZTogJ3RleHQnfSB8IHtcbiAgZGV0YWlsPzogJ2F1dG8nIHwgJ2hpZ2gnIHwgJ2xvdyc7XG4gIHR5cGU6ICdpbWFnZSc7XG4gIHVybDogc3RyaW5nO1xufTtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25NZXNzYWdlIHtcbiAgY29udGVudDogc3RyaW5nIHwgQ29udGVudEdlbmVyYXRpb25QYXJ0W107XG4gIHJvbGU6ICdhc3Npc3RhbnQnIHwgJ2RldmVsb3BlcicgfCAnc3lzdGVtJyB8ICd1c2VyJztcbn1cbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQgPSB7dHlwZTogJ2pzb25fb2JqZWN0JyB8ICd0ZXh0J30gfCB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmljdD86IGJvb2xlYW47XG4gIHR5cGU6ICdqc29uX3NjaGVtYSc7XG59O1xuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25SZWFzb25pbmdFZmZvcnQgPSAnbm9uZScgfCAnbWluaW1hbCcgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ3hoaWdoJyB8ICdtYXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0aW9uSW5wdXQge1xuICBhc3BlY3RSYXRpbz86IHN0cmluZztcbiAgaW1hZ2VzPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6IHN0cmluZ31bXTtcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICBtZXNzYWdlcz86IENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZVtdO1xuICBtb2RhbGl0eT86ICdpbWFnZScgfCAndGV4dCc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBwcm9tcHQ/OiBzdHJpbmc7XG4gIHByb3ZpZGVyOiAnY2xhdWRlJyB8ICdnZW1pbmknIHwgJ29wZW5haSc7XG4gIHJlYXNvbmluZ0VmZm9ydD86IENvbnRlbnRHZW5lcmF0aW9uUmVhc29uaW5nRWZmb3J0O1xuICByZXNwb25zZUZvcm1hdD86IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQ7XG4gIHNlYXJjaD86IGJvb2xlYW47XG4gIHN5c3RlbT86IHN0cmluZztcbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVkQ29udGVudCB7XG4gIGltYWdlPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6ICdpbWFnZS9qcGVnJyB8ICdpbWFnZS9wbmcnfTtcbiAgc2VhcmNoU3VnZ2VzdGlvbnNIdG1sPzogc3RyaW5nO1xuICBzb3VyY2VzOiB7dGl0bGU6IHN0cmluZzsgdXJsOiBzdHJpbmd9W107XG4gIHRleHQ6IHN0cmluZztcbn1cbi8qKiBBIGNvbmZpcm1lZCByZWplY3Rpb24gaXMgZGlzdGluY3QgZnJvbSBhbiB1bmtub3duIHBhaWQgc3VibWlzc2lvbiBvdXRjb21lLiAqL1xuZXhwb3J0IGNsYXNzIENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvciBleHRlbmRzIEVycm9yIHt9XG4vKiogQW4gYWNjZXB0ZWQgZ2VuZXJhdGlvbiBkaWQgbm90IHByb2R1Y2UgdXNhYmxlIG91dHB1dDsgZG8gbm90IGF1dG9tYXRpY2FsbHkgcmVzdWJtaXQgaXQuICovXG5leHBvcnQgY2xhc3MgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuaW50ZXJmYWNlIEdlbWluaVBhcnQge2lubGluZURhdGE/OiB7ZGF0YTogc3RyaW5nOyBtaW1lVHlwZTogc3RyaW5nfTsgdGV4dD86IHN0cmluZzsgdGhvdWdodD86IGJvb2xlYW59XG5pbnRlcmZhY2UgR2VtaW5pUmVzcG9uc2Uge1xuICBjYW5kaWRhdGVzPzoge1xuICAgIGNvbnRlbnQ/OiB7cGFydHM/OiBHZW1pbmlQYXJ0W119O1xuICAgIGZpbmlzaFJlYXNvbj86IHN0cmluZztcbiAgICBncm91bmRpbmdNZXRhZGF0YT86IHtcbiAgICAgIGdyb3VuZGluZ0NodW5rcz86IHt3ZWI/OiB7dGl0bGU/OiBzdHJpbmc7IHVyaT86IHN0cmluZ319W107XG4gICAgICBzZWFyY2hFbnRyeVBvaW50Pzoge3JlbmRlcmVkQ29udGVudD86IHN0cmluZ307XG4gICAgfTtcbiAgfVtdO1xuICBlcnJvcj86IHtjb2RlPzogbnVtYmVyfTtcbiAgcHJvbXB0RmVlZGJhY2s/OiB7YmxvY2tSZWFzb24/OiBzdHJpbmd9O1xufVxuXG5jb25zdCB2YWxpZE1lc3NhZ2VDb250ZW50ID0gKG1lc3NhZ2U6IENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZSk6IGJvb2xlYW4gPT4ge1xuICBpZih0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSAnc3RyaW5nJykgcmV0dXJuICEhbWVzc2FnZS5jb250ZW50LnRyaW0oKTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSAmJiBtZXNzYWdlLmNvbnRlbnQubGVuZ3RoID4gMCAmJiBtZXNzYWdlLmNvbnRlbnQuZXZlcnkoKHBhcnQpID0+IHtcbiAgICBpZighcGFydCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmKHBhcnQudHlwZSA9PT0gJ3RleHQnKSByZXR1cm4gdHlwZW9mIHBhcnQudGV4dCA9PT0gJ3N0cmluZycgJiYgISFwYXJ0LnRleHQudHJpbSgpO1xuICAgIHJldHVybiBwYXJ0LnR5cGUgPT09ICdpbWFnZScgJiYgbWVzc2FnZS5yb2xlID09PSAndXNlcicgJiYgdHlwZW9mIHBhcnQudXJsID09PSAnc3RyaW5nJ1xuICAgICAgJiYgL14oaHR0cHM/OlxcL1xcL1teXFxzXSt8ZGF0YTppbWFnZVxcLyhwbmd8anBlZ3x3ZWJwfGdpZik7YmFzZTY0LFtBLVphLXowLTkrL10rPXswLDJ9KSQvLnRlc3QocGFydC51cmwpXG4gICAgICAmJiAocGFydC5kZXRhaWwgPT09IHVuZGVmaW5lZCB8fCBbJ2F1dG8nLCAnaGlnaCcsICdsb3cnXS5pbmNsdWRlcyhwYXJ0LmRldGFpbCkpO1xuICB9KTtcbn07XG5cbi8qKiBTaW5nbGUgc3VibWlzc2lvbiB0aHJvdWdoIFJpcC1IdW50ZXI7IGNhbGxlcnMgb3duIGR1cmFibGUgam9icyBhbmQgcmVjb25jaWxpYXRpb24uICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVDb250ZW50ID0gYXN5bmMgKFxuICBpbnB1dDogQ29udGVudEdlbmVyYXRpb25JbnB1dCxcbiAgY29uZmlnOiBDb250ZW50R2VuZXJhdGlvbkNvbmZpZyA9IENvbmZpZy5nZXQ8Q29udGVudEdlbmVyYXRpb25Db25maWc+KCdjb250ZW50R2VuZXJhdGlvbicpIHx8IHt9XG4pOiBQcm9taXNlPEdlbmVyYXRlZENvbnRlbnQ+ID0+IHtcbiAgaWYoIVsnY2xhdWRlJywgJ2dlbWluaScsICdvcGVuYWknXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdBIHN1cHBvcnRlZCBwcm92aWRlciBpcyByZXF1aXJlZC4nKTtcbiAgfVxuICBpZihpbnB1dC5tZXNzYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYoaW5wdXQucHJvbXB0ICE9PSB1bmRlZmluZWQgfHwgIUFycmF5LmlzQXJyYXkoaW5wdXQubWVzc2FnZXMpIHx8ICFpbnB1dC5tZXNzYWdlcy5sZW5ndGggfHwgaW5wdXQubWVzc2FnZXMuc29tZSgobWVzc2FnZSkgPT5cbiAgICAgICFtZXNzYWdlIHx8ICFbJ2Fzc2lzdGFudCcsICdkZXZlbG9wZXInLCAnc3lzdGVtJywgJ3VzZXInXS5pbmNsdWRlcyhtZXNzYWdlLnJvbGUpIHx8ICF2YWxpZE1lc3NhZ2VDb250ZW50KG1lc3NhZ2UpKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignU3VwcGx5IGVpdGhlciBhIG5vbi1lbXB0eSBwcm9tcHQgb3Igbm9uLWVtcHR5IHRleHQgbWVzc2FnZXMgd2l0aCBzdXBwb3J0ZWQgcm9sZXMuJyk7XG4gICAgfVxuICB9IGVsc2UgaWYodHlwZW9mIGlucHV0LnByb21wdCAhPT0gJ3N0cmluZycgfHwgIWlucHV0LnByb21wdC50cmltKCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdBIG5vbi1lbXB0eSBwcm9tcHQgaXMgcmVxdWlyZWQuJyk7XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgIT09ICdvcGVuYWknICYmIChpbnB1dC5tZXNzYWdlcyAhPT0gdW5kZWZpbmVkIHx8IGlucHV0LnJlYXNvbmluZ0VmZm9ydCAhPT0gdW5kZWZpbmVkIHx8IChpbnB1dC5wcm92aWRlciA9PT0gJ2NsYXVkZScgJiYgaW5wdXQucmVzcG9uc2VGb3JtYXQgIT09IHVuZGVmaW5lZCkpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignTWVzc2FnZXMgYW5kIHJlYXNvbmluZyBlZmZvcnQgcmVxdWlyZSBPcGVuQUk7IENsYXVkZSBkb2VzIG5vdCBzdXBwb3J0IHJlc3BvbnNlIGZvcm1hdCBvcHRpb25zLicpO1xuICB9XG4gIGlmKGlucHV0LnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzSW50ZWdlcihpbnB1dC50aW1lb3V0TXMpIHx8IGlucHV0LnRpbWVvdXRNcyA8IDEgfHwgaW5wdXQudGltZW91dE1zID4gMl8xNDdfNDgzXzY0NykpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCd0aW1lb3V0TXMgbXVzdCBiZSBhIHBvc2l0aXZlIDMyLWJpdCBpbnRlZ2VyLicpO1xuICB9XG4gIGlmKGlucHV0LnJlYXNvbmluZ0VmZm9ydCAhPT0gdW5kZWZpbmVkICYmICFbJ25vbmUnLCAnbWluaW1hbCcsICdsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnLCAneGhpZ2gnLCAnbWF4J10uaW5jbHVkZXMoaW5wdXQucmVhc29uaW5nRWZmb3J0KSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ1Vuc3VwcG9ydGVkIHJlYXNvbmluZyBlZmZvcnQuJyk7XG4gIH1cbiAgY29uc3QgZm9ybWF0ID0gaW5wdXQucmVzcG9uc2VGb3JtYXQ7XG4gIGlmKGZvcm1hdCAhPT0gdW5kZWZpbmVkICYmICghZm9ybWF0IHx8ICFbJ3RleHQnLCAnanNvbl9vYmplY3QnLCAnanNvbl9zY2hlbWEnXS5pbmNsdWRlcyhmb3JtYXQudHlwZSkgfHwgKGZvcm1hdC50eXBlID09PSAnanNvbl9zY2hlbWEnICYmIChcbiAgICB0eXBlb2YgZm9ybWF0Lm5hbWUgIT09ICdzdHJpbmcnIHx8ICEvXlthLXpBLVowLTlfLV17MSw2NH0kLy50ZXN0KGZvcm1hdC5uYW1lKSB8fCAhZm9ybWF0LnNjaGVtYSB8fCB0eXBlb2YgZm9ybWF0LnNjaGVtYSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShmb3JtYXQuc2NoZW1hKVxuICAgIHx8IChmb3JtYXQuc3RyaWN0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGZvcm1hdC5zdHJpY3QgIT09ICdib29sZWFuJylcbiAgKSkpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignSW52YWxpZCByZXNwb25zZSBmb3JtYXQuIEpTT04gc2NoZW1hcyByZXF1aXJlIGEgbmFtZSBhbmQgc2NoZW1hIG9iamVjdC4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciA9PT0gJ2dlbWluaScgJiYgZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgKGZvcm1hdC50eXBlID09PSAnanNvbl9zY2hlbWEnIHx8IGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0dlbWluaSByZXNwb25zZSBmb3JtYXQgc3VwcG9ydHMgdGV4dCBvciBqc29uX29iamVjdCBmb3IgdGV4dCBnZW5lcmF0aW9uIG9ubHkuJyk7XG4gIH1cbiAgaWYoaW5wdXQudGVtcGVyYXR1cmUgIT09IHVuZGVmaW5lZCAmJiAoaW5wdXQucHJvdmlkZXIgIT09ICdnZW1pbmknIHx8IGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnIHx8ICFOdW1iZXIuaXNGaW5pdGUoaW5wdXQudGVtcGVyYXR1cmUpIHx8IGlucHV0LnRlbXBlcmF0dXJlIDwgMCB8fCBpbnB1dC50ZW1wZXJhdHVyZSA+IDIpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcigndGVtcGVyYXR1cmUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDIgZm9yIEdlbWluaSB0ZXh0IGdlbmVyYXRpb24uJyk7XG4gIH1cbiAgaWYoaW5wdXQubWF4VG9rZW5zICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlucHV0Lm1heFRva2VucykgfHwgaW5wdXQubWF4VG9rZW5zIDwgMSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdtYXhUb2tlbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuJyk7XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgIT09ICdnZW1pbmknICYmIChpbnB1dC5pbWFnZXM/Lmxlbmd0aCB8fCBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyB8fCBpbnB1dC5zZWFyY2gpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBvcGVyYXRpb24gc3VwcG9ydHMgdGV4dCBpbnB1dCBhbmQgb3V0cHV0IG9ubHkuJyk7XG4gIH1cbiAgY29uc3Qge3Byb21wdCwgaW1hZ2VzID0gW119ID0gaW5wdXQ7XG4gIGlmKGlucHV0LnByb3ZpZGVyID09PSAnY2xhdWRlJykge1xuICAgIGlmKCFjb25maWcuY2xhdWRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdDbGF1ZGUgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdCgnaHR0cHM6Ly9hcGkuYW50aHJvcGljLmNvbS92MS9tZXNzYWdlcycsIHtcbiAgICAgIG1heF90b2tlbnM6IGlucHV0Lm1heFRva2VucyA/PyA0MDk2LFxuICAgICAgbWVzc2FnZXM6IFt7Y29udGVudDogcHJvbXB0LCByb2xlOiAndXNlcid9XSxcbiAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCB8fCBjb25maWcuY2xhdWRlTW9kZWwgfHwgJ2NsYXVkZS1zb25uZXQtNScsXG4gICAgICBzeXN0ZW06IGlucHV0LnN5c3RlbVxuICAgIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsnYW50aHJvcGljLXZlcnNpb24nOiAnMjAyMy0wNi0wMScsICd4LWFwaS1rZXknOiBjb25maWcuY2xhdWRlS2V5fSksIHRpbWVvdXQ6IGlucHV0LnRpbWVvdXRNcyA/PyAxMjBfMDAwfSkgYXMge1xuICAgICAgY29udGVudD86IHt0ZXh0Pzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfVtdO1xuICAgICAgZXJyb3I/OiB7dHlwZT86IHN0cmluZ307XG4gICAgICBzdG9wX3JlYXNvbj86IHN0cmluZztcbiAgICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBpZihyZXNwb25zZS5lcnJvciAmJiBbJ2F1dGhlbnRpY2F0aW9uX2Vycm9yJywgJ2ludmFsaWRfcmVxdWVzdF9lcnJvcicsICdub3RfZm91bmRfZXJyb3InLCAncGVybWlzc2lvbl9lcnJvciddLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLnR5cGUgfHwgJycpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdDbGF1ZGUgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSBtb2RlbCBhbmQgYWNjb3VudCBhY2Nlc3MuJyk7XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSByZXNwb25zZS5jb250ZW50Py5maWx0ZXIoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3RleHQnKS5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignXFxuJykudHJpbSgpO1xuICAgIGlmKHJlc3BvbnNlLmVycm9yIHx8IHJlc3BvbnNlLnR5cGUgIT09ICdtZXNzYWdlJyB8fCByZXNwb25zZS5zdG9wX3JlYXNvbiAhPT0gJ2VuZF90dXJuJyB8fCAhdGV4dCkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignQ2xhdWRlIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKGlucHV0LnByb3ZpZGVyID09PSAnb3BlbmFpJykge1xuICAgIGlmKCFjb25maWcub3BlbmFpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdPcGVuQUkgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdCgnaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MS9yZXNwb25zZXMnLCB7XG4gICAgICBpbnB1dDogaW5wdXQubWVzc2FnZXM/Lm1hcCgobWVzc2FnZSkgPT4gKHtjb250ZW50OiB0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSAnc3RyaW5nJyA/IG1lc3NhZ2UuY29udGVudCA6IG1lc3NhZ2UuY29udGVudC5tYXAoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3RleHQnXG4gICAgICAgID8ge3RleHQ6IHBhcnQudGV4dCwgdHlwZTogJ2lucHV0X3RleHQnfSA6IHtkZXRhaWw6IHBhcnQuZGV0YWlsID8/ICdhdXRvJywgaW1hZ2VfdXJsOiBwYXJ0LnVybCwgdHlwZTogJ2lucHV0X2ltYWdlJ30pLCByb2xlOiBtZXNzYWdlLnJvbGUgPT09ICdzeXN0ZW0nID8gJ2RldmVsb3BlcicgOiBtZXNzYWdlLnJvbGV9KSkgPz8gcHJvbXB0LFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnB1dC5zeXN0ZW0sXG4gICAgICBtYXhfb3V0cHV0X3Rva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICBtb2RlbDogaW5wdXQubW9kZWwgfHwgY29uZmlnLm9wZW5haU1vZGVsIHx8ICdncHQtNi1hc3RyYScsXG4gICAgICAuLi4oaW5wdXQucmVhc29uaW5nRWZmb3J0ID8ge3JlYXNvbmluZzoge2VmZm9ydDogaW5wdXQucmVhc29uaW5nRWZmb3J0fX0gOiB7fSksXG4gICAgICBzdG9yZTogZmFsc2UsXG4gICAgICAuLi4oZm9ybWF0ID8ge3RleHQ6IHtmb3JtYXR9fSA6IHt9KSxcbiAgICAgIHRydW5jYXRpb246ICdkaXNhYmxlZCdcbiAgICB9LCB7Y2FjaGU6IGZhbHNlLCBoZWFkZXJzOiBuZXcgSGVhZGVycyh7QXV0aG9yaXphdGlvbjogYEJlYXJlciAke2NvbmZpZy5vcGVuYWlLZXl9YH0pLCB0aW1lb3V0OiBpbnB1dC50aW1lb3V0TXMgPz8gMTIwXzAwMH0pIGFzIHtcbiAgICAgIGVycm9yPzoge2NvZGU/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9O1xuICAgICAgb3V0cHV0Pzoge2NvbnRlbnQ/OiB7dGV4dD86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTsgc3RhdHVzPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfVtdO1xuICAgICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIH07XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWydpbnZhbGlkX3JlcXVlc3RfZXJyb3InLCAnYXV0aGVudGljYXRpb25fZXJyb3InLCAncGVybWlzc2lvbl9lcnJvciddLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLnR5cGUgfHwgJycpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdPcGVuQUkgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSBtb2RlbCBhbmQgYWNjb3VudCBhY2Nlc3MuJyk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLmVycm9yIHx8IHJlc3BvbnNlLnN0YXR1cyAhPT0gJ2NvbXBsZXRlZCcgfHwgcmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2luY29tcGxldGUnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignT3BlbkFJIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS4nKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQ/LnNvbWUoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3JlZnVzYWwnKSkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSBkZWNsaW5lZCB0aGUgcmVxdWVzdC4nKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnR5cGUgJiYgIVsnbWVzc2FnZScsICdyZWFzb25pbmcnXS5pbmNsdWRlcyhpdGVtLnR5cGUpKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignT3BlbkFJIHJldHVybmVkIGFuIHVuc3VwcG9ydGVkIG91dHB1dCBpdGVtLicpO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcmVzcG9uc2Uub3V0cHV0Py5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ21lc3NhZ2UnKS5mbGF0TWFwKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQgfHwgW10pXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdvdXRwdXRfdGV4dCcpLm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCcnKS50cmltKCk7XG4gICAgaWYoIXRleHQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSByZXR1cm5lZCBlbXB0eSBvdXRwdXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKCFjb25maWcuZ2VtaW5pS2V5KSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignR2VtaW5pIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgc2VydmVyLicpO1xuICB9XG4gIGNvbnN0IHBhcnRzOiB1bmtub3duW10gPSBbe3RleHQ6IHByb21wdH0sIC4uLmltYWdlcy5tYXAoKGltYWdlKSA9PiAoe2lubGluZURhdGE6IHtkYXRhOiBpbWFnZS5ieXRlcy50b1N0cmluZygnYmFzZTY0JyksIG1pbWVUeXBlOiBpbWFnZS5taW1lfX0pKV07XG4gIGNvbnN0IG1vZGVsID0gaW5wdXQubW9kZWwgfHwgKGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gY29uZmlnLmdlbWluaUltYWdlTW9kZWwgfHwgJ2dlbWluaS0zLjEtZmxhc2gtaW1hZ2UnIDogY29uZmlnLmdlbWluaU1vZGVsIHx8ICdnZW1pbmktMy44LWZsYXNoJyk7XG4gIGlmKCEvXlthLXpBLVowLTkuXy1dKyQvLnRlc3QobW9kZWwpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignSW52YWxpZCBHZW1pbmkgbW9kZWwgY29uZmlndXJhdGlvbi4nKTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoYGh0dHBzOi8vZ2VuZXJhdGl2ZWxhbmd1YWdlLmdvb2dsZWFwaXMuY29tL3YxYmV0YS9tb2RlbHMvJHttb2RlbH06Z2VuZXJhdGVDb250ZW50YCwge1xuICAgIGNvbnRlbnRzOiBbe3BhcnRzLCByb2xlOiAndXNlcid9XSxcbiAgICAuLi4oaW5wdXQuc3lzdGVtID8ge3N5c3RlbUluc3RydWN0aW9uOiB7cGFydHM6IFt7dGV4dDogaW5wdXQuc3lzdGVtfV19fSA6IHt9KSxcbiAgICBnZW5lcmF0aW9uQ29uZmlnOiBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/IHsuLi4oaW5wdXQuYXNwZWN0UmF0aW8gPyB7aW1hZ2VDb25maWc6IHthc3BlY3RSYXRpbzogaW5wdXQuYXNwZWN0UmF0aW99fSA6IHt9KSwgcmVzcG9uc2VNb2RhbGl0aWVzOiBbJ1RFWFQnLCAnSU1BR0UnXX0gOiB7XG4gICAgICBtYXhPdXRwdXRUb2tlbnM6IGlucHV0Lm1heFRva2VucyA/PyA0MDk2LFxuICAgICAgLi4uKGZvcm1hdCA/IHtyZXNwb25zZU1pbWVUeXBlOiBmb3JtYXQudHlwZSA9PT0gJ2pzb25fb2JqZWN0JyA/ICdhcHBsaWNhdGlvbi9qc29uJyA6ICd0ZXh0L3BsYWluJ30gOiB7fSksXG4gICAgICAuLi4oaW5wdXQudGVtcGVyYXR1cmUgIT09IHVuZGVmaW5lZCA/IHt0ZW1wZXJhdHVyZTogaW5wdXQudGVtcGVyYXR1cmV9IDoge30pXG4gICAgfSxcbiAgICAuLi4oaW5wdXQuc2VhcmNoID8ge3Rvb2xzOiBbe2dvb2dsZVNlYXJjaDoge319XX0gOiB7fSlcbiAgfSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoeyd4LWdvb2ctYXBpLWtleSc6IGNvbmZpZy5nZW1pbmlLZXl9KSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMF8wMDB9KSBhcyBHZW1pbmlSZXNwb25zZTtcbiAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWzQwMCwgNDAxLCA0MDMsIDQwNF0uaW5jbHVkZXMocmVzcG9uc2UuZXJyb3IuY29kZSB8fCAwKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0dlbWluaSByZWplY3RlZCB0aGUgcmVxdWVzdC4gQ2hlY2sgdGhlIHJlZmVyZW5jZSBmb3JtYXQgYW5kIG1vZGVsIGFjY2Vzcy4nKTtcbiAgfVxuICBpZihyZXNwb25zZS5wcm9tcHRGZWVkYmFjaz8uYmxvY2tSZWFzb24gfHwgcmVzcG9uc2UuZXJyb3IgfHwgIXJlc3BvbnNlLmNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ0dlbWluaSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkLicpO1xuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHJlc3BvbnNlLmNhbmRpZGF0ZXNbMF0hO1xuICBpZihjYW5kaWRhdGUuZmluaXNoUmVhc29uICE9PSAnU1RPUCcpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdHZW1pbmkgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZDogZ2VuZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlLicpO1xuICB9XG4gIGNvbnN0IG91dHB1dCA9IChjYW5kaWRhdGUuY29udGVudD8ucGFydHMgfHwgW10pLmZpbHRlcigocGFydCkgPT4gIXBhcnQudGhvdWdodCk7XG4gIGNvbnN0IGlubGluZSA9IG91dHB1dC5maW5kKChwYXJ0KSA9PiBwYXJ0LmlubGluZURhdGEpPy5pbmxpbmVEYXRhO1xuICBsZXQgaW1hZ2U6IEdlbmVyYXRlZENvbnRlbnRbJ2ltYWdlJ107XG4gIGlmKGlubGluZSAmJiBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJ10uaW5jbHVkZXMoaW5saW5lLm1pbWVUeXBlKSkge1xuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmZyb20oaW5saW5lLmRhdGEsICdiYXNlNjQnKTtcbiAgICBpZighYnl0ZXMubGVuZ3RoIHx8IGJ5dGVzLmxlbmd0aCA+IDIwICogMTAyNCAqIDEwMjQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ0ludmFsaWQgaW1hZ2Ugb3V0cHV0LicpO1xuICAgIH1cbiAgICBpbWFnZSA9IHtieXRlcywgbWltZTogaW5saW5lLm1pbWVUeXBlIGFzICdpbWFnZS9wbmcnIHwgJ2ltYWdlL2pwZWcnfTtcbiAgfVxuICBjb25zdCB0ZXh0ID0gb3V0cHV0Lm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCdcXG4nKS50cmltKCk7XG4gIGlmKGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gIWltYWdlIDogIXRleHQpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdUaGUgcmVxdWVzdGVkIG91dHB1dCB3YXMgbm90IHJldHVybmVkLicpO1xuICB9XG4gIGNvbnN0IHNvdXJjZXMgPSAoY2FuZGlkYXRlLmdyb3VuZGluZ01ldGFkYXRhPy5ncm91bmRpbmdDaHVua3MgfHwgW10pLmZsYXRNYXAoKHt3ZWJ9KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2ViPy51cmkgfHwgJycpO1xuICAgICAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBbe3RpdGxlOiB3ZWI/LnRpdGxlIHx8IHVybC5ob3N0bmFtZSwgdXJsOiB1cmwuaHJlZn1dIDogW107XG4gICAgfSBjYXRjaHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGltYWdlLCBzZWFyY2hTdWdnZXN0aW9uc0h0bWw6IGNhbmRpZGF0ZS5ncm91bmRpbmdNZXRhZGF0YT8uc2VhcmNoRW50cnlQb2ludD8ucmVuZGVyZWRDb250ZW50LCBzb3VyY2VzLCB0ZXh0XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbInBvc3QiLCJDb25maWciLCJDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IiLCJFcnJvciIsIkNvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvciIsInZhbGlkTWVzc2FnZUNvbnRlbnQiLCJtZXNzYWdlIiwiY29udGVudCIsInRyaW0iLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJldmVyeSIsInBhcnQiLCJ0eXBlIiwidGV4dCIsInJvbGUiLCJ1cmwiLCJ0ZXN0IiwiZGV0YWlsIiwidW5kZWZpbmVkIiwiaW5jbHVkZXMiLCJnZW5lcmF0ZUNvbnRlbnQiLCJpbnB1dCIsImNvbmZpZyIsImdldCIsInByb3ZpZGVyIiwibWVzc2FnZXMiLCJwcm9tcHQiLCJzb21lIiwicmVhc29uaW5nRWZmb3J0IiwicmVzcG9uc2VGb3JtYXQiLCJ0aW1lb3V0TXMiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJmb3JtYXQiLCJuYW1lIiwic2NoZW1hIiwic3RyaWN0IiwibW9kYWxpdHkiLCJ0ZW1wZXJhdHVyZSIsImlzRmluaXRlIiwibWF4VG9rZW5zIiwiaW1hZ2VzIiwic2VhcmNoIiwiY2xhdWRlS2V5IiwicmVzcG9uc2UiLCJtYXhfdG9rZW5zIiwibW9kZWwiLCJjbGF1ZGVNb2RlbCIsInN5c3RlbSIsImNhY2hlIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJ0aW1lb3V0IiwiZXJyb3IiLCJmaWx0ZXIiLCJtYXAiLCJqb2luIiwic3RvcF9yZWFzb24iLCJzb3VyY2VzIiwib3BlbmFpS2V5IiwiaW1hZ2VfdXJsIiwiaW5zdHJ1Y3Rpb25zIiwibWF4X291dHB1dF90b2tlbnMiLCJvcGVuYWlNb2RlbCIsInJlYXNvbmluZyIsImVmZm9ydCIsInN0b3JlIiwidHJ1bmNhdGlvbiIsIkF1dGhvcml6YXRpb24iLCJzdGF0dXMiLCJvdXRwdXQiLCJpdGVtIiwiZmxhdE1hcCIsImdlbWluaUtleSIsInBhcnRzIiwiaW1hZ2UiLCJpbmxpbmVEYXRhIiwiZGF0YSIsImJ5dGVzIiwidG9TdHJpbmciLCJtaW1lVHlwZSIsIm1pbWUiLCJnZW1pbmlJbWFnZU1vZGVsIiwiZ2VtaW5pTW9kZWwiLCJjb250ZW50cyIsInN5c3RlbUluc3RydWN0aW9uIiwiZ2VuZXJhdGlvbkNvbmZpZyIsImFzcGVjdFJhdGlvIiwiaW1hZ2VDb25maWciLCJyZXNwb25zZU1vZGFsaXRpZXMiLCJtYXhPdXRwdXRUb2tlbnMiLCJyZXNwb25zZU1pbWVUeXBlIiwidG9vbHMiLCJnb29nbGVTZWFyY2giLCJjb2RlIiwicHJvbXB0RmVlZGJhY2siLCJibG9ja1JlYXNvbiIsImNhbmRpZGF0ZXMiLCJjYW5kaWRhdGUiLCJmaW5pc2hSZWFzb24iLCJ0aG91Z2h0IiwiaW5saW5lIiwiZmluZCIsIkJ1ZmZlciIsImZyb20iLCJncm91bmRpbmdNZXRhZGF0YSIsImdyb3VuZGluZ0NodW5rcyIsIndlYiIsIlVSTCIsInVyaSIsInByb3RvY29sIiwidGl0bGUiLCJob3N0bmFtZSIsImhyZWYiLCJzZWFyY2hTdWdnZXN0aW9uc0h0bWwiLCJzZWFyY2hFbnRyeVBvaW50IiwicmVuZGVyZWRDb250ZW50Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFRQSxJQUFJLFFBQU8sb0JBQW9CO0FBRXZDLFNBQVFDLE1BQU0sUUFBTyxlQUFlO0FBbURwQywrRUFBK0UsR0FDL0UsT0FBTyxNQUFNQyx1Q0FBdUNDO0FBQU87QUFDM0QsNEZBQTRGLEdBQzVGLE9BQU8s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
|
|
315
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dlbmVyYXRlT2xsYW1hQ29udGVudH0gZnJvbSAnLi9vbGxhbWFHZW5lcmF0aW9uLmpzJztcbmltcG9ydCB7Q29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yLCBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3J9IGZyb20gJy4vY29udGVudEdlbmVyYXRpb25FcnJvcnMuanMnO1xuZXhwb3J0IHtDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IsIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcn0gZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbkVycm9ycy5qcyc7XG5pbXBvcnQge3Bvc3R9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25Db25maWcge1xuICBjbGF1ZGVLZXk/OiBzdHJpbmc7XG4gIGNsYXVkZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlJbWFnZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlLZXk/OiBzdHJpbmc7XG4gIGdlbWluaU1vZGVsPzogc3RyaW5nO1xuICBvbGxhbWE/OiB7ZW5kcG9pbnQ6IHN0cmluZzsgcHJvdG9jb2w6ICdnZW5lcmF0ZScgfCAnY2hhdCcgfCAnb3BlbmFpLWNoYXQnfTtcbiAgb3BlbmFpS2V5Pzogc3RyaW5nO1xuICBvcGVuYWlNb2RlbD86IHN0cmluZztcbn1cbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUGFydCA9IHt0ZXh0OiBzdHJpbmc7IHR5cGU6ICd0ZXh0J30gfCB7XG4gIGRldGFpbD86ICdhdXRvJyB8ICdoaWdoJyB8ICdsb3cnO1xuICB0eXBlOiAnaW1hZ2UnO1xuICB1cmw6IHN0cmluZztcbn07XG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZSB7XG4gIGNvbnRlbnQ6IHN0cmluZyB8IENvbnRlbnRHZW5lcmF0aW9uUGFydFtdO1xuICByb2xlOiAnYXNzaXN0YW50JyB8ICdkZXZlbG9wZXInIHwgJ3N5c3RlbScgfCAndXNlcic7XG59XG5leHBvcnQgdHlwZSBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRm9ybWF0ID0ge3R5cGU6ICdqc29uX29iamVjdCcgfCAndGV4dCd9IHwge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBzdHJpY3Q/OiBib29sZWFuO1xuICB0eXBlOiAnanNvbl9zY2hlbWEnO1xufTtcbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUmVhc29uaW5nRWZmb3J0ID0gJ25vbmUnIHwgJ21pbmltYWwnIHwgJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICd4aGlnaCcgfCAnbWF4JztcblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50R2VuZXJhdGlvbklucHV0IHtcbiAgYXNwZWN0UmF0aW8/OiBzdHJpbmc7XG4gIGltYWdlcz86IHtieXRlczogQnVmZmVyOyBtaW1lOiBzdHJpbmd9W107XG4gIG1heFRva2Vucz86IG51bWJlcjtcbiAgbWVzc2FnZXM/OiBDb250ZW50R2VuZXJhdGlvbk1lc3NhZ2VbXTtcbiAgbW9kYWxpdHk/OiAnaW1hZ2UnIHwgJ3RleHQnO1xuICBtb2RlbD86IHN0cmluZztcbiAgcHJvbXB0Pzogc3RyaW5nO1xuICBwcm92aWRlcjogJ2NsYXVkZScgfCAnZ2VtaW5pJyB8ICdvbGxhbWEnIHwgJ29wZW5haSc7XG4gIHJlYXNvbmluZ0VmZm9ydD86IENvbnRlbnRHZW5lcmF0aW9uUmVhc29uaW5nRWZmb3J0O1xuICByZXNwb25zZUZvcm1hdD86IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQ7XG4gIHNlYXJjaD86IGJvb2xlYW47XG4gIHN5c3RlbT86IHN0cmluZztcbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgdG9wUD86IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVkQ29udGVudCB7XG4gIGltYWdlPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6ICdpbWFnZS9qcGVnJyB8ICdpbWFnZS9wbmcnfTtcbiAgc2VhcmNoU3VnZ2VzdGlvbnNIdG1sPzogc3RyaW5nO1xuICBzb3VyY2VzOiB7dGl0bGU6IHN0cmluZzsgdXJsOiBzdHJpbmd9W107XG4gIHRleHQ6IHN0cmluZztcbn1cbmludGVyZmFjZSBHZW1pbmlQYXJ0IHtpbmxpbmVEYXRhPzoge2RhdGE6IHN0cmluZzsgbWltZVR5cGU6IHN0cmluZ307IHRleHQ/OiBzdHJpbmc7IHRob3VnaHQ/OiBib29sZWFufVxuaW50ZXJmYWNlIEdlbWluaVJlc3BvbnNlIHtcbiAgY2FuZGlkYXRlcz86IHtcbiAgICBjb250ZW50Pzoge3BhcnRzPzogR2VtaW5pUGFydFtdfTtcbiAgICBmaW5pc2hSZWFzb24/OiBzdHJpbmc7XG4gICAgZ3JvdW5kaW5nTWV0YWRhdGE/OiB7XG4gICAgICBncm91bmRpbmdDaHVua3M/OiB7d2ViPzoge3RpdGxlPzogc3RyaW5nOyB1cmk/OiBzdHJpbmd9fVtdO1xuICAgICAgc2VhcmNoRW50cnlQb2ludD86IHtyZW5kZXJlZENvbnRlbnQ/OiBzdHJpbmd9O1xuICAgIH07XG4gIH1bXTtcbiAgZXJyb3I/OiB7Y29kZT86IG51bWJlcn07XG4gIHByb21wdEZlZWRiYWNrPzoge2Jsb2NrUmVhc29uPzogc3RyaW5nfTtcbn1cblxuY29uc3QgdmFsaWRNZXNzYWdlQ29udGVudCA9IChtZXNzYWdlOiBDb250ZW50R2VuZXJhdGlvbk1lc3NhZ2UpOiBib29sZWFuID0+IHtcbiAgaWYodHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gJ3N0cmluZycpIHJldHVybiAhIW1lc3NhZ2UuY29udGVudC50cmltKCk7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkgJiYgbWVzc2FnZS5jb250ZW50Lmxlbmd0aCA+IDAgJiYgbWVzc2FnZS5jb250ZW50LmV2ZXJ5KChwYXJ0KSA9PiB7XG4gICAgaWYoIXBhcnQpIHJldHVybiBmYWxzZTtcbiAgICBpZihwYXJ0LnR5cGUgPT09ICd0ZXh0JykgcmV0dXJuIHR5cGVvZiBwYXJ0LnRleHQgPT09ICdzdHJpbmcnICYmICEhcGFydC50ZXh0LnRyaW0oKTtcbiAgICByZXR1cm4gcGFydC50eXBlID09PSAnaW1hZ2UnICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ3VzZXInICYmIHR5cGVvZiBwYXJ0LnVybCA9PT0gJ3N0cmluZydcbiAgICAgICYmIC9eKGh0dHBzPzpcXC9cXC9bXlxcc10rfGRhdGE6aW1hZ2VcXC8ocG5nfGpwZWd8d2VicHxnaWYpO2Jhc2U2NCxbQS1aYS16MC05Ky9dKz17MCwyfSkkLy50ZXN0KHBhcnQudXJsKVxuICAgICAgJiYgKHBhcnQuZGV0YWlsID09PSB1bmRlZmluZWQgfHwgWydhdXRvJywgJ2hpZ2gnLCAnbG93J10uaW5jbHVkZXMocGFydC5kZXRhaWwpKTtcbiAgfSk7XG59O1xuXG4vKiogU2luZ2xlIHN1Ym1pc3Npb24gdGhyb3VnaCBSaXAtSHVudGVyOyBjYWxsZXJzIG93biBkdXJhYmxlIGpvYnMgYW5kIHJlY29uY2lsaWF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlQ29udGVudCA9IGFzeW5jIChcbiAgaW5wdXQ6IENvbnRlbnRHZW5lcmF0aW9uSW5wdXQsXG4gIGNvbmZpZzogQ29udGVudEdlbmVyYXRpb25Db25maWcgPSBDb25maWcuZ2V0PENvbnRlbnRHZW5lcmF0aW9uQ29uZmlnPignY29udGVudEdlbmVyYXRpb24nKSB8fCB7fVxuKTogUHJvbWlzZTxHZW5lcmF0ZWRDb250ZW50PiA9PiB7XG4gIGlmKCFbJ2NsYXVkZScsICdnZW1pbmknLCAnb2xsYW1hJywgJ29wZW5haSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egc3VwcG9ydGVkIHByb3ZpZGVyIGlzIHJlcXVpcmVkLicpO1xuICB9XG4gIGlmKGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZihpbnB1dC5wcm9tcHQgIT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheShpbnB1dC5tZXNzYWdlcykgfHwgIWlucHV0Lm1lc3NhZ2VzLmxlbmd0aCB8fCBpbnB1dC5tZXNzYWdlcy5zb21lKChtZXNzYWdlKSA9PlxuICAgICAgIW1lc3NhZ2UgfHwgIVsnYXNzaXN0YW50JywgJ2RldmVsb3BlcicsICdzeXN0ZW0nLCAndXNlciddLmluY2x1ZGVzKG1lc3NhZ2Uucm9sZSkgfHwgIXZhbGlkTWVzc2FnZUNvbnRlbnQobWVzc2FnZSkpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdTdXBwbHkgZWl0aGVyIGEgbm9uLWVtcHR5IHByb21wdCBvciBub24tZW1wdHkgdGV4dCBtZXNzYWdlcyB3aXRoIHN1cHBvcnRlZCByb2xlcy4nKTtcbiAgICB9XG4gIH0gZWxzZSBpZih0eXBlb2YgaW5wdXQucHJvbXB0ICE9PSAnc3RyaW5nJyB8fCAhaW5wdXQucHJvbXB0LnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egbm9uLWVtcHR5IHByb21wdCBpcyByZXF1aXJlZC4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ29wZW5haScgJiYgKGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQgfHwgaW5wdXQucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgfHwgKGlucHV0LnByb3ZpZGVyID09PSAnY2xhdWRlJyAmJiBpbnB1dC5yZXNwb25zZUZvcm1hdCAhPT0gdW5kZWZpbmVkKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdNZXNzYWdlcyBhbmQgcmVhc29uaW5nIGVmZm9ydCByZXF1aXJlIE9wZW5BSTsgQ2xhdWRlIGRvZXMgbm90IHN1cHBvcnQgcmVzcG9uc2UgZm9ybWF0IG9wdGlvbnMuJyk7XG4gIH1cbiAgaWYoaW5wdXQudGltZW91dE1zICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlucHV0LnRpbWVvdXRNcykgfHwgaW5wdXQudGltZW91dE1zIDwgMSB8fCBpbnB1dC50aW1lb3V0TXMgPiAyXzE0N180ODNfNjQ3KSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ3RpbWVvdXRNcyBtdXN0IGJlIGEgcG9zaXRpdmUgMzItYml0IGludGVnZXIuJyk7XG4gIH1cbiAgaWYoaW5wdXQucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgJiYgIVsnbm9uZScsICdtaW5pbWFsJywgJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICd4aGlnaCcsICdtYXgnXS5pbmNsdWRlcyhpbnB1dC5yZWFzb25pbmdFZmZvcnQpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVW5zdXBwb3J0ZWQgcmVhc29uaW5nIGVmZm9ydC4nKTtcbiAgfVxuICBjb25zdCBmb3JtYXQgPSBpbnB1dC5yZXNwb25zZUZvcm1hdDtcbiAgaWYoZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgKCFmb3JtYXQgfHwgIVsndGV4dCcsICdqc29uX29iamVjdCcsICdqc29uX3NjaGVtYSddLmluY2x1ZGVzKGZvcm1hdC50eXBlKSB8fCAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgJiYgKFxuICAgIHR5cGVvZiBmb3JtYXQubmFtZSAhPT0gJ3N0cmluZycgfHwgIS9eW2EtekEtWjAtOV8tXXsxLDY0fSQvLnRlc3QoZm9ybWF0Lm5hbWUpIHx8ICFmb3JtYXQuc2NoZW1hIHx8IHR5cGVvZiBmb3JtYXQuc2NoZW1hICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGZvcm1hdC5zY2hlbWEpXG4gICAgfHwgKGZvcm1hdC5zdHJpY3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZm9ybWF0LnN0cmljdCAhPT0gJ2Jvb2xlYW4nKVxuICApKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGZvcm1hdC4gSlNPTiBzY2hlbWFzIHJlcXVpcmUgYSBuYW1lIGFuZCBzY2hlbWEgb2JqZWN0LicpO1xuICB9XG4gIGlmKFsnZ2VtaW5pJywgJ29sbGFtYSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSAmJiBmb3JtYXQgIT09IHVuZGVmaW5lZCAmJiAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBzdXBwb3J0cyB0ZXh0IG9yIGpzb25fb2JqZWN0IGZvciB0ZXh0IGdlbmVyYXRpb24gb25seS4nKTtcbiAgfVxuICBpZihpbnB1dC50b3BQICE9PSB1bmRlZmluZWQgJiYgKGlucHV0LnByb3ZpZGVyICE9PSAnb2xsYW1hJyB8fCBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyB8fCAhTnVtYmVyLmlzRmluaXRlKGlucHV0LnRvcFApIHx8IGlucHV0LnRvcFAgPCAwIHx8IGlucHV0LnRvcFAgPiAxKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ3RvcFAgcmVxdWlyZXMgYW4gT2xsYW1hIHRleHQgcmVxdWVzdCBhbmQgYSBmaW5pdGUgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLicpO1xuICB9XG4gIGlmKGlucHV0LnRlbXBlcmF0dXJlICE9PSB1bmRlZmluZWQgJiYgKCFbJ2dlbWluaScsICdvbGxhbWEnXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgfHwgIU51bWJlci5pc0Zpbml0ZShpbnB1dC50ZW1wZXJhdHVyZSkgfHwgaW5wdXQudGVtcGVyYXR1cmUgPCAwIHx8IChpbnB1dC5wcm92aWRlciA9PT0gJ2dlbWluaScgJiYgaW5wdXQudGVtcGVyYXR1cmUgPiAyKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCd0ZW1wZXJhdHVyZSByZXF1aXJlcyBhIG5vbm5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSBmb3IgT2xsYW1hIHRleHQgb3IgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDIgZm9yIEdlbWluaSB0ZXh0LicpO1xuICB9XG4gIGlmKGlucHV0Lm1heFRva2VucyAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzSW50ZWdlcihpbnB1dC5tYXhUb2tlbnMpIHx8IGlucHV0Lm1heFRva2VucyA8IDEpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignbWF4VG9rZW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLicpO1xuICB9XG4gIGlmKGlucHV0LnByb3ZpZGVyICE9PSAnZ2VtaW5pJyAmJiAoaW5wdXQuaW1hZ2VzPy5sZW5ndGggfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgfHwgaW5wdXQuc2VhcmNoKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ1RoaXMgcHJvdmlkZXIgb3BlcmF0aW9uIHN1cHBvcnRzIHRleHQgaW5wdXQgYW5kIG91dHB1dCBvbmx5LicpO1xuICB9XG4gIGlmKGlucHV0LnByb3ZpZGVyID09PSAnb2xsYW1hJykgcmV0dXJuIGdlbmVyYXRlT2xsYW1hQ29udGVudChpbnB1dCwgY29uZmlnKTtcbiAgY29uc3Qge3Byb21wdCwgaW1hZ2VzID0gW119ID0gaW5wdXQ7XG4gIGlmKGlucHV0LnByb3ZpZGVyID09PSAnY2xhdWRlJykge1xuICAgIGlmKCFjb25maWcuY2xhdWRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdDbGF1ZGUgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdCgnaHR0cHM6Ly9hcGkuYW50aHJvcGljLmNvbS92MS9tZXNzYWdlcycsIHtcbiAgICAgIG1heF90b2tlbnM6IGlucHV0Lm1heFRva2VucyA/PyA0MDk2LFxuICAgICAgbWVzc2FnZXM6IFt7Y29udGVudDogcHJvbXB0LCByb2xlOiAndXNlcid9XSxcbiAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCB8fCBjb25maWcuY2xhdWRlTW9kZWwgfHwgJ2NsYXVkZS1zb25uZXQtNScsXG4gICAgICBzeXN0ZW06IGlucHV0LnN5c3RlbVxuICAgIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsnYW50aHJvcGljLXZlcnNpb24nOiAnMjAyMy0wNi0wMScsICd4LWFwaS1rZXknOiBjb25maWcuY2xhdWRlS2V5fSksIHRpbWVvdXQ6IGlucHV0LnRpbWVvdXRNcyA/PyAxMjBfMDAwfSkgYXMge1xuICAgICAgY29udGVudD86IHt0ZXh0Pzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfVtdO1xuICAgICAgZXJyb3I/OiB7dHlwZT86IHN0cmluZ307XG4gICAgICBzdG9wX3JlYXNvbj86IHN0cmluZztcbiAgICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBpZihyZXNwb25zZS5lcnJvciAmJiBbJ2F1dGhlbnRpY2F0aW9uX2Vycm9yJywgJ2ludmFsaWRfcmVxdWVzdF9lcnJvcicsICdub3RfZm91bmRfZXJyb3InLCAncGVybWlzc2lvbl9lcnJvciddLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLnR5cGUgfHwgJycpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdDbGF1ZGUgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSBtb2RlbCBhbmQgYWNjb3VudCBhY2Nlc3MuJyk7XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSByZXNwb25zZS5jb250ZW50Py5maWx0ZXIoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3RleHQnKS5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignXFxuJykudHJpbSgpO1xuICAgIGlmKHJlc3BvbnNlLmVycm9yIHx8IHJlc3BvbnNlLnR5cGUgIT09ICdtZXNzYWdlJyB8fCByZXNwb25zZS5zdG9wX3JlYXNvbiAhPT0gJ2VuZF90dXJuJyB8fCAhdGV4dCkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignQ2xhdWRlIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKGlucHV0LnByb3ZpZGVyID09PSAnb3BlbmFpJykge1xuICAgIGlmKCFjb25maWcub3BlbmFpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdPcGVuQUkgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdCgnaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MS9yZXNwb25zZXMnLCB7XG4gICAgICBpbnB1dDogaW5wdXQubWVzc2FnZXM/Lm1hcCgobWVzc2FnZSkgPT4gKHtjb250ZW50OiB0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSAnc3RyaW5nJyA/IG1lc3NhZ2UuY29udGVudCA6IG1lc3NhZ2UuY29udGVudC5tYXAoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3RleHQnXG4gICAgICAgID8ge3RleHQ6IHBhcnQudGV4dCwgdHlwZTogJ2lucHV0X3RleHQnfSA6IHtkZXRhaWw6IHBhcnQuZGV0YWlsID8/ICdhdXRvJywgaW1hZ2VfdXJsOiBwYXJ0LnVybCwgdHlwZTogJ2lucHV0X2ltYWdlJ30pLCByb2xlOiBtZXNzYWdlLnJvbGUgPT09ICdzeXN0ZW0nID8gJ2RldmVsb3BlcicgOiBtZXNzYWdlLnJvbGV9KSkgPz8gcHJvbXB0LFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnB1dC5zeXN0ZW0sXG4gICAgICBtYXhfb3V0cHV0X3Rva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICBtb2RlbDogaW5wdXQubW9kZWwgfHwgY29uZmlnLm9wZW5haU1vZGVsIHx8ICdncHQtNi1hc3RyYScsXG4gICAgICAuLi4oaW5wdXQucmVhc29uaW5nRWZmb3J0ID8ge3JlYXNvbmluZzoge2VmZm9ydDogaW5wdXQucmVhc29uaW5nRWZmb3J0fX0gOiB7fSksXG4gICAgICBzdG9yZTogZmFsc2UsXG4gICAgICAuLi4oZm9ybWF0ID8ge3RleHQ6IHtmb3JtYXR9fSA6IHt9KSxcbiAgICAgIHRydW5jYXRpb246ICdkaXNhYmxlZCdcbiAgICB9LCB7Y2FjaGU6IGZhbHNlLCBoZWFkZXJzOiBuZXcgSGVhZGVycyh7QXV0aG9yaXphdGlvbjogYEJlYXJlciAke2NvbmZpZy5vcGVuYWlLZXl9YH0pLCB0aW1lb3V0OiBpbnB1dC50aW1lb3V0TXMgPz8gMTIwXzAwMH0pIGFzIHtcbiAgICAgIGVycm9yPzoge2NvZGU/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9O1xuICAgICAgb3V0cHV0Pzoge2NvbnRlbnQ/OiB7dGV4dD86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTsgc3RhdHVzPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfVtdO1xuICAgICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIH07XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWydpbnZhbGlkX3JlcXVlc3RfZXJyb3InLCAnYXV0aGVudGljYXRpb25fZXJyb3InLCAncGVybWlzc2lvbl9lcnJvciddLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLnR5cGUgfHwgJycpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdPcGVuQUkgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSBtb2RlbCBhbmQgYWNjb3VudCBhY2Nlc3MuJyk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLmVycm9yIHx8IHJlc3BvbnNlLnN0YXR1cyAhPT0gJ2NvbXBsZXRlZCcgfHwgcmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2luY29tcGxldGUnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignT3BlbkFJIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS4nKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQ/LnNvbWUoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3JlZnVzYWwnKSkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSBkZWNsaW5lZCB0aGUgcmVxdWVzdC4nKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnR5cGUgJiYgIVsnbWVzc2FnZScsICdyZWFzb25pbmcnXS5pbmNsdWRlcyhpdGVtLnR5cGUpKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignT3BlbkFJIHJldHVybmVkIGFuIHVuc3VwcG9ydGVkIG91dHB1dCBpdGVtLicpO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcmVzcG9uc2Uub3V0cHV0Py5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ21lc3NhZ2UnKS5mbGF0TWFwKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQgfHwgW10pXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdvdXRwdXRfdGV4dCcpLm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCcnKS50cmltKCk7XG4gICAgaWYoIXRleHQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSByZXR1cm5lZCBlbXB0eSBvdXRwdXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKCFjb25maWcuZ2VtaW5pS2V5KSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignR2VtaW5pIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgc2VydmVyLicpO1xuICB9XG4gIGNvbnN0IHBhcnRzOiB1bmtub3duW10gPSBbe3RleHQ6IHByb21wdH0sIC4uLmltYWdlcy5tYXAoKGltYWdlKSA9PiAoe2lubGluZURhdGE6IHtkYXRhOiBpbWFnZS5ieXRlcy50b1N0cmluZygnYmFzZTY0JyksIG1pbWVUeXBlOiBpbWFnZS5taW1lfX0pKV07XG4gIGNvbnN0IG1vZGVsID0gaW5wdXQubW9kZWwgfHwgKGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gY29uZmlnLmdlbWluaUltYWdlTW9kZWwgfHwgJ2dlbWluaS0zLjEtZmxhc2gtaW1hZ2UnIDogY29uZmlnLmdlbWluaU1vZGVsIHx8ICdnZW1pbmktMy44LWZsYXNoJyk7XG4gIGlmKCEvXlthLXpBLVowLTkuXy1dKyQvLnRlc3QobW9kZWwpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignSW52YWxpZCBHZW1pbmkgbW9kZWwgY29uZmlndXJhdGlvbi4nKTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoYGh0dHBzOi8vZ2VuZXJhdGl2ZWxhbmd1YWdlLmdvb2dsZWFwaXMuY29tL3YxYmV0YS9tb2RlbHMvJHttb2RlbH06Z2VuZXJhdGVDb250ZW50YCwge1xuICAgIGNvbnRlbnRzOiBbe3BhcnRzLCByb2xlOiAndXNlcid9XSxcbiAgICAuLi4oaW5wdXQuc3lzdGVtID8ge3N5c3RlbUluc3RydWN0aW9uOiB7cGFydHM6IFt7dGV4dDogaW5wdXQuc3lzdGVtfV19fSA6IHt9KSxcbiAgICBnZW5lcmF0aW9uQ29uZmlnOiBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/IHsuLi4oaW5wdXQuYXNwZWN0UmF0aW8gPyB7aW1hZ2VDb25maWc6IHthc3BlY3RSYXRpbzogaW5wdXQuYXNwZWN0UmF0aW99fSA6IHt9KSwgcmVzcG9uc2VNb2RhbGl0aWVzOiBbJ1RFWFQnLCAnSU1BR0UnXX0gOiB7XG4gICAgICBtYXhPdXRwdXRUb2tlbnM6IGlucHV0Lm1heFRva2VucyA/PyA0MDk2LFxuICAgICAgLi4uKGZvcm1hdCA/IHtyZXNwb25zZU1pbWVUeXBlOiBmb3JtYXQudHlwZSA9PT0gJ2pzb25fb2JqZWN0JyA/ICdhcHBsaWNhdGlvbi9qc29uJyA6ICd0ZXh0L3BsYWluJ30gOiB7fSksXG4gICAgICAuLi4oaW5wdXQudGVtcGVyYXR1cmUgIT09IHVuZGVmaW5lZCA/IHt0ZW1wZXJhdHVyZTogaW5wdXQudGVtcGVyYXR1cmV9IDoge30pXG4gICAgfSxcbiAgICAuLi4oaW5wdXQuc2VhcmNoID8ge3Rvb2xzOiBbe2dvb2dsZVNlYXJjaDoge319XX0gOiB7fSlcbiAgfSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoeyd4LWdvb2ctYXBpLWtleSc6IGNvbmZpZy5nZW1pbmlLZXl9KSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMF8wMDB9KSBhcyBHZW1pbmlSZXNwb25zZTtcbiAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWzQwMCwgNDAxLCA0MDMsIDQwNF0uaW5jbHVkZXMocmVzcG9uc2UuZXJyb3IuY29kZSB8fCAwKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0dlbWluaSByZWplY3RlZCB0aGUgcmVxdWVzdC4gQ2hlY2sgdGhlIHJlZmVyZW5jZSBmb3JtYXQgYW5kIG1vZGVsIGFjY2Vzcy4nKTtcbiAgfVxuICBpZihyZXNwb25zZS5wcm9tcHRGZWVkYmFjaz8uYmxvY2tSZWFzb24gfHwgcmVzcG9uc2UuZXJyb3IgfHwgIXJlc3BvbnNlLmNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ0dlbWluaSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkLicpO1xuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHJlc3BvbnNlLmNhbmRpZGF0ZXNbMF0hO1xuICBpZihjYW5kaWRhdGUuZmluaXNoUmVhc29uICE9PSAnU1RPUCcpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdHZW1pbmkgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZDogZ2VuZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlLicpO1xuICB9XG4gIGNvbnN0IG91dHB1dCA9IChjYW5kaWRhdGUuY29udGVudD8ucGFydHMgfHwgW10pLmZpbHRlcigocGFydCkgPT4gIXBhcnQudGhvdWdodCk7XG4gIGNvbnN0IGlubGluZSA9IG91dHB1dC5maW5kKChwYXJ0KSA9PiBwYXJ0LmlubGluZURhdGEpPy5pbmxpbmVEYXRhO1xuICBsZXQgaW1hZ2U6IEdlbmVyYXRlZENvbnRlbnRbJ2ltYWdlJ107XG4gIGlmKGlubGluZSAmJiBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJ10uaW5jbHVkZXMoaW5saW5lLm1pbWVUeXBlKSkge1xuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmZyb20oaW5saW5lLmRhdGEsICdiYXNlNjQnKTtcbiAgICBpZighYnl0ZXMubGVuZ3RoIHx8IGJ5dGVzLmxlbmd0aCA+IDIwICogMTAyNCAqIDEwMjQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ0ludmFsaWQgaW1hZ2Ugb3V0cHV0LicpO1xuICAgIH1cbiAgICBpbWFnZSA9IHtieXRlcywgbWltZTogaW5saW5lLm1pbWVUeXBlIGFzICdpbWFnZS9wbmcnIHwgJ2ltYWdlL2pwZWcnfTtcbiAgfVxuICBjb25zdCB0ZXh0ID0gb3V0cHV0Lm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCdcXG4nKS50cmltKCk7XG4gIGlmKGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gIWltYWdlIDogIXRleHQpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdUaGUgcmVxdWVzdGVkIG91dHB1dCB3YXMgbm90IHJldHVybmVkLicpO1xuICB9XG4gIGNvbnN0IHNvdXJjZXMgPSAoY2FuZGlkYXRlLmdyb3VuZGluZ01ldGFkYXRhPy5ncm91bmRpbmdDaHVua3MgfHwgW10pLmZsYXRNYXAoKHt3ZWJ9KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2ViPy51cmkgfHwgJycpO1xuICAgICAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBbe3RpdGxlOiB3ZWI/LnRpdGxlIHx8IHVybC5ob3N0bmFtZSwgdXJsOiB1cmwuaHJlZn1dIDogW107XG4gICAgfSBjYXRjaHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGltYWdlLCBzZWFyY2hTdWdnZXN0aW9uc0h0bWw6IGNhbmRpZGF0ZS5ncm91bmRpbmdNZXRhZGF0YT8uc2VhcmNoRW50cnlQb2ludD8ucmVuZGVyZWRDb250ZW50LCBzb3VyY2VzLCB0ZXh0XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbImdlbmVyYXRlT2xsYW1hQ29udGVudCIsIkNvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvciIsIkNvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvciIsInBvc3QiLCJDb25maWciLCJ2YWxpZE1lc3NhZ2VDb250ZW50IiwibWVzc2FnZSIsImNvbnRlbnQiLCJ0cmltIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiZXZlcnkiLCJwYXJ0IiwidHlwZSIsInRleHQiLCJyb2xlIiwidXJsIiwidGVzdCIsImRldGFpbCIsInVuZGVmaW5lZCIsImluY2x1ZGVzIiwiZ2VuZXJhdGVDb250ZW50IiwiaW5wdXQiLCJjb25maWciLCJnZXQiLCJwcm92aWRlciIsIm1lc3NhZ2VzIiwicHJvbXB0Iiwic29tZSIsInJlYXNvbmluZ0VmZm9ydCIsInJlc3BvbnNlRm9ybWF0IiwidGltZW91dE1zIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiZm9ybWF0IiwibmFtZSIsInNjaGVtYSIsInN0cmljdCIsIm1vZGFsaXR5IiwidG9wUCIsImlzRmluaXRlIiwidGVtcGVyYXR1cmUiLCJtYXhUb2tlbnMiLCJpbWFnZXMiLCJzZWFyY2giLCJjbGF1ZGVLZXkiLCJyZXNwb25zZSIsIm1heF90b2tlbnMiLCJtb2RlbCIsImNsYXVkZU1vZGVsIiwic3lzdGVtIiwiY2FjaGUiLCJoZWFkZXJzIiwiSGVhZGVycyIsInRpbWVvdXQiLCJlcnJvciIsImZpbHRlciIsIm1hcCIsImpvaW4iLCJzdG9wX3JlYXNvbiIsInNvdXJjZXMiLCJvcGVuYWlLZXkiLCJpbWFnZV91cmwiLCJpbnN0cnVjdGlvbnMiLCJtYXhfb3V0cHV0X3Rva2VucyIsIm9wZW5haU1vZGVsIiwicmVhc29uaW5nIiwiZWZmb3J0Iiwic3RvcmUiLCJ0cnVuY2F0aW9uIiwiQXV0aG9yaXphdGlvbiIsInN0YXR1cyIsIm91dHB1dCIsIml0ZW0iLCJmbGF0TWFwIiwiZ2VtaW5pS2V5IiwicGFydHMiLCJpbWFnZSIsImlubGluZURhdGEiLCJkYXRhIiwiYnl0ZXMiLCJ0b1N0cmluZyIsIm1pbWVUeXBlIiwibWltZSIsImdlbWluaUltYWdlTW9kZWwiLCJnZW1pbmlNb2RlbCIsImNvbnRlbnRzIiwic3lzdGVtSW5zdHJ1Y3Rpb24iLCJnZW5lcmF0aW9uQ29uZmlnIiwiYXNwZWN0UmF0aW8iLCJpbWFnZUNvbmZpZyIsInJlc3BvbnNlTW9kYWxpdGllcyIsIm1heE91dHB1dFRva2VucyIsInJlc3BvbnNlTWltZVR5cGUiLCJ0b29scyIsImdvb2dsZVNlYXJjaCIsImNvZGUiLCJwcm9tcHRGZWVkYmFjayIsImJsb2NrUmVhc29uIiwiY2FuZGlkYXRlcyIsImNhbmRpZGF0ZSIsImZpbmlzaFJlYXNvbiIsInRob3VnaHQiLCJpbmxpbmUiLCJmaW5kIiwiQnVmZmVyIiwiZnJvbSIsImdyb3VuZGluZ01ldGFkYXRhIiwiZ3JvdW5kaW5nQ2h1bmtzIiwid2ViIiwiVVJMIiwidXJpIiwicHJvdG9jb2wiLCJ0aXRsZSIsImhvc3RuYW1lIiwiaHJlZiIsInNlYXJjaFN1Z2dlc3Rpb25zSHRtbCIsInNlYXJjaEVudHJ5UG9pbnQiLCJyZW5kZXJlZENvbnRlbnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLHFCQUFxQixRQUFPLHdCQUF3QjtBQUM1RCxTQUFRQyw4QkFBOEIsRUFBRUMsOEJBQThCLFFBQU8sK0JBQStCO0FBQzVHLFNBQVFELDhCQUE4QixFQUFFQyw4QkFBOEIsUUFBTywrQkFBK0I7QUFDNUcsU0FBUUMsSUFBSSxRQUFPLG9CQUFvQjtBQUV2QyxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQW1FcEMsTUFBTUMsc0JBQXNCLENBQUNDO0lBQzNCLElBQUcsT0FBT0EsUUFBUUMsT0FBTyxLQUFLLFVBQVUsT0FBTyxDQUFDLENBQUNELFFBQVFDLE9BQU8sQ0FBQ0MsSUFBSTtJQUNyRSxPQUFPQyxNQUFNQyxPQUFPLENBQUNKLFFBQVFDLE9BQU8sS0FBS0QsUUFBUUMsT0FBTyxDQUFDSSxNQUFNLEdBQUcsS0FBS0wsUUFBUUMsT0FBTyxDQUFDSyxLQUFLLENBQUMsQ0FBQ0M7UUFDNUYsSUFBRyxDQUFDQSxNQUFNLE9BQU87UUFDakIsSUFBR0Es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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** A confirmed rejection is distinct from an unknown paid submission outcome. */
|
|
2
|
+
export declare class ContentGenerationRejectedError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/** An accepted generation did not produce usable output; do not automatically resubmit it. */
|
|
5
|
+
export declare class ContentGenerationResponseError extends Error {
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** A confirmed rejection is distinct from an unknown paid submission outcome. */ export class ContentGenerationRejectedError extends Error {
|
|
2
|
+
}
|
|
3
|
+
/** An accepted generation did not produce usable output; do not automatically resubmit it. */ export class ContentGenerationResponseError extends Error {
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbkVycm9ycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQSBjb25maXJtZWQgcmVqZWN0aW9uIGlzIGRpc3RpbmN0IGZyb20gYW4gdW5rbm93biBwYWlkIHN1Ym1pc3Npb24gb3V0Y29tZS4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuLyoqIEFuIGFjY2VwdGVkIGdlbmVyYXRpb24gZGlkIG5vdCBwcm9kdWNlIHVzYWJsZSBvdXRwdXQ7IGRvIG5vdCBhdXRvbWF0aWNhbGx5IHJlc3VibWl0IGl0LiAqL1xuZXhwb3J0IGNsYXNzIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbiJdLCJuYW1lcyI6WyJDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IiLCJFcnJvciIsIkNvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvciJdLCJtYXBwaW5ncyI6IkFBQUEsK0VBQStFLEdBQy9FLE9BQU8sTUFBTUEsdUNBQXVDQztBQUFPO0FBQzNELDRGQUE0RixHQUM1RixPQUFPLE1BQU1DLHVDQUF1Q0Q7QUFBTyJ9
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ContentGenerationConfig, ContentGenerationInput, GeneratedContent } from './contentGeneration.js';
|
|
2
|
+
/** Caller-resolved destination and model. No discovery, alternate endpoints, or retries. */
|
|
3
|
+
export declare const generateOllamaContent: (input: ContentGenerationInput, config: ContentGenerationConfig) => Promise<GeneratedContent>;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { post } from '@nlabs/rip-hunter';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { ContentGenerationRejectedError, ContentGenerationResponseError } from './contentGenerationErrors.js';
|
|
4
|
+
const text = z.string().refine((value)=>Boolean(value.trim()));
|
|
5
|
+
const message = z.object({
|
|
6
|
+
content: text,
|
|
7
|
+
function_call: z.null().optional(),
|
|
8
|
+
refusal: z.union([
|
|
9
|
+
z.null(),
|
|
10
|
+
z.literal('')
|
|
11
|
+
]).optional(),
|
|
12
|
+
role: z.literal('assistant'),
|
|
13
|
+
tool_calls: z.array(z.unknown()).max(0).optional()
|
|
14
|
+
});
|
|
15
|
+
const completed = z.object({
|
|
16
|
+
done: z.literal(true),
|
|
17
|
+
done_reason: z.literal('stop'),
|
|
18
|
+
error: z.never().optional()
|
|
19
|
+
});
|
|
20
|
+
const generated = completed.extend({
|
|
21
|
+
response: text
|
|
22
|
+
});
|
|
23
|
+
const chatted = completed.extend({
|
|
24
|
+
message
|
|
25
|
+
});
|
|
26
|
+
const compatible = z.object({
|
|
27
|
+
choices: z.array(z.object({
|
|
28
|
+
finish_reason: z.literal('stop'),
|
|
29
|
+
message
|
|
30
|
+
})).length(1),
|
|
31
|
+
error: z.never().optional()
|
|
32
|
+
});
|
|
33
|
+
/** Caller-resolved destination and model. No discovery, alternate endpoints, or retries. */ export const generateOllamaContent = async (input, config)=>{
|
|
34
|
+
const target = config.ollama;
|
|
35
|
+
let url;
|
|
36
|
+
try {
|
|
37
|
+
url = new URL(target?.endpoint || '');
|
|
38
|
+
} catch {
|
|
39
|
+
throw new ContentGenerationRejectedError('Ollama requires an explicit HTTP(S) endpoint.');
|
|
40
|
+
}
|
|
41
|
+
if (!target || ![
|
|
42
|
+
'generate',
|
|
43
|
+
'chat',
|
|
44
|
+
'openai-chat'
|
|
45
|
+
].includes(target.protocol) || ![
|
|
46
|
+
'http:',
|
|
47
|
+
'https:'
|
|
48
|
+
].includes(url.protocol) || url.username || url.password || url.search || url.hash || typeof input.model !== 'string' || !input.model.trim()) {
|
|
49
|
+
throw new ContentGenerationRejectedError('Ollama requires a protocol, model, and endpoint without credentials, query, or fragment.');
|
|
50
|
+
}
|
|
51
|
+
const messages = [
|
|
52
|
+
...input.system !== undefined ? [
|
|
53
|
+
{
|
|
54
|
+
content: input.system,
|
|
55
|
+
role: 'system'
|
|
56
|
+
}
|
|
57
|
+
] : [],
|
|
58
|
+
{
|
|
59
|
+
content: input.prompt,
|
|
60
|
+
role: 'user'
|
|
61
|
+
}
|
|
62
|
+
];
|
|
63
|
+
const options = {
|
|
64
|
+
...input.maxTokens !== undefined ? {
|
|
65
|
+
num_predict: input.maxTokens
|
|
66
|
+
} : {},
|
|
67
|
+
...input.temperature !== undefined ? {
|
|
68
|
+
temperature: input.temperature
|
|
69
|
+
} : {},
|
|
70
|
+
...input.topP !== undefined ? {
|
|
71
|
+
top_p: input.topP
|
|
72
|
+
} : {}
|
|
73
|
+
};
|
|
74
|
+
const native = {
|
|
75
|
+
...input.responseFormat?.type === 'json_object' ? {
|
|
76
|
+
format: 'json'
|
|
77
|
+
} : {},
|
|
78
|
+
model: input.model,
|
|
79
|
+
...Object.keys(options).length ? {
|
|
80
|
+
options
|
|
81
|
+
} : {},
|
|
82
|
+
stream: false
|
|
83
|
+
};
|
|
84
|
+
const payload = target.protocol === 'generate' ? {
|
|
85
|
+
...native,
|
|
86
|
+
prompt: input.prompt,
|
|
87
|
+
...input.system !== undefined ? {
|
|
88
|
+
system: input.system
|
|
89
|
+
} : {}
|
|
90
|
+
} : target.protocol === 'chat' ? {
|
|
91
|
+
...native,
|
|
92
|
+
messages
|
|
93
|
+
} : {
|
|
94
|
+
...input.maxTokens !== undefined ? {
|
|
95
|
+
max_tokens: input.maxTokens
|
|
96
|
+
} : {},
|
|
97
|
+
messages,
|
|
98
|
+
model: input.model,
|
|
99
|
+
...input.responseFormat?.type === 'json_object' ? {
|
|
100
|
+
response_format: input.responseFormat
|
|
101
|
+
} : {},
|
|
102
|
+
stream: false,
|
|
103
|
+
...input.temperature !== undefined ? {
|
|
104
|
+
temperature: input.temperature
|
|
105
|
+
} : {},
|
|
106
|
+
...input.topP !== undefined ? {
|
|
107
|
+
top_p: input.topP
|
|
108
|
+
} : {}
|
|
109
|
+
};
|
|
110
|
+
let response;
|
|
111
|
+
try {
|
|
112
|
+
response = await post(url.toString(), payload, {
|
|
113
|
+
cache: false,
|
|
114
|
+
timeout: input.timeoutMs ?? 120000
|
|
115
|
+
});
|
|
116
|
+
} catch {
|
|
117
|
+
throw new ContentGenerationResponseError('Ollama submission outcome is unknown; do not automatically retry.');
|
|
118
|
+
}
|
|
119
|
+
const parsed = (target.protocol === 'generate' ? generated : target.protocol === 'chat' ? chatted : compatible).safeParse(response);
|
|
120
|
+
if (!parsed.success) throw new ContentGenerationResponseError('Ollama response could not be confirmed; do not automatically retry.');
|
|
121
|
+
const result = parsed.data;
|
|
122
|
+
return {
|
|
123
|
+
sources: [],
|
|
124
|
+
text: 'response' in result ? result.response : 'message' in result ? result.message.content : result.choices[0].message.content
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9vbGxhbWFHZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cG9zdH0gZnJvbSAnQG5sYWJzL3JpcC1odW50ZXInO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuaW1wb3J0IHtDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IsIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcn0gZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbkVycm9ycy5qcyc7XG5pbXBvcnQgdHlwZSB7Q29udGVudEdlbmVyYXRpb25Db25maWcsIENvbnRlbnRHZW5lcmF0aW9uSW5wdXQsIEdlbmVyYXRlZENvbnRlbnR9IGZyb20gJy4vY29udGVudEdlbmVyYXRpb24uanMnO1xuXG5jb25zdCB0ZXh0ID0gei5zdHJpbmcoKS5yZWZpbmUoKHZhbHVlKSA9PiBCb29sZWFuKHZhbHVlLnRyaW0oKSkpO1xuY29uc3QgbWVzc2FnZSA9IHoub2JqZWN0KHtcbiAgY29udGVudDogdGV4dCxcbiAgZnVuY3Rpb25fY2FsbDogei5udWxsKCkub3B0aW9uYWwoKSxcbiAgcmVmdXNhbDogei51bmlvbihbei5udWxsKCksIHoubGl0ZXJhbCgnJyldKS5vcHRpb25hbCgpLFxuICByb2xlOiB6LmxpdGVyYWwoJ2Fzc2lzdGFudCcpLFxuICB0b29sX2NhbGxzOiB6LmFycmF5KHoudW5rbm93bigpKS5tYXgoMCkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBjb21wbGV0ZWQgPSB6Lm9iamVjdCh7ZG9uZTogei5saXRlcmFsKHRydWUpLCBkb25lX3JlYXNvbjogei5saXRlcmFsKCdzdG9wJyksIGVycm9yOiB6Lm5ldmVyKCkub3B0aW9uYWwoKX0pO1xuY29uc3QgZ2VuZXJhdGVkID0gY29tcGxldGVkLmV4dGVuZCh7cmVzcG9uc2U6IHRleHR9KTtcbmNvbnN0IGNoYXR0ZWQgPSBjb21wbGV0ZWQuZXh0ZW5kKHttZXNzYWdlfSk7XG5jb25zdCBjb21wYXRpYmxlID0gei5vYmplY3Qoe2Nob2ljZXM6IHouYXJyYXkoei5vYmplY3Qoe2ZpbmlzaF9yZWFzb246IHoubGl0ZXJhbCgnc3RvcCcpLCBtZXNzYWdlfSkpLmxlbmd0aCgxKSwgZXJyb3I6IHoubmV2ZXIoKS5vcHRpb25hbCgpfSk7XG5cbi8qKiBDYWxsZXItcmVzb2x2ZWQgZGVzdGluYXRpb24gYW5kIG1vZGVsLiBObyBkaXNjb3ZlcnksIGFsdGVybmF0ZSBlbmRwb2ludHMsIG9yIHJldHJpZXMuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVPbGxhbWFDb250ZW50ID0gYXN5bmMgKGlucHV0OiBDb250ZW50R2VuZXJhdGlvbklucHV0LCBjb25maWc6IENvbnRlbnRHZW5lcmF0aW9uQ29uZmlnKTogUHJvbWlzZTxHZW5lcmF0ZWRDb250ZW50PiA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IGNvbmZpZy5vbGxhbWE7XG4gIGxldCB1cmw6IFVSTDtcbiAgdHJ5IHtcbiAgICB1cmwgPSBuZXcgVVJMKHRhcmdldD8uZW5kcG9pbnQgfHwgJycpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdPbGxhbWEgcmVxdWlyZXMgYW4gZXhwbGljaXQgSFRUUChTKSBlbmRwb2ludC4nKTtcbiAgfVxuICBpZighdGFyZ2V0IHx8ICFbJ2dlbmVyYXRlJywgJ2NoYXQnLCAnb3BlbmFpLWNoYXQnXS5pbmNsdWRlcyh0YXJnZXQucHJvdG9jb2wpIHx8ICFbJ2h0dHA6JywgJ2h0dHBzOiddLmluY2x1ZGVzKHVybC5wcm90b2NvbCkgfHwgdXJsLnVzZXJuYW1lIHx8IHVybC5wYXNzd29yZCB8fCB1cmwuc2VhcmNoIHx8IHVybC5oYXNoIHx8IHR5cGVvZiBpbnB1dC5tb2RlbCAhPT0gJ3N0cmluZycgfHwgIWlucHV0Lm1vZGVsLnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ09sbGFtYSByZXF1aXJlcyBhIHByb3RvY29sLCBtb2RlbCwgYW5kIGVuZHBvaW50IHdpdGhvdXQgY3JlZGVudGlhbHMsIHF1ZXJ5LCBvciBmcmFnbWVudC4nKTtcbiAgfVxuICBjb25zdCBtZXNzYWdlcyA9IFsuLi4oaW5wdXQuc3lzdGVtICE9PSB1bmRlZmluZWQgPyBbe2NvbnRlbnQ6IGlucHV0LnN5c3RlbSwgcm9sZTogJ3N5c3RlbSd9XSA6IFtdKSwge2NvbnRlbnQ6IGlucHV0LnByb21wdCwgcm9sZTogJ3VzZXInfV07XG4gIGNvbnN0IG9wdGlvbnMgPSB7Li4uKGlucHV0Lm1heFRva2VucyAhPT0gdW5kZWZpbmVkID8ge251bV9wcmVkaWN0OiBpbnB1dC5tYXhUb2tlbnN9IDoge30pLCAuLi4oaW5wdXQudGVtcGVyYXR1cmUgIT09IHVuZGVmaW5lZCA/IHt0ZW1wZXJhdHVyZTogaW5wdXQudGVtcGVyYXR1cmV9IDoge30pLCAuLi4oaW5wdXQudG9wUCAhPT0gdW5kZWZpbmVkID8ge3RvcF9wOiBpbnB1dC50b3BQfSA6IHt9KX07XG4gIGNvbnN0IG5hdGl2ZSA9IHtcbiAgICAuLi4oaW5wdXQucmVzcG9uc2VGb3JtYXQ/LnR5cGUgPT09ICdqc29uX29iamVjdCcgPyB7Zm9ybWF0OiAnanNvbid9IDoge30pLFxuICAgIG1vZGVsOiBpbnB1dC5tb2RlbCxcbiAgICAuLi4oT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID8ge29wdGlvbnN9IDoge30pLFxuICAgIHN0cmVhbTogZmFsc2VcbiAgfTtcbiAgY29uc3QgcGF5bG9hZCA9IHRhcmdldC5wcm90b2NvbCA9PT0gJ2dlbmVyYXRlJ1xuICAgID8gey4uLm5hdGl2ZSwgcHJvbXB0OiBpbnB1dC5wcm9tcHQsIC4uLihpbnB1dC5zeXN0ZW0gIT09IHVuZGVmaW5lZCA/IHtzeXN0ZW06IGlucHV0LnN5c3RlbX0gOiB7fSl9XG4gICAgOiB0YXJnZXQucHJvdG9jb2wgPT09ICdjaGF0JyA/IHsuLi5uYXRpdmUsIG1lc3NhZ2VzfSA6IHtcbiAgICAgIC4uLihpbnB1dC5tYXhUb2tlbnMgIT09IHVuZGVmaW5lZCA/IHttYXhfdG9rZW5zOiBpbnB1dC5tYXhUb2tlbnN9IDoge30pLFxuICAgICAgbWVzc2FnZXMsXG4gICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAuLi4oaW5wdXQucmVzcG9uc2VGb3JtYXQ/LnR5cGUgPT09ICdqc29uX29iamVjdCcgPyB7cmVzcG9uc2VfZm9ybWF0OiBpbnB1dC5yZXNwb25zZUZvcm1hdH0gOiB7fSksXG4gICAgICBzdHJlYW06IGZhbHNlLFxuICAgICAgLi4uKGlucHV0LnRlbXBlcmF0dXJlICE9PSB1bmRlZmluZWQgPyB7dGVtcGVyYXR1cmU6IGlucHV0LnRlbXBlcmF0dXJlfSA6IHt9KSxcbiAgICAgIC4uLihpbnB1dC50b3BQICE9PSB1bmRlZmluZWQgPyB7dG9wX3A6IGlucHV0LnRvcFB9IDoge30pXG4gICAgfTtcbiAgbGV0IHJlc3BvbnNlOiB1bmtub3duO1xuICB0cnkge1xuICAgIHJlc3BvbnNlID0gYXdhaXQgcG9zdCh1cmwudG9TdHJpbmcoKSwgcGF5bG9hZCwge2NhY2hlOiBmYWxzZSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMDAwMH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdPbGxhbWEgc3VibWlzc2lvbiBvdXRjb21lIGlzIHVua25vd247IGRvIG5vdCBhdXRvbWF0aWNhbGx5IHJldHJ5LicpO1xuICB9XG4gIGNvbnN0IHBhcnNlZCA9ICh0YXJnZXQucHJvdG9jb2wgPT09ICdnZW5lcmF0ZScgPyBnZW5lcmF0ZWQgOiB0YXJnZXQucHJvdG9jb2wgPT09ICdjaGF0JyA/IGNoYXR0ZWQgOiBjb21wYXRpYmxlKS5zYWZlUGFyc2UocmVzcG9uc2UpO1xuICBpZighcGFyc2VkLnN1Y2Nlc3MpIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09sbGFtYSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkOyBkbyBub3QgYXV0b21hdGljYWxseSByZXRyeS4nKTtcbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VkLmRhdGE7XG4gIHJldHVybiB7c291cmNlczogW10sIHRleHQ6ICdyZXNwb25zZScgaW4gcmVzdWx0ID8gcmVzdWx0LnJlc3BvbnNlIDogJ21lc3NhZ2UnIGluIHJlc3VsdCA/IHJlc3VsdC5tZXNzYWdlLmNvbnRlbnQgOiByZXN1bHQuY2hvaWNlc1swXSEubWVzc2FnZS5jb250ZW50fTtcbn07XG4iXSwibmFtZXMiOlsicG9zdCIsInoiLCJDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IiLCJDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IiLCJ0ZXh0Iiwic3RyaW5nIiwicmVmaW5lIiwidmFsdWUiLCJCb29sZWFuIiwidHJpbSIsIm1lc3NhZ2UiLCJvYmplY3QiLCJjb250ZW50IiwiZnVuY3Rpb25fY2FsbCIsIm51bGwiLCJvcHRpb25hbCIsInJlZnVzYWwiLCJ1bmlvbiIsImxpdGVyYWwiLCJyb2xlIiwidG9vbF9jYWxscyIsImFycmF5IiwidW5rbm93biIsIm1heCIsImNvbXBsZXRlZCIsImRvbmUiLCJkb25lX3JlYXNvbiIsImVycm9yIiwibmV2ZXIiLCJnZW5lcmF0ZWQiLCJleHRlbmQiLCJyZXNwb25zZSIsImNoYXR0ZWQiLCJjb21wYXRpYmxlIiwiY2hvaWNlcyIsImZpbmlzaF9yZWFzb24iLCJsZW5ndGgiLCJnZW5lcmF0ZU9sbGFtYUNvbnRlbnQiLCJpbnB1dCIsImNvbmZpZyIsInRhcmdldCIsIm9sbGFtYSIsInVybCIsIlVSTCIsImVuZHBvaW50IiwiaW5jbHVkZXMiLCJwcm90b2NvbCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJzZWFyY2giLCJoYXNoIiwibW9kZWwiLCJtZXNzYWdlcyIsInN5c3RlbSIsInVuZGVmaW5lZCIsInByb21wdCIsIm9wdGlvbnMiLCJtYXhUb2tlbnMiLCJudW1fcHJlZGljdCIsInRlbXBlcmF0dXJlIiwidG9wUCIsInRvcF9wIiwibmF0aXZlIiwicmVzcG9uc2VGb3JtYXQiLCJ0eXBlIiwiZm9ybWF0IiwiT2JqZWN0Iiwia2V5cyIsInN0cmVhbSIsInBheWxvYWQiLCJtYXhfdG9rZW5zIiwicmVzcG9uc2VfZm9ybWF0IiwidG9TdHJpbmciLCJjYWNoZSIsInRpbWVvdXQiLCJ0aW1lb3V0TXMiLCJwYXJzZWQiLCJzYWZlUGFyc2UiLCJzdWNjZXNzIiwicmVzdWx0IiwiZGF0YSIsInNvdXJjZXMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLElBQUksUUFBTyxvQkFBb0I7QUFDdkMsU0FBUUMsQ0FBQyxRQUFPLE1BQU07QUFDdEIsU0FBUUMsOEJBQThCLEVBQUVDLDhCQUE4QixRQUFPLCtCQUErQjtBQUc1RyxNQUFNQyxPQUFPSCxFQUFFSSxNQUFNLEdBQUdDLE1BQU0sQ0FBQyxDQUFDQyxRQUFVQyxRQUFRRCxNQUFNRSxJQUFJO0FBQzVELE1BQU1DLFVBQVVULEVBQUVVLE1BQU0sQ0FBQztJQUN2QkMsU0FBU1I7SUFDVFMsZUFBZVosRUFBRWEsSUFBSSxHQUFHQyxRQUFRO0lBQ2hDQyxTQUFTZixFQUFFZ0IsS0FBSyxDQUFDO1FBQUNoQixFQUFFYSxJQUFJO1FBQUliLEVBQUVpQixPQUFPLENBQUM7S0FBSSxFQUFFSCxRQUFRO0lBQ3BESSxNQUFNbEIsRUFBRWlCLE9BQU8sQ0FBQztJQUNoQkUsWUFBWW5CLEVBQUVvQixLQUFLLENBQUNwQixFQUFFcUIsT0FBTyxJQUFJQyxHQUFHLENBQUMsR0FBR1IsUUFBUTtBQUNsRDtBQUNBLE1BQU1TLFlBQVl2QixFQUFFVSxNQUFNLENBQUM7SUFBQ2MsTUFBTXhCLEVBQUVpQixPQUFPLENBQUM7SUFBT1EsYUFBYXpCLEVBQUVpQixPQUFPLENBQUM7SUFBU1MsT0FBTzFCLEVBQUUyQixLQUFLLEdBQUdiLFFBQVE7QUFBRTtBQUM5RyxNQUFNYyxZQUFZTCxVQUFVTSxNQUFNLENBQUM7SUFBQ0MsVUFBVTNCO0FBQUk7QUFDbEQsTUFB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nlabs/reaktor",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.15.0",
|
|
4
4
|
"description": "GraphQL and ArangoDB application platform for typed actions, authentication, billing, media, messaging, and realtime services.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"type": "module",
|