ngx-extended-pdf-viewer
Version:
Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.
83 lines • 14 kB
JavaScript
export class PdfDocumentPropertiesExtractor {
constructor() {
this.pdfDateStringRegex = new RegExp('^D:' + // Prefix (required)
'(\\d{4})' + // Year (required)
'(\\d{2})?' + // Month (optional)
'(\\d{2})?' + // Day (optional)
'(\\d{2})?' + // Hour (optional)
'(\\d{2})?' + // Minute (optional)
'(\\d{2})?' + // Second (optional)
'([Z|+|-])?' + // Universal time relation (optional)
'(\\d{2})?' + // Offset hour (optional)
// tslint:disable-next-line: quotemark
"'?" + // Splitting apostrophe (optional)
'(\\d{2})?' + // Offset minute (optional)
// tslint:disable-next-line: quotemark
"'?" // Trailing apostrophe (optional)
);
}
async getDocumentProperties() {
const PDFViewerApplication = window.PDFViewerApplication;
const pdfDocument = PDFViewerApplication.pdfDocument;
const result = {};
const md = await pdfDocument.getMetadata();
const info = md.info;
result.author = info.Author;
result.creationDate = this.toDateObject(info.CreationDate);
result.creator = info.Creator;
result.keywords = info.Keywords;
result.linearized = info.IsLinearized;
result.modificationDate = this.toDateObject(info.ModDate);
result.pdfFormatVersion = info.PDFFormatVersion;
result.producer = info.Producer;
result.subject = info.Subject;
result.title = info.Title;
if (md['contentDispositionFilename']) {
result.fileName = md['contentDispositionFilename'];
}
result.maybeFileSize = await (await pdfDocument.getDownloadInfo()).length;
return result;
}
/** shamelessly copied from pdf.js */
toDateObject(input) {
// Optional fields that don't satisfy the requirements from the regular
// expression (such as incorrect digit counts or numbers that are out of
// range) will fall back the defaults from the specification.
const matches = this.pdfDateStringRegex.exec(input);
if (!matches) {
return null;
}
// JavaScript's `Date` object expects the month to be between 0 and 11
// instead of 1 and 12, so we have to correct for that.
const year = parseInt(matches[1], 10);
let month = parseInt(matches[2], 10);
month = month >= 1 && month <= 12 ? month - 1 : 0;
let day = parseInt(matches[3], 10);
day = day >= 1 && day <= 31 ? day : 1;
let hour = parseInt(matches[4], 10);
hour = hour >= 0 && hour <= 23 ? hour : 0;
let minute = parseInt(matches[5], 10);
minute = minute >= 0 && minute <= 59 ? minute : 0;
let second = parseInt(matches[6], 10);
second = second >= 0 && second <= 59 ? second : 0;
const universalTimeRelation = matches[7] || 'Z';
let offsetHour = parseInt(matches[8], 10);
offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;
let offsetMinute = parseInt(matches[9], 10) || 0;
offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;
// Universal time relation 'Z' means that the local time is equal to the
// universal time, whereas the relations '+'/'-' indicate that the local
// time is later respectively earlier than the universal time. Every date
// is normalized to universal time.
if (universalTimeRelation === '-') {
hour += offsetHour;
minute += offsetMinute;
}
else if (universalTimeRelation === '+') {
hour -= offsetHour;
minute -= offsetMinute;
}
return new Date(Date.UTC(year, month, day, hour, minute, second));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRvY3VtZW50LXByb3BlcnRpZXMtZXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi9wZGYtZG9jdW1lbnQtcHJvcGVydGllcy1leHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE1BQU0sT0FBTyw4QkFBOEI7SUFBM0M7UUFDVSx1QkFBa0IsR0FBRyxJQUFJLE1BQU0sQ0FDckMsS0FBSyxHQUFHLG9CQUFvQjtZQUMxQixVQUFVLEdBQUcsa0JBQWtCO1lBQy9CLFdBQVcsR0FBRyxtQkFBbUI7WUFDakMsV0FBVyxHQUFHLGlCQUFpQjtZQUMvQixXQUFXLEdBQUcsa0JBQWtCO1lBQ2hDLFdBQVcsR0FBRyxvQkFBb0I7WUFDbEMsV0FBVyxHQUFHLG9CQUFvQjtZQUNsQyxZQUFZLEdBQUcscUNBQXFDO1lBQ3BELFdBQVcsR0FBRyx5QkFBeUI7WUFDdkMsc0NBQXNDO1lBQ3RDLElBQUksR0FBRyxrQ0FBa0M7WUFDekMsV0FBVyxHQUFHLDJCQUEyQjtZQUN6QyxzQ0FBc0M7WUFDdEMsSUFBSSxDQUFDLGlDQUFpQztTQUN6QyxDQUFDO0lBc0VKLENBQUM7SUFwRVEsS0FBSyxDQUFDLHFCQUFxQjtRQUNoQyxNQUFNLG9CQUFvQixHQUEyQixNQUFjLENBQUMsb0JBQW9CLENBQUM7UUFDekYsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsV0FBVyxDQUFDO1FBRXJELE1BQU0sTUFBTSxHQUFRLEVBQUUsQ0FBQztRQUN2QixNQUFNLEVBQUUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsSUFBc0IsQ0FBQztRQUV2QyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDNUIsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDOUIsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN0QyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNoRCxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDaEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDcEQ7UUFDRCxNQUFNLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUMxRSxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQscUNBQXFDO0lBQzdCLFlBQVksQ0FBQyxLQUFtQjtRQUN0Qyx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLDZEQUE2RDtRQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsc0VBQXNFO1FBQ3RFLHVEQUF1RDtRQUN2RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckMsS0FBSyxHQUFHLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO1FBQ2hELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxDQUFDLElBQUksVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsWUFBWSxHQUFHLFlBQVksSUFBSSxDQUFDLElBQUksWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUUsd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUsbUNBQW1DO1FBQ25DLElBQUkscUJBQXFCLEtBQUssR0FBRyxFQUFFO1lBQ2pDLElBQUksSUFBSSxVQUFVLENBQUM7WUFDbkIsTUFBTSxJQUFJLFlBQVksQ0FBQztTQUN4QjthQUFNLElBQUkscUJBQXFCLEtBQUssR0FBRyxFQUFFO1lBQ3hDLElBQUksSUFBSSxVQUFVLENBQUM7WUFDbkIsTUFBTSxJQUFJLFlBQVksQ0FBQztTQUN4QjtRQUVELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBERlZpZXdlckFwcGxpY2F0aW9uIH0gZnJvbSAnLi9vcHRpb25zL3BkZi12aWV3ZXItYXBwbGljYXRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBkZkRvY3VtZW50SW5mbyB7XG4gIGF1dGhvcj86IHN0cmluZztcbiAgY3JlYXRpb25EYXRlPzogRGF0ZTtcbiAgY3JlYXRvcj86IHN0cmluZztcblxuICBrZXl3b3Jkcz86IHN0cmluZztcbiAgbGluZWFyaXplZD86IGJvb2xlYW47XG4gIG1heWJlRmlsZVNpemU/OiBzdHJpbmc7XG4gIG1vZGlmaWNhdGlvbkRhdGU/OiBEYXRlO1xuICBwZGZGb3JtYXRWZXJzaW9uPzogc3RyaW5nO1xuICBwcm9kdWNlcj86IHN0cmluZztcbiAgc3ViamVjdD86IHN0cmluZztcbiAgdGl0bGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBQZGZEb2N1bWVudFByb3BlcnRpZXNFeHRyYWN0b3Ige1xuICBwcml2YXRlIHBkZkRhdGVTdHJpbmdSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgJ15EOicgKyAvLyBQcmVmaXggKHJlcXVpcmVkKVxuICAgICAgJyhcXFxcZHs0fSknICsgLy8gWWVhciAocmVxdWlyZWQpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gTW9udGggKG9wdGlvbmFsKVxuICAgICAgJyhcXFxcZHsyfSk/JyArIC8vIERheSAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gSG91ciAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gTWludXRlIChvcHRpb25hbClcbiAgICAgICcoXFxcXGR7Mn0pPycgKyAvLyBTZWNvbmQgKG9wdGlvbmFsKVxuICAgICAgJyhbWnwrfC1dKT8nICsgLy8gVW5pdmVyc2FsIHRpbWUgcmVsYXRpb24gKG9wdGlvbmFsKVxuICAgICAgJyhcXFxcZHsyfSk/JyArIC8vIE9mZnNldCBob3VyIChvcHRpb25hbClcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcXVvdGVtYXJrXG4gICAgICBcIic/XCIgKyAvLyBTcGxpdHRpbmcgYXBvc3Ryb3BoZSAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gT2Zmc2V0IG1pbnV0ZSAob3B0aW9uYWwpXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHF1b3RlbWFya1xuICAgICAgXCInP1wiIC8vIFRyYWlsaW5nIGFwb3N0cm9waGUgKG9wdGlvbmFsKVxuICApO1xuXG4gIHB1YmxpYyBhc3luYyBnZXREb2N1bWVudFByb3BlcnRpZXMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbjogSVBERlZpZXdlckFwcGxpY2F0aW9uID0gKHdpbmRvdyBhcyBhbnkpLlBERlZpZXdlckFwcGxpY2F0aW9uO1xuICAgIGNvbnN0IHBkZkRvY3VtZW50ID0gUERGVmlld2VyQXBwbGljYXRpb24ucGRmRG9jdW1lbnQ7XG5cbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgIGNvbnN0IG1kID0gYXdhaXQgcGRmRG9jdW1lbnQuZ2V0TWV0YWRhdGEoKTtcbiAgICBjb25zdCBpbmZvID0gbWQuaW5mbyBhcyB1bmtub3duIGFzIGFueTtcblxuICAgIHJlc3VsdC5hdXRob3IgPSBpbmZvLkF1dGhvcjtcbiAgICByZXN1bHQuY3JlYXRpb25EYXRlID0gdGhpcy50b0RhdGVPYmplY3QoaW5mby5DcmVhdGlvbkRhdGUpO1xuICAgIHJlc3VsdC5jcmVhdG9yID0gaW5mby5DcmVhdG9yO1xuICAgIHJlc3VsdC5rZXl3b3JkcyA9IGluZm8uS2V5d29yZHM7XG4gICAgcmVzdWx0LmxpbmVhcml6ZWQgPSBpbmZvLklzTGluZWFyaXplZDtcbiAgICByZXN1bHQubW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMudG9EYXRlT2JqZWN0KGluZm8uTW9kRGF0ZSk7XG4gICAgcmVzdWx0LnBkZkZvcm1hdFZlcnNpb24gPSBpbmZvLlBERkZvcm1hdFZlcnNpb247XG4gICAgcmVzdWx0LnByb2R1Y2VyID0gaW5mby5Qcm9kdWNlcjtcbiAgICByZXN1bHQuc3ViamVjdCA9IGluZm8uU3ViamVjdDtcbiAgICByZXN1bHQudGl0bGUgPSBpbmZvLlRpdGxlO1xuICAgIGlmIChtZFsnY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUnXSkge1xuICAgICAgcmVzdWx0LmZpbGVOYW1lID0gbWRbJ2NvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lJ107XG4gICAgfVxuICAgIHJlc3VsdC5tYXliZUZpbGVTaXplID0gYXdhaXQgKGF3YWl0IHBkZkRvY3VtZW50LmdldERvd25sb2FkSW5mbygpKS5sZW5ndGg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBzaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBwZGYuanMgKi9cbiAgcHJpdmF0ZSB0b0RhdGVPYmplY3QoaW5wdXQ6IHN0cmluZyB8IGFueSk6IERhdGUgfCBudWxsIHtcbiAgICAvLyBPcHRpb25hbCBmaWVsZHMgdGhhdCBkb24ndCBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgZnJvbSB0aGUgcmVndWxhclxuICAgIC8vIGV4cHJlc3Npb24gKHN1Y2ggYXMgaW5jb3JyZWN0IGRpZ2l0IGNvdW50cyBvciBudW1iZXJzIHRoYXQgYXJlIG91dCBvZlxuICAgIC8vIHJhbmdlKSB3aWxsIGZhbGwgYmFjayB0aGUgZGVmYXVsdHMgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi5cbiAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5wZGZEYXRlU3RyaW5nUmVnZXguZXhlYyhpbnB1dCk7XG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBKYXZhU2NyaXB0J3MgYERhdGVgIG9iamVjdCBleHBlY3RzIHRoZSBtb250aCB0byBiZSBiZXR3ZWVuIDAgYW5kIDExXG4gICAgLy8gaW5zdGVhZCBvZiAxIGFuZCAxMiwgc28gd2UgaGF2ZSB0byBjb3JyZWN0IGZvciB0aGF0LlxuICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxMCk7XG4gICAgbGV0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hlc1syXSwgMTApO1xuICAgIG1vbnRoID0gbW9udGggPj0gMSAmJiBtb250aCA8PSAxMiA/IG1vbnRoIC0gMSA6IDA7XG4gICAgbGV0IGRheSA9IHBhcnNlSW50KG1hdGNoZXNbM10sIDEwKTtcbiAgICBkYXkgPSBkYXkgPj0gMSAmJiBkYXkgPD0gMzEgPyBkYXkgOiAxO1xuICAgIGxldCBob3VyID0gcGFyc2VJbnQobWF0Y2hlc1s0XSwgMTApO1xuICAgIGhvdXIgPSBob3VyID49IDAgJiYgaG91ciA8PSAyMyA/IGhvdXIgOiAwO1xuICAgIGxldCBtaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzVdLCAxMCk7XG4gICAgbWludXRlID0gbWludXRlID49IDAgJiYgbWludXRlIDw9IDU5ID8gbWludXRlIDogMDtcbiAgICBsZXQgc2Vjb25kID0gcGFyc2VJbnQobWF0Y2hlc1s2XSwgMTApO1xuICAgIHNlY29uZCA9IHNlY29uZCA+PSAwICYmIHNlY29uZCA8PSA1OSA/IHNlY29uZCA6IDA7XG4gICAgY29uc3QgdW5pdmVyc2FsVGltZVJlbGF0aW9uID0gbWF0Y2hlc1s3XSB8fCAnWic7XG4gICAgbGV0IG9mZnNldEhvdXIgPSBwYXJzZUludChtYXRjaGVzWzhdLCAxMCk7XG4gICAgb2Zmc2V0SG91ciA9IG9mZnNldEhvdXIgPj0gMCAmJiBvZmZzZXRIb3VyIDw9IDIzID8gb2Zmc2V0SG91ciA6IDA7XG4gICAgbGV0IG9mZnNldE1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbOV0sIDEwKSB8fCAwO1xuICAgIG9mZnNldE1pbnV0ZSA9IG9mZnNldE1pbnV0ZSA+PSAwICYmIG9mZnNldE1pbnV0ZSA8PSA1OSA/IG9mZnNldE1pbnV0ZSA6IDA7XG5cbiAgICAvLyBVbml2ZXJzYWwgdGltZSByZWxhdGlvbiAnWicgbWVhbnMgdGhhdCB0aGUgbG9jYWwgdGltZSBpcyBlcXVhbCB0byB0aGVcbiAgICAvLyB1bml2ZXJzYWwgdGltZSwgd2hlcmVhcyB0aGUgcmVsYXRpb25zICcrJy8nLScgaW5kaWNhdGUgdGhhdCB0aGUgbG9jYWxcbiAgICAvLyB0aW1lIGlzIGxhdGVyIHJlc3BlY3RpdmVseSBlYXJsaWVyIHRoYW4gdGhlIHVuaXZlcnNhbCB0aW1lLiBFdmVyeSBkYXRlXG4gICAgLy8gaXMgbm9ybWFsaXplZCB0byB1bml2ZXJzYWwgdGltZS5cbiAgICBpZiAodW5pdmVyc2FsVGltZVJlbGF0aW9uID09PSAnLScpIHtcbiAgICAgIGhvdXIgKz0gb2Zmc2V0SG91cjtcbiAgICAgIG1pbnV0ZSArPSBvZmZzZXRNaW51dGU7XG4gICAgfSBlbHNlIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09ICcrJykge1xuICAgICAgaG91ciAtPSBvZmZzZXRIb3VyO1xuICAgICAgbWludXRlIC09IG9mZnNldE1pbnV0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpKTtcbiAgfVxufVxuIl19