ng2-modal-module
Version:
bootstrap modal component adjusted for angular2+ framework based on rx-pubsub service. NO jQuery!
295 lines • 23.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, Input, ViewChild, ViewContainerRef } from '@angular/core';
import { ComponentInjector } from 'component-injector';
import { PubSubDistinct } from 'pubsub-distinct';
import { XDomUtil } from 'xdom-util';
export class Ng2ModalWindowComponent {
/**
* @param {?} componentInjector
*/
constructor(componentInjector) {
this.componentInjector = componentInjector;
this.animationClass = 'fade';
this.showModalClass = 'in';
this.bodyOpenModalClass = 'modal-open';
this.defaultProperties = {
title: '',
show: false,
showEvent: false,
hide: false,
componentSelector: false,
componentInputs: false,
htmlContent: '',
overlayClick: true,
customClass: '',
buttons: {
visible: true,
cancel: {
visible: true,
label: 'Cancel',
event: false
},
success: {
visible: true,
label: 'Save',
event: false
}
}
};
this.properties = {};
}
/**
* @param {?} eventName
* @return {?}
*/
set id(eventName) {
if (eventName) {
this.eventName = eventName;
// remove previous subscription and create new one
this.unsubscribe();
this.subscribeToEvent();
}
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @return {?}
*/
ngOnDestroy() {
this.unsubscribe();
this.resetInjectedComponent();
}
/**
* @return {?}
*/
cancelAction() {
if (this.properties.buttons.cancel.event) {
PubSubDistinct.publishDistinct(this.properties.buttons.cancel.event, true);
}
this.hide();
}
/**
* @return {?}
*/
successAction() {
if (this.properties.buttons.success.event) {
PubSubDistinct.publishDistinct(this.properties.buttons.success.event, true);
}
else {
this.hide();
}
}
/**
* @return {?}
*/
overlayClick() {
if (this.properties.overlayClick) {
this.cancelAction();
}
}
/**
* @protected
* @return {?}
*/
show() {
// add class to modal DOM element to make it visible
/** @type {?} */
let modalDom = this.modalWindow.nativeElement;
if (!XDomUtil.hasClass(modalDom, this.showModalClass)) {
XDomUtil.addClass(modalDom, this.showModalClass);
}
// add class to modal body to disable the scrolling
/** @type {?} */
let body = document.querySelector('body');
if (!XDomUtil.hasClass(body, this.bodyOpenModalClass)) {
XDomUtil.addClass(body, this.bodyOpenModalClass);
}
if (this.properties.showEvent) {
PubSubDistinct.publishDistinct(this.properties.showEvent, true);
}
}
/**
* @protected
* @return {?}
*/
hide() {
/** @type {?} */
let element = this.modalWindow.nativeElement;
XDomUtil.removeClass(element, this.showModalClass);
/** @type {?} */
let body = document.querySelector('body');
XDomUtil.removeClass(body, this.bodyOpenModalClass);
}
/**
* @protected
* @return {?}
*/
subscribeToEvent() {
this.eventSubscriber = PubSubDistinct.subscribe(this.eventName, (/**
* @param {?} data
* @return {?}
*/
(data) => {
this.initModal(data);
}));
}
/**
* @protected
* @param {?} properties
* @return {?}
*/
initModal(properties) {
if (properties.show) {
// remove previously injected component
this.resetInjectedComponent();
// reset the properties
this.setProperties(properties);
// inject component
if (this.properties.componentSelector) {
this.injectedComponentRef = this.injectComponent(this.properties.componentSelector);
// set the components properties
this.setComponentProperties();
}
// display the modal
this.show();
// reset modal event subscriber
this.resetModalEventSubscriber();
}
else if (properties.hide) {
// remove previously injected component
this.resetInjectedComponent();
// reset the properties
this.setProperties(properties);
// hide the modal
this.hide();
// reset modal event subscriber
this.resetModalEventSubscriber();
}
}
/**
* @protected
* @return {?}
*/
unsubscribe() {
if (this.eventSubscriber) {
PubSubDistinct.unsubscribe(this.eventSubscriber);
}
}
/**
* @protected
* @param {?} componentSelector
* @return {?}
*/
injectComponent(componentSelector) {
/** @type {?} */
let result;
if (componentSelector) {
result = this.componentInjector.inject(this.injectContainer, componentSelector);
}
return result;
}
/**
* @protected
* @return {?}
*/
setComponentProperties() {
if (this.properties.componentInputs && this.injectedComponentRef) {
this.componentInjector.setProperties(this.injectedComponentRef, this.properties.componentInputs);
}
}
/**
* @private
* @return {?}
*/
resetInjectedComponent() {
if (this.injectedComponentRef) {
this.componentInjector.remove(this.injectedComponentRef);
this.injectedComponentRef = null;
}
}
/**
* @private
* @param {?} properties
* @return {?}
*/
setProperties(properties) {
this.properties = Object.assign({}, this.defaultProperties, properties);
}
/**
* @private
* @return {?}
*/
resetModalEventSubscriber() {
// reset modal show/hide display
PubSubDistinct.publishDistinct(this.eventName, {});
}
}
Ng2ModalWindowComponent.decorators = [
{ type: Component, args: [{
selector: 'ng2-modal-window',
template: "<div class=\"ko-modal-window modal\" [ngClass]=\"animationClass\" tabindex=\"-1\" role=\"dialog\" id=\"myModal\" #modalWindow>\n <div class=\"ko-modal-overlay\" (click)=\"overlayClick()\"></div>\n <div class=\"modal-dialog {{properties.customClass}}\" role=\"document\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"cancelAction()\">\n <span aria-hidden=\"true\">×</span>\n </button>\n <h4 class=\"modal-title\">{{properties.title}}</h4>\n </div>\n <div class=\"modal-body\">\n <div #injectContainer [innerHTML]=\"properties.htmlContent | trustHtml\"></div>\n </div>\n <div class=\"modal-footer\" *ngIf=\"properties?.buttons?.visible\">\n <button type=\"button\" class=\"btn btn-default\" (click)=\"cancelAction()\"\n *ngIf=\"properties.buttons.cancel?.visible\">{{properties.buttons.cancel.label}}\n </button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"successAction()\"\n *ngIf=\"properties.buttons.success?.visible\">{{properties.buttons.success.label}}\n </button>\n </div>\n </div><!-- /.modal-content -->\n </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->\n",
styles: [".ko-modal-window{background-color:rgba(0,0,0,.5)}.ko-modal-window.in{display:block}.ko-modal-open{overflow:hidden}.ko-modal-overlay{position:fixed;width:100%;height:100%;left:0;top:0}"]
}] }
];
/** @nocollapse */
Ng2ModalWindowComponent.ctorParameters = () => [
{ type: ComponentInjector }
];
Ng2ModalWindowComponent.propDecorators = {
modalWindow: [{ type: ViewChild, args: ['modalWindow', { static: true },] }],
injectContainer: [{ type: ViewChild, args: ['injectContainer', { read: ViewContainerRef, static: true },] }],
animationClass: [{ type: Input }],
id: [{ type: Input }]
};
if (false) {
/** @type {?} */
Ng2ModalWindowComponent.prototype.modalWindow;
/** @type {?} */
Ng2ModalWindowComponent.prototype.injectContainer;
/** @type {?} */
Ng2ModalWindowComponent.prototype.animationClass;
/**
* @type {?}
* @protected
*/
Ng2ModalWindowComponent.prototype.showModalClass;
/**
* @type {?}
* @protected
*/
Ng2ModalWindowComponent.prototype.bodyOpenModalClass;
/**
* @type {?}
* @protected
*/
Ng2ModalWindowComponent.prototype.eventSubscriber;
/**
* @type {?}
* @protected
*/
Ng2ModalWindowComponent.prototype.injectedComponentRef;
/**
* @type {?}
* @protected
*/
Ng2ModalWindowComponent.prototype.defaultProperties;
/** @type {?} */
Ng2ModalWindowComponent.prototype.properties;
/**
* @type {?}
* @protected
*/
Ng2ModalWindowComponent.prototype.eventName;
/**
* @type {?}
* @protected
*/
Ng2ModalWindowComponent.prototype.componentInjector;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmcyLW1vZGFsLXdpbmRvdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZzItbW9kYWwtbW9kdWxlLyIsInNvdXJjZXMiOlsibGliL25nMi1tb2RhbC13aW5kb3cvbmcyLW1vZGFsLXdpbmRvdy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsVUFBVSxFQUNWLEtBQUssRUFHTCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQWdCLE1BQU0saUJBQWlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU9yQyxNQUFNLE9BQU8sdUJBQXVCOzs7O0lBbUNsQyxZQUFzQixpQkFBb0M7UUFBcEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQWhDakQsbUJBQWMsR0FBVyxNQUFNLENBQUM7UUFDL0IsbUJBQWMsR0FBVyxJQUFJLENBQUM7UUFDOUIsdUJBQWtCLEdBQVcsWUFBWSxDQUFDO1FBRzFDLHNCQUFpQixHQUFRO1lBQ2pDLEtBQUssRUFBRSxFQUFFO1lBQ1QsSUFBSSxFQUFFLEtBQUs7WUFDWCxTQUFTLEVBQUUsS0FBSztZQUNoQixJQUFJLEVBQUUsS0FBSztZQUNYLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsZUFBZSxFQUFFLEtBQUs7WUFDdEIsV0FBVyxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsSUFBSTtZQUNsQixXQUFXLEVBQUUsRUFBRTtZQUNmLE9BQU8sRUFBRTtnQkFDUCxPQUFPLEVBQUUsSUFBSTtnQkFDYixNQUFNLEVBQUU7b0JBQ04sT0FBTyxFQUFFLElBQUk7b0JBQ2IsS0FBSyxFQUFFLFFBQVE7b0JBQ2YsS0FBSyxFQUFFLEtBQUs7aUJBQ2I7Z0JBQ0QsT0FBTyxFQUFFO29C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LEVBQUM7NkJBQ25FLEtBQUs7aUJBbUNMLEtBQUs7Ozs7SUFyQ04sOENBQWtFOztJQUNsRSxrREFBd0c7O0lBQ3hHLGlEQUF5Qzs7Ozs7SUFDekMsaURBQXdDOzs7OztJQUN4QyxxREFBb0Q7Ozs7O0lBQ3BELGtEQUF3Qzs7Ozs7SUFDeEMsdURBQWtEOzs7OztJQUNsRCxvREF1QkU7O0lBQ0YsNkNBQXFCOzs7OztJQUNyQiw0Q0FBNEI7Ozs7O0lBRWhCLG9EQUE4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVmLFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbXBvbmVudEluamVjdG9yIH0gZnJvbSAnY29tcG9uZW50LWluamVjdG9yJztcbmltcG9ydCB7IFB1YlN1YkRpc3RpbmN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdwdWJzdWItZGlzdGluY3QnO1xuaW1wb3J0IHsgWERvbVV0aWwgfSBmcm9tICd4ZG9tLXV0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZzItbW9kYWwtd2luZG93JyxcbiAgdGVtcGxhdGVVcmw6ICcuL25nMi1tb2RhbC13aW5kb3cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZzItbW9kYWwtd2luZG93LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOZzJNb2RhbFdpbmRvd0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnbW9kYWxXaW5kb3cnLCB7c3RhdGljOiB0cnVlfSkgbW9kYWxXaW5kb3c6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2luamVjdENvbnRhaW5lcicsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWV9KSBpbmplY3RDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gIEBJbnB1dCgpIGFuaW1hdGlvbkNsYXNzOiBzdHJpbmcgPSAnZmFkZSc7XG4gIHByb3RlY3RlZCBzaG93TW9kYWxDbGFzczogc3RyaW5nID0gJ2luJztcbiAgcHJvdGVjdGVkIGJvZHlPcGVuTW9kYWxDbGFzczogc3RyaW5nID0gJ21vZGFsLW9wZW4nO1xuICBwcm90ZWN0ZWQgZXZlbnRTdWJzY3JpYmVyOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBpbmplY3RlZENvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT47XG4gIHByb3RlY3RlZCBkZWZhdWx0UHJvcGVydGllczogYW55ID0ge1xuICAgIHRpdGxlOiAnJyxcbiAgICBzaG93OiBmYWxzZSxcbiAgICBzaG93RXZlbnQ6IGZhbHNlLFxuICAgIGhpZGU6IGZhbHNlLFxuICAgIGNvbXBvbmVudFNlbGVjdG9yOiBmYWxzZSxcbiAgICBjb21wb25lbnRJbnB1dHM6IGZhbHNlLFxuICAgIGh0bWxDb250ZW50OiAnJyxcbiAgICBvdmVybGF5Q2xpY2s6IHRydWUsXG4gICAgY3VzdG9tQ2xhc3M6ICcnLFxuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBjYW5jZWw6IHtcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgbGFiZWw6ICdDYW5jZWwnLFxuICAgICAgICBldmVudDogZmFsc2VcbiAgICAgIH0sXG4gICAgICBzdWNjZXNzOiB7XG4gICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgIGxhYmVsOiAnU2F2ZScsXG4gICAgICAgIGV2ZW50OiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcHJvcGVydGllczogYW55ID0ge307XG4gIHByb3RlY3RlZCBldmVudE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY29tcG9uZW50SW5qZWN0b3I6IENvbXBvbmVudEluamVjdG9yKSB7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaWQoZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoZXZlbnROYW1lKSB7XG4gICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgIC8vIHJlbW92ZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gYW5kIGNyZWF0ZSBuZXcgb25lXG4gICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnJlc2V0SW5qZWN0ZWRDb21wb25lbnQoKTtcbiAgfVxuXG4gIGNhbmNlbEFjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmJ1dHRvbnMuY2FuY2VsLmV2ZW50KSB7XG4gICAgICBQdWJTdWJEaXN0aW5jdC5wdWJsaXNoRGlzdGluY3QodGhpcy5wcm9wZXJ0aWVzLmJ1dHRvbnMuY2FuY2VsLmV2ZW50LCB0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5oaWRlKCk7XG4gIH1cblxuICBzdWNjZXNzQWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuYnV0dG9ucy5zdWNjZXNzLmV2ZW50KSB7XG4gICAgICBQdWJTdWJEaXN0aW5jdC5wdWJsaXNoRGlzdGluY3QodGhpcy5wcm9wZXJ0aWVzLmJ1dHRvbnMuc3VjY2Vzcy5ldmVudCwgdHJ1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcmxheUNsaWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BlcnRpZXMub3ZlcmxheUNsaWNrKSB7XG4gICAgICB0aGlzLmNhbmNlbEFjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93KCk6IHZvaWQge1xuICAgIC8vIGFkZCBjbGFzcyB0byBtb2RhbCBET00gZWxlbWVudCB0byBtYWtlIGl0IHZpc2libGVcbiAgICBsZXQgbW9kYWxEb20gPSB0aGlzLm1vZGFsV2luZG93Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFYRG9tVXRpbC5oYXNDbGFzcyhtb2RhbERvbSwgdGhpcy5zaG93TW9kYWxDbGFzcykpIHtcbiAgICAgIFhEb21VdGlsLmFkZENsYXNzKG1vZGFsRG9tLCB0aGlzLnNob3dNb2RhbENsYXNzKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgY2xhc3MgdG8gbW9kYWwgYm9keSB0byBkaXNhYmxlIHRoZSBzY3JvbGxpbmdcbiAgICBsZXQgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKTtcbiAgICBpZiAoIVhEb21VdGlsLmhhc0NsYXNzKGJvZHksIHRoaXMuYm9keU9wZW5Nb2RhbENsYXNzKSkge1xuICAgICAgWERvbVV0aWwuYWRkQ2xhc3MoYm9keSwgdGhpcy5ib2R5T3Blbk1vZGFsQ2xhc3MpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuc2hvd0V2ZW50KSB7XG4gICAgICBQdWJTdWJEaXN0aW5jdC5wdWJsaXNoRGlzdGluY3QodGhpcy5wcm9wZXJ0aWVzLnNob3dFdmVudCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGUoKTogdm9pZCB7XG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLm1vZGFsV2luZG93Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgWERvbVV0aWwucmVtb3ZlQ2xhc3MoZWxlbWVudCwgdGhpcy5zaG93TW9kYWxDbGFzcyk7XG5cbiAgICBsZXQgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKTtcbiAgICBYRG9tVXRpbC5yZW1vdmVDbGFzcyhib2R5LCB0aGlzLmJvZHlPcGVuTW9kYWxDbGFzcyk7XG4gIH1cblxuXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVUb0V2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRTdWJzY3JpYmVyID0gUHViU3ViRGlzdGluY3Quc3Vic2NyaWJlKHRoaXMuZXZlbnROYW1lLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLmluaXRNb2RhbChkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0TW9kYWwocHJvcGVydGllczogYW55KTogdm9pZCB7XG4gICAgaWYgKHByb3BlcnRpZXMuc2hvdykge1xuICAgICAgLy8gcmVtb3ZlIHByZXZpb3VzbHkgaW5qZWN0ZWQgY29tcG9uZW50XG4gICAgICB0aGlzLnJlc2V0SW5qZWN0ZWRDb21wb25lbnQoKTtcbiAgICAgIC8vIHJlc2V0IHRoZSBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50XG4gICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmNvbXBvbmVudFNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuaW5qZWN0ZWRDb21wb25lbnRSZWYgPSB0aGlzLmluamVjdENvbXBvbmVudCh0aGlzLnByb3BlcnRpZXMuY29tcG9uZW50U2VsZWN0b3IpO1xuICAgICAgICAvLyBzZXQgdGhlIGNvbXBvbmVudHMgcHJvcGVydGllc1xuICAgICAgICB0aGlzLnNldENvbXBvbmVudFByb3BlcnRpZXMoKTtcbiAgICAgIH1cbiAgICAgIC8vIGRpc3BsYXkgdGhlIG1vZGFsXG4gICAgICB0aGlzLnNob3coKTtcbiAgICAgIC8vIHJlc2V0IG1vZGFsIGV2ZW50IHN1YnNjcmliZXJcbiAgICAgIHRoaXMucmVzZXRNb2RhbEV2ZW50U3Vic2NyaWJlcigpO1xuICAgIH1cbiAgICBlbHNlIGlmIChwcm9wZXJ0aWVzLmhpZGUpIHtcbiAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IGluamVjdGVkIGNvbXBvbmVudFxuICAgICAgdGhpcy5yZXNldEluamVjdGVkQ29tcG9uZW50KCk7XG4gICAgICAvLyByZXNldCB0aGUgcHJvcGVydGllc1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpO1xuICAgICAgLy8gaGlkZSB0aGUgbW9kYWxcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgLy8gcmVzZXQgbW9kYWwgZXZlbnQgc3Vic2NyaWJlclxuICAgICAgdGhpcy5yZXNldE1vZGFsRXZlbnRTdWJzY3JpYmVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV2ZW50U3Vic2NyaWJlcikge1xuICAgICAgUHViU3ViRGlzdGluY3QudW5zdWJzY3JpYmUodGhpcy5ldmVudFN1YnNjcmliZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBpbmplY3RDb21wb25lbnQoY29tcG9uZW50U2VsZWN0b3I6IHN0cmluZyk6IENvbXBvbmVudFJlZjxhbnk+IHtcbiAgICBsZXQgcmVzdWx0OiBDb21wb25lbnRSZWY8YW55PjtcbiAgICBpZiAoY29tcG9uZW50U2VsZWN0b3IpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuY29tcG9uZW50SW5qZWN0b3IuaW5qZWN0KHRoaXMuaW5qZWN0Q29udGFpbmVyLCBjb21wb25lbnRTZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRDb21wb25lbnRQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuY29tcG9uZW50SW5wdXRzICYmIHRoaXMuaW5qZWN0ZWRDb21wb25lbnRSZWYpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50SW5qZWN0b3Iuc2V0UHJvcGVydGllcyh0aGlzLmluamVjdGVkQ29tcG9uZW50UmVmLCB0aGlzLnByb3BlcnRpZXMuY29tcG9uZW50SW5wdXRzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0SW5qZWN0ZWRDb21wb25lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5qZWN0ZWRDb21wb25lbnRSZWYpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50SW5qZWN0b3IucmVtb3ZlKHRoaXMuaW5qZWN0ZWRDb21wb25lbnRSZWYpO1xuICAgICAgdGhpcy5pbmplY3RlZENvbXBvbmVudFJlZiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsuLi50aGlzLmRlZmF1bHRQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRNb2RhbEV2ZW50U3Vic2NyaWJlcigpOiB2b2lkIHtcbiAgICAvLyByZXNldCBtb2RhbCBzaG93L2hpZGUgZGlzcGxheVxuICAgIFB1YlN1YkRpc3RpbmN0LnB1Ymxpc2hEaXN0aW5jdCh0aGlzLmV2ZW50TmFtZSwge30pO1xuICB9XG5cbn1cbiJdfQ==