air-lib
Version:
This is Air's angular component library
714 lines • 63.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import * as moment_ from 'moment';
import * as i0 from "@angular/core";
/** @type {?} */
var moment = moment_;
var DateService = /** @class */ (function () {
function DateService() {
}
/**
* @param {?} value
* @param {?} locale
* @return {?}
*/
DateService.prototype.dateFormatString = /**
* @param {?} value
* @param {?} locale
* @return {?}
*/
function (value, locale) {
if (!value) {
return '';
}
/** @type {?} */
var date = new Date(value + '+0000');
return this.formatDate(date, locale);
};
/**
* @param {?} date
* @return {?}
*/
DateService.prototype.getDayAndMonth = /**
* @param {?} date
* @return {?}
*/
function (date) {
return moment(date).format('D MMMM');
};
/**
* @param {?} dateStr
* @param {?} locale
* @return {?}
*/
DateService.prototype.formatDate = /**
* @param {?} dateStr
* @param {?} locale
* @return {?}
*/
function (dateStr, locale) {
return this.getCustomDateWithTitle(dateStr, locale, true);
};
/**
* @param {?} fromUtc
* @param {?} toUtc
* @param {?} locale
* @return {?}
*/
DateService.prototype.formatPeriod = /**
* @param {?} fromUtc
* @param {?} toUtc
* @param {?} locale
* @return {?}
*/
function (fromUtc, toUtc, locale) {
return this.getCustomPeriod({ 'FromUtc': fromUtc, 'ToUtc': toUtc }, locale);
};
/**
* @param {?} date
* @param {?} locale
* @return {?}
*/
DateService.prototype.formatTime = /**
* @param {?} date
* @param {?} locale
* @return {?}
*/
function (date, locale) {
if (!locale) {
locale = 'ru';
}
moment.locale(locale);
/** @type {?} */
var mask = 'HH:mm';
/** @type {?} */
var utcDate = moment.utc(date).toDate();
/** @type {?} */
var fDate = moment(utcDate).local().format(mask);
return fDate;
};
/**
* @param {?} date
* @param {?} locale
* @param {?} isFullMonth
* @return {?}
*/
DateService.prototype.getCustomDate = /**
* @param {?} date
* @param {?} locale
* @param {?} isFullMonth
* @return {?}
*/
function (date, locale, isFullMonth) {
if (!locale) {
locale = 'ru';
}
moment.locale(locale);
/** @type {?} */
var isCurrentYear = moment(date).isSame(moment(), 'year');
/** @type {?} */
var mask = 'D MMM';
if (isFullMonth) {
mask = mask.concat('M');
}
if (!isCurrentYear) {
mask = mask.concat(' YYYY');
}
/** @type {?} */
var fDate = moment(date).format(mask);
return fDate;
};
/**
* @param {?} date
* @param {?} locale
* @param {?} isFullMonth
* @return {?}
*/
DateService.prototype.getCustomDateWithTitle = /**
* @param {?} date
* @param {?} locale
* @param {?} isFullMonth
* @return {?}
*/
function (date, locale, isFullMonth) {
switch (locale) {
case 'ru':
case 'ru-RU':
locale = 'ru';
break;
case 'en':
case 'en-US':
locale = 'en';
break;
case 'ua':
case 'ua-UA':
locale = 'ua';
break;
default:
locale = 'ru';
break;
}
/** @type {?} */
var localeDays = {
'en': {
'yesterday': 'yesterday',
'today': 'today'
},
'ru': {
'yesterday': 'вчера',
'today': 'сегодня'
},
'ua': {
'yesterday': 'вчора',
'today': 'сьогодні'
}
};
moment.locale(locale);
/** @type {?} */
var isToday = moment(date).isSame(moment(), 'day');
/** @type {?} */
var isYesterday = moment(date).isSame(moment().subtract(1, 'days'), 'day');
/** @type {?} */
var today = localeDays[locale]['today'];
/** @type {?} */
var yesterday = localeDays[locale]['yesterday'];
/** @type {?} */
var fDate = this.getCustomDate(date, locale, isFullMonth);
if (isToday) {
fDate = today;
}
if (isYesterday) {
fDate = yesterday;
}
return fDate;
};
/**
* @param {?} period
* @param {?} locale
* @return {?}
*/
DateService.prototype.getCustomPeriod = /**
* @param {?} period
* @param {?} locale
* @return {?}
*/
function (period, locale) {
if (!locale) {
locale = 'ru';
}
switch (locale) {
case 'ru':
case 'ru-RU':
locale = 'ru';
break;
case 'en':
case 'en-US':
locale = 'en';
break;
case 'ua':
case 'ua-UA':
locale = 'ua';
break;
default:
locale = 'ru';
break;
}
/** @type {?} */
var localeYears = {
'en': {
'year': 'Year',
'years': 'YY'
},
'ru': {
'year': 'год',
'years': 'гг.'
},
'ua': {
'year': 'рік',
'years': 'рр.'
}
};
moment.locale(locale);
/** @type {?} */
var year = localeYears[locale]['year'];
/** @type {?} */
var years = localeYears[locale]['years'];
/** @type {?} */
var fromFilter;
/** @type {?} */
var toFilter;
/** @type {?} */
var isSameDates = moment(period.FromUtc).isSame(moment(period.ToUtc), 'day');
/** @type {?} */
var isSameMonth = moment(period.FromUtc).isSame(moment(period.ToUtc), 'month');
/** @type {?} */
var isSameYear = moment(period.FromUtc).isSame(moment(period.ToUtc), 'year');
/** @type {?} */
var isFromDateIsStartOfMonth = moment(period.FromUtc).isSame(moment(period.FromUtc).startOf('month'), 'day');
/** @type {?} */
var isToDateIsEndOfMonth = moment(period.ToUtc).isSame(moment(period.ToUtc).endOf('month'), 'day');
/** @type {?} */
var isFromDateIsStartOfYear = moment(period.FromUtc).isSame(moment(period.FromUtc).startOf('year'), 'day');
/** @type {?} */
var isToDateIsEndOfYear = moment(period.ToUtc).isSame(moment(period.ToUtc).endOf('year'), 'day');
/** @type {?} */
var isFromDateInCurrentYear = moment(period.FromUtc).isSame(moment(), 'year');
/** @type {?} */
var isToDateInCurrentYear = moment(period.ToUtc).isSame(moment(), 'year');
if (isSameDates) {
return this.getCustomDateWithTitle(period.FromUtc, locale, true);
}
if (isFromDateIsStartOfYear && isToDateIsEndOfYear) {
if (isSameYear) {
return moment(period.FromUtc).format('YYYY') + ' ' + year;
}
else {
return moment(period.FromUtc).format('YYYY') + ' - ' + moment(period.FromUtc).format('YYYY') + ' ' + years;
}
}
if (isFromDateIsStartOfMonth && isToDateIsEndOfMonth) {
if (isSameMonth) {
if (isSameYear) {
if (isToDateInCurrentYear) {
return moment(period.FromUtc).format('MMMM');
}
else {
return moment(period.FromUtc).format('MMMM YYYY');
}
}
else {
return moment(period.FromUtc).format('MMM YYYY') + ' - ' + moment(period.ToUtc).format('MMM YYYY');
}
}
else {
if (isSameYear) {
if (isToDateInCurrentYear) {
return moment(period.FromUtc).format('MMMM') + ' - ' + moment(period.ToUtc).format('MMMM');
}
else {
return moment(period.FromUtc).format('MMMM') + ' - ' + moment(period.ToUtc).format('MMMM YYYY');
}
}
else {
return moment(period.FromUtc).format('MMM YYYY') + ' - ' + moment(period.ToUtc).format('MMM YYYY');
}
}
}
else {
if (isSameMonth) {
if (isSameYear) {
if (isToDateInCurrentYear) {
return moment(period.FromUtc).format('D') + ' - ' + moment(period.ToUtc).format('D MMM');
}
else {
return moment(period.FromUtc).format('D') + ' - ' + moment(period.ToUtc).format('D MMM YYYY');
}
}
else {
return moment(period.FromUtc).format('D MMM YYYY') + ' - ' + moment(period.ToUtc).format('D MMM YYYY');
}
}
else {
if (isFromDateIsStartOfMonth) {
fromFilter = 'MMM';
toFilter = 'D MMM';
}
else if (isToDateIsEndOfMonth) {
fromFilter = 'D MMM';
toFilter = 'MMM';
}
else {
fromFilter = 'D MMM';
toFilter = 'D MMM';
}
if (isSameYear) {
if (!isToDateInCurrentYear) {
toFilter = toFilter.concat(' YYYY');
}
}
else {
if (!isFromDateInCurrentYear) {
fromFilter = fromFilter.concat(' YYYY');
}
if (!isToDateInCurrentYear) {
toFilter = toFilter.concat(' YYYY');
}
}
return moment(period.FromUtc).format(fromFilter) + ' - ' + moment(period.ToUtc).format(toFilter);
}
}
};
/**
* @param {?} period
* @return {?}
*/
DateService.prototype.getDiffPeriod = /**
* @param {?} period
* @return {?}
*/
function (period) {
/** @type {?} */
var start = moment(period.FromUtc);
/** @type {?} */
var finish = moment(period.ToUtc);
/** @type {?} */
var cntYears = finish.year() - start.year();
/** @type {?} */
var cntMonths = finish.month() - start.month();
/** @type {?} */
var cntDays = finish.date() - start.date();
if (cntDays < 0) {
if (finish.daysInMonth() === finish.date()) {
cntDays = 0;
}
else {
cntMonths--;
/** @type {?} */
var fMonth = finish.month() - 1;
/** @type {?} */
var cntDaysInMonth = moment([finish.year(), fMonth < 0 ? 11 : fMonth, 1]).daysInMonth();
cntDays = (start.date() > cntDaysInMonth ? 0 : cntDaysInMonth - start.date()) + finish.date();
}
}
if (cntMonths < 0) {
cntYears--;
cntMonths = 11 - start.month() + finish.month();
}
return { years: cntYears, months: cntMonths, days: cntDays };
};
/**
* @param {?} years
* @param {?} months
* @param {?} days
* @param {?} locale
* @param {?} and
* @return {?}
*/
DateService.prototype.getPeriodString = /**
* @param {?} years
* @param {?} months
* @param {?} days
* @param {?} locale
* @param {?} and
* @return {?}
*/
function (years, months, days, locale, and) {
/** @type {?} */
var andSpaced = and ? ' ' + and + ' ' : ' ';
if (years) {
/** @type {?} */
var monthStr = this.getMonthString(months, locale);
return "" + this.getYearString(years, locale) + (monthStr ? andSpaced : '') + monthStr;
}
else if (months) {
/** @type {?} */
var dayStr = this.getDayString(days, false, locale);
return "" + this.getMonthString(months, locale) + (dayStr ? andSpaced : '') + dayStr;
}
else {
return this.getDayString(days, true, locale);
}
};
/**
* @private
* @param {?} years
* @param {?} locale
* @return {?}
*/
DateService.prototype.getYearString = /**
* @private
* @param {?} years
* @param {?} locale
* @return {?}
*/
function (years, locale) {
if (!years) {
return '';
}
if (locale === 'ru') {
if (years < 5) {
if (years === 1) {
return years + " \u0433\u043E\u0434";
}
return years + " \u0433\u043E\u0434\u0430";
}
else {
return years + " \u043B\u0435\u0442";
}
}
else {
if (years === 1) {
return years + " year";
}
return years + " years";
}
};
/**
* @private
* @param {?} months
* @param {?} locale
* @return {?}
*/
DateService.prototype.getMonthString = /**
* @private
* @param {?} months
* @param {?} locale
* @return {?}
*/
function (months, locale) {
if (!months) {
return '';
}
if (locale === 'ru') {
if (months < 5) {
if (months === 1) {
return months + " \u043C\u0435\u0441\u044F\u0446";
}
return months + " \u043C\u0435\u0441\u044F\u0446\u0430";
}
else {
return months + " \u043C\u0435\u0441\u044F\u0446\u0435\u0432";
}
}
else {
if (months === 1) {
return months + " month";
}
return months + " months";
}
};
/**
* @private
* @param {?} days
* @param {?=} isSingle
* @param {?=} locale
* @return {?}
*/
DateService.prototype.getDayString = /**
* @private
* @param {?} days
* @param {?=} isSingle
* @param {?=} locale
* @return {?}
*/
function (days, isSingle, locale) {
if (isSingle === void 0) { isSingle = true; }
if (locale === 'ru') {
if (days) {
if (days < 5 || (days > 20 && days < 25)) {
if (days === 1) {
if (isSingle) {
return 'вчера';
}
return days + " \u0434\u0435\u043D\u044C";
}
if (days === 21) {
return days + " \u0434\u0435\u043D\u044C";
}
return days + " \u0434\u043D\u044F";
}
else {
return days + " \u0434\u043D\u0435\u0439";
}
}
else {
if (isSingle) {
return 'сегодня';
}
}
}
else {
if (days) {
if (days === 1) {
if (isSingle) {
return 'yesterday';
}
return days + " day";
}
return days + " days";
}
else {
if (isSingle) {
return 'today';
}
}
}
return '';
};
/**
* @param {?} period
* @param {?} locale
* @param {?} and
* @param {?=} flag
* @return {?}
*/
DateService.prototype.getCustomDiffPeriod = /**
* @param {?} period
* @param {?} locale
* @param {?} and
* @param {?=} flag
* @return {?}
*/
function (period, locale, and, flag) {
if (flag === void 0) { flag = false; }
/** @type {?} */
var dateTimeFrom = moment(period.FromUtc);
/** @type {?} */
var dateTimeTo = moment(period.ToUtc);
if (!locale || locale.includes('ru')) {
locale = 'ru';
}
moment.locale(locale);
if (!and || flag) {
and = '';
}
/** @type {?} */
var diff = this.getDiffPeriod(period);
return this.getPeriodString(diff.years, diff.months, diff.days, locale, and);
};
/**
* @param {?} periodDictionary
* @param {?} ranges
* @param {?} fullperiod
* @return {?}
*/
DateService.prototype.setPresetPeriods = /**
* @param {?} periodDictionary
* @param {?} ranges
* @param {?} fullperiod
* @return {?}
*/
function (periodDictionary, ranges, fullperiod) {
/** @type {?} */
var fyear;
/** @type {?} */
var fmonth;
/** @type {?} */
var fdate;
if (fullperiod) {
fyear = fullperiod.FromUtc.getFullYear();
fmonth = fullperiod.FromUtc.getMonth();
fdate = fullperiod.FromUtc.getDate();
}
else {
fyear = moment().year();
fmonth = moment().month();
fdate = moment().date();
}
periodDictionary.forEach(function (period) {
switch (period.Type) {
case 'Today':
ranges[period.Name] = [moment(), moment(), period.Type];
break;
case 'Yesterday':
ranges[period.Name] = [moment().subtract(1, 'days'), moment().subtract(1, 'days'), period.Type];
break;
case 'CurrentWeek':
ranges[period.Name] = [moment().subtract(6, 'days'), moment(), period.Type];
break;
case 'CurrentMonth':
ranges[period.Name] = [moment().startOf('month'), moment(), period.Type];
break;
case 'LastMonth':
ranges[period.Name] = [
moment().subtract(1, 'months')
.startOf('month'), moment().subtract(1, 'months')
.endOf('month'), period.Type
];
break;
case 'CurrentYear':
ranges[period.Name] = [moment().startOf('year'), moment().endOf('year'), period.Type];
break;
case 'LastYear':
ranges[period.Name] = [
moment().subtract(1, 'year')
.startOf('year'), moment().subtract(1, 'year')
.endOf('year'), period.Type
];
break;
case 'FullTime':
ranges[period.Name] = [moment([fyear, fmonth, fdate]), moment(), period.Type];
break;
}
});
};
/**
* @return {?}
*/
DateService.prototype.getMonths = /**
* @return {?}
*/
function () {
return moment.months();
};
/**
* @return {?}
*/
DateService.prototype.getMonthsShortName = /**
* @return {?}
*/
function () {
return Array.apply(0, Array(12)).map(function (_, i) { return moment().month(i).format('MMM'); });
};
/**
* @param {?} date
* @return {?}
*/
DateService.prototype.getTotalDaysFromYoutubeDate = /**
* @param {?} date
* @return {?}
*/
function (date) {
return moment(date).diff(moment([1970, 0, 1]), 'days');
};
/**
* @param {?} fromUtc
* @param {?} toUtc
* @param {?} locale
* @return {?}
*/
DateService.prototype.getPeriodInMonths = /**
* @param {?} fromUtc
* @param {?} toUtc
* @param {?} locale
* @return {?}
*/
function (fromUtc, toUtc, locale) {
if (!locale) {
locale = 'ru';
}
moment.locale(locale);
/** @type {?} */
var isSameMonth = moment(fromUtc).isSame(moment(toUtc), 'month');
/** @type {?} */
var isSameYear = moment(fromUtc).isSame(moment(toUtc), 'year');
if (isSameMonth || isSameYear) {
return moment(fromUtc).format('MMMM YYYY');
}
return moment(fromUtc).format('MMMM YYYY') + ' - ' + moment(toUtc).format('MMMM YYYY');
};
/**
* @param {?} data
* @return {?}
*/
DateService.prototype.transformDate = /**
* @param {?} data
* @return {?}
*/
function (data) {
return new Date((new Date(data)).getTime() + 60000 * (-new Date().getTimezoneOffset()));
};
DateService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
DateService.ctorParameters = function () { return []; };
/** @nocollapse */ DateService.ngInjectableDef = i0.defineInjectable({ factory: function DateService_Factory() { return new DateService(); }, token: DateService, providedIn: "root" });
return DateService;
}());
export { DateService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWlyLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9kYXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7OztJQUU1QixNQUFNLEdBQUcsT0FBTztBQUV0QjtJQU1FO0lBQWdCLENBQUM7Ozs7OztJQUVWLHNDQUFnQjs7Ozs7SUFBdkIsVUFBd0IsS0FBVSxFQUFFLE1BQWM7UUFDOUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU8sRUFBRSxDQUFDO1NBQ2I7O1lBRUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDOzs7OztJQUVNLG9DQUFjOzs7O0lBQXJCLFVBQXNCLElBQVU7UUFDNUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Ozs7OztJQUVNLGdDQUFVOzs7OztJQUFqQixVQUFrQixPQUFZLEVBQUUsTUFBcUI7UUFDakQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDOzs7Ozs7O0lBRU0sa0NBQVk7Ozs7OztJQUFuQixVQUFvQixPQUFZLEVBQUUsS0FBVSxFQUFFLE1BQW1CO1FBQzdELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hGLENBQUM7Ozs7OztJQUVNLGdDQUFVOzs7OztJQUFq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QVUsU0FBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7Ozs7c0JBUkQ7Q0FzZUMsQUFoZUQsSUFnZUM7U0E1ZFksV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTW9tZW50TW9kdWxlIH0gZnJvbSAnbmd4LW1vbWVudCc7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgRGF0ZVNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBwdWJsaWMgZGF0ZUZvcm1hdFN0cmluZyh2YWx1ZTogYW55LCBsb2NhbGU6IHN0cmluZykge1xyXG4gICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSArICcrMDAwMCcpO1xyXG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlKGRhdGUsIGxvY2FsZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF5QW5kTW9udGgoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KCdEIE1NTU0nKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JtYXREYXRlKGRhdGVTdHI6IGFueSwgbG9jYWxlOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEN1c3RvbURhdGVXaXRoVGl0bGUoZGF0ZVN0ciwgbG9jYWxlLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JtYXRQZXJpb2QoZnJvbVV0YzogYW55LCB0b1V0YzogYW55LCBsb2NhbGU6IHN0cmluZ3xudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEN1c3RvbVBlcmlvZCh7ICdGcm9tVXRjJzogZnJvbVV0YywgJ1RvVXRjJzogdG9VdGMgfSwgbG9jYWxlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JtYXRUaW1lKGRhdGU6IGFueSwgbG9jYWxlOiBzdHJpbmcpIHtcclxuICAgICAgaWYgKCFsb2NhbGUpIHtcclxuICAgICAgICAgIGxvY2FsZSA9ICdydSc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG1vbWVudC5sb2NhbGUobG9jYWxlKTtcclxuXHJcbiAgICAgIGNvbnN0IG1hc2sgPSAnSEg6bW0nO1xyXG4gICAgICBjb25zdCB1dGNEYXRlID0gbW9tZW50LnV0YyhkYXRlKS50b0RhdGUoKTtcclxuICAgICAgY29uc3QgZkRhdGUgPSBtb21lbnQodXRjRGF0ZSkubG9jYWwoKS5mb3JtYXQobWFzayk7XHJcblxyXG4gICAgICByZXR1cm4gZkRhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q3VzdG9tRGF0ZShkYXRlOiBhbnksIGxvY2FsZTogc3RyaW5nLCBpc0Z1bGxNb250aDogYm9vbGVhbikge1xyXG4gICAgICBpZiAoIWxvY2FsZSkge1xyXG4gICAgICAgICAgbG9jYWxlID0gJ3J1JztcclxuICAgICAgfVxyXG5cclxuICAgICAgbW9tZW50LmxvY2FsZShsb2NhbGUpO1xyXG5cclxuICAgICAgY29uc3QgaXNDdXJyZW50WWVhciA9IG1vbWVudChkYXRlKS5pc1NhbWUobW9tZW50KCksICd5ZWFyJyk7XHJcbiAgICAgIGxldCBtYXNrID0gJ0QgTU1NJztcclxuXHJcbiAgICAgIGlmIChpc0Z1bGxNb250aCkge1xyXG4gICAgICAgICAgbWFzayA9IG1hc2suY29uY2F0KCdNJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghaXNDdXJyZW50WWVhcikge1xyXG4gICAgICAgICAgbWFzayA9IG1hc2suY29uY2F0KCcgWVlZWScpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBmRGF0ZSA9IG1vbWVudChkYXRlKS5mb3JtYXQobWFzayk7XHJcblxyXG4gICAgICByZXR1cm4gZkRhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q3VzdG9tRGF0ZVdpdGhUaXRsZShkYXRlOiBhbnksIGxvY2FsZTogc3RyaW5nIHwgbnVsbCwgaXNGdWxsTW9udGg6IGJvb2xlYW4pIHtcclxuXHJcbiAgICAgIHN3aXRjaCAobG9jYWxlKSB7XHJcbiAgICAgICAgICBjYXNlICdydSc6XHJcbiAgICAgICAgICBjYXNlICdydS1SVSc6XHJcbiAgICAgICAgICAgICAgbG9jYWxlID0gJ3J1JztcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ2VuJzpcclxuICAgICAgICAgIGNhc2UgJ2VuLVVTJzpcclxuICAgICAgICAgICAgICBsb2NhbGUgPSAnZW4nO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAndWEnOlxyXG4gICAgICAgICAgY2FzZSAndWEtVUEnOlxyXG4gICAgICAgICAgICAgIGxvY2FsZSA9ICd1YSc7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGxvY2FsZSA9ICdydSc7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGxvY2FsZURheXMgPSB7XHJcbiAgICAgICAgICAnZW4nOiB7XHJcbiAgICAgICAgICAgICAgJ3llc3RlcmRheSc6ICd5ZXN0ZXJkYXknLFxyXG4gICAgICAgICAgICAgICd0b2RheSc6ICd0b2RheSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAncnUnOiB7XHJcbiAgICAgICAgICAgICAgJ3llc3RlcmRheSc6ICfQstGH0LXRgNCwJyxcclxuICAgICAgICAgICAgICAndG9kYXknOiAn0YHQtdCz0L7QtNC90Y8nXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgJ3VhJzoge1xyXG4gICAgICAgICAgICAgICd5ZXN0ZXJkYXknOiAn0LLRh9C+0YDQsCcsXHJcbiAgICAgICAgICAgICAgJ3RvZGF5JzogJ9GB0YzQvtCz0L7QtNC90ZYnXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBtb21lbnQubG9jYWxlKGxvY2FsZSk7XHJcblxyXG4gICAgICBjb25zdCBpc1RvZGF5ID0gbW9tZW50KGRhdGUpLmlzU2FtZShtb21lbnQoKSwgJ2RheScpO1xyXG4gICAgICBjb25zdCBpc1llc3RlcmRheSA9IG1vbWVudChkYXRlKS5pc1NhbWUobW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheXMnKSwgJ2RheScpO1xyXG5cclxuICAgICAgY29uc3QgdG9kYXkgPSBsb2NhbGVEYXlzW2xvY2FsZV1bJ3RvZGF5J107XHJcbiAgICAgIGNvbnN0IHllc3RlcmRheSA9IGxvY2FsZURheXNbbG9jYWxlXVsneWVzdGVyZGF5J107XHJcblxyXG4gICAgICBsZXQgZkRhdGUgPSB0aGlzLmdldEN1c3RvbURhdGUoZGF0ZSwgbG9jYWxlLCBpc0Z1bGxNb250aCk7XHJcblxyXG4gICAgICBpZiAoaXNUb2RheSkge1xyXG4gICAgICAgICAgZkRhdGUgPSB0b2RheTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzWWVzdGVyZGF5KSB7XHJcbiAgICAgICAgICBmRGF0ZSA9IHllc3RlcmRheTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGZEYXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEN1c3RvbVBlcmlvZChwZXJpb2Q6IGFueSwgbG9jYWxlOiBzdHJpbmd8bnVsbCkge1xyXG4gICAgaWYgKCFsb2NhbGUpIHtcclxuICAgICAgbG9jYWxlID0gJ3J1JztcclxuICAgIH1cclxuICAgICAgc3dpdGNoIChsb2NhbGUpIHtcclxuICAgICAgICAgIGNhc2UgJ3J1JzpcclxuICAgICAgICAgIGNhc2UgJ3J1LVJVJzpcclxuICAgICAgICAgICAgICBsb2NhbGUgPSAncnUnO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnZW4nOlxyXG4gICAgICAgICAgY2FzZSAnZW4tVVMnOlxyXG4gICAgICAgICAgICAgIGxvY2FsZSA9ICdlbic7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICd1YSc6XHJcbiAgICAgICAgICBjYXNlICd1YS1VQSc6XHJcbiAgICAgICAgICAgICAgbG9jYWxlID0gJ3VhJztcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgbG9jYWxlID0gJ3J1JztcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBsb2NhbGVZZWFycyA9IHtcclxuICAgICAgICAgICdlbic6IHtcclxuICAgICAgICAgICAgICAneWVhcic6ICdZZWFyJyxcclxuICAgICAgICAgICAgICAneWVhcnMnOiAnWVknXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgJ3J1Jzoge1xyXG4gICAgICAgICAgICAgICd5ZWFyJzogJ9Cz0L7QtCcsXHJcbiAgICAgICAgICAgICAgJ3llYXJzJzogJ9Cz0LMuJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgICd1YSc6IHtcclxuICAgICAgICAgICAgICAneWVhcic6ICfRgNGW0LonLFxyXG4gICAgICAgICAgICAgICd5ZWFycyc6ICfRgNGALidcclxuICAgICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIG1vbWVudC5sb2NhbGUobG9jYWxlKTtcclxuXHJcbiAgICAgIGNvbnN0IHllYXIgPSBsb2NhbGVZZWFyc1tsb2NhbGVdWyd5ZWFyJ107XHJcbiAgICAgIGNvbnN0IHllYXJzID0gbG9jYWxlWWVhcnNbbG9jYWxlXVsneWVhcnMnXTtcclxuICAgICAgbGV0IGZyb21GaWx0ZXI6IGFueTtcclxuICAgICAgbGV0IHRvRmlsdGVyOiBhbnk7XHJcblxyXG4gICAgICBjb25zdCBpc1NhbWVEYXRlcyA9IG1vbWVudChwZXJpb2QuRnJvbVV0YykuaXNTYW1lKG1vbWVudChwZXJpb2QuVG9VdGMpLCAnZGF5Jyk7XHJcbiAgICAgIGNvbnN0IGlzU2FtZU1vbnRoID0gbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5pc1NhbWUobW9tZW50KHBlcmlvZC5Ub1V0YyksICdtb250aCcpO1xyXG4gICAgICBjb25zdCBpc1NhbWVZZWFyID0gbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5pc1NhbWUobW9tZW50KHBlcmlvZC5Ub1V0YyksICd5ZWFyJyk7XHJcbiAgICAgIGNvbnN0IGlzRnJvbURhdGVJc1N0YXJ0T2ZNb250aCA9IG1vbWVudChwZXJpb2QuRnJvbVV0YykuaXNTYW1lKG1vbWVudChwZXJpb2QuRnJvbVV0Yykuc3RhcnRPZignbW9udGgnKSwgJ2RheScpO1xyXG4gICAgICBjb25zdCBpc1RvRGF0ZUlzRW5kT2ZNb250aCA9IG1vbWVudChwZXJpb2QuVG9VdGMpLmlzU2FtZShtb21lbnQocGVyaW9kLlRvVXRjKS5lbmRPZignbW9udGgnKSwgJ2RheScpO1xyXG4gICAgICBjb25zdCBpc0Zyb21EYXRlSXNTdGFydE9mWWVhciA9IG1vbWVudChwZXJpb2QuRnJvbVV0YykuaXNTYW1lKG1vbWVudChwZXJpb2QuRnJvbVV0Yykuc3RhcnRPZigneWVhcicpLCAnZGF5Jyk7XHJcbiAgICAgIGNvbnN0IGlzVG9EYXRlSXNFbmRPZlllYXIgPSBtb21lbnQocGVyaW9kLlRvVXRjKS5pc1NhbWUobW9tZW50KHBlcmlvZC5Ub1V0YykuZW5kT2YoJ3llYXInKSwgJ2RheScpO1xyXG4gICAgICBjb25zdCBpc0Zyb21EYXRlSW5DdXJyZW50WWVhciA9IG1vbWVudChwZXJpb2QuRnJvbVV0YykuaXNTYW1lKG1vbWVudCgpLCAneWVhcicpO1xyXG4gICAgICBjb25zdCBpc1RvRGF0ZUluQ3VycmVudFllYXIgPSBtb21lbnQocGVyaW9kLlRvVXRjKS5pc1NhbWUobW9tZW50KCksICd5ZWFyJyk7XHJcblxyXG4gICAgICBpZiAoaXNTYW1lRGF0ZXMpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1c3RvbURhdGVXaXRoVGl0bGUocGVyaW9kLkZyb21VdGMsIGxvY2FsZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpc0Zyb21EYXRlSXNTdGFydE9mWWVhciAmJiBpc1RvRGF0ZUlzRW5kT2ZZZWFyKSB7XHJcbiAgICAgICAgICBpZiAoaXNTYW1lWWVhcikge1xyXG4gICAgICAgICAgICAgIHJldHVybiBtb21lbnQocGVyaW9kLkZyb21VdGMpLmZvcm1hdCgnWVlZWScpICsgJyAnICsgeWVhcjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudChwZXJpb2QuRnJvbVV0YykuZm9ybWF0KCdZWVlZJykgKyAnIC0gJyArIG1vbWVudChwZXJpb2QuRnJvbVV0YykuZm9ybWF0KCdZWVlZJykgKyAnICcgKyB5ZWFycztcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzRnJvbURhdGVJc1N0YXJ0T2ZNb250aCAmJiBpc1RvRGF0ZUlzRW5kT2ZNb250aCkge1xyXG4gICAgICAgICAgaWYgKGlzU2FtZU1vbnRoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGlzU2FtZVllYXIpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGlzVG9EYXRlSW5DdXJyZW50WWVhcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJu