UNPKG

@dotglitch/ngx-common

Version:

Angular components and utilities that are commonly used.

155 lines 20.1 kB
import textExtensions from './textextensions'; import * as MIT from '../../assets/mat-icons'; // Object.keys(MIT).forEach(k => { // console.log(k, MIT[k]) // }) const symIcon = Symbol('icon'); const folderNames = MIT['default'].folderNames; const fileNames = MIT['default'].fileNames; const fileExtensions = MIT['default'].fileExtensions; let folderIconNameList = []; let fileIconNameList = []; let fileIconExtensionList = []; Object.entries(fileNames).forEach(([name, icon]) => { fileIconNameList.push({ val: name, iconName: icon }); }); Object.entries(fileExtensions).forEach(([name, icon]) => { fileIconExtensionList.push({ val: name, iconName: icon }); }); Object.entries(folderNames).forEach(([name, icon]) => { folderIconNameList.push({ val: name, iconName: icon, }); }); // const getMimeType = (name: string) => // (/\.(appimage)$/.test(name) && "compressed") || // (/\.(pot|potx|pps|ppsx|ppt|pptm|pptx)$/.test(name) && "presentation") || // (/\.(odt|rtf|doc|docm|docx|dot|dotm|dotx)$/.test(name) && "richtext") || // (/\.(ods|xls|xlsm|xlsx|xps|xlsx|csv)$/.test(name) && "spreadsheet"); // Limited list of pop-icons that match before mat-icons // const builtinIcons = [ // "7z", // "apk", // "arc", // "bz", // "deb", // "gz", // "pdf", // "rar", // "rpm", // "tar", // "xar", // "xz", // "zip" // ]; export class IconResolver { constructor(assetPath = "/assets/") { let path = assetPath.trim(); // Replace any duplicate slash occurences path = path.replace(/\/{2,99}/g, '\/'); // Trim off trailing slashes if (path.endsWith('/')) path = path.replace(/\/+$/, ''); // Ensure it starts with a slash. if (!path.startsWith('/')) path = '/' + path; this.path = path; } isText(path) { const ext = path.split('.').pop(); return textExtensions.includes(ext); } getBestMatch(data, filename) { return data .filter(d => filename.endsWith(d.val)) // filter to all match results .sort((a, b) => b.val.length - a.val.length) // sort longest string first [0]?.iconName; // Return the first result. } resolveDirIcon(file) { if (!file.name && !file.path) { return { path: `${this.path}/material/folder.svg`, needsBackdrop: false }; } const dirnameMatch = this.getBestMatch(folderIconNameList, file['vanityName'] || file.name || file.path); // VS Code Material Icon Theme pack // TODO: default to a clear icon that doesn't have decoration return { path: dirnameMatch ? `${this.path}/material/${dirnameMatch}.svg` : `${this.path}/material/folder.svg`, needsBackdrop: false }; } resolveFileIcon(file) { // Folders always use the material-icon-theme // const baseExt = builtinIcons.find(ext => (file['vanityName'] || file.name).endsWith('.' + ext)); // if (baseExt) { // return { // path: `${this.path}/pop/exts/${baseExt}.svg`, // needsBackdrop: false // }; // } // // Resolve a base MIME type via path extension // const base2Ext = getMimeType((file['vanityName'] || file.name)); // // If we get a path extension, we can easily map the icon // if (base2Ext) { // return { // path: `${this.path}/pop/${base2Ext}.svg`, // needsBackdrop: false // }; // } // Lookup a filename from material-icon-theme const filename = fileIconNameList .filter(d => (file['vanityName'] || file.name).toLowerCase() == d.val.toLowerCase()) .sort((a, b) => b.val.length - a.val.length)[0]?.iconName; if (filename) { return { path: `${this.path}/material/${filename}.svg`, needsBackdrop: true }; } // foo.log.1 foo.log.123 should be treated clearly as log files. if (/\.log\.\d+$/.test(filename)) { return { path: `${this.path}/material/log.svg`, needsBackdrop: true }; } // Check the file's extension -- we may const fileext = fileIconExtensionList .filter(d => (file['vanityName'] || file.name).toLowerCase().endsWith('.' + d.val.toLowerCase())) .sort((a, b) => b.val.length - a.val.length)[0]?.iconName; if (fileext) return { path: `${this.path}/material/${fileext}.svg`, needsBackdrop: true }; // If the file doesn't have a text extension, we're going to assume it's binary data. const isFileBinary = !this.isText(file.path); return { path: isFileBinary ? `${this.path}/material/document.svg` : `${this.path}/material/assembly.svg`, // path: isFileBinary ? `${this.path}/pop/text.svg` : `${this.path}/pop/binary.svg`, needsBackdrop: false }; } // TODO: resolve dynamic thumbnails for media documents resolveIcon(file) { if (!file) return null; if (file[symIcon]) return file[symIcon]; if (file.kind == "directory") { return file[symIcon] = this.resolveDirIcon(file); } return file[symIcon] = this.resolveFileIcon(file); } ; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1yZXNvbHZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9maWxlbWFuYWdlci9pY29uLXJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sY0FBYyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7QUFFOUMsa0NBQWtDO0FBQ2xDLDZCQUE2QjtBQUM3QixLQUFLO0FBRUwsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRS9CLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQUM7QUFDL0MsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBYyxDQUFDO0FBRXJELElBQUksa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLElBQUksZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzFCLElBQUkscUJBQXFCLEdBQUcsRUFBRSxDQUFDO0FBRS9CLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtJQUMvQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7UUFDbEIsR0FBRyxFQUFFLElBQUk7UUFDVCxRQUFRLEVBQUUsSUFBSTtLQUNqQixDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQTtBQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtJQUNwRCxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7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QUFJLElBQUksV0FBVyxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQUEsQ0FBQztDQUNMIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRlNEZXNjcmlwdG9yIH0gZnJvbSAnLi9maWxlbWFuYWdlci5jb21wb25lbnQnO1xuaW1wb3J0IHRleHRFeHRlbnNpb25zIGZyb20gJy4vdGV4dGV4dGVuc2lvbnMnO1xuaW1wb3J0ICogYXMgTUlUIGZyb20gJy4uLy4uL2Fzc2V0cy9tYXQtaWNvbnMnO1xuXG4vLyBPYmplY3Qua2V5cyhNSVQpLmZvckVhY2goayA9PiB7XG4vLyAgICAgY29uc29sZS5sb2coaywgTUlUW2tdKVxuLy8gfSlcblxuY29uc3Qgc3ltSWNvbiA9IFN5bWJvbCgnaWNvbicpO1xuXG5jb25zdCBmb2xkZXJOYW1lcyA9IE1JVFsnZGVmYXVsdCddLmZvbGRlck5hbWVzO1xuY29uc3QgZmlsZU5hbWVzID0gTUlUWydkZWZhdWx0J10uZmlsZU5hbWVzO1xuY29uc3QgZmlsZUV4dGVuc2lvbnMgPSBNSVRbJ2RlZmF1bHQnXS5maWxlRXh0ZW5zaW9ucztcblxubGV0IGZvbGRlckljb25OYW1lTGlzdCA9IFtdO1xubGV0IGZpbGVJY29uTmFtZUxpc3QgPSBbXTtcbmxldCBmaWxlSWNvbkV4dGVuc2lvbkxpc3QgPSBbXTtcblxuT2JqZWN0LmVudHJpZXMoZmlsZU5hbWVzKS5mb3JFYWNoKChbbmFtZSwgaWNvbl0pID0+IHtcbiAgICBmaWxlSWNvbk5hbWVMaXN0LnB1c2goe1xuICAgICAgICB2YWw6IG5hbWUsXG4gICAgICAgIGljb25OYW1lOiBpY29uXG4gICAgfSk7XG59KVxuT2JqZWN0LmVudHJpZXMoZmlsZUV4dGVuc2lvbnMpLmZvckVhY2goKFtuYW1lLCBpY29uXSkgPT4ge1xuICAgIGZpbGVJY29uRXh0ZW5zaW9uTGlzdC5wdXNoKHtcbiAgICAgICAgdmFsOiBuYW1lLFxuICAgICAgICBpY29uTmFtZTogaWNvblxuICAgIH0pO1xufSlcblxuT2JqZWN0LmVudHJpZXMoZm9sZGVyTmFtZXMpLmZvckVhY2goKFtuYW1lLCBpY29uXSkgPT4ge1xuICAgIGZvbGRlckljb25OYW1lTGlzdC5wdXNoKHtcbiAgICAgICAgdmFsOiBuYW1lLFxuICAgICAgICBpY29uTmFtZTogaWNvbixcbiAgICB9KTtcbn0pXG5cbi8vIGNvbnN0IGdldE1pbWVUeXBlID0gKG5hbWU6IHN0cmluZykgPT5cbi8vICAgICAoL1xcLihhcHBpbWFnZSkkLy50ZXN0KG5hbWUpICYmIFwiY29tcHJlc3NlZFwiKSB8fFxuLy8gICAgICgvXFwuKHBvdHxwb3R4fHBwc3xwcHN4fHBwdHxwcHRtfHBwdHgpJC8udGVzdChuYW1lKSAmJiBcInByZXNlbnRhdGlvblwiKSB8fFxuLy8gICAgICgvXFwuKG9kdHxydGZ8ZG9jfGRvY218ZG9jeHxkb3R8ZG90bXxkb3R4KSQvLnRlc3QobmFtZSkgJiYgXCJyaWNodGV4dFwiKSB8fFxuLy8gICAgICgvXFwuKG9kc3x4bHN8eGxzbXx4bHN4fHhwc3x4bHN4fGNzdikkLy50ZXN0KG5hbWUpICYmIFwic3ByZWFkc2hlZXRcIik7XG5cblxuLy8gTGltaXRlZCBsaXN0IG9mIHBvcC1pY29ucyB0aGF0IG1hdGNoIGJlZm9yZSBtYXQtaWNvbnNcbi8vIGNvbnN0IGJ1aWx0aW5JY29ucyA9IFtcbi8vICAgICBcIjd6XCIsXG4vLyAgICAgXCJhcGtcIixcbi8vICAgICBcImFyY1wiLFxuLy8gICAgIFwiYnpcIixcbi8vICAgICBcImRlYlwiLFxuLy8gICAgIFwiZ3pcIixcbi8vICAgICBcInBkZlwiLFxuLy8gICAgIFwicmFyXCIsXG4vLyAgICAgXCJycG1cIixcbi8vICAgICBcInRhclwiLFxuLy8gICAgIFwieGFyXCIsXG4vLyAgICAgXCJ4elwiLFxuLy8gICAgIFwiemlwXCJcbi8vIF07XG5cbmV4cG9ydCBjbGFzcyBJY29uUmVzb2x2ZXIge1xuICAgIHB1YmxpYyBwYXRoOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihhc3NldFBhdGggPSBcIi9hc3NldHMvXCIpIHtcbiAgICAgICAgbGV0IHBhdGggPSBhc3NldFBhdGgudHJpbSgpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgYW55IGR1cGxpY2F0ZSBzbGFzaCBvY2N1cmVuY2VzXG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcL3syLDk5fS9nLCAnXFwvJyk7XG5cbiAgICAgICAgLy8gVHJpbSBvZmYgdHJhaWxpbmcgc2xhc2hlc1xuICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLycpKVxuICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG5cbiAgICAgICAgLy8gRW5zdXJlIGl0IHN0YXJ0cyB3aXRoIGEgc2xhc2guXG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpXG4gICAgICAgICAgICBwYXRoID0gJy8nICsgcGF0aDtcblxuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNUZXh0KHBhdGg6IHN0cmluZykge1xuICAgICAgICBjb25zdCBleHQgPSBwYXRoLnNwbGl0KCcuJykucG9wKCk7XG4gICAgICAgIHJldHVybiB0ZXh0RXh0ZW5zaW9ucy5pbmNsdWRlcyhleHQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QmVzdE1hdGNoKGRhdGE6IHsgdmFsOiBzdHJpbmcsIGljb25OYW1lOiBzdHJpbmc7IH1bXSwgZmlsZW5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBmaWxlbmFtZS5lbmRzV2l0aChkLnZhbCkpIC8vIGZpbHRlciB0byBhbGwgbWF0Y2ggcmVzdWx0c1xuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIudmFsLmxlbmd0aCAtIGEudmFsLmxlbmd0aCkgLy8gc29ydCBsb25nZXN0IHN0cmluZyBmaXJzdFxuICAgICAgICBbMF0/Lmljb25OYW1lOyAvLyBSZXR1cm4gdGhlIGZpcnN0IHJlc3VsdC5cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVEaXJJY29uIChmaWxlOiBGU0Rlc2NyaXB0b3IpIHtcbiAgICAgICAgaWYgKCFmaWxlLm5hbWUgJiYgIWZpbGUucGF0aCkgIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGF0aDogYCR7dGhpcy5wYXRofS9tYXRlcmlhbC9mb2xkZXIuc3ZnYCxcbiAgICAgICAgICAgICAgICBuZWVkc0JhY2tkcm9wOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlybmFtZU1hdGNoID0gdGhpcy5nZXRCZXN0TWF0Y2goZm9sZGVySWNvbk5hbWVMaXN0LCBmaWxlWyd2YW5pdHlOYW1lJ10gfHwgZmlsZS5uYW1lIHx8IGZpbGUucGF0aCk7XG4gICAgICAgIC8vIFZTIENvZGUgTWF0ZXJpYWwgSWNvbiBUaGVtZSBwYWNrXG5cbiAgICAgICAgLy8gVE9ETzogZGVmYXVsdCB0byBhIGNsZWFyIGljb24gdGhhdCBkb2Vzbid0IGhhdmUgZGVjb3JhdGlvblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogZGlybmFtZU1hdGNoID8gYCR7dGhpcy5wYXRofS9tYXRlcmlhbC8ke2Rpcm5hbWVNYXRjaH0uc3ZnYCA6IGAke3RoaXMucGF0aH0vbWF0ZXJpYWwvZm9sZGVyLnN2Z2AsXG4gICAgICAgICAgICBuZWVkc0JhY2tkcm9wOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzb2x2ZUZpbGVJY29uIChmaWxlOiBGU0Rlc2NyaXB0b3IpIHtcbiAgICAgICAgLy8gRm9sZGVycyBhbHdheXMgdXNlIHRoZSBtYXRlcmlhbC1pY29uLXRoZW1lXG5cbiAgICAgICAgLy8gY29uc3QgYmFzZUV4dCA9IGJ1aWx0aW5JY29ucy5maW5kKGV4dCA9PiAoZmlsZVsndmFuaXR5TmFtZSddIHx8IGZpbGUubmFtZSkuZW5kc1dpdGgoJy4nICsgZXh0KSk7XG4gICAgICAgIC8vIGlmIChiYXNlRXh0KSB7XG4gICAgICAgIC8vICAgICByZXR1cm4ge1xuICAgICAgICAvLyAgICAgICAgIHBhdGg6IGAke3RoaXMucGF0aH0vcG9wL2V4dHMvJHtiYXNlRXh0fS5zdmdgLFxuICAgICAgICAvLyAgICAgICAgIG5lZWRzQmFja2Ryb3A6IGZhbHNlXG4gICAgICAgIC8vICAgICB9O1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gLy8gUmVzb2x2ZSBhIGJhc2UgTUlNRSB0eXBlIHZpYSBwYXRoIGV4dGVuc2lvblxuICAgICAgICAvLyBjb25zdCBiYXNlMkV4dCA9IGdldE1pbWVUeXBlKChmaWxlWyd2YW5pdHlOYW1lJ10gfHwgZmlsZS5uYW1lKSk7XG5cbiAgICAgICAgLy8gLy8gSWYgd2UgZ2V0IGEgcGF0aCBleHRlbnNpb24sIHdlIGNhbiBlYXNpbHkgbWFwIHRoZSBpY29uXG4gICAgICAgIC8vIGlmIChiYXNlMkV4dCkge1xuICAgICAgICAvLyAgICAgcmV0dXJuIHtcbiAgICAgICAgLy8gICAgICAgICBwYXRoOiBgJHt0aGlzLnBhdGh9L3BvcC8ke2Jhc2UyRXh0fS5zdmdgLFxuICAgICAgICAvLyAgICAgICAgIG5lZWRzQmFja2Ryb3A6IGZhbHNlXG4gICAgICAgIC8vICAgICB9O1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gTG9va3VwIGEgZmlsZW5hbWUgZnJvbSBtYXRlcmlhbC1pY29uLXRoZW1lXG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gZmlsZUljb25OYW1lTGlzdFxuICAgICAgICAgICAgLmZpbHRlcihkID0+IChmaWxlWyd2YW5pdHlOYW1lJ10gfHwgZmlsZS5uYW1lKS50b0xvd2VyQ2FzZSgpID09IGQudmFsLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYi52YWwubGVuZ3RoIC0gYS52YWwubGVuZ3RoKVxuICAgICAgICAgICAgWzBdPy5pY29uTmFtZTtcblxuICAgICAgICBpZiAoZmlsZW5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGF0aDogYCR7dGhpcy5wYXRofS9tYXRlcmlhbC8ke2ZpbGVuYW1lfS5zdmdgLFxuICAgICAgICAgICAgICAgIG5lZWRzQmFja2Ryb3A6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmb28ubG9nLjEgZm9vLmxvZy4xMjMgc2hvdWxkIGJlIHRyZWF0ZWQgY2xlYXJseSBhcyBsb2cgZmlsZXMuXG4gICAgICAgIGlmICgvXFwubG9nXFwuXFxkKyQvLnRlc3QoZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhdGg6IGAke3RoaXMucGF0aH0vbWF0ZXJpYWwvbG9nLnN2Z2AsXG4gICAgICAgICAgICAgICAgbmVlZHNCYWNrZHJvcDogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBmaWxlJ3MgZXh0ZW5zaW9uIC0tIHdlIG1heVxuICAgICAgICBjb25zdCBmaWxlZXh0ID0gZmlsZUljb25FeHRlbnNpb25MaXN0XG4gICAgICAgICAgICAuZmlsdGVyKGQgPT4gKGZpbGVbJ3Zhbml0eU5hbWUnXSB8fCBmaWxlLm5hbWUpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy4nICsgZC52YWwudG9Mb3dlckNhc2UoKSkpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYi52YWwubGVuZ3RoIC0gYS52YWwubGVuZ3RoKVxuICAgICAgICAgICAgWzBdPy5pY29uTmFtZTtcblxuICAgICAgICBpZiAoZmlsZWV4dCkgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhdGg6IGAke3RoaXMucGF0aH0vbWF0ZXJpYWwvJHtmaWxlZXh0fS5zdmdgLFxuICAgICAgICAgICAgbmVlZHNCYWNrZHJvcDogdHJ1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElmIHRoZSBmaWxlIGRvZXNuJ3QgaGF2ZSBhIHRleHQgZXh0ZW5zaW9uLCB3ZSdyZSBnb2luZyB0byBhc3N1bWUgaXQncyBiaW5hcnkgZGF0YS5cbiAgICAgICAgY29uc3QgaXNGaWxlQmluYXJ5ID0gIXRoaXMuaXNUZXh0KGZpbGUucGF0aCk7XG5cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogaXNGaWxlQmluYXJ5ID8gYCR7dGhpcy5wYXRofS9tYXRlcmlhbC9kb2N1bWVudC5zdmdgIDogYCR7dGhpcy5wYXRofS9tYXRlcmlhbC9hc3NlbWJseS5zdmdgLFxuICAgICAgICAgICAgLy8gcGF0aDogaXNGaWxlQmluYXJ5ID8gYCR7dGhpcy5wYXRofS9wb3AvdGV4dC5zdmdgIDogYCR7dGhpcy5wYXRofS9wb3AvYmluYXJ5LnN2Z2AsXG4gICAgICAgICAgICBuZWVkc0JhY2tkcm9wOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIFRPRE86IHJlc29sdmUgZHluYW1pYyB0aHVtYm5haWxzIGZvciBtZWRpYSBkb2N1bWVudHNcbiAgICByZXNvbHZlSWNvbihmaWxlOiBGU0Rlc2NyaXB0b3IpOiB7IHBhdGg6IHN0cmluZywgbmVlZHNCYWNrZHJvcDogYm9vbGVhbjsgfSB7XG4gICAgICAgIGlmICghZmlsZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChmaWxlW3N5bUljb25dKSByZXR1cm4gZmlsZVtzeW1JY29uXTtcblxuICAgICAgICBpZiAoZmlsZS5raW5kID09IFwiZGlyZWN0b3J5XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlW3N5bUljb25dID0gdGhpcy5yZXNvbHZlRGlySWNvbihmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxlW3N5bUljb25dID0gdGhpcy5yZXNvbHZlRmlsZUljb24oZmlsZSk7XG4gICAgfTtcbn1cbiJdfQ==