ngx-highlightjs
Version:
Instant code highlighting, auto-detect language, super easy to use.
138 lines • 19.5 kB
JavaScript
import { Injectable, Inject, PLATFORM_ID, Optional } from '@angular/core';
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
import { BehaviorSubject, from, EMPTY, zip, throwError } from 'rxjs';
import { catchError, tap, map, switchMap, filter, take } from 'rxjs/operators';
import { HIGHLIGHT_OPTIONS } from './highlight.model';
import * as i0 from "@angular/core";
// @dynamic
export class HighlightLoader {
constructor(doc, platformId, _options) {
this.doc = doc;
this._options = _options;
// Stream that emits when hljs library is loaded and ready to use
this._ready = new BehaviorSubject(null);
this.ready = this._ready.asObservable().pipe(filter((hljs) => !!hljs), map((hljs) => hljs), take(1));
if (isPlatformBrowser(platformId)) {
// Check if hljs is already available
if (doc.defaultView.hljs) {
this._ready.next(doc.defaultView.hljs);
}
else {
// Load hljs library
this._loadLibrary().pipe(switchMap((hljs) => {
if (this._options && this._options.lineNumbersLoader) {
// Make hljs available on window object (required for the line numbers library)
doc.defaultView.hljs = hljs;
// Load line numbers library
return this.loadLineNumbers().pipe(tap(() => this._ready.next(hljs)));
}
else {
this._ready.next(hljs);
return EMPTY;
}
}), catchError((e) => {
console.error('[HLJS] ', e);
return EMPTY;
})).subscribe();
}
// Load highlighting theme
if (this._options?.themePath) {
this.loadTheme(this._options.themePath);
}
}
}
/**
* Lazy-Load highlight.js library
*/
_loadLibrary() {
if (this._options) {
if (this._options.fullLibraryLoader && this._options.coreLibraryLoader) {
return throwError(() => 'The full library and the core library were imported, only one of them should be imported!');
}
if (this._options.fullLibraryLoader && this._options.languages) {
return throwError(() => 'The highlighting languages were imported they are not needed!');
}
if (this._options.coreLibraryLoader && !this._options.languages) {
return throwError(() => 'The highlighting languages were not imported!');
}
if (!this._options.coreLibraryLoader && this._options.languages) {
return throwError(() => 'The core library was not imported!');
}
if (this._options.fullLibraryLoader) {
return this.loadFullLibrary();
}
if (this._options.coreLibraryLoader && this._options.languages && Object.keys(this._options.languages).length) {
return this.loadCoreLibrary().pipe(switchMap((hljs) => this._loadLanguages(hljs)));
}
}
return throwError(() => 'Highlight.js library was not imported!');
}
/**
* Lazy-load highlight.js languages
*/
_loadLanguages(hljs) {
const languages = Object.entries(this._options.languages).map(([langName, langLoader]) => importModule(langLoader()).pipe(tap((langFunc) => hljs.registerLanguage(langName, langFunc))));
return zip(...languages).pipe(map(() => hljs));
}
/**
* Import highlight.js core library
*/
loadCoreLibrary() {
return importModule(this._options.coreLibraryLoader());
}
/**
* Import highlight.js library with all languages
*/
loadFullLibrary() {
return importModule(this._options.fullLibraryLoader());
}
/**
* Import line numbers library
*/
loadLineNumbers() {
return importModule(this._options.lineNumbersLoader());
}
/**
* Reload theme styles
*/
setTheme(path) {
this._themeLinkElement.href = path;
}
/**
* Load theme
*/
loadTheme(path) {
this._themeLinkElement = this.doc.createElement('link');
this._themeLinkElement.href = path;
this._themeLinkElement.type = 'text/css';
this._themeLinkElement.rel = 'stylesheet';
this._themeLinkElement.media = 'screen,print';
this.doc.head.appendChild(this._themeLinkElement);
}
}
HighlightLoader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: HighlightLoader, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: HIGHLIGHT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
HighlightLoader.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: HighlightLoader, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: HighlightLoader, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [HIGHLIGHT_OPTIONS]
}] }]; } });
/**
* Map loader response to module object
*/
const importModule = (moduleLoader) => {
return from(moduleLoader).pipe(filter((module) => !!module && !!module.default), map((module) => module.default));
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlnaGxpZ2h0LmxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaWdobGlnaHRqcy9zcmMvbGliL2hpZ2hsaWdodC5sb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBYyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakYsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFzQyxNQUFNLG1CQUFtQixDQUFDOztBQUUxRixXQUFXO0FBSVgsTUFBTSxPQUFPLGVBQWU7SUFXMUIsWUFBc0MsR0FBUSxFQUNiLFVBQWtCLEVBQ1EsUUFBMEI7UUFGL0MsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUVhLGFBQVEsR0FBUixRQUFRLENBQWtCO1FBWnJGLGlFQUFpRTtRQUNoRCxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQTBCLElBQUksQ0FBQyxDQUFDO1FBQ3BFLFVBQUssR0FBaUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQzVFLE1BQU0sQ0FBQyxDQUFDLElBQTZCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFDakQsR0FBRyxDQUFDLENBQUMsSUFBNkIsRUFBRSxFQUFFLENBQUMsSUFBd0IsQ0FBQyxFQUNoRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1IsQ0FBQztRQU9BLElBQUksaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDakMscUNBQXFDO1lBQ3JDLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDeEM7aUJBQU07Z0JBQ0wsb0JBQW9CO2dCQUNwQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUN0QixTQUFTLENBQUMsQ0FBQyxJQUFzQixFQUFFLEVBQUU7b0JBQ25DLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFO3dCQUNwRCwrRUFBK0U7d0JBQy9FLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzt3QkFDNUIsNEJBQTRCO3dCQUM1QixPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdkU7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3ZCLE9BQU8sS0FBSyxDQUFDO3FCQUNkO2dCQUNILENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO29CQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDNUIsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUNmO1lBRUQsMEJBQTBCO1lBQzFCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN6QztTQUNGO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3RFLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJGQUEyRixDQUFDLENBQUM7YUFDdEg7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQzlELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLCtEQUErRCxDQUFDLENBQUM7YUFDMUY7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDL0QsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsK0NBQStDLENBQUMsQ0FBQzthQUMxRTtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFO2dCQUMvRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFO2dCQUNuQyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUMvQjtZQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUM3RyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBc0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEc7U0FDRjtRQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssY0FBYyxDQUFDLElBQXNCO1FBQzNDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQStCLEVBQUUsRUFBRSxDQUNySCxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzdCLEdBQUcsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUNsRSxDQUNGLENBQUM7UUFDRixPQUFPLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBR0Q7O09BRUc7SUFDSyxlQUFlO1FBQ3JCLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWU7UUFDckIsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZTtRQUNyQixPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFrQixFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsSUFBWTtRQUNuQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxTQUFTLENBQUMsSUFBWTtRQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUM7UUFDMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxjQUFjLENBQUM7UUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BELENBQUM7OzRHQTVIVSxlQUFlLGtCQVdOLFFBQVEsYUFDUixXQUFXLGFBQ0MsaUJBQWlCO2dIQWJ0QyxlQUFlLGNBRmQsTUFBTTsyRkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBWWMsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGlCQUFpQjs7QUFrSG5EOztHQUVHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsQ0FBQyxZQUEwQixFQUFtQixFQUFFO0lBQ25FLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FDNUIsTUFBTSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQ3JELEdBQUcsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUNyQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBQTEFURk9STV9JRCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBmcm9tLCBFTVBUWSwgemlwLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHRhcCwgbWFwLCBzd2l0Y2hNYXAsIGZpbHRlciwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgSElHSExJR0hUX09QVElPTlMsIEhpZ2hsaWdodExpYnJhcnksIEhpZ2hsaWdodE9wdGlvbnMgfSBmcm9tICcuL2hpZ2hsaWdodC5tb2RlbCc7XHJcblxyXG4vLyBAZHluYW1pY1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIaWdobGlnaHRMb2FkZXIge1xyXG4gIC8vIFN0cmVhbSB0aGF0IGVtaXRzIHdoZW4gaGxqcyBsaWJyYXJ5IGlzIGxvYWRlZCBhbmQgcmVhZHkgdG8gdXNlXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVhZHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEhpZ2hsaWdodExpYnJhcnkgfCBudWxsPihudWxsKTtcclxuICByZWFkb25seSByZWFkeTogT2JzZXJ2YWJsZTxIaWdobGlnaHRMaWJyYXJ5PiA9IHRoaXMuX3JlYWR5LmFzT2JzZXJ2YWJsZSgpLnBpcGUoXHJcbiAgICBmaWx0ZXIoKGhsanM6IEhpZ2hsaWdodExpYnJhcnkgfCBudWxsKSA9PiAhIWhsanMpLFxyXG4gICAgbWFwKChobGpzOiBIaWdobGlnaHRMaWJyYXJ5IHwgbnVsbCkgPT4gaGxqcyBhcyBIaWdobGlnaHRMaWJyYXJ5KSxcclxuICAgIHRha2UoMSlcclxuICApO1xyXG5cclxuICBwcml2YXRlIF90aGVtZUxpbmtFbGVtZW50OiBIVE1MTGlua0VsZW1lbnQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jOiBhbnksXHJcbiAgICAgICAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogb2JqZWN0LFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSElHSExJR0hUX09QVElPTlMpIHByaXZhdGUgX29wdGlvbnM6IEhpZ2hsaWdodE9wdGlvbnMpIHtcclxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSkge1xyXG4gICAgICAvLyBDaGVjayBpZiBobGpzIGlzIGFscmVhZHkgYXZhaWxhYmxlXHJcbiAgICAgIGlmIChkb2MuZGVmYXVsdFZpZXcuaGxqcykge1xyXG4gICAgICAgIHRoaXMuX3JlYWR5Lm5leHQoZG9jLmRlZmF1bHRWaWV3LmhsanMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIExvYWQgaGxqcyBsaWJyYXJ5XHJcbiAgICAgICAgdGhpcy5fbG9hZExpYnJhcnkoKS5waXBlKFxyXG4gICAgICAgICAgc3dpdGNoTWFwKChobGpzOiBIaWdobGlnaHRMaWJyYXJ5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMubGluZU51bWJlcnNMb2FkZXIpIHtcclxuICAgICAgICAgICAgICAvLyBNYWtlIGhsanMgYXZhaWxhYmxlIG9uIHdpbmRvdyBvYmplY3QgKHJlcXVpcmVkIGZvciB0aGUgbGluZSBudW1iZXJzIGxpYnJhcnkpXHJcbiAgICAgICAgICAgICAgZG9jLmRlZmF1bHRWaWV3LmhsanMgPSBobGpzO1xyXG4gICAgICAgICAgICAgIC8vIExvYWQgbGluZSBudW1iZXJzIGxpYnJhcnlcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkTGluZU51bWJlcnMoKS5waXBlKHRhcCgoKSA9PiB0aGlzLl9yZWFkeS5uZXh0KGhsanMpKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcmVhZHkubmV4dChobGpzKTtcclxuICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tITEpTXSAnLCBlKTtcclxuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBMb2FkIGhpZ2hsaWdodGluZyB0aGVtZVxyXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucz8udGhlbWVQYXRoKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkVGhlbWUodGhpcy5fb3B0aW9ucy50aGVtZVBhdGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMYXp5LUxvYWQgaGlnaGxpZ2h0LmpzIGxpYnJhcnlcclxuICAgKi9cclxuICBwcml2YXRlIF9sb2FkTGlicmFyeSgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHRoaXMuX29wdGlvbnMpIHtcclxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZnVsbExpYnJhcnlMb2FkZXIgJiYgdGhpcy5fb3B0aW9ucy5jb3JlTGlicmFyeUxvYWRlcikge1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICdUaGUgZnVsbCBsaWJyYXJ5IGFuZCB0aGUgY29yZSBsaWJyYXJ5IHdlcmUgaW1wb3J0ZWQsIG9ubHkgb25lIG9mIHRoZW0gc2hvdWxkIGJlIGltcG9ydGVkIScpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLmZ1bGxMaWJyYXJ5TG9hZGVyICYmIHRoaXMuX29wdGlvbnMubGFuZ3VhZ2VzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gJ1RoZSBoaWdobGlnaHRpbmcgbGFuZ3VhZ2VzIHdlcmUgaW1wb3J0ZWQgdGhleSBhcmUgbm90IG5lZWRlZCEnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy5jb3JlTGlicmFyeUxvYWRlciAmJiAhdGhpcy5fb3B0aW9ucy5sYW5ndWFnZXMpIHtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAnVGhlIGhpZ2hsaWdodGluZyBsYW5ndWFnZXMgd2VyZSBub3QgaW1wb3J0ZWQhJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLmNvcmVMaWJyYXJ5TG9hZGVyICYmIHRoaXMuX29wdGlvbnMubGFuZ3VhZ2VzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gJ1RoZSBjb3JlIGxpYnJhcnkgd2FzIG5vdCBpbXBvcnRlZCEnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy5mdWxsTGlicmFyeUxvYWRlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRGdWxsTGlicmFyeSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLmNvcmVMaWJyYXJ5TG9hZGVyICYmIHRoaXMuX29wdGlvbnMubGFuZ3VhZ2VzICYmIE9iamVjdC5rZXlzKHRoaXMuX29wdGlvbnMubGFuZ3VhZ2VzKS5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29yZUxpYnJhcnkoKS5waXBlKHN3aXRjaE1hcCgoaGxqczogSGlnaGxpZ2h0TGlicmFyeSkgPT4gdGhpcy5fbG9hZExhbmd1YWdlcyhobGpzKSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAnSGlnaGxpZ2h0LmpzIGxpYnJhcnkgd2FzIG5vdCBpbXBvcnRlZCEnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExhenktbG9hZCBoaWdobGlnaHQuanMgbGFuZ3VhZ2VzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfbG9hZExhbmd1YWdlcyhobGpzOiBIaWdobGlnaHRMaWJyYXJ5KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGxhbmd1YWdlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX29wdGlvbnMubGFuZ3VhZ2VzKS5tYXAoKFtsYW5nTmFtZSwgbGFuZ0xvYWRlcl06IFtzdHJpbmcsICgpID0+IFByb21pc2U8YW55Pl0pID0+XHJcbiAgICAgIGltcG9ydE1vZHVsZShsYW5nTG9hZGVyKCkpLnBpcGUoXHJcbiAgICAgICAgdGFwKChsYW5nRnVuYzogYW55KSA9PiBobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UobGFuZ05hbWUsIGxhbmdGdW5jKSlcclxuICAgICAgKVxyXG4gICAgKTtcclxuICAgIHJldHVybiB6aXAoLi4ubGFuZ3VhZ2VzKS5waXBlKG1hcCgoKSA9PiBobGpzKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogSW1wb3J0IGhpZ2hsaWdodC5qcyBjb3JlIGxpYnJhcnlcclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRDb3JlTGlicmFyeSgpOiBPYnNlcnZhYmxlPEhpZ2hsaWdodExpYnJhcnk+IHtcclxuICAgIHJldHVybiBpbXBvcnRNb2R1bGUodGhpcy5fb3B0aW9ucy5jb3JlTGlicmFyeUxvYWRlciEoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbXBvcnQgaGlnaGxpZ2h0LmpzIGxpYnJhcnkgd2l0aCBhbGwgbGFuZ3VhZ2VzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkRnVsbExpYnJhcnkoKTogT2JzZXJ2YWJsZTxIaWdobGlnaHRMaWJyYXJ5PiB7XHJcbiAgICByZXR1cm4gaW1wb3J0TW9kdWxlKHRoaXMuX29wdGlvbnMuZnVsbExpYnJhcnlMb2FkZXIhKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW1wb3J0IGxpbmUgbnVtYmVycyBsaWJyYXJ5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkTGluZU51bWJlcnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiBpbXBvcnRNb2R1bGUodGhpcy5fb3B0aW9ucy5saW5lTnVtYmVyc0xvYWRlciEoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWxvYWQgdGhlbWUgc3R5bGVzXHJcbiAgICovXHJcbiAgc2V0VGhlbWUocGF0aDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl90aGVtZUxpbmtFbGVtZW50LmhyZWYgPSBwYXRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCB0aGVtZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFRoZW1lKHBhdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fdGhlbWVMaW5rRWxlbWVudCA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcclxuICAgIHRoaXMuX3RoZW1lTGlua0VsZW1lbnQuaHJlZiA9IHBhdGg7XHJcbiAgICB0aGlzLl90aGVtZUxpbmtFbGVtZW50LnR5cGUgPSAndGV4dC9jc3MnO1xyXG4gICAgdGhpcy5fdGhlbWVMaW5rRWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XHJcbiAgICB0aGlzLl90aGVtZUxpbmtFbGVtZW50Lm1lZGlhID0gJ3NjcmVlbixwcmludCc7XHJcbiAgICB0aGlzLmRvYy5oZWFkLmFwcGVuZENoaWxkKHRoaXMuX3RoZW1lTGlua0VsZW1lbnQpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcCBsb2FkZXIgcmVzcG9uc2UgdG8gbW9kdWxlIG9iamVjdFxyXG4gKi9cclxuY29uc3QgaW1wb3J0TW9kdWxlID0gKG1vZHVsZUxvYWRlcjogUHJvbWlzZTxhbnk+KTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuICByZXR1cm4gZnJvbShtb2R1bGVMb2FkZXIpLnBpcGUoXHJcbiAgICBmaWx0ZXIoKG1vZHVsZTogYW55KSA9PiAhIW1vZHVsZSAmJiAhIW1vZHVsZS5kZWZhdWx0KSxcclxuICAgIG1hcCgobW9kdWxlOiBhbnkpID0+IG1vZHVsZS5kZWZhdWx0KVxyXG4gICk7XHJcbn07XHJcbiJdfQ==