@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
107 lines • 19.2 kB
JavaScript
import moment from 'moment';
import { DataField } from '../../models/abstract-data-field';
export var AbstractTimeInstanceFieldValidation;
(function (AbstractTimeInstanceFieldValidation) {
AbstractTimeInstanceFieldValidation["BETWEEN"] = "between";
AbstractTimeInstanceFieldValidation["WORKDAY"] = "workday";
AbstractTimeInstanceFieldValidation["WEEKEND"] = "weekend";
AbstractTimeInstanceFieldValidation["REQUIRED"] = "required";
AbstractTimeInstanceFieldValidation["VALID_BETWEEN"] = "validBetween";
AbstractTimeInstanceFieldValidation["VALID_WORKDAY"] = "validWorkday";
AbstractTimeInstanceFieldValidation["VALID_WEEKEND"] = "validWeekend";
})(AbstractTimeInstanceFieldValidation || (AbstractTimeInstanceFieldValidation = {}));
export class AbstractTimeInstanceField extends DataField {
min;
max;
constructor(stringId, title, value, behavior, placeholder, description, layout, validations, component, parentTaskId) {
super(stringId, title, value, behavior, placeholder, description, layout, validations, component, parentTaskId);
}
static isEqual(a, b, granularity) {
return (!a && !b) || (!!a && !!b && a.isSame(b, granularity));
}
/**
* Parse date from string:
* date is string 'past' - return string 'past'
* date is string 'future' - return string 'future'
* date is string 'today'/'now' - return moment instance of current date/time
* date is string build by combination of 'today'/'now'+/-ISO8601 (eg. today-P1DT1H) - return parsed moment instance of date
* date is string of specific date - return moment instance of this specific date
* @param date - string that should be parsed
*/
static parseDate(date) {
if (date.includes('past')) {
return 'past';
}
else if (date.includes('future')) {
return 'future';
}
else if (date.includes('today') || date.includes('now')) {
if (date.includes('+') || date.includes('-')) {
const difference = date.includes('+') ? date.split('+')[1] : date.split('-')[1];
if (date.includes('today')) {
return date.includes('+') ? moment().startOf('day').add(moment.duration(difference))
: moment().startOf('day').subtract(moment.duration(difference));
}
if (date.includes('now')) {
return date.includes('+') ? moment().add(moment.duration(difference)) : moment().subtract(moment.duration(difference));
}
}
return date.includes('today') ? moment().startOf('day') : moment();
}
else {
const newDate = moment(date);
return newDate.isValid ? newDate : null;
}
}
resolveValidations() {
const result = [];
this.validations.forEach(item => {
if (item.validationRule.includes(AbstractTimeInstanceFieldValidation.BETWEEN)) {
const tmp = item.validationRule.split(' ');
const ranges = tmp[1].split(',');
const start = AbstractTimeInstanceField.parseDate(ranges[0]);
const end = AbstractTimeInstanceField.parseDate(ranges[1]);
if (start && end) {
if (start === 'past' && moment(end).isValid()) {
result.push(this.validFromPast(moment(end)));
this.max = moment(end);
}
else if (end === 'future' && moment(start).isValid()) {
result.push(this.validToFuture(moment(start)));
this.min = moment(start);
}
else if (moment(start).isValid() && moment(end).isValid()) {
result.push(this.validBetween(moment(start), moment(end)));
this.min = moment(start);
this.max = moment(end);
}
}
}
else if (item.validationRule.includes(AbstractTimeInstanceFieldValidation.WORKDAY)) {
result.push(this.validWorkday);
}
else if (item.validationRule.includes(AbstractTimeInstanceFieldValidation.WEEKEND)) {
result.push(this.validWeekend);
}
});
return result;
}
validFromPast(range) {
return (fc) => fc.value > range ? { validBetween: true } : null;
}
validToFuture(range) {
return (fc) => fc.value < range ? { validBetween: true } : null;
}
validBetween(first, second) {
return (fc) => fc.value < first || fc.value > second ? { validBetween: true } : null;
}
validWorkday(fc) {
const dayOfWeek = !!fc.value ? fc.value.isoWeekday() : null;
return dayOfWeek === 6 || dayOfWeek === 7 ? { validWorkday: true } : null;
}
validWeekend(fc) {
const dayOfWeek = !!fc.value ? fc.value.isoWeekday() : null;
return dayOfWeek >= 1 && dayOfWeek <= 5 ? { validWeekend: true } : null;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtdGltZS1pbnN0YW5jZS1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvZGF0YS1maWVsZHMvdGltZS1pbnN0YW5jZS1hYnN0cmFjdC1maWVsZC9tb2RlbHMvYWJzdHJhY3QtdGltZS1pbnN0YW5jZS1maWVsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLE1BQWdCLE1BQU0sUUFBUSxDQUFDO0FBR3RDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUUzRCxNQUFNLENBQU4sSUFBWSxtQ0FRWDtBQVJELFdBQVksbUNBQW1DO0lBQzNDLDBEQUFtQixDQUFBO0lBQ25CLDBEQUFtQixDQUFBO0lBQ25CLDBEQUFtQixDQUFBO0lBQ25CLDREQUFxQixDQUFBO0lBQ3JCLHFFQUE4QixDQUFBO0lBQzlCLHFFQUE4QixDQUFBO0lBQzlCLHFFQUE4QixDQUFBO0FBQ2xDLENBQUMsRUFSVyxtQ0FBbUMsS0FBbkMsbUNBQW1DLFFBUTlDO0FBRUQsTUFBTSxPQUFnQix5QkFBMEIsU0FBUSxTQUFpQjtJQUU5RCxHQUFHLENBQVM7SUFDWixHQUFHLENBQVM7SUFFbkIsWUFBc0IsUUFBZ0IsRUFBRSxLQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWtCLEVBQUUsV0FBb0IsRUFDeEYsV0FBb0IsRUFBRSxNQUFlLEVBQUUsV0FBaUIsRUFBRSxTQUFxQixFQUFFLFlBQXFCO1FBQ3hILEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNwSCxDQUFDO0lBRU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLFdBQXVDO1FBQy9FLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFZO1FBQ2hDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2QixPQUFPLE1BQU0sQ0FBQztTQUNqQjthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNoQyxPQUFPLFFBQVEsQ0FBQztTQUNuQjthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3ZELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUNoRixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZFO2dCQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2lCQUMxSDthQUNKO1lBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3RFO2FBQU07WUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUMzQztJQUNMLENBQUM7SUFFUyxrQkFBa0I7UUFDeEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWxCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsbUNBQW1DLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzNFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUVqQyxNQUFNLEtBQUssR0FBRyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sR0FBRyxHQUFHLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFM0QsSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFO29CQUNkLElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7d0JBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3QyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDMUI7eUJBQU0sSUFBSSxHQUFHLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTt3QkFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUM1Qjt5QkFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7d0JBQ3pELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDM0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3pCLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUMxQjtpQkFDSjthQUNKO2lCQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsbUNBQW1DLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2xDO2lCQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsbUNBQW1DLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2xDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRVMsYUFBYSxDQUFDLEtBQWE7UUFDakMsT0FBTyxDQUFDLEVBQWUsRUFBaUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlHLENBQUM7SUFFUyxhQUFhLENBQUMsS0FBYTtRQUNqQyxPQUFPLENBQUMsRUFBZSxFQUFpQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDOUcsQ0FBQztJQUVTLFlBQVksQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUNoRCxPQUFPLENBQUMsRUFBZSxFQUFpQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkksQ0FBQztJQUVTLFlBQVksQ0FBQyxFQUFlO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDNUQsT0FBTyxTQUFTLEtBQUssQ0FBQyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUUsQ0FBQztJQUVTLFlBQVksQ0FBQyxFQUFlO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDNUQsT0FBTyxTQUFTLElBQUksQ0FBQyxJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUUsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCZWhhdmlvcn0gZnJvbSAnLi4vLi4vbW9kZWxzL2JlaGF2aW9yJztcbmltcG9ydCB7Rm9ybUNvbnRyb2wsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgbW9tZW50LCB7TW9tZW50fSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtMYXlvdXR9IGZyb20gJy4uLy4uL21vZGVscy9sYXlvdXQnO1xuaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJy4uLy4uL21vZGVscy9jb21wb25lbnQnO1xuaW1wb3J0IHtEYXRhRmllbGR9IGZyb20gJy4uLy4uL21vZGVscy9hYnN0cmFjdC1kYXRhLWZpZWxkJztcblxuZXhwb3J0IGVudW0gQWJzdHJhY3RUaW1lSW5zdGFuY2VGaWVsZFZhbGlkYXRpb24ge1xuICAgIEJFVFdFRU4gPSAnYmV0d2VlbicsXG4gICAgV09SS0RBWSA9ICd3b3JrZGF5JyxcbiAgICBXRUVLRU5EID0gJ3dlZWtlbmQnLFxuICAgIFJFUVVJUkVEID0gJ3JlcXVpcmVkJyxcbiAgICBWQUxJRF9CRVRXRUVOID0gJ3ZhbGlkQmV0d2VlbicsXG4gICAgVkFMSURfV09SS0RBWSA9ICd2YWxpZFdvcmtkYXknLFxuICAgIFZBTElEX1dFRUtFTkQgPSAndmFsaWRXZWVrZW5kJ1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUaW1lSW5zdGFuY2VGaWVsZCBleHRlbmRzIERhdGFGaWVsZDxNb21lbnQ+IHtcblxuICAgIHB1YmxpYyBtaW46IE1vbWVudDtcbiAgICBwdWJsaWMgbWF4OiBNb21lbnQ7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3Ioc3RyaW5nSWQ6IHN0cmluZywgdGl0bGU6IHN0cmluZywgdmFsdWU6IE1vbWVudCwgYmVoYXZpb3I6IEJlaGF2aW9yLCBwbGFjZWhvbGRlcj86IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsIGxheW91dD86IExheW91dCwgdmFsaWRhdGlvbnM/OiBhbnksIGNvbXBvbmVudD86IENvbXBvbmVudCwgcGFyZW50VGFza0lkPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHN0cmluZ0lkLCB0aXRsZSwgdmFsdWUsIGJlaGF2aW9yLCBwbGFjZWhvbGRlciwgZGVzY3JpcHRpb24sIGxheW91dCwgdmFsaWRhdGlvbnMsIGNvbXBvbmVudCwgcGFyZW50VGFza0lkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRXF1YWwoYTogTW9tZW50LCBiOiBNb21lbnQsIGdyYW51bGFyaXR5PzogbW9tZW50LnVuaXRPZlRpbWUuU3RhcnRPZik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKCFhICYmICFiKSB8fCAoISFhICYmICEhYiAmJiBhLmlzU2FtZShiLCBncmFudWxhcml0eSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGRhdGUgZnJvbSBzdHJpbmc6XG4gICAgICogZGF0ZSBpcyBzdHJpbmcgJ3Bhc3QnIC0gcmV0dXJuIHN0cmluZyAncGFzdCdcbiAgICAgKiBkYXRlIGlzIHN0cmluZyAnZnV0dXJlJyAtIHJldHVybiBzdHJpbmcgJ2Z1dHVyZSdcbiAgICAgKiBkYXRlIGlzIHN0cmluZyAndG9kYXknLydub3cnIC0gcmV0dXJuIG1vbWVudCBpbnN0YW5jZSBvZiBjdXJyZW50IGRhdGUvdGltZVxuICAgICAqIGRhdGUgaXMgc3RyaW5nIGJ1aWxkIGJ5IGNvbWJpbmF0aW9uIG9mICd0b2RheScvJ25vdycrLy1JU084NjAxIChlZy4gdG9kYXktUDFEVDFIKSAtIHJldHVybiBwYXJzZWQgbW9tZW50IGluc3RhbmNlIG9mIGRhdGVcbiAgICAgKiBkYXRlIGlzIHN0cmluZyBvZiBzcGVjaWZpYyBkYXRlIC0gcmV0dXJuIG1vbWVudCBpbnN0YW5jZSBvZiB0aGlzIHNwZWNpZmljIGRhdGVcbiAgICAgKiBAcGFyYW0gZGF0ZSAtIHN0cmluZyB0aGF0IHNob3VsZCBiZSBwYXJzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlRGF0ZShkYXRlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGRhdGUuaW5jbHVkZXMoJ3Bhc3QnKSkge1xuICAgICAgICAgICAgcmV0dXJuICdwYXN0JztcbiAgICAgICAgfSBlbHNlIGlmIChkYXRlLmluY2x1ZGVzKCdmdXR1cmUnKSkge1xuICAgICAgICAgICAgcmV0dXJuICdmdXR1cmUnO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGUuaW5jbHVkZXMoJ3RvZGF5JykgfHwgZGF0ZS5pbmNsdWRlcygnbm93JykpIHtcbiAgICAgICAgICAgIGlmIChkYXRlLmluY2x1ZGVzKCcrJykgfHwgZGF0ZS5pbmNsdWRlcygnLScpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IGRhdGUuaW5jbHVkZXMoJysnKSA/IGRhdGUuc3BsaXQoJysnKVsxXSA6IGRhdGUuc3BsaXQoJy0nKVsxXTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0ZS5pbmNsdWRlcygndG9kYXknKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS5pbmNsdWRlcygnKycpID8gbW9tZW50KCkuc3RhcnRPZignZGF5JykuYWRkKG1vbWVudC5kdXJhdGlvbihkaWZmZXJlbmNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbW9tZW50KCkuc3RhcnRPZignZGF5Jykuc3VidHJhY3QobW9tZW50LmR1cmF0aW9uKGRpZmZlcmVuY2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRhdGUuaW5jbHVkZXMoJ25vdycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLmluY2x1ZGVzKCcrJykgPyBtb21lbnQoKS5hZGQobW9tZW50LmR1cmF0aW9uKGRpZmZlcmVuY2UpKSA6IG1vbWVudCgpLnN1YnRyYWN0KG1vbWVudC5kdXJhdGlvbihkaWZmZXJlbmNlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRhdGUuaW5jbHVkZXMoJ3RvZGF5JykgPyBtb21lbnQoKS5zdGFydE9mKCdkYXknKSA6IG1vbWVudCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG1vbWVudChkYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdEYXRlLmlzVmFsaWQgPyBuZXdEYXRlIDogbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNvbHZlVmFsaWRhdGlvbnMoKTogQXJyYXk8VmFsaWRhdG9yRm4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICAgICAgdGhpcy52YWxpZGF0aW9ucy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0udmFsaWRhdGlvblJ1bGUuaW5jbHVkZXMoQWJzdHJhY3RUaW1lSW5zdGFuY2VGaWVsZFZhbGlkYXRpb24uQkVUV0VFTikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0bXAgPSBpdGVtLnZhbGlkYXRpb25SdWxlLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2VzID0gdG1wWzFdLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IEFic3RyYWN0VGltZUluc3RhbmNlRmllbGQucGFyc2VEYXRlKHJhbmdlc1swXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gQWJzdHJhY3RUaW1lSW5zdGFuY2VGaWVsZC5wYXJzZURhdGUocmFuZ2VzWzFdKTtcblxuICAgICAgICAgICAgICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSAncGFzdCcgJiYgbW9tZW50KGVuZCkuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnZhbGlkRnJvbVBhc3QobW9tZW50KGVuZCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gbW9tZW50KGVuZCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kID09PSAnZnV0dXJlJyAmJiBtb21lbnQoc3RhcnQpLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy52YWxpZFRvRnV0dXJlKG1vbWVudChzdGFydCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluID0gbW9tZW50KHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb21lbnQoc3RhcnQpLmlzVmFsaWQoKSAmJiBtb21lbnQoZW5kKS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMudmFsaWRCZXR3ZWVuKG1vbWVudChzdGFydCksIG1vbWVudChlbmQpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbiA9IG1vbWVudChzdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heCA9IG1vbWVudChlbmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnZhbGlkYXRpb25SdWxlLmluY2x1ZGVzKEFic3RyYWN0VGltZUluc3RhbmNlRmllbGRWYWxpZGF0aW9uLldPUktEQVkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy52YWxpZFdvcmtkYXkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnZhbGlkYXRpb25SdWxlLmluY2x1ZGVzKEFic3RyYWN0VGltZUluc3RhbmNlRmllbGRWYWxpZGF0aW9uLldFRUtFTkQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy52YWxpZFdlZWtlbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB2YWxpZEZyb21QYXN0KHJhbmdlOiBNb21lbnQpOiBWYWxpZGF0b3JGbiB7XG4gICAgICAgIHJldHVybiAoZmM6IEZvcm1Db250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4gZmMudmFsdWUgPiByYW5nZSA/IHt2YWxpZEJldHdlZW46IHRydWV9IDogbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdmFsaWRUb0Z1dHVyZShyYW5nZTogTW9tZW50KTogVmFsaWRhdG9yRm4ge1xuICAgICAgICByZXR1cm4gKGZjOiBGb3JtQ29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0+IGZjLnZhbHVlIDwgcmFuZ2UgPyB7dmFsaWRCZXR3ZWVuOiB0cnVlfSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHZhbGlkQmV0d2VlbihmaXJzdDogTW9tZW50LCBzZWNvbmQ6IE1vbWVudCk6IFZhbGlkYXRvckZuIHtcbiAgICAgICAgcmV0dXJuIChmYzogRm9ybUNvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9PiBmYy52YWx1ZSA8IGZpcnN0IHx8IGZjLnZhbHVlID4gc2Vjb25kID8ge3ZhbGlkQmV0d2VlbjogdHJ1ZX0gOiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB2YWxpZFdvcmtkYXkoZmM6IEZvcm1Db250cm9sKSB7XG4gICAgICAgIGNvbnN0IGRheU9mV2VlayA9ICEhZmMudmFsdWUgPyBmYy52YWx1ZS5pc29XZWVrZGF5KCkgOiBudWxsO1xuICAgICAgICByZXR1cm4gZGF5T2ZXZWVrID09PSA2IHx8IGRheU9mV2VlayA9PT0gNyA/IHt2YWxpZFdvcmtkYXk6IHRydWV9IDogbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdmFsaWRXZWVrZW5kKGZjOiBGb3JtQ29udHJvbCkge1xuICAgICAgICBjb25zdCBkYXlPZldlZWsgPSAhIWZjLnZhbHVlID8gZmMudmFsdWUuaXNvV2Vla2RheSgpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIGRheU9mV2VlayA+PSAxICYmIGRheU9mV2VlayA8PSA1ID8ge3ZhbGlkV2Vla2VuZDogdHJ1ZX0gOiBudWxsO1xuICAgIH1cbn1cbiJdfQ==