Files
Angular-Cn/modules/@angular/router/build/src/recognize.js
T

168 lines
26 KiB
JavaScript

"use strict";
var collection_1 = require('./utils/collection');
var tree_1 = require('./utils/tree');
var router_state_1 = require('./router_state');
var shared_1 = require('./shared');
var Observable_1 = require('rxjs/Observable');
function recognize(rootComponentType, config, url) {
try {
var match_1 = new MatchResult(rootComponentType, config, [url.root], {}, url._root.children, [], shared_1.PRIMARY_OUTLET, null, url.root);
var roots = constructActivatedRoute(match_1);
var res_1 = new router_state_1.RouterStateSnapshot(roots[0], url.queryParameters, url.fragment);
return new Observable_1.Observable(function (obs) {
obs.next(res_1);
obs.complete();
});
}
catch (e) {
return new Observable_1.Observable(function (obs) { return obs.error(e); });
}
}
exports.recognize = recognize;
function constructActivatedRoute(match) {
var activatedRoute = createActivatedRouteSnapshot(match);
var children = match.leftOverUrl.length > 0 ?
recognizeMany(match.children, match.leftOverUrl) : recognizeLeftOvers(match.children, match.lastUrlSegment);
checkOutletNameUniqueness(children);
children.sort(function (a, b) {
if (a.value.outlet === shared_1.PRIMARY_OUTLET)
return -1;
if (b.value.outlet === shared_1.PRIMARY_OUTLET)
return 1;
return a.value.outlet.localeCompare(b.value.outlet);
});
return [new tree_1.TreeNode(activatedRoute, children)];
}
function recognizeLeftOvers(config, lastUrlSegment) {
if (!config)
return [];
var mIndex = matchIndex(config, [], lastUrlSegment);
return mIndex ? constructActivatedRoute(mIndex) : [];
}
function recognizeMany(config, urls) {
return collection_1.flatten(urls.map(function (url) { return recognizeOne(config, url); }));
}
function createActivatedRouteSnapshot(match) {
return new router_state_1.ActivatedRouteSnapshot(match.consumedUrlSegments, match.parameters, match.outlet, match.component, match.route, match.lastUrlSegment);
}
function recognizeOne(config, url) {
var m = match(config, url);
var primary = constructActivatedRoute(m);
var secondary = recognizeMany(config, m.secondary);
var res = primary.concat(secondary);
checkOutletNameUniqueness(res);
return res;
}
function checkOutletNameUniqueness(nodes) {
var names = {};
nodes.forEach(function (n) {
var routeWithSameOutletName = names[n.value.outlet];
if (routeWithSameOutletName) {
var p = routeWithSameOutletName.urlSegments.map(function (s) { return s.toString(); }).join("/");
var c = n.value.urlSegments.map(function (s) { return s.toString(); }).join("/");
throw new Error("Two segments cannot have the same outlet name: '" + p + "' and '" + c + "'.");
}
names[n.value.outlet] = n.value;
});
return nodes;
}
function match(config, url) {
var m = matchNonIndex(config, url);
if (m)
return m;
var mIndex = matchIndex(config, [url], url.value);
if (mIndex)
return mIndex;
var availableRoutes = config.map(function (r) {
var outlet = !r.outlet ? '' : r.outlet + ":";
return "'" + outlet + r.path + "'";
}).join(", ");
throw new Error("Cannot match any routes. Current segment: '" + url.value + "'. Available routes: [" + availableRoutes + "].");
}
function matchNonIndex(config, url) {
for (var _i = 0, config_1 = config; _i < config_1.length; _i++) {
var r = config_1[_i];
var m = matchWithParts(r, url);
if (m)
return m;
}
return null;
}
function matchIndex(config, leftOverUrls, lastUrlSegment) {
for (var _i = 0, config_2 = config; _i < config_2.length; _i++) {
var r = config_2[_i];
if (r.index) {
var outlet = r.outlet ? r.outlet : shared_1.PRIMARY_OUTLET;
var children = r.children ? r.children : [];
return new MatchResult(r.component, children, [], lastUrlSegment.parameters, leftOverUrls, [], outlet, r, lastUrlSegment);
}
}
return null;
}
function matchWithParts(route, url) {
if (!route.path)
return null;
if ((route.outlet ? route.outlet : shared_1.PRIMARY_OUTLET) !== url.value.outlet)
return null;
var path = route.path.startsWith("/") ? route.path.substring(1) : route.path;
if (path === "**") {
var consumedUrl = [];
var u = url;
while (u) {
consumedUrl.push(u.value);
u = collection_1.first(u.children);
}
var last = consumedUrl[consumedUrl.length - 1];
return new MatchResult(route.component, [], consumedUrl, last.parameters, [], [], shared_1.PRIMARY_OUTLET, route, last);
}
var parts = path.split("/");
var positionalParams = {};
var consumedUrlSegments = [];
var lastParent = null;
var lastSegment = null;
var current = url;
for (var i = 0; i < parts.length; ++i) {
if (!current)
return null;
var p_1 = parts[i];
var isLastSegment = i === parts.length - 1;
var isLastParent = i === parts.length - 2;
var isPosParam = p_1.startsWith(":");
if (!isPosParam && p_1 != current.value.path)
return null;
if (isLastSegment) {
lastSegment = current;
}
if (isLastParent) {
lastParent = current;
}
if (isPosParam) {
positionalParams[p_1.substring(1)] = current.value.path;
}
consumedUrlSegments.push(current.value);
current = collection_1.first(current.children);
}
if (!lastSegment)
throw "Cannot be reached";
var p = lastSegment.value.parameters;
var parameters = collection_1.merge(p, positionalParams);
var secondarySubtrees = lastParent ? lastParent.children.slice(1) : [];
var children = route.children ? route.children : [];
var outlet = route.outlet ? route.outlet : shared_1.PRIMARY_OUTLET;
return new MatchResult(route.component, children, consumedUrlSegments, parameters, lastSegment.children, secondarySubtrees, outlet, route, lastSegment.value);
}
var MatchResult = (function () {
function MatchResult(component, children, consumedUrlSegments, parameters, leftOverUrl, secondary, outlet, route, lastUrlSegment) {
this.component = component;
this.children = children;
this.consumedUrlSegments = consumedUrlSegments;
this.parameters = parameters;
this.leftOverUrl = leftOverUrl;
this.secondary = secondary;
this.outlet = outlet;
this.route = route;
this.lastUrlSegment = lastUrlSegment;
}
return MatchResult;
}());
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb2duaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlY29nbml6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsMkJBQXNDLG9CQUFvQixDQUFDLENBQUE7QUFDM0QscUJBQXlCLGNBQWMsQ0FBQyxDQUFBO0FBQ3hDLDZCQUE0RCxnQkFBZ0IsQ0FBQyxDQUFBO0FBQzdFLHVCQUF1QyxVQUFVLENBQUMsQ0FBQTtBQUdsRCwyQkFBMkIsaUJBQWlCLENBQUMsQ0FBQTtBQUU3QyxtQkFBMEIsaUJBQXVCLEVBQUUsTUFBb0IsRUFBRSxHQUFZO0lBQ25GLElBQUksQ0FBQztRQUNILElBQU0sT0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLHVCQUFjLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqSSxJQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxPQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFNLEtBQUcsR0FBRyxJQUFJLGtDQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRixNQUFNLENBQUMsSUFBSSx1QkFBVSxDQUFzQixVQUFBLEdBQUc7WUFDNUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFHLENBQUMsQ0FBQztZQUNkLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUU7SUFBQSxLQUFLLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1YsTUFBTSxDQUFDLElBQUksdUJBQVUsQ0FBc0IsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMs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QyxVQUFtQyxFQUNuQyxXQUFtQyxFQUNuQyxTQUFpQyxFQUNqQyxNQUFjLEVBQ2QsS0FBbUIsRUFDbkIsY0FBMEI7UUFSMUIsY0FBUyxHQUFULFNBQVMsQ0FBZTtRQUN4QixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBYztRQUNqQyxlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQUNuQyxnQkFBVyxHQUFYLFdBQVcsQ0FBd0I7UUFDbkMsY0FBUyxHQUFULFNBQVMsQ0FBd0I7UUFDakMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIsbUJBQWMsR0FBZCxjQUFjLENBQVk7SUFDMUMsQ0FBQztJQUNOLGtCQUFDO0FBQUQsQ0FBQyxBQVhELElBV0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVcmxUcmVlLCBVcmxTZWdtZW50IH0gZnJvbSAnLi91cmxfdHJlZSc7XG5pbXBvcnQgeyBmbGF0dGVuLCBmaXJzdCwgbWVyZ2UgfSBmcm9tICcuL3V0aWxzL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICcuL3V0aWxzL3RyZWUnO1xuaW1wb3J0IHsgUm91dGVyU3RhdGVTbmFwc2hvdCwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB9IGZyb20gJy4vcm91dGVyX3N0YXRlJztcbmltcG9ydCB7IFBhcmFtcywgUFJJTUFSWV9PVVRMRVQgfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQgeyBSb3V0ZXJDb25maWcsIFJvdXRlIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvZ25pemUocm9vdENvbXBvbmVudFR5cGU6IFR5cGUsIGNvbmZpZzogUm91dGVyQ29uZmlnLCB1cmw6IFVybFRyZWUpOiBPYnNlcnZhYmxlPFJvdXRlclN0YXRlU25hcHNob3Q+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYXRjaCA9IG5ldyBNYXRjaFJlc3VsdChyb290Q29tcG9uZW50VHlwZSwgY29uZmlnLCBbdXJsLnJvb3RdLCB7fSwgdXJsLl9yb290LmNoaWxkcmVuLCBbXSwgUFJJTUFSWV9PVVRMRVQsIG51bGwsIHVybC5yb290KTtcbiAgICBjb25zdCByb290cyA9IGNvbnN0cnVjdEFjdGl2YXRlZFJvdXRlKG1hdGNoKTtcbiAgICBjb25zdCByZXMgPSBuZXcgUm91dGVyU3RhdGVTbmFwc2hvdChyb290c1swXSwgdXJsLnF1ZXJ5UGFyYW1ldGVycywgdXJsLmZyYWdtZW50KTtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8Um91dGVyU3RhdGVTbmFwc2hvdD4ob2JzID0+IHtcbiAgICAgIG9icy5uZXh0KHJlcyk7XG4gICAgICBvYnMuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgfSBjYXRjaChlKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFJvdXRlclN0YXRlU25hcHNob3Q+KG9icyA9PiBvYnMuZXJyb3IoZSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEFjdGl2YXRlZFJvdXRlKG1hdGNoOiBNYXRjaFJlc3VsdCk6IFRyZWVOb2RlPEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+W10ge1xuICBjb25zdCBhY3RpdmF0ZWRSb3V0ZSA9IGNyZWF0ZUFjdGl2YXRlZFJvdXRlU25hcHNob3QobWF0Y2gpO1xuICBjb25zdCBjaGlsZHJlbiA9IG1hdGNoLmxlZnRPdmVyVXJsLmxlbmd0aCA+IDAgP1xuICAgIHJlY29nbml6ZU1hbnkobWF0Y2guY2hpbGRyZW4sIG1hdGNoLmxlZnRPdmVyVXJsKSA6IHJlY29nbml6ZUxlZnRPdmVycyhtYXRjaC5jaGlsZHJlbiwgbWF0Y2gubGFzdFVybFNlZ21lbnQpO1xuICBjaGVja091dGxldE5hbWVVbmlxdWVuZXNzKGNoaWxkcmVuKTtcbiAgY2hpbGRyZW4uc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLnZhbHVlLm91dGxldCA9PT0gUFJJTUFSWV9PVVRMRVQpIHJldHVybiAtMTtcbiAgICBpZiAoYi52YWx1ZS5vdXRsZXQgPT09IFBSSU1BUllfT1VUTEVUKSByZXR1cm4gMTtcbiAgICByZXR1cm4gYS52YWx1ZS5vdXRsZXQubG9jYWxlQ29tcGFyZShiLnZhbHVlLm91dGxldClcbiAgfSk7XG4gIHJldHVybiBbbmV3IFRyZWVOb2RlPEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+KGFjdGl2YXRlZFJvdXRlLCBjaGlsZHJlbildO1xufVxuXG5mdW5jdGlvbiByZWNvZ25pemVMZWZ0T3ZlcnMoY29uZmlnOiBSb3V0ZVtdLCBsYXN0VXJsU2VnbWVudDogVXJsU2VnbWVudCk6IFRyZWVOb2RlPEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+W10ge1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIFtdO1xuICBjb25zdCBtSW5kZXggPSBtYXRjaEluZGV4KGNvbmZpZywgW10sIGxhc3RVcmxTZWdtZW50KTtcbiAgcmV0dXJuIG1JbmRleCA/IGNvbnN0cnVjdEFjdGl2YXRlZFJvdXRlKG1JbmRleCkgOiBbXTtcbn1cblxuZnVuY3Rpb24gcmVjb2duaXplTWFueShjb25maWc6IFJvdXRlW10sIHVybHM6IFRyZWVOb2RlPFVybFNlZ21lbnQ+W10pOiBUcmVlTm9kZTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90PltdIHtcbiAgcmV0dXJuIGZsYXR0ZW4odXJscy5tYXAodXJsID0+IHJlY29nbml6ZU9uZShjb25maWcsIHVybCkpKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQWN0aXZhdGVkUm91dGVTbmFwc2hvdChtYXRjaDogTWF0Y2hSZXN1bHQpOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHtcbiAgcmV0dXJuIG5ldyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KG1hdGNoLmNvbnN1bWVkVXJsU2VnbWVudHMsIG1hdGNoLnBhcmFtZXRlcnMsIG1hdGNoLm91dGxldCwgbWF0Y2guY29tcG9uZW50LCBtYXRjaC5yb3V0ZSwgbWF0Y2gubGFzdFVybFNlZ21lbnQpO1xufVxuXG5mdW5jdGlvbiByZWNvZ25pemVPbmUoY29uZmlnOiBSb3V0ZVtdLCB1cmw6IFRyZWVOb2RlPFVybFNlZ21lbnQ+KTogVHJlZU5vZGU8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD5bXSB7XG4gIGNvbnN0IG0gPSBtYXRjaChjb25maWcsIHVybCk7XG4gIGNvbnN0IHByaW1hcnkgPSBjb25zdHJ1Y3RBY3RpdmF0ZWRSb3V0ZShtKTtcbiAgY29uc3Qgc2Vjb25kYXJ5ID0gcmVjb2duaXplTWFueShjb25maWcsIG0uc2Vjb25kYXJ5KTtcbiAgY29uc3QgcmVzID0gcHJpbWFyeS5jb25jYXQoc2Vjb25kYXJ5KTtcbiAgY2hlY2tPdXRsZXROYW1lVW5pcXVlbmVzcyhyZXMpO1xuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBjaGVja091dGxldE5hbWVVbmlxdWVuZXNzKG5vZGVzOiBUcmVlTm9kZTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90PltdKTogVHJlZU5vZGU8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD5bXSB7XG4gIGxldCBuYW1lcyA9IHt9O1xuICBub2Rlcy5mb3JFYWNoKG4gPT4ge1xuICAgIGxldCByb3V0ZVdpdGhTYW1lT3V0bGV0TmFtZSA9IG5hbWVzW24udmFsdWUub3V0bGV0XTtcbiAgICBpZiAocm91dGVXaXRoU2FtZU91dGxldE5hbWUpIHtcbiAgICAgIGNvbnN0IHAgPSByb3V0ZVdpdGhTYW1lT3V0bGV0TmFtZS51cmxTZWdtZW50cy5tYXAocyA9PiBzLnRvU3RyaW5nKCkpLmpvaW4oXCIvXCIpO1xuICAgICAgY29uc3QgYyA9IG4udmFsdWUudXJsU2VnbWVudHMubWFwKHMgPT4gcy50b1N0cmluZygpKS5qb2luKFwiL1wiKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHdvIHNlZ21lbnRzIGNhbm5vdCBoYXZlIHRoZSBzYW1lIG91dGxldCBuYW1lOiAnJHtwfScgYW5kICcke2N9Jy5gKTtcbiAgICB9XG4gICAgbmFtZXNbbi52YWx1ZS5vdXRsZXRdID0gbi52YWx1ZTtcbiAgfSk7XG4gIHJldHVybiBub2Rlcztcbn1cblxuZnVuY3Rpb24gbWF0Y2goY29uZmlnOiBSb3V0ZVtdLCB1cmw6IFRyZWVOb2RlPFVybFNlZ21lbnQ+KTogTWF0Y2hSZXN1bHQge1xuICBjb25zdCBtID0gbWF0Y2hOb25JbmRleChjb25maWcsIHVybCk7XG4gIGlmIChtKSByZXR1cm4gbTtcblxuICBjb25zdCBtSW5kZXggPSBtYXRjaEluZGV4KGNvbmZpZywgW3VybF0sIHVybC52YWx1ZSk7XG4gIGlmIChtSW5kZXgpIHJldHVybiBtSW5kZXg7XG5cbiAgY29uc3QgYXZhaWxhYmxlUm91dGVzID0gY29uZmlnLm1hcChyID0+IHtcbiAgICBjb25zdCBvdXRsZXQgPSAhci5vdXRsZXQgPyAnJyA6IGAke3Iub3V0bGV0fTpgO1xuICAgIHJldHVybiBgJyR7b3V0bGV0fSR7ci5wYXRofSdgO1xuICB9KS5qb2luKFwiLCBcIik7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQ2Fubm90IG1hdGNoIGFueSByb3V0ZXMuIEN1cnJlbnQgc2VnbWVudDogJyR7dXJsLnZhbHVlfScuIEF2YWlsYWJsZSByb3V0ZXM6IFske2F2YWlsYWJsZVJvdXRlc31dLmApO1xufVxuXG5mdW5jdGlvbiBtYXRjaE5vbkluZGV4KGNvbmZpZzogUm91dGVbXSwgdXJsOiBUcmVlTm9kZTxVcmxTZWdtZW50Pik6IE1hdGNoUmVzdWx0IHwgbnVsbCB7XG4gIGZvciAobGV0IHIgb2YgY29uZmlnKSB7XG4gICAgbGV0IG0gPSBtYXRjaFdpdGhQYXJ0cyhyLCB1cmwpO1xuICAgIGlmIChtKSByZXR1cm4gbTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbWF0Y2hJbmRleChjb25maWc6IFJvdXRlW10sIGxlZnRPdmVyVXJsczogVHJlZU5vZGU8VXJsU2VnbWVudD5bXSwgbGFzdFVybFNlZ21lbnQ6IFVybFNlZ21lbnQpOiBNYXRjaFJlc3VsdCB8IG51bGwge1xuICBmb3IgKGxldCByIG9mIGNvbmZpZykge1xuICAgIGlmIChyLmluZGV4KSB7XG4gICAgICBjb25zdCBvdXRsZXQgPSByLm91dGxldCA/IHIub3V0bGV0IDogUFJJTUFSWV9PVVRMRVQ7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHIuY2hpbGRyZW4gPyByLmNoaWxkcmVuIDogW107XG4gICAgICByZXR1cm4gbmV3IE1hdGNoUmVzdWx0KHIuY29tcG9uZW50LCBjaGlsZHJlbiwgW10sIGxhc3RVcmxTZWdtZW50LnBhcmFtZXRlcnMsIGxlZnRPdmVyVXJscywgW10sIG91dGxldCwgciwgbGFzdFVybFNlZ21lbnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbWF0Y2hXaXRoUGFydHMocm91dGU6IFJvdXRlLCB1cmw6IFRyZWVOb2RlPFVybFNlZ21lbnQ+KTogTWF0Y2hSZXN1bHQgfCBudWxsIHtcbiAgaWYgKCFyb3V0ZS5wYXRoKSByZXR1cm4gbnVsbDtcbiAgaWYgKChyb3V0ZS5vdXRsZXQgPyByb3V0ZS5vdXRsZXQgOiBQUklNQVJZX09VVExFVCkgIT09IHVybC52YWx1ZS5vdXRsZXQpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHBhdGggPSByb3V0ZS5wYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcm91dGUucGF0aC5zdWJzdHJpbmcoMSkgOiByb3V0ZS5wYXRoO1xuICBpZiAocGF0aCA9PT0gXCIqKlwiKSB7XG4gICAgY29uc3QgY29uc3VtZWRVcmwgPSBbXTtcbiAgICBsZXQgdTpUcmVlTm9kZTxVcmxTZWdtZW50PnxudWxsID0gdXJsO1xuICAgIHdoaWxlICh1KSB7XG4gICAgICBjb25zdW1lZFVybC5wdXNoKHUudmFsdWUpO1xuICAgICAgdSA9IGZpcnN0KHUuY2hpbGRyZW4pO1xuICAgIH1cbiAgICBjb25zdCBsYXN0ID0gY29uc3VtZWRVcmxbY29uc3VtZWRVcmwubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIG5ldyBNYXRjaFJlc3VsdChyb3V0ZS5jb21wb25lbnQsIFtdLCBjb25zdW1lZFVybCwgbGFzdC5wYXJhbWV0ZXJzLCBbXSwgW10sIFBSSU1BUllfT1VUTEVULCByb3V0ZSwgbGFzdCk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICBjb25zdCBwb3NpdGlvbmFsUGFyYW1zID0ge307XG4gIGNvbnN0IGNvbnN1bWVkVXJsU2VnbWVudHMgPSBbXTtcblxuICBsZXQgbGFzdFBhcmVudDogVHJlZU5vZGU8VXJsU2VnbWVudD58bnVsbCA9IG51bGw7XG4gIGxldCBsYXN0U2VnbWVudDogVHJlZU5vZGU8VXJsU2VnbWVudD58bnVsbCA9IG51bGw7XG5cbiAgbGV0IGN1cnJlbnQ6IFRyZWVOb2RlPFVybFNlZ21lbnQ+fG51bGwgPSB1cmw7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgcCA9IHBhcnRzW2ldO1xuICAgIGNvbnN0IGlzTGFzdFNlZ21lbnQgPSBpID09PSBwYXJ0cy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IGlzTGFzdFBhcmVudCA9IGkgPT09IHBhcnRzLmxlbmd0aCAtIDI7XG4gICAgY29uc3QgaXNQb3NQYXJhbSA9IHAuc3RhcnRzV2l0aChcIjpcIik7XG5cbiAgICBpZiAoIWlzUG9zUGFyYW0gJiYgcCAhPSBjdXJyZW50LnZhbHVlLnBhdGgpIHJldHVybiBudWxsO1xuICAgIGlmIChpc0xhc3RTZWdtZW50KSB7XG4gICAgICBsYXN0U2VnbWVudCA9IGN1cnJlbnQ7XG4gICAgfVxuICAgIGlmIChpc0xhc3RQYXJlbnQpIHtcbiAgICAgIGxhc3RQYXJlbnQgPSBjdXJyZW50O1xuICAgIH1cblxuICAgIGlmIChpc1Bvc1BhcmFtKSB7XG4gICAgICBwb3NpdGlvbmFsUGFyYW1zW3Auc3Vic3RyaW5nKDEpXSA9IGN1cnJlbnQudmFsdWUucGF0aDtcbiAgICB9XG5cbiAgICBjb25zdW1lZFVybFNlZ21lbnRzLnB1c2goY3VycmVudC52YWx1ZSk7XG5cbiAgICBjdXJyZW50ID0gZmlyc3QoY3VycmVudC5jaGlsZHJlbik7XG4gIH1cblxuICBpZiAoIWxhc3RTZWdtZW50KSB0aHJvdyBcIkNhbm5vdCBiZSByZWFjaGVkXCI7XG5cbiAgY29uc3QgcCA9IGxhc3RTZWdtZW50LnZhbHVlLnBhcmFtZXRlcnM7XG4gIGNvbnN0IHBhcmFtZXRlcnMgPSA8e1trZXk6IHN0cmluZ106IHN0cmluZ30+bWVyZ2UocCwgcG9zaXRpb25hbFBhcmFtcyk7XG4gIGNvbnN0IHNlY29uZGFyeVN1YnRyZWVzID0gbGFzdFBhcmVudCA/IGxhc3RQYXJlbnQuY2hpbGRyZW4uc2xpY2UoMSkgOiBbXTtcbiAgY29uc3QgY2hpbGRyZW4gPSByb3V0ZS5jaGlsZHJlbiA/IHJvdXRlLmNoaWxkcmVuIDogW107XG4gIGNvbnN0IG91dGxldCA9IHJvdXRlLm91dGxldCA/IHJvdXRlLm91dGxldCA6IFBSSU1BUllfT1VUTEVUO1xuXG4gIHJldHVybiBuZXcgTWF0Y2hSZXN1bHQocm91dGUuY29tcG9uZW50LCBjaGlsZHJlbiwgY29uc3VtZWRVcmxTZWdtZW50cywgcGFyYW1ldGVycywgbGFzdFNlZ21lbnQuY2hpbGRyZW4sXG4gICAgc2Vjb25kYXJ5U3VidHJlZXMsIG91dGxldCwgcm91dGUsIGxhc3RTZWdtZW50LnZhbHVlKTtcbn1cblxuY2xhc3MgTWF0Y2hSZXN1bHQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50OiBUeXBlIHwgc3RyaW5nLFxuICAgICAgICAgICAgICBwdWJsaWMgY2hpbGRyZW46IFJvdXRlW10sXG4gICAgICAgICAgICAgIHB1YmxpYyBjb25zdW1lZFVybFNlZ21lbnRzOiBVcmxTZWdtZW50W10sXG4gICAgICAgICAgICAgIHB1YmxpYyBwYXJhbWV0ZXJzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSxcbiAgICAgICAgICAgICAgcHVibGljIGxlZnRPdmVyVXJsOiBUcmVlTm9kZTxVcmxTZWdtZW50PltdLFxuICAgICAgICAgICAgICBwdWJsaWMgc2Vjb25kYXJ5OiBUcmVlTm9kZTxVcmxTZWdtZW50PltdLFxuICAgICAgICAgICAgICBwdWJsaWMgb3V0bGV0OiBzdHJpbmcsXG4gICAgICAgICAgICAgIHB1YmxpYyByb3V0ZTogUm91dGUgfCBudWxsLFxuICAgICAgICAgICAgICBwdWJsaWMgbGFzdFVybFNlZ21lbnQ6IFVybFNlZ21lbnRcbiAgKSB7fVxufSJdfQ==