UNPKG

@unts/patch-package

Version:

Fix broken node modules with no fuss

148 lines (139 loc) 21.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.rebase = void 0; const path_1 = require("path"); const picocolors_1 = __importDefault(require("picocolors")); const applyPatches_1 = require("./applyPatches"); const hash_1 = require("./hash"); const patchFs_1 = require("./patchFs"); const stateFile_1 = require("./stateFile"); function rebase({ appPath, patchDir, packagePathSpecifier, targetPatch, }) { const patchesDirectory = (0, path_1.join)(appPath, patchDir); const groupedPatches = (0, patchFs_1.getGroupedPatches)(patchesDirectory); if (groupedPatches.numPatchFiles === 0) { console.log(picocolors_1.default.blue("No patch files found")); process.exit(1); } const packagePatches = groupedPatches.pathSpecifierToPatchFiles[packagePathSpecifier]; if (!packagePatches) { console.log(picocolors_1.default.blue("No patch files found for package"), packagePathSpecifier); process.exit(1); } const state = (0, stateFile_1.getPatchApplicationState)(packagePatches[0]); if (!state) { console.log(picocolors_1.default.blue("No patch state found"), "Did you forget to run", picocolors_1.default.bold("patch-package"), "(without arguments) first?"); process.exit(1); } if (state.isRebasing) { console.log(picocolors_1.default.blue("Already rebasing"), "Make changes to the files in", picocolors_1.default.bold(packagePatches[0].path), "and then run `patch-package", packagePathSpecifier, "--continue` to", packagePatches.length === state.patches.length ? "append a patch file" : `update the ${packagePatches[packagePatches.length - 1].patchFilename} file`); console.log(`💡 To remove a broken patch file, delete it and reinstall node_modules`); process.exit(1); } if (state.patches.length !== packagePatches.length) { console.log(picocolors_1.default.blue("Some patches have not been applied."), "Reinstall node_modules and try again."); } // check hashes (0, stateFile_1.verifyAppliedPatches)({ appPath, patchDir, state }); if (targetPatch === "0") { // unapply all unApplyPatches({ patches: packagePatches, appPath, patchDir, }); (0, stateFile_1.savePatchApplicationState)({ packageDetails: packagePatches[0], isRebasing: true, patches: [], }); console.log(` Make any changes you need inside ${picocolors_1.default.bold(packagePatches[0].path)} When you are done, run ${picocolors_1.default.bold(`patch-package ${packagePathSpecifier} --append 'MyChangeDescription'`)} to insert a new patch file. `); return; } // find target patch const target = packagePatches.find((p) => { if (p.patchFilename === targetPatch) { return true; } if ((0, path_1.resolve)(process.cwd(), targetPatch) === (0, path_1.join)(patchesDirectory, p.patchFilename)) { return true; } if (targetPatch === p.sequenceName) { return true; } const n = Number(targetPatch.replace(/^0+/g, "")); if (!isNaN(n) && n === p.sequenceNumber) { return true; } return false; }); if (!target) { console.log(picocolors_1.default.red("Could not find target patch file"), picocolors_1.default.bold(targetPatch)); console.log(); console.log("The list of available patch files is:"); packagePatches.forEach((p) => { console.log(` - ${p.patchFilename}`); }); process.exit(1); } const currentHash = (0, hash_1.hashFile)((0, path_1.join)(patchesDirectory, target.patchFilename)); const prevApplication = state.patches.find((p) => p.patchContentHash === currentHash); if (!prevApplication) { console.log(picocolors_1.default.red("Could not find previous application of patch file"), picocolors_1.default.bold(target.patchFilename)); console.log(); console.log("You should reinstall node_modules and try again."); process.exit(1); } // ok, we are good to start undoing all the patches that were applied up to but not including the target patch const targetIdx = state.patches.indexOf(prevApplication); unApplyPatches({ patches: packagePatches.slice(targetIdx + 1), appPath, patchDir, }); (0, stateFile_1.savePatchApplicationState)({ packageDetails: packagePatches[0], isRebasing: true, patches: packagePatches.slice(0, targetIdx + 1).map((p) => ({ patchFilename: p.patchFilename, patchContentHash: (0, hash_1.hashFile)((0, path_1.join)(patchesDirectory, p.patchFilename)), didApply: true, })), }); console.log(` Make any changes you need inside ${picocolors_1.default.bold(packagePatches[0].path)} When you are done, do one of the following: To update ${picocolors_1.default.bold(packagePatches[targetIdx].patchFilename)} run ${picocolors_1.default.bold(`patch-package ${packagePathSpecifier}`)} To create a new patch file after ${picocolors_1.default.bold(packagePatches[targetIdx].patchFilename)} run ${picocolors_1.default.bold(`patch-package ${packagePathSpecifier} --append 'MyChangeDescription'`)} `); } exports.rebase = rebase; function unApplyPatches({ patches, appPath, patchDir, }) { for (const patch of patches.slice().reverse()) { if (!(0, applyPatches_1.applyPatch)({ patchFilePath: (0, path_1.join)(appPath, patchDir, patch.patchFilename), reverse: true, patchDetails: patch, patchDir, cwd: process.cwd(), bestEffort: false, })) { console.log(picocolors_1.default.red("Failed to un-apply patch file"), picocolors_1.default.bold(patch.patchFilename), "Try completely reinstalling node_modules."); process.exit(1); } console.log(picocolors_1.default.cyan(picocolors_1.default.bold("Un-applied")), patch.patchFilename); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmViYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwrQkFBb0M7QUFDcEMsNERBQStCO0FBQy9CLGlEQUEyQztBQUMzQyxpQ0FBaUM7QUFFakMsdUNBQTZDO0FBQzdDLDJDQUlvQjtBQUVwQixTQUFnQixNQUFNLENBQUMsRUFDckIsT0FBTyxFQUNQLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsV0FBVyxHQU1aO0lBQ0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLFdBQUksRUFBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDaEQsTUFBTSxjQUFjLEdBQUcsSUFBQSwyQkFBaUIsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRTFELElBQUksY0FBYyxDQUFDLGFBQWEsS0FBSyxDQUFDLEVBQUU7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUE7UUFDaEQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtJQUVELE1BQU0sY0FBYyxHQUNsQixjQUFjLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUNoRSxJQUFJLENBQUMsY0FBYyxFQUFFO1FBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQ1Qsb0JBQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsRUFDL0Msb0JBQW9CLENBQ3JCLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQ0FBd0IsRUFBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUV6RCxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FDVCxvQkFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUNu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QU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM3QyxJQUNFLENBQUMsSUFBQSx5QkFBVSxFQUFDO1lBQ1YsYUFBYSxFQUFFLElBQUEsV0FBSSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBVztZQUNyRSxPQUFPLEVBQUUsSUFBSTtZQUNiLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVE7WUFDUixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUNsQixVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDLEVBQ0Y7WUFDQSxPQUFPLENBQUMsR0FBRyxDQUNULG9CQUFNLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLEVBQzNDLG9CQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFDaEMsMkNBQTJDLENBQzVDLENBQUE7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ2hCO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBTSxDQUFDLElBQUksQ0FBQyxvQkFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQTtLQUN6RTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSBcInBhdGhcIlxuaW1wb3J0IGNvbG9ycyBmcm9tIFwicGljb2NvbG9yc1wiXG5pbXBvcnQgeyBhcHBseVBhdGNoIH0gZnJvbSBcIi4vYXBwbHlQYXRjaGVzXCJcbmltcG9ydCB7IGhhc2hGaWxlIH0gZnJvbSBcIi4vaGFzaFwiXG5pbXBvcnQgeyBQYXRjaGVkUGFja2FnZURldGFpbHMgfSBmcm9tIFwiLi9QYWNrYWdlRGV0YWlsc1wiXG5pbXBvcnQgeyBnZXRHcm91cGVkUGF0Y2hlcyB9IGZyb20gXCIuL3BhdGNoRnNcIlxuaW1wb3J0IHtcbiAgZ2V0UGF0Y2hBcHBsaWNhdGlvblN0YXRlLFxuICBzYXZlUGF0Y2hBcHBsaWNhdGlvblN0YXRlLFxuICB2ZXJpZnlBcHBsaWVkUGF0Y2hlcyxcbn0gZnJvbSBcIi4vc3RhdGVGaWxlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYmFzZSh7XG4gIGFwcFBhdGgsXG4gIHBhdGNoRGlyLFxuICBwYWNrYWdlUGF0aFNwZWNpZmllcixcbiAgdGFyZ2V0UGF0Y2gsXG59OiB7XG4gIGFwcFBhdGg6IHN0cmluZ1xuICBwYXRjaERpcjogc3RyaW5nXG4gIHBhY2thZ2VQYXRoU3BlY2lmaWVyOiBzdHJpbmdcbiAgdGFyZ2V0UGF0Y2g6IHN0cmluZ1xufSk6IHZvaWQge1xuICBjb25zdCBwYXRjaGVzRGlyZWN0b3J5ID0gam9pbihhcHBQYXRoLCBwYXRjaERpcilcbiAgY29uc3QgZ3JvdXBlZFBhdGNoZXMgPSBnZXRHcm91cGVkUGF0Y2hlcyhwYXRjaGVzRGlyZWN0b3J5KVxuXG4gIGlmIChncm91cGVkUGF0Y2hlcy5udW1QYXRjaEZpbGVzID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmJsdWUoXCJObyBwYXRjaCBmaWxlcyBmb3VuZFwiKSlcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQYXRjaGVzID1cbiAgICBncm91cGVkUGF0Y2hlcy5wYXRoU3BlY2lmaWVyVG9QYXRjaEZpbGVzW3BhY2thZ2VQYXRoU3BlY2lmaWVyXVxuICBpZiAoIXBhY2thZ2VQYXRjaGVzKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjb2xvcnMuYmx1ZShcIk5vIHBhdGNoIGZpbGVzIGZvdW5kIGZvciBwYWNrYWdlXCIpLFxuICAgICAgcGFja2FnZVBhdGhTcGVjaWZpZXIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG5cbiAgY29uc3Qgc3RhdGUgPSBnZXRQYXRjaEFwcGxpY2F0aW9uU3RhdGUocGFja2FnZVBhdGNoZXNbMF0pXG5cbiAgaWYgKCFzdGF0ZSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY29sb3JzLmJsdWUoXCJObyBwYXRjaCBzdGF0ZSBmb3VuZFwiKSxcbiAgICAgIFwiRGlkIHlvdSBmb3JnZXQgdG8gcnVuXCIsXG4gICAgICBjb2xvcnMuYm9sZChcInBhdGNoLXBhY2thZ2VcIiksXG4gICAgICBcIih3aXRob3V0IGFyZ3VtZW50cykgZmlyc3Q/XCIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG4gIGlmIChzdGF0ZS5pc1JlYmFzaW5nKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjb2xvcnMuYmx1ZShcIkFscmVhZHkgcmViYXNpbmdcIiksXG4gICAgICBcIk1ha2UgY2hhbmdlcyB0byB0aGUgZmlsZXMgaW5cIixcbiAgICAgIGNvbG9ycy5ib2xkKHBhY2thZ2VQYXRjaGVzWzBdLnBhdGgpLFxuICAgICAgXCJhbmQgdGhlbiBydW4gYHBhdGNoLXBhY2thZ2VcIixcbiAgICAgIHBhY2thZ2VQYXRoU3BlY2lmaWVyLFxuICAgICAgXCItLWNvbnRpbnVlYCB0b1wiLFxuICAgICAgcGFja2FnZVBhdGNoZXMubGVuZ3RoID09PSBzdGF0ZS5wYXRjaGVzLmxlbmd0aFxuICAgICAgICA/IFwiYXBwZW5kIGEgcGF0Y2ggZmlsZVwiXG4gICAgICAgIDogYHVwZGF0ZSB0aGUgJHtcbiAgICAgICAgICAgIHBhY2thZ2VQYXRjaGVzW3BhY2thZ2VQYXRjaGVzLmxlbmd0aCAtIDFdLnBhdGNoRmlsZW5hbWVcbiAgICAgICAgICB9IGZpbGVgLFxuICAgIClcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGDwn5KhIFRvIHJlbW92ZSBhIGJyb2tlbiBwYXRjaCBmaWxlLCBkZWxldGUgaXQgYW5kIHJlaW5zdGFsbCBub2RlX21vZHVsZXNgLFxuICAgIClcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuICBpZiAoc3RhdGUucGF0Y2hlcy5sZW5ndGggIT09IHBhY2thZ2VQYXRjaGVzLmxlbmd0aCkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY29sb3JzLmJsdWUoXCJTb21lIHBhdGNoZXMgaGF2ZSBub3QgYmVlbiBhcHBsaWVkLlwiKSxcbiAgICAgIFwiUmVpbnN0YWxsIG5vZGVfbW9kdWxlcyBhbmQgdHJ5IGFnYWluLlwiLFxuICAgIClcbiAgfVxuICAvLyBjaGVjayBoYXNoZXNcbiAgdmVyaWZ5QXBwbGllZFBhdGNoZXMoeyBhcHBQYXRoLCBwYXRjaERpciwgc3RhdGUgfSlcblxuICBpZiAodGFyZ2V0UGF0Y2ggPT09IFwiMFwiKSB7XG4gICAgLy8gdW5hcHBseSBhbGxcbiAgICB1bkFwcGx5UGF0Y2hlcyh7XG4gICAgICBwYXRjaGVzOiBwYWNrYWdlUGF0Y2hlcyxcbiAgICAgIGFwcFBhdGgsXG4gICAgICBwYXRjaERpcixcbiAgICB9KVxuICAgIHNhdmVQYXRjaEFwcGxpY2F0aW9uU3RhdGUoe1xuICAgICAgcGFja2FnZURldGFpbHM6IHBhY2thZ2VQYXRjaGVzWzBdLFxuICAgICAgaXNSZWJhc2luZzogdHJ1ZSxcbiAgICAgIHBhdGNoZXM6IFtdLFxuICAgIH0pXG4gICAgY29uc29sZS5sb2coYFxuTWFrZSBhbnkgY2hhbmdlcyB5b3UgbmVlZCBpbnNpZGUgJHtjb2xvcnMuYm9sZChwYWNrYWdlUGF0Y2hlc1swXS5wYXRoKX1cblxuV2hlbiB5b3UgYXJlIGRvbmUsIHJ1blxuXG4gICR7Y29sb3JzLmJvbGQoXG4gICAgYHBhdGNoLXBhY2thZ2UgJHtwYWNrYWdlUGF0aFNwZWNpZmllcn0gLS1hcHBlbmQgJ015Q2hhbmdlRGVzY3JpcHRpb24nYCxcbiAgKX1cbiAgXG50byBpbnNlcnQgYSBuZXcgcGF0Y2ggZmlsZS5cbmApXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBmaW5kIHRhcmdldCBwYXRjaFxuICBjb25zdCB0YXJnZXQgPSBwYWNrYWdlUGF0Y2hlcy5maW5kKChwKSA9PiB7XG4gICAgaWYgKHAucGF0Y2hGaWxlbmFtZSA9PT0gdGFyZ2V0UGF0Y2gpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChcbiAgICAgIHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgdGFyZ2V0UGF0Y2gpID09PVxuICAgICAgam9pbihwYXRjaGVzRGlyZWN0b3J5LCBwLnBhdGNoRmlsZW5hbWUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0YXJnZXRQYXRjaCA9PT0gcC5zZXF1ZW5jZU5hbWUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0IG4gPSBOdW1iZXIodGFyZ2V0UGF0Y2gucmVwbGFjZSgvXjArL2csIFwiXCIpKVxuICAgIGlmICghaXNOYU4obikgJiYgbiA9PT0gcC5zZXF1ZW5jZU51bWJlcikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0pXG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNvbG9ycy5yZWQoXCJDb3VsZCBub3QgZmluZCB0YXJnZXQgcGF0Y2ggZmlsZVwiKSxcbiAgICAgIGNvbG9ycy5ib2xkKHRhcmdldFBhdGNoKSxcbiAgICApXG4gICAgY29uc29sZS5sb2coKVxuICAgIGNvbnNvbGUubG9nKFwiVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHBhdGNoIGZpbGVzIGlzOlwiKVxuICAgIHBhY2thZ2VQYXRjaGVzLmZvckVhY2goKHApID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGAgIC0gJHtwLnBhdGNoRmlsZW5hbWV9YClcbiAgICB9KVxuXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbiAgY29uc3QgY3VycmVudEhhc2ggPSBoYXNoRmlsZShqb2luKHBhdGNoZXNEaXJlY3RvcnksIHRhcmdldC5wYXRjaEZpbGVuYW1lKSlcblxuICBjb25zdCBwcmV2QXBwbGljYXRpb24gPSBzdGF0ZS5wYXRjaGVzLmZpbmQoXG4gICAgKHApID0+IHAucGF0Y2hDb250ZW50SGFzaCA9PT0gY3VycmVudEhhc2gsXG4gIClcbiAgaWYgKCFwcmV2QXBwbGljYXRpb24pIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNvbG9ycy5yZWQoXCJDb3VsZCBub3QgZmluZCBwcmV2aW91cyBhcHBsaWNhdGlvbiBvZiBwYXRjaCBmaWxlXCIpLFxuICAgICAgY29sb3JzLmJvbGQodGFyZ2V0LnBhdGNoRmlsZW5hbWUpLFxuICAgIClcbiAgICBjb25zb2xlLmxvZygpXG4gICAgY29uc29sZS5sb2coXCJZb3Ugc2hvdWxkIHJlaW5zdGFsbCBub2RlX21vZHVsZXMgYW5kIHRyeSBhZ2Fpbi5cIilcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuXG4gIC8vIG9rLCB3ZSBhcmUgZ29vZCB0byBzdGFydCB1bmRvaW5nIGFsbCB0aGUgcGF0Y2hlcyB0aGF0IHdlcmUgYXBwbGllZCB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgdGFyZ2V0IHBhdGNoXG4gIGNvbnN0IHRhcmdldElkeCA9IHN0YXRlLnBhdGNoZXMuaW5kZXhPZihwcmV2QXBwbGljYXRpb24pXG5cbiAgdW5BcHBseVBhdGNoZXMoe1xuICAgIHBhdGNoZXM6IHBhY2thZ2VQYXRjaGVzLnNsaWNlKHRhcmdldElkeCArIDEpLFxuICAgIGFwcFBhdGgsXG4gICAgcGF0Y2hEaXIsXG4gIH0pXG4gIHNhdmVQYXRjaEFwcGxpY2F0aW9uU3RhdGUoe1xuICAgIHBhY2thZ2VEZXRhaWxzOiBwYWNrYWdlUGF0Y2hlc1swXSxcbiAgICBpc1JlYmFzaW5nOiB0cnVlLFxuICAgIHBhdGNoZXM6IHBhY2thZ2VQYXRjaGVzLnNsaWNlKDAsIHRhcmdldElkeCArIDEpLm1hcCgocCkgPT4gKHtcbiAgICAgIHBhdGNoRmlsZW5hbWU6IHAucGF0Y2hGaWxlbmFtZSxcbiAgICAgIHBhdGNoQ29udGVudEhhc2g6IGhhc2hGaWxlKGpvaW4ocGF0Y2hlc0RpcmVjdG9yeSwgcC5wYXRjaEZpbGVuYW1lKSksXG4gICAgICBkaWRBcHBseTogdHJ1ZSxcbiAgICB9KSksXG4gIH0pXG5cbiAgY29uc29sZS5sb2coYFxuTWFrZSBhbnkgY2hhbmdlcyB5b3UgbmVlZCBpbnNpZGUgJHtjb2xvcnMuYm9sZChwYWNrYWdlUGF0Y2hlc1swXS5wYXRoKX1cblxuV2hlbiB5b3UgYXJlIGRvbmUsIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXG4gIFRvIHVwZGF0ZSAke2NvbG9ycy5ib2xkKHBhY2thZ2VQYXRjaGVzW3RhcmdldElkeF0ucGF0Y2hGaWxlbmFtZSl9IHJ1blxuXG4gICAgJHtjb2xvcnMuYm9sZChgcGF0Y2gtcGFja2FnZSAke3BhY2thZ2VQYXRoU3BlY2lmaWVyfWApfVxuICAgIFxuICBUbyBjcmVhdGUgYSBuZXcgcGF0Y2ggZmlsZSBhZnRlciAke2NvbG9ycy5ib2xkKFxuICAgIHBhY2thZ2VQYXRjaGVzW3RhcmdldElkeF0ucGF0Y2hGaWxlbmFtZSxcbiAgKX0gcnVuXG4gIFxuICAgICR7Y29sb3JzLmJvbGQoXG4gICAgICBgcGF0Y2gtcGFja2FnZSAke3BhY2thZ2VQYXRoU3BlY2lmaWVyfSAtLWFwcGVuZCAnTXlDaGFuZ2VEZXNjcmlwdGlvbidgLFxuICAgICl9XG5cbiAgYClcbn1cblxuZnVuY3Rpb24gdW5BcHBseVBhdGNoZXMoe1xuICBwYXRjaGVzLFxuICBhcHBQYXRoLFxuICBwYXRjaERpcixcbn06IHtcbiAgcGF0Y2hlczogUGF0Y2hlZFBhY2thZ2VEZXRhaWxzW11cbiAgYXBwUGF0aDogc3RyaW5nXG4gIHBhdGNoRGlyOiBzdHJpbmdcbn0pIHtcbiAgZm9yIChjb25zdCBwYXRjaCBvZiBwYXRjaGVzLnNsaWNlKCkucmV2ZXJzZSgpKSB7XG4gICAgaWYgKFxuICAgICAgIWFwcGx5UGF0Y2goe1xuICAgICAgICBwYXRjaEZpbGVQYXRoOiBqb2luKGFwcFBhdGgsIHBhdGNoRGlyLCBwYXRjaC5wYXRjaEZpbGVuYW1lKSBhcyBzdHJpbmcsXG4gICAgICAgIHJldmVyc2U6IHRydWUsXG4gICAgICAgIHBhdGNoRGV0YWlsczogcGF0Y2gsXG4gICAgICAgIHBhdGNoRGlyLFxuICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgIGJlc3RFZmZvcnQ6IGZhbHNlLFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjb2xvcnMucmVkKFwiRmFpbGVkIHRvIHVuLWFwcGx5IHBhdGNoIGZpbGVcIiksXG4gICAgICAgIGNvbG9ycy5ib2xkKHBhdGNoLnBhdGNoRmlsZW5hbWUpLFxuICAgICAgICBcIlRyeSBjb21wbGV0ZWx5IHJlaW5zdGFsbGluZyBub2RlX21vZHVsZXMuXCIsXG4gICAgICApXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9XG4gICAgY29uc29sZS5sb2coY29sb3JzLmN5YW4oY29sb3JzLmJvbGQoXCJVbi1hcHBsaWVkXCIpKSwgcGF0Y2gucGF0Y2hGaWxlbmFtZSlcbiAgfVxufVxuIl19