@firestitch/filter
Version: 
248 lines • 20.1 kB
JavaScript
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import { isString } from 'lodash-es';
import { ItemType } from '../models/filter-item';
var QueryParams = /** @class */ (function () {
    function QueryParams(_router, _route, _filterItems) {
        this._router = _router;
        this._route = _route;
        this._filterItems = _filterItems;
        this._queryKeys = [];
        this._queryParamsToFilter(this._route.snapshot.queryParams, this._filterItems);
    }
    /**
     * Update query with filter values
     * @param filterParams
     */
    /**
     * Update query with filter values
     * @param {?} filterParams
     * @return {?}
     */
    QueryParams.prototype.updateQueryParams = /**
     * Update query with filter values
     * @param {?} filterParams
     * @return {?}
     */
    function (filterParams) {
        // transform selected filter values to query string
        /** @type {?} */
        var newParams = this._filterToQueryParams(filterParams, this._filterItems);
        // Remove empty keys
        this._clearKeys(newParams);
        // Store query keys
        this._queryKeys = Object.keys(newParams);
        // Update query
        this._router.navigate([], {
            relativeTo: this._route,
            queryParams: newParams,
            queryParamsHandling: 'merge'
        }).then((/**
         * @return {?}
         */
        function () { }));
    };
    /**
     * Transformation for selected filter values to query string
     * @param params
     * @param items
     */
    /**
     * Transformation for selected filter values to query string
     * @private
     * @param {?} params
     * @param {?} items
     * @return {?}
     */
    QueryParams.prototype._filterToQueryParams = /**
     * Transformation for selected filter values to query string
     * @private
     * @param {?} params
     * @param {?} items
     * @return {?}
     */
    function (params, items) {
        // selected filter keys
        /** @type {?} */
        var filterKeys = Object.keys(params);
        return filterKeys.reduce((/**
         * @param {?} acc
         * @param {?} filterKey
         * @return {?}
         */
        function (acc, filterKey) {
            // looking filter item
            /** @type {?} */
            var filterItem = items.find((/**
             * @param {?} item
             * @return {?}
             */
            function (item) { return item.name === filterKey; }));
            if (filterItem) {
                if (filterItem.type === ItemType.Range) {
                    acc[filterKey] = [params[filterKey].min, params[filterKey].max].join(',');
                }
                else if (filterItem.type === ItemType.Select && filterItem.multiple && filterItem.model.length > 0) {
                    acc[filterKey] = filterItem.model.join(',');
                }
                else if (filterItem.type === ItemType.AutoComplete) {
                    acc[filterKey] = [filterItem.model.value, filterItem.model.name].join(',');
                }
                else if (filterItem.type === ItemType.AutoCompleteChips) {
                    acc[filterKey] = filterItem.model.map((/**
                     * @param {?} item
                     * @return {?}
                     */
                    function (item) { return [item.value, item.name].join(','); })).join(';');
                }
                else {
                    acc[filterKey] = params[filterKey];
                }
            }
            return acc;
        }), {});
    };
    /**
     * Parse query and update filter values
     * @param params
     * @param items
     */
    /**
     * Parse query and update filter values
     * @private
     * @param {?} params
     * @param {?} items
     * @return {?}
     */
    QueryParams.prototype._queryParamsToFilter = /**
     * Parse query and update filter values
     * @private
     * @param {?} params
     * @param {?} items
     * @return {?}
     */
    function (params, items) {
        this._queryKeys = Object.keys(params);
        return this._queryKeys.forEach((/**
         * @param {?} queryKey
         * @return {?}
         */
        function (queryKey) {
            /** @type {?} */
            var filterItem = items.find((/**
             * @param {?} item
             * @return {?}
             */
            function (item) { return item.name === queryKey; }));
            if (filterItem) {
                if (filterItem.type === ItemType.Select && filterItem.multiple) {
                    /** @type {?} */
                    var values = params[queryKey]
                        .split(',');
                    filterItem.parseAndSetValue(values);
                }
                else if (filterItem.type === ItemType.Range) {
                    if (params[queryKey] && isString(params[queryKey])) {
                        /** @type {?} */
                        var filterParts = params[queryKey].split(',');
                        filterItem.model = {
                            min: filterParts[0],
                            max: filterParts[1]
                        };
                    }
                }
                else if (filterItem.type === ItemType.Chips) {
                    /** @type {?} */
                    var chipIds = params[queryKey]
                        .split(',')
                        .map((/**
                     * @param {?} value
                     * @return {?}
                     */
                    function (value) { return +value; }));
                    filterItem.parseAndSetValue(chipIds);
                }
                else if (filterItem.type === ItemType.Checkbox) {
                    filterItem.parseAndSetValue(params[queryKey] === 'true');
                }
                else if (filterItem.type === ItemType.AutoComplete) {
                    /** @type {?} */
                    var filterParts = params[queryKey].split(',');
                    filterItem.model = {
                        name: filterParts[1],
                        value: +filterParts[0]
                    };
                }
                else if (filterItem.type === ItemType.AutoCompleteChips) {
                    /** @type {?} */
                    var filterParts = params[queryKey].split(';');
                    filterItem.model = filterParts.reduce((/**
                     * @param {?} acc
                     * @param {?} value
                     * @return {?}
                     */
                    function (acc, value) {
                        /** @type {?} */
                        var chipParts = value.split(',');
                        acc.push({
                            name: chipParts[1],
                            value: +chipParts[0],
                        });
                        return acc;
                    }), []);
                }
                else {
                    filterItem.parseAndSetValue(params[queryKey]);
                }
            }
        }));
    };
    /**
     * @private
     * @param {?} params
     * @return {?}
     */
    QueryParams.prototype._clearKeys = /**
     * @private
     * @param {?} params
     * @return {?}
     */
    function (params) {
        this._queryKeys.forEach((/**
         * @param {?} key
         * @return {?}
         */
        function (key) {
            if (!params[key]) {
                params[key] = null;
            }
        }));
    };
    return QueryParams;
}());
export { QueryParams };
if (false) {
    /**
     * @type {?}
     * @private
     */
    QueryParams.prototype._queryKeys;
    /**
     * @type {?}
     * @private
     */
    QueryParams.prototype._router;
    /**
     * @type {?}
     * @private
     */
    QueryParams.prototype._route;
    /**
     * @type {?}
     * @private
     */
    QueryParams.prototype._filterItems;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcGFyYW1zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvZmlsdGVyLyIsInNvdXJjZXMiOlsiYXBwL21vZGVscy9xdWVyeS1wYXJhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLE9BQU8sRUFBYSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEQsT0FBTyxFQUFzQixRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdyRTtJQUdFLHFCQUNVLE9BQWUsRUFDZixNQUFzQixFQUN0QixZQUFrQztRQUZsQyxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQXNCO1FBTHBDLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFPdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7O0lBQ0ksdUNBQWlCOzs7OztJQUF4QixVQUF5QixZQUFZOzs7WUFFN0IsU0FBUyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUU1RSxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUzQixtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXpDLGVBQWU7UUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ3ZCLFdBQVcsRUFBRSxTQUFTO1lBQ3RCLG1CQUFtQixFQUFFLE9BQU87U0FDN0IsQ0FBQyxDQUFDLElBQUk7OztRQUFDLGNBQU8sQ0FB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QUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLGlCQUFpQixFQUFFOzt3QkFDbkQsV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO29CQUUvQyxVQUFVLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNOzs7OztvQkFBQyxVQUFDLEdBQUcsRUFBRSxLQUFLOzs0QkFFekMsU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO3dCQUVsQyxHQUFHLENBQUMsSUFBSSxDQUFDOzRCQUNQLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDOzRCQUNsQixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3lCQUNyQixDQUFDLENBQUM7d0JBRUgsT0FBTyxHQUFHLENBQUM7b0JBQ2IsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxDQUFBO2lCQUVQO3FCQUFNO29CQUNMLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztpQkFDL0M7YUFDRjtRQUNILENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBRU8sZ0NBQVU7Ozs7O0lBQWxCLFVBQW1CLE1BQU07UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxHQUFHO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDcEI7UUFDSCxDQUFDLEVBQUMsQ0FBQTtJQUNKLENBQUM7SUFDSCxrQkFBQztBQUFELENBQUMsQUF2SUQsSUF1SUM7Ozs7Ozs7SUF0SUMsaUNBQXdCOzs7OztJQUd0Qiw4QkFBdUI7Ozs7O0lBQ3ZCLDZCQUE4Qjs7Ozs7SUFDOUIsbUNBQTBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGlzU3RyaW5nIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEZzRmlsdGVyQ29uZmlnSXRlbSwgSXRlbVR5cGUgfSBmcm9tICcuLi9tb2RlbHMvZmlsdGVyLWl0ZW0nO1xuXG5cbmV4cG9ydCBjbGFzcyBRdWVyeVBhcmFtcyB7XG4gIHByaXZhdGUgX3F1ZXJ5S2V5cyA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIF9maWx0ZXJJdGVtczogRnNGaWx0ZXJDb25maWdJdGVtW10sXG4gICkge1xuICAgIHRoaXMuX3F1ZXJ5UGFyYW1zVG9GaWx0ZXIodGhpcy5fcm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMsIHRoaXMuX2ZpbHRlckl0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgcXVlcnkgd2l0aCBmaWx0ZXIgdmFsdWVzXG4gICAqIEBwYXJhbSBmaWx0ZXJQYXJhbXNcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVRdWVyeVBhcmFtcyhmaWx0ZXJQYXJhbXMpIHtcbiAgICAvLyB0cmFuc2Zvcm0gc2VsZWN0ZWQgZmlsdGVyIHZhbHVlcyB0byBxdWVyeSBzdHJpbmdcbiAgICBjb25zdCBuZXdQYXJhbXMgPSB0aGlzLl9maWx0ZXJUb1F1ZXJ5UGFyYW1zKGZpbHRlclBhcmFtcywgdGhpcy5fZmlsdGVySXRlbXMpO1xuXG4gICAgLy8gUmVtb3ZlIGVtcHR5IGtleXNcbiAgICB0aGlzLl9jbGVhcktleXMobmV3UGFyYW1zKTtcblxuICAgIC8vIFN0b3JlIHF1ZXJ5IGtleXNcbiAgICB0aGlzLl9xdWVyeUtleXMgPSBPYmplY3Qua2V5cyhuZXdQYXJhbXMpO1xuXG4gICAgLy8gVXBkYXRlIHF1ZXJ5XG4gICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLl9yb3V0ZSxcbiAgICAgIHF1ZXJ5UGFyYW1zOiBuZXdQYXJhbXMsXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnXG4gICAgfSkudGhlbigoKSA9PiB7fSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtYXRpb24gZm9yIHNlbGVjdGVkIGZpbHRlciB2YWx1ZXMgdG8gcXVlcnkgc3RyaW5nXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIGl0ZW1zXG4gICAqL1xuICBwcml2YXRlIF9maWx0ZXJUb1F1ZXJ5UGFyYW1zKHBhcmFtcywgaXRlbXM6IEZzRmlsdGVyQ29uZmlnSXRlbVtdKSB7XG4gICAgLy8gc2VsZWN0ZWQgZmlsdGVyIGtleXNcbiAgICBjb25zdCBmaWx0ZXJLZXlzID0gT2JqZWN0LmtleXMocGFyYW1zKTtcblxuICAgIHJldHVybiBmaWx0ZXJLZXlzLnJlZHVjZSgoYWNjLCBmaWx0ZXJLZXkpID0+IHtcblxuICAgICAgLy8gbG9va2luZyBmaWx0ZXIgaXRlbVxuICAgICAgY29uc3QgZmlsdGVySXRlbSA9IGl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gZmlsdGVyS2V5KTtcblxuICAgICAgaWYgKGZpbHRlckl0ZW0pIHtcbiAgICAgICAgaWYgKGZpbHRlckl0ZW0udHlwZSA9PT0gSXRlbVR5cGUuUmFuZ2UpIHtcbiAgICAgICAgICBhY2NbZmlsdGVyS2V5XSA9IFtwYXJhbXNbZmlsdGVyS2V5XS5taW4sIHBhcmFtc1tmaWx0ZXJLZXldLm1heF0uam9pbignLCcpXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVySXRlbS50eXBlID09PSBJdGVtVHlwZS5TZWxlY3QgJiYgZmlsdGVySXRlbS5tdWx0aXBsZSAmJiBmaWx0ZXJJdGVtLm1vZGVsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhY2NbZmlsdGVyS2V5XSA9IGZpbHRlckl0ZW0ubW9kZWwuam9pbignLCcpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpbHRlckl0ZW0udHlwZSA9PT0gSXRlbVR5cGUuQXV0b0NvbXBsZXRlKSB7XG4gICAgICAgICAgYWNjW2ZpbHRlcktleV0gPSBbZmlsdGVySXRlbS5tb2RlbC52YWx1ZSwgZmlsdGVySXRlbS5tb2RlbC5uYW1lXS5qb2luKCcsJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVySXRlbS50eXBlID09PSBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwcykge1xuICAgICAgICAgIGFjY1tmaWx0ZXJLZXldID0gZmlsdGVySXRlbS5tb2RlbC5tYXAoKGl0ZW0pID0+IFtpdGVtLnZhbHVlLCBpdGVtLm5hbWVdLmpvaW4oJywnKSkuam9pbignOycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjY1tmaWx0ZXJLZXldID0gcGFyYW1zW2ZpbHRlcktleV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcXVlcnkgYW5kIHVwZGF0ZSBmaWx0ZXIgdmFsdWVzXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIGl0ZW1zXG4gICAqL1xuICBwcml2YXRlIF9xdWVyeVBhcmFtc1RvRmlsdGVyKHBhcmFtcywgaXRlbXM6IEZzRmlsdGVyQ29uZmlnSXRlbVtdKSB7XG4gICAgdGhpcy5fcXVlcnlLZXlzID0gT2JqZWN0LmtleXMocGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLl9xdWVyeUtleXMuZm9yRWFjaCgocXVlcnlLZXkpID0+IHtcblxuICAgICAgY29uc3QgZmlsdGVySXRlbSA9IGl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gcXVlcnlLZXkpO1xuXG4gICAgICBpZiAoZmlsdGVySXRlbSkge1xuICAgICAgICBpZiAoZmlsdGVySXRlbS50eXBlID09PSBJdGVtVHlwZS5TZWxlY3QgJiYgZmlsdGVySXRlbS5tdWx0aXBsZSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHBhcmFtc1txdWVyeUtleV1cbiAgICAgICAgICAgIC5zcGxpdCgnLCcpO1xuXG4gICAgICAgICAgZmlsdGVySXRlbS5wYXJzZUFuZFNldFZhbHVlKHZhbHVlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVySXRlbS50eXBlID09PSBJdGVtVHlwZS5SYW5nZSkge1xuICAgICAgICAgIGlmIChwYXJhbXNbcXVlcnlLZXldICYmIGlzU3RyaW5nKHBhcmFtc1txdWVyeUtleV0pKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJQYXJ0cyA9IHBhcmFtc1txdWVyeUtleV0uc3BsaXQoJywnKTtcbiAgICAgICAgICAgIGZpbHRlckl0ZW0ubW9kZWwgPSB7XG4gICAgICAgICAgICAgIG1pbjogZmlsdGVyUGFydHNbMF0sXG4gICAgICAgICAgICAgIG1heDogZmlsdGVyUGFydHNbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZpbHRlckl0ZW0udHlwZSA9PT0gSXRlbVR5cGUuQ2hpcHMpIHtcbiAgICAgICAgICBjb25zdCBjaGlwSWRzID0gcGFyYW1zW3F1ZXJ5S2V5XVxuICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgIC5tYXAoKHZhbHVlKSA9PiArdmFsdWUpO1xuXG4gICAgICAgICAgZmlsdGVySXRlbS5wYXJzZUFuZFNldFZhbHVlKGNoaXBJZHMpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpbHRlckl0ZW0udHlwZSA9PT0gSXRlbVR5cGUuQ2hlY2tib3gpIHtcbiAgICAgICAgICBmaWx0ZXJJdGVtLnBhcnNlQW5kU2V0VmFsdWUocGFyYW1zW3F1ZXJ5S2V5XSA9PT0gJ3RydWUnKTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZSkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlclBhcnRzID0gcGFyYW1zW3F1ZXJ5S2V5XS5zcGxpdCgnLCcpO1xuXG4gICAgICAgICAgZmlsdGVySXRlbS5tb2RlbCA9IHtcbiAgICAgICAgICAgIG5hbWU6IGZpbHRlclBhcnRzWzFdLFxuICAgICAgICAgICAgdmFsdWU6ICtmaWx0ZXJQYXJ0c1swXVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZUNoaXBzKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyUGFydHMgPSBwYXJhbXNbcXVlcnlLZXldLnNwbGl0KCc7Jyk7XG5cbiAgICAgICAgICBmaWx0ZXJJdGVtLm1vZGVsID0gZmlsdGVyUGFydHMucmVkdWNlKChhY2MsIHZhbHVlKSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNoaXBQYXJ0cyA9IHZhbHVlLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgICAgIGFjYy5wdXNoKHtcbiAgICAgICAgICAgICAgbmFtZTogY2hpcFBhcnRzWzFdLFxuICAgICAgICAgICAgICB2YWx1ZTogK2NoaXBQYXJ0c1swXSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIFtdKVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsdGVySXRlbS5wYXJzZUFuZFNldFZhbHVlKHBhcmFtc1txdWVyeUtleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhcktleXMocGFyYW1zKSB7XG4gICAgdGhpcy5fcXVlcnlLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKCFwYXJhbXNba2V5XSkge1xuICAgICAgICBwYXJhbXNba2V5XSA9IG51bGw7XG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuIl19