UNPKG

ngx-mat-lib

Version:

A bunch of utilities and components to use in your Angular 7+ apps!

787 lines (786 loc) 64.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from "@angular/core"; import { convertToParamMap } from "@angular/router"; import { MatDialog, MatDialogConfig, MatSnackBar, MatSnackBarConfig } from "@angular/material"; import { XmatConfirmDialogComponent, XmatAlertDialogComponent } from "../components/xmat-dialog/index"; import { XmatAlertTypes, XmatSnackBarDataTypes } from "../models/index"; import { XmatConstantsService, XMAT_CONSTANT_LABELS } from "./xmat-constants.service"; import { XmatSnackBarComponent } from "../components/xmat-snack-bar/index"; import { Observable, forkJoin } from "rxjs"; import { map } from "rxjs/operators"; import { each, includes, extend } from "lodash"; import { parseZone as moment } from "moment"; /** @typedef {?} */ var XmatObservablesMap; /** @type {?} */ var colorParams = { center: 128, diversity: 10, width: 127 }; /** @type {?} */ var hexValues = "0123456789ABCDEF"; /** @type {?} */ var byte2Hex = function (n) { // tslint:disable-next-line:no-bitwise return String(hexValues.substr((n >> 4) & 0x0F, 1)) + hexValues.substr(n & 0x0F, 1); }; var ɵ0 = byte2Hex; /** @type {?} */ var rgb2Hex = function (r, g, b) { return "#" + byte2Hex(r) + byte2Hex(g) + byte2Hex(b); }; var ɵ1 = rgb2Hex; /** @type {?} */ var eachEnum = function (srcEnum, iteratee) { /** @type {?} */ var target = []; each(srcEnum, function (key) { // Continue if key is not a number if (typeof srcEnum[key] !== typeof 0) { return true; } target.push(srcEnum[key]); }); return each(target, iteratee); }; var ɵ2 = eachEnum; /** * THIS SERVICE REQUIRES 3 DEPENDENCIES: * XmatConstantsService, XmatSnackBarModule and XmatDialogModule */ var XmatFunctionsService = /** @class */ (function () { function XmatFunctionsService(_dialog, _snackBar, _xmatConstants) { this._dialog = _dialog; this._snackBar = _snackBar; this._xmatConstants = _xmatConstants; this._confirmDialogDefaults = { confirmText: XMAT_CONSTANT_LABELS.confirm, cancelText: XMAT_CONSTANT_LABELS.cancel, dialogContent: XMAT_CONSTANT_LABELS.proceed, hideCancelButton: false, confirmColor: "warn", title: XMAT_CONSTANT_LABELS.warningTitle }; this._colorDb = { factor: colorParams.width + colorParams.center, frequency: Math.PI * 2 / colorParams.diversity, generated: [] }; this._defaultAlertData = { type: XmatAlertTypes.warning, title: XMAT_CONSTANT_LABELS.warningTitle, confirmText: XMAT_CONSTANT_LABELS.confirm, cancelText: XMAT_CONSTANT_LABELS.cancel }; } /** * PUBLIC FUNCTIONS */ /** * PUBLIC FUNCTIONS * @param {?} n * @return {?} */ XmatFunctionsService.prototype.addLeadingZeroes = /** * PUBLIC FUNCTIONS * @param {?} n * @return {?} */ function (n) { return ("0" + n).slice(-2); }; /** * @param {?} source * @param {?=} level * @return {?} */ XmatFunctionsService.prototype.createReflectionModel = /** * @param {?} source * @param {?=} level * @return {?} */ function (source, level) { if (level === void 0) { level = 0; } // For both arrays and objects if (!!source && typeof source === typeof {}) { /** @type {?} */ var target = Array.isArray(source) ? [] : {}; /** @type {?} */ var sourceKeys = Object.keys(source); // new Object(); for (var i = 0; i < sourceKeys.length; i++) { /** @type {?} */ var key = sourceKeys[i]; // Always create new key on the target, it will eventually be converted to object // For both arrays and objects return target[key] = this.createReflectionModel(source[key], level + 1); } return target; } else { return void 0; } }; /** * @param {?=} date * @param {?=} months * @return {?} */ XmatFunctionsService.prototype.dateAddMonths = /** * @param {?=} date * @param {?=} months * @return {?} */ function (date, months) { if (date === void 0) { date = new Date(); } if (months === void 0) { months = 0; } /** @type {?} */ var day = date.getDate(); date.setMonth(date.getMonth() + +months); if (date.getDate() !== day) { date.setDate(0); } return date; }; /** * @param {?} srcEnum * @param {?} iteratee * @return {?} */ XmatFunctionsService.prototype.eachEnum = /** * @param {?} srcEnum * @param {?} iteratee * @return {?} */ function (srcEnum, iteratee) { return eachEnum(srcEnum, iteratee); }; /** * @template T * @param {?} array * @param {?} index * @param {?} iteratee * @return {?} */ XmatFunctionsService.prototype.eachFrom = /** * @template T * @param {?} array * @param {?} index * @param {?} iteratee * @return {?} */ function (array, index, iteratee) { if (!Array.isArray(array)) { console.error("eachFrom only accept arrays as source, found instead " + typeof array); return array; } /** @type {?} */ var _index = index == null ? -1 : index; /** @type {?} */ var length = array == null ? 0 : array.length; while (++_index < length) { if (iteratee(array[_index], _index, array) === false) { break; } } return array; }; /** * @param {?=} queryString * @return {?} */ XmatFunctionsService.prototype.extractQueryParams = /** * @param {?=} queryString * @return {?} */ function (queryString) { if (queryString === void 0) { queryString = location.search; } /** @type {?} */ var query = {}; /** @type {?} */ var pairs = (queryString[0] === "?" ? queryString.substr(1) : queryString).split("&"); each(pairs, function (pair) { /** @type {?} */ var key = decodeURIComponent(pair.split("=")[0]); if (!!key) { query[key] = decodeURIComponent(pair.split("=")[1] || ""); } }); return convertToParamMap(query); }; /** * @param {?} original * @param {?=} exclude * @return {?} */ XmatFunctionsService.prototype.filterProps = /** * @param {?} original * @param {?=} exclude * @return {?} */ function (original, exclude) { if (exclude === void 0) { exclude = []; } if (original !== Object(original)) { console.error("TidUtils => Argument was not valid object", original); return; } if (Array.isArray(exclude) && exclude.length) { return Object.keys(original).reduce(function (obj, key) { if (!includes(exclude, key)) { obj[key] = original[key]; } return obj; }, {}); } return original; }; /** * This function generates vibrant, "evenly spaced" colours (i.e. no clustering). * This is ideal for creating easily distinguishable vibrant markers in Google Maps and other apps. * */ /** * This function generates vibrant, "evenly spaced" colours (i.e. no clustering). * This is ideal for creating easily distinguishable vibrant markers in Google Maps and other apps. * * @param {?=} steps * @param {?=} step * @return {?} */ XmatFunctionsService.prototype.getRainbow = /** * This function generates vibrant, "evenly spaced" colours (i.e. no clustering). * This is ideal for creating easily distinguishable vibrant markers in Google Maps and other apps. * * @param {?=} steps * @param {?=} step * @return {?} */ function (steps, step) { if (steps === void 0) { steps = 10; } if (step === void 0) { step = 0; } /** @type {?} */ var r; /** @type {?} */ var g; /** @type {?} */ var b; /** @type {?} */ var h = step / steps; /** @type {?} */ var i = ~~(h * 6); /** @type {?} */ var f = h * 6 - i; /** @type {?} */ var q = 1 - f; switch (i % 6) { case 0: r = 1, g = f, b = 0; break; case 1: r = q, g = 1, b = 0; break; case 2: r = 0, g = 1, b = f; break; case 3: r = 0, g = q, b = 1; break; case 4: r = f, g = 0, b = 1; break; case 5: r = 1, g = 0, b = q; break; } /** @type {?} */ var red = ("00" + (~~(r * 255)).toString(16)).slice(-2); /** @type {?} */ var green = ("00" + (~~(g * 255)).toString(16)).slice(-2); /** @type {?} */ var blue = ("00" + (~~(b * 255)).toString(16)).slice(-2); return ("#" + red + green + blue); }; /** * @param {?=} phase * @return {?} */ XmatFunctionsService.prototype.getRandomNonConsecutiveHex = /** * @param {?=} phase * @return {?} */ function (phase) { if (phase === void 0) { phase = 10; } /** @type {?} */ var index = this._colorDb.generated.length + 1; /** @type {?} */ var red = Math.sin(this._colorDb.frequency * index + 2 + phase) * this._colorDb.factor; /** @type {?} */ var green = Math.sin(this._colorDb.frequency * index + phase) * this._colorDb.factor; /** @type {?} */ var blue = Math.sin(this._colorDb.frequency * index + 4 + phase) * this._colorDb.factor; /** @type {?} */ var result = rgb2Hex(red, green, blue); this._colorDb.generated.push(result); return result; }; /** * @param {?} value * @return {?} */ XmatFunctionsService.prototype.isNumeric = /** * @param {?} value * @return {?} */ function (value) { return !isNaN(parseInt(value, 10)); }; /** * @param {?} value * @return {?} */ XmatFunctionsService.prototype.isValidLength = /** * @param {?} value * @return {?} */ function (value) { return this.isNumeric(value) && value >= 0; }; /** * @param {?} title * @param {?} msg * @param {?} color * @param {?} content * @return {?} */ XmatFunctionsService.prototype.logWithStyle = /** * @param {?} title * @param {?} msg * @param {?} color * @param {?} content * @return {?} */ function (title, msg, color, content) { console.group(title || ""); console.log("%c" + msg, "color: " + color, content); console.groupEnd(); }; /** * * @param source the source object * @param keys allows to order the result and/or include only certain props */ /** * * @template T * @param {?} source the source object * @param {?=} keys allows to order the result and/or include only certain props * @param {?=} keepVoid * @return {?} */ XmatFunctionsService.prototype.objectToArray = /** * * @template T * @param {?} source the source object * @param {?=} keys allows to order the result and/or include only certain props * @param {?=} keepVoid * @return {?} */ function (source, keys, keepVoid) { if (keys === void 0) { keys = Object.keys(source); } if (keepVoid === void 0) { keepVoid = !1; } /** @type {?} */ var result = []; each(keys, function (k) { source[k] !== void 0 && result.push({ description: k, value: source[k] }); }); return result; }; /** * @param {?=} data * @param {?=} returnRef * @return {?} */ XmatFunctionsService.prototype.openAlertDialog = /** * @param {?=} data * @param {?=} returnRef * @return {?} */ function (data, // tslint:disable-next-line:max-line-length returnRef) { if (data === void 0) { data = this._defaultAlertData; } if (returnRef === void 0) { returnRef = false; } data = extend({}, this._defaultAlertData, data); /** @type {?} */ var dialogConfig = new MatDialogConfig(); extend(dialogConfig, { id: data.dialogId, width: this._xmatConstants.dialogOptions.defaultWidth, data: data, disableClose: true }); /** @type {?} */ var dialogRef = this._dialog.open(XmatAlertDialogComponent, dialogConfig); if (returnRef) { return dialogRef; } else { return new Observable(function (observer) { // Catch result dialogRef.afterClosed().subscribe(function (result) { observer.next(result); observer.complete(); }); }); } }; /** * @param {?=} data * @param {?=} disableClose * @param {?=} width * @param {?=} returnRef * @return {?} */ XmatFunctionsService.prototype.openConfirmDialog = /** * @param {?=} data * @param {?=} disableClose * @param {?=} width * @param {?=} returnRef * @return {?} */ function (data, disableClose, width, // tslint:disable-next-line:max-line-length returnRef) { if (disableClose === void 0) { disableClose = false; } if (width === void 0) { width = this._xmatConstants.dialogOptions.defaultWidth; } if (returnRef === void 0) { returnRef = false; } /** @type {?} */ var dialogConfig = new MatDialogConfig(); extend(dialogConfig, { id: data.dialogId, width: width, data: /** @type {?} */ (tslib_1.__assign({}, this._confirmDialogDefaults, data)), disableClose: disableClose }); /** @type {?} */ var dialogRef = this._dialog.open(XmatConfirmDialogComponent, dialogConfig); if (returnRef) { return dialogRef; } else { return new Observable(function (observer) { // Catch result dialogRef.afterClosed().subscribe(function (result) { observer.next(result); observer.complete(); }); }); } }; /** * @param {?} value * @return {?} */ XmatFunctionsService.prototype.parseDate = /** * @param {?} value * @return {?} */ function (value) { if (!value) { return void 0; } /** @type {?} */ var momentDate = moment(value); if (!momentDate.isValid()) { return this._parseDateFallback(value); } return moment(momentDate).toDate(); }; /** * @param {?} source * @return {?} */ XmatFunctionsService.prototype.readAsUrl = /** * @param {?} source * @return {?} */ function (source) { return new Observable(function (observer) { /** @type {?} */ var reader = new FileReader(); reader.onload = function (event) { observer.next(event); observer.complete(); }; reader.onerror = reader.onabort = function () { observer.error(!1); }; reader.readAsDataURL(source); }); }; /** * @param {?} haystack * @param {?} mapObj * @return {?} */ XmatFunctionsService.prototype.replaceAll = /** * @param {?} haystack * @param {?} mapObj * @return {?} */ function (haystack, mapObj) { /** @type {?} */ var regExp = new RegExp(Object.keys(mapObj).join("|"), "gi"); return haystack.replace(regExp, function (matched) { return mapObj[matched.toLowerCase()]; }); }; /** * @param {?=} data * @return {?} */ XmatFunctionsService.prototype.showSnackBar = /** * @param {?=} data * @return {?} */ function (data) { if (data === void 0) { data = { message: "-", showAction: false }; } return this._snackBar.openFromComponent(XmatSnackBarComponent, extend(new MatSnackBarConfig(), { data: data, duration: data.duration || 5000, panelClass: ["xmat-snack", data.type] })); }; /** * Shortcut to open an XmatAlertDialog passing only an error message * @param msg */ /** * Shortcut to open an XmatAlertDialog passing only an error message * @param {?=} msg * @param {?=} duration * @return {?} */ XmatFunctionsService.prototype.showErrorSnackBar = /** * Shortcut to open an XmatAlertDialog passing only an error message * @param {?=} msg * @param {?=} duration * @return {?} */ function (msg, duration) { if (msg === void 0) { msg = this._xmatConstants.labels.genericError; } if (duration === void 0) { duration = 5000; } return this.showSnackBar({ showAction: !1, message: msg, duration: duration, type: XmatSnackBarDataTypes.fail }); }; /** * Shortcut to open an XmatAlertDialog passing only an error message * @param msg */ /** * Shortcut to open an XmatAlertDialog passing only an error message * @param {?=} msg * @return {?} */ XmatFunctionsService.prototype.showErrorAlert = /** * Shortcut to open an XmatAlertDialog passing only an error message * @param {?=} msg * @return {?} */ function (msg) { if (msg === void 0) { msg = this._xmatConstants.labels.genericError; } return this.openAlertDialog(/** @type {?} */ ({ type: XmatAlertTypes.error, title: this._xmatConstants.labels.errorTitle, dialogContent: msg, hideCancelButton: !0, hideConfirmButton: !1, confirmText: this._xmatConstants.labels.close })); }; /** * Returns a formatted string using the first argument as a printf-like format. * * The first argument is a string that contains zero or more placeholders. * Each placeholder is replaced with the converted value from its corresponding argument. * * Supported placeholders are: * * %s - String. * %d - Number (both integer and float). * %% - single percent sign ('%'). This does not consume an argument. */ /** * Returns a formatted string using the first argument as a printf-like format. * * The first argument is a string that contains zero or more placeholders. * Each placeholder is replaced with the converted value from its corresponding argument. * * Supported placeholders are: * * %s - String. * %d - Number (both integer and float). * %% - single percent sign ('%'). This does not consume an argument. * @param {...?} args * @return {?} */ XmatFunctionsService.prototype.sprintf = /** * Returns a formatted string using the first argument as a printf-like format. * * The first argument is a string that contains zero or more placeholders. * Each placeholder is replaced with the converted value from its corresponding argument. * * Supported placeholders are: * * %s - String. * %d - Number (both integer and float). * %% - single percent sign ('%'). This does not consume an argument. * @param {...?} args * @return {?} */ function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } /** @type {?} */ var index = 1; return (args[0] + "").replace(/%((\d)\$)?([sd%])/g, function (match, _group_, pos, _format_) { if (match === "%%") { return "%"; } if (typeof pos === "undefined") { pos = index++; } if (pos in args && pos > 0) { return args[pos]; } else { return match; } }); }; /** * @param {?} str * @return {?} */ XmatFunctionsService.prototype.stripEmojis = /** * @param {?} str * @return {?} */ function (str) { return str.replace(new RegExp(this._xmatConstants.regExps["emojis"], "g"), ""); }; /** * @param {?} str * @return {?} */ XmatFunctionsService.prototype.stripSpecialChars = /** * @param {?} str * @return {?} */ function (str) { return str.replace(new RegExp(this._xmatConstants.regExps["specialChars"], "g"), ""); }; /** * @template T * @param {?} source * @return {?} */ XmatFunctionsService.prototype.$qMap = /** * @template T * @param {?} source * @return {?} */ function (source) { /** @type {?} */ var queue = []; /** @type {?} */ var queueKeys = []; each(source, function (o, key) { queue.push(o); queueKeys.push(key); }); return forkJoin(queue) .pipe(map(function (raw) { /** @type {?} */ var mapped = {}; each(raw, function (value, index) { mapped[queueKeys[index]] = value; }); return /** @type {?} */ (mapped); })); }; /** * @template T * @param {?} source * @return {?} */ XmatFunctionsService.prototype.$qArray = /** * @template T * @param {?} source * @return {?} */ function (source) { /** @type {?} */ var queue = []; each(source, function (o) { queue.push(o); }); return forkJoin(queue); }; /** * @param {?} value * @return {?} */ XmatFunctionsService.prototype._parseDateFallback = /** * @param {?} value * @return {?} */ function (value) { if (typeof value === typeof 0 || !isNaN(+value)) { return new Date(+value); } else { return new Date(/** @type {?} */ (value)); } }; XmatFunctionsService.decorators = [ { type: Injectable } ]; /** @nocollapse */ XmatFunctionsService.ctorParameters = function () { return [ { type: MatDialog }, { type: MatSnackBar }, { type: XmatConstantsService } ]; }; return XmatFunctionsService; }()); export { XmatFunctionsService }; if (false) { /** @type {?} */ XmatFunctionsService.prototype._confirmDialogDefaults; /** @type {?} */ XmatFunctionsService.prototype._colorDb; /** @type {?} */ XmatFunctionsService.prototype._defaultAlertData; /** @type {?} */ XmatFunctionsService.prototype._dialog; /** @type {?} */ XmatFunctionsService.prototype._snackBar; /** @type {?} */ XmatFunctionsService.prototype._xmatConstants; } export { ɵ0, ɵ1, ɵ2 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1hdC1mdW5jdGlvbnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXQtbGliLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3htYXQtZnVuY3Rpb25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBb0IsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQ0gsU0FBUyxFQUNULGVBQWUsRUFDZixXQUFXLEVBQ1gsaUJBQWlCLEVBR3BCLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsT0FBTyxFQUNILDBCQUEwQixFQUMxQix3QkFBd0IsRUFDM0IsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBRUgsY0FBYyxFQU1kLHFCQUFxQixFQUV4QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsSUFBSSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7Ozs7QUFJN0MsSUFBTSxXQUFXLEdBQUc7SUFDaEIsTUFBTSxFQUFFLEdBQUc7SUFDWCxTQUFTLEVBQUUsRUFBRTtJQUNiLEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQzs7QUFFRixJQUFNLFNBQVMsR0FBVyxrQkFBa0IsQ0FBQzs7QUFFN0MsSUFBTSxRQUFRLEdBQUcsVUFB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RixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtZQUNWLEtBQUssQ0FBQztnQkFDRixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtZQUNWLEtBQUssQ0FBQztnQkFDRixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtZQUNWLEtBQUssQ0FBQztnQkFDRixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtZQUNWLEtBQUssQ0FBQztnQkFDRixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtZQUNWLEtBQUssQ0FBQztnQkFDRixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtTQUNiOztRQUVELElBQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRTFELElBQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRTVELElBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxH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SSxDQUFDLEdBQUcsRUFBRSxVQUFDLEtBQUssRUFBRSxLQUFLO2dCQUNuQixNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ3BDLENBQUMsQ0FBQztZQUVILHlCQUFPLE1BQVcsRUFBQztTQUN0QixDQUFDLENBQUMsQ0FBQztLQUNYOzs7Ozs7SUFFRCxzQ0FBTzs7Ozs7SUFBUCxVQUFpQixNQUF1Qjs7UUFDcEMsSUFBTSxLQUFLLEdBQW9CLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQUMsQ0FBZ0I7WUFDMUIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQixDQUFDLENBQUM7UUFFSCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMxQjs7Ozs7SUFJTyxpREFBa0I7Ozs7Y0FBQyxLQUFzQjtRQUM3QyxJQUFJLE9BQU8sS0FBSyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDN0MsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO2FBQ0k7WUFDRCxPQUFPLElBQUksSUFBSSxtQkFBUyxLQUFLLEVBQUMsQ0FBQztTQUNsQzs7O2dCQWphUixVQUFVOzs7O2dCQWxFUCxTQUFTO2dCQUVULFdBQVc7Z0JBcUJOLG9CQUFvQjs7K0JBMUI3Qjs7U0FzRWEsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBQYXJhbU1hcCwgUGFyYW1zLCBjb252ZXJ0VG9QYXJhbU1hcCB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7XG4gICAgTWF0RGlhbG9nLFxuICAgIE1hdERpYWxvZ0NvbmZpZyxcbiAgICBNYXRTbmFja0JhcixcbiAgICBNYXRTbmFja0JhckNvbmZpZyxcbiAgICBNYXRTbmFja0JhclJlZixcbiAgICBNYXREaWFsb2dSZWZcbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsXCI7XG4vL1xuaW1wb3J0IHtcbiAgICBYbWF0Q29uZmlybURpYWxvZ0NvbXBvbmVudCxcbiAgICBYbWF0QWxlcnREaWFsb2dDb21wb25lbnRcbn0gZnJvbSBcIi4uL2NvbXBvbmVudHMveG1hdC1kaWFsb2cvaW5kZXhcIjtcbmltcG9ydCB7XG4gICAgWG1hdEFsZXJ0RGlhbG9nRGF0YSxcbiAgICBYbWF0QWxlcnRUeXBlcyxcbiAgICBYbWF0QWxlcnREaWFsb2dBY3Rpb25zLFxuICAgIFhtYXRDb25maXJtRGlhbG9nRGF0YSxcbiAgICBYbWF0U25hY2tCYXJEYXRhLFxuICAgIFhtYXRGaWxlUmVhZGVyRXZlbnQsXG4gICAgWG1hdEdlbmVyaWNPYmplY3QsXG4gICAgWG1hdFNuYWNrQmFyRGF0YVR5cGVzLFxuICAgIFhtYXRTZWxlY3Rcbn0gZnJvbSBcIi4uL21vZGVscy9pbmRleFwiO1xuaW1wb3J0IHsgWG1hdENvbnN0YW50c1NlcnZpY2UsIFhNQVRfQ09OU1RBTlRfTEFCRUxTIH0gZnJvbSBcIi4veG1hdC1jb25zdGFudHMuc2VydmljZVwiO1xuaW1wb3J0IHsgWG1hdFNuYWNrQmFyQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMveG1hdC1zbmFjay1iYXIvaW5kZXhcIjtcbi8vXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBtYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IGVhY2gsIGluY2x1ZGVzLCBleHRlbmQgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBwYXJzZVpvbmUgYXMgbW9tZW50IH0gZnJvbSBcIm1vbWVudFwiO1xuXG50eXBlIFhtYXRPYnNlcnZhYmxlc01hcCA9IFhtYXRHZW5lcmljT2JqZWN0PE9ic2VydmFibGU8YW55Pj47XG5cbmNvbnN0IGNvbG9yUGFyYW1zID0ge1xuICAgIGNlbnRlcjogMTI4LFxuICAgIGRpdmVyc2l0eTogMTAsXG4gICAgd2lkdGg6IDEyN1xufTtcblxuY29uc3QgaGV4VmFsdWVzOiBzdHJpbmcgPSBcIjAxMjM0NTY3ODlBQkNERUZcIjtcblxuY29uc3QgYnl0ZTJIZXggPSAobikgPT4ge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgcmV0dXJuIFN0cmluZyhoZXhWYWx1ZXMuc3Vic3RyKChuID4+IDQpICYgMHgwRiwgMSkpICsgaGV4VmFsdWVzLnN1YnN0cihuICYgMHgwRiwgMSk7XG59O1xuXG5jb25zdCByZ2IySGV4ID0gKHIsIGcsIGIpID0+IHtcbiAgICByZXR1cm4gXCIjXCIgKyBieXRlMkhleChyKSArIGJ5dGUySGV4KGcpICsgYnl0ZTJIZXgoYik7XG59O1xuXG5jb25zdCBlYWNoRW51bSA9IChzcmNFbnVtLCBpdGVyYXRlZSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IFtdO1xuICAgIGVhY2goc3JjRW51bSwgKGtleSkgPT4ge1xuICAgICAgICAvLyBDb250aW51ZSBpZiBrZXkgaXMgbm90IGEgbnVtYmVyXG4gICAgICAgIGlmICh0eXBlb2Ygc3JjRW51bVtrZXldICE9PSB0eXBlb2YgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LnB1c2goc3JjRW51bVtrZXldKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZWFjaCh0YXJnZXQsIGl0ZXJhdGVlKTtcbn07XG5cbi8qKlxuICogVEhJUyBTRVJWSUNFIFJFUVVJUkVTIDMgREVQRU5ERU5DSUVTOlxuICogWG1hdENvbnN0YW50c1NlcnZpY2UsIFhtYXRTbmFja0Jhck1vZHVsZSBhbmQgWG1hdERpYWxvZ01vZHVsZVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgWG1hdEZ1bmN0aW9uc1NlcnZpY2Uge1xuXG4gICAgcHJvdGVjdGVkIF9jb25maXJtRGlhbG9nRGVmYXVsdHM6IFhtYXRDb25maXJtRGlhbG9nRGF0YSA9IHtcbiAgICAgICAgY29uZmlybVRleHQ6IFhNQVRfQ09OU1RBTlRfTEFCRUxTLmNvbmZpcm0sXG4gICAgICAgIGNhbmNlbFRleHQ6IFhNQVRfQ09OU1RBTlRfTEFCRUxTLmNhbmNlbCxcbiAgICAgICAgZGlhbG9nQ29udGVudDogWE1BVF9DT05TVEFOVF9MQUJFTFMucHJvY2VlZCxcbiAgICAgICAgaGlkZUNhbmNlbEJ1dHRvbjogZmFsc2UsXG4gICAgICAgIGNvbmZpcm1Db2xvcjogXCJ3YXJuXCIsXG4gICAgICAgIHRpdGxlOiBYTUFUX0NPTlNUQU5UX0xBQkVMUy53YXJuaW5nVGl0bGVcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfY29sb3JEYiA9IHtcbiAgICAgICAgZmFjdG9yOiBjb2xvclBhcmFtcy53aWR0aCArIGNvbG9yUGFyYW1zLmNlbnRlcixcbiAgICAgICAgZnJlcXVlbmN5OiBNYXRoLlBJICogMiAvIGNvbG9yUGFyYW1zLmRpdmVyc2l0eSxcbiAgICAgICAgZ2VuZXJhdGVkOiBbXVxuICAgIH07XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0QWxlcnREYXRhOiBYbWF0QWxlcnREaWFsb2dEYXRhID0ge1xuICAgICAgICB0eXBlOiBYbWF0QWxlcnRUeXBlcy53YXJuaW5nLFxuICAgICAgICB0aXRsZTogWE1BVF9DT05TVEFOVF9MQUJFTFMud2FybmluZ1RpdGxlLFxuICAgICAgICBjb25maXJtVGV4dDogWE1BVF9DT05TVEFOVF9MQUJFTFMuY29uZmlybSxcbiAgICAgICAgY2FuY2VsVGV4dDogWE1BVF9DT05TVEFOVF9MQUJFTFMuY2FuY2VsXG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgIHByb3RlY3RlZCBfc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgICAgICBwcm90ZWN0ZWQgX3htYXRDb25zdGFudHM6IFhtYXRDb25zdGFudHNTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUFVCTElDIEZVTkNUSU9OU1xuICAgICAqL1xuICAgIGFkZExlYWRpbmdaZXJvZXMobjogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIChcIjBcIiArIG4pLnNsaWNlKC0yKTtcbiAgICB9XG5cbiAgICBjcmVhdGVSZWZsZWN0aW9uTW9kZWwoc291cmNlLCBsZXZlbCA9IDApOiBhbnkge1xuICAgICAgICAvLyBGb3IgYm90aCBhcnJheXMgYW5kIG9iamVjdHNcbiAgICAgICAgaWYgKCEhc291cmNlICYmIHR5cGVvZiBzb3VyY2UgPT09IHR5cGVvZiB7fSkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gQXJyYXkuaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyAvLyBuZXcgT2JqZWN0KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjcmVhdGUgbmV3IGtleSBvbiB0aGUgdGFyZ2V0LCBpdCB3aWxsIGV2ZW50dWFsbHkgYmUgY29udmVydGVkIHRvIG9iamVjdFxuICAgICAgICAgICAgICAgIC8vIEZvciBib3RoIGFycmF5cyBhbmQgb2JqZWN0c1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XSA9IHRoaXMuY3JlYXRlUmVmbGVjdGlvbk1vZGVsKHNvdXJjZVtrZXldLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkYXRlQWRkTW9udGhzKGRhdGU6IERhdGUgPSBuZXcgRGF0ZSgpLCBtb250aHM6IG51bWJlciA9IDApOiBEYXRlIHtcbiAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIGRhdGUuc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgK21vbnRocyk7XG4gICAgICAgIGlmIChkYXRlLmdldERhdGUoKSAhPT0gZGF5KSB7XG4gICAgICAgICAgICBkYXRlLnNldERhdGUoMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZWFjaEVudW0oc3JjRW51bSwgaXRlcmF0ZWUpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiBlYWNoRW51bShzcmNFbnVtLCBpdGVyYXRlZSk7XG4gICAgfVxuXG4gICAgZWFjaEZyb208VCA9IGFueT4oYXJyYXk6IFRbXSwgaW5kZXg6IG51bWJlciwgaXRlcmF0ZWU6IChpdGVtOiBULCBpbmRleDogbnVtYmVyLCBzb3VyY2U6IFRbXSkgPT4gYW55KTogVFtdIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgZWFjaEZyb20gb25seSBhY2NlcHQgYXJyYXlzIGFzIHNvdXJjZSwgZm91bmQgaW5zdGVhZCAke3R5cGVvZiBhcnJheX1gKTtcbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bmFtaW5nLWNvbnZlbnRpb25cbiAgICAgICAgbGV0IF9pbmRleCA9IGluZGV4ID09IG51bGwgPyAtMSA6IGluZGV4O1xuICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoKytfaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpdGVyYXRlZShhcnJheVtfaW5kZXhdLCBfaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgZXh0cmFjdFF1ZXJ5UGFyYW1zKHF1ZXJ5U3RyaW5nID0gbG9jYXRpb24uc2VhcmNoKTogUGFyYW1NYXAge1xuICAgICAgICBjb25zdCBxdWVyeTogUGFyYW1zID0ge307XG4gICAgICAgIGNvbnN0IHBhaXJzID0gKHF1ZXJ5U3RyaW5nWzBdID09PSBcIj9cIiA/IHF1ZXJ5U3RyaW5nLnN1YnN0cigxKSA6IHF1ZXJ5U3RyaW5nKS5zcGxpdChcIiZcIik7XG4gICAgICAgIGVhY2gocGFpcnMsIHBhaXIgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc3BsaXQoXCI9XCIpWzBdKTtcbiAgICAgICAgICAgIGlmICghIWtleSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5W2tleV0gPSBkZWNvZGVVUklDb21wb25lbnQocGFpci5zcGxpdChcIj1cIilbMV0gfHwgXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udmVydFRvUGFyYW1NYXAocXVlcnkpO1xuICAgIH1cblxuICAgIGZpbHRlclByb3BzKG9yaWdpbmFsOiBYbWF0R2VuZXJpY09iamVjdCwgZXhjbHVkZTogc3RyaW5nW10gPSBbXSk6IFhtYXRHZW5lcmljT2JqZWN0IHtcbiAgICAgICAgaWYgKG9yaWdpbmFsICE9PSBPYmplY3Qob3JpZ2luYWwpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGlkVXRpbHMgPT4gQXJndW1lbnQgd2FzIG5vdCB2YWxpZCBvYmplY3RcIiwgb3JpZ2luYWwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhjbHVkZSkgJiYgZXhjbHVkZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvcmlnaW5hbC