UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

263 lines 33.9 kB
import { __decorate, __metadata, __values } from "tslib"; import { Directive, EmbeddedViewRef, Input, OnChanges, ChangeDetectorRef, SimpleChange, SimpleChanges, TemplateRef, ViewContainerRef, NgModule, NgZone, Output, EventEmitter } from '@angular/core'; import { CommonModule } from '@angular/common'; /** * @hidden */ var IgxTemplateOutletDirective = /** @class */ (function () { function IgxTemplateOutletDirective(_viewContainerRef, _zone, cdr) { this._viewContainerRef = _viewContainerRef; this._zone = _zone; this.cdr = cdr; /** * The embedded views cache. Collection is key-value paired. * Key is the template id, value is the embedded view for the related template. */ this._embeddedViewsMap = new Map(); this.onViewCreated = new EventEmitter(); this.onViewMoved = new EventEmitter(); this.onCachedViewLoaded = new EventEmitter(); this.onBeforeViewDetach = new EventEmitter(); } IgxTemplateOutletDirective.prototype.ngOnChanges = function (changes) { var actionType = this._getActionType(changes); switch (actionType) { case TemplateOutletAction.CreateView: this._recreateView(); break; case TemplateOutletAction.MoveView: this._moveView(); break; case TemplateOutletAction.UseCachedView: this._useCachedView(); break; case TemplateOutletAction.UpdateViewContext: this._updateExistingContext(this.igxTemplateOutletContext); break; } }; IgxTemplateOutletDirective.prototype.cleanCache = function () { this._embeddedViewsMap.forEach(function (item) { if (!item.destroyed) { item.destroy(); } }); this._embeddedViewsMap.clear(); }; IgxTemplateOutletDirective.prototype.cleanView = function (tmplID) { var embView = this._embeddedViewsMap.get(tmplID); if (embView) { embView.destroy(); this._embeddedViewsMap.delete(tmplID); } }; IgxTemplateOutletDirective.prototype._recreateView = function () { var prevIndex = this._viewRef ? this._viewContainerRef.indexOf(this._viewRef) : -1; // detach old and create new if (prevIndex !== -1) { this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext }); this._viewContainerRef.detach(prevIndex); } if (this.igxTemplateOutlet) { this._viewRef = this._viewContainerRef.createEmbeddedView(this.igxTemplateOutlet, this.igxTemplateOutletContext); this.onViewCreated.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext }); var tmplId = this.igxTemplateOutletContext['templateID']; if (tmplId) { // if context contains a template id, check if we have a view for that template already stored in the cache // if not create a copy and add it to the cache in detached state. // Note: Views in detached state do not appear in the DOM, however they remain stored in memory. var res = this._embeddedViewsMap.get(this.igxTemplateOutletContext['templateID']); if (!res) { this._embeddedViewsMap.set(this.igxTemplateOutletContext['templateID'], this._viewRef); } } } }; IgxTemplateOutletDirective.prototype._moveView = function () { // using external view and inserting it in current view. var view = this.igxTemplateOutletContext['moveView']; var owner = this.igxTemplateOutletContext['owner']; if (view !== this._viewRef) { if (owner._viewContainerRef.indexOf(view) !== -1) { // detach in case view it is attached somewhere else at the moment. this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext }); owner._viewContainerRef.detach(owner._viewContainerRef.indexOf(view)); } if (this._viewRef && this._viewContainerRef.indexOf(this._viewRef) !== -1) { this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext }); this._viewContainerRef.detach(this._viewContainerRef.indexOf(this._viewRef)); } this._viewRef = view; this._viewContainerRef.insert(view, 0); this._updateExistingContext(this.igxTemplateOutletContext); this.onViewMoved.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext }); } }; IgxTemplateOutletDirective.prototype._useCachedView = function () { // use view for specific template cached in the current template outlet var tmplID = this.igxTemplateOutletContext['templateID']; var cachedView = tmplID ? this._embeddedViewsMap.get(tmplID) : null; // if view exists, but template has been changed and there is a view in the cache with the related template // then detach old view and insert the stored one with the matching template // after that update its context. if (this._viewContainerRef.length > 0) { this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext }); this._viewContainerRef.detach(this._viewContainerRef.indexOf(this._viewRef)); } this._viewRef = cachedView; var oldContext = this._cloneContext(cachedView.context); this._viewContainerRef.insert(this._viewRef, 0); this._updateExistingContext(this.igxTemplateOutletContext); this.onCachedViewLoaded.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext, oldContext: oldContext }); }; IgxTemplateOutletDirective.prototype._shouldRecreateView = function (changes) { var ctxChange = changes['igxTemplateOutletContext']; return !!changes['igxTemplateOutlet'] || (ctxChange && this._hasContextShapeChanged(ctxChange)); }; IgxTemplateOutletDirective.prototype._hasContextShapeChanged = function (ctxChange) { var e_1, _a; var prevCtxKeys = Object.keys(ctxChange.previousValue || {}); var currCtxKeys = Object.keys(ctxChange.currentValue || {}); if (prevCtxKeys.length === currCtxKeys.length) { try { for (var currCtxKeys_1 = __values(currCtxKeys), currCtxKeys_1_1 = currCtxKeys_1.next(); !currCtxKeys_1_1.done; currCtxKeys_1_1 = currCtxKeys_1.next()) { var propName = currCtxKeys_1_1.value; if (prevCtxKeys.indexOf(propName) === -1) { return true; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (currCtxKeys_1_1 && !currCtxKeys_1_1.done && (_a = currCtxKeys_1.return)) _a.call(currCtxKeys_1); } finally { if (e_1) throw e_1.error; } } return false; } else { return true; } }; IgxTemplateOutletDirective.prototype._updateExistingContext = function (ctx) { var e_2, _a; try { for (var _b = __values(Object.keys(ctx)), _c = _b.next(); !_c.done; _c = _b.next()) { var propName = _c.value; this._viewRef.context[propName] = this.igxTemplateOutletContext[propName]; } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_2) throw e_2.error; } } }; IgxTemplateOutletDirective.prototype._cloneContext = function (ctx) { var e_3, _a; var clone = {}; try { for (var _b = __values(Object.keys(ctx)), _c = _b.next(); !_c.done; _c = _b.next()) { var propName = _c.value; clone[propName] = ctx[propName]; } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_3) throw e_3.error; } } return clone; }; IgxTemplateOutletDirective.prototype._getActionType = function (changes) { var movedView = this.igxTemplateOutletContext['moveView']; var tmplID = this.igxTemplateOutletContext['templateID']; var cachedView = tmplID ? this._embeddedViewsMap.get(tmplID) : null; var shouldRecreate = this._shouldRecreateView(changes); if (movedView) { // view is moved from external source return TemplateOutletAction.MoveView; } else if (shouldRecreate && cachedView) { // should recreate (template or context change) and there is a matching template in cache return TemplateOutletAction.UseCachedView; } else if (!this._viewRef || shouldRecreate) { // no view or should recreate return TemplateOutletAction.CreateView; } else if (this.igxTemplateOutletContext) { // has context, update context return TemplateOutletAction.UpdateViewContext; } }; IgxTemplateOutletDirective.ctorParameters = function () { return [ { type: ViewContainerRef }, { type: NgZone }, { type: ChangeDetectorRef } ]; }; __decorate([ Input(), __metadata("design:type", Object) ], IgxTemplateOutletDirective.prototype, "igxTemplateOutletContext", void 0); __decorate([ Input(), __metadata("design:type", TemplateRef) ], IgxTemplateOutletDirective.prototype, "igxTemplateOutlet", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxTemplateOutletDirective.prototype, "onViewCreated", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxTemplateOutletDirective.prototype, "onViewMoved", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxTemplateOutletDirective.prototype, "onCachedViewLoaded", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxTemplateOutletDirective.prototype, "onBeforeViewDetach", void 0); IgxTemplateOutletDirective = __decorate([ Directive({ selector: '[igxTemplateOutlet]' }), __metadata("design:paramtypes", [ViewContainerRef, NgZone, ChangeDetectorRef]) ], IgxTemplateOutletDirective); return IgxTemplateOutletDirective; }()); export { IgxTemplateOutletDirective }; var TemplateOutletAction; (function (TemplateOutletAction) { TemplateOutletAction[TemplateOutletAction["CreateView"] = 0] = "CreateView"; TemplateOutletAction[TemplateOutletAction["MoveView"] = 1] = "MoveView"; TemplateOutletAction[TemplateOutletAction["UseCachedView"] = 2] = "UseCachedView"; TemplateOutletAction[TemplateOutletAction["UpdateViewContext"] = 3] = "UpdateViewContext"; })(TemplateOutletAction || (TemplateOutletAction = {})); /** * @hidden */ var IgxTemplateOutletModule = /** @class */ (function () { function IgxTemplateOutletModule() { } IgxTemplateOutletModule = __decorate([ NgModule({ declarations: [IgxTemplateOutletDirective], entryComponents: [], exports: [IgxTemplateOutletDirective], imports: [CommonModule] }) ], IgxTemplateOutletModule); return IgxTemplateOutletModule; }()); export { IgxTemplateOutletModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVfb3V0bGV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlcy90ZW1wbGF0ZS1vdXRsZXQvdGVtcGxhdGVfb3V0bGV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFDL0QsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUNyRyxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHL0M7O0dBRUc7QUFFSDtJQXlCSSxvQ0FBbUIsaUJBQW1DLEVBQVUsS0FBYSxFQUFTLEdBQXNCO1FBQXpGLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF0QjVHOzs7VUFHRTtRQUNNLHNCQUFpQixHQUFzQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBT2xFLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXdCLENBQUM7UUFHekQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUd2RCx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBOEIsQ0FBQztRQUdwRSx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztJQUdyRSxDQUFDO0lBRUQsZ0RBQVcsR0FBWCxVQUFZLE9BQXNCO1FBQzlCLElBQU0sVUFBVSxHQUF5QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RFLFFBQVEsVUFBVSxFQUFFO1lBQ2hCLEtBQUssb0JBQW9CLENBQUMsVUFBVTtnQkFBRSxJQUFJLENB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Q25CLE9BQU8sRUFBRSxDQUFDLDBCQUEwQixDQUFDO1lBQ3JDLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztTQUMxQixDQUFDO09BRVcsdUJBQXVCLENBQ25DO0lBQUQsOEJBQUM7Q0FBQSxBQURELElBQ0M7U0FEWSx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSwgRW1iZWRkZWRWaWV3UmVmLCBJbnB1dCwgT25DaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBTaW1wbGVDaGFuZ2UsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmLCBOZ01vZHVsZSwgTmdab25lLCBPdXRwdXQsIEV2ZW50RW1pdHRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IElCYXNlRXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbaWd4VGVtcGxhdGVPdXRsZXRdJyB9KVxuZXhwb3J0IGNsYXNzIElneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICBwcml2YXRlIF92aWV3UmVmICE6IEVtYmVkZGVkVmlld1JlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgKiBUaGUgZW1iZWRkZWQgdmlld3MgY2FjaGUuIENvbGxlY3Rpb24gaXMga2V5LXZhbHVlIHBhaXJlZC5cbiAgICAqIEtleSBpcyB0aGUgdGVtcGxhdGUgaWQsIHZhbHVlIGlzIHRoZSBlbWJlZGRlZCB2aWV3IGZvciB0aGUgcmVsYXRlZCB0ZW1wbGF0ZS5cbiAgICAqL1xuICAgIHByaXZhdGUgX2VtYmVkZGVkVmlld3NNYXA6IE1hcDxzdHJpbmcsIEVtYmVkZGVkVmlld1JlZjxhbnk+PiA9IG5ldyBNYXAoKTtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBpZ3hUZW1wbGF0ZU91dGxldENvbnRleHQgITogT2JqZWN0O1xuXG4gICAgQElucHV0KCkgcHVibGljIGlneFRlbXBsYXRlT3V0bGV0ICE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25WaWV3Q3JlYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVZpZXdDaGFuZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25WaWV3TW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElWaWV3Q2hhbmdlRXZlbnRBcmdzPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ2FjaGVkVmlld0xvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNhY2hlZFZpZXdMb2FkZWRFdmVudEFyZ3M+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25CZWZvcmVWaWV3RGV0YWNoID0gbmV3IEV2ZW50RW1pdHRlcjxJVmlld0NoYW5nZUV2ZW50QXJncz4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgcHJpdmF0ZSBfem9uZTogTmdab25lLCBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uVHlwZTogVGVtcGxhdGVPdXRsZXRBY3Rpb24gPSB0aGlzLl9nZXRBY3Rpb25UeXBlKGNoYW5nZXMpO1xuICAgICAgICBzd2l0Y2ggKGFjdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVGVtcGxhdGVPdXRsZXRBY3Rpb24uQ3JlYXRlVmlldzogdGhpcy5fcmVjcmVhdGVWaWV3KCk7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBUZW1wbGF0ZU91dGxldEFjdGlvbi5Nb3ZlVmlldzogdGhpcy5fbW92ZVZpZXcoKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRlbXBsYXRlT3V0bGV0QWN0aW9uLlVzZUNhY2hlZFZpZXc6IHRoaXMuX3VzZUNhY2hlZFZpZXcoKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRlbXBsYXRlT3V0bGV0QWN0aW9uLlVwZGF0ZVZpZXdDb250ZXh0OiB0aGlzLl91cGRhdGVFeGlzdGluZ0NvbnRleHQodGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQpOyBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbkNhY2hlKCkge1xuICAgICAgICB0aGlzLl9lbWJlZGRlZFZpZXdzTWFwLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW5WaWV3KHRtcGxJRCkge1xuICAgICAgICBjb25zdCBlbWJWaWV3ID0gdGhpcy5fZW1iZWRkZWRWaWV3c01hcC5nZXQodG1wbElEKTtcbiAgICAgICAgaWYgKGVtYlZpZXcpIHtcbiAgICAgICAgICAgIGVtYlZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fZW1iZWRkZWRWaWV3c01hcC5kZWxldGUodG1wbElEKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3JlY3JlYXRlVmlldygpIHtcbiAgICAgICAgY29uc3QgcHJldkluZGV4ID0gdGhpcy5fdmlld1JlZiA/IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih0aGlzLl92aWV3UmVmKSA6IC0xO1xuICAgICAgICAvLyBkZXRhY2ggb2xkIGFuZCBjcmVhdGUgbmV3XG4gICAgICAgIGlmIChwcmV2SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLm9uQmVmb3JlVmlld0RldGFjaC5lbWl0KHsgb3duZXI6IHRoaXMsIHZpZXc6IHRoaXMuX3ZpZXdSZWYsIGNvbnRleHQ6IHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0IH0pO1xuICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2gocHJldkluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pZ3hUZW1wbGF0ZU91dGxldCkge1xuICAgICAgICAgICAgdGhpcy5fdmlld1JlZiA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KFxuICAgICAgICAgICAgICAgIHRoaXMuaWd4VGVtcGxhdGVPdXRsZXQsIHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0KTtcbiAgICAgICAgICAgIHRoaXMub25WaWV3Q3JlYXRlZC5lbWl0KHsgb3duZXI6IHRoaXMsIHZpZXc6IHRoaXMuX3ZpZXdSZWYsIGNvbnRleHQ6IHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0IH0pO1xuICAgICAgICAgICAgY29uc3QgdG1wbElkID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ3RlbXBsYXRlSUQnXTtcbiAgICAgICAgICAgIGlmICh0bXBsSWQpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBjb250ZXh0IGNvbnRhaW5zIGEgdGVtcGxhdGUgaWQsIGNoZWNrIGlmIHdlIGhhdmUgYSB2aWV3IGZvciB0aGF0IHRlbXBsYXRlIGFscmVhZHkgc3RvcmVkIGluIHRoZSBjYWNoZVxuICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBjcmVhdGUgYSBjb3B5IGFuZCBhZGQgaXQgdG8gdGhlIGNhY2hlIGluIGRldGFjaGVkIHN0YXRlLlxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IFZpZXdzIGluIGRldGFjaGVkIHN0YXRlIGRvIG5vdCBhcHBlYXIgaW4gdGhlIERPTSwgaG93ZXZlciB0aGV5IHJlbWFpbiBzdG9yZWQgaW4gbWVtb3J5LlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuZ2V0KHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0Wyd0ZW1wbGF0ZUlEJ10pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuc2V0KHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0Wyd0ZW1wbGF0ZUlEJ10sIHRoaXMuX3ZpZXdSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX21vdmVWaWV3KCkge1xuICAgICAgICAvLyB1c2luZyBleHRlcm5hbCB2aWV3IGFuZCBpbnNlcnRpbmcgaXQgaW4gY3VycmVudCB2aWV3LlxuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ21vdmVWaWV3J107XG4gICAgICAgIGNvbnN0IG93bmVyID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ293bmVyJ107XG4gICAgICAgIGlmICh2aWV3ICE9PSB0aGlzLl92aWV3UmVmKSB7XG4gICAgICAgICAgICBpZiAob3duZXIuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih2aWV3KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBkZXRhY2ggaW4gY2FzZSB2aWV3IGl0IGlzIGF0dGFjaGVkIHNvbWV3aGVyZSBlbHNlIGF0IHRoZSBtb21lbnQuXG4gICAgICAgICAgICAgICAgdGhpcy5vbkJlZm9yZVZpZXdEZXRhY2guZW1pdCh7IG93bmVyOiB0aGlzLCB2aWV3OiB0aGlzLl92aWV3UmVmLCBjb250ZXh0OiB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCB9KTtcbiAgICAgICAgICAgICAgICBvd25lci5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2gob3duZXIuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih2aWV3KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdmlld1JlZiAmJiB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fdmlld1JlZikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkJlZm9yZVZpZXdEZXRhY2guZW1pdCh7IG93bmVyOiB0aGlzLCB2aWV3OiB0aGlzLl92aWV3UmVmLCBjb250ZXh0OiB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmRldGFjaCh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fdmlld1JlZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdmlld1JlZiA9IHZpZXc7XG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluc2VydCh2aWV3LCAwKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUV4aXN0aW5nQ29udGV4dCh0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCk7XG4gICAgICAgICAgICB0aGlzLm9uVmlld01vdmVkLmVtaXQoeyBvd25lcjogdGhpcywgdmlldzogdGhpcy5fdmlld1JlZiwgY29udGV4dDogdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBfdXNlQ2FjaGVkVmlldygpIHtcbiAgICAgICAgLy8gdXNlIHZpZXcgZm9yIHNwZWNpZmljIHRlbXBsYXRlIGNhY2hlZCBpbiB0aGUgY3VycmVudCB0ZW1wbGF0ZSBvdXRsZXRcbiAgICAgICAgY29uc3QgdG1wbElEID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ3RlbXBsYXRlSUQnXTtcbiAgICAgICAgY29uc3QgY2FjaGVkVmlldyA9IHRtcGxJRCA/XG4gICAgICAgICAgICB0aGlzLl9lbWJlZGRlZFZpZXdzTWFwLmdldCh0bXBsSUQpIDpcbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIC8vIGlmIHZpZXcgZXhpc3RzLCBidXQgdGVtcGxhdGUgaGFzIGJlZW4gY2hhbmdlZCBhbmQgdGhlcmUgaXMgYSB2aWV3IGluIHRoZSBjYWNoZSB3aXRoIHRoZSByZWxhdGVkIHRlbXBsYXRlXG4gICAgICAgIC8vIHRoZW4gZGV0YWNoIG9sZCB2aWV3IGFuZCBpbnNlcnQgdGhlIHN0b3JlZCBvbmUgd2l0aCB0aGUgbWF0Y2hpbmcgdGVtcGxhdGVcbiAgICAgICAgLy8gYWZ0ZXIgdGhhdCB1cGRhdGUgaXRzIGNvbnRleHQuXG4gICAgICAgIGlmICh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub25CZWZvcmVWaWV3RGV0YWNoLmVtaXQoeyBvd25lcjogdGhpcywgdmlldzogdGhpcy5fdmlld1JlZiwgY29udGV4dDogdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQgfSk7XG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmRldGFjaCh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fdmlld1JlZikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdmlld1JlZiA9IGNhY2hlZFZpZXc7XG4gICAgICAgIGNvbnN0IG9sZENvbnRleHQgPSB0aGlzLl9jbG9uZUNvbnRleHQoY2FjaGVkVmlldy5jb250ZXh0KTtcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbnNlcnQodGhpcy5fdmlld1JlZiwgMCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUV4aXN0aW5nQ29udGV4dCh0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCk7XG4gICAgICAgIHRoaXMub25DYWNoZWRWaWV3TG9hZGVkLmVtaXQoeyBvd25lcjogdGhpcywgdmlldzogdGhpcy5fdmlld1JlZiwgY29udGV4dDogdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQsIG9sZENvbnRleHQgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvdWxkUmVjcmVhdGVWaWV3KGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3R4Q2hhbmdlID0gY2hhbmdlc1snaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0J107XG4gICAgICAgIHJldHVybiAhIWNoYW5nZXNbJ2lneFRlbXBsYXRlT3V0bGV0J10gfHwgKGN0eENoYW5nZSAmJiB0aGlzLl9oYXNDb250ZXh0U2hhcGVDaGFuZ2VkKGN0eENoYW5nZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhc0NvbnRleHRTaGFwZUNoYW5nZWQoY3R4Q2hhbmdlOiBTaW1wbGVDaGFuZ2UpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcHJldkN0eEtleXMgPSBPYmplY3Qua2V5cyhjdHhDaGFuZ2UucHJldmlvdXNWYWx1ZSB8fCB7fSk7XG4gICAgICAgIGNvbnN0IGN1cnJDdHhLZXlzID0gT2JqZWN0LmtleXMoY3R4Q2hhbmdlLmN1cnJlbnRWYWx1ZSB8fCB7fSk7XG5cbiAgICAgICAgaWYgKHByZXZDdHhLZXlzLmxlbmd0aCA9PT0gY3VyckN0eEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIGN1cnJDdHhLZXlzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZDdHhLZXlzLmluZGV4T2YocHJvcE5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3VwZGF0ZUV4aXN0aW5nQ29udGV4dChjdHg6IE9iamVjdCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKGN0eCkpIHtcbiAgICAgICAgICAgICg8YW55PnRoaXMuX3ZpZXdSZWYuY29udGV4dClbcHJvcE5hbWVdID0gKDxhbnk+dGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQpW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2Nsb25lQ29udGV4dChjdHg6IGFueSk6IGFueSB7XG4gICAgICAgIGNvbnN0IGNsb25lID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMoY3R4KSkge1xuICAgICAgICAgICAgY2xvbmVbcHJvcE5hbWVdID0gY3R4W3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0QWN0aW9uVHlwZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IG1vdmVkVmlldyA9IHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0Wydtb3ZlVmlldyddO1xuICAgICAgICBjb25zdCB0bXBsSUQgPSB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dFsndGVtcGxhdGVJRCddO1xuICAgICAgICBjb25zdCBjYWNoZWRWaWV3ID0gdG1wbElEID9cbiAgICAgICAgICAgIHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuZ2V0KHRtcGxJRCkgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgY29uc3Qgc2hvdWxkUmVjcmVhdGUgPSB0aGlzLl9zaG91bGRSZWNyZWF0ZVZpZXcoY2hhbmdlcyk7XG4gICAgICAgIGlmIChtb3ZlZFZpZXcpIHtcbiAgICAgICAgICAgIC8vIHZpZXcgaXMgbW92ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZU91dGxldEFjdGlvbi5Nb3ZlVmlldztcbiAgICAgICAgfSBlbHNlIGlmIChzaG91bGRSZWNyZWF0ZSAmJiBjYWNoZWRWaWV3KSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgcmVjcmVhdGUgKHRlbXBsYXRlIG9yIGNvbnRleHQgY2hhbmdlKSBhbmQgdGhlcmUgaXMgYSBtYXRjaGluZyB0ZW1wbGF0ZSBpbiBjYWNoZVxuICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlT3V0bGV0QWN0aW9uLlVzZUNhY2hlZFZpZXc7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3ZpZXdSZWYgfHwgc2hvdWxkUmVjcmVhdGUpIHtcbiAgICAgICAgICAgIC8vIG5vIHZpZXcgb3Igc2hvdWxkIHJlY3JlYXRlXG4gICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVPdXRsZXRBY3Rpb24uQ3JlYXRlVmlldztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCkge1xuICAgICAgICAgICAgLy8gaGFzIGNvbnRleHQsIHVwZGF0ZSBjb250ZXh0XG4gICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVPdXRsZXRBY3Rpb24uVXBkYXRlVmlld0NvbnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5lbnVtIFRlbXBsYXRlT3V0bGV0QWN0aW9uIHtcbiAgICBDcmVhdGVWaWV3LFxuICAgIE1vdmVWaWV3LFxuICAgIFVzZUNhY2hlZFZpZXcsXG4gICAgVXBkYXRlVmlld0NvbnRleHRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlld0NoYW5nZUV2ZW50QXJncyBleHRlbmRzIElCYXNlRXZlbnRBcmdzIHtcbiAgICBvd25lcjogSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmU7XG4gICAgdmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT47XG4gICAgY29udGV4dDogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzIGV4dGVuZHMgSVZpZXdDaGFuZ2VFdmVudEFyZ3Mge1xuICAgIG9sZENvbnRleHQ6IGFueTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmVdLFxuICAgIGVudHJ5Q29tcG9uZW50czogW10sXG4gICAgZXhwb3J0czogW0lneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlXSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXVxufSlcblxuZXhwb3J0IGNsYXNzIElneFRlbXBsYXRlT3V0bGV0TW9kdWxlIHtcbn1cbiJdfQ==