@qodalis/cli-curl
Version:
Provide utility functions for the library curl
215 lines • 30.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { DefaultLibraryAuthor, } from '@qodalis/cli-core';
import { LIBRARY_VERSION } from '../version';
import * as i0 from "@angular/core";
export class CliCurlCommandProcessor {
constructor() {
this.command = 'curl';
this.description = 'A command-line tool to execute HTTP requests on your server. Supports GET, POST, PUT, DELETE, headers, and body data.';
this.author = DefaultLibraryAuthor;
this.version = LIBRARY_VERSION;
this.processors = [];
this.metadata = {
icon: '🌐',
};
this.registerSubProcessors();
}
async processCommand(command, context) {
context.executor.showHelp(command, context);
}
async initialize(context) { }
registerSubProcessors() {
this.processors = [
{
command: 'get',
description: 'Perform an HTTP GET request',
valueRequired: true,
parameters: [
{
name: 'header',
aliases: ['H'],
type: 'array',
description: 'Add custom headers. Accept multiple headers.',
required: false,
},
{
name: 'proxy',
type: 'boolean',
description: 'Use procy',
required: false,
},
],
processCommand: async (command, context) => {
await this.executeRequest('GET', command, context);
},
},
{
command: 'post',
description: 'Perform an HTTP POST request',
valueRequired: true,
parameters: [
{
name: 'header',
aliases: ['H'],
type: 'array',
description: 'Add custom headers',
required: false,
},
{
name: 'data',
aliases: ['d'],
type: 'string',
description: 'Request body',
required: false,
},
{
name: 'proxy',
type: 'boolean',
description: 'Use procy',
required: false,
},
],
processCommand: async (command, context) => {
await this.executeRequest('POST', command, context);
},
},
{
command: 'put',
description: 'Perform an HTTP PUT request',
valueRequired: true,
parameters: [
{
name: 'header',
aliases: ['H'],
type: 'array',
description: 'Add custom headers',
required: false,
},
{
name: 'data',
aliases: ['d'],
type: 'string',
description: 'Request body',
required: false,
},
{
name: 'proxy',
type: 'boolean',
description: 'Use procy',
required: false,
},
],
processCommand: async (command, context) => {
await this.executeRequest('PUT', command, context);
},
},
{
command: 'delete',
description: 'Perform an HTTP DELETE request',
valueRequired: true,
parameters: [
{
name: 'header',
aliases: ['H'],
type: 'array',
description: 'Add custom headers',
required: false,
},
{
name: 'proxy',
type: 'boolean',
description: 'Use procy',
required: false,
},
],
processCommand: async (command, context) => {
await this.executeRequest('DELETE', command, context);
},
},
];
}
async executeRequest(method, command, context) {
const url = command.value;
const headers = command.args['header'] || command.args['H'] || [];
const data = command.args['data'] || command.args['d'];
const verbose = !!command.args['verbose'];
const useProxy = !!command.args['proxy'];
if (!url) {
context.writer.writeError('URL is required.');
return;
}
// Prepare headers
const headersObject = headers.reduce((acc, header) => {
const [key, value] = header.split(':').map((str) => str.trim());
if (key && value)
acc[key] = value;
return acc;
}, {});
// Prepare request options
const options = {
method,
headers: headersObject,
body: data ? JSON.stringify(JSON.parse(data)) : undefined,
};
try {
const requestUrl = useProxy ? this.rewriteUrlToProxy(url) : url;
const response = await fetch(requestUrl, options);
const text = await response.text();
context.writer.writeSuccess('Request successful:');
if (verbose) {
context.writer.writeln(`Status: ${response.status}`);
context.writer.writeln(`Headers: ${JSON.stringify(response.headers, null, 2)}`);
}
context.writer.writeln(text);
context.process.output(text);
}
catch (error) {
context.writer.writeError(`Request failed: ${error}`);
context.process.exit(-1);
}
finally {
context.writer.writeln();
context.writer.writeInfo('Equivalent curl command:');
context.writer.writeln(this.generateCurlCommand(url, method, headers, data));
}
}
generateCurlCommand(url, method, headers, data) {
const headerString = headers.map((h) => `-H "${h}"`).join(' ');
const dataString = data ? `-d '${data}'` : '';
return `curl -X ${method} ${headerString} ${dataString} "${url}"`;
}
rewriteUrlToProxy(originalUrl) {
const regex = /^(https?):\/\/([^\/]+)(\/.*)?$/i;
const match = originalUrl.match(regex);
if (!match) {
throw new Error('Invalid URL provided');
}
const scheme = match[1]; // 'http' or 'https'
const domain = match[2]; // domain.com
const path = match[3] || '/'; // /path or '/'
return `https://proxy.qodalis.com/proxy/${scheme}/${domain}${path}`;
}
writeDescription(context) {
context.writer.writeln(this.description);
context.writer.writeln();
context.writer.writeln('Usage:');
context.writer.writeln(' curl <method> <url> [options]');
context.writer.writeln();
context.writer.writeln('Options:');
context.writer.writeln(' -H, --header Add custom headers (e.g., -H="Authorization: Bearer <token>")');
context.writer.writeln(' -d, --data Add request body');
context.writer.writeln(' --verbose Print detailed response');
context.writer.writeln();
context.writer.writeln('Examples:');
context.writer.writeln(' curl get https://api.example.com/users');
context.writer.writeln(' curl post https://api.example.com/users -d=\'{"name":"John"}\' -H="Content-Type: application/json"');
context.writer.writeln();
context.writer.writeWarning('Note: The server must allow CORS for this tool to work.');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlCommandProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlCommandProcessor }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlCommandProcessor, decorators: [{
type: Injectable
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWN1cmwtY29tbWFuZC1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jdXJsL3NyYy9saWIvcHJvY2Vzc29ycy9jbGktY3VybC1jb21tYW5kLXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFHSCxvQkFBb0IsR0FHdkIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDOztBQUc3QyxNQUFNLE9BQU8sdUJBQXVCO0lBZ0JoQztRQWZBLFlBQU8sR0FBRyxNQUFNLENBQUM7UUFFakIsZ0JBQVcsR0FDUCx1SEFBdUgsQ0FBQztRQUU1SCxXQUFNLEdBQUcsb0JBQW9CLENBQUM7UUFFOUIsWUFBTyxHQUFHLGVBQWUsQ0FBQztRQUUxQixlQUFVLEdBQXdDLEVBQUUsQ0FBQztRQUVyRCxhQUFRLEdBQXNDO1lBQzFDLElBQUksRUFBRSxJQUFJO1NBQ2IsQ0FBQztRQUdFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUNoQixPQUEwQixFQUMxQixPQUE2QjtRQUU3QixPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBNkIsSUFBa0IsQ0FBQztJQUV6RCxxQkFBcUI7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNkO2dCQUNJLE9BQU8sRUFBRSxLQUFLO2dCQUNkLFdBQVcsRUFBRSw2QkFBNkI7Z0JBQzFDLGFBQWEsRUFBRSxJQUFJO2dCQUNuQixVQUFVLEVBQUU7b0JBQ1I7d0JBQ0ksSUFBSSxFQUFFLFFBQVE7d0JBQ2QsT0FBTyxFQUFFLENBQUMs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QXNHLENBQ3pHLENBQUM7UUFDRixPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXpCLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUN2Qix5REFBeUQsQ0FDNUQsQ0FBQztJQUNOLENBQUM7K0dBNVBRLHVCQUF1QjttSEFBdkIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICBDbGlQcm9jZXNzb3JNZXRhZGF0YSxcbiAgICBEZWZhdWx0TGlicmFyeUF1dGhvcixcbiAgICBJQ2xpQ29tbWFuZFByb2Nlc3NvcixcbiAgICBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSAnQHFvZGFsaXMvY2xpLWNvcmUnO1xuaW1wb3J0IHsgTElCUkFSWV9WRVJTSU9OIH0gZnJvbSAnLi4vdmVyc2lvbic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDbGlDdXJsQ29tbWFuZFByb2Nlc3NvciBpbXBsZW1lbnRzIElDbGlDb21tYW5kUHJvY2Vzc29yIHtcbiAgICBjb21tYW5kID0gJ2N1cmwnO1xuXG4gICAgZGVzY3JpcHRpb24gPVxuICAgICAgICAnQSBjb21tYW5kLWxpbmUgdG9vbCB0byBleGVjdXRlIEhUVFAgcmVxdWVzdHMgb24geW91ciBzZXJ2ZXIuIFN1cHBvcnRzIEdFVCwgUE9TVCwgUFVULCBERUxFVEUsIGhlYWRlcnMsIGFuZCBib2R5IGRhdGEuJztcblxuICAgIGF1dGhvciA9IERlZmF1bHRMaWJyYXJ5QXV0aG9yO1xuXG4gICAgdmVyc2lvbiA9IExJQlJBUllfVkVSU0lPTjtcblxuICAgIHByb2Nlc3NvcnM/OiBJQ2xpQ29tbWFuZFByb2Nlc3NvcltdIHwgdW5kZWZpbmVkID0gW107XG5cbiAgICBtZXRhZGF0YT86IENsaVByb2Nlc3Nvck1ldGFkYXRhIHwgdW5kZWZpbmVkID0ge1xuICAgICAgICBpY29uOiAn8J+MkCcsXG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyU3ViUHJvY2Vzc29ycygpO1xuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3NDb21tYW5kKFxuICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnRleHQuZXhlY3V0b3Iuc2hvd0hlbHAoY29tbWFuZCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdGlhbGl6ZShjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge31cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJTdWJQcm9jZXNzb3JzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2Nlc3NvcnMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ2dldCcsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdQZXJmb3JtIGFuIEhUVFAgR0VUIHJlcXVlc3QnLFxuICAgICAgICAgICAgICAgIHZhbHVlUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnaGVhZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnSCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBZGQgY3VzdG9tIGhlYWRlcnMuIEFjY2VwdCBtdWx0aXBsZSBoZWFkZXJzLicsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm94eScsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZSBwcm9jeScsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogYXN5bmMgKGNvbW1hbmQsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdCgnR0VUJywgY29tbWFuZCwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ3Bvc3QnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUGVyZm9ybSBhbiBIVFRQIFBPU1QgcmVxdWVzdCcsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNlczogWydIJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBZGQgY3VzdG9tIGhlYWRlcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ2QnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJveHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdVc2UgcHJvY3knLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChjb21tYW5kLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVJlcXVlc3QoJ1BPU1QnLCBjb21tYW5kLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAncHV0JyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1BlcmZvcm0gYW4gSFRUUCBQVVQgcmVxdWVzdCcsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNlczogWydIJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBZGQgY3VzdG9tIGhlYWRlcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ2QnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJveHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdVc2UgcHJvY3knLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChjb21tYW5kLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVJlcXVlc3QoJ1BVVCcsIGNvbW1hbmQsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdkZWxldGUnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUGVyZm9ybSBhbiBIVFRQIERFTEVURSByZXF1ZXN0JyxcbiAgICAgICAgICAgICAgICB2YWx1ZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2hlYWRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ0gnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0FkZCBjdXN0b20gaGVhZGVycycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm94eScsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZSBwcm9jeScsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogYXN5bmMgKGNvbW1hbmQsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdCgnREVMRVRFJywgY29tbWFuZCwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBleGVjdXRlUmVxdWVzdChcbiAgICAgICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdXJsID0gY29tbWFuZC52YWx1ZTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGNvbW1hbmQuYXJnc1snaGVhZGVyJ10gfHwgY29tbWFuZC5hcmdzWydIJ10gfHwgW107XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb21tYW5kLmFyZ3NbJ2RhdGEnXSB8fCBjb21tYW5kLmFyZ3NbJ2QnXTtcbiAgICAgICAgY29uc3QgdmVyYm9zZSA9ICEhY29tbWFuZC5hcmdzWyd2ZXJib3NlJ107XG4gICAgICAgIGNvbnN0IHVzZVByb3h5ID0gISFjb21tYW5kLmFyZ3NbJ3Byb3h5J107XG5cbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlRXJyb3IoJ1VSTCBpcyByZXF1aXJlZC4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXBhcmUgaGVhZGVyc1xuICAgICAgICBjb25zdCBoZWFkZXJzT2JqZWN0ID0gaGVhZGVycy5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBoZWFkZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGhlYWRlci5zcGxpdCgnOicpLm1hcCgoc3RyKSA9PiBzdHIudHJpbSgpKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICYmIHZhbHVlKSBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge30sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUHJlcGFyZSByZXF1ZXN0IG9wdGlvbnNcbiAgICAgICAgY29uc3Qgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzT2JqZWN0LFxuICAgICAgICAgICAgYm9keTogZGF0YSA/IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UoZGF0YSkpIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0VXJsID0gdXNlUHJveHkgPyB0aGlzLnJld3JpdGVVcmxUb1Byb3h5KHVybCkgOiB1cmw7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdFVybCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuXG4gICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZVN1Y2Nlc3MoJ1JlcXVlc3Qgc3VjY2Vzc2Z1bDonKTtcbiAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihgU3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICBgSGVhZGVyczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZS5oZWFkZXJzLCBudWxsLCAyKX1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKHRleHQpO1xuXG4gICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHRleHQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVFcnJvcihgUmVxdWVzdCBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICBjb250ZXh0LnByb2Nlc3MuZXhpdCgtMSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZUluZm8oJ0VxdWl2YWxlbnQgY3VybCBjb21tYW5kOicpO1xuICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlQ3VybENvbW1hbmQodXJsLCBtZXRob2QsIGhlYWRlcnMsIGRhdGEpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVDdXJsQ29tbWFuZChcbiAgICAgICAgdXJsOiBzdHJpbmcsXG4gICAgICAgIG1ldGhvZDogc3RyaW5nLFxuICAgICAgICBoZWFkZXJzOiBzdHJpbmdbXSxcbiAgICAgICAgZGF0YT86IHN0cmluZyxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBoZWFkZXJTdHJpbmcgPSBoZWFkZXJzLm1hcCgoaCkgPT4gYC1IIFwiJHtofVwiYCkuam9pbignICcpO1xuICAgICAgICBjb25zdCBkYXRhU3RyaW5nID0gZGF0YSA/IGAtZCAnJHtkYXRhfSdgIDogJyc7XG4gICAgICAgIHJldHVybiBgY3VybCAtWCAke21ldGhvZH0gJHtoZWFkZXJTdHJpbmd9ICR7ZGF0YVN0cmluZ30gXCIke3VybH1cImA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXdyaXRlVXJsVG9Qcm94eShvcmlnaW5hbFVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcmVnZXggPSAvXihodHRwcz8pOlxcL1xcLyhbXlxcL10rKShcXC8uKik/JC9pO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoID0gb3JpZ2luYWxVcmwubWF0Y2gocmVnZXgpO1xuXG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBVUkwgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjaGVtZSA9IG1hdGNoWzFdOyAvLyAnaHR0cCcgb3IgJ2h0dHBzJ1xuICAgICAgICBjb25zdCBkb21haW4gPSBtYXRjaFsyXTsgLy8gZG9tYWluLmNvbVxuICAgICAgICBjb25zdCBwYXRoID0gbWF0Y2hbM10gfHwgJy8nOyAvLyAvcGF0aCBvciAnLydcblxuICAgICAgICByZXR1cm4gYGh0dHBzOi8vcHJveHkucW9kYWxpcy5jb20vcHJveHkvJHtzY2hlbWV9LyR7ZG9tYWlufSR7cGF0aH1gO1xuICAgIH1cblxuICAgIHdyaXRlRGVzY3JpcHRpb24oY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbih0aGlzLmRlc2NyaXB0aW9uISk7XG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbignVXNhZ2U6Jyk7XG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oJyAgY3VybCA8bWV0aG9kPiA8dXJsPiBbb3B0aW9uc10nKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbigpO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCdPcHRpb25zOicpO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgJyAgLUgsIC0taGVhZGVyICAgICBBZGQgY3VzdG9tIGhlYWRlcnMgKGUuZy4sIC1IPVwiQXV0aG9yaXphdGlvbjogQmVhcmVyIDx0b2tlbj5cIiknLFxuICAgICAgICApO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCcgIC1kLCAtLWRhdGEgICAgICAgQWRkIHJlcXVlc3QgYm9keScpO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCcgIC0tdmVyYm9zZSAgICBQcmludCBkZXRhaWxlZCByZXNwb25zZScpO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCk7XG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oJ0V4YW1wbGVzOicpO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCcgIGN1cmwgZ2V0IGh0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3VzZXJzJyk7XG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAnICBjdXJsIHBvc3QgaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vdXNlcnMgLWQ9XFwne1wibmFtZVwiOlwiSm9oblwifVxcJyAtSD1cIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblwiJyxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbigpO1xuXG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlV2FybmluZyhcbiAgICAgICAgICAgICdOb3RlOiBUaGUgc2VydmVyIG11c3QgYWxsb3cgQ09SUyBmb3IgdGhpcyB0b29sIHRvIHdvcmsuJyxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=