UNPKG

ngx-bootstrap-treeview

Version:

Ngx Bootstrap Treeview - Simple library to visualize, search and interact with tree data

175 lines 17.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { Component, Input, ElementRef, Renderer2, ViewChild, NgZone, Output, EventEmitter } from '@angular/core'; import { ContextMenuService } from '../../services/context-menu.service'; export class NgxBootstrapTreeviewContextMenuComponent { /** * @param {?} _renderer * @param {?} _zone * @param {?} _contextMenuService */ constructor(_renderer, _zone, _contextMenuService) { this._renderer = _renderer; this._zone = _zone; this._contextMenuService = _contextMenuService; this._defaultConfig = { containerClass: '', hoveredItemClass: '', itemsClass: '' }; this.config = {}; this.rootContextMenu = null; this.branchContextMenu = null; this.leafContextMenu = null; this.hidden = new EventEmitter(); this.shown = new EventEmitter(); this._activeMenu = null; } /** * @return {?} */ ngOnInit() { this.config = Object.assign({}, this._defaultConfig, this.config); this._contextMenuService.lastContextMenuEvent.subscribe((lastContextMenuEvent) => { if (lastContextMenuEvent) { this.show(lastContextMenuEvent); } else { this.hide(); } }); this._renderer.listen(document, 'click.out-zone', this.onDocumentClicked.bind(this)); this._renderer.listen(document, 'keyup.out-zone', this.onKeyPressed.bind(this)); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if ('config' in changes) { this.config = Object.assign({}, this._defaultConfig, changes.config.currentValue); } } /** * @param {?} event * @return {?} */ onDocumentClicked(event) { if (this.lastContextMenuEvent) { event.preventDefault(); event.stopPropagation(); this.hide(); } } /** * @param {?} event * @return {?} */ onKeyPressed(event) { if (this.lastContextMenuEvent && event.key.toLowerCase() === 'escape') { this.hide(); } } /** * @return {?} */ getLabels() { return this._activeMenu ? Object.keys(this._activeMenu) : []; } /** * @param {?} label * @return {?} */ onItemClicked(label) { this._activeMenu[label](this.lastContextMenuEvent.target); } /** * @return {?} */ hide() { this._zone.run(() => { this._activeMenu = null; this.lastContextMenuEvent = null; this.hidden.emit(); }); } /** * @param {?} contextMenuEvent * @return {?} */ show(contextMenuEvent) { this.lastContextMenuEvent = contextMenuEvent; if (!contextMenuEvent.target) { this._activeMenu = this.rootContextMenu; } else if (contextMenuEvent.target.children) { this._activeMenu = this.branchContextMenu; } else { this._activeMenu = this.leafContextMenu; } /** @type {?} */ const nativeElement = this.container.nativeElement; /** @type {?} */ const x = this.lastContextMenuEvent.event.pageX.toString(); /** @type {?} */ const y = this.lastContextMenuEvent.event.pageY.toString(); this._renderer.setStyle(nativeElement, 'top', y + 'px'); this._renderer.setStyle(nativeElement, 'left', x + 'px'); this.shown.emit(); } } NgxBootstrapTreeviewContextMenuComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line: component-selector selector: 'ngx-bootstrap-treeview-context-menu', template: "<div\r\n class=\"context-menu list-group\"\r\n [ngClass]=\"{ 'd-none': !lastContextMenuEvent, 'd-block': lastContextMenuEvent }\"\r\n #container\r\n>\r\n <button\r\n class=\"context-menu-item {{ config.itemsClass }}\"\r\n *ngFor=\"let label of getLabels()\"\r\n (click)=\"onItemClicked(label)\"\r\n [ngClass]=\"{ 'list-group-item list-group-item-action px-3': !config.itemsClass }\"\r\n >\r\n {{ label }}\r\n </button>\r\n</div>\r\n", styles: [".context-menu{background-color:#fff;border-radius:.25rem;left:0;position:fixed;top:0;z-index:100}.context-menu .context-menu-item{border-top-width:0;border-bottom-width:0;padding-top:.0625rem;padding-bottom:.0625rem;transition:background-color .3s}.context-menu .context-menu-item:first-of-type{padding-top:.125rem;border-top-width:1px}.context-menu .context-menu-item:last-of-type{padding-bottom:.125rem;border-bottom-width:1px}.context-menu .context-menu-item:hover{background:rgba(0,0,0,.8);color:#fff}"] }] } ]; /** @nocollapse */ NgxBootstrapTreeviewContextMenuComponent.ctorParameters = () => [ { type: Renderer2 }, { type: NgZone }, { type: ContextMenuService } ]; NgxBootstrapTreeviewContextMenuComponent.propDecorators = { config: [{ type: Input }], rootContextMenu: [{ type: Input }], branchContextMenu: [{ type: Input }], leafContextMenu: [{ type: Input }], hidden: [{ type: Output }], shown: [{ type: Output }], container: [{ type: ViewChild, args: ['container',] }] }; if (false) { /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype._defaultConfig; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.config; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.rootContextMenu; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.branchContextMenu; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.leafContextMenu; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.hidden; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.shown; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.container; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype._activeMenu; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.lastContextMenuEvent; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype._renderer; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype._zone; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype._contextMenuService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWJvb3RzdHJhcC10cmVldmlldy8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUvbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULEtBQUssRUFDTCxVQUFVLEVBQ1YsU0FBUyxFQUdULFNBQVMsRUFDVCxNQUFNLEVBQ04sTUFBTSxFQUNOLFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQVN6RSxNQUFNLE9BQU8sd0NBQXdDOzs7Ozs7SUFnQ2pELFlBQW9CLFNBQW9CLEVBQVUsS0FBYSxFQUFVLG1CQUF1QztRQUE1RixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFVLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUEvQnpHLG1CQUFjLEdBQTBDO1lBQzNELGNBQWMsRUFBRSxFQUFFO1lBQ2xCLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsVUFBVSxFQUFFLEVBQUU7U0FDakIsQ0FBQztRQUdLLFdBQU0sR0FBMEMsRUFBRSxDQUFDO1FBR25ELG9CQUFlLEdBQTJDLElBQUksQ0FBQztRQUcvRCxzQkFBaUIsR0FBMkMsSUFBSSxDQUFDO1FBR2pFLG9CQUFlLEdBQTJDLElBQUksQ0FBQztRQUcvRCxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUdsQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUtoQyxnQkFBVyxHQUEyQyxJQUFJLENBQUM7SUFJZ0QsQ0FBQzs7OztJQUVwSCxRQUFRO1FBQ0osSUFBSSxD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QUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTs7Y0FDcEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtRQUUxRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7OztZQWhISixTQUFTLFNBQUM7O2dCQUVQLFFBQVEsRUFBRSxxQ0FBcUM7Z0JBQy9DLGlmQUFtRTs7YUFFdEU7Ozs7WUFsQkcsU0FBUztZQUlULE1BQU07WUFNRCxrQkFBa0I7OztxQkFnQnRCLEtBQUs7OEJBR0wsS0FBSztnQ0FHTCxLQUFLOzhCQUdMLEtBQUs7cUJBR0wsTUFBTTtvQkFHTixNQUFNO3dCQUdOLFNBQVMsU0FBQyxXQUFXOzs7O0lBeEJ0QixrRUFJRTs7SUFFRiwwREFDMEQ7O0lBRTFELG1FQUNzRTs7SUFFdEUscUVBQ3dFOztJQUV4RSxtRUFDc0U7O0lBRXRFLDBEQUN5Qzs7SUFFekMseURBQ3dDOztJQUV4Qyw2REFDNkM7O0lBRTdDLCtEQUFtRTs7SUFFbkUsd0VBQThDOztJQUVsQyw2REFBNEI7O0lBQUUseURBQXFCOztJQUFFLHVFQUErQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBPbkluaXQsXHJcbiAgICBJbnB1dCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBSZW5kZXJlcjIsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgTmdab25lLFxyXG4gICAgT3V0cHV0LFxyXG4gICAgRXZlbnRFbWl0dGVyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5neEJvb3RzdHJhcFRyZWV2aWV3Q29udGV4dE1lbnVDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUtY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUFjdGlvbnMgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUtYWN0aW9ucy5tb2RlbCc7XHJcbmltcG9ydCB7IENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbnRleHQtbWVudS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnVFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy9jb250ZXh0LW1lbnUtZXZlbnQubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxyXG4gICAgc2VsZWN0b3I6ICduZ3gtYm9vdHN0cmFwLXRyZWV2aWV3LWNvbnRleHQtbWVudScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICAgIHB1YmxpYyBfZGVmYXVsdENvbmZpZzogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUNvbmZpZyA9IHtcclxuICAgICAgICBjb250YWluZXJDbGFzczogJycsXHJcbiAgICAgICAgaG92ZXJlZEl0ZW1DbGFzczogJycsXHJcbiAgICAgICAgaXRlbXNDbGFzczogJydcclxuICAgIH07XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjb25maWc6IE5neEJvb3RzdHJhcFRyZWV2aWV3Q29udGV4dE1lbnVDb25maWcgPSB7fTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHJvb3RDb250ZXh0TWVudTogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUFjdGlvbnMgPSBudWxsO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYnJhbmNoQ29udGV4dE1lbnU6IE5neEJvb3RzdHJhcFRyZWV2aWV3Q29udGV4dE1lbnVBY3Rpb25zID0gbnVsbDtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxlYWZDb250ZXh0TWVudTogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUFjdGlvbnMgPSBudWxsO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGhpZGRlbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBzaG93biA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInKVxyXG4gICAgcHVibGljIGNvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gICAgcHJpdmF0ZSBfYWN0aXZlTWVudTogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUFjdGlvbnMgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBsYXN0Q29udGV4dE1lbnVFdmVudDogQ29udGV4dE1lbnVFdmVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIF96b25lOiBOZ1pvbmUsIHByaXZhdGUgX2NvbnRleHRNZW51U2VydmljZTogQ29udGV4dE1lbnVTZXJ2aWNlKSB7fVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLl9kZWZhdWx0Q29uZmlnLCAuLi50aGlzLmNvbmZpZyB9O1xyXG5cclxuICAgICAgICB0aGlzLl9jb250ZXh0TWVudVNlcnZpY2UubGFzdENvbnRleHRNZW51RXZlbnQuc3Vic2NyaWJlKChsYXN0Q29udGV4dE1lbnVFdmVudDogQ29udGV4dE1lbnVFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAobGFzdENvbnRleHRNZW51RXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvdyhsYXN0Q29udGV4dE1lbnVFdmVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5saXN0ZW4oZG9jdW1lbnQsICdjbGljay5vdXQtem9uZScsIHRoaXMub25Eb2N1bWVudENsaWNrZWQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIubGlzdGVuKGRvY3VtZW50LCAna2V5dXAub3V0LXpvbmUnLCB0aGlzLm9uS2V5UHJlc3NlZC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCdjb25maWcnIGluIGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuX2RlZmF1bHRDb25maWcsIC4uLmNoYW5nZXMuY29uZmlnLmN1cnJlbnRWYWx1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Eb2N1bWVudENsaWNrZWQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGFzdENvbnRleHRNZW51RXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uS2V5UHJlc3NlZChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLmxhc3RDb250ZXh0TWVudUV2ZW50ICYmIGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSAnZXNjYXBlJykge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldExhYmVscygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZU1lbnUgPyBPYmplY3Qua2V5cyh0aGlzLl9hY3RpdmVNZW51KSA6IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkl0ZW1DbGlja2VkKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9hY3RpdmVNZW51W2xhYmVsXSh0aGlzLmxhc3RDb250ZXh0TWVudUV2ZW50LnRhcmdldCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVNZW51ID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5sYXN0Q29udGV4dE1lbnVFdmVudCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZGRlbi5lbWl0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3coY29udGV4dE1lbnVFdmVudDogQ29udGV4dE1lbnVFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGFzdENvbnRleHRNZW51RXZlbnQgPSBjb250ZXh0TWVudUV2ZW50O1xyXG5cclxuICAgICAgICBpZiAoIWNvbnRleHRNZW51RXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZU1lbnUgPSB0aGlzLnJvb3RDb250ZXh0TWVudTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRNZW51RXZlbnQudGFyZ2V0LmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZU1lbnUgPSB0aGlzLmJyYW5jaENvbnRleHRNZW51O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZU1lbnUgPSB0aGlzLmxlYWZDb250ZXh0TWVudTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLmxhc3RDb250ZXh0TWVudUV2ZW50LmV2ZW50LnBhZ2VYLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgY29uc3QgeSA9IHRoaXMubGFzdENvbnRleHRNZW51RXZlbnQuZXZlbnQucGFnZVkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUobmF0aXZlRWxlbWVudCwgJ3RvcCcsIHkgKyAncHgnKTtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAnbGVmdCcsIHggKyAncHgnKTtcclxuXHJcbiAgICAgICAgdGhpcy5zaG93bi5lbWl0KCk7XHJcbiAgICB9XHJcbn1cclxuIl19