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.
150 lines • 21.9 kB
JavaScript
import { AnnotationMode } from './editor-annotations';
const _isIE11 = typeof window === 'undefined' ? false : !!globalThis.MSInputMethodContext && !!document.documentMode;
const isEdge = typeof navigator === 'undefined' || /Edge\/\d./i.test(navigator.userAgent);
const needsES5 = typeof ReadableStream === 'undefined' || typeof Promise['allSettled'] === 'undefined';
export const pdfjsVersion = '5.3.732';
export const pdfjsBleedingEdgeVersion = '5.3.732';
export function getVersionSuffix(folder) {
if (folder?.includes('bleeding-edge')) {
return pdfjsBleedingEdgeVersion;
}
return pdfjsVersion;
}
export function assetsUrl(url, postfixIfPathIsRelativ = '') {
if (url.includes('://')) {
// the assets folder is on an absolute path (like https://example.com/assets)
return url;
}
return `./${url + postfixIfPathIsRelativ}`;
}
export function isBleedingEdge() {
return pdfDefaultOptions.assetsFolder?.includes('bleeding-edge');
}
function isTestEnvironment() {
return (typeof process !== 'undefined' &&
typeof process.env !== 'undefined' &&
(process.env.NODE_ENV === 'test' || process.env.JEST_WORKER_ID !== undefined || process.env.VITEST !== undefined));
}
export function getSafeCanvasSize() {
if (typeof window === 'undefined' || typeof document === 'undefined' || isTestEnvironment()) {
return 4096;
}
// Create a temporary WebGL context
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
let maxTextureSize;
if (gl instanceof WebGLRenderingContext) {
maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
}
else {
maxTextureSize = 4096;
}
// Get available device RAM (in MB)
function getAvailableMemoryMB() {
if ('deviceMemory' in navigator) {
return navigator.deviceMemory * 1024; // Convert GB to MB
}
if (window.performance && 'memory' in window.performance) {
return window.performance.memory.jsHeapSizeLimit / 1024 / 1024; // Only works on Chrome, Firefox, and Edgewindow.performance.memory.jsHeapSizeLimit / 1024 / 1024; // Only works on Chrome
}
return 4096; // Default to 4GB if unknown
}
const availableMemoryMB = getAvailableMemoryMB();
// Conservative formula: Scale by square root of available memory
let estimatedSafeSize = Math.floor(Math.sqrt((availableMemoryMB * 1024 * 1024) / 6));
// Apply platform-specific limits
const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window);
const isMobile = /Android|iPhone|iPad|iPod/.test(navigator.userAgent);
const isHighEndDesktop = availableMemoryMB > 12000; // Assume high-end desktops have >12GB RAM
if (isIOS) {
estimatedSafeSize = Math.min(estimatedSafeSize, 4096); // iOS Safari memory limits
}
else if (isMobile) {
estimatedSafeSize = Math.min(estimatedSafeSize, 4096); // Most mobile devices
}
else if (isHighEndDesktop) {
estimatedSafeSize = Math.min(estimatedSafeSize, 8192); // Allow larger sizes for desktops
}
else {
estimatedSafeSize = Math.min(estimatedSafeSize, 6000); // Mid-range desktops
}
// Final limit based on GPU and estimated memory safety
const maxWidth = Math.min(maxTextureSize, estimatedSafeSize);
return maxWidth * maxWidth;
}
// sonar ignore next line
export const pdfDefaultOptions = {
needsES5: _isIE11 || isEdge || needsES5,
annotationEditorMode: 0,
annotationMode: AnnotationMode.ENABLE_FORMS,
defaultZoomDelay: 400,
cursorToolOnLoad: 0,
defaultUrl: '',
defaultZoomValue: '',
disableHistory: false,
disablePageLabels: false,
enablePermissions: false,
docBaseUrl: '',
enablePrintAutoRotate: true,
enableSignatureEditor: false,
externalLinkRel: 'noopener noreferrer nofollow',
externalLinkTarget: 0,
findController: undefined,
historyUpdateUrl: false,
ignoreDestinationZoom: false,
imageResourcesPath: './images/',
maxCanvasPixels: getSafeCanvasSize(),
forcePageColors: false,
pageColorsBackground: 'Canvas',
pageColorsForeground: 'CanvasText',
pdfBugEnabled: false,
printResolution: 150,
rangeChunkSize: 65536,
removePageBorders: false,
enableXfa: true,
fontExtraProperties: false,
sidebarViewOnLoad: -1,
scrollModeOnLoad: -1,
spreadModeOnLoad: -1,
textLayerMode: 1,
// viewerCssTheme: 0, // not supported by ngx-extended-pdf-viewer, use [theme] instead
viewOnLoad: 0,
cMapPacked: true,
cMapUrl: function () {
return `${assetsUrl(pdfDefaultOptions.assetsFolder, '/..')}/cmaps/`;
},
disableAutoFetch: false,
disableFontFace: false,
disableRange: false,
disableStream: true,
isEvalSupported: true,
isOffscreenCanvasSupported: true,
maxImageSize: -1,
pdfBug: false,
verbosity: 1,
workerPort: null,
assetsFolder: 'assets',
_internalFilenameSuffix: '.min',
sandboxBundleSrc: function () {
return pdfDefaultOptions.needsES5
? `./pdf.sandbox-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}-es5.mjs`
: `./pdf.sandbox-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}${pdfDefaultOptions._internalFilenameSuffix}.mjs`;
},
workerSrc: function () {
return pdfDefaultOptions.needsES5
? `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.worker-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}-es5.mjs`
: `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.worker-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}${pdfDefaultOptions._internalFilenameSuffix}.mjs`;
},
standardFontDataUrl: () => `${assetsUrl(pdfDefaultOptions.assetsFolder, '/..')}/standard_fonts/`,
// options specific to ngx-extended-pdf-viewer (as opposed to being used by pdf.js)
doubleTapZoomFactor: 'page-width',
doubleTapZoomsInHandMode: true,
doubleTapZoomsInTextSelectionMode: false,
doubleTapResetsZoomOnSecondDoubleTap: false,
enableScripting: true,
defaultCacheSize: 50,
passwordPrompt: undefined,
enableHWA: true,
positionPopupDialogsWithJavaScript: true,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRlZmF1bHQtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvb3B0aW9ucy9wZGYtZGVmYXVsdC1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxNQUFNLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFPLFVBQVcsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQU8sUUFBUyxDQUFDLFlBQVksQ0FBQztBQUNuSSxNQUFNLE1BQU0sR0FBRyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUYsTUFBTSxRQUFRLEdBQUcsT0FBTyxjQUFjLEtBQUssV0FBVyxJQUFJLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLFdBQVcsQ0FBQztBQUV2RyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLFNBQVMsQ0FBQztBQUNsRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBYztJQUM3QyxJQUFJLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDckMsT0FBTyx3QkFBd0IsQ0FBQztLQUNqQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVcsRUFBRSxzQkFBc0IsR0FBRyxFQUFFO0lBQ2hFLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2Qiw2RUFBNkU7UUFDN0UsT0FBTyxHQUFHLENBQUM7S0FD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QUMvQixDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGVBQWUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLFVBQVU7WUFDbEksQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxlQUFlLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUNwSCxpQkFBaUIsQ0FBQyx1QkFDcEIsTUFBTSxDQUFDO0lBQ2IsQ0FBQztJQUNELG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsa0JBQWtCO0lBRWhHLG1GQUFtRjtJQUNuRixtQkFBbUIsRUFBRSxZQUFZO0lBQ2pDLHdCQUF3QixFQUFFLElBQUk7SUFDOUIsaUNBQWlDLEVBQUUsS0FBSztJQUN4QyxvQ0FBb0MsRUFBRSxLQUFLO0lBQzNDLGVBQWUsRUFBRSxJQUFJO0lBQ3JCLGdCQUFnQixFQUFFLEVBQUU7SUFDcEIsY0FBYyxFQUFFLFNBQVM7SUFDekIsU0FBUyxFQUFFLElBQUk7SUFDZixrQ0FBa0MsRUFBRSxJQUFJO0NBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9uTW9kZSB9IGZyb20gJy4vZWRpdG9yLWFubm90YXRpb25zJztcblxuY29uc3QgX2lzSUUxMSA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gZmFsc2UgOiAhISg8YW55Pmdsb2JhbFRoaXMpLk1TSW5wdXRNZXRob2RDb250ZXh0ICYmICEhKDxhbnk+ZG9jdW1lbnQpLmRvY3VtZW50TW9kZTtcbmNvbnN0IGlzRWRnZSA9IHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnIHx8IC9FZGdlXFwvXFxkLi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5jb25zdCBuZWVkc0VTNSA9IHR5cGVvZiBSZWFkYWJsZVN0cmVhbSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIFByb21pc2VbJ2FsbFNldHRsZWQnXSA9PT0gJ3VuZGVmaW5lZCc7XG5cbmV4cG9ydCBjb25zdCBwZGZqc1ZlcnNpb24gPSAnNS4zLjczMic7XG5leHBvcnQgY29uc3QgcGRmanNCbGVlZGluZ0VkZ2VWZXJzaW9uID0gJzUuMy43MzInO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25TdWZmaXgoZm9sZGVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoZm9sZGVyPy5pbmNsdWRlcygnYmxlZWRpbmctZWRnZScpKSB7XG4gICAgcmV0dXJuIHBkZmpzQmxlZWRpbmdFZGdlVmVyc2lvbjtcbiAgfVxuICByZXR1cm4gcGRmanNWZXJzaW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXRzVXJsKHVybDogc3RyaW5nLCBwb3N0Zml4SWZQYXRoSXNSZWxhdGl2ID0gJycpOiBzdHJpbmcge1xuICBpZiAodXJsLmluY2x1ZGVzKCc6Ly8nKSkge1xuICAgIC8vIHRoZSBhc3NldHMgZm9sZGVyIGlzIG9uIGFuIGFic29sdXRlIHBhdGggKGxpa2UgaHR0cHM6Ly9leGFtcGxlLmNvbS9hc3NldHMpXG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICByZXR1cm4gYC4vJHt1cmwgKyBwb3N0Zml4SWZQYXRoSXNSZWxhdGl2fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JsZWVkaW5nRWRnZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcj8uaW5jbHVkZXMoJ2JsZWVkaW5nLWVkZ2UnKTtcbn1cblxuZGVjbGFyZSBjb25zdCBwcm9jZXNzOiBhbnk7XG5cbmZ1bmN0aW9uIGlzVGVzdEVudmlyb25tZW50KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiAocHJvY2VzcyBhcyBhbnkpLmVudiAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAoKHByb2Nlc3MgYXMgYW55KS5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JyB8fCAocHJvY2VzcyBhcyBhbnkpLmVudi5KRVNUX1dPUktFUl9JRCAhPT0gdW5kZWZpbmVkIHx8IChwcm9jZXNzIGFzIGFueSkuZW52LlZJVEVTVCAhPT0gdW5kZWZpbmVkKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FmZUNhbnZhc1NpemUoKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgaXNUZXN0RW52aXJvbm1lbnQoKSkge1xuICAgIHJldHVybiA0MDk2O1xuICB9XG4gIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBXZWJHTCBjb250ZXh0XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKTtcbiAgbGV0IG1heFRleHR1cmVTaXplO1xuICBpZiAoZ2wgaW5zdGFuY2VvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICBtYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9TSVpFKTtcbiAgfSBlbHNlIHtcbiAgICBtYXhUZXh0dXJlU2l6ZSA9IDQwOTY7XG4gIH1cbiAgLy8gR2V0IGF2YWlsYWJsZSBkZXZpY2UgUkFNIChpbiBNQilcbiAgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlTWVtb3J5TUIoKTogbnVtYmVyIHtcbiAgICBpZiAoJ2RldmljZU1lbW9yeScgaW4gbmF2aWdhdG9yKSB7XG4gICAgICByZXR1cm4gKG5hdmlnYXRvci5kZXZpY2VNZW1vcnkgYXMgbnVtYmVyKSAqIDEwMjQ7IC8vIENvbnZlcnQgR0IgdG8gTUJcbiAgICB9XG4gICAgaWYgKHdpbmRvdy5wZXJmb3JtYW5jZSAmJiAnbWVtb3J5JyBpbiB3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICAgIHJldHVybiAod2luZG93LnBlcmZvcm1hbmNlLm1lbW9yeSBhcyBhbnkpLmpzSGVhcFNpemVMaW1pdCAvIDEwMjQgLyAxMDI0OyAvLyBPbmx5IHdvcmtzIG9uIENocm9tZSwgRmlyZWZveCwgYW5kIEVkZ2V3aW5kb3cucGVyZm9ybWFuY2UubWVtb3J5LmpzSGVhcFNpemVMaW1pdCAvIDEwMjQgLyAxMDI0OyAvLyBPbmx5IHdvcmtzIG9uIENocm9tZVxuICAgIH1cbiAgICByZXR1cm4gNDA5NjsgLy8gRGVmYXVsdCB0byA0R0IgaWYgdW5rbm93blxuICB9XG5cbiAgY29uc3QgYXZhaWxhYmxlTWVtb3J5TUIgPSBnZXRBdmFpbGFibGVNZW1vcnlNQigpO1xuXG4gIC8vIENvbnNlcnZhdGl2ZSBmb3JtdWxhOiBTY2FsZSBieSBzcXVhcmUgcm9vdCBvZiBhdmFpbGFibGUgbWVtb3J5XG4gIGxldCBlc3RpbWF0ZWRTYWZlU2l6ZSA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KChhdmFpbGFibGVNZW1vcnlNQiAqIDEwMjQgKiAxMDI0KSAvIDYpKTtcblxuICAvLyBBcHBseSBwbGF0Zm9ybS1zcGVjaWZpYyBsaW1pdHNcbiAgY29uc3QgaXNJT1MgPSAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhKCdNU1N0cmVhbScgaW4gd2luZG93KTtcbiAgY29uc3QgaXNNb2JpbGUgPSAvQW5kcm9pZHxpUGhvbmV8aVBhZHxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICBjb25zdCBpc0hpZ2hFbmREZXNrdG9wID0gYXZhaWxhYmxlTWVtb3J5TUIgPiAxMjAwMDsgLy8gQXNzdW1lIGhpZ2gtZW5kIGRlc2t0b3BzIGhhdmUgPjEyR0IgUkFNXG5cbiAgaWYgKGlzSU9TKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgNDA5Nik7IC8vIGlPUyBTYWZhcmkgbWVtb3J5IGxpbWl0c1xuICB9IGVsc2UgaWYgKGlzTW9iaWxlKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgNDA5Nik7IC8vIE1vc3QgbW9iaWxlIGRldmljZXNcbiAgfSBlbHNlIGlmIChpc0hpZ2hFbmREZXNrdG9wKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgODE5Mik7IC8vIEFsbG93IGxhcmdlciBzaXplcyBmb3IgZGVza3RvcHNcbiAgfSBlbHNlIHtcbiAgICBlc3RpbWF0ZWRTYWZlU2l6ZSA9IE1hdGgubWluKGVzdGltYXRlZFNhZmVTaXplLCA2MDAwKTsgLy8gTWlkLXJhbmdlIGRlc2t0b3BzXG4gIH1cblxuICAvLyBGaW5hbCBsaW1pdCBiYXNlZCBvbiBHUFUgYW5kIGVzdGltYXRlZCBtZW1vcnkgc2FmZXR5XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5taW4obWF4VGV4dHVyZVNpemUsIGVzdGltYXRlZFNhZmVTaXplKTtcbiAgcmV0dXJuIG1heFdpZHRoICogbWF4V2lkdGg7XG59XG5cbi8vIHNvbmFyIGlnbm9yZSBuZXh0IGxpbmVcbmV4cG9ydCBjb25zdCBwZGZEZWZhdWx0T3B0aW9ucyA9IHtcbiAgbmVlZHNFUzU6IF9pc0lFMTEgfHwgaXNFZGdlIHx8IG5lZWRzRVM1LFxuICBhbm5vdGF0aW9uRWRpdG9yTW9kZTogMCxcbiAgYW5ub3RhdGlvbk1vZGU6IEFubm90YXRpb25Nb2RlLkVOQUJMRV9GT1JNUyxcbiAgZGVmYXVsdFpvb21EZWxheTogNDAwLCAvLyBtaWxsaXNlY29uZHNcbiAgY3Vyc29yVG9vbE9uTG9hZDogMCxcbiAgZGVmYXVsdFVybDogJycsXG4gIGRlZmF1bHRab29tVmFsdWU6ICcnLFxuICBkaXNhYmxlSGlzdG9yeTogZmFsc2UsXG4gIGRpc2FibGVQYWdlTGFiZWxzOiBmYWxzZSxcbiAgZW5hYmxlUGVybWlzc2lvbnM6IGZhbHNlLFxuICBkb2NCYXNlVXJsOiAnJyxcbiAgZW5hYmxlUHJpbnRBdXRvUm90YXRlOiB0cnVlLFxuICBlbmFibGVTaWduYXR1cmVFZGl0b3I6IGZhbHNlLFxuICBleHRlcm5hbExpbmtSZWw6ICdub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93JyxcbiAgZXh0ZXJuYWxMaW5rVGFyZ2V0OiAwLFxuICBmaW5kQ29udHJvbGxlcjogdW5kZWZpbmVkLCAvLyBtdXN0IGV4dGVuZCBQREZGaW5kQ29udHJvbGxlclxuICBoaXN0b3J5VXBkYXRlVXJsOiBmYWxzZSxcbiAgaWdub3JlRGVzdGluYXRpb25ab29tOiBmYWxzZSxcbiAgaW1hZ2VSZXNvdXJjZXNQYXRoOiAnLi9pbWFnZXMvJyxcbiAgbWF4Q2FudmFzUGl4ZWxzOiBnZXRTYWZlQ2FudmFzU2l6ZSgpLFxuICBmb3JjZVBhZ2VDb2xvcnM6IGZhbHNlLFxuICBwYWdlQ29sb3JzQmFja2dyb3VuZDogJ0NhbnZhcycsXG4gIHBhZ2VDb2xvcnNGb3JlZ3JvdW5kOiAnQ2FudmFzVGV4dCcsXG4gIHBkZkJ1Z0VuYWJsZWQ6IGZhbHNlLFxuICBwcmludFJlc29sdXRpb246IDE1MCxcbiAgcmFuZ2VDaHVua1NpemU6IDY1NTM2LFxuICByZW1vdmVQYWdlQm9yZGVyczogZmFsc2UsXG4gIGVuYWJsZVhmYTogdHJ1ZSxcbiAgZm9udEV4dHJhUHJvcGVydGllczogZmFsc2UsXG4gIHNpZGViYXJWaWV3T25Mb2FkOiAtMSxcbiAgc2Nyb2xsTW9kZU9uTG9hZDogLTEsXG4gIHNwcmVhZE1vZGVPbkxvYWQ6IC0xLFxuICB0ZXh0TGF5ZXJNb2RlOiAxLFxuICAvLyB2aWV3ZXJDc3NUaGVtZTogMCwgLy8gbm90IHN1cHBvcnRlZCBieSBuZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlciwgdXNlIFt0aGVtZV0gaW5zdGVhZFxuICB2aWV3T25Mb2FkOiAwLFxuICBjTWFwUGFja2VkOiB0cnVlLFxuICBjTWFwVXJsOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGAke2Fzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIsICcvLi4nKX0vY21hcHMvYDtcbiAgfSxcbiAgZGlzYWJsZUF1dG9GZXRjaDogZmFsc2UsXG4gIGRpc2FibGVGb250RmFjZTogZmFsc2UsXG4gIGRpc2FibGVSYW5nZTogZmFsc2UsXG4gIGRpc2FibGVTdHJlYW06IHRydWUsXG4gIGlzRXZhbFN1cHBvcnRlZDogdHJ1ZSxcbiAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IHRydWUsXG4gIG1heEltYWdlU2l6ZTogLTEsXG4gIHBkZkJ1ZzogZmFsc2UsXG4gIHZlcmJvc2l0eTogMSxcbiAgd29ya2VyUG9ydDogbnVsbCxcbiAgYXNzZXRzRm9sZGVyOiAnYXNzZXRzJyxcbiAgX2ludGVybmFsRmlsZW5hbWVTdWZmaXg6ICcubWluJywgLy8gZG9uJ3QgbW9kaWZ5IHRoaXMgLSBpdCdzIGFuIGludGVybmFsIGZpZWxkXG4gIHNhbmRib3hCdW5kbGVTcmM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcGRmRGVmYXVsdE9wdGlvbnMubmVlZHNFUzVcbiAgICAgID8gYC4vcGRmLnNhbmRib3gtJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0tZXM1Lm1qc2BcbiAgICAgIDogYC4vcGRmLnNhbmRib3gtJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0ke3BkZkRlZmF1bHRPcHRpb25zLl9pbnRlcm5hbEZpbGVuYW1lU3VmZml4fS5tanNgO1xuICB9LFxuICB3b3JrZXJTcmM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcGRmRGVmYXVsdE9wdGlvbnMubmVlZHNFUzVcbiAgICAgID8gYCR7YXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcil9L3BkZi53b3JrZXItJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0tZXM1Lm1qc2BcbiAgICAgIDogYCR7YXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcil9L3BkZi53b3JrZXItJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0ke1xuICAgICAgICAgIHBkZkRlZmF1bHRPcHRpb25zLl9pbnRlcm5hbEZpbGVuYW1lU3VmZml4XG4gICAgICAgIH0ubWpzYDtcbiAgfSxcbiAgc3RhbmRhcmRGb250RGF0YVVybDogKCkgPT4gYCR7YXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlciwgJy8uLicpfS9zdGFuZGFyZF9mb250cy9gLFxuXG4gIC8vIG9wdGlvbnMgc3BlY2lmaWMgdG8gbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIgKGFzIG9wcG9zZWQgdG8gYmVpbmcgdXNlZCBieSBwZGYuanMpXG4gIGRvdWJsZVRhcFpvb21GYWN0b3I6ICdwYWdlLXdpZHRoJyxcbiAgZG91YmxlVGFwWm9vbXNJbkhhbmRNb2RlOiB0cnVlLFxuICBkb3VibGVUYXBab29tc0luVGV4dFNlbGVjdGlvbk1vZGU6IGZhbHNlLFxuICBkb3VibGVUYXBSZXNldHNab29tT25TZWNvbmREb3VibGVUYXA6IGZhbHNlLFxuICBlbmFibGVTY3JpcHRpbmc6IHRydWUsXG4gIGRlZmF1bHRDYWNoZVNpemU6IDUwLFxuICBwYXNzd29yZFByb21wdDogdW5kZWZpbmVkLFxuICBlbmFibGVIV0E6IHRydWUsIC8vIGVuYWJsZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24uIEFjdGl2ZSBzaW5jZSBwZGYuanMgNC40LlxuICBwb3NpdGlvblBvcHVwRGlhbG9nc1dpdGhKYXZhU2NyaXB0OiB0cnVlLFxufTtcbiJdfQ==