@stratio/egeo
Version:
493 lines • 39.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/st-search/st-search.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* © 2017 Stratio Big Data Inc., Sucursal en España.
*
* This software is licensed under the Apache License, Version 2.0.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the terms of the License for more details.
*
* SPDX-License-Identifier: Apache-2.0.
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild } from '@angular/core';
import { FormControl } from '@angular/forms';
import { EventWindowManager } from '../utils/event-window-manager';
import { debounceTime } from 'rxjs/operators';
import { StSearchEventOrigin } from './st-search.model';
/**
* \@description {Component} [Search]
*
* The search component has been designed to allow user to find a specific content according to his needs.
*
* \@example
*
* {html}
*
* ```
* Search without filters
* <st-search [placeholder]="placeholder" [qaTag]="qaTag"
* [value]="searched" [debounce]="debounceTime" [minLength]="minLength"
* (search)="onSearchResult($event)"></st-search>
*
*
* Search with filters
* <st-search [placeholder]="placeholder" [qaTag]="qaTag"
* [value]="searched" [debounce]="debounceTime" [minLength]="minLength" [filterOptions]="[
* { label: 'All', value: 1 },
* { label: 'Type ', value: 2 },
* { label: 'Color', value: 3 }
* ]" (search)="onSearchResult($event)"></st-search>
* ```
*
*/
export class StSearchComponent extends EventWindowManager {
/**
* @param {?} _render
* @param {?} cd
*/
constructor(_render, cd) {
super(_render, cd);
this._render = _render;
this.cd = cd;
/**
* \@Input {number} [debounce=0] Time elapsed in milliseconds before displaying the autocomplete list
*/
this.debounce = 0;
/**
* \@Input {boolean} [liveSearch=true] Boolean to enable or disable the automatic search while the user is typing
*/
this.liveSearch = true;
/**
* \@Input {number} [minLength=0] Minimum of characters typed by the user before launching the search
*/
this.minLength = 0;
/**
* \@Input {string} [placeholder='Search'] Text displayed in the search input
*/
this.placeholder = 'Search';
/**
* \@Input {boolean} [disabled=false] Boolean to enable or disable the search
*/
this.disabled = false;
/**
* \@Input {boolean} [withAutocomplete=false] Enable or disable the autocomplete list when user is typing
*/
this.withAutocomplete = false;
/**
* \@Input {StDropDownMenuItem[]} [autocompleteList=''] List of items displayed in the autocomplete list when user is typing
*/
this.autocompleteList = [];
/**
* \@Input {boolean} [showIcon=true] Boolean to hide/show the loupe icon
*/
this.showIcon = true;
/**
* \@Input {string} [emptyAutocompleteListMessage=''] Message displayed when the autocomplete list is enabled but
* there are not any item with the typed text
*/
this.emptyAutocompleteListMessage = '';
/**
* \@Output { Object(filter?: string, text: string)} [search=''] Event emitted when search is launched. It contains
* the text typed by the user and the filter value selected (only if filter is displayed)
*/
this.search = new EventEmitter();
/**
* \@Output {any} [value=''] Event emitted when filter is changed. It contains
* the filter value selected
*/
this.selectFilter = new EventEmitter();
/**
* \@Input {boolean} [keyBoardMove=false] It is needed to activate navigation through options using the keyboard
*/
this.keyBoardMove = false;
this.searchBox = new FormControl();
this.subscriptionSearch = undefined;
this.subscriptionSearchClearButton = undefined;
this.lastEmittedText = undefined;
}
/**
* @return {?}
*/
get menuId() {
return this.qaTag ? this.qaTag + '-autocomplete-menu' : null;
}
/**
* @return {?}
*/
ngOnInit() {
if (this.value) {
this.searchBox.setValue(this.value);
}
// Show clear button if have text
this.subscriptionSearchClearButton = this.searchBox.valueChanges.subscribe((/**
* @param {?} val
* @return {?}
*/
(val) => this.showClear = (val && val.length > 0)));
this.checkDisabled();
this.manageSubscription();
if (this.filterOptions) {
this.filter = this.filterOptions[0].value;
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
this.checkDebounceChange(changes);
this.checkValueChange(changes);
this.checkDisableChange(changes);
this.checkAutoCompleteMenuChange(changes);
}
/**
* @param {?} value
* @return {?}
*/
onChangeFilter(value) {
this.selectFilter.emit(value);
this.emitValue(false, StSearchEventOrigin.FILTER);
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.subscriptionSearch !== undefined) {
this.subscriptionSearch.unsubscribe();
}
if (this.subscriptionSearchClearButton !== undefined) {
this.subscriptionSearchClearButton.unsubscribe();
}
this.closeElement();
}
/**
* @param {?} force
* @param {?} origin
* @return {?}
*/
launchSearch(force, origin) {
if (this.canSearch()) {
this.showAutoCompleteMenu();
this.emitValue(force, origin);
}
else {
this.closeElement();
}
}
/**
* @param {?} event
* @return {?}
*/
onKeyPress(event) {
/** @type {?} */
let key = event.keyCode || event.which;
if (key === 13) {
this.launchSearch(true, StSearchEventOrigin.ENTER);
}
}
/**
* @param {?} item
* @return {?}
*/
changeOption(item) {
if (item && item.label) {
this.subscriptionSearch.unsubscribe();
this.searchBox.setValue(item.value);
this.cd.markForCheck();
this.closeElement();
this.emitValue(true, StSearchEventOrigin.LIST);
this.manageSubscription();
}
}
/**
* @return {?}
*/
clearInput() {
this.searchBox.setValue('');
this.closeElement();
this.emitValue(true, StSearchEventOrigin.INPUT);
}
/**
* @return {?}
*/
showAutoCompleteMenu() {
if (this.withAutocomplete && !this.isActive) {
this.openElement();
}
if (this.searchBox.value === '') {
this.closeElement();
}
this.cd.markForCheck();
}
/**
* @private
* @param {?} force
* @param {?} origin
* @return {?}
*/
emitValue(force, origin) {
if (this.isEqualPrevious(force)) {
this.lastEmittedText = this.searchBox.value;
/** @type {?} */
let newSearch = { text: this.lastEmittedText || '', origin: origin };
if (this.filter) {
newSearch.filter = this.filter;
}
this.search.emit(newSearch);
}
}
/**
* @private
* @return {?}
*/
checkDisabled() {
if (this.disabled) {
this.searchBox.disable();
}
else {
this.searchBox.enable();
}
}
/**
* @private
* @return {?}
*/
canSearch() {
return this.isDefined() && !this.disabled && this.checkMins();
}
/**
* @private
* @return {?}
*/
isDefined() {
return this.searchBox && this.searchBox.value !== null && this.searchBox.value !== undefined;
}
/**
* @private
* @return {?}
*/
checkMins() {
return this.minLength <= (this.searchBox && this.searchBox.value && this.searchBox.value.length) ||
this.searchBox.value.trim().length === 0;
}
/**
* @private
* @param {?} force
* @return {?}
*/
isEqualPrevious(force) {
return this.lastEmittedText !== this.searchBox.value || force;
}
/**
* @private
* @param {?} changes
* @return {?}
*/
checkValueChange(changes) {
if (changes && changes.value) {
if (this.subscriptionSearch) {
this.subscriptionSearch.unsubscribe();
}
this.searchBox.setValue(changes.value.currentValue);
this.manageSubscription();
}
}
/**
* @private
* @param {?} changes
* @return {?}
*/
checkDebounceChange(changes) {
if (changes && changes.debounce) {
this.manageSubscription();
}
}
/**
* @private
* @param {?} changes
* @return {?}
*/
checkDisableChange(changes) {
if (changes && changes.disabled) {
this.checkDisabled();
}
}
/**
* @private
* @param {?} changes
* @return {?}
*/
checkAutoCompleteMenuChange(changes) {
if (changes && changes.autocompleteList) {
this.cd.markForCheck();
}
}
/**
* @private
* @return {?}
*/
manageSubscription() {
if (this.subscriptionSearch !== undefined) {
this.subscriptionSearch.unsubscribe();
}
if (this.liveSearch) {
this.subscriptionSearch = this.searchBox
.valueChanges.pipe(debounceTime(this.debounce))
.subscribe((/**
* @param {?} event
* @return {?}
*/
(event) => this.launchSearch(false, StSearchEventOrigin.INPUT)));
}
}
}
StSearchComponent.decorators = [
{ type: Component, args: [{
selector: 'st-search',
template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<div class=\"st-search sth-search\">\n <st-select\n *ngIf=\"filterOptions && filterOptions.length > 0\"\n [options]=\"filterOptions\"\n [(ngModel)]=\"filter\"\n [disabled]=\"disabled\"\n name=\"search-filter\"\n (select)=\"onChangeFilter($event)\"\n class=\"sth-search-filter st-search-filter\"\n [ngClass]=\"{'disabled': disabled}\"\n ></st-select>\n\n <st-dropdown-menu [items]=\"autocompleteList\" [attr.id]=\"menuId\" class=\"st-search-box\" (change)=\"changeOption($event)\"\n [active]=\"isActive && (autocompleteList && autocompleteList.length || emptyAutocompleteListMessage !== '')\"\n [placement]=\"'bottom-start'\" [emptyListMessage]=\"emptyAutocompleteListMessage\"\n [keyBoardMove]=\"keyBoardMove\">\n <div #buttonId>\n <input [attr.id]=\"qaTag\" [formControl]=\"searchBox\" [placeholder]=\"placeholder\" (keypress)=\"onKeyPress($event)\"\n (focus)=\"showAutoCompleteMenu()\"\n class=\"st-search-input sth-search-input\"/>\n <i class=\"st-search-icon sth-search-icon sth-search-icon--search\" tabindex=\"0\" *ngIf=\"!showClear && showIcon\"></i>\n <i class=\"st-search-icon sth-search-icon sth-search-icon--clear\" tabindex=\"0\" *ngIf=\"showClear\" (mousedown)=\"clearInput()\"\n (keyup.enter)=\"clearInput()\"></i>\n </div>\n </st-dropdown-menu>\n\n</div>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: ["@charset \"UTF-8\";input{outline:0;border:none;padding:0;height:40px}.st-search{position:relative;display:flex;min-width:100%}.st-search :invalid{box-shadow:none}.st-search-box{display:flex;flex:2 0}.st-search-input{padding-left:12px;padding-right:40px;width:100%}.st-search-filter{flex:auto 1;height:40px;padding:0;max-width:37%}.st-search-icon{position:absolute;right:10px;top:0;cursor:pointer}.st-search-icon:focus{outline:0}"]
}] }
];
/** @nocollapse */
StSearchComponent.ctorParameters = () => [
{ type: Renderer2 },
{ type: ChangeDetectorRef }
];
StSearchComponent.propDecorators = {
debounce: [{ type: Input }],
liveSearch: [{ type: Input }],
minLength: [{ type: Input }],
placeholder: [{ type: Input }],
qaTag: [{ type: Input }],
value: [{ type: Input }],
disabled: [{ type: Input }],
withAutocomplete: [{ type: Input }],
autocompleteList: [{ type: Input }],
showIcon: [{ type: Input }],
emptyAutocompleteListMessage: [{ type: Input }],
filterOptions: [{ type: Input }],
search: [{ type: Output }],
selectFilter: [{ type: Output }],
keyBoardMove: [{ type: Input }],
_eventElementRef: [{ type: ViewChild, args: ['buttonId', { static: false },] }]
};
if (false) {
/**
* \@Input {number} [debounce=0] Time elapsed in milliseconds before displaying the autocomplete list
* @type {?}
*/
StSearchComponent.prototype.debounce;
/**
* \@Input {boolean} [liveSearch=true] Boolean to enable or disable the automatic search while the user is typing
* @type {?}
*/
StSearchComponent.prototype.liveSearch;
/**
* \@Input {number} [minLength=0] Minimum of characters typed by the user before launching the search
* @type {?}
*/
StSearchComponent.prototype.minLength;
/**
* \@Input {string} [placeholder='Search'] Text displayed in the search input
* @type {?}
*/
StSearchComponent.prototype.placeholder;
/**
* \@Input {string} [qaTag=''] Label used as id
* @type {?}
*/
StSearchComponent.prototype.qaTag;
/**
* \@Input {string} [value=''] Initial value of the search text
* @type {?}
*/
StSearchComponent.prototype.value;
/**
* \@Input {boolean} [disabled=false] Boolean to enable or disable the search
* @type {?}
*/
StSearchComponent.prototype.disabled;
/**
* \@Input {boolean} [withAutocomplete=false] Enable or disable the autocomplete list when user is typing
* @type {?}
*/
StSearchComponent.prototype.withAutocomplete;
/**
* \@Input {StDropDownMenuItem[]} [autocompleteList=''] List of items displayed in the autocomplete list when user is typing
* @type {?}
*/
StSearchComponent.prototype.autocompleteList;
/**
* \@Input {boolean} [showIcon=true] Boolean to hide/show the loupe icon
* @type {?}
*/
StSearchComponent.prototype.showIcon;
/**
* \@Input {string} [emptyAutocompleteListMessage=''] Message displayed when the autocomplete list is enabled but
* there are not any item with the typed text
* @type {?}
*/
StSearchComponent.prototype.emptyAutocompleteListMessage;
/**
* \@Input {StDropDownMenuItem[]} [filterOptions=''] Options displayed at the filter select. If it is not introduced,
* filter will not be displayed
* @type {?}
*/
StSearchComponent.prototype.filterOptions;
/**
* \@Output { Object(filter?: string, text: string)} [search=''] Event emitted when search is launched. It contains
* the text typed by the user and the filter value selected (only if filter is displayed)
* @type {?}
*/
StSearchComponent.prototype.search;
/**
* \@Output {any} [value=''] Event emitted when filter is changed. It contains
* the filter value selected
* @type {?}
*/
StSearchComponent.prototype.selectFilter;
/**
* \@Input {boolean} [keyBoardMove=false] It is needed to activate navigation through options using the keyboard
* @type {?}
*/
StSearchComponent.prototype.keyBoardMove;
/** @type {?} */
StSearchComponent.prototype.searchBox;
/** @type {?} */
StSearchComponent.prototype.showClear;
/** @type {?} */
StSearchComponent.prototype.filter;
/** @type {?} */
StSearchComponent.prototype._eventElementRef;
/**
* @type {?}
* @private
*/
StSearchComponent.prototype.subscriptionSearch;
/**
* @type {?}
* @private
*/
StSearchComponent.prototype.subscriptionSearchClearButton;
/**
* @type {?}
* @private
*/
StSearchComponent.prototype.lastEmittedText;
/**
* @type {?}
* @private
*/
StSearchComponent.prototype._render;
/**
* @type {?}
* @private
*/
StSearchComponent.prototype.cd;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdHJhdGlvL2VnZW8vIiwic291cmNlcyI6WyJsaWIvc3Qtc2VhcmNoL3N0LXNlYXJjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsT0FBTyxFQUNKLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFpQixtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQ3ZFLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxrQkFBa0I7Ozs7O0lBZ0V0RCxZQUFvQixPQUFrQixFQUNsQixFQUFxQjtRQUN0QyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRkYsWUFBTyxHQUFQLE9BQU8sQ0FBVztRQUNsQixPQUFFLEdBQUYsRUFBRSxDQUFtQjs7OztRQS9EaEMsYUFBUSxHQUFXLENBQUMsQ0FBQzs7OztRQUdyQixlQUFVLEdBQVksSUFBSSxDQUFDOzs7O1FBRzNCLGNBQVMsR0FBVyxDQUFDLENBQUM7Ozs7UUFHdEIsZ0JBQVcsR0FBVyxRQUFRLENBQUM7Ozs7UUFTL0IsYUFBUSxHQUFZLEtBQUssQ0FBQzs7OztRQUcxQixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7Ozs7UUFHbEMscUJBQWdCLEdBQXlCLEVBQUUsQ0FBQzs7OztRQUc1QyxhQUFRLEdBQWEsSUFBSSxDQUFD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QUU1RSwrQ0FBaUU7Ozs7O0lBQ2pFLDBEQUE0RTs7Ozs7SUFDNUUsNENBQXdEOzs7OztJQUU1QyxvQ0FBMEI7Ozs7O0lBQzFCLCtCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiDCqSAyMDE3IFN0cmF0aW8gQmlnIERhdGEgSW5jLiwgU3VjdXJzYWwgZW4gRXNwYcOxYS5cbiAqXG4gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZO1xuICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiAqIFNlZSB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMC5cbiAqL1xuaW1wb3J0IHtcbiAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICBDb21wb25lbnQsXG4gICBFbGVtZW50UmVmLFxuICAgRXZlbnRFbWl0dGVyLFxuICAgSW5wdXQsXG4gICBPbkNoYW5nZXMsXG4gICBPbkRlc3Ryb3ksXG4gICBPbkluaXQsXG4gICBPdXRwdXQsXG4gICBSZW5kZXJlcjIsXG4gICBTaW1wbGVDaGFuZ2VzLFxuICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU3REcm9wRG93bk1lbnVJdGVtIH0gZnJvbSAnLi4vc3QtZHJvcGRvd24tbWVudS9zdC1kcm9wZG93bi1tZW51LmludGVyZmFjZSc7XG5pbXBvcnQgeyBFdmVudFdpbmRvd01hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC13aW5kb3ctbWFuYWdlcic7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdFNlYXJjaEV2ZW50LCBTdFNlYXJjaEV2ZW50T3JpZ2luIH0gZnJvbSAnLi9zdC1zZWFyY2gubW9kZWwnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiB7Q29tcG9uZW50fSBbU2VhcmNoXVxuICpcbiAqIFRoZSBzZWFyY2ggY29tcG9uZW50IGhhcyBiZWVuIGRlc2lnbmVkIHRvIGFsbG93IHVzZXIgdG8gZmluZCBhIHNwZWNpZmljIGNvbnRlbnQgYWNjb3JkaW5nIHRvIGhpcyBuZWVkcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIHtodG1sfVxuICpcbiAqIGBgYFxuICogU2VhcmNoIHdpdGhvdXQgZmlsdGVyc1xuICogIDxzdC1zZWFyY2ggW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW3FhVGFnXT1cInFhVGFnXCJcbiAqICBbdmFsdWVdPVwic2VhcmNoZWRcIiBbZGVib3VuY2VdPVwiZGVib3VuY2VUaW1lXCIgW21pbkxlbmd0aF09XCJtaW5MZW5ndGhcIlxuICogIChzZWFyY2gpPVwib25TZWFyY2hSZXN1bHQoJGV2ZW50KVwiPjwvc3Qtc2VhcmNoPlxuICpcbiAqXG4gKiBTZWFyY2ggd2l0aCBmaWx0ZXJzXG4gKiAgPHN0LXNlYXJjaCBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbcWFUYWddPVwicWFUYWdcIlxuICogIFt2YWx1ZV09XCJzZWFyY2hlZFwiIFtkZWJvdW5jZV09XCJkZWJvdW5jZVRpbWVcIiBbbWluTGVuZ3RoXT1cIm1pbkxlbmd0aFwiIFtmaWx0ZXJPcHRpb25zXT1cIltcbiAqICB7IGxhYmVsOiAnQWxsJywgdmFsdWU6IDEgfSxcbiAqICB7IGxhYmVsOiAnVHlwZSAnLCB2YWx1ZTogMiB9LFxuICogIHsgbGFiZWw6ICdDb2xvcicsIHZhbHVlOiAzIH1cbiAqICBdXCIgKHNlYXJjaCk9XCJvblNlYXJjaFJlc3VsdCgkZXZlbnQpXCI+PC9zdC1zZWFyY2g+XG4gKiBgYGBcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICAgc2VsZWN0b3I6ICdzdC1zZWFyY2gnLFxuICAgdGVtcGxhdGVVcmw6ICcuL3N0LXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICBzdHlsZVVybHM6IFsnLi9zdC1zZWFyY2guY29tcG9uZW50LnNjc3MnXSxcbiAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFN0U2VhcmNoQ29tcG9uZW50IGV4dGVuZHMgRXZlbnRXaW5kb3dNYW5hZ2VyIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gICAvKiogQElucHV0IHtudW1iZXJ9IFtkZWJvdW5jZT0wXSBUaW1lIGVsYXBzZWQgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBhdXRvY29tcGxldGUgbGlzdCAqL1xuICAgQElucHV0KCkgZGVib3VuY2U6IG51bWJlciA9IDA7XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtsaXZlU2VhcmNoPXRydWVdIEJvb2xlYW4gdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBzZWFyY2ggd2hpbGUgdGhlIHVzZXIgaXMgdHlwaW5nICovXG4gICBASW5wdXQoKSBsaXZlU2VhcmNoOiBib29sZWFuID0gdHJ1ZTtcblxuICAgLyoqIEBJbnB1dCB7bnVtYmVyfSBbbWluTGVuZ3RoPTBdIE1pbmltdW0gb2YgY2hhcmFjdGVycyB0eXBlZCBieSB0aGUgdXNlciBiZWZvcmUgbGF1bmNoaW5nIHRoZSBzZWFyY2ggKi9cbiAgIEBJbnB1dCgpIG1pbkxlbmd0aDogbnVtYmVyID0gMDtcblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbcGxhY2Vob2xkZXI9J1NlYXJjaCddIFRleHQgZGlzcGxheWVkIGluIHRoZSBzZWFyY2ggaW5wdXQgKi9cbiAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoJztcblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbcWFUYWc9JyddIExhYmVsIHVzZWQgYXMgaWQgKi9cbiAgIEBJbnB1dCgpIHFhVGFnOiBzdHJpbmc7XG5cbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW3ZhbHVlPScnXSBJbml0aWFsIHZhbHVlIG9mIHRoZSBzZWFyY2ggdGV4dCAqL1xuICAgQElucHV0KCkgdmFsdWU6IHN0cmluZztcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW2Rpc2FibGVkPWZhbHNlXSBCb29sZWFuIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzZWFyY2ggKi9cbiAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFt3aXRoQXV0b2NvbXBsZXRlPWZhbHNlXSBFbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b2NvbXBsZXRlIGxpc3Qgd2hlbiB1c2VyIGlzIHR5cGluZyAqL1xuICAgQElucHV0KCkgd2l0aEF1dG9jb21wbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAvKiogQElucHV0IHtTdERyb3BEb3duTWVudUl0ZW1bXX0gW2F1dG9jb21wbGV0ZUxpc3Q9JyddIExpc3Qgb2YgaXRlbXMgZGlzcGxheWVkIGluIHRoZSBhdXRvY29tcGxldGUgbGlzdCB3aGVuIHVzZXIgaXMgdHlwaW5nICovXG4gICBASW5wdXQoKSBhdXRvY29tcGxldGVMaXN0OiBTdERyb3BEb3duTWVudUl0ZW1bXSA9IFtdO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbc2hvd0ljb249dHJ1ZV0gQm9vbGVhbiB0byBoaWRlL3Nob3cgdGhlIGxvdXBlIGljb24gKi9cbiAgIEBJbnB1dCgpIHNob3dJY29uOiBib29sZWFuID0gIHRydWU7XG5cbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW2VtcHR5QXV0b2NvbXBsZXRlTGlzdE1lc3NhZ2U9JyddIE1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gdGhlIGF1dG9jb21wbGV0ZSBsaXN0IGlzIGVuYWJsZWQgYnV0XG4gICAgKiB0aGVyZSBhcmUgbm90IGFueSBpdGVtIHdpdGggdGhlIHR5cGVkIHRleHRcbiAgICAqL1xuICAgQElucHV0KCkgZW1wdHlBdXRvY29tcGxldGVMaXN0TWVzc2FnZTogc3RyaW5nID0gJyc7XG5cbiAgIC8qKiBASW5wdXQge1N0RHJvcERvd25NZW51SXRlbVtdfSBbZmlsdGVyT3B0aW9ucz0nJ10gT3B0aW9ucyBkaXNwbGF5ZWQgYXQgdGhlIGZpbHRlciBzZWxlY3QuIElmIGl0IGlzIG5vdCBpbnRyb2R1Y2VkLFxuICAgICogZmlsdGVyIHdpbGwgbm90IGJlIGRpc3BsYXllZFxuICAgICovXG4gICBASW5wdXQoKSBmaWx0ZXJPcHRpb25zOiBTdERyb3BEb3duTWVudUl0ZW1bXTtcblxuICAgLyoqIEBPdXRwdXQgeyBPYmplY3QoZmlsdGVyPzogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpfSBbc2VhcmNoPScnXSBFdmVudCBlbWl0dGVkIHdoZW4gc2VhcmNoIGlzIGxhdW5jaGVkLiBJdCBjb250YWluc1xuICAgICogdGhlIHRleHQgdHlwZWQgYnkgdGhlIHVzZXIgYW5kIHRoZSBmaWx0ZXIgdmFsdWUgc2VsZWN0ZWQgKG9ubHkgaWYgZmlsdGVyIGlzIGRpc3BsYXllZClcbiAgICAqL1xuICAgQE91dHB1dCgpIHNlYXJjaDogRXZlbnRFbWl0dGVyPFN0U2VhcmNoRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxTdFNlYXJjaEV2ZW50PigpO1xuXG4gICAvKiogQE91dHB1dCB7YW55fSBbdmFsdWU9JyddIEV2ZW50IGVtaXR0ZWQgd2hlbiBmaWx0ZXIgaXMgY2hhbmdlZC4gSXQgY29udGFpbnNcbiAgICAqIHRoZSBmaWx0ZXIgdmFsdWUgc2VsZWN0ZWRcbiAgICAqL1xuICAgQE91dHB1dCgpIHNlbGVjdEZpbHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW2tleUJvYXJkTW92ZT1mYWxzZV0gSXQgaXMgbmVlZGVkIHRvIGFjdGl2YXRlIG5hdmlnYXRpb24gdGhyb3VnaCBvcHRpb25zIHVzaW5nIHRoZSBrZXlib2FyZFxuICAgICovXG4gICBASW5wdXQoKSBrZXlCb2FyZE1vdmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgcHVibGljIHNlYXJjaEJveDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgIHB1YmxpYyBzaG93Q2xlYXI6IGJvb2xlYW47XG4gICBwdWJsaWMgZmlsdGVyOiBzdHJpbmc7XG4gICBAVmlld0NoaWxkKCdidXR0b25JZCcsIHtzdGF0aWM6IGZhbHNlfSkgcHVibGljIF9ldmVudEVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG5cbiAgIHByaXZhdGUgc3Vic2NyaXB0aW9uU2VhcmNoOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICBwcml2YXRlIHN1YnNjcmlwdGlvblNlYXJjaENsZWFyQnV0dG9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICBwcml2YXRlIGxhc3RFbWl0dGVkVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yZW5kZXI6IFJlbmRlcmVyMixcbiAgICAgICAgICAgICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgICBzdXBlcihfcmVuZGVyLCBjZCk7XG4gICB9XG5cbiAgIGdldCBtZW51SWQoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLnFhVGFnID8gdGhpcy5xYVRhZyArICctYXV0b2NvbXBsZXRlLW1lbnUnIDogbnVsbDtcbiAgIH1cblxuICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LnNldFZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgICAgLy8gU2hvdyBjbGVhciBidXR0b24gaWYgaGF2ZSB0ZXh0XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvblNlYXJjaENsZWFyQnV0dG9uID0gdGhpcy5zZWFyY2hCb3gudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsKSA9PiB0aGlzLnNob3dDbGVhciA9ICh2YWwgJiYgdmFsLmxlbmd0aCA+IDApKTtcbiAgICAgIHRoaXMuY2hlY2tEaXNhYmxlZCgpO1xuICAgICAgdGhpcy5tYW5hZ2VTdWJzY3JpcHRpb24oKTtcbiAgICAgIGlmICh0aGlzLmZpbHRlck9wdGlvbnMpIHtcbiAgICAgICAgIHRoaXMuZmlsdGVyID0gdGhpcy5maWx0ZXJPcHRpb25zWzBdLnZhbHVlO1xuICAgICAgfVxuICAgfVxuXG4gICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgdGhpcy5jaGVja0RlYm91bmNlQ2hhbmdlKGNoYW5nZXMpO1xuICAgICAgdGhpcy5jaGVja1ZhbHVlQ2hhbmdlKGNoYW5nZXMpO1xuICAgICAgdGhpcy5jaGVja0Rpc2FibGVDaGFuZ2UoY2hhbmdlcyk7XG4gICAgICB0aGlzLmNoZWNrQXV0b0NvbXBsZXRlTWVudUNoYW5nZShjaGFuZ2VzKTtcbiAgIH1cblxuICAgcHVibGljIG9uQ2hhbmdlRmlsdGVyKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgIHRoaXMuc2VsZWN0RmlsdGVyLmVtaXQodmFsdWUpO1xuICAgICAgdGhpcy5lbWl0VmFsdWUoZmFsc2UsIFN0U2VhcmNoRXZlbnRPcmlnaW4uRklMVEVSKTtcbiAgIH1cblxuICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25TZWFyY2hDbGVhckJ1dHRvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblNlYXJjaENsZWFyQnV0dG9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNsb3NlRWxlbWVudCgpO1xuICAgfVxuXG4gICBwdWJsaWMgbGF1bmNoU2VhcmNoKGZvcmNlOiBib29sZWFuLCBvcmlnaW46IFN0U2VhcmNoRXZlbnRPcmlnaW4pOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmNhblNlYXJjaCgpKSB7XG4gICAgICAgICB0aGlzLnNob3dBdXRvQ29tcGxldGVNZW51KCk7XG4gICAgICAgICB0aGlzLmVtaXRWYWx1ZShmb3JjZSwgb3JpZ2luKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB0aGlzLmNsb3NlRWxlbWVudCgpO1xuICAgICAgfVxuICAgfVxuXG4gICBwdWJsaWMgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgbGV0IGtleTogbnVtYmVyID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaDtcbiAgICAgIGlmIChrZXkgPT09IDEzKSB7XG4gICAgICAgICB0aGlzLmxhdW5jaFNlYXJjaCh0cnVlLCBTdFNlYXJjaEV2ZW50T3JpZ2luLkVOVEVSKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHVibGljIGNoYW5nZU9wdGlvbihpdGVtOiBTdERyb3BEb3duTWVudUl0ZW0pOiB2b2lkIHtcbiAgICAgIGlmIChpdGVtICYmIGl0ZW0ubGFiZWwpIHtcbiAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICB0aGlzLnNlYXJjaEJveC5zZXRWYWx1ZShpdGVtLnZhbHVlKTtcbiAgICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICB0aGlzLmNsb3NlRWxlbWVudCgpO1xuICAgICAgICAgdGhpcy5lbWl0VmFsdWUodHJ1ZSwgU3RTZWFyY2hFdmVudE9yaWdpbi5MSVNUKTtcbiAgICAgICAgIHRoaXMubWFuYWdlU3Vic2NyaXB0aW9uKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBjbGVhcklucHV0KCk6IHZvaWQge1xuICAgICAgdGhpcy5zZWFyY2hCb3guc2V0VmFsdWUoJycpO1xuICAgICAgdGhpcy5jbG9zZUVsZW1lbnQoKTtcbiAgICAgIHRoaXMuZW1pdFZhbHVlKHRydWUsIFN0U2VhcmNoRXZlbnRPcmlnaW4uSU5QVVQpO1xuICAgfVxuXG4gICBwdWJsaWMgc2hvd0F1dG9Db21wbGV0ZU1lbnUoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy53aXRoQXV0b2NvbXBsZXRlICYmICF0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICB0aGlzLm9wZW5FbGVtZW50KCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWFyY2hCb3gudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICB0aGlzLmNsb3NlRWxlbWVudCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBlbWl0VmFsdWUoZm9yY2U6IGJvb2xlYW4sIG9yaWdpbjogU3RTZWFyY2hFdmVudE9yaWdpbik6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNFcXVhbFByZXZpb3VzKGZvcmNlKSkge1xuICAgICAgICAgdGhpcy5sYXN0RW1pdHRlZFRleHQgPSB0aGlzLnNlYXJjaEJveC52YWx1ZTtcbiAgICAgICAgIGxldCBuZXdTZWFyY2g6IFN0U2VhcmNoRXZlbnQgPSB7dGV4dDogdGhpcy5sYXN0RW1pdHRlZFRleHQgfHwgJycsIG9yaWdpbjogb3JpZ2lufTtcbiAgICAgICAgIGlmICh0aGlzLmZpbHRlcikge1xuICAgICAgICAgICAgbmV3U2VhcmNoLmZpbHRlciA9IHRoaXMuZmlsdGVyO1xuICAgICAgICAgfVxuICAgICAgICAgdGhpcy5zZWFyY2guZW1pdChuZXdTZWFyY2gpO1xuICAgICAgfVxuICAgfVxuXG5cblxuICAgcHJpdmF0ZSBjaGVja0Rpc2FibGVkKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LmRpc2FibGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB0aGlzLnNlYXJjaEJveC5lbmFibGUoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSBjYW5TZWFyY2goKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQoKSAmJiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmNoZWNrTWlucygpO1xuICAgfVxuXG4gICBwcml2YXRlIGlzRGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLnNlYXJjaEJveCAmJiB0aGlzLnNlYXJjaEJveC52YWx1ZSAhPT0gbnVsbCAmJiB0aGlzLnNlYXJjaEJveC52YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICAgfVxuXG4gICBwcml2YXRlIGNoZWNrTWlucygpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLm1pbkxlbmd0aCA8PSAodGhpcy5zZWFyY2hCb3ggJiYgdGhpcy5zZWFyY2hCb3gudmFsdWUgJiYgdGhpcy5zZWFyY2hCb3gudmFsdWUubGVuZ3RoKSB8fFxuICAgICAgICAgdGhpcy5zZWFyY2hCb3gudmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMDtcbiAgIH1cblxuICAgcHJpdmF0ZSBpc0VxdWFsUHJldmlvdXMoZm9yY2U6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmxhc3RFbWl0dGVkVGV4dCAhPT0gdGhpcy5zZWFyY2hCb3gudmFsdWUgfHwgZm9yY2U7XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tWYWx1ZUNoYW5nZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzLnZhbHVlKSB7XG4gICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25TZWFyY2gpIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICB9XG4gICAgICAgICB0aGlzLnNlYXJjaEJveC5zZXRWYWx1ZShjaGFuZ2VzLnZhbHVlLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICB0aGlzLm1hbmFnZVN1YnNjcmlwdGlvbigpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGNoZWNrRGVib3VuY2VDaGFuZ2UoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5kZWJvdW5jZSkge1xuICAgICAgICAgdGhpcy5tYW5hZ2VTdWJzY3JpcHRpb24oKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja0Rpc2FibGVDaGFuZ2UoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5kaXNhYmxlZCkge1xuICAgICAgICAgdGhpcy5jaGVja0Rpc2FibGVkKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tBdXRvQ29tcGxldGVNZW51Q2hhbmdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMuYXV0b2NvbXBsZXRlTGlzdCkge1xuICAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSBtYW5hZ2VTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25TZWFyY2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2gudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmxpdmVTZWFyY2gpIHtcbiAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoID0gdGhpcy5zZWFyY2hCb3hcbiAgICAgICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB0aGlzLmxhdW5jaFNlYXJjaChmYWxzZSwgIFN0U2VhcmNoRXZlbnRPcmlnaW4uSU5QVVQpKTtcbiAgICAgIH1cbiAgIH1cbn1cbiJdfQ==