@nlabs/lex 1.49.3 → 1.49.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/eslint.config.mjs
CHANGED
|
@@ -5,16 +5,6 @@ export default [
|
|
|
5
5
|
{
|
|
6
6
|
ignores: ['*.md'],
|
|
7
7
|
rules: {
|
|
8
|
-
'keyword-spacing': ['error', {
|
|
9
|
-
after: true,
|
|
10
|
-
before: true,
|
|
11
|
-
overrides: {
|
|
12
|
-
for: {after: false},
|
|
13
|
-
if: {after: false},
|
|
14
|
-
switch: {after: false},
|
|
15
|
-
while: {after: false}
|
|
16
|
-
}
|
|
17
|
-
}],
|
|
18
8
|
'space-before-blocks': ['error', {
|
|
19
9
|
classes: 'always',
|
|
20
10
|
functions: 'always',
|
|
@@ -71,8 +71,8 @@ ${cliName} Error: ${error.message}`, "error", quiet);
|
|
|
71
71
|
nodir: true,
|
|
72
72
|
nosort: true
|
|
73
73
|
};
|
|
74
|
-
const tsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test).ts*`, globOptions);
|
|
75
|
-
const jsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test).js`, globOptions);
|
|
74
|
+
const tsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test|*.integration).ts*`, globOptions);
|
|
75
|
+
const jsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test|*.integration).js`, globOptions);
|
|
76
76
|
const sourceFiles = [...tsFiles, ...jsFiles];
|
|
77
77
|
const esbuildConfig = LexConfig.config.esbuild || {};
|
|
78
78
|
const isProduction = process.env.NODE_ENV === "production";
|
|
@@ -238,4 +238,4 @@ export {
|
|
|
238
238
|
compile,
|
|
239
239
|
hasFileType
|
|
240
240
|
};
|
|
241
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbXBpbGUvY29tcGlsZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgbHN0YXRTeW5jLCByZWFkZGlyU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCB7ZXh0bmFtZSBhcyBwYXRoRXh0bmFtZSwgam9pbiBhcyBwYXRoSm9pbiwgcmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZX0gZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7TGV4Q29uZmlnLCBnZXRUeXBlU2NyaXB0Q29uZmlnUGF0aH0gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y2hlY2tMaW5rZWRNb2R1bGVzLCBjb3B5Q29uZmlndXJlZEZpbGVzLCBjb3B5RmlsZXMsIGNyZWF0ZVNwaW5uZXIsIGdldEZpbGVzQnlFeHQsIHJlbW92ZUZpbGVzfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtnZXREaXJOYW1lLCByZXNvbHZlQmluYXJ5UGF0aH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGNvbnN0IGhhc0ZpbGVUeXBlID0gKHN0YXJ0UGF0aDogc3RyaW5nLCBleHQ6IHN0cmluZ1tdKTogYm9vbGVhbiA9PiB7XG4gIGlmKCFleGlzdHNTeW5jKHN0YXJ0UGF0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBmaWxlczogc3RyaW5nW10gPSByZWFkZGlyU3luYyhzdGFydFBhdGgpO1xuXG4gIHJldHVybiBmaWxlcy5zb21lKChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBmaWxlbmFtZTogc3RyaW5nID0gcGF0aEpvaW4oc3RhcnRQYXRoLCBmaWxlKTtcbiAgICBjb25zdCBmaWxlRXh0OiBzdHJpbmcgPSBwYXRoRXh0bmFtZShmaWxlbmFtZSk7XG4gICAgY29uc3Qgc3RhdCA9IGxzdGF0U3luYyhmaWxlbmFtZSk7XG5cbiAgICBpZihzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiBoYXNGaWxlVHlwZShmaWxlbmFtZSwgZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXh0LmluY2x1ZGVzKGZpbGVFeHQpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb21waWxlID0gYXN5bmMgKGNtZDogYW55LCBjYWxsYmFjazogYW55ID0gKCkgPT4gKHt9KSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgY29uZmlnLFxuICAgIG91dHB1dFBhdGgsXG4gICAgcXVpZXQsXG4gICAgcmVtb3ZlLFxuICAgIHNvdXJjZVBhdGgsXG4gICAgd2F0Y2hcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IGNvbXBpbGluZy4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIGNvbnN0IHtvdXRwdXRGdWxsUGF0aCwgc291cmNlRnVsbFBhdGgsIHVzZVR5cGVzY3JpcHR9ID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3Qgb3V0cHV0RGlyOiBzdHJpbmcgPSBvdXRwdXRQYXRoIHx8IG91dHB1dEZ1bGxQYXRoO1xuICBjb25zdCBzb3VyY2VEaXI6IHN0cmluZyA9IHNvdXJjZVBhdGggPyBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgLi8ke3NvdXJjZVBhdGh9YCkgOiBzb3VyY2VGdWxsUGF0aCB8fCAnJztcbiAgY29uc3QgZGlyTmFtZSA9IGdldERpck5hbWUoKTtcbiAgY29uc3QgZGlyUGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoZGlyTmFtZSwgJy4uLy4uJyk7XG5cbiAgY2hlY2tMaW5rZWRNb2R1bGVzKCk7XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMob3V0cHV0RGlyKTtcbiAgfVxuXG4gIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICBMZXhDb25maWcuY2hlY2tDb21waWxlVHlwZXNjcmlwdENvbmZpZygpO1xuXG4gICAgY29uc3QgdHlwZXNjcmlwdFBhdGg6IHN0cmluZyA9IHJlc29sdmVCaW5hcnlQYXRoKCd0c2MnLCAndHlwZXNjcmlwdCcpO1xuXG4gICAgaWYoIXR5cGVzY3JpcHRQYXRoKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFR5cGVTY3JpcHQgYmluYXJ5IG5vdCBmb3VuZCBpbiBMZXgncyBub2RlX21vZHVsZXMgb3IgbW9ub3JlcG8gcm9vdGAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGxvZygnUGxlYXNlIHJlaW5zdGFsbCBMZXggb3IgY2hlY2sgeW91ciBpbnN0YWxsYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlc2NyaXB0T3B0aW9uczogc3RyaW5nW10gPSBjb25maWcgP1xuICAgICAgWyctcCcsIGNvbmZpZ10gOlxuICAgICAgWyctcCcsIGdldFR5cGVTY3JpcHRDb25maWdQYXRoKCd0c2NvbmZpZy5idWlsZC5qc29uJyldO1xuXG4gICAgc3Bpbm5lci5zdGFydCgnU3RhdGljIHR5cGUgY2hlY2tpbmcgd2l0aCBUeXBlc2NyaXB0Li4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlY2EodHlwZXNjcmlwdFBhdGgsIHR5cGVzY3JpcHRPcHRpb25zLCB7ZW5jb2Rpbmc6ICd1dGY4J30pO1xuXG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdHlwZSBjaGVja2luZyEnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgICBzcGlubmVyLmZhaWwoJ1R5cGUgY2hlY2tpbmcgZmFpbGVkLicpO1xuXG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGdsb2JPcHRpb25zID0ge1xuICAgIGN3ZDogc291cmNlRGlyLFxuICAgIGRvdDogZmFsc2UsXG4gICAgbm9kaXI6IHRydWUsXG4gICAgbm9zb3J0OiB0cnVlXG4gIH07XG4gIGNvbnN0IHRzRmlsZXM6IHN0cmluZ1tdID0gZ2xvYlN5bmMoYCR7c291cmNlRGlyfS8qKi8hKCouc3BlY3wqLnRlc3QpLnRzKmAsIGdsb2JPcHRpb25zKTtcbiAgY29uc3QganNGaWxlczogc3RyaW5nW10gPSBnbG9iU3luYyhgJHtzb3VyY2VEaXJ9LyoqLyEoKi5zcGVjfCoudGVzdCkuanNgLCBnbG9iT3B0aW9ucyk7XG4gIGNvbnN0IHNvdXJjZUZpbGVzOiBzdHJpbmdbXSA9IFsuLi50c0ZpbGVzLCAuLi5qc0ZpbGVzXTtcbiAgY29uc3QgZXNidWlsZENvbmZpZyA9IExleENvbmZpZy5jb25maWcuZXNidWlsZCB8fCB7fTtcbiAgY29uc3QgaXNQcm9kdWN0aW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJztcbiAgbGV0IHNob3VsZE1pbmlmeTogYm9vbGVhbjtcblxuICBpZih0eXBlb2YgZXNidWlsZENvbmZpZy5taW5pZnkgPT09ICdib29sZWFuJykge1xuICAgIHNob3VsZE1pbmlmeSA9IGVzYnVpbGRDb25maWcubWluaWZ5O1xuICB9IGVsc2Uge1xuICAgIHNob3VsZE1pbmlmeSA9IGlzUHJvZHVjdGlvbjtcbiAgfVxuXG4gIGNvbnN0IGVzYnVpbGRQYXRoOiBzdHJpbmcgPSByZXNvbHZlQmluYXJ5UGF0aCgnZXNidWlsZCcsICdlc2J1aWxkJyk7XG5cbiAgaWYoIWVzYnVpbGRQYXRoKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBlc2J1aWxkIGJpbmFyeSBub3QgZm91bmQgaW4gTGV4J3Mgbm9kZV9tb2R1bGVzIG9yIG1vbm9yZXBvIHJvb3RgLCAnZXJyb3InLCBxdWlldCk7XG4gICAgbG9nKCdQbGVhc2UgcmVpbnN0YWxsIExleCBvciBjaGVjayB5b3VyIGluc3RhbGxhdGlvbi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IGVzYnVpbGRPcHRpb25zOiBzdHJpbmdbXSA9IFtcbiAgICAuLi5zb3VyY2VGaWxlcyxcbiAgICAnLS1jb2xvcj10cnVlJyxcbiAgICBgLS1mb3JtYXQ9JHtlc2J1aWxkQ29uZmlnLmZvcm1hdCB8fCAnZXNtJ31gLFxuICAgIGAtLW91dGRpcj0ke291dHB1dERpcn1gLFxuICAgIGAtLXBsYXRmb3JtPSR7ZXNidWlsZENvbmZpZy5wbGF0Zm9ybSB8fCAnbm9kZSd9YCxcbiAgICBgLS1zb3VyY2VtYXA9JHtlc2J1aWxkQ29uZmlnLnNvdXJjZW1hcCB8fCAnaW5saW5lJ31gLFxuICAgIGAtLXRhcmdldD0ke2VzYnVpbGRDb25maWcudGFyZ2V0IHx8ICdub2RlMjAnfWBcbiAgXTtcblxuICBpZihzaG91bGRNaW5pZnkpIHtcbiAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKCctLW1pbmlmeScpO1xuICB9XG5cbiAgaWYoZXNidWlsZENvbmZpZy50cmVlU2hha2luZyAhPT0gZmFsc2UpIHtcbiAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKCctLXRyZWUtc2hha2luZz10cnVlJyk7XG4gIH1cblxuICBpZihlc2J1aWxkQ29uZmlnLmRyb3AgJiYgZXNidWlsZENvbmZpZy5kcm9wLmxlbmd0aCA+IDApIHtcbiAgICBlc2J1aWxkQ29uZmlnLmRyb3AuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgZXNidWlsZE9wdGlvbnMucHVzaChgLS1kcm9wOiR7aXRlbX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmKGVzYnVpbGRDb25maWcucHVyZSAmJiBlc2J1aWxkQ29uZmlnLnB1cmUubGVuZ3RoID4gMCkge1xuICAgIGVzYnVpbGRDb25maWcucHVyZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKGAtLXB1cmU6JHtpdGVtfWApO1xuICAgIH0pO1xuICB9XG5cbiAgaWYoZXNidWlsZENvbmZpZy5sZWdhbENvbW1lbnRzKSB7XG4gICAgZXNidWlsZE9wdGlvbnMucHVzaChgLS1sZWdhbC1jb21tZW50cz0ke2VzYnVpbGRDb25maWcubGVnYWxDb21tZW50c31gKTtcbiAgfVxuXG4gIGlmKGVzYnVpbGRDb25maWcuYmFubmVyKSB7XG4gICAgT2JqZWN0LmVudHJpZXMoZXNidWlsZENvbmZpZy5iYW5uZXIpLmZvckVhY2goKFt0eXBlLCBjb250ZW50XSkgPT4ge1xuICAgICAgZXNidWlsZE9wdGlvbnMucHVzaChgLS1iYW5uZXI6JHt0eXBlfT0ke2NvbnRlbnR9YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZihlc2J1aWxkQ29uZmlnLmZvb3Rlcikge1xuICAgIE9iamVjdC5lbnRyaWVzKGVzYnVpbGRDb25maWcuZm9vdGVyKS5mb3JFYWNoKChbdHlwZSwgY29udGVudF0pID0+IHtcbiAgICAgIGVzYnVpbGRPcHRpb25zLnB1c2goYC0tZm9vdGVyOiR7dHlwZX09JHtjb250ZW50fWApO1xuICAgIH0pO1xuICB9XG5cbiAgaWYoZXNidWlsZENvbmZpZy5kZWZpbmUpIHtcbiAgICBPYmplY3QuZW50cmllcyhlc2J1aWxkQ29uZmlnLmRlZmluZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKGAtLWRlZmluZToke2tleX09JHt2YWx1ZX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmKHdhdGNoKSB7XG4gICAgZXNidWlsZE9wdGlvbnMucHVzaCgnLS13YXRjaCcpO1xuICB9XG5cbiAgY29uc3QgY3NzRmlsZXM6IHN0cmluZ1tdID0gZ2V0RmlsZXNCeUV4dCgnLmNzcycsIExleENvbmZpZy5jb25maWcpO1xuXG4gIGlmKGNzc0ZpbGVzLmxlbmd0aCkge1xuICAgIGNvbnN0IHBvc3Rjc3NQYXRoOiBzdHJpbmcgPSByZXNvbHZlQmluYXJ5UGF0aCgncG9zdGNzcycsICdwb3N0Y3NzLWNsaScpO1xuXG4gICAgaWYoIXBvc3Rjc3NQYXRoKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFBvc3RDU1MgYmluYXJ5IG5vdCBmb3VuZCBpbiBMZXgncyBub2RlX21vZHVsZXMgb3IgbW9ub3JlcG8gcm9vdGAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGxvZygnUGxlYXNlIHJlaW5zdGFsbCBMZXggb3IgY2hlY2sgeW91ciBpbnN0YWxsYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3N0Y3NzT3B0aW9uczogc3RyaW5nW10gPSBbXG4gICAgICBgJHtzb3VyY2VEaXJ9LyoqLyoqLmNzc2AsXG4gICAgICAnLS1iYXNlJyxcbiAgICAgIHNvdXJjZURpcixcbiAgICAgICctLWRpcicsXG4gICAgICBvdXRwdXREaXIsXG4gICAgICAnLS1jb25maWcnLFxuICAgICAgcGF0aFJlc29sdmUoZGlyTmFtZSwgJy4uLy4uL3Bvc3Rjc3MuY29uZmlnLmpzJylcbiAgICBdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWNhKHBvc3Rjc3NQYXRoLCBwb3N0Y3NzT3B0aW9ucywge2VuY29kaW5nOiAndXRmOCd9KTtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZChgU3VjY2Vzc2Z1bGx5IGZvcm1hdHRlZCAke2Nzc0ZpbGVzLmxlbmd0aH0gY3NzIGZpbGVzIWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIGZvcm1hdHRpbmcgY3NzLicpO1xuXG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGdpZkZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy5naWYnLCBMZXhDb25maWcuY29uZmlnKTtcbiAgY29uc3QganBnRmlsZXM6IHN0cmluZ1tdID0gZ2V0RmlsZXNCeUV4dCgnLmpwZycsIExleENvbmZpZy5jb25maWcpO1xuICBjb25zdCBwbmdGaWxlczogc3RyaW5nW10gPSBnZXRGaWxlc0J5RXh0KCcucG5nJywgTGV4Q29uZmlnLmNvbmZpZyk7XG4gIGNvbnN0IHN2Z0ZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy5zdmcnLCBMZXhDb25maWcuY29uZmlnKTtcbiAgY29uc3QgaW1hZ2VGaWxlczogc3RyaW5nW10gPSBbLi4uZ2lmRmlsZXMsIC4uLmpwZ0ZpbGVzLCAuLi5wbmdGaWxlcywgLi4uc3ZnRmlsZXNdO1xuXG4gIGlmKGltYWdlRmlsZXMubGVuZ3RoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvcHlGaWxlcyhpbWFnZUZpbGVzLCAnaW1hZ2UnLCBzcGlubmVyLCBMZXhDb25maWcuY29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBtb3ZlIGltYWdlcyB0byBvdXRwdXQgZGlyZWN0b3J5LicpO1xuXG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHR0ZkZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy50dGYnLCBMZXhDb25maWcuY29uZmlnKTtcbiAgY29uc3Qgb3RmRmlsZXM6IHN0cmluZ1tdID0gZ2V0RmlsZXNCeUV4dCgnLm90ZicsIExleENvbmZpZy5jb25maWcpO1xuICBjb25zdCB3b2ZmRmlsZXM6IHN0cmluZ1tdID0gZ2V0RmlsZXNCeUV4dCgnLndvZmYnLCBMZXhDb25maWcuY29uZmlnKTtcbiAgY29uc3Qgd29mZjJGaWxlczogc3RyaW5nW10gPSBnZXRGaWxlc0J5RXh0KCcud29mZjInLCBMZXhDb25maWcuY29uZmlnKTtcbiAgY29uc3QgZm9udEZpbGVzOiBzdHJpbmdbXSA9IFsuLi50dGZGaWxlcywgLi4ub3RmRmlsZXMsIC4uLndvZmZGaWxlcywgLi4ud29mZjJGaWxlc107XG5cbiAgaWYoZm9udEZpbGVzLmxlbmd0aCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjb3B5RmlsZXMoZm9udEZpbGVzLCAnZm9udCcsIHNwaW5uZXIsIExleENvbmZpZy5jb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIG1vdmUgZm9udHMgdG8gb3V0cHV0IGRpcmVjdG9yeS4nKTtcblxuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZEZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy5tZCcsIExleENvbmZpZy5jb25maWcpO1xuXG4gIGlmKG1kRmlsZXMubGVuZ3RoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvcHlGaWxlcyhtZEZpbGVzLCAnZG9jdW1lbnRzJywgc3Bpbm5lciwgTGV4Q29uZmlnLmNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gbW92ZSBkb2NzIHRvIG91dHB1dCBkaXJlY3RvcnkuJyk7XG5cbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgc3Bpbm5lci5zdGFydCh3YXRjaCA/ICdXYXRjaGluZyBmb3IgY2hhbmdlcy4uLicgOiAnQ29tcGlsaW5nIHdpdGggRVNCdWlsZC4uLicpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY2EoZXNidWlsZFBhdGgsIGVzYnVpbGRPcHRpb25zLCB7ZW5jb2Rpbmc6ICd1dGY4J30pO1xuXG4gICAgc3Bpbm5lci5zdWNjZWVkKCdDb21waWxlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgaWYoIXF1aWV0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG5cbiAgICBzcGlubmVyLmZhaWwoJ0NvZGUgY29tcGlsaW5nIGZhaWxlZC4nKTtcblxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBjb3B5Q29uZmlndXJlZEZpbGVzKHNwaW5uZXIsIExleENvbmZpZy5jb25maWcsIHF1aWV0KTtcbiAgfSBjYXRjaCAoY29weUVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gY29weSBjb25maWd1cmVkIGZpbGVzOiAke2NvcHlFcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIGNvcHkgY29uZmlndXJlZCBmaWxlcy4nKTtcblxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY2FsbGJhY2soMCk7XG4gIHJldHVybiAwO1xufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxTQUFRLGFBQVk7QUFDcEIsU0FBUSxZQUFZLFdBQVcsbUJBQWtCO0FBQ2pELFNBQVEsUUFBUSxnQkFBZTtBQUMvQixTQUFRLFdBQVcsYUFBYSxRQUFRLFVBQVUsV0FBVyxtQkFBa0I7QUFFL0UsU0FBUSxXQUFXLCtCQUE4QjtBQUNqRCxTQUFRLG9CQUFvQixxQkFBcUIsV0FBVyxlQUFlLGVBQWUsbUJBQWtCO0FBQzVHLFNBQVEsWUFBWSx5QkFBd0I7QUFDNUMsU0FBUSxXQUFVO0FBRVgsTUFBTSxjQUFjLENBQUMsV0FBbUIsUUFBMkI7QUFDeEUsTUFBRyxDQUFDLFdBQVcsU0FBUyxHQUFHO0FBQ3pCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxRQUFrQixZQUFZLFNBQVM7QUFFN0MsU0FBTyxNQUFNLEtBQUssQ0FBQyxTQUFpQjtBQUNsQyxVQUFNLFdBQW1CLFNBQVMsV0FBVyxJQUFJO0FBQ2pELFVBQU0sVUFBa0IsWUFBWSxRQUFRO0FBQzVDLFVBQU0sT0FBTyxVQUFVLFFBQVE7QUFFL0IsUUFBRyxLQUFLLFlBQVksR0FBRztBQUNyQixhQUFPLFlBQVksVUFBVSxHQUFHO0FBQUEsSUFDbEM7QUFFQSxXQUFPLElBQUksU0FBUyxPQUFPO0FBQUEsRUFDN0IsQ0FBQztBQUNIO0FBRU8sTUFBTSxVQUFVLE9BQU8sS0FBVSxXQUFnQixPQUFPLENBQUMsT0FBd0I7QUFDdEYsUUFBTTtBQUFBLElBQ0osVUFBVTtBQUFBLElBQ1Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFFBQU0sVUFBVSxjQUFjLEtBQUs7QUFFbkMsTUFBSSxHQUFHLE9BQU8saUJBQWlCLFFBQVEsS0FBSztBQUU1QyxRQUFNLFVBQVUsWUFB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
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbXBpbGUvY29tcGlsZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgbHN0YXRTeW5jLCByZWFkZGlyU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCB7ZXh0bmFtZSBhcyBwYXRoRXh0bmFtZSwgam9pbiBhcyBwYXRoSm9pbiwgcmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZX0gZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7TGV4Q29uZmlnLCBnZXRUeXBlU2NyaXB0Q29uZmlnUGF0aH0gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y2hlY2tMaW5rZWRNb2R1bGVzLCBjb3B5Q29uZmlndXJlZEZpbGVzLCBjb3B5RmlsZXMsIGNyZWF0ZVNwaW5uZXIsIGdldEZpbGVzQnlFeHQsIHJlbW92ZUZpbGVzfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtnZXREaXJOYW1lLCByZXNvbHZlQmluYXJ5UGF0aH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGNvbnN0IGhhc0ZpbGVUeXBlID0gKHN0YXJ0UGF0aDogc3RyaW5nLCBleHQ6IHN0cmluZ1tdKTogYm9vbGVhbiA9PiB7XG4gIGlmKCFleGlzdHNTeW5jKHN0YXJ0UGF0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBmaWxlczogc3RyaW5nW10gPSByZWFkZGlyU3luYyhzdGFydFBhdGgpO1xuXG4gIHJldHVybiBmaWxlcy5zb21lKChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBmaWxlbmFtZTogc3RyaW5nID0gcGF0aEpvaW4oc3RhcnRQYXRoLCBmaWxlKTtcbiAgICBjb25zdCBmaWxlRXh0OiBzdHJpbmcgPSBwYXRoRXh0bmFtZShmaWxlbmFtZSk7XG4gICAgY29uc3Qgc3RhdCA9IGxzdGF0U3luYyhmaWxlbmFtZSk7XG5cbiAgICBpZihzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiBoYXNGaWxlVHlwZShmaWxlbmFtZSwgZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXh0LmluY2x1ZGVzKGZpbGVFeHQpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb21waWxlID0gYXN5bmMgKGNtZDogYW55LCBjYWxsYmFjazogYW55ID0gKCkgPT4gKHt9KSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgY29uZmlnLFxuICAgIG91dHB1dFBhdGgsXG4gICAgcXVpZXQsXG4gICAgcmVtb3ZlLFxuICAgIHNvdXJjZVBhdGgsXG4gICAgd2F0Y2hcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IGNvbXBpbGluZy4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIGNvbnN0IHtvdXRwdXRGdWxsUGF0aCwgc291cmNlRnVsbFBhdGgsIHVzZVR5cGVzY3JpcHR9ID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3Qgb3V0cHV0RGlyOiBzdHJpbmcgPSBvdXRwdXRQYXRoIHx8IG91dHB1dEZ1bGxQYXRoO1xuICBjb25zdCBzb3VyY2VEaXI6IHN0cmluZyA9IHNvdXJjZVBhdGggPyBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgLi8ke3NvdXJjZVBhdGh9YCkgOiBzb3VyY2VGdWxsUGF0aCB8fCAnJztcbiAgY29uc3QgZGlyTmFtZSA9IGdldERpck5hbWUoKTtcbiAgY29uc3QgZGlyUGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoZGlyTmFtZSwgJy4uLy4uJyk7XG5cbiAgY2hlY2tMaW5rZWRNb2R1bGVzKCk7XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMob3V0cHV0RGlyKTtcbiAgfVxuXG4gIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICBMZXhDb25maWcuY2hlY2tDb21waWxlVHlwZXNjcmlwdENvbmZpZygpO1xuXG4gICAgY29uc3QgdHlwZXNjcmlwdFBhdGg6IHN0cmluZyA9IHJlc29sdmVCaW5hcnlQYXRoKCd0c2MnLCAndHlwZXNjcmlwdCcpO1xuXG4gICAgaWYoIXR5cGVzY3JpcHRQYXRoKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFR5cGVTY3JpcHQgYmluYXJ5IG5vdCBmb3VuZCBpbiBMZXgncyBub2RlX21vZHVsZXMgb3IgbW9ub3JlcG8gcm9vdGAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGxvZygnUGxlYXNlIHJlaW5zdGFsbCBMZXggb3IgY2hlY2sgeW91ciBpbnN0YWxsYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlc2NyaXB0T3B0aW9uczogc3RyaW5nW10gPSBjb25maWcgP1xuICAgICAgWyctcCcsIGNvbmZpZ10gOlxuICAgICAgWyctcCcsIGdldFR5cGVTY3JpcHRDb25maWdQYXRoKCd0c2NvbmZpZy5idWlsZC5qc29uJyldO1xuXG4gICAgc3Bpbm5lci5zdGFydCgnU3RhdGljIHR5cGUgY2hlY2tpbmcgd2l0aCBUeXBlc2NyaXB0Li4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlY2EodHlwZXNjcmlwdFBhdGgsIHR5cGVzY3JpcHRPcHRpb25zLCB7ZW5jb2Rpbmc6ICd1dGY4J30pO1xuXG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdHlwZSBjaGVja2luZyEnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgICBzcGlubmVyLmZhaWwoJ1R5cGUgY2hlY2tpbmcgZmFpbGVkLicpO1xuXG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGdsb2JPcHRpb25zID0ge1xuICAgIGN3ZDogc291cmNlRGlyLFxuICAgIGRvdDogZmFsc2UsXG4gICAgbm9kaXI6IHRydWUsXG4gICAgbm9zb3J0OiB0cnVlXG4gIH07XG4gIGNvbnN0IHRzRmlsZXM6IHN0cmluZ1tdID0gZ2xvYlN5bmMoYCR7c291cmNlRGlyfS8qKi8hKCouc3BlY3wqLnRlc3R8Ki5pbnRlZ3JhdGlvbikudHMqYCwgZ2xvYk9wdGlvbnMpO1xuICBjb25zdCBqc0ZpbGVzOiBzdHJpbmdbXSA9IGdsb2JTeW5jKGAke3NvdXJjZURpcn0vKiovISgqLnNwZWN8Ki50ZXN0fCouaW50ZWdyYXRpb24pLmpzYCwgZ2xvYk9wdGlvbnMpO1xuICBjb25zdCBzb3VyY2VGaWxlczogc3RyaW5nW10gPSBbLi4udHNGaWxlcywgLi4uanNGaWxlc107XG4gIGNvbnN0IGVzYnVpbGRDb25maWcgPSBMZXhDb25maWcuY29uZmlnLmVzYnVpbGQgfHwge307XG4gIGNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG4gIGxldCBzaG91bGRNaW5pZnk6IGJvb2xlYW47XG5cbiAgaWYodHlwZW9mIGVzYnVpbGRDb25maWcubWluaWZ5ID09PSAnYm9vbGVhbicpIHtcbiAgICBzaG91bGRNaW5pZnkgPSBlc2J1aWxkQ29uZmlnLm1pbmlmeTtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRNaW5pZnkgPSBpc1Byb2R1Y3Rpb247XG4gIH1cblxuICBjb25zdCBlc2J1aWxkUGF0aDogc3RyaW5nID0gcmVzb2x2ZUJpbmFyeVBhdGgoJ2VzYnVpbGQnLCAnZXNidWlsZCcpO1xuXG4gIGlmKCFlc2J1aWxkUGF0aCkge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogZXNidWlsZCBiaW5hcnkgbm90IGZvdW5kIGluIExleCdzIG5vZGVfbW9kdWxlcyBvciBtb25vcmVwbyByb290YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGxvZygnUGxlYXNlIHJlaW5zdGFsbCBMZXggb3IgY2hlY2sgeW91ciBpbnN0YWxsYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBlc2J1aWxkT3B0aW9uczogc3RyaW5nW10gPSBbXG4gICAgLi4uc291cmNlRmlsZXMsXG4gICAgJy0tY29sb3I9dHJ1ZScsXG4gICAgYC0tZm9ybWF0PSR7ZXNidWlsZENvbmZpZy5mb3JtYXQgfHwgJ2VzbSd9YCxcbiAgICBgLS1vdXRkaXI9JHtvdXRwdXREaXJ9YCxcbiAgICBgLS1wbGF0Zm9ybT0ke2VzYnVpbGRDb25maWcucGxhdGZvcm0gfHwgJ25vZGUnfWAsXG4gICAgYC0tc291cmNlbWFwPSR7ZXNidWlsZENvbmZpZy5zb3VyY2VtYXAgfHwgJ2lubGluZSd9YCxcbiAgICBgLS10YXJnZXQ9JHtlc2J1aWxkQ29uZmlnLnRhcmdldCB8fCAnbm9kZTIwJ31gXG4gIF07XG5cbiAgaWYoc2hvdWxkTWluaWZ5KSB7XG4gICAgZXNidWlsZE9wdGlvbnMucHVzaCgnLS1taW5pZnknKTtcbiAgfVxuXG4gIGlmKGVzYnVpbGRDb25maWcudHJlZVNoYWtpbmcgIT09IGZhbHNlKSB7XG4gICAgZXNidWlsZE9wdGlvbnMucHVzaCgnLS10cmVlLXNoYWtpbmc9dHJ1ZScpO1xuICB9XG5cbiAgaWYoZXNidWlsZENvbmZpZy5kcm9wICYmIGVzYnVpbGRDb25maWcuZHJvcC5sZW5ndGggPiAwKSB7XG4gICAgZXNidWlsZENvbmZpZy5kcm9wLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGVzYnVpbGRPcHRpb25zLnB1c2goYC0tZHJvcDoke2l0ZW19YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZihlc2J1aWxkQ29uZmlnLnB1cmUgJiYgZXNidWlsZENvbmZpZy5wdXJlLmxlbmd0aCA+IDApIHtcbiAgICBlc2J1aWxkQ29uZmlnLnB1cmUuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgZXNidWlsZE9wdGlvbnMucHVzaChgLS1wdXJlOiR7aXRlbX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmKGVzYnVpbGRDb25maWcubGVnYWxDb21tZW50cykge1xuICAgIGVzYnVpbGRPcHRpb25zLnB1c2goYC0tbGVnYWwtY29tbWVudHM9JHtlc2J1aWxkQ29uZmlnLmxlZ2FsQ29tbWVudHN9YCk7XG4gIH1cblxuICBpZihlc2J1aWxkQ29uZmlnLmJhbm5lcikge1xuICAgIE9iamVjdC5lbnRyaWVzKGVzYnVpbGRDb25maWcuYmFubmVyKS5mb3JFYWNoKChbdHlwZSwgY29udGVudF0pID0+IHtcbiAgICAgIGVzYnVpbGRPcHRpb25zLnB1c2goYC0tYmFubmVyOiR7dHlwZX09JHtjb250ZW50fWApO1xuICAgIH0pO1xuICB9XG5cbiAgaWYoZXNidWlsZENvbmZpZy5mb290ZXIpIHtcbiAgICBPYmplY3QuZW50cmllcyhlc2J1aWxkQ29uZmlnLmZvb3RlcikuZm9yRWFjaCgoW3R5cGUsIGNvbnRlbnRdKSA9PiB7XG4gICAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKGAtLWZvb3Rlcjoke3R5cGV9PSR7Y29udGVudH1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmKGVzYnVpbGRDb25maWcuZGVmaW5lKSB7XG4gICAgT2JqZWN0LmVudHJpZXMoZXNidWlsZENvbmZpZy5kZWZpbmUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgZXNidWlsZE9wdGlvbnMucHVzaChgLS1kZWZpbmU6JHtrZXl9PSR7dmFsdWV9YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZih3YXRjaCkge1xuICAgIGVzYnVpbGRPcHRpb25zLnB1c2goJy0td2F0Y2gnKTtcbiAgfVxuXG4gIGNvbnN0IGNzc0ZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy5jc3MnLCBMZXhDb25maWcuY29uZmlnKTtcblxuICBpZihjc3NGaWxlcy5sZW5ndGgpIHtcbiAgICBjb25zdCBwb3N0Y3NzUGF0aDogc3RyaW5nID0gcmVzb2x2ZUJpbmFyeVBhdGgoJ3Bvc3Rjc3MnLCAncG9zdGNzcy1jbGknKTtcblxuICAgIGlmKCFwb3N0Y3NzUGF0aCkge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBQb3N0Q1NTIGJpbmFyeSBub3QgZm91bmQgaW4gTGV4J3Mgbm9kZV9tb2R1bGVzIG9yIG1vbm9yZXBvIHJvb3RgLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBsb2coJ1BsZWFzZSByZWluc3RhbGwgTGV4IG9yIGNoZWNrIHlvdXIgaW5zdGFsbGF0aW9uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdGNzc09wdGlvbnM6IHN0cmluZ1tdID0gW1xuICAgICAgYCR7c291cmNlRGlyfS8qKi8qKi5jc3NgLFxuICAgICAgJy0tYmFzZScsXG4gICAgICBzb3VyY2VEaXIsXG4gICAgICAnLS1kaXInLFxuICAgICAgb3V0cHV0RGlyLFxuICAgICAgJy0tY29uZmlnJyxcbiAgICAgIHBhdGhSZXNvbHZlKGRpck5hbWUsICcuLi8uLi9wb3N0Y3NzLmNvbmZpZy5qcycpXG4gICAgXTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjYShwb3N0Y3NzUGF0aCwgcG9zdGNzc09wdGlvbnMsIHtlbmNvZGluZzogJ3V0ZjgnfSk7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoYFN1Y2Nlc3NmdWxseSBmb3JtYXR0ZWQgJHtjc3NGaWxlcy5sZW5ndGh9IGNzcyBmaWxlcyFgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCBmb3JtYXR0aW5nIGNzcy4nKTtcblxuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBnaWZGaWxlczogc3RyaW5nW10gPSBnZXRGaWxlc0J5RXh0KCcuZ2lmJywgTGV4Q29uZmlnLmNvbmZpZyk7XG4gIGNvbnN0IGpwZ0ZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy5qcGcnLCBMZXhDb25maWcuY29uZmlnKTtcbiAgY29uc3QgcG5nRmlsZXM6IHN0cmluZ1tdID0gZ2V0RmlsZXNCeUV4dCgnLnBuZycsIExleENvbmZpZy5jb25maWcpO1xuICBjb25zdCBzdmdGaWxlczogc3RyaW5nW10gPSBnZXRGaWxlc0J5RXh0KCcuc3ZnJywgTGV4Q29uZmlnLmNvbmZpZyk7XG4gIGNvbnN0IGltYWdlRmlsZXM6IHN0cmluZ1tdID0gWy4uLmdpZkZpbGVzLCAuLi5qcGdGaWxlcywgLi4ucG5nRmlsZXMsIC4uLnN2Z0ZpbGVzXTtcblxuICBpZihpbWFnZUZpbGVzLmxlbmd0aCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjb3B5RmlsZXMoaW1hZ2VGaWxlcywgJ2ltYWdlJywgc3Bpbm5lciwgTGV4Q29uZmlnLmNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gbW92ZSBpbWFnZXMgdG8gb3V0cHV0IGRpcmVjdG9yeS4nKTtcblxuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0dGZGaWxlczogc3RyaW5nW10gPSBnZXRGaWxlc0J5RXh0KCcudHRmJywgTGV4Q29uZmlnLmNvbmZpZyk7XG4gIGNvbnN0IG90ZkZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy5vdGYnLCBMZXhDb25maWcuY29uZmlnKTtcbiAgY29uc3Qgd29mZkZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy53b2ZmJywgTGV4Q29uZmlnLmNvbmZpZyk7XG4gIGNvbnN0IHdvZmYyRmlsZXM6IHN0cmluZ1tdID0gZ2V0RmlsZXNCeUV4dCgnLndvZmYyJywgTGV4Q29uZmlnLmNvbmZpZyk7XG4gIGNvbnN0IGZvbnRGaWxlczogc3RyaW5nW10gPSBbLi4udHRmRmlsZXMsIC4uLm90ZkZpbGVzLCAuLi53b2ZmRmlsZXMsIC4uLndvZmYyRmlsZXNdO1xuXG4gIGlmKGZvbnRGaWxlcy5sZW5ndGgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY29weUZpbGVzKGZvbnRGaWxlcywgJ2ZvbnQnLCBzcGlubmVyLCBMZXhDb25maWcuY29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBtb3ZlIGZvbnRzIHRvIG91dHB1dCBkaXJlY3RvcnkuJyk7XG5cbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWRGaWxlczogc3RyaW5nW10gPSBnZXRGaWxlc0J5RXh0KCcubWQnLCBMZXhDb25maWcuY29uZmlnKTtcblxuICBpZihtZEZpbGVzLmxlbmd0aCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjb3B5RmlsZXMobWRGaWxlcywgJ2RvY3VtZW50cycsIHNwaW5uZXIsIExleENvbmZpZy5jb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIG1vdmUgZG9jcyB0byBvdXRwdXQgZGlyZWN0b3J5LicpO1xuXG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHNwaW5uZXIuc3RhcnQod2F0Y2ggPyAnV2F0Y2hpbmcgZm9yIGNoYW5nZXMuLi4nIDogJ0NvbXBpbGluZyB3aXRoIEVTQnVpbGQuLi4nKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNhKGVzYnVpbGRQYXRoLCBlc2J1aWxkT3B0aW9ucywge2VuY29kaW5nOiAndXRmOCd9KTtcblxuICAgIHNwaW5uZXIuc3VjY2VlZCgnQ29tcGlsZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIGlmKCFxdWlldCkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuXG4gICAgc3Bpbm5lci5mYWlsKCdDb2RlIGNvbXBpbGluZyBmYWlsZWQuJyk7XG5cbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgY29weUNvbmZpZ3VyZWRGaWxlcyhzcGlubmVyLCBMZXhDb25maWcuY29uZmlnLCBxdWlldCk7XG4gIH0gY2F0Y2ggKGNvcHlFcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRmFpbGVkIHRvIGNvcHkgY29uZmlndXJlZCBmaWxlczogJHtjb3B5RXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBjb3B5IGNvbmZpZ3VyZWQgZmlsZXMuJyk7XG5cbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNhbGxiYWNrKDApO1xuICByZXR1cm4gMDtcbn07Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxhQUFZO0FBQ3BCLFNBQVEsWUFBWSxXQUFXLG1CQUFrQjtBQUNqRCxTQUFRLFFBQVEsZ0JBQWU7QUFDL0IsU0FBUSxXQUFXLGFBQWEsUUFBUSxVQUFVLFdBQVcsbUJBQWtCO0FBRS9FLFNBQVEsV0FBVywrQkFBOEI7QUFDakQsU0FBUSxvQkFBb0IscUJBQXFCLFdBQVcsZUFBZSxlQUFlLG1CQUFrQjtBQUM1RyxTQUFRLFlBQVkseUJBQXdCO0FBQzVDLFNBQVEsV0FBVTtBQUVYLE1BQU0sY0FBYyxDQUFDLFdBQW1CLFFBQTJCO0FBQ3hFLE1BQUcsQ0FBQyxXQUFXLFNBQVMsR0FBRztBQUN6QixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sUUFBa0IsWUFBWSxTQUFTO0FBRTdDLFNBQU8sTUFBTSxLQUFLLENBQUMsU0FBaUI7QUFDbEMsVUFBTSxXQUFtQixTQUFTLFdBQVcsSUFBSTtBQUNqRCxVQUFNLFVBQWtCLFlBQVksUUFBUTtBQUM1QyxVQUFNLE9BQU8sVUFBVSxRQUFRO0FBRS9CLFFBQUcsS0FBSyxZQUFZLEdBQUc7QUFDckIsYUFBTyxZQUFZLFVBQVUsR0FBRztBQUFBLElBQ2xDO0FBRUEsV0FBTyxJQUFJLFNBQVMsT0FBTztBQUFBLEVBQzdCLENBQUM7QUFDSDtBQUVPLE1BQU0sVUFBVSxPQUFPLEtBQVUsV0FBZ0IsT0FBTyxDQUFDLE9BQXdCO0FBQ3RGLFFBQU07QUFBQSxJQUNKLFVBQVU7QUFBQSxJQUNWO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixRQUFNLFVBQVUsY0FBYyxLQUFLO0FBRW5DLE1BQUksR0FBRyxPQUFPLGlCQUFpQixRQUFRLEtBQUs7QUFFNUMsUUFBTSxVQUFVLFlBQVksR0FBRztBQUUvQixRQUFNLEVBQUMsZ0JBQWdCLGdCQUFnQixjQUFhLElBQUksVUFBVTtBQUNsRSxRQUFNLFlBQW9CLGNBQWM7QUFDeEMsUUFBTSxZQUFvQixhQUFhLFlBQVksUUFBUSxJQUFJLEdBQUcsS0FBSyxVQUFVLEVBQUUsSUFBSSxrQkFBa0I7QUFDekcsUUFBTSxVQUFVLFdBQVc7QUFDM0IsUUFBTSxVQUFrQixZQUFZLFNBQVMsT0FBTztBQUVwRCxxQkFBbUI7QUFFbkIsTUFBRyxRQUFRO0FBQ1QsVUFBTSxZQUFZLFNBQVM7QUFBQSxFQUM3QjtBQUVBLE1BQUcsZUFBZTtBQUNoQixjQUFVLDZCQUE2QjtBQUV2QyxVQUFNLGlCQUF5QixrQkFBa0IsT0FBTyxZQUFZO0FBRXBFLFFBQUcsQ0FBQyxnQkFBZ0I7QUFDbEIsVUFBSTtBQUFBLEVBQUssT0FBTyw4RUFBOEUsU0FBUyxLQUFLO0FBQzVHLFVBQUksb0RBQW9ELFFBQVEsS0FBSztBQUNyRSxhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sb0JBQThCLFNBQ2xDLENBQUMsTUFBTSxNQUFNLElBQ2IsQ0FBQyxNQUFNLHdCQUF3QixxQkFBcUIsQ0FBQztBQUV2RCxZQUFRLE1BQU0seUNBQXlDO0FBRXZELFFBQUk7QUFDRixZQUFNLE1BQU0sZ0JBQWdCLG1CQUFtQixFQUFDLFVBQVUsT0FBTSxDQUFDO0FBRWpFLGNBQVEsUUFBUSx1Q0FBdUM7QUFBQSxJQUN6RCxTQUFTLE9BQU87QUFDZCxVQUFJO0FBQUEsRUFBSyxPQUFPLFdBQVcsTUFBTSxPQUFPLElBQUksU0FBUyxLQUFLO0FBRTFELGNBQVEsS0FBSyx1QkFBdUI7QUFFcEMsZUFBUyxDQUFDO0FBQ1YsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsUUFBTSxjQUFjO0FBQUEsSUFDbEIsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLElBQ1AsUUFBUTtBQUFBLEVBQ1Y7QUFDQSxRQUFNLFVBQW9CLFNBQVMsR0FBRyxTQUFTLDBDQUEwQyxXQUFXO0FBQ3BHLFFBQU0sVUFBb0IsU0FBUyxHQUFHLFNBQVMseUNBQXlDLFdBQVc7QUFDbkcsUUFBTSxjQUF3QixDQUFDLEdBQUcsU0FBUyxHQUFHLE9BQU87QUFDckQsUUFBTSxnQkFBZ0IsVUFBVSxPQUFPLFdBQVcsQ0FBQztBQUNuRCxRQUFNLGVBQWUsUUFBUSxJQUFJLGFBQWE7QUFDOUMsTUFBSTtBQUVKLE1BQUcsT0FBTyxjQUFjLFdBQVcsV0FBVztBQUM1QyxtQkFBZSxjQUFjO0FBQUEsRUFDL0IsT0FBTztBQUNMLG1CQUFlO0FBQUEsRUFDakI7QUFFQSxRQUFNLGNBQXNCLGtCQUFrQixXQUFXLFNBQVM7QUFFbEUsTUFBRyxDQUFDLGFBQWE7QUFDZixRQUFJO0FBQUEsRUFBSyxPQUFPLDJFQUEyRSxTQUFTLEtBQUs7QUFDekcsUUFBSSxvREFBb0QsUUFBUSxLQUFLO0FBQ3JFLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxpQkFBMkI7QUFBQSxJQUMvQixHQUFHO0FBQUEsSUFDSDtBQUFBLElBQ0EsWUFBWSxjQUFjLFVBQVUsS0FBSztBQUFBLElBQ3pDLFlBQVksU0FBUztBQUFBLElBQ3JCLGNBQWMsY0FBYyxZQUFZLE1BQU07QUFBQSxJQUM5QyxlQUFlLGNBQWMsYUFBYSxRQUFRO0FBQUEsSUFDbEQsWUFBWSxjQUFjLFVBQVUsUUFBUTtBQUFBLEVBQzlDO0FBRUEsTUFBRyxjQUFjO0FBQ2YsbUJBQWUsS0FBSyxVQUFVO0FBQUEsRUFDaEM7QUFFQSxNQUFHLGNBQWMsZ0JBQWdCLE9BQU87QUFDdEMsbUJBQWUsS0FBSyxxQkFBcUI7QUFBQSxFQUMzQztBQUVBLE1BQUcsY0FBYyxRQUFRLGNBQWMsS0FBSyxTQUFTLEdBQUc7QUFDdEQsa0JBQWMsS0FBSyxRQUFRLENBQUMsU0FBUztBQUNuQyxxQkFBZSxLQUFLLFVBQVUsSUFBSSxFQUFFO0FBQUEsSUFDdEMsQ0FBQztBQUFBLEVBQ0g7QUFFQSxNQUFHLGNBQWMsUUFBUSxjQUFjLEtBQUssU0FBUyxHQUFHO0FBQ3RELGtCQUFjLEtBQUssUUFBUSxDQUFDLFNBQVM7QUFDbkMscUJBQWUsS0FBSyxVQUFVLElBQUksRUFBRTtBQUFBLElBQ3RDLENBQUM7QUFBQSxFQUNIO0FBRUEsTUFBRyxjQUFjLGVBQWU7QUFDOUIsbUJBQWUsS0FBSyxvQkFBb0IsY0FBYyxhQUFhLEVBQUU7QUFBQSxFQUN2RTtBQUVBLE1BQUcsY0FBYyxRQUFRO0FBQ3ZCLFdBQU8sUUFBUSxjQUFjLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxNQUFNLE9BQU8sTUFBTTtBQUNoRSxxQkFBZSxLQUFLLFlBQVksSUFBSSxJQUFJLE9BQU8sRUFBRTtBQUFBLElBQ25ELENBQUM7QUFBQSxFQUNIO0FBRUEsTUFBRyxjQUFjLFFBQVE7QUFDdkIsV0FBTyxRQUFRLGNBQWMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLE1BQU0sT0FBTyxNQUFNO0FBQ2hFLHFCQUFlLEtBQUssWUFBWSxJQUFJLElBQUksT0FBTyxFQUFFO0FBQUEsSUFDbkQsQ0FBQztBQUFBLEVBQ0g7QUFFQSxNQUFHLGNBQWMsUUFBUTtBQUN2QixXQUFPLFFBQVEsY0FBYyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsS0FBSyxLQUFLLE1BQU07QUFDN0QscUJBQWUsS0FBSyxZQUFZLEdBQUcsSUFBSSxLQUFLLEVBQUU7QUFBQSxJQUNoRCxDQUFDO0FBQUEsRUFDSDtBQUVBLE1BQUcsT0FBTztBQUNSLG1CQUFlLEtBQUssU0FBUztBQUFBLEVBQy9CO0FBRUEsUUFBTSxXQUFxQixjQUFjLFFBQVEsVUFBVSxNQUFNO0FBRWpFLE1BQUcsU0FBUyxRQUFRO0FBQ2xCLFVBQU0sY0FBc0Isa0JBQWtCLFdBQVcsYUFBYTtBQUV0RSxRQUFHLENBQUMsYUFBYTtBQUNmLFVBQUk7QUFBQSxFQUFLLE9BQU8sMkVBQTJFLFNBQVMsS0FBSztBQUN6RyxVQUFJLG9EQUFvRCxRQUFRLEtBQUs7QUFDckUsYUFBTztBQUFBLElBQ1Q7QUFFQSxVQUFNLGlCQUEyQjtBQUFBLE1BQy9CLEdBQUcsU0FBUztBQUFBLE1BQ1o7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxZQUFZLFNBQVMseUJBQXlCO0FBQUEsSUFDaEQ7QUFFQSxRQUFJO0FBQ0YsWUFBTSxNQUFNLGFBQWEsZ0JBQWdCLEVBQUMsVUFBVSxPQUFNLENBQUM7QUFDM0QsY0FBUSxRQUFRLDBCQUEwQixTQUFTLE1BQU0sYUFBYTtBQUFBLElBQ3hFLFNBQVMsT0FBTztBQUNkLFVBQUk7QUFBQSxFQUFLLE9BQU8sV0FBVyxNQUFNLE9BQU8sSUFBSSxTQUFTLEtBQUs7QUFFMUQsY0FBUSxLQUFLLHdCQUF3QjtBQUVyQyxlQUFTLENBQUM7QUFDVixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFdBQXFCLGNBQWMsUUFBUSxVQUFVLE1BQU07QUFDakUsUUFBTSxXQUFxQixjQUFjLFFBQVEsVUFBVSxNQUFNO0FBQ2pFLFFBQU0sV0FBcUIsY0FBYyxRQUFRLFVBQVUsTUFBTTtBQUNqRSxRQUFNLFdBQXFCLGNBQWMsUUFBUSxVQUFVLE1BQU07QUFDakUsUUFBTSxhQUF1QixDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsUUFBUTtBQUVoRixNQUFHLFdBQVcsUUFBUTtBQUNwQixRQUFJO0FBQ0YsWUFBTSxVQUFVLFlBQVksU0FBUyxTQUFTLFVBQVUsTUFBTTtBQUFBLElBQ2hFLFNBQVMsT0FBTztBQUNkLFVBQUk7QUFBQSxFQUFLLE9BQU8sV0FBVyxNQUFNLE9BQU8sSUFBSSxTQUFTLEtBQUs7QUFFMUQsY0FBUSxLQUFLLDRDQUE0QztBQUV6RCxlQUFTLENBQUM7QUFDVixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFdBQXFCLGNBQWMsUUFBUSxVQUFVLE1BQU07QUFDakUsUUFBTSxXQUFxQixjQUFjLFFBQVEsVUFBVSxNQUFNO0FBQ2pFLFFBQU0sWUFBc0IsY0FBYyxTQUFTLFVBQVUsTUFBTTtBQUNuRSxRQUFNLGFBQXVCLGNBQWMsVUFBVSxVQUFVLE1BQU07QUFDckUsUUFBTSxZQUFzQixDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxXQUFXLEdBQUcsVUFBVTtBQUVsRixNQUFHLFVBQVUsUUFBUTtBQUNuQixRQUFJO0FBQ0YsWUFBTSxVQUFVLFdBQVcsUUFBUSxTQUFTLFVBQVUsTUFBTTtBQUFBLElBQzlELFNBQVMsT0FBTztBQUNkLFVBQUk7QUFBQSxFQUFLLE9BQU8sV0FBVyxNQUFNLE9BQU8sSUFBSSxTQUFTLEtBQUs7QUFFMUQsY0FBUSxLQUFLLDJDQUEyQztBQUV4RCxlQUFTLENBQUM7QUFDVixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFVBQW9CLGNBQWMsT0FBTyxVQUFVLE1BQU07QUFFL0QsTUFBRyxRQUFRLFFBQVE7QUFDakIsUUFBSTtBQUNGLFlBQU0sVUFBVSxTQUFTLGFBQWEsU0FBUyxVQUFVLE1BQU07QUFBQSxJQUNqRSxTQUFTLE9BQU87QUFDZCxVQUFJO0FBQUEsRUFBSyxPQUFPLFdBQVcsTUFBTSxPQUFPLElBQUksU0FBUyxLQUFLO0FBRTFELGNBQVEsS0FBSywwQ0FBMEM7QUFFdkQsZUFBUyxDQUFDO0FBQ1YsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsVUFBUSxNQUFNLFFBQVEsNEJBQTRCLDJCQUEyQjtBQUU3RSxNQUFJO0FBQ0YsVUFBTSxNQUFNLGFBQWEsZ0JBQWdCLEVBQUMsVUFBVSxPQUFNLENBQUM7QUFFM0QsWUFBUSxRQUFRLGlDQUFpQztBQUFBLEVBQ25ELFNBQVMsT0FBTztBQUNkLFFBQUk7QUFBQSxFQUFLLE9BQU8sV0FBVyxNQUFNLE9BQU8sSUFBSSxTQUFTLEtBQUs7QUFFMUQsUUFBRyxDQUFDLE9BQU87QUFDVCxjQUFRLE1BQU0sS0FBSztBQUFBLElBQ3JCO0FBRUEsWUFBUSxLQUFLLHdCQUF3QjtBQUVyQyxhQUFTLENBQUM7QUFDVixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFDRixVQUFNLG9CQUFvQixTQUFTLFVBQVUsUUFBUSxLQUFLO0FBQUEsRUFDNUQsU0FBUyxXQUFXO0FBQ2xCLFFBQUk7QUFBQSxFQUFLLE9BQU8sNENBQTRDLFVBQVUsT0FBTyxJQUFJLFNBQVMsS0FBSztBQUUvRixZQUFRLEtBQUssa0NBQWtDO0FBRS9DLGFBQVMsQ0FBQztBQUNWLFdBQU87QUFBQSxFQUNUO0FBRUEsV0FBUyxDQUFDO0FBQ1YsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
export interface ServerlessOptions {
|
|
2
2
|
readonly cliName?: string;
|
|
3
3
|
readonly config?: string;
|
|
4
|
+
readonly debug?: boolean;
|
|
4
5
|
readonly host?: string;
|
|
5
6
|
readonly httpPort?: number;
|
|
6
7
|
readonly httpsPort?: number;
|
|
7
|
-
readonly wsPort?: number;
|
|
8
8
|
readonly quiet?: boolean;
|
|
9
9
|
readonly remove?: boolean;
|
|
10
|
-
readonly variables?: string;
|
|
11
|
-
readonly usePublicIp?: boolean;
|
|
12
|
-
readonly debug?: boolean;
|
|
13
|
-
readonly printOutput?: boolean;
|
|
14
10
|
readonly test?: boolean;
|
|
11
|
+
readonly usePublicIp?: boolean;
|
|
12
|
+
readonly variables?: string;
|
|
13
|
+
readonly wsPort?: number;
|
|
15
14
|
}
|
|
16
15
|
export type ServerlessCallback = (status: number) => void;
|
|
17
16
|
export declare const serverless: (cmd: ServerlessOptions, callback?: ServerlessCallback) => Promise<number>;
|
|
@@ -2,7 +2,7 @@ import boxen from "boxen";
|
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
import express from "express";
|
|
4
4
|
import { readFileSync, existsSync, mkdirSync, writeFileSync } from "fs";
|
|
5
|
-
import {
|
|
5
|
+
import { homedir } from "os";
|
|
6
6
|
import { resolve as pathResolve, join } from "path";
|
|
7
7
|
import { WebSocketServer } from "ws";
|
|
8
8
|
import { LexConfig } from "../../LexConfig.js";
|
|
@@ -57,35 +57,6 @@ const fetchPublicIp = (forceRefresh = false) => new Promise((resolve) => {
|
|
|
57
57
|
resolve(ip);
|
|
58
58
|
}).catch(() => resolve(void 0));
|
|
59
59
|
});
|
|
60
|
-
const getNetworkAddresses = () => {
|
|
61
|
-
const interfaces = networkInterfaces();
|
|
62
|
-
const addresses = {
|
|
63
|
-
local: "localhost",
|
|
64
|
-
private: null,
|
|
65
|
-
public: null
|
|
66
|
-
};
|
|
67
|
-
for (const name of Object.keys(interfaces)) {
|
|
68
|
-
const networkInterface = interfaces[name];
|
|
69
|
-
if (!networkInterface) {
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
for (const iface of networkInterface) {
|
|
73
|
-
if (iface.family === "IPv4" && !iface.internal) {
|
|
74
|
-
const ip = iface.address;
|
|
75
|
-
if (ip.startsWith("10.") || ip.startsWith("192.168.") || ip.startsWith("172.")) {
|
|
76
|
-
if (!addresses.private) {
|
|
77
|
-
addresses.private = ip;
|
|
78
|
-
}
|
|
79
|
-
} else {
|
|
80
|
-
if (!addresses.public) {
|
|
81
|
-
addresses.public = ip;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return addresses;
|
|
88
|
-
};
|
|
89
60
|
const displayServerStatus = (httpPort, httpsPort, wsPort, host, quiet, publicIp) => {
|
|
90
61
|
if (quiet) {
|
|
91
62
|
return;
|
|
@@ -113,11 +84,11 @@ ${chalk.green("Public:")} ${chalk.underline(`http://${publicIp}:${httpPort}`)
|
|
|
113
84
|
${urlLines}
|
|
114
85
|
${chalk.yellow("Press Ctrl+C to stop the server")}`,
|
|
115
86
|
{
|
|
116
|
-
|
|
117
|
-
margin: 1,
|
|
118
|
-
borderStyle: "round",
|
|
87
|
+
backgroundColor: "#1a1a1a",
|
|
119
88
|
borderColor: "cyan",
|
|
120
|
-
|
|
89
|
+
borderStyle: "round",
|
|
90
|
+
margin: 1,
|
|
91
|
+
padding: 1
|
|
121
92
|
}
|
|
122
93
|
);
|
|
123
94
|
console.log(`
|
|
@@ -188,7 +159,7 @@ const captureConsoleLogs = (handler, quiet) => {
|
|
|
188
159
|
}
|
|
189
160
|
};
|
|
190
161
|
};
|
|
191
|
-
const createExpressServer = async (config, outputDir, httpPort, host, quiet, debug
|
|
162
|
+
const createExpressServer = async (config, outputDir, httpPort, host, quiet, debug) => {
|
|
192
163
|
const app = express();
|
|
193
164
|
app.use((req, res, next) => {
|
|
194
165
|
res.header("Access-Control-Allow-Origin", "*");
|
|
@@ -272,25 +243,24 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
272
243
|
originalConsoleLog(`[GraphQL] ${logMessage}`);
|
|
273
244
|
};
|
|
274
245
|
const context = {
|
|
275
|
-
|
|
276
|
-
res,
|
|
246
|
+
awsRequestId: "test-request-id",
|
|
277
247
|
functionName: "graphql",
|
|
278
248
|
functionVersion: "$LATEST",
|
|
249
|
+
getRemainingTimeInMillis: () => 3e4,
|
|
279
250
|
invokedFunctionArn: "arn:aws:lambda:us-east-1:123456789012:function:graphql",
|
|
280
|
-
memoryLimitInMB: "128",
|
|
281
|
-
awsRequestId: "test-request-id",
|
|
282
251
|
logGroupName: "/aws/lambda/graphql",
|
|
283
252
|
logStreamName: "test-log-stream",
|
|
284
|
-
|
|
253
|
+
req,
|
|
254
|
+
res
|
|
285
255
|
};
|
|
286
256
|
const wrappedHandler = captureConsoleLogs(graphqlHandler, quiet);
|
|
287
257
|
try {
|
|
288
258
|
const result = await wrappedHandler({
|
|
259
|
+
body: JSON.stringify(req.body),
|
|
260
|
+
headers: req.headers,
|
|
289
261
|
httpMethod: "POST",
|
|
290
262
|
path: graphqlPath,
|
|
291
|
-
|
|
292
|
-
queryStringParameters: {},
|
|
293
|
-
body: JSON.stringify(req.body)
|
|
263
|
+
queryStringParameters: {}
|
|
294
264
|
}, context);
|
|
295
265
|
console.log = originalConsoleLog;
|
|
296
266
|
if (result && typeof result === "object" && result.statusCode) {
|
|
@@ -319,7 +289,8 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
319
289
|
try {
|
|
320
290
|
const url = req.url || "/";
|
|
321
291
|
const method = req.method || "GET";
|
|
322
|
-
|
|
292
|
+
const pathname = req.path || url.split("?")[0];
|
|
293
|
+
log(`${method} ${url} (pathname: ${pathname})`, "info", false);
|
|
323
294
|
let matchedFunction = null;
|
|
324
295
|
if (config.functions) {
|
|
325
296
|
for (const [functionName, functionConfig] of Object.entries(config.functions)) {
|
|
@@ -328,7 +299,7 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
328
299
|
if (event.http) {
|
|
329
300
|
const eventPath = event.http.path || "/";
|
|
330
301
|
const eventMethod = event.http.method || "GET";
|
|
331
|
-
if (eventPath && eventPath ===
|
|
302
|
+
if (eventPath && eventPath === pathname && eventMethod === method) {
|
|
332
303
|
matchedFunction = functionName;
|
|
333
304
|
break;
|
|
334
305
|
}
|
|
@@ -353,14 +324,14 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
353
324
|
queryStringParameters: req.query
|
|
354
325
|
};
|
|
355
326
|
const context = {
|
|
327
|
+
awsRequestId: "test-request-id",
|
|
356
328
|
functionName: matchedFunction,
|
|
357
329
|
functionVersion: "$LATEST",
|
|
330
|
+
getRemainingTimeInMillis: () => 3e4,
|
|
358
331
|
invokedFunctionArn: `arn:aws:lambda:us-east-1:123456789012:function:${matchedFunction}`,
|
|
359
|
-
memoryLimitInMB: "128",
|
|
360
|
-
awsRequestId: "test-request-id",
|
|
361
332
|
logGroupName: `/aws/lambda/${matchedFunction}`,
|
|
362
333
|
logStreamName: "test-log-stream",
|
|
363
|
-
|
|
334
|
+
memoryLimitInMB: "128"
|
|
364
335
|
};
|
|
365
336
|
try {
|
|
366
337
|
const result = await wrappedHandler(event, context);
|
|
@@ -392,7 +363,7 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
392
363
|
});
|
|
393
364
|
return app;
|
|
394
365
|
};
|
|
395
|
-
const createWebSocketServer = (config, outputDir, wsPort, quiet, debug
|
|
366
|
+
const createWebSocketServer = (config, outputDir, wsPort, quiet, debug) => {
|
|
396
367
|
const wss = new WebSocketServer({ port: wsPort });
|
|
397
368
|
wss.on("connection", async (ws, req) => {
|
|
398
369
|
log(`WebSocket connection established: ${req.url}`, "info", false);
|
|
@@ -423,24 +394,24 @@ const createWebSocketServer = (config, outputDir, wsPort, quiet, debug, printOut
|
|
|
423
394
|
if (handler) {
|
|
424
395
|
const wrappedHandler = captureConsoleLogs(handler, quiet);
|
|
425
396
|
const event = {
|
|
397
|
+
body: data.body || null,
|
|
426
398
|
requestContext: {
|
|
427
|
-
routeKey: data.action || "$default",
|
|
428
|
-
connectionId: "test-connection-id",
|
|
429
399
|
apiGateway: {
|
|
430
400
|
endpoint: `ws://localhost:${wsPort}`
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
|
|
401
|
+
},
|
|
402
|
+
connectionId: "test-connection-id",
|
|
403
|
+
routeKey: data.action || "$default"
|
|
404
|
+
}
|
|
434
405
|
};
|
|
435
406
|
const context = {
|
|
407
|
+
awsRequestId: "test-request-id",
|
|
436
408
|
functionName: matchedFunction,
|
|
437
409
|
functionVersion: "$LATEST",
|
|
410
|
+
getRemainingTimeInMillis: () => 3e4,
|
|
438
411
|
invokedFunctionArn: `arn:aws:lambda:us-east-1:123456789012:function:${matchedFunction}`,
|
|
439
|
-
memoryLimitInMB: "128",
|
|
440
|
-
awsRequestId: "test-request-id",
|
|
441
412
|
logGroupName: `/aws/lambda/${matchedFunction}`,
|
|
442
413
|
logStreamName: "test-log-stream",
|
|
443
|
-
|
|
414
|
+
memoryLimitInMB: "128"
|
|
444
415
|
};
|
|
445
416
|
const result = await wrappedHandler(event, context);
|
|
446
417
|
if (result && typeof result === "object" && result.statusCode) {
|
|
@@ -498,17 +469,16 @@ const serverless = async (cmd, callback = () => ({})) => {
|
|
|
498
469
|
const {
|
|
499
470
|
cliName = "Lex",
|
|
500
471
|
config,
|
|
472
|
+
debug = false,
|
|
501
473
|
host = "localhost",
|
|
502
474
|
httpPort = 3e3,
|
|
503
475
|
httpsPort = 3001,
|
|
504
|
-
wsPort = 3002,
|
|
505
476
|
quiet = false,
|
|
506
477
|
remove = false,
|
|
478
|
+
test = false,
|
|
507
479
|
usePublicIp,
|
|
508
480
|
variables,
|
|
509
|
-
|
|
510
|
-
printOutput = false,
|
|
511
|
-
test = false
|
|
481
|
+
wsPort = 3002
|
|
512
482
|
} = cmd;
|
|
513
483
|
const spinner = createSpinner(quiet);
|
|
514
484
|
log(`${cliName} starting serverless development server...`, "info", quiet);
|
|
@@ -569,11 +539,11 @@ ${cliName} Error: Environment variables option is not a valid JSON object.`, "er
|
|
|
569
539
|
...serverlessConfig,
|
|
570
540
|
custom: {
|
|
571
541
|
"serverless-offline": {
|
|
542
|
+
cors: serverlessConfig.custom?.["serverless-offline"]?.cors !== false,
|
|
543
|
+
host: serverlessConfig.custom?.["serverless-offline"]?.host || host,
|
|
572
544
|
httpPort: serverlessConfig.custom?.["serverless-offline"]?.httpPort || httpPort,
|
|
573
545
|
httpsPort: serverlessConfig.custom?.["serverless-offline"]?.httpsPort || httpsPort,
|
|
574
|
-
wsPort: serverlessConfig.custom?.["serverless-offline"]?.wsPort || wsPort
|
|
575
|
-
host: serverlessConfig.custom?.["serverless-offline"]?.host || host,
|
|
576
|
-
cors: serverlessConfig.custom?.["serverless-offline"]?.cors !== false
|
|
546
|
+
wsPort: serverlessConfig.custom?.["serverless-offline"]?.wsPort || wsPort
|
|
577
547
|
}
|
|
578
548
|
}
|
|
579
549
|
};
|
|
@@ -592,16 +562,14 @@ ${cliName} Error: Environment variables option is not a valid JSON object.`, "er
|
|
|
592
562
|
httpPort2,
|
|
593
563
|
host2,
|
|
594
564
|
quiet,
|
|
595
|
-
debug
|
|
596
|
-
printOutput
|
|
565
|
+
debug
|
|
597
566
|
);
|
|
598
567
|
const wsServer = createWebSocketServer(
|
|
599
568
|
finalConfig,
|
|
600
569
|
outputDir,
|
|
601
570
|
wsPort2,
|
|
602
571
|
quiet,
|
|
603
|
-
debug
|
|
604
|
-
printOutput
|
|
572
|
+
debug
|
|
605
573
|
);
|
|
606
574
|
wsServer.on("error", (error) => {
|
|
607
575
|
log(`WebSocket server error: ${error.message}`, "error", quiet);
|
|
@@ -659,4 +627,4 @@ ${cliName} Error: ${error.message}`, "error", quiet);
|
|
|
659
627
|
export {
|
|
660
628
|
serverless
|
|
661
629
|
};
|
|
662
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlcmxlc3Mvc2VydmVybGVzcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge25ldHdvcmtJbnRlcmZhY2VzLCBob21lZGlyfSBmcm9tICdvcyc7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmUsIGpvaW59IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtXZWJTb2NrZXRTZXJ2ZXJ9IGZyb20gJ3dzJztcblxuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NyZWF0ZVNwaW5uZXIsIHJlbW92ZUZpbGVzfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVybGVzc09wdGlvbnMge1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBjb25maWc/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBodHRwc1BvcnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHdzUG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSByZW1vdmU/OiBib29sZWFuO1xuICByZWFkb25seSB2YXJpYWJsZXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVzZVB1YmxpY0lwPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBwcmludE91dHB1dD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmludGVyZmFjZSBQdWJsaWNJcENhY2hlIHtcbiAgaXA6IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTZXJ2ZXJsZXNzSGFuZGxlciB7XG4gIHJlYWRvbmx5IGhhbmRsZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgZXZlbnRzPzogQXJyYXk8e1xuICAgIHJlYWRvbmx5IGh0dHA/OiB7XG4gICAgICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgY29ycz86IGJvb2xlYW47XG4gICAgfTtcbiAgICByZWFkb25seSB3ZWJzb2NrZXQ/OiB7XG4gICAgICByZWFkb25seSByb3V0ZT86IHN0cmluZztcbiAgICB9O1xuICB9Pjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NDb25maWcge1xuICByZWFkb25seSBmdW5jdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTZXJ2ZXJsZXNzSGFuZGxlcj47XG4gIHJlYWRvbmx5IGN1c3RvbT86IHtcbiAgICByZWFkb25seSAnc2VydmVybGVzcy1vZmZsaW5lJz86IHtcbiAgICAgIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgIH07XG4gIH07XG59XG5cbmNvbnN0IGdldENhY2hlRGlyID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGNhY2hlRGlyID0gam9pbihob21lZGlyKCksICcubGV4LWNhY2hlJyk7XG4gIGlmKCFleGlzdHNTeW5jKGNhY2hlRGlyKSkge1xuICAgIG1rZGlyU3luYyhjYWNoZURpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICB9XG4gIHJldHVybiBjYWNoZURpcjtcbn07XG5cbmNvbnN0IGdldENhY2hlUGF0aCA9ICgpOiBzdHJpbmcgPT4gam9pbihnZXRDYWNoZURpcigpLCAncHVibGljLWlwLmpzb24nKTtcblxuY29uc3QgcmVhZFB1YmxpY0lwQ2FjaGUgPSAoKTogUHVibGljSXBDYWNoZSB8IG51bGwgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZURhdGEgPSByZWFkRmlsZVN5bmMoY2FjaGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0gSlNPTi5wYXJzZShjYWNoZURhdGEpO1xuXG4gICAgLy8gQ2hlY2sgaWYgY2FjaGUgaXMgb2xkZXIgdGhhbiAxIHdlZWtcbiAgICBjb25zdCBvbmVXZWVrTXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICBpZihEYXRlLm5vdygpIC0gY2FjaGUudGltZXN0YW1wID4gb25lV2Vla01zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCB3cml0ZVB1YmxpY0lwQ2FjaGUgPSAoaXA6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSB7XG4gICAgaXAsXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gIH07XG4gIHdyaXRlRmlsZVN5bmMoY2FjaGVQYXRoLCBKU09OLnN0cmluZ2lmeShjYWNoZSwgbnVsbCwgMikpO1xufTtcblxuY29uc3QgZmV0Y2hQdWJsaWNJcCA9IChmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICBpZighZm9yY2VSZWZyZXNoKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcmVhZFB1YmxpY0lwQ2FjaGUoKTtcbiAgICBpZihjYWNoZWQpIHtcbiAgICAgIHJlc29sdmUoY2FjaGVkLmlwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgZmV0Y2ggaW5zdGVhZCBvZiBodHRwc1xuICBmZXRjaCgnaHR0cHM6Ly9hcGkuaXBpZnkub3JnJylcbiAgICAudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBpcCA9IGRhdGEudHJpbSgpO1xuICAgICAgaWYoaXApIHtcbiAgICAgICAgd3JpdGVQdWJsaWNJcENhY2hlKGlwKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoaXApO1xuICAgIH0pXG4gICAgLmNhdGNoKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSk7XG59KTtcblxuY29uc3QgZ2V0TmV0d29ya0FkZHJlc3NlcyA9ICgpID0+IHtcbiAgY29uc3QgaW50ZXJmYWNlcyA9IG5ldHdvcmtJbnRlcmZhY2VzKCk7XG4gIGNvbnN0IGFkZHJlc3NlcyA9IHtcbiAgICBsb2NhbDogJ2xvY2FsaG9zdCcsXG4gICAgcHJpdmF0ZTogbnVsbCxcbiAgICBwdWJsaWM6IG51bGxcbiAgfTtcblxuICBmb3IoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhpbnRlcmZhY2VzKSkge1xuICAgIGNvbnN0IG5ldHdvcmtJbnRlcmZhY2UgPSBpbnRlcmZhY2VzW25hbWVdO1xuICAgIGlmKCFuZXR3b3JrSW50ZXJmYWNlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IoY29uc3QgaWZhY2Ugb2YgbmV0d29ya0ludGVyZmFjZSkge1xuICAgICAgaWYoaWZhY2UuZmFtaWx5ID09PSAnSVB2NCcgJiYgIWlmYWNlLmludGVybmFsKSB7XG4gICAgICAgIGNvbnN0IGlwID0gaWZhY2UuYWRkcmVzcztcblxuICAgICAgICBpZihpcC5zdGFydHNXaXRoKCcxMC4nKSB8fCBpcC5zdGFydHNXaXRoKCcxOTIuMTY4LicpIHx8IGlwLnN0YXJ0c1dpdGgoJzE3Mi4nKSkge1xuICAgICAgICAgIGlmKCFhZGRyZXNzZXMucHJpdmF0ZSkge1xuICAgICAgICAgICAgYWRkcmVzc2VzLnByaXZhdGUgPSBpcDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYoIWFkZHJlc3Nlcy5wdWJsaWMpIHtcbiAgICAgICAgICAgIGFkZHJlc3Nlcy5wdWJsaWMgPSBpcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWRkcmVzc2VzO1xufTtcblxuY29uc3QgZGlzcGxheVNlcnZlclN0YXR1cyA9IChcbiAgaHR0cFBvcnQ6IG51bWJlcixcbiAgaHR0cHNQb3J0OiBudW1iZXIsXG4gIHdzUG9ydDogbnVtYmVyLFxuICBob3N0OiBzdHJpbmcsXG4gIHF1aWV0OiBib29sZWFuLFxuICBwdWJsaWNJcD86IHN0cmluZ1xuKSA9PiB7XG4gIGlmKHF1aWV0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaHR0cFVybCA9IGBodHRwOi8vJHtob3N0fToke2h0dHBQb3J0fWA7XG4gIGNvbnN0IGh0dHBzVXJsID0gYGh0dHBzOi8vJHtob3N0fToke2h0dHBzUG9ydH1gO1xuICBjb25zdCB3c1VybCA9IGB3czovLyR7aG9zdH06JHt3c1BvcnR9YDtcbiAgY29uc3Qgd3NzVXJsID0gYHdzczovLyR7aG9zdH06JHt3c1BvcnR9YDtcblxuICBsZXQgdXJsTGluZXMgPSBgJHtjaGFsay5ncmVlbignSFRUUDonKX0gICAgICAke2NoYWxrLnVuZGVybGluZShodHRwVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignSFRUUFM6Jyl9ICAgICAke2NoYWxrLnVuZGVybGluZShodHRwc1VybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ1dlYlNvY2tldDonKX0gJHtjaGFsay51bmRlcmxpbmUod3NVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdXU1M6Jyl9ICAgICAgICR7Y2hhbGsudW5kZXJsaW5lKHdzc1VybCl9XFxuYDtcblxuICBpZihwdWJsaWNJcCkge1xuICAgIHVybExpbmVzICs9IGBcXG4ke2NoYWxrLmdyZWVuKCdQdWJsaWM6Jyl9ICAgICR7Y2hhbGsudW5kZXJsaW5lKGBodHRwOi8vJHtwdWJsaWNJcH06JHtodHRwUG9ydH1gKX1cXG5gO1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzQm94ID0gYm94ZW4oXG4gICAgYCR7Y2hhbGsuY3lhbi5ib2xkKCdcdUQ4M0RcdURFODAgU2VydmVybGVzcyBEZXZlbG9wbWVudCBTZXJ2ZXIgUnVubmluZycpfVxcblxcbiR7dXJsTGluZXN9XFxuYCArXG4gICAgYCR7Y2hhbGsueWVsbG93KCdQcmVzcyBDdHJsK0MgdG8gc3RvcCB0aGUgc2VydmVyJyl9YCxcbiAgICB7XG4gICAgICBwYWRkaW5nOiAxLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgYm9yZGVyU3R5bGU6ICdyb3VuZCcsXG4gICAgICBib3JkZXJDb2xvcjogJ2N5YW4nLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzFhMWExYSdcbiAgICB9XG4gICk7XG5cbiAgY29uc29sZS5sb2coYFxcbiR7c3RhdHVzQm94fVxcbmApO1xufTtcblxuY29uc3QgbG9hZEhhbmRsZXIgPSBhc3luYyAoaGFuZGxlclBhdGg6IHN0cmluZywgb3V0cHV0RGlyOiBzdHJpbmcpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGhSZXNvbHZlKG91dHB1dERpciwgaGFuZGxlclBhdGgpO1xuICAgIGxvZyhgTG9hZGluZyBoYW5kbGVyIGZyb206ICR7ZnVsbFBhdGh9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICBpZighZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSGFuZGxlciBmaWxlIG5vdCBmb3VuZDogJHtmdWxsUGF0aH1gKTtcbiAgICB9XG5cbiAgICAvLyBEeW5hbWljIGltcG9ydCBvZiB0aGUgaGFuZGxlciB3aXRoIGJldHRlciBlcnJvciBoYW5kbGluZ1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyTW9kdWxlID0gYXdhaXQgaW1wb3J0KGZ1bGxQYXRoKTtcbiAgICAgIGxvZyhgSGFuZGxlciBtb2R1bGUgbG9hZGVkOiAke09iamVjdC5rZXlzKGhhbmRsZXJNb2R1bGUpfWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlck1vZHVsZS5kZWZhdWx0IHx8IGhhbmRsZXJNb2R1bGUuaGFuZGxlciB8fCBoYW5kbGVyTW9kdWxlO1xuICAgICAgbG9nKGBIYW5kbGVyIGZvdW5kOiAke3R5cGVvZiBoYW5kbGVyfWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcjtcbiAgICB9IGNhdGNoIChpbXBvcnRFcnJvcikge1xuICAgICAgbG9nKGBJbXBvcnQgZXJyb3IgZm9yIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06ICR7aW1wb3J0RXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBFcnJvciBsb2FkaW5nIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGNhcHR1cmVDb25zb2xlTG9ncyA9IChoYW5kbGVyOiBGdW5jdGlvbiwgcXVpZXQ6IGJvb2xlYW4pID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm4gaGFuZGxlcjtcbiAgfVxuXG4gIHJldHVybiBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgLy8gQ2FwdHVyZSBjb25zb2xlLmxvZywgY29uc29sZS5lcnJvciwgZXRjLlxuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVXYXJuID0gY29uc29sZS53YXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUluZm8gPSBjb25zb2xlLmluZm87XG5cbiAgICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc29sZS5sb2cgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0xPR10gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbRVJST1JdICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVFcnJvciguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS53YXJuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtXQVJOXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlV2FybiguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtJTkZPXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlSW5mbyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAvLyBPdXRwdXQgY2FwdHVyZWQgbG9nc1xuICAgICAgaWYobG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJy0tLSBIYW5kbGVyIENvbnNvbGUgT3V0cHV0IC0tLScpKTtcbiAgICAgICAgbG9ncy5mb3JFYWNoKChsb2cpID0+IGNvbnNvbGUubG9nKGNoYWxrLmdyYXkobG9nKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCctLS0gRW5kIEhhbmRsZXIgQ29uc29sZSBPdXRwdXQgLS0tJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGNvbnNvbGUgbWV0aG9kc1xuICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICBjb25zb2xlLmVycm9yID0gb3JpZ2luYWxDb25zb2xlRXJyb3I7XG4gICAgICBjb25zb2xlLndhcm4gPSBvcmlnaW5hbENvbnNvbGVXYXJuO1xuICAgICAgY29uc29sZS5pbmZvID0gb3JpZ2luYWxDb25zb2xlSW5mbztcbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBjcmVhdGVFeHByZXNzU2VydmVyID0gYXN5bmMgKGNvbmZpZzogU2VydmVybGVzc0NvbmZpZywgb3V0cHV0RGlyOiBzdHJpbmcsIGh0dHBQb3J0OiBudW1iZXIsIGhvc3Q6IHN0cmluZywgcXVpZXQ6IGJvb2xlYW4sIGRlYnVnOiBib29sZWFuLCBwcmludE91dHB1dDogYm9vbGVhbikgPT4ge1xuICBjb25zdCBhcHAgPSBleHByZXNzKCk7XG5cbiAgLy8gRW5hYmxlIENPUlNcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKicpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnLCAnR0VULCBQT1NULCBQVVQsIERFTEVURSwgUEFUQ0gsIE9QVElPTlMnKTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJywgJyonKTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscycsICd0cnVlJyk7XG5cbiAgICBpZihyZXEubWV0aG9kID09PSAnT1BUSU9OUycpIHtcbiAgICAgIHJlcy5zZW5kU3RhdHVzKDIwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFBhcnNlIEpTT04gYm9kaWVzXG4gIGFwcC51c2UoZXhwcmVzcy5qc29uKCkpO1xuXG4gIC8vIExvYWQgR3JhcGhRTCBoYW5kbGVyXG4gIGNvbnN0IGxvYWRHcmFwaFFMU2NoZW1hID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gZmluZCBhIEdyYXBoUUwgaGFuZGxlclxuICAgICAgbGV0IGdyYXBocWxIYW5kbGVyID0gbnVsbDtcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHAgJiYgZXZlbnQuaHR0cC5wYXRoKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgR3JhcGhRTCBlbmRwb2ludHNcbiAgICAgICAgICAgICAgICBpZihldmVudC5odHRwLnBhdGggPT09ICcvcHVibGljJyB8fCBldmVudC5odHRwLnBhdGggPT09ICcvZ3JhcGhxbCcpIHtcbiAgICAgICAgICAgICAgICAgIGdyYXBocWxIYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoZnVuY3Rpb25Db25maWcuaGFuZGxlciwgb3V0cHV0RGlyKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihncmFwaHFsSGFuZGxlcikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAgIGxvZygnRm91bmQgR3JhcGhRTCBoYW5kbGVyJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIHJldHVybiBncmFwaHFsSGFuZGxlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYEVycm9yIGxvYWRpbmcgR3JhcGhRTCBoYW5kbGVyOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNldCB1cCBHcmFwaFFMIGhhbmRsZXIgZm9yIEdyYXBoUUwgcmVxdWVzdHNcbiAgdHJ5IHtcbiAgICBjb25zdCBncmFwaHFsSGFuZGxlciA9IGF3YWl0IGxvYWRHcmFwaFFMU2NoZW1hKCk7XG4gICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgIC8vIEZpbmQgdGhlIEdyYXBoUUwgcGF0aCBmcm9tIHRoZSBzZXJ2ZXJsZXNzIGNvbmZpZ1xuICAgICAgbGV0IGdyYXBocWxQYXRoID0gJy9ncmFwaHFsJzsgLy8gZGVmYXVsdCBmYWxsYmFja1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbX2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Py5odHRwPy5wYXRoKSB7XG4gICAgICAgICAgICAgICAgZ3JhcGhxbFBhdGggPSBldmVudC5odHRwLnBhdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZ3JhcGhxbFBhdGggIT09ICcvZ3JhcGhxbCcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgR3JhcGhRTCBlbmRwb2ludCB3aXRoIGVuaGFuY2VkIGNvbnNvbGUubG9nIGNhcHR1cmVcbiAgICAgIGFwcC51c2UoZ3JhcGhxbFBhdGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICAvLyBHcmFwaFFMIERlYnVnIExvZ2dpbmdcbiAgICAgICAgaWYoZGVidWcgJiYgcmVxLmJvZHkgJiYgcmVxLmJvZHkucXVlcnkpIHtcbiAgICAgICAgICBsb2coJ1x1RDgzRFx1REQwRCBHcmFwaFFMIERlYnVnIE1vZGU6IEFuYWx5emluZyByZXF1ZXN0Li4uJywgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgbG9nKGBcdUQ4M0RcdURDREQgR3JhcGhRTCBRdWVyeTogJHtyZXEuYm9keS5xdWVyeX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBpZihyZXEuYm9keS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGxvZyhgXHVEODNEXHVEQ0NBIEdyYXBoUUwgVmFyaWFibGVzOiAke0pTT04uc3RyaW5naWZ5KHJlcS5ib2R5LnZhcmlhYmxlcywgbnVsbCwgMil9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlcS5ib2R5Lm9wZXJhdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIGxvZyhgXHVEODNDXHVERkY3XHVGRTBGICBHcmFwaFFMIE9wZXJhdGlvbjogJHtyZXEuYm9keS5vcGVyYXRpb25OYW1lfWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuaGFuY2VkIGNvbnNvbGUubG9nIGNhcHR1cmVcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlTG9nID0gY29uc29sZS5sb2c7XG4gICAgICAgIGNvbnN0IGxvZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgY29uc29sZS5sb2cgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBhcmdzLm1hcCgoYXJnKSA9PlxuICAgICAgICAgICAgKHR5cGVvZiBhcmcgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCAyKSA6IFN0cmluZyhhcmcpKVxuICAgICAgICAgICkuam9pbignICcpO1xuICAgICAgICAgIGxvZ3MucHVzaChsb2dNZXNzYWdlKTtcbiAgICAgICAgICBvcmlnaW5hbENvbnNvbGVMb2coYFtHcmFwaFFMXSAke2xvZ01lc3NhZ2V9YCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNvbnRleHQgZm9yIHRoZSBoYW5kbGVyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIHJlcyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdncmFwaHFsJyxcbiAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46ICdhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOmdyYXBocWwnLFxuICAgICAgICAgIG1lbW9yeUxpbWl0SW5NQjogJzEyOCcsXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICBsb2dHcm91cE5hbWU6ICcvYXdzL2xhbWJkYS9ncmFwaHFsJyxcbiAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gV3JhcCBoYW5kbGVyIHdpdGggY29uc29sZSBsb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhncmFwaHFsSGFuZGxlciwgcXVpZXQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGUgaGFuZGxlciB3aXRoIEdyYXBoUUwgcGFyYW1ldGVyc1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBwZWRIYW5kbGVyKHtcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIHBhdGg6IGdyYXBocWxQYXRoLFxuICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHt9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxLmJvZHkpXG4gICAgICAgICAgfSwgY29udGV4dCk7XG5cbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgdGhlIHJlc3VsdFxuICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICBpZihyZXN1bHQuaGVhZGVycykge1xuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gUmVzdG9yZSBjb25zb2xlLmxvZ1xuICAgICAgICAgIGNvbnNvbGUubG9nID0gb3JpZ2luYWxDb25zb2xlTG9nO1xuICAgICAgICAgIGxvZyhgR3JhcGhRTCBoYW5kbGVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZX0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbG9nKGBHcmFwaFFMIGVuZHBvaW50IGF2YWlsYWJsZSBhdCBodHRwOi8vJHtob3N0fToke2h0dHBQb3J0fSR7Z3JhcGhxbFBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgRXJyb3Igc2V0dGluZyB1cCBHcmFwaFFMOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgZm9yIG5vbi1HcmFwaFFMIHJvdXRlcyAtIGhhbmRsZSBhbGwgcmVtYWluaW5nIHJvdXRlc1xuICBhcHAudXNlKCcvJywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IHJlcS51cmwgfHwgJy8nO1xuICAgICAgY29uc3QgbWV0aG9kID0gcmVxLm1ldGhvZCB8fCAnR0VUJztcblxuICAgICAgbG9nKGAke21ldGhvZH0gJHt1cmx9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICAgIC8vIEZpbmQgbWF0Y2hpbmcgZnVuY3Rpb25cbiAgICAgIGxldCBtYXRjaGVkRnVuY3Rpb24gPSBudWxsO1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGF0aCA9IGV2ZW50Lmh0dHAucGF0aCB8fCAnLyc7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRNZXRob2QgPSBldmVudC5odHRwLm1ldGhvZCB8fCAnR0VUJztcblxuICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBwYXRoIG1hdGNoaW5nIC0gYXZvaWQgY29tcGxleCByZWdleFxuICAgICAgICAgICAgICAgIGlmKGV2ZW50UGF0aCAmJiBldmVudFBhdGggPT09IHVybCAmJiBldmVudE1ldGhvZCA9PT0gbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uICYmIGNvbmZpZy5mdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXSkge1xuICAgICAgICAvLyBSZXNvbHZlIGhhbmRsZXIgcGF0aCByZWxhdGl2ZSB0byBvdXRwdXQgZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dLmhhbmRsZXI7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihoYW5kbGVyUGF0aCwgb3V0cHV0RGlyKTtcblxuICAgICAgICBpZihoYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSBjYXB0dXJlQ29uc29sZUxvZ3MoaGFuZGxlciwgcXVpZXQpO1xuXG4gICAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICBib2R5OiByZXEuYm9keSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgICAgICAgaHR0cE1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogdXJsLFxuICAgICAgICAgICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiByZXEucXVlcnlcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICBtZW1vcnlMaW1pdEluTUI6ICcxMjgnLFxuICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDBcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBwZWRIYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcblxuICAgICAgICAgICAgaWYocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdC5zdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICAgIHJlcy5zdGF0dXMocmVzdWx0LnN0YXR1c0NvZGUpO1xuICAgICAgICAgICAgICBpZihyZXN1bHQuaGVhZGVycykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5oZWFkZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXMuc2VuZChyZXN1bHQuYm9keSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXMuanNvbihyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coYEhhbmRsZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtlcnJvcjogJ0Z1bmN0aW9uIG5vdCBmb3VuZCd9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nKGBSb3V0ZSBoYW5kbGluZyBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZX0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGFwcDtcbn07XG5cbmNvbnN0IGNyZWF0ZVdlYlNvY2tldFNlcnZlciA9IChjb25maWc6IFNlcnZlcmxlc3NDb25maWcsIG91dHB1dERpcjogc3RyaW5nLCB3c1BvcnQ6IG51bWJlciwgcXVpZXQ6IGJvb2xlYW4sIGRlYnVnOiBib29sZWFuLCBwcmludE91dHB1dDogYm9vbGVhbikgPT4ge1xuICBjb25zdCB3c3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiB3c1BvcnR9KTtcblxuICB3c3Mub24oJ2Nvbm5lY3Rpb24nLCBhc3luYyAod3MsIHJlcSkgPT4ge1xuICAgIGxvZyhgV2ViU29ja2V0IGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQ6ICR7cmVxLnVybH1gLCAnaW5mbycsIGZhbHNlKTtcblxuICAgIHdzLm9uKCdtZXNzYWdlJywgYXN5bmMgKG1lc3NhZ2UpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgLy8gRmluZCBtYXRjaGluZyBXZWJTb2NrZXQgZnVuY3Rpb25cbiAgICAgICAgbGV0IG1hdGNoZWRGdW5jdGlvbiA9IG51bGw7XG5cbiAgICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYoZXZlbnQud2Vic29ja2V0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZSA9IGV2ZW50LndlYnNvY2tldC5yb3V0ZSB8fCAnJGNvbm5lY3QnO1xuICAgICAgICAgICAgICAgICAgaWYocm91dGUgPT09ICckZGVmYXVsdCcgfHwgcm91dGUgPT09IGRhdGEuYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGdW5jdGlvbiA9IGZ1bmN0aW9uTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihtYXRjaGVkRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uICYmIGNvbmZpZy5mdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXSkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0uaGFuZGxlciwgb3V0cHV0RGlyKTtcblxuICAgICAgICAgIGlmKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIC8vIFdyYXAgaGFuZGxlciB3aXRoIGNvbnNvbGUgbG9nIGNhcHR1cmVcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGhhbmRsZXIsIHF1aWV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dDoge1xuICAgICAgICAgICAgICAgIHJvdXRlS2V5OiBkYXRhLmFjdGlvbiB8fCAnJGRlZmF1bHQnLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogJ3Rlc3QtY29ubmVjdGlvbi1pZCcsXG4gICAgICAgICAgICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGB3czovL2xvY2FsaG9zdDoke3dzUG9ydH1gXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBib2R5OiBkYXRhLmJvZHkgfHwgbnVsbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBtYXRjaGVkRnVuY3Rpb24sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogJyRMQVRFU1QnLFxuICAgICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICAgIG1lbW9yeUxpbWl0SW5NQjogJzEyOCcsXG4gICAgICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3cmFwcGVkSGFuZGxlcihldmVudCwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSBMYW1iZGEgcmVzcG9uc2UgZm9ybWF0IGZvciBXZWJTb2NrZXRcbiAgICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgTGFtYmRhIHJlc3BvbnNlIG9iamVjdCwgZXh0cmFjdCB0aGUgYm9keVxuICAgICAgICAgICAgICBjb25zdCBib2R5ID0gcmVzdWx0LmJvZHkgfHwgJyc7XG4gICAgICAgICAgICAgIHdzLnNlbmQoYm9keSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IHJlc3BvbnNlLCBzdHJpbmdpZnkgaXRcbiAgICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7ZXJyb3I6ICdIYW5kbGVyIG5vdCBmb3VuZCd9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnV2ViU29ja2V0IGZ1bmN0aW9uIG5vdCBmb3VuZCd9KSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZyhgV2ViU29ja2V0IGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogZXJyb3IubWVzc2FnZX0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIGxvZygnV2ViU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkJywgJ2luZm8nLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB3c3M7XG59O1xuXG5jb25zdCBsb2FkRW52RmlsZSA9IChlbnZQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGlmKCFleGlzdHNTeW5jKGVudlBhdGgpKSB7XG4gICAgcmV0dXJuIGVudlZhcnM7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGVudkNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGVudkNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG5cbiAgICAgIC8vIFNraXAgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzXG4gICAgICBpZighdHJpbW1lZExpbmUgfHwgdHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBLRVk9dmFsdWUgZm9ybWF0XG4gICAgICBjb25zdCBlcXVhbEluZGV4ID0gdHJpbW1lZExpbmUuaW5kZXhPZignPScpO1xuICAgICAgaWYoZXF1YWxJbmRleCA+IDApIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc3Vic3RyaW5nKDAsIGVxdWFsSW5kZXgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0cmltbWVkTGluZS5zdWJzdHJpbmcoZXF1YWxJbmRleCArIDEpLnRyaW0oKTtcblxuICAgICAgICAvLyBSZW1vdmUgcXVvdGVzIGlmIHByZXNlbnRcbiAgICAgICAgY29uc3QgY2xlYW5WYWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpO1xuXG4gICAgICAgIGlmKGtleSkge1xuICAgICAgICAgIGVudlZhcnNba2V5XSA9IGNsZWFuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBXYXJuaW5nOiBDb3VsZCBub3QgbG9hZCAuZW52IGZpbGUgYXQgJHtlbnZQYXRofTogJHtlcnJvci5tZXNzYWdlfWAsICd3YXJuJywgZmFsc2UpO1xuICB9XG5cbiAgcmV0dXJuIGVudlZhcnM7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VydmVybGVzcyA9IGFzeW5jIChjbWQ6IFNlcnZlcmxlc3NPcHRpb25zLCBjYWxsYmFjazogU2VydmVybGVzc0NhbGxiYWNrID0gKCkgPT4gKHt9KSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgY29uZmlnLFxuICAgIGhvc3QgPSAnbG9jYWxob3N0JyxcbiAgICBodHRwUG9ydCA9IDMwMDAsXG4gICAgaHR0cHNQb3J0ID0gMzAwMSxcbiAgICB3c1BvcnQgPSAzMDAyLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgcmVtb3ZlID0gZmFsc2UsXG4gICAgdXNlUHVibGljSXAsXG4gICAgdmFyaWFibGVzLFxuICAgIGRlYnVnID0gZmFsc2UsXG4gICAgcHJpbnRPdXRwdXQgPSBmYWxzZSxcbiAgICB0ZXN0ID0gZmFsc2VcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IHN0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG5cbiAgY29uc3Qge291dHB1dEZ1bGxQYXRofSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgLy8gTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAuZW52IGZpbGVzXG4gIGNvbnN0IGVudlBhdGhzID0gW1xuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52JyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYubG9jYWwnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5kZXZlbG9wbWVudCcpXG4gIF07XG5cbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAvLyBMb2FkIGZyb20gLmVudiBmaWxlcyBpbiBvcmRlciAobGF0ZXIgZmlsZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzKVxuICBmb3IoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGZpbGVFbnZWYXJzID0gbG9hZEVudkZpbGUoZW52UGF0aCk7XG4gICAgaWYoT2JqZWN0LmtleXMoZmlsZUVudlZhcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZyhgTG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tOiAke2VudlBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICAgIGVudlZhcnMgPSB7Li4uZW52VmFycywgLi4uZmlsZUVudlZhcnN9O1xuICB9XG5cbiAgLy8gU3RhcnQgd2l0aCBkZWZhdWx0IE5PREVfRU5WIGFuZCBsb2FkZWQgLmVudiB2YXJpYWJsZXNcbiAgbGV0IHZhcmlhYmxlc09iajogb2JqZWN0ID0ge05PREVfRU5WOiAnZGV2ZWxvcG1lbnQnLCAuLi5lbnZWYXJzfTtcblxuICAvLyBPdmVycmlkZSB3aXRoIGNvbW1hbmQgbGluZSB2YXJpYWJsZXMgaWYgcHJvdmlkZWRcbiAgaWYodmFyaWFibGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaVZhcnMgPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgICB2YXJpYWJsZXNPYmogPSB7Li4udmFyaWFibGVzT2JqLCAuLi5jbGlWYXJzfTtcbiAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRW52aXJvbm1lbnQgdmFyaWFibGVzIG9wdGlvbiBpcyBub3QgYSB2YWxpZCBKU09OIG9iamVjdC5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3MuZW52ID0gey4uLnByb2Nlc3MuZW52LCAuLi52YXJpYWJsZXNPYmp9O1xuXG4gIC8vIElmIGluIHRlc3QgbW9kZSwgZXhpdCBlYXJseSBhZnRlciBsb2FkaW5nIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICBpZih0ZXN0KSB7XG4gICAgbG9nKCdUZXN0IG1vZGU6IEVudmlyb25tZW50IHZhcmlhYmxlcyBsb2FkZWQsIGV4aXRpbmcnLCAnaW5mbycsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmKHJlbW92ZSkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ0NsZWFuaW5nIG91dHB1dCBkaXJlY3RvcnkuLi4nKTtcbiAgICBhd2FpdCByZW1vdmVGaWxlcyhvdXRwdXRGdWxsUGF0aCB8fCAnJyk7XG4gICAgc3Bpbm5lci5zdWNjZWVkKCdTdWNjZXNzZnVsbHkgY2xlYW5lZCBvdXRwdXQgZGlyZWN0b3J5IScpO1xuICB9XG5cbiAgLy8gTG9hZCBzZXJ2ZXJsZXNzIGNvbmZpZ3VyYXRpb25cbiAgbGV0IHNlcnZlcmxlc3NDb25maWc6IFNlcnZlcmxlc3NDb25maWcgPSB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBjb25maWcgfHwgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ2xleC5jb25maWcubWpzJyk7XG4gICAgbG9nKGBMb2FkaW5nIHNlcnZlcmxlc3MgY29uZmlnIGZyb206ICR7Y29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgIGlmKGV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ01vZHVsZSA9IGF3YWl0IGltcG9ydChjb25maWdQYXRoKTtcbiAgICAgIHNlcnZlcmxlc3NDb25maWcgPSBjb25maWdNb2R1bGUuZGVmYXVsdD8uc2VydmVybGVzcyB8fCBjb25maWdNb2R1bGUuc2VydmVybGVzcyB8fCB7fTtcbiAgICAgIGxvZygnU2VydmVybGVzcyBjb25maWcgbG9hZGVkIHN1Y2Nlc3NmdWxseScsICdpbmZvJywgcXVpZXQpO1xuICAgICAgbG9nKGBMb2FkZWQgZnVuY3Rpb25zOiAke09iamVjdC5rZXlzKHNlcnZlcmxlc3NDb25maWcuZnVuY3Rpb25zIHx8IHt9KS5qb2luKCcsICcpfWAsICdpbmZvJywgcXVpZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coYE5vIHNlcnZlcmxlc3MgY29uZmlnIGZvdW5kIGF0ICR7Y29uZmlnUGF0aH0sIHVzaW5nIGRlZmF1bHRzYCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgRXJyb3IgbG9hZGluZyBzZXJ2ZXJsZXNzIGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAvLyBEb24ndCBleGl0LCBjb250aW51ZSB3aXRoIGVtcHR5IGNvbmZpZ1xuICB9XG5cbiAgLy8gTWVyZ2UgY29uZmlnIHdpdGggY29tbWFuZCBsaW5lIG9wdGlvbnNcbiAgY29uc3QgZmluYWxDb25maWc6IFNlcnZlcmxlc3NDb25maWcgPSB7XG4gICAgLi4uc2VydmVybGVzc0NvbmZpZyxcbiAgICBjdXN0b206IHtcbiAgICAgICdzZXJ2ZXJsZXNzLW9mZmxpbmUnOiB7XG4gICAgICAgIGh0dHBQb3J0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uaHR0cFBvcnQgfHwgaHR0cFBvcnQsXG4gICAgICAgIGh0dHBzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/Lmh0dHBzUG9ydCB8fCBodHRwc1BvcnQsXG4gICAgICAgIHdzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/LndzUG9ydCB8fCB3c1BvcnQsXG4gICAgICAgIGhvc3Q6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5ob3N0IHx8IGhvc3QsXG4gICAgICAgIGNvcnM6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5jb3JzICE9PSBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvdXRwdXREaXIgPSBvdXRwdXRGdWxsUGF0aCB8fCAnbGliJztcbiAgbG9nKGBVc2luZyBvdXRwdXQgZGlyZWN0b3J5OiAke291dHB1dERpcn1gLCAnaW5mbycsIHF1aWV0KTtcblxuICB0cnkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ1N0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJyk7XG5cbiAgICBjb25zdCBodHRwUG9ydCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwUG9ydCE7XG4gICAgY29uc3Qgd3NQb3J0ID0gZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLndzUG9ydCE7XG4gICAgY29uc3QgaG9zdCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5ob3N0ITtcblxuICAgIGxvZyhgQ3JlYXRpbmcgSFRUUCBzZXJ2ZXIgb24gJHtob3N0fToke2h0dHBQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuICAgIGxvZyhgQ3JlYXRpbmcgV2ViU29ja2V0IHNlcnZlciBvbiBwb3J0ICR7d3NQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgLy8gQ3JlYXRlIEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3QgZXhwcmVzc0FwcCA9IGF3YWl0IGNyZWF0ZUV4cHJlc3NTZXJ2ZXIoXG4gICAgICBmaW5hbENvbmZpZyxcbiAgICAgIG91dHB1dERpcixcbiAgICAgIGh0dHBQb3J0LFxuICAgICAgaG9zdCxcbiAgICAgIHF1aWV0LFxuICAgICAgZGVidWcsXG4gICAgICBwcmludE91dHB1dFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgV2ViU29ja2V0IHNlcnZlclxuICAgIGNvbnN0IHdzU2VydmVyID0gY3JlYXRlV2ViU29ja2V0U2VydmVyKFxuICAgICAgZmluYWxDb25maWcsXG4gICAgICBvdXRwdXREaXIsXG4gICAgICB3c1BvcnQsXG4gICAgICBxdWlldCxcbiAgICAgIGRlYnVnLFxuICAgICAgcHJpbnRPdXRwdXRcbiAgICApO1xuXG4gICAgLy8gSGFuZGxlIHNlcnZlciBlcnJvcnNcbiAgICB3c1NlcnZlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZyhgV2ViU29ja2V0IHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IFdlYlNvY2tldCBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0IEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3Qgc2VydmVyID0gZXhwcmVzc0FwcC5saXN0ZW4oaHR0cFBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgc3RhcnRlZC4nKTtcblxuICAgICAgZGlzcGxheVNlcnZlclN0YXR1cyhcbiAgICAgICAgaHR0cFBvcnQsXG4gICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICB3c1BvcnQsXG4gICAgICAgIGhvc3QsXG4gICAgICAgIHF1aWV0XG4gICAgICApO1xuXG4gICAgICBmZXRjaFB1YmxpY0lwKHVzZVB1YmxpY0lwKS50aGVuKChwdWJsaWNJcCkgPT4ge1xuICAgICAgICBpZihwdWJsaWNJcCkge1xuICAgICAgICAgIGRpc3BsYXlTZXJ2ZXJTdGF0dXMoXG4gICAgICAgICAgICBodHRwUG9ydCxcbiAgICAgICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICAgICAgd3NQb3J0LFxuICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgIHF1aWV0LFxuICAgICAgICAgICAgcHVibGljSXBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBFeHByZXNzIHNlcnZlciBlcnJvcnNcbiAgICBzZXJ2ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBsb2coYEV4cHJlc3Mgc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgRXhwcmVzcyBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBncmFjZWZ1bCBzaHV0ZG93blxuICAgIGNvbnN0IHNodXRkb3duID0gKCkgPT4ge1xuICAgICAgbG9nKCdcXG5TaHV0dGluZyBkb3duIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIHdzU2VydmVyLmNsb3NlKCk7XG4gICAgICBjYWxsYmFjaygwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbignU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG5cbiAgICAvLyBLZWVwIHRoZSBwcm9jZXNzIGFsaXZlXG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcblxuICAgIGxvZygnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgaXMgcnVubmluZy4gUHJlc3MgQ3RybCtDIHRvIHN0b3AuJywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAvLyBEb24ndCBjYWxsIGNhbGxiYWNrIGhlcmUsIGxldCB0aGUgcHJvY2VzcyBzdGF5IGFsaXZlXG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLicpO1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59OyJdLAogICJtYXBwaW5ncyI6ICJBQUlBLE9BQU8sV0FBVztBQUNsQixPQUFPLFdBQVc7QUFDbEIsT0FBTyxhQUFhO0FBQ3BCLFNBQVEsY0FBYyxZQUFZLFdBQVcscUJBQW9CO0FBQ2pFLFNBQVEsbUJBQW1CLGVBQWM7QUFDekMsU0FBUSxXQUFXLGFBQWEsWUFBVztBQUMzQyxTQUFRLHVCQUFzQjtBQUU5QixTQUFRLGlCQUFnQjtBQUN4QixTQUFRLGVBQWUsbUJBQWtCO0FBQ3pDLFNBQVEsV0FB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
|
|
630
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlcmxlc3Mvc2VydmVybGVzcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2hvbWVkaXJ9IGZyb20gJ29zJztcbmltcG9ydCB7cmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZSwgam9pbn0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1dlYlNvY2tldFNlcnZlcn0gZnJvbSAnd3MnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lciwgcmVtb3ZlRmlsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJsZXNzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBodHRwUG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlbW92ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VQdWJsaWNJcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbiAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmludGVyZmFjZSBQdWJsaWNJcENhY2hlIHtcbiAgaXA6IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTZXJ2ZXJsZXNzSGFuZGxlciB7XG4gIHJlYWRvbmx5IGhhbmRsZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgZXZlbnRzPzogQXJyYXk8e1xuICAgIHJlYWRvbmx5IGh0dHA/OiB7XG4gICAgICByZWFkb25seSBjb3JzPzogYm9vbGVhbjtcbiAgICAgIHJlYWRvbmx5IG1ldGhvZD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG4gICAgfTtcbiAgICByZWFkb25seSB3ZWJzb2NrZXQ/OiB7XG4gICAgICByZWFkb25seSByb3V0ZT86IHN0cmluZztcbiAgICB9O1xuICB9Pjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NDb25maWcge1xuICByZWFkb25seSBjdXN0b20/OiB7XG4gICAgcmVhZG9ubHkgJ3NlcnZlcmxlc3Mtb2ZmbGluZSc/OiB7XG4gICAgICByZWFkb25seSBjb3JzPzogYm9vbGVhbjtcbiAgICAgIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG4gICAgICByZWFkb25seSBodHRwUG9ydD86IG51bWJlcjtcbiAgICAgIHJlYWRvbmx5IGh0dHBzUG9ydD86IG51bWJlcjtcbiAgICAgIHJlYWRvbmx5IHdzUG9ydD86IG51bWJlcjtcbiAgICB9O1xuICB9O1xuICByZWFkb25seSBmdW5jdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTZXJ2ZXJsZXNzSGFuZGxlcj47XG59XG5cbmNvbnN0IGdldENhY2hlRGlyID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGNhY2hlRGlyID0gam9pbihob21lZGlyKCksICcubGV4LWNhY2hlJyk7XG4gIGlmKCFleGlzdHNTeW5jKGNhY2hlRGlyKSkge1xuICAgIG1rZGlyU3luYyhjYWNoZURpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICB9XG4gIHJldHVybiBjYWNoZURpcjtcbn07XG5cbmNvbnN0IGdldENhY2hlUGF0aCA9ICgpOiBzdHJpbmcgPT4gam9pbihnZXRDYWNoZURpcigpLCAncHVibGljLWlwLmpzb24nKTtcblxuY29uc3QgcmVhZFB1YmxpY0lwQ2FjaGUgPSAoKTogUHVibGljSXBDYWNoZSB8IG51bGwgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZURhdGEgPSByZWFkRmlsZVN5bmMoY2FjaGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0gSlNPTi5wYXJzZShjYWNoZURhdGEpO1xuXG4gICAgLy8gQ2hlY2sgaWYgY2FjaGUgaXMgb2xkZXIgdGhhbiAxIHdlZWtcbiAgICBjb25zdCBvbmVXZWVrTXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICBpZihEYXRlLm5vdygpIC0gY2FjaGUudGltZXN0YW1wID4gb25lV2Vla01zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCB3cml0ZVB1YmxpY0lwQ2FjaGUgPSAoaXA6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSB7XG4gICAgaXAsXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gIH07XG4gIHdyaXRlRmlsZVN5bmMoY2FjaGVQYXRoLCBKU09OLnN0cmluZ2lmeShjYWNoZSwgbnVsbCwgMikpO1xufTtcblxuY29uc3QgZmV0Y2hQdWJsaWNJcCA9IChmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICBpZighZm9yY2VSZWZyZXNoKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcmVhZFB1YmxpY0lwQ2FjaGUoKTtcbiAgICBpZihjYWNoZWQpIHtcbiAgICAgIHJlc29sdmUoY2FjaGVkLmlwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgZmV0Y2ggaW5zdGVhZCBvZiBodHRwc1xuICBmZXRjaCgnaHR0cHM6Ly9hcGkuaXBpZnkub3JnJylcbiAgICAudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBpcCA9IGRhdGEudHJpbSgpO1xuICAgICAgaWYoaXApIHtcbiAgICAgICAgd3JpdGVQdWJsaWNJcENhY2hlKGlwKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoaXApO1xuICAgIH0pXG4gICAgLmNhdGNoKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSk7XG59KTtcblxuY29uc3QgZGlzcGxheVNlcnZlclN0YXR1cyA9IChcbiAgaHR0cFBvcnQ6IG51bWJlcixcbiAgaHR0cHNQb3J0OiBudW1iZXIsXG4gIHdzUG9ydDogbnVtYmVyLFxuICBob3N0OiBzdHJpbmcsXG4gIHF1aWV0OiBib29sZWFuLFxuICBwdWJsaWNJcD86IHN0cmluZ1xuKSA9PiB7XG4gIGlmKHF1aWV0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaHR0cFVybCA9IGBodHRwOi8vJHtob3N0fToke2h0dHBQb3J0fWA7XG4gIGNvbnN0IGh0dHBzVXJsID0gYGh0dHBzOi8vJHtob3N0fToke2h0dHBzUG9ydH1gO1xuICBjb25zdCB3c1VybCA9IGB3czovLyR7aG9zdH06JHt3c1BvcnR9YDtcbiAgY29uc3Qgd3NzVXJsID0gYHdzczovLyR7aG9zdH06JHt3c1BvcnR9YDtcblxuICBsZXQgdXJsTGluZXMgPSBgJHtjaGFsay5ncmVlbignSFRUUDonKX0gICAgICAke2NoYWxrLnVuZGVybGluZShodHRwVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignSFRUUFM6Jyl9ICAgICAke2NoYWxrLnVuZGVybGluZShodHRwc1VybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ1dlYlNvY2tldDonKX0gJHtjaGFsay51bmRlcmxpbmUod3NVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdXU1M6Jyl9ICAgICAgICR7Y2hhbGsudW5kZXJsaW5lKHdzc1VybCl9XFxuYDtcblxuICBpZihwdWJsaWNJcCkge1xuICAgIHVybExpbmVzICs9IGBcXG4ke2NoYWxrLmdyZWVuKCdQdWJsaWM6Jyl9ICAgICR7Y2hhbGsudW5kZXJsaW5lKGBodHRwOi8vJHtwdWJsaWNJcH06JHtodHRwUG9ydH1gKX1cXG5gO1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzQm94ID0gYm94ZW4oXG4gICAgYCR7Y2hhbGsuY3lhbi5ib2xkKCdcdUQ4M0RcdURFODAgU2VydmVybGVzcyBEZXZlbG9wbWVudCBTZXJ2ZXIgUnVubmluZycpfVxcblxcbiR7dXJsTGluZXN9XFxuYCArXG4gICAgYCR7Y2hhbGsueWVsbG93KCdQcmVzcyBDdHJsK0MgdG8gc3RvcCB0aGUgc2VydmVyJyl9YCxcbiAgICB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjMWExYTFhJyxcbiAgICAgIGJvcmRlckNvbG9yOiAnY3lhbicsXG4gICAgICBib3JkZXJTdHlsZTogJ3JvdW5kJyxcbiAgICAgIG1hcmdpbjogMSxcbiAgICAgIHBhZGRpbmc6IDFcbiAgICB9XG4gICk7XG5cbiAgY29uc29sZS5sb2coYFxcbiR7c3RhdHVzQm94fVxcbmApO1xufTtcblxuY29uc3QgbG9hZEhhbmRsZXIgPSBhc3luYyAoaGFuZGxlclBhdGg6IHN0cmluZywgb3V0cHV0RGlyOiBzdHJpbmcpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGhSZXNvbHZlKG91dHB1dERpciwgaGFuZGxlclBhdGgpO1xuICAgIGxvZyhgTG9hZGluZyBoYW5kbGVyIGZyb206ICR7ZnVsbFBhdGh9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICBpZighZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSGFuZGxlciBmaWxlIG5vdCBmb3VuZDogJHtmdWxsUGF0aH1gKTtcbiAgICB9XG5cbiAgICAvLyBEeW5hbWljIGltcG9ydCBvZiB0aGUgaGFuZGxlciB3aXRoIGJldHRlciBlcnJvciBoYW5kbGluZ1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyTW9kdWxlID0gYXdhaXQgaW1wb3J0KGZ1bGxQYXRoKTtcbiAgICAgIGxvZyhgSGFuZGxlciBtb2R1bGUgbG9hZGVkOiAke09iamVjdC5rZXlzKGhhbmRsZXJNb2R1bGUpfWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlck1vZHVsZS5kZWZhdWx0IHx8IGhhbmRsZXJNb2R1bGUuaGFuZGxlciB8fCBoYW5kbGVyTW9kdWxlO1xuICAgICAgbG9nKGBIYW5kbGVyIGZvdW5kOiAke3R5cGVvZiBoYW5kbGVyfWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcjtcbiAgICB9IGNhdGNoIChpbXBvcnRFcnJvcikge1xuICAgICAgbG9nKGBJbXBvcnQgZXJyb3IgZm9yIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06ICR7aW1wb3J0RXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBFcnJvciBsb2FkaW5nIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGNhcHR1cmVDb25zb2xlTG9ncyA9IChoYW5kbGVyOiAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiBQcm9taXNlPGFueT4sIHF1aWV0OiBib29sZWFuKSA9PiB7XG4gIGlmKHF1aWV0KSB7XG4gICAgcmV0dXJuIGhhbmRsZXI7XG4gIH1cblxuICByZXR1cm4gYXN5bmMgKGV2ZW50OiBhbnksIGNvbnRleHQ6IGFueSkgPT4ge1xuICAgIC8vIENhcHR1cmUgY29uc29sZS5sb2csIGNvbnNvbGUuZXJyb3IsIGV0Yy5cbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVMb2cgPSBjb25zb2xlLmxvZztcbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlV2FybiA9IGNvbnNvbGUud2FybjtcbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVJbmZvID0gY29uc29sZS5pbmZvO1xuXG4gICAgY29uc3QgbG9nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnNvbGUubG9nID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtMT0ddICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVMb2coLi4uYXJncyk7XG4gICAgfTtcblxuICAgIGNvbnNvbGUuZXJyb3IgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0VSUk9SXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlRXJyb3IoLi4uYXJncyk7XG4gICAgfTtcblxuICAgIGNvbnNvbGUud2FybiA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbV0FSTl0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZVdhcm4oLi4uYXJncyk7XG4gICAgfTtcblxuICAgIGNvbnNvbGUuaW5mbyA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbSU5GT10gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUluZm8oLi4uYXJncyk7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcblxuICAgICAgLy8gT3V0cHV0IGNhcHR1cmVkIGxvZ3NcbiAgICAgIGlmKGxvZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCctLS0gSGFuZGxlciBDb25zb2xlIE91dHB1dCAtLS0nKSk7XG4gICAgICAgIGxvZ3MuZm9yRWFjaCgobG9nKSA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGxvZykpKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnLS0tIEVuZCBIYW5kbGVyIENvbnNvbGUgT3V0cHV0IC0tLScpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBjb25zb2xlIG1ldGhvZHNcbiAgICAgIGNvbnNvbGUubG9nID0gb3JpZ2luYWxDb25zb2xlTG9nO1xuICAgICAgY29uc29sZS5lcnJvciA9IG9yaWdpbmFsQ29uc29sZUVycm9yO1xuICAgICAgY29uc29sZS53YXJuID0gb3JpZ2luYWxDb25zb2xlV2FybjtcbiAgICAgIGNvbnNvbGUuaW5mbyA9IG9yaWdpbmFsQ29uc29sZUluZm87XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgY3JlYXRlRXhwcmVzc1NlcnZlciA9IGFzeW5jIChcbiAgY29uZmlnOiBTZXJ2ZXJsZXNzQ29uZmlnLFxuICBvdXRwdXREaXI6IHN0cmluZyxcbiAgaHR0cFBvcnQ6IG51bWJlcixcbiAgaG9zdDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbixcbiAgZGVidWc6IGJvb2xlYW5cbikgPT4ge1xuICBjb25zdCBhcHAgPSBleHByZXNzKCk7XG5cbiAgLy8gRW5hYmxlIENPUlNcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKicpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnLCAnR0VULCBQT1NULCBQVVQsIERFTEVURSwgUEFUQ0gsIE9QVElPTlMnKTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJywgJyonKTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscycsICd0cnVlJyk7XG5cbiAgICBpZihyZXEubWV0aG9kID09PSAnT1BUSU9OUycpIHtcbiAgICAgIHJlcy5zZW5kU3RhdHVzKDIwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFBhcnNlIEpTT04gYm9kaWVzXG4gIGFwcC51c2UoZXhwcmVzcy5qc29uKCkpO1xuXG4gIC8vIExvYWQgR3JhcGhRTCBoYW5kbGVyXG4gIGNvbnN0IGxvYWRHcmFwaFFMU2NoZW1hID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gZmluZCBhIEdyYXBoUUwgaGFuZGxlclxuICAgICAgbGV0IGdyYXBocWxIYW5kbGVyID0gbnVsbDtcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHAgJiYgZXZlbnQuaHR0cC5wYXRoKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgR3JhcGhRTCBlbmRwb2ludHNcbiAgICAgICAgICAgICAgICBpZihldmVudC5odHRwLnBhdGggPT09ICcvcHVibGljJyB8fCBldmVudC5odHRwLnBhdGggPT09ICcvZ3JhcGhxbCcpIHtcbiAgICAgICAgICAgICAgICAgIGdyYXBocWxIYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoZnVuY3Rpb25Db25maWcuaGFuZGxlciwgb3V0cHV0RGlyKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihncmFwaHFsSGFuZGxlcikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAgIGxvZygnRm91bmQgR3JhcGhRTCBoYW5kbGVyJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIHJldHVybiBncmFwaHFsSGFuZGxlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYEVycm9yIGxvYWRpbmcgR3JhcGhRTCBoYW5kbGVyOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNldCB1cCBHcmFwaFFMIGhhbmRsZXIgZm9yIEdyYXBoUUwgcmVxdWVzdHNcbiAgdHJ5IHtcbiAgICBjb25zdCBncmFwaHFsSGFuZGxlciA9IGF3YWl0IGxvYWRHcmFwaFFMU2NoZW1hKCk7XG4gICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgIC8vIEZpbmQgdGhlIEdyYXBoUUwgcGF0aCBmcm9tIHRoZSBzZXJ2ZXJsZXNzIGNvbmZpZ1xuICAgICAgbGV0IGdyYXBocWxQYXRoID0gJy9ncmFwaHFsJzsgLy8gZGVmYXVsdCBmYWxsYmFja1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbX2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Py5odHRwPy5wYXRoKSB7XG4gICAgICAgICAgICAgICAgZ3JhcGhxbFBhdGggPSBldmVudC5odHRwLnBhdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZ3JhcGhxbFBhdGggIT09ICcvZ3JhcGhxbCcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgR3JhcGhRTCBlbmRwb2ludCB3aXRoIGVuaGFuY2VkIGNvbnNvbGUubG9nIGNhcHR1cmVcbiAgICAgIGFwcC51c2UoZ3JhcGhxbFBhdGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICAvLyBHcmFwaFFMIERlYnVnIExvZ2dpbmdcbiAgICAgICAgaWYoZGVidWcgJiYgcmVxLmJvZHkgJiYgcmVxLmJvZHkucXVlcnkpIHtcbiAgICAgICAgICBsb2coJ1x1RDgzRFx1REQwRCBHcmFwaFFMIERlYnVnIE1vZGU6IEFuYWx5emluZyByZXF1ZXN0Li4uJywgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgbG9nKGBcdUQ4M0RcdURDREQgR3JhcGhRTCBRdWVyeTogJHtyZXEuYm9keS5xdWVyeX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBpZihyZXEuYm9keS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGxvZyhgXHVEODNEXHVEQ0NBIEdyYXBoUUwgVmFyaWFibGVzOiAke0pTT04uc3RyaW5naWZ5KHJlcS5ib2R5LnZhcmlhYmxlcywgbnVsbCwgMil9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlcS5ib2R5Lm9wZXJhdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIGxvZyhgXHVEODNDXHVERkY3XHVGRTBGICBHcmFwaFFMIE9wZXJhdGlvbjogJHtyZXEuYm9keS5vcGVyYXRpb25OYW1lfWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuaGFuY2VkIGNvbnNvbGUubG9nIGNhcHR1cmVcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlTG9nID0gY29uc29sZS5sb2c7XG4gICAgICAgIGNvbnN0IGxvZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgY29uc29sZS5sb2cgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBhcmdzLm1hcCgoYXJnKSA9PlxuICAgICAgICAgICAgKHR5cGVvZiBhcmcgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCAyKSA6IFN0cmluZyhhcmcpKVxuICAgICAgICAgICkuam9pbignICcpO1xuICAgICAgICAgIGxvZ3MucHVzaChsb2dNZXNzYWdlKTtcbiAgICAgICAgICBvcmlnaW5hbENvbnNvbGVMb2coYFtHcmFwaFFMXSAke2xvZ01lc3NhZ2V9YCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNvbnRleHQgZm9yIHRoZSBoYW5kbGVyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdncmFwaHFsJyxcbiAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwLFxuICAgICAgICAgIGludm9rZWRGdW5jdGlvbkFybjogJ2Fybjphd3M6bGFtYmRhOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6ZnVuY3Rpb246Z3JhcGhxbCcsXG4gICAgICAgICAgbG9nR3JvdXBOYW1lOiAnL2F3cy9sYW1iZGEvZ3JhcGhxbCcsXG4gICAgICAgICAgbG9nU3RyZWFtTmFtZTogJ3Rlc3QtbG9nLXN0cmVhbScsXG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIHJlc1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFdyYXAgaGFuZGxlciB3aXRoIGNvbnNvbGUgbG9nIGNhcHR1cmVcbiAgICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSBjYXB0dXJlQ29uc29sZUxvZ3MoZ3JhcGhxbEhhbmRsZXIsIHF1aWV0KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIENhbGwgdGhlIGhhbmRsZXIgd2l0aCBHcmFwaFFMIHBhcmFtZXRlcnNcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3cmFwcGVkSGFuZGxlcih7XG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXEuYm9keSksXG4gICAgICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycyxcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIHBhdGg6IGdyYXBocWxQYXRoLFxuICAgICAgICAgICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiB7fVxuICAgICAgICAgIH0sIGNvbnRleHQpO1xuXG4gICAgICAgICAgLy8gUmVzdG9yZSBjb25zb2xlLmxvZ1xuICAgICAgICAgIGNvbnNvbGUubG9nID0gb3JpZ2luYWxDb25zb2xlTG9nO1xuXG4gICAgICAgICAgLy8gSGFuZGxlIHRoZSByZXN1bHRcbiAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgIHJlcy5zdGF0dXMocmVzdWx0LnN0YXR1c0NvZGUpO1xuICAgICAgICAgICAgaWYocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzdWx0LmhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc2VuZChyZXN1bHQuYm9keSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIFJlc3RvcmUgY29uc29sZS5sb2dcbiAgICAgICAgICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZUxvZztcbiAgICAgICAgICBsb2coYEdyYXBoUUwgaGFuZGxlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxvZyhgR3JhcGhRTCBlbmRwb2ludCBhdmFpbGFibGUgYXQgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH0ke2dyYXBocWxQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIHNldHRpbmcgdXAgR3JhcGhRTDogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIGZvciBub24tR3JhcGhRTCByb3V0ZXMgLSBoYW5kbGUgYWxsIHJlbWFpbmluZyByb3V0ZXNcbiAgYXBwLnVzZSgnLycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSByZXEudXJsIHx8ICcvJztcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2QgfHwgJ0dFVCc7XG4gICAgICBjb25zdCBwYXRobmFtZSA9IHJlcS5wYXRoIHx8IHVybC5zcGxpdCgnPycpWzBdOyAvLyBFeHRyYWN0IHBhdGhuYW1lIHdpdGhvdXQgcXVlcnkgc3RyaW5nXG5cbiAgICAgIGxvZyhgJHttZXRob2R9ICR7dXJsfSAocGF0aG5hbWU6ICR7cGF0aG5hbWV9KWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICAvLyBGaW5kIG1hdGNoaW5nIGZ1bmN0aW9uXG4gICAgICBsZXQgbWF0Y2hlZEZ1bmN0aW9uID0gbnVsbDtcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudFBhdGggPSBldmVudC5odHRwLnBhdGggfHwgJy8nO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50TWV0aG9kID0gZXZlbnQuaHR0cC5tZXRob2QgfHwgJ0dFVCc7XG5cbiAgICAgICAgICAgICAgICAvLyBJbXByb3ZlZCBwYXRoIG1hdGNoaW5nIC0gY29tcGFyZSBwYXRobmFtZSB3aXRob3V0IHF1ZXJ5IHN0cmluZ1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50UGF0aCAmJiBldmVudFBhdGggPT09IHBhdGhuYW1lICYmIGV2ZW50TWV0aG9kID09PSBtZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgIG1hdGNoZWRGdW5jdGlvbiA9IGZ1bmN0aW9uTmFtZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihtYXRjaGVkRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihtYXRjaGVkRnVuY3Rpb24gJiYgY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dKSB7XG4gICAgICAgIC8vIFJlc29sdmUgaGFuZGxlciBwYXRoIHJlbGF0aXZlIHRvIG91dHB1dCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgaGFuZGxlclBhdGggPSBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0uaGFuZGxlcjtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IGxvYWRIYW5kbGVyKGhhbmRsZXJQYXRoLCBvdXRwdXREaXIpO1xuXG4gICAgICAgIGlmKGhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhoYW5kbGVyLCBxdWlldCk7XG5cbiAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIGJvZHk6IHJlcS5ib2R5LFxuICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICAgICAgICBodHRwTWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBwYXRoOiB1cmwsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHJlcS5xdWVyeVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwLFxuICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHttYXRjaGVkRnVuY3Rpb259YCxcbiAgICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICAgIGlmKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzdWx0LmhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZyhgSGFuZGxlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7ZXJyb3I6ICdIYW5kbGVyIG5vdCBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnRnVuY3Rpb24gbm90IGZvdW5kJ30pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYFJvdXRlIGhhbmRsaW5nIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXBwO1xufTtcblxuY29uc3QgY3JlYXRlV2ViU29ja2V0U2VydmVyID0gKFxuICBjb25maWc6IFNlcnZlcmxlc3NDb25maWcsXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIGRlYnVnOiBib29sZWFuXG4pID0+IHtcbiAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7cG9ydDogd3NQb3J0fSk7XG5cbiAgd3NzLm9uKCdjb25uZWN0aW9uJywgYXN5bmMgKHdzLCByZXEpID0+IHtcbiAgICBsb2coYFdlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkOiAke3JlcS51cmx9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICB3cy5vbignbWVzc2FnZScsIGFzeW5jIChtZXNzYWdlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIC8vIEZpbmQgbWF0Y2hpbmcgV2ViU29ja2V0IGZ1bmN0aW9uXG4gICAgICAgIGxldCBtYXRjaGVkRnVuY3Rpb24gPSBudWxsO1xuXG4gICAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50LndlYnNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSBldmVudC53ZWJzb2NrZXQucm91dGUgfHwgJyRjb25uZWN0JztcbiAgICAgICAgICAgICAgICAgIGlmKHJvdXRlID09PSAnJGRlZmF1bHQnIHx8IHJvdXRlID09PSBkYXRhLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbiAmJiBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0pIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dLmhhbmRsZXIsIG91dHB1dERpcik7XG5cbiAgICAgICAgICBpZihoYW5kbGVyKSB7XG4gICAgICAgICAgICAvLyBXcmFwIGhhbmRsZXIgd2l0aCBjb25zb2xlIGxvZyBjYXB0dXJlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhoYW5kbGVyLCBxdWlldCk7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgICAgYm9keTogZGF0YS5ib2R5IHx8IG51bGwsXG4gICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGB3czovL2xvY2FsaG9zdDoke3dzUG9ydH1gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6ICd0ZXN0LWNvbm5lY3Rpb24taWQnLFxuICAgICAgICAgICAgICAgIHJvdXRlS2V5OiBkYXRhLmFjdGlvbiB8fCAnJGRlZmF1bHQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiAoKSA9PiAzMDAwMCxcbiAgICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGUgTGFtYmRhIHJlc3BvbnNlIGZvcm1hdCBmb3IgV2ViU29ja2V0XG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIExhbWJkYSByZXNwb25zZSBvYmplY3QsIGV4dHJhY3QgdGhlIGJvZHlcbiAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHJlc3VsdC5ib2R5IHx8ICcnO1xuICAgICAgICAgICAgICB3cy5zZW5kKGJvZHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRpcmVjdCByZXNwb25zZSwgc3RyaW5naWZ5IGl0XG4gICAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogJ1dlYlNvY2tldCBmdW5jdGlvbiBub3QgZm91bmQnfSkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2coYFdlYlNvY2tldCBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB3cy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICBsb2coJ1dlYlNvY2tldCBjb25uZWN0aW9uIGNsb3NlZCcsICdpbmZvJywgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gd3NzO1xufTtcblxuY29uc3QgbG9hZEVudkZpbGUgPSAoZW52UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBpZighZXhpc3RzU3luYyhlbnZQYXRoKSkge1xuICAgIHJldHVybiBlbnZWYXJzO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBlbnZDb250ZW50ID0gcmVhZEZpbGVTeW5jKGVudlBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgbGluZXMgPSBlbnZDb250ZW50LnNwbGl0KCdcXG4nKTtcblxuICAgIGZvcihjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuXG4gICAgICAvLyBTa2lwIGVtcHR5IGxpbmVzIGFuZCBjb21tZW50c1xuICAgICAgaWYoIXRyaW1tZWRMaW5lIHx8IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFyc2UgS0VZPXZhbHVlIGZvcm1hdFxuICAgICAgY29uc3QgZXF1YWxJbmRleCA9IHRyaW1tZWRMaW5lLmluZGV4T2YoJz0nKTtcbiAgICAgIGlmKGVxdWFsSW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRyaW1tZWRMaW5lLnN1YnN0cmluZygwLCBlcXVhbEluZGV4KS50cmltKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdHJpbW1lZExpbmUuc3Vic3RyaW5nKGVxdWFsSW5kZXggKyAxKS50cmltKCk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHF1b3RlcyBpZiBwcmVzZW50XG4gICAgICAgIGNvbnN0IGNsZWFuVmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csICcnKTtcblxuICAgICAgICBpZihrZXkpIHtcbiAgICAgICAgICBlbnZWYXJzW2tleV0gPSBjbGVhblZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgV2FybmluZzogQ291bGQgbm90IGxvYWQgLmVudiBmaWxlIGF0ICR7ZW52UGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiBlbnZWYXJzO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlcnZlcmxlc3MgPSBhc3luYyAoXG4gIGNtZDogU2VydmVybGVzc09wdGlvbnMsXG4gIGNhbGxiYWNrOiBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoKSA9PiAoe30pXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7XG4gICAgY2xpTmFtZSA9ICdMZXgnLFxuICAgIGNvbmZpZyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIGhvc3QgPSAnbG9jYWxob3N0JyxcbiAgICBodHRwUG9ydCA9IDMwMDAsXG4gICAgaHR0cHNQb3J0ID0gMzAwMSxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIHJlbW92ZSA9IGZhbHNlLFxuICAgIHRlc3QgPSBmYWxzZSxcbiAgICB1c2VQdWJsaWNJcCxcbiAgICB2YXJpYWJsZXMsXG4gICAgd3NQb3J0ID0gMzAwMlxuICB9ID0gY21kO1xuXG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBsb2coYCR7Y2xpTmFtZX0gc3RhcnRpbmcgc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBjb25zdCB7b3V0cHV0RnVsbFBhdGh9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAvLyBMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIC5lbnYgZmlsZXNcbiAgY29uc3QgZW52UGF0aHMgPSBbXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5sb2NhbCcpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52LmRldmVsb3BtZW50JylcbiAgXTtcblxuICBsZXQgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIC8vIExvYWQgZnJvbSAuZW52IGZpbGVzIGluIG9yZGVyIChsYXRlciBmaWxlcyBvdmVycmlkZSBlYXJsaWVyIG9uZXMpXG4gIGZvcihjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3QgZmlsZUVudlZhcnMgPSBsb2FkRW52RmlsZShlbnZQYXRoKTtcbiAgICBpZihPYmplY3Qua2V5cyhmaWxlRW52VmFycykubGVuZ3RoID4gMCkge1xuICAgICAgbG9nKGBMb2FkZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb206ICR7ZW52UGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gICAgZW52VmFycyA9IHsuLi5lbnZWYXJzLCAuLi5maWxlRW52VmFyc307XG4gIH1cblxuICAvLyBTdGFydCB3aXRoIGRlZmF1bHQgTk9ERV9FTlYgYW5kIGxvYWRlZCAuZW52IHZhcmlhYmxlc1xuICBsZXQgdmFyaWFibGVzT2JqOiBvYmplY3QgPSB7Tk9ERV9FTlY6ICdkZXZlbG9wbWVudCcsIC4uLmVudlZhcnN9O1xuXG4gIC8vIE92ZXJyaWRlIHdpdGggY29tbWFuZCBsaW5lIHZhcmlhYmxlcyBpZiBwcm92aWRlZFxuICBpZih2YXJpYWJsZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpVmFycyA9IEpTT04ucGFyc2UodmFyaWFibGVzKTtcbiAgICAgIHZhcmlhYmxlc09iaiA9IHsuLi52YXJpYWJsZXNPYmosIC4uLmNsaVZhcnN9O1xuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3B0aW9uIGlzIG5vdCBhIHZhbGlkIEpTT04gb2JqZWN0LmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzcy5lbnYgPSB7Li4ucHJvY2Vzcy5lbnYsIC4uLnZhcmlhYmxlc09ian07XG5cbiAgLy8gSWYgaW4gdGVzdCBtb2RlLCBleGl0IGVhcmx5IGFmdGVyIGxvYWRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gIGlmKHRlc3QpIHtcbiAgICBsb2coJ1Rlc3QgbW9kZTogRW52aXJvbm1lbnQgdmFyaWFibGVzIGxvYWRlZCwgZXhpdGluZycsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQ2xlYW5pbmcgb3V0cHV0IGRpcmVjdG9yeS4uLicpO1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKG91dHB1dEZ1bGxQYXRoIHx8ICcnKTtcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBjbGVhbmVkIG91dHB1dCBkaXJlY3RvcnkhJyk7XG4gIH1cblxuICAvLyBMb2FkIHNlcnZlcmxlc3MgY29uZmlndXJhdGlvblxuICBsZXQgc2VydmVybGVzc0NvbmZpZzogU2VydmVybGVzc0NvbmZpZyA9IHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGNvbmZpZyB8fCBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbGV4LmNvbmZpZy5tanMnKTtcbiAgICBsb2coYExvYWRpbmcgc2VydmVybGVzcyBjb25maWcgZnJvbTogJHtjb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgaWYoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgY29uc3QgY29uZmlnTW9kdWxlID0gYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpO1xuICAgICAgc2VydmVybGVzc0NvbmZpZyA9IGNvbmZpZ01vZHVsZS5kZWZhdWx0Py5zZXJ2ZXJsZXNzIHx8IGNvbmZpZ01vZHVsZS5zZXJ2ZXJsZXNzIHx8IHt9O1xuICAgICAgbG9nKCdTZXJ2ZXJsZXNzIGNvbmZpZyBsb2FkZWQgc3VjY2Vzc2Z1bGx5JywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBsb2coYExvYWRlZCBmdW5jdGlvbnM6ICR7T2JqZWN0LmtleXMoc2VydmVybGVzc0NvbmZpZy5mdW5jdGlvbnMgfHwge30pLmpvaW4oJywgJyl9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgTm8gc2VydmVybGVzcyBjb25maWcgZm91bmQgYXQgJHtjb25maWdQYXRofSwgdXNpbmcgZGVmYXVsdHNgLCAnd2FybicsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBFcnJvciBsb2FkaW5nIHNlcnZlcmxlc3MgY29uZmlnOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIC8vIERvbid0IGV4aXQsIGNvbnRpbnVlIHdpdGggZW1wdHkgY29uZmlnXG4gIH1cblxuICAvLyBNZXJnZSBjb25maWcgd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9uc1xuICBjb25zdCBmaW5hbENvbmZpZzogU2VydmVybGVzc0NvbmZpZyA9IHtcbiAgICAuLi5zZXJ2ZXJsZXNzQ29uZmlnLFxuICAgIGN1c3RvbToge1xuICAgICAgJ3NlcnZlcmxlc3Mtb2ZmbGluZSc6IHtcbiAgICAgICAgY29yczogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/LmNvcnMgIT09IGZhbHNlLFxuICAgICAgICBob3N0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uaG9zdCB8fCBob3N0LFxuICAgICAgICBodHRwUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/Lmh0dHBQb3J0IHx8IGh0dHBQb3J0LFxuICAgICAgICBodHRwc1BvcnQ6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5odHRwc1BvcnQgfHwgaHR0cHNQb3J0LFxuICAgICAgICB3c1BvcnQ6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy53c1BvcnQgfHwgd3NQb3J0XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG91dHB1dERpciA9IG91dHB1dEZ1bGxQYXRoIHx8ICdsaWInO1xuICBsb2coYFVzaW5nIG91dHB1dCBkaXJlY3Rvcnk6ICR7b3V0cHV0RGlyfWAsICdpbmZvJywgcXVpZXQpO1xuXG4gIHRyeSB7XG4gICAgc3Bpbm5lci5zdGFydCgnU3RhcnRpbmcgc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuLi4nKTtcblxuICAgIGNvbnN0IGh0dHBQb3J0ID0gZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLmh0dHBQb3J0ITtcbiAgICBjb25zdCB3c1BvcnQgPSBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEud3NQb3J0ITtcbiAgICBjb25zdCBob3N0ID0gZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLmhvc3QhO1xuXG4gICAgbG9nKGBDcmVhdGluZyBIVFRQIHNlcnZlciBvbiAke2hvc3R9OiR7aHR0cFBvcnR9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgbG9nKGBDcmVhdGluZyBXZWJTb2NrZXQgc2VydmVyIG9uIHBvcnQgJHt3c1BvcnR9YCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAvLyBDcmVhdGUgRXhwcmVzcyBzZXJ2ZXJcbiAgICBjb25zdCBleHByZXNzQXBwID0gYXdhaXQgY3JlYXRlRXhwcmVzc1NlcnZlcihcbiAgICAgIGZpbmFsQ29uZmlnLFxuICAgICAgb3V0cHV0RGlyLFxuICAgICAgaHR0cFBvcnQsXG4gICAgICBob3N0LFxuICAgICAgcXVpZXQsXG4gICAgICBkZWJ1Z1xuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgV2ViU29ja2V0IHNlcnZlclxuICAgIGNvbnN0IHdzU2VydmVyID0gY3JlYXRlV2ViU29ja2V0U2VydmVyKFxuICAgICAgZmluYWxDb25maWcsXG4gICAgICBvdXRwdXREaXIsXG4gICAgICB3c1BvcnQsXG4gICAgICBxdWlldCxcbiAgICAgIGRlYnVnXG4gICAgKTtcblxuICAgIC8vIEhhbmRsZSBzZXJ2ZXIgZXJyb3JzXG4gICAgd3NTZXJ2ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBsb2coYFdlYlNvY2tldCBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBzdGFydCBXZWJTb2NrZXQgc2VydmVyLicpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG5cbiAgICAvLyBTdGFydCBFeHByZXNzIHNlcnZlclxuICAgIGNvbnN0IHNlcnZlciA9IGV4cHJlc3NBcHAubGlzdGVuKGh0dHBQb3J0LCBob3N0LCAoKSA9PiB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ1NlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyIHN0YXJ0ZWQuJyk7XG5cbiAgICAgIGRpc3BsYXlTZXJ2ZXJTdGF0dXMoXG4gICAgICAgIGh0dHBQb3J0LFxuICAgICAgICBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaHR0cHNQb3J0ISxcbiAgICAgICAgd3NQb3J0LFxuICAgICAgICBob3N0LFxuICAgICAgICBxdWlldFxuICAgICAgKTtcblxuICAgICAgZmV0Y2hQdWJsaWNJcCh1c2VQdWJsaWNJcCkudGhlbigocHVibGljSXApID0+IHtcbiAgICAgICAgaWYocHVibGljSXApIHtcbiAgICAgICAgICBkaXNwbGF5U2VydmVyU3RhdHVzKFxuICAgICAgICAgICAgaHR0cFBvcnQsXG4gICAgICAgICAgICBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaHR0cHNQb3J0ISxcbiAgICAgICAgICAgIHdzUG9ydCxcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBxdWlldCxcbiAgICAgICAgICAgIHB1YmxpY0lwXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgRXhwcmVzcyBzZXJ2ZXIgZXJyb3JzXG4gICAgc2VydmVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgbG9nKGBFeHByZXNzIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IEV4cHJlc3Mgc2VydmVyLicpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgZ3JhY2VmdWwgc2h1dGRvd25cbiAgICBjb25zdCBzaHV0ZG93biA9ICgpID0+IHtcbiAgICAgIGxvZygnXFxuU2h1dHRpbmcgZG93biBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgICB3c1NlcnZlci5jbG9zZSgpO1xuICAgICAgY2FsbGJhY2soMCk7XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc2h1dGRvd24pO1xuXG4gICAgLy8gS2VlcCB0aGUgcHJvY2VzcyBhbGl2ZVxuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG5cbiAgICBsb2coJ1NlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyIGlzIHJ1bm5pbmcuIFByZXNzIEN0cmwrQyB0byBzdG9wLicsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgLy8gRG9uJ3QgY2FsbCBjYWxsYmFjayBoZXJlLCBsZXQgdGhlIHByb2Nlc3Mgc3RheSBhbGl2ZVxuICAgIHJldHVybiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBzdGFydCBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4nKTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUFPLFdBQVc7QUFDbEIsT0FBTyxXQUFXO0FBQ2xCLE9BQU8sYUFBYTtBQUNwQixTQUFRLGNBQWMsWUFBWSxXQUFXLHFC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V0FBTyxHQUFHLFNBQVMsQ0FBQyxVQUFVO0FBQzVCLFVBQUkseUJBQXlCLE1BQU0sT0FBTyxJQUFJLFNBQVMsS0FBSztBQUM1RCxjQUFRLEtBQUssaUNBQWlDO0FBQzlDLGVBQVMsQ0FBQztBQUNWO0FBQUEsSUFDRixDQUFDO0FBR0QsVUFBTSxXQUFXLE1BQU07QUFDckIsVUFBSSxvREFBb0QsUUFBUSxLQUFLO0FBQ3JFLGFBQU8sTUFBTTtBQUNiLGVBQVMsTUFBTTtBQUNmLGVBQVMsQ0FBQztBQUFBLElBQ1o7QUFFQSxZQUFRLEdBQUcsVUFBVSxRQUFRO0FBQzdCLFlBQVEsR0FBRyxXQUFXLFFBQVE7QUFHOUIsWUFBUSxNQUFNLE9BQU87QUFFckIsUUFBSSxtRUFBbUUsUUFBUSxLQUFLO0FBR3BGLFdBQU87QUFBQSxFQUNULFNBQVMsT0FBTztBQUNkLFFBQUk7QUFBQSxFQUFLLE9BQU8sV0FBVyxNQUFNLE9BQU8sSUFBSSxTQUFTLEtBQUs7QUFDMUQsWUFBUSxLQUFLLGdEQUFnRDtBQUM3RCxhQUFTLENBQUM7QUFDVixXQUFPO0FBQUEsRUFDVDtBQUNGOyIsCiAgIm5hbWVzIjogWyJsb2ciLCAiaHR0cFBvcnQiLCAid3NQb3J0IiwgImhvc3QiXQp9Cg==
|