@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
226 lines • 31.5 kB
JavaScript
import { __decorate, __metadata } 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
*/
let IgxTemplateOutletDirective = class IgxTemplateOutletDirective {
constructor(_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();
}
ngOnChanges(changes) {
const 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;
}
}
cleanCache() {
this._embeddedViewsMap.forEach((item) => {
if (!item.destroyed) {
item.destroy();
}
});
this._embeddedViewsMap.clear();
}
cleanView(tmplID) {
const embView = this._embeddedViewsMap.get(tmplID);
if (embView) {
embView.destroy();
this._embeddedViewsMap.delete(tmplID);
}
}
_recreateView() {
const 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 });
const 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.
const res = this._embeddedViewsMap.get(this.igxTemplateOutletContext['templateID']);
if (!res) {
this._embeddedViewsMap.set(this.igxTemplateOutletContext['templateID'], this._viewRef);
}
}
}
}
_moveView() {
// using external view and inserting it in current view.
const view = this.igxTemplateOutletContext['moveView'];
const 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 });
}
}
_useCachedView() {
// use view for specific template cached in the current template outlet
const tmplID = this.igxTemplateOutletContext['templateID'];
const 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;
const 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 });
}
_shouldRecreateView(changes) {
const ctxChange = changes['igxTemplateOutletContext'];
return !!changes['igxTemplateOutlet'] || (ctxChange && this._hasContextShapeChanged(ctxChange));
}
_hasContextShapeChanged(ctxChange) {
const prevCtxKeys = Object.keys(ctxChange.previousValue || {});
const currCtxKeys = Object.keys(ctxChange.currentValue || {});
if (prevCtxKeys.length === currCtxKeys.length) {
for (const propName of currCtxKeys) {
if (prevCtxKeys.indexOf(propName) === -1) {
return true;
}
}
return false;
}
else {
return true;
}
}
_updateExistingContext(ctx) {
for (const propName of Object.keys(ctx)) {
this._viewRef.context[propName] = this.igxTemplateOutletContext[propName];
}
}
_cloneContext(ctx) {
const clone = {};
for (const propName of Object.keys(ctx)) {
clone[propName] = ctx[propName];
}
return clone;
}
_getActionType(changes) {
const movedView = this.igxTemplateOutletContext['moveView'];
const tmplID = this.igxTemplateOutletContext['templateID'];
const cachedView = tmplID ?
this._embeddedViewsMap.get(tmplID) :
null;
const 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 = () => [
{ 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);
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
*/
let IgxTemplateOutletModule = class IgxTemplateOutletModule {
};
IgxTemplateOutletModule = __decorate([
NgModule({
declarations: [IgxTemplateOutletDirective],
entryComponents: [],
exports: [IgxTemplateOutletDirective],
imports: [CommonModule]
})
], IgxTemplateOutletModule);
export { IgxTemplateOutletModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVfb3V0bGV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlcy90ZW1wbGF0ZS1vdXRsZXQvdGVtcGxhdGVfb3V0bGV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFDL0QsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUNyRyxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHL0M7O0dBRUc7QUFFSCxJQUFhLDBCQUEwQixHQUF2QyxNQUFhLDBCQUEwQjtJQXlCbkMsWUFBbUIsaUJBQW1DLEVBQVUsS0FBYSxFQUFTLEdBQXNCO1FBQXpGLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF0QjVHOzs7VUFHRTtRQUNNLHNCQUFpQixHQUFzQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBT2xFLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXdCLENBQUM7UUFHekQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUd2RCx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBOEIsQ0FBQztRQUdwRSx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztJQUdyRSxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQzlCLE1BQU0sVUFBVSxHQUF5QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RFLFFBQVEsVUFBVSxFQUFFO1lBQ2hCLEtBQUssb0JBQW9C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O1lBQ3RDLDhCQUE4QjtZQUM5QixPQUFPLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDO1NBQ2pEO0lBQ0wsQ0FBQztDQUNKLENBQUE7O1lBdkp5QyxnQkFBZ0I7WUFBaUIsTUFBTTtZQUFjLGlCQUFpQjs7QUFoQm5HO0lBQVIsS0FBSyxFQUFFOzhCQUFvQyxNQUFNOzRFQUFDO0FBRTFDO0lBQVIsS0FBSyxFQUFFOzhCQUE2QixXQUFXO3FFQUFNO0FBR3REO0lBREMsTUFBTSxFQUFFOztpRUFDdUQ7QUFHaEU7SUFEQyxNQUFNLEVBQUU7OytEQUNxRDtBQUc5RDtJQURDLE1BQU0sRUFBRTs7c0VBQ2tFO0FBRzNFO0lBREMsTUFBTSxFQUFFOztzRUFDNEQ7QUF2QjVELDBCQUEwQjtJQUR0QyxTQUFTLENBQUMsRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztxQ0EwQkwsZ0JBQWdCLEVBQWlCLE1BQU0sRUFBYyxpQkFBaUI7R0F6Qm5HLDBCQUEwQixDQWdMdEM7U0FoTFksMEJBQTBCO0FBaUx2QyxJQUFLLG9CQUtKO0FBTEQsV0FBSyxvQkFBb0I7SUFDckIsMkVBQVUsQ0FBQTtJQUNWLHVFQUFRLENBQUE7SUFDUixpRkFBYSxDQUFBO0lBQ2IseUZBQWlCLENBQUE7QUFDckIsQ0FBQyxFQUxJLG9CQUFvQixLQUFwQixvQkFBb0IsUUFLeEI7QUFZRDs7R0FFRztBQVFILElBQWEsdUJBQXVCLEdBQXBDLE1BQWEsdUJBQXVCO0NBQ25DLENBQUE7QUFEWSx1QkFBdUI7SUFQbkMsUUFBUSxDQUFDO1FBQ04sWUFBWSxFQUFFLENBQUMsMEJBQTBCLENBQUM7UUFDMUMsZUFBZSxFQUFFLEVBQUU7UUFDbkIsT0FBTyxFQUFFLENBQUMsMEJBQTBCLENBQUM7UUFDckMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO0tBQzFCLENBQUM7R0FFVyx1QkFBdUIsQ0FDbkM7U0FEWSx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSwgRW1iZWRkZWRWaWV3UmVmLCBJbnB1dCwgT25DaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBTaW1wbGVDaGFuZ2UsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmLCBOZ01vZHVsZSwgTmdab25lLCBPdXRwdXQsIEV2ZW50RW1pdHRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IElCYXNlRXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbaWd4VGVtcGxhdGVPdXRsZXRdJyB9KVxuZXhwb3J0IGNsYXNzIElneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICBwcml2YXRlIF92aWV3UmVmICE6IEVtYmVkZGVkVmlld1JlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgKiBUaGUgZW1iZWRkZWQgdmlld3MgY2FjaGUuIENvbGxlY3Rpb24gaXMga2V5LXZhbHVlIHBhaXJlZC5cbiAgICAqIEtleSBpcyB0aGUgdGVtcGxhdGUgaWQsIHZhbHVlIGlzIHRoZSBlbWJlZGRlZCB2aWV3IGZvciB0aGUgcmVsYXRlZCB0ZW1wbGF0ZS5cbiAgICAqL1xuICAgIHByaXZhdGUgX2VtYmVkZGVkVmlld3NNYXA6IE1hcDxzdHJpbmcsIEVtYmVkZGVkVmlld1JlZjxhbnk+PiA9IG5ldyBNYXAoKTtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBpZ3hUZW1wbGF0ZU91dGxldENvbnRleHQgITogT2JqZWN0O1xuXG4gICAgQElucHV0KCkgcHVibGljIGlneFRlbXBsYXRlT3V0bGV0ICE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25WaWV3Q3JlYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVZpZXdDaGFuZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25WaWV3TW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElWaWV3Q2hhbmdlRXZlbnRBcmdzPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ2FjaGVkVmlld0xvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNhY2hlZFZpZXdMb2FkZWRFdmVudEFyZ3M+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25CZWZvcmVWaWV3RGV0YWNoID0gbmV3IEV2ZW50RW1pdHRlcjxJVmlld0NoYW5nZUV2ZW50QXJncz4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgcHJpdmF0ZSBfem9uZTogTmdab25lLCBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uVHlwZTogVGVtcGxhdGVPdXRsZXRBY3Rpb24gPSB0aGlzLl9nZXRBY3Rpb25UeXBlKGNoYW5nZXMpO1xuICAgICAgICBzd2l0Y2ggKGFjdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVGVtcGxhdGVPdXRsZXRBY3Rpb24uQ3JlYXRlVmlldzogdGhpcy5fcmVjcmVhdGVWaWV3KCk7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBUZW1wbGF0ZU91dGxldEFjdGlvbi5Nb3ZlVmlldzogdGhpcy5fbW92ZVZpZXcoKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRlbXBsYXRlT3V0bGV0QWN0aW9uLlVzZUNhY2hlZFZpZXc6IHRoaXMuX3VzZUNhY2hlZFZpZXcoKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRlbXBsYXRlT3V0bGV0QWN0aW9uLlVwZGF0ZVZpZXdDb250ZXh0OiB0aGlzLl91cGRhdGVFeGlzdGluZ0NvbnRleHQodGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQpOyBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbkNhY2hlKCkge1xuICAgICAgICB0aGlzLl9lbWJlZGRlZFZpZXdzTWFwLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW5WaWV3KHRtcGxJRCkge1xuICAgICAgICBjb25zdCBlbWJWaWV3ID0gdGhpcy5fZW1iZWRkZWRWaWV3c01hcC5nZXQodG1wbElEKTtcbiAgICAgICAgaWYgKGVtYlZpZXcpIHtcbiAgICAgICAgICAgIGVtYlZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fZW1iZWRkZWRWaWV3c01hcC5kZWxldGUodG1wbElEKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3JlY3JlYXRlVmlldygpIHtcbiAgICAgICAgY29uc3QgcHJldkluZGV4ID0gdGhpcy5fdmlld1JlZiA/IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih0aGlzLl92aWV3UmVmKSA6IC0xO1xuICAgICAgICAvLyBkZXRhY2ggb2xkIGFuZCBjcmVhdGUgbmV3XG4gICAgICAgIGlmIChwcmV2SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLm9uQmVmb3JlVmlld0RldGFjaC5lbWl0KHsgb3duZXI6IHRoaXMsIHZpZXc6IHRoaXMuX3ZpZXdSZWYsIGNvbnRleHQ6IHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0IH0pO1xuICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2gocHJldkluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pZ3hUZW1wbGF0ZU91dGxldCkge1xuICAgICAgICAgICAgdGhpcy5fdmlld1JlZiA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KFxuICAgICAgICAgICAgICAgIHRoaXMuaWd4VGVtcGxhdGVPdXRsZXQsIHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0KTtcbiAgICAgICAgICAgIHRoaXMub25WaWV3Q3JlYXRlZC5lbWl0KHsgb3duZXI6IHRoaXMsIHZpZXc6IHRoaXMuX3ZpZXdSZWYsIGNvbnRleHQ6IHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0IH0pO1xuICAgICAgICAgICAgY29uc3QgdG1wbElkID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ3RlbXBsYXRlSUQnXTtcbiAgICAgICAgICAgIGlmICh0bXBsSWQpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBjb250ZXh0IGNvbnRhaW5zIGEgdGVtcGxhdGUgaWQsIGNoZWNrIGlmIHdlIGhhdmUgYSB2aWV3IGZvciB0aGF0IHRlbXBsYXRlIGFscmVhZHkgc3RvcmVkIGluIHRoZSBjYWNoZVxuICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBjcmVhdGUgYSBjb3B5IGFuZCBhZGQgaXQgdG8gdGhlIGNhY2hlIGluIGRldGFjaGVkIHN0YXRlLlxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IFZpZXdzIGluIGRldGFjaGVkIHN0YXRlIGRvIG5vdCBhcHBlYXIgaW4gdGhlIERPTSwgaG93ZXZlciB0aGV5IHJlbWFpbiBzdG9yZWQgaW4gbWVtb3J5LlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuZ2V0KHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0Wyd0ZW1wbGF0ZUlEJ10pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuc2V0KHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0Wyd0ZW1wbGF0ZUlEJ10sIHRoaXMuX3ZpZXdSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX21vdmVWaWV3KCkge1xuICAgICAgICAvLyB1c2luZyBleHRlcm5hbCB2aWV3IGFuZCBpbnNlcnRpbmcgaXQgaW4gY3VycmVudCB2aWV3LlxuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ21vdmVWaWV3J107XG4gICAgICAgIGNvbnN0IG93bmVyID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ293bmVyJ107XG4gICAgICAgIGlmICh2aWV3ICE9PSB0aGlzLl92aWV3UmVmKSB7XG4gICAgICAgICAgICBpZiAob3duZXIuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih2aWV3KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBkZXRhY2ggaW4gY2FzZSB2aWV3IGl0IGlzIGF0dGFjaGVkIHNvbWV3aGVyZSBlbHNlIGF0IHRoZSBtb21lbnQuXG4gICAgICAgICAgICAgICAgdGhpcy5vbkJlZm9yZVZpZXdEZXRhY2guZW1pdCh7IG93bmVyOiB0aGlzLCB2aWV3OiB0aGlzLl92aWV3UmVmLCBjb250ZXh0OiB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCB9KTtcbiAgICAgICAgICAgICAgICBvd25lci5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2gob3duZXIuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih2aWV3KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdmlld1JlZiAmJiB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fdmlld1JlZikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkJlZm9yZVZpZXdEZXRhY2guZW1pdCh7IG93bmVyOiB0aGlzLCB2aWV3OiB0aGlzLl92aWV3UmVmLCBjb250ZXh0OiB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmRldGFjaCh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fdmlld1JlZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdmlld1JlZiA9IHZpZXc7XG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluc2VydCh2aWV3LCAwKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUV4aXN0aW5nQ29udGV4dCh0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCk7XG4gICAgICAgICAgICB0aGlzLm9uVmlld01vdmVkLmVtaXQoeyBvd25lcjogdGhpcywgdmlldzogdGhpcy5fdmlld1JlZiwgY29udGV4dDogdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBfdXNlQ2FjaGVkVmlldygpIHtcbiAgICAgICAgLy8gdXNlIHZpZXcgZm9yIHNwZWNpZmljIHRlbXBsYXRlIGNhY2hlZCBpbiB0aGUgY3VycmVudCB0ZW1wbGF0ZSBvdXRsZXRcbiAgICAgICAgY29uc3QgdG1wbElEID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ3RlbXBsYXRlSUQnXTtcbiAgICAgICAgY29uc3QgY2FjaGVkVmlldyA9IHRtcGxJRCA/XG4gICAgICAgICAgICB0aGlzLl9lbWJlZGRlZFZpZXdzTWFwLmdldCh0bXBsSUQpIDpcbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIC8vIGlmIHZpZXcgZXhpc3RzLCBidXQgdGVtcGxhdGUgaGFzIGJlZW4gY2hhbmdlZCBhbmQgdGhlcmUgaXMgYSB2aWV3IGluIHRoZSBjYWNoZSB3aXRoIHRoZSByZWxhdGVkIHRlbXBsYXRlXG4gICAgICAgIC8vIHRoZW4gZGV0YWNoIG9sZCB2aWV3IGFuZCBpbnNlcnQgdGhlIHN0b3JlZCBvbmUgd2l0aCB0aGUgbWF0Y2hpbmcgdGVtcGxhdGVcbiAgICAgICAgLy8gYWZ0ZXIgdGhhdCB1cGRhdGUgaXRzIGNvbnRleHQuXG4gICAgICAgIGlmICh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub25CZWZvcmVWaWV3RGV0YWNoLmVtaXQoeyBvd25lcjogdGhpcywgdmlldzogdGhpcy5fdmlld1JlZiwgY29udGV4dDogdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQgfSk7XG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmRldGFjaCh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fdmlld1JlZikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdmlld1JlZiA9IGNhY2hlZFZpZXc7XG4gICAgICAgIGNvbnN0IG9sZENvbnRleHQgPSB0aGlzLl9jbG9uZUNvbnRleHQoY2FjaGVkVmlldy5jb250ZXh0KTtcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbnNlcnQodGhpcy5fdmlld1JlZiwgMCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUV4aXN0aW5nQ29udGV4dCh0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCk7XG4gICAgICAgIHRoaXMub25DYWNoZWRWaWV3TG9hZGVkLmVtaXQoeyBvd25lcjogdGhpcywgdmlldzogdGhpcy5fdmlld1JlZiwgY29udGV4dDogdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQsIG9sZENvbnRleHQgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvdWxkUmVjcmVhdGVWaWV3KGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3R4Q2hhbmdlID0gY2hhbmdlc1snaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0J107XG4gICAgICAgIHJldHVybiAhIWNoYW5nZXNbJ2lneFRlbXBsYXRlT3V0bGV0J10gfHwgKGN0eENoYW5nZSAmJiB0aGlzLl9oYXNDb250ZXh0U2hhcGVDaGFuZ2VkKGN0eENoYW5nZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhc0NvbnRleHRTaGFwZUNoYW5nZWQoY3R4Q2hhbmdlOiBTaW1wbGVDaGFuZ2UpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcHJldkN0eEtleXMgPSBPYmplY3Qua2V5cyhjdHhDaGFuZ2UucHJldmlvdXNWYWx1ZSB8fCB7fSk7XG4gICAgICAgIGNvbnN0IGN1cnJDdHhLZXlzID0gT2JqZWN0LmtleXMoY3R4Q2hhbmdlLmN1cnJlbnRWYWx1ZSB8fCB7fSk7XG5cbiAgICAgICAgaWYgKHByZXZDdHhLZXlzLmxlbmd0aCA9PT0gY3VyckN0eEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIGN1cnJDdHhLZXlzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZDdHhLZXlzLmluZGV4T2YocHJvcE5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3VwZGF0ZUV4aXN0aW5nQ29udGV4dChjdHg6IE9iamVjdCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKGN0eCkpIHtcbiAgICAgICAgICAgICg8YW55PnRoaXMuX3ZpZXdSZWYuY29udGV4dClbcHJvcE5hbWVdID0gKDxhbnk+dGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQpW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2Nsb25lQ29udGV4dChjdHg6IGFueSk6IGFueSB7XG4gICAgICAgIGNvbnN0IGNsb25lID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMoY3R4KSkge1xuICAgICAgICAgICAgY2xvbmVbcHJvcE5hbWVdID0gY3R4W3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0QWN0aW9uVHlwZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IG1vdmVkVmlldyA9IHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0Wydtb3ZlVmlldyddO1xuICAgICAgICBjb25zdCB0bXBsSUQgPSB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dFsndGVtcGxhdGVJRCddO1xuICAgICAgICBjb25zdCBjYWNoZWRWaWV3ID0gdG1wbElEID9cbiAgICAgICAgICAgIHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuZ2V0KHRtcGxJRCkgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgY29uc3Qgc2hvdWxkUmVjcmVhdGUgPSB0aGlzLl9zaG91bGRSZWNyZWF0ZVZpZXcoY2hhbmdlcyk7XG4gICAgICAgIGlmIChtb3ZlZFZpZXcpIHtcbiAgICAgICAgICAgIC8vIHZpZXcgaXMgbW92ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZU91dGxldEFjdGlvbi5Nb3ZlVmlldztcbiAgICAgICAgfSBlbHNlIGlmIChzaG91bGRSZWNyZWF0ZSAmJiBjYWNoZWRWaWV3KSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgcmVjcmVhdGUgKHRlbXBsYXRlIG9yIGNvbnRleHQgY2hhbmdlKSBhbmQgdGhlcmUgaXMgYSBtYXRjaGluZyB0ZW1wbGF0ZSBpbiBjYWNoZVxuICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlT3V0bGV0QWN0aW9uLlVzZUNhY2hlZFZpZXc7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3ZpZXdSZWYgfHwgc2hvdWxkUmVjcmVhdGUpIHtcbiAgICAgICAgICAgIC8vIG5vIHZpZXcgb3Igc2hvdWxkIHJlY3JlYXRlXG4gICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVPdXRsZXRBY3Rpb24uQ3JlYXRlVmlldztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCkge1xuICAgICAgICAgICAgLy8gaGFzIGNvbnRleHQsIHVwZGF0ZSBjb250ZXh0XG4gICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVPdXRsZXRBY3Rpb24uVXBkYXRlVmlld0NvbnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5lbnVtIFRlbXBsYXRlT3V0bGV0QWN0aW9uIHtcbiAgICBDcmVhdGVWaWV3LFxuICAgIE1vdmVWaWV3LFxuICAgIFVzZUNhY2hlZFZpZXcsXG4gICAgVXBkYXRlVmlld0NvbnRleHRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlld0NoYW5nZUV2ZW50QXJncyBleHRlbmRzIElCYXNlRXZlbnRBcmdzIHtcbiAgICBvd25lcjogSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmU7XG4gICAgdmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT47XG4gICAgY29udGV4dDogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzIGV4dGVuZHMgSVZpZXdDaGFuZ2VFdmVudEFyZ3Mge1xuICAgIG9sZENvbnRleHQ6IGFueTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmVdLFxuICAgIGVudHJ5Q29tcG9uZW50czogW10sXG4gICAgZXhwb3J0czogW0lneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlXSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXVxufSlcblxuZXhwb3J0IGNsYXNzIElneFRlbXBsYXRlT3V0bGV0TW9kdWxlIHtcbn1cbiJdfQ==