hivessh
Version:
HiveSsh is an innovative library designed to streamline SSH2 connections and simplify task execution on Linux servers.
137 lines • 17.9 kB
JavaScript
import { filterEmpty, trimAll } from "../../utils/base.js";
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
*/
export const yumEnv = {
LANG: "en_US.UTF-8"
};
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
*/
export const ignoredErrMsgs = [
"transaction completed",
"base",
"cleaning up",
"warning",
];
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
* @param data
* @returns
*/
export const ignoreMessageFilter = (data) => {
let data2 = trimAll(data).toLowerCase();
for (const msg of ignoredErrMsgs) {
if (data2.includes(msg)) {
return undefined;
}
}
return data;
};
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
* @param exit
* @returns
*/
export const parseYumList = (exit) => {
const trimmedLines = filterEmpty(exit.out.split("\n"));
const packages = trimmedLines.slice(1).map((line) => line.split(/\s+/)[0]);
return packages;
};
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
* @param exit
* @returns
*/
export const parseYumDescription = (exit) => {
const infoLines = exit.out.split("\n").filter((line) => line.includes(":"));
const fields = {};
for (const infoLine of infoLines) {
const [key, value] = infoLine.trim().split(":");
fields[key.toLowerCase()] = value.trim();
}
if (!fields.hasOwnProperty("name") || !fields.hasOwnProperty("version")) {
throw new Error("Required fields 'name' or 'version' missing in Yum package info");
}
return {
name: fields.name,
version: fields.version,
description: fields.description || "",
fields,
};
};
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
* @param sshHost
* @param cmdTimeoutMillis
* @returns
*/
export const initYumApm = (sshHost, cmdTimeoutMillis) => {
return {
type: "yum",
sshHost,
//### cache
updateCache: async () => {
return sshHost.exec("yum makecache", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: yumEnv,
}).then();
},
clearCache: async () => {
return sshHost.exec("yum clean all", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: yumEnv,
}).then();
},
//### edit
install: (...pkgs) => sshHost.exec("yum install -y " + pkgs.join(" "), {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: yumEnv,
}).then(),
uninstall: (...pkgs) => sshHost.exec("yum remove -y " + pkgs.join(" "), {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: yumEnv,
}).then(),
//### maintenance
upgradeAll: () => sshHost.exec("yum upgrade -y", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: yumEnv,
}).then(),
uninstallUnused: () => sshHost.exec("yum autoremove -y", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: yumEnv,
}).then(),
//### get
list: () => sshHost.exec("yum list installed", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: yumEnv,
}).then(parseYumList),
upgradable: () => sshHost.exec("yum list updates", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: yumEnv,
}).then(parseYumList),
describe: (pkg) => sshHost.exec("yum info " + pkg, {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: yumEnv,
}).then(parseYumDescription),
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwbS9pbXBsL3l1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQWEsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBR3JFOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHO0lBQ2xCLElBQUksRUFBRSxhQUFhO0NBQ3RCLENBQUE7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBYTtJQUNwQyx1QkFBdUI7SUFDdkIsTUFBTTtJQUNOLGFBQWE7SUFDYixTQUFTO0NBQ1osQ0FBQTtBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBcUIsQ0FDakQsSUFBWSxFQUNkLEVBQUU7SUFDQSxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDdkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMvQixJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQ3JCLENBQUM7WUFDQyxPQUFPLFNBQVMsQ0FBQTtRQUNwQixDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLElBQW9CLEVBQVksRUFBRTtJQUMzRCxNQUFNLFlBQVksR0FBRyxXQUFXLENBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUN2QixDQUFBO0lBQ0QsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMs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RUFBRSxNQUFNO1NBQ2QsQ0FDSixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztLQUNsQyxDQUFBO0FBQ0wsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3NoQ2hhbm5lbEV4aXQsIFN0cmVhbURhdGFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vU3NoRXhlYy5qc1wiXG5pbXBvcnQgeyBTc2hIb3N0IH0gZnJvbSBcIi4uLy4uL1NzaEhvc3QuanNcIlxuaW1wb3J0IHsgQXdhaXRhYmxlLCBmaWx0ZXJFbXB0eSwgdHJpbUFsbCB9IGZyb20gXCIuLi8uLi91dGlscy9iYXNlLmpzXCJcbmltcG9ydCB7IEFic3RyYWN0UGFja2FnZSwgQWJzdHJhY3RQYWNrYWdlTWFuYWdlciwgQXBtSW5pdCB9IGZyb20gXCIuLi9hcG0uanNcIlxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFRoZSBBYnN0cmFjdFBhY2thZ2VNYW5hZ2VyIChBUE0pIGZlYXR1cmUgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUgdG8gbW9yZSBmb2N1cyBvbiB0aGUgY29yZSBwcm9ibGVtcyBhbmQgc29sdXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCB5dW1FbnYgPSB7XG4gICAgTEFORzogXCJlbl9VUy5VVEYtOFwiXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVGhlIEFic3RyYWN0UGFja2FnZU1hbmFnZXIgKEFQTSkgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSB0byBtb3JlIGZvY3VzIG9uIHRoZSBjb3JlIHByb2JsZW1zIGFuZCBzb2x1dGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlnbm9yZWRFcnJNc2dzOiBzdHJpbmdbXSA9IFtcbiAgICBcInRyYW5zYWN0aW9uIGNvbXBsZXRlZFwiLFxuICAgIFwiYmFzZVwiLFxuICAgIFwiY2xlYW5pbmcgdXBcIixcbiAgICBcIndhcm5pbmdcIixcbl1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBUaGUgQWJzdHJhY3RQYWNrYWdlTWFuYWdlciAoQVBNKSBmZWF0dXJlIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlIHRvIG1vcmUgZm9jdXMgb24gdGhlIGNvcmUgcHJvYmxlbXMgYW5kIHNvbHV0aW9uc1xuICogQHBhcmFtIGRhdGEgXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGNvbnN0IGlnbm9yZU1lc3NhZ2VGaWx0ZXI6IFN0cmVhbURhdGFNYXBwZXIgPSAoXG4gICAgZGF0YTogc3RyaW5nXG4pID0+IHtcbiAgICBsZXQgZGF0YTIgPSB0cmltQWxsKGRhdGEpLnRvTG93ZXJDYXNlKClcbiAgICBmb3IgKGNvbnN0IG1zZyBvZiBpZ25vcmVkRXJyTXNncykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhMi5pbmNsdWRlcyhtc2cpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVGhlIEFic3RyYWN0UGFja2FnZU1hbmFnZXIgKEFQTSkgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSB0byBtb3JlIGZvY3VzIG9uIHRoZSBjb3JlIHByb2JsZW1zIGFuZCBzb2x1dGlvbnNcbiAqIEBwYXJhbSBleGl0IFxuICogQHJldHVybnMgXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZVl1bUxpc3QgPSAoZXhpdDogU3NoQ2hhbm5lbEV4aXQpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgdHJpbW1lZExpbmVzID0gZmlsdGVyRW1wdHkoXG4gICAgICAgIGV4aXQub3V0LnNwbGl0KFwiXFxuXCIpXG4gICAgKVxuICAgIGNvbnN0IHBhY2thZ2VzID0gdHJpbW1lZExpbmVzLnNsaWNlKDEpLm1hcCgobGluZSkgPT4gbGluZS5zcGxpdCgvXFxzKy8pWzBdKVxuICAgIHJldHVybiBwYWNrYWdlc1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFRoZSBBYnN0cmFjdFBhY2thZ2VNYW5hZ2VyIChBUE0pIGZlYXR1cmUgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUgdG8gbW9yZSBmb2N1cyBvbiB0aGUgY29yZSBwcm9ibGVtcyBhbmQgc29sdXRpb25zXG4gKiBAcGFyYW0gZXhpdCBcbiAqIEByZXR1cm5zIFxuICovXG5leHBvcnQgY29uc3QgcGFyc2VZdW1EZXNjcmlwdGlvbiA9IChleGl0OiBTc2hDaGFubmVsRXhpdCk6IEFic3RyYWN0UGFja2FnZSA9PiB7XG4gICAgY29uc3QgaW5mb0xpbmVzID0gZXhpdC5vdXQuc3BsaXQoXCJcXG5cIikuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmluY2x1ZGVzKFwiOlwiKSlcblxuICAgIGNvbnN0IGZpZWxkczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9XG4gICAgZm9yIChjb25zdCBpbmZvTGluZSBvZiBpbmZvTGluZXMpIHtcbiAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gaW5mb0xpbmUudHJpbSgpLnNwbGl0KFwiOlwiKVxuICAgICAgICBmaWVsZHNba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWUudHJpbSgpXG4gICAgfVxuXG4gICAgaWYgKCFmaWVsZHMuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpIHx8ICFmaWVsZHMuaGFzT3duUHJvcGVydHkoXCJ2ZXJzaW9uXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiUmVxdWlyZWQgZmllbGRzICduYW1lJyBvciAndmVyc2lvbicgbWlzc2luZyBpbiBZdW0gcGFja2FnZSBpbmZvXCJcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGZpZWxkcy5uYW1lISxcbiAgICAgICAgdmVyc2lvbjogZmllbGRzLnZlcnNpb24hLFxuICAgICAgICBkZXNjcmlwdGlvbjogZmllbGRzLmRlc2NyaXB0aW9uIHx8IFwiXCIsXG4gICAgICAgIGZpZWxkcyxcbiAgICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVGhlIEFic3RyYWN0UGFja2FnZU1hbmFnZXIgKEFQTSkgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSB0byBtb3JlIGZvY3VzIG9uIHRoZSBjb3JlIHByb2JsZW1zIGFuZCBzb2x1dGlvbnNcbiAqIEBwYXJhbSBzc2hIb3N0IFxuICogQHBhcmFtIGNtZFRpbWVvdXRNaWxsaXMgXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGNvbnN0IGluaXRZdW1BcG06IEFwbUluaXQgPSAoXG4gICAgc3NoSG9zdDogU3NoSG9zdCxcbiAgICBjbWRUaW1lb3V0TWlsbGlzPzogbnVtYmVyIHwgdW5kZWZpbmVkLFxuKTogQXdhaXRhYmxlPEFic3RyYWN0UGFja2FnZU1hbmFnZXI+ID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInl1bVwiLFxuICAgICAgICBzc2hIb3N0LFxuXG4gICAgICAgIC8vIyMjIGNhY2hlXG4gICAgICAgIHVwZGF0ZUNhY2hlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3NoSG9zdC5leGVjKFxuICAgICAgICAgICAgICAgIFwieXVtIG1ha2VjYWNoZVwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VkbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dE1pbGxpczogY21kVGltZW91dE1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgbWFwRXJyT3V0OiBpZ25vcmVNZXNzYWdlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICBlbnY6IHl1bUVudixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLnRoZW4oKVxuICAgICAgICB9LFxuICAgICAgICBjbGVhckNhY2hlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3NoSG9zdC5leGVjKFxuICAgICAgICAgICAgICAgIFwieXVtIGNsZWFuIGFsbFwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VkbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dE1pbGxpczogY21kVGltZW91dE1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgbWFwRXJyT3V0OiBpZ25vcmVNZXNzYWdlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICBlbnY6IHl1bUVudixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLnRoZW4oKVxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIyMjIGVkaXRcbiAgICAgICAgaW5zdGFsbDogKC4uLnBrZ3M6IHN0cmluZ1tdKSA9PlxuICAgICAgICAgICAgc3NoSG9zdC5leGVjKFxuICAgICAgICAgICAgICAgIFwieXVtIGluc3RhbGwgLXkgXCIgKyBwa2dzLmpvaW4oXCIgXCIpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VkbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dE1pbGxpczogY21kVGltZW91dE1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgbWFwRXJyT3V0OiBpZ25vcmVNZXNzYWdlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICBlbnY6IHl1bUVudixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLnRoZW4oKSxcbiAgICAgICAgdW5pbnN0YWxsOiAoLi4ucGtnczogc3RyaW5nW10pID0+XG4gICAgICAgICAgICBzc2hIb3N0LmV4ZWMoXG4gICAgICAgICAgICAgICAgXCJ5dW0gcmVtb3ZlIC15IFwiICsgcGtncy5qb2luKFwiIFwiKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN1ZG86IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRNaWxsaXM6IGNtZFRpbWVvdXRNaWxsaXMsXG4gICAgICAgICAgICAgICAgICAgIG1hcEVyck91dDogaWdub3JlTWVzc2FnZUZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgZW52OiB5dW1FbnYsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS50aGVuKCksXG5cbiAgICAgICAgLy8jIyMgbWFpbnRlbmFuY2VcbiAgICAgICAgdXBncmFkZUFsbDogKCkgPT5cbiAgICAgICAgICAgIHNzaEhvc3QuZXhlYyhcbiAgICAgICAgICAgICAgICBcInl1bSB1cGdyYWRlIC15XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdWRvOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0TWlsbGlzOiBjbWRUaW1lb3V0TWlsbGlzLFxuICAgICAgICAgICAgICAgICAgICBtYXBFcnJPdXQ6IGlnbm9yZU1lc3NhZ2VGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgIGVudjogeXVtRW52LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkudGhlbigpLFxuICAgICAgICB1bmluc3RhbGxVbnVzZWQ6ICgpID0+XG4gICAgICAgICAgICBzc2hIb3N0LmV4ZWMoXG4gICAgICAgICAgICAgICAgXCJ5dW0gYXV0b3JlbW92ZSAteVwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VkbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dE1pbGxpczogY21kVGltZW91dE1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgbWFwRXJyT3V0OiBpZ25vcmVNZXNzYWdlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICBlbnY6IHl1bUVudixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLnRoZW4oKSxcblxuICAgICAgICAvLyMjIyBnZXRcbiAgICAgICAgbGlzdDogKCkgPT5cbiAgICAgICAgICAgIHNzaEhvc3QuZXhlYyhcbiAgICAgICAgICAgICAgICBcInl1bSBsaXN0IGluc3RhbGxlZFwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VkbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dE1pbGxpczogY21kVGltZW91dE1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgbWFwRXJyT3V0OiBpZ25vcmVNZXNzYWdlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICBlbnY6IHl1bUVudixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLnRoZW4ocGFyc2VZdW1MaXN0KSxcbiAgICAgICAgdXBncmFkYWJsZTogKCkgPT5cbiAgICAgICAgICAgIHNzaEhvc3QuZXhlYyhcbiAgICAgICAgICAgICAgICBcInl1bSBsaXN0IHVwZGF0ZXNcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN1ZG86IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRNaWxsaXM6IGNtZFRpbWVvdXRNaWxsaXMsXG4gICAgICAgICAgICAgICAgICAgIG1hcEVyck91dDogaWdub3JlTWVzc2FnZUZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgZW52OiB5dW1FbnYsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS50aGVuKHBhcnNlWXVtTGlzdCksXG4gICAgICAgIGRlc2NyaWJlOiAocGtnOiBzdHJpbmcpID0+XG4gICAgICAgICAgICBzc2hIb3N0LmV4ZWMoXG4gICAgICAgICAgICAgICAgXCJ5dW0gaW5mbyBcIiArIHBrZyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN1ZG86IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRNaWxsaXM6IGNtZFRpbWVvdXRNaWxsaXMsXG4gICAgICAgICAgICAgICAgICAgIG1hcEVyck91dDogaWdub3JlTWVzc2FnZUZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgZW52OiB5dW1FbnYsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS50aGVuKHBhcnNlWXVtRGVzY3JpcHRpb24pLFxuICAgIH1cbn1cbiJdfQ==