@napi-rs/cli 3.7.0 → 3.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -60,7 +60,7 @@ const debugFactory = (namespace) => {
60
60
  const debug$9 = debugFactory("utils");
61
61
  //#endregion
62
62
  //#region package.json
63
- var version$1 = "3.7.0";
63
+ var version$1 = "3.7.2";
64
64
  //#endregion
65
65
  //#region src/utils/misc.ts
66
66
  const readFileAsync = readFile;
@@ -641,7 +641,7 @@ ${idents.map((ident) => `module.exports.${ident} = nativeBinding.${ident}`).join
641
641
  }
642
642
  function createEsmBinding(localName, pkgName, idents, packageVersion) {
643
643
  return `${bindingHeader}
644
- import { createRequire } from 'node:module'
644
+ import { createRequire } from 'module'
645
645
  const require = createRequire(import.meta.url)
646
646
  const __dirname = new URL('.', import.meta.url).pathname
647
647
 
@@ -680,7 +680,7 @@ ${identLow}} catch (e) {
680
680
  ${ident}loadErrors.push(e)
681
681
  ${identLow}}`}`;
682
682
  }
683
- return `const { readFileSync } = require('node:fs')
683
+ return `const { readFileSync } = require('fs')
684
684
  let nativeBinding = null
685
685
  const loadErrors = []
686
686
 
@@ -710,7 +710,7 @@ const isMuslFromFilesystem = () => {
710
710
 
711
711
  const isMuslFromReport = () => {
712
712
  let report = null
713
- if (typeof process.report?.getReport === 'function') {
713
+ if (process.report && typeof process.report.getReport === 'function') {
714
714
  process.report.excludeNetwork = true
715
715
  report = process.report.getReport()
716
716
  }
@@ -754,7 +754,7 @@ function requireNative() {
754
754
  }
755
755
  } else if (process.platform === 'win32') {
756
756
  if (process.arch === 'x64') {
757
- if (process.config?.variables?.shlib_suffix === 'dll.a' || process.config?.variables?.node_target_type === 'shared_library') {
757
+ if ((process.config && process.config.variables && process.config.variables.shlib_suffix === 'dll.a') || (process.config && process.config.variables && process.config.variables.node_target_type === 'shared_library')) {
758
758
  ${requireTuple("win32-x64-gnu")}
759
759
  } else {
760
760
  ${requireTuple("win32-x64-msvc")}
@@ -883,17 +883,18 @@ if (!nativeBinding || forceWasi) {
883
883
 
884
884
  if (!nativeBinding) {
885
885
  if (loadErrors.length > 0) {
886
- throw new Error(
886
+ const error = new Error(
887
887
  \`Cannot find native binding. \` +
888
888
  \`npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). \` +
889
889
  'Please try \`npm i\` again after removing both package-lock.json and node_modules directory.',
890
- {
891
- cause: loadErrors.reduce((err, cur) => {
892
- cur.cause = err
893
- return cur
894
- }),
895
- },
896
890
  )
891
+ // assign instead of the \`new Error(message, { cause })\` options form,
892
+ // which Node < 16.9 silently ignores
893
+ error.cause = loadErrors.reduce((err, cur) => {
894
+ cur.cause = err
895
+ return cur
896
+ })
897
+ throw error
897
898
  }
898
899
  throw new Error(\`Failed to load native binding\`)
899
900
  }
@@ -3858,4 +3859,4 @@ cli.runExit(process.argv.slice(2));
3858
3859
  //#endregion
3859
3860
  export {};
3860
3861
 
3861
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwibmFtZXMiOlsiZGVidWciLCJwaWNrIiwicGtnSnNvbi52ZXJzaW9uIiwiZGVidWciLCJkZWJ1ZyIsInJlcXVpcmUiLCJkZWJ1ZyIsIm1rZGlyQXN5bmMiLCJyYXdNa2RpckFzeW5jIiwid3JpdGVGaWxlQXN5bmMiLCJyYXdXcml0ZUZpbGVBc3luYyIsInBpY2siLCIjcHJpbnRPYmplY3QiLCIjZm9ybWF0IiwiI2lzU2ltcGx5U2VyaWFsaXphYmxlIiwiI2RhdGVEZWNsYXJhdGlvbiIsIiNzdHJEZWNsYXJhdGlvbiIsIiNudW1iZXJEZWNsYXJhdGlvbiIsIiNib29sRGVjbGFyYXRpb24iLCIjZ2V0VHlwZU9mQXJyYXkiLCIjYXJyYXlEZWNsYXJhdGlvbiIsIiNoZWFkZXJHcm91cCIsIiNwcmludEFzSW5saW5lVmFsdWUiLCIjZGVjbGFyYXRpb24iLCIjaGVhZGVyIiwiI2FycmF5VHlwZUNhY2hlIiwiI2RvR2V0VHlwZU9mQXJyYXkiLCIjaXNQcmltaXRpdmUiLCIjcHJpbnREYXRlIiwiI3NvdXJjZSIsIiNwb3NpdGlvbiIsIiN3aGl0ZXNwYWNlIiwiam9pbiIsIm1lcmdlIiwicGFyc2UiLCJ3YWxrLnVwIiwicGFyc2VUb21sIiwic3RyaW5naWZ5VG9tbCIsImZpbmQuZGlyIiwieWFtbFBhcnNlIiwieWFtbFN0cmluZ2lmeSIsImRlYnVnIiwiZnMiLCJwYXJzZVRvbWwiLCJzdHJpbmdpZnlUb21sIiwieWFtbExvYWQiLCJ5YW1sRHVtcCIsImRlYnVnIiwiZGVidWciLCJkZWJ1ZyIsImRlYnVnIl0sInNvdXJjZXMiOlsiLi4vc3JjL2RlZi9hcnRpZmFjdHMudHMiLCIuLi9zcmMvdXRpbHMvbG9nLnRzIiwiLi4vcGFja2FnZS5qc29uIiwiLi4vc3JjL3V0aWxzL21pc2MudHMiLCIuLi9zcmMvdXRpbHMvdGFyZ2V0LnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvbWV0YWRhdGEudHMiLCIuLi9zcmMvdXRpbHMvY29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2NhcmdvLnRzIiwiLi4vc3JjL3V0aWxzL3R5cGVnZW4udHMiLCIuLi9zcmMvdXRpbHMvcmVhZC1jb25maWcudHMiLCIuLi9zcmMvYXBpL2FydGlmYWN0cy50cyIsIi4uL3NyYy9hcGkvdGVtcGxhdGVzL2pzLWJpbmRpbmcudHMiLCIuLi9zcmMvYXBpL3RlbXBsYXRlcy9sb2FkLXdhc2ktdGVtcGxhdGUudHMiLCIuLi9zcmMvYXBpL3RlbXBsYXRlcy93YXNpLXdvcmtlci10ZW1wbGF0ZS50cyIsIi4uL3NyYy9hcGkvYnVpbGQudHMiLCIuLi9zcmMvZGVmL2NyZWF0ZS1ucG0tZGlycy50cyIsIi4uL3NyYy9hcGkvY3JlYXRlLW5wbS1kaXJzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BzdGQvdG9tbC9zdHJpbmdpZnkuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGpzci9zdGRfX2NvbGxlY3Rpb25zL2RlZXBfbWVyZ2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHN0ZC90b21sL19wYXJzZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHN0ZC90b21sL3BhcnNlLmpzIiwiLi4vc3JjL2RlZi9uZXcudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZW1wYXRoaWMvcmVzb2x2ZS5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZW1wYXRoaWMvd2Fsay5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZW1wYXRoaWMvZmluZC5tanMiLCIuLi9zcmMvZGVmL3JlbmFtZS50cyIsIi4uL3NyYy9hcGkvcmVuYW1lLnRzIiwiLi4vc3JjL2FwaS9uZXcudHMiLCIuLi9zcmMvZGVmL3ByZS1wdWJsaXNoLnRzIiwiLi4vc3JjL2RlZi92ZXJzaW9uLnRzIiwiLi4vc3JjL2FwaS92ZXJzaW9uLnRzIiwiLi4vc3JjL2FwaS9wcmUtcHVibGlzaC50cyIsIi4uL3NyYy9kZWYvdW5pdmVyc2FsaXplLnRzIiwiLi4vc3JjL2FwaS91bml2ZXJzYWxpemUudHMiLCIuLi9zcmMvY29tbWFuZHMvYXJ0aWZhY3RzLnRzIiwiLi4vc3JjL2RlZi9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9jbGktdmVyc2lvbi50cyIsIi4uL3NyYy9jb21tYW5kcy9jcmVhdGUtbnBtLWRpcnMudHMiLCIuLi9zcmMvY29tbWFuZHMvaGVscC50cyIsIi4uL3NyYy9jb21tYW5kcy9uZXcudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJlLXB1Ymxpc2gudHMiLCIuLi9zcmMvY29tbWFuZHMvcmVuYW1lLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3VuaXZlcnNhbGl6ZS50cyIsIi4uL3NyYy9jb21tYW5kcy92ZXJzaW9uLnRzIiwiLi4vc3JjL2luZGV4LnRzIiwiLi4vc3JjL2NsaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUFydGlmYWN0c0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIHBhdGhzID0gW1snYXJ0aWZhY3RzJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnQ29weSBhcnRpZmFjdHMgZnJvbSBHaXRodWIgQWN0aW9ucyBpbnRvIG5wbSBwYWNrYWdlcyBhbmQgcmVhZHkgdG8gcHVibGlzaCcsXG4gIH0pXG5cbiAgY3dkID0gT3B0aW9uLlN0cmluZygnLS1jd2QnLCBwcm9jZXNzLmN3ZCgpLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoJyxcbiAgfSlcblxuICBjb25maWdQYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1jb25maWctcGF0aCwtYycsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGUnLFxuICB9KVxuXG4gIHBhY2thZ2VKc29uUGF0aCA9IE9wdGlvbi5TdHJpbmcoJy0tcGFja2FnZS1qc29uLXBhdGgnLCAncGFja2FnZS5qc29uJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgcGFja2FnZS5qc29uYCcsXG4gIH0pXG5cbiAgb3V0cHV0RGlyID0gT3B0aW9uLlN0cmluZygnLS1vdXRwdXQtZGlyLC1vLC1kJywgJy4vYXJ0aWZhY3RzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGggdG8gdGhlIGZvbGRlciB3aGVyZSBhbGwgYnVpbHQgYC5ub2RlYCBmaWxlcyBwdXQsIHNhbWUgYXMgYC0tb3V0cHV0LWRpcmAgb2YgYnVpbGQgY29tbWFuZCcsXG4gIH0pXG5cbiAgbnBtRGlyID0gT3B0aW9uLlN0cmluZygnLS1ucG0tZGlyJywgJ25wbScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gdGhlIGZvbGRlciB3aGVyZSB0aGUgbnBtIHBhY2thZ2VzIHB1dCcsXG4gIH0pXG5cbiAgYnVpbGRPdXRwdXREaXI/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWJ1aWxkLW91dHB1dC1kaXInLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aCB0byB0aGUgYnVpbGQgb3V0cHV0IGRpciwgb25seSBuZWVkZWQgd2hlbiB0YXJnZXRzIGNvbnRhaW5zIGB3YXNtMzItd2FzaS0qYCcsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgIGNvbmZpZ1BhdGg6IHRoaXMuY29uZmlnUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uUGF0aDogdGhpcy5wYWNrYWdlSnNvblBhdGgsXG4gICAgICBvdXRwdXREaXI6IHRoaXMub3V0cHV0RGlyLFxuICAgICAgbnBtRGlyOiB0aGlzLm5wbURpcixcbiAgICAgIGJ1aWxkT3V0cHV0RGlyOiB0aGlzLmJ1aWxkT3V0cHV0RGlyLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcHkgYXJ0aWZhY3RzIGZyb20gR2l0aHViIEFjdGlvbnMgaW50byBucG0gcGFja2FnZXMgYW5kIHJlYWR5IHRvIHB1Ymxpc2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcnRpZmFjdHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aFxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9jZXNzLmN3ZCgpXG4gICAqL1xuICBjd2Q/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGVcbiAgICovXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYHBhY2thZ2UuanNvbmBcbiAgICpcbiAgICogQGRlZmF1bHQgJ3BhY2thZ2UuanNvbidcbiAgICovXG4gIHBhY2thZ2VKc29uUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIGFsbCBidWlsdCBgLm5vZGVgIGZpbGVzIHB1dCwgc2FtZSBhcyBgLS1vdXRwdXQtZGlyYCBvZiBidWlsZCBjb21tYW5kXG4gICAqXG4gICAqIEBkZWZhdWx0ICcuL2FydGlmYWN0cydcbiAgICovXG4gIG91dHB1dERpcj86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0XG4gICAqXG4gICAqIEBkZWZhdWx0ICducG0nXG4gICAqL1xuICBucG1EaXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGJ1aWxkIG91dHB1dCBkaXIsIG9ubHkgbmVlZGVkIHdoZW4gdGFyZ2V0cyBjb250YWlucyBgd2FzbTMyLXdhc2ktKmBcbiAgICovXG4gIGJ1aWxkT3V0cHV0RGlyPzogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRBcnRpZmFjdHNPcHRpb25zKG9wdGlvbnM6IEFydGlmYWN0c09wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgcGFja2FnZUpzb25QYXRoOiAncGFja2FnZS5qc29uJyxcbiAgICBvdXRwdXREaXI6ICcuL2FydGlmYWN0cycsXG4gICAgbnBtRGlyOiAnbnBtJyxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBjb2xvcnMgZnJvbSAnY29sb3JldHRlJ1xuaW1wb3J0IHsgY3JlYXRlRGVidWcgfSBmcm9tICdvYnVnJ1xuXG5kZWNsYXJlIG1vZHVsZSAnb2J1Zycge1xuICBpbnRlcmZhY2UgRGVidWdnZXIge1xuICAgIGluZm86IHR5cGVvZiBjb25zb2xlLmVycm9yXG4gICAgd2FybjogdHlwZW9mIGNvbnNvbGUuZXJyb3JcbiAgICBlcnJvcjogdHlwZW9mIGNvbnNvbGUuZXJyb3JcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVidWdGYWN0b3J5ID0gKG5hbWVzcGFjZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGRlYnVnID0gY3JlYXRlRGVidWcoYG5hcGk6JHtuYW1lc3BhY2V9YCwge1xuICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgIC8vIGRlYnVnKCclaScsICdUaGlzIGlzIGFuIGluZm8nKVxuICAgICAgaSh2KSB7XG4gICAgICAgIHJldHVybiBjb2xvcnMuZ3JlZW4odilcbiAgICAgIH0sXG4gICAgfSxcbiAgfSlcblxuICBkZWJ1Zy5pbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PlxuICAgIGNvbnNvbGUuZXJyb3IoY29sb3JzLmJsYWNrKGNvbG9ycy5iZ0dyZWVuKCcgSU5GTyAnKSksIC4uLmFyZ3MpXG4gIGRlYnVnLndhcm4gPSAoLi4uYXJnczogYW55W10pID0+XG4gICAgY29uc29sZS5lcnJvcihjb2xvcnMuYmxhY2soY29sb3JzLmJnWWVsbG93KCcgV0FSTklORyAnKSksIC4uLmFyZ3MpXG4gIGRlYnVnLmVycm9yID0gKC4uLmFyZ3M6IGFueVtdKSA9PlxuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjb2xvcnMud2hpdGUoY29sb3JzLmJnUmVkKCcgRVJST1IgJykpLFxuICAgICAgLi4uYXJncy5tYXAoKGFyZykgPT5cbiAgICAgICAgYXJnIGluc3RhbmNlb2YgRXJyb3IgPyAoYXJnLnN0YWNrID8/IGFyZy5tZXNzYWdlKSA6IGFyZyxcbiAgICAgICksXG4gICAgKVxuXG4gIHJldHVybiBkZWJ1Z1xufVxuZXhwb3J0IGNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCd1dGlscycpXG4iLCIiLCJpbXBvcnQge1xuICByZWFkRmlsZSxcbiAgd3JpdGVGaWxlLFxuICB1bmxpbmssXG4gIGNvcHlGaWxlLFxuICBta2RpcixcbiAgc3RhdCxcbiAgcmVhZGRpcixcbiAgYWNjZXNzLFxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuXG5pbXBvcnQgcGtnSnNvbiBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfVxuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuL2xvZy5qcydcblxuZXhwb3J0IGNvbnN0IHJlYWRGaWxlQXN5bmMgPSByZWFkRmlsZVxuZXhwb3J0IGNvbnN0IHdyaXRlRmlsZUFzeW5jID0gd3JpdGVGaWxlXG5leHBvcnQgY29uc3QgdW5saW5rQXN5bmMgPSB1bmxpbmtcbmV4cG9ydCBjb25zdCBjb3B5RmlsZUFzeW5jID0gY29weUZpbGVcbmV4cG9ydCBjb25zdCBta2RpckFzeW5jID0gbWtkaXJcbmV4cG9ydCBjb25zdCBzdGF0QXN5bmMgPSBzdGF0XG5leHBvcnQgY29uc3QgcmVhZGRpckFzeW5jID0gcmVhZGRpclxuXG5leHBvcnQgZnVuY3Rpb24gZmlsZUV4aXN0cyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGFjY2VzcyhwYXRoKS50aGVuKFxuICAgICgpID0+IHRydWUsXG4gICAgKCkgPT4gZmFsc2UsXG4gIClcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpckV4aXN0c0FzeW5jKHBhdGg6IHN0cmluZykge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdEFzeW5jKHBhdGgpXG4gICAgcmV0dXJuIHN0YXRzLmlzRGlyZWN0b3J5KClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBpY2s8TywgSyBleHRlbmRzIGtleW9mIE8+KG86IE8sIC4uLmtleXM6IEtbXSk6IFBpY2s8TywgSz4ge1xuICByZXR1cm4ga2V5cy5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgYWNjW2tleV0gPSBvW2tleV1cbiAgICByZXR1cm4gYWNjXG4gIH0sIHt9IGFzIE8pXG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFja2FnZUpzb24oXG4gIG9sZDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGFydGlhbDogUmVjb3JkPHN0cmluZywgYW55Pixcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLm9sZCB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFydGlhbCkpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChtZXJnZWRba2V5XSkgJiYgaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgIG1lcmdlZFtrZXldID0gbWVyZ2VQYWNrYWdlSnNvbihtZXJnZWRba2V5XSwgdmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlZFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVQYWNrYWdlSnNvbihcbiAgcGF0aDogc3RyaW5nLFxuICBwYXJ0aWFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuKSB7XG4gIGNvbnN0IGV4aXN0cyA9IGF3YWl0IGZpbGVFeGlzdHMocGF0aClcbiAgaWYgKCFleGlzdHMpIHtcbiAgICBkZWJ1ZyhgRmlsZSBub3QgZXhpc3RzICR7cGF0aH1gKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG9sZCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGVBc3luYyhwYXRoLCAndXRmOCcpKVxuICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICBwYXRoLFxuICAgIEpTT04uc3RyaW5naWZ5KG1lcmdlUGFja2FnZUpzb24ob2xkLCBwYXJ0aWFsKSwgbnVsbCwgMiksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IENMSV9WRVJTSU9OID0gcGtnSnNvbi52ZXJzaW9uXG4iLCJpbXBvcnQgeyBleGVjU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2VzcydcblxuZXhwb3J0IHR5cGUgUGxhdGZvcm0gPSBOb2RlSlMuUGxhdGZvcm0gfCAnd2FzbScgfCAnd2FzaScgfCAnb3Blbmhhcm1vbnknXG5cbmV4cG9ydCBjb25zdCBVTklWRVJTQUxfVEFSR0VUUyA9IHtcbiAgJ3VuaXZlcnNhbC1hcHBsZS1kYXJ3aW4nOiBbJ2FhcmNoNjQtYXBwbGUtZGFyd2luJywgJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nXSxcbn0gYXMgY29uc3RcblxuY29uc3QgU1VCX1NZU1RFTVMgPSBuZXcgU2V0KFsnYW5kcm9pZCcsICdvaG9zJ10pXG5cbmV4cG9ydCBjb25zdCBBVkFJTEFCTEVfVEFSR0VUUyA9IFtcbiAgJ2FhcmNoNjQtYXBwbGUtZGFyd2luJyxcbiAgJ2FhcmNoNjQtbGludXgtYW5kcm9pZCcsXG4gICdhYXJjaDY0LXVua25vd24tbGludXgtZ251JyxcbiAgJ2FhcmNoNjQtdW5rbm93bi1saW51eC1tdXNsJyxcbiAgJ2FhcmNoNjQtdW5rbm93bi1saW51eC1vaG9zJyxcbiAgJ2FhcmNoNjQtcGMtd2luZG93cy1tc3ZjJyxcbiAgJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nLFxuICAneDg2XzY0LXBjLXdpbmRvd3MtbXN2YycsXG4gICd4ODZfNjQtcGMtd2luZG93cy1nbnUnLFxuICAneDg2XzY0LXVua25vd24tbGludXgtZ251JyxcbiAgJ3g4Nl82NC11bmtub3duLWxpbnV4LW11c2wnLFxuICAneDg2XzY0LXVua25vd24tbGludXgtb2hvcycsXG4gICd4ODZfNjQtdW5rbm93bi1mcmVlYnNkJyxcbiAgJ2k2ODYtcGMtd2luZG93cy1tc3ZjJyxcbiAgJ2FybXY3LXVua25vd24tbGludXgtZ251ZWFiaWhmJyxcbiAgJ2FybXY3LXVua25vd24tbGludXgtbXVzbGVhYmloZicsXG4gICdhcm12Ny1saW51eC1hbmRyb2lkZWFiaScsXG4gICd1bml2ZXJzYWwtYXBwbGUtZGFyd2luJyxcbiAgJ2xvb25nYXJjaDY0LXVua25vd24tbGludXgtZ251JyxcbiAgJ3Jpc2N2NjRnYy11bmtub3duLWxpbnV4LWdudScsXG4gICdwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LWdudScsXG4gICdzMzkweC11bmtub3duLWxpbnV4LWdudScsXG4gICd3YXNtMzItd2FzaS1wcmV2aWV3MS10aHJlYWRzJyxcbiAgJ3dhc20zMi13YXNpcDEtdGhyZWFkcycsXG5dIGFzIGNvbnN0XG5cbmV4cG9ydCB0eXBlIFRhcmdldFRyaXBsZSA9ICh0eXBlb2YgQVZBSUxBQkxFX1RBUkdFVFMpW251bWJlcl1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVEFSR0VUUyA9IFtcbiAgJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nLFxuICAnYWFyY2g2NC1hcHBsZS1kYXJ3aW4nLFxuICAneDg2XzY0LXBjLXdpbmRvd3MtbXN2YycsXG4gICd4ODZfNjQtdW5rbm93bi1saW51eC1nbnUnLFxuXSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgVEFSR0VUX0xJTktFUjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2FhcmNoNjQtdW5rbm93bi1saW51eC1tdXNsJzogJ2FhcmNoNjQtbGludXgtbXVzbC1nY2MnLFxuICAvLyBUT0RPOiBTd2l0Y2ggdG8gbG9vbmdhcmNoNjQtbGludXgtZ251LWdjYyB3aGVuIGF2YWlsYWJsZVxuICAnbG9vbmdhcmNoNjQtdW5rbm93bi1saW51eC1nbnUnOiAnbG9vbmdhcmNoNjQtbGludXgtZ251LWdjYy0xMycsXG4gICdyaXNjdjY0Z2MtdW5rbm93bi1saW51eC1nbnUnOiAncmlzY3Y2NC1saW51eC1nbnUtZ2NjJyxcbiAgJ3Bvd2VycGM2NGxlLXVua25vd24tbGludXgtZ251JzogJ3Bvd2VycGM2NGxlLWxpbnV4LWdudS1nY2MnLFxuICAnczM5MHgtdW5rbm93bi1saW51eC1nbnUnOiAnczM5MHgtbGludXgtZ251LWdjYycsXG59XG5cbi8vIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19hcmNoXG50eXBlIE5vZGVKU0FyY2ggPVxuICB8ICdhcm0nXG4gIHwgJ2FybTY0J1xuICB8ICdpYTMyJ1xuICB8ICdsb29uZzY0J1xuICB8ICdtaXBzJ1xuICB8ICdtaXBzZWwnXG4gIHwgJ3BwYydcbiAgfCAncHBjNjQnXG4gIHwgJ3Jpc2N2NjQnXG4gIHwgJ3MzOTAnXG4gIHwgJ3MzOTB4J1xuICB8ICd4MzInXG4gIHwgJ3g2NCdcbiAgfCAndW5pdmVyc2FsJ1xuICB8ICd3YXNtMzInXG5cbmNvbnN0IENwdVRvTm9kZUFyY2g6IFJlY29yZDxzdHJpbmcsIE5vZGVKU0FyY2g+ID0ge1xuICB4ODZfNjQ6ICd4NjQnLFxuICBhYXJjaDY0OiAnYXJtNjQnLFxuICBpNjg2OiAnaWEzMicsXG4gIGFybXY3OiAnYXJtJyxcbiAgbG9vbmdhcmNoNjQ6ICdsb29uZzY0JyxcbiAgcmlzY3Y2NGdjOiAncmlzY3Y2NCcsXG4gIHBvd2VycGM2NGxlOiAncHBjNjQnLFxufVxuXG5leHBvcnQgY29uc3QgTm9kZUFyY2hUb0NwdTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgeDY0OiAneDg2XzY0JyxcbiAgYXJtNjQ6ICdhYXJjaDY0JyxcbiAgaWEzMjogJ2k2ODYnLFxuICBhcm06ICdhcm12NycsXG4gIGxvb25nNjQ6ICdsb29uZ2FyY2g2NCcsXG4gIHJpc2N2NjQ6ICdyaXNjdjY0Z2MnLFxuICBwcGM2NDogJ3Bvd2VycGM2NGxlJyxcbn1cblxuY29uc3QgU3lzVG9Ob2RlUGxhdGZvcm06IFJlY29yZDxzdHJpbmcsIFBsYXRmb3JtPiA9IHtcbiAgbGludXg6ICdsaW51eCcsXG4gIGZyZWVic2Q6ICdmcmVlYnNkJyxcbiAgZGFyd2luOiAnZGFyd2luJyxcbiAgd2luZG93czogJ3dpbjMyJyxcbiAgb2hvczogJ29wZW5oYXJtb255Jyxcbn1cblxuZXhwb3J0IGNvbnN0IFVuaUFyY2hzQnlQbGF0Zm9ybTogUGFydGlhbDxSZWNvcmQ8UGxhdGZvcm0sIE5vZGVKU0FyY2hbXT4+ID0ge1xuICBkYXJ3aW46IFsneDY0JywgJ2FybTY0J10sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0IHtcbiAgdHJpcGxlOiBzdHJpbmdcbiAgcGxhdGZvcm1BcmNoQUJJOiBzdHJpbmdcbiAgcGxhdGZvcm06IFBsYXRmb3JtXG4gIGFyY2g6IE5vZGVKU0FyY2hcbiAgYWJpOiBzdHJpbmcgfCBudWxsXG59XG5cbi8qKlxuICogQSB0cmlwbGUgaXMgYSBzcGVjaWZpYyBmb3JtYXQgZm9yIHNwZWNpZnlpbmcgYSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuICogVHJpcGxlcyBtYXkgYmUgcmVmZXJyZWQgdG8gYXMgYSB0YXJnZXQgdHJpcGxlIHdoaWNoIGlzIHRoZSBhcmNoaXRlY3R1cmUgZm9yIHRoZSBhcnRpZmFjdCBwcm9kdWNlZCwgYW5kIHRoZSBob3N0IHRyaXBsZSB3aGljaCBpcyB0aGUgYXJjaGl0ZWN0dXJlIHRoYXQgdGhlIGNvbXBpbGVyIGlzIHJ1bm5pbmcgb24uXG4gKiBUaGUgZ2VuZXJhbCBmb3JtYXQgb2YgdGhlIHRyaXBsZSBpcyBgPGFyY2g+PHN1Yj4tPHZlbmRvcj4tPHN5cz4tPGFiaT5gIHdoZXJlOlxuICogICAtIGBhcmNoYCA9IFRoZSBiYXNlIENQVSBhcmNoaXRlY3R1cmUsIGZvciBleGFtcGxlIGB4ODZfNjRgLCBgaTY4NmAsIGBhcm1gLCBgdGh1bWJgLCBgbWlwc2AsIGV0Yy5cbiAqICAgLSBgc3ViYCA9IFRoZSBDUFUgc3ViLWFyY2hpdGVjdHVyZSwgZm9yIGV4YW1wbGUgYGFybWAgaGFzIGB2N2AsIGB2N3NgLCBgdjV0ZWAsIGV0Yy5cbiAqICAgLSBgdmVuZG9yYCA9IFRoZSB2ZW5kb3IsIGZvciBleGFtcGxlIGB1bmtub3duYCwgYGFwcGxlYCwgYHBjYCwgYG52aWRpYWAsIGV0Yy5cbiAqICAgLSBgc3lzYCA9IFRoZSBzeXN0ZW0gbmFtZSwgZm9yIGV4YW1wbGUgYGxpbnV4YCwgYHdpbmRvd3NgLCBgZGFyd2luYCwgZXRjLiBub25lIGlzIHR5cGljYWxseSB1c2VkIGZvciBiYXJlLW1ldGFsIHdpdGhvdXQgYW4gT1MuXG4gKiAgIC0gYGFiaWAgPSBUaGUgQUJJLCBmb3IgZXhhbXBsZSBgZ251YCwgYGFuZHJvaWRgLCBgZWFiaWAsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVHJpcGxlKHJhd1RyaXBsZTogc3RyaW5nKTogVGFyZ2V0IHtcbiAgaWYgKFxuICAgIHJhd1RyaXBsZSA9PT0gJ3dhc20zMi13YXNpJyB8fFxuICAgIHJhd1RyaXBsZSA9PT0gJ3dhc20zMi13YXNpLXByZXZpZXcxLXRocmVhZHMnIHx8XG4gICAgcmF3VHJpcGxlLnN0YXJ0c1dpdGgoJ3dhc20zMi13YXNpcCcpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICB0cmlwbGU6IHJhd1RyaXBsZSxcbiAgICAgIHBsYXRmb3JtQXJjaEFCSTogJ3dhc20zMi13YXNpJyxcbiAgICAgIHBsYXRmb3JtOiAnd2FzaScsXG4gICAgICBhcmNoOiAnd2FzbTMyJyxcbiAgICAgIGFiaTogJ3dhc2knLFxuICAgIH1cbiAgfVxuICBjb25zdCB0cmlwbGUgPSByYXdUcmlwbGUuZW5kc1dpdGgoJ2VhYmknKVxuICAgID8gYCR7cmF3VHJpcGxlLnNsaWNlKDAsIC00KX0tZWFiaWBcbiAgICA6IHJhd1RyaXBsZVxuICBjb25zdCB0cmlwbGVzID0gdHJpcGxlLnNwbGl0KCctJylcbiAgbGV0IGNwdTogc3RyaW5nXG4gIGxldCBzeXM6IHN0cmluZ1xuICBsZXQgYWJpOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBpZiAodHJpcGxlcy5sZW5ndGggPT09IDIpIHtcbiAgICAvLyBhYXJjaDY0LWZ1Y2hzaWFcbiAgICAvLyBeIGNwdSAgIF4gc3lzXG4gICAgO1tjcHUsIHN5c10gPSB0cmlwbGVzXG4gIH0gZWxzZSB7XG4gICAgLy8gYWFyY2g2NC11bmtub3duLWxpbnV4LW11c2xcbiAgICAvLyBeIGNwdSAgIF52ZW5kb3IgXiBzeXMgXiBhYmlcbiAgICAvLyBhYXJjaDY0LWFwcGxlLWRhcndpblxuICAgIC8vIF4gY3B1ICAgICAgICAgXiBzeXMgIChhYmkgaXMgTm9uZSlcbiAgICA7W2NwdSwgLCBzeXMsIGFiaSA9IG51bGxdID0gdHJpcGxlc1xuICB9XG5cbiAgaWYgKGFiaSAmJiBTVUJfU1lTVEVNUy5oYXMoYWJpKSkge1xuICAgIHN5cyA9IGFiaVxuICAgIGFiaSA9IG51bGxcbiAgfVxuICBjb25zdCBwbGF0Zm9ybSA9IFN5c1RvTm9kZVBsYXRmb3JtW3N5c10gPz8gKHN5cyBhcyBQbGF0Zm9ybSlcbiAgY29uc3QgYXJjaCA9IENwdVRvTm9kZUFyY2hbY3B1XSA/PyAoY3B1IGFzIE5vZGVKU0FyY2gpXG5cbiAgcmV0dXJuIHtcbiAgICB0cmlwbGU6IHJhd1RyaXBsZSxcbiAgICBwbGF0Zm9ybUFyY2hBQkk6IGFiaSA/IGAke3BsYXRmb3JtfS0ke2FyY2h9LSR7YWJpfWAgOiBgJHtwbGF0Zm9ybX0tJHthcmNofWAsXG4gICAgcGxhdGZvcm0sXG4gICAgYXJjaCxcbiAgICBhYmksXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5c3RlbURlZmF1bHRUYXJnZXQoKTogVGFyZ2V0IHtcbiAgY29uc3QgaG9zdCA9IGV4ZWNTeW5jKGBydXN0YyAtdlZgLCB7XG4gICAgZW52OiBwcm9jZXNzLmVudixcbiAgfSlcbiAgICAudG9TdHJpbmcoJ3V0ZjgnKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmluZCgobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKCdob3N0OiAnKSlcbiAgY29uc3QgdHJpcGxlID0gaG9zdD8uc2xpY2UoJ2hvc3Q6ICcubGVuZ3RoKVxuICBpZiAoIXRyaXBsZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbiBub3QgcGFyc2UgdGFyZ2V0IHRyaXBsZSBmcm9tIGhvc3RgKVxuICB9XG4gIHJldHVybiBwYXJzZVRyaXBsZSh0cmlwbGUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXRMaW5rZXIodGFyZ2V0OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gVEFSR0VUX0xJTktFUlt0YXJnZXRdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YXJnZXRUb0VudlZhcih0YXJnZXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0YXJnZXQucmVwbGFjZSgvLS9nLCAnXycpLnRvVXBwZXJDYXNlKClcbn1cbiIsImV4cG9ydCBlbnVtIE5hcGlWZXJzaW9uIHtcbiAgTmFwaTEgPSAxLFxuICBOYXBpMixcbiAgTmFwaTMsXG4gIE5hcGk0LFxuICBOYXBpNSxcbiAgTmFwaTYsXG4gIE5hcGk3LFxuICBOYXBpOCxcbiAgTmFwaTksXG59XG5cbi8vLyBiZWNhdXNlIG5vZGUgc3VwcG9ydCBuZXcgbmFwaSB2ZXJzaW9uIGluIHNvbWUgbWlub3IgdmVyc2lvbiB1cGRhdGVzLCBzbyB3ZSBtaWdodCBtZWV0IHN1Y2ggc2l0dWF0aW9uOlxuLy8vIGBub2RlIHYxMC4yMC4wYCBzdXBwb3J0cyBgbmFwaTVgIGFuZCBgbmFwaTZgLCBidXQgYG5vZGUgdjEyLjAuMGAgb25seSBzdXBwb3J0IGBuYXBpNGAsXG4vLy8gYnkgd2hpY2gsIHdlIGNhbiBub3QgdGVsbCBkaXJlY3RseSBuYXBpIHZlcnNpb24gc3VwcG9ydGxlc3MgZnJvbSBub2RlIHZlcnNpb24gZGlyZWN0bHkuXG5jb25zdCBOQVBJX1ZFUlNJT05fTUFUUklYID0gbmV3IE1hcDxOYXBpVmVyc2lvbiwgc3RyaW5nPihbXG4gIFtOYXBpVmVyc2lvbi5OYXBpMSwgJzguNi4wIHwgOS4wLjAgfCAxMC4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGkyLCAnOC4xMC4wIHwgOS4zLjAgfCAxMC4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGkzLCAnNi4xNC4yIHwgOC4xMS4yIHwgOS4xMS4wIHwgMTAuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpNCwgJzEwLjE2LjAgfCAxMS44LjAgfCAxMi4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGk1LCAnMTAuMTcuMCB8IDEyLjExLjAgfCAxMy4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGk2LCAnMTAuMjAuMCB8IDEyLjE3LjAgfCAxNC4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGk3LCAnMTAuMjMuMCB8IDEyLjE5LjAgfCAxNC4xMi4wIHwgMTUuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpOCwgJzEyLjIyLjAgfCAxNC4xNy4wIHwgMTUuMTIuMCB8IDE2LjAuMCddLFxuICBbTmFwaVZlcnNpb24uTmFwaTksICcxOC4xNy4wIHwgMjAuMy4wIHwgMjEuMS4wJ10sXG5dKVxuXG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX05BUElfVkVSU0lPTlMgPSBPYmplY3QudmFsdWVzKE5hcGlWZXJzaW9uKS5maWx0ZXIoXG4gICh2KTogdiBpcyBOYXBpVmVyc2lvbiA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicsXG4pXG5cbmludGVyZmFjZSBOb2RlVmVyc2lvbiB7XG4gIG1ham9yOiBudW1iZXJcbiAgbWlub3I6IG51bWJlclxuICBwYXRjaDogbnVtYmVyXG59XG5cbmZ1bmN0aW9uIHBhcnNlTm9kZVZlcnNpb24odjogc3RyaW5nKTogTm9kZVZlcnNpb24ge1xuICBjb25zdCBtYXRjaGVzID0gdi5tYXRjaCgvdj8oWzAtOV0rKVxcLihbMC05XSspXFwuKFswLTldKykvaSlcblxuICBpZiAoIW1hdGNoZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB2ZXJzaW9uIG51bWJlcjogJyArIHYpXG4gIH1cblxuICBjb25zdCBbLCBtYWpvciwgbWlub3IsIHBhdGNoXSA9IG1hdGNoZXNcblxuICByZXR1cm4ge1xuICAgIG1ham9yOiBwYXJzZUludChtYWpvciksXG4gICAgbWlub3I6IHBhcnNlSW50KG1pbm9yKSxcbiAgICBwYXRjaDogcGFyc2VJbnQocGF0Y2gpLFxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVkTm9kZVZlcnNpb25zKG5hcGlWZXJzaW9uOiBOYXBpVmVyc2lvbik6IE5vZGVWZXJzaW9uW10ge1xuICBjb25zdCByZXF1aXJlbWVudCA9IE5BUElfVkVSU0lPTl9NQVRSSVguZ2V0KG5hcGlWZXJzaW9uKVxuXG4gIGlmICghcmVxdWlyZW1lbnQpIHtcbiAgICByZXR1cm4gW3BhcnNlTm9kZVZlcnNpb24oJzEwLjAuMCcpXVxuICB9XG5cbiAgcmV0dXJuIHJlcXVpcmVtZW50LnNwbGl0KCd8JykubWFwKHBhcnNlTm9kZVZlcnNpb24pXG59XG5cbmZ1bmN0aW9uIHRvRW5naW5lUmVxdWlyZW1lbnQodmVyc2lvbnM6IE5vZGVWZXJzaW9uW10pOiBzdHJpbmcge1xuICBjb25zdCByZXF1aXJlbWVudHM6IHN0cmluZ1tdID0gW11cbiAgdmVyc2lvbnMuZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgIGxldCByZXEgPSAnJ1xuICAgIGlmIChpICE9PSAwKSB7XG4gICAgICBjb25zdCBsYXN0VmVyc2lvbiA9IHZlcnNpb25zW2kgLSAxXVxuICAgICAgcmVxICs9IGA8ICR7bGFzdFZlcnNpb24ubWFqb3IgKyAxfWBcbiAgICB9XG5cbiAgICByZXEgKz0gYCR7aSA9PT0gMCA/ICcnIDogJyB8fCAnfT49ICR7di5tYWpvcn0uJHt2Lm1pbm9yfS4ke3YucGF0Y2h9YFxuICAgIHJlcXVpcmVtZW50cy5wdXNoKHJlcSlcbiAgfSlcblxuICByZXR1cm4gcmVxdWlyZW1lbnRzLmpvaW4oJyAnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbmFwaUVuZ2luZVJlcXVpcmVtZW50KG5hcGlWZXJzaW9uOiBOYXBpVmVyc2lvbik6IHN0cmluZyB7XG4gIHJldHVybiB0b0VuZ2luZVJlcXVpcmVtZW50KHJlcXVpcmVkTm9kZVZlcnNpb25zKG5hcGlWZXJzaW9uKSlcbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5cbmV4cG9ydCB0eXBlIENyYXRlVGFyZ2V0S2luZCA9XG4gIHwgJ2JpbidcbiAgfCAnZXhhbXBsZSdcbiAgfCAndGVzdCdcbiAgfCAnYmVuY2gnXG4gIHwgJ2xpYidcbiAgfCAncmxpYidcbiAgfCAnY2R5bGliJ1xuICB8ICdjdXN0b20tYnVpbGQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhdGVUYXJnZXQge1xuICBuYW1lOiBzdHJpbmdcbiAga2luZDogQ3JhdGVUYXJnZXRLaW5kW11cbiAgY3JhdGVfdHlwZXM6IENyYXRlVGFyZ2V0S2luZFtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhdGUge1xuICBpZDogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBzcmNfcGF0aDogc3RyaW5nXG4gIHZlcnNpb246IHN0cmluZ1xuICBlZGl0aW9uOiBzdHJpbmdcbiAgdGFyZ2V0czogQ3JhdGVUYXJnZXRbXVxuICBmZWF0dXJlczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG4gIG1hbmlmZXN0X3BhdGg6IHN0cmluZ1xuICBkZXBlbmRlbmNpZXM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBzb3VyY2U6IHN0cmluZ1xuICAgIHJlcTogc3RyaW5nXG4gICAga2luZDogc3RyaW5nIHwgbnVsbFxuICAgIHJlbmFtZTogc3RyaW5nIHwgbnVsbFxuICAgIG9wdGlvbmFsOiBib29sZWFuXG4gICAgdXNlc19kZWZhdWx0X2ZlYXR1cmVzOiBib29sZWFuXG4gICAgZmVhdHVyZXM6IHN0cmluZ1tdXG4gICAgdGFyZ2V0OiBzdHJpbmcgfCBudWxsXG4gICAgcmVnaXN0cnk6IHN0cmluZyB8IG51bGxcbiAgfT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXJnb1dvcmtzcGFjZU1ldGFkYXRhIHtcbiAgdmVyc2lvbjogbnVtYmVyXG4gIHBhY2thZ2VzOiBDcmF0ZVtdXG4gIHdvcmtzcGFjZV9tZW1iZXJzOiBzdHJpbmdbXVxuICB0YXJnZXRfZGlyZWN0b3J5OiBzdHJpbmdcbiAgd29ya3NwYWNlX3Jvb3Q6IHN0cmluZ1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShtYW5pZmVzdFBhdGg6IHN0cmluZykge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gY3JhdGUgZm91bmQgaW4gbWFuaWZlc3Q6ICR7bWFuaWZlc3RQYXRofWApXG4gIH1cblxuICBjb25zdCBjaGlsZFByb2Nlc3MgPSBzcGF3bihcbiAgICAnY2FyZ28nLFxuICAgIFsnbWV0YWRhdGEnLCAnLS1tYW5pZmVzdC1wYXRoJywgbWFuaWZlc3RQYXRoLCAnLS1mb3JtYXQtdmVyc2lvbicsICcxJ10sXG4gICAgeyBzdGRpbzogJ3BpcGUnIH0sXG4gIClcblxuICBsZXQgc3Rkb3V0ID0gJydcbiAgbGV0IHN0ZGVyciA9ICcnXG4gIGxldCBzdGF0dXMgPSAwXG4gIGxldCBlcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbFxuXG4gIGNoaWxkUHJvY2Vzcy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgIHN0ZG91dCArPSBkYXRhXG4gIH0pXG5cbiAgY2hpbGRQcm9jZXNzLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgc3RkZXJyICs9IGRhdGFcbiAgfSlcblxuICBjaGlsZFByb2Nlc3Mub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgIGVycm9yID0gZXJyXG4gIH0pXG5cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjaGlsZFByb2Nlc3Mub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgIHN0YXR1cyA9IGNvZGUgPz8gMFxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSlcbiAgfSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhcmdvIG1ldGFkYXRhIGZhaWxlZCB0byBydW4nLCB7IGNhdXNlOiBlcnJvciB9KVxuICB9XG4gIGlmIChzdGF0dXMgIT09IDApIHtcbiAgICBjb25zdCBzaW1wbGVNZXNzYWdlID0gYGNhcmdvIG1ldGFkYXRhIGV4aXRlZCB3aXRoIGNvZGUgJHtzdGF0dXN9YFxuICAgIHRocm93IG5ldyBFcnJvcihgJHtzaW1wbGVNZXNzYWdlfSBhbmQgZXJyb3IgbWVzc2FnZTpcXG5cXG4ke3N0ZGVycn1gLCB7XG4gICAgICBjYXVzZTogbmV3IEVycm9yKHNpbXBsZU1lc3NhZ2UpLFxuICAgIH0pXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0ZG91dCkgYXMgQ2FyZ29Xb3Jrc3BhY2VNZXRhZGF0YVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcGFyc2UgY2FyZ28gbWV0YWRhdGEgSlNPTicsIHsgY2F1c2U6IGUgfSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgdW5kZXJsaW5lLCB5ZWxsb3cgfSBmcm9tICdjb2xvcmV0dGUnXG5pbXBvcnQgeyBtZXJnZSwgb21pdCB9IGZyb20gJ2VzLXRvb2xraXQnXG5cbmltcG9ydCB7IGZpbGVFeGlzdHMsIHJlYWRGaWxlQXN5bmMgfSBmcm9tICcuL21pc2MuanMnXG5pbXBvcnQgeyBERUZBVUxUX1RBUkdFVFMsIHBhcnNlVHJpcGxlLCB0eXBlIFRhcmdldCB9IGZyb20gJy4vdGFyZ2V0LmpzJ1xuXG5leHBvcnQgdHlwZSBWYWx1ZU9mQ29uc3RBcnJheTxUPiA9IFRbRXhjbHVkZTxrZXlvZiBULCBrZXlvZiBBcnJheTxhbnk+Pl1cblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2VycyA9IFsneWFybicsICdwbnBtJ10gYXMgY29uc3RcbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRUZXN0RnJhbWV3b3JrcyA9IFsnYXZhJ10gYXMgY29uc3RcblxuZXhwb3J0IHR5cGUgU3VwcG9ydGVkUGFja2FnZU1hbmFnZXIgPSBWYWx1ZU9mQ29uc3RBcnJheTxcbiAgdHlwZW9mIFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2Vyc1xuPlxuZXhwb3J0IHR5cGUgU3VwcG9ydGVkVGVzdEZyYW1ld29yayA9IFZhbHVlT2ZDb25zdEFycmF5PFxuICB0eXBlb2YgU3VwcG9ydGVkVGVzdEZyYW1ld29ya3Ncbj5cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyTmFwaUNvbmZpZyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBiaW5hcnkgdG8gYmUgZ2VuZXJhdGVkLCBkZWZhdWx0IHRvIGBpbmRleGBcbiAgICovXG4gIGJpbmFyeU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIG5wbSBwYWNrYWdlLCBkZWZhdWx0IHRvIHRoZSBuYW1lIG9mIHJvb3QgcGFja2FnZS5qc29uIG5hbWVcbiAgICpcbiAgICogQWx3YXlzIGdpdmVuIGBAc2NvcGUvcGtnYCBhbmQgYXJjaCBzdWZmaXggd2lsbCBiZSBhcHBlbmRlZCBsaWtlIGBAc2NvcGUvcGtnLWxpbnV4LWdudS14NjRgXG4gICAqL1xuICBwYWNrYWdlTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogQWxsIHRhcmdldHMgdGhlIGNyYXRlIHdpbGwgYmUgY29tcGlsZWQgZm9yXG4gICAqL1xuICB0YXJnZXRzPzogc3RyaW5nW11cblxuICAvKipcbiAgICogVGhlIG5wbSBjbGllbnQgcHJvamVjdCB1c2VzLlxuICAgKi9cbiAgbnBtQ2xpZW50Pzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZ2VuZXJhdGUgY29uc3QgZW51bSBmb3IgdHlwZXNjcmlwdCBiaW5kaW5nc1xuICAgKi9cbiAgY29uc3RFbnVtPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBFbWl0IGAjW25hcGkoc3RyaW5nX2VudW0pXWAgZW51bXMgYXMgcnVudGltZSBlbnVtcyAoYGV4cG9ydCBkZWNsYXJlIGVudW1gKSB1bmRlciBgLS1uby1jb25zdC1lbnVtYC4gRGVmYXVsdDogdHlwZS1vbmx5IHVuaW9uLlxuICAgKi9cbiAgcnVudGltZVN0cmluZ0VudW0/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIGR0cyBoZWFkZXIgcHJlcGVuZCB0byB0aGUgZ2VuZXJhdGVkIGR0cyBmaWxlXG4gICAqL1xuICBkdHNIZWFkZXI/OiBzdHJpbmdcblxuICAvKipcbiAgICogZHRzIGhlYWRlciBmaWxlIHBhdGggdG8gYmUgcHJlcGVuZGVkIHRvIHRoZSBnZW5lcmF0ZWQgZHRzIGZpbGVcbiAgICogaWYgYm90aCBkdHNIZWFkZXIgYW5kIGR0c0hlYWRlckZpbGUgYXJlIHByb3ZpZGVkLCBkdHNIZWFkZXJGaWxlIHdpbGwgYmUgdXNlZFxuICAgKi9cbiAgZHRzSGVhZGVyRmlsZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiB3YXNtIGNvbXBpbGF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHdhc20/OiB7XG4gICAgLyoqXG4gICAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWJBc3NlbWJseS9KYXZhU2NyaXB0X2ludGVyZmFjZS9NZW1vcnlcbiAgICAgKiBAZGVmYXVsdCA0MDAwIHBhZ2VzICgyNTZNaUIpXG4gICAgICovXG4gICAgaW5pdGlhbE1lbW9yeT86IG51bWJlclxuICAgIC8qKlxuICAgICAqIEBkZWZhdWx0IDY1NTM2IHBhZ2VzICg0R2lCKVxuICAgICAqL1xuICAgIG1heGltdW1NZW1vcnk/OiBudW1iZXJcblxuICAgIC8qKlxuICAgICAqIEJyb3dzZXIgd2FzbSBiaW5kaW5nIGNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBicm93c2VyOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGZzIG1vZHVsZSBpbiBicm93c2VyXG4gICAgICAgKi9cbiAgICAgIGZzPzogYm9vbGVhblxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIGluaXRpYWxpemUgd2FzbSBhc3luY2hyb25vdXNseVxuICAgICAgICovXG4gICAgICBhc3luY0luaXQ/OiBib29sZWFuXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gaW5qZWN0IGBidWZmZXJgIHRvIGVtbmFwaSBjb250ZXh0XG4gICAgICAgKi9cbiAgICAgIGJ1ZmZlcj86IGJvb2xlYW5cbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBlbWl0IGN1c3RvbSBldmVudHMgZm9yIGVycm9ycyBpbiB3b3JrZXJcbiAgICAgICAqL1xuICAgICAgZXJyb3JFdmVudD86IGJvb2xlYW5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgYmluYXJ5TmFtZSBpbnN0ZWFkXG4gICAqL1xuICBuYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgcGFja2FnZU5hbWUgaW5zdGVhZFxuICAgKi9cbiAgcGFja2FnZT86IHtcbiAgICBuYW1lPzogc3RyaW5nXG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSB0YXJnZXRzIGluc3RlYWRcbiAgICovXG4gIHRyaXBsZXM/OiB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBlbmFibGUgZGVmYXVsdCB0YXJnZXRzXG4gICAgICovXG4gICAgZGVmYXVsdHM6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIHRhcmdldHMgdG8gYmUgY29tcGlsZWQgZm9yXG4gICAgICovXG4gICAgYWRkaXRpb25hbD86IHN0cmluZ1tdXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21tb25QYWNrYWdlSnNvbkZpZWxkcyB7XG4gIG5hbWU6IHN0cmluZ1xuICB2ZXJzaW9uOiBzdHJpbmdcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAga2V5d29yZHM/OiBzdHJpbmdbXVxuICBhdXRob3I/OiBzdHJpbmdcbiAgYXV0aG9ycz86IHN0cmluZ1tdXG4gIGxpY2Vuc2U/OiBzdHJpbmdcbiAgY3B1Pzogc3RyaW5nW11cbiAgb3M/OiBzdHJpbmdbXVxuICBsaWJjPzogc3RyaW5nW11cbiAgZmlsZXM/OiBzdHJpbmdbXVxuICByZXBvc2l0b3J5PzogYW55XG4gIGhvbWVwYWdlPzogYW55XG4gIGVuZ2luZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHB1Ymxpc2hDb25maWc/OiBhbnlcbiAgYnVncz86IGFueVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgbmFwaT86IFVzZXJOYXBpQ29uZmlnXG4gIHR5cGU/OiAnbW9kdWxlJyB8ICdjb21tb25qcydcbiAgc2NyaXB0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAvLyBtb2R1bGVzXG4gIG1haW4/OiBzdHJpbmdcbiAgbW9kdWxlPzogc3RyaW5nXG4gIHR5cGVzPzogc3RyaW5nXG4gIGJyb3dzZXI/OiBzdHJpbmdcbiAgZXhwb3J0cz86IGFueVxuXG4gIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZGV2RGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gIGF2YT86IHtcbiAgICB0aW1lb3V0Pzogc3RyaW5nXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTmFwaUNvbmZpZyA9IFJlcXVpcmVkPFxuICBQaWNrPFVzZXJOYXBpQ29uZmlnLCAnYmluYXJ5TmFtZScgfCAncGFja2FnZU5hbWUnIHwgJ25wbUNsaWVudCc+XG4+ICZcbiAgUGljazxcbiAgICBVc2VyTmFwaUNvbmZpZyxcbiAgICAnd2FzbScgfCAnZHRzSGVhZGVyJyB8ICdkdHNIZWFkZXJGaWxlJyB8ICdjb25zdEVudW0nIHwgJ3J1bnRpbWVTdHJpbmdFbnVtJ1xuICA+ICYge1xuICAgIHRhcmdldHM6IFRhcmdldFtdXG4gICAgcGFja2FnZUpzb246IENvbW1vblBhY2thZ2VKc29uRmllbGRzXG4gIH1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWROYXBpQ29uZmlnKFxuICBwYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcsXG4pOiBQcm9taXNlPE5hcGlDb25maWc+IHtcbiAgaWYgKGNvbmZpZ1BhdGggJiYgIShhd2FpdCBmaWxlRXhpc3RzKGNvbmZpZ1BhdGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTkFQSS1SUyBjb25maWcgbm90IGZvdW5kIGF0ICR7Y29uZmlnUGF0aH1gKVxuICB9XG4gIGlmICghKGF3YWl0IGZpbGVFeGlzdHMocGF0aCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBwYWNrYWdlLmpzb24gbm90IGZvdW5kIGF0ICR7cGF0aH1gKVxuICB9XG4gIC8vIE1heSBzdXBwb3J0IG11bHRpcGxlIGNvbmZpZyBzb3VyY2VzIGxhdGVyIG9uLlxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhwYXRoLCAndXRmOCcpXG4gIGxldCBwa2dKc29uXG4gIHRyeSB7XG4gICAgcGtnSnNvbiA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgQ29tbW9uUGFja2FnZUpzb25GaWVsZHNcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiBhdCAke3BhdGh9YCwge1xuICAgICAgY2F1c2U6IGUsXG4gICAgfSlcbiAgfVxuXG4gIGxldCBzZXBhcmF0ZWRDb25maWc6IFVzZXJOYXBpQ29uZmlnIHwgdW5kZWZpbmVkXG4gIGlmIChjb25maWdQYXRoKSB7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlQXN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKVxuICAgIHRyeSB7XG4gICAgICBzZXBhcmF0ZWRDb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpIGFzIFVzZXJOYXBpQ29uZmlnXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgTkFQSS1SUyBjb25maWcgYXQgJHtjb25maWdQYXRofWAsIHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVzZXJOYXBpQ29uZmlnID0gcGtnSnNvbi5uYXBpID8/IHt9XG4gIGlmIChwa2dKc29uLm5hcGkgJiYgc2VwYXJhdGVkQ29uZmlnKSB7XG4gICAgY29uc3QgcGtnSnNvblBhdGggPSB1bmRlcmxpbmUocGF0aClcbiAgICBjb25zdCBjb25maWdQYXRoVW5kZXJsaW5lID0gdW5kZXJsaW5lKGNvbmZpZ1BhdGghKVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIHllbGxvdyhcbiAgICAgICAgYEJvdGggbmFwaSBmaWVsZCBpbiAke3BrZ0pzb25QYXRofSBhbmQgW05BUEktUlMgY29uZmlnXSgke2NvbmZpZ1BhdGhVbmRlcmxpbmV9KSBmaWxlIGFyZSBmb3VuZCwgdGhlIE5BUEktUlMgY29uZmlnIGZpbGUgd2lsbCBiZSB1c2VkLmAsXG4gICAgICApLFxuICAgIClcbiAgfVxuICBpZiAoc2VwYXJhdGVkQ29uZmlnKSB7XG4gICAgT2JqZWN0LmFzc2lnbih1c2VyTmFwaUNvbmZpZywgc2VwYXJhdGVkQ29uZmlnKVxuICB9XG4gIGNvbnN0IG5hcGlDb25maWc6IE5hcGlDb25maWcgPSBtZXJnZShcbiAgICB7XG4gICAgICBiaW5hcnlOYW1lOiAnaW5kZXgnLFxuICAgICAgcGFja2FnZU5hbWU6IHBrZ0pzb24ubmFtZSxcbiAgICAgIHRhcmdldHM6IFtdLFxuICAgICAgcGFja2FnZUpzb246IHBrZ0pzb24sXG4gICAgICBucG1DbGllbnQ6ICducG0nLFxuICAgIH0sXG4gICAgb21pdCh1c2VyTmFwaUNvbmZpZywgWyd0YXJnZXRzJ10pLFxuICApXG5cbiAgbGV0IHRhcmdldHM6IHN0cmluZ1tdID0gdXNlck5hcGlDb25maWcudGFyZ2V0cyA/PyBbXVxuXG4gIC8vIGNvbXBhdGlibGUgd2l0aCBvbGQgY29uZmlnXG4gIGlmICh1c2VyTmFwaUNvbmZpZz8ubmFtZSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIHllbGxvdyhcbiAgICAgICAgYFtERVBSRUNBVEVEXSBuYXBpLm5hbWUgaXMgZGVwcmVjYXRlZCwgdXNlIG5hcGkuYmluYXJ5TmFtZSBpbnN0ZWFkLmAsXG4gICAgICApLFxuICAgIClcbiAgICBuYXBpQ29uZmlnLmJpbmFyeU5hbWUgPSB1c2VyTmFwaUNvbmZpZy5uYW1lXG4gIH1cblxuICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7XG4gICAgbGV0IGRlcHJlY2F0ZWRXYXJuZWQgPSBmYWxzZVxuICAgIGNvbnN0IHdhcm5pbmcgPSB5ZWxsb3coXG4gICAgICBgW0RFUFJFQ0FURURdIG5hcGkudHJpcGxlcyBpcyBkZXByZWNhdGVkLCB1c2UgbmFwaS50YXJnZXRzIGluc3RlYWQuYCxcbiAgICApXG4gICAgaWYgKHVzZXJOYXBpQ29uZmlnLnRyaXBsZXM/LmRlZmF1bHRzKSB7XG4gICAgICBkZXByZWNhdGVkV2FybmVkID0gdHJ1ZVxuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpXG4gICAgICB0YXJnZXRzID0gdGFyZ2V0cy5jb25jYXQoREVGQVVMVF9UQVJHRVRTKVxuICAgIH1cblxuICAgIGlmICh1c2VyTmFwaUNvbmZpZy50cmlwbGVzPy5hZGRpdGlvbmFsPy5sZW5ndGgpIHtcbiAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmNvbmNhdCh1c2VyTmFwaUNvbmZpZy50cmlwbGVzLmFkZGl0aW9uYWwpXG4gICAgICBpZiAoIWRlcHJlY2F0ZWRXYXJuZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZmluZCBkdXBsaWNhdGUgdGFyZ2V0c1xuICBjb25zdCB1bmlxdWVUYXJnZXRzID0gbmV3IFNldCh0YXJnZXRzKVxuICBpZiAodW5pcXVlVGFyZ2V0cy5zaXplICE9PSB0YXJnZXRzLmxlbmd0aCkge1xuICAgIGNvbnN0IGR1cGxpY2F0ZVRhcmdldCA9IHRhcmdldHMuZmluZChcbiAgICAgICh0YXJnZXQsIGluZGV4KSA9PiB0YXJnZXRzLmluZGV4T2YodGFyZ2V0KSAhPT0gaW5kZXgsXG4gICAgKVxuICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHRhcmdldHMgYXJlIG5vdCBhbGxvd2VkOiAke2R1cGxpY2F0ZVRhcmdldH1gKVxuICB9XG5cbiAgbmFwaUNvbmZpZy50YXJnZXRzID0gdGFyZ2V0cy5tYXAocGFyc2VUcmlwbGUpXG5cbiAgcmV0dXJuIG5hcGlDb25maWdcbn1cbiIsImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuXG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4vbG9nLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdHJ5SW5zdGFsbENhcmdvQmluYXJ5KG5hbWU6IHN0cmluZywgYmluOiBzdHJpbmcpIHtcbiAgaWYgKGRldGVjdENhcmdvQmluYXJ5KGJpbikpIHtcbiAgICBkZWJ1ZygnQ2FyZ28gYmluYXJ5IGFscmVhZHkgaW5zdGFsbGVkOiAlcycsIG5hbWUpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIGRlYnVnKCdJbnN0YWxsaW5nIGNhcmdvIGJpbmFyeTogJXMnLCBuYW1lKVxuICAgIGV4ZWNTeW5jKGBjYXJnbyBpbnN0YWxsICR7bmFtZX1gLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbnN0YWxsIGNhcmdvIGJpbmFyeTogJHtuYW1lfWAsIHtcbiAgICAgIGNhdXNlOiBlLFxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0ZWN0Q2FyZ29CaW5hcnkoYmluOiBzdHJpbmcpIHtcbiAgZGVidWcoJ0RldGVjdGluZyBjYXJnbyBiaW5hcnk6ICVzJywgYmluKVxuICB0cnkge1xuICAgIGV4ZWNTeW5jKGBjYXJnbyBoZWxwICR7YmlufWAsIHtcbiAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICB9KVxuICAgIGRlYnVnKCdDYXJnbyBiaW5hcnkgZGV0ZWN0ZWQ6ICVzJywgYmluKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2gge1xuICAgIGRlYnVnKCdDYXJnbyBiaW5hcnkgbm90IGRldGVjdGVkOiAlcycsIGJpbilcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwiaW1wb3J0IHsgc29ydEJ5IH0gZnJvbSAnZXMtdG9vbGtpdCdcblxuaW1wb3J0IHsgcmVhZEZpbGVBc3luYyB9IGZyb20gJy4vbWlzYy5qcydcblxuY29uc3QgVE9QX0xFVkVMX05BTUVTUEFDRSA9ICdfX1RPUF9MRVZFTF9NT0RVTEVfXydcbmV4cG9ydCBjb25zdCBERUZBVUxUX1RZUEVfREVGX0hFQURFUiA9IGAvKiBhdXRvLWdlbmVyYXRlZCBieSBOQVBJLVJTICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuYFxuXG5lbnVtIFR5cGVEZWZLaW5kIHtcbiAgQ29uc3QgPSAnY29uc3QnLFxuICBFbnVtID0gJ2VudW0nLFxuICBTdHJpbmdFbnVtID0gJ3N0cmluZ19lbnVtJyxcbiAgSW50ZXJmYWNlID0gJ2ludGVyZmFjZScsXG4gIFR5cGUgPSAndHlwZScsXG4gIEZuID0gJ2ZuJyxcbiAgU3RydWN0ID0gJ3N0cnVjdCcsXG4gIEV4dGVuZHMgPSAnZXh0ZW5kcycsXG4gIEltcGwgPSAnaW1wbCcsXG59XG5cbmludGVyZmFjZSBUeXBlRGVmTGluZSB7XG4gIGtpbmQ6IFR5cGVEZWZLaW5kXG4gIG5hbWU6IHN0cmluZ1xuICBvcmlnaW5hbF9uYW1lPzogc3RyaW5nXG4gIGRlZjogc3RyaW5nXG4gIGV4dGVuZHM/OiBzdHJpbmdcbiAganNfZG9jPzogc3RyaW5nXG4gIGpzX21vZD86IHN0cmluZ1xufVxuXG4vKipcbiAqIFJlbmRlciBhIHNpbmdsZSBpbnRlcm1lZGlhdGUgdHlwZS1kZWYgbGluZSBhcyB0aGUgVHlwZVNjcmlwdCBzb3VyY2UgaXRcbiAqIHNob3VsZCBwcm9kdWNlIGluIGBpbmRleC5kLnRzYC5cbiAqXG4gKiBAcGFyYW0gbGluZSAtIFRoZSBpbnRlcm1lZGlhdGUgdHlwZS1kZWYgZW50cnkgdG8gcmVuZGVyLlxuICogQHBhcmFtIGNvbnN0RW51bSAtIFdoZW4gdHJ1ZSwgZW1pdCBudW1lcmljIGFuZCBzdHJpbmcgYCNbbmFwaV1gIGVudW1zIGFzXG4gKiAgIGBjb25zdCBlbnVtYC4gV2hlbiBmYWxzZSAoYC0tbm8tY29uc3QtZW51bWApLCBudW1lcmljIGVudW1zIGJlY29tZVxuICogICByZWd1bGFyIHJ1bnRpbWUgZW51bXMgYW5kIHN0cmluZyBlbnVtcyBmYWxsIGJhY2sgdG8gYSB0eXBlLW9ubHkgdW5pb25cbiAqICAgdW5sZXNzIGBydW50aW1lU3RyaW5nRW51bWAgaXMgYWxzbyB0cnVlLlxuICogQHBhcmFtIHJ1bnRpbWVTdHJpbmdFbnVtIC0gV2hlbiB0cnVlIHVuZGVyIGAtLW5vLWNvbnN0LWVudW1gLCBlbWl0XG4gKiAgIGAjW25hcGkoc3RyaW5nX2VudW0pXWAgYXMgYSBydW50aW1lIGVudW0gKGBleHBvcnQgZGVjbGFyZSBlbnVtYClcbiAqICAgaW5zdGVhZCBvZiBhIHR5cGUtb25seSB1bmlvbi4gTm8tb3Agd2hlbiBgY29uc3RFbnVtYCBpcyB0cnVlLlxuICogQHBhcmFtIGlkZW50IC0gSW5kZW50YXRpb24gbGV2ZWwgYXBwbGllZCB0byB0aGUgcmVuZGVyZWQgb3V0cHV0LlxuICogQHBhcmFtIGFtYmllbnQgLSBXaGVuIHRydWUsIGVtaXQgZGVjbGFyYXRpb25zIGluIHRoZSBhbWJpZW50IGZvcm0gdXNlZFxuICogICBpbnNpZGUgYGRlY2xhcmUgbmFtZXNwYWNlYCBibG9ja3MgKGUuZy4gZHJvcCB0aGUgYGRlY2xhcmVgIGtleXdvcmQpLlxuICovXG5mdW5jdGlvbiBwcmV0dHlQcmludChcbiAgbGluZTogVHlwZURlZkxpbmUsXG4gIGNvbnN0RW51bTogYm9vbGVhbixcbiAgcnVudGltZVN0cmluZ0VudW06IGJvb2xlYW4sXG4gIGlkZW50OiBudW1iZXIsXG4gIGFtYmllbnQgPSBmYWxzZSxcbik6IHN0cmluZyB7XG4gIGxldCBzID0gbGluZS5qc19kb2MgPz8gJydcbiAgc3dpdGNoIChsaW5lLmtpbmQpIHtcbiAgICBjYXNlIFR5cGVEZWZLaW5kLkludGVyZmFjZTpcbiAgICAgIHMgKz0gYGV4cG9ydCBpbnRlcmZhY2UgJHtsaW5lLm5hbWV9IHtcXG4ke2xpbmUuZGVmfVxcbn1gXG4gICAgICBicmVha1xuXG4gICAgY2FzZSBUeXBlRGVmS2luZC5UeXBlOlxuICAgICAgcyArPSBgZXhwb3J0IHR5cGUgJHtsaW5lLm5hbWV9ID0gXFxuJHtsaW5lLmRlZn1gXG4gICAgICBicmVha1xuXG4gICAgY2FzZSBUeXBlRGVmS2luZC5FbnVtOiB7XG4gICAgICBjb25zdCBlbnVtTmFtZSA9IGNvbnN0RW51bSA/ICdjb25zdCBlbnVtJyA6ICdlbnVtJ1xuICAgICAgcyArPSBgJHtleHBvcnREZWNsYXJlKGFtYmllbnQpfSAke2VudW1OYW1lfSAke2xpbmUubmFtZX0ge1xcbiR7bGluZS5kZWZ9XFxufWBcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY2FzZSBUeXBlRGVmS2luZC5TdHJpbmdFbnVtOiB7XG4gICAgICBpZiAoY29uc3RFbnVtKSB7XG4gICAgICAgIHMgKz0gYCR7ZXhwb3J0RGVjbGFyZShhbWJpZW50KX0gY29uc3QgZW51bSAke2xpbmUubmFtZX0ge1xcbiR7bGluZS5kZWZ9XFxufWBcbiAgICAgIH0gZWxzZSBpZiAocnVudGltZVN0cmluZ0VudW0pIHtcbiAgICAgICAgcyArPSBgJHtleHBvcnREZWNsYXJlKGFtYmllbnQpfSBlbnVtICR7bGluZS5uYW1lfSB7XFxuJHtsaW5lLmRlZn1cXG59YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcyArPSBgZXhwb3J0IHR5cGUgJHtsaW5lLm5hbWV9ID0gJHtsaW5lLmRlZi5yZXBsYWNlQWxsKC8uKj0vZywgJycpLnJlcGxhY2VBbGwoJywnLCAnfCcpfTtgXG4gICAgICB9XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNhc2UgVHlwZURlZktpbmQuU3RydWN0OlxuICAgICAgY29uc3QgZXh0ZW5kc0RlZiA9IGxpbmUuZXh0ZW5kcyA/IGAgZXh0ZW5kcyAke2xpbmUuZXh0ZW5kc31gIDogJydcbiAgICAgIGlmIChsaW5lLmV4dGVuZHMpIHtcbiAgICAgICAgLy8gRXh0cmFjdCBnZW5lcmljIHBhcmFtcyBmcm9tIGV4dGVuZHMgdHlwZSBsaWtlIEl0ZXJhdG9yPFQsIFRSZXN1bHQsIFROZXh0PlxuICAgICAgICBjb25zdCBnZW5lcmljTWF0Y2ggPSBsaW5lLmV4dGVuZHMubWF0Y2goL0l0ZXJhdG9yPCguKyk+JC8pXG4gICAgICAgIGlmIChnZW5lcmljTWF0Y2gpIHtcbiAgICAgICAgICBjb25zdCBbVCwgVFJlc3VsdCwgVE5leHRdID0gZ2VuZXJpY01hdGNoWzFdXG4gICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgLm1hcCgocCkgPT4gcC50cmltKCkpXG4gICAgICAgICAgbGluZS5kZWYgPVxuICAgICAgICAgICAgbGluZS5kZWYgK1xuICAgICAgICAgICAgYFxcbm5leHQodmFsdWU/OiAke1ROZXh0fSk6IEl0ZXJhdG9yUmVzdWx0PCR7VH0sICR7VFJlc3VsdH0+YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzICs9IGAke2V4cG9ydERlY2xhcmUoYW1iaWVudCl9IGNsYXNzICR7bGluZS5uYW1lfSR7ZXh0ZW5kc0RlZn0ge1xcbiR7bGluZS5kZWZ9XFxufWBcbiAgICAgIGlmIChsaW5lLm9yaWdpbmFsX25hbWUgJiYgbGluZS5vcmlnaW5hbF9uYW1lICE9PSBsaW5lLm5hbWUpIHtcbiAgICAgICAgcyArPSBgXFxuZXhwb3J0IHR5cGUgJHtsaW5lLm9yaWdpbmFsX25hbWV9ID0gJHtsaW5lLm5hbWV9YFxuICAgICAgfVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgVHlwZURlZktpbmQuRm46XG4gICAgICBzICs9IGAke2V4cG9ydERlY2xhcmUoYW1iaWVudCl9ICR7bGluZS5kZWZ9YFxuICAgICAgYnJlYWtcblxuICAgIGRlZmF1bHQ6XG4gICAgICBzICs9IGxpbmUuZGVmXG4gIH1cblxuICByZXR1cm4gY29ycmVjdFN0cmluZ0lkZW50KHMsIGlkZW50KVxufVxuXG5mdW5jdGlvbiBleHBvcnREZWNsYXJlKGFtYmllbnQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoYW1iaWVudCkge1xuICAgIHJldHVybiAnZXhwb3J0J1xuICB9XG5cbiAgcmV0dXJuICdleHBvcnQgZGVjbGFyZSdcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBuYXBpLWRlcml2ZS1lbWl0dGVkIGludGVybWVkaWF0ZSB0eXBlLWRlZiBmaWxlIGFuZCByZW5kZXIgaXRzXG4gKiBlbnRyaWVzIGludG8gdGhlIGBpbmRleC5kLnRzYCBzb3VyY2Ugc3RyaW5nIHBsdXMgdGhlIGxpc3Qgb2YgbmFtZXMgdG9cbiAqIHJlLWV4cG9ydCBmcm9tIGBpbmRleC5qc2AuXG4gKlxuICogQHBhcmFtIGludGVybWVkaWF0ZVR5cGVGaWxlIC0gUGF0aCB0byB0aGUgSlNPTkwgdHlwZS1kZWYgZmlsZSBwcm9kdWNlZFxuICogICBieSBuYXBpLWRlcml2ZSAob25lIGVudHJ5IHBlciBgI1tuYXBpXWAgaXRlbSkuXG4gKiBAcGFyYW0gY29uc3RFbnVtIC0gU2VlIHtAbGluayBwcmV0dHlQcmludH0uXG4gKiBAcGFyYW0gcnVudGltZVN0cmluZ0VudW0gLSBTZWUge0BsaW5rIHByZXR0eVByaW50fS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NUeXBlRGVmKFxuICBpbnRlcm1lZGlhdGVUeXBlRmlsZTogc3RyaW5nLFxuICBjb25zdEVudW06IGJvb2xlYW4sXG4gIHJ1bnRpbWVTdHJpbmdFbnVtOiBib29sZWFuID0gZmFsc2UsXG4pIHtcbiAgY29uc3QgZXhwb3J0czogc3RyaW5nW10gPSBbXVxuICBjb25zdCBkZWZzID0gYXdhaXQgcmVhZEludGVybWVkaWF0ZVR5cGVGaWxlKGludGVybWVkaWF0ZVR5cGVGaWxlKVxuICBjb25zdCBncm91cGVkRGVmcyA9IHByZXByb2Nlc3NUeXBlRGVmKGRlZnMpXG5cbiAgY29uc3QgZHRzID1cbiAgICBzb3J0QnkoQXJyYXkuZnJvbShncm91cGVkRGVmcyksIFsoW25hbWVzcGFjZV0pID0+IG5hbWVzcGFjZV0pXG4gICAgICAubWFwKChbbmFtZXNwYWNlLCBkZWZzXSkgPT4ge1xuICAgICAgICBpZiAobmFtZXNwYWNlID09PSBUT1BfTEVWRUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZnNcbiAgICAgICAgICAgIC5tYXAoKGRlZikgPT4ge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGRlZi5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUeXBlRGVmS2luZC5Db25zdDpcbiAgICAgICAgICAgICAgICBjYXNlIFR5cGVEZWZLaW5kLkVudW06XG4gICAgICAgICAgICAgICAgY2FzZSBUeXBlRGVmS2luZC5TdHJpbmdFbnVtOlxuICAgICAgICAgICAgICAgIGNhc2UgVHlwZURlZktpbmQuRm46XG4gICAgICAgICAgICAgICAgY2FzZSBUeXBlRGVmS2luZC5TdHJ1Y3Q6IHtcbiAgICAgICAgICAgICAgICAgIGV4cG9ydHMucHVzaChkZWYubmFtZSlcbiAgICAgICAgICAgICAgICAgIGlmIChkZWYub3JpZ2luYWxfbmFtZSAmJiBkZWYub3JpZ2luYWxfbmFtZSAhPT0gZGVmLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5wdXNoKGRlZi5vcmlnaW5hbF9uYW1lKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHByZXR0eVByaW50KGRlZiwgY29uc3RFbnVtLCBydW50aW1lU3RyaW5nRW51bSwgMClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignXFxuXFxuJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBleHBvcnRzLnB1c2gobmFtZXNwYWNlKVxuICAgICAgICAgIGxldCBkZWNsYXJhdGlvbiA9ICcnXG4gICAgICAgICAgZGVjbGFyYXRpb24gKz0gYGV4cG9ydCBkZWNsYXJlIG5hbWVzcGFjZSAke25hbWVzcGFjZX0ge1xcbmBcbiAgICAgICAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbiArPVxuICAgICAgICAgICAgICBwcmV0dHlQcmludChkZWYsIGNvbnN0RW51bSwgcnVudGltZVN0cmluZ0VudW0sIDIsIHRydWUpICsgJ1xcbidcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVjbGFyYXRpb24gKz0gJ30nXG4gICAgICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuXFxuJykgKyAnXFxuJ1xuXG4gIHJldHVybiB7XG4gICAgZHRzLFxuICAgIGV4cG9ydHMsXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEludGVybWVkaWF0ZVR5cGVGaWxlKGZpbGU6IHN0cmluZykge1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlLCAndXRmOCcpXG5cbiAgY29uc3QgZGVmcyA9IGNvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKVxuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShsaW5lKSBhcyBUeXBlRGVmTGluZVxuICAgICAgLy8gQ29udmVydCBlc2NhcGVkIG5ld2xpbmVzIGJhY2sgdG8gYWN0dWFsIG5ld2xpbmVzIGluIGpzX2RvYyBmaWVsZHNcbiAgICAgIGlmIChwYXJzZWQuanNfZG9jKSB7XG4gICAgICAgIHBhcnNlZC5qc19kb2MgPSBwYXJzZWQuanNfZG9jLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKVxuICAgICAgfVxuICAgICAgLy8gQ29udmVydCBlc2NhcGVkIG5ld2xpbmVzIHRvIGFjdHVhbCBuZXdsaW5lcyBpbiBkZWYgZmllbGRzIGZvciBzdHJ1Y3QvY2xhc3MvaW50ZXJmYWNlL3R5cGUgdHlwZXNcbiAgICAgIC8vIHdoZXJlIFxcbiByZXByZXNlbnRzIG1ldGhvZC9maWVsZCBzZXBhcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFjdHVhbCBuZXdsaW5lc1xuICAgICAgaWYgKHBhcnNlZC5kZWYpIHtcbiAgICAgICAgcGFyc2VkLmRlZiA9IHBhcnNlZC5kZWYucmVwbGFjZSgvXFxcXG4vZywgJ1xcbicpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyc2VkXG4gICAgfSlcblxuICAvLyBtb3ZlIGFsbCBgc3RydWN0YCBkZWYgdG8gdGhlIHZlcnkgdG9wXG4gIC8vIGFuZCBvcmRlciB0aGUgcmVzdCBhbHBoYWJldGljYWxseS5cbiAgcmV0dXJuIGRlZnMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmtpbmQgPT09IFR5cGVEZWZLaW5kLlN0cnVjdCkge1xuICAgICAgaWYgKGIua2luZCA9PT0gVHlwZURlZktpbmQuU3RydWN0KSB7XG4gICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpXG4gICAgICB9XG4gICAgICByZXR1cm4gLTFcbiAgICB9IGVsc2UgaWYgKGIua2luZCA9PT0gVHlwZURlZktpbmQuU3RydWN0KSB7XG4gICAgICByZXR1cm4gMVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc1R5cGVEZWYoZGVmczogVHlwZURlZkxpbmVbXSk6IE1hcDxzdHJpbmcsIFR5cGVEZWZMaW5lW10+IHtcbiAgY29uc3QgbmFtZXNwYWNlR3JvdXBlZCA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlRGVmTGluZVtdPigpXG4gIGNvbnN0IGNsYXNzRGVmcyA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlRGVmTGluZT4oKVxuXG4gIGZvciAoY29uc3QgZGVmIG9mIGRlZnMpIHtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBkZWYuanNfbW9kID8/IFRPUF9MRVZFTF9OQU1FU1BBQ0VcbiAgICBpZiAoIW5hbWVzcGFjZUdyb3VwZWQuaGFzKG5hbWVzcGFjZSkpIHtcbiAgICAgIG5hbWVzcGFjZUdyb3VwZWQuc2V0KG5hbWVzcGFjZSwgW10pXG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXAgPSBuYW1lc3BhY2VHcm91cGVkLmdldChuYW1lc3BhY2UpIVxuXG4gICAgaWYgKGRlZi5raW5kID09PSBUeXBlRGVmS2luZC5TdHJ1Y3QpIHtcbiAgICAgIGdyb3VwLnB1c2goZGVmKVxuICAgICAgY2xhc3NEZWZzLnNldChkZWYubmFtZSwgZGVmKVxuICAgIH0gZWxzZSBpZiAoZGVmLmtpbmQgPT09IFR5cGVEZWZLaW5kLkV4dGVuZHMpIHtcbiAgICAgIGNvbnN0IGNsYXNzRGVmID0gY2xhc3NEZWZzLmdldChkZWYubmFtZSlcbiAgICAgIGlmIChjbGFzc0RlZikge1xuICAgICAgICBjbGFzc0RlZi5leHRlbmRzID0gZGVmLmRlZlxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVmLmtpbmQgPT09IFR5cGVEZWZLaW5kLkltcGwpIHtcbiAgICAgIC8vIG1lcmdlIGBpbXBsYCBpbnRvIGNsYXNzIGRlZmluaXRpb25cbiAgICAgIGNvbnN0IGNsYXNzRGVmID0gY2xhc3NEZWZzLmdldChkZWYubmFtZSlcbiAgICAgIGlmIChjbGFzc0RlZikge1xuICAgICAgICBpZiAoY2xhc3NEZWYuZGVmKSB7XG4gICAgICAgICAgY2xhc3NEZWYuZGVmICs9ICdcXG4nXG4gICAgICAgIH1cblxuICAgICAgICBjbGFzc0RlZi5kZWYgKz0gZGVmLmRlZlxuICAgICAgICAvLyBDb252ZXJ0IGFueSByZW1haW5pbmcgXFxuIHNlcXVlbmNlcyBpbiB0aGUgbWVyZ2VkIGRlZiB0byBhY3R1YWwgbmV3bGluZXNcbiAgICAgICAgaWYgKGNsYXNzRGVmLmRlZikge1xuICAgICAgICAgIGNsYXNzRGVmLmRlZiA9IGNsYXNzRGVmLmRlZi5yZXBsYWNlKC9cXFxcbi9nLCAnXFxuJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBncm91cC5wdXNoKGRlZilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZXNwYWNlR3JvdXBlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29ycmVjdFN0cmluZ0lkZW50KHNyYzogc3RyaW5nLCBpZGVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IGJyYWNrZXREZXB0aCA9IDBcbiAgY29uc3QgcmVzdWx0ID0gc3JjXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKVxuICAgICAgaWYgKGxpbmUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0luTXVsdGlsaW5lQ29tbWVudCA9IGxpbmUuc3RhcnRzV2l0aCgnKicpXG4gICAgICBjb25zdCBpc0Nsb3NpbmdCcmFja2V0ID0gbGluZS5lbmRzV2l0aCgnfScpXG4gICAgICBjb25zdCBpc09wZW5pbmdCcmFja2V0ID0gbGluZS5lbmRzV2l0aCgneycpXG4gICAgICBjb25zdCBpc1R5cGVEZWNsYXJhdGlvbiA9IGxpbmUuZW5kc1dpdGgoJz0nKVxuICAgICAgY29uc3QgaXNUeXBlVmFyaWFudCA9IGxpbmUuc3RhcnRzV2l0aCgnfCcpXG5cbiAgICAgIGxldCByaWdodEluZGVudCA9IGlkZW50XG4gICAgICBpZiAoKGlzT3BlbmluZ0JyYWNrZXQgfHwgaXNUeXBlRGVjbGFyYXRpb24pICYmICFpc0luTXVsdGlsaW5lQ29tbWVudCkge1xuICAgICAgICBicmFja2V0RGVwdGggKz0gMVxuICAgICAgICByaWdodEluZGVudCArPSAoYnJhY2tldERlcHRoIC0gMSkgKiAyXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDbG9zaW5nQnJhY2tldCAmJlxuICAgICAgICAgIGJyYWNrZXREZXB0aCA+IDAgJiZcbiAgICAgICAgICAhaXNJbk11bHRpbGluZUNvbW1lbnQgJiZcbiAgICAgICAgICAhaXNUeXBlVmFyaWFudFxuICAgICAgICApIHtcbiAgICAgICAgICBicmFja2V0RGVwdGggLT0gMVxuICAgICAgICB9XG4gICAgICAgIHJpZ2h0SW5kZW50ICs9IGJyYWNrZXREZXB0aCAqIDJcbiAgICAgIH1cblxuICAgICAgaWYgKGlzSW5NdWx0aWxpbmVDb21tZW50KSB7XG4gICAgICAgIHJpZ2h0SW5kZW50ICs9IDFcbiAgICAgIH1cblxuICAgICAgY29uc3QgcyA9IGAkeycgJy5yZXBlYXQocmlnaHRJbmRlbnQpfSR7bGluZX1gXG5cbiAgICAgIHJldHVybiBzXG4gICAgfSlcbiAgICAuam9pbignXFxuJylcblxuICByZXR1cm4gcmVzdWx0XG59XG4iLCJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgeyByZWFkTmFwaUNvbmZpZyB9IGZyb20gJy4vY29uZmlnLmpzJ1xuXG5pbnRlcmZhY2UgTWluaW1hbE5hcGlPcHRpb25zIHtcbiAgY3dkOiBzdHJpbmdcbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICBwYWNrYWdlSnNvblBhdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRDb25maWcob3B0aW9uczogTWluaW1hbE5hcGlPcHRpb25zKSB7XG4gIGNvbnN0IHJlc29sdmVQYXRoID0gKC4uLnBhdGhzOiBzdHJpbmdbXSkgPT4gcmVzb2x2ZShvcHRpb25zLmN3ZCwgLi4ucGF0aHMpXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgIHJlc29sdmVQYXRoKG9wdGlvbnMucGFja2FnZUpzb25QYXRoID8/ICdwYWNrYWdlLmpzb24nKSxcbiAgICBvcHRpb25zLmNvbmZpZ1BhdGggPyByZXNvbHZlUGF0aChvcHRpb25zLmNvbmZpZ1BhdGgpIDogdW5kZWZpbmVkLFxuICApXG4gIHJldHVybiBjb25maWdcbn1cbiIsImltcG9ydCB7IGpvaW4sIHJlc29sdmUsIHBhcnNlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgKiBhcyBjb2xvcnMgZnJvbSAnY29sb3JldHRlJ1xuXG5pbXBvcnQge1xuICBhcHBseURlZmF1bHRBcnRpZmFjdHNPcHRpb25zLFxuICB0eXBlIEFydGlmYWN0c09wdGlvbnMsXG59IGZyb20gJy4uL2RlZi9hcnRpZmFjdHMuanMnXG5pbXBvcnQge1xuICByZWFkTmFwaUNvbmZpZyxcbiAgZGVidWdGYWN0b3J5LFxuICByZWFkRmlsZUFzeW5jLFxuICB3cml0ZUZpbGVBc3luYyxcbiAgVW5pQXJjaHNCeVBsYXRmb3JtLFxuICByZWFkZGlyQXN5bmMsXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgnYXJ0aWZhY3RzJylcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RBcnRpZmFjdHModXNlck9wdGlvbnM6IEFydGlmYWN0c09wdGlvbnMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGFwcGx5RGVmYXVsdEFydGlmYWN0c09wdGlvbnModXNlck9wdGlvbnMpXG5cbiAgY29uc3QgcmVzb2x2ZVBhdGggPSAoLi4ucGF0aHM6IHN0cmluZ1tdKSA9PiByZXNvbHZlKG9wdGlvbnMuY3dkLCAuLi5wYXRocylcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVzb2x2ZVBhdGgob3B0aW9ucy5wYWNrYWdlSnNvblBhdGgpXG4gIGNvbnN0IHsgdGFyZ2V0cywgYmluYXJ5TmFtZSwgcGFja2FnZU5hbWUgfSA9IGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgIHBhY2thZ2VKc29uUGF0aCxcbiAgICBvcHRpb25zLmNvbmZpZ1BhdGggPyByZXNvbHZlUGF0aChvcHRpb25zLmNvbmZpZ1BhdGgpIDogdW5kZWZpbmVkLFxuICApXG5cbiAgY29uc3QgZGlzdERpcnMgPSB0YXJnZXRzLm1hcCgocGxhdGZvcm0pID0+XG4gICAgam9pbihvcHRpb25zLmN3ZCwgb3B0aW9ucy5ucG1EaXIsIHBsYXRmb3JtLnBsYXRmb3JtQXJjaEFCSSksXG4gIClcblxuICBjb25zdCB1bml2ZXJzYWxTb3VyY2VCaW5zID0gbmV3IFNldChcbiAgICB0YXJnZXRzXG4gICAgICAuZmlsdGVyKChwbGF0Zm9ybSkgPT4gcGxhdGZvcm0uYXJjaCA9PT0gJ3VuaXZlcnNhbCcpXG4gICAgICAuZmxhdE1hcCgocCkgPT5cbiAgICAgICAgVW5pQXJjaHNCeVBsYXRmb3JtW3AucGxhdGZvcm1dPy5tYXAoKGEpID0+IGAke3AucGxhdGZvcm19LSR7YX1gKSxcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW10sXG4gIClcblxuICBhd2FpdCBjb2xsZWN0Tm9kZUJpbmFyaWVzKGpvaW4ob3B0aW9ucy5jd2QsIG9wdGlvbnMub3V0cHV0RGlyKSkudGhlbihcbiAgICAob3V0cHV0KSA9PlxuICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgIG91dHB1dC5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICAgICAgZGVidWcuaW5mbyhgUmVhZCBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KGZpbGVQYXRoKX1dYClcbiAgICAgICAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlUGF0aClcbiAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2UoZmlsZVBhdGgpXG4gICAgICAgICAgY29uc3QgdGVybXMgPSBwYXJzZWROYW1lLm5hbWUuc3BsaXQoJy4nKVxuICAgICAgICAgIGNvbnN0IHBsYXRmb3JtQXJjaEFCSSA9IHRlcm1zLnBvcCgpIVxuICAgICAgICAgIGNvbnN0IF9iaW5hcnlOYW1lID0gdGVybXMuam9pbignLicpXG5cbiAgICAgICAgICBpZiAoX2JpbmFyeU5hbWUgIT09IGJpbmFyeU5hbWUpIHtcbiAgICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICAgIGBbJHtfYmluYXJ5TmFtZX1dIGlzIG5vdCBtYXRjaGVkIHdpdGggWyR7YmluYXJ5TmFtZX1dLCBza2lwYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkaXIgPSBkaXN0RGlycy5maW5kKChkaXIpID0+IGRpci5pbmNsdWRlcyhwbGF0Zm9ybUFyY2hBQkkpKVxuICAgICAgICAgIGlmICghZGlyICYmIHVuaXZlcnNhbFNvdXJjZUJpbnMuaGFzKHBsYXRmb3JtQXJjaEFCSSkpIHtcbiAgICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICAgIGBbJHtwbGF0Zm9ybUFyY2hBQkl9XSBoYXMgbm8gZGlzdCBkaXIgYnV0IGl0IGlzIHNvdXJjZSBiaW4gZm9yIHVuaXZlcnNhbCBhcmNoLCBza2lwYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRpcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBkaXN0IGRpciBmb3VuZCBmb3IgJHtmaWxlUGF0aH1gKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGRpc3RGaWxlUGF0aCA9IGpvaW4oZGlyLCBwYXJzZWROYW1lLmJhc2UpXG4gICAgICAgICAgZGVidWcuaW5mbyhcbiAgICAgICAgICAgIGBXcml0ZSBmaWxlIGNvbnRlbnQgdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodChkaXN0RmlsZVBhdGgpfV1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhkaXN0RmlsZVBhdGgsIHNvdXJjZUNvbnRlbnQpXG4gICAgICAgICAgY29uc3QgZGlzdEZpbGVQYXRoTG9jYWwgPSBqb2luKFxuICAgICAgICAgICAgcGFyc2UocGFja2FnZUpzb25QYXRoKS5kaXIsXG4gICAgICAgICAgICBwYXJzZWROYW1lLmJhc2UsXG4gICAgICAgICAgKVxuICAgICAgICAgIGRlYnVnLmluZm8oXG4gICAgICAgICAgICBgV3JpdGUgZmlsZSBjb250ZW50IHRvIFske2NvbG9ycy55ZWxsb3dCcmlnaHQoZGlzdEZpbGVQYXRoTG9jYWwpfV1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhkaXN0RmlsZVBhdGhMb2NhbCwgc291cmNlQ29udGVudClcbiAgICAgICAgfSksXG4gICAgICApLFxuICApXG5cbiAgY29uc3Qgd2FzaVRhcmdldCA9IHRhcmdldHMuZmluZCgodCkgPT4gdC5wbGF0Zm9ybSA9PT0gJ3dhc2knKVxuICBpZiAod2FzaVRhcmdldCkge1xuICAgIGNvbnN0IHdhc2lEaXIgPSBqb2luKFxuICAgICAgb3B0aW9ucy5jd2QsXG4gICAgICBvcHRpb25zLm5wbURpcixcbiAgICAgIHdhc2lUYXJnZXQucGxhdGZvcm1BcmNoQUJJLFxuICAgIClcbiAgICBjb25zdCBjanNGaWxlID0gam9pbihcbiAgICAgIG9wdGlvbnMuYnVpbGRPdXRwdXREaXIgPz8gb3B0aW9ucy5jd2QsXG4gICAgICBgJHtiaW5hcnlOYW1lfS53YXNpLmNqc2AsXG4gICAgKVxuICAgIGNvbnN0IHdvcmtlckZpbGUgPSBqb2luKFxuICAgICAgb3B0aW9ucy5idWlsZE91dHB1dERpciA/PyBvcHRpb25zLmN3ZCxcbiAgICAgIGB3YXNpLXdvcmtlci5tanNgLFxuICAgIClcbiAgICBjb25zdCBicm93c2VyRW50cnkgPSBqb2luKFxuICAgICAgb3B0aW9ucy5idWlsZE91dHB1dERpciA/PyBvcHRpb25zLmN3ZCxcbiAgICAgIGAke2JpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2AsXG4gICAgKVxuICAgIGNvbnN0IGJyb3dzZXJXb3JrZXJGaWxlID0gam9pbihcbiAgICAgIG9wdGlvbnMuYnVpbGRPdXRwdXREaXIgPz8gb3B0aW9ucy5jd2QsXG4gICAgICBgd2FzaS13b3JrZXItYnJvd3Nlci5tanNgLFxuICAgIClcbiAgICBkZWJ1Zy5pbmZvKFxuICAgICAgYE1vdmUgd2FzaSBiaW5kaW5nIGZpbGUgWyR7Y29sb3JzLnllbGxvd0JyaWdodChcbiAgICAgICAgY2pzRmlsZSxcbiAgICAgICl9XSB0byBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KHdhc2lEaXIpfV1gLFxuICAgIClcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgIGpvaW4od2FzaURpciwgYCR7YmluYXJ5TmFtZX0ud2FzaS5janNgKSxcbiAgICAgIGF3YWl0IHJlYWRGaWxlQXN5bmMoY2pzRmlsZSksXG4gICAgKVxuICAgIGRlYnVnLmluZm8oXG4gICAgICBgTW92ZSB3YXNpIHdvcmtlciBmaWxlIFske2NvbG9ycy55ZWxsb3dCcmlnaHQoXG4gICAgICAgIHdvcmtlckZpbGUsXG4gICAgICApfV0gdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodCh3YXNpRGlyKX1dYCxcbiAgICApXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICBqb2luKHdhc2lEaXIsIGB3YXNpLXdvcmtlci5tanNgKSxcbiAgICAgIGF3YWl0IHJlYWRGaWxlQXN5bmMod29ya2VyRmlsZSksXG4gICAgKVxuICAgIGRlYnVnLmluZm8oXG4gICAgICBgTW92ZSB3YXNpIGJyb3dzZXIgZW50cnkgZmlsZSBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KFxuICAgICAgICBicm93c2VyRW50cnksXG4gICAgICApfV0gdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodCh3YXNpRGlyKX1dYCxcbiAgICApXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICBqb2luKHdhc2lEaXIsIGAke2JpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2ApLFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlL2lzc3Vlcy84NDI3XG4gICAgICAoYXdhaXQgcmVhZEZpbGVBc3luYyhicm93c2VyRW50cnksICd1dGY4JykpLnJlcGxhY2UoXG4gICAgICAgIGBuZXcgVVJMKCcuL3dhc2ktd29ya2VyLWJyb3dzZXIubWpzJywgaW1wb3J0Lm1ldGEudXJsKWAsXG4gICAgICAgIGBuZXcgVVJMKCcke3BhY2thZ2VOYW1lfS13YXNtMzItd2FzaS93YXNpLXdvcmtlci1icm93c2VyLm1qcycsIGltcG9ydC5tZXRhLnVybClgLFxuICAgICAgKSxcbiAgICApXG4gICAgZGVidWcuaW5mbyhcbiAgICAgIGBNb3ZlIHdhc2kgYnJvd3NlciB3b3JrZXIgZmlsZSBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KFxuICAgICAgICBicm93c2VyV29ya2VyRmlsZSxcbiAgICAgICl9XSB0byBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KHdhc2lEaXIpfV1gLFxuICAgIClcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgIGpvaW4od2FzaURpciwgYHdhc2ktd29ya2VyLWJyb3dzZXIubWpzYCksXG4gICAgICBhd2FpdCByZWFkRmlsZUFzeW5jKGJyb3dzZXJXb3JrZXJGaWxlKSxcbiAgICApXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdE5vZGVCaW5hcmllcyhyb290OiBzdHJpbmcpIHtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyQXN5bmMocm9vdCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gIGNvbnN0IG5vZGVCaW5hcmllcyA9IGZpbGVzXG4gICAgLmZpbHRlcihcbiAgICAgIChmaWxlKSA9PlxuICAgICAgICBmaWxlLmlzRmlsZSgpICYmXG4gICAgICAgIChmaWxlLm5hbWUuZW5kc1dpdGgoJy5ub2RlJykgfHwgZmlsZS5uYW1lLmVuZHNXaXRoKCcud2FzbScpKSxcbiAgICApXG4gICAgLm1hcCgoZmlsZSkgPT4gam9pbihyb290LCBmaWxlLm5hbWUpKVxuXG4gIGNvbnN0IGRpcnMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUuaXNEaXJlY3RvcnkoKSlcbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGlmIChkaXIubmFtZSAhPT0gJ25vZGVfbW9kdWxlcycpIHtcbiAgICAgIG5vZGVCaW5hcmllcy5wdXNoKC4uLihhd2FpdCBjb2xsZWN0Tm9kZUJpbmFyaWVzKGpvaW4ocm9vdCwgZGlyLm5hbWUpKSkpXG4gICAgfVxuICB9XG4gIHJldHVybiBub2RlQmluYXJpZXNcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDanNCaW5kaW5nKFxuICBsb2NhbE5hbWU6IHN0cmluZyxcbiAgcGtnTmFtZTogc3RyaW5nLFxuICBpZGVudHM6IHN0cmluZ1tdLFxuICBwYWNrYWdlVmVyc2lvbj86IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtiaW5kaW5nSGVhZGVyfVxuJHtjcmVhdGVDb21tb25CaW5kaW5nKGxvY2FsTmFtZSwgcGtnTmFtZSwgcGFja2FnZVZlcnNpb24pfVxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVCaW5kaW5nXG4ke2lkZW50c1xuICAubWFwKChpZGVudCkgPT4gYG1vZHVsZS5leHBvcnRzLiR7aWRlbnR9ID0gbmF0aXZlQmluZGluZy4ke2lkZW50fWApXG4gIC5qb2luKCdcXG4nKX1cbmBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVzbUJpbmRpbmcoXG4gIGxvY2FsTmFtZTogc3RyaW5nLFxuICBwa2dOYW1lOiBzdHJpbmcsXG4gIGlkZW50czogc3RyaW5nW10sXG4gIHBhY2thZ2VWZXJzaW9uPzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2JpbmRpbmdIZWFkZXJ9XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnXG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG5jb25zdCBfX2Rpcm5hbWUgPSBuZXcgVVJMKCcuJywgaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZVxuXG4ke2NyZWF0ZUNvbW1vbkJpbmRpbmcobG9jYWxOYW1lLCBwa2dOYW1lLCBwYWNrYWdlVmVyc2lvbil9XG5jb25zdCB7ICR7aWRlbnRzLmpvaW4oJywgJyl9IH0gPSBuYXRpdmVCaW5kaW5nXG4ke2lkZW50cy5tYXAoKGlkZW50KSA9PiBgZXhwb3J0IHsgJHtpZGVudH0gfWApLmpvaW4oJ1xcbicpfVxuYFxufVxuXG5jb25zdCBiaW5kaW5nSGVhZGVyID0gYC8vIHByZXR0aWVyLWlnbm9yZVxuLyogZXNsaW50LWRpc2FibGUgKi9cbi8vIEB0cy1ub2NoZWNrXG4vKiBhdXRvLWdlbmVyYXRlZCBieSBOQVBJLVJTICovXG5gXG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1vbkJpbmRpbmcoXG4gIGxvY2FsTmFtZTogc3RyaW5nLFxuICBwa2dOYW1lOiBzdHJpbmcsXG4gIHBhY2thZ2VWZXJzaW9uPzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgZnVuY3Rpb24gcmVxdWlyZVR1cGxlKHR1cGxlOiBzdHJpbmcsIGlkZW50U2l6ZSA9IDgpIHtcbiAgICBjb25zdCBpZGVudExvdyA9ICcgJy5yZXBlYXQoaWRlbnRTaXplIC0gMilcbiAgICBjb25zdCBpZGVudCA9ICcgJy5yZXBlYXQoaWRlbnRTaXplKVxuICAgIGNvbnN0IHZlcnNpb25DaGVjayA9IHBhY2thZ2VWZXJzaW9uXG4gICAgICA/IGBcbiR7aWRlbnRMb3d9dHJ5IHtcbiR7aWRlbnR9Y29uc3QgYmluZGluZyA9IHJlcXVpcmUoJyR7cGtnTmFtZX0tJHt0dXBsZX0nKVxuJHtpZGVudH1jb25zdCBiaW5kaW5nUGFja2FnZVZlcnNpb24gPSByZXF1aXJlKCcke3BrZ05hbWV9LSR7dHVwbGV9L3BhY2thZ2UuanNvbicpLnZlcnNpb25cbiR7aWRlbnR9aWYgKGJpbmRpbmdQYWNrYWdlVmVyc2lvbiAhPT0gJyR7cGFja2FnZVZlcnNpb259JyAmJiBwcm9jZXNzLmVudi5OQVBJX1JTX0VORk9SQ0VfVkVSU0lPTl9DSEVDSyAmJiBwcm9jZXNzLmVudi5OQVBJX1JTX0VORk9SQ0VfVkVSU0lPTl9DSEVDSyAhPT0gJzAnKSB7XG4ke2lkZW50fSAgdGhyb3cgbmV3IEVycm9yKFxcYE5hdGl2ZSBiaW5kaW5nIHBhY2thZ2UgdmVyc2lvbiBtaXNtYXRjaCwgZXhwZWN0ZWQgJHtwYWNrYWdlVmVyc2lvbn0gYnV0IGdvdCBcXCR7YmluZGluZ1BhY2thZ2VWZXJzaW9ufS4gWW91IGNhbiByZWluc3RhbGwgZGVwZW5kZW5jaWVzIHRvIGZpeCB0aGlzIGlzc3VlLlxcYClcbiR7aWRlbnR9fVxuJHtpZGVudH1yZXR1cm4gYmluZGluZ1xuJHtpZGVudExvd319IGNhdGNoIChlKSB7XG4ke2lkZW50fWxvYWRFcnJvcnMucHVzaChlKVxuJHtpZGVudExvd319YFxuICAgICAgOiBgXG4ke2lkZW50TG93fXRyeSB7XG4ke2lkZW50fXJldHVybiByZXF1aXJlKCcke3BrZ05hbWV9LSR7dHVwbGV9JylcbiR7aWRlbnRMb3d9fSBjYXRjaCAoZSkge1xuJHtpZGVudH1sb2FkRXJyb3JzLnB1c2goZSlcbiR7aWRlbnRMb3d9fWBcbiAgICByZXR1cm4gYHRyeSB7XG4ke2lkZW50fXJldHVybiByZXF1aXJlKCcuLyR7bG9jYWxOYW1lfS4ke3R1cGxlfS5ub2RlJylcbiR7aWRlbnRMb3d9fSBjYXRjaCAoZSkge1xuJHtpZGVudH1sb2FkRXJyb3JzLnB1c2goZSlcbiR7aWRlbnRMb3d9fSR7dmVyc2lvbkNoZWNrfWBcbiAgfVxuXG4gIHJldHVybiBgY29uc3QgeyByZWFkRmlsZVN5bmMgfSA9IHJlcXVpcmUoJ25vZGU6ZnMnKVxubGV0IG5hdGl2ZUJpbmRpbmcgPSBudWxsXG5jb25zdCBsb2FkRXJyb3JzID0gW11cblxuY29uc3QgaXNNdXNsID0gKCkgPT4ge1xuICBsZXQgbXVzbCA9IGZhbHNlXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gICAgbXVzbCA9IGlzTXVzbEZyb21GaWxlc3lzdGVtKClcbiAgICBpZiAobXVzbCA9PT0gbnVsbCkge1xuICAgICAgbXVzbCA9IGlzTXVzbEZyb21SZXBvcnQoKVxuICAgIH1cbiAgICBpZiAobXVzbCA9PT0gbnVsbCkge1xuICAgICAgbXVzbCA9IGlzTXVzbEZyb21DaGlsZFByb2Nlc3MoKVxuICAgIH1cbiAgfVxuICByZXR1cm4gbXVzbFxufVxuXG5jb25zdCBpc0ZpbGVNdXNsID0gKGYpID0+IGYuaW5jbHVkZXMoJ2xpYmMubXVzbC0nKSB8fCBmLmluY2x1ZGVzKCdsZC1tdXNsLScpXG5cbmNvbnN0IGlzTXVzbEZyb21GaWxlc3lzdGVtID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiByZWFkRmlsZVN5bmMoJy91c3IvYmluL2xkZCcsICd1dGYtOCcpLmluY2x1ZGVzKCdtdXNsJylcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5jb25zdCBpc011c2xGcm9tUmVwb3J0ID0gKCkgPT4ge1xuICBsZXQgcmVwb3J0ID0gbnVsbFxuICBpZiAodHlwZW9mIHByb2Nlc3MucmVwb3J0Py5nZXRSZXBvcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9jZXNzLnJlcG9ydC5leGNsdWRlTmV0d29yayA9IHRydWVcbiAgICByZXBvcnQgPSBwcm9jZXNzLnJlcG9ydC5nZXRSZXBvcnQoKVxuICB9XG4gIGlmICghcmVwb3J0KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBpZiAocmVwb3J0LmhlYWRlciAmJiByZXBvcnQuaGVhZGVyLmdsaWJjVmVyc2lvblJ1bnRpbWUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShyZXBvcnQuc2hhcmVkT2JqZWN0cykpIHtcbiAgICBpZiAocmVwb3J0LnNoYXJlZE9iamVjdHMuc29tZShpc0ZpbGVNdXNsKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IGlzTXVzbEZyb21DaGlsZFByb2Nlc3MgPSAoKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjU3luYygnbGRkIC0tdmVyc2lvbicsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KS5pbmNsdWRlcygnbXVzbCcpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZiB3ZSByZWFjaCB0aGlzIGNhc2UsIHdlIGRvbid0IGtub3cgaWYgdGhlIHN5c3RlbSBpcyBtdXNsIG9yIG5vdCwgc28gaXMgYmV0dGVyIHRvIGp1c3QgZmFsbGJhY2sgdG8gZmFsc2VcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiByZXF1aXJlTmF0aXZlKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTkFQSV9SU19OQVRJVkVfTElCUkFSWV9QQVRIKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiByZXF1aXJlKHByb2Nlc3MuZW52Lk5BUElfUlNfTkFUSVZFX0xJQlJBUllfUEFUSCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2FkRXJyb3JzLnB1c2goZXJyKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcbiAgICBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnYW5kcm9pZC1hcm02NCcpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtJykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ2FuZHJvaWQtYXJtLWVhYmknKX1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgb24gQW5kcm9pZCBcXCR7cHJvY2Vzcy5hcmNofVxcYCkpXG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBpZiAocHJvY2Vzcy5hcmNoID09PSAneDY0Jykge1xuICAgICAgaWYgKHByb2Nlc3MuY29uZmlnPy52YXJpYWJsZXM/LnNobGliX3N1ZmZpeCA9PT0gJ2RsbC5hJyB8fCBwcm9jZXNzLmNvbmZpZz8udmFyaWFibGVzPy5ub2RlX3RhcmdldF90eXBlID09PSAnc2hhcmVkX2xpYnJhcnknKSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCd3aW4zMi14NjQtZ251Jyl9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnd2luMzIteDY0LW1zdmMnKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2lhMzInKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnd2luMzItaWEzMi1tc3ZjJyl9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmFyY2ggPT09ICdhcm02NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCd3aW4zMi1hcm02NC1tc3ZjJyl9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRFcnJvcnMucHVzaChuZXcgRXJyb3IoXFxgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIG9uIFdpbmRvd3M6IFxcJHtwcm9jZXNzLmFyY2h9XFxgKSlcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICAke3JlcXVpcmVUdXBsZSgnZGFyd2luLXVuaXZlcnNhbCcsIDYpfVxuICAgIGlmIChwcm9jZXNzLmFyY2ggPT09ICd4NjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnZGFyd2luLXg2NCcpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnZGFyd2luLWFybTY0Jyl9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRFcnJvcnMucHVzaChuZXcgRXJyb3IoXFxgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIG9uIG1hY09TOiBcXCR7cHJvY2Vzcy5hcmNofVxcYCkpXG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdmcmVlYnNkJykge1xuICAgIGlmIChwcm9jZXNzLmFyY2ggPT09ICd4NjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnZnJlZWJzZC14NjQnKX1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybTY0Jykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ2ZyZWVic2QtYXJtNjQnKX1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgb24gRnJlZUJTRDogXFwke3Byb2Nlc3MuYXJjaH1cXGApKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgIGlmIChpc011c2woKSkge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgteDY0LW11c2wnLCAxMCl9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgteDY0LWdudScsIDEwKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybTY0Jykge1xuICAgICAgaWYgKGlzTXVzbCgpKSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1hcm02NC1tdXNsJywgMTApfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LWFybTY0LWdudScsIDEwKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybScpIHtcbiAgICAgIGlmIChpc011c2woKSkge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtYXJtLW11c2xlYWJpaGYnLCAxMCl9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtYXJtLWdudWVhYmloZicsIDEwKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2xvb25nNjQnKSB7XG4gICAgICBpZiAoaXNNdXNsKCkpIHtcbiAgICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LWxvb25nNjQtbXVzbCcsIDEwKX1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1sb29uZzY0LWdudScsIDEwKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3Jpc2N2NjQnKSB7XG4gICAgICBpZiAoaXNNdXNsKCkpIHtcbiAgICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LXJpc2N2NjQtbXVzbCcsIDEwKX1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1yaXNjdjY0LWdudScsIDEwKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3BwYzY0Jykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LXBwYzY0LWdudScpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnczM5MHgnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtczM5MHgtZ251Jyl9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRFcnJvcnMucHVzaChuZXcgRXJyb3IoXFxgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIG9uIExpbnV4OiBcXCR7cHJvY2Vzcy5hcmNofVxcYCkpXG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdvcGVuaGFybW9ueScpIHtcbiAgICBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnb3Blbmhhcm1vbnktYXJtNjQnKX1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdvcGVuaGFybW9ueS14NjQnKX1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybScpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdvcGVuaGFybW9ueS1hcm0nKX1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgb24gT3Blbkhhcm1vbnk6IFxcJHtwcm9jZXNzLmFyY2h9XFxgKSlcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBPUzogXFwke3Byb2Nlc3MucGxhdGZvcm19LCBhcmNoaXRlY3R1cmU6IFxcJHtwcm9jZXNzLmFyY2h9XFxgKSlcbiAgfVxufVxuXG5uYXRpdmVCaW5kaW5nID0gcmVxdWlyZU5hdGl2ZSgpXG5cbi8vIE5BUElfUlNfRk9SQ0VfV0FTSSBpcyBhIHRyaS1zdGF0ZSBmbGFnOlxuLy8gICB1bnNldCAvIGFueSBvdGhlciB2YWx1ZSDihpIgbmF0aXZlIGJpbmRpbmcgcHJlZmVycmVkLCBXQVNJIGlzIG9ubHkgYSBmYWxsYmFja1xuLy8gICAndHJ1ZScgICAgICAgICAgICAgICAgICAg4oaSIGZvcmNlIFdBU0kgZmFsbGJhY2sgZXZlbiBpZiBuYXRpdmUgbG9hZGVkXG4vLyAgICdlcnJvcicgICAgICAgICAgICAgICAgICDihpIgZm9yY2UgV0FTSSBhbmQgdGhyb3cgaWYgbm8gV0FTSSBiaW5kaW5nIGlzIGZvdW5kXG4vLyBUcmVhdGluZyBhbnkgbm9uLWVtcHR5IHN0cmluZyBhcyB0cnV0aHkgKHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yKSBtZWFudFxuLy8gTkFQSV9SU19GT1JDRV9XQVNJPWZhbHNlLCBOQVBJX1JTX0ZPUkNFX1dBU0k9MCwgZXRjLiBpbmFkdmVydGVudGx5IHRyaWdnZXJlZFxuLy8gdGhlIFdBU0kgcGF0aCwgY2F1c2luZyBFTk9FTlQgZm9yIHBhY2thZ2VzIHNoaXBwZWQgd2l0aG91dCBhIC53YXNpLmNqcyBmaWxlLlxuY29uc3QgZm9yY2VXYXNpID1cbiAgcHJvY2Vzcy5lbnYuTkFQSV9SU19GT1JDRV9XQVNJID09PSAndHJ1ZScgfHwgcHJvY2Vzcy5lbnYuTkFQSV9SU19GT1JDRV9XQVNJID09PSAnZXJyb3InXG5cbmlmICghbmF0aXZlQmluZGluZyB8fCBmb3JjZVdhc2kpIHtcbiAgbGV0IHdhc2lCaW5kaW5nID0gbnVsbFxuICBsZXQgd2FzaUJpbmRpbmdFcnJvciA9IG51bGxcbiAgdHJ5IHtcbiAgICB3YXNpQmluZGluZyA9IHJlcXVpcmUoJy4vJHtsb2NhbE5hbWV9Lndhc2kuY2pzJylcbiAgICBuYXRpdmVCaW5kaW5nID0gd2FzaUJpbmRpbmdcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGZvcmNlV2FzaSkge1xuICAgICAgd2FzaUJpbmRpbmdFcnJvciA9IGVyclxuICAgIH1cbiAgfVxuICBpZiAoIW5hdGl2ZUJpbmRpbmcgfHwgZm9yY2VXYXNpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHdhc2lCaW5kaW5nID0gcmVxdWlyZSgnJHtwa2dOYW1lfS13YXNtMzItd2FzaScpXG4gICAgICBuYXRpdmVCaW5kaW5nID0gd2FzaUJpbmRpbmdcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChmb3JjZVdhc2kpIHtcbiAgICAgICAgaWYgKCF3YXNpQmluZGluZ0Vycm9yKSB7XG4gICAgICAgICAgd2FzaUJpbmRpbmdFcnJvciA9IGVyclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhc2lCaW5kaW5nRXJyb3IuY2F1c2UgPSBlcnJcbiAgICAgICAgfVxuICAgICAgICBsb2FkRXJyb3JzLnB1c2goZXJyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTkFQSV9SU19GT1JDRV9XQVNJID09PSAnZXJyb3InICYmICF3YXNpQmluZGluZykge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdXQVNJIGJpbmRpbmcgbm90IGZvdW5kIGFuZCBOQVBJX1JTX0ZPUkNFX1dBU0kgaXMgc2V0IHRvIGVycm9yJylcbiAgICBlcnJvci5jYXVzZSA9IHdhc2lCaW5kaW5nRXJyb3JcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbmlmICghbmF0aXZlQmluZGluZykge1xuICBpZiAobG9hZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXFxgQ2Fubm90IGZpbmQgbmF0aXZlIGJpbmRpbmcuIFxcYCArXG4gICAgICAgIFxcYG5wbSBoYXMgYSBidWcgcmVsYXRlZCB0byBvcHRpb25hbCBkZXBlbmRlbmNpZXMgKGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vY2xpL2lzc3Vlcy80ODI4KS4gXFxgICtcbiAgICAgICAgJ1BsZWFzZSB0cnkgXFxgbnBtIGlcXGAgYWdhaW4gYWZ0ZXIgcmVtb3ZpbmcgYm90aCBwYWNrYWdlLWxvY2suanNvbiBhbmQgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeS4nLFxuICAgICAge1xuICAgICAgICBjYXVzZTogbG9hZEVycm9ycy5yZWR1Y2UoKGVyciwgY3VyKSA9PiB7XG4gICAgICAgICAgY3VyLmNhdXNlID0gZXJyXG4gICAgICAgICAgcmV0dXJuIGN1clxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgKVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcXGBGYWlsZWQgdG8gbG9hZCBuYXRpdmUgYmluZGluZ1xcYClcbn1cbmBcbn1cbiIsImV4cG9ydCBjb25zdCBjcmVhdGVXYXNpQnJvd3NlckJpbmRpbmcgPSAoXG4gIHdhc2lGaWxlbmFtZTogc3RyaW5nLFxuICBpbml0aWFsTWVtb3J5ID0gNDAwMCxcbiAgbWF4aW11bU1lbW9yeSA9IDY1NTM2LFxuICBmcyA9IGZhbHNlLFxuICBhc3luY0luaXQgPSBmYWxzZSxcbiAgYnVmZmVyID0gZmFsc2UsXG4gIGVycm9yRXZlbnQgPSBmYWxzZSxcbikgPT4ge1xuICBjb25zdCBmc0ltcG9ydCA9IGZzXG4gICAgPyBidWZmZXJcbiAgICAgID8gYGltcG9ydCB7IG1lbWZzLCBCdWZmZXIgfSBmcm9tICdAbmFwaS1ycy93YXNtLXJ1bnRpbWUvZnMnYFxuICAgICAgOiBgaW1wb3J0IHsgbWVtZnMgfSBmcm9tICdAbmFwaS1ycy93YXNtLXJ1bnRpbWUvZnMnYFxuICAgIDogJydcbiAgY29uc3QgYnVmZmVySW1wb3J0ID0gYnVmZmVyICYmICFmcyA/IGBpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInYCA6ICcnXG4gIGNvbnN0IHdhc2lDcmVhdGlvbiA9IGZzXG4gICAgPyBgXG5leHBvcnQgY29uc3QgeyBmczogX19mcywgdm9sOiBfX3ZvbHVtZSB9ID0gbWVtZnMoKVxuXG5jb25zdCBfX3dhc2kgPSBuZXcgX19XQVNJKHtcbiAgdmVyc2lvbjogJ3ByZXZpZXcxJyxcbiAgZnM6IF9fZnMsXG4gIHByZW9wZW5zOiB7XG4gICAgJy8nOiAnLycsXG4gIH0sXG59KWBcbiAgICA6IGBcbmNvbnN0IF9fd2FzaSA9IG5ldyBfX1dBU0koe1xuICB2ZXJzaW9uOiAncHJldmlldzEnLFxufSlgXG5cbiAgY29uc3Qgd29ya2VyRnNIYW5kbGVyID0gZnNcbiAgICA/IGAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBfX3dhc21DcmVhdGVPbk1lc3NhZ2VGb3JGc1Byb3h5KF9fZnMpKVxcbmBcbiAgICA6ICcnXG5cbiAgY29uc3Qgd29ya2VyRXJyb3JIYW5kbGVyID0gZXJyb3JFdmVudFxuICAgID8gYCAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmRhdGEgJiYgdHlwZW9mIGV2ZW50LmRhdGEgPT09ICdvYmplY3QnICYmIGV2ZW50LmRhdGEudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ25hcGktcnMtd29ya2VyLWVycm9yJywgeyBkZXRhaWw6IGV2ZW50LmRhdGEgfSkpXG4gICAgICB9XG4gICAgfSlcbmBcbiAgICA6ICcnXG5cbiAgY29uc3QgZW1uYXBpSW5qZWN0QnVmZmVyID0gYnVmZmVyXG4gICAgPyAnX19lbW5hcGlDb250ZXh0LmZlYXR1cmUuQnVmZmVyID0gQnVmZmVyJ1xuICAgIDogJydcbiAgY29uc3QgZW1uYXBpSW5zdGFudGlhdGVJbXBvcnQgPSBhc3luY0luaXRcbiAgICA/IGBpbnN0YW50aWF0ZU5hcGlNb2R1bGUgYXMgX19lbW5hcGlJbnN0YW50aWF0ZU5hcGlNb2R1bGVgXG4gICAgOiBgaW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYyBhcyBfX2VtbmFwaUluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmNgXG4gIGNvbnN0IGVtbmFwaUluc3RhbnRpYXRlQ2FsbCA9IGFzeW5jSW5pdFxuICAgID8gYGF3YWl0IF9fZW1uYXBpSW5zdGFudGlhdGVOYXBpTW9kdWxlYFxuICAgIDogYF9fZW1uYXBpSW5zdGFudGlhdGVOYXBpTW9kdWxlU3luY2BcblxuICByZXR1cm4gYGltcG9ydCB7XG4gIGNyZWF0ZU9uTWVzc2FnZSBhcyBfX3dhc21DcmVhdGVPbk1lc3NhZ2VGb3JGc1Byb3h5LFxuICBnZXREZWZhdWx0Q29udGV4dCBhcyBfX2VtbmFwaUdldERlZmF1bHRDb250ZXh0LFxuICAke2VtbmFwaUluc3RhbnRpYXRlSW1wb3J0fSxcbiAgV0FTSSBhcyBfX1dBU0ksXG59IGZyb20gJ0BuYXBpLXJzL3dhc20tcnVudGltZSdcbiR7ZnNJbXBvcnR9XG4ke2J1ZmZlckltcG9ydH1cbiR7d2FzaUNyZWF0aW9ufVxuXG5jb25zdCBfX3dhc21VcmwgPSBuZXcgVVJMKCcuLyR7d2FzaUZpbGVuYW1lfS53YXNtJywgaW1wb3J0Lm1ldGEudXJsKS5ocmVmXG5jb25zdCBfX2VtbmFwaUNvbnRleHQgPSBfX2VtbmFwaUdldERlZmF1bHRDb250ZXh0KClcbiR7ZW1uYXBpSW5qZWN0QnVmZmVyfVxuXG5jb25zdCBfX3NoYXJlZE1lbW9yeSA9IG5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe1xuICBpbml0aWFsOiAke2luaXRpYWxNZW1vcnl9LFxuICBtYXhpbXVtOiAke21heGltdW1NZW1vcnl9LFxuICBzaGFyZWQ6IHRydWUsXG59KVxuXG5jb25zdCBfX3dhc21GaWxlID0gYXdhaXQgZmV0Y2goX193YXNtVXJsKS50aGVuKChyZXMpID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuXG5jb25zdCB7XG4gIGluc3RhbmNlOiBfX25hcGlJbnN0YW5jZSxcbiAgbW9kdWxlOiBfX3dhc2lNb2R1bGUsXG4gIG5hcGlNb2R1bGU6IF9fbmFwaU1vZHVsZSxcbn0gPSAke2VtbmFwaUluc3RhbnRpYXRlQ2FsbH0oX193YXNtRmlsZSwge1xuICBjb250ZXh0OiBfX2VtbmFwaUNvbnRleHQsXG4gIGFzeW5jV29ya1Bvb2xTaXplOiA0LFxuICB3YXNpOiBfX3dhc2ksXG4gIG9uQ3JlYXRlV29ya2VyKCkge1xuICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIobmV3IFVSTCgnLi93YXNpLXdvcmtlci1icm93c2VyLm1qcycsIGltcG9ydC5tZXRhLnVybCksIHtcbiAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgIH0pXG4ke3dvcmtlckZzSGFuZGxlcn1cbiR7d29ya2VyRXJyb3JIYW5kbGVyfVxuICAgIHJldHVybiB3b3JrZXJcbiAgfSxcbiAgb3ZlcndyaXRlSW1wb3J0cyhpbXBvcnRPYmplY3QpIHtcbiAgICBpbXBvcnRPYmplY3QuZW52ID0ge1xuICAgICAgLi4uaW1wb3J0T2JqZWN0LmVudixcbiAgICAgIC4uLmltcG9ydE9iamVjdC5uYXBpLFxuICAgICAgLi4uaW1wb3J0T2JqZWN0LmVtbmFwaSxcbiAgICAgIG1lbW9yeTogX19zaGFyZWRNZW1vcnksXG4gICAgfVxuICAgIHJldHVybiBpbXBvcnRPYmplY3RcbiAgfSxcbiAgYmVmb3JlSW5pdCh7IGluc3RhbmNlIH0pIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoaW5zdGFuY2UuZXhwb3J0cykpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ19fbmFwaV9yZWdpc3Rlcl9fJykpIHtcbiAgICAgICAgaW5zdGFuY2UuZXhwb3J0c1tuYW1lXSgpXG4gICAgICB9XG4gICAgfVxuICB9LFxufSlcbmBcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVdhc2lCaW5kaW5nID0gKFxuICB3YXNtRmlsZU5hbWU6IHN0cmluZyxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgaW5pdGlhbE1lbW9yeSA9IDQwMDAsXG4gIG1heGltdW1NZW1vcnkgPSA2NTUzNixcbikgPT4gYC8qIGVzbGludC1kaXNhYmxlICovXG4vKiBwcmV0dGllci1pZ25vcmUgKi9cblxuLyogYXV0by1nZW5lcmF0ZWQgYnkgTkFQSS1SUyAqL1xuXG5jb25zdCBfX25vZGVGcyA9IHJlcXVpcmUoJ25vZGU6ZnMnKVxuY29uc3QgX19ub2RlUGF0aCA9IHJlcXVpcmUoJ25vZGU6cGF0aCcpXG5jb25zdCB7IFdBU0k6IF9fbm9kZVdBU0kgfSA9IHJlcXVpcmUoJ25vZGU6d2FzaScpXG5jb25zdCB7IFdvcmtlciB9ID0gcmVxdWlyZSgnbm9kZTp3b3JrZXJfdGhyZWFkcycpXG5cbmNvbnN0IHtcbiAgY3JlYXRlT25NZXNzYWdlOiBfX3dhc21DcmVhdGVPbk1lc3NhZ2VGb3JGc1Byb3h5LFxuICBnZXREZWZhdWx0Q29udGV4dDogX19lbW5hcGlHZXREZWZhdWx0Q29udGV4dCxcbiAgaW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYzogX19lbW5hcGlJbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jLFxufSA9IHJlcXVpcmUoJ0BuYXBpLXJzL3dhc20tcnVudGltZScpXG5cbmNvbnN0IF9fcm9vdERpciA9IF9fbm9kZVBhdGgucGFyc2UocHJvY2Vzcy5jd2QoKSkucm9vdFxuXG5jb25zdCBfX3dhc2kgPSBuZXcgX19ub2RlV0FTSSh7XG4gIHZlcnNpb246ICdwcmV2aWV3MScsXG4gIGVudjogcHJvY2Vzcy5lbnYsXG4gIHByZW9wZW5zOiB7XG4gICAgW19fcm9vdERpcl06IF9fcm9vdERpcixcbiAgfVxufSlcblxuY29uc3QgX19lbW5hcGlDb250ZXh0ID0gX19lbW5hcGlHZXREZWZhdWx0Q29udGV4dCgpXG5cbmNvbnN0IF9fc2hhcmVkTWVtb3J5ID0gbmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7XG4gIGluaXRpYWw6ICR7aW5pdGlhbE1lbW9yeX0sXG4gIG1heGltdW06ICR7bWF4aW11bU1lbW9yeX0sXG4gIHNoYXJlZDogdHJ1ZSxcbn0pXG5cbmxldCBfX3dhc21GaWxlUGF0aCA9IF9fbm9kZVBhdGguam9pbihfX2Rpcm5hbWUsICcke3dhc21GaWxlTmFtZX0ud2FzbScpXG5jb25zdCBfX3dhc21EZWJ1Z0ZpbGVQYXRoID0gX19ub2RlUGF0aC5qb2luKF9fZGlybmFtZSwgJyR7d2FzbUZpbGVOYW1lfS5kZWJ1Zy53YXNtJylcblxuaWYgKF9fbm9kZUZzLmV4aXN0c1N5bmMoX193YXNtRGVidWdGaWxlUGF0aCkpIHtcbiAgX193YXNtRmlsZVBhdGggPSBfX3dhc21EZWJ1Z0ZpbGVQYXRoXG59IGVsc2UgaWYgKCFfX25vZGVGcy5leGlzdHNTeW5jKF9fd2FzbUZpbGVQYXRoKSkge1xuICB0cnkge1xuICAgIF9fd2FzbUZpbGVQYXRoID0gcmVxdWlyZS5yZXNvbHZlKCcke3BhY2thZ2VOYW1lfS13YXNtMzItd2FzaS8ke3dhc21GaWxlTmFtZX0ud2FzbScpXG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgJHt3YXNtRmlsZU5hbWV9Lndhc20gZmlsZSwgYW5kICR7cGFja2FnZU5hbWV9LXdhc20zMi13YXNpIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZC4nKVxuICB9XG59XG5cbmNvbnN0IHsgaW5zdGFuY2U6IF9fbmFwaUluc3RhbmNlLCBtb2R1bGU6IF9fd2FzaU1vZHVsZSwgbmFwaU1vZHVsZTogX19uYXBpTW9kdWxlIH0gPSBfX2VtbmFwaUluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMoX19ub2RlRnMucmVhZEZpbGVTeW5jKF9fd2FzbUZpbGVQYXRoKSwge1xuICBjb250ZXh0OiBfX2VtbmFwaUNvbnRleHQsXG4gIGFzeW5jV29ya1Bvb2xTaXplOiAoZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgdGhyZWFkc1NpemVGcm9tRW52ID0gTnVtYmVyKHByb2Nlc3MuZW52Lk5BUElfUlNfQVNZTkNfV09SS19QT09MX1NJWkUgPz8gcHJvY2Vzcy5lbnYuVVZfVEhSRUFEUE9PTF9TSVpFKVxuICAgIC8vIE5hTiA+IDAgaXMgZmFsc2VcbiAgICBpZiAodGhyZWFkc1NpemVGcm9tRW52ID4gMCkge1xuICAgICAgcmV0dXJuIHRocmVhZHNTaXplRnJvbUVudlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gNFxuICAgIH1cbiAgfSkoKSxcbiAgcmV1c2VXb3JrZXI6IHRydWUsXG4gIHdhc2k6IF9fd2FzaSxcbiAgb25DcmVhdGVXb3JrZXIoKSB7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcihfX25vZGVQYXRoLmpvaW4oX19kaXJuYW1lLCAnd2FzaS13b3JrZXIubWpzJyksIHtcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgfSlcbiAgICB3b3JrZXIub25tZXNzYWdlID0gKHsgZGF0YSB9KSA9PiB7XG4gICAgICBfX3dhc21DcmVhdGVPbk1lc3NhZ2VGb3JGc1Byb3h5KF9fbm9kZUZzKShkYXRhKVxuICAgIH1cblxuICAgIC8vIFRoZSBtYWluIHRocmVhZCBvZiBOb2RlLmpzIHdhaXRzIGZvciBhbGwgdGhlIGFjdGl2ZSBoYW5kbGVzIGJlZm9yZSBleGl0aW5nLlxuICAgIC8vIEJ1dCBSdXN0IHRocmVhZHMgYXJlIG5ldmVyIHdhaXRlZCB3aXRob3V0IFxcYHRocmVhZDo6am9pblxcYC5cbiAgICAvLyBTbyBoZXJlIHdlIGhhY2sgdGhlIGNvZGUgb2YgTm9kZS5qcyB0byBwcmV2ZW50IHRoZSB3b3JrZXJzIGZyb20gYmVpbmcgcmVmZXJlbmNlZCAoYWN0aXZlKS5cbiAgICAvLyBBY2NvcmRpbmcgdG8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvMTllMGQ0NzI3MjhjNzlkNDE4Yjc0YmRkZmY1ODhiZWE3MGE0MDNkMC9saWIvaW50ZXJuYWwvd29ya2VyLmpzI0w0MTUsXG4gICAgLy8gYSB3b3JrZXIgaXMgY29uc2lzdCBvZiB0d28gaGFuZGxlczoga1B1YmxpY1BvcnQgYW5kIGtIYW5kbGUuXG4gICAge1xuICAgICAgY29uc3Qga1B1YmxpY1BvcnQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHdvcmtlcikuZmluZChzID0+XG4gICAgICAgIHMudG9TdHJpbmcoKS5pbmNsdWRlcyhcImtQdWJsaWNQb3J0XCIpXG4gICAgICApO1xuICAgICAgaWYgKGtQdWJsaWNQb3J0KSB7XG4gICAgICAgIHdvcmtlcltrUHVibGljUG9ydF0ucmVmID0gKCkgPT4ge307XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtIYW5kbGUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHdvcmtlcikuZmluZChzID0+XG4gICAgICAgIHMudG9TdHJpbmcoKS5pbmNsdWRlcyhcImtIYW5kbGVcIilcbiAgICAgICk7XG4gICAgICBpZiAoa0hhbmRsZSkge1xuICAgICAgICB3b3JrZXJba0hhbmRsZV0ucmVmID0gKCkgPT4ge307XG4gICAgICB9XG5cbiAgICAgIHdvcmtlci51bnJlZigpO1xuICAgIH1cbiAgICByZXR1cm4gd29ya2VyXG4gIH0sXG4gIG92ZXJ3cml0ZUltcG9ydHMoaW1wb3J0T2JqZWN0KSB7XG4gICAgaW1wb3J0T2JqZWN0LmVudiA9IHtcbiAgICAgIC4uLmltcG9ydE9iamVjdC5lbnYsXG4gICAgICAuLi5pbXBvcnRPYmplY3QubmFwaSxcbiAgICAgIC4uLmltcG9ydE9iamVjdC5lbW5hcGksXG4gICAgICBtZW1vcnk6IF9fc2hhcmVkTWVtb3J5LFxuICAgIH1cbiAgICByZXR1cm4gaW1wb3J0T2JqZWN0XG4gIH0sXG4gIGJlZm9yZUluaXQoeyBpbnN0YW5jZSB9KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGluc3RhbmNlLmV4cG9ydHMpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCdfX25hcGlfcmVnaXN0ZXJfXycpKSB7XG4gICAgICAgIGluc3RhbmNlLmV4cG9ydHNbbmFtZV0oKVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pXG5gXG4iLCJleHBvcnQgY29uc3QgV0FTSV9XT1JLRVJfVEVNUExBVEUgPSBgaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IFdBU0kgfSBmcm9tIFwibm9kZTp3YXNpXCI7XG5pbXBvcnQgeyBwYXJlbnRQb3J0LCBXb3JrZXIgfSBmcm9tIFwibm9kZTp3b3JrZXJfdGhyZWFkc1wiO1xuXG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5jb25zdCB7IGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMsIE1lc3NhZ2VIYW5kbGVyLCBnZXREZWZhdWx0Q29udGV4dCB9ID0gcmVxdWlyZShcIkBuYXBpLXJzL3dhc20tcnVudGltZVwiKTtcblxuaWYgKHBhcmVudFBvcnQpIHtcbiAgcGFyZW50UG9ydC5vbihcIm1lc3NhZ2VcIiwgKGRhdGEpID0+IHtcbiAgICBnbG9iYWxUaGlzLm9ubWVzc2FnZSh7IGRhdGEgfSk7XG4gIH0pO1xufVxuXG5PYmplY3QuYXNzaWduKGdsb2JhbFRoaXMsIHtcbiAgc2VsZjogZ2xvYmFsVGhpcyxcbiAgcmVxdWlyZSxcbiAgV29ya2VyLFxuICBpbXBvcnRTY3JpcHRzOiBmdW5jdGlvbiAoZikge1xuICAgIDsoMCwgZXZhbCkoZnMucmVhZEZpbGVTeW5jKGYsIFwidXRmOFwiKSArIFwiLy8jIHNvdXJjZVVSTD1cIiArIGYpO1xuICB9LFxuICBwb3N0TWVzc2FnZTogZnVuY3Rpb24gKG1zZykge1xuICAgIGlmIChwYXJlbnRQb3J0KSB7XG4gICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKG1zZyk7XG4gICAgfVxuICB9LFxufSk7XG5cbmNvbnN0IGVtbmFwaUNvbnRleHQgPSBnZXREZWZhdWx0Q29udGV4dCgpO1xuXG5jb25zdCBfX3Jvb3REaXIgPSBwYXJzZShwcm9jZXNzLmN3ZCgpKS5yb290O1xuXG5jb25zdCBoYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKHtcbiAgb25Mb2FkKHsgd2FzbU1vZHVsZSwgd2FzbU1lbW9yeSB9KSB7XG4gICAgY29uc3Qgd2FzaSA9IG5ldyBXQVNJKHtcbiAgICAgIHZlcnNpb246ICdwcmV2aWV3MScsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgcHJlb3BlbnM6IHtcbiAgICAgICAgW19fcm9vdERpcl06IF9fcm9vdERpcixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYyh3YXNtTW9kdWxlLCB7XG4gICAgICBjaGlsZFRocmVhZDogdHJ1ZSxcbiAgICAgIHdhc2ksXG4gICAgICBjb250ZXh0OiBlbW5hcGlDb250ZXh0LFxuICAgICAgb3ZlcndyaXRlSW1wb3J0cyhpbXBvcnRPYmplY3QpIHtcbiAgICAgICAgaW1wb3J0T2JqZWN0LmVudiA9IHtcbiAgICAgICAgICAuLi5pbXBvcnRPYmplY3QuZW52LFxuICAgICAgICAgIC4uLmltcG9ydE9iamVjdC5uYXBpLFxuICAgICAgICAgIC4uLmltcG9ydE9iamVjdC5lbW5hcGksXG4gICAgICAgICAgbWVtb3J5OiB3YXNtTWVtb3J5XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pO1xuICB9LFxufSk7XG5cbmdsb2JhbFRoaXMub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgaGFuZGxlci5oYW5kbGUoZSk7XG59O1xuYFxuXG5leHBvcnQgY29uc3QgY3JlYXRlV2FzaUJyb3dzZXJXb3JrZXJCaW5kaW5nID0gKFxuICBmczogYm9vbGVhbixcbiAgZXJyb3JFdmVudDogYm9vbGVhbixcbikgPT4ge1xuICBjb25zdCBmc0ltcG9ydCA9IGZzXG4gICAgPyBgaW1wb3J0IHsgaW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYywgTWVzc2FnZUhhbmRsZXIsIFdBU0ksIGNyZWF0ZUZzUHJveHkgfSBmcm9tICdAbmFwaS1ycy93YXNtLXJ1bnRpbWUnXG5pbXBvcnQgeyBtZW1mc0V4cG9ydGVkIGFzIF9fbWVtZnNFeHBvcnRlZCB9IGZyb20gJ0BuYXBpLXJzL3dhc20tcnVudGltZS9mcydcblxuY29uc3QgZnMgPSBjcmVhdGVGc1Byb3h5KF9fbWVtZnNFeHBvcnRlZClgXG4gICAgOiBgaW1wb3J0IHsgaW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYywgTWVzc2FnZUhhbmRsZXIsIFdBU0kgfSBmcm9tICdAbmFwaS1ycy93YXNtLXJ1bnRpbWUnYFxuICBjb25zdCBlcnJvck91dHB1dHNBcHBlbmQgPSBlcnJvckV2ZW50XG4gICAgPyBgXFxuICAgICAgICBlcnJvck91dHB1dHMucHVzaChbLi4uYXJndW1lbnRzXSlgXG4gICAgOiAnJ1xuICBjb25zdCB3YXNpQ3JlYXRpb24gPSBmc1xuICAgID8gYGNvbnN0IHdhc2kgPSBuZXcgV0FTSSh7XG4gICAgICBmcyxcbiAgICAgIHByZW9wZW5zOiB7XG4gICAgICAgICcvJzogJy8nLFxuICAgICAgfSxcbiAgICAgIHByaW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cylcbiAgICAgIH0sXG4gICAgICBwcmludEVycjogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKVxuICAgICAgICAke2Vycm9yT3V0cHV0c0FwcGVuZH1cbiAgICAgIH0sXG4gICAgfSlgXG4gICAgOiBgY29uc3Qgd2FzaSA9IG5ldyBXQVNJKHtcbiAgICAgIHByaW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cylcbiAgICAgIH0sXG4gICAgICBwcmludEVycjogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKVxuICAgICAgICAke2Vycm9yT3V0cHV0c0FwcGVuZH1cbiAgICAgIH0sXG4gICAgfSlgXG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IGVycm9yRXZlbnRcbiAgICA/IGBvbkVycm9yKGVycm9yKSB7XG4gICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAnZXJyb3InLCBlcnJvciwgZXJyb3JPdXRwdXRzIH0pXG4gICAgZXJyb3JPdXRwdXRzLmxlbmd0aCA9IDBcbiAgfWBcbiAgICA6ICcnXG4gIGNvbnN0IGVycm9yT3V0cHV0c0RlY2wgPSBlcnJvckV2ZW50ID8gYFxcbmNvbnN0IGVycm9yT3V0cHV0cyA9IFtdXFxuYCA6ICcnXG4gIHJldHVybiBgJHtmc0ltcG9ydH1cbiR7ZXJyb3JPdXRwdXRzRGVjbH1cbmNvbnN0IGhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoe1xuICBvbkxvYWQoeyB3YXNtTW9kdWxlLCB3YXNtTWVtb3J5IH0pIHtcbiAgICAke3dhc2lDcmVhdGlvbn1cbiAgICByZXR1cm4gaW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYyh3YXNtTW9kdWxlLCB7XG4gICAgICBjaGlsZFRocmVhZDogdHJ1ZSxcbiAgICAgIHdhc2ksXG4gICAgICBvdmVyd3JpdGVJbXBvcnRzKGltcG9ydE9iamVjdCkge1xuICAgICAgICBpbXBvcnRPYmplY3QuZW52ID0ge1xuICAgICAgICAgIC4uLmltcG9ydE9iamVjdC5lbnYsXG4gICAgICAgICAgLi4uaW1wb3J0T2JqZWN0Lm5hcGksXG4gICAgICAgICAgLi4uaW1wb3J0T2JqZWN0LmVtbmFwaSxcbiAgICAgICAgICBtZW1vcnk6IHdhc21NZW1vcnksXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSlcbiAgfSxcbiAgJHtlcnJvckhhbmRsZXJ9XG59KVxuXG5nbG9iYWxUaGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gIGhhbmRsZXIuaGFuZGxlKGUpXG59XG5gXG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0bydcbmltcG9ydCB7IGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcm1TeW5jIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSdcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJ1xuaW1wb3J0IHsgcGFyc2UsIGpvaW4sIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCAqIGFzIGNvbG9ycyBmcm9tICdjb2xvcmV0dGUnXG5cbmltcG9ydCB0eXBlIHsgQnVpbGRPcHRpb25zIGFzIFJhd0J1aWxkT3B0aW9ucyB9IGZyb20gJy4uL2RlZi9idWlsZC5qcydcbmltcG9ydCB7XG4gIENMSV9WRVJTSU9OLFxuICBjb3B5RmlsZUFzeW5jLFxuICB0eXBlIENyYXRlLFxuICBkZWJ1Z0ZhY3RvcnksXG4gIERFRkFVTFRfVFlQRV9ERUZfSEVBREVSLFxuICBmaWxlRXhpc3RzLFxuICBnZXRTeXN0ZW1EZWZhdWx0VGFyZ2V0LFxuICBnZXRUYXJnZXRMaW5rZXIsXG4gIG1rZGlyQXN5bmMsXG4gIHR5cGUgTmFwaUNvbmZpZyxcbiAgcGFyc2VNZXRhZGF0YSxcbiAgcGFyc2VUcmlwbGUsXG4gIHByb2Nlc3NUeXBlRGVmLFxuICByZWFkRmlsZUFzeW5jLFxuICByZWFkTmFwaUNvbmZpZyxcbiAgdHlwZSBUYXJnZXQsXG4gIHRhcmdldFRvRW52VmFyLFxuICB0cnlJbnN0YWxsQ2FyZ29CaW5hcnksXG4gIHVubGlua0FzeW5jLFxuICB3cml0ZUZpbGVBc3luYyxcbiAgZGlyRXhpc3RzQXN5bmMsXG4gIHJlYWRkaXJBc3luYyxcbiAgdHlwZSBDYXJnb1dvcmtzcGFjZU1ldGFkYXRhLFxufSBmcm9tICcuLi91dGlscy9pbmRleC5qcydcblxuaW1wb3J0IHsgY3JlYXRlQ2pzQmluZGluZywgY3JlYXRlRXNtQmluZGluZyB9IGZyb20gJy4vdGVtcGxhdGVzL2luZGV4LmpzJ1xuaW1wb3J0IHtcbiAgY3JlYXRlV2FzaUJpbmRpbmcsXG4gIGNyZWF0ZVdhc2lCcm93c2VyQmluZGluZyxcbn0gZnJvbSAnLi90ZW1wbGF0ZXMvbG9hZC13YXNpLXRlbXBsYXRlLmpzJ1xuaW1wb3J0IHtcbiAgY3JlYXRlV2FzaUJyb3dzZXJXb3JrZXJCaW5kaW5nLFxuICBXQVNJX1dPUktFUl9URU1QTEFURSxcbn0gZnJvbSAnLi90ZW1wbGF0ZXMvd2FzaS13b3JrZXItdGVtcGxhdGUuanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCdidWlsZCcpXG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG5cbnR5cGUgT3V0cHV0S2luZCA9ICdqcycgfCAnZHRzJyB8ICdub2RlJyB8ICdleGUnIHwgJ3dhc20nXG50eXBlIE91dHB1dCA9IHsga2luZDogT3V0cHV0S2luZDsgcGF0aDogc3RyaW5nIH1cblxudHlwZSBCdWlsZE9wdGlvbnMgPSBSYXdCdWlsZE9wdGlvbnMgJiB7IGNhcmdvT3B0aW9ucz86IHN0cmluZ1tdIH1cbnR5cGUgUGFyc2VkQnVpbGRPcHRpb25zID0gT21pdDxCdWlsZE9wdGlvbnMsICdjd2QnPiAmIHsgY3dkOiBzdHJpbmcgfVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRQcm9qZWN0KHJhd09wdGlvbnM6IEJ1aWxkT3B0aW9ucykge1xuICBkZWJ1ZygnbmFwaSBidWlsZCBjb21tYW5kIHJlY2VpdmUgb3B0aW9uczogJU8nLCByYXdPcHRpb25zKVxuXG4gIGNvbnN0IG9wdGlvbnM6IFBhcnNlZEJ1aWxkT3B0aW9ucyA9IHtcbiAgICBkdHNDYWNoZTogdHJ1ZSxcbiAgICAuLi5yYXdPcHRpb25zLFxuICAgIGN3ZDogcmF3T3B0aW9ucy5jd2QgPz8gcHJvY2Vzcy5jd2QoKSxcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVQYXRoID0gKC4uLnBhdGhzOiBzdHJpbmdbXSkgPT4gcmVzb2x2ZShvcHRpb25zLmN3ZCwgLi4ucGF0aHMpXG5cbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcmVzb2x2ZVBhdGgob3B0aW9ucy5tYW5pZmVzdFBhdGggPz8gJ0NhcmdvLnRvbWwnKVxuICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHBhcnNlTWV0YWRhdGEobWFuaWZlc3RQYXRoKVxuXG4gIGNvbnN0IGNyYXRlID0gbWV0YWRhdGEucGFja2FnZXMuZmluZCgocCkgPT4ge1xuICAgIC8vIHBhY2thZ2Ugd2l0aCBnaXZlbiBuYW1lXG4gICAgaWYgKG9wdGlvbnMucGFja2FnZSkge1xuICAgICAgcmV0dXJuIHAubmFtZSA9PT0gb3B0aW9ucy5wYWNrYWdlXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwLm1hbmlmZXN0X3BhdGggPT09IG1hbmlmZXN0UGF0aFxuICAgIH1cbiAgfSlcblxuICBpZiAoIWNyYXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1VuYWJsZSB0byBmaW5kIGNyYXRlIHRvIGJ1aWxkLiBJdCBzZWVtcyB5b3UgYXJlIHRyeWluZyB0byBidWlsZCBhIGNyYXRlIGluIGEgd29ya3NwYWNlLCB0cnkgdXNpbmcgYC0tcGFja2FnZWAgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIHBhY2thZ2UgdG8gYnVpbGQuJyxcbiAgICApXG4gIH1cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVhZE5hcGlDb25maWcoXG4gICAgcmVzb2x2ZVBhdGgob3B0aW9ucy5wYWNrYWdlSnNvblBhdGggPz8gJ3BhY2thZ2UuanNvbicpLFxuICAgIG9wdGlvbnMuY29uZmlnUGF0aCA/IHJlc29sdmVQYXRoKG9wdGlvbnMuY29uZmlnUGF0aCkgOiB1bmRlZmluZWQsXG4gIClcblxuICBjb25zdCBidWlsZGVyID0gbmV3IEJ1aWxkZXIobWV0YWRhdGEsIGNyYXRlLCBjb25maWcsIG9wdGlvbnMpXG5cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKVxufVxuXG5jbGFzcyBCdWlsZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmdzOiBzdHJpbmdbXSA9IFtdXG4gIHByaXZhdGUgcmVhZG9ubHkgZW52czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0czogT3V0cHV0W10gPSBbXVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0OiBUYXJnZXRcbiAgcHJpdmF0ZSByZWFkb25seSBjcmF0ZURpcjogc3RyaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0RGlyOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSB0YXJnZXREaXI6IHN0cmluZ1xuICBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZVR5cGVEZWY6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGE6IENhcmdvV29ya3NwYWNlTWV0YWRhdGEsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjcmF0ZTogQ3JhdGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE5hcGlDb25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBQYXJzZWRCdWlsZE9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMudGFyZ2V0ID0gb3B0aW9ucy50YXJnZXRcbiAgICAgID8gcGFyc2VUcmlwbGUob3B0aW9ucy50YXJnZXQpXG4gICAgICA6IHByb2Nlc3MuZW52LkNBUkdPX0JVSUxEX1RBUkdFVFxuICAgICAgICA/IHBhcnNlVHJpcGxlKHByb2Nlc3MuZW52LkNBUkdPX0JVSUxEX1RBUkdFVClcbiAgICAgICAgOiBnZXRTeXN0ZW1EZWZhdWx0VGFyZ2V0KClcbiAgICB0aGlzLmNyYXRlRGlyID0gcGFyc2UoY3JhdGUubWFuaWZlc3RfcGF0aCkuZGlyXG4gICAgdGhpcy5vdXRwdXREaXIgPSByZXNvbHZlKFxuICAgICAgdGhpcy5vcHRpb25zLmN3ZCxcbiAgICAgIG9wdGlvbnMub3V0cHV0RGlyID8/IHRoaXMuY3JhdGVEaXIsXG4gICAgKVxuICAgIHRoaXMudGFyZ2V0RGlyID1cbiAgICAgIG9wdGlvbnMudGFyZ2V0RGlyID8/XG4gICAgICBwcm9jZXNzLmVudi5DQVJHT19CVUlMRF9UQVJHRVRfRElSID8/XG4gICAgICBtZXRhZGF0YS50YXJnZXRfZGlyZWN0b3J5XG4gICAgdGhpcy5lbmFibGVUeXBlRGVmID0gdGhpcy5jcmF0ZS5kZXBlbmRlbmNpZXMuc29tZShcbiAgICAgIChkZXApID0+XG4gICAgICAgIGRlcC5uYW1lID09PSAnbmFwaS1kZXJpdmUnICYmXG4gICAgICAgIChkZXAudXNlc19kZWZhdWx0X2ZlYXR1cmVzIHx8IGRlcC5mZWF0dXJlcy5pbmNsdWRlcygndHlwZS1kZWYnKSksXG4gICAgKVxuXG4gICAgaWYgKCF0aGlzLmVuYWJsZVR5cGVEZWYpIHtcbiAgICAgIGNvbnN0IHJlcXVpcmVtZW50V2FybmluZyA9XG4gICAgICAgICdgbmFwaS1kZXJpdmVgIGNyYXRlIGlzIG5vdCB1c2VkIG9yIGB0eXBlLWRlZmAgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCBmb3IgYG5hcGktZGVyaXZlYCBjcmF0ZSdcbiAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgIGAke3JlcXVpcmVtZW50V2FybmluZ30uIFdpbGwgc2tpcCBiaW5kaW5nIGdlbmVyYXRpb24gZm9yIFxcYC5ub2RlXFxgLCBcXGAud2FzaVxcYCBhbmQgXFxgLmQudHNcXGAgZmlsZXMuYCxcbiAgICAgIClcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm9wdGlvbnMuZHRzIHx8XG4gICAgICAgIHRoaXMub3B0aW9ucy5kdHNIZWFkZXIgfHxcbiAgICAgICAgdGhpcy5jb25maWcuZHRzSGVhZGVyIHx8XG4gICAgICAgIHRoaXMuY29uZmlnLmR0c0hlYWRlckZpbGVcbiAgICAgICkge1xuICAgICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAgIGAke3JlcXVpcmVtZW50V2FybmluZ30uIFxcYGR0c1xcYCByZWxhdGVkIG9wdGlvbnMgYXJlIGVuYWJsZWQgYnV0IHdpbGwgYmUgaWdub3JlZC5gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNkeUxpYk5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JhdGUudGFyZ2V0cy5maW5kKCh0KSA9PiB0LmNyYXRlX3R5cGVzLmluY2x1ZGVzKCdjZHlsaWInKSlcbiAgICAgID8ubmFtZVxuICB9XG5cbiAgZ2V0IGJpbk5hbWUoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMub3B0aW9ucy5iaW4gPz9cbiAgICAgIC8vIG9ubHkgYXZhaWxhYmxlIGlmIG5vdCBjZHlsaWIgb3IgYmluIG5hbWUgc3BlY2lmaWVkXG4gICAgICAodGhpcy5jZHlMaWJOYW1lXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMuY3JhdGUudGFyZ2V0cy5maW5kKCh0KSA9PiB0LmNyYXRlX3R5cGVzLmluY2x1ZGVzKCdiaW4nKSk/Lm5hbWUpXG4gICAgKVxuICB9XG5cbiAgYnVpbGQoKSB7XG4gICAgaWYgKCF0aGlzLmNkeUxpYk5hbWUpIHtcbiAgICAgIGNvbnN0IHdhcm5pbmcgPVxuICAgICAgICAnTWlzc2luZyBgY3JhdGUtdHlwZSA9IFtcImNkeWxpYlwiXWAgaW4gW2xpYl0gY29uZmlnLiBUaGUgYnVpbGQgcmVzdWx0IHdpbGwgbm90IGJlIGF2YWlsYWJsZSBhcyBub2RlIGFkZG9uLidcblxuICAgICAgaWYgKHRoaXMuYmluTmFtZSkge1xuICAgICAgICBkZWJ1Zy53YXJuKHdhcm5pbmcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3Iod2FybmluZylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5waWNrQmluYXJ5KClcbiAgICAgIC5zZXRQYWNrYWdlKClcbiAgICAgIC5zZXRGZWF0dXJlcygpXG4gICAgICAuc2V0VGFyZ2V0KClcbiAgICAgIC5waWNrQ3Jvc3NUb29sY2hhaW4oKVxuICAgICAgLnNldEVudnMoKVxuICAgICAgLnNldEJ5cGFzc0FyZ3MoKVxuICAgICAgLmV4ZWMoKVxuICB9XG5cbiAgcHJpdmF0ZSBwaWNrQ3Jvc3NUb29sY2hhaW4oKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMudXNlTmFwaUNyb3NzKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZUNyb3NzKSB7XG4gICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAnWW91IGFyZSB0cnlpbmcgdG8gdXNlIGJvdGggYC0tY3Jvc3NgIGFuZCBgLS11c2UtbmFwaS1jcm9zc2Agb3B0aW9ucywgYC0tdXNlLWNyb3NzYCB3aWxsIGJlIGlnbm9yZWQuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNyb3NzQ29tcGlsZSkge1xuICAgICAgZGVidWcud2FybihcbiAgICAgICAgJ1lvdSBhcmUgdHJ5aW5nIHRvIHVzZSBib3RoIGAtLWNyb3NzLWNvbXBpbGVgIGFuZCBgLS11c2UtbmFwaS1jcm9zc2Agb3B0aW9ucywgYC0tY3Jvc3MtY29tcGlsZWAgd2lsbCBiZSBpZ25vcmVkLicsXG4gICAgICApXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdmVyc2lvbiwgZG93bmxvYWQgfSA9IHJlcXVpcmUoJ0BuYXBpLXJzL2Nyb3NzLXRvb2xjaGFpbicpXG5cbiAgICAgIGNvbnN0IGFsaWFzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnczM5MHgtdW5rbm93bi1saW51eC1nbnUnOiAnczM5MHgtaWJtLWxpbnV4LWdudScsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvb2xjaGFpblBhdGggPSBqb2luKFxuICAgICAgICBob21lZGlyKCksXG4gICAgICAgICcubmFwaS1ycycsXG4gICAgICAgICdjcm9zcy10b29sY2hhaW4nLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICB0aGlzLnRhcmdldC50cmlwbGUsXG4gICAgICApXG4gICAgICBta2RpclN5bmModG9vbGNoYWluUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4odG9vbGNoYWluUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICBkZWJ1ZyhgVG9vbGNoYWluICR7dG9vbGNoYWluUGF0aH0gZXhpc3RzLCBza2lwIGV4dHJhY3RpbmdgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdGFyQXJjaGl2ZSA9IGRvd25sb2FkKHByb2Nlc3MuYXJjaCwgdGhpcy50YXJnZXQudHJpcGxlKVxuICAgICAgICB0YXJBcmNoaXZlLnVucGFjayh0b29sY2hhaW5QYXRoKVxuICAgICAgfVxuICAgICAgY29uc3QgdXBwZXJDYXNlVGFyZ2V0ID0gdGFyZ2V0VG9FbnZWYXIodGhpcy50YXJnZXQudHJpcGxlKVxuICAgICAgY29uc3QgY3Jvc3NUYXJnZXROYW1lID0gYWxpYXNbdGhpcy50YXJnZXQudHJpcGxlXSA/PyB0aGlzLnRhcmdldC50cmlwbGVcbiAgICAgIGNvbnN0IGxpbmtlckVudiA9IGBDQVJHT19UQVJHRVRfJHt1cHBlckNhc2VUYXJnZXR9X0xJTktFUmBcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgIGxpbmtlckVudixcbiAgICAgICAgam9pbih0b29sY2hhaW5QYXRoLCAnYmluJywgYCR7Y3Jvc3NUYXJnZXROYW1lfS1nY2NgKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfU1lTUk9PVCcsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgY3Jvc3NUYXJnZXROYW1lLCAnc3lzcm9vdCcpLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9BUicsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgJ2JpbicsIGAke2Nyb3NzVGFyZ2V0TmFtZX0tYXJgKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfUkFOTElCJyxcbiAgICAgICAgam9pbih0b29sY2hhaW5QYXRoLCAnYmluJywgYCR7Y3Jvc3NUYXJnZXROYW1lfS1yYW5saWJgKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfUkVBREVMRicsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgJ2JpbicsIGAke2Nyb3NzVGFyZ2V0TmFtZX0tcmVhZGVsZmApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9DX0lOQ0xVREVfUEFUSCcsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgY3Jvc3NUYXJnZXROYW1lLCAnc3lzcm9vdCcsICd1c3InLCAnaW5jbHVkZS8nKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfQ0MnLFxuICAgICAgICBqb2luKHRvb2xjaGFpblBhdGgsICdiaW4nLCBgJHtjcm9zc1RhcmdldE5hbWV9LWdjY2ApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9DWFgnLFxuICAgICAgICBqb2luKHRvb2xjaGFpblBhdGgsICdiaW4nLCBgJHtjcm9zc1RhcmdldE5hbWV9LWcrK2ApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ0JJTkRHRU5fRVhUUkFfQ0xBTkdfQVJHUycsXG4gICAgICAgIGAtLXN5c3Jvb3Q9JHt0aGlzLmVudnMuVEFSR0VUX1NZU1JPT1R9fWAsXG4gICAgICApXG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvY2Vzcy5lbnYuVEFSR0VUX0NDPy5zdGFydHNXaXRoKCdjbGFuZycpIHx8XG4gICAgICAgIChwcm9jZXNzLmVudi5DQz8uc3RhcnRzV2l0aCgnY2xhbmcnKSAmJiAhcHJvY2Vzcy5lbnYuVEFSR0VUX0NDKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFRBUkdFVF9DRkxBR1MgPSBwcm9jZXNzLmVudi5UQVJHRVRfQ0ZMQUdTID8/ICcnXG4gICAgICAgIHRoaXMuZW52cy5UQVJHRVRfQ0ZMQUdTID0gYC0tc3lzcm9vdD0ke3RoaXMuZW52cy5UQVJHRVRfU1lTUk9PVH0gLS1nY2MtdG9vbGNoYWluPSR7dG9vbGNoYWluUGF0aH0gJHtUQVJHRVRfQ0ZMQUdTfWBcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgKHByb2Nlc3MuZW52LkNYWD8uc3RhcnRzV2l0aCgnY2xhbmcrKycpICYmICFwcm9jZXNzLmVudi5UQVJHRVRfQ1hYKSB8fFxuICAgICAgICBwcm9jZXNzLmVudi5UQVJHRVRfQ1hYPy5zdGFydHNXaXRoKCdjbGFuZysrJylcbiAgICAgICkge1xuICAgICAgICBjb25zdCBUQVJHRVRfQ1hYRkxBR1MgPSBwcm9jZXNzLmVudi5UQVJHRVRfQ1hYRkxBR1MgPz8gJydcbiAgICAgICAgdGhpcy5lbnZzLlRBUkdFVF9DWFhGTEFHUyA9IGAtLXN5c3Jvb3Q9JHt0aGlzLmVudnMuVEFSR0VUX1NZU1JPT1R9IC0tZ2NjLXRvb2xjaGFpbj0ke3Rvb2xjaGFpblBhdGh9ICR7VEFSR0VUX0NYWEZMQUdTfWBcbiAgICAgIH1cbiAgICAgIHRoaXMuZW52cy5QQVRIID0gdGhpcy5lbnZzLlBBVEhcbiAgICAgICAgPyBgJHt0b29sY2hhaW5QYXRofS9iaW46JHt0aGlzLmVudnMuUEFUSH06JHtwcm9jZXNzLmVudi5QQVRIfWBcbiAgICAgICAgOiBgJHt0b29sY2hhaW5QYXRofS9iaW46JHtwcm9jZXNzLmVudi5QQVRIfWBcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1Zy53YXJuKCdQaWNrIGNyb3NzIHRvb2xjaGFpbiBmYWlsZWQnLCBlIGFzIEVycm9yKVxuICAgICAgLy8gaWdub3JlLCBkbyBub3RoaW5nXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIGV4ZWMoKSB7XG4gICAgZGVidWcoYFN0YXJ0IGJ1aWxkaW5nIGNyYXRlOiAke3RoaXMuY3JhdGUubmFtZX1gKVxuICAgIGRlYnVnKCcgICVpJywgYGNhcmdvICR7dGhpcy5hcmdzLmpvaW4oJyAnKX1gKVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuXG4gICAgY29uc3Qgd2F0Y2ggPSB0aGlzLm9wdGlvbnMud2F0Y2hcbiAgICBjb25zdCBidWlsZFRhc2sgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVzZUNyb3NzICYmIHRoaXMub3B0aW9ucy5jcm9zc0NvbXBpbGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdgLS11c2UtY3Jvc3NgIGFuZCBgLS1jcm9zcy1jb21waWxlYCBjYW4gbm90IGJlIHVzZWQgdG9nZXRoZXInLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb21tYW5kID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuQ0FSR08gPz8gKHRoaXMub3B0aW9ucy51c2VDcm9zcyA/ICdjcm9zcycgOiAnY2FyZ28nKVxuICAgICAgY29uc3QgYnVpbGRQcm9jZXNzID0gc3Bhd24oY29tbWFuZCwgdGhpcy5hcmdzLCB7XG4gICAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4udGhpcy5lbnZzIH0sXG4gICAgICAgIHN0ZGlvOiB3YXRjaCA/IFsnaW5oZXJpdCcsICdpbmhlcml0JywgJ3BpcGUnXSA6ICdpbmhlcml0JyxcbiAgICAgICAgY3dkOiB0aGlzLm9wdGlvbnMuY3dkLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSlcblxuICAgICAgYnVpbGRQcm9jZXNzLm9uY2UoJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICAgIGRlYnVnKCclaScsIGBCdWlsZCBjcmF0ZSAke3RoaXMuY3JhdGUubmFtZX0gc3VjY2Vzc2Z1bGx5IWApXG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQnVpbGQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7Y29kZX1gKSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgYnVpbGRQcm9jZXNzLm9uY2UoJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQnVpbGQgZmFpbGVkIHdpdGggZXJyb3I6ICR7ZS5tZXNzYWdlfWAsIHsgY2F1c2U6IGUgfSkpXG4gICAgICB9KVxuXG4gICAgICAvLyB3YXRjaCBtb2RlIG9ubHksIHRoZXkgYXJlIHBpcGVkIHRocm91Z2ggc3RkZXJyXG4gICAgICBidWlsZFByb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKVxuICAgICAgICBjb25zb2xlLmVycm9yKG91dHB1dClcbiAgICAgICAgaWYgKC9GaW5pc2hlZFxccyhgZGV2YHxgcmVsZWFzZWApLy50ZXN0KG91dHB1dCkpIHtcbiAgICAgICAgICB0aGlzLnBvc3RCdWlsZCgpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFzazogYnVpbGRUYXNrLnRoZW4oKCkgPT4gdGhpcy5wb3N0QnVpbGQoKSksXG4gICAgICBhYm9ydDogKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGlja0JpbmFyeSgpIHtcbiAgICBsZXQgc2V0ID0gZmFsc2VcbiAgICBpZiAodGhpcy5vcHRpb25zLndhdGNoKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgICAgZGVidWcud2FybignV2F0Y2ggbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGluIENJIGVudmlyb25tZW50JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnKCdVc2UgJWknLCAnY2FyZ28td2F0Y2gnKVxuICAgICAgICB0cnlJbnN0YWxsQ2FyZ29CaW5hcnkoJ2NhcmdvLXdhdGNoJywgJ3dhdGNoJylcbiAgICAgICAgLy8geWFybiBuYXBpIHdhdGNoIC0tdGFyZ2V0IHg4Nl82NC11bmtub3duLWxpbnV4LWdudSBbLS1jcm9zcy1jb21waWxlXVxuICAgICAgICAvLyA9PT0+XG4gICAgICAgIC8vIGNhcmdvIHdhdGNoIFsuLi5dIC0tIGJ1aWxkIC0tdGFyZ2V0IHg4Nl82NC11bmtub3duLWxpbnV4LWdudVxuICAgICAgICAvLyBjYXJnbyB3YXRjaCBbLi4uXSAtLSB6aWdidWlsZCAtLXRhcmdldCB4ODZfNjQtdW5rbm93bi1saW51eC1nbnVcbiAgICAgICAgdGhpcy5hcmdzLnB1c2goXG4gICAgICAgICAgJ3dhdGNoJyxcbiAgICAgICAgICAnLS13aHknLFxuICAgICAgICAgICctaScsXG4gICAgICAgICAgJyoue2pzLHRzLG5vZGV9JyxcbiAgICAgICAgICAnLXcnLFxuICAgICAgICAgIHRoaXMuY3JhdGVEaXIsXG4gICAgICAgICAgJy0tJyxcbiAgICAgICAgICAnY2FyZ28nLFxuICAgICAgICAgICdidWlsZCcsXG4gICAgICAgIClcbiAgICAgICAgc2V0ID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3Jvc3NDb21waWxlKSB7XG4gICAgICBpZiAodGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAgICAgJ1lvdSBhcmUgdHJ5aW5nIHRvIGNyb3NzIGNvbXBpbGUgdG8gd2luMzIgcGxhdGZvcm0gb24gd2luMzIgcGxhdGZvcm0gd2hpY2ggaXMgdW5uZWNlc3NhcnkuJyxcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXNlIGNhcmdvLXh3aW4gdG8gY3Jvc3MgY29tcGlsZSB0byB3aW4zMiBwbGF0Zm9ybVxuICAgICAgICAgIGRlYnVnKCdVc2UgJWknLCAnY2FyZ28teHdpbicpXG4gICAgICAgICAgdHJ5SW5zdGFsbENhcmdvQmluYXJ5KCdjYXJnby14d2luJywgJ3h3aW4nKVxuICAgICAgICAgIHRoaXMuYXJncy5wdXNoKCd4d2luJywgJ2J1aWxkJylcbiAgICAgICAgICBpZiAodGhpcy50YXJnZXQuYXJjaCA9PT0gJ2lhMzInKSB7XG4gICAgICAgICAgICB0aGlzLmVudnMuWFdJTl9BUkNIID0gJ3g4NidcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0ID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1c2UgY2FyZ28temlnYnVpbGQgdG8gY3Jvc3MgY29tcGlsZSB0byBvdGhlciBwbGF0Zm9ybXNcbiAgICAgICAgZGVidWcoJ1VzZSAlaScsICdjYXJnby16aWdidWlsZCcpXG4gICAgICAgIHRyeUluc3RhbGxDYXJnb0JpbmFyeSgnY2FyZ28temlnYnVpbGQnLCAnemlnYnVpbGQnKVxuICAgICAgICB0aGlzLmFyZ3MucHVzaCgnemlnYnVpbGQnKVxuICAgICAgICBzZXQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzZXQpIHtcbiAgICAgIHRoaXMuYXJncy5wdXNoKCdidWlsZCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIHNldFBhY2thZ2UoKSB7XG4gICAgY29uc3QgYXJncyA9IFtdXG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBhY2thZ2UpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1wYWNrYWdlJywgdGhpcy5vcHRpb25zLnBhY2thZ2UpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmluTmFtZSkge1xuICAgICAgYXJncy5wdXNoKCctLWJpbicsIHRoaXMuYmluTmFtZSlcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGRlYnVnKCdTZXQgcGFja2FnZSBmbGFnczogJylcbiAgICAgIGRlYnVnKCcgICVPJywgYXJncylcbiAgICAgIHRoaXMuYXJncy5wdXNoKC4uLmFyZ3MpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHByaXZhdGUgc2V0VGFyZ2V0KCkge1xuICAgIGRlYnVnKCdTZXQgY29tcGlsaW5nIHRhcmdldCB0bzogJylcbiAgICBkZWJ1ZygnICAlaScsIHRoaXMudGFyZ2V0LnRyaXBsZSlcblxuICAgIHRoaXMuYXJncy5wdXNoKCctLXRhcmdldCcsIHRoaXMudGFyZ2V0LnRyaXBsZSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIHNldEVudnMoKSB7XG4gICAgLy8gVFlQRSBERUZcbiAgICBpZiAodGhpcy5lbmFibGVUeXBlRGVmKSB7XG4gICAgICB0aGlzLmVudnMuTkFQSV9UWVBFX0RFRl9UTVBfRk9MREVSID1cbiAgICAgICAgdGhpcy5nZW5lcmF0ZUludGVybWVkaWF0ZVR5cGVEZWZGb2xkZXIoKVxuICAgICAgdGhpcy5zZXRGb3JjZUJ1aWxkRW52cyh0aGlzLmVudnMuTkFQSV9UWVBFX0RFRl9UTVBfRk9MREVSKVxuICAgIH1cblxuICAgIC8vIFJVU1RGTEFHU1xuICAgIGxldCBydXN0ZmxhZ3MgPVxuICAgICAgcHJvY2Vzcy5lbnYuUlVTVEZMQUdTID8/IHByb2Nlc3MuZW52LkNBUkdPX0JVSUxEX1JVU1RGTEFHUyA/PyAnJ1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy50YXJnZXQuYWJpPy5pbmNsdWRlcygnbXVzbCcpICYmXG4gICAgICAhcnVzdGZsYWdzLmluY2x1ZGVzKCd0YXJnZXQtZmVhdHVyZT0tY3J0LXN0YXRpYycpXG4gICAgKSB7XG4gICAgICBydXN0ZmxhZ3MgKz0gJyAtQyB0YXJnZXQtZmVhdHVyZT0tY3J0LXN0YXRpYydcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnN0cmlwICYmICFydXN0ZmxhZ3MuaW5jbHVkZXMoJ2xpbmstYXJnPS1zJykpIHtcbiAgICAgIHJ1c3RmbGFncyArPSAnIC1DIGxpbmstYXJnPS1zJ1xuICAgIH1cblxuICAgIGlmIChydXN0ZmxhZ3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVudnMuUlVTVEZMQUdTID0gcnVzdGZsYWdzXG4gICAgfVxuICAgIC8vIEVORCBSVVNURkxBR1NcblxuICAgIC8vIExJTktFUlxuICAgIGNvbnN0IGxpbmtlciA9IHRoaXMub3B0aW9ucy5jcm9zc0NvbXBpbGVcbiAgICAgID8gdm9pZCAwXG4gICAgICA6IGdldFRhcmdldExpbmtlcih0aGlzLnRhcmdldC50cmlwbGUpXG4gICAgLy8gVE9ETzpcbiAgICAvLyAgIGRpcmVjdGx5IHNldCBDQVJHT19UQVJHRVRfPHRhcmdldD5fTElOS0VSIHdpbGwgY292ZXIgLmNhcmdvL2NvbmZpZy50b21sXG4gICAgLy8gICB3aWxsIGRldGVjdCBieSBjYXJnbyBjb25maWcgd2hlbiBpdCBiZWNvbWVzIHN0YWJsZVxuICAgIC8vICAgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NhcmdvL2lzc3Vlcy85MzAxXG4gICAgY29uc3QgbGlua2VyRW52ID0gYENBUkdPX1RBUkdFVF8ke3RhcmdldFRvRW52VmFyKFxuICAgICAgdGhpcy50YXJnZXQudHJpcGxlLFxuICAgICl9X0xJTktFUmBcbiAgICBpZiAobGlua2VyICYmICFwcm9jZXNzLmVudltsaW5rZXJFbnZdICYmICF0aGlzLmVudnNbbGlua2VyRW52XSkge1xuICAgICAgdGhpcy5lbnZzW2xpbmtlckVudl0gPSBsaW5rZXJcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICdhbmRyb2lkJykge1xuICAgICAgdGhpcy5zZXRBbmRyb2lkRW52KClcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICd3YXNpJykge1xuICAgICAgdGhpcy5zZXRXYXNpRW52KClcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICdvcGVuaGFybW9ueScpIHtcbiAgICAgIHRoaXMuc2V0T3Blbkhhcm1vbnlFbnYoKVxuICAgIH1cblxuICAgIGRlYnVnKCdTZXQgZW52czogJylcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLmVudnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgZGVidWcoJyAgJWknLCBgJHtrfT0ke3Z9YClcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHByaXZhdGUgc2V0Rm9yY2VCdWlsZEVudnModHlwZURlZlRtcEZvbGRlcjogc3RyaW5nKSB7XG4gICAgLy8gZHluYW1pY2FsbHkgY2hlY2sgYWxsIG5hcGktcnMgZGVwcyBhbmQgc2V0IGBOQVBJX0ZPUkNFX0JVSUxEX3t1cHBlcmNhc2Uoc25ha2VfY2FzZShuYW1lKSl9ID0gdGltZXN0YW1wYFxuICAgIHRoaXMubWV0YWRhdGEucGFja2FnZXMuZm9yRWFjaCgoY3JhdGUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgY3JhdGUuZGVwZW5kZW5jaWVzLnNvbWUoKGQpID0+IGQubmFtZSA9PT0gJ25hcGktZGVyaXZlJykgJiZcbiAgICAgICAgIWV4aXN0c1N5bmMoam9pbih0eXBlRGVmVG1wRm9sZGVyLCBjcmF0ZS5uYW1lKSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLmVudnNbXG4gICAgICAgICAgYE5BUElfRk9SQ0VfQlVJTERfJHtjcmF0ZS5uYW1lLnJlcGxhY2UoLy0vZywgJ18nKS50b1VwcGVyQ2FzZSgpfWBcbiAgICAgICAgXSA9IERhdGUubm93KCkudG9TdHJpbmcoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHNldEFuZHJvaWRFbnYoKSB7XG4gICAgY29uc3QgeyBBTkRST0lEX05ES19MQVRFU1RfSE9NRSB9ID0gcHJvY2Vzcy5lbnZcbiAgICBpZiAoIUFORFJPSURfTkRLX0xBVEVTVF9IT01FKSB7XG4gICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICBgJHtjb2xvcnMucmVkKFxuICAgICAgICAgICdBTkRST0lEX05ES19MQVRFU1RfSE9NRScsXG4gICAgICAgICl9IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG1pc3NpbmdgLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIHNraXAgY3Jvc3MgY29tcGlsZSBzZXR1cCBpZiBob3N0IGlzIGFuZHJvaWRcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRBcmNoID0gdGhpcy50YXJnZXQuYXJjaCA9PT0gJ2FybScgPyAnYXJtdjdhJyA6ICdhYXJjaDY0J1xuICAgIGNvbnN0IHRhcmdldFBsYXRmb3JtID1cbiAgICAgIHRoaXMudGFyZ2V0LmFyY2ggPT09ICdhcm0nID8gJ2FuZHJvaWRlYWJpMjQnIDogJ2FuZHJvaWQyNCdcbiAgICBjb25zdCBob3N0UGxhdGZvcm0gPVxuICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbidcbiAgICAgICAgPyAnZGFyd2luJ1xuICAgICAgICA6IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMidcbiAgICAgICAgICA/ICd3aW5kb3dzJ1xuICAgICAgICAgIDogJ2xpbnV4J1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5lbnZzLCB7XG4gICAgICBDQVJHT19UQVJHRVRfQUFSQ0g2NF9MSU5VWF9BTkRST0lEX0xJTktFUjogYCR7QU5EUk9JRF9OREtfTEFURVNUX0hPTUV9L3Rvb2xjaGFpbnMvbGx2bS9wcmVidWlsdC8ke2hvc3RQbGF0Zm9ybX0teDg2XzY0L2Jpbi8ke3RhcmdldEFyY2h9LWxpbnV4LWFuZHJvaWQyNC1jbGFuZ2AsXG4gICAgICBDQVJHT19UQVJHRVRfQVJNVjdfTElOVVhfQU5EUk9JREVBQklfTElOS0VSOiBgJHtBTkRST0lEX05ES19MQVRFU1RfSE9NRX0vdG9vbGNoYWlucy9sbHZtL3ByZWJ1aWx0LyR7aG9zdFBsYXRmb3JtfS14ODZfNjQvYmluLyR7dGFyZ2V0QXJjaH0tbGludXgtYW5kcm9pZGVhYmkyNC1jbGFuZ2AsXG4gICAgICBUQVJHRVRfQ0M6IGAke0FORFJPSURfTkRLX0xBVEVTVF9IT01FfS90b29sY2hhaW5zL2xsdm0vcHJlYnVpbHQvJHtob3N0UGxhdGZvcm19LXg4Nl82NC9iaW4vJHt0YXJnZXRBcmNofS1saW51eC0ke3RhcmdldFBsYXRmb3JtfS1jbGFuZ2AsXG4gICAgICBUQVJHRVRfQ1hYOiBgJHtBTkRST0lEX05ES19MQVRFU1RfSE9NRX0vdG9vbGNoYWlucy9sbHZtL3ByZWJ1aWx0LyR7aG9zdFBsYXRmb3JtfS14ODZfNjQvYmluLyR7dGFyZ2V0QXJjaH0tbGludXgtJHt0YXJnZXRQbGF0Zm9ybX0tY2xhbmcrK2AsXG4gICAgICBUQVJHRVRfQVI6IGAke0FORFJPSURfTkRLX0xBVEVTVF9IT01FfS90b29sY2hhaW5zL2xsdm0vcHJlYnVpbHQvJHtob3N0UGxhdGZvcm19LXg4Nl82NC9iaW4vbGx2bS1hcmAsXG4gICAgICBUQVJHRVRfUkFOTElCOiBgJHtBTkRST0lEX05ES19MQVRFU1RfSE9NRX0vdG9vbGNoYWlucy9sbHZtL3ByZWJ1aWx0LyR7aG9zdFBsYXRmb3JtfS14ODZfNjQvYmluL2xsdm0tcmFubGliYCxcbiAgICAgIEFORFJPSURfTkRLOiBBTkRST0lEX05ES19MQVRFU1RfSE9NRSxcbiAgICAgIFBBVEg6IGAke0FORFJPSURfTkRLX0xBVEVTVF9IT01FfS90b29sY2hhaW5zL2xsdm0vcHJlYnVpbHQvJHtob3N0UGxhdGZvcm19LXg4Nl82NC9iaW4ke3Byb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnOycgOiAnOid9JHtwcm9jZXNzLmVudi5QQVRIfWAsXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0V2FzaUVudigpIHtcbiAgICBjb25zdCBlbW5hcGkgPSBqb2luKFxuICAgICAgcmVxdWlyZS5yZXNvbHZlKCdlbW5hcGknKSxcbiAgICAgICcuLicsXG4gICAgICAnbGliJyxcbiAgICAgICd3YXNtMzItd2FzaXAxLXRocmVhZHMnLFxuICAgIClcbiAgICB0aGlzLmVudnMuRU1OQVBJX0xJTktfRElSID0gZW1uYXBpXG4gICAgY29uc3QgZW1uYXBpVmVyc2lvbiA9IHJlcXVpcmUoJ2VtbmFwaS9wYWNrYWdlLmpzb24nKS52ZXJzaW9uXG4gICAgY29uc3QgcHJvamVjdFJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGpvaW4odGhpcy5vcHRpb25zLmN3ZCwgJ3BhY2thZ2UuanNvbicpKVxuICAgIGNvbnN0IGVtbmFwaUNvcmVWZXJzaW9uID0gcHJvamVjdFJlcXVpcmUoJ0BlbW5hcGkvY29yZScpLnZlcnNpb25cbiAgICBjb25zdCBlbW5hcGlSdW50aW1lVmVyc2lvbiA9IHByb2plY3RSZXF1aXJlKCdAZW1uYXBpL3J1bnRpbWUnKS52ZXJzaW9uXG5cbiAgICBpZiAoXG4gICAgICBlbW5hcGlWZXJzaW9uICE9PSBlbW5hcGlDb3JlVmVyc2lvbiB8fFxuICAgICAgZW1uYXBpVmVyc2lvbiAhPT0gZW1uYXBpUnVudGltZVZlcnNpb25cbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGVtbmFwaSB2ZXJzaW9uIG1pc21hdGNoOiBlbW5hcGlAJHtlbW5hcGlWZXJzaW9ufSwgQGVtbmFwaS9jb3JlQCR7ZW1uYXBpQ29yZVZlcnNpb259LCBAZW1uYXBpL3J1bnRpbWVAJHtlbW5hcGlSdW50aW1lVmVyc2lvbn0uIFBsZWFzZSBlbnN1cmUgYWxsIGVtbmFwaSBwYWNrYWdlcyBhcmUgdGhlIHNhbWUgdmVyc2lvbi5gLFxuICAgICAgKVxuICAgIH1cbiAgICBjb25zdCB7IFdBU0lfU0RLX1BBVEggfSA9IHByb2Nlc3MuZW52XG5cbiAgICBpZiAoV0FTSV9TREtfUEFUSCAmJiBleGlzdHNTeW5jKFdBU0lfU0RLX1BBVEgpKSB7XG4gICAgICB0aGlzLmVudnMuQ0FSR09fVEFSR0VUX1dBU00zMl9XQVNJX1BSRVZJRVcxX1RIUkVBRFNfTElOS0VSID0gam9pbihcbiAgICAgICAgV0FTSV9TREtfUEFUSCxcbiAgICAgICAgJ2JpbicsXG4gICAgICAgICd3YXNtLWxkJyxcbiAgICAgIClcbiAgICAgIHRoaXMuZW52cy5DQVJHT19UQVJHRVRfV0FTTTMyX1dBU0lQMV9MSU5LRVIgPSBqb2luKFxuICAgICAgICBXQVNJX1NES19QQVRILFxuICAgICAgICAnYmluJyxcbiAgICAgICAgJ3dhc20tbGQnLFxuICAgICAgKVxuICAgICAgdGhpcy5lbnZzLkNBUkdPX1RBUkdFVF9XQVNNMzJfV0FTSVAxX1RIUkVBRFNfTElOS0VSID0gam9pbihcbiAgICAgICAgV0FTSV9TREtfUEFUSCxcbiAgICAgICAgJ2JpbicsXG4gICAgICAgICd3YXNtLWxkJyxcbiAgICAgIClcbiAgICAgIHRoaXMuZW52cy5DQVJHT19UQVJHRVRfV0FTTTMyX1dBU0lQMl9MSU5LRVIgPSBqb2luKFxuICAgICAgICBXQVNJX1NES19QQVRILFxuICAgICAgICAnYmluJyxcbiAgICAgICAgJ3dhc20tbGQnLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX0NDJywgam9pbihXQVNJX1NES19QQVRILCAnYmluJywgJ2NsYW5nJykpXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKFxuICAgICAgICAnVEFSR0VUX0NYWCcsXG4gICAgICAgIGpvaW4oV0FTSV9TREtfUEFUSCwgJ2JpbicsICdjbGFuZysrJyksXG4gICAgICApXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfQVInLCBqb2luKFdBU0lfU0RLX1BBVEgsICdiaW4nLCAnYXInKSlcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfUkFOTElCJyxcbiAgICAgICAgam9pbihXQVNJX1NES19QQVRILCAnYmluJywgJ3JhbmxpYicpLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9DRkxBR1MnLFxuICAgICAgICBgLS10YXJnZXQ9d2FzbTMyLXdhc2lwMS10aHJlYWRzIC0tc3lzcm9vdD0ke1dBU0lfU0RLX1BBVEh9L3NoYXJlL3dhc2ktc3lzcm9vdCAtcHRocmVhZCAtbWxsdm0gLXdhc20tZW5hYmxlLXNqbGpgLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9DWFhGTEFHUycsXG4gICAgICAgIGAtLXRhcmdldD13YXNtMzItd2FzaXAxLXRocmVhZHMgLS1zeXNyb290PSR7V0FTSV9TREtfUEFUSH0vc2hhcmUvd2FzaS1zeXNyb290IC1wdGhyZWFkIC1tbGx2bSAtd2FzbS1lbmFibGUtc2psamAsXG4gICAgICApXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKFxuICAgICAgICBgVEFSR0VUX0xERkxBR1NgLFxuICAgICAgICBgLWZ1c2UtbGQ9JHtXQVNJX1NES19QQVRIfS9iaW4vd2FzbS1sZCAtLXRhcmdldD13YXNtMzItd2FzaXAxLXRocmVhZHNgLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0T3Blbkhhcm1vbnlFbnYoKSB7XG4gICAgY29uc3QgeyBPSE9TX1NES19QQVRILCBPSE9TX1NES19OQVRJVkUgfSA9IHByb2Nlc3MuZW52XG4gICAgY29uc3QgbmRrUGF0aCA9IE9IT1NfU0RLX1BBVEggPyBgJHtPSE9TX1NES19QQVRIfS9uYXRpdmVgIDogT0hPU19TREtfTkFUSVZFXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGlmICghbmRrUGF0aCAmJiBwcm9jZXNzLnBsYXRmb3JtICE9PSAnb3Blbmhhcm1vbnknKSB7XG4gICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICBgJHtjb2xvcnMucmVkKCdPSE9TX1NES19QQVRIJyl9IG9yICR7Y29sb3JzLnJlZCgnT0hPU19TREtfTkFUSVZFJyl9IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG1pc3NpbmdgLFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGxpbmtlck5hbWUgPSBgQ0FSR09fVEFSR0VUXyR7dGhpcy50YXJnZXQudHJpcGxlLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpfV9MSU5LRVJgXG4gICAgY29uc3QgcmFuUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluL2xsdm0tcmFubGliYFxuICAgIGNvbnN0IGFyUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluL2xsdm0tYXJgXG4gICAgY29uc3QgY2NQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vJHt0aGlzLnRhcmdldC50cmlwbGV9LWNsYW5nYFxuICAgIGNvbnN0IGN4eFBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi8ke3RoaXMudGFyZ2V0LnRyaXBsZX0tY2xhbmcrK2BcbiAgICBjb25zdCBhc1BhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sbHZtLWFzYFxuICAgIGNvbnN0IGxkUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluL2xkLmxsZGBcbiAgICBjb25zdCBzdHJpcFBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sbHZtLXN0cmlwYFxuICAgIGNvbnN0IG9iakR1bXBQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vbGx2bS1vYmpkdW1wYFxuICAgIGNvbnN0IG9iakNvcHlQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vbGx2bS1vYmpjb3B5YFxuICAgIGNvbnN0IG5tUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluL2xsdm0tbm1gXG4gICAgY29uc3QgYmluUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluYFxuICAgIGNvbnN0IGxpYlBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2xpYmBcblxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ0xJQkNMQU5HX1BBVEgnLCBsaWJQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ0RFUF9BVE9NSUMnLCAnY2xhbmdfcnQuYnVpbHRpbnMnKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMobGlua2VyTmFtZSwgY2NQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9DQycsIGNjUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfQ1hYJywgY3h4UGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfQVInLCBhclBhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX1JBTkxJQicsIHJhblBhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX0FTJywgYXNQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9MRCcsIGxkUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfU1RSSVAnLCBzdHJpcFBhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX09CSkRVTVAnLCBvYmpEdW1wUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfT0JKQ09QWScsIG9iakNvcHlQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9OTScsIG5tUGF0aClcbiAgICB0aGlzLmVudnMuUEFUSCA9IGAke2JpblBhdGh9JHtwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJzsnIDogJzonfSR7cHJvY2Vzcy5lbnYuUEFUSH1gXG4gIH1cblxuICBwcml2YXRlIHNldEZlYXR1cmVzKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBbXVxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsRmVhdHVyZXMgJiYgdGhpcy5vcHRpb25zLm5vRGVmYXVsdEZlYXR1cmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3Qgc3BlY2lmeSAtLWFsbC1mZWF0dXJlcyBhbmQgLS1uby1kZWZhdWx0LWZlYXR1cmVzIHRvZ2V0aGVyJyxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hbGxGZWF0dXJlcykge1xuICAgICAgYXJncy5wdXNoKCctLWFsbC1mZWF0dXJlcycpXG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMubm9EZWZhdWx0RmVhdHVyZXMpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1uby1kZWZhdWx0LWZlYXR1cmVzJylcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mZWF0dXJlcykge1xuICAgICAgYXJncy5wdXNoKCctLWZlYXR1cmVzJywgLi4udGhpcy5vcHRpb25zLmZlYXR1cmVzKVxuICAgIH1cblxuICAgIGRlYnVnKCdTZXQgZmVhdHVyZXMgZmxhZ3M6ICcpXG4gICAgZGVidWcoJyAgJU8nLCBhcmdzKVxuICAgIHRoaXMuYXJncy5wdXNoKC4uLmFyZ3MpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRCeXBhc3NBcmdzKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMucmVsZWFzZSkge1xuICAgICAgdGhpcy5hcmdzLnB1c2goJy0tcmVsZWFzZScpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICB0aGlzLmFyZ3MucHVzaCgnLS12ZXJib3NlJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRhcmdldERpcikge1xuICAgICAgdGhpcy5hcmdzLnB1c2goJy0tdGFyZ2V0LWRpcicsIHRoaXMub3B0aW9ucy50YXJnZXREaXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcm9maWxlKSB7XG4gICAgICB0aGlzLmFyZ3MucHVzaCgnLS1wcm9maWxlJywgdGhpcy5vcHRpb25zLnByb2ZpbGUpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tYW5pZmVzdFBhdGgpIHtcbiAgICAgIHRoaXMuYXJncy5wdXNoKCctLW1hbmlmZXN0LXBhdGgnLCB0aGlzLm9wdGlvbnMubWFuaWZlc3RQYXRoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2FyZ29PcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYXJncy5wdXNoKC4uLnRoaXMub3B0aW9ucy5jYXJnb09wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVJbnRlcm1lZGlhdGVUeXBlRGVmRm9sZGVyKCkge1xuICAgIGxldCBmb2xkZXIgPSBqb2luKFxuICAgICAgdGhpcy50YXJnZXREaXIsXG4gICAgICAnbmFwaS1ycycsXG4gICAgICBgJHt0aGlzLmNyYXRlLm5hbWV9LSR7Y3JlYXRlSGFzaCgnc2hhMjU2JylcbiAgICAgICAgLnVwZGF0ZSh0aGlzLmNyYXRlLm1hbmlmZXN0X3BhdGgpXG4gICAgICAgIC51cGRhdGUoQ0xJX1ZFUlNJT04pXG4gICAgICAgIC5kaWdlc3QoJ2hleCcpXG4gICAgICAgIC5zdWJzdHJpbmcoMCwgOCl9YCxcbiAgICApXG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kdHNDYWNoZSkge1xuICAgICAgcm1TeW5jKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgICBmb2xkZXIgKz0gYF8ke0RhdGUubm93KCl9YFxuICAgIH1cblxuICAgIG1rZGlyQXN5bmMoZm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgcmV0dXJuIGZvbGRlclxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwb3N0QnVpbGQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRlYnVnKGBUcnkgdG8gY3JlYXRlIG91dHB1dCBkaXJlY3Rvcnk6YClcbiAgICAgIGRlYnVnKCcgICVpJywgdGhpcy5vdXRwdXREaXIpXG4gICAgICBhd2FpdCBta2RpckFzeW5jKHRoaXMub3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgZGVidWcoYE91dHB1dCBkaXJlY3RvcnkgY3JlYXRlZGApXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgJHt0aGlzLm91dHB1dERpcn1gLCB7XG4gICAgICAgIGNhdXNlOiBlLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCB3YXNtQmluYXJ5TmFtZSA9IGF3YWl0IHRoaXMuY29weUFydGlmYWN0KClcblxuICAgIC8vIG9ubHkgZm9yIGNkeWxpYlxuICAgIGlmICh0aGlzLmNkeUxpYk5hbWUpIHtcbiAgICAgIGNvbnN0IGlkZW50cyA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVUeXBlRGVmKClcbiAgICAgIGNvbnN0IGpzT3V0cHV0ID0gYXdhaXQgdGhpcy53cml0ZUpzQmluZGluZyhpZGVudHMpXG4gICAgICBjb25zdCB3YXNtQmluZGluZ3NPdXRwdXQgPSBhd2FpdCB0aGlzLndyaXRlV2FzaUJpbmRpbmcoXG4gICAgICAgIHdhc21CaW5hcnlOYW1lLFxuICAgICAgICBpZGVudHMsXG4gICAgICApXG4gICAgICBpZiAoanNPdXRwdXQpIHtcbiAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2goanNPdXRwdXQpXG4gICAgICB9XG4gICAgICBpZiAod2FzbUJpbmRpbmdzT3V0cHV0KSB7XG4gICAgICAgIHRoaXMub3V0cHV0cy5wdXNoKC4uLndhc21CaW5kaW5nc091dHB1dClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vdXRwdXRzXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvcHlBcnRpZmFjdCgpIHtcbiAgICBjb25zdCBbc3JjTmFtZSwgZGVzdE5hbWUsIHdhc21CaW5hcnlOYW1lXSA9IHRoaXMuZ2V0QXJ0aWZhY3ROYW1lcygpXG4gICAgaWYgKCFzcmNOYW1lIHx8ICFkZXN0TmFtZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcHJvZmlsZSA9XG4gICAgICB0aGlzLm9wdGlvbnMucHJvZmlsZSA/PyAodGhpcy5vcHRpb25zLnJlbGVhc2UgPyAncmVsZWFzZScgOiAnZGVidWcnKVxuICAgIGNvbnN0IHNyYyA9IGpvaW4odGhpcy50YXJnZXREaXIsIHRoaXMudGFyZ2V0LnRyaXBsZSwgcHJvZmlsZSwgc3JjTmFtZSlcbiAgICBkZWJ1ZyhgQ29weSBhcnRpZmFjdCBmcm9tOiBbJHtzcmN9XWApXG4gICAgY29uc3QgZGVzdCA9IGpvaW4odGhpcy5vdXRwdXREaXIsIGRlc3ROYW1lKVxuICAgIGNvbnN0IGlzV2FzbSA9IGRlc3QuZW5kc1dpdGgoJy53YXNtJylcblxuICAgIHRyeSB7XG4gICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhkZXN0KSkge1xuICAgICAgICBkZWJ1ZygnT2xkIGFydGlmYWN0IGZvdW5kLCByZW1vdmUgaXQgZmlyc3QnKVxuICAgICAgICBhd2FpdCB1bmxpbmtBc3luYyhkZXN0KVxuICAgICAgfVxuICAgICAgZGVidWcoJ0NvcHkgYXJ0aWZhY3QgdG86JylcbiAgICAgIGRlYnVnKCcgICVpJywgZGVzdClcbiAgICAgIGlmIChpc1dhc20pIHtcbiAgICAgICAgY29uc3QgeyBNb2R1bGVDb25maWcgfSA9IGF3YWl0IGltcG9ydCgnQG5hcGktcnMvd2FzbS10b29scycpXG4gICAgICAgIGRlYnVnKCdHZW5lcmF0ZSBkZWJ1ZyB3YXNtIG1vZHVsZScpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGVidWdXYXNtTW9kdWxlID0gbmV3IE1vZHVsZUNvbmZpZygpXG4gICAgICAgICAgICAuZ2VuZXJhdGVEd2FyZih0cnVlKVxuICAgICAgICAgICAgLmdlbmVyYXRlTmFtZVNlY3Rpb24odHJ1ZSlcbiAgICAgICAgICAgIC5nZW5lcmF0ZVByb2R1Y2Vyc1NlY3Rpb24odHJ1ZSlcbiAgICAgICAgICAgIC5wcmVzZXJ2ZUNvZGVUcmFuc2Zvcm0odHJ1ZSlcbiAgICAgICAgICAgIC5zdHJpY3RWYWxpZGF0ZShmYWxzZSlcbiAgICAgICAgICAgIC5wYXJzZShhd2FpdCByZWFkRmlsZUFzeW5jKHNyYykpXG4gICAgICAgICAgY29uc3QgZGVidWdXYXNtQmluYXJ5ID0gZGVidWdXYXNtTW9kdWxlLmVtaXRXYXNtKHRydWUpXG4gICAgICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICAgICAgICBkZXN0LnJlcGxhY2UoL1xcLndhc20kLywgJy5kZWJ1Zy53YXNtJyksXG4gICAgICAgICAgICBkZWJ1Z1dhc21CaW5hcnksXG4gICAgICAgICAgKVxuICAgICAgICAgIGRlYnVnKCdHZW5lcmF0ZSByZWxlYXNlIHdhc20gbW9kdWxlJylcbiAgICAgICAgICBjb25zdCByZWxlYXNlV2FzbU1vZHVsZSA9IG5ldyBNb2R1bGVDb25maWcoKVxuICAgICAgICAgICAgLmdlbmVyYXRlRHdhcmYoZmFsc2UpXG4gICAgICAgICAgICAuZ2VuZXJhdGVOYW1lU2VjdGlvbihmYWxzZSlcbiAgICAgICAgICAgIC5nZW5lcmF0ZVByb2R1Y2Vyc1NlY3Rpb24oZmFsc2UpXG4gICAgICAgICAgICAucHJlc2VydmVDb2RlVHJhbnNmb3JtKGZhbHNlKVxuICAgICAgICAgICAgLnN0cmljdFZhbGlkYXRlKGZhbHNlKVxuICAgICAgICAgICAgLm9ubHlTdGFibGVGZWF0dXJlcyhmYWxzZSlcbiAgICAgICAgICAgIC5wYXJzZShkZWJ1Z1dhc21CaW5hcnkpXG4gICAgICAgICAgY29uc3QgcmVsZWFzZVdhc21CaW5hcnkgPSByZWxlYXNlV2FzbU1vZHVsZS5lbWl0V2FzbShmYWxzZSlcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhkZXN0LCByZWxlYXNlV2FzbUJpbmFyeSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGdlbmVyYXRlIGRlYnVnIHdhc20gbW9kdWxlOiAkeyhlIGFzIGFueSkubWVzc2FnZSA/PyBlfWAsXG4gICAgICAgICAgKVxuICAgICAgICAgIGF3YWl0IGNvcHlGaWxlQXN5bmMoc3JjLCBkZXN0KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBjb3B5RmlsZUFzeW5jKHNyYywgZGVzdClcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0cHV0cy5wdXNoKHtcbiAgICAgICAga2luZDogZGVzdC5lbmRzV2l0aCgnLm5vZGUnKSA/ICdub2RlJyA6IGlzV2FzbSA/ICd3YXNtJyA6ICdleGUnLFxuICAgICAgICBwYXRoOiBkZXN0LFxuICAgICAgfSlcbiAgICAgIHJldHVybiB3YXNtQmluYXJ5TmFtZSA/IGpvaW4odGhpcy5vdXRwdXREaXIsIHdhc21CaW5hcnlOYW1lKSA6IG51bGxcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjb3B5IGFydGlmYWN0JywgeyBjYXVzZTogZSB9KVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXJ0aWZhY3ROYW1lcygpIHtcbiAgICBpZiAodGhpcy5jZHlMaWJOYW1lKSB7XG4gICAgICBjb25zdCBjZHlMaWIgPSB0aGlzLmNkeUxpYk5hbWUucmVwbGFjZSgvLS9nLCAnXycpXG4gICAgICBjb25zdCB3YXNpVGFyZ2V0ID0gdGhpcy5jb25maWcudGFyZ2V0cy5maW5kKCh0KSA9PiB0LnBsYXRmb3JtID09PSAnd2FzaScpXG5cbiAgICAgIGNvbnN0IHNyY05hbWUgPVxuICAgICAgICB0aGlzLnRhcmdldC5wbGF0Zm9ybSA9PT0gJ2RhcndpbidcbiAgICAgICAgICA/IGBsaWIke2NkeUxpYn0uZHlsaWJgXG4gICAgICAgICAgOiB0aGlzLnRhcmdldC5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICAgICAgICAgICAgPyBgJHtjZHlMaWJ9LmRsbGBcbiAgICAgICAgICAgIDogdGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICd3YXNpJyB8fCB0aGlzLnRhcmdldC5wbGF0Zm9ybSA9PT0gJ3dhc20nXG4gICAgICAgICAgICAgID8gYCR7Y2R5TGlifS53YXNtYFxuICAgICAgICAgICAgICA6IGBsaWIke2NkeUxpYn0uc29gXG5cbiAgICAgIGxldCBkZXN0TmFtZSA9IHRoaXMuY29uZmlnLmJpbmFyeU5hbWVcbiAgICAgIC8vIGFkZCBwbGF0Zm9ybSBzdWZmaXggdG8gYmluYXJ5IG5hbWVcbiAgICAgIC8vIGluZGV4Wy5saW51eC14NjQtZ251XS5ub2RlXG4gICAgICAvLyAgICAgICBeXl5eXl5eXl5eXl5eXlxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wbGF0Zm9ybSkge1xuICAgICAgICBkZXN0TmFtZSArPSBgLiR7dGhpcy50YXJnZXQucGxhdGZvcm1BcmNoQUJJfWBcbiAgICAgIH1cbiAgICAgIGlmIChzcmNOYW1lLmVuZHNXaXRoKCcud2FzbScpKSB7XG4gICAgICAgIGRlc3ROYW1lICs9ICcud2FzbSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc3ROYW1lICs9ICcubm9kZSdcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgc3JjTmFtZSxcbiAgICAgICAgZGVzdE5hbWUsXG4gICAgICAgIHdhc2lUYXJnZXRcbiAgICAgICAgICA/IGAke3RoaXMuY29uZmlnLmJpbmFyeU5hbWV9LiR7d2FzaVRhcmdldC5wbGF0Zm9ybUFyY2hBQkl9Lndhc21gXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgXVxuICAgIH0gZWxzZSBpZiAodGhpcy5iaW5OYW1lKSB7XG4gICAgICBjb25zdCBzcmNOYW1lID1cbiAgICAgICAgdGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICd3aW4zMicgPyBgJHt0aGlzLmJpbk5hbWV9LmV4ZWAgOiB0aGlzLmJpbk5hbWVcblxuICAgICAgcmV0dXJuIFtzcmNOYW1lLCBzcmNOYW1lXVxuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVR5cGVEZWYoKSB7XG4gICAgY29uc3QgdHlwZURlZkRpciA9IHRoaXMuZW52cy5OQVBJX1RZUEVfREVGX1RNUF9GT0xERVJcbiAgICBpZiAoIXRoaXMuZW5hYmxlVHlwZURlZikge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgY29uc3QgeyBleHBvcnRzLCBkdHMgfSA9IGF3YWl0IGdlbmVyYXRlVHlwZURlZih7XG4gICAgICB0eXBlRGVmRGlyLFxuICAgICAgbm9EdHNIZWFkZXI6IHRoaXMub3B0aW9ucy5ub0R0c0hlYWRlcixcbiAgICAgIGR0c0hlYWRlcjogdGhpcy5vcHRpb25zLmR0c0hlYWRlcixcbiAgICAgIGNvbmZpZ0R0c0hlYWRlcjogdGhpcy5jb25maWcuZHRzSGVhZGVyLFxuICAgICAgY29uZmlnRHRzSGVhZGVyRmlsZTogdGhpcy5jb25maWcuZHRzSGVhZGVyRmlsZSxcbiAgICAgIGNvbnN0RW51bTogdGhpcy5vcHRpb25zLmNvbnN0RW51bSA/PyB0aGlzLmNvbmZpZy5jb25zdEVudW0sXG4gICAgICBydW50aW1lU3RyaW5nRW51bTpcbiAgICAgICAgdGhpcy5vcHRpb25zLnJ1bnRpbWVTdHJpbmdFbnVtID8/IHRoaXMuY29uZmlnLnJ1bnRpbWVTdHJpbmdFbnVtLFxuICAgICAgY3dkOiB0aGlzLm9wdGlvbnMuY3dkLFxuICAgIH0pXG5cbiAgICBjb25zdCBkZXN0ID0gam9pbih0aGlzLm91dHB1dERpciwgdGhpcy5vcHRpb25zLmR0cyA/PyAnaW5kZXguZC50cycpXG5cbiAgICB0cnkge1xuICAgICAgZGVidWcoJ1dyaXRpbmcgdHlwZSBkZWYgdG86JylcbiAgICAgIGRlYnVnKCcgICVpJywgZGVzdClcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKGRlc3QsIGR0cywgJ3V0Zi04JylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1Zy5lcnJvcignRmFpbGVkIHRvIHdyaXRlIHR5cGUgZGVmIGZpbGUnKVxuICAgICAgZGVidWcuZXJyb3IoZSBhcyBFcnJvcilcbiAgICB9XG5cbiAgICBpZiAoZXhwb3J0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkZXN0ID0gam9pbih0aGlzLm91dHB1dERpciwgdGhpcy5vcHRpb25zLmR0cyA/PyAnaW5kZXguZC50cycpXG4gICAgICB0aGlzLm91dHB1dHMucHVzaCh7IGtpbmQ6ICdkdHMnLCBwYXRoOiBkZXN0IH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cG9ydHNcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVKc0JpbmRpbmcoaWRlbnRzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiB3cml0ZUpzQmluZGluZyh7XG4gICAgICBwbGF0Zm9ybTogdGhpcy5vcHRpb25zLnBsYXRmb3JtLFxuICAgICAgbm9Kc0JpbmRpbmc6IHRoaXMub3B0aW9ucy5ub0pzQmluZGluZyxcbiAgICAgIGlkZW50cyxcbiAgICAgIGpzQmluZGluZzogdGhpcy5vcHRpb25zLmpzQmluZGluZyxcbiAgICAgIGVzbTogdGhpcy5vcHRpb25zLmVzbSxcbiAgICAgIGJpbmFyeU5hbWU6IHRoaXMuY29uZmlnLmJpbmFyeU5hbWUsXG4gICAgICBwYWNrYWdlTmFtZTogdGhpcy5vcHRpb25zLmpzUGFja2FnZU5hbWUgPz8gdGhpcy5jb25maWcucGFja2FnZU5hbWUsXG4gICAgICB2ZXJzaW9uOiBwcm9jZXNzLmVudi5ucG1fbmV3X3ZlcnNpb24gPz8gdGhpcy5jb25maWcucGFja2FnZUpzb24udmVyc2lvbixcbiAgICAgIG91dHB1dERpcjogdGhpcy5vdXRwdXREaXIsXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVXYXNpQmluZGluZyhcbiAgICBkaXN0RmlsZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgaWRlbnRzOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgaWYgKGRpc3RGaWxlTmFtZSkge1xuICAgICAgY29uc3QgeyBuYW1lLCBkaXIgfSA9IHBhcnNlKGRpc3RGaWxlTmFtZSlcbiAgICAgIGNvbnN0IGJpbmRpbmdQYXRoID0gam9pbihkaXIsIGAke3RoaXMuY29uZmlnLmJpbmFyeU5hbWV9Lndhc2kuY2pzYClcbiAgICAgIGNvbnN0IGJyb3dzZXJCaW5kaW5nUGF0aCA9IGpvaW4oXG4gICAgICAgIGRpcixcbiAgICAgICAgYCR7dGhpcy5jb25maWcuYmluYXJ5TmFtZX0ud2FzaS1icm93c2VyLmpzYCxcbiAgICAgIClcbiAgICAgIGNvbnN0IHdvcmtlclBhdGggPSBqb2luKGRpciwgJ3dhc2ktd29ya2VyLm1qcycpXG4gICAgICBjb25zdCBicm93c2VyV29ya2VyUGF0aCA9IGpvaW4oZGlyLCAnd2FzaS13b3JrZXItYnJvd3Nlci5tanMnKVxuICAgICAgY29uc3QgYnJvd3NlckVudHJ5UGF0aCA9IGpvaW4oZGlyLCAnYnJvd3Nlci5qcycpXG4gICAgICBjb25zdCBleHBvcnRzQ29kZSA9XG4gICAgICAgIGBtb2R1bGUuZXhwb3J0cyA9IF9fbmFwaU1vZHVsZS5leHBvcnRzXFxuYCArXG4gICAgICAgIGlkZW50c1xuICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAoaWRlbnQpID0+XG4gICAgICAgICAgICAgIGBtb2R1bGUuZXhwb3J0cy4ke2lkZW50fSA9IF9fbmFwaU1vZHVsZS5leHBvcnRzLiR7aWRlbnR9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgICAgYmluZGluZ1BhdGgsXG4gICAgICAgIGNyZWF0ZVdhc2lCaW5kaW5nKFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdGhpcy5jb25maWcucGFja2FnZU5hbWUsXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8uaW5pdGlhbE1lbW9yeSxcbiAgICAgICAgICB0aGlzLmNvbmZpZy53YXNtPy5tYXhpbXVtTWVtb3J5LFxuICAgICAgICApICtcbiAgICAgICAgICBleHBvcnRzQ29kZSArXG4gICAgICAgICAgJ1xcbicsXG4gICAgICAgICd1dGY4JyxcbiAgICAgIClcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKFxuICAgICAgICBicm93c2VyQmluZGluZ1BhdGgsXG4gICAgICAgIGNyZWF0ZVdhc2lCcm93c2VyQmluZGluZyhcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHRoaXMuY29uZmlnLndhc20/LmluaXRpYWxNZW1vcnksXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8ubWF4aW11bU1lbW9yeSxcbiAgICAgICAgICB0aGlzLmNvbmZpZy53YXNtPy5icm93c2VyPy5mcyxcbiAgICAgICAgICB0aGlzLmNvbmZpZy53YXNtPy5icm93c2VyPy5hc3luY0luaXQsXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8uYnJvd3Nlcj8uYnVmZmVyLFxuICAgICAgICAgIHRoaXMuY29uZmlnLndhc20/LmJyb3dzZXI/LmVycm9yRXZlbnQsXG4gICAgICAgICkgK1xuICAgICAgICAgIGBleHBvcnQgZGVmYXVsdCBfX25hcGlNb2R1bGUuZXhwb3J0c1xcbmAgK1xuICAgICAgICAgIGlkZW50c1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgKGlkZW50KSA9PlxuICAgICAgICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtpZGVudH0gPSBfX25hcGlNb2R1bGUuZXhwb3J0cy4ke2lkZW50fWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignXFxuJykgK1xuICAgICAgICAgICdcXG4nLFxuICAgICAgICAndXRmOCcsXG4gICAgICApXG4gICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyh3b3JrZXJQYXRoLCBXQVNJX1dPUktFUl9URU1QTEFURSwgJ3V0ZjgnKVxuICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICAgIGJyb3dzZXJXb3JrZXJQYXRoLFxuICAgICAgICBjcmVhdGVXYXNpQnJvd3NlcldvcmtlckJpbmRpbmcoXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8uYnJvd3Nlcj8uZnMgPz8gZmFsc2UsXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8uYnJvd3Nlcj8uZXJyb3JFdmVudCA/PyBmYWxzZSxcbiAgICAgICAgKSxcbiAgICAgICAgJ3V0ZjgnLFxuICAgICAgKVxuICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICAgIGJyb3dzZXJFbnRyeVBhdGgsXG4gICAgICAgIGBleHBvcnQgKiBmcm9tICcke3RoaXMuY29uZmlnLnBhY2thZ2VOYW1lfS13YXNtMzItd2FzaSdcXG5gLFxuICAgICAgKVxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBraW5kOiAnanMnLCBwYXRoOiBiaW5kaW5nUGF0aCB9LFxuICAgICAgICB7IGtpbmQ6ICdqcycsIHBhdGg6IGJyb3dzZXJCaW5kaW5nUGF0aCB9LFxuICAgICAgICB7IGtpbmQ6ICdqcycsIHBhdGg6IHdvcmtlclBhdGggfSxcbiAgICAgICAgeyBraW5kOiAnanMnLCBwYXRoOiBicm93c2VyV29ya2VyUGF0aCB9LFxuICAgICAgICB7IGtpbmQ6ICdqcycsIHBhdGg6IGJyb3dzZXJFbnRyeVBhdGggfSxcbiAgICAgIF0gc2F0aXNmaWVzIE91dHB1dFtdXG4gICAgfVxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbnZJZk5vdEV4aXN0cyhlbnY6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGlmICghcHJvY2Vzcy5lbnZbZW52XSkge1xuICAgICAgdGhpcy5lbnZzW2Vudl0gPSB2YWx1ZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlSnNCaW5kaW5nT3B0aW9ucyB7XG4gIHBsYXRmb3JtPzogYm9vbGVhblxuICBub0pzQmluZGluZz86IGJvb2xlYW5cbiAgaWRlbnRzOiBzdHJpbmdbXVxuICBqc0JpbmRpbmc/OiBzdHJpbmdcbiAgZXNtPzogYm9vbGVhblxuICBiaW5hcnlOYW1lOiBzdHJpbmdcbiAgcGFja2FnZU5hbWU6IHN0cmluZ1xuICB2ZXJzaW9uOiBzdHJpbmdcbiAgb3V0cHV0RGlyOiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlSnNCaW5kaW5nKFxuICBvcHRpb25zOiBXcml0ZUpzQmluZGluZ09wdGlvbnMsXG4pOiBQcm9taXNlPE91dHB1dCB8IHVuZGVmaW5lZD4ge1xuICBpZiAoXG4gICAgIW9wdGlvbnMucGxhdGZvcm0gfHxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBvcHRpb25zLm5vSnNCaW5kaW5nIHx8XG4gICAgb3B0aW9ucy5pZGVudHMubGVuZ3RoID09PSAwXG4gICkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbmFtZSA9IG9wdGlvbnMuanNCaW5kaW5nID8/ICdpbmRleC5qcydcblxuICBjb25zdCBjcmVhdGVCaW5kaW5nID0gb3B0aW9ucy5lc20gPyBjcmVhdGVFc21CaW5kaW5nIDogY3JlYXRlQ2pzQmluZGluZ1xuICBjb25zdCBiaW5kaW5nID0gY3JlYXRlQmluZGluZyhcbiAgICBvcHRpb25zLmJpbmFyeU5hbWUsXG4gICAgb3B0aW9ucy5wYWNrYWdlTmFtZSxcbiAgICBvcHRpb25zLmlkZW50cyxcbiAgICAvLyBpbiBucG0gcHJldmVyc2lvbiBob29rXG4gICAgb3B0aW9ucy52ZXJzaW9uLFxuICApXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkZXN0ID0gam9pbihvcHRpb25zLm91dHB1dERpciwgbmFtZSlcbiAgICBkZWJ1ZygnV3JpdGluZyBqcyBiaW5kaW5nIHRvOicpXG4gICAgZGVidWcoJyAgJWknLCBkZXN0KVxuICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKGRlc3QsIGJpbmRpbmcsICd1dGYtOCcpXG4gICAgcmV0dXJuIHsga2luZDogJ2pzJywgcGF0aDogZGVzdCB9IHNhdGlzZmllcyBPdXRwdXRcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHdyaXRlIGpzIGJpbmRpbmcgZmlsZScsIHsgY2F1c2U6IGUgfSlcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlVHlwZURlZk9wdGlvbnMge1xuICB0eXBlRGVmRGlyOiBzdHJpbmdcbiAgbm9EdHNIZWFkZXI/OiBib29sZWFuXG4gIGR0c0hlYWRlcj86IHN0cmluZ1xuICBkdHNIZWFkZXJGaWxlPzogc3RyaW5nXG4gIGNvbmZpZ0R0c0hlYWRlcj86IHN0cmluZ1xuICBjb25maWdEdHNIZWFkZXJGaWxlPzogc3RyaW5nXG4gIGNvbnN0RW51bT86IGJvb2xlYW5cbiAgcnVudGltZVN0cmluZ0VudW0/OiBib29sZWFuXG4gIGN3ZDogc3RyaW5nXG59XG5cbi8qKlxuICogV2FsayB0aGUgbmFwaS1kZXJpdmUgaW50ZXJtZWRpYXRlIHR5cGUtZGVmIGRpcmVjdG9yeSwgcmVuZGVyIGV2ZXJ5IGVudHJ5XG4gKiBpbnRvIFR5cGVTY3JpcHQgdmlhIHtAbGluayBwcm9jZXNzVHlwZURlZn0sIGFuZCByZXR1cm4gdGhlIGNvbmNhdGVuYXRlZFxuICogYC5kLnRzYCBzb3VyY2UgcGx1cyB0aGUgbGlzdCBvZiBpZGVudGlmaWVycyB0byByZS1leHBvcnQgZnJvbVxuICogYGluZGV4LmpzYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHlwZURlZihcbiAgb3B0aW9uczogR2VuZXJhdGVUeXBlRGVmT3B0aW9ucyxcbik6IFByb21pc2U8eyBleHBvcnRzOiBzdHJpbmdbXTsgZHRzOiBzdHJpbmcgfT4ge1xuICBpZiAoIShhd2FpdCBkaXJFeGlzdHNBc3luYyhvcHRpb25zLnR5cGVEZWZEaXIpKSkge1xuICAgIHJldHVybiB7IGV4cG9ydHM6IFtdLCBkdHM6ICcnIH1cbiAgfVxuXG4gIGxldCBoZWFkZXIgPSAnJ1xuICBsZXQgZHRzID0gJydcbiAgbGV0IGV4cG9ydHM6IHN0cmluZ1tdID0gW11cblxuICBpZiAoIW9wdGlvbnMubm9EdHNIZWFkZXIpIHtcbiAgICBjb25zdCBkdHNIZWFkZXIgPSBvcHRpb25zLmR0c0hlYWRlciA/PyBvcHRpb25zLmNvbmZpZ0R0c0hlYWRlclxuICAgIC8vIGBkdHNIZWFkZXJGaWxlYCBpbiBjb25maWcgPiBgZHRzSGVhZGVyYCBpbiBjbGkgZmxhZyA+IGBkdHNIZWFkZXJgIGluIGNvbmZpZ1xuICAgIGlmIChvcHRpb25zLmNvbmZpZ0R0c0hlYWRlckZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhlYWRlciA9IGF3YWl0IHJlYWRGaWxlQXN5bmMoXG4gICAgICAgICAgam9pbihvcHRpb25zLmN3ZCwgb3B0aW9ucy5jb25maWdEdHNIZWFkZXJGaWxlKSxcbiAgICAgICAgICAndXRmLTgnLFxuICAgICAgICApXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgYEZhaWxlZCB0byByZWFkIGR0cyBoZWFkZXIgZmlsZSAke29wdGlvbnMuY29uZmlnRHRzSGVhZGVyRmlsZX1gLFxuICAgICAgICAgIGUsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGR0c0hlYWRlcikge1xuICAgICAgaGVhZGVyID0gZHRzSGVhZGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlciA9IERFRkFVTFRfVFlQRV9ERUZfSEVBREVSXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyQXN5bmMob3B0aW9ucy50eXBlRGVmRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcblxuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIGRlYnVnKCdObyB0eXBlIGRlZiBmaWxlcyBmb3VuZC4gU2tpcCBnZW5lcmF0aW5nIGR0cyBmaWxlLicpXG4gICAgcmV0dXJuIHsgZXhwb3J0czogW10sIGR0czogJycgfVxuICB9XG5cbiAgY29uc3QgdHlwZURlZkZpbGVzID0gZmlsZXNcbiAgICAuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmlzRmlsZSgpKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuXG4gIGNvbnN0IGNvbnN0RW51bSA9IG9wdGlvbnMuY29uc3RFbnVtID8/IHRydWVcbiAgY29uc3QgcnVudGltZVN0cmluZ0VudW0gPSBvcHRpb25zLnJ1bnRpbWVTdHJpbmdFbnVtID8/IGZhbHNlXG4gIGlmIChydW50aW1lU3RyaW5nRW51bSAmJiBjb25zdEVudW0pIHtcbiAgICBkZWJ1Zy53YXJuKFxuICAgICAgJ2AtLXJ1bnRpbWUtc3RyaW5nLWVudW1gIGhhcyBubyBlZmZlY3Qgd2hlbiBgLS1jb25zdC1lbnVtYCBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkuIFBhc3MgYC0tbm8tY29uc3QtZW51bWAgdG8gYWN0aXZhdGUgcnVudGltZSBzdHJpbmcgZW51bSBlbWlzc2lvbi4nLFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IHByb2Nlc3NlZFR5cGVEZWZzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgdHlwZURlZkZpbGVzLm1hcCgoZmlsZSkgPT5cbiAgICAgIHByb2Nlc3NUeXBlRGVmKFxuICAgICAgICBqb2luKG9wdGlvbnMudHlwZURlZkRpciwgZmlsZS5uYW1lKSxcbiAgICAgICAgY29uc3RFbnVtLFxuICAgICAgICBydW50aW1lU3RyaW5nRW51bSxcbiAgICAgICksXG4gICAgKSxcbiAgKVxuXG4gIGR0cyA9IHByb2Nlc3NlZFR5cGVEZWZzLm1hcCgoeyBkdHMgfSkgPT4gZHRzKS5qb2luKCcnKVxuICBleHBvcnRzID0gcHJvY2Vzc2VkVHlwZURlZnMuZmxhdE1hcCgoeyBleHBvcnRzIH0pID0+IGV4cG9ydHMpXG5cbiAgaWYgKGR0cy5pbmRleE9mKCdFeHRlcm5hbE9iamVjdDwnKSA+IC0xKSB7XG4gICAgaGVhZGVyICs9IGBcbmV4cG9ydCBkZWNsYXJlIGNsYXNzIEV4dGVybmFsT2JqZWN0PFQ+IHtcbiAgcmVhZG9ubHkgJyc6IHtcbiAgICByZWFkb25seSAnJzogdW5pcXVlIHN5bWJvbFxuICAgIFtLOiBzeW1ib2xdOiBUXG4gIH1cbn1cbmBcbiAgfVxuXG4gIGlmIChkdHMuaW5kZXhPZignVHlwZWRBcnJheScpID4gLTEpIHtcbiAgICBoZWFkZXIgKz0gYFxuZXhwb3J0IHR5cGUgVHlwZWRBcnJheSA9IEludDhBcnJheSB8IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSB8IEludDE2QXJyYXkgfCBVaW50MTZBcnJheSB8IEludDMyQXJyYXkgfCBVaW50MzJBcnJheSB8IEZsb2F0MzJBcnJheSB8IEZsb2F0NjRBcnJheSB8IEJpZ0ludDY0QXJyYXkgfCBCaWdVaW50NjRBcnJheVxuYFxuICB9XG5cbiAgZHRzID0gaGVhZGVyICsgZHRzXG5cbiAgcmV0dXJuIHtcbiAgICBleHBvcnRzLFxuICAgIGR0cyxcbiAgfVxufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBjb2RlZ2VuL2luZGV4LnRzXG4vLyBEbyBub3QgZWRpdCB0aGlzIGZpbGUgbWFudWFsbHlcbmltcG9ydCB7IENvbW1hbmQsIE9wdGlvbiB9IGZyb20gJ2NsaXBhbmlvbidcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VDcmVhdGVOcG1EaXJzQ29tbWFuZCBleHRlbmRzIENvbW1hbmQge1xuICBzdGF0aWMgcGF0aHMgPSBbWydjcmVhdGUtbnBtLWRpcnMnXV1cblxuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBucG0gcGFja2FnZSBkaXJzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zJyxcbiAgfSlcblxuICBjd2QgPSBPcHRpb24uU3RyaW5nKCctLWN3ZCcsIHByb2Nlc3MuY3dkKCksIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGgnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsICdwYWNrYWdlLmpzb24nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBwYWNrYWdlLmpzb25gJyxcbiAgfSlcblxuICBucG1EaXIgPSBPcHRpb24uU3RyaW5nKCctLW5wbS1kaXInLCAnbnBtJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0JyxcbiAgfSlcblxuICBkcnlSdW4gPSBPcHRpb24uQm9vbGVhbignLS1kcnktcnVuJywgZmFsc2UsIHtcbiAgICBkZXNjcmlwdGlvbjogJ0RyeSBydW4gd2l0aG91dCB0b3VjaGluZyBmaWxlIHN5c3RlbScsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgIGNvbmZpZ1BhdGg6IHRoaXMuY29uZmlnUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uUGF0aDogdGhpcy5wYWNrYWdlSnNvblBhdGgsXG4gICAgICBucG1EaXI6IHRoaXMubnBtRGlyLFxuICAgICAgZHJ5UnVuOiB0aGlzLmRyeVJ1bixcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgbnBtIHBhY2thZ2UgZGlycyBmb3IgZGlmZmVyZW50IHBsYXRmb3Jtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU5wbURpcnNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aFxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9jZXNzLmN3ZCgpXG4gICAqL1xuICBjd2Q/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGVcbiAgICovXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYHBhY2thZ2UuanNvbmBcbiAgICpcbiAgICogQGRlZmF1bHQgJ3BhY2thZ2UuanNvbidcbiAgICovXG4gIHBhY2thZ2VKc29uUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0XG4gICAqXG4gICAqIEBkZWZhdWx0ICducG0nXG4gICAqL1xuICBucG1EaXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIERyeSBydW4gd2l0aG91dCB0b3VjaGluZyBmaWxlIHN5c3RlbVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZHJ5UnVuPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlEZWZhdWx0Q3JlYXRlTnBtRGlyc09wdGlvbnMoXG4gIG9wdGlvbnM6IENyZWF0ZU5wbURpcnNPcHRpb25zLFxuKSB7XG4gIHJldHVybiB7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIHBhY2thZ2VKc29uUGF0aDogJ3BhY2thZ2UuanNvbicsXG4gICAgbnBtRGlyOiAnbnBtJyxcbiAgICBkcnlSdW46IGZhbHNlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSdcbmltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCB7IENvbXBhcmF0b3IsIFJhbmdlLCBtaW5WZXJzaW9uLCBzdWJzZXQgfSBmcm9tICdzZW12ZXInXG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcbmNvbnN0IG1pbmltdW1XYXNpTm9kZVZlcnNpb24gPSAnPj0xNC4wLjAnXG5cbmltcG9ydCB7XG4gIGFwcGx5RGVmYXVsdENyZWF0ZU5wbURpcnNPcHRpb25zLFxuICB0eXBlIENyZWF0ZU5wbURpcnNPcHRpb25zLFxufSBmcm9tICcuLi9kZWYvY3JlYXRlLW5wbS1kaXJzLmpzJ1xuaW1wb3J0IHtcbiAgZGVidWdGYWN0b3J5LFxuICByZWFkTmFwaUNvbmZpZyxcbiAgbWtkaXJBc3luYyBhcyByYXdNa2RpckFzeW5jLFxuICBwaWNrLFxuICB3cml0ZUZpbGVBc3luYyBhcyByYXdXcml0ZUZpbGVBc3luYyxcbiAgdHlwZSBUYXJnZXQsXG4gIHR5cGUgQ29tbW9uUGFja2FnZUpzb25GaWVsZHMsXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgnY3JlYXRlLW5wbS1kaXJzJylcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlTWV0YSB7XG4gICdkaXN0LXRhZ3MnOiB7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nIH1cbn1cblxuY29uc3QgV0FTTV9SVU5USU1FX1BBQ0tBR0VfTkFNRSA9ICdAbmFwaS1ycy93YXNtLXJ1bnRpbWUnXG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFdhc21SdW50aW1lVmVyc2lvbigpIHtcbiAgY29uc3QgbnBtUmVnaXN0cnlCYXNlID1cbiAgICBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3JlZ2lzdHJ5Py5yZXBsYWNlKC9cXC8/JC8sICcvJykgPz9cbiAgICAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJ1xuICBjb25zdCBwYWNrYWdlTWV0YWRhdGFVcmwgPSBgJHtucG1SZWdpc3RyeUJhc2V9JHtXQVNNX1JVTlRJTUVfUEFDS0FHRV9OQU1FfWBcbiAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZVxuXG4gIHRyeSB7XG4gICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChwYWNrYWdlTWV0YWRhdGFVcmwpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3BhY2thZ2VNZXRhZGF0YVVybH0gd2hpbGUgcmVzb2x2aW5nICR7V0FTTV9SVU5USU1FX1BBQ0tBR0VfTkFNRX0uIENoZWNrIHlvdXIgbmV0d29yayBjb25uZWN0aW9uIGFuZCBucG0gcmVnaXN0cnkgYXZhaWxhYmlsaXR5LmAsXG4gICAgICB7IGNhdXNlOiBlcnJvciB9LFxuICAgIClcbiAgfVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGZldGNoICR7cGFja2FnZU1ldGFkYXRhVXJsfSB3aGlsZSByZXNvbHZpbmcgJHtXQVNNX1JVTlRJTUVfUEFDS0FHRV9OQU1FfTogbnBtIHJlZ2lzdHJ5IHJlc3BvbmRlZCB3aXRoICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHQgfHwgJ1Vua25vd24gU3RhdHVzJ31gLFxuICAgIClcbiAgfVxuXG4gIGxldCBwYWNrYWdlTWV0YTogUGFja2FnZU1ldGFcblxuICB0cnkge1xuICAgIHBhY2thZ2VNZXRhID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgUGFja2FnZU1ldGFcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIHBhcnNlIG5wbSByZWdpc3RyeSBtZXRhZGF0YSBmb3IgJHtXQVNNX1JVTlRJTUVfUEFDS0FHRV9OQU1FfSBmcm9tICR7cGFja2FnZU1ldGFkYXRhVXJsfWAsXG4gICAgICB7IGNhdXNlOiBlcnJvciB9LFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBwYWNrYWdlTWV0YVsnZGlzdC10YWdzJ10/LmxhdGVzdFxuXG4gIGlmICh0eXBlb2YgbGF0ZXN0VmVyc2lvbiAhPT0gJ3N0cmluZycgfHwgbGF0ZXN0VmVyc2lvbi50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYG5wbSByZWdpc3RyeSBtZXRhZGF0YSBmb3IgJHtXQVNNX1JVTlRJTUVfUEFDS0FHRV9OQU1FfSBmcm9tICR7cGFja2FnZU1ldGFkYXRhVXJsfSBkaWQgbm90IGluY2x1ZGUgYSBsYXRlc3QgZGlzdC10YWdgLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsYXRlc3RWZXJzaW9uLnRyaW0oKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTnBtRGlycyh1c2VyT3B0aW9uczogQ3JlYXRlTnBtRGlyc09wdGlvbnMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGFwcGx5RGVmYXVsdENyZWF0ZU5wbURpcnNPcHRpb25zKHVzZXJPcHRpb25zKVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG1rZGlyQXN5bmMoZGlyOiBzdHJpbmcpIHtcbiAgICBkZWJ1ZygnVHJ5IHRvIGNyZWF0ZSBkaXI6ICVpJywgZGlyKVxuICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgcmF3TWtkaXJBc3luYyhkaXIsIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlQXN5bmMoZmlsZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpIHtcbiAgICBkZWJ1ZygnV3JpdGluZyBmaWxlICVpJywgZmlsZSlcblxuICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgZGVidWcoY29udGVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHJhd1dyaXRlRmlsZUFzeW5jKGZpbGUsIGNvbnRlbnQpXG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLnBhY2thZ2VKc29uUGF0aClcbiAgY29uc3QgbnBtUGF0aCA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMubnBtRGlyKVxuXG4gIGRlYnVnKGBSZWFkIGNvbnRlbnQgZnJvbSBbJHtvcHRpb25zLmNvbmZpZ1BhdGggPz8gcGFja2FnZUpzb25QYXRofV1gKVxuXG4gIGNvbnN0IHsgdGFyZ2V0cywgYmluYXJ5TmFtZSwgcGFja2FnZU5hbWUsIHBhY2thZ2VKc29uIH0gPVxuICAgIGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgICAgcGFja2FnZUpzb25QYXRoLFxuICAgICAgb3B0aW9ucy5jb25maWdQYXRoID8gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5jb25maWdQYXRoKSA6IHVuZGVmaW5lZCxcbiAgICApXG4gIGNvbnN0IHdhc21SdW50aW1lVmVyc2lvbiA9IHRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuYXJjaCA9PT0gJ3dhc20zMicpXG4gICAgPyBhd2FpdCBnZXRMYXRlc3RXYXNtUnVudGltZVZlcnNpb24oKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IHRhcmdldERpciA9IGpvaW4obnBtUGF0aCwgYCR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX1gKVxuICAgIGF3YWl0IG1rZGlyQXN5bmModGFyZ2V0RGlyKVxuXG4gICAgY29uc3QgYmluYXJ5RmlsZU5hbWUgPVxuICAgICAgdGFyZ2V0LmFyY2ggPT09ICd3YXNtMzInXG4gICAgICAgID8gYCR7YmluYXJ5TmFtZX0uJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfS53YXNtYFxuICAgICAgICA6IGAke2JpbmFyeU5hbWV9LiR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX0ubm9kZWBcbiAgICBjb25zdCBzY29wZWRQYWNrYWdlSnNvbjogQ29tbW9uUGFja2FnZUpzb25GaWVsZHMgPSB7XG4gICAgICBuYW1lOiBgJHtwYWNrYWdlTmFtZX0tJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfWAsXG4gICAgICB2ZXJzaW9uOiBwYWNrYWdlSnNvbi52ZXJzaW9uLFxuICAgICAgY3B1OiB0YXJnZXQuYXJjaCAhPT0gJ3VuaXZlcnNhbCcgPyBbdGFyZ2V0LmFyY2hdIDogdW5kZWZpbmVkLFxuICAgICAgbWFpbjogYmluYXJ5RmlsZU5hbWUsXG4gICAgICBmaWxlczogW2JpbmFyeUZpbGVOYW1lXSxcbiAgICAgIC4uLnBpY2soXG4gICAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAna2V5d29yZHMnLFxuICAgICAgICAnYXV0aG9yJyxcbiAgICAgICAgJ2F1dGhvcnMnLFxuICAgICAgICAnaG9tZXBhZ2UnLFxuICAgICAgICAnbGljZW5zZScsXG4gICAgICAgICdlbmdpbmVzJyxcbiAgICAgICAgJ3JlcG9zaXRvcnknLFxuICAgICAgICAnYnVncycsXG4gICAgICApLFxuICAgIH1cbiAgICBpZiAocGFja2FnZUpzb24ucHVibGlzaENvbmZpZykge1xuICAgICAgc2NvcGVkUGFja2FnZUpzb24ucHVibGlzaENvbmZpZyA9IHBpY2soXG4gICAgICAgIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWcsXG4gICAgICAgICdyZWdpc3RyeScsXG4gICAgICAgICdhY2Nlc3MnLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAodGFyZ2V0LmFyY2ggIT09ICd3YXNtMzInKSB7XG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5vcyA9IFt0YXJnZXQucGxhdGZvcm1dXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gYCR7YmluYXJ5TmFtZX0ud2FzaS5janNgXG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5tYWluID0gZW50cnlcbiAgICAgIHNjb3BlZFBhY2thZ2VKc29uLmJyb3dzZXIgPSBgJHtiaW5hcnlOYW1lfS53YXNpLWJyb3dzZXIuanNgXG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5maWxlcz8ucHVzaChcbiAgICAgICAgZW50cnksXG4gICAgICAgIHNjb3BlZFBhY2thZ2VKc29uLmJyb3dzZXIsXG4gICAgICAgIGB3YXNpLXdvcmtlci5tanNgLFxuICAgICAgICBgd2FzaS13b3JrZXItYnJvd3Nlci5tanNgLFxuICAgICAgKVxuICAgICAgc2NvcGVkUGFja2FnZUpzb24uZW5naW5lcyA9IHtcbiAgICAgICAgLi4uc2NvcGVkUGFja2FnZUpzb24uZW5naW5lcyxcbiAgICAgICAgbm9kZTogc2NvcGVkUGFja2FnZUpzb24uZW5naW5lcz8ubm9kZVxuICAgICAgICAgID8gcmVzdHJpY3RXYXNpTm9kZUVuZ2luZShzY29wZWRQYWNrYWdlSnNvbi5lbmdpbmVzLm5vZGUpXG4gICAgICAgICAgOiBtaW5pbXVtV2FzaU5vZGVWZXJzaW9uLFxuICAgICAgfVxuICAgICAgY29uc3QgZW1uYXBpVmVyc2lvbiA9IHJlcXVpcmUoJ2VtbmFwaS9wYWNrYWdlLmpzb24nKS52ZXJzaW9uXG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgICdAbmFwaS1ycy93YXNtLXJ1bnRpbWUnOiBgXiR7d2FzbVJ1bnRpbWVWZXJzaW9ufWAsXG4gICAgICAgICdAZW1uYXBpL2NvcmUnOiBlbW5hcGlWZXJzaW9uLFxuICAgICAgICAnQGVtbmFwaS9ydW50aW1lJzogZW1uYXBpVmVyc2lvbixcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0LmFiaSA9PT0gJ2dudScpIHtcbiAgICAgIHNjb3BlZFBhY2thZ2VKc29uLmxpYmMgPSBbJ2dsaWJjJ11cbiAgICB9IGVsc2UgaWYgKHRhcmdldC5hYmkgPT09ICdtdXNsJykge1xuICAgICAgc2NvcGVkUGFja2FnZUpzb24ubGliYyA9IFsnbXVzbCddXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0UGFja2FnZUpzb24gPSBqb2luKHRhcmdldERpciwgJ3BhY2thZ2UuanNvbicpXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICB0YXJnZXRQYWNrYWdlSnNvbixcbiAgICAgIEpTT04uc3RyaW5naWZ5KHNjb3BlZFBhY2thZ2VKc29uLCBudWxsLCAyKSArICdcXG4nLFxuICAgIClcbiAgICBjb25zdCB0YXJnZXRSZWFkbWUgPSBqb2luKHRhcmdldERpciwgJ1JFQURNRS5tZCcpXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmModGFyZ2V0UmVhZG1lLCByZWFkbWUocGFja2FnZU5hbWUsIHRhcmdldCkpXG5cbiAgICBkZWJ1Zy5pbmZvKGAke3BhY2thZ2VOYW1lfSAtJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfSBjcmVhdGVkYClcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkbWUocGFja2FnZU5hbWU6IHN0cmluZywgdGFyZ2V0OiBUYXJnZXQpIHtcbiAgcmV0dXJuIGAjIFxcYCR7cGFja2FnZU5hbWV9LSR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX1cXGBcblxuVGhpcyBpcyB0aGUgKioke3RhcmdldC50cmlwbGV9KiogYmluYXJ5IGZvciBcXGAke3BhY2thZ2VOYW1lfVxcYFxuYFxufVxuXG5mdW5jdGlvbiByZXN0cmljdFdhc2lOb2RlRW5naW5lKG5vZGVSYW5nZTogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgaWYgKHN1YnNldChub2RlUmFuZ2UsIG1pbmltdW1XYXNpTm9kZVZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gbm9kZVJhbmdlXG4gICAgfVxuXG4gICAgaWYgKHN1YnNldChtaW5pbXVtV2FzaU5vZGVWZXJzaW9uLCBub2RlUmFuZ2UpKSB7XG4gICAgICByZXR1cm4gbWluaW11bVdhc2lOb2RlVmVyc2lvblxuICAgIH1cblxuICAgIGNvbnN0IG1pbmltdW1Db21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IobWluaW11bVdhc2lOb2RlVmVyc2lvbilcbiAgICBjb25zdCByZXN0cmljdGVkUmFuZ2VTZXRzID0gbmV3IFJhbmdlKG5vZGVSYW5nZSkuc2V0XG4gICAgICAubWFwKChjb21wYXJhdG9ycykgPT5cbiAgICAgICAgbm9ybWFsaXplQ29tcGFyYXRvclNldChbLi4uY29tcGFyYXRvcnMsIG1pbmltdW1Db21wYXJhdG9yXSksXG4gICAgICApXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoY2FuZGlkYXRlKTogY2FuZGlkYXRlIGlzIHN0cmluZyA9PlxuICAgICAgICAgIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIG1pblZlcnNpb24oY2FuZGlkYXRlKSAhPT0gbnVsbCxcbiAgICAgIClcblxuICAgIGlmIChyZXN0cmljdGVkUmFuZ2VTZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZXN0cmljdGVkUmFuZ2VTZXRzLmpvaW4oJyB8fCAnKVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cblxuICByZXR1cm4gbWluaW11bVdhc2lOb2RlVmVyc2lvblxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb21wYXJhdG9yU2V0KGNvbXBhcmF0b3JzOiBDb21wYXJhdG9yW10pIHtcbiAgY29uc3QgZXhhY3RNYXRjaCA9IGNvbXBhcmF0b3JzLmZpbmQoKHsgb3BlcmF0b3IgfSkgPT4gb3BlcmF0b3IgPT09ICcnKVxuICBpZiAoZXhhY3RNYXRjaCkge1xuICAgIHJldHVybiBjb21wYXJhdG9ycy5ldmVyeSgoY29tcGFyYXRvcikgPT4gY29tcGFyYXRvci50ZXN0KGV4YWN0TWF0Y2guc2VtdmVyKSlcbiAgICAgID8gZXhhY3RNYXRjaC52YWx1ZVxuICAgICAgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGxldCBsb3dlckJvdW5kOiBDb21wYXJhdG9yIHwgdW5kZWZpbmVkXG4gIGxldCB1cHBlckJvdW5kOiBDb21wYXJhdG9yIHwgdW5kZWZpbmVkXG5cbiAgZm9yIChjb25zdCBjb21wYXJhdG9yIG9mIGNvbXBhcmF0b3JzKSB7XG4gICAgaWYgKGNvbXBhcmF0b3Iub3BlcmF0b3IgPT09ICc+JyB8fCBjb21wYXJhdG9yLm9wZXJhdG9yID09PSAnPj0nKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFsb3dlckJvdW5kIHx8XG4gICAgICAgIGNvbXBhcmF0b3Iuc2VtdmVyLmNvbXBhcmUobG93ZXJCb3VuZC5zZW12ZXIpID4gMCB8fFxuICAgICAgICAoY29tcGFyYXRvci5zZW12ZXIuY29tcGFyZShsb3dlckJvdW5kLnNlbXZlcikgPT09IDAgJiZcbiAgICAgICAgICBjb21wYXJhdG9yLm9wZXJhdG9yID09PSAnPicpXG4gICAgICApIHtcbiAgICAgICAgbG93ZXJCb3VuZCA9IGNvbXBhcmF0b3JcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbXBhcmF0b3Iub3BlcmF0b3IgPT09ICc8JyB8fCBjb21wYXJhdG9yLm9wZXJhdG9yID09PSAnPD0nKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF1cHBlckJvdW5kIHx8XG4gICAgICAgIGNvbXBhcmF0b3Iuc2VtdmVyLmNvbXBhcmUodXBwZXJCb3VuZC5zZW12ZXIpIDwgMCB8fFxuICAgICAgICAoY29tcGFyYXRvci5zZW12ZXIuY29tcGFyZSh1cHBlckJvdW5kLnNlbXZlcikgPT09IDAgJiZcbiAgICAgICAgICBjb21wYXJhdG9yLm9wZXJhdG9yID09PSAnPCcpXG4gICAgICApIHtcbiAgICAgICAgdXBwZXJCb3VuZCA9IGNvbXBhcmF0b3JcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2xvd2VyQm91bmQ/LnZhbHVlLCB1cHBlckJvdW5kPy52YWx1ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKVxufVxuIiwiLy8gQ29weXJpZ2h0IDIwMTgtMjAyNSB0aGUgRGVubyBhdXRob3JzLiBNSVQgbGljZW5zZS5cbi8vIFRoaXMgbW9kdWxlIGlzIGJyb3dzZXIgY29tcGF0aWJsZS5cbi8vIEJhcmUga2V5cyBtYXkgb25seSBjb250YWluIEFTQ0lJIGxldHRlcnMsXG4vLyBBU0NJSSBkaWdpdHMsIHVuZGVyc2NvcmVzLCBhbmQgZGFzaGVzIChBLVphLXowLTlfLSkuXG5mdW5jdGlvbiBqb2luS2V5cyhrZXlzKSB7XG4gIC8vIERvdHRlZCBrZXlzIGFyZSBhIHNlcXVlbmNlIG9mIGJhcmUgb3IgcXVvdGVkIGtleXMgam9pbmVkIHdpdGggYSBkb3QuXG4gIC8vIFRoaXMgYWxsb3dzIGZvciBncm91cGluZyBzaW1pbGFyIHByb3BlcnRpZXMgdG9nZXRoZXI6XG4gIHJldHVybiBrZXlzLm1hcCgoc3RyKT0+e1xuICAgIHJldHVybiBzdHIubGVuZ3RoID09PSAwIHx8IHN0ci5tYXRjaCgvW15BLVphLXowLTlfLV0vKSA/IEpTT04uc3RyaW5naWZ5KHN0cikgOiBzdHI7XG4gIH0pLmpvaW4oXCIuXCIpO1xufVxuY2xhc3MgRHVtcGVyIHtcbiAgbWF4UGFkID0gMDtcbiAgc3JjT2JqZWN0O1xuICBvdXRwdXQgPSBbXTtcbiAgI2FycmF5VHlwZUNhY2hlID0gbmV3IE1hcCgpO1xuICBjb25zdHJ1Y3RvcihzcmNPYmpjKXtcbiAgICB0aGlzLnNyY09iamVjdCA9IHNyY09iamM7XG4gIH1cbiAgZHVtcChmbXRPcHRpb25zID0ge30pIHtcbiAgICAvLyBkZW5vLWxpbnQtaWdub3JlIG5vLWV4cGxpY2l0LWFueVxuICAgIHRoaXMub3V0cHV0ID0gdGhpcy4jcHJpbnRPYmplY3QodGhpcy5zcmNPYmplY3QpO1xuICAgIHRoaXMub3V0cHV0ID0gdGhpcy4jZm9ybWF0KGZtdE9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLm91dHB1dDtcbiAgfVxuICAjcHJpbnRPYmplY3Qob2JqLCBrZXlzID0gW10pIHtcbiAgICBjb25zdCBvdXQgPSBbXTtcbiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgY29uc3QgaW5saW5lUHJvcHMgPSBbXTtcbiAgICBjb25zdCBtdWx0aWxpbmVQcm9wcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcyl7XG4gICAgICBpZiAodGhpcy4jaXNTaW1wbHlTZXJpYWxpemFibGUob2JqW3Byb3BdKSkge1xuICAgICAgICBpbmxpbmVQcm9wcy5wdXNoKHByb3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXVsdGlsaW5lUHJvcHMucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc29ydGVkUHJvcHMgPSBpbmxpbmVQcm9wcy5jb25jYXQobXVsdGlsaW5lUHJvcHMpO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBzb3J0ZWRQcm9wcyl7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9ialtwcm9wXTtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgb3V0LnB1c2godGhpcy4jZGF0ZURlY2xhcmF0aW9uKFtcbiAgICAgICAgICBwcm9wXG4gICAgICAgIF0sIHZhbHVlKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICBvdXQucHVzaCh0aGlzLiNzdHJEZWNsYXJhdGlvbihbXG4gICAgICAgICAgcHJvcFxuICAgICAgICBdLCB2YWx1ZS50b1N0cmluZygpKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBvdXQucHVzaCh0aGlzLiNudW1iZXJEZWNsYXJhdGlvbihbXG4gICAgICAgICAgcHJvcFxuICAgICAgICBdLCB2YWx1ZSkpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIG91dC5wdXNoKHRoaXMuI2Jvb2xEZWNsYXJhdGlvbihbXG4gICAgICAgICAgcHJvcFxuICAgICAgICBdLCB2YWx1ZSkpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGNvbnN0IGFycmF5VHlwZSA9IHRoaXMuI2dldFR5cGVPZkFycmF5KHZhbHVlKTtcbiAgICAgICAgaWYgKGFycmF5VHlwZSA9PT0gXCJPTkxZX1BSSU1JVElWRVwiKSB7XG4gICAgICAgICAgb3V0LnB1c2godGhpcy4jYXJyYXlEZWNsYXJhdGlvbihbXG4gICAgICAgICAgICBwcm9wXG4gICAgICAgICAgXSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheVR5cGUgPT09IFwiT05MWV9PQkpFQ1RfRVhDTFVESU5HX0FSUkFZXCIpIHtcbiAgICAgICAgICAvLyBhcnJheSBvZiBvYmplY3RzXG4gICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIG91dC5wdXNoKFwiXCIpO1xuICAgICAgICAgICAgb3V0LnB1c2godGhpcy4jaGVhZGVyR3JvdXAoW1xuICAgICAgICAgICAgICAuLi5rZXlzLFxuICAgICAgICAgICAgICBwcm9wXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICBvdXQucHVzaCguLi50aGlzLiNwcmludE9iamVjdCh2YWx1ZVtpXSwgW1xuICAgICAgICAgICAgICAuLi5rZXlzLFxuICAgICAgICAgICAgICBwcm9wXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgaXMgYSBjb21wbGV4IGFycmF5LCB1c2UgdGhlIGlubGluZSBmb3JtYXQuXG4gICAgICAgICAgY29uc3Qgc3RyID0gdmFsdWUubWFwKCh4KT0+dGhpcy4jcHJpbnRBc0lubGluZVZhbHVlKHgpKS5qb2luKFwiLFwiKTtcbiAgICAgICAgICBvdXQucHVzaChgJHt0aGlzLiNkZWNsYXJhdGlvbihbXG4gICAgICAgICAgICBwcm9wXG4gICAgICAgICAgXSl9WyR7c3RyfV1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3V0LnB1c2goXCJcIik7XG4gICAgICAgIG91dC5wdXNoKHRoaXMuI2hlYWRlcihbXG4gICAgICAgICAgLi4ua2V5cyxcbiAgICAgICAgICBwcm9wXG4gICAgICAgIF0pKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgdG9QYXJzZSA9IHZhbHVlO1xuICAgICAgICAgIG91dC5wdXNoKC4uLnRoaXMuI3ByaW50T2JqZWN0KHRvUGFyc2UsIFtcbiAgICAgICAgICAgIC4uLmtleXMsXG4gICAgICAgICAgICBwcm9wXG4gICAgICAgICAgXSkpO1xuICAgICAgICB9XG4gICAgICAvLyBvdXQucHVzaCguLi50aGlzLl9wYXJzZSh2YWx1ZSwgYCR7cGF0aH0ke3Byb3B9LmApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3V0LnB1c2goXCJcIik7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICAjaXNQcmltaXRpdmUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8IFtcbiAgICAgIFwic3RyaW5nXCIsXG4gICAgICBcIm51bWJlclwiLFxuICAgICAgXCJib29sZWFuXCJcbiAgICBdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG4gIH1cbiAgI2dldFR5cGVPZkFycmF5KGFycikge1xuICAgIGlmICh0aGlzLiNhcnJheVR5cGVDYWNoZS5oYXMoYXJyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2FycmF5VHlwZUNhY2hlLmdldChhcnIpO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gdGhpcy4jZG9HZXRUeXBlT2ZBcnJheShhcnIpO1xuICAgIHRoaXMuI2FycmF5VHlwZUNhY2hlLnNldChhcnIsIHR5cGUpO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG4gICNkb0dldFR5cGVPZkFycmF5KGFycikge1xuICAgIGlmICghYXJyLmxlbmd0aCkge1xuICAgICAgLy8gYW55IHR5cGUgc2hvdWxkIGJlIGZpbmVcbiAgICAgIHJldHVybiBcIk9OTFlfUFJJTUlUSVZFXCI7XG4gICAgfVxuICAgIGNvbnN0IG9ubHlQcmltaXRpdmUgPSB0aGlzLiNpc1ByaW1pdGl2ZShhcnJbMF0pO1xuICAgIGlmIChhcnJbMF0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgcmV0dXJuIFwiTUlYRURcIjtcbiAgICB9XG4gICAgZm9yKGxldCBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKyl7XG4gICAgICBpZiAob25seVByaW1pdGl2ZSAhPT0gdGhpcy4jaXNQcmltaXRpdmUoYXJyW2ldKSB8fCBhcnJbaV0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICByZXR1cm4gXCJNSVhFRFwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb25seVByaW1pdGl2ZSA/IFwiT05MWV9QUklNSVRJVkVcIiA6IFwiT05MWV9PQkpFQ1RfRVhDTFVESU5HX0FSUkFZXCI7XG4gIH1cbiAgI3ByaW50QXNJbmxpbmVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBgXCIke3RoaXMuI3ByaW50RGF0ZSh2YWx1ZSl9XCJgO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3Qgc3RyID0gdmFsdWUubWFwKCh4KT0+dGhpcy4jcHJpbnRBc0lubGluZVZhbHVlKHgpKS5qb2luKFwiLFwiKTtcbiAgICAgIHJldHVybiBgWyR7c3RyfV1gO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNob3VsZCBuZXZlciByZWFjaFwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0ciA9IE9iamVjdC5rZXlzKHZhbHVlKS5tYXAoKGtleSk9PntcbiAgICAgICAgcmV0dXJuIGAke2pvaW5LZXlzKFtcbiAgICAgICAgICBrZXlcbiAgICAgICAgXSl9ID0gJHsvLyBkZW5vLWxpbnQtaWdub3JlIG5vLWV4cGxpY2l0LWFueVxuICAgICAgICB0aGlzLiNwcmludEFzSW5saW5lVmFsdWUodmFsdWVba2V5XSl9YDtcbiAgICAgIH0pLmpvaW4oXCIsXCIpO1xuICAgICAgcmV0dXJuIGB7JHtzdHJ9fWA7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlNob3VsZCBuZXZlciByZWFjaFwiKTtcbiAgfVxuICAjaXNTaW1wbHlTZXJpYWxpemFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIHRoaXMuI2dldFR5cGVPZkFycmF5KHZhbHVlKSAhPT0gXCJPTkxZX09CSkVDVF9FWENMVURJTkdfQVJSQVlcIjtcbiAgfVxuICAjaGVhZGVyKGtleXMpIHtcbiAgICByZXR1cm4gYFske2pvaW5LZXlzKGtleXMpfV1gO1xuICB9XG4gICNoZWFkZXJHcm91cChrZXlzKSB7XG4gICAgcmV0dXJuIGBbWyR7am9pbktleXMoa2V5cyl9XV1gO1xuICB9XG4gICNkZWNsYXJhdGlvbihrZXlzKSB7XG4gICAgY29uc3QgdGl0bGUgPSBqb2luS2V5cyhrZXlzKTtcbiAgICBpZiAodGl0bGUubGVuZ3RoID4gdGhpcy5tYXhQYWQpIHtcbiAgICAgIHRoaXMubWF4UGFkID0gdGl0bGUubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGl0bGV9ID0gYDtcbiAgfVxuICAjYXJyYXlEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gO1xuICB9XG4gICNzdHJEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gO1xuICB9XG4gICNudW1iZXJEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy4jZGVjbGFyYXRpb24oa2V5cyl9bmFuYDtcbiAgICB9XG4gICAgc3dpdGNoKHZhbHVlKXtcbiAgICAgIGNhc2UgSW5maW5pdHk6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX1pbmZgO1xuICAgICAgY2FzZSAtSW5maW5pdHk6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0taW5mYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke3ZhbHVlfWA7XG4gICAgfVxuICB9XG4gICNib29sRGVjbGFyYXRpb24oa2V5cywgdmFsdWUpIHtcbiAgICByZXR1cm4gYCR7dGhpcy4jZGVjbGFyYXRpb24oa2V5cyl9JHt2YWx1ZX1gO1xuICB9XG4gICNwcmludERhdGUodmFsdWUpIHtcbiAgICBmdW5jdGlvbiBkdFBhZCh2LCBsUGFkID0gMikge1xuICAgICAgcmV0dXJuIHYucGFkU3RhcnQobFBhZCwgXCIwXCIpO1xuICAgIH1cbiAgICBjb25zdCBtID0gZHRQYWQoKHZhbHVlLmdldFVUQ01vbnRoKCkgKyAxKS50b1N0cmluZygpKTtcbiAgICBjb25zdCBkID0gZHRQYWQodmFsdWUuZ2V0VVRDRGF0ZSgpLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IGggPSBkdFBhZCh2YWx1ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IG1pbiA9IGR0UGFkKHZhbHVlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpKTtcbiAgICBjb25zdCBzID0gZHRQYWQodmFsdWUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IG1zID0gZHRQYWQodmFsdWUuZ2V0VVRDTWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKSwgMyk7XG4gICAgLy8gZm9ybWF0dGVkIGRhdGVcbiAgICBjb25zdCBmRGF0YSA9IGAke3ZhbHVlLmdldFVUQ0Z1bGxZZWFyKCl9LSR7bX0tJHtkfVQke2h9OiR7bWlufToke3N9LiR7bXN9YDtcbiAgICByZXR1cm4gZkRhdGE7XG4gIH1cbiAgI2RhdGVEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke3RoaXMuI3ByaW50RGF0ZSh2YWx1ZSl9YDtcbiAgfVxuICAjZm9ybWF0KG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsga2V5QWxpZ25tZW50ID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgckRlY2xhcmF0aW9uID0gL14oXFxcIi4qXFxcInxbXj1dKilcXHM9LztcbiAgICBjb25zdCBvdXQgPSBbXTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5vdXRwdXQubGVuZ3RoOyBpKyspe1xuICAgICAgY29uc3QgbCA9IHRoaXMub3V0cHV0W2ldO1xuICAgICAgLy8gd2Uga2VlcCBlbXB0eSBlbnRyeSBmb3IgYXJyYXkgb2Ygb2JqZWN0c1xuICAgICAgaWYgKGxbMF0gPT09IFwiW1wiICYmIGxbMV0gIT09IFwiW1wiKSB7XG4gICAgICAgIC8vIG5vbi1lbXB0eSBvYmplY3Qgd2l0aCBvbmx5IHN1Ym9iamVjdHMgYXMgcHJvcGVydGllc1xuICAgICAgICBpZiAodGhpcy5vdXRwdXRbaSArIDFdID09PSBcIlwiICYmIHRoaXMub3V0cHV0W2kgKyAyXT8uc2xpY2UoMCwgbC5sZW5ndGgpID09PSBsLnNsaWNlKDAsIC0xKSArIFwiLlwiKSB7XG4gICAgICAgICAgaSArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG91dC5wdXNoKGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGtleUFsaWdubWVudCkge1xuICAgICAgICAgIGNvbnN0IG0gPSByRGVjbGFyYXRpb24uZXhlYyhsKTtcbiAgICAgICAgICBpZiAobSAmJiBtWzFdKSB7XG4gICAgICAgICAgICBvdXQucHVzaChsLnJlcGxhY2UobVsxXSwgbVsxXS5wYWRFbmQodGhpcy5tYXhQYWQpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dC5wdXNoKGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQucHVzaChsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhbmluZyBtdWx0aXBsZSBzcGFjZXNcbiAgICBjb25zdCBjbGVhbmVkT3V0cHV0ID0gW107XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkrKyl7XG4gICAgICBjb25zdCBsID0gb3V0W2ldO1xuICAgICAgaWYgKCEobCA9PT0gXCJcIiAmJiBvdXRbaSArIDFdID09PSBcIlwiKSkge1xuICAgICAgICBjbGVhbmVkT3V0cHV0LnB1c2gobCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGVhbmVkT3V0cHV0O1xuICB9XG59XG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCB0byBhIHtAbGluayBodHRwczovL3RvbWwuaW8gfCBUT01MfSBzdHJpbmcuXG4gKlxuICogQGV4YW1wbGUgVXNhZ2VcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tIFwiQHN0ZC90b21sL3N0cmluZ2lmeVwiO1xuICogaW1wb3J0IHsgYXNzZXJ0RXF1YWxzIH0gZnJvbSBcIkBzdGQvYXNzZXJ0XCI7XG4gKlxuICogY29uc3Qgb2JqID0ge1xuICogICB0aXRsZTogXCJUT01MIEV4YW1wbGVcIixcbiAqICAgb3duZXI6IHtcbiAqICAgICBuYW1lOiBcIkJvYlwiLFxuICogICAgIGJpbzogXCJCb2IgaXMgYSBjb29sIGd1eVwiLFxuICogIH1cbiAqIH07XG4gKiBjb25zdCB0b21sU3RyaW5nID0gc3RyaW5naWZ5KG9iaik7XG4gKiBhc3NlcnRFcXVhbHModG9tbFN0cmluZywgYHRpdGxlID0gXCJUT01MIEV4YW1wbGVcIlxcblxcbltvd25lcl1cXG5uYW1lID0gXCJCb2JcIlxcbmJpbyA9IFwiQm9iIGlzIGEgY29vbCBndXlcIlxcbmApO1xuICogYGBgXG4gKiBAcGFyYW0gb2JqIFNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHN0cmluZ2lmeWluZy5cbiAqIEByZXR1cm5zIFRPTUwgc3RyaW5nXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeShvYmosIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBEdW1wZXIob2JqKS5kdW1wKG9wdGlvbnMpLmpvaW4oXCJcXG5cIik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwIiwiLy8gQ29weXJpZ2h0IDIwMTgtMjAyNiB0aGUgRGVubyBhdXRob3JzLiBNSVQgbGljZW5zZS5cbi8vIFRoaXMgbW9kdWxlIGlzIGJyb3dzZXIgY29tcGF0aWJsZS5cbi8qKiBEZWZhdWx0IG1lcmdpbmcgb3B0aW9ucyAtIGNhY2hlZCB0byBhdm9pZCBvYmplY3QgYWxsb2NhdGlvbiBvbiBlYWNoIGNhbGwgKi8gY29uc3QgREVGQVVMVF9PUFRJT05TID0ge1xuICBhcnJheXM6IFwibWVyZ2VcIixcbiAgc2V0czogXCJtZXJnZVwiLFxuICBtYXBzOiBcIm1lcmdlXCJcbn07XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1lcmdlKHJlY29yZCwgb3RoZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRlZXBNZXJnZUludGVybmFsKHJlY29yZCwgb3RoZXIsIG5ldyBTZXQoKSwgb3B0aW9ucyA/PyBERUZBVUxUX09QVElPTlMpO1xufVxuZnVuY3Rpb24gZGVlcE1lcmdlSW50ZXJuYWwocmVjb3JkLCBvdGhlciwgc2Vlbiwgb3B0aW9ucykge1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgY29uc3Qga2V5cyA9IG5ldyBTZXQoW1xuICAgIC4uLmdldEtleXMocmVjb3JkKSxcbiAgICAuLi5nZXRLZXlzKG90aGVyKVxuICBdKTtcbiAgLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2gga2V5IG9mIG90aGVyIG9iamVjdCBhbmQgdXNlIGNvcnJlY3QgbWVyZ2luZyBzdHJhdGVneVxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKXtcbiAgICAvLyBTa2lwIHRvIHByZXZlbnQgT2JqZWN0LnByb3RvdHlwZS5fX3Byb3RvX18gYWNjZXNzb3IgcHJvcGVydHkgY2FsbHMgb24gbm9uLURlbm8gcGxhdGZvcm1zXG4gICAgaWYgKGtleSA9PT0gXCJfX3Byb3RvX19cIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGEgPSByZWNvcmRba2V5XTtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24ob3RoZXIsIGtleSkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gYTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBiID0gb3RoZXJba2V5XTtcbiAgICBpZiAoaXNOb25OdWxsT2JqZWN0KGEpICYmIGlzTm9uTnVsbE9iamVjdChiKSAmJiAhc2Vlbi5oYXMoYSkgJiYgIXNlZW4uaGFzKGIpKSB7XG4gICAgICBzZWVuLmFkZChhKTtcbiAgICAgIHNlZW4uYWRkKGIpO1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZU9iamVjdHMoYSwgYiwgc2Vlbiwgb3B0aW9ucyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gT3ZlcnJpZGUgdmFsdWVcbiAgICByZXN1bHRba2V5XSA9IGI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhsZWZ0LCByaWdodCwgc2Vlbiwgb3B0aW9ucykge1xuICAvLyBSZWN1cnNpdmVseSBtZXJnZSBtZXJnZWFibGUgb2JqZWN0c1xuICBpZiAoaXNNZXJnZWFibGUobGVmdCkgJiYgaXNNZXJnZWFibGUocmlnaHQpKSB7XG4gICAgcmV0dXJuIGRlZXBNZXJnZUludGVybmFsKGxlZnQsIHJpZ2h0LCBzZWVuLCBvcHRpb25zKTtcbiAgfVxuICBpZiAoaXNJdGVyYWJsZShsZWZ0KSAmJiBpc0l0ZXJhYmxlKHJpZ2h0KSkge1xuICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0KSAmJiBBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgICAgaWYgKG9wdGlvbnMuYXJyYXlzID09PSBcIm1lcmdlXCIpIHtcbiAgICAgICAgcmV0dXJuIGxlZnQuY29uY2F0KHJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByaWdodDtcbiAgICB9XG4gICAgLy8gSGFuZGxlIG1hcHNcbiAgICBpZiAobGVmdCBpbnN0YW5jZW9mIE1hcCAmJiByaWdodCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgaWYgKG9wdGlvbnMubWFwcyA9PT0gXCJtZXJnZVwiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXAobGVmdCk7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHJpZ2h0KXtcbiAgICAgICAgICByZXN1bHQuc2V0KGssIHYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmlnaHQ7XG4gICAgfVxuICAgIC8vIEhhbmRsZSBzZXRzXG4gICAgaWYgKGxlZnQgaW5zdGFuY2VvZiBTZXQgJiYgcmlnaHQgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgIGlmIChvcHRpb25zLnNldHMgPT09IFwibWVyZ2VcIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2V0KGxlZnQpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgcmlnaHQpe1xuICAgICAgICAgIHJlc3VsdC5hZGQodik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByaWdodDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJpZ2h0O1xufVxuLyoqXG4gKiBUZXN0IHdoZXRoZXIgYSB2YWx1ZSBpcyBtZXJnZWFibGUgb3Igbm90XG4gKiBCdWlsdGlucyB0aGF0IGxvb2sgbGlrZSBvYmplY3RzLCBudWxsIGFuZCB1c2VyIGRlZmluZWQgY2xhc3Nlc1xuICogYXJlIG5vdCBjb25zaWRlcmVkIG1lcmdlYWJsZSAoaXQgbWVhbnMgdGhhdCByZWZlcmVuY2Ugd2lsbCBiZSBjb3BpZWQpXG4gKi8gZnVuY3Rpb24gaXNNZXJnZWFibGUodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5mdW5jdGlvbiBpc0l0ZXJhYmxlKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWVbU3ltYm9sLml0ZXJhdG9yXSA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gaXNOb25OdWxsT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCI7XG59XG5mdW5jdGlvbiBnZXRLZXlzKHJlY29yZCkge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVjb3JkKTtcbiAgY29uc3Qgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocmVjb3JkKTtcbiAgLy8gRmFzdCBwYXRoOiBtb3N0IG9iamVjdHMgaGF2ZSBubyBzeW1ib2wga2V5c1xuICBpZiAoc3ltYm9scy5sZW5ndGggPT09IDApIHJldHVybiBrZXlzO1xuICBmb3IgKGNvbnN0IHN5bSBvZiBzeW1ib2xzKXtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHJlY29yZCwgc3ltKSkge1xuICAgICAga2V5cy5wdXNoKHN5bSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBrZXlzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVlcF9tZXJnZS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgMjAxOC0yMDI1IHRoZSBEZW5vIGF1dGhvcnMuIE1JVCBsaWNlbnNlLlxuLy8gVGhpcyBtb2R1bGUgaXMgYnJvd3NlciBjb21wYXRpYmxlLlxuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSBcIkBqc3Ivc3RkX19jb2xsZWN0aW9ucy9kZWVwLW1lcmdlXCI7XG4vKipcbiAqIENvcHkgb2YgYGltcG9ydCB7IGlzTGVhcCB9IGZyb20gXCJAc3RkL2RhdGV0aW1lXCI7YCBiZWNhdXNlIGl0IGNhbm5vdCBiZSBpbXBvdGVkIGFzIGxvbmcgYXMgaXQgaXMgdW5zdGFibGUuXG4gKi8gZnVuY3Rpb24gaXNMZWFwKHllYXJOdW1iZXIpIHtcbiAgcmV0dXJuIHllYXJOdW1iZXIgJSA0ID09PSAwICYmIHllYXJOdW1iZXIgJSAxMDAgIT09IDAgfHwgeWVhck51bWJlciAlIDQwMCA9PT0gMDtcbn1cbmV4cG9ydCBjbGFzcyBTY2FubmVyIHtcbiAgI3doaXRlc3BhY2UgPSAvWyBcXHRdLztcbiAgI3Bvc2l0aW9uID0gMDtcbiAgI3NvdXJjZTtcbiAgY29uc3RydWN0b3Ioc291cmNlKXtcbiAgICB0aGlzLiNzb3VyY2UgPSBzb3VyY2U7XG4gIH1cbiAgZ2V0IHBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbjtcbiAgfVxuICBnZXQgc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLiNzb3VyY2U7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNoYXJhY3RlclxuICAgKiBAcGFyYW0gaW5kZXggLSByZWxhdGl2ZSBpbmRleCBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICovIGNoYXIoaW5kZXggPSAwKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NvdXJjZVt0aGlzLiNwb3NpdGlvbiArIGluZGV4XSA/PyBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgc2xpY2VkIHN0cmluZ1xuICAgKiBAcGFyYW0gc3RhcnQgLSBzdGFydCBwb3NpdGlvbiByZWxhdGl2ZSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICogQHBhcmFtIGVuZCAtIGVuZCBwb3NpdGlvbiByZWxhdGl2ZSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICovIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gdGhpcy4jc291cmNlLnNsaWNlKHRoaXMuI3Bvc2l0aW9uICsgc3RhcnQsIHRoaXMuI3Bvc2l0aW9uICsgZW5kKTtcbiAgfVxuICAvKipcbiAgICogTW92ZSBwb3NpdGlvbiB0byBuZXh0XG4gICAqLyBuZXh0KGNvdW50ID0gMSkge1xuICAgIHRoaXMuI3Bvc2l0aW9uICs9IGNvdW50O1xuICB9XG4gIHNraXBXaGl0ZXNwYWNlcygpIHtcbiAgICB3aGlsZSh0aGlzLiN3aGl0ZXNwYWNlLnRlc3QodGhpcy5jaGFyKCkpICYmICF0aGlzLmVvZigpKXtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkIGlmIGN1cnJlbnQgY2hhciBpcyBvdGhlciBraW5kcyBvZiB3aGl0ZXNwYWNlXG4gICAgaWYgKCF0aGlzLmlzQ3VycmVudENoYXJFT0woKSAmJiAvXFxzLy50ZXN0KHRoaXMuY2hhcigpKSkge1xuICAgICAgY29uc3QgZXNjYXBlZCA9IFwiXFxcXHVcIiArIHRoaXMuY2hhcigpLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLiNwb3NpdGlvbjtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSBUT01MOiBJdCBjb250YWlucyBpbnZhbGlkIHdoaXRlc3BhY2UgYXQgcG9zaXRpb24gJyR7cG9zaXRpb259JzogXFxgJHtlc2NhcGVkfVxcYGApO1xuICAgIH1cbiAgfVxuICBuZXh0VW50aWxDaGFyKG9wdGlvbnMgPSB7XG4gICAgc2tpcENvbW1lbnRzOiB0cnVlXG4gIH0pIHtcbiAgICB3aGlsZSghdGhpcy5lb2YoKSl7XG4gICAgICBjb25zdCBjaGFyID0gdGhpcy5jaGFyKCk7XG4gICAgICBpZiAodGhpcy4jd2hpdGVzcGFjZS50ZXN0KGNoYXIpIHx8IHRoaXMuaXNDdXJyZW50Q2hhckVPTCgpKSB7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnNraXBDb21tZW50cyAmJiB0aGlzLmNoYXIoKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgLy8gZW50ZXJpbmcgY29tbWVudFxuICAgICAgICB3aGlsZSghdGhpcy5pc0N1cnJlbnRDaGFyRU9MKCkgJiYgIXRoaXMuZW9mKCkpe1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFBvc2l0aW9uIHJlYWNoZWQgRU9GIG9yIG5vdFxuICAgKi8gZW9mKCkge1xuICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbiA+PSB0aGlzLiNzb3VyY2UubGVuZ3RoO1xuICB9XG4gIGlzQ3VycmVudENoYXJFT0woKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcigpID09PSBcIlxcblwiIHx8IHRoaXMuc3RhcnRzV2l0aChcIlxcclxcblwiKTtcbiAgfVxuICBzdGFydHNXaXRoKHNlYXJjaFN0cmluZykge1xuICAgIHJldHVybiB0aGlzLiNzb3VyY2Uuc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcsIHRoaXMuI3Bvc2l0aW9uKTtcbiAgfVxuICBtYXRjaChyZWdFeHApIHtcbiAgICBpZiAoIXJlZ0V4cC5zdGlja3kpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnRXhwICR7cmVnRXhwfSBkb2VzIG5vdCBoYXZlIGEgc3RpY2t5ICd5JyBmbGFnYCk7XG4gICAgfVxuICAgIHJlZ0V4cC5sYXN0SW5kZXggPSB0aGlzLiNwb3NpdGlvbjtcbiAgICByZXR1cm4gdGhpcy4jc291cmNlLm1hdGNoKHJlZ0V4cCk7XG4gIH1cbn1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVdGlsaXRpZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdWNjZXNzKGJvZHkpIHtcbiAgcmV0dXJuIHtcbiAgICBvazogdHJ1ZSxcbiAgICBib2R5XG4gIH07XG59XG5mdW5jdGlvbiBmYWlsdXJlKCkge1xuICByZXR1cm4ge1xuICAgIG9rOiBmYWxzZVxuICB9O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmVzdGVkIG9iamVjdCBmcm9tIHRoZSBrZXlzIGFuZCB2YWx1ZXMuXG4gKlxuICogZS5nLiBgdW5mbGF0KFtcImFcIiwgXCJiXCIsIFwiY1wiXSwgMSlgIHJldHVybnMgYHsgYTogeyBiOiB7IGM6IDEgfSB9IH1gXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHVuZmxhdChrZXlzLCB2YWx1ZXMgPSB7XG4gIF9fcHJvdG9fXzogbnVsbFxufSkge1xuICByZXR1cm4ga2V5cy5yZWR1Y2VSaWdodCgoYWNjLCBrZXkpPT4oe1xuICAgICAgW2tleV06IGFjY1xuICAgIH0pLCB2YWx1ZXMpO1xufVxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldFRhcmdldFZhbHVlKHRhcmdldCwga2V5cykge1xuICBjb25zdCBrZXkgPSBrZXlzWzBdO1xuICBpZiAoIWtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBwYXJzZSB0aGUgVE9NTDoga2V5IGxlbmd0aCBpcyBub3QgYSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIHRhcmdldFtrZXldO1xufVxuZnVuY3Rpb24gZGVlcEFzc2lnblRhYmxlKHRhcmdldCwgdGFibGUpIHtcbiAgY29uc3QgeyBrZXlzLCB0eXBlLCB2YWx1ZSB9ID0gdGFibGU7XG4gIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGdldFRhcmdldFZhbHVlKHRhcmdldCwga2V5cyk7XG4gIGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRhcmdldCwgdW5mbGF0KGtleXMsIHZhbHVlKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSkge1xuICAgIGNvbnN0IGxhc3QgPSBjdXJyZW50VmFsdWUuYXQoLTEpO1xuICAgIGRlZXBBc3NpZ24obGFzdCwge1xuICAgICAgdHlwZSxcbiAgICAgIGtleXM6IGtleXMuc2xpY2UoMSksXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICBkZWVwQXNzaWduKGN1cnJlbnRWYWx1ZSwge1xuICAgICAgdHlwZSxcbiAgICAgIGtleXM6IGtleXMuc2xpY2UoMSksXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBhc3NpZ25cIik7XG59XG5mdW5jdGlvbiBkZWVwQXNzaWduVGFibGVBcnJheSh0YXJnZXQsIHRhYmxlKSB7XG4gIGNvbnN0IHsgdHlwZSwga2V5cywgdmFsdWUgfSA9IHRhYmxlO1xuICBjb25zdCBjdXJyZW50VmFsdWUgPSBnZXRUYXJnZXRWYWx1ZSh0YXJnZXQsIGtleXMpO1xuICBpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHVuZmxhdChrZXlzLCBbXG4gICAgICB2YWx1ZVxuICAgIF0pKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpKSB7XG4gICAgaWYgKHRhYmxlLmtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjdXJyZW50VmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxhc3QgPSBjdXJyZW50VmFsdWUuYXQoLTEpO1xuICAgICAgZGVlcEFzc2lnbihsYXN0LCB7XG4gICAgICAgIHR5cGU6IHRhYmxlLnR5cGUsXG4gICAgICAgIGtleXM6IHRhYmxlLmtleXMuc2xpY2UoMSksXG4gICAgICAgIHZhbHVlOiB0YWJsZS52YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICBkZWVwQXNzaWduKGN1cnJlbnRWYWx1ZSwge1xuICAgICAgdHlwZSxcbiAgICAgIGtleXM6IGtleXMuc2xpY2UoMSksXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBhc3NpZ25cIik7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVlcEFzc2lnbih0YXJnZXQsIGJvZHkpIHtcbiAgc3dpdGNoKGJvZHkudHlwZSl7XG4gICAgY2FzZSBcIkJsb2NrXCI6XG4gICAgICByZXR1cm4gZGVlcE1lcmdlKHRhcmdldCwgYm9keS52YWx1ZSk7XG4gICAgY2FzZSBcIlRhYmxlXCI6XG4gICAgICByZXR1cm4gZGVlcEFzc2lnblRhYmxlKHRhcmdldCwgYm9keSk7XG4gICAgY2FzZSBcIlRhYmxlQXJyYXlcIjpcbiAgICAgIHJldHVybiBkZWVwQXNzaWduVGFibGVBcnJheSh0YXJnZXQsIGJvZHkpO1xuICB9XG59XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhcnNlciBjb21iaW5hdG9ycyBhbmQgZ2VuZXJhdG9yc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBkZW5vLWxpbnQtaWdub3JlIG5vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gb3IocGFyc2Vycykge1xuICByZXR1cm4gKHNjYW5uZXIpPT57XG4gICAgZm9yIChjb25zdCBwYXJzZSBvZiBwYXJzZXJzKXtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlKHNjYW5uZXIpO1xuICAgICAgaWYgKHJlc3VsdC5vaykgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGZhaWx1cmUoKTtcbiAgfTtcbn1cbi8qKiBKb2luIHRoZSBwYXJzZSByZXN1bHRzIG9mIHRoZSBnaXZlbiBwYXJzZXIgaW50byBhbiBhcnJheS5cbiAqXG4gKiBJZiB0aGUgcGFyc2VyIGZhaWxzIGF0IHRoZSBmaXJzdCBhdHRlbXB0LCBpdCB3aWxsIHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAqLyBmdW5jdGlvbiBqb2luKHBhcnNlciwgc2VwYXJhdG9yKSB7XG4gIGNvbnN0IFNlcGFyYXRvciA9IGNoYXJhY3RlcihzZXBhcmF0b3IpO1xuICByZXR1cm4gKHNjYW5uZXIpPT57XG4gICAgY29uc3Qgb3V0ID0gW107XG4gICAgY29uc3QgZmlyc3QgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgaWYgKCFmaXJzdC5vaykgcmV0dXJuIHN1Y2Nlc3Mob3V0KTtcbiAgICBvdXQucHVzaChmaXJzdC5ib2R5KTtcbiAgICB3aGlsZSghc2Nhbm5lci5lb2YoKSl7XG4gICAgICBpZiAoIVNlcGFyYXRvcihzY2FubmVyKS5vaykgYnJlYWs7XG4gICAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYEludmFsaWQgdG9rZW4gYWZ0ZXIgXCIke3NlcGFyYXRvcn1cImApO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2gocmVzdWx0LmJvZHkpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcyhvdXQpO1xuICB9O1xufVxuLyoqIEpvaW4gdGhlIHBhcnNlIHJlc3VsdHMgb2YgdGhlIGdpdmVuIHBhcnNlciBpbnRvIGFuIGFycmF5LlxuICpcbiAqIFRoaXMgcmVxdWlyZXMgdGhlIHBhcnNlciB0byBzdWNjZWVkIGF0IGxlYXN0IG9uY2UuXG4gKi8gZnVuY3Rpb24gam9pbjEocGFyc2VyLCBzZXBhcmF0b3IpIHtcbiAgY29uc3QgU2VwYXJhdG9yID0gY2hhcmFjdGVyKHNlcGFyYXRvcik7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBjb25zdCBmaXJzdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICBpZiAoIWZpcnN0Lm9rKSByZXR1cm4gZmFpbHVyZSgpO1xuICAgIGNvbnN0IG91dCA9IFtcbiAgICAgIGZpcnN0LmJvZHlcbiAgICBdO1xuICAgIHdoaWxlKCFzY2FubmVyLmVvZigpKXtcbiAgICAgIGlmICghU2VwYXJhdG9yKHNjYW5uZXIpLm9rKSBicmVhaztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCB0b2tlbiBhZnRlciBcIiR7c2VwYXJhdG9yfVwiYCk7XG4gICAgICB9XG4gICAgICBvdXQucHVzaChyZXN1bHQuYm9keSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzKG91dCk7XG4gIH07XG59XG5mdW5jdGlvbiBrdihrZXlQYXJzZXIsIHNlcGFyYXRvciwgdmFsdWVQYXJzZXIpIHtcbiAgY29uc3QgU2VwYXJhdG9yID0gY2hhcmFjdGVyKHNlcGFyYXRvcik7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBjb25zdCBwb3NpdGlvbiA9IHNjYW5uZXIucG9zaXRpb247XG4gICAgY29uc3Qga2V5ID0ga2V5UGFyc2VyKHNjYW5uZXIpO1xuICAgIGlmICgha2V5Lm9rKSByZXR1cm4gZmFpbHVyZSgpO1xuICAgIGNvbnN0IHNlcCA9IFNlcGFyYXRvcihzY2FubmVyKTtcbiAgICBpZiAoIXNlcC5vaykge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBrZXkvdmFsdWUgcGFpciBkb2Vzbid0IGhhdmUgXCIke3NlcGFyYXRvcn1cImApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHZhbHVlUGFyc2VyKHNjYW5uZXIpO1xuICAgIGlmICghdmFsdWUub2spIHtcbiAgICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IHNjYW5uZXIuc291cmNlLmluZGV4T2YoXCJcXG5cIiwgc2Nhbm5lci5wb3NpdGlvbik7XG4gICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IGxpbmVFbmRJbmRleCA+IDAgPyBsaW5lRW5kSW5kZXggOiBzY2FubmVyLnNvdXJjZS5sZW5ndGg7XG4gICAgICBjb25zdCBsaW5lID0gc2Nhbm5lci5zb3VyY2Uuc2xpY2UocG9zaXRpb24sIGVuZFBvc2l0aW9uKTtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIHZhbHVlIG9uIGxpbmUgJyR7bGluZX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzKHVuZmxhdChrZXkuYm9keSwgdmFsdWUuYm9keSkpO1xuICB9O1xufVxuZnVuY3Rpb24gbWVyZ2UocGFyc2VyKSB7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgaWYgKCFyZXN1bHQub2spIHJldHVybiBmYWlsdXJlKCk7XG4gICAgbGV0IGJvZHkgPSB7XG4gICAgICBfX3Byb3RvX186IG51bGxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlc3VsdC5ib2R5KXtcbiAgICAgIGlmICh0eXBlb2YgcmVjb3JkID09PSBcIm9iamVjdFwiICYmIHJlY29yZCAhPT0gbnVsbCkge1xuICAgICAgICBib2R5ID0gZGVlcE1lcmdlKGJvZHksIHJlY29yZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzKGJvZHkpO1xuICB9O1xufVxuZnVuY3Rpb24gcmVwZWF0KHBhcnNlcikge1xuICByZXR1cm4gKHNjYW5uZXIpPT57XG4gICAgY29uc3QgYm9keSA9IFtdO1xuICAgIHdoaWxlKCFzY2FubmVyLmVvZigpKXtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSBicmVhaztcbiAgICAgIGJvZHkucHVzaChyZXN1bHQuYm9keSk7XG4gICAgICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgICB9XG4gICAgaWYgKGJvZHkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFpbHVyZSgpO1xuICAgIHJldHVybiBzdWNjZXNzKGJvZHkpO1xuICB9O1xufVxuZnVuY3Rpb24gc3Vycm91bmQobGVmdCwgcGFyc2VyLCByaWdodCkge1xuICBjb25zdCBMZWZ0ID0gY2hhcmFjdGVyKGxlZnQpO1xuICBjb25zdCBSaWdodCA9IGNoYXJhY3RlcihyaWdodCk7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBpZiAoIUxlZnQoc2Nhbm5lcikub2spIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIHRva2VuIGFmdGVyIFwiJHtsZWZ0fVwiYCk7XG4gICAgfVxuICAgIGlmICghUmlnaHQoc2Nhbm5lcikub2spIHtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgTm90IGNsb3NlZCBieSBcIiR7cmlnaHR9XCIgYWZ0ZXIgc3RhcnRlZCB3aXRoIFwiJHtsZWZ0fVwiYCk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzKHJlc3VsdC5ib2R5KTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNoYXJhY3RlcihzdHIpIHtcbiAgcmV0dXJuIChzY2FubmVyKT0+e1xuICAgIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gICAgaWYgKCFzY2FubmVyLnN0YXJ0c1dpdGgoc3RyKSkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgICBzY2FubmVyLm5leHQoc3RyLmxlbmd0aCk7XG4gICAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgICByZXR1cm4gc3VjY2Vzcyh1bmRlZmluZWQpO1xuICB9O1xufVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhcnNlciBjb21wb25lbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgQkFSRV9LRVlfUkVHRVhQID0gL1tBLVphLXowLTlfLV0rL3k7XG5leHBvcnQgZnVuY3Rpb24gYmFyZUtleShzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IGtleSA9IHNjYW5uZXIubWF0Y2goQkFSRV9LRVlfUkVHRVhQKT8uWzBdO1xuICBpZiAoIWtleSkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KGtleS5sZW5ndGgpO1xuICByZXR1cm4gc3VjY2VzcyhrZXkpO1xufVxuZnVuY3Rpb24gZXNjYXBlU2VxdWVuY2Uoc2Nhbm5lcikge1xuICBpZiAoc2Nhbm5lci5jaGFyKCkgIT09IFwiXFxcXFwiKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQoKTtcbiAgLy8gU2VlIGh0dHBzOi8vdG9tbC5pby9lbi92MS4wLjAtcmMuMyNzdHJpbmdcbiAgc3dpdGNoKHNjYW5uZXIuY2hhcigpKXtcbiAgICBjYXNlIFwiYlwiOlxuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICByZXR1cm4gc3VjY2VzcyhcIlxcYlwiKTtcbiAgICBjYXNlIFwidFwiOlxuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICByZXR1cm4gc3VjY2VzcyhcIlxcdFwiKTtcbiAgICBjYXNlIFwiblwiOlxuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICByZXR1cm4gc3VjY2VzcyhcIlxcblwiKTtcbiAgICBjYXNlIFwiZlwiOlxuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICByZXR1cm4gc3VjY2VzcyhcIlxcZlwiKTtcbiAgICBjYXNlIFwiclwiOlxuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICByZXR1cm4gc3VjY2VzcyhcIlxcclwiKTtcbiAgICBjYXNlIFwidVwiOlxuICAgIGNhc2UgXCJVXCI6XG4gICAgICB7XG4gICAgICAgIC8vIFVuaWNvZGUgY2hhcmFjdGVyXG4gICAgICAgIGNvbnN0IGNvZGVQb2ludExlbiA9IHNjYW5uZXIuY2hhcigpID09PSBcInVcIiA/IDQgOiA2O1xuICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSBwYXJzZUludChcIjB4XCIgKyBzY2FubmVyLnNsaWNlKDEsIDEgKyBjb2RlUG9pbnRMZW4pLCAxNik7XG4gICAgICAgIGNvbnN0IHN0ciA9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgICAgIHNjYW5uZXIubmV4dChjb2RlUG9pbnRMZW4gKyAxKTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3Moc3RyKTtcbiAgICAgIH1cbiAgICBjYXNlICdcIic6XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgIHJldHVybiBzdWNjZXNzKCdcIicpO1xuICAgIGNhc2UgXCJcXFxcXCI6XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgIHJldHVybiBzdWNjZXNzKFwiXFxcXFwiKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZTogXFxcXCR7c2Nhbm5lci5jaGFyKCl9YCk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBiYXNpY1N0cmluZyhzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGlmIChzY2FubmVyLmNoYXIoKSAhPT0gJ1wiJykgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KCk7XG4gIGNvbnN0IGFjYyA9IFtdO1xuICB3aGlsZShzY2FubmVyLmNoYXIoKSAhPT0gJ1wiJyAmJiAhc2Nhbm5lci5lb2YoKSl7XG4gICAgaWYgKHNjYW5uZXIuY2hhcigpID09PSBcIlxcblwiKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJTaW5nbGUtbGluZSBzdHJpbmcgY2Fubm90IGNvbnRhaW4gRU9MXCIpO1xuICAgIH1cbiAgICBjb25zdCBlc2NhcGVkQ2hhciA9IGVzY2FwZVNlcXVlbmNlKHNjYW5uZXIpO1xuICAgIGlmIChlc2NhcGVkQ2hhci5vaykge1xuICAgICAgYWNjLnB1c2goZXNjYXBlZENoYXIuYm9keSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjYy5wdXNoKHNjYW5uZXIuY2hhcigpKTtcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgIH1cbiAgfVxuICBpZiAoc2Nhbm5lci5lb2YoKSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgU2luZ2xlLWxpbmUgc3RyaW5nIGlzIG5vdCBjbG9zZWQ6XFxuJHthY2Muam9pbihcIlwiKX1gKTtcbiAgfVxuICBzY2FubmVyLm5leHQoKTsgLy8gc2tpcCBsYXN0ICdcIlwiXG4gIHJldHVybiBzdWNjZXNzKGFjYy5qb2luKFwiXCIpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsU3RyaW5nKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgaWYgKHNjYW5uZXIuY2hhcigpICE9PSBcIidcIikgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KCk7XG4gIGNvbnN0IGFjYyA9IFtdO1xuICB3aGlsZShzY2FubmVyLmNoYXIoKSAhPT0gXCInXCIgJiYgIXNjYW5uZXIuZW9mKCkpe1xuICAgIGlmIChzY2FubmVyLmNoYXIoKSA9PT0gXCJcXG5cIikge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiU2luZ2xlLWxpbmUgc3RyaW5nIGNhbm5vdCBjb250YWluIEVPTFwiKTtcbiAgICB9XG4gICAgYWNjLnB1c2goc2Nhbm5lci5jaGFyKCkpO1xuICAgIHNjYW5uZXIubmV4dCgpO1xuICB9XG4gIGlmIChzY2FubmVyLmVvZigpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBTaW5nbGUtbGluZSBzdHJpbmcgaXMgbm90IGNsb3NlZDpcXG4ke2FjYy5qb2luKFwiXCIpfWApO1xuICB9XG4gIHNjYW5uZXIubmV4dCgpOyAvLyBza2lwIGxhc3QgXCInXCJcbiAgcmV0dXJuIHN1Y2Nlc3MoYWNjLmpvaW4oXCJcIikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpbGluZUJhc2ljU3RyaW5nKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgaWYgKCFzY2FubmVyLnN0YXJ0c1dpdGgoJ1wiXCJcIicpKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQoMyk7XG4gIGlmIChzY2FubmVyLmNoYXIoKSA9PT0gXCJcXG5cIikge1xuICAgIC8vIFRoZSBmaXJzdCBuZXdsaW5lIChMRikgaXMgdHJpbW1lZFxuICAgIHNjYW5uZXIubmV4dCgpO1xuICB9IGVsc2UgaWYgKHNjYW5uZXIuc3RhcnRzV2l0aChcIlxcclxcblwiKSkge1xuICAgIC8vIFRoZSBmaXJzdCBuZXdsaW5lIChDUkxGKSBpcyB0cmltbWVkXG4gICAgc2Nhbm5lci5uZXh0KDIpO1xuICB9XG4gIGNvbnN0IGFjYyA9IFtdO1xuICB3aGlsZSghc2Nhbm5lci5zdGFydHNXaXRoKCdcIlwiXCInKSAmJiAhc2Nhbm5lci5lb2YoKSl7XG4gICAgLy8gbGluZSBlbmRpbmcgYmFja3NsYXNoXG4gICAgaWYgKHNjYW5uZXIuc3RhcnRzV2l0aChcIlxcXFxcXG5cIikpIHtcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKHtcbiAgICAgICAgc2tpcENvbW1lbnRzOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKHNjYW5uZXIuc3RhcnRzV2l0aChcIlxcXFxcXHJcXG5cIikpIHtcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKHtcbiAgICAgICAgc2tpcENvbW1lbnRzOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZXNjYXBlZENoYXIgPSBlc2NhcGVTZXF1ZW5jZShzY2FubmVyKTtcbiAgICBpZiAoZXNjYXBlZENoYXIub2spIHtcbiAgICAgIGFjYy5wdXNoKGVzY2FwZWRDaGFyLmJvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2MucHVzaChzY2FubmVyLmNoYXIoKSk7XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNjYW5uZXIuZW9mKCkpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYE11bHRpLWxpbmUgc3RyaW5nIGlzIG5vdCBjbG9zZWQ6XFxuJHthY2Muam9pbihcIlwiKX1gKTtcbiAgfVxuICAvLyBpZiBlbmRzIHdpdGggNCBgXCJgLCBwdXNoIHRoZSBmaXN0IGBcImAgdG8gc3RyaW5nXG4gIGlmIChzY2FubmVyLmNoYXIoMykgPT09ICdcIicpIHtcbiAgICBhY2MucHVzaCgnXCInKTtcbiAgICBzY2FubmVyLm5leHQoKTtcbiAgfVxuICBzY2FubmVyLm5leHQoMyk7IC8vIHNraXAgbGFzdCAnXCJcIlwiXCJcbiAgcmV0dXJuIHN1Y2Nlc3MoYWNjLmpvaW4oXCJcIikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpbGluZUxpdGVyYWxTdHJpbmcoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBpZiAoIXNjYW5uZXIuc3RhcnRzV2l0aChcIicnJ1wiKSkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KDMpO1xuICBpZiAoc2Nhbm5lci5jaGFyKCkgPT09IFwiXFxuXCIpIHtcbiAgICAvLyBUaGUgZmlyc3QgbmV3bGluZSAoTEYpIGlzIHRyaW1tZWRcbiAgICBzY2FubmVyLm5leHQoKTtcbiAgfSBlbHNlIGlmIChzY2FubmVyLnN0YXJ0c1dpdGgoXCJcXHJcXG5cIikpIHtcbiAgICAvLyBUaGUgZmlyc3QgbmV3bGluZSAoQ1JMRikgaXMgdHJpbW1lZFxuICAgIHNjYW5uZXIubmV4dCgyKTtcbiAgfVxuICBjb25zdCBhY2MgPSBbXTtcbiAgd2hpbGUoIXNjYW5uZXIuc3RhcnRzV2l0aChcIicnJ1wiKSAmJiAhc2Nhbm5lci5lb2YoKSl7XG4gICAgYWNjLnB1c2goc2Nhbm5lci5jaGFyKCkpO1xuICAgIHNjYW5uZXIubmV4dCgpO1xuICB9XG4gIGlmIChzY2FubmVyLmVvZigpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBNdWx0aS1saW5lIHN0cmluZyBpcyBub3QgY2xvc2VkOlxcbiR7YWNjLmpvaW4oXCJcIil9YCk7XG4gIH1cbiAgLy8gaWYgZW5kcyB3aXRoIDQgYCdgLCBwdXNoIHRoZSBmaXN0IGAnYCB0byBzdHJpbmdcbiAgaWYgKHNjYW5uZXIuY2hhcigzKSA9PT0gXCInXCIpIHtcbiAgICBhY2MucHVzaChcIidcIik7XG4gICAgc2Nhbm5lci5uZXh0KCk7XG4gIH1cbiAgc2Nhbm5lci5uZXh0KDMpOyAvLyBza2lwIGxhc3QgXCInJydcIlxuICByZXR1cm4gc3VjY2VzcyhhY2Muam9pbihcIlwiKSk7XG59XG5jb25zdCBCT09MRUFOX1JFR0VYUCA9IC8oPzp0cnVlfGZhbHNlKVxcYi95O1xuZXhwb3J0IGZ1bmN0aW9uIGJvb2xlYW4oc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goQk9PTEVBTl9SRUdFWFApO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFpbHVyZSgpO1xuICBjb25zdCBzdHJpbmcgPSBtYXRjaFswXTtcbiAgc2Nhbm5lci5uZXh0KHN0cmluZy5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZSA9IHN0cmluZyA9PT0gXCJ0cnVlXCI7XG4gIHJldHVybiBzdWNjZXNzKHZhbHVlKTtcbn1cbmNvbnN0IElORklOSVRZX01BUCA9IG5ldyBNYXAoW1xuICBbXG4gICAgXCJpbmZcIixcbiAgICBJbmZpbml0eVxuICBdLFxuICBbXG4gICAgXCIraW5mXCIsXG4gICAgSW5maW5pdHlcbiAgXSxcbiAgW1xuICAgIFwiLWluZlwiLFxuICAgIC1JbmZpbml0eVxuICBdXG5dKTtcbmNvbnN0IElORklOSVRZX1JFR0VYUCA9IC9bKy1dP2luZlxcYi95O1xuZXhwb3J0IGZ1bmN0aW9uIGluZmluaXR5KHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKElORklOSVRZX1JFR0VYUCk7XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIGNvbnN0IHN0cmluZyA9IG1hdGNoWzBdO1xuICBzY2FubmVyLm5leHQoc3RyaW5nLmxlbmd0aCk7XG4gIGNvbnN0IHZhbHVlID0gSU5GSU5JVFlfTUFQLmdldChzdHJpbmcpO1xuICByZXR1cm4gc3VjY2Vzcyh2YWx1ZSk7XG59XG5jb25zdCBOQU5fUkVHRVhQID0gL1srLV0/bmFuXFxiL3k7XG5leHBvcnQgZnVuY3Rpb24gbmFuKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKE5BTl9SRUdFWFApO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFpbHVyZSgpO1xuICBjb25zdCBzdHJpbmcgPSBtYXRjaFswXTtcbiAgc2Nhbm5lci5uZXh0KHN0cmluZy5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZSA9IE5hTjtcbiAgcmV0dXJuIHN1Y2Nlc3ModmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IGRvdHRlZEtleSA9IGpvaW4xKG9yKFtcbiAgYmFyZUtleSxcbiAgYmFzaWNTdHJpbmcsXG4gIGxpdGVyYWxTdHJpbmdcbl0pLCBcIi5cIik7XG5jb25zdCBCSU5BUllfUkVHRVhQID0gLzBiWzAxXSsoPzpfWzAxXSspKlxcYi95O1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeShzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChCSU5BUllfUkVHRVhQKT8uWzBdO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQobWF0Y2gubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWUgPSBtYXRjaC5zbGljZSgyKS5yZXBsYWNlQWxsKFwiX1wiLCBcIlwiKTtcbiAgY29uc3QgbnVtYmVyID0gcGFyc2VJbnQodmFsdWUsIDIpO1xuICByZXR1cm4gaXNOYU4obnVtYmVyKSA/IGZhaWx1cmUoKSA6IHN1Y2Nlc3MobnVtYmVyKTtcbn1cbmNvbnN0IE9DVEFMX1JFR0VYUCA9IC8wb1swLTddKyg/Ol9bMC03XSspKlxcYi95O1xuZXhwb3J0IGZ1bmN0aW9uIG9jdGFsKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKE9DVEFMX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KG1hdGNoLmxlbmd0aCk7XG4gIGNvbnN0IHZhbHVlID0gbWF0Y2guc2xpY2UoMikucmVwbGFjZUFsbChcIl9cIiwgXCJcIik7XG4gIGNvbnN0IG51bWJlciA9IHBhcnNlSW50KHZhbHVlLCA4KTtcbiAgcmV0dXJuIGlzTmFOKG51bWJlcikgPyBmYWlsdXJlKCkgOiBzdWNjZXNzKG51bWJlcik7XG59XG5jb25zdCBIRVhfUkVHRVhQID0gLzB4WzAtOWEtZl0rKD86X1swLTlhLWZdKykqXFxiL3lpO1xuZXhwb3J0IGZ1bmN0aW9uIGhleChzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChIRVhfUkVHRVhQKT8uWzBdO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQobWF0Y2gubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWUgPSBtYXRjaC5zbGljZSgyKS5yZXBsYWNlQWxsKFwiX1wiLCBcIlwiKTtcbiAgY29uc3QgbnVtYmVyID0gcGFyc2VJbnQodmFsdWUsIDE2KTtcbiAgcmV0dXJuIGlzTmFOKG51bWJlcikgPyBmYWlsdXJlKCkgOiBzdWNjZXNzKG51bWJlcik7XG59XG5jb25zdCBJTlRFR0VSX1JFR0VYUCA9IC9bKy1dPyg/OjB8WzEtOV1bMC05XSooPzpfWzAtOV0rKSopXFxiL3k7XG5leHBvcnQgZnVuY3Rpb24gaW50ZWdlcihzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChJTlRFR0VSX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KG1hdGNoLmxlbmd0aCk7XG4gIGNvbnN0IHZhbHVlID0gbWF0Y2gucmVwbGFjZUFsbChcIl9cIiwgXCJcIik7XG4gIGNvbnN0IGludCA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gIHJldHVybiBzdWNjZXNzKGludCk7XG59XG5jb25zdCBGTE9BVF9SRUdFWFAgPSAvWystXT8oPzowfFsxLTldWzAtOV0qKD86X1swLTldKykqKSg/OlxcLlswLTldKyg/Ol9bMC05XSspKik/KD86ZVsrLV0/WzAtOV0rKD86X1swLTldKykqKT9cXGIveWk7XG5leHBvcnQgZnVuY3Rpb24gZmxvYXQoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goRkxPQVRfUkVHRVhQKT8uWzBdO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQobWF0Y2gubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWUgPSBtYXRjaC5yZXBsYWNlQWxsKFwiX1wiLCBcIlwiKTtcbiAgY29uc3QgZmxvYXQgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgaWYgKGlzTmFOKGZsb2F0KSkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgcmV0dXJuIHN1Y2Nlc3MoZmxvYXQpO1xufVxuY29uc3QgREFURV9USU1FX1JFR0VYUCA9IC8oPzx5ZWFyPlxcZHs0fSktKD88bW9udGg+XFxkezJ9KS0oPzxkYXk+XFxkezJ9KSg/OlsgMC05VFouOistXSspP1xcYi95O1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGVUaW1lKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKERBVEVfVElNRV9SRUdFWFApO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFpbHVyZSgpO1xuICBjb25zdCBzdHJpbmcgPSBtYXRjaFswXTtcbiAgc2Nhbm5lci5uZXh0KHN0cmluZy5sZW5ndGgpO1xuICBjb25zdCBncm91cHMgPSBtYXRjaC5ncm91cHM7XG4gIC8vIHNwZWNpYWwgY2FzZSBpZiBtb250aCBpcyBGZWJydWFyeVxuICBpZiAoZ3JvdXBzLm1vbnRoID09IFwiMDJcIikge1xuICAgIGNvbnN0IGRheXMgPSBwYXJzZUludChncm91cHMuZGF5KTtcbiAgICBpZiAoZGF5cyA+IDI5KSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYEludmFsaWQgZGF0ZSBzdHJpbmcgXCIke21hdGNofVwiYCk7XG4gICAgfVxuICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChncm91cHMueWVhcik7XG4gICAgaWYgKGRheXMgPiAyOCAmJiAhaXNMZWFwKHllYXIpKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYEludmFsaWQgZGF0ZSBzdHJpbmcgXCIke21hdGNofVwiYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShzdHJpbmcudHJpbSgpKTtcbiAgLy8gaW52YWxpZCBkYXRlXG4gIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYEludmFsaWQgZGF0ZSBzdHJpbmcgXCIke21hdGNofVwiYCk7XG4gIH1cbiAgcmV0dXJuIHN1Y2Nlc3MoZGF0ZSk7XG59XG5jb25zdCBMT0NBTF9USU1FX1JFR0VYUCA9IC8oXFxkezJ9KTooXFxkezJ9KTooXFxkezJ9KSg/OlxcLlswLTldKyk/XFxiL3k7XG5leHBvcnQgZnVuY3Rpb24gbG9jYWxUaW1lKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKExPQ0FMX1RJTUVfUkVHRVhQKT8uWzBdO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQobWF0Y2gubGVuZ3RoKTtcbiAgcmV0dXJuIHN1Y2Nlc3MobWF0Y2gpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5VmFsdWUoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBpZiAoc2Nhbm5lci5jaGFyKCkgIT09IFwiW1wiKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQoKTtcbiAgY29uc3QgYXJyYXkgPSBbXTtcbiAgd2hpbGUoIXNjYW5uZXIuZW9mKCkpe1xuICAgIHNjYW5uZXIubmV4dFVudGlsQ2hhcigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlKHNjYW5uZXIpO1xuICAgIGlmICghcmVzdWx0Lm9rKSBicmVhaztcbiAgICBhcnJheS5wdXNoKHJlc3VsdC5ib2R5KTtcbiAgICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICAgIC8vIG1heSBoYXZlIGEgbmV4dCBpdGVtLCBidXQgdHJhaWxpbmcgY29tbWEgaXMgYWxsb3dlZCBhdCBhcnJheVxuICAgIGlmIChzY2FubmVyLmNoYXIoKSAhPT0gXCIsXCIpIGJyZWFrO1xuICAgIHNjYW5uZXIubmV4dCgpO1xuICB9XG4gIHNjYW5uZXIubmV4dFVudGlsQ2hhcigpO1xuICBpZiAoc2Nhbm5lci5jaGFyKCkgIT09IFwiXVwiKSB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJBcnJheSBpcyBub3QgY2xvc2VkXCIpO1xuICBzY2FubmVyLm5leHQoKTtcbiAgcmV0dXJuIHN1Y2Nlc3MoYXJyYXkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlubGluZVRhYmxlKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGlmIChzY2FubmVyLmNoYXIoMSkgPT09IFwifVwiKSB7XG4gICAgc2Nhbm5lci5uZXh0KDIpO1xuICAgIHJldHVybiBzdWNjZXNzKHtcbiAgICAgIF9fcHJvdG9fXzogbnVsbFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBhaXJzID0gc3Vycm91bmQoXCJ7XCIsIGpvaW4ocGFpciwgXCIsXCIpLCBcIn1cIikoc2Nhbm5lcik7XG4gIGlmICghcGFpcnMub2spIHJldHVybiBmYWlsdXJlKCk7XG4gIGxldCB0YWJsZSA9IHtcbiAgICBfX3Byb3RvX186IG51bGxcbiAgfTtcbiAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzLmJvZHkpe1xuICAgIHRhYmxlID0gZGVlcE1lcmdlKHRhYmxlLCBwYWlyKTtcbiAgfVxuICByZXR1cm4gc3VjY2Vzcyh0YWJsZSk7XG59XG5leHBvcnQgY29uc3QgdmFsdWUgPSBvcihbXG4gIG11bHRpbGluZUJhc2ljU3RyaW5nLFxuICBtdWx0aWxpbmVMaXRlcmFsU3RyaW5nLFxuICBiYXNpY1N0cmluZyxcbiAgbGl0ZXJhbFN0cmluZyxcbiAgYm9vbGVhbixcbiAgaW5maW5pdHksXG4gIG5hbixcbiAgZGF0ZVRpbWUsXG4gIGxvY2FsVGltZSxcbiAgYmluYXJ5LFxuICBvY3RhbCxcbiAgaGV4LFxuICBmbG9hdCxcbiAgaW50ZWdlcixcbiAgYXJyYXlWYWx1ZSxcbiAgaW5saW5lVGFibGVcbl0pO1xuZXhwb3J0IGNvbnN0IHBhaXIgPSBrdihkb3R0ZWRLZXksIFwiPVwiLCB2YWx1ZSk7XG5leHBvcnQgZnVuY3Rpb24gYmxvY2soc2Nhbm5lcikge1xuICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgY29uc3QgcmVzdWx0ID0gbWVyZ2UocmVwZWF0KHBhaXIpKShzY2FubmVyKTtcbiAgaWYgKHJlc3VsdC5vaykgcmV0dXJuIHN1Y2Nlc3Moe1xuICAgIHR5cGU6IFwiQmxvY2tcIixcbiAgICB2YWx1ZTogcmVzdWx0LmJvZHlcbiAgfSk7XG4gIHJldHVybiBmYWlsdXJlKCk7XG59XG5leHBvcnQgY29uc3QgdGFibGVIZWFkZXIgPSBzdXJyb3VuZChcIltcIiwgZG90dGVkS2V5LCBcIl1cIik7XG5leHBvcnQgZnVuY3Rpb24gdGFibGUoc2Nhbm5lcikge1xuICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgY29uc3QgaGVhZGVyID0gdGFibGVIZWFkZXIoc2Nhbm5lcik7XG4gIGlmICghaGVhZGVyLm9rKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgY29uc3QgYiA9IGJsb2NrKHNjYW5uZXIpO1xuICByZXR1cm4gc3VjY2Vzcyh7XG4gICAgdHlwZTogXCJUYWJsZVwiLFxuICAgIGtleXM6IGhlYWRlci5ib2R5LFxuICAgIHZhbHVlOiBiLm9rID8gYi5ib2R5LnZhbHVlIDoge1xuICAgICAgX19wcm90b19fOiBudWxsXG4gICAgfVxuICB9KTtcbn1cbmV4cG9ydCBjb25zdCB0YWJsZUFycmF5SGVhZGVyID0gc3Vycm91bmQoXCJbW1wiLCBkb3R0ZWRLZXksIFwiXV1cIik7XG5leHBvcnQgZnVuY3Rpb24gdGFibGVBcnJheShzY2FubmVyKSB7XG4gIHNjYW5uZXIubmV4dFVudGlsQ2hhcigpO1xuICBjb25zdCBoZWFkZXIgPSB0YWJsZUFycmF5SGVhZGVyKHNjYW5uZXIpO1xuICBpZiAoIWhlYWRlci5vaykgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGNvbnN0IGIgPSBibG9jayhzY2FubmVyKTtcbiAgcmV0dXJuIHN1Y2Nlc3Moe1xuICAgIHR5cGU6IFwiVGFibGVBcnJheVwiLFxuICAgIGtleXM6IGhlYWRlci5ib2R5LFxuICAgIHZhbHVlOiBiLm9rID8gYi5ib2R5LnZhbHVlIDoge1xuICAgICAgX19wcm90b19fOiBudWxsXG4gICAgfVxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b21sKHNjYW5uZXIpIHtcbiAgY29uc3QgYmxvY2tzID0gcmVwZWF0KG9yKFtcbiAgICBibG9jayxcbiAgICB0YWJsZUFycmF5LFxuICAgIHRhYmxlXG4gIF0pKShzY2FubmVyKTtcbiAgaWYgKCFibG9ja3Mub2spIHJldHVybiBzdWNjZXNzKHtcbiAgICBfX3Byb3RvX186IG51bGxcbiAgfSk7XG4gIGNvbnN0IGJvZHkgPSBibG9ja3MuYm9keS5yZWR1Y2UoZGVlcEFzc2lnbiwge1xuICAgIF9fcHJvdG9fXzogbnVsbFxuICB9KTtcbiAgcmV0dXJuIHN1Y2Nlc3MoYm9keSk7XG59XG5mdW5jdGlvbiBjcmVhdGVQYXJzZUVycm9yTWVzc2FnZShzY2FubmVyLCBtZXNzYWdlKSB7XG4gIGNvbnN0IHN0cmluZyA9IHNjYW5uZXIuc291cmNlLnNsaWNlKDAsIHNjYW5uZXIucG9zaXRpb24pO1xuICBjb25zdCBsaW5lcyA9IHN0cmluZy5zcGxpdChcIlxcblwiKTtcbiAgY29uc3Qgcm93ID0gbGluZXMubGVuZ3RoO1xuICBjb25zdCBjb2x1bW4gPSBsaW5lcy5hdCgtMSk/Lmxlbmd0aCA/PyAwO1xuICByZXR1cm4gYFBhcnNlIGVycm9yIG9uIGxpbmUgJHtyb3d9LCBjb2x1bW4gJHtjb2x1bW59OiAke21lc3NhZ2V9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZXJGYWN0b3J5KHBhcnNlcikge1xuICByZXR1cm4gKHRvbWxTdHJpbmcpPT57XG4gICAgY29uc3Qgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHRvbWxTdHJpbmcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgICBpZiAocmVzdWx0Lm9rICYmIHNjYW5uZXIuZW9mKCkpIHJldHVybiByZXN1bHQuYm9keTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVW5leHBlY3RlZCBjaGFyYWN0ZXI6IFwiJHtzY2FubmVyLmNoYXIoKX1cImA7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoY3JlYXRlUGFyc2VFcnJvck1lc3NhZ2Uoc2Nhbm5lciwgbWVzc2FnZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoY3JlYXRlUGFyc2VFcnJvck1lc3NhZ2Uoc2Nhbm5lciwgZXJyb3IubWVzc2FnZSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZSA9IFwiSW52YWxpZCBlcnJvciB0eXBlIGNhdWdodFwiO1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGNyZWF0ZVBhcnNlRXJyb3JNZXNzYWdlKHNjYW5uZXIsIG1lc3NhZ2UpKTtcbiAgICB9XG4gIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fcGFyc2VyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAyMDE4LTIwMjUgdGhlIERlbm8gYXV0aG9ycy4gTUlUIGxpY2Vuc2UuXG4vLyBUaGlzIG1vZHVsZSBpcyBicm93c2VyIGNvbXBhdGlibGUuXG5pbXBvcnQgeyBwYXJzZXJGYWN0b3J5LCB0b21sIH0gZnJvbSBcIi4vX3BhcnNlci5qc1wiO1xuLyoqXG4gKiBQYXJzZXMgYSB7QGxpbmsgaHR0cHM6Ly90b21sLmlvIHwgVE9NTH0gc3RyaW5nIGludG8gYW4gb2JqZWN0LlxuICpcbiAqIEBleGFtcGxlIFVzYWdlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiQHN0ZC90b21sL3BhcnNlXCI7XG4gKiBpbXBvcnQgeyBhc3NlcnRFcXVhbHMgfSBmcm9tIFwiQHN0ZC9hc3NlcnRcIjtcbiAqXG4gKiBjb25zdCB0b21sU3RyaW5nID0gYHRpdGxlID0gXCJUT01MIEV4YW1wbGVcIlxuICogW293bmVyXVxuICogbmFtZSA9IFwiQWxpY2VcIlxuICogYmlvID0gXCJBbGljZSBpcyBhIHByb2dyYW1tZXIuXCJgO1xuICpcbiAqIGNvbnN0IG9iaiA9IHBhcnNlKHRvbWxTdHJpbmcpO1xuICogYXNzZXJ0RXF1YWxzKG9iaiwgeyB0aXRsZTogXCJUT01MIEV4YW1wbGVcIiwgb3duZXI6IHsgbmFtZTogXCJBbGljZVwiLCBiaW86IFwiQWxpY2UgaXMgYSBwcm9ncmFtbWVyLlwiIH0gfSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB0b21sU3RyaW5nIFRPTUwgc3RyaW5nIHRvIGJlIHBhcnNlZC5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgSlMgb2JqZWN0LlxuICovIGV4cG9ydCBmdW5jdGlvbiBwYXJzZSh0b21sU3RyaW5nKSB7XG4gIHJldHVybiBwYXJzZXJGYWN0b3J5KHRvbWwpKHRvbWxTdHJpbmcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2UuanMubWFwIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBjb2RlZ2VuL2luZGV4LnRzXG4vLyBEbyBub3QgZWRpdCB0aGlzIGZpbGUgbWFudWFsbHlcbmltcG9ydCB7IENvbW1hbmQsIE9wdGlvbiB9IGZyb20gJ2NsaXBhbmlvbidcbmltcG9ydCAqIGFzIHR5cGFuaW9uIGZyb20gJ3R5cGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU5ld0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIHBhdGhzID0gW1snbmV3J11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246ICdDcmVhdGUgYSBuZXcgcHJvamVjdCB3aXRoIHByZS1jb25maWd1cmVkIGJvaWxlcnBsYXRlJyxcbiAgfSlcblxuICAkJHBhdGggPSBPcHRpb24uU3RyaW5nKHsgcmVxdWlyZWQ6IGZhbHNlIH0pXG5cbiAgJCRuYW1lPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1uYW1lLC1uJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LCBkZWZhdWx0IHRvIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaWYgbm90IHByb3ZpZGVkJyxcbiAgfSlcblxuICBtaW5Ob2RlQXBpVmVyc2lvbiA9IE9wdGlvbi5TdHJpbmcoJy0tbWluLW5vZGUtYXBpLC12JywgJzQnLCB7XG4gICAgdmFsaWRhdG9yOiB0eXBhbmlvbi5pc051bWJlcigpLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIG1pbmltdW0gTm9kZS1BUEkgdmVyc2lvbiB0byBzdXBwb3J0JyxcbiAgfSlcblxuICBwYWNrYWdlTWFuYWdlciA9IE9wdGlvbi5TdHJpbmcoJy0tcGFja2FnZS1tYW5hZ2VyJywgJ3lhcm4nLCB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZS4gT25seSBzdXBwb3J0IHlhcm4gNC54IGZvciBub3cuJyxcbiAgfSlcblxuICBsaWNlbnNlID0gT3B0aW9uLlN0cmluZygnLS1saWNlbnNlLC1sJywgJ01JVCcsIHtcbiAgICBkZXNjcmlwdGlvbjogJ0xpY2Vuc2UgZm9yIG9wZW4tc291cmNlZCBwcm9qZWN0JyxcbiAgfSlcblxuICB0YXJnZXRzID0gT3B0aW9uLkFycmF5KCctLXRhcmdldHMsLXQnLCBbXSwge1xuICAgIGRlc2NyaXB0aW9uOiAnQWxsIHRhcmdldHMgdGhlIGNyYXRlIHdpbGwgYmUgY29tcGlsZWQgZm9yLicsXG4gIH0pXG5cbiAgZW5hYmxlRGVmYXVsdFRhcmdldHMgPSBPcHRpb24uQm9vbGVhbignLS1lbmFibGUtZGVmYXVsdC10YXJnZXRzJywgdHJ1ZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBlbmFibGUgZGVmYXVsdCB0YXJnZXRzJyxcbiAgfSlcblxuICBlbmFibGVBbGxUYXJnZXRzID0gT3B0aW9uLkJvb2xlYW4oJy0tZW5hYmxlLWFsbC10YXJnZXRzJywgZmFsc2UsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgZW5hYmxlIGFsbCB0YXJnZXRzJyxcbiAgfSlcblxuICBlbmFibGVUeXBlRGVmID0gT3B0aW9uLkJvb2xlYW4oJy0tZW5hYmxlLXR5cGUtZGVmJywgdHJ1ZSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1doZXRoZXIgZW5hYmxlIHRoZSBgdHlwZS1kZWZgIGZlYXR1cmUgZm9yIHR5cGVzY3JpcHQgZGVmaW5pdGlvbnMgYXV0by1nZW5lcmF0aW9uJyxcbiAgfSlcblxuICBlbmFibGVHaXRodWJBY3Rpb25zID0gT3B0aW9uLkJvb2xlYW4oJy0tZW5hYmxlLWdpdGh1Yi1hY3Rpb25zJywgdHJ1ZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBnZW5lcmF0ZSBwcmVjb25maWd1cmVkIEdpdEh1YiBBY3Rpb25zIHdvcmtmbG93JyxcbiAgfSlcblxuICB0ZXN0RnJhbWV3b3JrID0gT3B0aW9uLlN0cmluZygnLS10ZXN0LWZyYW1ld29yaycsICdhdmEnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIEphdmFTY3JpcHQgdGVzdCBmcmFtZXdvcmsgdG8gdXNlLCBvbmx5IHN1cHBvcnQgYGF2YWAgZm9yIG5vdycsXG4gIH0pXG5cbiAgZHJ5UnVuID0gT3B0aW9uLkJvb2xlYW4oJy0tZHJ5LXJ1bicsIGZhbHNlLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHJ1biB0aGUgY29tbWFuZCBpbiBkcnktcnVuIG1vZGUnLFxuICB9KVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IHRoaXMuJCRwYXRoLFxuICAgICAgbmFtZTogdGhpcy4kJG5hbWUsXG4gICAgICBtaW5Ob2RlQXBpVmVyc2lvbjogdGhpcy5taW5Ob2RlQXBpVmVyc2lvbixcbiAgICAgIHBhY2thZ2VNYW5hZ2VyOiB0aGlzLnBhY2thZ2VNYW5hZ2VyLFxuICAgICAgbGljZW5zZTogdGhpcy5saWNlbnNlLFxuICAgICAgdGFyZ2V0czogdGhpcy50YXJnZXRzLFxuICAgICAgZW5hYmxlRGVmYXVsdFRhcmdldHM6IHRoaXMuZW5hYmxlRGVmYXVsdFRhcmdldHMsXG4gICAgICBlbmFibGVBbGxUYXJnZXRzOiB0aGlzLmVuYWJsZUFsbFRhcmdldHMsXG4gICAgICBlbmFibGVUeXBlRGVmOiB0aGlzLmVuYWJsZVR5cGVEZWYsXG4gICAgICBlbmFibGVHaXRodWJBY3Rpb25zOiB0aGlzLmVuYWJsZUdpdGh1YkFjdGlvbnMsXG4gICAgICB0ZXN0RnJhbWV3b3JrOiB0aGlzLnRlc3RGcmFtZXdvcmssXG4gICAgICBkcnlSdW46IHRoaXMuZHJ5UnVuLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBwcm9qZWN0IHdpdGggcHJlLWNvbmZpZ3VyZWQgYm9pbGVycGxhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXdPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHdoZXJlIHRoZSBOQVBJLVJTIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QsIGRlZmF1bHQgdG8gdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpZiBub3QgcHJvdmlkZWRcbiAgICovXG4gIG5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIE5vZGUtQVBJIHZlcnNpb24gdG8gc3VwcG9ydFxuICAgKlxuICAgKiBAZGVmYXVsdCA0XG4gICAqL1xuICBtaW5Ob2RlQXBpVmVyc2lvbj86IG51bWJlclxuICAvKipcbiAgICogVGhlIHBhY2thZ2UgbWFuYWdlciB0byB1c2UuIE9ubHkgc3VwcG9ydCB5YXJuIDQueCBmb3Igbm93LlxuICAgKlxuICAgKiBAZGVmYXVsdCAneWFybidcbiAgICovXG4gIHBhY2thZ2VNYW5hZ2VyPzogc3RyaW5nXG4gIC8qKlxuICAgKiBMaWNlbnNlIGZvciBvcGVuLXNvdXJjZWQgcHJvamVjdFxuICAgKlxuICAgKiBAZGVmYXVsdCAnTUlUJ1xuICAgKi9cbiAgbGljZW5zZT86IHN0cmluZ1xuICAvKipcbiAgICogQWxsIHRhcmdldHMgdGhlIGNyYXRlIHdpbGwgYmUgY29tcGlsZWQgZm9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgdGFyZ2V0cz86IHN0cmluZ1tdXG4gIC8qKlxuICAgKiBXaGV0aGVyIGVuYWJsZSBkZWZhdWx0IHRhcmdldHNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlRGVmYXVsdFRhcmdldHM/OiBib29sZWFuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGVuYWJsZSBhbGwgdGFyZ2V0c1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZW5hYmxlQWxsVGFyZ2V0cz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZW5hYmxlIHRoZSBgdHlwZS1kZWZgIGZlYXR1cmUgZm9yIHR5cGVzY3JpcHQgZGVmaW5pdGlvbnMgYXV0by1nZW5lcmF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZVR5cGVEZWY/OiBib29sZWFuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGdlbmVyYXRlIHByZWNvbmZpZ3VyZWQgR2l0SHViIEFjdGlvbnMgd29ya2Zsb3dcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlR2l0aHViQWN0aW9ucz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFRoZSBKYXZhU2NyaXB0IHRlc3QgZnJhbWV3b3JrIHRvIHVzZSwgb25seSBzdXBwb3J0IGBhdmFgIGZvciBub3dcbiAgICpcbiAgICogQGRlZmF1bHQgJ2F2YSdcbiAgICovXG4gIHRlc3RGcmFtZXdvcms/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBjb21tYW5kIGluIGRyeS1ydW4gbW9kZVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZHJ5UnVuPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlEZWZhdWx0TmV3T3B0aW9ucyhvcHRpb25zOiBOZXdPcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgbWluTm9kZUFwaVZlcnNpb246IDQsXG4gICAgcGFja2FnZU1hbmFnZXI6ICd5YXJuJyxcbiAgICBsaWNlbnNlOiAnTUlUJyxcbiAgICB0YXJnZXRzOiBbXSxcbiAgICBlbmFibGVEZWZhdWx0VGFyZ2V0czogdHJ1ZSxcbiAgICBlbmFibGVBbGxUYXJnZXRzOiBmYWxzZSxcbiAgICBlbmFibGVUeXBlRGVmOiB0cnVlLFxuICAgIGVuYWJsZUdpdGh1YkFjdGlvbnM6IHRydWUsXG4gICAgdGVzdEZyYW1ld29yazogJ2F2YScsXG4gICAgZHJ5UnVuOiBmYWxzZSxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBpc0Fic29sdXRlLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuLyoqXG4qIFJlc29sdmUgYW4gYWJzb2x1dGUgcGF0aCBmcm9tIHtAbGluayByb290fSwgYnV0IG9ubHlcbiogaWYge0BsaW5rIGlucHV0fSBpc24ndCBhbHJlYWR5IGFic29sdXRlLlxuKlxuKiBAcGFyYW0gaW5wdXQgVGhlIHBhdGggdG8gcmVzb2x2ZS5cbiogQHBhcmFtIHJvb3QgVGhlIGJhc2UgcGF0aDsgZGVmYXVsdCA9IHByb2Nlc3MuY3dkKClcbiogQHJldHVybnMgVGhlIHJlc29sdmVkIGFic29sdXRlIHBhdGguXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGFic29sdXRlKGlucHV0LCByb290KSB7XG5cdHJldHVybiBpc0Fic29sdXRlKGlucHV0KSA/IGlucHV0IDogcmVzb2x2ZShyb290IHx8IFwiLlwiLCBpbnB1dCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZnJvbShyb290LCBpZGVudCwgc2lsZW50KSB7XG5cdHRyeSB7XG5cdFx0Ly8gTk9URTogZGlycyBuZWVkIGEgdHJhaWxpbmcgXCIvXCIgT1IgZmlsZW5hbWUuIFdpdGggXCIvXCIgcm91dGUsXG5cdFx0Ly8gTm9kZSBhZGRzIFwibm9vcC5qc1wiIGFzIG1haW4gZmlsZSwgc28ganVzdCBkbyBcIm5vb3AuanNcIiBhbnl3YXkuXG5cdFx0bGV0IHIgPSByb290IGluc3RhbmNlb2YgVVJMIHx8IHJvb3Quc3RhcnRzV2l0aChcImZpbGU6Ly9cIikgPyBqb2luKGZpbGVVUkxUb1BhdGgocm9vdCksIFwibm9vcC5qc1wiKSA6IGpvaW4oYWJzb2x1dGUocm9vdCksIFwibm9vcC5qc1wiKTtcblx0XHRyZXR1cm4gY3JlYXRlUmVxdWlyZShyKS5yZXNvbHZlKGlkZW50KTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0aWYgKCFzaWxlbnQpIHRocm93IGVycjtcblx0fVxufVxuZXhwb3J0IGZ1bmN0aW9uIGN3ZChpZGVudCwgc2lsZW50KSB7XG5cdHJldHVybiBmcm9tKHJlc29sdmUoKSwgaWRlbnQsIHNpbGVudCk7XG59XG4iLCJpbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgYWJzb2x1dGUgfSBmcm9tIFwiZW1wYXRoaWMvcmVzb2x2ZVwiO1xuLyoqXG4qIEdldCBhbGwgcGFyZW50IGRpcmVjdG9yaWVzIG9mIHtAbGluayBiYXNlfS5cbiogU3RvcHMgYWZ0ZXIge0BsaW5rIE9wdGlvbnNbJ2xhc3QnXX0gaXMgcHJvY2Vzc2VkLlxuKlxuKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhYnNvbHV0ZSBwYXRocyBvZiBhbGwgcGFyZW50IGRpcmVjdG9yaWVzLlxuKi9cbmV4cG9ydCBmdW5jdGlvbiB1cChiYXNlLCBvcHRpb25zKSB7XG5cdGxldCB7IGxhc3QsIGN3ZCB9ID0gb3B0aW9ucyB8fCB7fTtcblx0bGV0IHRtcCA9IGFic29sdXRlKGJhc2UsIGN3ZCk7XG5cdGxldCByb290ID0gYWJzb2x1dGUobGFzdCB8fCBcIi9cIiwgY3dkKTtcblx0bGV0IHByZXYsIGFyciA9IFtdO1xuXHR3aGlsZSAocHJldiAhPT0gcm9vdCkge1xuXHRcdGFyci5wdXNoKHRtcCk7XG5cdFx0dG1wID0gZGlybmFtZShwcmV2ID0gdG1wKTtcblx0XHRpZiAodG1wID09PSBwcmV2KSBicmVhaztcblx0fVxuXHRyZXR1cm4gYXJyO1xufVxuIiwiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMsIHN0YXRTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCAqIGFzIHdhbGsgZnJvbSBcImVtcGF0aGljL3dhbGtcIjtcbi8qKlxuKiBGaW5kIGFuIGl0ZW0gYnkgbmFtZSwgd2Fsa2luZyBwYXJlbnQgZGlyZWN0b3JpZXMgdW50aWwgZm91bmQuXG4qXG4qIEBwYXJhbSBuYW1lIFRoZSBpdGVtIG5hbWUgdG8gZmluZC5cbiogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGl0ZW0sIGlmIGZvdW5kLlxuKi9cbmV4cG9ydCBmdW5jdGlvbiB1cChuYW1lLCBvcHRpb25zKSB7XG5cdGxldCBkaXIsIHRtcDtcblx0bGV0IHN0YXJ0ID0gb3B0aW9ucyAmJiBvcHRpb25zLmN3ZCB8fCBcIlwiO1xuXHRmb3IgKGRpciBvZiB3YWxrLnVwKHN0YXJ0LCBvcHRpb25zKSkge1xuXHRcdHRtcCA9IGpvaW4oZGlyLCBuYW1lKTtcblx0XHRpZiAoZXhpc3RzU3luYyh0bXApKSByZXR1cm4gdG1wO1xuXHR9XG59XG4vKipcbiogR2V0IHRoZSBmaXJzdCBwYXRoIHRoYXQgbWF0Y2hlcyBhbnkgb2YgdGhlIG5hbWVzIHByb3ZpZGVkLlxuKlxuKiA+IFtOT1RFXVxuKiA+IFRoZSBvcmRlciBvZiB7QGxpbmsgbmFtZXN9IGlzIHJlc3BlY3RlZC5cbipcbiogQHBhcmFtIG5hbWVzIFRoZSBpdGVtIG5hbWVzIHRvIGZpbmQuXG4qIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaXJzdCBpdGVtIGZvdW5kLCBpZiBhbnkuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGFueShuYW1lcywgb3B0aW9ucykge1xuXHRsZXQgZGlyLCBzdGFydCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jd2QgfHwgXCJcIjtcblx0bGV0IGogPSAwLCBsZW4gPSBuYW1lcy5sZW5ndGgsIHRtcDtcblx0Zm9yIChkaXIgb2Ygd2Fsay51cChzdGFydCwgb3B0aW9ucykpIHtcblx0XHRmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcblx0XHRcdHRtcCA9IGpvaW4oZGlyLCBuYW1lc1tqXSk7XG5cdFx0XHRpZiAoZXhpc3RzU3luYyh0bXApKSByZXR1cm4gdG1wO1xuXHRcdH1cblx0fVxufVxuLyoqXG4qIEZpbmQgYSBmaWxlIGJ5IG5hbWUsIHdhbGtpbmcgcGFyZW50IGRpcmVjdG9yaWVzIHVudGlsIGZvdW5kLlxuKlxuKiA+IFtOT1RFXVxuKiA+IFRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIGEgdmFsdWUgZm9yIGZpbGUgbWF0Y2hlcy5cbiogPiBBIGRpcmVjdG9yeSBtYXRjaCB3aXRoIHRoZSBzYW1lIG5hbWUgd2lsbCBiZSBpZ25vcmVkLlxuKlxuKiBAcGFyYW0gbmFtZSBUaGUgZmlsZSBuYW1lIHRvIGZpbmQuXG4qIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlLCBpZiBmb3VuZC5cbiovXG5leHBvcnQgZnVuY3Rpb24gZmlsZShuYW1lLCBvcHRpb25zKSB7XG5cdGxldCBkaXIsIHRtcDtcblx0bGV0IHN0YXJ0ID0gb3B0aW9ucyAmJiBvcHRpb25zLmN3ZCB8fCBcIlwiO1xuXHRmb3IgKGRpciBvZiB3YWxrLnVwKHN0YXJ0LCBvcHRpb25zKSkge1xuXHRcdHRyeSB7XG5cdFx0XHR0bXAgPSBqb2luKGRpciwgbmFtZSk7XG5cdFx0XHRpZiAoc3RhdFN5bmModG1wKS5pc0ZpbGUoKSkgcmV0dXJuIHRtcDtcblx0XHR9IGNhdGNoIHt9XG5cdH1cbn1cbi8qKlxuKiBGaW5kIGEgZGlyZWN0b3J5IGJ5IG5hbWUsIHdhbGtpbmcgcGFyZW50IGRpcmVjdG9yaWVzIHVudGlsIGZvdW5kLlxuKlxuKiA+IFtOT1RFXVxuKiA+IFRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIGEgdmFsdWUgZm9yIGRpcmVjdG9yeSBtYXRjaGVzLlxuKiA+IEEgZmlsZSBtYXRjaCB3aXRoIHRoZSBzYW1lIG5hbWUgd2lsbCBiZSBpZ25vcmVkLlxuKlxuKiBAcGFyYW0gbmFtZSBUaGUgZGlyZWN0b3J5IG5hbWUgdG8gZmluZC5cbiogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUsIGlmIGZvdW5kLlxuKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXIobmFtZSwgb3B0aW9ucykge1xuXHRsZXQgZGlyLCB0bXA7XG5cdGxldCBzdGFydCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jd2QgfHwgXCJcIjtcblx0Zm9yIChkaXIgb2Ygd2Fsay51cChzdGFydCwgb3B0aW9ucykpIHtcblx0XHR0cnkge1xuXHRcdFx0dG1wID0gam9pbihkaXIsIG5hbWUpO1xuXHRcdFx0aWYgKHN0YXRTeW5jKHRtcCkuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHRtcDtcblx0XHR9IGNhdGNoIHt9XG5cdH1cbn1cbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgY29kZWdlbi9pbmRleC50c1xuLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlIG1hbnVhbGx5XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlUmVuYW1lQ29tbWFuZCBleHRlbmRzIENvbW1hbmQge1xuICBzdGF0aWMgcGF0aHMgPSBbWydyZW5hbWUnXV1cblxuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlbmFtZSB0aGUgTkFQSS1SUyBwcm9qZWN0JyxcbiAgfSlcblxuICBjd2QgPSBPcHRpb24uU3RyaW5nKCctLWN3ZCcsIHByb2Nlc3MuY3dkKCksIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGgnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsICdwYWNrYWdlLmpzb24nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBwYWNrYWdlLmpzb25gJyxcbiAgfSlcblxuICBucG1EaXIgPSBPcHRpb24uU3RyaW5nKCctLW5wbS1kaXInLCAnbnBtJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0JyxcbiAgfSlcblxuICAkJG5hbWU/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLW5hbWUsLW4nLCB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgbmV3IG5hbWUgb2YgdGhlIHByb2plY3QnLFxuICB9KVxuXG4gIGJpbmFyeU5hbWU/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWJpbmFyeS1uYW1lLC1iJywge1xuICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5ldyBiaW5hcnkgbmFtZSAqLm5vZGUgZmlsZXMnLFxuICB9KVxuXG4gIHBhY2thZ2VOYW1lPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLW5hbWUnLCB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgbmV3IHBhY2thZ2UgbmFtZSBvZiB0aGUgcHJvamVjdCcsXG4gIH0pXG5cbiAgbWFuaWZlc3RQYXRoID0gT3B0aW9uLlN0cmluZygnLS1tYW5pZmVzdC1wYXRoJywgJ0NhcmdvLnRvbWwnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBDYXJnby50b21sYCcsXG4gIH0pXG5cbiAgcmVwb3NpdG9yeT86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tcmVwb3NpdG9yeScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBuZXcgcmVwb3NpdG9yeSBvZiB0aGUgcHJvamVjdCcsXG4gIH0pXG5cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWRlc2NyaXB0aW9uJywge1xuICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5ldyBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvamVjdCcsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgIGNvbmZpZ1BhdGg6IHRoaXMuY29uZmlnUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uUGF0aDogdGhpcy5wYWNrYWdlSnNvblBhdGgsXG4gICAgICBucG1EaXI6IHRoaXMubnBtRGlyLFxuICAgICAgbmFtZTogdGhpcy4kJG5hbWUsXG4gICAgICBiaW5hcnlOYW1lOiB0aGlzLmJpbmFyeU5hbWUsXG4gICAgICBwYWNrYWdlTmFtZTogdGhpcy5wYWNrYWdlTmFtZSxcbiAgICAgIG1hbmlmZXN0UGF0aDogdGhpcy5tYW5pZmVzdFBhdGgsXG4gICAgICByZXBvc2l0b3J5OiB0aGlzLnJlcG9zaXRvcnksXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5hbWUgdGhlIE5BUEktUlMgcHJvamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoXG4gICAqXG4gICAqIEBkZWZhdWx0IHByb2Nlc3MuY3dkKClcbiAgICovXG4gIGN3ZD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZVxuICAgKi9cbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgcGFja2FnZS5qc29uYFxuICAgKlxuICAgKiBAZGVmYXVsdCAncGFja2FnZS5qc29uJ1xuICAgKi9cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXRcbiAgICpcbiAgICogQGRlZmF1bHQgJ25wbSdcbiAgICovXG4gIG5wbURpcj86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG5ldyBuYW1lIG9mIHRoZSBwcm9qZWN0XG4gICAqL1xuICBuYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmV3IGJpbmFyeSBuYW1lICoubm9kZSBmaWxlc1xuICAgKi9cbiAgYmluYXJ5TmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG5ldyBwYWNrYWdlIG5hbWUgb2YgdGhlIHByb2plY3RcbiAgICovXG4gIHBhY2thZ2VOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBDYXJnby50b21sYFxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ2FyZ28udG9tbCdcbiAgICovXG4gIG1hbmlmZXN0UGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG5ldyByZXBvc2l0b3J5IG9mIHRoZSBwcm9qZWN0XG4gICAqL1xuICByZXBvc2l0b3J5Pzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmV3IGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0XG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlEZWZhdWx0UmVuYW1lT3B0aW9ucyhvcHRpb25zOiBSZW5hbWVPcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIHBhY2thZ2VKc29uUGF0aDogJ3BhY2thZ2UuanNvbicsXG4gICAgbnBtRGlyOiAnbnBtJyxcbiAgICBtYW5pZmVzdFBhdGg6ICdDYXJnby50b21sJyxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IHJlbmFtZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyByZXNvbHZlLCBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVRvbWwsIHN0cmluZ2lmeSBhcyBzdHJpbmdpZnlUb21sIH0gZnJvbSAnQHN0ZC90b21sJ1xuaW1wb3J0IHsgbG9hZCBhcyB5YW1sUGFyc2UsIGR1bXAgYXMgeWFtbFN0cmluZ2lmeSB9IGZyb20gJ2pzLXlhbWwnXG5pbXBvcnQgeyBpc05pbCwgbWVyZ2UsIG9taXRCeSwgcGljayB9IGZyb20gJ2VzLXRvb2xraXQnXG5pbXBvcnQgKiBhcyBmaW5kIGZyb20gJ2VtcGF0aGljL2ZpbmQnXG5cbmltcG9ydCB7IGFwcGx5RGVmYXVsdFJlbmFtZU9wdGlvbnMsIHR5cGUgUmVuYW1lT3B0aW9ucyB9IGZyb20gJy4uL2RlZi9yZW5hbWUuanMnXG5pbXBvcnQgeyByZWFkQ29uZmlnLCByZWFkRmlsZUFzeW5jLCB3cml0ZUZpbGVBc3luYyB9IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuYW1lUHJvamVjdCh1c2VyT3B0aW9uczogUmVuYW1lT3B0aW9ucykge1xuICBjb25zdCBvcHRpb25zID0gYXBwbHlEZWZhdWx0UmVuYW1lT3B0aW9ucyh1c2VyT3B0aW9ucylcbiAgY29uc3QgbmFwaUNvbmZpZyA9IGF3YWl0IHJlYWRDb25maWcob3B0aW9ucylcbiAgY29uc3Qgb2xkTmFtZSA9IG5hcGlDb25maWcuYmluYXJ5TmFtZVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMucGFja2FnZUpzb25QYXRoKVxuICBjb25zdCBjYXJnb1RvbWxQYXRoID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5tYW5pZmVzdFBhdGgpXG5cbiAgY29uc3QgcGFja2FnZUpzb25Db250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JylcbiAgY29uc3QgcGFja2FnZUpzb25EYXRhID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvbkNvbnRlbnQpXG5cbiAgbWVyZ2UoXG4gICAgbWVyZ2UoXG4gICAgICBwYWNrYWdlSnNvbkRhdGEsXG4gICAgICBvbWl0QnkoXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbWlzc2luZyBmaWVsZHM6IGF1dGhvciBhbmQgbGljZW5zZVxuICAgICAgICBwaWNrKG9wdGlvbnMsIFsnbmFtZScsICdkZXNjcmlwdGlvbicsICdhdXRob3InLCAnbGljZW5zZSddKSxcbiAgICAgICAgaXNOaWwsXG4gICAgICApLFxuICAgICksXG4gICAge1xuICAgICAgbmFwaTogb21pdEJ5KFxuICAgICAgICB7XG4gICAgICAgICAgYmluYXJ5TmFtZTogb3B0aW9ucy5iaW5hcnlOYW1lLFxuICAgICAgICAgIHBhY2thZ2VOYW1lOiBvcHRpb25zLnBhY2thZ2VOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBpc05pbCxcbiAgICAgICksXG4gICAgfSxcbiAgKVxuXG4gIGlmIChvcHRpb25zLnJlcG9zaXRvcnkpIHtcbiAgICBpZiAoXG4gICAgICBwYWNrYWdlSnNvbkRhdGEucmVwb3NpdG9yeSAmJlxuICAgICAgdHlwZW9mIHBhY2thZ2VKc29uRGF0YS5yZXBvc2l0b3J5ID09PSAnb2JqZWN0JyAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkocGFja2FnZUpzb25EYXRhLnJlcG9zaXRvcnkpXG4gICAgKSB7XG4gICAgICBwYWNrYWdlSnNvbkRhdGEucmVwb3NpdG9yeS51cmwgPSBvcHRpb25zLnJlcG9zaXRvcnlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFja2FnZUpzb25EYXRhLnJlcG9zaXRvcnkgPSBvcHRpb25zLnJlcG9zaXRvcnlcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucy5jb25maWdQYXRoKSB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMuY29uZmlnUGF0aClcbiAgICBjb25zdCBjb25maWdDb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhjb25maWdQYXRoLCAndXRmOCcpXG4gICAgY29uc3QgY29uZmlnRGF0YSA9IEpTT04ucGFyc2UoY29uZmlnQ29udGVudClcbiAgICBtZXJnZShcbiAgICAgIGNvbmZpZ0RhdGEsXG4gICAgICBvbWl0QnkoXG4gICAgICAgIHtcbiAgICAgICAgICBiaW5hcnlOYW1lOiBvcHRpb25zLmJpbmFyeU5hbWUsXG4gICAgICAgICAgcGFja2FnZU5hbWU6IG9wdGlvbnMucGFja2FnZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGlzTmlsLFxuICAgICAgKSxcbiAgICApXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnRGF0YSwgbnVsbCwgMikpXG4gIH1cblxuICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICBwYWNrYWdlSnNvblBhdGgsXG4gICAgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb25EYXRhLCBudWxsLCAyKSxcbiAgKVxuXG4gIGNvbnN0IHRvbWxDb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhjYXJnb1RvbWxQYXRoLCAndXRmOCcpXG4gIGNvbnN0IGNhcmdvVG9tbCA9IHBhcnNlVG9tbCh0b21sQ29udGVudCkgYXMgYW55XG5cbiAgLy8gVXBkYXRlIHRoZSBwYWNrYWdlIG5hbWVcbiAgaWYgKGNhcmdvVG9tbC5wYWNrYWdlICYmIG9wdGlvbnMuYmluYXJ5TmFtZSkge1xuICAgIC8vIFNhbml0aXplIHRoZSBiaW5hcnkgbmFtZSBmb3IgUnVzdCBwYWNrYWdlIG5hbWluZyBjb252ZW50aW9uc1xuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBvcHRpb25zLmJpbmFyeU5hbWVcbiAgICAgIC5yZXBsYWNlKCdAJywgJycpXG4gICAgICAucmVwbGFjZSgnLycsICdfJylcbiAgICAgIC5yZXBsYWNlKC8tL2csICdfJylcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgY2FyZ29Ub21sLnBhY2thZ2UubmFtZSA9IHNhbml0aXplZE5hbWVcbiAgfVxuXG4gIC8vIFN0cmluZ2lmeSB0aGUgdXBkYXRlZCBUT01MXG4gIGNvbnN0IHVwZGF0ZWRUb21sQ29udGVudCA9IHN0cmluZ2lmeVRvbWwoY2FyZ29Ub21sKVxuXG4gIGF3YWl0IHdyaXRlRmlsZUFzeW5jKGNhcmdvVG9tbFBhdGgsIHVwZGF0ZWRUb21sQ29udGVudClcbiAgaWYgKG9wdGlvbnMuYmluYXJ5TmFtZSAmJiBvbGROYW1lICE9PSBvcHRpb25zLmJpbmFyeU5hbWUpIHtcbiAgICBjb25zdCBnaXRodWJBY3Rpb25zUGF0aCA9IGZpbmQuZGlyKCcuZ2l0aHViJywge1xuICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICB9KVxuICAgIGlmIChnaXRodWJBY3Rpb25zUGF0aCkge1xuICAgICAgY29uc3QgZ2l0aHViQWN0aW9uc0NJWW1sUGF0aCA9IGpvaW4oXG4gICAgICAgIGdpdGh1YkFjdGlvbnNQYXRoLFxuICAgICAgICAnd29ya2Zsb3dzJyxcbiAgICAgICAgJ0NJLnltbCcsXG4gICAgICApXG4gICAgICBpZiAoZXhpc3RzU3luYyhnaXRodWJBY3Rpb25zQ0lZbWxQYXRoKSkge1xuICAgICAgICBjb25zdCBnaXRodWJBY3Rpb25zQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlQXN5bmMoXG4gICAgICAgICAgZ2l0aHViQWN0aW9uc0NJWW1sUGF0aCxcbiAgICAgICAgICAndXRmOCcsXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgZ2l0aHViQWN0aW9uc0RhdGEgPSB5YW1sUGFyc2UoZ2l0aHViQWN0aW9uc0NvbnRlbnQpIGFzIGFueVxuICAgICAgICBpZiAoZ2l0aHViQWN0aW9uc0RhdGEuZW52Py5BUFBfTkFNRSkge1xuICAgICAgICAgIGdpdGh1YkFjdGlvbnNEYXRhLmVudi5BUFBfTkFNRSA9IG9wdGlvbnMuYmluYXJ5TmFtZVxuICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKFxuICAgICAgICAgICAgZ2l0aHViQWN0aW9uc0NJWW1sUGF0aCxcbiAgICAgICAgICAgIHlhbWxTdHJpbmdpZnkoZ2l0aHViQWN0aW9uc0RhdGEsIHtcbiAgICAgICAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICAgICAgICBzb3J0S2V5czogZmFsc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb2xkV2FzaUJyb3dzZXJCaW5kaW5nUGF0aCA9IGpvaW4oXG4gICAgICBvcHRpb25zLmN3ZCxcbiAgICAgIGAke29sZE5hbWV9Lndhc2ktYnJvd3Nlci5qc2AsXG4gICAgKVxuICAgIGlmIChleGlzdHNTeW5jKG9sZFdhc2lCcm93c2VyQmluZGluZ1BhdGgpKSB7XG4gICAgICBhd2FpdCByZW5hbWUoXG4gICAgICAgIG9sZFdhc2lCcm93c2VyQmluZGluZ1BhdGgsXG4gICAgICAgIGpvaW4ob3B0aW9ucy5jd2QsIGAke29wdGlvbnMuYmluYXJ5TmFtZX0ud2FzaS1icm93c2VyLmpzYCksXG4gICAgICApXG4gICAgfVxuICAgIGNvbnN0IG9sZFdhc2lCaW5kaW5nUGF0aCA9IGpvaW4ob3B0aW9ucy5jd2QsIGAke29sZE5hbWV9Lndhc2kuY2pzYClcbiAgICBpZiAoZXhpc3RzU3luYyhvbGRXYXNpQmluZGluZ1BhdGgpKSB7XG4gICAgICBhd2FpdCByZW5hbWUoXG4gICAgICAgIG9sZFdhc2lCaW5kaW5nUGF0aCxcbiAgICAgICAgam9pbihvcHRpb25zLmN3ZCwgYCR7b3B0aW9ucy5iaW5hcnlOYW1lfS53YXNpLmNqc2ApLFxuICAgICAgKVxuICAgIH1cbiAgICBjb25zdCBnaXRBdHRyaWJ1dGVzUGF0aCA9IGpvaW4ob3B0aW9ucy5jd2QsICcuZ2l0YXR0cmlidXRlcycpXG4gICAgaWYgKGV4aXN0c1N5bmMoZ2l0QXR0cmlidXRlc1BhdGgpKSB7XG4gICAgICBjb25zdCBnaXRBdHRyaWJ1dGVzQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlQXN5bmMoXG4gICAgICAgIGdpdEF0dHJpYnV0ZXNQYXRoLFxuICAgICAgICAndXRmOCcsXG4gICAgICApXG4gICAgICBjb25zdCBnaXRBdHRyaWJ1dGVzRGF0YSA9IGdpdEF0dHJpYnV0ZXNDb250ZW50XG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBsaW5lXG4gICAgICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAgICAgYCR7b2xkTmFtZX0ud2FzaS1icm93c2VyLmpzYCxcbiAgICAgICAgICAgICAgYCR7b3B0aW9ucy5iaW5hcnlOYW1lfS53YXNpLWJyb3dzZXIuanNgLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlcGxhY2UoYCR7b2xkTmFtZX0ud2FzaS5janNgLCBgJHtvcHRpb25zLmJpbmFyeU5hbWV9Lndhc2kuY2pzYClcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhnaXRBdHRyaWJ1dGVzUGF0aCwgZ2l0QXR0cmlidXRlc0RhdGEpXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBleGVjLCBleGVjU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ25vZGU6b3MnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5cbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlVG9tbCwgc3RyaW5naWZ5IGFzIHN0cmluZ2lmeVRvbWwgfSBmcm9tICdAc3RkL3RvbWwnXG5pbXBvcnQgeyBsb2FkIGFzIHlhbWxMb2FkLCBkdW1wIGFzIHlhbWxEdW1wIH0gZnJvbSAnanMteWFtbCdcblxuaW1wb3J0IHtcbiAgYXBwbHlEZWZhdWx0TmV3T3B0aW9ucyxcbiAgdHlwZSBOZXdPcHRpb25zIGFzIFJhd05ld09wdGlvbnMsXG59IGZyb20gJy4uL2RlZi9uZXcuanMnXG5pbXBvcnQge1xuICBBVkFJTEFCTEVfVEFSR0VUUyxcbiAgZGVidWdGYWN0b3J5LFxuICBERUZBVUxUX1RBUkdFVFMsXG4gIG1rZGlyQXN5bmMsXG4gIHBhcnNlVHJpcGxlLFxuICByZWFkZGlyQXN5bmMsXG4gIHN0YXRBc3luYyxcbiAgdHlwZSBTdXBwb3J0ZWRQYWNrYWdlTWFuYWdlcixcbn0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5pbXBvcnQgeyBuYXBpRW5naW5lUmVxdWlyZW1lbnQgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJ1xuaW1wb3J0IHsgcmVuYW1lUHJvamVjdCB9IGZyb20gJy4vcmVuYW1lLmpzJ1xuXG4vLyBUZW1wbGF0ZSBpbXBvcnRzIHJlbW92ZWQgYXMgd2UncmUgbm93IHVzaW5nIGV4dGVybmFsIHRlbXBsYXRlc1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgnbmV3JylcblxudHlwZSBOZXdPcHRpb25zID0gUmVxdWlyZWQ8UmF3TmV3T3B0aW9ucz5cblxuY29uc3QgVEVNUExBVEVfUkVQT1MgPSB7XG4gIHlhcm46ICdodHRwczovL2dpdGh1Yi5jb20vbmFwaS1ycy9wYWNrYWdlLXRlbXBsYXRlJyxcbiAgcG5wbTogJ2h0dHBzOi8vZ2l0aHViLmNvbS9uYXBpLXJzL3BhY2thZ2UtdGVtcGxhdGUtcG5wbScsXG59IGFzIGNvbnN0XG5cbmNvbnN0IFdBU0lfVEFSR0VUID0gJ3dhc20zMi13YXNpcDEtdGhyZWFkcydcblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tHaXRDb21tYW5kKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBjcCA9IGV4ZWMoJ2dpdCAtLXZlcnNpb24nKVxuICAgIGNwLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgfSlcbiAgICBjcC5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICByZXNvbHZlKGNvZGUgPT09IDApXG4gICAgfSlcbiAgfSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ2FjaGVEaXIoXG4gIHBhY2thZ2VNYW5hZ2VyOiBTdXBwb3J0ZWRQYWNrYWdlTWFuYWdlcixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlRGlyID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5uYXBpLXJzJywgJ3RlbXBsYXRlJywgcGFja2FnZU1hbmFnZXIpXG4gIGF3YWl0IG1rZGlyQXN5bmMoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gIHJldHVybiBjYWNoZURpclxufVxuXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZFRlbXBsYXRlKFxuICBwYWNrYWdlTWFuYWdlcjogU3VwcG9ydGVkUGFja2FnZU1hbmFnZXIsXG4gIGNhY2hlRGlyOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb1VybCA9IFRFTVBMQVRFX1JFUE9TW3BhY2thZ2VNYW5hZ2VyXVxuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4oY2FjaGVEaXIsICdyZXBvJylcblxuICBpZiAoZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgZGVidWcoYFRlbXBsYXRlIGNhY2hlIGZvdW5kIGF0ICR7dGVtcGxhdGVQYXRofSwgdXBkYXRpbmcuLi5gKVxuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBsYXRlc3QgY2hhbmdlcyBhbmQgcmVzZXQgdG8gcmVtb3RlXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNwID0gZXhlYygnZ2l0IGZldGNoIG9yaWdpbicsIHsgY3dkOiB0ZW1wbGF0ZVBhdGggfSlcbiAgICAgICAgY3Aub24oJ2Vycm9yJywgcmVqZWN0KVxuICAgICAgICBjcC5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGZldGNoIGxhdGVzdCBjaGFuZ2VzLCBnaXQgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICBleGVjU3luYygnZ2l0IHJlc2V0IC0taGFyZCBvcmlnaW4vbWFpbicsIHtcbiAgICAgICAgY3dkOiB0ZW1wbGF0ZVBhdGgsXG4gICAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICAgIH0pXG4gICAgICBkZWJ1ZygnVGVtcGxhdGUgdXBkYXRlZCBzdWNjZXNzZnVsbHknKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBkZWJ1ZyhgRmFpbGVkIHRvIHVwZGF0ZSB0ZW1wbGF0ZTogJHtlcnJvcn1gKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gdXBkYXRlIHRlbXBsYXRlIGZyb20gJHtyZXBvVXJsfTogJHtlcnJvcn1gKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWJ1ZyhgQ2xvbmluZyB0ZW1wbGF0ZSBmcm9tICR7cmVwb1VybH0uLi5gKVxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7cmVwb1VybH0gcmVwb2AsIHsgY3dkOiBjYWNoZURpciwgc3RkaW86ICdpbmhlcml0JyB9KVxuICAgICAgZGVidWcoJ1RlbXBsYXRlIGNsb25lZCBzdWNjZXNzZnVsbHknKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjbG9uZSB0ZW1wbGF0ZSBmcm9tICR7cmVwb1VybH06ICR7ZXJyb3J9YClcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weURpcmVjdG9yeShcbiAgc3JjOiBzdHJpbmcsXG4gIGRlc3Q6IHN0cmluZyxcbiAgaW5jbHVkZVdhc2lCaW5kaW5nczogYm9vbGVhbixcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2RpckFzeW5jKGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHNyYywgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihzcmMsIGVudHJ5Lm5hbWUpXG4gICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdCwgZW50cnkubmFtZSlcblxuICAgIC8vIFNraXAgLmdpdCBkaXJlY3RvcnlcbiAgICBpZiAoZW50cnkubmFtZSA9PT0gJy5naXQnKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCBjb3B5RGlyZWN0b3J5KHNyY1BhdGgsIGRlc3RQYXRoLCBpbmNsdWRlV2FzaUJpbmRpbmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgICFpbmNsdWRlV2FzaUJpbmRpbmdzICYmXG4gICAgICAgIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcud2FzaS1icm93c2VyLmpzJykgfHxcbiAgICAgICAgICBlbnRyeS5uYW1lLmVuZHNXaXRoKCcud2FzaS5janMnKSB8fFxuICAgICAgICAgIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJ3dhc2ktd29ya2VyLWJyb3dzZXIubWpzJykgfHxcbiAgICAgICAgICBlbnRyeS5uYW1lLmVuZHNXaXRoKCd3YXNpLXdvcmtlci5tanMnKSB8fFxuICAgICAgICAgIGVudHJ5Lm5hbWUgPT09ICdicm93c2VyLmpzJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgYXdhaXQgZnMuY29weUZpbGUoc3JjUGF0aCwgZGVzdFBhdGgpXG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbHRlclRhcmdldHNJblBhY2thZ2VKc29uKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBlbmFibGVkVGFyZ2V0czogc3RyaW5nW10sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoY29udGVudClcbiAgY29uc3QgaW5jbHVkZVdhc2lCaW5kaW5ncyA9IGVuYWJsZWRUYXJnZXRzLmluY2x1ZGVzKFdBU0lfVEFSR0VUKVxuXG4gIC8vIEZpbHRlciBuYXBpLnRhcmdldHNcbiAgaWYgKHBhY2thZ2VKc29uLm5hcGk/LnRhcmdldHMpIHtcbiAgICBwYWNrYWdlSnNvbi5uYXBpLnRhcmdldHMgPSBwYWNrYWdlSnNvbi5uYXBpLnRhcmdldHMuZmlsdGVyKFxuICAgICAgKHRhcmdldDogc3RyaW5nKSA9PiBlbmFibGVkVGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpLFxuICAgIClcbiAgfVxuXG4gIGlmICghaW5jbHVkZVdhc2lCaW5kaW5ncykge1xuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uLmJyb3dzZXIgPT09ICdicm93c2VyLmpzJyB8fFxuICAgICAgcGFja2FnZUpzb24uYnJvd3NlciA9PT0gJy4vYnJvd3Nlci5qcydcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5icm93c2VyXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFja2FnZUpzb24uZmlsZXMpKSB7XG4gICAgICBwYWNrYWdlSnNvbi5maWxlcyA9IHBhY2thZ2VKc29uLmZpbGVzLmZpbHRlcihcbiAgICAgICAgKGZpbGU6IHVua25vd24pID0+IGZpbGUgIT09ICdicm93c2VyLmpzJyAmJiBmaWxlICE9PSAnLi9icm93c2VyLmpzJyxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCAyKSArICdcXG4nKVxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVDYXJnb1RvbWxUeXBlRGVmKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBlbmFibGVUeXBlRGVmOiBib29sZWFuLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChlbmFibGVUeXBlRGVmKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpXG4gIGNvbnN0IGNhcmdvVG9tbCA9IHBhcnNlVG9tbChjb250ZW50KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IGNhcmdvVG9tbC5kZXBlbmRlbmNpZXNcblxuICBpZiAoIWRlcGVuZGVuY2llcyB8fCAhZGVwZW5kZW5jaWVzWyduYXBpLWRlcml2ZSddKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBuYXBpRGVyaXZlRGVwZW5kZW5jeSA9IGRlcGVuZGVuY2llc1snbmFwaS1kZXJpdmUnXVxuICBjb25zdCBkZXBlbmRlbmN5Q29uZmlnID1cbiAgICB0eXBlb2YgbmFwaURlcml2ZURlcGVuZGVuY3kgPT09ICdzdHJpbmcnXG4gICAgICA/IHsgdmVyc2lvbjogbmFwaURlcml2ZURlcGVuZGVuY3kgfVxuICAgICAgOiB7IC4uLm5hcGlEZXJpdmVEZXBlbmRlbmN5IH1cblxuICBjb25zdCBleGlzdGluZ0ZlYXR1cmVzOiBzdHJpbmdbXSA9IEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeUNvbmZpZy5mZWF0dXJlcylcbiAgICA/IGRlcGVuZGVuY3lDb25maWcuZmVhdHVyZXMuZmlsdGVyKFxuICAgICAgICAoZmVhdHVyZTogdW5rbm93bik6IGZlYXR1cmUgaXMgc3RyaW5nID0+IHR5cGVvZiBmZWF0dXJlID09PSAnc3RyaW5nJyxcbiAgICAgIClcbiAgICA6IFtdXG5cbiAgZGVwZW5kZW5jeUNvbmZpZ1snZGVmYXVsdC1mZWF0dXJlcyddID0gZmFsc2VcbiAgZGVwZW5kZW5jeUNvbmZpZy5mZWF0dXJlcyA9IFtcbiAgICAnc3RyaWN0JyxcbiAgICAuLi5leGlzdGluZ0ZlYXR1cmVzLmZpbHRlcigoZmVhdHVyZSkgPT4gZmVhdHVyZSAhPT0gJ3N0cmljdCcpLFxuICBdLmZpbHRlcigoZmVhdHVyZSkgPT4gZmVhdHVyZSAhPT0gJ3R5cGUtZGVmJylcblxuICBkZXBlbmRlbmNpZXNbJ25hcGktZGVyaXZlJ10gPSBkZXBlbmRlbmN5Q29uZmlnXG5cbiAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBzdHJpbmdpZnlUb21sKGNhcmdvVG9tbCkpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbHRlclRhcmdldHNJbkdpdGh1YkFjdGlvbnMoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGVuYWJsZWRUYXJnZXRzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpXG4gIGNvbnN0IHlhbWwgPSB5YW1sTG9hZChjb250ZW50KSBhcyBhbnlcblxuICBjb25zdCBsaW51eFRhcmdldHMgPSBuZXcgU2V0KFtcbiAgICAneDg2XzY0LXVua25vd24tbGludXgtZ251JyxcbiAgICAneDg2XzY0LXVua25vd24tbGludXgtbXVzbCcsXG4gICAgJ2FhcmNoNjQtdW5rbm93bi1saW51eC1nbnUnLFxuICAgICdhYXJjaDY0LXVua25vd24tbGludXgtbXVzbCcsXG4gICAgJ2FybXY3LXVua25vd24tbGludXgtZ251ZWFiaWhmJyxcbiAgICAnYXJtdjctdW5rbm93bi1saW51eC1tdXNsZWFiaWhmJyxcbiAgICAnbG9vbmdhcmNoNjQtdW5rbm93bi1saW51eC1nbnUnLFxuICAgICdyaXNjdjY0Z2MtdW5rbm93bi1saW51eC1nbnUnLFxuICAgICdwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LWdudScsXG4gICAgJ3MzOTB4LXVua25vd24tbGludXgtZ251JyxcbiAgICAnYWFyY2g2NC1saW51eC1hbmRyb2lkJyxcbiAgICAnYXJtdjctbGludXgtYW5kcm9pZGVhYmknLFxuICBdKVxuXG4gIC8vIENoZWNrIGlmIGFueSBMaW51eCB0YXJnZXRzIGFyZSBlbmFibGVkXG4gIGNvbnN0IGhhc0xpbnV4VGFyZ2V0cyA9IGVuYWJsZWRUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT5cbiAgICBsaW51eFRhcmdldHMuaGFzKHRhcmdldCksXG4gIClcbiAgY29uc3QgaGFzTWFjT1NPcldpbmRvd3NUYXJnZXRzID0gZW5hYmxlZFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBwYXJzZVRyaXBsZSh0YXJnZXQpLnBsYXRmb3JtXG4gICAgcmV0dXJuIHBsYXRmb3JtID09PSAnZGFyd2luJyB8fCBwbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICB9KVxuXG4gIC8vIEZpbHRlciB0aGUgbWF0cml4IGNvbmZpZ3VyYXRpb25zIGluIHRoZSBidWlsZCBqb2JcbiAgaWYgKHlhbWw/LmpvYnM/LmJ1aWxkPy5zdHJhdGVneT8ubWF0cml4Py5zZXR0aW5ncykge1xuICAgIHlhbWwuam9icy5idWlsZC5zdHJhdGVneS5tYXRyaXguc2V0dGluZ3MgPVxuICAgICAgeWFtbC5qb2JzLmJ1aWxkLnN0cmF0ZWd5Lm1hdHJpeC5zZXR0aW5ncy5maWx0ZXIoKHNldHRpbmc6IGFueSkgPT4ge1xuICAgICAgICBpZiAoc2V0dGluZy50YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gZW5hYmxlZFRhcmdldHMuaW5jbHVkZXMoc2V0dGluZy50YXJnZXQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gIH1cblxuICBjb25zdCBqb2JzVG9SZW1vdmU6IHN0cmluZ1tdID0gW11cblxuICBpZiAoIWhhc01hY09TT3JXaW5kb3dzVGFyZ2V0cykge1xuICAgIGpvYnNUb1JlbW92ZS5wdXNoKCd0ZXN0LW1hY09TLXdpbmRvd3MtYmluZGluZycpXG4gIH0gZWxzZSB7XG4gICAgLy8gRmlsdGVyIHRoZSBtYXRyaXggY29uZmlndXJhdGlvbnMgaW4gdGhlIHRlc3QtbWFjT1Mtd2luZG93cy1iaW5kaW5nIGpvYlxuICAgIGlmIChcbiAgICAgIHlhbWw/LmpvYnM/LlsndGVzdC1tYWNPUy13aW5kb3dzLWJpbmRpbmcnXT8uc3RyYXRlZ3k/Lm1hdHJpeD8uc2V0dGluZ3NcbiAgICApIHtcbiAgICAgIHlhbWwuam9ic1sndGVzdC1tYWNPUy13aW5kb3dzLWJpbmRpbmcnXS5zdHJhdGVneS5tYXRyaXguc2V0dGluZ3MgPVxuICAgICAgICB5YW1sLmpvYnNbJ3Rlc3QtbWFjT1Mtd2luZG93cy1iaW5kaW5nJ10uc3RyYXRlZ3kubWF0cml4LnNldHRpbmdzLmZpbHRlcihcbiAgICAgICAgICAoc2V0dGluZzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2V0dGluZy50YXJnZXQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWRUYXJnZXRzLmluY2x1ZGVzKHNldHRpbmcudGFyZ2V0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgfVxuICB9XG5cbiAgLy8gSWYgbm8gTGludXggdGFyZ2V0cyBhcmUgZW5hYmxlZCwgcmVtb3ZlIExpbnV4LXNwZWNpZmljIGpvYnNcbiAgaWYgKCFoYXNMaW51eFRhcmdldHMpIHtcbiAgICAvLyBSZW1vdmUgdGVzdC1saW51eC1iaW5kaW5nIGpvYlxuICAgIGlmICh5YW1sPy5qb2JzPy5bJ3Rlc3QtbGludXgtYmluZGluZyddKSB7XG4gICAgICBqb2JzVG9SZW1vdmUucHVzaCgndGVzdC1saW51eC1iaW5kaW5nJylcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRmlsdGVyIHRoZSBtYXRyaXggY29uZmlndXJhdGlvbnMgaW4gdGhlIHRlc3QtbGludXgteDY0LWdudS1iaW5kaW5nIGpvYlxuICAgIGlmICh5YW1sPy5qb2JzPy5bJ3Rlc3QtbGludXgtYmluZGluZyddPy5zdHJhdGVneT8ubWF0cml4Py50YXJnZXQpIHtcbiAgICAgIHlhbWwuam9ic1sndGVzdC1saW51eC1iaW5kaW5nJ10uc3RyYXRlZ3kubWF0cml4LnRhcmdldCA9IHlhbWwuam9ic1tcbiAgICAgICAgJ3Rlc3QtbGludXgtYmluZGluZydcbiAgICAgIF0uc3RyYXRlZ3kubWF0cml4LnRhcmdldC5maWx0ZXIoKHRhcmdldDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gZW5hYmxlZFRhcmdldHMuaW5jbHVkZXModGFyZ2V0KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmICghZW5hYmxlZFRhcmdldHMuaW5jbHVkZXMoV0FTSV9UQVJHRVQpKSB7XG4gICAgam9ic1RvUmVtb3ZlLnB1c2goJ3Rlc3Qtd2FzaScpXG4gIH1cblxuICBpZiAoIWVuYWJsZWRUYXJnZXRzLmluY2x1ZGVzKCd4ODZfNjQtdW5rbm93bi1mcmVlYnNkJykpIHtcbiAgICBqb2JzVG9SZW1vdmUucHVzaCgnYnVpbGQtZnJlZWJzZCcpXG4gIH1cblxuICAvLyBGaWx0ZXIgb3RoZXIgdGVzdCBqb2JzIGJhc2VkIG9uIHRhcmdldFxuICBmb3IgKGNvbnN0IFtqb2JOYW1lLCBqb2JDb25maWddIG9mIE9iamVjdC5lbnRyaWVzKHlhbWwuam9icyB8fCB7fSkpIHtcbiAgICBpZiAoXG4gICAgICBqb2JOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QtJykgJiZcbiAgICAgIGpvYk5hbWUgIT09ICd0ZXN0LW1hY09TLXdpbmRvd3MtYmluZGluZycgJiZcbiAgICAgIGpvYk5hbWUgIT09ICd0ZXN0LWxpbnV4LXg2NC1nbnUtYmluZGluZydcbiAgICApIHtcbiAgICAgIC8vIEV4dHJhY3QgdGFyZ2V0IGZyb20gam9iIG5hbWUgb3IgY29uZmlnXG4gICAgICBjb25zdCBqb2IgPSBqb2JDb25maWcgYXMgYW55XG4gICAgICBpZiAoam9iLnN0cmF0ZWd5Py5tYXRyaXg/LnNldHRpbmdzPy5bMF0/LnRhcmdldCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBqb2Iuc3RyYXRlZ3kubWF0cml4LnNldHRpbmdzWzBdLnRhcmdldFxuICAgICAgICBpZiAoIWVuYWJsZWRUYXJnZXRzLmluY2x1ZGVzKHRhcmdldCkpIHtcbiAgICAgICAgICBqb2JzVG9SZW1vdmUucHVzaChqb2JOYW1lKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtb3ZlIGpvYnMgZm9yIGRpc2FibGVkIHRhcmdldHNcbiAgZm9yIChjb25zdCBqb2JOYW1lIG9mIGpvYnNUb1JlbW92ZSkge1xuICAgIGRlbGV0ZSB5YW1sLmpvYnNbam9iTmFtZV1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHlhbWwuam9icz8ucHVibGlzaD8ubmVlZHMpKSB7XG4gICAgeWFtbC5qb2JzLnB1Ymxpc2gubmVlZHMgPSB5YW1sLmpvYnMucHVibGlzaC5uZWVkcy5maWx0ZXIoXG4gICAgICAobmVlZDogc3RyaW5nKSA9PiAham9ic1RvUmVtb3ZlLmluY2x1ZGVzKG5lZWQpLFxuICAgIClcbiAgfVxuXG4gIC8vIFdyaXRlIGJhY2sgdGhlIGZpbHRlcmVkIFlBTUxcbiAgY29uc3QgdXBkYXRlZFlhbWwgPSB5YW1sRHVtcCh5YW1sLCB7XG4gICAgbGluZVdpZHRoOiAtMSxcbiAgICBub1JlZnM6IHRydWUsXG4gICAgc29ydEtleXM6IGZhbHNlLFxuICB9KVxuICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIHVwZGF0ZWRZYW1sKVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzT3B0aW9ucyhvcHRpb25zOiBSYXdOZXdPcHRpb25zKSB7XG4gIGRlYnVnKCdQcm9jZXNzaW5nIG9wdGlvbnMuLi4nKVxuICBpZiAoIW9wdGlvbnMucGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgdGhlIHBhdGggYXMgdGhlIGFyZ3VtZW50JylcbiAgfVxuICBvcHRpb25zLnBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgb3B0aW9ucy5wYXRoKVxuICBkZWJ1ZyhgUmVzb2x2ZWQgdGFyZ2V0IHBhdGggdG86ICR7b3B0aW9ucy5wYXRofWApXG5cbiAgaWYgKCFvcHRpb25zLm5hbWUpIHtcbiAgICBvcHRpb25zLm5hbWUgPSBwYXRoLnBhcnNlKG9wdGlvbnMucGF0aCkuYmFzZVxuICAgIGRlYnVnKGBObyBwcm9qZWN0IG5hbWUgcHJvdmlkZWQsIGZpeCBpdCB0byBkaXIgbmFtZTogJHtvcHRpb25zLm5hbWV9YClcbiAgfVxuXG4gIGlmICghb3B0aW9ucy50YXJnZXRzPy5sZW5ndGgpIHtcbiAgICBpZiAob3B0aW9ucy5lbmFibGVBbGxUYXJnZXRzKSB7XG4gICAgICBvcHRpb25zLnRhcmdldHMgPSBBVkFJTEFCTEVfVEFSR0VUUy5jb25jYXQoKVxuICAgICAgZGVidWcoJ0VuYWJsZSBhbGwgdGFyZ2V0cycpXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmVuYWJsZURlZmF1bHRUYXJnZXRzKSB7XG4gICAgICBvcHRpb25zLnRhcmdldHMgPSBERUZBVUxUX1RBUkdFVFMuY29uY2F0KClcbiAgICAgIGRlYnVnKCdFbmFibGUgZGVmYXVsdCB0YXJnZXRzJylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdCBsZWFzdCBvbmUgdGFyZ2V0IG11c3QgYmUgZW5hYmxlZCcpXG4gICAgfVxuICB9XG4gIGlmIChcbiAgICBvcHRpb25zLnRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09ICd3YXNtMzItd2FzaS1wcmV2aWV3MS10aHJlYWRzJylcbiAgKSB7XG4gICAgY29uc3Qgb3V0ID0gZXhlY1N5bmMoYHJ1c3R1cCB0YXJnZXQgbGlzdGAsIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSlcbiAgICBpZiAob3V0LmluY2x1ZGVzKFdBU0lfVEFSR0VUKSkge1xuICAgICAgb3B0aW9ucy50YXJnZXRzID0gb3B0aW9ucy50YXJnZXRzLm1hcCgodGFyZ2V0KSA9PlxuICAgICAgICB0YXJnZXQgPT09ICd3YXNtMzItd2FzaS1wcmV2aWV3MS10aHJlYWRzJyA/IFdBU0lfVEFSR0VUIDogdGFyZ2V0LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcHBseURlZmF1bHROZXdPcHRpb25zKG9wdGlvbnMpIGFzIE5ld09wdGlvbnNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5ld1Byb2plY3QodXNlck9wdGlvbnM6IFJhd05ld09wdGlvbnMpIHtcbiAgZGVidWcoJ1dpbGwgY3JlYXRlIG5hcGktcnMgcHJvamVjdCB3aXRoIGdpdmVuIG9wdGlvbnM6JylcbiAgZGVidWcodXNlck9wdGlvbnMpXG5cbiAgY29uc3Qgb3B0aW9ucyA9IHByb2Nlc3NPcHRpb25zKHVzZXJPcHRpb25zKVxuXG4gIGRlYnVnKCdUYXJnZXRzIHRvIGJlIGVuYWJsZWQ6JylcbiAgZGVidWcob3B0aW9ucy50YXJnZXRzKVxuXG4gIC8vIENoZWNrIGlmIGdpdCBpcyBhdmFpbGFibGVcbiAgaWYgKCEoYXdhaXQgY2hlY2tHaXRDb21tYW5kKCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0dpdCBpcyBub3QgaW5zdGFsbGVkIG9yIG5vdCBhdmFpbGFibGUgaW4gUEFUSC4gUGxlYXNlIGluc3RhbGwgR2l0IHRvIGNvbnRpbnVlLicsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBvcHRpb25zLnBhY2thZ2VNYW5hZ2VyIGFzIFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2VyXG5cbiAgLy8gRW5zdXJlIHRhcmdldCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBpcyBlbXB0eVxuICBhd2FpdCBlbnN1cmVQYXRoKG9wdGlvbnMucGF0aCwgb3B0aW9ucy5kcnlSdW4pXG5cbiAgaWYgKCFvcHRpb25zLmRyeVJ1bikge1xuICAgIHRyeSB7XG4gICAgICAvLyBEb3dubG9hZCBvciB1cGRhdGUgdGVtcGxhdGVcbiAgICAgIGNvbnN0IGNhY2hlRGlyID0gYXdhaXQgZW5zdXJlQ2FjaGVEaXIocGFja2FnZU1hbmFnZXIpXG4gICAgICBhd2FpdCBkb3dubG9hZFRlbXBsYXRlKHBhY2thZ2VNYW5hZ2VyLCBjYWNoZURpcilcblxuICAgICAgLy8gQ29weSB0ZW1wbGF0ZSBmaWxlcyB0byB0YXJnZXQgZGlyZWN0b3J5XG4gICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4oY2FjaGVEaXIsICdyZXBvJylcbiAgICAgIGF3YWl0IGNvcHlEaXJlY3RvcnkoXG4gICAgICAgIHRlbXBsYXRlUGF0aCxcbiAgICAgICAgb3B0aW9ucy5wYXRoLFxuICAgICAgICBvcHRpb25zLnRhcmdldHMuaW5jbHVkZXMoV0FTSV9UQVJHRVQpLFxuICAgICAgKVxuXG4gICAgICAvLyBSZW5hbWUgcHJvamVjdCB1c2luZyB0aGUgcmVuYW1lIEFQSVxuICAgICAgYXdhaXQgcmVuYW1lUHJvamVjdCh7XG4gICAgICAgIGN3ZDogb3B0aW9ucy5wYXRoLFxuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgIGJpbmFyeU5hbWU6IGdldEJpbmFyeU5hbWUob3B0aW9ucy5uYW1lKSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGNhcmdvVG9tbFBhdGggPSBwYXRoLmpvaW4ob3B0aW9ucy5wYXRoLCAnQ2FyZ28udG9tbCcpXG4gICAgICBpZiAoZXhpc3RzU3luYyhjYXJnb1RvbWxQYXRoKSkge1xuICAgICAgICBhd2FpdCB1cGRhdGVDYXJnb1RvbWxUeXBlRGVmKGNhcmdvVG9tbFBhdGgsIG9wdGlvbnMuZW5hYmxlVHlwZURlZilcbiAgICAgIH1cblxuICAgICAgLy8gRmlsdGVyIHRhcmdldHMgaW4gcGFja2FnZS5qc29uXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4ob3B0aW9ucy5wYXRoLCAncGFja2FnZS5qc29uJylcbiAgICAgIGlmIChleGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgZmlsdGVyVGFyZ2V0c0luUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoLCBvcHRpb25zLnRhcmdldHMpXG4gICAgICB9XG5cbiAgICAgIC8vIEZpbHRlciB0YXJnZXRzIGluIEdpdEh1YiBBY3Rpb25zIENJXG4gICAgICBjb25zdCBjaVBhdGggPSBwYXRoLmpvaW4ob3B0aW9ucy5wYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnLCAnQ0kueW1sJylcbiAgICAgIGlmIChleGlzdHNTeW5jKGNpUGF0aCkgJiYgb3B0aW9ucy5lbmFibGVHaXRodWJBY3Rpb25zKSB7XG4gICAgICAgIGF3YWl0IGZpbHRlclRhcmdldHNJbkdpdGh1YkFjdGlvbnMoY2lQYXRoLCBvcHRpb25zLnRhcmdldHMpXG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhb3B0aW9ucy5lbmFibGVHaXRodWJBY3Rpb25zICYmXG4gICAgICAgIGV4aXN0c1N5bmMocGF0aC5qb2luKG9wdGlvbnMucGF0aCwgJy5naXRodWInKSlcbiAgICAgICkge1xuICAgICAgICAvLyBSZW1vdmUgLmdpdGh1YiBkaXJlY3RvcnkgaWYgR2l0SHViIEFjdGlvbnMgaXMgbm90IGVuYWJsZWRcbiAgICAgICAgYXdhaXQgZnMucm0ocGF0aC5qb2luKG9wdGlvbnMucGF0aCwgJy5naXRodWInKSwge1xuICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHBhY2thZ2UuanNvbiB3aXRoIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbnNcbiAgICAgIGNvbnN0IHBrZ0pzb25Db250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmLTgnKVxuICAgICAgY29uc3QgcGtnSnNvbiA9IEpTT04ucGFyc2UocGtnSnNvbkNvbnRlbnQpXG5cbiAgICAgIC8vIFVwZGF0ZSBlbmdpbmUgcmVxdWlyZW1lbnRcbiAgICAgIGlmICghcGtnSnNvbi5lbmdpbmVzKSB7XG4gICAgICAgIHBrZ0pzb24uZW5naW5lcyA9IHt9XG4gICAgICB9XG4gICAgICBwa2dKc29uLmVuZ2luZXMubm9kZSA9IG5hcGlFbmdpbmVSZXF1aXJlbWVudChvcHRpb25zLm1pbk5vZGVBcGlWZXJzaW9uKVxuXG4gICAgICAvLyBVcGRhdGUgbGljZW5zZSBpZiBkaWZmZXJlbnQgZnJvbSB0ZW1wbGF0ZVxuICAgICAgaWYgKG9wdGlvbnMubGljZW5zZSAmJiBwa2dKc29uLmxpY2Vuc2UgIT09IG9wdGlvbnMubGljZW5zZSkge1xuICAgICAgICBwa2dKc29uLmxpY2Vuc2UgPSBvcHRpb25zLmxpY2Vuc2VcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRlc3QgZnJhbWV3b3JrIGlmIG5lZWRlZFxuICAgICAgaWYgKG9wdGlvbnMudGVzdEZyYW1ld29yayAhPT0gJ2F2YScpIHtcbiAgICAgICAgLy8gVGhpcyB3b3VsZCByZXF1aXJlIG1vcmUgY29tcGxleCBsb2dpYyB0byB1cGRhdGUgdGVzdCBzY3JpcHRzIGFuZCBkZXBlbmRlbmNpZXNcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgYFRlc3QgZnJhbWV3b3JrICR7b3B0aW9ucy50ZXN0RnJhbWV3b3JrfSByZXF1ZXN0ZWQgYnV0IG5vdCB5ZXQgaW1wbGVtZW50ZWRgLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgcGFja2FnZUpzb25QYXRoLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShwa2dKc29uLCBudWxsLCAyKSArICdcXG4nLFxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgcHJvamVjdDogJHtlcnJvcn1gKVxuICAgIH1cbiAgfVxuXG4gIGRlYnVnKGBQcm9qZWN0IGNyZWF0ZWQgYXQ6ICR7b3B0aW9ucy5wYXRofWApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVBhdGgocGF0aDogc3RyaW5nLCBkcnlSdW4gPSBmYWxzZSkge1xuICBjb25zdCBzdGF0ID0gYXdhaXQgc3RhdEFzeW5jKHBhdGgsIHt9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpXG5cbiAgLy8gZmlsZSBkZXNjcmlwdG9yIGV4aXN0c1xuICBpZiAoc3RhdCkge1xuICAgIGlmIChzdGF0LmlzRmlsZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQYXRoICR7cGF0aH0gZm9yIGNyZWF0aW5nIG5ldyBuYXBpLXJzIHByb2plY3QgYWxyZWFkeSBleGlzdHMgYW5kIGl0J3Mgbm90IGEgZGlyZWN0b3J5LmAsXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVhZGRpckFzeW5jKHBhdGgpXG4gICAgICBpZiAoZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGF0aCAke3BhdGh9IGZvciBjcmVhdGluZyBuZXcgbmFwaS1ycyBwcm9qZWN0IGFscmVhZHkgZXhpc3RzIGFuZCBpdCdzIG5vdCBlbXB0eS5gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFkcnlSdW4pIHtcbiAgICB0cnkge1xuICAgICAgZGVidWcoYFRyeSB0byBjcmVhdGUgdGFyZ2V0IGRpcmVjdG9yeTogJHtwYXRofWApXG4gICAgICBpZiAoIWRyeVJ1bikge1xuICAgICAgICBhd2FpdCBta2RpckFzeW5jKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHRhcmdldCBkaXJlY3Rvcnk6ICR7cGF0aH1gLCB7XG4gICAgICAgIGNhdXNlOiBlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QmluYXJ5TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmFtZS5zcGxpdCgnLycpLnBvcCgpIVxufVxuXG5leHBvcnQgdHlwZSB7IE5ld09wdGlvbnMgfVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBjb2RlZ2VuL2luZGV4LnRzXG4vLyBEbyBub3QgZWRpdCB0aGlzIGZpbGUgbWFudWFsbHlcbmltcG9ydCB7IENvbW1hbmQsIE9wdGlvbiB9IGZyb20gJ2NsaXBhbmlvbidcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VQcmVQdWJsaXNoQ29tbWFuZCBleHRlbmRzIENvbW1hbmQge1xuICBzdGF0aWMgcGF0aHMgPSBbWydwcmUtcHVibGlzaCddLCBbJ3ByZXB1Ymxpc2gnXV1cblxuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdVcGRhdGUgcGFja2FnZS5qc29uIGFuZCBjb3B5IGFkZG9ucyBpbnRvIHBlciBwbGF0Zm9ybSBwYWNrYWdlcycsXG4gIH0pXG5cbiAgY3dkID0gT3B0aW9uLlN0cmluZygnLS1jd2QnLCBwcm9jZXNzLmN3ZCgpLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoJyxcbiAgfSlcblxuICBjb25maWdQYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1jb25maWctcGF0aCwtYycsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGUnLFxuICB9KVxuXG4gIHBhY2thZ2VKc29uUGF0aCA9IE9wdGlvbi5TdHJpbmcoJy0tcGFja2FnZS1qc29uLXBhdGgnLCAncGFja2FnZS5qc29uJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgcGFja2FnZS5qc29uYCcsXG4gIH0pXG5cbiAgbnBtRGlyID0gT3B0aW9uLlN0cmluZygnLS1ucG0tZGlyLC1wJywgJ25wbScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gdGhlIGZvbGRlciB3aGVyZSB0aGUgbnBtIHBhY2thZ2VzIHB1dCcsXG4gIH0pXG5cbiAgdGFnU3R5bGUgPSBPcHRpb24uU3RyaW5nKCctLXRhZy1zdHlsZSwtLXRhZ3N0eWxlLC10JywgJ2xlcm5hJywge1xuICAgIGRlc2NyaXB0aW9uOiAnZ2l0IHRhZyBzdHlsZSwgYG5wbWAgb3IgYGxlcm5hYCcsXG4gIH0pXG5cbiAgZ2hSZWxlYXNlID0gT3B0aW9uLkJvb2xlYW4oJy0tZ2gtcmVsZWFzZScsIHRydWUsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgY3JlYXRlIEdpdEh1YiByZWxlYXNlJyxcbiAgfSlcblxuICBnaFJlbGVhc2VOYW1lPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1naC1yZWxlYXNlLW5hbWUnLCB7XG4gICAgZGVzY3JpcHRpb246ICdHaXRIdWIgcmVsZWFzZSBuYW1lJyxcbiAgfSlcblxuICBnaFJlbGVhc2VJZD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tZ2gtcmVsZWFzZS1pZCcsIHtcbiAgICBkZXNjcmlwdGlvbjogJ0V4aXN0aW5nIEdpdEh1YiByZWxlYXNlIGlkJyxcbiAgfSlcblxuICBza2lwT3B0aW9uYWxQdWJsaXNoID0gT3B0aW9uLkJvb2xlYW4oJy0tc2tpcC1vcHRpb25hbC1wdWJsaXNoJywgZmFsc2UsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgc2tpcCBvcHRpb25hbERlcGVuZGVuY2llcyBwYWNrYWdlcyBwdWJsaXNoJyxcbiAgfSlcblxuICBkcnlSdW4gPSBPcHRpb24uQm9vbGVhbignLS1kcnktcnVuJywgZmFsc2UsIHtcbiAgICBkZXNjcmlwdGlvbjogJ0RyeSBydW4gd2l0aG91dCB0b3VjaGluZyBmaWxlIHN5c3RlbScsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgIGNvbmZpZ1BhdGg6IHRoaXMuY29uZmlnUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uUGF0aDogdGhpcy5wYWNrYWdlSnNvblBhdGgsXG4gICAgICBucG1EaXI6IHRoaXMubnBtRGlyLFxuICAgICAgdGFnU3R5bGU6IHRoaXMudGFnU3R5bGUsXG4gICAgICBnaFJlbGVhc2U6IHRoaXMuZ2hSZWxlYXNlLFxuICAgICAgZ2hSZWxlYXNlTmFtZTogdGhpcy5naFJlbGVhc2VOYW1lLFxuICAgICAgZ2hSZWxlYXNlSWQ6IHRoaXMuZ2hSZWxlYXNlSWQsXG4gICAgICBza2lwT3B0aW9uYWxQdWJsaXNoOiB0aGlzLnNraXBPcHRpb25hbFB1Ymxpc2gsXG4gICAgICBkcnlSdW46IHRoaXMuZHJ5UnVuLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZSBwYWNrYWdlLmpzb24gYW5kIGNvcHkgYWRkb25zIGludG8gcGVyIHBsYXRmb3JtIHBhY2thZ2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlUHVibGlzaE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoXG4gICAqXG4gICAqIEBkZWZhdWx0IHByb2Nlc3MuY3dkKClcbiAgICovXG4gIGN3ZD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZVxuICAgKi9cbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgcGFja2FnZS5qc29uYFxuICAgKlxuICAgKiBAZGVmYXVsdCAncGFja2FnZS5qc29uJ1xuICAgKi9cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXRcbiAgICpcbiAgICogQGRlZmF1bHQgJ25wbSdcbiAgICovXG4gIG5wbURpcj86IHN0cmluZ1xuICAvKipcbiAgICogZ2l0IHRhZyBzdHlsZSwgYG5wbWAgb3IgYGxlcm5hYFxuICAgKlxuICAgKiBAZGVmYXVsdCAnbGVybmEnXG4gICAqL1xuICB0YWdTdHlsZT86ICducG0nIHwgJ2xlcm5hJ1xuICAvKipcbiAgICogV2hldGhlciBjcmVhdGUgR2l0SHViIHJlbGVhc2VcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZ2hSZWxlYXNlPzogYm9vbGVhblxuICAvKipcbiAgICogR2l0SHViIHJlbGVhc2UgbmFtZVxuICAgKi9cbiAgZ2hSZWxlYXNlTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogRXhpc3RpbmcgR2l0SHViIHJlbGVhc2UgaWRcbiAgICovXG4gIGdoUmVsZWFzZUlkPzogc3RyaW5nXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNraXAgb3B0aW9uYWxEZXBlbmRlbmNpZXMgcGFja2FnZXMgcHVibGlzaFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgc2tpcE9wdGlvbmFsUHVibGlzaD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIERyeSBydW4gd2l0aG91dCB0b3VjaGluZyBmaWxlIHN5c3RlbVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZHJ5UnVuPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlEZWZhdWx0UHJlUHVibGlzaE9wdGlvbnMob3B0aW9uczogUHJlUHVibGlzaE9wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgcGFja2FnZUpzb25QYXRoOiAncGFja2FnZS5qc29uJyxcbiAgICBucG1EaXI6ICducG0nLFxuICAgIHRhZ1N0eWxlOiAnbGVybmEnLFxuICAgIGdoUmVsZWFzZTogdHJ1ZSxcbiAgICBza2lwT3B0aW9uYWxQdWJsaXNoOiBmYWxzZSxcbiAgICBkcnlSdW46IGZhbHNlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cbn1cbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgY29kZWdlbi9pbmRleC50c1xuLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlIG1hbnVhbGx5XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlVmVyc2lvbkNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIHBhdGhzID0gW1sndmVyc2lvbiddXVxuXG4gIHN0YXRpYyB1c2FnZSA9IENvbW1hbmQuVXNhZ2Uoe1xuICAgIGRlc2NyaXB0aW9uOiAnVXBkYXRlIHZlcnNpb24gaW4gY3JlYXRlZCBucG0gcGFja2FnZXMnLFxuICB9KVxuXG4gIGN3ZCA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywgcHJvY2Vzcy5jd2QoKSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgY29uZmlnUGF0aD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY29uZmlnLXBhdGgsLWMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlJyxcbiAgfSlcblxuICBwYWNrYWdlSnNvblBhdGggPSBPcHRpb24uU3RyaW5nKCctLXBhY2thZ2UtanNvbi1wYXRoJywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIG5wbURpciA9IE9wdGlvbi5TdHJpbmcoJy0tbnBtLWRpcicsICducG0nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXQnLFxuICB9KVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICBjb25maWdQYXRoOiB0aGlzLmNvbmZpZ1BhdGgsXG4gICAgICBwYWNrYWdlSnNvblBhdGg6IHRoaXMucGFja2FnZUpzb25QYXRoLFxuICAgICAgbnBtRGlyOiB0aGlzLm5wbURpcixcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGUgdmVyc2lvbiBpbiBjcmVhdGVkIG5wbSBwYWNrYWdlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aFxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9jZXNzLmN3ZCgpXG4gICAqL1xuICBjd2Q/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGVcbiAgICovXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYHBhY2thZ2UuanNvbmBcbiAgICpcbiAgICogQGRlZmF1bHQgJ3BhY2thZ2UuanNvbidcbiAgICovXG4gIHBhY2thZ2VKc29uUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0XG4gICAqXG4gICAqIEBkZWZhdWx0ICducG0nXG4gICAqL1xuICBucG1EaXI/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVmYXVsdFZlcnNpb25PcHRpb25zKG9wdGlvbnM6IFZlcnNpb25PcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIHBhY2thZ2VKc29uUGF0aDogJ3BhY2thZ2UuanNvbicsXG4gICAgbnBtRGlyOiAnbnBtJyxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQge1xuICBhcHBseURlZmF1bHRWZXJzaW9uT3B0aW9ucyxcbiAgdHlwZSBWZXJzaW9uT3B0aW9ucyxcbn0gZnJvbSAnLi4vZGVmL3ZlcnNpb24uanMnXG5pbXBvcnQge1xuICByZWFkTmFwaUNvbmZpZyxcbiAgZGVidWdGYWN0b3J5LFxuICB1cGRhdGVQYWNrYWdlSnNvbixcbn0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCd2ZXJzaW9uJylcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcnNpb24odXNlck9wdGlvbnM6IFZlcnNpb25PcHRpb25zKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcHBseURlZmF1bHRWZXJzaW9uT3B0aW9ucyh1c2VyT3B0aW9ucylcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5wYWNrYWdlSnNvblBhdGgpXG5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVhZE5hcGlDb25maWcoXG4gICAgcGFja2FnZUpzb25QYXRoLFxuICAgIG9wdGlvbnMuY29uZmlnUGF0aCA/IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMuY29uZmlnUGF0aCkgOiB1bmRlZmluZWQsXG4gIClcblxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiBjb25maWcudGFyZ2V0cykge1xuICAgIGNvbnN0IHBrZ0RpciA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMubnBtRGlyLCB0YXJnZXQucGxhdGZvcm1BcmNoQUJJKVxuXG4gICAgZGVidWcoYFVwZGF0ZSB2ZXJzaW9uIHRvICVpIGluIFslaV1gLCBjb25maWcucGFja2FnZUpzb24udmVyc2lvbiwgcGtnRGlyKVxuICAgIGF3YWl0IHVwZGF0ZVBhY2thZ2VKc29uKGpvaW4ocGtnRGlyLCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIHZlcnNpb246IGNvbmZpZy5wYWNrYWdlSnNvbi52ZXJzaW9uLFxuICAgIH0pXG4gIH1cbn1cbiIsImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IHsgZXhpc3RzU3luYywgc3RhdFN5bmMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L3Jlc3QnXG5cbmltcG9ydCB7XG4gIGFwcGx5RGVmYXVsdFByZVB1Ymxpc2hPcHRpb25zLFxuICB0eXBlIFByZVB1Ymxpc2hPcHRpb25zLFxufSBmcm9tICcuLi9kZWYvcHJlLXB1Ymxpc2guanMnXG5pbXBvcnQge1xuICByZWFkRmlsZUFzeW5jLFxuICByZWFkTmFwaUNvbmZpZyxcbiAgZGVidWdGYWN0b3J5LFxuICB1cGRhdGVQYWNrYWdlSnNvbixcbn0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24uanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCdwcmUtcHVibGlzaCcpXG5cbmludGVyZmFjZSBQYWNrYWdlSW5mbyB7XG4gIG5hbWU6IHN0cmluZ1xuICB2ZXJzaW9uOiBzdHJpbmdcbiAgdGFnOiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZVB1Ymxpc2godXNlck9wdGlvbnM6IFByZVB1Ymxpc2hPcHRpb25zKSB7XG4gIGRlYnVnKCdSZWNlaXZlIHByZS1wdWJsaXNoIG9wdGlvbnM6JylcbiAgZGVidWcoJyAgJU8nLCB1c2VyT3B0aW9ucylcblxuICBjb25zdCBvcHRpb25zID0gYXBwbHlEZWZhdWx0UHJlUHVibGlzaE9wdGlvbnModXNlck9wdGlvbnMpXG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5wYWNrYWdlSnNvblBhdGgpXG5cbiAgY29uc3QgeyBwYWNrYWdlSnNvbiwgdGFyZ2V0cywgcGFja2FnZU5hbWUsIGJpbmFyeU5hbWUsIG5wbUNsaWVudCB9ID1cbiAgICBhd2FpdCByZWFkTmFwaUNvbmZpZyhcbiAgICAgIHBhY2thZ2VKc29uUGF0aCxcbiAgICAgIG9wdGlvbnMuY29uZmlnUGF0aCA/IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMuY29uZmlnUGF0aCkgOiB1bmRlZmluZWQsXG4gICAgKVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUdoUmVsZWFzZShwYWNrYWdlTmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpIHtcbiAgICBpZiAoIW9wdGlvbnMuZ2hSZWxlYXNlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvd25lcjogbnVsbCxcbiAgICAgICAgcmVwbzogbnVsbCxcbiAgICAgICAgcGtnSW5mbzogeyBuYW1lOiBudWxsLCB2ZXJzaW9uOiBudWxsLCB0YWc6IG51bGwgfSxcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgeyByZXBvLCBvd25lciwgcGtnSW5mbywgb2N0b2tpdCB9ID0gZ2V0UmVwb0luZm8ocGFja2FnZU5hbWUsIHZlcnNpb24pXG5cbiAgICBpZiAoIXJlcG8gfHwgIW93bmVyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvd25lcjogbnVsbCxcbiAgICAgICAgcmVwbzogbnVsbCxcbiAgICAgICAgcGtnSW5mbzogeyBuYW1lOiBudWxsLCB2ZXJzaW9uOiBudWxsLCB0YWc6IG51bGwgfSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcG9zLmNyZWF0ZVJlbGVhc2Uoe1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgdGFnX25hbWU6IHBrZ0luZm8udGFnLFxuICAgICAgICAgIG5hbWU6IG9wdGlvbnMuZ2hSZWxlYXNlTmFtZSxcbiAgICAgICAgICBwcmVyZWxlYXNlOlxuICAgICAgICAgICAgdmVyc2lvbi5pbmNsdWRlcygnYWxwaGEnKSB8fFxuICAgICAgICAgICAgdmVyc2lvbi5pbmNsdWRlcygnYmV0YScpIHx8XG4gICAgICAgICAgICB2ZXJzaW9uLmluY2x1ZGVzKCdyYycpLFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICBgUGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgeyBvd25lciwgcmVwbywgdGFnX25hbWU6IHBrZ0luZm8udGFnIH0sXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfWAsXG4gICAgICAgIClcbiAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBvd25lciwgcmVwbywgcGtnSW5mbywgb2N0b2tpdCB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZXBvSW5mbyhwYWNrYWdlTmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpIHtcbiAgICBjb25zdCBoZWFkQ29tbWl0ID0gZXhlY1N5bmMoJ2dpdCBsb2cgLTEgLS1wcmV0dHk9JUInLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgZW5jb2Rpbmc6ICd1dGYtOCcsXG4gICAgfSkudHJpbSgpXG5cbiAgICBjb25zdCB7IEdJVEhVQl9SRVBPU0lUT1JZIH0gPSBwcm9jZXNzLmVudlxuICAgIGlmICghR0lUSFVCX1JFUE9TSVRPUlkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG93bmVyOiBudWxsLFxuICAgICAgICByZXBvOiBudWxsLFxuICAgICAgICBwa2dJbmZvOiB7IG5hbWU6IG51bGwsIHZlcnNpb246IG51bGwsIHRhZzogbnVsbCB9LFxuICAgICAgfVxuICAgIH1cbiAgICBkZWJ1ZyhgR2l0aHViIHJlcG9zaXRvcnk6ICR7R0lUSFVCX1JFUE9TSVRPUll9YClcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gR0lUSFVCX1JFUE9TSVRPUlkuc3BsaXQoJy8nKVxuICAgIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgICBhdXRoOiBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4sXG4gICAgfSlcbiAgICBsZXQgcGtnSW5mbzogUGFja2FnZUluZm8gfCB1bmRlZmluZWRcbiAgICBpZiAob3B0aW9ucy50YWdTdHlsZSA9PT0gJ2xlcm5hJykge1xuICAgICAgY29uc3QgcGFja2FnZXNUb1B1Ymxpc2ggPSBoZWFkQ29tbWl0XG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAgIC5maWx0ZXIoKGxpbmUsIGluZGV4KSA9PiBsaW5lLmxlbmd0aCAmJiBpbmRleClcbiAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zdWJzdHJpbmcoMikpXG4gICAgICAgIC5tYXAocGFyc2VUYWcpXG5cbiAgICAgIHBrZ0luZm8gPSBwYWNrYWdlc1RvUHVibGlzaC5maW5kKFxuICAgICAgICAocGtnSW5mbykgPT4gcGtnSW5mby5uYW1lID09PSBwYWNrYWdlTmFtZSxcbiAgICAgIClcblxuICAgICAgaWYgKCFwa2dJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYE5vIHJlbGVhc2UgY29tbWl0IGZvdW5kIHdpdGggJHtwYWNrYWdlTmFtZX0sIG9yaWdpbmFsIGNvbW1pdCBpbmZvOiAke2hlYWRDb21taXR9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwa2dJbmZvID0ge1xuICAgICAgICB0YWc6IGB2JHt2ZXJzaW9ufWAsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIG5hbWU6IHBhY2thZ2VOYW1lLFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBvd25lciwgcmVwbywgcGtnSW5mbywgb2N0b2tpdCB9XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgYXdhaXQgdmVyc2lvbih1c2VyT3B0aW9ucylcbiAgICBhd2FpdCB1cGRhdGVQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgsIHtcbiAgICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOiB0YXJnZXRzLnJlZHVjZShcbiAgICAgICAgKGRlcHMsIHRhcmdldCkgPT4ge1xuICAgICAgICAgIGRlcHNbYCR7cGFja2FnZU5hbWV9LSR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX1gXSA9IHBhY2thZ2VKc29uLnZlcnNpb25cblxuICAgICAgICAgIHJldHVybiBkZXBzXG4gICAgICAgIH0sXG4gICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgICApLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCB7IG93bmVyLCByZXBvLCBwa2dJbmZvLCBvY3Rva2l0IH0gPSBvcHRpb25zLmdoUmVsZWFzZUlkXG4gICAgPyBnZXRSZXBvSW5mbyhwYWNrYWdlTmFtZSwgcGFja2FnZUpzb24udmVyc2lvbilcbiAgICA6IGF3YWl0IGNyZWF0ZUdoUmVsZWFzZShwYWNrYWdlTmFtZSwgcGFja2FnZUpzb24udmVyc2lvbilcblxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgY29uc3QgcGtnRGlyID0gcmVzb2x2ZShcbiAgICAgIG9wdGlvbnMuY3dkLFxuICAgICAgb3B0aW9ucy5ucG1EaXIsXG4gICAgICBgJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfWAsXG4gICAgKVxuICAgIGNvbnN0IGV4dCA9XG4gICAgICB0YXJnZXQucGxhdGZvcm0gPT09ICd3YXNpJyB8fCB0YXJnZXQucGxhdGZvcm0gPT09ICd3YXNtJyA/ICd3YXNtJyA6ICdub2RlJ1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7YmluYXJ5TmFtZX0uJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfS4ke2V4dH1gXG4gICAgY29uc3QgZHN0UGF0aCA9IGpvaW4ocGtnRGlyLCBmaWxlbmFtZSlcblxuICAgIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgIGlmICghZXhpc3RzU3luYyhkc3RQYXRoKSkge1xuICAgICAgICBkZWJ1Zy53YXJuKGAlcyBkb2Vzbid0IGV4aXN0YCwgZHN0UGF0aClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnNraXBPcHRpb25hbFB1Ymxpc2gpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvdXRwdXQgPSBleGVjU3luYyhgJHtucG1DbGllbnR9IHB1Ymxpc2hgLCB7XG4gICAgICAgICAgICBjd2Q6IHBrZ0RpcixcbiAgICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZSBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICAgICBlLm1lc3NhZ2UuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICdZb3UgY2Fubm90IHB1Ymxpc2ggb3ZlciB0aGUgcHJldmlvdXNseSBwdWJsaXNoZWQgdmVyc2lvbnMnLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKGUubWVzc2FnZSlcbiAgICAgICAgICAgIGRlYnVnLndhcm4oYCR7cGtnRGlyfSBoYXMgYmVlbiBwdWJsaXNoZWQsIHNraXBwaW5nYClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5naFJlbGVhc2UgJiYgcmVwbyAmJiBvd25lcikge1xuICAgICAgICBkZWJ1Zy5pbmZvKGBDcmVhdGluZyBHaXRIdWIgcmVsZWFzZSAke3BrZ0luZm8udGFnfWApXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZUlkID0gb3B0aW9ucy5naFJlbGVhc2VJZFxuICAgICAgICAgICAgPyBOdW1iZXIob3B0aW9ucy5naFJlbGVhc2VJZClcbiAgICAgICAgICAgIDogKFxuICAgICAgICAgICAgICAgIGF3YWl0IG9jdG9raXQhLnJlcG9zLmdldFJlbGVhc2VCeVRhZyh7XG4gICAgICAgICAgICAgICAgICByZXBvOiByZXBvLFxuICAgICAgICAgICAgICAgICAgb3duZXI6IG93bmVyLFxuICAgICAgICAgICAgICAgICAgdGFnOiBwa2dJbmZvLnRhZyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApLmRhdGEuaWRcbiAgICAgICAgICBjb25zdCBkc3RGaWxlU3RhdHMgPSBzdGF0U3luYyhkc3RQYXRoKVxuICAgICAgICAgIGNvbnN0IGFzc2V0SW5mbyA9IGF3YWl0IG9jdG9raXQhLnJlcG9zLnVwbG9hZFJlbGVhc2VBc3NldCh7XG4gICAgICAgICAgICBvd25lcjogb3duZXIsXG4gICAgICAgICAgICByZXBvOiByZXBvLFxuICAgICAgICAgICAgbmFtZTogZmlsZW5hbWUsXG4gICAgICAgICAgICByZWxlYXNlX2lkOiByZWxlYXNlSWQsXG4gICAgICAgICAgICBtZWRpYVR5cGU6IHsgZm9ybWF0OiAncmF3JyB9LFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnY29udGVudC1sZW5ndGgnOiBkc3RGaWxlU3RhdHMuc2l6ZSxcbiAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igb2N0b2tpdCB0eXBlcyBhcmUgd3JvbmdcbiAgICAgICAgICAgIGRhdGE6IGF3YWl0IHJlYWRGaWxlQXN5bmMoZHN0UGF0aCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBkZWJ1Zy5pbmZvKGBHaXRIdWIgcmVsZWFzZSBjcmVhdGVkYClcbiAgICAgICAgICBkZWJ1Zy5pbmZvKGBEb3dubG9hZCBVUkw6ICVzYCwgYXNzZXRJbmZvLmRhdGEuYnJvd3Nlcl9kb3dubG9hZF91cmwpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBkZWJ1Zy5lcnJvcihcbiAgICAgICAgICAgIGBQYXJhbTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgeyBvd25lciwgcmVwbywgdGFnOiBwa2dJbmZvLnRhZywgZmlsZW5hbWU6IGRzdFBhdGggfSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgZGVidWcuZXJyb3IoZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVRhZyh0YWc6IHN0cmluZykge1xuICBjb25zdCBzZWdtZW50cyA9IHRhZy5zcGxpdCgnQCcpXG4gIGNvbnN0IHZlcnNpb24gPSBzZWdtZW50cy5wb3AoKSFcbiAgY29uc3QgbmFtZSA9IHNlZ21lbnRzLmpvaW4oJ0AnKVxuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB2ZXJzaW9uLFxuICAgIHRhZyxcbiAgfVxufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBjb2RlZ2VuL2luZGV4LnRzXG4vLyBEbyBub3QgZWRpdCB0aGlzIGZpbGUgbWFudWFsbHlcbmltcG9ydCB7IENvbW1hbmQsIE9wdGlvbiB9IGZyb20gJ2NsaXBhbmlvbidcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VVbml2ZXJzYWxpemVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ3VuaXZlcnNhbGl6ZSddXVxuXG4gIHN0YXRpYyB1c2FnZSA9IENvbW1hbmQuVXNhZ2Uoe1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tYmlsZSBidWlsdCBiaW5hcmllcyBpbnRvIG9uZSB1bml2ZXJzYWwgYmluYXJ5JyxcbiAgfSlcblxuICBjd2QgPSBPcHRpb24uU3RyaW5nKCctLWN3ZCcsIHByb2Nlc3MuY3dkKCksIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGgnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsICdwYWNrYWdlLmpzb24nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBwYWNrYWdlLmpzb25gJyxcbiAgfSlcblxuICBvdXRwdXREaXIgPSBPcHRpb24uU3RyaW5nKCctLW91dHB1dC1kaXIsLW8nLCAnLi8nLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIGFsbCBidWlsdCBgLm5vZGVgIGZpbGVzIHB1dCwgc2FtZSBhcyBgLS1vdXRwdXQtZGlyYCBvZiBidWlsZCBjb21tYW5kJyxcbiAgfSlcblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIG91dHB1dERpcjogdGhpcy5vdXRwdXREaXIsXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29tYmlsZSBidWlsdCBiaW5hcmllcyBpbnRvIG9uZSB1bml2ZXJzYWwgYmluYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pdmVyc2FsaXplT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGhcbiAgICpcbiAgICogQGRlZmF1bHQgcHJvY2Vzcy5jd2QoKVxuICAgKi9cbiAgY3dkPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlXG4gICAqL1xuICBjb25maWdQYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBwYWNrYWdlLmpzb25gXG4gICAqXG4gICAqIEBkZWZhdWx0ICdwYWNrYWdlLmpzb24nXG4gICAqL1xuICBwYWNrYWdlSnNvblBhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGZvbGRlciB3aGVyZSBhbGwgYnVpbHQgYC5ub2RlYCBmaWxlcyBwdXQsIHNhbWUgYXMgYC0tb3V0cHV0LWRpcmAgb2YgYnVpbGQgY29tbWFuZFxuICAgKlxuICAgKiBAZGVmYXVsdCAnLi8nXG4gICAqL1xuICBvdXRwdXREaXI/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVmYXVsdFVuaXZlcnNhbGl6ZU9wdGlvbnMob3B0aW9uczogVW5pdmVyc2FsaXplT3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBwYWNrYWdlSnNvblBhdGg6ICdwYWNrYWdlLmpzb24nLFxuICAgIG91dHB1dERpcjogJy4vJyxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQge1xuICBhcHBseURlZmF1bHRVbml2ZXJzYWxpemVPcHRpb25zLFxuICB0eXBlIFVuaXZlcnNhbGl6ZU9wdGlvbnMsXG59IGZyb20gJy4uL2RlZi91bml2ZXJzYWxpemUuanMnXG5pbXBvcnQgeyByZWFkTmFwaUNvbmZpZyB9IGZyb20gJy4uL3V0aWxzL2NvbmZpZy5qcydcbmltcG9ydCB7IGRlYnVnRmFjdG9yeSB9IGZyb20gJy4uL3V0aWxzL2xvZy5qcydcbmltcG9ydCB7IGZpbGVFeGlzdHMgfSBmcm9tICcuLi91dGlscy9taXNjLmpzJ1xuaW1wb3J0IHsgVW5pQXJjaHNCeVBsYXRmb3JtIH0gZnJvbSAnLi4vdXRpbHMvdGFyZ2V0LmpzJ1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgndW5pdmVyc2FsaXplJylcblxuZnVuY3Rpb24gY3JlYXRlRGFyd2luVW5pdmVyc2FsQmluYXJ5KGlucHV0czogc3RyaW5nW10sIG91dHB1dDogc3RyaW5nKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYygnbGlwbycsIFsnLWNyZWF0ZScsICctb3V0cHV0Jywgb3V0cHV0LCAuLi5pbnB1dHNdLCB7XG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSlcblxuICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgdGhyb3cgcmVzdWx0LmVycm9yXG4gIH1cblxuICBpZiAocmVzdWx0LnNpZ25hbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHVuaXZlcnNhbCBiaW5hcnkgJyR7b3V0cHV0fSc6IGxpcG8gdGVybWluYXRlZCB3aXRoIHNpZ25hbCAke3Jlc3VsdC5zaWduYWx9LmAsXG4gICAgKVxuICB9XG5cbiAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGNyZWF0ZSB1bml2ZXJzYWwgYmluYXJ5ICcke291dHB1dH0nOiBsaXBvIGV4aXRlZCB3aXRoIHN0YXR1cyAke3Jlc3VsdC5zdGF0dXN9LmAsXG4gICAgKVxuICB9XG59XG5cbmNvbnN0IHVuaXZlcnNhbGl6ZXJzOiBQYXJ0aWFsPFxuICBSZWNvcmQ8Tm9kZUpTLlBsYXRmb3JtLCAoaW5wdXRzOiBzdHJpbmdbXSwgb3V0cHV0OiBzdHJpbmcpID0+IHZvaWQ+XG4+ID0ge1xuICBkYXJ3aW46IGNyZWF0ZURhcndpblVuaXZlcnNhbEJpbmFyeSxcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVuaXZlcnNhbGl6ZUJpbmFyaWVzKHVzZXJPcHRpb25zOiBVbml2ZXJzYWxpemVPcHRpb25zKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcHBseURlZmF1bHRVbml2ZXJzYWxpemVPcHRpb25zKHVzZXJPcHRpb25zKVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMucGFja2FnZUpzb25QYXRoKVxuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgIHBhY2thZ2VKc29uUGF0aCxcbiAgICBvcHRpb25zLmNvbmZpZ1BhdGggPyByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLmNvbmZpZ1BhdGgpIDogdW5kZWZpbmVkLFxuICApXG5cbiAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldHMuZmluZChcbiAgICAodCkgPT4gdC5wbGF0Zm9ybSA9PT0gcHJvY2Vzcy5wbGF0Zm9ybSAmJiB0LmFyY2ggPT09ICd1bml2ZXJzYWwnLFxuICApXG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJ3VuaXZlcnNhbCcgYXJjaCBmb3IgcGxhdGZvcm0gJyR7cHJvY2Vzcy5wbGF0Zm9ybX0nIG5vdCBmb3VuZCBpbiBjb25maWchYCxcbiAgICApXG4gIH1cblxuICBjb25zdCBzcmNGaWxlcyA9IFVuaUFyY2hzQnlQbGF0Zm9ybVtwcm9jZXNzLnBsYXRmb3JtXT8ubWFwKChhcmNoKSA9PlxuICAgIHJlc29sdmUoXG4gICAgICBvcHRpb25zLmN3ZCxcbiAgICAgIG9wdGlvbnMub3V0cHV0RGlyLFxuICAgICAgYCR7Y29uZmlnLmJpbmFyeU5hbWV9LiR7cHJvY2Vzcy5wbGF0Zm9ybX0tJHthcmNofS5ub2RlYCxcbiAgICApLFxuICApXG5cbiAgaWYgKCFzcmNGaWxlcyB8fCAhdW5pdmVyc2FsaXplcnNbcHJvY2Vzcy5wbGF0Zm9ybV0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJ3VuaXZlcnNhbCcgYXJjaCBmb3IgcGxhdGZvcm0gJyR7cHJvY2Vzcy5wbGF0Zm9ybX0nIG5vdCBzdXBwb3J0ZWQuYCxcbiAgICApXG4gIH1cblxuICBkZWJ1ZyhgTG9va2luZyB1cCBzb3VyY2UgYmluYXJpZXMgdG8gY29tYmluZTogYClcbiAgZGVidWcoJyAgJU8nLCBzcmNGaWxlcylcblxuICBjb25zdCBzcmNGaWxlTG9va3VwID0gYXdhaXQgUHJvbWlzZS5hbGwoc3JjRmlsZXMubWFwKChmKSA9PiBmaWxlRXhpc3RzKGYpKSlcblxuICBjb25zdCBub3RGb3VuZEZpbGVzID0gc3JjRmlsZXMuZmlsdGVyKChfLCBpKSA9PiAhc3JjRmlsZUxvb2t1cFtpXSlcblxuICBpZiAobm90Rm91bmRGaWxlcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgU29tZSBiaW5hcnkgZmlsZXMgd2VyZSBub3QgZm91bmQ6ICR7SlNPTi5zdHJpbmdpZnkobm90Rm91bmRGaWxlcyl9YCxcbiAgICApXG4gIH1cblxuICBjb25zdCBvdXRwdXQgPSByZXNvbHZlKFxuICAgIG9wdGlvbnMuY3dkLFxuICAgIG9wdGlvbnMub3V0cHV0RGlyLFxuICAgIGAke2NvbmZpZy5iaW5hcnlOYW1lfS4ke3Byb2Nlc3MucGxhdGZvcm19LXVuaXZlcnNhbC5ub2RlYCxcbiAgKVxuXG4gIHVuaXZlcnNhbGl6ZXJzW3Byb2Nlc3MucGxhdGZvcm1dPy4oc3JjRmlsZXMsIG91dHB1dClcblxuICBpZiAoIShhd2FpdCBmaWxlRXhpc3RzKG91dHB1dCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbml2ZXJzYWwgYmluYXJ5IHdhcyBub3QgY3JlYXRlZDogJHtvdXRwdXR9YClcbiAgfVxuXG4gIGRlYnVnKGBQcm9kdWNlZCB1bml2ZXJzYWwgYmluYXJ5OiAke291dHB1dH1gKVxufVxuIiwiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NsaXBhbmlvbidcblxuaW1wb3J0IHsgY29sbGVjdEFydGlmYWN0cyB9IGZyb20gJy4uL2FwaS9hcnRpZmFjdHMuanMnXG5pbXBvcnQgeyBCYXNlQXJ0aWZhY3RzQ29tbWFuZCB9IGZyb20gJy4uL2RlZi9hcnRpZmFjdHMuanMnXG5cbmV4cG9ydCBjbGFzcyBBcnRpZmFjdHNDb21tYW5kIGV4dGVuZHMgQmFzZUFydGlmYWN0c0NvbW1hbmQge1xuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvcHkgYXJ0aWZhY3RzIGZyb20gR2l0aHViIEFjdGlvbnMgaW50byBzcGVjaWZpZWQgZGlyJyxcbiAgICBleGFtcGxlczogW1xuICAgICAgW1xuICAgICAgICAnJDAgYXJ0aWZhY3RzIC0tb3V0cHV0LWRpciAuL2FydGlmYWN0cyAtLWRpc3QgLi9ucG0nLFxuICAgICAgICBgQ29weSBbYmluYXJ5TmFtZV0uW3BsYXRmb3JtXS5ub2RlIHVuZGVyIGN1cnJlbnQgZGlyKC4pIGludG8gcGFja2FnZXMgdW5kZXIgbnBtIGRpci5cbmUuZzogaW5kZXgubGludXgteDY0LWdudS5ub2RlIC0tPiAuL25wbS9saW51eC14NjQtZ251L2luZGV4LmxpbnV4LXg2NC1nbnUubm9kZWAsXG4gICAgICBdLFxuICAgIF0sXG4gIH0pXG5cbiAgc3RhdGljIHBhdGhzID0gW1snYXJ0aWZhY3RzJ11dXG5cbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBhd2FpdCBjb2xsZWN0QXJ0aWZhY3RzKHRoaXMuZ2V0T3B0aW9ucygpKVxuICB9XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUJ1aWxkQ29tbWFuZCBleHRlbmRzIENvbW1hbmQge1xuICBzdGF0aWMgcGF0aHMgPSBbWydidWlsZCddXVxuXG4gIHN0YXRpYyB1c2FnZSA9IENvbW1hbmQuVXNhZ2Uoe1xuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgdGhlIE5BUEktUlMgcHJvamVjdCcsXG4gIH0pXG5cbiAgdGFyZ2V0Pzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS10YXJnZXQsLXQnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnQnVpbGQgZm9yIHRoZSB0YXJnZXQgdHJpcGxlLCBieXBhc3NlZCB0byBgY2FyZ28gYnVpbGQgLS10YXJnZXRgJyxcbiAgfSlcblxuICBjd2Q/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWN3ZCcsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGgnLFxuICB9KVxuXG4gIG1hbmlmZXN0UGF0aD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tbWFuaWZlc3QtcGF0aCcsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYENhcmdvLnRvbWxgJyxcbiAgfSlcblxuICBjb25maWdQYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1jb25maWctcGF0aCwtYycsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGUnLFxuICB9KVxuXG4gIHBhY2thZ2VKc29uUGF0aD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tcGFja2FnZS1qc29uLXBhdGgnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBwYWNrYWdlLmpzb25gJyxcbiAgfSlcblxuICB0YXJnZXREaXI/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLXRhcmdldC1kaXInLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRGlyZWN0b3J5IGZvciBhbGwgY3JhdGUgZ2VuZXJhdGVkIGFydGlmYWN0cywgc2VlIGBjYXJnbyBidWlsZCAtLXRhcmdldC1kaXJgJyxcbiAgfSlcblxuICBvdXRwdXREaXI/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLW91dHB1dC1kaXIsLW8nLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aCB0byB3aGVyZSBhbGwgdGhlIGJ1aWx0IGZpbGVzIHdvdWxkIGJlIHB1dC4gRGVmYXVsdCB0byB0aGUgY3JhdGUgZm9sZGVyJyxcbiAgfSlcblxuICBwbGF0Zm9ybT86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS1wbGF0Zm9ybScsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdBZGQgcGxhdGZvcm0gdHJpcGxlIHRvIHRoZSBnZW5lcmF0ZWQgbm9kZWpzIGJpbmRpbmcgZmlsZSwgZWc6IGBbbmFtZV0ubGludXgteDY0LWdudS5ub2RlYCcsXG4gIH0pXG5cbiAganNQYWNrYWdlTmFtZT86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tanMtcGFja2FnZS1uYW1lJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhY2thZ2UgbmFtZSBpbiBnZW5lcmF0ZWQganMgYmluZGluZyBmaWxlLiBPbmx5IHdvcmtzIHdpdGggYC0tcGxhdGZvcm1gIGZsYWcnLFxuICB9KVxuXG4gIGNvbnN0RW51bT86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS1jb25zdC1lbnVtJywge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBnZW5lcmF0ZSBjb25zdCBlbnVtIGZvciB0eXBlc2NyaXB0IGJpbmRpbmdzJyxcbiAgfSlcblxuICBydW50aW1lU3RyaW5nRW51bT86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS1ydW50aW1lLXN0cmluZy1lbnVtJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0VtaXQgYCNbbmFwaShzdHJpbmdfZW51bSldYCBlbnVtcyBhcyBydW50aW1lIGVudW1zIChgZXhwb3J0IGRlY2xhcmUgZW51bWApIHVuZGVyIGAtLW5vLWNvbnN0LWVudW1gLiBEZWZhdWx0OiB0eXBlLW9ubHkgdW5pb24uJyxcbiAgfSlcblxuICBqc0JpbmRpbmc/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWpzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGggYW5kIGZpbGVuYW1lIG9mIGdlbmVyYXRlZCBKUyBiaW5kaW5nIGZpbGUuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZy4gUmVsYXRpdmUgdG8gYC0tb3V0cHV0LWRpcmAuJyxcbiAgfSlcblxuICBub0pzQmluZGluZz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS1uby1qcycsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdXaGV0aGVyIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gSlMgYmluZGluZyBmaWxlLiBPbmx5IHdvcmtzIHdpdGggYC0tcGxhdGZvcm1gIGZsYWcuJyxcbiAgfSlcblxuICBkdHM/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWR0cycsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRoIGFuZCBmaWxlbmFtZSBvZiBnZW5lcmF0ZWQgdHlwZSBkZWYgZmlsZS4gUmVsYXRpdmUgdG8gYC0tb3V0cHV0LWRpcmAnLFxuICB9KVxuXG4gIGR0c0hlYWRlcj86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tZHRzLWhlYWRlcicsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdDdXN0b20gZmlsZSBoZWFkZXIgZm9yIGdlbmVyYXRlZCB0eXBlIGRlZiBmaWxlLiBPbmx5IHdvcmtzIHdoZW4gYHR5cGVkZWZgIGZlYXR1cmUgZW5hYmxlZC4nLFxuICB9KVxuXG4gIG5vRHRzSGVhZGVyPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLW5vLWR0cy1oZWFkZXInLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnV2hldGhlciB0byBkaXNhYmxlIHRoZSBkZWZhdWx0IGZpbGUgaGVhZGVyIGZvciBnZW5lcmF0ZWQgdHlwZSBkZWYgZmlsZS4gT25seSB3b3JrcyB3aGVuIGB0eXBlZGVmYCBmZWF0dXJlIGVuYWJsZWQuJyxcbiAgfSlcblxuICBkdHNDYWNoZSA9IE9wdGlvbi5Cb29sZWFuKCctLWR0cy1jYWNoZScsIHRydWUsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gZW5hYmxlIHRoZSBkdHMgY2FjaGUsIGRlZmF1bHQgdG8gdHJ1ZScsXG4gIH0pXG5cbiAgZXNtPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLWVzbScsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdXaGV0aGVyIHRvIGVtaXQgYW4gRVNNIEpTIGJpbmRpbmcgZmlsZSBpbnN0ZWFkIG9mIENKUyBmb3JtYXQuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZy4nLFxuICB9KVxuXG4gIHN0cmlwPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXN0cmlwLC1zJywge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBzdHJpcCB0aGUgbGlicmFyeSB0byBhY2hpZXZlIHRoZSBtaW5pbXVtIGZpbGUgc2l6ZScsXG4gIH0pXG5cbiAgcmVsZWFzZT86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS1yZWxlYXNlLC1yJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgaW4gcmVsZWFzZSBtb2RlJyxcbiAgfSlcblxuICB2ZXJib3NlPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXZlcmJvc2UsLXYnLCB7XG4gICAgZGVzY3JpcHRpb246ICdWZXJib3NlbHkgbG9nIGJ1aWxkIGNvbW1hbmQgdHJhY2UnLFxuICB9KVxuXG4gIGJpbj86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tYmluJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgb25seSB0aGUgc3BlY2lmaWVkIGJpbmFyeScsXG4gIH0pXG5cbiAgcGFja2FnZT86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tcGFja2FnZSwtcCcsIHtcbiAgICBkZXNjcmlwdGlvbjogJ0J1aWxkIHRoZSBzcGVjaWZpZWQgbGlicmFyeSBvciB0aGUgb25lIGF0IGN3ZCcsXG4gIH0pXG5cbiAgcHJvZmlsZT86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tcHJvZmlsZScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ0J1aWxkIGFydGlmYWN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvZmlsZScsXG4gIH0pXG5cbiAgY3Jvc3NDb21waWxlPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLWNyb3NzLWNvbXBpbGUsLXgnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnW2V4cGVyaW1lbnRhbF0gY3Jvc3MtY29tcGlsZSBmb3IgdGhlIHNwZWNpZmllZCB0YXJnZXQgd2l0aCBgY2FyZ28teHdpbmAgb24gd2luZG93cyBhbmQgYGNhcmdvLXppZ2J1aWxkYCBvbiBvdGhlciBwbGF0Zm9ybScsXG4gIH0pXG5cbiAgdXNlQ3Jvc3M/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tdXNlLWNyb3NzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1tleHBlcmltZW50YWxdIHVzZSBbY3Jvc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9jcm9zcy1ycy9jcm9zcykgaW5zdGVhZCBvZiBgY2FyZ29gJyxcbiAgfSlcblxuICB1c2VOYXBpQ3Jvc3M/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tdXNlLW5hcGktY3Jvc3MnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnW2V4cGVyaW1lbnRhbF0gdXNlIEBuYXBpLXJzL2Nyb3NzLXRvb2xjaGFpbiB0byBjcm9zcy1jb21waWxlIExpbnV4IGFybS9hcm02NC94NjQgZ251IHRhcmdldHMuJyxcbiAgfSlcblxuICB3YXRjaD86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS13YXRjaCwtdycsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICd3YXRjaCB0aGUgY3JhdGUgY2hhbmdlcyBhbmQgYnVpbGQgY29udGludW91c2x5IHdpdGggYGNhcmdvLXdhdGNoYCBjcmF0ZXMnLFxuICB9KVxuXG4gIGZlYXR1cmVzPzogc3RyaW5nW10gPSBPcHRpb24uQXJyYXkoJy0tZmVhdHVyZXMsLUYnLCB7XG4gICAgZGVzY3JpcHRpb246ICdTcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBmZWF0dXJlcyB0byBhY3RpdmF0ZScsXG4gIH0pXG5cbiAgYWxsRmVhdHVyZXM/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tYWxsLWZlYXR1cmVzJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZhdGUgYWxsIGF2YWlsYWJsZSBmZWF0dXJlcycsXG4gIH0pXG5cbiAgbm9EZWZhdWx0RmVhdHVyZXM/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tbm8tZGVmYXVsdC1mZWF0dXJlcycsIHtcbiAgICBkZXNjcmlwdGlvbjogJ0RvIG5vdCBhY3RpdmF0ZSB0aGUgYGRlZmF1bHRgIGZlYXR1cmUnLFxuICB9KVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogdGhpcy50YXJnZXQsXG4gICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgbWFuaWZlc3RQYXRoOiB0aGlzLm1hbmlmZXN0UGF0aCxcbiAgICAgIGNvbmZpZ1BhdGg6IHRoaXMuY29uZmlnUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uUGF0aDogdGhpcy5wYWNrYWdlSnNvblBhdGgsXG4gICAgICB0YXJnZXREaXI6IHRoaXMudGFyZ2V0RGlyLFxuICAgICAgb3V0cHV0RGlyOiB0aGlzLm91dHB1dERpcixcbiAgICAgIHBsYXRmb3JtOiB0aGlzLnBsYXRmb3JtLFxuICAgICAganNQYWNrYWdlTmFtZTogdGhpcy5qc1BhY2thZ2VOYW1lLFxuICAgICAgY29uc3RFbnVtOiB0aGlzLmNvbnN0RW51bSxcbiAgICAgIHJ1bnRpbWVTdHJpbmdFbnVtOiB0aGlzLnJ1bnRpbWVTdHJpbmdFbnVtLFxuICAgICAganNCaW5kaW5nOiB0aGlzLmpzQmluZGluZyxcbiAgICAgIG5vSnNCaW5kaW5nOiB0aGlzLm5vSnNCaW5kaW5nLFxuICAgICAgZHRzOiB0aGlzLmR0cyxcbiAgICAgIGR0c0hlYWRlcjogdGhpcy5kdHNIZWFkZXIsXG4gICAgICBub0R0c0hlYWRlcjogdGhpcy5ub0R0c0hlYWRlcixcbiAgICAgIGR0c0NhY2hlOiB0aGlzLmR0c0NhY2hlLFxuICAgICAgZXNtOiB0aGlzLmVzbSxcbiAgICAgIHN0cmlwOiB0aGlzLnN0cmlwLFxuICAgICAgcmVsZWFzZTogdGhpcy5yZWxlYXNlLFxuICAgICAgdmVyYm9zZTogdGhpcy52ZXJib3NlLFxuICAgICAgYmluOiB0aGlzLmJpbixcbiAgICAgIHBhY2thZ2U6IHRoaXMucGFja2FnZSxcbiAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgIGNyb3NzQ29tcGlsZTogdGhpcy5jcm9zc0NvbXBpbGUsXG4gICAgICB1c2VDcm9zczogdGhpcy51c2VDcm9zcyxcbiAgICAgIHVzZU5hcGlDcm9zczogdGhpcy51c2VOYXBpQ3Jvc3MsXG4gICAgICB3YXRjaDogdGhpcy53YXRjaCxcbiAgICAgIGZlYXR1cmVzOiB0aGlzLmZlYXR1cmVzLFxuICAgICAgYWxsRmVhdHVyZXM6IHRoaXMuYWxsRmVhdHVyZXMsXG4gICAgICBub0RlZmF1bHRGZWF0dXJlczogdGhpcy5ub0RlZmF1bHRGZWF0dXJlcyxcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgTkFQSS1SUyBwcm9qZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEJ1aWxkIGZvciB0aGUgdGFyZ2V0IHRyaXBsZSwgYnlwYXNzZWQgdG8gYGNhcmdvIGJ1aWxkIC0tdGFyZ2V0YFxuICAgKi9cbiAgdGFyZ2V0Pzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGhcbiAgICovXG4gIGN3ZD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgQ2FyZ28udG9tbGBcbiAgICovXG4gIG1hbmlmZXN0UGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZVxuICAgKi9cbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgcGFja2FnZS5qc29uYFxuICAgKi9cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgZm9yIGFsbCBjcmF0ZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzLCBzZWUgYGNhcmdvIGJ1aWxkIC0tdGFyZ2V0LWRpcmBcbiAgICovXG4gIHRhcmdldERpcj86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB3aGVyZSBhbGwgdGhlIGJ1aWx0IGZpbGVzIHdvdWxkIGJlIHB1dC4gRGVmYXVsdCB0byB0aGUgY3JhdGUgZm9sZGVyXG4gICAqL1xuICBvdXRwdXREaXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEFkZCBwbGF0Zm9ybSB0cmlwbGUgdG8gdGhlIGdlbmVyYXRlZCBub2RlanMgYmluZGluZyBmaWxlLCBlZzogYFtuYW1lXS5saW51eC14NjQtZ251Lm5vZGVgXG4gICAqL1xuICBwbGF0Zm9ybT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZSBpbiBnZW5lcmF0ZWQganMgYmluZGluZyBmaWxlLiBPbmx5IHdvcmtzIHdpdGggYC0tcGxhdGZvcm1gIGZsYWdcbiAgICovXG4gIGpzUGFja2FnZU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFdoZXRoZXIgZ2VuZXJhdGUgY29uc3QgZW51bSBmb3IgdHlwZXNjcmlwdCBiaW5kaW5nc1xuICAgKi9cbiAgY29uc3RFbnVtPzogYm9vbGVhblxuICAvKipcbiAgICogRW1pdCBgI1tuYXBpKHN0cmluZ19lbnVtKV1gIGVudW1zIGFzIHJ1bnRpbWUgZW51bXMgKGBleHBvcnQgZGVjbGFyZSBlbnVtYCkgdW5kZXIgYC0tbm8tY29uc3QtZW51bWAuIERlZmF1bHQ6IHR5cGUtb25seSB1bmlvbi5cbiAgICovXG4gIHJ1bnRpbWVTdHJpbmdFbnVtPzogYm9vbGVhblxuICAvKipcbiAgICogUGF0aCBhbmQgZmlsZW5hbWUgb2YgZ2VuZXJhdGVkIEpTIGJpbmRpbmcgZmlsZS4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLiBSZWxhdGl2ZSB0byBgLS1vdXRwdXQtZGlyYC5cbiAgICovXG4gIGpzQmluZGluZz86IHN0cmluZ1xuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIEpTIGJpbmRpbmcgZmlsZS4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLlxuICAgKi9cbiAgbm9Kc0JpbmRpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBQYXRoIGFuZCBmaWxlbmFtZSBvZiBnZW5lcmF0ZWQgdHlwZSBkZWYgZmlsZS4gUmVsYXRpdmUgdG8gYC0tb3V0cHV0LWRpcmBcbiAgICovXG4gIGR0cz86IHN0cmluZ1xuICAvKipcbiAgICogQ3VzdG9tIGZpbGUgaGVhZGVyIGZvciBnZW5lcmF0ZWQgdHlwZSBkZWYgZmlsZS4gT25seSB3b3JrcyB3aGVuIGB0eXBlZGVmYCBmZWF0dXJlIGVuYWJsZWQuXG4gICAqL1xuICBkdHNIZWFkZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBmaWxlIGhlYWRlciBmb3IgZ2VuZXJhdGVkIHR5cGUgZGVmIGZpbGUuIE9ubHkgd29ya3Mgd2hlbiBgdHlwZWRlZmAgZmVhdHVyZSBlbmFibGVkLlxuICAgKi9cbiAgbm9EdHNIZWFkZXI/OiBib29sZWFuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZHRzIGNhY2hlLCBkZWZhdWx0IHRvIHRydWVcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZHRzQ2FjaGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtaXQgYW4gRVNNIEpTIGJpbmRpbmcgZmlsZSBpbnN0ZWFkIG9mIENKUyBmb3JtYXQuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZy5cbiAgICovXG4gIGVzbT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc3RyaXAgdGhlIGxpYnJhcnkgdG8gYWNoaWV2ZSB0aGUgbWluaW11bSBmaWxlIHNpemVcbiAgICovXG4gIHN0cmlwPzogYm9vbGVhblxuICAvKipcbiAgICogQnVpbGQgaW4gcmVsZWFzZSBtb2RlXG4gICAqL1xuICByZWxlYXNlPzogYm9vbGVhblxuICAvKipcbiAgICogVmVyYm9zZWx5IGxvZyBidWlsZCBjb21tYW5kIHRyYWNlXG4gICAqL1xuICB2ZXJib3NlPzogYm9vbGVhblxuICAvKipcbiAgICogQnVpbGQgb25seSB0aGUgc3BlY2lmaWVkIGJpbmFyeVxuICAgKi9cbiAgYmluPzogc3RyaW5nXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgc3BlY2lmaWVkIGxpYnJhcnkgb3IgdGhlIG9uZSBhdCBjd2RcbiAgICovXG4gIHBhY2thZ2U/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEJ1aWxkIGFydGlmYWN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvZmlsZVxuICAgKi9cbiAgcHJvZmlsZT86IHN0cmluZ1xuICAvKipcbiAgICogW2V4cGVyaW1lbnRhbF0gY3Jvc3MtY29tcGlsZSBmb3IgdGhlIHNwZWNpZmllZCB0YXJnZXQgd2l0aCBgY2FyZ28teHdpbmAgb24gd2luZG93cyBhbmQgYGNhcmdvLXppZ2J1aWxkYCBvbiBvdGhlciBwbGF0Zm9ybVxuICAgKi9cbiAgY3Jvc3NDb21waWxlPzogYm9vbGVhblxuICAvKipcbiAgICogW2V4cGVyaW1lbnRhbF0gdXNlIFtjcm9zc10oaHR0cHM6Ly9naXRodWIuY29tL2Nyb3NzLXJzL2Nyb3NzKSBpbnN0ZWFkIG9mIGBjYXJnb2BcbiAgICovXG4gIHVzZUNyb3NzPzogYm9vbGVhblxuICAvKipcbiAgICogW2V4cGVyaW1lbnRhbF0gdXNlIEBuYXBpLXJzL2Nyb3NzLXRvb2xjaGFpbiB0byBjcm9zcy1jb21waWxlIExpbnV4IGFybS9hcm02NC94NjQgZ251IHRhcmdldHMuXG4gICAqL1xuICB1c2VOYXBpQ3Jvc3M/OiBib29sZWFuXG4gIC8qKlxuICAgKiB3YXRjaCB0aGUgY3JhdGUgY2hhbmdlcyBhbmQgYnVpbGQgY29udGludW91c2x5IHdpdGggYGNhcmdvLXdhdGNoYCBjcmF0ZXNcbiAgICovXG4gIHdhdGNoPzogYm9vbGVhblxuICAvKipcbiAgICogU3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgZmVhdHVyZXMgdG8gYWN0aXZhdGVcbiAgICovXG4gIGZlYXR1cmVzPzogc3RyaW5nW11cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGFsbCBhdmFpbGFibGUgZmVhdHVyZXNcbiAgICovXG4gIGFsbEZlYXR1cmVzPzogYm9vbGVhblxuICAvKipcbiAgICogRG8gbm90IGFjdGl2YXRlIHRoZSBgZGVmYXVsdGAgZmVhdHVyZVxuICAgKi9cbiAgbm9EZWZhdWx0RmVhdHVyZXM/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRCdWlsZE9wdGlvbnMob3B0aW9uczogQnVpbGRPcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgZHRzQ2FjaGU6IHRydWUsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxufVxuIiwiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5cbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJ2NsaXBhbmlvbidcblxuaW1wb3J0IHsgYnVpbGRQcm9qZWN0IH0gZnJvbSAnLi4vYXBpL2J1aWxkLmpzJ1xuaW1wb3J0IHsgQmFzZUJ1aWxkQ29tbWFuZCB9IGZyb20gJy4uL2RlZi9idWlsZC5qcydcbmltcG9ydCB7IGRlYnVnRmFjdG9yeSB9IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgnYnVpbGQnKVxuXG5leHBvcnQgY2xhc3MgQnVpbGRDb21tYW5kIGV4dGVuZHMgQmFzZUJ1aWxkQ29tbWFuZCB7XG4gIHBpcGUgPSBPcHRpb24uU3RyaW5nKCctLXBpcGUnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGlwZSBhbGwgb3V0cHV0cyBmaWxlIHRvIGdpdmVuIGNvbW1hbmQuIGUuZy4gYG5hcGkgYnVpbGQgLS1waXBlIFwibnB4IHByZXR0aWVyIC0td3JpdGVcImAnLFxuICB9KVxuXG4gIGNhcmdvT3B0aW9ucyA9IE9wdGlvbi5SZXN0KClcblxuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGNvbnN0IHsgdGFzayB9ID0gYXdhaXQgYnVpbGRQcm9qZWN0KHtcbiAgICAgIC4uLnRoaXMuZ2V0T3B0aW9ucygpLFxuICAgICAgY2FyZ29PcHRpb25zOiB0aGlzLmNhcmdvT3B0aW9ucyxcbiAgICB9KVxuXG4gICAgY29uc3Qgb3V0cHV0cyA9IGF3YWl0IHRhc2tcblxuICAgIGlmICh0aGlzLnBpcGUpIHtcbiAgICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMpIHtcbiAgICAgICAgZGVidWcoJ1BpcGluZyBvdXRwdXQgZmlsZSB0byBjb21tYW5kOiAlcycsIHRoaXMucGlwZSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBleGVjU3luYyhgJHt0aGlzLnBpcGV9ICR7b3V0cHV0LnBhdGh9YCwge1xuICAgICAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgICAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGRlYnVnLmVycm9yKGBGYWlsZWQgdG8gcGlwZSBvdXRwdXQgZmlsZSAke291dHB1dC5wYXRofSB0byBjb21tYW5kYClcbiAgICAgICAgICBkZWJ1Zy5lcnJvcihlKVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NsaXBhbmlvbidcblxuaW1wb3J0IHsgQ0xJX1ZFUlNJT04gfSBmcm9tICcuLi91dGlscy9taXNjLmpzJ1xuXG4vKipcbiAqIEEgY29tbWFuZCB0aGF0IHByaW50cyB0aGUgdmVyc2lvbiBvZiB0aGUgQ0xJLlxuICpcbiAqIFBhdGhzOiBgLXZgLCBgLS12ZXJzaW9uYFxuICovXG5leHBvcnQgY2xhc3MgQ2xpVmVyc2lvbkNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kPGFueT4ge1xuICBzdGF0aWMgcGF0aHMgPSBbW2AtdmBdLCBbYC0tdmVyc2lvbmBdXVxuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IHRoaXMuY29udGV4dC5zdGRvdXQud3JpdGUoYCR7Q0xJX1ZFUlNJT059XFxuYClcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlTnBtRGlycyB9IGZyb20gJy4uL2FwaS9jcmVhdGUtbnBtLWRpcnMuanMnXG5pbXBvcnQgeyBCYXNlQ3JlYXRlTnBtRGlyc0NvbW1hbmQgfSBmcm9tICcuLi9kZWYvY3JlYXRlLW5wbS1kaXJzLmpzJ1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlTnBtRGlyc0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ3JlYXRlTnBtRGlyc0NvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IGNyZWF0ZU5wbURpcnModGhpcy5nZXRPcHRpb25zKCkpXG4gIH1cbn1cbiIsImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjbGlwYW5pb24nXG5cbi8qKlxuICogQSBjb21tYW5kIHRoYXQgcHJpbnRzIHRoZSB1c2FnZSBvZiBhbGwgY29tbWFuZHMuXG4gKlxuICogUGF0aHM6IGAtaGAsIGAtLWhlbHBgXG4gKi9cbmV4cG9ydCBjbGFzcyBIZWxwQ29tbWFuZCBleHRlbmRzIENvbW1hbmQ8YW55PiB7XG4gIHN0YXRpYyBwYXRocyA9IFtbYC1oYF0sIFtgLS1oZWxwYF1dXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgdGhpcy5jb250ZXh0LnN0ZG91dC53cml0ZSh0aGlzLmNsaS51c2FnZSgpKVxuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCB7IGlucHV0LCBzZWxlY3QsIGNoZWNrYm94LCBjb25maXJtIH0gZnJvbSAnQGlucXVpcmVyL3Byb21wdHMnXG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmltcG9ydCB7IG5ld1Byb2plY3QgfSBmcm9tICcuLi9hcGkvbmV3LmpzJ1xuaW1wb3J0IHsgQmFzZU5ld0NvbW1hbmQgfSBmcm9tICcuLi9kZWYvbmV3LmpzJ1xuaW1wb3J0IHtcbiAgQVZBSUxBQkxFX1RBUkdFVFMsXG4gIGRlYnVnRmFjdG9yeSxcbiAgREVGQVVMVF9UQVJHRVRTLFxuICB0eXBlIFRhcmdldFRyaXBsZSxcbn0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5pbXBvcnQge1xuICBuYXBpRW5naW5lUmVxdWlyZW1lbnQsXG4gIFNVUFBPUlRFRF9OQVBJX1ZFUlNJT05TLFxufSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJ1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgnbmV3JylcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hcGlWZXJzaW9uQ2hvaWNlcygpIHtcbiAgcmV0dXJuIFNVUFBPUlRFRF9OQVBJX1ZFUlNJT05TLm1hcCgodmVyc2lvbikgPT4gKHtcbiAgICBuYW1lOiBgbmFwaSR7dmVyc2lvbn0gKCR7bmFwaUVuZ2luZVJlcXVpcmVtZW50KHZlcnNpb24pfSlgLFxuICAgIHZhbHVlOiB2ZXJzaW9uLFxuICB9KSlcbn1cblxuZXhwb3J0IGNsYXNzIE5ld0NvbW1hbmQgZXh0ZW5kcyBCYXNlTmV3Q29tbWFuZCB7XG4gIGludGVyYWN0aXZlID0gT3B0aW9uLkJvb2xlYW4oJy0taW50ZXJhY3RpdmUsLWknLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnQXNrIHByb2plY3QgYmFzaWMgaW5mb3JtYXRpb24gaW50ZXJhY3RpdmVseSB3aXRob3V0IGp1c3QgdXNpbmcgdGhlIGRlZmF1bHQuJyxcbiAgfSlcblxuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgdGhpcy5mZXRjaE9wdGlvbnMoKVxuICAgICAgYXdhaXQgbmV3UHJvamVjdChvcHRpb25zKVxuICAgICAgcmV0dXJuIDBcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1ZygnRmFpbGVkIHRvIGNyZWF0ZSBuZXcgcHJvamVjdCcpXG4gICAgICBkZWJ1Zy5lcnJvcihlKVxuICAgICAgcmV0dXJuIDFcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoT3B0aW9ucygpIHtcbiAgICBjb25zdCBjbWRPcHRpb25zID0gc3VwZXIuZ2V0T3B0aW9ucygpXG5cbiAgICBpZiAodGhpcy5pbnRlcmFjdGl2ZSkge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aDogc3RyaW5nID0gY21kT3B0aW9ucy5wYXRoXG4gICAgICAgID8gY21kT3B0aW9ucy5wYXRoXG4gICAgICAgIDogYXdhaXQgaW5xdWlyZXJQcm9qZWN0UGF0aCgpXG4gICAgICBjbWRPcHRpb25zLnBhdGggPSB0YXJnZXRQYXRoXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jbWRPcHRpb25zLFxuICAgICAgICBuYW1lOiBhd2FpdCB0aGlzLmZldGNoTmFtZShwYXRoLnBhcnNlKHRhcmdldFBhdGgpLmJhc2UpLFxuICAgICAgICBtaW5Ob2RlQXBpVmVyc2lvbjogYXdhaXQgdGhpcy5mZXRjaE5hcGlWZXJzaW9uKCksXG4gICAgICAgIHRhcmdldHM6IGF3YWl0IHRoaXMuZmV0Y2hUYXJnZXRzKCksXG4gICAgICAgIGxpY2Vuc2U6IGF3YWl0IHRoaXMuZmV0Y2hMaWNlbnNlKCksXG4gICAgICAgIGVuYWJsZVR5cGVEZWY6IGF3YWl0IHRoaXMuZmV0Y2hUeXBlRGVmKCksXG4gICAgICAgIGVuYWJsZUdpdGh1YkFjdGlvbnM6IGF3YWl0IHRoaXMuZmV0Y2hHaXRodWJBY3Rpb25zKCksXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNtZE9wdGlvbnNcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hOYW1lKGRlZmF1bHROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLiQkbmFtZSA/P1xuICAgICAgaW5wdXQoe1xuICAgICAgICBtZXNzYWdlOiAnUGFja2FnZSBuYW1lICh0aGUgbmFtZSBmaWVsZCBpbiB5b3VyIHBhY2thZ2UuanNvbiBmaWxlKScsXG4gICAgICAgIGRlZmF1bHQ6IGRlZmF1bHROYW1lLFxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoTGljZW5zZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBpbnB1dCh7XG4gICAgICBtZXNzYWdlOiAnTGljZW5zZSBmb3Igb3Blbi1zb3VyY2VkIHByb2plY3QnLFxuICAgICAgZGVmYXVsdDogdGhpcy5saWNlbnNlLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoTmFwaVZlcnNpb24oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gc2VsZWN0KHtcbiAgICAgIG1lc3NhZ2U6ICdNaW5pbXVtIG5vZGUtYXBpIHZlcnNpb24gKHdpdGggbm9kZSB2ZXJzaW9uIHJlcXVpcmVtZW50KScsXG4gICAgICBsb29wOiBmYWxzZSxcbiAgICAgIHBhZ2VTaXplOiAxMCxcbiAgICAgIGNob2ljZXM6IGdldE5hcGlWZXJzaW9uQ2hvaWNlcygpLFxuICAgICAgLy8gY2hvaWNlIGluZGV4XG4gICAgICBkZWZhdWx0OiB0aGlzLm1pbk5vZGVBcGlWZXJzaW9uIC0gMSxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFRhcmdldHMoKTogUHJvbWlzZTxUYXJnZXRUcmlwbGVbXT4ge1xuICAgIGlmICh0aGlzLmVuYWJsZUFsbFRhcmdldHMpIHtcbiAgICAgIHJldHVybiBBVkFJTEFCTEVfVEFSR0VUUy5jb25jYXQoKVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCBjaGVja2JveCh7XG4gICAgICBsb29wOiBmYWxzZSxcbiAgICAgIG1lc3NhZ2U6ICdDaG9vc2UgdGFyZ2V0KHMpIHlvdXIgY3JhdGUgd2lsbCBiZSBjb21waWxlZCB0bycsXG4gICAgICBjaG9pY2VzOiBBVkFJTEFCTEVfVEFSR0VUUy5tYXAoKHRhcmdldCkgPT4gKHtcbiAgICAgICAgbmFtZTogdGFyZ2V0LFxuICAgICAgICB2YWx1ZTogdGFyZ2V0LFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGNoZWNrZWQ6IERFRkFVTFRfVEFSR0VUUy5pbmNsdWRlcyh0YXJnZXQpLFxuICAgICAgfSkpLFxuICAgIH0pXG5cbiAgICByZXR1cm4gdGFyZ2V0c1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFR5cGVEZWYoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZW5hYmxlVHlwZURlZiA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgbWVzc2FnZTogJ0VuYWJsZSB0eXBlIGRlZmluaXRpb24gYXV0by1nZW5lcmF0aW9uJyxcbiAgICAgIGRlZmF1bHQ6IHRoaXMuZW5hYmxlVHlwZURlZixcbiAgICB9KVxuXG4gICAgcmV0dXJuIGVuYWJsZVR5cGVEZWZcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hHaXRodWJBY3Rpb25zKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGVuYWJsZUdpdGh1YkFjdGlvbnMgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgIG1lc3NhZ2U6ICdFbmFibGUgR2l0aHViIEFjdGlvbnMgQ0knLFxuICAgICAgZGVmYXVsdDogdGhpcy5lbmFibGVHaXRodWJBY3Rpb25zLFxuICAgIH0pXG5cbiAgICByZXR1cm4gZW5hYmxlR2l0aHViQWN0aW9uc1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlucXVpcmVyUHJvamVjdFBhdGgoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIGlucHV0KHtcbiAgICBtZXNzYWdlOiAnVGFyZ2V0IHBhdGggdG8gY3JlYXRlIHRoZSBwcm9qZWN0LCByZWxhdGl2ZSB0byBjd2QuJyxcbiAgfSkudGhlbigocGF0aCkgPT4ge1xuICAgIGlmICghcGF0aCkge1xuICAgICAgcmV0dXJuIGlucXVpcmVyUHJvamVjdFBhdGgoKVxuICAgIH1cbiAgICByZXR1cm4gcGF0aFxuICB9KVxufVxuIiwiaW1wb3J0IHsgcHJlUHVibGlzaCB9IGZyb20gJy4uL2FwaS9wcmUtcHVibGlzaC5qcydcbmltcG9ydCB7IEJhc2VQcmVQdWJsaXNoQ29tbWFuZCB9IGZyb20gJy4uL2RlZi9wcmUtcHVibGlzaC5qcydcblxuZXhwb3J0IGNsYXNzIFByZVB1Ymxpc2hDb21tYW5kIGV4dGVuZHMgQmFzZVByZVB1Ymxpc2hDb21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNvbnN0ICducG0nIHwgJ2xlcm5hJyB0byBzdHJpbmdcbiAgICBhd2FpdCBwcmVQdWJsaXNoKHRoaXMuZ2V0T3B0aW9ucygpKVxuICB9XG59XG4iLCJpbXBvcnQgeyBpbnB1dCB9IGZyb20gJ0BpbnF1aXJlci9wcm9tcHRzJ1xuXG5pbXBvcnQgeyByZW5hbWVQcm9qZWN0IH0gZnJvbSAnLi4vYXBpL3JlbmFtZS5qcydcbmltcG9ydCB7IEJhc2VSZW5hbWVDb21tYW5kIH0gZnJvbSAnLi4vZGVmL3JlbmFtZS5qcydcblxuZXhwb3J0IGNsYXNzIFJlbmFtZUNvbW1hbmQgZXh0ZW5kcyBCYXNlUmVuYW1lQ29tbWFuZCB7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpXG4gICAgaWYgKCFvcHRpb25zLm5hbWUpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBhd2FpdCBpbnB1dCh7XG4gICAgICAgIG1lc3NhZ2U6IGBFbnRlciB0aGUgbmV3IHBhY2thZ2UgbmFtZSBpbiB0aGUgcGFja2FnZS5qc29uYCxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9KVxuICAgICAgb3B0aW9ucy5uYW1lID0gbmFtZVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuYmluYXJ5TmFtZSkge1xuICAgICAgY29uc3QgYmluYXJ5TmFtZSA9IGF3YWl0IGlucHV0KHtcbiAgICAgICAgbWVzc2FnZTogYEVudGVyIHRoZSBuZXcgYmluYXJ5IG5hbWVgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBvcHRpb25zLmJpbmFyeU5hbWUgPSBiaW5hcnlOYW1lXG4gICAgfVxuICAgIGF3YWl0IHJlbmFtZVByb2plY3Qob3B0aW9ucylcbiAgfVxufVxuIiwiaW1wb3J0IHsgdW5pdmVyc2FsaXplQmluYXJpZXMgfSBmcm9tICcuLi9hcGkvdW5pdmVyc2FsaXplLmpzJ1xuaW1wb3J0IHsgQmFzZVVuaXZlcnNhbGl6ZUNvbW1hbmQgfSBmcm9tICcuLi9kZWYvdW5pdmVyc2FsaXplLmpzJ1xuXG5leHBvcnQgY2xhc3MgVW5pdmVyc2FsaXplQ29tbWFuZCBleHRlbmRzIEJhc2VVbml2ZXJzYWxpemVDb21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBhd2FpdCB1bml2ZXJzYWxpemVCaW5hcmllcyh0aGlzLmdldE9wdGlvbnMoKSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL2FwaS92ZXJzaW9uLmpzJ1xuaW1wb3J0IHsgQmFzZVZlcnNpb25Db21tYW5kIH0gZnJvbSAnLi4vZGVmL3ZlcnNpb24uanMnXG5cbmV4cG9ydCBjbGFzcyBWZXJzaW9uQ29tbWFuZCBleHRlbmRzIEJhc2VWZXJzaW9uQ29tbWFuZCB7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgdmVyc2lvbih0aGlzLmdldE9wdGlvbnMoKSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2xpIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5pbXBvcnQgeyBjb2xsZWN0QXJ0aWZhY3RzIH0gZnJvbSAnLi9hcGkvYXJ0aWZhY3RzLmpzJ1xuaW1wb3J0IHsgYnVpbGRQcm9qZWN0IH0gZnJvbSAnLi9hcGkvYnVpbGQuanMnXG5pbXBvcnQgeyBjcmVhdGVOcG1EaXJzIH0gZnJvbSAnLi9hcGkvY3JlYXRlLW5wbS1kaXJzLmpzJ1xuaW1wb3J0IHsgbmV3UHJvamVjdCB9IGZyb20gJy4vYXBpL25ldy5qcydcbmltcG9ydCB7IHByZVB1Ymxpc2ggfSBmcm9tICcuL2FwaS9wcmUtcHVibGlzaC5qcydcbmltcG9ydCB7IHJlbmFtZVByb2plY3QgfSBmcm9tICcuL2FwaS9yZW5hbWUuanMnXG5pbXBvcnQgeyB1bml2ZXJzYWxpemVCaW5hcmllcyB9IGZyb20gJy4vYXBpL3VuaXZlcnNhbGl6ZS5qcydcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL2FwaS92ZXJzaW9uLmpzJ1xuaW1wb3J0IHsgQXJ0aWZhY3RzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYXJ0aWZhY3RzLmpzJ1xuaW1wb3J0IHsgQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZC5qcydcbmltcG9ydCB7IENsaVZlcnNpb25Db21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jbGktdmVyc2lvbi5qcydcbmltcG9ydCB7IENyZWF0ZU5wbURpcnNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jcmVhdGUtbnBtLWRpcnMuanMnXG5pbXBvcnQgeyBIZWxwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvaGVscC5qcydcbmltcG9ydCB7IE5ld0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL25ldy5qcydcbmltcG9ydCB7IFByZVB1Ymxpc2hDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmUtcHVibGlzaC5qcydcbmltcG9ydCB7IFJlbmFtZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JlbmFtZS5qcydcbmltcG9ydCB7IFVuaXZlcnNhbGl6ZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3VuaXZlcnNhbGl6ZS5qcydcbmltcG9ydCB7IFZlcnNpb25Db21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJzaW9uLmpzJ1xuaW1wb3J0IHsgQ0xJX1ZFUlNJT04gfSBmcm9tICcuL3V0aWxzL21pc2MuanMnXG5cbmV4cG9ydCBjb25zdCBjbGkgPSBuZXcgQ2xpKHtcbiAgYmluYXJ5TmFtZTogJ25hcGknLFxuICBiaW5hcnlWZXJzaW9uOiBDTElfVkVSU0lPTixcbn0pXG5cbmNsaS5yZWdpc3RlcihOZXdDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKEJ1aWxkQ29tbWFuZClcbmNsaS5yZWdpc3RlcihDcmVhdGVOcG1EaXJzQ29tbWFuZClcbmNsaS5yZWdpc3RlcihBcnRpZmFjdHNDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKFVuaXZlcnNhbGl6ZUNvbW1hbmQpXG5jbGkucmVnaXN0ZXIoUmVuYW1lQ29tbWFuZClcbmNsaS5yZWdpc3RlcihQcmVQdWJsaXNoQ29tbWFuZClcbmNsaS5yZWdpc3RlcihWZXJzaW9uQ29tbWFuZClcbmNsaS5yZWdpc3RlcihIZWxwQ29tbWFuZClcbmNsaS5yZWdpc3RlcihDbGlWZXJzaW9uQ29tbWFuZClcblxuLyoqXG4gKlxuICogQHVzYWdlXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNsaSA9IG5ldyBOYXBpQ2xpKClcbiAqXG4gKiBjbGkuYnVpbGQoe1xuICogICBjd2Q6ICcvcGF0aC90by95b3VyL3Byb2plY3QnLFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTmFwaUNsaSB7XG4gIGFydGlmYWN0cyA9IGNvbGxlY3RBcnRpZmFjdHNcbiAgbmV3ID0gbmV3UHJvamVjdFxuICBidWlsZCA9IGJ1aWxkUHJvamVjdFxuICBjcmVhdGVOcG1EaXJzID0gY3JlYXRlTnBtRGlyc1xuICBwcmVQdWJsaXNoID0gcHJlUHVibGlzaFxuICByZW5hbWUgPSByZW5hbWVQcm9qZWN0XG4gIHVuaXZlcnNhbGl6ZSA9IHVuaXZlcnNhbGl6ZUJpbmFyaWVzXG4gIHZlcnNpb24gPSB2ZXJzaW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdWlsZENvbW1hbmQoYXJnczogc3RyaW5nW10pOiBCdWlsZENvbW1hbmQge1xuICByZXR1cm4gY2xpLnByb2Nlc3MoWydidWlsZCcsIC4uLmFyZ3NdKSBhcyBCdWlsZENvbW1hbmRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFydGlmYWN0c0NvbW1hbmQoYXJnczogc3RyaW5nW10pOiBBcnRpZmFjdHNDb21tYW5kIHtcbiAgcmV0dXJuIGNsaS5wcm9jZXNzKFsnYXJ0aWZhY3RzJywgLi4uYXJnc10pIGFzIEFydGlmYWN0c0NvbW1hbmRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNyZWF0ZU5wbURpcnNDb21tYW5kKFxuICBhcmdzOiBzdHJpbmdbXSxcbik6IENyZWF0ZU5wbURpcnNDb21tYW5kIHtcbiAgcmV0dXJuIGNsaS5wcm9jZXNzKFsnY3JlYXRlLW5wbS1kaXJzJywgLi4uYXJnc10pIGFzIENyZWF0ZU5wbURpcnNDb21tYW5kXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcmVQdWJsaXNoQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IFByZVB1Ymxpc2hDb21tYW5kIHtcbiAgcmV0dXJuIGNsaS5wcm9jZXNzKFsncHJlLXB1Ymxpc2gnLCAuLi5hcmdzXSkgYXMgUHJlUHVibGlzaENvbW1hbmRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbmFtZUNvbW1hbmQoYXJnczogc3RyaW5nW10pOiBSZW5hbWVDb21tYW5kIHtcbiAgcmV0dXJuIGNsaS5wcm9jZXNzKFsncmVuYW1lJywgLi4uYXJnc10pIGFzIFJlbmFtZUNvbW1hbmRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVuaXZlcnNhbGl6ZUNvbW1hbmQoYXJnczogc3RyaW5nW10pOiBVbml2ZXJzYWxpemVDb21tYW5kIHtcbiAgcmV0dXJuIGNsaS5wcm9jZXNzKFsndW5pdmVyc2FsaXplJywgLi4uYXJnc10pIGFzIFVuaXZlcnNhbGl6ZUNvbW1hbmRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZlcnNpb25Db21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogVmVyc2lvbkNvbW1hbmQge1xuICByZXR1cm4gY2xpLnByb2Nlc3MoWyd2ZXJzaW9uJywgLi4uYXJnc10pIGFzIFZlcnNpb25Db21tYW5kXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOZXdDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogTmV3Q29tbWFuZCB7XG4gIHJldHVybiBjbGkucHJvY2VzcyhbJ25ldycsIC4uLmFyZ3NdKSBhcyBOZXdDb21tYW5kXG59XG5cbmV4cG9ydCB7IHBhcnNlVHJpcGxlIH0gZnJvbSAnLi91dGlscy90YXJnZXQuanMnXG5leHBvcnQge1xuICB0eXBlIEdlbmVyYXRlVHlwZURlZk9wdGlvbnMsXG4gIHR5cGUgV3JpdGVKc0JpbmRpbmdPcHRpb25zLFxuICB3cml0ZUpzQmluZGluZyxcbiAgZ2VuZXJhdGVUeXBlRGVmLFxufSBmcm9tICcuL2FwaS9idWlsZC5qcydcbmV4cG9ydCB7IHJlYWROYXBpQ29uZmlnIH0gZnJvbSAnLi91dGlscy9jb25maWcuanMnXG4iLCIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IGNsaSB9IGZyb20gJy4vaW5kZXguanMnXG5cbnZvaWQgY2xpLnJ1bkV4aXQocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlsxOCwxOSwyMCwyMSwyMywyNCwyNV0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsSUFBc0IsdUJBQXRCLGNBQW1ELFFBQVE7Q0FDekQsT0FBTyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUM7Q0FFOUIsT0FBTyxRQUFRLFFBQVEsTUFBTSxFQUMzQixhQUNFLDZFQUNILENBQUM7Q0FFRixNQUFNLE9BQU8sT0FBTyxTQUFTLFFBQVEsS0FBSyxFQUFFLEVBQzFDLGFBQ0Usc0hBQ0gsQ0FBQztDQUVGLGFBQXNCLE9BQU8sT0FBTyxvQkFBb0IsRUFDdEQsYUFBYSxtQ0FDZCxDQUFDO0NBRUYsa0JBQWtCLE9BQU8sT0FBTyx1QkFBdUIsZ0JBQWdCLEVBQ3JFLGFBQWEsMEJBQ2QsQ0FBQztDQUVGLFlBQVksT0FBTyxPQUFPLHNCQUFzQixlQUFlLEVBQzdELGFBQ0UsaUdBQ0gsQ0FBQztDQUVGLFNBQVMsT0FBTyxPQUFPLGFBQWEsT0FBTyxFQUN6QyxhQUFhLGlEQUNkLENBQUM7Q0FFRixpQkFBMEIsT0FBTyxPQUFPLHNCQUFzQixFQUM1RCxhQUNFLG1GQUNILENBQUM7Q0FFRixhQUFhO0VBQ1gsT0FBTztHQUNMLEtBQUssS0FBSztHQUNWLFlBQVksS0FBSztHQUNqQixpQkFBaUIsS0FBSztHQUN0QixXQUFXLEtBQUs7R0FDaEIsUUFBUSxLQUFLO0dBQ2IsZ0JBQWdCLEtBQUs7R0FDdEI7OztBQTBDTCxTQUFnQiw2QkFBNkIsU0FBMkI7Q0FDdEUsT0FBTztFQUNMLEtBQUssUUFBUSxLQUFLO0VBQ2xCLGlCQUFpQjtFQUNqQixXQUFXO0VBQ1gsUUFBUTtFQUNSLEdBQUc7RUFDSjs7OztBQ3JGSCxNQUFhLGdCQUFnQixjQUFzQjtDQUNqRCxNQUFNLFFBQVEsWUFBWSxR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
3862
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwibmFtZXMiOlsiZGVidWciLCJwaWNrIiwicGtnSnNvbi52ZXJzaW9uIiwiZGVidWciLCJkZWJ1ZyIsInJlcXVpcmUiLCJkZWJ1ZyIsIm1rZGlyQXN5bmMiLCJyYXdNa2RpckFzeW5jIiwid3JpdGVGaWxlQXN5bmMiLCJyYXdXcml0ZUZpbGVBc3luYyIsInBpY2siLCIjcHJpbnRPYmplY3QiLCIjZm9ybWF0IiwiI2lzU2ltcGx5U2VyaWFsaXphYmxlIiwiI2RhdGVEZWNsYXJhdGlvbiIsIiNzdHJEZWNsYXJhdGlvbiIsIiNudW1iZXJEZWNsYXJhdGlvbiIsIiNib29sRGVjbGFyYXRpb24iLCIjZ2V0VHlwZU9mQXJyYXkiLCIjYXJyYXlEZWNsYXJhdGlvbiIsIiNoZWFkZXJHcm91cCIsIiNwcmludEFzSW5saW5lVmFsdWUiLCIjZGVjbGFyYXRpb24iLCIjaGVhZGVyIiwiI2FycmF5VHlwZUNhY2hlIiwiI2RvR2V0VHlwZU9mQXJyYXkiLCIjaXNQcmltaXRpdmUiLCIjcHJpbnREYXRlIiwiI3NvdXJjZSIsIiNwb3NpdGlvbiIsIiN3aGl0ZXNwYWNlIiwiam9pbiIsIm1lcmdlIiwicGFyc2UiLCJ3YWxrLnVwIiwicGFyc2VUb21sIiwic3RyaW5naWZ5VG9tbCIsImZpbmQuZGlyIiwieWFtbFBhcnNlIiwieWFtbFN0cmluZ2lmeSIsImRlYnVnIiwiZnMiLCJwYXJzZVRvbWwiLCJzdHJpbmdpZnlUb21sIiwieWFtbExvYWQiLCJ5YW1sRHVtcCIsImRlYnVnIiwiZGVidWciLCJkZWJ1ZyIsImRlYnVnIl0sInNvdXJjZXMiOlsiLi4vc3JjL2RlZi9hcnRpZmFjdHMudHMiLCIuLi9zcmMvdXRpbHMvbG9nLnRzIiwiLi4vcGFja2FnZS5qc29uIiwiLi4vc3JjL3V0aWxzL21pc2MudHMiLCIuLi9zcmMvdXRpbHMvdGFyZ2V0LnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvbWV0YWRhdGEudHMiLCIuLi9zcmMvdXRpbHMvY29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2NhcmdvLnRzIiwiLi4vc3JjL3V0aWxzL3R5cGVnZW4udHMiLCIuLi9zcmMvdXRpbHMvcmVhZC1jb25maWcudHMiLCIuLi9zcmMvYXBpL2FydGlmYWN0cy50cyIsIi4uL3NyYy9hcGkvdGVtcGxhdGVzL2pzLWJpbmRpbmcudHMiLCIuLi9zcmMvYXBpL3RlbXBsYXRlcy9sb2FkLXdhc2ktdGVtcGxhdGUudHMiLCIuLi9zcmMvYXBpL3RlbXBsYXRlcy93YXNpLXdvcmtlci10ZW1wbGF0ZS50cyIsIi4uL3NyYy9hcGkvYnVpbGQudHMiLCIuLi9zcmMvZGVmL2NyZWF0ZS1ucG0tZGlycy50cyIsIi4uL3NyYy9hcGkvY3JlYXRlLW5wbS1kaXJzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BzdGQvdG9tbC9zdHJpbmdpZnkuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGpzci9zdGRfX2NvbGxlY3Rpb25zL2RlZXBfbWVyZ2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHN0ZC90b21sL19wYXJzZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHN0ZC90b21sL3BhcnNlLmpzIiwiLi4vc3JjL2RlZi9uZXcudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZW1wYXRoaWMvcmVzb2x2ZS5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZW1wYXRoaWMvd2Fsay5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZW1wYXRoaWMvZmluZC5tanMiLCIuLi9zcmMvZGVmL3JlbmFtZS50cyIsIi4uL3NyYy9hcGkvcmVuYW1lLnRzIiwiLi4vc3JjL2FwaS9uZXcudHMiLCIuLi9zcmMvZGVmL3ByZS1wdWJsaXNoLnRzIiwiLi4vc3JjL2RlZi92ZXJzaW9uLnRzIiwiLi4vc3JjL2FwaS92ZXJzaW9uLnRzIiwiLi4vc3JjL2FwaS9wcmUtcHVibGlzaC50cyIsIi4uL3NyYy9kZWYvdW5pdmVyc2FsaXplLnRzIiwiLi4vc3JjL2FwaS91bml2ZXJzYWxpemUudHMiLCIuLi9zcmMvY29tbWFuZHMvYXJ0aWZhY3RzLnRzIiwiLi4vc3JjL2RlZi9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9jbGktdmVyc2lvbi50cyIsIi4uL3NyYy9jb21tYW5kcy9jcmVhdGUtbnBtLWRpcnMudHMiLCIuLi9zcmMvY29tbWFuZHMvaGVscC50cyIsIi4uL3NyYy9jb21tYW5kcy9uZXcudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJlLXB1Ymxpc2gudHMiLCIuLi9zcmMvY29tbWFuZHMvcmVuYW1lLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3VuaXZlcnNhbGl6ZS50cyIsIi4uL3NyYy9jb21tYW5kcy92ZXJzaW9uLnRzIiwiLi4vc3JjL2luZGV4LnRzIiwiLi4vc3JjL2NsaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUFydGlmYWN0c0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIHBhdGhzID0gW1snYXJ0aWZhY3RzJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnQ29weSBhcnRpZmFjdHMgZnJvbSBHaXRodWIgQWN0aW9ucyBpbnRvIG5wbSBwYWNrYWdlcyBhbmQgcmVhZHkgdG8gcHVibGlzaCcsXG4gIH0pXG5cbiAgY3dkID0gT3B0aW9uLlN0cmluZygnLS1jd2QnLCBwcm9jZXNzLmN3ZCgpLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoJyxcbiAgfSlcblxuICBjb25maWdQYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1jb25maWctcGF0aCwtYycsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGUnLFxuICB9KVxuXG4gIHBhY2thZ2VKc29uUGF0aCA9IE9wdGlvbi5TdHJpbmcoJy0tcGFja2FnZS1qc29uLXBhdGgnLCAncGFja2FnZS5qc29uJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgcGFja2FnZS5qc29uYCcsXG4gIH0pXG5cbiAgb3V0cHV0RGlyID0gT3B0aW9uLlN0cmluZygnLS1vdXRwdXQtZGlyLC1vLC1kJywgJy4vYXJ0aWZhY3RzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGggdG8gdGhlIGZvbGRlciB3aGVyZSBhbGwgYnVpbHQgYC5ub2RlYCBmaWxlcyBwdXQsIHNhbWUgYXMgYC0tb3V0cHV0LWRpcmAgb2YgYnVpbGQgY29tbWFuZCcsXG4gIH0pXG5cbiAgbnBtRGlyID0gT3B0aW9uLlN0cmluZygnLS1ucG0tZGlyJywgJ25wbScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gdGhlIGZvbGRlciB3aGVyZSB0aGUgbnBtIHBhY2thZ2VzIHB1dCcsXG4gIH0pXG5cbiAgYnVpbGRPdXRwdXREaXI/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWJ1aWxkLW91dHB1dC1kaXInLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aCB0byB0aGUgYnVpbGQgb3V0cHV0IGRpciwgb25seSBuZWVkZWQgd2hlbiB0YXJnZXRzIGNvbnRhaW5zIGB3YXNtMzItd2FzaS0qYCcsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgIGNvbmZpZ1BhdGg6IHRoaXMuY29uZmlnUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uUGF0aDogdGhpcy5wYWNrYWdlSnNvblBhdGgsXG4gICAgICBvdXRwdXREaXI6IHRoaXMub3V0cHV0RGlyLFxuICAgICAgbnBtRGlyOiB0aGlzLm5wbURpcixcbiAgICAgIGJ1aWxkT3V0cHV0RGlyOiB0aGlzLmJ1aWxkT3V0cHV0RGlyLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcHkgYXJ0aWZhY3RzIGZyb20gR2l0aHViIEFjdGlvbnMgaW50byBucG0gcGFja2FnZXMgYW5kIHJlYWR5IHRvIHB1Ymxpc2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcnRpZmFjdHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aFxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9jZXNzLmN3ZCgpXG4gICAqL1xuICBjd2Q/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGVcbiAgICovXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYHBhY2thZ2UuanNvbmBcbiAgICpcbiAgICogQGRlZmF1bHQgJ3BhY2thZ2UuanNvbidcbiAgICovXG4gIHBhY2thZ2VKc29uUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIGFsbCBidWlsdCBgLm5vZGVgIGZpbGVzIHB1dCwgc2FtZSBhcyBgLS1vdXRwdXQtZGlyYCBvZiBidWlsZCBjb21tYW5kXG4gICAqXG4gICAqIEBkZWZhdWx0ICcuL2FydGlmYWN0cydcbiAgICovXG4gIG91dHB1dERpcj86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0XG4gICAqXG4gICAqIEBkZWZhdWx0ICducG0nXG4gICAqL1xuICBucG1EaXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGJ1aWxkIG91dHB1dCBkaXIsIG9ubHkgbmVlZGVkIHdoZW4gdGFyZ2V0cyBjb250YWlucyBgd2FzbTMyLXdhc2ktKmBcbiAgICovXG4gIGJ1aWxkT3V0cHV0RGlyPzogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRBcnRpZmFjdHNPcHRpb25zKG9wdGlvbnM6IEFydGlmYWN0c09wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgcGFja2FnZUpzb25QYXRoOiAncGFja2FnZS5qc29uJyxcbiAgICBvdXRwdXREaXI6ICcuL2FydGlmYWN0cycsXG4gICAgbnBtRGlyOiAnbnBtJyxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBjb2xvcnMgZnJvbSAnY29sb3JldHRlJ1xuaW1wb3J0IHsgY3JlYXRlRGVidWcgfSBmcm9tICdvYnVnJ1xuXG5kZWNsYXJlIG1vZHVsZSAnb2J1Zycge1xuICBpbnRlcmZhY2UgRGVidWdnZXIge1xuICAgIGluZm86IHR5cGVvZiBjb25zb2xlLmVycm9yXG4gICAgd2FybjogdHlwZW9mIGNvbnNvbGUuZXJyb3JcbiAgICBlcnJvcjogdHlwZW9mIGNvbnNvbGUuZXJyb3JcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVidWdGYWN0b3J5ID0gKG5hbWVzcGFjZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGRlYnVnID0gY3JlYXRlRGVidWcoYG5hcGk6JHtuYW1lc3BhY2V9YCwge1xuICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgIC8vIGRlYnVnKCclaScsICdUaGlzIGlzIGFuIGluZm8nKVxuICAgICAgaSh2KSB7XG4gICAgICAgIHJldHVybiBjb2xvcnMuZ3JlZW4odilcbiAgICAgIH0sXG4gICAgfSxcbiAgfSlcblxuICBkZWJ1Zy5pbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PlxuICAgIGNvbnNvbGUuZXJyb3IoY29sb3JzLmJsYWNrKGNvbG9ycy5iZ0dyZWVuKCcgSU5GTyAnKSksIC4uLmFyZ3MpXG4gIGRlYnVnLndhcm4gPSAoLi4uYXJnczogYW55W10pID0+XG4gICAgY29uc29sZS5lcnJvcihjb2xvcnMuYmxhY2soY29sb3JzLmJnWWVsbG93KCcgV0FSTklORyAnKSksIC4uLmFyZ3MpXG4gIGRlYnVnLmVycm9yID0gKC4uLmFyZ3M6IGFueVtdKSA9PlxuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjb2xvcnMud2hpdGUoY29sb3JzLmJnUmVkKCcgRVJST1IgJykpLFxuICAgICAgLi4uYXJncy5tYXAoKGFyZykgPT5cbiAgICAgICAgYXJnIGluc3RhbmNlb2YgRXJyb3IgPyAoYXJnLnN0YWNrID8/IGFyZy5tZXNzYWdlKSA6IGFyZyxcbiAgICAgICksXG4gICAgKVxuXG4gIHJldHVybiBkZWJ1Z1xufVxuZXhwb3J0IGNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCd1dGlscycpXG4iLCIiLCJpbXBvcnQge1xuICByZWFkRmlsZSxcbiAgd3JpdGVGaWxlLFxuICB1bmxpbmssXG4gIGNvcHlGaWxlLFxuICBta2RpcixcbiAgc3RhdCxcbiAgcmVhZGRpcixcbiAgYWNjZXNzLFxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuXG5pbXBvcnQgcGtnSnNvbiBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfVxuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuL2xvZy5qcydcblxuZXhwb3J0IGNvbnN0IHJlYWRGaWxlQXN5bmMgPSByZWFkRmlsZVxuZXhwb3J0IGNvbnN0IHdyaXRlRmlsZUFzeW5jID0gd3JpdGVGaWxlXG5leHBvcnQgY29uc3QgdW5saW5rQXN5bmMgPSB1bmxpbmtcbmV4cG9ydCBjb25zdCBjb3B5RmlsZUFzeW5jID0gY29weUZpbGVcbmV4cG9ydCBjb25zdCBta2RpckFzeW5jID0gbWtkaXJcbmV4cG9ydCBjb25zdCBzdGF0QXN5bmMgPSBzdGF0XG5leHBvcnQgY29uc3QgcmVhZGRpckFzeW5jID0gcmVhZGRpclxuXG5leHBvcnQgZnVuY3Rpb24gZmlsZUV4aXN0cyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGFjY2VzcyhwYXRoKS50aGVuKFxuICAgICgpID0+IHRydWUsXG4gICAgKCkgPT4gZmFsc2UsXG4gIClcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpckV4aXN0c0FzeW5jKHBhdGg6IHN0cmluZykge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdEFzeW5jKHBhdGgpXG4gICAgcmV0dXJuIHN0YXRzLmlzRGlyZWN0b3J5KClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBpY2s8TywgSyBleHRlbmRzIGtleW9mIE8+KG86IE8sIC4uLmtleXM6IEtbXSk6IFBpY2s8TywgSz4ge1xuICByZXR1cm4ga2V5cy5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgYWNjW2tleV0gPSBvW2tleV1cbiAgICByZXR1cm4gYWNjXG4gIH0sIHt9IGFzIE8pXG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFja2FnZUpzb24oXG4gIG9sZDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGFydGlhbDogUmVjb3JkPHN0cmluZywgYW55Pixcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLm9sZCB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFydGlhbCkpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChtZXJnZWRba2V5XSkgJiYgaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgIG1lcmdlZFtrZXldID0gbWVyZ2VQYWNrYWdlSnNvbihtZXJnZWRba2V5XSwgdmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlZFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVQYWNrYWdlSnNvbihcbiAgcGF0aDogc3RyaW5nLFxuICBwYXJ0aWFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuKSB7XG4gIGNvbnN0IGV4aXN0cyA9IGF3YWl0IGZpbGVFeGlzdHMocGF0aClcbiAgaWYgKCFleGlzdHMpIHtcbiAgICBkZWJ1ZyhgRmlsZSBub3QgZXhpc3RzICR7cGF0aH1gKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG9sZCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGVBc3luYyhwYXRoLCAndXRmOCcpKVxuICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICBwYXRoLFxuICAgIEpTT04uc3RyaW5naWZ5KG1lcmdlUGFja2FnZUpzb24ob2xkLCBwYXJ0aWFsKSwgbnVsbCwgMiksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IENMSV9WRVJTSU9OID0gcGtnSnNvbi52ZXJzaW9uXG4iLCJpbXBvcnQgeyBleGVjU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2VzcydcblxuZXhwb3J0IHR5cGUgUGxhdGZvcm0gPSBOb2RlSlMuUGxhdGZvcm0gfCAnd2FzbScgfCAnd2FzaScgfCAnb3Blbmhhcm1vbnknXG5cbmV4cG9ydCBjb25zdCBVTklWRVJTQUxfVEFSR0VUUyA9IHtcbiAgJ3VuaXZlcnNhbC1hcHBsZS1kYXJ3aW4nOiBbJ2FhcmNoNjQtYXBwbGUtZGFyd2luJywgJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nXSxcbn0gYXMgY29uc3RcblxuY29uc3QgU1VCX1NZU1RFTVMgPSBuZXcgU2V0KFsnYW5kcm9pZCcsICdvaG9zJ10pXG5cbmV4cG9ydCBjb25zdCBBVkFJTEFCTEVfVEFSR0VUUyA9IFtcbiAgJ2FhcmNoNjQtYXBwbGUtZGFyd2luJyxcbiAgJ2FhcmNoNjQtbGludXgtYW5kcm9pZCcsXG4gICdhYXJjaDY0LXVua25vd24tbGludXgtZ251JyxcbiAgJ2FhcmNoNjQtdW5rbm93bi1saW51eC1tdXNsJyxcbiAgJ2FhcmNoNjQtdW5rbm93bi1saW51eC1vaG9zJyxcbiAgJ2FhcmNoNjQtcGMtd2luZG93cy1tc3ZjJyxcbiAgJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nLFxuICAneDg2XzY0LXBjLXdpbmRvd3MtbXN2YycsXG4gICd4ODZfNjQtcGMtd2luZG93cy1nbnUnLFxuICAneDg2XzY0LXVua25vd24tbGludXgtZ251JyxcbiAgJ3g4Nl82NC11bmtub3duLWxpbnV4LW11c2wnLFxuICAneDg2XzY0LXVua25vd24tbGludXgtb2hvcycsXG4gICd4ODZfNjQtdW5rbm93bi1mcmVlYnNkJyxcbiAgJ2k2ODYtcGMtd2luZG93cy1tc3ZjJyxcbiAgJ2FybXY3LXVua25vd24tbGludXgtZ251ZWFiaWhmJyxcbiAgJ2FybXY3LXVua25vd24tbGludXgtbXVzbGVhYmloZicsXG4gICdhcm12Ny1saW51eC1hbmRyb2lkZWFiaScsXG4gICd1bml2ZXJzYWwtYXBwbGUtZGFyd2luJyxcbiAgJ2xvb25nYXJjaDY0LXVua25vd24tbGludXgtZ251JyxcbiAgJ3Jpc2N2NjRnYy11bmtub3duLWxpbnV4LWdudScsXG4gICdwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LWdudScsXG4gICdzMzkweC11bmtub3duLWxpbnV4LWdudScsXG4gICd3YXNtMzItd2FzaS1wcmV2aWV3MS10aHJlYWRzJyxcbiAgJ3dhc20zMi13YXNpcDEtdGhyZWFkcycsXG5dIGFzIGNvbnN0XG5cbmV4cG9ydCB0eXBlIFRhcmdldFRyaXBsZSA9ICh0eXBlb2YgQVZBSUxBQkxFX1RBUkdFVFMpW251bWJlcl1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVEFSR0VUUyA9IFtcbiAgJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nLFxuICAnYWFyY2g2NC1hcHBsZS1kYXJ3aW4nLFxuICAneDg2XzY0LXBjLXdpbmRvd3MtbXN2YycsXG4gICd4ODZfNjQtdW5rbm93bi1saW51eC1nbnUnLFxuXSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgVEFSR0VUX0xJTktFUjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2FhcmNoNjQtdW5rbm93bi1saW51eC1tdXNsJzogJ2FhcmNoNjQtbGludXgtbXVzbC1nY2MnLFxuICAvLyBUT0RPOiBTd2l0Y2ggdG8gbG9vbmdhcmNoNjQtbGludXgtZ251LWdjYyB3aGVuIGF2YWlsYWJsZVxuICAnbG9vbmdhcmNoNjQtdW5rbm93bi1saW51eC1nbnUnOiAnbG9vbmdhcmNoNjQtbGludXgtZ251LWdjYy0xMycsXG4gICdyaXNjdjY0Z2MtdW5rbm93bi1saW51eC1nbnUnOiAncmlzY3Y2NC1saW51eC1nbnUtZ2NjJyxcbiAgJ3Bvd2VycGM2NGxlLXVua25vd24tbGludXgtZ251JzogJ3Bvd2VycGM2NGxlLWxpbnV4LWdudS1nY2MnLFxuICAnczM5MHgtdW5rbm93bi1saW51eC1nbnUnOiAnczM5MHgtbGludXgtZ251LWdjYycsXG59XG5cbi8vIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19hcmNoXG50eXBlIE5vZGVKU0FyY2ggPVxuICB8ICdhcm0nXG4gIHwgJ2FybTY0J1xuICB8ICdpYTMyJ1xuICB8ICdsb29uZzY0J1xuICB8ICdtaXBzJ1xuICB8ICdtaXBzZWwnXG4gIHwgJ3BwYydcbiAgfCAncHBjNjQnXG4gIHwgJ3Jpc2N2NjQnXG4gIHwgJ3MzOTAnXG4gIHwgJ3MzOTB4J1xuICB8ICd4MzInXG4gIHwgJ3g2NCdcbiAgfCAndW5pdmVyc2FsJ1xuICB8ICd3YXNtMzInXG5cbmNvbnN0IENwdVRvTm9kZUFyY2g6IFJlY29yZDxzdHJpbmcsIE5vZGVKU0FyY2g+ID0ge1xuICB4ODZfNjQ6ICd4NjQnLFxuICBhYXJjaDY0OiAnYXJtNjQnLFxuICBpNjg2OiAnaWEzMicsXG4gIGFybXY3OiAnYXJtJyxcbiAgbG9vbmdhcmNoNjQ6ICdsb29uZzY0JyxcbiAgcmlzY3Y2NGdjOiAncmlzY3Y2NCcsXG4gIHBvd2VycGM2NGxlOiAncHBjNjQnLFxufVxuXG5leHBvcnQgY29uc3QgTm9kZUFyY2hUb0NwdTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgeDY0OiAneDg2XzY0JyxcbiAgYXJtNjQ6ICdhYXJjaDY0JyxcbiAgaWEzMjogJ2k2ODYnLFxuICBhcm06ICdhcm12NycsXG4gIGxvb25nNjQ6ICdsb29uZ2FyY2g2NCcsXG4gIHJpc2N2NjQ6ICdyaXNjdjY0Z2MnLFxuICBwcGM2NDogJ3Bvd2VycGM2NGxlJyxcbn1cblxuY29uc3QgU3lzVG9Ob2RlUGxhdGZvcm06IFJlY29yZDxzdHJpbmcsIFBsYXRmb3JtPiA9IHtcbiAgbGludXg6ICdsaW51eCcsXG4gIGZyZWVic2Q6ICdmcmVlYnNkJyxcbiAgZGFyd2luOiAnZGFyd2luJyxcbiAgd2luZG93czogJ3dpbjMyJyxcbiAgb2hvczogJ29wZW5oYXJtb255Jyxcbn1cblxuZXhwb3J0IGNvbnN0IFVuaUFyY2hzQnlQbGF0Zm9ybTogUGFydGlhbDxSZWNvcmQ8UGxhdGZvcm0sIE5vZGVKU0FyY2hbXT4+ID0ge1xuICBkYXJ3aW46IFsneDY0JywgJ2FybTY0J10sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0IHtcbiAgdHJpcGxlOiBzdHJpbmdcbiAgcGxhdGZvcm1BcmNoQUJJOiBzdHJpbmdcbiAgcGxhdGZvcm06IFBsYXRmb3JtXG4gIGFyY2g6IE5vZGVKU0FyY2hcbiAgYWJpOiBzdHJpbmcgfCBudWxsXG59XG5cbi8qKlxuICogQSB0cmlwbGUgaXMgYSBzcGVjaWZpYyBmb3JtYXQgZm9yIHNwZWNpZnlpbmcgYSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuICogVHJpcGxlcyBtYXkgYmUgcmVmZXJyZWQgdG8gYXMgYSB0YXJnZXQgdHJpcGxlIHdoaWNoIGlzIHRoZSBhcmNoaXRlY3R1cmUgZm9yIHRoZSBhcnRpZmFjdCBwcm9kdWNlZCwgYW5kIHRoZSBob3N0IHRyaXBsZSB3aGljaCBpcyB0aGUgYXJjaGl0ZWN0dXJlIHRoYXQgdGhlIGNvbXBpbGVyIGlzIHJ1bm5pbmcgb24uXG4gKiBUaGUgZ2VuZXJhbCBmb3JtYXQgb2YgdGhlIHRyaXBsZSBpcyBgPGFyY2g+PHN1Yj4tPHZlbmRvcj4tPHN5cz4tPGFiaT5gIHdoZXJlOlxuICogICAtIGBhcmNoYCA9IFRoZSBiYXNlIENQVSBhcmNoaXRlY3R1cmUsIGZvciBleGFtcGxlIGB4ODZfNjRgLCBgaTY4NmAsIGBhcm1gLCBgdGh1bWJgLCBgbWlwc2AsIGV0Yy5cbiAqICAgLSBgc3ViYCA9IFRoZSBDUFUgc3ViLWFyY2hpdGVjdHVyZSwgZm9yIGV4YW1wbGUgYGFybWAgaGFzIGB2N2AsIGB2N3NgLCBgdjV0ZWAsIGV0Yy5cbiAqICAgLSBgdmVuZG9yYCA9IFRoZSB2ZW5kb3IsIGZvciBleGFtcGxlIGB1bmtub3duYCwgYGFwcGxlYCwgYHBjYCwgYG52aWRpYWAsIGV0Yy5cbiAqICAgLSBgc3lzYCA9IFRoZSBzeXN0ZW0gbmFtZSwgZm9yIGV4YW1wbGUgYGxpbnV4YCwgYHdpbmRvd3NgLCBgZGFyd2luYCwgZXRjLiBub25lIGlzIHR5cGljYWxseSB1c2VkIGZvciBiYXJlLW1ldGFsIHdpdGhvdXQgYW4gT1MuXG4gKiAgIC0gYGFiaWAgPSBUaGUgQUJJLCBmb3IgZXhhbXBsZSBgZ251YCwgYGFuZHJvaWRgLCBgZWFiaWAsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVHJpcGxlKHJhd1RyaXBsZTogc3RyaW5nKTogVGFyZ2V0IHtcbiAgaWYgKFxuICAgIHJhd1RyaXBsZSA9PT0gJ3dhc20zMi13YXNpJyB8fFxuICAgIHJhd1RyaXBsZSA9PT0gJ3dhc20zMi13YXNpLXByZXZpZXcxLXRocmVhZHMnIHx8XG4gICAgcmF3VHJpcGxlLnN0YXJ0c1dpdGgoJ3dhc20zMi13YXNpcCcpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICB0cmlwbGU6IHJhd1RyaXBsZSxcbiAgICAgIHBsYXRmb3JtQXJjaEFCSTogJ3dhc20zMi13YXNpJyxcbiAgICAgIHBsYXRmb3JtOiAnd2FzaScsXG4gICAgICBhcmNoOiAnd2FzbTMyJyxcbiAgICAgIGFiaTogJ3dhc2knLFxuICAgIH1cbiAgfVxuICBjb25zdCB0cmlwbGUgPSByYXdUcmlwbGUuZW5kc1dpdGgoJ2VhYmknKVxuICAgID8gYCR7cmF3VHJpcGxlLnNsaWNlKDAsIC00KX0tZWFiaWBcbiAgICA6IHJhd1RyaXBsZVxuICBjb25zdCB0cmlwbGVzID0gdHJpcGxlLnNwbGl0KCctJylcbiAgbGV0IGNwdTogc3RyaW5nXG4gIGxldCBzeXM6IHN0cmluZ1xuICBsZXQgYWJpOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBpZiAodHJpcGxlcy5sZW5ndGggPT09IDIpIHtcbiAgICAvLyBhYXJjaDY0LWZ1Y2hzaWFcbiAgICAvLyBeIGNwdSAgIF4gc3lzXG4gICAgO1tjcHUsIHN5c10gPSB0cmlwbGVzXG4gIH0gZWxzZSB7XG4gICAgLy8gYWFyY2g2NC11bmtub3duLWxpbnV4LW11c2xcbiAgICAvLyBeIGNwdSAgIF52ZW5kb3IgXiBzeXMgXiBhYmlcbiAgICAvLyBhYXJjaDY0LWFwcGxlLWRhcndpblxuICAgIC8vIF4gY3B1ICAgICAgICAgXiBzeXMgIChhYmkgaXMgTm9uZSlcbiAgICA7W2NwdSwgLCBzeXMsIGFiaSA9IG51bGxdID0gdHJpcGxlc1xuICB9XG5cbiAgaWYgKGFiaSAmJiBTVUJfU1lTVEVNUy5oYXMoYWJpKSkge1xuICAgIHN5cyA9IGFiaVxuICAgIGFiaSA9IG51bGxcbiAgfVxuICBjb25zdCBwbGF0Zm9ybSA9IFN5c1RvTm9kZVBsYXRmb3JtW3N5c10gPz8gKHN5cyBhcyBQbGF0Zm9ybSlcbiAgY29uc3QgYXJjaCA9IENwdVRvTm9kZUFyY2hbY3B1XSA/PyAoY3B1IGFzIE5vZGVKU0FyY2gpXG5cbiAgcmV0dXJuIHtcbiAgICB0cmlwbGU6IHJhd1RyaXBsZSxcbiAgICBwbGF0Zm9ybUFyY2hBQkk6IGFiaSA/IGAke3BsYXRmb3JtfS0ke2FyY2h9LSR7YWJpfWAgOiBgJHtwbGF0Zm9ybX0tJHthcmNofWAsXG4gICAgcGxhdGZvcm0sXG4gICAgYXJjaCxcbiAgICBhYmksXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5c3RlbURlZmF1bHRUYXJnZXQoKTogVGFyZ2V0IHtcbiAgY29uc3QgaG9zdCA9IGV4ZWNTeW5jKGBydXN0YyAtdlZgLCB7XG4gICAgZW52OiBwcm9jZXNzLmVudixcbiAgfSlcbiAgICAudG9TdHJpbmcoJ3V0ZjgnKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmluZCgobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKCdob3N0OiAnKSlcbiAgY29uc3QgdHJpcGxlID0gaG9zdD8uc2xpY2UoJ2hvc3Q6ICcubGVuZ3RoKVxuICBpZiAoIXRyaXBsZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbiBub3QgcGFyc2UgdGFyZ2V0IHRyaXBsZSBmcm9tIGhvc3RgKVxuICB9XG4gIHJldHVybiBwYXJzZVRyaXBsZSh0cmlwbGUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXRMaW5rZXIodGFyZ2V0OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gVEFSR0VUX0xJTktFUlt0YXJnZXRdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YXJnZXRUb0VudlZhcih0YXJnZXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0YXJnZXQucmVwbGFjZSgvLS9nLCAnXycpLnRvVXBwZXJDYXNlKClcbn1cbiIsImV4cG9ydCBlbnVtIE5hcGlWZXJzaW9uIHtcbiAgTmFwaTEgPSAxLFxuICBOYXBpMixcbiAgTmFwaTMsXG4gIE5hcGk0LFxuICBOYXBpNSxcbiAgTmFwaTYsXG4gIE5hcGk3LFxuICBOYXBpOCxcbiAgTmFwaTksXG59XG5cbi8vLyBiZWNhdXNlIG5vZGUgc3VwcG9ydCBuZXcgbmFwaSB2ZXJzaW9uIGluIHNvbWUgbWlub3IgdmVyc2lvbiB1cGRhdGVzLCBzbyB3ZSBtaWdodCBtZWV0IHN1Y2ggc2l0dWF0aW9uOlxuLy8vIGBub2RlIHYxMC4yMC4wYCBzdXBwb3J0cyBgbmFwaTVgIGFuZCBgbmFwaTZgLCBidXQgYG5vZGUgdjEyLjAuMGAgb25seSBzdXBwb3J0IGBuYXBpNGAsXG4vLy8gYnkgd2hpY2gsIHdlIGNhbiBub3QgdGVsbCBkaXJlY3RseSBuYXBpIHZlcnNpb24gc3VwcG9ydGxlc3MgZnJvbSBub2RlIHZlcnNpb24gZGlyZWN0bHkuXG5jb25zdCBOQVBJX1ZFUlNJT05fTUFUUklYID0gbmV3IE1hcDxOYXBpVmVyc2lvbiwgc3RyaW5nPihbXG4gIFtOYXBpVmVyc2lvbi5OYXBpMSwgJzguNi4wIHwgOS4wLjAgfCAxMC4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGkyLCAnOC4xMC4wIHwgOS4zLjAgfCAxMC4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGkzLCAnNi4xNC4yIHwgOC4xMS4yIHwgOS4xMS4wIHwgMTAuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpNCwgJzEwLjE2LjAgfCAxMS44LjAgfCAxMi4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGk1LCAnMTAuMTcuMCB8IDEyLjExLjAgfCAxMy4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGk2LCAnMTAuMjAuMCB8IDEyLjE3LjAgfCAxNC4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGk3LCAnMTAuMjMuMCB8IDEyLjE5LjAgfCAxNC4xMi4wIHwgMTUuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpOCwgJzEyLjIyLjAgfCAxNC4xNy4wIHwgMTUuMTIuMCB8IDE2LjAuMCddLFxuICBbTmFwaVZlcnNpb24uTmFwaTksICcxOC4xNy4wIHwgMjAuMy4wIHwgMjEuMS4wJ10sXG5dKVxuXG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX05BUElfVkVSU0lPTlMgPSBPYmplY3QudmFsdWVzKE5hcGlWZXJzaW9uKS5maWx0ZXIoXG4gICh2KTogdiBpcyBOYXBpVmVyc2lvbiA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicsXG4pXG5cbmludGVyZmFjZSBOb2RlVmVyc2lvbiB7XG4gIG1ham9yOiBudW1iZXJcbiAgbWlub3I6IG51bWJlclxuICBwYXRjaDogbnVtYmVyXG59XG5cbmZ1bmN0aW9uIHBhcnNlTm9kZVZlcnNpb24odjogc3RyaW5nKTogTm9kZVZlcnNpb24ge1xuICBjb25zdCBtYXRjaGVzID0gdi5tYXRjaCgvdj8oWzAtOV0rKVxcLihbMC05XSspXFwuKFswLTldKykvaSlcblxuICBpZiAoIW1hdGNoZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB2ZXJzaW9uIG51bWJlcjogJyArIHYpXG4gIH1cblxuICBjb25zdCBbLCBtYWpvciwgbWlub3IsIHBhdGNoXSA9IG1hdGNoZXNcblxuICByZXR1cm4ge1xuICAgIG1ham9yOiBwYXJzZUludChtYWpvciksXG4gICAgbWlub3I6IHBhcnNlSW50KG1pbm9yKSxcbiAgICBwYXRjaDogcGFyc2VJbnQocGF0Y2gpLFxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVkTm9kZVZlcnNpb25zKG5hcGlWZXJzaW9uOiBOYXBpVmVyc2lvbik6IE5vZGVWZXJzaW9uW10ge1xuICBjb25zdCByZXF1aXJlbWVudCA9IE5BUElfVkVSU0lPTl9NQVRSSVguZ2V0KG5hcGlWZXJzaW9uKVxuXG4gIGlmICghcmVxdWlyZW1lbnQpIHtcbiAgICByZXR1cm4gW3BhcnNlTm9kZVZlcnNpb24oJzEwLjAuMCcpXVxuICB9XG5cbiAgcmV0dXJuIHJlcXVpcmVtZW50LnNwbGl0KCd8JykubWFwKHBhcnNlTm9kZVZlcnNpb24pXG59XG5cbmZ1bmN0aW9uIHRvRW5naW5lUmVxdWlyZW1lbnQodmVyc2lvbnM6IE5vZGVWZXJzaW9uW10pOiBzdHJpbmcge1xuICBjb25zdCByZXF1aXJlbWVudHM6IHN0cmluZ1tdID0gW11cbiAgdmVyc2lvbnMuZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgIGxldCByZXEgPSAnJ1xuICAgIGlmIChpICE9PSAwKSB7XG4gICAgICBjb25zdCBsYXN0VmVyc2lvbiA9IHZlcnNpb25zW2kgLSAxXVxuICAgICAgcmVxICs9IGA8ICR7bGFzdFZlcnNpb24ubWFqb3IgKyAxfWBcbiAgICB9XG5cbiAgICByZXEgKz0gYCR7aSA9PT0gMCA/ICcnIDogJyB8fCAnfT49ICR7di5tYWpvcn0uJHt2Lm1pbm9yfS4ke3YucGF0Y2h9YFxuICAgIHJlcXVpcmVtZW50cy5wdXNoKHJlcSlcbiAgfSlcblxuICByZXR1cm4gcmVxdWlyZW1lbnRzLmpvaW4oJyAnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbmFwaUVuZ2luZVJlcXVpcmVtZW50KG5hcGlWZXJzaW9uOiBOYXBpVmVyc2lvbik6IHN0cmluZyB7XG4gIHJldHVybiB0b0VuZ2luZVJlcXVpcmVtZW50KHJlcXVpcmVkTm9kZVZlcnNpb25zKG5hcGlWZXJzaW9uKSlcbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5cbmV4cG9ydCB0eXBlIENyYXRlVGFyZ2V0S2luZCA9XG4gIHwgJ2JpbidcbiAgfCAnZXhhbXBsZSdcbiAgfCAndGVzdCdcbiAgfCAnYmVuY2gnXG4gIHwgJ2xpYidcbiAgfCAncmxpYidcbiAgfCAnY2R5bGliJ1xuICB8ICdjdXN0b20tYnVpbGQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhdGVUYXJnZXQge1xuICBuYW1lOiBzdHJpbmdcbiAga2luZDogQ3JhdGVUYXJnZXRLaW5kW11cbiAgY3JhdGVfdHlwZXM6IENyYXRlVGFyZ2V0S2luZFtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhdGUge1xuICBpZDogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBzcmNfcGF0aDogc3RyaW5nXG4gIHZlcnNpb246IHN0cmluZ1xuICBlZGl0aW9uOiBzdHJpbmdcbiAgdGFyZ2V0czogQ3JhdGVUYXJnZXRbXVxuICBmZWF0dXJlczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG4gIG1hbmlmZXN0X3BhdGg6IHN0cmluZ1xuICBkZXBlbmRlbmNpZXM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBzb3VyY2U6IHN0cmluZ1xuICAgIHJlcTogc3RyaW5nXG4gICAga2luZDogc3RyaW5nIHwgbnVsbFxuICAgIHJlbmFtZTogc3RyaW5nIHwgbnVsbFxuICAgIG9wdGlvbmFsOiBib29sZWFuXG4gICAgdXNlc19kZWZhdWx0X2ZlYXR1cmVzOiBib29sZWFuXG4gICAgZmVhdHVyZXM6IHN0cmluZ1tdXG4gICAgdGFyZ2V0OiBzdHJpbmcgfCBudWxsXG4gICAgcmVnaXN0cnk6IHN0cmluZyB8IG51bGxcbiAgfT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXJnb1dvcmtzcGFjZU1ldGFkYXRhIHtcbiAgdmVyc2lvbjogbnVtYmVyXG4gIHBhY2thZ2VzOiBDcmF0ZVtdXG4gIHdvcmtzcGFjZV9tZW1iZXJzOiBzdHJpbmdbXVxuICB0YXJnZXRfZGlyZWN0b3J5OiBzdHJpbmdcbiAgd29ya3NwYWNlX3Jvb3Q6IHN0cmluZ1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShtYW5pZmVzdFBhdGg6IHN0cmluZykge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gY3JhdGUgZm91bmQgaW4gbWFuaWZlc3Q6ICR7bWFuaWZlc3RQYXRofWApXG4gIH1cblxuICBjb25zdCBjaGlsZFByb2Nlc3MgPSBzcGF3bihcbiAgICAnY2FyZ28nLFxuICAgIFsnbWV0YWRhdGEnLCAnLS1tYW5pZmVzdC1wYXRoJywgbWFuaWZlc3RQYXRoLCAnLS1mb3JtYXQtdmVyc2lvbicsICcxJ10sXG4gICAgeyBzdGRpbzogJ3BpcGUnIH0sXG4gIClcblxuICBsZXQgc3Rkb3V0ID0gJydcbiAgbGV0IHN0ZGVyciA9ICcnXG4gIGxldCBzdGF0dXMgPSAwXG4gIGxldCBlcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbFxuXG4gIGNoaWxkUHJvY2Vzcy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgIHN0ZG91dCArPSBkYXRhXG4gIH0pXG5cbiAgY2hpbGRQcm9jZXNzLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgc3RkZXJyICs9IGRhdGFcbiAgfSlcblxuICBjaGlsZFByb2Nlc3Mub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgIGVycm9yID0gZXJyXG4gIH0pXG5cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjaGlsZFByb2Nlc3Mub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgIHN0YXR1cyA9IGNvZGUgPz8gMFxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSlcbiAgfSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhcmdvIG1ldGFkYXRhIGZhaWxlZCB0byBydW4nLCB7IGNhdXNlOiBlcnJvciB9KVxuICB9XG4gIGlmIChzdGF0dXMgIT09IDApIHtcbiAgICBjb25zdCBzaW1wbGVNZXNzYWdlID0gYGNhcmdvIG1ldGFkYXRhIGV4aXRlZCB3aXRoIGNvZGUgJHtzdGF0dXN9YFxuICAgIHRocm93IG5ldyBFcnJvcihgJHtzaW1wbGVNZXNzYWdlfSBhbmQgZXJyb3IgbWVzc2FnZTpcXG5cXG4ke3N0ZGVycn1gLCB7XG4gICAgICBjYXVzZTogbmV3IEVycm9yKHNpbXBsZU1lc3NhZ2UpLFxuICAgIH0pXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0ZG91dCkgYXMgQ2FyZ29Xb3Jrc3BhY2VNZXRhZGF0YVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcGFyc2UgY2FyZ28gbWV0YWRhdGEgSlNPTicsIHsgY2F1c2U6IGUgfSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgdW5kZXJsaW5lLCB5ZWxsb3cgfSBmcm9tICdjb2xvcmV0dGUnXG5pbXBvcnQgeyBtZXJnZSwgb21pdCB9IGZyb20gJ2VzLXRvb2xraXQnXG5cbmltcG9ydCB7IGZpbGVFeGlzdHMsIHJlYWRGaWxlQXN5bmMgfSBmcm9tICcuL21pc2MuanMnXG5pbXBvcnQgeyBERUZBVUxUX1RBUkdFVFMsIHBhcnNlVHJpcGxlLCB0eXBlIFRhcmdldCB9IGZyb20gJy4vdGFyZ2V0LmpzJ1xuXG5leHBvcnQgdHlwZSBWYWx1ZU9mQ29uc3RBcnJheTxUPiA9IFRbRXhjbHVkZTxrZXlvZiBULCBrZXlvZiBBcnJheTxhbnk+Pl1cblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2VycyA9IFsneWFybicsICdwbnBtJ10gYXMgY29uc3RcbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRUZXN0RnJhbWV3b3JrcyA9IFsnYXZhJ10gYXMgY29uc3RcblxuZXhwb3J0IHR5cGUgU3VwcG9ydGVkUGFja2FnZU1hbmFnZXIgPSBWYWx1ZU9mQ29uc3RBcnJheTxcbiAgdHlwZW9mIFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2Vyc1xuPlxuZXhwb3J0IHR5cGUgU3VwcG9ydGVkVGVzdEZyYW1ld29yayA9IFZhbHVlT2ZDb25zdEFycmF5PFxuICB0eXBlb2YgU3VwcG9ydGVkVGVzdEZyYW1ld29ya3Ncbj5cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyTmFwaUNvbmZpZyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBiaW5hcnkgdG8gYmUgZ2VuZXJhdGVkLCBkZWZhdWx0IHRvIGBpbmRleGBcbiAgICovXG4gIGJpbmFyeU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIG5wbSBwYWNrYWdlLCBkZWZhdWx0IHRvIHRoZSBuYW1lIG9mIHJvb3QgcGFja2FnZS5qc29uIG5hbWVcbiAgICpcbiAgICogQWx3YXlzIGdpdmVuIGBAc2NvcGUvcGtnYCBhbmQgYXJjaCBzdWZmaXggd2lsbCBiZSBhcHBlbmRlZCBsaWtlIGBAc2NvcGUvcGtnLWxpbnV4LWdudS14NjRgXG4gICAqL1xuICBwYWNrYWdlTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogQWxsIHRhcmdldHMgdGhlIGNyYXRlIHdpbGwgYmUgY29tcGlsZWQgZm9yXG4gICAqL1xuICB0YXJnZXRzPzogc3RyaW5nW11cblxuICAvKipcbiAgICogVGhlIG5wbSBjbGllbnQgcHJvamVjdCB1c2VzLlxuICAgKi9cbiAgbnBtQ2xpZW50Pzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZ2VuZXJhdGUgY29uc3QgZW51bSBmb3IgdHlwZXNjcmlwdCBiaW5kaW5nc1xuICAgKi9cbiAgY29uc3RFbnVtPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBFbWl0IGAjW25hcGkoc3RyaW5nX2VudW0pXWAgZW51bXMgYXMgcnVudGltZSBlbnVtcyAoYGV4cG9ydCBkZWNsYXJlIGVudW1gKSB1bmRlciBgLS1uby1jb25zdC1lbnVtYC4gRGVmYXVsdDogdHlwZS1vbmx5IHVuaW9uLlxuICAgKi9cbiAgcnVudGltZVN0cmluZ0VudW0/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIGR0cyBoZWFkZXIgcHJlcGVuZCB0byB0aGUgZ2VuZXJhdGVkIGR0cyBmaWxlXG4gICAqL1xuICBkdHNIZWFkZXI/OiBzdHJpbmdcblxuICAvKipcbiAgICogZHRzIGhlYWRlciBmaWxlIHBhdGggdG8gYmUgcHJlcGVuZGVkIHRvIHRoZSBnZW5lcmF0ZWQgZHRzIGZpbGVcbiAgICogaWYgYm90aCBkdHNIZWFkZXIgYW5kIGR0c0hlYWRlckZpbGUgYXJlIHByb3ZpZGVkLCBkdHNIZWFkZXJGaWxlIHdpbGwgYmUgdXNlZFxuICAgKi9cbiAgZHRzSGVhZGVyRmlsZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiB3YXNtIGNvbXBpbGF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHdhc20/OiB7XG4gICAgLyoqXG4gICAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWJBc3NlbWJseS9KYXZhU2NyaXB0X2ludGVyZmFjZS9NZW1vcnlcbiAgICAgKiBAZGVmYXVsdCA0MDAwIHBhZ2VzICgyNTZNaUIpXG4gICAgICovXG4gICAgaW5pdGlhbE1lbW9yeT86IG51bWJlclxuICAgIC8qKlxuICAgICAqIEBkZWZhdWx0IDY1NTM2IHBhZ2VzICg0R2lCKVxuICAgICAqL1xuICAgIG1heGltdW1NZW1vcnk/OiBudW1iZXJcblxuICAgIC8qKlxuICAgICAqIEJyb3dzZXIgd2FzbSBiaW5kaW5nIGNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBicm93c2VyOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGZzIG1vZHVsZSBpbiBicm93c2VyXG4gICAgICAgKi9cbiAgICAgIGZzPzogYm9vbGVhblxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIGluaXRpYWxpemUgd2FzbSBhc3luY2hyb25vdXNseVxuICAgICAgICovXG4gICAgICBhc3luY0luaXQ/OiBib29sZWFuXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gaW5qZWN0IGBidWZmZXJgIHRvIGVtbmFwaSBjb250ZXh0XG4gICAgICAgKi9cbiAgICAgIGJ1ZmZlcj86IGJvb2xlYW5cbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBlbWl0IGN1c3RvbSBldmVudHMgZm9yIGVycm9ycyBpbiB3b3JrZXJcbiAgICAgICAqL1xuICAgICAgZXJyb3JFdmVudD86IGJvb2xlYW5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgYmluYXJ5TmFtZSBpbnN0ZWFkXG4gICAqL1xuICBuYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgcGFja2FnZU5hbWUgaW5zdGVhZFxuICAgKi9cbiAgcGFja2FnZT86IHtcbiAgICBuYW1lPzogc3RyaW5nXG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSB0YXJnZXRzIGluc3RlYWRcbiAgICovXG4gIHRyaXBsZXM/OiB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBlbmFibGUgZGVmYXVsdCB0YXJnZXRzXG4gICAgICovXG4gICAgZGVmYXVsdHM6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIHRhcmdldHMgdG8gYmUgY29tcGlsZWQgZm9yXG4gICAgICovXG4gICAgYWRkaXRpb25hbD86IHN0cmluZ1tdXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21tb25QYWNrYWdlSnNvbkZpZWxkcyB7XG4gIG5hbWU6IHN0cmluZ1xuICB2ZXJzaW9uOiBzdHJpbmdcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAga2V5d29yZHM/OiBzdHJpbmdbXVxuICBhdXRob3I/OiBzdHJpbmdcbiAgYXV0aG9ycz86IHN0cmluZ1tdXG4gIGxpY2Vuc2U/OiBzdHJpbmdcbiAgY3B1Pzogc3RyaW5nW11cbiAgb3M/OiBzdHJpbmdbXVxuICBsaWJjPzogc3RyaW5nW11cbiAgZmlsZXM/OiBzdHJpbmdbXVxuICByZXBvc2l0b3J5PzogYW55XG4gIGhvbWVwYWdlPzogYW55XG4gIGVuZ2luZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHB1Ymxpc2hDb25maWc/OiBhbnlcbiAgYnVncz86IGFueVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgbmFwaT86IFVzZXJOYXBpQ29uZmlnXG4gIHR5cGU/OiAnbW9kdWxlJyB8ICdjb21tb25qcydcbiAgc2NyaXB0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAvLyBtb2R1bGVzXG4gIG1haW4/OiBzdHJpbmdcbiAgbW9kdWxlPzogc3RyaW5nXG4gIHR5cGVzPzogc3RyaW5nXG4gIGJyb3dzZXI/OiBzdHJpbmdcbiAgZXhwb3J0cz86IGFueVxuXG4gIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZGV2RGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gIGF2YT86IHtcbiAgICB0aW1lb3V0Pzogc3RyaW5nXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTmFwaUNvbmZpZyA9IFJlcXVpcmVkPFxuICBQaWNrPFVzZXJOYXBpQ29uZmlnLCAnYmluYXJ5TmFtZScgfCAncGFja2FnZU5hbWUnIHwgJ25wbUNsaWVudCc+XG4+ICZcbiAgUGljazxcbiAgICBVc2VyTmFwaUNvbmZpZyxcbiAgICAnd2FzbScgfCAnZHRzSGVhZGVyJyB8ICdkdHNIZWFkZXJGaWxlJyB8ICdjb25zdEVudW0nIHwgJ3J1bnRpbWVTdHJpbmdFbnVtJ1xuICA+ICYge1xuICAgIHRhcmdldHM6IFRhcmdldFtdXG4gICAgcGFja2FnZUpzb246IENvbW1vblBhY2thZ2VKc29uRmllbGRzXG4gIH1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWROYXBpQ29uZmlnKFxuICBwYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcsXG4pOiBQcm9taXNlPE5hcGlDb25maWc+IHtcbiAgaWYgKGNvbmZpZ1BhdGggJiYgIShhd2FpdCBmaWxlRXhpc3RzKGNvbmZpZ1BhdGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTkFQSS1SUyBjb25maWcgbm90IGZvdW5kIGF0ICR7Y29uZmlnUGF0aH1gKVxuICB9XG4gIGlmICghKGF3YWl0IGZpbGVFeGlzdHMocGF0aCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBwYWNrYWdlLmpzb24gbm90IGZvdW5kIGF0ICR7cGF0aH1gKVxuICB9XG4gIC8vIE1heSBzdXBwb3J0IG11bHRpcGxlIGNvbmZpZyBzb3VyY2VzIGxhdGVyIG9uLlxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhwYXRoLCAndXRmOCcpXG4gIGxldCBwa2dKc29uXG4gIHRyeSB7XG4gICAgcGtnSnNvbiA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgQ29tbW9uUGFja2FnZUpzb25GaWVsZHNcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiBhdCAke3BhdGh9YCwge1xuICAgICAgY2F1c2U6IGUsXG4gICAgfSlcbiAgfVxuXG4gIGxldCBzZXBhcmF0ZWRDb25maWc6IFVzZXJOYXBpQ29uZmlnIHwgdW5kZWZpbmVkXG4gIGlmIChjb25maWdQYXRoKSB7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlQXN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKVxuICAgIHRyeSB7XG4gICAgICBzZXBhcmF0ZWRDb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpIGFzIFVzZXJOYXBpQ29uZmlnXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgTkFQSS1SUyBjb25maWcgYXQgJHtjb25maWdQYXRofWAsIHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVzZXJOYXBpQ29uZmlnID0gcGtnSnNvbi5uYXBpID8/IHt9XG4gIGlmIChwa2dKc29uLm5hcGkgJiYgc2VwYXJhdGVkQ29uZmlnKSB7XG4gICAgY29uc3QgcGtnSnNvblBhdGggPSB1bmRlcmxpbmUocGF0aClcbiAgICBjb25zdCBjb25maWdQYXRoVW5kZXJsaW5lID0gdW5kZXJsaW5lKGNvbmZpZ1BhdGghKVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIHllbGxvdyhcbiAgICAgICAgYEJvdGggbmFwaSBmaWVsZCBpbiAke3BrZ0pzb25QYXRofSBhbmQgW05BUEktUlMgY29uZmlnXSgke2NvbmZpZ1BhdGhVbmRlcmxpbmV9KSBmaWxlIGFyZSBmb3VuZCwgdGhlIE5BUEktUlMgY29uZmlnIGZpbGUgd2lsbCBiZSB1c2VkLmAsXG4gICAgICApLFxuICAgIClcbiAgfVxuICBpZiAoc2VwYXJhdGVkQ29uZmlnKSB7XG4gICAgT2JqZWN0LmFzc2lnbih1c2VyTmFwaUNvbmZpZywgc2VwYXJhdGVkQ29uZmlnKVxuICB9XG4gIGNvbnN0IG5hcGlDb25maWc6IE5hcGlDb25maWcgPSBtZXJnZShcbiAgICB7XG4gICAgICBiaW5hcnlOYW1lOiAnaW5kZXgnLFxuICAgICAgcGFja2FnZU5hbWU6IHBrZ0pzb24ubmFtZSxcbiAgICAgIHRhcmdldHM6IFtdLFxuICAgICAgcGFja2FnZUpzb246IHBrZ0pzb24sXG4gICAgICBucG1DbGllbnQ6ICducG0nLFxuICAgIH0sXG4gICAgb21pdCh1c2VyTmFwaUNvbmZpZywgWyd0YXJnZXRzJ10pLFxuICApXG5cbiAgbGV0IHRhcmdldHM6IHN0cmluZ1tdID0gdXNlck5hcGlDb25maWcudGFyZ2V0cyA/PyBbXVxuXG4gIC8vIGNvbXBhdGlibGUgd2l0aCBvbGQgY29uZmlnXG4gIGlmICh1c2VyTmFwaUNvbmZpZz8ubmFtZSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIHllbGxvdyhcbiAgICAgICAgYFtERVBSRUNBVEVEXSBuYXBpLm5hbWUgaXMgZGVwcmVjYXRlZCwgdXNlIG5hcGkuYmluYXJ5TmFtZSBpbnN0ZWFkLmAsXG4gICAgICApLFxuICAgIClcbiAgICBuYXBpQ29uZmlnLmJpbmFyeU5hbWUgPSB1c2VyTmFwaUNvbmZpZy5uYW1lXG4gIH1cblxuICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7XG4gICAgbGV0IGRlcHJlY2F0ZWRXYXJuZWQgPSBmYWxzZVxuICAgIGNvbnN0IHdhcm5pbmcgPSB5ZWxsb3coXG4gICAgICBgW0RFUFJFQ0FURURdIG5hcGkudHJpcGxlcyBpcyBkZXByZWNhdGVkLCB1c2UgbmFwaS50YXJnZXRzIGluc3RlYWQuYCxcbiAgICApXG4gICAgaWYgKHVzZXJOYXBpQ29uZmlnLnRyaXBsZXM/LmRlZmF1bHRzKSB7XG4gICAgICBkZXByZWNhdGVkV2FybmVkID0gdHJ1ZVxuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpXG4gICAgICB0YXJnZXRzID0gdGFyZ2V0cy5jb25jYXQoREVGQVVMVF9UQVJHRVRTKVxuICAgIH1cblxuICAgIGlmICh1c2VyTmFwaUNvbmZpZy50cmlwbGVzPy5hZGRpdGlvbmFsPy5sZW5ndGgpIHtcbiAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmNvbmNhdCh1c2VyTmFwaUNvbmZpZy50cmlwbGVzLmFkZGl0aW9uYWwpXG4gICAgICBpZiAoIWRlcHJlY2F0ZWRXYXJuZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZmluZCBkdXBsaWNhdGUgdGFyZ2V0c1xuICBjb25zdCB1bmlxdWVUYXJnZXRzID0gbmV3IFNldCh0YXJnZXRzKVxuICBpZiAodW5pcXVlVGFyZ2V0cy5zaXplICE9PSB0YXJnZXRzLmxlbmd0aCkge1xuICAgIGNvbnN0IGR1cGxpY2F0ZVRhcmdldCA9IHRhcmdldHMuZmluZChcbiAgICAgICh0YXJnZXQsIGluZGV4KSA9PiB0YXJnZXRzLmluZGV4T2YodGFyZ2V0KSAhPT0gaW5kZXgsXG4gICAgKVxuICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHRhcmdldHMgYXJlIG5vdCBhbGxvd2VkOiAke2R1cGxpY2F0ZVRhcmdldH1gKVxuICB9XG5cbiAgbmFwaUNvbmZpZy50YXJnZXRzID0gdGFyZ2V0cy5tYXAocGFyc2VUcmlwbGUpXG5cbiAgcmV0dXJuIG5hcGlDb25maWdcbn1cbiIsImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuXG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4vbG9nLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdHJ5SW5zdGFsbENhcmdvQmluYXJ5KG5hbWU6IHN0cmluZywgYmluOiBzdHJpbmcpIHtcbiAgaWYgKGRldGVjdENhcmdvQmluYXJ5KGJpbikpIHtcbiAgICBkZWJ1ZygnQ2FyZ28gYmluYXJ5IGFscmVhZHkgaW5zdGFsbGVkOiAlcycsIG5hbWUpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIGRlYnVnKCdJbnN0YWxsaW5nIGNhcmdvIGJpbmFyeTogJXMnLCBuYW1lKVxuICAgIGV4ZWNTeW5jKGBjYXJnbyBpbnN0YWxsICR7bmFtZX1gLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbnN0YWxsIGNhcmdvIGJpbmFyeTogJHtuYW1lfWAsIHtcbiAgICAgIGNhdXNlOiBlLFxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0ZWN0Q2FyZ29CaW5hcnkoYmluOiBzdHJpbmcpIHtcbiAgZGVidWcoJ0RldGVjdGluZyBjYXJnbyBiaW5hcnk6ICVzJywgYmluKVxuICB0cnkge1xuICAgIGV4ZWNTeW5jKGBjYXJnbyBoZWxwICR7YmlufWAsIHtcbiAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICB9KVxuICAgIGRlYnVnKCdDYXJnbyBiaW5hcnkgZGV0ZWN0ZWQ6ICVzJywgYmluKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2gge1xuICAgIGRlYnVnKCdDYXJnbyBiaW5hcnkgbm90IGRldGVjdGVkOiAlcycsIGJpbilcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwiaW1wb3J0IHsgc29ydEJ5IH0gZnJvbSAnZXMtdG9vbGtpdCdcblxuaW1wb3J0IHsgcmVhZEZpbGVBc3luYyB9IGZyb20gJy4vbWlzYy5qcydcblxuY29uc3QgVE9QX0xFVkVMX05BTUVTUEFDRSA9ICdfX1RPUF9MRVZFTF9NT0RVTEVfXydcbmV4cG9ydCBjb25zdCBERUZBVUxUX1RZUEVfREVGX0hFQURFUiA9IGAvKiBhdXRvLWdlbmVyYXRlZCBieSBOQVBJLVJTICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuYFxuXG5lbnVtIFR5cGVEZWZLaW5kIHtcbiAgQ29uc3QgPSAnY29uc3QnLFxuICBFbnVtID0gJ2VudW0nLFxuICBTdHJpbmdFbnVtID0gJ3N0cmluZ19lbnVtJyxcbiAgSW50ZXJmYWNlID0gJ2ludGVyZmFjZScsXG4gIFR5cGUgPSAndHlwZScsXG4gIEZuID0gJ2ZuJyxcbiAgU3RydWN0ID0gJ3N0cnVjdCcsXG4gIEV4dGVuZHMgPSAnZXh0ZW5kcycsXG4gIEltcGwgPSAnaW1wbCcsXG59XG5cbmludGVyZmFjZSBUeXBlRGVmTGluZSB7XG4gIGtpbmQ6IFR5cGVEZWZLaW5kXG4gIG5hbWU6IHN0cmluZ1xuICBvcmlnaW5hbF9uYW1lPzogc3RyaW5nXG4gIGRlZjogc3RyaW5nXG4gIGV4dGVuZHM/OiBzdHJpbmdcbiAganNfZG9jPzogc3RyaW5nXG4gIGpzX21vZD86IHN0cmluZ1xufVxuXG4vKipcbiAqIFJlbmRlciBhIHNpbmdsZSBpbnRlcm1lZGlhdGUgdHlwZS1kZWYgbGluZSBhcyB0aGUgVHlwZVNjcmlwdCBzb3VyY2UgaXRcbiAqIHNob3VsZCBwcm9kdWNlIGluIGBpbmRleC5kLnRzYC5cbiAqXG4gKiBAcGFyYW0gbGluZSAtIFRoZSBpbnRlcm1lZGlhdGUgdHlwZS1kZWYgZW50cnkgdG8gcmVuZGVyLlxuICogQHBhcmFtIGNvbnN0RW51bSAtIFdoZW4gdHJ1ZSwgZW1pdCBudW1lcmljIGFuZCBzdHJpbmcgYCNbbmFwaV1gIGVudW1zIGFzXG4gKiAgIGBjb25zdCBlbnVtYC4gV2hlbiBmYWxzZSAoYC0tbm8tY29uc3QtZW51bWApLCBudW1lcmljIGVudW1zIGJlY29tZVxuICogICByZWd1bGFyIHJ1bnRpbWUgZW51bXMgYW5kIHN0cmluZyBlbnVtcyBmYWxsIGJhY2sgdG8gYSB0eXBlLW9ubHkgdW5pb25cbiAqICAgdW5sZXNzIGBydW50aW1lU3RyaW5nRW51bWAgaXMgYWxzbyB0cnVlLlxuICogQHBhcmFtIHJ1bnRpbWVTdHJpbmdFbnVtIC0gV2hlbiB0cnVlIHVuZGVyIGAtLW5vLWNvbnN0LWVudW1gLCBlbWl0XG4gKiAgIGAjW25hcGkoc3RyaW5nX2VudW0pXWAgYXMgYSBydW50aW1lIGVudW0gKGBleHBvcnQgZGVjbGFyZSBlbnVtYClcbiAqICAgaW5zdGVhZCBvZiBhIHR5cGUtb25seSB1bmlvbi4gTm8tb3Agd2hlbiBgY29uc3RFbnVtYCBpcyB0cnVlLlxuICogQHBhcmFtIGlkZW50IC0gSW5kZW50YXRpb24gbGV2ZWwgYXBwbGllZCB0byB0aGUgcmVuZGVyZWQgb3V0cHV0LlxuICogQHBhcmFtIGFtYmllbnQgLSBXaGVuIHRydWUsIGVtaXQgZGVjbGFyYXRpb25zIGluIHRoZSBhbWJpZW50IGZvcm0gdXNlZFxuICogICBpbnNpZGUgYGRlY2xhcmUgbmFtZXNwYWNlYCBibG9ja3MgKGUuZy4gZHJvcCB0aGUgYGRlY2xhcmVgIGtleXdvcmQpLlxuICovXG5mdW5jdGlvbiBwcmV0dHlQcmludChcbiAgbGluZTogVHlwZURlZkxpbmUsXG4gIGNvbnN0RW51bTogYm9vbGVhbixcbiAgcnVudGltZVN0cmluZ0VudW06IGJvb2xlYW4sXG4gIGlkZW50OiBudW1iZXIsXG4gIGFtYmllbnQgPSBmYWxzZSxcbik6IHN0cmluZyB7XG4gIGxldCBzID0gbGluZS5qc19kb2MgPz8gJydcbiAgc3dpdGNoIChsaW5lLmtpbmQpIHtcbiAgICBjYXNlIFR5cGVEZWZLaW5kLkludGVyZmFjZTpcbiAgICAgIHMgKz0gYGV4cG9ydCBpbnRlcmZhY2UgJHtsaW5lLm5hbWV9IHtcXG4ke2xpbmUuZGVmfVxcbn1gXG4gICAgICBicmVha1xuXG4gICAgY2FzZSBUeXBlRGVmS2luZC5UeXBlOlxuICAgICAgcyArPSBgZXhwb3J0IHR5cGUgJHtsaW5lLm5hbWV9ID0gXFxuJHtsaW5lLmRlZn1gXG4gICAgICBicmVha1xuXG4gICAgY2FzZSBUeXBlRGVmS2luZC5FbnVtOiB7XG4gICAgICBjb25zdCBlbnVtTmFtZSA9IGNvbnN0RW51bSA/ICdjb25zdCBlbnVtJyA6ICdlbnVtJ1xuICAgICAgcyArPSBgJHtleHBvcnREZWNsYXJlKGFtYmllbnQpfSAke2VudW1OYW1lfSAke2xpbmUubmFtZX0ge1xcbiR7bGluZS5kZWZ9XFxufWBcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY2FzZSBUeXBlRGVmS2luZC5TdHJpbmdFbnVtOiB7XG4gICAgICBpZiAoY29uc3RFbnVtKSB7XG4gICAgICAgIHMgKz0gYCR7ZXhwb3J0RGVjbGFyZShhbWJpZW50KX0gY29uc3QgZW51bSAke2xpbmUubmFtZX0ge1xcbiR7bGluZS5kZWZ9XFxufWBcbiAgICAgIH0gZWxzZSBpZiAocnVudGltZVN0cmluZ0VudW0pIHtcbiAgICAgICAgcyArPSBgJHtleHBvcnREZWNsYXJlKGFtYmllbnQpfSBlbnVtICR7bGluZS5uYW1lfSB7XFxuJHtsaW5lLmRlZn1cXG59YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcyArPSBgZXhwb3J0IHR5cGUgJHtsaW5lLm5hbWV9ID0gJHtsaW5lLmRlZi5yZXBsYWNlQWxsKC8uKj0vZywgJycpLnJlcGxhY2VBbGwoJywnLCAnfCcpfTtgXG4gICAgICB9XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNhc2UgVHlwZURlZktpbmQuU3RydWN0OlxuICAgICAgY29uc3QgZXh0ZW5kc0RlZiA9IGxpbmUuZXh0ZW5kcyA/IGAgZXh0ZW5kcyAke2xpbmUuZXh0ZW5kc31gIDogJydcbiAgICAgIGlmIChsaW5lLmV4dGVuZHMpIHtcbiAgICAgICAgLy8gRXh0cmFjdCBnZW5lcmljIHBhcmFtcyBmcm9tIGV4dGVuZHMgdHlwZSBsaWtlIEl0ZXJhdG9yPFQsIFRSZXN1bHQsIFROZXh0PlxuICAgICAgICBjb25zdCBnZW5lcmljTWF0Y2ggPSBsaW5lLmV4dGVuZHMubWF0Y2goL0l0ZXJhdG9yPCguKyk+JC8pXG4gICAgICAgIGlmIChnZW5lcmljTWF0Y2gpIHtcbiAgICAgICAgICBjb25zdCBbVCwgVFJlc3VsdCwgVE5leHRdID0gZ2VuZXJpY01hdGNoWzFdXG4gICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgLm1hcCgocCkgPT4gcC50cmltKCkpXG4gICAgICAgICAgbGluZS5kZWYgPVxuICAgICAgICAgICAgbGluZS5kZWYgK1xuICAgICAgICAgICAgYFxcbm5leHQodmFsdWU/OiAke1ROZXh0fSk6IEl0ZXJhdG9yUmVzdWx0PCR7VH0sICR7VFJlc3VsdH0+YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzICs9IGAke2V4cG9ydERlY2xhcmUoYW1iaWVudCl9IGNsYXNzICR7bGluZS5uYW1lfSR7ZXh0ZW5kc0RlZn0ge1xcbiR7bGluZS5kZWZ9XFxufWBcbiAgICAgIGlmIChsaW5lLm9yaWdpbmFsX25hbWUgJiYgbGluZS5vcmlnaW5hbF9uYW1lICE9PSBsaW5lLm5hbWUpIHtcbiAgICAgICAgcyArPSBgXFxuZXhwb3J0IHR5cGUgJHtsaW5lLm9yaWdpbmFsX25hbWV9ID0gJHtsaW5lLm5hbWV9YFxuICAgICAgfVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgVHlwZURlZktpbmQuRm46XG4gICAgICBzICs9IGAke2V4cG9ydERlY2xhcmUoYW1iaWVudCl9ICR7bGluZS5kZWZ9YFxuICAgICAgYnJlYWtcblxuICAgIGRlZmF1bHQ6XG4gICAgICBzICs9IGxpbmUuZGVmXG4gIH1cblxuICByZXR1cm4gY29ycmVjdFN0cmluZ0lkZW50KHMsIGlkZW50KVxufVxuXG5mdW5jdGlvbiBleHBvcnREZWNsYXJlKGFtYmllbnQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoYW1iaWVudCkge1xuICAgIHJldHVybiAnZXhwb3J0J1xuICB9XG5cbiAgcmV0dXJuICdleHBvcnQgZGVjbGFyZSdcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBuYXBpLWRlcml2ZS1lbWl0dGVkIGludGVybWVkaWF0ZSB0eXBlLWRlZiBmaWxlIGFuZCByZW5kZXIgaXRzXG4gKiBlbnRyaWVzIGludG8gdGhlIGBpbmRleC5kLnRzYCBzb3VyY2Ugc3RyaW5nIHBsdXMgdGhlIGxpc3Qgb2YgbmFtZXMgdG9cbiAqIHJlLWV4cG9ydCBmcm9tIGBpbmRleC5qc2AuXG4gKlxuICogQHBhcmFtIGludGVybWVkaWF0ZVR5cGVGaWxlIC0gUGF0aCB0byB0aGUgSlNPTkwgdHlwZS1kZWYgZmlsZSBwcm9kdWNlZFxuICogICBieSBuYXBpLWRlcml2ZSAob25lIGVudHJ5IHBlciBgI1tuYXBpXWAgaXRlbSkuXG4gKiBAcGFyYW0gY29uc3RFbnVtIC0gU2VlIHtAbGluayBwcmV0dHlQcmludH0uXG4gKiBAcGFyYW0gcnVudGltZVN0cmluZ0VudW0gLSBTZWUge0BsaW5rIHByZXR0eVByaW50fS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NUeXBlRGVmKFxuICBpbnRlcm1lZGlhdGVUeXBlRmlsZTogc3RyaW5nLFxuICBjb25zdEVudW06IGJvb2xlYW4sXG4gIHJ1bnRpbWVTdHJpbmdFbnVtOiBib29sZWFuID0gZmFsc2UsXG4pIHtcbiAgY29uc3QgZXhwb3J0czogc3RyaW5nW10gPSBbXVxuICBjb25zdCBkZWZzID0gYXdhaXQgcmVhZEludGVybWVkaWF0ZVR5cGVGaWxlKGludGVybWVkaWF0ZVR5cGVGaWxlKVxuICBjb25zdCBncm91cGVkRGVmcyA9IHByZXByb2Nlc3NUeXBlRGVmKGRlZnMpXG5cbiAgY29uc3QgZHRzID1cbiAgICBzb3J0QnkoQXJyYXkuZnJvbShncm91cGVkRGVmcyksIFsoW25hbWVzcGFjZV0pID0+IG5hbWVzcGFjZV0pXG4gICAgICAubWFwKChbbmFtZXNwYWNlLCBkZWZzXSkgPT4ge1xuICAgICAgICBpZiAobmFtZXNwYWNlID09PSBUT1BfTEVWRUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZnNcbiAgICAgICAgICAgIC5tYXAoKGRlZikgPT4ge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGRlZi5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUeXBlRGVmS2luZC5Db25zdDpcbiAgICAgICAgICAgICAgICBjYXNlIFR5cGVEZWZLaW5kLkVudW06XG4gICAgICAgICAgICAgICAgY2FzZSBUeXBlRGVmS2luZC5TdHJpbmdFbnVtOlxuICAgICAgICAgICAgICAgIGNhc2UgVHlwZURlZktpbmQuRm46XG4gICAgICAgICAgICAgICAgY2FzZSBUeXBlRGVmS2luZC5TdHJ1Y3Q6IHtcbiAgICAgICAgICAgICAgICAgIGV4cG9ydHMucHVzaChkZWYubmFtZSlcbiAgICAgICAgICAgICAgICAgIGlmIChkZWYub3JpZ2luYWxfbmFtZSAmJiBkZWYub3JpZ2luYWxfbmFtZSAhPT0gZGVmLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5wdXNoKGRlZi5vcmlnaW5hbF9uYW1lKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHByZXR0eVByaW50KGRlZiwgY29uc3RFbnVtLCBydW50aW1lU3RyaW5nRW51bSwgMClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignXFxuXFxuJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBleHBvcnRzLnB1c2gobmFtZXNwYWNlKVxuICAgICAgICAgIGxldCBkZWNsYXJhdGlvbiA9ICcnXG4gICAgICAgICAgZGVjbGFyYXRpb24gKz0gYGV4cG9ydCBkZWNsYXJlIG5hbWVzcGFjZSAke25hbWVzcGFjZX0ge1xcbmBcbiAgICAgICAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbiArPVxuICAgICAgICAgICAgICBwcmV0dHlQcmludChkZWYsIGNvbnN0RW51bSwgcnVudGltZVN0cmluZ0VudW0sIDIsIHRydWUpICsgJ1xcbidcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVjbGFyYXRpb24gKz0gJ30nXG4gICAgICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuXFxuJykgKyAnXFxuJ1xuXG4gIHJldHVybiB7XG4gICAgZHRzLFxuICAgIGV4cG9ydHMsXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEludGVybWVkaWF0ZVR5cGVGaWxlKGZpbGU6IHN0cmluZykge1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlLCAndXRmOCcpXG5cbiAgY29uc3QgZGVmcyA9IGNvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKVxuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShsaW5lKSBhcyBUeXBlRGVmTGluZVxuICAgICAgLy8gQ29udmVydCBlc2NhcGVkIG5ld2xpbmVzIGJhY2sgdG8gYWN0dWFsIG5ld2xpbmVzIGluIGpzX2RvYyBmaWVsZHNcbiAgICAgIGlmIChwYXJzZWQuanNfZG9jKSB7XG4gICAgICAgIHBhcnNlZC5qc19kb2MgPSBwYXJzZWQuanNfZG9jLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKVxuICAgICAgfVxuICAgICAgLy8gQ29udmVydCBlc2NhcGVkIG5ld2xpbmVzIHRvIGFjdHVhbCBuZXdsaW5lcyBpbiBkZWYgZmllbGRzIGZvciBzdHJ1Y3QvY2xhc3MvaW50ZXJmYWNlL3R5cGUgdHlwZXNcbiAgICAgIC8vIHdoZXJlIFxcbiByZXByZXNlbnRzIG1ldGhvZC9maWVsZCBzZXBhcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFjdHVhbCBuZXdsaW5lc1xuICAgICAgaWYgKHBhcnNlZC5kZWYpIHtcbiAgICAgICAgcGFyc2VkLmRlZiA9IHBhcnNlZC5kZWYucmVwbGFjZSgvXFxcXG4vZywgJ1xcbicpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyc2VkXG4gICAgfSlcblxuICAvLyBtb3ZlIGFsbCBgc3RydWN0YCBkZWYgdG8gdGhlIHZlcnkgdG9wXG4gIC8vIGFuZCBvcmRlciB0aGUgcmVzdCBhbHBoYWJldGljYWxseS5cbiAgcmV0dXJuIGRlZnMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmtpbmQgPT09IFR5cGVEZWZLaW5kLlN0cnVjdCkge1xuICAgICAgaWYgKGIua2luZCA9PT0gVHlwZURlZktpbmQuU3RydWN0KSB7XG4gICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpXG4gICAgICB9XG4gICAgICByZXR1cm4gLTFcbiAgICB9IGVsc2UgaWYgKGIua2luZCA9PT0gVHlwZURlZktpbmQuU3RydWN0KSB7XG4gICAgICByZXR1cm4gMVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc1R5cGVEZWYoZGVmczogVHlwZURlZkxpbmVbXSk6IE1hcDxzdHJpbmcsIFR5cGVEZWZMaW5lW10+IHtcbiAgY29uc3QgbmFtZXNwYWNlR3JvdXBlZCA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlRGVmTGluZVtdPigpXG4gIGNvbnN0IGNsYXNzRGVmcyA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlRGVmTGluZT4oKVxuXG4gIGZvciAoY29uc3QgZGVmIG9mIGRlZnMpIHtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBkZWYuanNfbW9kID8/IFRPUF9MRVZFTF9OQU1FU1BBQ0VcbiAgICBpZiAoIW5hbWVzcGFjZUdyb3VwZWQuaGFzKG5hbWVzcGFjZSkpIHtcbiAgICAgIG5hbWVzcGFjZUdyb3VwZWQuc2V0KG5hbWVzcGFjZSwgW10pXG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXAgPSBuYW1lc3BhY2VHcm91cGVkLmdldChuYW1lc3BhY2UpIVxuXG4gICAgaWYgKGRlZi5raW5kID09PSBUeXBlRGVmS2luZC5TdHJ1Y3QpIHtcbiAgICAgIGdyb3VwLnB1c2goZGVmKVxuICAgICAgY2xhc3NEZWZzLnNldChkZWYubmFtZSwgZGVmKVxuICAgIH0gZWxzZSBpZiAoZGVmLmtpbmQgPT09IFR5cGVEZWZLaW5kLkV4dGVuZHMpIHtcbiAgICAgIGNvbnN0IGNsYXNzRGVmID0gY2xhc3NEZWZzLmdldChkZWYubmFtZSlcbiAgICAgIGlmIChjbGFzc0RlZikge1xuICAgICAgICBjbGFzc0RlZi5leHRlbmRzID0gZGVmLmRlZlxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVmLmtpbmQgPT09IFR5cGVEZWZLaW5kLkltcGwpIHtcbiAgICAgIC8vIG1lcmdlIGBpbXBsYCBpbnRvIGNsYXNzIGRlZmluaXRpb25cbiAgICAgIGNvbnN0IGNsYXNzRGVmID0gY2xhc3NEZWZzLmdldChkZWYubmFtZSlcbiAgICAgIGlmIChjbGFzc0RlZikge1xuICAgICAgICBpZiAoY2xhc3NEZWYuZGVmKSB7XG4gICAgICAgICAgY2xhc3NEZWYuZGVmICs9ICdcXG4nXG4gICAgICAgIH1cblxuICAgICAgICBjbGFzc0RlZi5kZWYgKz0gZGVmLmRlZlxuICAgICAgICAvLyBDb252ZXJ0IGFueSByZW1haW5pbmcgXFxuIHNlcXVlbmNlcyBpbiB0aGUgbWVyZ2VkIGRlZiB0byBhY3R1YWwgbmV3bGluZXNcbiAgICAgICAgaWYgKGNsYXNzRGVmLmRlZikge1xuICAgICAgICAgIGNsYXNzRGVmLmRlZiA9IGNsYXNzRGVmLmRlZi5yZXBsYWNlKC9cXFxcbi9nLCAnXFxuJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBncm91cC5wdXNoKGRlZilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZXNwYWNlR3JvdXBlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29ycmVjdFN0cmluZ0lkZW50KHNyYzogc3RyaW5nLCBpZGVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IGJyYWNrZXREZXB0aCA9IDBcbiAgY29uc3QgcmVzdWx0ID0gc3JjXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKVxuICAgICAgaWYgKGxpbmUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0luTXVsdGlsaW5lQ29tbWVudCA9IGxpbmUuc3RhcnRzV2l0aCgnKicpXG4gICAgICBjb25zdCBpc0Nsb3NpbmdCcmFja2V0ID0gbGluZS5lbmRzV2l0aCgnfScpXG4gICAgICBjb25zdCBpc09wZW5pbmdCcmFja2V0ID0gbGluZS5lbmRzV2l0aCgneycpXG4gICAgICBjb25zdCBpc1R5cGVEZWNsYXJhdGlvbiA9IGxpbmUuZW5kc1dpdGgoJz0nKVxuICAgICAgY29uc3QgaXNUeXBlVmFyaWFudCA9IGxpbmUuc3RhcnRzV2l0aCgnfCcpXG5cbiAgICAgIGxldCByaWdodEluZGVudCA9IGlkZW50XG4gICAgICBpZiAoKGlzT3BlbmluZ0JyYWNrZXQgfHwgaXNUeXBlRGVjbGFyYXRpb24pICYmICFpc0luTXVsdGlsaW5lQ29tbWVudCkge1xuICAgICAgICBicmFja2V0RGVwdGggKz0gMVxuICAgICAgICByaWdodEluZGVudCArPSAoYnJhY2tldERlcHRoIC0gMSkgKiAyXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDbG9zaW5nQnJhY2tldCAmJlxuICAgICAgICAgIGJyYWNrZXREZXB0aCA+IDAgJiZcbiAgICAgICAgICAhaXNJbk11bHRpbGluZUNvbW1lbnQgJiZcbiAgICAgICAgICAhaXNUeXBlVmFyaWFudFxuICAgICAgICApIHtcbiAgICAgICAgICBicmFja2V0RGVwdGggLT0gMVxuICAgICAgICB9XG4gICAgICAgIHJpZ2h0SW5kZW50ICs9IGJyYWNrZXREZXB0aCAqIDJcbiAgICAgIH1cblxuICAgICAgaWYgKGlzSW5NdWx0aWxpbmVDb21tZW50KSB7XG4gICAgICAgIHJpZ2h0SW5kZW50ICs9IDFcbiAgICAgIH1cblxuICAgICAgY29uc3QgcyA9IGAkeycgJy5yZXBlYXQocmlnaHRJbmRlbnQpfSR7bGluZX1gXG5cbiAgICAgIHJldHVybiBzXG4gICAgfSlcbiAgICAuam9pbignXFxuJylcblxuICByZXR1cm4gcmVzdWx0XG59XG4iLCJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgeyByZWFkTmFwaUNvbmZpZyB9IGZyb20gJy4vY29uZmlnLmpzJ1xuXG5pbnRlcmZhY2UgTWluaW1hbE5hcGlPcHRpb25zIHtcbiAgY3dkOiBzdHJpbmdcbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICBwYWNrYWdlSnNvblBhdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRDb25maWcob3B0aW9uczogTWluaW1hbE5hcGlPcHRpb25zKSB7XG4gIGNvbnN0IHJlc29sdmVQYXRoID0gKC4uLnBhdGhzOiBzdHJpbmdbXSkgPT4gcmVzb2x2ZShvcHRpb25zLmN3ZCwgLi4ucGF0aHMpXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgIHJlc29sdmVQYXRoKG9wdGlvbnMucGFja2FnZUpzb25QYXRoID8/ICdwYWNrYWdlLmpzb24nKSxcbiAgICBvcHRpb25zLmNvbmZpZ1BhdGggPyByZXNvbHZlUGF0aChvcHRpb25zLmNvbmZpZ1BhdGgpIDogdW5kZWZpbmVkLFxuICApXG4gIHJldHVybiBjb25maWdcbn1cbiIsImltcG9ydCB7IGpvaW4sIHJlc29sdmUsIHBhcnNlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgKiBhcyBjb2xvcnMgZnJvbSAnY29sb3JldHRlJ1xuXG5pbXBvcnQge1xuICBhcHBseURlZmF1bHRBcnRpZmFjdHNPcHRpb25zLFxuICB0eXBlIEFydGlmYWN0c09wdGlvbnMsXG59IGZyb20gJy4uL2RlZi9hcnRpZmFjdHMuanMnXG5pbXBvcnQge1xuICByZWFkTmFwaUNvbmZpZyxcbiAgZGVidWdGYWN0b3J5LFxuICByZWFkRmlsZUFzeW5jLFxuICB3cml0ZUZpbGVBc3luYyxcbiAgVW5pQXJjaHNCeVBsYXRmb3JtLFxuICByZWFkZGlyQXN5bmMsXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgnYXJ0aWZhY3RzJylcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RBcnRpZmFjdHModXNlck9wdGlvbnM6IEFydGlmYWN0c09wdGlvbnMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGFwcGx5RGVmYXVsdEFydGlmYWN0c09wdGlvbnModXNlck9wdGlvbnMpXG5cbiAgY29uc3QgcmVzb2x2ZVBhdGggPSAoLi4ucGF0aHM6IHN0cmluZ1tdKSA9PiByZXNvbHZlKG9wdGlvbnMuY3dkLCAuLi5wYXRocylcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVzb2x2ZVBhdGgob3B0aW9ucy5wYWNrYWdlSnNvblBhdGgpXG4gIGNvbnN0IHsgdGFyZ2V0cywgYmluYXJ5TmFtZSwgcGFja2FnZU5hbWUgfSA9IGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgIHBhY2thZ2VKc29uUGF0aCxcbiAgICBvcHRpb25zLmNvbmZpZ1BhdGggPyByZXNvbHZlUGF0aChvcHRpb25zLmNvbmZpZ1BhdGgpIDogdW5kZWZpbmVkLFxuICApXG5cbiAgY29uc3QgZGlzdERpcnMgPSB0YXJnZXRzLm1hcCgocGxhdGZvcm0pID0+XG4gICAgam9pbihvcHRpb25zLmN3ZCwgb3B0aW9ucy5ucG1EaXIsIHBsYXRmb3JtLnBsYXRmb3JtQXJjaEFCSSksXG4gIClcblxuICBjb25zdCB1bml2ZXJzYWxTb3VyY2VCaW5zID0gbmV3IFNldChcbiAgICB0YXJnZXRzXG4gICAgICAuZmlsdGVyKChwbGF0Zm9ybSkgPT4gcGxhdGZvcm0uYXJjaCA9PT0gJ3VuaXZlcnNhbCcpXG4gICAgICAuZmxhdE1hcCgocCkgPT5cbiAgICAgICAgVW5pQXJjaHNCeVBsYXRmb3JtW3AucGxhdGZvcm1dPy5tYXAoKGEpID0+IGAke3AucGxhdGZvcm19LSR7YX1gKSxcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW10sXG4gIClcblxuICBhd2FpdCBjb2xsZWN0Tm9kZUJpbmFyaWVzKGpvaW4ob3B0aW9ucy5jd2QsIG9wdGlvbnMub3V0cHV0RGlyKSkudGhlbihcbiAgICAob3V0cHV0KSA9PlxuICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgIG91dHB1dC5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICAgICAgZGVidWcuaW5mbyhgUmVhZCBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KGZpbGVQYXRoKX1dYClcbiAgICAgICAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlUGF0aClcbiAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2UoZmlsZVBhdGgpXG4gICAgICAgICAgY29uc3QgdGVybXMgPSBwYXJzZWROYW1lLm5hbWUuc3BsaXQoJy4nKVxuICAgICAgICAgIGNvbnN0IHBsYXRmb3JtQXJjaEFCSSA9IHRlcm1zLnBvcCgpIVxuICAgICAgICAgIGNvbnN0IF9iaW5hcnlOYW1lID0gdGVybXMuam9pbignLicpXG5cbiAgICAgICAgICBpZiAoX2JpbmFyeU5hbWUgIT09IGJpbmFyeU5hbWUpIHtcbiAgICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICAgIGBbJHtfYmluYXJ5TmFtZX1dIGlzIG5vdCBtYXRjaGVkIHdpdGggWyR7YmluYXJ5TmFtZX1dLCBza2lwYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkaXIgPSBkaXN0RGlycy5maW5kKChkaXIpID0+IGRpci5pbmNsdWRlcyhwbGF0Zm9ybUFyY2hBQkkpKVxuICAgICAgICAgIGlmICghZGlyICYmIHVuaXZlcnNhbFNvdXJjZUJpbnMuaGFzKHBsYXRmb3JtQXJjaEFCSSkpIHtcbiAgICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICAgIGBbJHtwbGF0Zm9ybUFyY2hBQkl9XSBoYXMgbm8gZGlzdCBkaXIgYnV0IGl0IGlzIHNvdXJjZSBiaW4gZm9yIHVuaXZlcnNhbCBhcmNoLCBza2lwYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRpcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBkaXN0IGRpciBmb3VuZCBmb3IgJHtmaWxlUGF0aH1gKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGRpc3RGaWxlUGF0aCA9IGpvaW4oZGlyLCBwYXJzZWROYW1lLmJhc2UpXG4gICAgICAgICAgZGVidWcuaW5mbyhcbiAgICAgICAgICAgIGBXcml0ZSBmaWxlIGNvbnRlbnQgdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodChkaXN0RmlsZVBhdGgpfV1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhkaXN0RmlsZVBhdGgsIHNvdXJjZUNvbnRlbnQpXG4gICAgICAgICAgY29uc3QgZGlzdEZpbGVQYXRoTG9jYWwgPSBqb2luKFxuICAgICAgICAgICAgcGFyc2UocGFja2FnZUpzb25QYXRoKS5kaXIsXG4gICAgICAgICAgICBwYXJzZWROYW1lLmJhc2UsXG4gICAgICAgICAgKVxuICAgICAgICAgIGRlYnVnLmluZm8oXG4gICAgICAgICAgICBgV3JpdGUgZmlsZSBjb250ZW50IHRvIFske2NvbG9ycy55ZWxsb3dCcmlnaHQoZGlzdEZpbGVQYXRoTG9jYWwpfV1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhkaXN0RmlsZVBhdGhMb2NhbCwgc291cmNlQ29udGVudClcbiAgICAgICAgfSksXG4gICAgICApLFxuICApXG5cbiAgY29uc3Qgd2FzaVRhcmdldCA9IHRhcmdldHMuZmluZCgodCkgPT4gdC5wbGF0Zm9ybSA9PT0gJ3dhc2knKVxuICBpZiAod2FzaVRhcmdldCkge1xuICAgIGNvbnN0IHdhc2lEaXIgPSBqb2luKFxuICAgICAgb3B0aW9ucy5jd2QsXG4gICAgICBvcHRpb25zLm5wbURpcixcbiAgICAgIHdhc2lUYXJnZXQucGxhdGZvcm1BcmNoQUJJLFxuICAgIClcbiAgICBjb25zdCBjanNGaWxlID0gam9pbihcbiAgICAgIG9wdGlvbnMuYnVpbGRPdXRwdXREaXIgPz8gb3B0aW9ucy5jd2QsXG4gICAgICBgJHtiaW5hcnlOYW1lfS53YXNpLmNqc2AsXG4gICAgKVxuICAgIGNvbnN0IHdvcmtlckZpbGUgPSBqb2luKFxuICAgICAgb3B0aW9ucy5idWlsZE91dHB1dERpciA/PyBvcHRpb25zLmN3ZCxcbiAgICAgIGB3YXNpLXdvcmtlci5tanNgLFxuICAgIClcbiAgICBjb25zdCBicm93c2VyRW50cnkgPSBqb2luKFxuICAgICAgb3B0aW9ucy5idWlsZE91dHB1dERpciA/PyBvcHRpb25zLmN3ZCxcbiAgICAgIGAke2JpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2AsXG4gICAgKVxuICAgIGNvbnN0IGJyb3dzZXJXb3JrZXJGaWxlID0gam9pbihcbiAgICAgIG9wdGlvbnMuYnVpbGRPdXRwdXREaXIgPz8gb3B0aW9ucy5jd2QsXG4gICAgICBgd2FzaS13b3JrZXItYnJvd3Nlci5tanNgLFxuICAgIClcbiAgICBkZWJ1Zy5pbmZvKFxuICAgICAgYE1vdmUgd2FzaSBiaW5kaW5nIGZpbGUgWyR7Y29sb3JzLnllbGxvd0JyaWdodChcbiAgICAgICAgY2pzRmlsZSxcbiAgICAgICl9XSB0byBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KHdhc2lEaXIpfV1gLFxuICAgIClcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgIGpvaW4od2FzaURpciwgYCR7YmluYXJ5TmFtZX0ud2FzaS5janNgKSxcbiAgICAgIGF3YWl0IHJlYWRGaWxlQXN5bmMoY2pzRmlsZSksXG4gICAgKVxuICAgIGRlYnVnLmluZm8oXG4gICAgICBgTW92ZSB3YXNpIHdvcmtlciBmaWxlIFske2NvbG9ycy55ZWxsb3dCcmlnaHQoXG4gICAgICAgIHdvcmtlckZpbGUsXG4gICAgICApfV0gdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodCh3YXNpRGlyKX1dYCxcbiAgICApXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICBqb2luKHdhc2lEaXIsIGB3YXNpLXdvcmtlci5tanNgKSxcbiAgICAgIGF3YWl0IHJlYWRGaWxlQXN5bmMod29ya2VyRmlsZSksXG4gICAgKVxuICAgIGRlYnVnLmluZm8oXG4gICAgICBgTW92ZSB3YXNpIGJyb3dzZXIgZW50cnkgZmlsZSBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KFxuICAgICAgICBicm93c2VyRW50cnksXG4gICAgICApfV0gdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodCh3YXNpRGlyKX1dYCxcbiAgICApXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICBqb2luKHdhc2lEaXIsIGAke2JpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2ApLFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlL2lzc3Vlcy84NDI3XG4gICAgICAoYXdhaXQgcmVhZEZpbGVBc3luYyhicm93c2VyRW50cnksICd1dGY4JykpLnJlcGxhY2UoXG4gICAgICAgIGBuZXcgVVJMKCcuL3dhc2ktd29ya2VyLWJyb3dzZXIubWpzJywgaW1wb3J0Lm1ldGEudXJsKWAsXG4gICAgICAgIGBuZXcgVVJMKCcke3BhY2thZ2VOYW1lfS13YXNtMzItd2FzaS93YXNpLXdvcmtlci1icm93c2VyLm1qcycsIGltcG9ydC5tZXRhLnVybClgLFxuICAgICAgKSxcbiAgICApXG4gICAgZGVidWcuaW5mbyhcbiAgICAgIGBNb3ZlIHdhc2kgYnJvd3NlciB3b3JrZXIgZmlsZSBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KFxuICAgICAgICBicm93c2VyV29ya2VyRmlsZSxcbiAgICAgICl9XSB0byBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KHdhc2lEaXIpfV1gLFxuICAgIClcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgIGpvaW4od2FzaURpciwgYHdhc2ktd29ya2VyLWJyb3dzZXIubWpzYCksXG4gICAgICBhd2FpdCByZWFkRmlsZUFzeW5jKGJyb3dzZXJXb3JrZXJGaWxlKSxcbiAgICApXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdE5vZGVCaW5hcmllcyhyb290OiBzdHJpbmcpIHtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyQXN5bmMocm9vdCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gIGNvbnN0IG5vZGVCaW5hcmllcyA9IGZpbGVzXG4gICAgLmZpbHRlcihcbiAgICAgIChmaWxlKSA9PlxuICAgICAgICBmaWxlLmlzRmlsZSgpICYmXG4gICAgICAgIChmaWxlLm5hbWUuZW5kc1dpdGgoJy5ub2RlJykgfHwgZmlsZS5uYW1lLmVuZHNXaXRoKCcud2FzbScpKSxcbiAgICApXG4gICAgLm1hcCgoZmlsZSkgPT4gam9pbihyb290LCBmaWxlLm5hbWUpKVxuXG4gIGNvbnN0IGRpcnMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUuaXNEaXJlY3RvcnkoKSlcbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGlmIChkaXIubmFtZSAhPT0gJ25vZGVfbW9kdWxlcycpIHtcbiAgICAgIG5vZGVCaW5hcmllcy5wdXNoKC4uLihhd2FpdCBjb2xsZWN0Tm9kZUJpbmFyaWVzKGpvaW4ocm9vdCwgZGlyLm5hbWUpKSkpXG4gICAgfVxuICB9XG4gIHJldHVybiBub2RlQmluYXJpZXNcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDanNCaW5kaW5nKFxuICBsb2NhbE5hbWU6IHN0cmluZyxcbiAgcGtnTmFtZTogc3RyaW5nLFxuICBpZGVudHM6IHN0cmluZ1tdLFxuICBwYWNrYWdlVmVyc2lvbj86IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtiaW5kaW5nSGVhZGVyfVxuJHtjcmVhdGVDb21tb25CaW5kaW5nKGxvY2FsTmFtZSwgcGtnTmFtZSwgcGFja2FnZVZlcnNpb24pfVxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVCaW5kaW5nXG4ke2lkZW50c1xuICAubWFwKChpZGVudCkgPT4gYG1vZHVsZS5leHBvcnRzLiR7aWRlbnR9ID0gbmF0aXZlQmluZGluZy4ke2lkZW50fWApXG4gIC5qb2luKCdcXG4nKX1cbmBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVzbUJpbmRpbmcoXG4gIGxvY2FsTmFtZTogc3RyaW5nLFxuICBwa2dOYW1lOiBzdHJpbmcsXG4gIGlkZW50czogc3RyaW5nW10sXG4gIHBhY2thZ2VWZXJzaW9uPzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2JpbmRpbmdIZWFkZXJ9XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbW9kdWxlJ1xuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuY29uc3QgX19kaXJuYW1lID0gbmV3IFVSTCgnLicsIGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWVcblxuJHtjcmVhdGVDb21tb25CaW5kaW5nKGxvY2FsTmFtZSwgcGtnTmFtZSwgcGFja2FnZVZlcnNpb24pfVxuY29uc3QgeyAke2lkZW50cy5qb2luKCcsICcpfSB9ID0gbmF0aXZlQmluZGluZ1xuJHtpZGVudHMubWFwKChpZGVudCkgPT4gYGV4cG9ydCB7ICR7aWRlbnR9IH1gKS5qb2luKCdcXG4nKX1cbmBcbn1cblxuY29uc3QgYmluZGluZ0hlYWRlciA9IGAvLyBwcmV0dGllci1pZ25vcmVcbi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBAdHMtbm9jaGVja1xuLyogYXV0by1nZW5lcmF0ZWQgYnkgTkFQSS1SUyAqL1xuYFxuXG5mdW5jdGlvbiBjcmVhdGVDb21tb25CaW5kaW5nKFxuICBsb2NhbE5hbWU6IHN0cmluZyxcbiAgcGtnTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlVmVyc2lvbj86IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGZ1bmN0aW9uIHJlcXVpcmVUdXBsZSh0dXBsZTogc3RyaW5nLCBpZGVudFNpemUgPSA4KSB7XG4gICAgY29uc3QgaWRlbnRMb3cgPSAnICcucmVwZWF0KGlkZW50U2l6ZSAtIDIpXG4gICAgY29uc3QgaWRlbnQgPSAnICcucmVwZWF0KGlkZW50U2l6ZSlcbiAgICBjb25zdCB2ZXJzaW9uQ2hlY2sgPSBwYWNrYWdlVmVyc2lvblxuICAgICAgPyBgXG4ke2lkZW50TG93fXRyeSB7XG4ke2lkZW50fWNvbnN0IGJpbmRpbmcgPSByZXF1aXJlKCcke3BrZ05hbWV9LSR7dHVwbGV9JylcbiR7aWRlbnR9Y29uc3QgYmluZGluZ1BhY2thZ2VWZXJzaW9uID0gcmVxdWlyZSgnJHtwa2dOYW1lfS0ke3R1cGxlfS9wYWNrYWdlLmpzb24nKS52ZXJzaW9uXG4ke2lkZW50fWlmIChiaW5kaW5nUGFja2FnZVZlcnNpb24gIT09ICcke3BhY2thZ2VWZXJzaW9ufScgJiYgcHJvY2Vzcy5lbnYuTkFQSV9SU19FTkZPUkNFX1ZFUlNJT05fQ0hFQ0sgJiYgcHJvY2Vzcy5lbnYuTkFQSV9SU19FTkZPUkNFX1ZFUlNJT05fQ0hFQ0sgIT09ICcwJykge1xuJHtpZGVudH0gIHRocm93IG5ldyBFcnJvcihcXGBOYXRpdmUgYmluZGluZyBwYWNrYWdlIHZlcnNpb24gbWlzbWF0Y2gsIGV4cGVjdGVkICR7cGFja2FnZVZlcnNpb259IGJ1dCBnb3QgXFwke2JpbmRpbmdQYWNrYWdlVmVyc2lvbn0uIFlvdSBjYW4gcmVpbnN0YWxsIGRlcGVuZGVuY2llcyB0byBmaXggdGhpcyBpc3N1ZS5cXGApXG4ke2lkZW50fX1cbiR7aWRlbnR9cmV0dXJuIGJpbmRpbmdcbiR7aWRlbnRMb3d9fSBjYXRjaCAoZSkge1xuJHtpZGVudH1sb2FkRXJyb3JzLnB1c2goZSlcbiR7aWRlbnRMb3d9fWBcbiAgICAgIDogYFxuJHtpZGVudExvd310cnkge1xuJHtpZGVudH1yZXR1cm4gcmVxdWlyZSgnJHtwa2dOYW1lfS0ke3R1cGxlfScpXG4ke2lkZW50TG93fX0gY2F0Y2ggKGUpIHtcbiR7aWRlbnR9bG9hZEVycm9ycy5wdXNoKGUpXG4ke2lkZW50TG93fX1gXG4gICAgcmV0dXJuIGB0cnkge1xuJHtpZGVudH1yZXR1cm4gcmVxdWlyZSgnLi8ke2xvY2FsTmFtZX0uJHt0dXBsZX0ubm9kZScpXG4ke2lkZW50TG93fX0gY2F0Y2ggKGUpIHtcbiR7aWRlbnR9bG9hZEVycm9ycy5wdXNoKGUpXG4ke2lkZW50TG93fX0ke3ZlcnNpb25DaGVja31gXG4gIH1cblxuICByZXR1cm4gYGNvbnN0IHsgcmVhZEZpbGVTeW5jIH0gPSByZXF1aXJlKCdmcycpXG5sZXQgbmF0aXZlQmluZGluZyA9IG51bGxcbmNvbnN0IGxvYWRFcnJvcnMgPSBbXVxuXG5jb25zdCBpc011c2wgPSAoKSA9PiB7XG4gIGxldCBtdXNsID0gZmFsc2VcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdsaW51eCcpIHtcbiAgICBtdXNsID0gaXNNdXNsRnJvbUZpbGVzeXN0ZW0oKVxuICAgIGlmIChtdXNsID09PSBudWxsKSB7XG4gICAgICBtdXNsID0gaXNNdXNsRnJvbVJlcG9ydCgpXG4gICAgfVxuICAgIGlmIChtdXNsID09PSBudWxsKSB7XG4gICAgICBtdXNsID0gaXNNdXNsRnJvbUNoaWxkUHJvY2VzcygpXG4gICAgfVxuICB9XG4gIHJldHVybiBtdXNsXG59XG5cbmNvbnN0IGlzRmlsZU11c2wgPSAoZikgPT4gZi5pbmNsdWRlcygnbGliYy5tdXNsLScpIHx8IGYuaW5jbHVkZXMoJ2xkLW11c2wtJylcblxuY29uc3QgaXNNdXNsRnJvbUZpbGVzeXN0ZW0gPSAoKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlYWRGaWxlU3luYygnL3Vzci9iaW4vbGRkJywgJ3V0Zi04JykuaW5jbHVkZXMoJ211c2wnKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmNvbnN0IGlzTXVzbEZyb21SZXBvcnQgPSAoKSA9PiB7XG4gIGxldCByZXBvcnQgPSBudWxsXG4gIGlmIChwcm9jZXNzLnJlcG9ydCAmJiB0eXBlb2YgcHJvY2Vzcy5yZXBvcnQuZ2V0UmVwb3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5yZXBvcnQuZXhjbHVkZU5ldHdvcmsgPSB0cnVlXG4gICAgcmVwb3J0ID0gcHJvY2Vzcy5yZXBvcnQuZ2V0UmVwb3J0KClcbiAgfVxuICBpZiAoIXJlcG9ydCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgaWYgKHJlcG9ydC5oZWFkZXIgJiYgcmVwb3J0LmhlYWRlci5nbGliY1ZlcnNpb25SdW50aW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkocmVwb3J0LnNoYXJlZE9iamVjdHMpKSB7XG4gICAgaWYgKHJlcG9ydC5zaGFyZWRPYmplY3RzLnNvbWUoaXNGaWxlTXVzbCkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCBpc011c2xGcm9tQ2hpbGRQcm9jZXNzID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY1N5bmMoJ2xkZCAtLXZlcnNpb24nLCB7IGVuY29kaW5nOiAndXRmOCcgfSkuaW5jbHVkZXMoJ211c2wnKVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWYgd2UgcmVhY2ggdGhpcyBjYXNlLCB3ZSBkb24ndCBrbm93IGlmIHRoZSBzeXN0ZW0gaXMgbXVzbCBvciBub3QsIHNvIGlzIGJldHRlciB0byBqdXN0IGZhbGxiYWNrIHRvIGZhbHNlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWlyZU5hdGl2ZSgpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5BUElfUlNfTkFUSVZFX0xJQlJBUllfUEFUSCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVxdWlyZShwcm9jZXNzLmVudi5OQVBJX1JTX05BVElWRV9MSUJSQVJZX1BBVEgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKGVycilcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKSB7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybTY0Jykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ2FuZHJvaWQtYXJtNjQnKX1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybScpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdhbmRyb2lkLWFybS1lYWJpJyl9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRFcnJvcnMucHVzaChuZXcgRXJyb3IoXFxgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIG9uIEFuZHJvaWQgXFwke3Byb2Nlc3MuYXJjaH1cXGApKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgIGlmICgocHJvY2Vzcy5jb25maWcgJiYgcHJvY2Vzcy5jb25maWcudmFyaWFibGVzICYmIHByb2Nlc3MuY29uZmlnLnZhcmlhYmxlcy5zaGxpYl9zdWZmaXggPT09ICdkbGwuYScpIHx8IChwcm9jZXNzLmNvbmZpZyAmJiBwcm9jZXNzLmNvbmZpZy52YXJpYWJsZXMgJiYgcHJvY2Vzcy5jb25maWcudmFyaWFibGVzLm5vZGVfdGFyZ2V0X3R5cGUgPT09ICdzaGFyZWRfbGlicmFyeScpKSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCd3aW4zMi14NjQtZ251Jyl9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnd2luMzIteDY0LW1zdmMnKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2lhMzInKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnd2luMzItaWEzMi1tc3ZjJyl9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmFyY2ggPT09ICdhcm02NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCd3aW4zMi1hcm02NC1tc3ZjJyl9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRFcnJvcnMucHVzaChuZXcgRXJyb3IoXFxgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIG9uIFdpbmRvd3M6IFxcJHtwcm9jZXNzLmFyY2h9XFxgKSlcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICAke3JlcXVpcmVUdXBsZSgnZGFyd2luLXVuaXZlcnNhbCcsIDYpfVxuICAgIGlmIChwcm9jZXNzLmFyY2ggPT09ICd4NjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnZGFyd2luLXg2NCcpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnZGFyd2luLWFybTY0Jyl9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRFcnJvcnMucHVzaChuZXcgRXJyb3IoXFxgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIG9uIG1hY09TOiBcXCR7cHJvY2Vzcy5hcmNofVxcYCkpXG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdmcmVlYnNkJykge1xuICAgIGlmIChwcm9jZXNzLmFyY2ggPT09ICd4NjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnZnJlZWJzZC14NjQnKX1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybTY0Jykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ2ZyZWVic2QtYXJtNjQnKX1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgb24gRnJlZUJTRDogXFwke3Byb2Nlc3MuYXJjaH1cXGApKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgIGlmIChpc011c2woKSkge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgteDY0LW11c2wnLCAxMCl9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgteDY0LWdudScsIDEwKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybTY0Jykge1xuICAgICAgaWYgKGlzTXVzbCgpKSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1hcm02NC1tdXNsJywgMTApfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LWFybTY0LWdudScsIDEwKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybScpIHtcbiAgICAgIGlmIChpc011c2woKSkge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtYXJtLW11c2xlYWJpaGYnLCAxMCl9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtYXJtLWdudWVhYmloZicsIDEwKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2xvb25nNjQnKSB7XG4gICAgICBpZiAoaXNNdXNsKCkpIHtcbiAgICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LWxvb25nNjQtbXVzbCcsIDEwKX1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1sb29uZzY0LWdudScsIDEwKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3Jpc2N2NjQnKSB7XG4gICAgICBpZiAoaXNNdXNsKCkpIHtcbiAgICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LXJpc2N2NjQtbXVzbCcsIDEwKX1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1yaXNjdjY0LWdudScsIDEwKX1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3BwYzY0Jykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LXBwYzY0LWdudScpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnczM5MHgnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtczM5MHgtZ251Jyl9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRFcnJvcnMucHVzaChuZXcgRXJyb3IoXFxgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIG9uIExpbnV4OiBcXCR7cHJvY2Vzcy5hcmNofVxcYCkpXG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdvcGVuaGFybW9ueScpIHtcbiAgICBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnb3Blbmhhcm1vbnktYXJtNjQnKX1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdvcGVuaGFybW9ueS14NjQnKX1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybScpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdvcGVuaGFybW9ueS1hcm0nKX1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgb24gT3Blbkhhcm1vbnk6IFxcJHtwcm9jZXNzLmFyY2h9XFxgKSlcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBPUzogXFwke3Byb2Nlc3MucGxhdGZvcm19LCBhcmNoaXRlY3R1cmU6IFxcJHtwcm9jZXNzLmFyY2h9XFxgKSlcbiAgfVxufVxuXG5uYXRpdmVCaW5kaW5nID0gcmVxdWlyZU5hdGl2ZSgpXG5cbi8vIE5BUElfUlNfRk9SQ0VfV0FTSSBpcyBhIHRyaS1zdGF0ZSBmbGFnOlxuLy8gICB1bnNldCAvIGFueSBvdGhlciB2YWx1ZSDihpIgbmF0aXZlIGJpbmRpbmcgcHJlZmVycmVkLCBXQVNJIGlzIG9ubHkgYSBmYWxsYmFja1xuLy8gICAndHJ1ZScgICAgICAgICAgICAgICAgICAg4oaSIGZvcmNlIFdBU0kgZmFsbGJhY2sgZXZlbiBpZiBuYXRpdmUgbG9hZGVkXG4vLyAgICdlcnJvcicgICAgICAgICAgICAgICAgICDihpIgZm9yY2UgV0FTSSBhbmQgdGhyb3cgaWYgbm8gV0FTSSBiaW5kaW5nIGlzIGZvdW5kXG4vLyBUcmVhdGluZyBhbnkgbm9uLWVtcHR5IHN0cmluZyBhcyB0cnV0aHkgKHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yKSBtZWFudFxuLy8gTkFQSV9SU19GT1JDRV9XQVNJPWZhbHNlLCBOQVBJX1JTX0ZPUkNFX1dBU0k9MCwgZXRjLiBpbmFkdmVydGVudGx5IHRyaWdnZXJlZFxuLy8gdGhlIFdBU0kgcGF0aCwgY2F1c2luZyBFTk9FTlQgZm9yIHBhY2thZ2VzIHNoaXBwZWQgd2l0aG91dCBhIC53YXNpLmNqcyBmaWxlLlxuY29uc3QgZm9yY2VXYXNpID1cbiAgcHJvY2Vzcy5lbnYuTkFQSV9SU19GT1JDRV9XQVNJID09PSAndHJ1ZScgfHwgcHJvY2Vzcy5lbnYuTkFQSV9SU19GT1JDRV9XQVNJID09PSAnZXJyb3InXG5cbmlmICghbmF0aXZlQmluZGluZyB8fCBmb3JjZVdhc2kpIHtcbiAgbGV0IHdhc2lCaW5kaW5nID0gbnVsbFxuICBsZXQgd2FzaUJpbmRpbmdFcnJvciA9IG51bGxcbiAgdHJ5IHtcbiAgICB3YXNpQmluZGluZyA9IHJlcXVpcmUoJy4vJHtsb2NhbE5hbWV9Lndhc2kuY2pzJylcbiAgICBuYXRpdmVCaW5kaW5nID0gd2FzaUJpbmRpbmdcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGZvcmNlV2FzaSkge1xuICAgICAgd2FzaUJpbmRpbmdFcnJvciA9IGVyclxuICAgIH1cbiAgfVxuICBpZiAoIW5hdGl2ZUJpbmRpbmcgfHwgZm9yY2VXYXNpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHdhc2lCaW5kaW5nID0gcmVxdWlyZSgnJHtwa2dOYW1lfS13YXNtMzItd2FzaScpXG4gICAgICBuYXRpdmVCaW5kaW5nID0gd2FzaUJpbmRpbmdcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChmb3JjZVdhc2kpIHtcbiAgICAgICAgaWYgKCF3YXNpQmluZGluZ0Vycm9yKSB7XG4gICAgICAgICAgd2FzaUJpbmRpbmdFcnJvciA9IGVyclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhc2lCaW5kaW5nRXJyb3IuY2F1c2UgPSBlcnJcbiAgICAgICAgfVxuICAgICAgICBsb2FkRXJyb3JzLnB1c2goZXJyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTkFQSV9SU19GT1JDRV9XQVNJID09PSAnZXJyb3InICYmICF3YXNpQmluZGluZykge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdXQVNJIGJpbmRpbmcgbm90IGZvdW5kIGFuZCBOQVBJX1JTX0ZPUkNFX1dBU0kgaXMgc2V0IHRvIGVycm9yJylcbiAgICBlcnJvci5jYXVzZSA9IHdhc2lCaW5kaW5nRXJyb3JcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbmlmICghbmF0aXZlQmluZGluZykge1xuICBpZiAobG9hZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICBcXGBDYW5ub3QgZmluZCBuYXRpdmUgYmluZGluZy4gXFxgICtcbiAgICAgICAgXFxgbnBtIGhhcyBhIGJ1ZyByZWxhdGVkIHRvIG9wdGlvbmFsIGRlcGVuZGVuY2llcyAoaHR0cHM6Ly9naXRodWIuY29tL25wbS9jbGkvaXNzdWVzLzQ4MjgpLiBcXGAgK1xuICAgICAgICAnUGxlYXNlIHRyeSBcXGBucG0gaVxcYCBhZ2FpbiBhZnRlciByZW1vdmluZyBib3RoIHBhY2thZ2UtbG9jay5qc29uIGFuZCBub2RlX21vZHVsZXMgZGlyZWN0b3J5LicsXG4gICAgKVxuICAgIC8vIGFzc2lnbiBpbnN0ZWFkIG9mIHRoZSBcXGBuZXcgRXJyb3IobWVzc2FnZSwgeyBjYXVzZSB9KVxcYCBvcHRpb25zIGZvcm0sXG4gICAgLy8gd2hpY2ggTm9kZSA8IDE2Ljkgc2lsZW50bHkgaWdub3Jlc1xuICAgIGVycm9yLmNhdXNlID0gbG9hZEVycm9ycy5yZWR1Y2UoKGVyciwgY3VyKSA9PiB7XG4gICAgICBjdXIuY2F1c2UgPSBlcnJcbiAgICAgIHJldHVybiBjdXJcbiAgICB9KVxuICAgIHRocm93IGVycm9yXG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxcYEZhaWxlZCB0byBsb2FkIG5hdGl2ZSBiaW5kaW5nXFxgKVxufVxuYFxufVxuIiwiZXhwb3J0IGNvbnN0IGNyZWF0ZVdhc2lCcm93c2VyQmluZGluZyA9IChcbiAgd2FzaUZpbGVuYW1lOiBzdHJpbmcsXG4gIGluaXRpYWxNZW1vcnkgPSA0MDAwLFxuICBtYXhpbXVtTWVtb3J5ID0gNjU1MzYsXG4gIGZzID0gZmFsc2UsXG4gIGFzeW5jSW5pdCA9IGZhbHNlLFxuICBidWZmZXIgPSBmYWxzZSxcbiAgZXJyb3JFdmVudCA9IGZhbHNlLFxuKSA9PiB7XG4gIGNvbnN0IGZzSW1wb3J0ID0gZnNcbiAgICA/IGJ1ZmZlclxuICAgICAgPyBgaW1wb3J0IHsgbWVtZnMsIEJ1ZmZlciB9IGZyb20gJ0BuYXBpLXJzL3dhc20tcnVudGltZS9mcydgXG4gICAgICA6IGBpbXBvcnQgeyBtZW1mcyB9IGZyb20gJ0BuYXBpLXJzL3dhc20tcnVudGltZS9mcydgXG4gICAgOiAnJ1xuICBjb25zdCBidWZmZXJJbXBvcnQgPSBidWZmZXIgJiYgIWZzID8gYGltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcidgIDogJydcbiAgY29uc3Qgd2FzaUNyZWF0aW9uID0gZnNcbiAgICA/IGBcbmV4cG9ydCBjb25zdCB7IGZzOiBfX2ZzLCB2b2w6IF9fdm9sdW1lIH0gPSBtZW1mcygpXG5cbmNvbnN0IF9fd2FzaSA9IG5ldyBfX1dBU0koe1xuICB2ZXJzaW9uOiAncHJldmlldzEnLFxuICBmczogX19mcyxcbiAgcHJlb3BlbnM6IHtcbiAgICAnLyc6ICcvJyxcbiAgfSxcbn0pYFxuICAgIDogYFxuY29uc3QgX193YXNpID0gbmV3IF9fV0FTSSh7XG4gIHZlcnNpb246ICdwcmV2aWV3MScsXG59KWBcblxuICBjb25zdCB3b3JrZXJGc0hhbmRsZXIgPSBmc1xuICAgID8gYCAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIF9fd2FzbUNyZWF0ZU9uTWVzc2FnZUZvckZzUHJveHkoX19mcykpXFxuYFxuICAgIDogJydcblxuICBjb25zdCB3b3JrZXJFcnJvckhhbmRsZXIgPSBlcnJvckV2ZW50XG4gICAgPyBgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQuZGF0YSAmJiB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gJ29iamVjdCcgJiYgZXZlbnQuZGF0YS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbmFwaS1ycy13b3JrZXItZXJyb3InLCB7IGRldGFpbDogZXZlbnQuZGF0YSB9KSlcbiAgICAgIH1cbiAgICB9KVxuYFxuICAgIDogJydcblxuICBjb25zdCBlbW5hcGlJbmplY3RCdWZmZXIgPSBidWZmZXJcbiAgICA/ICdfX2VtbmFwaUNvbnRleHQuZmVhdHVyZS5CdWZmZXIgPSBCdWZmZXInXG4gICAgOiAnJ1xuICBjb25zdCBlbW5hcGlJbnN0YW50aWF0ZUltcG9ydCA9IGFzeW5jSW5pdFxuICAgID8gYGluc3RhbnRpYXRlTmFwaU1vZHVsZSBhcyBfX2VtbmFwaUluc3RhbnRpYXRlTmFwaU1vZHVsZWBcbiAgICA6IGBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jIGFzIF9fZW1uYXBpSW5zdGFudGlhdGVOYXBpTW9kdWxlU3luY2BcbiAgY29uc3QgZW1uYXBpSW5zdGFudGlhdGVDYWxsID0gYXN5bmNJbml0XG4gICAgPyBgYXdhaXQgX19lbW5hcGlJbnN0YW50aWF0ZU5hcGlNb2R1bGVgXG4gICAgOiBgX19lbW5hcGlJbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jYFxuXG4gIHJldHVybiBgaW1wb3J0IHtcbiAgY3JlYXRlT25NZXNzYWdlIGFzIF9fd2FzbUNyZWF0ZU9uTWVzc2FnZUZvckZzUHJveHksXG4gIGdldERlZmF1bHRDb250ZXh0IGFzIF9fZW1uYXBpR2V0RGVmYXVsdENvbnRleHQsXG4gICR7ZW1uYXBpSW5zdGFudGlhdGVJbXBvcnR9LFxuICBXQVNJIGFzIF9fV0FTSSxcbn0gZnJvbSAnQG5hcGktcnMvd2FzbS1ydW50aW1lJ1xuJHtmc0ltcG9ydH1cbiR7YnVmZmVySW1wb3J0fVxuJHt3YXNpQ3JlYXRpb259XG5cbmNvbnN0IF9fd2FzbVVybCA9IG5ldyBVUkwoJy4vJHt3YXNpRmlsZW5hbWV9Lndhc20nLCBpbXBvcnQubWV0YS51cmwpLmhyZWZcbmNvbnN0IF9fZW1uYXBpQ29udGV4dCA9IF9fZW1uYXBpR2V0RGVmYXVsdENvbnRleHQoKVxuJHtlbW5hcGlJbmplY3RCdWZmZXJ9XG5cbmNvbnN0IF9fc2hhcmVkTWVtb3J5ID0gbmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7XG4gIGluaXRpYWw6ICR7aW5pdGlhbE1lbW9yeX0sXG4gIG1heGltdW06ICR7bWF4aW11bU1lbW9yeX0sXG4gIHNoYXJlZDogdHJ1ZSxcbn0pXG5cbmNvbnN0IF9fd2FzbUZpbGUgPSBhd2FpdCBmZXRjaChfX3dhc21VcmwpLnRoZW4oKHJlcykgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG5cbmNvbnN0IHtcbiAgaW5zdGFuY2U6IF9fbmFwaUluc3RhbmNlLFxuICBtb2R1bGU6IF9fd2FzaU1vZHVsZSxcbiAgbmFwaU1vZHVsZTogX19uYXBpTW9kdWxlLFxufSA9ICR7ZW1uYXBpSW5zdGFudGlhdGVDYWxsfShfX3dhc21GaWxlLCB7XG4gIGNvbnRleHQ6IF9fZW1uYXBpQ29udGV4dCxcbiAgYXN5bmNXb3JrUG9vbFNpemU6IDQsXG4gIHdhc2k6IF9fd2FzaSxcbiAgb25DcmVhdGVXb3JrZXIoKSB7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3dhc2ktd29ya2VyLWJyb3dzZXIubWpzJywgaW1wb3J0Lm1ldGEudXJsKSwge1xuICAgICAgdHlwZTogJ21vZHVsZScsXG4gICAgfSlcbiR7d29ya2VyRnNIYW5kbGVyfVxuJHt3b3JrZXJFcnJvckhhbmRsZXJ9XG4gICAgcmV0dXJuIHdvcmtlclxuICB9LFxuICBvdmVyd3JpdGVJbXBvcnRzKGltcG9ydE9iamVjdCkge1xuICAgIGltcG9ydE9iamVjdC5lbnYgPSB7XG4gICAgICAuLi5pbXBvcnRPYmplY3QuZW52LFxuICAgICAgLi4uaW1wb3J0T2JqZWN0Lm5hcGksXG4gICAgICAuLi5pbXBvcnRPYmplY3QuZW1uYXBpLFxuICAgICAgbWVtb3J5OiBfX3NoYXJlZE1lbW9yeSxcbiAgICB9XG4gICAgcmV0dXJuIGltcG9ydE9iamVjdFxuICB9LFxuICBiZWZvcmVJbml0KHsgaW5zdGFuY2UgfSkge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhpbnN0YW5jZS5leHBvcnRzKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnX19uYXBpX3JlZ2lzdGVyX18nKSkge1xuICAgICAgICBpbnN0YW5jZS5leHBvcnRzW25hbWVdKClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KVxuYFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlV2FzaUJpbmRpbmcgPSAoXG4gIHdhc21GaWxlTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBpbml0aWFsTWVtb3J5ID0gNDAwMCxcbiAgbWF4aW11bU1lbW9yeSA9IDY1NTM2LFxuKSA9PiBgLyogZXNsaW50LWRpc2FibGUgKi9cbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xuXG4vKiBhdXRvLWdlbmVyYXRlZCBieSBOQVBJLVJTICovXG5cbmNvbnN0IF9fbm9kZUZzID0gcmVxdWlyZSgnbm9kZTpmcycpXG5jb25zdCBfX25vZGVQYXRoID0gcmVxdWlyZSgnbm9kZTpwYXRoJylcbmNvbnN0IHsgV0FTSTogX19ub2RlV0FTSSB9ID0gcmVxdWlyZSgnbm9kZTp3YXNpJylcbmNvbnN0IHsgV29ya2VyIH0gPSByZXF1aXJlKCdub2RlOndvcmtlcl90aHJlYWRzJylcblxuY29uc3Qge1xuICBjcmVhdGVPbk1lc3NhZ2U6IF9fd2FzbUNyZWF0ZU9uTWVzc2FnZUZvckZzUHJveHksXG4gIGdldERlZmF1bHRDb250ZXh0OiBfX2VtbmFwaUdldERlZmF1bHRDb250ZXh0LFxuICBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jOiBfX2VtbmFwaUluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMsXG59ID0gcmVxdWlyZSgnQG5hcGktcnMvd2FzbS1ydW50aW1lJylcblxuY29uc3QgX19yb290RGlyID0gX19ub2RlUGF0aC5wYXJzZShwcm9jZXNzLmN3ZCgpKS5yb290XG5cbmNvbnN0IF9fd2FzaSA9IG5ldyBfX25vZGVXQVNJKHtcbiAgdmVyc2lvbjogJ3ByZXZpZXcxJyxcbiAgZW52OiBwcm9jZXNzLmVudixcbiAgcHJlb3BlbnM6IHtcbiAgICBbX19yb290RGlyXTogX19yb290RGlyLFxuICB9XG59KVxuXG5jb25zdCBfX2VtbmFwaUNvbnRleHQgPSBfX2VtbmFwaUdldERlZmF1bHRDb250ZXh0KClcblxuY29uc3QgX19zaGFyZWRNZW1vcnkgPSBuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtcbiAgaW5pdGlhbDogJHtpbml0aWFsTWVtb3J5fSxcbiAgbWF4aW11bTogJHttYXhpbXVtTWVtb3J5fSxcbiAgc2hhcmVkOiB0cnVlLFxufSlcblxubGV0IF9fd2FzbUZpbGVQYXRoID0gX19ub2RlUGF0aC5qb2luKF9fZGlybmFtZSwgJyR7d2FzbUZpbGVOYW1lfS53YXNtJylcbmNvbnN0IF9fd2FzbURlYnVnRmlsZVBhdGggPSBfX25vZGVQYXRoLmpvaW4oX19kaXJuYW1lLCAnJHt3YXNtRmlsZU5hbWV9LmRlYnVnLndhc20nKVxuXG5pZiAoX19ub2RlRnMuZXhpc3RzU3luYyhfX3dhc21EZWJ1Z0ZpbGVQYXRoKSkge1xuICBfX3dhc21GaWxlUGF0aCA9IF9fd2FzbURlYnVnRmlsZVBhdGhcbn0gZWxzZSBpZiAoIV9fbm9kZUZzLmV4aXN0c1N5bmMoX193YXNtRmlsZVBhdGgpKSB7XG4gIHRyeSB7XG4gICAgX193YXNtRmlsZVBhdGggPSByZXF1aXJlLnJlc29sdmUoJyR7cGFja2FnZU5hbWV9LXdhc20zMi13YXNpLyR7d2FzbUZpbGVOYW1lfS53YXNtJylcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCAke3dhc21GaWxlTmFtZX0ud2FzbSBmaWxlLCBhbmQgJHtwYWNrYWdlTmFtZX0td2FzbTMyLXdhc2kgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkLicpXG4gIH1cbn1cblxuY29uc3QgeyBpbnN0YW5jZTogX19uYXBpSW5zdGFuY2UsIG1vZHVsZTogX193YXNpTW9kdWxlLCBuYXBpTW9kdWxlOiBfX25hcGlNb2R1bGUgfSA9IF9fZW1uYXBpSW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYyhfX25vZGVGcy5yZWFkRmlsZVN5bmMoX193YXNtRmlsZVBhdGgpLCB7XG4gIGNvbnRleHQ6IF9fZW1uYXBpQ29udGV4dCxcbiAgYXN5bmNXb3JrUG9vbFNpemU6IChmdW5jdGlvbigpIHtcbiAgICBjb25zdCB0aHJlYWRzU2l6ZUZyb21FbnYgPSBOdW1iZXIocHJvY2Vzcy5lbnYuTkFQSV9SU19BU1lOQ19XT1JLX1BPT0xfU0laRSA/PyBwcm9jZXNzLmVudi5VVl9USFJFQURQT09MX1NJWkUpXG4gICAgLy8gTmFOID4gMCBpcyBmYWxzZVxuICAgIGlmICh0aHJlYWRzU2l6ZUZyb21FbnYgPiAwKSB7XG4gICAgICByZXR1cm4gdGhyZWFkc1NpemVGcm9tRW52XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA0XG4gICAgfVxuICB9KSgpLFxuICByZXVzZVdvcmtlcjogdHJ1ZSxcbiAgd2FzaTogX193YXNpLFxuICBvbkNyZWF0ZVdvcmtlcigpIHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKF9fbm9kZVBhdGguam9pbihfX2Rpcm5hbWUsICd3YXNpLXdvcmtlci5tanMnKSwge1xuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICB9KVxuICAgIHdvcmtlci5vbm1lc3NhZ2UgPSAoeyBkYXRhIH0pID0+IHtcbiAgICAgIF9fd2FzbUNyZWF0ZU9uTWVzc2FnZUZvckZzUHJveHkoX19ub2RlRnMpKGRhdGEpXG4gICAgfVxuXG4gICAgLy8gVGhlIG1haW4gdGhyZWFkIG9mIE5vZGUuanMgd2FpdHMgZm9yIGFsbCB0aGUgYWN0aXZlIGhhbmRsZXMgYmVmb3JlIGV4aXRpbmcuXG4gICAgLy8gQnV0IFJ1c3QgdGhyZWFkcyBhcmUgbmV2ZXIgd2FpdGVkIHdpdGhvdXQgXFxgdGhyZWFkOjpqb2luXFxgLlxuICAgIC8vIFNvIGhlcmUgd2UgaGFjayB0aGUgY29kZSBvZiBOb2RlLmpzIHRvIHByZXZlbnQgdGhlIHdvcmtlcnMgZnJvbSBiZWluZyByZWZlcmVuY2VkIChhY3RpdmUpLlxuICAgIC8vIEFjY29yZGluZyB0byBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi8xOWUwZDQ3MjcyOGM3OWQ0MThiNzRiZGRmZjU4OGJlYTcwYTQwM2QwL2xpYi9pbnRlcm5hbC93b3JrZXIuanMjTDQxNSxcbiAgICAvLyBhIHdvcmtlciBpcyBjb25zaXN0IG9mIHR3byBoYW5kbGVzOiBrUHVibGljUG9ydCBhbmQga0hhbmRsZS5cbiAgICB7XG4gICAgICBjb25zdCBrUHVibGljUG9ydCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMod29ya2VyKS5maW5kKHMgPT5cbiAgICAgICAgcy50b1N0cmluZygpLmluY2x1ZGVzKFwia1B1YmxpY1BvcnRcIilcbiAgICAgICk7XG4gICAgICBpZiAoa1B1YmxpY1BvcnQpIHtcbiAgICAgICAgd29ya2VyW2tQdWJsaWNQb3J0XS5yZWYgPSAoKSA9PiB7fTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga0hhbmRsZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMod29ya2VyKS5maW5kKHMgPT5cbiAgICAgICAgcy50b1N0cmluZygpLmluY2x1ZGVzKFwia0hhbmRsZVwiKVxuICAgICAgKTtcbiAgICAgIGlmIChrSGFuZGxlKSB7XG4gICAgICAgIHdvcmtlcltrSGFuZGxlXS5yZWYgPSAoKSA9PiB7fTtcbiAgICAgIH1cblxuICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgfVxuICAgIHJldHVybiB3b3JrZXJcbiAgfSxcbiAgb3ZlcndyaXRlSW1wb3J0cyhpbXBvcnRPYmplY3QpIHtcbiAgICBpbXBvcnRPYmplY3QuZW52ID0ge1xuICAgICAgLi4uaW1wb3J0T2JqZWN0LmVudixcbiAgICAgIC4uLmltcG9ydE9iamVjdC5uYXBpLFxuICAgICAgLi4uaW1wb3J0T2JqZWN0LmVtbmFwaSxcbiAgICAgIG1lbW9yeTogX19zaGFyZWRNZW1vcnksXG4gICAgfVxuICAgIHJldHVybiBpbXBvcnRPYmplY3RcbiAgfSxcbiAgYmVmb3JlSW5pdCh7IGluc3RhbmNlIH0pIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoaW5zdGFuY2UuZXhwb3J0cykpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ19fbmFwaV9yZWdpc3Rlcl9fJykpIHtcbiAgICAgICAgaW5zdGFuY2UuZXhwb3J0c1tuYW1lXSgpXG4gICAgICB9XG4gICAgfVxuICB9LFxufSlcbmBcbiIsImV4cG9ydCBjb25zdCBXQVNJX1dPUktFUl9URU1QTEFURSA9IGBpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgV0FTSSB9IGZyb20gXCJub2RlOndhc2lcIjtcbmltcG9ydCB7IHBhcmVudFBvcnQsIFdvcmtlciB9IGZyb20gXCJub2RlOndvcmtlcl90aHJlYWRzXCI7XG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmNvbnN0IHsgaW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYywgTWVzc2FnZUhhbmRsZXIsIGdldERlZmF1bHRDb250ZXh0IH0gPSByZXF1aXJlKFwiQG5hcGktcnMvd2FzbS1ydW50aW1lXCIpO1xuXG5pZiAocGFyZW50UG9ydCkge1xuICBwYXJlbnRQb3J0Lm9uKFwibWVzc2FnZVwiLCAoZGF0YSkgPT4ge1xuICAgIGdsb2JhbFRoaXMub25tZXNzYWdlKHsgZGF0YSB9KTtcbiAgfSk7XG59XG5cbk9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICBzZWxmOiBnbG9iYWxUaGlzLFxuICByZXF1aXJlLFxuICBXb3JrZXIsXG4gIGltcG9ydFNjcmlwdHM6IGZ1bmN0aW9uIChmKSB7XG4gICAgOygwLCBldmFsKShmcy5yZWFkRmlsZVN5bmMoZiwgXCJ1dGY4XCIpICsgXCIvLyMgc291cmNlVVJMPVwiICsgZik7XG4gIH0sXG4gIHBvc3RNZXNzYWdlOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgaWYgKHBhcmVudFBvcnQpIHtcbiAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICB9XG4gIH0sXG59KTtcblxuY29uc3QgZW1uYXBpQ29udGV4dCA9IGdldERlZmF1bHRDb250ZXh0KCk7XG5cbmNvbnN0IF9fcm9vdERpciA9IHBhcnNlKHByb2Nlc3MuY3dkKCkpLnJvb3Q7XG5cbmNvbnN0IGhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoe1xuICBvbkxvYWQoeyB3YXNtTW9kdWxlLCB3YXNtTWVtb3J5IH0pIHtcbiAgICBjb25zdCB3YXNpID0gbmV3IFdBU0koe1xuICAgICAgdmVyc2lvbjogJ3ByZXZpZXcxJyxcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICBwcmVvcGVuczoge1xuICAgICAgICBbX19yb290RGlyXTogX19yb290RGlyLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jKHdhc21Nb2R1bGUsIHtcbiAgICAgIGNoaWxkVGhyZWFkOiB0cnVlLFxuICAgICAgd2FzaSxcbiAgICAgIGNvbnRleHQ6IGVtbmFwaUNvbnRleHQsXG4gICAgICBvdmVyd3JpdGVJbXBvcnRzKGltcG9ydE9iamVjdCkge1xuICAgICAgICBpbXBvcnRPYmplY3QuZW52ID0ge1xuICAgICAgICAgIC4uLmltcG9ydE9iamVjdC5lbnYsXG4gICAgICAgICAgLi4uaW1wb3J0T2JqZWN0Lm5hcGksXG4gICAgICAgICAgLi4uaW1wb3J0T2JqZWN0LmVtbmFwaSxcbiAgICAgICAgICBtZW1vcnk6IHdhc21NZW1vcnlcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0sXG59KTtcblxuZ2xvYmFsVGhpcy5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICBoYW5kbGVyLmhhbmRsZShlKTtcbn07XG5gXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVXYXNpQnJvd3NlcldvcmtlckJpbmRpbmcgPSAoXG4gIGZzOiBib29sZWFuLFxuICBlcnJvckV2ZW50OiBib29sZWFuLFxuKSA9PiB7XG4gIGNvbnN0IGZzSW1wb3J0ID0gZnNcbiAgICA/IGBpbXBvcnQgeyBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jLCBNZXNzYWdlSGFuZGxlciwgV0FTSSwgY3JlYXRlRnNQcm94eSB9IGZyb20gJ0BuYXBpLXJzL3dhc20tcnVudGltZSdcbmltcG9ydCB7IG1lbWZzRXhwb3J0ZWQgYXMgX19tZW1mc0V4cG9ydGVkIH0gZnJvbSAnQG5hcGktcnMvd2FzbS1ydW50aW1lL2ZzJ1xuXG5jb25zdCBmcyA9IGNyZWF0ZUZzUHJveHkoX19tZW1mc0V4cG9ydGVkKWBcbiAgICA6IGBpbXBvcnQgeyBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jLCBNZXNzYWdlSGFuZGxlciwgV0FTSSB9IGZyb20gJ0BuYXBpLXJzL3dhc20tcnVudGltZSdgXG4gIGNvbnN0IGVycm9yT3V0cHV0c0FwcGVuZCA9IGVycm9yRXZlbnRcbiAgICA/IGBcXG4gICAgICAgIGVycm9yT3V0cHV0cy5wdXNoKFsuLi5hcmd1bWVudHNdKWBcbiAgICA6ICcnXG4gIGNvbnN0IHdhc2lDcmVhdGlvbiA9IGZzXG4gICAgPyBgY29uc3Qgd2FzaSA9IG5ldyBXQVNJKHtcbiAgICAgIGZzLFxuICAgICAgcHJlb3BlbnM6IHtcbiAgICAgICAgJy8nOiAnLycsXG4gICAgICB9LFxuICAgICAgcHJpbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKVxuICAgICAgfSxcbiAgICAgIHByaW50RXJyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvci5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpXG4gICAgICAgICR7ZXJyb3JPdXRwdXRzQXBwZW5kfVxuICAgICAgfSxcbiAgICB9KWBcbiAgICA6IGBjb25zdCB3YXNpID0gbmV3IFdBU0koe1xuICAgICAgcHJpbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKVxuICAgICAgfSxcbiAgICAgIHByaW50RXJyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvci5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpXG4gICAgICAgICR7ZXJyb3JPdXRwdXRzQXBwZW5kfVxuICAgICAgfSxcbiAgICB9KWBcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gZXJyb3JFdmVudFxuICAgID8gYG9uRXJyb3IoZXJyb3IpIHtcbiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICdlcnJvcicsIGVycm9yLCBlcnJvck91dHB1dHMgfSlcbiAgICBlcnJvck91dHB1dHMubGVuZ3RoID0gMFxuICB9YFxuICAgIDogJydcbiAgY29uc3QgZXJyb3JPdXRwdXRzRGVjbCA9IGVycm9yRXZlbnQgPyBgXFxuY29uc3QgZXJyb3JPdXRwdXRzID0gW11cXG5gIDogJydcbiAgcmV0dXJuIGAke2ZzSW1wb3J0fVxuJHtlcnJvck91dHB1dHNEZWNsfVxuY29uc3QgaGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcih7XG4gIG9uTG9hZCh7IHdhc21Nb2R1bGUsIHdhc21NZW1vcnkgfSkge1xuICAgICR7d2FzaUNyZWF0aW9ufVxuICAgIHJldHVybiBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jKHdhc21Nb2R1bGUsIHtcbiAgICAgIGNoaWxkVGhyZWFkOiB0cnVlLFxuICAgICAgd2FzaSxcbiAgICAgIG92ZXJ3cml0ZUltcG9ydHMoaW1wb3J0T2JqZWN0KSB7XG4gICAgICAgIGltcG9ydE9iamVjdC5lbnYgPSB7XG4gICAgICAgICAgLi4uaW1wb3J0T2JqZWN0LmVudixcbiAgICAgICAgICAuLi5pbXBvcnRPYmplY3QubmFwaSxcbiAgICAgICAgICAuLi5pbXBvcnRPYmplY3QuZW1uYXBpLFxuICAgICAgICAgIG1lbW9yeTogd2FzbU1lbW9yeSxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KVxuICB9LFxuICAke2Vycm9ySGFuZGxlcn1cbn0pXG5cbmdsb2JhbFRoaXMub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgaGFuZGxlci5oYW5kbGUoZSlcbn1cbmBcbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJ1xuaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkaXJTeW5jLCBybVN5bmMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ25vZGU6b3MnXG5pbXBvcnQgeyBwYXJzZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0ICogYXMgY29sb3JzIGZyb20gJ2NvbG9yZXR0ZSdcblxuaW1wb3J0IHR5cGUgeyBCdWlsZE9wdGlvbnMgYXMgUmF3QnVpbGRPcHRpb25zIH0gZnJvbSAnLi4vZGVmL2J1aWxkLmpzJ1xuaW1wb3J0IHtcbiAgQ0xJX1ZFUlNJT04sXG4gIGNvcHlGaWxlQXN5bmMsXG4gIHR5cGUgQ3JhdGUsXG4gIGRlYnVnRmFjdG9yeSxcbiAgREVGQVVMVF9UWVBFX0RFRl9IRUFERVIsXG4gIGZpbGVFeGlzdHMsXG4gIGdldFN5c3RlbURlZmF1bHRUYXJnZXQsXG4gIGdldFRhcmdldExpbmtlcixcbiAgbWtkaXJBc3luYyxcbiAgdHlwZSBOYXBpQ29uZmlnLFxuICBwYXJzZU1ldGFkYXRhLFxuICBwYXJzZVRyaXBsZSxcbiAgcHJvY2Vzc1R5cGVEZWYsXG4gIHJlYWRGaWxlQXN5bmMsXG4gIHJlYWROYXBpQ29uZmlnLFxuICB0eXBlIFRhcmdldCxcbiAgdGFyZ2V0VG9FbnZWYXIsXG4gIHRyeUluc3RhbGxDYXJnb0JpbmFyeSxcbiAgdW5saW5rQXN5bmMsXG4gIHdyaXRlRmlsZUFzeW5jLFxuICBkaXJFeGlzdHNBc3luYyxcbiAgcmVhZGRpckFzeW5jLFxuICB0eXBlIENhcmdvV29ya3NwYWNlTWV0YWRhdGEsXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5pbXBvcnQgeyBjcmVhdGVDanNCaW5kaW5nLCBjcmVhdGVFc21CaW5kaW5nIH0gZnJvbSAnLi90ZW1wbGF0ZXMvaW5kZXguanMnXG5pbXBvcnQge1xuICBjcmVhdGVXYXNpQmluZGluZyxcbiAgY3JlYXRlV2FzaUJyb3dzZXJCaW5kaW5nLFxufSBmcm9tICcuL3RlbXBsYXRlcy9sb2FkLXdhc2ktdGVtcGxhdGUuanMnXG5pbXBvcnQge1xuICBjcmVhdGVXYXNpQnJvd3NlcldvcmtlckJpbmRpbmcsXG4gIFdBU0lfV09SS0VSX1RFTVBMQVRFLFxufSBmcm9tICcuL3RlbXBsYXRlcy93YXNpLXdvcmtlci10ZW1wbGF0ZS5qcydcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ2J1aWxkJylcbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcblxudHlwZSBPdXRwdXRLaW5kID0gJ2pzJyB8ICdkdHMnIHwgJ25vZGUnIHwgJ2V4ZScgfCAnd2FzbSdcbnR5cGUgT3V0cHV0ID0geyBraW5kOiBPdXRwdXRLaW5kOyBwYXRoOiBzdHJpbmcgfVxuXG50eXBlIEJ1aWxkT3B0aW9ucyA9IFJhd0J1aWxkT3B0aW9ucyAmIHsgY2FyZ29PcHRpb25zPzogc3RyaW5nW10gfVxudHlwZSBQYXJzZWRCdWlsZE9wdGlvbnMgPSBPbWl0PEJ1aWxkT3B0aW9ucywgJ2N3ZCc+ICYgeyBjd2Q6IHN0cmluZyB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFByb2plY3QocmF3T3B0aW9uczogQnVpbGRPcHRpb25zKSB7XG4gIGRlYnVnKCduYXBpIGJ1aWxkIGNvbW1hbmQgcmVjZWl2ZSBvcHRpb25zOiAlTycsIHJhd09wdGlvbnMpXG5cbiAgY29uc3Qgb3B0aW9uczogUGFyc2VkQnVpbGRPcHRpb25zID0ge1xuICAgIGR0c0NhY2hlOiB0cnVlLFxuICAgIC4uLnJhd09wdGlvbnMsXG4gICAgY3dkOiByYXdPcHRpb25zLmN3ZCA/PyBwcm9jZXNzLmN3ZCgpLFxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZVBhdGggPSAoLi4ucGF0aHM6IHN0cmluZ1tdKSA9PiByZXNvbHZlKG9wdGlvbnMuY3dkLCAuLi5wYXRocylcblxuICBjb25zdCBtYW5pZmVzdFBhdGggPSByZXNvbHZlUGF0aChvcHRpb25zLm1hbmlmZXN0UGF0aCA/PyAnQ2FyZ28udG9tbCcpXG4gIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgcGFyc2VNZXRhZGF0YShtYW5pZmVzdFBhdGgpXG5cbiAgY29uc3QgY3JhdGUgPSBtZXRhZGF0YS5wYWNrYWdlcy5maW5kKChwKSA9PiB7XG4gICAgLy8gcGFja2FnZSB3aXRoIGdpdmVuIG5hbWVcbiAgICBpZiAob3B0aW9ucy5wYWNrYWdlKSB7XG4gICAgICByZXR1cm4gcC5uYW1lID09PSBvcHRpb25zLnBhY2thZ2VcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHAubWFuaWZlc3RfcGF0aCA9PT0gbWFuaWZlc3RQYXRoXG4gICAgfVxuICB9KVxuXG4gIGlmICghY3JhdGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgY3JhdGUgdG8gYnVpbGQuIEl0IHNlZW1zIHlvdSBhcmUgdHJ5aW5nIHRvIGJ1aWxkIGEgY3JhdGUgaW4gYSB3b3Jrc3BhY2UsIHRyeSB1c2luZyBgLS1wYWNrYWdlYCBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcGFja2FnZSB0byBidWlsZC4nLFxuICAgIClcbiAgfVxuICBjb25zdCBjb25maWcgPSBhd2FpdCByZWFkTmFwaUNvbmZpZyhcbiAgICByZXNvbHZlUGF0aChvcHRpb25zLnBhY2thZ2VKc29uUGF0aCA/PyAncGFja2FnZS5qc29uJyksXG4gICAgb3B0aW9ucy5jb25maWdQYXRoID8gcmVzb2x2ZVBhdGgob3B0aW9ucy5jb25maWdQYXRoKSA6IHVuZGVmaW5lZCxcbiAgKVxuXG4gIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQnVpbGRlcihtZXRhZGF0YSwgY3JhdGUsIGNvbmZpZywgb3B0aW9ucylcblxuICByZXR1cm4gYnVpbGRlci5idWlsZCgpXG59XG5cbmNsYXNzIEJ1aWxkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3M6IHN0cmluZ1tdID0gW11cbiAgcHJpdmF0ZSByZWFkb25seSBlbnZzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgcHJpdmF0ZSByZWFkb25seSBvdXRwdXRzOiBPdXRwdXRbXSA9IFtdXG5cbiAgcHJpdmF0ZSByZWFkb25seSB0YXJnZXQ6IFRhcmdldFxuICBwcml2YXRlIHJlYWRvbmx5IGNyYXRlRGlyOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBvdXRwdXREaXI6IHN0cmluZ1xuICBwcml2YXRlIHJlYWRvbmx5IHRhcmdldERpcjogc3RyaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgZW5hYmxlVHlwZURlZjogYm9vbGVhbiA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YTogQ2FyZ29Xb3Jrc3BhY2VNZXRhZGF0YSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNyYXRlOiBDcmF0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTmFwaUNvbmZpZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFBhcnNlZEJ1aWxkT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy50YXJnZXQgPSBvcHRpb25zLnRhcmdldFxuICAgICAgPyBwYXJzZVRyaXBsZShvcHRpb25zLnRhcmdldClcbiAgICAgIDogcHJvY2Vzcy5lbnYuQ0FSR09fQlVJTERfVEFSR0VUXG4gICAgICAgID8gcGFyc2VUcmlwbGUocHJvY2Vzcy5lbnYuQ0FSR09fQlVJTERfVEFSR0VUKVxuICAgICAgICA6IGdldFN5c3RlbURlZmF1bHRUYXJnZXQoKVxuICAgIHRoaXMuY3JhdGVEaXIgPSBwYXJzZShjcmF0ZS5tYW5pZmVzdF9wYXRoKS5kaXJcbiAgICB0aGlzLm91dHB1dERpciA9IHJlc29sdmUoXG4gICAgICB0aGlzLm9wdGlvbnMuY3dkLFxuICAgICAgb3B0aW9ucy5vdXRwdXREaXIgPz8gdGhpcy5jcmF0ZURpcixcbiAgICApXG4gICAgdGhpcy50YXJnZXREaXIgPVxuICAgICAgb3B0aW9ucy50YXJnZXREaXIgPz9cbiAgICAgIHByb2Nlc3MuZW52LkNBUkdPX0JVSUxEX1RBUkdFVF9ESVIgPz9cbiAgICAgIG1ldGFkYXRhLnRhcmdldF9kaXJlY3RvcnlcbiAgICB0aGlzLmVuYWJsZVR5cGVEZWYgPSB0aGlzLmNyYXRlLmRlcGVuZGVuY2llcy5zb21lKFxuICAgICAgKGRlcCkgPT5cbiAgICAgICAgZGVwLm5hbWUgPT09ICduYXBpLWRlcml2ZScgJiZcbiAgICAgICAgKGRlcC51c2VzX2RlZmF1bHRfZmVhdHVyZXMgfHwgZGVwLmZlYXR1cmVzLmluY2x1ZGVzKCd0eXBlLWRlZicpKSxcbiAgICApXG5cbiAgICBpZiAoIXRoaXMuZW5hYmxlVHlwZURlZikge1xuICAgICAgY29uc3QgcmVxdWlyZW1lbnRXYXJuaW5nID1cbiAgICAgICAgJ2BuYXBpLWRlcml2ZWAgY3JhdGUgaXMgbm90IHVzZWQgb3IgYHR5cGUtZGVmYCBmZWF0dXJlIGlzIG5vdCBlbmFibGVkIGZvciBgbmFwaS1kZXJpdmVgIGNyYXRlJ1xuICAgICAgZGVidWcud2FybihcbiAgICAgICAgYCR7cmVxdWlyZW1lbnRXYXJuaW5nfS4gV2lsbCBza2lwIGJpbmRpbmcgZ2VuZXJhdGlvbiBmb3IgXFxgLm5vZGVcXGAsIFxcYC53YXNpXFxgIGFuZCBcXGAuZC50c1xcYCBmaWxlcy5gLFxuICAgICAgKVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMub3B0aW9ucy5kdHMgfHxcbiAgICAgICAgdGhpcy5vcHRpb25zLmR0c0hlYWRlciB8fFxuICAgICAgICB0aGlzLmNvbmZpZy5kdHNIZWFkZXIgfHxcbiAgICAgICAgdGhpcy5jb25maWcuZHRzSGVhZGVyRmlsZVxuICAgICAgKSB7XG4gICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgYCR7cmVxdWlyZW1lbnRXYXJuaW5nfS4gXFxgZHRzXFxgIHJlbGF0ZWQgb3B0aW9ucyBhcmUgZW5hYmxlZCBidXQgd2lsbCBiZSBpZ25vcmVkLmAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY2R5TGliTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jcmF0ZS50YXJnZXRzLmZpbmQoKHQpID0+IHQuY3JhdGVfdHlwZXMuaW5jbHVkZXMoJ2NkeWxpYicpKVxuICAgICAgPy5uYW1lXG4gIH1cblxuICBnZXQgYmluTmFtZSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5vcHRpb25zLmJpbiA/P1xuICAgICAgLy8gb25seSBhdmFpbGFibGUgaWYgbm90IGNkeWxpYiBvciBiaW4gbmFtZSBzcGVjaWZpZWRcbiAgICAgICh0aGlzLmNkeUxpYk5hbWVcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogdGhpcy5jcmF0ZS50YXJnZXRzLmZpbmQoKHQpID0+IHQuY3JhdGVfdHlwZXMuaW5jbHVkZXMoJ2JpbicpKT8ubmFtZSlcbiAgICApXG4gIH1cblxuICBidWlsZCgpIHtcbiAgICBpZiAoIXRoaXMuY2R5TGliTmFtZSkge1xuICAgICAgY29uc3Qgd2FybmluZyA9XG4gICAgICAgICdNaXNzaW5nIGBjcmF0ZS10eXBlID0gW1wiY2R5bGliXCJdYCBpbiBbbGliXSBjb25maWcuIFRoZSBidWlsZCByZXN1bHQgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGFzIG5vZGUgYWRkb24uJ1xuXG4gICAgICBpZiAodGhpcy5iaW5OYW1lKSB7XG4gICAgICAgIGRlYnVnLndhcm4od2FybmluZylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih3YXJuaW5nKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBpY2tCaW5hcnkoKVxuICAgICAgLnNldFBhY2thZ2UoKVxuICAgICAgLnNldEZlYXR1cmVzKClcbiAgICAgIC5zZXRUYXJnZXQoKVxuICAgICAgLnBpY2tDcm9zc1Rvb2xjaGFpbigpXG4gICAgICAuc2V0RW52cygpXG4gICAgICAuc2V0QnlwYXNzQXJncygpXG4gICAgICAuZXhlYygpXG4gIH1cblxuICBwcml2YXRlIHBpY2tDcm9zc1Rvb2xjaGFpbigpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy51c2VOYXBpQ3Jvc3MpIHtcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMudXNlQ3Jvc3MpIHtcbiAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICdZb3UgYXJlIHRyeWluZyB0byB1c2UgYm90aCBgLS1jcm9zc2AgYW5kIGAtLXVzZS1uYXBpLWNyb3NzYCBvcHRpb25zLCBgLS11c2UtY3Jvc3NgIHdpbGwgYmUgaWdub3JlZC4nLFxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3Jvc3NDb21waWxlKSB7XG4gICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAnWW91IGFyZSB0cnlpbmcgdG8gdXNlIGJvdGggYC0tY3Jvc3MtY29tcGlsZWAgYW5kIGAtLXVzZS1uYXBpLWNyb3NzYCBvcHRpb25zLCBgLS1jcm9zcy1jb21waWxlYCB3aWxsIGJlIGlnbm9yZWQuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB2ZXJzaW9uLCBkb3dubG9hZCB9ID0gcmVxdWlyZSgnQG5hcGktcnMvY3Jvc3MtdG9vbGNoYWluJylcblxuICAgICAgY29uc3QgYWxpYXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdzMzkweC11bmtub3duLWxpbnV4LWdudSc6ICdzMzkweC1pYm0tbGludXgtZ251JyxcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9vbGNoYWluUGF0aCA9IGpvaW4oXG4gICAgICAgIGhvbWVkaXIoKSxcbiAgICAgICAgJy5uYXBpLXJzJyxcbiAgICAgICAgJ2Nyb3NzLXRvb2xjaGFpbicsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHRoaXMudGFyZ2V0LnRyaXBsZSxcbiAgICAgIClcbiAgICAgIG1rZGlyU3luYyh0b29sY2hhaW5QYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgaWYgKGV4aXN0c1N5bmMoam9pbih0b29sY2hhaW5QYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgIGRlYnVnKGBUb29sY2hhaW4gJHt0b29sY2hhaW5QYXRofSBleGlzdHMsIHNraXAgZXh0cmFjdGluZ2ApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0YXJBcmNoaXZlID0gZG93bmxvYWQocHJvY2Vzcy5hcmNoLCB0aGlzLnRhcmdldC50cmlwbGUpXG4gICAgICAgIHRhckFyY2hpdmUudW5wYWNrKHRvb2xjaGFpblBhdGgpXG4gICAgICB9XG4gICAgICBjb25zdCB1cHBlckNhc2VUYXJnZXQgPSB0YXJnZXRUb0VudlZhcih0aGlzLnRhcmdldC50cmlwbGUpXG4gICAgICBjb25zdCBjcm9zc1RhcmdldE5hbWUgPSBhbGlhc1t0aGlzLnRhcmdldC50cmlwbGVdID8/IHRoaXMudGFyZ2V0LnRyaXBsZVxuICAgICAgY29uc3QgbGlua2VyRW52ID0gYENBUkdPX1RBUkdFVF8ke3VwcGVyQ2FzZVRhcmdldH1fTElOS0VSYFxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgbGlua2VyRW52LFxuICAgICAgICBqb2luKHRvb2xjaGFpblBhdGgsICdiaW4nLCBgJHtjcm9zc1RhcmdldE5hbWV9LWdjY2ApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9TWVNST09UJyxcbiAgICAgICAgam9pbih0b29sY2hhaW5QYXRoLCBjcm9zc1RhcmdldE5hbWUsICdzeXNyb290JyksXG4gICAgICApXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKFxuICAgICAgICAnVEFSR0VUX0FSJyxcbiAgICAgICAgam9pbih0b29sY2hhaW5QYXRoLCAnYmluJywgYCR7Y3Jvc3NUYXJnZXROYW1lfS1hcmApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9SQU5MSUInLFxuICAgICAgICBqb2luKHRvb2xjaGFpblBhdGgsICdiaW4nLCBgJHtjcm9zc1RhcmdldE5hbWV9LXJhbmxpYmApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9SRUFERUxGJyxcbiAgICAgICAgam9pbih0b29sY2hhaW5QYXRoLCAnYmluJywgYCR7Y3Jvc3NUYXJnZXROYW1lfS1yZWFkZWxmYCksXG4gICAgICApXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKFxuICAgICAgICAnVEFSR0VUX0NfSU5DTFVERV9QQVRIJyxcbiAgICAgICAgam9pbih0b29sY2hhaW5QYXRoLCBjcm9zc1RhcmdldE5hbWUsICdzeXNyb290JywgJ3VzcicsICdpbmNsdWRlLycpLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9DQycsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgJ2JpbicsIGAke2Nyb3NzVGFyZ2V0TmFtZX0tZ2NjYCksXG4gICAgICApXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKFxuICAgICAgICAnVEFSR0VUX0NYWCcsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgJ2JpbicsIGAke2Nyb3NzVGFyZ2V0TmFtZX0tZysrYCksXG4gICAgICApXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKFxuICAgICAgICAnQklOREdFTl9FWFRSQV9DTEFOR19BUkdTJyxcbiAgICAgICAgYC0tc3lzcm9vdD0ke3RoaXMuZW52cy5UQVJHRVRfU1lTUk9PVH19YCxcbiAgICAgIClcblxuICAgICAgaWYgKFxuICAgICAgICBwcm9jZXNzLmVudi5UQVJHRVRfQ0M/LnN0YXJ0c1dpdGgoJ2NsYW5nJykgfHxcbiAgICAgICAgKHByb2Nlc3MuZW52LkNDPy5zdGFydHNXaXRoKCdjbGFuZycpICYmICFwcm9jZXNzLmVudi5UQVJHRVRfQ0MpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgVEFSR0VUX0NGTEFHUyA9IHByb2Nlc3MuZW52LlRBUkdFVF9DRkxBR1MgPz8gJydcbiAgICAgICAgdGhpcy5lbnZzLlRBUkdFVF9DRkxBR1MgPSBgLS1zeXNyb290PSR7dGhpcy5lbnZzLlRBUkdFVF9TWVNST09UfSAtLWdjYy10b29sY2hhaW49JHt0b29sY2hhaW5QYXRofSAke1RBUkdFVF9DRkxBR1N9YFxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAocHJvY2Vzcy5lbnYuQ1hYPy5zdGFydHNXaXRoKCdjbGFuZysrJykgJiYgIXByb2Nlc3MuZW52LlRBUkdFVF9DWFgpIHx8XG4gICAgICAgIHByb2Nlc3MuZW52LlRBUkdFVF9DWFg/LnN0YXJ0c1dpdGgoJ2NsYW5nKysnKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFRBUkdFVF9DWFhGTEFHUyA9IHByb2Nlc3MuZW52LlRBUkdFVF9DWFhGTEFHUyA/PyAnJ1xuICAgICAgICB0aGlzLmVudnMuVEFSR0VUX0NYWEZMQUdTID0gYC0tc3lzcm9vdD0ke3RoaXMuZW52cy5UQVJHRVRfU1lTUk9PVH0gLS1nY2MtdG9vbGNoYWluPSR7dG9vbGNoYWluUGF0aH0gJHtUQVJHRVRfQ1hYRkxBR1N9YFxuICAgICAgfVxuICAgICAgdGhpcy5lbnZzLlBBVEggPSB0aGlzLmVudnMuUEFUSFxuICAgICAgICA/IGAke3Rvb2xjaGFpblBhdGh9L2Jpbjoke3RoaXMuZW52cy5QQVRIfToke3Byb2Nlc3MuZW52LlBBVEh9YFxuICAgICAgICA6IGAke3Rvb2xjaGFpblBhdGh9L2Jpbjoke3Byb2Nlc3MuZW52LlBBVEh9YFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRlYnVnLndhcm4oJ1BpY2sgY3Jvc3MgdG9vbGNoYWluIGZhaWxlZCcsIGUgYXMgRXJyb3IpXG4gICAgICAvLyBpZ25vcmUsIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHByaXZhdGUgZXhlYygpIHtcbiAgICBkZWJ1ZyhgU3RhcnQgYnVpbGRpbmcgY3JhdGU6ICR7dGhpcy5jcmF0ZS5uYW1lfWApXG4gICAgZGVidWcoJyAgJWknLCBgY2FyZ28gJHt0aGlzLmFyZ3Muam9pbignICcpfWApXG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG5cbiAgICBjb25zdCB3YXRjaCA9IHRoaXMub3B0aW9ucy53YXRjaFxuICAgIGNvbnN0IGJ1aWxkVGFzayA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlQ3Jvc3MgJiYgdGhpcy5vcHRpb25zLmNyb3NzQ29tcGlsZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2AtLXVzZS1jcm9zc2AgYW5kIGAtLWNyb3NzLWNvbXBpbGVgIGNhbiBub3QgYmUgdXNlZCB0b2dldGhlcicsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbW1hbmQgPVxuICAgICAgICBwcm9jZXNzLmVudi5DQVJHTyA/PyAodGhpcy5vcHRpb25zLnVzZUNyb3NzID8gJ2Nyb3NzJyA6ICdjYXJnbycpXG4gICAgICBjb25zdCBidWlsZFByb2Nlc3MgPSBzcGF3bihjb21tYW5kLCB0aGlzLmFyZ3MsIHtcbiAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50aGlzLmVudnMgfSxcbiAgICAgICAgc3RkaW86IHdhdGNoID8gWydpbmhlcml0JywgJ2luaGVyaXQnLCAncGlwZSddIDogJ2luaGVyaXQnLFxuICAgICAgICBjd2Q6IHRoaXMub3B0aW9ucy5jd2QsXG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICB9KVxuXG4gICAgICBidWlsZFByb2Nlc3Mub25jZSgnZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgICAgZGVidWcoJyVpJywgYEJ1aWxkIGNyYXRlICR7dGhpcy5jcmF0ZS5uYW1lfSBzdWNjZXNzZnVsbHkhYClcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBCdWlsZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtjb2RlfWApKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBidWlsZFByb2Nlc3Mub25jZSgnZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBCdWlsZCBmYWlsZWQgd2l0aCBlcnJvcjogJHtlLm1lc3NhZ2V9YCwgeyBjYXVzZTogZSB9KSlcbiAgICAgIH0pXG5cbiAgICAgIC8vIHdhdGNoIG1vZGUgb25seSwgdGhleSBhcmUgcGlwZWQgdGhyb3VnaCBzdGRlcnJcbiAgICAgIGJ1aWxkUHJvY2Vzcy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gZGF0YS50b1N0cmluZygpXG4gICAgICAgIGNvbnNvbGUuZXJyb3Iob3V0cHV0KVxuICAgICAgICBpZiAoL0ZpbmlzaGVkXFxzKGBkZXZgfGByZWxlYXNlYCkvLnRlc3Qob3V0cHV0KSkge1xuICAgICAgICAgIHRoaXMucG9zdEJ1aWxkKCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICB0YXNrOiBidWlsZFRhc2sudGhlbigoKSA9PiB0aGlzLnBvc3RCdWlsZCgpKSxcbiAgICAgIGFib3J0OiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCksXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwaWNrQmluYXJ5KCkge1xuICAgIGxldCBzZXQgPSBmYWxzZVxuICAgIGlmICh0aGlzLm9wdGlvbnMud2F0Y2gpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgICBkZWJ1Zy53YXJuKCdXYXRjaCBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQ0kgZW52aXJvbm1lbnQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVidWcoJ1VzZSAlaScsICdjYXJnby13YXRjaCcpXG4gICAgICAgIHRyeUluc3RhbGxDYXJnb0JpbmFyeSgnY2FyZ28td2F0Y2gnLCAnd2F0Y2gnKVxuICAgICAgICAvLyB5YXJuIG5hcGkgd2F0Y2ggLS10YXJnZXQgeDg2XzY0LXVua25vd24tbGludXgtZ251IFstLWNyb3NzLWNvbXBpbGVdXG4gICAgICAgIC8vID09PT5cbiAgICAgICAgLy8gY2FyZ28gd2F0Y2ggWy4uLl0gLS0gYnVpbGQgLS10YXJnZXQgeDg2XzY0LXVua25vd24tbGludXgtZ251XG4gICAgICAgIC8vIGNhcmdvIHdhdGNoIFsuLi5dIC0tIHppZ2J1aWxkIC0tdGFyZ2V0IHg4Nl82NC11bmtub3duLWxpbnV4LWdudVxuICAgICAgICB0aGlzLmFyZ3MucHVzaChcbiAgICAgICAgICAnd2F0Y2gnLFxuICAgICAgICAgICctLXdoeScsXG4gICAgICAgICAgJy1pJyxcbiAgICAgICAgICAnKi57anMsdHMsbm9kZX0nLFxuICAgICAgICAgICctdycsXG4gICAgICAgICAgdGhpcy5jcmF0ZURpcixcbiAgICAgICAgICAnLS0nLFxuICAgICAgICAgICdjYXJnbycsXG4gICAgICAgICAgJ2J1aWxkJyxcbiAgICAgICAgKVxuICAgICAgICBzZXQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jcm9zc0NvbXBpbGUpIHtcbiAgICAgIGlmICh0aGlzLnRhcmdldC5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICAnWW91IGFyZSB0cnlpbmcgdG8gY3Jvc3MgY29tcGlsZSB0byB3aW4zMiBwbGF0Zm9ybSBvbiB3aW4zMiBwbGF0Zm9ybSB3aGljaCBpcyB1bm5lY2Vzc2FyeS4nLFxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB1c2UgY2FyZ28teHdpbiB0byBjcm9zcyBjb21waWxlIHRvIHdpbjMyIHBsYXRmb3JtXG4gICAgICAgICAgZGVidWcoJ1VzZSAlaScsICdjYXJnby14d2luJylcbiAgICAgICAgICB0cnlJbnN0YWxsQ2FyZ29CaW5hcnkoJ2NhcmdvLXh3aW4nLCAneHdpbicpXG4gICAgICAgICAgdGhpcy5hcmdzLnB1c2goJ3h3aW4nLCAnYnVpbGQnKVxuICAgICAgICAgIGlmICh0aGlzLnRhcmdldC5hcmNoID09PSAnaWEzMicpIHtcbiAgICAgICAgICAgIHRoaXMuZW52cy5YV0lOX0FSQ0ggPSAneDg2J1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVzZSBjYXJnby16aWdidWlsZCB0byBjcm9zcyBjb21waWxlIHRvIG90aGVyIHBsYXRmb3Jtc1xuICAgICAgICBkZWJ1ZygnVXNlICVpJywgJ2NhcmdvLXppZ2J1aWxkJylcbiAgICAgICAgdHJ5SW5zdGFsbENhcmdvQmluYXJ5KCdjYXJnby16aWdidWlsZCcsICd6aWdidWlsZCcpXG4gICAgICAgIHRoaXMuYXJncy5wdXNoKCd6aWdidWlsZCcpXG4gICAgICAgIHNldCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNldCkge1xuICAgICAgdGhpcy5hcmdzLnB1c2goJ2J1aWxkJylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGFja2FnZSgpIHtcbiAgICBjb25zdCBhcmdzID0gW11cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGFja2FnZSkge1xuICAgICAgYXJncy5wdXNoKCctLXBhY2thZ2UnLCB0aGlzLm9wdGlvbnMucGFja2FnZSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iaW5OYW1lKSB7XG4gICAgICBhcmdzLnB1c2goJy0tYmluJywgdGhpcy5iaW5OYW1lKVxuICAgIH1cblxuICAgIGlmIChhcmdzLmxlbmd0aCkge1xuICAgICAgZGVidWcoJ1NldCBwYWNrYWdlIGZsYWdzOiAnKVxuICAgICAgZGVidWcoJyAgJU8nLCBhcmdzKVxuICAgICAgdGhpcy5hcmdzLnB1c2goLi4uYXJncylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUYXJnZXQoKSB7XG4gICAgZGVidWcoJ1NldCBjb21waWxpbmcgdGFyZ2V0IHRvOiAnKVxuICAgIGRlYnVnKCcgICVpJywgdGhpcy50YXJnZXQudHJpcGxlKVxuXG4gICAgdGhpcy5hcmdzLnB1c2goJy0tdGFyZ2V0JywgdGhpcy50YXJnZXQudHJpcGxlKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHByaXZhdGUgc2V0RW52cygpIHtcbiAgICAvLyBUWVBFIERFRlxuICAgIGlmICh0aGlzLmVuYWJsZVR5cGVEZWYpIHtcbiAgICAgIHRoaXMuZW52cy5OQVBJX1RZUEVfREVGX1RNUF9GT0xERVIgPVxuICAgICAgICB0aGlzLmdlbmVyYXRlSW50ZXJtZWRpYXRlVHlwZURlZkZvbGRlcigpXG4gICAgICB0aGlzLnNldEZvcmNlQnVpbGRFbnZzKHRoaXMuZW52cy5OQVBJX1RZUEVfREVGX1RNUF9GT0xERVIpXG4gICAgfVxuXG4gICAgLy8gUlVTVEZMQUdTXG4gICAgbGV0IHJ1c3RmbGFncyA9XG4gICAgICBwcm9jZXNzLmVudi5SVVNURkxBR1MgPz8gcHJvY2Vzcy5lbnYuQ0FSR09fQlVJTERfUlVTVEZMQUdTID8/ICcnXG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnRhcmdldC5hYmk/LmluY2x1ZGVzKCdtdXNsJykgJiZcbiAgICAgICFydXN0ZmxhZ3MuaW5jbHVkZXMoJ3RhcmdldC1mZWF0dXJlPS1jcnQtc3RhdGljJylcbiAgICApIHtcbiAgICAgIHJ1c3RmbGFncyArPSAnIC1DIHRhcmdldC1mZWF0dXJlPS1jcnQtc3RhdGljJ1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaXAgJiYgIXJ1c3RmbGFncy5pbmNsdWRlcygnbGluay1hcmc9LXMnKSkge1xuICAgICAgcnVzdGZsYWdzICs9ICcgLUMgbGluay1hcmc9LXMnXG4gICAgfVxuXG4gICAgaWYgKHJ1c3RmbGFncy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZW52cy5SVVNURkxBR1MgPSBydXN0ZmxhZ3NcbiAgICB9XG4gICAgLy8gRU5EIFJVU1RGTEFHU1xuXG4gICAgLy8gTElOS0VSXG4gICAgY29uc3QgbGlua2VyID0gdGhpcy5vcHRpb25zLmNyb3NzQ29tcGlsZVxuICAgICAgPyB2b2lkIDBcbiAgICAgIDogZ2V0VGFyZ2V0TGlua2VyKHRoaXMudGFyZ2V0LnRyaXBsZSlcbiAgICAvLyBUT0RPOlxuICAgIC8vICAgZGlyZWN0bHkgc2V0IENBUkdPX1RBUkdFVF88dGFyZ2V0Pl9MSU5LRVIgd2lsbCBjb3ZlciAuY2FyZ28vY29uZmlnLnRvbWxcbiAgICAvLyAgIHdpbGwgZGV0ZWN0IGJ5IGNhcmdvIGNvbmZpZyB3aGVuIGl0IGJlY29tZXMgc3RhYmxlXG4gICAgLy8gICBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY2FyZ28vaXNzdWVzLzkzMDFcbiAgICBjb25zdCBsaW5rZXJFbnYgPSBgQ0FSR09fVEFSR0VUXyR7dGFyZ2V0VG9FbnZWYXIoXG4gICAgICB0aGlzLnRhcmdldC50cmlwbGUsXG4gICAgKX1fTElOS0VSYFxuICAgIGlmIChsaW5rZXIgJiYgIXByb2Nlc3MuZW52W2xpbmtlckVudl0gJiYgIXRoaXMuZW52c1tsaW5rZXJFbnZdKSB7XG4gICAgICB0aGlzLmVudnNbbGlua2VyRW52XSA9IGxpbmtlclxuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldC5wbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKSB7XG4gICAgICB0aGlzLnNldEFuZHJvaWRFbnYoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldC5wbGF0Zm9ybSA9PT0gJ3dhc2knKSB7XG4gICAgICB0aGlzLnNldFdhc2lFbnYoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldC5wbGF0Zm9ybSA9PT0gJ29wZW5oYXJtb255Jykge1xuICAgICAgdGhpcy5zZXRPcGVuSGFybW9ueUVudigpXG4gICAgfVxuXG4gICAgZGVidWcoJ1NldCBlbnZzOiAnKVxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZW52cykuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBkZWJ1ZygnICAlaScsIGAke2t9PSR7dn1gKVxuICAgIH0pXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGb3JjZUJ1aWxkRW52cyh0eXBlRGVmVG1wRm9sZGVyOiBzdHJpbmcpIHtcbiAgICAvLyBkeW5hbWljYWxseSBjaGVjayBhbGwgbmFwaS1ycyBkZXBzIGFuZCBzZXQgYE5BUElfRk9SQ0VfQlVJTERfe3VwcGVyY2FzZShzbmFrZV9jYXNlKG5hbWUpKX0gPSB0aW1lc3RhbXBgXG4gICAgdGhpcy5tZXRhZGF0YS5wYWNrYWdlcy5mb3JFYWNoKChjcmF0ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBjcmF0ZS5kZXBlbmRlbmNpZXMuc29tZSgoZCkgPT4gZC5uYW1lID09PSAnbmFwaS1kZXJpdmUnKSAmJlxuICAgICAgICAhZXhpc3RzU3luYyhqb2luKHR5cGVEZWZUbXBGb2xkZXIsIGNyYXRlLm5hbWUpKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZW52c1tcbiAgICAgICAgICBgTkFQSV9GT1JDRV9CVUlMRF8ke2NyYXRlLm5hbWUucmVwbGFjZSgvLS9nLCAnXycpLnRvVXBwZXJDYXNlKCl9YFxuICAgICAgICBdID0gRGF0ZS5ub3coKS50b1N0cmluZygpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0QW5kcm9pZEVudigpIHtcbiAgICBjb25zdCB7IEFORFJPSURfTkRLX0xBVEVTVF9IT01FIH0gPSBwcm9jZXNzLmVudlxuICAgIGlmICghQU5EUk9JRF9OREtfTEFURVNUX0hPTUUpIHtcbiAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgIGAke2NvbG9ycy5yZWQoXG4gICAgICAgICAgJ0FORFJPSURfTkRLX0xBVEVTVF9IT01FJyxcbiAgICAgICAgKX0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbWlzc2luZ2AsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gc2tpcCBjcm9zcyBjb21waWxlIHNldHVwIGlmIGhvc3QgaXMgYW5kcm9pZFxuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldEFyY2ggPSB0aGlzLnRhcmdldC5hcmNoID09PSAnYXJtJyA/ICdhcm12N2EnIDogJ2FhcmNoNjQnXG4gICAgY29uc3QgdGFyZ2V0UGxhdGZvcm0gPVxuICAgICAgdGhpcy50YXJnZXQuYXJjaCA9PT0gJ2FybScgPyAnYW5kcm9pZGVhYmkyNCcgOiAnYW5kcm9pZDI0J1xuICAgIGNvbnN0IGhvc3RQbGF0Zm9ybSA9XG4gICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJ1xuICAgICAgICA/ICdkYXJ3aW4nXG4gICAgICAgIDogcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICAgICAgICAgID8gJ3dpbmRvd3MnXG4gICAgICAgICAgOiAnbGludXgnXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLmVudnMsIHtcbiAgICAgIENBUkdPX1RBUkdFVF9BQVJDSDY0X0xJTlVYX0FORFJPSURfTElOS0VSOiBgJHtBTkRST0lEX05ES19MQVRFU1RfSE9NRX0vdG9vbGNoYWlucy9sbHZtL3ByZWJ1aWx0LyR7aG9zdFBsYXRmb3JtfS14ODZfNjQvYmluLyR7dGFyZ2V0QXJjaH0tbGludXgtYW5kcm9pZDI0LWNsYW5nYCxcbiAgICAgIENBUkdPX1RBUkdFVF9BUk1WN19MSU5VWF9BTkRST0lERUFCSV9MSU5LRVI6IGAke0FORFJPSURfTkRLX0xBVEVTVF9IT01FfS90b29sY2hhaW5zL2xsdm0vcHJlYnVpbHQvJHtob3N0UGxhdGZvcm19LXg4Nl82NC9iaW4vJHt0YXJnZXRBcmNofS1saW51eC1hbmRyb2lkZWFiaTI0LWNsYW5nYCxcbiAgICAgIFRBUkdFVF9DQzogYCR7QU5EUk9JRF9OREtfTEFURVNUX0hPTUV9L3Rvb2xjaGFpbnMvbGx2bS9wcmVidWlsdC8ke2hvc3RQbGF0Zm9ybX0teDg2XzY0L2Jpbi8ke3RhcmdldEFyY2h9LWxpbnV4LSR7dGFyZ2V0UGxhdGZvcm19LWNsYW5nYCxcbiAgICAgIFRBUkdFVF9DWFg6IGAke0FORFJPSURfTkRLX0xBVEVTVF9IT01FfS90b29sY2hhaW5zL2xsdm0vcHJlYnVpbHQvJHtob3N0UGxhdGZvcm19LXg4Nl82NC9iaW4vJHt0YXJnZXRBcmNofS1saW51eC0ke3RhcmdldFBsYXRmb3JtfS1jbGFuZysrYCxcbiAgICAgIFRBUkdFVF9BUjogYCR7QU5EUk9JRF9OREtfTEFURVNUX0hPTUV9L3Rvb2xjaGFpbnMvbGx2bS9wcmVidWlsdC8ke2hvc3RQbGF0Zm9ybX0teDg2XzY0L2Jpbi9sbHZtLWFyYCxcbiAgICAgIFRBUkdFVF9SQU5MSUI6IGAke0FORFJPSURfTkRLX0xBVEVTVF9IT01FfS90b29sY2hhaW5zL2xsdm0vcHJlYnVpbHQvJHtob3N0UGxhdGZvcm19LXg4Nl82NC9iaW4vbGx2bS1yYW5saWJgLFxuICAgICAgQU5EUk9JRF9OREs6IEFORFJPSURfTkRLX0xBVEVTVF9IT01FLFxuICAgICAgUEFUSDogYCR7QU5EUk9JRF9OREtfTEFURVNUX0hPTUV9L3Rvb2xjaGFpbnMvbGx2bS9wcmVidWlsdC8ke2hvc3RQbGF0Zm9ybX0teDg2XzY0L2JpbiR7cHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICc7JyA6ICc6J30ke3Byb2Nlc3MuZW52LlBBVEh9YCxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRXYXNpRW52KCkge1xuICAgIGNvbnN0IGVtbmFwaSA9IGpvaW4oXG4gICAgICByZXF1aXJlLnJlc29sdmUoJ2VtbmFwaScpLFxuICAgICAgJy4uJyxcbiAgICAgICdsaWInLFxuICAgICAgJ3dhc20zMi13YXNpcDEtdGhyZWFkcycsXG4gICAgKVxuICAgIHRoaXMuZW52cy5FTU5BUElfTElOS19ESVIgPSBlbW5hcGlcbiAgICBjb25zdCBlbW5hcGlWZXJzaW9uID0gcmVxdWlyZSgnZW1uYXBpL3BhY2thZ2UuanNvbicpLnZlcnNpb25cbiAgICBjb25zdCBwcm9qZWN0UmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoam9pbih0aGlzLm9wdGlvbnMuY3dkLCAncGFja2FnZS5qc29uJykpXG4gICAgY29uc3QgZW1uYXBpQ29yZVZlcnNpb24gPSBwcm9qZWN0UmVxdWlyZSgnQGVtbmFwaS9jb3JlJykudmVyc2lvblxuICAgIGNvbnN0IGVtbmFwaVJ1bnRpbWVWZXJzaW9uID0gcHJvamVjdFJlcXVpcmUoJ0BlbW5hcGkvcnVudGltZScpLnZlcnNpb25cblxuICAgIGlmIChcbiAgICAgIGVtbmFwaVZlcnNpb24gIT09IGVtbmFwaUNvcmVWZXJzaW9uIHx8XG4gICAgICBlbW5hcGlWZXJzaW9uICE9PSBlbW5hcGlSdW50aW1lVmVyc2lvblxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZW1uYXBpIHZlcnNpb24gbWlzbWF0Y2g6IGVtbmFwaUAke2VtbmFwaVZlcnNpb259LCBAZW1uYXBpL2NvcmVAJHtlbW5hcGlDb3JlVmVyc2lvbn0sIEBlbW5hcGkvcnVudGltZUAke2VtbmFwaVJ1bnRpbWVWZXJzaW9ufS4gUGxlYXNlIGVuc3VyZSBhbGwgZW1uYXBpIHBhY2thZ2VzIGFyZSB0aGUgc2FtZSB2ZXJzaW9uLmAsXG4gICAgICApXG4gICAgfVxuICAgIGNvbnN0IHsgV0FTSV9TREtfUEFUSCB9ID0gcHJvY2Vzcy5lbnZcblxuICAgIGlmIChXQVNJX1NES19QQVRIICYmIGV4aXN0c1N5bmMoV0FTSV9TREtfUEFUSCkpIHtcbiAgICAgIHRoaXMuZW52cy5DQVJHT19UQVJHRVRfV0FTTTMyX1dBU0lfUFJFVklFVzFfVEhSRUFEU19MSU5LRVIgPSBqb2luKFxuICAgICAgICBXQVNJX1NES19QQVRILFxuICAgICAgICAnYmluJyxcbiAgICAgICAgJ3dhc20tbGQnLFxuICAgICAgKVxuICAgICAgdGhpcy5lbnZzLkNBUkdPX1RBUkdFVF9XQVNNMzJfV0FTSVAxX0xJTktFUiA9IGpvaW4oXG4gICAgICAgIFdBU0lfU0RLX1BBVEgsXG4gICAgICAgICdiaW4nLFxuICAgICAgICAnd2FzbS1sZCcsXG4gICAgICApXG4gICAgICB0aGlzLmVudnMuQ0FSR09fVEFSR0VUX1dBU00zMl9XQVNJUDFfVEhSRUFEU19MSU5LRVIgPSBqb2luKFxuICAgICAgICBXQVNJX1NES19QQVRILFxuICAgICAgICAnYmluJyxcbiAgICAgICAgJ3dhc20tbGQnLFxuICAgICAgKVxuICAgICAgdGhpcy5lbnZzLkNBUkdPX1RBUkdFVF9XQVNNMzJfV0FTSVAyX0xJTktFUiA9IGpvaW4oXG4gICAgICAgIFdBU0lfU0RLX1BBVEgsXG4gICAgICAgICdiaW4nLFxuICAgICAgICAnd2FzbS1sZCcsXG4gICAgICApXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfQ0MnLCBqb2luKFdBU0lfU0RLX1BBVEgsICdiaW4nLCAnY2xhbmcnKSlcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfQ1hYJyxcbiAgICAgICAgam9pbihXQVNJX1NES19QQVRILCAnYmluJywgJ2NsYW5nKysnKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9BUicsIGpvaW4oV0FTSV9TREtfUEFUSCwgJ2JpbicsICdhcicpKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9SQU5MSUInLFxuICAgICAgICBqb2luKFdBU0lfU0RLX1BBVEgsICdiaW4nLCAncmFubGliJyksXG4gICAgICApXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKFxuICAgICAgICAnVEFSR0VUX0NGTEFHUycsXG4gICAgICAgIGAtLXRhcmdldD13YXNtMzItd2FzaXAxLXRocmVhZHMgLS1zeXNyb290PSR7V0FTSV9TREtfUEFUSH0vc2hhcmUvd2FzaS1zeXNyb290IC1wdGhyZWFkIC1tbGx2bSAtd2FzbS1lbmFibGUtc2psamAsXG4gICAgICApXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKFxuICAgICAgICAnVEFSR0VUX0NYWEZMQUdTJyxcbiAgICAgICAgYC0tdGFyZ2V0PXdhc20zMi13YXNpcDEtdGhyZWFkcyAtLXN5c3Jvb3Q9JHtXQVNJX1NES19QQVRIfS9zaGFyZS93YXNpLXN5c3Jvb3QgLXB0aHJlYWQgLW1sbHZtIC13YXNtLWVuYWJsZS1zamxqYCxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgIGBUQVJHRVRfTERGTEFHU2AsXG4gICAgICAgIGAtZnVzZS1sZD0ke1dBU0lfU0RLX1BBVEh9L2Jpbi93YXNtLWxkIC0tdGFyZ2V0PXdhc20zMi13YXNpcDEtdGhyZWFkc2AsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRPcGVuSGFybW9ueUVudigpIHtcbiAgICBjb25zdCB7IE9IT1NfU0RLX1BBVEgsIE9IT1NfU0RLX05BVElWRSB9ID0gcHJvY2Vzcy5lbnZcbiAgICBjb25zdCBuZGtQYXRoID0gT0hPU19TREtfUEFUSCA/IGAke09IT1NfU0RLX1BBVEh9L25hdGl2ZWAgOiBPSE9TX1NES19OQVRJVkVcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgaWYgKCFuZGtQYXRoICYmIHByb2Nlc3MucGxhdGZvcm0gIT09ICdvcGVuaGFybW9ueScpIHtcbiAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgIGAke2NvbG9ycy5yZWQoJ09IT1NfU0RLX1BBVEgnKX0gb3IgJHtjb2xvcnMucmVkKCdPSE9TX1NES19OQVRJVkUnKX0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbWlzc2luZ2AsXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgbGlua2VyTmFtZSA9IGBDQVJHT19UQVJHRVRfJHt0aGlzLnRhcmdldC50cmlwbGUudG9VcHBlckNhc2UoKS5yZXBsYWNlKC8tL2csICdfJyl9X0xJTktFUmBcbiAgICBjb25zdCByYW5QYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vbGx2bS1yYW5saWJgXG4gICAgY29uc3QgYXJQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vbGx2bS1hcmBcbiAgICBjb25zdCBjY1BhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi8ke3RoaXMudGFyZ2V0LnRyaXBsZX0tY2xhbmdgXG4gICAgY29uc3QgY3h4UGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluLyR7dGhpcy50YXJnZXQudHJpcGxlfS1jbGFuZysrYFxuICAgIGNvbnN0IGFzUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluL2xsdm0tYXNgXG4gICAgY29uc3QgbGRQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vbGQubGxkYFxuICAgIGNvbnN0IHN0cmlwUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluL2xsdm0tc3RyaXBgXG4gICAgY29uc3Qgb2JqRHVtcFBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sbHZtLW9iamR1bXBgXG4gICAgY29uc3Qgb2JqQ29weVBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sbHZtLW9iamNvcHlgXG4gICAgY29uc3Qgbm1QYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vbGx2bS1ubWBcbiAgICBjb25zdCBiaW5QYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW5gXG4gICAgY29uc3QgbGliUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vbGliYFxuXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnTElCQ0xBTkdfUEFUSCcsIGxpYlBhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnREVQX0FUT01JQycsICdjbGFuZ19ydC5idWlsdGlucycpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhsaW5rZXJOYW1lLCBjY1BhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX0NDJywgY2NQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9DWFgnLCBjeHhQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9BUicsIGFyUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfUkFOTElCJywgcmFuUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfQVMnLCBhc1BhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX0xEJywgbGRQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9TVFJJUCcsIHN0cmlwUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfT0JKRFVNUCcsIG9iakR1bXBQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9PQkpDT1BZJywgb2JqQ29weVBhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX05NJywgbm1QYXRoKVxuICAgIHRoaXMuZW52cy5QQVRIID0gYCR7YmluUGF0aH0ke3Byb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnOycgOiAnOid9JHtwcm9jZXNzLmVudi5QQVRIfWBcbiAgfVxuXG4gIHByaXZhdGUgc2V0RmVhdHVyZXMoKSB7XG4gICAgY29uc3QgYXJncyA9IFtdXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hbGxGZWF0dXJlcyAmJiB0aGlzLm9wdGlvbnMubm9EZWZhdWx0RmVhdHVyZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBzcGVjaWZ5IC0tYWxsLWZlYXR1cmVzIGFuZCAtLW5vLWRlZmF1bHQtZmVhdHVyZXMgdG9nZXRoZXInLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmFsbEZlYXR1cmVzKSB7XG4gICAgICBhcmdzLnB1c2goJy0tYWxsLWZlYXR1cmVzJylcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5ub0RlZmF1bHRGZWF0dXJlcykge1xuICAgICAgYXJncy5wdXNoKCctLW5vLWRlZmF1bHQtZmVhdHVyZXMnKVxuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmZlYXR1cmVzKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZmVhdHVyZXMnLCAuLi50aGlzLm9wdGlvbnMuZmVhdHVyZXMpXG4gICAgfVxuXG4gICAgZGVidWcoJ1NldCBmZWF0dXJlcyBmbGFnczogJylcbiAgICBkZWJ1ZygnICAlTycsIGFyZ3MpXG4gICAgdGhpcy5hcmdzLnB1c2goLi4uYXJncylcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIHNldEJ5cGFzc0FyZ3MoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZWxlYXNlKSB7XG4gICAgICB0aGlzLmFyZ3MucHVzaCgnLS1yZWxlYXNlJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIHRoaXMuYXJncy5wdXNoKCctLXZlcmJvc2UnKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGFyZ2V0RGlyKSB7XG4gICAgICB0aGlzLmFyZ3MucHVzaCgnLS10YXJnZXQtZGlyJywgdGhpcy5vcHRpb25zLnRhcmdldERpcilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnByb2ZpbGUpIHtcbiAgICAgIHRoaXMuYXJncy5wdXNoKCctLXByb2ZpbGUnLCB0aGlzLm9wdGlvbnMucHJvZmlsZSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm1hbmlmZXN0UGF0aCkge1xuICAgICAgdGhpcy5hcmdzLnB1c2goJy0tbWFuaWZlc3QtcGF0aCcsIHRoaXMub3B0aW9ucy5tYW5pZmVzdFBhdGgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jYXJnb09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5hcmdzLnB1c2goLi4udGhpcy5vcHRpb25zLmNhcmdvT3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUludGVybWVkaWF0ZVR5cGVEZWZGb2xkZXIoKSB7XG4gICAgbGV0IGZvbGRlciA9IGpvaW4oXG4gICAgICB0aGlzLnRhcmdldERpcixcbiAgICAgICduYXBpLXJzJyxcbiAgICAgIGAke3RoaXMuY3JhdGUubmFtZX0tJHtjcmVhdGVIYXNoKCdzaGEyNTYnKVxuICAgICAgICAudXBkYXRlKHRoaXMuY3JhdGUubWFuaWZlc3RfcGF0aClcbiAgICAgICAgLnVwZGF0ZShDTElfVkVSU0lPTilcbiAgICAgICAgLmRpZ2VzdCgnaGV4JylcbiAgICAgICAgLnN1YnN0cmluZygwLCA4KX1gLFxuICAgIClcblxuICAgIGlmICghdGhpcy5vcHRpb25zLmR0c0NhY2hlKSB7XG4gICAgICBybVN5bmMoZm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICAgIGZvbGRlciArPSBgXyR7RGF0ZS5ub3coKX1gXG4gICAgfVxuXG4gICAgbWtkaXJBc3luYyhmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICByZXR1cm4gZm9sZGVyXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBvc3RCdWlsZCgpIHtcbiAgICB0cnkge1xuICAgICAgZGVidWcoYFRyeSB0byBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeTpgKVxuICAgICAgZGVidWcoJyAgJWknLCB0aGlzLm91dHB1dERpcilcbiAgICAgIGF3YWl0IG1rZGlyQXN5bmModGhpcy5vdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICBkZWJ1ZyhgT3V0cHV0IGRpcmVjdG9yeSBjcmVhdGVkYClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSAke3RoaXMub3V0cHV0RGlyfWAsIHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHdhc21CaW5hcnlOYW1lID0gYXdhaXQgdGhpcy5jb3B5QXJ0aWZhY3QoKVxuXG4gICAgLy8gb25seSBmb3IgY2R5bGliXG4gICAgaWYgKHRoaXMuY2R5TGliTmFtZSkge1xuICAgICAgY29uc3QgaWRlbnRzID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVR5cGVEZWYoKVxuICAgICAgY29uc3QganNPdXRwdXQgPSBhd2FpdCB0aGlzLndyaXRlSnNCaW5kaW5nKGlkZW50cylcbiAgICAgIGNvbnN0IHdhc21CaW5kaW5nc091dHB1dCA9IGF3YWl0IHRoaXMud3JpdGVXYXNpQmluZGluZyhcbiAgICAgICAgd2FzbUJpbmFyeU5hbWUsXG4gICAgICAgIGlkZW50cyxcbiAgICAgIClcbiAgICAgIGlmIChqc091dHB1dCkge1xuICAgICAgICB0aGlzLm91dHB1dHMucHVzaChqc091dHB1dClcbiAgICAgIH1cbiAgICAgIGlmICh3YXNtQmluZGluZ3NPdXRwdXQpIHtcbiAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2goLi4ud2FzbUJpbmRpbmdzT3V0cHV0KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm91dHB1dHNcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weUFydGlmYWN0KCkge1xuICAgIGNvbnN0IFtzcmNOYW1lLCBkZXN0TmFtZSwgd2FzbUJpbmFyeU5hbWVdID0gdGhpcy5nZXRBcnRpZmFjdE5hbWVzKClcbiAgICBpZiAoIXNyY05hbWUgfHwgIWRlc3ROYW1lKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwcm9maWxlID1cbiAgICAgIHRoaXMub3B0aW9ucy5wcm9maWxlID8/ICh0aGlzLm9wdGlvbnMucmVsZWFzZSA/ICdyZWxlYXNlJyA6ICdkZWJ1ZycpXG4gICAgY29uc3Qgc3JjID0gam9pbih0aGlzLnRhcmdldERpciwgdGhpcy50YXJnZXQudHJpcGxlLCBwcm9maWxlLCBzcmNOYW1lKVxuICAgIGRlYnVnKGBDb3B5IGFydGlmYWN0IGZyb206IFske3NyY31dYClcbiAgICBjb25zdCBkZXN0ID0gam9pbih0aGlzLm91dHB1dERpciwgZGVzdE5hbWUpXG4gICAgY29uc3QgaXNXYXNtID0gZGVzdC5lbmRzV2l0aCgnLndhc20nKVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKGRlc3QpKSB7XG4gICAgICAgIGRlYnVnKCdPbGQgYXJ0aWZhY3QgZm91bmQsIHJlbW92ZSBpdCBmaXJzdCcpXG4gICAgICAgIGF3YWl0IHVubGlua0FzeW5jKGRlc3QpXG4gICAgICB9XG4gICAgICBkZWJ1ZygnQ29weSBhcnRpZmFjdCB0bzonKVxuICAgICAgZGVidWcoJyAgJWknLCBkZXN0KVxuICAgICAgaWYgKGlzV2FzbSkge1xuICAgICAgICBjb25zdCB7IE1vZHVsZUNvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KCdAbmFwaS1ycy93YXNtLXRvb2xzJylcbiAgICAgICAgZGVidWcoJ0dlbmVyYXRlIGRlYnVnIHdhc20gbW9kdWxlJylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkZWJ1Z1dhc21Nb2R1bGUgPSBuZXcgTW9kdWxlQ29uZmlnKClcbiAgICAgICAgICAgIC5nZW5lcmF0ZUR3YXJmKHRydWUpXG4gICAgICAgICAgICAuZ2VuZXJhdGVOYW1lU2VjdGlvbih0cnVlKVxuICAgICAgICAgICAgLmdlbmVyYXRlUHJvZHVjZXJzU2VjdGlvbih0cnVlKVxuICAgICAgICAgICAgLnByZXNlcnZlQ29kZVRyYW5zZm9ybSh0cnVlKVxuICAgICAgICAgICAgLnN0cmljdFZhbGlkYXRlKGZhbHNlKVxuICAgICAgICAgICAgLnBhcnNlKGF3YWl0IHJlYWRGaWxlQXN5bmMoc3JjKSlcbiAgICAgICAgICBjb25zdCBkZWJ1Z1dhc21CaW5hcnkgPSBkZWJ1Z1dhc21Nb2R1bGUuZW1pdFdhc20odHJ1ZSlcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgICAgICAgIGRlc3QucmVwbGFjZSgvXFwud2FzbSQvLCAnLmRlYnVnLndhc20nKSxcbiAgICAgICAgICAgIGRlYnVnV2FzbUJpbmFyeSxcbiAgICAgICAgICApXG4gICAgICAgICAgZGVidWcoJ0dlbmVyYXRlIHJlbGVhc2Ugd2FzbSBtb2R1bGUnKVxuICAgICAgICAgIGNvbnN0IHJlbGVhc2VXYXNtTW9kdWxlID0gbmV3IE1vZHVsZUNvbmZpZygpXG4gICAgICAgICAgICAuZ2VuZXJhdGVEd2FyZihmYWxzZSlcbiAgICAgICAgICAgIC5nZW5lcmF0ZU5hbWVTZWN0aW9uKGZhbHNlKVxuICAgICAgICAgICAgLmdlbmVyYXRlUHJvZHVjZXJzU2VjdGlvbihmYWxzZSlcbiAgICAgICAgICAgIC5wcmVzZXJ2ZUNvZGVUcmFuc2Zvcm0oZmFsc2UpXG4gICAgICAgICAgICAuc3RyaWN0VmFsaWRhdGUoZmFsc2UpXG4gICAgICAgICAgICAub25seVN0YWJsZUZlYXR1cmVzKGZhbHNlKVxuICAgICAgICAgICAgLnBhcnNlKGRlYnVnV2FzbUJpbmFyeSlcbiAgICAgICAgICBjb25zdCByZWxlYXNlV2FzbUJpbmFyeSA9IHJlbGVhc2VXYXNtTW9kdWxlLmVtaXRXYXNtKGZhbHNlKVxuICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKGRlc3QsIHJlbGVhc2VXYXNtQmluYXJ5KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZGVidWcud2FybihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gZ2VuZXJhdGUgZGVidWcgd2FzbSBtb2R1bGU6ICR7KGUgYXMgYW55KS5tZXNzYWdlID8/IGV9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgYXdhaXQgY29weUZpbGVBc3luYyhzcmMsIGRlc3QpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGNvcHlGaWxlQXN5bmMoc3JjLCBkZXN0KVxuICAgICAgfVxuICAgICAgdGhpcy5vdXRwdXRzLnB1c2goe1xuICAgICAgICBraW5kOiBkZXN0LmVuZHNXaXRoKCcubm9kZScpID8gJ25vZGUnIDogaXNXYXNtID8gJ3dhc20nIDogJ2V4ZScsXG4gICAgICAgIHBhdGg6IGRlc3QsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHdhc21CaW5hcnlOYW1lID8gam9pbih0aGlzLm91dHB1dERpciwgd2FzbUJpbmFyeU5hbWUpIDogbnVsbFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNvcHkgYXJ0aWZhY3QnLCB7IGNhdXNlOiBlIH0pXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBcnRpZmFjdE5hbWVzKCkge1xuICAgIGlmICh0aGlzLmNkeUxpYk5hbWUpIHtcbiAgICAgIGNvbnN0IGNkeUxpYiA9IHRoaXMuY2R5TGliTmFtZS5yZXBsYWNlKC8tL2csICdfJylcbiAgICAgIGNvbnN0IHdhc2lUYXJnZXQgPSB0aGlzLmNvbmZpZy50YXJnZXRzLmZpbmQoKHQpID0+IHQucGxhdGZvcm0gPT09ICd3YXNpJylcblxuICAgICAgY29uc3Qgc3JjTmFtZSA9XG4gICAgICAgIHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnZGFyd2luJ1xuICAgICAgICAgID8gYGxpYiR7Y2R5TGlifS5keWxpYmBcbiAgICAgICAgICA6IHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnd2luMzInXG4gICAgICAgICAgICA/IGAke2NkeUxpYn0uZGxsYFxuICAgICAgICAgICAgOiB0aGlzLnRhcmdldC5wbGF0Zm9ybSA9PT0gJ3dhc2knIHx8IHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnd2FzbSdcbiAgICAgICAgICAgICAgPyBgJHtjZHlMaWJ9Lndhc21gXG4gICAgICAgICAgICAgIDogYGxpYiR7Y2R5TGlifS5zb2BcblxuICAgICAgbGV0IGRlc3ROYW1lID0gdGhpcy5jb25maWcuYmluYXJ5TmFtZVxuICAgICAgLy8gYWRkIHBsYXRmb3JtIHN1ZmZpeCB0byBiaW5hcnkgbmFtZVxuICAgICAgLy8gaW5kZXhbLmxpbnV4LXg2NC1nbnVdLm5vZGVcbiAgICAgIC8vICAgICAgIF5eXl5eXl5eXl5eXl5eXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIGRlc3ROYW1lICs9IGAuJHt0aGlzLnRhcmdldC5wbGF0Zm9ybUFyY2hBQkl9YFxuICAgICAgfVxuICAgICAgaWYgKHNyY05hbWUuZW5kc1dpdGgoJy53YXNtJykpIHtcbiAgICAgICAgZGVzdE5hbWUgKz0gJy53YXNtJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzdE5hbWUgKz0gJy5ub2RlJ1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW1xuICAgICAgICBzcmNOYW1lLFxuICAgICAgICBkZXN0TmFtZSxcbiAgICAgICAgd2FzaVRhcmdldFxuICAgICAgICAgID8gYCR7dGhpcy5jb25maWcuYmluYXJ5TmFtZX0uJHt3YXNpVGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX0ud2FzbWBcbiAgICAgICAgICA6IG51bGwsXG4gICAgICBdXG4gICAgfSBlbHNlIGlmICh0aGlzLmJpbk5hbWUpIHtcbiAgICAgIGNvbnN0IHNyY05hbWUgPVxuICAgICAgICB0aGlzLnRhcmdldC5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IGAke3RoaXMuYmluTmFtZX0uZXhlYCA6IHRoaXMuYmluTmFtZVxuXG4gICAgICByZXR1cm4gW3NyY05hbWUsIHNyY05hbWVdXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlVHlwZURlZigpIHtcbiAgICBjb25zdCB0eXBlRGVmRGlyID0gdGhpcy5lbnZzLk5BUElfVFlQRV9ERUZfVE1QX0ZPTERFUlxuICAgIGlmICghdGhpcy5lbmFibGVUeXBlRGVmKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBjb25zdCB7IGV4cG9ydHMsIGR0cyB9ID0gYXdhaXQgZ2VuZXJhdGVUeXBlRGVmKHtcbiAgICAgIHR5cGVEZWZEaXIsXG4gICAgICBub0R0c0hlYWRlcjogdGhpcy5vcHRpb25zLm5vRHRzSGVhZGVyLFxuICAgICAgZHRzSGVhZGVyOiB0aGlzLm9wdGlvbnMuZHRzSGVhZGVyLFxuICAgICAgY29uZmlnRHRzSGVhZGVyOiB0aGlzLmNvbmZpZy5kdHNIZWFkZXIsXG4gICAgICBjb25maWdEdHNIZWFkZXJGaWxlOiB0aGlzLmNvbmZpZy5kdHNIZWFkZXJGaWxlLFxuICAgICAgY29uc3RFbnVtOiB0aGlzLm9wdGlvbnMuY29uc3RFbnVtID8/IHRoaXMuY29uZmlnLmNvbnN0RW51bSxcbiAgICAgIHJ1bnRpbWVTdHJpbmdFbnVtOlxuICAgICAgICB0aGlzLm9wdGlvbnMucnVudGltZVN0cmluZ0VudW0gPz8gdGhpcy5jb25maWcucnVudGltZVN0cmluZ0VudW0sXG4gICAgICBjd2Q6IHRoaXMub3B0aW9ucy5jd2QsXG4gICAgfSlcblxuICAgIGNvbnN0IGRlc3QgPSBqb2luKHRoaXMub3V0cHV0RGlyLCB0aGlzLm9wdGlvbnMuZHRzID8/ICdpbmRleC5kLnRzJylcblxuICAgIHRyeSB7XG4gICAgICBkZWJ1ZygnV3JpdGluZyB0eXBlIGRlZiB0bzonKVxuICAgICAgZGVidWcoJyAgJWknLCBkZXN0KVxuICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoZGVzdCwgZHRzLCAndXRmLTgnKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRlYnVnLmVycm9yKCdGYWlsZWQgdG8gd3JpdGUgdHlwZSBkZWYgZmlsZScpXG4gICAgICBkZWJ1Zy5lcnJvcihlIGFzIEVycm9yKVxuICAgIH1cblxuICAgIGlmIChleHBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRlc3QgPSBqb2luKHRoaXMub3V0cHV0RGlyLCB0aGlzLm9wdGlvbnMuZHRzID8/ICdpbmRleC5kLnRzJylcbiAgICAgIHRoaXMub3V0cHV0cy5wdXNoKHsga2luZDogJ2R0cycsIHBhdGg6IGRlc3QgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwb3J0c1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUpzQmluZGluZyhpZGVudHM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHdyaXRlSnNCaW5kaW5nKHtcbiAgICAgIHBsYXRmb3JtOiB0aGlzLm9wdGlvbnMucGxhdGZvcm0sXG4gICAgICBub0pzQmluZGluZzogdGhpcy5vcHRpb25zLm5vSnNCaW5kaW5nLFxuICAgICAgaWRlbnRzLFxuICAgICAganNCaW5kaW5nOiB0aGlzLm9wdGlvbnMuanNCaW5kaW5nLFxuICAgICAgZXNtOiB0aGlzLm9wdGlvbnMuZXNtLFxuICAgICAgYmluYXJ5TmFtZTogdGhpcy5jb25maWcuYmluYXJ5TmFtZSxcbiAgICAgIHBhY2thZ2VOYW1lOiB0aGlzLm9wdGlvbnMuanNQYWNrYWdlTmFtZSA/PyB0aGlzLmNvbmZpZy5wYWNrYWdlTmFtZSxcbiAgICAgIHZlcnNpb246IHByb2Nlc3MuZW52Lm5wbV9uZXdfdmVyc2lvbiA/PyB0aGlzLmNvbmZpZy5wYWNrYWdlSnNvbi52ZXJzaW9uLFxuICAgICAgb3V0cHV0RGlyOiB0aGlzLm91dHB1dERpcixcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZVdhc2lCaW5kaW5nKFxuICAgIGRpc3RGaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBpZGVudHM6IHN0cmluZ1tdLFxuICApIHtcbiAgICBpZiAoZGlzdEZpbGVOYW1lKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIGRpciB9ID0gcGFyc2UoZGlzdEZpbGVOYW1lKVxuICAgICAgY29uc3QgYmluZGluZ1BhdGggPSBqb2luKGRpciwgYCR7dGhpcy5jb25maWcuYmluYXJ5TmFtZX0ud2FzaS5janNgKVxuICAgICAgY29uc3QgYnJvd3NlckJpbmRpbmdQYXRoID0gam9pbihcbiAgICAgICAgZGlyLFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy5iaW5hcnlOYW1lfS53YXNpLWJyb3dzZXIuanNgLFxuICAgICAgKVxuICAgICAgY29uc3Qgd29ya2VyUGF0aCA9IGpvaW4oZGlyLCAnd2FzaS13b3JrZXIubWpzJylcbiAgICAgIGNvbnN0IGJyb3dzZXJXb3JrZXJQYXRoID0gam9pbihkaXIsICd3YXNpLXdvcmtlci1icm93c2VyLm1qcycpXG4gICAgICBjb25zdCBicm93c2VyRW50cnlQYXRoID0gam9pbihkaXIsICdicm93c2VyLmpzJylcbiAgICAgIGNvbnN0IGV4cG9ydHNDb2RlID1cbiAgICAgICAgYG1vZHVsZS5leHBvcnRzID0gX19uYXBpTW9kdWxlLmV4cG9ydHNcXG5gICtcbiAgICAgICAgaWRlbnRzXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIChpZGVudCkgPT5cbiAgICAgICAgICAgICAgYG1vZHVsZS5leHBvcnRzLiR7aWRlbnR9ID0gX19uYXBpTW9kdWxlLmV4cG9ydHMuJHtpZGVudH1gLFxuICAgICAgICAgIClcbiAgICAgICAgICAuam9pbignXFxuJylcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKFxuICAgICAgICBiaW5kaW5nUGF0aCxcbiAgICAgICAgY3JlYXRlV2FzaUJpbmRpbmcoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB0aGlzLmNvbmZpZy5wYWNrYWdlTmFtZSxcbiAgICAgICAgICB0aGlzLmNvbmZpZy53YXNtPy5pbml0aWFsTWVtb3J5LFxuICAgICAgICAgIHRoaXMuY29uZmlnLndhc20/Lm1heGltdW1NZW1vcnksXG4gICAgICAgICkgK1xuICAgICAgICAgIGV4cG9ydHNDb2RlICtcbiAgICAgICAgICAnXFxuJyxcbiAgICAgICAgJ3V0ZjgnLFxuICAgICAgKVxuICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICAgIGJyb3dzZXJCaW5kaW5nUGF0aCxcbiAgICAgICAgY3JlYXRlV2FzaUJyb3dzZXJCaW5kaW5nKFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8uaW5pdGlhbE1lbW9yeSxcbiAgICAgICAgICB0aGlzLmNvbmZpZy53YXNtPy5tYXhpbXVtTWVtb3J5LFxuICAgICAgICAgIHRoaXMuY29uZmlnLndhc20/LmJyb3dzZXI/LmZzLFxuICAgICAgICAgIHRoaXMuY29uZmlnLndhc20/LmJyb3dzZXI/LmFzeW5jSW5pdCxcbiAgICAgICAgICB0aGlzLmNvbmZpZy53YXNtPy5icm93c2VyPy5idWZmZXIsXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8uYnJvd3Nlcj8uZXJyb3JFdmVudCxcbiAgICAgICAgKSArXG4gICAgICAgICAgYGV4cG9ydCBkZWZhdWx0IF9fbmFwaU1vZHVsZS5leHBvcnRzXFxuYCArXG4gICAgICAgICAgaWRlbnRzXG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAoaWRlbnQpID0+XG4gICAgICAgICAgICAgICAgYGV4cG9ydCBjb25zdCAke2lkZW50fSA9IF9fbmFwaU1vZHVsZS5leHBvcnRzLiR7aWRlbnR9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKSArXG4gICAgICAgICAgJ1xcbicsXG4gICAgICAgICd1dGY4JyxcbiAgICAgIClcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKHdvcmtlclBhdGgsIFdBU0lfV09SS0VSX1RFTVBMQVRFLCAndXRmOCcpXG4gICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgICAgYnJvd3NlcldvcmtlclBhdGgsXG4gICAgICAgIGNyZWF0ZVdhc2lCcm93c2VyV29ya2VyQmluZGluZyhcbiAgICAgICAgICB0aGlzLmNvbmZpZy53YXNtPy5icm93c2VyPy5mcyA/PyBmYWxzZSxcbiAgICAgICAgICB0aGlzLmNvbmZpZy53YXNtPy5icm93c2VyPy5lcnJvckV2ZW50ID8/IGZhbHNlLFxuICAgICAgICApLFxuICAgICAgICAndXRmOCcsXG4gICAgICApXG4gICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgICAgYnJvd3NlckVudHJ5UGF0aCxcbiAgICAgICAgYGV4cG9ydCAqIGZyb20gJyR7dGhpcy5jb25maWcucGFja2FnZU5hbWV9LXdhc20zMi13YXNpJ1xcbmAsXG4gICAgICApXG4gICAgICByZXR1cm4gW1xuICAgICAgICB7IGtpbmQ6ICdqcycsIHBhdGg6IGJpbmRpbmdQYXRoIH0sXG4gICAgICAgIHsga2luZDogJ2pzJywgcGF0aDogYnJvd3NlckJpbmRpbmdQYXRoIH0sXG4gICAgICAgIHsga2luZDogJ2pzJywgcGF0aDogd29ya2VyUGF0aCB9LFxuICAgICAgICB7IGtpbmQ6ICdqcycsIHBhdGg6IGJyb3dzZXJXb3JrZXJQYXRoIH0sXG4gICAgICAgIHsga2luZDogJ2pzJywgcGF0aDogYnJvd3NlckVudHJ5UGF0aCB9LFxuICAgICAgXSBzYXRpc2ZpZXMgT3V0cHV0W11cbiAgICB9XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBwcml2YXRlIHNldEVudklmTm90RXhpc3RzKGVudjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudltlbnZdKSB7XG4gICAgICB0aGlzLmVudnNbZW52XSA9IHZhbHVlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVKc0JpbmRpbmdPcHRpb25zIHtcbiAgcGxhdGZvcm0/OiBib29sZWFuXG4gIG5vSnNCaW5kaW5nPzogYm9vbGVhblxuICBpZGVudHM6IHN0cmluZ1tdXG4gIGpzQmluZGluZz86IHN0cmluZ1xuICBlc20/OiBib29sZWFuXG4gIGJpbmFyeU5hbWU6IHN0cmluZ1xuICBwYWNrYWdlTmFtZTogc3RyaW5nXG4gIHZlcnNpb246IHN0cmluZ1xuICBvdXRwdXREaXI6IHN0cmluZ1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVKc0JpbmRpbmcoXG4gIG9wdGlvbnM6IFdyaXRlSnNCaW5kaW5nT3B0aW9ucyxcbik6IFByb21pc2U8T3V0cHV0IHwgdW5kZWZpbmVkPiB7XG4gIGlmIChcbiAgICAhb3B0aW9ucy5wbGF0Zm9ybSB8fFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIG9wdGlvbnMubm9Kc0JpbmRpbmcgfHxcbiAgICBvcHRpb25zLmlkZW50cy5sZW5ndGggPT09IDBcbiAgKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBuYW1lID0gb3B0aW9ucy5qc0JpbmRpbmcgPz8gJ2luZGV4LmpzJ1xuXG4gIGNvbnN0IGNyZWF0ZUJpbmRpbmcgPSBvcHRpb25zLmVzbSA/IGNyZWF0ZUVzbUJpbmRpbmcgOiBjcmVhdGVDanNCaW5kaW5nXG4gIGNvbnN0IGJpbmRpbmcgPSBjcmVhdGVCaW5kaW5nKFxuICAgIG9wdGlvbnMuYmluYXJ5TmFtZSxcbiAgICBvcHRpb25zLnBhY2thZ2VOYW1lLFxuICAgIG9wdGlvbnMuaWRlbnRzLFxuICAgIC8vIGluIG5wbSBwcmV2ZXJzaW9uIGhvb2tcbiAgICBvcHRpb25zLnZlcnNpb24sXG4gIClcblxuICB0cnkge1xuICAgIGNvbnN0IGRlc3QgPSBqb2luKG9wdGlvbnMub3V0cHV0RGlyLCBuYW1lKVxuICAgIGRlYnVnKCdXcml0aW5nIGpzIGJpbmRpbmcgdG86JylcbiAgICBkZWJ1ZygnICAlaScsIGRlc3QpXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoZGVzdCwgYmluZGluZywgJ3V0Zi04JylcbiAgICByZXR1cm4geyBraW5kOiAnanMnLCBwYXRoOiBkZXN0IH0gc2F0aXNmaWVzIE91dHB1dFxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gd3JpdGUganMgYmluZGluZyBmaWxlJywgeyBjYXVzZTogZSB9KVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVUeXBlRGVmT3B0aW9ucyB7XG4gIHR5cGVEZWZEaXI6IHN0cmluZ1xuICBub0R0c0hlYWRlcj86IGJvb2xlYW5cbiAgZHRzSGVhZGVyPzogc3RyaW5nXG4gIGR0c0hlYWRlckZpbGU/OiBzdHJpbmdcbiAgY29uZmlnRHRzSGVhZGVyPzogc3RyaW5nXG4gIGNvbmZpZ0R0c0hlYWRlckZpbGU/OiBzdHJpbmdcbiAgY29uc3RFbnVtPzogYm9vbGVhblxuICBydW50aW1lU3RyaW5nRW51bT86IGJvb2xlYW5cbiAgY3dkOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBXYWxrIHRoZSBuYXBpLWRlcml2ZSBpbnRlcm1lZGlhdGUgdHlwZS1kZWYgZGlyZWN0b3J5LCByZW5kZXIgZXZlcnkgZW50cnlcbiAqIGludG8gVHlwZVNjcmlwdCB2aWEge0BsaW5rIHByb2Nlc3NUeXBlRGVmfSwgYW5kIHJldHVybiB0aGUgY29uY2F0ZW5hdGVkXG4gKiBgLmQudHNgIHNvdXJjZSBwbHVzIHRoZSBsaXN0IG9mIGlkZW50aWZpZXJzIHRvIHJlLWV4cG9ydCBmcm9tXG4gKiBgaW5kZXguanNgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlRGVmKFxuICBvcHRpb25zOiBHZW5lcmF0ZVR5cGVEZWZPcHRpb25zLFxuKTogUHJvbWlzZTx7IGV4cG9ydHM6IHN0cmluZ1tdOyBkdHM6IHN0cmluZyB9PiB7XG4gIGlmICghKGF3YWl0IGRpckV4aXN0c0FzeW5jKG9wdGlvbnMudHlwZURlZkRpcikpKSB7XG4gICAgcmV0dXJuIHsgZXhwb3J0czogW10sIGR0czogJycgfVxuICB9XG5cbiAgbGV0IGhlYWRlciA9ICcnXG4gIGxldCBkdHMgPSAnJ1xuICBsZXQgZXhwb3J0czogc3RyaW5nW10gPSBbXVxuXG4gIGlmICghb3B0aW9ucy5ub0R0c0hlYWRlcikge1xuICAgIGNvbnN0IGR0c0hlYWRlciA9IG9wdGlvbnMuZHRzSGVhZGVyID8/IG9wdGlvbnMuY29uZmlnRHRzSGVhZGVyXG4gICAgLy8gYGR0c0hlYWRlckZpbGVgIGluIGNvbmZpZyA+IGBkdHNIZWFkZXJgIGluIGNsaSBmbGFnID4gYGR0c0hlYWRlcmAgaW4gY29uZmlnXG4gICAgaWYgKG9wdGlvbnMuY29uZmlnRHRzSGVhZGVyRmlsZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGVhZGVyID0gYXdhaXQgcmVhZEZpbGVBc3luYyhcbiAgICAgICAgICBqb2luKG9wdGlvbnMuY3dkLCBvcHRpb25zLmNvbmZpZ0R0c0hlYWRlckZpbGUpLFxuICAgICAgICAgICd1dGYtOCcsXG4gICAgICAgIClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGVidWcud2FybihcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgZHRzIGhlYWRlciBmaWxlICR7b3B0aW9ucy5jb25maWdEdHNIZWFkZXJGaWxlfWAsXG4gICAgICAgICAgZSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZHRzSGVhZGVyKSB7XG4gICAgICBoZWFkZXIgPSBkdHNIZWFkZXJcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyID0gREVGQVVMVF9UWVBFX0RFRl9IRUFERVJcbiAgICB9XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlYWRkaXJBc3luYyhvcHRpb25zLnR5cGVEZWZEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuXG4gIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgZGVidWcoJ05vIHR5cGUgZGVmIGZpbGVzIGZvdW5kLiBTa2lwIGdlbmVyYXRpbmcgZHRzIGZpbGUuJylcbiAgICByZXR1cm4geyBleHBvcnRzOiBbXSwgZHRzOiAnJyB9XG4gIH1cblxuICBjb25zdCB0eXBlRGVmRmlsZXMgPSBmaWxlc1xuICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUuaXNGaWxlKCkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpXG5cbiAgY29uc3QgY29uc3RFbnVtID0gb3B0aW9ucy5jb25zdEVudW0gPz8gdHJ1ZVxuICBjb25zdCBydW50aW1lU3RyaW5nRW51bSA9IG9wdGlvbnMucnVudGltZVN0cmluZ0VudW0gPz8gZmFsc2VcbiAgaWYgKHJ1bnRpbWVTdHJpbmdFbnVtICYmIGNvbnN0RW51bSkge1xuICAgIGRlYnVnLndhcm4oXG4gICAgICAnYC0tcnVudGltZS1zdHJpbmctZW51bWAgaGFzIG5vIGVmZmVjdCB3aGVuIGAtLWNvbnN0LWVudW1gIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KS4gUGFzcyBgLS1uby1jb25zdC1lbnVtYCB0byBhY3RpdmF0ZSBydW50aW1lIHN0cmluZyBlbnVtIGVtaXNzaW9uLicsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgcHJvY2Vzc2VkVHlwZURlZnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICB0eXBlRGVmRmlsZXMubWFwKChmaWxlKSA9PlxuICAgICAgcHJvY2Vzc1R5cGVEZWYoXG4gICAgICAgIGpvaW4ob3B0aW9ucy50eXBlRGVmRGlyLCBmaWxlLm5hbWUpLFxuICAgICAgICBjb25zdEVudW0sXG4gICAgICAgIHJ1bnRpbWVTdHJpbmdFbnVtLFxuICAgICAgKSxcbiAgICApLFxuICApXG5cbiAgZHRzID0gcHJvY2Vzc2VkVHlwZURlZnMubWFwKCh7IGR0cyB9KSA9PiBkdHMpLmpvaW4oJycpXG4gIGV4cG9ydHMgPSBwcm9jZXNzZWRUeXBlRGVmcy5mbGF0TWFwKCh7IGV4cG9ydHMgfSkgPT4gZXhwb3J0cylcblxuICBpZiAoZHRzLmluZGV4T2YoJ0V4dGVybmFsT2JqZWN0PCcpID4gLTEpIHtcbiAgICBoZWFkZXIgKz0gYFxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgRXh0ZXJuYWxPYmplY3Q8VD4ge1xuICByZWFkb25seSAnJzoge1xuICAgIHJlYWRvbmx5ICcnOiB1bmlxdWUgc3ltYm9sXG4gICAgW0s6IHN5bWJvbF06IFRcbiAgfVxufVxuYFxuICB9XG5cbiAgaWYgKGR0cy5pbmRleE9mKCdUeXBlZEFycmF5JykgPiAtMSkge1xuICAgIGhlYWRlciArPSBgXG5leHBvcnQgdHlwZSBUeXBlZEFycmF5ID0gSW50OEFycmF5IHwgVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5IHwgSW50MTZBcnJheSB8IFVpbnQxNkFycmF5IHwgSW50MzJBcnJheSB8IFVpbnQzMkFycmF5IHwgRmxvYXQzMkFycmF5IHwgRmxvYXQ2NEFycmF5IHwgQmlnSW50NjRBcnJheSB8IEJpZ1VpbnQ2NEFycmF5XG5gXG4gIH1cblxuICBkdHMgPSBoZWFkZXIgKyBkdHNcblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHMsXG4gICAgZHRzLFxuICB9XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNyZWF0ZU5wbURpcnNDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ2NyZWF0ZS1ucG0tZGlycyddXVxuXG4gIHN0YXRpYyB1c2FnZSA9IENvbW1hbmQuVXNhZ2Uoe1xuICAgIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIG5wbSBwYWNrYWdlIGRpcnMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMnLFxuICB9KVxuXG4gIGN3ZCA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywgcHJvY2Vzcy5jd2QoKSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgY29uZmlnUGF0aD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY29uZmlnLXBhdGgsLWMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlJyxcbiAgfSlcblxuICBwYWNrYWdlSnNvblBhdGggPSBPcHRpb24uU3RyaW5nKCctLXBhY2thZ2UtanNvbi1wYXRoJywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIG5wbURpciA9IE9wdGlvbi5TdHJpbmcoJy0tbnBtLWRpcicsICducG0nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXQnLFxuICB9KVxuXG4gIGRyeVJ1biA9IE9wdGlvbi5Cb29sZWFuKCctLWRyeS1ydW4nLCBmYWxzZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnRHJ5IHJ1biB3aXRob3V0IHRvdWNoaW5nIGZpbGUgc3lzdGVtJyxcbiAgfSlcblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIG5wbURpcjogdGhpcy5ucG1EaXIsXG4gICAgICBkcnlSdW46IHRoaXMuZHJ5UnVuLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBucG0gcGFja2FnZSBkaXJzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTnBtRGlyc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoXG4gICAqXG4gICAqIEBkZWZhdWx0IHByb2Nlc3MuY3dkKClcbiAgICovXG4gIGN3ZD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZVxuICAgKi9cbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgcGFja2FnZS5qc29uYFxuICAgKlxuICAgKiBAZGVmYXVsdCAncGFja2FnZS5qc29uJ1xuICAgKi9cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXRcbiAgICpcbiAgICogQGRlZmF1bHQgJ25wbSdcbiAgICovXG4gIG5wbURpcj86IHN0cmluZ1xuICAvKipcbiAgICogRHJ5IHJ1biB3aXRob3V0IHRvdWNoaW5nIGZpbGUgc3lzdGVtXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkcnlSdW4/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRDcmVhdGVOcG1EaXJzT3B0aW9ucyhcbiAgb3B0aW9uczogQ3JlYXRlTnBtRGlyc09wdGlvbnMsXG4pIHtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgcGFja2FnZUpzb25QYXRoOiAncGFja2FnZS5qc29uJyxcbiAgICBucG1EaXI6ICducG0nLFxuICAgIGRyeVJ1bjogZmFsc2UsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHsgQ29tcGFyYXRvciwgUmFuZ2UsIG1pblZlcnNpb24sIHN1YnNldCB9IGZyb20gJ3NlbXZlcidcblxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuY29uc3QgbWluaW11bVdhc2lOb2RlVmVyc2lvbiA9ICc+PTE0LjAuMCdcblxuaW1wb3J0IHtcbiAgYXBwbHlEZWZhdWx0Q3JlYXRlTnBtRGlyc09wdGlvbnMsXG4gIHR5cGUgQ3JlYXRlTnBtRGlyc09wdGlvbnMsXG59IGZyb20gJy4uL2RlZi9jcmVhdGUtbnBtLWRpcnMuanMnXG5pbXBvcnQge1xuICBkZWJ1Z0ZhY3RvcnksXG4gIHJlYWROYXBpQ29uZmlnLFxuICBta2RpckFzeW5jIGFzIHJhd01rZGlyQXN5bmMsXG4gIHBpY2ssXG4gIHdyaXRlRmlsZUFzeW5jIGFzIHJhd1dyaXRlRmlsZUFzeW5jLFxuICB0eXBlIFRhcmdldCxcbiAgdHlwZSBDb21tb25QYWNrYWdlSnNvbkZpZWxkcyxcbn0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCdjcmVhdGUtbnBtLWRpcnMnKVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VNZXRhIHtcbiAgJ2Rpc3QtdGFncyc6IHsgW2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfVxufVxuXG5jb25zdCBXQVNNX1JVTlRJTUVfUEFDS0FHRV9OQU1FID0gJ0BuYXBpLXJzL3dhc20tcnVudGltZSdcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0V2FzbVJ1bnRpbWVWZXJzaW9uKCkge1xuICBjb25zdCBucG1SZWdpc3RyeUJhc2UgPVxuICAgIHByb2Nlc3MuZW52Lm5wbV9jb25maWdfcmVnaXN0cnk/LnJlcGxhY2UoL1xcLz8kLywgJy8nKSA/P1xuICAgICdodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8nXG4gIGNvbnN0IHBhY2thZ2VNZXRhZGF0YVVybCA9IGAke25wbVJlZ2lzdHJ5QmFzZX0ke1dBU01fUlVOVElNRV9QQUNLQUdFX05BTUV9YFxuICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlXG5cbiAgdHJ5IHtcbiAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHBhY2thZ2VNZXRhZGF0YVVybClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGZldGNoICR7cGFja2FnZU1ldGFkYXRhVXJsfSB3aGlsZSByZXNvbHZpbmcgJHtXQVNNX1JVTlRJTUVfUEFDS0FHRV9OQU1FfS4gQ2hlY2sgeW91ciBuZXR3b3JrIGNvbm5lY3Rpb24gYW5kIG5wbSByZWdpc3RyeSBhdmFpbGFiaWxpdHkuYCxcbiAgICAgIHsgY2F1c2U6IGVycm9yIH0sXG4gICAgKVxuICB9XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggJHtwYWNrYWdlTWV0YWRhdGFVcmx9IHdoaWxlIHJlc29sdmluZyAke1dBU01fUlVOVElNRV9QQUNLQUdFX05BTUV9OiBucG0gcmVnaXN0cnkgcmVzcG9uZGVkIHdpdGggJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dCB8fCAnVW5rbm93biBTdGF0dXMnfWAsXG4gICAgKVxuICB9XG5cbiAgbGV0IHBhY2thZ2VNZXRhOiBQYWNrYWdlTWV0YVxuXG4gIHRyeSB7XG4gICAgcGFja2FnZU1ldGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBQYWNrYWdlTWV0YVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcGFyc2UgbnBtIHJlZ2lzdHJ5IG1ldGFkYXRhIGZvciAke1dBU01fUlVOVElNRV9QQUNLQUdFX05BTUV9IGZyb20gJHtwYWNrYWdlTWV0YWRhdGFVcmx9YCxcbiAgICAgIHsgY2F1c2U6IGVycm9yIH0sXG4gICAgKVxuICB9XG5cbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHBhY2thZ2VNZXRhWydkaXN0LXRhZ3MnXT8ubGF0ZXN0XG5cbiAgaWYgKHR5cGVvZiBsYXRlc3RWZXJzaW9uICE9PSAnc3RyaW5nJyB8fCBsYXRlc3RWZXJzaW9uLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgbnBtIHJlZ2lzdHJ5IG1ldGFkYXRhIGZvciAke1dBU01fUlVOVElNRV9QQUNLQUdFX05BTUV9IGZyb20gJHtwYWNrYWdlTWV0YWRhdGFVcmx9IGRpZCBub3QgaW5jbHVkZSBhIGxhdGVzdCBkaXN0LXRhZ2AsXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxhdGVzdFZlcnNpb24udHJpbSgpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVOcG1EaXJzKHVzZXJPcHRpb25zOiBDcmVhdGVOcG1EaXJzT3B0aW9ucykge1xuICBjb25zdCBvcHRpb25zID0gYXBwbHlEZWZhdWx0Q3JlYXRlTnBtRGlyc09wdGlvbnModXNlck9wdGlvbnMpXG5cbiAgYXN5bmMgZnVuY3Rpb24gbWtkaXJBc3luYyhkaXI6IHN0cmluZykge1xuICAgIGRlYnVnKCdUcnkgdG8gY3JlYXRlIGRpcjogJWknLCBkaXIpXG4gICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCByYXdNa2RpckFzeW5jKGRpciwge1xuICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB3cml0ZUZpbGVBc3luYyhmaWxlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykge1xuICAgIGRlYnVnKCdXcml0aW5nIGZpbGUgJWknLCBmaWxlKVxuXG4gICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICBkZWJ1Zyhjb250ZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgcmF3V3JpdGVGaWxlQXN5bmMoZmlsZSwgY29udGVudClcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMucGFja2FnZUpzb25QYXRoKVxuICBjb25zdCBucG1QYXRoID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5ucG1EaXIpXG5cbiAgZGVidWcoYFJlYWQgY29udGVudCBmcm9tIFske29wdGlvbnMuY29uZmlnUGF0aCA/PyBwYWNrYWdlSnNvblBhdGh9XWApXG5cbiAgY29uc3QgeyB0YXJnZXRzLCBiaW5hcnlOYW1lLCBwYWNrYWdlTmFtZSwgcGFja2FnZUpzb24gfSA9XG4gICAgYXdhaXQgcmVhZE5hcGlDb25maWcoXG4gICAgICBwYWNrYWdlSnNvblBhdGgsXG4gICAgICBvcHRpb25zLmNvbmZpZ1BhdGggPyByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLmNvbmZpZ1BhdGgpIDogdW5kZWZpbmVkLFxuICAgIClcbiAgY29uc3Qgd2FzbVJ1bnRpbWVWZXJzaW9uID0gdGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5hcmNoID09PSAnd2FzbTMyJylcbiAgICA/IGF3YWl0IGdldExhdGVzdFdhc21SdW50aW1lVmVyc2lvbigpXG4gICAgOiB1bmRlZmluZWRcblxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgY29uc3QgdGFyZ2V0RGlyID0gam9pbihucG1QYXRoLCBgJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfWApXG4gICAgYXdhaXQgbWtkaXJBc3luYyh0YXJnZXREaXIpXG5cbiAgICBjb25zdCBiaW5hcnlGaWxlTmFtZSA9XG4gICAgICB0YXJnZXQuYXJjaCA9PT0gJ3dhc20zMidcbiAgICAgICAgPyBgJHtiaW5hcnlOYW1lfS4ke3RhcmdldC5wbGF0Zm9ybUFyY2hBQkl9Lndhc21gXG4gICAgICAgIDogYCR7YmluYXJ5TmFtZX0uJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfS5ub2RlYFxuICAgIGNvbnN0IHNjb3BlZFBhY2thZ2VKc29uOiBDb21tb25QYWNrYWdlSnNvbkZpZWxkcyA9IHtcbiAgICAgIG5hbWU6IGAke3BhY2thZ2VOYW1lfS0ke3RhcmdldC5wbGF0Zm9ybUFyY2hBQkl9YCxcbiAgICAgIHZlcnNpb246IHBhY2thZ2VKc29uLnZlcnNpb24sXG4gICAgICBjcHU6IHRhcmdldC5hcmNoICE9PSAndW5pdmVyc2FsJyA/IFt0YXJnZXQuYXJjaF0gOiB1bmRlZmluZWQsXG4gICAgICBtYWluOiBiaW5hcnlGaWxlTmFtZSxcbiAgICAgIGZpbGVzOiBbYmluYXJ5RmlsZU5hbWVdLFxuICAgICAgLi4ucGljayhcbiAgICAgICAgcGFja2FnZUpzb24sXG4gICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICdrZXl3b3JkcycsXG4gICAgICAgICdhdXRob3InLFxuICAgICAgICAnYXV0aG9ycycsXG4gICAgICAgICdob21lcGFnZScsXG4gICAgICAgICdsaWNlbnNlJyxcbiAgICAgICAgJ2VuZ2luZXMnLFxuICAgICAgICAncmVwb3NpdG9yeScsXG4gICAgICAgICdidWdzJyxcbiAgICAgICksXG4gICAgfVxuICAgIGlmIChwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnKSB7XG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnID0gcGljayhcbiAgICAgICAgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZyxcbiAgICAgICAgJ3JlZ2lzdHJ5JyxcbiAgICAgICAgJ2FjY2VzcycsXG4gICAgICApXG4gICAgfVxuICAgIGlmICh0YXJnZXQuYXJjaCAhPT0gJ3dhc20zMicpIHtcbiAgICAgIHNjb3BlZFBhY2thZ2VKc29uLm9zID0gW3RhcmdldC5wbGF0Zm9ybV1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZW50cnkgPSBgJHtiaW5hcnlOYW1lfS53YXNpLmNqc2BcbiAgICAgIHNjb3BlZFBhY2thZ2VKc29uLm1haW4gPSBlbnRyeVxuICAgICAgc2NvcGVkUGFja2FnZUpzb24uYnJvd3NlciA9IGAke2JpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2BcbiAgICAgIHNjb3BlZFBhY2thZ2VKc29uLmZpbGVzPy5wdXNoKFxuICAgICAgICBlbnRyeSxcbiAgICAgICAgc2NvcGVkUGFja2FnZUpzb24uYnJvd3NlcixcbiAgICAgICAgYHdhc2ktd29ya2VyLm1qc2AsXG4gICAgICAgIGB3YXNpLXdvcmtlci1icm93c2VyLm1qc2AsXG4gICAgICApXG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5lbmdpbmVzID0ge1xuICAgICAgICAuLi5zY29wZWRQYWNrYWdlSnNvbi5lbmdpbmVzLFxuICAgICAgICBub2RlOiBzY29wZWRQYWNrYWdlSnNvbi5lbmdpbmVzPy5ub2RlXG4gICAgICAgICAgPyByZXN0cmljdFdhc2lOb2RlRW5naW5lKHNjb3BlZFBhY2thZ2VKc29uLmVuZ2luZXMubm9kZSlcbiAgICAgICAgICA6IG1pbmltdW1XYXNpTm9kZVZlcnNpb24sXG4gICAgICB9XG4gICAgICBjb25zdCBlbW5hcGlWZXJzaW9uID0gcmVxdWlyZSgnZW1uYXBpL3BhY2thZ2UuanNvbicpLnZlcnNpb25cbiAgICAgIHNjb3BlZFBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA9IHtcbiAgICAgICAgJ0BuYXBpLXJzL3dhc20tcnVudGltZSc6IGBeJHt3YXNtUnVudGltZVZlcnNpb259YCxcbiAgICAgICAgJ0BlbW5hcGkvY29yZSc6IGVtbmFwaVZlcnNpb24sXG4gICAgICAgICdAZW1uYXBpL3J1bnRpbWUnOiBlbW5hcGlWZXJzaW9uLFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0YXJnZXQuYWJpID09PSAnZ251Jykge1xuICAgICAgc2NvcGVkUGFja2FnZUpzb24ubGliYyA9IFsnZ2xpYmMnXVxuICAgIH0gZWxzZSBpZiAodGFyZ2V0LmFiaSA9PT0gJ211c2wnKSB7XG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5saWJjID0gWydtdXNsJ11cbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRQYWNrYWdlSnNvbiA9IGpvaW4odGFyZ2V0RGlyLCAncGFja2FnZS5qc29uJylcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgIHRhcmdldFBhY2thZ2VKc29uLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoc2NvcGVkUGFja2FnZUpzb24sIG51bGwsIDIpICsgJ1xcbicsXG4gICAgKVxuICAgIGNvbnN0IHRhcmdldFJlYWRtZSA9IGpvaW4odGFyZ2V0RGlyLCAnUkVBRE1FLm1kJylcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyh0YXJnZXRSZWFkbWUsIHJlYWRtZShwYWNrYWdlTmFtZSwgdGFyZ2V0KSlcblxuICAgIGRlYnVnLmluZm8oYCR7cGFja2FnZU5hbWV9IC0ke3RhcmdldC5wbGF0Zm9ybUFyY2hBQkl9IGNyZWF0ZWRgKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRtZShwYWNrYWdlTmFtZTogc3RyaW5nLCB0YXJnZXQ6IFRhcmdldCkge1xuICByZXR1cm4gYCMgXFxgJHtwYWNrYWdlTmFtZX0tJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfVxcYFxuXG5UaGlzIGlzIHRoZSAqKiR7dGFyZ2V0LnRyaXBsZX0qKiBiaW5hcnkgZm9yIFxcYCR7cGFja2FnZU5hbWV9XFxgXG5gXG59XG5cbmZ1bmN0aW9uIHJlc3RyaWN0V2FzaU5vZGVFbmdpbmUobm9kZVJhbmdlOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBpZiAoc3Vic2V0KG5vZGVSYW5nZSwgbWluaW11bVdhc2lOb2RlVmVyc2lvbikpIHtcbiAgICAgIHJldHVybiBub2RlUmFuZ2VcbiAgICB9XG5cbiAgICBpZiAoc3Vic2V0KG1pbmltdW1XYXNpTm9kZVZlcnNpb24sIG5vZGVSYW5nZSkpIHtcbiAgICAgIHJldHVybiBtaW5pbXVtV2FzaU5vZGVWZXJzaW9uXG4gICAgfVxuXG4gICAgY29uc3QgbWluaW11bUNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcihtaW5pbXVtV2FzaU5vZGVWZXJzaW9uKVxuICAgIGNvbnN0IHJlc3RyaWN0ZWRSYW5nZVNldHMgPSBuZXcgUmFuZ2Uobm9kZVJhbmdlKS5zZXRcbiAgICAgIC5tYXAoKGNvbXBhcmF0b3JzKSA9PlxuICAgICAgICBub3JtYWxpemVDb21wYXJhdG9yU2V0KFsuLi5jb21wYXJhdG9ycywgbWluaW11bUNvbXBhcmF0b3JdKSxcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChjYW5kaWRhdGUpOiBjYW5kaWRhdGUgaXMgc3RyaW5nID0+XG4gICAgICAgICAgY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgbWluVmVyc2lvbihjYW5kaWRhdGUpICE9PSBudWxsLFxuICAgICAgKVxuXG4gICAgaWYgKHJlc3RyaWN0ZWRSYW5nZVNldHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHJlc3RyaWN0ZWRSYW5nZVNldHMuam9pbignIHx8ICcpXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmVcbiAgfVxuXG4gIHJldHVybiBtaW5pbXVtV2FzaU5vZGVWZXJzaW9uXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBhcmF0b3JTZXQoY29tcGFyYXRvcnM6IENvbXBhcmF0b3JbXSkge1xuICBjb25zdCBleGFjdE1hdGNoID0gY29tcGFyYXRvcnMuZmluZCgoeyBvcGVyYXRvciB9KSA9PiBvcGVyYXRvciA9PT0gJycpXG4gIGlmIChleGFjdE1hdGNoKSB7XG4gICAgcmV0dXJuIGNvbXBhcmF0b3JzLmV2ZXJ5KChjb21wYXJhdG9yKSA9PiBjb21wYXJhdG9yLnRlc3QoZXhhY3RNYXRjaC5zZW12ZXIpKVxuICAgICAgPyBleGFjdE1hdGNoLnZhbHVlXG4gICAgICA6IHVuZGVmaW5lZFxuICB9XG5cbiAgbGV0IGxvd2VyQm91bmQ6IENvbXBhcmF0b3IgfCB1bmRlZmluZWRcbiAgbGV0IHVwcGVyQm91bmQ6IENvbXBhcmF0b3IgfCB1bmRlZmluZWRcblxuICBmb3IgKGNvbnN0IGNvbXBhcmF0b3Igb2YgY29tcGFyYXRvcnMpIHtcbiAgICBpZiAoY29tcGFyYXRvci5vcGVyYXRvciA9PT0gJz4nIHx8IGNvbXBhcmF0b3Iub3BlcmF0b3IgPT09ICc+PScpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWxvd2VyQm91bmQgfHxcbiAgICAgICAgY29tcGFyYXRvci5zZW12ZXIuY29tcGFyZShsb3dlckJvdW5kLnNlbXZlcikgPiAwIHx8XG4gICAgICAgIChjb21wYXJhdG9yLnNlbXZlci5jb21wYXJlKGxvd2VyQm91bmQuc2VtdmVyKSA9PT0gMCAmJlxuICAgICAgICAgIGNvbXBhcmF0b3Iub3BlcmF0b3IgPT09ICc+JylcbiAgICAgICkge1xuICAgICAgICBsb3dlckJvdW5kID0gY29tcGFyYXRvclxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29tcGFyYXRvci5vcGVyYXRvciA9PT0gJzwnIHx8IGNvbXBhcmF0b3Iub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXVwcGVyQm91bmQgfHxcbiAgICAgICAgY29tcGFyYXRvci5zZW12ZXIuY29tcGFyZSh1cHBlckJvdW5kLnNlbXZlcikgPCAwIHx8XG4gICAgICAgIChjb21wYXJhdG9yLnNlbXZlci5jb21wYXJlKHVwcGVyQm91bmQuc2VtdmVyKSA9PT0gMCAmJlxuICAgICAgICAgIGNvbXBhcmF0b3Iub3BlcmF0b3IgPT09ICc8JylcbiAgICAgICkge1xuICAgICAgICB1cHBlckJvdW5kID0gY29tcGFyYXRvclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbbG93ZXJCb3VuZD8udmFsdWUsIHVwcGVyQm91bmQ/LnZhbHVlXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpXG59XG4iLCIvLyBDb3B5cmlnaHQgMjAxOC0yMDI1IHRoZSBEZW5vIGF1dGhvcnMuIE1JVCBsaWNlbnNlLlxuLy8gVGhpcyBtb2R1bGUgaXMgYnJvd3NlciBjb21wYXRpYmxlLlxuLy8gQmFyZSBrZXlzIG1heSBvbmx5IGNvbnRhaW4gQVNDSUkgbGV0dGVycyxcbi8vIEFTQ0lJIGRpZ2l0cywgdW5kZXJzY29yZXMsIGFuZCBkYXNoZXMgKEEtWmEtejAtOV8tKS5cbmZ1bmN0aW9uIGpvaW5LZXlzKGtleXMpIHtcbiAgLy8gRG90dGVkIGtleXMgYXJlIGEgc2VxdWVuY2Ugb2YgYmFyZSBvciBxdW90ZWQga2V5cyBqb2luZWQgd2l0aCBhIGRvdC5cbiAgLy8gVGhpcyBhbGxvd3MgZm9yIGdyb3VwaW5nIHNpbWlsYXIgcHJvcGVydGllcyB0b2dldGhlcjpcbiAgcmV0dXJuIGtleXMubWFwKChzdHIpPT57XG4gICAgcmV0dXJuIHN0ci5sZW5ndGggPT09IDAgfHwgc3RyLm1hdGNoKC9bXkEtWmEtejAtOV8tXS8pID8gSlNPTi5zdHJpbmdpZnkoc3RyKSA6IHN0cjtcbiAgfSkuam9pbihcIi5cIik7XG59XG5jbGFzcyBEdW1wZXIge1xuICBtYXhQYWQgPSAwO1xuICBzcmNPYmplY3Q7XG4gIG91dHB1dCA9IFtdO1xuICAjYXJyYXlUeXBlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gIGNvbnN0cnVjdG9yKHNyY09iamMpe1xuICAgIHRoaXMuc3JjT2JqZWN0ID0gc3JjT2JqYztcbiAgfVxuICBkdW1wKGZtdE9wdGlvbnMgPSB7fSkge1xuICAgIC8vIGRlbm8tbGludC1pZ25vcmUgbm8tZXhwbGljaXQtYW55XG4gICAgdGhpcy5vdXRwdXQgPSB0aGlzLiNwcmludE9iamVjdCh0aGlzLnNyY09iamVjdCk7XG4gICAgdGhpcy5vdXRwdXQgPSB0aGlzLiNmb3JtYXQoZm10T3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0O1xuICB9XG4gICNwcmludE9iamVjdChvYmosIGtleXMgPSBbXSkge1xuICAgIGNvbnN0IG91dCA9IFtdO1xuICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICBjb25zdCBpbmxpbmVQcm9wcyA9IFtdO1xuICAgIGNvbnN0IG11bHRpbGluZVByb3BzID0gW107XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKXtcbiAgICAgIGlmICh0aGlzLiNpc1NpbXBseVNlcmlhbGl6YWJsZShvYmpbcHJvcF0pKSB7XG4gICAgICAgIGlubGluZVByb3BzLnB1c2gocHJvcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdWx0aWxpbmVQcm9wcy5wdXNoKHByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzb3J0ZWRQcm9wcyA9IGlubGluZVByb3BzLmNvbmNhdChtdWx0aWxpbmVQcm9wcyk7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHNvcnRlZFByb3BzKXtcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW3Byb3BdO1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBvdXQucHVzaCh0aGlzLiNkYXRlRGVjbGFyYXRpb24oW1xuICAgICAgICAgIHByb3BcbiAgICAgICAgXSwgdmFsdWUpKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIG91dC5wdXNoKHRoaXMuI3N0ckRlY2xhcmF0aW9uKFtcbiAgICAgICAgICBwcm9wXG4gICAgICAgIF0sIHZhbHVlLnRvU3RyaW5nKCkpKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIG91dC5wdXNoKHRoaXMuI251bWJlckRlY2xhcmF0aW9uKFtcbiAgICAgICAgICBwcm9wXG4gICAgICAgIF0sIHZhbHVlKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgb3V0LnB1c2godGhpcy4jYm9vbERlY2xhcmF0aW9uKFtcbiAgICAgICAgICBwcm9wXG4gICAgICAgIF0sIHZhbHVlKSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgY29uc3QgYXJyYXlUeXBlID0gdGhpcy4jZ2V0VHlwZU9mQXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoYXJyYXlUeXBlID09PSBcIk9OTFlfUFJJTUlUSVZFXCIpIHtcbiAgICAgICAgICBvdXQucHVzaCh0aGlzLiNhcnJheURlY2xhcmF0aW9uKFtcbiAgICAgICAgICAgIHByb3BcbiAgICAgICAgICBdLCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGFycmF5VHlwZSA9PT0gXCJPTkxZX09CSkVDVF9FWENMVURJTkdfQVJSQVlcIikge1xuICAgICAgICAgIC8vIGFycmF5IG9mIG9iamVjdHNcbiAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgb3V0LnB1c2goXCJcIik7XG4gICAgICAgICAgICBvdXQucHVzaCh0aGlzLiNoZWFkZXJHcm91cChbXG4gICAgICAgICAgICAgIC4uLmtleXMsXG4gICAgICAgICAgICAgIHByb3BcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgIG91dC5wdXNoKC4uLnRoaXMuI3ByaW50T2JqZWN0KHZhbHVlW2ldLCBbXG4gICAgICAgICAgICAgIC4uLmtleXMsXG4gICAgICAgICAgICAgIHByb3BcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyBhIGNvbXBsZXggYXJyYXksIHVzZSB0aGUgaW5saW5lIGZvcm1hdC5cbiAgICAgICAgICBjb25zdCBzdHIgPSB2YWx1ZS5tYXAoKHgpPT50aGlzLiNwcmludEFzSW5saW5lVmFsdWUoeCkpLmpvaW4oXCIsXCIpO1xuICAgICAgICAgIG91dC5wdXNoKGAke3RoaXMuI2RlY2xhcmF0aW9uKFtcbiAgICAgICAgICAgIHByb3BcbiAgICAgICAgICBdKX1bJHtzdHJ9XWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBvdXQucHVzaChcIlwiKTtcbiAgICAgICAgb3V0LnB1c2godGhpcy4jaGVhZGVyKFtcbiAgICAgICAgICAuLi5rZXlzLFxuICAgICAgICAgIHByb3BcbiAgICAgICAgXSkpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBjb25zdCB0b1BhcnNlID0gdmFsdWU7XG4gICAgICAgICAgb3V0LnB1c2goLi4udGhpcy4jcHJpbnRPYmplY3QodG9QYXJzZSwgW1xuICAgICAgICAgICAgLi4ua2V5cyxcbiAgICAgICAgICAgIHByb3BcbiAgICAgICAgICBdKSk7XG4gICAgICAgIH1cbiAgICAgIC8vIG91dC5wdXNoKC4uLnRoaXMuX3BhcnNlKHZhbHVlLCBgJHtwYXRofSR7cHJvcH0uYCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBvdXQucHVzaChcIlwiKTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG4gICNpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHwgW1xuICAgICAgXCJzdHJpbmdcIixcbiAgICAgIFwibnVtYmVyXCIsXG4gICAgICBcImJvb2xlYW5cIlxuICAgIF0uaW5jbHVkZXModHlwZW9mIHZhbHVlKTtcbiAgfVxuICAjZ2V0VHlwZU9mQXJyYXkoYXJyKSB7XG4gICAgaWYgKHRoaXMuI2FycmF5VHlwZUNhY2hlLmhhcyhhcnIpKSB7XG4gICAgICByZXR1cm4gdGhpcy4jYXJyYXlUeXBlQ2FjaGUuZ2V0KGFycik7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLiNkb0dldFR5cGVPZkFycmF5KGFycik7XG4gICAgdGhpcy4jYXJyYXlUeXBlQ2FjaGUuc2V0KGFyciwgdHlwZSk7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbiAgI2RvR2V0VHlwZU9mQXJyYXkoYXJyKSB7XG4gICAgaWYgKCFhcnIubGVuZ3RoKSB7XG4gICAgICAvLyBhbnkgdHlwZSBzaG91bGQgYmUgZmluZVxuICAgICAgcmV0dXJuIFwiT05MWV9QUklNSVRJVkVcIjtcbiAgICB9XG4gICAgY29uc3Qgb25seVByaW1pdGl2ZSA9IHRoaXMuI2lzUHJpbWl0aXZlKGFyclswXSk7XG4gICAgaWYgKGFyclswXSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gXCJNSVhFRFwiO1xuICAgIH1cbiAgICBmb3IobGV0IGkgPSAxOyBpIDwgYXJyLmxlbmd0aDsgaSsrKXtcbiAgICAgIGlmIChvbmx5UHJpbWl0aXZlICE9PSB0aGlzLiNpc1ByaW1pdGl2ZShhcnJbaV0pIHx8IGFycltpXSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHJldHVybiBcIk1JWEVEXCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvbmx5UHJpbWl0aXZlID8gXCJPTkxZX1BSSU1JVElWRVwiIDogXCJPTkxZX09CSkVDVF9FWENMVURJTkdfQVJSQVlcIjtcbiAgfVxuICAjcHJpbnRBc0lubGluZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIGBcIiR7dGhpcy4jcHJpbnREYXRlKHZhbHVlKX1cImA7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZS50b1N0cmluZygpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjb25zdCBzdHIgPSB2YWx1ZS5tYXAoKHgpPT50aGlzLiNwcmludEFzSW5saW5lVmFsdWUoeCkpLmpvaW4oXCIsXCIpO1xuICAgICAgcmV0dXJuIGBbJHtzdHJ9XWA7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2hvdWxkIG5ldmVyIHJlYWNoXCIpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RyID0gT2JqZWN0LmtleXModmFsdWUpLm1hcCgoa2V5KT0+e1xuICAgICAgICByZXR1cm4gYCR7am9pbktleXMoW1xuICAgICAgICAgIGtleVxuICAgICAgICBdKX0gPSAkey8vIGRlbm8tbGludC1pZ25vcmUgbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHRoaXMuI3ByaW50QXNJbmxpbmVWYWx1ZSh2YWx1ZVtrZXldKX1gO1xuICAgICAgfSkuam9pbihcIixcIik7XG4gICAgICByZXR1cm4gYHske3N0cn19YDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU2hvdWxkIG5ldmVyIHJlYWNoXCIpO1xuICB9XG4gICNpc1NpbXBseVNlcmlhbGl6YWJsZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgdGhpcy4jZ2V0VHlwZU9mQXJyYXkodmFsdWUpICE9PSBcIk9OTFlfT0JKRUNUX0VYQ0xVRElOR19BUlJBWVwiO1xuICB9XG4gICNoZWFkZXIoa2V5cykge1xuICAgIHJldHVybiBgWyR7am9pbktleXMoa2V5cyl9XWA7XG4gIH1cbiAgI2hlYWRlckdyb3VwKGtleXMpIHtcbiAgICByZXR1cm4gYFtbJHtqb2luS2V5cyhrZXlzKX1dXWA7XG4gIH1cbiAgI2RlY2xhcmF0aW9uKGtleXMpIHtcbiAgICBjb25zdCB0aXRsZSA9IGpvaW5LZXlzKGtleXMpO1xuICAgIGlmICh0aXRsZS5sZW5ndGggPiB0aGlzLm1heFBhZCkge1xuICAgICAgdGhpcy5tYXhQYWQgPSB0aXRsZS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aXRsZX0gPSBgO1xuICB9XG4gICNhcnJheURlY2xhcmF0aW9uKGtleXMsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuI2RlY2xhcmF0aW9uKGtleXMpfSR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWA7XG4gIH1cbiAgI3N0ckRlY2xhcmF0aW9uKGtleXMsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuI2RlY2xhcmF0aW9uKGtleXMpfSR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWA7XG4gIH1cbiAgI251bWJlckRlY2xhcmF0aW9uKGtleXMsIHZhbHVlKSB7XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX1uYW5gO1xuICAgIH1cbiAgICBzd2l0Y2godmFsdWUpe1xuICAgICAgY2FzZSBJbmZpbml0eTpcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuI2RlY2xhcmF0aW9uKGtleXMpfWluZmA7XG4gICAgICBjYXNlIC1JbmZpbml0eTpcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuI2RlY2xhcmF0aW9uKGtleXMpfS1pbmZgO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuI2RlY2xhcmF0aW9uKGtleXMpfSR7dmFsdWV9YDtcbiAgICB9XG4gIH1cbiAgI2Jvb2xEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke3ZhbHVlfWA7XG4gIH1cbiAgI3ByaW50RGF0ZSh2YWx1ZSkge1xuICAgIGZ1bmN0aW9uIGR0UGFkKHYsIGxQYWQgPSAyKSB7XG4gICAgICByZXR1cm4gdi5wYWRTdGFydChsUGFkLCBcIjBcIik7XG4gICAgfVxuICAgIGNvbnN0IG0gPSBkdFBhZCgodmFsdWUuZ2V0VVRDTW9udGgoKSArIDEpLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IGQgPSBkdFBhZCh2YWx1ZS5nZXRVVENEYXRlKCkudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgaCA9IGR0UGFkKHZhbHVlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgbWluID0gZHRQYWQodmFsdWUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IHMgPSBkdFBhZCh2YWx1ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgbXMgPSBkdFBhZCh2YWx1ZS5nZXRVVENNaWxsaXNlY29uZHMoKS50b1N0cmluZygpLCAzKTtcbiAgICAvLyBmb3JtYXR0ZWQgZGF0ZVxuICAgIGNvbnN0IGZEYXRhID0gYCR7dmFsdWUuZ2V0VVRDRnVsbFllYXIoKX0tJHttfS0ke2R9VCR7aH06JHttaW59OiR7c30uJHttc31gO1xuICAgIHJldHVybiBmRGF0YTtcbiAgfVxuICAjZGF0ZURlY2xhcmF0aW9uKGtleXMsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuI2RlY2xhcmF0aW9uKGtleXMpfSR7dGhpcy4jcHJpbnREYXRlKHZhbHVlKX1gO1xuICB9XG4gICNmb3JtYXQob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBrZXlBbGlnbm1lbnQgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCByRGVjbGFyYXRpb24gPSAvXihcXFwiLipcXFwifFtePV0qKVxccz0vO1xuICAgIGNvbnN0IG91dCA9IFtdO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLm91dHB1dC5sZW5ndGg7IGkrKyl7XG4gICAgICBjb25zdCBsID0gdGhpcy5vdXRwdXRbaV07XG4gICAgICAvLyB3ZSBrZWVwIGVtcHR5IGVudHJ5IGZvciBhcnJheSBvZiBvYmplY3RzXG4gICAgICBpZiAobFswXSA9PT0gXCJbXCIgJiYgbFsxXSAhPT0gXCJbXCIpIHtcbiAgICAgICAgLy8gbm9uLWVtcHR5IG9iamVjdCB3aXRoIG9ubHkgc3Vib2JqZWN0cyBhcyBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICh0aGlzLm91dHB1dFtpICsgMV0gPT09IFwiXCIgJiYgdGhpcy5vdXRwdXRbaSArIDJdPy5zbGljZSgwLCBsLmxlbmd0aCkgPT09IGwuc2xpY2UoMCwgLTEpICsgXCIuXCIpIHtcbiAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LnB1c2gobCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoa2V5QWxpZ25tZW50KSB7XG4gICAgICAgICAgY29uc3QgbSA9IHJEZWNsYXJhdGlvbi5leGVjKGwpO1xuICAgICAgICAgIGlmIChtICYmIG1bMV0pIHtcbiAgICAgICAgICAgIG91dC5wdXNoKGwucmVwbGFjZShtWzFdLCBtWzFdLnBhZEVuZCh0aGlzLm1heFBhZCkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0LnB1c2gobCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dC5wdXNoKGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENsZWFuaW5nIG11bHRpcGxlIHNwYWNlc1xuICAgIGNvbnN0IGNsZWFuZWRPdXRwdXQgPSBbXTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgb3V0Lmxlbmd0aDsgaSsrKXtcbiAgICAgIGNvbnN0IGwgPSBvdXRbaV07XG4gICAgICBpZiAoIShsID09PSBcIlwiICYmIG91dFtpICsgMV0gPT09IFwiXCIpKSB7XG4gICAgICAgIGNsZWFuZWRPdXRwdXQucHVzaChsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsZWFuZWRPdXRwdXQ7XG4gIH1cbn1cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IHRvIGEge0BsaW5rIGh0dHBzOi8vdG9tbC5pbyB8IFRPTUx9IHN0cmluZy5cbiAqXG4gKiBAZXhhbXBsZSBVc2FnZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gXCJAc3RkL3RvbWwvc3RyaW5naWZ5XCI7XG4gKiBpbXBvcnQgeyBhc3NlcnRFcXVhbHMgfSBmcm9tIFwiQHN0ZC9hc3NlcnRcIjtcbiAqXG4gKiBjb25zdCBvYmogPSB7XG4gKiAgIHRpdGxlOiBcIlRPTUwgRXhhbXBsZVwiLFxuICogICBvd25lcjoge1xuICogICAgIG5hbWU6IFwiQm9iXCIsXG4gKiAgICAgYmlvOiBcIkJvYiBpcyBhIGNvb2wgZ3V5XCIsXG4gKiAgfVxuICogfTtcbiAqIGNvbnN0IHRvbWxTdHJpbmcgPSBzdHJpbmdpZnkob2JqKTtcbiAqIGFzc2VydEVxdWFscyh0b21sU3RyaW5nLCBgdGl0bGUgPSBcIlRPTUwgRXhhbXBsZVwiXFxuXFxuW293bmVyXVxcbm5hbWUgPSBcIkJvYlwiXFxuYmlvID0gXCJCb2IgaXMgYSBjb29sIGd1eVwiXFxuYCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBvYmogU291cmNlIG9iamVjdFxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3Igc3RyaW5naWZ5aW5nLlxuICogQHJldHVybnMgVE9NTCBzdHJpbmdcbiAqLyBleHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5KG9iaiwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IER1bXBlcihvYmopLmR1bXAob3B0aW9ucykuam9pbihcIlxcblwiKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgMjAxOC0yMDI2IHRoZSBEZW5vIGF1dGhvcnMuIE1JVCBsaWNlbnNlLlxuLy8gVGhpcyBtb2R1bGUgaXMgYnJvd3NlciBjb21wYXRpYmxlLlxuLyoqIERlZmF1bHQgbWVyZ2luZyBvcHRpb25zIC0gY2FjaGVkIHRvIGF2b2lkIG9iamVjdCBhbGxvY2F0aW9uIG9uIGVhY2ggY2FsbCAqLyBjb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG4gIGFycmF5czogXCJtZXJnZVwiLFxuICBzZXRzOiBcIm1lcmdlXCIsXG4gIG1hcHM6IFwibWVyZ2VcIlxufTtcbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2UocmVjb3JkLCBvdGhlciwgb3B0aW9ucykge1xuICByZXR1cm4gZGVlcE1lcmdlSW50ZXJuYWwocmVjb3JkLCBvdGhlciwgbmV3IFNldCgpLCBvcHRpb25zID8/IERFRkFVTFRfT1BUSU9OUyk7XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2VJbnRlcm5hbChyZWNvcmQsIG90aGVyLCBzZWVuLCBvcHRpb25zKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBjb25zdCBrZXlzID0gbmV3IFNldChbXG4gICAgLi4uZ2V0S2V5cyhyZWNvcmQpLFxuICAgIC4uLmdldEtleXMob3RoZXIpXG4gIF0pO1xuICAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBrZXkgb2Ygb3RoZXIgb2JqZWN0IGFuZCB1c2UgY29ycmVjdCBtZXJnaW5nIHN0cmF0ZWd5XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpe1xuICAgIC8vIFNraXAgdG8gcHJldmVudCBPYmplY3QucHJvdG90eXBlLl9fcHJvdG9fXyBhY2Nlc3NvciBwcm9wZXJ0eSBjYWxscyBvbiBub24tRGVubyBwbGF0Zm9ybXNcbiAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYSA9IHJlY29yZFtrZXldO1xuICAgIGlmICghT2JqZWN0Lmhhc093bihvdGhlciwga2V5KSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBhO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGIgPSBvdGhlcltrZXldO1xuICAgIGlmIChpc05vbk51bGxPYmplY3QoYSkgJiYgaXNOb25OdWxsT2JqZWN0KGIpICYmICFzZWVuLmhhcyhhKSAmJiAhc2Vlbi5oYXMoYikpIHtcbiAgICAgIHNlZW4uYWRkKGEpO1xuICAgICAgc2Vlbi5hZGQoYik7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlT2JqZWN0cyhhLCBiLCBzZWVuLCBvcHRpb25zKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBPdmVycmlkZSB2YWx1ZVxuICAgIHJlc3VsdFtrZXldID0gYjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWVyZ2VPYmplY3RzKGxlZnQsIHJpZ2h0LCBzZWVuLCBvcHRpb25zKSB7XG4gIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG1lcmdlYWJsZSBvYmplY3RzXG4gIGlmIChpc01lcmdlYWJsZShsZWZ0KSAmJiBpc01lcmdlYWJsZShyaWdodCkpIHtcbiAgICByZXR1cm4gZGVlcE1lcmdlSW50ZXJuYWwobGVmdCwgcmlnaHQsIHNlZW4sIG9wdGlvbnMpO1xuICB9XG4gIGlmIChpc0l0ZXJhYmxlKGxlZnQpICYmIGlzSXRlcmFibGUocmlnaHQpKSB7XG4gICAgLy8gSGFuZGxlIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxlZnQpICYmIEFycmF5LmlzQXJyYXkocmlnaHQpKSB7XG4gICAgICBpZiAob3B0aW9ucy5hcnJheXMgPT09IFwibWVyZ2VcIikge1xuICAgICAgICByZXR1cm4gbGVmdC5jb25jYXQocmlnaHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJpZ2h0O1xuICAgIH1cbiAgICAvLyBIYW5kbGUgbWFwc1xuICAgIGlmIChsZWZ0IGluc3RhbmNlb2YgTWFwICYmIHJpZ2h0IGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICBpZiAob3B0aW9ucy5tYXBzID09PSBcIm1lcmdlXCIpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcChsZWZ0KTtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgcmlnaHQpe1xuICAgICAgICAgIHJlc3VsdC5zZXQoaywgdik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByaWdodDtcbiAgICB9XG4gICAgLy8gSGFuZGxlIHNldHNcbiAgICBpZiAobGVmdCBpbnN0YW5jZW9mIFNldCAmJiByaWdodCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgaWYgKG9wdGlvbnMuc2V0cyA9PT0gXCJtZXJnZVwiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQobGVmdCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiByaWdodCl7XG4gICAgICAgICAgcmVzdWx0LmFkZCh2KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJpZ2h0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmlnaHQ7XG59XG4vKipcbiAqIFRlc3Qgd2hldGhlciBhIHZhbHVlIGlzIG1lcmdlYWJsZSBvciBub3RcbiAqIEJ1aWx0aW5zIHRoYXQgbG9vayBsaWtlIG9iamVjdHMsIG51bGwgYW5kIHVzZXIgZGVmaW5lZCBjbGFzc2VzXG4gKiBhcmUgbm90IGNvbnNpZGVyZWQgbWVyZ2VhYmxlIChpdCBtZWFucyB0aGF0IHJlZmVyZW5jZSB3aWxsIGJlIGNvcGllZClcbiAqLyBmdW5jdGlvbiBpc01lcmdlYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cbmZ1bmN0aW9uIGlzSXRlcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBpc05vbk51bGxPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIjtcbn1cbmZ1bmN0aW9uIGdldEtleXMocmVjb3JkKSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZWNvcmQpO1xuICBjb25zdCBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyZWNvcmQpO1xuICAvLyBGYXN0IHBhdGg6IG1vc3Qgb2JqZWN0cyBoYXZlIG5vIHN5bWJvbCBrZXlzXG4gIGlmIChzeW1ib2xzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGtleXM7XG4gIGZvciAoY29uc3Qgc3ltIG9mIHN5bWJvbHMpe1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocmVjb3JkLCBzeW0pKSB7XG4gICAgICBrZXlzLnB1c2goc3ltKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWVwX21lcmdlLmpzLm1hcCIsIi8vIENvcHlyaWdodCAyMDE4LTIwMjUgdGhlIERlbm8gYXV0aG9ycy4gTUlUIGxpY2Vuc2UuXG4vLyBUaGlzIG1vZHVsZSBpcyBicm93c2VyIGNvbXBhdGlibGUuXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tIFwiQGpzci9zdGRfX2NvbGxlY3Rpb25zL2RlZXAtbWVyZ2VcIjtcbi8qKlxuICogQ29weSBvZiBgaW1wb3J0IHsgaXNMZWFwIH0gZnJvbSBcIkBzdGQvZGF0ZXRpbWVcIjtgIGJlY2F1c2UgaXQgY2Fubm90IGJlIGltcG90ZWQgYXMgbG9uZyBhcyBpdCBpcyB1bnN0YWJsZS5cbiAqLyBmdW5jdGlvbiBpc0xlYXAoeWVhck51bWJlcikge1xuICByZXR1cm4geWVhck51bWJlciAlIDQgPT09IDAgJiYgeWVhck51bWJlciAlIDEwMCAhPT0gMCB8fCB5ZWFyTnVtYmVyICUgNDAwID09PSAwO1xufVxuZXhwb3J0IGNsYXNzIFNjYW5uZXIge1xuICAjd2hpdGVzcGFjZSA9IC9bIFxcdF0vO1xuICAjcG9zaXRpb24gPSAwO1xuICAjc291cmNlO1xuICBjb25zdHJ1Y3Rvcihzb3VyY2Upe1xuICAgIHRoaXMuI3NvdXJjZSA9IHNvdXJjZTtcbiAgfVxuICBnZXQgcG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Bvc2l0aW9uO1xuICB9XG4gIGdldCBzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NvdXJjZTtcbiAgfVxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgY2hhcmFjdGVyXG4gICAqIEBwYXJhbSBpbmRleCAtIHJlbGF0aXZlIGluZGV4IGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgKi8gY2hhcihpbmRleCA9IDApIHtcbiAgICByZXR1cm4gdGhpcy4jc291cmNlW3RoaXMuI3Bvc2l0aW9uICsgaW5kZXhdID8/IFwiXCI7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBzbGljZWQgc3RyaW5nXG4gICAqIEBwYXJhbSBzdGFydCAtIHN0YXJ0IHBvc2l0aW9uIHJlbGF0aXZlIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgKiBAcGFyYW0gZW5kIC0gZW5kIHBvc2l0aW9uIHJlbGF0aXZlIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgKi8gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiB0aGlzLiNzb3VyY2Uuc2xpY2UodGhpcy4jcG9zaXRpb24gKyBzdGFydCwgdGhpcy4jcG9zaXRpb24gKyBlbmQpO1xuICB9XG4gIC8qKlxuICAgKiBNb3ZlIHBvc2l0aW9uIHRvIG5leHRcbiAgICovIG5leHQoY291bnQgPSAxKSB7XG4gICAgdGhpcy4jcG9zaXRpb24gKz0gY291bnQ7XG4gIH1cbiAgc2tpcFdoaXRlc3BhY2VzKCkge1xuICAgIHdoaWxlKHRoaXMuI3doaXRlc3BhY2UudGVzdCh0aGlzLmNoYXIoKSkgJiYgIXRoaXMuZW9mKCkpe1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICAgIC8vIEludmFsaWQgaWYgY3VycmVudCBjaGFyIGlzIG90aGVyIGtpbmRzIG9mIHdoaXRlc3BhY2VcbiAgICBpZiAoIXRoaXMuaXNDdXJyZW50Q2hhckVPTCgpICYmIC9cXHMvLnRlc3QodGhpcy5jaGFyKCkpKSB7XG4gICAgICBjb25zdCBlc2NhcGVkID0gXCJcXFxcdVwiICsgdGhpcy5jaGFyKCkuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuI3Bvc2l0aW9uO1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIFRPTUw6IEl0IGNvbnRhaW5zIGludmFsaWQgd2hpdGVzcGFjZSBhdCBwb3NpdGlvbiAnJHtwb3NpdGlvbn0nOiBcXGAke2VzY2FwZWR9XFxgYCk7XG4gICAgfVxuICB9XG4gIG5leHRVbnRpbENoYXIob3B0aW9ucyA9IHtcbiAgICBza2lwQ29tbWVudHM6IHRydWVcbiAgfSkge1xuICAgIHdoaWxlKCF0aGlzLmVvZigpKXtcbiAgICAgIGNvbnN0IGNoYXIgPSB0aGlzLmNoYXIoKTtcbiAgICAgIGlmICh0aGlzLiN3aGl0ZXNwYWNlLnRlc3QoY2hhcikgfHwgdGhpcy5pc0N1cnJlbnRDaGFyRU9MKCkpIHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2tpcENvbW1lbnRzICYmIHRoaXMuY2hhcigpID09PSBcIiNcIikge1xuICAgICAgICAvLyBlbnRlcmluZyBjb21tZW50XG4gICAgICAgIHdoaWxlKCF0aGlzLmlzQ3VycmVudENoYXJFT0woKSAmJiAhdGhpcy5lb2YoKSl7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogUG9zaXRpb24gcmVhY2hlZCBFT0Ygb3Igbm90XG4gICAqLyBlb2YoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Bvc2l0aW9uID49IHRoaXMuI3NvdXJjZS5sZW5ndGg7XG4gIH1cbiAgaXNDdXJyZW50Q2hhckVPTCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFyKCkgPT09IFwiXFxuXCIgfHwgdGhpcy5zdGFydHNXaXRoKFwiXFxyXFxuXCIpO1xuICB9XG4gIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NvdXJjZS5zdGFydHNXaXRoKHNlYXJjaFN0cmluZywgdGhpcy4jcG9zaXRpb24pO1xuICB9XG4gIG1hdGNoKHJlZ0V4cCkge1xuICAgIGlmICghcmVnRXhwLnN0aWNreSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdFeHAgJHtyZWdFeHB9IGRvZXMgbm90IGhhdmUgYSBzdGlja3kgJ3knIGZsYWdgKTtcbiAgICB9XG4gICAgcmVnRXhwLmxhc3RJbmRleCA9IHRoaXMuI3Bvc2l0aW9uO1xuICAgIHJldHVybiB0aGlzLiNzb3VyY2UubWF0Y2gocmVnRXhwKTtcbiAgfVxufVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFV0aWxpdGllc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN1Y2Nlc3MoYm9keSkge1xuICByZXR1cm4ge1xuICAgIG9rOiB0cnVlLFxuICAgIGJvZHlcbiAgfTtcbn1cbmZ1bmN0aW9uIGZhaWx1cmUoKSB7XG4gIHJldHVybiB7XG4gICAgb2s6IGZhbHNlXG4gIH07XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXN0ZWQgb2JqZWN0IGZyb20gdGhlIGtleXMgYW5kIHZhbHVlcy5cbiAqXG4gKiBlLmcuIGB1bmZsYXQoW1wiYVwiLCBcImJcIiwgXCJjXCJdLCAxKWAgcmV0dXJucyBgeyBhOiB7IGI6IHsgYzogMSB9IH0gfWBcbiAqLyBleHBvcnQgZnVuY3Rpb24gdW5mbGF0KGtleXMsIHZhbHVlcyA9IHtcbiAgX19wcm90b19fOiBudWxsXG59KSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZVJpZ2h0KChhY2MsIGtleSk9Pih7XG4gICAgICBba2V5XTogYWNjXG4gICAgfSksIHZhbHVlcyk7XG59XG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0VGFyZ2V0VmFsdWUodGFyZ2V0LCBrZXlzKSB7XG4gIGNvbnN0IGtleSA9IGtleXNbMF07XG4gIGlmICgha2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHBhcnNlIHRoZSBUT01MOiBrZXkgbGVuZ3RoIGlzIG5vdCBhIHBvc2l0aXZlIG51bWJlclwiKTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0W2tleV07XG59XG5mdW5jdGlvbiBkZWVwQXNzaWduVGFibGUodGFyZ2V0LCB0YWJsZSkge1xuICBjb25zdCB7IGtleXMsIHR5cGUsIHZhbHVlIH0gPSB0YWJsZTtcbiAgY29uc3QgY3VycmVudFZhbHVlID0gZ2V0VGFyZ2V0VmFsdWUodGFyZ2V0LCBrZXlzKTtcbiAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB1bmZsYXQoa2V5cywgdmFsdWUpKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpKSB7XG4gICAgY29uc3QgbGFzdCA9IGN1cnJlbnRWYWx1ZS5hdCgtMSk7XG4gICAgZGVlcEFzc2lnbihsYXN0LCB7XG4gICAgICB0eXBlLFxuICAgICAga2V5czoga2V5cy5zbGljZSgxKSxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBpZiAoaXNPYmplY3QoY3VycmVudFZhbHVlKSkge1xuICAgIGRlZXBBc3NpZ24oY3VycmVudFZhbHVlLCB7XG4gICAgICB0eXBlLFxuICAgICAga2V5czoga2V5cy5zbGljZSgxKSxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGFzc2lnblwiKTtcbn1cbmZ1bmN0aW9uIGRlZXBBc3NpZ25UYWJsZUFycmF5KHRhcmdldCwgdGFibGUpIHtcbiAgY29uc3QgeyB0eXBlLCBrZXlzLCB2YWx1ZSB9ID0gdGFibGU7XG4gIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGdldFRhcmdldFZhbHVlKHRhcmdldCwga2V5cyk7XG4gIGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRhcmdldCwgdW5mbGF0KGtleXMsIFtcbiAgICAgIHZhbHVlXG4gICAgXSkpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICBpZiAodGFibGUua2V5cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGN1cnJlbnRWYWx1ZS5wdXNoKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGFzdCA9IGN1cnJlbnRWYWx1ZS5hdCgtMSk7XG4gICAgICBkZWVwQXNzaWduKGxhc3QsIHtcbiAgICAgICAgdHlwZTogdGFibGUudHlwZSxcbiAgICAgICAga2V5czogdGFibGUua2V5cy5zbGljZSgxKSxcbiAgICAgICAgdmFsdWU6IHRhYmxlLnZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBpZiAoaXNPYmplY3QoY3VycmVudFZhbHVlKSkge1xuICAgIGRlZXBBc3NpZ24oY3VycmVudFZhbHVlLCB7XG4gICAgICB0eXBlLFxuICAgICAga2V5czoga2V5cy5zbGljZSgxKSxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGFzc2lnblwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQXNzaWduKHRhcmdldCwgYm9keSkge1xuICBzd2l0Y2goYm9keS50eXBlKXtcbiAgICBjYXNlIFwiQmxvY2tcIjpcbiAgICAgIHJldHVybiBkZWVwTWVyZ2UodGFyZ2V0LCBib2R5LnZhbHVlKTtcbiAgICBjYXNlIFwiVGFibGVcIjpcbiAgICAgIHJldHVybiBkZWVwQXNzaWduVGFibGUodGFyZ2V0LCBib2R5KTtcbiAgICBjYXNlIFwiVGFibGVBcnJheVwiOlxuICAgICAgcmV0dXJuIGRlZXBBc3NpZ25UYWJsZUFycmF5KHRhcmdldCwgYm9keSk7XG4gIH1cbn1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUGFyc2VyIGNvbWJpbmF0b3JzIGFuZCBnZW5lcmF0b3JzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIGRlbm8tbGludC1pZ25vcmUgbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBvcihwYXJzZXJzKSB7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBmb3IgKGNvbnN0IHBhcnNlIG9mIHBhcnNlcnMpe1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2Uoc2Nhbm5lcik7XG4gICAgICBpZiAocmVzdWx0Lm9rKSByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gZmFpbHVyZSgpO1xuICB9O1xufVxuLyoqIEpvaW4gdGhlIHBhcnNlIHJlc3VsdHMgb2YgdGhlIGdpdmVuIHBhcnNlciBpbnRvIGFuIGFycmF5LlxuICpcbiAqIElmIHRoZSBwYXJzZXIgZmFpbHMgYXQgdGhlIGZpcnN0IGF0dGVtcHQsIGl0IHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5LlxuICovIGZ1bmN0aW9uIGpvaW4ocGFyc2VyLCBzZXBhcmF0b3IpIHtcbiAgY29uc3QgU2VwYXJhdG9yID0gY2hhcmFjdGVyKHNlcGFyYXRvcik7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBjb25zdCBvdXQgPSBbXTtcbiAgICBjb25zdCBmaXJzdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICBpZiAoIWZpcnN0Lm9rKSByZXR1cm4gc3VjY2VzcyhvdXQpO1xuICAgIG91dC5wdXNoKGZpcnN0LmJvZHkpO1xuICAgIHdoaWxlKCFzY2FubmVyLmVvZigpKXtcbiAgICAgIGlmICghU2VwYXJhdG9yKHNjYW5uZXIpLm9rKSBicmVhaztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCB0b2tlbiBhZnRlciBcIiR7c2VwYXJhdG9yfVwiYCk7XG4gICAgICB9XG4gICAgICBvdXQucHVzaChyZXN1bHQuYm9keSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzKG91dCk7XG4gIH07XG59XG4vKiogSm9pbiB0aGUgcGFyc2UgcmVzdWx0cyBvZiB0aGUgZ2l2ZW4gcGFyc2VyIGludG8gYW4gYXJyYXkuXG4gKlxuICogVGhpcyByZXF1aXJlcyB0aGUgcGFyc2VyIHRvIHN1Y2NlZWQgYXQgbGVhc3Qgb25jZS5cbiAqLyBmdW5jdGlvbiBqb2luMShwYXJzZXIsIHNlcGFyYXRvcikge1xuICBjb25zdCBTZXBhcmF0b3IgPSBjaGFyYWN0ZXIoc2VwYXJhdG9yKTtcbiAgcmV0dXJuIChzY2FubmVyKT0+e1xuICAgIGNvbnN0IGZpcnN0ID0gcGFyc2VyKHNjYW5uZXIpO1xuICAgIGlmICghZmlyc3Qub2spIHJldHVybiBmYWlsdXJlKCk7XG4gICAgY29uc3Qgb3V0ID0gW1xuICAgICAgZmlyc3QuYm9keVxuICAgIF07XG4gICAgd2hpbGUoIXNjYW5uZXIuZW9mKCkpe1xuICAgICAgaWYgKCFTZXBhcmF0b3Ioc2Nhbm5lcikub2spIGJyZWFrO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyKHNjYW5uZXIpO1xuICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIHRva2VuIGFmdGVyIFwiJHtzZXBhcmF0b3J9XCJgKTtcbiAgICAgIH1cbiAgICAgIG91dC5wdXNoKHJlc3VsdC5ib2R5KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2Nlc3Mob3V0KTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGt2KGtleVBhcnNlciwgc2VwYXJhdG9yLCB2YWx1ZVBhcnNlcikge1xuICBjb25zdCBTZXBhcmF0b3IgPSBjaGFyYWN0ZXIoc2VwYXJhdG9yKTtcbiAgcmV0dXJuIChzY2FubmVyKT0+e1xuICAgIGNvbnN0IHBvc2l0aW9uID0gc2Nhbm5lci5wb3NpdGlvbjtcbiAgICBjb25zdCBrZXkgPSBrZXlQYXJzZXIoc2Nhbm5lcik7XG4gICAgaWYgKCFrZXkub2spIHJldHVybiBmYWlsdXJlKCk7XG4gICAgY29uc3Qgc2VwID0gU2VwYXJhdG9yKHNjYW5uZXIpO1xuICAgIGlmICghc2VwLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYGtleS92YWx1ZSBwYWlyIGRvZXNuJ3QgaGF2ZSBcIiR7c2VwYXJhdG9yfVwiYCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdmFsdWVQYXJzZXIoc2Nhbm5lcik7XG4gICAgaWYgKCF2YWx1ZS5vaykge1xuICAgICAgY29uc3QgbGluZUVuZEluZGV4ID0gc2Nhbm5lci5zb3VyY2UuaW5kZXhPZihcIlxcblwiLCBzY2FubmVyLnBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gbGluZUVuZEluZGV4ID4gMCA/IGxpbmVFbmRJbmRleCA6IHNjYW5uZXIuc291cmNlLmxlbmd0aDtcbiAgICAgIGNvbnN0IGxpbmUgPSBzY2FubmVyLnNvdXJjZS5zbGljZShwb3NpdGlvbiwgZW5kUG9zaXRpb24pO1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBDYW5ub3QgcGFyc2UgdmFsdWUgb24gbGluZSAnJHtsaW5lfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2Nlc3ModW5mbGF0KGtleS5ib2R5LCB2YWx1ZS5ib2R5KSk7XG4gIH07XG59XG5mdW5jdGlvbiBtZXJnZShwYXJzZXIpIHtcbiAgcmV0dXJuIChzY2FubmVyKT0+e1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICBpZiAoIXJlc3VsdC5vaykgcmV0dXJuIGZhaWx1cmUoKTtcbiAgICBsZXQgYm9keSA9IHtcbiAgICAgIF9fcHJvdG9fXzogbnVsbFxuICAgIH07XG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVzdWx0LmJvZHkpe1xuICAgICAgaWYgKHR5cGVvZiByZWNvcmQgPT09IFwib2JqZWN0XCIgJiYgcmVjb3JkICE9PSBudWxsKSB7XG4gICAgICAgIGJvZHkgPSBkZWVwTWVyZ2UoYm9keSwgcmVjb3JkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN1Y2Nlc3MoYm9keSk7XG4gIH07XG59XG5mdW5jdGlvbiByZXBlYXQocGFyc2VyKSB7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBjb25zdCBib2R5ID0gW107XG4gICAgd2hpbGUoIXNjYW5uZXIuZW9mKCkpe1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyKHNjYW5uZXIpO1xuICAgICAgaWYgKCFyZXN1bHQub2spIGJyZWFrO1xuICAgICAgYm9keS5wdXNoKHJlc3VsdC5ib2R5KTtcbiAgICAgIHNjYW5uZXIubmV4dFVudGlsQ2hhcigpO1xuICAgIH1cbiAgICBpZiAoYm9keS5sZW5ndGggPT09IDApIHJldHVybiBmYWlsdXJlKCk7XG4gICAgcmV0dXJuIHN1Y2Nlc3MoYm9keSk7XG4gIH07XG59XG5mdW5jdGlvbiBzdXJyb3VuZChsZWZ0LCBwYXJzZXIsIHJpZ2h0KSB7XG4gIGNvbnN0IExlZnQgPSBjaGFyYWN0ZXIobGVmdCk7XG4gIGNvbnN0IFJpZ2h0ID0gY2hhcmFjdGVyKHJpZ2h0KTtcbiAgcmV0dXJuIChzY2FubmVyKT0+e1xuICAgIGlmICghTGVmdChzY2FubmVyKS5vaykge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyKHNjYW5uZXIpO1xuICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYEludmFsaWQgdG9rZW4gYWZ0ZXIgXCIke2xlZnR9XCJgKTtcbiAgICB9XG4gICAgaWYgKCFSaWdodChzY2FubmVyKS5vaykge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBOb3QgY2xvc2VkIGJ5IFwiJHtyaWdodH1cIiBhZnRlciBzdGFydGVkIHdpdGggXCIke2xlZnR9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2Nlc3MocmVzdWx0LmJvZHkpO1xuICB9O1xufVxuZnVuY3Rpb24gY2hhcmFjdGVyKHN0cikge1xuICByZXR1cm4gKHNjYW5uZXIpPT57XG4gICAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgICBpZiAoIXNjYW5uZXIuc3RhcnRzV2l0aChzdHIpKSByZXR1cm4gZmFpbHVyZSgpO1xuICAgIHNjYW5uZXIubmV4dChzdHIubGVuZ3RoKTtcbiAgICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICAgIHJldHVybiBzdWNjZXNzKHVuZGVmaW5lZCk7XG4gIH07XG59XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUGFyc2VyIGNvbXBvbmVudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBCQVJFX0tFWV9SRUdFWFAgPSAvW0EtWmEtejAtOV8tXSsveTtcbmV4cG9ydCBmdW5jdGlvbiBiYXJlS2V5KHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3Qga2V5ID0gc2Nhbm5lci5tYXRjaChCQVJFX0tFWV9SRUdFWFApPy5bMF07XG4gIGlmICgha2V5KSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQoa2V5Lmxlbmd0aCk7XG4gIHJldHVybiBzdWNjZXNzKGtleSk7XG59XG5mdW5jdGlvbiBlc2NhcGVTZXF1ZW5jZShzY2FubmVyKSB7XG4gIGlmIChzY2FubmVyLmNoYXIoKSAhPT0gXCJcXFxcXCIpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dCgpO1xuICAvLyBTZWUgaHR0cHM6Ly90b21sLmlvL2VuL3YxLjAuMC1yYy4zI3N0cmluZ1xuICBzd2l0Y2goc2Nhbm5lci5jaGFyKCkpe1xuICAgIGNhc2UgXCJiXCI6XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgIHJldHVybiBzdWNjZXNzKFwiXFxiXCIpO1xuICAgIGNhc2UgXCJ0XCI6XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgIHJldHVybiBzdWNjZXNzKFwiXFx0XCIpO1xuICAgIGNhc2UgXCJuXCI6XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgIHJldHVybiBzdWNjZXNzKFwiXFxuXCIpO1xuICAgIGNhc2UgXCJmXCI6XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgIHJldHVybiBzdWNjZXNzKFwiXFxmXCIpO1xuICAgIGNhc2UgXCJyXCI6XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgIHJldHVybiBzdWNjZXNzKFwiXFxyXCIpO1xuICAgIGNhc2UgXCJ1XCI6XG4gICAgY2FzZSBcIlVcIjpcbiAgICAgIHtcbiAgICAgICAgLy8gVW5pY29kZSBjaGFyYWN0ZXJcbiAgICAgICAgY29uc3QgY29kZVBvaW50TGVuID0gc2Nhbm5lci5jaGFyKCkgPT09IFwidVwiID8gNCA6IDY7XG4gICAgICAgIGNvbnN0IGNvZGVQb2ludCA9IHBhcnNlSW50KFwiMHhcIiArIHNjYW5uZXIuc2xpY2UoMSwgMSArIGNvZGVQb2ludExlbiksIDE2KTtcbiAgICAgICAgY29uc3Qgc3RyID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZVBvaW50KTtcbiAgICAgICAgc2Nhbm5lci5uZXh0KGNvZGVQb2ludExlbiArIDEpO1xuICAgICAgICByZXR1cm4gc3VjY2VzcyhzdHIpO1xuICAgICAgfVxuICAgIGNhc2UgJ1wiJzpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoJ1wiJyk7XG4gICAgY2FzZSBcIlxcXFxcIjpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoXCJcXFxcXCIpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYEludmFsaWQgZXNjYXBlIHNlcXVlbmNlOiBcXFxcJHtzY2FubmVyLmNoYXIoKX1gKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGJhc2ljU3RyaW5nKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgaWYgKHNjYW5uZXIuY2hhcigpICE9PSAnXCInKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQoKTtcbiAgY29uc3QgYWNjID0gW107XG4gIHdoaWxlKHNjYW5uZXIuY2hhcigpICE9PSAnXCInICYmICFzY2FubmVyLmVvZigpKXtcbiAgICBpZiAoc2Nhbm5lci5jaGFyKCkgPT09IFwiXFxuXCIpIHtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIlNpbmdsZS1saW5lIHN0cmluZyBjYW5ub3QgY29udGFpbiBFT0xcIik7XG4gICAgfVxuICAgIGNvbnN0IGVzY2FwZWRDaGFyID0gZXNjYXBlU2VxdWVuY2Uoc2Nhbm5lcik7XG4gICAgaWYgKGVzY2FwZWRDaGFyLm9rKSB7XG4gICAgICBhY2MucHVzaChlc2NhcGVkQ2hhci5ib2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjLnB1c2goc2Nhbm5lci5jaGFyKCkpO1xuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgfVxuICB9XG4gIGlmIChzY2FubmVyLmVvZigpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBTaW5nbGUtbGluZSBzdHJpbmcgaXMgbm90IGNsb3NlZDpcXG4ke2FjYy5qb2luKFwiXCIpfWApO1xuICB9XG4gIHNjYW5uZXIubmV4dCgpOyAvLyBza2lwIGxhc3QgJ1wiXCJcbiAgcmV0dXJuIHN1Y2Nlc3MoYWNjLmpvaW4oXCJcIikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxpdGVyYWxTdHJpbmcoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBpZiAoc2Nhbm5lci5jaGFyKCkgIT09IFwiJ1wiKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQoKTtcbiAgY29uc3QgYWNjID0gW107XG4gIHdoaWxlKHNjYW5uZXIuY2hhcigpICE9PSBcIidcIiAmJiAhc2Nhbm5lci5lb2YoKSl7XG4gICAgaWYgKHNjYW5uZXIuY2hhcigpID09PSBcIlxcblwiKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJTaW5nbGUtbGluZSBzdHJpbmcgY2Fubm90IGNvbnRhaW4gRU9MXCIpO1xuICAgIH1cbiAgICBhY2MucHVzaChzY2FubmVyLmNoYXIoKSk7XG4gICAgc2Nhbm5lci5uZXh0KCk7XG4gIH1cbiAgaWYgKHNjYW5uZXIuZW9mKCkpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFNpbmdsZS1saW5lIHN0cmluZyBpcyBub3QgY2xvc2VkOlxcbiR7YWNjLmpvaW4oXCJcIil9YCk7XG4gIH1cbiAgc2Nhbm5lci5uZXh0KCk7IC8vIHNraXAgbGFzdCBcIidcIlxuICByZXR1cm4gc3VjY2VzcyhhY2Muam9pbihcIlwiKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbXVsdGlsaW5lQmFzaWNTdHJpbmcoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBpZiAoIXNjYW5uZXIuc3RhcnRzV2l0aCgnXCJcIlwiJykpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dCgzKTtcbiAgaWYgKHNjYW5uZXIuY2hhcigpID09PSBcIlxcblwiKSB7XG4gICAgLy8gVGhlIGZpcnN0IG5ld2xpbmUgKExGKSBpcyB0cmltbWVkXG4gICAgc2Nhbm5lci5uZXh0KCk7XG4gIH0gZWxzZSBpZiAoc2Nhbm5lci5zdGFydHNXaXRoKFwiXFxyXFxuXCIpKSB7XG4gICAgLy8gVGhlIGZpcnN0IG5ld2xpbmUgKENSTEYpIGlzIHRyaW1tZWRcbiAgICBzY2FubmVyLm5leHQoMik7XG4gIH1cbiAgY29uc3QgYWNjID0gW107XG4gIHdoaWxlKCFzY2FubmVyLnN0YXJ0c1dpdGgoJ1wiXCJcIicpICYmICFzY2FubmVyLmVvZigpKXtcbiAgICAvLyBsaW5lIGVuZGluZyBiYWNrc2xhc2hcbiAgICBpZiAoc2Nhbm5lci5zdGFydHNXaXRoKFwiXFxcXFxcblwiKSkge1xuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICBzY2FubmVyLm5leHRVbnRpbENoYXIoe1xuICAgICAgICBza2lwQ29tbWVudHM6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoc2Nhbm5lci5zdGFydHNXaXRoKFwiXFxcXFxcclxcblwiKSkge1xuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICBzY2FubmVyLm5leHRVbnRpbENoYXIoe1xuICAgICAgICBza2lwQ29tbWVudHM6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBlc2NhcGVkQ2hhciA9IGVzY2FwZVNlcXVlbmNlKHNjYW5uZXIpO1xuICAgIGlmIChlc2NhcGVkQ2hhci5vaykge1xuICAgICAgYWNjLnB1c2goZXNjYXBlZENoYXIuYm9keSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjYy5wdXNoKHNjYW5uZXIuY2hhcigpKTtcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgIH1cbiAgfVxuICBpZiAoc2Nhbm5lci5lb2YoKSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgTXVsdGktbGluZSBzdHJpbmcgaXMgbm90IGNsb3NlZDpcXG4ke2FjYy5qb2luKFwiXCIpfWApO1xuICB9XG4gIC8vIGlmIGVuZHMgd2l0aCA0IGBcImAsIHB1c2ggdGhlIGZpc3QgYFwiYCB0byBzdHJpbmdcbiAgaWYgKHNjYW5uZXIuY2hhcigzKSA9PT0gJ1wiJykge1xuICAgIGFjYy5wdXNoKCdcIicpO1xuICAgIHNjYW5uZXIubmV4dCgpO1xuICB9XG4gIHNjYW5uZXIubmV4dCgzKTsgLy8gc2tpcCBsYXN0ICdcIlwiXCJcIlxuICByZXR1cm4gc3VjY2VzcyhhY2Muam9pbihcIlwiKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbXVsdGlsaW5lTGl0ZXJhbFN0cmluZyhzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGlmICghc2Nhbm5lci5zdGFydHNXaXRoKFwiJycnXCIpKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQoMyk7XG4gIGlmIChzY2FubmVyLmNoYXIoKSA9PT0gXCJcXG5cIikge1xuICAgIC8vIFRoZSBmaXJzdCBuZXdsaW5lIChMRikgaXMgdHJpbW1lZFxuICAgIHNjYW5uZXIubmV4dCgpO1xuICB9IGVsc2UgaWYgKHNjYW5uZXIuc3RhcnRzV2l0aChcIlxcclxcblwiKSkge1xuICAgIC8vIFRoZSBmaXJzdCBuZXdsaW5lIChDUkxGKSBpcyB0cmltbWVkXG4gICAgc2Nhbm5lci5uZXh0KDIpO1xuICB9XG4gIGNvbnN0IGFjYyA9IFtdO1xuICB3aGlsZSghc2Nhbm5lci5zdGFydHNXaXRoKFwiJycnXCIpICYmICFzY2FubmVyLmVvZigpKXtcbiAgICBhY2MucHVzaChzY2FubmVyLmNoYXIoKSk7XG4gICAgc2Nhbm5lci5uZXh0KCk7XG4gIH1cbiAgaWYgKHNjYW5uZXIuZW9mKCkpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYE11bHRpLWxpbmUgc3RyaW5nIGlzIG5vdCBjbG9zZWQ6XFxuJHthY2Muam9pbihcIlwiKX1gKTtcbiAgfVxuICAvLyBpZiBlbmRzIHdpdGggNCBgJ2AsIHB1c2ggdGhlIGZpc3QgYCdgIHRvIHN0cmluZ1xuICBpZiAoc2Nhbm5lci5jaGFyKDMpID09PSBcIidcIikge1xuICAgIGFjYy5wdXNoKFwiJ1wiKTtcbiAgICBzY2FubmVyLm5leHQoKTtcbiAgfVxuICBzY2FubmVyLm5leHQoMyk7IC8vIHNraXAgbGFzdCBcIicnJ1wiXG4gIHJldHVybiBzdWNjZXNzKGFjYy5qb2luKFwiXCIpKTtcbn1cbmNvbnN0IEJPT0xFQU5fUkVHRVhQID0gLyg/OnRydWV8ZmFsc2UpXFxiL3k7XG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbihzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChCT09MRUFOX1JFR0VYUCk7XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIGNvbnN0IHN0cmluZyA9IG1hdGNoWzBdO1xuICBzY2FubmVyLm5leHQoc3RyaW5nLmxlbmd0aCk7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nID09PSBcInRydWVcIjtcbiAgcmV0dXJuIHN1Y2Nlc3ModmFsdWUpO1xufVxuY29uc3QgSU5GSU5JVFlfTUFQID0gbmV3IE1hcChbXG4gIFtcbiAgICBcImluZlwiLFxuICAgIEluZmluaXR5XG4gIF0sXG4gIFtcbiAgICBcIitpbmZcIixcbiAgICBJbmZpbml0eVxuICBdLFxuICBbXG4gICAgXCItaW5mXCIsXG4gICAgLUluZmluaXR5XG4gIF1cbl0pO1xuY29uc3QgSU5GSU5JVFlfUkVHRVhQID0gL1srLV0/aW5mXFxiL3k7XG5leHBvcnQgZnVuY3Rpb24gaW5maW5pdHkoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goSU5GSU5JVFlfUkVHRVhQKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgY29uc3Qgc3RyaW5nID0gbWF0Y2hbMF07XG4gIHNjYW5uZXIubmV4dChzdHJpbmcubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWUgPSBJTkZJTklUWV9NQVAuZ2V0KHN0cmluZyk7XG4gIHJldHVybiBzdWNjZXNzKHZhbHVlKTtcbn1cbmNvbnN0IE5BTl9SRUdFWFAgPSAvWystXT9uYW5cXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBuYW4oc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goTkFOX1JFR0VYUCk7XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIGNvbnN0IHN0cmluZyA9IG1hdGNoWzBdO1xuICBzY2FubmVyLm5leHQoc3RyaW5nLmxlbmd0aCk7XG4gIGNvbnN0IHZhbHVlID0gTmFOO1xuICByZXR1cm4gc3VjY2Vzcyh2YWx1ZSk7XG59XG5leHBvcnQgY29uc3QgZG90dGVkS2V5ID0gam9pbjEob3IoW1xuICBiYXJlS2V5LFxuICBiYXNpY1N0cmluZyxcbiAgbGl0ZXJhbFN0cmluZ1xuXSksIFwiLlwiKTtcbmNvbnN0IEJJTkFSWV9SRUdFWFAgPSAvMGJbMDFdKyg/Ol9bMDFdKykqXFxiL3k7XG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5KHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKEJJTkFSWV9SRUdFWFApPy5bMF07XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dChtYXRjaC5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZSA9IG1hdGNoLnNsaWNlKDIpLnJlcGxhY2VBbGwoXCJfXCIsIFwiXCIpO1xuICBjb25zdCBudW1iZXIgPSBwYXJzZUludCh2YWx1ZSwgMik7XG4gIHJldHVybiBpc05hTihudW1iZXIpID8gZmFpbHVyZSgpIDogc3VjY2VzcyhudW1iZXIpO1xufVxuY29uc3QgT0NUQUxfUkVHRVhQID0gLzBvWzAtN10rKD86X1swLTddKykqXFxiL3k7XG5leHBvcnQgZnVuY3Rpb24gb2N0YWwoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goT0NUQUxfUkVHRVhQKT8uWzBdO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQobWF0Y2gubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWUgPSBtYXRjaC5zbGljZSgyKS5yZXBsYWNlQWxsKFwiX1wiLCBcIlwiKTtcbiAgY29uc3QgbnVtYmVyID0gcGFyc2VJbnQodmFsdWUsIDgpO1xuICByZXR1cm4gaXNOYU4obnVtYmVyKSA/IGZhaWx1cmUoKSA6IHN1Y2Nlc3MobnVtYmVyKTtcbn1cbmNvbnN0IEhFWF9SRUdFWFAgPSAvMHhbMC05YS1mXSsoPzpfWzAtOWEtZl0rKSpcXGIveWk7XG5leHBvcnQgZnVuY3Rpb24gaGV4KHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKEhFWF9SRUdFWFApPy5bMF07XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dChtYXRjaC5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZSA9IG1hdGNoLnNsaWNlKDIpLnJlcGxhY2VBbGwoXCJfXCIsIFwiXCIpO1xuICBjb25zdCBudW1iZXIgPSBwYXJzZUludCh2YWx1ZSwgMTYpO1xuICByZXR1cm4gaXNOYU4obnVtYmVyKSA/IGZhaWx1cmUoKSA6IHN1Y2Nlc3MobnVtYmVyKTtcbn1cbmNvbnN0IElOVEVHRVJfUkVHRVhQID0gL1srLV0/KD86MHxbMS05XVswLTldKig/Ol9bMC05XSspKilcXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBpbnRlZ2VyKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKElOVEVHRVJfUkVHRVhQKT8uWzBdO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHQobWF0Y2gubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWUgPSBtYXRjaC5yZXBsYWNlQWxsKFwiX1wiLCBcIlwiKTtcbiAgY29uc3QgaW50ID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgcmV0dXJuIHN1Y2Nlc3MoaW50KTtcbn1cbmNvbnN0IEZMT0FUX1JFR0VYUCA9IC9bKy1dPyg/OjB8WzEtOV1bMC05XSooPzpfWzAtOV0rKSopKD86XFwuWzAtOV0rKD86X1swLTldKykqKT8oPzplWystXT9bMC05XSsoPzpfWzAtOV0rKSopP1xcYi95aTtcbmV4cG9ydCBmdW5jdGlvbiBmbG9hdChzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChGTE9BVF9SRUdFWFApPy5bMF07XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dChtYXRjaC5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZSA9IG1hdGNoLnJlcGxhY2VBbGwoXCJfXCIsIFwiXCIpO1xuICBjb25zdCBmbG9hdCA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICBpZiAoaXNOYU4oZmxvYXQpKSByZXR1cm4gZmFpbHVyZSgpO1xuICByZXR1cm4gc3VjY2VzcyhmbG9hdCk7XG59XG5jb25zdCBEQVRFX1RJTUVfUkVHRVhQID0gLyg/PHllYXI+XFxkezR9KS0oPzxtb250aD5cXGR7Mn0pLSg/PGRheT5cXGR7Mn0pKD86WyAwLTlUWi46Ky1dKyk/XFxiL3k7XG5leHBvcnQgZnVuY3Rpb24gZGF0ZVRpbWUoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goREFURV9USU1FX1JFR0VYUCk7XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIGNvbnN0IHN0cmluZyA9IG1hdGNoWzBdO1xuICBzY2FubmVyLm5leHQoc3RyaW5nLmxlbmd0aCk7XG4gIGNvbnN0IGdyb3VwcyA9IG1hdGNoLmdyb3VwcztcbiAgLy8gc3BlY2lhbCBjYXNlIGlmIG1vbnRoIGlzIEZlYnJ1YXJ5XG4gIGlmIChncm91cHMubW9udGggPT0gXCIwMlwiKSB7XG4gICAgY29uc3QgZGF5cyA9IHBhcnNlSW50KGdyb3Vwcy5kYXkpO1xuICAgIGlmIChkYXlzID4gMjkpIHtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBkYXRlIHN0cmluZyBcIiR7bWF0Y2h9XCJgKTtcbiAgICB9XG4gICAgY29uc3QgeWVhciA9IHBhcnNlSW50KGdyb3Vwcy55ZWFyKTtcbiAgICBpZiAoZGF5cyA+IDI4ICYmICFpc0xlYXAoeWVhcikpIHtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBkYXRlIHN0cmluZyBcIiR7bWF0Y2h9XCJgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHN0cmluZy50cmltKCkpO1xuICAvLyBpbnZhbGlkIGRhdGVcbiAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBkYXRlIHN0cmluZyBcIiR7bWF0Y2h9XCJgKTtcbiAgfVxuICByZXR1cm4gc3VjY2VzcyhkYXRlKTtcbn1cbmNvbnN0IExPQ0FMX1RJTUVfUkVHRVhQID0gLyhcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pKD86XFwuWzAtOV0rKT9cXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBsb2NhbFRpbWUoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goTE9DQUxfVElNRV9SRUdFWFApPy5bMF07XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dChtYXRjaC5sZW5ndGgpO1xuICByZXR1cm4gc3VjY2VzcyhtYXRjaCk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXJyYXlWYWx1ZShzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGlmIChzY2FubmVyLmNoYXIoKSAhPT0gXCJbXCIpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dCgpO1xuICBjb25zdCBhcnJheSA9IFtdO1xuICB3aGlsZSghc2Nhbm5lci5lb2YoKSl7XG4gICAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gdmFsdWUoc2Nhbm5lcik7XG4gICAgaWYgKCFyZXN1bHQub2spIGJyZWFrO1xuICAgIGFycmF5LnB1c2gocmVzdWx0LmJvZHkpO1xuICAgIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gICAgLy8gbWF5IGhhdmUgYSBuZXh0IGl0ZW0sIGJ1dCB0cmFpbGluZyBjb21tYSBpcyBhbGxvd2VkIGF0IGFycmF5XG4gICAgaWYgKHNjYW5uZXIuY2hhcigpICE9PSBcIixcIikgYnJlYWs7XG4gICAgc2Nhbm5lci5uZXh0KCk7XG4gIH1cbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGlmIChzY2FubmVyLmNoYXIoKSAhPT0gXCJdXCIpIHRocm93IG5ldyBTeW50YXhFcnJvcihcIkFycmF5IGlzIG5vdCBjbG9zZWRcIik7XG4gIHNjYW5uZXIubmV4dCgpO1xuICByZXR1cm4gc3VjY2VzcyhhcnJheSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW5saW5lVGFibGUoc2Nhbm5lcikge1xuICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgaWYgKHNjYW5uZXIuY2hhcigxKSA9PT0gXCJ9XCIpIHtcbiAgICBzY2FubmVyLm5leHQoMik7XG4gICAgcmV0dXJuIHN1Y2Nlc3Moe1xuICAgICAgX19wcm90b19fOiBudWxsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcGFpcnMgPSBzdXJyb3VuZChcIntcIiwgam9pbihwYWlyLCBcIixcIiksIFwifVwiKShzY2FubmVyKTtcbiAgaWYgKCFwYWlycy5vaykgcmV0dXJuIGZhaWx1cmUoKTtcbiAgbGV0IHRhYmxlID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbFxuICB9O1xuICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMuYm9keSl7XG4gICAgdGFibGUgPSBkZWVwTWVyZ2UodGFibGUsIHBhaXIpO1xuICB9XG4gIHJldHVybiBzdWNjZXNzKHRhYmxlKTtcbn1cbmV4cG9ydCBjb25zdCB2YWx1ZSA9IG9yKFtcbiAgbXVsdGlsaW5lQmFzaWNTdHJpbmcsXG4gIG11bHRpbGluZUxpdGVyYWxTdHJpbmcsXG4gIGJhc2ljU3RyaW5nLFxuICBsaXRlcmFsU3RyaW5nLFxuICBib29sZWFuLFxuICBpbmZpbml0eSxcbiAgbmFuLFxuICBkYXRlVGltZSxcbiAgbG9jYWxUaW1lLFxuICBiaW5hcnksXG4gIG9jdGFsLFxuICBoZXgsXG4gIGZsb2F0LFxuICBpbnRlZ2VyLFxuICBhcnJheVZhbHVlLFxuICBpbmxpbmVUYWJsZVxuXSk7XG5leHBvcnQgY29uc3QgcGFpciA9IGt2KGRvdHRlZEtleSwgXCI9XCIsIHZhbHVlKTtcbmV4cG9ydCBmdW5jdGlvbiBibG9jayhzY2FubmVyKSB7XG4gIHNjYW5uZXIubmV4dFVudGlsQ2hhcigpO1xuICBjb25zdCByZXN1bHQgPSBtZXJnZShyZXBlYXQocGFpcikpKHNjYW5uZXIpO1xuICBpZiAocmVzdWx0Lm9rKSByZXR1cm4gc3VjY2Vzcyh7XG4gICAgdHlwZTogXCJCbG9ja1wiLFxuICAgIHZhbHVlOiByZXN1bHQuYm9keVxuICB9KTtcbiAgcmV0dXJuIGZhaWx1cmUoKTtcbn1cbmV4cG9ydCBjb25zdCB0YWJsZUhlYWRlciA9IHN1cnJvdW5kKFwiW1wiLCBkb3R0ZWRLZXksIFwiXVwiKTtcbmV4cG9ydCBmdW5jdGlvbiB0YWJsZShzY2FubmVyKSB7XG4gIHNjYW5uZXIubmV4dFVudGlsQ2hhcigpO1xuICBjb25zdCBoZWFkZXIgPSB0YWJsZUhlYWRlcihzY2FubmVyKTtcbiAgaWYgKCFoZWFkZXIub2spIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dFVudGlsQ2hhcigpO1xuICBjb25zdCBiID0gYmxvY2soc2Nhbm5lcik7XG4gIHJldHVybiBzdWNjZXNzKHtcbiAgICB0eXBlOiBcIlRhYmxlXCIsXG4gICAga2V5czogaGVhZGVyLmJvZHksXG4gICAgdmFsdWU6IGIub2sgPyBiLmJvZHkudmFsdWUgOiB7XG4gICAgICBfX3Byb3RvX186IG51bGxcbiAgICB9XG4gIH0pO1xufVxuZXhwb3J0IGNvbnN0IHRhYmxlQXJyYXlIZWFkZXIgPSBzdXJyb3VuZChcIltbXCIsIGRvdHRlZEtleSwgXCJdXVwiKTtcbmV4cG9ydCBmdW5jdGlvbiB0YWJsZUFycmF5KHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGNvbnN0IGhlYWRlciA9IHRhYmxlQXJyYXlIZWFkZXIoc2Nhbm5lcik7XG4gIGlmICghaGVhZGVyLm9rKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgY29uc3QgYiA9IGJsb2NrKHNjYW5uZXIpO1xuICByZXR1cm4gc3VjY2Vzcyh7XG4gICAgdHlwZTogXCJUYWJsZUFycmF5XCIsXG4gICAga2V5czogaGVhZGVyLmJvZHksXG4gICAgdmFsdWU6IGIub2sgPyBiLmJvZHkudmFsdWUgOiB7XG4gICAgICBfX3Byb3RvX186IG51bGxcbiAgICB9XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvbWwoc2Nhbm5lcikge1xuICBjb25zdCBibG9ja3MgPSByZXBlYXQob3IoW1xuICAgIGJsb2NrLFxuICAgIHRhYmxlQXJyYXksXG4gICAgdGFibGVcbiAgXSkpKHNjYW5uZXIpO1xuICBpZiAoIWJsb2Nrcy5vaykgcmV0dXJuIHN1Y2Nlc3Moe1xuICAgIF9fcHJvdG9fXzogbnVsbFxuICB9KTtcbiAgY29uc3QgYm9keSA9IGJsb2Nrcy5ib2R5LnJlZHVjZShkZWVwQXNzaWduLCB7XG4gICAgX19wcm90b19fOiBudWxsXG4gIH0pO1xuICByZXR1cm4gc3VjY2Vzcyhib2R5KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhcnNlRXJyb3JNZXNzYWdlKHNjYW5uZXIsIG1lc3NhZ2UpIHtcbiAgY29uc3Qgc3RyaW5nID0gc2Nhbm5lci5zb3VyY2Uuc2xpY2UoMCwgc2Nhbm5lci5wb3NpdGlvbik7XG4gIGNvbnN0IGxpbmVzID0gc3RyaW5nLnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCByb3cgPSBsaW5lcy5sZW5ndGg7XG4gIGNvbnN0IGNvbHVtbiA9IGxpbmVzLmF0KC0xKT8ubGVuZ3RoID8/IDA7XG4gIHJldHVybiBgUGFyc2UgZXJyb3Igb24gbGluZSAke3Jvd30sIGNvbHVtbiAke2NvbHVtbn06ICR7bWVzc2FnZX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlckZhY3RvcnkocGFyc2VyKSB7XG4gIHJldHVybiAodG9tbFN0cmluZyk9PntcbiAgICBjb25zdCBzY2FubmVyID0gbmV3IFNjYW5uZXIodG9tbFN0cmluZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICAgIGlmIChyZXN1bHQub2sgJiYgc2Nhbm5lci5lb2YoKSkgcmV0dXJuIHJlc3VsdC5ib2R5O1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBVbmV4cGVjdGVkIGNoYXJhY3RlcjogXCIke3NjYW5uZXIuY2hhcigpfVwiYDtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihjcmVhdGVQYXJzZUVycm9yTWVzc2FnZShzY2FubmVyLCBtZXNzYWdlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihjcmVhdGVQYXJzZUVycm9yTWVzc2FnZShzY2FubmVyLCBlcnJvci5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXNzYWdlID0gXCJJbnZhbGlkIGVycm9yIHR5cGUgY2F1Z2h0XCI7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoY3JlYXRlUGFyc2VFcnJvck1lc3NhZ2Uoc2Nhbm5lciwgbWVzc2FnZSkpO1xuICAgIH1cbiAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV9wYXJzZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IDIwMTgtMjAyNSB0aGUgRGVubyBhdXRob3JzLiBNSVQgbGljZW5zZS5cbi8vIFRoaXMgbW9kdWxlIGlzIGJyb3dzZXIgY29tcGF0aWJsZS5cbmltcG9ydCB7IHBhcnNlckZhY3RvcnksIHRvbWwgfSBmcm9tIFwiLi9fcGFyc2VyLmpzXCI7XG4vKipcbiAqIFBhcnNlcyBhIHtAbGluayBodHRwczovL3RvbWwuaW8gfCBUT01MfSBzdHJpbmcgaW50byBhbiBvYmplY3QuXG4gKlxuICogQGV4YW1wbGUgVXNhZ2VcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBwYXJzZSB9IGZyb20gXCJAc3RkL3RvbWwvcGFyc2VcIjtcbiAqIGltcG9ydCB7IGFzc2VydEVxdWFscyB9IGZyb20gXCJAc3RkL2Fzc2VydFwiO1xuICpcbiAqIGNvbnN0IHRvbWxTdHJpbmcgPSBgdGl0bGUgPSBcIlRPTUwgRXhhbXBsZVwiXG4gKiBbb3duZXJdXG4gKiBuYW1lID0gXCJBbGljZVwiXG4gKiBiaW8gPSBcIkFsaWNlIGlzIGEgcHJvZ3JhbW1lci5cImA7XG4gKlxuICogY29uc3Qgb2JqID0gcGFyc2UodG9tbFN0cmluZyk7XG4gKiBhc3NlcnRFcXVhbHMob2JqLCB7IHRpdGxlOiBcIlRPTUwgRXhhbXBsZVwiLCBvd25lcjogeyBuYW1lOiBcIkFsaWNlXCIsIGJpbzogXCJBbGljZSBpcyBhIHByb2dyYW1tZXIuXCIgfSB9KTtcbiAqIGBgYFxuICogQHBhcmFtIHRvbWxTdHJpbmcgVE9NTCBzdHJpbmcgdG8gYmUgcGFyc2VkLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBKUyBvYmplY3QuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKHRvbWxTdHJpbmcpIHtcbiAgcmV0dXJuIHBhcnNlckZhY3RvcnkodG9tbCkodG9tbFN0cmluZyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS5qcy5tYXAiLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuaW1wb3J0ICogYXMgdHlwYW5pb24gZnJvbSAndHlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTmV3Q29tbWFuZCBleHRlbmRzIENvbW1hbmQge1xuICBzdGF0aWMgcGF0aHMgPSBbWyduZXcnXV1cblxuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhIG5ldyBwcm9qZWN0IHdpdGggcHJlLWNvbmZpZ3VyZWQgYm9pbGVycGxhdGUnLFxuICB9KVxuXG4gICQkcGF0aCA9IE9wdGlvbi5TdHJpbmcoeyByZXF1aXJlZDogZmFsc2UgfSlcblxuICAkJG5hbWU/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLW5hbWUsLW4nLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIG5hbWUgb2YgdGhlIHByb2plY3QsIGRlZmF1bHQgdG8gdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpZiBub3QgcHJvdmlkZWQnLFxuICB9KVxuXG4gIG1pbk5vZGVBcGlWZXJzaW9uID0gT3B0aW9uLlN0cmluZygnLS1taW4tbm9kZS1hcGksLXYnLCAnNCcsIHtcbiAgICB2YWxpZGF0b3I6IHR5cGFuaW9uLmlzTnVtYmVyKCksXG4gICAgZGVzY3JpcHRpb246ICdUaGUgbWluaW11bSBOb2RlLUFQSSB2ZXJzaW9uIHRvIHN1cHBvcnQnLFxuICB9KVxuXG4gIHBhY2thZ2VNYW5hZ2VyID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLW1hbmFnZXInLCAneWFybicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlLiBPbmx5IHN1cHBvcnQgeWFybiA0LnggZm9yIG5vdy4nLFxuICB9KVxuXG4gIGxpY2Vuc2UgPSBPcHRpb24uU3RyaW5nKCctLWxpY2Vuc2UsLWwnLCAnTUlUJywge1xuICAgIGRlc2NyaXB0aW9uOiAnTGljZW5zZSBmb3Igb3Blbi1zb3VyY2VkIHByb2plY3QnLFxuICB9KVxuXG4gIHRhcmdldHMgPSBPcHRpb24uQXJyYXkoJy0tdGFyZ2V0cywtdCcsIFtdLCB7XG4gICAgZGVzY3JpcHRpb246ICdBbGwgdGFyZ2V0cyB0aGUgY3JhdGUgd2lsbCBiZSBjb21waWxlZCBmb3IuJyxcbiAgfSlcblxuICBlbmFibGVEZWZhdWx0VGFyZ2V0cyA9IE9wdGlvbi5Cb29sZWFuKCctLWVuYWJsZS1kZWZhdWx0LXRhcmdldHMnLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIGVuYWJsZSBkZWZhdWx0IHRhcmdldHMnLFxuICB9KVxuXG4gIGVuYWJsZUFsbFRhcmdldHMgPSBPcHRpb24uQm9vbGVhbignLS1lbmFibGUtYWxsLXRhcmdldHMnLCBmYWxzZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBlbmFibGUgYWxsIHRhcmdldHMnLFxuICB9KVxuXG4gIGVuYWJsZVR5cGVEZWYgPSBPcHRpb24uQm9vbGVhbignLS1lbmFibGUtdHlwZS1kZWYnLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnV2hldGhlciBlbmFibGUgdGhlIGB0eXBlLWRlZmAgZmVhdHVyZSBmb3IgdHlwZXNjcmlwdCBkZWZpbml0aW9ucyBhdXRvLWdlbmVyYXRpb24nLFxuICB9KVxuXG4gIGVuYWJsZUdpdGh1YkFjdGlvbnMgPSBPcHRpb24uQm9vbGVhbignLS1lbmFibGUtZ2l0aHViLWFjdGlvbnMnLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIGdlbmVyYXRlIHByZWNvbmZpZ3VyZWQgR2l0SHViIEFjdGlvbnMgd29ya2Zsb3cnLFxuICB9KVxuXG4gIHRlc3RGcmFtZXdvcmsgPSBPcHRpb24uU3RyaW5nKCctLXRlc3QtZnJhbWV3b3JrJywgJ2F2YScsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgSmF2YVNjcmlwdCB0ZXN0IGZyYW1ld29yayB0byB1c2UsIG9ubHkgc3VwcG9ydCBgYXZhYCBmb3Igbm93JyxcbiAgfSlcblxuICBkcnlSdW4gPSBPcHRpb24uQm9vbGVhbignLS1kcnktcnVuJywgZmFsc2UsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHRoZSBjb21tYW5kIGluIGRyeS1ydW4gbW9kZScsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogdGhpcy4kJHBhdGgsXG4gICAgICBuYW1lOiB0aGlzLiQkbmFtZSxcbiAgICAgIG1pbk5vZGVBcGlWZXJzaW9uOiB0aGlzLm1pbk5vZGVBcGlWZXJzaW9uLFxuICAgICAgcGFja2FnZU1hbmFnZXI6IHRoaXMucGFja2FnZU1hbmFnZXIsXG4gICAgICBsaWNlbnNlOiB0aGlzLmxpY2Vuc2UsXG4gICAgICB0YXJnZXRzOiB0aGlzLnRhcmdldHMsXG4gICAgICBlbmFibGVEZWZhdWx0VGFyZ2V0czogdGhpcy5lbmFibGVEZWZhdWx0VGFyZ2V0cyxcbiAgICAgIGVuYWJsZUFsbFRhcmdldHM6IHRoaXMuZW5hYmxlQWxsVGFyZ2V0cyxcbiAgICAgIGVuYWJsZVR5cGVEZWY6IHRoaXMuZW5hYmxlVHlwZURlZixcbiAgICAgIGVuYWJsZUdpdGh1YkFjdGlvbnM6IHRoaXMuZW5hYmxlR2l0aHViQWN0aW9ucyxcbiAgICAgIHRlc3RGcmFtZXdvcms6IHRoaXMudGVzdEZyYW1ld29yayxcbiAgICAgIGRyeVJ1bjogdGhpcy5kcnlSdW4sXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHByb2plY3Qgd2l0aCBwcmUtY29uZmlndXJlZCBib2lsZXJwbGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ld09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHBhdGggd2hlcmUgdGhlIE5BUEktUlMgcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICBwYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCwgZGVmYXVsdCB0byB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGlmIG5vdCBwcm92aWRlZFxuICAgKi9cbiAgbmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gTm9kZS1BUEkgdmVyc2lvbiB0byBzdXBwb3J0XG4gICAqXG4gICAqIEBkZWZhdWx0IDRcbiAgICovXG4gIG1pbk5vZGVBcGlWZXJzaW9uPzogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZS4gT25seSBzdXBwb3J0IHlhcm4gNC54IGZvciBub3cuXG4gICAqXG4gICAqIEBkZWZhdWx0ICd5YXJuJ1xuICAgKi9cbiAgcGFja2FnZU1hbmFnZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIExpY2Vuc2UgZm9yIG9wZW4tc291cmNlZCBwcm9qZWN0XG4gICAqXG4gICAqIEBkZWZhdWx0ICdNSVQnXG4gICAqL1xuICBsaWNlbnNlPzogc3RyaW5nXG4gIC8qKlxuICAgKiBBbGwgdGFyZ2V0cyB0aGUgY3JhdGUgd2lsbCBiZSBjb21waWxlZCBmb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICB0YXJnZXRzPzogc3RyaW5nW11cbiAgLyoqXG4gICAqIFdoZXRoZXIgZW5hYmxlIGRlZmF1bHQgdGFyZ2V0c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVEZWZhdWx0VGFyZ2V0cz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZW5hYmxlIGFsbCB0YXJnZXRzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBlbmFibGVBbGxUYXJnZXRzPzogYm9vbGVhblxuICAvKipcbiAgICogV2hldGhlciBlbmFibGUgdGhlIGB0eXBlLWRlZmAgZmVhdHVyZSBmb3IgdHlwZXNjcmlwdCBkZWZpbml0aW9ucyBhdXRvLWdlbmVyYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlVHlwZURlZj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZ2VuZXJhdGUgcHJlY29uZmlndXJlZCBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVHaXRodWJBY3Rpb25zPzogYm9vbGVhblxuICAvKipcbiAgICogVGhlIEphdmFTY3JpcHQgdGVzdCBmcmFtZXdvcmsgdG8gdXNlLCBvbmx5IHN1cHBvcnQgYGF2YWAgZm9yIG5vd1xuICAgKlxuICAgKiBAZGVmYXVsdCAnYXZhJ1xuICAgKi9cbiAgdGVzdEZyYW1ld29yaz86IHN0cmluZ1xuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIGNvbW1hbmQgaW4gZHJ5LXJ1biBtb2RlXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkcnlSdW4/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHROZXdPcHRpb25zKG9wdGlvbnM6IE5ld09wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBtaW5Ob2RlQXBpVmVyc2lvbjogNCxcbiAgICBwYWNrYWdlTWFuYWdlcjogJ3lhcm4nLFxuICAgIGxpY2Vuc2U6ICdNSVQnLFxuICAgIHRhcmdldHM6IFtdLFxuICAgIGVuYWJsZURlZmF1bHRUYXJnZXRzOiB0cnVlLFxuICAgIGVuYWJsZUFsbFRhcmdldHM6IGZhbHNlLFxuICAgIGVuYWJsZVR5cGVEZWY6IHRydWUsXG4gICAgZW5hYmxlR2l0aHViQWN0aW9uczogdHJ1ZSxcbiAgICB0ZXN0RnJhbWV3b3JrOiAnYXZhJyxcbiAgICBkcnlSdW46IGZhbHNlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGlzQWJzb2x1dGUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG4vKipcbiogUmVzb2x2ZSBhbiBhYnNvbHV0ZSBwYXRoIGZyb20ge0BsaW5rIHJvb3R9LCBidXQgb25seVxuKiBpZiB7QGxpbmsgaW5wdXR9IGlzbid0IGFscmVhZHkgYWJzb2x1dGUuXG4qXG4qIEBwYXJhbSBpbnB1dCBUaGUgcGF0aCB0byByZXNvbHZlLlxuKiBAcGFyYW0gcm9vdCBUaGUgYmFzZSBwYXRoOyBkZWZhdWx0ID0gcHJvY2Vzcy5jd2QoKVxuKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgYWJzb2x1dGUgcGF0aC5cbiovXG5leHBvcnQgZnVuY3Rpb24gYWJzb2x1dGUoaW5wdXQsIHJvb3QpIHtcblx0cmV0dXJuIGlzQWJzb2x1dGUoaW5wdXQpID8gaW5wdXQgOiByZXNvbHZlKHJvb3QgfHwgXCIuXCIsIGlucHV0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmcm9tKHJvb3QsIGlkZW50LCBzaWxlbnQpIHtcblx0dHJ5IHtcblx0XHQvLyBOT1RFOiBkaXJzIG5lZWQgYSB0cmFpbGluZyBcIi9cIiBPUiBmaWxlbmFtZS4gV2l0aCBcIi9cIiByb3V0ZSxcblx0XHQvLyBOb2RlIGFkZHMgXCJub29wLmpzXCIgYXMgbWFpbiBmaWxlLCBzbyBqdXN0IGRvIFwibm9vcC5qc1wiIGFueXdheS5cblx0XHRsZXQgciA9IHJvb3QgaW5zdGFuY2VvZiBVUkwgfHwgcm9vdC5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSA/IGpvaW4oZmlsZVVSTFRvUGF0aChyb290KSwgXCJub29wLmpzXCIpIDogam9pbihhYnNvbHV0ZShyb290KSwgXCJub29wLmpzXCIpO1xuXHRcdHJldHVybiBjcmVhdGVSZXF1aXJlKHIpLnJlc29sdmUoaWRlbnQpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRpZiAoIXNpbGVudCkgdGhyb3cgZXJyO1xuXHR9XG59XG5leHBvcnQgZnVuY3Rpb24gY3dkKGlkZW50LCBzaWxlbnQpIHtcblx0cmV0dXJuIGZyb20ocmVzb2x2ZSgpLCBpZGVudCwgc2lsZW50KTtcbn1cbiIsImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBhYnNvbHV0ZSB9IGZyb20gXCJlbXBhdGhpYy9yZXNvbHZlXCI7XG4vKipcbiogR2V0IGFsbCBwYXJlbnQgZGlyZWN0b3JpZXMgb2Yge0BsaW5rIGJhc2V9LlxuKiBTdG9wcyBhZnRlciB7QGxpbmsgT3B0aW9uc1snbGFzdCddfSBpcyBwcm9jZXNzZWQuXG4qXG4qIEByZXR1cm5zIEFuIGFycmF5IG9mIGFic29sdXRlIHBhdGhzIG9mIGFsbCBwYXJlbnQgZGlyZWN0b3JpZXMuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHVwKGJhc2UsIG9wdGlvbnMpIHtcblx0bGV0IHsgbGFzdCwgY3dkIH0gPSBvcHRpb25zIHx8IHt9O1xuXHRsZXQgdG1wID0gYWJzb2x1dGUoYmFzZSwgY3dkKTtcblx0bGV0IHJvb3QgPSBhYnNvbHV0ZShsYXN0IHx8IFwiL1wiLCBjd2QpO1xuXHRsZXQgcHJldiwgYXJyID0gW107XG5cdHdoaWxlIChwcmV2ICE9PSByb290KSB7XG5cdFx0YXJyLnB1c2godG1wKTtcblx0XHR0bXAgPSBkaXJuYW1lKHByZXYgPSB0bXApO1xuXHRcdGlmICh0bXAgPT09IHByZXYpIGJyZWFrO1xuXHR9XG5cdHJldHVybiBhcnI7XG59XG4iLCJpbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgc3RhdFN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgd2FsayBmcm9tIFwiZW1wYXRoaWMvd2Fsa1wiO1xuLyoqXG4qIEZpbmQgYW4gaXRlbSBieSBuYW1lLCB3YWxraW5nIHBhcmVudCBkaXJlY3RvcmllcyB1bnRpbCBmb3VuZC5cbipcbiogQHBhcmFtIG5hbWUgVGhlIGl0ZW0gbmFtZSB0byBmaW5kLlxuKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgaXRlbSwgaWYgZm91bmQuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHVwKG5hbWUsIG9wdGlvbnMpIHtcblx0bGV0IGRpciwgdG1wO1xuXHRsZXQgc3RhcnQgPSBvcHRpb25zICYmIG9wdGlvbnMuY3dkIHx8IFwiXCI7XG5cdGZvciAoZGlyIG9mIHdhbGsudXAoc3RhcnQsIG9wdGlvbnMpKSB7XG5cdFx0dG1wID0gam9pbihkaXIsIG5hbWUpO1xuXHRcdGlmIChleGlzdHNTeW5jKHRtcCkpIHJldHVybiB0bXA7XG5cdH1cbn1cbi8qKlxuKiBHZXQgdGhlIGZpcnN0IHBhdGggdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgbmFtZXMgcHJvdmlkZWQuXG4qXG4qID4gW05PVEVdXG4qID4gVGhlIG9yZGVyIG9mIHtAbGluayBuYW1lc30gaXMgcmVzcGVjdGVkLlxuKlxuKiBAcGFyYW0gbmFtZXMgVGhlIGl0ZW0gbmFtZXMgdG8gZmluZC5cbiogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpcnN0IGl0ZW0gZm91bmQsIGlmIGFueS5cbiovXG5leHBvcnQgZnVuY3Rpb24gYW55KG5hbWVzLCBvcHRpb25zKSB7XG5cdGxldCBkaXIsIHN0YXJ0ID0gb3B0aW9ucyAmJiBvcHRpb25zLmN3ZCB8fCBcIlwiO1xuXHRsZXQgaiA9IDAsIGxlbiA9IG5hbWVzLmxlbmd0aCwgdG1wO1xuXHRmb3IgKGRpciBvZiB3YWxrLnVwKHN0YXJ0LCBvcHRpb25zKSkge1xuXHRcdGZvciAoaiA9IDA7IGogPCBsZW47IGorKykge1xuXHRcdFx0dG1wID0gam9pbihkaXIsIG5hbWVzW2pdKTtcblx0XHRcdGlmIChleGlzdHNTeW5jKHRtcCkpIHJldHVybiB0bXA7XG5cdFx0fVxuXHR9XG59XG4vKipcbiogRmluZCBhIGZpbGUgYnkgbmFtZSwgd2Fsa2luZyBwYXJlbnQgZGlyZWN0b3JpZXMgdW50aWwgZm91bmQuXG4qXG4qID4gW05PVEVdXG4qID4gVGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgYSB2YWx1ZSBmb3IgZmlsZSBtYXRjaGVzLlxuKiA+IEEgZGlyZWN0b3J5IG1hdGNoIHdpdGggdGhlIHNhbWUgbmFtZSB3aWxsIGJlIGlnbm9yZWQuXG4qXG4qIEBwYXJhbSBuYW1lIFRoZSBmaWxlIG5hbWUgdG8gZmluZC5cbiogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUsIGlmIGZvdW5kLlxuKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxlKG5hbWUsIG9wdGlvbnMpIHtcblx0bGV0IGRpciwgdG1wO1xuXHRsZXQgc3RhcnQgPSBvcHRpb25zICYmIG9wdGlvbnMuY3dkIHx8IFwiXCI7XG5cdGZvciAoZGlyIG9mIHdhbGsudXAoc3RhcnQsIG9wdGlvbnMpKSB7XG5cdFx0dHJ5IHtcblx0XHRcdHRtcCA9IGpvaW4oZGlyLCBuYW1lKTtcblx0XHRcdGlmIChzdGF0U3luYyh0bXApLmlzRmlsZSgpKSByZXR1cm4gdG1wO1xuXHRcdH0gY2F0Y2gge31cblx0fVxufVxuLyoqXG4qIEZpbmQgYSBkaXJlY3RvcnkgYnkgbmFtZSwgd2Fsa2luZyBwYXJlbnQgZGlyZWN0b3JpZXMgdW50aWwgZm91bmQuXG4qXG4qID4gW05PVEVdXG4qID4gVGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgYSB2YWx1ZSBmb3IgZGlyZWN0b3J5IG1hdGNoZXMuXG4qID4gQSBmaWxlIG1hdGNoIHdpdGggdGhlIHNhbWUgbmFtZSB3aWxsIGJlIGlnbm9yZWQuXG4qXG4qIEBwYXJhbSBuYW1lIFRoZSBkaXJlY3RvcnkgbmFtZSB0byBmaW5kLlxuKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSwgaWYgZm91bmQuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcihuYW1lLCBvcHRpb25zKSB7XG5cdGxldCBkaXIsIHRtcDtcblx0bGV0IHN0YXJ0ID0gb3B0aW9ucyAmJiBvcHRpb25zLmN3ZCB8fCBcIlwiO1xuXHRmb3IgKGRpciBvZiB3YWxrLnVwKHN0YXJ0LCBvcHRpb25zKSkge1xuXHRcdHRyeSB7XG5cdFx0XHR0bXAgPSBqb2luKGRpciwgbmFtZSk7XG5cdFx0XHRpZiAoc3RhdFN5bmModG1wKS5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdG1wO1xuXHRcdH0gY2F0Y2gge31cblx0fVxufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBjb2RlZ2VuL2luZGV4LnRzXG4vLyBEbyBub3QgZWRpdCB0aGlzIGZpbGUgbWFudWFsbHlcbmltcG9ydCB7IENvbW1hbmQsIE9wdGlvbiB9IGZyb20gJ2NsaXBhbmlvbidcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VSZW5hbWVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ3JlbmFtZSddXVxuXG4gIHN0YXRpYyB1c2FnZSA9IENvbW1hbmQuVXNhZ2Uoe1xuICAgIGRlc2NyaXB0aW9uOiAnUmVuYW1lIHRoZSBOQVBJLVJTIHByb2plY3QnLFxuICB9KVxuXG4gIGN3ZCA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywgcHJvY2Vzcy5jd2QoKSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgY29uZmlnUGF0aD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY29uZmlnLXBhdGgsLWMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlJyxcbiAgfSlcblxuICBwYWNrYWdlSnNvblBhdGggPSBPcHRpb24uU3RyaW5nKCctLXBhY2thZ2UtanNvbi1wYXRoJywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIG5wbURpciA9IE9wdGlvbi5TdHJpbmcoJy0tbnBtLWRpcicsICducG0nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXQnLFxuICB9KVxuXG4gICQkbmFtZT86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tbmFtZSwtbicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBuZXcgbmFtZSBvZiB0aGUgcHJvamVjdCcsXG4gIH0pXG5cbiAgYmluYXJ5TmFtZT86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tYmluYXJ5LW5hbWUsLWInLCB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgbmV3IGJpbmFyeSBuYW1lICoubm9kZSBmaWxlcycsXG4gIH0pXG5cbiAgcGFja2FnZU5hbWU/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLXBhY2thZ2UtbmFtZScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBuZXcgcGFja2FnZSBuYW1lIG9mIHRoZSBwcm9qZWN0JyxcbiAgfSlcblxuICBtYW5pZmVzdFBhdGggPSBPcHRpb24uU3RyaW5nKCctLW1hbmlmZXN0LXBhdGgnLCAnQ2FyZ28udG9tbCcsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYENhcmdvLnRvbWxgJyxcbiAgfSlcblxuICByZXBvc2l0b3J5Pzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1yZXBvc2l0b3J5Jywge1xuICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5ldyByZXBvc2l0b3J5IG9mIHRoZSBwcm9qZWN0JyxcbiAgfSlcblxuICBkZXNjcmlwdGlvbj86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tZGVzY3JpcHRpb24nLCB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgbmV3IGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0JyxcbiAgfSlcblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIG5wbURpcjogdGhpcy5ucG1EaXIsXG4gICAgICBuYW1lOiB0aGlzLiQkbmFtZSxcbiAgICAgIGJpbmFyeU5hbWU6IHRoaXMuYmluYXJ5TmFtZSxcbiAgICAgIHBhY2thZ2VOYW1lOiB0aGlzLnBhY2thZ2VOYW1lLFxuICAgICAgbWFuaWZlc3RQYXRoOiB0aGlzLm1hbmlmZXN0UGF0aCxcbiAgICAgIHJlcG9zaXRvcnk6IHRoaXMucmVwb3NpdG9yeSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbmFtZSB0aGUgTkFQSS1SUyBwcm9qZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGhcbiAgICpcbiAgICogQGRlZmF1bHQgcHJvY2Vzcy5jd2QoKVxuICAgKi9cbiAgY3dkPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlXG4gICAqL1xuICBjb25maWdQYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBwYWNrYWdlLmpzb25gXG4gICAqXG4gICAqIEBkZWZhdWx0ICdwYWNrYWdlLmpzb24nXG4gICAqL1xuICBwYWNrYWdlSnNvblBhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGZvbGRlciB3aGVyZSB0aGUgbnBtIHBhY2thZ2VzIHB1dFxuICAgKlxuICAgKiBAZGVmYXVsdCAnbnBtJ1xuICAgKi9cbiAgbnBtRGlyPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmV3IG5hbWUgb2YgdGhlIHByb2plY3RcbiAgICovXG4gIG5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSBuZXcgYmluYXJ5IG5hbWUgKi5ub2RlIGZpbGVzXG4gICAqL1xuICBiaW5hcnlOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmV3IHBhY2thZ2UgbmFtZSBvZiB0aGUgcHJvamVjdFxuICAgKi9cbiAgcGFja2FnZU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYENhcmdvLnRvbWxgXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDYXJnby50b21sJ1xuICAgKi9cbiAgbWFuaWZlc3RQYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmV3IHJlcG9zaXRvcnkgb2YgdGhlIHByb2plY3RcbiAgICovXG4gIHJlcG9zaXRvcnk/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSBuZXcgZGVzY3JpcHRpb24gb2YgdGhlIHByb2plY3RcbiAgICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRSZW5hbWVPcHRpb25zKG9wdGlvbnM6IFJlbmFtZU9wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgcGFja2FnZUpzb25QYXRoOiAncGFja2FnZS5qc29uJyxcbiAgICBucG1EaXI6ICducG0nLFxuICAgIG1hbmlmZXN0UGF0aDogJ0NhcmdvLnRvbWwnLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cbn1cbiIsImltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgcmVuYW1lIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IHJlc29sdmUsIGpvaW4gfSBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlVG9tbCwgc3RyaW5naWZ5IGFzIHN0cmluZ2lmeVRvbWwgfSBmcm9tICdAc3RkL3RvbWwnXG5pbXBvcnQgeyBsb2FkIGFzIHlhbWxQYXJzZSwgZHVtcCBhcyB5YW1sU3RyaW5naWZ5IH0gZnJvbSAnanMteWFtbCdcbmltcG9ydCB7IGlzTmlsLCBtZXJnZSwgb21pdEJ5LCBwaWNrIH0gZnJvbSAnZXMtdG9vbGtpdCdcbmltcG9ydCAqIGFzIGZpbmQgZnJvbSAnZW1wYXRoaWMvZmluZCdcblxuaW1wb3J0IHsgYXBwbHlEZWZhdWx0UmVuYW1lT3B0aW9ucywgdHlwZSBSZW5hbWVPcHRpb25zIH0gZnJvbSAnLi4vZGVmL3JlbmFtZS5qcydcbmltcG9ydCB7IHJlYWRDb25maWcsIHJlYWRGaWxlQXN5bmMsIHdyaXRlRmlsZUFzeW5jIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVQcm9qZWN0KHVzZXJPcHRpb25zOiBSZW5hbWVPcHRpb25zKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcHBseURlZmF1bHRSZW5hbWVPcHRpb25zKHVzZXJPcHRpb25zKVxuICBjb25zdCBuYXBpQ29uZmlnID0gYXdhaXQgcmVhZENvbmZpZyhvcHRpb25zKVxuICBjb25zdCBvbGROYW1lID0gbmFwaUNvbmZpZy5iaW5hcnlOYW1lXG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5wYWNrYWdlSnNvblBhdGgpXG4gIGNvbnN0IGNhcmdvVG9tbFBhdGggPSByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLm1hbmlmZXN0UGF0aClcblxuICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZUFzeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKVxuICBjb25zdCBwYWNrYWdlSnNvbkRhdGEgPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudClcblxuICBtZXJnZShcbiAgICBtZXJnZShcbiAgICAgIHBhY2thZ2VKc29uRGF0YSxcbiAgICAgIG9taXRCeShcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtaXNzaW5nIGZpZWxkczogYXV0aG9yIGFuZCBsaWNlbnNlXG4gICAgICAgIHBpY2sob3B0aW9ucywgWyduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2F1dGhvcicsICdsaWNlbnNlJ10pLFxuICAgICAgICBpc05pbCxcbiAgICAgICksXG4gICAgKSxcbiAgICB7XG4gICAgICBuYXBpOiBvbWl0QnkoXG4gICAgICAgIHtcbiAgICAgICAgICBiaW5hcnlOYW1lOiBvcHRpb25zLmJpbmFyeU5hbWUsXG4gICAgICAgICAgcGFja2FnZU5hbWU6IG9wdGlvbnMucGFja2FnZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGlzTmlsLFxuICAgICAgKSxcbiAgICB9LFxuICApXG5cbiAgaWYgKG9wdGlvbnMucmVwb3NpdG9yeSkge1xuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGF0YS5yZXBvc2l0b3J5ICYmXG4gICAgICB0eXBlb2YgcGFja2FnZUpzb25EYXRhLnJlcG9zaXRvcnkgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShwYWNrYWdlSnNvbkRhdGEucmVwb3NpdG9yeSlcbiAgICApIHtcbiAgICAgIHBhY2thZ2VKc29uRGF0YS5yZXBvc2l0b3J5LnVybCA9IG9wdGlvbnMucmVwb3NpdG9yeVxuICAgIH0gZWxzZSB7XG4gICAgICBwYWNrYWdlSnNvbkRhdGEucmVwb3NpdG9yeSA9IG9wdGlvbnMucmVwb3NpdG9yeVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLmNvbmZpZ1BhdGgpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5jb25maWdQYXRoKVxuICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBhd2FpdCByZWFkRmlsZUFzeW5jKGNvbmZpZ1BhdGgsICd1dGY4JylcbiAgICBjb25zdCBjb25maWdEYXRhID0gSlNPTi5wYXJzZShjb25maWdDb250ZW50KVxuICAgIG1lcmdlKFxuICAgICAgY29uZmlnRGF0YSxcbiAgICAgIG9taXRCeShcbiAgICAgICAge1xuICAgICAgICAgIGJpbmFyeU5hbWU6IG9wdGlvbnMuYmluYXJ5TmFtZSxcbiAgICAgICAgICBwYWNrYWdlTmFtZTogb3B0aW9ucy5wYWNrYWdlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgaXNOaWwsXG4gICAgICApLFxuICAgIClcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWdEYXRhLCBudWxsLCAyKSlcbiAgfVxuXG4gIGF3YWl0IHdyaXRlRmlsZUFzeW5jKFxuICAgIHBhY2thZ2VKc29uUGF0aCxcbiAgICBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbkRhdGEsIG51bGwsIDIpLFxuICApXG5cbiAgY29uc3QgdG9tbENvbnRlbnQgPSBhd2FpdCByZWFkRmlsZUFzeW5jKGNhcmdvVG9tbFBhdGgsICd1dGY4JylcbiAgY29uc3QgY2FyZ29Ub21sID0gcGFyc2VUb21sKHRvbWxDb250ZW50KSBhcyBhbnlcblxuICAvLyBVcGRhdGUgdGhlIHBhY2thZ2UgbmFtZVxuICBpZiAoY2FyZ29Ub21sLnBhY2thZ2UgJiYgb3B0aW9ucy5iaW5hcnlOYW1lKSB7XG4gICAgLy8gU2FuaXRpemUgdGhlIGJpbmFyeSBuYW1lIGZvciBSdXN0IHBhY2thZ2UgbmFtaW5nIGNvbnZlbnRpb25zXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IG9wdGlvbnMuYmluYXJ5TmFtZVxuICAgICAgLnJlcGxhY2UoJ0AnLCAnJylcbiAgICAgIC5yZXBsYWNlKCcvJywgJ18nKVxuICAgICAgLnJlcGxhY2UoLy0vZywgJ18nKVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICBjYXJnb1RvbWwucGFja2FnZS5uYW1lID0gc2FuaXRpemVkTmFtZVxuICB9XG5cbiAgLy8gU3RyaW5naWZ5IHRoZSB1cGRhdGVkIFRPTUxcbiAgY29uc3QgdXBkYXRlZFRvbWxDb250ZW50ID0gc3RyaW5naWZ5VG9tbChjYXJnb1RvbWwpXG5cbiAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoY2FyZ29Ub21sUGF0aCwgdXBkYXRlZFRvbWxDb250ZW50KVxuICBpZiAob3B0aW9ucy5iaW5hcnlOYW1lICYmIG9sZE5hbWUgIT09IG9wdGlvbnMuYmluYXJ5TmFtZSkge1xuICAgIGNvbnN0IGdpdGh1YkFjdGlvbnNQYXRoID0gZmluZC5kaXIoJy5naXRodWInLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgIH0pXG4gICAgaWYgKGdpdGh1YkFjdGlvbnNQYXRoKSB7XG4gICAgICBjb25zdCBnaXRodWJBY3Rpb25zQ0lZbWxQYXRoID0gam9pbihcbiAgICAgICAgZ2l0aHViQWN0aW9uc1BhdGgsXG4gICAgICAgICd3b3JrZmxvd3MnLFxuICAgICAgICAnQ0kueW1sJyxcbiAgICAgIClcbiAgICAgIGlmIChleGlzdHNTeW5jKGdpdGh1YkFjdGlvbnNDSVltbFBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGdpdGh1YkFjdGlvbnNDb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhcbiAgICAgICAgICBnaXRodWJBY3Rpb25zQ0lZbWxQYXRoLFxuICAgICAgICAgICd1dGY4JyxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBnaXRodWJBY3Rpb25zRGF0YSA9IHlhbWxQYXJzZShnaXRodWJBY3Rpb25zQ29udGVudCkgYXMgYW55XG4gICAgICAgIGlmIChnaXRodWJBY3Rpb25zRGF0YS5lbnY/LkFQUF9OQU1FKSB7XG4gICAgICAgICAgZ2l0aHViQWN0aW9uc0RhdGEuZW52LkFQUF9OQU1FID0gb3B0aW9ucy5iaW5hcnlOYW1lXG4gICAgICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICAgICAgICBnaXRodWJBY3Rpb25zQ0lZbWxQYXRoLFxuICAgICAgICAgICAgeWFtbFN0cmluZ2lmeShnaXRodWJBY3Rpb25zRGF0YSwge1xuICAgICAgICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgICAgICAgIHNvcnRLZXlzOiBmYWxzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvbGRXYXNpQnJvd3NlckJpbmRpbmdQYXRoID0gam9pbihcbiAgICAgIG9wdGlvbnMuY3dkLFxuICAgICAgYCR7b2xkTmFtZX0ud2FzaS1icm93c2VyLmpzYCxcbiAgICApXG4gICAgaWYgKGV4aXN0c1N5bmMob2xkV2FzaUJyb3dzZXJCaW5kaW5nUGF0aCkpIHtcbiAgICAgIGF3YWl0IHJlbmFtZShcbiAgICAgICAgb2xkV2FzaUJyb3dzZXJCaW5kaW5nUGF0aCxcbiAgICAgICAgam9pbihvcHRpb25zLmN3ZCwgYCR7b3B0aW9ucy5iaW5hcnlOYW1lfS53YXNpLWJyb3dzZXIuanNgKSxcbiAgICAgIClcbiAgICB9XG4gICAgY29uc3Qgb2xkV2FzaUJpbmRpbmdQYXRoID0gam9pbihvcHRpb25zLmN3ZCwgYCR7b2xkTmFtZX0ud2FzaS5janNgKVxuICAgIGlmIChleGlzdHNTeW5jKG9sZFdhc2lCaW5kaW5nUGF0aCkpIHtcbiAgICAgIGF3YWl0IHJlbmFtZShcbiAgICAgICAgb2xkV2FzaUJpbmRpbmdQYXRoLFxuICAgICAgICBqb2luKG9wdGlvbnMuY3dkLCBgJHtvcHRpb25zLmJpbmFyeU5hbWV9Lndhc2kuY2pzYCksXG4gICAgICApXG4gICAgfVxuICAgIGNvbnN0IGdpdEF0dHJpYnV0ZXNQYXRoID0gam9pbihvcHRpb25zLmN3ZCwgJy5naXRhdHRyaWJ1dGVzJylcbiAgICBpZiAoZXhpc3RzU3luYyhnaXRBdHRyaWJ1dGVzUGF0aCkpIHtcbiAgICAgIGNvbnN0IGdpdEF0dHJpYnV0ZXNDb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhcbiAgICAgICAgZ2l0QXR0cmlidXRlc1BhdGgsXG4gICAgICAgICd1dGY4JyxcbiAgICAgIClcbiAgICAgIGNvbnN0IGdpdEF0dHJpYnV0ZXNEYXRhID0gZ2l0QXR0cmlidXRlc0NvbnRlbnRcbiAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGxpbmVcbiAgICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgICBgJHtvbGROYW1lfS53YXNpLWJyb3dzZXIuanNgLFxuICAgICAgICAgICAgICBgJHtvcHRpb25zLmJpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2AsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucmVwbGFjZShgJHtvbGROYW1lfS53YXNpLmNqc2AsIGAke29wdGlvbnMuYmluYXJ5TmFtZX0ud2FzaS5janNgKVxuICAgICAgICB9KVxuICAgICAgICAuam9pbignXFxuJylcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKGdpdEF0dHJpYnV0ZXNQYXRoLCBnaXRBdHRyaWJ1dGVzRGF0YSlcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGV4ZWMsIGV4ZWNTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcblxuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VUb21sLCBzdHJpbmdpZnkgYXMgc3RyaW5naWZ5VG9tbCB9IGZyb20gJ0BzdGQvdG9tbCdcbmltcG9ydCB7IGxvYWQgYXMgeWFtbExvYWQsIGR1bXAgYXMgeWFtbER1bXAgfSBmcm9tICdqcy15YW1sJ1xuXG5pbXBvcnQge1xuICBhcHBseURlZmF1bHROZXdPcHRpb25zLFxuICB0eXBlIE5ld09wdGlvbnMgYXMgUmF3TmV3T3B0aW9ucyxcbn0gZnJvbSAnLi4vZGVmL25ldy5qcydcbmltcG9ydCB7XG4gIEFWQUlMQUJMRV9UQVJHRVRTLFxuICBkZWJ1Z0ZhY3RvcnksXG4gIERFRkFVTFRfVEFSR0VUUyxcbiAgbWtkaXJBc3luYyxcbiAgcGFyc2VUcmlwbGUsXG4gIHJlYWRkaXJBc3luYyxcbiAgc3RhdEFzeW5jLFxuICB0eXBlIFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2VyLFxufSBmcm9tICcuLi91dGlscy9pbmRleC5qcydcbmltcG9ydCB7IG5hcGlFbmdpbmVSZXF1aXJlbWVudCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnXG5pbXBvcnQgeyByZW5hbWVQcm9qZWN0IH0gZnJvbSAnLi9yZW5hbWUuanMnXG5cbi8vIFRlbXBsYXRlIGltcG9ydHMgcmVtb3ZlZCBhcyB3ZSdyZSBub3cgdXNpbmcgZXh0ZXJuYWwgdGVtcGxhdGVzXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCduZXcnKVxuXG50eXBlIE5ld09wdGlvbnMgPSBSZXF1aXJlZDxSYXdOZXdPcHRpb25zPlxuXG5jb25zdCBURU1QTEFURV9SRVBPUyA9IHtcbiAgeWFybjogJ2h0dHBzOi8vZ2l0aHViLmNvbS9uYXBpLXJzL3BhY2thZ2UtdGVtcGxhdGUnLFxuICBwbnBtOiAnaHR0cHM6Ly9naXRodWIuY29tL25hcGktcnMvcGFja2FnZS10ZW1wbGF0ZS1wbnBtJyxcbn0gYXMgY29uc3RcblxuY29uc3QgV0FTSV9UQVJHRVQgPSAnd2FzbTMyLXdhc2lwMS10aHJlYWRzJ1xuXG5hc3luYyBmdW5jdGlvbiBjaGVja0dpdENvbW1hbmQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGNwID0gZXhlYygnZ2l0IC0tdmVyc2lvbicpXG4gICAgY3Aub24oJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICB9KVxuICAgIGNwLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgIHJlc29sdmUoY29kZSA9PT0gMClcbiAgICB9KVxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVDYWNoZURpcihcbiAgcGFja2FnZU1hbmFnZXI6IFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2VyLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVEaXIgPSBwYXRoLmpvaW4oaG9tZWRpcigpLCAnLm5hcGktcnMnLCAndGVtcGxhdGUnLCBwYWNrYWdlTWFuYWdlcilcbiAgYXdhaXQgbWtkaXJBc3luYyhjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgcmV0dXJuIGNhY2hlRGlyXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkVGVtcGxhdGUoXG4gIHBhY2thZ2VNYW5hZ2VyOiBTdXBwb3J0ZWRQYWNrYWdlTWFuYWdlcixcbiAgY2FjaGVEaXI6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXBvVXJsID0gVEVNUExBVEVfUkVQT1NbcGFja2FnZU1hbmFnZXJdXG4gIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbihjYWNoZURpciwgJ3JlcG8nKVxuXG4gIGlmIChleGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICBkZWJ1ZyhgVGVtcGxhdGUgY2FjaGUgZm91bmQgYXQgJHt0ZW1wbGF0ZVBhdGh9LCB1cGRhdGluZy4uLmApXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZldGNoIGxhdGVzdCBjaGFuZ2VzIGFuZCByZXNldCB0byByZW1vdGVcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY3AgPSBleGVjKCdnaXQgZmV0Y2ggb3JpZ2luJywgeyBjd2Q6IHRlbXBsYXRlUGF0aCB9KVxuICAgICAgICBjcC5vbignZXJyb3InLCByZWplY3QpXG4gICAgICAgIGNwLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggbGF0ZXN0IGNoYW5nZXMsIGdpdCBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIGV4ZWNTeW5jKCdnaXQgcmVzZXQgLS1oYXJkIG9yaWdpbi9tYWluJywge1xuICAgICAgICBjd2Q6IHRlbXBsYXRlUGF0aCxcbiAgICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgICAgfSlcbiAgICAgIGRlYnVnKCdUZW1wbGF0ZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlYnVnKGBGYWlsZWQgdG8gdXBkYXRlIHRlbXBsYXRlOiAke2Vycm9yfWApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB1cGRhdGUgdGVtcGxhdGUgZnJvbSAke3JlcG9Vcmx9OiAke2Vycm9yfWApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlYnVnKGBDbG9uaW5nIHRlbXBsYXRlIGZyb20gJHtyZXBvVXJsfS4uLmApXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtyZXBvVXJsfSByZXBvYCwgeyBjd2Q6IGNhY2hlRGlyLCBzdGRpbzogJ2luaGVyaXQnIH0pXG4gICAgICBkZWJ1ZygnVGVtcGxhdGUgY2xvbmVkIHN1Y2Nlc3NmdWxseScpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNsb25lIHRlbXBsYXRlIGZyb20gJHtyZXBvVXJsfTogJHtlcnJvcn1gKVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5RGlyZWN0b3J5KFxuICBzcmM6IHN0cmluZyxcbiAgZGVzdDogc3RyaW5nLFxuICBpbmNsdWRlV2FzaUJpbmRpbmdzOiBib29sZWFuLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyQXN5bmMoZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoc3JjLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKHNyYywgZW50cnkubmFtZSlcbiAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkZXN0LCBlbnRyeS5uYW1lKVxuXG4gICAgLy8gU2tpcCAuZ2l0IGRpcmVjdG9yeVxuICAgIGlmIChlbnRyeS5uYW1lID09PSAnLmdpdCcpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGF3YWl0IGNvcHlEaXJlY3Rvcnkoc3JjUGF0aCwgZGVzdFBhdGgsIGluY2x1ZGVXYXNpQmluZGluZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWluY2x1ZGVXYXNpQmluZGluZ3MgJiZcbiAgICAgICAgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy53YXNpLWJyb3dzZXIuanMnKSB8fFxuICAgICAgICAgIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy53YXNpLmNqcycpIHx8XG4gICAgICAgICAgZW50cnkubmFtZS5lbmRzV2l0aCgnd2FzaS13b3JrZXItYnJvd3Nlci5tanMnKSB8fFxuICAgICAgICAgIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJ3dhc2ktd29ya2VyLm1qcycpIHx8XG4gICAgICAgICAgZW50cnkubmFtZSA9PT0gJ2Jyb3dzZXIuanMnKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNQYXRoLCBkZXN0UGF0aClcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmlsdGVyVGFyZ2V0c0luUGFja2FnZUpzb24oXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGVuYWJsZWRUYXJnZXRzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShjb250ZW50KVxuICBjb25zdCBpbmNsdWRlV2FzaUJpbmRpbmdzID0gZW5hYmxlZFRhcmdldHMuaW5jbHVkZXMoV0FTSV9UQVJHRVQpXG5cbiAgLy8gRmlsdGVyIG5hcGkudGFyZ2V0c1xuICBpZiAocGFja2FnZUpzb24ubmFwaT8udGFyZ2V0cykge1xuICAgIHBhY2thZ2VKc29uLm5hcGkudGFyZ2V0cyA9IHBhY2thZ2VKc29uLm5hcGkudGFyZ2V0cy5maWx0ZXIoXG4gICAgICAodGFyZ2V0OiBzdHJpbmcpID0+IGVuYWJsZWRUYXJnZXRzLmluY2x1ZGVzKHRhcmdldCksXG4gICAgKVxuICB9XG5cbiAgaWYgKCFpbmNsdWRlV2FzaUJpbmRpbmdzKSB7XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb24uYnJvd3NlciA9PT0gJ2Jyb3dzZXIuanMnIHx8XG4gICAgICBwYWNrYWdlSnNvbi5icm93c2VyID09PSAnLi9icm93c2VyLmpzJ1xuICAgICkge1xuICAgICAgZGVsZXRlIHBhY2thZ2VKc29uLmJyb3dzZXJcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYWNrYWdlSnNvbi5maWxlcykpIHtcbiAgICAgIHBhY2thZ2VKc29uLmZpbGVzID0gcGFja2FnZUpzb24uZmlsZXMuZmlsdGVyKFxuICAgICAgICAoZmlsZTogdW5rbm93bikgPT4gZmlsZSAhPT0gJ2Jyb3dzZXIuanMnICYmIGZpbGUgIT09ICcuL2Jyb3dzZXIuanMnLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpICsgJ1xcbicpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNhcmdvVG9tbFR5cGVEZWYoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGVuYWJsZVR5cGVEZWY6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGVuYWJsZVR5cGVEZWYpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04JylcbiAgY29uc3QgY2FyZ29Ub21sID0gcGFyc2VUb21sKGNvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gY2FyZ29Ub21sLmRlcGVuZGVuY2llc1xuXG4gIGlmICghZGVwZW5kZW5jaWVzIHx8ICFkZXBlbmRlbmNpZXNbJ25hcGktZGVyaXZlJ10pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG5hcGlEZXJpdmVEZXBlbmRlbmN5ID0gZGVwZW5kZW5jaWVzWyduYXBpLWRlcml2ZSddXG4gIGNvbnN0IGRlcGVuZGVuY3lDb25maWcgPVxuICAgIHR5cGVvZiBuYXBpRGVyaXZlRGVwZW5kZW5jeSA9PT0gJ3N0cmluZydcbiAgICAgID8geyB2ZXJzaW9uOiBuYXBpRGVyaXZlRGVwZW5kZW5jeSB9XG4gICAgICA6IHsgLi4ubmFwaURlcml2ZURlcGVuZGVuY3kgfVxuXG4gIGNvbnN0IGV4aXN0aW5nRmVhdHVyZXM6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShkZXBlbmRlbmN5Q29uZmlnLmZlYXR1cmVzKVxuICAgID8gZGVwZW5kZW5jeUNvbmZpZy5mZWF0dXJlcy5maWx0ZXIoXG4gICAgICAgIChmZWF0dXJlOiB1bmtub3duKTogZmVhdHVyZSBpcyBzdHJpbmcgPT4gdHlwZW9mIGZlYXR1cmUgPT09ICdzdHJpbmcnLFxuICAgICAgKVxuICAgIDogW11cblxuICBkZXBlbmRlbmN5Q29uZmlnWydkZWZhdWx0LWZlYXR1cmVzJ10gPSBmYWxzZVxuICBkZXBlbmRlbmN5Q29uZmlnLmZlYXR1cmVzID0gW1xuICAgICdzdHJpY3QnLFxuICAgIC4uLmV4aXN0aW5nRmVhdHVyZXMuZmlsdGVyKChmZWF0dXJlKSA9PiBmZWF0dXJlICE9PSAnc3RyaWN0JyksXG4gIF0uZmlsdGVyKChmZWF0dXJlKSA9PiBmZWF0dXJlICE9PSAndHlwZS1kZWYnKVxuXG4gIGRlcGVuZGVuY2llc1snbmFwaS1kZXJpdmUnXSA9IGRlcGVuZGVuY3lDb25maWdcblxuICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIHN0cmluZ2lmeVRvbWwoY2FyZ29Ub21sKSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmlsdGVyVGFyZ2V0c0luR2l0aHViQWN0aW9ucyhcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZW5hYmxlZFRhcmdldHM6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04JylcbiAgY29uc3QgeWFtbCA9IHlhbWxMb2FkKGNvbnRlbnQpIGFzIGFueVxuXG4gIGNvbnN0IGxpbnV4VGFyZ2V0cyA9IG5ldyBTZXQoW1xuICAgICd4ODZfNjQtdW5rbm93bi1saW51eC1nbnUnLFxuICAgICd4ODZfNjQtdW5rbm93bi1saW51eC1tdXNsJyxcbiAgICAnYWFyY2g2NC11bmtub3duLWxpbnV4LWdudScsXG4gICAgJ2FhcmNoNjQtdW5rbm93bi1saW51eC1tdXNsJyxcbiAgICAnYXJtdjctdW5rbm93bi1saW51eC1nbnVlYWJpaGYnLFxuICAgICdhcm12Ny11bmtub3duLWxpbnV4LW11c2xlYWJpaGYnLFxuICAgICdsb29uZ2FyY2g2NC11bmtub3duLWxpbnV4LWdudScsXG4gICAgJ3Jpc2N2NjRnYy11bmtub3duLWxpbnV4LWdudScsXG4gICAgJ3Bvd2VycGM2NGxlLXVua25vd24tbGludXgtZ251JyxcbiAgICAnczM5MHgtdW5rbm93bi1saW51eC1nbnUnLFxuICAgICdhYXJjaDY0LWxpbnV4LWFuZHJvaWQnLFxuICAgICdhcm12Ny1saW51eC1hbmRyb2lkZWFiaScsXG4gIF0pXG5cbiAgLy8gQ2hlY2sgaWYgYW55IExpbnV4IHRhcmdldHMgYXJlIGVuYWJsZWRcbiAgY29uc3QgaGFzTGludXhUYXJnZXRzID0gZW5hYmxlZFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PlxuICAgIGxpbnV4VGFyZ2V0cy5oYXModGFyZ2V0KSxcbiAgKVxuICBjb25zdCBoYXNNYWNPU09yV2luZG93c1RhcmdldHMgPSBlbmFibGVkVGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHBhcnNlVHJpcGxlKHRhcmdldCkucGxhdGZvcm1cbiAgICByZXR1cm4gcGxhdGZvcm0gPT09ICdkYXJ3aW4nIHx8IHBsYXRmb3JtID09PSAnd2luMzInXG4gIH0pXG5cbiAgLy8gRmlsdGVyIHRoZSBtYXRyaXggY29uZmlndXJhdGlvbnMgaW4gdGhlIGJ1aWxkIGpvYlxuICBpZiAoeWFtbD8uam9icz8uYnVpbGQ/LnN0cmF0ZWd5Py5tYXRyaXg/LnNldHRpbmdzKSB7XG4gICAgeWFtbC5qb2JzLmJ1aWxkLnN0cmF0ZWd5Lm1hdHJpeC5zZXR0aW5ncyA9XG4gICAgICB5YW1sLmpvYnMuYnVpbGQuc3RyYXRlZ3kubWF0cml4LnNldHRpbmdzLmZpbHRlcigoc2V0dGluZzogYW55KSA9PiB7XG4gICAgICAgIGlmIChzZXR0aW5nLnRhcmdldCkge1xuICAgICAgICAgIHJldHVybiBlbmFibGVkVGFyZ2V0cy5pbmNsdWRlcyhzZXR0aW5nLnRhcmdldClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSlcbiAgfVxuXG4gIGNvbnN0IGpvYnNUb1JlbW92ZTogc3RyaW5nW10gPSBbXVxuXG4gIGlmICghaGFzTWFjT1NPcldpbmRvd3NUYXJnZXRzKSB7XG4gICAgam9ic1RvUmVtb3ZlLnB1c2goJ3Rlc3QtbWFjT1Mtd2luZG93cy1iaW5kaW5nJylcbiAgfSBlbHNlIHtcbiAgICAvLyBGaWx0ZXIgdGhlIG1hdHJpeCBjb25maWd1cmF0aW9ucyBpbiB0aGUgdGVzdC1tYWNPUy13aW5kb3dzLWJpbmRpbmcgam9iXG4gICAgaWYgKFxuICAgICAgeWFtbD8uam9icz8uWyd0ZXN0LW1hY09TLXdpbmRvd3MtYmluZGluZyddPy5zdHJhdGVneT8ubWF0cml4Py5zZXR0aW5nc1xuICAgICkge1xuICAgICAgeWFtbC5qb2JzWyd0ZXN0LW1hY09TLXdpbmRvd3MtYmluZGluZyddLnN0cmF0ZWd5Lm1hdHJpeC5zZXR0aW5ncyA9XG4gICAgICAgIHlhbWwuam9ic1sndGVzdC1tYWNPUy13aW5kb3dzLWJpbmRpbmcnXS5zdHJhdGVneS5tYXRyaXguc2V0dGluZ3MuZmlsdGVyKFxuICAgICAgICAgIChzZXR0aW5nOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLnRhcmdldCkge1xuICAgICAgICAgICAgICByZXR1cm4gZW5hYmxlZFRhcmdldHMuaW5jbHVkZXMoc2V0dGluZy50YXJnZXQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICB9XG4gIH1cblxuICAvLyBJZiBubyBMaW51eCB0YXJnZXRzIGFyZSBlbmFibGVkLCByZW1vdmUgTGludXgtc3BlY2lmaWMgam9ic1xuICBpZiAoIWhhc0xpbnV4VGFyZ2V0cykge1xuICAgIC8vIFJlbW92ZSB0ZXN0LWxpbnV4LWJpbmRpbmcgam9iXG4gICAgaWYgKHlhbWw/LmpvYnM/LlsndGVzdC1saW51eC1iaW5kaW5nJ10pIHtcbiAgICAgIGpvYnNUb1JlbW92ZS5wdXNoKCd0ZXN0LWxpbnV4LWJpbmRpbmcnKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBGaWx0ZXIgdGhlIG1hdHJpeCBjb25maWd1cmF0aW9ucyBpbiB0aGUgdGVzdC1saW51eC14NjQtZ251LWJpbmRpbmcgam9iXG4gICAgaWYgKHlhbWw/LmpvYnM/LlsndGVzdC1saW51eC1iaW5kaW5nJ10/LnN0cmF0ZWd5Py5tYXRyaXg/LnRhcmdldCkge1xuICAgICAgeWFtbC5qb2JzWyd0ZXN0LWxpbnV4LWJpbmRpbmcnXS5zdHJhdGVneS5tYXRyaXgudGFyZ2V0ID0geWFtbC5qb2JzW1xuICAgICAgICAndGVzdC1saW51eC1iaW5kaW5nJ1xuICAgICAgXS5zdHJhdGVneS5tYXRyaXgudGFyZ2V0LmZpbHRlcigodGFyZ2V0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIHJldHVybiBlbmFibGVkVGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKCFlbmFibGVkVGFyZ2V0cy5pbmNsdWRlcyhXQVNJX1RBUkdFVCkpIHtcbiAgICBqb2JzVG9SZW1vdmUucHVzaCgndGVzdC13YXNpJylcbiAgfVxuXG4gIGlmICghZW5hYmxlZFRhcmdldHMuaW5jbHVkZXMoJ3g4Nl82NC11bmtub3duLWZyZWVic2QnKSkge1xuICAgIGpvYnNUb1JlbW92ZS5wdXNoKCdidWlsZC1mcmVlYnNkJylcbiAgfVxuXG4gIC8vIEZpbHRlciBvdGhlciB0ZXN0IGpvYnMgYmFzZWQgb24gdGFyZ2V0XG4gIGZvciAoY29uc3QgW2pvYk5hbWUsIGpvYkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoeWFtbC5qb2JzIHx8IHt9KSkge1xuICAgIGlmIChcbiAgICAgIGpvYk5hbWUuc3RhcnRzV2l0aCgndGVzdC0nKSAmJlxuICAgICAgam9iTmFtZSAhPT0gJ3Rlc3QtbWFjT1Mtd2luZG93cy1iaW5kaW5nJyAmJlxuICAgICAgam9iTmFtZSAhPT0gJ3Rlc3QtbGludXgteDY0LWdudS1iaW5kaW5nJ1xuICAgICkge1xuICAgICAgLy8gRXh0cmFjdCB0YXJnZXQgZnJvbSBqb2IgbmFtZSBvciBjb25maWdcbiAgICAgIGNvbnN0IGpvYiA9IGpvYkNvbmZpZyBhcyBhbnlcbiAgICAgIGlmIChqb2Iuc3RyYXRlZ3k/Lm1hdHJpeD8uc2V0dGluZ3M/LlswXT8udGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGpvYi5zdHJhdGVneS5tYXRyaXguc2V0dGluZ3NbMF0udGFyZ2V0XG4gICAgICAgIGlmICghZW5hYmxlZFRhcmdldHMuaW5jbHVkZXModGFyZ2V0KSkge1xuICAgICAgICAgIGpvYnNUb1JlbW92ZS5wdXNoKGpvYk5hbWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgam9icyBmb3IgZGlzYWJsZWQgdGFyZ2V0c1xuICBmb3IgKGNvbnN0IGpvYk5hbWUgb2Ygam9ic1RvUmVtb3ZlKSB7XG4gICAgZGVsZXRlIHlhbWwuam9ic1tqb2JOYW1lXVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoeWFtbC5qb2JzPy5wdWJsaXNoPy5uZWVkcykpIHtcbiAgICB5YW1sLmpvYnMucHVibGlzaC5uZWVkcyA9IHlhbWwuam9icy5wdWJsaXNoLm5lZWRzLmZpbHRlcihcbiAgICAgIChuZWVkOiBzdHJpbmcpID0+ICFqb2JzVG9SZW1vdmUuaW5jbHVkZXMobmVlZCksXG4gICAgKVxuICB9XG5cbiAgLy8gV3JpdGUgYmFjayB0aGUgZmlsdGVyZWQgWUFNTFxuICBjb25zdCB1cGRhdGVkWWFtbCA9IHlhbWxEdW1wKHlhbWwsIHtcbiAgICBsaW5lV2lkdGg6IC0xLFxuICAgIG5vUmVmczogdHJ1ZSxcbiAgICBzb3J0S2V5czogZmFsc2UsXG4gIH0pXG4gIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgdXBkYXRlZFlhbWwpXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NPcHRpb25zKG9wdGlvbnM6IFJhd05ld09wdGlvbnMpIHtcbiAgZGVidWcoJ1Byb2Nlc3Npbmcgb3B0aW9ucy4uLicpXG4gIGlmICghb3B0aW9ucy5wYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSB0aGUgcGF0aCBhcyB0aGUgYXJndW1lbnQnKVxuICB9XG4gIG9wdGlvbnMucGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvcHRpb25zLnBhdGgpXG4gIGRlYnVnKGBSZXNvbHZlZCB0YXJnZXQgcGF0aCB0bzogJHtvcHRpb25zLnBhdGh9YClcblxuICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgIG9wdGlvbnMubmFtZSA9IHBhdGgucGFyc2Uob3B0aW9ucy5wYXRoKS5iYXNlXG4gICAgZGVidWcoYE5vIHByb2plY3QgbmFtZSBwcm92aWRlZCwgZml4IGl0IHRvIGRpciBuYW1lOiAke29wdGlvbnMubmFtZX1gKVxuICB9XG5cbiAgaWYgKCFvcHRpb25zLnRhcmdldHM/Lmxlbmd0aCkge1xuICAgIGlmIChvcHRpb25zLmVuYWJsZUFsbFRhcmdldHMpIHtcbiAgICAgIG9wdGlvbnMudGFyZ2V0cyA9IEFWQUlMQUJMRV9UQVJHRVRTLmNvbmNhdCgpXG4gICAgICBkZWJ1ZygnRW5hYmxlIGFsbCB0YXJnZXRzJylcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZW5hYmxlRGVmYXVsdFRhcmdldHMpIHtcbiAgICAgIG9wdGlvbnMudGFyZ2V0cyA9IERFRkFVTFRfVEFSR0VUUy5jb25jYXQoKVxuICAgICAgZGVidWcoJ0VuYWJsZSBkZWZhdWx0IHRhcmdldHMnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0IGxlYXN0IG9uZSB0YXJnZXQgbXVzdCBiZSBlbmFibGVkJylcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIG9wdGlvbnMudGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldCA9PT0gJ3dhc20zMi13YXNpLXByZXZpZXcxLXRocmVhZHMnKVxuICApIHtcbiAgICBjb25zdCBvdXQgPSBleGVjU3luYyhgcnVzdHVwIHRhcmdldCBsaXN0YCwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KVxuICAgIGlmIChvdXQuaW5jbHVkZXMoV0FTSV9UQVJHRVQpKSB7XG4gICAgICBvcHRpb25zLnRhcmdldHMgPSBvcHRpb25zLnRhcmdldHMubWFwKCh0YXJnZXQpID0+XG4gICAgICAgIHRhcmdldCA9PT0gJ3dhc20zMi13YXNpLXByZXZpZXcxLXRocmVhZHMnID8gV0FTSV9UQVJHRVQgOiB0YXJnZXQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFwcGx5RGVmYXVsdE5ld09wdGlvbnMob3B0aW9ucykgYXMgTmV3T3B0aW9uc1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV3UHJvamVjdCh1c2VyT3B0aW9uczogUmF3TmV3T3B0aW9ucykge1xuICBkZWJ1ZygnV2lsbCBjcmVhdGUgbmFwaS1ycyBwcm9qZWN0IHdpdGggZ2l2ZW4gb3B0aW9uczonKVxuICBkZWJ1Zyh1c2VyT3B0aW9ucylcblxuICBjb25zdCBvcHRpb25zID0gcHJvY2Vzc09wdGlvbnModXNlck9wdGlvbnMpXG5cbiAgZGVidWcoJ1RhcmdldHMgdG8gYmUgZW5hYmxlZDonKVxuICBkZWJ1ZyhvcHRpb25zLnRhcmdldHMpXG5cbiAgLy8gQ2hlY2sgaWYgZ2l0IGlzIGF2YWlsYWJsZVxuICBpZiAoIShhd2FpdCBjaGVja0dpdENvbW1hbmQoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnR2l0IGlzIG5vdCBpbnN0YWxsZWQgb3Igbm90IGF2YWlsYWJsZSBpbiBQQVRILiBQbGVhc2UgaW5zdGFsbCBHaXQgdG8gY29udGludWUuJyxcbiAgICApXG4gIH1cblxuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IG9wdGlvbnMucGFja2FnZU1hbmFnZXIgYXMgU3VwcG9ydGVkUGFja2FnZU1hbmFnZXJcblxuICAvLyBFbnN1cmUgdGFyZ2V0IGRpcmVjdG9yeSBleGlzdHMgYW5kIGlzIGVtcHR5XG4gIGF3YWl0IGVuc3VyZVBhdGgob3B0aW9ucy5wYXRoLCBvcHRpb25zLmRyeVJ1bilcblxuICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIERvd25sb2FkIG9yIHVwZGF0ZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgY2FjaGVEaXIgPSBhd2FpdCBlbnN1cmVDYWNoZURpcihwYWNrYWdlTWFuYWdlcilcbiAgICAgIGF3YWl0IGRvd25sb2FkVGVtcGxhdGUocGFja2FnZU1hbmFnZXIsIGNhY2hlRGlyKVxuXG4gICAgICAvLyBDb3B5IHRlbXBsYXRlIGZpbGVzIHRvIHRhcmdldCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbihjYWNoZURpciwgJ3JlcG8nKVxuICAgICAgYXdhaXQgY29weURpcmVjdG9yeShcbiAgICAgICAgdGVtcGxhdGVQYXRoLFxuICAgICAgICBvcHRpb25zLnBhdGgsXG4gICAgICAgIG9wdGlvbnMudGFyZ2V0cy5pbmNsdWRlcyhXQVNJX1RBUkdFVCksXG4gICAgICApXG5cbiAgICAgIC8vIFJlbmFtZSBwcm9qZWN0IHVzaW5nIHRoZSByZW5hbWUgQVBJXG4gICAgICBhd2FpdCByZW5hbWVQcm9qZWN0KHtcbiAgICAgICAgY3dkOiBvcHRpb25zLnBhdGgsXG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgYmluYXJ5TmFtZTogZ2V0QmluYXJ5TmFtZShvcHRpb25zLm5hbWUpLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgY2FyZ29Ub21sUGF0aCA9IHBhdGguam9pbihvcHRpb25zLnBhdGgsICdDYXJnby50b21sJylcbiAgICAgIGlmIChleGlzdHNTeW5jKGNhcmdvVG9tbFBhdGgpKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZUNhcmdvVG9tbFR5cGVEZWYoY2FyZ29Ub21sUGF0aCwgb3B0aW9ucy5lbmFibGVUeXBlRGVmKVxuICAgICAgfVxuXG4gICAgICAvLyBGaWx0ZXIgdGFyZ2V0cyBpbiBwYWNrYWdlLmpzb25cbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihvcHRpb25zLnBhdGgsICdwYWNrYWdlLmpzb24nKVxuICAgICAgaWYgKGV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgICBhd2FpdCBmaWx0ZXJUYXJnZXRzSW5QYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgsIG9wdGlvbnMudGFyZ2V0cylcbiAgICAgIH1cblxuICAgICAgLy8gRmlsdGVyIHRhcmdldHMgaW4gR2l0SHViIEFjdGlvbnMgQ0lcbiAgICAgIGNvbnN0IGNpUGF0aCA9IHBhdGguam9pbihvcHRpb25zLnBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycsICdDSS55bWwnKVxuICAgICAgaWYgKGV4aXN0c1N5bmMoY2lQYXRoKSAmJiBvcHRpb25zLmVuYWJsZUdpdGh1YkFjdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgZmlsdGVyVGFyZ2V0c0luR2l0aHViQWN0aW9ucyhjaVBhdGgsIG9wdGlvbnMudGFyZ2V0cylcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFvcHRpb25zLmVuYWJsZUdpdGh1YkFjdGlvbnMgJiZcbiAgICAgICAgZXhpc3RzU3luYyhwYXRoLmpvaW4ob3B0aW9ucy5wYXRoLCAnLmdpdGh1YicpKVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlbW92ZSAuZ2l0aHViIGRpcmVjdG9yeSBpZiBHaXRIdWIgQWN0aW9ucyBpcyBub3QgZW5hYmxlZFxuICAgICAgICBhd2FpdCBmcy5ybShwYXRoLmpvaW4ob3B0aW9ucy5wYXRoLCAnLmdpdGh1YicpLCB7XG4gICAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcGFja2FnZS5qc29uIHdpdGggYWRkaXRpb25hbCBjb25maWd1cmF0aW9uc1xuICAgICAgY29uc3QgcGtnSnNvbkNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpXG4gICAgICBjb25zdCBwa2dKc29uID0gSlNPTi5wYXJzZShwa2dKc29uQ29udGVudClcblxuICAgICAgLy8gVXBkYXRlIGVuZ2luZSByZXF1aXJlbWVudFxuICAgICAgaWYgKCFwa2dKc29uLmVuZ2luZXMpIHtcbiAgICAgICAgcGtnSnNvbi5lbmdpbmVzID0ge31cbiAgICAgIH1cbiAgICAgIHBrZ0pzb24uZW5naW5lcy5ub2RlID0gbmFwaUVuZ2luZVJlcXVpcmVtZW50KG9wdGlvbnMubWluTm9kZUFwaVZlcnNpb24pXG5cbiAgICAgIC8vIFVwZGF0ZSBsaWNlbnNlIGlmIGRpZmZlcmVudCBmcm9tIHRlbXBsYXRlXG4gICAgICBpZiAob3B0aW9ucy5saWNlbnNlICYmIHBrZ0pzb24ubGljZW5zZSAhPT0gb3B0aW9ucy5saWNlbnNlKSB7XG4gICAgICAgIHBrZ0pzb24ubGljZW5zZSA9IG9wdGlvbnMubGljZW5zZVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGVzdCBmcmFtZXdvcmsgaWYgbmVlZGVkXG4gICAgICBpZiAob3B0aW9ucy50ZXN0RnJhbWV3b3JrICE9PSAnYXZhJykge1xuICAgICAgICAvLyBUaGlzIHdvdWxkIHJlcXVpcmUgbW9yZSBjb21wbGV4IGxvZ2ljIHRvIHVwZGF0ZSB0ZXN0IHNjcmlwdHMgYW5kIGRlcGVuZGVuY2llc1xuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICBgVGVzdCBmcmFtZXdvcmsgJHtvcHRpb25zLnRlc3RGcmFtZXdvcmt9IHJlcXVlc3RlZCBidXQgbm90IHlldCBpbXBsZW1lbnRlZGAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgICBwYWNrYWdlSnNvblBhdGgsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHBrZ0pzb24sIG51bGwsIDIpICsgJ1xcbicsXG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBwcm9qZWN0OiAke2Vycm9yfWApXG4gICAgfVxuICB9XG5cbiAgZGVidWcoYFByb2plY3QgY3JlYXRlZCBhdDogJHtvcHRpb25zLnBhdGh9YClcbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlUGF0aChwYXRoOiBzdHJpbmcsIGRyeVJ1biA9IGZhbHNlKSB7XG4gIGNvbnN0IHN0YXQgPSBhd2FpdCBzdGF0QXN5bmMocGF0aCwge30pLmNhdGNoKCgpID0+IHVuZGVmaW5lZClcblxuICAvLyBmaWxlIGRlc2NyaXB0b3IgZXhpc3RzXG4gIGlmIChzdGF0KSB7XG4gICAgaWYgKHN0YXQuaXNGaWxlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFBhdGggJHtwYXRofSBmb3IgY3JlYXRpbmcgbmV3IG5hcGktcnMgcHJvamVjdCBhbHJlYWR5IGV4aXN0cyBhbmQgaXQncyBub3QgYSBkaXJlY3RvcnkuYCxcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyQXN5bmMocGF0aClcbiAgICAgIGlmIChmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXRoICR7cGF0aH0gZm9yIGNyZWF0aW5nIG5ldyBuYXBpLXJzIHByb2plY3QgYWxyZWFkeSBleGlzdHMgYW5kIGl0J3Mgbm90IGVtcHR5LmAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWRyeVJ1bikge1xuICAgIHRyeSB7XG4gICAgICBkZWJ1ZyhgVHJ5IHRvIGNyZWF0ZSB0YXJnZXQgZGlyZWN0b3J5OiAke3BhdGh9YClcbiAgICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyQXN5bmMocGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgdGFyZ2V0IGRpcmVjdG9yeTogJHtwYXRofWAsIHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCaW5hcnlOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBuYW1lLnNwbGl0KCcvJykucG9wKCkhXG59XG5cbmV4cG9ydCB0eXBlIHsgTmV3T3B0aW9ucyB9XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVByZVB1Ymxpc2hDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ3ByZS1wdWJsaXNoJ10sIFsncHJlcHVibGlzaCddXVxuXG4gIHN0YXRpYyB1c2FnZSA9IENvbW1hbmQuVXNhZ2Uoe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1VwZGF0ZSBwYWNrYWdlLmpzb24gYW5kIGNvcHkgYWRkb25zIGludG8gcGVyIHBsYXRmb3JtIHBhY2thZ2VzJyxcbiAgfSlcblxuICBjd2QgPSBPcHRpb24uU3RyaW5nKCctLWN3ZCcsIHByb2Nlc3MuY3dkKCksIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGgnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsICdwYWNrYWdlLmpzb24nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBwYWNrYWdlLmpzb25gJyxcbiAgfSlcblxuICBucG1EaXIgPSBPcHRpb24uU3RyaW5nKCctLW5wbS1kaXIsLXAnLCAnbnBtJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0JyxcbiAgfSlcblxuICB0YWdTdHlsZSA9IE9wdGlvbi5TdHJpbmcoJy0tdGFnLXN0eWxlLC0tdGFnc3R5bGUsLXQnLCAnbGVybmEnLCB7XG4gICAgZGVzY3JpcHRpb246ICdnaXQgdGFnIHN0eWxlLCBgbnBtYCBvciBgbGVybmFgJyxcbiAgfSlcblxuICBnaFJlbGVhc2UgPSBPcHRpb24uQm9vbGVhbignLS1naC1yZWxlYXNlJywgdHJ1ZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBjcmVhdGUgR2l0SHViIHJlbGVhc2UnLFxuICB9KVxuXG4gIGdoUmVsZWFzZU5hbWU/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWdoLXJlbGVhc2UtbmFtZScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ0dpdEh1YiByZWxlYXNlIG5hbWUnLFxuICB9KVxuXG4gIGdoUmVsZWFzZUlkPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1naC1yZWxlYXNlLWlkJywge1xuICAgIGRlc2NyaXB0aW9uOiAnRXhpc3RpbmcgR2l0SHViIHJlbGVhc2UgaWQnLFxuICB9KVxuXG4gIHNraXBPcHRpb25hbFB1Ymxpc2ggPSBPcHRpb24uQm9vbGVhbignLS1za2lwLW9wdGlvbmFsLXB1Ymxpc2gnLCBmYWxzZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBza2lwIG9wdGlvbmFsRGVwZW5kZW5jaWVzIHBhY2thZ2VzIHB1Ymxpc2gnLFxuICB9KVxuXG4gIGRyeVJ1biA9IE9wdGlvbi5Cb29sZWFuKCctLWRyeS1ydW4nLCBmYWxzZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnRHJ5IHJ1biB3aXRob3V0IHRvdWNoaW5nIGZpbGUgc3lzdGVtJyxcbiAgfSlcblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIG5wbURpcjogdGhpcy5ucG1EaXIsXG4gICAgICB0YWdTdHlsZTogdGhpcy50YWdTdHlsZSxcbiAgICAgIGdoUmVsZWFzZTogdGhpcy5naFJlbGVhc2UsXG4gICAgICBnaFJlbGVhc2VOYW1lOiB0aGlzLmdoUmVsZWFzZU5hbWUsXG4gICAgICBnaFJlbGVhc2VJZDogdGhpcy5naFJlbGVhc2VJZCxcbiAgICAgIHNraXBPcHRpb25hbFB1Ymxpc2g6IHRoaXMuc2tpcE9wdGlvbmFsUHVibGlzaCxcbiAgICAgIGRyeVJ1bjogdGhpcy5kcnlSdW4sXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVXBkYXRlIHBhY2thZ2UuanNvbiBhbmQgY29weSBhZGRvbnMgaW50byBwZXIgcGxhdGZvcm0gcGFja2FnZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVQdWJsaXNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGhcbiAgICpcbiAgICogQGRlZmF1bHQgcHJvY2Vzcy5jd2QoKVxuICAgKi9cbiAgY3dkPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlXG4gICAqL1xuICBjb25maWdQYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBwYWNrYWdlLmpzb25gXG4gICAqXG4gICAqIEBkZWZhdWx0ICdwYWNrYWdlLmpzb24nXG4gICAqL1xuICBwYWNrYWdlSnNvblBhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGZvbGRlciB3aGVyZSB0aGUgbnBtIHBhY2thZ2VzIHB1dFxuICAgKlxuICAgKiBAZGVmYXVsdCAnbnBtJ1xuICAgKi9cbiAgbnBtRGlyPzogc3RyaW5nXG4gIC8qKlxuICAgKiBnaXQgdGFnIHN0eWxlLCBgbnBtYCBvciBgbGVybmFgXG4gICAqXG4gICAqIEBkZWZhdWx0ICdsZXJuYSdcbiAgICovXG4gIHRhZ1N0eWxlPzogJ25wbScgfCAnbGVybmEnXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNyZWF0ZSBHaXRIdWIgcmVsZWFzZVxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBnaFJlbGVhc2U/OiBib29sZWFuXG4gIC8qKlxuICAgKiBHaXRIdWIgcmVsZWFzZSBuYW1lXG4gICAqL1xuICBnaFJlbGVhc2VOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBFeGlzdGluZyBHaXRIdWIgcmVsZWFzZSBpZFxuICAgKi9cbiAgZ2hSZWxlYXNlSWQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFdoZXRoZXIgc2tpcCBvcHRpb25hbERlcGVuZGVuY2llcyBwYWNrYWdlcyBwdWJsaXNoXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBza2lwT3B0aW9uYWxQdWJsaXNoPzogYm9vbGVhblxuICAvKipcbiAgICogRHJ5IHJ1biB3aXRob3V0IHRvdWNoaW5nIGZpbGUgc3lzdGVtXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkcnlSdW4/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRQcmVQdWJsaXNoT3B0aW9ucyhvcHRpb25zOiBQcmVQdWJsaXNoT3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBwYWNrYWdlSnNvblBhdGg6ICdwYWNrYWdlLmpzb24nLFxuICAgIG5wbURpcjogJ25wbScsXG4gICAgdGFnU3R5bGU6ICdsZXJuYScsXG4gICAgZ2hSZWxlYXNlOiB0cnVlLFxuICAgIHNraXBPcHRpb25hbFB1Ymxpc2g6IGZhbHNlLFxuICAgIGRyeVJ1bjogZmFsc2UsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBjb2RlZ2VuL2luZGV4LnRzXG4vLyBEbyBub3QgZWRpdCB0aGlzIGZpbGUgbWFudWFsbHlcbmltcG9ydCB7IENvbW1hbmQsIE9wdGlvbiB9IGZyb20gJ2NsaXBhbmlvbidcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VWZXJzaW9uQ29tbWFuZCBleHRlbmRzIENvbW1hbmQge1xuICBzdGF0aWMgcGF0aHMgPSBbWyd2ZXJzaW9uJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246ICdVcGRhdGUgdmVyc2lvbiBpbiBjcmVhdGVkIG5wbSBwYWNrYWdlcycsXG4gIH0pXG5cbiAgY3dkID0gT3B0aW9uLlN0cmluZygnLS1jd2QnLCBwcm9jZXNzLmN3ZCgpLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoJyxcbiAgfSlcblxuICBjb25maWdQYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1jb25maWctcGF0aCwtYycsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGUnLFxuICB9KVxuXG4gIHBhY2thZ2VKc29uUGF0aCA9IE9wdGlvbi5TdHJpbmcoJy0tcGFja2FnZS1qc29uLXBhdGgnLCAncGFja2FnZS5qc29uJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgcGFja2FnZS5qc29uYCcsXG4gIH0pXG5cbiAgbnBtRGlyID0gT3B0aW9uLlN0cmluZygnLS1ucG0tZGlyJywgJ25wbScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gdGhlIGZvbGRlciB3aGVyZSB0aGUgbnBtIHBhY2thZ2VzIHB1dCcsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgIGNvbmZpZ1BhdGg6IHRoaXMuY29uZmlnUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uUGF0aDogdGhpcy5wYWNrYWdlSnNvblBhdGgsXG4gICAgICBucG1EaXI6IHRoaXMubnBtRGlyLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZSB2ZXJzaW9uIGluIGNyZWF0ZWQgbnBtIHBhY2thZ2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoXG4gICAqXG4gICAqIEBkZWZhdWx0IHByb2Nlc3MuY3dkKClcbiAgICovXG4gIGN3ZD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZVxuICAgKi9cbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgcGFja2FnZS5qc29uYFxuICAgKlxuICAgKiBAZGVmYXVsdCAncGFja2FnZS5qc29uJ1xuICAgKi9cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXRcbiAgICpcbiAgICogQGRlZmF1bHQgJ25wbSdcbiAgICovXG4gIG5wbURpcj86IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlEZWZhdWx0VmVyc2lvbk9wdGlvbnMob3B0aW9uczogVmVyc2lvbk9wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgcGFja2FnZUpzb25QYXRoOiAncGFja2FnZS5qc29uJyxcbiAgICBucG1EaXI6ICducG0nLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cbn1cbiIsImltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCB7XG4gIGFwcGx5RGVmYXVsdFZlcnNpb25PcHRpb25zLFxuICB0eXBlIFZlcnNpb25PcHRpb25zLFxufSBmcm9tICcuLi9kZWYvdmVyc2lvbi5qcydcbmltcG9ydCB7XG4gIHJlYWROYXBpQ29uZmlnLFxuICBkZWJ1Z0ZhY3RvcnksXG4gIHVwZGF0ZVBhY2thZ2VKc29uLFxufSBmcm9tICcuLi91dGlscy9pbmRleC5qcydcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ3ZlcnNpb24nKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyc2lvbih1c2VyT3B0aW9uczogVmVyc2lvbk9wdGlvbnMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGFwcGx5RGVmYXVsdFZlcnNpb25PcHRpb25zKHVzZXJPcHRpb25zKVxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLnBhY2thZ2VKc29uUGF0aClcblxuICBjb25zdCBjb25maWcgPSBhd2FpdCByZWFkTmFwaUNvbmZpZyhcbiAgICBwYWNrYWdlSnNvblBhdGgsXG4gICAgb3B0aW9ucy5jb25maWdQYXRoID8gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5jb25maWdQYXRoKSA6IHVuZGVmaW5lZCxcbiAgKVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIGNvbmZpZy50YXJnZXRzKSB7XG4gICAgY29uc3QgcGtnRGlyID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5ucG1EaXIsIHRhcmdldC5wbGF0Zm9ybUFyY2hBQkkpXG5cbiAgICBkZWJ1ZyhgVXBkYXRlIHZlcnNpb24gdG8gJWkgaW4gWyVpXWAsIGNvbmZpZy5wYWNrYWdlSnNvbi52ZXJzaW9uLCBwa2dEaXIpXG4gICAgYXdhaXQgdXBkYXRlUGFja2FnZUpzb24oam9pbihwa2dEaXIsICdwYWNrYWdlLmpzb24nKSwge1xuICAgICAgdmVyc2lvbjogY29uZmlnLnBhY2thZ2VKc29uLnZlcnNpb24sXG4gICAgfSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBleGlzdHNTeW5jLCBzdGF0U3luYyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvcmVzdCdcblxuaW1wb3J0IHtcbiAgYXBwbHlEZWZhdWx0UHJlUHVibGlzaE9wdGlvbnMsXG4gIHR5cGUgUHJlUHVibGlzaE9wdGlvbnMsXG59IGZyb20gJy4uL2RlZi9wcmUtcHVibGlzaC5qcydcbmltcG9ydCB7XG4gIHJlYWRGaWxlQXN5bmMsXG4gIHJlYWROYXBpQ29uZmlnLFxuICBkZWJ1Z0ZhY3RvcnksXG4gIHVwZGF0ZVBhY2thZ2VKc29uLFxufSBmcm9tICcuLi91dGlscy9pbmRleC5qcydcblxuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi5qcydcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ3ByZS1wdWJsaXNoJylcblxuaW50ZXJmYWNlIFBhY2thZ2VJbmZvIHtcbiAgbmFtZTogc3RyaW5nXG4gIHZlcnNpb246IHN0cmluZ1xuICB0YWc6IHN0cmluZ1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJlUHVibGlzaCh1c2VyT3B0aW9uczogUHJlUHVibGlzaE9wdGlvbnMpIHtcbiAgZGVidWcoJ1JlY2VpdmUgcHJlLXB1Ymxpc2ggb3B0aW9uczonKVxuICBkZWJ1ZygnICAlTycsIHVzZXJPcHRpb25zKVxuXG4gIGNvbnN0IG9wdGlvbnMgPSBhcHBseURlZmF1bHRQcmVQdWJsaXNoT3B0aW9ucyh1c2VyT3B0aW9ucylcblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLnBhY2thZ2VKc29uUGF0aClcblxuICBjb25zdCB7IHBhY2thZ2VKc29uLCB0YXJnZXRzLCBwYWNrYWdlTmFtZSwgYmluYXJ5TmFtZSwgbnBtQ2xpZW50IH0gPVxuICAgIGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgICAgcGFja2FnZUpzb25QYXRoLFxuICAgICAgb3B0aW9ucy5jb25maWdQYXRoID8gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5jb25maWdQYXRoKSA6IHVuZGVmaW5lZCxcbiAgICApXG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlR2hSZWxlYXNlKHBhY2thZ2VOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgIGlmICghb3B0aW9ucy5naFJlbGVhc2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG93bmVyOiBudWxsLFxuICAgICAgICByZXBvOiBudWxsLFxuICAgICAgICBwa2dJbmZvOiB7IG5hbWU6IG51bGwsIHZlcnNpb246IG51bGwsIHRhZzogbnVsbCB9LFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IHJlcG8sIG93bmVyLCBwa2dJbmZvLCBvY3Rva2l0IH0gPSBnZXRSZXBvSW5mbyhwYWNrYWdlTmFtZSwgdmVyc2lvbilcblxuICAgIGlmICghcmVwbyB8fCAhb3duZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG93bmVyOiBudWxsLFxuICAgICAgICByZXBvOiBudWxsLFxuICAgICAgICBwa2dJbmZvOiB7IG5hbWU6IG51bGwsIHZlcnNpb246IG51bGwsIHRhZzogbnVsbCB9LFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVwb3MuY3JlYXRlUmVsZWFzZSh7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICB0YWdfbmFtZTogcGtnSW5mby50YWcsXG4gICAgICAgICAgbmFtZTogb3B0aW9ucy5naFJlbGVhc2VOYW1lLFxuICAgICAgICAgIHByZXJlbGVhc2U6XG4gICAgICAgICAgICB2ZXJzaW9uLmluY2x1ZGVzKCdhbHBoYScpIHx8XG4gICAgICAgICAgICB2ZXJzaW9uLmluY2x1ZGVzKCdiZXRhJykgfHxcbiAgICAgICAgICAgIHZlcnNpb24uaW5jbHVkZXMoJ3JjJyksXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGBQYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB7IG93bmVyLCByZXBvLCB0YWdfbmFtZTogcGtnSW5mby50YWcgfSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKVxuICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG93bmVyLCByZXBvLCBwa2dJbmZvLCBvY3Rva2l0IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJlcG9JbmZvKHBhY2thZ2VOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgIGNvbnN0IGhlYWRDb21taXQgPSBleGVjU3luYygnZ2l0IGxvZyAtMSAtLXByZXR0eT0lQicsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5jd2QsXG4gICAgICBlbmNvZGluZzogJ3V0Zi04JyxcbiAgICB9KS50cmltKClcblxuICAgIGNvbnN0IHsgR0lUSFVCX1JFUE9TSVRPUlkgfSA9IHByb2Nlc3MuZW52XG4gICAgaWYgKCFHSVRIVUJfUkVQT1NJVE9SWSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3duZXI6IG51bGwsXG4gICAgICAgIHJlcG86IG51bGwsXG4gICAgICAgIHBrZ0luZm86IHsgbmFtZTogbnVsbCwgdmVyc2lvbjogbnVsbCwgdGFnOiBudWxsIH0sXG4gICAgICB9XG4gICAgfVxuICAgIGRlYnVnKGBHaXRodWIgcmVwb3NpdG9yeTogJHtHSVRIVUJfUkVQT1NJVE9SWX1gKVxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBHSVRIVUJfUkVQT1NJVE9SWS5zcGxpdCgnLycpXG4gICAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICAgIGF1dGg6IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTixcbiAgICB9KVxuICAgIGxldCBwa2dJbmZvOiBQYWNrYWdlSW5mbyB8IHVuZGVmaW5lZFxuICAgIGlmIChvcHRpb25zLnRhZ1N0eWxlID09PSAnbGVybmEnKSB7XG4gICAgICBjb25zdCBwYWNrYWdlc1RvUHVibGlzaCA9IGhlYWRDb21taXRcbiAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAgICAgLmZpbHRlcigobGluZSwgaW5kZXgpID0+IGxpbmUubGVuZ3RoICYmIGluZGV4KVxuICAgICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnN1YnN0cmluZygyKSlcbiAgICAgICAgLm1hcChwYXJzZVRhZylcblxuICAgICAgcGtnSW5mbyA9IHBhY2thZ2VzVG9QdWJsaXNoLmZpbmQoXG4gICAgICAgIChwa2dJbmZvKSA9PiBwa2dJbmZvLm5hbWUgPT09IHBhY2thZ2VOYW1lLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXBrZ0luZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgTm8gcmVsZWFzZSBjb21taXQgZm91bmQgd2l0aCAke3BhY2thZ2VOYW1lfSwgb3JpZ2luYWwgY29tbWl0IGluZm86ICR7aGVhZENvbW1pdH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBrZ0luZm8gPSB7XG4gICAgICAgIHRhZzogYHYke3ZlcnNpb259YCxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgbmFtZTogcGFja2FnZU5hbWUsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG93bmVyLCByZXBvLCBwa2dJbmZvLCBvY3Rva2l0IH1cbiAgfVxuXG4gIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICBhd2FpdCB2ZXJzaW9uKHVzZXJPcHRpb25zKVxuICAgIGF3YWl0IHVwZGF0ZVBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCwge1xuICAgICAgb3B0aW9uYWxEZXBlbmRlbmNpZXM6IHRhcmdldHMucmVkdWNlKFxuICAgICAgICAoZGVwcywgdGFyZ2V0KSA9PiB7XG4gICAgICAgICAgZGVwc1tgJHtwYWNrYWdlTmFtZX0tJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfWBdID0gcGFja2FnZUpzb24udmVyc2lvblxuXG4gICAgICAgICAgcmV0dXJuIGRlcHNcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICAgICksXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IHsgb3duZXIsIHJlcG8sIHBrZ0luZm8sIG9jdG9raXQgfSA9IG9wdGlvbnMuZ2hSZWxlYXNlSWRcbiAgICA/IGdldFJlcG9JbmZvKHBhY2thZ2VOYW1lLCBwYWNrYWdlSnNvbi52ZXJzaW9uKVxuICAgIDogYXdhaXQgY3JlYXRlR2hSZWxlYXNlKHBhY2thZ2VOYW1lLCBwYWNrYWdlSnNvbi52ZXJzaW9uKVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCBwa2dEaXIgPSByZXNvbHZlKFxuICAgICAgb3B0aW9ucy5jd2QsXG4gICAgICBvcHRpb25zLm5wbURpcixcbiAgICAgIGAke3RhcmdldC5wbGF0Zm9ybUFyY2hBQkl9YCxcbiAgICApXG4gICAgY29uc3QgZXh0ID1cbiAgICAgIHRhcmdldC5wbGF0Zm9ybSA9PT0gJ3dhc2knIHx8IHRhcmdldC5wbGF0Zm9ybSA9PT0gJ3dhc20nID8gJ3dhc20nIDogJ25vZGUnXG4gICAgY29uc3QgZmlsZW5hbWUgPSBgJHtiaW5hcnlOYW1lfS4ke3RhcmdldC5wbGF0Zm9ybUFyY2hBQkl9LiR7ZXh0fWBcbiAgICBjb25zdCBkc3RQYXRoID0gam9pbihwa2dEaXIsIGZpbGVuYW1lKVxuXG4gICAgaWYgKCFvcHRpb25zLmRyeVJ1bikge1xuICAgICAgaWYgKCFleGlzdHNTeW5jKGRzdFBhdGgpKSB7XG4gICAgICAgIGRlYnVnLndhcm4oYCVzIGRvZXNuJ3QgZXhpc3RgLCBkc3RQYXRoKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnMuc2tpcE9wdGlvbmFsUHVibGlzaCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGV4ZWNTeW5jKGAke25wbUNsaWVudH0gcHVibGlzaGAsIHtcbiAgICAgICAgICAgIGN3ZDogcGtnRGlyLFxuICAgICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICAgICAgIGUubWVzc2FnZS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgJ1lvdSBjYW5ub3QgcHVibGlzaCBvdmVyIHRoZSBwcmV2aW91c2x5IHB1Ymxpc2hlZCB2ZXJzaW9ucycsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oZS5tZXNzYWdlKVxuICAgICAgICAgICAgZGVidWcud2FybihgJHtwa2dEaXJ9IGhhcyBiZWVuIHB1Ymxpc2hlZCwgc2tpcHBpbmdgKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmdoUmVsZWFzZSAmJiByZXBvICYmIG93bmVyKSB7XG4gICAgICAgIGRlYnVnLmluZm8oYENyZWF0aW5nIEdpdEh1YiByZWxlYXNlICR7cGtnSW5mby50YWd9YClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZWxlYXNlSWQgPSBvcHRpb25zLmdoUmVsZWFzZUlkXG4gICAgICAgICAgICA/IE51bWJlcihvcHRpb25zLmdoUmVsZWFzZUlkKVxuICAgICAgICAgICAgOiAoXG4gICAgICAgICAgICAgICAgYXdhaXQgb2N0b2tpdCEucmVwb3MuZ2V0UmVsZWFzZUJ5VGFnKHtcbiAgICAgICAgICAgICAgICAgIHJlcG86IHJlcG8sXG4gICAgICAgICAgICAgICAgICBvd25lcjogb3duZXIsXG4gICAgICAgICAgICAgICAgICB0YWc6IHBrZ0luZm8udGFnLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICkuZGF0YS5pZFxuICAgICAgICAgIGNvbnN0IGRzdEZpbGVTdGF0cyA9IHN0YXRTeW5jKGRzdFBhdGgpXG4gICAgICAgICAgY29uc3QgYXNzZXRJbmZvID0gYXdhaXQgb2N0b2tpdCEucmVwb3MudXBsb2FkUmVsZWFzZUFzc2V0KHtcbiAgICAgICAgICAgIG93bmVyOiBvd25lcixcbiAgICAgICAgICAgIHJlcG86IHJlcG8sXG4gICAgICAgICAgICBuYW1lOiBmaWxlbmFtZSxcbiAgICAgICAgICAgIHJlbGVhc2VfaWQ6IHJlbGVhc2VJZCxcbiAgICAgICAgICAgIG1lZGlhVHlwZTogeyBmb3JtYXQ6ICdyYXcnIH0sXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdjb250ZW50LWxlbmd0aCc6IGRzdEZpbGVTdGF0cy5zaXplLFxuICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBvY3Rva2l0IHR5cGVzIGFyZSB3cm9uZ1xuICAgICAgICAgICAgZGF0YTogYXdhaXQgcmVhZEZpbGVBc3luYyhkc3RQYXRoKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGRlYnVnLmluZm8oYEdpdEh1YiByZWxlYXNlIGNyZWF0ZWRgKVxuICAgICAgICAgIGRlYnVnLmluZm8oYERvd25sb2FkIFVSTDogJXNgLCBhc3NldEluZm8uZGF0YS5icm93c2VyX2Rvd25sb2FkX3VybClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGRlYnVnLmVycm9yKFxuICAgICAgICAgICAgYFBhcmFtOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7IG93bmVyLCByZXBvLCB0YWc6IHBrZ0luZm8udGFnLCBmaWxlbmFtZTogZHN0UGF0aCB9LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBkZWJ1Zy5lcnJvcihlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGFnKHRhZzogc3RyaW5nKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gdGFnLnNwbGl0KCdAJylcbiAgY29uc3QgdmVyc2lvbiA9IHNlZ21lbnRzLnBvcCgpIVxuICBjb25zdCBuYW1lID0gc2VnbWVudHMuam9pbignQCcpXG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHZlcnNpb24sXG4gICAgdGFnLFxuICB9XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVVuaXZlcnNhbGl6ZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIHBhdGhzID0gW1sndW5pdmVyc2FsaXplJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246ICdDb21iaWxlIGJ1aWx0IGJpbmFyaWVzIGludG8gb25lIHVuaXZlcnNhbCBiaW5hcnknLFxuICB9KVxuXG4gIGN3ZCA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywgcHJvY2Vzcy5jd2QoKSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgY29uZmlnUGF0aD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY29uZmlnLXBhdGgsLWMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlJyxcbiAgfSlcblxuICBwYWNrYWdlSnNvblBhdGggPSBPcHRpb24uU3RyaW5nKCctLXBhY2thZ2UtanNvbi1wYXRoJywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIG91dHB1dERpciA9IE9wdGlvbi5TdHJpbmcoJy0tb3V0cHV0LWRpciwtbycsICcuLycsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgYWxsIGJ1aWx0IGAubm9kZWAgZmlsZXMgcHV0LCBzYW1lIGFzIGAtLW91dHB1dC1kaXJgIG9mIGJ1aWxkIGNvbW1hbmQnLFxuICB9KVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICBjb25maWdQYXRoOiB0aGlzLmNvbmZpZ1BhdGgsXG4gICAgICBwYWNrYWdlSnNvblBhdGg6IHRoaXMucGFja2FnZUpzb25QYXRoLFxuICAgICAgb3V0cHV0RGlyOiB0aGlzLm91dHB1dERpcixcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb21iaWxlIGJ1aWx0IGJpbmFyaWVzIGludG8gb25lIHVuaXZlcnNhbCBiaW5hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbml2ZXJzYWxpemVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aFxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9jZXNzLmN3ZCgpXG4gICAqL1xuICBjd2Q/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGVcbiAgICovXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYHBhY2thZ2UuanNvbmBcbiAgICpcbiAgICogQGRlZmF1bHQgJ3BhY2thZ2UuanNvbidcbiAgICovXG4gIHBhY2thZ2VKc29uUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIGFsbCBidWlsdCBgLm5vZGVgIGZpbGVzIHB1dCwgc2FtZSBhcyBgLS1vdXRwdXQtZGlyYCBvZiBidWlsZCBjb21tYW5kXG4gICAqXG4gICAqIEBkZWZhdWx0ICcuLydcbiAgICovXG4gIG91dHB1dERpcj86IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlEZWZhdWx0VW5pdmVyc2FsaXplT3B0aW9ucyhvcHRpb25zOiBVbml2ZXJzYWxpemVPcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIHBhY2thZ2VKc29uUGF0aDogJ3BhY2thZ2UuanNvbicsXG4gICAgb3V0cHV0RGlyOiAnLi8nLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCB7XG4gIGFwcGx5RGVmYXVsdFVuaXZlcnNhbGl6ZU9wdGlvbnMsXG4gIHR5cGUgVW5pdmVyc2FsaXplT3B0aW9ucyxcbn0gZnJvbSAnLi4vZGVmL3VuaXZlcnNhbGl6ZS5qcydcbmltcG9ydCB7IHJlYWROYXBpQ29uZmlnIH0gZnJvbSAnLi4vdXRpbHMvY29uZmlnLmpzJ1xuaW1wb3J0IHsgZGVidWdGYWN0b3J5IH0gZnJvbSAnLi4vdXRpbHMvbG9nLmpzJ1xuaW1wb3J0IHsgZmlsZUV4aXN0cyB9IGZyb20gJy4uL3V0aWxzL21pc2MuanMnXG5pbXBvcnQgeyBVbmlBcmNoc0J5UGxhdGZvcm0gfSBmcm9tICcuLi91dGlscy90YXJnZXQuanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCd1bml2ZXJzYWxpemUnKVxuXG5mdW5jdGlvbiBjcmVhdGVEYXJ3aW5Vbml2ZXJzYWxCaW5hcnkoaW5wdXRzOiBzdHJpbmdbXSwgb3V0cHV0OiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKCdsaXBvJywgWyctY3JlYXRlJywgJy1vdXRwdXQnLCBvdXRwdXQsIC4uLmlucHV0c10sIHtcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KVxuXG4gIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICB0aHJvdyByZXN1bHQuZXJyb3JcbiAgfVxuXG4gIGlmIChyZXN1bHQuc2lnbmFsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBjcmVhdGUgdW5pdmVyc2FsIGJpbmFyeSAnJHtvdXRwdXR9JzogbGlwbyB0ZXJtaW5hdGVkIHdpdGggc2lnbmFsICR7cmVzdWx0LnNpZ25hbH0uYCxcbiAgICApXG4gIH1cblxuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHVuaXZlcnNhbCBiaW5hcnkgJyR7b3V0cHV0fSc6IGxpcG8gZXhpdGVkIHdpdGggc3RhdHVzICR7cmVzdWx0LnN0YXR1c30uYCxcbiAgICApXG4gIH1cbn1cblxuY29uc3QgdW5pdmVyc2FsaXplcnM6IFBhcnRpYWw8XG4gIFJlY29yZDxOb2RlSlMuUGxhdGZvcm0sIChpbnB1dHM6IHN0cmluZ1tdLCBvdXRwdXQ6IHN0cmluZykgPT4gdm9pZD5cbj4gPSB7XG4gIGRhcndpbjogY3JlYXRlRGFyd2luVW5pdmVyc2FsQmluYXJ5LFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW5pdmVyc2FsaXplQmluYXJpZXModXNlck9wdGlvbnM6IFVuaXZlcnNhbGl6ZU9wdGlvbnMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGFwcGx5RGVmYXVsdFVuaXZlcnNhbGl6ZU9wdGlvbnModXNlck9wdGlvbnMpXG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5wYWNrYWdlSnNvblBhdGgpXG5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVhZE5hcGlDb25maWcoXG4gICAgcGFja2FnZUpzb25QYXRoLFxuICAgIG9wdGlvbnMuY29uZmlnUGF0aCA/IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMuY29uZmlnUGF0aCkgOiB1bmRlZmluZWQsXG4gIClcblxuICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0cy5maW5kKFxuICAgICh0KSA9PiB0LnBsYXRmb3JtID09PSBwcm9jZXNzLnBsYXRmb3JtICYmIHQuYXJjaCA9PT0gJ3VuaXZlcnNhbCcsXG4gIClcblxuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAndW5pdmVyc2FsJyBhcmNoIGZvciBwbGF0Zm9ybSAnJHtwcm9jZXNzLnBsYXRmb3JtfScgbm90IGZvdW5kIGluIGNvbmZpZyFgLFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IHNyY0ZpbGVzID0gVW5pQXJjaHNCeVBsYXRmb3JtW3Byb2Nlc3MucGxhdGZvcm1dPy5tYXAoKGFyY2gpID0+XG4gICAgcmVzb2x2ZShcbiAgICAgIG9wdGlvbnMuY3dkLFxuICAgICAgb3B0aW9ucy5vdXRwdXREaXIsXG4gICAgICBgJHtjb25maWcuYmluYXJ5TmFtZX0uJHtwcm9jZXNzLnBsYXRmb3JtfS0ke2FyY2h9Lm5vZGVgLFxuICAgICksXG4gIClcblxuICBpZiAoIXNyY0ZpbGVzIHx8ICF1bml2ZXJzYWxpemVyc1twcm9jZXNzLnBsYXRmb3JtXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAndW5pdmVyc2FsJyBhcmNoIGZvciBwbGF0Zm9ybSAnJHtwcm9jZXNzLnBsYXRmb3JtfScgbm90IHN1cHBvcnRlZC5gLFxuICAgIClcbiAgfVxuXG4gIGRlYnVnKGBMb29raW5nIHVwIHNvdXJjZSBiaW5hcmllcyB0byBjb21iaW5lOiBgKVxuICBkZWJ1ZygnICAlTycsIHNyY0ZpbGVzKVxuXG4gIGNvbnN0IHNyY0ZpbGVMb29rdXAgPSBhd2FpdCBQcm9taXNlLmFsbChzcmNGaWxlcy5tYXAoKGYpID0+IGZpbGVFeGlzdHMoZikpKVxuXG4gIGNvbnN0IG5vdEZvdW5kRmlsZXMgPSBzcmNGaWxlcy5maWx0ZXIoKF8sIGkpID0+ICFzcmNGaWxlTG9va3VwW2ldKVxuXG4gIGlmIChub3RGb3VuZEZpbGVzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBTb21lIGJpbmFyeSBmaWxlcyB3ZXJlIG5vdCBmb3VuZDogJHtKU09OLnN0cmluZ2lmeShub3RGb3VuZEZpbGVzKX1gLFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IG91dHB1dCA9IHJlc29sdmUoXG4gICAgb3B0aW9ucy5jd2QsXG4gICAgb3B0aW9ucy5vdXRwdXREaXIsXG4gICAgYCR7Y29uZmlnLmJpbmFyeU5hbWV9LiR7cHJvY2Vzcy5wbGF0Zm9ybX0tdW5pdmVyc2FsLm5vZGVgLFxuICApXG5cbiAgdW5pdmVyc2FsaXplcnNbcHJvY2Vzcy5wbGF0Zm9ybV0/LihzcmNGaWxlcywgb3V0cHV0KVxuXG4gIGlmICghKGF3YWl0IGZpbGVFeGlzdHMob3V0cHV0KSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaXZlcnNhbCBiaW5hcnkgd2FzIG5vdCBjcmVhdGVkOiAke291dHB1dH1gKVxuICB9XG5cbiAgZGVidWcoYFByb2R1Y2VkIHVuaXZlcnNhbCBiaW5hcnk6ICR7b3V0cHV0fWApXG59XG4iLCJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5pbXBvcnQgeyBjb2xsZWN0QXJ0aWZhY3RzIH0gZnJvbSAnLi4vYXBpL2FydGlmYWN0cy5qcydcbmltcG9ydCB7IEJhc2VBcnRpZmFjdHNDb21tYW5kIH0gZnJvbSAnLi4vZGVmL2FydGlmYWN0cy5qcydcblxuZXhwb3J0IGNsYXNzIEFydGlmYWN0c0NvbW1hbmQgZXh0ZW5kcyBCYXNlQXJ0aWZhY3RzQ29tbWFuZCB7XG4gIHN0YXRpYyB1c2FnZSA9IENvbW1hbmQuVXNhZ2Uoe1xuICAgIGRlc2NyaXB0aW9uOiAnQ29weSBhcnRpZmFjdHMgZnJvbSBHaXRodWIgQWN0aW9ucyBpbnRvIHNwZWNpZmllZCBkaXInLFxuICAgIGV4YW1wbGVzOiBbXG4gICAgICBbXG4gICAgICAgICckMCBhcnRpZmFjdHMgLS1vdXRwdXQtZGlyIC4vYXJ0aWZhY3RzIC0tZGlzdCAuL25wbScsXG4gICAgICAgIGBDb3B5IFtiaW5hcnlOYW1lXS5bcGxhdGZvcm1dLm5vZGUgdW5kZXIgY3VycmVudCBkaXIoLikgaW50byBwYWNrYWdlcyB1bmRlciBucG0gZGlyLlxuZS5nOiBpbmRleC5saW51eC14NjQtZ251Lm5vZGUgLS0+IC4vbnBtL2xpbnV4LXg2NC1nbnUvaW5kZXgubGludXgteDY0LWdudS5ub2RlYCxcbiAgICAgIF0sXG4gICAgXSxcbiAgfSlcblxuICBzdGF0aWMgcGF0aHMgPSBbWydhcnRpZmFjdHMnXV1cblxuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IGNvbGxlY3RBcnRpZmFjdHModGhpcy5nZXRPcHRpb25zKCkpXG4gIH1cbn1cbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgY29kZWdlbi9pbmRleC50c1xuLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlIG1hbnVhbGx5XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQnVpbGRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ2J1aWxkJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246ICdCdWlsZCB0aGUgTkFQSS1SUyBwcm9qZWN0JyxcbiAgfSlcblxuICB0YXJnZXQ/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLXRhcmdldCwtdCcsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdCdWlsZCBmb3IgdGhlIHRhcmdldCB0cmlwbGUsIGJ5cGFzc2VkIHRvIGBjYXJnbyBidWlsZCAtLXRhcmdldGAnLFxuICB9KVxuXG4gIGN3ZD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgbWFuaWZlc3RQYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1tYW5pZmVzdC1wYXRoJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgQ2FyZ28udG9tbGAnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIHRhcmdldERpcj86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tdGFyZ2V0LWRpcicsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdEaXJlY3RvcnkgZm9yIGFsbCBjcmF0ZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzLCBzZWUgYGNhcmdvIGJ1aWxkIC0tdGFyZ2V0LWRpcmAnLFxuICB9KVxuXG4gIG91dHB1dERpcj86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tb3V0cHV0LWRpciwtbycsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRoIHRvIHdoZXJlIGFsbCB0aGUgYnVpbHQgZmlsZXMgd291bGQgYmUgcHV0LiBEZWZhdWx0IHRvIHRoZSBjcmF0ZSBmb2xkZXInLFxuICB9KVxuXG4gIHBsYXRmb3JtPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXBsYXRmb3JtJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0FkZCBwbGF0Zm9ybSB0cmlwbGUgdG8gdGhlIGdlbmVyYXRlZCBub2RlanMgYmluZGluZyBmaWxlLCBlZzogYFtuYW1lXS5saW51eC14NjQtZ251Lm5vZGVgJyxcbiAgfSlcblxuICBqc1BhY2thZ2VOYW1lPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1qcy1wYWNrYWdlLW5hbWUnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGFja2FnZSBuYW1lIGluIGdlbmVyYXRlZCBqcyBiaW5kaW5nIGZpbGUuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZycsXG4gIH0pXG5cbiAgY29uc3RFbnVtPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLWNvbnN0LWVudW0nLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIGdlbmVyYXRlIGNvbnN0IGVudW0gZm9yIHR5cGVzY3JpcHQgYmluZGluZ3MnLFxuICB9KVxuXG4gIHJ1bnRpbWVTdHJpbmdFbnVtPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXJ1bnRpbWUtc3RyaW5nLWVudW0nLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW1pdCBgI1tuYXBpKHN0cmluZ19lbnVtKV1gIGVudW1zIGFzIHJ1bnRpbWUgZW51bXMgKGBleHBvcnQgZGVjbGFyZSBlbnVtYCkgdW5kZXIgYC0tbm8tY29uc3QtZW51bWAuIERlZmF1bHQ6IHR5cGUtb25seSB1bmlvbi4nLFxuICB9KVxuXG4gIGpzQmluZGluZz86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tanMnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aCBhbmQgZmlsZW5hbWUgb2YgZ2VuZXJhdGVkIEpTIGJpbmRpbmcgZmlsZS4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLiBSZWxhdGl2ZSB0byBgLS1vdXRwdXQtZGlyYC4nLFxuICB9KVxuXG4gIG5vSnNCaW5kaW5nPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLW5vLWpzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1doZXRoZXIgdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBKUyBiaW5kaW5nIGZpbGUuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZy4nLFxuICB9KVxuXG4gIGR0cz86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tZHRzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGggYW5kIGZpbGVuYW1lIG9mIGdlbmVyYXRlZCB0eXBlIGRlZiBmaWxlLiBSZWxhdGl2ZSB0byBgLS1vdXRwdXQtZGlyYCcsXG4gIH0pXG5cbiAgZHRzSGVhZGVyPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1kdHMtaGVhZGVyJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0N1c3RvbSBmaWxlIGhlYWRlciBmb3IgZ2VuZXJhdGVkIHR5cGUgZGVmIGZpbGUuIE9ubHkgd29ya3Mgd2hlbiBgdHlwZWRlZmAgZmVhdHVyZSBlbmFibGVkLicsXG4gIH0pXG5cbiAgbm9EdHNIZWFkZXI/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tbm8tZHRzLWhlYWRlcicsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdXaGV0aGVyIHRvIGRpc2FibGUgdGhlIGRlZmF1bHQgZmlsZSBoZWFkZXIgZm9yIGdlbmVyYXRlZCB0eXBlIGRlZiBmaWxlLiBPbmx5IHdvcmtzIHdoZW4gYHR5cGVkZWZgIGZlYXR1cmUgZW5hYmxlZC4nLFxuICB9KVxuXG4gIGR0c0NhY2hlID0gT3B0aW9uLkJvb2xlYW4oJy0tZHRzLWNhY2hlJywgdHJ1ZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBlbmFibGUgdGhlIGR0cyBjYWNoZSwgZGVmYXVsdCB0byB0cnVlJyxcbiAgfSlcblxuICBlc20/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tZXNtJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1doZXRoZXIgdG8gZW1pdCBhbiBFU00gSlMgYmluZGluZyBmaWxlIGluc3RlYWQgb2YgQ0pTIGZvcm1hdC4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLicsXG4gIH0pXG5cbiAgc3RyaXA/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tc3RyaXAsLXMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHN0cmlwIHRoZSBsaWJyYXJ5IHRvIGFjaGlldmUgdGhlIG1pbmltdW0gZmlsZSBzaXplJyxcbiAgfSlcblxuICByZWxlYXNlPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXJlbGVhc2UsLXInLCB7XG4gICAgZGVzY3JpcHRpb246ICdCdWlsZCBpbiByZWxlYXNlIG1vZGUnLFxuICB9KVxuXG4gIHZlcmJvc2U/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tdmVyYm9zZSwtdicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZlcmJvc2VseSBsb2cgYnVpbGQgY29tbWFuZCB0cmFjZScsXG4gIH0pXG5cbiAgYmluPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1iaW4nLCB7XG4gICAgZGVzY3JpcHRpb246ICdCdWlsZCBvbmx5IHRoZSBzcGVjaWZpZWQgYmluYXJ5JyxcbiAgfSlcblxuICBwYWNrYWdlPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLC1wJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgdGhlIHNwZWNpZmllZCBsaWJyYXJ5IG9yIHRoZSBvbmUgYXQgY3dkJyxcbiAgfSlcblxuICBwcm9maWxlPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wcm9maWxlJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgYXJ0aWZhY3RzIHdpdGggdGhlIHNwZWNpZmllZCBwcm9maWxlJyxcbiAgfSlcblxuICBjcm9zc0NvbXBpbGU/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tY3Jvc3MtY29tcGlsZSwteCcsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdbZXhwZXJpbWVudGFsXSBjcm9zcy1jb21waWxlIGZvciB0aGUgc3BlY2lmaWVkIHRhcmdldCB3aXRoIGBjYXJnby14d2luYCBvbiB3aW5kb3dzIGFuZCBgY2FyZ28temlnYnVpbGRgIG9uIG90aGVyIHBsYXRmb3JtJyxcbiAgfSlcblxuICB1c2VDcm9zcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS11c2UtY3Jvc3MnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnW2V4cGVyaW1lbnRhbF0gdXNlIFtjcm9zc10oaHR0cHM6Ly9naXRodWIuY29tL2Nyb3NzLXJzL2Nyb3NzKSBpbnN0ZWFkIG9mIGBjYXJnb2AnLFxuICB9KVxuXG4gIHVzZU5hcGlDcm9zcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS11c2UtbmFwaS1jcm9zcycsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdbZXhwZXJpbWVudGFsXSB1c2UgQG5hcGktcnMvY3Jvc3MtdG9vbGNoYWluIHRvIGNyb3NzLWNvbXBpbGUgTGludXggYXJtL2FybTY0L3g2NCBnbnUgdGFyZ2V0cy4nLFxuICB9KVxuXG4gIHdhdGNoPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXdhdGNoLC13Jywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ3dhdGNoIHRoZSBjcmF0ZSBjaGFuZ2VzIGFuZCBidWlsZCBjb250aW51b3VzbHkgd2l0aCBgY2FyZ28td2F0Y2hgIGNyYXRlcycsXG4gIH0pXG5cbiAgZmVhdHVyZXM/OiBzdHJpbmdbXSA9IE9wdGlvbi5BcnJheSgnLS1mZWF0dXJlcywtRicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1NwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGZlYXR1cmVzIHRvIGFjdGl2YXRlJyxcbiAgfSlcblxuICBhbGxGZWF0dXJlcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS1hbGwtZmVhdHVyZXMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmF0ZSBhbGwgYXZhaWxhYmxlIGZlYXR1cmVzJyxcbiAgfSlcblxuICBub0RlZmF1bHRGZWF0dXJlcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS1uby1kZWZhdWx0LWZlYXR1cmVzJywge1xuICAgIGRlc2NyaXB0aW9uOiAnRG8gbm90IGFjdGl2YXRlIHRoZSBgZGVmYXVsdGAgZmVhdHVyZScsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldCxcbiAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICBtYW5pZmVzdFBhdGg6IHRoaXMubWFuaWZlc3RQYXRoLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIHRhcmdldERpcjogdGhpcy50YXJnZXREaXIsXG4gICAgICBvdXRwdXREaXI6IHRoaXMub3V0cHV0RGlyLFxuICAgICAgcGxhdGZvcm06IHRoaXMucGxhdGZvcm0sXG4gICAgICBqc1BhY2thZ2VOYW1lOiB0aGlzLmpzUGFja2FnZU5hbWUsXG4gICAgICBjb25zdEVudW06IHRoaXMuY29uc3RFbnVtLFxuICAgICAgcnVudGltZVN0cmluZ0VudW06IHRoaXMucnVudGltZVN0cmluZ0VudW0sXG4gICAgICBqc0JpbmRpbmc6IHRoaXMuanNCaW5kaW5nLFxuICAgICAgbm9Kc0JpbmRpbmc6IHRoaXMubm9Kc0JpbmRpbmcsXG4gICAgICBkdHM6IHRoaXMuZHRzLFxuICAgICAgZHRzSGVhZGVyOiB0aGlzLmR0c0hlYWRlcixcbiAgICAgIG5vRHRzSGVhZGVyOiB0aGlzLm5vRHRzSGVhZGVyLFxuICAgICAgZHRzQ2FjaGU6IHRoaXMuZHRzQ2FjaGUsXG4gICAgICBlc206IHRoaXMuZXNtLFxuICAgICAgc3RyaXA6IHRoaXMuc3RyaXAsXG4gICAgICByZWxlYXNlOiB0aGlzLnJlbGVhc2UsXG4gICAgICB2ZXJib3NlOiB0aGlzLnZlcmJvc2UsXG4gICAgICBiaW46IHRoaXMuYmluLFxuICAgICAgcGFja2FnZTogdGhpcy5wYWNrYWdlLFxuICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlLFxuICAgICAgY3Jvc3NDb21waWxlOiB0aGlzLmNyb3NzQ29tcGlsZSxcbiAgICAgIHVzZUNyb3NzOiB0aGlzLnVzZUNyb3NzLFxuICAgICAgdXNlTmFwaUNyb3NzOiB0aGlzLnVzZU5hcGlDcm9zcyxcbiAgICAgIHdhdGNoOiB0aGlzLndhdGNoLFxuICAgICAgZmVhdHVyZXM6IHRoaXMuZmVhdHVyZXMsXG4gICAgICBhbGxGZWF0dXJlczogdGhpcy5hbGxGZWF0dXJlcyxcbiAgICAgIG5vRGVmYXVsdEZlYXR1cmVzOiB0aGlzLm5vRGVmYXVsdEZlYXR1cmVzLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBOQVBJLVJTIHByb2plY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMge1xuICAvKipcbiAgICogQnVpbGQgZm9yIHRoZSB0YXJnZXQgdHJpcGxlLCBieXBhc3NlZCB0byBgY2FyZ28gYnVpbGQgLS10YXJnZXRgXG4gICAqL1xuICB0YXJnZXQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aFxuICAgKi9cbiAgY3dkPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBDYXJnby50b21sYFxuICAgKi9cbiAgbWFuaWZlc3RQYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlXG4gICAqL1xuICBjb25maWdQYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBwYWNrYWdlLmpzb25gXG4gICAqL1xuICBwYWNrYWdlSnNvblBhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIERpcmVjdG9yeSBmb3IgYWxsIGNyYXRlIGdlbmVyYXRlZCBhcnRpZmFjdHMsIHNlZSBgY2FyZ28gYnVpbGQgLS10YXJnZXQtZGlyYFxuICAgKi9cbiAgdGFyZ2V0RGlyPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIHdoZXJlIGFsbCB0aGUgYnVpbHQgZmlsZXMgd291bGQgYmUgcHV0LiBEZWZhdWx0IHRvIHRoZSBjcmF0ZSBmb2xkZXJcbiAgICovXG4gIG91dHB1dERpcj86IHN0cmluZ1xuICAvKipcbiAgICogQWRkIHBsYXRmb3JtIHRyaXBsZSB0byB0aGUgZ2VuZXJhdGVkIG5vZGVqcyBiaW5kaW5nIGZpbGUsIGVnOiBgW25hbWVdLmxpbnV4LXg2NC1nbnUubm9kZWBcbiAgICovXG4gIHBsYXRmb3JtPzogYm9vbGVhblxuICAvKipcbiAgICogUGFja2FnZSBuYW1lIGluIGdlbmVyYXRlZCBqcyBiaW5kaW5nIGZpbGUuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZ1xuICAgKi9cbiAganNQYWNrYWdlTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogV2hldGhlciBnZW5lcmF0ZSBjb25zdCBlbnVtIGZvciB0eXBlc2NyaXB0IGJpbmRpbmdzXG4gICAqL1xuICBjb25zdEVudW0/OiBib29sZWFuXG4gIC8qKlxuICAgKiBFbWl0IGAjW25hcGkoc3RyaW5nX2VudW0pXWAgZW51bXMgYXMgcnVudGltZSBlbnVtcyAoYGV4cG9ydCBkZWNsYXJlIGVudW1gKSB1bmRlciBgLS1uby1jb25zdC1lbnVtYC4gRGVmYXVsdDogdHlwZS1vbmx5IHVuaW9uLlxuICAgKi9cbiAgcnVudGltZVN0cmluZ0VudW0/OiBib29sZWFuXG4gIC8qKlxuICAgKiBQYXRoIGFuZCBmaWxlbmFtZSBvZiBnZW5lcmF0ZWQgSlMgYmluZGluZyBmaWxlLiBPbmx5IHdvcmtzIHdpdGggYC0tcGxhdGZvcm1gIGZsYWcuIFJlbGF0aXZlIHRvIGAtLW91dHB1dC1kaXJgLlxuICAgKi9cbiAganNCaW5kaW5nPzogc3RyaW5nXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gSlMgYmluZGluZyBmaWxlLiBPbmx5IHdvcmtzIHdpdGggYC0tcGxhdGZvcm1gIGZsYWcuXG4gICAqL1xuICBub0pzQmluZGluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFBhdGggYW5kIGZpbGVuYW1lIG9mIGdlbmVyYXRlZCB0eXBlIGRlZiBmaWxlLiBSZWxhdGl2ZSB0byBgLS1vdXRwdXQtZGlyYFxuICAgKi9cbiAgZHRzPzogc3RyaW5nXG4gIC8qKlxuICAgKiBDdXN0b20gZmlsZSBoZWFkZXIgZm9yIGdlbmVyYXRlZCB0eXBlIGRlZiBmaWxlLiBPbmx5IHdvcmtzIHdoZW4gYHR5cGVkZWZgIGZlYXR1cmUgZW5hYmxlZC5cbiAgICovXG4gIGR0c0hlYWRlcj86IHN0cmluZ1xuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBkZWZhdWx0IGZpbGUgaGVhZGVyIGZvciBnZW5lcmF0ZWQgdHlwZSBkZWYgZmlsZS4gT25seSB3b3JrcyB3aGVuIGB0eXBlZGVmYCBmZWF0dXJlIGVuYWJsZWQuXG4gICAqL1xuICBub0R0c0hlYWRlcj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRoZSBkdHMgY2FjaGUsIGRlZmF1bHQgdG8gdHJ1ZVxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBkdHNDYWNoZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW1pdCBhbiBFU00gSlMgYmluZGluZyBmaWxlIGluc3RlYWQgb2YgQ0pTIGZvcm1hdC4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLlxuICAgKi9cbiAgZXNtPzogYm9vbGVhblxuICAvKipcbiAgICogV2hldGhlciBzdHJpcCB0aGUgbGlicmFyeSB0byBhY2hpZXZlIHRoZSBtaW5pbXVtIGZpbGUgc2l6ZVxuICAgKi9cbiAgc3RyaXA/OiBib29sZWFuXG4gIC8qKlxuICAgKiBCdWlsZCBpbiByZWxlYXNlIG1vZGVcbiAgICovXG4gIHJlbGVhc2U/OiBib29sZWFuXG4gIC8qKlxuICAgKiBWZXJib3NlbHkgbG9nIGJ1aWxkIGNvbW1hbmQgdHJhY2VcbiAgICovXG4gIHZlcmJvc2U/OiBib29sZWFuXG4gIC8qKlxuICAgKiBCdWlsZCBvbmx5IHRoZSBzcGVjaWZpZWQgYmluYXJ5XG4gICAqL1xuICBiaW4/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBzcGVjaWZpZWQgbGlicmFyeSBvciB0aGUgb25lIGF0IGN3ZFxuICAgKi9cbiAgcGFja2FnZT86IHN0cmluZ1xuICAvKipcbiAgICogQnVpbGQgYXJ0aWZhY3RzIHdpdGggdGhlIHNwZWNpZmllZCBwcm9maWxlXG4gICAqL1xuICBwcm9maWxlPzogc3RyaW5nXG4gIC8qKlxuICAgKiBbZXhwZXJpbWVudGFsXSBjcm9zcy1jb21waWxlIGZvciB0aGUgc3BlY2lmaWVkIHRhcmdldCB3aXRoIGBjYXJnby14d2luYCBvbiB3aW5kb3dzIGFuZCBgY2FyZ28temlnYnVpbGRgIG9uIG90aGVyIHBsYXRmb3JtXG4gICAqL1xuICBjcm9zc0NvbXBpbGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiBbZXhwZXJpbWVudGFsXSB1c2UgW2Nyb3NzXShodHRwczovL2dpdGh1Yi5jb20vY3Jvc3MtcnMvY3Jvc3MpIGluc3RlYWQgb2YgYGNhcmdvYFxuICAgKi9cbiAgdXNlQ3Jvc3M/OiBib29sZWFuXG4gIC8qKlxuICAgKiBbZXhwZXJpbWVudGFsXSB1c2UgQG5hcGktcnMvY3Jvc3MtdG9vbGNoYWluIHRvIGNyb3NzLWNvbXBpbGUgTGludXggYXJtL2FybTY0L3g2NCBnbnUgdGFyZ2V0cy5cbiAgICovXG4gIHVzZU5hcGlDcm9zcz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIHdhdGNoIHRoZSBjcmF0ZSBjaGFuZ2VzIGFuZCBidWlsZCBjb250aW51b3VzbHkgd2l0aCBgY2FyZ28td2F0Y2hgIGNyYXRlc1xuICAgKi9cbiAgd2F0Y2g/OiBib29sZWFuXG4gIC8qKlxuICAgKiBTcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBmZWF0dXJlcyB0byBhY3RpdmF0ZVxuICAgKi9cbiAgZmVhdHVyZXM/OiBzdHJpbmdbXVxuICAvKipcbiAgICogQWN0aXZhdGUgYWxsIGF2YWlsYWJsZSBmZWF0dXJlc1xuICAgKi9cbiAgYWxsRmVhdHVyZXM/OiBib29sZWFuXG4gIC8qKlxuICAgKiBEbyBub3QgYWN0aXZhdGUgdGhlIGBkZWZhdWx0YCBmZWF0dXJlXG4gICAqL1xuICBub0RlZmF1bHRGZWF0dXJlcz86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVmYXVsdEJ1aWxkT3B0aW9ucyhvcHRpb25zOiBCdWlsZE9wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBkdHNDYWNoZTogdHJ1ZSxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgeyBleGVjU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2VzcydcblxuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5pbXBvcnQgeyBidWlsZFByb2plY3QgfSBmcm9tICcuLi9hcGkvYnVpbGQuanMnXG5pbXBvcnQgeyBCYXNlQnVpbGRDb21tYW5kIH0gZnJvbSAnLi4vZGVmL2J1aWxkLmpzJ1xuaW1wb3J0IHsgZGVidWdGYWN0b3J5IH0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCdidWlsZCcpXG5cbmV4cG9ydCBjbGFzcyBCdWlsZENvbW1hbmQgZXh0ZW5kcyBCYXNlQnVpbGRDb21tYW5kIHtcbiAgcGlwZSA9IE9wdGlvbi5TdHJpbmcoJy0tcGlwZScsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQaXBlIGFsbCBvdXRwdXRzIGZpbGUgdG8gZ2l2ZW4gY29tbWFuZC4gZS5nLiBgbmFwaSBidWlsZCAtLXBpcGUgXCJucHggcHJldHRpZXIgLS13cml0ZVwiYCcsXG4gIH0pXG5cbiAgY2FyZ29PcHRpb25zID0gT3B0aW9uLlJlc3QoKVxuXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgeyB0YXNrIH0gPSBhd2FpdCBidWlsZFByb2plY3Qoe1xuICAgICAgLi4udGhpcy5nZXRPcHRpb25zKCksXG4gICAgICBjYXJnb09wdGlvbnM6IHRoaXMuY2FyZ29PcHRpb25zLFxuICAgIH0pXG5cbiAgICBjb25zdCBvdXRwdXRzID0gYXdhaXQgdGFza1xuXG4gICAgaWYgKHRoaXMucGlwZSkge1xuICAgICAgZm9yIChjb25zdCBvdXRwdXQgb2Ygb3V0cHV0cykge1xuICAgICAgICBkZWJ1ZygnUGlwaW5nIG91dHB1dCBmaWxlIHRvIGNvbW1hbmQ6ICVzJywgdGhpcy5waXBlKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGV4ZWNTeW5jKGAke3RoaXMucGlwZX0gJHtvdXRwdXQucGF0aH1gLCB7XG4gICAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZGVidWcuZXJyb3IoYEZhaWxlZCB0byBwaXBlIG91dHB1dCBmaWxlICR7b3V0cHV0LnBhdGh9IHRvIGNvbW1hbmRgKVxuICAgICAgICAgIGRlYnVnLmVycm9yKGUpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5pbXBvcnQgeyBDTElfVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL21pc2MuanMnXG5cbi8qKlxuICogQSBjb21tYW5kIHRoYXQgcHJpbnRzIHRoZSB2ZXJzaW9uIG9mIHRoZSBDTEkuXG4gKlxuICogUGF0aHM6IGAtdmAsIGAtLXZlcnNpb25gXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGlWZXJzaW9uQ29tbWFuZCBleHRlbmRzIENvbW1hbmQ8YW55PiB7XG4gIHN0YXRpYyBwYXRocyA9IFtbYC12YF0sIFtgLS12ZXJzaW9uYF1dXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgdGhpcy5jb250ZXh0LnN0ZG91dC53cml0ZShgJHtDTElfVkVSU0lPTn1cXG5gKVxuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVOcG1EaXJzIH0gZnJvbSAnLi4vYXBpL2NyZWF0ZS1ucG0tZGlycy5qcydcbmltcG9ydCB7IEJhc2VDcmVhdGVOcG1EaXJzQ29tbWFuZCB9IGZyb20gJy4uL2RlZi9jcmVhdGUtbnBtLWRpcnMuanMnXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVOcG1EaXJzQ29tbWFuZCBleHRlbmRzIEJhc2VDcmVhdGVOcG1EaXJzQ29tbWFuZCB7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgY3JlYXRlTnBtRGlycyh0aGlzLmdldE9wdGlvbnMoKSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NsaXBhbmlvbidcblxuLyoqXG4gKiBBIGNvbW1hbmQgdGhhdCBwcmludHMgdGhlIHVzYWdlIG9mIGFsbCBjb21tYW5kcy5cbiAqXG4gKiBQYXRoczogYC1oYCwgYC0taGVscGBcbiAqL1xuZXhwb3J0IGNsYXNzIEhlbHBDb21tYW5kIGV4dGVuZHMgQ29tbWFuZDxhbnk+IHtcbiAgc3RhdGljIHBhdGhzID0gW1tgLWhgXSwgW2AtLWhlbHBgXV1cbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBhd2FpdCB0aGlzLmNvbnRleHQuc3Rkb3V0LndyaXRlKHRoaXMuY2xpLnVzYWdlKCkpXG4gIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHsgaW5wdXQsIHNlbGVjdCwgY2hlY2tib3gsIGNvbmZpcm0gfSBmcm9tICdAaW5xdWlyZXIvcHJvbXB0cydcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJ2NsaXBhbmlvbidcblxuaW1wb3J0IHsgbmV3UHJvamVjdCB9IGZyb20gJy4uL2FwaS9uZXcuanMnXG5pbXBvcnQgeyBCYXNlTmV3Q29tbWFuZCB9IGZyb20gJy4uL2RlZi9uZXcuanMnXG5pbXBvcnQge1xuICBBVkFJTEFCTEVfVEFSR0VUUyxcbiAgZGVidWdGYWN0b3J5LFxuICBERUZBVUxUX1RBUkdFVFMsXG4gIHR5cGUgVGFyZ2V0VHJpcGxlLFxufSBmcm9tICcuLi91dGlscy9pbmRleC5qcydcbmltcG9ydCB7XG4gIG5hcGlFbmdpbmVSZXF1aXJlbWVudCxcbiAgU1VQUE9SVEVEX05BUElfVkVSU0lPTlMsXG59IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCduZXcnKVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFwaVZlcnNpb25DaG9pY2VzKCkge1xuICByZXR1cm4gU1VQUE9SVEVEX05BUElfVkVSU0lPTlMubWFwKCh2ZXJzaW9uKSA9PiAoe1xuICAgIG5hbWU6IGBuYXBpJHt2ZXJzaW9ufSAoJHtuYXBpRW5naW5lUmVxdWlyZW1lbnQodmVyc2lvbil9KWAsXG4gICAgdmFsdWU6IHZlcnNpb24sXG4gIH0pKVxufVxuXG5leHBvcnQgY2xhc3MgTmV3Q29tbWFuZCBleHRlbmRzIEJhc2VOZXdDb21tYW5kIHtcbiAgaW50ZXJhY3RpdmUgPSBPcHRpb24uQm9vbGVhbignLS1pbnRlcmFjdGl2ZSwtaScsIHRydWUsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdBc2sgcHJvamVjdCBiYXNpYyBpbmZvcm1hdGlvbiBpbnRlcmFjdGl2ZWx5IHdpdGhvdXQganVzdCB1c2luZyB0aGUgZGVmYXVsdC4nLFxuICB9KVxuXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmZldGNoT3B0aW9ucygpXG4gICAgICBhd2FpdCBuZXdQcm9qZWN0KG9wdGlvbnMpXG4gICAgICByZXR1cm4gMFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRlYnVnKCdGYWlsZWQgdG8gY3JlYXRlIG5ldyBwcm9qZWN0JylcbiAgICAgIGRlYnVnLmVycm9yKGUpXG4gICAgICByZXR1cm4gMVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hPcHRpb25zKCkge1xuICAgIGNvbnN0IGNtZE9wdGlvbnMgPSBzdXBlci5nZXRPcHRpb25zKClcblxuICAgIGlmICh0aGlzLmludGVyYWN0aXZlKSB7XG4gICAgICBjb25zdCB0YXJnZXRQYXRoOiBzdHJpbmcgPSBjbWRPcHRpb25zLnBhdGhcbiAgICAgICAgPyBjbWRPcHRpb25zLnBhdGhcbiAgICAgICAgOiBhd2FpdCBpbnF1aXJlclByb2plY3RQYXRoKClcbiAgICAgIGNtZE9wdGlvbnMucGF0aCA9IHRhcmdldFBhdGhcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNtZE9wdGlvbnMsXG4gICAgICAgIG5hbWU6IGF3YWl0IHRoaXMuZmV0Y2hOYW1lKHBhdGgucGFyc2UodGFyZ2V0UGF0aCkuYmFzZSksXG4gICAgICAgIG1pbk5vZGVBcGlWZXJzaW9uOiBhd2FpdCB0aGlzLmZldGNoTmFwaVZlcnNpb24oKSxcbiAgICAgICAgdGFyZ2V0czogYXdhaXQgdGhpcy5mZXRjaFRhcmdldHMoKSxcbiAgICAgICAgbGljZW5zZTogYXdhaXQgdGhpcy5mZXRjaExpY2Vuc2UoKSxcbiAgICAgICAgZW5hYmxlVHlwZURlZjogYXdhaXQgdGhpcy5mZXRjaFR5cGVEZWYoKSxcbiAgICAgICAgZW5hYmxlR2l0aHViQWN0aW9uczogYXdhaXQgdGhpcy5mZXRjaEdpdGh1YkFjdGlvbnMoKSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY21kT3B0aW9uc1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE5hbWUoZGVmYXVsdE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuJCRuYW1lID8/XG4gICAgICBpbnB1dCh7XG4gICAgICAgIG1lc3NhZ2U6ICdQYWNrYWdlIG5hbWUgKHRoZSBuYW1lIGZpZWxkIGluIHlvdXIgcGFja2FnZS5qc29uIGZpbGUpJyxcbiAgICAgICAgZGVmYXVsdDogZGVmYXVsdE5hbWUsXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hMaWNlbnNlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGlucHV0KHtcbiAgICAgIG1lc3NhZ2U6ICdMaWNlbnNlIGZvciBvcGVuLXNvdXJjZWQgcHJvamVjdCcsXG4gICAgICBkZWZhdWx0OiB0aGlzLmxpY2Vuc2UsXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hOYXBpVmVyc2lvbigpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiBzZWxlY3Qoe1xuICAgICAgbWVzc2FnZTogJ01pbmltdW0gbm9kZS1hcGkgdmVyc2lvbiAod2l0aCBub2RlIHZlcnNpb24gcmVxdWlyZW1lbnQpJyxcbiAgICAgIGxvb3A6IGZhbHNlLFxuICAgICAgcGFnZVNpemU6IDEwLFxuICAgICAgY2hvaWNlczogZ2V0TmFwaVZlcnNpb25DaG9pY2VzKCksXG4gICAgICAvLyBjaG9pY2UgaW5kZXhcbiAgICAgIGRlZmF1bHQ6IHRoaXMubWluTm9kZUFwaVZlcnNpb24gLSAxLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoVGFyZ2V0cygpOiBQcm9taXNlPFRhcmdldFRyaXBsZVtdPiB7XG4gICAgaWYgKHRoaXMuZW5hYmxlQWxsVGFyZ2V0cykge1xuICAgICAgcmV0dXJuIEFWQUlMQUJMRV9UQVJHRVRTLmNvbmNhdCgpXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IGNoZWNrYm94KHtcbiAgICAgIGxvb3A6IGZhbHNlLFxuICAgICAgbWVzc2FnZTogJ0Nob29zZSB0YXJnZXQocykgeW91ciBjcmF0ZSB3aWxsIGJlIGNvbXBpbGVkIHRvJyxcbiAgICAgIGNob2ljZXM6IEFWQUlMQUJMRV9UQVJHRVRTLm1hcCgodGFyZ2V0KSA9PiAoe1xuICAgICAgICBuYW1lOiB0YXJnZXQsXG4gICAgICAgIHZhbHVlOiB0YXJnZXQsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgY2hlY2tlZDogREVGQVVMVF9UQVJHRVRTLmluY2x1ZGVzKHRhcmdldCksXG4gICAgICB9KSksXG4gICAgfSlcblxuICAgIHJldHVybiB0YXJnZXRzXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoVHlwZURlZigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBlbmFibGVUeXBlRGVmID0gYXdhaXQgY29uZmlybSh7XG4gICAgICBtZXNzYWdlOiAnRW5hYmxlIHR5cGUgZGVmaW5pdGlvbiBhdXRvLWdlbmVyYXRpb24nLFxuICAgICAgZGVmYXVsdDogdGhpcy5lbmFibGVUeXBlRGVmLFxuICAgIH0pXG5cbiAgICByZXR1cm4gZW5hYmxlVHlwZURlZlxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEdpdGh1YkFjdGlvbnMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZW5hYmxlR2l0aHViQWN0aW9ucyA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgbWVzc2FnZTogJ0VuYWJsZSBHaXRodWIgQWN0aW9ucyBDSScsXG4gICAgICBkZWZhdWx0OiB0aGlzLmVuYWJsZUdpdGh1YkFjdGlvbnMsXG4gICAgfSlcblxuICAgIHJldHVybiBlbmFibGVHaXRodWJBY3Rpb25zXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5xdWlyZXJQcm9qZWN0UGF0aCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gaW5wdXQoe1xuICAgIG1lc3NhZ2U6ICdUYXJnZXQgcGF0aCB0byBjcmVhdGUgdGhlIHByb2plY3QsIHJlbGF0aXZlIHRvIGN3ZC4nLFxuICB9KS50aGVuKChwYXRoKSA9PiB7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICByZXR1cm4gaW5xdWlyZXJQcm9qZWN0UGF0aCgpXG4gICAgfVxuICAgIHJldHVybiBwYXRoXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBwcmVQdWJsaXNoIH0gZnJvbSAnLi4vYXBpL3ByZS1wdWJsaXNoLmpzJ1xuaW1wb3J0IHsgQmFzZVByZVB1Ymxpc2hDb21tYW5kIH0gZnJvbSAnLi4vZGVmL3ByZS1wdWJsaXNoLmpzJ1xuXG5leHBvcnQgY2xhc3MgUHJlUHVibGlzaENvbW1hbmQgZXh0ZW5kcyBCYXNlUHJlUHVibGlzaENvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY29uc3QgJ25wbScgfCAnbGVybmEnIHRvIHN0cmluZ1xuICAgIGF3YWl0IHByZVB1Ymxpc2godGhpcy5nZXRPcHRpb25zKCkpXG4gIH1cbn1cbiIsImltcG9ydCB7IGlucHV0IH0gZnJvbSAnQGlucXVpcmVyL3Byb21wdHMnXG5cbmltcG9ydCB7IHJlbmFtZVByb2plY3QgfSBmcm9tICcuLi9hcGkvcmVuYW1lLmpzJ1xuaW1wb3J0IHsgQmFzZVJlbmFtZUNvbW1hbmQgfSBmcm9tICcuLi9kZWYvcmVuYW1lLmpzJ1xuXG5leHBvcnQgY2xhc3MgUmVuYW1lQ29tbWFuZCBleHRlbmRzIEJhc2VSZW5hbWVDb21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRPcHRpb25zKClcbiAgICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgICAgY29uc3QgbmFtZSA9IGF3YWl0IGlucHV0KHtcbiAgICAgICAgbWVzc2FnZTogYEVudGVyIHRoZSBuZXcgcGFja2FnZSBuYW1lIGluIHRoZSBwYWNrYWdlLmpzb25gLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBvcHRpb25zLm5hbWUgPSBuYW1lXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5iaW5hcnlOYW1lKSB7XG4gICAgICBjb25zdCBiaW5hcnlOYW1lID0gYXdhaXQgaW5wdXQoe1xuICAgICAgICBtZXNzYWdlOiBgRW50ZXIgdGhlIG5ldyBiaW5hcnkgbmFtZWAsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIG9wdGlvbnMuYmluYXJ5TmFtZSA9IGJpbmFyeU5hbWVcbiAgICB9XG4gICAgYXdhaXQgcmVuYW1lUHJvamVjdChvcHRpb25zKVxuICB9XG59XG4iLCJpbXBvcnQgeyB1bml2ZXJzYWxpemVCaW5hcmllcyB9IGZyb20gJy4uL2FwaS91bml2ZXJzYWxpemUuanMnXG5pbXBvcnQgeyBCYXNlVW5pdmVyc2FsaXplQ29tbWFuZCB9IGZyb20gJy4uL2RlZi91bml2ZXJzYWxpemUuanMnXG5cbmV4cG9ydCBjbGFzcyBVbml2ZXJzYWxpemVDb21tYW5kIGV4dGVuZHMgQmFzZVVuaXZlcnNhbGl6ZUNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IHVuaXZlcnNhbGl6ZUJpbmFyaWVzKHRoaXMuZ2V0T3B0aW9ucygpKVxuICB9XG59XG4iLCJpbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vYXBpL3ZlcnNpb24uanMnXG5pbXBvcnQgeyBCYXNlVmVyc2lvbkNvbW1hbmQgfSBmcm9tICcuLi9kZWYvdmVyc2lvbi5qcydcblxuZXhwb3J0IGNsYXNzIFZlcnNpb25Db21tYW5kIGV4dGVuZHMgQmFzZVZlcnNpb25Db21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBhd2FpdCB2ZXJzaW9uKHRoaXMuZ2V0T3B0aW9ucygpKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDbGkgfSBmcm9tICdjbGlwYW5pb24nXG5cbmltcG9ydCB7IGNvbGxlY3RBcnRpZmFjdHMgfSBmcm9tICcuL2FwaS9hcnRpZmFjdHMuanMnXG5pbXBvcnQgeyBidWlsZFByb2plY3QgfSBmcm9tICcuL2FwaS9idWlsZC5qcydcbmltcG9ydCB7IGNyZWF0ZU5wbURpcnMgfSBmcm9tICcuL2FwaS9jcmVhdGUtbnBtLWRpcnMuanMnXG5pbXBvcnQgeyBuZXdQcm9qZWN0IH0gZnJvbSAnLi9hcGkvbmV3LmpzJ1xuaW1wb3J0IHsgcHJlUHVibGlzaCB9IGZyb20gJy4vYXBpL3ByZS1wdWJsaXNoLmpzJ1xuaW1wb3J0IHsgcmVuYW1lUHJvamVjdCB9IGZyb20gJy4vYXBpL3JlbmFtZS5qcydcbmltcG9ydCB7IHVuaXZlcnNhbGl6ZUJpbmFyaWVzIH0gZnJvbSAnLi9hcGkvdW5pdmVyc2FsaXplLmpzJ1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vYXBpL3ZlcnNpb24uanMnXG5pbXBvcnQgeyBBcnRpZmFjdHNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9hcnRpZmFjdHMuanMnXG5pbXBvcnQgeyBCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkLmpzJ1xuaW1wb3J0IHsgQ2xpVmVyc2lvbkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NsaS12ZXJzaW9uLmpzJ1xuaW1wb3J0IHsgQ3JlYXRlTnBtRGlyc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZS1ucG0tZGlycy5qcydcbmltcG9ydCB7IEhlbHBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9oZWxwLmpzJ1xuaW1wb3J0IHsgTmV3Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbmV3LmpzJ1xuaW1wb3J0IHsgUHJlUHVibGlzaENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByZS1wdWJsaXNoLmpzJ1xuaW1wb3J0IHsgUmVuYW1lQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmVuYW1lLmpzJ1xuaW1wb3J0IHsgVW5pdmVyc2FsaXplQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdW5pdmVyc2FsaXplLmpzJ1xuaW1wb3J0IHsgVmVyc2lvbkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcnNpb24uanMnXG5pbXBvcnQgeyBDTElfVkVSU0lPTiB9IGZyb20gJy4vdXRpbHMvbWlzYy5qcydcblxuZXhwb3J0IGNvbnN0IGNsaSA9IG5ldyBDbGkoe1xuICBiaW5hcnlOYW1lOiAnbmFwaScsXG4gIGJpbmFyeVZlcnNpb246IENMSV9WRVJTSU9OLFxufSlcblxuY2xpLnJlZ2lzdGVyKE5ld0NvbW1hbmQpXG5jbGkucmVnaXN0ZXIoQnVpbGRDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKENyZWF0ZU5wbURpcnNDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKEFydGlmYWN0c0NvbW1hbmQpXG5jbGkucmVnaXN0ZXIoVW5pdmVyc2FsaXplQ29tbWFuZClcbmNsaS5yZWdpc3RlcihSZW5hbWVDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKFByZVB1Ymxpc2hDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKFZlcnNpb25Db21tYW5kKVxuY2xpLnJlZ2lzdGVyKEhlbHBDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKENsaVZlcnNpb25Db21tYW5kKVxuXG4vKipcbiAqXG4gKiBAdXNhZ2VcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgY2xpID0gbmV3IE5hcGlDbGkoKVxuICpcbiAqIGNsaS5idWlsZCh7XG4gKiAgIGN3ZDogJy9wYXRoL3RvL3lvdXIvcHJvamVjdCcsXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXBpQ2xpIHtcbiAgYXJ0aWZhY3RzID0gY29sbGVjdEFydGlmYWN0c1xuICBuZXcgPSBuZXdQcm9qZWN0XG4gIGJ1aWxkID0gYnVpbGRQcm9qZWN0XG4gIGNyZWF0ZU5wbURpcnMgPSBjcmVhdGVOcG1EaXJzXG4gIHByZVB1Ymxpc2ggPSBwcmVQdWJsaXNoXG4gIHJlbmFtZSA9IHJlbmFtZVByb2plY3RcbiAgdW5pdmVyc2FsaXplID0gdW5pdmVyc2FsaXplQmluYXJpZXNcbiAgdmVyc2lvbiA9IHZlcnNpb25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJ1aWxkQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IEJ1aWxkQ29tbWFuZCB7XG4gIHJldHVybiBjbGkucHJvY2VzcyhbJ2J1aWxkJywgLi4uYXJnc10pIGFzIEJ1aWxkQ29tbWFuZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJ0aWZhY3RzQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IEFydGlmYWN0c0NvbW1hbmQge1xuICByZXR1cm4gY2xpLnByb2Nlc3MoWydhcnRpZmFjdHMnLCAuLi5hcmdzXSkgYXMgQXJ0aWZhY3RzQ29tbWFuZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ3JlYXRlTnBtRGlyc0NvbW1hbmQoXG4gIGFyZ3M6IHN0cmluZ1tdLFxuKTogQ3JlYXRlTnBtRGlyc0NvbW1hbmQge1xuICByZXR1cm4gY2xpLnByb2Nlc3MoWydjcmVhdGUtbnBtLWRpcnMnLCAuLi5hcmdzXSkgYXMgQ3JlYXRlTnBtRGlyc0NvbW1hbmRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByZVB1Ymxpc2hDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogUHJlUHVibGlzaENvbW1hbmQge1xuICByZXR1cm4gY2xpLnByb2Nlc3MoWydwcmUtcHVibGlzaCcsIC4uLmFyZ3NdKSBhcyBQcmVQdWJsaXNoQ29tbWFuZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVuYW1lQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IFJlbmFtZUNvbW1hbmQge1xuICByZXR1cm4gY2xpLnByb2Nlc3MoWydyZW5hbWUnLCAuLi5hcmdzXSkgYXMgUmVuYW1lQ29tbWFuZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVW5pdmVyc2FsaXplQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IFVuaXZlcnNhbGl6ZUNvbW1hbmQge1xuICByZXR1cm4gY2xpLnByb2Nlc3MoWyd1bml2ZXJzYWxpemUnLCAuLi5hcmdzXSkgYXMgVW5pdmVyc2FsaXplQ29tbWFuZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVmVyc2lvbkNvbW1hbmQoYXJnczogc3RyaW5nW10pOiBWZXJzaW9uQ29tbWFuZCB7XG4gIHJldHVybiBjbGkucHJvY2VzcyhbJ3ZlcnNpb24nLCAuLi5hcmdzXSkgYXMgVmVyc2lvbkNvbW1hbmRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5ld0NvbW1hbmQoYXJnczogc3RyaW5nW10pOiBOZXdDb21tYW5kIHtcbiAgcmV0dXJuIGNsaS5wcm9jZXNzKFsnbmV3JywgLi4uYXJnc10pIGFzIE5ld0NvbW1hbmRcbn1cblxuZXhwb3J0IHsgcGFyc2VUcmlwbGUgfSBmcm9tICcuL3V0aWxzL3RhcmdldC5qcydcbmV4cG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVUeXBlRGVmT3B0aW9ucyxcbiAgdHlwZSBXcml0ZUpzQmluZGluZ09wdGlvbnMsXG4gIHdyaXRlSnNCaW5kaW5nLFxuICBnZW5lcmF0ZVR5cGVEZWYsXG59IGZyb20gJy4vYXBpL2J1aWxkLmpzJ1xuZXhwb3J0IHsgcmVhZE5hcGlDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZy5qcydcbiIsIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgY2xpIH0gZnJvbSAnLi9pbmRleC5qcydcblxudm9pZCBjbGkucnVuRXhpdChwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzE4LDE5LDIwLDIxLDIzLDI0LDI1XSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJQSxJQUFzQix1QkFBdEIsY0FBbUQsUUFBUTtDQUN6RCxPQUFPLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQztDQUU3QixPQUFPLFFBQVEsUUFBUSxNQUFNLEVBQzNCLGFBQ0UsNEVBQ0osQ0FBQztDQUVELE1BQU0sT0FBTyxPQUFPLFNBQVMsUUFBUSxJQUFJLEdBQUcsRUFDMUMsYUFDRSxxSEFDSixDQUFDO0NBRUQsYUFBc0IsT0FBTyxPQUFPLG9CQUFvQixFQUN0RCxhQUFhLGtDQUNmLENBQUM7Q0FFRCxrQkFBa0IsT0FBTyxPQUFPLHVCQUF1QixnQkFBZ0IsRUFDckUsYUFBYSx5QkFDZixDQUFDO0NBRUQsWUFBWSxPQUFPLE9BQU8sc0JBQXNCLGVBQWUsRUFDN0QsYUFDRSxnR0FDSixDQUFDO0NBRUQsU0FBUyxPQUFPLE9BQU8sYUFBYSxPQUFPLEVBQ3pDLGFBQWEsZ0RBQ2YsQ0FBQztDQUVELGlCQUEwQixPQUFPLE9BQU8sc0JBQXNCLEVBQzVELGFBQ0Usa0ZBQ0osQ0FBQztDQUVELGFBQWE7RUFDWCxPQUFPO0dBQ0wsS0FBSyxLQUFLO0dBQ1YsWUFBWSxLQUFLO0dBQ2pCLGlCQUFp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