UNPKG

39.5 kBJavaScriptView Raw
1"use strict";
2// tslint:disable:no-unsafe-any
3Object.defineProperty(exports, "__esModule", { value: true });
4const path = require("path");
5const typescript_1 = require("typescript");
6const error_models_1 = require("../error-models");
7const utils_1 = require("../utils");
8const check_path_up_1 = require("./check-path-up");
9const get_ecma_version_from_script_target_1 = require("./get-ecma-version-from-script-target");
10const get_node_resolve_fields_from_script_target_1 = require("./get-node-resolve-fields-from-script-target");
11const load_ts_config_1 = require("./load-ts-config");
12// tslint:disable:max-func-body-length
13function initLibBundleTarget(bundles, currentBundle, i, libConfig) {
14 if (!libConfig._workspaceRoot) {
15 throw new error_models_1.InternalError("The 'libConfig._workspaceRoot' is not set.");
16 }
17 if (!libConfig._projectRoot) {
18 throw new error_models_1.InternalError("The 'libConfig._projectRoot' is not set.");
19 }
20 if (!libConfig._outputPath) {
21 throw new error_models_1.InternalError("The 'libConfig._outputPath' is not set.");
22 }
23 if (!currentBundle.libraryTarget) {
24 throw new error_models_1.InvalidConfigError(`The 'projects[${libConfig.name || libConfig._index}].bundles[${i}].libraryTarget' value is required.`);
25 }
26 const projectRoot = libConfig._projectRoot;
27 const outputPath = libConfig._outputPath;
28 // externals
29 if (currentBundle.externals == null && libConfig.externals) {
30 currentBundle.externals = JSON.parse(JSON.stringify(libConfig.externals));
31 }
32 // nodeModulesAsExternals
33 if (currentBundle.nodeModulesAsExternals == null &&
34 libConfig.nodeModulesAsExternals != null) {
35 currentBundle.nodeModulesAsExternals = libConfig.nodeModulesAsExternals;
36 }
37 // includeDefaultAngularAndRxJsGlobals
38 if (currentBundle.includeDefaultAngularAndRxJsGlobals == null &&
39 libConfig.includeDefaultAngularAndRxJsGlobals != null) {
40 currentBundle.includeDefaultAngularAndRxJsGlobals = libConfig.includeDefaultAngularAndRxJsGlobals;
41 }
42 if (currentBundle.entryRoot && currentBundle.entryRoot === 'prevBundleOutDir') {
43 let foundBundleTarget;
44 if (i > 0) {
45 foundBundleTarget = bundles[i - 1];
46 }
47 if (!foundBundleTarget) {
48 throw new error_models_1.InvalidConfigError(`No previous bundle target found, please correct value in 'projects[${libConfig.name ||
49 libConfig._index}].bundles[${i}].entryRoot'.`);
50 }
51 currentBundle._entryFilePath = foundBundleTarget._outputFilePath;
52 currentBundle._sourceScriptTarget = foundBundleTarget._destScriptTarget;
53 currentBundle._destScriptTarget = foundBundleTarget._destScriptTarget;
54 }
55 else if (currentBundle.entryRoot && currentBundle.entryRoot === 'tsTranspilationOutDir') {
56 if (!libConfig._tsTranspilations || !libConfig._tsTranspilations.length) {
57 throw new error_models_1.InvalidConfigError(`To use 'tsTranspilationOutDir', the 'projects[${libConfig.name || libConfig._index}].tsTranspilations' option is required.`);
58 }
59 let foundTsTranspilation;
60 if (currentBundle.tsTranspilationIndex == null) {
61 foundTsTranspilation = libConfig._tsTranspilations[0];
62 }
63 else {
64 if (currentBundle.tsTranspilationIndex > libConfig._tsTranspilations.length - 1) {
65 throw new error_models_1.InvalidConfigError(`No _tsTranspilations found, please correct value in 'projects[${libConfig.name ||
66 libConfig._index}].bundles[${i}].tsTranspilationIndex'.`);
67 }
68 foundTsTranspilation = libConfig._tsTranspilations[currentBundle.tsTranspilationIndex];
69 }
70 const entryRootDir = foundTsTranspilation._tsOutDirRootResolved;
71 let entryFile = currentBundle.entry;
72 if (!entryFile && foundTsTranspilation._detectedEntryName) {
73 entryFile = `${foundTsTranspilation._detectedEntryName}.js`;
74 }
75 if (!entryFile) {
76 throw new error_models_1.InvalidConfigError(`The 'projects[${libConfig.name || libConfig._index}].bundles[${i}].entry' value is required.`);
77 }
78 currentBundle._entryFilePath = path.resolve(entryRootDir, entryFile);
79 currentBundle._sourceScriptTarget = foundTsTranspilation._scriptTarget;
80 currentBundle._destScriptTarget = foundTsTranspilation._scriptTarget;
81 }
82 else if (currentBundle.entryRoot && currentBundle.entryRoot === 'outputPath') {
83 if (!currentBundle.entry) {
84 throw new error_models_1.InvalidConfigError(`The 'projects[${libConfig.name || libConfig._index}].bundles[${i}].entry' value is required.`);
85 }
86 const entryFilePath = path.resolve(outputPath, currentBundle.entry);
87 currentBundle._entryFilePath = entryFilePath;
88 if (/\.f?esm?2018\.js$/i.test(entryFilePath) ||
89 check_path_up_1.checkPathUp(/f?esm?2018$/i, path.dirname(entryFilePath), outputPath)) {
90 currentBundle._sourceScriptTarget = typescript_1.ScriptTarget.ES2018;
91 }
92 else if (/\.f?esm?2017\.js$/i.test(entryFilePath) ||
93 check_path_up_1.checkPathUp(/f?esm?2017$/i, path.dirname(entryFilePath), outputPath)) {
94 currentBundle._sourceScriptTarget = typescript_1.ScriptTarget.ES2017;
95 }
96 else if (/\.f?esm?2016\.js$/i.test(entryFilePath) ||
97 check_path_up_1.checkPathUp(/f?esm?2016$/i, path.dirname(entryFilePath), outputPath)) {
98 currentBundle._sourceScriptTarget = typescript_1.ScriptTarget.ES2016;
99 }
100 else if (/\.f?esm?2015\.js$/i.test(entryFilePath) ||
101 check_path_up_1.checkPathUp(/f?esm?2015$/i, path.dirname(entryFilePath), outputPath)) {
102 currentBundle._sourceScriptTarget = typescript_1.ScriptTarget.ES2015;
103 }
104 else if (/\.f?esm?5\.js$/i.test(entryFilePath) ||
105 check_path_up_1.checkPathUp(/f?esm?5$/i, path.dirname(entryFilePath), outputPath)) {
106 currentBundle._sourceScriptTarget = typescript_1.ScriptTarget.ES5;
107 }
108 currentBundle._destScriptTarget = currentBundle._sourceScriptTarget;
109 }
110 else {
111 if (!currentBundle.entry) {
112 throw new error_models_1.InvalidConfigError(`The 'projects[${libConfig.name || libConfig._index}].bundles[${i}].entry' value is required.`);
113 }
114 currentBundle._entryFilePath = path.resolve(projectRoot, currentBundle.entry);
115 if (/\.ts$/i.test(currentBundle.entry)) {
116 if (currentBundle.tsConfig) {
117 currentBundle._tsConfigPath = path.resolve(projectRoot, currentBundle.tsConfig);
118 }
119 else if (libConfig._tsConfigPath) {
120 currentBundle._tsConfigPath = libConfig._tsConfigPath;
121 currentBundle._tsConfigJson = libConfig._tsConfigJson;
122 currentBundle._tsCompilerConfig = libConfig._tsCompilerConfig;
123 }
124 }
125 }
126 let nodeResolveFields = [];
127 if (currentBundle._tsConfigPath) {
128 load_ts_config_1.loadTsConfig(currentBundle._tsConfigPath, currentBundle, libConfig);
129 if (!currentBundle._tsCompilerConfig) {
130 throw new error_models_1.InternalError("The 'currentBundle._tsCompilerConfig' is not set.");
131 }
132 if (!currentBundle._sourceScriptTarget) {
133 currentBundle._sourceScriptTarget = currentBundle._tsCompilerConfig.options.target;
134 }
135 if (!currentBundle._destScriptTarget) {
136 currentBundle._destScriptTarget = currentBundle._tsCompilerConfig.options.target;
137 }
138 }
139 if (currentBundle._destScriptTarget) {
140 const scriptTarget = currentBundle._destScriptTarget;
141 // ecmaVersion
142 const ecmaVersion = get_ecma_version_from_script_target_1.getEcmaVersionFromScriptTarget(scriptTarget);
143 if (ecmaVersion) {
144 currentBundle._ecmaVersion = ecmaVersion;
145 }
146 // supportES2015
147 currentBundle._supportES2015 = scriptTarget !== typescript_1.ScriptTarget.ES3 &&
148 scriptTarget !== typescript_1.ScriptTarget.ES5;
149 // nodeResolveFields
150 nodeResolveFields = get_node_resolve_fields_from_script_target_1.getnodeResolveFieldsFromScriptTarget(scriptTarget);
151 }
152 // nodeResolveFields
153 const defaultMainFields = ['module', 'main'];
154 nodeResolveFields.push(...defaultMainFields);
155 currentBundle._nodeResolveFields = nodeResolveFields;
156 // outputFilePath
157 let bundleOutFilePath = '';
158 if (currentBundle.outputFilePath) {
159 bundleOutFilePath = currentBundle.outputFilePath;
160 const isDir = /(\\|\/)$/.test(bundleOutFilePath) ||
161 !/\.js$/i.test(bundleOutFilePath);
162 bundleOutFilePath = path.resolve(outputPath, bundleOutFilePath);
163 if (isDir) {
164 if (!libConfig._packageNameWithoutScope) {
165 throw new error_models_1.InternalError("The 'libConfig._packageNameWithoutScope' is not set.");
166 }
167 const outFileName = libConfig._packageNameWithoutScope.replace(/\//gm, '-');
168 bundleOutFilePath = path.resolve(bundleOutFilePath, `${outFileName}.js`);
169 }
170 }
171 else {
172 if (!libConfig._packageNameWithoutScope) {
173 throw new error_models_1.InternalError("The 'libConfig._packageNameWithoutScope' is not set.");
174 }
175 const outFileName = libConfig._packageNameWithoutScope.replace(/\//gm, '-');
176 if (currentBundle.libraryTarget === 'umd' || currentBundle.libraryTarget === 'cjs') {
177 if (bundles.length > 1 || (libConfig._tsTranspilations && libConfig._tsTranspilations.length > 0)) {
178 bundleOutFilePath = path.resolve(outputPath, `bundles/${outFileName}.${currentBundle.libraryTarget}.js`);
179 }
180 else {
181 bundleOutFilePath = path.resolve(outputPath, `${outFileName}.js`);
182 }
183 }
184 else {
185 if (currentBundle._destScriptTarget) {
186 const scriptTargetStr = typescript_1.ScriptTarget[currentBundle._destScriptTarget].replace(/^ES/i, '');
187 const fesmFolderName = `fesm${scriptTargetStr}`;
188 bundleOutFilePath = path.resolve(outputPath, fesmFolderName, `${outFileName}.js`);
189 }
190 else {
191 bundleOutFilePath = path.resolve(outputPath, `bundles/${outFileName}.es.js`);
192 }
193 }
194 }
195 if (currentBundle._entryFilePath && /\[name\]/g.test(bundleOutFilePath)) {
196 bundleOutFilePath = bundleOutFilePath.replace(/\[name\]/g, path.basename(currentBundle._entryFilePath).replace(/\.(js|ts)$/i, ''));
197 }
198 // package entry points
199 if (libConfig._packageJsonOutDir) {
200 libConfig._packageEntryPoints = libConfig._packageEntryPoints || {};
201 const packageEntryPoints = libConfig._packageEntryPoints;
202 const packageJsonOutDir = libConfig._packageJsonOutDir;
203 const scriptTarget = currentBundle._destScriptTarget;
204 if (currentBundle.libraryTarget === 'esm' && scriptTarget === typescript_1.ScriptTarget.ES2015) {
205 packageEntryPoints.fesm2015 = utils_1.normalizeRelativePath(path.relative(packageJsonOutDir, bundleOutFilePath));
206 }
207 else if (currentBundle.libraryTarget === 'esm' && scriptTarget === typescript_1.ScriptTarget.ES5) {
208 packageEntryPoints.fesm5 = utils_1.normalizeRelativePath(path.relative(packageJsonOutDir, bundleOutFilePath));
209 }
210 else if (currentBundle.libraryTarget === 'umd' || currentBundle.libraryTarget === 'cjs') {
211 packageEntryPoints.main = utils_1.normalizeRelativePath(path.relative(packageJsonOutDir, bundleOutFilePath));
212 }
213 }
214 return Object.assign({}, currentBundle, { _index: i, _entryFilePath: currentBundle._entryFilePath, _outputFilePath: bundleOutFilePath });
215}
216exports.initLibBundleTarget = initLibBundleTarget;
217//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC1saWItYnVuZGxlLXRhcmdldC5qcyIsInNvdXJjZVJvb3QiOiJDOi9wcm9qZWN0cy9hbmd1bGFyLWJ1aWxkLyIsInNvdXJjZXMiOlsic3JjL2hlbHBlcnMvaW5pdC1saWItYnVuZGxlLXRhcmdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0JBQStCOztBQUUvQiw2QkFBNkI7QUFFN0IsMkNBQTBDO0FBRTFDLGtEQUFvRTtBQUVwRSxvQ0FBaUQ7QUFFakQsbURBQThDO0FBQzlDLCtGQUF1RjtBQUN2Riw2R0FBb0c7QUFDcEcscURBQWdEO0FBRWhELHNDQUFzQztBQUN0Qyw2QkFBb0MsT0FBbUMsRUFDbkUsYUFBZ0QsRUFDaEQsQ0FBUyxFQUNULFNBQW1DO0lBRW5DLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFO1FBQzNCLE1BQU0sSUFBSSw0QkFBYSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7S0FDekU7SUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRTtRQUN6QixNQUFNLElBQUksNEJBQWEsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0tBQ3ZFO0lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUU7UUFDeEIsTUFBTSxJQUFJLDRCQUFhLENBQUMseUNBQXlDLENBQUMsQ0FBQztLQUN0RTtJQUVELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFO1FBQzlCLE1BQU0sSUFBSSxpQ0FBa0IsQ0FDeEIsaUJBQWlCLFNBQVMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLE1BQU0sYUFBYSxDQUNoRSxxQ0FBcUMsQ0FBQyxDQUFDO0tBQzlDO0lBRUQsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztJQUMzQyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDO0lBRXpDLFlBQVk7SUFDWixJQUFJLGFBQWEsQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUU7UUFD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LEVBQUUsQ0FBQyxFQUNULGNBQWMsRUFBRSxhQUFhLENBQUMsY0FBYyxFQUM1QyxlQUFlLEVBQUUsaUJBQWlCLElBQ3BDO0FBQ04sQ0FBQztBQWpRRCxrREFpUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IFNjcmlwdFRhcmdldCB9IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBJbnZhbGlkQ29uZmlnRXJyb3IgfSBmcm9tICcuLi9lcnJvci1tb2RlbHMnO1xuaW1wb3J0IHsgTGliQnVuZGxlT3B0aW9uc0ludGVybmFsLCBMaWJQcm9qZWN0Q29uZmlnSW50ZXJuYWwsIFRzVHJhbnNwaWxhdGlvbk9wdGlvbnNJbnRlcm5hbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvaW50ZXJuYWxzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aCB9IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHsgY2hlY2tQYXRoVXAgfSBmcm9tICcuL2NoZWNrLXBhdGgtdXAnO1xuaW1wb3J0IHsgZ2V0RWNtYVZlcnNpb25Gcm9tU2NyaXB0VGFyZ2V0IH0gZnJvbSAnLi9nZXQtZWNtYS12ZXJzaW9uLWZyb20tc2NyaXB0LXRhcmdldCc7XG5pbXBvcnQgeyBnZXRub2RlUmVzb2x2ZUZpZWxkc0Zyb21TY3JpcHRUYXJnZXQgfSBmcm9tICcuL2dldC1ub2RlLXJlc29sdmUtZmllbGRzLWZyb20tc2NyaXB0LXRhcmdldCc7XG5pbXBvcnQgeyBsb2FkVHNDb25maWcgfSBmcm9tICcuL2xvYWQtdHMtY29uZmlnJztcblxuLy8gdHNsaW50OmRpc2FibGU6bWF4LWZ1bmMtYm9keS1sZW5ndGhcbmV4cG9ydCBmdW5jdGlvbiBpbml0TGliQnVuZGxlVGFyZ2V0KGJ1bmRsZXM6IExpYkJ1bmRsZU9wdGlvbnNJbnRlcm5hbFtdLFxuICAgIGN1cnJlbnRCdW5kbGU6IFBhcnRpYWw8TGliQnVuZGxlT3B0aW9uc0ludGVybmFsPixcbiAgICBpOiBudW1iZXIsXG4gICAgbGliQ29uZmlnOiBMaWJQcm9qZWN0Q29uZmlnSW50ZXJuYWwpOiBMaWJCdW5kbGVPcHRpb25zSW50ZXJuYWwge1xuXG4gICAgaWYgKCFsaWJDb25maWcuX3dvcmtzcGFjZVJvb3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJUaGUgJ2xpYkNvbmZpZy5fd29ya3NwYWNlUm9vdCcgaXMgbm90IHNldC5cIik7XG4gICAgfVxuXG4gICAgaWYgKCFsaWJDb25maWcuX3Byb2plY3RSb290KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiVGhlICdsaWJDb25maWcuX3Byb2plY3RSb290JyBpcyBub3Qgc2V0LlwiKTtcbiAgICB9XG5cbiAgICBpZiAoIWxpYkNvbmZpZy5fb3V0cHV0UGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlRoZSAnbGliQ29uZmlnLl9vdXRwdXRQYXRoJyBpcyBub3Qgc2V0LlwiKTtcbiAgICB9XG5cbiAgICBpZiAoIWN1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ0Vycm9yKFxuICAgICAgICAgICAgYFRoZSAncHJvamVjdHNbJHtsaWJDb25maWcubmFtZSB8fCBsaWJDb25maWcuX2luZGV4fV0uYnVuZGxlc1ske2lcbiAgICAgICAgICAgIH1dLmxpYnJhcnlUYXJnZXQnIHZhbHVlIGlzIHJlcXVpcmVkLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RSb290ID0gbGliQ29uZmlnLl9wcm9qZWN0Um9vdDtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gbGliQ29uZmlnLl9vdXRwdXRQYXRoO1xuXG4gICAgLy8gZXh0ZXJuYWxzXG4gICAgaWYgKGN1cnJlbnRCdW5kbGUuZXh0ZXJuYWxzID09IG51bGwgJiYgbGliQ29uZmlnLmV4dGVybmFscykge1xuICAgICAgICBjdXJyZW50QnVuZGxlLmV4dGVybmFscyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGliQ29uZmlnLmV4dGVybmFscykpO1xuICAgIH1cblxuICAgIC8vIG5vZGVNb2R1bGVzQXNFeHRlcm5hbHNcbiAgICBpZiAoY3VycmVudEJ1bmRsZS5ub2RlTW9kdWxlc0FzRXh0ZXJuYWxzID09IG51bGwgJiZcbiAgICAgICAgbGliQ29uZmlnLm5vZGVNb2R1bGVzQXNFeHRlcm5hbHMgIT0gbnVsbCkge1xuICAgICAgICBjdXJyZW50QnVuZGxlLm5vZGVNb2R1bGVzQXNFeHRlcm5hbHMgPSBsaWJDb25maWcubm9kZU1vZHVsZXNBc0V4dGVybmFscztcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlRGVmYXVsdEFuZ3VsYXJBbmRSeEpzR2xvYmFsc1xuICAgIGlmIChjdXJyZW50QnVuZGxlLmluY2x1ZGVEZWZhdWx0QW5ndWxhckFuZFJ4SnNHbG9iYWxzID09IG51bGwgJiZcbiAgICAgICAgbGliQ29uZmlnLmluY2x1ZGVEZWZhdWx0QW5ndWxhckFuZFJ4SnNHbG9iYWxzICE9IG51bGwpIHtcbiAgICAgICAgY3VycmVudEJ1bmRsZS5pbmNsdWRlRGVmYXVsdEFuZ3VsYXJBbmRSeEpzR2xvYmFscyA9IGxpYkNvbmZpZy5pbmNsdWRlRGVmYXVsdEFuZ3VsYXJBbmRSeEpzR2xvYmFscztcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEJ1bmRsZS5lbnRyeVJvb3QgJiYgY3VycmVudEJ1bmRsZS5lbnRyeVJvb3QgPT09ICdwcmV2QnVuZGxlT3V0RGlyJykge1xuICAgICAgICBsZXQgZm91bmRCdW5kbGVUYXJnZXQ6IExpYkJ1bmRsZU9wdGlvbnNJbnRlcm5hbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBmb3VuZEJ1bmRsZVRhcmdldCA9IGJ1bmRsZXNbaSAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmRCdW5kbGVUYXJnZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnRXJyb3IoXG4gICAgICAgICAgICAgICAgYE5vIHByZXZpb3VzIGJ1bmRsZSB0YXJnZXQgZm91bmQsIHBsZWFzZSBjb3JyZWN0IHZhbHVlIGluICdwcm9qZWN0c1ske2xpYkNvbmZpZy5uYW1lIHx8XG4gICAgICAgICAgICAgICAgbGliQ29uZmlnLl9pbmRleFxuICAgICAgICAgICAgICAgIH1dLmJ1bmRsZXNbJHtpXG4gICAgICAgICAgICAgICAgfV0uZW50cnlSb290Jy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRCdW5kbGUuX2VudHJ5RmlsZVBhdGggPSBmb3VuZEJ1bmRsZVRhcmdldC5fb3V0cHV0RmlsZVBhdGg7XG4gICAgICAgIGN1cnJlbnRCdW5kbGUuX3NvdXJjZVNjcmlwdFRhcmdldCA9IGZvdW5kQnVuZGxlVGFyZ2V0Ll9kZXN0U2NyaXB0VGFyZ2V0O1xuICAgICAgICBjdXJyZW50QnVuZGxlLl9kZXN0U2NyaXB0VGFyZ2V0ID0gZm91bmRCdW5kbGVUYXJnZXQuX2Rlc3RTY3JpcHRUYXJnZXQ7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50QnVuZGxlLmVudHJ5Um9vdCAmJiBjdXJyZW50QnVuZGxlLmVudHJ5Um9vdCA9PT0gJ3RzVHJhbnNwaWxhdGlvbk91dERpcicpIHtcbiAgICAgICAgaWYgKCFsaWJDb25maWcuX3RzVHJhbnNwaWxhdGlvbnMgfHwgIWxpYkNvbmZpZy5fdHNUcmFuc3BpbGF0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRvIHVzZSAndHNUcmFuc3BpbGF0aW9uT3V0RGlyJywgdGhlICdwcm9qZWN0c1ske2xpYkNvbmZpZy5uYW1lIHx8IGxpYkNvbmZpZy5faW5kZXhcbiAgICAgICAgICAgICAgICB9XS50c1RyYW5zcGlsYXRpb25zJyBvcHRpb24gaXMgcmVxdWlyZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZm91bmRUc1RyYW5zcGlsYXRpb246IFRzVHJhbnNwaWxhdGlvbk9wdGlvbnNJbnRlcm5hbDtcblxuICAgICAgICBpZiAoY3VycmVudEJ1bmRsZS50c1RyYW5zcGlsYXRpb25JbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmb3VuZFRzVHJhbnNwaWxhdGlvbiA9IGxpYkNvbmZpZy5fdHNUcmFuc3BpbGF0aW9uc1swXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50QnVuZGxlLnRzVHJhbnNwaWxhdGlvbkluZGV4ID4gbGliQ29uZmlnLl90c1RyYW5zcGlsYXRpb25zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICBgTm8gX3RzVHJhbnNwaWxhdGlvbnMgZm91bmQsIHBsZWFzZSBjb3JyZWN0IHZhbHVlIGluICdwcm9qZWN0c1ske2xpYkNvbmZpZy5uYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgIGxpYkNvbmZpZy5faW5kZXhcbiAgICAgICAgICAgICAgICAgICAgfV0uYnVuZGxlc1ske2lcbiAgICAgICAgICAgICAgICAgICAgfV0udHNUcmFuc3BpbGF0aW9uSW5kZXgnLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3VuZFRzVHJhbnNwaWxhdGlvbiA9IGxpYkNvbmZpZy5fdHNUcmFuc3BpbGF0aW9uc1tjdXJyZW50QnVuZGxlLnRzVHJhbnNwaWxhdGlvbkluZGV4XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJ5Um9vdERpciA9IGZvdW5kVHNUcmFuc3BpbGF0aW9uLl90c091dERpclJvb3RSZXNvbHZlZDtcbiAgICAgICAgbGV0IGVudHJ5RmlsZSA9IGN1cnJlbnRCdW5kbGUuZW50cnk7XG4gICAgICAgIGlmICghZW50cnlGaWxlICYmIGZvdW5kVHNUcmFuc3BpbGF0aW9uLl9kZXRlY3RlZEVudHJ5TmFtZSkge1xuICAgICAgICAgICAgZW50cnlGaWxlID0gYCR7Zm91bmRUc1RyYW5zcGlsYXRpb24uX2RldGVjdGVkRW50cnlOYW1lfS5qc2A7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnRyeUZpbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRoZSAncHJvamVjdHNbJHtsaWJDb25maWcubmFtZSB8fCBsaWJDb25maWcuX2luZGV4fV0uYnVuZGxlc1ske2l9XS5lbnRyeScgdmFsdWUgaXMgcmVxdWlyZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50QnVuZGxlLl9lbnRyeUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGVudHJ5Um9vdERpciwgZW50cnlGaWxlKTtcblxuICAgICAgICBjdXJyZW50QnVuZGxlLl9zb3VyY2VTY3JpcHRUYXJnZXQgPSBmb3VuZFRzVHJhbnNwaWxhdGlvbi5fc2NyaXB0VGFyZ2V0O1xuICAgICAgICBjdXJyZW50QnVuZGxlLl9kZXN0U2NyaXB0VGFyZ2V0ID0gZm91bmRUc1RyYW5zcGlsYXRpb24uX3NjcmlwdFRhcmdldDtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRCdW5kbGUuZW50cnlSb290ICYmIGN1cnJlbnRCdW5kbGUuZW50cnlSb290ID09PSAnb3V0cHV0UGF0aCcpIHtcbiAgICAgICAgaWYgKCFjdXJyZW50QnVuZGxlLmVudHJ5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ0Vycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgJ3Byb2plY3RzWyR7bGliQ29uZmlnLm5hbWUgfHwgbGliQ29uZmlnLl9pbmRleH1dLmJ1bmRsZXNbJHtpXG4gICAgICAgICAgICAgICAgfV0uZW50cnknIHZhbHVlIGlzIHJlcXVpcmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cnlGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShvdXRwdXRQYXRoLCBjdXJyZW50QnVuZGxlLmVudHJ5KTtcbiAgICAgICAgY3VycmVudEJ1bmRsZS5fZW50cnlGaWxlUGF0aCA9IGVudHJ5RmlsZVBhdGg7XG5cbiAgICAgICAgaWYgKC9cXC5mP2VzbT8yMDE4XFwuanMkL2kudGVzdChlbnRyeUZpbGVQYXRoKSB8fFxuICAgICAgICAgICAgY2hlY2tQYXRoVXAoL2Y/ZXNtPzIwMTgkL2ksIHBhdGguZGlybmFtZShlbnRyeUZpbGVQYXRoKSwgb3V0cHV0UGF0aCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRCdW5kbGUuX3NvdXJjZVNjcmlwdFRhcmdldCA9IFNjcmlwdFRhcmdldC5FUzIwMTg7XG4gICAgICAgIH0gZWxzZSBpZiAoL1xcLmY/ZXNtPzIwMTdcXC5qcyQvaS50ZXN0KGVudHJ5RmlsZVBhdGgpIHx8XG4gICAgICAgICAgICBjaGVja1BhdGhVcCgvZj9lc20/MjAxNyQvaSwgcGF0aC5kaXJuYW1lKGVudHJ5RmlsZVBhdGgpLCBvdXRwdXRQYXRoKSkge1xuICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fc291cmNlU2NyaXB0VGFyZ2V0ID0gU2NyaXB0VGFyZ2V0LkVTMjAxNztcbiAgICAgICAgfSBlbHNlIGlmICgvXFwuZj9lc20/MjAxNlxcLmpzJC9pLnRlc3QoZW50cnlGaWxlUGF0aCkgfHxcbiAgICAgICAgICAgIGNoZWNrUGF0aFVwKC9mP2VzbT8yMDE2JC9pLCBwYXRoLmRpcm5hbWUoZW50cnlGaWxlUGF0aCksIG91dHB1dFBhdGgpKSB7XG4gICAgICAgICAgICBjdXJyZW50QnVuZGxlLl9zb3VyY2VTY3JpcHRUYXJnZXQgPSBTY3JpcHRUYXJnZXQuRVMyMDE2O1xuICAgICAgICB9IGVsc2UgaWYgKC9cXC5mP2VzbT8yMDE1XFwuanMkL2kudGVzdChlbnRyeUZpbGVQYXRoKSB8fFxuICAgICAgICAgICAgY2hlY2tQYXRoVXAoL2Y/ZXNtPzIwMTUkL2ksIHBhdGguZGlybmFtZShlbnRyeUZpbGVQYXRoKSwgb3V0cHV0UGF0aCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRCdW5kbGUuX3NvdXJjZVNjcmlwdFRhcmdldCA9IFNjcmlwdFRhcmdldC5FUzIwMTU7XG4gICAgICAgIH0gZWxzZSBpZiAoL1xcLmY/ZXNtPzVcXC5qcyQvaS50ZXN0KGVudHJ5RmlsZVBhdGgpIHx8XG4gICAgICAgICAgICBjaGVja1BhdGhVcCgvZj9lc20/NSQvaSwgcGF0aC5kaXJuYW1lKGVudHJ5RmlsZVBhdGgpLCBvdXRwdXRQYXRoKSkge1xuICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fc291cmNlU2NyaXB0VGFyZ2V0ID0gU2NyaXB0VGFyZ2V0LkVTNTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRCdW5kbGUuX2Rlc3RTY3JpcHRUYXJnZXQgPSBjdXJyZW50QnVuZGxlLl9zb3VyY2VTY3JpcHRUYXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFjdXJyZW50QnVuZGxlLmVudHJ5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ0Vycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgJ3Byb2plY3RzWyR7bGliQ29uZmlnLm5hbWUgfHwgbGliQ29uZmlnLl9pbmRleH1dLmJ1bmRsZXNbJHtpXG4gICAgICAgICAgICAgICAgfV0uZW50cnknIHZhbHVlIGlzIHJlcXVpcmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudEJ1bmRsZS5fZW50cnlGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0Um9vdCwgY3VycmVudEJ1bmRsZS5lbnRyeSk7XG5cbiAgICAgICAgaWYgKC9cXC50cyQvaS50ZXN0KGN1cnJlbnRCdW5kbGUuZW50cnkpKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEJ1bmRsZS50c0NvbmZpZykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRCdW5kbGUuX3RzQ29uZmlnUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0Um9vdCwgY3VycmVudEJ1bmRsZS50c0NvbmZpZyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpYkNvbmZpZy5fdHNDb25maWdQYXRoKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fdHNDb25maWdQYXRoID0gbGliQ29uZmlnLl90c0NvbmZpZ1BhdGg7XG4gICAgICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fdHNDb25maWdKc29uID0gbGliQ29uZmlnLl90c0NvbmZpZ0pzb247XG4gICAgICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fdHNDb21waWxlckNvbmZpZyA9IGxpYkNvbmZpZy5fdHNDb21waWxlckNvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxldCBub2RlUmVzb2x2ZUZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChjdXJyZW50QnVuZGxlLl90c0NvbmZpZ1BhdGgpIHtcbiAgICAgICAgbG9hZFRzQ29uZmlnKGN1cnJlbnRCdW5kbGUuX3RzQ29uZmlnUGF0aCwgY3VycmVudEJ1bmRsZSwgbGliQ29uZmlnKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRCdW5kbGUuX3RzQ29tcGlsZXJDb25maWcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiVGhlICdjdXJyZW50QnVuZGxlLl90c0NvbXBpbGVyQ29uZmlnJyBpcyBub3Qgc2V0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY3VycmVudEJ1bmRsZS5fc291cmNlU2NyaXB0VGFyZ2V0KSB7XG4gICAgICAgICAgICBjdXJyZW50QnVuZGxlLl9zb3VyY2VTY3JpcHRUYXJnZXQgPSBjdXJyZW50QnVuZGxlLl90c0NvbXBpbGVyQ29uZmlnLm9wdGlvbnMudGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VycmVudEJ1bmRsZS5fZGVzdFNjcmlwdFRhcmdldCkge1xuICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fZGVzdFNjcmlwdFRhcmdldCA9IGN1cnJlbnRCdW5kbGUuX3RzQ29tcGlsZXJDb25maWcub3B0aW9ucy50YXJnZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEJ1bmRsZS5fZGVzdFNjcmlwdFRhcmdldCkge1xuICAgICAgICBjb25zdCBzY3JpcHRUYXJnZXQgPSBjdXJyZW50QnVuZGxlLl9kZXN0U2NyaXB0VGFyZ2V0IGFzIFNjcmlwdFRhcmdldDtcblxuICAgICAgICAvLyBlY21hVmVyc2lvblxuICAgICAgICBjb25zdCBlY21hVmVyc2lvbiA9IGdldEVjbWFWZXJzaW9uRnJvbVNjcmlwdFRhcmdldChzY3JpcHRUYXJnZXQpO1xuICAgICAgICBpZiAoZWNtYVZlcnNpb24pIHtcbiAgICAgICAgICAgIGN1cnJlbnRCdW5kbGUuX2VjbWFWZXJzaW9uID0gZWNtYVZlcnNpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdXBwb3J0RVMyMDE1XG4gICAgICAgIGN1cnJlbnRCdW5kbGUuX3N1cHBvcnRFUzIwMTUgPSBzY3JpcHRUYXJnZXQgIT09IFNjcmlwdFRhcmdldC5FUzMgJiZcbiAgICAgICAgICAgIHNjcmlwdFRhcmdldCAhPT0gU2NyaXB0VGFyZ2V0LkVTNTtcblxuICAgICAgICAvLyBub2RlUmVzb2x2ZUZpZWxkc1xuICAgICAgICBub2RlUmVzb2x2ZUZpZWxkcyA9IGdldG5vZGVSZXNvbHZlRmllbGRzRnJvbVNjcmlwdFRhcmdldChzY3JpcHRUYXJnZXQpO1xuICAgIH1cblxuICAgIC8vIG5vZGVSZXNvbHZlRmllbGRzXG4gICAgY29uc3QgZGVmYXVsdE1haW5GaWVsZHMgPSBbJ21vZHVsZScsICdtYWluJ107XG4gICAgbm9kZVJlc29sdmVGaWVsZHMucHVzaCguLi5kZWZhdWx0TWFpbkZpZWxkcyk7XG4gICAgY3VycmVudEJ1bmRsZS5fbm9kZVJlc29sdmVGaWVsZHMgPSBub2RlUmVzb2x2ZUZpZWxkcztcblxuICAgIC8vIG91dHB1dEZpbGVQYXRoXG4gICAgbGV0IGJ1bmRsZU91dEZpbGVQYXRoID0gJyc7XG4gICAgaWYgKGN1cnJlbnRCdW5kbGUub3V0cHV0RmlsZVBhdGgpIHtcbiAgICAgICAgYnVuZGxlT3V0RmlsZVBhdGggPSBjdXJyZW50QnVuZGxlLm91dHB1dEZpbGVQYXRoO1xuXG4gICAgICAgIGNvbnN0IGlzRGlyID0gLyhcXFxcfFxcLykkLy50ZXN0KGJ1bmRsZU91dEZpbGVQYXRoKSB8fFxuICAgICAgICAgICAgIS9cXC5qcyQvaS50ZXN0KGJ1bmRsZU91dEZpbGVQYXRoKTtcbiAgICAgICAgYnVuZGxlT3V0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUob3V0cHV0UGF0aCwgYnVuZGxlT3V0RmlsZVBhdGgpO1xuXG4gICAgICAgIGlmIChpc0Rpcikge1xuICAgICAgICAgICAgaWYgKCFsaWJDb25maWcuX3BhY2thZ2VOYW1lV2l0aG91dFNjb3BlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJUaGUgJ2xpYkNvbmZpZy5fcGFja2FnZU5hbWVXaXRob3V0U2NvcGUnIGlzIG5vdCBzZXQuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBvdXRGaWxlTmFtZSA9XG4gICAgICAgICAgICAgICAgbGliQ29uZmlnLl9wYWNrYWdlTmFtZVdpdGhvdXRTY29wZS5yZXBsYWNlKC9cXC8vZ20sICctJyk7XG4gICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShidW5kbGVPdXRGaWxlUGF0aCwgYCR7b3V0RmlsZU5hbWV9LmpzYCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWxpYkNvbmZpZy5fcGFja2FnZU5hbWVXaXRob3V0U2NvcGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiVGhlICdsaWJDb25maWcuX3BhY2thZ2VOYW1lV2l0aG91dFNjb3BlJyBpcyBub3Qgc2V0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG91dEZpbGVOYW1lID1cbiAgICAgICAgICAgIGxpYkNvbmZpZy5fcGFja2FnZU5hbWVXaXRob3V0U2NvcGUucmVwbGFjZSgvXFwvL2dtLCAnLScpO1xuXG4gICAgICAgIGlmIChjdXJyZW50QnVuZGxlLmxpYnJhcnlUYXJnZXQgPT09ICd1bWQnIHx8IGN1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldCA9PT0gJ2NqcycpIHtcbiAgICAgICAgICAgIGlmIChidW5kbGVzLmxlbmd0aCA+IDEgfHwgKGxpYkNvbmZpZy5fdHNUcmFuc3BpbGF0aW9ucyAmJiBsaWJDb25maWcuX3RzVHJhbnNwaWxhdGlvbnMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShvdXRwdXRQYXRoLCBgYnVuZGxlcy8ke291dEZpbGVOYW1lfS4ke2N1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldH0uanNgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYnVuZGxlT3V0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUob3V0cHV0UGF0aCwgYCR7b3V0RmlsZU5hbWV9LmpzYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50QnVuZGxlLl9kZXN0U2NyaXB0VGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0VGFyZ2V0U3RyID0gU2NyaXB0VGFyZ2V0W2N1cnJlbnRCdW5kbGUuX2Rlc3RTY3JpcHRUYXJnZXRdLnJlcGxhY2UoL15FUy9pLCAnJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVzbUZvbGRlck5hbWUgPSBgZmVzbSR7c2NyaXB0VGFyZ2V0U3RyfWA7XG4gICAgICAgICAgICAgICAgYnVuZGxlT3V0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUob3V0cHV0UGF0aCwgZmVzbUZvbGRlck5hbWUsIGAke291dEZpbGVOYW1lfS5qc2ApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShvdXRwdXRQYXRoLCBgYnVuZGxlcy8ke291dEZpbGVOYW1lfS5lcy5qc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRCdW5kbGUuX2VudHJ5RmlsZVBhdGggJiYgL1xcW25hbWVcXF0vZy50ZXN0KGJ1bmRsZU91dEZpbGVQYXRoKSkge1xuICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCA9IGJ1bmRsZU91dEZpbGVQYXRoLnJlcGxhY2UoL1xcW25hbWVcXF0vZyxcbiAgICAgICAgICAgIHBhdGguYmFzZW5hbWUoY3VycmVudEJ1bmRsZS5fZW50cnlGaWxlUGF0aCkucmVwbGFjZSgvXFwuKGpzfHRzKSQvaSwgJycpKTtcbiAgICB9XG5cbiAgICAvLyBwYWNrYWdlIGVudHJ5IHBvaW50c1xuICAgIGlmIChsaWJDb25maWcuX3BhY2thZ2VKc29uT3V0RGlyKSB7XG4gICAgICAgIGxpYkNvbmZpZy5fcGFja2FnZUVudHJ5UG9pbnRzID0gbGliQ29uZmlnLl9wYWNrYWdlRW50cnlQb2ludHMgfHwge307XG4gICAgICAgIGNvbnN0IHBhY2thZ2VFbnRyeVBvaW50cyA9IGxpYkNvbmZpZy5fcGFja2FnZUVudHJ5UG9pbnRzO1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbk91dERpciA9IGxpYkNvbmZpZy5fcGFja2FnZUpzb25PdXREaXI7XG4gICAgICAgIGNvbnN0IHNjcmlwdFRhcmdldCA9IGN1cnJlbnRCdW5kbGUuX2Rlc3RTY3JpcHRUYXJnZXQ7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldCA9PT0gJ2VzbScgJiYgc2NyaXB0VGFyZ2V0ID09PSBTY3JpcHRUYXJnZXQuRVMyMDE1KSB7XG4gICAgICAgICAgICBwYWNrYWdlRW50cnlQb2ludHMuZmVzbTIwMTUgPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgocGF0aC5yZWxhdGl2ZShwYWNrYWdlSnNvbk91dERpcixcbiAgICAgICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldCA9PT0gJ2VzbScgJiYgc2NyaXB0VGFyZ2V0ID09PSBTY3JpcHRUYXJnZXQuRVM1KSB7XG4gICAgICAgICAgICBwYWNrYWdlRW50cnlQb2ludHMuZmVzbTUgPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgocGF0aC5yZWxhdGl2ZShwYWNrYWdlSnNvbk91dERpcixcbiAgICAgICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldCA9PT0gJ3VtZCcgfHwgY3VycmVudEJ1bmRsZS5saWJyYXJ5VGFyZ2V0ID09PSAnY2pzJykge1xuICAgICAgICAgICAgcGFja2FnZUVudHJ5UG9pbnRzLm1haW4gPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgocGF0aC5yZWxhdGl2ZShwYWNrYWdlSnNvbk91dERpcixcbiAgICAgICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY3VycmVudEJ1bmRsZSxcbiAgICAgICAgX2luZGV4OiBpLFxuICAgICAgICBfZW50cnlGaWxlUGF0aDogY3VycmVudEJ1bmRsZS5fZW50cnlGaWxlUGF0aCxcbiAgICAgICAgX291dHB1dEZpbGVQYXRoOiBidW5kbGVPdXRGaWxlUGF0aFxuICAgIH07XG59XG4iXX0=
\No newline at end of file