UNPKG

@covalent/core

Version:

Core Teradata UI Platform for layouts, icons, custom components and themes. This should be added as a dependency for any project that wants to use layouts, icons and themes for Angular Material.

207 lines 29 kB
import { Injectable, ComponentFactoryResolver, SkipSelf, Optional, } from '@angular/core'; import { Injector, } from '@angular/core'; import { TemplatePortal, ComponentPortal } from '@angular/cdk/portal'; import { Overlay, OverlayConfig } from '@angular/cdk/overlay'; import { Subject } from 'rxjs'; import { distinctUntilChanged } from 'rxjs/operators'; import { TdLoadingComponent, LoadingStyle } from '../loading.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; /** * NOTE: @internal usage only. */ export class TdLoadingFactory { constructor(_componentFactoryResolver, _overlay, _injector) { this._componentFactoryResolver = _componentFactoryResolver; this._overlay = _overlay; this._injector = _injector; } /** * Uses material `Overlay` services to create a DOM element and attach the loading component * into it. Leveraging the state and configuration from it. * * Saves a reference in context to be called when registering/resolving the loading element. */ createFullScreenComponent(options) { options.height = undefined; options.style = LoadingStyle.FullScreen; const loadingRef = this._initializeContext(); let loading = false; let overlayRef; loadingRef.observable .pipe(distinctUntilChanged()) .subscribe((registered) => { if (registered > 0 && !loading) { loading = true; overlayRef = this._createOverlay(); loadingRef.componentRef = overlayRef.attach(new ComponentPortal(TdLoadingComponent)); this._mapOptions(options, loadingRef.componentRef?.instance); loadingRef.componentRef?.instance.show(); loadingRef.componentRef?.changeDetectorRef.detectChanges(); } else if (registered <= 0 && loading) { loading = false; loadingRef.componentRef?.instance.hide(); loadingRef.componentRef?.destroy(); overlayRef.detach(); overlayRef.dispose(); } }); return loadingRef; } /** * Creates a loading component dynamically and attaches it into the given viewContainerRef. * Leverages TemplatePortals from material to inject the template inside of it so it fits * perfectly when overlaying it. * * Saves a reference in context to be called when registering/resolving the loading element. */ createOverlayComponent(options, viewContainerRef, templateRef) { options.height = undefined; options.style = LoadingStyle.Overlay; const loadingRef = this._createComponent(options); let loading = false; if (loadingRef.componentRef) { loadingRef.componentRef.instance.content = new TemplatePortal(templateRef, viewContainerRef); viewContainerRef.clear(); viewContainerRef.insert(loadingRef.componentRef?.hostView, 0); } loadingRef.observable .pipe(distinctUntilChanged()) .subscribe((registered) => { if (registered > 0 && !loading) { loading = true; loadingRef.componentRef?.instance.show(); } else if (registered <= 0 && loading) { loading = false; loadingRef.componentRef?.instance.hide(); } }); return loadingRef; } /** * Creates a loading component dynamically and attaches it into the given viewContainerRef. * Replaces the template with the loading component depending if it was registered or resolved. * * Saves a reference in context to be called when registering/resolving the loading element. */ createReplaceComponent(options, viewContainerRef, templateRef, context) { const nativeElement = (templateRef.elementRef.nativeElement); options.height = nativeElement.nextElementSibling ? nativeElement.nextElementSibling.scrollHeight : undefined; options.style = LoadingStyle.None; const loadingRef = this._createComponent(options); let loading = false; // passing context so when the template is attached, we can keep the reference of the variables const contentRef = viewContainerRef.createEmbeddedView(templateRef, context); loadingRef.observable .pipe(distinctUntilChanged()) .subscribe((registered) => { if (registered > 0 && !loading && loadingRef.componentRef) { loading = true; // detach the content and attach the loader if loader is there const index = viewContainerRef.indexOf(loadingRef.componentRef.hostView); if (index < 0) { viewContainerRef.detach(viewContainerRef.indexOf(contentRef)); viewContainerRef.insert(loadingRef.componentRef.hostView, 0); } loadingRef.componentRef?.instance.show(); } else if (registered <= 0 && loading && loadingRef.componentRef) { loading = false; loadingRef.componentRef?.instance.hide(); // detach loader and attach the content if content is there const index = viewContainerRef.indexOf(contentRef); if (index < 0) { viewContainerRef.detach(viewContainerRef.indexOf(loadingRef.componentRef.hostView)); viewContainerRef.insert(contentRef, 0); } /** * Need to call "markForCheck" and "detectChanges" on attached template, so its detected by parent component when attached * with "OnPush" change detection */ contentRef.detectChanges(); contentRef.markForCheck(); } }); return loadingRef; } /** * Creates a fullscreen overlay for the loading usage. */ _createOverlay() { const state = new OverlayConfig(); state.hasBackdrop = false; state.positionStrategy = this._overlay .position() .global() .centerHorizontally() .centerVertically(); return this._overlay.create(state); } /** * Creates a generic component dynamically waiting to be attached to a viewContainerRef. */ _createComponent(options) { const compRef = this._initializeContext(); compRef.componentRef = this._componentFactoryResolver .resolveComponentFactory(TdLoadingComponent) .create(this._injector); this._mapOptions(options, compRef.componentRef.instance); return compRef; } /** * Initialize context for loading component. */ _initializeContext() { const subject = new Subject(); return { observable: subject.asObservable(), subject, componentRef: undefined, times: 0, }; } /** * Maps configuration to the loading component instance. */ _mapOptions(options, instance) { if (options.style) { instance.style = options.style; } if (options.type !== undefined) { instance.type = options.type; } if (options.height !== undefined) { instance.height = options.height; } if (options.mode !== undefined) { instance.mode = options.mode; } if (options.color !== undefined) { instance.color = options.color; } } } TdLoadingFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TdLoadingFactory, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.Overlay }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); TdLoadingFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TdLoadingFactory }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TdLoadingFactory, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i1.Overlay }, { type: i0.Injector }]; } }); export function LOADING_FACTORY_PROVIDER_FACTORY(parent, componentFactoryResolver, overlay, injector) { return (parent || new TdLoadingFactory(componentFactoryResolver, overlay, injector)); } export const LOADING_FACTORY_PROVIDER = { // If there is already a service available, use that. Otherwise, provide a new one. provide: TdLoadingFactory, deps: [ [new Optional(), new SkipSelf(), TdLoadingFactory], ComponentFactoryResolver, Overlay, Injector, ], useFactory: LOADING_FACTORY_PROVIDER_FACTORY, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGluZy5mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2xvYWRpbmcvc3JjL3NlcnZpY2VzL2xvYWRpbmcuZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLHdCQUF3QixFQUV4QixRQUFRLEVBQ1IsUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxRQUFRLEdBSVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBRTFFLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUFleEU7O0dBRUc7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQ1UseUJBQW1ELEVBQ25ELFFBQWlCLEVBQ2pCLFNBQW1CO1FBRm5CLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBMEI7UUFDbkQsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFVO0lBQzFCLENBQUM7SUFFSjs7Ozs7T0FLRztJQUNJLHlCQUF5QixDQUFDLE9BQXlCO1FBQzlCLE9BQVEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQzVCLE9BQVEsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUNuRSxNQUFNLFVBQVUsR0FBZ0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FB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Q0FBZ0MsQ0FDOUMsTUFBd0IsRUFDeEIsd0JBQWtELEVBQ2xELE9BQWdCLEVBQ2hCLFFBQWtCO0lBRWxCLE9BQU8sQ0FDTCxNQUFNLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQzVFLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWE7SUFDaEQsbUZBQW1GO0lBQ25GLE9BQU8sRUFBRSxnQkFBZ0I7SUFDekIsSUFBSSxFQUFFO1FBQ0osQ0FBQyxJQUFJLFFBQVEsRUFBRSxFQUFFLElBQUksUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLENBQUM7UUFDbEQsd0JBQXdCO1FBQ3hCLE9BQU87UUFDUCxRQUFRO0tBQ1Q7SUFDRCxVQUFVLEVBQUUsZ0NBQWdDO0NBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIFByb3ZpZGVyLFxuICBTa2lwU2VsZixcbiAgT3B0aW9uYWwsXG4gIEVtYmVkZGVkVmlld1JlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBJbmplY3RvcixcbiAgQ29tcG9uZW50UmVmLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCwgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVGRMb2FkaW5nQ29udGV4dCB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvbG9hZGluZy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVGRMb2FkaW5nQ29tcG9uZW50LCBMb2FkaW5nU3R5bGUgfSBmcm9tICcuLi9sb2FkaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJVGRMb2FkaW5nQ29uZmlnIH0gZnJvbSAnLi9sb2FkaW5nLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElJbnRlcm5hbExvYWRpbmdPcHRpb25zIGV4dGVuZHMgSVRkTG9hZGluZ0NvbmZpZyB7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgc3R5bGU/OiBMb2FkaW5nU3R5bGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvYWRpbmdSZWYge1xuICBvYnNlcnZhYmxlOiBPYnNlcnZhYmxlPGFueT47XG4gIGNvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxhbnk+O1xuICBzdWJqZWN0OiBTdWJqZWN0PGFueT47XG4gIHRpbWVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogTk9URTogQGludGVybmFsIHVzYWdlIG9ubHkuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUZExvYWRpbmdGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBfb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3JcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBVc2VzIG1hdGVyaWFsIGBPdmVybGF5YCBzZXJ2aWNlcyB0byBjcmVhdGUgYSBET00gZWxlbWVudCBhbmQgYXR0YWNoIHRoZSBsb2FkaW5nIGNvbXBvbmVudFxuICAgKiBpbnRvIGl0LiBMZXZlcmFnaW5nIHRoZSBzdGF0ZSBhbmQgY29uZmlndXJhdGlvbiBmcm9tIGl0LlxuICAgKlxuICAgKiBTYXZlcyBhIHJlZmVyZW5jZSBpbiBjb250ZXh0IHRvIGJlIGNhbGxlZCB3aGVuIHJlZ2lzdGVyaW5nL3Jlc29sdmluZyB0aGUgbG9hZGluZyBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUZ1bGxTY3JlZW5Db21wb25lbnQob3B0aW9uczogSVRkTG9hZGluZ0NvbmZpZyk6IElMb2FkaW5nUmVmIHtcbiAgICAoPElJbnRlcm5hbExvYWRpbmdPcHRpb25zPm9wdGlvbnMpLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICAoPElJbnRlcm5hbExvYWRpbmdPcHRpb25zPm9wdGlvbnMpLnN0eWxlID0gTG9hZGluZ1N0eWxlLkZ1bGxTY3JlZW47XG4gICAgY29uc3QgbG9hZGluZ1JlZjogSUxvYWRpbmdSZWYgPSB0aGlzLl9pbml0aWFsaXplQ29udGV4dCgpO1xuICAgIGxldCBsb2FkaW5nID0gZmFsc2U7XG4gICAgbGV0IG92ZXJsYXlSZWY6IE92ZXJsYXlSZWY7XG4gICAgbG9hZGluZ1JlZi5vYnNlcnZhYmxlXG4gICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgLnN1YnNjcmliZSgocmVnaXN0ZXJlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChyZWdpc3RlcmVkID4gMCAmJiAhbG9hZGluZykge1xuICAgICAgICAgIGxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgIG92ZXJsYXlSZWYgPSB0aGlzLl9jcmVhdGVPdmVybGF5KCk7XG4gICAgICAgICAgbG9hZGluZ1JlZi5jb21wb25lbnRSZWYgPSBvdmVybGF5UmVmLmF0dGFjaChcbiAgICAgICAgICAgIG5ldyBDb21wb25lbnRQb3J0YWwoVGRMb2FkaW5nQ29tcG9uZW50KVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fbWFwT3B0aW9ucyhvcHRpb25zLCBsb2FkaW5nUmVmLmNvbXBvbmVudFJlZj8uaW5zdGFuY2UpO1xuICAgICAgICAgIGxvYWRpbmdSZWYuY29tcG9uZW50UmVmPy5pbnN0YW5jZS5zaG93KCk7XG4gICAgICAgICAgbG9hZGluZ1JlZi5jb21wb25lbnRSZWY/LmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZWdpc3RlcmVkIDw9IDAgJiYgbG9hZGluZykge1xuICAgICAgICAgIGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBsb2FkaW5nUmVmLmNvbXBvbmVudFJlZj8uaW5zdGFuY2UuaGlkZSgpO1xuICAgICAgICAgIGxvYWRpbmdSZWYuY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gICAgICAgICAgb3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgICAgICBvdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgcmV0dXJuIGxvYWRpbmdSZWY7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGxvYWRpbmcgY29tcG9uZW50IGR5bmFtaWNhbGx5IGFuZCBhdHRhY2hlcyBpdCBpbnRvIHRoZSBnaXZlbiB2aWV3Q29udGFpbmVyUmVmLlxuICAgKiBMZXZlcmFnZXMgVGVtcGxhdGVQb3J0YWxzIGZyb20gbWF0ZXJpYWwgdG8gaW5qZWN0IHRoZSB0ZW1wbGF0ZSBpbnNpZGUgb2YgaXQgc28gaXQgZml0c1xuICAgKiBwZXJmZWN0bHkgd2hlbiBvdmVybGF5aW5nIGl0LlxuICAgKlxuICAgKiBTYXZlcyBhIHJlZmVyZW5jZSBpbiBjb250ZXh0IHRvIGJlIGNhbGxlZCB3aGVuIHJlZ2lzdGVyaW5nL3Jlc29sdmluZyB0aGUgbG9hZGluZyBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIGNyZWF0ZU92ZXJsYXlDb21wb25lbnQoXG4gICAgb3B0aW9uczogSVRkTG9hZGluZ0NvbmZpZyxcbiAgICB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxvYmplY3Q+XG4gICk6IElMb2FkaW5nUmVmIHtcbiAgICAoPElJbnRlcm5hbExvYWRpbmdPcHRpb25zPm9wdGlvbnMpLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICAoPElJbnRlcm5hbExvYWRpbmdPcHRpb25zPm9wdGlvbnMpLnN0eWxlID0gTG9hZGluZ1N0eWxlLk92ZXJsYXk7XG4gICAgY29uc3QgbG9hZGluZ1JlZjogSUxvYWRpbmdSZWYgPSB0aGlzLl9jcmVhdGVDb21wb25lbnQob3B0aW9ucyk7XG4gICAgbGV0IGxvYWRpbmcgPSBmYWxzZTtcblxuICAgIGlmIChsb2FkaW5nUmVmLmNvbXBvbmVudFJlZikge1xuICAgICAgbG9hZGluZ1JlZi5jb21wb25lbnRSZWYuaW5zdGFuY2UuY29udGVudCA9IG5ldyBUZW1wbGF0ZVBvcnRhbChcbiAgICAgICAgdGVtcGxhdGVSZWYsXG4gICAgICAgIHZpZXdDb250YWluZXJSZWZcbiAgICAgICk7XG4gICAgICB2aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgICB2aWV3Q29udGFpbmVyUmVmLmluc2VydChsb2FkaW5nUmVmLmNvbXBvbmVudFJlZj8uaG9zdFZpZXcsIDApO1xuICAgIH1cblxuICAgIGxvYWRpbmdSZWYub2JzZXJ2YWJsZVxuICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlZ2lzdGVyZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAocmVnaXN0ZXJlZCA+IDAgJiYgIWxvYWRpbmcpIHtcbiAgICAgICAgICBsb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICBsb2FkaW5nUmVmLmNvbXBvbmVudFJlZj8uaW5zdGFuY2Uuc2hvdygpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlZ2lzdGVyZWQgPD0gMCAmJiBsb2FkaW5nKSB7XG4gICAgICAgICAgbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIGxvYWRpbmdSZWYuY29tcG9uZW50UmVmPy5pbnN0YW5jZS5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiBsb2FkaW5nUmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBsb2FkaW5nIGNvbXBvbmVudCBkeW5hbWljYWxseSBhbmQgYXR0YWNoZXMgaXQgaW50byB0aGUgZ2l2ZW4gdmlld0NvbnRhaW5lclJlZi5cbiAgICogUmVwbGFjZXMgdGhlIHRlbXBsYXRlIHdpdGggdGhlIGxvYWRpbmcgY29tcG9uZW50IGRlcGVuZGluZyBpZiBpdCB3YXMgcmVnaXN0ZXJlZCBvciByZXNvbHZlZC5cbiAgICpcbiAgICogU2F2ZXMgYSByZWZlcmVuY2UgaW4gY29udGV4dCB0byBiZSBjYWxsZWQgd2hlbiByZWdpc3RlcmluZy9yZXNvbHZpbmcgdGhlIGxvYWRpbmcgZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBjcmVhdGVSZXBsYWNlQ29tcG9uZW50KFxuICAgIG9wdGlvbnM6IElUZExvYWRpbmdDb25maWcsXG4gICAgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8b2JqZWN0PixcbiAgICBjb250ZXh0OiBUZExvYWRpbmdDb250ZXh0XG4gICk6IElMb2FkaW5nUmVmIHtcbiAgICBjb25zdCBuYXRpdmVFbGVtZW50OiBIVE1MRWxlbWVudCA9IDxIVE1MRWxlbWVudD4oXG4gICAgICB0ZW1wbGF0ZVJlZi5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgICApO1xuICAgICg8SUludGVybmFsTG9hZGluZ09wdGlvbnM+b3B0aW9ucykuaGVpZ2h0ID0gbmF0aXZlRWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICAgID8gbmF0aXZlRWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcuc2Nyb2xsSGVpZ2h0XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICAoPElJbnRlcm5hbExvYWRpbmdPcHRpb25zPm9wdGlvbnMpLnN0eWxlID0gTG9hZGluZ1N0eWxlLk5vbmU7XG4gICAgY29uc3QgbG9hZGluZ1JlZjogSUxvYWRpbmdSZWYgPSB0aGlzLl9jcmVhdGVDb21wb25lbnQob3B0aW9ucyk7XG4gICAgbGV0IGxvYWRpbmcgPSBmYWxzZTtcbiAgICAvLyBwYXNzaW5nIGNvbnRleHQgc28gd2hlbiB0aGUgdGVtcGxhdGUgaXMgYXR0YWNoZWQsIHdlIGNhbiBrZWVwIHRoZSByZWZlcmVuY2Ugb2YgdGhlIHZhcmlhYmxlc1xuICAgIGNvbnN0IGNvbnRlbnRSZWY6IEVtYmVkZGVkVmlld1JlZjxvYmplY3Q+ID1cbiAgICAgIHZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRlbXBsYXRlUmVmLCBjb250ZXh0KTtcbiAgICBsb2FkaW5nUmVmLm9ic2VydmFibGVcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAuc3Vic2NyaWJlKChyZWdpc3RlcmVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHJlZ2lzdGVyZWQgPiAwICYmICFsb2FkaW5nICYmIGxvYWRpbmdSZWYuY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgbG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgLy8gZGV0YWNoIHRoZSBjb250ZW50IGFuZCBhdHRhY2ggdGhlIGxvYWRlciBpZiBsb2FkZXIgaXMgdGhlcmVcbiAgICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gdmlld0NvbnRhaW5lclJlZi5pbmRleE9mKFxuICAgICAgICAgICAgbG9hZGluZ1JlZi5jb21wb25lbnRSZWYuaG9zdFZpZXdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHZpZXdDb250YWluZXJSZWYuZGV0YWNoKHZpZXdDb250YWluZXJSZWYuaW5kZXhPZihjb250ZW50UmVmKSk7XG4gICAgICAgICAgICB2aWV3Q29udGFpbmVyUmVmLmluc2VydChsb2FkaW5nUmVmLmNvbXBvbmVudFJlZi5ob3N0VmlldywgMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvYWRpbmdSZWYuY29tcG9uZW50UmVmPy5pbnN0YW5jZS5zaG93KCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVnaXN0ZXJlZCA8PSAwICYmIGxvYWRpbmcgJiYgbG9hZGluZ1JlZi5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgbG9hZGluZ1JlZi5jb21wb25lbnRSZWY/Lmluc3RhbmNlLmhpZGUoKTtcbiAgICAgICAgICAvLyBkZXRhY2ggbG9hZGVyIGFuZCBhdHRhY2ggdGhlIGNvbnRlbnQgaWYgY29udGVudCBpcyB0aGVyZVxuICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSB2aWV3Q29udGFpbmVyUmVmLmluZGV4T2YoY29udGVudFJlZik7XG4gICAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgdmlld0NvbnRhaW5lclJlZi5kZXRhY2goXG4gICAgICAgICAgICAgIHZpZXdDb250YWluZXJSZWYuaW5kZXhPZihsb2FkaW5nUmVmLmNvbXBvbmVudFJlZi5ob3N0VmlldylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2aWV3Q29udGFpbmVyUmVmLmluc2VydChjb250ZW50UmVmLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogTmVlZCB0byBjYWxsIFwibWFya0ZvckNoZWNrXCIgYW5kIFwiZGV0ZWN0Q2hhbmdlc1wiIG9uIGF0dGFjaGVkIHRlbXBsYXRlLCBzbyBpdHMgZGV0ZWN0ZWQgYnkgcGFyZW50IGNvbXBvbmVudCB3aGVuIGF0dGFjaGVkXG4gICAgICAgICAgICogd2l0aCBcIk9uUHVzaFwiIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb250ZW50UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICBjb250ZW50UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICByZXR1cm4gbG9hZGluZ1JlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZnVsbHNjcmVlbiBvdmVybGF5IGZvciB0aGUgbG9hZGluZyB1c2FnZS5cbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZU92ZXJsYXkoKTogT3ZlcmxheVJlZiB7XG4gICAgY29uc3Qgc3RhdGU6IE92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZygpO1xuICAgIHN0YXRlLmhhc0JhY2tkcm9wID0gZmFsc2U7XG4gICAgc3RhdGUucG9zaXRpb25TdHJhdGVneSA9IHRoaXMuX292ZXJsYXlcbiAgICAgIC5wb3NpdGlvbigpXG4gICAgICAuZ2xvYmFsKClcbiAgICAgIC5jZW50ZXJIb3Jpem9udGFsbHkoKVxuICAgICAgLmNlbnRlclZlcnRpY2FsbHkoKTtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheS5jcmVhdGUoc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBnZW5lcmljIGNvbXBvbmVudCBkeW5hbWljYWxseSB3YWl0aW5nIHRvIGJlIGF0dGFjaGVkIHRvIGEgdmlld0NvbnRhaW5lclJlZi5cbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZUNvbXBvbmVudChvcHRpb25zOiBJSW50ZXJuYWxMb2FkaW5nT3B0aW9ucyk6IElMb2FkaW5nUmVmIHtcbiAgICBjb25zdCBjb21wUmVmOiBJTG9hZGluZ1JlZiA9IHRoaXMuX2luaXRpYWxpemVDb250ZXh0KCk7XG4gICAgY29tcFJlZi5jb21wb25lbnRSZWYgPSB0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcbiAgICAgIC5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShUZExvYWRpbmdDb21wb25lbnQpXG4gICAgICAuY3JlYXRlKHRoaXMuX2luamVjdG9yKTtcbiAgICB0aGlzLl9tYXBPcHRpb25zKG9wdGlvbnMsIGNvbXBSZWYuY29tcG9uZW50UmVmLmluc3RhbmNlKTtcbiAgICByZXR1cm4gY29tcFJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGNvbnRleHQgZm9yIGxvYWRpbmcgY29tcG9uZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZUNvbnRleHQoKTogSUxvYWRpbmdSZWYge1xuICAgIGNvbnN0IHN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICByZXR1cm4ge1xuICAgICAgb2JzZXJ2YWJsZTogc3ViamVjdC5hc09ic2VydmFibGUoKSxcbiAgICAgIHN1YmplY3QsXG4gICAgICBjb21wb25lbnRSZWY6IHVuZGVmaW5lZCxcbiAgICAgIHRpbWVzOiAwLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBjb25maWd1cmF0aW9uIHRvIHRoZSBsb2FkaW5nIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgX21hcE9wdGlvbnMoXG4gICAgb3B0aW9uczogSUludGVybmFsTG9hZGluZ09wdGlvbnMsXG4gICAgaW5zdGFuY2U6IFRkTG9hZGluZ0NvbXBvbmVudFxuICApOiB2b2lkIHtcbiAgICBpZiAob3B0aW9ucy5zdHlsZSkge1xuICAgICAgaW5zdGFuY2Uuc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5zdGFuY2UudHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGluc3RhbmNlLmhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5tb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGluc3RhbmNlLm1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmNvbG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGluc3RhbmNlLmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExPQURJTkdfRkFDVE9SWV9QUk9WSURFUl9GQUNUT1JZKFxuICBwYXJlbnQ6IFRkTG9hZGluZ0ZhY3RvcnksXG4gIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBvdmVybGF5OiBPdmVybGF5LFxuICBpbmplY3RvcjogSW5qZWN0b3Jcbik6IFRkTG9hZGluZ0ZhY3Rvcnkge1xuICByZXR1cm4gKFxuICAgIHBhcmVudCB8fCBuZXcgVGRMb2FkaW5nRmFjdG9yeShjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIG92ZXJsYXksIGluamVjdG9yKVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgTE9BRElOR19GQUNUT1JZX1BST1ZJREVSOiBQcm92aWRlciA9IHtcbiAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHNlcnZpY2UgYXZhaWxhYmxlLCB1c2UgdGhhdC4gT3RoZXJ3aXNlLCBwcm92aWRlIGEgbmV3IG9uZS5cbiAgcHJvdmlkZTogVGRMb2FkaW5nRmFjdG9yeSxcbiAgZGVwczogW1xuICAgIFtuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIFRkTG9hZGluZ0ZhY3RvcnldLFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBPdmVybGF5LFxuICAgIEluamVjdG9yLFxuICBdLFxuICB1c2VGYWN0b3J5OiBMT0FESU5HX0ZBQ1RPUllfUFJPVklERVJfRkFDVE9SWSxcbn07XG4iXX0=