    function getInterval(time, todayText, yesterdayText, x1DayAgoText, x2DaysAgoText, x5DaysAgoText, now) {
        now = now || Date.now();
        if (!time) return '';
        if (typeof time === 'string' || typeof time === 'number') {
            time = new Date(time);
        }
        var interval = now.getTime() - time.getTime();
        var days = Math.floor(interval / (24 * 3600000));
        if (days === 0) {
            if (now.getDate() === time.getDate()) {
                return todayText;
            } else {
                return yesterdayText;
            }
        } else if (days === 1) {
            if (now.getDate() - time.getDate() === 1) {
                return yesterdayText;
            } else {
                return x2DaysAgoText.replace('%d', days + 1);
            }
        } else {
            var t  = days % 10;
            var tt = days % 100;
            // 2, 3, 4, 22, 23, 24, 32, 33, 34, 111, ...x2, x3, h4
            if ((tt < 10 || tt > 20) && t >= 2 && t <= 4) {
                return x2DaysAgoText.replace('%d', days);
            } else
            // 1, 21, 31, 41, 121....
            if ((tt < 10 || tt > 20) && t === 1) {
                return x1DayAgoText.replace('%d', days);
            } else {
                return x5DaysAgoText.replace('%d', days);
            }
        }
    }
The software uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the software does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.