theme-lib
Version:
This is a simple example Angular Library published to npm.
424 lines • 32.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { ComponentFactoryResolver, Inject, Injectable, Injector, TemplateRef } from '@angular/core';
import { fromEvent as observableFromEvent } from 'rxjs';
import { filter } from 'rxjs/operators';
import { NbComponentPortal, NbOverlayService, NbPortalInjector, NbPositionBuilderService, NbTemplatePortal, } from '../cdk';
import { NB_DOCUMENT } from '../../theme.options';
import { NB_DIALOG_CONFIG, NbDialogConfig } from './dialog-config';
import { NbDialogRef } from './dialog-ref';
import { NbDialogContainerComponent } from './dialog-container';
/*
* The `NbDialogService` helps to open dialogs.
*
* @stacked-example(Showcase, dialog/dialog-showcase.component)
*
* A new dialog is opened by calling the `open` method with a component to be loaded and an optional configuration.
* `open` method will return `NbDialogRef` that can be used for the further manipulations.
*
* ### Installation
*
* Import `NbDialogModule.forRoot()` to your app module.
* ```ts
* @NgModule({
* imports: [
* // ...
* NbDialogModule.forRoot(config),
* ],
* })
* export class AppModule { }
* ```
*
* If you are using it in a lazy loaded module than you have to install it with `NbDialogModule.forChild()`:
* ```ts
* @NgModule({
* imports: [
* // ...
* NbDialogModule.forChild(config),
* ],
* })
* export class LazyLoadedModule { }
* ```
*
* ### Usage
*
* ```ts
* const dialogRef = this.dialogService.open(MyDialogComponent, { ... });
* ```
*
* `NbDialogRef` gives capability access reference to the rendered dialog component,
* destroy dialog and some other options described below.
*
* Also, you can inject `NbDialogRef` in dialog component.
*
* ```ts
* this.dialogService.open(MyDialogComponent, { ... });
*
* // my-dialog.component.ts
* constructor(protected dialogRef: NbDialogRef) {
* }
*
* close() {
* this.dialogRef.close();
* }
* ```
*
* Instead of component you can create dialog from TemplateRef:
*
* @stacked-example(Template ref, dialog/dialog-template.component)
*
* The dialog may return result through `NbDialogRef`. Calling component can receive this result with `onClose`
* stream of `NbDialogRef`.
*
* @stacked-example(Result, dialog/dialog-result.component)
*
* ### Configuration
*
* As we mentioned above, `open` method of the `NbDialogService` may receive optional configuration options.
* Also, you can provide global dialogs configuration through `NbDialogModule.forRoot({ ... })`.
*
* This config may contain the following:
*
* `context` - both, template and component may receive data through `config.context` property.
* For components, this data will be assigned through inputs.
* For templates, you can access it inside template as $implicit.
*
* ```ts
* this.dialogService.open(template, { context: 'pass data in template' });
* ```
*
* ```html
* <ng-template let-some-additional-data>
* {{ some-additional-data }}
* <ng-template/>
* ```
*
* `hasBackdrop` - determines is service have to render backdrop under the dialog.
* Default is true.
* @stacked-example(Backdrop, dialog/dialog-has-backdrop.component)
*
* `closeOnBackdropClick` - close dialog on backdrop click if true.
* Default is true.
* @stacked-example(Backdrop click, dialog/dialog-backdrop-click.component)
*
* `closeOnEsc` - close dialog on escape button on the keyboard.
* Default is true.
* @stacked-example(Escape hit, dialog/dialog-esc.component)
*
* `hasScroll` - Disables scroll on content under dialog if true and does nothing otherwise.
* Default is false.
* Please, open dialogs in the separate window and try to scroll.
* @stacked-example(Scroll, dialog/dialog-scroll.component)
*
* `autoFocus` - Focuses dialog automatically after open if true. It's useful to prevent misclicks on
* trigger elements and opening multiple dialogs.
* Default is true.
*
* As you can see, if you open dialog with auto focus dialog will focus first focusable element
* or just blur previously focused automatically.
* Otherwise, without auto focus, the focus will stay on the previously focused element.
* Please, open dialogs in the separate window and try to click on the button without focus
* and then hit space any times. Multiple same dialogs will be opened.
* @stacked-example(Auto focus, dialog/dialog-auto-focus.component)
* */
var NbDialogService = /** @class */ (function () {
function NbDialogService(document, globalConfig, positionBuilder, overlay, injector, cfr) {
this.document = document;
this.globalConfig = globalConfig;
this.positionBuilder = positionBuilder;
this.overlay = overlay;
this.injector = injector;
this.cfr = cfr;
}
/*
* Opens new instance of the dialog, may receive optional config.
* */
/*
* Opens new instance of the dialog, may receive optional config.
* */
/**
* @template T
* @param {?} content
* @param {?=} userConfig
* @return {?}
*/
NbDialogService.prototype.open = /*
* Opens new instance of the dialog, may receive optional config.
* */
/**
* @template T
* @param {?} content
* @param {?=} userConfig
* @return {?}
*/
function (content, userConfig) {
if (userConfig === void 0) { userConfig = {}; }
/** @type {?} */
var config = new NbDialogConfig(tslib_1.__assign({}, this.globalConfig, userConfig));
/** @type {?} */
var overlayRef = this.createOverlay(config);
/** @type {?} */
var dialogRef = new NbDialogRef(overlayRef);
/** @type {?} */
var container = this.createContainer(config, overlayRef);
this.createContent(config, content, container, dialogRef);
this.registerCloseListeners(config, overlayRef, dialogRef);
return dialogRef;
};
/**
* @protected
* @param {?} config
* @return {?}
*/
NbDialogService.prototype.createOverlay = /**
* @protected
* @param {?} config
* @return {?}
*/
function (config) {
/** @type {?} */
var positionStrategy = this.createPositionStrategy();
/** @type {?} */
var scrollStrategy = this.createScrollStrategy(config.hasScroll);
return this.overlay.create({
positionStrategy: positionStrategy,
scrollStrategy: scrollStrategy,
hasBackdrop: config.hasBackdrop,
backdropClass: config.backdropClass,
});
};
/**
* @protected
* @return {?}
*/
NbDialogService.prototype.createPositionStrategy = /**
* @protected
* @return {?}
*/
function () {
return this.positionBuilder
.global()
.centerVertically()
.centerHorizontally();
};
/**
* @protected
* @param {?} hasScroll
* @return {?}
*/
NbDialogService.prototype.createScrollStrategy = /**
* @protected
* @param {?} hasScroll
* @return {?}
*/
function (hasScroll) {
if (hasScroll) {
return this.overlay.scrollStrategies.noop();
}
else {
return this.overlay.scrollStrategies.block();
}
};
/**
* @protected
* @param {?} config
* @param {?} overlayRef
* @return {?}
*/
NbDialogService.prototype.createContainer = /**
* @protected
* @param {?} config
* @param {?} overlayRef
* @return {?}
*/
function (config, overlayRef) {
/** @type {?} */
var injector = new NbPortalInjector(this.createInjector(config), new WeakMap([[NbDialogConfig, config]]));
/** @type {?} */
var containerPortal = new NbComponentPortal(NbDialogContainerComponent, null, injector, this.cfr);
/** @type {?} */
var containerRef = overlayRef.attach(containerPortal);
return containerRef.instance;
};
/**
* @protected
* @template T
* @param {?} config
* @param {?} content
* @param {?} container
* @param {?} dialogRef
* @return {?}
*/
NbDialogService.prototype.createContent = /**
* @protected
* @template T
* @param {?} config
* @param {?} content
* @param {?} container
* @param {?} dialogRef
* @return {?}
*/
function (config, content, container, dialogRef) {
if (content instanceof TemplateRef) {
/** @type {?} */
var portal = this.createTemplatePortal(config, content, dialogRef);
container.attachTemplatePortal(portal);
}
else {
/** @type {?} */
var portal = this.createComponentPortal(config, content, dialogRef);
dialogRef.componentRef = container.attachComponentPortal(portal);
if (config.context) {
Object.assign(dialogRef.componentRef.instance, tslib_1.__assign({}, config.context));
}
}
};
/**
* @protected
* @template T
* @param {?} config
* @param {?} content
* @param {?} dialogRef
* @return {?}
*/
NbDialogService.prototype.createTemplatePortal = /**
* @protected
* @template T
* @param {?} config
* @param {?} content
* @param {?} dialogRef
* @return {?}
*/
function (config, content, dialogRef) {
return new NbTemplatePortal(content, null, (/** @type {?} */ ({ $implicit: config.context, dialogRef: dialogRef })));
};
/*
* We're creating portal with custom injector provided through config or using global injector.
* This approach provides us capability inject `NbDialogRef` in dialog component.
* */
/*
* We're creating portal with custom injector provided through config or using global injector.
* This approach provides us capability inject `NbDialogRef` in dialog component.
* */
/**
* @protected
* @template T
* @param {?} config
* @param {?} content
* @param {?} dialogRef
* @return {?}
*/
NbDialogService.prototype.createComponentPortal = /*
* We're creating portal with custom injector provided through config or using global injector.
* This approach provides us capability inject `NbDialogRef` in dialog component.
* */
/**
* @protected
* @template T
* @param {?} config
* @param {?} content
* @param {?} dialogRef
* @return {?}
*/
function (config, content, dialogRef) {
/** @type {?} */
var injector = this.createInjector(config);
/** @type {?} */
var portalInjector = new NbPortalInjector(injector, new WeakMap([[NbDialogRef, dialogRef]]));
return new NbComponentPortal(content, config.viewContainerRef, portalInjector);
};
/**
* @protected
* @param {?} config
* @return {?}
*/
NbDialogService.prototype.createInjector = /**
* @protected
* @param {?} config
* @return {?}
*/
function (config) {
return config.viewContainerRef && config.viewContainerRef.injector || this.injector;
};
/**
* @protected
* @template T
* @param {?} config
* @param {?} overlayRef
* @param {?} dialogRef
* @return {?}
*/
NbDialogService.prototype.registerCloseListeners = /**
* @protected
* @template T
* @param {?} config
* @param {?} overlayRef
* @param {?} dialogRef
* @return {?}
*/
function (config, overlayRef, dialogRef) {
if (config.closeOnBackdropClick) {
overlayRef.backdropClick().subscribe(function () { return dialogRef.close(); });
}
if (config.closeOnEsc) {
observableFromEvent(this.document, 'keyup')
.pipe(filter(function (event) { return event.keyCode === 27; }))
.subscribe(function () { return dialogRef.close(); });
}
};
NbDialogService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NbDialogService.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] },
{ type: undefined, decorators: [{ type: Inject, args: [NB_DIALOG_CONFIG,] }] },
{ type: NbPositionBuilderService },
{ type: NbOverlayService },
{ type: Injector },
{ type: ComponentFactoryResolver }
]; };
return NbDialogService;
}());
export { NbDialogService };
if (false) {
/**
* @type {?}
* @protected
*/
NbDialogService.prototype.document;
/**
* @type {?}
* @protected
*/
NbDialogService.prototype.globalConfig;
/**
* @type {?}
* @protected
*/
NbDialogService.prototype.positionBuilder;
/**
* @type {?}
* @protected
*/
NbDialogService.prototype.overlay;
/**
* @type {?}
* @protected
*/
NbDialogService.prototype.injector;
/**
* @type {?}
* @protected
*/
NbDialogService.prototype.cfr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9kaWFsb2cvZGlhbG9nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQU1BLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLFNBQVMsSUFBSSxtQkFBbUIsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEMsT0FBTyxFQUNMLGlCQUFpQixFQUdqQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLHdCQUF3QixFQUV4QixnQkFBZ0IsR0FDakIsTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvSGhFO0lBRUUseUJBQTJDLFFBQVEsRUFDSCxZQUFZLEVBQ3RDLGVBQXlDLEVBQ3pDLE9BQXlCLEVBQ3pCLFFBQWtCLEVBQ2xCLEdBQTZCO1FBTFIsYUFBUSxHQUFSLFFBQVEsQ0FBQTtRQUNILGlCQUFZLEdBQVosWUFBWSxDQUFBO1FBQ3RDLG9CQUFlLEdBQWYsZUFBZSxDQUEwQjtRQUN6QyxZQUFP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c0I7Ozs7Ozs7O0lBQWhDLFVBQW9DLE1BQXNCLEVBQUUsVUFBd0IsRUFBRSxTQUF5QjtRQUM3RyxJQUFJLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRTtZQUMvQixVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQU0sT0FBQSxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQWpCLENBQWlCLENBQUMsQ0FBQztTQUMvRDtRQUVELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUNyQixtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQztpQkFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFDLEtBQW9CLElBQUssT0FBQSxLQUFLLENBQUMsT0FBTyxLQUFLLEVBQUUsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDO2lCQUM1RCxTQUFTLENBQUMsY0FBTSxPQUFBLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBakIsQ0FBaUIsQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQzs7Z0JBNUdGLFVBQVU7Ozs7Z0RBRUksTUFBTSxTQUFDLFdBQVc7Z0RBQ2xCLE1BQU0sU0FBQyxnQkFBZ0I7Z0JBOUhwQyx3QkFBd0I7Z0JBRnhCLGdCQUFnQjtnQkFScUMsUUFBUTtnQkFBdEQsd0JBQXdCOztJQWtQakMsc0JBQUM7Q0FBQSxBQTdHRCxJQTZHQztTQTVHWSxlQUFlOzs7Ozs7SUFDZCxtQ0FBdUM7Ozs7O0lBQ3ZDLHVDQUFnRDs7Ozs7SUFDaEQsMENBQW1EOzs7OztJQUNuRCxrQ0FBbUM7Ozs7O0lBQ25DLG1DQUE0Qjs7Ozs7SUFDNUIsOEJBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IEFrdmVvLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3RvciwgVGVtcGxhdGVSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50IGFzIG9ic2VydmFibGVGcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBOYkNvbXBvbmVudFBvcnRhbCxcclxuICBOYkdsb2JhbFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgTmJPdmVybGF5UmVmLFxyXG4gIE5iT3ZlcmxheVNlcnZpY2UsXHJcbiAgTmJQb3J0YWxJbmplY3RvcixcclxuICBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2UsXHJcbiAgTmJTY3JvbGxTdHJhdGVneSxcclxuICBOYlRlbXBsYXRlUG9ydGFsLFxyXG59IGZyb20gJy4uL2Nkayc7XHJcbmltcG9ydCB7IE5CX0RPQ1VNRU5UIH0gZnJvbSAnLi4vLi4vdGhlbWUub3B0aW9ucyc7XHJcbmltcG9ydCB7IE5CX0RJQUxPR19DT05GSUcsIE5iRGlhbG9nQ29uZmlnIH0gZnJvbSAnLi9kaWFsb2ctY29uZmlnJztcclxuaW1wb3J0IHsgTmJEaWFsb2dSZWYgfSBmcm9tICcuL2RpYWxvZy1yZWYnO1xyXG5pbXBvcnQgeyBOYkRpYWxvZ0NvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9nLWNvbnRhaW5lcic7XHJcblxyXG5cclxuLypcclxuICogVGhlIGBOYkRpYWxvZ1NlcnZpY2VgIGhlbHBzIHRvIG9wZW4gZGlhbG9ncy5cclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShTaG93Y2FzZSwgZGlhbG9nL2RpYWxvZy1zaG93Y2FzZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqIEEgbmV3IGRpYWxvZyBpcyBvcGVuZWQgYnkgY2FsbGluZyB0aGUgYG9wZW5gIG1ldGhvZCB3aXRoIGEgY29tcG9uZW50IHRvIGJlIGxvYWRlZCBhbmQgYW4gb3B0aW9uYWwgY29uZmlndXJhdGlvbi5cclxuICogYG9wZW5gIG1ldGhvZCB3aWxsIHJldHVybiBgTmJEaWFsb2dSZWZgIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHRoZSBmdXJ0aGVyIG1hbmlwdWxhdGlvbnMuXHJcbiAqXHJcbiAqICMjIyBJbnN0YWxsYXRpb25cclxuICpcclxuICogSW1wb3J0IGBOYkRpYWxvZ01vZHVsZS5mb3JSb290KClgIHRvIHlvdXIgYXBwIG1vZHVsZS5cclxuICogYGBgdHNcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbXHJcbiAqICAgXHQvLyAuLi5cclxuICogICAgIE5iRGlhbG9nTW9kdWxlLmZvclJvb3QoY29uZmlnKSxcclxuICogICBdLFxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICpcclxuICogSWYgeW91IGFyZSB1c2luZyBpdCBpbiBhIGxhenkgbG9hZGVkIG1vZHVsZSB0aGFuIHlvdSBoYXZlIHRvIGluc3RhbGwgaXQgd2l0aCBgTmJEaWFsb2dNb2R1bGUuZm9yQ2hpbGQoKWA6XHJcbiAqIGBgYHRzXHJcbiAqIEBOZ01vZHVsZSh7XHJcbiAqICAgaW1wb3J0czogW1xyXG4gKiAgIFx0Ly8gLi4uXHJcbiAqICAgICBOYkRpYWxvZ01vZHVsZS5mb3JDaGlsZChjb25maWcpLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBMYXp5TG9hZGVkTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICpcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIGBgYHRzXHJcbiAqIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKE15RGlhbG9nQ29tcG9uZW50LCB7IC4uLiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIGBOYkRpYWxvZ1JlZmAgZ2l2ZXMgY2FwYWJpbGl0eSBhY2Nlc3MgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJlZCBkaWFsb2cgY29tcG9uZW50LFxyXG4gKiBkZXN0cm95IGRpYWxvZyBhbmQgc29tZSBvdGhlciBvcHRpb25zIGRlc2NyaWJlZCBiZWxvdy5cclxuICpcclxuICogQWxzbywgeW91IGNhbiBpbmplY3QgYE5iRGlhbG9nUmVmYCBpbiBkaWFsb2cgY29tcG9uZW50LlxyXG4gKlxyXG4gKiBgYGB0c1xyXG4gKiB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihNeURpYWxvZ0NvbXBvbmVudCwgeyAuLi4gfSk7XHJcbiAqXHJcbiAqIC8vIG15LWRpYWxvZy5jb21wb25lbnQudHNcclxuICogY29uc3RydWN0b3IocHJvdGVjdGVkIGRpYWxvZ1JlZjogTmJEaWFsb2dSZWYpIHtcclxuICogfVxyXG4gKlxyXG4gKiBjbG9zZSgpIHtcclxuICogICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIGNvbXBvbmVudCB5b3UgY2FuIGNyZWF0ZSBkaWFsb2cgZnJvbSBUZW1wbGF0ZVJlZjpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShUZW1wbGF0ZSByZWYsIGRpYWxvZy9kaWFsb2ctdGVtcGxhdGUuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBUaGUgZGlhbG9nIG1heSByZXR1cm4gcmVzdWx0IHRocm91Z2ggYE5iRGlhbG9nUmVmYC4gQ2FsbGluZyBjb21wb25lbnQgY2FuIHJlY2VpdmUgdGhpcyByZXN1bHQgd2l0aCBgb25DbG9zZWBcclxuICogc3RyZWFtIG9mIGBOYkRpYWxvZ1JlZmAuXHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoUmVzdWx0LCBkaWFsb2cvZGlhbG9nLXJlc3VsdC5jb21wb25lbnQpXHJcbiAqXHJcbiAqICMjIyBDb25maWd1cmF0aW9uXHJcbiAqXHJcbiAqIEFzIHdlIG1lbnRpb25lZCBhYm92ZSwgYG9wZW5gIG1ldGhvZCBvZiB0aGUgYE5iRGlhbG9nU2VydmljZWAgbWF5IHJlY2VpdmUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zLlxyXG4gKiBBbHNvLCB5b3UgY2FuIHByb3ZpZGUgZ2xvYmFsIGRpYWxvZ3MgY29uZmlndXJhdGlvbiB0aHJvdWdoIGBOYkRpYWxvZ01vZHVsZS5mb3JSb290KHsgLi4uIH0pYC5cclxuICpcclxuICogVGhpcyBjb25maWcgbWF5IGNvbnRhaW4gdGhlIGZvbGxvd2luZzpcclxuICpcclxuICogYGNvbnRleHRgIC0gYm90aCwgdGVtcGxhdGUgYW5kIGNvbXBvbmVudCBtYXkgcmVjZWl2ZSBkYXRhIHRocm91Z2ggYGNvbmZpZy5jb250ZXh0YCBwcm9wZXJ0eS5cclxuICogRm9yIGNvbXBvbmVudHMsIHRoaXMgZGF0YSB3aWxsIGJlIGFzc2lnbmVkIHRocm91Z2ggaW5wdXRzLlxyXG4gKiBGb3IgdGVtcGxhdGVzLCB5b3UgY2FuIGFjY2VzcyBpdCBpbnNpZGUgdGVtcGxhdGUgYXMgJGltcGxpY2l0LlxyXG4gKlxyXG4gKiBgYGB0c1xyXG4gKiB0aGlzLmRpYWxvZ1NlcnZpY2Uub3Blbih0ZW1wbGF0ZSwgeyBjb250ZXh0OiAncGFzcyBkYXRhIGluIHRlbXBsYXRlJyB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPG5nLXRlbXBsYXRlIGxldC1zb21lLWFkZGl0aW9uYWwtZGF0YT5cclxuICogICB7eyBzb21lLWFkZGl0aW9uYWwtZGF0YSB9fVxyXG4gKiA8bmctdGVtcGxhdGUvPlxyXG4gKiBgYGBcclxuICpcclxuICogYGhhc0JhY2tkcm9wYCAtIGRldGVybWluZXMgaXMgc2VydmljZSBoYXZlIHRvIHJlbmRlciBiYWNrZHJvcCB1bmRlciB0aGUgZGlhbG9nLlxyXG4gKiBEZWZhdWx0IGlzIHRydWUuXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQmFja2Ryb3AsIGRpYWxvZy9kaWFsb2ctaGFzLWJhY2tkcm9wLmNvbXBvbmVudClcclxuICpcclxuICogYGNsb3NlT25CYWNrZHJvcENsaWNrYCAtIGNsb3NlIGRpYWxvZyBvbiBiYWNrZHJvcCBjbGljayBpZiB0cnVlLlxyXG4gKiBEZWZhdWx0IGlzIHRydWUuXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQmFja2Ryb3AgY2xpY2ssIGRpYWxvZy9kaWFsb2ctYmFja2Ryb3AtY2xpY2suY29tcG9uZW50KVxyXG4gKlxyXG4gKiBgY2xvc2VPbkVzY2AgLSBjbG9zZSBkaWFsb2cgb24gZXNjYXBlIGJ1dHRvbiBvbiB0aGUga2V5Ym9hcmQuXHJcbiAqIERlZmF1bHQgaXMgdHJ1ZS5cclxuICogQHN0YWNrZWQtZXhhbXBsZShFc2NhcGUgaGl0LCBkaWFsb2cvZGlhbG9nLWVzYy5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGBoYXNTY3JvbGxgIC0gRGlzYWJsZXMgc2Nyb2xsIG9uIGNvbnRlbnQgdW5kZXIgZGlhbG9nIGlmIHRydWUgYW5kIGRvZXMgbm90aGluZyBvdGhlcndpc2UuXHJcbiAqIERlZmF1bHQgaXMgZmFsc2UuXHJcbiAqIFBsZWFzZSwgb3BlbiBkaWFsb2dzIGluIHRoZSBzZXBhcmF0ZSB3aW5kb3cgYW5kIHRyeSB0byBzY3JvbGwuXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2Nyb2xsLCBkaWFsb2cvZGlhbG9nLXNjcm9sbC5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGBhdXRvRm9jdXNgIC0gRm9jdXNlcyBkaWFsb2cgYXV0b21hdGljYWxseSBhZnRlciBvcGVuIGlmIHRydWUuIEl0J3MgdXNlZnVsIHRvIHByZXZlbnQgbWlzY2xpY2tzIG9uXHJcbiAqIHRyaWdnZXIgZWxlbWVudHMgYW5kIG9wZW5pbmcgbXVsdGlwbGUgZGlhbG9ncy5cclxuICogRGVmYXVsdCBpcyB0cnVlLlxyXG4gKlxyXG4gKiBBcyB5b3UgY2FuIHNlZSwgaWYgeW91IG9wZW4gZGlhbG9nIHdpdGggYXV0byBmb2N1cyBkaWFsb2cgd2lsbCBmb2N1cyBmaXJzdCBmb2N1c2FibGUgZWxlbWVudFxyXG4gKiBvciBqdXN0IGJsdXIgcHJldmlvdXNseSBmb2N1c2VkIGF1dG9tYXRpY2FsbHkuXHJcbiAqIE90aGVyd2lzZSwgd2l0aG91dCBhdXRvIGZvY3VzLCB0aGUgZm9jdXMgd2lsbCBzdGF5IG9uIHRoZSBwcmV2aW91c2x5IGZvY3VzZWQgZWxlbWVudC5cclxuICogUGxlYXNlLCBvcGVuIGRpYWxvZ3MgaW4gdGhlIHNlcGFyYXRlIHdpbmRvdyBhbmQgdHJ5IHRvIGNsaWNrIG9uIHRoZSBidXR0b24gd2l0aG91dCBmb2N1c1xyXG4gKiBhbmQgdGhlbiBoaXQgc3BhY2UgYW55IHRpbWVzLiBNdWx0aXBsZSBzYW1lIGRpYWxvZ3Mgd2lsbCBiZSBvcGVuZWQuXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQXV0byBmb2N1cywgZGlhbG9nL2RpYWxvZy1hdXRvLWZvY3VzLmNvbXBvbmVudClcclxuICogKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmJEaWFsb2dTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE5CX0RPQ1VNRU5UKSBwcm90ZWN0ZWQgZG9jdW1lbnQsXHJcbiAgICAgICAgICAgICAgQEluamVjdChOQl9ESUFMT0dfQ09ORklHKSBwcm90ZWN0ZWQgZ2xvYmFsQ29uZmlnLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBwb3NpdGlvbkJ1aWxkZXI6IE5iUG9zaXRpb25CdWlsZGVyU2VydmljZSxcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcmxheTogTmJPdmVybGF5U2VydmljZSxcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBPcGVucyBuZXcgaW5zdGFuY2Ugb2YgdGhlIGRpYWxvZywgbWF5IHJlY2VpdmUgb3B0aW9uYWwgY29uZmlnLlxyXG4gICAqICovXHJcbiAgb3BlbjxUPihjb250ZW50OiBUeXBlPFQ+IHwgVGVtcGxhdGVSZWY8VD4sIHVzZXJDb25maWc6IFBhcnRpYWw8TmJEaWFsb2dDb25maWc8VD4+ID0ge30pOiBOYkRpYWxvZ1JlZjxUPiB7XHJcbiAgICBjb25zdCBjb25maWcgPSBuZXcgTmJEaWFsb2dDb25maWcoeyAuLi50aGlzLmdsb2JhbENvbmZpZywgLi4udXNlckNvbmZpZyB9KTtcclxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLmNyZWF0ZU92ZXJsYXkoY29uZmlnKTtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IG5ldyBOYkRpYWxvZ1JlZjxUPihvdmVybGF5UmVmKTtcclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY3JlYXRlQ29udGFpbmVyKGNvbmZpZywgb3ZlcmxheVJlZik7XHJcbiAgICB0aGlzLmNyZWF0ZUNvbnRlbnQoY29uZmlnLCBjb250ZW50LCBjb250YWluZXIsIGRpYWxvZ1JlZik7XHJcblxyXG4gICAgdGhpcy5yZWdpc3RlckNsb3NlTGlzdGVuZXJzKGNvbmZpZywgb3ZlcmxheVJlZiwgZGlhbG9nUmVmKTtcclxuXHJcbiAgICByZXR1cm4gZGlhbG9nUmVmO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU92ZXJsYXkoY29uZmlnOiBOYkRpYWxvZ0NvbmZpZyk6IE5iT3ZlcmxheVJlZiB7XHJcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5jcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCk7XHJcbiAgICBjb25zdCBzY3JvbGxTdHJhdGVneSA9IHRoaXMuY3JlYXRlU2Nyb2xsU3RyYXRlZ3koY29uZmlnLmhhc1Njcm9sbCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMub3ZlcmxheS5jcmVhdGUoe1xyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LFxyXG4gICAgICBzY3JvbGxTdHJhdGVneSxcclxuICAgICAgaGFzQmFja2Ryb3A6IGNvbmZpZy5oYXNCYWNrZHJvcCxcclxuICAgICAgYmFja2Ryb3BDbGFzczogY29uZmlnLmJhY2tkcm9wQ2xhc3MsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCk6IE5iR2xvYmFsUG9zaXRpb25TdHJhdGVneSB7XHJcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbkJ1aWxkZXJcclxuICAgICAgLmdsb2JhbCgpXHJcbiAgICAgIC5jZW50ZXJWZXJ0aWNhbGx5KClcclxuICAgICAgLmNlbnRlckhvcml6b250YWxseSgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVNjcm9sbFN0cmF0ZWd5KGhhc1Njcm9sbDogYm9vbGVhbik6IE5iU2Nyb2xsU3RyYXRlZ3kge1xyXG4gICAgaWYgKGhhc1Njcm9sbCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMubm9vcCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlQ29udGFpbmVyKGNvbmZpZzogTmJEaWFsb2dDb25maWcsIG92ZXJsYXlSZWY6IE5iT3ZlcmxheVJlZik6IE5iRGlhbG9nQ29udGFpbmVyQ29tcG9uZW50IHtcclxuICAgIGNvbnN0IGluamVjdG9yID0gbmV3IE5iUG9ydGFsSW5qZWN0b3IodGhpcy5jcmVhdGVJbmplY3Rvcihjb25maWcpLCBuZXcgV2Vha01hcChbW05iRGlhbG9nQ29uZmlnLCBjb25maWddXSkpO1xyXG4gICAgY29uc3QgY29udGFpbmVyUG9ydGFsID0gbmV3IE5iQ29tcG9uZW50UG9ydGFsKE5iRGlhbG9nQ29udGFpbmVyQ29tcG9uZW50LCBudWxsLCBpbmplY3RvciwgdGhpcy5jZnIpO1xyXG4gICAgY29uc3QgY29udGFpbmVyUmVmID0gb3ZlcmxheVJlZi5hdHRhY2goY29udGFpbmVyUG9ydGFsKTtcclxuICAgIHJldHVybiBjb250YWluZXJSZWYuaW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlQ29udGVudDxUPihjb25maWc6IE5iRGlhbG9nQ29uZmlnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFR5cGU8VD4gfCBUZW1wbGF0ZVJlZjxUPixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IE5iRGlhbG9nQ29udGFpbmVyQ29tcG9uZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZ1JlZjogTmJEaWFsb2dSZWY8VD4pIHtcclxuICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcclxuICAgICAgY29uc3QgcG9ydGFsID0gdGhpcy5jcmVhdGVUZW1wbGF0ZVBvcnRhbChjb25maWcsIGNvbnRlbnQsIGRpYWxvZ1JlZik7XHJcbiAgICAgIGNvbnRhaW5lci5hdHRhY2hUZW1wbGF0ZVBvcnRhbChwb3J0YWwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcG9ydGFsID0gdGhpcy5jcmVhdGVDb21wb25lbnRQb3J0YWwoY29uZmlnLCBjb250ZW50LCBkaWFsb2dSZWYpO1xyXG4gICAgICBkaWFsb2dSZWYuY29tcG9uZW50UmVmID0gY29udGFpbmVyLmF0dGFjaENvbXBvbmVudFBvcnRhbChwb3J0YWwpO1xyXG5cclxuICAgICAgaWYgKGNvbmZpZy5jb250ZXh0KSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihkaWFsb2dSZWYuY29tcG9uZW50UmVmLmluc3RhbmNlLCB7IC4uLmNvbmZpZy5jb250ZXh0IH0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVUZW1wbGF0ZVBvcnRhbDxUPihjb25maWc6IE5iRGlhbG9nQ29uZmlnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBUZW1wbGF0ZVJlZjxUPixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nUmVmOiBOYkRpYWxvZ1JlZjxUPik6IE5iVGVtcGxhdGVQb3J0YWwge1xyXG4gICAgcmV0dXJuIG5ldyBOYlRlbXBsYXRlUG9ydGFsKGNvbnRlbnQsIG51bGwsIDxhbnk+eyAkaW1wbGljaXQ6IGNvbmZpZy5jb250ZXh0LCBkaWFsb2dSZWYgfSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIFdlJ3JlIGNyZWF0aW5nIHBvcnRhbCB3aXRoIGN1c3RvbSBpbmplY3RvciBwcm92aWRlZCB0aHJvdWdoIGNvbmZpZyBvciB1c2luZyBnbG9iYWwgaW5qZWN0b3IuXHJcbiAgICogVGhpcyBhcHByb2FjaCBwcm92aWRlcyB1cyBjYXBhYmlsaXR5IGluamVjdCBgTmJEaWFsb2dSZWZgIGluIGRpYWxvZyBjb21wb25lbnQuXHJcbiAgICogKi9cclxuICBwcm90ZWN0ZWQgY3JlYXRlQ29tcG9uZW50UG9ydGFsPFQ+KGNvbmZpZzogTmJEaWFsb2dDb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBUeXBlPFQ+LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nUmVmOiBOYkRpYWxvZ1JlZjxUPik6IE5iQ29tcG9uZW50UG9ydGFsIHtcclxuICAgIGNvbnN0IGluamVjdG9yID0gdGhpcy5jcmVhdGVJbmplY3Rvcihjb25maWcpO1xyXG4gICAgY29uc3QgcG9ydGFsSW5qZWN0b3IgPSBuZXcgTmJQb3J0YWxJbmplY3RvcihpbmplY3RvciwgbmV3IFdlYWtNYXAoW1tOYkRpYWxvZ1JlZiwgZGlhbG9nUmVmXV0pKTtcclxuICAgIHJldHVybiBuZXcgTmJDb21wb25lbnRQb3J0YWwoY29udGVudCwgY29uZmlnLnZpZXdDb250YWluZXJSZWYsIHBvcnRhbEluamVjdG9yKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVJbmplY3Rvcihjb25maWc6IE5iRGlhbG9nQ29uZmlnKTogSW5qZWN0b3Ige1xyXG4gICAgcmV0dXJuIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yIHx8IHRoaXMuaW5qZWN0b3I7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJDbG9zZUxpc3RlbmVyczxUPihjb25maWc6IE5iRGlhbG9nQ29uZmlnLCBvdmVybGF5UmVmOiBOYk92ZXJsYXlSZWYsIGRpYWxvZ1JlZjogTmJEaWFsb2dSZWY8VD4pIHtcclxuICAgIGlmIChjb25maWcuY2xvc2VPbkJhY2tkcm9wQ2xpY2spIHtcclxuICAgICAgb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IGRpYWxvZ1JlZi5jbG9zZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZmlnLmNsb3NlT25Fc2MpIHtcclxuICAgICAgb2JzZXJ2YWJsZUZyb21FdmVudCh0aGlzLmRvY3VtZW50LCAna2V5dXAnKVxyXG4gICAgICAgIC5waXBlKGZpbHRlcigoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IGV2ZW50LmtleUNvZGUgPT09IDI3KSlcclxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IGRpYWxvZ1JlZi5jbG9zZSgpKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19