UNPKG

site-metadata-extractor

Version:
194 lines 30.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getTopNode = exports.getParsedDocForText = exports.getParsedDoc = exports.getCleanedDoc = exports.lazy = void 0; /* eslint-disable no-unused-vars */ /* eslint-disable @typescript-eslint/no-unused-vars */ const cheerio_1 = __importDefault(require("cheerio")); const url_1 = require("url"); const cleaner_1 = __importDefault(require("./cleaner")); const extractor_1 = __importDefault(require("./extractor")); const siteMetadataExtractor = (markup, resourceUrl, lang = "en") => { const resourceUrlObj = new url_1.URL(resourceUrl); const doc = cheerio_1.default.load(markup, { xmlMode: true }); // Separate instance with decodeEntities: false specifically for JSON-LD extraction const docForJsonLd = cheerio_1.default.load(markup, { xmlMode: true, decodeEntities: false, }); const docForText = cheerio_1.default.load(markup, { xmlMode: false }); const language = lang || extractor_1.default.lang(doc); const pageData = { author: extractor_1.default.author(doc), canonicalLink: extractor_1.default.canonicalLink(doc, resourceUrl), copyright: extractor_1.default.copyright(doc), date: extractor_1.default.date(doc), description: extractor_1.default.description(doc), favicon: extractor_1.default.favicon(doc, resourceUrlObj), image: extractor_1.default.image(doc), jsonld: extractor_1.default.jsonld(docForJsonLd), keywords: extractor_1.default.keywords(doc), lang: language, locale: extractor_1.default.locale(doc), origin: resourceUrlObj.origin, publisher: extractor_1.default.publisher(doc), siteName: extractor_1.default.siteName(doc), softTitle: extractor_1.default.softTitle(doc), tags: extractor_1.default.tags(doc), title: extractor_1.default.title(doc), type: extractor_1.default.type(doc), }; // Step 1: Clean the doc (0, cleaner_1.default)(doc); // Step 2: Find the doc node with the best text const topNode = extractor_1.default.calculateBestNode(docForText, language); // Step 3: Extract text ,videos, images, link pageData.videos = extractor_1.default.videos(doc, topNode); pageData.links = extractor_1.default.links(doc, topNode, language); pageData.text = extractor_1.default.text(doc, topNode, language); return pageData; }; exports.default = siteMetadataExtractor; // Allow access to document properties with lazy evaluation const lazy = (html, resourceUrl, language = "en") => { const resourceUrlObj = new url_1.URL(resourceUrl); global.lazyPageData = global.lazyPageData || {}; return { author: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.author = extractor_1.default.author(doc); return global.lazyPageData.author; }, canonicalLink: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.canonicalLink = extractor_1.default.canonicalLink(doc, resourceUrl); return global.lazyPageData.canonicalLink; }, copyright: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.copyright = extractor_1.default.copyright(doc); return global.lazyPageData.copyright; }, date: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.date = extractor_1.default.date(doc); return global.lazyPageData.date; }, description: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.description = extractor_1.default.description(doc); return global.lazyPageData.description; }, favicon: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.favicon = extractor_1.default.favicon(doc, resourceUrlObj); return global.lazyPageData.favicon; }, image: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.image = extractor_1.default.image(doc); return global.lazyPageData.image; }, jsonld: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.jsonld = extractor_1.default.jsonld(doc); return global.lazyPageData.jsonld; }, keywords: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.keywords = extractor_1.default.keywords(doc); return global.lazyPageData.keywords; }, lang: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.lang = language || extractor_1.default.lang(doc); return global.lazyPageData.lang; }, locale: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.locale = extractor_1.default.locale(doc); return global.lazyPageData.locale; }, links() { let doc = getParsedDocForText.call(global, html); const topNode = getTopNode.call(global, doc, this.lang()); doc = (0, cleaner_1.default)(doc); global.lazyPageData.links = extractor_1.default.links(doc, topNode, this.lang()); return global.lazyPageData.links; }, origin: () => { global.lazyPageData.origin = resourceUrlObj.origin; return global.lazyPageData.origin; }, publisher: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.publisher = extractor_1.default.publisher(doc); return global.lazyPageData.publisher; }, siteName: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.siteName = extractor_1.default.siteName(doc); return global.lazyPageData.siteName; }, softTitle: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.softTitle = extractor_1.default.softTitle(doc); return global.lazyPageData.softTitle; }, tags: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.tags = extractor_1.default.tags(doc); return global.lazyPageData.tags; }, text() { let doc = getParsedDocForText.call(global, html); doc = (0, cleaner_1.default)(doc); const topNode = getTopNode.call(global, doc, this.lang()); const textData = extractor_1.default.text(doc, topNode, this.lang()); global.lazyPageData.text = textData; return textData; }, title: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.title = extractor_1.default.title(doc); return global.lazyPageData.title; }, type: () => { const doc = getParsedDoc.call(global, html); global.lazyPageData.type = extractor_1.default.type(doc); return global.lazyPageData.type; }, videos() { let doc = getParsedDocForText.call(global, html); doc = (0, cleaner_1.default)(doc); const topNode = getTopNode.call(global, doc, this.lang()); global.lazyPageData.videos = extractor_1.default.videos(doc, topNode); return global.lazyPageData.videos; }, }; }; exports.lazy = lazy; function getCleanedDoc(html) { if (!global.cleanedDoc) { const doc = getParsedDoc.call(global, html); global.cleanedDoc = (0, cleaner_1.default)(doc); } return global.cleanedDoc; } exports.getCleanedDoc = getCleanedDoc; function getParsedDoc(html) { return (global.doc = cheerio_1.default.load(html)); } exports.getParsedDoc = getParsedDoc; function getParsedDocForText(html) { return (global.doc = cheerio_1.default.load(html, { xmlMode: false })); } exports.getParsedDocForText = getParsedDocForText; function getTopNode(doc, lang) { global.topNode = extractor_1.default.calculateBestNode(doc, lang); return global.topNode; } exports.getTopNode = getTopNode; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbUNBQW1DO0FBQ25DLHNEQUFzRDtBQUN0RCxzREFBOEI7QUFFOUIsNkJBQTBCO0FBRTFCLHdEQUFnQztBQUNoQyw0REFBNkQ7QUFrRDdELE1BQU0scUJBQXFCLEdBQUcsQ0FDNUIsTUFBYyxFQUNkLFdBQW1CLEVBQ25CLElBQUksR0FBRyxJQUFJLEVBQ0QsRUFBRTtJQUNaLE1BQU0sY0FBYyxHQUFHLElBQUksU0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sR0FBRyxHQUFHLGlCQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXBELG1GQUFtRjtJQUNuRixNQUFNLFlBQVksR0FBRyxpQkFBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDeEMsT0FBTyxFQUFFLElBQUk7UUFDYixjQUFjLEVBQUUsS0FBSztLQUN0QixDQUFDLENBQUM7SUFFSCxNQUFNLFVBQVUsR0FBRyxpQkFBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUU1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksbUJBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFN0MsTUFBTSxRQUFRLEdBQWE7UUFDekIsTUFBTSxFQUFFLG1CQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUM3QixhQUFhLEVBQUUsbUJBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQztRQUN4RCxTQUFTLEVBQUUsbUJBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ25DLElBQUksRUFBRSxtQkFBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDekIsV0FB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LEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUEsaUJBQU8sRUFBQyxHQUFHLENBQUMsQ0FBQztLQUNsQztJQUNELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQztBQUMzQixDQUFDO0FBTkQsc0NBTUM7QUFFRCxTQUFnQixZQUFZLENBQUMsSUFBWTtJQUN2QyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxpQkFBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFGRCxvQ0FFQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLElBQVk7SUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsaUJBQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsa0RBRUM7QUFFRCxTQUFnQixVQUFVLENBQUMsR0FBaUIsRUFBRSxJQUFZO0lBQ3hELE1BQU0sQ0FBQyxPQUFPLEdBQUcsbUJBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUM7QUFIRCxnQ0FHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCBjaGVlcmlvIGZyb20gXCJjaGVlcmlvXCI7XG5pbXBvcnQgeyBOZXdzQXJ0aWNsZSwgQXJ0aWNsZSB9IGZyb20gXCJzY2hlbWEtZHRzXCI7XG5pbXBvcnQgeyBVUkwgfSBmcm9tIFwidXJsXCI7XG5cbmltcG9ydCBjbGVhbmVyIGZyb20gXCIuL2NsZWFuZXJcIjtcbmltcG9ydCBleHRyYWN0b3IsIHsgTGlua09iaiwgVmlkZW9BdHRycyB9IGZyb20gXCIuL2V4dHJhY3RvclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VEYXRhIHtcbiAgYXV0aG9yOiBzdHJpbmdbXTtcbiAgY2Fub25pY2FsTGluazogc3RyaW5nO1xuICBjb3B5cmlnaHQ6IHN0cmluZztcbiAgZGF0ZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBmYXZpY29uOiBzdHJpbmc7XG4gIGltYWdlOiBzdHJpbmc7XG4gIGpzb25sZDogTmV3c0FydGljbGUgfCBBcnRpY2xlIHwgbnVsbDtcbiAga2V5d29yZHM6IHN0cmluZztcbiAgbGFuZzogc3RyaW5nO1xuICBsaW5rcz86IExpbmtPYmpbXTtcbiAgbG9jYWxlOiBzdHJpbmc7XG4gIG9yaWdpbjogc3RyaW5nO1xuICBwdWJsaXNoZXI6IHN0cmluZztcbiAgc2l0ZU5hbWU6IHN0cmluZztcbiAgc29mdFRpdGxlOiBzdHJpbmc7XG4gIHRhZ3M6IHN0cmluZ1tdO1xuICB0ZXh0Pzogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHZpZGVvcz86IFZpZGVvQXR0cnNbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXp5RXh0cmFjdG9yIHtcbiAgYXV0aG9yOiAoKSA9PiBzdHJpbmdbXTtcbiAgY2Fub25pY2FsTGluazogKCkgPT4gc3RyaW5nO1xuICBjb3B5cmlnaHQ6ICgpID0+IHN0cmluZztcbiAgZGF0ZTogKCkgPT4gc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogKCkgPT4gc3RyaW5nO1xuICBmYXZpY29uOiAoKSA9PiBzdHJpbmc7XG4gIGltYWdlOiAoKSA9PiBzdHJpbmc7XG4gIGpzb25sZDogKCkgPT4gTmV3c0FydGljbGUgfCBBcnRpY2xlIHwgbnVsbDtcbiAga2V5d29yZHM6ICgpID0+IHN0cmluZztcbiAgbGFuZzogKCkgPT4gc3RyaW5nO1xuICBsaW5rczogKCkgPT4gTGlua09ialtdO1xuICBsb2NhbGU6ICgpID0+IHN0cmluZztcbiAgb3JpZ2luOiAoKSA9PiBzdHJpbmc7XG4gIHB1Ymxpc2hlcjogKCkgPT4gc3RyaW5nO1xuICBzaXRlTmFtZTogKCkgPT4gc3RyaW5nO1xuICBzb2Z0VGl0bGU6ICgpID0+IHN0cmluZztcbiAgdGFnczogKCkgPT4gc3RyaW5nW107XG4gIHRleHQ6ICgpID0+IHN0cmluZztcbiAgdGl0bGU6ICgpID0+IHN0cmluZztcbiAgdHlwZTogKCkgPT4gc3RyaW5nO1xuICB2aWRlb3M6ICgpID0+IFZpZGVvQXR0cnNbXTtcbn1cblxuY29uc3Qgc2l0ZU1ldGFkYXRhRXh0cmFjdG9yID0gKFxuICBtYXJrdXA6IHN0cmluZyxcbiAgcmVzb3VyY2VVcmw6IHN0cmluZyxcbiAgbGFuZyA9IFwiZW5cIixcbik6IFBhZ2VEYXRhID0+IHtcbiAgY29uc3QgcmVzb3VyY2VVcmxPYmogPSBuZXcgVVJMKHJlc291cmNlVXJsKTtcbiAgY29uc3QgZG9jID0gY2hlZXJpby5sb2FkKG1hcmt1cCwgeyB4bWxNb2RlOiB0cnVlIH0pO1xuXG4gIC8vIFNlcGFyYXRlIGluc3RhbmNlIHdpdGggZGVjb2RlRW50aXRpZXM6IGZhbHNlIHNwZWNpZmljYWxseSBmb3IgSlNPTi1MRCBleHRyYWN0aW9uXG4gIGNvbnN0IGRvY0Zvckpzb25MZCA9IGNoZWVyaW8ubG9hZChtYXJrdXAsIHtcbiAgICB4bWxNb2RlOiB0cnVlLFxuICAgIGRlY29kZUVudGl0aWVzOiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3QgZG9jRm9yVGV4dCA9IGNoZWVyaW8ubG9hZChtYXJrdXAsIHsgeG1sTW9kZTogZmFsc2UgfSk7XG5cbiAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5nIHx8IGV4dHJhY3Rvci5sYW5nKGRvYyk7XG5cbiAgY29uc3QgcGFnZURhdGE6IFBhZ2VEYXRhID0ge1xuICAgIGF1dGhvcjogZXh0cmFjdG9yLmF1dGhvcihkb2MpLFxuICAgIGNhbm9uaWNhbExpbms6IGV4dHJhY3Rvci5jYW5vbmljYWxMaW5rKGRvYywgcmVzb3VyY2VVcmwpLFxuICAgIGNvcHlyaWdodDogZXh0cmFjdG9yLmNvcHlyaWdodChkb2MpLFxuICAgIGRhdGU6IGV4dHJhY3Rvci5kYXRlKGRvYyksXG4gICAgZGVzY3JpcHRpb246IGV4dHJhY3Rvci5kZXNjcmlwdGlvbihkb2MpLFxuICAgIGZhdmljb246IGV4dHJhY3Rvci5mYXZpY29uKGRvYywgcmVzb3VyY2VVcmxPYmopLFxuICAgIGltYWdlOiBleHRyYWN0b3IuaW1hZ2UoZG9jKSxcbiAgICBqc29ubGQ6IGV4dHJhY3Rvci5qc29ubGQoZG9jRm9ySnNvbkxkKSxcbiAgICBrZXl3b3JkczogZXh0cmFjdG9yLmtleXdvcmRzKGRvYyksXG4gICAgbGFuZzogbGFuZ3VhZ2UsXG4gICAgbG9jYWxlOiBleHRyYWN0b3IubG9jYWxlKGRvYyksXG4gICAgb3JpZ2luOiByZXNvdXJjZVVybE9iai5vcmlnaW4sXG4gICAgcHVibGlzaGVyOiBleHRyYWN0b3IucHVibGlzaGVyKGRvYyksXG4gICAgc2l0ZU5hbWU6IGV4dHJhY3Rvci5zaXRlTmFtZShkb2MpLFxuICAgIHNvZnRUaXRsZTogZXh0cmFjdG9yLnNvZnRUaXRsZShkb2MpLFxuICAgIHRhZ3M6IGV4dHJhY3Rvci50YWdzKGRvYyksXG4gICAgdGl0bGU6IGV4dHJhY3Rvci50aXRsZShkb2MpLFxuICAgIHR5cGU6IGV4dHJhY3Rvci50eXBlKGRvYyksXG4gIH07XG5cbiAgLy8gU3RlcCAxOiBDbGVhbiB0aGUgZG9jXG4gIGNsZWFuZXIoZG9jKTtcblxuICAvLyBTdGVwIDI6IEZpbmQgdGhlIGRvYyBub2RlIHdpdGggdGhlIGJlc3QgdGV4dFxuICBjb25zdCB0b3BOb2RlID0gZXh0cmFjdG9yLmNhbGN1bGF0ZUJlc3ROb2RlKGRvY0ZvclRleHQsIGxhbmd1YWdlKTtcblxuICAvLyBTdGVwIDM6IEV4dHJhY3QgdGV4dCAsdmlkZW9zLCBpbWFnZXMsIGxpbmtcbiAgcGFnZURhdGEudmlkZW9zID0gZXh0cmFjdG9yLnZpZGVvcyhkb2MsIHRvcE5vZGUpO1xuICBwYWdlRGF0YS5saW5rcyA9IGV4dHJhY3Rvci5saW5rcyhkb2MsIHRvcE5vZGUsIGxhbmd1YWdlKTtcbiAgcGFnZURhdGEudGV4dCA9IGV4dHJhY3Rvci50ZXh0KGRvYywgdG9wTm9kZSwgbGFuZ3VhZ2UpO1xuXG4gIHJldHVybiBwYWdlRGF0YTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNpdGVNZXRhZGF0YUV4dHJhY3RvcjtcblxuLy8gQWxsb3cgYWNjZXNzIHRvIGRvY3VtZW50IHByb3BlcnRpZXMgd2l0aCBsYXp5IGV2YWx1YXRpb25cbmV4cG9ydCBjb25zdCBsYXp5ID0gKFxuICBodG1sOiBzdHJpbmcsXG4gIHJlc291cmNlVXJsOiBzdHJpbmcsXG4gIGxhbmd1YWdlID0gXCJlblwiLFxuKTogTGF6eUV4dHJhY3RvciA9PiB7XG4gIGNvbnN0IHJlc291cmNlVXJsT2JqID0gbmV3IFVSTChyZXNvdXJjZVVybCk7XG4gIGdsb2JhbC5sYXp5UGFnZURhdGEgPSBnbG9iYWwubGF6eVBhZ2VEYXRhIHx8IHt9O1xuXG4gIHJldHVybiB7XG4gICAgYXV0aG9yOiAoKSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5hdXRob3IgPSBleHRyYWN0b3IuYXV0aG9yKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5hdXRob3I7XG4gICAgfSxcbiAgICBjYW5vbmljYWxMaW5rOiAoKSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5jYW5vbmljYWxMaW5rID0gZXh0cmFjdG9yLmNhbm9uaWNhbExpbmsoXG4gICAgICAgIGRvYyxcbiAgICAgICAgcmVzb3VyY2VVcmwsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGdsb2JhbC5sYXp5UGFnZURhdGEuY2Fub25pY2FsTGluaztcbiAgICB9LFxuICAgIGNvcHlyaWdodDogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEuY29weXJpZ2h0ID0gZXh0cmFjdG9yLmNvcHlyaWdodChkb2MpO1xuICAgICAgcmV0dXJuIGdsb2JhbC5sYXp5UGFnZURhdGEuY29weXJpZ2h0O1xuICAgIH0sXG4gICAgZGF0ZTogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEuZGF0ZSA9IGV4dHJhY3Rvci5kYXRlKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5kYXRlO1xuICAgIH0sXG4gICAgZGVzY3JpcHRpb246ICgpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IGdldFBhcnNlZERvYy5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBnbG9iYWwubGF6eVBhZ2VEYXRhLmRlc2NyaXB0aW9uID0gZXh0cmFjdG9yLmRlc2NyaXB0aW9uKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5kZXNjcmlwdGlvbjtcbiAgICB9LFxuICAgIGZhdmljb246ICgpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IGdldFBhcnNlZERvYy5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBnbG9iYWwubGF6eVBhZ2VEYXRhLmZhdmljb24gPSBleHRyYWN0b3IuZmF2aWNvbihkb2MsIHJlc291cmNlVXJsT2JqKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLmZhdmljb247XG4gICAgfSxcbiAgICBpbWFnZTogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEuaW1hZ2UgPSBleHRyYWN0b3IuaW1hZ2UoZG9jKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLmltYWdlO1xuICAgIH0sXG4gICAganNvbmxkOiAoKSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5qc29ubGQgPSBleHRyYWN0b3IuanNvbmxkKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5qc29ubGQ7XG4gICAgfSxcbiAgICBrZXl3b3JkczogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEua2V5d29yZHMgPSBleHRyYWN0b3Iua2V5d29yZHMoZG9jKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLmtleXdvcmRzO1xuICAgIH0sXG4gICAgbGFuZzogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEubGFuZyA9IGxhbmd1YWdlIHx8IGV4dHJhY3Rvci5sYW5nKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5sYW5nO1xuICAgIH0sXG4gICAgbG9jYWxlOiAoKSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5sb2NhbGUgPSBleHRyYWN0b3IubG9jYWxlKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5sb2NhbGU7XG4gICAgfSxcbiAgICBsaW5rcygpIHtcbiAgICAgIGxldCBkb2MgPSBnZXRQYXJzZWREb2NGb3JUZXh0LmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGNvbnN0IHRvcE5vZGUgPSBnZXRUb3BOb2RlLmNhbGwoZ2xvYmFsLCBkb2MsIHRoaXMubGFuZygpKTtcbiAgICAgIGRvYyA9IGNsZWFuZXIoZG9jKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEubGlua3MgPSBleHRyYWN0b3IubGlua3MoZG9jLCB0b3BOb2RlLCB0aGlzLmxhbmcoKSk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5saW5rcztcbiAgICB9LFxuICAgIG9yaWdpbjogKCkgPT4ge1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5vcmlnaW4gPSByZXNvdXJjZVVybE9iai5vcmlnaW47XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5vcmlnaW47XG4gICAgfSxcbiAgICBwdWJsaXNoZXI6ICgpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IGdldFBhcnNlZERvYy5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBnbG9iYWwubGF6eVBhZ2VEYXRhLnB1Ymxpc2hlciA9IGV4dHJhY3Rvci5wdWJsaXNoZXIoZG9jKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLnB1Ymxpc2hlcjtcbiAgICB9LFxuICAgIHNpdGVOYW1lOiAoKSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5zaXRlTmFtZSA9IGV4dHJhY3Rvci5zaXRlTmFtZShkb2MpO1xuICAgICAgcmV0dXJuIGdsb2JhbC5sYXp5UGFnZURhdGEuc2l0ZU5hbWU7XG4gICAgfSxcbiAgICBzb2Z0VGl0bGU6ICgpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IGdldFBhcnNlZERvYy5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBnbG9iYWwubGF6eVBhZ2VEYXRhLnNvZnRUaXRsZSA9IGV4dHJhY3Rvci5zb2Z0VGl0bGUoZG9jKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLnNvZnRUaXRsZTtcbiAgICB9LFxuICAgIHRhZ3M6ICgpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IGdldFBhcnNlZERvYy5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBnbG9iYWwubGF6eVBhZ2VEYXRhLnRhZ3MgPSBleHRyYWN0b3IudGFncyhkb2MpO1xuICAgICAgcmV0dXJuIGdsb2JhbC5sYXp5UGFnZURhdGEudGFncztcbiAgICB9LFxuICAgIHRleHQoKSB7XG4gICAgICBsZXQgZG9jID0gZ2V0UGFyc2VkRG9jRm9yVGV4dC5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBkb2MgPSBjbGVhbmVyKGRvYyk7XG4gICAgICBjb25zdCB0b3BOb2RlID0gZ2V0VG9wTm9kZS5jYWxsKGdsb2JhbCwgZG9jLCB0aGlzLmxhbmcoKSk7XG4gICAgICBjb25zdCB0ZXh0RGF0YSA9IGV4dHJhY3Rvci50ZXh0KGRvYywgdG9wTm9kZSwgdGhpcy5sYW5nKCkpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS50ZXh0ID0gdGV4dERhdGE7XG4gICAgICByZXR1cm4gdGV4dERhdGE7XG4gICAgfSxcbiAgICB0aXRsZTogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEudGl0bGUgPSBleHRyYWN0b3IudGl0bGUoZG9jKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLnRpdGxlO1xuICAgIH0sXG4gICAgdHlwZTogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEudHlwZSA9IGV4dHJhY3Rvci50eXBlKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS50eXBlO1xuICAgIH0sXG4gICAgdmlkZW9zKCkge1xuICAgICAgbGV0IGRvYyA9IGdldFBhcnNlZERvY0ZvclRleHQuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZG9jID0gY2xlYW5lcihkb2MpO1xuICAgICAgY29uc3QgdG9wTm9kZSA9IGdldFRvcE5vZGUuY2FsbChnbG9iYWwsIGRvYywgdGhpcy5sYW5nKCkpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS52aWRlb3MgPSBleHRyYWN0b3IudmlkZW9zKGRvYywgdG9wTm9kZSk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS52aWRlb3M7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGVhbmVkRG9jKGh0bWw6IHN0cmluZyk6IGNoZWVyaW8uUm9vdCB7XG4gIGlmICghZ2xvYmFsLmNsZWFuZWREb2MpIHtcbiAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgIGdsb2JhbC5jbGVhbmVkRG9jID0gY2xlYW5lcihkb2MpO1xuICB9XG4gIHJldHVybiBnbG9iYWwuY2xlYW5lZERvYztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcnNlZERvYyhodG1sOiBzdHJpbmcpOiBjaGVlcmlvLlJvb3Qge1xuICByZXR1cm4gKGdsb2JhbC5kb2MgPSBjaGVlcmlvLmxvYWQoaHRtbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyc2VkRG9jRm9yVGV4dChodG1sOiBzdHJpbmcpOiBjaGVlcmlvLlJvb3Qge1xuICByZXR1cm4gKGdsb2JhbC5kb2MgPSBjaGVlcmlvLmxvYWQoaHRtbCwgeyB4bWxNb2RlOiBmYWxzZSB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3BOb2RlKGRvYzogY2hlZXJpby5Sb290LCBsYW5nOiBzdHJpbmcpOiBjaGVlcmlvLkNoZWVyaW8ge1xuICBnbG9iYWwudG9wTm9kZSA9IGV4dHJhY3Rvci5jYWxjdWxhdGVCZXN0Tm9kZShkb2MsIGxhbmcpO1xuICByZXR1cm4gZ2xvYmFsLnRvcE5vZGU7XG59XG4iXX0=