UNPKG

30.5 kBJavaScriptView Raw
1"use strict";
2// MIT License http://www.opensource.org/licenses/mit-license.php
3// Author Gajus Kuizinas @gajus
4Object.defineProperty(exports, "__esModule", { value: true });
5// tslint:disable:no-any
6// tslint:disable:no-unsafe-any
7// tslint:disable:no-var-requires
8// tslint:disable:no-require-imports
9const Ajv = require("ajv");
10const ajv = new Ajv({
11 errorDataPath: 'configuration',
12 allErrors: true,
13 verbose: true
14});
15require('ajv-keywords')(ajv, ['instanceof']);
16function validateSchema(schema, data) {
17 if (Array.isArray(data)) {
18 const errors = data.map((opts) => validateObject(schema, opts));
19 errors.forEach((list, idx) => {
20 // tslint:disable-next-line:no-function-expression
21 list.forEach(function applyPrefix(err) {
22 err.dataPath = `[${idx}]${err.dataPath}`;
23 if (err.children) {
24 err.children.forEach(applyPrefix);
25 }
26 });
27 });
28 return errors.reduce((arr, items) => {
29 return arr.concat(items);
30 }, []);
31 }
32 else {
33 return validateObject(schema, data);
34 }
35}
36exports.validateSchema = validateSchema;
37function validateObject(schema, data) {
38 const validate = ajv.compile(schema);
39 const valid = validate(data);
40 return valid ? [] : filterErrors(validate.errors || []);
41}
42function filterErrors(errors) {
43 let newErrors = [];
44 errors.forEach((err) => {
45 const dataPath = err.dataPath;
46 let children = [];
47 newErrors = newErrors.filter((oldError) => {
48 if (oldError.dataPath.includes(dataPath)) {
49 if (oldError.children) {
50 children = children.concat(oldError.children.slice(0));
51 }
52 oldError.children = undefined;
53 children.push(oldError);
54 return false;
55 }
56 return true;
57 });
58 if (children.length) {
59 err.children = children;
60 }
61 newErrors.push(err);
62 });
63 return newErrors;
64}
65//// Ref: from webpack
66function formatValidationError(sourceSchema, err) {
67 const dataPath = `configuration${err.dataPath}`;
68 if (err.keyword === 'additionalProperties') {
69 return `${dataPath} has an unknown property '${err.params.additionalProperty}'.\nThese properties are valid:\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
70 }
71 if (err.keyword === 'oneOf' || err.keyword === 'anyOf') {
72 if (err.children && err.children.length > 0) {
73 // tslint:disable-next-line:prefer-template
74 return `${dataPath} should be one of these:\n${getSchemaPartText(sourceSchema, err.parentSchema)}\n` +
75 `Details:\n${err.children
76 .map((e) => `${formatValidationError(sourceSchema, e)}`)
77 .join('\n')}`;
78 }
79 return `${dataPath} should be one of these:\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
80 }
81 if (err.keyword === 'enum') {
82 if (err.parentSchema && err.parentSchema.enum && err.parentSchema.enum.length === 1) {
83 return `${dataPath} should be ${getSchemaPartText(sourceSchema, err.parentSchema)}`;
84 }
85 return `${dataPath} should be one of these:\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
86 }
87 if (err.keyword === 'allOf') {
88 return `${dataPath} should be:\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
89 }
90 if (err.keyword === 'type' && err.params.type) {
91 return `${dataPath} should be ${err.params.type}:\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
92 }
93 if (err.keyword === 'instanceof') {
94 return `${dataPath} should be an instance of ${getSchemaPartText(sourceSchema, err.parentSchema)}.`;
95 }
96 if (err.keyword === 'required' && err.params.missingProperty) {
97 const missingProperty = err.params.missingProperty.replace(/^\./, '');
98 return `${dataPath} misses the property '${missingProperty}'.\n${getSchemaPartText(sourceSchema, err.parentSchema, ['properties', missingProperty])}`;
99 }
100 if (err.keyword === 'minLength' || err.keyword === 'minItems') {
101 if (err.params.limit === 1) {
102 return `${dataPath} should not be empty.`;
103 }
104 else {
105 return `${dataPath} ${err.message}`;
106 }
107 }
108 return `${dataPath} ${err.message} (${JSON.stringify(err, null, 2)}).\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
109}
110exports.formatValidationError = formatValidationError;
111const formatSchema = (sourceSchema, curSchema, prevSchemas) => {
112 const schema = curSchema;
113 prevSchemas = prevSchemas || [];
114 const formatInnerSchema = (innerSchema, addSelf) => {
115 if (!addSelf) {
116 return formatSchema(sourceSchema, innerSchema, prevSchemas);
117 }
118 prevSchemas = prevSchemas || [];
119 if (prevSchemas.indexOf(innerSchema) >= 0) {
120 return '(recursive)';
121 }
122 return formatSchema(sourceSchema, innerSchema, prevSchemas.concat(schema));
123 };
124 if (schema.type === 'string' && schema.minLength === 1) {
125 return 'non-empty string';
126 }
127 if (schema.type === 'string' && schema.minLength > 1) {
128 return `string (min length ${schema.minLength})`;
129 }
130 if (schema.type === 'string') {
131 return 'string';
132 }
133 if (schema.type === 'boolean') {
134 return 'boolean';
135 }
136 if (schema.type === 'number') {
137 return 'number';
138 }
139 if (schema.type === 'object') {
140 if (schema.properties) {
141 const required = schema.required || [];
142 return `object { ${Object.keys(schema.properties).map((property) => {
143 if (required.indexOf(property) < 0) {
144 return `${property}?`;
145 }
146 return property;
147 }).concat(schema.additionalProperties ? ['...'] : []).join(', ')} }`;
148 }
149 if (schema.additionalProperties) {
150 return `object { <key>: ${formatInnerSchema(schema.additionalProperties)} }`;
151 }
152 return 'object';
153 }
154 if (schema.type === 'array') {
155 return `[${formatInnerSchema(schema.items)}]`;
156 }
157 // tslint:disable-next-line:switch-default
158 switch (schema.instanceof) {
159 case 'Function':
160 return 'function';
161 case 'RegExp':
162 return 'RegExp';
163 }
164 if (schema.$ref) {
165 return formatInnerSchema(getSchemaPart(sourceSchema, schema.$ref), true);
166 }
167 if (schema.allOf) {
168 return schema.allOf.map(formatInnerSchema).join(' & ');
169 }
170 if (schema.oneOf) {
171 return schema.oneOf.map(formatInnerSchema).join(' | ');
172 }
173 if (schema.anyOf) {
174 return schema.anyOf.map(formatInnerSchema).join(' | ');
175 }
176 if (schema.enum) {
177 return schema.enum.map((item) => JSON.stringify(item)).join(' | ');
178 }
179 return JSON.stringify(schema, null, 2);
180};
181function getSchemaPartText(sourceSchema, schemaPart, additionalPath) {
182 if (additionalPath) {
183 for (const inner of additionalPath) {
184 if (inner) {
185 schemaPart = inner;
186 }
187 }
188 }
189 while (schemaPart.$ref) {
190 schemaPart = getSchemaPart(sourceSchema, schemaPart.$ref);
191 }
192 let schemaText = formatSchema(sourceSchema, schemaPart);
193 if (schemaPart.description) {
194 schemaText += `\n${schemaPart.description}`;
195 }
196 return schemaText;
197}
198function getSchemaPart(sourceSchema, path, parents, additionalPath) {
199 parents = parents || 0;
200 let pathArrary = path.split('/');
201 pathArrary = pathArrary.slice(0, pathArrary.length - parents);
202 if (additionalPath) {
203 pathArrary = pathArrary.concat(additionalPath.split('/'));
204 }
205 let schemaPart = sourceSchema;
206 for (const inner of pathArrary) {
207 if (inner) {
208 schemaPart = inner;
209 }
210 }
211 return schemaPart;
212}
213//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtc2NoZW1hLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJzcmMvdXRpbHMvdmFsaWRhdGUtc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxpRUFBaUU7QUFDakUsK0JBQStCOztBQUUvQix3QkFBd0I7QUFDeEIsK0JBQStCO0FBQy9CLGlDQUFpQztBQUNqQyxvQ0FBb0M7QUFFcEMsMkJBQTJCO0FBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2hCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsT0FBTyxFQUFFLElBQUk7Q0FDaEIsQ0FBQyxDQUFDO0FBRUgsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFFN0MsU0FBZ0IsY0FBYyxDQUFDLE1BQWMsRUFBRSxJQUFTO0lBQ3BELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUN6QixrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLFdBQVcsQ0FBQyxHQUFvQjtnQkFDbEQsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3pDLElBQUssR0FBVyxDQUFDLFFBQVEsRUFBRTtvQkFDdEIsR0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzlDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztR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QUFZLEVBQUUsT0FBZ0IsRUFBRSxjQUF1QjtJQUNoRyxPQUFPLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQztJQUN2QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQzlELElBQUksY0FBYyxFQUFFO1FBQ2hCLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUM3RDtJQUVELElBQUksVUFBVSxHQUFRLFlBQVksQ0FBQztJQUNuQyxLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsRUFBRTtRQUM1QixJQUFJLEtBQUssRUFBRTtZQUNQLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDdEI7S0FDSjtJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuLy8gQXV0aG9yIEdhanVzIEt1aXppbmFzIEBnYWp1c1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbi8vIHRzbGludDpkaXNhYmxlOm5vLXVuc2FmZS1hbnlcbi8vIHRzbGludDpkaXNhYmxlOm5vLXZhci1yZXF1aXJlc1xuLy8gdHNsaW50OmRpc2FibGU6bm8tcmVxdWlyZS1pbXBvcnRzXG5cbmltcG9ydCAqIGFzIEFqdiBmcm9tICdhanYnO1xuY29uc3QgYWp2ID0gbmV3IEFqdih7XG4gICAgZXJyb3JEYXRhUGF0aDogJ2NvbmZpZ3VyYXRpb24nLFxuICAgIGFsbEVycm9yczogdHJ1ZSxcbiAgICB2ZXJib3NlOiB0cnVlXG59KTtcblxucmVxdWlyZSgnYWp2LWtleXdvcmRzJykoYWp2LCBbJ2luc3RhbmNlb2YnXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNjaGVtYShzY2hlbWE6IE9iamVjdCwgZGF0YTogYW55KTogQWp2LkVycm9yT2JqZWN0W10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IGRhdGEubWFwKChvcHRzOiBhbnkpID0+IHZhbGlkYXRlT2JqZWN0KHNjaGVtYSwgb3B0cykpO1xuICAgICAgICBlcnJvcnMuZm9yRWFjaCgobGlzdCwgaWR4KSA9PiB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZnVuY3Rpb24tZXhwcmVzc2lvblxuICAgICAgICAgICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIGFwcGx5UHJlZml4KGVycjogQWp2LkVycm9yT2JqZWN0KTogdm9pZCB7XG4gICAgICAgICAgICAgICAgZXJyLmRhdGFQYXRoID0gYFske2lkeH1dJHtlcnIuZGF0YVBhdGh9YDtcbiAgICAgICAgICAgICAgICBpZiAoKGVyciBhcyBhbnkpLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIChlcnIgYXMgYW55KS5jaGlsZHJlbi5mb3JFYWNoKGFwcGx5UHJlZml4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycy5yZWR1Y2UoKGFyciwgaXRlbXMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcnIuY29uY2F0KGl0ZW1zKTtcbiAgICAgICAgfSwgW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdChzY2hlbWEsIGRhdGEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVPYmplY3Qoc2NoZW1hOiBPYmplY3QsIGRhdGE6IGFueSk6IEFqdi5FcnJvck9iamVjdFtdIHtcbiAgICBjb25zdCB2YWxpZGF0ZSA9IGFqdi5jb21waWxlKHNjaGVtYSk7XG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZShkYXRhKTtcblxuICAgIHJldHVybiB2YWxpZCA/IFtdIDogZmlsdGVyRXJyb3JzKHZhbGlkYXRlLmVycm9ycyB8fCBbXSk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckVycm9ycyhlcnJvcnM6IEFqdi5FcnJvck9iamVjdFtdKTogQWp2LkVycm9yT2JqZWN0W10ge1xuICAgIGxldCBuZXdFcnJvcnM6IEFqdi5FcnJvck9iamVjdFtdID0gW107XG4gICAgZXJyb3JzLmZvckVhY2goKGVycjogQWp2LkVycm9yT2JqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFQYXRoID0gZXJyLmRhdGFQYXRoO1xuICAgICAgICBsZXQgY2hpbGRyZW46IEFqdi5FcnJvck9iamVjdFtdID0gW107XG4gICAgICAgIG5ld0Vycm9ycyA9IG5ld0Vycm9ycy5maWx0ZXIoKG9sZEVycm9yOiBBanYuRXJyb3JPYmplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChvbGRFcnJvci5kYXRhUGF0aC5pbmNsdWRlcyhkYXRhUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoKG9sZEVycm9yIGFzIGFueSkuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5jb25jYXQoKG9sZEVycm9yIGFzIGFueSkuY2hpbGRyZW4uc2xpY2UoMCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAob2xkRXJyb3IgYXMgYW55KS5jaGlsZHJlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG9sZEVycm9yKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAoZXJyIGFzIGFueSkuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICBuZXdFcnJvcnMucHVzaChlcnIpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ld0Vycm9ycztcbn1cblxuLy8vLyBSZWY6IGZyb20gd2VicGFja1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFZhbGlkYXRpb25FcnJvcihzb3VyY2VTY2hlbWE6IE9iamVjdCwgZXJyOiBBanYuRXJyb3JPYmplY3QpOiBhbnkge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gYGNvbmZpZ3VyYXRpb24ke2Vyci5kYXRhUGF0aH1gO1xuICAgIGlmIChlcnIua2V5d29yZCA9PT0gJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJykge1xuICAgICAgICByZXR1cm4gYCR7ZGF0YVBhdGh9IGhhcyBhbiB1bmtub3duIHByb3BlcnR5ICckeyhlcnIucGFyYW1zIGFzIGFueSkuYWRkaXRpb25hbFByb3BlcnR5XG4gICAgICAgICAgICB9Jy5cXG5UaGVzZSBwcm9wZXJ0aWVzIGFyZSB2YWxpZDpcXG4ke1xuICAgICAgICAgICAgZ2V0U2NoZW1hUGFydFRleHQoc291cmNlU2NoZW1hLCBlcnIucGFyZW50U2NoZW1hKX1gO1xuICAgIH1cbiAgICBpZiAoZXJyLmtleXdvcmQgPT09ICdvbmVPZicgfHwgZXJyLmtleXdvcmQgPT09ICdhbnlPZicpIHtcbiAgICAgICAgaWYgKChlcnIgYXMgYW55KS5jaGlsZHJlbiAmJiAoZXJyIGFzIGFueSkuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci10ZW1wbGF0ZVxuICAgICAgICAgICAgcmV0dXJuIGAke2RhdGFQYXRofSBzaG91bGQgYmUgb25lIG9mIHRoZXNlOlxcbiR7Z2V0U2NoZW1hUGFydFRleHQoc291cmNlU2NoZW1hLCBlcnIucGFyZW50U2NoZW1hKX1cXG5gICtcbiAgICAgICAgICAgICAgICBgRGV0YWlsczpcXG4keyhlcnIgYXMgYW55KS5jaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAubWFwKChlOiBBanYuRXJyb3JPYmplY3QpID0+IGAke2Zvcm1hdFZhbGlkYXRpb25FcnJvcihzb3VyY2VTY2hlbWEsIGUpfWApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke2RhdGFQYXRofSBzaG91bGQgYmUgb25lIG9mIHRoZXNlOlxcbiR7Z2V0U2NoZW1hUGFydFRleHQoc291cmNlU2NoZW1hLCBlcnIucGFyZW50U2NoZW1hKX1gO1xuICAgIH1cbiAgICBpZiAoZXJyLmtleXdvcmQgPT09ICdlbnVtJykge1xuICAgICAgICBpZiAoZXJyLnBhcmVudFNjaGVtYSAmJiAoZXJyLnBhcmVudFNjaGVtYSBhcyBhbnkpLmVudW0gJiYgKGVyci5wYXJlbnRTY2hlbWEgYXMgYW55KS5lbnVtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2RhdGFQYXRofSBzaG91bGQgYmUgJHtnZXRTY2hlbWFQYXJ0VGV4dChzb3VyY2VTY2hlbWEsIGVyci5wYXJlbnRTY2hlbWEpfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7ZGF0YVBhdGh9IHNob3VsZCBiZSBvbmUgb2YgdGhlc2U6XFxuJHtnZXRTY2hlbWFQYXJ0VGV4dChzb3VyY2VTY2hlbWEsIGVyci5wYXJlbnRTY2hlbWEpfWA7XG4gICAgfVxuICAgIGlmIChlcnIua2V5d29yZCA9PT0gJ2FsbE9mJykge1xuICAgICAgICByZXR1cm4gYCR7ZGF0YVBhdGh9IHNob3VsZCBiZTpcXG4ke2dldFNjaGVtYVBhcnRUZXh0KHNvdXJjZVNjaGVtYSwgZXJyLnBhcmVudFNjaGVtYSl9YDtcbiAgICB9XG4gICAgaWYgKGVyci5rZXl3b3JkID09PSAndHlwZScgJiYgKGVyci5wYXJhbXMgYXMgYW55KS50eXBlKSB7XG4gICAgICAgIHJldHVybiBgJHtkYXRhUGF0aH0gc2hvdWxkIGJlICR7KGVyci5wYXJhbXMgYXMgYW55KS50eXBlfTpcXG4ke2dldFNjaGVtYVBhcnRUZXh0KHNvdXJjZVNjaGVtYSwgZXJyLnBhcmVudFNjaGVtYSlcbiAgICAgICAgICAgIH1gO1xuICAgIH1cbiAgICBpZiAoZXJyLmtleXdvcmQgPT09ICdpbnN0YW5jZW9mJykge1xuICAgICAgICByZXR1cm4gYCR7ZGF0YVBhdGh9IHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiAke2dldFNjaGVtYVBhcnRUZXh0KHNvdXJjZVNjaGVtYSwgZXJyLnBhcmVudFNjaGVtYSl9LmA7XG4gICAgfVxuICAgIGlmIChlcnIua2V5d29yZCA9PT0gJ3JlcXVpcmVkJyAmJiAoZXJyLnBhcmFtcyBhcyBhbnkpLm1pc3NpbmdQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBtaXNzaW5nUHJvcGVydHk6IHN0cmluZyA9IChlcnIucGFyYW1zIGFzIGFueSkubWlzc2luZ1Byb3BlcnR5LnJlcGxhY2UoL15cXC4vLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGAke2RhdGFQYXRofSBtaXNzZXMgdGhlIHByb3BlcnR5ICcke21pc3NpbmdQcm9wZXJ0eX0nLlxcbiR7Z2V0U2NoZW1hUGFydFRleHQoc291cmNlU2NoZW1hLFxuICAgICAgICAgICAgZXJyLnBhcmVudFNjaGVtYSxcbiAgICAgICAgICAgIFsncHJvcGVydGllcycsIG1pc3NpbmdQcm9wZXJ0eV0pfWA7XG4gICAgfVxuICAgIGlmIChlcnIua2V5d29yZCA9PT0gJ21pbkxlbmd0aCcgfHwgZXJyLmtleXdvcmQgPT09ICdtaW5JdGVtcycpIHtcbiAgICAgICAgaWYgKChlcnIucGFyYW1zIGFzIGFueSkubGltaXQgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtkYXRhUGF0aH0gc2hvdWxkIG5vdCBiZSBlbXB0eS5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke2RhdGFQYXRofSAke2Vyci5tZXNzYWdlfWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYCR7ZGF0YVBhdGh9ICR7ZXJyLm1lc3NhZ2V9ICgke0pTT04uc3RyaW5naWZ5KGVyciwgbnVsbCwgMil9KS5cXG4ke2dldFNjaGVtYVBhcnRUZXh0KHNvdXJjZVNjaGVtYSxcbiAgICAgICAgZXJyLnBhcmVudFNjaGVtYSl9YDtcbn1cblxuY29uc3QgZm9ybWF0U2NoZW1hID1cbiAgICAoc291cmNlU2NoZW1hOiBPYmplY3QsIGN1clNjaGVtYTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgcHJldlNjaGVtYXM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9W10pOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSBjdXJTY2hlbWEgYXMgYW55O1xuICAgICAgICBwcmV2U2NoZW1hcyA9IHByZXZTY2hlbWFzIHx8IFtdO1xuXG4gICAgICAgIGNvbnN0IGZvcm1hdElubmVyU2NoZW1hOiBhbnkgPSAoaW5uZXJTY2hlbWE6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGFkZFNlbGY/OiBib29sZWFuKTogYW55ID0+IHtcbiAgICAgICAgICAgIGlmICghYWRkU2VsZikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXRTY2hlbWEoc291cmNlU2NoZW1hLCBpbm5lclNjaGVtYSwgcHJldlNjaGVtYXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcmV2U2NoZW1hcyA9IHByZXZTY2hlbWFzIHx8IFtdO1xuICAgICAgICAgICAgaWYgKHByZXZTY2hlbWFzLmluZGV4T2YoaW5uZXJTY2hlbWEpID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyhyZWN1cnNpdmUpJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFNjaGVtYShzb3VyY2VTY2hlbWEsIGlubmVyU2NoZW1hLCBwcmV2U2NoZW1hcy5jb25jYXQoc2NoZW1hKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHNjaGVtYS50eXBlID09PSAnc3RyaW5nJyAmJiBzY2hlbWEubWluTGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gJ25vbi1lbXB0eSBzdHJpbmcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gJ3N0cmluZycgJiYgc2NoZW1hLm1pbkxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBgc3RyaW5nIChtaW4gbGVuZ3RoICR7c2NoZW1hLm1pbkxlbmd0aH0pYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYS50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWlyZWQ6IGFueVtdID0gc2NoZW1hLnJlcXVpcmVkIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBvYmplY3QgeyAke09iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzKS5tYXAoKHByb3BlcnR5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkLmluZGV4T2YocHJvcGVydHkpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3Byb3BlcnR5fT9gO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5O1xuICAgICAgICAgICAgICAgIH0pLmNvbmNhdChzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPyBbJy4uLiddIDogW10pLmpvaW4oJywgJyl9IH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgb2JqZWN0IHsgPGtleT46ICR7Zm9ybWF0SW5uZXJTY2hlbWEoc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKX0gfWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHtmb3JtYXRJbm5lclNjaGVtYShzY2hlbWEuaXRlbXMpfV1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN3aXRjaC1kZWZhdWx0XG4gICAgICAgIHN3aXRjaCAoc2NoZW1hLmluc3RhbmNlb2YpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJztcbiAgICAgICAgICAgIGNhc2UgJ1JlZ0V4cCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdSZWdFeHAnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjaGVtYS4kcmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5uZXJTY2hlbWEoZ2V0U2NoZW1hUGFydChzb3VyY2VTY2hlbWEsIHNjaGVtYS4kcmVmKSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYS5hbGxPZikge1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5hbGxPZi5tYXAoZm9ybWF0SW5uZXJTY2hlbWEpLmpvaW4oJyAmICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEub25lT2YpIHtcbiAgICAgICAgICAgIHJldHVybiBzY2hlbWEub25lT2YubWFwKGZvcm1hdElubmVyU2NoZW1hKS5qb2luKCcgfCAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NoZW1hLmFueU9mKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLmFueU9mLm1hcChmb3JtYXRJbm5lclNjaGVtYSkuam9pbignIHwgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYS5lbnVtKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLmVudW0ubWFwKChpdGVtOiBhbnkpID0+IEpTT04uc3RyaW5naWZ5KGl0ZW0pKS5qb2luKCcgfCAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzY2hlbWEsIG51bGwsIDIpO1xuICAgIH07XG5cbmZ1bmN0aW9uIGdldFNjaGVtYVBhcnRUZXh0KHNvdXJjZVNjaGVtYTogT2JqZWN0LCBzY2hlbWFQYXJ0OiBhbnksIGFkZGl0aW9uYWxQYXRoPzogc3RyaW5nW10pOiBhbnkge1xuICAgIGlmIChhZGRpdGlvbmFsUGF0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlubmVyIG9mIGFkZGl0aW9uYWxQYXRoKSB7XG4gICAgICAgICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgICAgICAgICBzY2hlbWFQYXJ0ID0gaW5uZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3aGlsZSAoc2NoZW1hUGFydC4kcmVmKSB7XG4gICAgICAgIHNjaGVtYVBhcnQgPSBnZXRTY2hlbWFQYXJ0KHNvdXJjZVNjaGVtYSwgc2NoZW1hUGFydC4kcmVmKTtcbiAgICB9XG5cbiAgICBsZXQgc2NoZW1hVGV4dCA9IGZvcm1hdFNjaGVtYShzb3VyY2VTY2hlbWEsIHNjaGVtYVBhcnQpO1xuICAgIGlmIChzY2hlbWFQYXJ0LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHNjaGVtYVRleHQgKz0gYFxcbiR7c2NoZW1hUGFydC5kZXNjcmlwdGlvbn1gO1xuICAgIH1cblxuICAgIHJldHVybiBzY2hlbWFUZXh0O1xufVxuXG5mdW5jdGlvbiBnZXRTY2hlbWFQYXJ0KHNvdXJjZVNjaGVtYTogT2JqZWN0LCBwYXRoOiBzdHJpbmcsIHBhcmVudHM/OiBudW1iZXIsIGFkZGl0aW9uYWxQYXRoPzogc3RyaW5nKTogYW55IHtcbiAgICBwYXJlbnRzID0gcGFyZW50cyB8fCAwO1xuICAgIGxldCBwYXRoQXJyYXJ5ID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIHBhdGhBcnJhcnkgPSBwYXRoQXJyYXJ5LnNsaWNlKDAsIHBhdGhBcnJhcnkubGVuZ3RoIC0gcGFyZW50cyk7XG4gICAgaWYgKGFkZGl0aW9uYWxQYXRoKSB7XG4gICAgICAgIHBhdGhBcnJhcnkgPSBwYXRoQXJyYXJ5LmNvbmNhdChhZGRpdGlvbmFsUGF0aC5zcGxpdCgnLycpKTtcbiAgICB9XG5cbiAgICBsZXQgc2NoZW1hUGFydDogYW55ID0gc291cmNlU2NoZW1hO1xuICAgIGZvciAoY29uc3QgaW5uZXIgb2YgcGF0aEFycmFyeSkge1xuICAgICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgICAgIHNjaGVtYVBhcnQgPSBpbm5lcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzY2hlbWFQYXJ0O1xufVxuIl19
\No newline at end of file