@farris/build-angular
Version:
Angular Webpack Build Facade
75 lines • 13.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const webpack_1 = require("@ngtools/webpack");
const common_1 = require("./common");
const g = typeof global !== 'undefined' ? global : {};
const webpackLoader = g['_DevKitIsLocal']
? require.resolve('@ngtools/webpack')
: '@ngtools/webpack';
function _createAotPlugin(wco, options, _host, useMain = true, extract = false) {
const { root, buildOptions } = wco;
options.compilerOptions = options.compilerOptions || {};
if (wco.buildOptions.preserveSymlinks) {
options.compilerOptions.preserveSymlinks = true;
}
let i18nInFile = buildOptions.i18nFile
? path.resolve(root, buildOptions.i18nFile)
: undefined;
const i18nFileAndFormat = extract
? {
i18nOutFile: buildOptions.i18nFile,
i18nOutFormat: buildOptions.i18nFormat,
} : {
i18nInFile: i18nInFile,
i18nInFormat: buildOptions.i18nFormat,
};
const additionalLazyModules = {};
if (buildOptions.lazyModules) {
for (const lazyModule of buildOptions.lazyModules) {
additionalLazyModules[lazyModule] = path.resolve(root, lazyModule);
}
}
const hostReplacementPaths = {};
if (buildOptions.fileReplacements) {
for (const replacement of buildOptions.fileReplacements) {
hostReplacementPaths[replacement.replace] = replacement.with;
}
}
const pluginOptions = Object.assign({ mainPath: useMain ? path.join(root, buildOptions.main) : undefined }, i18nFileAndFormat, { locale: buildOptions.i18nLocale, platform: buildOptions.platform === 'server' ? webpack_1.PLATFORM.Server : webpack_1.PLATFORM.Browser, missingTranslation: buildOptions.i18nMissingTranslation, sourceMap: buildOptions.sourceMap, additionalLazyModules,
hostReplacementPaths, nameLazyFiles: buildOptions.namedChunks, forkTypeChecker: buildOptions.forkTypeChecker, contextElementDependencyConstructor: require('webpack/lib/dependencies/ContextElementDependency') }, options);
return new webpack_1.AngularCompilerPlugin(pluginOptions);
}
function getNonAotConfig(wco, host) {
const { tsConfigPath } = wco;
return {
module: { rules: [{ test: /\.tsx?$/, loader: webpackLoader }] },
plugins: [_createAotPlugin(wco, { tsConfigPath, skipCodeGeneration: true }, host)]
};
}
exports.getNonAotConfig = getNonAotConfig;
function getAotConfig(wco, host, extract = false) {
const { tsConfigPath, buildOptions } = wco;
const loaders = [webpackLoader];
if (buildOptions.buildOptimizer) {
loaders.unshift({
loader: common_1.buildOptimizerLoader,
options: { sourceMap: buildOptions.sourceMap }
});
}
const test = /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/;
return {
module: { rules: [{ test, use: loaders }] },
plugins: [_createAotPlugin(wco, { tsConfigPath }, host, true, extract)]
};
}
exports.getAotConfig = getAotConfig;
function getNonAotTestConfig(wco, host) {
const { tsConfigPath } = wco;
return {
module: { rules: [{ test: /\.tsx?$/, loader: webpackLoader }] },
plugins: [_createAotPlugin(wco, { tsConfigPath, skipCodeGeneration: true }, host, false)]
};
}
exports.getNonAotTestConfig = getNonAotTestConfig;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIuLyIsInNvdXJjZXMiOlsicGFja2FnZXMvZmFycmlzX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy9hbmd1bGFyLWNsaS1maWxlcy9tb2RlbHMvd2VicGFjay1jb25maWdzL3R5cGVzY3JpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFXQSw2QkFBNkI7QUFDN0IsOENBSTBCO0FBQzFCLHFDQUFnRDtBQUloRCxNQUFNLENBQUMsR0FBUSxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzNELE1BQU0sYUFBYSxHQUFXLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztJQUNyQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7QUFHdkIsMEJBQ0UsR0FBeUIsRUFDekIsT0FBWSxFQUNaLEtBQTRCLEVBQzVCLE9BQU8sR0FBRyxJQUFJLEVBQ2QsT0FBTyxHQUFHLEtBQUs7SUFFZixNQUFNLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUNuQyxPQUFPLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO0lBRXhELEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFJLFVBQVUsR0FBRyxZQUFZLENBQUMsUUFBUTtRQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUMzQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRWQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPO1FBQy9CLENBQUMsQ0FBQztZQUNBLFdBQVcsRUFBRSxZQUFZLENBQUMsUUFBUTtZQUNsQyxhQUFhLEVBQUUsWUFBWSxDQUFDLFVBQVU7U0FDdkMsQ0FBQyxDQUFDLENBQUM7UUFDRixVQUFVLEVBQUUsVUFBVTtRQUN0QixZQUFZLEVBQUUsWUFBWSxDQUFDLFVBQVU7S0FDdEMsQ0FBQztJQUVKLE1BQU0scUJBQXFCLEdBQWlDLEVBQUUsQ0FBQztJQUMvRCxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM3QixHQUFHLENBQUMsQ0FBQyxNQUFNLFVBQVUsSUFBSSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNsRCxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUM5QyxJQUFJLEVBQ0osVUFBVSxDQUNYLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sb0JBQW9CLEdBQWtDLEVBQUUsQ0FBQztJQUMvRCxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sV0FBVyxJQUFJLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDeEQsb0JBQW9CLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLGFBQWEsbUJBQ2pCLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUMvRCxpQkFBaUIsSUFDcEIsTUFBTSxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQy9CLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsa0JBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFRLENBQUMsT0FBTyxFQUNqRixrQkFBa0IsRUFBRSxZQUFZLENBQUMsc0JBQXNCLEVBQ3ZELFNBQVMsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUNqQyxxQkFBcUI7UUFDckIsb0JBQW9CLEVBQ3BCLGFBQWEsRUFBRSxZQUFZLENBQUMsV0FBVyxFQUN2QyxlQUFlLEVBQUUsWUFBWSxDQUFDLGVBQWUsRUFDN0MsbUNBQW1DLEVBQUUsT0FBTyxDQUFDLG1EQUFtRCxDQUFDLElBQzlGLE9BQU8sQ0FDWCxDQUFDO0lBQ0YsTUFBTSxDQUFDLElBQUksK0JBQXFCLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVELHlCQUFnQyxHQUF5QixFQUFFLElBQTJCO0lBQ3BGLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFFN0IsTUFBTSxDQUFDO1FBQ0wsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFO1FBQy9ELE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNuRixDQUFDO0FBQ0osQ0FBQztBQVBELDBDQU9DO0FBRUQsc0JBQ0UsR0FBeUIsRUFDekIsSUFBMkIsRUFDM0IsT0FBTyxHQUFHLEtBQUs7SUFFZixNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUUzQyxNQUFNLE9BQU8sR0FBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDZCxNQUFNLEVBQUUsNkJBQW9CO1lBQzVCLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFO1NBQy9DLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyx5Q0FBeUMsQ0FBQztJQUV2RCxNQUFNLENBQUM7UUFDTCxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtRQUMzQyxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3hFLENBQUM7QUFDSixDQUFDO0FBckJELG9DQXFCQztBQUVELDZCQUFvQyxHQUF5QixFQUFFLElBQTJCO0lBQ3hGLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFFN0IsTUFBTSxDQUFDO1FBQ0wsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFO1FBQy9ELE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDMUYsQ0FBQztBQUNKLENBQUM7QUFQRCxrREFPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlXG4vLyBUT0RPOiBjbGVhbnVwIHRoaXMgZmlsZSwgaXQncyBjb3BpZWQgYXMgaXMgZnJvbSBBbmd1bGFyIENMSS5cbmltcG9ydCB7IHZpcnR1YWxGcyB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9jb3JlJztcbmltcG9ydCB7IFN0YXRzIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEFuZ3VsYXJDb21waWxlclBsdWdpbixcbiAgQW5ndWxhckNvbXBpbGVyUGx1Z2luT3B0aW9ucyxcbiAgUExBVEZPUk1cbn0gZnJvbSAnQG5ndG9vbHMvd2VicGFjayc7XG5pbXBvcnQgeyBidWlsZE9wdGltaXplckxvYWRlciB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IFdlYnBhY2tDb25maWdPcHRpb25zIH0gZnJvbSAnLi4vYnVpbGQtb3B0aW9ucyc7XG5cblxuY29uc3QgZzogYW55ID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB7fTtcbmNvbnN0IHdlYnBhY2tMb2FkZXI6IHN0cmluZyA9IGdbJ19EZXZLaXRJc0xvY2FsJ11cbiAgPyByZXF1aXJlLnJlc29sdmUoJ0BuZ3Rvb2xzL3dlYnBhY2snKVxuICA6ICdAbmd0b29scy93ZWJwYWNrJztcblxuXG5mdW5jdGlvbiBfY3JlYXRlQW90UGx1Z2luKFxuICB3Y286IFdlYnBhY2tDb25maWdPcHRpb25zLFxuICBvcHRpb25zOiBhbnksXG4gIF9ob3N0OiB2aXJ0dWFsRnMuSG9zdDxTdGF0cz4sXG4gIHVzZU1haW4gPSB0cnVlLFxuICBleHRyYWN0ID0gZmFsc2UsXG4pIHtcbiAgY29uc3QgeyByb290LCBidWlsZE9wdGlvbnMgfSA9IHdjbztcbiAgb3B0aW9ucy5jb21waWxlck9wdGlvbnMgPSBvcHRpb25zLmNvbXBpbGVyT3B0aW9ucyB8fCB7fTtcblxuICBpZiAod2NvLmJ1aWxkT3B0aW9ucy5wcmVzZXJ2ZVN5bWxpbmtzKSB7XG4gICAgb3B0aW9ucy5jb21waWxlck9wdGlvbnMucHJlc2VydmVTeW1saW5rcyA9IHRydWU7XG4gIH1cblxuICBsZXQgaTE4bkluRmlsZSA9IGJ1aWxkT3B0aW9ucy5pMThuRmlsZVxuICAgID8gcGF0aC5yZXNvbHZlKHJvb3QsIGJ1aWxkT3B0aW9ucy5pMThuRmlsZSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBpMThuRmlsZUFuZEZvcm1hdCA9IGV4dHJhY3RcbiAgICA/IHtcbiAgICAgIGkxOG5PdXRGaWxlOiBidWlsZE9wdGlvbnMuaTE4bkZpbGUsXG4gICAgICBpMThuT3V0Rm9ybWF0OiBidWlsZE9wdGlvbnMuaTE4bkZvcm1hdCxcbiAgICB9IDoge1xuICAgICAgaTE4bkluRmlsZTogaTE4bkluRmlsZSxcbiAgICAgIGkxOG5JbkZvcm1hdDogYnVpbGRPcHRpb25zLmkxOG5Gb3JtYXQsXG4gICAgfTtcblxuICBjb25zdCBhZGRpdGlvbmFsTGF6eU1vZHVsZXM6IHsgW21vZHVsZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgaWYgKGJ1aWxkT3B0aW9ucy5sYXp5TW9kdWxlcykge1xuICAgIGZvciAoY29uc3QgbGF6eU1vZHVsZSBvZiBidWlsZE9wdGlvbnMubGF6eU1vZHVsZXMpIHtcbiAgICAgIGFkZGl0aW9uYWxMYXp5TW9kdWxlc1tsYXp5TW9kdWxlXSA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgcm9vdCxcbiAgICAgICAgbGF6eU1vZHVsZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaG9zdFJlcGxhY2VtZW50UGF0aHM6IHsgW3JlcGxhY2U6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gIGlmIChidWlsZE9wdGlvbnMuZmlsZVJlcGxhY2VtZW50cykge1xuICAgIGZvciAoY29uc3QgcmVwbGFjZW1lbnQgb2YgYnVpbGRPcHRpb25zLmZpbGVSZXBsYWNlbWVudHMpIHtcbiAgICAgIGhvc3RSZXBsYWNlbWVudFBhdGhzW3JlcGxhY2VtZW50LnJlcGxhY2VdID0gcmVwbGFjZW1lbnQud2l0aDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwbHVnaW5PcHRpb25zOiBBbmd1bGFyQ29tcGlsZXJQbHVnaW5PcHRpb25zID0ge1xuICAgIG1haW5QYXRoOiB1c2VNYWluID8gcGF0aC5qb2luKHJvb3QsIGJ1aWxkT3B0aW9ucy5tYWluKSA6IHVuZGVmaW5lZCxcbiAgICAuLi5pMThuRmlsZUFuZEZvcm1hdCxcbiAgICBsb2NhbGU6IGJ1aWxkT3B0aW9ucy5pMThuTG9jYWxlLFxuICAgIHBsYXRmb3JtOiBidWlsZE9wdGlvbnMucGxhdGZvcm0gPT09ICdzZXJ2ZXInID8gUExBVEZPUk0uU2VydmVyIDogUExBVEZPUk0uQnJvd3NlcixcbiAgICBtaXNzaW5nVHJhbnNsYXRpb246IGJ1aWxkT3B0aW9ucy5pMThuTWlzc2luZ1RyYW5zbGF0aW9uLFxuICAgIHNvdXJjZU1hcDogYnVpbGRPcHRpb25zLnNvdXJjZU1hcCxcbiAgICBhZGRpdGlvbmFsTGF6eU1vZHVsZXMsXG4gICAgaG9zdFJlcGxhY2VtZW50UGF0aHMsXG4gICAgbmFtZUxhenlGaWxlczogYnVpbGRPcHRpb25zLm5hbWVkQ2h1bmtzLFxuICAgIGZvcmtUeXBlQ2hlY2tlcjogYnVpbGRPcHRpb25zLmZvcmtUeXBlQ2hlY2tlcixcbiAgICBjb250ZXh0RWxlbWVudERlcGVuZGVuY3lDb25zdHJ1Y3RvcjogcmVxdWlyZSgnd2VicGFjay9saWIvZGVwZW5kZW5jaWVzL0NvbnRleHRFbGVtZW50RGVwZW5kZW5jeScpLFxuICAgIC4uLm9wdGlvbnMsXG4gIH07XG4gIHJldHVybiBuZXcgQW5ndWxhckNvbXBpbGVyUGx1Z2luKHBsdWdpbk9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9uQW90Q29uZmlnKHdjbzogV2VicGFja0NvbmZpZ09wdGlvbnMsIGhvc3Q6IHZpcnR1YWxGcy5Ib3N0PFN0YXRzPikge1xuICBjb25zdCB7IHRzQ29uZmlnUGF0aCB9ID0gd2NvO1xuXG4gIHJldHVybiB7XG4gICAgbW9kdWxlOiB7IHJ1bGVzOiBbeyB0ZXN0OiAvXFwudHN4PyQvLCBsb2FkZXI6IHdlYnBhY2tMb2FkZXIgfV0gfSxcbiAgICBwbHVnaW5zOiBbX2NyZWF0ZUFvdFBsdWdpbih3Y28sIHsgdHNDb25maWdQYXRoLCBza2lwQ29kZUdlbmVyYXRpb246IHRydWUgfSwgaG9zdCldXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBb3RDb25maWcoXG4gIHdjbzogV2VicGFja0NvbmZpZ09wdGlvbnMsXG4gIGhvc3Q6IHZpcnR1YWxGcy5Ib3N0PFN0YXRzPixcbiAgZXh0cmFjdCA9IGZhbHNlXG4pIHtcbiAgY29uc3QgeyB0c0NvbmZpZ1BhdGgsIGJ1aWxkT3B0aW9ucyB9ID0gd2NvO1xuXG4gIGNvbnN0IGxvYWRlcnM6IGFueVtdID0gW3dlYnBhY2tMb2FkZXJdO1xuICBpZiAoYnVpbGRPcHRpb25zLmJ1aWxkT3B0aW1pemVyKSB7XG4gICAgbG9hZGVycy51bnNoaWZ0KHtcbiAgICAgIGxvYWRlcjogYnVpbGRPcHRpbWl6ZXJMb2FkZXIsXG4gICAgICBvcHRpb25zOiB7IHNvdXJjZU1hcDogYnVpbGRPcHRpb25zLnNvdXJjZU1hcCB9XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCB0ZXN0ID0gLyg/OlxcLm5nZmFjdG9yeVxcLmpzfFxcLm5nc3R5bGVcXC5qc3xcXC50cykkLztcblxuICByZXR1cm4ge1xuICAgIG1vZHVsZTogeyBydWxlczogW3sgdGVzdCwgdXNlOiBsb2FkZXJzIH1dIH0sXG4gICAgcGx1Z2luczogW19jcmVhdGVBb3RQbHVnaW4od2NvLCB7IHRzQ29uZmlnUGF0aCB9LCBob3N0LCB0cnVlLCBleHRyYWN0KV1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5vbkFvdFRlc3RDb25maWcod2NvOiBXZWJwYWNrQ29uZmlnT3B0aW9ucywgaG9zdDogdmlydHVhbEZzLkhvc3Q8U3RhdHM+KSB7XG4gIGNvbnN0IHsgdHNDb25maWdQYXRoIH0gPSB3Y287XG5cbiAgcmV0dXJuIHtcbiAgICBtb2R1bGU6IHsgcnVsZXM6IFt7IHRlc3Q6IC9cXC50c3g/JC8sIGxvYWRlcjogd2VicGFja0xvYWRlciB9XSB9LFxuICAgIHBsdWdpbnM6IFtfY3JlYXRlQW90UGx1Z2luKHdjbywgeyB0c0NvbmZpZ1BhdGgsIHNraXBDb2RlR2VuZXJhdGlvbjogdHJ1ZSB9LCBob3N0LCBmYWxzZSldXG4gIH07XG59XG4iXX0=