@firestitch/filter
Version: 
917 lines • 67.6 kB
JavaScript
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { toUTC } from '@firestitch/date';
import { Alias, Model } from 'tsmodels';
import { take, takeUntil } from 'rxjs/operators';
import { isObservable } from 'rxjs/internal/util/isObservable';
import { isFunction, isObject, toString, clone, filter } from 'lodash-es';
import { isDate, isValid, parse } from 'date-fns';
/** @enum {string} */
var ItemType = {
    Text: 'text',
    Select: 'select',
    Range: 'range',
    Date: 'date',
    DateTime: 'datetime',
    DateRange: 'daterange',
    DateTimeRange: 'datetimerange',
    AutoComplete: 'autocomplete',
    AutoCompleteChips: 'autocompletechips',
    Checkbox: 'checkbox',
    Chips: 'chips',
};
export { ItemType };
var FsFilterConfigItem = /** @class */ (function (_super) {
    tslib_1.__extends(FsFilterConfigItem, _super);
    function FsFilterConfigItem(_configItem, _config, _route, _persists) {
        if (_configItem === void 0) { _configItem = {}; }
        var _this = _super.call(this) || this;
        _this._configItem = _configItem;
        _this._config = _config;
        _this._route = _route;
        _this._persists = _persists;
        _this.initialLoading = false;
        _this.valueChanged = false;
        _this._pendingValues = false;
        _this._fromJSON(_configItem);
        return _this;
    }
    Object.defineProperty(FsFilterConfigItem.prototype, "hasPendingValues", {
        get: /**
         * @return {?}
         */
        function () {
            return this._pendingValues;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(FsFilterConfigItem.prototype, "model", {
        get: /**
         * @return {?}
         */
        function () {
            return this._model;
        },
        set: /**
         * @param {?} val
         * @return {?}
         */
        function (val) {
            this._model = val;
            this._tmpModel = val;
            this.checkIfValueChanged();
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(FsFilterConfigItem.prototype, "tmpModel", {
        get: /**
         * @return {?}
         */
        function () {
            return this._tmpModel;
        },
        set: /**
         * @param {?} val
         * @return {?}
         */
        function (val) {
            this._tmpModel = val;
        },
        enumerable: true,
        configurable: true
    });
    /**
     * @param {?} values
     * @return {?}
     */
    FsFilterConfigItem.prototype.setValues = /**
     * @param {?} values
     * @return {?}
     */
    function (values) {
        this.values = values;
        if (Array.isArray(values)) {
            this.sanitizeItem(((/** @type {?} */ (values))).slice());
        }
    };
    /**
     * @param {?} data
     * @return {?}
     */
    FsFilterConfigItem.prototype._fromJSON = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        _super.prototype._fromJSON.call(this, data);
        if (this.name && isObject(this.name)) {
            this.names = this.name;
            this.name = Object.keys(this.names).join('-');
        }
        if (this._config.persist) {
            /** @type {?} */
            var persisted = this._persists[this._config.persist.name].data;
            if (persisted[this.name]) {
                this.parseAndSetValue(persisted[this.name]);
            }
        }
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.initValues = /**
     * @return {?}
     */
    function () {
        if (isFunction(this._configItem.values) &&
            !this.isTypeAutocomplete() &&
            !this.isTypeAutocompleteChips()) {
            /** @type {?} */
            var obj = this._configItem.values();
            this.setValues(obj);
            if (isObservable(obj)) {
                this._pendingValues = true;
            }
        }
        else {
            this.setValues(this._configItem.values);
        }
    };
    /**
     * @param {?} value
     * @return {?}
     */
    FsFilterConfigItem.prototype.updateValue = /**
     * @param {?} value
     * @return {?}
     */
    function (value) {
        var _this = this;
        var _a;
        switch (this.type) {
            case ItemType.Select:
                {
                    if (value === '__all' || value === null) {
                        this.model = value;
                        return;
                    }
                    /** @type {?} */
                    var valueExists = null;
                    /** @type {?} */
                    var isolated = null;
                    if (this.multiple) {
                        isolated = this.isolate && Array.isArray(value) && value[0] === this.isolate.value;
                        valueExists = Array.isArray(this.values)
                            ? value.every((/**
                             * @param {?} val
                             * @return {?}
                             */
                            function (val) {
                                return _this.values.find((/**
                                 * @param {?} valueItem
                                 * @return {?}
                                 */
                                function (valueItem) { return valueItem.value === val; }));
                            }))
                                || isolated
                            : false;
                    }
                    else {
                        valueExists = Array.isArray(this.values)
                            ? this.values.some((/**
                             * @param {?} valueItem
                             * @return {?}
                             */
                            function (valueItem) { return valueItem.value === value; }))
                            : false;
                    }
                    if (valueExists) {
                        this.model = value;
                        if (this.isolate) {
                            this.isolate.enabled = isolated;
                        }
                        return;
                    }
                }
                break;
            case ItemType.Range:
                {
                    this.model = isObject(value) ? tslib_1.__assign({}, this.model, value) : {};
                }
                break;
            case ItemType.Chips:
                {
                    this.model = [];
                }
                break;
            case ItemType.Date:
            case ItemType.DateTime:
                {
                    this.model = value;
                }
                break;
            case ItemType.AutoCompleteChips:
                {
                    if (Array.isArray(value)) {
                        (_a = this.model).push.apply(_a, tslib_1.__spread(value));
                    }
                    else if (isObject(value)) {
                        this.model.push(value);
                    }
                    else {
                        this.model = [];
                    }
                }
                break;
            default: {
                this.model = value;
            }
        }
    };
    /**
     * @param {?=} reload
     * @return {?}
     */
    FsFilterConfigItem.prototype.loadValues = /**
     * @param {?=} reload
     * @return {?}
     */
    function (reload) {
        var _this = this;
        if (reload === void 0) { reload = true; }
        if (reload || (!this.initialLoading && this.hasPendingValues)) {
            this.initialLoading = true;
            if (isFunction(this._configItem.values) &&
                !this.isTypeAutocomplete() &&
                !this.isTypeAutocompleteChips()) {
                /** @type {?} */
                var obj = this._configItem.values();
                if (isObservable(obj)) {
                    // Clear out values so the interfaces go into a loading state
                    this.values = [];
                    obj
                        .pipe(take(1), takeUntil(this._config.destroy$))
                        .subscribe((/**
                     * @param {?} values
                     * @return {?}
                     */
                    function (values) {
                        _this.setValues(values);
                        _this._pendingValues = false;
                        _this.initialLoading = false;
                    }));
                }
                else {
                    this.setValues(obj);
                }
            }
        }
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.clear = /**
     * @return {?}
     */
    function () {
        this.valueChanged = false;
        this.model = undefined;
        switch (this.type) {
            case ItemType.AutoComplete:
                {
                    this.model = null;
                    this.tmpModel = null;
                    this.search = '';
                }
                break;
            case ItemType.AutoCompleteChips:
            case ItemType.Chips:
                {
                    this.model = [];
                    this.tmpModel = [];
                    this.search = '';
                }
                break;
            case ItemType.Checkbox:
                {
                    this.model = false;
                    this.tmpModel = false;
                }
                break;
            case ItemType.Select:
                {
                    if (this.multiple) {
                        this.model = [];
                        this.tmpModel = [];
                    }
                    else {
                        this.model = Array.isArray(this.values) && this.values.some((/**
                         * @param {?} val
                         * @return {?}
                         */
                        function (val) { return val.value === '__all'; }))
                            ? '__all'
                            : null;
                        this.tmpModel = this.model;
                    }
                    if (this.isolate) {
                        this.isolate.enabled = false;
                    }
                }
                break;
            case ItemType.Range:
                {
                    this.model = {};
                    this.tmpModel = {};
                }
                break;
            case ItemType.Text:
                {
                    this.model = '';
                    this.tmpModel = '';
                }
                break;
            case ItemType.Date:
            case ItemType.DateTime:
                {
                    this.model = null;
                    this.tmpModel = null;
                }
                break;
        }
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.checkIfValueChanged = /**
     * @return {?}
     */
    function () {
        switch (this.type) {
            case ItemType.AutoCompleteChips:
                {
                    this.valueChanged = this.model && this.model.length;
                }
                break;
            case ItemType.Checkbox:
                {
                    this.valueChanged = this.model && this.model !== false;
                }
                break;
            case ItemType.Select:
                {
                    if (this.multiple) {
                        this.valueChanged = this.model && this.model.length;
                    }
                    else {
                        /** @type {?} */
                        var hasAllOption = Array.isArray(this.values) && this.values.some((/**
                         * @param {?} val
                         * @return {?}
                         */
                        function (val) { return val.value === '__all'; }));
                        if (hasAllOption && this.model && this.model !== '__all') {
                            this.valueChanged = true;
                        }
                        else {
                            this.valueChanged = !!this.model;
                        }
                    }
                }
                break;
            case ItemType.Range:
                {
                    if (this.model && Object.keys(this.model).length > 0) {
                        this.valueChanged = true;
                    }
                }
                break;
            case ItemType.Text:
                {
                    this.valueChanged = this.model && this.model !== '';
                }
                break;
            case ItemType.AutoComplete:
            case ItemType.Date:
            case ItemType.DateTime:
                {
                    this.valueChanged = !!this.model;
                }
                break;
            default: {
                this.valueChanged = false;
            }
        }
    };
    /**
     * @param {?} value
     * @return {?}
     */
    FsFilterConfigItem.prototype.parseAndSetValue = /**
     * @param {?} value
     * @return {?}
     */
    function (value) {
        if (value) {
            if (this.isTypeDateRange() || this.isTypeDateTimeRange()) {
                value.from = value.from ? toUTC(value.from) : null;
                value.to = value.to ? toUTC(value.to) : null;
            }
            else if (this.isTypeDate() || this.isTypeDateTime()) {
                if (!isDate(value) || !isValid(value)) {
                    value = parse(value, 'yyyy-MM-dd\'T\'HH:mm:ssxxxxx', new Date());
                }
            }
            else if (this.isTypeCheckbox() && this.checked !== undefined) {
                value = value == this.checked;
            }
            else if (this.isTypeSelect() && this.multiple) {
                value = clone(value);
            }
            else if (this.isTypeSelect() || this.isTypeAutocomplete()) {
                value = +value;
            }
        }
        this.model = value;
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.isTypeAutocomplete = /**
     * @return {?}
     */
    function () {
        return this.type === ItemType.AutoComplete;
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.isTypeAutocompleteChips = /**
     * @return {?}
     */
    function () {
        return this.type === ItemType.AutoCompleteChips;
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.isTypeChips = /**
     * @return {?}
     */
    function () {
        return this.type === ItemType.Chips;
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.isTypeCheckbox = /**
     * @return {?}
     */
    function () {
        return this.type === ItemType.Checkbox;
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.isTypeSelect = /**
     * @return {?}
     */
    function () {
        return this.type === ItemType.Select;
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.isTypeDate = /**
     * @return {?}
     */
    function () {
        return this.type === ItemType.Date;
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.isTypeDateRange = /**
     * @return {?}
     */
    function () {
        return this.type === ItemType.DateRange;
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.isTypeDateTimeRange = /**
     * @return {?}
     */
    function () {
        return this.type === ItemType.DateTimeRange;
    };
    /**
     * @return {?}
     */
    FsFilterConfigItem.prototype.isTypeDateTime = /**
     * @return {?}
     */
    function () {
        return this.type === ItemType.DateTime;
    };
    /**
     * @private
     * @param {?} values
     * @return {?}
     */
    FsFilterConfigItem.prototype.sanitizeItem = /**
     * @private
     * @param {?} values
     * @return {?}
     */
    function (values) {
        var _this = this;
        switch (this.type) {
            case ItemType.Text:
                {
                    //?????
                }
                break;
            case ItemType.Select:
                {
                    this.sanitizeSelectItem();
                }
                break;
            case ItemType.Chips:
                {
                    this.sanitizeChipsItem();
                }
                break;
            case ItemType.Range:
                {
                    this.sanitizeRange();
                }
                break;
            case ItemType.Checkbox:
                {
                    this.sanitizeCheckbox();
                }
                break;
        }
        if (this.model === undefined) {
            if (this.isTypeCheckbox()) {
                this.model = this.checked == this.defaultValue;
            }
            else {
                this.model = this.defaultValue;
            }
        }
        if (this.model === undefined) {
            if (this.isTypeCheckbox()) {
                this.model = false;
            }
            else if (this.isTypeSelect()) {
                if (this.multiple) {
                    if (!Array.isArray(this.defaultValue)) {
                        this.model = [];
                    }
                }
                else {
                    if (this.defaultValue === undefined) {
                        this.model = '__all';
                    }
                }
            }
            else if (this.isTypeAutocompleteChips() || this.isTypeChips()) {
                this.model = [];
            }
        }
        if (this.isTypeSelect()) {
            if (this.multiple) {
                this.model = filter(this.model || [], (/**
                 * @param {?} item
                 * @return {?}
                 */
                function (item) {
                    return _this.values.find((/**
                     * @param {?} value
                     * @return {?}
                     */
                    function (value) {
                        return value.value === item;
                    }));
                }));
            }
            else {
                /** @type {?} */
                var exists = this.modelValueExists(this.values);
                if (!exists) {
                    this.model = '__all';
                }
            }
        }
    };
    /**
     * @private
     * @param {?} values
     * @return {?}
     */
    FsFilterConfigItem.prototype.modelValueExists = /**
     * @private
     * @param {?} values
     * @return {?}
     */
    function (values) {
        for (var i = 0; i < values.length; i++) {
            if (values[i].value === this.model) {
                return true;
            }
            if (values[i][this.children]) {
                /** @type {?} */
                var model = this.modelValueExists(values[i][this.children]);
                if (model) {
                    return true;
                }
            }
        }
        return false;
    };
    /**
     * @private
     * @return {?}
     */
    FsFilterConfigItem.prototype.sanitizeSelectItem = /**
     * @private
     * @return {?}
     */
    function () {
        this.groups = null;
        // let data = [];
        // if (this.nested) {
        //   // generate a list of values from objects that have not been nested.
        //   if (!this.multiple) {
        //     data.push({value: '__all', name: 'All', depth: 0});
        //   }
        //
        //   Array.prototype.push.apply(data, this.walkSelectNestedValues(filter, null, this.values));
        // } else {
        //
        //   data = this.walkSelectValues(filter, this.values);
        // }
        // this.values = data;
        if (this.isolate) {
            for (var index in this.values) {
                if (this.values.hasOwnProperty(index)) {
                    if (!this.values[index]) {
                        continue;
                    }
                    if (this.values[index].value == this.isolate.value) {
                        this.values.splice(index, 1);
                    }
                }
            }
            if (Array.isArray(this.model)) {
                if (this.model.length == this.values.length) {
                    this.model = null;
                    this.isolate.enabled = false;
                }
                else if (this.model[0] == this.isolate.value) {
                    this.isolate.enabled = true;
                }
            }
        }
    };
    /**
     * @private
     * @return {?}
     */
    FsFilterConfigItem.prototype.sanitizeChipsItem = /**
     * @private
     * @return {?}
     */
    function () {
        var _this = this;
        this.groups = null;
        if (this.model && Array.isArray(this.model)) {
            if (Number.isInteger(this.model[0])) {
                this.model = this.model.map((/**
                 * @param {?} id
                 * @return {?}
                 */
                function (id) {
                    return _this.values.find((/**
                     * @param {?} value
                     * @return {?}
                     */
                    function (value) { return value.value === id; }));
                }));
            }
        }
    };
    /**
     * @private
     * @return {?}
     */
    FsFilterConfigItem.prototype.sanitizeCheckbox = /**
     * @private
     * @return {?}
     */
    function () {
        this.checked = this.checked ? toString(this.checked) : true;
        this.unchecked = this.unchecked ? toString(this.unchecked) : false;
        this.defaultValue = this.defaultValue === undefined ? this.unchecked : toString(this.defaultValue);
    };
    /**
     * @private
     * @return {?}
     */
    FsFilterConfigItem.prototype.sanitizeRange = /**
     * @private
     * @return {?}
     */
    function () {
        if (!this.placeholder) {
            this.placeholder = ['Min', 'Max'];
        }
        if (!this.model) {
            this.model = {};
        }
    };
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", String)
    ], FsFilterConfigItem.prototype, "name", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", String)
    ], FsFilterConfigItem.prototype, "type", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", String)
    ], FsFilterConfigItem.prototype, "label", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", String)
    ], FsFilterConfigItem.prototype, "chipLabel", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", String)
    ], FsFilterConfigItem.prototype, "children", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Boolean)
    ], FsFilterConfigItem.prototype, "multiple", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "groups", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Boolean)
    ], FsFilterConfigItem.prototype, "wait", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", String)
    ], FsFilterConfigItem.prototype, "query", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "values$", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "selectedValue", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "isolate", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "names", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Boolean)
    ], FsFilterConfigItem.prototype, "primary", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "search", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "unchecked", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "checked", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "alias", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "placeholder", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "values", void 0);
    tslib_1.__decorate([
        Alias(),
        tslib_1.__metadata("design:type", Function)
    ], FsFilterConfigItem.prototype, "change", void 0);
    tslib_1.__decorate([
        Alias('default'),
        tslib_1.__metadata("design:type", Object)
    ], FsFilterConfigItem.prototype, "defaultValue", void 0);
    return FsFilterConfigItem;
}(Model));
export { FsFilterConfigItem };
if (false) {
    /** @type {?} */
    FsFilterConfigItem.prototype.name;
    /** @type {?} */
    FsFilterConfigItem.prototype.type;
    /** @type {?} */
    FsFilterConfigItem.prototype.label;
    /** @type {?} */
    FsFilterConfigItem.prototype.chipLabel;
    /** @type {?} */
    FsFilterConfigItem.prototype.children;
    /** @type {?} */
    FsFilterConfigItem.prototype.multiple;
    /** @type {?} */
    FsFilterConfigItem.prototype.groups;
    /** @type {?} */
    FsFilterConfigItem.prototype.wait;
    /** @type {?} */
    FsFilterConfigItem.prototype.query;
    /** @type {?} */
    FsFilterConfigItem.prototype.values$;
    /** @type {?} */
    FsFilterConfigItem.prototype.selectedValue;
    /** @type {?} */
    FsFilterConfigItem.prototype.isolate;
    /** @type {?} */
    FsFilterConfigItem.prototype.names;
    /** @type {?} */
    FsFilterConfigItem.prototype.primary;
    /** @type {?} */
    FsFilterConfigItem.prototype.search;
    /** @type {?} */
    FsFilterConfigItem.prototype.unchecked;
    /** @type {?} */
    FsFilterConfigItem.prototype.checked;
    /** @type {?} */
    FsFilterConfigItem.prototype.alias;
    /** @type {?} */
    FsFilterConfigItem.prototype.placeholder;
    /** @type {?} */
    FsFilterConfigItem.prototype.values;
    /** @type {?} */
    FsFilterConfigItem.prototype.change;
    /** @type {?} */
    FsFilterConfigItem.prototype.defaultValue;
    /** @type {?} */
    FsFilterConfigItem.prototype.initialLoading;
    /** @type {?} */
    FsFilterConfigItem.prototype.valueChanged;
    /**
     * @type {?}
     * @private
     */
    FsFilterConfigItem.prototype._model;
    /**
     * @type {?}
     * @private
     */
    FsFilterConfigItem.prototype._tmpModel;
    /**
     * @type {?}
     * @private
     */
    FsFilterConfigItem.prototype._pendingValues;
    /**
     * @type {?}
     * @private
     */
    FsFilterConfigItem.prototype._configItem;
    /**
     * @type {?}
     * @private
     */
    FsFilterConfigItem.prototype._config;
    /**
     * @type {?}
     * @private
     */
    FsFilterConfigItem.prototype._route;
    /**
     * @type {?}
     * @private
     */
    FsFilterConfigItem.prototype._persists;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWl0ZW0uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZmlyZXN0aXRjaC9maWx0ZXIvIiwic291cmNlcyI6WyJhcHAvbW9kZWxzL2ZpbHRlci1pdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQzs7O0lBT2hELE1BQWtCLE1BQU07SUFDeEIsUUFBa0IsUUFBUTtJQUMxQixPQUFrQixPQUFPO0lBQ3pCLE1BQWtCLE1BQU07SUFDeEIsVUFBa0IsVUFBVTtJQUM1QixXQUFrQixXQUFXO0lBQzdCLGVBQWtCLGVBQWU7SUFDakMsY0FBa0IsY0FBYztJQUNoQyxtQkFBb0IsbUJBQW1CO0lBQ3ZDLFVBQWtCLFVBQVU7SUFDNUIsT0FBa0IsT0FBTzs7O0FBRzNCO0lBQXdDLDhDQUFLO0lBZ0MzQyw0QkFBb0IsV0FBeUMsRUFDekMsT0FBdUIsRUFDdkIsTUFBc0IsRUFDdEIsU0FBYztRQUhkLDRCQUFBLEVBQUEsZ0JBQXlDO1FBQTdELFlBSUUsaUJBQU8sU0FFUjtRQU5tQixpQkFBVyxHQUFYLFdBQVcsQ0FBOEI7UUFDekMsYUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsWUFBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsZUFBUyxHQUFULFNBQVMsQ0FBSztRQVYz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O3lEQUF1QjtJQUN0QjtRQUFSLEtBQUssRUFBRTs7dURBQXFCO0lBQ3BCO1FBQVIsS0FBSyxFQUFFOztxREFBbUI7SUFDbEI7UUFBUixLQUFLLEVBQUU7OzJEQUF5QjtJQUN4QjtRQUFSLEtBQUssRUFBRTs7c0RBQW9CO0lBQ25CO1FBQVIsS0FBSyxFQUFFOzBDQUFnQixRQUFRO3NEQUFDO0lBQ2Y7UUFBakIsS0FBSyxDQUFDLFNBQVMsQ0FBQzs7NERBQTBCO0lBNGU3Qyx5QkFBQztDQUFBLEFBbmdCRCxDQUF3QyxLQUFLLEdBbWdCNUM7U0FuZ0JZLGtCQUFrQjs7O0lBRTdCLGtDQUE2Qjs7SUFDN0Isa0NBQStCOztJQUMvQixtQ0FBOEI7O0lBQzlCLHVDQUFrQzs7SUFDbEMsc0NBQWlDOztJQUNqQyxzQ0FBa0M7O0lBQ2xDLG9DQUE0Qjs7SUFDNUIsa0NBQThCOztJQUM5QixtQ0FBOEI7O0lBQzlCLHFDQUE2Qjs7SUFDN0IsMkNBQW1DOztJQUNuQyxxQ0FBNkI7O0lBQzdCLG1DQUEyQjs7SUFDM0IscUNBQWlDOztJQUNqQyxvQ0FBNEI7O0lBQzVCLHVDQUErQjs7SUFDL0IscUNBQTZCOztJQUM3QixtQ0FBMkI7O0lBQzNCLHlDQUFpQzs7SUFDakMsb0NBQTRCOztJQUM1QixvQ0FBaUM7O0lBQ2pDLDBDQUEyQzs7SUFFM0MsNENBQThCOztJQUM5QiwwQ0FBNEI7Ozs7O0lBRTVCLG9DQUFvQjs7Ozs7SUFDcEIsdUNBQXVCOzs7OztJQUN2Qiw0Q0FBK0I7Ozs7O0lBRW5CLHlDQUFpRDs7Ozs7SUFDakQscUNBQStCOzs7OztJQUMvQixvQ0FBOEI7Ozs7O0lBQzlCLHVDQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IHRvVVRDIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGF0ZSc7XG5cbmltcG9ydCB7IEFsaWFzLCBNb2RlbCB9IGZyb20gJ3RzbW9kZWxzJztcblxuaW1wb3J0IHsgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgaXNPYnNlcnZhYmxlIH0gZnJvbSAncnhqcy9pbnRlcm5hbC91dGlsL2lzT2JzZXJ2YWJsZSc7XG5cbmltcG9ydCB7IGlzRnVuY3Rpb24sIGlzT2JqZWN0LCB0b1N0cmluZywgY2xvbmUsIGZpbHRlciB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBpc0RhdGUsIGlzVmFsaWQsIHBhcnNlIH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZyB9IGZyb20gJy4vZmlsdGVyLWNvbmZpZyc7XG5pbXBvcnQgeyBJRmlsdGVyQ29uZmlnSXRlbSB9IGZyb20gJy4uL2ludGVyZmFjZXMvaXRlbS1jb25maWcuaW50ZXJmYWNlJztcblxuXG5leHBvcnQgZW51bSBJdGVtVHlwZSB7XG4gIFRleHQgICAgICAgICAgICA9ICd0ZXh0JyxcbiAgU2VsZWN0ICAgICAgICAgID0gJ3NlbGVjdCcsXG4gIFJhbmdlICAgICAgICAgICA9ICdyYW5nZScsXG4gIERhdGUgICAgICAgICAgICA9ICdkYXRlJyxcbiAgRGF0ZVRpbWUgICAgICAgID0gJ2RhdGV0aW1lJyxcbiAgRGF0ZVJhbmdlICAgICAgID0gJ2RhdGVyYW5nZScsXG4gIERhdGVUaW1lUmFuZ2UgICA9ICdkYXRldGl