com.phloxui
Version:
PhloxUI Ng2+ Framework
231 lines (230 loc) • 24.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export class DateTimeUtils {
/**
* @param {?} date1
* @param {?} date2
* @return {?}
*/
static diffDate(date1, date2) {
let /** @type {?} */ result = [];
if (date1 === null || typeof date1 === 'undefined') {
return result;
}
if (date2 === null || typeof date2 === 'undefined') {
return result;
}
let /** @type {?} */ diff = (date2.getTime() - date1.getTime()) / 1000;
diff = Math.abs(Math.floor(diff));
let /** @type {?} */ days = Math.floor(diff / (24 * 60 * 60));
let /** @type {?} */ leftSec = diff - days * 24 * 60 * 60;
let /** @type {?} */ hrs = Math.floor(leftSec / (60 * 60));
leftSec = leftSec - hrs * 60 * 60;
let /** @type {?} */ min = Math.floor(leftSec / (60));
leftSec = leftSec - min * 60;
result.push(days); // days
result.push(hrs); // hrs
result.push(min); // min
result.push(leftSec); // leftSec
return result;
}
/**
* @param {?} date1
* @param {?} date2
* @return {?}
*/
static diffDateInHour(date1, date2) {
if (date1 === null || typeof date1 === 'undefined') {
return 0;
}
if (date2 === null || typeof date2 === 'undefined') {
return 0;
}
let /** @type {?} */ hours = Math.abs(date1.getTime() - date2.getTime()) / (60 * 60 * 1000);
return hours;
}
/**
* @param {?} data
* @return {?}
*/
static getDateFromAny(data) {
let /** @type {?} */ resolveDate = null;
if (data !== null && typeof data !== 'undefined') {
if (typeof data === 'string') {
// If arg "pattern" is provided, put it at the first of the list to
// try to resolve with the given "pattern" first.
try {
resolveDate = Date.parseExact(data, DateTimeUtils.PATTERNS);
}
catch (/** @type {?} */ err) {
}
if (resolveDate === null || typeof resolveDate === 'undefined') {
try {
resolveDate = Date.parse(data);
}
catch (/** @type {?} */ err) {
}
}
}
else if (typeof data === 'number') {
try {
resolveDate = new Date(data);
}
catch (/** @type {?} */ err) {
}
}
else if (typeof data === 'object') {
if (data instanceof Date) {
resolveDate = new Date(data.getTime());
}
}
}
return resolveDate;
}
/**
* @param {?} date
* @return {?}
*/
static getTimeMessage(date) {
if (date === null || typeof date === 'undefined') {
return "";
}
let /** @type {?} */ now = new Date();
return this.getCompareTimeMessage(date, now);
}
/**
* @param {?} compareTo
* @param {?} date
* @return {?}
*/
static getCompareTimeMessage(compareTo, date) {
if (compareTo === null || typeof compareTo === 'undefined') {
return "";
}
if (date === null || typeof date === 'undefined') {
return "";
}
let /** @type {?} */ result = "";
// time since message was sent in seconds
let /** @type {?} */ seconds = (date.getTime() - compareTo.getTime()) / 1000;
let /** @type {?} */ min = seconds / 60;
let /** @type {?} */ hour = min / 60;
let /** @type {?} */ days = hour / 24;
let /** @type {?} */ weeks = days / 7;
let /** @type {?} */ months = weeks / 4;
let /** @type {?} */ years = months / 12;
// format string
if (seconds < 15) {
// < 15 secs
result = 'Just now';
}
else if (seconds < 60) {
// < 1 min
result = 'Within a minute ago';
}
else if (seconds < 300) {
// < 5 mins
result = 'A few minutes ago';
}
else if (seconds < 3600) {
// < 1 hour
result = Math.floor(min) + ' minutes ago';
}
else if (seconds < 86400) {
// < 1 day
result = 'About ' + Math.floor(hour) + ' hours ago';
}
else if (seconds < 172800) {
// < 2 days
result = 'Yesterday';
}
else if (seconds < 604800) {
// < 7 days
result = Math.floor(days) + ' days ago';
}
else if (seconds < 691200) {
// < 8 days
result = 'A week ago';
}
else if (seconds < 2628000) {
// < 1 month
result = Math.floor(weeks) + ' weeks ago';
}
else if (seconds < 5256000) {
// < 2 months
result = 'A month ago';
}
else if (seconds < 31536000) {
// < 12 months
result = Math.floor(months) + ' months ago';
}
else if (seconds < 63072000) {
// < 2 years
result = 'A year ago';
}
else if (seconds >= 63072000) {
// >= 2 years
result = Math.floor(years) + ' years ago';
}
return result;
}
/**
* @param {?} timeZone
* @return {?}
*/
static parseTimeZone(timeZone) {
let /** @type {?} */ isHasAddOrSub;
let /** @type {?} */ isHasColon;
let /** @type {?} */ tzDiff = 0;
timeZone = timeZone.replace(/\./g, ":");
isHasAddOrSub = /^(\+|\-)/i.test(timeZone); // + or -
isHasColon = /(\:)/i.test(timeZone); // :
let /** @type {?} */ addOrSubIndex = -1;
let /** @type {?} */ operationStr = "";
if (isHasAddOrSub) {
let /** @type {?} */ addIndex = timeZone.indexOf("+");
let /** @type {?} */ subIndex = timeZone.indexOf("-");
if (addIndex !== -1) {
addOrSubIndex = addIndex;
}
else {
addOrSubIndex = subIndex;
}
if (addOrSubIndex !== -1) {
operationStr = timeZone.substring(0, addOrSubIndex + 1);
}
}
try {
let /** @type {?} */ tz;
let /** @type {?} */ colon = ":";
if (isHasColon) {
let /** @type {?} */ stHour = addOrSubIndex + 1;
let /** @type {?} */ edHour = timeZone.indexOf(colon);
let /** @type {?} */ stMin = edHour + 1;
let /** @type {?} */ edMin = timeZone.length;
let /** @type {?} */ hour = Number(timeZone.substring(stHour, edHour));
let /** @type {?} */ min = Number(timeZone.substring(stMin, edMin));
tz = Number(operationStr + (hour * 100 + min));
}
else {
tz = Number(timeZone);
}
tzDiff = isNaN(tz) ? 0 : tz;
}
catch (/** @type {?} */ e) {
}
return tzDiff;
}
}
DateTimeUtils.PATTERNS = [
"yyyy-MM-dd'T'HH:mm:ssZ",
"dd/MM/yyyy",
"yyyy-MM-dd"
];
function DateTimeUtils_tsickle_Closure_declarations() {
/** @type {?} */
DateTimeUtils.PATTERNS;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0ZVRpbWVVdGlscy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3NoYXJlL3V0aWxzL0RhdGVUaW1lVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE1BQU07Ozs7OztJQWlCRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQVcsRUFBRSxLQUFXO1FBRTdDLHFCQUFJLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDMUIsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDZjtRQUNELEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQ2Y7UUFFRCxxQkFBSSxJQUFJLEdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzlELElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVsQyxxQkFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQscUJBQUksT0FBTyxHQUFXLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFFakQscUJBQUksR0FBRyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEQsT0FBTyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUVsQyxxQkFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUc3QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJCLE1BQU0sQ0FBQyxNQUFNLENBQUM7Ozs7Ozs7SUFHVCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQVcsRUFBRSxLQUFXO1FBQ25ELEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUNWO1FBRUQscUJBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUUzRSxNQUFNLENBQUMsS0FBSyxDQUFDOzs7Ozs7SUFHUixNQUFNLENBQUMsY0FBYyxDQUFDLElBQVM7UUFDcEMscUJBQUksV0FBVyxHQUFTLElBQUksQ0FBQztRQUU3QixFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDakQsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQzs7O2dCQUc3QixJQUFJLENBQUM7b0JBQ0gsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDN0Q7Z0JBQUMsS0FBSyxDQUFDLENBQUMsaUJBQUEsR0FBRyxFQUFFLENBQUM7aUJBQ2Q7Z0JBRUQsRUFBRSxDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxPQUFPLFdBQVcsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO29CQUMvRCxJQUFJLENBQUM7d0JBQ0gsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2hDO29CQUFDLEtBQUssQ0FBQyxDQUFDLGlCQUFBLEdBQUcsRUFBRSxDQUFDO3FCQUNkO2lCQUNGO2FBQ0Y7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDO29CQUNILFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDOUI7Z0JBQUMsS0FBSyxDQUFDLENBQUMsaUJBQUEsR0FBRyxFQUFFLENBQUM7aUJBQ2Q7YUFDRjtZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxFQUFFLENBQUMsQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDekIsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2lCQUN4QzthQUNGO1NBQ0Y7UUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDOzs7Ozs7SUFHZCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQVU7UUFDckMsRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxFQUFFLENBQUM7U0FDWDtRQUVELHFCQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRXJCLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzs7Ozs7O0lBR3hDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxTQUFlLEVBQUUsSUFBVTtRQUM3RCxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxJQUFJLE9BQU8sU0FBUyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsTUFBTSxDQUFDLEVBQUUsQ0FBQztTQUNYO1FBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxFQUFFLENBQUM7U0FDWDtRQUVELHFCQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O1FBRWhCLHFCQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDNUQscUJBQUksR0FBRyxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDdkIscUJBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDcEIscUJBQUksSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDckIscUJBQUksS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7UUFDckIscUJBQUksTUFBTSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDdkIscUJBQUksS0FBSyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7O1FBR3hCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDOztZQUNqQixNQUFNLEdBQUcsVUFBVSxDQUFDO1NBQ3JCO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDOztZQUN4QixNQUFNLEdBQUcscUJBQXFCLENBQUM7U0FDaEM7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7O1lBQ3pCLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQztTQUM5QjtRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzs7WUFDMUIsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDO1NBQzNDO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDOztZQUMzQixNQUFNLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDO1NBQ3JEO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDOztZQUM1QixNQUFNLEdBQUcsV0FBVyxDQUFDO1NBQ3RCO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDOztZQUM1QixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUM7U0FDekM7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7O1lBQzVCLE1BQU0sR0FBRyxZQUFZLENBQUM7U0FDdkI7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7O1lBQzdCLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLFlBQVksQ0FBQztTQUMzQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQzs7WUFDN0IsTUFBTSxHQUFHLGFBQWEsQ0FBQztTQUN4QjtRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQzs7WUFDOUIsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDO1NBQzdDO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDOztZQUM5QixNQUFNLEdBQUcsWUFBWSxDQUFDO1NBQ3ZCO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDOztZQUMvQixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZLENBQUM7U0FDM0M7UUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDOzs7Ozs7SUFHVCxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQWdCO1FBQzFDLHFCQUFJLGFBQXNCLENBQUM7UUFDM0IscUJBQUksVUFBbUIsQ0FBQztRQUN4QixxQkFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDO1FBRXZCLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV4QyxhQUFhLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVwQyxxQkFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkIscUJBQUksWUFBWSxHQUFXLEVBQUUsQ0FBQztRQUU5QixFQUFFLENBQUEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLHFCQUFJLFFBQVEsR0FBVyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLHFCQUFJLFFBQVEsR0FBVyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTdDLEVBQUUsQ0FBQSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLGFBQWEsR0FBRyxRQUFRLENBQUM7YUFDMUI7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixhQUFhLEdBQUcsUUFBUSxDQUFDO2FBQzFCO1lBRUQsRUFBRSxDQUFBLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQztnQkFDdkIsWUFBWSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLGFBQWEsR0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RDtTQUNGO1FBRUQsSUFBSSxDQUFDO1lBQ0gscUJBQUksRUFBVSxDQUFDO1lBQ2YscUJBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUVoQixFQUFFLENBQUEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNkLHFCQUFJLE1BQU0sR0FBVyxhQUFhLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QyxxQkFBSSxNQUFNLEdBQVcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFN0MscUJBQUksS0FBSyxHQUFXLE1BQU0sR0FBRSxDQUFDLENBQUM7Z0JBQzlCLHFCQUFJLEtBQUssR0FBVyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUVwQyxxQkFBSSxJQUFJLEdBQVcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzlELHFCQUFJLEdBQUcsR0FBVyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDM0QsRUFBRSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDaEQ7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3ZCO1lBRUQsTUFBTSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDN0I7UUFBQyxLQUFLLENBQUEsQ0FBQyxpQkFBQSxDQUFDLEVBQUMsQ0FBQztTQUNWO1FBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQTs7O3lCQTNNb0I7SUFFakMsd0JBQXdCO0lBU3hCLFlBQVk7SUFDWixZQUFZO0NBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRGF0ZVRpbWVVdGlscyB7XG5cbiAgcHVibGljIHN0YXRpYyBQQVRURVJOUzogc3RyaW5nW10gPSBbXG4gICAgLy8gXCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MnWidcIiwgXG4gICAgXCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3NaXCIsXG4gICAgLy8gXCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3NcIiwgXCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTJ1onXCIsXG4gICAgLy8gXCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTWlwiLCBcInl5eXktTU0tZGQgSEg6bW06c3NcIixcbiAgICAvLyBcIk1NL2RkL3l5eXkgSEg6bW06c3NcIiwgXCJNTS9kZC95eXl5J1QnSEg6bW06c3MuU1NTJ1onXCIsXG4gICAgLy8gXCJNTS9kZC95eXl5J1QnSEg6bW06c3MuU1NTWlwiLCBcIk1NL2RkL3l5eXknVCdISDptbTpzcy5TU1NcIixcbiAgICAvLyBcIk1NL2RkL3l5eXknVCdISDptbTpzc1pcIiwgXCJNTS9kZC95eXl5J1QnSEg6bW06c3NcIixcbiAgICAvLyBcInl5eXk6TU06ZGQgSEg6bW06c3NcIiwgXCJ5eXl5TU1kZFwiLFxuICAgIC8vIFwieXl5eS1NTS1kZFRISDptbTpzcy5zc3NaXCIsIFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLnNzc1pcIiwgXCJkZC9NTS95eXl5IEhIOm1tOnNzXCIsXG4gICAgLy8gXCJ5eXl5LU1NLWRkVEhIOm1tOnNzLlNTU1pcIiwgXCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTWlwiLCBcInl5eXktTU0tZGQgSEg6bW06c3NcIixcbiAgICBcImRkL01NL3l5eXlcIixcbiAgICBcInl5eXktTU0tZGRcIl07XG5cblxuICBwdWJsaWMgc3RhdGljIGRpZmZEYXRlKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IG51bWJlcltdIHtcblxuICAgIGxldCByZXN1bHQ6IG51bWJlcltdID0gW107XG4gICAgaWYgKGRhdGUxID09PSBudWxsIHx8IHR5cGVvZiBkYXRlMSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmIChkYXRlMiA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0ZTIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGxldCBkaWZmOiBudW1iZXIgPSAoZGF0ZTIuZ2V0VGltZSgpIC0gZGF0ZTEuZ2V0VGltZSgpKSAvIDEwMDA7XG4gICAgZGlmZiA9IE1hdGguYWJzKE1hdGguZmxvb3IoZGlmZikpO1xuXG4gICAgbGV0IGRheXM6IG51bWJlciA9IE1hdGguZmxvb3IoZGlmZiAvICgyNCAqIDYwICogNjApKTtcbiAgICBsZXQgbGVmdFNlYzogbnVtYmVyID0gZGlmZiAtIGRheXMgKiAyNCAqIDYwICogNjA7XG5cbiAgICBsZXQgaHJzOiBudW1iZXIgPSBNYXRoLmZsb29yKGxlZnRTZWMgLyAoNjAgKiA2MCkpO1xuICAgIGxlZnRTZWMgPSBsZWZ0U2VjIC0gaHJzICogNjAgKiA2MDtcblxuICAgIGxldCBtaW46IG51bWJlciA9IE1hdGguZmxvb3IobGVmdFNlYyAvICg2MCkpO1xuICAgIGxlZnRTZWMgPSBsZWZ0U2VjIC0gbWluICogNjA7XG5cblxuICAgIHJlc3VsdC5wdXNoKGRheXMpOy8vIGRheXNcbiAgICByZXN1bHQucHVzaChocnMpOy8vIGhyc1xuICAgIHJlc3VsdC5wdXNoKG1pbik7Ly8gbWluXG4gICAgcmVzdWx0LnB1c2gobGVmdFNlYyk7Ly8gbGVmdFNlY1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGlmZkRhdGVJbkhvdXIoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogbnVtYmVyIHtcbiAgICBpZiAoZGF0ZTEgPT09IG51bGwgfHwgdHlwZW9mIGRhdGUxID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmIChkYXRlMiA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0ZTIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBsZXQgaG91cnMgPSBNYXRoLmFicyhkYXRlMS5nZXRUaW1lKCkgLSBkYXRlMi5nZXRUaW1lKCkpIC8gKDYwICogNjAgKiAxMDAwKTtcblxuICAgIHJldHVybiBob3VycztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RGF0ZUZyb21BbnkoZGF0YTogYW55KTogRGF0ZSB7XG4gICAgbGV0IHJlc29sdmVEYXRlOiBEYXRlID0gbnVsbDtcblxuICAgIGlmIChkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBJZiBhcmcgXCJwYXR0ZXJuXCIgaXMgcHJvdmlkZWQsIHB1dCBpdCBhdCB0aGUgZmlyc3Qgb2YgdGhlIGxpc3QgdG9cbiAgICAgICAgLy8gdHJ5IHRvIHJlc29sdmUgd2l0aCB0aGUgZ2l2ZW4gXCJwYXR0ZXJuXCIgZmlyc3QuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzb2x2ZURhdGUgPSBEYXRlLnBhcnNlRXhhY3QoZGF0YSwgRGF0ZVRpbWVVdGlscy5QQVRURVJOUyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc29sdmVEYXRlID09PSBudWxsIHx8IHR5cGVvZiByZXNvbHZlRGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZURhdGUgPSBEYXRlLnBhcnNlKGRhdGEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNvbHZlRGF0ZSA9IG5ldyBEYXRlKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgcmVzb2x2ZURhdGUgPSBuZXcgRGF0ZShkYXRhLmdldFRpbWUoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZURhdGU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFRpbWVNZXNzYWdlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGlmIChkYXRlID09PSBudWxsIHx8IHR5cGVvZiBkYXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgbGV0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRDb21wYXJlVGltZU1lc3NhZ2UoZGF0ZSwgbm93KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q29tcGFyZVRpbWVNZXNzYWdlKGNvbXBhcmVUbzogRGF0ZSwgZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgaWYgKGNvbXBhcmVUbyA9PT0gbnVsbCB8fCB0eXBlb2YgY29tcGFyZVRvID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgaWYgKGRhdGUgPT09IG51bGwgfHwgdHlwZW9mIGRhdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAvLyB0aW1lIHNpbmNlIG1lc3NhZ2Ugd2FzIHNlbnQgaW4gc2Vjb25kc1xuICAgIGxldCBzZWNvbmRzID0gKGRhdGUuZ2V0VGltZSgpIC0gY29tcGFyZVRvLmdldFRpbWUoKSkgLyAxMDAwO1xuICAgIGxldCBtaW4gPSBzZWNvbmRzIC8gNjA7XG4gICAgbGV0IGhvdXIgPSBtaW4gLyA2MDtcbiAgICBsZXQgZGF5cyA9IGhvdXIgLyAyNDtcbiAgICBsZXQgd2Vla3MgPSBkYXlzIC8gNztcbiAgICBsZXQgbW9udGhzID0gd2Vla3MgLyA0O1xuICAgIGxldCB5ZWFycyA9IG1vbnRocyAvIDEyO1xuXG4gICAgLy8gZm9ybWF0IHN0cmluZ1xuICAgIGlmIChzZWNvbmRzIDwgMTUpIHsgLy8gPCAxNSBzZWNzXG4gICAgICByZXN1bHQgPSAnSnVzdCBub3cnO1xuICAgIH0gZWxzZSBpZiAoc2Vjb25kcyA8IDYwKSB7IC8vIDwgMSBtaW5cbiAgICAgIHJlc3VsdCA9ICdXaXRoaW4gYSBtaW51dGUgYWdvJztcbiAgICB9IGVsc2UgaWYgKHNlY29uZHMgPCAzMDApIHsgLy8gPCA1IG1pbnNcbiAgICAgIHJlc3VsdCA9ICdBIGZldyBtaW51dGVzIGFnbyc7XG4gICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgMzYwMCkgeyAvLyA8IDEgaG91clxuICAgICAgcmVzdWx0ID0gTWF0aC5mbG9vcihtaW4pICsgJyBtaW51dGVzIGFnbyc7XG4gICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgODY0MDApIHsgLy8gPCAxIGRheVxuICAgICAgcmVzdWx0ID0gJ0Fib3V0ICcgKyBNYXRoLmZsb29yKGhvdXIpICsgJyBob3VycyBhZ28nO1xuICAgIH0gZWxzZSBpZiAoc2Vjb25kcyA8IDE3MjgwMCkgeyAvLyA8IDIgZGF5c1xuICAgICAgcmVzdWx0ID0gJ1llc3RlcmRheSc7XG4gICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgNjA0ODAwKSB7IC8vIDwgNyBkYXlzXG4gICAgICByZXN1bHQgPSBNYXRoLmZsb29yKGRheXMpICsgJyBkYXlzIGFnbyc7XG4gICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgNjkxMjAwKSB7IC8vIDwgOCBkYXlzXG4gICAgICByZXN1bHQgPSAnQSB3ZWVrIGFnbyc7XG4gICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgMjYyODAwMCkgeyAvLyA8IDEgbW9udGhcbiAgICAgIHJlc3VsdCA9IE1hdGguZmxvb3Iod2Vla3MpICsgJyB3ZWVrcyBhZ28nO1xuICAgIH0gZWxzZSBpZiAoc2Vjb25kcyA8IDUyNTYwMDApIHsgLy8gPCAyIG1vbnRoc1xuICAgICAgcmVzdWx0ID0gJ0EgbW9udGggYWdvJztcbiAgICB9IGVsc2UgaWYgKHNlY29uZHMgPCAzMTUzNjAwMCkgeyAvLyA8IDEyIG1vbnRoc1xuICAgICAgcmVzdWx0ID0gTWF0aC5mbG9vcihtb250aHMpICsgJyBtb250aHMgYWdvJztcbiAgICB9IGVsc2UgaWYgKHNlY29uZHMgPCA2MzA3MjAwMCkgeyAvLyA8IDIgeWVhcnNcbiAgICAgIHJlc3VsdCA9ICdBIHllYXIgYWdvJztcbiAgICB9IGVsc2UgaWYgKHNlY29uZHMgPj0gNjMwNzIwMDApIHsgLy8gPj0gMiB5ZWFyc1xuICAgICAgcmVzdWx0ID0gTWF0aC5mbG9vcih5ZWFycykgKyAnIHllYXJzIGFnbyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcGFyc2VUaW1lWm9uZSh0aW1lWm9uZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgaXNIYXNBZGRPclN1YjogYm9vbGVhbjtcbiAgICBsZXQgaXNIYXNDb2xvbjogYm9vbGVhbjtcbiAgICBsZXQgdHpEaWZmOiBudW1iZXIgPSAwO1xuXG4gICAgdGltZVpvbmUgPSB0aW1lWm9uZS5yZXBsYWNlKC9cXC4vZywgXCI6XCIpO1xuXG4gICAgaXNIYXNBZGRPclN1YiA9IC9eKFxcK3xcXC0pL2kudGVzdCh0aW1lWm9uZSk7IC8vICsgb3IgLVxuICAgIGlzSGFzQ29sb24gPSAvKFxcOikvaS50ZXN0KHRpbWVab25lKTsgLy8gOlxuXG4gICAgbGV0IGFkZE9yU3ViSW5kZXggPSAtMTtcbiAgICBsZXQgb3BlcmF0aW9uU3RyOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgaWYoaXNIYXNBZGRPclN1Yikge1xuICAgICAgbGV0IGFkZEluZGV4OiBudW1iZXIgPSB0aW1lWm9uZS5pbmRleE9mKFwiK1wiKTtcbiAgICAgIGxldCBzdWJJbmRleDogbnVtYmVyID0gdGltZVpvbmUuaW5kZXhPZihcIi1cIik7XG5cbiAgICAgIGlmKGFkZEluZGV4ICE9PSAtMSkge1xuICAgICAgICBhZGRPclN1YkluZGV4ID0gYWRkSW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRPclN1YkluZGV4ID0gc3ViSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIGlmKGFkZE9yU3ViSW5kZXggIT09IC0xKXtcbiAgICAgICAgb3BlcmF0aW9uU3RyID0gdGltZVpvbmUuc3Vic3RyaW5nKDAsIGFkZE9yU3ViSW5kZXgrMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCB0ejogbnVtYmVyO1xuICAgICAgbGV0IGNvbG9uID0gXCI6XCI7XG5cbiAgICAgIGlmKGlzSGFzQ29sb24pIHtcbiAgICAgICAgbGV0IHN0SG91cjogbnVtYmVyID0gYWRkT3JTdWJJbmRleCArIDE7XG4gICAgICAgIGxldCBlZEhvdXI6IG51bWJlciA9IHRpbWVab25lLmluZGV4T2YoY29sb24pO1xuXG4gICAgICAgIGxldCBzdE1pbjogbnVtYmVyID0gZWRIb3VyICsxO1xuICAgICAgICBsZXQgZWRNaW46IG51bWJlciA9IHRpbWVab25lLmxlbmd0aDtcblxuICAgICAgICBsZXQgaG91cjogbnVtYmVyID0gTnVtYmVyKHRpbWVab25lLnN1YnN0cmluZyhzdEhvdXIsIGVkSG91cikpO1xuICAgICAgICBsZXQgbWluOiBudW1iZXIgPSBOdW1iZXIodGltZVpvbmUuc3Vic3RyaW5nKHN0TWluLCBlZE1pbikpO1xuICAgICAgICB0eiA9IE51bWJlcihvcGVyYXRpb25TdHIgKyAoaG91ciAqIDEwMCArIG1pbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHogPSBOdW1iZXIodGltZVpvbmUpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0ekRpZmYgPSBpc05hTih0eikgPyAwIDogdHo7XG4gICAgfSBjYXRjaChlKXtcbiAgICB9XG5cbiAgICByZXR1cm4gdHpEaWZmXG4gIH1cbn1cbiJdfQ==