2016-05-27 18:36:17 +00:00
|
|
|
"use strict";
|
|
|
|
|
var core_1 = require('@angular/core');
|
|
|
|
|
var router_outlet_map_1 = require('./router_outlet_map');
|
|
|
|
|
var recognize_1 = require('./recognize');
|
2016-06-02 22:30:49 +00:00
|
|
|
var resolve_1 = require('./resolve');
|
|
|
|
|
var create_router_state_1 = require('./create_router_state');
|
2016-05-27 18:36:17 +00:00
|
|
|
var url_tree_1 = require('./url_tree');
|
|
|
|
|
var shared_1 = require('./shared');
|
|
|
|
|
var router_state_1 = require('./router_state');
|
|
|
|
|
var create_url_tree_1 = require('./create_url_tree');
|
|
|
|
|
var collection_1 = require('./utils/collection');
|
2016-06-03 21:29:15 +00:00
|
|
|
var Subject_1 = require('rxjs/Subject');
|
2016-05-27 18:36:17 +00:00
|
|
|
require('rxjs/add/operator/map');
|
2016-06-02 22:30:49 +00:00
|
|
|
require('rxjs/add/operator/scan');
|
2016-05-27 18:36:17 +00:00
|
|
|
require('rxjs/add/operator/mergeMap');
|
2016-06-03 21:29:15 +00:00
|
|
|
require('rxjs/add/operator/concat');
|
|
|
|
|
require('rxjs/add/operator/concatMap');
|
2016-06-02 22:30:49 +00:00
|
|
|
var of_1 = require('rxjs/observable/of');
|
2016-05-27 18:36:17 +00:00
|
|
|
var forkJoin_1 = require('rxjs/observable/forkJoin');
|
2016-06-03 21:29:15 +00:00
|
|
|
var NavigationStart = (function () {
|
|
|
|
|
function NavigationStart(id, url) {
|
|
|
|
|
this.id = id;
|
|
|
|
|
this.url = url;
|
|
|
|
|
}
|
|
|
|
|
return NavigationStart;
|
|
|
|
|
}());
|
|
|
|
|
exports.NavigationStart = NavigationStart;
|
|
|
|
|
var NavigationEnd = (function () {
|
|
|
|
|
function NavigationEnd(id, url) {
|
|
|
|
|
this.id = id;
|
|
|
|
|
this.url = url;
|
|
|
|
|
}
|
|
|
|
|
return NavigationEnd;
|
|
|
|
|
}());
|
|
|
|
|
exports.NavigationEnd = NavigationEnd;
|
|
|
|
|
var NavigationCancel = (function () {
|
|
|
|
|
function NavigationCancel(id, url) {
|
|
|
|
|
this.id = id;
|
|
|
|
|
this.url = url;
|
|
|
|
|
}
|
|
|
|
|
return NavigationCancel;
|
|
|
|
|
}());
|
|
|
|
|
exports.NavigationCancel = NavigationCancel;
|
|
|
|
|
var NavigationError = (function () {
|
|
|
|
|
function NavigationError(id, url, error) {
|
|
|
|
|
this.id = id;
|
|
|
|
|
this.url = url;
|
|
|
|
|
this.error = error;
|
|
|
|
|
}
|
|
|
|
|
return NavigationError;
|
|
|
|
|
}());
|
|
|
|
|
exports.NavigationError = NavigationError;
|
2016-05-27 18:36:17 +00:00
|
|
|
var Router = (function () {
|
2016-06-02 22:30:49 +00:00
|
|
|
function Router(rootComponentType, resolver, urlSerializer, outletMap, location, injector) {
|
|
|
|
|
this.rootComponentType = rootComponentType;
|
2016-05-27 18:36:17 +00:00
|
|
|
this.resolver = resolver;
|
|
|
|
|
this.urlSerializer = urlSerializer;
|
|
|
|
|
this.outletMap = outletMap;
|
|
|
|
|
this.location = location;
|
2016-06-02 22:30:49 +00:00
|
|
|
this.injector = injector;
|
2016-06-03 21:29:15 +00:00
|
|
|
this.navigationId = 0;
|
|
|
|
|
this.routerEvents = new Subject_1.Subject();
|
2016-05-27 18:36:17 +00:00
|
|
|
this.currentUrlTree = url_tree_1.createEmptyUrlTree();
|
2016-06-02 22:30:49 +00:00
|
|
|
this.currentRouterState = router_state_1.createEmptyState(rootComponentType);
|
2016-05-27 18:36:17 +00:00
|
|
|
this.setUpLocationChangeListener();
|
|
|
|
|
this.navigateByUrl(this.location.path());
|
|
|
|
|
}
|
|
|
|
|
Object.defineProperty(Router.prototype, "routerState", {
|
|
|
|
|
get: function () {
|
|
|
|
|
return this.currentRouterState;
|
|
|
|
|
},
|
|
|
|
|
enumerable: true,
|
|
|
|
|
configurable: true
|
|
|
|
|
});
|
|
|
|
|
Object.defineProperty(Router.prototype, "urlTree", {
|
|
|
|
|
get: function () {
|
|
|
|
|
return this.currentUrlTree;
|
|
|
|
|
},
|
|
|
|
|
enumerable: true,
|
|
|
|
|
configurable: true
|
|
|
|
|
});
|
2016-06-03 21:29:15 +00:00
|
|
|
Object.defineProperty(Router.prototype, "events", {
|
|
|
|
|
get: function () {
|
|
|
|
|
return this.routerEvents;
|
|
|
|
|
},
|
|
|
|
|
enumerable: true,
|
|
|
|
|
configurable: true
|
|
|
|
|
});
|
2016-05-27 18:36:17 +00:00
|
|
|
Router.prototype.navigateByUrl = function (url) {
|
|
|
|
|
var urlTree = this.urlSerializer.parse(url);
|
2016-06-03 21:29:15 +00:00
|
|
|
return this.scheduleNavigation(urlTree, false);
|
2016-05-27 18:36:17 +00:00
|
|
|
};
|
|
|
|
|
Router.prototype.resetConfig = function (config) {
|
|
|
|
|
this.config = config;
|
|
|
|
|
};
|
|
|
|
|
Router.prototype.dispose = function () { this.locationSubscription.unsubscribe(); };
|
|
|
|
|
Router.prototype.createUrlTree = function (commands, _a) {
|
|
|
|
|
var _b = _a === void 0 ? {} : _a, relativeTo = _b.relativeTo, queryParameters = _b.queryParameters, fragment = _b.fragment;
|
|
|
|
|
var a = relativeTo ? relativeTo : this.routerState.root;
|
|
|
|
|
return create_url_tree_1.createUrlTree(a, this.currentUrlTree, commands, queryParameters, fragment);
|
|
|
|
|
};
|
|
|
|
|
Router.prototype.navigate = function (commands, extras) {
|
|
|
|
|
if (extras === void 0) { extras = {}; }
|
2016-06-03 21:29:15 +00:00
|
|
|
return this.scheduleNavigation(this.createUrlTree(commands, extras), false);
|
2016-05-27 18:36:17 +00:00
|
|
|
};
|
|
|
|
|
Router.prototype.serializeUrl = function (url) { return this.urlSerializer.serialize(url); };
|
|
|
|
|
Router.prototype.parseUrl = function (url) { return this.urlSerializer.parse(url); };
|
2016-06-03 21:29:15 +00:00
|
|
|
Router.prototype.scheduleNavigation = function (url, pop) {
|
|
|
|
|
var _this = this;
|
|
|
|
|
var id = ++this.navigationId;
|
|
|
|
|
this.routerEvents.next(new NavigationStart(id, url));
|
|
|
|
|
return Promise.resolve().then(function (_) { return _this.runNavigate(url, false, id); });
|
|
|
|
|
};
|
2016-05-27 18:36:17 +00:00
|
|
|
Router.prototype.setUpLocationChangeListener = function () {
|
|
|
|
|
var _this = this;
|
|
|
|
|
this.locationSubscription = this.location.subscribe(function (change) {
|
2016-06-03 21:29:15 +00:00
|
|
|
return _this.scheduleNavigation(_this.urlSerializer.parse(change['url']), change['pop']);
|
2016-05-27 18:36:17 +00:00
|
|
|
});
|
|
|
|
|
};
|
2016-06-03 21:29:15 +00:00
|
|
|
Router.prototype.runNavigate = function (url, pop, id) {
|
2016-05-27 18:36:17 +00:00
|
|
|
var _this = this;
|
2016-06-03 21:29:15 +00:00
|
|
|
if (id !== this.navigationId) {
|
|
|
|
|
this.routerEvents.next(new NavigationCancel(id, url));
|
|
|
|
|
return Promise.resolve(false);
|
|
|
|
|
}
|
|
|
|
|
return new Promise(function (resolvePromise, rejectPromise) {
|
|
|
|
|
var state;
|
|
|
|
|
recognize_1.recognize(_this.rootComponentType, _this.config, url).mergeMap(function (newRouterStateSnapshot) {
|
|
|
|
|
return resolve_1.resolve(_this.resolver, newRouterStateSnapshot);
|
|
|
|
|
}).map(function (routerStateSnapshot) {
|
|
|
|
|
return create_router_state_1.createRouterState(routerStateSnapshot, _this.currentRouterState);
|
|
|
|
|
}).map(function (newState) {
|
|
|
|
|
state = newState;
|
|
|
|
|
}).mergeMap(function (_) {
|
|
|
|
|
return new GuardChecks(state.snapshot, _this.currentRouterState.snapshot, _this.injector).check(_this.outletMap);
|
|
|
|
|
}).forEach(function (shouldActivate) {
|
|
|
|
|
if (!shouldActivate || id !== _this.navigationId) {
|
|
|
|
|
_this.routerEvents.next(new NavigationCancel(id, url));
|
|
|
|
|
return Promise.resolve(false);
|
|
|
|
|
}
|
|
|
|
|
new ActivateRoutes(state, _this.currentRouterState).activate(_this.outletMap);
|
|
|
|
|
_this.currentUrlTree = url;
|
|
|
|
|
_this.currentRouterState = state;
|
|
|
|
|
if (!pop) {
|
|
|
|
|
_this.location.go(_this.urlSerializer.serialize(url));
|
|
|
|
|
}
|
|
|
|
|
}).then(function () {
|
|
|
|
|
_this.routerEvents.next(new NavigationEnd(id, url));
|
|
|
|
|
resolvePromise(true);
|
|
|
|
|
}, function (e) {
|
|
|
|
|
_this.routerEvents.next(new NavigationError(id, url, e));
|
|
|
|
|
rejectPromise(e);
|
|
|
|
|
});
|
2016-05-27 18:36:17 +00:00
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
return Router;
|
|
|
|
|
}());
|
|
|
|
|
exports.Router = Router;
|
2016-06-02 22:30:49 +00:00
|
|
|
var CanActivate = (function () {
|
|
|
|
|
function CanActivate(route) {
|
|
|
|
|
this.route = route;
|
|
|
|
|
}
|
|
|
|
|
return CanActivate;
|
|
|
|
|
}());
|
|
|
|
|
var CanDeactivate = (function () {
|
|
|
|
|
function CanDeactivate(component, route) {
|
|
|
|
|
this.component = component;
|
|
|
|
|
this.route = route;
|
|
|
|
|
}
|
|
|
|
|
return CanDeactivate;
|
|
|
|
|
}());
|
|
|
|
|
var GuardChecks = (function () {
|
|
|
|
|
function GuardChecks(future, curr, injector) {
|
|
|
|
|
this.future = future;
|
|
|
|
|
this.curr = curr;
|
|
|
|
|
this.injector = injector;
|
|
|
|
|
this.checks = [];
|
|
|
|
|
}
|
|
|
|
|
GuardChecks.prototype.check = function (parentOutletMap) {
|
|
|
|
|
var _this = this;
|
|
|
|
|
var futureRoot = this.future._root;
|
|
|
|
|
var currRoot = this.curr ? this.curr._root : null;
|
|
|
|
|
this.traverseChildRoutes(futureRoot, currRoot, parentOutletMap);
|
|
|
|
|
if (this.checks.length === 0)
|
|
|
|
|
return of_1.of(true);
|
|
|
|
|
return forkJoin_1.forkJoin(this.checks.map(function (s) {
|
|
|
|
|
if (s instanceof CanActivate) {
|
|
|
|
|
return _this.runCanActivate(s.route);
|
|
|
|
|
}
|
|
|
|
|
else if (s instanceof CanDeactivate) {
|
|
|
|
|
return _this.runCanDeactivate(s.component, s.route);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
throw new Error("Cannot be reached");
|
|
|
|
|
}
|
|
|
|
|
})).map(collection_1.and);
|
|
|
|
|
};
|
|
|
|
|
GuardChecks.prototype.traverseChildRoutes = function (futureNode, currNode, outletMap) {
|
|
|
|
|
var _this = this;
|
|
|
|
|
var prevChildren = nodeChildrenAsMap(currNode);
|
|
|
|
|
futureNode.children.forEach(function (c) {
|
|
|
|
|
_this.traverseRoutes(c, prevChildren[c.value.outlet], outletMap);
|
|
|
|
|
delete prevChildren[c.value.outlet];
|
|
|
|
|
});
|
|
|
|
|
collection_1.forEach(prevChildren, function (v, k) { return _this.deactivateOutletAndItChildren(v, outletMap._outlets[k]); });
|
|
|
|
|
};
|
|
|
|
|
GuardChecks.prototype.traverseRoutes = function (futureNode, currNode, parentOutletMap) {
|
|
|
|
|
var future = futureNode.value;
|
|
|
|
|
var curr = currNode ? currNode.value : null;
|
|
|
|
|
var outlet = parentOutletMap ? parentOutletMap._outlets[futureNode.value.outlet] : null;
|
|
|
|
|
if (curr && future._routeConfig === curr._routeConfig) {
|
|
|
|
|
if (!collection_1.shallowEqual(future.params, curr.params)) {
|
|
|
|
|
this.checks.push(new CanDeactivate(outlet.component, curr), new CanActivate(future));
|
|
|
|
|
}
|
|
|
|
|
this.traverseChildRoutes(futureNode, currNode, outlet ? outlet.outletMap : null);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
this.deactivateOutletAndItChildren(curr, outlet);
|
|
|
|
|
this.checks.push(new CanActivate(future));
|
|
|
|
|
this.traverseChildRoutes(futureNode, null, outlet ? outlet.outletMap : null);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
GuardChecks.prototype.deactivateOutletAndItChildren = function (route, outlet) {
|
|
|
|
|
var _this = this;
|
|
|
|
|
if (outlet && outlet.isActivated) {
|
|
|
|
|
collection_1.forEach(outlet.outletMap._outlets, function (v, k) { return _this.deactivateOutletAndItChildren(v, outlet.outletMap._outlets[k]); });
|
|
|
|
|
this.checks.push(new CanDeactivate(outlet.component, route));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
GuardChecks.prototype.runCanActivate = function (future) {
|
|
|
|
|
var _this = this;
|
|
|
|
|
var canActivate = future._routeConfig ? future._routeConfig.canActivate : null;
|
|
|
|
|
if (!canActivate || canActivate.length === 0)
|
|
|
|
|
return of_1.of(true);
|
|
|
|
|
return forkJoin_1.forkJoin(canActivate.map(function (c) {
|
|
|
|
|
var guard = _this.injector.get(c);
|
|
|
|
|
if (guard.canActivate) {
|
|
|
|
|
return of_1.of(guard.canActivate(future, _this.future));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
return of_1.of(guard(future, _this.future));
|
|
|
|
|
}
|
|
|
|
|
})).map(collection_1.and);
|
|
|
|
|
};
|
|
|
|
|
GuardChecks.prototype.runCanDeactivate = function (component, curr) {
|
|
|
|
|
var _this = this;
|
|
|
|
|
var canDeactivate = curr._routeConfig ? curr._routeConfig.canDeactivate : null;
|
|
|
|
|
if (!canDeactivate || canDeactivate.length === 0)
|
|
|
|
|
return of_1.of(true);
|
|
|
|
|
return forkJoin_1.forkJoin(canDeactivate.map(function (c) {
|
|
|
|
|
var guard = _this.injector.get(c);
|
|
|
|
|
if (guard.canDeactivate) {
|
|
|
|
|
return of_1.of(guard.canDeactivate(component, curr, _this.curr));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
return of_1.of(guard(component, curr, _this.curr));
|
|
|
|
|
}
|
|
|
|
|
})).map(collection_1.and);
|
|
|
|
|
};
|
|
|
|
|
return GuardChecks;
|
|
|
|
|
}());
|
2016-05-27 18:36:17 +00:00
|
|
|
var ActivateRoutes = (function () {
|
2016-06-02 22:30:49 +00:00
|
|
|
function ActivateRoutes(futureState, currState) {
|
2016-05-27 18:36:17 +00:00
|
|
|
this.futureState = futureState;
|
|
|
|
|
this.currState = currState;
|
|
|
|
|
}
|
|
|
|
|
ActivateRoutes.prototype.activate = function (parentOutletMap) {
|
2016-06-02 22:30:49 +00:00
|
|
|
var futureRoot = this.futureState._root;
|
|
|
|
|
var currRoot = this.currState ? this.currState._root : null;
|
|
|
|
|
pushQueryParamsAndFragment(this.futureState);
|
|
|
|
|
this.activateChildRoutes(futureRoot, currRoot, parentOutletMap);
|
2016-05-27 18:36:17 +00:00
|
|
|
};
|
|
|
|
|
ActivateRoutes.prototype.activateChildRoutes = function (futureNode, currNode, outletMap) {
|
|
|
|
|
var _this = this;
|
|
|
|
|
var prevChildren = nodeChildrenAsMap(currNode);
|
|
|
|
|
futureNode.children.forEach(function (c) {
|
2016-06-02 22:30:49 +00:00
|
|
|
_this.activateRoutes(c, prevChildren[c.value.outlet], outletMap);
|
2016-05-27 18:36:17 +00:00
|
|
|
delete prevChildren[c.value.outlet];
|
|
|
|
|
});
|
|
|
|
|
collection_1.forEach(prevChildren, function (v, k) { return _this.deactivateOutletAndItChildren(outletMap._outlets[k]); });
|
|
|
|
|
};
|
|
|
|
|
ActivateRoutes.prototype.activateRoutes = function (futureNode, currNode, parentOutletMap) {
|
|
|
|
|
var future = futureNode.value;
|
|
|
|
|
var curr = currNode ? currNode.value : null;
|
|
|
|
|
var outlet = getOutlet(parentOutletMap, futureNode.value);
|
|
|
|
|
if (future === curr) {
|
2016-06-02 22:30:49 +00:00
|
|
|
router_state_1.advanceActivatedRoute(future);
|
|
|
|
|
this.activateChildRoutes(futureNode, currNode, outlet.outletMap);
|
2016-05-27 18:36:17 +00:00
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
this.deactivateOutletAndItChildren(outlet);
|
2016-06-02 22:30:49 +00:00
|
|
|
var outletMap = new router_outlet_map_1.RouterOutletMap();
|
|
|
|
|
this.activateNewRoutes(outletMap, future, outlet);
|
|
|
|
|
this.activateChildRoutes(futureNode, null, outletMap);
|
2016-05-27 18:36:17 +00:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
ActivateRoutes.prototype.activateNewRoutes = function (outletMap, future, outlet) {
|
|
|
|
|
var resolved = core_1.ReflectiveInjector.resolve([
|
|
|
|
|
{ provide: router_state_1.ActivatedRoute, useValue: future },
|
|
|
|
|
{ provide: router_outlet_map_1.RouterOutletMap, useValue: outletMap }
|
|
|
|
|
]);
|
2016-06-02 22:30:49 +00:00
|
|
|
outlet.activate(future._futureSnapshot._resolvedComponentFactory, resolved, outletMap);
|
|
|
|
|
router_state_1.advanceActivatedRoute(future);
|
2016-05-27 18:36:17 +00:00
|
|
|
};
|
|
|
|
|
ActivateRoutes.prototype.deactivateOutletAndItChildren = function (outlet) {
|
|
|
|
|
var _this = this;
|
|
|
|
|
if (outlet && outlet.isActivated) {
|
|
|
|
|
collection_1.forEach(outlet.outletMap._outlets, function (v, k) { return _this.deactivateOutletAndItChildren(v); });
|
|
|
|
|
outlet.deactivate();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
return ActivateRoutes;
|
|
|
|
|
}());
|
2016-06-02 22:30:49 +00:00
|
|
|
function pushQueryParamsAndFragment(state) {
|
|
|
|
|
if (!collection_1.shallowEqual(state.snapshot.queryParams, state.queryParams.value)) {
|
|
|
|
|
state.queryParams.next(state.snapshot.queryParams);
|
|
|
|
|
}
|
|
|
|
|
if (state.snapshot.fragment !== state.fragment.value) {
|
|
|
|
|
state.fragment.next(state.snapshot.fragment);
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-05-27 18:36:17 +00:00
|
|
|
function nodeChildrenAsMap(node) {
|
|
|
|
|
return node ?
|
|
|
|
|
node.children.reduce(function (m, c) {
|
|
|
|
|
m[c.value.outlet] = c;
|
|
|
|
|
return m;
|
|
|
|
|
}, {}) :
|
|
|
|
|
{};
|
|
|
|
|
}
|
|
|
|
|
function getOutlet(outletMap, route) {
|
|
|
|
|
var outlet = outletMap._outlets[route.outlet];
|
|
|
|
|
if (!outlet) {
|
|
|
|
|
if (route.outlet === shared_1.PRIMARY_OUTLET) {
|
|
|
|
|
throw new Error("Cannot find primary outlet");
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
throw new Error("Cannot find the outlet " + route.outlet);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return outlet;
|
|
|
|
|
}
|
2016-06-03 21:29:15 +00:00
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEscUJBQXNFLGVBQWUsQ0FBQyxDQUFBO0FBR3RGLGtDQUFnQyxxQkFBcUIsQ0FBQyxDQUFBO0FBQ3RELDBCQUEwQixhQUFhLENBQUMsQ0FBQTtBQUN4Qyx3QkFBd0IsV0FBVyxDQUFDLENBQUE7QUFDcEMsb0NBQWtDLHVCQUF1QixDQUFDLENBQUE7QUFFMUQseUJBQTRDLFlBQVksQ0FBQyxDQUFBO0FBQ3pELHVCQUF1QyxVQUFVLENBQUMsQ0FBQTtBQUNsRCw2QkFBaUksZ0JBQWdCLENBQUMsQ0FBQTtBQUdsSixnQ0FBOEIsbUJBQW1CLENBQUMsQ0FBQTtBQUNsRCwyQkFBMkMsb0JBQW9CLENBQUMsQ0FBQTtBQUdoRSx3QkFBd0IsY0FBYyxDQUFDLENBQUE7QUFDdkMsUUFBTyx1QkFBdUIsQ0FBQyxDQUFBO0FBQy9CLFFBQU8sd0JBQXdCLENBQUMsQ0FBQTtBQUNoQyxRQUFPLDRCQUE0QixDQUFDLENBQUE7QUFDcEMsUUFBTywwQkFBMEIsQ0FBQyxDQUFBO0FBQ2xDLFFBQU8sNkJBQTZCLENBQUMsQ0FBQTtBQUNyQyxtQkFBaUIsb0JBQW9CLENBQUMsQ0FBQTtBQUN0Qyx5QkFBdUIsMEJBQTBCLENBQUMsQ0FBQTtBQU9sRDtJQUErQix5QkFBbUIsRUFBUyxFQUFTLEdBQVc7UUFBN0IsT0FBRSxHQUFGLEVBQUUsQ0FBTztRQUFTLFFBQUcsR0FBSCxHQUFHLENBQVE7SUFBRyxDQUFDO0lBQUMsc0JBQUM7QUFBRCxDQUFDLEFBQXJGLElBQXFGO0FBQXhFLHVCQUFlLGtCQUF5RCxDQUFBO0FBS3JGO0lBQTZCLHVCQUFtQixFQUFTLEVBQVMsR0FBVztRQUE3QixPQUFFLEdBQUYsRUFBRSxDQUFPO1FBQVMsUUFBRyxHQUFILEdBQUcsQ0FBUTtJQUFHLENBQUM7SUFBQyxvQkFBQztBQUFELENBQUMsQUFBbkYsSUFB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
|