UNPKG

ngx-mat-calendar

Version:

A datepicker with nepali and english calendar support

467 lines 72.8 kB
import { Injectable } from '@angular/core'; import { DateFormat, DateType } from '../model/calendar.model'; import { NDateD, BSADCal } from '../data/calendar.data'; export class CalendarService { constructor() { } GetBSMonthList() { const monthList = [ { month: 'बैशाख', id: 1 }, { month: 'जेष्ठ', id: 2 }, { month: 'असार', id: 3 }, { month: 'श्रावण', id: 4 }, { month: 'भाद्र', id: 5 }, { month: 'आश्विन', id: 6 }, { month: 'कार्तिक', id: 7 }, { month: 'मंसीर', id: 8 }, { month: 'पुष', id: 9 }, { month: 'माघ', id: 10 }, { month: 'फाल्गुन', id: 11 }, { month: 'चैत्र', id: 12 } ]; return monthList; } getFiscalYear(date) { const bsDate = this.GetDateBS(date, DateFormat.MMddyyyy); const bsMonth = this.GetBSMonth(bsDate, DateFormat.MMddyyyy); const bsYear = this.GetBSYear(bsDate, DateFormat.MMddyyyy); let result; if (bsMonth <= 3) { result = (bsYear - 1).toString().substring(2) + '।' + bsYear.toString().substring(2); } else { result = bsYear.toString().substring(2) + '।' + (bsYear + 1).toString().substring(2); } return result; } GetADMonthList() { const monthList = [ { month: 'January', id: 1 }, { month: 'February', id: 2 }, { month: 'March', id: 3 }, { month: 'April', id: 4 }, { month: 'May', id: 5 }, { month: 'June', id: 6 }, { month: 'July', id: 7 }, { month: 'August', id: 8 }, { month: 'September', id: 9 }, { month: 'October', id: 10 }, { month: 'November', id: 11 }, { month: 'December', id: 12 } ]; return monthList; } GetBSMonthName(monthId) { const monthname = this.GetBSMonthList().filter(x => x.id === monthId); if (monthname.length > 0) { return monthname[0].month; } else { return null; } } GetADMonthName(monthId) { const monthname = this.GetADMonthList().filter(x => x.id === monthId); if (monthname.length > 0) { return monthname[0].month; } else { return null; } } GetWeekDayName(dayId) { const weekDay = this.GetWeekDayNameList().filter(x => x.id === dayId); if (weekDay.length > 0) { return weekDay[0].day; } else { return null; } } GetWeekDayNameList() { const dayList = [ { day: 'Sunday', nepaliDay: 'आइतबार', id: 1, prefix: 'Sun' }, { day: 'Monday', nepaliDay: 'साेमबार', id: 2, prefix: "Mon" }, { day: 'Tuesday', nepaliDay: 'मंगलबार', id: 3, prefix: "Tue" }, { day: 'Wednesday', nepaliDay: 'बुधबार', id: 4, prefix: "Wed" }, { day: 'Thursday', nepaliDay: 'बिहिबार', id: 5, prefix: "Thu" }, { day: 'Friday', nepaliDay: 'शुक्रबार', id: 6, prefix: "Fri" }, { day: 'Saturday', nepaliDay: 'शनिबार', id: 7, prefix: "Sat" }, ]; return dayList; } GetWeekDayPrefixList() { const dayList = [ { day: 'Su', nepaliDay: 'आ.', id: 1, prefix: 'Sun' }, { day: 'Mo', nepaliDay: 'साे.', id: 2, prefix: 'Mon' }, { day: 'Tu', nepaliDay: 'मं.', id: 3, prefix: "Tue" }, { day: 'We', nepaliDay: 'बु.', id: 4, prefix: "Wed" }, { day: 'Th', nepaliDay: 'बि.', id: 5, prefix: "Thu" }, { day: 'Fr', nepaliDay: 'शु.', id: 6, prefix: "Fri" }, { day: 'Sa', nepaliDay: 'श.', id: 7, prefix: "Sat" }, ]; return dayList; } GetBSYearCal(NYear) { const bsMonthList = []; const selectedNDateD = NDateD.filter(x => x.NYear === NYear)[0]; let days = 0; days = days + selectedNDateD.M1; bsMonthList.push({ Month: 1, Days: days }); days = days + selectedNDateD.M2; bsMonthList.push({ Month: 2, Days: days }); days = days + selectedNDateD.M3; bsMonthList.push({ Month: 3, Days: days }); days = days + selectedNDateD.M4; bsMonthList.push({ Month: 4, Days: days }); days = days + selectedNDateD.M5; bsMonthList.push({ Month: 5, Days: days }); days = days + selectedNDateD.M6; bsMonthList.push({ Month: 6, Days: days }); days = days + selectedNDateD.M7; bsMonthList.push({ Month: 7, Days: days }); days = days + selectedNDateD.M8; bsMonthList.push({ Month: 8, Days: days }); days = days + selectedNDateD.M9; bsMonthList.push({ Month: 9, Days: days }); days = days + selectedNDateD.M10; bsMonthList.push({ Month: 10, Days: days }); days = days + selectedNDateD.M11; bsMonthList.push({ Month: 11, Days: days }); days = days + selectedNDateD.M12; bsMonthList.push({ Month: 12, Days: days }); return bsMonthList; } GetBSDay(bsDate, df) { let result; const bsDateArray = bsDate.split('-'); switch (df) { case 'ddMMyyyy': // ddmmyyyy result = Number(bsDateArray[0]); break; case 'MMddyyyy': // mmddyyyy result = Number(bsDateArray[1]); break; case 'yyyyddMM': // yyyyddmm result = Number(bsDateArray[1]); break; case 'yyyyMMdd': // yyyymmdd result = Number(bsDateArray[2]); break; } return result; } GetBSMonth(bsDate, df) { let result; const bsDateArray = bsDate.split('-'); switch (df) { case 'ddMMyyyy': // ddmmyyyy result = Number(bsDateArray[1]); break; case 'MMddyyyy': // mmddyyyy result = Number(bsDateArray[0]); break; case 'yyyyddMM': // yyyyddmm result = Number(bsDateArray[2]); break; case 'yyyyMMdd': // yyyymmdd result = Number(bsDateArray[1]); break; } return result; } GetBSYear(bsDate, df) { let result; const NDateArray = bsDate.split('-'); switch (df) { case 'ddMMyyyy': // ddmmyyyy result = Number(NDateArray[2]); break; case 'MMddyyyy': // mmddyyyy result = Number(NDateArray[2]); break; case 'yyyyddMM': // yyyyddmm result = Number(NDateArray[0]); break; case 'yyyyMMdd': // yyyymmdd result = Number(NDateArray[0]); break; } return result; } GetMaxYear() { return Math.max.apply(Math, BSADCal.map(o => o.NYear)); } GetMinYear() { return Math.min.apply(Math, BSADCal.map(o => o.NYear)); } GetDateBS(adDate, df) { if (!adDate) { return null; } adDate = new Date(adDate); let startDate; let bsYear; let bsMonth; let bsDay; adDate = new Date(adDate.getFullYear(), adDate.getMonth(), adDate.getDate()); try { startDate = new Date(BSADCal.filter(x => new Date(x.EndDate) >= adDate && new Date(x.StartDate) <= adDate)[0].StartDate); bsYear = BSADCal.filter(x => new Date(x.EndDate) >= adDate && new Date(x.StartDate) <= adDate)[0].NYear; const totalDays = this.GetDateDiff(adDate, startDate) + 1; bsMonth = this.GetBSYearCal(bsYear).filter(x => x.Days >= totalDays)[0].Month; const dyList = this.GetBSYearCal(bsYear).filter(x => x.Days < totalDays).reverse()[0]; if (dyList) { bsDay = dyList.Days; } bsDay = totalDays - (bsDay === undefined ? 0 : bsDay); } catch (e) { return null; } return this.GetFormatedDateBS(bsYear, bsMonth, bsDay, df); } GetDateAD(bsYear, bsMonth, bsDay) { let adDate = new Date(); let totalDays = 0; const ndateD = NDateD.filter(x => x.NYear === bsYear); if (ndateD.length === 0) { return null; } if (bsMonth < 1 || bsMonth > 12) { return null; } if (this.GetDaysInMonthBS(bsYear, bsMonth) < bsDay) { return null; } adDate = new Date(BSADCal.filter(x => x.NYear === bsYear)[0].StartDate); const listMonth = this.GetBSYearCal(bsYear).filter(x => x.Month < bsMonth); totalDays = listMonth.length > 0 ? listMonth.reverse()[0].Days : 0; totalDays = totalDays ? totalDays : 0; totalDays = totalDays + bsDay - 1; totalDays = (totalDays * 24 * 3600 * 1000); totalDays += adDate.getTime(); adDate.setTime(totalDays); return adDate; } GetDateADByDateBS(bsDate, df) { let adDate; let totalDays = 0; const bsYear = this.GetBSYear(bsDate, df); const bsMonth = this.GetBSYear(bsDate, df); const bsDay = this.GetBSYear(bsDate, df); if (NDateD.filter(x => x.NYear).length === 0 && bsMonth < 1 && bsMonth > 12 && this.GetDaysInMonthBS(bsYear, bsMonth) < bsDay) { return null; } adDate = new Date(BSADCal.filter(x => x.NYear === bsYear)[0].StartDate); totalDays = this.GetBSYearCal(bsYear).filter(x => x.Month === bsMonth)[0].Days; totalDays = totalDays + bsDay - 1; totalDays = (totalDays * 24 * 3600 * 1000); totalDays += adDate.getTime(); adDate.setTime(totalDays); return adDate; } GetDateADOfMonthStartEnd(bsDate, isStart, df) { const bsYear = this.GetBSYear(bsDate, df); const bsMonth = this.GetBSMonth(bsDate, df); const bsDay = this.GetBSDay(bsDate, df); let daysInMonth = 0; let adDate = new Date(); if (isStart) { adDate = this.GetDateAD(bsDay, bsMonth, 1); } else { daysInMonth = this.GetDaysInMonthBS(bsYear, bsMonth); adDate = this.GetDateAD(bsYear, bsMonth, daysInMonth); } return adDate; } GetDaysInMonthBS(bsYear, bsMonth) { switch (bsMonth) { case 1: return NDateD.filter(x => x.NYear === bsYear)[0].M1; case 2: return NDateD.filter(x => x.NYear === bsYear)[0].M2; case 3: return NDateD.filter(x => x.NYear === bsYear)[0].M3; case 4: return NDateD.filter(x => x.NYear === bsYear)[0].M4; case 5: return NDateD.filter(x => x.NYear === bsYear)[0].M5; case 6: return NDateD.filter(x => x.NYear === bsYear)[0].M6; case 7: return NDateD.filter(x => x.NYear === bsYear)[0].M7; case 8: return NDateD.filter(x => x.NYear === bsYear)[0].M8; case 9: return NDateD.filter(x => x.NYear === bsYear)[0].M9; case 10: return NDateD.filter(x => x.NYear === bsYear)[0].M10; case 11: return NDateD.filter(x => x.NYear === bsYear)[0].M11; case 12: return NDateD.filter(x => x.NYear === bsYear)[0].M12; default: return 0; } } GetDaysInMonthAD(adYear, adMonth) { let daysInMonth; const adDate = new Date(adYear, adMonth, 1); const date1 = adDate; date1.setDate(1 - date1.getDate()); const date2 = adDate; date2.setDate(1 - date2.getDate()); daysInMonth = (1 + this.GetDateAdd(date2, adDate)) - this.GetDateAdd(date1, adDate); return daysInMonth; } getFormatedDate(dateAD, option) { let result; if (option.userSelectedFormat) { if (option.userSelectedFormat === 1) { option.dtFormat = DateFormat.ddMMyyyy; } else if (option.userSelectedFormat === 2) { option.dtFormat = DateFormat.MMddyyyy; } else if (option.userSelectedFormat === 3) { option.dtFormat = DateFormat.yyyyMMdd; } else if (option.userSelectedFormat === 4) { option.dtFormat = DateFormat.yyyyddMM; } } if (!option.dtFormat) { option.dtFormat = DateFormat.ddMMyyyy; } if (!option.dateType) { option.dateType = DateType.AD; } if (dateAD) { if (option.dateType === DateType.AD) { result = this.GetFormatedDateAD(dateAD, option.dtFormat); } else { result = this.GetDateBS(dateAD, option.dtFormat); } } else { result = 'undefined'; } return result; } GetFormatedDateAD(adDate, dtFormat) { adDate = new Date(adDate); // console.log(adDate) const yy = adDate.getFullYear().toString(); const mm = (adDate.getMonth() + 1 < 10) ? '0' + (adDate.getMonth() + 1).toString() : (adDate.getMonth() + 1).toString(); const dd = (adDate.getDate() < 10) ? '0' + (adDate.getDate()).toString() : (adDate.getDate()).toString(); switch (dtFormat) { case 'ddMMyyyy': return dd + '-' + mm + '-' + yy; case 'MMddyyyy': return mm + '-' + dd + '-' + yy; case 'yyyyddMM': // yyyyddmm return yy + '-' + dd + '-' + mm; case 'yyyyMMdd': // yyyymmdd return yy + '-' + mm + '-' + dd; default: // ddmmyyyy return dd + '-' + mm + '-' + yy; } } GetFormatedDateBS(bsYear, bsMonth, bsDay, dtFormat) { const yy = bsYear.toString(); const mm = (bsMonth < 10) ? '0' + bsMonth : bsMonth.toString(); const dd = (bsDay < 10) ? '0' + bsDay : bsDay.toString(); switch (dtFormat) { case 'ddMMyyyy': return dd + '-' + mm + '-' + yy; case 'MMddyyyy': return mm + '-' + dd + '-' + yy; case 'yyyyddMM': // yyyyddmm return yy + '-' + dd + '-' + mm; case 'yyyyMMdd': // yyyymmdd return yy + '-' + mm + '-' + dd; default: // ddmmyyyy return dd + '-' + mm + '-' + yy; } } getFormatedDateLong(value, dtFormat, dtType) { if (value && value.length == 10) { value = value.substr(0, 10); const yr = this.GetBSYear(value, dtFormat); const mn = this.GetBSMonth(value, dtFormat); const dy = this.GetBSDay(value, dtFormat); let monthName = ''; if (dtType === DateType.BS) { const monthList = this.GetBSMonthList(); monthName = monthList[mn - 1].month; } else { const monthList = this.GetADMonthList(); monthName = monthList[mn - 1].month; } return `${dy} ${monthName} ${yr}`; } else { return `Calendar not found!`; } } getLongDateString(val) { const date = new Date(val.getFullYear(), val.getMonth(), val.getDate(), val.getHours(), val.getMinutes(), val.getSeconds()); var result = `${this.GetWeekDayPrefixList()[date.getDay()].prefix}, ${this.GetADMonthList()[date.getMonth()].month} ${date.getDate()} ${date.getFullYear()}`; return result; } GetDaysInYear(bsYear) { let totalDays = 0; NDateD.filter(x => x.NYear < bsYear).forEach(item => { totalDays += item.M1 + item.M2 + item.M3 + item.M4 + item.M5 + item.M6; totalDays += item.M7 + item.M8 + item.M9 + item.M10 + item.M11 + item.M12; }); return totalDays; } GetDateAdd(date1, date2) { const timeAdd = date2.getTime() + date1.getTime(); return Math.ceil(Math.abs(timeAdd / (1000 * 3600 * 24))); } GetDateDiff(date1, date2) { const timeDiff = date2.getTime() - date1.getTime(); return Math.ceil(Math.abs(timeDiff / (1000 * 3600 * 24))); } addYearInBS(bsDate, addYear, df) { let year = this.GetBSYear(bsDate, df); let month = this.GetBSMonth(bsDate, df); let day = this.GetBSDay(bsDate, df); const oldDaysInMonth = this.GetDaysInMonthBS(year, month); year = year + addYear; if (day === 1) { if (month === 1) { month = 12; year = year - 1; } else { month = month - 1; } day = this.GetDaysInMonthBS(year, month); } else { if (oldDaysInMonth === day) { day = this.GetDaysInMonthBS(year, month) - 1; } else { day = day - 1; if (day >= this.GetDaysInMonthBS(year, month)) { day = this.GetDaysInMonthBS(year, month) - 1; } } } return this.GetDateAD(year, month, day); } } CalendarService.decorators = [ { type: Injectable } ]; CalendarService.ctorParameters = () => []; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9saWJyYXJ5L01hdENhbGVuZGFyL3Byb2plY3RzL25neC1tYXQtY2FsZW5kYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2NhbGVuZGFyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWtDLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSXhELE1BQU0sT0FBTyxlQUFlO0lBRXhCLGdCQUFnQixDQUFDO0lBRVYsY0FBYztRQUNqQixNQUFNLFNBQVMsR0FBWTtZQUN2QixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN6QixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN6QixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN4QixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUMxQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN6QixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUMxQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUMzQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN6QixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN2QixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVB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LElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0MsSUFBSSxHQUFHLElBQUksR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ2hDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLElBQUksR0FBRyxJQUFJLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzQyxJQUFJLEdBQUcsSUFBSSxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDaEMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0MsSUFBSSxHQUFHLElBQUksR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ2hDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLElBQUksR0FBRyxJQUFJLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQztRQUNqQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1QyxJQUFJLEdBQUcsSUFBSSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUM7UUFDakMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUMsSUFBSSxHQUFHLElBQUksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDO1FBQ2pDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUs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SyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxLQUFLLENBQUM7Z0JBQ0YsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEQsS0FBSyxDQUFDO2dCQUNGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hELEtBQUssQ0FBQztnQkFDRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxLQUFLLENBQUM7Z0JBQ0YsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEQsS0FBSyxDQUFDO2dCQUNGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hELEtBQUssQ0FBQztnQkFDRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxLQUFLLENBQUM7Z0JBQ0YsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUFN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QkFBTTtnQkFDSCxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUNyQjtZQUNELEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBRTVDO2FBQU07WUFDSCxJQUFJLGNBQWMsS0FBSyxHQUFHLEVBQUU7Z0JBQ3hCLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNoRDtpQkFBTTtnQkFDSCxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDZCxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO29CQUMzQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ2hEO2FBQ0o7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7OztZQWhnQkosVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTW9udGgsIERheSwgSU5Nb3RoQ2FsLCBJTkRhdGVELCBEYXRlRm9ybWF0LCBEYXRlVHlwZSB9IGZyb20gJy4uL21vZGVsL2NhbGVuZGFyLm1vZGVsJztcclxuaW1wb3J0IHsgTkRhdGVELCBCU0FEQ2FsIH0gZnJvbSAnLi4vZGF0YS9jYWxlbmRhci5kYXRhJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDYWxlbmRhclNlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gICAgcHVibGljIEdldEJTTW9udGhMaXN0KCkge1xyXG4gICAgICAgIGNvbnN0IG1vbnRoTGlzdDogTW9udGhbXSA9IFtcclxuICAgICAgICAgICAgeyBtb250aDogJ+CkrOCliOCktuCkvuCklicsIGlkOiAxIH0sXHJcbiAgICAgICAgICAgIHsgbW9udGg6ICfgpJzgpYfgpLfgpY3gpKAnLCBpZDogMiB9LFxyXG4gICAgICAgICAgICB7IG1vbnRoOiAn4KSF4KS44KS+4KSwJywgaWQ6IDMgfSxcclxuICAgICAgICAgICAgeyBtb250aDogJ+CktuCljeCksOCkvuCkteCkoycsIGlkOiA0IH0sXHJcbiAgICAgICAgICAgIHsgbW9udGg6ICfgpK3gpL7gpKbgpY3gpLAnLCBpZDogNSB9LFxyXG4gICAgICAgICAgICB7IG1vbnRoOiAn4KSG4KS24KWN4KS14KS/4KSoJywgaWQ6IDYgfSxcclxuICAgICAgICAgICAgeyBtb250aDogJ+CkleCkvuCksOCljeCkpOCkv+CklScsIGlkOiA3IH0sXHJcbiAgICAgICAgICAgIHsgbW9udGg6ICfgpK7gpILgpLjgpYDgpLAnLCBpZDogOCB9LFxyXG4gICAgICAgICAgICB7IG1vbnRoOiAn4KSq4KWB4KS3JywgaWQ6IDkgfSxcclxuICAgICAgICAgICAgeyBtb250aDogJ+CkruCkvuCkmCcsIGlkOiAxMCB9LFxyXG4gICAgICAgICAgICB7IG1vbnRoOiAn4KSr4KS+4KSy4KWN4KSX4KWB4KSoJywgaWQ6IDExIH0sXHJcbiAgICAgICAgICAgIHsgbW9udGg6ICfgpJrgpYjgpKTgpY3gpLAnLCBpZDogMTIgfVxyXG4gICAgICAgIF07XHJcbiAgICAgICAgcmV0dXJuIG1vbnRoTGlzdDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldEZpc2NhbFllYXIoZGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IGJzRGF0ZSA9IHRoaXMuR2V0RGF0ZUJTKGRhdGUsIERhdGVGb3JtYXQuTU1kZHl5eXkpO1xyXG4gICAgICAgIGNvbnN0IGJzTW9udGggPSB0aGlzLkdldEJTTW9udGgoYnNEYXRlLCBEYXRlRm9ybWF0Lk1NZGR5eXl5KTtcclxuICAgICAgICBjb25zdCBic1llYXIgPSB0aGlzLkdldEJTWWVhcihic0RhdGUsIERhdGVGb3JtYXQuTU1kZHl5eXkpO1xyXG4gICAgICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgICAgICBpZiAoYnNNb250aCA8PSAzKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IChic1llYXIgLSAxKS50b1N0cmluZygpLnN1YnN0cmluZygyKSArICfgpaQnICsgYnNZZWFyLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGJzWWVhci50b1N0cmluZygpLnN1YnN0cmluZygyKSArICfgpaQnICsgKGJzWWVhciArIDEpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIEdldEFETW9udGhMaXN0KCkge1xyXG4gICAgICAgIGNvbnN0IG1vbnRoTGlzdDogTW9udGhbXSA9IFtcclxuICAgICAgICAgICAgeyBtb250aDogJ0phbnVhcnknLCBpZDogMSB9LFxyXG4gICAgICAgICAgICB7IG1vbnRoOiAnRmVicnVhcnknLCBpZDogMiB9LFxyXG4gICAgICAgICAgICB7IG1vbnRoOiAnTWFyY2gnLCBpZDogMyB9LFxyXG4gICAgICAgICAgICB7IG1vbnRoOiAnQXByaWwnLCBpZDogNCB9LFxyXG4gICAgICAgICAgICB7IG1vbnRoOiAnTWF5JywgaWQ6IDUgfSxcclxuICAgICAgICAgICAgeyBtb250aDogJ0p1bmUnLCBpZDogNiB9LFxyXG4gICAgICAgICAgICB7IG1vbnRoOiAnSnVseScsIGlkOiA3IH0sXHJcbiAgICAgICAgICAgIHsgbW9udGg6ICdBdWd1c3QnLCBpZDogOCB9LFxyXG4gICAgICAgICAgICB7IG1vbnRoOiAnU2VwdGVtYmVyJywgaWQ6IDkgfSxcclxuICAgICAgICAgICAgeyBtb250aDogJ09jdG9iZXInLCBpZDogMTAgfSxcclxuICAgICAgICAgICAgeyBtb250aDogJ05vdmVtYmVyJywgaWQ6IDExIH0sXHJcbiAgICAgICAgICAgIHsgbW9udGg6ICdEZWNlbWJlcicsIGlkOiAxMiB9XHJcbiAgICAgICAgXTtcclxuICAgICAgICByZXR1cm4gbW9udGhMaXN0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRCU01vbnRoTmFtZShtb250aElkOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBtb250aG5hbWU6IE1vbnRoW10gPSB0aGlzLkdldEJTTW9udGhMaXN0KCkuZmlsdGVyKHggPT4geC5pZCA9PT0gbW9udGhJZCk7XHJcbiAgICAgICAgaWYgKG1vbnRobmFtZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb250aG5hbWVbMF0ubW9udGg7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QURNb250aE5hbWUobW9udGhJZDogbnVtYmVyKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IG1vbnRobmFtZTogTW9udGhbXSA9IHRoaXMuR2V0QURNb250aExpc3QoKS5maWx0ZXIoeCA9PiB4LmlkID09PSBtb250aElkKTtcclxuICAgICAgICBpZiAobW9udGhuYW1lLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1vbnRobmFtZVswXS5tb250aDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRXZWVrRGF5TmFtZShkYXlJZDogbnVtYmVyKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHdlZWtEYXk6IERheVtdID0gdGhpcy5HZXRXZWVrRGF5TmFtZUxpc3QoKS5maWx0ZXIoeCA9PiB4LmlkID09PSBkYXlJZCk7XHJcbiAgICAgICAgaWYgKHdlZWtEYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gd2Vla0RheVswXS5kYXk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFdlZWtEYXlOYW1lTGlzdCgpIHtcclxuICAgICAgICBjb25zdCBkYXlMaXN0OiBEYXlbXSA9IFtcclxuICAgICAgICAgICAgeyBkYXk6ICdTdW5kYXknLCBuZXBhbGlEYXk6ICfgpIbgpIfgpKTgpKzgpL7gpLAnLCBpZDogMSwgcHJlZml4OiAnU3VuJyB9LFxyXG4gICAgICAgICAgICB7IGRheTogJ01vbmRheScsIG5lcGFsaURheTogJ+CkuOCkvuClh+CkruCkrOCkvuCksCcsIGlkOiAyLCBwcmVmaXg6IFwiTW9uXCIgfSxcclxuICAgICAgICAgICAgeyBkYXk6ICdUdWVzZGF5JywgbmVwYWxpRGF5OiAn4KSu4KSC4KSX4KSy4KSs4KS+4KSwJywgaWQ6IDMsIHByZWZpeDogXCJUdWVcIiB9LFxyXG4gICAgICAgICAgICB7I