UNPKG

ngx-dropdown-menu-search

Version:
281 lines (272 loc) 30.8 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/forms')) : typeof define === 'function' && define.amd ? define('ngx-dropdown-menu-search', ['exports', '@angular/core', '@angular/common', '@angular/forms'], factory) : (factory((global['ngx-dropdown-menu-search'] = {}),global.ng.core,global.ng.common,global.ng.forms)); }(this, (function (exports,core,common,forms) { 'use strict'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var NgxDropdownMenuSearchComponent = (function () { function NgxDropdownMenuSearchComponent() { this.onDropdownClick = new core.EventEmitter(); this.onOptionSelect = new core.EventEmitter(); } /** * @return {?} */ NgxDropdownMenuSearchComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.heightAndLineHeight = { 'height': this.config ? this.config.height : '20px', 'line-height': this.config ? this.config.lineHeight : '20px' }; }; /** * @return {?} */ NgxDropdownMenuSearchComponent.prototype.dropdownClick = /** * @return {?} */ function () { var _this = this; if (this.config && !this.config.isDisabled) { this.optionsVisible = true; this.onDropdownClick.emit(); //automatically select hidden input so we can quickly find an item setTimeout(function () { return _this.hiddenSearchInput.nativeElement.select(); }, 10); } }; /** * @param {?} event * @param {?} term * @return {?} */ NgxDropdownMenuSearchComponent.prototype.onInputChange = /** * @param {?} event * @param {?} term * @return {?} */ function (event, term) { var _this = this; /** @type {?} */ var lowerCaseTerm = term.toLocaleLowerCase(); /** @type {?} */ var foundOption = this.options.find(function (option) { if (option.name) { return _this.includes(option.name.toLocaleLowerCase(), lowerCaseTerm); } }); this.scrollToFoundOption(foundOption); this.selectOptionOnEnterClick(event, foundOption); }; /** * @param {?} option * @param {?} name * @return {?} */ NgxDropdownMenuSearchComponent.prototype.onOptionClick = /** * @param {?} option * @param {?} name * @return {?} */ function (option, name) { this.selectedOption = name; this.optionsVisible = false; this.onOptionSelect.emit(option); }; /** * @param {?} event * @return {?} */ NgxDropdownMenuSearchComponent.prototype.autoCloseDropdown = /** * @param {?} event * @return {?} */ function (event) { if (!event.target.closest(".dropdown")) { this.optionsVisible = false; } }; /** * @param {?} container * @param {?} value * @return {?} */ NgxDropdownMenuSearchComponent.prototype.includes = /** * @param {?} container * @param {?} value * @return {?} */ function (container, value) { if (container) { /** @type {?} */ var includesValue = void 0; /** @type {?} */ var index = container.indexOf(value); if (index >= 0) { includesValue = true; } return includesValue; } }; /** * @param {?} foundOption * @return {?} */ NgxDropdownMenuSearchComponent.prototype.scrollToFoundOption = /** * @param {?} foundOption * @return {?} */ function (foundOption) { if (foundOption) { this.element = document.getElementById(foundOption.name); this.element.scrollIntoView(); } }; /** * @param {?} event * @param {?} foundOption * @return {?} */ NgxDropdownMenuSearchComponent.prototype.selectOptionOnEnterClick = /** * @param {?} event * @param {?} foundOption * @return {?} */ function (event, foundOption) { if (event.keyCode === 13) { this.optionsVisible = false; this.onOptionClick(foundOption, this.element.id); } }; NgxDropdownMenuSearchComponent.decorators = [ { type: core.Component, args: [{ selector: 'ngx-dropdown-menu-search', template: "<div class=\"ht0 dropdown relative\" (window:mouseup)=\"autoCloseDropdown($event)\">\n\t<div [ngStyle]=\"heightAndLineHeight\" *ngIf=\"!config?.searchEnabled || (config?.searchEnabled && !optionsVisible)\" [ngClass]=\"{'disabled' : config?.isDisabled, 'cursorClass' : !config?.isDisabled, 'gray-border-darker' : !errorVisible, 'red-border-light' : errorVisible}\" (click)=\"dropdownClick()\" class=\"dropdown-label setBorder border-radius in-block setPadding\">\n\t\t<span class=\"in-block setMargin ellipsis\">{{selectedOption}}</span>\n\t\t<span [style.line-height]=\"config?.lineHeight\" class=\"chevron-down-icon ft-size18\"></span>\n\t</div>\n\n\t<input [ngStyle]=\"heightAndLineHeight\" [(ngModel)]=\"searchTerm\" *ngIf=\"optionsVisible && config?.searchEnabled\" (click)=\"optionsVisible = true\" class=\"dropdown setPadding setWidth100 border-radius gray-border-darker setBorder\" type=\"text\" placeholder=\"Search\">\n\n\t<div *ngIf=\"optionsVisible\" style=\"width: 100%\" [ngClass]=\"{'bottom0' : config?.flow === 'up'}\" class=\"setMaxHeight scrollable mgn-bottom text-left shadow absolute z white-bg setZ border mgn-bottom50 gray-border-darker border-radius setPaddingTopBottom\" id=\"{{config?.scrollbarVisible ? 'scrollbar-style' : null}}\">\n\t\t<ul *ngFor=\"let option of options | searchFilter:searchTerm; let i = index\">\n\t\t\t<li [ngClass]=\"{'gray-bg' : option.name === element?.id}\" (mouseup)=\"onOptionClick(option, option.name)\" id=\"{{option.name}}\" class=\"option cursorClass\">{{option.name}}<i *ngIf=\"option.name === selectedOption\" class=\"fa fa-check mgn-left10\" aria-hidden=\"true\"></i></li>\n\t\t</ul>\n\t</div>\n\t<input *ngIf=\"optionsVisible\" #hiddenSearchInput type=\"text\" class=\"hidden-search\" (keyup)=\"onInputChange($event, hiddenSearchInput.value)\">\n</div>", styles: ["input:focus{outline:0}.dropdown-label{background-color:#fff;width:100%;position:relative}.bottom0{bottom:0}.chevron-down-icon{display:inline-block;width:8px;height:8px;border-bottom:1px solid #98999a;border-right:1px solid #98999a;position:absolute;right:.625em;top:50%;-webkit-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg)}.gray-border-darker{border-color:#bbc0c3}.cursorClass{cursor:pointer}.hidden-search{position:absolute;width:50%;left:0;top:35px}.ft-size18{font-size:1.125rem}.absolute{position:absolute}.setPaddingTopBottom{padding-top:.063rem;padding-bottom:.063rem}.right10{right:.625rem;top:.5rem}.ellipsis{width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.setPadding{padding-left:.5rem;padding-right:.5rem}.shadow{box-shadow:0 .125em .313em 0 rgba(0,0,0,.16),0 .125em .625em 0 rgba(0,0,0,.12)}.z{z-index:99}.white-bg{background-color:#fff}.setMargin{margin:0}.scrollable{overflow-y:scroll;overflow-x:hidden;-webkit-overflow-scrolling:touch}#scrollbar-style::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3);border-radius:10px;background-color:#f6f8f8}#scrollbar-style::-webkit-scrollbar{width:5px;background-color:#f6f8f8}#scrollbar-style::-webkit-scrollbar-thumb{border-radius:10px;-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3);background-color:#d6d9db}.mgn-bottom50{margin-bottom:3.125rem}.text-left{text-align:left}.setMaxHeight{max-height:14rem}.setLeft90{left:90%}.setWidth100{width:100%}.mgn-left10{margin-left:.625rem}.relative{position:relative}.border-radius{border-radius:.25em}.in-block{display:inline-block}.setPaddingLeft{padding-left:60px!important}.setPaddingLeft26{padding-left:26px!important}.option:hover{background-color:#e6e8e9}.setWidth50{width:50%}ul{padding-left:0;margin:0}ul li{padding-left:.5rem;padding-top:.2rem;padding-bottom:.2rem}.setBorder{border-width:1px;border-style:solid}.setZ{z-index:300}"] },] }, ]; /** @nocollapse */ NgxDropdownMenuSearchComponent.ctorParameters = function () { return []; }; NgxDropdownMenuSearchComponent.propDecorators = { errorVisible: [{ type: core.Input }], options: [{ type: core.Input }], selectedOption: [{ type: core.Input }], config: [{ type: core.Input }], onDropdownClick: [{ type: core.Output }], onOptionSelect: [{ type: core.Output }], hiddenSearchInput: [{ type: core.ViewChild, args: ['hiddenSearchInput',] }] }; return NgxDropdownMenuSearchComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var SearchFilterPipe = (function () { function SearchFilterPipe() { } //take in any data array, filter it against user input (term) /** * @param {?} items * @param {?} term * @return {?} */ SearchFilterPipe.prototype.transform = /** * @param {?} items * @param {?} term * @return {?} */ function (items, term) { var _this = this; if (term === undefined) return items; /** @type {?} */ var filteredItems = items.filter(function (item) { for (var property in item) { if (property === "ItemContent") { // (item.ItemContent.Title + item.ItemContent.Body).toString().toLowerCase().includes(term.toLowerCase()); return _this.includes((item.ItemContent.Title + item.ItemContent.Body).toString().toLowerCase(), term.toLowerCase()); } if (item[property] === (undefined)) { continue; } if (item[property]) { // item[property].toString().toLowerCase().includes(term.toLowerCase()) if (_this.includes(item[property].toString().toLowerCase(), term.toLowerCase())) { return true; } } } return false; }); return filteredItems; }; /** * @param {?} container * @param {?} value * @return {?} */ SearchFilterPipe.prototype.includes = /** * @param {?} container * @param {?} value * @return {?} */ function (container, value) { if (container) { /** @type {?} */ var includesValue = void 0; /** @type {?} */ var index = container.indexOf(value); if (index >= 0) { includesValue = true; } return includesValue; } }; SearchFilterPipe.decorators = [ { type: core.Pipe, args: [{ name: 'searchFilter', pure: false },] }, ]; /** @nocollapse */ SearchFilterPipe.ctorParameters = function () { return []; }; return SearchFilterPipe; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var NgxDropdownMenuSearchModule = (function () { function NgxDropdownMenuSearchModule() { } NgxDropdownMenuSearchModule.decorators = [ { type: core.NgModule, args: [{ imports: [ common.CommonModule, forms.FormsModule ], declarations: [NgxDropdownMenuSearchComponent, SearchFilterPipe], exports: [NgxDropdownMenuSearchComponent, SearchFilterPipe] },] }, ]; return NgxDropdownMenuSearchModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ exports.NgxDropdownMenuSearchComponent = NgxDropdownMenuSearchComponent; exports.NgxDropdownMenuSearchModule = NgxDropdownMenuSearchModule; exports.ɵa = SearchFilterPipe; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRyb3Bkb3duLW1lbnUtc2VhcmNoLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LWRyb3Bkb3duLW1lbnUtc2VhcmNoL2xpYi9uZ3gtZHJvcGRvd24tbWVudS1zZWFyY2guY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZHJvcGRvd24tbWVudS1zZWFyY2gvbGliL3NlYXJjaC1maWx0ZXIucGlwZS50cyIsIm5nOi8vbmd4LWRyb3Bkb3duLW1lbnUtc2VhcmNoL2xpYi9uZ3gtZHJvcGRvd24tbWVudS1zZWFyY2gubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUNvbmZpZyB9IGZyb20gJy4vY29uZmlnLm1vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LWRyb3Bkb3duLW1lbnUtc2VhcmNoJyxcbiAgICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJodDAgZHJvcGRvd24gcmVsYXRpdmVcIiAod2luZG93Om1vdXNldXApPVwiYXV0b0Nsb3NlRHJvcGRvd24oJGV2ZW50KVwiPlxuXHQ8ZGl2IFtuZ1N0eWxlXT1cImhlaWdodEFuZExpbmVIZWlnaHRcIiAqbmdJZj1cIiFjb25maWc/LnNlYXJjaEVuYWJsZWQgfHwgKGNvbmZpZz8uc2VhcmNoRW5hYmxlZCAmJiAhb3B0aW9uc1Zpc2libGUpXCIgW25nQ2xhc3NdPVwieydkaXNhYmxlZCcgOiBjb25maWc/LmlzRGlzYWJsZWQsICdjdXJzb3JDbGFzcycgOiAhY29uZmlnPy5pc0Rpc2FibGVkLCAnZ3JheS1ib3JkZXItZGFya2VyJyA6ICFlcnJvclZpc2libGUsICdyZWQtYm9yZGVyLWxpZ2h0JyA6IGVycm9yVmlzaWJsZX1cIiAgKGNsaWNrKT1cImRyb3Bkb3duQ2xpY2soKVwiIGNsYXNzPVwiZHJvcGRvd24tbGFiZWwgc2V0Qm9yZGVyIGJvcmRlci1yYWRpdXMgaW4tYmxvY2sgc2V0UGFkZGluZ1wiPlxuXHRcdDxzcGFuIGNsYXNzPVwiaW4tYmxvY2sgc2V0TWFyZ2luIGVsbGlwc2lzXCI+e3tzZWxlY3RlZE9wdGlvbn19PC9zcGFuPlxuXHRcdDxzcGFuIFtzdHlsZS5saW5lLWhlaWdodF09XCJjb25maWc/LmxpbmVIZWlnaHRcIiBjbGFzcz1cImNoZXZyb24tZG93bi1pY29uIGZ0LXNpemUxOFwiPjwvc3Bhbj5cblx0PC9kaXY+XG5cblx0PGlucHV0IFtuZ1N0eWxlXT1cImhlaWdodEFuZExpbmVIZWlnaHRcIiBbKG5nTW9kZWwpXT1cInNlYXJjaFRlcm1cIiAqbmdJZj1cIm9wdGlvbnNWaXNpYmxlICYmIGNvbmZpZz8uc2VhcmNoRW5hYmxlZFwiIChjbGljayk9XCJvcHRpb25zVmlzaWJsZSA9IHRydWVcIiBjbGFzcz1cImRyb3Bkb3duIHNldFBhZGRpbmcgc2V0V2lkdGgxMDAgYm9yZGVyLXJhZGl1cyBncmF5LWJvcmRlci1kYXJrZXIgc2V0Qm9yZGVyXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiPlxuXG5cdDxkaXYgKm5nSWY9XCJvcHRpb25zVmlzaWJsZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIiBbbmdDbGFzc109XCJ7J2JvdHRvbTAnIDogY29uZmlnPy5mbG93ID09PSAndXAnfVwiIGNsYXNzPVwic2V0TWF4SGVpZ2h0IHNjcm9sbGFibGUgbWduLWJvdHRvbSB0ZXh0LWxlZnQgc2hhZG93IGFic29sdXRlIHogd2hpdGUtYmcgc2V0WiBib3JkZXIgbWduLWJvdHRvbTUwIGdyYXktYm9yZGVyLWRhcmtlciBib3JkZXItcmFkaXVzIHNldFBhZGRpbmdUb3BCb3R0b21cIiBpZD1cInt7Y29uZmlnPy5zY3JvbGxiYXJWaXNpYmxlID8gJ3Njcm9sbGJhci1zdHlsZScgOiBudWxsfX1cIj5cblx0XHQ8dWwgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zIHwgc2VhcmNoRmlsdGVyOnNlYXJjaFRlcm07IGxldCBpID0gaW5kZXhcIj5cblx0XHRcdDxsaSBbbmdDbGFzc109XCJ7J2dyYXktYmcnIDogb3B0aW9uLm5hbWUgPT09IGVsZW1lbnQ/LmlkfVwiIChtb3VzZXVwKT1cIm9uT3B0aW9uQ2xpY2sob3B0aW9uLCBvcHRpb24ubmFtZSlcIiBpZD1cInt7b3B0aW9uLm5hbWV9fVwiICBjbGFzcz1cIm9wdGlvbiBjdXJzb3JDbGFzc1wiPnt7b3B0aW9uLm5hbWV9fTxpICpuZ0lmPVwib3B0aW9uLm5hbWUgPT09IHNlbGVjdGVkT3B0aW9uXCIgY2xhc3M9XCJmYSBmYS1jaGVjayBtZ24tbGVmdDEwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvbGk+XG5cdFx0PC91bD5cblx0PC9kaXY+XG5cdDxpbnB1dCAqbmdJZj1cIm9wdGlvbnNWaXNpYmxlXCIgI2hpZGRlblNlYXJjaElucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJoaWRkZW4tc2VhcmNoXCIgKGtleXVwKT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50LCBoaWRkZW5TZWFyY2hJbnB1dC52YWx1ZSlcIj5cbjwvZGl2PmAsXG4gICAgc3R5bGVzOiBbYGlucHV0OmZvY3Vze291dGxpbmU6MH0uZHJvcGRvd24tbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZmZmO3dpZHRoOjEwMCU7cG9zaXRpb246cmVsYXRpdmV9LmJvdHRvbTB7Ym90dG9tOjB9LmNoZXZyb24tZG93bi1pY29ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjhweDtoZWlnaHQ6OHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICM5ODk5OWE7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjOTg5OTlhO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi42MjVlbTt0b3A6NTAlOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoNDVkZWcpfS5ncmF5LWJvcmRlci1kYXJrZXJ7Ym9yZGVyLWNvbG9yOiNiYmMwYzN9LmN1cnNvckNsYXNze2N1cnNvcjpwb2ludGVyfS5oaWRkZW4tc2VhcmNoe3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjUwJTtsZWZ0OjA7dG9wOjM1cHh9LmZ0LXNpemUxOHtmb250LXNpemU6MS4xMjVyZW19LmFic29sdXRle3Bvc2l0aW9uOmFic29sdXRlfS5zZXRQYWRkaW5nVG9wQm90dG9te3BhZGRpbmctdG9wOi4wNjNyZW07cGFkZGluZy1ib3R0b206LjA2M3JlbX0ucmlnaHQxMHtyaWdodDouNjI1cmVtO3RvcDouNXJlbX0uZWxsaXBzaXN7d2lkdGg6OTAlO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uc2V0UGFkZGluZ3twYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0uc2hhZG93e2JveC1zaGFkb3c6MCAuMTI1ZW0gLjMxM2VtIDAgcmdiYSgwLDAsMCwuMTYpLDAgLjEyNWVtIC42MjVlbSAwIHJnYmEoMCwwLDAsLjEyKX0uent6LWluZGV4Ojk5fS53aGl0ZS1iZ3tiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LnNldE1hcmdpbnttYXJnaW46MH0uc2Nyb2xsYWJsZXtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbjstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0jc2Nyb2xsYmFyLXN0eWxlOjotd2Via2l0LXNjcm9sbGJhci10cmFja3std2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAwIDZweCByZ2JhKDAsMCwwLC4zKTtib3JkZXItcmFkaXVzOjEwcHg7YmFja2dyb3VuZC1jb2xvcjojZjZmOGY4fSNzY3JvbGxiYXItc3R5bGU6Oi13ZWJraXQtc2Nyb2xsYmFye3dpZHRoOjVweDtiYWNrZ3JvdW5kLWNvbG9yOiNmNmY4Zjh9I3Njcm9sbGJhci1zdHlsZTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7Ym9yZGVyLXJhZGl1czoxMHB4Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDAgNnB4IHJnYmEoMCwwLDAsLjMpO2JhY2tncm91bmQtY29sb3I6I2Q2ZDlkYn0ubWduLWJvdHRvbTUwe21hcmdpbi1ib3R0b206My4xMjVyZW19LnRleHQtbGVmdHt0ZXh0LWFsaWduOmxlZnR9LnNldE1heEhlaWdodHttYXgtaGVpZ2h0OjE0cmVtfS5zZXRMZWZ0OTB7bGVmdDo5MCV9LnNldFdpZHRoMTAwe3dpZHRoOjEwMCV9Lm1nbi1sZWZ0MTB7bWFyZ2luLWxlZnQ6LjYyNXJlbX0ucmVsYXRpdmV7cG9zaXRpb246cmVsYXRpdmV9LmJvcmRlci1yYWRpdXN7Ym9yZGVyLXJhZGl1czouMjVlbX0uaW4tYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2t9LnNldFBhZGRpbmdMZWZ0e3BhZGRpbmctbGVmdDo2MHB4IWltcG9ydGFudH0uc2V0UGFkZGluZ0xlZnQyNntwYWRkaW5nLWxlZnQ6MjZweCFpbXBvcnRhbnR9Lm9wdGlvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlNmU4ZTl9LnNldFdpZHRoNTB7d2lkdGg6NTAlfXVse3BhZGRpbmctbGVmdDowO21hcmdpbjowfXVsIGxpe3BhZGRpbmctbGVmdDouNXJlbTtwYWRkaW5nLXRvcDouMnJlbTtwYWRkaW5nLWJvdHRvbTouMnJlbX0uc2V0Qm9yZGVye2JvcmRlci13aWR0aDoxcHg7Ym9yZGVyLXN0eWxlOnNvbGlkfS5zZXRae3otaW5kZXg6MzAwfWBdXG59KVxuZXhwb3J0IGNsYXNzIE5neERyb3Bkb3duTWVudVNlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBlcnJvclZpc2libGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgb3B0aW9uczogYW55W107XG4gICAgQElucHV0KCkgc2VsZWN0ZWRPcHRpb246IGFueTtcbiAgICBASW5wdXQoKSBjb25maWc6IElDb25maWc7XG5cbiAgICBAT3V0cHV0KCkgb25Ecm9wZG93bkNsaWNrOiBFdmVudEVtaXR0ZXIgPCBhbnkgPiA9IG5ldyBFdmVudEVtaXR0ZXIgPCBhbnkgPiAoKTtcbiAgICBAT3V0cHV0KCkgb25PcHRpb25TZWxlY3Q6IEV2ZW50RW1pdHRlciA8IGFueSA+ID0gbmV3IEV2ZW50RW1pdHRlciA8IGFueSA+ICgpO1xuXG4gICAgQFZpZXdDaGlsZCgnaGlkZGVuU2VhcmNoSW5wdXQnKSBoaWRkZW5TZWFyY2hJbnB1dDogRWxlbWVudFJlZjtcblxuICAgIHB1YmxpYyBlbGVtZW50OiBhbnk7XG4gICAgcHVibGljIGhlaWdodEFuZExpbmVIZWlnaHQ6IGFueTtcbiAgICBwdWJsaWMgb3B0aW9uc1Zpc2libGU6IGJvb2xlYW47XG4gICAgcHVibGljIHNlYXJjaFRlcm06IHN0cmluZztcblxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0QW5kTGluZUhlaWdodCA9IHtcbiAgICAgICAgICAgICdoZWlnaHQnOiB0aGlzLmNvbmZpZyA/IHRoaXMuY29uZmlnLmhlaWdodCA6ICcyMHB4JyxcbiAgICAgICAgICAgICdsaW5lLWhlaWdodCc6IHRoaXMuY29uZmlnID8gdGhpcy5jb25maWcubGluZUhlaWdodCA6ICcyMHB4J1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRyb3Bkb3duQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiAhdGhpcy5jb25maWcuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9uRHJvcGRvd25DbGljay5lbWl0KCk7XG4gICAgICAgICAgICAvL2F1dG9tYXRpY2FsbHkgc2VsZWN0IGhpZGRlbiBpbnB1dCBzbyB3ZSBjYW4gcXVpY2tseSBmaW5kIGFuIGl0ZW1cbiAgICAgICAgICAgIHNldFRpbWVvdXQoICgpID0+IHRoaXMuaGlkZGVuU2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3QoKSwgMTApOyBcbiAgICAgICAgfSBcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbnB1dENoYW5nZShldmVudCwgdGVybTogc3RyaW5nKTogdm9pZCB7XG4gICAgICBsZXQgbG93ZXJDYXNlVGVybSA9IHRlcm0udG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgIGxldCBmb3VuZE9wdGlvbiA9ICB0aGlzLm9wdGlvbnMuZmluZCggKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYob3B0aW9uLm5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZXMob3B0aW9uLm5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSwgbG93ZXJDYXNlVGVybSk7ICBcbiAgICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgICB9KTtcbiAgICAgIHRoaXMuc2Nyb2xsVG9Gb3VuZE9wdGlvbihmb3VuZE9wdGlvbik7ICAgICBcbiAgICAgIHRoaXMuc2VsZWN0T3B0aW9uT25FbnRlckNsaWNrKGV2ZW50LCBmb3VuZE9wdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIG9uT3B0aW9uQ2xpY2sob3B0aW9uOiBhbnksIG5hbWU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gbmFtZTtcbiAgICAgICAgdGhpcy5vcHRpb25zVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uT3B0aW9uU2VsZWN0LmVtaXQob3B0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXV0b0Nsb3NlRHJvcGRvd24oZXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudC50YXJnZXQuY2xvc2VzdChcIi5kcm9wZG93blwiKSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNsdWRlcyhjb250YWluZXI6IGFueSwgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgaWYoY29udGFpbmVyKSB7XG4gICAgICAgIGxldCBpbmNsdWRlc1ZhbHVlOiBib29sZWFuO1xuICAgICAgICBsZXQgaW5kZXg6IG51bWJlciA9IGNvbnRhaW5lci5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgaWYoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgaW5jbHVkZXNWYWx1ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluY2x1ZGVzVmFsdWU7XG4gICAgICB9ICAgICAgXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY3JvbGxUb0ZvdW5kT3B0aW9uKGZvdW5kT3B0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmKGZvdW5kT3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3VuZE9wdGlvbi5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zY3JvbGxJbnRvVmlldygpOyAgICAgICAgICBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0T3B0aW9uT25FbnRlckNsaWNrKGV2ZW50LCBmb3VuZE9wdGlvbik6IHZvaWQge1xuICAgICAgICBpZihldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5vbk9wdGlvbkNsaWNrKGZvdW5kT3B0aW9uLCB0aGlzLmVsZW1lbnQuaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbiIsImltcG9ydCB7IFBpcGVUcmFuc2Zvcm0sIFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG5AUGlwZSh7XG5cdG5hbWU6ICdzZWFyY2hGaWx0ZXInLFxuXHRwdXJlOiBmYWxzZVxufSlcblxuXG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hGaWx0ZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cblx0Y29uc3RydWN0b3IoKSB7fVxuXG5cdC8vdGFrZSBpbiBhbnkgZGF0YSBhcnJheSwgZmlsdGVyIGl0IGFnYWluc3QgdXNlciBpbnB1dCAodGVybSlcblx0dHJhbnNmb3JtKGl0ZW1zOiBhbnksIHRlcm06IGFueSk6IGFueSB7XG5cblx0ICAgIGlmICh0ZXJtID09PSB1bmRlZmluZWQpIHJldHVybiBpdGVtcztcblxuXHQgICAgbGV0IGZpbHRlcmVkSXRlbXMgPSAgaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG5cblx0ICAgICAgZm9yKGxldCBwcm9wZXJ0eSBpbiBpdGVtKXtcblxuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gXCJJdGVtQ29udGVudFwiKXtcblx0XHRcdFx0XHRcdC8vIChpdGVtLkl0ZW1Db250ZW50LlRpdGxlICsgaXRlbS5JdGVtQ29udGVudC5Cb2R5KS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKTtcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmluY2x1ZGVzKChpdGVtLkl0ZW1Db250ZW50LlRpdGxlICsgaXRlbS5JdGVtQ29udGVudC5Cb2R5KS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCksIHRlcm0udG9Mb3dlckNhc2UoKSk7XG5cdFx0XHRcdFx0fVxuXHQgICAgICAgIGlmIChpdGVtW3Byb3BlcnR5XSA9PT0gKG51bGwgfHwgdW5kZWZpbmVkKSl7XG5cdCAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYoaXRlbVtwcm9wZXJ0eV0pIHtcblx0ICAgICAgICBcdC8vIGl0ZW1bcHJvcGVydHldLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtLnRvTG93ZXJDYXNlKCkpXHQgICAgICAgIFx0XG5cdCAgICAgICAgXHRpZih0aGlzLmluY2x1ZGVzKGl0ZW1bcHJvcGVydHldLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSwgdGVybS50b0xvd2VyQ2FzZSgpKSkge1xuXHQgICAgICAgIFx0ICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICBcdH1cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfSk7XHQgICAgXG5cdCAgICByZXR1cm4gZmlsdGVyZWRJdGVtcztcblx0ICB9XG5cblx0ICBwcml2YXRlIGluY2x1ZGVzKGNvbnRhaW5lcjogYW55LCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdCAgICBpZihjb250YWluZXIpIHtcblx0ICAgICAgbGV0IGluY2x1ZGVzVmFsdWU6IGJvb2xlYW47XG5cdCAgICAgIGxldCBpbmRleDogbnVtYmVyID0gY29udGFpbmVyLmluZGV4T2YodmFsdWUpO1xuXHQgICAgICBpZihpbmRleCA+PSAwKSB7XG5cdCAgICAgICAgICBpbmNsdWRlc1ZhbHVlID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gaW5jbHVkZXNWYWx1ZTtcblx0ICAgIH0gICAgICBcblx0ICB9XG5cbn1cblxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTmd4RHJvcGRvd25NZW51U2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnLi9uZ3gtZHJvcGRvd24tbWVudS1zZWFyY2guY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaEZpbHRlclBpcGUgfSBmcm9tICcuL3NlYXJjaC1maWx0ZXIucGlwZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgXHRcdENvbW1vbk1vZHVsZSxcbiAgXHRcdEZvcm1zTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW05neERyb3Bkb3duTWVudVNlYXJjaENvbXBvbmVudCwgU2VhcmNoRmlsdGVyUGlwZV0sXG4gIGV4cG9ydHM6IFtOZ3hEcm9wZG93bk1lbnVTZWFyY2hDb21wb25lbnQsIFNlYXJjaEZpbHRlclBpcGVdXG59KVxuZXhwb3J0IGNsYXNzIE5neERyb3Bkb3duTWVudVNlYXJjaE1vZHVsZSB7IH1cbiJdLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJDb21wb25lbnQiLCJJbnB1dCIsIk91dHB1dCIsIlZpZXdDaGlsZCIsIlBpcGUiLCJOZ01vZHVsZSIsIkNvbW1vbk1vZHVsZSIsIkZvcm1zTW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7UUF3Q0k7bUNBWGtELElBQUlBLGlCQUFZLEVBQVc7a0NBQzVCLElBQUlBLGlCQUFZLEVBQVc7U0FXM0U7Ozs7UUFFRCxpREFBUTs7O1lBQVI7Z0JBQ0ksSUFBSSxDQUFDLG1CQUFtQixHQUFHO29CQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNO29CQUNuRCxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNO2lCQUMvRCxDQUFBO2FBQ0o7Ozs7UUFFTSxzREFBYTs7Ozs7Z0JBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO29CQUN4QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztvQkFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7b0JBRTVCLFVBQVUsQ0FBRSxjQUFNLE9BQUEsS0FBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsR0FBQSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2lCQUN4RTs7Ozs7OztRQUdFLHNEQUFhOzs7OztzQkFBQyxLQUFLLEVBQUUsSUFBWTs7O2dCQUN0QyxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Z0JBQzdDLElBQUksV0FBVyxHQUFJLElBQUksQ0FBQyxPQUFP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