theme-lib
Version:
This is a simple example Angular Library published to npm.
487 lines • 37.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { ApplicationRef, ComponentFactoryResolver, Directive, Inject, Injectable, Injector, NgModule, NgZone, } from '@angular/core';
import { CdkPortal, CdkPortalOutlet, ComponentPortal, DomPortalOutlet, PortalInjector, PortalModule, TemplatePortal, } from '@angular/cdk/portal';
import { FlexibleConnectedPositionStrategy, Overlay, OverlayConfig, OverlayContainer, OverlayKeyboardDispatcher, OverlayModule, OverlayPositionBuilder, OverlayRef, ScrollStrategyOptions, } from '@angular/cdk/overlay';
import { Platform } from '@angular/cdk/platform';
import { Directionality } from '@angular/cdk/bidi';
import { NB_DOCUMENT } from '../../../theme.options';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
var NbPortalDirective = /** @class */ (function (_super) {
tslib_1.__extends(NbPortalDirective, _super);
function NbPortalDirective() {
return _super !== null && _super.apply(this, arguments) || this;
}
NbPortalDirective.decorators = [
{ type: Directive, args: [{ selector: '[nbPortal]' },] }
];
return NbPortalDirective;
}(CdkPortal));
export { NbPortalDirective };
var NbPortalOutletDirective = /** @class */ (function (_super) {
tslib_1.__extends(NbPortalOutletDirective, _super);
function NbPortalOutletDirective() {
return _super !== null && _super.apply(this, arguments) || this;
}
NbPortalOutletDirective.decorators = [
{ type: Directive, args: [{ selector: '[nbPortalOutlet]' },] }
];
return NbPortalOutletDirective;
}(CdkPortalOutlet));
export { NbPortalOutletDirective };
/**
* @template T
*/
var /**
* @template T
*/
NbComponentPortal = /** @class */ (function (_super) {
tslib_1.__extends(NbComponentPortal, _super);
function NbComponentPortal(component, vcr, injector, cfr) {
var _this = _super.call(this, component, vcr, injector) || this;
_this.cfr = cfr;
return _this;
}
return NbComponentPortal;
}(ComponentPortal));
/**
* @template T
*/
export { NbComponentPortal };
if (false) {
/** @type {?} */
NbComponentPortal.prototype.cfr;
}
/*
* TODO remove after @angular/cdk@7.0.0 relased
* */
var /*
* TODO remove after @angular/cdk@7.0.0 relased
* */
NbDomPortalOutlet = /** @class */ (function (_super) {
tslib_1.__extends(NbDomPortalOutlet, _super);
function NbDomPortalOutlet(outletElement, componentFactoryResolver, appRef, defaultInjector) {
var _this = _super.call(this, outletElement, componentFactoryResolver, appRef, defaultInjector) || this;
_this.outletElement = outletElement;
_this.componentFactoryResolver = componentFactoryResolver;
_this.appRef = appRef;
_this.defaultInjector = defaultInjector;
return _this;
}
/*
* Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver.
* @param portal Portal to be attached
* @returns Reference to the created component.
*/
/*
* Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver.
* @param portal Portal to be attached
* @returns Reference to the created component.
*/
/**
* @template T
* @param {?} portal
* @return {?}
*/
NbDomPortalOutlet.prototype.attachComponentPortal = /*
* Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver.
* @param portal Portal to be attached
* @returns Reference to the created component.
*/
/**
* @template T
* @param {?} portal
* @return {?}
*/
function (portal) {
var _this = this;
/** @type {?} */
var resolver = portal.cfr || this.componentFactoryResolver;
/** @type {?} */
var componentFactory = resolver.resolveComponentFactory(portal.component);
/** @type {?} */
var componentRef;
// If the portal specifies a ViewContainerRef, we will use that as the attachment point
// for the component (in terms of Angular's component tree, not rendering).
// When the ViewContainerRef is missing, we use the factory to create the component directly
// and then manually attach the view to the application.
if (portal.viewContainerRef) {
componentRef = portal.viewContainerRef.createComponent(componentFactory, portal.viewContainerRef.length, portal.injector || portal.viewContainerRef.parentInjector);
this.setDisposeFn(function () { return componentRef.destroy(); });
}
else {
componentRef = componentFactory.create(portal.injector || this.defaultInjector);
this.appRef.attachView(componentRef.hostView);
this.setDisposeFn(function () {
_this.appRef.detachView(componentRef.hostView);
componentRef.destroy();
});
}
// At this point the component has been instantiated, so we move it to the location in the DOM
// where we want it to be rendered.
this.outletElement.appendChild(this.getComponentRootNode(componentRef));
return componentRef;
};
/* Gets the root HTMLElement for an instantiated component. */
/* Gets the root HTMLElement for an instantiated component. */
/**
* @private
* @param {?} componentRef
* @return {?}
*/
NbDomPortalOutlet.prototype.getComponentRootNode = /* Gets the root HTMLElement for an instantiated component. */
/**
* @private
* @param {?} componentRef
* @return {?}
*/
function (componentRef) {
return (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView))).rootNodes[0]));
};
return NbDomPortalOutlet;
}(DomPortalOutlet));
/*
* TODO remove after @angular/cdk@7.0.0 relased
* */
export { NbDomPortalOutlet };
if (false) {
/** @type {?} */
NbDomPortalOutlet.prototype.outletElement;
/**
* @type {?}
* @private
*/
NbDomPortalOutlet.prototype.componentFactoryResolver;
/**
* @type {?}
* @private
*/
NbDomPortalOutlet.prototype.appRef;
/**
* @type {?}
* @private
*/
NbDomPortalOutlet.prototype.defaultInjector;
}
var NbOverlay = /** @class */ (function (_super) {
tslib_1.__extends(NbOverlay, _super);
function NbOverlay(scrollStrategies, overlayContainer, componentFactoryResolver, positionBuilder, keyboardDispatcher, injector, ngZone, document, directionality) {
var _this = _super.call(this, scrollStrategies, overlayContainer, componentFactoryResolver, positionBuilder, keyboardDispatcher, injector, ngZone, document, directionality) || this;
_this.scrollStrategies = scrollStrategies;
_this.overlayContainer = overlayContainer;
_this.componentFactoryResolver = componentFactoryResolver;
_this.positionBuilder = positionBuilder;
_this.keyboardDispatcher = keyboardDispatcher;
_this.injector = injector;
_this.ngZone = ngZone;
_this.document = document;
_this.directionality = directionality;
return _this;
}
/*
* Creates an overlay.
* @param config Configuration applied to the overlay.
* @returns Reference to the created overlay.
*/
/*
* Creates an overlay.
* @param config Configuration applied to the overlay.
* @returns Reference to the created overlay.
*/
/**
* @param {?=} config
* @return {?}
*/
NbOverlay.prototype.create = /*
* Creates an overlay.
* @param config Configuration applied to the overlay.
* @returns Reference to the created overlay.
*/
/**
* @param {?=} config
* @return {?}
*/
function (config) {
/** @type {?} */
var host = this.createHostElement();
/** @type {?} */
var pane = this.createPaneElement(host);
/** @type {?} */
var portalOutlet = this.createPortalOutlet(pane);
/** @type {?} */
var overlayConfig = new OverlayConfig(config);
overlayConfig.direction = overlayConfig.direction || this.directionality.value;
return new OverlayRef(portalOutlet, host, pane, overlayConfig, this.ngZone, this.keyboardDispatcher, this.document);
};
/*
* Creates the DOM element for an overlay and appends it to the overlay container.
* @returns Newly-created pane element
*/
/*
* Creates the DOM element for an overlay and appends it to the overlay container.
* @returns Newly-created pane element
*/
/**
* @protected
* @param {?} host
* @return {?}
*/
NbOverlay.prototype.createPaneElement = /*
* Creates the DOM element for an overlay and appends it to the overlay container.
* @returns Newly-created pane element
*/
/**
* @protected
* @param {?} host
* @return {?}
*/
function (host) {
/** @type {?} */
var pane = this.document.createElement('div');
pane.id = "cdk-overlay-" + NbOverlay.nextUniqueId++;
pane.classList.add('cdk-overlay-pane');
host.appendChild(pane);
return pane;
};
/*
* Creates the host element that wraps around an overlay
* and can be used for advanced positioning.
* @returns Newly-create host element.
*/
/*
* Creates the host element that wraps around an overlay
* and can be used for advanced positioning.
* @returns Newly-create host element.
*/
/**
* @protected
* @return {?}
*/
NbOverlay.prototype.createHostElement = /*
* Creates the host element that wraps around an overlay
* and can be used for advanced positioning.
* @returns Newly-create host element.
*/
/**
* @protected
* @return {?}
*/
function () {
/** @type {?} */
var host = this.document.createElement('div');
this.overlayContainer.getContainerElement().appendChild(host);
return host;
};
/*
* Create a DomPortalOutlet into which the overlay content can be loaded.
* @param pane The DOM element to turn into a portal outlet.
* @returns A portal outlet for the given DOM element.
*/
/*
* Create a DomPortalOutlet into which the overlay content can be loaded.
* @param pane The DOM element to turn into a portal outlet.
* @returns A portal outlet for the given DOM element.
*/
/**
* @protected
* @param {?} pane
* @return {?}
*/
NbOverlay.prototype.createPortalOutlet = /*
* Create a DomPortalOutlet into which the overlay content can be loaded.
* @param pane The DOM element to turn into a portal outlet.
* @returns A portal outlet for the given DOM element.
*/
/**
* @protected
* @param {?} pane
* @return {?}
*/
function (pane) {
// We have to resolve the ApplicationRef later in order to allow people
// to use overlay-based providers during app initialization.
if (!this.appRef) {
this.appRef = this.injector.get(ApplicationRef);
}
return new NbDomPortalOutlet(pane, this.componentFactoryResolver, this.appRef, this.injector);
};
NbOverlay.nextUniqueId = 0;
NbOverlay.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NbOverlay.ctorParameters = function () { return [
{ type: ScrollStrategyOptions },
{ type: OverlayContainer },
{ type: ComponentFactoryResolver },
{ type: OverlayPositionBuilder },
{ type: OverlayKeyboardDispatcher },
{ type: Injector },
{ type: NgZone },
{ type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] },
{ type: Directionality }
]; };
return NbOverlay;
}(Overlay));
export { NbOverlay };
if (false) {
/**
* @type {?}
* @protected
*/
NbOverlay.nextUniqueId;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.appRef;
/** @type {?} */
NbOverlay.prototype.scrollStrategies;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.overlayContainer;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.componentFactoryResolver;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.positionBuilder;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.keyboardDispatcher;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.injector;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.ngZone;
/**
* @type {?}
* @private
*/
NbOverlay.prototype.document;
/**
* @type {?}
* @private
*/
NbOverlay.prototype.directionality;
}
var NbPlatform = /** @class */ (function (_super) {
tslib_1.__extends(NbPlatform, _super);
function NbPlatform() {
return _super !== null && _super.apply(this, arguments) || this;
}
NbPlatform.decorators = [
{ type: Injectable }
];
return NbPlatform;
}(Platform));
export { NbPlatform };
var NbOverlayPositionBuilder = /** @class */ (function (_super) {
tslib_1.__extends(NbOverlayPositionBuilder, _super);
function NbOverlayPositionBuilder() {
return _super !== null && _super.apply(this, arguments) || this;
}
NbOverlayPositionBuilder.decorators = [
{ type: Injectable }
];
return NbOverlayPositionBuilder;
}(OverlayPositionBuilder));
export { NbOverlayPositionBuilder };
/**
* @template T
*/
var /**
* @template T
*/
NbTemplatePortal = /** @class */ (function (_super) {
tslib_1.__extends(NbTemplatePortal, _super);
function NbTemplatePortal(template, viewContainerRef, context) {
return _super.call(this, template, viewContainerRef, context) || this;
}
return NbTemplatePortal;
}(TemplatePortal));
/**
* @template T
*/
export { NbTemplatePortal };
var NbOverlayContainer = /** @class */ (function (_super) {
tslib_1.__extends(NbOverlayContainer, _super);
function NbOverlayContainer() {
return _super !== null && _super.apply(this, arguments) || this;
}
/** @nocollapse */ NbOverlayContainer.ngInjectableDef = i0.defineInjectable({ factory: function NbOverlayContainer_Factory() { return new NbOverlayContainer(i0.inject(i1.DOCUMENT)); }, token: NbOverlayContainer, providedIn: "root" });
return NbOverlayContainer;
}(OverlayContainer));
export { NbOverlayContainer };
var NbFlexibleConnectedPositionStrategy = /** @class */ (function (_super) {
tslib_1.__extends(NbFlexibleConnectedPositionStrategy, _super);
function NbFlexibleConnectedPositionStrategy() {
return _super !== null && _super.apply(this, arguments) || this;
}
return NbFlexibleConnectedPositionStrategy;
}(FlexibleConnectedPositionStrategy));
export { NbFlexibleConnectedPositionStrategy };
var NbPortalInjector = /** @class */ (function (_super) {
tslib_1.__extends(NbPortalInjector, _super);
function NbPortalInjector() {
return _super !== null && _super.apply(this, arguments) || this;
}
return NbPortalInjector;
}(PortalInjector));
export { NbPortalInjector };
/** @type {?} */
var CDK_MODULES = [OverlayModule, PortalModule];
/*
* This module helps us to keep all angular/cdk deps inside our cdk module via providing aliases.
* Approach will help us move cdk in separate npm package and refactor nebular/theme code.
* */
var NbCdkMappingModule = /** @class */ (function () {
function NbCdkMappingModule() {
}
/**
* @return {?}
*/
NbCdkMappingModule.forRoot = /**
* @return {?}
*/
function () {
return (/** @type {?} */ ({
ngModule: NbCdkMappingModule,
providers: [
NbOverlay,
NbPlatform,
NbOverlayPositionBuilder,
],
}));
};
NbCdkMappingModule.decorators = [
{ type: NgModule, args: [{
imports: tslib_1.__spread(CDK_MODULES),
exports: tslib_1.__spread(CDK_MODULES, [
NbPortalDirective,
NbPortalOutletDirective,
]),
declarations: [NbPortalDirective, NbPortalOutletDirective],
},] }
];
return NbCdkMappingModule;
}());
export { NbCdkMappingModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2Nkay9vdmVybGF5L21hcHBpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUV4QixTQUFTLEVBRVQsTUFBTSxFQUNOLFVBQVUsRUFDVixRQUFRLEVBRVIsUUFBUSxFQUNSLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsU0FBUyxFQUNULGVBQWUsRUFDZixlQUFlLEVBQ2YsZUFBZSxFQUVmLGNBQWMsRUFDZCxZQUFZLEVBQ1osY0FBYyxHQUNmLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUtMLGlDQUFpQyxFQUNqQyxPQUFPLEVBQ1AsYUFBYSxFQUNiLGdCQUFnQixFQUNoQix5QkFBeUIsRUFDekIsYUFBYSxFQUNiLHNCQUFzQixFQUN0QixVQUFVLEVBR1YscUJBQXFCLEdBQ3RCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7OztBQUdyRDtJQUN1Qyw2Q0FBUztJQURoRDs7SUFFQSxDQUFDOztnQkFGQSxTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFOztJQUVyQyx3QkFBQztDQUFBLEFBRkQsQ0FDdUMsU0FBUyxHQUMvQztTQURZLGlCQUFpQjtBQUc5QjtJQUM2QyxtREFBZTtJQUQ1RDs7SUFFQSxDQUFDOztnQkFGQSxTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUU7O0lBRTNDLDhCQUFDO0NBQUEsQUFGRCxDQUM2QyxlQUFlLEdBQzNEO1NBRFksdUJBQXVCOzs7O0FBR3BDOzs7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dUJBQUM7QUFBRCxDQUFDLEFBREQsQ0FBc0MsY0FBYyxHQUNuRDs7O0lBYUssV0FBVyxHQUFHLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQzs7Ozs7QUFNakQ7SUFBQTtJQW9CQSxDQUFDOzs7O0lBVlEsMEJBQU87OztJQUFkO1FBQ0UsT0FBTyxtQkFBc0I7WUFDM0IsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixTQUFTLEVBQUU7Z0JBQ1QsU0FBUztnQkFDVCxVQUFVO2dCQUNWLHdCQUF3QjthQUN6QjtTQUNGLEVBQUEsQ0FBQztJQUNKLENBQUM7O2dCQW5CRixRQUFRLFNBQUM7b0JBQ1IsT0FBTyxtQkFBTSxXQUFXLENBQUM7b0JBQ3pCLE9BQU8sbUJBQ0YsV0FBVzt3QkFDZCxpQkFBaUI7d0JBQ2pCLHVCQUF1QjtzQkFDeEI7b0JBQ0QsWUFBWSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUM7aUJBQzNEOztJQVlELHlCQUFDO0NBQUEsQUFwQkQsSUFvQkM7U0FYWSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uUmVmLFxyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBDb21wb25lbnRSZWYsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVtYmVkZGVkVmlld1JlZixcclxuICBJbmplY3QsXHJcbiAgSW5qZWN0YWJsZSxcclxuICBJbmplY3RvcixcclxuICBNb2R1bGVXaXRoUHJvdmlkZXJzLFxyXG4gIE5nTW9kdWxlLFxyXG4gIE5nWm9uZSxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIENka1BvcnRhbCxcclxuICBDZGtQb3J0YWxPdXRsZXQsXHJcbiAgQ29tcG9uZW50UG9ydGFsLFxyXG4gIERvbVBvcnRhbE91dGxldCxcclxuICBQb3J0YWwsXHJcbiAgUG9ydGFsSW5qZWN0b3IsXHJcbiAgUG9ydGFsTW9kdWxlLFxyXG4gIFRlbXBsYXRlUG9ydGFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudFR5cGUsXHJcbiAgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLFxyXG4gIENvbm5lY3RlZFBvc2l0aW9uLFxyXG4gIENvbm5lY3Rpb25Qb3NpdGlvblBhaXIsXHJcbiAgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxyXG4gIE92ZXJsYXksXHJcbiAgT3ZlcmxheUNvbmZpZyxcclxuICBPdmVybGF5Q29udGFpbmVyLFxyXG4gIE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIsXHJcbiAgT3ZlcmxheU1vZHVsZSxcclxuICBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gIE92ZXJsYXlSZWYsXHJcbiAgUG9zaXRpb25TdHJhdGVneSxcclxuICBTY3JvbGxTdHJhdGVneSxcclxuICBTY3JvbGxTdHJhdGVneU9wdGlvbnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XHJcbmltcG9ydCB7IERpcmVjdGlvbmFsaXR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xyXG5cclxuaW1wb3J0IHsgTkJfRE9DVU1FTlQgfSBmcm9tICcuLi8uLi8uLi90aGVtZS5vcHRpb25zJztcclxuXHJcblxyXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmJQb3J0YWxdJyB9KVxyXG5leHBvcnQgY2xhc3MgTmJQb3J0YWxEaXJlY3RpdmUgZXh0ZW5kcyBDZGtQb3J0YWwge1xyXG59XHJcblxyXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmJQb3J0YWxPdXRsZXRdJyB9KVxyXG5leHBvcnQgY2xhc3MgTmJQb3J0YWxPdXRsZXREaXJlY3RpdmUgZXh0ZW5kcyBDZGtQb3J0YWxPdXRsZXQge1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmJDb21wb25lbnRQb3J0YWw8VCA9IGFueT4gZXh0ZW5kcyBDb21wb25lbnRQb3J0YWw8VD4ge1xyXG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudDogQ29tcG9uZW50VHlwZTxUPixcclxuICAgICAgICAgICAgICB2Y3I/OiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgICAgICAgIGluamVjdG9yPzogSW5qZWN0b3IsXHJcbiAgICAgICAgICAgICAgcHVibGljIGNmcj86IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG4gICAgc3VwZXIoY29tcG9uZW50LCB2Y3IsIGluamVjdG9yKTtcclxuICB9XHJcbn1cclxuXHJcbi8qXHJcbiAqIFRPRE8gcmVtb3ZlIGFmdGVyIEBhbmd1bGFyL2Nka0A3LjAuMCByZWxhc2VkXHJcbiAqICovXHJcbmV4cG9ydCBjbGFzcyBOYkRvbVBvcnRhbE91dGxldCBleHRlbmRzIERvbVBvcnRhbE91dGxldCB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAvKiBFbGVtZW50IGludG8gd2hpY2ggdGhlIGNvbnRlbnQgaXMgcHJvamVjdGVkLiAqL1xyXG4gICAgcHVibGljIG91dGxldEVsZW1lbnQ6IEVsZW1lbnQsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJpdmF0ZSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxyXG4gICAgcHJpdmF0ZSBkZWZhdWx0SW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICBzdXBlcihvdXRsZXRFbGVtZW50LCBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIGFwcFJlZiwgZGVmYXVsdEluamVjdG9yKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQXR0YWNoIHRoZSBnaXZlbiBDb21wb25lbnRQb3J0YWwgdG8gRE9NIGVsZW1lbnQgdXNpbmcgdGhlIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5cclxuICAgKiBAcGFyYW0gcG9ydGFsIFBvcnRhbCB0byBiZSBhdHRhY2hlZFxyXG4gICAqIEByZXR1cm5zIFJlZmVyZW5jZSB0byB0aGUgY3JlYXRlZCBjb21wb25lbnQuXHJcbiAgICovXHJcbiAgYXR0YWNoQ29tcG9uZW50UG9ydGFsPFQ+KHBvcnRhbDogTmJDb21wb25lbnRQb3J0YWw8VD4pOiBDb21wb25lbnRSZWY8VD4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZXIgPSBwb3J0YWwuY2ZyIHx8IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyO1xyXG4gICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHBvcnRhbC5jb21wb25lbnQpO1xyXG4gICAgbGV0IGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPFQ+O1xyXG5cclxuICAgIC8vIElmIHRoZSBwb3J0YWwgc3BlY2lmaWVzIGEgVmlld0NvbnRhaW5lclJlZiwgd2Ugd2lsbCB1c2UgdGhhdCBhcyB0aGUgYXR0YWNobWVudCBwb2ludFxyXG4gICAgLy8gZm9yIHRoZSBjb21wb25lbnQgKGluIHRlcm1zIG9mIEFuZ3VsYXIncyBjb21wb25lbnQgdHJlZSwgbm90IHJlbmRlcmluZykuXHJcbiAgICAvLyBXaGVuIHRoZSBWaWV3Q29udGFpbmVyUmVmIGlzIG1pc3NpbmcsIHdlIHVzZSB0aGUgZmFjdG9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudCBkaXJlY3RseVxyXG4gICAgLy8gYW5kIHRoZW4gbWFudWFsbHkgYXR0YWNoIHRoZSB2aWV3IHRvIHRoZSBhcHBsaWNhdGlvbi5cclxuICAgIGlmIChwb3J0YWwudmlld0NvbnRhaW5lclJlZikge1xyXG4gICAgICBjb21wb25lbnRSZWYgPSBwb3J0YWwudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoXHJcbiAgICAgICAgY29tcG9uZW50RmFjdG9yeSxcclxuICAgICAgICBwb3J0YWwudmlld0NvbnRhaW5lclJlZi5sZW5ndGgsXHJcbiAgICAgICAgcG9ydGFsLmluamVjdG9yIHx8IHBvcnRhbC52aWV3Q29udGFpbmVyUmVmLnBhcmVudEluamVjdG9yKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0RGlzcG9zZUZuKCgpID0+IGNvbXBvbmVudFJlZi5kZXN0cm95KCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29tcG9uZW50UmVmID0gY29tcG9uZW50RmFjdG9yeS5jcmVhdGUocG9ydGFsLmluamVjdG9yIHx8IHRoaXMuZGVmYXVsdEluamVjdG9yKTtcclxuICAgICAgdGhpcy5hcHBSZWYuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgICB0aGlzLnNldERpc3Bvc2VGbigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgICAgIGNvbXBvbmVudFJlZi5kZXN0cm95KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGluc3RhbnRpYXRlZCwgc28gd2UgbW92ZSBpdCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIERPTVxyXG4gICAgLy8gd2hlcmUgd2Ugd2FudCBpdCB0byBiZSByZW5kZXJlZC5cclxuICAgIHRoaXMub3V0bGV0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmdldENvbXBvbmVudFJvb3ROb2RlKGNvbXBvbmVudFJlZikpO1xyXG5cclxuICAgIHJldHVybiBjb21wb25lbnRSZWY7XHJcbiAgfVxyXG5cclxuICAvKiBHZXRzIHRoZSByb290IEhUTUxFbGVtZW50IGZvciBhbiBpbnN0YW50aWF0ZWQgY29tcG9uZW50LiAqL1xyXG4gIHByaXZhdGUgZ2V0Q29tcG9uZW50Um9vdE5vZGUoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55Pik6IEhUTUxFbGVtZW50IHtcclxuICAgIHJldHVybiAoY29tcG9uZW50UmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYk92ZXJsYXkgZXh0ZW5kcyBPdmVybGF5IHtcclxuICBwcm90ZWN0ZWQgYXBwUmVmOiBBcHBsaWNhdGlvblJlZjtcclxuICBwcm90ZWN0ZWQgc3RhdGljIG5leHRVbmlxdWVJZCA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgLyogU2Nyb2xsaW5nIHN0cmF0ZWdpZXMgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGFuIG92ZXJsYXkuICovXHJcbiAgICBwdWJsaWMgc2Nyb2xsU3RyYXRlZ2llczogU2Nyb2xsU3RyYXRlZ3lPcHRpb25zLFxyXG4gICAgcHJvdGVjdGVkIG92ZXJsYXlDb250YWluZXI6IE92ZXJsYXlDb250YWluZXIsXHJcbiAgICBwcm90ZWN0ZWQgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcm90ZWN0ZWQgcG9zaXRpb25CdWlsZGVyOiBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gICAgcHJvdGVjdGVkIGtleWJvYXJkRGlzcGF0Y2hlcjogT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlcixcclxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcm90ZWN0ZWQgbmdab25lOiBOZ1pvbmUsXHJcbiAgICBASW5qZWN0KE5CX0RPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnksXHJcbiAgICBwcml2YXRlIGRpcmVjdGlvbmFsaXR5OiBEaXJlY3Rpb25hbGl0eSkge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIHNjcm9sbFN0cmF0ZWdpZXMsXHJcbiAgICAgIG92ZXJsYXlDb250YWluZXIsXHJcbiAgICAgIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgICAgcG9zaXRpb25CdWlsZGVyLFxyXG4gICAgICBrZXlib2FyZERpc3BhdGNoZXIsXHJcbiAgICAgIGluamVjdG9yLFxyXG4gICAgICBuZ1pvbmUsXHJcbiAgICAgIGRvY3VtZW50LFxyXG4gICAgICBkaXJlY3Rpb25hbGl0eSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgYW4gb3ZlcmxheS5cclxuICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gYXBwbGllZCB0byB0aGUgb3ZlcmxheS5cclxuICAgKiBAcmV0dXJucyBSZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgb3ZlcmxheS5cclxuICAgKi9cclxuICBjcmVhdGUoY29uZmlnPzogT3ZlcmxheUNvbmZpZyk6IE92ZXJsYXlSZWYge1xyXG4gICAgY29uc3QgaG9zdCA9IHRoaXMuY3JlYXRlSG9zdEVsZW1lbnQoKTtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLmNyZWF0ZVBhbmVFbGVtZW50KGhvc3QpO1xyXG4gICAgY29uc3QgcG9ydGFsT3V0bGV0ID0gdGhpcy5jcmVhdGVQb3J0YWxPdXRsZXQocGFuZSk7XHJcbiAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoY29uZmlnKTtcclxuXHJcbiAgICBvdmVybGF5Q29uZmlnLmRpcmVjdGlvbiA9IG92ZXJsYXlDb25maWcuZGlyZWN0aW9uIHx8IHRoaXMuZGlyZWN0aW9uYWxpdHkudmFsdWU7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBPdmVybGF5UmVmKHBvcnRhbE91dGxldCwgaG9zdCwgcGFuZSwgb3ZlcmxheUNvbmZpZywgdGhpcy5uZ1pvbmUsXHJcbiAgICAgIHRoaXMua2V5Ym9hcmREaXNwYXRjaGVyLCB0aGlzLmRvY3VtZW50KTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlcyB0aGUgRE9NIGVsZW1lbnQgZm9yIGFuIG92ZXJsYXkgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIG92ZXJsYXkgY29udGFpbmVyLlxyXG4gICAqIEByZXR1cm5zIE5ld2x5LWNyZWF0ZWQgcGFuZSBlbGVtZW50XHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVBhbmVFbGVtZW50KGhvc3Q6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3QgcGFuZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgcGFuZS5pZCA9IGBjZGstb3ZlcmxheS0ke05iT3ZlcmxheS5uZXh0VW5pcXVlSWQrK31gO1xyXG4gICAgcGFuZS5jbGFzc0xpc3QuYWRkKCdjZGstb3ZlcmxheS1wYW5lJyk7XHJcbiAgICBob3N0LmFwcGVuZENoaWxkKHBhbmUpO1xyXG5cclxuICAgIHJldHVybiBwYW5lO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBDcmVhdGVzIHRoZSBob3N0IGVsZW1lbnQgdGhhdCB3cmFwcyBhcm91bmQgYW4gb3ZlcmxheVxyXG4gICAqIGFuZCBjYW4gYmUgdXNlZCBmb3IgYWR2YW5jZWQgcG9zaXRpb25pbmcuXHJcbiAgICogQHJldHVybnMgTmV3bHktY3JlYXRlIGhvc3QgZWxlbWVudC5cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgY3JlYXRlSG9zdEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLm92ZXJsYXlDb250YWluZXIuZ2V0Q29udGFpbmVyRWxlbWVudCgpLmFwcGVuZENoaWxkKGhvc3QpO1xyXG4gICAgcmV0dXJuIGhvc3Q7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZSBhIERvbVBvcnRhbE91dGxldCBpbnRvIHdoaWNoIHRoZSBvdmVybGF5IGNvbnRlbnQgY2FuIGJlIGxvYWRlZC5cclxuICAgKiBAcGFyYW0gcGFuZSBUaGUgRE9NIGVsZW1lbnQgdG8gdHVybiBpbnRvIGEgcG9ydGFsIG91dGxldC5cclxuICAgKiBAcmV0dXJucyBBIHBvcnRhbCBvdXRsZXQgZm9yIHRoZSBnaXZlbiBET00gZWxlbWVudC5cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgY3JlYXRlUG9ydGFsT3V0bGV0KHBhbmU6IEhUTUxFbGVtZW50KTogTmJEb21Qb3J0YWxPdXRsZXQge1xyXG4gICAgLy8gV2UgaGF2ZSB0byByZXNvbHZlIHRoZSBBcHBsaWNhdGlvblJlZiBsYXRlciBpbiBvcmRlciB0byBhbGxvdyBwZW9wbGVcclxuICAgIC8vIHRvIHVzZSBvdmVybGF5LWJhc2VkIHByb3ZpZGVycyBkdXJpbmcgYXBwIGluaXRpYWxpemF0aW9uLlxyXG4gICAgaWYgKCF0aGlzLmFwcFJlZikge1xyXG4gICAgICB0aGlzLmFwcFJlZiA9IHRoaXMuaW5qZWN0b3IuZ2V0PEFwcGxpY2F0aW9uUmVmPihBcHBsaWNhdGlvblJlZik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBOYkRvbVBvcnRhbE91dGxldChwYW5lLCB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgdGhpcy5hcHBSZWYsIHRoaXMuaW5qZWN0b3IpO1xyXG4gIH1cclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmJQbGF0Zm9ybSBleHRlbmRzIFBsYXRmb3JtIHtcclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmJPdmVybGF5UG9zaXRpb25CdWlsZGVyIGV4dGVuZHMgT3ZlcmxheVBvc2l0aW9uQnVpbGRlciB7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYlRlbXBsYXRlUG9ydGFsPFQgPSBhbnk+IGV4dGVuZHMgVGVtcGxhdGVQb3J0YWw8VD4ge1xyXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxUPiwgdmlld0NvbnRhaW5lclJlZj86IFZpZXdDb250YWluZXJSZWYsIGNvbnRleHQ/OiBUKSB7XHJcbiAgICBzdXBlcih0ZW1wbGF0ZSwgdmlld0NvbnRhaW5lclJlZiwgY29udGV4dCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmJPdmVybGF5Q29udGFpbmVyIGV4dGVuZHMgT3ZlcmxheUNvbnRhaW5lciB7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYkZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSBleHRlbmRzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYlBvcnRhbEluamVjdG9yIGV4dGVuZHMgUG9ydGFsSW5qZWN0b3Ige1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBOYlBvcnRhbDxUID0gYW55PiA9IFBvcnRhbDxUPjtcclxuZXhwb3J0IHR5cGUgTmJPdmVybGF5UmVmID0gT3ZlcmxheVJlZjtcclxuZXhwb3J0IHR5cGUgTmJDb21wb25lbnRUeXBlPFQgPSBhbnk+ID0gQ29tcG9uZW50VHlwZTxUPjtcclxuZXhwb3J0IHR5cGUgTmJQb3NpdGlvblN0cmF0ZWd5ID0gUG9zaXRpb25TdHJhdGVneTtcclxuZXhwb3J0IHR5cGUgTmJDb25uZWN0ZWRQb3NpdGlvbiA9IENvbm5lY3RlZFBvc2l0aW9uO1xyXG5leHBvcnQgdHlwZSBOYkNvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSA9IENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZTtcclxuZXhwb3J0IHR5cGUgTmJDb25uZWN0aW9uUG9zaXRpb25QYWlyID0gQ29ubmVjdGlvblBvc2l0aW9uUGFpcjtcclxuZXhwb3J0IHR5cGUgTmJPdmVybGF5Q29uZmlnID0gT3ZlcmxheUNvbmZpZztcclxuZXhwb3J0IHR5cGUgTmJTY3JvbGxTdHJhdGVneU9wdGlvbnMgPSBTY3JvbGxTdHJhdGVneU9wdGlvbnM7XHJcbmV4cG9ydCB0eXBlIE5iU2Nyb2xsU3RyYXRlZ3kgPSBTY3JvbGxTdHJhdGVneTtcclxuXHJcbmNvbnN0IENES19NT0RVTEVTID0gW092ZXJsYXlNb2R1bGUsIFBvcnRhbE1vZHVsZV07XHJcblxyXG4vKlxyXG4gKiBUaGlzIG1vZHVsZSBoZWxwcyB1cyB0byBrZWVwIGFsbCBhbmd1bGFyL2NkayBkZXBzIGluc2lkZSBvdXIgY2RrIG1vZHVsZSB2aWEgcHJvdmlkaW5nIGFsaWFzZXMuXHJcbiAqIEFwcHJvYWNoIHdpbGwgaGVscCB1cyBtb3ZlIGNkayBpbiBzZXBhcmF0ZSBucG0gcGFja2FnZSBhbmQgcmVmYWN0b3IgbmVidWxhci90aGVtZSBjb2RlLlxyXG4gKiAqL1xyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFsuLi5DREtfTU9EVUxFU10sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgLi4uQ0RLX01PRFVMRVMsXHJcbiAgICBOYlBvcnRhbERpcmVjdGl2ZSxcclxuICAgIE5iUG9ydGFsT3V0bGV0RGlyZWN0aXZlLFxyXG4gIF0sXHJcbiAgZGVjbGFyYXRpb25zOiBbTmJQb3J0YWxEaXJlY3RpdmUsIE5iUG9ydGFsT3V0bGV0RGlyZWN0aXZlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5iQ2RrTWFwcGluZ01vZHVsZSB7XHJcbiAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XHJcbiAgICByZXR1cm4gPE1vZHVsZVdpdGhQcm92aWRlcnM+IHtcclxuICAgICAgbmdNb2R1bGU6IE5iQ2RrTWFwcGluZ01vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgTmJPdmVybGF5LFxyXG4gICAgICAgIE5iUGxhdGZvcm0sXHJcbiAgICAgICAgTmJPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gICAgICBdLFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19