@nlabs/rip-hunter
Version:
JS utilities for AJAX and GraphQL
186 lines (185 loc) • 22.1 kB
JavaScript
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var src_exports = {};
__export(src_exports, {
ApiError: () => import_ApiError2.ApiError,
ajax: () => ajax,
del: () => del,
get: () => get,
graphqlQuery: () => graphqlQuery,
post: () => post,
put: () => put,
queryString: () => queryString,
removeSpaces: () => removeSpaces,
toGql: () => toGql
});
module.exports = __toCommonJS(src_exports);
var import_isArray = __toESM(require("lodash/isArray"));
var import_isEmpty = __toESM(require("lodash/isEmpty"));
var import_isNull = __toESM(require("lodash/isNull"));
var import_isPlainObject = __toESM(require("lodash/isPlainObject"));
var import_isString = __toESM(require("lodash/isString"));
var import_isUndefined = __toESM(require("lodash/isUndefined"));
var import_omit = __toESM(require("lodash/omit"));
var import_ApiError = require("./errors/ApiError");
var import_ApiError2 = require("./errors/ApiError");
if (typeof window === "undefined") {
require("cross-fetch/polyfill");
}
const removeSpaces = (str) => str.replace(/\s+(?=(?:[^'"]*['"][^'"]*['"])*[^'"]*$)/gm, "");
const queryString = (json) => Object.keys(json).map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(json[key])}`).join("&");
const ajax = (url, method, params, options = {}) => {
const { headers, token } = options;
let formatUrl = (url || "").trim();
const formatToken = (token || "").trim();
const formatHeaders = headers || new Headers();
const formatMethod = (method || "GET").toUpperCase();
let formatParams;
if (params && formatMethod === "GET") {
formatUrl = `${formatUrl}?${queryString(params)}`;
formatParams = null;
} else if (params) {
formatHeaders.set("Accept", "application/json");
formatHeaders.set("Content-Type", "application/json");
formatParams = JSON.stringify(params);
} else {
formatParams = params;
}
if (!(0, import_isEmpty.default)(formatToken)) {
formatHeaders.set("Authorization", `Bearer ${formatToken}`);
}
let isResponseJson;
return fetch(formatUrl, { body: formatParams, headers: formatHeaders, method: formatMethod }).then((response) => {
const regex = /application\/json/i;
isResponseJson = regex.test(response.headers.get("Content-Type") || "");
if (isResponseJson) {
return response.json();
}
return response.text();
}).then((results) => {
if (isResponseJson) {
return results;
}
return results;
}).catch((error) => {
if ((error || {}).message === "only absolute urls are supported") {
return Promise.reject(new import_ApiError.ApiError([{ message: "invalid_url" }], error));
}
return Promise.reject(new import_ApiError.ApiError([{ message: "network_error" }], error));
});
};
const get = (url, params, options) => ajax(url, "GET", params, options);
const post = (url, params, options) => ajax(url, "POST", params, options);
const put = (url, params, options) => ajax(url, "PUT", params, options);
const del = (url, params, options) => ajax(url, "DELETE", params, options);
const toGql = (obj) => {
if ((0, import_isString.default)(obj)) {
return JSON.stringify(obj);
} else if ((0, import_isPlainObject.default)(obj)) {
let cleanObj = (0, import_omit.default)(obj, import_isUndefined.default);
cleanObj = (0, import_omit.default)(cleanObj, import_isNull.default);
const gqlProps = Object.keys(cleanObj).reduce((props, key) => {
const item = obj[key];
if ((0, import_isPlainObject.default)(item)) {
props.push(toGql(item));
} else if ((0, import_isArray.default)(item)) {
const list = item.map((listItem) => toGql(listItem));
props.push(`${key}: [${list.join(", ")}]`);
} else {
const val = JSON.stringify(item);
if (val) {
props.push(`${key}: ${val}`);
}
}
return props;
}, []);
const values = gqlProps.join(", ");
if (values === "") {
return '""';
}
return `{${gqlProps.join(", ")}}`;
} else if ((0, import_isArray.default)(obj)) {
return `[${obj.map((objItem) => toGql(objItem)).toString()}]`;
}
return obj;
};
const graphqlQuery = (url, query, options = {}) => {
const { headers, token } = options;
const formatUrl = url ? url.trim() : "";
const formatToken = (token || "").trim();
const formatHeaders = headers || new Headers({ "Content-Type": "application/json" });
if (formatToken !== "") {
formatHeaders.set("Authorization", `Bearer ${formatToken}`);
}
return fetch(formatUrl, { body: JSON.stringify(query), headers: formatHeaders, method: "post" }).then((response) => {
const regex = /application\/json/i;
const isJson = regex.test(response.headers.get("Content-Type") || "");
if (isJson && response.body) {
return response.json();
}
return null;
}).catch((error) => {
if ((error || {}).message === "only absolute urls are supported") {
return Promise.reject(new import_ApiError.ApiError([{ message: "invalid_url" }], error));
}
return Promise.reject(new import_ApiError.ApiError([{ message: "network_error" }], error));
}).then((json) => {
let updatedJson = {};
if (!json || json.errors) {
if (!json) {
return Promise.reject(new import_ApiError.ApiError([{ message: "api_error" }], new Error()));
} else if ((json.errors || []).some((error) => error.message === "Must provide query string.")) {
return Promise.reject(new import_ApiError.ApiError([{ message: "required_query" }], new Error()));
}
return json.errors ? Promise.reject(new import_ApiError.ApiError(json.errors, new Error())) : updatedJson;
} else if (json) {
updatedJson = { ...json };
}
return updatedJson.data || {};
}).catch((error) => {
let updatedError = error;
if (!error.source) {
updatedError = new import_ApiError.ApiError([{ message: "network_error" }], error);
}
return Promise.reject(updatedError);
});
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
ApiError,
ajax,
del,
get,
graphqlQuery,
post,
put,
queryString,
removeSpaces,
toGql
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNy1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnbG9kYXNoL2lzQXJyYXknO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoL2lzRW1wdHknO1xuaW1wb3J0IGlzTnVsbCBmcm9tICdsb2Rhc2gvaXNOdWxsJztcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2xvZGFzaC9pc1BsYWluT2JqZWN0JztcbmltcG9ydCBpc1N0cmluZyBmcm9tICdsb2Rhc2gvaXNTdHJpbmcnO1xuaW1wb3J0IGlzVW5kZWZpbmVkIGZyb20gJ2xvZGFzaC9pc1VuZGVmaW5lZCc7XG5pbXBvcnQgb21pdCBmcm9tICdsb2Rhc2gvb21pdCc7XG5cbmltcG9ydCB7QXBpRXJyb3J9IGZyb20gJy4vZXJyb3JzL0FwaUVycm9yJztcblxuaWYodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgcmVxdWlyZSgnY3Jvc3MtZmV0Y2gvcG9seWZpbGwnKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIdW50ZXJPcHRpb25zVHlwZSB7XG4gIHJlYWRvbmx5IGhlYWRlcnM/OiBIZWFkZXJzO1xuICByZWFkb25seSB0b2tlbj86IHN0cmluZztcbiAgcmVhZG9ubHkgdmFyaWFibGVzPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh1bnRlclF1ZXJ5VHlwZSB7XG4gIHJlYWRvbmx5IHF1ZXJ5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IGFueTtcbn1cblxuLyoqXG4gKiBKUyB1dGlsaXRpZXMgZm9yIEdyYXBoUUxcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZVNwYWNlcyA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PiBzdHIucmVwbGFjZSgvXFxzKyg/PSg/OlteJ1wiXSpbJ1wiXVteJ1wiXSpbJ1wiXSkqW14nXCJdKiQpL2dtLCAnJyk7XG5cbmV4cG9ydCBjb25zdCBxdWVyeVN0cmluZyA9IChqc29uOiBhbnkpOiBzdHJpbmcgPT4gT2JqZWN0XG4gIC5rZXlzKGpzb24pXG4gIC5tYXAoKGtleTogc3RyaW5nKSA9PiBgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX09JHtlbmNvZGVVUklDb21wb25lbnQoanNvbltrZXldKX1gKS5qb2luKCcmJyk7XG5cbi8vIEFKQVhcbmV4cG9ydCBjb25zdCBhamF4ID0gKHVybDogc3RyaW5nLCBtZXRob2Q6IHN0cmluZywgcGFyYW1zPywgb3B0aW9uczogSHVudGVyT3B0aW9uc1R5cGUgPSB7fSk6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IHtoZWFkZXJzLCB0b2tlbn0gPSBvcHRpb25zO1xuXG4gIGxldCBmb3JtYXRVcmw6IHN0cmluZyA9ICh1cmwgfHwgJycpLnRyaW0oKTtcbiAgY29uc3QgZm9ybWF0VG9rZW46IHN0cmluZyA9ICh0b2tlbiB8fCAnJykudHJpbSgpO1xuICBjb25zdCBmb3JtYXRIZWFkZXJzOiBIZWFkZXJzID0gaGVhZGVycyB8fCBuZXcgSGVhZGVycygpO1xuXG4gIC8vIE1ldGhvZFxuICBjb25zdCBmb3JtYXRNZXRob2Q6IHN0cmluZyA9IChtZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gIGxldCBmb3JtYXRQYXJhbXM7XG5cbiAgLy8gUGFyYW1ldGVyc1xuICBpZihwYXJhbXMgJiYgZm9ybWF0TWV0aG9kID09PSAnR0VUJykge1xuICAgIGZvcm1hdFVybCA9IGAke2Zvcm1hdFVybH0/JHtxdWVyeVN0cmluZyhwYXJhbXMpfWA7XG4gICAgZm9ybWF0UGFyYW1zID0gbnVsbDtcbiAgfSBlbHNlIGlmKHBhcmFtcykge1xuICAgIGZvcm1hdEhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgIGZvcm1hdEhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgIGZvcm1hdFBhcmFtcyA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZm9ybWF0UGFyYW1zID0gcGFyYW1zO1xuICB9XG5cbiAgLy8gQXV0aGVudGljYXRpb24gdG9rZW5cbiAgaWYoIWlzRW1wdHkoZm9ybWF0VG9rZW4pKSB7XG4gICAgZm9ybWF0SGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCBgQmVhcmVyICR7Zm9ybWF0VG9rZW59YCk7XG4gIH1cblxuICBsZXQgaXNSZXNwb25zZUpzb246IGJvb2xlYW47XG5cbiAgcmV0dXJuIGZldGNoKGZvcm1hdFVybCwge2JvZHk6IGZvcm1hdFBhcmFtcywgaGVhZGVyczogZm9ybWF0SGVhZGVycywgbWV0aG9kOiBmb3JtYXRNZXRob2R9KVxuICAgIC50aGVuKChyZXNwb25zZTogUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gL2FwcGxpY2F0aW9uXFwvanNvbi9pO1xuXG4gICAgICAvLyBDaGVjayBpZiByZXNwb25zZSBpcyBqc29uXG4gICAgICBpc1Jlc3BvbnNlSnNvbiA9IHJlZ2V4LnRlc3QocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpIHx8ICcnKTtcblxuICAgICAgaWYoaXNSZXNwb25zZUpzb24pIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICB9KVxuICAgIC50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgICBpZihpc1Jlc3BvbnNlSnNvbikge1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBpZigoZXJyb3IgfHwge30pLm1lc3NhZ2UgPT09ICdvbmx5IGFic29sdXRlIHVybHMgYXJlIHN1cHBvcnRlZCcpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBcGlFcnJvcihbe21lc3NhZ2U6ICdpbnZhbGlkX3VybCd9XSwgZXJyb3IpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBcGlFcnJvcihbe21lc3NhZ2U6ICduZXR3b3JrX2Vycm9yJ31dLCBlcnJvcikpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldCA9ICh1cmw6IHN0cmluZywgcGFyYW1zPywgb3B0aW9ucz86IEh1bnRlck9wdGlvbnNUeXBlKTogUHJvbWlzZTxhbnk+ID0+IGFqYXgodXJsLCAnR0VUJywgcGFyYW1zLCBvcHRpb25zKTtcblxuZXhwb3J0IGNvbnN0IHBvc3QgPSAodXJsOiBzdHJpbmcsIHBhcmFtcz8sIG9wdGlvbnM/OiBIdW50ZXJPcHRpb25zVHlwZSk6IFByb21pc2U8YW55PiA9PiBhamF4KHVybCwgJ1BPU1QnLCBwYXJhbXMsIG9wdGlvbnMpO1xuXG5leHBvcnQgY29uc3QgcHV0ID0gKHVybDogc3RyaW5nLCBwYXJhbXM/LCBvcHRpb25zPzogSHVudGVyT3B0aW9uc1R5cGUpOiBQcm9taXNlPGFueT4gPT4gYWpheCh1cmwsICdQVVQnLCBwYXJhbXMsIG9wdGlvbnMpO1xuXG5leHBvcnQgY29uc3QgZGVsID0gKHVybDogc3RyaW5nLCBwYXJhbXM/LCBvcHRpb25zPzogSHVudGVyT3B0aW9uc1R5cGUpOiBQcm9taXNlPGFueT4gPT4gYWpheCh1cmwsICdERUxFVEUnLCBwYXJhbXMsIG9wdGlvbnMpO1xuXG4vLyBHcmFwaFFMXG5leHBvcnQgY29uc3QgdG9HcWwgPSAob2JqOiBhbnkpOiBzdHJpbmcgPT4ge1xuICBpZihpc1N0cmluZyhvYmopKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7XG4gIH0gZWxzZSBpZihpc1BsYWluT2JqZWN0KG9iaikpIHtcbiAgICBsZXQgY2xlYW5PYmogPSBvbWl0KG9iaiwgaXNVbmRlZmluZWQpO1xuICAgIGNsZWFuT2JqID0gb21pdChjbGVhbk9iaiwgaXNOdWxsKTtcblxuICAgIGNvbnN0IGdxbFByb3BzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGNsZWFuT2JqKS5yZWR1Y2UoKHByb3BzOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBvYmpba2V5XTtcblxuICAgICAgaWYoaXNQbGFpbk9iamVjdChpdGVtKSkge1xuICAgICAgICBwcm9wcy5wdXNoKHRvR3FsKGl0ZW0pKTtcbiAgICAgIH0gZWxzZSBpZihpc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBpdGVtLm1hcCgobGlzdEl0ZW0pID0+IHRvR3FsKGxpc3RJdGVtKSk7XG4gICAgICAgIHByb3BzLnB1c2goYCR7a2V5fTogWyR7bGlzdC5qb2luKCcsICcpfV1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IEpTT04uc3RyaW5naWZ5KGl0ZW0pO1xuXG4gICAgICAgIGlmKHZhbCkge1xuICAgICAgICAgIHByb3BzLnB1c2goYCR7a2V5fTogJHt2YWx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IGdxbFByb3BzLmpvaW4oJywgJyk7XG5cbiAgICBpZih2YWx1ZXMgPT09ICcnKSB7XG4gICAgICByZXR1cm4gJ1wiXCInO1xuICAgIH1cblxuICAgIHJldHVybiBgeyR7Z3FsUHJvcHMuam9pbignLCAnKX19YDtcbiAgfSBlbHNlIGlmKGlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBgWyR7b2JqLm1hcCgob2JqSXRlbSkgPT4gdG9HcWwob2JqSXRlbSkpLnRvU3RyaW5nKCl9XWA7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxuZXhwb3J0IGNvbnN0IGdyYXBocWxRdWVyeSA9IChcbiAgdXJsOiBzdHJpbmcsXG4gIHF1ZXJ5OiBIdW50ZXJRdWVyeVR5cGUgfCBIdW50ZXJRdWVyeVR5cGVbXSxcbiAgb3B0aW9uczogSHVudGVyT3B0aW9uc1R5cGUgPSB7fVxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge2hlYWRlcnMsIHRva2VufSA9IG9wdGlvbnM7XG4gIGNvbnN0IGZvcm1hdFVybDogc3RyaW5nID0gdXJsID8gdXJsLnRyaW0oKSA6ICcnO1xuICBjb25zdCBmb3JtYXRUb2tlbjogc3RyaW5nID0gKHRva2VuIHx8ICcnKS50cmltKCk7XG4gIGNvbnN0IGZvcm1hdEhlYWRlcnM6IEhlYWRlcnMgPSBoZWFkZXJzIHx8IG5ldyBIZWFkZXJzKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSk7XG5cbiAgaWYoZm9ybWF0VG9rZW4gIT09ICcnKSB7XG4gICAgZm9ybWF0SGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCBgQmVhcmVyICR7Zm9ybWF0VG9rZW59YCk7XG4gIH1cblxuICByZXR1cm4gZmV0Y2goZm9ybWF0VXJsLCB7Ym9keTogSlNPTi5zdHJpbmdpZnkocXVlcnkpLCBoZWFkZXJzOiBmb3JtYXRIZWFkZXJzLCBtZXRob2Q6ICdwb3N0J30pXG4gICAgLnRoZW4oKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVnZXg6IFJlZ0V4cCA9IC9hcHBsaWNhdGlvblxcL2pzb24vaTtcbiAgICAgIGNvbnN0IGlzSnNvbjogYm9vbGVhbiA9IHJlZ2V4LnRlc3QocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpIHx8ICcnKTtcblxuICAgICAgaWYoaXNKc29uICYmIHJlc3BvbnNlLmJvZHkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7IC8vIHtkYXRhOiB7fX07XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBpZigoZXJyb3IgfHwge30pLm1lc3NhZ2UgPT09ICdvbmx5IGFic29sdXRlIHVybHMgYXJlIHN1cHBvcnRlZCcpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBcGlFcnJvcihbe21lc3NhZ2U6ICdpbnZhbGlkX3VybCd9XSwgZXJyb3IpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBcGlFcnJvcihbe21lc3NhZ2U6ICduZXR3b3JrX2Vycm9yJ31dLCBlcnJvcikpO1xuICAgIH0pXG4gICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgIGxldCB1cGRhdGVkSnNvbjogYW55ID0ge307XG5cbiAgICAgIGlmKCFqc29uIHx8IGpzb24uZXJyb3JzKSB7XG4gICAgICAgIGlmKCFqc29uKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBcGlFcnJvcihbe21lc3NhZ2U6ICdhcGlfZXJyb3InfV0sIG5ldyBFcnJvcigpKSk7XG4gICAgICAgIH0gZWxzZSBpZigoanNvbi5lcnJvcnMgfHwgW10pLnNvbWUoKGVycm9yKSA9PiBlcnJvci5tZXNzYWdlID09PSAnTXVzdCBwcm92aWRlIHF1ZXJ5IHN0cmluZy4nKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgQXBpRXJyb3IoW3ttZXNzYWdlOiAncmVxdWlyZWRfcXVlcnknfV0sIG5ldyBFcnJvcigpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ganNvbi5lcnJvcnMgPyBQcm9taXNlLnJlamVjdChuZXcgQXBpRXJyb3IoanNvbi5lcnJvcnMsIG5ldyBFcnJvcigpKSkgOiB1cGRhdGVkSnNvbjtcbiAgICAgIH0gZWxzZSBpZihqc29uKSB7XG4gICAgICAgIHVwZGF0ZWRKc29uID0gey4uLmpzb259O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZEpzb24uZGF0YSB8fCB7fTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEFwaUVycm9yKSA9PiB7XG4gICAgICBsZXQgdXBkYXRlZEVycm9yID0gZXJyb3I7XG5cbiAgICAgIGlmKCFlcnJvci5zb3VyY2UpIHtcbiAgICAgICAgdXBkYXRlZEVycm9yID0gbmV3IEFwaUVycm9yKFt7bWVzc2FnZTogJ25ldHdvcmtfZXJyb3InfV0sIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHVwZGF0ZWRFcnJvcik7XG4gICAgfSk7XG59O1xuXG5leHBvcnQge0FwaUVycm9yfSBmcm9tICcuL2Vycm9ycy9BcGlFcnJvcic7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUEscUJBQW9CO0FBQ3BCLHFCQUFvQjtBQUNwQixvQkFBbUI7QUFDbkIsMkJBQTBCO0FBQzFCLHNCQUFxQjtBQUNyQix5QkFBd0I7QUFDeEIsa0JBQWlCO0FBRWpCLHNCQUF1QjtBQW1NdkIsSUFBQUEsbUJBQXVCO0FBak12QixJQUFHLE9BQU8sV0FBVyxhQUFhO0FBQ2hDLFVBQVEsc0JBQXNCO0FBQ2hDO0FBZ0JPLE1BQU0sZUFBZSxDQUFDLFFBQXdCLElBQUksUUFBUSw2Q0FBNkMsRUFBRTtBQUV6RyxNQUFNLGNBQWMsQ0FBQyxTQUFzQixPQUMvQyxLQUFLLElBQUksRUFDVCxJQUFJLENBQUMsUUFBZ0IsR0FBRyxtQkFBbUIsR0FBRyxDQUFDLElBQUksbUJBQW1CLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssR0FBRztBQUd4RixNQUFNLE9BQU8sQ0FBQyxLQUFhLFFBQWdCLFFBQVMsVUFBNkIsQ0FBQyxNQUFvQjtBQUMzRyxRQUFNLEVBQUMsU0FBUyxNQUFLLElBQUk7QUFFekIsTUFBSSxhQUFxQixPQUFPLElBQUksS0FBSztBQUN6QyxRQUFNLGVBQXVCLFNBQVMsSUFBSSxLQUFLO0FBQy9DLFFBQU0sZ0JBQXlCLFdBQVcsSUFBSSxRQUFRO0FBR3RELFFBQU0sZ0JBQXdCLFVBQVUsT0FBTyxZQUFZO0FBQzNELE1BQUk7QUFHSixNQUFHLFVBQVUsaUJBQWlCLE9BQU87QUFDbkMsZ0JBQVksR0FBRyxTQUFTLElBQUksWUFBWSxNQUFNLENBQUM7QUFDL0MsbUJBQWU7QUFBQSxFQUNqQixXQUFVLFFBQVE7QUFDaEIsa0JBQWMsSUFBSSxVQUFVLGtCQUFrQjtBQUM5QyxrQkFBYyxJQUFJLGdCQUFnQixrQkFBa0I7QUFDcEQsbUJBQWUsS0FBSyxVQUFVLE1BQU07QUFBQSxFQUN0QyxPQUFPO0FBQ0wsbUJBQWU7QUFBQSxFQUNqQjtBQUdBLE1BQUcsS0FBQyxlQUFBQyxTQUFRLFdBQVcsR0FBRztBQUN4QixrQkFBYyxJQUFJLGlCQUFpQixVQUFVLFdBQVcsRUFBRTtBQUFBLEVBQzVEO0FBRUEsTUFBSTtBQUVKLFNBQU8sTUFBTSxXQUFXLEVBQUMsTUFBTSxjQUFjLFNBQVMsZUFBZSxRQUFRLGFBQVksQ0FBQyxFQUN2RixLQUFLLENBQUMsYUFBdUI7QUFDNUIsVUFBTSxRQUFRO0FBR2QscUJBQWlCLE1BQU0sS0FBSyxTQUFTLFFBQVEsSUFBSSxjQUFjLEtBQUssRUFBRTtBQUV0RSxRQUFHLGdCQUFnQjtBQUNqQixhQUFPLFNBQVMsS0FBSztBQUFBLElBQ3ZCO0FBRUEsV0FBTyxTQUFTLEtBQUs7QUFBQSxFQUN2QixDQUFDLEVBQ0EsS0FBSyxDQUFDLFlBQVk7QUFDakIsUUFBRyxnQkFBZ0I7QUFDakIsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPO0FBQUEsRUFDVCxDQUFDLEVBQ0EsTUFBTSxDQUFDLFVBQVU7QUFDaEIsU0FBSSxTQUFTLENBQUMsR0FBRyxZQUFZLG9DQUFvQztBQUMvRCxhQUFPLFFBQVEsT0FBTyxJQUFJLHlCQUFTLENBQUMsRUFBQyxTQUFTLGNBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUFBLElBQ3ZFO0FBRUEsV0FBTyxRQUFRLE9BQU8sSUFBSSx5QkFBUyxDQUFDLEVBQUMsU0FBUyxnQkFBZSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDekUsQ0FBQztBQUNMO0FBRU8sTUFBTSxNQUFNLENBQUMsS0FBYSxRQUFTLFlBQThDLEtBQUssS0FBSyxPQUFPLFFBQVEsT0FBTztBQUVqSCxNQUFNLE9BQU8sQ0FBQyxLQUFhLFFBQVMsWUFBOEMsS0FBSyxLQUFLLFFBQVEsUUFBUSxPQUFPO0FBRW5ILE1BQU0sTUFBTSxDQUFDLEtBQWEsUUFBUyxZQUE4QyxLQUFLLEtBQUssT0FBTyxRQUFRLE9BQU87QUFFakgsTUFBTSxNQUFNLENBQUMsS0FBYSxRQUFTLFlBQThDLEtBQUssS0FBSyxVQUFVLFFBQVEsT0FBTztBQUdwSCxNQUFNLFFBQVEsQ0FBQyxRQUFxQjtBQUN6QyxVQUFHLGdCQUFBQyxTQUFTLEdBQUcsR0FBRztBQUNoQixXQUFPLEtBQUssVUFBVSxHQUFHO0FBQUEsRUFDM0IsZUFBVSxxQkFBQUMsU0FBYyxHQUFHLEdBQUc7QUFDNUIsUUFBSSxlQUFXLFlBQUFDLFNBQUssS0FBSyxtQkFBQUMsT0FBVztBQUNwQyxtQkFBVyxZQUFBRCxTQUFLLFVBQVUsY0FBQUUsT0FBTTtBQUVoQyxVQUFNLFdBQXFCLE9BQU8sS0FBSyxRQUFRLEVBQUUsT0FBTyxDQUFDLE9BQWlCLFFBQWdCO0FBQ3hGLFlBQU0sT0FBTyxJQUFJLEdBQUc7QUFFcEIsY0FBRyxxQkFBQUgsU0FBYyxJQUFJLEdBQUc7QUFDdEIsY0FBTSxLQUFLLE1BQU0sSUFBSSxDQUFDO0FBQUEsTUFDeEIsZUFBVSxlQUFBSSxTQUFRLElBQUksR0FBRztBQUN2QixjQUFNLE9BQU8sS0FBSyxJQUFJLENBQUMsYUFBYSxNQUFNLFFBQVEsQ0FBQztBQUNuRCxjQUFNLEtBQUssR0FBRyxHQUFHLE1BQU0sS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHO0FBQUEsTUFDM0MsT0FBTztBQUNMLGNBQU0sTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUUvQixZQUFHLEtBQUs7QUFDTixnQkFBTSxLQUFLLEdBQUcsR0FBRyxLQUFLLEdBQUcsRUFBRTtBQUFBLFFBQzdCO0FBQUEsTUFDRjtBQUVBLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQyxDQUFDO0FBRUwsVUFBTSxTQUFTLFNBQVMsS0FBSyxJQUFJO0FBRWpDLFFBQUcsV0FBVyxJQUFJO0FBQ2hCLGFBQU87QUFBQSxJQUNUO0FBRUEsV0FBTyxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUM7QUFBQSxFQUNoQyxlQUFVLGVBQUFBLFNBQVEsR0FBRyxHQUFHO0FBQ3RCLFdBQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLE1BQU0sT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDO0FBQUEsRUFDNUQ7QUFFQSxTQUFPO0FBQ1Q7QUFFTyxNQUFNLGVBQWUsQ0FDMUIsS0FDQSxPQUNBLFVBQTZCLENBQUMsTUFDYjtBQUNqQixRQUFNLEVBQUMsU0FBUyxNQUFLLElBQUk7QUFDekIsUUFBTSxZQUFvQixNQUFNLElBQUksS0FBSyxJQUFJO0FBQzdDLFFBQU0sZUFBdUIsU0FBUyxJQUFJLEtBQUs7QUFDL0MsUUFBTSxnQkFBeUIsV0FBVyxJQUFJLFFBQVEsRUFBQyxnQkFBZ0IsbUJBQWtCLENBQUM7QUFFMUYsTUFBRyxnQkFBZ0IsSUFBSTtBQUNyQixrQkFBYyxJQUFJLGlCQUFpQixVQUFVLFdBQVcsRUFBRTtBQUFBLEVBQzVEO0FBRUEsU0FBTyxNQUFNLFdBQVcsRUFBQyxNQUFNLEtBQUssVUFBVSxLQUFLLEdBQUcsU0FBUyxlQUFlLFFBQVEsT0FBTSxDQUFDLEVBQzFGLEtBQUssQ0FBQyxhQUF1QjtBQUM1QixVQUFNLFFBQWdCO0FBQ3RCLFVBQU0sU0FBa0IsTUFBTSxLQUFLLFNBQVMsUUFBUSxJQUFJLGNBQWMsS0FBSyxFQUFFO0FBRTdFLFFBQUcsVUFBVSxTQUFTLE1BQU07QUFDMUIsYUFBTyxTQUFTLEtBQUs7QUFBQSxJQUN2QjtBQUVBLFdBQU87QUFBQSxFQUNULENBQUMsRUFDQSxNQUFNLENBQUMsVUFBVTtBQUNoQixTQUFJLFNBQVMsQ0FBQyxHQUFHLFlBQVksb0NBQW9DO0FBQy9ELGFBQU8sUUFBUSxPQUFPLElBQUkseUJBQVMsQ0FBQyxFQUFDLFNBQVMsY0FBYSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQUEsSUFDdkU7QUFFQSxXQUFPLFFBQVEsT0FBTyxJQUFJLHlCQUFTLENBQUMsRUFBQyxTQUFTLGdCQUFlLENBQUMsR0FBRyxLQUFLLENBQUM7QUFBQSxFQUN6RSxDQUFDLEVBQ0EsS0FBSyxDQUFDLFNBQVM7QUFDZCxRQUFJLGNBQW1CLENBQUM7QUFFeEIsUUFBRyxDQUFDLFFBQVEsS0FBSyxRQUFRO0FBQ3ZCLFVBQUcsQ0FBQyxNQUFNO0FBQ1IsZUFBTyxRQUFRLE9BQU8sSUFBSSx5QkFBUyxDQUFDLEVBQUMsU0FBUyxZQUFXLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxDQUFDO0FBQUEsTUFDM0UsWUFBVyxLQUFLLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLE1BQU0sWUFBWSw0QkFBNEIsR0FBRztBQUM3RixlQUFPLFFBQVEsT0FBTyxJQUFJLHlCQUFTLENBQUMsRUFBQyxTQUFTLGlCQUFnQixDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQztBQUFBLE1BQ2hGO0FBRUEsYUFBTyxLQUFLLFNBQVMsUUFBUSxPQUFPLElBQUkseUJBQVMsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLENBQUMsSUFBSTtBQUFBLElBQ2hGLFdBQVUsTUFBTTtBQUNkLG9CQUFjLEVBQUMsR0FBRyxLQUFJO0FBQUEsSUFDeEI7QUFFQSxXQUFPLFlBQVksUUFBUSxDQUFDO0FBQUEsRUFDOUIsQ0FBQyxFQUNBLE1BQU0sQ0FBQyxVQUFvQjtBQUMxQixRQUFJLGVBQWU7QUFFbkIsUUFBRyxDQUFDLE1BQU0sUUFBUTtBQUNoQixxQkFBZSxJQUFJLHlCQUFTLENBQUMsRUFBQyxTQUFTLGdCQUFlLENBQUMsR0FBRyxLQUFLO0FBQUEsSUFDakU7QUFFQSxXQUFPLFFBQVEsT0FBTyxZQUFZO0FBQUEsRUFDcEMsQ0FBQztBQUNMOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfQXBpRXJyb3IiLCAiaXNFbXB0eSIsICJpc1N0cmluZyIsICJpc1BsYWluT2JqZWN0IiwgIm9taXQiLCAiaXNVbmRlZmluZWQiLCAiaXNOdWxsIiwgImlzQXJyYXkiXQp9Cg==