runway-cli 0.8.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,334 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.deployCommand = deployCommand;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const projectDetector_1 = require("../services/projectDetector");
12
+ const buildService_1 = require("../services/buildService");
13
+ const packageService_1 = require("../services/packageService");
14
+ const uploadService_1 = require("../services/uploadService");
15
+ const config_1 = require("../utils/config");
16
+ const logger_1 = require("../utils/logger");
17
+ /**
18
+ * Parse a .env file into a Record
19
+ */
20
+ function parseEnvFile(filePath) {
21
+ const content = fs_1.default.readFileSync(filePath, 'utf-8');
22
+ const vars = {};
23
+ for (const line of content.split('\n')) {
24
+ const trimmed = line.trim();
25
+ // Skip empty lines and comments
26
+ if (!trimmed || trimmed.startsWith('#'))
27
+ continue;
28
+ const eqIndex = trimmed.indexOf('=');
29
+ if (eqIndex > 0) {
30
+ const key = trimmed.slice(0, eqIndex).trim();
31
+ let value = trimmed.slice(eqIndex + 1).trim();
32
+ // Remove surrounding quotes if present
33
+ if ((value.startsWith('"') && value.endsWith('"')) ||
34
+ (value.startsWith("'") && value.endsWith("'"))) {
35
+ value = value.slice(1, -1);
36
+ }
37
+ vars[key] = value;
38
+ }
39
+ }
40
+ return vars;
41
+ }
42
+ /**
43
+ * Prompt user for manual ENV variable entry
44
+ */
45
+ async function promptManualEnvVars() {
46
+ const vars = {};
47
+ logger_1.logger.dim('Enter environment variables (empty name to finish):');
48
+ while (true) {
49
+ const { key } = await inquirer_1.default.prompt([
50
+ {
51
+ type: 'input',
52
+ name: 'key',
53
+ message: 'Variable name:',
54
+ },
55
+ ]);
56
+ if (!key || !key.trim()) {
57
+ break;
58
+ }
59
+ const { value } = await inquirer_1.default.prompt([
60
+ {
61
+ type: 'input',
62
+ name: 'value',
63
+ message: `Value for ${key}:`,
64
+ },
65
+ ]);
66
+ vars[key.toUpperCase().replace(/[^A-Z0-9_]/g, '')] = value;
67
+ }
68
+ return vars;
69
+ }
70
+ async function deployCommand(options) {
71
+ logger_1.logger.header('Runway Deploy');
72
+ // Check configuration
73
+ if (!(0, config_1.isConfigured)()) {
74
+ logger_1.logger.error('CLI not configured. Run "runway init" first.');
75
+ return;
76
+ }
77
+ const config = (0, config_1.getConfig)();
78
+ logger_1.logger.dim(`Server: ${config.serverUrl}`);
79
+ logger_1.logger.blank();
80
+ // Detect project
81
+ const spinner = (0, ora_1.default)('Detecting project...').start();
82
+ let detectedProject;
83
+ try {
84
+ detectedProject = await (0, projectDetector_1.detectProject)();
85
+ spinner.succeed(`Detected: ${detectedProject.type} project (${detectedProject.packageManager})`);
86
+ }
87
+ catch (error) {
88
+ spinner.fail('Failed to detect project');
89
+ logger_1.logger.error(error instanceof Error ? error.message : 'Unknown error');
90
+ return;
91
+ }
92
+ // Determine project name
93
+ let projectName = options.name || detectedProject.name;
94
+ // Interactive mode if name not provided
95
+ if (!options.name) {
96
+ const answers = await inquirer_1.default.prompt([
97
+ {
98
+ type: 'input',
99
+ name: 'name',
100
+ message: 'Project name:',
101
+ default: projectName,
102
+ validate: (input) => {
103
+ if (input.length < 2)
104
+ return 'Name must be at least 2 characters';
105
+ if (!/^[a-zA-Z0-9-_]+$/.test(input))
106
+ return 'Name can only contain letters, numbers, hyphens, and underscores';
107
+ return true;
108
+ },
109
+ },
110
+ ]);
111
+ projectName = answers.name;
112
+ }
113
+ // Determine project type
114
+ const projectType = options.type || detectedProject.type;
115
+ // Determine build mode
116
+ let buildMode;
117
+ if (options.buildServer) {
118
+ buildMode = 'server';
119
+ }
120
+ else if (options.buildLocal) {
121
+ buildMode = 'local';
122
+ }
123
+ else {
124
+ buildMode = config.defaultBuildMode || 'local';
125
+ }
126
+ logger_1.logger.blank();
127
+ logger_1.logger.info(`Project: ${projectName}`);
128
+ logger_1.logger.info(`Type: ${projectType}`);
129
+ logger_1.logger.info(`Build mode: ${buildMode}`);
130
+ if (options.version) {
131
+ logger_1.logger.info(`Version: ${options.version}`);
132
+ }
133
+ logger_1.logger.blank();
134
+ // Confirm deployment
135
+ const { confirm } = await inquirer_1.default.prompt([
136
+ {
137
+ type: 'confirm',
138
+ name: 'confirm',
139
+ message: 'Proceed with deployment?',
140
+ default: true,
141
+ },
142
+ ]);
143
+ if (!confirm) {
144
+ logger_1.logger.warn('Deployment cancelled.');
145
+ return;
146
+ }
147
+ logger_1.logger.blank();
148
+ // ENV source prompt for React/Next local builds
149
+ let envVars = {};
150
+ let envInjected = false;
151
+ let envFilePath = options.envFile;
152
+ if (buildMode === 'local' && (projectType === 'react' || projectType === 'next')) {
153
+ const defaultEnvPath = path_1.default.join(process.cwd(), '.env');
154
+ const hasEnvFile = fs_1.default.existsSync(defaultEnvPath);
155
+ if (!options.skipEnvPrompt && !options.envFile) {
156
+ const envChoices = [
157
+ ...(hasEnvFile ? [{ name: 'Use .env file', value: 'file' }] : []),
158
+ { name: 'Enter variables manually', value: 'manual' },
159
+ { name: 'Skip (ENV will be locked after deploy)', value: 'skip' },
160
+ ];
161
+ const { envSource } = await inquirer_1.default.prompt([
162
+ {
163
+ type: 'list',
164
+ name: 'envSource',
165
+ message: 'Environment variables for build:',
166
+ choices: envChoices,
167
+ default: hasEnvFile ? 'file' : 'skip',
168
+ },
169
+ ]);
170
+ if (envSource === 'file') {
171
+ envFilePath = defaultEnvPath;
172
+ envVars = parseEnvFile(defaultEnvPath);
173
+ envInjected = Object.keys(envVars).length > 0;
174
+ logger_1.logger.success(`Loaded ${Object.keys(envVars).length} variables from .env`);
175
+ }
176
+ else if (envSource === 'manual') {
177
+ envVars = await promptManualEnvVars();
178
+ envInjected = Object.keys(envVars).length > 0;
179
+ if (envInjected) {
180
+ logger_1.logger.success(`Added ${Object.keys(envVars).length} environment variables`);
181
+ }
182
+ }
183
+ else {
184
+ logger_1.logger.warn('Skipping ENV injection - environment variables will be locked after deployment.');
185
+ }
186
+ }
187
+ else if (options.envFile && fs_1.default.existsSync(options.envFile)) {
188
+ envVars = parseEnvFile(options.envFile);
189
+ envInjected = Object.keys(envVars).length > 0;
190
+ logger_1.logger.success(`Loaded ${Object.keys(envVars).length} variables from ${options.envFile}`);
191
+ }
192
+ logger_1.logger.blank();
193
+ }
194
+ // Step 1: Build (for local-build mode)
195
+ let buildOutputDir = detectedProject.buildOutputDir;
196
+ if (buildMode === 'local') {
197
+ logger_1.logger.step(1, 4, 'Building project...');
198
+ const buildResult = await buildService_1.buildService.build({
199
+ projectPath: process.cwd(),
200
+ projectType,
201
+ projectName,
202
+ packageManager: detectedProject.packageManager,
203
+ envFile: envFilePath,
204
+ });
205
+ if (!buildResult.success) {
206
+ logger_1.logger.error(`Build failed: ${buildResult.error}`);
207
+ return;
208
+ }
209
+ buildOutputDir = buildResult.outputDir;
210
+ logger_1.logger.success(`Build completed in ${(buildResult.duration / 1000).toFixed(1)}s`);
211
+ logger_1.logger.blank();
212
+ }
213
+ // Step 2: Package
214
+ const packageStep = buildMode === 'local' ? 2 : 1;
215
+ const totalSteps = buildMode === 'local' ? 4 : 3;
216
+ logger_1.logger.step(packageStep, totalSteps, 'Creating deployment package...');
217
+ let packageResult;
218
+ try {
219
+ packageResult = await packageService_1.packageService.package({
220
+ projectPath: process.cwd(),
221
+ projectType,
222
+ buildOutputDir,
223
+ includeSource: buildMode === 'server',
224
+ });
225
+ }
226
+ catch (error) {
227
+ logger_1.logger.error(`Packaging failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
228
+ return;
229
+ }
230
+ logger_1.logger.blank();
231
+ // Step 3: Analyze & Upload
232
+ logger_1.logger.step(packageStep + 1, totalSteps, 'Analyzing and uploading to server...');
233
+ let uploadService;
234
+ try {
235
+ uploadService = (0, uploadService_1.createUploadService)();
236
+ }
237
+ catch (error) {
238
+ logger_1.logger.error(error instanceof Error ? error.message : 'Unknown error');
239
+ packageService_1.packageService.cleanup(packageResult.zipPath);
240
+ return;
241
+ }
242
+ // Analyze package first (for server-build mode to get warnings)
243
+ let confirmServerBuild = false;
244
+ if (buildMode === 'server') {
245
+ const analyzeResult = await uploadService.analyzePackage(packageResult.zipPath, projectType);
246
+ if (analyzeResult.success && analyzeResult.analysis) {
247
+ const analysis = analyzeResult.analysis;
248
+ // Display warnings
249
+ if (analysis.warnings && analysis.warnings.length > 0) {
250
+ logger_1.logger.blank();
251
+ logger_1.logger.warn('Server Analysis:');
252
+ for (const warning of analysis.warnings) {
253
+ const prefix = warning.level === 'critical' ? '❌' : warning.level === 'warning' ? '⚠️' : 'ℹ️';
254
+ logger_1.logger.dim(` ${prefix} ${warning.message}`);
255
+ }
256
+ logger_1.logger.blank();
257
+ }
258
+ // Handle confirmation for server-side build
259
+ if (analysis.requiresConfirmation) {
260
+ const { confirmBuild } = await inquirer_1.default.prompt([
261
+ {
262
+ type: 'confirm',
263
+ name: 'confirmBuild',
264
+ message: `${analysis.confirmationReason || 'Server-side build required'}. This may consume significant resources. Continue?`,
265
+ default: true,
266
+ },
267
+ ]);
268
+ if (!confirmBuild) {
269
+ logger_1.logger.warn('Deployment cancelled by user.');
270
+ packageService_1.packageService.cleanup(packageResult.zipPath);
271
+ return;
272
+ }
273
+ confirmServerBuild = true;
274
+ }
275
+ }
276
+ }
277
+ const uploadResult = await uploadService.upload({
278
+ zipPath: packageResult.zipPath,
279
+ projectName,
280
+ projectType,
281
+ version: options.version,
282
+ buildMode,
283
+ confirmServerBuild,
284
+ // ENV mutability tracking
285
+ deploymentSource: 'cli',
286
+ envInjected,
287
+ });
288
+ // Cleanup zip file
289
+ packageService_1.packageService.cleanup(packageResult.zipPath);
290
+ if (!uploadResult.success) {
291
+ logger_1.logger.error(`Upload failed: ${uploadResult.error}`);
292
+ return;
293
+ }
294
+ logger_1.logger.success('Upload complete');
295
+ logger_1.logger.blank();
296
+ // Step 4: Wait for deployment (if deployment ID available)
297
+ if (uploadResult.deploymentId) {
298
+ logger_1.logger.step(packageStep + 2, totalSteps, 'Waiting for deployment to complete...');
299
+ try {
300
+ const finalStatus = await uploadService.pollDeploymentStatus(uploadResult.deploymentId, (status) => {
301
+ if (status.progress !== undefined) {
302
+ process.stdout.write(`\r Progress: ${status.progress}%`);
303
+ }
304
+ });
305
+ process.stdout.write('\n');
306
+ if (finalStatus.status === 'success') {
307
+ logger_1.logger.blank();
308
+ logger_1.logger.success('Deployment successful!');
309
+ const safeName = projectName.toLowerCase().replace(/[^a-z0-9]/g, '-');
310
+ logger_1.logger.blank();
311
+ logger_1.logger.info(`Your app is available at: ${config.serverUrl}/app/${safeName}`);
312
+ }
313
+ else {
314
+ logger_1.logger.error(`Deployment failed: ${finalStatus.error || 'Unknown error'}`);
315
+ if (finalStatus.logs) {
316
+ logger_1.logger.blank();
317
+ logger_1.logger.dim('Logs:');
318
+ console.log(finalStatus.logs);
319
+ }
320
+ }
321
+ }
322
+ catch (error) {
323
+ logger_1.logger.warn('Could not track deployment status');
324
+ logger_1.logger.dim('Check the web UI for deployment status');
325
+ }
326
+ }
327
+ else {
328
+ logger_1.logger.blank();
329
+ logger_1.logger.success('Upload successful!');
330
+ logger_1.logger.dim('Deployment is being processed. Check the web UI for status.');
331
+ }
332
+ logger_1.logger.blank();
333
+ }
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2RlcGxveS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXFGQSxzQ0F5U0M7QUE5WEQsd0RBQWdDO0FBQ2hDLDhDQUFzQjtBQUN0Qiw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBRXhCLGlFQUE0RDtBQUM1RCwyREFBd0Q7QUFDeEQsK0RBQTREO0FBQzVELDZEQUFnRTtBQUNoRSw0Q0FBMEQ7QUFDMUQsNENBQXlDO0FBWXpDOztHQUVHO0FBQ0gsU0FBUyxZQUFZLENBQUMsUUFBZ0I7SUFDcEMsTUFBTSxPQUFPLEdBQUcsWUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkQsTUFBTSxJQUFJLEdBQTJCLEVBQUUsQ0FBQztJQUV4QyxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFBRSxTQUFTO1FBRWxELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0MsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUMsdUNBQXVDO1lBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FB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QUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdEUsZUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLGVBQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLE1BQU0sQ0FBQyxTQUFTLFFBQVEsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUMvRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sZUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsV0FBVyxDQUFDLEtBQUssSUFBSSxlQUFlLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDckIsZUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNmLGVBQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsZUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQ2pELGVBQU0sQ0FBQyxHQUFHLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUN2RCxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixlQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZixlQUFNLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDckMsZUFBTSxDQUFDLEdBQUcsQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxlQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbnF1aXJlciBmcm9tICdpbnF1aXJlcic7XG5pbXBvcnQgb3JhIGZyb20gJ29yYSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBQcm9qZWN0VHlwZSwgQnVpbGRNb2RlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZGV0ZWN0UHJvamVjdCB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2plY3REZXRlY3Rvcic7XG5pbXBvcnQgeyBidWlsZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9idWlsZFNlcnZpY2UnO1xuaW1wb3J0IHsgcGFja2FnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wYWNrYWdlU2VydmljZSc7XG5pbXBvcnQgeyBjcmVhdGVVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdXBsb2FkU2VydmljZSc7XG5pbXBvcnQgeyBpc0NvbmZpZ3VyZWQsIGdldENvbmZpZyB9IGZyb20gJy4uL3V0aWxzL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXInO1xuXG5pbnRlcmZhY2UgRGVwbG95T3B0aW9ucyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHR5cGU/OiBQcm9qZWN0VHlwZTtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgYnVpbGRMb2NhbD86IGJvb2xlYW47XG4gIGJ1aWxkU2VydmVyPzogYm9vbGVhbjtcbiAgZW52RmlsZT86IHN0cmluZztcbiAgc2tpcEVudlByb21wdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyc2UgYSAuZW52IGZpbGUgaW50byBhIFJlY29yZFxuICovXG5mdW5jdGlvbiBwYXJzZUVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgdmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAvLyBTa2lwIGVtcHR5IGxpbmVzIGFuZCBjb21tZW50c1xuICAgIGlmICghdHJpbW1lZCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoJyMnKSkgY29udGludWU7XG5cbiAgICBjb25zdCBlcUluZGV4ID0gdHJpbW1lZC5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKGVxSW5kZXggPiAwKSB7XG4gICAgICBjb25zdCBrZXkgPSB0cmltbWVkLnNsaWNlKDAsIGVxSW5kZXgpLnRyaW0oKTtcbiAgICAgIGxldCB2YWx1ZSA9IHRyaW1tZWQuc2xpY2UoZXFJbmRleCArIDEpLnRyaW0oKTtcbiAgICAgIC8vIFJlbW92ZSBzdXJyb3VuZGluZyBxdW90ZXMgaWYgcHJlc2VudFxuICAgICAgaWYgKCh2YWx1ZS5zdGFydHNXaXRoKCdcIicpICYmIHZhbHVlLmVuZHNXaXRoKCdcIicpKSB8fFxuICAgICAgICAgICh2YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIidcIikpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgICAgfVxuICAgICAgdmFyc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhcnM7XG59XG5cbi8qKlxuICogUHJvbXB0IHVzZXIgZm9yIG1hbnVhbCBFTlYgdmFyaWFibGUgZW50cnlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvbXB0TWFudWFsRW52VmFycygpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGxvZ2dlci5kaW0oJ0VudGVyIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZW1wdHkgbmFtZSB0byBmaW5pc2gpOicpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgeyBrZXkgfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIG5hbWU6ICdrZXknLFxuICAgICAgICBtZXNzYWdlOiAnVmFyaWFibGUgbmFtZTonLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIGlmICgha2V5IHx8ICFrZXkudHJpbSgpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCB7IHZhbHVlIH0gPSBhd2FpdCBpbnF1aXJlci5wcm9tcHQoW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgICBtZXNzYWdlOiBgVmFsdWUgZm9yICR7a2V5fTpgLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIHZhcnNba2V5LnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvW15BLVowLTlfXS9nLCAnJyldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFycztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcGxveUNvbW1hbmQob3B0aW9uczogRGVwbG95T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2dnZXIuaGVhZGVyKCdSdW53YXkgRGVwbG95Jyk7XG5cbiAgLy8gQ2hlY2sgY29uZmlndXJhdGlvblxuICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdDTEkgbm90IGNvbmZpZ3VyZWQuIFJ1biBcInJ1bndheSBpbml0XCIgZmlyc3QuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4gIGxvZ2dlci5kaW0oYFNlcnZlcjogJHtjb25maWcuc2VydmVyVXJsfWApO1xuICBsb2dnZXIuYmxhbmsoKTtcblxuICAvLyBEZXRlY3QgcHJvamVjdFxuICBjb25zdCBzcGlubmVyID0gb3JhKCdEZXRlY3RpbmcgcHJvamVjdC4uLicpLnN0YXJ0KCk7XG4gIGxldCBkZXRlY3RlZFByb2plY3Q7XG5cbiAgdHJ5IHtcbiAgICBkZXRlY3RlZFByb2plY3QgPSBhd2FpdCBkZXRlY3RQcm9qZWN0KCk7XG4gICAgc3Bpbm5lci5zdWNjZWVkKGBEZXRlY3RlZDogJHtkZXRlY3RlZFByb2plY3QudHlwZX0gcHJvamVjdCAoJHtkZXRlY3RlZFByb2plY3QucGFja2FnZU1hbmFnZXJ9KWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIGRldGVjdCBwcm9qZWN0Jyk7XG4gICAgbG9nZ2VyLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZXRlcm1pbmUgcHJvamVjdCBuYW1lXG4gIGxldCBwcm9qZWN0TmFtZSA9IG9wdGlvbnMubmFtZSB8fCBkZXRlY3RlZFByb2plY3QubmFtZTtcblxuICAvLyBJbnRlcmFjdGl2ZSBtb2RlIGlmIG5hbWUgbm90IHByb3ZpZGVkXG4gIGlmICghb3B0aW9ucy5uYW1lKSB7XG4gICAgY29uc3QgYW5zd2VycyA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgICAgbWVzc2FnZTogJ1Byb2plY3QgbmFtZTonLFxuICAgICAgICBkZWZhdWx0OiBwcm9qZWN0TmFtZSxcbiAgICAgICAgdmFsaWRhdGU6IChpbnB1dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA8IDIpIHJldHVybiAnTmFtZSBtdXN0IGJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyc7XG4gICAgICAgICAgaWYgKCEvXlthLXpBLVowLTktX10rJC8udGVzdChpbnB1dCkpIHJldHVybiAnTmFtZSBjYW4gb25seSBjb250YWluIGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlcyc7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHByb2plY3ROYW1lID0gYW5zd2Vycy5uYW1lO1xuICB9XG5cbiAgLy8gRGV0ZXJtaW5lIHByb2plY3QgdHlwZVxuICBjb25zdCBwcm9qZWN0VHlwZSA9IG9wdGlvbnMudHlwZSB8fCBkZXRlY3RlZFByb2plY3QudHlwZTtcblxuICAvLyBEZXRlcm1pbmUgYnVpbGQgbW9kZVxuICBsZXQgYnVpbGRNb2RlOiBCdWlsZE1vZGU7XG4gIGlmIChvcHRpb25zLmJ1aWxkU2VydmVyKSB7XG4gICAgYnVpbGRNb2RlID0gJ3NlcnZlcic7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5idWlsZExvY2FsKSB7XG4gICAgYnVpbGRNb2RlID0gJ2xvY2FsJztcbiAgfSBlbHNlIHtcbiAgICBidWlsZE1vZGUgPSBjb25maWcuZGVmYXVsdEJ1aWxkTW9kZSB8fCAnbG9jYWwnO1xuICB9XG5cbiAgbG9nZ2VyLmJsYW5rKCk7XG4gIGxvZ2dlci5pbmZvKGBQcm9qZWN0OiAke3Byb2plY3ROYW1lfWApO1xuICBsb2dnZXIuaW5mbyhgVHlwZTogJHtwcm9qZWN0VHlwZX1gKTtcbiAgbG9nZ2VyLmluZm8oYEJ1aWxkIG1vZGU6ICR7YnVpbGRNb2RlfWApO1xuICBpZiAob3B0aW9ucy52ZXJzaW9uKSB7XG4gICAgbG9nZ2VyLmluZm8oYFZlcnNpb246ICR7b3B0aW9ucy52ZXJzaW9ufWApO1xuICB9XG4gIGxvZ2dlci5ibGFuaygpO1xuXG4gIC8vIENvbmZpcm0gZGVwbG95bWVudFxuICBjb25zdCB7IGNvbmZpcm0gfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAge1xuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxuICAgICAgbmFtZTogJ2NvbmZpcm0nLFxuICAgICAgbWVzc2FnZTogJ1Byb2NlZWQgd2l0aCBkZXBsb3ltZW50PycsXG4gICAgICBkZWZhdWx0OiB0cnVlLFxuICAgIH0sXG4gIF0pO1xuXG4gIGlmICghY29uZmlybSkge1xuICAgIGxvZ2dlci53YXJuKCdEZXBsb3ltZW50IGNhbmNlbGxlZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2dnZXIuYmxhbmsoKTtcblxuICAvLyBFTlYgc291cmNlIHByb21wdCBmb3IgUmVhY3QvTmV4dCBsb2NhbCBidWlsZHNcbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgbGV0IGVudkluamVjdGVkID0gZmFsc2U7XG4gIGxldCBlbnZGaWxlUGF0aCA9IG9wdGlvbnMuZW52RmlsZTtcblxuICBpZiAoYnVpbGRNb2RlID09PSAnbG9jYWwnICYmIChwcm9qZWN0VHlwZSA9PT0gJ3JlYWN0JyB8fCBwcm9qZWN0VHlwZSA9PT0gJ25leHQnKSkge1xuICAgIGNvbnN0IGRlZmF1bHRFbnZQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuZW52Jyk7XG4gICAgY29uc3QgaGFzRW52RmlsZSA9IGZzLmV4aXN0c1N5bmMoZGVmYXVsdEVudlBhdGgpO1xuXG4gICAgaWYgKCFvcHRpb25zLnNraXBFbnZQcm9tcHQgJiYgIW9wdGlvbnMuZW52RmlsZSkge1xuICAgICAgY29uc3QgZW52Q2hvaWNlcyA9IFtcbiAgICAgICAgLi4uKGhhc0VudkZpbGUgPyBbeyBuYW1lOiAnVXNlIC5lbnYgZmlsZScsIHZhbHVlOiAnZmlsZScgfV0gOiBbXSksXG4gICAgICAgIHsgbmFtZTogJ0VudGVyIHZhcmlhYmxlcyBtYW51YWxseScsIHZhbHVlOiAnbWFudWFsJyB9LFxuICAgICAgICB7IG5hbWU6ICdTa2lwIChFTlYgd2lsbCBiZSBsb2NrZWQgYWZ0ZXIgZGVwbG95KScsIHZhbHVlOiAnc2tpcCcgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgZW52U291cmNlIH0gPSBhd2FpdCBpbnF1aXJlci5wcm9tcHQoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICAgIG5hbWU6ICdlbnZTb3VyY2UnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGJ1aWxkOicsXG4gICAgICAgICAgY2hvaWNlczogZW52Q2hvaWNlcyxcbiAgICAgICAgICBkZWZhdWx0OiBoYXNFbnZGaWxlID8gJ2ZpbGUnIDogJ3NraXAnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICAgIGlmIChlbnZTb3VyY2UgPT09ICdmaWxlJykge1xuICAgICAgICBlbnZGaWxlUGF0aCA9IGRlZmF1bHRFbnZQYXRoO1xuICAgICAgICBlbnZWYXJzID0gcGFyc2VFbnZGaWxlKGRlZmF1bHRFbnZQYXRoKTtcbiAgICAgICAgZW52SW5qZWN0ZWQgPSBPYmplY3Qua2V5cyhlbnZWYXJzKS5sZW5ndGggPiAwO1xuICAgICAgICBsb2dnZXIuc3VjY2VzcyhgTG9hZGVkICR7T2JqZWN0LmtleXMoZW52VmFycykubGVuZ3RofSB2YXJpYWJsZXMgZnJvbSAuZW52YCk7XG4gICAgICB9IGVsc2UgaWYgKGVudlNvdXJjZSA9PT0gJ21hbnVhbCcpIHtcbiAgICAgICAgZW52VmFycyA9IGF3YWl0IHByb21wdE1hbnVhbEVudlZhcnMoKTtcbiAgICAgICAgZW52SW5qZWN0ZWQgPSBPYmplY3Qua2V5cyhlbnZWYXJzKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoZW52SW5qZWN0ZWQpIHtcbiAgICAgICAgICBsb2dnZXIuc3VjY2VzcyhgQWRkZWQgJHtPYmplY3Qua2V5cyhlbnZWYXJzKS5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlc2ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybignU2tpcHBpbmcgRU5WIGluamVjdGlvbiAtIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aWxsIGJlIGxvY2tlZCBhZnRlciBkZXBsb3ltZW50LicpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5lbnZGaWxlICYmIGZzLmV4aXN0c1N5bmMob3B0aW9ucy5lbnZGaWxlKSkge1xuICAgICAgZW52VmFycyA9IHBhcnNlRW52RmlsZShvcHRpb25zLmVudkZpbGUpO1xuICAgICAgZW52SW5qZWN0ZWQgPSBPYmplY3Qua2V5cyhlbnZWYXJzKS5sZW5ndGggPiAwO1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYExvYWRlZCAke09iamVjdC5rZXlzKGVudlZhcnMpLmxlbmd0aH0gdmFyaWFibGVzIGZyb20gJHtvcHRpb25zLmVudkZpbGV9YCk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmJsYW5rKCk7XG4gIH1cblxuICAvLyBTdGVwIDE6IEJ1aWxkIChmb3IgbG9jYWwtYnVpbGQgbW9kZSlcbiAgbGV0IGJ1aWxkT3V0cHV0RGlyID0gZGV0ZWN0ZWRQcm9qZWN0LmJ1aWxkT3V0cHV0RGlyO1xuXG4gIGlmIChidWlsZE1vZGUgPT09ICdsb2NhbCcpIHtcbiAgICBsb2dnZXIuc3RlcCgxLCA0LCAnQnVpbGRpbmcgcHJvamVjdC4uLicpO1xuXG4gICAgY29uc3QgYnVpbGRSZXN1bHQgPSBhd2FpdCBidWlsZFNlcnZpY2UuYnVpbGQoe1xuICAgICAgcHJvamVjdFBhdGg6IHByb2Nlc3MuY3dkKCksXG4gICAgICBwcm9qZWN0VHlwZSxcbiAgICAgIHByb2plY3ROYW1lLFxuICAgICAgcGFja2FnZU1hbmFnZXI6IGRldGVjdGVkUHJvamVjdC5wYWNrYWdlTWFuYWdlcixcbiAgICAgIGVudkZpbGU6IGVudkZpbGVQYXRoLFxuICAgIH0pO1xuXG4gICAgaWYgKCFidWlsZFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEJ1aWxkIGZhaWxlZDogJHtidWlsZFJlc3VsdC5lcnJvcn1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBidWlsZE91dHB1dERpciA9IGJ1aWxkUmVzdWx0Lm91dHB1dERpcjtcbiAgICBsb2dnZXIuc3VjY2VzcyhgQnVpbGQgY29tcGxldGVkIGluICR7KGJ1aWxkUmVzdWx0LmR1cmF0aW9uIC8gMTAwMCkudG9GaXhlZCgxKX1zYCk7XG4gICAgbG9nZ2VyLmJsYW5rKCk7XG4gIH1cblxuICAvLyBTdGVwIDI6IFBhY2thZ2VcbiAgY29uc3QgcGFja2FnZVN0ZXAgPSBidWlsZE1vZGUgPT09ICdsb2NhbCcgPyAyIDogMTtcbiAgY29uc3QgdG90YWxTdGVwcyA9IGJ1aWxkTW9kZSA9PT0gJ2xvY2FsJyA/IDQgOiAzO1xuXG4gIGxvZ2dlci5zdGVwKHBhY2thZ2VTdGVwLCB0b3RhbFN0ZXBzLCAnQ3JlYXRpbmcgZGVwbG95bWVudCBwYWNrYWdlLi4uJyk7XG5cbiAgbGV0IHBhY2thZ2VSZXN1bHQ7XG4gIHRyeSB7XG4gICAgcGFja2FnZVJlc3VsdCA9IGF3YWl0IHBhY2thZ2VTZXJ2aWNlLnBhY2thZ2Uoe1xuICAgICAgcHJvamVjdFBhdGg6IHByb2Nlc3MuY3dkKCksXG4gICAgICBwcm9qZWN0VHlwZSxcbiAgICAgIGJ1aWxkT3V0cHV0RGlyLFxuICAgICAgaW5jbHVkZVNvdXJjZTogYnVpbGRNb2RlID09PSAnc2VydmVyJyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoYFBhY2thZ2luZyBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nZ2VyLmJsYW5rKCk7XG5cbiAgLy8gU3RlcCAzOiBBbmFseXplICYgVXBsb2FkXG4gIGxvZ2dlci5zdGVwKHBhY2thZ2VTdGVwICsgMSwgdG90YWxTdGVwcywgJ0FuYWx5emluZyBhbmQgdXBsb2FkaW5nIHRvIHNlcnZlci4uLicpO1xuXG4gIGxldCB1cGxvYWRTZXJ2aWNlO1xuICB0cnkge1xuICAgIHVwbG9hZFNlcnZpY2UgPSBjcmVhdGVVcGxvYWRTZXJ2aWNlKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICBwYWNrYWdlU2VydmljZS5jbGVhbnVwKHBhY2thZ2VSZXN1bHQuemlwUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQW5hbHl6ZSBwYWNrYWdlIGZpcnN0IChmb3Igc2VydmVyLWJ1aWxkIG1vZGUgdG8gZ2V0IHdhcm5pbmdzKVxuICBsZXQgY29uZmlybVNlcnZlckJ1aWxkID0gZmFsc2U7XG4gIGlmIChidWlsZE1vZGUgPT09ICdzZXJ2ZXInKSB7XG4gICAgY29uc3QgYW5hbHl6ZVJlc3VsdCA9IGF3YWl0IHVwbG9hZFNlcnZpY2UuYW5hbHl6ZVBhY2thZ2UocGFja2FnZVJlc3VsdC56aXBQYXRoLCBwcm9qZWN0VHlwZSk7XG5cbiAgICBpZiAoYW5hbHl6ZVJlc3VsdC5zdWNjZXNzICYmIGFuYWx5emVSZXN1bHQuYW5hbHlzaXMpIHtcbiAgICAgIGNvbnN0IGFuYWx5c2lzID0gYW5hbHl6ZVJlc3VsdC5hbmFseXNpcztcblxuICAgICAgLy8gRGlzcGxheSB3YXJuaW5nc1xuICAgICAgaWYgKGFuYWx5c2lzLndhcm5pbmdzICYmIGFuYWx5c2lzLndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmJsYW5rKCk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTZXJ2ZXIgQW5hbHlzaXM6Jyk7XG4gICAgICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiBhbmFseXNpcy53YXJuaW5ncykge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHdhcm5pbmcubGV2ZWwgPT09ICdjcml0aWNhbCcgPyAn4p2MJyA6IHdhcm5pbmcubGV2ZWwgPT09ICd3YXJuaW5nJyA/ICfimqDvuI8nIDogJ+KEue+4jyc7XG4gICAgICAgICAgbG9nZ2VyLmRpbShgICAke3ByZWZpeH0gJHt3YXJuaW5nLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmJsYW5rKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBjb25maXJtYXRpb24gZm9yIHNlcnZlci1zaWRlIGJ1aWxkXG4gICAgICBpZiAoYW5hbHlzaXMucmVxdWlyZXNDb25maXJtYXRpb24pIHtcbiAgICAgICAgY29uc3QgeyBjb25maXJtQnVpbGQgfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2NvbmZpcm0nLFxuICAgICAgICAgICAgbmFtZTogJ2NvbmZpcm1CdWlsZCcsXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHthbmFseXNpcy5jb25maXJtYXRpb25SZWFzb24gfHwgJ1NlcnZlci1zaWRlIGJ1aWxkIHJlcXVpcmVkJ30uIFRoaXMgbWF5IGNvbnN1bWUgc2lnbmlmaWNhbnQgcmVzb3VyY2VzLiBDb250aW51ZT9gLFxuICAgICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoIWNvbmZpcm1CdWlsZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdEZXBsb3ltZW50IGNhbmNlbGxlZCBieSB1c2VyLicpO1xuICAgICAgICAgIHBhY2thZ2VTZXJ2aWNlLmNsZWFudXAocGFja2FnZVJlc3VsdC56aXBQYXRoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlybVNlcnZlckJ1aWxkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB1cGxvYWRSZXN1bHQgPSBhd2FpdCB1cGxvYWRTZXJ2aWNlLnVwbG9hZCh7XG4gICAgemlwUGF0aDogcGFja2FnZVJlc3VsdC56aXBQYXRoLFxuICAgIHByb2plY3ROYW1lLFxuICAgIHByb2plY3RUeXBlLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICBidWlsZE1vZGUsXG4gICAgY29uZmlybVNlcnZlckJ1aWxkLFxuICAgIC8vIEVOViBtdXRhYmlsaXR5IHRyYWNraW5nXG4gICAgZGVwbG95bWVudFNvdXJjZTogJ2NsaScsXG4gICAgZW52SW5qZWN0ZWQsXG4gIH0pO1xuXG4gIC8vIENsZWFudXAgemlwIGZpbGVcbiAgcGFja2FnZVNlcnZpY2UuY2xlYW51cChwYWNrYWdlUmVzdWx0LnppcFBhdGgpO1xuXG4gIGlmICghdXBsb2FkUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICBsb2dnZXIuZXJyb3IoYFVwbG9hZCBmYWlsZWQ6ICR7dXBsb2FkUmVzdWx0LmVycm9yfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZ2dlci5zdWNjZXNzKCdVcGxvYWQgY29tcGxldGUnKTtcbiAgbG9nZ2VyLmJsYW5rKCk7XG5cbiAgLy8gU3RlcCA0OiBXYWl0IGZvciBkZXBsb3ltZW50IChpZiBkZXBsb3ltZW50IElEIGF2YWlsYWJsZSlcbiAgaWYgKHVwbG9hZFJlc3VsdC5kZXBsb3ltZW50SWQpIHtcbiAgICBsb2dnZXIuc3RlcChwYWNrYWdlU3RlcCArIDIsIHRvdGFsU3RlcHMsICdXYWl0aW5nIGZvciBkZXBsb3ltZW50IHRvIGNvbXBsZXRlLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmluYWxTdGF0dXMgPSBhd2FpdCB1cGxvYWRTZXJ2aWNlLnBvbGxEZXBsb3ltZW50U3RhdHVzKFxuICAgICAgICB1cGxvYWRSZXN1bHQuZGVwbG95bWVudElkLFxuICAgICAgICAoc3RhdHVzKSA9PiB7XG4gICAgICAgICAgaWYgKHN0YXR1cy5wcm9ncmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgXFxyICBQcm9ncmVzczogJHtzdGF0dXMucHJvZ3Jlc3N9JWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuXG4gICAgICBpZiAoZmluYWxTdGF0dXMuc3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgbG9nZ2VyLmJsYW5rKCk7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKCdEZXBsb3ltZW50IHN1Y2Nlc3NmdWwhJyk7XG5cbiAgICAgICAgY29uc3Qgc2FmZU5hbWUgPSBwcm9qZWN0TmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XS9nLCAnLScpO1xuICAgICAgICBsb2dnZXIuYmxhbmsoKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFlvdXIgYXBwIGlzIGF2YWlsYWJsZSBhdDogJHtjb25maWcuc2VydmVyVXJsfS9hcHAvJHtzYWZlTmFtZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRGVwbG95bWVudCBmYWlsZWQ6ICR7ZmluYWxTdGF0dXMuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgICBpZiAoZmluYWxTdGF0dXMubG9ncykge1xuICAgICAgICAgIGxvZ2dlci5ibGFuaygpO1xuICAgICAgICAgIGxvZ2dlci5kaW0oJ0xvZ3M6Jyk7XG4gICAgICAgICAgY29uc29sZS5sb2coZmluYWxTdGF0dXMubG9ncyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCB0cmFjayBkZXBsb3ltZW50IHN0YXR1cycpO1xuICAgICAgbG9nZ2VyLmRpbSgnQ2hlY2sgdGhlIHdlYiBVSSBmb3IgZGVwbG95bWVudCBzdGF0dXMnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmJsYW5rKCk7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ1VwbG9hZCBzdWNjZXNzZnVsIScpO1xuICAgIGxvZ2dlci5kaW0oJ0RlcGxveW1lbnQgaXMgYmVpbmcgcHJvY2Vzc2VkLiBDaGVjayB0aGUgd2ViIFVJIGZvciBzdGF0dXMuJyk7XG4gIH1cblxuICBsb2dnZXIuYmxhbmsoKTtcbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ interface InitOptions {
2
+ server?: string;
3
+ }
4
+ export declare function initCommand(options: InitOptions): Promise<void>;
5
+ export {};
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.initCommand = initCommand;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const axios_1 = __importDefault(require("axios"));
9
+ const config_1 = require("../utils/config");
10
+ const logger_1 = require("../utils/logger");
11
+ const authService_1 = require("../services/authService");
12
+ async function initCommand(options) {
13
+ logger_1.logger.header('Runway CLI Setup');
14
+ // Check if already configured
15
+ if ((0, config_1.isConfigured)()) {
16
+ const config = (0, config_1.getConfig)();
17
+ logger_1.logger.info(`Currently configured to: ${config.serverUrl}`);
18
+ if (config.securityMode) {
19
+ logger_1.logger.dim(`Security mode: ${config.securityMode === 'domain-https' ? 'HTTPS (secure)' : 'HTTP (limited)'}`);
20
+ }
21
+ const { reconfigure } = await inquirer_1.default.prompt([
22
+ {
23
+ type: 'confirm',
24
+ name: 'reconfigure',
25
+ message: 'Do you want to reconfigure?',
26
+ default: false,
27
+ },
28
+ ]);
29
+ if (!reconfigure) {
30
+ logger_1.logger.info('Configuration unchanged.');
31
+ return;
32
+ }
33
+ }
34
+ // Get server URL
35
+ let serverUrl = options.server;
36
+ if (!serverUrl) {
37
+ const answers = await inquirer_1.default.prompt([
38
+ {
39
+ type: 'input',
40
+ name: 'serverUrl',
41
+ message: 'Enter your Runway server URL:',
42
+ default: 'https://deploy.example.com',
43
+ validate: (input) => {
44
+ try {
45
+ new URL(input);
46
+ return true;
47
+ }
48
+ catch {
49
+ return 'Please enter a valid URL';
50
+ }
51
+ },
52
+ },
53
+ ]);
54
+ serverUrl = answers.serverUrl;
55
+ }
56
+ // Normalize URL
57
+ serverUrl = serverUrl.replace(/\/+$/, '');
58
+ // Test connection
59
+ logger_1.logger.info('Testing connection...');
60
+ try {
61
+ await axios_1.default.get(`${serverUrl}/health`, { timeout: 10000 });
62
+ logger_1.logger.success('Server is reachable');
63
+ }
64
+ catch (error) {
65
+ logger_1.logger.error(`Cannot reach server at ${serverUrl}`);
66
+ logger_1.logger.dim('Make sure the server is running and the URL is correct.');
67
+ return;
68
+ }
69
+ // Initialize auth service
70
+ const authService = new authService_1.AuthService(serverUrl);
71
+ // Check security mode
72
+ logger_1.logger.info('Checking server security mode...');
73
+ let securityInfo;
74
+ try {
75
+ securityInfo = await authService.getSecurityMode();
76
+ }
77
+ catch (error) {
78
+ logger_1.logger.error('Failed to get server security mode');
79
+ logger_1.logger.dim('The server may be running an older version without CLI auth support.');
80
+ logger_1.logger.dim('Falling back to legacy authentication...');
81
+ await legacyAuth(serverUrl);
82
+ return;
83
+ }
84
+ // Display security info
85
+ if (securityInfo.securityMode === 'domain-https') {
86
+ logger_1.logger.success(`Server has HTTPS enabled: ${securityInfo.domain}`);
87
+ logger_1.logger.dim('Authentication will use secure TLS connection.');
88
+ }
89
+ else {
90
+ logger_1.logger.warn('Server is running in HTTP mode (no domain configured)');
91
+ logger_1.logger.dim('Authentication will use RSA key exchange (MITM vulnerable).');
92
+ logger_1.logger.blank();
93
+ const { proceed } = await inquirer_1.default.prompt([
94
+ {
95
+ type: 'confirm',
96
+ name: 'proceed',
97
+ message: 'Continue with RSA authentication?',
98
+ default: true,
99
+ },
100
+ ]);
101
+ if (!proceed) {
102
+ logger_1.logger.blank();
103
+ logger_1.logger.info('To enable secure authentication:');
104
+ logger_1.logger.dim(' 1. Configure a domain on your Runway server');
105
+ logger_1.logger.dim(' 2. Enable HTTPS through the Settings page');
106
+ logger_1.logger.dim(' 3. Run `runway init` again');
107
+ return;
108
+ }
109
+ }
110
+ // Get credentials
111
+ logger_1.logger.blank();
112
+ const credentials = await inquirer_1.default.prompt([
113
+ {
114
+ type: 'input',
115
+ name: 'username',
116
+ message: 'Username:',
117
+ validate: (input) => input.length > 0 || 'Username is required',
118
+ },
119
+ {
120
+ type: 'password',
121
+ name: 'password',
122
+ message: 'Password:',
123
+ validate: (input) => input.length > 0 || 'Password is required',
124
+ },
125
+ ]);
126
+ // Authenticate using the auth service
127
+ logger_1.logger.info('Authenticating...');
128
+ try {
129
+ const authResult = await authService.authenticate(credentials.username, credentials.password);
130
+ // Save configuration with all auth data
131
+ (0, config_1.setServerUrl)(serverUrl);
132
+ (0, config_1.setAuthData)(authResult.token, authResult.expiresAt, authResult.securityMode);
133
+ logger_1.logger.blank();
134
+ logger_1.logger.success('Configuration saved successfully!');
135
+ logger_1.logger.blank();
136
+ logger_1.logger.info('You can now deploy projects with:');
137
+ logger_1.logger.dim(' runway deploy');
138
+ logger_1.logger.blank();
139
+ // Show token expiry warning for HTTP mode
140
+ if (authResult.securityMode === 'ip-http') {
141
+ logger_1.logger.warn('Note: Token expires in 15 minutes due to HTTP mode.');
142
+ logger_1.logger.dim('Run `runway init` to re-authenticate when needed.');
143
+ }
144
+ }
145
+ catch (error) {
146
+ // Error already logged by AuthService
147
+ logger_1.logger.blank();
148
+ logger_1.logger.dim('Check your credentials and try again.');
149
+ }
150
+ }
151
+ /**
152
+ * Legacy authentication for servers without CLI auth support
153
+ */
154
+ async function legacyAuth(serverUrl) {
155
+ const credentials = await inquirer_1.default.prompt([
156
+ {
157
+ type: 'input',
158
+ name: 'username',
159
+ message: 'Username:',
160
+ validate: (input) => input.length > 0 || 'Username is required',
161
+ },
162
+ {
163
+ type: 'password',
164
+ name: 'password',
165
+ message: 'Password:',
166
+ validate: (input) => input.length > 0 || 'Password is required',
167
+ },
168
+ ]);
169
+ logger_1.logger.info('Authenticating...');
170
+ try {
171
+ const response = await axios_1.default.post(`${serverUrl}/api/auth/login`, credentials, { timeout: 10000 });
172
+ if (response.data.success && response.data?.token) {
173
+ // Save configuration (legacy mode without expiry tracking)
174
+ (0, config_1.setServerUrl)(serverUrl);
175
+ (0, config_1.setAuthData)(response.data.token, '', 'ip-http');
176
+ logger_1.logger.blank();
177
+ logger_1.logger.success('Configuration saved successfully!');
178
+ logger_1.logger.blank();
179
+ logger_1.logger.info('You can now deploy projects with:');
180
+ logger_1.logger.dim(' runway deploy');
181
+ logger_1.logger.blank();
182
+ }
183
+ else {
184
+ logger_1.logger.error('Authentication failed: ' + (response.data.error || 'Unknown error'));
185
+ }
186
+ }
187
+ catch (error) {
188
+ if (axios_1.default.isAxiosError(error)) {
189
+ logger_1.logger.error('Authentication failed: ' + (error.response?.data?.error || error.message));
190
+ }
191
+ else {
192
+ logger_1.logger.error('Authentication failed: ' + (error instanceof Error ? error.message : 'Unknown error'));
193
+ }
194
+ }
195
+ }
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9pbml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBVUEsa0NBeUpDO0FBbktELHdEQUFnQztBQUNoQyxrREFBMEI7QUFDMUIsNENBQXFGO0FBQ3JGLDRDQUF5QztBQUN6Qyx5REFBc0Q7QUFNL0MsS0FBSyxVQUFVLFdBQVcsQ0FBQyxPQUFvQjtJQUNwRCxlQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFbEMsOEJBQThCO0lBQzlCLElBQUksSUFBQSxxQkFBWSxHQUFFLEVBQUUsQ0FBQztRQUNuQixNQUFNLE1BQU0sR0FBRyxJQUFBLGtCQUFTLEdBQUUsQ0FBQztRQUMzQixlQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM1RCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixlQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixNQUFNLENBQUMsWUFBWSxLQUFLLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUMvRyxDQUFDO1FBRUQsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sa0JBQVEsQ0FBQyxNQUFNLENBQUM7WUFDNUM7Z0JBQ0UsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLE9BQU8sRUFBRSw2QkFBNkI7Z0JBQ3RDLE9BQU8sRUFBRSxLQUFLO2FBQ2Y7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsZUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ3hDLE9BQU87UUFDVCxDQUFDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBRS9CLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE1BQU0sT0FBTyxHQUFHLE1BQU0sa0JBQVEsQ0FBQyxNQUFNLENBQUM7WUFDcEM7Z0JBQ0UsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLE9BQU8sRUFBRSwrQkFBK0I7Z0JBQ3hDLE9BQU8sRUFBRSw0QkFBNEI7Z0JBQ3JDLFFBQVEsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFO29CQUMxQixJQUFJLENBQUM7d0JBQ0gsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ2YsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztvQkFBQyxNQUFNLENBQUM7d0JBQ1AsT0FBTywwQkFBMEIsQ0FBQztvQkFDcEMsQ0FBQztnQkFDSCxDQUFDO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFDSCxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQW1CLENBQUM7SUFDMUMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixTQUFTLEdBQUcsU0FBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFM0Msa0JBQWtCO0lBQ2xCLGVBQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNyQyxJQUFJLENBQUM7UUFDSCxNQUFNLGVBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNELGVBQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLGVBQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDcEQsZUFBTSxDQUFDLEdBQUcsQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1FBQ3RFLE9BQU87SUFDVCxDQUFDO0lBRUQsMEJBQTBCO0lBQzFCLE1BQU0sV0FBVyxHQUFHLElBQUkseUJBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUUvQyxzQkFBc0I7SUFDdEIsZUFBTSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ2hELElBQUksWUFBWSxDQUFDO0lBQ2pCLElBQUksQ0FBQztRQUNILFlBQVksR0FBRyxNQUFNLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLGVBQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUNuRCxlQUFNLENBQUMsR0FBRyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7UUFDbkYsZUFBTSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVCLE9BQU87SUFDVCxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQUksWUFBWSxDQUFDLFlBQVksS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUNqRCxlQUFNLENBQUMsT0FBTyxDQUFDLDZCQUE2QixZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNuRSxlQUFNLENBQUMsR0FBRyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDL0QsQ0FBQztTQUFNLENBQUM7UUFDTixlQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDckUsZUFBTSxDQUFDLEdBQUcsQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1FBQzFFLGVBQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVmLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLGtCQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3hDO2dCQUNFLElBQUksRUFBRSxTQUFTO2dCQUNmLElBQUksRUFBRSxTQUFTO2dCQUNmLE9BQU8sRUFBRSxtQ0FBbUM7Z0JBQzVDLE9BQU8sRUFBRSxJQUFJO2FBQ2Q7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixlQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixlQUFNLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7WUFDaEQsZUFBTSxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1lBQzVELGVBQU0sQ0FBQyxHQUFHLENBQUMsNkNBQTZDLENBQUMsQ0FBQztZQUMxRCxlQUFNLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFDM0MsT0FBTztRQUNULENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGVBQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLE1BQU0sV0FBVyxHQUFHLE1BQU0sa0JBQVEsQ0FBQyxNQUFNLENBQUM7UUFDeEM7WUFDRSxJQUFJLEVBQUUsT0FBTztZQUNiLElBQUksRUFBRSxVQUFVO1lBQ2hCLE9BQU8sRUFBRSxXQUFXO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksc0JBQXNCO1NBQ3hFO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsV0FBVztZQUNwQixRQUFRLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHNCQUFzQjtTQUN4RTtLQUNGLENBQUMsQ0FBQztJQUVILHNDQUFzQztJQUN0QyxlQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQUcsTUFBTSxXQUFXLENBQUMsWUFBWSxDQUMvQyxXQUFXLENBQUMsUUFBUSxFQUNwQixXQUFXLENBQUMsUUFBUSxDQUNyQixDQUFDO1FBRUYsd0NBQXdDO1FBQ3hDLElBQUEscUJBQVksRUFBQyxTQUFTLENBQUMsQ0FBQztRQUN4QixJQUFBLG9CQUFXLEVBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU3RSxlQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZixlQUFNLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDcEQsZUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsZUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ2pELGVBQU0sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5QixlQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFZiwwQ0FBMEM7UUFDMUMsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLGVBQU0sQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQztZQUNuRSxlQUFNLENBQUMsR0FBRyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2Ysc0NBQXNDO1FBQ3RDLGVBQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLGVBQU0sQ0FBQyxHQUFHLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLFVBQVUsQ0FBQyxTQUFpQjtJQUN6QyxNQUFNLFdBQVcsR0FBRyxNQUFNLGtCQUFRLENBQUMsTUFBTSxDQUFDO1FBQ3hDO1lBQ0UsSUFBSSxFQUFFLE9BQU87WUFDYixJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsV0FBVztZQUNwQixRQUFRLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHNCQUFzQjtTQUN4RTtRQUNEO1lBQ0UsSUFBSSxFQUFFLFVBQVU7WUFDaEIsSUFBSSxFQUFFLFVBQVU7WUFDaEIsT0FBTyxFQUFFLFdBQVc7WUFDcEIsUUFBUSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxzQkFBc0I7U0FDeEU7S0FDRixDQUFDLENBQUM7SUFFSCxlQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFLLENBQUMsSUFBSSxDQUMvQixHQUFHLFNBQVMsaUJBQWlCLEVBQzdCLFdBQVcsRUFDWCxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FDbkIsQ0FBQztRQUVGLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNsRCwyREFBMkQ7WUFDM0QsSUFBQSxxQkFBWSxFQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hCLElBQUEsb0JBQVcsRUFBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFaEQsZUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsZUFBTSxDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQ3BELGVBQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLGVBQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUNqRCxlQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDOUIsZUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ04sZUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDckYsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxlQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsZUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMzRixDQUFDO2FBQU0sQ0FBQztZQUNOLGVBQU0sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEdBQUcsQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbnF1aXJlciBmcm9tICdpbnF1aXJlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgc2V0U2VydmVyVXJsLCBzZXRBdXRoRGF0YSwgZ2V0Q29uZmlnLCBpc0NvbmZpZ3VyZWQgfSBmcm9tICcuLi91dGlscy9jb25maWcnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aFNlcnZpY2UnO1xuXG5pbnRlcmZhY2UgSW5pdE9wdGlvbnMge1xuICBzZXJ2ZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0Q29tbWFuZChvcHRpb25zOiBJbml0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2dnZXIuaGVhZGVyKCdSdW53YXkgQ0xJIFNldHVwJyk7XG5cbiAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBjb25maWd1cmVkXG4gIGlmIChpc0NvbmZpZ3VyZWQoKSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZygpO1xuICAgIGxvZ2dlci5pbmZvKGBDdXJyZW50bHkgY29uZmlndXJlZCB0bzogJHtjb25maWcuc2VydmVyVXJsfWApO1xuICAgIGlmIChjb25maWcuc2VjdXJpdHlNb2RlKSB7XG4gICAgICBsb2dnZXIuZGltKGBTZWN1cml0eSBtb2RlOiAke2NvbmZpZy5zZWN1cml0eU1vZGUgPT09ICdkb21haW4taHR0cHMnID8gJ0hUVFBTIChzZWN1cmUpJyA6ICdIVFRQIChsaW1pdGVkKSd9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyByZWNvbmZpZ3VyZSB9ID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NvbmZpcm0nLFxuICAgICAgICBuYW1lOiAncmVjb25maWd1cmUnLFxuICAgICAgICBtZXNzYWdlOiAnRG8geW91IHdhbnQgdG8gcmVjb25maWd1cmU/JyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICB9LFxuICAgIF0pO1xuXG4gICAgaWYgKCFyZWNvbmZpZ3VyZSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ0NvbmZpZ3VyYXRpb24gdW5jaGFuZ2VkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBzZXJ2ZXIgVVJMXG4gIGxldCBzZXJ2ZXJVcmwgPSBvcHRpb25zLnNlcnZlcjtcblxuICBpZiAoIXNlcnZlclVybCkge1xuICAgIGNvbnN0IGFuc3dlcnMgPSBhd2FpdCBpbnF1aXJlci5wcm9tcHQoW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAnc2VydmVyVXJsJyxcbiAgICAgICAgbWVzc2FnZTogJ0VudGVyIHlvdXIgUnVud2F5IHNlcnZlciBVUkw6JyxcbiAgICAgICAgZGVmYXVsdDogJ2h0dHBzOi8vZGVwbG95LmV4YW1wbGUuY29tJyxcbiAgICAgICAgdmFsaWRhdGU6IChpbnB1dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBVUkwoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTCc7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgICBzZXJ2ZXJVcmwgPSBhbnN3ZXJzLnNlcnZlclVybCBhcyBzdHJpbmc7XG4gIH1cblxuICAvLyBOb3JtYWxpemUgVVJMXG4gIHNlcnZlclVybCA9IHNlcnZlclVybCEucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG5cbiAgLy8gVGVzdCBjb25uZWN0aW9uXG4gIGxvZ2dlci5pbmZvKCdUZXN0aW5nIGNvbm5lY3Rpb24uLi4nKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBheGlvcy5nZXQoYCR7c2VydmVyVXJsfS9oZWFsdGhgLCB7IHRpbWVvdXQ6IDEwMDAwIH0pO1xuICAgIGxvZ2dlci5zdWNjZXNzKCdTZXJ2ZXIgaXMgcmVhY2hhYmxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBDYW5ub3QgcmVhY2ggc2VydmVyIGF0ICR7c2VydmVyVXJsfWApO1xuICAgIGxvZ2dlci5kaW0oJ01ha2Ugc3VyZSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgYW5kIHRoZSBVUkwgaXMgY29ycmVjdC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJbml0aWFsaXplIGF1dGggc2VydmljZVxuICBjb25zdCBhdXRoU2VydmljZSA9IG5ldyBBdXRoU2VydmljZShzZXJ2ZXJVcmwpO1xuXG4gIC8vIENoZWNrIHNlY3VyaXR5IG1vZGVcbiAgbG9nZ2VyLmluZm8oJ0NoZWNraW5nIHNlcnZlciBzZWN1cml0eSBtb2RlLi4uJyk7XG4gIGxldCBzZWN1cml0eUluZm87XG4gIHRyeSB7XG4gICAgc2VjdXJpdHlJbmZvID0gYXdhaXQgYXV0aFNlcnZpY2UuZ2V0U2VjdXJpdHlNb2RlKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZ2V0IHNlcnZlciBzZWN1cml0eSBtb2RlJyk7XG4gICAgbG9nZ2VyLmRpbSgnVGhlIHNlcnZlciBtYXkgYmUgcnVubmluZyBhbiBvbGRlciB2ZXJzaW9uIHdpdGhvdXQgQ0xJIGF1dGggc3VwcG9ydC4nKTtcbiAgICBsb2dnZXIuZGltKCdGYWxsaW5nIGJhY2sgdG8gbGVnYWN5IGF1dGhlbnRpY2F0aW9uLi4uJyk7XG4gICAgYXdhaXQgbGVnYWN5QXV0aChzZXJ2ZXJVcmwpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERpc3BsYXkgc2VjdXJpdHkgaW5mb1xuICBpZiAoc2VjdXJpdHlJbmZvLnNlY3VyaXR5TW9kZSA9PT0gJ2RvbWFpbi1odHRwcycpIHtcbiAgICBsb2dnZXIuc3VjY2VzcyhgU2VydmVyIGhhcyBIVFRQUyBlbmFibGVkOiAke3NlY3VyaXR5SW5mby5kb21haW59YCk7XG4gICAgbG9nZ2VyLmRpbSgnQXV0aGVudGljYXRpb24gd2lsbCB1c2Ugc2VjdXJlIFRMUyBjb25uZWN0aW9uLicpO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci53YXJuKCdTZXJ2ZXIgaXMgcnVubmluZyBpbiBIVFRQIG1vZGUgKG5vIGRvbWFpbiBjb25maWd1cmVkKScpO1xuICAgIGxvZ2dlci5kaW0oJ0F1dGhlbnRpY2F0aW9uIHdpbGwgdXNlIFJTQSBrZXkgZXhjaGFuZ2UgKE1JVE0gdnVsbmVyYWJsZSkuJyk7XG4gICAgbG9nZ2VyLmJsYW5rKCk7XG5cbiAgICBjb25zdCB7IHByb2NlZWQgfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjb25maXJtJyxcbiAgICAgICAgbmFtZTogJ3Byb2NlZWQnLFxuICAgICAgICBtZXNzYWdlOiAnQ29udGludWUgd2l0aCBSU0EgYXV0aGVudGljYXRpb24/JyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICBpZiAoIXByb2NlZWQpIHtcbiAgICAgIGxvZ2dlci5ibGFuaygpO1xuICAgICAgbG9nZ2VyLmluZm8oJ1RvIGVuYWJsZSBzZWN1cmUgYXV0aGVudGljYXRpb246Jyk7XG4gICAgICBsb2dnZXIuZGltKCcgIDEuIENvbmZpZ3VyZSBhIGRvbWFpbiBvbiB5b3VyIFJ1bndheSBzZXJ2ZXInKTtcbiAgICAgIGxvZ2dlci5kaW0oJyAgMi4gRW5hYmxlIEhUVFBTIHRocm91Z2ggdGhlIFNldHRpbmdzIHBhZ2UnKTtcbiAgICAgIGxvZ2dlci5kaW0oJyAgMy4gUnVuIGBydW53YXkgaW5pdGAgYWdhaW4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgY3JlZGVudGlhbHNcbiAgbG9nZ2VyLmJsYW5rKCk7XG4gIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICB7XG4gICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgbmFtZTogJ3VzZXJuYW1lJyxcbiAgICAgIG1lc3NhZ2U6ICdVc2VybmFtZTonLFxuICAgICAgdmFsaWRhdGU6IChpbnB1dDogc3RyaW5nKSA9PiBpbnB1dC5sZW5ndGggPiAwIHx8ICdVc2VybmFtZSBpcyByZXF1aXJlZCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncGFzc3dvcmQnLFxuICAgICAgbmFtZTogJ3Bhc3N3b3JkJyxcbiAgICAgIG1lc3NhZ2U6ICdQYXNzd29yZDonLFxuICAgICAgdmFsaWRhdGU6IChpbnB1dDogc3RyaW5nKSA9PiBpbnB1dC5sZW5ndGggPiAwIHx8ICdQYXNzd29yZCBpcyByZXF1aXJlZCcsXG4gICAgfSxcbiAgXSk7XG5cbiAgLy8gQXV0aGVudGljYXRlIHVzaW5nIHRoZSBhdXRoIHNlcnZpY2VcbiAgbG9nZ2VyLmluZm8oJ0F1dGhlbnRpY2F0aW5nLi4uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgYXV0aFJlc3VsdCA9IGF3YWl0IGF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0ZShcbiAgICAgIGNyZWRlbnRpYWxzLnVzZXJuYW1lLFxuICAgICAgY3JlZGVudGlhbHMucGFzc3dvcmRcbiAgICApO1xuXG4gICAgLy8gU2F2ZSBjb25maWd1cmF0aW9uIHdpdGggYWxsIGF1dGggZGF0YVxuICAgIHNldFNlcnZlclVybChzZXJ2ZXJVcmwpO1xuICAgIHNldEF1dGhEYXRhKGF1dGhSZXN1bHQudG9rZW4sIGF1dGhSZXN1bHQuZXhwaXJlc0F0LCBhdXRoUmVzdWx0LnNlY3VyaXR5TW9kZSk7XG5cbiAgICBsb2dnZXIuYmxhbmsoKTtcbiAgICBsb2dnZXIuc3VjY2VzcygnQ29uZmlndXJhdGlvbiBzYXZlZCBzdWNjZXNzZnVsbHkhJyk7XG4gICAgbG9nZ2VyLmJsYW5rKCk7XG4gICAgbG9nZ2VyLmluZm8oJ1lvdSBjYW4gbm93IGRlcGxveSBwcm9qZWN0cyB3aXRoOicpO1xuICAgIGxvZ2dlci5kaW0oJyAgcnVud2F5IGRlcGxveScpO1xuICAgIGxvZ2dlci5ibGFuaygpO1xuXG4gICAgLy8gU2hvdyB0b2tlbiBleHBpcnkgd2FybmluZyBmb3IgSFRUUCBtb2RlXG4gICAgaWYgKGF1dGhSZXN1bHQuc2VjdXJpdHlNb2RlID09PSAnaXAtaHR0cCcpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdOb3RlOiBUb2tlbiBleHBpcmVzIGluIDE1IG1pbnV0ZXMgZHVlIHRvIEhUVFAgbW9kZS4nKTtcbiAgICAgIGxvZ2dlci5kaW0oJ1J1biBgcnVud2F5IGluaXRgIHRvIHJlLWF1dGhlbnRpY2F0ZSB3aGVuIG5lZWRlZC4nKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgQXV0aFNlcnZpY2VcbiAgICBsb2dnZXIuYmxhbmsoKTtcbiAgICBsb2dnZXIuZGltKCdDaGVjayB5b3VyIGNyZWRlbnRpYWxzIGFuZCB0cnkgYWdhaW4uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBMZWdhY3kgYXV0aGVudGljYXRpb24gZm9yIHNlcnZlcnMgd2l0aG91dCBDTEkgYXV0aCBzdXBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxlZ2FjeUF1dGgoc2VydmVyVXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBpbnF1aXJlci5wcm9tcHQoW1xuICAgIHtcbiAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICBuYW1lOiAndXNlcm5hbWUnLFxuICAgICAgbWVzc2FnZTogJ1VzZXJuYW1lOicsXG4gICAgICB2YWxpZGF0ZTogKGlucHV0OiBzdHJpbmcpID0+IGlucHV0Lmxlbmd0aCA+IDAgfHwgJ1VzZXJuYW1lIGlzIHJlcXVpcmVkJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXG4gICAgICBuYW1lOiAncGFzc3dvcmQnLFxuICAgICAgbWVzc2FnZTogJ1Bhc3N3b3JkOicsXG4gICAgICB2YWxpZGF0ZTogKGlucHV0OiBzdHJpbmcpID0+IGlucHV0Lmxlbmd0aCA+IDAgfHwgJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyxcbiAgICB9LFxuICBdKTtcblxuICBsb2dnZXIuaW5mbygnQXV0aGVudGljYXRpbmcuLi4nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICBgJHtzZXJ2ZXJVcmx9L2FwaS9hdXRoL2xvZ2luYCxcbiAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgeyB0aW1lb3V0OiAxMDAwMCB9XG4gICAgKTtcblxuICAgIGlmIChyZXNwb25zZS5kYXRhLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YT8udG9rZW4pIHtcbiAgICAgIC8vIFNhdmUgY29uZmlndXJhdGlvbiAobGVnYWN5IG1vZGUgd2l0aG91dCBleHBpcnkgdHJhY2tpbmcpXG4gICAgICBzZXRTZXJ2ZXJVcmwoc2VydmVyVXJsKTtcbiAgICAgIHNldEF1dGhEYXRhKHJlc3BvbnNlLmRhdGEudG9rZW4sICcnLCAnaXAtaHR0cCcpO1xuXG4gICAgICBsb2dnZXIuYmxhbmsoKTtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCdDb25maWd1cmF0aW9uIHNhdmVkIHN1Y2Nlc3NmdWxseSEnKTtcbiAgICAgIGxvZ2dlci5ibGFuaygpO1xuICAgICAgbG9nZ2VyLmluZm8oJ1lvdSBjYW4gbm93IGRlcGxveSBwcm9qZWN0cyB3aXRoOicpO1xuICAgICAgbG9nZ2VyLmRpbSgnICBydW53YXkgZGVwbG95Jyk7XG4gICAgICBsb2dnZXIuYmxhbmsoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmVycm9yKCdBdXRoZW50aWNhdGlvbiBmYWlsZWQ6ICcgKyAocmVzcG9uc2UuZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGF4aW9zLmlzQXhpb3NFcnJvcihlcnJvcikpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkOiAnICsgKGVycm9yLnJlc3BvbnNlPy5kYXRhPy5lcnJvciB8fCBlcnJvci5tZXNzYWdlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5lcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkOiAnICsgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export declare function listCommand(): Promise<void>;