UNPKG

@cisstech/nge

Version:

NG Essentials is a collection of libraries for Angular developers.

131 lines 18.7 kB
import { InjectionToken, Injectable, Inject, Optional } from '@angular/core'; import { NGE_MARKDOWN_CONTRIBUTION } from '../nge-markdown-contribution'; import * as i0 from "@angular/core"; const DATA_LINES = 'data-nge-md-hl-lines'; const DATA_LANGUAGE = 'data-nge-md-hl-language'; const DATA_HIGHLIGHTS = 'data-nge-md-hl-highlights'; const DATA_FILENAME = 'data-nge-md-hl-filename'; /** * Injection token to register a highlighter service. */ export const NGE_MARKDOWN_HIGHLIGHTER_SERVICE = new InjectionToken('NGE_MARKDOWN_HIGHLIGHTER_SERVICE'); /** * Contribution to add an abstract syntax highlighter. */ export class NgeMarkdownHighlighter { constructor(injector, options) { this.injector = injector; this.options = options; } contribute(transformer) { this.createAttributes(transformer); this.colorizeCodes(transformer); } createAttributes(transformer) { transformer.addRendererTransformer((renderer) => { renderer.code = (code, args) => { args = args || ''; const attributes = new Map(); // LANGUAGE const language = args.split(' ').slice(0, 1).pop() || 'plaintext'; attributes.set(DATA_LANGUAGE, language); // LINE NUMBERING let match = args.match(/lines="(.+?)"/); if (match) { attributes.set(DATA_LINES, match[1]); } // LINE HIGHLIGHTING match = args.match(/highlights="(.+?)"/); if (match) { attributes.set(DATA_HIGHLIGHTS, match[1]); } // FILENAME match = args.match(/filename="(.+?)"/); if (match) { attributes.set(DATA_FILENAME, match[1]); } const attribs = Array.from(attributes.entries()) .map(([attributeName, attributeValue]) => { return `${attributeName}="${attributeValue}"`; }) .join(' '); console.log(attribs); return `<pre ${attribs}><code>${this.escapeHtml(code)}</code></pre>`; }; return renderer; }); } colorizeCodes(transformer) { if (!this.options?.highligtht) { return; } const highlight = this.options.highligtht; transformer.addHtmlTransformer(async (element) => { const preElements = Array.from(element.querySelectorAll(`pre[${DATA_LANGUAGE}]`)); for (const pre of preElements) { highlight(this.injector, { lines: pre.getAttribute(DATA_LINES) || '', element: pre.querySelector('code'), language: pre.getAttribute(DATA_LANGUAGE) || 'plaintext', highlights: pre.getAttribute(DATA_HIGHLIGHTS) || '', filename: pre.getAttribute(DATA_FILENAME) || '', }); } }); } escapeHtml(input) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const map = { '<': '&lt;', '>': '&gt;', }; return input.replace(/[<>]/g, (tag) => map[tag] || tag); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownHighlighter, deps: [{ token: i0.Injector }, { token: NGE_MARKDOWN_HIGHLIGHTER_SERVICE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownHighlighter }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownHighlighter, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i0.Injector }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NGE_MARKDOWN_HIGHLIGHTER_SERVICE] }] }] }); /** * Injection token to register `NgeMarkdownHighlighter` contribution. */ export const NgeMarkdownHighlighterProvider = { provide: NGE_MARKDOWN_CONTRIBUTION, multi: true, useClass: NgeMarkdownHighlighter, }; /** * Provider to register `NgeMonacoColorizerService` as the syntax highlighter. * @param type A reference to NgeMonacoColorizerService type. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any export function NgeMarkdownHighlighterMonacoProvider(type) { return { provide: NGE_MARKDOWN_HIGHLIGHTER_SERVICE, useValue: { highligtht: (injector, options) => { const colorizer = injector.get(type, null); const code = options.element; const pre = code.parentElement; pre.style.margin = '0.5em 0'; pre.style.overflow = 'auto'; pre.style.border = '1px solid #F2F2F2'; colorizer?.colorizeElement({ element: code, language: options.language, code: code.textContent, lines: options.lines, filename: options.filename, highlights: options.highlights, }); }, }, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdlLW1hcmtkb3duLWhpZ2hsaWdodGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdlL21hcmtkb3duL3NyYy9jb250cmlidXRpb25zL25nZS1tYXJrZG93bi1oaWdobGlnaHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksY0FBYyxFQUFFLFVBQVUsRUFBWSxNQUFNLEVBQUUsUUFBUSxFQUFRLE1BQU0sZUFBZSxDQUFBO0FBRXRHLE9BQU8sRUFBMkIseUJBQXlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTs7QUFFakcsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUE7QUFDekMsTUFBTSxhQUFhLEdBQUcseUJBQXlCLENBQUE7QUFDL0MsTUFBTSxlQUFlLEdBQUcsMkJBQTJCLENBQUE7QUFDbkQsTUFBTSxhQUFhLEdBQUcseUJBQXlCLENBQUE7QUFtRS9DOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsSUFBSSxjQUFjLENBQ2hFLGtDQUFrQyxDQUNuQyxDQUFBO0FBRUQ7O0dBRUc7QUFFSCxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQ21CLFFBQWtCLEVBR2xCLE9BQXNDO1FBSHRDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFHbEIsWUFBTyxHQUFQLE9BQU8sQ0FBK0I7SUFDdEQsQ0FBQztJQUVKLFVBQVUsQ0FBQyxXQUFtQztRQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsV0FBbUM7UUFDMUQsV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDOUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDN0IsSUFBSSxH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QUMzQixHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQTtnQkFDdEMsU0FBUyxFQUFFLGVBQWUsQ0FBQztvQkFDekIsT0FBTyxFQUFFLElBQUk7b0JBQ2IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO29CQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVc7b0JBQ3RCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztvQkFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO29CQUMxQixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7aUJBQy9CLENBQUMsQ0FBQTtZQUNKLENBQUM7U0FDK0I7S0FDbkMsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciwgSW5qZWN0aW9uVG9rZW4sIEluamVjdGFibGUsIFByb3ZpZGVyLCBJbmplY3QsIE9wdGlvbmFsLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IE5nZU1hcmtkb3duVHJhbnNmb3JtZXIgfSBmcm9tICcuLi9uZ2UtbWFya2Rvd24tdHJhbnNmb3JtZXInXG5pbXBvcnQgeyBOZ2VNYXJrZG93bkNvbnRyaWJ1dGlvbiwgTkdFX01BUktET1dOX0NPTlRSSUJVVElPTiB9IGZyb20gJy4uL25nZS1tYXJrZG93bi1jb250cmlidXRpb24nXG5cbmNvbnN0IERBVEFfTElORVMgPSAnZGF0YS1uZ2UtbWQtaGwtbGluZXMnXG5jb25zdCBEQVRBX0xBTkdVQUdFID0gJ2RhdGEtbmdlLW1kLWhsLWxhbmd1YWdlJ1xuY29uc3QgREFUQV9ISUdITElHSFRTID0gJ2RhdGEtbmdlLW1kLWhsLWhpZ2hsaWdodHMnXG5jb25zdCBEQVRBX0ZJTEVOQU1FID0gJ2RhdGEtbmdlLW1kLWhsLWZpbGVuYW1lJ1xuXG4vKipcbiAqIEhpZ2hsaWdodCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5nZU1hcmtkb3duSGlnaGxpZ2h0T3B0aW9ucyB7XG4gIC8qKiAmbHQ7Y29kZSZndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQgdG8gY29sb3JpemUuICovXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50XG5cbiAgLyoqIFRhcmdldCBsYW5ndWFnZSAoZGVmYXVsdCBwbGFpbnRleHQpICovXG4gIGxhbmd1YWdlPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGxpbmUgbnVtYmVyIG9yIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgbGluZSBudW1iZXJzIHRvIHNob3cuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqICpTaG93IGFsbCBsaW5lIG51bWJlcnMgc3RhcnRpbmcgMSpcbiAgICpcbiAgICogYFwiMVwiYFxuICAgKlxuICAgKiAqU2hvdyBhbGwgbGluZSBudW1iZXJzIGZyb20gMSB0byA0KlxuICAgKlxuICAgKiBgXCIxLTRcImBcbiAgICpcbiAgICogKlNob3cgbGluZXMgMiA0IDUgNiA3IDkqXG4gICAqXG4gICAqIGBcIjIgNC03IDlcImBcbiAgICpcbiAgICovXG4gIGxpbmVzPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgbGluZSBudW1iZXJzIHRvIGhpZ2hsaWdodC5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogKkhpZ2hsaWdodCBsaW5lIDEqXG4gICAqXG4gICAqIGBcIjFcImBcbiAgICpcbiAgICogKkhpZ2hsaWdodCBhbGwgbGluZXMgZnJvbSAxIHRvIDQqXG4gICAqXG4gICAqIGBcIjEtNFwiYFxuICAgKlxuICAgKiAqSGlnaGxpZ2h0dyBsaW5lcyAyIDQgNSA2IDcgOSpcbiAgICpcbiAgICogYFwiMiA0LTcgOVwiYFxuICAgKi9cbiAgaGlnaGxpZ2h0cz86IHN0cmluZ1xuXG4gIC8qKiBGaWxlbmFtZSB0byBkaXNwbGF5ICovXG4gIGZpbGVuYW1lPzogc3RyaW5nXG59XG5cbi8qKlxuICogSGlnaGxpZ2h0ZXIgc2VydmljZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZ2VNYXJrZG93bkhpZ2hsaWdodGVyU2VydmljZSB7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiBjYWxsZWQgdG8gaGlnaHRsaWdodCBhbiBIVE1MRWxlbWVudCBjb2RlLlxuICAgKiBAcGFyYW0gaW5qZWN0b3IgSW5qZWN0b3IgcmVmZXJlbmNlIHRvIHVzZSBBbmd1bGFyIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBIaWdobGlnaHQgb3B0aW9ucy5cbiAgICovXG4gIGhpZ2hsaWd0aHQ/KGluamVjdG9yOiBJbmplY3Rvciwgb3B0aW9uczogTmdlTWFya2Rvd25IaWdobGlnaHRPcHRpb25zKTogdm9pZCB8IFByb21pc2U8dm9pZD5cbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gdG8gcmVnaXN0ZXIgYSBoaWdobGlnaHRlciBzZXJ2aWNlLlxuICovXG5leHBvcnQgY29uc3QgTkdFX01BUktET1dOX0hJR0hMSUdIVEVSX1NFUlZJQ0UgPSBuZXcgSW5qZWN0aW9uVG9rZW48TmdlTWFya2Rvd25IaWdobGlnaHRlclNlcnZpY2U+KFxuICAnTkdFX01BUktET1dOX0hJR0hMSUdIVEVSX1NFUlZJQ0UnXG4pXG5cbi8qKlxuICogQ29udHJpYnV0aW9uIHRvIGFkZCBhbiBhYnN0cmFjdCBzeW50YXggaGlnaGxpZ2h0ZXIuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ2VNYXJrZG93bkhpZ2hsaWdodGVyIGltcGxlbWVudHMgTmdlTWFya2Rvd25Db250cmlidXRpb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvcixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoTkdFX01BUktET1dOX0hJR0hMSUdIVEVSX1NFUlZJQ0UpXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBOZ2VNYXJrZG93bkhpZ2hsaWdodGVyU2VydmljZVxuICApIHt9XG5cbiAgY29udHJpYnV0ZSh0cmFuc2Zvcm1lcjogTmdlTWFya2Rvd25UcmFuc2Zvcm1lcikge1xuICAgIHRoaXMuY3JlYXRlQXR0cmlidXRlcyh0cmFuc2Zvcm1lcilcbiAgICB0aGlzLmNvbG9yaXplQ29kZXModHJhbnNmb3JtZXIpXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUF0dHJpYnV0ZXModHJhbnNmb3JtZXI6IE5nZU1hcmtkb3duVHJhbnNmb3JtZXIpIHtcbiAgICB0cmFuc2Zvcm1lci5hZGRSZW5kZXJlclRyYW5zZm9ybWVyKChyZW5kZXJlcikgPT4ge1xuICAgICAgcmVuZGVyZXIuY29kZSA9IChjb2RlLCBhcmdzKSA9PiB7XG4gICAgICAgIGFyZ3MgPSBhcmdzIHx8ICcnXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG5cbiAgICAgICAgLy8gTEFOR1VBR0VcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBhcmdzLnNwbGl0KCcgJykuc2xpY2UoMCwgMSkucG9wKCkgfHwgJ3BsYWludGV4dCdcbiAgICAgICAgYXR0cmlidXRlcy5zZXQoREFUQV9MQU5HVUFHRSwgbGFuZ3VhZ2UpXG5cbiAgICAgICAgLy8gTElORSBOVU1CRVJJTkdcbiAgICAgICAgbGV0IG1hdGNoID0gYXJncy5tYXRjaCgvbGluZXM9XCIoLis/KVwiLylcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5zZXQoREFUQV9MSU5FUywgbWF0Y2hbMV0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBMSU5FIEhJR0hMSUdIVElOR1xuICAgICAgICBtYXRjaCA9IGFyZ3MubWF0Y2goL2hpZ2hsaWdodHM9XCIoLis/KVwiLylcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5zZXQoREFUQV9ISUdITElHSFRTLCBtYXRjaFsxXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZJTEVOQU1FXG4gICAgICAgIG1hdGNoID0gYXJncy5tYXRjaCgvZmlsZW5hbWU9XCIoLis/KVwiLylcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5zZXQoREFUQV9GSUxFTkFNRSwgbWF0Y2hbMV0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdHRyaWJzID0gQXJyYXkuZnJvbShhdHRyaWJ1dGVzLmVudHJpZXMoKSlcbiAgICAgICAgICAubWFwKChbYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWVdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYCR7YXR0cmlidXRlTmFtZX09XCIke2F0dHJpYnV0ZVZhbHVlfVwiYFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpvaW4oJyAnKVxuICAgICAgICAgIGNvbnNvbGUubG9nKGF0dHJpYnMpXG4gICAgICAgIHJldHVybiBgPHByZSAke2F0dHJpYnN9Pjxjb2RlPiR7dGhpcy5lc2NhcGVIdG1sKGNvZGUpfTwvY29kZT48L3ByZT5gXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVuZGVyZXJcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xvcml6ZUNvZGVzKHRyYW5zZm9ybWVyOiBOZ2VNYXJrZG93blRyYW5zZm9ybWVyKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnM/LmhpZ2hsaWd0aHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBoaWdobGlnaHQgPSB0aGlzLm9wdGlvbnMuaGlnaGxpZ3RodFxuICAgIHRyYW5zZm9ybWVyLmFkZEh0bWxUcmFuc2Zvcm1lcihhc3luYyAoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgcHJlRWxlbWVudHMgPSBBcnJheS5mcm9tKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChgcHJlWyR7REFUQV9MQU5HVUFHRX1dYCkpXG4gICAgICBmb3IgKGNvbnN0IHByZSBvZiBwcmVFbGVtZW50cykge1xuICAgICAgICBoaWdobGlnaHQodGhpcy5pbmplY3Rvciwge1xuICAgICAgICAgIGxpbmVzOiBwcmUuZ2V0QXR0cmlidXRlKERBVEFfTElORVMpIHx8ICcnLFxuICAgICAgICAgIGVsZW1lbnQ6IHByZS5xdWVyeVNlbGVjdG9yKCdjb2RlJykgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgbGFuZ3VhZ2U6IHByZS5nZXRBdHRyaWJ1dGUoREFUQV9MQU5HVUFHRSkgfHwgJ3BsYWludGV4dCcsXG4gICAgICAgICAgaGlnaGxpZ2h0czogcHJlLmdldEF0dHJpYnV0ZShEQVRBX0hJR0hMSUdIVFMpIHx8ICcnLFxuICAgICAgICAgIGZpbGVuYW1lOiBwcmUuZ2V0QXR0cmlidXRlKERBVEFfRklMRU5BTUUpIHx8ICcnLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGVzY2FwZUh0bWwoaW5wdXQ6IHN0cmluZykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgbWFwOiBhbnkgPSB7XG4gICAgICAnPCc6ICcmbHQ7JyxcbiAgICAgICc+JzogJyZndDsnLFxuICAgIH1cbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvWzw+XS9nLCAodGFnKSA9PiBtYXBbdGFnXSB8fCB0YWcpXG4gIH1cbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gdG8gcmVnaXN0ZXIgYE5nZU1hcmtkb3duSGlnaGxpZ2h0ZXJgIGNvbnRyaWJ1dGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE5nZU1hcmtkb3duSGlnaGxpZ2h0ZXJQcm92aWRlcjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HRV9NQVJLRE9XTl9DT05UUklCVVRJT04sXG4gIG11bHRpOiB0cnVlLFxuICB1c2VDbGFzczogTmdlTWFya2Rvd25IaWdobGlnaHRlcixcbn1cblxuLyoqXG4gKiBQcm92aWRlciB0byByZWdpc3RlciBgTmdlTW9uYWNvQ29sb3JpemVyU2VydmljZWAgYXMgdGhlIHN5bnRheCBoaWdobGlnaHRlci5cbiAqIEBwYXJhbSB0eXBlIEEgcmVmZXJlbmNlIHRvIE5nZU1vbmFjb0NvbG9yaXplclNlcnZpY2UgdHlwZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBOZ2VNYXJrZG93bkhpZ2hsaWdodGVyTW9uYWNvUHJvdmlkZXIodHlwZTogVHlwZTxhbnk+KSB7XG4gIHJldHVybiB7XG4gICAgcHJvdmlkZTogTkdFX01BUktET1dOX0hJR0hMSUdIVEVSX1NFUlZJQ0UsXG4gICAgdXNlVmFsdWU6IHtcbiAgICAgIGhpZ2hsaWd0aHQ6IChpbmplY3Rvciwgb3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBjb2xvcml6ZXIgPSBpbmplY3Rvci5nZXQodHlwZSwgbnVsbClcbiAgICAgICAgY29uc3QgY29kZSA9IG9wdGlvbnMuZWxlbWVudFxuICAgICAgICBjb25zdCBwcmUgPSBjb2RlLnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgcHJlLnN0eWxlLm1hcmdpbiA9ICcwLjVlbSAwJ1xuICAgICAgICBwcmUuc3R5bGUub3ZlcmZsb3cgPSAnYXV0bydcbiAgICAgICAgcHJlLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI0YyRjJGMidcbiAgICAgICAgY29sb3JpemVyPy5jb2xvcml6ZUVsZW1lbnQoe1xuICAgICAgICAgIGVsZW1lbnQ6IGNvZGUsXG4gICAgICAgICAgbGFuZ3VhZ2U6IG9wdGlvbnMubGFuZ3VhZ2UsXG4gICAgICAgICAgY29kZTogY29kZS50ZXh0Q29udGVudCxcbiAgICAgICAgICBsaW5lczogb3B0aW9ucy5saW5lcyxcbiAgICAgICAgICBmaWxlbmFtZTogb3B0aW9ucy5maWxlbmFtZSxcbiAgICAgICAgICBoaWdobGlnaHRzOiBvcHRpb25zLmhpZ2hsaWdodHMsXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgIH0gYXMgTmdlTWFya2Rvd25IaWdobGlnaHRlclNlcnZpY2UsXG4gIH1cbn1cbiJdfQ==