mirror of
https://github.com/angular/angular
synced 2026-05-24 09:28:37 +00:00
188 lines
No EOL
29 KiB
JavaScript
188 lines
No EOL
29 KiB
JavaScript
"use strict";
|
|
var url_tree_1 = require('./url_tree');
|
|
var tree_1 = require('./utils/tree');
|
|
var collection_1 = require('./utils/collection');
|
|
var shared_1 = require('./shared');
|
|
function createUrlTree(route, urlTree, commands, queryParameters, fragment) {
|
|
if (commands.length === 0) {
|
|
return tree(urlTree._root, urlTree, queryParameters, fragment);
|
|
}
|
|
var normalizedCommands = normalizeCommands(commands);
|
|
if (navigateToRoot(normalizedCommands)) {
|
|
return tree(new tree_1.TreeNode(urlTree.root, []), urlTree, queryParameters, fragment);
|
|
}
|
|
var startingNode = findStartingNode(normalizedCommands, urlTree, route);
|
|
var updated = normalizedCommands.commands.length > 0 ?
|
|
updateMany(startingNode.children.slice(0), normalizedCommands.commands) :
|
|
[];
|
|
var newRoot = constructNewTree(urlTree._root, startingNode, updated);
|
|
return tree(newRoot, urlTree, queryParameters, fragment);
|
|
}
|
|
exports.createUrlTree = createUrlTree;
|
|
function tree(root, urlTree, queryParameters, fragment) {
|
|
var q = queryParameters ? stringify(queryParameters) : urlTree.queryParameters;
|
|
var f = fragment ? fragment : urlTree.fragment;
|
|
return new url_tree_1.UrlTree(root, q, f);
|
|
}
|
|
function navigateToRoot(normalizedChange) {
|
|
return normalizedChange.isAbsolute && normalizedChange.commands.length === 1 &&
|
|
normalizedChange.commands[0] == "/";
|
|
}
|
|
var NormalizedNavigationCommands = (function () {
|
|
function NormalizedNavigationCommands(isAbsolute, numberOfDoubleDots, commands) {
|
|
this.isAbsolute = isAbsolute;
|
|
this.numberOfDoubleDots = numberOfDoubleDots;
|
|
this.commands = commands;
|
|
}
|
|
return NormalizedNavigationCommands;
|
|
}());
|
|
function normalizeCommands(commands) {
|
|
if ((typeof commands[0] === "string") && commands.length === 1 && commands[0] == "/") {
|
|
return new NormalizedNavigationCommands(true, 0, commands);
|
|
}
|
|
var numberOfDoubleDots = 0;
|
|
var isAbsolute = false;
|
|
var res = [];
|
|
for (var i = 0; i < commands.length; ++i) {
|
|
var c = commands[i];
|
|
if (!(typeof c === "string")) {
|
|
res.push(c);
|
|
continue;
|
|
}
|
|
var parts = c.split('/');
|
|
for (var j = 0; j < parts.length; ++j) {
|
|
var 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 urlTree._root;
|
|
}
|
|
else {
|
|
var urlSegment = findUrlSegment(route, urlTree, normalizedChange.numberOfDoubleDots);
|
|
return findMatchingNode(urlSegment, urlTree._root);
|
|
}
|
|
}
|
|
function findUrlSegment(route, urlTree, numberOfDoubleDots) {
|
|
var urlSegment = route.snapshot._lastUrlSegment;
|
|
var 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 (var _i = 0, _a = node.children; _i < _a.length; _i++) {
|
|
var c = _a[_i];
|
|
var 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 tree_1.TreeNode(node.value, updated);
|
|
}
|
|
else {
|
|
return new tree_1.TreeNode(node.value, node.children.map(function (c) { return constructNewTree(c, original, updated); }));
|
|
}
|
|
}
|
|
function updateMany(nodes, commands) {
|
|
var outlet = getOutlet(commands);
|
|
var nodesInRightOutlet = nodes.filter(function (c) { return c.value.outlet === outlet; });
|
|
if (nodesInRightOutlet.length > 0) {
|
|
var 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];
|
|
var parts = commands[0].toString().split(":");
|
|
return parts.length > 1 ? parts[1] : commands[0];
|
|
}
|
|
function getOutlet(commands) {
|
|
if (!(typeof commands[0] === "string"))
|
|
return shared_1.PRIMARY_OUTLET;
|
|
var parts = commands[0].toString().split(":");
|
|
return parts.length > 1 ? parts[0] : shared_1.PRIMARY_OUTLET;
|
|
}
|
|
function update(node, commands) {
|
|
var rest = commands.slice(1);
|
|
var next = rest.length === 0 ? null : rest[0];
|
|
var outlet = getOutlet(commands);
|
|
var path = getPath(commands);
|
|
if (!node && !(typeof next === 'object')) {
|
|
var urlSegment = new url_tree_1.UrlSegment(path, {}, outlet);
|
|
var children = rest.length === 0 ? [] : [update(null, rest)];
|
|
return new tree_1.TreeNode(urlSegment, children);
|
|
}
|
|
else if (!node && typeof next === 'object') {
|
|
var urlSegment = new url_tree_1.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') {
|
|
var newSegment = new url_tree_1.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') {
|
|
var urlSegment = new url_tree_1.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 {
|
|
var urlSegment = new url_tree_1.UrlSegment(path, {}, outlet);
|
|
return recurse(urlSegment, node, rest);
|
|
}
|
|
}
|
|
function stringify(params) {
|
|
var res = {};
|
|
collection_1.forEach(params, function (v, k) { return res[k] = v.toString(); });
|
|
return res;
|
|
}
|
|
function compare(path, params, segment) {
|
|
return path == segment.path && collection_1.shallowEqual(params, segment.parameters);
|
|
}
|
|
function recurse(urlSegment, node, rest) {
|
|
if (rest.length === 0) {
|
|
return new tree_1.TreeNode(urlSegment, []);
|
|
}
|
|
var children = node ? node.children.slice(0) : [];
|
|
return new tree_1.TreeNode(urlSegment, updateMany(children, rest));
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlX3VybF90cmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NyZWF0ZV91cmxfdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUJBQXNELFlBQVksQ0FBQyxDQUFBO0FBQ25FLHFCQUF5QixjQUFjLENBQUMsQ0FBQTtBQUN4QywyQkFBc0Msb0JBQW9CLENBQUMsQ0FBQTtBQUUzRCx1QkFBdUMsVUFBVSxDQUFDLENBQUE7QUFFbEQsdUJBQThCLEtBQXFCLEVBQUUsT0FBZ0IsRUFBRSxRQUFlLEVBQ3hELGVBQW1DLEVBQUUsUUFBNEI7SUFDN0YsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxJQUFNLGtCQUFrQixHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksZUFBUSxDQUFhLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsSUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFFLElBQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNsRCxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDO1FBQ3ZFLEVB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SSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLElBQUksZUFBUSxDQUFhLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV4RCxDQUFDO0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDN0MsSUFBTSxVQUFVLEdBQUcsSUFBSSxxQkFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUdsRCxDQUFDO0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFHZCxDQUFDO0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQU0sVUFBVSxHQUFHLElBQUkscUJBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RixNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFHekMsQ0FBQztJQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFHbEQsQ0FBQztJQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFNLFVBQVUsR0FBRyxJQUFJLHFCQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBR2xELENBQUM7SUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUd6QyxDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDTixJQUFNLFVBQVUsR0FBRyxJQUFJLHFCQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztBQUNILENBQUM7QUFFRCxtQkFBbUIsTUFBNEI7SUFDN0MsSUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2Ysb0JBQU8sQ0FBQyxNQUFNLEVBQUUsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBckIsQ0FBcUIsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsaUJBQWlCLElBQVksRUFBRSxNQUE0QixFQUFFLE9BQW1CO0lBQzlFLE1BQU0sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSx5QkFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUVELGlCQUFpQixVQUFzQixFQUFFLElBQWlDLEVBQ3hELElBQVc7SUFDM0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxJQUFJLGVBQVEsQ0FBYSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELElBQU0sUUFBUSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDcEQsTUFBTSxDQUFDLElBQUksZUFBUSxDQUFhLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVybFRyZWUsIFVybFNlZ21lbnQsIGVxdWFsVXJsU2VnbWVudHMgfSBmcm9tICcuL3VybF90cmVlJztcbmltcG9ydCB7IFRyZWVOb2RlIH0gZnJvbSAnLi91dGlscy90cmVlJztcbmltcG9ydCB7IGZvckVhY2gsIHNoYWxsb3dFcXVhbCB9IGZyb20gJy4vdXRpbHMvY29sbGVjdGlvbic7XG5pbXBvcnQgeyBSb3V0ZXJTdGF0ZSwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICcuL3JvdXRlcl9zdGF0ZSc7XG5pbXBvcnQgeyBQYXJhbXMsIFBSSU1BUllfT1VUTEVUIH0gZnJvbSAnLi9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVXJsVHJlZShyb3V0ZTogQWN0aXZhdGVkUm91dGUsIHVybFRyZWU6IFVybFRyZWUsIGNvbW1hbmRzOiBhbnlbXSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnM6IFBhcmFtcyB8IHVuZGVmaW5lZCwgZnJhZ21lbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFVybFRyZWUge1xuICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRyZWUodXJsVHJlZS5fcm9vdCwgdXJsVHJlZSwgcXVlcnlQYXJhbWV0ZXJzLCBmcmFnbWVudCk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkQ29tbWFuZHMgPSBub3JtYWxpemVDb21tYW5kcyhjb21tYW5kcyk7XG4gIGlmIChuYXZpZ2F0ZVRvUm9vdChub3JtYWxpemVkQ29tbWFuZHMpKSB7XG4gICAgcmV0dXJuIHRyZWUobmV3IFRyZWVOb2RlPFVybFNlZ21lbnQ+KHVybFRyZWUucm9vdCwgW10pLCB1cmxUcmVlLCBxdWVyeVBhcmFtZXRlcnMsIGZyYWdtZW50KTtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0aW5nTm9kZSA9IGZpbmRTdGFydGluZ05vZGUobm9ybWFsaXplZENvbW1hbmRzLCB1cmxUcmVlLCByb3V0ZSk7XG4gIGNvbnN0IHVwZGF0ZWQgPSBub3JtYWxpemVkQ29tbWFuZHMuY29tbWFuZHMubGVuZ3RoID4gMCA/XG4gICAgICB1cGRhdGVNYW55KHN0YXJ0aW5nTm9kZS5jaGlsZHJlbi5zbGljZSgwKSwgbm9ybWFsaXplZENvbW1hbmRzLmNvbW1hbmRzKSA6XG4gICAgICBbXTtcbiAgY29uc3QgbmV3Um9vdCA9IGNvbnN0cnVjdE5ld1RyZWUodXJsVHJlZS5fcm9vdCwgc3RhcnRpbmdOb2RlLCB1cGRhdGVkKTtcblxuICByZXR1cm4gdHJlZShuZXdSb290LCB1cmxUcmVlLCBxdWVyeVBhcmFtZXRlcnMsIGZyYWdtZW50KTtcbn1cblxuZnVuY3Rpb24gdHJlZShyb290OiBUcmVlTm9kZTxVcmxTZWdtZW50PiwgdXJsVHJlZTogVXJsVHJlZSwgcXVlcnlQYXJhbWV0ZXJzOiBQYXJhbXMgfCB1bmRlZmluZWQsIGZyYWdtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBVcmxUcmVlIHtcbiAgY29uc3QgcSA9IHF1ZXJ5UGFyYW1ldGVycyA/IHN0cmluZ2lmeShxdWVyeVBhcmFtZXRlcnMpIDogdXJsVHJlZS5xdWVyeVBhcmFtZXRlcnM7XG4gIGNvbnN0IGYgPSBmcmFnbWVudCA/IGZyYWdtZW50IDogdXJsVHJlZS5mcmFnbWVudDtcbiAgcmV0dXJuIG5ldyBVcmxUcmVlKHJvb3QsIHEsIGYpO1xufVxuXG5mdW5jdGlvbiBuYXZpZ2F0ZVRvUm9vdChub3JtYWxpemVkQ2hhbmdlOiBOb3JtYWxpemVkTmF2aWdhdGlvbkNvbW1hbmRzKTogYm9vbGVhbiB7XG4gIHJldHVybiBub3JtYWxpemVkQ2hhbmdlLmlzQWJzb2x1dGUgJiYgbm9ybWFsaXplZENoYW5nZS5jb21tYW5kcy5sZW5ndGggPT09IDEgJiZcbiAgICBub3JtYWxpemVkQ2hhbmdlLmNvbW1hbmRzWzBdID09IFwiL1wiO1xufVxuXG5jbGFzcyBOb3JtYWxpemVkTmF2aWdhdGlvbkNvbW1hbmRzIHtcbiAgY29uc3RydWN0b3IocHVibGljIGlzQWJzb2x1dGU6IGJvb2xlYW4sIHB1YmxpYyBudW1iZXJPZkRvdWJsZURvdHM6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIGNvbW1hbmRzOiBhbnlbXSkge31cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tbWFuZHMoY29tbWFuZHM6IGFueVtdKTogTm9ybWFsaXplZE5hdmlnYXRpb25Db21tYW5kcyB7XG4gIGlmICgodHlwZW9mIGNvbW1hbmRzWzBdID09PSBcInN0cmluZ1wiKSAmJiBjb21tYW5kcy5sZW5ndGggPT09IDEgJiYgY29tbWFuZHNbMF0gPT0gXCIvXCIpIHtcbiAgICByZXR1cm4gbmV3IE5vcm1hbGl6ZWROYXZpZ2F0aW9uQ29tbWFuZHModHJ1ZSwgMCwgY29tbWFuZHMpO1xuICB9XG5cbiAgbGV0IG51bWJlck9mRG91YmxlRG90cyA9IDA7XG4gIGxldCBpc0Fic29sdXRlID0gZmFsc2U7XG4gIGNvbnN0IHJlcyA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjID0gY29tbWFuZHNbaV07XG5cbiAgICBpZiAoISh0eXBlb2YgYyA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIHJlcy5wdXNoKGMpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBjLnNwbGl0KCcvJyk7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7ICsraikge1xuICAgICAgbGV0IGNjID0gcGFydHNbal07XG5cbiAgICAgIC8vIGZpcnN0IGV4cCBpcyB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXlcbiAgICAgIGlmIChpID09IDApIHtcbiAgICAgICAgaWYgKGogPT0gMCAmJiBjYyA9PSBcIi5cIikgeyAgLy8gICcuL2EnXG4gICAgICAgICAgLy8gc2tpcCBpdFxuICAgICAgICB9IGVsc2UgaWYgKGogPT0gMCAmJiBjYyA9PSBcIlwiKSB7ICAvLyAgJy9hJ1xuICAgICAgICAgIGlzQWJzb2x1dGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGNjID09IFwiLi5cIikgeyAgLy8gICcuLi9hJ1xuICAgICAgICAgIG51bWJlck9mRG91YmxlRG90cysrO1xuICAgICAgICB9IGVsc2UgaWYgKGNjICE9ICcnKSB7XG4gICAgICAgICAgcmVzLnB1c2goY2MpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjYyAhPSAnJykge1xuICAgICAgICAgIHJlcy5wdXNoKGNjKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgTm9ybWFsaXplZE5hdmlnYXRpb25Db21tYW5kcyhpc0Fic29sdXRlLCBudW1iZXJPZkRvdWJsZURvdHMsIHJlcyk7XG59XG5cbmZ1bmN0aW9uIGZpbmRTdGFydGluZ05vZGUobm9ybWFsaXplZENoYW5nZTogTm9ybWFsaXplZE5hdmlnYXRpb25Db21tYW5kcywgdXJsVHJlZTogVXJsVHJlZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IFRyZWVOb2RlPFVybFNlZ21lbnQ+IHtcbiAgaWYgKG5vcm1hbGl6ZWRDaGFuZ2UuaXNBYnNvbHV0ZSkge1xuICAgIHJldHVybiB1cmxUcmVlLl9yb290O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVybFNlZ21lbnQgPVxuICAgICAgZmluZFVybFNlZ21lbnQocm91dGUsIHVybFRyZWUsIG5vcm1hbGl6ZWRDaGFuZ2UubnVtYmVyT2ZEb3VibGVEb3RzKTtcbiAgICByZXR1cm4gZmluZE1hdGNoaW5nTm9kZSh1cmxTZWdtZW50LCB1cmxUcmVlLl9yb290KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kVXJsU2VnbWVudChyb3V0ZTogQWN0aXZhdGVkUm91dGUsIHVybFRyZWU6IFVybFRyZWUsIG51bWJlck9mRG91YmxlRG90czogbnVtYmVyKTogVXJsU2VnbWVudCB7XG4gIGNvbnN0IHVybFNlZ21lbnQgPSByb3V0ZS5zbmFwc2hvdC5fbGFzdFVybFNlZ21lbnQ7XG4gIGNvbnN0IHBhdGggPSB1cmxUcmVlLnBhdGhGcm9tUm9vdCh1cmxTZWdtZW50KTtcbiAgaWYgKHBhdGgubGVuZ3RoIDw9IG51bWJlck9mRG91YmxlRG90cykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbnVtYmVyIG9mICcuLi8nXCIpO1xuICB9XG4gIHJldHVybiBwYXRoW3BhdGgubGVuZ3RoIC0gMSAtIG51bWJlck9mRG91YmxlRG90c107XG59XG5cbmZ1bmN0aW9uIGZpbmRNYXRjaGluZ05vZGUoc2VnbWVudDogVXJsU2VnbWVudCwgbm9kZTogVHJlZU5vZGU8VXJsU2VnbWVudD4pOiBUcmVlTm9kZTxVcmxTZWdtZW50PiB7XG4gIGlmIChub2RlLnZhbHVlID09PSBzZWdtZW50KSByZXR1cm4gbm9kZTtcbiAgZm9yIChsZXQgYyBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgY29uc3QgciA9IGZpbmRNYXRjaGluZ05vZGUoc2VnbWVudCwgYyk7XG4gICAgaWYgKHIpIHJldHVybiByO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgdXJsIHNlZ21lbnQgJyR7c2VnbWVudH0nYCk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdE5ld1RyZWUobm9kZTogVHJlZU5vZGU8VXJsU2VnbWVudD4sIG9yaWdpbmFsOiBUcmVlTm9kZTxVcmxTZWdtZW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZDogVHJlZU5vZGU8VXJsU2VnbWVudD5bXSk6IFRyZWVOb2RlPFVybFNlZ21lbnQ+IHtcbiAgaWYgKG5vZGUgPT09IG9yaWdpbmFsKSB7XG4gICAgcmV0dXJuIG5ldyBUcmVlTm9kZTxVcmxTZWdtZW50Pihub2RlLnZhbHVlLCB1cGRhdGVkKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IFRyZWVOb2RlPFVybFNlZ21lbnQ+KFxuICAgICAgbm9kZS52YWx1ZSwgbm9kZS5jaGlsZHJlbi5tYXAoYyA9PiBjb25zdHJ1Y3ROZXdUcmVlKGMsIG9yaWdpbmFsLCB1cGRhdGVkKSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1hbnkobm9kZXM6IFRyZWVOb2RlPFVybFNlZ21lbnQ+W10sIGNvbW1hbmRzOiBhbnlbXSk6IFRyZWVOb2RlPFVybFNlZ21lbnQ+W10ge1xuICBjb25zdCBvdXRsZXQgPSBnZXRPdXRsZXQoY29tbWFuZHMpO1xuICBjb25zdCBub2Rlc0luUmlnaHRPdXRsZXQgPSBub2Rlcy5maWx0ZXIoYyA9PiBjLnZhbHVlLm91dGxldCA9PT0gb3V0bGV0KTtcbiAgaWYgKG5vZGVzSW5SaWdodE91dGxldC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZVJpZ2h0T3V0bGV0ID0gbm9kZXNJblJpZ2h0T3V0bGV0WzBdOyAgLy8gdGhlcmUgY2FuIGJlIG9ubHkgb25lXG4gICAgbm9kZXNbbm9kZXMuaW5kZXhPZihub2RlUmlnaHRPdXRsZXQpXSA9IHVwZGF0ZShub2RlUmlnaHRPdXRsZXQsIGNvbW1hbmRzKTtcbiAgfSBlbHNlIHtcbiAgICBub2Rlcy5wdXNoKHVwZGF0ZShudWxsLCBjb21tYW5kcykpO1xuICB9XG4gIHJldHVybiBub2Rlcztcbn1cblxuZnVuY3Rpb24gZ2V0UGF0aChjb21tYW5kczogYW55W10pOiBhbnkge1xuICBpZiAoISh0eXBlb2YgY29tbWFuZHNbMF0gPT09IFwic3RyaW5nXCIpKSByZXR1cm4gY29tbWFuZHNbMF07XG4gIGNvbnN0IHBhcnRzID0gY29tbWFuZHNbMF0udG9TdHJpbmcoKS5zcGxpdChcIjpcIik7XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPiAxID8gcGFydHNbMV0gOiBjb21tYW5kc1swXTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0bGV0KGNvbW1hbmRzOiBhbnlbXSk6IHN0cmluZyB7XG4gIGlmICghKHR5cGVvZiBjb21tYW5kc1swXSA9PT0gXCJzdHJpbmdcIikpIHJldHVybiBQUklNQVJZX09VVExFVDtcbiAgY29uc3QgcGFydHMgPSBjb21tYW5kc1swXS50b1N0cmluZygpLnNwbGl0KFwiOlwiKTtcbiAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0c1swXSA6IFBSSU1BUllfT1VUTEVUO1xufVxuXG5mdW5jdGlvbiB1cGRhdGUobm9kZTogVHJlZU5vZGU8VXJsU2VnbWVudD58bnVsbCwgY29tbWFuZHM6IGFueVtdKTogVHJlZU5vZGU8VXJsU2VnbWVudD4ge1xuICBjb25zdCByZXN0ID0gY29tbWFuZHMuc2xpY2UoMSk7XG4gIGNvbnN0IG5leHQgPSByZXN0Lmxlbmd0aCA9PT0gMCA/IG51bGwgOiByZXN0WzBdO1xuICBjb25zdCBvdXRsZXQgPSBnZXRPdXRsZXQoY29tbWFuZHMpO1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChjb21tYW5kcyk7XG5cbiAgLy8gcmVhY2ggdGhlIGVuZCBvZiB0aGUgdHJlZSA9PiBjcmVhdGUgbmV3IHRyZWUgbm9kZXMuXG4gIGlmICghbm9kZSAmJiAhKHR5cGVvZiBuZXh0ID09PSAnb2JqZWN0JykpIHtcbiAgICBjb25zdCB1cmxTZWdtZW50ID0gbmV3IFVybFNlZ21lbnQocGF0aCwge30sIG91dGxldCk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSByZXN0Lmxlbmd0aCA9PT0gMCA/IFtdIDogW3VwZGF0ZShudWxsLCByZXN0KV07XG4gICAgcmV0dXJuIG5ldyBUcmVlTm9kZTxVcmxTZWdtZW50Pih1cmxTZWdtZW50LCBjaGlsZHJlbik7XG5cbiAgfSBlbHNlIGlmICghbm9kZSAmJiB0eXBlb2YgbmV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCB1cmxTZWdtZW50ID0gbmV3IFVybFNlZ21lbnQocGF0aCwgc3RyaW5naWZ5KG5leHQpLCBvdXRsZXQpO1xuICAgIHJldHVybiByZWN1cnNlKHVybFNlZ21lbnQsIG5vZGUsIHJlc3Quc2xpY2UoMSkpO1xuXG4gICAgLy8gZGlmZmVyZW50IG91dGxldCA9PiBwcmVzZXJ2ZSB0aGUgc3VidHJlZVxuICB9IGVsc2UgaWYgKG5vZGUgJiYgb3V0bGV0ICE9PSBub2RlLnZhbHVlLm91dGxldCkge1xuICAgIHJldHVybiBub2RlO1xuXG4gICAgLy8gcGFyYW1zIGNvbW1hbmRcbiAgfSBlbHNlIGlmIChub2RlICYmIHR5cGVvZiBwYXRoID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG5ld1NlZ21lbnQgPSBuZXcgVXJsU2VnbWVudChub2RlLnZhbHVlLnBhdGgsIHN0cmluZ2lmeShwYXRoKSwgbm9kZS52YWx1ZS5vdXRsZXQpO1xuICAgIHJldHVybiByZWN1cnNlKG5ld1NlZ21lbnQsIG5vZGUsIHJlc3QpO1xuXG4gICAgLy8gbmV4dCBvbmUgaXMgYSBwYXJhbXMgY29tbWFuZCAmJiBjYW4gcmV1c2UgdGhlIG5vZGVcbiAgfSBlbHNlIGlmIChub2RlICYmIHR5cGVvZiBuZXh0ID09PSAnb2JqZWN0JyAmJiBjb21wYXJlKHBhdGgsIHN0cmluZ2lmeShuZXh0KSwgbm9kZS52YWx1ZSkpIHtcbiAgICByZXR1cm4gcmVjdXJzZShub2RlLnZhbHVlLCBub2RlLCByZXN0LnNsaWNlKDEpKTtcblxuICAgIC8vIG5leHQgb25lIGlzIGEgcGFyYW1zIGNvbW1hbmQgJiYgY2Fubm90IHJldXNlIHRoZSBub2RlXG4gIH0gZWxzZSBpZiAobm9kZSAmJiB0eXBlb2YgbmV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCB1cmxTZWdtZW50ID0gbmV3IFVybFNlZ21lbnQocGF0aCwgc3RyaW5naWZ5KG5leHQpLCBvdXRsZXQpO1xuICAgIHJldHVybiByZWN1cnNlKHVybFNlZ21lbnQsIG5vZGUsIHJlc3Quc2xpY2UoMSkpO1xuXG4gICAgLy8gbmV4dCBvbmUgaXMgbm90IGEgcGFyYW1zIGNvbW1hbmQgJiYgY2FuIHJldXNlIHRoZSBub2RlXG4gIH0gZWxzZSBpZiAobm9kZSAmJiBjb21wYXJlKHBhdGgsIHt9LCBub2RlLnZhbHVlKSkge1xuICAgIHJldHVybiByZWN1cnNlKG5vZGUudmFsdWUsIG5vZGUsIHJlc3QpO1xuXG4gICAgLy8gbmV4dCBvbmUgaXMgbm90IGEgcGFyYW1zIGNvbW1hbmQgJiYgY2Fubm90IHJldXNlIHRoZSBub2RlXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdXJsU2VnbWVudCA9IG5ldyBVcmxTZWdtZW50KHBhdGgsIHt9LCBvdXRsZXQpO1xuICAgIHJldHVybiByZWN1cnNlKHVybFNlZ21lbnQsIG5vZGUsIHJlc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KToge1trZXk6IHN0cmluZ106IHN0cmluZ30ge1xuICBjb25zdCByZXMgPSB7fTtcbiAgZm9yRWFjaChwYXJhbXMsICh2LCBrKSA9PiByZXNba10gPSB2LnRvU3RyaW5nKCkpO1xuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlKHBhdGg6IHN0cmluZywgcGFyYW1zOiB7W2tleTogc3RyaW5nXTogYW55fSwgc2VnbWVudDogVXJsU2VnbWVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGF0aCA9PSBzZWdtZW50LnBhdGggJiYgc2hhbGxvd0VxdWFsKHBhcmFtcywgc2VnbWVudC5wYXJhbWV0ZXJzKTtcbn1cblxuZnVuY3Rpb24gcmVjdXJzZSh1cmxTZWdtZW50OiBVcmxTZWdtZW50LCBub2RlOiBUcmVlTm9kZTxVcmxTZWdtZW50PiB8IG51bGwsXG4gICAgICAgICAgICAgICAgICByZXN0OiBhbnlbXSk6IFRyZWVOb2RlPFVybFNlZ21lbnQ+IHtcbiAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG5ldyBUcmVlTm9kZTxVcmxTZWdtZW50Pih1cmxTZWdtZW50LCBbXSk7XG4gIH1cbiAgY29uc3QgY2hpbGRyZW4gPSBub2RlID8gbm9kZS5jaGlsZHJlbi5zbGljZSgwKSA6IFtdO1xuICByZXR1cm4gbmV3IFRyZWVOb2RlPFVybFNlZ21lbnQ+KHVybFNlZ21lbnQsIHVwZGF0ZU1hbnkoY2hpbGRyZW4sIHJlc3QpKTtcbn0iXX0=
|