import { decodeNormMsg, encodeNormMsg } from "/src/comm/controllers/entity/message.ts"; import { Controller } from "/src/comm/core/controller.ts"; import __vite__cjsImport2_fileSaver from "/node_modules/.vite/deps/file-saver.js?v=fe35e769"; const saveAs = __vite__cjsImport2_fileSaver["saveAs"]; import { Base64 } from "/node_modules/.vite/deps/js-base64.js?v=f0a3e95a"; export class DeviceController extends Controller { ipc; constructor() { super(); if (window.ipc) { this.ipc = window.ipc; } else { this.ipc = { emit(name, ...args) { console.error("emit msg=>", name, args); }, on(name) { console.error("on message", name); } }; } this.initEvent(); } _conn; initEvent() { const scope = this; this.ipc.on("OnDragEnter", function(files) { scope.emit("onDragEnter", files); }); this.ipc.on("downloadsucc", (fpath, size) => { scope.emit("downloadsucc", fpath, size); }); this.ipc.emit("GetSocketUri", [], (uri) => { let conn = new WebSocket(uri); conn.onopen = (e) => { console.log("bus socket connected!!!"); }; conn.onclose = (evt) => { console.log("app bus socket conn closed", evt); setTimeout(() => { this._conn = new WebSocket(uri); }, 1e3); }; conn.onmessage = function(evt) { if (!evt.data || evt.data == "") return; try { const blob = evt.data; blob.arrayBuffer().then((buff) => { const msg = decodeNormMsg(new Uint8Array(buff)); scope.emit("on" + msg.sub, msg); }); } catch (error) { console.error(evt.data, typeof evt.data, error); } }; this._conn = conn; }); } async onReady() { this.profile = await this.getLocalAppProfile(); } profile = { wsPort: "", version: "", dataDir: "", exeDir: "", exeName: "", exePath: "" }; getLocalAppProfile() { return new Promise((r) => { const ipc = this.ipc; ipc.emit("LocalAppProfile", [], function(config) { r(config); }); }); } //选择磁盘文件夹 SelectDir() { const sid = Date.now(); const cbname = "c" + sid; return new Promise((r) => { const ipc = this.ipc; ipc.emit("SelectDir", [sid], function(ok) { console.log("call=>", ok); if (!ok) { r(""); } ipc.on(cbname, function(dir) { r(dir); }); }); }); } IsDirEmpty(dir) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("IsDirEmpty", [dir], function(ok) { r(ok); }); }); } IsFileExit(fpath) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("IsFileExit", [fpath], function(ok) { r(ok); }); }); } WriteFileText(dir, content) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("WriteFileText", [dir, content], function(ok) { r(ok); }); }); } ReadFileText(dir) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("ReadFileText", [dir], function(data) { r(data); }); }); } //拷贝文件 CopyFile(srcFile, targetFile) { const sid = Date.now(); const cbname = "copy" + sid; return new Promise((r) => { const ipc = this.ipc; ipc.on(cbname, function(ok) { r(ok); }); ipc.emit("CopyFile", [cbname, srcFile, targetFile]); }); } //保存应用级的配置 SaveSysConfigItem(key, value) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("SaveAppConfigItem", [key, value], function(data) { r(data); }); }); } GetSysConfigItem(key) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("GetAppConfigItem", [key], function(data) { r(data); }); }); } RemoveSysConfigItem(key) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("RemoveSysConfigItem", [key], function(data) { r(data); }); }); } //获取应用的baseUrl GetSysDataBaseUrl() { return new Promise((r) => { const ipc = this.ipc; ipc.emit("GetAppDataBaseUrl", [], function(data) { r(data); }); }); } //获取应用的baseUrl CopyFileToAppData(src, targetRelativePath) { return new Promise((r) => { const ipc = this.ipc; ipc.emit( "CopyFileToAppData", [src, targetRelativePath], function(data) { r(data); } ); }); } RemoveAppData(targetRelativePath) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("RemoveAppData", [targetRelativePath], function(data) { r(data); }); }); } //打开文件所在的目录 OpenDir(dir) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("OpenDir", [dir], function(data) { r(data); }); }); } SelectOneFilePath(title, filters) { const sid = Date.now(); return new Promise((r) => { const ipc = this.ipc; const cbname = "c" + sid; ipc.emit( "SelectOneFilePath", [sid, title, filters], function(ok) { if (!ok) { r(""); } ipc.on(cbname, function(dir) { r(dir); }); } ); }); } //开启projects 的httpserver StartHttpServer(prjFile) { const sid = Date.now(); return new Promise((r) => { const ipc = this.ipc; ipc.emit("StartProjectHttpServer", [prjFile], function(data) { r(data); }); }); } //下在线文件 默认超时时间20分钟 DownloadFile(url, fpath, timeoutSecend = 60 * 20, cb) { const sid = "d" + Date.now(); return new Promise((r) => { console.log(url, "==>", fpath); const cancel = this.OnMsg(sid, (data) => { cb && cb(data.type, data); if (data.type == "succ") { r(true); cancel.unbind(); return; } if (data.type == "error") { r(false); cancel.unbind(); } }); const ipc = this.ipc; ipc.emit( "DownloadFile", [sid, fpath, url, timeoutSecend], function(err) { console.log("DownloadFile callback"); if (err) { console.error(err); r(false); } } ); }); } Unzip(fpath, distDir, cb) { const sid = "unzip" + Date.now(); return new Promise((r) => { const cancel = this.OnMsg(sid, (data) => { cb && cb(data.type, data); if (data.type == "succ") { r(true); cancel.unbind(); return; } if (data.type == "error") { r(false); cancel.unbind(); } }); const ipc = this.ipc; ipc.emit("Unzip", [sid, fpath, distDir]); }); } //获取文件夹的大小 //文件目录不要太大,不然会卡死程序 GetDirSize(dir) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("GetDirSize", [dir], function(size) { r(size); }); }); } //获取系统数据目录 GetAppDataDir() { return new Promise((r) => { const ipc = this.ipc; ipc.emit("GetAppDataDir", [], function(dir) { r(dir); }); }); } OpenAssetWindow(projectPath) { return new Promise((r) => { const ipc = this.ipc; ipc.emit( "openAssetsWindow", [ `${location.host}/library.html?path=${projectPath}`, "资源管理库", 1280, 960 ], function(ok) { r(ok); } ); }); } SendMsg(subject, msg) { const conn = this._conn; if (!conn) { console.error("应用socket异常"); return; } conn.send(encodeNormMsg({ sub: subject, msg })); } OnMsg(subject, cb) { return this.on("on" + subject, cb); } //同步阻塞当前进程 UploadSync(files) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("UploadSync", [files], function(ret) { r(ret); }); }); } //异步上传不会阻塞当前进程 UploadASync(files) { const sid = "u" + Date.now(); return new Promise((r) => { const ipc = this.ipc; ipc.emit("UploadASync", [sid, files], function(ok) { if (!ok) { r([]); return; } ipc.on(sid, (items) => { r(items); }); }); }); } //异步上传不会阻塞当前进程 UploadDir(dir, targetDir) { const sid = "u" + Date.now(); return new Promise((r) => { const ipc = this.ipc; ipc.emit("UploadDir", [sid, dir, targetDir], function(ok) { if (!ok) { r([]); return; } ipc.on(sid, (items) => { r(items); }); }); }); } GetFilesInDir(dir, filter) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("GetFilesInDir", [dir, filter], function(ret) { r(ret); }); }); } GetRunningApp() { return new Promise((r) => { const ipc = this.ipc; ipc.emit( "GetRunningApp", [], function(apps) { r(apps); } ); }); } GetSubDirNames(dir) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("GetSubDirNames", [dir], function(ret) { r(ret); }); }); } RemoveFile(fpath) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("RemoveFile", [fpath], function(ok) { r(ok); }); }); } RemoveDir(fpath) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("RemoveDir", [fpath], function(ok) { r(ok); }); }); } GetSaveFile(title, filter = "图片(*.png;*.jpg)") { const sid = "sf" + Date.now(); return new Promise((r) => { const ipc = this.ipc; ipc.emit("GetSaveFile", [sid, title, filter], function(ok) { if (ok) { ipc.on(sid, (ret) => { r(ret); }); return; } r(""); }); }); } OpenOneFile(title, filter = "图片(*.png;*.jpg)") { const sid = "sf" + Date.now(); return new Promise((r) => { const ipc = this.ipc; ipc.emit("OpenOneFile", [sid, title, filter], function(file) { setTimeout(() => { r(file); }, 0); }); }); } GetImageMeta(fpath) { return new Promise((r) => { const img = new Image(); img.onload = () => { r({ Width: img.width, Height: img.height, Size: 0 }); }; img.src = fpath; }); } SetMainTitle(title) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("SetMainTitle", [title], function(ok) { r(ok); }); }); } SaveFile(fpath, buff) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("SaveFile", [fpath, Array.from(buff)], function(err) { r(err); }); }); } OpenQueen5(url, title) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("OpenQueen5", [url, title], function(err) { r(err); }); }); } OpenQueen5Play(url, title) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("OpenQueen5Play", [url, title], function(err) { r(err); }); }); } SaveBlobFile(url, fbase64path) { console.log("save blob to ", fbase64path); return new Promise((r) => { const cancel = this.on("downloadsucc", (dpath) => { console.log("fpath=>", dpath); if (fbase64path == Base64.encode(dpath)) { cancel.unbind(); r(true); } }); saveAs(url, fbase64path); }); } SaveClipboard(blob) { return navigator.clipboard.write([ new ClipboardItem({ "image/png": blob }) ]); } GetNatsProfile() { return new Promise((r) => { const ipc = this.ipc; ipc.emit("NatsProfile", [], function(data) { r(data); }); }); } OpenWeb(url, title, width = 1280, height = 720) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("OpenWeb", [url, title, width, height], function(data) { r(data); }); }); } RunNativeApp(guid, entry, params, title, key) { return new Promise((r) => { const ipc = this.ipc; ipc.emit( "RunNativeApp", [guid, entry, params, title, key], function(err) { console.log("xxxx", err); r(err); } ); }); } RunCmdSvcApp(guid, webUrl, entry, params, title, key) { return new Promise((r) => { const ipc = this.ipc; ipc.emit( "RunCmdSvcApp", [guid, webUrl, entry, params, title, key], function(err) { console.log("xxxx", err); r(err); } ); }); } StopNativeApp(guid) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("StopNativeApp", [guid], function(ok) { r(ok); }); }); } LancherUpgrade(updateUrl, lancherUrl) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("Upgrade", [updateUrl, lancherUrl], function(ok) { r(ok); }); }); } CreateShortcut(appName, lancherPath, icoPath) { return new Promise((r) => { const ipc = this.ipc; ipc.emit( "CreateShortcut", [appName, lancherPath, icoPath], function(ok) { r(ok); } ); }); } DeleteShortcut(appName) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("DeleteShortcut", [appName], function(ok) { r(ok); }); }); } ResumeMainWnd() { return new Promise((r) => { const ipc = this.ipc; ipc.emit("ResumeMainWnd", [], function(ok) { r(ok); }); }); } HideMainWnd() { return new Promise((r) => { const ipc = this.ipc; ipc.emit("HideMainWnd", [], function(ok) { r(ok); }); }); } QuitLancher() { return new Promise((r) => { const ipc = this.ipc; ipc.emit("QuitLancher", [], function(ok) { r(ok); }); }); } MaxWindow(isMax) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("MaxWindow", [isMax], function(ok) { r(ok); }); }); } FoldWindow(isFold) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("FoldWindow", [isFold], function(ok) { r(ok); }); }); } TrayNotice(notice) { return new Promise((r) => { const ipc = this.ipc; ipc.emit( "TrayNotice", [notice.title || "提示", notice.context, notice.timeout || 2e3], function(ok) { r(ok); } ); }); } UpdateConfig(version) { return new Promise((r) => { const ipc = this.ipc; ipc.emit("UpdateConfig", [version], function(ok) { r(ok); }); }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRldmljZUN0cmwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSBcInF1ZWVuanNcIjtcclxuaW1wb3J0IHsgTm9ybU1zZywgZGVjb2RlTm9ybU1zZywgZW5jb2RlTm9ybU1zZyB9IGZyb20gXCIuL2VudGl0eS9tZXNzYWdlXCI7XHJcbmltcG9ydCB7IENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29yZS9jb250cm9sbGVyXCI7XHJcblxyXG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tIFwiZmlsZS1zYXZlclwiO1xyXG5cclxuaW1wb3J0IHsgQmFzZTY0IH0gZnJvbSBcImpzLWJhc2U2NFwiO1xyXG50eXBlIFVwbG9hZEl0ZW0gPSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBmcGF0aDogc3RyaW5nO1xyXG4gIGRpcjogc3RyaW5nO1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgdXJsPzogc3RyaW5nO1xyXG4gIHNpemU/OiBudW1iZXI7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBGaWxlSW5mbyA9IHtcclxuICBGcGF0aDogc3RyaW5nO1xyXG4gIFNpemU6IG51bWJlcjtcclxuICBDcmVhdGVBdDogbnVtYmVyOyAvL2luZm8uTW9kVGltZSgpLlVuaXgoKVxyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIERldmljZUNvbnRyb2xsZXIgZXh0ZW5kcyBDb250cm9sbGVyIHtcclxuICBpcGM6IGFueTtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBpZiAod2luZG93LmlwYykge1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgdGhpcy5pcGMgPSB3aW5kb3cuaXBjO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pcGMgPSB7XHJcbiAgICAgICAgZW1pdChuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZW1pdCBtc2c9PlwiLCBuYW1lLCBhcmdzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIm9uIG1lc3NhZ2VcIiwgbmFtZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdEV2ZW50KCk7XHJcbiAgfVxyXG4gIF9jb25uPzogV2ViU29ja2V0O1xyXG5cclxuICBpbml0RXZlbnQoKSB7XHJcbiAgICBjb25zdCBzY29wZSA9IHRoaXM7XHJcbiAgICB0aGlzLmlwYy5vbihcIk9uRHJhZ0VudGVyXCIsIGZ1bmN0aW9uIChmaWxlczogc3RyaW5nW10pIHtcclxuICAgICAgc2NvcGUuZW1pdChcIm9uRHJhZ0VudGVyXCIsIGZpbGVzKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5pcGMub24oXCJkb3dubG9hZHN1Y2NcIiwgKGZwYXRoOiBzdHJpbmcsIHNpemU6IG51bWJlcikgPT4ge1xyXG4gICAgICBzY29wZS5lbWl0KFwiZG93bmxvYWRzdWNjXCIsIGZwYXRoLCBzaXplKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXBjLmVtaXQoXCJHZXRTb2NrZXRVcmlcIiwgW10sICh1cmk6IHN0cmluZykgPT4ge1xyXG4gICAgICBsZXQgY29ubiA9IG5ldyBXZWJTb2NrZXQodXJpKTtcclxuICAgICAgY29ubi5vbm9wZW4gPSAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiYnVzIHNvY2tldCBjb25uZWN0ZWQhISFcIik7XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbm4ub25jbG9zZSA9IChldnQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImFwcCBidXMgc29ja2V0IGNvbm4gY2xvc2VkXCIsIGV2dCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fY29ubiA9IG5ldyBXZWJTb2NrZXQodXJpKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgfTtcclxuICAgICAgY29ubi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZ0KSB7XHJcbiAgICAgICAgaWYgKCFldnQuZGF0YSB8fCBldnQuZGF0YSA9PSBcIlwiKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBibG9iID0gZXZ0LmRhdGEgYXMgQmxvYjtcclxuICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGRlY29kZU5vcm1Nc2cobmV3IFVpbnQ4QXJyYXkoYnVmZikpO1xyXG4gICAgICAgICAgICBzY29wZS5lbWl0KFwib25cIiArIG1zZy5zdWIsIG1zZyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihldnQuZGF0YSwgdHlwZW9mIGV2dC5kYXRhLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLl9jb25uID0gY29ubjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25SZWFkeSgpIHtcclxuICAgIHRoaXMucHJvZmlsZSA9IGF3YWl0IHRoaXMuZ2V0TG9jYWxBcHBQcm9maWxlKCk7XHJcbiAgfVxyXG5cclxuICBwcm9maWxlID0ge1xyXG4gICAgd3NQb3J0OiBcIlwiLFxyXG4gICAgdmVyc2lvbjogXCJcIixcclxuICAgIGRhdGFEaXI6IFwiXCIsXHJcbiAgICBleGVEaXI6IFwiXCIsXHJcbiAgICBleGVOYW1lOiBcIlwiLFxyXG4gICAgZXhlUGF0aDogXCJcIixcclxuICB9O1xyXG5cclxuICBnZXRMb2NhbEFwcFByb2ZpbGUoKTogUHJvbWlzZTx0eXBlb2YgdGhpcy5wcm9maWxlPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiTG9jYWxBcHBQcm9maWxlXCIsIFtdLCBmdW5jdGlvbiAoY29uZmlnOiBhbnkpIHtcclxuICAgICAgICByKGNvbmZpZyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8v6YCJ5oup56OB55uY5paH5Lu25aS5XHJcbiAgU2VsZWN0RGlyKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBzaWQgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3QgY2JuYW1lID0gXCJjXCIgKyBzaWQ7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiU2VsZWN0RGlyXCIsIFtzaWRdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImNhbGw9PlwiLCBvayk7XHJcbiAgICAgICAgaWYgKCFvaykge1xyXG4gICAgICAgICAgcihcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXBjLm9uKGNibmFtZSwgZnVuY3Rpb24gKGRpcjogc3RyaW5nKSB7XHJcbiAgICAgICAgICByKGRpcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIElzRGlyRW1wdHkoZGlyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJJc0RpckVtcHR5XCIsIFtkaXJdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgSXNGaWxlRXhpdChmcGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiSXNGaWxlRXhpdFwiLCBbZnBhdGhdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFdyaXRlRmlsZVRleHQoZGlyOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIldyaXRlRmlsZVRleHRcIiwgW2RpciwgY29udGVudF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgUmVhZEZpbGVUZXh0KGRpcjogc3RyaW5nKTogUHJvbWlzZTx7IGVycm9yOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiUmVhZEZpbGVUZXh0XCIsIFtkaXJdLCBmdW5jdGlvbiAoZGF0YTogYW55KSB7XHJcbiAgICAgICAgcihkYXRhKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5ou36LSd5paH5Lu2XHJcbiAgQ29weUZpbGUoc3JjRmlsZTogc3RyaW5nLCB0YXJnZXRGaWxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IHNpZCA9IERhdGUubm93KCk7XHJcbiAgICBjb25zdCBjYm5hbWUgPSBcImNvcHlcIiArIHNpZDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLm9uKGNibmFtZSwgZnVuY3Rpb24gKG9rOiBib29sZWFuKSB7XHJcbiAgICAgICAgcihvayk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpcGMuZW1pdChcIkNvcHlGaWxlXCIsIFtjYm5hbWUsIHNyY0ZpbGUsIHRhcmdldEZpbGVdKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/kv53lrZjlupTnlKjnuqfnmoTphY3nva5cclxuICBTYXZlU3lzQ29uZmlnSXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlNhdmVBcHBDb25maWdJdGVtXCIsIFtrZXksIHZhbHVlXSwgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgIHIoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIEdldFN5c0NvbmZpZ0l0ZW0oa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgZXJyb3I6IHN0cmluZzsgdGV4dDogc3RyaW5nIH0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJHZXRBcHBDb25maWdJdGVtXCIsIFtrZXldLCBmdW5jdGlvbiAoZGF0YTogYW55KSB7XHJcbiAgICAgICAgcihkYXRhKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgUmVtb3ZlU3lzQ29uZmlnSXRlbShrZXk6IHN0cmluZyk6IFByb21pc2U8eyBlcnJvcjogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlJlbW92ZVN5c0NvbmZpZ0l0ZW1cIiwgW2tleV0sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/ojrflj5blupTnlKjnmoRiYXNlVXJsXHJcbiAgR2V0U3lzRGF0YUJhc2VVcmwoKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiR2V0QXBwRGF0YUJhc2VVcmxcIiwgW10sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/ojrflj5blupTnlKjnmoRiYXNlVXJsXHJcbiAgQ29weUZpbGVUb0FwcERhdGEoc3JjOiBzdHJpbmcsIHRhcmdldFJlbGF0aXZlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXHJcbiAgICAgICAgXCJDb3B5RmlsZVRvQXBwRGF0YVwiLFxyXG4gICAgICAgIFtzcmMsIHRhcmdldFJlbGF0aXZlUGF0aF0sXHJcbiAgICAgICAgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgICAgcihkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFJlbW92ZUFwcERhdGEodGFyZ2V0UmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJSZW1vdmVBcHBEYXRhXCIsIFt0YXJnZXRSZWxhdGl2ZVBhdGhdLCBmdW5jdGlvbiAoZGF0YTogYW55KSB7XHJcbiAgICAgICAgcihkYXRhKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5omT5byA5paH5Lu25omA5Zyo55qE55uu5b2VXHJcbiAgT3BlbkRpcihkaXI6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIk9wZW5EaXJcIiwgW2Rpcl0sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgU2VsZWN0T25lRmlsZVBhdGgodGl0bGU6IHN0cmluZywgZmlsdGVyczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHNpZCA9IERhdGUubm93KCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBjb25zdCBjYm5hbWUgPSBcImNcIiArIHNpZDtcclxuICAgICAgaXBjLmVtaXQoXHJcbiAgICAgICAgXCJTZWxlY3RPbmVGaWxlUGF0aFwiLFxyXG4gICAgICAgIFtzaWQsIHRpdGxlLCBmaWx0ZXJzXSxcclxuICAgICAgICBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICAgIGlmICghb2spIHtcclxuICAgICAgICAgICAgcihcIlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlwYy5vbihjYm5hbWUsIGZ1bmN0aW9uIChkaXI6IHN0cmluZykge1xyXG4gICAgICAgICAgICByKGRpcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5byA5ZCvcHJvamVjdHMg55qEaHR0cHNlcnZlclxyXG4gIFN0YXJ0SHR0cFNlcnZlcihwcmpGaWxlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3Qgc2lkID0gRGF0ZS5ub3coKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJTdGFydFByb2plY3RIdHRwU2VydmVyXCIsIFtwcmpGaWxlXSwgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgIHIoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL+S4i+WcqOe6v+aWh+S7tiDpu5jorqTotoXml7bml7bpl7QyMOWIhumSn1xyXG4gIERvd25sb2FkRmlsZShcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgZnBhdGg6IHN0cmluZyxcclxuICAgIHRpbWVvdXRTZWNlbmQ6IG51bWJlciA9IDYwICogMjAsXHJcbiAgICBjYj86IChldmVudDogXCJzdGFydFwiIHwgXCJwcm9ncmVzc1wiIHwgXCJlcnJvclwiIHwgXCJzdWNjXCIsIHAxOiBOb3JtTXNnKSA9PiB2b2lkXHJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBzaWQgPSBcImRcIiArIERhdGUubm93KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc29sZS5sb2codXJsLCBcIj09PlwiLCBmcGF0aCk7XHJcbiAgICAgIGNvbnN0IGNhbmNlbCA9IHRoaXMuT25Nc2coc2lkLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNiICYmIGNiKGRhdGEudHlwZSBhcyBhbnksIGRhdGEpO1xyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJzdWNjXCIpIHtcclxuICAgICAgICAgIHIodHJ1ZSk7XHJcbiAgICAgICAgICBjYW5jZWwudW5iaW5kKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJlcnJvclwiKSB7XHJcbiAgICAgICAgICByKGZhbHNlKTtcclxuICAgICAgICAgIGNhbmNlbC51bmJpbmQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFxyXG4gICAgICAgIFwiRG93bmxvYWRGaWxlXCIsXHJcbiAgICAgICAgW3NpZCwgZnBhdGgsIHVybCwgdGltZW91dFNlY2VuZF0sXHJcbiAgICAgICAgZnVuY3Rpb24gKGVycjogc3RyaW5nKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkRvd25sb2FkRmlsZSBjYWxsYmFja1wiKTtcclxuICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICByKGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFVuemlwKFxyXG4gICAgZnBhdGg6IHN0cmluZyxcclxuICAgIGRpc3REaXI6IHN0cmluZyxcclxuICAgIGNiPzogKGV2ZW50OiBcInByb2dyZXNzXCIgfCBcImVycm9yXCIgfCBcInN1Y2NcIiwgcDE6IE5vcm1Nc2cpID0+IHZvaWRcclxuICApIHtcclxuICAgIGNvbnN0IHNpZCA9IFwidW56aXBcIiArIERhdGUubm93KCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhbmNlbCA9IHRoaXMuT25Nc2coc2lkLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNiICYmIGNiKGRhdGEudHlwZSBhcyBhbnksIGRhdGEpO1xyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJzdWNjXCIpIHtcclxuICAgICAgICAgIHIodHJ1ZSk7XHJcbiAgICAgICAgICBjYW5jZWwudW5iaW5kKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJlcnJvclwiKSB7XHJcbiAgICAgICAgICByKGZhbHNlKTtcclxuICAgICAgICAgIGNhbmNlbC51bmJpbmQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVbnppcFwiLCBbc2lkLCBmcGF0aCwgZGlzdERpcl0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL+iOt+WPluaWh+S7tuWkueeahOWkp+Wwj1xyXG4gIC8v5paH5Lu255uu5b2V5LiN6KaB5aSq5aSn77yM5LiN54S25Lya5Y2h5q2756iL5bqPXHJcbiAgR2V0RGlyU2l6ZShkaXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiR2V0RGlyU2l6ZVwiLCBbZGlyXSwgZnVuY3Rpb24gKHNpemU6IG51bWJlcikge1xyXG4gICAgICAgIHIoc2l6ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL+iOt+WPluezu+e7n+aVsOaNruebruW9lVxyXG4gIEdldEFwcERhdGFEaXIoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJHZXRBcHBEYXRhRGlyXCIsIFtdLCBmdW5jdGlvbiAoZGlyOiBzdHJpbmcpIHtcclxuICAgICAgICByKGRpcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBPcGVuQXNzZXRXaW5kb3cocHJvamVjdFBhdGg6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIm9wZW5Bc3NldHNXaW5kb3dcIixcclxuICAgICAgICBbXHJcbiAgICAgICAgICBgJHtsb2NhdGlvbi5ob3N0fS9saWJyYXJ5Lmh0bWw/cGF0aD0ke3Byb2plY3RQYXRofWAsXHJcbiAgICAgICAgICBcIui1hOa6kOeuoeeQhuW6k1wiLFxyXG4gICAgICAgICAgMTI4MCxcclxuICAgICAgICAgIDk2MCxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgICAgcihvayk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBTZW5kTXNnKHN1YmplY3Q6IHN0cmluZywgbXNnOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNvbm4gPSB0aGlzLl9jb25uO1xyXG4gICAgaWYgKCFjb25uKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCLlupTnlKhzb2NrZXTlvILluLhcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbm4uc2VuZChlbmNvZGVOb3JtTXNnKHsgc3ViOiBzdWJqZWN0LCBtc2c6IG1zZyB9KSk7XHJcbiAgfVxyXG5cclxuICBPbk1zZyhzdWJqZWN0OiBzdHJpbmcsIGNiOiAobXNnOiBOb3JtTXNnKSA9PiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLm9uKFwib25cIiArIHN1YmplY3QsIGNiKTtcclxuICB9XHJcblxyXG4gIC8v5ZCM5q2l6Zi75aGe5b2T5YmN6L+b56iLXHJcbiAgVXBsb2FkU3luYyhmaWxlczogVXBsb2FkSXRlbVtdKTogUHJvbWlzZTxVcGxvYWRJdGVtW10+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVcGxvYWRTeW5jXCIsIFtmaWxlc10sIGZ1bmN0aW9uIChyZXQ6IGFueSkge1xyXG4gICAgICAgIHIocmV0KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5byC5q2l5LiK5Lyg5LiN5Lya6Zi75aGe5b2T5YmN6L+b56iLXHJcbiAgVXBsb2FkQVN5bmMoZmlsZXM6IFVwbG9hZEl0ZW1bXSk6IFByb21pc2U8VXBsb2FkSXRlbVtdPiB7XHJcbiAgICBjb25zdCBzaWQgPSBcInVcIiArIERhdGUubm93KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiVXBsb2FkQVN5bmNcIiwgW3NpZCwgZmlsZXNdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoIW9rKSB7XHJcbiAgICAgICAgICByKFtdKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXBjLm9uKHNpZCwgKGl0ZW1zOiBhbnkpID0+IHtcclxuICAgICAgICAgIHIoaXRlbXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/lvILmraXkuIrkvKDkuI3kvJrpmLvloZ7lvZPliY3ov5vnqItcclxuICBVcGxvYWREaXIoZGlyOiBzdHJpbmcsIHRhcmdldERpcjogc3RyaW5nKTogUHJvbWlzZTxVcGxvYWRJdGVtW10+IHtcclxuICAgIGNvbnN0IHNpZCA9IFwidVwiICsgRGF0ZS5ub3coKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVcGxvYWREaXJcIiwgW3NpZCwgZGlyLCB0YXJnZXREaXJdLCBmdW5jdGlvbiAob2s6IGFueSkge1xyXG4gICAgICAgIGlmICghb2spIHtcclxuICAgICAgICAgIHIoW10pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpcGMub24oc2lkLCAoaXRlbXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcihpdGVtcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBHZXRGaWxlc0luRGlyKGRpcjogc3RyaW5nLCBmaWx0ZXI6IHN0cmluZyk6IFByb21pc2U8RmlsZUluZm9bXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIkdldEZpbGVzSW5EaXJcIiwgW2RpciwgZmlsdGVyXSwgZnVuY3Rpb24gKHJldDogYW55KSB7XHJcbiAgICAgICAgcihyZXQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBHZXRSdW5uaW5nQXBwKCk6IFByb21pc2U8eyBHdWlkOiBzdHJpbmc7IFRpdGxlOiBzdHJpbmc7IEtleTogc3RyaW5nIH1bXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIkdldFJ1bm5pbmdBcHBcIixcclxuICAgICAgICBbXSxcclxuICAgICAgICBmdW5jdGlvbiAoYXBwczogeyBHdWlkOiBzdHJpbmc7IFRpdGxlOiBzdHJpbmc7IEtleTogc3RyaW5nIH1bXSkge1xyXG4gICAgICAgICAgcihhcHBzKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEdldFN1YkRpck5hbWVzKGRpcjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIkdldFN1YkRpck5hbWVzXCIsIFtkaXJdLCBmdW5jdGlvbiAocmV0OiBhbnkpIHtcclxuICAgICAgICByKHJldCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBSZW1vdmVGaWxlKGZwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJSZW1vdmVGaWxlXCIsIFtmcGF0aF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBSZW1vdmVEaXIoZnBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlJlbW92ZURpclwiLCBbZnBhdGhdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEdldFNhdmVGaWxlKHRpdGxlOiBzdHJpbmcsIGZpbHRlciA9IFwi5Zu+54mHKCoucG5nOyouanBnKVwiKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHNpZCA9IFwic2ZcIiArIERhdGUubm93KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiR2V0U2F2ZUZpbGVcIiwgW3NpZCwgdGl0bGUsIGZpbHRlcl0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChvaykge1xyXG4gICAgICAgICAgaXBjLm9uKHNpZCwgKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHIocmV0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByKFwiXCIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgT3Blbk9uZUZpbGUodGl0bGU6IHN0cmluZywgZmlsdGVyID0gXCLlm77niYcoKi5wbmc7Ki5qcGcpXCIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3Qgc2lkID0gXCJzZlwiICsgRGF0ZS5ub3coKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJPcGVuT25lRmlsZVwiLCBbc2lkLCB0aXRsZSwgZmlsdGVyXSwgZnVuY3Rpb24gKGZpbGU6IGFueSkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgcihmaWxlKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEdldEltYWdlTWV0YShcclxuICAgIGZwYXRoOiBzdHJpbmdcclxuICApOiBQcm9taXNlPHsgV2lkdGg6IG51bWJlcjsgSGVpZ2h0OiBudW1iZXI7IFNpemU6IG51bWJlciB9PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgcih7IFdpZHRoOiBpbWcud2lkdGgsIEhlaWdodDogaW1nLmhlaWdodCwgU2l6ZTogMCB9KTtcclxuICAgICAgfTtcclxuICAgICAgaW1nLnNyYyA9IGZwYXRoO1xyXG5cclxuICAgICAgLy8gY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIC8vIGlwYy5lbWl0KFwiR2V0SW1hZ2VNZXRhXCIsIFtmcGF0aF0sIGZ1bmN0aW9uIChtZXRhKSB7XHJcbiAgICAgIC8vICAgICByKG1ldGEpO1xyXG4gICAgICAvLyB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgU2V0TWFpblRpdGxlKHRpdGxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJTZXRNYWluVGl0bGVcIiwgW3RpdGxlXSwgZnVuY3Rpb24gKG9rOiBhbnkpIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFNhdmVGaWxlKGZwYXRoOiBzdHJpbmcsIGJ1ZmY6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiU2F2ZUZpbGVcIiwgW2ZwYXRoLCBBcnJheS5mcm9tKGJ1ZmYpXSwgZnVuY3Rpb24gKGVycjogc3RyaW5nKSB7XHJcbiAgICAgICAgcihlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgT3BlblF1ZWVuNSh1cmw6IHN0cmluZywgdGl0bGU6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIk9wZW5RdWVlbjVcIiwgW3VybCwgdGl0bGVdLCBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcclxuICAgICAgICByKGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIE9wZW5RdWVlbjVQbGF5KHVybDogc3RyaW5nLCB0aXRsZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiT3BlblF1ZWVuNVBsYXlcIiwgW3VybCwgdGl0bGVdLCBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcclxuICAgICAgICByKGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBTYXZlQmxvYkZpbGUodXJsOiBzdHJpbmcsIGZiYXNlNjRwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnNvbGUubG9nKFwic2F2ZSBibG9iIHRvIFwiLCBmYmFzZTY0cGF0aCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhbmNlbCA9IHRoaXMub24oXCJkb3dubG9hZHN1Y2NcIiwgKGRwYXRoOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImZwYXRoPT5cIiwgZHBhdGgpO1xyXG4gICAgICAgIGlmIChmYmFzZTY0cGF0aCA9PSBCYXNlNjQuZW5jb2RlKGRwYXRoKSkge1xyXG4gICAgICAgICAgY2FuY2VsLnVuYmluZCgpO1xyXG4gICAgICAgICAgcih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBzYXZlQXModXJsLCBmYmFzZTY0cGF0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFNhdmVDbGlwYm9hcmQoYmxvYjogQmxvYikge1xyXG4gICAgcmV0dXJuIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGUoW1xyXG4gICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7XHJcbiAgICAgICAgXCJpbWFnZS9wbmdcIjogYmxvYixcclxuICAgICAgfSksXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIEdldE5hdHNQcm9maWxlKCk6IFByb21pc2U8eyBhcGlQb3J0OiBzdHJpbmc7IHdzUG9ydDogc3RyaW5nOyBpcDogc3RyaW5nIH0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJOYXRzUHJvZmlsZVwiLCBbXSwgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgIHIoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBPcGVuV2ViKFxyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICB0aXRsZTogc3RyaW5nLFxyXG4gICAgd2lkdGggPSAxMjgwLFxyXG4gICAgaGVpZ2h0ID0gNzIwXHJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiT3BlbldlYlwiLCBbdXJsLCB0aXRsZSwgd2lkdGgsIGhlaWdodF0sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgUnVuTmF0aXZlQXBwKFxyXG4gICAgZ3VpZDogc3RyaW5nLFxyXG4gICAgZW50cnk6IHN0cmluZyxcclxuICAgIHBhcmFtczogc3RyaW5nW10sXHJcbiAgICB0aXRsZTogc3RyaW5nLFxyXG4gICAga2V5OiBzdHJpbmdcclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIlJ1bk5hdGl2ZUFwcFwiLFxyXG4gICAgICAgIFtndWlkLCBlbnRyeSwgcGFyYW1zLCB0aXRsZSwga2V5XSxcclxuICAgICAgICBmdW5jdGlvbiAoZXJyOiBzdHJpbmcpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwieHh4eFwiLCBlcnIpO1xyXG4gICAgICAgICAgcihlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgUnVuQ21kU3ZjQXBwKFxyXG4gICAgZ3VpZDogc3RyaW5nLFxyXG4gICAgd2ViVXJsOiBzdHJpbmcsXHJcbiAgICBlbnRyeTogc3RyaW5nLFxyXG4gICAgcGFyYW1zOiBzdHJpbmdbXSxcclxuICAgIHRpdGxlOiBzdHJpbmcsXHJcbiAgICBrZXk6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFxyXG4gICAgICAgIFwiUnVuQ21kU3ZjQXBwXCIsXHJcbiAgICAgICAgW2d1aWQsIHdlYlVybCwgZW50cnksIHBhcmFtcywgdGl0bGUsIGtleV0sXHJcbiAgICAgICAgZnVuY3Rpb24gKGVycjogc3RyaW5nKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInh4eHhcIiwgZXJyKTtcclxuICAgICAgICAgIHIoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFN0b3BOYXRpdmVBcHAoZ3VpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiU3RvcE5hdGl2ZUFwcFwiLCBbZ3VpZF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBMYW5jaGVyVXBncmFkZSh1cGRhdGVVcmw6IHN0cmluZywgbGFuY2hlclVybDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiVXBncmFkZVwiLCBbdXBkYXRlVXJsLCBsYW5jaGVyVXJsXSwgZnVuY3Rpb24gKG9rOiBib29sZWFuKSB7XHJcbiAgICAgICAgcihvayk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIENyZWF0ZVNob3J0Y3V0KFxyXG4gICAgYXBwTmFtZTogc3RyaW5nLFxyXG4gICAgbGFuY2hlclBhdGg6IHN0cmluZyxcclxuICAgIGljb1BhdGg6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIkNyZWF0ZVNob3J0Y3V0XCIsXHJcbiAgICAgICAgW2FwcE5hbWUsIGxhbmNoZXJQYXRoLCBpY29QYXRoXSxcclxuICAgICAgICBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICAgIHIob2spO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBEZWxldGVTaG9ydGN1dChhcHBOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJEZWxldGVTaG9ydGN1dFwiLCBbYXBwTmFtZV0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBSZXN1bWVNYWluV25kKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlJlc3VtZU1haW5XbmRcIiwgW10sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBIaWRlTWFpblduZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJIaWRlTWFpblduZFwiLCBbXSwgZnVuY3Rpb24gKG9rOiBib29sZWFuKSB7XHJcbiAgICAgICAgcihvayk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFF1aXRMYW5jaGVyKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlF1aXRMYW5jaGVyXCIsIFtdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgTWF4V2luZG93KGlzTWF4OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiTWF4V2luZG93XCIsIFtpc01heF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBGb2xkV2luZG93KGlzRm9sZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIkZvbGRXaW5kb3dcIiwgW2lzRm9sZF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgVHJheU5vdGljZShub3RpY2U6IHtcclxuICAgIHRpdGxlPzogc3RyaW5nO1xyXG4gICAgY29udGV4dDogc3RyaW5nO1xyXG4gICAgdGltZW91dD86IG51bWJlcjtcclxuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFxyXG4gICAgICAgIFwiVHJheU5vdGljZVwiLFxyXG4gICAgICAgIFtub3RpY2UudGl0bGUgfHwgXCLmj5DnpLpcIiwgbm90aWNlLmNvbnRleHQsIG5vdGljZS50aW1lb3V0IHx8IDIwMDBdLFxyXG4gICAgICAgIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgICAgcihvayk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFVwZGF0ZUNvbmZpZyh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVcGRhdGVDb25maWdcIiwgW3ZlcnNpb25dLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtc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