diff --git a/dist/index.mjs b/dist/index.mjs index 314ccd7..74b6da0 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -165,6 +165,32 @@ function getInput(name) { } // src/compare.ts +function buildTree(input) { + const root = { name: "", path: "", value: 0, children: [] }; + for (const [filePath, { bytesInOutput }] of Object.entries(input)) { + const directories = filePath.split("/"); + buildNode(root, directories, bytesInOutput); + } + return root; +} +function buildNode(node, directories, value) { + const dir = directories.shift(); + if (dir === void 0) { + return; + } + let child = node.children.find((child2) => child2.name === dir); + if (!child) { + child = { + name: dir, + path: `${node.path}/${dir}`.replace(/^\//, ""), + value, + children: [] + }; + node.children.push(child); + } + node.value += value; + buildNode(child, directories, value); +} function compare(input) { let hasAnyChange = false; let output = `## \u{1F4E6} esbuild Bundle Analysis for ${input.name} @@ -186,6 +212,18 @@ This analysis was generated by [esbuild-bundle-analyzer](https://github.com/exoe } catch (e) { base = {}; } + const trees = /* @__PURE__ */ new Map(); + for (const metafileRelPath of input.metafiles) { + const metafile = loadMetaFile(path.join(process.cwd(), metafileRelPath)); + for (const [outfile, buildMeta] of Object.entries(metafile.outputs)) { + const tree = buildTree(buildMeta.inputs); + trees.set(`${metafileRelPath} -> ${outfile}`, tree); + fs2.writeFileSync( + path.join(process.cwd(), input.analyzerDirectory, "tree.json"), + JSON.stringify(tree, null, 2) + ); + } + } const allOutFiles = [ .../* @__PURE__ */ new Set([...Object.keys(current), ...Object.keys(base)]) ].sort(); @@ -194,11 +232,14 @@ This analysis was generated by [esbuild-bundle-analyzer](https://github.com/exoe const baseStats = base[outfile]; if (!currentStats) { hasAnyChange = true; - return { ...baseStats, diff: -1, remark: "deleted" }; + return { ...baseStats, diff: -1, remark: "deleted", tree: void 0 }; } + const tree = trees.get( + `${currentStats.metafile} -> ${currentStats.outfile}` + ); if (!baseStats) { hasAnyChange = true; - return { ...currentStats, diff: -1, remark: "added" }; + return { ...currentStats, diff: -1, remark: "added", tree }; } const diff = currentStats.bytes - baseStats.bytes; const increase = !!Math.sign(diff); @@ -208,11 +249,13 @@ This analysis was generated by [esbuild-bundle-analyzer](https://github.com/exoe return { ...currentStats, diff, + tree, remark: increase ? "increased" : "decreased" }; }); if (hasAnyChange) { output += markdownTable(comparison, input.percentExtraAttention); + output += fileSizeTable(comparison, input.percentExtraAttention); if (input.showDetails) { output += `
@@ -232,11 +275,6 @@ This analysis was generated by [esbuild-bundle-analyzer](https://github.com/exoe output += "This PR introduced no changes to the esbuild bundle! \u{1F64C}"; } output += ``; - console.dir({ - input, - hasAnyChange, - output - }); fs2.mkdirSync(path.join(process.cwd(), input.analyzerDirectory), { recursive: true }); @@ -267,6 +305,84 @@ Meta File | Out File | Size (raw) | Note ----------|----------|-----------:|------ ${rows}`; } +function findLargeDirectories(root) { + const nodes = []; + const queue = [ + { node: root, depth: 0 } + ]; + while (queue.length > 0) { + const shift = queue.shift(); + if (!shift) { + break; + } + const { node, depth } = shift; + if (depth === 3) { + nodes.push(node); + continue; + } + if (node.children.length === 0) { + nodes.push(node); + } else { + for (const item of node.children) { + queue.push({ node: item, depth: depth + 1 }); + } + } + } + const largeNodes = nodes.sort((a, b) => b.value - a.value).slice(0, 10); + const rest = { + value: root.value - largeNodes.reduce((acc, node) => acc + node.value, 0) + }; + return { largeNodes, rest }; +} +function fileSizeTable(data, redThreshold) { + let output = ""; + for (const d of data) { + output += "\n"; + output += `## ${d.metafile} -> ${d.outfile} +`; + if (d.tree) { + const total = d.tree.value; + const { largeNodes, rest } = findLargeDirectories(d.tree); + output += "| Path | Size | Percentage |\n"; + output += "|------|------|------------|\n"; + const largestNodePercent = Math.min( + Number((largeNodes[0].value / total * 100).toFixed(0)), + 100 + ); + const restPercent = Math.min( + Number((rest.value / total * 100).toFixed(0)), + 100 + ); + const largestPercent = Math.max(largestNodePercent, restPercent); + for (const node of largeNodes) { + const percent = Math.min( + Number((node.value / total * 100).toFixed(0)), + 100 + ); + output += `| ${node.path} | ${filesize2(node.value)} | ${renderBar( + percent, + largestPercent + )} | +`; + } + if (rest.value > 0) { + output += `| (other) | ${filesize2(rest.value)} | ${renderBar( + restPercent, + largestPercent + )} | +`; + } + } else { + output += "Deleted\n"; + } + } + return output; +} +function renderBar(percent, largestPercent) { + const barLength = 2e3 / largestPercent; + const bar = "\u2588".repeat(Math.round(percent / 100 * barLength)); + return `\${{\\color{BrickRed}{\\textsf{ ${bar} }}}}$ ${percent}%`; +} function renderSize(d) { return filesize2(d.bytes); } @@ -393,4 +509,4 @@ filesize/dist/filesize.esm.js: * @version 10.1.1 *) */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXJlLnRzIiwgIi4uL3NyYy91dGlscy50cyIsICIuLi9zcmMvcmVwb3J0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgeyBjb21wYXJlIH0gZnJvbSBcIi4vY29tcGFyZVwiO1xuaW1wb3J0IHsgcmVwb3J0IH0gZnJvbSBcIi4vcmVwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0SW5wdXQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5mdW5jdGlvbiBnZXRPcHRpb25zKCk6IE9wdGlvbnMge1xuXHRjb25zdCByYXdNZXRhZmlsZXMgPSBnZXRJbnB1dChcIm1ldGFmaWxlc1wiKTtcblx0aWYgKCFyYXdNZXRhZmlsZXMpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJtZXRhZmlsZXMgaXMgbm90IHNwZWNpZmllZFwiKTtcblx0fVxuXHRjb25zdCBuYW1lID0gZ2V0SW5wdXQoXCJuYW1lXCIpO1xuXHRpZiAoIW5hbWUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGlzIG5vdCBzcGVjaWZpZWRcIik7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRwZXJjZW50RXh0cmFBdHRlbnRpb246IE51bWJlci5wYXJzZUludChcblx0XHRcdGdldElucHV0KFwicGVyY2VudF9leHRyYV9hdHRlbnRpb25cIikgfHwgXCIyMFwiLFxuXHRcdFx0MTAsXG5cdFx0KSxcblx0XHRzaG93RGV0YWlsczogW1widHJ1ZVwiLCBcIlRydWVcIiwgXCJUUlVFXCJdLmluY2x1ZGVzKFxuXHRcdFx0Z2V0SW5wdXQoXCJzaG93X2RldGFpbHNcIikgfHwgXCJ0cnVlXCIsXG5cdFx0KSxcblx0XHRpbmNsdWRlRXh0ZW5zaW9uczogKFxuXHRcdFx0Z2V0SW5wdXQoXCJpbmNsdWRlX2V4dGVuc2lvbnNcIikgfHwgXCIuanMsLm1qcywuY2pzXCJcblx0XHQpLnNwbGl0KFwiLFwiKSxcblx0XHRuYW1lLFxuXHRcdGFuYWx5emVyRGlyZWN0b3J5OiBnZXRJbnB1dChcImFuYWx5emVfZGlyZWN0b3J5XCIpIHx8IFwiLmFuYWx5emVyXCIsXG5cdFx0bWV0YWZpbGVzOiByYXdNZXRhZmlsZXMuc3BsaXQoXCIsXCIpLFxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuKG9wdGlvbnM6IE9wdGlvbnMgPSBnZXRPcHRpb25zKCkpOiB2b2lkIHtcblx0cmVwb3J0KG9wdGlvbnMpO1xuXHRjb21wYXJlKG9wdGlvbnMpO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEudXJsID09PSBwYXRoVG9GaWxlVVJMKHByb2Nlc3MuYXJndlsxXSkuaHJlZikge1xuXHRydW4oKTtcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVzaXplIGFzIG9yaWdpbmFsRmlsZXNpemUgfSBmcm9tIFwiZmlsZXNpemVcIjtcbmltcG9ydCB0eXBlIHsgQ29tcGFyZVJlc3VsdCwgT3B0aW9ucywgUmVwb3J0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGxvYWRBbmFseXNpc0pzb24gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZShpbnB1dDogT3B0aW9ucyk6IHZvaWQge1xuXHRsZXQgaGFzQW55Q2hhbmdlID0gZmFsc2U7XG5cdGxldCBvdXRwdXQgPSBgIyMgXHVEODNEXHVEQ0U2IGVzYnVpbGQgQnVuZGxlIEFuYWx5c2lzIGZvciAke2lucHV0Lm5hbWV9XG5cblRoaXMgYW5hbHlzaXMgd2FzIGdlbmVyYXRlZCBieSBbZXNidWlsZC1idW5kbGUtYW5hbHl6ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9leG9lZ28vZXNidWlsZC1idW5kbGUtYW5hbHl6ZXIpLiBcdUQ4M0VcdUREMTZcbmA7XG5cblx0Y29uc3QgY3VycmVudCA9IGxvYWRBbmFseXNpc0pzb24oXG5cdFx0cGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGlucHV0LmFuYWx5emVyRGlyZWN0b3J5LCBcImJ1bmRsZV9hbmFseXNpcy5qc29uXCIpLFxuXHQpO1xuXHRsZXQgYmFzZTogUmVwb3J0O1xuXHR0cnkge1xuXHRcdGJhc2UgPSBsb2FkQW5hbHlzaXNKc29uKFxuXHRcdFx0cGF0aC5qb2luKFxuXHRcdFx0XHRwcm9jZXNzLmN3ZCgpLFxuXHRcdFx0XHRpbnB1dC5hbmFseXplckRpcmVjdG9yeSxcblx0XHRcdFx0XCJiYXNlL2J1bmRsZS9idW5kbGVfYW5hbHlzaXMuanNvblwiLFxuXHRcdFx0KSxcblx0XHQpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0YmFzZSA9IHt9O1xuXHR9XG5cblx0Y29uc3QgYWxsT3V0RmlsZXM6IHN0cmluZ1tdID0gW1xuXHRcdC4uLm5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGN1cnJlbnQpLCAuLi5PYmplY3Qua2V5cyhiYXNlKV0pLFxuXHRdLnNvcnQoKTtcblx0Y29uc3QgY29tcGFyaXNvbjogQXJyYXk8Q29tcGFyZVJlc3VsdD4gPSBhbGxPdXRGaWxlcy5tYXAoKG91dGZpbGUpID0+IHtcblx0XHRjb25zdCBjdXJyZW50U3RhdHMgPSBjdXJyZW50W291dGZpbGVdO1xuXHRcdGNvbnN0IGJhc2VTdGF0cyA9IGJhc2Vbb3V0ZmlsZV07XG5cblx0XHRpZiAoIWN1cnJlbnRTdGF0cykge1xuXHRcdFx0aGFzQW55Q2hhbmdlID0gdHJ1ZTtcblx0XHRcdC8vIGRlbGV0ZWQgb3V0IGZpbGVcblx0XHRcdHJldHVybiB7IC4uLmJhc2VTdGF0cywgZGlmZjogLTEsIHJlbWFyazogXCJkZWxldGVkXCIgfTtcblx0XHR9XG5cdFx0aWYgKCFiYXNlU3RhdHMpIHtcblx0XHRcdGhhc0FueUNoYW5nZSA9IHRydWU7XG5cdFx0XHQvLyBuZXcgb3V0IGZpbGVcblx0XHRcdHJldHVybiB7IC4uLmN1cnJlbnRTdGF0cywgZGlmZjogLTEsIHJlbWFyazogXCJhZGRlZFwiIH07XG5cdFx0fVxuXHRcdGNvbnN0IGRpZmYgPSBjdXJyZW50U3RhdHMuYnl0ZXMgLSBiYXNlU3RhdHMuYnl0ZXM7XG5cdFx0Y29uc3QgaW5jcmVhc2UgPSAhIU1hdGguc2lnbihkaWZmKTtcblx0XHRpZiAoZGlmZiAhPT0gMCkge1xuXHRcdFx0aGFzQW55Q2hhbmdlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdC4uLmN1cnJlbnRTdGF0cyxcblx0XHRcdGRpZmYsXG5cdFx0XHRyZW1hcms6IGluY3JlYXNlID8gXCJpbmNyZWFzZWRcIiA6IFwiZGVjcmVhc2VkXCIsXG5cdFx0fTtcblx0fSk7XG5cblx0aWYgKGhhc0FueUNoYW5nZSkge1xuXHRcdG91dHB1dCArPSBtYXJrZG93blRhYmxlKGNvbXBhcmlzb24sIGlucHV0LnBlcmNlbnRFeHRyYUF0dGVudGlvbik7XG5cblx0XHRpZiAoaW5wdXQuc2hvd0RldGFpbHMpIHtcblx0XHRcdG91dHB1dCArPSBgXFxuPGRldGFpbHM+XG48c3VtbWFyeT5EZXRhaWxzPC9zdW1tYXJ5PlxuPHA+TmV4dCB0byB0aGUgc2l6ZSBpcyBob3cgbXVjaCB0aGUgc2l6ZSBoYXMgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZCBjb21wYXJlZCB3aXRoIHRoZSBiYXNlIGJyYW5jaCBvZiB0aGlzIFBSLjwvcD5cbjx1bD5cbjxsaT5cdTIwM0NcdUZFMEY6IFNpemUgaW5jcmVhc2VkIGJ5ICR7aW5wdXQucGVyY2VudEV4dHJhQXR0ZW50aW9ufSUgb3IgbW9yZS4gU3BlY2lhbCBhdHRlbnRpb24gc2hvdWxkIGJlIGdpdmVuIHRvIHRoaXMuPC9saT5cbjxsaT5cdTI2QTBcdUZFMEY6IFNpemUgaW5jcmVhc2VkIGluIGFjY2VwdGFibGUgcmFuZ2UgKGxvd2VyIHRoYW4gJHtpbnB1dC5wZXJjZW50RXh0cmFBdHRlbnRpb259JSkuPC9saT5cbjxsaT5cdTI3MDU6IE5vIGNoYW5nZSBvciBldmVuIGRvd25zaXplZC48L2xpPlxuPGxpPlx1RDgzRFx1REREMVx1RkUwRjogVGhlIG91dCBmaWxlIGlzIGRlbGV0ZWQ6IG5vdCBmb3VuZCBpbiBiYXNlIGJyYW5jaC48L2xpPlxuPGxpPlx1RDgzQ1x1REQ5NTogVGhlIG91dCBmaWxlIGlzIG5ld2x5IGZvdW5kOiB3aWxsIGJlIGFkZGVkIHRvIGJhc2UgYnJhbmNoLjwvbGk+XG48L3VsPlxuPC9kZXRhaWxzPlxcbmA7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdG91dHB1dCArPSBcIlRoaXMgUFIgaW50cm9kdWNlZCBubyBjaGFuZ2VzIHRvIHRoZSBlc2J1aWxkIGJ1bmRsZSEgXHVEODNEXHVERTRDXCI7XG5cdH1cblxuXHQvLyB3ZSBhZGQgdGhpcyB0YWcgc28gdGhhdCBvdXIgYWN0aW9uIGNhbiBiZSBhYmxlIHRvIGVhc2lseSBhbmRcblx0Ly8gY29uc2lzdGVudGx5IGZpbmQgdGhlIHJpZ2h0IGNvbW1lbnQgdG8gZWRpdCBhcyBtb3JlIGNvbW1pdHMgYXJlIHB1c2hlZC5cblx0b3V0cHV0ICs9IGA8IS0tIF9fRVNCVUlMRF9CVU5ETEVfJHtpbnB1dC5uYW1lfSAtLT5gO1xuXG5cdC8vIExvZyBtb3N0bHkgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZy5cblx0Ly8gVGhpcyB3aWxsIHNob3cgdXAgaW4gdGhlIGdpdGh1YiBhY3Rpb25zIGNvbnNvbGUuXG5cdGNvbnNvbGUuZGlyKHtcblx0XHRpbnB1dCxcblx0XHRoYXNBbnlDaGFuZ2UsXG5cdFx0b3V0cHV0LFxuXHR9KTtcblxuXHQvLyBXcml0ZSB0aGUgb3V0cHV0IHRvIGEgZmlsZSB3aGljaCBpcyBsYXRlciByZWFkIGluXG5cdC8vIGFzIGNvbW1lbnQgY29udGVudHMgYnkgdGhlIGFjdGlvbnMgd29ya2Zsb3cuXG5cdGZzLm1rZGlyU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgaW5wdXQuYW5hbHl6ZXJEaXJlY3RvcnkpLCB7XG5cdFx0cmVjdXJzaXZlOiB0cnVlLFxuXHR9KTtcblx0ZnMud3JpdGVGaWxlU3luYyhcblx0XHRwYXRoLmpvaW4oXG5cdFx0XHRwcm9jZXNzLmN3ZCgpLFxuXHRcdFx0aW5wdXQuYW5hbHl6ZXJEaXJlY3RvcnksXG5cdFx0XHRcImJ1bmRsZV9hbmFseXNpc19jb21tZW50LnR4dFwiLFxuXHRcdCksXG5cdFx0b3V0cHV0LnRyaW0oKSxcblx0KTtcbn1cblxuZnVuY3Rpb24gZmlsZXNpemUoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG5cdHJldHVybiBvcmlnaW5hbEZpbGVzaXplKGJ5dGVzLCB7XG5cdFx0c3BhY2VyOiBcIlx1MDBBMFwiLFxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbWFya2Rvd25UYWJsZShcblx0ZGF0YTogQXJyYXk8Q29tcGFyZVJlc3VsdD4sXG5cdHJlZFRocmVzaG9sZDogbnVtYmVyLFxuKTogc3RyaW5nIHtcblx0Y29uc3Qgcm93cyA9IGRhdGFcblx0XHQubWFwKChkKSA9PiB7XG5cdFx0XHRyZXR1cm4gYCR7ZC5tZXRhZmlsZX0gfCAke2Qub3V0ZmlsZX0gfCAke3JlbmRlclNpemUoZCl9IHwgJHtyZW5kZXJOb3RlKFxuXHRcdFx0XHRkLFxuXHRcdFx0XHRyZWRUaHJlc2hvbGQsXG5cdFx0XHQpfVxcbmA7XG5cdFx0fSlcblx0XHQuam9pbihcIlwiKTtcblxuXHRyZXR1cm4gYFxuTWV0YSBGaWxlIHwgT3V0IEZpbGUgIHwgU2l6ZSAocmF3KSB8IE5vdGUgXG4tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS06fC0tLS0tLVxuJHtyb3dzfWA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNpemUoZDogQ29tcGFyZVJlc3VsdCk6IHN0cmluZyB7XG5cdHJldHVybiBmaWxlc2l6ZShkLmJ5dGVzKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTm90ZShkOiBDb21wYXJlUmVzdWx0LCByZWRUaHJlc2hvbGQ6IG51bWJlcik6IHN0cmluZyB7XG5cdGlmIChkLnJlbWFyayA9PT0gXCJkZWxldGVkXCIpIHtcblx0XHRyZXR1cm4gXCJcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlZFwiO1xuXHR9XG5cdGlmIChkLnJlbWFyayA9PT0gXCJhZGRlZFwiKSB7XG5cdFx0cmV0dXJuIFwiXHVEODNDXHVERDk1IEFkZGVkXCI7XG5cdH1cblx0aWYgKGQuZGlmZikge1xuXHRcdGNvbnN0IHBlcmNlbnRDaGFuZ2UgPSAoZC5kaWZmIC8gZC5ieXRlcykgKiAxMDA7XG5cdFx0cmV0dXJuIGAke3JlbmRlclN0YXR1c0luZGljYXRvcihwZXJjZW50Q2hhbmdlLCByZWRUaHJlc2hvbGQpfSR7ZmlsZXNpemUoXG5cdFx0XHRkLmRpZmYsXG5cdFx0KX0gKCR7c2lnbihwZXJjZW50Q2hhbmdlKX0ke3BlcmNlbnRDaGFuZ2UudG9GaXhlZCgxKX0lKWA7XG5cdH1cblx0cmV0dXJuIFwiXHUyNzA1ICBObyBjaGFuZ2VcIjtcbn1cblxuZnVuY3Rpb24gc2lnbihudW06IG51bWJlcik6IHN0cmluZyB7XG5cdHJldHVybiBudW0gPCAwID8gXCJcIiA6IFwiK1wiO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTdGF0dXNJbmRpY2F0b3IoXG5cdHBlcmNlbnRDaGFuZ2U6IG51bWJlcixcblx0cmVkVGhyZXNob2xkOiBudW1iZXIsXG4pOiBzdHJpbmcge1xuXHRsZXQgcmVzOiBzdHJpbmc7XG5cdGlmIChwZXJjZW50Q2hhbmdlID4gMCAmJiBwZXJjZW50Q2hhbmdlIDwgcmVkVGhyZXNob2xkKSB7XG5cdFx0cmVzID0gXCJcdTI2QTBcdUZFMEZcIjtcblx0fSBlbHNlIGlmIChwZXJjZW50Q2hhbmdlID49IHJlZFRocmVzaG9sZCkge1xuXHRcdHJlcyA9IFwiXHUyMDNDXHVGRTBGXCI7XG5cdH0gZWxzZSB7XG5cdFx0cmVzID0gXCJcdTI3MDUgXCI7XG5cdH1cblx0cmV0dXJuIGAke3Jlc30gJHtzaWduKHBlcmNlbnRDaGFuZ2UpfWA7XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCI7XG5cbmltcG9ydCB0eXBlIHsgTWV0YWZpbGUgfSBmcm9tIFwiZXNidWlsZFwiO1xuaW1wb3J0IHR5cGUgeyBSZXBvcnQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5mdW5jdGlvbiBsb2FkSnNvbkZpbGUocGF0aDogc3RyaW5nKSB7XG5cdHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoKS50b1N0cmluZyhcInV0Zi04XCIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRNZXRhRmlsZShwYXRoOiBzdHJpbmcpOiBNZXRhZmlsZSB7XG5cdHJldHVybiBsb2FkSnNvbkZpbGUocGF0aCkgYXMgTWV0YWZpbGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQW5hbHlzaXNKc29uKHBhdGg6IHN0cmluZyk6IFJlcG9ydCB7XG5cdHJldHVybiBsb2FkSnNvbkZpbGUocGF0aCkgYXMgUmVwb3J0O1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYWN0aW9ucy90b29sa2l0L2Jsb2IvODFhNzNhYmE4YmVkZDUzMmY2ZWRkY2M0MWVkM2EwZmFkOGIxY2ZlYi9wYWNrYWdlcy9jb3JlL3NyYy9jb3JlLnRzI0wxMjZcbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnB1dChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCB2YWwgPSBwcm9jZXNzLmVudltgSU5QVVRfJHtuYW1lLnRvVXBwZXJDYXNlKCl9YF0gfHwgXCJcIjtcblx0cmV0dXJuIHZhbC50cmltKCk7XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgcHJvY2VzcyBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5cbmltcG9ydCB0eXBlIHsgT3B0aW9ucywgUmVwb3J0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGxvYWRNZXRhRmlsZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnQoaW5wdXQ6IE9wdGlvbnMpOiB2b2lkIHtcblx0Y29uc3QgYWxsUGFnZVNpemVzID0gZ2V0QWxsUGFnZVNpemVzKGlucHV0KTtcblx0ZnMubWtkaXJTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBpbnB1dC5hbmFseXplckRpcmVjdG9yeSksIHtcblx0XHRyZWN1cnNpdmU6IHRydWUsXG5cdH0pO1xuXHRjb25zdCByZXN1bHRKc29uUGF0aCA9IHBhdGguam9pbihcblx0XHRwcm9jZXNzLmN3ZCgpLFxuXHRcdGlucHV0LmFuYWx5emVyRGlyZWN0b3J5LFxuXHRcdFwiYnVuZGxlX2FuYWx5c2lzLmpzb25cIixcblx0KTtcblx0ZnMud3JpdGVGaWxlU3luYyhyZXN1bHRKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoYWxsUGFnZVNpemVzLCBudWxsLCAyKSk7XG5cdGNvbnNvbGUubG9nKGBXcm90ZSAke3Jlc3VsdEpzb25QYXRofWApO1xufVxuXG5mdW5jdGlvbiBnZXRBbGxQYWdlU2l6ZXMoaW5wdXQ6IE9wdGlvbnMpOiBSZXBvcnQge1xuXHRjb25zdCBhY2M6IFJlcG9ydCA9IHt9O1xuXHRyZXR1cm4gaW5wdXQubWV0YWZpbGVzLnJlZHVjZSgoYWNjLCBtZXRhZmlsZSkgPT4ge1xuXHRcdGNvbnN0IG1ldGFGaWxlUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBtZXRhZmlsZSk7XG5cdFx0dHJ5IHtcblx0XHRcdGZzLmFjY2Vzc1N5bmMobWV0YUZpbGVQYXRoLCBmcy5jb25zdGFudHMuUl9PSyk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRgTm8gbWV0YSBmaWxlIGZvdW5kIGF0IFwiJHttZXRhRmlsZVBhdGh9XCIgLSBhIHBhdGggdG8gbWV0YSBmaWxlIG1heSBiZSB3cm9uZywgb3IgZXNidWlsZCBpcyBub3QgZXhlY3V0ZWQuYCxcblx0XHRcdCk7XG5cdFx0XHRwcm9jZXNzLmV4aXQoMSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWV0YUZpbGVKc29uID0gbG9hZE1ldGFGaWxlKG1ldGFGaWxlUGF0aCk7XG5cdFx0T2JqZWN0LmVudHJpZXMobWV0YUZpbGVKc29uLm91dHB1dHMpLnJlZHVjZSgoYWNjLCBvdXRwdXQpID0+IHtcblx0XHRcdGNvbnN0IFtvdXRmaWxlLCBidWlsZE1ldGFdID0gb3V0cHV0O1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQhaW5wdXQuaW5jbHVkZUV4dGVuc2lvbnMuc29tZSgoZXh0KSA9PlxuXHRcdFx0XHRcdG91dGZpbGUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChleHQpLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIGFjYztcblx0XHRcdH1cblx0XHRcdGFjY1tgJHttZXRhZmlsZX0gLT4gJHtvdXRmaWxlfWBdID0ge1xuXHRcdFx0XHRieXRlczogYnVpbGRNZXRhLmJ5dGVzLFxuXHRcdFx0XHRtZXRhZmlsZSxcblx0XHRcdFx0b3V0ZmlsZSxcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gYWNjO1xuXHRcdH0sIGFjYyk7XG5cdFx0cmV0dXJuIGFjYztcblx0fSwgYWNjKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLHFCQUFxQjs7O0FDQTlCLE9BQU9BLFNBQVE7QUFDZixPQUFPLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRGpCLE9BQU8sUUFBUTtBQUtmLFNBQVMsYUFBYUMsT0FBYztBQUNuQyxTQUFPLEtBQUssTUFBTSxHQUFHLGFBQWFBLEtBQUksRUFBRSxTQUFTLE9BQU8sQ0FBQztBQUMxRDtBQUVPLFNBQVMsYUFBYUEsT0FBd0I7QUFDcEQsU0FBTyxhQUFhQSxLQUFJO0FBQ3pCO0FBRU8sU0FBUyxpQkFBaUJBLE9BQXNCO0FBQ3RELFNBQU8sYUFBYUEsS0FBSTtBQUN6QjtBQUdPLFNBQVMsU0FBUyxNQUFzQjtBQUM5QyxRQUFNLE1BQU0sUUFBUSxJQUFJLFNB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QU8sU0FBUyxNQUFNO0FBQzVCLE1BQUksQ0FBQyxNQUFNO0FBQ1YsVUFBTSxJQUFJLE1BQU0sdUJBQXVCO0FBQUEsRUFDeEM7QUFDQSxTQUFPO0FBQUEsSUFDTix1QkFBdUIsT0FBTztBQUFBLE1BQzdCLFNBQVMseUJBQXlCLEtBQUs7QUFBQSxNQUN2QztBQUFBLElBQ0Q7QUFBQSxJQUNBLGFBQWEsQ0FBQyxRQUFRLFFBQVEsTUFBTSxFQUFFO0FBQUEsTUFDckMsU0FBUyxjQUFjLEtBQUs7QUFBQSxJQUM3QjtBQUFBLElBQ0Esb0JBQ0MsU0FBUyxvQkFBb0IsS0FBSyxpQkFDakMsTUFBTSxHQUFHO0FBQUEsSUFDWDtBQUFBLElBQ0EsbUJBQW1CLFNBQVMsbUJBQW1CLEtBQUs7QUFBQSxJQUNwRCxXQUFXLGFBQWEsTUFBTSxHQUFHO0FBQUEsRUFDbEM7QUFDRDtBQUVPLFNBQVMsSUFBSSxVQUFtQixXQUFXLEdBQVM7QUFDMUQsU0FBTyxPQUFPO0FBQ2QsVUFBUSxPQUFPO0FBQ2hCO0FBRUEsSUFBSSxZQUFZLFFBQVEsY0FBYyxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTTtBQUM1RCxNQUFJO0FBQ0w7IiwKICAibmFtZXMiOiBbImZzIiwgInBhdGgiLCAiZnMiLCAiZmlsZXNpemUiLCAiZnMiLCAicGF0aCIsICJwcm9jZXNzIiwgImZzIiwgInBhdGgiLCAicHJvY2VzcyIsICJhY2MiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXJlLnRzIiwgIi4uL3NyYy91dGlscy50cyIsICIuLi9zcmMvcmVwb3J0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgeyBjb21wYXJlIH0gZnJvbSBcIi4vY29tcGFyZVwiO1xuaW1wb3J0IHsgcmVwb3J0IH0gZnJvbSBcIi4vcmVwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0SW5wdXQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5mdW5jdGlvbiBnZXRPcHRpb25zKCk6IE9wdGlvbnMge1xuXHRjb25zdCByYXdNZXRhZmlsZXMgPSBnZXRJbnB1dChcIm1ldGFmaWxlc1wiKTtcblx0aWYgKCFyYXdNZXRhZmlsZXMpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJtZXRhZmlsZXMgaXMgbm90IHNwZWNpZmllZFwiKTtcblx0fVxuXHRjb25zdCBuYW1lID0gZ2V0SW5wdXQoXCJuYW1lXCIpO1xuXHRpZiAoIW5hbWUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGlzIG5vdCBzcGVjaWZpZWRcIik7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRwZXJjZW50RXh0cmFBdHRlbnRpb246IE51bWJlci5wYXJzZUludChcblx0XHRcdGdldElucHV0KFwicGVyY2VudF9leHRyYV9hdHRlbnRpb25cIikgfHwgXCIyMFwiLFxuXHRcdFx0MTAsXG5cdFx0KSxcblx0XHRzaG93RGV0YWlsczogW1widHJ1ZVwiLCBcIlRydWVcIiwgXCJUUlVFXCJdLmluY2x1ZGVzKFxuXHRcdFx0Z2V0SW5wdXQoXCJzaG93X2RldGFpbHNcIikgfHwgXCJ0cnVlXCIsXG5cdFx0KSxcblx0XHRpbmNsdWRlRXh0ZW5zaW9uczogKFxuXHRcdFx0Z2V0SW5wdXQoXCJpbmNsdWRlX2V4dGVuc2lvbnNcIikgfHwgXCIuanMsLm1qcywuY2pzXCJcblx0XHQpLnNwbGl0KFwiLFwiKSxcblx0XHRuYW1lLFxuXHRcdGFuYWx5emVyRGlyZWN0b3J5OiBnZXRJbnB1dChcImFuYWx5emVfZGlyZWN0b3J5XCIpIHx8IFwiLmFuYWx5emVyXCIsXG5cdFx0bWV0YWZpbGVzOiByYXdNZXRhZmlsZXMuc3BsaXQoXCIsXCIpLFxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuKG9wdGlvbnM6IE9wdGlvbnMgPSBnZXRPcHRpb25zKCkpOiB2b2lkIHtcblx0cmVwb3J0KG9wdGlvbnMpO1xuXHRjb21wYXJlKG9wdGlvbnMpO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEudXJsID09PSBwYXRoVG9GaWxlVVJMKHByb2Nlc3MuYXJndlsxXSkuaHJlZikge1xuXHRydW4oKTtcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVzaXplIGFzIG9yaWdpbmFsRmlsZXNpemUgfSBmcm9tIFwiZmlsZXNpemVcIjtcbmltcG9ydCB0eXBlIHsgQ29tcGFyZVJlc3VsdCwgT3B0aW9ucywgUmVwb3J0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGxvYWRBbmFseXNpc0pzb24sIGxvYWRNZXRhRmlsZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmZ1bmN0aW9uIGJ1aWxkVHJlZShcblx0aW5wdXQ6IFJlY29yZDxzdHJpbmcsIHsgYnl0ZXNJbk91dHB1dDogbnVtYmVyIH0+LFxuKTogVHJlZU1hcE5vZGUge1xuXHRjb25zdCByb290OiBUcmVlTWFwTm9kZSA9IHsgbmFtZTogXCJcIiwgcGF0aDogXCJcIiwgdmFsdWU6IDAsIGNoaWxkcmVuOiBbXSB9O1xuXHRmb3IgKGNvbnN0IFtmaWxlUGF0aCwgeyBieXRlc0luT3V0cHV0IH1dIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuXHRcdGNvbnN0IGRpcmVjdG9yaWVzID0gZmlsZVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGJ1aWxkTm9kZShyb290LCBkaXJlY3RvcmllcywgYnl0ZXNJbk91dHB1dCk7XG5cdH1cblx0cmV0dXJuIHJvb3Q7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9kZShcblx0bm9kZTogVHJlZU1hcE5vZGUsXG5cdGRpcmVjdG9yaWVzOiBBcnJheTxzdHJpbmc+LFxuXHR2YWx1ZTogbnVtYmVyLFxuKTogdm9pZCB7XG5cdGNvbnN0IGRpciA9IGRpcmVjdG9yaWVzLnNoaWZ0KCk7XG5cdGlmIChkaXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRsZXQgY2hpbGQgPSBub2RlLmNoaWxkcmVuLmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5uYW1lID09PSBkaXIpO1xuXHRpZiAoIWNoaWxkKSB7XG5cdFx0Y2hpbGQgPSB7XG5cdFx0XHRuYW1lOiBkaXIsXG5cdFx0XHRwYXRoOiBgJHtub2RlLnBhdGh9LyR7ZGlyfWAucmVwbGFjZSgvXlxcLy8sIFwiXCIpLFxuXHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0Y2hpbGRyZW46IFtdLFxuXHRcdH07XG5cdFx0bm9kZS5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcblx0fVxuXHRub2RlLnZhbHVlICs9IHZhbHVlO1xuXHRidWlsZE5vZGUoY2hpbGQsIGRpcmVjdG9yaWVzLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlKGlucHV0OiBPcHRpb25zKTogdm9pZCB7XG5cdGxldCBoYXNBbnlDaGFuZ2UgPSBmYWxzZTtcblx0bGV0IG91dHB1dCA9IGAjIyBcdUQ4M0RcdURDRTYgZXNidWlsZCBCdW5kbGUgQW5hbHlzaXMgZm9yICR7aW5wdXQubmFtZX1cblxuVGhpcyBhbmFseXNpcyB3YXMgZ2VuZXJhdGVkIGJ5IFtlc2J1aWxkLWJ1bmRsZS1hbmFseXplcl0oaHR0cHM6Ly9naXRodWIuY29tL2V4b2Vnby9lc2J1aWxkLWJ1bmRsZS1hbmFseXplcikuIFx1RDgzRVx1REQxNlxuYDtcblxuXHRjb25zdCBjdXJyZW50ID0gbG9hZEFuYWx5c2lzSnNvbihcblx0XHRwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgaW5wdXQuYW5hbHl6ZXJEaXJlY3RvcnksIFwiYnVuZGxlX2FuYWx5c2lzLmpzb25cIiksXG5cdCk7XG5cdGxldCBiYXNlOiBSZXBvcnQ7XG5cdHRyeSB7XG5cdFx0YmFzZSA9IGxvYWRBbmFseXNpc0pzb24oXG5cdFx0XHRwYXRoLmpvaW4oXG5cdFx0XHRcdHByb2Nlc3MuY3dkKCksXG5cdFx0XHRcdGlucHV0LmFuYWx5emVyRGlyZWN0b3J5LFxuXHRcdFx0XHRcImJhc2UvYnVuZGxlL2J1bmRsZV9hbmFseXNpcy5qc29uXCIsXG5cdFx0XHQpLFxuXHRcdCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRiYXNlID0ge307XG5cdH1cblxuXHRjb25zdCB0cmVlcyA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxUcmVlTWFwTm9kZT4+KCk7XG5cdGZvciAoY29uc3QgbWV0YWZpbGVSZWxQYXRoIG9mIGlucHV0Lm1ldGFmaWxlcykge1xuXHRcdGNvbnN0IG1ldGFmaWxlID0gbG9hZE1ldGFGaWxlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBtZXRhZmlsZVJlbFBhdGgpKTtcblx0XHRmb3IgKGNvbnN0IFtvdXRmaWxlLCBidWlsZE1ldGFdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFmaWxlLm91dHB1dHMpKSB7XG5cdFx0XHRjb25zdCB0cmVlID0gYnVpbGRUcmVlKGJ1aWxkTWV0YS5pbnB1dHMpO1xuXHRcdFx0dHJlZXMuc2V0KGAke21ldGFmaWxlUmVsUGF0aH0gLT4gJHtvdXRmaWxlfWAsIHRyZWUpO1xuXG5cdFx0XHRmcy53cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgaW5wdXQuYW5hbHl6ZXJEaXJlY3RvcnksIFwidHJlZS5qc29uXCIpLFxuXHRcdFx0XHRKU09OLnN0cmluZ2lmeSh0cmVlLCBudWxsLCAyKSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgYWxsT3V0RmlsZXM6IHN0cmluZ1tdID0gW1xuXHRcdC4uLm5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGN1cnJlbnQpLCAuLi5PYmplY3Qua2V5cyhiYXNlKV0pLFxuXHRdLnNvcnQoKTtcblxuXHRjb25zdCBjb21wYXJpc29uOiBBcnJheTxDb21wYXJlUmVzdWx0PiA9IGFsbE91dEZpbGVzLm1hcCgob3V0ZmlsZSkgPT4ge1xuXHRcdGNvbnN0IGN1cnJlbnRTdGF0cyA9IGN1cnJlbnRbb3V0ZmlsZV07XG5cdFx0Y29uc3QgYmFzZVN0YXRzID0gYmFzZVtvdXRmaWxlXTtcblxuXHRcdGlmICghY3VycmVudFN0YXRzKSB7XG5cdFx0XHRoYXNBbnlDaGFuZ2UgPSB0cnVlO1xuXHRcdFx0Ly8gZGVsZXRlZCBvdXQgZmlsZVxuXHRcdFx0cmV0dXJuIHsgLi4uYmFzZVN0YXRzLCBkaWZmOiAtMSwgcmVtYXJrOiBcImRlbGV0ZWRcIiwgdHJlZTogdW5kZWZpbmVkIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgdHJlZSA9IHRyZWVzLmdldChcblx0XHRcdGAke2N1cnJlbnRTdGF0cy5tZXRhZmlsZX0gLT4gJHtjdXJyZW50U3RhdHMub3V0ZmlsZX1gLFxuXHRcdCk7XG5cblx0XHRpZiAoIWJhc2VTdGF0cykge1xuXHRcdFx0aGFzQW55Q2hhbmdlID0gdHJ1ZTtcblx0XHRcdC8vIG5ldyBvdXQgZmlsZVxuXHRcdFx0cmV0dXJuIHsgLi4uY3VycmVudFN0YXRzLCBkaWZmOiAtMSwgcmVtYXJrOiBcImFkZGVkXCIsIHRyZWUgfTtcblx0XHR9XG5cdFx0Y29uc3QgZGlmZiA9IGN1cnJlbnRTdGF0cy5ieXRlcyAtIGJhc2VTdGF0cy5ieXRlcztcblx0XHRjb25zdCBpbmNyZWFzZSA9ICEhTWF0aC5zaWduKGRpZmYpO1xuXHRcdGlmIChkaWZmICE9PSAwKSB7XG5cdFx0XHRoYXNBbnlDaGFuZ2UgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0Li4uY3VycmVudFN0YXRzLFxuXHRcdFx0ZGlmZixcblx0XHRcdHRyZWUsXG5cdFx0XHRyZW1hcms6IGluY3JlYXNlID8gXCJpbmNyZWFzZWRcIiA6IFwiZGVjcmVhc2VkXCIsXG5cdFx0fTtcblx0fSk7XG5cblx0aWYgKGhhc0FueUNoYW5nZSkge1xuXHRcdG91dHB1dCArPSBtYXJrZG93blRhYmxlKGNvbXBhcmlzb24sIGlucHV0LnBlcmNlbnRFeHRyYUF0dGVudGlvbik7XG5cdFx0b3V0cHV0ICs9IGZpbGVTaXplVGFibGUoY29tcGFyaXNvbiwgaW5wdXQucGVyY2VudEV4dHJhQXR0ZW50aW9uKTtcblxuXHRcdGlmIChpbnB1dC5zaG93RGV0YWlscykge1xuXHRcdFx0b3V0cHV0ICs9IGBcXG48ZGV0YWlscz5cbjxzdW1tYXJ5PkRldGFpbHM8L3N1bW1hcnk+XG48cD5OZXh0IHRvIHRoZSBzaXplIGlzIGhvdyBtdWNoIHRoZSBzaXplIGhhcyBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkIGNvbXBhcmVkIHdpdGggdGhlIGJhc2UgYnJhbmNoIG9mIHRoaXMgUFIuPC9wPlxuPHVsPlxuPGxpPlx1MjAzQ1x1RkUwRjogU2l6ZSBpbmNyZWFzZWQgYnkgJHtpbnB1dC5wZXJjZW50RXh0cmFBdHRlbnRpb259JSBvciBtb3JlLiBTcGVjaWFsIGF0dGVudGlvbiBzaG91bGQgYmUgZ2l2ZW4gdG8gdGhpcy48L2xpPlxuPGxpPlx1MjZBMFx1RkUwRjogU2l6ZSBpbmNyZWFzZWQgaW4gYWNjZXB0YWJsZSByYW5nZSAobG93ZXIgdGhhbiAke2lucHV0LnBlcmNlbnRFeHRyYUF0dGVudGlvbn0lKS48L2xpPlxuPGxpPlx1MjcwNTogTm8gY2hhbmdlIG9yIGV2ZW4gZG93bnNpemVkLjwvbGk+XG48bGk+XHVEODNEXHVEREQxXHVGRTBGOiBUaGUgb3V0IGZpbGUgaXMgZGVsZXRlZDogbm90IGZvdW5kIGluIGJhc2UgYnJhbmNoLjwvbGk+XG48bGk+XHVEODNDXHVERDk1OiBUaGUgb3V0IGZpbGUgaXMgbmV3bHkgZm91bmQ6IHdpbGwgYmUgYWRkZWQgdG8gYmFzZSBicmFuY2guPC9saT5cbjwvdWw+XG48L2RldGFpbHM+XFxuYDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0b3V0cHV0ICs9IFwiVGhpcyBQUiBpbnRyb2R1Y2VkIG5vIGNoYW5nZXMgdG8gdGhlIGVzYnVpbGQgYnVuZGxlISBcdUQ4M0RcdURFNENcIjtcblx0fVxuXG5cdC8vIHdlIGFkZCB0aGlzIHRhZyBzbyB0aGF0IG91ciBhY3Rpb24gY2FuIGJlIGFibGUgdG8gZWFzaWx5IGFuZFxuXHQvLyBjb25zaXN0ZW50bHkgZmluZCB0aGUgcmlnaHQgY29tbWVudCB0byBlZGl0IGFzIG1vcmUgY29tbWl0cyBhcmUgcHVzaGVkLlxuXHRvdXRwdXQgKz0gYDwhLS0gX19FU0JVSUxEX0JVTkRMRV8ke2lucHV0Lm5hbWV9IC0tPmA7XG5cblx0Ly8gV3JpdGUgdGhlIG91dHB1dCB0byBhIGZpbGUgd2hpY2ggaXMgbGF0ZXIgcmVhZCBpblxuXHQvLyBhcyBjb21tZW50IGNvbnRlbnRzIGJ5IHRoZSBhY3Rpb25zIHdvcmtmbG93LlxuXHRmcy5ta2RpclN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGlucHV0LmFuYWx5emVyRGlyZWN0b3J5KSwge1xuXHRcdHJlY3Vyc2l2ZTogdHJ1ZSxcblx0fSk7XG5cdGZzLndyaXRlRmlsZVN5bmMoXG5cdFx0cGF0aC5qb2luKFxuXHRcdFx0cHJvY2Vzcy5jd2QoKSxcblx0XHRcdGlucHV0LmFuYWx5emVyRGlyZWN0b3J5LFxuXHRcdFx0XCJidW5kbGVfYW5hbHlzaXNfY29tbWVudC50eHRcIixcblx0XHQpLFxuXHRcdG91dHB1dC50cmltKCksXG5cdCk7XG59XG5cbmZ1bmN0aW9uIGZpbGVzaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuXHRyZXR1cm4gb3JpZ2luYWxGaWxlc2l6ZShieXRlcywge1xuXHRcdHNwYWNlcjogXCJcdTAwQTBcIixcblx0fSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtkb3duVGFibGUoXG5cdGRhdGE6IEFycmF5PENvbXBhcmVSZXN1bHQ+LFxuXHRyZWRUaHJlc2hvbGQ6IG51bWJlcixcbik6IHN0cmluZyB7XG5cdGNvbnN0IHJvd3MgPSBkYXRhXG5cdFx0Lm1hcCgoZCkgPT4ge1xuXHRcdFx0cmV0dXJuIGAke2QubWV0YWZpbGV9IHwgJHtkLm91dGZpbGV9IHwgJHtyZW5kZXJTaXplKGQpfSB8ICR7cmVuZGVyTm90ZShcblx0XHRcdFx0ZCxcblx0XHRcdFx0cmVkVGhyZXNob2xkLFxuXHRcdFx0KX1cXG5gO1xuXHRcdH0pXG5cdFx0LmpvaW4oXCJcIik7XG5cblx0cmV0dXJuIGBcbk1ldGEgRmlsZSB8IE91dCBGaWxlICB8IFNpemUgKHJhdykgfCBOb3RlIFxuLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tOnwtLS0tLS1cbiR7cm93c31gO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGZpcnN0IHR3ZW50eSBsYXJnZXN0IG5vZGVzIGluIHJvb3QgdHJlZS5cbiAqIERpZyBub2RlcyB1bnRpbCB0aGUgZGVwdGggb2YgMy5cbiAqL1xuZnVuY3Rpb24gZmluZExhcmdlRGlyZWN0b3JpZXMocm9vdDogVHJlZU1hcE5vZGUpIHtcblx0Y29uc3Qgbm9kZXM6IFRyZWVNYXBOb2RlW10gPSBbXTtcblx0Y29uc3QgcXVldWU6IEFycmF5PHsgbm9kZTogVHJlZU1hcE5vZGU7IGRlcHRoOiBudW1iZXIgfT4gPSBbXG5cdFx0eyBub2RlOiByb290LCBkZXB0aDogMCB9LFxuXHRdO1xuXHR3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IHNoaWZ0ID0gcXVldWUuc2hpZnQoKTtcblx0XHRpZiAoIXNoaWZ0KSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0Y29uc3QgeyBub2RlLCBkZXB0aCB9ID0gc2hpZnQ7XG5cdFx0aWYgKGRlcHRoID09PSAzKSB7XG5cdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0bm9kZXMucHVzaChub2RlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIG5vZGUuY2hpbGRyZW4pIHtcblx0XHRcdFx0cXVldWUucHVzaCh7IG5vZGU6IGl0ZW0sIGRlcHRoOiBkZXB0aCArIDEgfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgbGFyZ2VOb2RlcyA9IG5vZGVzLnNvcnQoKGEsIGIpID0+IGIudmFsdWUgLSBhLnZhbHVlKS5zbGljZSgwLCAxMCk7XG5cdGNvbnN0IHJlc3QgPSB7XG5cdFx0dmFsdWU6IHJvb3QudmFsdWUgLSBsYXJnZU5vZGVzLnJlZHVjZSgoYWNjLCBub2RlKSA9PiBhY2MgKyBub2RlLnZhbHVlLCAwKSxcblx0fTtcblx0cmV0dXJuIHsgbGFyZ2VOb2RlcywgcmVzdCB9O1xufVxuXG5mdW5jdGlvbiBmaWxlU2l6ZVRhYmxlKFxuXHRkYXRhOiBBcnJheTxDb21wYXJlUmVzdWx0Pixcblx0cmVkVGhyZXNob2xkOiBudW1iZXIsXG4pOiBzdHJpbmcge1xuXHRsZXQgb3V0cHV0ID0gXCJcIjtcblxuXHRmb3IgKGNvbnN0IGQgb2YgZGF0YSkge1xuXHRcdG91dHB1dCArPSBcIlxcblwiO1xuXHRcdG91dHB1dCArPSBgIyMgJHtkLm1ldGFmaWxlfSAtPiAke2Qub3V0ZmlsZX1cXG5gO1xuXG5cdFx0aWYgKGQudHJlZSkge1xuXHRcdFx0Y29uc3QgdG90YWwgPSBkLnRyZWUudmFsdWU7XG5cdFx0XHRjb25zdCB7IGxhcmdlTm9kZXMsIHJlc3QgfSA9IGZpbmRMYXJnZURpcmVjdG9yaWVzKGQudHJlZSk7XG5cdFx0XHRvdXRwdXQgKz0gXCJ8IFBhdGggfCBTaXplIHwgUGVyY2VudGFnZSB8XFxuXCI7XG5cdFx0XHRvdXRwdXQgKz0gXCJ8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLS18XFxuXCI7XG5cdFx0XHRjb25zdCBsYXJnZXN0Tm9kZVBlcmNlbnQgPSBNYXRoLm1pbihcblx0XHRcdFx0TnVtYmVyKCgobGFyZ2VOb2Rlc1swXS52YWx1ZSAvIHRvdGFsKSAqIDEwMCkudG9GaXhlZCgwKSksXG5cdFx0XHRcdDEwMCxcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZXN0UGVyY2VudCA9IE1hdGgubWluKFxuXHRcdFx0XHROdW1iZXIoKChyZXN0LnZhbHVlIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDApKSxcblx0XHRcdFx0MTAwLFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IGxhcmdlc3RQZXJjZW50ID0gTWF0aC5tYXgobGFyZ2VzdE5vZGVQZXJjZW50LCByZXN0UGVyY2VudCk7XG5cdFx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgbGFyZ2VOb2Rlcykge1xuXHRcdFx0XHQvLyBGSVhNRTogcGVyY2VudGFnZSBpcyBub3QgYWNjdXJhdGUsIHNvbWV0aW1lcyBpdCBpcyBsYXJnZXIgdGhhbiAxMDAlXG5cdFx0XHRcdGNvbnN0IHBlcmNlbnQgPSBNYXRoLm1pbihcblx0XHRcdFx0XHROdW1iZXIoKChub2RlLnZhbHVlIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDApKSxcblx0XHRcdFx0XHQxMDAsXG5cdFx0XHRcdCk7XG5cdFx0XHRcdG91dHB1dCArPSBgfCAke25vZGUucGF0aH0gfCAke2ZpbGVzaXplKG5vZGUudmFsdWUpfSB8ICR7cmVuZGVyQmFyKFxuXHRcdFx0XHRcdHBlcmNlbnQsXG5cdFx0XHRcdFx0bGFyZ2VzdFBlcmNlbnQsXG5cdFx0XHRcdCl9IHxcXG5gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlc3QudmFsdWUgPiAwKSB7XG5cdFx0XHRcdG91dHB1dCArPSBgfCAob3RoZXIpIHwgJHtmaWxlc2l6ZShyZXN0LnZhbHVlKX0gfCAke3JlbmRlckJhcihcblx0XHRcdFx0XHRyZXN0UGVyY2VudCxcblx0XHRcdFx0XHRsYXJnZXN0UGVyY2VudCxcblx0XHRcdFx0KX0gfFxcbmA7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG91dHB1dCArPSBcIkRlbGV0ZWRcXG5cIjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG91dHB1dDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQmFyKHBlcmNlbnQ6IG51bWJlciwgbGFyZ2VzdFBlcmNlbnQ6IG51bWJlcik6IHN0cmluZyB7XG5cdGNvbnN0IGJhckxlbmd0aCA9IDIwMDAgLyBsYXJnZXN0UGVyY2VudDtcblx0Y29uc3QgYmFyID0gXCJcdTI1ODhcIi5yZXBlYXQoTWF0aC5yb3VuZCgocGVyY2VudCAvIDEwMCkgKiBiYXJMZW5ndGgpKTtcblx0Ly8gY29uc3Qgc3BhY2UgPSBcIiBcIi5yZXBlYXQoYmFyTGVuZ3RoIC0gYmFyLmxlbmd0aCk7XG5cdHJldHVybiBgXFwke3tcXFxcY29sb3J7QnJpY2tSZWR9e1xcXFx0ZXh0c2Z7ICR7YmFyfSB9fX19XFwkICR7cGVyY2VudH0lYDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU2l6ZShkOiBDb21wYXJlUmVzdWx0KTogc3RyaW5nIHtcblx0cmV0dXJuIGZpbGVzaXplKGQuYnl0ZXMpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJOb3RlKGQ6IENvbXBhcmVSZXN1bHQsIHJlZFRocmVzaG9sZDogbnVtYmVyKTogc3RyaW5nIHtcblx0aWYgKGQucmVtYXJrID09PSBcImRlbGV0ZWRcIikge1xuXHRcdHJldHVybiBcIlx1RDgzRFx1REREMVx1RkUwRiBEZWxldGVkXCI7XG5cdH1cblx0aWYgKGQucmVtYXJrID09PSBcImFkZGVkXCIpIHtcblx0XHRyZXR1cm4gXCJcdUQ4M0NcdUREOTUgQWRkZWRcIjtcblx0fVxuXHRpZiAoZC5kaWZmKSB7XG5cdFx0Y29uc3QgcGVyY2VudENoYW5nZSA9IChkLmRpZmYgLyBkLmJ5dGVzKSAqIDEwMDtcblx0XHRyZXR1cm4gYCR7cmVuZGVyU3RhdHVzSW5kaWNhdG9yKHBlcmNlbnRDaGFuZ2UsIHJlZFRocmVzaG9sZCl9JHtmaWxlc2l6ZShcblx0XHRcdGQuZGlmZixcblx0XHQpfSAoJHtzaWduKHBlcmNlbnRDaGFuZ2UpfSR7cGVyY2VudENoYW5nZS50b0ZpeGVkKDEpfSUpYDtcblx0fVxuXHRyZXR1cm4gXCJcdTI3MDUgIE5vIGNoYW5nZVwiO1xufVxuXG5mdW5jdGlvbiBzaWduKG51bTogbnVtYmVyKTogc3RyaW5nIHtcblx0cmV0dXJuIG51bSA8IDAgPyBcIlwiIDogXCIrXCI7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN0YXR1c0luZGljYXRvcihcblx0cGVyY2VudENoYW5nZTogbnVtYmVyLFxuXHRyZWRUaHJlc2hvbGQ6IG51bWJlcixcbik6IHN0cmluZyB7XG5cdGxldCByZXM6IHN0cmluZztcblx0aWYgKHBlcmNlbnRDaGFuZ2UgPiAwICYmIHBlcmNlbnRDaGFuZ2UgPCByZWRUaHJlc2hvbGQpIHtcblx0XHRyZXMgPSBcIlx1MjZBMFx1RkUwRlwiO1xuXHR9IGVsc2UgaWYgKHBlcmNlbnRDaGFuZ2UgPj0gcmVkVGhyZXNob2xkKSB7XG5cdFx0cmVzID0gXCJcdTIwM0NcdUZFMEZcIjtcblx0fSBlbHNlIHtcblx0XHRyZXMgPSBcIlx1MjcwNSBcIjtcblx0fVxuXHRyZXR1cm4gYCR7cmVzfSAke3NpZ24ocGVyY2VudENoYW5nZSl9YDtcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHR5cGUgeyBNZXRhZmlsZSB9IGZyb20gXCJlc2J1aWxkXCI7XG5pbXBvcnQgdHlwZSB7IFJlcG9ydCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmZ1bmN0aW9uIGxvYWRKc29uRmlsZShwYXRoOiBzdHJpbmcpIHtcblx0cmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgpLnRvU3RyaW5nKFwidXRmLThcIikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZE1ldGFGaWxlKHBhdGg6IHN0cmluZyk6IE1ldGFmaWxlIHtcblx0cmV0dXJuIGxvYWRKc29uRmlsZShwYXRoKSBhcyBNZXRhZmlsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRBbmFseXNpc0pzb24ocGF0aDogc3RyaW5nKTogUmVwb3J0IHtcblx0cmV0dXJuIGxvYWRKc29uRmlsZShwYXRoKSBhcyBSZXBvcnQ7XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hY3Rpb25zL3Rvb2xraXQvYmxvYi84MWE3M2FiYThiZWRkNTMyZjZlZGRjYzQxZWQzYTBmYWQ4YjFjZmViL3BhY2thZ2VzL2NvcmUvc3JjL2NvcmUudHMjTDEyNlxuZXhwb3J0IGZ1bmN0aW9uIGdldElucHV0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHZhbCA9IHByb2Nlc3MuZW52W2BJTlBVVF8ke25hbWUudG9VcHBlckNhc2UoKX1gXSB8fCBcIlwiO1xuXHRyZXR1cm4gdmFsLnRyaW0oKTtcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJub2RlOnByb2Nlc3NcIjtcblxuaW1wb3J0IHR5cGUgeyBPcHRpb25zLCBSZXBvcnQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbG9hZE1ldGFGaWxlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydChpbnB1dDogT3B0aW9ucyk6IHZvaWQge1xuXHRjb25zdCBhbGxQYWdlU2l6ZXMgPSBnZXRBbGxQYWdlU2l6ZXMoaW5wdXQpO1xuXHRmcy5ta2RpclN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGlucHV0LmFuYWx5emVyRGlyZWN0b3J5KSwge1xuXHRcdHJlY3Vyc2l2ZTogdHJ1ZSxcblx0fSk7XG5cdGNvbnN0IHJlc3VsdEpzb25QYXRoID0gcGF0aC5qb2luKFxuXHRcdHByb2Nlc3MuY3dkKCksXG5cdFx0aW5wdXQuYW5hbHl6ZXJEaXJlY3RvcnksXG5cdFx0XCJidW5kbGVfYW5hbHlzaXMuanNvblwiLFxuXHQpO1xuXHRmcy53cml0ZUZpbGVTeW5jKHJlc3VsdEpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShhbGxQYWdlU2l6ZXMsIG51bGwsIDIpKTtcblx0Y29uc29sZS5sb2coYFdyb3RlICR7cmVzdWx0SnNvblBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGdldEFsbFBhZ2VTaXplcyhpbnB1dDogT3B0aW9ucyk6IFJlcG9ydCB7XG5cdGNvbnN0IGFjYzogUmVwb3J0ID0ge307XG5cdHJldHVybiBpbnB1dC5tZXRhZmlsZXMucmVkdWNlKChhY2MsIG1ldGFmaWxlKSA9PiB7XG5cdFx0Y29uc3QgbWV0YUZpbGVQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIG1ldGFmaWxlKTtcblx0XHR0cnkge1xuXHRcdFx0ZnMuYWNjZXNzU3luYyhtZXRhRmlsZVBhdGgsIGZzLmNvbnN0YW50cy5SX09LKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcdGBObyBtZXRhIGZpbGUgZm91bmQgYXQgXCIke21ldGFGaWxlUGF0aH1cIiAtIGEgcGF0aCB0byBtZXRhIGZpbGUgbWF5IGJlIHdyb25nLCBvciBlc2J1aWxkIGlzIG5vdCBleGVjdXRlZC5gLFxuXHRcdFx0KTtcblx0XHRcdHByb2Nlc3MuZXhpdCgxKTtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhRmlsZUpzb24gPSBsb2FkTWV0YUZpbGUobWV0YUZpbGVQYXRoKTtcblx0XHRPYmplY3QuZW50cmllcyhtZXRhRmlsZUpzb24ub3V0cHV0cykucmVkdWNlKChhY2MsIG91dHB1dCkgPT4ge1xuXHRcdFx0Y29uc3QgW291dGZpbGUsIGJ1aWxkTWV0YV0gPSBvdXRwdXQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFpbnB1dC5pbmNsdWRlRXh0ZW5zaW9ucy5zb21lKChleHQpID0+XG5cdFx0XHRcdFx0b3V0ZmlsZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGV4dCksXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gYWNjO1xuXHRcdFx0fVxuXHRcdFx0YWNjW2Ake21ldGFmaWxlfSAtPiAke291dGZpbGV9YF0gPSB7XG5cdFx0XHRcdGJ5dGVzOiBidWlsZE1ldGEuYnl0ZXMsXG5cdFx0XHRcdG1ldGFmaWxlLFxuXHRcdFx0XHRvdXRmaWxlLFxuXHRcdFx0fTtcblx0XHRcdHJldHVybiBhY2M7XG5cdFx0fSwgYWNjKTtcblx0XHRyZXR1cm4gYWNjO1xuXHR9LCBhY2MpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMscUJBQXFCOzs7QUNBOUIsT0FBT0EsU0FBUTtBQUNmLE9BQU8sVUFBVTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNEakIsT0FBTyxRQUFRO0FBS2YsU0FBUyxhQUFhQyxPQUFjO0FBQ25DLFNBQU8sS0FBSyxNQUFNLEdBQUcsYUFBYUEsS0FBSSxFQUFFLFNBQVMsT0FBTyxDQUFDO0FBQzFEO0FBRU8sU0FBUyxhQUFhQSxPQUF3QjtBQUNwRCxTQUFPLGFBQWFBLEtBQUk7QUFDekI7QUFFTyxTQUFTLGlCQUFpQkEsT0FBc0I7QUFDdEQsU0FBTyxhQUFhQSxLQUFJO0FBQ3pCO0FBR08sU0FBUyxTQUFTLE1BQXNCO0FBQzlDLFFBQU0sTUFBTSxRQUFRLElBQUksU0FBUyxLQUFLLFlBQVksQ0FBQyxFQUFFLEtBQUs7QUFDMUQsU0FBTyxJQUFJLEtBQUs7QUFDakI7OztBRGZBLFNBQVMsVUFDUixPQUNjO0FBQ2QsUUFBTSxPQUFvQixFQUFFLE1BQU0sSUFBSSxNQUFNLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0FBQ3ZFLGFBQVcsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLEtBQUssT0FBTyxRQUFRLEtBQUssR0FBRztBQUNsRSxVQUFNLGNBQWMsU0FBUyxNQUFNLEdBQUc7QUFDdEMsY0FBVSxNQUFNLGFBQWEsYUFBYTtBQUFBLEVBQzNDO0FBQ0EsU0FBTztBQUNSO0FBRUEsU0FBUyxVQUNSLE1BQ0EsYUFDQSxPQUNPO0FBQ1AsUUFBTSxNQUFNLFlBQVks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QUFBQSxJQUM5QyxTQUFTLEtBQUs7QUFDYixjQUFRO0FBQUEsUUFDUCwwQkFBMEIsWUFBWTtBQUFBLE1BQ3ZDO0FBQ0EsTUFBQUUsU0FBUSxLQUFLLENBQUM7QUFBQSxJQUNmO0FBRUEsVUFBTSxlQUFlLGFBQWEsWUFBWTtBQUM5QyxXQUFPLFFBQVEsYUFBYSxPQUFPLEVBQUUsT0FBTyxDQUFDQyxNQUFLLFdBQVc7QUFDNUQsWUFBTSxDQUFDLFNBQVMsU0FBUyxJQUFJO0FBQzdCLFVBQ0MsQ0FBQyxNQUFNLGtCQUFrQjtBQUFBLFFBQUssQ0FBQyxRQUM5QixRQUFRLFlBQVksRUFBRSxTQUFTLEdBQUc7QUFBQSxNQUNuQyxHQUNDO0FBQ0QsZUFBT0E7QUFBQSxNQUNSO0FBQ0EsTUFBQUEsS0FBSSxHQUFHLFFBQVEsT0FBTyxPQUFPLEVBQUUsSUFBSTtBQUFBLFFBQ2xDLE9BQU8sVUFBVTtBQUFBLFFBQ2pCO0FBQUEsUUFDQTtBQUFBLE1BQ0Q7QUFDQSxhQUFPQTtBQUFBLElBQ1IsR0FBR0EsSUFBRztBQUNOLFdBQU9BO0FBQUEsRUFDUixHQUFHLEdBQUc7QUFDUDs7O0FIL0NBLFNBQVMsYUFBc0I7QUFDOUIsUUFBTSxlQUFlLFNBQVMsV0FBVztBQUN6QyxNQUFJLENBQUMsY0FBYztBQUNsQixVQUFNLElBQUksTUFBTSw0QkFBNEI7QUFBQSxFQUM3QztBQUNBLFFBQU0sT0FBTyxTQUFTLE1BQU07QUFDNUIsTUFBSSxDQUFDLE1BQU07QUFDVixVQUFNLElBQUksTUFBTSx1QkFBdUI7QUFBQSxFQUN4QztBQUNBLFNBQU87QUFBQSxJQUNOLHVCQUF1QixPQUFPO0FBQUEsTUFDN0IsU0FBUyx5QkFBeUIsS0FBSztBQUFBLE1BQ3ZDO0FBQUEsSUFDRDtBQUFBLElBQ0EsYUFBYSxDQUFDLFFBQVEsUUFBUSxNQUFNLEVBQUU7QUFBQSxNQUNyQyxTQUFTLGNBQWMsS0FBSztBQUFBLElBQzdCO0FBQUEsSUFDQSxvQkFDQyxTQUFTLG9CQUFvQixLQUFLLGlCQUNqQyxNQUFNLEdBQUc7QUFBQSxJQUNYO0FBQUEsSUFDQSxtQkFBbUIsU0FBUyxtQkFBbUIsS0FBSztBQUFBLElBQ3BELFdBQVcsYUFBYSxNQUFNLEdBQUc7QUFBQSxFQUNsQztBQUNEO0FBRU8sU0FBUyxJQUFJLFVBQW1CLFdBQVcsR0FBUztBQUMxRCxTQUFPLE9BQU87QUFDZCxVQUFRLE9BQU87QUFDaEI7QUFFQSxJQUFJLFlBQVksUUFBUSxjQUFjLFFBQVEsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNO0FBQzVELE1BQUk7QUFDTDsiLAogICJuYW1lcyI6IFsiZnMiLCAicGF0aCIsICJjaGlsZCIsICJmcyIsICJmaWxlc2l6ZSIsICJmcyIsICJwYXRoIiwgInByb2Nlc3MiLCAiZnMiLCAicGF0aCIsICJwcm9jZXNzIiwgImFjYyJdCn0K diff --git a/src/compare.ts b/src/compare.ts index f332938..3ef1698 100644 --- a/src/compare.ts +++ b/src/compare.ts @@ -4,7 +4,9 @@ import { filesize as originalFilesize } from "filesize"; import type { CompareResult, Options, Report } from "./types"; import { loadAnalysisJson, loadMetaFile } from "./utils"; -function buildTree(input: Record): TreeMapNode { +function buildTree( + input: Record, +): TreeMapNode { const root: TreeMapNode = { name: "", path: "", value: 0, children: [] }; for (const [filePath, { bytesInOutput }] of Object.entries(input)) { const directories = filePath.split("/"); @@ -67,11 +69,7 @@ This analysis was generated by [esbuild-bundle-analyzer](https://github.com/exoe trees.set(`${metafileRelPath} -> ${outfile}`, tree); fs.writeFileSync( - path.join( - process.cwd(), - input.analyzerDirectory, - "tree.json", - ), + path.join(process.cwd(), input.analyzerDirectory, "tree.json"), JSON.stringify(tree, null, 2), ); } @@ -91,7 +89,9 @@ This analysis was generated by [esbuild-bundle-analyzer](https://github.com/exoe return { ...baseStats, diff: -1, remark: "deleted", tree: undefined }; } - const tree = trees.get(`${currentStats.metafile} -> ${currentStats.outfile}`); + const tree = trees.get( + `${currentStats.metafile} -> ${currentStats.outfile}`, + ); if (!baseStats) { hasAnyChange = true; @@ -180,13 +180,17 @@ ${rows}`; * Find the first twenty largest nodes in root tree. * Dig nodes until the depth of 3. */ -function findLargeDirectories( - root: TreeMapNode, -) { +function findLargeDirectories(root: TreeMapNode) { const nodes: TreeMapNode[] = []; - const queue: Array<{ node: TreeMapNode; depth: number }> = [{ node: root, depth: 0 }]; + const queue: Array<{ node: TreeMapNode; depth: number }> = [ + { node: root, depth: 0 }, + ]; while (queue.length > 0) { - const { node, depth } = queue.shift()!; + const shift = queue.shift(); + if (!shift) { + break; + } + const { node, depth } = shift; if (depth === 3) { nodes.push(node); continue; @@ -195,17 +199,15 @@ function findLargeDirectories( nodes.push(node); } else { for (const item of node.children) { - queue.push({node: item, depth: depth + 1}); + queue.push({ node: item, depth: depth + 1 }); } } } - const largeNodes = nodes - .sort((a, b) => b.value - a.value) - .slice(0, 10); + const largeNodes = nodes.sort((a, b) => b.value - a.value).slice(0, 10); const rest = { - value: root.value - largeNodes.reduce((acc, node) => acc + node.value, 0) - } + value: root.value - largeNodes.reduce((acc, node) => acc + node.value, 0), + }; return { largeNodes, rest }; } @@ -216,30 +218,45 @@ function fileSizeTable( let output = ""; for (const d of data) { - output += `\n`; + output += "\n"; output += `## ${d.metafile} -> ${d.outfile}\n`; if (d.tree) { const total = d.tree.value; const { largeNodes, rest } = findLargeDirectories(d.tree); - output += `| Path | Size | Percentage | \n`; - output += `|------|------|------------|\n`; - const largestNodePercent = Math.min(Number(((largeNodes[0].value / total) * 100).toFixed(0)), 100) - const restPercent = Math.min(Number(((rest.value / total) * 100).toFixed(0)), 100); + output += "| Path | Size | Percentage |\n"; + output += "|------|------|------------|\n"; + const largestNodePercent = Math.min( + Number(((largeNodes[0].value / total) * 100).toFixed(0)), + 100, + ); + const restPercent = Math.min( + Number(((rest.value / total) * 100).toFixed(0)), + 100, + ); const largestPercent = Math.max(largestNodePercent, restPercent); for (const node of largeNodes) { // FIXME: percentage is not accurate, sometimes it is larger than 100% - const percent = Math.min(Number(((node.value / total) * 100).toFixed(0)), 100); - output += `| ${node.path} | ${filesize(node.value)} | ${renderBar(percent, largestPercent)} |\n`; + const percent = Math.min( + Number(((node.value / total) * 100).toFixed(0)), + 100, + ); + output += `| ${node.path} | ${filesize(node.value)} | ${renderBar( + percent, + largestPercent, + )} |\n`; } if (rest.value > 0) { - output += `| (other) | ${filesize(rest.value)} | ${renderBar(restPercent, largestPercent)} |\n`; + output += `| (other) | ${filesize(rest.value)} | ${renderBar( + restPercent, + largestPercent, + )} |\n`; } } else { - output += `Deleted\n`; + output += "Deleted\n"; } } - return output + return output; } function renderBar(percent: number, largestPercent: number): string {