import { UrlTree, UrlSegment } from './url_tree'; import { TreeNode, rootNode } from './utils/tree'; import { forEach, shallowEqual } from './utils/collection'; import { PRIMARY_OUTLET } from './shared'; export function createUrlTree(route, urlTree, commands, queryParameters, fragment) { if (commands.length === 0) { return tree(rootNode(urlTree), urlTree, queryParameters, fragment); } const normalizedCommands = normalizeCommands(commands); if (navigateToRoot(normalizedCommands)) { return tree(new TreeNode(urlTree.root, []), urlTree, queryParameters, fragment); } const startingNode = findStartingNode(normalizedCommands, urlTree, route); const updated = normalizedCommands.commands.length > 0 ? updateMany(startingNode.children.slice(0), normalizedCommands.commands) : []; const newRoot = constructNewTree(rootNode(urlTree), startingNode, updated); return tree(newRoot, urlTree, queryParameters, fragment); } function tree(root, urlTree, queryParameters, fragment) { const q = queryParameters ? stringify(queryParameters) : urlTree.queryParameters; const f = fragment ? fragment : urlTree.fragment; return new UrlTree(root, q, f); } function navigateToRoot(normalizedChange) { return normalizedChange.isAbsolute && normalizedChange.commands.length === 1 && normalizedChange.commands[0] == "/"; } class NormalizedNavigationCommands { constructor(isAbsolute, numberOfDoubleDots, commands) { this.isAbsolute = isAbsolute; this.numberOfDoubleDots = numberOfDoubleDots; this.commands = commands; } } function normalizeCommands(commands) { if ((typeof commands[0] === "string") && commands.length === 1 && commands[0] == "/") { return new NormalizedNavigationCommands(true, 0, commands); } let numberOfDoubleDots = 0; let isAbsolute = false; const res = []; for (let i = 0; i < commands.length; ++i) { const c = commands[i]; if (!(typeof c === "string")) { res.push(c); continue; } const parts = c.split('/'); for (let j = 0; j < parts.length; ++j) { let cc = parts[j]; if (i == 0) { if (j == 0 && cc == ".") { } else if (j == 0 && cc == "") { isAbsolute = true; } else if (cc == "..") { numberOfDoubleDots++; } else if (cc != '') { res.push(cc); } } else { if (cc != '') { res.push(cc); } } } } return new NormalizedNavigationCommands(isAbsolute, numberOfDoubleDots, res); } function findStartingNode(normalizedChange, urlTree, route) { if (normalizedChange.isAbsolute) { return rootNode(urlTree); } else { const urlSegment = findUrlSegment(route, urlTree, normalizedChange.numberOfDoubleDots); return findMatchingNode(urlSegment, rootNode(urlTree)); } } function findUrlSegment(route, urlTree, numberOfDoubleDots) { const segments = route.urlSegments.value; const urlSegment = segments[segments.length - 1]; const path = urlTree.pathFromRoot(urlSegment); if (path.length <= numberOfDoubleDots) { throw new Error("Invalid number of '../'"); } return path[path.length - 1 - numberOfDoubleDots]; } function findMatchingNode(segment, node) { if (node.value === segment) return node; for (let c of node.children) { const r = findMatchingNode(segment, c); if (r) return r; } throw new Error(`Cannot find url segment '${segment}'`); } function constructNewTree(node, original, updated) { if (node === original) { return new TreeNode(node.value, updated); } else { return new TreeNode(node.value, node.children.map(c => constructNewTree(c, original, updated))); } } function updateMany(nodes, commands) { const outlet = getOutlet(commands); const nodesInRightOutlet = nodes.filter(c => c.value.outlet === outlet); if (nodesInRightOutlet.length > 0) { const nodeRightOutlet = nodesInRightOutlet[0]; nodes[nodes.indexOf(nodeRightOutlet)] = update(nodeRightOutlet, commands); } else { nodes.push(update(null, commands)); } return nodes; } function getPath(commands) { if (!(typeof commands[0] === "string")) return commands[0]; const parts = commands[0].toString().split(":"); return parts.length > 1 ? parts[1] : commands[0]; } function getOutlet(commands) { if (!(typeof commands[0] === "string")) return PRIMARY_OUTLET; const parts = commands[0].toString().split(":"); return parts.length > 1 ? parts[0] : PRIMARY_OUTLET; } function update(node, commands) { const rest = commands.slice(1); const next = rest.length === 0 ? null : rest[0]; const outlet = getOutlet(commands); const path = getPath(commands); if (!node && !(typeof next === 'object')) { const urlSegment = new UrlSegment(path, {}, outlet); const children = rest.length === 0 ? [] : [update(null, rest)]; return new TreeNode(urlSegment, children); } else if (!node && typeof next === 'object') { const urlSegment = new UrlSegment(path, stringify(next), outlet); return recurse(urlSegment, node, rest.slice(1)); } else if (node && outlet !== node.value.outlet) { return node; } else if (node && typeof path === 'object') { const newSegment = new UrlSegment(node.value.path, stringify(path), node.value.outlet); return recurse(newSegment, node, rest); } else if (node && typeof next === 'object' && compare(path, stringify(next), node.value)) { return recurse(node.value, node, rest.slice(1)); } else if (node && typeof next === 'object') { const urlSegment = new UrlSegment(path, stringify(next), outlet); return recurse(urlSegment, node, rest.slice(1)); } else if (node && compare(path, {}, node.value)) { return recurse(node.value, node, rest); } else { const urlSegment = new UrlSegment(path, {}, outlet); return recurse(urlSegment, node, rest); } } function stringify(params) { const res = {}; forEach(params, (v, k) => res[k] = v.toString()); return res; } function compare(path, params, segment) { return path == segment.path && shallowEqual(params, segment.parameters); } function recurse(urlSegment, node, rest) { if (rest.length === 0) { return new TreeNode(urlSegment, []); } const children = node ? node.children.slice(0) : []; return new TreeNode(urlSegment, updateMany(children, rest)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlX3VybF90cmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NyZWF0ZV91cmxfdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQW9CLE1BQU0sWUFBWTtPQUMzRCxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjO09BQzFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQjtPQUVuRCxFQUFVLGNBQWMsRUFBRSxNQUFNLFVBQVU7QUFFakQsOEJBQThCLEtBQXFCLEVBQUUsT0FBZ0IsRUFBRSxRQUFlLEVBQ3hELGVBQW1DLEVBQUUsUUFBNEI7SUFDN0YsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELE1BQU0sa0JBQWtCLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQWEsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUUsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2xELFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUss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LENBQUMsR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELGlCQUFpQixJQUFZLEVBQUUsTUFBNEIsRUFBRSxPQUFtQjtJQUM5RSxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUVELGlCQUFpQixVQUFzQixFQUFFLElBQWlDLEVBQ3hELElBQVc7SUFDM0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBYSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDcEQsTUFBTSxDQUFDLElBQUksUUFBUSxDQUFhLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVybFRyZWUsIFVybFNlZ21lbnQsIGVxdWFsVXJsU2VnbWVudHMgfSBmcm9tICcuL3VybF90cmVlJztcbmltcG9ydCB7IFRyZWVOb2RlLCByb290Tm9kZSB9IGZyb20gJy4vdXRpbHMvdHJlZSc7XG5pbXBvcnQgeyBmb3JFYWNoLCBzaGFsbG93RXF1YWwgfSBmcm9tICcuL3V0aWxzL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgUm91dGVyU3RhdGUsIEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnLi9yb3V0ZXJfc3RhdGUnO1xuaW1wb3J0IHsgUGFyYW1zLCBQUklNQVJZX09VVExFVCB9IGZyb20gJy4vc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVybFRyZWUocm91dGU6IEFjdGl2YXRlZFJvdXRlLCB1cmxUcmVlOiBVcmxUcmVlLCBjb21tYW5kczogYW55W10sIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzOiBQYXJhbXMgfCB1bmRlZmluZWQsIGZyYWdtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBVcmxUcmVlIHtcbiAgaWYgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cmVlKHJvb3ROb2RlKHVybFRyZWUpLCB1cmxUcmVlLCBxdWVyeVBhcmFtZXRlcnMsIGZyYWdtZW50KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDb21tYW5kcyA9IG5vcm1hbGl6ZUNvbW1hbmRzKGNvbW1hbmRzKTtcbiAgaWYgKG5hdmlnYXRlVG9Sb290KG5vcm1hbGl6ZWRDb21tYW5kcykpIHtcbiAgICByZXR1cm4gdHJlZShuZXcgVHJlZU5vZGU8VXJsU2VnbWVudD4odXJsVHJlZS5yb290LCBbXSksIHVybFRyZWUsIHF1ZXJ5UGFyYW1ldGVycywgZnJhZ21lbnQpO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRpbmdOb2RlID0gZmluZFN0YXJ0aW5nTm9kZShub3JtYWxpemVkQ29tbWFuZHMsIHVybFRyZWUsIHJvdXRlKTtcbiAgY29uc3QgdXBkYXRlZCA9IG5vcm1hbGl6ZWRDb21tYW5kcy5jb21tYW5kcy5sZW5ndGggPiAwID9cbiAgICAgIHVwZGF0ZU1hbnkoc3RhcnRpbmdOb2RlLmNoaWxkcmVuLnNsaWNlKDApLCBub3JtYWxpemVkQ29tbWFuZHMuY29tbWFuZHMpIDpcbiAgICAgIFtdO1xuICBjb25zdCBuZXdSb290ID0gY29uc3RydWN0TmV3VHJlZShyb290Tm9kZSh1cmxUcmVlKSwgc3RhcnRpbmdOb2RlLCB1cGRhdGVkKTtcblxuICByZXR1cm4gdHJlZShuZXdSb290LCB1cmxUcmVlLCBxdWVyeVBhcmFtZXRlcnMsIGZyYWdtZW50KTtcbn1cblxuZnVuY3Rpb24gdHJlZShyb290OiBUcmVlTm9kZTxVcmxTZWdtZW50PiwgdXJsVHJlZTogVXJsVHJlZSwgcXVlcnlQYXJhbWV0ZXJzOiBQYXJhbXMgfCB1bmRlZmluZWQsIGZyYWdtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBVcmxUcmVlIHtcbiAgY29uc3QgcSA9IHF1ZXJ5UGFyYW1ldGVycyA/IHN0cmluZ2lmeShxdWVyeVBhcmFtZXRlcnMpIDogdXJsVHJlZS5xdWVyeVBhcmFtZXRlcnM7XG4gIGNvbnN0IGYgPSBmcmFnbWVudCA/IGZyYWdtZW50IDogdXJsVHJlZS5mcmFnbWVudDtcbiAgcmV0dXJuIG5ldyBVcmxUcmVlKHJvb3QsIHEsIGYpO1xufVxuXG5mdW5jdGlvbiBuYXZpZ2F0ZVRvUm9vdChub3JtYWxpemVkQ2hhbmdlOiBOb3JtYWxpemVkTmF2aWdhdGlvbkNvbW1hbmRzKTogYm9vbGVhbiB7XG4gIHJldHVybiBub3JtYWxpemVkQ2hhbmdlLmlzQWJzb2x1dGUgJiYgbm9ybWFsaXplZENoYW5nZS5jb21tYW5kcy5sZW5ndGggPT09IDEgJiZcbiAgICBub3JtYWxpemVkQ2hhbmdlLmNvbW1hbmRzWzBdID09IFwiL1wiO1xufVxuXG5jbGFzcyBOb3JtYWxpemVkTmF2aWdhdGlvbkNvbW1hbmRzIHtcbiAgY29uc3RydWN0b3IocHVibGljIGlzQWJzb2x1dGU6IGJvb2xlYW4sIHB1YmxpYyBudW1iZXJPZkRvdWJsZURvdHM6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIGNvbW1hbmRzOiBhbnlbXSkge31cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tbWFuZHMoY29tbWFuZHM6IGFueVtdKTogTm9ybWFsaXplZE5hdmlnYXRpb25Db21tYW5kcyB7XG4gIGlmICgodHlwZW9mIGNvbW1hbmRzWzBdID09PSBcInN0cmluZ1wiKSAmJiBjb21tYW5kcy5sZW5ndGggPT09IDEgJiYgY29tbWFuZHNbMF0gPT0gXCIvXCIpIHtcbiAgICByZXR1cm4gbmV3IE5vcm1hbGl6ZWROYXZpZ2F0aW9uQ29tbWFuZHModHJ1ZSwgMCwgY29tbWFuZHMpO1xuICB9XG5cbiAgbGV0IG51bWJlck9mRG91YmxlRG90cyA9IDA7XG4gIGxldCBpc0Fic29sdXRlID0gZmFsc2U7XG4gIGNvbnN0IHJlcyA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjID0gY29tbWFuZHNbaV07XG5cbiAgICBpZiAoISh0eXBlb2YgYyA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIHJlcy5wdXNoKGMpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBjLnNwbGl0KCcvJyk7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7ICsraikge1xuICAgICAgbGV0IGNjID0gcGFydHNbal07XG5cbiAgICAgIC8vIGZpcnN0IGV4cCBpcyB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXlcbiAgICAgIGlmIChpID09IDApIHtcbiAgICAgICAgaWYgKGogPT0gMCAmJiBjYyA9PSBcIi5cIikgeyAgLy8gICcuL2EnXG4gICAgICAgICAgLy8gc2tpcCBpdFxuICAgICAgICB9IGVsc2UgaWYgKGogPT0gMCAmJiBjYyA9PSBcIlwiKSB7ICAvLyAgJy9hJ1xuICAgICAgICAgIGlzQWJzb2x1dGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGNjID09IFwiLi5cIikgeyAgLy8gICcuLi9hJ1xuICAgICAgICAgIG51bWJlck9mRG91YmxlRG90cysrO1xuICAgICAgICB9IGVsc2UgaWYgKGNjICE9ICcnKSB7XG4gICAgICAgICAgcmVzLnB1c2goY2MpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjYyAhPSAnJykge1xuICAgICAgICAgIHJlcy5wdXNoKGNjKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgTm9ybWFsaXplZE5hdmlnYXRpb25Db21tYW5kcyhpc0Fic29sdXRlLCBudW1iZXJPZkRvdWJsZURvdHMsIHJlcyk7XG59XG5cbmZ1bmN0aW9uIGZpbmRTdGFydGluZ05vZGUobm9ybWFsaXplZENoYW5nZTogTm9ybWFsaXplZE5hdmlnYXRpb25Db21tYW5kcywgdXJsVHJlZTogVXJsVHJlZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IFRyZWVOb2RlPFVybFNlZ21lbnQ+IHtcbiAgaWYgKG5vcm1hbGl6ZWRDaGFuZ2UuaXNBYnNvbHV0ZSkge1xuICAgIHJldHVybiByb290Tm9kZSh1cmxUcmVlKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB1cmxTZWdtZW50ID1cbiAgICAgIGZpbmRVcmxTZWdtZW50KHJvdXRlLCB1cmxUcmVlLCBub3JtYWxpemVkQ2hhbmdlLm51bWJlck9mRG91YmxlRG90cyk7XG4gICAgcmV0dXJuIGZpbmRNYXRjaGluZ05vZGUodXJsU2VnbWVudCwgcm9vdE5vZGUodXJsVHJlZSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRVcmxTZWdtZW50KHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgdXJsVHJlZTogVXJsVHJlZSwgbnVtYmVyT2ZEb3VibGVEb3RzOiBudW1iZXIpOiBVcmxTZWdtZW50IHtcbiAgY29uc3Qgc2VnbWVudHMgPSAoPGFueT5yb3V0ZS51cmxTZWdtZW50cykudmFsdWU7XG4gIGNvbnN0IHVybFNlZ21lbnQgPSBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgY29uc3QgcGF0aCA9IHVybFRyZWUucGF0aEZyb21Sb290KHVybFNlZ21lbnQpO1xuICBpZiAocGF0aC5sZW5ndGggPD0gbnVtYmVyT2ZEb3VibGVEb3RzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBudW1iZXIgb2YgJy4uLydcIik7XG4gIH1cbiAgcmV0dXJuIHBhdGhbcGF0aC5sZW5ndGggLSAxIC0gbnVtYmVyT2ZEb3VibGVEb3RzXTtcbn1cblxuZnVuY3Rpb24gZmluZE1hdGNoaW5nTm9kZShzZWdtZW50OiBVcmxTZWdtZW50LCBub2RlOiBUcmVlTm9kZTxVcmxTZWdtZW50Pik6IFRyZWVOb2RlPFVybFNlZ21lbnQ+IHtcbiAgaWYgKG5vZGUudmFsdWUgPT09IHNlZ21lbnQpIHJldHVybiBub2RlO1xuICBmb3IgKGxldCBjIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICBjb25zdCByID0gZmluZE1hdGNoaW5nTm9kZShzZWdtZW50LCBjKTtcbiAgICBpZiAocikgcmV0dXJuIHI7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB1cmwgc2VnbWVudCAnJHtzZWdtZW50fSdgKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0TmV3VHJlZShub2RlOiBUcmVlTm9kZTxVcmxTZWdtZW50Piwgb3JpZ2luYWw6IFRyZWVOb2RlPFVybFNlZ21lbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkOiBUcmVlTm9kZTxVcmxTZWdtZW50PltdKTogVHJlZU5vZGU8VXJsU2VnbWVudD4ge1xuICBpZiAobm9kZSA9PT0gb3JpZ2luYWwpIHtcbiAgICByZXR1cm4gbmV3IFRyZWVOb2RlPFVybFNlZ21lbnQ+KG5vZGUudmFsdWUsIHVwZGF0ZWQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgVHJlZU5vZGU8VXJsU2VnbWVudD4oXG4gICAgICBub2RlLnZhbHVlLCBub2RlLmNoaWxkcmVuLm1hcChjID0+IGNvbnN0cnVjdE5ld1RyZWUoYywgb3JpZ2luYWwsIHVwZGF0ZWQpKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlTWFueShub2RlczogVHJlZU5vZGU8VXJsU2VnbWVudD5bXSwgY29tbWFuZHM6IGFueVtdKTogVHJlZU5vZGU8VXJsU2VnbWVudD5bXSB7XG4gIGNvbnN0IG91dGxldCA9IGdldE91dGxldChjb21tYW5kcyk7XG4gIGNvbnN0IG5vZGVzSW5SaWdodE91dGxldCA9IG5vZGVzLmZpbHRlcihjID0+IGMudmFsdWUub3V0bGV0ID09PSBvdXRsZXQpO1xuICBpZiAobm9kZXNJblJpZ2h0T3V0bGV0Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlUmlnaHRPdXRsZXQgPSBub2Rlc0luUmlnaHRPdXRsZXRbMF07ICAvLyB0aGVyZSBjYW4gYmUgb25seSBvbmVcbiAgICBub2Rlc1tub2Rlcy5pbmRleE9mKG5vZGVSaWdodE91dGxldCldID0gdXBkYXRlKG5vZGVSaWdodE91dGxldCwgY29tbWFuZHMpO1xuICB9IGVsc2Uge1xuICAgIG5vZGVzLnB1c2godXBkYXRlKG51bGwsIGNvbW1hbmRzKSk7XG4gIH1cbiAgcmV0dXJuIG5vZGVzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXRoKGNvbW1hbmRzOiBhbnlbXSk6IGFueSB7XG4gIGlmICghKHR5cGVvZiBjb21tYW5kc1swXSA9PT0gXCJzdHJpbmdcIikpIHJldHVybiBjb21tYW5kc1swXTtcbiAgY29uc3QgcGFydHMgPSBjb21tYW5kc1swXS50b1N0cmluZygpLnNwbGl0KFwiOlwiKTtcbiAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0c1sxXSA6IGNvbW1hbmRzWzBdO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRsZXQoY29tbWFuZHM6IGFueVtdKTogc3RyaW5nIHtcbiAgaWYgKCEodHlwZW9mIGNvbW1hbmRzWzBdID09PSBcInN0cmluZ1wiKSkgcmV0dXJuIFBSSU1BUllfT1VUTEVUO1xuICBjb25zdCBwYXJ0cyA9IGNvbW1hbmRzWzBdLnRvU3RyaW5nKCkuc3BsaXQoXCI6XCIpO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzWzBdIDogUFJJTUFSWV9PVVRMRVQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZShub2RlOiBUcmVlTm9kZTxVcmxTZWdtZW50PnxudWxsLCBjb21tYW5kczogYW55W10pOiBUcmVlTm9kZTxVcmxTZWdtZW50PiB7XG4gIGNvbnN0IHJlc3QgPSBjb21tYW5kcy5zbGljZSgxKTtcbiAgY29uc3QgbmV4dCA9IHJlc3QubGVuZ3RoID09PSAwID8gbnVsbCA6IHJlc3RbMF07XG4gIGNvbnN0IG91dGxldCA9IGdldE91dGxldChjb21tYW5kcyk7XG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKGNvbW1hbmRzKTtcblxuICAvLyByZWFjaCB0aGUgZW5kIG9mIHRoZSB0cmVlID0+IGNyZWF0ZSBuZXcgdHJlZSBub2Rlcy5cbiAgaWYgKCFub2RlICYmICEodHlwZW9mIG5leHQgPT09ICdvYmplY3QnKSkge1xuICAgIGNvbnN0IHVybFNlZ21lbnQgPSBuZXcgVXJsU2VnbWVudChwYXRoLCB7fSwgb3V0bGV0KTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHJlc3QubGVuZ3RoID09PSAwID8gW10gOiBbdXBkYXRlKG51bGwsIHJlc3QpXTtcbiAgICByZXR1cm4gbmV3IFRyZWVOb2RlPFVybFNlZ21lbnQ+KHVybFNlZ21lbnQsIGNoaWxkcmVuKTtcblxuICB9IGVsc2UgaWYgKCFub2RlICYmIHR5cGVvZiBuZXh0ID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHVybFNlZ21lbnQgPSBuZXcgVXJsU2VnbWVudChwYXRoLCBzdHJpbmdpZnkobmV4dCksIG91dGxldCk7XG4gICAgcmV0dXJuIHJlY3Vyc2UodXJsU2VnbWVudCwgbm9kZSwgcmVzdC5zbGljZSgxKSk7XG5cbiAgICAvLyBkaWZmZXJlbnQgb3V0bGV0ID0+IHByZXNlcnZlIHRoZSBzdWJ0cmVlXG4gIH0gZWxzZSBpZiAobm9kZSAmJiBvdXRsZXQgIT09IG5vZGUudmFsdWUub3V0bGV0KSB7XG4gICAgcmV0dXJuIG5vZGU7XG5cbiAgICAvLyBwYXJhbXMgY29tbWFuZFxuICB9IGVsc2UgaWYgKG5vZGUgJiYgdHlwZW9mIHBhdGggPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgbmV3U2VnbWVudCA9IG5ldyBVcmxTZWdtZW50KG5vZGUudmFsdWUucGF0aCwgc3RyaW5naWZ5KHBhdGgpLCBub2RlLnZhbHVlLm91dGxldCk7XG4gICAgcmV0dXJuIHJlY3Vyc2UobmV3U2VnbWVudCwgbm9kZSwgcmVzdCk7XG5cbiAgICAvLyBuZXh0IG9uZSBpcyBhIHBhcmFtcyBjb21tYW5kICYmIGNhbiByZXVzZSB0aGUgbm9kZVxuICB9IGVsc2UgaWYgKG5vZGUgJiYgdHlwZW9mIG5leHQgPT09ICdvYmplY3QnICYmIGNvbXBhcmUocGF0aCwgc3RyaW5naWZ5KG5leHQpLCBub2RlLnZhbHVlKSkge1xuICAgIHJldHVybiByZWN1cnNlKG5vZGUudmFsdWUsIG5vZGUsIHJlc3Quc2xpY2UoMSkpO1xuXG4gICAgLy8gbmV4dCBvbmUgaXMgYSBwYXJhbXMgY29tbWFuZCAmJiBjYW5ub3QgcmV1c2UgdGhlIG5vZGVcbiAgfSBlbHNlIGlmIChub2RlICYmIHR5cGVvZiBuZXh0ID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHVybFNlZ21lbnQgPSBuZXcgVXJsU2VnbWVudChwYXRoLCBzdHJpbmdpZnkobmV4dCksIG91dGxldCk7XG4gICAgcmV0dXJuIHJlY3Vyc2UodXJsU2VnbWVudCwgbm9kZSwgcmVzdC5zbGljZSgxKSk7XG5cbiAgICAvLyBuZXh0IG9uZSBpcyBub3QgYSBwYXJhbXMgY29tbWFuZCAmJiBjYW4gcmV1c2UgdGhlIG5vZGVcbiAgfSBlbHNlIGlmIChub2RlICYmIGNvbXBhcmUocGF0aCwge30sIG5vZGUudmFsdWUpKSB7XG4gICAgcmV0dXJuIHJlY3Vyc2Uobm9kZS52YWx1ZSwgbm9kZSwgcmVzdCk7XG5cbiAgICAvLyBuZXh0IG9uZSBpcyBub3QgYSBwYXJhbXMgY29tbWFuZCAmJiBjYW5ub3QgcmV1c2UgdGhlIG5vZGVcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB1cmxTZWdtZW50ID0gbmV3IFVybFNlZ21lbnQocGF0aCwge30sIG91dGxldCk7XG4gICAgcmV0dXJuIHJlY3Vyc2UodXJsU2VnbWVudCwgbm9kZSwgcmVzdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5KHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0pOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSB7XG4gIGNvbnN0IHJlcyA9IHt9O1xuICBmb3JFYWNoKHBhcmFtcywgKHYsIGspID0+IHJlc1trXSA9IHYudG9TdHJpbmcoKSk7XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUocGF0aDogc3RyaW5nLCBwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBhbnl9LCBzZWdtZW50OiBVcmxTZWdtZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiBwYXRoID09IHNlZ21lbnQucGF0aCAmJiBzaGFsbG93RXF1YWwocGFyYW1zLCBzZWdtZW50LnBhcmFtZXRlcnMpO1xufVxuXG5mdW5jdGlvbiByZWN1cnNlKHVybFNlZ21lbnQ6IFVybFNlZ21lbnQsIG5vZGU6IFRyZWVOb2RlPFVybFNlZ21lbnQ+IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHJlc3Q6IGFueVtdKTogVHJlZU5vZGU8VXJsU2VnbWVudD4ge1xuICBpZiAocmVzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbmV3IFRyZWVOb2RlPFVybFNlZ21lbnQ+KHVybFNlZ21lbnQsIFtdKTtcbiAgfVxuICBjb25zdCBjaGlsZHJlbiA9IG5vZGUgPyBub2RlLmNoaWxkcmVuLnNsaWNlKDApIDogW107XG4gIHJldHVybiBuZXcgVHJlZU5vZGU8VXJsU2VnbWVudD4odXJsU2VnbWVudCwgdXBkYXRlTWFueShjaGlsZHJlbiwgcmVzdCkpO1xufSJdfQ==