@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
281 lines (280 loc) • 18.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { cloneDeep as cloneDeepExt } from 'lodash';
import { isObservable, of, from } from 'rxjs';
/**
* @param {?} array
* @param {?} mapper
* @return {?}
*/
export function map(array, mapper) {
if (array) {
return array.map(mapper);
}
return array;
}
/**
* @param {?} array
* @param {?} iteratee
* @return {?}
*/
export function filter(array, iteratee) {
if (array) {
return array.filter(iteratee);
}
return array;
}
/**
* @param {?} array
* @return {?}
*/
export function isArray(array) {
return Array.isArray(array);
}
/**
* @param {?} howManyTimes
* @param {?} iteratee
* @return {?}
*/
export function times(howManyTimes, iteratee) {
/** @type {?} */
var res = [];
/** @type {?} */
var index = -1;
while (++index < howManyTimes) {
res.push(iteratee(index));
}
return res;
}
/**
* @param {?} array
* @param {?} iteratee
* @return {?}
*/
export function forEach(array, iteratee) {
if (array) {
array.forEach(iteratee);
}
}
/**
* @param {?} array
* @param {?} iteratee
* @return {?}
*/
export function remove(array, iteratee) {
/** @type {?} */
var deletedItems = [];
if (array) {
/** @type {?} */
var index = array.length;
while (index--) {
/** @type {?} */
var item = array[index];
if (iteratee(item, index)) {
array.splice(index, 1);
deletedItems.push(item);
}
}
}
return deletedItems;
}
/**
* @param {?} array
* @param {?} index
* @return {?}
*/
export function removeAtIndex(array, index) {
if (array) {
array.splice(index, 1);
}
}
/**
* @param {?} object
* @param {?} path
* @param {?=} defaultVal
* @return {?}
*/
export function get(object, path, defaultVal) {
/** @type {?} */
var _path = Array.isArray(path)
? path
: path.split('.').filter(function (index) { return index.length; });
if (!_path.length) {
return object === undefined ? defaultVal : object;
}
return get(object[_path.shift()], _path, defaultVal);
}
/**
* @param {?} array
* @param {?} finder
* @return {?}
*/
export function find(array, finder) {
if (array) {
return array.find(finder);
}
return undefined;
}
/**
* @param {?} value
* @param {?} maxLength
* @return {?}
*/
export function truncate(value, maxLength) {
if (value) {
return value.substring(0, maxLength);
}
return value;
}
/**
* @param {?} items
* @param {?} what
* @return {?}
*/
export function indexOf(items, what) {
if (items) {
return items.indexOf(what);
}
return -1;
}
/**
* @param {...?} arrays
* @return {?}
*/
export function concat() {
var arrays = [];
for (var _i = 0; _i < arguments.length; _i++) {
arrays[_i] = arguments[_i];
}
/** @type {?} */
var newArray = [];
arrays.forEach(function (array) {
newArray = newArray.concat(array);
});
return newArray;
}
/**
* @param {?} str
* @param {?} reg
* @param {?} newVal
* @return {?}
*/
export function replace(str, reg, newVal) {
if (str) {
return str.replace(reg, newVal);
}
return str;
}
/**
* @param {?} array
* @param {?} key
* @param {?} asc
* @return {?}
*/
export function orderBy(array, key, asc) {
/** @type {?} */
var order = asc === 'asc' ? -1 : 1;
array.sort(function (a, b) {
if (!a[key] && !b[key]) {
return 0;
}
else if (a[key] && !b[key]) {
return -1;
}
else if (!a[key] && b[key]) {
return 1;
}
else if (a[key] < b[key]) {
return order;
}
else if (a[key] > b[key]) {
return -order;
}
return 0;
});
return array;
}
/**
* @param {?} array
* @param {?} key
* @param {?} asc
* @return {?}
*/
export function orderByWithoutCase(array, key, asc) {
/** @type {?} */
var order = asc === 'asc' ? -1 : 1;
array.sort(function (a, b) {
if (!a[key] && !b[key]) {
return 0;
}
else if (a[key] && !b[key]) {
return -1;
}
else if (!a[key] && b[key]) {
return 1;
}
/** @type {?} */
var value1 = a[key].toLowerCase();
/** @type {?} */
var value2 = b[key].toLowerCase();
if (value1 < value2) {
return order;
}
else if (value1 > value2) {
return -order;
}
return 0;
});
return array;
}
/**
* @param {?} object
* @return {?}
*/
export function cloneDeep(object) {
return cloneDeepExt(object);
}
/**
* @param {?} item
* @return {?}
*/
export function isEmpty(item) {
return item == null || item.length === 0;
}
/**
* @param {?} val
* @return {?}
*/
export function isObject(val) {
return typeof val === 'object';
}
/**
* @param {?} items
* @param {?} separator
* @return {?}
*/
export function join(items, separator) {
if (items) {
return items.join(separator);
}
return items;
}
/**
* @template T
* @param {?} obs
* @return {?}
*/
export function observe(obs) {
if (isObservable(obs)) {
return obs;
}
else if (obs instanceof Promise) {
return from(obs);
}
else {
return of(/** @type {?} */ (obs));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvbmF0aXZlLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsSUFBSSxZQUFZLEVBQUMsTUFBTyxRQUFRLENBQUE7QUFDbEQsT0FBTyxFQUFjLFlBQVksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFFMUQsTUFBTSxjQUFjLEtBQWlCLEVBQUUsTUFBMkM7SUFDaEYsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzFCO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQztDQUNkOzs7Ozs7QUFFRCxNQUFNLGlCQUFpQixLQUFpQixFQUFFLFFBQTZDO0lBQ3JGLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDVixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUMvQjtJQUNELE1BQU0sQ0FBQyxLQUFLLENBQUM7Q0FDZDs7Ozs7QUFFRCxNQUFNLGtCQUFrQixLQUFVO0lBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0NBQzdCOzs7Ozs7QUFFRCxNQUFNLGdCQUFnQixZQUFvQixFQUFFLFFBQThCOztJQUN4RSxJQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7O0lBQ2YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDZixPQUFPLEVBQUUsS0FBSyxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDM0I7SUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDO0NB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QUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUNkO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUNmO1FBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUNWLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUM7Q0FDZDs7Ozs7OztBQUVELE1BQU0sNkJBQTZCLEtBQWlCLEVBQUUsR0FBVyxFQUFFLEdBQW1COztJQUNwRixJQUFNLEtBQUssR0FBRyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQztRQUVkLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ1Y7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDWDtRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDVjs7UUFFRCxJQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7O1FBQ3BDLElBQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2Q7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2Y7UUFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQ1YsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQztDQUNkOzs7OztBQUVELE1BQU0sb0JBQW9CLE1BQVc7SUFDbkMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztDQUM3Qjs7Ozs7QUFFRCxNQUFNLGtCQUFrQixJQUFTO0lBQy9CLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFBO0NBQ3pDOzs7OztBQUVELE1BQU0sbUJBQW1CLEdBQVE7SUFDL0IsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQztDQUNoQzs7Ozs7O0FBRUQsTUFBTSxlQUFlLEtBQWlCLEVBQUUsU0FBaUI7SUFDdkQsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQzlCO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQztDQUNkOzs7Ozs7QUFFRCxNQUFNLGtCQUFxQixHQUErQjtJQUN4RCxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxHQUFHLENBQUM7S0FDWjtJQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2xCO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDTixNQUFNLENBQUMsRUFBRSxtQkFBTSxHQUFHLEVBQUMsQ0FBQztLQUNyQjtDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2xvbmVEZWVwIGFzIGNsb25lRGVlcEV4dH0gIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IE9ic2VydmFibGUsIGlzT2JzZXJ2YWJsZSwgb2YsIGZyb20gfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1hcChhcnJheTogQXJyYXk8YW55PiwgbWFwcGVyOiAodmFsdWU6IGFueSwgaW5kZXg/OiBudW1iZXIpID0+IGFueSkge1xuICBpZiAoYXJyYXkpIHtcbiAgICByZXR1cm4gYXJyYXkubWFwKG1hcHBlcik7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyKGFycmF5OiBBcnJheTxhbnk+LCBpdGVyYXRlZTogKHZhbHVlOiBhbnksIGluZGV4PzogbnVtYmVyKSA9PiBhbnkpIHtcbiAgaWYgKGFycmF5KSB7XG4gICAgcmV0dXJuIGFycmF5LmZpbHRlcihpdGVyYXRlZSk7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheShhcnJheTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFycmF5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVzKGhvd01hbnlUaW1lczogbnVtYmVyLCBpdGVyYXRlZTogKHZhbHVlPzogYW55KSA9PiBhbnkpIHtcbiAgY29uc3QgcmVzID0gW107XG4gIGxldCBpbmRleCA9IC0xO1xuICB3aGlsZSAoKytpbmRleCA8IGhvd01hbnlUaW1lcykge1xuICAgIHJlcy5wdXNoKGl0ZXJhdGVlKGluZGV4KSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2goYXJyYXk6IEFycmF5PGFueT4sIGl0ZXJhdGVlOiAodmFsdWU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4gYW55KSB7XG4gIGlmIChhcnJheSkge1xuICAgIGFycmF5LmZvckVhY2goaXRlcmF0ZWUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmUoYXJyYXk6IEFycmF5PGFueT4sIGl0ZXJhdGVlOiAodmFsdWU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4gYW55KSB7XG4gIGxldCBkZWxldGVkSXRlbXMgPSBbXTtcbiAgaWYgKGFycmF5KSB7XG4gICAgbGV0IGluZGV4ID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBjb25zdCBpdGVtID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZW0sIGluZGV4KSkge1xuICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBkZWxldGVkSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlbGV0ZWRJdGVtcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUF0SW5kZXgoYXJyYXk6IEFycmF5PGFueT4sIGluZGV4OiBudW1iZXIpIHtcbiAgaWYgKGFycmF5KSB7XG4gICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KG9iamVjdDogYW55LCBwYXRoOiBhbnksIGRlZmF1bHRWYWw/OiBhbnkpOiBhbnkge1xuICBjb25zdCBfcGF0aCA9IEFycmF5LmlzQXJyYXkocGF0aClcbiAgICA/IHBhdGhcbiAgICA6IHBhdGguc3BsaXQoJy4nKS5maWx0ZXIoKGluZGV4OiBhbnkpID0+IGluZGV4Lmxlbmd0aClcblxuICBpZiAoIV9wYXRoLmxlbmd0aCkge1xuICAgIHJldHVybiBvYmplY3QgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWwgOiBvYmplY3RcbiAgfVxuXG4gIHJldHVybiBnZXQob2JqZWN0W19wYXRoLnNoaWZ0KCldLCBfcGF0aCwgZGVmYXVsdFZhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kKGFycmF5OiBBcnJheTxhbnk+LCBmaW5kZXI6ICh2YWx1ZTogYW55LCBpbmRleDogbnVtYmVyLCBvYmo6IGFueVtdKSA9PiBib29sZWFuKSB7XG4gIGlmIChhcnJheSkge1xuICAgIHJldHVybiBhcnJheS5maW5kKGZpbmRlcik7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlKHZhbHVlOiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyKSB7XG4gIGlmICh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZGV4T2YoaXRlbXM6IGFueSwgd2hhdDogYW55KSB7XG4gIGlmIChpdGVtcykge1xuICAgIHJldHVybiBpdGVtcy5pbmRleE9mKHdoYXQpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdCguLi5hcnJheXM6IGFueVtdKSB7XG4gIGxldCBuZXdBcnJheTogQXJyYXk8YW55PiA9IFtdO1xuICBhcnJheXMuZm9yRWFjaCgoYXJyYXkpID0+IHtcbiAgICBuZXdBcnJheSA9IG5ld0FycmF5LmNvbmNhdChhcnJheSk7XG4gIH0pO1xuICByZXR1cm4gbmV3QXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlKHN0cjogc3RyaW5nLCByZWc6IFJlZ0V4cCwgbmV3VmFsOiBzdHJpbmcpIHtcbiAgaWYgKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZShyZWcsIG5ld1ZhbCk7XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9yZGVyQnkoYXJyYXk6IEFycmF5PGFueT4sIGtleTogc3RyaW5nLCBhc2M6ICdhc2MnIHwgJ2Rlc2MnKSB7XG4gIGNvbnN0IG9yZGVyID0gYXNjID09PSAnYXNjJyA/IC0xIDogMTtcbiAgYXJyYXkuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmICghYVtrZXldICYmICFiW2tleV0pIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoYVtrZXldICYmICFiW2tleV0pIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKCFhW2tleV0gJiYgYltrZXldKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGFba2V5XSA8IGJba2V5XSkge1xuICAgICAgcmV0dXJuIG9yZGVyO1xuICAgIH0gZWxzZSBpZiAoYVtrZXldID4gYltrZXldKSB7XG4gICAgICByZXR1cm4gLW9yZGVyO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSk7XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9yZGVyQnlXaXRob3V0Q2FzZShhcnJheTogQXJyYXk8YW55Piwga2V5OiBzdHJpbmcsIGFzYzogJ2FzYycgfCAnZGVzYycpIHtcbiAgY29uc3Qgb3JkZXIgPSBhc2MgPT09ICdhc2MnID8gLTEgOiAxO1xuICBhcnJheS5zb3J0KChhLCBiKSA9PiB7XG5cbiAgICBpZiAoIWFba2V5XSAmJiAhYltrZXldKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGFba2V5XSAmJiAhYltrZXldKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmICghYVtrZXldICYmIGJba2V5XSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUxID0gYVtrZXldLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdmFsdWUyID0gYltrZXldLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbHVlMSA8IHZhbHVlMikge1xuICAgICAgcmV0dXJuIG9yZGVyO1xuICAgIH0gZWxzZSBpZiAodmFsdWUxID4gdmFsdWUyKSB7XG4gICAgICByZXR1cm4gLW9yZGVyO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSk7XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lRGVlcChvYmplY3Q6IGFueSkge1xuICByZXR1cm4gY2xvbmVEZWVwRXh0KG9iamVjdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KGl0ZW06IGFueSkge1xuICByZXR1cm4gaXRlbSA9PSBudWxsIHx8IGl0ZW0ubGVuZ3RoID09PSAwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCh2YWw6IGFueSkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ29iamVjdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqb2luKGl0ZW1zOiBBcnJheTxhbnk+LCBzZXBhcmF0b3I6IHN0cmluZykge1xuICBpZiAoaXRlbXMpIHtcbiAgICByZXR1cm4gaXRlbXMuam9pbihzZXBhcmF0b3IpO1xuICB9XG4gIHJldHVybiBpdGVtcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmU8VD4ob2JzOiBQcm9taXNlPFQ+IHwgT2JzZXJ2YWJsZTxUPik6IE9ic2VydmFibGU8VD4ge1xuICBpZiAoaXNPYnNlcnZhYmxlKG9icykpIHtcbiAgICByZXR1cm4gb2JzO1xuICB9IGVsc2UgaWYgKG9icyBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICByZXR1cm4gZnJvbShvYnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBvZig8YW55Pm9icyk7XG4gIH1cbn1cbiJdfQ==