single-spa-angular
Advanced tools
Comparing version 4.0.1 to 4.1.0-alpha.0
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common')) : | ||
typeof define === 'function' && define.amd ? define('single-spa-angular', ['exports', '@angular/core', '@angular/common'], factory) : | ||
(global = global || self, factory(global['single-spa-angular'] = {}, global.ng.core, global.ng.common)); | ||
}(this, (function (exports, core, common) { 'use strict'; | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('single-spa-angular/internals'), require('@angular/core'), require('@angular/common')) : | ||
typeof define === 'function' && define.amd ? define('single-spa-angular', ['exports', 'single-spa-angular/internals', '@angular/core', '@angular/common'], factory) : | ||
(global = global || self, factory(global['single-spa-angular'] = {}, global['single-spa-angular'].internals, global.ng.core, global.ng.common)); | ||
}(this, (function (exports, internals, core, common) { 'use strict'; | ||
@@ -224,15 +224,67 @@ /*! ***************************************************************************** | ||
function SingleSpaPlatformLocation() { | ||
return _super !== null && _super.apply(this, arguments) || this; | ||
var _this = _super !== null && _super.apply(this, arguments) || this; | ||
// This is a simple marker that helps us to ignore PopStateEvents | ||
// that was not dispatched by the browser. | ||
_this.skipNextPopState = false; | ||
_this.onPopStateListeners = []; | ||
return _this; | ||
} | ||
SingleSpaPlatformLocation.prototype.destroy = function () { | ||
// TLDR: Angular adds `popstate` event listener and then doesn't remove it when application gets destroyed. | ||
// Basically, Angular has a potentional memory leak. The `ɵBrowserPlatformLocation` | ||
// has `onPopState` method which adds `popstate` event listener and forgets, see here: | ||
// https://github.com/angular/angular/blob/14be55c9facf3e47b8c97df4502dc3f0f897da03/packages/common/src/location/platform_location.ts#L126 | ||
var e_1, _a; | ||
try { | ||
for (var _b = __values(this.onPopStateListeners), _c = _b.next(); !_c.done; _c = _b.next()) { | ||
var onPopStateListener = _c.value; | ||
window.removeEventListener('popstate', onPopStateListener); | ||
} | ||
} | ||
catch (e_1_1) { e_1 = { error: e_1_1 }; } | ||
finally { | ||
try { | ||
if (_c && !_c.done && (_a = _b.return)) _a.call(_b); | ||
} | ||
finally { if (e_1) throw e_1.error; } | ||
} | ||
// We do this because the `SingleSpaPlatformLocation` is a part of PLATFORM_INJECTOR, | ||
// which means it's created only once and will not be garbage collected, since the PLATFORM_INJECTOR | ||
// will keep reference to its instance. | ||
// TODO: https://github.com/single-spa/single-spa-angular/issues/170 | ||
this.onPopStateListeners = []; | ||
}; | ||
SingleSpaPlatformLocation.prototype.pushState = function (state, title, url) { | ||
this.skipNextPopState = true; | ||
_super.prototype.pushState.call(this, state, title, url); | ||
}; | ||
SingleSpaPlatformLocation.prototype.replaceState = function (state, title, url) { | ||
this.skipNextPopState = true; | ||
_super.prototype.replaceState.call(this, state, title, url); | ||
}; | ||
SingleSpaPlatformLocation.prototype.onPopState = function (fn) { | ||
var _this = this; | ||
_super.prototype.onPopState.call(this, function (event) { | ||
// Wrap any event listener into zone that is specific to some application. | ||
// The main issue is `back/forward` buttons of browsers, because they invoke | ||
// `history.back|forward` which dispatch `popstate` event. Since `single-spa` | ||
// overrides `history.replaceState` Angular's zone cannot intercept this event. | ||
// Only the root zone is able to intercept all events. | ||
// See https://github.com/single-spa/single-spa-angular/issues/94 for more detail | ||
_this.ngZone.run(function () { return fn(event); }); | ||
}); | ||
var onPopStateListener = function (event) { | ||
// The `LocationChangeEvent` doesn't have the `singleSpa` property, since it's added | ||
// by `single-spa` starting from `5.4` version. We need this check because we want | ||
// to skip "unnatural" PopStateEvents, the one caused by `single-spa`. | ||
var popStateEventWasDispatchedBySingleSpa = !!event | ||
.singleSpa; | ||
if (_this.skipNextPopState && popStateEventWasDispatchedBySingleSpa) { | ||
_this.skipNextPopState = false; | ||
} | ||
else { | ||
// Wrap any event listener into zone that is specific to some application. | ||
// The main issue is `back/forward` buttons of browsers, because they invoke | ||
// `history.back|forward` which dispatch `popstate` event. Since `single-spa` | ||
// overrides `history.replaceState` Angular's zone cannot intercept this event. | ||
// Only the root zone is able to intercept all events. | ||
// See https://github.com/single-spa/single-spa-angular/issues/94 for more details | ||
_this.ngZone.run(function () { return fn(event); }); | ||
} | ||
}; | ||
// All listeners should be stored inside an array because the `onPopState` can be called | ||
// multiple times thus we wanna reference all listeners to remove them further. | ||
this.onPopStateListeners.push(onPopStateListener); | ||
_super.prototype.onPopState.call(this, onPopStateListener); | ||
}; | ||
@@ -301,2 +353,8 @@ SingleSpaPlatformLocation.prototype.setNgZone = function (ngZone) { | ||
return __generator(this, function (_a) { | ||
// Angular provides an opportunity to develop `zone-less` application, where developers | ||
// have to trigger change detection manually. | ||
// See https://angular.io/guide/zone#noopzone | ||
if (opts.NgZone === 'noop') { | ||
return [2 /*return*/]; | ||
} | ||
// In order for multiple Angular apps to work concurrently on a page, they each need a unique identifier. | ||
@@ -326,11 +384,11 @@ opts.zoneIdentifier = "single-spa-angular:" + (props.name || props.appName); | ||
return __awaiter(this, void 0, void 0, function () { | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, bootstrappedOpts, ngZone; | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, ngZoneEnabled, bootstrappedOpts, ngZone; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
domElementGetter = chooseDomElementGetter(opts, props); | ||
domElementGetter = internals.chooseDomElementGetter(opts, props); | ||
if (!domElementGetter) { | ||
throw Error("cannot mount angular application '" + (props.name || props.appName) + "' without a domElementGetter provided either as an opt or a prop"); | ||
} | ||
containerEl = getContainerEl(domElementGetter); | ||
containerEl = internals.getContainerEl(domElementGetter); | ||
containerEl.innerHTML = opts.template; | ||
@@ -348,13 +406,25 @@ bootstrapPromise = opts.bootstrapFunction(props); | ||
singleSpaPlatformLocation = module.injector.get(SingleSpaPlatformLocation, null); | ||
ngZoneEnabled = opts.NgZone !== 'noop'; | ||
// The user has to provide `BrowserPlatformLocation` only if his application uses routing. | ||
// So if he provided `Router` but didn't provide `BrowserPlatformLocation` then we have to inform him. | ||
if (opts.Router && singleSpaPlatformLocation === null) { | ||
// Also `getSingleSpaExtraProviders()` function should be called only if the user doesn't use | ||
// `zone-less` change detection, if `NgZone` is `noop` then we can skip it. | ||
if (ngZoneEnabled && opts.Router && singleSpaPlatformLocation === null) { | ||
throw new Error("\t\n single-spa-angular: could not retrieve extra providers from the platform injector. Did you call getSingleSpaExtraProviders() when creating platform?\t\n "); | ||
} | ||
bootstrappedOpts = opts; | ||
ngZone = module.injector.get(opts.NgZone); | ||
singleSpaPlatformLocation.setNgZone(ngZone); | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
if (ngZoneEnabled) { | ||
ngZone = module.injector.get(opts.NgZone); | ||
// `NgZone` can be enabled but routing may not be used thus `getSingleSpaExtraProviders()` | ||
// function was not called. | ||
if (singleSpaPlatformLocation !== null) { | ||
singleSpaPlatformLocation.setNgZone(ngZone); | ||
// Cleanup resources, especially remove event listeners thus they will not be added | ||
// twice when application gets bootstrapped the second time. | ||
module.onDestroy(function () { return singleSpaPlatformLocation.destroy(); }); | ||
} | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
} | ||
bootstrappedOpts.bootstrappedModule = module; | ||
@@ -375,3 +445,5 @@ return [2 /*return*/, module]; | ||
} | ||
window.removeEventListener('single-spa:routing-event', opts.routingEventListener); | ||
if (opts.routingEventListener) { | ||
window.removeEventListener('single-spa:routing-event', opts.routingEventListener); | ||
} | ||
if (opts.AnimationEngine) { | ||
@@ -383,7 +455,5 @@ animationEngine = opts.bootstrappedModule.injector.get(opts.AnimationEngine); | ||
delete opts.bootstrappedModule; | ||
if (ivyEnabled()) { | ||
// This is an issue. Issue has been created and Angular team is working on the fix: | ||
// https://github.com/angular/angular/issues/36449 | ||
removeApplicationFromDOMIfIvyEnabled(opts, props); | ||
} | ||
// This is an issue. Issue has been created and Angular team is working on the fix: | ||
// https://github.com/angular/angular/issues/36449 | ||
internals.removeApplicationFromDOMIfIvyEnabled(opts, props); | ||
return [2 /*return*/]; | ||
@@ -393,59 +463,2 @@ }); | ||
} | ||
function ivyEnabled() { | ||
try { | ||
// `ɵivyEnabled` variable is exposed starting from version 8. | ||
// We use `require` here except of a single `import { ɵivyEnabled }` because the | ||
// developer can use Angular version that doesn't expose it (all versions <8). | ||
// The `catch` statement will handle those cases. | ||
// eslint-disable-next-line | ||
var ɵivyEnabled = require('@angular/core').ɵivyEnabled; | ||
return !!ɵivyEnabled; | ||
} | ||
catch (_a) { | ||
return false; | ||
} | ||
} | ||
function removeApplicationFromDOMIfIvyEnabled(opts, props) { | ||
var domElementGetter = chooseDomElementGetter(opts, props); | ||
var domElement = getContainerEl(domElementGetter); | ||
// View Engine removes all nodes automatically when calling `NgModuleRef.destroy()`, | ||
// which calls `ComponentRef.destroy()`. | ||
// Basically this will remove `app-root` or any other selector from the container element. | ||
while (domElement.firstChild) | ||
domElement.removeChild(domElement.firstChild); | ||
} | ||
function getContainerEl(domElementGetter) { | ||
var element = domElementGetter(); | ||
if (!element) { | ||
throw Error('domElementGetter did not return a valid dom element'); | ||
} | ||
return element; | ||
} | ||
function chooseDomElementGetter(opts, props) { | ||
props = props && props.customProps ? props.customProps : props; | ||
if (props.domElement) { | ||
return function () { return props.domElement; }; | ||
} | ||
else if (props.domElementGetter) { | ||
return props.domElementGetter; | ||
} | ||
else if (opts.domElementGetter) { | ||
return opts.domElementGetter; | ||
} | ||
else { | ||
return defaultDomElementGetter(props.name); | ||
} | ||
} | ||
function defaultDomElementGetter(name) { | ||
return function getDefaultDomElement() { | ||
var id = "single-spa-application:" + name; | ||
var domElement = document.getElementById(id); | ||
if (!domElement) { | ||
domElement = document.createElement('div'); | ||
domElement.id = id; | ||
document.body.appendChild(domElement); | ||
} | ||
return domElement; | ||
}; | ||
} | ||
@@ -452,0 +465,0 @@ var ParcelComponent = /** @class */ (function () { |
@@ -1,2 +0,2 @@ | ||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@angular/core"),require("@angular/common")):"function"==typeof define&&define.amd?define("single-spa-angular",["exports","@angular/core","@angular/common"],e):e((t=t||self)["single-spa-angular"]={},t.ng.core,t.ng.common)}(this,(function(t,e,n){"use strict"; | ||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("single-spa-angular/internals"),require("@angular/core"),require("@angular/common")):"function"==typeof define&&define.amd?define("single-spa-angular",["exports","single-spa-angular/internals","@angular/core","@angular/common"],e):e((t=t||self)["single-spa-angular"]={},t["single-spa-angular"].internals,t.ng.core,t.ng.common)}(this,(function(t,e,n,o){"use strict"; | ||
/*! ***************************************************************************** | ||
@@ -15,3 +15,3 @@ Copyright (c) Microsoft Corporation. All rights reserved. | ||
and limitations under the License. | ||
***************************************************************************** */var o=function(t,e){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};var r=function(){return(r=Object.assign||function(t){for(var e,n=1,o=arguments.length;n<o;n++)for(var r in e=arguments[n])Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}).apply(this,arguments)};function i(t,e,n,o){var r,i=arguments.length,a=i<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,n):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,n,o);else for(var u=t.length-1;u>=0;u--)(r=t[u])&&(a=(i<3?r(a):i>3?r(e,n,a):r(e,n))||a);return i>3&&a&&Object.defineProperty(e,n,a),a}function a(t,e,n,o){return new(n||(n=Promise))((function(r,i){function a(t){try{l(o.next(t))}catch(t){i(t)}}function u(t){try{l(o.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,u)}l((o=o.apply(t,e||[])).next())}))}function u(t,e){var n,o,r,i,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,o&&(r=2&i[0]?o.return:i[0]?o.throw||((r=o.return)&&r.call(o),0):o.next)&&!(r=r.call(o,i[1])).done)return r;switch(o=0,r&&(i=[2&i[0],r.value]),i[0]){case 0:case 1:r=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,o=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(r=a.trys,(r=r.length>0&&r[r.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]<r[3])){a.label=i[1];break}if(6===i[0]&&a.label<r[1]){a.label=r[1],r=i;break}if(r&&a.label<r[2]){a.label=r[2],a.ops.push(i);break}r[2]&&a.ops.pop(),a.trys.pop();continue}i=e.call(t,a)}catch(t){i=[6,t],o=0}finally{n=r=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,u])}}}function l(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var o,r,i=n.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){r={error:t}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return a}function s(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(l(arguments[e]));return t}var p=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return function(t,e){function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}(n,t),n.prototype.onPopState=function(e){var n=this;t.prototype.onPopState.call(this,(function(t){n.ngZone.run((function(){return e(t)}))}))},n.prototype.setNgZone=function(t){this.ngZone=t},n=i([e.Injectable()],n)}(n["ɵBrowserPlatformLocation"]);var c={NgZone:null,bootstrapFunction:null,template:null,Router:void 0,domElementGetter:void 0,AnimationEngine:void 0,updateFunction:function(){return Promise.resolve()}};function d(t,e){return a(this,void 0,void 0,(function(){return u(this,(function(n){return t.zoneIdentifier="single-spa-angular:"+(e.name||e.appName),t.NgZone.isInAngularZone=function(){return!0===window.Zone.current._properties[t.zoneIdentifier]},t.routingEventListener=function(){t.bootstrappedNgZone.run((function(){}))},[2]}))}))}function f(t,e){return a(this,void 0,void 0,(function(){var n,o,r,i,a,l;return u(this,(function(u){switch(u.label){case 0:if(!(n=g(t,e)))throw Error("cannot mount angular application '"+(e.name||e.appName)+"' without a domElementGetter provided either as an opt or a prop");if(h(n).innerHTML=t.template,!((o=t.bootstrapFunction(e))instanceof Promise))throw Error("single-spa-angular: the opts.bootstrapFunction must return a promise, but instead returned a '"+typeof o+"' that is not a Promise");return[4,o];case 1:if(!(r=u.sent())||"function"!=typeof r.destroy)throw Error("single-spa-angular: the opts.bootstrapFunction returned a promise that did not resolve with a valid Angular module. Did you call platformBrowser().bootstrapModuleFactory() correctly?");if(i=r.injector.get(p,null),t.Router&&null===i)throw new Error("\t\n single-spa-angular: could not retrieve extra providers from the platform injector. Did you call getSingleSpaExtraProviders() when creating platform?\t\n ");return a=t,l=r.injector.get(t.NgZone),i.setNgZone(l),a.bootstrappedNgZone=l,a.bootstrappedNgZone._inner._properties[a.zoneIdentifier]=!0,window.addEventListener("single-spa:routing-event",a.routingEventListener),a.bootstrappedModule=r,[2,r]}}))}))}function m(t,e){return a(this,void 0,void 0,(function(){return u(this,(function(n){return t.Router&&t.bootstrappedModule.injector.get(t.Router).dispose(),window.removeEventListener("single-spa:routing-event",t.routingEventListener),t.AnimationEngine&&t.bootstrappedModule.injector.get(t.AnimationEngine)._transitionEngine.flush(),t.bootstrappedModule.destroy(),delete t.bootstrappedModule,function(){try{return!!require("@angular/core").ɵivyEnabled}catch(t){return!1}}()&&function(t,e){var n=h(g(t,e));for(;n.firstChild;)n.removeChild(n.firstChild)}(t,e),[2]}))}))}function h(t){var e=t();if(!e)throw Error("domElementGetter did not return a valid dom element");return e}function g(t,e){return(e=e&&e.customProps?e.customProps:e).domElement?function(){return e.domElement}:e.domElementGetter?e.domElementGetter:t.domElementGetter?t.domElementGetter:(n=e.name,function(){var t="single-spa-application:"+n,e=document.getElementById(t);return e||((e=document.createElement("div")).id=t,document.body.appendChild(e)),e});var n}var v=function(){function t(t){this.host=t,this.onParcelMount=null,this.wrapWith="div",this.customProps={},this.appendTo=null,this.handleError=function(t){return console.error(t)},this.createdDomElement=null,this.hasError=!1,this.unmounted=!0}return t.prototype.ngOnInit=function(){var t=this;if(!this.config)throw new Error("single-spa-angular's Parcel component requires the [config] binding to either be a parcel config or a loading function that returns a promise. See https://github.com/CanopyTax/single-spa-angular");this.addThingToDo("mount",(function(){var e,n=t.mountParcel;if(!n)throw new Error("\n\t\t\t\t <parcel> was not passed a [mountParcel] binding.\n\t\t\t\t If you are using <parcel> within a module that is not a single-spa application, you will need to import mountRootParcel from single-spa and pass it into <parcel> as a [mountParcel] binding\n\t\t\t\t");t.appendTo?(t.createdDomElement=e=document.createElement(t.wrapWith),t.appendTo.appendChild(e)):(t.createdDomElement=e=document.createElement(t.wrapWith),t.host.nativeElement.children[0].appendChild(e));return t.parcel=n(t.config,r({domElement:e},t.customProps)),t.onParcelMount&&t.parcel.mountPromise.then(t.onParcelMount),t.unmounted=!1,t.parcel.mountPromise}))},t.prototype.ngOnChanges=function(){var t=this;this.addThingToDo("update",(function(){if(t.parcel&&t.parcel.update)return t.parcel.update(t.customProps)}))},t.prototype.ngOnDestroy=function(){var t=this;this.addThingToDo("unmount",(function(){if(t.parcel&&"MOUNTED"===t.parcel.getStatus())return t.parcel.unmount()})),this.createdDomElement&&this.createdDomElement.parentNode.removeChild(this.createdDomElement),this.unmounted=!0},t.prototype.addThingToDo=function(t,e){var n=this;this.hasError&&"unmount"!==t||(this.nextThingToDo=(this.nextThingToDo||Promise.resolve()).then((function(){for(var o=[],r=0;r<arguments.length;r++)o[r]=arguments[r];if(!n.unmounted||"unmount"===t)return e.apply(void 0,s(o))})).catch((function(e){throw n.nextThingToDo=Promise.resolve(),n.hasError=!0,e&&e.message&&(e.message="During '"+t+"', parcel threw an error: "+e.message),"function"==typeof n.handleError?n.handleError(e):setTimeout((function(){throw e})),e})))},t.ctorParameters=function(){return[{type:e.ElementRef}]},i([e.Input()],t.prototype,"config",void 0),i([e.Input()],t.prototype,"mountParcel",void 0),i([e.Input()],t.prototype,"onParcelMount",void 0),i([e.Input()],t.prototype,"wrapWith",void 0),i([e.Input()],t.prototype,"customProps",void 0),i([e.Input()],t.prototype,"appendTo",void 0),i([e.Input()],t.prototype,"handleError",void 0),t=i([e.Component({selector:"parcel",template:"<div></div>"})],t)}(),y=function(){function t(){}return t=i([e.NgModule({declarations:[v],exports:[v],entryComponents:[v]})],t)}();t.ParcelComponent=v,t.ParcelModule=y,t.getSingleSpaExtraProviders=function(){return[{provide:p,useClass:p,deps:[[new e.Inject(n.DOCUMENT)]]},{provide:n.PlatformLocation,useExisting:p}]},t.singleSpaAngular=function(t){if("object"!=typeof t)throw Error("single-spa-angular requires a configuration object");var e=r(r({},c),t);if("function"!=typeof e.bootstrapFunction)throw Error("single-spa-angular must be passed an opts.bootstrapFunction");if("string"!=typeof e.template)throw Error("single-spa-angular must be passed opts.template string");if(!e.NgZone)throw Error("single-spa-angular must be passed the NgZone opt");return{bootstrap:d.bind(null,e),mount:f.bind(null,e),unmount:m.bind(null,e),update:e.updateFunction}},t.ɵa=p,Object.defineProperty(t,"__esModule",{value:!0})})); | ||
***************************************************************************** */var r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};var i=function(){return(i=Object.assign||function(t){for(var e,n=1,o=arguments.length;n<o;n++)for(var r in e=arguments[n])Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}).apply(this,arguments)};function a(t,e,n,o){var r,i=arguments.length,a=i<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,n):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,n,o);else for(var u=t.length-1;u>=0;u--)(r=t[u])&&(a=(i<3?r(a):i>3?r(e,n,a):r(e,n))||a);return i>3&&a&&Object.defineProperty(e,n,a),a}function u(t,e,n,o){return new(n||(n=Promise))((function(r,i){function a(t){try{s(o.next(t))}catch(t){i(t)}}function u(t){try{s(o.throw(t))}catch(t){i(t)}}function s(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,u)}s((o=o.apply(t,e||[])).next())}))}function s(t,e){var n,o,r,i,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,o&&(r=2&i[0]?o.return:i[0]?o.throw||((r=o.return)&&r.call(o),0):o.next)&&!(r=r.call(o,i[1])).done)return r;switch(o=0,r&&(i=[2&i[0],r.value]),i[0]){case 0:case 1:r=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,o=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(r=a.trys,(r=r.length>0&&r[r.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]<r[3])){a.label=i[1];break}if(6===i[0]&&a.label<r[1]){a.label=r[1],r=i;break}if(r&&a.label<r[2]){a.label=r[2],a.ops.push(i);break}r[2]&&a.ops.pop(),a.trys.pop();continue}i=e.call(t,a)}catch(t){i=[6,t],o=0}finally{n=r=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,u])}}}function p(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],o=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function l(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var o,r,i=n.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){r={error:t}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return a}function c(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(l(arguments[e]));return t}var f=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.skipNextPopState=!1,e.onPopStateListeners=[],e}return function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}(e,t),e.prototype.destroy=function(){var t,e;try{for(var n=p(this.onPopStateListeners),o=n.next();!o.done;o=n.next()){var r=o.value;window.removeEventListener("popstate",r)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}this.onPopStateListeners=[]},e.prototype.pushState=function(e,n,o){this.skipNextPopState=!0,t.prototype.pushState.call(this,e,n,o)},e.prototype.replaceState=function(e,n,o){this.skipNextPopState=!0,t.prototype.replaceState.call(this,e,n,o)},e.prototype.onPopState=function(e){var n=this,o=function(t){var o=!!t.singleSpa;n.skipNextPopState&&o?n.skipNextPopState=!1:n.ngZone.run((function(){return e(t)}))};this.onPopStateListeners.push(o),t.prototype.onPopState.call(this,o)},e.prototype.setNgZone=function(t){this.ngZone=t},e=a([n.Injectable()],e)}(o["ɵBrowserPlatformLocation"]);var d={NgZone:null,bootstrapFunction:null,template:null,Router:void 0,domElementGetter:void 0,AnimationEngine:void 0,updateFunction:function(){return Promise.resolve()}};function h(t,e){return u(this,void 0,void 0,(function(){return s(this,(function(n){return"noop"===t.NgZone||(t.zoneIdentifier="single-spa-angular:"+(e.name||e.appName),t.NgZone.isInAngularZone=function(){return!0===window.Zone.current._properties[t.zoneIdentifier]},t.routingEventListener=function(){t.bootstrappedNgZone.run((function(){}))}),[2]}))}))}function g(t,n){return u(this,void 0,void 0,(function(){var o,r,i,a,u,p,l;return s(this,(function(s){switch(s.label){case 0:if(!(o=e.chooseDomElementGetter(t,n)))throw Error("cannot mount angular application '"+(n.name||n.appName)+"' without a domElementGetter provided either as an opt or a prop");if(e.getContainerEl(o).innerHTML=t.template,!((r=t.bootstrapFunction(n))instanceof Promise))throw Error("single-spa-angular: the opts.bootstrapFunction must return a promise, but instead returned a '"+typeof r+"' that is not a Promise");return[4,r];case 1:if(!(i=s.sent())||"function"!=typeof i.destroy)throw Error("single-spa-angular: the opts.bootstrapFunction returned a promise that did not resolve with a valid Angular module. Did you call platformBrowser().bootstrapModuleFactory() correctly?");if(a=i.injector.get(f,null),(u="noop"!==t.NgZone)&&t.Router&&null===a)throw new Error("\t\n single-spa-angular: could not retrieve extra providers from the platform injector. Did you call getSingleSpaExtraProviders() when creating platform?\t\n ");return p=t,u&&(l=i.injector.get(t.NgZone),null!==a&&(a.setNgZone(l),i.onDestroy((function(){return a.destroy()}))),p.bootstrappedNgZone=l,p.bootstrappedNgZone._inner._properties[p.zoneIdentifier]=!0,window.addEventListener("single-spa:routing-event",p.routingEventListener)),p.bootstrappedModule=i,[2,i]}}))}))}function m(t,n){return u(this,void 0,void 0,(function(){return s(this,(function(o){return t.Router&&t.bootstrappedModule.injector.get(t.Router).dispose(),t.routingEventListener&&window.removeEventListener("single-spa:routing-event",t.routingEventListener),t.AnimationEngine&&t.bootstrappedModule.injector.get(t.AnimationEngine)._transitionEngine.flush(),t.bootstrappedModule.destroy(),delete t.bootstrappedModule,e.removeApplicationFromDOMIfIvyEnabled(t,n),[2]}))}))}var y=function(){function t(t){this.host=t,this.onParcelMount=null,this.wrapWith="div",this.customProps={},this.appendTo=null,this.handleError=function(t){return console.error(t)},this.createdDomElement=null,this.hasError=!1,this.unmounted=!0}return t.prototype.ngOnInit=function(){var t=this;if(!this.config)throw new Error("single-spa-angular's Parcel component requires the [config] binding to either be a parcel config or a loading function that returns a promise. See https://github.com/CanopyTax/single-spa-angular");this.addThingToDo("mount",(function(){var e,n=t.mountParcel;if(!n)throw new Error("\n\t\t\t\t <parcel> was not passed a [mountParcel] binding.\n\t\t\t\t If you are using <parcel> within a module that is not a single-spa application, you will need to import mountRootParcel from single-spa and pass it into <parcel> as a [mountParcel] binding\n\t\t\t\t");t.appendTo?(t.createdDomElement=e=document.createElement(t.wrapWith),t.appendTo.appendChild(e)):(t.createdDomElement=e=document.createElement(t.wrapWith),t.host.nativeElement.children[0].appendChild(e));return t.parcel=n(t.config,i({domElement:e},t.customProps)),t.onParcelMount&&t.parcel.mountPromise.then(t.onParcelMount),t.unmounted=!1,t.parcel.mountPromise}))},t.prototype.ngOnChanges=function(){var t=this;this.addThingToDo("update",(function(){if(t.parcel&&t.parcel.update)return t.parcel.update(t.customProps)}))},t.prototype.ngOnDestroy=function(){var t=this;this.addThingToDo("unmount",(function(){if(t.parcel&&"MOUNTED"===t.parcel.getStatus())return t.parcel.unmount()})),this.createdDomElement&&this.createdDomElement.parentNode.removeChild(this.createdDomElement),this.unmounted=!0},t.prototype.addThingToDo=function(t,e){var n=this;this.hasError&&"unmount"!==t||(this.nextThingToDo=(this.nextThingToDo||Promise.resolve()).then((function(){for(var o=[],r=0;r<arguments.length;r++)o[r]=arguments[r];if(!n.unmounted||"unmount"===t)return e.apply(void 0,c(o))})).catch((function(e){throw n.nextThingToDo=Promise.resolve(),n.hasError=!0,e&&e.message&&(e.message="During '"+t+"', parcel threw an error: "+e.message),"function"==typeof n.handleError?n.handleError(e):setTimeout((function(){throw e})),e})))},t.ctorParameters=function(){return[{type:n.ElementRef}]},a([n.Input()],t.prototype,"config",void 0),a([n.Input()],t.prototype,"mountParcel",void 0),a([n.Input()],t.prototype,"onParcelMount",void 0),a([n.Input()],t.prototype,"wrapWith",void 0),a([n.Input()],t.prototype,"customProps",void 0),a([n.Input()],t.prototype,"appendTo",void 0),a([n.Input()],t.prototype,"handleError",void 0),t=a([n.Component({selector:"parcel",template:"<div></div>"})],t)}(),v=function(){function t(){}return t=a([n.NgModule({declarations:[y],exports:[y],entryComponents:[y]})],t)}();t.ParcelComponent=y,t.ParcelModule=v,t.getSingleSpaExtraProviders=function(){return[{provide:f,useClass:f,deps:[[new n.Inject(o.DOCUMENT)]]},{provide:o.PlatformLocation,useExisting:f}]},t.singleSpaAngular=function(t){if("object"!=typeof t)throw Error("single-spa-angular requires a configuration object");var e=i(i({},d),t);if("function"!=typeof e.bootstrapFunction)throw Error("single-spa-angular must be passed an opts.bootstrapFunction");if("string"!=typeof e.template)throw Error("single-spa-angular must be passed opts.template string");if(!e.NgZone)throw Error("single-spa-angular must be passed the NgZone opt");return{bootstrap:h.bind(null,e),mount:g.bind(null,e),unmount:m.bind(null,e),update:e.updateFunction}},t.ɵa=f,Object.defineProperty(t,"__esModule",{value:!0})})); | ||
//# sourceMappingURL=single-spa-angular.umd.min.js.map |
@@ -5,12 +5,55 @@ import { __decorate } from "tslib"; | ||
let SingleSpaPlatformLocation = class SingleSpaPlatformLocation extends ɵBrowserPlatformLocation { | ||
constructor() { | ||
super(...arguments); | ||
// This is a simple marker that helps us to ignore PopStateEvents | ||
// that was not dispatched by the browser. | ||
this.skipNextPopState = false; | ||
this.onPopStateListeners = []; | ||
} | ||
destroy() { | ||
// TLDR: Angular adds `popstate` event listener and then doesn't remove it when application gets destroyed. | ||
// Basically, Angular has a potentional memory leak. The `ɵBrowserPlatformLocation` | ||
// has `onPopState` method which adds `popstate` event listener and forgets, see here: | ||
// https://github.com/angular/angular/blob/14be55c9facf3e47b8c97df4502dc3f0f897da03/packages/common/src/location/platform_location.ts#L126 | ||
for (const onPopStateListener of this.onPopStateListeners) { | ||
window.removeEventListener('popstate', onPopStateListener); | ||
} | ||
// We do this because the `SingleSpaPlatformLocation` is a part of PLATFORM_INJECTOR, | ||
// which means it's created only once and will not be garbage collected, since the PLATFORM_INJECTOR | ||
// will keep reference to its instance. | ||
// TODO: https://github.com/single-spa/single-spa-angular/issues/170 | ||
this.onPopStateListeners = []; | ||
} | ||
pushState(state, title, url) { | ||
this.skipNextPopState = true; | ||
super.pushState(state, title, url); | ||
} | ||
replaceState(state, title, url) { | ||
this.skipNextPopState = true; | ||
super.replaceState(state, title, url); | ||
} | ||
onPopState(fn) { | ||
super.onPopState(event => { | ||
// Wrap any event listener into zone that is specific to some application. | ||
// The main issue is `back/forward` buttons of browsers, because they invoke | ||
// `history.back|forward` which dispatch `popstate` event. Since `single-spa` | ||
// overrides `history.replaceState` Angular's zone cannot intercept this event. | ||
// Only the root zone is able to intercept all events. | ||
// See https://github.com/single-spa/single-spa-angular/issues/94 for more detail | ||
this.ngZone.run(() => fn(event)); | ||
}); | ||
const onPopStateListener = (event) => { | ||
// The `LocationChangeEvent` doesn't have the `singleSpa` property, since it's added | ||
// by `single-spa` starting from `5.4` version. We need this check because we want | ||
// to skip "unnatural" PopStateEvents, the one caused by `single-spa`. | ||
const popStateEventWasDispatchedBySingleSpa = !!event | ||
.singleSpa; | ||
if (this.skipNextPopState && popStateEventWasDispatchedBySingleSpa) { | ||
this.skipNextPopState = false; | ||
} | ||
else { | ||
// Wrap any event listener into zone that is specific to some application. | ||
// The main issue is `back/forward` buttons of browsers, because they invoke | ||
// `history.back|forward` which dispatch `popstate` event. Since `single-spa` | ||
// overrides `history.replaceState` Angular's zone cannot intercept this event. | ||
// Only the root zone is able to intercept all events. | ||
// See https://github.com/single-spa/single-spa-angular/issues/94 for more details | ||
this.ngZone.run(() => fn(event)); | ||
} | ||
}; | ||
// All listeners should be stored inside an array because the `onPopState` can be called | ||
// multiple times thus we wanna reference all listeners to remove them further. | ||
this.onPopStateListeners.push(onPopStateListener); | ||
super.onPopState(onPopStateListener); | ||
} | ||
@@ -43,2 +86,2 @@ setNgZone(ngZone) { | ||
} | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmEtcHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vc2luZ2xlLXNwYS1hbmd1bGFyLyIsInNvdXJjZXMiOlsic3JjL2V4dHJhLXByb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBMEIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBRWhCLFFBQVEsR0FDVCxNQUFNLGlCQUFpQixDQUFDO0FBR3pCLElBQWEseUJBQXlCLEdBQXRDLE1BQWEseUJBQTBCLFNBQVEsd0JBQXdCO0lBUXJFLFVBQVUsQ0FBQyxFQUF3QztRQUNqRCxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3ZCLDBFQUEwRTtZQUMxRSw0RUFBNEU7WUFDNUUsNkVBQTZFO1lBQzdFLCtFQUErRTtZQUMvRSxzREFBc0Q7WUFDdEQsaUZBQWlGO1lBQ2pGLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRixDQUFBO0FBdkJZLHlCQUF5QjtJQURyQyxVQUFVLEVBQUU7R0FDQSx5QkFBeUIsQ0F1QnJDO1NBdkJZLHlCQUF5QjtBQXlCdEM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsT0FBTztRQUNMO1lBQ0UsT0FBTyxFQUFFLHlCQUF5QjtZQUNsQyxRQUFRLEVBQUUseUJBQXlCO1lBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUMvQjtRQUNEO1lBQ0UsT0FBTyxFQUFFLGdCQUFnQjtZQUN6QixXQUFXLEVBQUUseUJBQXlCO1NBQ3ZDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUsIFN0YXRpY1Byb3ZpZGVyLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIMm1QnJvd3NlclBsYXRmb3JtTG9jYXRpb24sXG4gIFBsYXRmb3JtTG9jYXRpb24sXG4gIExvY2F0aW9uQ2hhbmdlRXZlbnQsXG4gIERPQ1VNRU5ULFxufSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbiBleHRlbmRzIMm1QnJvd3NlclBsYXRmb3JtTG9jYXRpb24ge1xuICAvKipcbiAgICogV2UgY291bGQgdXNlIHRoZSBgaW5qZWN0YCBmdW5jdGlvbiBmcm9tIGBAYW5ndWxhci9jb3JlYCB3aGljaCByZXNvbHZlc1xuICAgKiBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbmplY3RvciwgYnV0IGl0J3MgYSBmZWF0dXJlXG4gICAqIG9mIEFuZ3VsYXIgOCsuIFNob3VsZCBiZSB1c2VkIHdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBvbGRlciB2ZXJzaW9ucy5cbiAgICovXG4gIHByaXZhdGUgbmdab25lITogTmdab25lO1xuXG4gIG9uUG9wU3RhdGUoZm46IChldmVudDogTG9jYXRpb25DaGFuZ2VFdmVudCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHN1cGVyLm9uUG9wU3RhdGUoZXZlbnQgPT4ge1xuICAgICAgLy8gV3JhcCBhbnkgZXZlbnQgbGlzdGVuZXIgaW50byB6b25lIHRoYXQgaXMgc3BlY2lmaWMgdG8gc29tZSBhcHBsaWNhdGlvbi5cbiAgICAgIC8vIFRoZSBtYWluIGlzc3VlIGlzIGBiYWNrL2ZvcndhcmRgIGJ1dHRvbnMgb2YgYnJvd3NlcnMsIGJlY2F1c2UgdGhleSBpbnZva2VcbiAgICAgIC8vIGBoaXN0b3J5LmJhY2t8Zm9yd2FyZGAgd2hpY2ggZGlzcGF0Y2ggYHBvcHN0YXRlYCBldmVudC4gU2luY2UgYHNpbmdsZS1zcGFgXG4gICAgICAvLyBvdmVycmlkZXMgYGhpc3RvcnkucmVwbGFjZVN0YXRlYCBBbmd1bGFyJ3Mgem9uZSBjYW5ub3QgaW50ZXJjZXB0IHRoaXMgZXZlbnQuXG4gICAgICAvLyBPbmx5IHRoZSByb290IHpvbmUgaXMgYWJsZSB0byBpbnRlcmNlcHQgYWxsIGV2ZW50cy5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZ2xlLXNwYS9zaW5nbGUtc3BhLWFuZ3VsYXIvaXNzdWVzLzk0IGZvciBtb3JlIGRldGFpbFxuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IGZuKGV2ZW50KSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXROZ1pvbmUobmdab25lOiBOZ1pvbmUpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZSA9IG5nWm9uZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBgUGxhdGZvcm1Mb2NhdGlvbmAgY2xhc3MgaXMgYW4gXCJpbmplY3RlZVwiIG9mIHRoZSBgUGF0aExvY2F0aW9uU3RyYXRlZ3lgLFxuICogd2hpY2ggY3JlYXRlcyBgU3ViamVjdGAgaW50ZXJuYWxseSBmb3IgbGlzdGVuaW5nIG9uIGBwb3BzdGF0ZWAgZXZlbnRzLiBXZSB3YW50XG4gKiB0byBwcm92aWRlIHRoaXMgY2xhc3MgaW4gdGhlIG1vc3QgdG9wIGluamVjdG9yIHRoYXQncyB1c2VkIGR1cmluZyBib290c3RyYXBwaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2luZ2xlU3BhRXh0cmFQcm92aWRlcnMoKTogU3RhdGljUHJvdmlkZXJbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbixcbiAgICAgIHVzZUNsYXNzOiBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLFxuICAgICAgZGVwczogW1tuZXcgSW5qZWN0KERPQ1VNRU5UKV1dLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogUGxhdGZvcm1Mb2NhdGlvbixcbiAgICAgIHVzZUV4aXN0aW5nOiBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLFxuICAgIH0sXG4gIF07XG59XG4iXX0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmEtcHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vc2luZ2xlLXNwYS1hbmd1bGFyLyIsInNvdXJjZXMiOlsic3JjL2V4dHJhLXByb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBMEIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBRWhCLFFBQVEsR0FDVCxNQUFNLGlCQUFpQixDQUFDO0FBR3pCLElBQWEseUJBQXlCLEdBQXRDLE1BQWEseUJBQTBCLFNBQVEsd0JBQXdCO0lBQXZFOztRQUdFLGlFQUFpRTtRQUNqRSwwQ0FBMEM7UUFDbEMscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpCLHdCQUFtQixHQUE2QyxFQUFFLENBQUM7SUEyRDdFLENBQUM7SUF6REMsT0FBTztRQUNMLDJHQUEyRztRQUMzRyxtRkFBbUY7UUFDbkYsc0ZBQXNGO1FBQ3RGLDBJQUEwSTtRQUUxSSxLQUFLLE1BQU0sa0JBQWtCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ3pELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztTQUM1RDtRQUVELHFGQUFxRjtRQUNyRixvR0FBb0c7UUFDcEcsdUNBQXVDO1FBQ3ZDLG9FQUFvRTtRQUNwRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBVSxFQUFFLEtBQWEsRUFBRSxHQUFXO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBVSxFQUFFLEtBQWEsRUFBRSxHQUFXO1FBQ2pELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxVQUFVLENBQUMsRUFBd0M7UUFDakQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQTBCLEVBQUUsRUFBRTtZQUN4RCxvRkFBb0Y7WUFDcEYsa0ZBQWtGO1lBQ2xGLHNFQUFzRTtZQUN0RSxNQUFNLHFDQUFxQyxHQUFHLENBQUMsQ0FBRyxLQUE0QztpQkFDM0YsU0FBUyxDQUFDO1lBRWIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUkscUNBQXFDLEVBQUU7Z0JBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7YUFDL0I7aUJBQU07Z0JBQ0wsMEVBQTBFO2dCQUMxRSw0RUFBNEU7Z0JBQzVFLDZFQUE2RTtnQkFDN0UsK0VBQStFO2dCQUMvRSxzREFBc0Q7Z0JBQ3RELGtGQUFrRjtnQkFDbEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDbEM7UUFDSCxDQUFDLENBQUM7UUFFRix3RkFBd0Y7UUFDeEYsK0VBQStFO1FBQy9FLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNsRCxLQUFLLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRixDQUFBO0FBbEVZLHlCQUF5QjtJQURyQyxVQUFVLEVBQUU7R0FDQSx5QkFBeUIsQ0FrRXJDO1NBbEVZLHlCQUF5QjtBQW9FdEM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsT0FBTztRQUNMO1lBQ0UsT0FBTyxFQUFFLHlCQUF5QjtZQUNsQyxRQUFRLEVBQUUseUJBQXlCO1lBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUMvQjtRQUNEO1lBQ0UsT0FBTyxFQUFFLGdCQUFnQjtZQUN6QixXQUFXLEVBQUUseUJBQXlCO1NBQ3ZDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUsIFN0YXRpY1Byb3ZpZGVyLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIMm1QnJvd3NlclBsYXRmb3JtTG9jYXRpb24sXG4gIFBsYXRmb3JtTG9jYXRpb24sXG4gIExvY2F0aW9uQ2hhbmdlRXZlbnQsXG4gIERPQ1VNRU5ULFxufSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbiBleHRlbmRzIMm1QnJvd3NlclBsYXRmb3JtTG9jYXRpb24ge1xuICBwcml2YXRlIG5nWm9uZSE6IE5nWm9uZTtcblxuICAvLyBUaGlzIGlzIGEgc2ltcGxlIG1hcmtlciB0aGF0IGhlbHBzIHVzIHRvIGlnbm9yZSBQb3BTdGF0ZUV2ZW50c1xuICAvLyB0aGF0IHdhcyBub3QgZGlzcGF0Y2hlZCBieSB0aGUgYnJvd3Nlci5cbiAgcHJpdmF0ZSBza2lwTmV4dFBvcFN0YXRlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBvblBvcFN0YXRlTGlzdGVuZXJzOiAoKGV2ZW50OiBMb2NhdGlvbkNoYW5nZUV2ZW50KSA9PiB2b2lkKVtdID0gW107XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBUTERSOiBBbmd1bGFyIGFkZHMgYHBvcHN0YXRlYCBldmVudCBsaXN0ZW5lciBhbmQgdGhlbiBkb2Vzbid0IHJlbW92ZSBpdCB3aGVuIGFwcGxpY2F0aW9uIGdldHMgZGVzdHJveWVkLlxuICAgIC8vIEJhc2ljYWxseSwgQW5ndWxhciBoYXMgYSBwb3RlbnRpb25hbCBtZW1vcnkgbGVhay4gVGhlIGDJtUJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uYFxuICAgIC8vIGhhcyBgb25Qb3BTdGF0ZWAgbWV0aG9kIHdoaWNoIGFkZHMgYHBvcHN0YXRlYCBldmVudCBsaXN0ZW5lciBhbmQgZm9yZ2V0cywgc2VlIGhlcmU6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzE0YmU1NWM5ZmFjZjNlNDdiOGM5N2RmNDUwMmRjM2YwZjg5N2RhMDMvcGFja2FnZXMvY29tbW9uL3NyYy9sb2NhdGlvbi9wbGF0Zm9ybV9sb2NhdGlvbi50cyNMMTI2XG5cbiAgICBmb3IgKGNvbnN0IG9uUG9wU3RhdGVMaXN0ZW5lciBvZiB0aGlzLm9uUG9wU3RhdGVMaXN0ZW5lcnMpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIG9uUG9wU3RhdGVMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gV2UgZG8gdGhpcyBiZWNhdXNlIHRoZSBgU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbmAgaXMgYSBwYXJ0IG9mIFBMQVRGT1JNX0lOSkVDVE9SLFxuICAgIC8vIHdoaWNoIG1lYW5zIGl0J3MgY3JlYXRlZCBvbmx5IG9uY2UgYW5kIHdpbGwgbm90IGJlIGdhcmJhZ2UgY29sbGVjdGVkLCBzaW5jZSB0aGUgUExBVEZPUk1fSU5KRUNUT1JcbiAgICAvLyB3aWxsIGtlZXAgcmVmZXJlbmNlIHRvIGl0cyBpbnN0YW5jZS5cbiAgICAvLyBUT0RPOiBodHRwczovL2dpdGh1Yi5jb20vc2luZ2xlLXNwYS9zaW5nbGUtc3BhLWFuZ3VsYXIvaXNzdWVzLzE3MFxuICAgIHRoaXMub25Qb3BTdGF0ZUxpc3RlbmVycyA9IFtdO1xuICB9XG5cbiAgcHVzaFN0YXRlKHN0YXRlOiBhbnksIHRpdGxlOiBzdHJpbmcsIHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5za2lwTmV4dFBvcFN0YXRlID0gdHJ1ZTtcbiAgICBzdXBlci5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICB9XG5cbiAgcmVwbGFjZVN0YXRlKHN0YXRlOiBhbnksIHRpdGxlOiBzdHJpbmcsIHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5za2lwTmV4dFBvcFN0YXRlID0gdHJ1ZTtcbiAgICBzdXBlci5yZXBsYWNlU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICB9XG5cbiAgb25Qb3BTdGF0ZShmbjogKGV2ZW50OiBMb2NhdGlvbkNoYW5nZUV2ZW50KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3Qgb25Qb3BTdGF0ZUxpc3RlbmVyID0gKGV2ZW50OiBMb2NhdGlvbkNoYW5nZUV2ZW50KSA9PiB7XG4gICAgICAvLyBUaGUgYExvY2F0aW9uQ2hhbmdlRXZlbnRgIGRvZXNuJ3QgaGF2ZSB0aGUgYHNpbmdsZVNwYWAgcHJvcGVydHksIHNpbmNlIGl0J3MgYWRkZWRcbiAgICAgIC8vIGJ5IGBzaW5nbGUtc3BhYCBzdGFydGluZyBmcm9tIGA1LjRgIHZlcnNpb24uIFdlIG5lZWQgdGhpcyBjaGVjayBiZWNhdXNlIHdlIHdhbnRcbiAgICAgIC8vIHRvIHNraXAgXCJ1bm5hdHVyYWxcIiBQb3BTdGF0ZUV2ZW50cywgdGhlIG9uZSBjYXVzZWQgYnkgYHNpbmdsZS1zcGFgLlxuICAgICAgY29uc3QgcG9wU3RhdGVFdmVudFdhc0Rpc3BhdGNoZWRCeVNpbmdsZVNwYSA9ICEhKChldmVudCBhcyB1bmtub3duKSBhcyB7IHNpbmdsZVNwYTogYm9vbGVhbiB9KVxuICAgICAgICAuc2luZ2xlU3BhO1xuXG4gICAgICBpZiAodGhpcy5za2lwTmV4dFBvcFN0YXRlICYmIHBvcFN0YXRlRXZlbnRXYXNEaXNwYXRjaGVkQnlTaW5nbGVTcGEpIHtcbiAgICAgICAgdGhpcy5za2lwTmV4dFBvcFN0YXRlID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXcmFwIGFueSBldmVudCBsaXN0ZW5lciBpbnRvIHpvbmUgdGhhdCBpcyBzcGVjaWZpYyB0byBzb21lIGFwcGxpY2F0aW9uLlxuICAgICAgICAvLyBUaGUgbWFpbiBpc3N1ZSBpcyBgYmFjay9mb3J3YXJkYCBidXR0b25zIG9mIGJyb3dzZXJzLCBiZWNhdXNlIHRoZXkgaW52b2tlXG4gICAgICAgIC8vIGBoaXN0b3J5LmJhY2t8Zm9yd2FyZGAgd2hpY2ggZGlzcGF0Y2ggYHBvcHN0YXRlYCBldmVudC4gU2luY2UgYHNpbmdsZS1zcGFgXG4gICAgICAgIC8vIG92ZXJyaWRlcyBgaGlzdG9yeS5yZXBsYWNlU3RhdGVgIEFuZ3VsYXIncyB6b25lIGNhbm5vdCBpbnRlcmNlcHQgdGhpcyBldmVudC5cbiAgICAgICAgLy8gT25seSB0aGUgcm9vdCB6b25lIGlzIGFibGUgdG8gaW50ZXJjZXB0IGFsbCBldmVudHMuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZ2xlLXNwYS9zaW5nbGUtc3BhLWFuZ3VsYXIvaXNzdWVzLzk0IGZvciBtb3JlIGRldGFpbHNcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IGZuKGV2ZW50KSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHN0b3JlZCBpbnNpZGUgYW4gYXJyYXkgYmVjYXVzZSB0aGUgYG9uUG9wU3RhdGVgIGNhbiBiZSBjYWxsZWRcbiAgICAvLyBtdWx0aXBsZSB0aW1lcyB0aHVzIHdlIHdhbm5hIHJlZmVyZW5jZSBhbGwgbGlzdGVuZXJzIHRvIHJlbW92ZSB0aGVtIGZ1cnRoZXIuXG4gICAgdGhpcy5vblBvcFN0YXRlTGlzdGVuZXJzLnB1c2gob25Qb3BTdGF0ZUxpc3RlbmVyKTtcbiAgICBzdXBlci5vblBvcFN0YXRlKG9uUG9wU3RhdGVMaXN0ZW5lcik7XG4gIH1cblxuICBzZXROZ1pvbmUobmdab25lOiBOZ1pvbmUpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZSA9IG5nWm9uZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBgUGxhdGZvcm1Mb2NhdGlvbmAgY2xhc3MgaXMgYW4gXCJpbmplY3RlZVwiIG9mIHRoZSBgUGF0aExvY2F0aW9uU3RyYXRlZ3lgLFxuICogd2hpY2ggY3JlYXRlcyBgU3ViamVjdGAgaW50ZXJuYWxseSBmb3IgbGlzdGVuaW5nIG9uIGBwb3BzdGF0ZWAgZXZlbnRzLiBXZSB3YW50XG4gKiB0byBwcm92aWRlIHRoaXMgY2xhc3MgaW4gdGhlIG1vc3QgdG9wIGluamVjdG9yIHRoYXQncyB1c2VkIGR1cmluZyBib290c3RyYXBwaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2luZ2xlU3BhRXh0cmFQcm92aWRlcnMoKTogU3RhdGljUHJvdmlkZXJbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbixcbiAgICAgIHVzZUNsYXNzOiBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLFxuICAgICAgZGVwczogW1tuZXcgSW5qZWN0KERPQ1VNRU5UKV1dLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogUGxhdGZvcm1Mb2NhdGlvbixcbiAgICAgIHVzZUV4aXN0aW5nOiBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLFxuICAgIH0sXG4gIF07XG59XG4iXX0= |
import { __awaiter } from "tslib"; | ||
import { getContainerEl, chooseDomElementGetter, removeApplicationFromDOMIfIvyEnabled, } from 'single-spa-angular/internals'; | ||
import { SingleSpaPlatformLocation } from './extra-providers'; | ||
@@ -37,2 +38,8 @@ const defaultOpts = { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
// Angular provides an opportunity to develop `zone-less` application, where developers | ||
// have to trigger change detection manually. | ||
// See https://angular.io/guide/zone#noopzone | ||
if (opts.NgZone === 'noop') { | ||
return; | ||
} | ||
// In order for multiple Angular apps to work concurrently on a page, they each need a unique identifier. | ||
@@ -75,5 +82,8 @@ opts.zoneIdentifier = `single-spa-angular:${props.name || props.appName}`; | ||
const singleSpaPlatformLocation = module.injector.get(SingleSpaPlatformLocation, null); | ||
const ngZoneEnabled = opts.NgZone !== 'noop'; | ||
// The user has to provide `BrowserPlatformLocation` only if his application uses routing. | ||
// So if he provided `Router` but didn't provide `BrowserPlatformLocation` then we have to inform him. | ||
if (opts.Router && singleSpaPlatformLocation === null) { | ||
// Also `getSingleSpaExtraProviders()` function should be called only if the user doesn't use | ||
// `zone-less` change detection, if `NgZone` is `noop` then we can skip it. | ||
if (ngZoneEnabled && opts.Router && singleSpaPlatformLocation === null) { | ||
throw new Error(` | ||
@@ -84,7 +94,16 @@ single-spa-angular: could not retrieve extra providers from the platform injector. Did you call getSingleSpaExtraProviders() when creating platform? | ||
const bootstrappedOpts = opts; | ||
const ngZone = module.injector.get(opts.NgZone); | ||
singleSpaPlatformLocation.setNgZone(ngZone); | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
if (ngZoneEnabled) { | ||
const ngZone = module.injector.get(opts.NgZone); | ||
// `NgZone` can be enabled but routing may not be used thus `getSingleSpaExtraProviders()` | ||
// function was not called. | ||
if (singleSpaPlatformLocation !== null) { | ||
singleSpaPlatformLocation.setNgZone(ngZone); | ||
// Cleanup resources, especially remove event listeners thus they will not be added | ||
// twice when application gets bootstrapped the second time. | ||
module.onDestroy(() => singleSpaPlatformLocation.destroy()); | ||
} | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
} | ||
bootstrappedOpts.bootstrappedModule = module; | ||
@@ -102,3 +121,5 @@ return module; | ||
} | ||
window.removeEventListener('single-spa:routing-event', opts.routingEventListener); | ||
if (opts.routingEventListener) { | ||
window.removeEventListener('single-spa:routing-event', opts.routingEventListener); | ||
} | ||
if (opts.AnimationEngine) { | ||
@@ -134,66 +155,7 @@ /* | ||
delete opts.bootstrappedModule; | ||
if (ivyEnabled()) { | ||
// This is an issue. Issue has been created and Angular team is working on the fix: | ||
// https://github.com/angular/angular/issues/36449 | ||
removeApplicationFromDOMIfIvyEnabled(opts, props); | ||
} | ||
// This is an issue. Issue has been created and Angular team is working on the fix: | ||
// https://github.com/angular/angular/issues/36449 | ||
removeApplicationFromDOMIfIvyEnabled(opts, props); | ||
}); | ||
} | ||
function ivyEnabled() { | ||
try { | ||
// `ɵivyEnabled` variable is exposed starting from version 8. | ||
// We use `require` here except of a single `import { ɵivyEnabled }` because the | ||
// developer can use Angular version that doesn't expose it (all versions <8). | ||
// The `catch` statement will handle those cases. | ||
// eslint-disable-next-line | ||
const { ɵivyEnabled } = require('@angular/core'); | ||
return !!ɵivyEnabled; | ||
} | ||
catch (_a) { | ||
return false; | ||
} | ||
} | ||
function removeApplicationFromDOMIfIvyEnabled(opts, props) { | ||
const domElementGetter = chooseDomElementGetter(opts, props); | ||
const domElement = getContainerEl(domElementGetter); | ||
// View Engine removes all nodes automatically when calling `NgModuleRef.destroy()`, | ||
// which calls `ComponentRef.destroy()`. | ||
// Basically this will remove `app-root` or any other selector from the container element. | ||
while (domElement.firstChild) | ||
domElement.removeChild(domElement.firstChild); | ||
} | ||
function getContainerEl(domElementGetter) { | ||
const element = domElementGetter(); | ||
if (!element) { | ||
throw Error('domElementGetter did not return a valid dom element'); | ||
} | ||
return element; | ||
} | ||
function chooseDomElementGetter(opts, props) { | ||
props = props && props.customProps ? props.customProps : props; | ||
if (props.domElement) { | ||
return () => props.domElement; | ||
} | ||
else if (props.domElementGetter) { | ||
return props.domElementGetter; | ||
} | ||
else if (opts.domElementGetter) { | ||
return opts.domElementGetter; | ||
} | ||
else { | ||
return defaultDomElementGetter(props.name); | ||
} | ||
} | ||
function defaultDomElementGetter(name) { | ||
return function getDefaultDomElement() { | ||
const id = `single-spa-application:${name}`; | ||
let domElement = document.getElementById(id); | ||
if (!domElement) { | ||
domElement = document.createElement('div'); | ||
domElement.id = id; | ||
document.body.appendChild(domElement); | ||
} | ||
return domElement; | ||
}; | ||
} | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLXNwYS1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vc2luZ2xlLXNwYS1hbmd1bGFyLyIsInNvdXJjZXMiOlsic3JjL3NpbmdsZS1zcGEtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBR0EsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsTUFBTSxXQUFXLEdBQUc7SUFDbEIsMERBQTBEO0lBQzFELE1BQU0sRUFBRSxJQUFLO0lBQ2IsaUJBQWlCLEVBQUUsSUFBSztJQUN4QixRQUFRLEVBQUUsSUFBSztJQUNmLGdCQUFnQjtJQUNoQixNQUFNLEVBQUUsU0FBUztJQUNqQixnQkFBZ0IsRUFBRSxTQUFTO0lBQzNCLGVBQWUsRUFBRSxTQUFTO0lBQzFCLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO0NBQ3hDLENBQUM7QUFFRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBOEI7SUFDN0QsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFDaEMsTUFBTSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztLQUNuRTtJQUVELE1BQU0sSUFBSSxtQ0FDTCxXQUFXLEdBQ1gsUUFBUSxDQUNaLENBQUM7SUFFRixJQUFJLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixLQUFLLFVBQVUsRUFBRTtRQUNoRCxNQUFNLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0tBQzVFO0lBRUQsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO1FBQ3JDLE1BQU0sS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7S0FDdkU7SUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNoQixNQUFNLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0tBQ2pFO0lBRUQsT0FBTztRQUNMLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFB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LGdCQUFnQixFQUFFO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0tBQzlCO1NBQU07UUFDTCxPQUFPLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM1QztBQUNILENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUFDLElBQVk7SUFDM0MsT0FBTyxTQUFTLG9CQUFvQjtRQUNsQyxNQUFNLEVBQUUsR0FBRywwQkFBMEIsSUFBSSxFQUFFLENBQUM7UUFDNUMsSUFBSSxVQUFVLEdBQXVCLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ25CLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nWm9uZSwgVHlwZSwgTmdNb2R1bGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcFByb3BzLCBMaWZlQ3ljbGVzIH0gZnJvbSAnc2luZ2xlLXNwYSc7XG5cbmltcG9ydCB7IFNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24gfSBmcm9tICcuL2V4dHJhLXByb3ZpZGVycyc7XG5cbmNvbnN0IGRlZmF1bHRPcHRzID0ge1xuICAvLyBSZXF1aXJlZCBvcHRzIHRoYXQgd2lsbCBiZSBzZXQgYnkgdGhlIGxpYnJhcnkgY29uc3VtZXIuXG4gIE5nWm9uZTogbnVsbCEsXG4gIGJvb3RzdHJhcEZ1bmN0aW9uOiBudWxsISxcbiAgdGVtcGxhdGU6IG51bGwhLFxuICAvLyBvcHRpb25hbCBvcHRzXG4gIFJvdXRlcjogdW5kZWZpbmVkLFxuICBkb21FbGVtZW50R2V0dGVyOiB1bmRlZmluZWQsIC8vIG9ubHkgb3B0aW9uYWwgaWYgeW91IHByb3ZpZGUgYSBkb21FbGVtZW50R2V0dGVyIGFzIGEgY3VzdG9tIHByb3BcbiAgQW5pbWF0aW9uRW5naW5lOiB1bmRlZmluZWQsXG4gIHVwZGF0ZUZ1bmN0aW9uOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzaW5nbGVTcGFBbmd1bGFyKHVzZXJPcHRzOiBTaW5nbGVTcGFBbmd1bGFyT3B0cyk6IExpZmVDeWNsZXMge1xuICBpZiAodHlwZW9mIHVzZXJPcHRzICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IEVycm9yKCdzaW5nbGUtc3BhLWFuZ3VsYXIgcmVxdWlyZXMgYSBjb25maWd1cmF0aW9uIG9iamVjdCcpO1xuICB9XG5cbiAgY29uc3Qgb3B0czogU2luZ2xlU3BhQW5ndWxhck9wdHMgPSB7XG4gICAgLi4uZGVmYXVsdE9wdHMsXG4gICAgLi4udXNlck9wdHMsXG4gIH07XG5cbiAgaWYgKHR5cGVvZiBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgRXJyb3IoJ3NpbmdsZS1zcGEtYW5ndWxhciBtdXN0IGJlIHBhc3NlZCBhbiBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdHMudGVtcGxhdGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgRXJyb3IoJ3NpbmdsZS1zcGEtYW5ndWxhciBtdXN0IGJlIHBhc3NlZCBvcHRzLnRlbXBsYXRlIHN0cmluZycpO1xuICB9XG5cbiAgaWYgKCFvcHRzLk5nWm9uZSkge1xuICAgIHRocm93IEVycm9yKGBzaW5nbGUtc3BhLWFuZ3VsYXIgbXVzdCBiZSBwYXNzZWQgdGhlIE5nWm9uZSBvcHRgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYm9vdHN0cmFwOiBib290c3RyYXAuYmluZChudWxsLCBvcHRzIGFzIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzKSxcbiAgICBtb3VudDogbW91bnQuYmluZChudWxsLCBvcHRzKSxcbiAgICB1bm1vdW50OiB1bm1vdW50LmJpbmQobnVsbCwgb3B0cyBhcyBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cyksXG4gICAgdXBkYXRlOiBvcHRzLnVwZGF0ZUZ1bmN0aW9uLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAob3B0czogQm9vdHN0cmFwcGVkU2luZ2xlU3BhQW5ndWxhck9wdHMsIHByb3BzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gSW4gb3JkZXIgZm9yIG11bHRpcGxlIEFuZ3VsYXIgYXBwcyB0byB3b3JrIGNvbmN1cnJlbnRseSBvbiBhIHBhZ2UsIHRoZXkgZWFjaCBuZWVkIGEgdW5pcXVlIGlkZW50aWZpZXIuXG4gIG9wdHMuem9uZUlkZW50aWZpZXIgPSBgc2luZ2xlLXNwYS1hbmd1bGFyOiR7cHJvcHMubmFtZSB8fCBwcm9wcy5hcHBOYW1lfWA7XG5cbiAgLy8gVGhpcyBpcyBhIGhhY2ssIHNpbmNlIE5nWm9uZSBkb2Vzbid0IGFsbG93IHlvdSB0byBjb25maWd1cmUgdGhlIHByb3BlcnR5IHRoYXQgaWRlbnRpZmllcyB5b3VyIHpvbmUuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUGxhY2VNZS1TQVMvc2luZ2xlLXNwYS1hbmd1bGFyLWNsaS9pc3N1ZXMvMzMsXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5nbGUtc3BhL3NpbmdsZS1zcGEtYW5ndWxhci9pc3N1ZXMvNDcsXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9hMTRkYzJkN2E0ODIxYTE5ZjIwYTk1NDcwNTNhNTczNDc5OGY1NDFlL3BhY2thZ2VzL2NvcmUvc3JjL3pvbmUvbmdfem9uZS50cyNMMTQ0LFxuICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL2ExNGRjMmQ3YTQ4MjFhMTlmMjBhOTU0NzA1M2E1NzM0Nzk4ZjU0MWUvcGFja2FnZXMvY29yZS9zcmMvem9uZS9uZ196b25lLnRzI0wyNTdcbiAgb3B0cy5OZ1pvbmUuaXNJbkFuZ3VsYXJab25lID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gd2luZG93LlpvbmUuY3VycmVudC5fcHJvcGVydGllc1tvcHRzLnpvbmVJZGVudGlmaWVyXSA9PT0gdHJ1ZTtcbiAgfTtcblxuICBvcHRzLnJvdXRpbmdFdmVudExpc3RlbmVyID0gKCkgPT4ge1xuICAgIG9wdHMuYm9vdHN0cmFwcGVkTmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbmdsZS1zcGEvc2luZ2xlLXNwYS1hbmd1bGFyL2lzc3Vlcy84NlxuICAgICAgLy8gWm9uZSBpcyB1bmF3YXJlIG9mIHRoZSBzaW5nbGUtc3BhIG5hdmlnYXRpb24gY2hhbmdlIGFuZCBzbyBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24gZG9lc24ndCB3b3JrXG4gICAgICAvLyB1bmxlc3Mgd2UgdGVsbCBab25lIHRoYXQgc29tZXRoaW5nIGhhcHBlbmVkXG4gICAgfSk7XG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1vdW50KG9wdHM6IFNpbmdsZVNwYUFuZ3VsYXJPcHRzLCBwcm9wczogYW55KTogUHJvbWlzZTxOZ01vZHVsZVJlZjxhbnk+PiB7XG4gIGNvbnN0IGRvbUVsZW1lbnRHZXR0ZXIgPSBjaG9vc2VEb21FbGVtZW50R2V0dGVyKG9wdHMsIHByb3BzKTtcblxuICBpZiAoIWRvbUVsZW1lbnRHZXR0ZXIpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBjYW5ub3QgbW91bnQgYW5ndWxhciBhcHBsaWNhdGlvbiAnJHtcbiAgICAgICAgcHJvcHMubmFtZSB8fCBwcm9wcy5hcHBOYW1lXG4gICAgICB9JyB3aXRob3V0IGEgZG9tRWxlbWVudEdldHRlciBwcm92aWRlZCBlaXRoZXIgYXMgYW4gb3B0IG9yIGEgcHJvcGAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRhaW5lckVsID0gZ2V0Q29udGFpbmVyRWwoZG9tRWxlbWVudEdldHRlcik7XG4gIGNvbnRhaW5lckVsLmlubmVySFRNTCA9IG9wdHMudGVtcGxhdGU7XG4gIGNvbnN0IGJvb3RzdHJhcFByb21pc2UgPSBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uKHByb3BzKTtcblxuICBpZiAoIShib290c3RyYXBQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBzaW5nbGUtc3BhLWFuZ3VsYXI6IHRoZSBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZSwgYnV0IGluc3RlYWQgcmV0dXJuZWQgYSAnJHt0eXBlb2YgYm9vdHN0cmFwUHJvbWlzZX0nIHRoYXQgaXMgbm90IGEgUHJvbWlzZWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZTogTmdNb2R1bGVSZWY8YW55PiA9IGF3YWl0IGJvb3RzdHJhcFByb21pc2U7XG5cbiAgaWYgKCFtb2R1bGUgfHwgdHlwZW9mIG1vZHVsZS5kZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgc2luZ2xlLXNwYS1hbmd1bGFyOiB0aGUgb3B0cy5ib290c3RyYXBGdW5jdGlvbiByZXR1cm5lZCBhIHByb21pc2UgdGhhdCBkaWQgbm90IHJlc29sdmUgd2l0aCBhIHZhbGlkIEFuZ3VsYXIgbW9kdWxlLiBEaWQgeW91IGNhbGwgcGxhdGZvcm1Ccm93c2VyKCkuYm9vdHN0cmFwTW9kdWxlRmFjdG9yeSgpIGNvcnJlY3RseT9gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uOiBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uIHwgbnVsbCA9IG1vZHVsZS5pbmplY3Rvci5nZXQoXG4gICAgU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbixcbiAgICBudWxsLFxuICApO1xuXG4gIC8vIFRoZSB1c2VyIGhhcyB0byBwcm92aWRlIGBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbmAgb25seSBpZiBoaXMgYXBwbGljYXRpb24gdXNlcyByb3V0aW5nLlxuICAvLyBTbyBpZiBoZSBwcm92aWRlZCBgUm91dGVyYCBidXQgZGlkbid0IHByb3ZpZGUgYEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uYCB0aGVuIHdlIGhhdmUgdG8gaW5mb3JtIGhpbS5cbiAgaWYgKG9wdHMuUm91dGVyICYmIHNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24gPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFx0XG4gICAgICBzaW5nbGUtc3BhLWFuZ3VsYXI6IGNvdWxkIG5vdCByZXRyaWV2ZSBleHRyYSBwcm92aWRlcnMgZnJvbSB0aGUgcGxhdGZvcm0gaW5qZWN0b3IuIERpZCB5b3UgY2FsbCBnZXRTaW5nbGVTcGFFeHRyYVByb3ZpZGVycygpIHdoZW4gY3JlYXRpbmcgcGxhdGZvcm0/XHRcbiAgICBgKTtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcHBlZE9wdHMgPSBvcHRzIGFzIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzO1xuICBjb25zdCBuZ1pvbmU6IE5nWm9uZSA9IG1vZHVsZS5pbmplY3Rvci5nZXQob3B0cy5OZ1pvbmUpO1xuXG4gIHNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24hLnNldE5nWm9uZShuZ1pvbmUpO1xuICBib290c3RyYXBwZWRPcHRzLmJvb3RzdHJhcHBlZE5nWm9uZSA9IG5nWm9uZTtcbiAgYm9vdHN0cmFwcGVkT3B0cy5ib290c3RyYXBwZWROZ1pvbmVbJ19pbm5lciddLl9wcm9wZXJ0aWVzW2Jvb3RzdHJhcHBlZE9wdHMuem9uZUlkZW50aWZpZXJdID0gdHJ1ZTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3NpbmdsZS1zcGE6cm91dGluZy1ldmVudCcsIGJvb3RzdHJhcHBlZE9wdHMucm91dGluZ0V2ZW50TGlzdGVuZXIpO1xuICBib290c3RyYXBwZWRPcHRzLmJvb3RzdHJhcHBlZE1vZHVsZSA9IG1vZHVsZTtcblxuICByZXR1cm4gbW9kdWxlO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5hc3luYyBmdW5jdGlvbiB1bm1vdW50KG9wdHM6IEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzLCBwcm9wczogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChvcHRzLlJvdXRlcikge1xuICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE5MDc5XG4gICAgY29uc3Qgcm91dGVyID0gb3B0cy5ib290c3RyYXBwZWRNb2R1bGUuaW5qZWN0b3IuZ2V0KG9wdHMuUm91dGVyKTtcbiAgICByb3V0ZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NpbmdsZS1zcGE6cm91dGluZy1ldmVudCcsIG9wdHMucm91dGluZ0V2ZW50TGlzdGVuZXIpO1xuXG4gIGlmIChvcHRzLkFuaW1hdGlvbkVuZ2luZSkge1xuICAgIC8qXG4gICAgVGhlIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlIGRvZXMgbm90IGNsZWFuIHVwIGFmdGVyIGl0c2VsZiA6JyguIFdoZW4geW91IHVubW91bnQvZGVzdHJveSB0aGUgbWFpbiBtb2R1bGUsIHRoZVxuICAgIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlIHVzZXMgYW4gQW5pbWF0aW9uUmVuZGVyZXIgdGhpbmcgdG8gcmVtb3ZlIGRvbSBlbGVtZW50cyBmcm9tIHRoZSBwYWdlLiBCdXQgdGhlIEFuaW1hdGlvblJlbmRlcmVyXG4gICAgZGVmZXJzIHRoZSBhY3R1YWwgd29yayB0byB0aGUgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZSB0byBkbyB0aGlzLCBhbmQgdGhlIFRyYW5zaXRpb25BbmltYXRpb25FbmdpbmUgZG9lc24ndCBhY3R1YWxseVxuICAgIHJlbW92ZSB0aGUgZG9tIG5vZGUsIGJ1dCBqdXN0IGNhbGxzIFwibWFya0VsZW1lbnRBc1JlbW92ZWQoKVwiLlxuXG4gICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9kYjYyY2NmOWViNDZlZTg5MzY2YWRlNTg2MzY1ZWEwMjdiYjkzZWIxL3BhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvcmVuZGVyL3RyYW5zaXRpb25fYW5pbWF0aW9uX2VuZ2luZS50cyNMNzE3XG5cbiAgICBXaGF0IG1hcmtBc1JlbW92ZWREb2VzIGlzIHB1dCBpdCBpbnRvIGFuIGFycmF5IGNhbGxlZCBcImNvbGxlY3RlZExlYXZlRWxlbWVudHNcIiwgd2hpY2ggaXMgYWxsIHRoZSBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkXG4gICAgYWZ0ZXIgdGhlIERPTSBoYXMgaGFkIGEgY2hhbmNlIHRvIGRvIGFueSBhbmltYXRpb25zLlxuXG4gICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdHJhbnNpdGlvbl9hbmltYXRpb25fZW5naW5lLnRzI0w1MjVcblxuICAgIFRoZSBhY3R1YWwgZG9tIG5vZGVzIGFyZW4ndCByZW1vdmVkIHVudGlsIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIFwiZmx1c2hlc1wiLlxuXG4gICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9kYjYyY2NmOWViNDZlZTg5MzY2YWRlNTg2MzY1ZWEwMjdiYjkzZWIxL3BhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvcmVuZGVyL3RyYW5zaXRpb25fYW5pbWF0aW9uX2VuZ2luZS50cyNMODUxXG5cbiAgICBVbmZvcnR1bmF0ZWx5LCB0aG91Z2gsIHRoYXQgXCJmbHVzaFwiIHdpbGwgbmV2ZXIgaGFwcGVuLCBzaW5jZSB0aGUgZW50aXJlIG1vZHVsZSBpcyBiZWluZyBkZXN0cm95ZWQgYW5kIHRoZXJlIHdpbGwgYmUgbm8gbW9yZSBmbHVzaGVzLlxuICAgIFNvIHdoYXQgd2UgZG8gaW4gdGhpcyBjb2RlIGlzIGZvcmNlIG9uZSBtb3JlIGZsdXNoIG9mIHRoZSBhbmltYXRpb25zIGFmdGVyIHRoZSBtb2R1bGUgaXMgZGVzdHJveWVkLlxuXG4gICAgSWRlYWxseSwgd2Ugd291bGQgZG8gdGhpcyBieSBnZXR0aW5nIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIGRpcmVjdGx5IGFuZCBmbHVzaGluZyBpdC4gVW5mb3J0dW5hdGVseSwgdGhvdWdoLCBpdCdzIHByaXZhdGUgY2xhc3NcbiAgICB0aGF0IGNhbm5vdCBiZSBpbXBvcnRlZCBhbmQgaXMgbm90IHByb3ZpZGVkIHRvIHRoZSBkZXBlbmRlbmN5IGluamVjdG9yLiBTbywgaW5zdGVhZCwgd2UgZ2V0IGl0cyB3cmFwcGVyIGNsYXNzLCBBbmltYXRpb25FbmdpbmUsIGFuZCB0aGVuXG4gICAgYWNjZXNzIGl0cyBwcml2YXRlIHZhcmlhYmxlIHJlZmVyZW5jZSB0byB0aGUgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZSBzbyB0aGF0IHdlIGNhbiBjYWxsIGZsdXNoLlxuICAgICovXG4gICAgY29uc3QgYW5pbWF0aW9uRW5naW5lID0gb3B0cy5ib290c3RyYXBwZWRNb2R1bGUuaW5qZWN0b3IuZ2V0KG9wdHMuQW5pbWF0aW9uRW5naW5lKTtcbiAgICBhbmltYXRpb25FbmdpbmUuX3RyYW5zaXRpb25FbmdpbmUuZmx1c2goKTtcbiAgfVxuXG4gIG9wdHMuYm9vdHN0cmFwcGVkTW9kdWxlLmRlc3Ryb3koKTtcbiAgZGVsZXRlIG9wdHMuYm9vdHN0cmFwcGVkTW9kdWxlO1xuXG4gIGlmIChpdnlFbmFibGVkKCkpIHtcbiAgICAvLyBUaGlzIGlzIGFuIGlzc3VlLiBJc3N1ZSBoYXMgYmVlbiBjcmVhdGVkIGFuZCBBbmd1bGFyIHRlYW0gaXMgd29ya2luZyBvbiB0aGUgZml4OlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzM2NDQ5XG4gICAgcmVtb3ZlQXBwbGljYXRpb25Gcm9tRE9NSWZJdnlFbmFibGVkKG9wdHMsIHByb3BzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpdnlFbmFibGVkKCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIC8vIGDJtWl2eUVuYWJsZWRgIHZhcmlhYmxlIGlzIGV4cG9zZWQgc3RhcnRpbmcgZnJvbSB2ZXJzaW9uIDguXG4gICAgLy8gV2UgdXNlIGByZXF1aXJlYCBoZXJlIGV4Y2VwdCBvZiBhIHNpbmdsZSBgaW1wb3J0IHsgybVpdnlFbmFibGVkIH1gIGJlY2F1c2UgdGhlXG4gICAgLy8gZGV2ZWxvcGVyIGNhbiB1c2UgQW5ndWxhciB2ZXJzaW9uIHRoYXQgZG9lc24ndCBleHBvc2UgaXQgKGFsbCB2ZXJzaW9ucyA8OCkuXG4gICAgLy8gVGhlIGBjYXRjaGAgc3RhdGVtZW50IHdpbGwgaGFuZGxlIHRob3NlIGNhc2VzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIGNvbnN0IHsgybVpdnlFbmFibGVkIH0gPSByZXF1aXJlKCdAYW5ndWxhci9jb3JlJyk7XG4gICAgcmV0dXJuICEhybVpdnlFbmFibGVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQXBwbGljYXRpb25Gcm9tRE9NSWZJdnlFbmFibGVkKG9wdHM6IFNpbmdsZVNwYUFuZ3VsYXJPcHRzLCBwcm9wczogYW55KTogdm9pZCB7XG4gIGNvbnN0IGRvbUVsZW1lbnRHZXR0ZXIgPSBjaG9vc2VEb21FbGVtZW50R2V0dGVyKG9wdHMsIHByb3BzKTtcbiAgY29uc3QgZG9tRWxlbWVudCA9IGdldENvbnRhaW5lckVsKGRvbUVsZW1lbnRHZXR0ZXIpO1xuICAvLyBWaWV3IEVuZ2luZSByZW1vdmVzIGFsbCBub2RlcyBhdXRvbWF0aWNhbGx5IHdoZW4gY2FsbGluZyBgTmdNb2R1bGVSZWYuZGVzdHJveSgpYCxcbiAgLy8gd2hpY2ggY2FsbHMgYENvbXBvbmVudFJlZi5kZXN0cm95KClgLlxuICAvLyBCYXNpY2FsbHkgdGhpcyB3aWxsIHJlbW92ZSBgYXBwLXJvb3RgIG9yIGFueSBvdGhlciBzZWxlY3RvciBmcm9tIHRoZSBjb250YWluZXIgZWxlbWVudC5cbiAgd2hpbGUgKGRvbUVsZW1lbnQuZmlyc3RDaGlsZCkgZG9tRWxlbWVudC5yZW1vdmVDaGlsZChkb21FbGVtZW50LmZpcnN0Q2hpbGQpO1xufVxuXG5mdW5jdGlvbiBnZXRDb250YWluZXJFbChkb21FbGVtZW50R2V0dGVyOiBEb21FbGVtZW50R2V0dGVyKTogbmV2ZXIgfCBIVE1MRWxlbWVudCB7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb21FbGVtZW50R2V0dGVyKCk7XG5cbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgdGhyb3cgRXJyb3IoJ2RvbUVsZW1lbnRHZXR0ZXIgZGlkIG5vdCByZXR1cm4gYSB2YWxpZCBkb20gZWxlbWVudCcpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGNob29zZURvbUVsZW1lbnRHZXR0ZXIob3B0czogU2luZ2xlU3BhQW5ndWxhck9wdHMsIHByb3BzOiBhbnkpOiBEb21FbGVtZW50R2V0dGVyIHtcbiAgcHJvcHMgPSBwcm9wcyAmJiBwcm9wcy5jdXN0b21Qcm9wcyA/IHByb3BzLmN1c3RvbVByb3BzIDogcHJvcHM7XG4gIGlmIChwcm9wcy5kb21FbGVtZW50KSB7XG4gICAgcmV0dXJuICgpID0+IHByb3BzLmRvbUVsZW1lbnQ7XG4gIH0gZWxzZSBpZiAocHJvcHMuZG9tRWxlbWVudEdldHRlcikge1xuICAgIHJldHVybiBwcm9wcy5kb21FbGVtZW50R2V0dGVyO1xuICB9IGVsc2UgaWYgKG9wdHMuZG9tRWxlbWVudEdldHRlcikge1xuICAgIHJldHVybiBvcHRzLmRvbUVsZW1lbnRHZXR0ZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRlZmF1bHREb21FbGVtZW50R2V0dGVyKHByb3BzLm5hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHREb21FbGVtZW50R2V0dGVyKG5hbWU6IHN0cmluZyk6IERvbUVsZW1lbnRHZXR0ZXIge1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0RGVmYXVsdERvbUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaWQgPSBgc2luZ2xlLXNwYS1hcHBsaWNhdGlvbjoke25hbWV9YDtcbiAgICBsZXQgZG9tRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXG4gICAgaWYgKCFkb21FbGVtZW50KSB7XG4gICAgICBkb21FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkb21FbGVtZW50LmlkID0gaWQ7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvbUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb21FbGVtZW50O1xuICB9O1xufVxuXG50eXBlIERvbUVsZW1lbnRHZXR0ZXIgPSAoKSA9PiBIVE1MRWxlbWVudDtcblxuaW50ZXJmYWNlIFNpbmdsZVNwYUFuZ3VsYXJPcHRzIHtcbiAgTmdab25lOiB0eXBlb2YgTmdab25lO1xuICBib290c3RyYXBGdW5jdGlvbihwcm9wczogQXBwUHJvcHMpOiBQcm9taXNlPE5nTW9kdWxlUmVmPGFueT4+O1xuICB1cGRhdGVGdW5jdGlvbj8ocHJvcHM6IEFwcFByb3BzKTogUHJvbWlzZTxhbnk+O1xuICB0ZW1wbGF0ZTogc3RyaW5nO1xuICBSb3V0ZXI/OiBUeXBlPGFueT47XG4gIGRvbUVsZW1lbnRHZXR0ZXI/KCk6IEhUTUxFbGVtZW50O1xuICBBbmltYXRpb25FbmdpbmU/OiBUeXBlPGFueT47XG59XG5cbmludGVyZmFjZSBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cyBleHRlbmRzIFNpbmdsZVNwYUFuZ3VsYXJPcHRzIHtcbiAgYm9vdHN0cmFwcGVkTmdab25lOiBOZ1pvbmU7XG4gIGJvb3RzdHJhcHBlZE1vZHVsZTogTmdNb2R1bGVSZWY8YW55PjtcbiAgcm91dGluZ0V2ZW50TGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gIHpvbmVJZGVudGlmaWVyOiBzdHJpbmc7XG59XG4iXX0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLXNwYS1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vc2luZ2xlLXNwYS1hbmd1bGFyLyIsInNvdXJjZXMiOlsic3JjL3NpbmdsZS1zcGEtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUNMLGNBQWMsRUFDZCxzQkFBc0IsRUFDdEIsb0NBQW9DLEdBR3JDLE1BQU0sOEJBQThCLENBQUM7QUFFdEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsTUFBTSxXQUFXLEdBQUc7SUFDbEIsMERBQTBEO0lBQzFELE1BQU0sRUFBRSxJQUFLO0lBQ2IsaUJBQWlCLEVBQUUsSUFBSztJQUN4QixRQUFRLEVBQUUsSUFBSztJQUNmLGdCQUFnQjtJQUNoQixNQUFNLEVBQUUsU0FBUztJQUNqQixnQkFBZ0IsRUFBRSxTQUFTO0lBQzNCLGVBQWUsRUFBRSxTQUFTO0lBQzFCLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO0NBQ3hDLENBQUM7QUFFRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBOEI7SUFDN0QsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFDaEMsTUFBTSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztLQUNuRTtJQUVELE1BQU0sSUFBSSxtQ0FDTCxXQUFXLEdBQ1gsUUFBUSxDQUNaLENBQUM7SUFFRixJQUFJLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixLQUFLLFVBQVUsRUFBRTtRQUNoRCxNQUFNLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0tBQzVFO0lBRUQsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO1FBQ3JDLE1BQU0sS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7S0FDdkU7SUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNoQixNQUFNLEtBQUssQ0FBQyxrREFBa0Qs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QUFvQixDQUFDLENBQUM7U0FDbkY7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2NBdUJFO1lBQ0YsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ25GLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUMzQztRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUUvQixtRkFBbUY7UUFDbkYsa0RBQWtEO1FBQ2xELG9DQUFvQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlmZUN5Y2xlcyB9IGZyb20gJ3NpbmdsZS1zcGEnO1xuaW1wb3J0IHtcbiAgZ2V0Q29udGFpbmVyRWwsXG4gIGNob29zZURvbUVsZW1lbnRHZXR0ZXIsXG4gIHJlbW92ZUFwcGxpY2F0aW9uRnJvbURPTUlmSXZ5RW5hYmxlZCxcbiAgU2luZ2xlU3BhQW5ndWxhck9wdHMsXG4gIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzLFxufSBmcm9tICdzaW5nbGUtc3BhLWFuZ3VsYXIvaW50ZXJuYWxzJztcblxuaW1wb3J0IHsgU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbiB9IGZyb20gJy4vZXh0cmEtcHJvdmlkZXJzJztcblxuY29uc3QgZGVmYXVsdE9wdHMgPSB7XG4gIC8vIFJlcXVpcmVkIG9wdHMgdGhhdCB3aWxsIGJlIHNldCBieSB0aGUgbGlicmFyeSBjb25zdW1lci5cbiAgTmdab25lOiBudWxsISxcbiAgYm9vdHN0cmFwRnVuY3Rpb246IG51bGwhLFxuICB0ZW1wbGF0ZTogbnVsbCEsXG4gIC8vIG9wdGlvbmFsIG9wdHNcbiAgUm91dGVyOiB1bmRlZmluZWQsXG4gIGRvbUVsZW1lbnRHZXR0ZXI6IHVuZGVmaW5lZCwgLy8gb25seSBvcHRpb25hbCBpZiB5b3UgcHJvdmlkZSBhIGRvbUVsZW1lbnRHZXR0ZXIgYXMgYSBjdXN0b20gcHJvcFxuICBBbmltYXRpb25FbmdpbmU6IHVuZGVmaW5lZCxcbiAgdXBkYXRlRnVuY3Rpb246ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZVNwYUFuZ3VsYXIodXNlck9wdHM6IFNpbmdsZVNwYUFuZ3VsYXJPcHRzKTogTGlmZUN5Y2xlcyB7XG4gIGlmICh0eXBlb2YgdXNlck9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgRXJyb3IoJ3NpbmdsZS1zcGEtYW5ndWxhciByZXF1aXJlcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCBvcHRzOiBTaW5nbGVTcGFBbmd1bGFyT3B0cyA9IHtcbiAgICAuLi5kZWZhdWx0T3B0cyxcbiAgICAuLi51c2VyT3B0cyxcbiAgfTtcblxuICBpZiAodHlwZW9mIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBFcnJvcignc2luZ2xlLXNwYS1hbmd1bGFyIG11c3QgYmUgcGFzc2VkIGFuIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cy50ZW1wbGF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBFcnJvcignc2luZ2xlLXNwYS1hbmd1bGFyIG11c3QgYmUgcGFzc2VkIG9wdHMudGVtcGxhdGUgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoIW9wdHMuTmdab25lKSB7XG4gICAgdGhyb3cgRXJyb3IoYHNpbmdsZS1zcGEtYW5ndWxhciBtdXN0IGJlIHBhc3NlZCB0aGUgTmdab25lIG9wdGApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBib290c3RyYXA6IGJvb3RzdHJhcC5iaW5kKG51bGwsIG9wdHMgYXMgQm9vdHN0cmFwcGVkU2luZ2xlU3BhQW5ndWxhck9wdHMpLFxuICAgIG1vdW50OiBtb3VudC5iaW5kKG51bGwsIG9wdHMpLFxuICAgIHVubW91bnQ6IHVubW91bnQuYmluZChudWxsLCBvcHRzIGFzIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzKSxcbiAgICB1cGRhdGU6IG9wdHMudXBkYXRlRnVuY3Rpb24sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcChvcHRzOiBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cywgcHJvcHM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBBbmd1bGFyIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIGRldmVsb3AgYHpvbmUtbGVzc2AgYXBwbGljYXRpb24sIHdoZXJlIGRldmVsb3BlcnNcbiAgLy8gaGF2ZSB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gbWFudWFsbHkuXG4gIC8vIFNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvem9uZSNub29wem9uZVxuICBpZiAob3B0cy5OZ1pvbmUgPT09ICdub29wJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEluIG9yZGVyIGZvciBtdWx0aXBsZSBBbmd1bGFyIGFwcHMgdG8gd29yayBjb25jdXJyZW50bHkgb24gYSBwYWdlLCB0aGV5IGVhY2ggbmVlZCBhIHVuaXF1ZSBpZGVudGlmaWVyLlxuICBvcHRzLnpvbmVJZGVudGlmaWVyID0gYHNpbmdsZS1zcGEtYW5ndWxhcjoke3Byb3BzLm5hbWUgfHwgcHJvcHMuYXBwTmFtZX1gO1xuXG4gIC8vIFRoaXMgaXMgYSBoYWNrLCBzaW5jZSBOZ1pvbmUgZG9lc24ndCBhbGxvdyB5b3UgdG8gY29uZmlndXJlIHRoZSBwcm9wZXJ0eSB0aGF0IGlkZW50aWZpZXMgeW91ciB6b25lLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1BsYWNlTWUtU0FTL3NpbmdsZS1zcGEtYW5ndWxhci1jbGkvaXNzdWVzLzMzLFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vc2luZ2xlLXNwYS9zaW5nbGUtc3BhLWFuZ3VsYXIvaXNzdWVzLzQ3LFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvYTE0ZGMyZDdhNDgyMWExOWYyMGE5NTQ3MDUzYTU3MzQ3OThmNTQxZS9wYWNrYWdlcy9jb3JlL3NyYy96b25lL25nX3pvbmUudHMjTDE0NCxcbiAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9hMTRkYzJkN2E0ODIxYTE5ZjIwYTk1NDcwNTNhNTczNDc5OGY1NDFlL3BhY2thZ2VzL2NvcmUvc3JjL3pvbmUvbmdfem9uZS50cyNMMjU3XG4gIG9wdHMuTmdab25lLmlzSW5Bbmd1bGFyWm9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHdpbmRvdy5ab25lLmN1cnJlbnQuX3Byb3BlcnRpZXNbb3B0cy56b25lSWRlbnRpZmllcl0gPT09IHRydWU7XG4gIH07XG5cbiAgb3B0cy5yb3V0aW5nRXZlbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICBvcHRzLmJvb3RzdHJhcHBlZE5nWm9uZSEucnVuKCgpID0+IHtcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZ2xlLXNwYS9zaW5nbGUtc3BhLWFuZ3VsYXIvaXNzdWVzLzg2XG4gICAgICAvLyBab25lIGlzIHVuYXdhcmUgb2YgdGhlIHNpbmdsZS1zcGEgbmF2aWdhdGlvbiBjaGFuZ2UgYW5kIHNvIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBkb2Vzbid0IHdvcmtcbiAgICAgIC8vIHVubGVzcyB3ZSB0ZWxsIFpvbmUgdGhhdCBzb21ldGhpbmcgaGFwcGVuZWRcbiAgICB9KTtcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbW91bnQob3B0czogU2luZ2xlU3BhQW5ndWxhck9wdHMsIHByb3BzOiBhbnkpOiBQcm9taXNlPE5nTW9kdWxlUmVmPGFueT4+IHtcbiAgY29uc3QgZG9tRWxlbWVudEdldHRlciA9IGNob29zZURvbUVsZW1lbnRHZXR0ZXIob3B0cywgcHJvcHMpO1xuXG4gIGlmICghZG9tRWxlbWVudEdldHRlcikge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYGNhbm5vdCBtb3VudCBhbmd1bGFyIGFwcGxpY2F0aW9uICcke1xuICAgICAgICBwcm9wcy5uYW1lIHx8IHByb3BzLmFwcE5hbWVcbiAgICAgIH0nIHdpdGhvdXQgYSBkb21FbGVtZW50R2V0dGVyIHByb3ZpZGVkIGVpdGhlciBhcyBhbiBvcHQgb3IgYSBwcm9wYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29udGFpbmVyRWwgPSBnZXRDb250YWluZXJFbChkb21FbGVtZW50R2V0dGVyKTtcbiAgY29udGFpbmVyRWwuaW5uZXJIVE1MID0gb3B0cy50ZW1wbGF0ZTtcbiAgY29uc3QgYm9vdHN0cmFwUHJvbWlzZSA9IG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24ocHJvcHMpO1xuXG4gIGlmICghKGJvb3RzdHJhcFByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYHNpbmdsZS1zcGEtYW5ndWxhcjogdGhlIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlLCBidXQgaW5zdGVhZCByZXR1cm5lZCBhICcke3R5cGVvZiBib290c3RyYXBQcm9taXNlfScgdGhhdCBpcyBub3QgYSBQcm9taXNlYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlOiBOZ01vZHVsZVJlZjxhbnk+ID0gYXdhaXQgYm9vdHN0cmFwUHJvbWlzZTtcblxuICBpZiAoIW1vZHVsZSB8fCB0eXBlb2YgbW9kdWxlLmRlc3Ryb3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBzaW5nbGUtc3BhLWFuZ3VsYXI6IHRoZSBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uIHJldHVybmVkIGEgcHJvbWlzZSB0aGF0IGRpZCBub3QgcmVzb2x2ZSB3aXRoIGEgdmFsaWQgQW5ndWxhciBtb2R1bGUuIERpZCB5b3UgY2FsbCBwbGF0Zm9ybUJyb3dzZXIoKS5ib290c3RyYXBNb2R1bGVGYWN0b3J5KCkgY29ycmVjdGx5P2AsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb246IFNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24gfCBudWxsID0gbW9kdWxlLmluamVjdG9yLmdldChcbiAgICBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLFxuICAgIG51bGwsXG4gICk7XG5cbiAgY29uc3Qgbmdab25lRW5hYmxlZCA9IG9wdHMuTmdab25lICE9PSAnbm9vcCc7XG5cbiAgLy8gVGhlIHVzZXIgaGFzIHRvIHByb3ZpZGUgYEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uYCBvbmx5IGlmIGhpcyBhcHBsaWNhdGlvbiB1c2VzIHJvdXRpbmcuXG4gIC8vIFNvIGlmIGhlIHByb3ZpZGVkIGBSb3V0ZXJgIGJ1dCBkaWRuJ3QgcHJvdmlkZSBgQnJvd3NlclBsYXRmb3JtTG9jYXRpb25gIHRoZW4gd2UgaGF2ZSB0byBpbmZvcm0gaGltLlxuICAvLyBBbHNvIGBnZXRTaW5nbGVTcGFFeHRyYVByb3ZpZGVycygpYCBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgdGhlIHVzZXIgZG9lc24ndCB1c2VcbiAgLy8gYHpvbmUtbGVzc2AgY2hhbmdlIGRldGVjdGlvbiwgaWYgYE5nWm9uZWAgaXMgYG5vb3BgIHRoZW4gd2UgY2FuIHNraXAgaXQuXG4gIGlmIChuZ1pvbmVFbmFibGVkICYmIG9wdHMuUm91dGVyICYmIHNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24gPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFx0XG4gICAgICBzaW5nbGUtc3BhLWFuZ3VsYXI6IGNvdWxkIG5vdCByZXRyaWV2ZSBleHRyYSBwcm92aWRlcnMgZnJvbSB0aGUgcGxhdGZvcm0gaW5qZWN0b3IuIERpZCB5b3UgY2FsbCBnZXRTaW5nbGVTcGFFeHRyYVByb3ZpZGVycygpIHdoZW4gY3JlYXRpbmcgcGxhdGZvcm0/XHRcbiAgICBgKTtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcHBlZE9wdHMgPSBvcHRzIGFzIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzO1xuXG4gIGlmIChuZ1pvbmVFbmFibGVkKSB7XG4gICAgY29uc3Qgbmdab25lOiBpbXBvcnQoJ0Bhbmd1bGFyL2NvcmUnKS5OZ1pvbmUgPSBtb2R1bGUuaW5qZWN0b3IuZ2V0KG9wdHMuTmdab25lKTtcblxuICAgIC8vIGBOZ1pvbmVgIGNhbiBiZSBlbmFibGVkIGJ1dCByb3V0aW5nIG1heSBub3QgYmUgdXNlZCB0aHVzIGBnZXRTaW5nbGVTcGFFeHRyYVByb3ZpZGVycygpYFxuICAgIC8vIGZ1bmN0aW9uIHdhcyBub3QgY2FsbGVkLlxuICAgIGlmIChzaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uICE9PSBudWxsKSB7XG4gICAgICBzaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLnNldE5nWm9uZShuZ1pvbmUpO1xuICAgICAgLy8gQ2xlYW51cCByZXNvdXJjZXMsIGVzcGVjaWFsbHkgcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB0aHVzIHRoZXkgd2lsbCBub3QgYmUgYWRkZWRcbiAgICAgIC8vIHR3aWNlIHdoZW4gYXBwbGljYXRpb24gZ2V0cyBib290c3RyYXBwZWQgdGhlIHNlY29uZCB0aW1lLlxuICAgICAgbW9kdWxlLm9uRGVzdHJveSgoKSA9PiBzaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLmRlc3Ryb3koKSk7XG4gICAgfVxuXG4gICAgYm9vdHN0cmFwcGVkT3B0cy5ib290c3RyYXBwZWROZ1pvbmUgPSBuZ1pvbmU7XG4gICAgYm9vdHN0cmFwcGVkT3B0cy5ib290c3RyYXBwZWROZ1pvbmVbJ19pbm5lciddLl9wcm9wZXJ0aWVzW1xuICAgICAgYm9vdHN0cmFwcGVkT3B0cy56b25lSWRlbnRpZmllclxuICAgIF0gPSB0cnVlO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzaW5nbGUtc3BhOnJvdXRpbmctZXZlbnQnLCBib290c3RyYXBwZWRPcHRzLnJvdXRpbmdFdmVudExpc3RlbmVyISk7XG4gIH1cblxuICBib290c3RyYXBwZWRPcHRzLmJvb3RzdHJhcHBlZE1vZHVsZSA9IG1vZHVsZTtcbiAgcmV0dXJuIG1vZHVsZTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuYXN5bmMgZnVuY3Rpb24gdW5tb3VudChvcHRzOiBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cywgcHJvcHM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAob3B0cy5Sb3V0ZXIpIHtcbiAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xOTA3OVxuICAgIGNvbnN0IHJvdXRlciA9IG9wdHMuYm9vdHN0cmFwcGVkTW9kdWxlLmluamVjdG9yLmdldChvcHRzLlJvdXRlcik7XG4gICAgcm91dGVyLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIGlmIChvcHRzLnJvdXRpbmdFdmVudExpc3RlbmVyKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NpbmdsZS1zcGE6cm91dGluZy1ldmVudCcsIG9wdHMucm91dGluZ0V2ZW50TGlzdGVuZXIpO1xuICB9XG5cbiAgaWYgKG9wdHMuQW5pbWF0aW9uRW5naW5lKSB7XG4gICAgLypcbiAgICBUaGUgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgZG9lcyBub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmIDonKC4gV2hlbiB5b3UgdW5tb3VudC9kZXN0cm95IHRoZSBtYWluIG1vZHVsZSwgdGhlXG4gICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgdXNlcyBhbiBBbmltYXRpb25SZW5kZXJlciB0aGluZyB0byByZW1vdmUgZG9tIGVsZW1lbnRzIGZyb20gdGhlIHBhZ2UuIEJ1dCB0aGUgQW5pbWF0aW9uUmVuZGVyZXJcbiAgICBkZWZlcnMgdGhlIGFjdHVhbCB3b3JrIHRvIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIHRvIGRvIHRoaXMsIGFuZCB0aGUgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZSBkb2Vzbid0IGFjdHVhbGx5XG4gICAgcmVtb3ZlIHRoZSBkb20gbm9kZSwgYnV0IGp1c3QgY2FsbHMgXCJtYXJrRWxlbWVudEFzUmVtb3ZlZCgpXCIuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL2RiNjJjY2Y5ZWI0NmVlODkzNjZhZGU1ODYzNjVlYTAyN2JiOTNlYjEvcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdHJhbnNpdGlvbl9hbmltYXRpb25fZW5naW5lLnRzI0w3MTdcblxuICAgIFdoYXQgbWFya0FzUmVtb3ZlZERvZXMgaXMgcHV0IGl0IGludG8gYW4gYXJyYXkgY2FsbGVkIFwiY29sbGVjdGVkTGVhdmVFbGVtZW50c1wiLCB3aGljaCBpcyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWRcbiAgICBhZnRlciB0aGUgRE9NIGhhcyBoYWQgYSBjaGFuY2UgdG8gZG8gYW55IGFuaW1hdGlvbnMuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9wYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3JlbmRlci90cmFuc2l0aW9uX2FuaW1hdGlvbl9lbmdpbmUudHMjTDUyNVxuXG4gICAgVGhlIGFjdHVhbCBkb20gbm9kZXMgYXJlbid0IHJlbW92ZWQgdW50aWwgdGhlIFRyYW5zaXRpb25BbmltYXRpb25FbmdpbmUgXCJmbHVzaGVzXCIuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL2RiNjJjY2Y5ZWI0NmVlODkzNjZhZGU1ODYzNjVlYTAyN2JiOTNlYjEvcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdHJhbnNpdGlvbl9hbmltYXRpb25fZW5naW5lLnRzI0w4NTFcblxuICAgIFVuZm9ydHVuYXRlbHksIHRob3VnaCwgdGhhdCBcImZsdXNoXCIgd2lsbCBuZXZlciBoYXBwZW4sIHNpbmNlIHRoZSBlbnRpcmUgbW9kdWxlIGlzIGJlaW5nIGRlc3Ryb3llZCBhbmQgdGhlcmUgd2lsbCBiZSBubyBtb3JlIGZsdXNoZXMuXG4gICAgU28gd2hhdCB3ZSBkbyBpbiB0aGlzIGNvZGUgaXMgZm9yY2Ugb25lIG1vcmUgZmx1c2ggb2YgdGhlIGFuaW1hdGlvbnMgYWZ0ZXIgdGhlIG1vZHVsZSBpcyBkZXN0cm95ZWQuXG5cbiAgICBJZGVhbGx5LCB3ZSB3b3VsZCBkbyB0aGlzIGJ5IGdldHRpbmcgdGhlIFRyYW5zaXRpb25BbmltYXRpb25FbmdpbmUgZGlyZWN0bHkgYW5kIGZsdXNoaW5nIGl0LiBVbmZvcnR1bmF0ZWx5LCB0aG91Z2gsIGl0J3MgcHJpdmF0ZSBjbGFzc1xuICAgIHRoYXQgY2Fubm90IGJlIGltcG9ydGVkIGFuZCBpcyBub3QgcHJvdmlkZWQgdG8gdGhlIGRlcGVuZGVuY3kgaW5qZWN0b3IuIFNvLCBpbnN0ZWFkLCB3ZSBnZXQgaXRzIHdyYXBwZXIgY2xhc3MsIEFuaW1hdGlvbkVuZ2luZSwgYW5kIHRoZW5cbiAgICBhY2Nlc3MgaXRzIHByaXZhdGUgdmFyaWFibGUgcmVmZXJlbmNlIHRvIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIHNvIHRoYXQgd2UgY2FuIGNhbGwgZmx1c2guXG4gICAgKi9cbiAgICBjb25zdCBhbmltYXRpb25FbmdpbmUgPSBvcHRzLmJvb3RzdHJhcHBlZE1vZHVsZS5pbmplY3Rvci5nZXQob3B0cy5BbmltYXRpb25FbmdpbmUpO1xuICAgIGFuaW1hdGlvbkVuZ2luZS5fdHJhbnNpdGlvbkVuZ2luZS5mbHVzaCgpO1xuICB9XG5cbiAgb3B0cy5ib290c3RyYXBwZWRNb2R1bGUuZGVzdHJveSgpO1xuICBkZWxldGUgb3B0cy5ib290c3RyYXBwZWRNb2R1bGU7XG5cbiAgLy8gVGhpcyBpcyBhbiBpc3N1ZS4gSXNzdWUgaGFzIGJlZW4gY3JlYXRlZCBhbmQgQW5ndWxhciB0ZWFtIGlzIHdvcmtpbmcgb24gdGhlIGZpeDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzY0NDlcbiAgcmVtb3ZlQXBwbGljYXRpb25Gcm9tRE9NSWZJdnlFbmFibGVkKG9wdHMsIHByb3BzKTtcbn1cbiJdfQ== |
@@ -1,2 +0,2 @@ | ||
import { __decorate, __extends } from "tslib"; | ||
import { __decorate, __extends, __values } from "tslib"; | ||
import { Injectable, Inject } from '@angular/core'; | ||
@@ -7,15 +7,67 @@ import { ɵBrowserPlatformLocation, PlatformLocation, DOCUMENT, } from '@angular/common'; | ||
function SingleSpaPlatformLocation() { | ||
return _super !== null && _super.apply(this, arguments) || this; | ||
var _this = _super !== null && _super.apply(this, arguments) || this; | ||
// This is a simple marker that helps us to ignore PopStateEvents | ||
// that was not dispatched by the browser. | ||
_this.skipNextPopState = false; | ||
_this.onPopStateListeners = []; | ||
return _this; | ||
} | ||
SingleSpaPlatformLocation.prototype.destroy = function () { | ||
// TLDR: Angular adds `popstate` event listener and then doesn't remove it when application gets destroyed. | ||
// Basically, Angular has a potentional memory leak. The `ɵBrowserPlatformLocation` | ||
// has `onPopState` method which adds `popstate` event listener and forgets, see here: | ||
// https://github.com/angular/angular/blob/14be55c9facf3e47b8c97df4502dc3f0f897da03/packages/common/src/location/platform_location.ts#L126 | ||
var e_1, _a; | ||
try { | ||
for (var _b = __values(this.onPopStateListeners), _c = _b.next(); !_c.done; _c = _b.next()) { | ||
var onPopStateListener = _c.value; | ||
window.removeEventListener('popstate', onPopStateListener); | ||
} | ||
} | ||
catch (e_1_1) { e_1 = { error: e_1_1 }; } | ||
finally { | ||
try { | ||
if (_c && !_c.done && (_a = _b.return)) _a.call(_b); | ||
} | ||
finally { if (e_1) throw e_1.error; } | ||
} | ||
// We do this because the `SingleSpaPlatformLocation` is a part of PLATFORM_INJECTOR, | ||
// which means it's created only once and will not be garbage collected, since the PLATFORM_INJECTOR | ||
// will keep reference to its instance. | ||
// TODO: https://github.com/single-spa/single-spa-angular/issues/170 | ||
this.onPopStateListeners = []; | ||
}; | ||
SingleSpaPlatformLocation.prototype.pushState = function (state, title, url) { | ||
this.skipNextPopState = true; | ||
_super.prototype.pushState.call(this, state, title, url); | ||
}; | ||
SingleSpaPlatformLocation.prototype.replaceState = function (state, title, url) { | ||
this.skipNextPopState = true; | ||
_super.prototype.replaceState.call(this, state, title, url); | ||
}; | ||
SingleSpaPlatformLocation.prototype.onPopState = function (fn) { | ||
var _this = this; | ||
_super.prototype.onPopState.call(this, function (event) { | ||
// Wrap any event listener into zone that is specific to some application. | ||
// The main issue is `back/forward` buttons of browsers, because they invoke | ||
// `history.back|forward` which dispatch `popstate` event. Since `single-spa` | ||
// overrides `history.replaceState` Angular's zone cannot intercept this event. | ||
// Only the root zone is able to intercept all events. | ||
// See https://github.com/single-spa/single-spa-angular/issues/94 for more detail | ||
_this.ngZone.run(function () { return fn(event); }); | ||
}); | ||
var onPopStateListener = function (event) { | ||
// The `LocationChangeEvent` doesn't have the `singleSpa` property, since it's added | ||
// by `single-spa` starting from `5.4` version. We need this check because we want | ||
// to skip "unnatural" PopStateEvents, the one caused by `single-spa`. | ||
var popStateEventWasDispatchedBySingleSpa = !!event | ||
.singleSpa; | ||
if (_this.skipNextPopState && popStateEventWasDispatchedBySingleSpa) { | ||
_this.skipNextPopState = false; | ||
} | ||
else { | ||
// Wrap any event listener into zone that is specific to some application. | ||
// The main issue is `back/forward` buttons of browsers, because they invoke | ||
// `history.back|forward` which dispatch `popstate` event. Since `single-spa` | ||
// overrides `history.replaceState` Angular's zone cannot intercept this event. | ||
// Only the root zone is able to intercept all events. | ||
// See https://github.com/single-spa/single-spa-angular/issues/94 for more details | ||
_this.ngZone.run(function () { return fn(event); }); | ||
} | ||
}; | ||
// All listeners should be stored inside an array because the `onPopState` can be called | ||
// multiple times thus we wanna reference all listeners to remove them further. | ||
this.onPopStateListeners.push(onPopStateListener); | ||
_super.prototype.onPopState.call(this, onPopStateListener); | ||
}; | ||
@@ -49,2 +101,2 @@ SingleSpaPlatformLocation.prototype.setNgZone = function (ngZone) { | ||
} | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmEtcHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vc2luZ2xlLXNwYS1hbmd1bGFyLyIsInNvdXJjZXMiOlsic3JjL2V4dHJhLXByb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBMEIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBRWhCLFFBQVEsR0FDVCxNQUFNLGlCQUFpQixDQUFDO0FBR3pCO0lBQStDLDZDQUF3QjtJQUF2RTs7SUF1QkEsQ0FBQztJQWZDLDhDQUFVLEdBQVYsVUFBVyxFQUF3QztRQUFuRCxpQkFVQztRQVRDLGlCQUFNLFVBQVUsWUFBQyxVQUFBLEtBQUs7WUFDcEIsMEVBQTBFO1lBQzFFLDRFQUE0RTtZQUM1RSw2RUFBNkU7WUFDN0UsK0VBQStFO1lBQy9FLHNEQUFzRDtZQUN0RCxpRkFBaUY7WUFDakYsS0FBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBTSxPQUFBLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBVCxDQUFTLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCw2Q0FBUyxHQUFULFVBQVUsTUFBYztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBdEJVLHlCQUF5QjtRQURyQyxVQUFVLEVBQUU7T0FDQSx5QkFBeUIsQ0F1QnJDO0lBQUQsZ0NBQUM7Q0FBQSxBQXZCRCxDQUErQyx3QkFBd0IsR0F1QnRFO1NBdkJZLHlCQUF5QjtBQXlCdEM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsT0FBTztRQUNMO1lBQ0UsT0FBTyxFQUFFLHlCQUF5QjtZQUNsQyxRQUFRLEVBQUUseUJBQXlCO1lBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUMvQjtRQUNEO1lBQ0UsT0FBTyxFQUFFLGdCQUFnQjtZQUN6QixXQUFXLEVBQUUseUJBQXlCO1NBQ3ZDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUsIFN0YXRpY1Byb3ZpZGVyLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIMm1QnJvd3NlclBsYXRmb3JtTG9jYXRpb24sXG4gIFBsYXRmb3JtTG9jYXRpb24sXG4gIExvY2F0aW9uQ2hhbmdlRXZlbnQsXG4gIERPQ1VNRU5ULFxufSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbiBleHRlbmRzIMm1QnJvd3NlclBsYXRmb3JtTG9jYXRpb24ge1xuICAvKipcbiAgICogV2UgY291bGQgdXNlIHRoZSBgaW5qZWN0YCBmdW5jdGlvbiBmcm9tIGBAYW5ndWxhci9jb3JlYCB3aGljaCByZXNvbHZlc1xuICAgKiBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbmplY3RvciwgYnV0IGl0J3MgYSBmZWF0dXJlXG4gICAqIG9mIEFuZ3VsYXIgOCsuIFNob3VsZCBiZSB1c2VkIHdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBvbGRlciB2ZXJzaW9ucy5cbiAgICovXG4gIHByaXZhdGUgbmdab25lITogTmdab25lO1xuXG4gIG9uUG9wU3RhdGUoZm46IChldmVudDogTG9jYXRpb25DaGFuZ2VFdmVudCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHN1cGVyLm9uUG9wU3RhdGUoZXZlbnQgPT4ge1xuICAgICAgLy8gV3JhcCBhbnkgZXZlbnQgbGlzdGVuZXIgaW50byB6b25lIHRoYXQgaXMgc3BlY2lmaWMgdG8gc29tZSBhcHBsaWNhdGlvbi5cbiAgICAgIC8vIFRoZSBtYWluIGlzc3VlIGlzIGBiYWNrL2ZvcndhcmRgIGJ1dHRvbnMgb2YgYnJvd3NlcnMsIGJlY2F1c2UgdGhleSBpbnZva2VcbiAgICAgIC8vIGBoaXN0b3J5LmJhY2t8Zm9yd2FyZGAgd2hpY2ggZGlzcGF0Y2ggYHBvcHN0YXRlYCBldmVudC4gU2luY2UgYHNpbmdsZS1zcGFgXG4gICAgICAvLyBvdmVycmlkZXMgYGhpc3RvcnkucmVwbGFjZVN0YXRlYCBBbmd1bGFyJ3Mgem9uZSBjYW5ub3QgaW50ZXJjZXB0IHRoaXMgZXZlbnQuXG4gICAgICAvLyBPbmx5IHRoZSByb290IHpvbmUgaXMgYWJsZSB0byBpbnRlcmNlcHQgYWxsIGV2ZW50cy5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZ2xlLXNwYS9zaW5nbGUtc3BhLWFuZ3VsYXIvaXNzdWVzLzk0IGZvciBtb3JlIGRldGFpbFxuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IGZuKGV2ZW50KSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXROZ1pvbmUobmdab25lOiBOZ1pvbmUpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZSA9IG5nWm9uZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBgUGxhdGZvcm1Mb2NhdGlvbmAgY2xhc3MgaXMgYW4gXCJpbmplY3RlZVwiIG9mIHRoZSBgUGF0aExvY2F0aW9uU3RyYXRlZ3lgLFxuICogd2hpY2ggY3JlYXRlcyBgU3ViamVjdGAgaW50ZXJuYWxseSBmb3IgbGlzdGVuaW5nIG9uIGBwb3BzdGF0ZWAgZXZlbnRzLiBXZSB3YW50XG4gKiB0byBwcm92aWRlIHRoaXMgY2xhc3MgaW4gdGhlIG1vc3QgdG9wIGluamVjdG9yIHRoYXQncyB1c2VkIGR1cmluZyBib290c3RyYXBwaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2luZ2xlU3BhRXh0cmFQcm92aWRlcnMoKTogU3RhdGljUHJvdmlkZXJbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbixcbiAgICAgIHVzZUNsYXNzOiBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLFxuICAgICAgZGVwczogW1tuZXcgSW5qZWN0KERPQ1VNRU5UKV1dLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogUGxhdGZvcm1Mb2NhdGlvbixcbiAgICAgIHVzZUV4aXN0aW5nOiBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLFxuICAgIH0sXG4gIF07XG59XG4iXX0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmEtcHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vc2luZ2xlLXNwYS1hbmd1bGFyLyIsInNvdXJjZXMiOlsic3JjL2V4dHJhLXByb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBMEIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBRWhCLFFBQVEsR0FDVCxNQUFNLGlCQUFpQixDQUFDO0FBR3pCO0lBQStDLDZDQUF3QjtJQUF2RTtRQUFBLHFFQWtFQztRQS9EQyxpRUFBaUU7UUFDakUsMENBQTBDO1FBQ2xDLHNCQUFnQixHQUFHLEtBQUssQ0FBQztRQUV6Qix5QkFBbUIsR0FBNkMsRUFBRSxDQUFDOztJQTJEN0UsQ0FBQztJQXpEQywyQ0FBTyxHQUFQO1FBQ0UsMkdBQTJHO1FBQzNHLG1GQUFtRjtRQUNuRixzRkFBc0Y7UUFDdEYsMElBQTBJOzs7WUFFMUksS0FBaUMsSUFBQSxLQUFBLFNBQUEsSUFBSSxDQUFDLG1CQUFtQixDQUFBLGdCQUFBLDRCQUFFO2dCQUF0RCxJQUFNLGtCQUFrQixXQUFBO2dCQUMzQixNQUFNLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLENBQUM7YUFDNUQ7Ozs7Ozs7OztRQUVELHFGQUFxRjtRQUNyRixvR0FBb0c7UUFDcEcsdUNBQXVDO1FBQ3ZDLG9FQUFvRTtRQUNwRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCw2Q0FBUyxHQUFULFVBQVUsS0FBVSxFQUFFLEtBQWEsRUFBRSxHQUFXO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsaUJBQU0sU0FBUyxZQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGdEQUFZLEdBQVosVUFBYSxLQUFVLEVBQUUsS0FBYSxFQUFFLEdBQVc7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixpQkFBTSxZQUFZLFlBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsOENBQVUsR0FBVixVQUFXLEVBQXdDO1FBQW5ELGlCQXlCQztRQXhCQyxJQUFNLGtCQUFrQixHQUFHLFVBQUMsS0FBMEI7WUFDcEQsb0ZBQW9GO1lBQ3BGLGtGQUFrRjtZQUNsRixzRUFBc0U7WUFDdEUsSUFBTSxxQ0FBcUMsR0FBRyxDQUFDLENBQUcsS0FBNEM7aUJBQzNGLFNBQVMsQ0FBQztZQUViLElBQUksS0FBSSxDQUFDLGdCQUFnQixJQUFJLHFDQUFxQyxFQUFFO2dCQUNsRSxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNMLDBFQUEwRTtnQkFDMUUsNEVBQTRFO2dCQUM1RSw2RUFBNkU7Z0JBQzdFLCtFQUErRTtnQkFDL0Usc0RBQXNEO2dCQUN0RCxrRkFBa0Y7Z0JBQ2xGLEtBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQU0sT0FBQSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQVQsQ0FBUyxDQUFDLENBQUM7YUFDbEM7UUFDSCxDQUFDLENBQUM7UUFFRix3RkFBd0Y7UUFDeEYsK0VBQStFO1FBQy9FLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNsRCxpQkFBTSxVQUFVLFlBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsNkNBQVMsR0FBVCxVQUFVLE1BQWM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQWpFVSx5QkFBeUI7UUFEckMsVUFBVSxFQUFFO09BQ0EseUJBQXlCLENBa0VyQztJQUFELGdDQUFDO0NBQUEsQUFsRUQsQ0FBK0Msd0JBQXdCLEdBa0V0RTtTQWxFWSx5QkFBeUI7QUFvRXRDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCO0lBQ3hDLE9BQU87UUFDTDtZQUNFLE9BQU8sRUFBRSx5QkFBeUI7WUFDbEMsUUFBUSxFQUFFLHlCQUF5QjtZQUNuQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDL0I7UUFDRDtZQUNFLE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsV0FBVyxFQUFFLHlCQUF5QjtTQUN2QztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lLCBTdGF0aWNQcm92aWRlciwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICDJtUJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLFxuICBQbGF0Zm9ybUxvY2F0aW9uLFxuICBMb2NhdGlvbkNoYW5nZUV2ZW50LFxuICBET0NVTUVOVCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24gZXh0ZW5kcyDJtUJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uIHtcbiAgcHJpdmF0ZSBuZ1pvbmUhOiBOZ1pvbmU7XG5cbiAgLy8gVGhpcyBpcyBhIHNpbXBsZSBtYXJrZXIgdGhhdCBoZWxwcyB1cyB0byBpZ25vcmUgUG9wU3RhdGVFdmVudHNcbiAgLy8gdGhhdCB3YXMgbm90IGRpc3BhdGNoZWQgYnkgdGhlIGJyb3dzZXIuXG4gIHByaXZhdGUgc2tpcE5leHRQb3BTdGF0ZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgb25Qb3BTdGF0ZUxpc3RlbmVyczogKChldmVudDogTG9jYXRpb25DaGFuZ2VFdmVudCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gVExEUjogQW5ndWxhciBhZGRzIGBwb3BzdGF0ZWAgZXZlbnQgbGlzdGVuZXIgYW5kIHRoZW4gZG9lc24ndCByZW1vdmUgaXQgd2hlbiBhcHBsaWNhdGlvbiBnZXRzIGRlc3Ryb3llZC5cbiAgICAvLyBCYXNpY2FsbHksIEFuZ3VsYXIgaGFzIGEgcG90ZW50aW9uYWwgbWVtb3J5IGxlYWsuIFRoZSBgybVCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbmBcbiAgICAvLyBoYXMgYG9uUG9wU3RhdGVgIG1ldGhvZCB3aGljaCBhZGRzIGBwb3BzdGF0ZWAgZXZlbnQgbGlzdGVuZXIgYW5kIGZvcmdldHMsIHNlZSBoZXJlOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi8xNGJlNTVjOWZhY2YzZTQ3YjhjOTdkZjQ1MDJkYzNmMGY4OTdkYTAzL3BhY2thZ2VzL2NvbW1vbi9zcmMvbG9jYXRpb24vcGxhdGZvcm1fbG9jYXRpb24udHMjTDEyNlxuXG4gICAgZm9yIChjb25zdCBvblBvcFN0YXRlTGlzdGVuZXIgb2YgdGhpcy5vblBvcFN0YXRlTGlzdGVuZXJzKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBvblBvcFN0YXRlTGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgYFNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb25gIGlzIGEgcGFydCBvZiBQTEFURk9STV9JTkpFQ1RPUixcbiAgICAvLyB3aGljaCBtZWFucyBpdCdzIGNyZWF0ZWQgb25seSBvbmNlIGFuZCB3aWxsIG5vdCBiZSBnYXJiYWdlIGNvbGxlY3RlZCwgc2luY2UgdGhlIFBMQVRGT1JNX0lOSkVDVE9SXG4gICAgLy8gd2lsbCBrZWVwIHJlZmVyZW5jZSB0byBpdHMgaW5zdGFuY2UuXG4gICAgLy8gVE9ETzogaHR0cHM6Ly9naXRodWIuY29tL3NpbmdsZS1zcGEvc2luZ2xlLXNwYS1hbmd1bGFyL2lzc3Vlcy8xNzBcbiAgICB0aGlzLm9uUG9wU3RhdGVMaXN0ZW5lcnMgPSBbXTtcbiAgfVxuXG4gIHB1c2hTdGF0ZShzdGF0ZTogYW55LCB0aXRsZTogc3RyaW5nLCB1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2tpcE5leHRQb3BTdGF0ZSA9IHRydWU7XG4gICAgc3VwZXIucHVzaFN0YXRlKHN0YXRlLCB0aXRsZSwgdXJsKTtcbiAgfVxuXG4gIHJlcGxhY2VTdGF0ZShzdGF0ZTogYW55LCB0aXRsZTogc3RyaW5nLCB1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2tpcE5leHRQb3BTdGF0ZSA9IHRydWU7XG4gICAgc3VwZXIucmVwbGFjZVN0YXRlKHN0YXRlLCB0aXRsZSwgdXJsKTtcbiAgfVxuXG4gIG9uUG9wU3RhdGUoZm46IChldmVudDogTG9jYXRpb25DaGFuZ2VFdmVudCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IG9uUG9wU3RhdGVMaXN0ZW5lciA9IChldmVudDogTG9jYXRpb25DaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgLy8gVGhlIGBMb2NhdGlvbkNoYW5nZUV2ZW50YCBkb2Vzbid0IGhhdmUgdGhlIGBzaW5nbGVTcGFgIHByb3BlcnR5LCBzaW5jZSBpdCdzIGFkZGVkXG4gICAgICAvLyBieSBgc2luZ2xlLXNwYWAgc3RhcnRpbmcgZnJvbSBgNS40YCB2ZXJzaW9uLiBXZSBuZWVkIHRoaXMgY2hlY2sgYmVjYXVzZSB3ZSB3YW50XG4gICAgICAvLyB0byBza2lwIFwidW5uYXR1cmFsXCIgUG9wU3RhdGVFdmVudHMsIHRoZSBvbmUgY2F1c2VkIGJ5IGBzaW5nbGUtc3BhYC5cbiAgICAgIGNvbnN0IHBvcFN0YXRlRXZlbnRXYXNEaXNwYXRjaGVkQnlTaW5nbGVTcGEgPSAhISgoZXZlbnQgYXMgdW5rbm93bikgYXMgeyBzaW5nbGVTcGE6IGJvb2xlYW4gfSlcbiAgICAgICAgLnNpbmdsZVNwYTtcblxuICAgICAgaWYgKHRoaXMuc2tpcE5leHRQb3BTdGF0ZSAmJiBwb3BTdGF0ZUV2ZW50V2FzRGlzcGF0Y2hlZEJ5U2luZ2xlU3BhKSB7XG4gICAgICAgIHRoaXMuc2tpcE5leHRQb3BTdGF0ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV3JhcCBhbnkgZXZlbnQgbGlzdGVuZXIgaW50byB6b25lIHRoYXQgaXMgc3BlY2lmaWMgdG8gc29tZSBhcHBsaWNhdGlvbi5cbiAgICAgICAgLy8gVGhlIG1haW4gaXNzdWUgaXMgYGJhY2svZm9yd2FyZGAgYnV0dG9ucyBvZiBicm93c2VycywgYmVjYXVzZSB0aGV5IGludm9rZVxuICAgICAgICAvLyBgaGlzdG9yeS5iYWNrfGZvcndhcmRgIHdoaWNoIGRpc3BhdGNoIGBwb3BzdGF0ZWAgZXZlbnQuIFNpbmNlIGBzaW5nbGUtc3BhYFxuICAgICAgICAvLyBvdmVycmlkZXMgYGhpc3RvcnkucmVwbGFjZVN0YXRlYCBBbmd1bGFyJ3Mgem9uZSBjYW5ub3QgaW50ZXJjZXB0IHRoaXMgZXZlbnQuXG4gICAgICAgIC8vIE9ubHkgdGhlIHJvb3Qgem9uZSBpcyBhYmxlIHRvIGludGVyY2VwdCBhbGwgZXZlbnRzLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbmdsZS1zcGEvc2luZ2xlLXNwYS1hbmd1bGFyL2lzc3Vlcy85NCBmb3IgbW9yZSBkZXRhaWxzXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiBmbihldmVudCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSBzdG9yZWQgaW5zaWRlIGFuIGFycmF5IGJlY2F1c2UgdGhlIGBvblBvcFN0YXRlYCBjYW4gYmUgY2FsbGVkXG4gICAgLy8gbXVsdGlwbGUgdGltZXMgdGh1cyB3ZSB3YW5uYSByZWZlcmVuY2UgYWxsIGxpc3RlbmVycyB0byByZW1vdmUgdGhlbSBmdXJ0aGVyLlxuICAgIHRoaXMub25Qb3BTdGF0ZUxpc3RlbmVycy5wdXNoKG9uUG9wU3RhdGVMaXN0ZW5lcik7XG4gICAgc3VwZXIub25Qb3BTdGF0ZShvblBvcFN0YXRlTGlzdGVuZXIpO1xuICB9XG5cbiAgc2V0Tmdab25lKG5nWm9uZTogTmdab25lKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgYFBsYXRmb3JtTG9jYXRpb25gIGNsYXNzIGlzIGFuIFwiaW5qZWN0ZWVcIiBvZiB0aGUgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YCxcbiAqIHdoaWNoIGNyZWF0ZXMgYFN1YmplY3RgIGludGVybmFsbHkgZm9yIGxpc3RlbmluZyBvbiBgcG9wc3RhdGVgIGV2ZW50cy4gV2Ugd2FudFxuICogdG8gcHJvdmlkZSB0aGlzIGNsYXNzIGluIHRoZSBtb3N0IHRvcCBpbmplY3RvciB0aGF0J3MgdXNlZCBkdXJpbmcgYm9vdHN0cmFwcGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNpbmdsZVNwYUV4dHJhUHJvdmlkZXJzKCk6IFN0YXRpY1Byb3ZpZGVyW10ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24sXG4gICAgICB1c2VDbGFzczogU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbixcbiAgICAgIGRlcHM6IFtbbmV3IEluamVjdChET0NVTUVOVCldXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBsYXRmb3JtTG9jYXRpb24sXG4gICAgICB1c2VFeGlzdGluZzogU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbixcbiAgICB9LFxuICBdO1xufVxuIl19 |
import { __assign, __awaiter, __generator } from "tslib"; | ||
import { getContainerEl, chooseDomElementGetter, removeApplicationFromDOMIfIvyEnabled, } from 'single-spa-angular/internals'; | ||
import { SingleSpaPlatformLocation } from './extra-providers'; | ||
@@ -38,2 +39,8 @@ var defaultOpts = { | ||
return __generator(this, function (_a) { | ||
// Angular provides an opportunity to develop `zone-less` application, where developers | ||
// have to trigger change detection manually. | ||
// See https://angular.io/guide/zone#noopzone | ||
if (opts.NgZone === 'noop') { | ||
return [2 /*return*/]; | ||
} | ||
// In order for multiple Angular apps to work concurrently on a page, they each need a unique identifier. | ||
@@ -63,3 +70,3 @@ opts.zoneIdentifier = "single-spa-angular:" + (props.name || props.appName); | ||
return __awaiter(this, void 0, void 0, function () { | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, bootstrappedOpts, ngZone; | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, ngZoneEnabled, bootstrappedOpts, ngZone; | ||
return __generator(this, function (_a) { | ||
@@ -85,13 +92,25 @@ switch (_a.label) { | ||
singleSpaPlatformLocation = module.injector.get(SingleSpaPlatformLocation, null); | ||
ngZoneEnabled = opts.NgZone !== 'noop'; | ||
// The user has to provide `BrowserPlatformLocation` only if his application uses routing. | ||
// So if he provided `Router` but didn't provide `BrowserPlatformLocation` then we have to inform him. | ||
if (opts.Router && singleSpaPlatformLocation === null) { | ||
// Also `getSingleSpaExtraProviders()` function should be called only if the user doesn't use | ||
// `zone-less` change detection, if `NgZone` is `noop` then we can skip it. | ||
if (ngZoneEnabled && opts.Router && singleSpaPlatformLocation === null) { | ||
throw new Error("\t\n single-spa-angular: could not retrieve extra providers from the platform injector. Did you call getSingleSpaExtraProviders() when creating platform?\t\n "); | ||
} | ||
bootstrappedOpts = opts; | ||
ngZone = module.injector.get(opts.NgZone); | ||
singleSpaPlatformLocation.setNgZone(ngZone); | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
if (ngZoneEnabled) { | ||
ngZone = module.injector.get(opts.NgZone); | ||
// `NgZone` can be enabled but routing may not be used thus `getSingleSpaExtraProviders()` | ||
// function was not called. | ||
if (singleSpaPlatformLocation !== null) { | ||
singleSpaPlatformLocation.setNgZone(ngZone); | ||
// Cleanup resources, especially remove event listeners thus they will not be added | ||
// twice when application gets bootstrapped the second time. | ||
module.onDestroy(function () { return singleSpaPlatformLocation.destroy(); }); | ||
} | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
} | ||
bootstrappedOpts.bootstrappedModule = module; | ||
@@ -112,3 +131,5 @@ return [2 /*return*/, module]; | ||
} | ||
window.removeEventListener('single-spa:routing-event', opts.routingEventListener); | ||
if (opts.routingEventListener) { | ||
window.removeEventListener('single-spa:routing-event', opts.routingEventListener); | ||
} | ||
if (opts.AnimationEngine) { | ||
@@ -120,7 +141,5 @@ animationEngine = opts.bootstrappedModule.injector.get(opts.AnimationEngine); | ||
delete opts.bootstrappedModule; | ||
if (ivyEnabled()) { | ||
// This is an issue. Issue has been created and Angular team is working on the fix: | ||
// https://github.com/angular/angular/issues/36449 | ||
removeApplicationFromDOMIfIvyEnabled(opts, props); | ||
} | ||
// This is an issue. Issue has been created and Angular team is working on the fix: | ||
// https://github.com/angular/angular/issues/36449 | ||
removeApplicationFromDOMIfIvyEnabled(opts, props); | ||
return [2 /*return*/]; | ||
@@ -130,59 +149,2 @@ }); | ||
} | ||
function ivyEnabled() { | ||
try { | ||
// `ɵivyEnabled` variable is exposed starting from version 8. | ||
// We use `require` here except of a single `import { ɵivyEnabled }` because the | ||
// developer can use Angular version that doesn't expose it (all versions <8). | ||
// The `catch` statement will handle those cases. | ||
// eslint-disable-next-line | ||
var ɵivyEnabled = require('@angular/core').ɵivyEnabled; | ||
return !!ɵivyEnabled; | ||
} | ||
catch (_a) { | ||
return false; | ||
} | ||
} | ||
function removeApplicationFromDOMIfIvyEnabled(opts, props) { | ||
var domElementGetter = chooseDomElementGetter(opts, props); | ||
var domElement = getContainerEl(domElementGetter); | ||
// View Engine removes all nodes automatically when calling `NgModuleRef.destroy()`, | ||
// which calls `ComponentRef.destroy()`. | ||
// Basically this will remove `app-root` or any other selector from the container element. | ||
while (domElement.firstChild) | ||
domElement.removeChild(domElement.firstChild); | ||
} | ||
function getContainerEl(domElementGetter) { | ||
var element = domElementGetter(); | ||
if (!element) { | ||
throw Error('domElementGetter did not return a valid dom element'); | ||
} | ||
return element; | ||
} | ||
function chooseDomElementGetter(opts, props) { | ||
props = props && props.customProps ? props.customProps : props; | ||
if (props.domElement) { | ||
return function () { return props.domElement; }; | ||
} | ||
else if (props.domElementGetter) { | ||
return props.domElementGetter; | ||
} | ||
else if (opts.domElementGetter) { | ||
return opts.domElementGetter; | ||
} | ||
else { | ||
return defaultDomElementGetter(props.name); | ||
} | ||
} | ||
function defaultDomElementGetter(name) { | ||
return function getDefaultDomElement() { | ||
var id = "single-spa-application:" + name; | ||
var domElement = document.getElementById(id); | ||
if (!domElement) { | ||
domElement = document.createElement('div'); | ||
domElement.id = id; | ||
document.body.appendChild(domElement); | ||
} | ||
return domElement; | ||
}; | ||
} | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLXNwYS1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vc2luZ2xlLXNwYS1hbmd1bGFyLyIsInNvdXJjZXMiOlsic3JjL3NpbmdsZS1zcGEtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBR0EsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsSUFBTSxXQUFXLEdBQUc7SUFDbEIsMERBQTBEO0lBQzFELE1BQU0sRUFBRSxJQUFLO0lBQ2IsaUJBQWlCLEVBQUUsSUFBSztJQUN4QixRQUFRLEVBQUUsSUFBSztJQUNmLGdCQUFnQjtJQUNoQixNQUFNLEVBQUUsU0FBUztJQUNqQixnQkFBZ0IsRUFBRSxTQUFTO0lBQzNCLGVBQWUsRUFBRSxTQUFTO0lBQzFCLGNBQWMsRUFBRSxjQUFNLE9BQUEsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFqQixDQUFpQjtDQUN4QyxDQUFDO0FBRUYsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQThCO0lBQzdELElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO1FBQ2hDLE1BQU0sS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7S0FDbkU7SUFFRCxJQUFNLElBQUkseUJBQ0wsV0FBVyxHQUNYLFFBQVEsQ0FDWixDQUFDO0lBRUYsSUFBSSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxVQUFVLEVBQUU7UUFDaEQsTUFBTSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztLQUM1RTtJQUVELElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtRQUNyQyxNQUFNLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0tBQ3ZFO0lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDaEIsTUFBTSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztLQUNqRTtJQUVELE9BQU87UUFDTCxTQUFTLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJ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SUFBSSxDQUFDLENBQUM7S0FDNUM7QUFDSCxDQUFDO0FBRUQsU0FBUyx1QkFBdUIsQ0FBQyxJQUFZO0lBQzNDLE9BQU8sU0FBUyxvQkFBb0I7UUFDbEMsSUFBTSxFQUFFLEdBQUcsNEJBQTBCLElBQU0sQ0FBQztRQUM1QyxJQUFJLFVBQVUsR0FBdUIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDbkIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDdkM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdab25lLCBUeXBlLCBOZ01vZHVsZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBwUHJvcHMsIExpZmVDeWNsZXMgfSBmcm9tICdzaW5nbGUtc3BhJztcblxuaW1wb3J0IHsgU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbiB9IGZyb20gJy4vZXh0cmEtcHJvdmlkZXJzJztcblxuY29uc3QgZGVmYXVsdE9wdHMgPSB7XG4gIC8vIFJlcXVpcmVkIG9wdHMgdGhhdCB3aWxsIGJlIHNldCBieSB0aGUgbGlicmFyeSBjb25zdW1lci5cbiAgTmdab25lOiBudWxsISxcbiAgYm9vdHN0cmFwRnVuY3Rpb246IG51bGwhLFxuICB0ZW1wbGF0ZTogbnVsbCEsXG4gIC8vIG9wdGlvbmFsIG9wdHNcbiAgUm91dGVyOiB1bmRlZmluZWQsXG4gIGRvbUVsZW1lbnRHZXR0ZXI6IHVuZGVmaW5lZCwgLy8gb25seSBvcHRpb25hbCBpZiB5b3UgcHJvdmlkZSBhIGRvbUVsZW1lbnRHZXR0ZXIgYXMgYSBjdXN0b20gcHJvcFxuICBBbmltYXRpb25FbmdpbmU6IHVuZGVmaW5lZCxcbiAgdXBkYXRlRnVuY3Rpb246ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZVNwYUFuZ3VsYXIodXNlck9wdHM6IFNpbmdsZVNwYUFuZ3VsYXJPcHRzKTogTGlmZUN5Y2xlcyB7XG4gIGlmICh0eXBlb2YgdXNlck9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgRXJyb3IoJ3NpbmdsZS1zcGEtYW5ndWxhciByZXF1aXJlcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCBvcHRzOiBTaW5nbGVTcGFBbmd1bGFyT3B0cyA9IHtcbiAgICAuLi5kZWZhdWx0T3B0cyxcbiAgICAuLi51c2VyT3B0cyxcbiAgfTtcblxuICBpZiAodHlwZW9mIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBFcnJvcignc2luZ2xlLXNwYS1hbmd1bGFyIG11c3QgYmUgcGFzc2VkIGFuIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cy50ZW1wbGF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBFcnJvcignc2luZ2xlLXNwYS1hbmd1bGFyIG11c3QgYmUgcGFzc2VkIG9wdHMudGVtcGxhdGUgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoIW9wdHMuTmdab25lKSB7XG4gICAgdGhyb3cgRXJyb3IoYHNpbmdsZS1zcGEtYW5ndWxhciBtdXN0IGJlIHBhc3NlZCB0aGUgTmdab25lIG9wdGApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBib290c3RyYXA6IGJvb3RzdHJhcC5iaW5kKG51bGwsIG9wdHMgYXMgQm9vdHN0cmFwcGVkU2luZ2xlU3BhQW5ndWxhck9wdHMpLFxuICAgIG1vdW50OiBtb3VudC5iaW5kKG51bGwsIG9wdHMpLFxuICAgIHVubW91bnQ6IHVubW91bnQuYmluZChudWxsLCBvcHRzIGFzIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzKSxcbiAgICB1cGRhdGU6IG9wdHMudXBkYXRlRnVuY3Rpb24sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcChvcHRzOiBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cywgcHJvcHM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBJbiBvcmRlciBmb3IgbXVsdGlwbGUgQW5ndWxhciBhcHBzIHRvIHdvcmsgY29uY3VycmVudGx5IG9uIGEgcGFnZSwgdGhleSBlYWNoIG5lZWQgYSB1bmlxdWUgaWRlbnRpZmllci5cbiAgb3B0cy56b25lSWRlbnRpZmllciA9IGBzaW5nbGUtc3BhLWFuZ3VsYXI6JHtwcm9wcy5uYW1lIHx8IHByb3BzLmFwcE5hbWV9YDtcblxuICAvLyBUaGlzIGlzIGEgaGFjaywgc2luY2UgTmdab25lIGRvZXNuJ3QgYWxsb3cgeW91IHRvIGNvbmZpZ3VyZSB0aGUgcHJvcGVydHkgdGhhdCBpZGVudGlmaWVzIHlvdXIgem9uZS5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QbGFjZU1lLVNBUy9zaW5nbGUtc3BhLWFuZ3VsYXItY2xpL2lzc3Vlcy8zMyxcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmdsZS1zcGEvc2luZ2xlLXNwYS1hbmd1bGFyL2lzc3Vlcy80NyxcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL2ExNGRjMmQ3YTQ4MjFhMTlmMjBhOTU0NzA1M2E1NzM0Nzk4ZjU0MWUvcGFja2FnZXMvY29yZS9zcmMvem9uZS9uZ196b25lLnRzI0wxNDQsXG4gIC8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvYTE0ZGMyZDdhNDgyMWExOWYyMGE5NTQ3MDUzYTU3MzQ3OThmNTQxZS9wYWNrYWdlcy9jb3JlL3NyYy96b25lL25nX3pvbmUudHMjTDI1N1xuICBvcHRzLk5nWm9uZS5pc0luQW5ndWxhclpvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiB3aW5kb3cuWm9uZS5jdXJyZW50Ll9wcm9wZXJ0aWVzW29wdHMuem9uZUlkZW50aWZpZXJdID09PSB0cnVlO1xuICB9O1xuXG4gIG9wdHMucm91dGluZ0V2ZW50TGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgb3B0cy5ib290c3RyYXBwZWROZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZ2xlLXNwYS9zaW5nbGUtc3BhLWFuZ3VsYXIvaXNzdWVzLzg2XG4gICAgICAvLyBab25lIGlzIHVuYXdhcmUgb2YgdGhlIHNpbmdsZS1zcGEgbmF2aWdhdGlvbiBjaGFuZ2UgYW5kIHNvIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBkb2Vzbid0IHdvcmtcbiAgICAgIC8vIHVubGVzcyB3ZSB0ZWxsIFpvbmUgdGhhdCBzb21ldGhpbmcgaGFwcGVuZWRcbiAgICB9KTtcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbW91bnQob3B0czogU2luZ2xlU3BhQW5ndWxhck9wdHMsIHByb3BzOiBhbnkpOiBQcm9taXNlPE5nTW9kdWxlUmVmPGFueT4+IHtcbiAgY29uc3QgZG9tRWxlbWVudEdldHRlciA9IGNob29zZURvbUVsZW1lbnRHZXR0ZXIob3B0cywgcHJvcHMpO1xuXG4gIGlmICghZG9tRWxlbWVudEdldHRlcikge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYGNhbm5vdCBtb3VudCBhbmd1bGFyIGFwcGxpY2F0aW9uICcke1xuICAgICAgICBwcm9wcy5uYW1lIHx8IHByb3BzLmFwcE5hbWVcbiAgICAgIH0nIHdpdGhvdXQgYSBkb21FbGVtZW50R2V0dGVyIHByb3ZpZGVkIGVpdGhlciBhcyBhbiBvcHQgb3IgYSBwcm9wYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29udGFpbmVyRWwgPSBnZXRDb250YWluZXJFbChkb21FbGVtZW50R2V0dGVyKTtcbiAgY29udGFpbmVyRWwuaW5uZXJIVE1MID0gb3B0cy50ZW1wbGF0ZTtcbiAgY29uc3QgYm9vdHN0cmFwUHJvbWlzZSA9IG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24ocHJvcHMpO1xuXG4gIGlmICghKGJvb3RzdHJhcFByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYHNpbmdsZS1zcGEtYW5ndWxhcjogdGhlIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlLCBidXQgaW5zdGVhZCByZXR1cm5lZCBhICcke3R5cGVvZiBib290c3RyYXBQcm9taXNlfScgdGhhdCBpcyBub3QgYSBQcm9taXNlYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlOiBOZ01vZHVsZVJlZjxhbnk+ID0gYXdhaXQgYm9vdHN0cmFwUHJvbWlzZTtcblxuICBpZiAoIW1vZHVsZSB8fCB0eXBlb2YgbW9kdWxlLmRlc3Ryb3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBzaW5nbGUtc3BhLWFuZ3VsYXI6IHRoZSBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uIHJldHVybmVkIGEgcHJvbWlzZSB0aGF0IGRpZCBub3QgcmVzb2x2ZSB3aXRoIGEgdmFsaWQgQW5ndWxhciBtb2R1bGUuIERpZCB5b3UgY2FsbCBwbGF0Zm9ybUJyb3dzZXIoKS5ib290c3RyYXBNb2R1bGVGYWN0b3J5KCkgY29ycmVjdGx5P2AsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb246IFNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24gfCBudWxsID0gbW9kdWxlLmluamVjdG9yLmdldChcbiAgICBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLFxuICAgIG51bGwsXG4gICk7XG5cbiAgLy8gVGhlIHVzZXIgaGFzIHRvIHByb3ZpZGUgYEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uYCBvbmx5IGlmIGhpcyBhcHBsaWNhdGlvbiB1c2VzIHJvdXRpbmcuXG4gIC8vIFNvIGlmIGhlIHByb3ZpZGVkIGBSb3V0ZXJgIGJ1dCBkaWRuJ3QgcHJvdmlkZSBgQnJvd3NlclBsYXRmb3JtTG9jYXRpb25gIHRoZW4gd2UgaGF2ZSB0byBpbmZvcm0gaGltLlxuICBpZiAob3B0cy5Sb3V0ZXIgJiYgc2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbiA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgXHRcbiAgICAgIHNpbmdsZS1zcGEtYW5ndWxhcjogY291bGQgbm90IHJldHJpZXZlIGV4dHJhIHByb3ZpZGVycyBmcm9tIHRoZSBwbGF0Zm9ybSBpbmplY3Rvci4gRGlkIHlvdSBjYWxsIGdldFNpbmdsZVNwYUV4dHJhUHJvdmlkZXJzKCkgd2hlbiBjcmVhdGluZyBwbGF0Zm9ybT9cdFxuICAgIGApO1xuICB9XG5cbiAgY29uc3QgYm9vdHN0cmFwcGVkT3B0cyA9IG9wdHMgYXMgQm9vdHN0cmFwcGVkU2luZ2xlU3BhQW5ndWxhck9wdHM7XG4gIGNvbnN0IG5nWm9uZTogTmdab25lID0gbW9kdWxlLmluamVjdG9yLmdldChvcHRzLk5nWm9uZSk7XG5cbiAgc2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbiEuc2V0Tmdab25lKG5nWm9uZSk7XG4gIGJvb3RzdHJhcHBlZE9wdHMuYm9vdHN0cmFwcGVkTmdab25lID0gbmdab25lO1xuICBib290c3RyYXBwZWRPcHRzLmJvb3RzdHJhcHBlZE5nWm9uZVsnX2lubmVyJ10uX3Byb3BlcnRpZXNbYm9vdHN0cmFwcGVkT3B0cy56b25lSWRlbnRpZmllcl0gPSB0cnVlO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2luZ2xlLXNwYTpyb3V0aW5nLWV2ZW50JywgYm9vdHN0cmFwcGVkT3B0cy5yb3V0aW5nRXZlbnRMaXN0ZW5lcik7XG4gIGJvb3RzdHJhcHBlZE9wdHMuYm9vdHN0cmFwcGVkTW9kdWxlID0gbW9kdWxlO1xuXG4gIHJldHVybiBtb2R1bGU7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmFzeW5jIGZ1bmN0aW9uIHVubW91bnQob3B0czogQm9vdHN0cmFwcGVkU2luZ2xlU3BhQW5ndWxhck9wdHMsIHByb3BzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKG9wdHMuUm91dGVyKSB7XG4gICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTkwNzlcbiAgICBjb25zdCByb3V0ZXIgPSBvcHRzLmJvb3RzdHJhcHBlZE1vZHVsZS5pbmplY3Rvci5nZXQob3B0cy5Sb3V0ZXIpO1xuICAgIHJvdXRlci5kaXNwb3NlKCk7XG4gIH1cblxuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2luZ2xlLXNwYTpyb3V0aW5nLWV2ZW50Jywgb3B0cy5yb3V0aW5nRXZlbnRMaXN0ZW5lcik7XG5cbiAgaWYgKG9wdHMuQW5pbWF0aW9uRW5naW5lKSB7XG4gICAgLypcbiAgICBUaGUgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgZG9lcyBub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmIDonKC4gV2hlbiB5b3UgdW5tb3VudC9kZXN0cm95IHRoZSBtYWluIG1vZHVsZSwgdGhlXG4gICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgdXNlcyBhbiBBbmltYXRpb25SZW5kZXJlciB0aGluZyB0byByZW1vdmUgZG9tIGVsZW1lbnRzIGZyb20gdGhlIHBhZ2UuIEJ1dCB0aGUgQW5pbWF0aW9uUmVuZGVyZXJcbiAgICBkZWZlcnMgdGhlIGFjdHVhbCB3b3JrIHRvIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIHRvIGRvIHRoaXMsIGFuZCB0aGUgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZSBkb2Vzbid0IGFjdHVhbGx5XG4gICAgcmVtb3ZlIHRoZSBkb20gbm9kZSwgYnV0IGp1c3QgY2FsbHMgXCJtYXJrRWxlbWVudEFzUmVtb3ZlZCgpXCIuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL2RiNjJjY2Y5ZWI0NmVlODkzNjZhZGU1ODYzNjVlYTAyN2JiOTNlYjEvcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdHJhbnNpdGlvbl9hbmltYXRpb25fZW5naW5lLnRzI0w3MTdcblxuICAgIFdoYXQgbWFya0FzUmVtb3ZlZERvZXMgaXMgcHV0IGl0IGludG8gYW4gYXJyYXkgY2FsbGVkIFwiY29sbGVjdGVkTGVhdmVFbGVtZW50c1wiLCB3aGljaCBpcyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWRcbiAgICBhZnRlciB0aGUgRE9NIGhhcyBoYWQgYSBjaGFuY2UgdG8gZG8gYW55IGFuaW1hdGlvbnMuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9wYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3JlbmRlci90cmFuc2l0aW9uX2FuaW1hdGlvbl9lbmdpbmUudHMjTDUyNVxuXG4gICAgVGhlIGFjdHVhbCBkb20gbm9kZXMgYXJlbid0IHJlbW92ZWQgdW50aWwgdGhlIFRyYW5zaXRpb25BbmltYXRpb25FbmdpbmUgXCJmbHVzaGVzXCIuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL2RiNjJjY2Y5ZWI0NmVlODkzNjZhZGU1ODYzNjVlYTAyN2JiOTNlYjEvcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdHJhbnNpdGlvbl9hbmltYXRpb25fZW5naW5lLnRzI0w4NTFcblxuICAgIFVuZm9ydHVuYXRlbHksIHRob3VnaCwgdGhhdCBcImZsdXNoXCIgd2lsbCBuZXZlciBoYXBwZW4sIHNpbmNlIHRoZSBlbnRpcmUgbW9kdWxlIGlzIGJlaW5nIGRlc3Ryb3llZCBhbmQgdGhlcmUgd2lsbCBiZSBubyBtb3JlIGZsdXNoZXMuXG4gICAgU28gd2hhdCB3ZSBkbyBpbiB0aGlzIGNvZGUgaXMgZm9yY2Ugb25lIG1vcmUgZmx1c2ggb2YgdGhlIGFuaW1hdGlvbnMgYWZ0ZXIgdGhlIG1vZHVsZSBpcyBkZXN0cm95ZWQuXG5cbiAgICBJZGVhbGx5LCB3ZSB3b3VsZCBkbyB0aGlzIGJ5IGdldHRpbmcgdGhlIFRyYW5zaXRpb25BbmltYXRpb25FbmdpbmUgZGlyZWN0bHkgYW5kIGZsdXNoaW5nIGl0LiBVbmZvcnR1bmF0ZWx5LCB0aG91Z2gsIGl0J3MgcHJpdmF0ZSBjbGFzc1xuICAgIHRoYXQgY2Fubm90IGJlIGltcG9ydGVkIGFuZCBpcyBub3QgcHJvdmlkZWQgdG8gdGhlIGRlcGVuZGVuY3kgaW5qZWN0b3IuIFNvLCBpbnN0ZWFkLCB3ZSBnZXQgaXRzIHdyYXBwZXIgY2xhc3MsIEFuaW1hdGlvbkVuZ2luZSwgYW5kIHRoZW5cbiAgICBhY2Nlc3MgaXRzIHByaXZhdGUgdmFyaWFibGUgcmVmZXJlbmNlIHRvIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIHNvIHRoYXQgd2UgY2FuIGNhbGwgZmx1c2guXG4gICAgKi9cbiAgICBjb25zdCBhbmltYXRpb25FbmdpbmUgPSBvcHRzLmJvb3RzdHJhcHBlZE1vZHVsZS5pbmplY3Rvci5nZXQob3B0cy5BbmltYXRpb25FbmdpbmUpO1xuICAgIGFuaW1hdGlvbkVuZ2luZS5fdHJhbnNpdGlvbkVuZ2luZS5mbHVzaCgpO1xuICB9XG5cbiAgb3B0cy5ib290c3RyYXBwZWRNb2R1bGUuZGVzdHJveSgpO1xuICBkZWxldGUgb3B0cy5ib290c3RyYXBwZWRNb2R1bGU7XG5cbiAgaWYgKGl2eUVuYWJsZWQoKSkge1xuICAgIC8vIFRoaXMgaXMgYW4gaXNzdWUuIElzc3VlIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIEFuZ3VsYXIgdGVhbSBpcyB3b3JraW5nIG9uIHRoZSBmaXg6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzY0NDlcbiAgICByZW1vdmVBcHBsaWNhdGlvbkZyb21ET01JZkl2eUVuYWJsZWQob3B0cywgcHJvcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGl2eUVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgLy8gYMm1aXZ5RW5hYmxlZGAgdmFyaWFibGUgaXMgZXhwb3NlZCBzdGFydGluZyBmcm9tIHZlcnNpb24gOC5cbiAgICAvLyBXZSB1c2UgYHJlcXVpcmVgIGhlcmUgZXhjZXB0IG9mIGEgc2luZ2xlIGBpbXBvcnQgeyDJtWl2eUVuYWJsZWQgfWAgYmVjYXVzZSB0aGVcbiAgICAvLyBkZXZlbG9wZXIgY2FuIHVzZSBBbmd1bGFyIHZlcnNpb24gdGhhdCBkb2Vzbid0IGV4cG9zZSBpdCAoYWxsIHZlcnNpb25zIDw4KS5cbiAgICAvLyBUaGUgYGNhdGNoYCBzdGF0ZW1lbnQgd2lsbCBoYW5kbGUgdGhvc2UgY2FzZXMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgY29uc3QgeyDJtWl2eUVuYWJsZWQgfSA9IHJlcXVpcmUoJ0Bhbmd1bGFyL2NvcmUnKTtcbiAgICByZXR1cm4gISHJtWl2eUVuYWJsZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVBcHBsaWNhdGlvbkZyb21ET01JZkl2eUVuYWJsZWQob3B0czogU2luZ2xlU3BhQW5ndWxhck9wdHMsIHByb3BzOiBhbnkpOiB2b2lkIHtcbiAgY29uc3QgZG9tRWxlbWVudEdldHRlciA9IGNob29zZURvbUVsZW1lbnRHZXR0ZXIob3B0cywgcHJvcHMpO1xuICBjb25zdCBkb21FbGVtZW50ID0gZ2V0Q29udGFpbmVyRWwoZG9tRWxlbWVudEdldHRlcik7XG4gIC8vIFZpZXcgRW5naW5lIHJlbW92ZXMgYWxsIG5vZGVzIGF1dG9tYXRpY2FsbHkgd2hlbiBjYWxsaW5nIGBOZ01vZHVsZVJlZi5kZXN0cm95KClgLFxuICAvLyB3aGljaCBjYWxscyBgQ29tcG9uZW50UmVmLmRlc3Ryb3koKWAuXG4gIC8vIEJhc2ljYWxseSB0aGlzIHdpbGwgcmVtb3ZlIGBhcHAtcm9vdGAgb3IgYW55IG90aGVyIHNlbGVjdG9yIGZyb20gdGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICB3aGlsZSAoZG9tRWxlbWVudC5maXJzdENoaWxkKSBkb21FbGVtZW50LnJlbW92ZUNoaWxkKGRvbUVsZW1lbnQuZmlyc3RDaGlsZCk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnRhaW5lckVsKGRvbUVsZW1lbnRHZXR0ZXI6IERvbUVsZW1lbnRHZXR0ZXIpOiBuZXZlciB8IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgZWxlbWVudCA9IGRvbUVsZW1lbnRHZXR0ZXIoKTtcblxuICBpZiAoIWVsZW1lbnQpIHtcbiAgICB0aHJvdyBFcnJvcignZG9tRWxlbWVudEdldHRlciBkaWQgbm90IHJldHVybiBhIHZhbGlkIGRvbSBlbGVtZW50Jyk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cblxuZnVuY3Rpb24gY2hvb3NlRG9tRWxlbWVudEdldHRlcihvcHRzOiBTaW5nbGVTcGFBbmd1bGFyT3B0cywgcHJvcHM6IGFueSk6IERvbUVsZW1lbnRHZXR0ZXIge1xuICBwcm9wcyA9IHByb3BzICYmIHByb3BzLmN1c3RvbVByb3BzID8gcHJvcHMuY3VzdG9tUHJvcHMgOiBwcm9wcztcbiAgaWYgKHByb3BzLmRvbUVsZW1lbnQpIHtcbiAgICByZXR1cm4gKCkgPT4gcHJvcHMuZG9tRWxlbWVudDtcbiAgfSBlbHNlIGlmIChwcm9wcy5kb21FbGVtZW50R2V0dGVyKSB7XG4gICAgcmV0dXJuIHByb3BzLmRvbUVsZW1lbnRHZXR0ZXI7XG4gIH0gZWxzZSBpZiAob3B0cy5kb21FbGVtZW50R2V0dGVyKSB7XG4gICAgcmV0dXJuIG9wdHMuZG9tRWxlbWVudEdldHRlcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmYXVsdERvbUVsZW1lbnRHZXR0ZXIocHJvcHMubmFtZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdERvbUVsZW1lbnRHZXR0ZXIobmFtZTogc3RyaW5nKTogRG9tRWxlbWVudEdldHRlciB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXREZWZhdWx0RG9tRWxlbWVudCgpIHtcbiAgICBjb25zdCBpZCA9IGBzaW5nbGUtc3BhLWFwcGxpY2F0aW9uOiR7bmFtZX1gO1xuICAgIGxldCBkb21FbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cbiAgICBpZiAoIWRvbUVsZW1lbnQpIHtcbiAgICAgIGRvbUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRvbUVsZW1lbnQuaWQgPSBpZDtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9tRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvbUVsZW1lbnQ7XG4gIH07XG59XG5cbnR5cGUgRG9tRWxlbWVudEdldHRlciA9ICgpID0+IEhUTUxFbGVtZW50O1xuXG5pbnRlcmZhY2UgU2luZ2xlU3BhQW5ndWxhck9wdHMge1xuICBOZ1pvbmU6IHR5cGVvZiBOZ1pvbmU7XG4gIGJvb3RzdHJhcEZ1bmN0aW9uKHByb3BzOiBBcHBQcm9wcyk6IFByb21pc2U8TmdNb2R1bGVSZWY8YW55Pj47XG4gIHVwZGF0ZUZ1bmN0aW9uPyhwcm9wczogQXBwUHJvcHMpOiBQcm9taXNlPGFueT47XG4gIHRlbXBsYXRlOiBzdHJpbmc7XG4gIFJvdXRlcj86IFR5cGU8YW55PjtcbiAgZG9tRWxlbWVudEdldHRlcj8oKTogSFRNTEVsZW1lbnQ7XG4gIEFuaW1hdGlvbkVuZ2luZT86IFR5cGU8YW55Pjtcbn1cblxuaW50ZXJmYWNlIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzIGV4dGVuZHMgU2luZ2xlU3BhQW5ndWxhck9wdHMge1xuICBib290c3RyYXBwZWROZ1pvbmU6IE5nWm9uZTtcbiAgYm9vdHN0cmFwcGVkTW9kdWxlOiBOZ01vZHVsZVJlZjxhbnk+O1xuICByb3V0aW5nRXZlbnRMaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgem9uZUlkZW50aWZpZXI6IHN0cmluZztcbn1cbiJdfQ== | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLXNwYS1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vc2luZ2xlLXNwYS1hbmd1bGFyLyIsInNvdXJjZXMiOlsic3JjL3NpbmdsZS1zcGEtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUNMLGNBQWMsRUFDZCxzQkFBc0IsRUFDdEIsb0NBQW9DLEdBR3JDLE1BQU0sOEJBQThCLENBQUM7QUFFdEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsSUFBTSxXQUFXLEdBQUc7SUFDbEIsMERBQTBEO0lBQzFELE1BQU0sRUFBRSxJQUFLO0lBQ2IsaUJBQWlCLEVBQUUsSUFBSztJQUN4QixRQUFRLEVBQUUsSUFBSztJQUNmLGdCQUFnQjtJQUNoQixNQUFNLEVBQUUsU0FBUztJQUNqQixnQkFBZ0IsRUFBRSxTQUFTO0lBQzNCLGVBQWUsRUFBRSxTQUFTO0lBQzFCLGNBQWMsRUFBRSxjQUFNLE9BQUEsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFqQixDQUFpQjtDQUN4QyxDQUFDO0FBRUYsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQThCO0lBQzdELElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO1FBQ2hDLE1BQU0sS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7S0FDbkU7SUFFRCxJQUFNLElBQUkseUJBQ0wsV0FBVyxHQUNYLFFBQVEsQ0FDWixDQUFDO0lBRUYsSUFBSSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxVQUFVLEVBQUU7UUFDaEQsTUFBTSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztLQUM1RTtJQUVELElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtRQUNyQyxNQUFNLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0tBQ3ZFO0lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDaEIsTUFBTSxLQUFLLENBQUMs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QUM7YUFDbkY7WUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBeUJsQixlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNuRixlQUFlLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDM0M7WUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFFL0IsbUZBQW1GO1lBQ25GLGtEQUFrRDtZQUNsRCxvQ0FBb0MsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Ozs7Q0FDbkQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlmZUN5Y2xlcyB9IGZyb20gJ3NpbmdsZS1zcGEnO1xuaW1wb3J0IHtcbiAgZ2V0Q29udGFpbmVyRWwsXG4gIGNob29zZURvbUVsZW1lbnRHZXR0ZXIsXG4gIHJlbW92ZUFwcGxpY2F0aW9uRnJvbURPTUlmSXZ5RW5hYmxlZCxcbiAgU2luZ2xlU3BhQW5ndWxhck9wdHMsXG4gIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzLFxufSBmcm9tICdzaW5nbGUtc3BhLWFuZ3VsYXIvaW50ZXJuYWxzJztcblxuaW1wb3J0IHsgU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbiB9IGZyb20gJy4vZXh0cmEtcHJvdmlkZXJzJztcblxuY29uc3QgZGVmYXVsdE9wdHMgPSB7XG4gIC8vIFJlcXVpcmVkIG9wdHMgdGhhdCB3aWxsIGJlIHNldCBieSB0aGUgbGlicmFyeSBjb25zdW1lci5cbiAgTmdab25lOiBudWxsISxcbiAgYm9vdHN0cmFwRnVuY3Rpb246IG51bGwhLFxuICB0ZW1wbGF0ZTogbnVsbCEsXG4gIC8vIG9wdGlvbmFsIG9wdHNcbiAgUm91dGVyOiB1bmRlZmluZWQsXG4gIGRvbUVsZW1lbnRHZXR0ZXI6IHVuZGVmaW5lZCwgLy8gb25seSBvcHRpb25hbCBpZiB5b3UgcHJvdmlkZSBhIGRvbUVsZW1lbnRHZXR0ZXIgYXMgYSBjdXN0b20gcHJvcFxuICBBbmltYXRpb25FbmdpbmU6IHVuZGVmaW5lZCxcbiAgdXBkYXRlRnVuY3Rpb246ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZVNwYUFuZ3VsYXIodXNlck9wdHM6IFNpbmdsZVNwYUFuZ3VsYXJPcHRzKTogTGlmZUN5Y2xlcyB7XG4gIGlmICh0eXBlb2YgdXNlck9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgRXJyb3IoJ3NpbmdsZS1zcGEtYW5ndWxhciByZXF1aXJlcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCBvcHRzOiBTaW5nbGVTcGFBbmd1bGFyT3B0cyA9IHtcbiAgICAuLi5kZWZhdWx0T3B0cyxcbiAgICAuLi51c2VyT3B0cyxcbiAgfTtcblxuICBpZiAodHlwZW9mIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBFcnJvcignc2luZ2xlLXNwYS1hbmd1bGFyIG11c3QgYmUgcGFzc2VkIGFuIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cy50ZW1wbGF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBFcnJvcignc2luZ2xlLXNwYS1hbmd1bGFyIG11c3QgYmUgcGFzc2VkIG9wdHMudGVtcGxhdGUgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoIW9wdHMuTmdab25lKSB7XG4gICAgdGhyb3cgRXJyb3IoYHNpbmdsZS1zcGEtYW5ndWxhciBtdXN0IGJlIHBhc3NlZCB0aGUgTmdab25lIG9wdGApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBib290c3RyYXA6IGJvb3RzdHJhcC5iaW5kKG51bGwsIG9wdHMgYXMgQm9vdHN0cmFwcGVkU2luZ2xlU3BhQW5ndWxhck9wdHMpLFxuICAgIG1vdW50OiBtb3VudC5iaW5kKG51bGwsIG9wdHMpLFxuICAgIHVubW91bnQ6IHVubW91bnQuYmluZChudWxsLCBvcHRzIGFzIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzKSxcbiAgICB1cGRhdGU6IG9wdHMudXBkYXRlRnVuY3Rpb24sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcChvcHRzOiBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cywgcHJvcHM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBBbmd1bGFyIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIGRldmVsb3AgYHpvbmUtbGVzc2AgYXBwbGljYXRpb24sIHdoZXJlIGRldmVsb3BlcnNcbiAgLy8gaGF2ZSB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gbWFudWFsbHkuXG4gIC8vIFNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvem9uZSNub29wem9uZVxuICBpZiAob3B0cy5OZ1pvbmUgPT09ICdub29wJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEluIG9yZGVyIGZvciBtdWx0aXBsZSBBbmd1bGFyIGFwcHMgdG8gd29yayBjb25jdXJyZW50bHkgb24gYSBwYWdlLCB0aGV5IGVhY2ggbmVlZCBhIHVuaXF1ZSBpZGVudGlmaWVyLlxuICBvcHRzLnpvbmVJZGVudGlmaWVyID0gYHNpbmdsZS1zcGEtYW5ndWxhcjoke3Byb3BzLm5hbWUgfHwgcHJvcHMuYXBwTmFtZX1gO1xuXG4gIC8vIFRoaXMgaXMgYSBoYWNrLCBzaW5jZSBOZ1pvbmUgZG9lc24ndCBhbGxvdyB5b3UgdG8gY29uZmlndXJlIHRoZSBwcm9wZXJ0eSB0aGF0IGlkZW50aWZpZXMgeW91ciB6b25lLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1BsYWNlTWUtU0FTL3NpbmdsZS1zcGEtYW5ndWxhci1jbGkvaXNzdWVzLzMzLFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vc2luZ2xlLXNwYS9zaW5nbGUtc3BhLWFuZ3VsYXIvaXNzdWVzLzQ3LFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvYTE0ZGMyZDdhNDgyMWExOWYyMGE5NTQ3MDUzYTU3MzQ3OThmNTQxZS9wYWNrYWdlcy9jb3JlL3NyYy96b25lL25nX3pvbmUudHMjTDE0NCxcbiAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9hMTRkYzJkN2E0ODIxYTE5ZjIwYTk1NDcwNTNhNTczNDc5OGY1NDFlL3BhY2thZ2VzL2NvcmUvc3JjL3pvbmUvbmdfem9uZS50cyNMMjU3XG4gIG9wdHMuTmdab25lLmlzSW5Bbmd1bGFyWm9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHdpbmRvdy5ab25lLmN1cnJlbnQuX3Byb3BlcnRpZXNbb3B0cy56b25lSWRlbnRpZmllcl0gPT09IHRydWU7XG4gIH07XG5cbiAgb3B0cy5yb3V0aW5nRXZlbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICBvcHRzLmJvb3RzdHJhcHBlZE5nWm9uZSEucnVuKCgpID0+IHtcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZ2xlLXNwYS9zaW5nbGUtc3BhLWFuZ3VsYXIvaXNzdWVzLzg2XG4gICAgICAvLyBab25lIGlzIHVuYXdhcmUgb2YgdGhlIHNpbmdsZS1zcGEgbmF2aWdhdGlvbiBjaGFuZ2UgYW5kIHNvIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBkb2Vzbid0IHdvcmtcbiAgICAgIC8vIHVubGVzcyB3ZSB0ZWxsIFpvbmUgdGhhdCBzb21ldGhpbmcgaGFwcGVuZWRcbiAgICB9KTtcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbW91bnQob3B0czogU2luZ2xlU3BhQW5ndWxhck9wdHMsIHByb3BzOiBhbnkpOiBQcm9taXNlPE5nTW9kdWxlUmVmPGFueT4+IHtcbiAgY29uc3QgZG9tRWxlbWVudEdldHRlciA9IGNob29zZURvbUVsZW1lbnRHZXR0ZXIob3B0cywgcHJvcHMpO1xuXG4gIGlmICghZG9tRWxlbWVudEdldHRlcikge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYGNhbm5vdCBtb3VudCBhbmd1bGFyIGFwcGxpY2F0aW9uICcke1xuICAgICAgICBwcm9wcy5uYW1lIHx8IHByb3BzLmFwcE5hbWVcbiAgICAgIH0nIHdpdGhvdXQgYSBkb21FbGVtZW50R2V0dGVyIHByb3ZpZGVkIGVpdGhlciBhcyBhbiBvcHQgb3IgYSBwcm9wYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29udGFpbmVyRWwgPSBnZXRDb250YWluZXJFbChkb21FbGVtZW50R2V0dGVyKTtcbiAgY29udGFpbmVyRWwuaW5uZXJIVE1MID0gb3B0cy50ZW1wbGF0ZTtcbiAgY29uc3QgYm9vdHN0cmFwUHJvbWlzZSA9IG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24ocHJvcHMpO1xuXG4gIGlmICghKGJvb3RzdHJhcFByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYHNpbmdsZS1zcGEtYW5ndWxhcjogdGhlIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlLCBidXQgaW5zdGVhZCByZXR1cm5lZCBhICcke3R5cGVvZiBib290c3RyYXBQcm9taXNlfScgdGhhdCBpcyBub3QgYSBQcm9taXNlYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlOiBOZ01vZHVsZVJlZjxhbnk+ID0gYXdhaXQgYm9vdHN0cmFwUHJvbWlzZTtcblxuICBpZiAoIW1vZHVsZSB8fCB0eXBlb2YgbW9kdWxlLmRlc3Ryb3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBzaW5nbGUtc3BhLWFuZ3VsYXI6IHRoZSBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uIHJldHVybmVkIGEgcHJvbWlzZSB0aGF0IGRpZCBub3QgcmVzb2x2ZSB3aXRoIGEgdmFsaWQgQW5ndWxhciBtb2R1bGUuIERpZCB5b3UgY2FsbCBwbGF0Zm9ybUJyb3dzZXIoKS5ib290c3RyYXBNb2R1bGVGYWN0b3J5KCkgY29ycmVjdGx5P2AsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb246IFNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24gfCBudWxsID0gbW9kdWxlLmluamVjdG9yLmdldChcbiAgICBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLFxuICAgIG51bGwsXG4gICk7XG5cbiAgY29uc3Qgbmdab25lRW5hYmxlZCA9IG9wdHMuTmdab25lICE9PSAnbm9vcCc7XG5cbiAgLy8gVGhlIHVzZXIgaGFzIHRvIHByb3ZpZGUgYEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uYCBvbmx5IGlmIGhpcyBhcHBsaWNhdGlvbiB1c2VzIHJvdXRpbmcuXG4gIC8vIFNvIGlmIGhlIHByb3ZpZGVkIGBSb3V0ZXJgIGJ1dCBkaWRuJ3QgcHJvdmlkZSBgQnJvd3NlclBsYXRmb3JtTG9jYXRpb25gIHRoZW4gd2UgaGF2ZSB0byBpbmZvcm0gaGltLlxuICAvLyBBbHNvIGBnZXRTaW5nbGVTcGFFeHRyYVByb3ZpZGVycygpYCBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgdGhlIHVzZXIgZG9lc24ndCB1c2VcbiAgLy8gYHpvbmUtbGVzc2AgY2hhbmdlIGRldGVjdGlvbiwgaWYgYE5nWm9uZWAgaXMgYG5vb3BgIHRoZW4gd2UgY2FuIHNraXAgaXQuXG4gIGlmIChuZ1pvbmVFbmFibGVkICYmIG9wdHMuUm91dGVyICYmIHNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24gPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFx0XG4gICAgICBzaW5nbGUtc3BhLWFuZ3VsYXI6IGNvdWxkIG5vdCByZXRyaWV2ZSBleHRyYSBwcm92aWRlcnMgZnJvbSB0aGUgcGxhdGZvcm0gaW5qZWN0b3IuIERpZCB5b3UgY2FsbCBnZXRTaW5nbGVTcGFFeHRyYVByb3ZpZGVycygpIHdoZW4gY3JlYXRpbmcgcGxhdGZvcm0/XHRcbiAgICBgKTtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcHBlZE9wdHMgPSBvcHRzIGFzIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzO1xuXG4gIGlmIChuZ1pvbmVFbmFibGVkKSB7XG4gICAgY29uc3Qgbmdab25lOiBpbXBvcnQoJ0Bhbmd1bGFyL2NvcmUnKS5OZ1pvbmUgPSBtb2R1bGUuaW5qZWN0b3IuZ2V0KG9wdHMuTmdab25lKTtcblxuICAgIC8vIGBOZ1pvbmVgIGNhbiBiZSBlbmFibGVkIGJ1dCByb3V0aW5nIG1heSBub3QgYmUgdXNlZCB0aHVzIGBnZXRTaW5nbGVTcGFFeHRyYVByb3ZpZGVycygpYFxuICAgIC8vIGZ1bmN0aW9uIHdhcyBub3QgY2FsbGVkLlxuICAgIGlmIChzaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uICE9PSBudWxsKSB7XG4gICAgICBzaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLnNldE5nWm9uZShuZ1pvbmUpO1xuICAgICAgLy8gQ2xlYW51cCByZXNvdXJjZXMsIGVzcGVjaWFsbHkgcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB0aHVzIHRoZXkgd2lsbCBub3QgYmUgYWRkZWRcbiAgICAgIC8vIHR3aWNlIHdoZW4gYXBwbGljYXRpb24gZ2V0cyBib290c3RyYXBwZWQgdGhlIHNlY29uZCB0aW1lLlxuICAgICAgbW9kdWxlLm9uRGVzdHJveSgoKSA9PiBzaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLmRlc3Ryb3koKSk7XG4gICAgfVxuXG4gICAgYm9vdHN0cmFwcGVkT3B0cy5ib290c3RyYXBwZWROZ1pvbmUgPSBuZ1pvbmU7XG4gICAgYm9vdHN0cmFwcGVkT3B0cy5ib290c3RyYXBwZWROZ1pvbmVbJ19pbm5lciddLl9wcm9wZXJ0aWVzW1xuICAgICAgYm9vdHN0cmFwcGVkT3B0cy56b25lSWRlbnRpZmllclxuICAgIF0gPSB0cnVlO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzaW5nbGUtc3BhOnJvdXRpbmctZXZlbnQnLCBib290c3RyYXBwZWRPcHRzLnJvdXRpbmdFdmVudExpc3RlbmVyISk7XG4gIH1cblxuICBib290c3RyYXBwZWRPcHRzLmJvb3RzdHJhcHBlZE1vZHVsZSA9IG1vZHVsZTtcbiAgcmV0dXJuIG1vZHVsZTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuYXN5bmMgZnVuY3Rpb24gdW5tb3VudChvcHRzOiBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cywgcHJvcHM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAob3B0cy5Sb3V0ZXIpIHtcbiAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xOTA3OVxuICAgIGNvbnN0IHJvdXRlciA9IG9wdHMuYm9vdHN0cmFwcGVkTW9kdWxlLmluamVjdG9yLmdldChvcHRzLlJvdXRlcik7XG4gICAgcm91dGVyLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIGlmIChvcHRzLnJvdXRpbmdFdmVudExpc3RlbmVyKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NpbmdsZS1zcGE6cm91dGluZy1ldmVudCcsIG9wdHMucm91dGluZ0V2ZW50TGlzdGVuZXIpO1xuICB9XG5cbiAgaWYgKG9wdHMuQW5pbWF0aW9uRW5naW5lKSB7XG4gICAgLypcbiAgICBUaGUgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgZG9lcyBub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmIDonKC4gV2hlbiB5b3UgdW5tb3VudC9kZXN0cm95IHRoZSBtYWluIG1vZHVsZSwgdGhlXG4gICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgdXNlcyBhbiBBbmltYXRpb25SZW5kZXJlciB0aGluZyB0byByZW1vdmUgZG9tIGVsZW1lbnRzIGZyb20gdGhlIHBhZ2UuIEJ1dCB0aGUgQW5pbWF0aW9uUmVuZGVyZXJcbiAgICBkZWZlcnMgdGhlIGFjdHVhbCB3b3JrIHRvIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIHRvIGRvIHRoaXMsIGFuZCB0aGUgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZSBkb2Vzbid0IGFjdHVhbGx5XG4gICAgcmVtb3ZlIHRoZSBkb20gbm9kZSwgYnV0IGp1c3QgY2FsbHMgXCJtYXJrRWxlbWVudEFzUmVtb3ZlZCgpXCIuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL2RiNjJjY2Y5ZWI0NmVlODkzNjZhZGU1ODYzNjVlYTAyN2JiOTNlYjEvcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdHJhbnNpdGlvbl9hbmltYXRpb25fZW5naW5lLnRzI0w3MTdcblxuICAgIFdoYXQgbWFya0FzUmVtb3ZlZERvZXMgaXMgcHV0IGl0IGludG8gYW4gYXJyYXkgY2FsbGVkIFwiY29sbGVjdGVkTGVhdmVFbGVtZW50c1wiLCB3aGljaCBpcyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWRcbiAgICBhZnRlciB0aGUgRE9NIGhhcyBoYWQgYSBjaGFuY2UgdG8gZG8gYW55IGFuaW1hdGlvbnMuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9wYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3JlbmRlci90cmFuc2l0aW9uX2FuaW1hdGlvbl9lbmdpbmUudHMjTDUyNVxuXG4gICAgVGhlIGFjdHVhbCBkb20gbm9kZXMgYXJlbid0IHJlbW92ZWQgdW50aWwgdGhlIFRyYW5zaXRpb25BbmltYXRpb25FbmdpbmUgXCJmbHVzaGVzXCIuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL2RiNjJjY2Y5ZWI0NmVlODkzNjZhZGU1ODYzNjVlYTAyN2JiOTNlYjEvcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdHJhbnNpdGlvbl9hbmltYXRpb25fZW5naW5lLnRzI0w4NTFcblxuICAgIFVuZm9ydHVuYXRlbHksIHRob3VnaCwgdGhhdCBcImZsdXNoXCIgd2lsbCBuZXZlciBoYXBwZW4sIHNpbmNlIHRoZSBlbnRpcmUgbW9kdWxlIGlzIGJlaW5nIGRlc3Ryb3llZCBhbmQgdGhlcmUgd2lsbCBiZSBubyBtb3JlIGZsdXNoZXMuXG4gICAgU28gd2hhdCB3ZSBkbyBpbiB0aGlzIGNvZGUgaXMgZm9yY2Ugb25lIG1vcmUgZmx1c2ggb2YgdGhlIGFuaW1hdGlvbnMgYWZ0ZXIgdGhlIG1vZHVsZSBpcyBkZXN0cm95ZWQuXG5cbiAgICBJZGVhbGx5LCB3ZSB3b3VsZCBkbyB0aGlzIGJ5IGdldHRpbmcgdGhlIFRyYW5zaXRpb25BbmltYXRpb25FbmdpbmUgZGlyZWN0bHkgYW5kIGZsdXNoaW5nIGl0LiBVbmZvcnR1bmF0ZWx5LCB0aG91Z2gsIGl0J3MgcHJpdmF0ZSBjbGFzc1xuICAgIHRoYXQgY2Fubm90IGJlIGltcG9ydGVkIGFuZCBpcyBub3QgcHJvdmlkZWQgdG8gdGhlIGRlcGVuZGVuY3kgaW5qZWN0b3IuIFNvLCBpbnN0ZWFkLCB3ZSBnZXQgaXRzIHdyYXBwZXIgY2xhc3MsIEFuaW1hdGlvbkVuZ2luZSwgYW5kIHRoZW5cbiAgICBhY2Nlc3MgaXRzIHByaXZhdGUgdmFyaWFibGUgcmVmZXJlbmNlIHRvIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIHNvIHRoYXQgd2UgY2FuIGNhbGwgZmx1c2guXG4gICAgKi9cbiAgICBjb25zdCBhbmltYXRpb25FbmdpbmUgPSBvcHRzLmJvb3RzdHJhcHBlZE1vZHVsZS5pbmplY3Rvci5nZXQob3B0cy5BbmltYXRpb25FbmdpbmUpO1xuICAgIGFuaW1hdGlvbkVuZ2luZS5fdHJhbnNpdGlvbkVuZ2luZS5mbHVzaCgpO1xuICB9XG5cbiAgb3B0cy5ib290c3RyYXBwZWRNb2R1bGUuZGVzdHJveSgpO1xuICBkZWxldGUgb3B0cy5ib290c3RyYXBwZWRNb2R1bGU7XG5cbiAgLy8gVGhpcyBpcyBhbiBpc3N1ZS4gSXNzdWUgaGFzIGJlZW4gY3JlYXRlZCBhbmQgQW5ndWxhciB0ZWFtIGlzIHdvcmtpbmcgb24gdGhlIGZpeDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzY0NDlcbiAgcmVtb3ZlQXBwbGljYXRpb25Gcm9tRE9NSWZJdnlFbmFibGVkKG9wdHMsIHByb3BzKTtcbn1cbiJdfQ== |
import { __decorate, __awaiter } from 'tslib'; | ||
import { chooseDomElementGetter, getContainerEl, removeApplicationFromDOMIfIvyEnabled } from 'single-spa-angular/internals'; | ||
import { Injectable, Inject, ElementRef, Input, Component, NgModule } from '@angular/core'; | ||
@@ -6,12 +7,55 @@ import { ɵBrowserPlatformLocation, DOCUMENT, PlatformLocation } from '@angular/common'; | ||
let SingleSpaPlatformLocation = class SingleSpaPlatformLocation extends ɵBrowserPlatformLocation { | ||
constructor() { | ||
super(...arguments); | ||
// This is a simple marker that helps us to ignore PopStateEvents | ||
// that was not dispatched by the browser. | ||
this.skipNextPopState = false; | ||
this.onPopStateListeners = []; | ||
} | ||
destroy() { | ||
// TLDR: Angular adds `popstate` event listener and then doesn't remove it when application gets destroyed. | ||
// Basically, Angular has a potentional memory leak. The `ɵBrowserPlatformLocation` | ||
// has `onPopState` method which adds `popstate` event listener and forgets, see here: | ||
// https://github.com/angular/angular/blob/14be55c9facf3e47b8c97df4502dc3f0f897da03/packages/common/src/location/platform_location.ts#L126 | ||
for (const onPopStateListener of this.onPopStateListeners) { | ||
window.removeEventListener('popstate', onPopStateListener); | ||
} | ||
// We do this because the `SingleSpaPlatformLocation` is a part of PLATFORM_INJECTOR, | ||
// which means it's created only once and will not be garbage collected, since the PLATFORM_INJECTOR | ||
// will keep reference to its instance. | ||
// TODO: https://github.com/single-spa/single-spa-angular/issues/170 | ||
this.onPopStateListeners = []; | ||
} | ||
pushState(state, title, url) { | ||
this.skipNextPopState = true; | ||
super.pushState(state, title, url); | ||
} | ||
replaceState(state, title, url) { | ||
this.skipNextPopState = true; | ||
super.replaceState(state, title, url); | ||
} | ||
onPopState(fn) { | ||
super.onPopState(event => { | ||
// Wrap any event listener into zone that is specific to some application. | ||
// The main issue is `back/forward` buttons of browsers, because they invoke | ||
// `history.back|forward` which dispatch `popstate` event. Since `single-spa` | ||
// overrides `history.replaceState` Angular's zone cannot intercept this event. | ||
// Only the root zone is able to intercept all events. | ||
// See https://github.com/single-spa/single-spa-angular/issues/94 for more detail | ||
this.ngZone.run(() => fn(event)); | ||
}); | ||
const onPopStateListener = (event) => { | ||
// The `LocationChangeEvent` doesn't have the `singleSpa` property, since it's added | ||
// by `single-spa` starting from `5.4` version. We need this check because we want | ||
// to skip "unnatural" PopStateEvents, the one caused by `single-spa`. | ||
const popStateEventWasDispatchedBySingleSpa = !!event | ||
.singleSpa; | ||
if (this.skipNextPopState && popStateEventWasDispatchedBySingleSpa) { | ||
this.skipNextPopState = false; | ||
} | ||
else { | ||
// Wrap any event listener into zone that is specific to some application. | ||
// The main issue is `back/forward` buttons of browsers, because they invoke | ||
// `history.back|forward` which dispatch `popstate` event. Since `single-spa` | ||
// overrides `history.replaceState` Angular's zone cannot intercept this event. | ||
// Only the root zone is able to intercept all events. | ||
// See https://github.com/single-spa/single-spa-angular/issues/94 for more details | ||
this.ngZone.run(() => fn(event)); | ||
} | ||
}; | ||
// All listeners should be stored inside an array because the `onPopState` can be called | ||
// multiple times thus we wanna reference all listeners to remove them further. | ||
this.onPopStateListeners.push(onPopStateListener); | ||
super.onPopState(onPopStateListener); | ||
} | ||
@@ -78,2 +122,8 @@ setNgZone(ngZone) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
// Angular provides an opportunity to develop `zone-less` application, where developers | ||
// have to trigger change detection manually. | ||
// See https://angular.io/guide/zone#noopzone | ||
if (opts.NgZone === 'noop') { | ||
return; | ||
} | ||
// In order for multiple Angular apps to work concurrently on a page, they each need a unique identifier. | ||
@@ -116,5 +166,8 @@ opts.zoneIdentifier = `single-spa-angular:${props.name || props.appName}`; | ||
const singleSpaPlatformLocation = module.injector.get(SingleSpaPlatformLocation, null); | ||
const ngZoneEnabled = opts.NgZone !== 'noop'; | ||
// The user has to provide `BrowserPlatformLocation` only if his application uses routing. | ||
// So if he provided `Router` but didn't provide `BrowserPlatformLocation` then we have to inform him. | ||
if (opts.Router && singleSpaPlatformLocation === null) { | ||
// Also `getSingleSpaExtraProviders()` function should be called only if the user doesn't use | ||
// `zone-less` change detection, if `NgZone` is `noop` then we can skip it. | ||
if (ngZoneEnabled && opts.Router && singleSpaPlatformLocation === null) { | ||
throw new Error(` | ||
@@ -125,7 +178,16 @@ single-spa-angular: could not retrieve extra providers from the platform injector. Did you call getSingleSpaExtraProviders() when creating platform? | ||
const bootstrappedOpts = opts; | ||
const ngZone = module.injector.get(opts.NgZone); | ||
singleSpaPlatformLocation.setNgZone(ngZone); | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
if (ngZoneEnabled) { | ||
const ngZone = module.injector.get(opts.NgZone); | ||
// `NgZone` can be enabled but routing may not be used thus `getSingleSpaExtraProviders()` | ||
// function was not called. | ||
if (singleSpaPlatformLocation !== null) { | ||
singleSpaPlatformLocation.setNgZone(ngZone); | ||
// Cleanup resources, especially remove event listeners thus they will not be added | ||
// twice when application gets bootstrapped the second time. | ||
module.onDestroy(() => singleSpaPlatformLocation.destroy()); | ||
} | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
} | ||
bootstrappedOpts.bootstrappedModule = module; | ||
@@ -143,3 +205,5 @@ return module; | ||
} | ||
window.removeEventListener('single-spa:routing-event', opts.routingEventListener); | ||
if (opts.routingEventListener) { | ||
window.removeEventListener('single-spa:routing-event', opts.routingEventListener); | ||
} | ||
if (opts.AnimationEngine) { | ||
@@ -175,66 +239,7 @@ /* | ||
delete opts.bootstrappedModule; | ||
if (ivyEnabled()) { | ||
// This is an issue. Issue has been created and Angular team is working on the fix: | ||
// https://github.com/angular/angular/issues/36449 | ||
removeApplicationFromDOMIfIvyEnabled(opts, props); | ||
} | ||
// This is an issue. Issue has been created and Angular team is working on the fix: | ||
// https://github.com/angular/angular/issues/36449 | ||
removeApplicationFromDOMIfIvyEnabled(opts, props); | ||
}); | ||
} | ||
function ivyEnabled() { | ||
try { | ||
// `ɵivyEnabled` variable is exposed starting from version 8. | ||
// We use `require` here except of a single `import { ɵivyEnabled }` because the | ||
// developer can use Angular version that doesn't expose it (all versions <8). | ||
// The `catch` statement will handle those cases. | ||
// eslint-disable-next-line | ||
const { ɵivyEnabled } = require('@angular/core'); | ||
return !!ɵivyEnabled; | ||
} | ||
catch (_a) { | ||
return false; | ||
} | ||
} | ||
function removeApplicationFromDOMIfIvyEnabled(opts, props) { | ||
const domElementGetter = chooseDomElementGetter(opts, props); | ||
const domElement = getContainerEl(domElementGetter); | ||
// View Engine removes all nodes automatically when calling `NgModuleRef.destroy()`, | ||
// which calls `ComponentRef.destroy()`. | ||
// Basically this will remove `app-root` or any other selector from the container element. | ||
while (domElement.firstChild) | ||
domElement.removeChild(domElement.firstChild); | ||
} | ||
function getContainerEl(domElementGetter) { | ||
const element = domElementGetter(); | ||
if (!element) { | ||
throw Error('domElementGetter did not return a valid dom element'); | ||
} | ||
return element; | ||
} | ||
function chooseDomElementGetter(opts, props) { | ||
props = props && props.customProps ? props.customProps : props; | ||
if (props.domElement) { | ||
return () => props.domElement; | ||
} | ||
else if (props.domElementGetter) { | ||
return props.domElementGetter; | ||
} | ||
else if (opts.domElementGetter) { | ||
return opts.domElementGetter; | ||
} | ||
else { | ||
return defaultDomElementGetter(props.name); | ||
} | ||
} | ||
function defaultDomElementGetter(name) { | ||
return function getDefaultDomElement() { | ||
const id = `single-spa-application:${name}`; | ||
let domElement = document.getElementById(id); | ||
if (!domElement) { | ||
domElement = document.createElement('div'); | ||
domElement.id = id; | ||
document.body.appendChild(domElement); | ||
} | ||
return domElement; | ||
}; | ||
} | ||
@@ -241,0 +246,0 @@ let ParcelComponent = class ParcelComponent { |
@@ -1,2 +0,3 @@ | ||
import { __extends, __decorate, __assign, __awaiter, __generator, __spread } from 'tslib'; | ||
import { __extends, __values, __decorate, __assign, __awaiter, __generator, __spread } from 'tslib'; | ||
import { chooseDomElementGetter, getContainerEl, removeApplicationFromDOMIfIvyEnabled } from 'single-spa-angular/internals'; | ||
import { Injectable, Inject, ElementRef, Input, Component, NgModule } from '@angular/core'; | ||
@@ -8,15 +9,67 @@ import { ɵBrowserPlatformLocation, DOCUMENT, PlatformLocation } from '@angular/common'; | ||
function SingleSpaPlatformLocation() { | ||
return _super !== null && _super.apply(this, arguments) || this; | ||
var _this = _super !== null && _super.apply(this, arguments) || this; | ||
// This is a simple marker that helps us to ignore PopStateEvents | ||
// that was not dispatched by the browser. | ||
_this.skipNextPopState = false; | ||
_this.onPopStateListeners = []; | ||
return _this; | ||
} | ||
SingleSpaPlatformLocation.prototype.destroy = function () { | ||
// TLDR: Angular adds `popstate` event listener and then doesn't remove it when application gets destroyed. | ||
// Basically, Angular has a potentional memory leak. The `ɵBrowserPlatformLocation` | ||
// has `onPopState` method which adds `popstate` event listener and forgets, see here: | ||
// https://github.com/angular/angular/blob/14be55c9facf3e47b8c97df4502dc3f0f897da03/packages/common/src/location/platform_location.ts#L126 | ||
var e_1, _a; | ||
try { | ||
for (var _b = __values(this.onPopStateListeners), _c = _b.next(); !_c.done; _c = _b.next()) { | ||
var onPopStateListener = _c.value; | ||
window.removeEventListener('popstate', onPopStateListener); | ||
} | ||
} | ||
catch (e_1_1) { e_1 = { error: e_1_1 }; } | ||
finally { | ||
try { | ||
if (_c && !_c.done && (_a = _b.return)) _a.call(_b); | ||
} | ||
finally { if (e_1) throw e_1.error; } | ||
} | ||
// We do this because the `SingleSpaPlatformLocation` is a part of PLATFORM_INJECTOR, | ||
// which means it's created only once and will not be garbage collected, since the PLATFORM_INJECTOR | ||
// will keep reference to its instance. | ||
// TODO: https://github.com/single-spa/single-spa-angular/issues/170 | ||
this.onPopStateListeners = []; | ||
}; | ||
SingleSpaPlatformLocation.prototype.pushState = function (state, title, url) { | ||
this.skipNextPopState = true; | ||
_super.prototype.pushState.call(this, state, title, url); | ||
}; | ||
SingleSpaPlatformLocation.prototype.replaceState = function (state, title, url) { | ||
this.skipNextPopState = true; | ||
_super.prototype.replaceState.call(this, state, title, url); | ||
}; | ||
SingleSpaPlatformLocation.prototype.onPopState = function (fn) { | ||
var _this = this; | ||
_super.prototype.onPopState.call(this, function (event) { | ||
// Wrap any event listener into zone that is specific to some application. | ||
// The main issue is `back/forward` buttons of browsers, because they invoke | ||
// `history.back|forward` which dispatch `popstate` event. Since `single-spa` | ||
// overrides `history.replaceState` Angular's zone cannot intercept this event. | ||
// Only the root zone is able to intercept all events. | ||
// See https://github.com/single-spa/single-spa-angular/issues/94 for more detail | ||
_this.ngZone.run(function () { return fn(event); }); | ||
}); | ||
var onPopStateListener = function (event) { | ||
// The `LocationChangeEvent` doesn't have the `singleSpa` property, since it's added | ||
// by `single-spa` starting from `5.4` version. We need this check because we want | ||
// to skip "unnatural" PopStateEvents, the one caused by `single-spa`. | ||
var popStateEventWasDispatchedBySingleSpa = !!event | ||
.singleSpa; | ||
if (_this.skipNextPopState && popStateEventWasDispatchedBySingleSpa) { | ||
_this.skipNextPopState = false; | ||
} | ||
else { | ||
// Wrap any event listener into zone that is specific to some application. | ||
// The main issue is `back/forward` buttons of browsers, because they invoke | ||
// `history.back|forward` which dispatch `popstate` event. Since `single-spa` | ||
// overrides `history.replaceState` Angular's zone cannot intercept this event. | ||
// Only the root zone is able to intercept all events. | ||
// See https://github.com/single-spa/single-spa-angular/issues/94 for more details | ||
_this.ngZone.run(function () { return fn(event); }); | ||
} | ||
}; | ||
// All listeners should be stored inside an array because the `onPopState` can be called | ||
// multiple times thus we wanna reference all listeners to remove them further. | ||
this.onPopStateListeners.push(onPopStateListener); | ||
_super.prototype.onPopState.call(this, onPopStateListener); | ||
}; | ||
@@ -85,2 +138,8 @@ SingleSpaPlatformLocation.prototype.setNgZone = function (ngZone) { | ||
return __generator(this, function (_a) { | ||
// Angular provides an opportunity to develop `zone-less` application, where developers | ||
// have to trigger change detection manually. | ||
// See https://angular.io/guide/zone#noopzone | ||
if (opts.NgZone === 'noop') { | ||
return [2 /*return*/]; | ||
} | ||
// In order for multiple Angular apps to work concurrently on a page, they each need a unique identifier. | ||
@@ -110,3 +169,3 @@ opts.zoneIdentifier = "single-spa-angular:" + (props.name || props.appName); | ||
return __awaiter(this, void 0, void 0, function () { | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, bootstrappedOpts, ngZone; | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, ngZoneEnabled, bootstrappedOpts, ngZone; | ||
return __generator(this, function (_a) { | ||
@@ -132,13 +191,25 @@ switch (_a.label) { | ||
singleSpaPlatformLocation = module.injector.get(SingleSpaPlatformLocation, null); | ||
ngZoneEnabled = opts.NgZone !== 'noop'; | ||
// The user has to provide `BrowserPlatformLocation` only if his application uses routing. | ||
// So if he provided `Router` but didn't provide `BrowserPlatformLocation` then we have to inform him. | ||
if (opts.Router && singleSpaPlatformLocation === null) { | ||
// Also `getSingleSpaExtraProviders()` function should be called only if the user doesn't use | ||
// `zone-less` change detection, if `NgZone` is `noop` then we can skip it. | ||
if (ngZoneEnabled && opts.Router && singleSpaPlatformLocation === null) { | ||
throw new Error("\t\n single-spa-angular: could not retrieve extra providers from the platform injector. Did you call getSingleSpaExtraProviders() when creating platform?\t\n "); | ||
} | ||
bootstrappedOpts = opts; | ||
ngZone = module.injector.get(opts.NgZone); | ||
singleSpaPlatformLocation.setNgZone(ngZone); | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
if (ngZoneEnabled) { | ||
ngZone = module.injector.get(opts.NgZone); | ||
// `NgZone` can be enabled but routing may not be used thus `getSingleSpaExtraProviders()` | ||
// function was not called. | ||
if (singleSpaPlatformLocation !== null) { | ||
singleSpaPlatformLocation.setNgZone(ngZone); | ||
// Cleanup resources, especially remove event listeners thus they will not be added | ||
// twice when application gets bootstrapped the second time. | ||
module.onDestroy(function () { return singleSpaPlatformLocation.destroy(); }); | ||
} | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
} | ||
bootstrappedOpts.bootstrappedModule = module; | ||
@@ -159,3 +230,5 @@ return [2 /*return*/, module]; | ||
} | ||
window.removeEventListener('single-spa:routing-event', opts.routingEventListener); | ||
if (opts.routingEventListener) { | ||
window.removeEventListener('single-spa:routing-event', opts.routingEventListener); | ||
} | ||
if (opts.AnimationEngine) { | ||
@@ -167,7 +240,5 @@ animationEngine = opts.bootstrappedModule.injector.get(opts.AnimationEngine); | ||
delete opts.bootstrappedModule; | ||
if (ivyEnabled()) { | ||
// This is an issue. Issue has been created and Angular team is working on the fix: | ||
// https://github.com/angular/angular/issues/36449 | ||
removeApplicationFromDOMIfIvyEnabled(opts, props); | ||
} | ||
// This is an issue. Issue has been created and Angular team is working on the fix: | ||
// https://github.com/angular/angular/issues/36449 | ||
removeApplicationFromDOMIfIvyEnabled(opts, props); | ||
return [2 /*return*/]; | ||
@@ -177,59 +248,2 @@ }); | ||
} | ||
function ivyEnabled() { | ||
try { | ||
// `ɵivyEnabled` variable is exposed starting from version 8. | ||
// We use `require` here except of a single `import { ɵivyEnabled }` because the | ||
// developer can use Angular version that doesn't expose it (all versions <8). | ||
// The `catch` statement will handle those cases. | ||
// eslint-disable-next-line | ||
var ɵivyEnabled = require('@angular/core').ɵivyEnabled; | ||
return !!ɵivyEnabled; | ||
} | ||
catch (_a) { | ||
return false; | ||
} | ||
} | ||
function removeApplicationFromDOMIfIvyEnabled(opts, props) { | ||
var domElementGetter = chooseDomElementGetter(opts, props); | ||
var domElement = getContainerEl(domElementGetter); | ||
// View Engine removes all nodes automatically when calling `NgModuleRef.destroy()`, | ||
// which calls `ComponentRef.destroy()`. | ||
// Basically this will remove `app-root` or any other selector from the container element. | ||
while (domElement.firstChild) | ||
domElement.removeChild(domElement.firstChild); | ||
} | ||
function getContainerEl(domElementGetter) { | ||
var element = domElementGetter(); | ||
if (!element) { | ||
throw Error('domElementGetter did not return a valid dom element'); | ||
} | ||
return element; | ||
} | ||
function chooseDomElementGetter(opts, props) { | ||
props = props && props.customProps ? props.customProps : props; | ||
if (props.domElement) { | ||
return function () { return props.domElement; }; | ||
} | ||
else if (props.domElementGetter) { | ||
return props.domElementGetter; | ||
} | ||
else if (opts.domElementGetter) { | ||
return opts.domElementGetter; | ||
} | ||
else { | ||
return defaultDomElementGetter(props.name); | ||
} | ||
} | ||
function defaultDomElementGetter(name) { | ||
return function getDefaultDomElement() { | ||
var id = "single-spa-application:" + name; | ||
var domElement = document.getElementById(id); | ||
if (!domElement) { | ||
domElement = document.createElement('div'); | ||
domElement.id = id; | ||
document.body.appendChild(domElement); | ||
} | ||
return domElement; | ||
}; | ||
} | ||
@@ -236,0 +250,0 @@ var ParcelComponent = /** @class */ (function () { |
{ | ||
"$schema": "../node_modules/ng-packagr/ng-package.schema.json", | ||
"name": "single-spa-angular", | ||
"version": "4.0.1", | ||
"version": "4.1.0-alpha.0", | ||
"description": "Helpers for building single-spa applications which use Angular 2", | ||
@@ -6,0 +6,0 @@ "schematics": "./schematics/schematics.json", |
import { NodeDependency } from '@schematics/angular/utility/dependencies'; | ||
export declare function getSingleSpaDependency(): NodeDependency; | ||
export declare function getSingleSpaAngularDependency(): NodeDependency; | ||
@@ -3,0 +4,0 @@ /** |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const dependencies_1 = require("@schematics/angular/utility/dependencies"); | ||
const { version, peerDependencies, dependencies } = require('../../package.json'); | ||
function getSingleSpaDependency() { | ||
const singleSpaVersion = (peerDependencies === null || peerDependencies === void 0 ? void 0 : peerDependencies['single-spa']) || (dependencies === null || dependencies === void 0 ? void 0 : dependencies['single-spa']) || 'latest'; | ||
return { | ||
name: 'single-spa', | ||
version: singleSpaVersion, | ||
overwrite: true, | ||
type: dependencies_1.NodeDependencyType.Default, | ||
}; | ||
} | ||
exports.getSingleSpaDependency = getSingleSpaDependency; | ||
function getSingleSpaAngularDependency() { | ||
return { | ||
name: 'single-spa-angular', | ||
version: require('../../package.json').version, | ||
version, | ||
overwrite: false, | ||
@@ -9,0 +20,0 @@ type: dependencies_1.NodeDependencyType.Default, |
@@ -20,2 +20,3 @@ "use strict"; | ||
const dependencies = [ | ||
dependencies_2.getSingleSpaDependency(), | ||
dependencies_2.getSingleSpaAngularDependency(), | ||
@@ -22,0 +23,0 @@ dependencies_2.getAngularBuildersCustomWebpackDependency(), |
@@ -1,1 +0,1 @@ | ||
{"__symbolic":"module","version":4,"metadata":{"ɵa":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"@angular/common","name":"ɵBrowserPlatformLocation","line":9,"character":47},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"onPopState":[{"__symbolic":"method"}],"setNgZone":[{"__symbolic":"method"}]}},"singleSpaAngular":{"__symbolic":"function"},"getSingleSpaExtraProviders":{"__symbolic":"function","parameters":[],"value":[{"provide":{"__symbolic":"reference","name":"ɵa"},"useClass":{"__symbolic":"reference","name":"ɵa"},"deps":[[{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":44,"character":18},"arguments":[{"__symbolic":"reference","module":"@angular/common","name":"DOCUMENT","line":44,"character":25}]}]]},{"provide":{"__symbolic":"reference","module":"@angular/common","name":"PlatformLocation","line":47,"character":15},"useExisting":{"__symbolic":"reference","name":"ɵa"}}]},"ParcelModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":3,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"ParcelComponent"}],"exports":[{"__symbolic":"reference","name":"ParcelComponent"}],"entryComponents":[{"__symbolic":"reference","name":"ParcelComponent"}]}]}],"members":{}},"ParcelComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":3,"character":1},"arguments":[{"selector":"parcel","template":"<div></div>"}]}],"members":{"config":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":8,"character":3}}]}],"mountParcel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":9,"character":3}}]}],"onParcelMount":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":10,"character":3}}]}],"wrapWith":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":11,"character":3}}]}],"customProps":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":12,"character":3}}]}],"appendTo":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":13,"character":3}}]}],"handleError":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":14,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"ElementRef","module":"@angular/core","arguments":[{"__symbolic":"error","message":"Could not resolve type","line":23,"character":39,"context":{"typeName":"HTMLElement"},"module":"./src/parcel-lib/parcel.component"}]}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnChanges":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"addThingToDo":[{"__symbolic":"method"}]}}},"origins":{"ɵa":"./src/extra-providers","singleSpaAngular":"./src/single-spa-angular","getSingleSpaExtraProviders":"./src/extra-providers","ParcelModule":"./src/parcel-lib/index","ParcelComponent":"./src/parcel-lib/parcel.component"},"importAs":"single-spa-angular"} | ||
{"__symbolic":"module","version":4,"metadata":{"ɵa":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"@angular/common","name":"ɵBrowserPlatformLocation","line":9,"character":47},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"destroy":[{"__symbolic":"method"}],"pushState":[{"__symbolic":"method"}],"replaceState":[{"__symbolic":"method"}],"onPopState":[{"__symbolic":"method"}],"setNgZone":[{"__symbolic":"method"}]}},"singleSpaAngular":{"__symbolic":"function"},"getSingleSpaExtraProviders":{"__symbolic":"function","parameters":[],"value":[{"provide":{"__symbolic":"reference","name":"ɵa"},"useClass":{"__symbolic":"reference","name":"ɵa"},"deps":[[{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":87,"character":18},"arguments":[{"__symbolic":"reference","module":"@angular/common","name":"DOCUMENT","line":87,"character":25}]}]]},{"provide":{"__symbolic":"reference","module":"@angular/common","name":"PlatformLocation","line":90,"character":15},"useExisting":{"__symbolic":"reference","name":"ɵa"}}]},"ParcelModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":3,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"ParcelComponent"}],"exports":[{"__symbolic":"reference","name":"ParcelComponent"}],"entryComponents":[{"__symbolic":"reference","name":"ParcelComponent"}]}]}],"members":{}},"ParcelComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":3,"character":1},"arguments":[{"selector":"parcel","template":"<div></div>"}]}],"members":{"config":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":8,"character":3}}]}],"mountParcel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":9,"character":3}}]}],"onParcelMount":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":10,"character":3}}]}],"wrapWith":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":11,"character":3}}]}],"customProps":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":12,"character":3}}]}],"appendTo":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":13,"character":3}}]}],"handleError":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":14,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"ElementRef","module":"@angular/core","arguments":[{"__symbolic":"error","message":"Could not resolve type","line":23,"character":39,"context":{"typeName":"HTMLElement"},"module":"./src/parcel-lib/parcel.component"}]}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnChanges":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"addThingToDo":[{"__symbolic":"method"}]}}},"origins":{"ɵa":"./src/extra-providers","singleSpaAngular":"./src/single-spa-angular","getSingleSpaExtraProviders":"./src/extra-providers","ParcelModule":"./src/parcel-lib/index","ParcelComponent":"./src/parcel-lib/parcel.component"},"importAs":"single-spa-angular"} |
import { NgZone, StaticProvider } from '@angular/core'; | ||
import { ɵBrowserPlatformLocation, LocationChangeEvent } from '@angular/common'; | ||
export declare class SingleSpaPlatformLocation extends ɵBrowserPlatformLocation { | ||
/** | ||
* We could use the `inject` function from `@angular/core` which resolves | ||
* dependencies from the currently active injector, but it's a feature | ||
* of Angular 8+. Should be used when we drop support for older versions. | ||
*/ | ||
private ngZone; | ||
private skipNextPopState; | ||
private onPopStateListeners; | ||
destroy(): void; | ||
pushState(state: any, title: string, url: string): void; | ||
replaceState(state: any, title: string, url: string): void; | ||
onPopState(fn: (event: LocationChangeEvent) => void): void; | ||
@@ -11,0 +11,0 @@ setNgZone(ngZone: NgZone): void; |
@@ -1,13 +0,3 @@ | ||
import { NgZone, Type, NgModuleRef } from '@angular/core'; | ||
import { AppProps, LifeCycles } from 'single-spa'; | ||
import { LifeCycles } from 'single-spa'; | ||
import { SingleSpaAngularOpts } from 'single-spa-angular/internals'; | ||
export declare function singleSpaAngular(userOpts: SingleSpaAngularOpts): LifeCycles; | ||
interface SingleSpaAngularOpts { | ||
NgZone: typeof NgZone; | ||
bootstrapFunction(props: AppProps): Promise<NgModuleRef<any>>; | ||
updateFunction?(props: AppProps): Promise<any>; | ||
template: string; | ||
Router?: Type<any>; | ||
domElementGetter?(): HTMLElement; | ||
AnimationEngine?: Type<any>; | ||
} | ||
export {}; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
420722
74
3010
3