UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

338 lines 29.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, Input, Output, EventEmitter, HostListener, ViewContainerRef, ElementRef, Injector, ComponentFactoryResolver, Renderer2, TemplateRef } from '@angular/core'; import { PopoverComponent } from './popover.component'; import { PopoverOptions } from './popover-options.provider'; import { PopoverComponentOptions } from './popover-component-options.provider'; import * as Positioning from '../core/util/position'; export class PopoverDirective { /** * @param {?} _viewContainerRef * @param {?} _elm * @param {?} _defaultOptions * @param {?} _cfr * @param {?} _renderer */ constructor(_viewContainerRef, _elm, _defaultOptions, _cfr, _renderer) { this._viewContainerRef = _viewContainerRef; this._elm = _elm; this._defaultOptions = _defaultOptions; this._cfr = _cfr; this._renderer = _renderer; this._eventListeners = []; this.onVisibleChange = new EventEmitter(true); this.onSelect = new EventEmitter(); } /** * @return {?} */ togglePopover() { if (!this.popover) { this.showPopover(); } else { this.hidePopover(); } } /** * @param {?} placement * @return {?} */ positionMap(placement) { switch (placement) { case 'topLeft': return 'top-left'; case 'topRight': return 'top-right'; case 'bottomLeft': return 'bottom-left'; case 'bottomRight': return 'bottom-right'; case 'leftTop': return 'left-top'; case 'leftBottom': return 'left-bottom'; case 'rightTop': return 'right-top'; case 'rightBottom': return 'right-bottom'; case 'fullScreen': case 'landScape': return 'bottom'; default: return placement; } } /** * @return {?} */ ngOnInit() { } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes.visible && changes.visible.currentValue) { setTimeout((/** * @return {?} */ () => { this.showPopover(); }), 0); } else { setTimeout((/** * @return {?} */ () => { this.hidePopover(); }), 0); } } /** * @return {?} */ ngOnDestroy() { this.hidePopover(); } /** * @private * @param {?} event * @return {?} */ onDocumentClick(event) { if (this.popover && !this._elm.nativeElement.contains(event.target) && !this.popover.location.nativeElement.contains(event.target)) { this.hidePopover(); } } /** * @private * @return {?} */ showPopover() { if (!this.popover) { setTimeout((/** * @return {?} */ () => { this._eventListeners = [ this._renderer.listen('document', 'click', (/** * @param {?} event * @return {?} */ (event) => this.onDocumentClick(event))), this._renderer.listen('document', 'touchend', (/** * @param {?} event * @return {?} */ (event) => this.onDocumentClick(event))), this._renderer.listen('window', 'resize', (/** * @return {?} */ () => this.positionPopover())) ]; })); /** @type {?} */ const options = new PopoverComponentOptions(); options.placement = this.placement; Object.assign(options, this._defaultOptions, { hidePopover: (/** * @param {?} event * @return {?} */ (event) => { this.hidePopover(); }), onAfterViewInit: (/** * @return {?} */ () => { this.positionPopover(); /** @type {?} */ const children = document.getElementsByClassName('am-popover-inner-wrapper')[0].children; if (children.length > 0) { // 首先我们检查它是否包含子节点 for (let i = 0; i < children.length; i++) { children[i].id = `${i}`; children[i].addEventListener('click', (/** * @return {?} */ () => { if (this.onSelect) { this.onSelect.emit(children[i]); if (options.autoClose) { this.hidePopover(); } } }), false); } } }) }); /** @type {?} */ const optionalParams = [ 'mask', 'showArrow', 'placement', 'appendToBody', 'overlay', 'className', 'autoClose' ]; optionalParams.forEach((/** * @param {?} param * @return {?} */ param => { if (typeof this[param] !== 'undefined') { ((/** @type {?} */ (options)))[param] = this[param]; } })); /** @type {?} */ const componentFactory = this._cfr.resolveComponentFactory(PopoverComponent); /** @type {?} */ const childInjector = Injector.create([ { provide: PopoverComponentOptions, useValue: options } ], this._viewContainerRef.parentInjector); this.popover = this._viewContainerRef.createComponent(componentFactory, this._viewContainerRef.length, childInjector); if (options.appendToBody) { document.body.appendChild(this.popover.location.nativeElement); } this.onVisibleChange.emit(true); } } /** * @private * @return {?} */ positionPopover() { if (this.popover) { /** @type {?} */ const popoverElement = this.popover.location.nativeElement.children[1]; /** @type {?} */ const popoverPosition = Positioning.getPositionElements(this._elm.nativeElement, popoverElement, this.positionMap(this.placement) || this._defaultOptions.placement, this.appendToBody || this._defaultOptions.appendToBody); if (this.placement === 'landScape') { this._renderer.setStyle(popoverElement, 'top', `${popoverPosition.top}px`); this._renderer.setStyle(popoverElement, 'left', `0px`); this._renderer.setStyle(popoverElement, 'width', `${window.innerWidth}px`); this._renderer.setStyle(popoverElement, 'max-height', `${window.innerHeight - popoverPosition.height}px`); } else if (this.placement === 'fullScreen') { this._renderer.setStyle(popoverElement, 'top', `${0}px`); this._renderer.setStyle(popoverElement, 'left', `0px`); this._renderer.setStyle(popoverElement, 'width', `${window.innerWidth}px`); this._renderer.setStyle(popoverElement, 'max-height', `${window.innerHeight - popoverPosition.height}px`); } else { this._renderer.setStyle(popoverElement, 'top', `${popoverPosition.top}px`); this._renderer.setStyle(popoverElement, 'left', `${popoverPosition.left}px`); } } } /** * @private * @return {?} */ hidePopover() { if (this.popover) { this.popover.destroy(); delete this.popover; this.onVisibleChange.emit(false); this._eventListeners.forEach((/** * @param {?} fn * @return {?} */ fn => fn())); this._eventListeners = []; } } } PopoverDirective.decorators = [ { type: Directive, args: [{ selector: '[Popover], [nzm-popover]', providers: [PopoverOptions] },] } ]; /** @nocollapse */ PopoverDirective.ctorParameters = () => [ { type: ViewContainerRef }, { type: ElementRef }, { type: PopoverOptions }, { type: ComponentFactoryResolver }, { type: Renderer2 } ]; PopoverDirective.propDecorators = { mask: [{ type: Input }], showArrow: [{ type: Input }], visible: [{ type: Input }], placement: [{ type: Input }], overlay: [{ type: Input }], onVisibleChange: [{ type: Output }], onSelect: [{ type: Output }], appendToBody: [{ type: Input }], className: [{ type: Input }], autoClose: [{ type: Input }], togglePopover: [{ type: HostListener, args: ['click',] }] }; if (false) { /** @type {?} */ PopoverDirective.prototype.popover; /** * @type {?} * @private */ PopoverDirective.prototype._eventListeners; /** @type {?} */ PopoverDirective.prototype.mask; /** @type {?} */ PopoverDirective.prototype.showArrow; /** @type {?} */ PopoverDirective.prototype.visible; /** @type {?} */ PopoverDirective.prototype.placement; /** @type {?} */ PopoverDirective.prototype.overlay; /** @type {?} */ PopoverDirective.prototype.onVisibleChange; /** @type {?} */ PopoverDirective.prototype.onSelect; /** @type {?} */ PopoverDirective.prototype.appendToBody; /** @type {?} */ PopoverDirective.prototype.className; /** @type {?} */ PopoverDirective.prototype.autoClose; /** * @type {?} * @private */ PopoverDirective.prototype._viewContainerRef; /** * @type {?} * @private */ PopoverDirective.prototype._elm; /** * @type {?} * @private */ PopoverDirective.prototype._defaultOptions; /** * @type {?} * @private */ PopoverDirective.prototype._cfr; /** * @type {?} * @private */ PopoverDirective.prototype._renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInBvcG92ZXIvcG9wb3Zlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osWUFBWSxFQUNaLGdCQUFnQixFQUdoQixVQUFVLEVBRVYsUUFBUSxFQUNSLHdCQUF3QixFQUN4QixTQUFTLEVBQ1QsV0FBVyxFQUlaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMvRSxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBTXJELE1BQU0sT0FBTyxnQkFBZ0I7Ozs7Ozs7O0lBbUMzQixZQUNVLGlCQUFtQyxFQUNuQyxJQUFnQixFQUNoQixlQUErQixFQUMvQixJQUE4QixFQUM5QixTQUFvQjtRQUpwQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQy9CLFNBQUksR0FBSixJQUFJLENBQTBCO1FBQzlCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFyQ3RCLG9CQUFlLEdBQXNCLEVBQUUsQ0FBQztRQWFoRCxvQkFBZSxHQUEwQixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoRSxhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUF1QjlDLENBQUM7Ozs7SUFkSixhQUFhO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO2FBQU07WUFDTCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDOzs7OztJQVVELFdBQVcsQ0FBQyxTQUFTO1FBQ25CLFFBQVEsU0FBUyxFQUFFO1lBQ2pCLEtBQUssU0FBUztnQkFDWixPQUFPLFVBQVUsQ0FBQztZQUNwQixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxXQUFXLENBQUM7WUFDckIsS0FBSyxZQUFZO2dCQUNmLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLEtBQUssYUFBYTtnQkFDaEIsT0FBTyxjQUFjLENBQUM7WUFDeEIsS0FBSyxTQUFTO2dCQUNaLE9BQU8sVUFBVSxDQUFDO1lBQ3BCLEtBQUssWUFBWTtnQkFDZixPQUFPLGFBQWEsQ0FBQztZQUN2QixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxXQUFXLENBQUM7WUFDckIsS0FBSyxhQUFhO2dCQUNoQixPQUFPLGNBQWMsQ0FBQztZQUN4QixLQUFLLFlBQVksQ0FBQztZQUNsQixLQUFLLFdBQVc7Z0JBQ2QsT0FBTyxRQUFRLENBQUM7WUFDbEI7Z0JBQ0UsT0FBTyxTQUFTLENBQUM7U0FDcEI7SUFDSCxDQUFDOzs7O0lBRUQsUUFBUSxLQUFVLENBQUM7Ozs7O0lBRW5CLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDbkQsVUFBVTs7O1lBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNO1lBQ0wsVUFBVTs7O1lBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7U0FDUDtJQUNILENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7OztJQUVPLGVBQWUsQ0FBQyxLQUFZO1FBQ2xDLElBQ0UsSUFBSSxDQUFDLE9BQU87WUFDWixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQy9DLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQzNEO1lBQ0EsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQzs7Ozs7SUFFTyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2pCLFVBQVU7OztZQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsZUFBZSxHQUFHO29CQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsT0FBTzs7OztvQkFBRSxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBQztvQkFDekYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVU7Ozs7b0JBQUUsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUM7b0JBQzVGLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFROzs7b0JBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFDO2lCQUN4RSxDQUFDO1lBQ0osQ0FBQyxFQUFDLENBQUM7O2tCQUVHLE9BQU8sR0FBRyxJQUFJLHVCQUF1QixFQUFFO1lBQzdDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNuQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUMzQyxXQUFXOzs7O2dCQUFFLENBQUMsS0FBSyxFQUFRLEVBQUU7b0JBQzNCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsQ0FBQyxDQUFBO2dCQUNELGVBQWU7OztnQkFBRSxHQUFTLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7MEJBQ2pCLFFBQVEsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRO29CQUN4RixJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUN2QixpQkFBaUI7d0JBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUN4QyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQ3hCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FDMUIsT0FBTzs7OzRCQUNQLEdBQUcsRUFBRTtnQ0FDSCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7b0NBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29DQUNoQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7d0NBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQ0FDcEI7aUNBQ0Y7NEJBQ0gsQ0FBQyxHQUNELEtBQUssQ0FDTixDQUFDO3lCQUNIO3FCQUNGO2dCQUNILENBQUMsQ0FBQTthQUNGLENBQUMsQ0FBQzs7a0JBRUcsY0FBYyxHQUFrQztnQkFDcEQsTUFBTTtnQkFDTixXQUFXO2dCQUNYLFdBQVc7Z0JBQ1gsY0FBYztnQkFDZCxTQUFTO2dCQUNULFdBQVc7Z0JBQ1gsV0FBVzthQUNaO1lBQ0QsY0FBYyxDQUFDLE9BQU87Ozs7WUFBQyxLQUFLLENBQUMsRUFBRTtnQkFDN0IsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxXQUFXLEVBQUU7b0JBQ3RDLENBQUMsbUJBQUEsT0FBTyxFQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3ZDO1lBQ0gsQ0FBQyxFQUFDLENBQUM7O2tCQUVHLGdCQUFnQixHQUF1QyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDOztrQkFDMUcsYUFBYSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQ25DO2dCQUNFO29CQUNFLE9BQU8sRUFBRSx1QkFBdUI7b0JBQ2hDLFFBQVEsRUFBRSxPQUFPO2lCQUNsQjthQUNGLEVBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FDdEM7WUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQ25ELGdCQUFnQixFQUNoQixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUM3QixhQUFhLENBQ2QsQ0FBQztZQUNGLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtnQkFDeEIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDaEU7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7Ozs7O0lBRU8sZUFBZTtRQUNyQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7O2tCQUNWLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzs7a0JBQ2hFLGVBQWUsR0FBRyxXQUFXLENBQUMsbUJBQW1CLENBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUN2QixjQUFjLEVBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQ2xFLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQ3ZEO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFdBQVcsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxHQUFHLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO2FBQzNHO2lCQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO2FBQzNHO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsR0FBRyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO2FBQzlFO1NBQ0Y7SUFDSCxDQUFDOzs7OztJQUVPLFdBQVc7UUFDakIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTzs7OztZQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztTQUMzQjtJQUNILENBQUM7OztZQXBORixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtnQkFDcEMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQzVCOzs7O1lBckJDLGdCQUFnQjtZQUdoQixVQUFVO1lBV0gsY0FBYztZQVJyQix3QkFBd0I7WUFDeEIsU0FBUzs7O21CQW9CUixLQUFLO3dCQUVMLEtBQUs7c0JBRUwsS0FBSzt3QkFFTCxLQUFLO3NCQUVMLEtBQUs7OEJBRUwsTUFBTTt1QkFFTixNQUFNOzJCQUVOLEtBQUs7d0JBRUwsS0FBSzt3QkFFTCxLQUFLOzRCQUdMLFlBQVksU0FBQyxPQUFPOzs7O0lBekJyQixtQ0FBd0M7Ozs7O0lBRXhDLDJDQUFnRDs7SUFFaEQsZ0NBQ2M7O0lBQ2QscUNBQ21COztJQUNuQixtQ0FDaUI7O0lBQ2pCLHFDQUNrQjs7SUFDbEIsbUNBQzBCOztJQUMxQiwyQ0FDZ0U7O0lBQ2hFLG9DQUNpRDs7SUFDakQsd0NBQ3NCOztJQUN0QixxQ0FDa0I7O0lBQ2xCLHFDQUNtQjs7Ozs7SUFZakIsNkNBQTJDOzs7OztJQUMzQyxnQ0FBd0I7Ozs7O0lBQ3hCLDJDQUF1Qzs7Ozs7SUFDdkMsZ0NBQXNDOzs7OztJQUN0QyxxQ0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBDb21wb25lbnRSZWYsXG4gIE9uRGVzdHJveSxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBJbmplY3RvcixcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBDb21wb25lbnRGYWN0b3J5LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnLi9wb3BvdmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQb3BvdmVyT3B0aW9ucyB9IGZyb20gJy4vcG9wb3Zlci1vcHRpb25zLnByb3ZpZGVyJztcbmltcG9ydCB7IFBvcG92ZXJDb21wb25lbnRPcHRpb25zIH0gZnJvbSAnLi9wb3BvdmVyLWNvbXBvbmVudC1vcHRpb25zLnByb3ZpZGVyJztcbmltcG9ydCAqIGFzIFBvc2l0aW9uaW5nIGZyb20gJy4uL2NvcmUvdXRpbC9wb3NpdGlvbic7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tQb3BvdmVyXSwgW256bS1wb3BvdmVyXScsXG4gIHByb3ZpZGVyczogW1BvcG92ZXJPcHRpb25zXVxufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHBvcG92ZXI6IENvbXBvbmVudFJlZjxQb3BvdmVyQ29tcG9uZW50PjtcblxuICBwcml2YXRlIF9ldmVudExpc3RlbmVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICBASW5wdXQoKVxuICBtYXNrOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBzaG93QXJyb3c6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHZpc2libGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHBsYWNlbWVudDogc3RyaW5nO1xuICBASW5wdXQoKVxuICBvdmVybGF5OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAT3V0cHV0KClcbiAgb25WaXNpYmxlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpO1xuICBAT3V0cHV0KClcbiAgb25TZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBASW5wdXQoKVxuICBhcHBlbmRUb0JvZHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIGNsYXNzTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBhdXRvQ2xvc2U6IGJvb2xlYW47XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICB0b2dnbGVQb3BvdmVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb3BvdmVyKSB7XG4gICAgICB0aGlzLnNob3dQb3BvdmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgX2VsbTogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIF9kZWZhdWx0T3B0aW9uczogUG9wb3Zlck9wdGlvbnMsXG4gICAgcHJpdmF0ZSBfY2ZyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgcG9zaXRpb25NYXAocGxhY2VtZW50KTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgICAgY2FzZSAndG9wTGVmdCc6XG4gICAgICAgIHJldHVybiAndG9wLWxlZnQnO1xuICAgICAgY2FzZSAndG9wUmlnaHQnOlxuICAgICAgICByZXR1cm4gJ3RvcC1yaWdodCc7XG4gICAgICBjYXNlICdib3R0b21MZWZ0JzpcbiAgICAgICAgcmV0dXJuICdib3R0b20tbGVmdCc7XG4gICAgICBjYXNlICdib3R0b21SaWdodCc6XG4gICAgICAgIHJldHVybiAnYm90dG9tLXJpZ2h0JztcbiAgICAgIGNhc2UgJ2xlZnRUb3AnOlxuICAgICAgICByZXR1cm4gJ2xlZnQtdG9wJztcbiAgICAgIGNhc2UgJ2xlZnRCb3R0b20nOlxuICAgICAgICByZXR1cm4gJ2xlZnQtYm90dG9tJztcbiAgICAgIGNhc2UgJ3JpZ2h0VG9wJzpcbiAgICAgICAgcmV0dXJuICdyaWdodC10b3AnO1xuICAgICAgY2FzZSAncmlnaHRCb3R0b20nOlxuICAgICAgICByZXR1cm4gJ3JpZ2h0LWJvdHRvbSc7XG4gICAgICBjYXNlICdmdWxsU2NyZWVuJzpcbiAgICAgIGNhc2UgJ2xhbmRTY2FwZSc6XG4gICAgICAgIHJldHVybiAnYm90dG9tJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBwbGFjZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy52aXNpYmxlICYmIGNoYW5nZXMudmlzaWJsZS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dQb3BvdmVyKCk7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMucG9wb3ZlciAmJlxuICAgICAgIXRoaXMuX2VsbS5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICF0aGlzLnBvcG92ZXIubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpXG4gICAgKSB7XG4gICAgICB0aGlzLmhpZGVQb3BvdmVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93UG9wb3ZlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucG9wb3Zlcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzID0gW1xuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAnY2xpY2snLCAoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLm9uRG9jdW1lbnRDbGljayhldmVudCkpLFxuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAndG91Y2hlbmQnLCAoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLm9uRG9jdW1lbnRDbGljayhldmVudCkpLFxuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ3Jlc2l6ZScsICgpID0+IHRoaXMucG9zaXRpb25Qb3BvdmVyKCkpXG4gICAgICAgIF07XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IG5ldyBQb3BvdmVyQ29tcG9uZW50T3B0aW9ucygpO1xuICAgICAgb3B0aW9ucy5wbGFjZW1lbnQgPSB0aGlzLnBsYWNlbWVudDtcbiAgICAgIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgdGhpcy5fZGVmYXVsdE9wdGlvbnMsIHtcbiAgICAgICAgaGlkZVBvcG92ZXI6IChldmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25BZnRlclZpZXdJbml0OiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5wb3NpdGlvblBvcG92ZXIoKTtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FtLXBvcG92ZXItaW5uZXItd3JhcHBlcicpWzBdLmNoaWxkcmVuO1xuICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyDpppblhYjmiJHku6zmo4Dmn6XlroPmmK/lkKbljIXlkKvlrZDoioLngrlcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW5baV0uaWQgPSBgJHtpfWA7XG4gICAgICAgICAgICAgIGNoaWxkcmVuW2ldLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgJ2NsaWNrJyxcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0LmVtaXQoY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hdXRvQ2xvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVQb3BvdmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3B0aW9uYWxQYXJhbXM6IEFycmF5PGtleW9mIFBvcG92ZXJEaXJlY3RpdmU+ID0gW1xuICAgICAgICAnbWFzaycsXG4gICAgICAgICdzaG93QXJyb3cnLFxuICAgICAgICAncGxhY2VtZW50JyxcbiAgICAgICAgJ2FwcGVuZFRvQm9keScsXG4gICAgICAgICdvdmVybGF5JyxcbiAgICAgICAgJ2NsYXNzTmFtZScsXG4gICAgICAgICdhdXRvQ2xvc2UnXG4gICAgICBdO1xuICAgICAgb3B0aW9uYWxQYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpc1twYXJhbV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgKG9wdGlvbnMgYXMgYW55KVtwYXJhbV0gPSB0aGlzW3BhcmFtXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8UG9wb3ZlckNvbXBvbmVudD4gPSB0aGlzLl9jZnIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoUG9wb3ZlckNvbXBvbmVudCk7XG4gICAgICBjb25zdCBjaGlsZEluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogUG9wb3ZlckNvbXBvbmVudE9wdGlvbnMsXG4gICAgICAgICAgICB1c2VWYWx1ZTogb3B0aW9uc1xuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5wYXJlbnRJbmplY3RvclxuICAgICAgKTtcbiAgICAgIHRoaXMucG9wb3ZlciA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgICBjb21wb25lbnRGYWN0b3J5LFxuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmxlbmd0aCxcbiAgICAgICAgY2hpbGRJbmplY3RvclxuICAgICAgKTtcbiAgICAgIGlmIChvcHRpb25zLmFwcGVuZFRvQm9keSkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMucG9wb3Zlci5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvblBvcG92ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9wb3Zlcikge1xuICAgICAgY29uc3QgcG9wb3ZlckVsZW1lbnQgPSB0aGlzLnBvcG92ZXIubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jaGlsZHJlblsxXTtcbiAgICAgIGNvbnN0IHBvcG92ZXJQb3NpdGlvbiA9IFBvc2l0aW9uaW5nLmdldFBvc2l0aW9uRWxlbWVudHMoXG4gICAgICAgIHRoaXMuX2VsbS5uYXRpdmVFbGVtZW50LFxuICAgICAgICBwb3BvdmVyRWxlbWVudCxcbiAgICAgICAgdGhpcy5wb3NpdGlvbk1hcCh0aGlzLnBsYWNlbWVudCkgfHwgdGhpcy5fZGVmYXVsdE9wdGlvbnMucGxhY2VtZW50LFxuICAgICAgICB0aGlzLmFwcGVuZFRvQm9keSB8fCB0aGlzLl9kZWZhdWx0T3B0aW9ucy5hcHBlbmRUb0JvZHlcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5wbGFjZW1lbnQgPT09ICdsYW5kU2NhcGUnKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAndG9wJywgYCR7cG9wb3ZlclBvc2l0aW9uLnRvcH1weGApO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShwb3BvdmVyRWxlbWVudCwgJ2xlZnQnLCBgMHB4YCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAnd2lkdGgnLCBgJHt3aW5kb3cuaW5uZXJXaWR0aH1weGApO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShwb3BvdmVyRWxlbWVudCwgJ21heC1oZWlnaHQnLCBgJHt3aW5kb3cuaW5uZXJIZWlnaHQgLSBwb3BvdmVyUG9zaXRpb24uaGVpZ2h0fXB4YCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGxhY2VtZW50ID09PSAnZnVsbFNjcmVlbicpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUocG9wb3ZlckVsZW1lbnQsICd0b3AnLCBgJHswfXB4YCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAnbGVmdCcsIGAwcHhgKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUocG9wb3ZlckVsZW1lbnQsICd3aWR0aCcsIGAke3dpbmRvdy5pbm5lcldpZHRofXB4YCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAnbWF4LWhlaWdodCcsIGAke3dpbmRvdy5pbm5lckhlaWdodCAtIHBvcG92ZXJQb3NpdGlvbi5oZWlnaHR9cHhgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAndG9wJywgYCR7cG9wb3ZlclBvc2l0aW9uLnRvcH1weGApO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShwb3BvdmVyRWxlbWVudCwgJ2xlZnQnLCBgJHtwb3BvdmVyUG9zaXRpb24ubGVmdH1weGApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGlkZVBvcG92ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9wb3Zlcikge1xuICAgICAgdGhpcy5wb3BvdmVyLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnBvcG92ZXI7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLmZvckVhY2goZm4gPT4gZm4oKSk7XG4gICAgICB0aGlzLl9ldmVudExpc3RlbmVycyA9IFtdO1xuICAgIH1cbiAgfVxufVxuIl19