@mnaoumov/typescript-dev-toolkit 4.0.0 → 5.1.0

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.
Files changed (89) hide show
  1. package/bundlers/esbuild-impl/svelte-preprocessor/package.json +6 -0
  2. package/dist/lib/cjs/bulk-concurrency.cjs +49 -0
  3. package/dist/lib/cjs/bulk-concurrency.d.cts +14 -0
  4. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +4 -1
  5. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -0
  6. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +3 -3
  7. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-preprocessor.cjs +152 -0
  8. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-preprocessor.d.cts +95 -0
  9. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +4 -3
  10. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +1 -1
  11. package/dist/lib/cjs/docs-site/docs-links.cjs +3 -2
  12. package/dist/lib/cjs/docs-site/og-images.cjs +3 -2
  13. package/dist/lib/cjs/index.cjs +4 -1
  14. package/dist/lib/cjs/index.d.cts +1 -0
  15. package/dist/lib/cjs/library-build.cjs +8 -8
  16. package/dist/lib/cjs/linters/eslint-config.cjs +7 -5
  17. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +5 -1
  18. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +5 -1
  19. package/dist/lib/cjs/linters/eslint-rules/index.cjs +7 -1
  20. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +2 -0
  21. package/dist/lib/cjs/linters/eslint-rules/no-keyword-identifiers.cjs +144 -0
  22. package/dist/lib/cjs/linters/eslint-rules/no-keyword-identifiers.d.cts +11 -0
  23. package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.cjs +5 -5
  24. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +80 -3
  25. package/dist/lib/cjs/linters/eslint-rules/readonly-member-arrays.cjs +130 -0
  26. package/dist/lib/cjs/linters/eslint-rules/readonly-member-arrays.d.cts +6 -0
  27. package/dist/lib/cjs/linters/markdownlint.cjs +8 -2
  28. package/dist/lib/cjs/linters/over-exposure.cjs +14 -3
  29. package/dist/lib/cjs/linters/over-exposure.d.cts +3 -1
  30. package/dist/lib/cjs/nano-staged-config.cjs +24 -3
  31. package/dist/lib/cjs/nano-staged-config.d.cts +4 -0
  32. package/dist/lib/cjs/released-issues.cjs +4 -4
  33. package/dist/lib/cjs/test-runners/auto.cjs +1 -1
  34. package/dist/lib/cjs/test-runners/auto.d.cts +5 -0
  35. package/dist/lib/cjs/test-runners/forwarded-arguments.cjs +50 -0
  36. package/dist/lib/cjs/test-runners/forwarded-arguments.d.cts +49 -0
  37. package/dist/lib/cjs/test-runners/index.cjs +4 -1
  38. package/dist/lib/cjs/test-runners/index.d.cts +1 -0
  39. package/dist/lib/cjs/test-runners/jest.cjs +16 -3
  40. package/dist/lib/cjs/test-runners/jest.d.cts +5 -0
  41. package/dist/lib/cjs/test-runners/vitest.cjs +111 -5
  42. package/dist/lib/cjs/test-runners/vitest.d.cts +5 -0
  43. package/dist/lib/cjs/upstream-sync.cjs +3 -3
  44. package/dist/lib/esm/bulk-concurrency.d.mts +14 -0
  45. package/dist/lib/esm/bulk-concurrency.mjs +15 -0
  46. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -0
  47. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +3 -1
  48. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +3 -3
  49. package/dist/lib/esm/bundlers/esbuild-impl/svelte-preprocessor.d.mts +95 -0
  50. package/dist/lib/esm/bundlers/esbuild-impl/svelte-preprocessor.mjs +126 -0
  51. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.d.mts +1 -1
  52. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.mjs +4 -3
  53. package/dist/lib/esm/docs-site/docs-links.mjs +3 -2
  54. package/dist/lib/esm/docs-site/og-images.mjs +3 -2
  55. package/dist/lib/esm/index.d.mts +1 -0
  56. package/dist/lib/esm/index.mjs +3 -1
  57. package/dist/lib/esm/library-build.mjs +8 -8
  58. package/dist/lib/esm/linters/eslint-config.mjs +7 -5
  59. package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +5 -1
  60. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +5 -1
  61. package/dist/lib/esm/linters/eslint-rules/index.d.mts +2 -0
  62. package/dist/lib/esm/linters/eslint-rules/index.mjs +5 -1
  63. package/dist/lib/esm/linters/eslint-rules/no-keyword-identifiers.d.mts +11 -0
  64. package/dist/lib/esm/linters/eslint-rules/no-keyword-identifiers.mjs +120 -0
  65. package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.mjs +5 -5
  66. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +80 -3
  67. package/dist/lib/esm/linters/eslint-rules/readonly-member-arrays.d.mts +6 -0
  68. package/dist/lib/esm/linters/eslint-rules/readonly-member-arrays.mjs +106 -0
  69. package/dist/lib/esm/linters/markdownlint.mjs +8 -2
  70. package/dist/lib/esm/linters/over-exposure.d.mts +3 -1
  71. package/dist/lib/esm/linters/over-exposure.mjs +16 -3
  72. package/dist/lib/esm/nano-staged-config.d.mts +4 -0
  73. package/dist/lib/esm/nano-staged-config.mjs +24 -3
  74. package/dist/lib/esm/released-issues.mjs +4 -4
  75. package/dist/lib/esm/test-runners/auto.d.mts +5 -0
  76. package/dist/lib/esm/test-runners/auto.mjs +1 -1
  77. package/dist/lib/esm/test-runners/forwarded-arguments.d.mts +49 -0
  78. package/dist/lib/esm/test-runners/forwarded-arguments.mjs +26 -0
  79. package/dist/lib/esm/test-runners/index.d.mts +1 -0
  80. package/dist/lib/esm/test-runners/index.mjs +3 -1
  81. package/dist/lib/esm/test-runners/jest.d.mts +5 -0
  82. package/dist/lib/esm/test-runners/jest.mjs +16 -3
  83. package/dist/lib/esm/test-runners/vitest.d.mts +5 -0
  84. package/dist/lib/esm/test-runners/vitest.mjs +105 -6
  85. package/dist/lib/esm/upstream-sync.mjs +3 -3
  86. package/linters/eslint-rules/no-keyword-identifiers/package.json +6 -0
  87. package/linters/eslint-rules/readonly-member-arrays/package.json +6 -0
  88. package/package.json +5 -2
  89. package/test-runners/forwarded-arguments/package.json +6 -0
@@ -239,10 +239,10 @@ async function runBuildSteps(steps = LIBRARY_BUILD_STEPS) {
239
239
  }
240
240
  }
241
241
  function addEnvironmentGlobals(params) {
242
- const { libs, program, symbol, types } = params;
242
+ const { libs, program, symbol: $symbol, types } = params;
243
243
  const environmentLibs = [];
244
244
  let isNode = false;
245
- for (const declaration of symbol.declarations ?? []) {
245
+ for (const declaration of $symbol.declarations ?? []) {
246
246
  const sourceFile = declaration.getSourceFile();
247
247
  if (program.isSourceFileDefaultLibrary(sourceFile)) {
248
248
  const lib = toLibName(sourceFile.fileName);
@@ -343,9 +343,9 @@ function collectEnvironmentDirectives(params) {
343
343
  for (const file of declarationFiles) {
344
344
  let visit2 = function(node) {
345
345
  if ((0, import_typescript.isIdentifier)(node) || (0, import_typescript.isStringLiteral)(node)) {
346
- const symbol = checker.getSymbolAtLocation(node);
347
- if (symbol !== void 0) {
348
- addEnvironmentGlobals({ libs, program, symbol: resolveAlias(checker, symbol), types });
346
+ const $symbol = checker.getSymbolAtLocation(node);
347
+ if ($symbol !== void 0) {
348
+ addEnvironmentGlobals({ libs, program, symbol: resolveAlias(checker, $symbol), types });
349
349
  }
350
350
  }
351
351
  (0, import_typescript.forEachChild)(node, visit2);
@@ -420,8 +420,8 @@ function isExcludedFromIndex(folder, dirent) {
420
420
  const isExcludedEntry = excludedNames.includes(dirent.name) || dirent.name.endsWith(import_repo_paths.RepoPaths.DtsExtension) || folder.split("/").includes(import_repo_paths.RepoPaths.Types);
421
421
  return isExcludedEntry || dirent.isFile() && isExcludedFileName(dirent.name);
422
422
  }
423
- function resolveAlias(checker, symbol) {
424
- return (symbol.flags & import_typescript.SymbolFlags.Alias) === 0 ? symbol : checker.getAliasedSymbol(symbol);
423
+ function resolveAlias(checker, $symbol) {
424
+ return ($symbol.flags & import_typescript.SymbolFlags.Alias) === 0 ? $symbol : checker.getAliasedSymbol($symbol);
425
425
  }
426
426
  async function setExport(params) {
427
427
  const { exportConditions, isWildcard, sourceCondition, srcFolder } = params;
@@ -557,4 +557,4 @@ async function writeSubpathPackageJson(folder, packageJson) {
557
557
  generateLibraryIndex,
558
558
  runBuildSteps
559
559
  });
560
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVwZW5kZW5jaWVzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiBhIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzb1xuICogYSBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFbnRyaWVzIGZvciBmaWxlcyB0aGF0IGFyZSBub3QgYnVpbHQgZnJvbSBhIHNvdXJjZSBmb2xkZXIgKGEgZm9sZGVyIG9mIHNoYXJlZCBgdHNjb25maWdgIHByZXNldHMsIGFtYmllbnQgYC5kLnRzYFxuICAgKiBmaWxlcyksIGtleWVkIGJ5IHN1YnBhdGguIFRoZXkgZ28gaW50byB0aGUgbWFwIGFmdGVyIHRoZSBnZW5lcmF0ZWQgZW50cmllcywgYXMgZ2l2ZW4sIGFuZCBjb3VudCB0b3dhcmQgaXRzIGNoYW5nZVxuICAgKiBjaGVjazsgbm8gc3VicGF0aCBzdHViIGlzIHdyaXR0ZW4gZm9yIHRoZW0uIEEga2V5IGEgc291cmNlIGZvbGRlciBhbHJlYWR5IGdlbmVyYXRlcyB0aHJvd3MuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsRXhwb3J0cz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFBhY2thZ2VKc29uLkV4cG9ydHM+PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQW4gZXhwb3J0IGNvbmRpdGlvbiB0byBwdXQgZmlyc3QgaW4gZXZlcnkgZW50cnksIG1hcHBpbmcgdGhlIHN1YnBhdGggb250byBpdHMgVHlwZVNjcmlwdCBzb3VyY2UuIE9ubHkgYVxuICAgKiByZXBvc2l0b3J5IGhvbGRpbmcgc2V2ZXJhbCBwYWNrYWdlcyB0aGF0IGltcG9ydCBlYWNoIG90aGVyIG5lZWRzIG9uZTsgbm90aGluZyBvdXRzaWRlIGl0IHNldHMgdGhlIGNvbmRpdGlvbiwgYW5kXG4gICAqIHRoZSBzb3VyY2VzIGl0IHBvaW50cyBhdCBkbyBub3Qgc2hpcCwgc28gdGhlIHB1Ymxpc2ggaGFzIHRvIHN0cmlwIGl0IGFnYWluLiBPbWl0dGVkLCB0aGUgbWFwIGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlJbmRleH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVMaWJyYXJ5SW5kZXhPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNvdXJjZSBtb2R1bGVzIG9yIGZvbGRlcnMgdG8gbGVhdmUgb2ZmIHRoZSBnZW5lcmF0ZWQgYmFycmVscywgYXMgcGF0aHMgZnJvbSB0aGUgcGFja2FnZSByb290XG4gICAqIChgc3JjL2RlbW8tdmF1bHQtYnV0dG9ucy50c2AsIGBzcmMvdGVzdC1ydW5uZXJzL2ludGVncmF0aW9uYCkuIEEgbW9kdWxlIHRoYXQgbmVlZHMgYW4gb3B0aW9uYWwgcGVlciwgb3Igb25lIHRoYXRcbiAgICogcnVucyBjb2RlIGF0IGxvYWQgdGltZSB3aGljaCBvbmx5IHdvcmtzIGluc2lkZSBhIHRlc3QgcnVubmVyLCBnb2VzIGhlcmUsIHNvIGltcG9ydGluZyBhIGJhcnJlbCBuZXZlciBsb2FkcyBpdC4gSXQgaXNcbiAgICogc3RpbGwgYnVpbHQgYW5kIHN0YXlzIHJlYWNoYWJsZSB0aHJvdWdoIGl0cyBvd24gc3VicGF0aCBleHBvcnQuIEEgcGF0aCB0aGF0IG5hbWVzIG5vdGhpbmcgdGhlIGJhcnJlbHMgd291bGQgZXhwb3J0XG4gICAqIHRocm93cywgc28gYSByZW5hbWUgY2Fubm90IHF1aWV0bHkgcHV0IHRoZSBtb2R1bGUgYmFjay5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVGcm9tSW5kZXg/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbn1cblxudHlwZSBNb2R1bGVGb3JtYXQgPSAnY2pzJyB8ICdlc20nO1xuXG5jb25zdCBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMgPSBuZXcgU2V0KFsnbm9kZSddKTtcblxuLy8gVGhlIGxpYnMgdGhhdCBkZXNjcmliZSBhIGhvc3QncyBnbG9iYWxzIHJhdGhlciB0aGFuIHRoZSBsYW5ndWFnZSwgd2hpY2ggY29uc3VtZXJzIGNvbmZsaWN0IG92ZXIuIEVhY2ggZGVjbGFyYXRpb25cbi8vIGdldHMgdGhlIG9uZXMgaXQgdXNlczsgZXZlcnkgb3RoZXIgbGliIGlzIHNoYXJlZCB0aHJvdWdoIGBsaWJyYXJ5LXJlZmVyZW5jZXNgLlxuY29uc3QgRU5WSVJPTk1FTlRfTElCX1BSRUZJWEVTOiByZWFkb25seSBzdHJpbmdbXSA9IFsnZG9tJywgJ3NjcmlwdGhvc3QnLCAnd2Vid29ya2VyJ107XG5jb25zdCBOT0RFX1RZUEVTX1BBVEhfU0VHTUVOVCA9ICcvbm9kZV9tb2R1bGVzL0B0eXBlcy9ub2RlLyc7XG5jb25zdCBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUCA9IC9cXC9ub2RlX21vZHVsZXNcXC9AdHlwZXNjcmlwdFxcL2xpYi0oPzxMaWI+W14vXSspXFwvKD88U3ViTGliPi4rKVxcLmRcXC50cyQvO1xuXG4vLyBUaGUgZGVjbGFyYXRpb24gdGhhdCBjYXJyaWVzIG9ubHkgdGhlIGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZXMuIEV2ZXJ5IGRlY2xhcmF0aW9uIGJ1dCB0aGUgcm9vdCBvbmUgcmVmZXJlbmNlc1xuLy8gaXQsIHJhdGhlciB0aGFuIHRoZSByb290IGJhcnJlbCwgd2hpY2ggd291bGQgbG9hZCBldmVyeSBtb2R1bGUgb2YgdGhlIHBhY2thZ2UsIG9wdGlvbmFsIHBlZXJzJyB0eXBlcyBpbmNsdWRlZC5cbmNvbnN0IExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgPSAnbGlicmFyeS1yZWZlcmVuY2VzJztcbi8vIFNwZWxsZWQgYXBhcnQgb24gcHVycG9zZToge0BsaW5rIGNvbGxlY3RBbGxMaWJzfSBzY2FucyBldmVyeSBzb3VyY2UgZmlsZSBvZiB0aGUgcGFja2FnZSBiZWluZyBidWlsdCBmb3IgdGhlXG4vLyBkaXJlY3RpdmUsIHRoaXMgb25lIGluY2x1ZGVkLCBzbyBhIGxpdGVyYWwgb25lIGhlcmUgd291bGQgYmUgcmVhZCBhcyBhIGxpYiB0aGlzIHBhY2thZ2UgbmVlZHMuXG5jb25zdCBSRUZFUkVOQ0VfTElCX0RJUkVDVElWRSA9IFsnPHJlZmVyZW5jZScsICdsaWI9J10uam9pbignICcpO1xuY29uc3QgUkVGRVJFTkNFX0xJQl9SRUdfRVhQID0gL1xcL1xcL1xcLyA8cmVmZXJlbmNlIGxpYj1cIig/PExpYj5bXlwiXSspXCIgXFwvPi9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSB0eXBlLW9ubHkgaW1wb3J0LCBlLmcuIGBpbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO2AuXG5jb25zdCBCQVJFX1RZUEVfSU1QT1JUX1JFR19FWFAgPSAvXmltcG9ydCB0eXBlICg/PENsYXVzZT4uKz8pIGZyb20gJyg/PFNwZWNpZmllcj5bXi4nXVteJ10qKSc7JC9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSBpbmxpbmUgaW1wb3J0IHR5cGUgbm9kZSwgZS5nLiBgaW1wb3J0KFwidHlwZS1mZXN0XCIpLlByb21pc2FibGVgLiBFaXRoZXIgcXVvdGU6IHRoZVxuLy8gZW1pdCB3cml0ZXMgZG91YmxlIHF1b3Rlcywgd2hpbGUgYSBoYW5kLXdyaXR0ZW4gZGVjbGFyYXRpb24gY29waWVkIGFzIGlzIGtlZXBzIHRoZSBzaW5nbGUgcXVvdGVzIGRwcmludCB3cml0ZXMuXG5jb25zdCBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQID0gL2ltcG9ydFxcKCg/PFF1b3RlPltcIiddKSg/PFNwZWNpZmllcj5bXi5cIiddW15cIiddKilcXGs8UXVvdGU+XFwpL2c7XG5cbmNvbnN0IFNUQVRJQ19JTVBPUlRfUkVHX0VYUCA9IC9mcm9tICcoPzxJbXBvcnRQYXRoPi4rPylcXC50cyc7L2dtO1xuXG4vLyBJbmxpbmUgaW1wb3J0LXR5cGUgbm9kZXMgKGB0eXBlb2YgaW1wb3J0KCcuL2Zvby50cycpYCkgcHJlc2VydmUgdGhlIHNvdXJjZSBxdW90ZSBzdHlsZS5cbi8vIEhhbmQtYXV0aG9yZWQgYC5kLnRzYCBmaWxlcyBlbWl0IHNpbmdsZSBxdW90ZXM7IHRzYy1nZW5lcmF0ZWQgZGVjbGFyYXRpb25zIGVtaXQgZG91YmxlIHF1b3Rlcy5cbi8vIENhcHR1cmUgdGhlIHF1b3RlIGFuZCByZXVzZSBpdCBpbiB0aGUgcmVwbGFjZW1lbnQgc28gYm90aCBzdHlsZXMgYXJlIHJld3JpdHRlbi5cbmNvbnN0IERZTkFNSUNfSU1QT1JUX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+WydcIl0pKD88SW1wb3J0UGF0aD4uKz8pXFwudHNcXGs8UXVvdGU+XFwpL2dtO1xuXG5lbnVtIEdlbmVyYXRlSW5kZXhSZXN1bHQge1xuICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbmludGVyZmFjZSBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMge1xuICByZWFkb25seSBsaWJzOiBTZXQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgcmVhZG9ubHkgc3ltYm9sOiBUc1N5bWJvbDtcbiAgcmVhZG9ubHkgdHlwZXM6IFNldDxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgQnVpbGRMaWJyYXJ5Rm9ybWF0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBNb2R1bGVGb3JtYXQ7XG4gIHJlYWRvbmx5IGxpYkZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcHJlcHJvY2Vzc1BsdWdpbkZhY3Rvcnk6IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kdWxlRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlVHlwZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlSW5kZXhQYXJhbXMge1xuICByZWFkb25seSBleGNsdWRlZFBhdGhzOiBSZWFkb25seVNldDxzdHJpbmc+O1xuICByZWFkb25seSBmb2xkZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgdW5tYXRjaGVkUGF0aHM6IFNldDxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgU2V0RXhwb3J0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucztcbiAgcmVhZG9ubHkgaXNXaWxkY2FyZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVG9EaXN0UGF0aFBhcmFtcyB7XG4gIHJlYWRvbmx5IGZvcm1hdDogc3RyaW5nO1xuICByZWFkb25seSBpbXBvcnRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZXJ5dGhpbmcgYW4gZWFybGllciBidWlsZCBsZWZ0OiBgZGlzdC9gLCB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2AgYmFycmVscywgdGhlIGAuZC50c2AgZmlsZXMgYHRzY2Agd3JvdGVcbiAqIGJlc2lkZSB0aGUgc291cmNlcyAoaGFuZC1hdXRob3JlZCBvbmVzIHVuZGVyIGBAdHlwZXNgIHN0YXkpLCBhbmQgdGhlIHBlci1zdWJwYXRoIGBwYWNrYWdlLmpzb25gIHN0dWJzLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeXRoaW5nIGhhcyBiZWVuIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENsZWFuTGlicmFyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYnVpbGRDbGVhbigpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKGJhc2VuYW1lKGZpbGUpID09PSBSZXBvUGF0aHMuSW5kZXhUcyBhcyBzdHJpbmcpIHtcbiAgICAgIGF3YWl0IHJtKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpO1xuICAgIH1cblxuICAgIGlmIChmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pICYmICFmaWxlLnNwbGl0KCcvJykuaW5jbHVkZXMoUmVwb1BhdGhzLlR5cGVzKSkge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuQ3VycmVudEZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoKGJhc2VuYW1lKGZpbGUpICE9PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCAoZmlsZSA9PT0gUmVwb1BhdGhzLlBhY2thZ2VKc29uIGFzIHN0cmluZykgfHwgZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5Ob2RlTW9kdWxlcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGF3YWl0IHJtKGZpbGUpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGV2ZXJ5IHNvdXJjZSBtb2R1bGUsIHVuYnVuZGxlZCwgaW50byBgZGlzdC9saWIvY2pzYCAoYC5janNgKSBhbmQgYGRpc3QvbGliL2VzbWAgKGAubWpzYCkuXG4gKlxuICogVGhlIG91dHB1dCBmb2xkZXJzIG11c3QgYWxyZWFkeSBleGlzdDsge0BsaW5rIGJ1aWxkTGlicmFyeVR5cGVzfSBjcmVhdGVzIHRoZW0uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgYnVpbGQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBib3RoIGZvcm1hdHMgaGF2ZSBiZWVuIGJ1aWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5KG9wdGlvbnM6IEJ1aWxkTGlicmFyeU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5ID0gKGlzRXNtOiBib29sZWFuKTogUGx1Z2luID0+IHByZXByb2Nlc3NQbHVnaW4oeyBpc0VzbSB9KSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbGliRmlsZXMgPSBhd2FpdCBnZXRMaWJGaWxlcygpO1xuICBhd2FpdCBidWlsZExpYnJhcnlGb3JtYXQoeyBmb3JtYXQ6ICdjanMnLCBsaWJGaWxlcywgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgfSk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2VzbScsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbn1cblxuLyoqXG4gKiBFbWl0cyB0aGUgZGVjbGFyYXRpb25zIHdpdGggYHRzYyAtLXByb2plY3QgLi90c2NvbmZpZy50eXBlcy5qc29uYCwgdGhlbiBjb3BpZXMgZWFjaCBvbmUgaW50byBgZGlzdC9saWJgIHR3aWNlOiBhcyBhXG4gKiBgLmQuY3RzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5janNgIGZpbGVzIGFuZCB3aG9zZSBiYXJlIHR5cGUgaW1wb3J0cyBjYXJyeSBgcmVzb2x1dGlvbi1tb2RlOiBpbXBvcnRgLCBhbmRcbiAqIGFzIGEgYC5kLm10c2Agd2hvc2UgcmVsYXRpdmUgaW1wb3J0cyBuYW1lIGAubWpzYCBmaWxlcy5cbiAqXG4gKiBUaGUgbGlicmFyeSdzIHJvb3QgZGVjbGFyYXRpb24gKGBsaWJyYXJ5LnRzYCB3aGVyZSB0aGUgcGFja2FnZSBoYXMgb25lLCBvdGhlcndpc2UgdGhlIGdlbmVyYXRlZCBgaW5kZXgudHNgKSBjYXJyaWVzXG4gKiBldmVyeSBgbGliYCBhbmQgYHR5cGVzYCByZWZlcmVuY2UgdGhlIHBhY2thZ2UgbmVlZHMuIEV2ZXJ5IG90aGVyIGRlY2xhcmF0aW9uIHJlZmVyZW5jZXMgYSBgbGlicmFyeS1yZWZlcmVuY2VzYFxuICogZGVjbGFyYXRpb24gYmVzaWRlIGl0IGJ5IHBhdGgsIG5ldmVyIHRoZSByb290OiB0aGUgcm9vdCBiYXJyZWwgcmUtZXhwb3J0cyBldmVyeSBtb2R1bGUsIHNvIHJlZmVyZW5jaW5nIGl0IG1hZGUgZWFjaFxuICogc3VicGF0aCBsb2FkIHRoZSB3aG9sZSBwYWNrYWdlLCBhbmQgYSBjb25zdW1lciB0eXBlLWNoZWNraW5nIHdpdGggYHNraXBMaWJDaGVjazogZmFsc2VgIHRoZW4gbmVlZGVkIGV2ZXJ5IG9wdGlvbmFsXG4gKiBwZWVyIGluc3RhbGxlZC5cbiAqXG4gKiBgbGlicmFyeS1yZWZlcmVuY2VzYCBjYXJyaWVzIG9ubHkgdGhlIGxpYnMgdGhhdCBkZXNjcmliZSB0aGUgbGFuZ3VhZ2UgKGBlczIwMjJgLCBgZXNuZXh0LmRpc3Bvc2FibGVgKSwgd2hpY2ggbm9cbiAqIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoLiBUaGUgb25lcyB0aGF0IGRlc2NyaWJlIGEgaG9zdCAoYGRvbWAsIGBkb20uaXRlcmFibGVgLCBgd2Vid29ya2VyYCkgYW5kIGB0eXBlcz1cIm5vZGVcImAgZ29cbiAqIG9ubHkgaW50byB0aGUgZGVjbGFyYXRpb25zIHRoYXQgbmFtZSBvbmUgb2YgdGhlaXIgZ2xvYmFscywgZm91bmQgYnkgcmVzb2x2aW5nIGV2ZXJ5IG5hbWUgaW4gdGhlIGVtaXR0ZWRcbiAqIGRlY2xhcmF0aW9ucyB3aXRoIHRoZSB0eXBlIGNoZWNrZXIuIE90aGVyd2lzZSBhIGJyb3dzZXIgY29uc3VtZXIgb2YgYSBwdXJlIHN1YnBhdGggZ290IGFsbCBvZiBgQHR5cGVzL25vZGVgLCBhbmQgaXRzXG4gKiBgc2V0VGltZW91dGAgcmV0dXJuZWQgYE5vZGVKUy5UaW1lb3V0YC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRlY2xhcmF0aW9ucyBoYXZlIGJlZW4gd3JpdHRlbi5cbiAqIEB0aHJvd3MgSWYgYSBzb3VyY2UgbW9kdWxlIGlzIG5hbWVkIGBsaWJyYXJ5LXJlZmVyZW5jZXNgLCB3aGljaCB3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeVR5cGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsIGAke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259YCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzcmMvJHtMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FfSR7UmVwb1BhdGhzLlRzRXh0ZW5zaW9ufSBjb2xsaWRlcyB3aXRoIHRoZSBnZW5lcmF0ZWQgZGVjbGFyYXRpb24gb2YgdGhlIHNhbWUgbmFtZS5gKTtcbiAgfVxuXG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbLi4ucmVzb2x2ZVRvb2xDb21tYW5kKHsgdG9vbDogJ3RzYycgfSksICctLXByb2plY3QnLCAnLi90c2NvbmZpZy50eXBlcy5qc29uJ10pO1xuXG4gIGNvbnN0IGxpYnJhcnlGaWxlTmFtZSA9IGV4aXN0c1N5bmMoam9pbihSZXBvUGF0aHMuU3JjLCAnbGlicmFyeS50cycpKSA/ICdsaWJyYXJ5JyA6ICdpbmRleCc7XG4gIGNvbnN0IGFsbExpYnMgPSBhd2FpdCBjb2xsZWN0QWxsTGlicygpO1xuICBjb25zdCBhbGxUeXBlcyA9IGNvbGxlY3RBbGxUeXBlcygpO1xuICBjb25zdCBkaXJlY3RpdmVzID0gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGFsbExpYnMpICsgYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXMoYWxsVHlwZXMpO1xuICAvLyBPbmx5IHRoZSBsaWJzIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoLiBUaGUgZW52aXJvbm1lbnQgZ2xvYmFscyBnbyB0byB0aGUgZGVjbGFyYXRpb25zIHRoYXQgdXNlIHRoZW0uXG4gIGNvbnN0IHNoYXJlZERpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicy5maWx0ZXIoKGxpYikgPT4gIWlzRW52aXJvbm1lbnRMaWIobGliKSkpO1xuXG4gIGF3YWl0IG1rZGlyKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcywgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSwgc2hhcmVkRGlyZWN0aXZlcyk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24pLCBzaGFyZWREaXJlY3RpdmVzKTtcblxuICBjb25zdCBzcmNGaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZGVjbGFyYXRpb25GaWxlcyA9IHNyY0ZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5UZXN0SGVscGVycykpO1xuICBjb25zdCBlbnZpcm9ubWVudERpcmVjdGl2ZXMgPSBjb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzKHsgYXZhaWxhYmxlVHlwZXM6IGFsbFR5cGVzLCBkZWNsYXJhdGlvbkZpbGVzIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBkZWNsYXJhdGlvbkZpbGVzKSB7XG4gICAgY29uc3QgZm9sZGVyID0gZGlybmFtZShmaWxlKTtcbiAgICBjb25zdCBuYW1lID0gYmFzZW5hbWUoZmlsZSwgUmVwb1BhdGhzLkR0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSksICd1dGYtOCcpO1xuXG4gICAgY29uc3QgY3RzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMsIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKTtcbiAgICBjb25zdCBtdHNQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSwgZm9sZGVyLCBuYW1lICsgUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24pO1xuXG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShjdHNQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShtdHNQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBsZXQgY3RzQ29udGVudCA9IHRvQ3RzQ29udGVudChjb250ZW50KTtcbiAgICBsZXQgbXRzQ29udGVudCA9IHRvTXRzQ29udGVudChjb250ZW50KTtcblxuICAgIGlmIChuYW1lID09PSBsaWJyYXJ5RmlsZU5hbWUgJiYgZm9sZGVyID09PSAnLicpIHtcbiAgICAgIGN0c0NvbnRlbnQgPSBkaXJlY3RpdmVzICsgY3RzQ29udGVudDtcbiAgICAgIG10c0NvbnRlbnQgPSBkaXJlY3RpdmVzICsgbXRzQ29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlsZURpcmVjdGl2ZXMgPSBlbnZpcm9ubWVudERpcmVjdGl2ZXMuZ2V0KGZpbGUpID8/ICcnO1xuICAgICAgY3RzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IGN0c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkNqcyB9KVxuICAgICAgICArIGZpbGVEaXJlY3RpdmVzICsgY3RzQ29udGVudDtcbiAgICAgIG10c0NvbnRlbnQgPSBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUoeyBkZWNsYXJhdGlvbkZpbGVQYXRoOiBtdHNQYXRoLCBleHRlbnNpb246IFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5Fc20gfSlcbiAgICAgICAgKyBmaWxlRGlyZWN0aXZlcyArIG10c0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGN0c1BhdGgsIGN0c0NvbnRlbnQpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShtdHNQYXRoLCBtdHNDb250ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2VuZXJhdGVzIHRoZSBgZXhwb3J0c2AgbWFwIG9mIHRoZSBwYWNrYWdlJ3MgYHBhY2thZ2UuanNvbmAgZnJvbSBpdHMgc291cmNlIGZvbGRlcnMsIGFuZCB3cml0ZXMgYSBgcGFja2FnZS5qc29uYFxuICogc3R1YiBwZXIgc3VicGF0aCBmb3IgcmVzb2x2ZXJzIHRoYXQgZG8gbm90IHJlYWQgYGV4cG9ydHNgLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9uc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG1hcCBpcyBjdXJyZW50LlxuICogQHRocm93cyBJZiB0aGUgbWFwIGNoYW5nZWQsIHNvIHRoZSBjaGFuZ2UgZ2V0cyByZXZpZXdlZCBhbmQgY29tbWl0dGVkIHJhdGhlciB0aGFuIHNoaXBwZWQgdW5zZWVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0cyhvcHRpb25zOiBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYWRkaXRpb25hbEV4cG9ydHMgPSB7fSwgc291cmNlQ29uZGl0aW9uIH0gPSBvcHRpb25zO1xuICBjb25zdCBzcmNGb2xkZXJzOiBzdHJpbmdbXSA9IFtSZXBvUGF0aHMuU3JjXTtcblxuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUsIHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gam9pbihkaXJlbnQucGFyZW50UGF0aCwgZGlyZW50Lm5hbWUpO1xuXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoUmVwb1BhdGhzLlN0eWxlcykgfHwgcGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuVGVzdEhlbHBlcnMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBzcmNGb2xkZXJzLnB1c2gocGF0aCk7XG4gIH1cblxuICBzcmNGb2xkZXJzLnNvcnQoKTtcblxuICBsZXQgaXNDaGFuZ2VkID0gZmFsc2U7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKGFzeW5jIChwYWNrYWdlSnNvbikgPT4ge1xuICAgIGNvbnN0IG9sZEV4cG9ydHMgPSBwYWNrYWdlSnNvbi5leHBvcnRzO1xuICAgIGNvbnN0IGV4cG9ydENvbmRpdGlvbnM6IFBhY2thZ2VKc29uLkV4cG9ydENvbmRpdGlvbnMgPSB7fTtcbiAgICBwYWNrYWdlSnNvbi5leHBvcnRzID0gZXhwb3J0Q29uZGl0aW9ucztcbiAgICBmb3IgKGNvbnN0IHNyY0ZvbGRlciBvZiBzcmNGb2xkZXJzKSB7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiBmYWxzZSwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSk7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiB0cnVlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdWJwYXRoLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoYWRkaXRpb25hbEV4cG9ydHMpKSB7XG4gICAgICBpZiAoZXhwb3J0Q29uZGl0aW9uc1tzdWJwYXRoXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFkZGl0aW9uYWwgZXhwb3J0ICcke3N1YnBhdGh9JyBjb2xsaWRlcyB3aXRoIGFuIGVudHJ5IGdlbmVyYXRlZCBmcm9tIGEgc291cmNlIGZvbGRlci5gKTtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0Q29uZGl0aW9uc1tzdWJwYXRoXSA9IGVudHJ5O1xuICAgIH1cblxuICAgIGlzQ2hhbmdlZCA9ICFpc0RlZXBFcXVhbChvbGRFeHBvcnRzLCBwYWNrYWdlSnNvbi5leHBvcnRzKTtcbiAgfSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgY2hhbmdlZCBpbiB0aGUgYGVkaXRQYWNrYWdlSnNvbmAsIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgaWYgKGlzQ2hhbmdlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGFja2FnZSBleHBvcnRzIGhhdmUgY2hhbmdlZC4gUGxlYXNlIHJldmlldyB0aGUgY2hhbmdlcyBhbmQgY29tbWl0IHRoZW0uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gYGluZGV4LnRzYCBiYXJyZWwgaW4gZXZlcnkgc291cmNlIGZvbGRlciB0aGF0IGhhcyBzb21ldGhpbmcgdG8gZXhwb3J0LCByZS1leHBvcnRpbmcgZWFjaCBtb2R1bGUgYW5kXG4gKiBlYWNoIHN1Yi1iYXJyZWwgdW5kZXIgaXRzIG93biBuYW1lLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhcnJlbHMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlJbmRleChvcHRpb25zOiBHZW5lcmF0ZUxpYnJhcnlJbmRleE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGNsdWRlZFBhdGhzID0gbmV3IFNldCgob3B0aW9ucy5leGNsdWRlRnJvbUluZGV4ID8/IFtdKS5tYXAoKHBhdGgpID0+IGpvaW4ocGF0aC5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSkucmVwbGFjZSgvXFwvJC8sICcnKSkpO1xuICBjb25zdCB1bm1hdGNoZWRQYXRocyA9IG5ldyBTZXQoZXhjbHVkZWRQYXRocyk7XG4gIGF3YWl0IGdlbmVyYXRlSW5kZXgoeyBleGNsdWRlZFBhdGhzLCBmb2xkZXI6IFJlcG9QYXRocy5TcmMsIHVubWF0Y2hlZFBhdGhzIH0pO1xuXG4gIGlmICh1bm1hdGNoZWRQYXRocy5zaXplID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZXhjbHVkZUZyb21JbmRleCBuYW1lcyBubyBtb2R1bGUgdGhlIGJhcnJlbHMgd291bGQgZXhwb3J0OiAke1suLi51bm1hdGNoZWRQYXRoc10uam9pbignLCAnKX0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGVhY2ggbmFtZWQgbnBtIHNjcmlwdCB0aGUgcGFja2FnZSBkZWZpbmVzLCBpbiBvcmRlciwgc2tpcHBpbmcgdGhlIG9uZXMgaXQgZG9lcyBub3QgZGVmaW5lLlxuICpcbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBucG0gc2NyaXB0IG5hbWVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHN0ZXAgaGFzIHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHMoc3RlcHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gTElCUkFSWV9CVUlMRF9TVEVQUyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbChzdGVwKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgd2hhdCBhIGNvbnN1bWVyIG5lZWRzIGxvYWRlZCBmb3Igb25lIHN5bWJvbCBhIGRlY2xhcmF0aW9uIG5hbWVzLiBBIHN5bWJvbCBhbnkgRVMgbGliIGRlY2xhcmVzIG5lZWRzIG5vdGhpbmcsXG4gKiBiZWNhdXNlIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoIHRob3NlIGxpYnMuIE90aGVyd2lzZSBlYWNoIGVudmlyb25tZW50IGxpYiB0aGF0IGRlY2xhcmVzIGl0IGFkZHMgaXRzZWxmLCBhbmRcbiAqIGZhaWxpbmcgdGhhdCBgQHR5cGVzL25vZGVgIGFkZHMgYG5vZGVgLiBBIHN5bWJvbCBkZWNsYXJlZCBpbiB0aGUgcGFja2FnZSdzIG93biBmaWxlcyBhZGRzIG5vdGhpbmc6IHRoZSBkZWNsYXJhdGlvblxuICogdGhhdCBob2xkcyBpdCBjYXJyaWVzIGl0cyBvd24gZGlyZWN0aXZlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN5bWJvbCwgdGhlIHByb2dyYW0gaXQgd2FzIHJlc29sdmVkIGluLCBhbmQgdGhlIHNldHMgdG8gYWRkIHRvLlxuICovXG5mdW5jdGlvbiBhZGRFbnZpcm9ubWVudEdsb2JhbHMocGFyYW1zOiBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2wsIHR5cGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVudmlyb25tZW50TGliczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGlzTm9kZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sLmRlY2xhcmF0aW9ucyA/PyBbXSkge1xuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCk7XG4gICAgaWYgKHByb2dyYW0uaXNTb3VyY2VGaWxlRGVmYXVsdExpYnJhcnkoc291cmNlRmlsZSkpIHtcbiAgICAgIGNvbnN0IGxpYiA9IHRvTGliTmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICAgIGlmICghaXNFbnZpcm9ubWVudExpYihsaWIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVudmlyb25tZW50TGlicy5wdXNoKGxpYik7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VGaWxlLmZpbGVOYW1lLmluY2x1ZGVzKE5PREVfVFlQRVNfUEFUSF9TRUdNRU5UKSkge1xuICAgICAgaXNOb2RlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW52aXJvbm1lbnRMaWJzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBlbnZpcm9ubWVudExpYnMpIHtcbiAgICAgIGxpYnMuYWRkKGxpYik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTm9kZSkge1xuICAgIHR5cGVzLmFkZCgnbm9kZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhsaWJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtcbiAgICBsaWJzXG4gICAgICAubWFwKChsaWIpID0+IGAvLy8gJHtSRUZFUkVOQ0VfTElCX0RJUkVDVElWRX1cIiR7bGlifVwiIC8+YClcbiAgICAgIC5qb2luKCdcXG4nKVxuICB9XFxuYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXModHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IGAke1xuICAgICAgdHlwZXNcbiAgICAgICAgLm1hcCgodHlwZSkgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiJHt0eXBlfVwiIC8+YClcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfVxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeUZvcm1hdChwYXJhbXM6IEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZvcm1hdCwgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGZvcm1hdCA9PT0gJ2NqcycgPyBSZXBvUGF0aHMuQ2pzRXh0ZW5zaW9uIDogUmVwb1BhdGhzLk1qc0V4dGVuc2lvbjtcbiAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gRXhwbGljaXQsIGJlY2F1c2UgZXNidWlsZCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBpdHMgc2VydmljZSBwcm9jZXNzIHN0YXJ0ZWQgaW4uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gZXNidWlsZCdzIG93biBvcHRpb24gbmFtZS5cbiAgICBhYnNXb3JraW5nRGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGJhbm5lcjoge1xuICAgICAganM6IExJQlJBUllfQkFOTkVSXG4gICAgfSxcbiAgICBidW5kbGU6IGZhbHNlLFxuICAgIGVudHJ5UG9pbnRzOiBsaWJGaWxlcyxcbiAgICBmb3JtYXQsXG4gICAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgICBvdXRkaXI6IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIGZvcm1hdCksXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeShmb3JtYXQgPT09ICdlc20nKSxcbiAgICAgIGZpeEVzbVBsdWdpbigpLFxuICAgICAgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luKGV4dGVuc2lvbilcbiAgICBdLFxuICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgdGFyZ2V0OiAnRVMyMDIyJyxcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICB3cml0ZTogZmFsc2VcbiAgfTtcblxuICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCBjb250ZXh0KGJ1aWxkT3B0aW9ucyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LnJlYnVpbGQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBidWlsZENvbnRleHQuZGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZShwYXJhbXM6IEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVjbGFyYXRpb25GaWxlUGF0aCwgZXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3RvcnkgfSA9IHBhcmFtcztcbiAgY29uc3QgbGlicmFyeUZpbGVQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgbW9kdWxlRGlyZWN0b3J5LCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgZXh0ZW5zaW9uKTtcbiAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlTmF0aXZlKGRpcm5hbWUoZGVjbGFyYXRpb25GaWxlUGF0aCksIGxpYnJhcnlGaWxlUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gIH1cbiAgcmV0dXJuIGAvLy8gPHJlZmVyZW5jZSBwYXRoPVwiJHtyZWxhdGl2ZVBhdGh9XCIgLz5cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QWxsTGlicygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIC8vIFRoZSBSRVNPTFZFRCBvcHRpb25zLCBiZWNhdXNlIGEgcGFja2FnZSdzIGB0c2NvbmZpZy5qc29uYCBpbmhlcml0cyBgbGliYCBmcm9tIHRoZSBzaGFyZWQgYmFzZS4gVGhlIHJlc29sdmVkXG4gIC8vIG5hbWVzIGFyZSBmaWxlIG5hbWVzIChgbGliLmRvbS5pdGVyYWJsZS5kLnRzYCksIHNvIHRoZXkgYXJlIG1hcHBlZCBiYWNrIG9udG8gdGhlIG5hbWVzIGEgZGlyZWN0aXZlIHRha2VzLlxuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIGNvbnN0IGxpYnMgPSBuZXcgU2V0KChvcHRpb25zLmxpYiA/PyBbXSkubWFwKChsaWIpID0+IHRvTGliTmFtZShsaWIpKSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aCgnLnRzJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgaXRzIG9uZSBncm91cCwgc28gbm8gZmFsbGJhY2sgZm9yIGEgbWlzc2luZyBvbmUgaXMgbmVlZGVkLlxuICAgIGZvciAoY29uc3QgWywgbGliXSBvZiBzb3VyY2VDb250ZW50Lm1hdGNoQWxsKFJFRkVSRU5DRV9MSUJfUkVHX0VYUCkpIHtcbiAgICAgIGxpYnMuYWRkKFN0cmluZyhsaWIpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbLi4ubGlic10uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QWxsVHlwZXMoKTogc3RyaW5nW10ge1xuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIHJldHVybiAob3B0aW9ucy50eXBlcyA/PyBbXSlcbiAgICAuZmlsdGVyKCh0eXBlKSA9PiBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMuaGFzKHR5cGUpKVxuICAgIC5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMocGFyYW1zOiBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHsgYXZhaWxhYmxlVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh7XG4gICAgb3B0aW9uczogeyAuLi5vcHRpb25zLCBub0VtaXQ6IHRydWUgfSxcbiAgICByb290TmFtZXM6IGRlY2xhcmF0aW9uRmlsZXMubWFwKChmaWxlKSA9PiByZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKVxuICB9KTtcbiAgY29uc3QgY2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgZGlyZWN0aXZlc0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICAvLyBUaGUgcHJvZ3JhbSB3YXMgaGFuZGVkIGV2ZXJ5IG9uZSBvZiB0aGVzZSBhcyBhIHJvb3QgbmFtZSwgc28gZWFjaCBvbmUgaXMgaW4gaXQuXG4gICAgY29uc3Qgc291cmNlRmlsZSA9IGVuc3VyZU5vbk51bGxhYmxlKHByb2dyYW0uZ2V0U291cmNlRmlsZShyZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKSk7XG4gICAgY29uc3QgbGlicyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgICBpZiAoaXNJZGVudGlmaWVyKG5vZGUpIHx8IGlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZSk7XG4gICAgICAgIGlmIChzeW1ib2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZEVudmlyb25tZW50R2xvYmFscyh7IGxpYnMsIHByb2dyYW0sIHN5bWJvbDogcmVzb2x2ZUFsaWFzKGNoZWNrZXIsIHN5bWJvbCksIHR5cGVzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICAgIH1cbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcblxuICAgIGNvbnN0IG5lZWRlZFR5cGVzID0gWy4uLnR5cGVzXS5maWx0ZXIoKHR5cGUpID0+IGF2YWlsYWJsZVR5cGVzLmluY2x1ZGVzKHR5cGUpKTtcbiAgICBpZiAobGlicy5zaXplID4gMCB8fCBuZWVkZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBkaXJlY3RpdmVzQnlGaWxlLnNldChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgKGxpYnMuc2l6ZSA+IDAgPyBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoWy4uLmxpYnNdLnNvcnQoKSkgOiAnJykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhuZWVkZWRUeXBlcy5zb3J0KCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXJlY3RpdmVzQnlGaWxlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4KHBhcmFtczogR2VuZXJhdGVJbmRleFBhcmFtcyk6IFByb21pc2U8R2VuZXJhdGVJbmRleFJlc3VsdD4ge1xuICBjb25zdCB7IGZvbGRlciB9ID0gcGFyYW1zO1xuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgcmVhZGRpclBvc2l4KGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBtYXliZUxpbmVzID0gYXdhaXQgYXN5bmNNYXAoZGlyZW50cywgKGRpcmVudCkgPT4gaGFuZGxlSW5kZXhEaXJlbnQocGFyYW1zLCBkaXJlbnQpKTtcbiAgY29uc3QgbGluZXMgPSBtYXliZUxpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gdW5kZWZpbmVkKTtcblxuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU2tpcHBlZDtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlKGpvaW4oZm9sZGVyLCBSZXBvUGF0aHMuSW5kZXhUcyksIGxpbmVzKTtcbiAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGliRmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgZmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpKTtcbiAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZmlsZSkgPT5cbiAgICBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoJy50ZXN0LnRzJylcbiAgICAmJiAhZmlsZS5pbmNsdWRlcyhgLyR7UmVwb1BhdGhzLlRlc3RIZWxwZXJzfS9gKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbmRleERpcmVudChwYXJhbXM6IEdlbmVyYXRlSW5kZXhQYXJhbXMsIGRpcmVudDogRGlyZW50KTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgeyBleGNsdWRlZFBhdGhzLCBmb2xkZXIsIHVubWF0Y2hlZFBhdGhzIH0gPSBwYXJhbXM7XG4gIGlmIChpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlciwgZGlyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhdGggPSBqb2luKGZvbGRlciwgZGlyZW50Lm5hbWUpO1xuICBpZiAoZXhjbHVkZWRQYXRocy5oYXMocGF0aCkpIHtcbiAgICB1bm1hdGNoZWRQYXRocy5kZWxldGUocGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHNvdXJjZUZpbGU6IHN0cmluZztcbiAgbGV0IG5hbWU6IHN0cmluZztcbiAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVJbmRleCh7IC4uLnBhcmFtcywgZm9sZGVyOiBwYXRoIH0pO1xuICAgIGlmIChyZXN1bHQgIT09IEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKGRpcmVudC5uYW1lLCBSZXBvUGF0aHMuSW5kZXhUcykpO1xuICAgIG5hbWUgPSBkaXJlbnQubmFtZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGRpcmVudC5uYW1lKTtcbiAgICBuYW1lID0gYmFzZW5hbWUoZGlyZW50Lm5hbWUsIGV4dGVuc2lvbik7XG4gICAgc291cmNlRmlsZSA9IG5vcm1hbGl6ZUlmUmVsYXRpdmUoZGlyZW50Lm5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGBleHBvcnQgKiBhcyAnJHtuYW1lfScgZnJvbSAnJHtzb3VyY2VGaWxlfSc7YDtcbn1cblxuZnVuY3Rpb24gaXNFbnZpcm9ubWVudExpYihsaWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU5WSVJPTk1FTlRfTElCX1BSRUZJWEVTLnNvbWUoKHByZWZpeCkgPT4gbGliLnN0YXJ0c1dpdGgocHJlZml4KSk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGaWxlTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFuYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgfHwgbmFtZS5lbmRzV2l0aCgnLnRlc3QudHMnKSB8fCBuYW1lID09PSAnc2V0dXAudHMnIHx8IG5hbWUuZW5kc1dpdGgoJy1zZXR1cC50cycpO1xufVxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlcjogc3RyaW5nLCBkaXJlbnQ6IERpcmVudCk6IGJvb2xlYW4ge1xuICBjb25zdCBleGNsdWRlZE5hbWVzOiByZWFkb25seSBzdHJpbmdbXSA9IFtSZXBvUGF0aHMuSW5kZXhUcywgUmVwb1BhdGhzLlR5cGVzLCBSZXBvUGF0aHMuU3R5bGVzLCBSZXBvUGF0aHMuVGVzdEhlbHBlcnNdO1xuICBjb25zdCBpc0V4Y2x1ZGVkRW50cnkgPSBleGNsdWRlZE5hbWVzLmluY2x1ZGVzKGRpcmVudC5uYW1lKSB8fCBkaXJlbnQubmFtZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSB8fCBmb2xkZXIuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpO1xuICByZXR1cm4gaXNFeGNsdWRlZEVudHJ5IHx8IChkaXJlbnQuaXNGaWxlKCkgJiYgaXNFeGNsdWRlZEZpbGVOYW1lKGRpcmVudC5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBbGlhcyhjaGVja2VyOiBUeXBlQ2hlY2tlciwgc3ltYm9sOiBUc1N5bWJvbCk6IFRzU3ltYm9sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2UgLS0gYFN5bWJvbEZsYWdzYCBpcyBhIGJpdCBzZXQuXG4gIHJldHVybiAoc3ltYm9sLmZsYWdzICYgU3ltYm9sRmxhZ3MuQWxpYXMpID09PSAwID8gc3ltYm9sIDogY2hlY2tlci5nZXRBbGlhc2VkU3ltYm9sKHN5bWJvbCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldEV4cG9ydChwYXJhbXM6IFNldEV4cG9ydFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGltcG9ydFBhdGggPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBzcmNGb2xkZXIsXG4gICAgcmVwbGFjZXI6IFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLFxuICAgIHNlYXJjaFZhbHVlOiBSZXBvUGF0aHMuU3JjXG4gIH0pO1xuICBjb25zdCBjb25kaXRpb25QYXRoID0gaXNXaWxkY2FyZCA/IGAke2ltcG9ydFBhdGh9LyR7UmVwb1BhdGhzLkFueX1gIDogaW1wb3J0UGF0aDtcbiAgY29uc3QgZG10c1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueURtdHMgOiBSZXBvUGF0aHMuSW5kZXhEbXRzIH0pO1xuICBjb25zdCBkY3RzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RGN0cyA6IFJlcG9QYXRocy5JbmRleERjdHMgfSk7XG4gIGNvbnN0IGRtdHNGb2xkZXJQYXRoID0gZGlybmFtZShkbXRzUGF0aCk7XG4gIGNvbnN0IGRjdHNGb2xkZXJQYXRoID0gZGlybmFtZShkY3RzUGF0aCk7XG5cbiAgaWYgKCFpc1dpbGRjYXJkICYmICFleGlzdHNTeW5jKGRjdHNQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGlzVHlwZXNPbmx5ID0gaW1wb3J0UGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpO1xuICBjb25zdCBtanNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkVzbSwgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlNanMgOiBSZXBvUGF0aHMuSW5kZXhNanMgfSk7XG4gIGNvbnN0IGNqc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuQ2pzLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueUNqcyA6IFJlcG9QYXRocy5JbmRleENqcyB9KTtcblxuICBpZiAoaXNUeXBlc09ubHkpIHtcbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgaW1wb3J0OiB7XG4gICAgICAgIHR5cGVzOiBkbXRzUGF0aFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmU6IHtcbiAgICAgICAgdHlwZXM6IGRjdHNQYXRoXG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKFJlcG9QYXRocy5TcmMsIGltcG9ydFBhdGgsIGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55VHMgOiBSZXBvUGF0aHMuSW5kZXhUcykpO1xuXG4gICAgZXhwb3J0Q29uZGl0aW9uc1tjb25kaXRpb25QYXRoXSA9IHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHBlcmZlY3Rpb25pc3Qvc29ydC1vYmplY3RzIC0tIE9yZGVyIG1hdHRlcnMgb25jZSBpdCBpcyB3cml0dGVuIHRvIGBwYWNrYWdlLmpzb25gLiAqL1xuICAgICAgLy8gRmlyc3QsIHNvIGl0IHdpbnMgd2hlcmV2ZXIgaXQgaXMgc2V0OiBpbnNpZGUgdGhlIHJlcG9zaXRvcnksIGJlZm9yZSBhbnl0aGluZyBpcyBidWlsdC5cbiAgICAgIC4uLihzb3VyY2VDb25kaXRpb24gIT09IHVuZGVmaW5lZCAmJiB7IFtzb3VyY2VDb25kaXRpb25dOiBzb3VyY2VQYXRoIH0pLFxuICAgICAgaW1wb3J0OiB7XG4gICAgICAgIHR5cGVzOiBkbXRzUGF0aCxcbiAgICAgICAgZGVmYXVsdDogbWpzUGF0aFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmU6IHtcbiAgICAgICAgdHlwZXM6IGRjdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBjanNQYXRoXG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHBlcmZlY3Rpb25pc3Qvc29ydC1vYmplY3RzIC0tIE9yZGVyIG1hdHRlcnMgb25jZSBpdCBpcyB3cml0dGVuIHRvIGBwYWNrYWdlLmpzb25gLiAqL1xuICAgIH07XG4gIH1cblxuICBpZiAoaW1wb3J0UGF0aCA9PT0gUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIgYXMgc3RyaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpc1dpbGRjYXJkKSB7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBpbXBvcnRQYXRoLFxuICAgICAgaXNUeXBlc09ubHlcbiAgICAgICAgPyB7IHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICAgICAgOiB7IG1haW46IHJlbGF0aXZlKGltcG9ydFBhdGgsIGNqc1BhdGgpLCBtb2R1bGU6IHJlbGF0aXZlKGltcG9ydFBhdGgsIG1qc1BhdGgpLCB0eXBlOiAnbW9kdWxlJywgdHlwZXM6IHJlbGF0aXZlKGltcG9ydFBhdGgsIGRjdHNQYXRoKSB9XG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KGRjdHNGb2xkZXJQYXRoKSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gYmFzZW5hbWUoZmlsZSwgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VKc29uRm9sZGVyUGF0aCA9IGpvaW4oaW1wb3J0UGF0aCwgbmFtZSk7XG4gICAgY29uc3QgdHlwZXMgPSByZWxhdGl2ZShwYWNrYWdlSnNvbkZvbGRlclBhdGgsIGpvaW4oZGN0c0ZvbGRlclBhdGgsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbikpO1xuICAgIGF3YWl0IHdyaXRlU3VicGF0aFBhY2thZ2VKc29uKFxuICAgICAgcGFja2FnZUpzb25Gb2xkZXJQYXRoLFxuICAgICAgaXNUeXBlc09ubHlcbiAgICAgICAgPyB7IHR5cGU6ICdtb2R1bGUnLCB0eXBlcyB9XG4gICAgICAgIDoge1xuICAgICAgICAgIG1haW46IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5DanNFeHRlbnNpb24pKSxcbiAgICAgICAgICBtb2R1bGU6IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkbXRzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5NanNFeHRlbnNpb24pKSxcbiAgICAgICAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICAgICAgICB0eXBlc1xuICAgICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0N0c0NvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+LmNqc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5janMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuXG4gIC8vIEEgYC5kLmN0c2AgZmlsZSBpcyBhIENvbW1vbkpTIG1vZHVsZS4gVHlwZS1vbmx5IGltcG9ydHMgb2YgYSBiYXJlIHNwZWNpZmllciByZXNvbHZpbmcgdG8gYW5cbiAgLy8gRVNNLW9ubHkgcGFja2FnZSBuZWVkIGEgYHJlc29sdXRpb24tbW9kZWAgYXR0cmlidXRlLCBlbHNlIGB0c2NgIHJlcG9ydHMgVFMxNTQxIC8gVFMxNTQyLlxuICAvLyBQYXNzaW5nIGAnaW1wb3J0J2AgaXMgdmFsaWQgZm9yIENvbW1vbkpTIHRhcmdldHMgdG9vLCBzbyBldmVyeSBiYXJlIHNwZWNpZmllciByZWNlaXZlcyBpdC5cbiAgLy8gVGhlIEVTTSBgLmQubXRzYCBuZWVkcyBubyBzdWNoIGF0dHJpYnV0ZSwgc28gdGhpcyB0cmFuc2Zvcm0gcnVucyBvbiBDb21tb25KUyBjb250ZW50IG9ubHkuXG4gIGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0IHR5cGUgJDxDbGF1c2U+IGZyb20gXFwnJDxTcGVjaWZpZXI+XFwnIHdpdGggeyBcXCdyZXNvbHV0aW9uLW1vZGVcXCc6IFxcJ2ltcG9ydFxcJyB9OycsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfVFlQRV9JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPFNwZWNpZmllcj4kPFF1b3RlPiwgeyB3aXRoOiB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH0gfSknLFxuICAgIHNlYXJjaFZhbHVlOiBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b0Rpc3RQYXRoKHBhcmFtczogVG9EaXN0UGF0aFBhcmFtcyk6IHN0cmluZyB7XG4gIHJldHVybiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIHBhcmFtcy5mb3JtYXQsIHBhcmFtcy5pbXBvcnRQYXRoLCBwYXJhbXMubmFtZSkpO1xufVxuXG5mdW5jdGlvbiB0b0xpYk5hbWUobGliRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEEgbGliIGEgcGFja2FnZSByZXBsYWNlZCAoYEB0eXBlc2NyaXB0L2xpYi1kb21gLCBgQHR5cGVzY3JpcHQvbGliLWRvbS9pdGVyYWJsZS5kLnRzYCkgaXMgbmFtZWQgYnkgaXRzIHBhdGgsIG5vdCBieVxuICAvLyBpdHMgZmlsZSBuYW1lLCB3aGljaCBpcyBgaW5kZXguZC50c2AgZm9yIHRoZSBsaWIncyByb290LlxuICBjb25zdCByZXBsYWNlbWVudE1hdGNoID0gTElCX1JFUExBQ0VNRU5UX1JFR19FWFAuZXhlYyhsaWJGaWxlUGF0aCk7XG4gIGlmIChyZXBsYWNlbWVudE1hdGNoPy5ncm91cHMgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWx3YXlzIGNhcHR1cmVzIGJvdGggZ3JvdXBzLlxuICAgIGNvbnN0IGxpYiA9IFN0cmluZyhyZXBsYWNlbWVudE1hdGNoLmdyb3Vwc1snTGliJ10pO1xuICAgIGNvbnN0IHN1YkxpYiA9IFN0cmluZyhyZXBsYWNlbWVudE1hdGNoLmdyb3Vwc1snU3ViTGliJ10pO1xuICAgIHJldHVybiAoc3ViTGliID09PSAnaW5kZXgnID8gbGliIDogYCR7bGlifS4ke3N1YkxpYi5yZXBsYWNlQWxsKCcvJywgJy4nKX1gKS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHJldHVybiBiYXNlbmFtZShsaWJGaWxlUGF0aCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ebGliXFwuLywgJycpLnJlcGxhY2UoL1xcLmRcXC50cyQvLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHRvTXRzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtdHNDb250ZW50ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY29udGVudCxcbiAgICByZXBsYWNlcjogJ2Zyb20gXFwnJDxJbXBvcnRQYXRoPi5tanNcXCc7JyxcbiAgICBzZWFyY2hWYWx1ZTogU1RBVElDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbXRzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydCgkPFF1b3RlPiQ8SW1wb3J0UGF0aD4ubWpzJDxRdW90ZT4pJyxcbiAgICBzZWFyY2hWYWx1ZTogRFlOQU1JQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oZm9sZGVyOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2Rpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUpzb24oam9pbihmb2xkZXIsIFJlcG9QYXRocy5QYWNrYWdl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UUFDTjtBQUFBLE1BQ0Y7QUFBQSxJQUNKO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxhQUFhLFNBQXlCO0FBQzdDLE1BQUksaUJBQWEsMEJBQVc7QUFBQSxJQUMxQixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZixDQUFDO0FBQ0QsbUJBQWEsMEJBQVc7QUFBQSxJQUN0QixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZixDQUFDO0FBTUQsbUJBQWEsMEJBQVc7QUFBQSxJQUN0QixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZixDQUFDO0FBQ0QsYUFBTywwQkFBVztBQUFBLElBQ2hCLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFDSDtBQUVBLFNBQVMsV0FBVyxRQUFrQztBQUNwRCxhQUFPLHFDQUFvQixrQkFBSyw0QkFBVSxTQUFTLE9BQU8sUUFBUSxPQUFPLFlBQVksT0FBTyxJQUFJLENBQUM7QUFDbkc7QUFFQSxTQUFTLFVBQVUsYUFBNkI7QUFHOUMsUUFBTSxtQkFBbUIsd0JBQXdCLEtBQUssV0FBVztBQUNqRSxNQUFJLGtCQUFrQixXQUFXLFFBQVc7QUFFMUMsVUFBTSxNQUFNLE9BQU8saUJBQWlCLE9BQU8sS0FBSyxDQUFDO0FBQ2pELFVBQU0sU0FBUyxPQUFPLGlCQUFpQixPQUFPLFFBQVEsQ0FBQztBQUN2RCxZQUFRLFdBQVcsVUFBVSxNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sV0FBVyxLQUFLLEdBQUcsQ0FBQyxJQUFJLFlBQVk7QUFBQSxFQUMxRjtBQUNBLGFBQU8sc0JBQVMsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLFVBQVUsRUFBRSxFQUFFLFFBQVEsWUFBWSxFQUFFO0FBQ3pGO0FBRUEsU0FBUyxhQUFhLFNBQXlCO0FBQzdDLFFBQU0saUJBQWEsMEJBQVc7QUFBQSxJQUM1QixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZixDQUFDO0FBQ0QsYUFBTywwQkFBVztBQUFBLElBQ2hCLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFDSDtBQUVBLGVBQWUsd0JBQXdCLFFBQWdCLGFBQXlDO0FBQzlGLFlBQU0sdUJBQU0sUUFBUSxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ3ZDLFlBQU0sMkJBQVUsa0JBQUssUUFBUSw0QkFBVSxXQUFXLEdBQUcsV0FBVztBQUNsRTsiLCJuYW1lcyI6WyJwcm9jZXNzIiwicmVsYXRpdmVOYXRpdmUiLCJyZXNvbHZlTmF0aXZlIiwidmlzaXQiXX0=
560
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVwZW5kZW5jaWVzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiBhIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzb1xuICogYSBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFbnRyaWVzIGZvciBmaWxlcyB0aGF0IGFyZSBub3QgYnVpbHQgZnJvbSBhIHNvdXJjZSBmb2xkZXIgKGEgZm9sZGVyIG9mIHNoYXJlZCBgdHNjb25maWdgIHByZXNldHMsIGFtYmllbnQgYC5kLnRzYFxuICAgKiBmaWxlcyksIGtleWVkIGJ5IHN1YnBhdGguIFRoZXkgZ28gaW50byB0aGUgbWFwIGFmdGVyIHRoZSBnZW5lcmF0ZWQgZW50cmllcywgYXMgZ2l2ZW4sIGFuZCBjb3VudCB0b3dhcmQgaXRzIGNoYW5nZVxuICAgKiBjaGVjazsgbm8gc3VicGF0aCBzdHViIGlzIHdyaXR0ZW4gZm9yIHRoZW0uIEEga2V5IGEgc291cmNlIGZvbGRlciBhbHJlYWR5IGdlbmVyYXRlcyB0aHJvd3MuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsRXhwb3J0cz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFBhY2thZ2VKc29uLkV4cG9ydHM+PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQW4gZXhwb3J0IGNvbmRpdGlvbiB0byBwdXQgZmlyc3QgaW4gZXZlcnkgZW50cnksIG1hcHBpbmcgdGhlIHN1YnBhdGggb250byBpdHMgVHlwZVNjcmlwdCBzb3VyY2UuIE9ubHkgYVxuICAgKiByZXBvc2l0b3J5IGhvbGRpbmcgc2V2ZXJhbCBwYWNrYWdlcyB0aGF0IGltcG9ydCBlYWNoIG90aGVyIG5lZWRzIG9uZTsgbm90aGluZyBvdXRzaWRlIGl0IHNldHMgdGhlIGNvbmRpdGlvbiwgYW5kXG4gICAqIHRoZSBzb3VyY2VzIGl0IHBvaW50cyBhdCBkbyBub3Qgc2hpcCwgc28gdGhlIHB1Ymxpc2ggaGFzIHRvIHN0cmlwIGl0IGFnYWluLiBPbWl0dGVkLCB0aGUgbWFwIGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlJbmRleH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVMaWJyYXJ5SW5kZXhPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNvdXJjZSBtb2R1bGVzIG9yIGZvbGRlcnMgdG8gbGVhdmUgb2ZmIHRoZSBnZW5lcmF0ZWQgYmFycmVscywgYXMgcGF0aHMgZnJvbSB0aGUgcGFja2FnZSByb290XG4gICAqIChgc3JjL2RlbW8tdmF1bHQtYnV0dG9ucy50c2AsIGBzcmMvdGVzdC1ydW5uZXJzL2ludGVncmF0aW9uYCkuIEEgbW9kdWxlIHRoYXQgbmVlZHMgYW4gb3B0aW9uYWwgcGVlciwgb3Igb25lIHRoYXRcbiAgICogcnVucyBjb2RlIGF0IGxvYWQgdGltZSB3aGljaCBvbmx5IHdvcmtzIGluc2lkZSBhIHRlc3QgcnVubmVyLCBnb2VzIGhlcmUsIHNvIGltcG9ydGluZyBhIGJhcnJlbCBuZXZlciBsb2FkcyBpdC4gSXQgaXNcbiAgICogc3RpbGwgYnVpbHQgYW5kIHN0YXlzIHJlYWNoYWJsZSB0aHJvdWdoIGl0cyBvd24gc3VicGF0aCBleHBvcnQuIEEgcGF0aCB0aGF0IG5hbWVzIG5vdGhpbmcgdGhlIGJhcnJlbHMgd291bGQgZXhwb3J0XG4gICAqIHRocm93cywgc28gYSByZW5hbWUgY2Fubm90IHF1aWV0bHkgcHV0IHRoZSBtb2R1bGUgYmFjay5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVGcm9tSW5kZXg/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbn1cblxudHlwZSBNb2R1bGVGb3JtYXQgPSAnY2pzJyB8ICdlc20nO1xuXG5jb25zdCBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMgPSBuZXcgU2V0KFsnbm9kZSddKTtcblxuLy8gVGhlIGxpYnMgdGhhdCBkZXNjcmliZSBhIGhvc3QncyBnbG9iYWxzIHJhdGhlciB0aGFuIHRoZSBsYW5ndWFnZSwgd2hpY2ggY29uc3VtZXJzIGNvbmZsaWN0IG92ZXIuIEVhY2ggZGVjbGFyYXRpb25cbi8vIGdldHMgdGhlIG9uZXMgaXQgdXNlczsgZXZlcnkgb3RoZXIgbGliIGlzIHNoYXJlZCB0aHJvdWdoIGBsaWJyYXJ5LXJlZmVyZW5jZXNgLlxuY29uc3QgRU5WSVJPTk1FTlRfTElCX1BSRUZJWEVTOiByZWFkb25seSBzdHJpbmdbXSA9IFsnZG9tJywgJ3NjcmlwdGhvc3QnLCAnd2Vid29ya2VyJ107XG5jb25zdCBOT0RFX1RZUEVTX1BBVEhfU0VHTUVOVCA9ICcvbm9kZV9tb2R1bGVzL0B0eXBlcy9ub2RlLyc7XG5jb25zdCBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUCA9IC9cXC9ub2RlX21vZHVsZXNcXC9AdHlwZXNjcmlwdFxcL2xpYi0oPzxMaWI+W14vXSspXFwvKD88U3ViTGliPi4rKVxcLmRcXC50cyQvO1xuXG4vLyBUaGUgZGVjbGFyYXRpb24gdGhhdCBjYXJyaWVzIG9ubHkgdGhlIGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZXMuIEV2ZXJ5IGRlY2xhcmF0aW9uIGJ1dCB0aGUgcm9vdCBvbmUgcmVmZXJlbmNlc1xuLy8gaXQsIHJhdGhlciB0aGFuIHRoZSByb290IGJhcnJlbCwgd2hpY2ggd291bGQgbG9hZCBldmVyeSBtb2R1bGUgb2YgdGhlIHBhY2thZ2UsIG9wdGlvbmFsIHBlZXJzJyB0eXBlcyBpbmNsdWRlZC5cbmNvbnN0IExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgPSAnbGlicmFyeS1yZWZlcmVuY2VzJztcbi8vIFNwZWxsZWQgYXBhcnQgb24gcHVycG9zZToge0BsaW5rIGNvbGxlY3RBbGxMaWJzfSBzY2FucyBldmVyeSBzb3VyY2UgZmlsZSBvZiB0aGUgcGFja2FnZSBiZWluZyBidWlsdCBmb3IgdGhlXG4vLyBkaXJlY3RpdmUsIHRoaXMgb25lIGluY2x1ZGVkLCBzbyBhIGxpdGVyYWwgb25lIGhlcmUgd291bGQgYmUgcmVhZCBhcyBhIGxpYiB0aGlzIHBhY2thZ2UgbmVlZHMuXG5jb25zdCBSRUZFUkVOQ0VfTElCX0RJUkVDVElWRSA9IFsnPHJlZmVyZW5jZScsICdsaWI9J10uam9pbignICcpO1xuY29uc3QgUkVGRVJFTkNFX0xJQl9SRUdfRVhQID0gL1xcL1xcL1xcLyA8cmVmZXJlbmNlIGxpYj1cIig/PExpYj5bXlwiXSspXCIgXFwvPi9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSB0eXBlLW9ubHkgaW1wb3J0LCBlLmcuIGBpbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO2AuXG5jb25zdCBCQVJFX1RZUEVfSU1QT1JUX1JFR19FWFAgPSAvXmltcG9ydCB0eXBlICg/PENsYXVzZT4uKz8pIGZyb20gJyg/PFNwZWNpZmllcj5bXi4nXVteJ10qKSc7JC9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSBpbmxpbmUgaW1wb3J0IHR5cGUgbm9kZSwgZS5nLiBgaW1wb3J0KFwidHlwZS1mZXN0XCIpLlByb21pc2FibGVgLiBFaXRoZXIgcXVvdGU6IHRoZVxuLy8gZW1pdCB3cml0ZXMgZG91YmxlIHF1b3Rlcywgd2hpbGUgYSBoYW5kLXdyaXR0ZW4gZGVjbGFyYXRpb24gY29waWVkIGFzIGlzIGtlZXBzIHRoZSBzaW5nbGUgcXVvdGVzIGRwcmludCB3cml0ZXMuXG5jb25zdCBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQID0gL2ltcG9ydFxcKCg/PFF1b3RlPltcIiddKSg/PFNwZWNpZmllcj5bXi5cIiddW15cIiddKilcXGs8UXVvdGU+XFwpL2c7XG5cbmNvbnN0IFNUQVRJQ19JTVBPUlRfUkVHX0VYUCA9IC9mcm9tICcoPzxJbXBvcnRQYXRoPi4rPylcXC50cyc7L2dtO1xuXG4vLyBJbmxpbmUgaW1wb3J0LXR5cGUgbm9kZXMgKGB0eXBlb2YgaW1wb3J0KCcuL2Zvby50cycpYCkgcHJlc2VydmUgdGhlIHNvdXJjZSBxdW90ZSBzdHlsZS5cbi8vIEhhbmQtYXV0aG9yZWQgYC5kLnRzYCBmaWxlcyBlbWl0IHNpbmdsZSBxdW90ZXM7IHRzYy1nZW5lcmF0ZWQgZGVjbGFyYXRpb25zIGVtaXQgZG91YmxlIHF1b3Rlcy5cbi8vIENhcHR1cmUgdGhlIHF1b3RlIGFuZCByZXVzZSBpdCBpbiB0aGUgcmVwbGFjZW1lbnQgc28gYm90aCBzdHlsZXMgYXJlIHJld3JpdHRlbi5cbmNvbnN0IERZTkFNSUNfSU1QT1JUX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+WydcIl0pKD88SW1wb3J0UGF0aD4uKz8pXFwudHNcXGs8UXVvdGU+XFwpL2dtO1xuXG5lbnVtIEdlbmVyYXRlSW5kZXhSZXN1bHQge1xuICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbmludGVyZmFjZSBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMge1xuICByZWFkb25seSBsaWJzOiBTZXQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgcmVhZG9ubHkgc3ltYm9sOiBUc1N5bWJvbDtcbiAgcmVhZG9ubHkgdHlwZXM6IFNldDxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgQnVpbGRMaWJyYXJ5Rm9ybWF0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBNb2R1bGVGb3JtYXQ7XG4gIHJlYWRvbmx5IGxpYkZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcHJlcHJvY2Vzc1BsdWdpbkZhY3Rvcnk6IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kdWxlRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlVHlwZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlSW5kZXhQYXJhbXMge1xuICByZWFkb25seSBleGNsdWRlZFBhdGhzOiBSZWFkb25seVNldDxzdHJpbmc+O1xuICByZWFkb25seSBmb2xkZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgdW5tYXRjaGVkUGF0aHM6IFNldDxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgU2V0RXhwb3J0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucztcbiAgcmVhZG9ubHkgaXNXaWxkY2FyZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVG9EaXN0UGF0aFBhcmFtcyB7XG4gIHJlYWRvbmx5IGZvcm1hdDogc3RyaW5nO1xuICByZWFkb25seSBpbXBvcnRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZXJ5dGhpbmcgYW4gZWFybGllciBidWlsZCBsZWZ0OiBgZGlzdC9gLCB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2AgYmFycmVscywgdGhlIGAuZC50c2AgZmlsZXMgYHRzY2Agd3JvdGVcbiAqIGJlc2lkZSB0aGUgc291cmNlcyAoaGFuZC1hdXRob3JlZCBvbmVzIHVuZGVyIGBAdHlwZXNgIHN0YXkpLCBhbmQgdGhlIHBlci1zdWJwYXRoIGBwYWNrYWdlLmpzb25gIHN0dWJzLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeXRoaW5nIGhhcyBiZWVuIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENsZWFuTGlicmFyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYnVpbGRDbGVhbigpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKGJhc2VuYW1lKGZpbGUpID09PSBSZXBvUGF0aHMuSW5kZXhUcyBhcyBzdHJpbmcpIHtcbiAgICAgIGF3YWl0IHJtKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpO1xuICAgIH1cblxuICAgIGlmIChmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pICYmICFmaWxlLnNwbGl0KCcvJykuaW5jbHVkZXMoUmVwb1BhdGhzLlR5cGVzKSkge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuQ3VycmVudEZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoKGJhc2VuYW1lKGZpbGUpICE9PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCAoZmlsZSA9PT0gUmVwb1BhdGhzLlBhY2thZ2VKc29uIGFzIHN0cmluZykgfHwgZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5Ob2RlTW9kdWxlcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGF3YWl0IHJtKGZpbGUpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGV2ZXJ5IHNvdXJjZSBtb2R1bGUsIHVuYnVuZGxlZCwgaW50byBgZGlzdC9saWIvY2pzYCAoYC5janNgKSBhbmQgYGRpc3QvbGliL2VzbWAgKGAubWpzYCkuXG4gKlxuICogVGhlIG91dHB1dCBmb2xkZXJzIG11c3QgYWxyZWFkeSBleGlzdDsge0BsaW5rIGJ1aWxkTGlicmFyeVR5cGVzfSBjcmVhdGVzIHRoZW0uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgYnVpbGQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBib3RoIGZvcm1hdHMgaGF2ZSBiZWVuIGJ1aWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5KG9wdGlvbnM6IEJ1aWxkTGlicmFyeU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5ID0gKGlzRXNtOiBib29sZWFuKTogUGx1Z2luID0+IHByZXByb2Nlc3NQbHVnaW4oeyBpc0VzbSB9KSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbGliRmlsZXMgPSBhd2FpdCBnZXRMaWJGaWxlcygpO1xuICBhd2FpdCBidWlsZExpYnJhcnlGb3JtYXQoeyBmb3JtYXQ6ICdjanMnLCBsaWJGaWxlcywgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgfSk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2VzbScsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbn1cblxuLyoqXG4gKiBFbWl0cyB0aGUgZGVjbGFyYXRpb25zIHdpdGggYHRzYyAtLXByb2plY3QgLi90c2NvbmZpZy50eXBlcy5qc29uYCwgdGhlbiBjb3BpZXMgZWFjaCBvbmUgaW50byBgZGlzdC9saWJgIHR3aWNlOiBhcyBhXG4gKiBgLmQuY3RzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5janNgIGZpbGVzIGFuZCB3aG9zZSBiYXJlIHR5cGUgaW1wb3J0cyBjYXJyeSBgcmVzb2x1dGlvbi1tb2RlOiBpbXBvcnRgLCBhbmRcbiAqIGFzIGEgYC5kLm10c2Agd2hvc2UgcmVsYXRpdmUgaW1wb3J0cyBuYW1lIGAubWpzYCBmaWxlcy5cbiAqXG4gKiBUaGUgbGlicmFyeSdzIHJvb3QgZGVjbGFyYXRpb24gKGBsaWJyYXJ5LnRzYCB3aGVyZSB0aGUgcGFja2FnZSBoYXMgb25lLCBvdGhlcndpc2UgdGhlIGdlbmVyYXRlZCBgaW5kZXgudHNgKSBjYXJyaWVzXG4gKiBldmVyeSBgbGliYCBhbmQgYHR5cGVzYCByZWZlcmVuY2UgdGhlIHBhY2thZ2UgbmVlZHMuIEV2ZXJ5IG90aGVyIGRlY2xhcmF0aW9uIHJlZmVyZW5jZXMgYSBgbGlicmFyeS1yZWZlcmVuY2VzYFxuICogZGVjbGFyYXRpb24gYmVzaWRlIGl0IGJ5IHBhdGgsIG5ldmVyIHRoZSByb290OiB0aGUgcm9vdCBiYXJyZWwgcmUtZXhwb3J0cyBldmVyeSBtb2R1bGUsIHNvIHJlZmVyZW5jaW5nIGl0IG1hZGUgZWFjaFxuICogc3VicGF0aCBsb2FkIHRoZSB3aG9sZSBwYWNrYWdlLCBhbmQgYSBjb25zdW1lciB0eXBlLWNoZWNraW5nIHdpdGggYHNraXBMaWJDaGVjazogZmFsc2VgIHRoZW4gbmVlZGVkIGV2ZXJ5IG9wdGlvbmFsXG4gKiBwZWVyIGluc3RhbGxlZC5cbiAqXG4gKiBgbGlicmFyeS1yZWZlcmVuY2VzYCBjYXJyaWVzIG9ubHkgdGhlIGxpYnMgdGhhdCBkZXNjcmliZSB0aGUgbGFuZ3VhZ2UgKGBlczIwMjJgLCBgZXNuZXh0LmRpc3Bvc2FibGVgKSwgd2hpY2ggbm9cbiAqIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoLiBUaGUgb25lcyB0aGF0IGRlc2NyaWJlIGEgaG9zdCAoYGRvbWAsIGBkb20uaXRlcmFibGVgLCBgd2Vid29ya2VyYCkgYW5kIGB0eXBlcz1cIm5vZGVcImAgZ29cbiAqIG9ubHkgaW50byB0aGUgZGVjbGFyYXRpb25zIHRoYXQgbmFtZSBvbmUgb2YgdGhlaXIgZ2xvYmFscywgZm91bmQgYnkgcmVzb2x2aW5nIGV2ZXJ5IG5hbWUgaW4gdGhlIGVtaXR0ZWRcbiAqIGRlY2xhcmF0aW9ucyB3aXRoIHRoZSB0eXBlIGNoZWNrZXIuIE90aGVyd2lzZSBhIGJyb3dzZXIgY29uc3VtZXIgb2YgYSBwdXJlIHN1YnBhdGggZ290IGFsbCBvZiBgQHR5cGVzL25vZGVgLCBhbmQgaXRzXG4gKiBgc2V0VGltZW91dGAgcmV0dXJuZWQgYE5vZGVKUy5UaW1lb3V0YC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRlY2xhcmF0aW9ucyBoYXZlIGJlZW4gd3JpdHRlbi5cbiAqIEB0aHJvd3MgSWYgYSBzb3VyY2UgbW9kdWxlIGlzIG5hbWVkIGBsaWJyYXJ5LXJlZmVyZW5jZXNgLCB3aGljaCB3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeVR5cGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsIGAke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259YCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzcmMvJHtMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FfSR7UmVwb1BhdGhzLlRzRXh0ZW5zaW9ufSBjb2xsaWRlcyB3aXRoIHRoZSBnZW5lcmF0ZWQgZGVjbGFyYXRpb24gb2YgdGhlIHNhbWUgbmFtZS5gKTtcbiAgfVxuXG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbLi4ucmVzb2x2ZVRvb2xDb21tYW5kKHsgdG9vbDogJ3RzYycgfSksICctLXByb2plY3QnLCAnLi90c2NvbmZpZy50eXBlcy5qc29uJ10pO1xuXG4gIGNvbnN0IGxpYnJhcnlGaWxlTmFtZSA9IGV4aXN0c1N5bmMoam9pbihSZXBvUGF0aHMuU3JjLCAnbGlicmFyeS50cycpKSA/ICdsaWJyYXJ5JyA6ICdpbmRleCc7XG4gIGNvbnN0IGFsbExpYnMgPSBhd2FpdCBjb2xsZWN0QWxsTGlicygpO1xuICBjb25zdCBhbGxUeXBlcyA9IGNvbGxlY3RBbGxUeXBlcygpO1xuICBjb25zdCBkaXJlY3RpdmVzID0gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGFsbExpYnMpICsgYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXMoYWxsVHlwZXMpO1xuICAvLyBPbmx5IHRoZSBsaWJzIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoLiBUaGUgZW52aXJvbm1lbnQgZ2xvYmFscyBnbyB0byB0aGUgZGVjbGFyYXRpb25zIHRoYXQgdXNlIHRoZW0uXG4gIGNvbnN0IHNoYXJlZERpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicy5maWx0ZXIoKGxpYikgPT4gIWlzRW52aXJvbm1lbnRMaWIobGliKSkpO1xuXG4gIGF3YWl0IG1rZGlyKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcywgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSwgc2hhcmVkRGlyZWN0aXZlcyk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24pLCBzaGFyZWREaXJlY3RpdmVzKTtcblxuICBjb25zdCBzcmNGaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZGVjbGFyYXRpb25GaWxlcyA9IHNyY0ZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5UZXN0SGVscGVycykpO1xuICBjb25zdCBlbnZpcm9ubWVudERpcmVjdGl2ZXMgPSBjb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzKHsgYXZhaWxhYmxlVHlwZXM6IGFsbFR5cGVzLCBkZWNsYXJhdGlvbkZpbGVzIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBkZWNsYXJhdGlvbkZpbGVzKSB7XG4gICAgY29uc3QgZm9sZGVyID0gZGlybmFtZShmaWxlKTtcbiAgICBjb25zdCBuYW1lID0gYmFzZW5hbWUoZmlsZSwgUmVwb1BhdGhzLkR0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSksICd1dGYtOCcpO1xuXG4gICAgY29uc3QgY3RzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMsIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKTtcbiAgICBjb25zdCBtdHNQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSwgZm9sZGVyLCBuYW1lICsgUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24pO1xuXG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShjdHNQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShtdHNQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBsZXQgY3RzQ29udGVudCA9IHRvQ3RzQ29udGVudChjb250ZW50KTtcbiAgICBsZXQgbXRzQ29udGVudCA9IHRvTXRzQ29udGVudChjb250ZW50KTtcblxuICAgIGlmIChuYW1lID09PSBsaWJyYXJ5RmlsZU5hbWUgJiYgZm9sZGVyID09PSAnLicpIHtcbiAgICAgIGN0c0NvbnRlbnQgPSBkaXJlY3RpdmVzICsgY3RzQ29udGVudDtcbiAgICAgIG10c0NvbnRlbnQgPSBkaXJlY3RpdmVzICsgbXRzQ29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlsZURpcmVjdGl2ZXMgPSBlbnZpcm9ubWVudERpcmVjdGl2ZXMuZ2V0KGZpbGUpID8/ICcnO1xuICAgICAgY3RzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IGN0c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkNqcyB9KVxuICAgICAgICArIGZpbGVEaXJlY3RpdmVzICsgY3RzQ29udGVudDtcbiAgICAgIG10c0NvbnRlbnQgPSBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUoeyBkZWNsYXJhdGlvbkZpbGVQYXRoOiBtdHNQYXRoLCBleHRlbnNpb246IFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5Fc20gfSlcbiAgICAgICAgKyBmaWxlRGlyZWN0aXZlcyArIG10c0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGN0c1BhdGgsIGN0c0NvbnRlbnQpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShtdHNQYXRoLCBtdHNDb250ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2VuZXJhdGVzIHRoZSBgZXhwb3J0c2AgbWFwIG9mIHRoZSBwYWNrYWdlJ3MgYHBhY2thZ2UuanNvbmAgZnJvbSBpdHMgc291cmNlIGZvbGRlcnMsIGFuZCB3cml0ZXMgYSBgcGFja2FnZS5qc29uYFxuICogc3R1YiBwZXIgc3VicGF0aCBmb3IgcmVzb2x2ZXJzIHRoYXQgZG8gbm90IHJlYWQgYGV4cG9ydHNgLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9uc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG1hcCBpcyBjdXJyZW50LlxuICogQHRocm93cyBJZiB0aGUgbWFwIGNoYW5nZWQsIHNvIHRoZSBjaGFuZ2UgZ2V0cyByZXZpZXdlZCBhbmQgY29tbWl0dGVkIHJhdGhlciB0aGFuIHNoaXBwZWQgdW5zZWVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0cyhvcHRpb25zOiBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYWRkaXRpb25hbEV4cG9ydHMgPSB7fSwgc291cmNlQ29uZGl0aW9uIH0gPSBvcHRpb25zO1xuICBjb25zdCBzcmNGb2xkZXJzOiBzdHJpbmdbXSA9IFtSZXBvUGF0aHMuU3JjXTtcblxuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUsIHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gam9pbihkaXJlbnQucGFyZW50UGF0aCwgZGlyZW50Lm5hbWUpO1xuXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoUmVwb1BhdGhzLlN0eWxlcykgfHwgcGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuVGVzdEhlbHBlcnMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBzcmNGb2xkZXJzLnB1c2gocGF0aCk7XG4gIH1cblxuICBzcmNGb2xkZXJzLnNvcnQoKTtcblxuICBsZXQgaXNDaGFuZ2VkID0gZmFsc2U7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKGFzeW5jIChwYWNrYWdlSnNvbikgPT4ge1xuICAgIGNvbnN0IG9sZEV4cG9ydHMgPSBwYWNrYWdlSnNvbi5leHBvcnRzO1xuICAgIGNvbnN0IGV4cG9ydENvbmRpdGlvbnM6IFBhY2thZ2VKc29uLkV4cG9ydENvbmRpdGlvbnMgPSB7fTtcbiAgICBwYWNrYWdlSnNvbi5leHBvcnRzID0gZXhwb3J0Q29uZGl0aW9ucztcbiAgICBmb3IgKGNvbnN0IHNyY0ZvbGRlciBvZiBzcmNGb2xkZXJzKSB7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiBmYWxzZSwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSk7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiB0cnVlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdWJwYXRoLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoYWRkaXRpb25hbEV4cG9ydHMpKSB7XG4gICAgICBpZiAoZXhwb3J0Q29uZGl0aW9uc1tzdWJwYXRoXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFkZGl0aW9uYWwgZXhwb3J0ICcke3N1YnBhdGh9JyBjb2xsaWRlcyB3aXRoIGFuIGVudHJ5IGdlbmVyYXRlZCBmcm9tIGEgc291cmNlIGZvbGRlci5gKTtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0Q29uZGl0aW9uc1tzdWJwYXRoXSA9IGVudHJ5O1xuICAgIH1cblxuICAgIGlzQ2hhbmdlZCA9ICFpc0RlZXBFcXVhbChvbGRFeHBvcnRzLCBwYWNrYWdlSnNvbi5leHBvcnRzKTtcbiAgfSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgY2hhbmdlZCBpbiB0aGUgYGVkaXRQYWNrYWdlSnNvbmAsIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgaWYgKGlzQ2hhbmdlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGFja2FnZSBleHBvcnRzIGhhdmUgY2hhbmdlZC4gUGxlYXNlIHJldmlldyB0aGUgY2hhbmdlcyBhbmQgY29tbWl0IHRoZW0uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gYGluZGV4LnRzYCBiYXJyZWwgaW4gZXZlcnkgc291cmNlIGZvbGRlciB0aGF0IGhhcyBzb21ldGhpbmcgdG8gZXhwb3J0LCByZS1leHBvcnRpbmcgZWFjaCBtb2R1bGUgYW5kXG4gKiBlYWNoIHN1Yi1iYXJyZWwgdW5kZXIgaXRzIG93biBuYW1lLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhcnJlbHMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlJbmRleChvcHRpb25zOiBHZW5lcmF0ZUxpYnJhcnlJbmRleE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGNsdWRlZFBhdGhzID0gbmV3IFNldCgob3B0aW9ucy5leGNsdWRlRnJvbUluZGV4ID8/IFtdKS5tYXAoKHBhdGgpID0+IGpvaW4ocGF0aC5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSkucmVwbGFjZSgvXFwvJC8sICcnKSkpO1xuICBjb25zdCB1bm1hdGNoZWRQYXRocyA9IG5ldyBTZXQoZXhjbHVkZWRQYXRocyk7XG4gIGF3YWl0IGdlbmVyYXRlSW5kZXgoeyBleGNsdWRlZFBhdGhzLCBmb2xkZXI6IFJlcG9QYXRocy5TcmMsIHVubWF0Y2hlZFBhdGhzIH0pO1xuXG4gIGlmICh1bm1hdGNoZWRQYXRocy5zaXplID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZXhjbHVkZUZyb21JbmRleCBuYW1lcyBubyBtb2R1bGUgdGhlIGJhcnJlbHMgd291bGQgZXhwb3J0OiAke1suLi51bm1hdGNoZWRQYXRoc10uam9pbignLCAnKX0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGVhY2ggbmFtZWQgbnBtIHNjcmlwdCB0aGUgcGFja2FnZSBkZWZpbmVzLCBpbiBvcmRlciwgc2tpcHBpbmcgdGhlIG9uZXMgaXQgZG9lcyBub3QgZGVmaW5lLlxuICpcbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBucG0gc2NyaXB0IG5hbWVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHN0ZXAgaGFzIHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHMoc3RlcHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gTElCUkFSWV9CVUlMRF9TVEVQUyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbChzdGVwKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgd2hhdCBhIGNvbnN1bWVyIG5lZWRzIGxvYWRlZCBmb3Igb25lIHN5bWJvbCBhIGRlY2xhcmF0aW9uIG5hbWVzLiBBIHN5bWJvbCBhbnkgRVMgbGliIGRlY2xhcmVzIG5lZWRzIG5vdGhpbmcsXG4gKiBiZWNhdXNlIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoIHRob3NlIGxpYnMuIE90aGVyd2lzZSBlYWNoIGVudmlyb25tZW50IGxpYiB0aGF0IGRlY2xhcmVzIGl0IGFkZHMgaXRzZWxmLCBhbmRcbiAqIGZhaWxpbmcgdGhhdCBgQHR5cGVzL25vZGVgIGFkZHMgYG5vZGVgLiBBIHN5bWJvbCBkZWNsYXJlZCBpbiB0aGUgcGFja2FnZSdzIG93biBmaWxlcyBhZGRzIG5vdGhpbmc6IHRoZSBkZWNsYXJhdGlvblxuICogdGhhdCBob2xkcyBpdCBjYXJyaWVzIGl0cyBvd24gZGlyZWN0aXZlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN5bWJvbCwgdGhlIHByb2dyYW0gaXQgd2FzIHJlc29sdmVkIGluLCBhbmQgdGhlIHNldHMgdG8gYWRkIHRvLlxuICovXG5mdW5jdGlvbiBhZGRFbnZpcm9ubWVudEdsb2JhbHMocGFyYW1zOiBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2w6ICRzeW1ib2wsIHR5cGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVudmlyb25tZW50TGliczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGlzTm9kZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgJHN5bWJvbC5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpO1xuICAgIGlmIChwcm9ncmFtLmlzU291cmNlRmlsZURlZmF1bHRMaWJyYXJ5KHNvdXJjZUZpbGUpKSB7XG4gICAgICBjb25zdCBsaWIgPSB0b0xpYk5hbWUoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgICBpZiAoIWlzRW52aXJvbm1lbnRMaWIobGliKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbnZpcm9ubWVudExpYnMucHVzaChsaWIpO1xuICAgIH0gZWxzZSBpZiAoc291cmNlRmlsZS5maWxlTmFtZS5pbmNsdWRlcyhOT0RFX1RZUEVTX1BBVEhfU0VHTUVOVCkpIHtcbiAgICAgIGlzTm9kZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGVudmlyb25tZW50TGlicy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBsaWIgb2YgZW52aXJvbm1lbnRMaWJzKSB7XG4gICAgICBsaWJzLmFkZChsaWIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc05vZGUpIHtcbiAgICB0eXBlcy5hZGQoJ25vZGUnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMobGliczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7XG4gICAgbGlic1xuICAgICAgLm1hcCgobGliKSA9PiBgLy8vICR7UkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkV9XCIke2xpYn1cIiAvPmApXG4gICAgICAuam9pbignXFxuJylcbiAgfVxcbmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKHR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlcy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiBgJHtcbiAgICAgIHR5cGVzXG4gICAgICAgIC5tYXAoKHR5cGUpID0+IGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIiR7dHlwZX1cIiAvPmApXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgIH1cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnlGb3JtYXQocGFyYW1zOiBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBmb3JtYXQsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9ID0gcGFyYW1zO1xuICBjb25zdCBleHRlbnNpb24gPSBmb3JtYXQgPT09ICdjanMnID8gUmVwb1BhdGhzLkNqc0V4dGVuc2lvbiA6IFJlcG9QYXRocy5NanNFeHRlbnNpb247XG4gIGNvbnN0IGJ1aWxkT3B0aW9uczogQnVpbGRPcHRpb25zID0ge1xuICAgIC8vIEV4cGxpY2l0LCBiZWNhdXNlIGVzYnVpbGQgb3RoZXJ3aXNlIHRha2VzIHRoZSBmb2xkZXIgaXRzIHNlcnZpY2UgcHJvY2VzcyBzdGFydGVkIGluLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGVzYnVpbGQncyBvd24gb3B0aW9uIG5hbWUuXG4gICAgYWJzV29ya2luZ0RpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICBiYW5uZXI6IHtcbiAgICAgIGpzOiBMSUJSQVJZX0JBTk5FUlxuICAgIH0sXG4gICAgYnVuZGxlOiBmYWxzZSxcbiAgICBlbnRyeVBvaW50czogbGliRmlsZXMsXG4gICAgZm9ybWF0LFxuICAgIGxvZ0xldmVsOiAnaW5mbycsXG4gICAgb3V0ZGlyOiBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBmb3JtYXQpLFxuICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgcGx1Z2luczogW1xuICAgICAgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkoZm9ybWF0ID09PSAnZXNtJyksXG4gICAgICBmaXhFc21QbHVnaW4oKSxcbiAgICAgIGNoYW5nZUV4dGVuc2lvblBsdWdpbihleHRlbnNpb24pXG4gICAgXSxcbiAgICBzb3VyY2VtYXA6ICdpbmxpbmUnLFxuICAgIHRhcmdldDogJ0VTMjAyMicsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgd3JpdGU6IGZhbHNlXG4gIH07XG5cbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgY29udGV4dChidWlsZE9wdGlvbnMpO1xuICB0cnkge1xuICAgIGF3YWl0IGJ1aWxkQ29udGV4dC5yZWJ1aWxkKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUocGFyYW1zOiBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGRlY2xhcmF0aW9uRmlsZVBhdGgsIGV4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGxpYnJhcnlGaWxlUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIG1vZHVsZURpcmVjdG9yeSwgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIGV4dGVuc2lvbik7XG4gIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZU5hdGl2ZShkaXJuYW1lKGRlY2xhcmF0aW9uRmlsZVBhdGgpLCBsaWJyYXJ5RmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICB9XG4gIHJldHVybiBgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiR7cmVsYXRpdmVQYXRofVwiIC8+XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFsbExpYnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAvLyBUaGUgUkVTT0xWRUQgb3B0aW9ucywgYmVjYXVzZSBhIHBhY2thZ2UncyBgdHNjb25maWcuanNvbmAgaW5oZXJpdHMgYGxpYmAgZnJvbSB0aGUgc2hhcmVkIGJhc2UuIFRoZSByZXNvbHZlZFxuICAvLyBuYW1lcyBhcmUgZmlsZSBuYW1lcyAoYGxpYi5kb20uaXRlcmFibGUuZC50c2ApLCBzbyB0aGV5IGFyZSBtYXBwZWQgYmFjayBvbnRvIHRoZSBuYW1lcyBhIGRpcmVjdGl2ZSB0YWtlcy5cbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBsaWJzID0gbmV3IFNldCgob3B0aW9ucy5saWIgPz8gW10pLm1hcCgobGliKSA9PiB0b0xpYk5hbWUobGliKSkpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoIWZpbGUuZW5kc1dpdGgoJy50cycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gcmVhZEZpbGVTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSksICd1dGYtOCcpO1xuICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWx3YXlzIGNhcHR1cmVzIGl0cyBvbmUgZ3JvdXAsIHNvIG5vIGZhbGxiYWNrIGZvciBhIG1pc3Npbmcgb25lIGlzIG5lZWRlZC5cbiAgICBmb3IgKGNvbnN0IFssIGxpYl0gb2Ygc291cmNlQ29udGVudC5tYXRjaEFsbChSRUZFUkVOQ0VfTElCX1JFR19FWFApKSB7XG4gICAgICBsaWJzLmFkZChTdHJpbmcobGliKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gWy4uLmxpYnNdLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEFsbFR5cGVzKCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICByZXR1cm4gKG9wdGlvbnMudHlwZXMgPz8gW10pXG4gICAgLmZpbHRlcigodHlwZSkgPT4gREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTLmhhcyh0eXBlKSlcbiAgICAuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzKHBhcmFtczogQ29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlc1BhcmFtcyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB7IGF2YWlsYWJsZVR5cGVzLCBkZWNsYXJhdGlvbkZpbGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oe1xuICAgIG9wdGlvbnM6IHsgLi4ub3B0aW9ucywgbm9FbWl0OiB0cnVlIH0sXG4gICAgcm9vdE5hbWVzOiBkZWNsYXJhdGlvbkZpbGVzLm1hcCgoZmlsZSkgPT4gcmVzb2x2ZU5hdGl2ZShSZXBvUGF0aHMuU3JjLCBmaWxlKSlcbiAgfSk7XG4gIGNvbnN0IGNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXNCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBkZWNsYXJhdGlvbkZpbGVzKSB7XG4gICAgLy8gVGhlIHByb2dyYW0gd2FzIGhhbmRlZCBldmVyeSBvbmUgb2YgdGhlc2UgYXMgYSByb290IG5hbWUsIHNvIGVhY2ggb25lIGlzIGluIGl0LlxuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBlbnN1cmVOb25OdWxsYWJsZShwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZU5hdGl2ZShSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICAgIGNvbnN0IGxpYnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCB0eXBlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZnVuY3Rpb24gdmlzaXQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgICAgaWYgKGlzSWRlbnRpZmllcihub2RlKSB8fCBpc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICAgICAgY29uc3QgJHN5bWJvbCA9IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihub2RlKTtcbiAgICAgICAgaWYgKCRzeW1ib2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZEVudmlyb25tZW50R2xvYmFscyh7IGxpYnMsIHByb2dyYW0sIHN5bWJvbDogcmVzb2x2ZUFsaWFzKGNoZWNrZXIsICRzeW1ib2wpLCB0eXBlcyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgICB9XG4gICAgdmlzaXQoc291cmNlRmlsZSk7XG5cbiAgICBjb25zdCBuZWVkZWRUeXBlcyA9IFsuLi50eXBlc10uZmlsdGVyKCh0eXBlKSA9PiBhdmFpbGFibGVUeXBlcy5pbmNsdWRlcyh0eXBlKSk7XG4gICAgaWYgKGxpYnMuc2l6ZSA+IDAgfHwgbmVlZGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgZGlyZWN0aXZlc0J5RmlsZS5zZXQoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIChsaWJzLnNpemUgPiAwID8gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKFsuLi5saWJzXS5zb3J0KCkpIDogJycpICsgYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXMobmVlZGVkVHlwZXMuc29ydCgpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlyZWN0aXZlc0J5RmlsZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleChwYXJhbXM6IEdlbmVyYXRlSW5kZXhQYXJhbXMpOiBQcm9taXNlPEdlbmVyYXRlSW5kZXhSZXN1bHQ+IHtcbiAgY29uc3QgeyBmb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgZGlyZW50cyA9IGF3YWl0IHJlYWRkaXJQb3NpeChmb2xkZXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3QgbWF5YmVMaW5lcyA9IGF3YWl0IGFzeW5jTWFwKGRpcmVudHMsIChkaXJlbnQpID0+IGhhbmRsZUluZGV4RGlyZW50KHBhcmFtcywgZGlyZW50KSk7XG4gIGNvbnN0IGxpbmVzID0gbWF5YmVMaW5lcy5maWx0ZXIoKGxpbmUpID0+IGxpbmUgIT09IHVuZGVmaW5lZCk7XG5cbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBHZW5lcmF0ZUluZGV4UmVzdWx0LlNraXBwZWQ7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZShqb2luKGZvbGRlciwgUmVwb1BhdGhzLkluZGV4VHMpLCBsaW5lcyk7XG4gIHJldHVybiBHZW5lcmF0ZUluZGV4UmVzdWx0LlN1Y2Nlc3M7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExpYkZpbGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgbGV0IGZpbGVzID0gYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBmaWxlcyA9IGZpbGVzLm1hcCgoZmlsZSkgPT4gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKSk7XG4gIHJldHVybiBmaWxlcy5maWx0ZXIoKGZpbGUpID0+XG4gICAgZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuVHNFeHRlbnNpb24pICYmICFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pICYmICFmaWxlLmVuZHNXaXRoKCcudGVzdC50cycpXG4gICAgJiYgIWZpbGUuaW5jbHVkZXMoYC8ke1JlcG9QYXRocy5UZXN0SGVscGVyc30vYClcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlSW5kZXhEaXJlbnQocGFyYW1zOiBHZW5lcmF0ZUluZGV4UGFyYW1zLCBkaXJlbnQ6IERpcmVudCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgZXhjbHVkZWRQYXRocywgZm9sZGVyLCB1bm1hdGNoZWRQYXRocyB9ID0gcGFyYW1zO1xuICBpZiAoaXNFeGNsdWRlZEZyb21JbmRleChmb2xkZXIsIGRpcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXRoID0gam9pbihmb2xkZXIsIGRpcmVudC5uYW1lKTtcbiAgaWYgKGV4Y2x1ZGVkUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgdW5tYXRjaGVkUGF0aHMuZGVsZXRlKHBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzb3VyY2VGaWxlOiBzdHJpbmc7XG4gIGxldCBuYW1lOiBzdHJpbmc7XG4gIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdlbmVyYXRlSW5kZXgoeyAuLi5wYXJhbXMsIGZvbGRlcjogcGF0aCB9KTtcbiAgICBpZiAocmVzdWx0ICE9PSBHZW5lcmF0ZUluZGV4UmVzdWx0LlN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc291cmNlRmlsZSA9IG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihkaXJlbnQubmFtZSwgUmVwb1BhdGhzLkluZGV4VHMpKTtcbiAgICBuYW1lID0gZGlyZW50Lm5hbWU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShkaXJlbnQubmFtZSk7XG4gICAgbmFtZSA9IGJhc2VuYW1lKGRpcmVudC5uYW1lLCBleHRlbnNpb24pO1xuICAgIHNvdXJjZUZpbGUgPSBub3JtYWxpemVJZlJlbGF0aXZlKGRpcmVudC5uYW1lKTtcbiAgfVxuXG4gIHJldHVybiBgZXhwb3J0ICogYXMgJyR7bmFtZX0nIGZyb20gJyR7c291cmNlRmlsZX0nO2A7XG59XG5cbmZ1bmN0aW9uIGlzRW52aXJvbm1lbnRMaWIobGliOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVOVklST05NRU5UX0xJQl9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGxpYi5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkRmlsZU5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhbmFtZS5lbmRzV2l0aChSZXBvUGF0aHMuVHNFeHRlbnNpb24pIHx8IG5hbWUuZW5kc1dpdGgoJy50ZXN0LnRzJykgfHwgbmFtZSA9PT0gJ3NldHVwLnRzJyB8fCBuYW1lLmVuZHNXaXRoKCctc2V0dXAudHMnKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZyb21JbmRleChmb2xkZXI6IHN0cmluZywgZGlyZW50OiBEaXJlbnQpOiBib29sZWFuIHtcbiAgY29uc3QgZXhjbHVkZWROYW1lczogcmVhZG9ubHkgc3RyaW5nW10gPSBbUmVwb1BhdGhzLkluZGV4VHMsIFJlcG9QYXRocy5UeXBlcywgUmVwb1BhdGhzLlN0eWxlcywgUmVwb1BhdGhzLlRlc3RIZWxwZXJzXTtcbiAgY29uc3QgaXNFeGNsdWRlZEVudHJ5ID0gZXhjbHVkZWROYW1lcy5pbmNsdWRlcyhkaXJlbnQubmFtZSkgfHwgZGlyZW50Lm5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgfHwgZm9sZGVyLnNwbGl0KCcvJykuaW5jbHVkZXMoUmVwb1BhdGhzLlR5cGVzKTtcbiAgcmV0dXJuIGlzRXhjbHVkZWRFbnRyeSB8fCAoZGlyZW50LmlzRmlsZSgpICYmIGlzRXhjbHVkZWRGaWxlTmFtZShkaXJlbnQubmFtZSkpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQWxpYXMoY2hlY2tlcjogVHlwZUNoZWNrZXIsICRzeW1ib2w6IFRzU3ltYm9sKTogVHNTeW1ib2wge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSAtLSBgU3ltYm9sRmxhZ3NgIGlzIGEgYml0IHNldC5cbiAgcmV0dXJuICgkc3ltYm9sLmZsYWdzICYgU3ltYm9sRmxhZ3MuQWxpYXMpID09PSAwID8gJHN5bWJvbCA6IGNoZWNrZXIuZ2V0QWxpYXNlZFN5bWJvbCgkc3ltYm9sKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydCgkPFF1b3RlPiQ8U3BlY2lmaWVyPiQ8UXVvdGU+LCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTGliTmFtZShsaWJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQSBsaWIgYSBwYWNrYWdlIHJlcGxhY2VkIChgQHR5cGVzY3JpcHQvbGliLWRvbWAsIGBAdHlwZXNjcmlwdC9saWItZG9tL2l0ZXJhYmxlLmQudHNgKSBpcyBuYW1lZCBieSBpdHMgcGF0aCwgbm90IGJ5XG4gIC8vIGl0cyBmaWxlIG5hbWUsIHdoaWNoIGlzIGBpbmRleC5kLnRzYCBmb3IgdGhlIGxpYidzIHJvb3QuXG4gIGNvbnN0IHJlcGxhY2VtZW50TWF0Y2ggPSBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUC5leGVjKGxpYkZpbGVQYXRoKTtcbiAgaWYgKHJlcGxhY2VtZW50TWF0Y2g/Lmdyb3VwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgYm90aCBncm91cHMuXG4gICAgY29uc3QgbGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydMaWInXSk7XG4gICAgY29uc3Qgc3ViTGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydTdWJMaWInXSk7XG4gICAgcmV0dXJuIChzdWJMaWIgPT09ICdpbmRleCcgPyBsaWIgOiBgJHtsaWJ9LiR7c3ViTGliLnJlcGxhY2VBbGwoJy8nLCAnLicpfWApLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VuYW1lKGxpYkZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15saWJcXC4vLCAnJykucmVwbGFjZSgvXFwuZFxcLnRzJC8sICcnKTtcbn1cblxuZnVuY3Rpb24gdG9NdHNDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG10c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+Lm1qc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBtdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5tanMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihmb2xkZXI6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlSnNvbihqb2luKGZvbGRlciwg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O0FBQUEsUUFDM0YsTUFBTTtBQUFBLFFBQ047QUFBQSxNQUNGO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsYUFBYSxTQUF5QjtBQUM3QyxNQUFJLGlCQUFhLDBCQUFXO0FBQUEsSUFDMUIsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQUNELG1CQUFhLDBCQUFXO0FBQUEsSUFDdEIsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQU1ELG1CQUFhLDBCQUFXO0FBQUEsSUFDdEIsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQUNELGFBQU8sMEJBQVc7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZixDQUFDO0FBQ0g7QUFFQSxTQUFTLFdBQVcsUUFBa0M7QUFDcEQsYUFBTyxxQ0FBb0Isa0JBQUssNEJBQVUsU0FBUyxPQUFPLFFBQVEsT0FBTyxZQUFZLE9BQU8sSUFBSSxDQUFDO0FBQ25HO0FBRUEsU0FBUyxVQUFVLGFBQTZCO0FBRzlDLFFBQU0sbUJBQW1CLHdCQUF3QixLQUFLLFdBQVc7QUFDakUsTUFBSSxrQkFBa0IsV0FBVyxRQUFXO0FBRTFDLFVBQU0sTUFBTSxPQUFPLGlCQUFpQixPQUFPLEtBQUssQ0FBQztBQUNqRCxVQUFNLFNBQVMsT0FBTyxpQkFBaUIsT0FBTyxRQUFRLENBQUM7QUFDdkQsWUFBUSxXQUFXLFVBQVUsTUFBTSxHQUFHLEdBQUcsSUFBSSxPQUFPLFdBQVcsS0FBSyxHQUFHLENBQUMsSUFBSSxZQUFZO0FBQUEsRUFDMUY7QUFDQSxhQUFPLHNCQUFTLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxVQUFVLEVBQUUsRUFBRSxRQUFRLFlBQVksRUFBRTtBQUN6RjtBQUVBLFNBQVMsYUFBYSxTQUF5QjtBQUM3QyxRQUFNLGlCQUFhLDBCQUFXO0FBQUEsSUFDNUIsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQUNELGFBQU8sMEJBQVc7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZixDQUFDO0FBQ0g7QUFFQSxlQUFlLHdCQUF3QixRQUFnQixhQUF5QztBQUM5RixZQUFNLHVCQUFNLFFBQVEsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUN2QyxZQUFNLDJCQUFVLGtCQUFLLFFBQVEsNEJBQVUsV0FBVyxHQUFHLFdBQVc7QUFDbEU7IiwibmFtZXMiOlsicHJvY2VzcyIsInJlbGF0aXZlTmF0aXZlIiwicmVzb2x2ZU5hdGl2ZSIsInZpc2l0Il19