@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
492 lines • 67.5 kB
JavaScript
import { isIE } from '../core/utils';
/**
*@hidden
*/
var DatePickerUtil = /** @class */ (function () {
function DatePickerUtil() {
}
/**
* This method generates date parts structure based on editor mask and locale.
* @param maskValue: string
* @param locale: string
* @returns array containing information about date parts - type, position, format
*/
DatePickerUtil.parseDateFormat = function (maskValue, locale) {
if (locale === void 0) { locale = DatePickerUtil.DEFAULT_LOCALE; }
var dateStruct = [];
if (maskValue === undefined && !isIE()) {
dateStruct = DatePickerUtil.getDefaultLocaleMask(locale);
}
else {
var mask = (maskValue) ? maskValue : DatePickerUtil.SHORT_DATE_MASK;
var maskArray = Array.from(mask);
var monthInitPosition = mask.indexOf("M" /* MonthChar */);
var dayInitPosition = mask.indexOf("d" /* DayChar */);
var yearInitPosition = mask.indexOf("y" /* YearChar */);
if (yearInitPosition !== -1) {
dateStruct.push({
type: "year" /* Year */,
initialPosition: yearInitPosition,
formatType: DatePickerUtil.getYearFormatType(mask)
});
}
if (monthInitPosition !== -1) {
dateStruct.push({
type: "month" /* Month */,
initialPosition: monthInitPosition,
formatType: DatePickerUtil.getMonthFormatType(mask)
});
}
if (dayInitPosition !== -1) {
dateStruct.push({
type: "day" /* Day */,
initialPosition: dayInitPosition,
formatType: DatePickerUtil.getDayFormatType(mask)
});
}
for (var i = 0; i < maskArray.length; i++) {
if (!DatePickerUtil.isDateChar(maskArray[i])) {
dateStruct.push({
type: DatePickerUtil.SEPARATOR,
initialPosition: i,
value: maskArray[i]
});
}
}
dateStruct.sort(function (a, b) { return a.initialPosition - b.initialPosition; });
DatePickerUtil.fillDatePartsPositions(dateStruct);
}
return dateStruct;
};
/**
* This method generates input mask based on date parts.
* @param dateStruct array
* @returns input mask
*/
DatePickerUtil.getInputMask = function (dateStruct) {
var inputMask = [];
for (var i = 0; i < dateStruct.length; i++) {
if (dateStruct[i].type === DatePickerUtil.SEPARATOR) {
inputMask.push(dateStruct[i].value);
}
else if (dateStruct[i].type === "day" /* Day */ || dateStruct[i].type === "month" /* Month */) {
inputMask.push('00');
}
else if (dateStruct[i].type === "year" /* Year */) {
switch (dateStruct[i].formatType) {
case "numeric" /* Numeric */: {
inputMask.push('0000');
break;
}
case "2-digit" /* TwoDigits */: {
inputMask.push('00');
break;
}
}
}
}
return inputMask.join('');
};
/**
* This method generates editor mask.
* @param dateStruct
* @returns editor mask
*/
DatePickerUtil.getMask = function (dateStruct) {
var mask = [];
for (var i = 0; i < dateStruct.length; i++) {
switch (dateStruct[i].formatType) {
case "numeric" /* Numeric */: {
if (dateStruct[i].type === "day" /* Day */) {
mask.push('d');
}
else if (dateStruct[i].type === "month" /* Month */) {
mask.push('M');
}
else {
mask.push('yyyy');
}
break;
}
case "2-digit" /* TwoDigits */: {
if (dateStruct[i].type === "day" /* Day */) {
mask.push('dd');
}
else if (dateStruct[i].type === "month" /* Month */) {
mask.push('MM');
}
else {
mask.push('yy');
}
}
}
if (dateStruct[i].type === DatePickerUtil.SEPARATOR) {
mask.push(dateStruct[i].value);
}
}
return mask.join('');
};
/**
* This method parses an input string base on date parts and returns a date and its validation state.
* @param dateFormatParts
* @param prevDateValue
* @param inputValue
* @returns object containing a date and its validation state
*/
DatePickerUtil.parseDateArray = function (dateFormatParts, prevDateValue, inputValue) {
var dayStr = DatePickerUtil.getDayValueFromInput(dateFormatParts, inputValue);
var monthStr = DatePickerUtil.getMonthValueFromInput(dateFormatParts, inputValue);
var yearStr = DatePickerUtil.getYearValueFromInput(dateFormatParts, inputValue);
var yearFormat = DatePickerUtil.getDateFormatPart(dateFormatParts, "year" /* Year */).formatType;
var day = (dayStr !== '') ? parseInt(dayStr, 10) : 1;
var month = (monthStr !== '') ? parseInt(monthStr, 10) - 1 : 0;
var year;
if (yearStr === '') {
year = (yearFormat === "2-digit" /* TwoDigits */) ? '00' : '2000';
}
else {
year = yearStr;
}
var yearPrefix;
if (prevDateValue) {
var originalYear = prevDateValue.getFullYear().toString();
if (originalYear.length === 4) {
yearPrefix = originalYear.substring(0, 2);
}
}
else {
yearPrefix = '20';
}
var fullYear = (yearFormat === "2-digit" /* TwoDigits */) ? yearPrefix.concat(year) : year;
if ((month < 0) || (month > 11) || (month === NaN)) {
return { state: "invalid" /* Invalid */, value: inputValue };
}
if ((day < 1) || (day > DatePickerUtil.daysInMonth(fullYear, month + 1)) || (day === NaN)) {
return { state: "invalid" /* Invalid */, value: inputValue };
}
return { state: "valid" /* Valid */, date: new Date(fullYear, month, day) };
};
DatePickerUtil.maskToPromptChars = function (mask) {
var result = mask.replace(/0|L/g, DatePickerUtil.PROMPT_CHAR);
return result;
};
/**
* This method replaces prompt chars with empty string.
* @param value
*/
DatePickerUtil.trimUnderlines = function (value) {
var result = value.replace(/_/g, '');
return result;
};
/**
* This method is used for spinning date parts.
* @param dateFormatParts
* @param inputValue
* @param position
* @param delta
* @param isSpinLoop
* @return modified text input
*/
DatePickerUtil.getModifiedDateInput = function (dateFormatParts, inputValue, position, delta, isSpinLoop) {
var datePart = DatePickerUtil.getDatePartOnPosition(dateFormatParts, position);
var datePartType = datePart.type;
var datePartFormatType = datePart.formatType;
var newValue;
var datePartValue = DatePickerUtil.getDateValueFromInput(dateFormatParts, datePartType, inputValue);
newValue = parseInt(datePartValue, 10);
var maxValue, minValue;
var minMax = DatePickerUtil.getMinMaxValue(dateFormatParts, datePart, inputValue);
minValue = minMax.min;
maxValue = minMax.max;
if (isNaN(newValue)) {
if (minValue === 'infinite') {
newValue = 2000;
}
else {
newValue = minValue;
}
}
var tempValue = newValue;
tempValue += delta;
// Infinite loop for full years
if (maxValue === 'infinite' && minValue === 'infinite') {
newValue = tempValue;
}
if (isSpinLoop) {
if (tempValue > maxValue) {
tempValue = minValue;
}
if (tempValue < minValue) {
tempValue = maxValue;
}
newValue = tempValue;
}
else {
if (tempValue <= maxValue && tempValue >= minValue) {
newValue = tempValue;
}
}
var startIdx = datePart.position[0];
var endIdx = datePart.position[1];
var start = inputValue.slice(0, startIdx);
var end = inputValue.slice(endIdx, inputValue.length);
var changedPart;
var prefix = DatePickerUtil.getNumericFormatPrefix(datePartFormatType);
changedPart = (newValue < 10) ? "" + prefix + newValue : "" + newValue;
return "" + start + changedPart + end;
};
/**
* This method returns date input with prompt chars.
* @param dateFormatParts
* @param date
* @param inputValue
* @returns date input including prompt chars
*/
DatePickerUtil.addPromptCharsEditMode = function (dateFormatParts, date, inputValue) {
var dateArray = Array.from(inputValue);
for (var i = 0; i < dateFormatParts.length; i++) {
if (dateFormatParts[i].formatType === "numeric" /* Numeric */) {
if ((dateFormatParts[i].type === "day" /* Day */ && date.getDate() < 10)
|| (dateFormatParts[i].type === "month" /* Month */ && date.getMonth() + 1 < 10)) {
dateArray.splice(dateFormatParts[i].position[0], 0, DatePickerUtil.PROMPT_CHAR);
dateArray.join('');
}
}
}
return dateArray.join('');
};
/**
* This method checks if date input is done.
* @param dateFormatParts
* @param input
* @returns input completeness
*/
DatePickerUtil.checkForCompleteDateInput = function (dateFormatParts, input) {
var dayValue = DatePickerUtil.getDayValueFromInput(dateFormatParts, input);
var monthValue = DatePickerUtil.getMonthValueFromInput(dateFormatParts, input);
var yearValue = DatePickerUtil.getYearValueFromInput(dateFormatParts, input);
var dayStr = DatePickerUtil.getDayValueFromInput(dateFormatParts, input, false);
var monthStr = DatePickerUtil.getMonthValueFromInput(dateFormatParts, input, false);
if (DatePickerUtil.isFullInput(dayValue, dayStr)
&& DatePickerUtil.isFullInput(monthValue, monthStr)
&& DatePickerUtil.isFullYearInput(dateFormatParts, yearValue)) {
return 'complete';
}
else if (dayValue === '' && monthValue === '' && yearValue === '') {
return 'empty';
}
else if (dayValue === '' || monthValue === '' || yearValue === '') {
return 'partial';
}
return '';
};
DatePickerUtil.getYearFormatType = function (format) {
switch (format.match(new RegExp("y" /* YearChar */, 'g')).length) {
case 1: {
// y (2020)
return "numeric" /* Numeric */;
}
case 4: {
// yyyy (2020)
return "numeric" /* Numeric */;
}
case 2: {
// yy (20)
return "2-digit" /* TwoDigits */;
}
}
};
DatePickerUtil.getMonthFormatType = function (format) {
switch (format.match(new RegExp("M" /* MonthChar */, 'g')).length) {
case 1: {
// M (8)
return "numeric" /* Numeric */;
}
case 2: {
// MM (08)
return "2-digit" /* TwoDigits */;
}
}
};
DatePickerUtil.getDayFormatType = function (format) {
switch (format.match(new RegExp("d" /* DayChar */, 'g')).length) {
case 1: {
// d (6)
return "numeric" /* Numeric */;
}
case 2: {
// dd (06)
return "2-digit" /* TwoDigits */;
}
}
};
DatePickerUtil.getDefaultLocaleMask = function (locale) {
var dateStruct = [];
var formatter = new Intl.DateTimeFormat(locale);
var formatToParts = formatter.formatToParts(new Date());
for (var i = 0; i < formatToParts.length; i++) {
if (formatToParts[i].type === DatePickerUtil.SEPARATOR) {
dateStruct.push({
type: DatePickerUtil.SEPARATOR,
value: formatToParts[i].value
});
}
else {
dateStruct.push({
type: formatToParts[i].type,
});
}
}
var formatterOptions = formatter.resolvedOptions();
for (var i = 0; i < dateStruct.length; i++) {
switch (dateStruct[i].type) {
case "day" /* Day */: {
dateStruct[i].formatType = formatterOptions.day;
break;
}
case "month" /* Month */: {
dateStruct[i].formatType = formatterOptions.month;
break;
}
case "year" /* Year */: {
dateStruct[i].formatType = formatterOptions.month;
break;
}
}
}
DatePickerUtil.fillDatePartsPositions(dateStruct);
return dateStruct;
};
DatePickerUtil.isDateChar = function (char) {
return (char === "y" /* YearChar */ || char === "M" /* MonthChar */ || char === "d" /* DayChar */);
};
DatePickerUtil.getNumericFormatPrefix = function (formatType) {
switch (formatType) {
case "2-digit" /* TwoDigits */: {
return '0';
}
case "numeric" /* Numeric */: {
return DatePickerUtil.PROMPT_CHAR;
}
}
};
DatePickerUtil.getMinMaxValue = function (dateFormatParts, datePart, inputValue) {
var maxValue, minValue;
switch (datePart.type) {
case "month" /* Month */: {
minValue = 1;
maxValue = DatePickerUtil.NUMBER_OF_MONTHS;
break;
}
case "day" /* Day */: {
minValue = 1;
maxValue = DatePickerUtil.daysInMonth(DatePickerUtil.getFullYearFromString(DatePickerUtil.getDateFormatPart(dateFormatParts, "year" /* Year */), inputValue), parseInt(DatePickerUtil.getMonthValueFromInput(dateFormatParts, inputValue), 10));
break;
}
case "year" /* Year */: {
if (datePart.formatType === "2-digit" /* TwoDigits */) {
minValue = 0;
maxValue = 99;
}
else {
// Infinite loop
minValue = 'infinite';
maxValue = 'infinite';
}
break;
}
}
return { min: minValue, max: maxValue };
};
DatePickerUtil.daysInMonth = function (fullYear, month) {
return new Date(fullYear, month, 0).getDate();
};
DatePickerUtil.getDateValueFromInput = function (dateFormatParts, type, inputValue, trim) {
if (trim === void 0) { trim = true; }
var partPosition = DatePickerUtil.getDateFormatPart(dateFormatParts, type).position;
var result = inputValue.substring(partPosition[0], partPosition[1]);
return (trim) ? DatePickerUtil.trimUnderlines(result) : result;
};
DatePickerUtil.getDayValueFromInput = function (dateFormatParts, inputValue, trim) {
if (trim === void 0) { trim = true; }
return DatePickerUtil.getDateValueFromInput(dateFormatParts, "day" /* Day */, inputValue, trim);
};
DatePickerUtil.getMonthValueFromInput = function (dateFormatParts, inputValue, trim) {
if (trim === void 0) { trim = true; }
return DatePickerUtil.getDateValueFromInput(dateFormatParts, "month" /* Month */, inputValue, trim);
};
DatePickerUtil.getYearValueFromInput = function (dateFormatParts, inputValue, trim) {
if (trim === void 0) { trim = true; }
return DatePickerUtil.getDateValueFromInput(dateFormatParts, "year" /* Year */, inputValue, trim);
};
DatePickerUtil.getDateFormatPart = function (dateFormatParts, type) {
var result = dateFormatParts.filter(function (datePart) { return (datePart.type === type); })[0];
return result;
};
DatePickerUtil.isFullInput = function (value, input) {
return (value !== '' && input.length === 2 && input.charAt(1) !== DatePickerUtil.PROMPT_CHAR);
};
DatePickerUtil.isFullYearInput = function (dateFormatParts, value) {
switch (DatePickerUtil.getDateFormatPart(dateFormatParts, "year" /* Year */).formatType) {
case "numeric" /* Numeric */: {
return (value !== '' && value.length === 4);
}
case "2-digit" /* TwoDigits */: {
return (value !== '' && value.length === 2);
}
default: {
return false;
}
}
};
DatePickerUtil.getDatePartOnPosition = function (dateFormatParts, position) {
var result = dateFormatParts.filter(function (element) {
return element.position[0] <= position && position <= element.position[1] && element.type !== DatePickerUtil.SEPARATOR;
})[0];
return result;
};
DatePickerUtil.getFullYearFromString = function (yearPart, inputValue) {
return parseInt(inputValue.substring(yearPart.position[0], yearPart.position[1]), 10);
};
DatePickerUtil.fillDatePartsPositions = function (dateArray) {
var currentPos = 0;
for (var i = 0; i < dateArray.length; i++) {
// Day|Month part positions
if (dateArray[i].type === "day" /* Day */ || dateArray[i].type === "month" /* Month */) {
// Offset 2 positions for number
dateArray[i].position = [currentPos, currentPos + 2];
currentPos += 2;
}
else if (dateArray[i].type === "year" /* Year */) {
// Year part positions
switch (dateArray[i].formatType) {
case "numeric" /* Numeric */: {
// Offset 4 positions for full year
dateArray[i].position = [currentPos, currentPos + 4];
currentPos += 4;
break;
}
case "2-digit" /* TwoDigits */: {
// Offset 2 positions for short year
dateArray[i].position = [currentPos, currentPos + 2];
currentPos += 2;
break;
}
}
}
else if (dateArray[i].type === DatePickerUtil.SEPARATOR) {
// Separator positions
dateArray[i].position = [currentPos, currentPos + 1];
currentPos++;
}
}
};
DatePickerUtil.SHORT_DATE_MASK = 'MM/dd/yy';
DatePickerUtil.SEPARATOR = 'literal';
DatePickerUtil.NUMBER_OF_MONTHS = 12;
DatePickerUtil.PROMPT_CHAR = '_';
DatePickerUtil.DEFAULT_LOCALE = 'en';
return DatePickerUtil;
}());
export { DatePickerUtil };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIudXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFzQ3JDOztHQUVHO0FBQ0g7SUFBQTtJQWdnQkEsQ0FBQztJQXpmRzs7Ozs7T0FLRztJQUNXLDhCQUFlLEdBQTdCLFVBQThCLFNBQWlCLEVBQUUsTUFBOEM7UUFBOUMsdUJBQUEsRUFBQSxTQUFpQixjQUFjLENBQUMsY0FBYztRQUMzRixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDcEMsVUFBVSxHQUFHLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM1RDthQUFNO1lBQ0gsSUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDO1lBQ3RFLElBQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxxQkFBcUIsQ0FBQztZQUM1RCxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxtQkFBbUIsQ0FBQztZQUN4RCxJQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLG9CQUFvQixDQUFDO1lBRTFELElBQUksZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3pCLFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQ1osSUFBSSxtQkFBZ0I7b0JBQ3BCLGVBQWUsRUFBRSxnQkFBZ0I7b0JBQ2pDLFVBQVUsRUFBRSxjQUFjLENBQUMsaUJB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QUMsUUFBUSxHQUFHLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDckQsVUFBVSxJQUFJLENBQUMsQ0FBQzt3QkFDaEIsTUFBTTtxQkFDVDtpQkFDSjthQUNKO2lCQUFNLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsU0FBUyxFQUFFO2dCQUN2RCxzQkFBc0I7Z0JBQ3RCLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxVQUFVLEVBQUUsQ0FBQzthQUNoQjtTQUNKO0lBQ0wsQ0FBQztJQTlmdUIsOEJBQWUsR0FBRyxVQUFVLENBQUM7SUFDN0Isd0JBQVMsR0FBRyxTQUFTLENBQUM7SUFDdEIsK0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLDBCQUFXLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLDZCQUFjLEdBQUcsSUFBSSxDQUFDO0lBMmZsRCxxQkFBQztDQUFBLEFBaGdCRCxJQWdnQkM7U0FoZ0JxQixjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNJRSB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuXG4vKipcbiAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGtlZXAgdGhlIGRhdGUgdmFsaWRhdGlvbiByZXN1bHQuXG4gKlxuICpAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIERhdGVTdGF0ZSB7XG4gICAgVmFsaWQgPSAndmFsaWQnLFxuICAgIEludmFsaWQgPSAnaW52YWxpZCcsXG59XG5cbi8qKlxuICpAaGlkZGVuXG4gKi9cbmNvbnN0IGVudW0gRm9ybWF0RGVzYyB7XG4gICAgTnVtZXJpYyA9ICdudW1lcmljJyxcbiAgICBUd29EaWdpdHMgPSAnMi1kaWdpdCdcbn1cblxuLyoqXG4gKkBoaWRkZW5cbiAqL1xuY29uc3QgZW51bSBEYXRlQ2hhcnMge1xuICAgIFllYXJDaGFyID0gJ3knLFxuICAgIE1vbnRoQ2hhciA9ICdNJyxcbiAgICBEYXlDaGFyID0gJ2QnXG59XG5cbi8qKlxuICpAaGlkZGVuXG4gKi9cbmNvbnN0IGVudW0gRGF0ZVBhcnRzIHtcbiAgICBEYXkgPSAnZGF5JyxcbiAgICBNb250aCA9ICdtb250aCcsXG4gICAgWWVhciA9ICd5ZWFyJ1xufVxuXG4vKipcbiAqQGhpZGRlblxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGF0ZVBpY2tlclV0aWwge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNIT1JUX0RBVEVfTUFTSyA9ICdNTS9kZC95eSc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0VQQVJBVE9SID0gJ2xpdGVyYWwnO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5VTUJFUl9PRl9NT05USFMgPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQUk9NUFRfQ0hBUiA9ICdfJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0xPQ0FMRSA9ICdlbic7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgZGF0ZSBwYXJ0cyBzdHJ1Y3R1cmUgYmFzZWQgb24gZWRpdG9yIG1hc2sgYW5kIGxvY2FsZS5cbiAgICAgKiBAcGFyYW0gbWFza1ZhbHVlOiBzdHJpbmdcbiAgICAgKiBAcGFyYW0gbG9jYWxlOiBzdHJpbmdcbiAgICAgKiBAcmV0dXJucyBhcnJheSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGRhdGUgcGFydHMgLSB0eXBlLCBwb3NpdGlvbiwgZm9ybWF0XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZURhdGVGb3JtYXQobWFza1ZhbHVlOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nID0gRGF0ZVBpY2tlclV0aWwuREVGQVVMVF9MT0NBTEUpOiBhbnlbXSB7XG4gICAgICAgIGxldCBkYXRlU3RydWN0ID0gW107XG4gICAgICAgIGlmIChtYXNrVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhaXNJRSgpKSB7XG4gICAgICAgICAgICBkYXRlU3RydWN0ID0gRGF0ZVBpY2tlclV0aWwuZ2V0RGVmYXVsdExvY2FsZU1hc2sobG9jYWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1hc2sgPSAobWFza1ZhbHVlKSA/IG1hc2tWYWx1ZSA6IERhdGVQaWNrZXJVdGlsLlNIT1JUX0RBVEVfTUFTSztcbiAgICAgICAgICAgIGNvbnN0IG1hc2tBcnJheSA9IEFycmF5LmZyb20obWFzayk7XG4gICAgICAgICAgICBjb25zdCBtb250aEluaXRQb3NpdGlvbiA9IG1hc2suaW5kZXhPZihEYXRlQ2hhcnMuTW9udGhDaGFyKTtcbiAgICAgICAgICAgIGNvbnN0IGRheUluaXRQb3NpdGlvbiA9IG1hc2suaW5kZXhPZihEYXRlQ2hhcnMuRGF5Q2hhcik7XG4gICAgICAgICAgICBjb25zdCB5ZWFySW5pdFBvc2l0aW9uID0gbWFzay5pbmRleE9mKERhdGVDaGFycy5ZZWFyQ2hhcik7XG5cbiAgICAgICAgICAgIGlmICh5ZWFySW5pdFBvc2l0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGRhdGVTdHJ1Y3QucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGVQYXJ0cy5ZZWFyLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsUG9zaXRpb246IHllYXJJbml0UG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdFR5cGU6IERhdGVQaWNrZXJVdGlsLmdldFllYXJGb3JtYXRUeXBlKG1hc2spXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtb250aEluaXRQb3NpdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBkYXRlU3RydWN0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBEYXRlUGFydHMuTW9udGgsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxQb3NpdGlvbjogbW9udGhJbml0UG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdFR5cGU6IERhdGVQaWNrZXJVdGlsLmdldE1vbnRoRm9ybWF0VHlwZShtYXNrKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF5SW5pdFBvc2l0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGRhdGVTdHJ1Y3QucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGVQYXJ0cy5EYXksXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxQb3NpdGlvbjogZGF5SW5pdFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRUeXBlOiBEYXRlUGlja2VyVXRpbC5nZXREYXlGb3JtYXRUeXBlKG1hc2spXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFza0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFEYXRlUGlja2VyVXRpbC5pc0RhdGVDaGFyKG1hc2tBcnJheVtpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZVN0cnVjdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGVQaWNrZXJVdGlsLlNFUEFSQVRPUixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxQb3NpdGlvbjogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXNrQXJyYXlbaV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlU3RydWN0LnNvcnQoKGEsIGIpID0+IGEuaW5pdGlhbFBvc2l0aW9uIC0gYi5pbml0aWFsUG9zaXRpb24pO1xuICAgICAgICAgICAgRGF0ZVBpY2tlclV0aWwuZmlsbERhdGVQYXJ0c1Bvc2l0aW9ucyhkYXRlU3RydWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZVN0cnVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgaW5wdXQgbWFzayBiYXNlZCBvbiBkYXRlIHBhcnRzLlxuICAgICAqIEBwYXJhbSBkYXRlU3RydWN0IGFycmF5XG4gICAgICogQHJldHVybnMgaW5wdXQgbWFza1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5wdXRNYXNrKGRhdGVTdHJ1Y3Q6IGFueVtdKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaW5wdXRNYXNrID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0ZVN0cnVjdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGRhdGVTdHJ1Y3RbaV0udHlwZSA9PT0gRGF0ZVBpY2tlclV0aWwuU0VQQVJBVE9SKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRNYXNrLnB1c2goZGF0ZVN0cnVjdFtpXS52YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGVTdHJ1Y3RbaV0udHlwZSA9PT0gRGF0ZVBhcnRzLkRheSB8fCBkYXRlU3RydWN0W2ldLnR5cGUgPT09IERhdGVQYXJ0cy5Nb250aCkge1xuICAgICAgICAgICAgICAgIGlucHV0TWFzay5wdXNoKCcwMCcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRlU3RydWN0W2ldLnR5cGUgPT09IERhdGVQYXJ0cy5ZZWFyKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChkYXRlU3RydWN0W2ldLmZvcm1hdFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBGb3JtYXREZXNjLk51bWVyaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0TWFzay5wdXNoKCcwMDAwJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIEZvcm1hdERlc2MuVHdvRGlnaXRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dE1hc2sucHVzaCgnMDAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dE1hc2suam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIGVkaXRvciBtYXNrLlxuICAgICAqIEBwYXJhbSBkYXRlU3RydWN0XG4gICAgICogQHJldHVybnMgZWRpdG9yIG1hc2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldE1hc2soZGF0ZVN0cnVjdDogYW55W10pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBtYXNrID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0ZVN0cnVjdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3dpdGNoIChkYXRlU3RydWN0W2ldLmZvcm1hdFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEZvcm1hdERlc2MuTnVtZXJpYzoge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZVN0cnVjdFtpXS50eXBlID09PSBEYXRlUGFydHMuRGF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrLnB1c2goJ2QnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRlU3RydWN0W2ldLnR5cGUgPT09IERhdGVQYXJ0cy5Nb250aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFzay5wdXNoKCdNJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrLnB1c2goJ3l5eXknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGb3JtYXREZXNjLlR3b0RpZ2l0czoge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZVN0cnVjdFtpXS50eXBlID09PSBEYXRlUGFydHMuRGF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrLnB1c2goJ2RkJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0ZVN0cnVjdFtpXS50eXBlID09PSBEYXRlUGFydHMuTW9udGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sucHVzaCgnTU0nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sucHVzaCgneXknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGVTdHJ1Y3RbaV0udHlwZSA9PT0gRGF0ZVBpY2tlclV0aWwuU0VQQVJBVE9SKSB7XG4gICAgICAgICAgICAgICAgbWFzay5wdXNoKGRhdGVTdHJ1Y3RbaV0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hc2suam9pbignJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHBhcnNlcyBhbiBpbnB1dCBzdHJpbmcgYmFzZSBvbiBkYXRlIHBhcnRzIGFuZCByZXR1cm5zIGEgZGF0ZSBhbmQgaXRzIHZhbGlkYXRpb24gc3RhdGUuXG4gICAgICogQHBhcmFtIGRhdGVGb3JtYXRQYXJ0c1xuICAgICAqIEBwYXJhbSBwcmV2RGF0ZVZhbHVlXG4gICAgICogQHBhcmFtIGlucHV0VmFsdWVcbiAgICAgKiBAcmV0dXJucyBvYmplY3QgY29udGFpbmluZyBhIGRhdGUgYW5kIGl0cyB2YWxpZGF0aW9uIHN0YXRlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZURhdGVBcnJheShkYXRlRm9ybWF0UGFydHM6IGFueVtdLCBwcmV2RGF0ZVZhbHVlOiBEYXRlLCBpbnB1dFZhbHVlOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBjb25zdCBkYXlTdHIgPSBEYXRlUGlja2VyVXRpbC5nZXREYXlWYWx1ZUZyb21JbnB1dChkYXRlRm9ybWF0UGFydHMsIGlucHV0VmFsdWUpO1xuICAgICAgICBjb25zdCBtb250aFN0ciA9IERhdGVQaWNrZXJVdGlsLmdldE1vbnRoVmFsdWVGcm9tSW5wdXQoZGF0ZUZvcm1hdFBhcnRzLCBpbnB1dFZhbHVlKTtcbiAgICAgICAgY29uc3QgeWVhclN0ciA9IERhdGVQaWNrZXJVdGlsLmdldFllYXJWYWx1ZUZyb21JbnB1dChkYXRlRm9ybWF0UGFydHMsIGlucHV0VmFsdWUpO1xuICAgICAgICBjb25zdCB5ZWFyRm9ybWF0ID0gRGF0ZVBpY2tlclV0aWwuZ2V0RGF0ZUZvcm1hdFBhcnQoZGF0ZUZvcm1hdFBhcnRzLCBEYXRlUGFydHMuWWVhcikuZm9ybWF0VHlwZTtcbiAgICAgICAgY29uc3QgZGF5ID0gKGRheVN0ciAhPT0gJycpID8gcGFyc2VJbnQoZGF5U3RyLCAxMCkgOiAxO1xuICAgICAgICBjb25zdCBtb250aCA9IChtb250aFN0ciAhPT0gJycpID8gcGFyc2VJbnQobW9udGhTdHIsIDEwKSAtIDEgOiAwO1xuXG4gICAgICAgIGxldCB5ZWFyO1xuICAgICAgICBpZiAoeWVhclN0ciA9PT0gJycpIHtcbiAgICAgICAgICAgIHllYXIgPSAoeWVhckZvcm1hdCA9PT0gRm9ybWF0RGVzYy5Ud29EaWdpdHMpID8gJzAwJyA6ICcyMDAwJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHllYXIgPSB5ZWFyU3RyO1xuICAgICAgICB9XG4gICAgICAgIGxldCB5ZWFyUHJlZml4O1xuICAgICAgICBpZiAocHJldkRhdGVWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxZZWFyID0gcHJldkRhdGVWYWx1ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxZZWFyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIHllYXJQcmVmaXggPSBvcmlnaW5hbFllYXIuc3Vic3RyaW5nKDAsIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWVhclByZWZpeCA9ICcyMCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnVsbFllYXIgPSAoeWVhckZvcm1hdCA9PT0gRm9ybWF0RGVzYy5Ud29EaWdpdHMpID8geWVhclByZWZpeC5jb25jYXQoeWVhcikgOiB5ZWFyO1xuXG4gICAgICAgIGlmICgobW9udGggPCAwKSB8fCAobW9udGggPiAxMSkgfHwgKG1vbnRoID09PSBOYU4pKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0ZTogRGF0ZVN0YXRlLkludmFsaWQsIHZhbHVlOiBpbnB1dFZhbHVlIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGRheSA8IDEpIHx8IChkYXkgPiBEYXRlUGlja2VyVXRpbC5kYXlzSW5Nb250aChmdWxsWWVhciwgbW9udGggKyAxKSkgfHwgKGRheSA9PT0gTmFOKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IERhdGVTdGF0ZS5JbnZhbGlkLCB2YWx1ZTogaW5wdXRWYWx1ZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgc3RhdGU6IERhdGVTdGF0ZS5WYWxpZCwgZGF0ZTogbmV3IERhdGUoZnVsbFllYXIsIG1vbnRoLCBkYXkpIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBtYXNrVG9Qcm9tcHRDaGFycyhtYXNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBtYXNrLnJlcGxhY2UoLzB8TC9nLCBE