single-spa-angular
Advanced tools
Comparing version 4.0.1 to 4.1.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'; | ||
@@ -300,2 +300,8 @@ /*! ***************************************************************************** | ||
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. | ||
@@ -324,12 +330,13 @@ opts.zoneIdentifier = "single-spa-angular:" + (props.name || props.appName); | ||
function mount(opts, props) { | ||
var _a; | ||
return __awaiter(this, void 0, void 0, function () { | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, bootstrappedOpts, ngZone; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, ngZoneEnabled, bootstrappedOpts, ngZone; | ||
return __generator(this, function (_b) { | ||
switch (_b.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; | ||
@@ -342,3 +349,3 @@ bootstrapPromise = opts.bootstrapFunction(props); | ||
case 1: | ||
module = _a.sent(); | ||
module = _b.sent(); | ||
if (!module || typeof module.destroy !== 'function') { | ||
@@ -348,13 +355,20 @@ 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?"); | ||
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 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. | ||
(_a = singleSpaPlatformLocation) === null || _a === void 0 ? void 0 : _a.setNgZone(ngZone); | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
} | ||
bootstrappedOpts.bootstrappedModule = module; | ||
@@ -375,3 +389,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 +399,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 +407,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 +409,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,n){"object"==typeof exports&&"undefined"!=typeof module?n(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"],n):n((t=t||self)["single-spa-angular"]={},t["single-spa-angular"].internals,t.ng.core,t.ng.common)}(this,(function(t,n,e,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,n){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,n){t.__proto__=n}||function(t,n){for(var e in n)n.hasOwnProperty(e)&&(t[e]=n[e])})(t,n)};var i=function(){return(i=Object.assign||function(t){for(var n,e=1,o=arguments.length;e<o;e++)for(var r in n=arguments[e])Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r]);return t}).apply(this,arguments)};function a(t,n,e,o){var r,i=arguments.length,a=i<3?n:null===o?o=Object.getOwnPropertyDescriptor(n,e):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,n,e,o);else for(var u=t.length-1;u>=0;u--)(r=t[u])&&(a=(i<3?r(a):i>3?r(n,e,a):r(n,e))||a);return i>3&&a&&Object.defineProperty(n,e,a),a}function u(t,n,e,o){return new(e||(e=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 n;t.done?r(t.value):(n=t.value,n instanceof e?n:new e((function(t){t(n)}))).then(a,u)}l((o=o.apply(t,n||[])).next())}))}function l(t,n){var e,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(e)throw new TypeError("Generator is already executing.");for(;a;)try{if(e=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=n.call(t,a)}catch(t){i=[6,t],o=0}finally{e=r=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,u])}}}function s(t,n){var e="function"==typeof Symbol&&t[Symbol.iterator];if(!e)return t;var o,r,i=e.call(t),a=[];try{for(;(void 0===n||n-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){r={error:t}}finally{try{o&&!o.done&&(e=i.return)&&e.call(i)}finally{if(r)throw r.error}}return a}function p(){for(var t=[],n=0;n<arguments.length;n++)t=t.concat(s(arguments[n]));return t}var c=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return function(t,n){function e(){this.constructor=t}r(t,n),t.prototype=null===n?Object.create(n):(e.prototype=n.prototype,new e)}(n,t),n.prototype.onPopState=function(n){var e=this;t.prototype.onPopState.call(this,(function(t){e.ngZone.run((function(){return n(t)}))}))},n.prototype.setNgZone=function(t){this.ngZone=t},n=a([e.Injectable()],n)}(o["ɵBrowserPlatformLocation"]);var f={NgZone:null,bootstrapFunction:null,template:null,Router:void 0,domElementGetter:void 0,AnimationEngine:void 0,updateFunction:function(){return Promise.resolve()}};function d(t,n){return u(this,void 0,void 0,(function(){return l(this,(function(e){return"noop"===t.NgZone||(t.zoneIdentifier="single-spa-angular:"+(n.name||n.appName),t.NgZone.isInAngularZone=function(){return!0===window.Zone.current._properties[t.zoneIdentifier]},t.routingEventListener=function(){t.bootstrappedNgZone.run((function(){}))}),[2]}))}))}function h(t,e){var o;return u(this,void 0,void 0,(function(){var r,i,a,u,s,p,f;return l(this,(function(l){switch(l.label){case 0:if(!(r=n.chooseDomElementGetter(t,e)))throw Error("cannot mount angular application '"+(e.name||e.appName)+"' without a domElementGetter provided either as an opt or a prop");if(n.getContainerEl(r).innerHTML=t.template,!((i=t.bootstrapFunction(e))instanceof Promise))throw Error("single-spa-angular: the opts.bootstrapFunction must return a promise, but instead returned a '"+typeof i+"' that is not a Promise");return[4,i];case 1:if(!(a=l.sent())||"function"!=typeof a.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(u=a.injector.get(c,null),(s="noop"!==t.NgZone)&&t.Router&&null===u)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,s&&(f=a.injector.get(t.NgZone),null===(o=u)||void 0===o||o.setNgZone(f),p.bootstrappedNgZone=f,p.bootstrappedNgZone._inner._properties[p.zoneIdentifier]=!0,window.addEventListener("single-spa:routing-event",p.routingEventListener)),p.bootstrappedModule=a,[2,a]}}))}))}function g(t,e){return u(this,void 0,void 0,(function(){return l(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,n.removeApplicationFromDOMIfIvyEnabled(t,e),[2]}))}))}var m=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 n,e=t.mountParcel;if(!e)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=n=document.createElement(t.wrapWith),t.appendTo.appendChild(n)):(t.createdDomElement=n=document.createElement(t.wrapWith),t.host.nativeElement.children[0].appendChild(n));return t.parcel=e(t.config,i({domElement:n},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,n){var e=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(!e.unmounted||"unmount"===t)return n.apply(void 0,p(o))})).catch((function(n){throw e.nextThingToDo=Promise.resolve(),e.hasError=!0,n&&n.message&&(n.message="During '"+t+"', parcel threw an error: "+n.message),"function"==typeof e.handleError?e.handleError(n):setTimeout((function(){throw n})),n})))},t.ctorParameters=function(){return[{type:e.ElementRef}]},a([e.Input()],t.prototype,"config",void 0),a([e.Input()],t.prototype,"mountParcel",void 0),a([e.Input()],t.prototype,"onParcelMount",void 0),a([e.Input()],t.prototype,"wrapWith",void 0),a([e.Input()],t.prototype,"customProps",void 0),a([e.Input()],t.prototype,"appendTo",void 0),a([e.Input()],t.prototype,"handleError",void 0),t=a([e.Component({selector:"parcel",template:"<div></div>"})],t)}(),v=function(){function t(){}return t=a([e.NgModule({declarations:[m],exports:[m],entryComponents:[m]})],t)}();t.ParcelComponent=m,t.ParcelModule=v,t.getSingleSpaExtraProviders=function(){return[{provide:c,useClass:c,deps:[[new e.Inject(o.DOCUMENT)]]},{provide:o.PlatformLocation,useExisting:c}]},t.singleSpaAngular=function(t){if("object"!=typeof t)throw Error("single-spa-angular requires a configuration object");var n=i(i({},f),t);if("function"!=typeof n.bootstrapFunction)throw Error("single-spa-angular must be passed an opts.bootstrapFunction");if("string"!=typeof n.template)throw Error("single-spa-angular must be passed opts.template string");if(!n.NgZone)throw Error("single-spa-angular must be passed the NgZone opt");return{bootstrap:d.bind(null,n),mount:h.bind(null,n),unmount:g.bind(null,n),update:n.updateFunction}},t.ɵa=c,Object.defineProperty(t,"__esModule",{value:!0})})); | ||
//# sourceMappingURL=single-spa-angular.umd.min.js.map |
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. | ||
@@ -59,2 +66,3 @@ opts.zoneIdentifier = `single-spa-angular:${props.name || props.appName}`; | ||
function mount(opts, props) { | ||
var _a; | ||
return __awaiter(this, void 0, void 0, function* () { | ||
@@ -76,5 +84,8 @@ const domElementGetter = chooseDomElementGetter(opts, props); | ||
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 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(` | ||
@@ -85,7 +96,11 @@ 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. | ||
(_a = singleSpaPlatformLocation) === null || _a === void 0 ? void 0 : _a.setNgZone(ngZone); | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
} | ||
bootstrappedOpts.bootstrappedModule = module; | ||
@@ -103,3 +118,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) { | ||
@@ -135,66 +152,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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QUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNuRixlQUFlLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFFL0IsbUZBQW1GO1FBQ25GLGtEQUFrRDtRQUNsRCxvQ0FBb0MsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpZmVDeWNsZXMgfSBmcm9tICdzaW5nbGUtc3BhJztcbmltcG9ydCB7XG4gIGdldENvbnRhaW5lckVsLFxuICBjaG9vc2VEb21FbGVtZW50R2V0dGVyLFxuICByZW1vdmVBcHBsaWNhdGlvbkZyb21ET01JZkl2eUVuYWJsZWQsXG4gIFNpbmdsZVNwYUFuZ3VsYXJPcHRzLFxuICBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cyxcbn0gZnJvbSAnc2luZ2xlLXNwYS1hbmd1bGFyL2ludGVybmFscyc7XG5cbmltcG9ydCB7IFNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24gfSBmcm9tICcuL2V4dHJhLXByb3ZpZGVycyc7XG5cbmNvbnN0IGRlZmF1bHRPcHRzID0ge1xuICAvLyBSZXF1aXJlZCBvcHRzIHRoYXQgd2lsbCBiZSBzZXQgYnkgdGhlIGxpYnJhcnkgY29uc3VtZXIuXG4gIE5nWm9uZTogbnVsbCEsXG4gIGJvb3RzdHJhcEZ1bmN0aW9uOiBudWxsISxcbiAgdGVtcGxhdGU6IG51bGwhLFxuICAvLyBvcHRpb25hbCBvcHRzXG4gIFJvdXRlcjogdW5kZWZpbmVkLFxuICBkb21FbGVtZW50R2V0dGVyOiB1bmRlZmluZWQsIC8vIG9ubHkgb3B0aW9uYWwgaWYgeW91IHByb3ZpZGUgYSBkb21FbGVtZW50R2V0dGVyIGFzIGEgY3VzdG9tIHByb3BcbiAgQW5pbWF0aW9uRW5naW5lOiB1bmRlZmluZWQsXG4gIHVwZGF0ZUZ1bmN0aW9uOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzaW5nbGVTcGFBbmd1bGFyKHVzZXJPcHRzOiBTaW5nbGVTcGFBbmd1bGFyT3B0cyk6IExpZmVDeWNsZXMge1xuICBpZiAodHlwZW9mIHVzZXJPcHRzICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IEVycm9yKCdzaW5nbGUtc3BhLWFuZ3VsYXIgcmVxdWlyZXMgYSBjb25maWd1cmF0aW9uIG9iamVjdCcpO1xuICB9XG5cbiAgY29uc3Qgb3B0czogU2luZ2xlU3BhQW5ndWxhck9wdHMgPSB7XG4gICAgLi4uZGVmYXVsdE9wdHMsXG4gICAgLi4udXNlck9wdHMsXG4gIH07XG5cbiAgaWYgKHR5cGVvZiBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgRXJyb3IoJ3NpbmdsZS1zcGEtYW5ndWxhciBtdXN0IGJlIHBhc3NlZCBhbiBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdHMudGVtcGxhdGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgRXJyb3IoJ3NpbmdsZS1zcGEtYW5ndWxhciBtdXN0IGJlIHBhc3NlZCBvcHRzLnRlbXBsYXRlIHN0cmluZycpO1xuICB9XG5cbiAgaWYgKCFvcHRzLk5nWm9uZSkge1xuICAgIHRocm93IEVycm9yKGBzaW5nbGUtc3BhLWFuZ3VsYXIgbXVzdCBiZSBwYXNzZWQgdGhlIE5nWm9uZSBvcHRgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYm9vdHN0cmFwOiBib290c3RyYXAuYmluZChudWxsLCBvcHRzIGFzIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzKSxcbiAgICBtb3VudDogbW91bnQuYmluZChudWxsLCBvcHRzKSxcbiAgICB1bm1vdW50OiB1bm1vdW50LmJpbmQobnVsbCwgb3B0cyBhcyBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cyksXG4gICAgdXBkYXRlOiBvcHRzLnVwZGF0ZUZ1bmN0aW9uLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAob3B0czogQm9vdHN0cmFwcGVkU2luZ2xlU3BhQW5ndWxhck9wdHMsIHByb3BzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQW5ndWxhciBwcm92aWRlcyBhbiBvcHBvcnR1bml0eSB0byBkZXZlbG9wIGB6b25lLWxlc3NgIGFwcGxpY2F0aW9uLCB3aGVyZSBkZXZlbG9wZXJzXG4gIC8vIGhhdmUgdG8gdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG1hbnVhbGx5LlxuICAvLyBTZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL3pvbmUjbm9vcHpvbmVcbiAgaWYgKG9wdHMuTmdab25lID09PSAnbm9vcCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJbiBvcmRlciBmb3IgbXVsdGlwbGUgQW5ndWxhciBhcHBzIHRvIHdvcmsgY29uY3VycmVudGx5IG9uIGEgcGFnZSwgdGhleSBlYWNoIG5lZWQgYSB1bmlxdWUgaWRlbnRpZmllci5cbiAgb3B0cy56b25lSWRlbnRpZmllciA9IGBzaW5nbGUtc3BhLWFuZ3VsYXI6JHtwcm9wcy5uYW1lIHx8IHByb3BzLmFwcE5hbWV9YDtcblxuICAvLyBUaGlzIGlzIGEgaGFjaywgc2luY2UgTmdab25lIGRvZXNuJ3QgYWxsb3cgeW91IHRvIGNvbmZpZ3VyZSB0aGUgcHJvcGVydHkgdGhhdCBpZGVudGlmaWVzIHlvdXIgem9uZS5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QbGFjZU1lLVNBUy9zaW5nbGUtc3BhLWFuZ3VsYXItY2xpL2lzc3Vlcy8zMyxcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmdsZS1zcGEvc2luZ2xlLXNwYS1hbmd1bGFyL2lzc3Vlcy80NyxcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL2ExNGRjMmQ3YTQ4MjFhMTlmMjBhOTU0NzA1M2E1NzM0Nzk4ZjU0MWUvcGFja2FnZXMvY29yZS9zcmMvem9uZS9uZ196b25lLnRzI0wxNDQsXG4gIC8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvYTE0ZGMyZDdhNDgyMWExOWYyMGE5NTQ3MDUzYTU3MzQ3OThmNTQxZS9wYWNrYWdlcy9jb3JlL3NyYy96b25lL25nX3pvbmUudHMjTDI1N1xuICBvcHRzLk5nWm9uZS5pc0luQW5ndWxhclpvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiB3aW5kb3cuWm9uZS5jdXJyZW50Ll9wcm9wZXJ0aWVzW29wdHMuem9uZUlkZW50aWZpZXJdID09PSB0cnVlO1xuICB9O1xuXG4gIG9wdHMucm91dGluZ0V2ZW50TGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgb3B0cy5ib290c3RyYXBwZWROZ1pvbmUhLnJ1bigoKSA9PiB7XG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbmdsZS1zcGEvc2luZ2xlLXNwYS1hbmd1bGFyL2lzc3Vlcy84NlxuICAgICAgLy8gWm9uZSBpcyB1bmF3YXJlIG9mIHRoZSBzaW5nbGUtc3BhIG5hdmlnYXRpb24gY2hhbmdlIGFuZCBzbyBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24gZG9lc24ndCB3b3JrXG4gICAgICAvLyB1bmxlc3Mgd2UgdGVsbCBab25lIHRoYXQgc29tZXRoaW5nIGhhcHBlbmVkXG4gICAgfSk7XG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1vdW50KG9wdHM6IFNpbmdsZVNwYUFuZ3VsYXJPcHRzLCBwcm9wczogYW55KTogUHJvbWlzZTxOZ01vZHVsZVJlZjxhbnk+PiB7XG4gIGNvbnN0IGRvbUVsZW1lbnRHZXR0ZXIgPSBjaG9vc2VEb21FbGVtZW50R2V0dGVyKG9wdHMsIHByb3BzKTtcblxuICBpZiAoIWRvbUVsZW1lbnRHZXR0ZXIpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBjYW5ub3QgbW91bnQgYW5ndWxhciBhcHBsaWNhdGlvbiAnJHtcbiAgICAgICAgcHJvcHMubmFtZSB8fCBwcm9wcy5hcHBOYW1lXG4gICAgICB9JyB3aXRob3V0IGEgZG9tRWxlbWVudEdldHRlciBwcm92aWRlZCBlaXRoZXIgYXMgYW4gb3B0IG9yIGEgcHJvcGAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRhaW5lckVsID0gZ2V0Q29udGFpbmVyRWwoZG9tRWxlbWVudEdldHRlcik7XG4gIGNvbnRhaW5lckVsLmlubmVySFRNTCA9IG9wdHMudGVtcGxhdGU7XG4gIGNvbnN0IGJvb3RzdHJhcFByb21pc2UgPSBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uKHByb3BzKTtcblxuICBpZiAoIShib290c3RyYXBQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBzaW5nbGUtc3BhLWFuZ3VsYXI6IHRoZSBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZSwgYnV0IGluc3RlYWQgcmV0dXJuZWQgYSAnJHt0eXBlb2YgYm9vdHN0cmFwUHJvbWlzZX0nIHRoYXQgaXMgbm90IGEgUHJvbWlzZWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZTogTmdNb2R1bGVSZWY8YW55PiA9IGF3YWl0IGJvb3RzdHJhcFByb21pc2U7XG5cbiAgaWYgKCFtb2R1bGUgfHwgdHlwZW9mIG1vZHVsZS5kZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgc2luZ2xlLXNwYS1hbmd1bGFyOiB0aGUgb3B0cy5ib290c3RyYXBGdW5jdGlvbiByZXR1cm5lZCBhIHByb21pc2UgdGhhdCBkaWQgbm90IHJlc29sdmUgd2l0aCBhIHZhbGlkIEFuZ3VsYXIgbW9kdWxlLiBEaWQgeW91IGNhbGwgcGxhdGZvcm1Ccm93c2VyKCkuYm9vdHN0cmFwTW9kdWxlRmFjdG9yeSgpIGNvcnJlY3RseT9gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uOiBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uIHwgbnVsbCA9IG1vZHVsZS5pbmplY3Rvci5nZXQoXG4gICAgU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbixcbiAgICBudWxsLFxuICApO1xuXG4gIGNvbnN0IG5nWm9uZUVuYWJsZWQgPSBvcHRzLk5nWm9uZSAhPT0gJ25vb3AnO1xuXG4gIC8vIFRoZSB1c2VyIGhhcyB0byBwcm92aWRlIGBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbmAgb25seSBpZiBoaXMgYXBwbGljYXRpb24gdXNlcyByb3V0aW5nLlxuICAvLyBTbyBpZiBoZSBwcm92aWRlZCBgUm91dGVyYCBidXQgZGlkbid0IHByb3ZpZGUgYEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uYCB0aGVuIHdlIGhhdmUgdG8gaW5mb3JtIGhpbS5cbiAgLy8gQWxzbyBgZ2V0U2luZ2xlU3BhRXh0cmFQcm92aWRlcnMoKWAgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIHRoZSBkb2Vzbid0IHVzZVxuICAvLyBgem9uZS1sZXNzYCBjaGFuZ2UgZGV0ZWN0aW9uLCBpZiBgTmdab25lYCBpcyBgbm9vcGAgdGhlbiB3ZSBjYW4gc2tpcCBpdC5cbiAgaWYgKG5nWm9uZUVuYWJsZWQgJiYgb3B0cy5Sb3V0ZXIgJiYgc2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbiA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgXHRcbiAgICAgIHNpbmdsZS1zcGEtYW5ndWxhcjogY291bGQgbm90IHJldHJpZXZlIGV4dHJhIHByb3ZpZGVycyBmcm9tIHRoZSBwbGF0Zm9ybSBpbmplY3Rvci4gRGlkIHlvdSBjYWxsIGdldFNpbmdsZVNwYUV4dHJhUHJvdmlkZXJzKCkgd2hlbiBjcmVhdGluZyBwbGF0Zm9ybT9cdFxuICAgIGApO1xuICB9XG5cbiAgY29uc3QgYm9vdHN0cmFwcGVkT3B0cyA9IG9wdHMgYXMgQm9vdHN0cmFwcGVkU2luZ2xlU3BhQW5ndWxhck9wdHM7XG5cbiAgaWYgKG5nWm9uZUVuYWJsZWQpIHtcbiAgICBjb25zdCBuZ1pvbmU6IGltcG9ydCgnQGFuZ3VsYXIvY29yZScpLk5nWm9uZSA9IG1vZHVsZS5pbmplY3Rvci5nZXQob3B0cy5OZ1pvbmUpO1xuICAgIC8vIGBOZ1pvbmVgIGNhbiBiZSBlbmFibGVkIGJ1dCByb3V0aW5nIG1heSBub3QgYmUgdXNlZCB0aHVzIGBnZXRTaW5nbGVTcGFFeHRyYVByb3ZpZGVycygpYFxuICAgIC8vIGZ1bmN0aW9uIHdhcyBub3QgY2FsbGVkLlxuICAgIHNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24/LnNldE5nWm9uZShuZ1pvbmUpO1xuICAgIGJvb3RzdHJhcHBlZE9wdHMuYm9vdHN0cmFwcGVkTmdab25lID0gbmdab25lO1xuICAgIGJvb3RzdHJhcHBlZE9wdHMuYm9vdHN0cmFwcGVkTmdab25lWydfaW5uZXInXS5fcHJvcGVydGllc1tcbiAgICAgIGJvb3RzdHJhcHBlZE9wdHMuem9uZUlkZW50aWZpZXJcbiAgICBdID0gdHJ1ZTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2luZ2xlLXNwYTpyb3V0aW5nLWV2ZW50JywgYm9vdHN0cmFwcGVkT3B0cy5yb3V0aW5nRXZlbnRMaXN0ZW5lciEpO1xuICB9XG5cbiAgYm9vdHN0cmFwcGVkT3B0cy5ib290c3RyYXBwZWRNb2R1bGUgPSBtb2R1bGU7XG4gIHJldHVybiBtb2R1bGU7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmFzeW5jIGZ1bmN0aW9uIHVubW91bnQob3B0czogQm9vdHN0cmFwcGVkU2luZ2xlU3BhQW5ndWxhck9wdHMsIHByb3BzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKG9wdHMuUm91dGVyKSB7XG4gICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTkwNzlcbiAgICBjb25zdCByb3V0ZXIgPSBvcHRzLmJvb3RzdHJhcHBlZE1vZHVsZS5pbmplY3Rvci5nZXQob3B0cy5Sb3V0ZXIpO1xuICAgIHJvdXRlci5kaXNwb3NlKCk7XG4gIH1cblxuICBpZiAob3B0cy5yb3V0aW5nRXZlbnRMaXN0ZW5lcikge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzaW5nbGUtc3BhOnJvdXRpbmctZXZlbnQnLCBvcHRzLnJvdXRpbmdFdmVudExpc3RlbmVyKTtcbiAgfVxuXG4gIGlmIChvcHRzLkFuaW1hdGlvbkVuZ2luZSkge1xuICAgIC8qXG4gICAgVGhlIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlIGRvZXMgbm90IGNsZWFuIHVwIGFmdGVyIGl0c2VsZiA6JyguIFdoZW4geW91IHVubW91bnQvZGVzdHJveSB0aGUgbWFpbiBtb2R1bGUsIHRoZVxuICAgIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlIHVzZXMgYW4gQW5pbWF0aW9uUmVuZGVyZXIgdGhpbmcgdG8gcmVtb3ZlIGRvbSBlbGVtZW50cyBmcm9tIHRoZSBwYWdlLiBCdXQgdGhlIEFuaW1hdGlvblJlbmRlcmVyXG4gICAgZGVmZXJzIHRoZSBhY3R1YWwgd29yayB0byB0aGUgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZSB0byBkbyB0aGlzLCBhbmQgdGhlIFRyYW5zaXRpb25BbmltYXRpb25FbmdpbmUgZG9lc24ndCBhY3R1YWxseVxuICAgIHJlbW92ZSB0aGUgZG9tIG5vZGUsIGJ1dCBqdXN0IGNhbGxzIFwibWFya0VsZW1lbnRBc1JlbW92ZWQoKVwiLlxuXG4gICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9kYjYyY2NmOWViNDZlZTg5MzY2YWRlNTg2MzY1ZWEwMjdiYjkzZWIxL3BhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvcmVuZGVyL3RyYW5zaXRpb25fYW5pbWF0aW9uX2VuZ2luZS50cyNMNzE3XG5cbiAgICBXaGF0IG1hcmtBc1JlbW92ZWREb2VzIGlzIHB1dCBpdCBpbnRvIGFuIGFycmF5IGNhbGxlZCBcImNvbGxlY3RlZExlYXZlRWxlbWVudHNcIiwgd2hpY2ggaXMgYWxsIHRoZSBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkXG4gICAgYWZ0ZXIgdGhlIERPTSBoYXMgaGFkIGEgY2hhbmNlIHRvIGRvIGFueSBhbmltYXRpb25zLlxuXG4gICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdHJhbnNpdGlvbl9hbmltYXRpb25fZW5naW5lLnRzI0w1MjVcblxuICAgIFRoZSBhY3R1YWwgZG9tIG5vZGVzIGFyZW4ndCByZW1vdmVkIHVudGlsIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIFwiZmx1c2hlc1wiLlxuXG4gICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9kYjYyY2NmOWViNDZlZTg5MzY2YWRlNTg2MzY1ZWEwMjdiYjkzZWIxL3BhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvcmVuZGVyL3RyYW5zaXRpb25fYW5pbWF0aW9uX2VuZ2luZS50cyNMODUxXG5cbiAgICBVbmZvcnR1bmF0ZWx5LCB0aG91Z2gsIHRoYXQgXCJmbHVzaFwiIHdpbGwgbmV2ZXIgaGFwcGVuLCBzaW5jZSB0aGUgZW50aXJlIG1vZHVsZSBpcyBiZWluZyBkZXN0cm95ZWQgYW5kIHRoZXJlIHdpbGwgYmUgbm8gbW9yZSBmbHVzaGVzLlxuICAgIFNvIHdoYXQgd2UgZG8gaW4gdGhpcyBjb2RlIGlzIGZvcmNlIG9uZSBtb3JlIGZsdXNoIG9mIHRoZSBhbmltYXRpb25zIGFmdGVyIHRoZSBtb2R1bGUgaXMgZGVzdHJveWVkLlxuXG4gICAgSWRlYWxseSwgd2Ugd291bGQgZG8gdGhpcyBieSBnZXR0aW5nIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIGRpcmVjdGx5IGFuZCBmbHVzaGluZyBpdC4gVW5mb3J0dW5hdGVseSwgdGhvdWdoLCBpdCdzIHByaXZhdGUgY2xhc3NcbiAgICB0aGF0IGNhbm5vdCBiZSBpbXBvcnRlZCBhbmQgaXMgbm90IHByb3ZpZGVkIHRvIHRoZSBkZXBlbmRlbmN5IGluamVjdG9yLiBTbywgaW5zdGVhZCwgd2UgZ2V0IGl0cyB3cmFwcGVyIGNsYXNzLCBBbmltYXRpb25FbmdpbmUsIGFuZCB0aGVuXG4gICAgYWNjZXNzIGl0cyBwcml2YXRlIHZhcmlhYmxlIHJlZmVyZW5jZSB0byB0aGUgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZSBzbyB0aGF0IHdlIGNhbiBjYWxsIGZsdXNoLlxuICAgICovXG4gICAgY29uc3QgYW5pbWF0aW9uRW5naW5lID0gb3B0cy5ib290c3RyYXBwZWRNb2R1bGUuaW5qZWN0b3IuZ2V0KG9wdHMuQW5pbWF0aW9uRW5naW5lKTtcbiAgICBhbmltYXRpb25FbmdpbmUuX3RyYW5zaXRpb25FbmdpbmUuZmx1c2goKTtcbiAgfVxuXG4gIG9wdHMuYm9vdHN0cmFwcGVkTW9kdWxlLmRlc3Ryb3koKTtcbiAgZGVsZXRlIG9wdHMuYm9vdHN0cmFwcGVkTW9kdWxlO1xuXG4gIC8vIFRoaXMgaXMgYW4gaXNzdWUuIElzc3VlIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIEFuZ3VsYXIgdGVhbSBpcyB3b3JraW5nIG9uIHRoZSBmaXg6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzM2NDQ5XG4gIHJlbW92ZUFwcGxpY2F0aW9uRnJvbURPTUlmSXZ5RW5hYmxlZChvcHRzLCBwcm9wcyk7XG59XG4iXX0= |
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. | ||
@@ -62,6 +69,7 @@ opts.zoneIdentifier = "single-spa-angular:" + (props.name || props.appName); | ||
function mount(opts, props) { | ||
var _a; | ||
return __awaiter(this, void 0, void 0, function () { | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, bootstrappedOpts, ngZone; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, ngZoneEnabled, bootstrappedOpts, ngZone; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
@@ -80,3 +88,3 @@ domElementGetter = chooseDomElementGetter(opts, props); | ||
case 1: | ||
module = _a.sent(); | ||
module = _b.sent(); | ||
if (!module || typeof module.destroy !== 'function') { | ||
@@ -86,13 +94,20 @@ 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?"); | ||
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 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. | ||
(_a = singleSpaPlatformLocation) === null || _a === void 0 ? void 0 : _a.setNgZone(ngZone); | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
} | ||
bootstrappedOpts.bootstrappedModule = module; | ||
@@ -113,3 +128,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) { | ||
@@ -121,7 +138,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*/]; | ||
@@ -131,59 +146,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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LENBQUMsS0FBSyxFQUFFLENBQUM7YUFDM0M7WUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFFL0IsbUZBQW1GO1lBQ25GLGtEQUFrRDtZQUNsRCxvQ0FBb0MsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Ozs7Q0FDbkQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlmZUN5Y2xlcyB9IGZyb20gJ3NpbmdsZS1zcGEnO1xuaW1wb3J0IHtcbiAgZ2V0Q29udGFpbmVyRWwsXG4gIGNob29zZURvbUVsZW1lbnRHZXR0ZXIsXG4gIHJlbW92ZUFwcGxpY2F0aW9uRnJvbURPTUlmSXZ5RW5hYmxlZCxcbiAgU2luZ2xlU3BhQW5ndWxhck9wdHMsXG4gIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzLFxufSBmcm9tICdzaW5nbGUtc3BhLWFuZ3VsYXIvaW50ZXJuYWxzJztcblxuaW1wb3J0IHsgU2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbiB9IGZyb20gJy4vZXh0cmEtcHJvdmlkZXJzJztcblxuY29uc3QgZGVmYXVsdE9wdHMgPSB7XG4gIC8vIFJlcXVpcmVkIG9wdHMgdGhhdCB3aWxsIGJlIHNldCBieSB0aGUgbGlicmFyeSBjb25zdW1lci5cbiAgTmdab25lOiBudWxsISxcbiAgYm9vdHN0cmFwRnVuY3Rpb246IG51bGwhLFxuICB0ZW1wbGF0ZTogbnVsbCEsXG4gIC8vIG9wdGlvbmFsIG9wdHNcbiAgUm91dGVyOiB1bmRlZmluZWQsXG4gIGRvbUVsZW1lbnRHZXR0ZXI6IHVuZGVmaW5lZCwgLy8gb25seSBvcHRpb25hbCBpZiB5b3UgcHJvdmlkZSBhIGRvbUVsZW1lbnRHZXR0ZXIgYXMgYSBjdXN0b20gcHJvcFxuICBBbmltYXRpb25FbmdpbmU6IHVuZGVmaW5lZCxcbiAgdXBkYXRlRnVuY3Rpb246ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZVNwYUFuZ3VsYXIodXNlck9wdHM6IFNpbmdsZVNwYUFuZ3VsYXJPcHRzKTogTGlmZUN5Y2xlcyB7XG4gIGlmICh0eXBlb2YgdXNlck9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgRXJyb3IoJ3NpbmdsZS1zcGEtYW5ndWxhciByZXF1aXJlcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCBvcHRzOiBTaW5nbGVTcGFBbmd1bGFyT3B0cyA9IHtcbiAgICAuLi5kZWZhdWx0T3B0cyxcbiAgICAuLi51c2VyT3B0cyxcbiAgfTtcblxuICBpZiAodHlwZW9mIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBFcnJvcignc2luZ2xlLXNwYS1hbmd1bGFyIG11c3QgYmUgcGFzc2VkIGFuIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cy50ZW1wbGF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBFcnJvcignc2luZ2xlLXNwYS1hbmd1bGFyIG11c3QgYmUgcGFzc2VkIG9wdHMudGVtcGxhdGUgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoIW9wdHMuTmdab25lKSB7XG4gICAgdGhyb3cgRXJyb3IoYHNpbmdsZS1zcGEtYW5ndWxhciBtdXN0IGJlIHBhc3NlZCB0aGUgTmdab25lIG9wdGApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBib290c3RyYXA6IGJvb3RzdHJhcC5iaW5kKG51bGwsIG9wdHMgYXMgQm9vdHN0cmFwcGVkU2luZ2xlU3BhQW5ndWxhck9wdHMpLFxuICAgIG1vdW50OiBtb3VudC5iaW5kKG51bGwsIG9wdHMpLFxuICAgIHVubW91bnQ6IHVubW91bnQuYmluZChudWxsLCBvcHRzIGFzIEJvb3RzdHJhcHBlZFNpbmdsZVNwYUFuZ3VsYXJPcHRzKSxcbiAgICB1cGRhdGU6IG9wdHMudXBkYXRlRnVuY3Rpb24sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcChvcHRzOiBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cywgcHJvcHM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBBbmd1bGFyIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIGRldmVsb3AgYHpvbmUtbGVzc2AgYXBwbGljYXRpb24sIHdoZXJlIGRldmVsb3BlcnNcbiAgLy8gaGF2ZSB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gbWFudWFsbHkuXG4gIC8vIFNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvem9uZSNub29wem9uZVxuICBpZiAob3B0cy5OZ1pvbmUgPT09ICdub29wJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEluIG9yZGVyIGZvciBtdWx0aXBsZSBBbmd1bGFyIGFwcHMgdG8gd29yayBjb25jdXJyZW50bHkgb24gYSBwYWdlLCB0aGV5IGVhY2ggbmVlZCBhIHVuaXF1ZSBpZGVudGlmaWVyLlxuICBvcHRzLnpvbmVJZGVudGlmaWVyID0gYHNpbmdsZS1zcGEtYW5ndWxhcjoke3Byb3BzLm5hbWUgfHwgcHJvcHMuYXBwTmFtZX1gO1xuXG4gIC8vIFRoaXMgaXMgYSBoYWNrLCBzaW5jZSBOZ1pvbmUgZG9lc24ndCBhbGxvdyB5b3UgdG8gY29uZmlndXJlIHRoZSBwcm9wZXJ0eSB0aGF0IGlkZW50aWZpZXMgeW91ciB6b25lLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1BsYWNlTWUtU0FTL3NpbmdsZS1zcGEtYW5ndWxhci1jbGkvaXNzdWVzLzMzLFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vc2luZ2xlLXNwYS9zaW5nbGUtc3BhLWFuZ3VsYXIvaXNzdWVzLzQ3LFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvYTE0ZGMyZDdhNDgyMWExOWYyMGE5NTQ3MDUzYTU3MzQ3OThmNTQxZS9wYWNrYWdlcy9jb3JlL3NyYy96b25lL25nX3pvbmUudHMjTDE0NCxcbiAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9hMTRkYzJkN2E0ODIxYTE5ZjIwYTk1NDcwNTNhNTczNDc5OGY1NDFlL3BhY2thZ2VzL2NvcmUvc3JjL3pvbmUvbmdfem9uZS50cyNMMjU3XG4gIG9wdHMuTmdab25lLmlzSW5Bbmd1bGFyWm9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHdpbmRvdy5ab25lLmN1cnJlbnQuX3Byb3BlcnRpZXNbb3B0cy56b25lSWRlbnRpZmllcl0gPT09IHRydWU7XG4gIH07XG5cbiAgb3B0cy5yb3V0aW5nRXZlbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICBvcHRzLmJvb3RzdHJhcHBlZE5nWm9uZSEucnVuKCgpID0+IHtcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZ2xlLXNwYS9zaW5nbGUtc3BhLWFuZ3VsYXIvaXNzdWVzLzg2XG4gICAgICAvLyBab25lIGlzIHVuYXdhcmUgb2YgdGhlIHNpbmdsZS1zcGEgbmF2aWdhdGlvbiBjaGFuZ2UgYW5kIHNvIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBkb2Vzbid0IHdvcmtcbiAgICAgIC8vIHVubGVzcyB3ZSB0ZWxsIFpvbmUgdGhhdCBzb21ldGhpbmcgaGFwcGVuZWRcbiAgICB9KTtcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbW91bnQob3B0czogU2luZ2xlU3BhQW5ndWxhck9wdHMsIHByb3BzOiBhbnkpOiBQcm9taXNlPE5nTW9kdWxlUmVmPGFueT4+IHtcbiAgY29uc3QgZG9tRWxlbWVudEdldHRlciA9IGNob29zZURvbUVsZW1lbnRHZXR0ZXIob3B0cywgcHJvcHMpO1xuXG4gIGlmICghZG9tRWxlbWVudEdldHRlcikge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYGNhbm5vdCBtb3VudCBhbmd1bGFyIGFwcGxpY2F0aW9uICcke1xuICAgICAgICBwcm9wcy5uYW1lIHx8IHByb3BzLmFwcE5hbWVcbiAgICAgIH0nIHdpdGhvdXQgYSBkb21FbGVtZW50R2V0dGVyIHByb3ZpZGVkIGVpdGhlciBhcyBhbiBvcHQgb3IgYSBwcm9wYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29udGFpbmVyRWwgPSBnZXRDb250YWluZXJFbChkb21FbGVtZW50R2V0dGVyKTtcbiAgY29udGFpbmVyRWwuaW5uZXJIVE1MID0gb3B0cy50ZW1wbGF0ZTtcbiAgY29uc3QgYm9vdHN0cmFwUHJvbWlzZSA9IG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24ocHJvcHMpO1xuXG4gIGlmICghKGJvb3RzdHJhcFByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYHNpbmdsZS1zcGEtYW5ndWxhcjogdGhlIG9wdHMuYm9vdHN0cmFwRnVuY3Rpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlLCBidXQgaW5zdGVhZCByZXR1cm5lZCBhICcke3R5cGVvZiBib290c3RyYXBQcm9taXNlfScgdGhhdCBpcyBub3QgYSBQcm9taXNlYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlOiBOZ01vZHVsZVJlZjxhbnk+ID0gYXdhaXQgYm9vdHN0cmFwUHJvbWlzZTtcblxuICBpZiAoIW1vZHVsZSB8fCB0eXBlb2YgbW9kdWxlLmRlc3Ryb3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBzaW5nbGUtc3BhLWFuZ3VsYXI6IHRoZSBvcHRzLmJvb3RzdHJhcEZ1bmN0aW9uIHJldHVybmVkIGEgcHJvbWlzZSB0aGF0IGRpZCBub3QgcmVzb2x2ZSB3aXRoIGEgdmFsaWQgQW5ndWxhciBtb2R1bGUuIERpZCB5b3UgY2FsbCBwbGF0Zm9ybUJyb3dzZXIoKS5ib290c3RyYXBNb2R1bGVGYWN0b3J5KCkgY29ycmVjdGx5P2AsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb246IFNpbmdsZVNwYVBsYXRmb3JtTG9jYXRpb24gfCBudWxsID0gbW9kdWxlLmluamVjdG9yLmdldChcbiAgICBTaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uLFxuICAgIG51bGwsXG4gICk7XG5cbiAgY29uc3Qgbmdab25lRW5hYmxlZCA9IG9wdHMuTmdab25lICE9PSAnbm9vcCc7XG5cbiAgLy8gVGhlIHVzZXIgaGFzIHRvIHByb3ZpZGUgYEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uYCBvbmx5IGlmIGhpcyBhcHBsaWNhdGlvbiB1c2VzIHJvdXRpbmcuXG4gIC8vIFNvIGlmIGhlIHByb3ZpZGVkIGBSb3V0ZXJgIGJ1dCBkaWRuJ3QgcHJvdmlkZSBgQnJvd3NlclBsYXRmb3JtTG9jYXRpb25gIHRoZW4gd2UgaGF2ZSB0byBpbmZvcm0gaGltLlxuICAvLyBBbHNvIGBnZXRTaW5nbGVTcGFFeHRyYVByb3ZpZGVycygpYCBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgdGhlIGRvZXNuJ3QgdXNlXG4gIC8vIGB6b25lLWxlc3NgIGNoYW5nZSBkZXRlY3Rpb24sIGlmIGBOZ1pvbmVgIGlzIGBub29wYCB0aGVuIHdlIGNhbiBza2lwIGl0LlxuICBpZiAobmdab25lRW5hYmxlZCAmJiBvcHRzLlJvdXRlciAmJiBzaW5nbGVTcGFQbGF0Zm9ybUxvY2F0aW9uID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBcdFxuICAgICAgc2luZ2xlLXNwYS1hbmd1bGFyOiBjb3VsZCBub3QgcmV0cmlldmUgZXh0cmEgcHJvdmlkZXJzIGZyb20gdGhlIHBsYXRmb3JtIGluamVjdG9yLiBEaWQgeW91IGNhbGwgZ2V0U2luZ2xlU3BhRXh0cmFQcm92aWRlcnMoKSB3aGVuIGNyZWF0aW5nIHBsYXRmb3JtP1x0XG4gICAgYCk7XG4gIH1cblxuICBjb25zdCBib290c3RyYXBwZWRPcHRzID0gb3B0cyBhcyBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cztcblxuICBpZiAobmdab25lRW5hYmxlZCkge1xuICAgIGNvbnN0IG5nWm9uZTogaW1wb3J0KCdAYW5ndWxhci9jb3JlJykuTmdab25lID0gbW9kdWxlLmluamVjdG9yLmdldChvcHRzLk5nWm9uZSk7XG4gICAgLy8gYE5nWm9uZWAgY2FuIGJlIGVuYWJsZWQgYnV0IHJvdXRpbmcgbWF5IG5vdCBiZSB1c2VkIHRodXMgYGdldFNpbmdsZVNwYUV4dHJhUHJvdmlkZXJzKClgXG4gICAgLy8gZnVuY3Rpb24gd2FzIG5vdCBjYWxsZWQuXG4gICAgc2luZ2xlU3BhUGxhdGZvcm1Mb2NhdGlvbj8uc2V0Tmdab25lKG5nWm9uZSk7XG4gICAgYm9vdHN0cmFwcGVkT3B0cy5ib290c3RyYXBwZWROZ1pvbmUgPSBuZ1pvbmU7XG4gICAgYm9vdHN0cmFwcGVkT3B0cy5ib290c3RyYXBwZWROZ1pvbmVbJ19pbm5lciddLl9wcm9wZXJ0aWVzW1xuICAgICAgYm9vdHN0cmFwcGVkT3B0cy56b25lSWRlbnRpZmllclxuICAgIF0gPSB0cnVlO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzaW5nbGUtc3BhOnJvdXRpbmctZXZlbnQnLCBib290c3RyYXBwZWRPcHRzLnJvdXRpbmdFdmVudExpc3RlbmVyISk7XG4gIH1cblxuICBib290c3RyYXBwZWRPcHRzLmJvb3RzdHJhcHBlZE1vZHVsZSA9IG1vZHVsZTtcbiAgcmV0dXJuIG1vZHVsZTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuYXN5bmMgZnVuY3Rpb24gdW5tb3VudChvcHRzOiBCb290c3RyYXBwZWRTaW5nbGVTcGFBbmd1bGFyT3B0cywgcHJvcHM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAob3B0cy5Sb3V0ZXIpIHtcbiAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xOTA3OVxuICAgIGNvbnN0IHJvdXRlciA9IG9wdHMuYm9vdHN0cmFwcGVkTW9kdWxlLmluamVjdG9yLmdldChvcHRzLlJvdXRlcik7XG4gICAgcm91dGVyLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIGlmIChvcHRzLnJvdXRpbmdFdmVudExpc3RlbmVyKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NpbmdsZS1zcGE6cm91dGluZy1ldmVudCcsIG9wdHMucm91dGluZ0V2ZW50TGlzdGVuZXIpO1xuICB9XG5cbiAgaWYgKG9wdHMuQW5pbWF0aW9uRW5naW5lKSB7XG4gICAgLypcbiAgICBUaGUgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgZG9lcyBub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmIDonKC4gV2hlbiB5b3UgdW5tb3VudC9kZXN0cm95IHRoZSBtYWluIG1vZHVsZSwgdGhlXG4gICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgdXNlcyBhbiBBbmltYXRpb25SZW5kZXJlciB0aGluZyB0byByZW1vdmUgZG9tIGVsZW1lbnRzIGZyb20gdGhlIHBhZ2UuIEJ1dCB0aGUgQW5pbWF0aW9uUmVuZGVyZXJcbiAgICBkZWZlcnMgdGhlIGFjdHVhbCB3b3JrIHRvIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIHRvIGRvIHRoaXMsIGFuZCB0aGUgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZSBkb2Vzbid0IGFjdHVhbGx5XG4gICAgcmVtb3ZlIHRoZSBkb20gbm9kZSwgYnV0IGp1c3QgY2FsbHMgXCJtYXJrRWxlbWVudEFzUmVtb3ZlZCgpXCIuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL2RiNjJjY2Y5ZWI0NmVlODkzNjZhZGU1ODYzNjVlYTAyN2JiOTNlYjEvcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdHJhbnNpdGlvbl9hbmltYXRpb25fZW5naW5lLnRzI0w3MTdcblxuICAgIFdoYXQgbWFya0FzUmVtb3ZlZERvZXMgaXMgcHV0IGl0IGludG8gYW4gYXJyYXkgY2FsbGVkIFwiY29sbGVjdGVkTGVhdmVFbGVtZW50c1wiLCB3aGljaCBpcyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWRcbiAgICBhZnRlciB0aGUgRE9NIGhhcyBoYWQgYSBjaGFuY2UgdG8gZG8gYW55IGFuaW1hdGlvbnMuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9wYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3JlbmRlci90cmFuc2l0aW9uX2FuaW1hdGlvbl9lbmdpbmUudHMjTDUyNVxuXG4gICAgVGhlIGFjdHVhbCBkb20gbm9kZXMgYXJlbid0IHJlbW92ZWQgdW50aWwgdGhlIFRyYW5zaXRpb25BbmltYXRpb25FbmdpbmUgXCJmbHVzaGVzXCIuXG5cbiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL2RiNjJjY2Y5ZWI0NmVlODkzNjZhZGU1ODYzNjVlYTAyN2JiOTNlYjEvcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvdHJhbnNpdGlvbl9hbmltYXRpb25fZW5naW5lLnRzI0w4NTFcblxuICAgIFVuZm9ydHVuYXRlbHksIHRob3VnaCwgdGhhdCBcImZsdXNoXCIgd2lsbCBuZXZlciBoYXBwZW4sIHNpbmNlIHRoZSBlbnRpcmUgbW9kdWxlIGlzIGJlaW5nIGRlc3Ryb3llZCBhbmQgdGhlcmUgd2lsbCBiZSBubyBtb3JlIGZsdXNoZXMuXG4gICAgU28gd2hhdCB3ZSBkbyBpbiB0aGlzIGNvZGUgaXMgZm9yY2Ugb25lIG1vcmUgZmx1c2ggb2YgdGhlIGFuaW1hdGlvbnMgYWZ0ZXIgdGhlIG1vZHVsZSBpcyBkZXN0cm95ZWQuXG5cbiAgICBJZGVhbGx5LCB3ZSB3b3VsZCBkbyB0aGlzIGJ5IGdldHRpbmcgdGhlIFRyYW5zaXRpb25BbmltYXRpb25FbmdpbmUgZGlyZWN0bHkgYW5kIGZsdXNoaW5nIGl0LiBVbmZvcnR1bmF0ZWx5LCB0aG91Z2gsIGl0J3MgcHJpdmF0ZSBjbGFzc1xuICAgIHRoYXQgY2Fubm90IGJlIGltcG9ydGVkIGFuZCBpcyBub3QgcHJvdmlkZWQgdG8gdGhlIGRlcGVuZGVuY3kgaW5qZWN0b3IuIFNvLCBpbnN0ZWFkLCB3ZSBnZXQgaXRzIHdyYXBwZXIgY2xhc3MsIEFuaW1hdGlvbkVuZ2luZSwgYW5kIHRoZW5cbiAgICBhY2Nlc3MgaXRzIHByaXZhdGUgdmFyaWFibGUgcmVmZXJlbmNlIHRvIHRoZSBUcmFuc2l0aW9uQW5pbWF0aW9uRW5naW5lIHNvIHRoYXQgd2UgY2FuIGNhbGwgZmx1c2guXG4gICAgKi9cbiAgICBjb25zdCBhbmltYXRpb25FbmdpbmUgPSBvcHRzLmJvb3RzdHJhcHBlZE1vZHVsZS5pbmplY3Rvci5nZXQob3B0cy5BbmltYXRpb25FbmdpbmUpO1xuICAgIGFuaW1hdGlvbkVuZ2luZS5fdHJhbnNpdGlvbkVuZ2luZS5mbHVzaCgpO1xuICB9XG5cbiAgb3B0cy5ib290c3RyYXBwZWRNb2R1bGUuZGVzdHJveSgpO1xuICBkZWxldGUgb3B0cy5ib290c3RyYXBwZWRNb2R1bGU7XG5cbiAgLy8gVGhpcyBpcyBhbiBpc3N1ZS4gSXNzdWUgaGFzIGJlZW4gY3JlYXRlZCBhbmQgQW5ndWxhciB0ZWFtIGlzIHdvcmtpbmcgb24gdGhlIGZpeDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzY0NDlcbiAgcmVtb3ZlQXBwbGljYXRpb25Gcm9tRE9NSWZJdnlFbmFibGVkKG9wdHMsIHByb3BzKTtcbn1cbiJdfQ== |
import { __decorate, __awaiter } from 'tslib'; | ||
import { chooseDomElementGetter, getContainerEl, removeApplicationFromDOMIfIvyEnabled } from 'single-spa-angular/internals'; | ||
import { Injectable, Inject, ElementRef, Input, Component, NgModule } from '@angular/core'; | ||
@@ -77,2 +78,8 @@ import { ɵBrowserPlatformLocation, DOCUMENT, PlatformLocation } from '@angular/common'; | ||
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. | ||
@@ -99,2 +106,3 @@ opts.zoneIdentifier = `single-spa-angular:${props.name || props.appName}`; | ||
function mount(opts, props) { | ||
var _a; | ||
return __awaiter(this, void 0, void 0, function* () { | ||
@@ -116,5 +124,8 @@ const domElementGetter = chooseDomElementGetter(opts, props); | ||
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 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 +136,11 @@ 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. | ||
(_a = singleSpaPlatformLocation) === null || _a === void 0 ? void 0 : _a.setNgZone(ngZone); | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
} | ||
bootstrappedOpts.bootstrappedModule = module; | ||
@@ -143,3 +158,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 +192,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 +199,0 @@ let ParcelComponent = class ParcelComponent { |
import { __extends, __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'; | ||
@@ -84,2 +85,8 @@ import { ɵBrowserPlatformLocation, DOCUMENT, PlatformLocation } from '@angular/common'; | ||
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. | ||
@@ -108,6 +115,7 @@ opts.zoneIdentifier = "single-spa-angular:" + (props.name || props.appName); | ||
function mount(opts, props) { | ||
var _a; | ||
return __awaiter(this, void 0, void 0, function () { | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, bootstrappedOpts, ngZone; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
var domElementGetter, containerEl, bootstrapPromise, module, singleSpaPlatformLocation, ngZoneEnabled, bootstrappedOpts, ngZone; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
@@ -126,3 +134,3 @@ domElementGetter = chooseDomElementGetter(opts, props); | ||
case 1: | ||
module = _a.sent(); | ||
module = _b.sent(); | ||
if (!module || typeof module.destroy !== 'function') { | ||
@@ -132,13 +140,20 @@ 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?"); | ||
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 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. | ||
(_a = singleSpaPlatformLocation) === null || _a === void 0 ? void 0 : _a.setNgZone(ngZone); | ||
bootstrappedOpts.bootstrappedNgZone = ngZone; | ||
bootstrappedOpts.bootstrappedNgZone['_inner']._properties[bootstrappedOpts.zoneIdentifier] = true; | ||
window.addEventListener('single-spa:routing-event', bootstrappedOpts.routingEventListener); | ||
} | ||
bootstrappedOpts.bootstrappedModule = module; | ||
@@ -159,3 +174,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 +184,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 +192,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 +194,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", | ||
"description": "Helpers for building single-spa applications which use Angular 2", | ||
@@ -6,0 +6,0 @@ "schematics": "./schematics/schematics.json", |
@@ -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
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
380221
74
2731
2