@willbooster/wbfy 20.3.1 → 20.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +1 -0
  2. package/dist/index.js +13 -13
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -422,21 +422,21 @@ test/fixtures/
422
422
  `)?`\r
423
423
  `:`
424
424
  `}async function lc(n){return D.functionIgnoringException(`generateReleaserc`,async()=>{let r=t.resolve(n.dirPath,`.releaserc.json`);if(!e.existsSync(r))return;let i=JSON.parse(await e.promises.readFile(r,`utf8`)),a=i.plugins??[];for(let e=0;e<a.length;e++){let t=a[e],n=Array.isArray(t),r=n?t[0]:t,i=n&&t[1]||{};r===`@semantic-release/commit-analyzer`?a[e]=[`@semantic-release/commit-analyzer`,d.all([i,{preset:`conventionalcommits`}],{arrayMerge:Ft})]:r===`@semantic-release/github`&&(a[e]=[`@semantic-release/github`,d.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:[`r: semantic-release`],releasedLabels:[`released :bookmark:`]}],{arrayMerge:Ft})])}let o=JSON.stringify(i,void 0,2);await A.run(()=>k.generateFile(r,o))})}const uc=`github>WillBooster/willbooster-configs:renovate.jsonc`,dc={$schema:`https://docs.renovatebot.com/renovate-schema.json`,extends:[uc]},fc=[`renovate.json`,`renovate.json5`,`.github/renovate.json`,`.github/renovate.jsonc`,`.github/renovate.json5`,`.renovaterc`,`.renovaterc.json`,`.renovaterc.json5`];async function pc(n){return D.functionIgnoringException(`generateRenovateJsonc`,async()=>{let r=t.resolve(n.dirPath,`renovate.jsonc`);if((await e.promises.lstat(r).catch(()=>{}))?.isSymbolicLink()){console.warn(`Skipped generating ${r} because it is a symbolic link.`);return}let i=(await Promise.all(fc.map(async r=>{let i=t.resolve(n.dirPath,r);return await e.promises.lstat(i).catch(()=>{})?i:void 0}))).find(e=>e!==void 0);if(i||n.packageJson?.renovate){console.warn(`Skipped generating ${r} because the repository has a non-canonical Renovate config${i?` at ${i}`:` in package.json`}.`);return}let a=await k.readFileIfExists(r),o;if(a!==void 0&&!L.isTriviaOnly(a)&&(o=L.parseObjectIgnoringError(a),!o)){console.warn(`Skipped generating ${r} because the existing content is not parsable as JSONC.`);return}if(o?.extends!==void 0&&!Array.isArray(o.extends)){console.warn(`Skipped generating ${r} because "extends" is not an array.`);return}let s=o?.extends?.find(e=>e.startsWith(`github>WillBooster/willbooster-configs:`)&&e!==uc);if(s){console.warn(`Skipped generating ${r} because "${s}" no longer exists; remove it manually.`);return}let c=mc(n,o),{content:l,keysLosingComments:u}=L.stringifyPreservingTrivia(a,c);if((a===void 0||hc(l)!==hc(a))&&await k.generateFile(r,l))for(let e of u)console.warn(`Comments inside "${e}" were dropped while rewriting it in ${r}.`)})}function mc(e,t){let n=t?d.all([dc,t,dc],{arrayMerge:Ft}):structuredClone(dc),r=t?.extends??[];return n.extends=e.isWillBoosterConfigs?r.filter(e=>e!==uc):r.includes(uc)?r:[uc,...r],n}function hc(e){let t=e.trim();return t?t+`
425
- `:``}const gc={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:[`test/fixtures`],include:[`*.config.ts`,`scripts/**/*`,`src/**/*`,`test/**/*`]};async function _c(e){return D.functionIgnoringException(`generateTsconfig`,async()=>{if(e.depending.blitz||e.depending.next||e.depending.vinext){await Dc(e);return}let n=e.isRoot?vc(e):structuredClone(gc),r=Uc(e);n.extends=Da(e),n.compilerOptions??={},n.compilerOptions.rootDir=Nc(e),r.length>0&&(n.compilerOptions={...n.compilerOptions,types:r}),!e.doesContainJsxOrTsx&&!e.doesContainJsxOrTsxInPackages&&delete n.compilerOptions?.jsx,e.depending.prisma&&Fc(n,`prisma/**/*`);let i=t.resolve(e.dirPath,`tsconfig.json`),a=await k.readFileIfExists(i),o;if(a!==void 0&&!L.isTriviaOnly(a)){let t=L.parseObjectIgnoringError(a);if(!t){console.warn(`Skipped generating ${i} because the existing content is not parsable as JSONC.`);return}o=JSON.stringify(F(structuredClone(t)));let s=Lc(t.compilerOptions?.types),c=Hc(t.compilerOptions);n.extends=Pc(n.extends,t.extends),delete t.extends,delete t.compilerOptions?.jsx,e.isRoot&&wc(e,t,n),n=d.all([n,t,n],{arrayMerge:It}),n.include=n.include?.filter(e=>!e.includes(`@types`)&&!e.includes(`__tests__/`)&&!e.includes(`tests/`)),n.compilerOptions??={},n.compilerOptions={...n.compilerOptions,...c};let l=[...new Set([...zc(s,r),...r])];l.length>0?n.compilerOptions.types=l:delete n.compilerOptions.types,Rc(r)&&delete n.compilerOptions.typeRoots}if(Oc(n,e),F(n),n.include?.sort(),delete n.compilerOptions?.experimentalDecorators,delete n.compilerOptions?.baseUrl,e.depending.reactNative&&delete n.compilerOptions?.verbatimModuleSyntax,o===JSON.stringify(n))return;let s=JSON.stringify(n,void 0,2);await A.run(()=>k.generateFile(i,s))})}function vc(e){let t=e.doesContainSubPackageJsons?Ht(e):{excludes:[],includes:[]},n=structuredClone(gc);return n.exclude=[...new Set([...t.includes.map(e=>`${e}/test/fixtures`),...t.excludes,...xc(e),...n.exclude??[]])].toSorted(),n.include=[...n.include??[],...t.includes.flatMap(e=>[`${e}/*.config.ts`,`${e}/scripts/**/*`,`${e}/src/**/*`,`${e}/test/**/*`])],n}const yc=[`blitz`,`next`,`vinext`],bc=[`app`,`src/app`];function xc(n){if(!n.doesContainSubPackageJsons)return[];let r=[];for(let i of Bt(n))if(Sc(t.resolve(i,`package.json`)))for(let a of bc){let o=t.resolve(i,a);e.existsSync(o)&&r.push(t.relative(n.dirPath,o).replaceAll(`\\`,`/`))}return r}function Sc(t){let n;try{n=JSON.parse(e.readFileSync(t,`utf8`))}catch{return!1}if(!n||typeof n!=`object`)return!1;let r={...n.dependencies,...n.devDependencies};return yc.some(e=>r[e])}const Cc=[`*.config.ts`,`scripts/**/*`,`src/**/*`,`test/**/*`];function wc(e,n,r){let i=new Set;if(Array.isArray(n.include)){let e=n.include.filter(e=>typeof e==`string`),t=new Set(r.include);for(let n of e){let r=Ec(n);if(r===void 0||i.has(r))continue;let a=Cc.every(t=>e.includes(`${r}/${t}`)),o=Cc.some(e=>t.has(`${r}/${e}`));a&&!o&&i.add(r)}i.size>0&&(n.include=n.include.filter(e=>{let t=typeof e==`string`?Ec(e):void 0;return t===void 0||!i.has(t)}))}if(!Array.isArray(n.exclude))return;let a=new Set(r.exclude),o=e.doesContainSubPackageJsons?Bt(e).map(n=>t.relative(t.resolve(e.dirPath),n).replaceAll(`\\`,`/`)):[];n.exclude=n.exclude.filter(e=>typeof e!=`string`||a.has(e)?!0:e.endsWith(`/test/fixtures`)?!i.has(e.slice(0,-14)):!bc.some(t=>e.endsWith(`/${t}`)&&i.has(e.slice(0,-(t.length+1))))&&!Tc(e,o))}function Tc(e,t){if(e.split(`/`).includes(`**`))return!1;let n=e.split(`/`).map(e=>e.replaceAll(/[.+^${}()|[\]\\]/gu,String.raw`\$&`).replaceAll(`*`,`[^/]*`).replaceAll(`?`,`[^/]`)).join(`/`),r=RegExp(`^${n}(?:/.*)?$`,`u`);return t.some(t=>r.test(t)||e.startsWith(`${t}/`))}function Ec(e){let t=Cc.find(t=>e.endsWith(`/${t}`));if(!t)return;let n=e.slice(0,-(t.length+1));return n===``?void 0:n}async function Dc(e){let n=t.resolve(e.dirPath,`tsconfig.json`),r=await k.readFileIfExists(n);if(r===void 0||L.isTriviaOnly(r))return;let i=L.parseObjectIgnoringError(r);if(!i){console.warn(`Skipped cleaning up ${n} because the existing content is not parsable as JSONC.`);return}let a=JSON.stringify(i);Ac(i),jc(i.compilerOptions),kc(i),Oc(i,e),JSON.stringify(i)!==a&&await A.run(()=>k.generateFile(n,JSON.stringify(i,void 0,2)))}function Oc(e,t){let n=e.compilerOptions?.types;if(n?!n.includes(`bun`):t.depending.reactNative)return;let r=`${Nc(t)}/node_modules/undici-types/index.d.ts`,i=e.compilerOptions?.paths?.[`undici-types`];if(i){i.length===1&&typeof i[0]==`string`&&/(?:^|\/)node_modules\/undici-types\/index\.d\.ts$/u.test(i[0])&&(e.compilerOptions.paths[`undici-types`]=[r]);return}e.compilerOptions??={},e.compilerOptions.paths={...e.compilerOptions.paths,"undici-types":[r]}}function kc(e){e.include&&(e.include.includes(`scripts/**/*`)||(e.include.push(`scripts/**/*`),e.include.sort()))}function Ac(e){let t=e.compilerOptions;if(!t)return;let n=Vc(t.moduleResolution);(n===`node`||n===`node10`||n===void 0)&&(e.extends?delete t.moduleResolution:t.moduleResolution=`bundler`)}function jc(e){if(e&&(delete e.baseUrl,e.paths))for(let[t,n]of Object.entries(e.paths))e.paths[t]=Mc(n)}function Mc(e){return e.map(e=>e.startsWith(`./`)||e.startsWith(`../`)||t.isAbsolute(e)?e:`./${e}`)}function Nc(n){if(n.isRoot)return`.`;let r=t.resolve(n.dirPath),i;for(let n=t.dirname(r);;n=t.dirname(n)){let r=t.resolve(n,`package.json`);if(e.existsSync(r)){i??=n;try{if(le(JSON.parse(e.readFileSync(r,`utf8`)).workspaces).length>0){i=n;break}}catch{}}let a=e.existsSync(t.resolve(n,`.git`)),o=n===t.dirname(n);if(a||o)break}return i&&t.relative(r,i).replaceAll(`\\`,`/`)||`.`}function Pc(e,t){let n=[...Ic(e),...Ic(t)],r=[...new Set(n)];if(r.length!==0)return r.length===1?r[0]:r}function Fc(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}function Ic(e){return e?Array.isArray(e)?e:[e]:[]}function Lc(e){return typeof e==`string`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Rc(e){return e.some(e=>e===`cypress`||e.includes(`/`))}function zc(e,t){let n=new Set(t);return e.filter(e=>!(Bc(e)&&!n.has(e)))}function Bc(e){return e===`cypress`||e===`jest`||e===`mocha`||e===`vitest/globals`}function Vc(e){return typeof e==`string`?e.toLowerCase():void 0}function Hc(e){let t={};for(let n of[`declaration`,`declarationMap`,`sourceMap`]){let r=e?.[n];r!==void 0&&(t[n]=r)}return t}function Uc(e){let t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};return e.depending.reactNative||t.add(`bun`),(n.jest||n[`@jest/globals`]||n[`jest-environment-jsdom`]||n[`ts-jest`])&&t.add(`jest`),n.vitest&&t.add(`vitest/globals`),n.mocha&&t.add(`mocha`),n.cypress&&t.add(`cypress`),[...t]}const Wc=[`**/.git/objects/**`,`**/.git/subtree-cache/**`,`**/node_modules/**`,`**/tmp/**`,`**/temp/**`,`**/dist/**`];async function Gc(e){return D.functionIgnoringException(`generateVscodeSettings`,async()=>{let n=t.resolve(e.dirPath,`.vscode`,`settings.json`),r=await k.readFileIfExists(n);if(r===void 0||L.isTriviaOnly(r))return;let i=L.parseObjectIgnoringError(r);if(!i){console.warn(`Skipped updating ${n} because the existing content is not parsable as JSONC.`);return}let a=JSON.stringify(F(structuredClone(i))),o=i;for(let e of Wc)o=d.all([o,Kc(e)]);if((e.doesContainPoetryLock||e.doesContainUvLock)&&(o=d.all([o,Kc(`**/.venv/**`)])),e.depending.next&&(o=d.all([o,Kc(`**/.next/**`)])),F(o),JSON.stringify(o)===a)return;let s=JSON.stringify(o,void 0,2);await A.run(()=>k.generateFile(n,s))})}function Kc(e){return{"files.watcherExclude":{[e]:!0}}}const qc=[`development`,`test`,`staging`,`production`];async function Jc(n,r){return D.functionIgnoringException(`ensureWbEnvDefinitions`,async()=>{let i=r.some(e=>Yc(e)),a=t.resolve(n.dirPath,`fnox.toml`);if(!await e.promises.lstat(a).catch(()=>{}))return;let o=await k.readFileConfinedIfExists(a);if(o===void 0)return;let s=Xc(o,i);s!==void 0&&s!==o&&await k.generateFile(a,s)})}function Yc(e){return[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`].some(t=>{let n=e.packageJson?.[t];return!!n?.next||!!n?.vinext})}function Xc(e,t){let n;try{n=Bun.TOML.parse(e)}catch{console.warn(`Skipped inserting WB_ENV into fnox.toml because it is not parsable as TOML.`);return}let r=t?[`WB_ENV`,`NEXT_PUBLIC_WB_ENV`]:[`WB_ENV`],i=e;for(let e of qc){if(e===`staging`&&!n.profiles?.staging)continue;let t=e===`development`?n.secrets:n.profiles?.[e]?.secrets;for(let n of r){let r=t?.[n];Zc(n,typeof r==`string`?r:r?.default,e)}let a=r.filter(e=>t?.[e]===void 0).map(t=>`${t} = { default = "${e}" }`);a.length!==0&&(i=Qc(i,e===`development`?`secrets`:`profiles.${e}.secrets`,a))}if(i===e)return e;try{let e=Bun.TOML.parse(i);for(let t of qc){if(t===`staging`&&!n.profiles?.staging)continue;let i=t===`development`?e.secrets:e.profiles?.[t]?.secrets;if(r.some(e=>i?.[e]===void 0))throw Error(`the inserted ${t} entries did not take effect`)}}catch(e){console.warn(`Skipped inserting WB_ENV into fnox.toml because ${e.message}.`);return}return i}function Zc(e,t,n){if(typeof t==`string`&&t!==``&&t!==n&&!t.includes("${")){if(e===`NEXT_PUBLIC_WB_ENV`){console.warn(`${e} in fnox.toml is "${t}" but should be "${n}" for the ${n} mode; wb overrides it with WB_ENV, but a direct framework build would inline this value.`);return}console.warn(`${e} in fnox.toml is "${t}" but should be "${n}" for the ${n} mode; wb rejects values outside development/test/staging/production.`)}}function Qc(e,t,n){let r=new RegExp(String.raw`^\s*\[${t.replaceAll(`.`,String.raw`\.`)}\]\s*(?:#.*)?$`,`u`),i=e.split(`
425
+ `:``}const gc={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:[`test/fixtures`],include:[`*.config.ts`,`scripts/**/*`,`src/**/*`,`test/**/*`]};async function _c(e){return D.functionIgnoringException(`generateTsconfig`,async()=>{if(e.depending.blitz||e.depending.next||e.depending.vinext){await Dc(e);return}let n=e.isRoot?vc(e):structuredClone(gc),r=Uc(e);n.extends=Da(e),n.compilerOptions??={},n.compilerOptions.rootDir=Nc(e),r.length>0&&(n.compilerOptions={...n.compilerOptions,types:r}),!e.doesContainJsxOrTsx&&!e.doesContainJsxOrTsxInPackages&&delete n.compilerOptions?.jsx,e.depending.prisma&&Fc(n,`prisma/**/*`);let i=t.resolve(e.dirPath,`tsconfig.json`),a=await k.readFileIfExists(i),o;if(a!==void 0&&!L.isTriviaOnly(a)){let t=L.parseObjectIgnoringError(a);if(!t){console.warn(`Skipped generating ${i} because the existing content is not parsable as JSONC.`);return}o=JSON.stringify(F(structuredClone(t)));let s=Lc(t.compilerOptions?.types),c=Hc(t.compilerOptions);n.extends=Pc(n.extends,t.extends),delete t.extends,delete t.compilerOptions?.jsx,e.isRoot&&wc(e,t,n),n=d.all([n,t,n],{arrayMerge:It}),n.include=n.include?.filter(e=>!e.includes(`@types`)&&!e.includes(`__tests__/`)&&!e.includes(`tests/`)),n.compilerOptions??={},n.compilerOptions={...n.compilerOptions,...c};let l=[...new Set([...zc(s,r),...r])];l.length>0?n.compilerOptions.types=l:delete n.compilerOptions.types,Rc(r)&&delete n.compilerOptions.typeRoots}if(Oc(n,e),F(n),n.include?.sort(),delete n.compilerOptions?.experimentalDecorators,delete n.compilerOptions?.baseUrl,e.depending.reactNative&&delete n.compilerOptions?.verbatimModuleSyntax,o===JSON.stringify(n))return;let s=JSON.stringify(n,void 0,2);await A.run(()=>k.generateFile(i,s))})}function vc(e){let t=e.doesContainSubPackageJsons?Ht(e):{excludes:[],includes:[]},n=structuredClone(gc);return n.exclude=[...new Set([...t.includes.map(e=>`${e}/test/fixtures`),...t.excludes,...xc(e),...n.exclude??[]])].toSorted(),n.include=[...n.include??[],...t.includes.flatMap(e=>[`${e}/*.config.ts`,`${e}/scripts/**/*`,`${e}/src/**/*`,`${e}/test/**/*`])],n}const yc=[`blitz`,`next`,`vinext`],bc=[`app`,`src/app`];function xc(n){if(!n.doesContainSubPackageJsons)return[];let r=[];for(let i of Bt(n))if(Sc(t.resolve(i,`package.json`)))for(let a of bc){let o=t.resolve(i,a);e.existsSync(o)&&r.push(t.relative(n.dirPath,o).replaceAll(`\\`,`/`))}return r}function Sc(t){let n;try{n=JSON.parse(e.readFileSync(t,`utf8`))}catch{return!1}if(!n||typeof n!=`object`)return!1;let r={...n.dependencies,...n.devDependencies};return yc.some(e=>r[e])}const Cc=[`*.config.ts`,`scripts/**/*`,`src/**/*`,`test/**/*`];function wc(e,n,r){let i=new Set;if(Array.isArray(n.include)){let e=n.include.filter(e=>typeof e==`string`),t=new Set(r.include);for(let n of e){let r=Ec(n);if(r===void 0||i.has(r))continue;let a=Cc.every(t=>e.includes(`${r}/${t}`)),o=Cc.some(e=>t.has(`${r}/${e}`));a&&!o&&i.add(r)}i.size>0&&(n.include=n.include.filter(e=>{let t=typeof e==`string`?Ec(e):void 0;return t===void 0||!i.has(t)}))}if(!Array.isArray(n.exclude))return;let a=new Set(r.exclude),o=e.doesContainSubPackageJsons?Bt(e).map(n=>t.relative(t.resolve(e.dirPath),n).replaceAll(`\\`,`/`)):[];n.exclude=n.exclude.filter(e=>typeof e!=`string`||a.has(e)?!0:e.endsWith(`/test/fixtures`)?!i.has(e.slice(0,-14)):!bc.some(t=>e.endsWith(`/${t}`)&&i.has(e.slice(0,-(t.length+1))))&&!Tc(e,o))}function Tc(e,t){if(e.split(`/`).includes(`**`))return!1;let n=e.split(`/`).map(e=>e.replaceAll(/[.+^${}()|[\]\\]/gu,String.raw`\$&`).replaceAll(`*`,`[^/]*`).replaceAll(`?`,`[^/]`)).join(`/`),r=RegExp(`^${n}(?:/.*)?$`,`u`);return t.some(t=>r.test(t)||e.startsWith(`${t}/`))}function Ec(e){let t=Cc.find(t=>e.endsWith(`/${t}`));if(!t)return;let n=e.slice(0,-(t.length+1));return n===``?void 0:n}async function Dc(e){let n=t.resolve(e.dirPath,`tsconfig.json`),r=await k.readFileIfExists(n);if(r===void 0||L.isTriviaOnly(r))return;let i=L.parseObjectIgnoringError(r);if(!i){console.warn(`Skipped cleaning up ${n} because the existing content is not parsable as JSONC.`);return}let a=JSON.stringify(i);Ac(i),jc(i.compilerOptions),kc(i),Oc(i,e),JSON.stringify(i)!==a&&await A.run(()=>k.generateFile(n,JSON.stringify(i,void 0,2)))}function Oc(e,t){let n=e.compilerOptions?.types;if(n?!n.includes(`bun`):t.depending.reactNative)return;let r=`${Nc(t)}/node_modules/undici-types/index.d.ts`,i=e.compilerOptions?.paths?.[`undici-types`];if(i){i.length===1&&typeof i[0]==`string`&&/(?:^|\/)node_modules\/undici-types\/index\.d\.ts$/u.test(i[0])&&(e.compilerOptions.paths[`undici-types`]=[r]);return}e.compilerOptions??={},e.compilerOptions.paths={...e.compilerOptions.paths,"undici-types":[r]}}function kc(e){e.include&&(e.include.includes(`scripts/**/*`)||(e.include.push(`scripts/**/*`),e.include.sort()))}function Ac(e){let t=e.compilerOptions;if(!t)return;let n=Vc(t.moduleResolution);(n===`node`||n===`node10`||n===void 0)&&(e.extends?delete t.moduleResolution:t.moduleResolution=`bundler`)}function jc(e){if(e&&(delete e.baseUrl,e.paths))for(let[t,n]of Object.entries(e.paths))e.paths[t]=Mc(n)}function Mc(e){return e.map(e=>e.startsWith(`./`)||e.startsWith(`../`)||t.isAbsolute(e)?e:`./${e}`)}function Nc(n){if(n.isRoot)return`.`;let r=t.resolve(n.dirPath),i;for(let n=t.dirname(r);;n=t.dirname(n)){let r=t.resolve(n,`package.json`);if(e.existsSync(r)){i??=n;try{if(le(JSON.parse(e.readFileSync(r,`utf8`)).workspaces).length>0){i=n;break}}catch{}}let a=e.existsSync(t.resolve(n,`.git`)),o=n===t.dirname(n);if(a||o)break}return i&&t.relative(r,i).replaceAll(`\\`,`/`)||`.`}function Pc(e,t){let n=[...Ic(e),...Ic(t)],r=[...new Set(n)];if(r.length!==0)return r.length===1?r[0]:r}function Fc(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}function Ic(e){return e?Array.isArray(e)?e:[e]:[]}function Lc(e){return typeof e==`string`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Rc(e){return e.some(e=>e===`cypress`||e.includes(`/`))}function zc(e,t){let n=new Set(t);return e.filter(e=>!(Bc(e)&&!n.has(e)))}function Bc(e){return e===`cypress`||e===`jest`||e===`mocha`||e===`vitest/globals`}function Vc(e){return typeof e==`string`?e.toLowerCase():void 0}function Hc(e){let t={};for(let n of[`declaration`,`declarationMap`,`sourceMap`]){let r=e?.[n];r!==void 0&&(t[n]=r)}return t}function Uc(e){let t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};return e.depending.reactNative||t.add(`bun`),(n.jest||n[`@jest/globals`]||n[`jest-environment-jsdom`]||n[`ts-jest`])&&t.add(`jest`),n.vitest&&t.add(`vitest/globals`),n.mocha&&t.add(`mocha`),n.cypress&&t.add(`cypress`),[...t]}const Wc=[`.codex/AGENTS.md`,`.claude/CLAUDE.md`,`.gemini/GEMINI.md`];async function Gc(){let e=!0;for(let n of Wc){let r=await k.generateFile(t.join(p.homedir(),n),'- Repos live under `~/ghq/github.com`; always clone with `ghq get -p`, never `git clone`.\n- LLM/AI agent responses may take 1–2 hours; wait patiently, don\'t assume failure.\n- No AI attribution (e.g., `Co-Authored-By` trailers, "Generated with ..." footers) in commits, issues, or PRs unless explicitly requested. This hides nothing: if asked which AI agent did the work, answer truthfully.\n');e&&=r}return e}const Kc=[`**/.git/objects/**`,`**/.git/subtree-cache/**`,`**/node_modules/**`,`**/tmp/**`,`**/temp/**`,`**/dist/**`];async function qc(e){return D.functionIgnoringException(`generateVscodeSettings`,async()=>{let n=t.resolve(e.dirPath,`.vscode`,`settings.json`),r=await k.readFileIfExists(n);if(r===void 0||L.isTriviaOnly(r))return;let i=L.parseObjectIgnoringError(r);if(!i){console.warn(`Skipped updating ${n} because the existing content is not parsable as JSONC.`);return}let a=JSON.stringify(F(structuredClone(i))),o=i;for(let e of Kc)o=d.all([o,Jc(e)]);if((e.doesContainPoetryLock||e.doesContainUvLock)&&(o=d.all([o,Jc(`**/.venv/**`)])),e.depending.next&&(o=d.all([o,Jc(`**/.next/**`)])),F(o),JSON.stringify(o)===a)return;let s=JSON.stringify(o,void 0,2);await A.run(()=>k.generateFile(n,s))})}function Jc(e){return{"files.watcherExclude":{[e]:!0}}}const Yc=[`development`,`test`,`staging`,`production`];async function Xc(n,r){return D.functionIgnoringException(`ensureWbEnvDefinitions`,async()=>{let i=r.some(e=>Zc(e)),a=t.resolve(n.dirPath,`fnox.toml`);if(!await e.promises.lstat(a).catch(()=>{}))return;let o=await k.readFileConfinedIfExists(a);if(o===void 0)return;let s=Qc(o,i);s!==void 0&&s!==o&&await k.generateFile(a,s)})}function Zc(e){return[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`].some(t=>{let n=e.packageJson?.[t];return!!n?.next||!!n?.vinext})}function Qc(e,t){let n;try{n=Bun.TOML.parse(e)}catch{console.warn(`Skipped inserting WB_ENV into fnox.toml because it is not parsable as TOML.`);return}let r=t?[`WB_ENV`,`NEXT_PUBLIC_WB_ENV`]:[`WB_ENV`],i=e;for(let e of Yc){if(e===`staging`&&!n.profiles?.staging)continue;let t=e===`development`?n.secrets:n.profiles?.[e]?.secrets;for(let n of r){let r=t?.[n];$c(n,typeof r==`string`?r:r?.default,e)}let a=r.filter(e=>t?.[e]===void 0).map(t=>`${t} = { default = "${e}" }`);a.length!==0&&(i=el(i,e===`development`?`secrets`:`profiles.${e}.secrets`,a))}if(i===e)return e;try{let e=Bun.TOML.parse(i);for(let t of Yc){if(t===`staging`&&!n.profiles?.staging)continue;let i=t===`development`?e.secrets:e.profiles?.[t]?.secrets;if(r.some(e=>i?.[e]===void 0))throw Error(`the inserted ${t} entries did not take effect`)}}catch(e){console.warn(`Skipped inserting WB_ENV into fnox.toml because ${e.message}.`);return}return i}function $c(e,t,n){if(typeof t==`string`&&t!==``&&t!==n&&!t.includes("${")){if(e===`NEXT_PUBLIC_WB_ENV`){console.warn(`${e} in fnox.toml is "${t}" but should be "${n}" for the ${n} mode; wb overrides it with WB_ENV, but a direct framework build would inline this value.`);return}console.warn(`${e} in fnox.toml is "${t}" but should be "${n}" for the ${n} mode; wb rejects values outside development/test/staging/production.`)}}function el(e,t,n){let r=new RegExp(String.raw`^\s*\[${t.replaceAll(`.`,String.raw`\.`)}\]\s*(?:#.*)?$`,`u`),i=e.split(`
426
426
  `),a=i.findIndex(e=>r.test(e));return a===-1?`${e.trimEnd()}\n\n[${t}]\n${n.join(`
427
427
  `)}\n`:[...i.slice(0,a+1),...n,...i.slice(a+1)].join(`
428
- `)}const $c=`actions/checkout@v7.0.1`,el=`jdx/mise-action@v4.2.3`,tl={HAS_TAKUMI_GUARD_TOKEN:"${{ !!secrets.TAKUMI_GUARD_TOKEN }}",TAKUMI_GUARD_TOKEN:``};async function nl(n,r=[n]){return D.functionIgnoringException(`generateSelfContainedWorkflows`,async()=>{let i=t.resolve(n.dirPath,`.github`,`workflows`);if(!await k.isConfinedWritablePath(i)){console.warn(`Skipped generating workflows because ${i} resolves outside the repository.`);return}await e.promises.mkdir(i,{recursive:!0});let a=e.existsSync(t.resolve(n.dirPath,`fnox.toml`)),o={"test.yml":ol(n,r,a),"semantic-pr.yml":ul()},s=n.packageJson?.scripts??{},c=al(s.deploy);c&&(o[`deploy-production.yml`]=sl(`production`,`deploy`,a)),al(s[`deploy:staging`])&&(o[`deploy-staging.yml`]=sl(`staging`,`deploy:staging`,a)),n.depending.semanticRelease&&n.release.branches.length>0&&(o[`release.yml`]=cl(n,c,a));for(let[e,n]of Object.entries(o))await A.run(()=>rl(t.join(i,e),n))})}async function rl(e,t){let n=await k.readFileIfExists(e);if(n!==void 0&&n.trim()!==``&&!n.startsWith(`# Generated by wbfy.`))return;let r=f.dump(t,{lineWidth:-1});await k.writeFileConfined(e,`# Generated by wbfy. Remove this line to stop wbfy from overwriting this file.
429
- `+r)}function il(e){return e?{"working-directory":e}:{}}function al(e){return typeof e==`string`&&/\bwb deploy\b/u.test(e)}function ol(e,n,r){let i=[...n].toSorted((e,t)=>e.dirPath.localeCompare(t.dirPath)).filter(e=>e.depending.playwrightTest).map(n=>t.relative(e.dirPath,n.dirPath)),a=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,o=r?{env:{FNOX_AGE_KEY:"${{ secrets.FNOX_AGE_KEY }}"}}:{},s=[{uses:$c},{uses:el},...ll(!0),...i.length>0?[...i.map((e,t)=>({name:`Get Playwright version${e?` (${e})`:``}`,id:`playwright-version-${t}`,run:`echo "version=$(bun -e "try { console.log(require('@playwright/test/package.json').version) } catch {}")" >> "$GITHUB_OUTPUT"`,...il(e)})),{name:`Cache Playwright browsers`,id:`playwright-cache`,uses:`actions/cache@v6.1.0`,with:{path:`~/.cache/ms-playwright`,key:`playwright-\${{ runner.os }}-${i.map((e,t)=>`\${{ steps.playwright-version-${t}.outputs.version }}`).join(`-`)}`}},...i.map(e=>({if:`steps.playwright-cache.outputs.cache-hit != 'true'`,run:`bun playwright install --with-deps`,...il(e)})),...i.map(e=>({if:`steps.playwright-cache.outputs.cache-hit == 'true'`,run:`bun playwright install-deps`,...il(e)}))]:[],...a?[{run:`bun run typecheck`,...o}]:[],{run:`bun run lint`,...o},{run:`bun run test/ci`,...o},...i.length>0?[{name:`Upload test results`,if:"${{ always() }}",uses:`actions/upload-artifact@v7.0.1`,with:{name:`test-results`,path:i.map(e=>e?t.posix.join(e,`test-results`):`test-results`).join(`
430
- `),"if-no-files-found":`ignore`,"retention-days":14}}]:[]];return{name:`Test`,on:{pull_request:null,push:{branches:[`main`]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:`read`},jobs:{test:{"runs-on":`ubuntu-latest`,env:{FORCE_COLOR:`3`,WB_ENV:`test`,...tl},steps:s}}}}function sl(e,t,n){return{name:`Deploy app on ${e}`,on:{workflow_dispatch:null,...e===`production`?{release:{types:[`published`]}}:{push:{branches:[`main`],"paths-ignore":[`**.md`,`**/docs/**`]}}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{contents:`read`},jobs:{deploy:{"runs-on":`ubuntu-latest`,env:{WB_ENV:e,...tl},steps:[{uses:$c,with:{"fetch-depth":0}},{uses:el},{name:`Set WB_VERSION`,run:`set -euo pipefail
428
+ `)}const tl=`actions/checkout@v7.0.1`,nl=`jdx/mise-action@v4.2.3`,rl={HAS_TAKUMI_GUARD_TOKEN:"${{ !!secrets.TAKUMI_GUARD_TOKEN }}",TAKUMI_GUARD_TOKEN:``};async function il(n,r=[n]){return D.functionIgnoringException(`generateSelfContainedWorkflows`,async()=>{let i=t.resolve(n.dirPath,`.github`,`workflows`);if(!await k.isConfinedWritablePath(i)){console.warn(`Skipped generating workflows because ${i} resolves outside the repository.`);return}await e.promises.mkdir(i,{recursive:!0});let a=e.existsSync(t.resolve(n.dirPath,`fnox.toml`)),o={"test.yml":cl(n,r,a),"semantic-pr.yml":fl()},s=n.packageJson?.scripts??{},c=sl(s.deploy);c&&(o[`deploy-production.yml`]=ll(`production`,`deploy`,a)),sl(s[`deploy:staging`])&&(o[`deploy-staging.yml`]=ll(`staging`,`deploy:staging`,a)),n.depending.semanticRelease&&n.release.branches.length>0&&(o[`release.yml`]=ul(n,c,a));for(let[e,n]of Object.entries(o))await A.run(()=>al(t.join(i,e),n))})}async function al(e,t){let n=await k.readFileIfExists(e);if(n!==void 0&&n.trim()!==``&&!n.startsWith(`# Generated by wbfy.`))return;let r=f.dump(t,{lineWidth:-1});await k.writeFileConfined(e,`# Generated by wbfy. Remove this line to stop wbfy from overwriting this file.
429
+ `+r)}function ol(e){return e?{"working-directory":e}:{}}function sl(e){return typeof e==`string`&&/\bwb deploy\b/u.test(e)}function cl(e,n,r){let i=[...n].toSorted((e,t)=>e.dirPath.localeCompare(t.dirPath)).filter(e=>e.depending.playwrightTest).map(n=>t.relative(e.dirPath,n.dirPath)),a=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,o=r?{env:{FNOX_AGE_KEY:"${{ secrets.FNOX_AGE_KEY }}"}}:{},s=[{uses:tl},{uses:nl},...dl(!0),...i.length>0?[...i.map((e,t)=>({name:`Get Playwright version${e?` (${e})`:``}`,id:`playwright-version-${t}`,run:`echo "version=$(bun -e "try { console.log(require('@playwright/test/package.json').version) } catch {}")" >> "$GITHUB_OUTPUT"`,...ol(e)})),{name:`Cache Playwright browsers`,id:`playwright-cache`,uses:`actions/cache@v6.1.0`,with:{path:`~/.cache/ms-playwright`,key:`playwright-\${{ runner.os }}-${i.map((e,t)=>`\${{ steps.playwright-version-${t}.outputs.version }}`).join(`-`)}`}},...i.map(e=>({if:`steps.playwright-cache.outputs.cache-hit != 'true'`,run:`bun playwright install --with-deps`,...ol(e)})),...i.map(e=>({if:`steps.playwright-cache.outputs.cache-hit == 'true'`,run:`bun playwright install-deps`,...ol(e)}))]:[],...a?[{run:`bun run typecheck`,...o}]:[],{run:`bun run lint`,...o},{run:`bun run test/ci`,...o},...i.length>0?[{name:`Upload test results`,if:"${{ always() }}",uses:`actions/upload-artifact@v7.0.1`,with:{name:`test-results`,path:i.map(e=>e?t.posix.join(e,`test-results`):`test-results`).join(`
430
+ `),"if-no-files-found":`ignore`,"retention-days":14}}]:[]];return{name:`Test`,on:{pull_request:null,push:{branches:[`main`]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:`read`},jobs:{test:{"runs-on":`ubuntu-latest`,env:{FORCE_COLOR:`3`,WB_ENV:`test`,...rl},steps:s}}}}function ll(e,t,n){return{name:`Deploy app on ${e}`,on:{workflow_dispatch:null,...e===`production`?{release:{types:[`published`]}}:{push:{branches:[`main`],"paths-ignore":[`**.md`,`**/docs/**`]}}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{contents:`read`},jobs:{deploy:{"runs-on":`ubuntu-latest`,env:{WB_ENV:e,...rl},steps:[{uses:tl,with:{"fetch-depth":0}},{uses:nl},{name:`Set WB_VERSION`,run:`set -euo pipefail
431
431
  WB_VERSION=$(git describe --always --tags)
432
- echo "WB_VERSION=$WB_VERSION" >> "$GITHUB_ENV"`},...ll(!1),{name:`Deploy`,uses:`nick-fields/retry@dd56f1ca8ca991e2385c18ab6dd36ea7f9fdb55f`,with:{timeout_minutes:60,max_attempts:5,command:`bun run ${t}`},...n?{env:{FNOX_AGE_KEY:"${{ secrets.FNOX_AGE_KEY }}"}}:{}}]}}}}function cl(e,t,n){let r=n?{FNOX_AGE_KEY:"${{ secrets.FNOX_AGE_KEY }}"}:{};return{name:`Release`,on:{push:{branches:[...e.release.branches]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{contents:`write`,...t?{actions:`write`}:{}},jobs:{release:{"runs-on":`ubuntu-latest`,env:{WB_ENV:`production`,...tl},steps:[{uses:$c,with:{"fetch-depth":0}},{uses:el},...ll(!1),...t?[{name:`Get current latest tag`,id:`pre-release-tag`,run:`set -euo pipefail
432
+ echo "WB_VERSION=$WB_VERSION" >> "$GITHUB_ENV"`},...dl(!1),{name:`Deploy`,uses:`nick-fields/retry@dd56f1ca8ca991e2385c18ab6dd36ea7f9fdb55f`,with:{timeout_minutes:60,max_attempts:5,command:`bun run ${t}`},...n?{env:{FNOX_AGE_KEY:"${{ secrets.FNOX_AGE_KEY }}"}}:{}}]}}}}function ul(e,t,n){let r=n?{FNOX_AGE_KEY:"${{ secrets.FNOX_AGE_KEY }}"}:{};return{name:`Release`,on:{push:{branches:[...e.release.branches]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{contents:`write`,...t?{actions:`write`}:{}},jobs:{release:{"runs-on":`ubuntu-latest`,env:{WB_ENV:`production`,...rl},steps:[{uses:tl,with:{"fetch-depth":0}},{uses:nl},...dl(!1),...t?[{name:`Get current latest tag`,id:`pre-release-tag`,run:`set -euo pipefail
433
433
  echo "tag=$(git describe --tags --abbrev=0 2>/dev/null || echo '')" >> "$GITHUB_OUTPUT"`}]:[],{name:`Release`,run:`bun semantic-release`,env:{GITHUB_TOKEN:"${{ secrets.GITHUB_TOKEN }}",LEFTHOOK:`0`,...r}},...t?[{name:`Check for new release tag`,id:`post-release-tag`,run:`set -euo pipefail
434
434
  git fetch --tags --force
435
435
  NEW_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo '')
436
436
  echo "tag=$NEW_TAG" >> "$GITHUB_OUTPUT"
437
437
  if [[ -n "$NEW_TAG" && "$NEW_TAG" != "\${{ steps.pre-release-tag.outputs.tag }}" ]]; then
438
438
  echo "created=true" >> "$GITHUB_OUTPUT"
439
- fi`},{if:`steps.post-release-tag.outputs.created == 'true'`,name:`Trigger production deploy`,run:'gh workflow run deploy-production.yml --ref "${{ steps.post-release-tag.outputs.tag }}"',env:{GH_TOKEN:"${{ secrets.GITHUB_TOKEN }}"}}]:[]]}}}}function ll(e){return[{if:"${{ env.HAS_TAKUMI_GUARD_TOKEN == 'true' }}",name:`Generate .npmrc for Takumi Guard`,run:`set -euo pipefail
439
+ fi`},{if:`steps.post-release-tag.outputs.created == 'true'`,name:`Trigger production deploy`,run:'gh workflow run deploy-production.yml --ref "${{ steps.post-release-tag.outputs.tag }}"',env:{GH_TOKEN:"${{ secrets.GITHUB_TOKEN }}"}}]:[]]}}}}function dl(e){return[{if:"${{ env.HAS_TAKUMI_GUARD_TOKEN == 'true' }}",name:`Generate .npmrc for Takumi Guard`,run:`set -euo pipefail
440
440
  NPMRC="$(mktemp "$RUNNER_TEMP/npmrc.XXXXXX")"
441
441
  if [[ -e .npmrc ]]; then
442
442
  grep -vE '^registry=|^//npm\\.flatt\\.tech/:_authToken' .npmrc > "$NPMRC" || true
@@ -464,7 +464,7 @@ if git ls-files --error-unmatch -- .npmrc > /dev/null 2>&1; then
464
464
  git checkout -- .npmrc
465
465
  else
466
466
  rm -f .npmrc
467
- fi`}]}function ul(){return{name:`Lint PR title`,on:{pull_request_target:{types:[`opened`,`edited`,`synchronize`]}},jobs:{"semantic-pr":{"runs-on":`ubuntu-latest`,permissions:{"pull-requests":`read`,statuses:`write`},steps:[{uses:`amannn/action-semantic-pull-request@45b9ed7cf24087a2f7785bf55be97394ba87e1c2`,with:{wip:!0},env:{GITHUB_TOKEN:"${{ secrets.GITHUB_TOKEN }}"}}]}}}}const dl=`1.4.0`;async function fl(n){return D.functionIgnoringException(`generateMiseToml`,async()=>{let r=t.resolve(n.dirPath,`mise.toml`),i=gl(r),a={...i.tools};a.node=hl(`node`,ml(`node@lts`,a.node,n.dirPath),n.dirPath),e.existsSync(t.resolve(n.dirPath,`fnox.toml`))&&(a.fnox=hl(`fnox`,ml(`fnox`,a.fnox,n.dirPath),n.dirPath)),i.tools=a,await k.generateFile(r,Bun.TOML.stringify(i))})}function pl(e){let n;try{n=gl(t.resolve(e,`mise.toml`)).tools?.bun}catch{return!0}return n===void 0||typeof n==`string`&&!!x.valid(n)&&x.gte(n,`1.4.0`)}function ml(e,t,n){if(typeof t!=`string`||!x.valid(t))return t;let r=R(`mise`,[`latest`,e],n);return x.valid(r)&&x.major(r)===x.major(t)&&x.lt(t,r)?r:t}function hl(e,t,n){if(t!==void 0&&(typeof t!=`string`||x.valid(t)))return t;let r=typeof t==`string`?t.replace(/^prefix:/u,``).replace(/\/\*$/u,``):void 0,i=R(`mise`,[`latest`,r&&r!==`latest`?`${e}@${r}`:e===`node`?`node@lts`:e],n);return x.valid(i)?i:t??`latest`}function gl(t){let n;try{n=e.readFileSync(t,`utf8`)}catch(e){if(e.code===`ENOENT`)return{};throw e}return Bun.TOML.parse(n)}async function _l(e){let n=e[0]?.repoAuthor;if(n!==`WillBooster`&&n!==`WillBoosterLab`)return;let r=new Set(e.map(e=>t.resolve(e.dirPath,`.npmrc`))),i=e.find(e=>e.isRoot);if(i&&Yt(i)){let e=t.resolve(i.dirPath,`.npmrc`);await k.generateFile(e,`@willbooster-private:registry=https://verdaccio-production-e389.up.railway.app/`),r.delete(e)}for(let e of r)await vl(e)}async function vl(t){await e.promises.lstat(t).catch(()=>{})&&await k.removeConfined(t)&&console.info(`Removed non-canonical repository npmrc ${t}.`)}async function yl(e){return D.functionIgnoringException(`setupLabels`,async()=>{let{repoAuthor:t,repoName:n}=e;if(!t||!n||t!==`WillBooster`&&t!==`WillBoosterLab`||!wn(t))return;let r=Cn(t);try{await Q(r,t,n,`d1: x-easy :hedgehog:`,`EDE9FE`),await Q(r,t,n,`d2: easy :rabbit2:`,`DDD6FE`),await Q(r,t,n,`d3: medium :ox:`,`C4B5FD`),await Q(r,t,n,`d4: hard :squid:`,`A78BFA`),await Q(r,t,n,`d5: x-hard :whale2:`,`8B5CF6`),await Q(r,t,n,`p1: critical :fire::fire::fire:`,`EF4444`),await Q(r,t,n,`p2: urgent :fire::fire:`,`F87171`),await Q(r,t,n,`p3: important :fire:`,`FCA5A5`),await Q(r,t,n,`p4: nice to have :droplet:`,`FECACA`),await Q(r,t,n,`r: blitz`,`5300bc`),await Q(r,t,n,`r: firebase`,`ffca28`),await Q(r,t,n,`r: prisma`,`0c344b`),await Q(r,t,n,`r: react`,`61dafb`),await Q(r,t,n,`r: semantic-release`,`494949`),await Q(r,t,n,`ready :rocket:`,`22C55E`),await Q(r,t,n,`review requested :mag:`,`FBCA04`),await Q(r,t,n,`released :bookmark:`,`6366F1`),await Q(r,t,n,`s: 0.5h :clock1230:`,`F3F4F6`),await Q(r,t,n,`s: 1h :clock1:`,`E5E7EB`),await Q(r,t,n,`s: 2h :clock2:`,`D1D5DB`),await Q(r,t,n,`s: 3h :clock3:`,`9CA3AF`),await Q(r,t,n,`s: 5h :clock5:`,`6B7280`),await Q(r,t,n,`s: 8h :clock8:`,`4B5563`),await Q(r,t,n,`s: 13h :clock1:`,`374151`),await Q(r,t,n,`t: build :hammer:`,`BFDBFE`),await Q(r,t,n,`t: chore :broom:`,`BFDBFE`),await Q(r,t,n,`t: ci :construction_worker:`,`BFDBFE`),await Q(r,t,n,`t: docs :memo:`,`BFDBFE`),await Q(r,t,n,`t: feat :sparkles:`,`BFDBFE`),await Q(r,t,n,`t: fix :bug:`,`BFDBFE`),await Q(r,t,n,`t: perf :zap:`,`BFDBFE`),await Q(r,t,n,`t: refactor :recycle:`,`BFDBFE`),await Q(r,t,n,`t: style :lipstick:`,`BFDBFE`),await Q(r,t,n,`t: test :test_tube:`,`BFDBFE`),await Q(r,t,n,`project`,`24292F`),await Q(r,t,n,`focused :dart:`,`22C55E`),await $(r,t,n,`bug`),await $(r,t,n,`documentation`),await $(r,t,n,`duplicate`),await $(r,t,n,`enhancement`),await $(r,t,n,`good first issue`),await $(r,t,n,`help wanted`),await $(r,t,n,`invalid`),await $(r,t,n,`question`),await $(r,t,n,`wontfix`)}catch(e){console.warn(`Skip setupLabels due to:`,e?.stack??e)}})}async function Q(e,t,n,r,i){try{await e.request(`POST /repos/{owner}/{repo}/labels`,{owner:t,repo:n,name:r,color:i})}catch{await e.request(`PATCH /repos/{owner}/{repo}/labels/{name}`,{owner:t,repo:n,name:r,color:i})}}async function $(e,t,n,r){try{await e.request(`DELETE /repos/{owner}/{repo}/labels/{name}`,{owner:t,repo:n,name:r})}catch{}}const bl={"X-GitHub-Api-Version":`2022-11-28`},xl=15368,Sl={name:`Protect main`,target:`branch`,enforcement:`active`,conditions:{ref_name:{exclude:[],include:[`~DEFAULT_BRANCH`]}},rules:[{type:`deletion`},{type:`required_status_checks`,parameters:{strict_required_status_checks_policy:!1,do_not_enforce_on_create:!0,required_status_checks:[{context:`test / test`,integration_id:xl},{context:`semantic-pr / semantic-pr`,integration_id:xl}]}},{type:`non_fast_forward`},{type:`pull_request`,parameters:{required_approving_review_count:0,dismiss_stale_reviews_on_push:!1,required_reviewers:[],require_code_owner_review:!1,require_last_push_approval:!1,required_review_thread_resolution:!1,allowed_merge_methods:[`squash`]}}],bypass_actors:[{actor_id:17777495,actor_type:`Team`,bypass_mode:`pull_request`}]};async function Cl(e){return D.functionIgnoringException(`setupRepositoryRulesets`,async()=>{let{repoAuthor:t,repoName:n}=e;if(!t||!n||t!==`WillBooster`||en(e.repository)||!wn(t))return;let r=Cn(t);try{await Tl(r,t,n,wl(e))}catch(e){if(!xn(e))throw e;console.warn(`Skip setupRepositoryRulesets due to:`,e?.stack??e)}})}function wl(e){let t=structuredClone(Sl);if(e.cargoTomlDirPaths.length>0)for(let e of t.rules)e.type===`required_status_checks`&&e.parameters.required_status_checks.push({context:`test-rust / test-rust`,integration_id:xl});return t}async function Tl(e,t,n,r){let i=(await El(e,t,n,r.name))?.id;await se(async()=>{if(i){await e.request(`PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}`,{owner:t,repo:n,ruleset_id:i,...r,headers:bl});return}await e.request(`POST /repos/{owner}/{repo}/rulesets`,{owner:t,repo:n,...r,headers:bl})},{shouldRetry:e=>!xn(e)})}async function El(e,t,n,r){let i=(await se(()=>e.request(`GET /repos/{owner}/{repo}/rulesets`,{owner:t,repo:n,includes_parents:!1,targets:`branch`,headers:bl}),{shouldRetry:e=>!xn(e)})).data;if(Array.isArray(i))return i.find(e=>e.name===r&&e.source_type===`Repository`)}async function Dl(e){return D.functionIgnoringException(`setupGitHubSettings`,async()=>{let{repoAuthor:t,repoName:n}=e;if(!t||!n||t!==`WillBooster`&&t!==`WillBoosterLab`||!wn(t))return;let r=Cn(t);try{await se(()=>r.request(`PATCH /repos/{owner}/{repo}`,{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:`PR_TITLE`,squash_merge_commit_message:`BLANK`,headers:{"X-GitHub-Api-Version":`2022-11-28`},...e.repository?.startsWith(`github:WillBooster/`)?{allow_auto_merge:!0}:{}}),{shouldRetry:e=>!xn(e)})}catch(e){if(!xn(e))throw e;console.warn(`Skip setupGitHubSettings due to:`,e?.stack??e)}})}const Ol=`__PM_RUN__`,kl={"pull_request_template.md":`
467
+ fi`}]}function fl(){return{name:`Lint PR title`,on:{pull_request_target:{types:[`opened`,`edited`,`synchronize`]}},jobs:{"semantic-pr":{"runs-on":`ubuntu-latest`,permissions:{"pull-requests":`read`,statuses:`write`},steps:[{uses:`amannn/action-semantic-pull-request@45b9ed7cf24087a2f7785bf55be97394ba87e1c2`,with:{wip:!0},env:{GITHUB_TOKEN:"${{ secrets.GITHUB_TOKEN }}"}}]}}}}const pl=`1.4.0`;async function ml(n){return D.functionIgnoringException(`generateMiseToml`,async()=>{let r=t.resolve(n.dirPath,`mise.toml`),i=vl(r),a={...i.tools};a.node=_l(`node`,gl(`node@lts`,a.node,n.dirPath),n.dirPath),e.existsSync(t.resolve(n.dirPath,`fnox.toml`))&&(a.fnox=_l(`fnox`,gl(`fnox`,a.fnox,n.dirPath),n.dirPath)),i.tools=a,await k.generateFile(r,Bun.TOML.stringify(i))})}function hl(e){let n;try{n=vl(t.resolve(e,`mise.toml`)).tools?.bun}catch{return!0}return n===void 0||typeof n==`string`&&!!x.valid(n)&&x.gte(n,`1.4.0`)}function gl(e,t,n){if(typeof t!=`string`||!x.valid(t))return t;let r=R(`mise`,[`latest`,e],n);return x.valid(r)&&x.major(r)===x.major(t)&&x.lt(t,r)?r:t}function _l(e,t,n){if(t!==void 0&&(typeof t!=`string`||x.valid(t)))return t;let r=typeof t==`string`?t.replace(/^prefix:/u,``).replace(/\/\*$/u,``):void 0,i=R(`mise`,[`latest`,r&&r!==`latest`?`${e}@${r}`:e===`node`?`node@lts`:e],n);return x.valid(i)?i:t??`latest`}function vl(t){let n;try{n=e.readFileSync(t,`utf8`)}catch(e){if(e.code===`ENOENT`)return{};throw e}return Bun.TOML.parse(n)}async function yl(e){let n=e[0]?.repoAuthor;if(n!==`WillBooster`&&n!==`WillBoosterLab`)return;let r=new Set(e.map(e=>t.resolve(e.dirPath,`.npmrc`))),i=e.find(e=>e.isRoot);if(i&&Yt(i)){let e=t.resolve(i.dirPath,`.npmrc`);await k.generateFile(e,`@willbooster-private:registry=https://verdaccio-production-e389.up.railway.app/`),r.delete(e)}for(let e of r)await bl(e)}async function bl(t){await e.promises.lstat(t).catch(()=>{})&&await k.removeConfined(t)&&console.info(`Removed non-canonical repository npmrc ${t}.`)}async function xl(e){return D.functionIgnoringException(`setupLabels`,async()=>{let{repoAuthor:t,repoName:n}=e;if(!t||!n||t!==`WillBooster`&&t!==`WillBoosterLab`||!wn(t))return;let r=Cn(t);try{await Q(r,t,n,`d1: x-easy :hedgehog:`,`EDE9FE`),await Q(r,t,n,`d2: easy :rabbit2:`,`DDD6FE`),await Q(r,t,n,`d3: medium :ox:`,`C4B5FD`),await Q(r,t,n,`d4: hard :squid:`,`A78BFA`),await Q(r,t,n,`d5: x-hard :whale2:`,`8B5CF6`),await Q(r,t,n,`p1: critical :fire::fire::fire:`,`EF4444`),await Q(r,t,n,`p2: urgent :fire::fire:`,`F87171`),await Q(r,t,n,`p3: important :fire:`,`FCA5A5`),await Q(r,t,n,`p4: nice to have :droplet:`,`FECACA`),await Q(r,t,n,`r: blitz`,`5300bc`),await Q(r,t,n,`r: firebase`,`ffca28`),await Q(r,t,n,`r: prisma`,`0c344b`),await Q(r,t,n,`r: react`,`61dafb`),await Q(r,t,n,`r: semantic-release`,`494949`),await Q(r,t,n,`ready :rocket:`,`22C55E`),await Q(r,t,n,`review requested :mag:`,`FBCA04`),await Q(r,t,n,`released :bookmark:`,`6366F1`),await Q(r,t,n,`s: 0.5h :clock1230:`,`F3F4F6`),await Q(r,t,n,`s: 1h :clock1:`,`E5E7EB`),await Q(r,t,n,`s: 2h :clock2:`,`D1D5DB`),await Q(r,t,n,`s: 3h :clock3:`,`9CA3AF`),await Q(r,t,n,`s: 5h :clock5:`,`6B7280`),await Q(r,t,n,`s: 8h :clock8:`,`4B5563`),await Q(r,t,n,`s: 13h :clock1:`,`374151`),await Q(r,t,n,`t: build :hammer:`,`BFDBFE`),await Q(r,t,n,`t: chore :broom:`,`BFDBFE`),await Q(r,t,n,`t: ci :construction_worker:`,`BFDBFE`),await Q(r,t,n,`t: docs :memo:`,`BFDBFE`),await Q(r,t,n,`t: feat :sparkles:`,`BFDBFE`),await Q(r,t,n,`t: fix :bug:`,`BFDBFE`),await Q(r,t,n,`t: perf :zap:`,`BFDBFE`),await Q(r,t,n,`t: refactor :recycle:`,`BFDBFE`),await Q(r,t,n,`t: style :lipstick:`,`BFDBFE`),await Q(r,t,n,`t: test :test_tube:`,`BFDBFE`),await Q(r,t,n,`project`,`24292F`),await Q(r,t,n,`focused :dart:`,`22C55E`),await $(r,t,n,`bug`),await $(r,t,n,`documentation`),await $(r,t,n,`duplicate`),await $(r,t,n,`enhancement`),await $(r,t,n,`good first issue`),await $(r,t,n,`help wanted`),await $(r,t,n,`invalid`),await $(r,t,n,`question`),await $(r,t,n,`wontfix`)}catch(e){console.warn(`Skip setupLabels due to:`,e?.stack??e)}})}async function Q(e,t,n,r,i){try{await e.request(`POST /repos/{owner}/{repo}/labels`,{owner:t,repo:n,name:r,color:i})}catch{await e.request(`PATCH /repos/{owner}/{repo}/labels/{name}`,{owner:t,repo:n,name:r,color:i})}}async function $(e,t,n,r){try{await e.request(`DELETE /repos/{owner}/{repo}/labels/{name}`,{owner:t,repo:n,name:r})}catch{}}const Sl={"X-GitHub-Api-Version":`2022-11-28`},Cl=15368,wl={name:`Protect main`,target:`branch`,enforcement:`active`,conditions:{ref_name:{exclude:[],include:[`~DEFAULT_BRANCH`]}},rules:[{type:`deletion`},{type:`required_status_checks`,parameters:{strict_required_status_checks_policy:!1,do_not_enforce_on_create:!0,required_status_checks:[{context:`test / test`,integration_id:Cl},{context:`semantic-pr / semantic-pr`,integration_id:Cl}]}},{type:`non_fast_forward`},{type:`pull_request`,parameters:{required_approving_review_count:0,dismiss_stale_reviews_on_push:!1,required_reviewers:[],require_code_owner_review:!1,require_last_push_approval:!1,required_review_thread_resolution:!1,allowed_merge_methods:[`squash`]}}],bypass_actors:[{actor_id:17777495,actor_type:`Team`,bypass_mode:`pull_request`}]};async function Tl(e){return D.functionIgnoringException(`setupRepositoryRulesets`,async()=>{let{repoAuthor:t,repoName:n}=e;if(!t||!n||t!==`WillBooster`||en(e.repository)||!wn(t))return;let r=Cn(t);try{await Dl(r,t,n,El(e))}catch(e){if(!xn(e))throw e;console.warn(`Skip setupRepositoryRulesets due to:`,e?.stack??e)}})}function El(e){let t=structuredClone(wl);if(e.cargoTomlDirPaths.length>0)for(let e of t.rules)e.type===`required_status_checks`&&e.parameters.required_status_checks.push({context:`test-rust / test-rust`,integration_id:Cl});return t}async function Dl(e,t,n,r){let i=(await Ol(e,t,n,r.name))?.id;await se(async()=>{if(i){await e.request(`PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}`,{owner:t,repo:n,ruleset_id:i,...r,headers:Sl});return}await e.request(`POST /repos/{owner}/{repo}/rulesets`,{owner:t,repo:n,...r,headers:Sl})},{shouldRetry:e=>!xn(e)})}async function Ol(e,t,n,r){let i=(await se(()=>e.request(`GET /repos/{owner}/{repo}/rulesets`,{owner:t,repo:n,includes_parents:!1,targets:`branch`,headers:Sl}),{shouldRetry:e=>!xn(e)})).data;if(Array.isArray(i))return i.find(e=>e.name===r&&e.source_type===`Repository`)}async function kl(e){return D.functionIgnoringException(`setupGitHubSettings`,async()=>{let{repoAuthor:t,repoName:n}=e;if(!t||!n||t!==`WillBooster`&&t!==`WillBoosterLab`||!wn(t))return;let r=Cn(t);try{await se(()=>r.request(`PATCH /repos/{owner}/{repo}`,{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:`PR_TITLE`,squash_merge_commit_message:`BLANK`,headers:{"X-GitHub-Api-Version":`2022-11-28`},...e.repository?.startsWith(`github:WillBooster/`)?{allow_auto_merge:!0}:{}}),{shouldRetry:e=>!xn(e)})}catch(e){if(!xn(e))throw e;console.warn(`Skip setupGitHubSettings due to:`,e?.stack??e)}})}const Al=`__PM_RUN__`,jl={"pull_request_template.md":`
468
468
  Close #<IssueNumber>
469
469
 
470
470
  ## Self Check
@@ -472,8 +472,8 @@ Close #<IssueNumber>
472
472
  - [ ] I've confirmed \`All checks have passed\` on this page.
473
473
  - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).
474
474
  - PR title doesn't have \`WIP:\`.
475
- - The test command (e.g., \`${Ol} test\`) passed.
476
- - The lint command (e.g., \`${Ol} lint\`) passed.
475
+ - The test command (e.g., \`${Al} test\`) passed.
476
+ - The lint command (e.g., \`${Al} lint\`) passed.
477
477
  - You may leave this box unchecked due to long workflows.
478
478
  - [ ] I've reviewed my changes on the GitHub diff view.
479
479
  - [ ] I've written the steps to test my changes.
@@ -506,8 +506,8 @@ Close #<IssueNumber>
506
506
  4. Push \`Submit\` button.
507
507
  5. ...
508
508
  -->
509
- `.trim()};async function Al(n){return D.functionIgnoringException(`generateGitHubTemplates`,async()=>{if(n.isWillBoosterRepo)for(let[r,i]of Object.entries(kl)){let a=jl(i),o=t.resolve(n.dirPath,`.github`,r);if(e.existsSync(o)){let t=await e.promises.readFile(o,`utf8`);if(ie(t,a)>a.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,`.github`),{recursive:!0}),await A.run(()=>k.generateFile(o,a))}})}function jl(e){return e.replaceAll(Ol,`bun run`)}const Ml=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],Nl=String.raw`(?:WillBooster|WillBoosterLab)`,Pl=[RegExp(`^${Nl}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^github:${Nl}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?https://github\\.com/${Nl}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?ssh://git@github\\.com[:/]${Nl}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?git@github\\.com:${Nl}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`)];function Fl(e){let n=e.flatMap(Il);if(n.length===0)return;let r=n.map(({dependencyName:e,dirPath:n,sectionName:r,specifier:i})=>`- ${t.join(n,`package.json`)}: ${r}.${e} uses ${i}`).join(`
510
- `);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function Il(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of Ml){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&Ll(a)&&(zl(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function Ll(e){return Rl(e)||/^(?:bitbucket|gist|github|gitlab):/u.test(e)||/^https?:\/\/(?:bitbucket\.org|github\.com|gitlab\.com)\//u.test(e)||/^(?:https?|ssh):\/\/\S+\.git(?:#\S+)?$/u.test(e)||/^[^@\s]+@[^:\s]+:\S+(?:#\S+)?$/u.test(e)||e.startsWith(`git:`)||e.startsWith(`git+`)||e.startsWith(`ssh://git@`)}function Rl(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function zl(e){return Pl.some(t=>t.test(e))}const Bl=`apply-release-age-gate`;async function Vl(){let e=await o(process.argv.slice(2)).command(Bl,`Apply only the organization's minimum-release-age policy to this machine's global package-manager configs`).command(`$0 [paths..]`,`Make a given project follow the WillBooster standard`,e=>{e.positional(`paths`,{describe:`project paths to be wbfied`,array:!0,type:`string`,default:[`.`]})}).options({force:{description:`Apply wbfy even when the repository already records this wbfy version`,type:`boolean`,default:!1,alias:`f`},skipDeps:{description:"Skip adding managed dependencies and the linker probe (the final `bun install` refreshing the lockfile still runs)",type:`boolean`,default:!1,alias:`d`},verbose:{description:`Whether or not to enable verbose mode`,type:`boolean`,default:!1,alias:`v`}}).version(ai()).strict().argv;if(E.isVerbose=e.verbose,e._[0]===Bl){bi()||(process.exitCode=1);return}let t=!1;try{t=await Hl(e.paths,e.skipDeps,e.force)}finally{await we()}t&&(process.exitCode=1)}async function Hl(n,r,i){bi();let a=Bun.version;if(Bun.semver.order(a,`1.4.0`)<0)return console.error(`wbfy requires Bun >= ${dl} (found ${a}). Upgrade Bun and re-run.`),!0;let o=si(),s=!i&&o&&!o.endsWith(`-dirty-local`)?o:void 0,c=!1;for(let i of n){let n=t.resolve(i);if(k.setRootDirPath(e.existsSync(n)?n:void 0),!pl(n)){console.error(`Skip ${n}: mise.toml must pin Bun to one exact version >= ${dl} or omit it. Update the pin and re-run.`),c=!0;continue}if(s&&await Ks(n)===s){console.info(`Skip ${n}: wbfy ${s} is already applied. Pass --force to re-apply.`);continue}let a=t.join(n,`packages`),o=(await oe(()=>e.promises.readdir(a,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.resolve(a,e.name)),l=Bt({dirPath:n,packageJson:ae(()=>JSON.parse(e.readFileSync(t.resolve(n,`package.json`),`utf8`)))??{},doesContainSubPackageJsons:o.some(n=>e.existsSync(t.resolve(n,`package.json`)))}),u=[...new Set([...o,...l])].filter(e=>e!==t.resolve(n)),d=[...[`.gitattributes`,`bunfig.toml`,`lefthook.yml`,`package.json`,`tsconfig.json`].map(e=>t.resolve(n,e)),...u.flatMap(e=>[`package.json`,`tsconfig.json`].map(n=>t.resolve(e,n)))];if((await Promise.all(d.map(e=>k.isConfinedWritablePath(e)))).includes(!1)){console.error(`Skip ${n}: a managed config file is a symlink or resolves outside the repository.`),c=!0;continue}let f=[n,...u].flatMap(n=>{let r=t.resolve(n,`package.json`);if(!e.existsSync(r))return[];try{let t=qn({packageJson:JSON.parse(e.readFileSync(r,`utf8`))});return t?[`${n}: ${t}`]:[]}catch{return[`${r} is invalid`]}});if(f.length>0){console.error(`Skip ${n}:\n${f.join(`
509
+ `.trim()};async function Ml(n){return D.functionIgnoringException(`generateGitHubTemplates`,async()=>{if(n.isWillBoosterRepo)for(let[r,i]of Object.entries(jl)){let a=Nl(i),o=t.resolve(n.dirPath,`.github`,r);if(e.existsSync(o)){let t=await e.promises.readFile(o,`utf8`);if(ie(t,a)>a.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,`.github`),{recursive:!0}),await A.run(()=>k.generateFile(o,a))}})}function Nl(e){return e.replaceAll(Al,`bun run`)}const Pl=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],Fl=String.raw`(?:WillBooster|WillBoosterLab)`,Il=[RegExp(`^${Fl}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^github:${Fl}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?https://github\\.com/${Fl}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?ssh://git@github\\.com[:/]${Fl}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?git@github\\.com:${Fl}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`)];function Ll(e){let n=e.flatMap(Rl);if(n.length===0)return;let r=n.map(({dependencyName:e,dirPath:n,sectionName:r,specifier:i})=>`- ${t.join(n,`package.json`)}: ${r}.${e} uses ${i}`).join(`
510
+ `);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function Rl(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of Pl){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&zl(a)&&(Vl(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function zl(e){return Bl(e)||/^(?:bitbucket|gist|github|gitlab):/u.test(e)||/^https?:\/\/(?:bitbucket\.org|github\.com|gitlab\.com)\//u.test(e)||/^(?:https?|ssh):\/\/\S+\.git(?:#\S+)?$/u.test(e)||/^[^@\s]+@[^:\s]+:\S+(?:#\S+)?$/u.test(e)||e.startsWith(`git:`)||e.startsWith(`git+`)||e.startsWith(`ssh://git@`)}function Bl(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function Vl(e){return Il.some(t=>t.test(e))}const Hl=`apply-release-age-gate`,Ul=`generate-user-agent-instructions`;async function Wl(){let e=await o(process.argv.slice(2)).command(Hl,`Apply only the organization's minimum-release-age policy to this machine's global package-manager configs`).command(Ul,`Overwrite this user's agent instruction files (~/.codex/AGENTS.md, ~/.claude/CLAUDE.md, ~/.gemini/GEMINI.md) with the organization's fixed content`).command(`$0 [paths..]`,`Make a given project follow the WillBooster standard`,e=>{e.positional(`paths`,{describe:`project paths to be wbfied`,array:!0,type:`string`,default:[`.`]})}).options({force:{description:`Apply wbfy even when the repository already records this wbfy version`,type:`boolean`,default:!1,alias:`f`},skipDeps:{description:"Skip adding managed dependencies and the linker probe (the final `bun install` refreshing the lockfile still runs)",type:`boolean`,default:!1,alias:`d`},verbose:{description:`Whether or not to enable verbose mode`,type:`boolean`,default:!1,alias:`v`}}).version(ai()).strict().argv;if(E.isVerbose=e.verbose,e._[0]===Hl){bi()||(process.exitCode=1);return}if(e._[0]===Ul){await Gc()||(process.exitCode=1);return}let t=!1;try{t=await Gl(e.paths,e.skipDeps,e.force)}finally{await we()}t&&(process.exitCode=1)}async function Gl(n,r,i){bi();let a=Bun.version;if(Bun.semver.order(a,`1.4.0`)<0)return console.error(`wbfy requires Bun >= ${pl} (found ${a}). Upgrade Bun and re-run.`),!0;let o=si(),s=!i&&o&&!o.endsWith(`-dirty-local`)?o:void 0,c=!1;for(let i of n){let n=t.resolve(i);if(k.setRootDirPath(e.existsSync(n)?n:void 0),!hl(n)){console.error(`Skip ${n}: mise.toml must pin Bun to one exact version >= ${pl} or omit it. Update the pin and re-run.`),c=!0;continue}if(s&&await Ks(n)===s){console.info(`Skip ${n}: wbfy ${s} is already applied. Pass --force to re-apply.`);continue}let a=t.join(n,`packages`),o=(await oe(()=>e.promises.readdir(a,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.resolve(a,e.name)),l=Bt({dirPath:n,packageJson:ae(()=>JSON.parse(e.readFileSync(t.resolve(n,`package.json`),`utf8`)))??{},doesContainSubPackageJsons:o.some(n=>e.existsSync(t.resolve(n,`package.json`)))}),u=[...new Set([...o,...l])].filter(e=>e!==t.resolve(n)),d=[...[`.gitattributes`,`bunfig.toml`,`lefthook.yml`,`package.json`,`tsconfig.json`].map(e=>t.resolve(n,e)),...u.flatMap(e=>[`package.json`,`tsconfig.json`].map(n=>t.resolve(e,n)))];if((await Promise.all(d.map(e=>k.isConfinedWritablePath(e)))).includes(!1)){console.error(`Skip ${n}: a managed config file is a symlink or resolves outside the repository.`),c=!0;continue}let f=[n,...u].flatMap(n=>{let r=t.resolve(n,`package.json`);if(!e.existsSync(r))return[];try{let t=qn({packageJson:JSON.parse(e.readFileSync(r,`utf8`))});return t?[`${n}: ${t}`]:[]}catch{return[`${r} is invalid`]}});if(f.length>0){console.error(`Skip ${n}:\n${f.join(`
511
511
  `)}`),c=!0;continue}let p=await Gn(n);if(E.isVerbose,!p){console.error(`there is no valid package.json in ${n}`),c=!0;continue}let m=await Promise.all(u.map(e=>Gn(e,{isRoot:!1}))),h=u.find((n,r)=>!m[r]&&e.existsSync(t.join(n,`package.json`)));if(h){console.error(`Skip ${n}: ${h}/package.json is invalid.`),c=!0;continue}let g=[p,...m.filter(e=>!!e)],_=g.some(e=>e.isCloudflare)?R(`git`,[`-c`,`core.quotePath=false`,`ls-files`,`--`,`.env.cloudflare`,`*/.env.cloudflare`],p.dirPath).split(`
512
- `).filter(Boolean).map(e=>t.resolve(p.dirPath,e)):[];if(_.length>0){console.error(`SECURITY ERROR: Cloudflare credentials must be untracked. Remove ${_.join(`, `)} from Git, purge the token from history, and rotate CLOUDFLARE_API_TOKEN before rerunning wbfy.`),c=!0;continue}let v=gn(p);if(await _l(g),E.isVerbose)for(let e of g)console.info(e);Fl(g);let y=jr(n),ee=Mr(g,y,r);await Pr(p,ee),await fl(p),await ot(p),await Jc(p,g),await A.promiseAll(),!r&&p.doesContainPackageJson&&!Ul(n,p,y,ee)&&console.warn(`bun install currently fails in ${n} under the isolated linker.`);let b=!en(p.repository)&&(p.repository?.startsWith(`github:WillBooster/`)||p.repository?.startsWith(`github:WillBoosterLab/`)),te=!b&&!en(p.repository)&&!!p.repository?.startsWith(`github:`)&&p.isRoot;await Promise.all([v.then(()=>qs(p)),Gr(p),qr(p),Xr(p,g),Qr(p),Al(p),Si(p),Bs(p),pc(p),lc(p),...b?[$t(p)]:[],...te?[nl(p,g)]:[],yl(p),Cl(p),Dl(p),...p.isRoot?[hs(p,g)]:[]]),await A.promiseAll(),await br(p,g),await A.promiseAll();let x=[];for(let e of g)e.depending.playwrightTest&&x.push(Re(e)),e.depending.next&&x.push(Ee(e)),e.depending.chakra&&x.push(Ne(e)),await ti(e,p),await A.promiseAll(),!(!e.isRoot&&!e.doesContainPackageJson)&&(xi(e)&&await Ls(e),await za(e,p,r),e.doesContainVscodeSettingsJson&&x.push(Gc(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&x.push(_c(e)),H(e)?(x.push(js(e)),x.push(Ps(e,p))):!e.isRoot&&e.doesContainPackageJson&&H(p)&&x.push(Ps(e,p)),e.depending.pyright&&x.push(zs(e)));await Promise.all(x),await A.promiseAll(),$r(n);try{Gl(n)}catch(e){console.error(`Failed to refresh the Bun lockfile:`,e?.message??e),c=!0}try{let e=he(n);e&&console.info(`Removed Takumi Guard proxy URLs from ${e} to keep it registry-agnostic.`)}catch(e){console.error(`Failed to normalize the Bun lockfile:`,e?.message??e),c=!0}Rn(`bun`,[`cleanup`],n)}return c}function Ul(e,t,n,r){return n!==r&&Wl(e,t),zn(`bun`,[`install`],e,1)===0||(Wl(e,t),!1)}function Wl(n,r){let i=[t.resolve(n,`node_modules`),...[...Ro(r).values()].map(e=>t.resolve(n,e,`node_modules`))],a=e.realpathSync(n);for(let n of i){let r=ae(()=>e.realpathSync(t.dirname(n)));!r||r!==a&&!r.startsWith(a+t.sep)||e.rmSync(n,{recursive:!0,force:!0})}}function Gl(e){let t=zn(`bun`,[`install`],e,1);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await Vl();
513
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsInBhcnNlSnNvbmMiLCJmc3AiLCJyZWxlYXNlQWdlR2F0ZS5kYXlzIiwicmVsZWFzZUFnZUdhdGUuZXhjbHVkZXMiLCJuZXdDb250ZW50IiwiY29tbW9uQ29udGVudCIsIm5ld0NvbnRlbnQiLCJjaGlsZF9wcm9jZXNzIiwiY29tbW9uQ29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJzb3J0T2JqZWN0S2V5cyIsImdpdEhvb2tzIiwiZGV0ZWN0TmV3bGluZSIsImRlcGVuZGVuY3lTZWN0aW9uS2V5cyIsImNvcmUiLCJtYW5hZ2VkQ29uZmlnQmxvY2tzIiwiZ2V0Q29uZmlnQ29udGVudCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bkxvY2tmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9kb2NrZXJmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9nbG9iLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9jaGFrcmFUb2FzdGVyLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZm5veFRvbWwudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd29ya3NwYWNlVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9qc29uY1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3N0cmluZ1V0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUudHMiLCIuLi9zcmMvdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtb2JqZWN0LWtleXNAMi4xLjAtMThkZjJmODM3ZTZlYzI5YS9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtaW5kZW50QDcuMC4yLTZiNzVkYzBmNTY1MzNiZDkvbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LW5ld2xpbmVANC4wLjEtNWRhOWRmNjUxMjVlZTc5NS9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZ2l0LWhvb2tzLWxpc3RANC4yLjEtNmNhMmIyNjlkOTE2MzMyZS9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9pcy1wbGFpbi1vYmpANC4xLjAtNDdmZGRkNzcwNjQ4ZTU3Ny9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtcGFja2FnZS1qc29uQDQuMC4wLTYzNTFiOTJmODI2MTU2ZjQvbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd2JFbnYudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9zZWxmQ29udGFpbmVkV29ya2Zsb3cudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9taXNlVG9tbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL25wbXJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvcnVsZXNldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBBbmNob3JlZCB0byBgXCIsIGAgc28gb25seSBhIHJlZ2lzdHJ5IGVudHJ5J3MgYHJlc29sdmVkYCBzbG90IGlzIGNsZWFyZWQuIEEgZGlyZWN0IHRhcmJhbGxcbiAqIGRlcGVuZGVuY3kgY2FycmllcyBpdHMgVVJMIGluIHRoZSB3b3Jrc3BhY2UgZGVzY3JpcHRvciBhbmQgdHVwbGUgaWRlbnRpZmllciBpbnN0ZWFkLCBhbmQgdGhvc2VcbiAqIFVSTHMgbXVzdCByZW1haW4gaW50YWN0LlxuICovXG5jb25zdCBndWFyZFJlc29sdmVkVXJsUGF0dGVybiA9IC8oXCIsIClcImh0dHBzOlxcL1xcL25wbVxcLmZsYXR0XFwudGVjaFxcL1teXCJdKlwiL2c7XG5cbi8qKlxuICogUmVtb3ZlIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGJ1bi5sb2NrLlxuICpcbiAqIEJ1biB3cml0ZXMgdGhlIHdvcmtzcGFjZSByb290J3MgbG9ja2ZpbGUgZXZlbiB3aGVuIGFuIGluc3RhbGwgcnVucyBmcm9tIGEgY2hpbGQgcGFja2FnZS4gSW4gYVxuICogR2l0IGNoZWNrb3V0IHRoZSBzZWFyY2ggY2xpbWJzIHRvIHRoYXQgcm9vdDsgd2l0aG91dCBhIGNoZWNrb3V0IGJvdW5kYXJ5IGl0IGluc3BlY3RzIG9ubHkgdGhlXG4gKiBzdGFydGluZyBkaXJlY3Rvcnkgc28gaXQgY2Fubm90IHJld3JpdGUgYW4gdW5yZWxhdGVkIGFuY2VzdG9yJ3MgbG9ja2ZpbGUuIFRoZSBwcm94eSBpc1xuICogaW5zdGFsbC10aW1lIHBvbGljeSByYXRoZXIgdGhhbiByZXBvc2l0b3J5IHN0YXRlOiBhbiBlbXB0eSByZXNvbHZlZCBzbG90IHN0aWxsIG1ha2VzIEJ1biB1c2UgdGhlXG4gKiBjb25maWd1cmVkIGRlZmF1bHQgcmVnaXN0cnkuXG4gKlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgbG9ja2ZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY2hhbmdlIHdhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGxvY2tmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4sICckMVwiXCInKTtcbiAgaWYgKG5vcm1hbGl6ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQSBzaWJsaW5nIHRlbXAgZmlsZSBtYWtlcyB0aGUgcmVwbGFjZW1lbnQgYW4gYXRvbWljIHNhbWUtZGlyZWN0b3J5IHJlbmFtZSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgLy8gd3JpdGUgY2Fubm90IGxlYXZlIGEgdHJ1bmNhdGVkIGJ1bi5sb2NrIGJlaGluZC5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke2xvY2tmaWxlUGF0aH0ubm9ybWFsaXppbmcuJHtwcm9jZXNzLnBpZH0uJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gIHRyeSB7XG4gICAgLy8gc3RhdCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGNobW9kIGlzIG5vdCBzcGVjaWZpZWQgdG8gYWNjZXB0LlxuICAgIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhsb2NrZmlsZVBhdGgpLm1vZGUgJiAwbzc3NztcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBvcmFyeVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50LCB7IG1vZGUgfSk7XG4gICAgLy8gd3JpdGVGaWxlU3luYydzIG1vZGUgaXMgbWFza2VkIGJ5IHRoZSBwcm9jZXNzIHVtYXNrOyBjaG1vZCByZXN0b3JlcyB0aGUgZXhhY3Qgb3JpZ2luYWwgYml0cy5cbiAgICBmcy5jaG1vZFN5bmModGVtcG9yYXJ5UGF0aCwgbW9kZSk7XG4gICAgZnMucmVuYW1lU3luYyh0ZW1wb3JhcnlQYXRoLCBsb2NrZmlsZVBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyh0ZW1wb3JhcnlQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiBsb2NrZmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZFN0YXJ0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShzdGFydERpclBhdGgpO1xuICBjb25zdCByZXBvc2l0b3J5Um9vdERpclBhdGggPSBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHJlc29sdmVkU3RhcnREaXJQYXRoKTtcbiAgaWYgKCFyZXBvc2l0b3J5Um9vdERpclBhdGgpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRTdGFydERpclBhdGgsICdidW4ubG9jaycpO1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkgPyBsb2NrZmlsZVBhdGggOiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgZGlyUGF0aCA9IHJlc29sdmVkU3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpKSByZXR1cm4gbG9ja2ZpbGVQYXRoO1xuICAgIGlmIChkaXJQYXRoID09PSByZXBvc2l0b3J5Um9vdERpclBhdGgpIHJldHVybjtcblxuICAgIGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkaXJQYXRoID0gc3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGRpclBhdGg7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSByZXR1cm47XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cbiIsIi8qKiBXaGV0aGVyIGEgRG9ja2VyZmlsZSBjb25zdW1lcyB3YidzIGdlbmVyYXRlZCBub24tc2VjcmV0IGVudmlyb25tZW50IGRpcmVjdGx5IG9yIHRocm91Z2ggaXRzIGhlbHBlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0RvY2tlckVudihkb2NrZXJmaWxlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBkb2NrZXJmaWxlVGV4dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuc29tZSgobGluZSkgPT4gIS9eXFxzKiMvdS50ZXN0KGxpbmUpICYmIChsaW5lLmluY2x1ZGVzKCcuZG9ja2VyLmVudicpIHx8IGxpbmUuaW5jbHVkZXMoJ2FwcGx5LWRvY2tlci1lbnYuc2gnKSkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLmFudGlncmF2aXR5Y2xpLyoqJyxcbiAgLy8gR2l0J3Mgb2JqZWN0IHN0b3JlIGhvbGRzIGNvcGllcyBvZiB0cmFja2VkIGZpbGVzIChhbmQgYGRvdDogdHJ1ZWAgbWFrZXMgdGhlbSB2aXNpYmxlKSwgc29cbiAgLy8gc2Nhbm5pbmcgaXQgd291bGQgYm90aCBzbG93IGV2ZXJ5IGdsb2IgZG93biBhbmQgbGV0IHN0YWxlIGJsb2JzIGluZmx1ZW5jZSBkZXRlY3Rpb24uXG4gICcqKi8uZ2l0LyoqJyxcbiAgLy8gVGhlIG9yZy1zdGFuZGFyZCB0ZW1wb3JhcnkgZGlyZWN0b3J5OyBzdGFsZSBjb3BpZXMgdW5kZXIgaXQgKGUuZy4gcmV2aWV3IHNjcmF0Y2ggZGlycykgbXVzdFxuICAvLyBub3QgaW5mbHVlbmNlIGxhbmd1YWdlIGRldGVjdGlvbi5cbiAgJyoqLy50bXAvKionLFxuICAnKiovLnRtcC0qLyoqJyxcbiAgLy8gTG9jYWwgY2FjaGVzIGNhbiBjb250YWluIGNvbXBsZXRlIHRoaXJkLXBhcnR5IHNvdXJjZSBjaGVja291dHMuIFRyZWF0aW5nIHRob3NlIGFzIHJlcG9zaXRvcnlcbiAgLy8gY29kZSBnZW5lcmF0ZXMgd29ya2Zsb3dzIGZvciBwYXRocyB0aGF0IGFyZSBnaXRpZ25vcmVkIGFuZCBhYnNlbnQgZnJvbSBmcmVzaCBDSSBjaGVja291dHMuXG4gICcqKi8uY2FjaGUvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5sZXQgcmVhbFJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIC8qKiBDb25maW5lcyBnZW5lcmF0ZUZpbGUgd3JpdGVzIHRvIHRoZSByZXBvc2l0b3J5IHJvb3RlZCBhdCByb290RGlyUGF0aCAodW5kZWZpbmVkIGRpc2FibGVzIGl0KS4gKi9cbiAgc2V0Um9vdERpclBhdGgocm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHJlYWxSb290RGlyUGF0aCA9IHJvb3REaXJQYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJucyB1bmRlZmluZWQgb25seSB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LiBPdGhlciBmYWlsdXJlcyAoZS5nLiBwZXJtaXNzaW9ucykgYXJlXG4gICAqIHJldGhyb3duIHNvIGNhbGxlcnMgcmVnZW5lcmF0aW5nIGNvbmZpZyBmaWxlcyBuZXZlciBvdmVyd3JpdGUgY29udGVudCB0aGV5IGNvdWxkIG5vdCByZWFkLlxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH0sXG4gIC8qKiBUZWxscyB3aGV0aGVyIGEgd3JpdGUgdG8gZmlsZVBhdGggd291bGQgcGFzcyB0aGUgc3ltbGluay9yZXBvc2l0b3J5LWNvbnRhaW5tZW50IGd1YXJkcy4gKi9cbiAgYXN5bmMgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmVhZHMgYSBzb3VyY2UgZmlsZSwgcmV0dXJuaW5nIHVuZGVmaW5lZCB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IE9SIHdoZW4gaXRcbiAgICogcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSDigJQgYSBjb21taXR0ZWQgc3ltbGluayBwb2ludGluZyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IG11c3RcbiAgICogbm90IGdldCBpdHMgdGFyZ2V0J3MgY29udGVudCBjb3BpZWQgaW50byBhIHRyYWNrZWQgZmlsZS4gQSBzeW1saW5rIHdob3NlIHJlc29sdmVkIHRhcmdldFxuICAgKiBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkgaXMgbGVnaXRpbWF0ZSAoZS5nLiBgLm5vZGUtdmVyc2lvbiAtPiAubnZtcmNgKSBhbmQgaXMgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKCFzdGF0cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgbGV0IHJlYWxGaWxlUGF0aDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVhbEZpbGVQYXRoID0gYXdhaXQgZnMucHJvbWlzZXMucmVhbHBhdGgoZmlsZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBkYW5nbGluZyBzeW1ib2xpYyBsaW5rLmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICByZWFsUm9vdERpclBhdGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICByZWFsRmlsZVBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJlxuICAgICAgICAhcmVhbEZpbGVQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZXMgZmlsZVBhdGggKGZvcmNlLCBvcHRpb25hbGx5IHJlY3Vyc2l2ZSkgb25seSB3aGVuIGl0cyBQQVJFTlQgZGlyZWN0b3J5IHJlc29sdmVzIGluc2lkZVxuICAgKiB0aGUgcmVwb3NpdG9yeSwgc28gYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGEgY29tbWl0dGVkIC5naXRodWIvd29ya2Zsb3dzIGxpbmspIGNhbiBuZXZlclxuICAgKiBtYWtlIGNsZWFudXAgZGVsZXRlIGZpbGVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuIFJlbW92aW5nIGEgc3ltbGluayBlbnRyeSBpdHNlbGYgaXMgYWxsb3dlZDpcbiAgICogdGhhdCBkZWxldGVzIG9ubHkgdGhlIGxpbmssIG5ldmVyIGl0cyB0YXJnZXQuIFJldHVybnMgd2hldGhlciB0aGUgcmVtb3ZhbCB3YXMgcGVyZm9ybWVkLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlbW92aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogb3B0aW9ucz8ucmVjdXJzaXZlID8/IGZhbHNlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogV3JpdGVzIGNvbnRlbnQgdmVyYmF0aW0sIGFwcGx5aW5nIHRoZSBzYW1lIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMgYXMgZ2VuZXJhdGVGaWxlLiAqL1xuICBhc3luYyB3cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSkpIHJldHVybiBmYWxzZTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIHdhcyBhY3R1YWxseSBnZW5lcmF0ZWQgKGZhbHNlIHdoZW4gdGhlIGNvbmZpbmVtZW50IGd1YXJkcyBza2lwIGl0KS4gKi9cbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGluZUVuZGluZzogJ1xcbicgfCAnXFxyXFxuJyA9ICdcXG4nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gYHRyaW1gIHRyZWF0cyBhIEJPTSBhcyB3aGl0ZXNwYWNlLCBzbyBpdCBpcyByZWF0dGFjaGVkIGF0IHBvc2l0aW9uIDA6IGRyb3BwaW5nIGl0IHdvdWxkXG4gICAgLy8gcmV3cml0ZSB0aGUgZW5jb2RpbmcgbWFya2VyIG9mIGEgZmlsZSB0aGUgZ2VuZXJhdG9yIHdhcyBvbmx5IGFza2VkIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBieXRlT3JkZXJNYXJrID0gY29udGVudC5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCA9IGAke2J5dGVPcmRlck1hcmt9JHtub3JtYWxpemVkQ29udGVudH0ke2xpbmVFbmRpbmd9YDtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gTmV2ZXIgd3JpdGUgdGhyb3VnaCBhIHN5bWxpbms6IGEgKHBvc3NpYmx5IGRhbmdsaW5nKSBsaW5rIGNvbW1pdHRlZCBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnlcbiAgLy8gY291bGQgcmVkaXJlY3QgdGhlIHdyaXRlIG91dHNpZGUgaXQuXG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgaWYgKHN0YXRzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgd3JpdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBBIHN5bWxpbmtlZCBwYXJlbnQgZGlyZWN0b3J5IHdvdWxkIHJlZGlyZWN0IHJlYWRzLCB3cml0ZXMsIGFuZCByZW1vdmFscyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LFxuLy8gc28gcmVxdWlyZSB0aGUgY2xvc2VzdCBleGlzdGluZyBhbmNlc3RvciB0byByZXNvbHZlIGluc2lkZSB0aGUgcm9vdCBzZXQgYnkgdGhlIENMSSBlbnRyeSBwb2ludC5cbmFzeW5jIGZ1bmN0aW9uIGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKHJlYWxSb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgbGV0IGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhhbmNlc3RvclBhdGgpKSB7XG4gICAgYW5jZXN0b3JQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yUGF0aCk7XG4gIH1cbiAgY29uc3QgcmVhbEFuY2VzdG9yUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGFuY2VzdG9yUGF0aCk7XG4gIHJldHVybiByZWFsQW5jZXN0b3JQYXRoID09PSByZWFsUm9vdERpclBhdGggfHwgcmVhbEFuY2VzdG9yUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IEFQSSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VGaWxlIH0gZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG4vLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSAoR28pIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSBhbmQgbm9cbi8vIGxvbmdlciBleHBvc2VzIGFuIGluLXByb2Nlc3MgcGFyc2VyIHN1Y2ggYXMgYHRzLmNyZWF0ZVNvdXJjZUZpbGVgLiBQYXJzaW5nIG5vd1xuLy8gaGFwcGVucyBpbiBhIHNwYXduZWQgY29tcGlsZXIgc2VydmVyIHJlYWNoZWQgdGhyb3VnaCB0aGUgYXN5bmNocm9ub3VzIEFQSSwgc28gd2Vcbi8vIGtlZXAgYSBzaW5nbGUgbGF6aWx5LWNyZWF0ZWQgaW5zdGFuY2UgYW5kIHJldXNlIGl0IGFjcm9zcyBldmVyeSBmaXhlciB0byBhdm9pZFxuLy8gcGF5aW5nIHRoZSBwcm9jZXNzLXNwYXduIGNvc3QgcGVyIGZpbGUuXG5sZXQgYXBpOiBBUEkgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGdldEFwaSgpOiBBUEkge1xuICByZXR1cm4gKGFwaSA/Pz0gbmV3IEFQSSh7IGN3ZDogcHJvY2Vzcy5jd2QoKSB9KSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgc291cmNlIGZpbGUgaW50byBhIFR5cGVTY3JpcHQgQVNUIHVzaW5nIHRoZSBidW5kbGVkIG5hdGl2ZSBjb21waWxlci5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY29tcGlsZXIgY2Fubm90IGxvYWQgdGhlIGZpbGUgKGUuZy4gaXQgaXMgbWlzc2luZ1xuICogb3IgdW5wYXJzYWJsZSkgc28gY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIGNvbnNlcnZhdGl2ZSBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxTb3VyY2VGaWxlIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBnZXRBcGkoKS51cGRhdGVTbmFwc2hvdCh7IG9wZW5GaWxlczogW2ZpbGVQYXRoXSB9KTtcbiAgICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgc25hcHNob3QuZ2V0RGVmYXVsdFByb2plY3RGb3JGaWxlKGZpbGVQYXRoKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvamVjdD8ucHJvZ3JhbS5nZXRTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNodXRzIGRvd24gdGhlIHNwYXduZWQgY29tcGlsZXIgc2VydmVyLiBUaGUgc2VydmVyIGtlZXBzIGFuIG9wZW4gSVBDIGNoYW5uZWxcbiAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGtlZXAgdGhlIHJ1bnRpbWUgZXZlbnQgbG9vcCBhbGl2ZSwgc28gd2JmeSBtdXN0IGNhbGwgdGhpc1xuICogb25jZSBpdHMgcnVuIGZpbmlzaGVzIGZvciB0aGUgcHJvY2VzcyB0byBleGl0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwaT8uY2xvc2UoKTtcbiAgYXBpID0gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbi8vIFNldHRpbmdzIGV2ZXJ5IFdpbGxCb29zdGVyIE5leHQuanMgcHJvamVjdCBzaG91bGQgY2FycnkuIGBuYW1lYCBpcyB0aGUgdG9wLWxldmVsXG4vLyBwcm9wZXJ0eSBrZXkgdXNlZCB0byBkZXRlY3Qgd2hldGhlciB0aGUgc2V0dGluZyBhbHJlYWR5IGV4aXN0czsgYHRleHRgIGlzIGluc2VydGVkXG4vLyB2ZXJiYXRpbSAoYSB3aG9sZSBga2V5OiB2YWx1ZWAgcGFpcikgd2hlbiB0aGUga2V5IGlzIG1pc3NpbmcuXG5jb25zdCBtYW5hZ2VkUHJvcGVydGllczogcmVhZG9ubHkgeyBuYW1lOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXG4gIHsgbmFtZTogJ3JlYWN0Q29tcGlsZXInLCB0ZXh0OiAncmVhY3RDb21waWxlcjogdHJ1ZScgfSxcbiAgeyBuYW1lOiAncmVhY3RTdHJpY3RNb2RlJywgdGV4dDogJ3JlYWN0U3RyaWN0TW9kZTogdHJ1ZScgfSxcbiAgeyBuYW1lOiAndHlwZXNjcmlwdCcsIHRleHQ6ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0nIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ3RzJywgJ210cycsICdjdHMnLCAnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IGF3YWl0IGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gPSBleHRyYWN0ZWQ7XG5cbiAgICAvLyBgcHJvcGVydGllc2AgaW5jbHVkZXMgc3ByZWFkIGFzc2lnbm1lbnRzIChgLi4ucmVzdGApIHRoYXQgY2Fycnkgbm8gbmFtZSwgc28gZ3VhcmQgYmVmb3JlIHJlYWRpbmcgaXQuXG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0aWVzID0gbmV3IFNldChcbiAgICAgIG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PlxuICAgICAgICAnbmFtZScgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkubmFtZSA/IGdldFByb3BlcnR5S2V5KHByb3BlcnR5Lm5hbWUsIHNvdXJjZSkgOiB1bmRlZmluZWRcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHByb3BlcnR5VGV4dHMgPSBtYW5hZ2VkUHJvcGVydGllc1xuICAgICAgLmZpbHRlcigocHJvcGVydHkpID0+ICFleGlzdGluZ1Byb3BlcnRpZXMuaGFzKHByb3BlcnR5Lm5hbWUpKVxuICAgICAgLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnRleHQpO1xuICAgIGlmIChwcm9wZXJ0eVRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IHNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgLy8gVGhlIG5hdGl2ZSBUUyBBU1QgZG9lcyBub3QgcmVsaWFibHkgZXhwb3NlIGBwcm9wZXJ0aWVzLmhhc1RyYWlsaW5nQ29tbWFgLCBzbyBzY2FuIHRoZSBzb3VyY2VcbiAgICAvLyBiZXR3ZWVuIHRoZSBsYXN0IHByb3BlcnR5IGFuZCB0aGUgY2xvc2luZyBicmFjZS4gU3RyaXAgY29tbWVudHMgZmlyc3Qgc28gYSBjb21tYSBpbnNpZGUgYVxuICAgIC8vIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4gYGZvbzogMSAvLyBhLCBiYCkgaXMgbm90IG1pc3Rha2VuIGZvciBhIHJlYWwgdHJhaWxpbmcgY29tbWEuXG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IHN0cmlwQ29tbWVudHMob2xkQ29udGVudC5zbGljZShsYXN0UHJvcGVydHkuZ2V0RW5kKCksIGluc2VydGlvblBvaW50KSkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHsgc291cmNlOiBhc3QuU291cmNlRmlsZTsgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkIGRlY2xhcmVzIHRoZSBjb25maWcgYXMgYGNvbnN0IG5leHRDb25maWc6IE5leHRDb25maWcgPSB7IC4uLiB9YCBhbmRcbiAgLy8gZXhwb3J0cyBpdCAocG9zc2libHkgd3JhcHBlZCwgZS5nLiBgd2l0aFNlbnRyeUNvbmZpZyguLi4pYCksIHNvIHRoZSBvYmplY3QgbGl0ZXJhbCBpcyByYXJlbHlcbiAgLy8gdGhlIGRpcmVjdCBvcGVyYW5kIG9mIGBleHBvcnQgZGVmYXVsdGAvYG1vZHVsZS5leHBvcnRzYC4gQ29sbGVjdCBldmVyeSBjYW5kaWRhdGUgYW5kIHBpY2sgdGhlXG4gIC8vIG1vc3QgYXV0aG9yaXRhdGl2ZSBvbmUgYmVsb3cuXG4gIGxldCBkaXJlY3RPYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGxldCBleHBvcnRlZElkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmFyaWFibGVPYmplY3RMaXRlcmFscyA9IG5ldyBNYXA8c3RyaW5nLCBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24+KCk7XG4gIGNvbnN0IHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHM6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbltdID0gW107XG5cbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoYXN0LmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFzdC5pc0JpbmFyeUV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUub3BlcmF0b3JUb2tlbi5raW5kID09PSBhc3QuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJ1xuICAgICkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5yaWdodCk7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUucmlnaHQpKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5yaWdodC5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhc3QuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpICYmIG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuaW5pdGlhbGl6ZXIpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwgJiYgYXN0LmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuc2V0KG5vZGUubmFtZS5nZXRUZXh0KHNvdXJjZSksIG9iamVjdExpdGVyYWwpO1xuICAgICAgICAvLyBUaGUgYDogTmV4dENvbmZpZ2AgYW5ub3RhdGlvbiB3YmZ5IHdyaXRlcyBtYXJrcyB0aGUgY2Fub25pY2FsIGNvbmZpZyBvYmplY3QgKGFjY2VwdGluZ1xuICAgICAgICAvLyBxdWFsaWZpZWQgbmFtZXMgc3VjaCBhcyBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2ApLlxuICAgICAgICBjb25zdCBhbm5vdGF0aW9uVHlwZSA9IG5vZGUudHlwZT8uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgICBpZiAoYW5ub3RhdGlvblR5cGUgIT09IHVuZGVmaW5lZCAmJiBpc05leHRDb25maWdUeXBlKGFubm90YXRpb25UeXBlKSkge1xuICAgICAgICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHMucHVzaChvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIGNvbnN0IG9iamVjdExpdGVyYWwgPVxuICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHNbMF0gPz9cbiAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/XG4gICAgKGV4cG9ydGVkSWRlbnRpZmllciA/IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KGV4cG9ydGVkSWRlbnRpZmllcikgOiB1bmRlZmluZWQpID8/XG4gICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoJ25leHRDb25maWcnKTtcbiAgcmV0dXJuIG9iamVjdExpdGVyYWwgPyB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3VycmVudCA9IHVud3JhcFBhcmVudGhlc2VzKG5vZGUpO1xuICByZXR1cm4gYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oY3VycmVudCkgPyBjdXJyZW50IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJlbnRoZXNlcyhub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5FeHByZXNzaW9uIHtcbiAgbGV0IGN1cnJlbnQgPSBub2RlO1xuICB3aGlsZSAoYXN0LmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oY3VycmVudCkpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5leHByZXNzaW9uO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vLyBNYXRjaCBib3RoIHRoZSBiYXJlIGBOZXh0Q29uZmlnYCBhbmQgcXVhbGlmaWVkIGZvcm1zIGxpa2UgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgLlxuZnVuY3Rpb24gaXNOZXh0Q29uZmlnVHlwZSh0eXBlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlVGV4dCA9PT0gJ05leHRDb25maWcnIHx8IHR5cGVUZXh0LmVuZHNXaXRoKCcuTmV4dENvbmZpZycpO1xufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBrZXkgd2l0aG91dCBzdXJyb3VuZGluZyBxdW90ZXMsIHNvIGAncmVhY3RDb21waWxlcidgIG1hdGNoZXMgYHJlYWN0Q29tcGlsZXJgLlxuLy8gSWRlbnRpZmllciwgc3RyaW5nLWxpdGVyYWwgYW5kIG51bWVyaWMtbGl0ZXJhbCBuYW1lcyBhbGwgZXhwb3NlIHRoZSB1bnF1b3RlZCB2YWx1ZSB2aWEgYC50ZXh0YC5cbmZ1bmN0aW9uIGdldFByb3BlcnR5S2V5KG5hbWU6IGFzdC5Qcm9wZXJ0eU5hbWUsIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmcge1xuICByZXR1cm4gJ3RleHQnIGluIG5hbWUgJiYgdHlwZW9mIG5hbWUudGV4dCA9PT0gJ3N0cmluZycgPyBuYW1lLnRleHQgOiBuYW1lLmdldFRleHQoc291cmNlKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb21tZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9cXC9cXC9bXlxcbl0qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgJycpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeENoYWtyYVRvYXN0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4Q2hha3JhVG9hc3RlcicsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuY2hha3JhKSByZXR1cm47XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90b2FzdGVyLnt0cyx0c3h9Jywge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgaWdub3JlOiBbJyoqLy4qLyoqJywgJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRlbnQuaW5jbHVkZXMoJ0NyZWF0ZVRvYXN0ZXJSZXR1cm4nKSB8fFxuICAgICAgICAhY29udGVudC5pbmNsdWRlcyhcImZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnXCIpIHx8XG4gICAgICAgICFjb250ZW50LmluY2x1ZGVzKCdleHBvcnQgY29uc3QgdG9hc3RlciA9IGNyZWF0ZVRvYXN0ZXIoJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gY29udGVudFxuICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAvXmltcG9ydCAuKiBmcm9tICdAY2hha3JhLXVpXFwvcmVhY3QnOyQvbXUsXG4gICAgICAgICAgXCIkJlxcbmltcG9ydCB0eXBlIHsgQ3JlYXRlVG9hc3RlclJldHVybiB9IGZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnO1wiXG4gICAgICAgIClcbiAgICAgICAgLnJlcGxhY2UoJ2V4cG9ydCBjb25zdCB0b2FzdGVyID0gY3JlYXRlVG9hc3RlcignLCAnZXhwb3J0IGNvbnN0IHRvYXN0ZXI6IENyZWF0ZVRvYXN0ZXJSZXR1cm4gPSBjcmVhdGVUb2FzdGVyKCcpO1xuICAgICAgaWYgKHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZTtcbiAgbm9kZTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0czogYm9vbGVhbik6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IHVzZSA9IHRvUGFyc2VkT2JqZWN0KHtcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb24nXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSk7XG5cbiAgaWYgKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKSB7XG4gICAgdXNlLnByb3BlcnRpZXMuYmFzZVVSTCA9IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyk7XG4gICAgdXNlLm1lbWJlck9yZGVyLnVuc2hpZnQoeyBraW5kOiAncHJvcGVydHknLCBrZXk6ICdiYXNlVVJMJyB9KTtcbiAgfVxuXG4gIHJldHVybiB0b1BhcnNlZE9iamVjdCh7XG4gICAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICAgIHVzZTogeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHVzZSB9LFxuICAgIC4uLihzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0c1xuICAgICAgPyB7XG4gICAgICAgICAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgICAgICAgICBjb21tYW5kOiBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpKSxcbiAgICAgICAgICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICAgICAgICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICAgICAgICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgICAgICAgICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICBleHRyYU1lbWJlcnMsXG4gICAgbWVtYmVyT3JkZXI6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BlcnRpZXMpLm1hcCgoa2V5KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KSksXG4gICAgICAuLi5leHRyYU1lbWJlcnMubWFwKChfLCBpbmRleCk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KSksXG4gICAgXSxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBhd2FpdCBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICAvLyB3YiBkZXJpdmVzIE5FWFRfUFVCTElDX0JBU0VfVVJMIGZyb20gdGhlIHJlc29sdmVkIHBvcnQgZm9yIE5leHQuanMvdmluZXh0IGFwcHMgKHZpbmV4dFxuICAgIC8vIGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gYGRlcGVuZGluZy5uZXh0YCBjb3ZlcnMgYm90aCksIHNvIHRob3NlIG5lZWQgbm8gZGVjbGFyZWRcbiAgICAvLyB2YXJpYWJsZTsgb3RoZXIgcGFja2FnZXMgc3RpbGwgcmVxdWlyZSBhIGRlY2xhcmF0aW9uLlxuICAgIGNvbnN0IHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzID1cbiAgICAgIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZywgcGFyc2VkKSAmJlxuICAgICAgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCAoYXdhaXQgZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKSkpO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpO1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhkZWZhdWx0Q29uZmlnLCBwYXJzZWQpO1xuICAgIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKG1lcmdlZCwgZGVmYXVsdENvbmZpZyk7XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChtZXJnZWQpO1xuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeVZhbHVlKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZWQgfSwgMCk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlLnRleHQ7XG4gICAgY29uc3Qgc3RhcnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0U3RhcnQoZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGNvbnN0IGVuZCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRFbmQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBzdGFydCl9JHtuZXdPYmplY3RMaXRlcmFsfSR7b2xkQ29udGVudC5zbGljZShlbmQpfWA7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2U6IFBhcnNlZE9iamVjdCwgb3ZlcnJpZGU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IG92ZXJyaWRlUHJvcGVydHlLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhvdmVycmlkZS5wcm9wZXJ0aWVzKSk7XG4gIGNvbnN0IGV4dHJhTWVtYmVycyA9IFsuLi5iYXNlLmV4dHJhTWVtYmVycywgLi4ub3ZlcnJpZGUuZXh0cmFNZW1iZXJzXTtcbiAgLy8gS2VlcCBkZWZhdWx0LW9ubHkgbWVtYmVycyBiZWZvcmUgcGFyc2VkIG1lbWJlcnMgc28gc3ByZWFkcyBhbmQgZXhwbGljaXQgbG9jYWwgcHJvcGVydGllcyByZXRhaW4gcHJlY2VkZW5jZS5cbiAgY29uc3QgbWVtYmVyT3JkZXIgPSBbXG4gICAgLi4uYmFzZS5tZW1iZXJPcmRlci5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgIT09ICdwcm9wZXJ0eScgfHwgIW92ZXJyaWRlUHJvcGVydHlLZXlzLmhhcyhtZW1iZXIua2V5KSksXG4gICAgLi4ub3ZlcnJpZGUubWVtYmVyT3JkZXIubWFwKChtZW1iZXIpOiBPYmplY3RNZW1iZXIgPT4ge1xuICAgICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSByZXR1cm4gbWVtYmVyO1xuICAgICAgcmV0dXJuIHsga2luZDogJ2V4dHJhJywgaW5kZXg6IGJhc2UuZXh0cmFNZW1iZXJzLmxlbmd0aCArIG1lbWJlci5pbmRleCB9O1xuICAgIH0pLFxuICBdO1xuICBjb25zdCBwcm9wZXJ0aWVzID0geyAuLi5iYXNlLnByb3BlcnRpZXMgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGUucHJvcGVydGllcykpIHtcbiAgICBwcm9wZXJ0aWVzW2tleV0gPSBtZXJnZVBhcnNlZFZhbHVlKHByb3BlcnRpZXNba2V5XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB7IGV4dHJhTWVtYmVycywgbWVtYmVyT3JkZXIsIHByb3BlcnRpZXMgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRWYWx1ZShiYXNlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCwgb3ZlcnJpZGU6IFBhcnNlZFZhbHVlKTogUGFyc2VkVmFsdWUge1xuICBpZiAoYmFzZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgb3ZlcnJpZGUua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlLnZhbHVlLCBvdmVycmlkZS52YWx1ZSkgfTtcbiAgfVxuICByZXR1cm4gb3ZlcnJpZGU7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKGNvbmZpZzogUGFyc2VkT2JqZWN0LCBkZWZhdWx0Q29uZmlnOiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3QgdXNlID0gY29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBjb25zdCBkZWZhdWx0VXNlID0gZGVmYXVsdENvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgaWYgKHVzZT8ua2luZCAhPT0gJ29iamVjdCcgfHwgZGVmYXVsdFVzZT8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ3RyYWNlJywgJ3NjcmVlbnNob3QnLCAndmlkZW8nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRVc2UudmFsdWUucHJvcGVydGllc1trZXldO1xuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcGFyc2VkOiBQYXJzZWRPYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZGVwZW5kaW5nLm5leHQgfHxcbiAgICBwYXJzZWQucHJvcGVydGllcy53ZWJTZXJ2ZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgIGRvZXNPYmplY3RIYXZlQmFzZVVybChwYXJzZWQucHJvcGVydGllcy51c2UpIHx8XG4gICAgZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZCB9LCAnTkVYVF9QVUJMSUNfQkFTRV9VUkwnKVxuICApO1xufVxuXG5mdW5jdGlvbiBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwodmFsdWU6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgdmFsdWUudmFsdWUucHJvcGVydGllcy5iYXNlVVJMICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGl0ZXJhbFRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWUuaW5jbHVkZXMobGl0ZXJhbFRleHQpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5JykgcmV0dXJuIHZhbHVlLnZhbHVlLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKTtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnMuc29tZSgobWVtYmVyKSA9PiBtZW1iZXIuaW5jbHVkZXMobGl0ZXJhbFRleHQpKSB8fFxuICAgIE9iamVjdC52YWx1ZXModmFsdWUudmFsdWUucHJvcGVydGllcykuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3NpbmcgZW52IGZpbGVzIGFyZSBleHBlY3RlZCBpbiBzb21lIHJlcG9zLlxuICAgIH1cbiAgfVxuXG4gIC8vIFNvbWUgUGxheXdyaWdodCBjb25maWdzIG9ubHkgZGVmaW5lIGJyb3dzZXIgcHJvamVjdHMgb3IgZml4dHVyZXMgYW5kIGRvIG5vdFxuICAvLyBzdGFydCBhIHdlYiBhcHAuIEF2b2lkIGZvcmNpbmcgYW4gYXBwLXNlcnZlciBVUkwgaW50byB0aG9zZSBwYWNrYWdlcy5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnZGaWxlTmFtZXMgPSBbJ2Zub3gudG9tbCcsICdtaXNlLnRvbWwnLCAnbWlzZS50ZXN0LnRvbWwnXTtcbiAgY29uc3QgZW52RmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpOyA7IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKSkge1xuICAgIGVudkZpbGVQYXRocy5wdXNoKC4uLmVudkZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsIGZpbGVOYW1lKSkpO1xuXG4gICAgLy8gUGxheXdyaWdodCBjb25maWdzIG9mdGVuIGxpdmUgaW4gcGFja2FnZXMvKiB3aGlsZSBzaGFyZWQgZW52IGZpbGVzIGxpdmUgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290LCBzbyB3YWxrIHVwd2FyZCB1bnRpbCB0aGUgdGFyZ2V0IHJlcG8gYm91bmRhcnkuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCAnLmdpdCcpKSkgYnJlYWs7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGVudkZpbGVQYXRocztcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChvYmplY3Q6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgY29tbWFuZCA9IHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQ7XG4gIC8vIExpYnJhcmllcyBjYW4gdXNlIFBsYXl3cmlnaHQncyB3ZWJTZXJ2ZXIgdG8gYnVpbGQgYW5kIGxhdW5jaCBhIGZpeHR1cmUgZXZlbiB0aG91Z2ggYHdiIHN0YXJ0YFxuICAvLyBpbnRlbnRpb25hbGx5IGhhcyBubyB0ZXN0IHNlcnZlciBmb3IgdGhlIGxpYnJhcnkgaXRzZWxmLiBQcmVzZXJ2ZSB0aG9zZSBjdXN0b20gbGlmZWN5Y2xlXG4gIC8vIGNvbW1hbmRzOyBvbmx5IGFkZCB0aGUgY29tbWFuZCB3aGVuIHdiZnkgYWxyZWFkeSBvd25zIGl0LlxuICBpZiAoY29tbWFuZCAmJiAhaXNHZW5lcmF0ZWRXYlN0YXJ0VGVzdENvbW1hbmQoY29tbWFuZCkpIHJldHVybjtcblxuICAvLyBQbGF5d3JpZ2h0IHJlcXVpcmVzIGBjb21tYW5kYCB3aGVuZXZlciBgd2ViU2VydmVyYCBleGlzdHM7IGFuIGV4dGVybmFsbHkgbWFuYWdlZCBzZXJ2ZXIgc2hvdWxkXG4gIC8vIG9taXQgYHdlYlNlcnZlcmAgaW5zdGVhZC4gS2VlcCBmaWxsaW5nIHRoaXMgcmVxdWlyZWQgZmllbGQgd2hlbiBhIHBhcnRpYWwgbWFuYWdlZCBibG9jayBsYWNrcyBpdC5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKCkpO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFdiU3RhcnRUZXN0Q29tbWFuZChjb21tYW5kOiBQYXJzZWRWYWx1ZSk6IGJvb2xlYW4ge1xuICBpZiAoY29tbWFuZC5raW5kICE9PSAnbGl0ZXJhbCcpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbW1hbmQudmFsdWUudHJpbSgpID09PSBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2JTdGFydFRlc3RDb21tYW5kKCk6IHN0cmluZyB7XG4gIHJldHVybiBgJ2J1biB3YiBzdGFydCAtLW1vZGUgdGVzdCdgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIGlmIChhc3QuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBhc3QuRXhwcmVzc2lvbiwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKGFzdC5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IGxpdGVyYWwoa2V5KTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8XG4gICAgICAoIWFzdC5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIWFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpXG4gICAgKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlZC5leHRyYU1lbWJlcnMucHVzaChwcm9wZXJ0eS5nZXRUZXh0KHNvdXJjZSkpIC0gMTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAodmFsdWUudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuXG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGVtaXR0ZWRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlci5mbGF0TWFwKChtZW1iZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAnZXh0cmEnKSB7XG4gICAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdE1lbWJlcih2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnNbbWVtYmVyLmluZGV4XSA/PyAnJywgaW5kZW50KV07XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuZ2V0KG1lbWJlci5rZXkpICE9PSBpbmRleCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzW21lbWJlci5rZXldO1xuICAgIGlmICghaXRlbSB8fCBlbWl0dGVkUHJvcGVydGllcy5oYXMobWVtYmVyLmtleSkpIHJldHVybiBbXTtcbiAgICBlbWl0dGVkUHJvcGVydGllcy5hZGQobWVtYmVyLmtleSk7XG4gICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShtZW1iZXIua2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KV07XG4gIH0pO1xuICBsaW5lcy5wdXNoKFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhrZXkpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCkpXG4gICk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkobWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbWVtYmVyXSBvZiBtZW1iZXJPcmRlci5lbnRyaWVzKCkpIHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuc2V0KG1lbWJlci5rZXksIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleTogc3RyaW5nLCBpdGVtOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlciwgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgfVxuICB9XG4gIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdE1lbWJlcihtZW1iZXI6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IG1lbWJlci5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2Ygc3RyaW5naWZpZWQuZW50cmllcygpKSB7XG4gICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG50eXBlIFdpbGxCb29zdGVyT3JnYW5pemF0aW9uID0gJ1dpbGxCb29zdGVyJyB8ICdXaWxsQm9vc3RlckxhYic7XG50eXBlIFJlcG9zaXRvcnlGdWxsTmFtZSA9IGAke1dpbGxCb29zdGVyT3JnYW5pemF0aW9ufS8ke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZub3hSZXBvc2l0b3J5U2NvcGUge1xuICBvcmdhbml6YXRpb25zPzogcmVhZG9ubHkgV2lsbEJvb3N0ZXJPcmdhbml6YXRpb25bXTtcbiAgcmVwb3NpdG9yaWVzPzogcmVhZG9ubHkgUmVwb3NpdG9yeUZ1bGxOYW1lW107XG4gIC8vIFJlc3RyaWN0cyB0aGUgc2NvcGUgdG8gcmVwb3NpdG9yaWVzIG9mIHRoZSBnaXZlbiB2aXNpYmlsaXR5LiBQdWJsaWMgcmVwb3NpdG9yaWVzIHB1Ymxpc2ggdGhlaXJcbiAgLy8gY2lwaGVydGV4dHMgdG8gdGhlIHdvcmxkLCBzbyB0aGV5IG11c3QgdXNlIGEgQ0kgaWRlbnRpdHkgc2VwYXJhdGUgZnJvbSB0aGUgb3JnLWludGVybmFsIG9uZTpcbiAgLy8gbGVha2luZyBlaXRoZXIgQ0kga2V5IG11c3Qgbm90IGV4cG9zZSB0aGUgb3RoZXIgc2lkZSdzIHNlY3JldHMuXG4gIHZpc2liaWxpdHk/OiAncHVibGljJyB8ICdwcml2YXRlJztcbn1cblxuaW50ZXJmYWNlIEZub3hBZ2VQcmluY2lwYWwge1xuICBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpY0tleXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZXBvc2l0b3J5U2NvcGU6IEZub3hSZXBvc2l0b3J5U2NvcGU7XG4gIC8vIE1hcmtzIHRoZSBwcmluY2lwYWwgYXMgYSBDSSBpZGVudGl0eSBhbmQgbmFtZXMgdGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyBpdHMgcHJpdmF0ZSBrZXkuXG4gIC8vIEV2ZXJ5IGZub3gtbWFuYWdlZCByZXBvc2l0b3J5IG11c3QgcmVzb2x2ZSBvbmUgKGdlbmVyYXRlRm5veFRvbWwgZmFpbHMgY2xvc2VkIG90aGVyd2lzZTogYVxuICAvLyByb3N0ZXIgd2l0aG91dCBhIENJIHJlY2lwaWVudCB3b3VsZCByZS1lbmNyeXB0IHNlY3JldHMgdGhhdCBDSSBjYW4gbmV2ZXIgZGVjcnlwdCBhZ2FpbiksIGFuZFxuICAvLyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yIGRlcml2ZXMgaXRzIGNhbGxlciBtYXBwaW5ncyBmcm9tIHRoZSBzYW1lIHJlc29sdXRpb24gc28gdGhlIHR3byBjYW5cbiAgLy8gbmV2ZXIgZGlzYWdyZWUgb24gd2hpY2ggQ0kgaWRlbnRpdHkgYXBwbGllcy5cbiAgY2lBZ2VLZXlTZWNyZXROYW1lPzogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWSc7XG59XG5cbmludGVyZmFjZSBGbm94QWdlUmVjaXBpZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwdWJsaWNLZXk6IHN0cmluZztcbn1cblxuLy8gVGhlIGFnZSBwcmluY2lwYWxzIGF1dGhvcml6ZWQgdG8gZGVjcnlwdCBlYWNoIGZub3gtbWFuYWdlZCByZXBvc2l0b3J5LiBUbyBncmFudCBhY2Nlc3MsIGFkZCB0aGVcbi8vIHByaW5jaXBhbCdzIHB1YmxpYyBrZXlzIGFuZCByZXBvc2l0b3J5IHNjb3BlIGhlcmUuIE9yZ2FuaXphdGlvbiBzY29wZXMgaW5jbHVkZSBldmVyeSBjdXJyZW50IGFuZFxuLy8gZnV0dXJlIHJlcG9zaXRvcnkgaW4gdGhhdCBvcmdhbml6YXRpb247IHVzZSByZXBvc2l0b3JpZXMgZm9yIGV4YWN0IG93bmVyL3JlcG9zaXRvcnkgZ3JhbnRzLiBUaGVcbi8vIG5leHQgd2JmeSBydW4gb24gZWFjaCBtYXRjaGluZyByZXBvc2l0b3J5IHJld3JpdGVzIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sIGFuZCByZS1lbmNyeXB0cyBpdHNcbi8vIGNvbW1pdHRlZCBzZWNyZXRzIGZvciB0aGUgcmVzdWx0aW5nIHJlY2lwaWVudCBzZXQuIEEgc2NvcGUncyBvcHRpb25hbCB2aXNpYmlsaXR5IGNvbnN0cmFpbnRcbi8vIHNlbGVjdHMgb25seSBwdWJsaWMgb3Igb25seSBwcml2YXRlIHJlcG9zaXRvcmllcyAodXNlZCB0byBrZWVwIHRoZSBvcmctaW50ZXJuYWwgYW5kIHRoZVxuLy8gcHVibGljLXJlcG9zaXRvcnkgQ0kgaWRlbnRpdGllcyBhcGFydCkuIFJlbW92aW5nIGEgc2NvcGUgY2Fubm90IHJldm9rZSBjaXBoZXJ0ZXh0XG4vLyBhbHJlYWR5IGF2YWlsYWJsZSBmcm9tIEdpdCBoaXN0b3J5LCBzbyByb3RhdGUgdGhlIHNlY3JldCB2YWx1ZXMgdGhhdCBwcmluY2lwYWwgY291bGQgZGVjcnlwdC5cbi8vIE9ubHkgcHVibGljIGtleXMgbWF5IGFwcGVhciBoZXJlOyBhIENJIGlkZW50aXR5J3MgcHJpdmF0ZSBrZXkgc3VwcGxpZXMgdGhlIEZOT1hfQUdFX0tFWSAob3IsXG4vLyBmb3IgcHVibGljIHJlcG9zaXRvcmllcywgUFVCTElDX0ZOT1hfQUdFX0tFWSkgb3JnYW5pemF0aW9uIHNlY3JldC5cbmV4cG9ydCBjb25zdCBGTk9YX0FHRV9QUklOQ0lQQUxTID0gW1xuICB7XG4gICAgbmFtZTogJ2V4a2F6dXUnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWoyMzU0eGh2bTNmdjl5Nzd0NWc2eTNxOG1leGdrMm1mMDB0Z3JremdwNzN0eW5ydno1NXM4YXVheXcnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncG9uaGFydScsXG4gICAgcHVibGljS2V5czogW1xuICAgICAgJ2FnZTE4cnVnbGRmOWh0YzZ1bTVlcGxweDI3azUzZXA0em4wbGh6d2ZmZ254emhycTBjN3pndnlxM3pjY2R5JyxcbiAgICAgICdhZ2Uxbnoybjk5Y3JqcjducDl4amdsd2ZmZmMzZHVkNDVkaGV3cXpxZnpwenRrZHd1NGhqNzRncTZlbDUzMycsXG4gICAgXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICAvLyBUaGUgb3JnLWludGVybmFsIENJIGlkZW50aXR5ICh0aGUgRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2IudHh0KS5cbiAgICBuYW1lOiAnY2knLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWEyYzZlZjZhaGw2bW1raGdxdHhnMG1ndGQ3eXNzcG50cTdyeHVzdjI2ZWZ4aG51aGxjZHNyOWRwYWsnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddLCB2aXNpYmlsaXR5OiAncHJpdmF0ZScgfSxcbiAgICBjaUFnZUtleVNlY3JldE5hbWU6ICdGTk9YX0FHRV9LRVknLFxuICB9LFxuICB7XG4gICAgLy8gVGhlIENJIGlkZW50aXR5IGRlZGljYXRlZCB0byBwdWJsaWMgcmVwb3NpdG9yaWVzICh0aGUgUFVCTElDX0ZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb25cbiAgICAvLyBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2ItcHVibGljLnR4dCkuIFNjb3BlZCB0byBXaWxsQm9vc3RlciBvbmx5IGJlY2F1c2UgdGhlXG4gICAgLy8gUFVCTElDX0ZOT1hfQUdFX0tFWSBzZWNyZXQgaXMgcmVnaXN0ZXJlZCBpbiB0aGF0IG9yZ2FuaXphdGlvbiBhbG9uZTsgYSBwdWJsaWNcbiAgICAvLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5IHJlc29sdmVzIE5PIENJIGlkZW50aXR5IGFuZCBnZW5lcmF0ZUZub3hUb21sIGZhaWxzIGNsb3NlZCBvbiBpdFxuICAgIC8vIChXaWxsQm9vc3RlckxhYiBkb2VzIG93biBwdWJsaWMgcmVwb3NpdG9yaWVzLCBlLmcuIGl0cyByZXVzYWJsZS13b3JrZmxvd3Mgc3luYyBtaXJyb3IsIGJ1dFxuICAgIC8vIG5vbmUgb2YgdGhlbSB1c2UgZm5veCDigJQgcmVnaXN0ZXIgdGhlIHNlY3JldCB0aGVyZSBhbmQgZXh0ZW5kIHRoaXMgc2NvcGUgaWYgb25lIGV2ZXIgZG9lcykuXG4gICAgbmFtZTogJ2NpLXB1YmxpYycsXG4gICAgcHVibGljS2V5czogWydhZ2UxZmhlYTg1eGp3cDg5bHdxM2pjbndqMzJzd2gzdjI0cHdwYXJxaDVsN3FrZ3ZjNGF4M3AwcWw2ZHUzNiddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJ10sIHZpc2liaWxpdHk6ICdwdWJsaWMnIH0sXG4gICAgY2lBZ2VLZXlTZWNyZXROYW1lOiAnUFVCTElDX0ZOT1hfQUdFX0tFWScsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncmVtaW4nLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW13NHB6OWR1ank5ZG1oazBwYWxxYXdqa2o3bTRrN3p4Nzh5cjlmanQ2M3NhNWwzZTQzdXE2bncwMDQnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYXJpZXMnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW5uMGVoeWFlbnlxOGttbnE0Mjk0a3p6Z3h2NWRuZjZwZXAyY2RrcmF4emZxbGs3eGdzcnFxbjZubjknXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogW1xuICAgICAgICAnV2lsbEJvb3N0ZXIvYWdlbnQtY2hhbGxlbmdlcycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9hZ2VudGljLXdvcmtmbG93cy1kYXNoYm9hcmQnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvY2hlZXJsaW5ncycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL3Byb21wdC1zdHVkeScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9leGVyY29kZScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9qdWRnZScsXG4gICAgICBdLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnc3VuYWdhJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTF1bHh6bjZ5NjhrdTM0Y3B4NWZ5YTVnZjdybnJ3ejB1ZmxueWU2dXh1aGczNHAybmpoZ2txbWc3M2c0J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFsnV2lsbEJvb3N0ZXIvYWktb2NyJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdheWFtZScsXG4gICAgcHVibGljS2V5czogWydhZ2UxdnhtMmdzMDAzcnV3bThwNmgzaHY3eGFzanUyczhrNG14bWMzNHptNmdyZHd6bnJzMDlucTZ4ejV2eiddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbJ1dpbGxCb29zdGVyL2FpLW9jcicsICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IEZub3hBZ2VQcmluY2lwYWxbXTtcblxuaW50ZXJmYWNlIEZub3hUb21sIHtcbiAgaW1wb3J0PzogdW5rbm93bjtcbiAgcHJvdmlkZXJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+O1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxubGV0IGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG5sZXQgbWlncmF0aW9uTWFya2VyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG5cbi8qKiBXaGV0aGVyIGFueSBmbm94IHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gZmFpbGVkIGluIHRoZSBjdXJyZW50IHJlcG9zaXRvcnk7IHNldHVwU2VjcmV0cyBtdXN0IG5vdCB1cGxvYWQgdGhlbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGbm94U3luY0ZhaWxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZub3hTeW5jRmFpbGVkO1xufVxuXG4vKipcbiAqIFN5bmNocm9uaXplcyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gZXZlcnkgZm5veC50b21sIHdpdGggdGhlIHByaW5jaXBhbHMgYXV0aG9yaXplZCBmb3IgdGhpc1xuICogcmVwb3NpdG9yeSBhbmQgcmUtZW5jcnlwdHMgdGhlIGNvbW1pdHRlZCBzZWNyZXRzIHdoZW4gdGhlIHJlY2lwaWVudCBzZXQgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRm5veFRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGhlIGZhaWx1cmUgZmxhZyBpcyBwZXIgcmVwb3NpdG9yeTogd2JmeSBjYW4gcHJvY2VzcyBtdWx0aXBsZSB3b3JraW5nIGRpcmVjdG9yaWVzIGluIG9uZVxuICAgIC8vIGludm9jYXRpb24sIGFuZCBhbiBlYXJsaWVyIHJlcG9zaXRvcnkncyBmYWlsdXJlIG11c3Qgbm90IHZldG8gYSBsYXRlciByZXBvc2l0b3J5J3MgdXBsb2FkLlxuICAgIGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG4gICAgLy8gQSByZXBvc2l0b3J5IG91dHNpZGUgV2lsbEJvb3N0ZXIvV2lsbEJvb3N0ZXJMYWIgbWFuYWdlcyBpdHMgb3duIHJlY2lwaWVudCBzZXQgKGUuZy4gYVxuICAgIC8vIHBlcnNvbmFsIHJlcG9zaXRvcnkgd2l0aCBpdHMgb3duIENJIGlkZW50aXR5KSwgc28gcmV3cml0aW5nIGl0IHRvIHRoZSBvcmcgcm9zdGVyIHdvdWxkIGdyYW50XG4gICAgLy8gb3JnIG1lbWJlcnMgYWNjZXNzIGFuZCByZS1lbmNyeXB0IHNlY3JldHMgZm9yIGEgQ0kga2V5IHRoYXQgcmVwb3NpdG9yeSBkb2VzIG5vdCB1c2UuXG4gICAgLy8gc2V0dXBTZWNyZXRzIG5ldmVyIHVwbG9hZHMgc2VjcmV0cyBmb3Igc3VjaCByZXBvc2l0b3JpZXMgZWl0aGVyLCBzbyBza2lwIGVudGlyZWx5LlxuICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbykgcmV0dXJuO1xuICAgIGNvbnN0IGFnZVJlY2lwaWVudHMgPSBnZXRGbm94QWdlUmVjaXBpZW50cyhyb290Q29uZmlnKTtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIEEgbmVzdGVkLW9ubHkgZm5veCBsYXlvdXQgaXMgdW5zdXBwb3J0ZWQ6IHNldHVwU2VjcmV0cyB3b3VsZCB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmRcbiAgICAgIC8vIGRlbGV0ZSBGTk9YX0FHRV9LRVkgZXZlbiB0aG91Z2ggdGhlIG5lc3RlZCBjb25maWcncyBDSSBzdGlsbCBuZWVkcyBpdC5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIE9ubHkgYWdlLXVzaW5nIGNvbmZpZ3MgY2FycnkgdGhhdCByaXNrLiBXaXRob3V0IGEgcm9vdCBwcm92aWRpbmcgdGhlIGFnZSBwcm92aWRlciwgYVxuICAgICAgICAvLyBzdHJheSBjb25maWcgdGhhdCBkZWNsYXJlcyBub25lIHVzZXMgbm8gYWdlIGVuY3J5cHRpb24gYXQgYWxsIChlLmcuIGEgcGxhaW50ZXh0IHRlc3RcbiAgICAgICAgLy8gZml4dHVyZSBvciBleGFtcGxlIGNvbmZpZyBhbnkgcmVwb3NpdG9yeSBtYXkgbGVnaXRpbWF0ZWx5IGNvbW1pdCksIHNvIGl0IG5laXRoZXIgbmVlZHNcbiAgICAgICAgLy8gcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBub3Igb3ducyBhbiBGTk9YX0FHRV9LRVkgYW5kIG11c3Qgbm90IGJsb2NrIHRoZSBydW4uXG4gICAgICAgIGNvbnN0IHN0cmF5RmlsZVBhdGhzID0gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoKS5maWx0ZXIoKGZpbGVQYXRoKSA9PlxuICAgICAgICAgIGRlY2xhcmVzRm5veEFnZVByb3ZpZGVyKGZpbGVQYXRoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoc3RyYXlGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggY29uZmlncyBleGlzdCB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWw6ICR7c3RyYXlGaWxlUGF0aHMuam9pbignLCAnKX0uIEFkZCBhIHJvb3QgZm5veC50b21sLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGYWlsIGNsb3NlZDogd2l0aG91dCBnaXQgaW5mb3JtYXRpb24gYSBuZXN0ZWQtb25seSBmbm94IGxheW91dCBjYW5ub3QgYmUgcnVsZWQgb3V0LCBhbmRcbiAgICAgICAgLy8gc2V0dXBTZWNyZXRzIHdvdWxkIG90aGVyd2lzZSB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmQgZGVsZXRlIEZOT1hfQUdFX0tFWS5cbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY2hlY2sgZm9yIG5lc3RlZCBmbm94IGNvbmZpZ3MgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3J9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIGZhaWxlZCB2aXNpYmlsaXR5IGxvb2t1cCBjb2xsYXBzZXMgaXNQdWJsaWNSZXBvIHRvIGZhbHNlLCB3aGljaCB3b3VsZCBzaWxlbnRseSByZS1lbmNyeXB0XG4gICAgLy8gYSBwdWJsaWMgcmVwb3NpdG9yeSdzIHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzIHRvIHRoZSBvcmctaW50ZXJuYWwgQ0kgaWRlbnRpdHkgKGFuZCB2aWNlXG4gICAgLy8gdmVyc2EgZHJvcCB0aGUgcHVibGljIG9uZSkuIEZhaWwgaW5zdGVhZCBvZiBndWVzc2luZyB3aGVuZXZlciB2aXNpYmlsaXR5IGNoYW5nZXMgdGhlIHJvc3Rlci5cbiAgICBpZiAoIXJvb3RDb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duICYmIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KHJvb3RDb25maWcpKSB7XG4gICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIHRoZSB2aXNpYmlsaXR5IG9mICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChHaXRIdWIgbG9va3VwIGZhaWxlZCkgYW5kIHRoZSBDSSByZWNpcGllbnQgZGVwZW5kcyBvbiBpdC4gQ2hlY2sgbmV0d29yayBhbmQgZ2ggYXV0aGVudGljYXRpb24sIHRoZW4gcmVydW4gd2JmeS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBCb3RoIENJIGlkZW50aXRpZXMgYXJlIHZpc2liaWxpdHktY29uc3RyYWluZWQsIHNvIGEgcmVwb3NpdG9yeSBjYW4gZmFsbCB0aHJvdWdoIEJPVEggKGUuZy4gYVxuICAgIC8vIHB1YmxpYyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5LCB3aG9zZSBvcmdhbml6YXRpb24gaGFzIG5vIFBVQkxJQ19GTk9YX0FHRV9LRVkgc2VjcmV0KS5cbiAgICAvLyBSZS1lbmNyeXB0aW5nIGZvciBhIHJvc3RlciB3aXRob3V0IGEgQ0kgaWRlbnRpdHkgd291bGQgbGVhdmUgQ0kgdW5hYmxlIHRvIGRlY3J5cHQgYW55dGhpbmcsXG4gICAgLy8gZmFpbGluZyBvbmx5IGF0IHJ1bnRpbWUgaW4gQWN0aW9uczsgZmFpbCBsb3VkbHkgaGVyZSBpbnN0ZWFkLlxuICAgIGlmICghcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUocm9vdENvbmZpZykpIHtcbiAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2Ugbm8gQ0kgaWRlbnRpdHkgaXMgc2NvcGVkIHRvICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IChwdWJsaWMgcmVwb3NpdG9yaWVzIGFyZSBzdXBwb3J0ZWQgb25seSBpbiB0aGUgV2lsbEJvb3N0ZXIgb3JnYW5pemF0aW9uKS4gUHJvdmlzaW9uIHRoZSBtYXRjaGluZyBvcmdhbml6YXRpb24gc2VjcmV0IGFuZCBleHRlbmQgdGhlIENJIHNjb3BlcyBpbiB3YmZ5IGZpcnN0LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSBtaWdyYXRpb24gaXMgdHJhbnNhY3Rpb25hbCBvdmVyIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sOiByZXJ1bnMgbXVzdCByZXRyeSBmcm9tIHRoZVxuICAgIC8vIG9yaWdpbmFsIHN0YXRlLCBhbmQgYSBwYXJ0aWFsbHkgbWlncmF0ZWQgdHJlZSBjb3VsZCBvdGhlcndpc2UgYmVjb21lIHVuZGVjcnlwdGFibGUgZm9yIHRoZVxuICAgIC8vIGlkZW50aXR5IHBlcmZvcm1pbmcgYSBsYXRlciByZXRyeSAoZS5nLiB3aGVuIGEgcmVjaXBpZW50IGlzIGJlaW5nIHJlbW92ZWQpLlxuICAgIGNvbnN0IHNuYXBzaG90cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgLy8gQSBmYWlsZWQgc3luY2hyb25pemF0aW9uIG11c3QgZmFpbCB0aGUgd2hvbGUgd2JmeSBydW46IGV4aXRpbmcgemVybyB3aXRoIHN0YWxlIHJlY2lwaWVudHNcbiAgICAvLyB3b3VsZCBsZWF2ZSBzZWNyZXRzIHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzIHdoaWxlIGxvb2tpbmcgc3VjY2Vzc2Z1bC5cbiAgICB0cnkge1xuICAgICAgLy8gQW55IGZub3ggY29uZmlnIChpbmNsdWRpbmcgYWxpYXNlcyBhbmQgbG9jYWwgb3ZlcnJpZGVzKSBpbiBhbiBhbmNlc3RvciBkaXJlY3Rvcnkgd291bGRcbiAgICAgIC8vIG1lcmdlIGludG8gKGFuZCBwb3NzaWJseSBiZSBSRVdSSVRURU4gYnkpIHRoaXMgcmVwb3NpdG9yeSdzIGBmbm94IHJlZW5jcnlwdGAgdGhyb3VnaFxuICAgICAgLy8gaGllcmFyY2hpY2FsIGxvYWRpbmcsIHVzaW5nIHRoaXMgcmVwb3NpdG9yeSdzIHJlY2lwaWVudCBzZXQgZm9yIGZvcmVpZ24gc2VjcmV0cy5cbiAgICAgIGZvciAobGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUocm9vdERpclBhdGgpOyA7IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JGbm94RmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpO1xuICAgICAgICBpZiAoYW5jZXN0b3JGbm94RmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBhbiBhbmNlc3RvciBkaXJlY3RvcnkgY29udGFpbnMgZm5veCBjb25maWdzIHRoYXQgZm5veCB3b3VsZCBoaWVyYXJjaGljYWxseSBtZXJnZSBhbmQgcmV3cml0ZTogJHthbmNlc3RvckZub3hGaWxlTmFtZXNcbiAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX0uIFJlbW92ZSB0aGVtIG9yIG1vdmUgdGhlIHJlcG9zaXRvcnkuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmRpcm5hbWUoZGlyUGF0aCkgPT09IGRpclBhdGgpIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gZm5veCBhbHNvIGxvYWRzIGNvbW1pdHRlZCBjb25maWcgYWxpYXNlcyB0aGlzIGdlbmVyYXRvciBjYW5ub3Qga2VlcCBpbiBzeW5jLlxuICAgICAgY29uc3QgZm5veExpa2VGaWxlUGF0aHMgPSBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGgpO1xuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRGaWxlUGF0aHMgPSBmbm94TGlrZUZpbGVQYXRocy5maWx0ZXIoKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSAhPT0gJ2Zub3gudG9tbCcpO1xuICAgICAgaWYgKHVuc3VwcG9ydGVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIG9ubHkgZm5veC50b21sIGZpbGVzIGFyZSBzdXBwb3J0ZWQ6ICR7dW5zdXBwb3J0ZWRGaWxlUGF0aHMuam9pbignLCAnKX0uIE1lcmdlIHRoZW0gaW50byB0aGUgYWRqYWNlbnQgZm5veC50b21sLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGlyUGF0aHMgPSBsaXN0Rm5veFRvbWxEaXJQYXRocyhmbm94TGlrZUZpbGVQYXRocyk7XG4gICAgICBpZiAoIWRpclBhdGhzLmluY2x1ZGVzKHJvb3REaXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKX0gaXMgaW52aXNpYmxlIHRvIGdpdCAoZ2l0aWdub3JlZD8pLiBDb21taXQgaXQgb3IgcmVtb3ZlIGl0LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gR2l0LWJhc2VkIGRpc2NvdmVyeSBjYW5ub3Qgc2VlIGdpdGlnbm9yZWQgZmlsZXMsIHNvIGFsc28gaW5zcGVjdCBldmVyeSBkaXJlY3RvcnkgaW4gZWFjaFxuICAgICAgLy8gbWFuYWdlZCBjb25maWcncyBoaWVyYXJjaHkgdGhyb3VnaCB0aGUgZmlsZXN5c3RlbTogYSBnaXRpZ25vcmVkIGFsaWFzIChlLmcuIC5mbm94LnRvbWwpXG4gICAgICAvLyBvciBhIGdpdGlnbm9yZWQgZm5veC50b21sIGluIGFuIGludGVybWVkaWF0ZSBkaXJlY3Rvcnkgd291bGQgc3RpbGwgYmUgbG9hZGVkIGJ5IGZub3ggYW5kXG4gICAgICAvLyBjb3VsZCBvdmVycmlkZSB0aGUgcHJvdmlkZXIgdXNlZCBmb3IgbmVzdGVkIHJlLWVuY3J5cHRpb24uXG4gICAgICBjb25zdCBtYW5hZ2VkRGlyUGF0aHMgPSBuZXcgU2V0KGRpclBhdGhzKTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBmb3IgKGNvbnN0IGhpZXJhcmNoeURpclBhdGggb2YgbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aCwgcm9vdERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3Qgc3RyYXlGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoaGllcmFyY2h5RGlyUGF0aCkuZmlsdGVyKFxuICAgICAgICAgICAgKG5hbWUpID0+IG5hbWUgIT09ICdmbm94LmxvY2FsLnRvbWwnICYmICEobmFtZSA9PT0gJ2Zub3gudG9tbCcgJiYgbWFuYWdlZERpclBhdGhzLmhhcyhoaWVyYXJjaHlEaXJQYXRoKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzdHJheUZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggd291bGQgbG9hZCB1bm1hbmFnZWQgKGdpdGlnbm9yZWQ/KSBjb25maWdzOiAke3N0cmF5RmlsZU5hbWVzXG4gICAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGhpZXJhcmNoeURpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpfS4gQ29tbWl0IHRoZW0gYXMgZm5veC50b21sIG9yIHJlbW92ZSB0aGVtLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEEgZm5veC5sb2NhbC50b21sIGFueXdoZXJlIGluIHRoZSBtZXJnZWQgaGllcmFyY2h5IChub3Qgb25seSBuZXh0IHRvIGEgbWFuYWdlZFxuICAgICAgICAgIC8vIGNvbmZpZykgY2FuIG92ZXJyaWRlIHByb3ZpZGVycy5cbiAgICAgICAgICBjb25zdCBsb2NhbElzc3VlID0gZmluZEZub3hMb2NhbFRvbWxJc3N1ZShoaWVyYXJjaHlEaXJQYXRoKTtcbiAgICAgICAgICBpZiAobG9jYWxJc3N1ZSkge1xuICAgICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2xvY2FsSXNzdWV9LiBLZWVwIG9ubHkgbWFjaGluZS1sb2NhbCBzZWNyZXQgb3ZlcnJpZGVzIHRoZXJlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW4tbWVtb3J5IHNuYXBzaG90cyBkbyBub3Qgc3Vydml2ZSBhIGtpbGxlZCBwcm9jZXNzLCBzbyBhIGR1cmFibGUgbWFya2VyIGlzIHdyaXR0ZW5cbiAgICAgIC8vIGJlZm9yZSB0aGUgZmlyc3QgbXV0YXRpb24gYW5kIHJlbW92ZWQgb25seSB3aGVuIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQgYWdhaW4uIEEgbGVmdG92ZXJcbiAgICAgIC8vIG1hcmtlciBtZWFucyBhIHByZXZpb3VzIHJ1biB3YXMga2lsbGVkIG1pZC1taWdyYXRpb24gKG9yIGNvdWxkIG5vdCByZXN0b3JlKTogc29tZVxuICAgICAgLy8gY2lwaGVydGV4dHMgbWF5IG5vdCBtYXRjaCB0aGUgcmVjaXBpZW50cywgb3IgbWF5IGV2ZW4gYmUgdW5kZWNyeXB0YWJsZSBmb3IgdGhlIGV4ZWN1dG9yJ3NcbiAgICAgIC8vIGlkZW50aXR5IHdoZW4gYSByZWNpcGllbnQgd2FzIGJlaW5nIHJlbW92ZWQg4oCUIHN0YXRlcyB0aGlzIGNvZGUgY2Fubm90IHJlcGFpciBzYWZlbHlcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHdvcmtpbmcgdHJlZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIChicmFuY2ggc3dpdGNoZXMsIG1hbnVhbCBlZGl0cykuIFRoZVxuICAgICAgLy8gZm5veC50b21sIGZpbGVzIGFyZSBnaXQtdHJhY2tlZCwgc28gdGhlIHVzZXIgcmVzdG9yZXMgdGhlbSB2aWEgZ2l0IGFuZCBjbGVhcnMgdGhlIG1hcmtlci5cbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICcudG1wJywgJ3diZnktZm5veC1taWdyYXRpb24tbWFya2VyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgYSBwcmV2aW91cyBtaWdyYXRpb24gd2FzIGludGVycnVwdGVkLiBSZXN0b3JlIHRoZSBmbm94LnRvbWwgZmlsZXMgdmlhIGdpdCAoZS5nLiBcXGBnaXQgc3RhdHVzXFxgIGFuZCBcXGBnaXQgcmVzdG9yZSAtLSAnKmZub3gqLnRvbWwnXFxgIGlmIHlvdSBoYXZlIG5vIGludGVudGlvbmFsIGxvY2FsIGNoYW5nZXMpLCB0aGVuIGRlbGV0ZSAke21pZ3JhdGlvbk1hcmtlclBhdGh9IGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHRyYWNrZWQgc3ltbGluayBuYW1lZCBmbm94LnRvbWwgKG9yIGEgc3ltbGlua2VkIHBhcmVudCBkaXJlY3RvcnkpIHdvdWxkIG1ha2UgdGhlXG4gICAgICAvLyByZXdyaXRlIGFuZCBgZm5veCByZWVuY3J5cHRgIHJlYWQgYW5kIE1PRElGWSBmaWxlcyBvdXRzaWRlIHRoaXMgcmVwb3NpdG9yeS5cbiAgICAgIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAgICAgY29uc3QgcmVhbFBhdGggPSBmcy5yZWFscGF0aFN5bmMoZm5veFRvbWxQYXRoKTtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmbm94VG9tbFBhdGgpLmlzU3ltYm9saWNMaW5rKCkgfHwgIXJlYWxQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtmbm94VG9tbFBhdGh9IGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5ICgke3JlYWxQYXRofSkuIFJlcGxhY2UgaXQgd2l0aCBhIHJlZ3VsYXIgaW4tcmVwb3NpdG9yeSBmaWxlLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzbmFwc2hvdHMuc2V0KGZub3hUb21sUGF0aCwgZnMucmVhZEZpbGVTeW5jKGZub3hUb21sUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNvcnRlZCBvcmRlciBwcm9jZXNzZXMgYW5jZXN0b3JzIGJlZm9yZSBkZXNjZW5kYW50cywgc28gY29uZmlncyBpbmhlcml0aW5nIGFuIHVwZGF0ZWRcbiAgICAgIC8vIHByb3ZpZGVyIHJlLWVuY3J5cHQgYWdhaW5zdCB0aGUgYWxyZWFkeS11cGRhdGVkIHJlY2lwaWVudHMuXG4gICAgICBjb25zdCBjaGFuZ2VkRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBsZXQgYW55RmFpbGVkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JDaGFuZ2VkID0gY2hhbmdlZERpclBhdGhzLnNvbWUoKGNoYW5nZWREaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoY2hhbmdlZERpclBhdGggKyBwYXRoLnNlcCkpO1xuICAgICAgICAvLyBFdmVyeSBkaXJQYXRoIHdhcyBzbmFwc2hvdHRlZCBhYm92ZS4gQSBtaXNzaW5nIHNuYXBzaG90IG11c3QgZmFpbCBoYXJkOiBmYWxsaW5nIGJhY2sgdG9cbiAgICAgICAgLy8gYW4gZW1wdHkgc3RyaW5nIHdvdWxkIGZsb3cgaW50byByZXBsYWNlQWdlUmVjaXBpZW50cyBhbmQgb3ZlcndyaXRlIHRoZSByZWFsIGZub3gudG9tbFxuICAgICAgICAvLyB3aXRoIGEgcmVjaXBpZW50cy1vbmx5IGZpbGUsIGRlc3Ryb3lpbmcgZXZlcnkgY29tbWl0dGVkIHNlY3JldC5cbiAgICAgICAgY29uc3Qgc25hcHNob3RDb250ZW50ID0gc25hcHNob3RzLmdldChwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICAgICAgaWYgKHNuYXBzaG90Q29udGVudCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZm5veC50b21sIHNuYXBzaG90IGZvciAke2RpclBhdGh9LmApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICAgICAgICAgIGRpclBhdGgsXG4gICAgICAgICAgcm9vdERpclBhdGgsXG4gICAgICAgICAgZGlyUGF0aCA9PT0gcm9vdERpclBhdGgsXG4gICAgICAgICAgYW5jZXN0b3JDaGFuZ2VkLFxuICAgICAgICAgIHNuYXBzaG90Q29udGVudCxcbiAgICAgICAgICBhZ2VSZWNpcGllbnRzXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09ICdjaGFuZ2VkJykgY2hhbmdlZERpclBhdGhzLnB1c2goZGlyUGF0aCk7XG4gICAgICAgIGFueUZhaWxlZCB8fD0gcmVzdWx0ID09PSAnZmFpbGVkJztcbiAgICAgIH1cbiAgICAgIGlmIChhbnlGYWlsZWQpIHtcbiAgICAgICAgLy8gQSBmYWlsZWQgcmUtZW5jcnlwdGlvbiBtYXkgaGF2ZSByZXdyaXR0ZW4gc29tZSBjaXBoZXJ0ZXh0cywgc28gcmVzdG9yZSB1bmNvbmRpdGlvbmFsbHkuXG4gICAgICAgIC8vIFRoZSBtYXJrZXIgaXMgcmVtb3ZlZCBvbmx5IHdoZW4gcmVzdG9yYXRpb24gZnVsbHkgc3VjY2VlZGVkIGFuZCB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LlxuICAgICAgICAvLyBSZXN0b3JlIE9OTFkgd2hlbiB0aGlzIHJ1biBvd25zIHRoZSBtYXJrZXI6IGV2ZXJ5IGNvbW1pdHRlZC1jb25maWcgbXV0YXRpb24gaGFwcGVuc1xuICAgICAgICAvLyBhZnRlciBtYXJrZXIgYWNxdWlzaXRpb24sIHNvIGEgbm9uLW93bmVyIChlLmcuIGxvc2luZyBhIHJhY2UgYWdhaW5zdCBhIGNvbmN1cnJlbnQgd2JmeSlcbiAgICAgICAgLy8gaGFzIGNoYW5nZWQgbm90aGluZyBhbmQgbXVzdCBub3Qgb3ZlcndyaXRlIHRoZSBvd25lcidzIGluLXByb2dyZXNzIG1pZ3JhdGlvbi5cbiAgICAgICAgaWYgKG1pZ3JhdGlvbk1hcmtlck93bmVkICYmIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzKSkgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChtaWdyYXRpb25NYXJrZXJPd25lZCAmJiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90cykpIHtcbiAgICAgICAgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH1cbiAgICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIGlzUm9vdDogYm9vbGVhbixcbiAgYW5jZXN0b3JSZWNpcGllbnRzQ2hhbmdlZDogYm9vbGVhbixcbiAgb3JpZ2luYWxDb250ZW50OiBzdHJpbmcsXG4gIGFnZVJlY2lwaWVudHM6IHJlYWRvbmx5IEZub3hBZ2VSZWNpcGllbnRbXVxuKTogUHJvbWlzZTwnY2hhbmdlZCcgfCAndW5jaGFuZ2VkJyB8ICdmYWlsZWQnPiB7XG4gIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJyk7XG5cbiAgLy8gUmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBvbmx5IHVuZGVyc3RhbmRzIHRoZSBzdGFuZGFyZCBzaW5nbGUtZmlsZSBsYXlvdXQgd2l0aCBvbmVcbiAgLy8gdG9wLWxldmVsIGFnZSBwcm92aWRlciBuYW1lZCBgYWdlYC4gR2l0aWdub3JlZCBjb25maWcgYWxpYXNlcyAoZS5nLiAuZm5veC5sb2NhbC50b21sKSB0aGF0XG4gIC8vIGdpdC1iYXNlZCBkaXNjb3ZlcnkgY2Fubm90IHNlZSwgaW1wb3J0cywgZGlmZmVyZW50bHkgbmFtZWQgYWdlIHByb3ZpZGVycywgb3IgcHJvdmlkZXJcbiAgLy8gb3ZlcnJpZGVzIHdvdWxkIGtlZXAgdXNpbmcgcmVjaXBpZW50IHNldHMgdGhpcyBnZW5lcmF0b3IgZG9lcyBub3QgcmV3cml0ZSwgc28gdGhlaXIgc2VjcmV0c1xuICAvLyB3b3VsZCBzaWxlbnRseSBzdGF5IHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzOyBmYWlsIGluc3RlYWQgb2YgcHJvY2VlZGluZy4gVGhlXG4gIC8vIGdpdGlnbm9yZWQgZm5veC5sb2NhbC50b21sIGlzIGEgc3VwcG9ydGVkIG1hY2hpbmUtbG9jYWwgb3ZlcnJpZGUsIGJ1dCBvbmx5IHdoaWxlIGl0IGxlYXZlc1xuICAvLyBwcm92aWRlcnMgYWxvbmUuXG4gIGNvbnN0IHVuc3VwcG9ydGVkRmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpLmZpbHRlcihcbiAgICAobmFtZSkgPT4gbmFtZSAhPT0gJ2Zub3gudG9tbCcgJiYgbmFtZSAhPT0gJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbiAgaWYgKHVuc3VwcG9ydGVkRmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBmYWlsRm5veFN5bmMoXG4gICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgaW4gJHtkaXJQYXRofSBiZWNhdXNlIG9ubHkgZm5veC50b21sIGFuZCBmbm94LmxvY2FsLnRvbWwgYXJlIHN1cHBvcnRlZDogJHt1bnN1cHBvcnRlZEZpbGVOYW1lcy5qb2luKCcsICcpfS4gTWVyZ2UgdGhlbSBpbnRvIGZub3gudG9tbC5gXG4gICAgKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgLy8gQSBzdGFsZSBiYWNrdXAgbGVmdCBieSBhbiBpbnRlcnJ1cHRlZCBlYXJsaWVyIHJ1biBtdXN0IGJlIHJlc3RvcmVkIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAgLy8gb3ZlcnJpZGVzIGFyZSBuZXZlciBzaWxlbnRseSBsb3N0ICh0aGUgbWlncmF0aW9uIG1hcmtlciBzZXBhcmF0ZWx5IGJsb2NrcyB0aGlzIHJ1biB3aGVuIHRoZVxuICAvLyBpbnRlcnJ1cHRpb24gbGVmdCB0aGUgbWlncmF0aW9uIGl0c2VsZiBpbmNvbXBsZXRlKS5cbiAgcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcblxuICBjb25zdCBsYXlvdXRJc3N1ZSA9IGZpbmRGbm94TGF5b3V0SXNzdWUob3JpZ2luYWxDb250ZW50KTtcbiAgaWYgKGxheW91dElzc3VlKSB7XG4gICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7Zm5veFRvbWxQYXRofSAke2xheW91dElzc3VlfS5gKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShvcmlnaW5hbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICBjb25zdCBwcm9maWxlTmFtZXMgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSk7XG4gIGNvbnN0IGN1cnJlbnRSZWNpcGllbnRzID0gcmVhZEZub3hBZ2VSZWNpcGllbnRzKG9yaWdpbmFsQ29udGVudCk7XG5cbiAgLy8gQSBuZXN0ZWQgZm5veC50b21sIHdpdGhvdXQgaXRzIG93biBhZ2UgcHJvdmlkZXIgaW5oZXJpdHMgdGhlIG5lYXJlc3QgYW5jZXN0b3IncyBvbmUgdGhyb3VnaFxuICAvLyBmbm94J3MgaGllcmFyY2hpY2FsIGxvYWRpbmcsIHNvIG9ubHkgdGhlIHJvb3QgY29uZmlnIG11c3QgZGVjbGFyZSB0aGUgcHJvdmlkZXIg4oCUIGJ1dCB0aGVcbiAgLy8gbmVzdGVkIGNvbmZpZydzIG93biBjaXBoZXJ0ZXh0cyBzdGlsbCBtdXN0IGJlIHJlLWVuY3J5cHRlZCB3aGVuZXZlciBhbiBhbmNlc3RvcidzIHJlY2lwaWVudHNcbiAgLy8gY2hhbmdlZCwgYW5kIHRoYXQgb25seSBoYXBwZW5zIHdoZW4gYGZub3ggcmVlbmNyeXB0YCBydW5zIGZyb20gdGhlIG5lc3RlZCBkaXJlY3RvcnkuXG4gIGlmICghaXNSb290ICYmICFjdXJyZW50UmVjaXBpZW50cykge1xuICAgIGlmIChhbmNlc3RvclJlY2lwaWVudHNDaGFuZ2VkKSB7XG4gICAgICB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICBpZiAoXG4gICAgY3VycmVudFJlY2lwaWVudHMgJiZcbiAgICBjdXJyZW50UmVjaXBpZW50cy5zaXplID09PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCAmJlxuICAgIGFnZVJlY2lwaWVudHMuZXZlcnkoKHJlY2lwaWVudCkgPT4gY3VycmVudFJlY2lwaWVudHMuaGFzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICAvLyBSZXdyaXRlIG9ubHkgdGhlIHJlY2lwaWVudHMgYXNzaWdubWVudCBzbyB1c2VyLWF1dGhvcmVkIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIHN1cnZpdmUuXG4gIC8vIFJlLXBhcnNlIGJlZm9yZSB3cml0aW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cykgY291bGQgbWFrZSB0aGUgdGV4dHVhbCBlZGl0XG4gIC8vIHByb2R1Y2UgYSBkdXBsaWNhdGUgdGFibGUgb3IgbGVhdmUgdGhlIG9sZCByZWNpcGllbnRzIGluIGVmZmVjdC5cbiAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSByZXBsYWNlQWdlUmVjaXBpZW50cyhvcmlnaW5hbENvbnRlbnQsIGFnZVJlY2lwaWVudHMpO1xuICBjb25zdCB1cGRhdGVkUmVjaXBpZW50cyA9IFsuLi4ocmVhZEZub3hBZ2VSZWNpcGllbnRzKHVwZGF0ZWRDb250ZW50KSA/PyBbXSldO1xuICBpZiAoXG4gICAgdXBkYXRlZFJlY2lwaWVudHMubGVuZ3RoICE9PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCB8fFxuICAgICFhZ2VSZWNpcGllbnRzLmV2ZXJ5KChyZWNpcGllbnQpID0+IHVwZGF0ZWRSZWNpcGllbnRzLmluY2x1ZGVzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJld3JpdGluZyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gJHtmbm94VG9tbFBhdGh9IGRpZCBub3QgdGFrZSBlZmZlY3Q7IHVwZGF0ZSB0aGVtIG1hbnVhbGx5LmApO1xuICB9XG4gIHdyaXRlTWlncmF0aW9uTWFya2VyKCk7XG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCB1cGRhdGVkQ29udGVudCk7XG5cbiAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGNvbmZpZzoga2VlcGluZyB0aGUgbmV3IHJlY2lwaWVudHMgd2l0aCBvbGQgY2lwaGVydGV4dHMgd291bGQgbWFrZVxuICAgIC8vIHRoaXMgZ2VuZXJhdG9yIHNraXAgcmUtZW5jcnlwdGlvbiBmb3JldmVyIGFuZCBsZXQgc2V0dXBTZWNyZXRzIHVwbG9hZCBhIENJIGtleSB0aGF0XG4gICAgLy8gY2Fubm90IGRlY3J5cHQgYW55dGhpbmcuIFRoZSBvbGQgY2lwaGVydGV4dHMgcmVtYWluIHZhbGlkIGZvciB0aGUgb2xkIHJlY2lwaWVudHMuXG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gICAgZmFpbEZub3hTeW5jKFxuICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICByZXR1cm4gJ2NoYW5nZWQnO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiBhIGZub3gudG9tbCBsYXlvdXQgdGhhdCByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIGFuZCB0aGUgQ0kta2V5XG4gKiB2ZXJpZmljYXRpb24gY2Fubm90IGNvdmVyLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc3RhbmRhcmQgc2luZ2xlLWZpbGUsIHNpbmdsZS1hZ2UtcHJvdmlkZXJcbiAqIGxheW91dCBpcyB1c2VkLlxuICovXG5mdW5jdGlvbiBmaW5kRm5veExheW91dElzc3VlKGZub3hUb21sQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZub3hUb21sQ29udGVudCkgYXMgRm5veFRvbWw7XG4gICAgaWYgKHNldHRpbmdzLmltcG9ydCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gJ3VzZXMgdGhlIHVuc3VwcG9ydGVkIGBpbXBvcnRgIHNldHRpbmcnO1xuICAgIGNvbnN0IG5vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcyA9IE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnByb3ZpZGVycyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFtuYW1lLCBwcm92aWRlcl0pID0+IChwcm92aWRlcj8udHlwZSA9PT0gJ2FnZScpICE9PSAobmFtZSA9PT0gJ2FnZScpKVxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbiAgICBpZiAobm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgZGVjbGFyZXMgYWdlIHByb3ZpZGVycyBub3QgbmFtZWQgXFxgYWdlXFxgIChvciBhbiBcXGBhZ2VcXGAgcHJvdmlkZXIgb2YgYW5vdGhlciB0eXBlKTogJHtub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICBjb25zdCBwcm9maWxlc1dpdGhQcm92aWRlcnMgPSBPYmplY3QuZW50cmllcyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFssIHByb2ZpbGVdKSA9PiBwcm9maWxlPy5wcm92aWRlcnMpXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuICAgIGlmIChwcm9maWxlc1dpdGhQcm92aWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGBkZWNsYXJlcyB1bnN1cHBvcnRlZCBwcm9maWxlLXNwZWNpZmljIHByb3ZpZGVyczogJHtwcm9maWxlc1dpdGhQcm92aWRlcnMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ2Nhbm5vdCBiZSBwYXJzZWQgYXMgVE9NTCc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgW3Byb3ZpZGVycy5hZ2VdLnJlY2lwaWVudHMgb2YgYSBmbm94LnRvbWwsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBjb25maWcgZGVjbGFyZXMgbm9cbiAqIGFnZSBwcm92aWRlciAobmVzdGVkIGNvbmZpZ3MgdGhlbiBpbmhlcml0IHRoZSByb290IG9uZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRm5veEFnZVJlY2lwaWVudHMoZm5veFRvbWxDb250ZW50OiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmbm94VG9tbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICAgIGlmICghc2V0dGluZ3MucHJvdmlkZXJzPy5hZ2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHNldHRpbmdzLnByb3ZpZGVycy5hZ2UucmVjaXBpZW50cztcbiAgICByZXR1cm4gbmV3IFNldChBcnJheS5pc0FycmF5KHJlY2lwaWVudHMpID8gcmVjaXBpZW50cy5maWx0ZXIoKHIpOiByIGlzIHN0cmluZyA9PiB0eXBlb2YgciA9PT0gJ3N0cmluZycpIDogW10pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBBbiB1bnBhcnNhYmxlIGZub3gudG9tbCB5aWVsZHMgbm8gcmVjaXBpZW50cywgc28gdGhlIGNhbGxlciByZXBvcnRzIGFuIGVycm9yLlxuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cbn1cblxudHlwZSBGbm94UmVwb3NpdG9yeUlkZW50aXR5ID0gUGljazxQYWNrYWdlQ29uZmlnLCAncmVwb0F1dGhvcicgfCAncmVwb05hbWUnIHwgJ2lzUHVibGljUmVwbycgfCAnaXNSZXBvVmlzaWJpbGl0eUtub3duJz47XG5cbi8qKlxuICogVGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyB0aGUgcHJpdmF0ZSBrZXkgb2YgdGhlIENJIGlkZW50aXR5IHNjb3BlZCB0byB0aGUgcmVwb3NpdG9yeSwgb3JcbiAqIHVuZGVmaW5lZCB3aGVuIG5vbmUgaXMgKGFuIHVua25vd24gdmlzaWJpbGl0eSwgb3IgYSByZXBvc2l0b3J5IG5vIENJIHNjb3BlIGNvdmVycykuIFRoZSBzaW5nbGVcbiAqIHNvdXJjZSBvZiB0cnV0aCBzaGFyZWQgYnkgdGhlIHJlY2lwaWVudCBzeW5jIGFuZCB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3MgY2FsbGVyIG1hcHBpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoXG4gIGNvbmZpZzogRm5veFJlcG9zaXRvcnlJZGVudGl0eVxuKTogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWScgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaVByaW5jaXBhbDogRm5veEFnZVByaW5jaXBhbCB8IHVuZGVmaW5lZCA9IEZOT1hfQUdFX1BSSU5DSVBBTFMuZmluZChcbiAgICAocHJpbmNpcGFsOiBGbm94QWdlUHJpbmNpcGFsKSA9PlxuICAgICAgcHJpbmNpcGFsLmNpQWdlS2V5U2VjcmV0TmFtZSAmJiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCBjb25maWcpXG4gICk7XG4gIHJldHVybiBjaVByaW5jaXBhbD8uY2lBZ2VLZXlTZWNyZXROYW1lO1xufVxuXG4vKiogV2hldGhlciB0aGUgcmVjaXBpZW50IHNldCBkaWZmZXJzIGJldHdlZW4gdGhlIHB1YmxpYyBhbmQgcHJpdmF0ZSByZWFkaW5nIG9mIHRoZSByZXBvc2l0b3J5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KFxuICByb290Q29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdyZXBvQXV0aG9yJyB8ICdyZXBvTmFtZSc+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgcHVibGljS2V5c0ZvciA9IChpc1B1YmxpY1JlcG86IGJvb2xlYW4pOiBzdHJpbmcgPT5cbiAgICBnZXRGbm94QWdlUmVjaXBpZW50cyh7IC4uLnJvb3RDb25maWcsIGlzUHVibGljUmVwbywgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0cnVlIH0pXG4gICAgICAubWFwKCh7IHB1YmxpY0tleSB9KSA9PiBwdWJsaWNLZXkpXG4gICAgICAuam9pbignXFxuJyk7XG4gIHJldHVybiBwdWJsaWNLZXlzRm9yKHRydWUpICE9PSBwdWJsaWNLZXlzRm9yKGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZub3hBZ2VSZWNpcGllbnRzKHJvb3RDb25maWc6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHkpOiBGbm94QWdlUmVjaXBpZW50W10ge1xuICByZXR1cm4gRk5PWF9BR0VfUFJJTkNJUEFMUy5maWx0ZXIoKHByaW5jaXBhbCkgPT5cbiAgICBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCByb290Q29uZmlnKVxuICApLmZsYXRNYXAoKHByaW5jaXBhbCkgPT5cbiAgICBwcmluY2lwYWwucHVibGljS2V5cy5tYXAoKHB1YmxpY0tleSwgaW5kZXgpID0+ICh7XG4gICAgICBuYW1lOiBwcmluY2lwYWwucHVibGljS2V5cy5sZW5ndGggPT09IDEgPyBwcmluY2lwYWwubmFtZSA6IGAke3ByaW5jaXBhbC5uYW1lfSR7aW5kZXggKyAxfWAsXG4gICAgICBwdWJsaWNLZXksXG4gICAgfSkpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShzY29wZTogRm5veFJlcG9zaXRvcnlTY29wZSwgcmVwb3NpdG9yeTogRm5veFJlcG9zaXRvcnlJZGVudGl0eSk6IGJvb2xlYW4ge1xuICBjb25zdCBvd25lciA9IHJlcG9zaXRvcnkucmVwb0F1dGhvcj8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbmFtZSA9IHJlcG9zaXRvcnkucmVwb05hbWU/LnRvTG93ZXJDYXNlKCk7XG4gIGlmICghb3duZXIgfHwgIW5hbWUpIHJldHVybiBmYWxzZTtcblxuICAvLyBBbiB1bmtub3duIHZpc2liaWxpdHkgKGZhaWxlZCBHaXRIdWIgbG9va3VwKSBtYXRjaGVzIG5vIHZpc2liaWxpdHktY29uc3RyYWluZWQgc2NvcGU6IGNhbGxlcnNcbiAgLy8gdGhhdCB3b3VsZCByZXdyaXRlIHJlY2lwaWVudHMgZmFpbCBpbnN0ZWFkIG9mIGVuY3J5cHRpbmcgdG8gdGhlIHdyb25nIENJIGlkZW50aXR5LlxuICBpZiAoXG4gICAgc2NvcGUudmlzaWJpbGl0eSAmJlxuICAgICghcmVwb3NpdG9yeS5pc1JlcG9WaXNpYmlsaXR5S25vd24gfHwgKHNjb3BlLnZpc2liaWxpdHkgPT09ICdwdWJsaWMnKSAhPT0gcmVwb3NpdG9yeS5pc1B1YmxpY1JlcG8pXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgKHNjb3BlLm9yZ2FuaXphdGlvbnM/LnNvbWUoKG9yZ2FuaXphdGlvbikgPT4gb3JnYW5pemF0aW9uLnRvTG93ZXJDYXNlKCkgPT09IG93bmVyKSA/PyBmYWxzZSkgfHxcbiAgICAoc2NvcGUucmVwb3NpdG9yaWVzPy5zb21lKChmdWxsTmFtZSkgPT4gZnVsbE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYCR7b3duZXJ9LyR7bmFtZX1gKSA/PyBmYWxzZSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUFnZVJlY2lwaWVudHMoY29udGVudDogc3RyaW5nLCBhZ2VSZWNpcGllbnRzOiByZWFkb25seSBGbm94QWdlUmVjaXBpZW50W10pOiBzdHJpbmcge1xuICAvLyBUcmFpbGluZyBuYW1lIGNvbW1lbnRzIGxldCBodW1hbnMgdGVsbCB3aG9zZSBrZXkgZWFjaCByZWNpcGllbnQgaXMgd2l0aG91dCBjb25zdWx0aW5nIHdiZnkuXG4gIGNvbnN0IHJlY2lwaWVudHNUZXh0ID0gYHJlY2lwaWVudHMgPSBbXFxuJHthZ2VSZWNpcGllbnRzXG4gICAgLm1hcCgocmVjaXBpZW50KSA9PiBgICBcIiR7cmVjaXBpZW50LnB1YmxpY0tleX1cIiwgIyAke3JlY2lwaWVudC5uYW1lfWApXG4gICAgLmpvaW4oJ1xcbicpfVxcbl1gO1xuICAvLyB3YmZ5IHdyaXRlcyBhIFtwcm92aWRlcnMuYWdlXSB0YWJsZSAocG9zc2libHkgd2l0aCBhIHRyYWlsaW5nIGNvbW1lbnQpLiBTY2FuIGxpbmUtd2lzZSBzbyB0aGF0XG4gIC8vIGEgYFtgIGluc2lkZSBhIGNvbW1lbnQgb3IgYSBzdHJpbmcgbmV2ZXIgdGVybWluYXRlcyB0aGUgdGFibGUgZWFybHk7IHRoZSB0YWJsZSBlbmRzIGF0IHRoZVxuICAvLyBuZXh0IGxpbmUtc3RhcnQgdGFibGUgaGVhZGVyLiBUaGUgYXNzaWdubWVudCBtYXRjaCBpcyBsaW5lLWFuY2hvcmVkIHNvIGEgY29tbWVudGVkLW91dFxuICAvLyBgIyByZWNpcGllbnRzID0gWy4uLl1gIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcmVhbCBvbmUsIHdoaWxlIG11bHRpbGluZSBhcnJheXMgc3RpbGwgbWF0Y2hcbiAgLy8gYmVjYXVzZSB0aGUgbmVnYXRlZCBjbGFzcyBbXlxcXV0gKHVubGlrZSBgLmApIHNwYW5zIG5ld2xpbmVzLiBBbnkgb3RoZXIgc3BlbGxpbmcgZmFsbHMgdGhyb3VnaFxuICAvLyB0byB0aGUgY2FsbGVyJ3MgcmUtcGFyc2UgdmFsaWRhdGlvbiwgd2hpY2ggZmFpbHMgdGhlIHJ1biBzYWZlbHkgd2l0aCBpbnN0cnVjdGlvbnMgaW5zdGVhZCBvZlxuICAvLyBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gL15cXHMqXFxbcHJvdmlkZXJzXFwuYWdlXFxdXFxzKig/OiMuKik/JC91LnRlc3QobGluZSkpO1xuICBpZiAoaGVhZGVySW5kZXggIT09IC0xKSB7XG4gICAgbGV0IGVuZEluZGV4ID0gbGluZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gaGVhZGVySW5kZXggKyAxOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKC9eXFxzKlxcWy91LnRlc3QobGluZXNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgICBlbmRJbmRleCA9IGluZGV4O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VjdGlvbiA9IGxpbmVzLnNsaWNlKGhlYWRlckluZGV4LCBlbmRJbmRleCkuam9pbignXFxuJyk7XG4gICAgY29uc3QgcmVwbGFjZWRTZWN0aW9uID0gc2VjdGlvbi5yZXBsYWNlKC9eXFxzKnJlY2lwaWVudHNcXHMqPVxccypcXFtbXlxcXV0qXFxdL211LCByZWNpcGllbnRzVGV4dCk7XG4gICAgY29uc3QgbmV3U2VjdGlvbiA9XG4gICAgICByZXBsYWNlZFNlY3Rpb24gPT09IHNlY3Rpb25cbiAgICAgICAgPyBbbGluZXNbaGVhZGVySW5kZXhdLCByZWNpcGllbnRzVGV4dCwgLi4ubGluZXMuc2xpY2UoaGVhZGVySW5kZXggKyAxLCBlbmRJbmRleCldLmpvaW4oJ1xcbicpXG4gICAgICAgIDogcmVwbGFjZWRTZWN0aW9uO1xuICAgIHJldHVybiBbLi4ubGluZXMuc2xpY2UoMCwgaGVhZGVySW5kZXgpLCBuZXdTZWN0aW9uLCAuLi5saW5lcy5zbGljZShlbmRJbmRleCldLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bcHJvdmlkZXJzLmFnZV1cXG50eXBlID0gXCJhZ2VcIlxcbiR7cmVjaXBpZW50c1RleHR9XFxuYDtcbn1cblxuLy8gUmUtZW5jcnlwdHMgdGhlIGJhc2Ugc2VjcmV0cyBhbmQgZWFjaCBwcm9maWxlJ3Mgb3duIHNlY3JldHMgKC0tbm8tZGVmYXVsdHMga2VlcHMgdGhlIG1lcmdlZFxuLy8gYmFzZSBzZWNyZXRzIGZyb20gYmVpbmcgZHVwbGljYXRlZCBpbnRvIHByb2ZpbGUgdGFibGVzKSBmb3IgdGhlIGN1cnJlbnQgcmVjaXBpZW50IHNldC4gVGhlXG4vLyBzcGF3bmVkIGZub3ggcnVucyB3aXRoIGFuIGlzb2xhdGVkIEhPTUUvWERHX0NPTkZJR19IT01FIGJlY2F1c2UgZm5veCBtZXJnZXMgdGhlIHVzZXItZ2xvYmFsXG4vLyB+Ly5jb25maWcvZm5veC9jb25maWcudG9tbCBpbnRvIGV2ZXJ5IHByb2plY3QgY29uZmlnIOKAlCBhIHBsYWluIHJlZW5jcnlwdCB3b3VsZCByZXdyaXRlIHRoZVxuLy8gdXNlcidzIGdsb2JhbCBzZWNyZXRzIHRvby4gRGVjcnlwdGlvbiB0aGVyZWZvcmUgbmVlZHMgdGhlIHBlcnNvbmFsIGlkZW50aXR5IHBhc3NlZCBleHBsaWNpdGx5XG4vLyB2aWEgRk5PWF9BR0VfS0VZOyBGTk9YX1BST0ZJTEUgaXMgc3RyaXBwZWQgc28gaXQgY2Fubm90IHJlZGlyZWN0IHRoZSBiYXNlIChubyAtUCkgcnVuLlxuZnVuY3Rpb24gcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nLCBwcm9maWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIFRoZSBpZGVudGl0eSBpcyBvcHRpb25hbDogYSBwbGFpbnRleHQtb25seSBjb25maWcgaGFzIG5vdGhpbmcgdG8gZGVjcnlwdCBhbmQgZm5veCBzdWNjZWVkc1xuICAvLyB3aXRob3V0IG9uZSwgd2hpbGUgZXhpc3RpbmcgY2lwaGVydGV4dHMgbWFrZSBmbm94IGZhaWwgbG91ZGx5IG9uIGl0cyBvd24uXG4gIGNvbnN0IGlkZW50aXR5ID0gcmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KCkgPz8gcHJvY2Vzcy5lbnYuRk5PWF9BR0VfS0VZO1xuICBjb25zdCBmbm94Q29tbWFuZCA9IHJlc29sdmVGbm94Q29tbWFuZChkaXJQYXRoKTtcbiAgY29uc3QgaXNvbGF0ZWRIb21lRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diZnktZm5veC1ob21lLScpKTtcbiAgdHJ5IHtcbiAgICAvLyBIaWRlIHRoZSBsb2NhbCBvdmVycmlkZXMgb2YgRVZFUlkgZGlyZWN0b3J5IGZub3ggbWVyZ2VzIGhpZXJhcmNoaWNhbGx5IChmcm9tIHRoZSBjb21tYW5kXG4gICAgLy8gZGlyZWN0b3J5IHVwIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QpOiBhbiBhbmNlc3RvcidzIGZub3gubG9jYWwudG9tbCB3b3VsZCBvdGhlcndpc2Ugc2hhZG93XG4gICAgLy8gY29tbWl0dGVkIHNlY3JldHMgb3IgaXRzZWxmIGdldCByZXdyaXR0ZW4gYnkgdGhlIHJlLWVuY3J5cHRpb24uXG4gICAgcmV0dXJuIHdpdGhGbm94TG9jYWxzSGlkZGVuKHJvb3REaXJQYXRoLCBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoLCByb290RGlyUGF0aCksICgpID0+IHtcbiAgICAgIGNvbnN0IGVudiA9IHtcbiAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KS5maWx0ZXIoKFtrZXldKSA9PiAha2V5LnN0YXJ0c1dpdGgoJ0ZOT1hfJykpKSxcbiAgICAgICAgLi4uKGlkZW50aXR5ID8geyBGTk9YX0FHRV9LRVk6IGlkZW50aXR5IH0gOiB7fSksXG4gICAgICAgIEhPTUU6IGlzb2xhdGVkSG9tZURpclBhdGgsXG4gICAgICAgIFhER19DT05GSUdfSE9NRTogaXNvbGF0ZWRIb21lRGlyUGF0aCxcbiAgICAgIH07XG4gICAgICBjb25zdCBwcm9maWxlQXJnc0xpc3QgPSBbW10sIC4uLnByb2ZpbGVOYW1lcy5tYXAoKG5hbWUpID0+IFsnLS1uby1kZWZhdWx0cycsIGAtLXByb2ZpbGU9JHtuYW1lfWBdKV07XG4gICAgICBmb3IgKGNvbnN0IHByb2ZpbGVBcmdzIG9mIHByb2ZpbGVBcmdzTGlzdCkge1xuICAgICAgICBjb25zdCBhcmdzID0gWydyZWVuY3J5cHQnLCAnLS1mb3JjZScsICctLW5vLWRhZW1vbicsICctLXByb3ZpZGVyJywgJ2FnZScsIC4uLnByb2ZpbGVBcmdzXTtcbiAgICAgICAgY29uc29sZS5sb2coYCQgJHtmbm94Q29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX0gYXQgJHtkaXJQYXRofWApO1xuICAgICAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoZm5veENvbW1hbmQsIGFyZ3MsIHtcbiAgICAgICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICAgIGVudixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgocHJvYy5zdGF0dXMgPz8gMSkgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyhpc29sYXRlZEhvbWVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGZub3ggYmluYXJ5LiBgZm5veGAgb24gUEFUSCBpcyBvZnRlbiBhIG1pc2Ugc2hpbSwgYW5kIG1pc2UgcmVmdXNlcyB0byBydW5cbiAqIG9uY2UgSE9NRS9YREdfQ09ORklHX0hPTUUgcG9pbnQgYXQgdGhlIGlzb2xhdGVkIGRpcmVjdG9yeSAoaXRzIHRydXN0IHN0YXRlIGRpc2FwcGVhcnMpLCBzbyB0aGVcbiAqIGlzb2xhdGVkIHNwYXducyBuZWVkIHRoZSBzaGltIHJlc29sdmVkIHRvIHRoZSByZWFsIGV4ZWN1dGFibGUgYmVmb3JlaGFuZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUZub3hDb21tYW5kKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnbWlzZScsIFsnd2hpY2gnLCAnZm5veCddLCB7IGN3ZDogZGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwcm9jLnN0YXR1cyA9PT0gMCA/IHByb2Muc3Rkb3V0LnRyaW0oKSA6ICcnO1xuICByZXR1cm4gcmVzb2x2ZWQgfHwgJ2Zub3gnO1xufVxuXG4vLyBUaGUgcGVyc29uYWwgaWRlbnRpdHkgZmlsZSBpcyBtYWNoaW5lLWdsb2JhbCwgc28gaXQgaXMgcmVhZCBvbmNlIHBlciBwcm9jZXNzLlxubGV0IGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGZhbHNlO1xubGV0IGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHJlYWRQZXJzb25hbEFnZVNlY3JldEtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KSByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG4gIGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNvbmZpZycsICdmbm94JywgJ2FnZS50eHQnKSwgJ3V0ZjgnKTtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGNvbnRlbnRcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maW5kKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdBR0UtU0VDUkVULUtFWS0nKSlcbiAgICAgID8udHJpbSgpO1xuICB9IGNhdGNoIHtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG59XG5cbi8qKlxuICogUnVucyBhIGZ1bmN0aW9uIHdoaWxlIHRoZSBtYWNoaW5lLWxvY2FsIGZub3gubG9jYWwudG9tbCBmaWxlcyBvZiB0aGUgZ2l2ZW4gZGlyZWN0b3JpZXMgYXJlXG4gKiB0ZW1wb3JhcmlseSBtb3ZlZCBhc2lkZTogZm5veCBsb2FkcyB0aGVtIGF0IGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBjb21taXR0ZWQgZm5veC50b21sLCBzbyBhXG4gKiBsb2NhbCBvdmVycmlkZSBzaGFkb3dpbmcgYSBjb21taXR0ZWQgc2VjcmV0IHdvdWxkIG1ha2UgYGZub3ggcmVlbmNyeXB0YCBza2lwIHRoYXQgc2VjcmV0LlxuICovXG5mdW5jdGlvbiB3aXRoRm5veExvY2Fsc0hpZGRlbjxUPihyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoczogc3RyaW5nW10sIGZ1bmM6ICgpID0+IFQpOiBUIHtcbiAgY29uc3QgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYmFja3VwUGF0aCA9IGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgICBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICAgICAgZnMucmVuYW1lU3luYyhsb2NhbFBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgICBoaWRkZW5EaXJQYXRocy5wdXNoKGRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgLy8gQSByZXN0b3JhdGlvbiBjb25mbGljdCB0aHJvd3MgaGVyZSBhbmQgdGhlcmVieSBpbnZhbGlkYXRlcyB0aGUgc2VlbWluZ2x5IHN1Y2Nlc3NmdWwgcmVzdWx0OlxuICAgIC8vIGEgcmVjcmVhdGVkIG92ZXJyaWRlIG1heSBoYXZlIHNoYWRvd2VkIGNvbW1pdHRlZCBzZWNyZXRzIGR1cmluZyB0aGUgZm5veCBydW4sIHNvIHRoZSBvdXRlclxuICAgIC8vIHRyYW5zYWN0aW9uIG11c3QgcmVzdG9yZSBldmVyeSBjb21taXR0ZWQgZm5veC50b21sIGluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgbWlncmF0aW9uLlxuICAgIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoLCBoaWRkZW5EaXJQYXRocyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGUgb3JpZ2luYWwgZmFpbHVyZSBtdXN0IHdpbjsgYSByZXN0b3JhdGlvbiBjb25mbGljdCBvbiB0aGlzIHBhdGggaXMgb25seSByZXBvcnRlZCBzbyBpdFxuICAgIC8vIGNhbm5vdCBtYXNrIHRoZSByb290IGNhdXNlLlxuICAgIHRyeSB7XG4gICAgICByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aCwgaGlkZGVuRGlyUGF0aHMpO1xuICAgIH0gY2F0Y2ggKHJlc3RvcmVFcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKChyZXN0b3JlRXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IFN0cmluZyhyZXN0b3JlRXJyb3IpKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLy8gTW92ZXMgdGhlIGhpZGRlbiBmbm94LmxvY2FsLnRvbWwgZmlsZXMgYmFjaywgY2xlYXJpbmcgdGhlIGdpdmVuIGxpc3Qgc28gYSBzZWNvbmQgY2FsbCBpcyBhXG4vLyBuby1vcC4gTmV2ZXIgY2xvYmJlcnMgYSBmbm94LmxvY2FsLnRvbWwgcmVjcmVhdGVkIChlLmcuIGJ5IGFuIGVkaXRvcikgd2hpbGUgZm5veCB3YXMgcnVubmluZzpcbi8vIHRoZSBiYWNrdXAgaXMga2VwdCBhbmQgcmVwb3J0ZWQgZm9yIGEgbWFudWFsIG1lcmdlLlxuZnVuY3Rpb24gcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGg6IHN0cmluZywgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZsaWN0aW5nTG9jYWxQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGhpZGRlbkRpclBhdGhzLnNwbGljZSgwKSkge1xuICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgY29uZmxpY3RpbmdMb2NhbFBhdGhzLnB1c2gobG9jYWxQYXRoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmcy5yZW5hbWVTeW5jKGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpLCBsb2NhbFBhdGgpO1xuICB9XG4gIGlmIChjb25mbGljdGluZ0xvY2FsUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgZm9sbG93aW5nIGZub3gubG9jYWwudG9tbCBmaWxlcyB3ZXJlIHJlY3JlYXRlZCB3aGlsZSBmbm94IHdhcyBydW5uaW5nIChvcmlnaW5hbCBmaWxlcyBhcmUgcHJlc2VydmVkIHVuZGVyICR7cGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnLnRtcCcsICd3YmZ5LWZub3gtbG9jYWwtYmFja3VwJyl9IOKAlCBtZXJnZSB0aGVtIG1hbnVhbGx5KTogJHtjb25mbGljdGluZ0xvY2FsUGF0aHMuam9pbignLCAnKX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3RvcmVzIGEgZm5veC5sb2NhbC50b21sIGJhY2t1cCBsZWZ0IGJ5IGFuIGludGVycnVwdGVkIGVhcmxpZXIgcnVuIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAqIG92ZXJyaWRlcyBhcmUgbmV2ZXIgc2lsZW50bHkgbG9zdC5cbiAqL1xuZnVuY3Rpb24gcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICBjb25zdCBiYWNrdXBQYXRoID0gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhiYWNrdXBQYXRoKSkgcmV0dXJuO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCb3RoICR7bG9jYWxQYXRofSBhbmQgaXRzIGJhY2t1cCAke2JhY2t1cFBhdGh9IGV4aXN0OyByZXNvbHZlIHRoZSBsZWZ0b3ZlciBiYWNrdXAgbWFudWFsbHkuYCk7XG4gIH1cbiAgZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aCwgYmFja3VwUGF0aCk7XG4gIGZzLnJlbmFtZVN5bmMoYmFja3VwUGF0aCwgbG9jYWxQYXRoKTtcbn1cblxuLy8gQ3JlYXRlcyB0aGUgYmFja3VwIGRpcmVjdG9yeSBhbmQgcHJvdmVzIG5vIHBhdGggY29tcG9uZW50IGJlbG93IHRoZSByZXBvc2l0b3J5IHJvb3QgaXMgYVxuLy8gc3ltbGluazogYSByZXBvc2l0b3J5LWNvbnRyb2xsZWQgc3ltbGluayAoZS5nLiBhIHRyYWNrZWQgLnRtcC93YmZ5LWZub3gtbG9jYWwtYmFja3VwIGxpbmspXG4vLyBjb3VsZCBvdGhlcndpc2UgbW92ZSB0aGUgcGxhaW50ZXh0IGxvY2FsIHNlY3JldHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgb3IgcmVzb2x2ZSB0aGUgYmFja3VwXG4vLyBiYWNrIG9udG8gdGhlIHNvdXJjZSBmaWxlIGFuZCB0dXJuIHRoZSBoaWRlIHJlbmFtZSBpbnRvIGEgbm8tb3AuXG5mdW5jdGlvbiBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoOiBzdHJpbmcsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBiYWNrdXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGJhY2t1cFBhdGgpO1xuICBmcy5ta2RpclN5bmMoYmFja3VwRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGV4cGVjdGVkUmVhbFBhdGggPSBwYXRoLmpvaW4oZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKSwgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgYmFja3VwRGlyUGF0aCkpO1xuICBpZiAoZnMucmVhbHBhdGhTeW5jKGJhY2t1cERpclBhdGgpICE9PSBleHBlY3RlZFJlYWxQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2JhY2t1cERpclBhdGh9IHJlc29sdmVzIHRocm91Z2ggYSBzeW1saW5rOyByZW1vdmUgdGhlIHN5bWxpbmtlZCBjb21wb25lbnQuYCk7XG4gIH1cbn1cblxuLy8gVGhlIGJhY2t1cCBsaXZlcyB1bmRlciB0aGUgZ2l0aWdub3JlZCAudG1wIHNvIGEgaGlkZGVuIGZub3gubG9jYWwudG9tbCBjYW4gbmV2ZXIgYmVjb21lXG4vLyBzdGFnZWFibGUgKGEgc2libGluZyByZW5hbWUgbGlrZSBmbm94LmxvY2FsLnRvbWwud2JmeS1iYWsgd291bGQgbm8gbG9uZ2VyIG1hdGNoIHRoZSBkb2N1bWVudGVkXG4vLyBgZm5veC5sb2NhbC50b21sYCBpZ25vcmUgZW50cnkgYW5kIGNvdWxkIGJlIGNvbW1pdHRlZCBieSBgZ2l0IGFkZCAtQWApLlxuZnVuY3Rpb24gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXNvbHZlKFxuICAgIHJvb3REaXJQYXRoLFxuICAgICcudG1wJyxcbiAgICAnd2JmeS1mbm94LWxvY2FsLWJhY2t1cCcsXG4gICAgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgZGlyUGF0aCksXG4gICAgJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVNaWdyYXRpb25NYXJrZXIoKTogdm9pZCB7XG4gIGlmICghbWlncmF0aW9uTWFya2VyUGF0aCB8fCBtaWdyYXRpb25NYXJrZXJPd25lZCkgcmV0dXJuO1xuICBjb25zdCB0bXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKG1pZ3JhdGlvbk1hcmtlclBhdGgpO1xuICBmcy5ta2RpclN5bmModG1wRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIFJlZnVzZSB0byB3cml0ZSB0aHJvdWdoIHN5bWxpbmtzOiBhIHJlcG9zaXRvcnktY29udHJvbGxlZCAudG1wIHN5bWxpbmsgY291bGQgb3RoZXJ3aXNlXG4gIC8vIHJlZGlyZWN0IHRoZSBtYXJrZXIgd3JpdGUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS4gVGhlIGB3eGAgZmxhZyBtYWtlcyB0aGUgb3BlbiBpdHNlbGYgZmFpbFxuICAvLyBvbiBhbnkgcHJlLWV4aXN0aW5nIHBhdGgsIGluY2x1ZGluZyBhIGRhbmdsaW5nIHN5bWxpbmsg4oCUIHdoaWNoIGFsc28gYWNxdWlyZXMgdGhlIG1hcmtlclxuICAvLyBhdG9taWNhbGx5LCBzbyBhIGNvbmN1cnJlbnQgd2JmeSBydW4gY2Fubm90IHN0YXJ0IGEgc2Vjb25kIG1pZ3JhdGlvbi5cbiAgaWYgKGZzLmxzdGF0U3luYyh0bXBEaXJQYXRoKS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RtcERpclBhdGh9IGlzIGEgc3ltbGluazsgcmVwbGFjZSBpdCB3aXRoIGEgcmVndWxhciBkaXJlY3RvcnkuYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCxcbiAgICAgICd3YmZ5IGZub3ggbWlncmF0aW9uIGluIHByb2dyZXNzOyBhIGxlZnRvdmVyIG1hcmtlciBibG9ja3MgbmV3IG1pZ3JhdGlvbnNcXG4nLFxuICAgICAge1xuICAgICAgICBmbGFnOiAnd3gnLFxuICAgICAgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBbm90aGVyIHdiZnkgcHJvY2VzcyBhcHBlYXJzIHRvIGJlIG1pZ3JhdGluZyAoJHttaWdyYXRpb25NYXJrZXJQYXRofSBleGlzdHMpOiAke2Vycm9yfWApO1xuICB9XG4gIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gdHJ1ZTtcbn1cblxuLy8gT25seSB0aGUgcnVuIHRoYXQgYWNxdWlyZWQgdGhlIG1hcmtlciBtYXkgcmVtb3ZlIGl0OiBkZWxldGluZyBhIGZvcmVpZ24gbWFya2VyIHdvdWxkIGRpc2FibGVcbi8vIGludGVycnVwdGVkLW1pZ3JhdGlvbiBkZXRlY3Rpb24gZm9yIGEgY29uY3VycmVudGx5IHJ1bm5pbmcgd2JmeS5cbmZ1bmN0aW9uIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk6IHZvaWQge1xuICBpZiAoIW1pZ3JhdGlvbk1hcmtlck93bmVkIHx8ICFtaWdyYXRpb25NYXJrZXJQYXRoKSByZXR1cm47XG4gIGZzLnJtU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90czogTWFwPHN0cmluZywgc3RyaW5nPik6IGJvb2xlYW4ge1xuICBsZXQgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGNvbnRlbnRdIG9mIHNuYXBzaG90cykge1xuICAgIHRyeSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gcmVzdG9yZSAke2ZpbGVQYXRofSBhZnRlciBhIGZhaWxlZCBtaWdyYXRpb246ICR7ZXJyb3J9YCk7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1Y2NlZWRlZDtcbn1cblxuZnVuY3Rpb24gZmFpbEZub3hTeW5jKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgZm5veFN5bmNGYWlsZWQgPSB0cnVlO1xufVxuXG4vLyBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgYW4gdW5zdXBwb3J0ZWQgZm5veC5sb2NhbC50b21sIGluIHRoZSBkaXJlY3RvcnksIG9yIHVuZGVmaW5lZC4gTG9jYWxcbi8vIG92ZXJyaWRlcyBtYXkgb25seSBob2xkIG1hY2hpbmUtbG9jYWwgc2VjcmV0IHZhbHVlczsgaW1wb3J0cyBvciBwcm92aWRlciAocmUpZGVmaW5pdGlvbnMgd291bGRcbi8vIHNpbGVudGx5IGNoYW5nZSB3aGljaCByZWNpcGllbnQgc2V0IGdvdmVybnMgcmUtZW5jcnlwdGlvbi5cbmZ1bmN0aW9uIGZpbmRGbm94TG9jYWxUb21sSXNzdWUoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbG9jYWxUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFRvbWxQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbG9jYWxTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFRvbWxQYXRoLCAndXRmOCcpKSBhcyBGbm94VG9tbDtcbiAgY29uc3QgZGVmaW5lc1Byb3ZpZGVycyA9XG4gICAgbG9jYWxTZXR0aW5ncy5pbXBvcnQgIT09IHVuZGVmaW5lZCB8fFxuICAgIGxvY2FsU2V0dGluZ3MucHJvdmlkZXJzICE9PSB1bmRlZmluZWQgfHxcbiAgICBPYmplY3QudmFsdWVzKGxvY2FsU2V0dGluZ3MucHJvZmlsZXMgPz8ge30pLnNvbWUoKHByb2ZpbGUpID0+IHByb2ZpbGU/LnByb3ZpZGVycyAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGRlZmluZXNQcm92aWRlcnMgPyBgJHtsb2NhbFRvbWxQYXRofSBkZWZpbmVzIGltcG9ydHMsIHByb3ZpZGVycywgb3IgcHJvZmlsZSBwcm92aWRlcnNgIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIExpc3RzIGV2ZXJ5IGRpcmVjdG9yeSBjb250YWluaW5nIGEgY29tbWl0dGVkIChvciBjb21taXR0YWJsZSkgZm5veC50b21sIGFtb25nIHRoZSBnaXZlblxuICogZ2l0LWRpc2NvdmVyZWQgY29uZmlnIHBhdGhzIChzZWUgbGlzdEZub3hMaWtlRmlsZVBhdGhzOiBnaXQtYmFzZWQgZGlzY292ZXJ5IGV4Y2x1ZGVzIGdpdGlnbm9yZWRcbiAqIHRyZWVzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIHdpdGhvdXQgZXhjbHVkaW5nIGxlZ2l0aW1hdGUgcGFja2FnZXMgbmFtZWQgbGlrZSBidWlsZCBvdXRwdXRzKS5cbiAqL1xuZnVuY3Rpb24gbGlzdEZub3hUb21sRGlyUGF0aHMoZm5veExpa2VGaWxlUGF0aHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBmbm94TGlrZUZpbGVQYXRoc1xuICAgICAgICAuZmlsdGVyKChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgPT09ICdmbm94LnRvbWwnKVxuICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZub3ggY29uZmlnIGRlY2xhcmVzIGl0cyBvd24gYFtwcm92aWRlcnMuYWdlXWAsIGkuZS4gcGFydGljaXBhdGVzIGluIGFnZSBlbmNyeXB0aW9uLlxuICogQSBjb25maWcgd2l0aG91dCBvbmUgZWl0aGVyIGluaGVyaXRzIGEgbWFuYWdlZCByb290J3MgcHJvdmlkZXIgKGhhbmRsZWQgYnkgdGhlIHJvb3QtZXhpc3RzIHBhdGgpXG4gKiBvciwgd2hlbiBubyByb290IGV4aXN0cywgdXNlcyBubyBhZ2UgZW5jcnlwdGlvbiBhdCBhbGwg4oCUIHNvIGl0IG5lZWRzIG5vIHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb25cbiAqIGFuZCBvd25zIG5vIEZOT1hfQUdFX0tFWS5cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNGbm94QWdlUHJvdmlkZXIoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhaWwgY2xvc2VkOiBhbiB1bnJlYWRhYmxlIGNvbmZpZyBtaWdodCBkZWNsYXJlIGFuIGFnZSBwcm92aWRlci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCb29sZWFuKChCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBGbm94VG9tbCkucHJvdmlkZXJzPy5hZ2UpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsIGNsb3NlZDogYW4gdW5wYXJzYWJsZSBjb25maWcgbWlnaHQgZGVjbGFyZSBhbiBhZ2UgcHJvdmlkZXIuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZm5veCBjb25maWcgcGF0aCBsaWVzIGluc2lkZSBhIHRlc3QtZml4dHVyZSB0cmVlICh0ZXN0L2ZpeHR1cmVzLCB0ZXN0LWZpeHR1cmVzLFxuICogX190ZXN0c19fKTogZml4dHVyZSBjb25maWdzIGFyZSB0ZXN0IElOUFVUUywgbm90IHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbi4gZm5veCBuZXZlciBsb2Fkc1xuICogdGhlbSBmb3IgcmVhbCBjb21tYW5kcyAoaGllcmFyY2hpY2FsIGxvYWRpbmcgb25seSB3YWxrcyBjd2QgYW5jZXN0b3JzKSwgcmVjaXBpZW50XG4gKiBzeW5jaHJvbml6YXRpb24gbXVzdCBub3QgcmV3cml0ZSBvciByZS1lbmNyeXB0IHRoZW0gKHNoYXJlZC1saWItbm9kZSdzIHVuZGVjcnlwdGFibGUgZml4dHVyZVxuICogZXhpc3RzIHByZWNpc2VseSB0byBzdGF5IHVuZGVjcnlwdGFibGUpLCBhbmQgYSBmaXh0dXJlIG11c3Qgbm90IGZhaWwgdGhlIHN0cmF5LW5lc3RlZC1jb25maWdcbiAqIGNoZWNrIGluIHJlcG9zaXRvcmllcyB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Rlc3RGaXh0dXJlRm5veFBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgZml4dHVyZXNgIGNvdW50cyBvbmx5IGRpcmVjdGx5IHVuZGVyIGEgdGVzdCBkaXJlY3Rvcnk6IHdiZnkgc3VwcG9ydHMgYXJiaXRyYXJ5IHdvcmtzcGFjZXMsXG4gIC8vIHNvIGEgbGVnaXRpbWF0ZSBgcGFja2FnZXMvZml4dHVyZXMvYCB3b3Jrc3BhY2UgbXVzdCBzdGF5IG1hbmFnZWQgYW5kIHZlcmlmaWVkLlxuICBjb25zdCBzZWdtZW50cyA9IGZpbGVQYXRoLnNwbGl0KCcvJyk7XG4gIHJldHVybiBzZWdtZW50cy5zb21lKFxuICAgIChzZWdtZW50LCBpbmRleCkgPT5cbiAgICAgIHNlZ21lbnQgPT09ICd0ZXN0LWZpeHR1cmVzJyB8fFxuICAgICAgc2VnbWVudCA9PT0gJ19fdGVzdHNfXycgfHxcbiAgICAgIChzZWdtZW50ID09PSAnZml4dHVyZXMnICYmIChzZWdtZW50c1tpbmRleCAtIDFdID09PSAndGVzdCcgfHwgc2VnbWVudHNbaW5kZXggLSAxXSA9PT0gJ3Rlc3RzJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAvLyAteiBwcmludHMgTlVMLWRlbGltaXRlZCB2ZXJiYXRpbSBwYXRoczsgd2l0aG91dCBpdCwgY29yZS5xdW90ZVBhdGggQy1xdW90ZXMgbm9uLUFTQ0lJIHBhdGhzXG4gIC8vIChlLmcuIFwiXFwzNDZcXDIyN1xcMjQ1Li4uXCIpLCB3aGljaCB3b3VsZCBtYWtlIHRoZSBiYXNlbmFtZSBmaWx0ZXIgc2lsZW50bHkgc2tpcCB0aG9zZSBjb25maWdzLlxuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgJ2dpdCcsXG4gICAgWydscy1maWxlcycsICcteicsICctLWNhY2hlZCcsICctLW90aGVycycsICctLWV4Y2x1ZGUtc3RhbmRhcmQnLCAnLS0nLCAnKmZub3gqLnRvbWwnXSxcbiAgICB7IGN3ZDogcm9vdERpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfVxuICApO1xuICAvLyBGYWlsIGNsb3NlZDogdHJlYXRpbmcgYSBnaXQgZmFpbHVyZSBhcyBcIm5vIGZub3ggY29uZmlnc1wiIHdvdWxkIHNraXAgc3luY2hyb25pemF0aW9uIGFuZCBsZXRcbiAgLy8gc2V0dXBTZWNyZXRzIHVwbG9hZCBhIGtleSB0aGF0IHdhcyBuZXZlciB2ZXJpZmllZCBhZ2FpbnN0IHRoZSByZXBvc2l0b3J5J3MgY2lwaGVydGV4dHMuXG4gIGlmIChwcm9jLnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZ2l0IGxzLWZpbGVzIGZhaWxlZCBpbiAke3Jvb3REaXJQYXRofTogJHsocHJvYy5zdGRlcnIgfHwgcHJvYy5lcnJvcj8ubWVzc2FnZSB8fCAnJykudHJpbSgpfWApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dFxuICAgIC5zcGxpdCgnXFwwJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiAvXlxcLj9mbm94KFxcLi4rKT9cXC50b21sJC91LnRlc3QocGF0aC5iYXNlbmFtZShsaW5lKSkgJiYgIWlzVGVzdEZpeHR1cmVGbm94UGF0aChsaW5lKSlcbiAgICAubWFwKChsaW5lKSA9PiBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIGxpbmUpKTtcbn1cblxuZnVuY3Rpb24gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhkaXJQYXRoKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gL15cXC4/Zm5veChcXC4uKyk/XFwudG9tbCQvdS50ZXN0KG5hbWUpKVxuICAgICAgLnRvU29ydGVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGZub3ggY2FuIHN0aWxsIGxvYWQgYSBjb25maWcgZnJvbSBhIGRpcmVjdG9yeSB0aGlzIHByb2Nlc3MgY2Fubm90IGVudW1lcmF0ZVxuICAgIC8vIChlLmcuIGV4ZWN1dGUtb25seSBwZXJtaXNzaW9uKSwgc28gYW4gZW51bWVyYXRpb24gZmFpbHVyZSBtdXN0IG5vdCByZWFkIGFzIFwibm8gY29uZmlnc1wiLlxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGluc3BlY3QgJHtkaXJQYXRofSBmb3IgZm5veCBjb25maWdzOiAke2Vycm9yfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGlyUGF0aHMgPSBbZGlyUGF0aF07XG4gIHdoaWxlIChkaXJQYXRocy5hdCgtMSkgIT09IHJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRpclBhdGhzLmF0KC0xKSA/PyAnJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyUGF0aHMuYXQoLTEpKSBicmVhaztcbiAgICBkaXJQYXRocy5wdXNoKHBhcmVudCk7XG4gIH1cbiAgcmV0dXJuIGRpclBhdGhzO1xufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiB1bmtub3duW10sIHNvdXJjZTogdW5rbm93bltdLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd25bXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0W2luZGV4XSwgb3B0aW9ucykgJiYgaXNNZXJnZWFibGVPYmplY3QoaXRlbSwgb3B0aW9ucykpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlLCBvcHRpb25zKSA/IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIHBhY2thZ2UuanNvbi1zdHlsZSBrZXlzIGFyZSBub24tYXJyYXktaW5kZXgga2V5cywgc28gSlNPTi5zdHJpbmdpZnkgcHJlc2VydmVzIHRoaXMgaW5zZXJ0aW9uIG9yZGVyLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQge1xuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxuICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4sXG4gIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5LFxuICByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbi8vIFRoZSBCdW4tZXhhY3QgcmVzb2x1dGlvbiBwcmltaXRpdmVzIGxpdmUgaW4gQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSAoc3JjL2J1bldvcmtzcGFjZXMudHMpXG4vLyBzbyB3YidzIHJlbGVhc2UgY29kZSBzaGFyZXMgdGhlbTsgcmUtZXhwb3J0IHRoZSBvbmVzIHdiZnkgbW9kdWxlcyBhbmQgdGVzdHMgY29uc3VtZS5cbmV4cG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIFBhY2thZ2VDb25maWcgdGhhdCB3b3Jrc3BhY2UgZGlzY292ZXJ5IG5lZWRzLCBzbyBpdCBjYW4gcnVuIGJlZm9yZSBjb25maWdzIGV4aXN0LiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlUm9vdExpa2UgPSBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJyB8ICdkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucycgfCAncGFja2FnZUpzb24nPjtcblxuLyoqXG4gKiBFdmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5IChhYnNvbHV0ZSwgZGVkdXBsaWNhdGVkKSBvZiB0aGUgbW9ub3JlcG8gcm9vdCwgY292ZXJpbmdcbiAqIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyouIFVuY2FjaGVkIGJlY2F1c2UgaW5kZXgudHMgY2FsbHMgaXQgYmVmb3JlIHdiZnkgbXV0YXRlc1xuICogdGhlIHJvb3QgcGFja2FnZS5qc29uIChnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyBjYWNoZXMgdGhlIHBvc3QtbXV0YXRpb24gc3RhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RMaWtlKS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3RMaWtlLmRpclBhdGgsIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKVxuICAgICAgKVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpLCBpbmNsdWRpbmcgbWFuaWZlc3RzXG4gKiB3aXRob3V0IGEgYG5hbWVgIGZpZWxkIOKAlCB3YmZ5IG5hbWVzIHRob3NlIGxhdGVyLCBzbyBkZXBlbmRlbmN5IHNjYW5zIG11c3Qgbm90IHNraXAgdGhlbS5cbiAqIFJlc29sdXRpb24gbWltaWNzIEJ1bidzIHNlcXVlbnRpYWwgcGF0dGVybiBldmFsdWF0aW9uOyBzZWUgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RDb25maWc6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMocm9vdENvbmZpZyksIHJvb3RDb25maWcuZGlyUGF0aCk7XG59XG5cbmludGVyZmFjZSBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8qKiBEaXJlY3Rvcnkgc3VidHJlZXMgKG9yIHBhY2thZ2Utb3duZWQgc3VicGF0aHMpIG1hdGNoZWQgYnkgZWZmZWN0aXZlIG5lZ2F0aW9ucywgZm9yIHRzY29uZmlnIGBleGNsdWRlYCBlbnRyaWVzLiAqL1xuICBleGNsdWRlczogc3RyaW5nW107XG4gIC8qKiBQb3NpdGl2ZSBkaXJlY3RvcnkgcGF0dGVybnMgKG9yIGNvbmNyZXRlIGRpcmVjdG9yaWVzIGZvciBCdW4tb25seSBnbG9iIHN5bnRheCkuICovXG4gIGluY2x1ZGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTb3J0ZWQgd29ya3NwYWNlIGRpcmVjdG9yeSBwYXR0ZXJucyAocG9zaXgsIHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290KSBmb3IgZ2VuZXJhdG9ycyB0aGF0XG4gKiBuZWVkIHBhdHRlcm4tc2hhcGVkIGdsb2JzIGNvdmVyaW5nIGV2ZXJ5IHdvcmtzcGFjZSBsYXlvdXQg4oCUIGUuZy4gdGhlIHJvb3QgdHNjb25maWcncyBgYXBwcy8qYFxuICogaW5jbHVkZSBlbnRyaWVzIOKAlCBpbnN0ZWFkIG9mIGNvbmNyZXRlIGRpcmVjdG9yaWVzLCB3aGljaCB3b3VsZCBjaHVybiBnZW5lcmF0ZWQgZmlsZXMgd2hlbmV2ZXIgYVxuICogd29ya3NwYWNlIHBhY2thZ2UgaXMgYWRkZWQgb3IgcmVtb3ZlZC4gRXZlcnkgcmV0dXJuZWQgcGF0dGVybiBpcyB2YWxpZCB0c2NvbmZpZyBnbG9iIHN5bnRheC5cbiAqIEEgcGF0dGVybiBjYW4gbWF0Y2ggYSBzaWJsaW5nIGRpcmVjdG9yeSB3aXRob3V0IGEgcGFja2FnZS5qc29uIChub3QgYSB3b3Jrc3BhY2UgdG8gQnVuKTsgdGhhdFxuICogaXMgZGVsaWJlcmF0ZSwgbWlycm9yaW5nIHRoZSBsb25nLXN0YW5kaW5nIGBwYWNrYWdlcy8qYCBlbnRyaWVzJyBiZWhhdmlvciBpbiBmYXZvciBvZiBzdGFibGVcbiAqIGdlbmVyYXRlZCBvdXRwdXQuIE5lZ2F0aW9ucyBmb2xsb3cgQnVuJ3Mgc2VxdWVudGlhbCBzZW1hbnRpY3MgKHNlZVxuICogcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMpOiBhIG5lZ2F0aW9uIHN0YXlzIHBhdHRlcm4tc2hhcGVkIHdoaWxlIGl0IGV4Y2x1ZGVzIGV4YWN0bHlcbiAqIHdoYXQgaXQgbWF0Y2hlcywgYnV0IGlzIGNvbmNyZXRpemVkIHBlciBtYXRjaGVkIGRpcmVjdG9yeSB3aGVuIGEgbWF0Y2hlZCBkaXJlY3RvcnkgZW5kcyB1cCBhXG4gKiB3b3Jrc3BhY2UgYW55d2F5IChyZS1pbmNsdWRlZCBieSBhIGxhdGVyIHBvc2l0aXZlLCBhIHBpbm5lZCBjb25jcmV0ZSBwb3NpdGl2ZSwgb3IgYSBzZWVkZWRcbiAqIGJhc2VsaW5lOyAjMTAwNSkgb3IgaXMgYW4gYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5LCB3aGVyZSBCdW4gZXhjbHVkZXMgb25seSB0aGVcbiAqIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3RvcnksIHNvIG9ubHkgaXRzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgYXJlIGV4Y2x1ZGVkICgjMTAwNCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8vIFVubGlrZSBkaXNjb3ZlcnksIGdlbmVyYXRlZCBvdXRwdXQgbXVzdCBub3QgY29udGFpbiBhIG5ldmVyLW1hdGNoaW5nIGBwYWNrYWdlcy8qYCBmYWxsYmFjazpcbiAgLy8gYW4gYXBwcy8qLW9ubHkgbW9ub3JlcG8gd291bGQgZ2V0IGRlYWQgZ2xvYnMgY29tbWl0dGVkIGludG8gaXRzIHJvb3QgdHNjb25maWcuIE1pcnJvclxuICAvLyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIGZvcmNlcyBgcGFja2FnZXMvKmAgb25seSB3aGVuIGEgbWFuaWZlc3QgYWN0dWFsbHkgbWF0Y2hlcy5cbiAgY29uc3QgaGFzUGFja2FnZXNMYXlvdXQgPVxuICAgIHJvb3RMaWtlLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmXG4gICAgLy8gTWlycm9yIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucycgYmFzZWxpbmUgZ2F0ZSB0b286IHdpdGggYW4gaW1wbGljaXQgYmFzZWxpbmUgc2VlZGVkLFxuICAgIC8vIGBwYWNrYWdlcy8qYCBlbnRyaWVzIHdvdWxkIGJlIGRlYWQgZ2xvYnMgc3Vic3VtZWQgYnkgdGhlIGJhc2VsaW5lLWRlcml2ZWQgb25lcy5cbiAgICAhaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZShyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcykgJiZcbiAgICBmZy5nbG9iU3luYygncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBjd2Q6IHJvb3RMaWtlLmRpclBhdGgsXG4gICAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICB9KS5sZW5ndGggPiAwO1xuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9IGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHtcbiAgICAuLi5yb290TGlrZSxcbiAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogaGFzUGFja2FnZXNMYXlvdXQsXG4gIH0pO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IG5ldyBTZXQoXG4gICAgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMod29ya3NwYWNlUGF0dGVybnMsIHJvb3RMaWtlLmRpclBhdGgpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aClcbiAgICApXG4gICk7XG4gIGNvbnN0IGluY2x1ZGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG5lZ2F0aW9uQm9kaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICAvLyBBIHNlZWRpbmcgbmVnYXRpb24gbWFrZXMgQnVuIGxpbmsgYmFzZWxpbmUtbWF0Y2hlZCBkaXJlY3Rvcmllcywgc28gdGhlIGJhc2VsaW5lIG11c3RcbiAgICAgIC8vIGVudGVyIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZSBwYXR0ZXJucyBldmVuIHdoZW4gZXZlcnkgZGVjbGFyZWQgcGF0dGVybiBpcyBhIG5lZ2F0aW9uLlxuICAgICAgY29uc3QgYmFzZWxpbmVHbG9iID0gZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKHBhdHRlcm5Cb2R5KTtcbiAgICAgIGlmIChiYXNlbGluZUdsb2IgIT09IHVuZGVmaW5lZCkgaW5jbHVkZXMuYWRkKGJhc2VsaW5lR2xvYik7XG4gICAgICBuZWdhdGlvbkJvZGllcy5wdXNoKHBhdHRlcm5Cb2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBkaXJQYXR0ZXJuIG9mIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMocGF0dGVybkJvZHksIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICAgIGluY2x1ZGVzLmFkZChkaXJQYXR0ZXJuKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgZXhjbHVkZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBuZWdhdGlvbkJvZHkgb2YgbmVnYXRpb25Cb2RpZXMpIHtcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVFbnRyeSBvZiB0b0V4Y2x1ZGVFbnRyaWVzKG5lZ2F0aW9uQm9keSwgd29ya3NwYWNlRGlyUGF0aHMsIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICBleGNsdWRlcy5hZGQoZXhjbHVkZUVudHJ5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgZXhjbHVkZXM6IFsuLi5leGNsdWRlc10udG9Tb3J0ZWQoKSwgaW5jbHVkZXM6IFsuLi5pbmNsdWRlc10udG9Tb3J0ZWQoKSB9O1xufVxuXG4vKipcbiAqIHRzY29uZmlnIGV4Y2x1ZGUgZW50cmllcyBmb3Igb25lIG5lZ2F0aW9uLiBQYXR0ZXJuLXNoYXBlZCB3aGVuIHRoZSBuZWdhdGlvbiBleGNsdWRlcyBleGFjdGx5XG4gKiB3aGF0IGl0IG1hdGNoZXMgKHN0YWJsZSBvdXRwdXQpOyBwZXItZGlyZWN0b3J5IG90aGVyd2lzZTogYSBkaXJlY3RvcnkgdGhhdCBpcyBhIHdvcmtzcGFjZVxuICogZGVzcGl0ZSB0aGUgbmVnYXRpb24gaXMgbm90IGV4Y2x1ZGVkIGF0IGFsbCwgYW5kIG5laXRoZXIgaXMgYSBQTEFJTiAocGFja2FnZS5qc29uLWxlc3MpXG4gKiBkZXNjZW5kYW50IG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSDigJQgbmVnYXRpbmcgYSBub24tcGFja2FnZSBkaXJlY3RvcnkgaXMgYSBuby1vcCBmb3IgQnVuLFxuICogYW5kIHRoZSBlbmNsb3Npbmcgd29ya3NwYWNlIHN0YXlzIGFjdGl2ZSAoZS5nLiBgWydhcHBzLyoqJywgJyFhcHBzLyoqJywgJ2FwcHMvd2ViJ11gXG4gKiByZS1pbmNsdWRlcyBhcHBzL3dlYiwgd2hvc2Ugc3JjIG11c3Qga2VlcCB0eXBlLWNoZWNraW5nOyBhIHRzY29uZmlnIGV4Y2x1ZGUgd291bGQgb3ZlcnJpZGVcbiAqIHRoZSBpbmNsdWRlKS4gQSBkZXNjZW5kYW50IHdpdGggaXRzIG93biBtYW5pZmVzdCB0aGF0IHRoZSBuZWdhdGlvbiBrZWVwcyBvdXQgb2YgdGhlIHdvcmtzcGFjZVxuICogc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlIGFuZCBzdGF5cyBleGNsdWRlZC4gQSBkaXJlY3RvcnkgdGhhdCBpcyBhblxuICogYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5IGdldHMgb25seSBpdHMgcGFja2FnZS1vd25lZCBzdWJwYXRocyBleGNsdWRlZCwgYmVjYXVzZSBCdW5cbiAqIGV4Y2x1ZGVzIG9ubHkgdGhlIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3Rvcnkgd2hpbGUga2VlcGluZyBkZXNjZW5kYW50IHdvcmtzcGFjZXMgKCMxMDA0KS5cbiAqL1xuZnVuY3Rpb24gdG9FeGNsdWRlRW50cmllcyhuZWdhdGlvbkJvZHk6IHN0cmluZywgd29ya3NwYWNlRGlyUGF0aHM6IFNldDxzdHJpbmc+LCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpc1dvcmtzcGFjZUFuY2VzdG9yID0gKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBbLi4ud29ya3NwYWNlRGlyUGF0aHNdLnNvbWUoKHdvcmtzcGFjZURpclBhdGgpID0+IHdvcmtzcGFjZURpclBhdGguc3RhcnRzV2l0aChgJHtkaXJQYXRofS9gKSk7XG4gIC8vIE9ubHkgUExBSU4gZGlyZWN0b3JpZXMgKG5vIHBhY2thZ2UuanNvbiBvZiB0aGVpciBvd24pIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGVuY2xvc2luZ1xuICAvLyB3b3Jrc3BhY2U6IGEgbWF0Y2hlZCBkaXJlY3RvcnkgdGhhdCBjYXJyaWVzIGl0cyBvd24gbWFuaWZlc3QgeWV0IGlzIGFic2VudCBmcm9tIHRoZSBmaW5hbFxuICAvLyB3b3Jrc3BhY2Ugc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlLCBhbmQgaXRzIGV4Y2x1c2lvbiBtdXN0IHN1cnZpdmUuXG4gIGNvbnN0IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudCA9IChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgWy4uLndvcmtzcGFjZURpclBhdGhzXS5zb21lKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoYCR7d29ya3NwYWNlRGlyUGF0aH0vYCkpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBkaXJQYXRoLCAncGFja2FnZS5qc29uJykpO1xuICBjb25zdCBtYXRjaGVkRGlyUGF0aHMgPSBnZXRNYXRjaGVkRGlyUGF0aHMobmVnYXRpb25Cb2R5LCByb290RGlyUGF0aCk7XG4gIGlmIChcbiAgICAhbWF0Y2hlZERpclBhdGhzLnNvbWUoXG4gICAgICAoZGlyUGF0aCkgPT5cbiAgICAgICAgd29ya3NwYWNlRGlyUGF0aHMuaGFzKGRpclBhdGgpIHx8IGlzV29ya3NwYWNlQW5jZXN0b3IoZGlyUGF0aCkgfHwgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50KGRpclBhdGgpXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhuZWdhdGlvbkJvZHksIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlZERpclBhdGhzLmZsYXRNYXAoKGRpclBhdGgpID0+IHtcbiAgICAvLyBUaGUgZGVzY2VuZGFudCBjaGVjayBwcmVjZWRlcyB0aGUgYW5jZXN0b3Igb25lOiBhIGRpcmVjdG9yeSBpbnNpZGUgb25lIHdvcmtzcGFjZSBidXQgYWJvdmVcbiAgICAvLyBhIG5lc3RlZCBvbmUgKGUuZy4gYXBwcy93ZWIvcGx1Z2lucyBiZXR3ZWVuIHdvcmtzcGFjZXMgYXBwcy93ZWIgYW5kIGFwcHMvd2ViL3BsdWdpbnMveClcbiAgICAvLyBzdGlsbCBiZWxvbmdzIHRvIHRoZSBlbmNsb3NpbmcgYWN0aXZlIHdvcmtzcGFjZSwgc28gbm90aGluZyBvZiBpdCBtYXkgYmUgZXhjbHVkZWQuXG4gICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmhhcyhkaXJQYXRoKSB8fCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQoZGlyUGF0aCkpIHJldHVybiBbXTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VBbmNlc3RvcihkaXJQYXRoKSkge1xuICAgICAgcmV0dXJuIFtgJHtkaXJQYXRofS8qLmNvbmZpZy50c2AsIGAke2RpclBhdGh9L3NjcmlwdHNgLCBgJHtkaXJQYXRofS9zcmNgLCBgJHtkaXJQYXRofS90ZXN0YF07XG4gICAgfVxuICAgIHJldHVybiBbZGlyUGF0aF07XG4gIH0pO1xufVxuXG4vKipcbiAqIERpcmVjdG9yaWVzIGEgbmVnYXRpb24gbWF0Y2hlcy4gVGhlIG1hbmlmZXN0LWJhc2VkIGdsb2IgY29tcGxlbWVudHMgb25seURpcmVjdG9yaWVzIGJlY2F1c2VcbiAqIGZhc3QtZ2xvYidzIGBkaXIvKipgIGRvZXMgbm90IHJldHVybiBgZGlyYCBpdHNlbGYgYXMgYSBkaXJlY3RvcnksIHdoaWxlIGJvdGggQnVuIGFuZCB0aGVcbiAqIG1hbmlmZXN0IGdsb2IgdHJlYXQgYCoqYCBhcyB6ZXJvIG9yIG1vcmUgc2VnbWVudHMgKGBhcHBzLyoqYCBjb3ZlcnMgdGhlIHBhY2thZ2UgYXQgYXBwcykuXG4gKi9cbmZ1bmN0aW9uIGdldE1hdGNoZWREaXJQYXRocyhuZWdhdGlvbkJvZHk6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLmZnLmdsb2JTeW5jKG5lZ2F0aW9uQm9keSwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pLFxuICAgICAgLi4uZmdcbiAgICAgICAgLmdsb2JTeW5jKHBhdGgucG9zaXguam9pbihuZWdhdGlvbkJvZHksICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpXG4gICAgICAgIC5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCBpdHNlbGYsIHdoaWNoIGlzIG5ldmVyIGEgd29ya3NwYWNlLlxuICAgICAgICAuZmlsdGVyKChkaXJQYXRoKSA9PiBkaXJQYXRoICE9PSAnLicpLFxuICAgIF0pLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogdHNjb25maWcgaW5jbHVkZS9leGNsdWRlIHN1cHBvcnQgb25seSB0aGUgYCpgLCBgP2AsIGFuZCBgKipgIHdpbGRjYXJkcywgd2hpbGUgQnVuIHdvcmtzcGFjZXNcbiAqIGFjY2VwdCBmdWxsIGdsb2Igc3ludGF4IChicmFjZSBleHBhbnNpb24sIGNoYXJhY3RlciBjbGFzc2VzLCDigKYpLCBzbyBleHBhbmQgQnVuLW9ubHkgcGF0dGVybnMgdG9cbiAqIHRoZSBjb25jcmV0ZSBkaXJlY3RvcmllcyB0aGV5IG1hdGNoIHRvIGtlZXAgdGhlIGdlbmVyYXRlZCBnbG9icyB2YWxpZCBmb3IgVHlwZVNjcmlwdC5cbiAqL1xuZnVuY3Rpb24gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhwYXR0ZXJuQm9keTogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoIS9bKClbXFxde31dL3UudGVzdChwYXR0ZXJuQm9keSkpIHJldHVybiBbcGF0dGVybkJvZHldO1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybkJvZHksIHtcbiAgICBjd2Q6IHJvb3REaXJQYXRoLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICBvbmx5RGlyZWN0b3JpZXM6IHRydWUsXG4gIH0pO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyAobmVnYXRpdmUgb25lcyBpbmNsdWRlZCkgdGhhdCBzdGF5IGluc2lkZSB0aGUgcmVwb3NpdG9yeTogYWJzb2x1dGVcbiAqIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIHJlbW92ZU5vZGVNb2R1bGVzIG9wZXJhdGUgb24gYW5vdGhlclxuICogcmVwb3NpdG9yeSdzIGZpbGVzLiBEZWNsYXJhdGlvbiBvcmRlciBhbmQgZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZVxuICogcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5mdW5jdGlvbiBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlY2xhcmVkUGF0dGVybnMgPSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcyk7XG4gIC8vIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyBmb3JjZXMgYHBhY2thZ2VzLypgIGludG8gYSBtb25vcmVwbydzIHdvcmtzcGFjZXMgd2hlbiBhXG4gIC8vIHBhY2thZ2VzLyovcGFja2FnZS5qc29uIGFjdHVhbGx5IG1hdGNoZXMsIGJ1dCBpdCBtYXkgbm90IGhhdmUgd3JpdHRlbiB0aGUgcm9vdCBwYWNrYWdlLmpzb25cbiAgLy8geWV0LCBzbyBtaXJyb3IgdGhhdCBub3JtYWxpemF0aW9uIGhlcmUg4oCUIFBSRVBFTkRFRCBsaWtlIHRoZXJlLCBiZWNhdXNlIGEgcG9zaXRpdmUgcGF0dGVyblxuICAvLyBwbGFjZWQgYWZ0ZXIgYSB1c2VyIG5lZ2F0aW9uIHdvdWxkIHJlLWluY2x1ZGUgdGhlIG5lZ2F0ZWQgcGFja2FnZXMgdW5kZXIgQnVuJ3Mgc2VxdWVudGlhbFxuICAvLyBldmFsdWF0aW9uLiBEaXNjb3ZlcnkgY2FsbGVycyBwYXNzIHRoZSBmYWxsYmFjayB1bmNvbmRpdGlvbmFsbHkgZm9yIG1vbm9yZXBvcyDigJQgYVxuICAvLyBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGNvbnRyaWJ1dGVzIG5vIHBhdGhzIHRoZXJlIOKAlCB3aGlsZSBwYXR0ZXJuLXNoYXBlZCBjYWxsZXJzXG4gIC8vIChnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucykgZ2F0ZSBpdCBvbiBhbiBhY3R1YWwgbWF0Y2guXG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID1cbiAgICByb290TGlrZS5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKVxuICAgICAgPyBbJ3BhY2thZ2VzLyonLCAuLi5kZWNsYXJlZFBhdHRlcm5zXVxuICAgICAgOiBkZWNsYXJlZFBhdHRlcm5zO1xuICByZXR1cm4gd29ya3NwYWNlUGF0dGVybnMuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZWNsYXJlZCBwb3NpdGl2ZSBwYXR0ZXJuIGFscmVhZHkgY292ZXJzIGBwYWNrYWdlcy8qYCB1bmRlciBwYXRoIG5vcm1hbGl6YXRpb25cbiAqIChlLmcuIGAuL3BhY2thZ2VzLypgIG9yIGEgdHJhaWxpbmctc2xhc2ggc3BlbGxpbmcpOiBmb3JjaW5nIGEgdGV4dHVhbCBgcGFja2FnZXMvKmAgbmV4dCB0b1xuICogc3VjaCBhIHNwZWxsaW5nIHdvdWxkIHBlcnNpc3QgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybnMgYW5kIHJlLXNjYW4gdGhlIHNhbWUgZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4od29ya3NwYWNlczogUGFja2FnZUpzb25bJ3dvcmtzcGFjZXMnXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcykuc29tZShcbiAgICAod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgICF3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgLy8gQSBgLi5gLXRyYXZlcnNpbmcgb3IgYWJzb2x1dGUgc3BlbGxpbmcgKGUuZy4gYHgvLi4vcGFja2FnZXMvKmApIGlzIGRpc2NhcmRlZCBieVxuICAgICAgLy8gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMsIHNvIGl0IG11c3Qgbm90IGNvdW50IGFzIGNvdmVyaW5nIHBhY2thZ2VzLyog4oCUIHRoYXQgd291bGRcbiAgICAgIC8vIHN1cHByZXNzIHRoZSBmYWxsYmFjayBBTkQgbG9zZSB0aGUgcGF0dGVybiwgbGVhdmluZyBubyBkaXNjb3ZlcmVkIHdvcmtzcGFjZXMuXG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikgJiZcbiAgICAgIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4pID09PSAncGFja2FnZXMvKidcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuaW1wb3J0IHsgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyB9IGZyb20gJy4vd29ya3NwYWNlVXRpbC5qcyc7XG5cbmNvbnN0IFBSSVZBVEVfU0NPUEUgPSAnQHdpbGxib29zdGVyLXByaXZhdGUvJztcblxuY29uc3QgcHJpdmF0ZVJlZ2lzdHJ5SG9zdCA9ICd2ZXJkYWNjaW8tcHJvZHVjdGlvbi1lMzg5LnVwLnJhaWx3YXkuYXBwJztcbmV4cG9ydCBjb25zdCBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcgPSBgQHdpbGxib29zdGVyLXByaXZhdGU6cmVnaXN0cnk9aHR0cHM6Ly8ke3ByaXZhdGVSZWdpc3RyeUhvc3R9L2A7XG5cbi8qKlxuICogV2hldGhlciB0aGlzIHJlcG9zaXRvcnkgZGVhbHMgd2l0aCBgQHdpbGxib29zdGVyLXByaXZhdGUvKmAgcGFja2FnZXMg4oCUIGJ5IGNvbnZlbnRpb24gdGhhdCBzY29wZVxuICogbGl2ZXMgZXhjbHVzaXZlbHkgb24gdGhlIHByaXZhdGUgVmVyZGFjY2lvIHJlZ2lzdHJ5LCBzbyBleGFjdGx5IHRoZXNlIHJlcG9zaXRvcmllcyBuZWVkIHRoZVxuICogVkVSREFDQ0lPX1RPS0VOIHBhc3MtdGhyb3VnaCBpbiB0aGVpciByZXVzYWJsZS13b3JrZmxvdyBjYWxsZXJzLlxuICpcbiAqIEEgcmVwb3NpdG9yeSBxdWFsaWZpZXMgd2hlbiBhbnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBERUNMQVJFUyBhIGRlcGVuZGVuY3kgaW4gdGhlIHNjb3BlIChhbnlcbiAqIGRlcGVuZGVuY3kgZmllbGQpLCBvciBpcyBpdHNlbGYgTkFNRUQgaW4gdGhlIHNjb3BlIChpdCBwdWJsaXNoZXMgdG8gVmVyZGFjY2lvLCBhbmQgcmVsZWFzZS55bWxcbiAqIGRlcml2ZXMgaXRzIG5wbSBhdXRoIGZyb20gdGhlIHNhbWUgc2VjcmV0KS4gTm90aGluZyBlbHNlIGlzIHNjYW5uZWQ6IGxvY2tmaWxlcyBvbmx5IG1pcnJvciB0aGVcbiAqIGRlY2xhcmVkIGRlcGVuZGVuY2llcywgYW5kIGJ1bmZpZy50b21sJ3MgYG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXNgIG1lbnRpb25zIHRoZSBzY29wZSBldmVuIGluXG4gKiByZXBvc2l0b3JpZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnIHwgJ2RvZXNDb250YWluU3ViUGFja2FnZUpzb25zJyB8ICdwYWNrYWdlSnNvbic+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgbWFuaWZlc3RSZWxQYXRocyA9IG5ldyBTZXQoWydwYWNrYWdlLmpzb24nLCAuLi5nZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZyldKTtcbiAgcmV0dXJuIFsuLi5tYW5pZmVzdFJlbFBhdGhzXS5zb21lKChyZWxQYXRoKSA9PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHJlbFBhdGgpKTtcbiAgICBpZiAoIW1hbmlmZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1hbmlmZXN0Lm5hbWU/LnN0YXJ0c1dpdGgoUFJJVkFURV9TQ09QRSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBbXG4gICAgICBtYW5pZmVzdC5kZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5wZWVyRGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3Qub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgXS5zb21lKChkZXBlbmRlbmNpZXMpID0+IE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcyA/PyB7fSkuc29tZSgobmFtZSkgPT4gbmFtZS5zdGFydHNXaXRoKFBSSVZBVEVfU0NPUEUpKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGhhc0Zub3hTeW5jRmFpbGVkLCByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZSB9IGZyb20gJy4vZm5veFRvbWwuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZT86IHN0cmluZztcbiAgb24/OiBPbjtcbiAgY29uY3VycmVuY3k/OiBDb25jdXJyZW5jeTtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBqb2JzOiBSZWNvcmQ8c3RyaW5nLCBKb2I+O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbiAgcXVldWU/OiAnc2luZ2xlJyB8ICdtYXgnO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICAvLyBHaXRIdWIgQWN0aW9ucyB0cmVhdHMgYGV2ZW50OiBudWxsYCBhcyBhIHZhbHVlbGVzcyBldmVudCBtYXBwaW5nLCBlLmcuXG4gIC8vIGBwdWxsX3JlcXVlc3Q6YC4gYHVuZGVmaW5lZGAgd291bGQgb21pdCB0aGUgZXZlbnQgZW50aXJlbHkgd2hlbiBkdW1waW5nIFlBTUwuXG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8ICdpbmhlcml0JztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgICAgfSxcbiAgICAgIC8vIExldCBtYWludGFpbmVycyByZS1ydW4gdGhlIHRlc3RzIGJ5IGhhbmQuXG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIC8vIE5vbmUgb2YgdGhlc2UgbWF5IGJlIG5hcnJvd2VkIGp1c3QgYmVjYXVzZSB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBuZXZlciBwdXNoZXM6XG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciB0aGUgdGVzdCBqb2IncyBza2lwLWR1cGxpY2F0ZS1hY3Rpb25zIGNhbGwgd2l0aCBjYW5jZWxfb3RoZXJzOiB0cnVlICh0aGUgcmV1c2FibGVcbiAgICAgIC8vIHRlc3Qgd29ya2Zsb3cgZGVjbGFyZXMgbm8gcGVybWlzc2lvbnMgb2YgaXRzIG93biwgc28gaXRzIGpvYnMgcnVuIG9uIHRoaXMgdG9rZW4pXG4gICAgICBhY3Rpb25zOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIGBzZW1hbnRpYy1yZWxlYXNlIC0tZHJ5LXJ1bmAsIHdoaWNoIGRvZXMgYSBgZ2l0IHB1c2ggLS1kcnktcnVuYCB0byB2ZXJpZnkgd3JpdGVcbiAgICAgIC8vIGFjY2VzcyBhbmQgYWJvcnRzIHdpdGggRUdJVE5PUEVSTUlTU0lPTiB3aXRob3V0IGl0XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBwa2ctcHJlZmxpZ2h0IFBSIGZpbGUgbGlzdGluZ1xuICAgICAgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICd0ZXN0LXJ1c3QnOiB7XG4gICAgbmFtZTogJ1Rlc3QgUnVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAndGVzdC1ydXN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QtcnVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGBxdWV1ZTogbWF4YCBoZXJlIHRvbyAoIzk3NCk6IEdpdEh1YidzIGRlZmF1bHQgcXVldWUgKGBzaW5nbGVgKSBjYW5jZWxzIGFuIGFscmVhZHktUEVORElOR1xuICAgIC8vIGNhbGxlciBydW4gd2hlbiBhbm90aGVyIG9uZSBxdWV1ZXMg4oCUIGJlZm9yZSBpdHMgam9iIChhbmQgdGhlIHJldXNhYmxlIHdvcmtmbG93J3Mgb3duXG4gICAgLy8gam9iLWxldmVsIGBxdWV1ZTogbWF4YCkgZXZlciBzdGFydHMg4oCUIHNpbGVudGx5IGRyb3BwaW5nIHRoYXQgcmVsZWFzZSB0cmlnZ2VyLlxuICAgIC8vIFRoZSBjYWxsZXItbGV2ZWwgZ3JvdXAgbXVzdCBOT1QgcmV1c2UgdGhlIHJldXNhYmxlIHdvcmtmbG93J3Mgam9iLWxldmVsIGdyb3VwIG5hbWVcbiAgICAvLyAoYHJlbGVhc2UtJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19YCk6IHdvcmtmbG93LWxldmVsIGFuZCBqb2ItbGV2ZWwgZ3JvdXBzIHNoYXJlIG9uZVxuICAgIC8vIHJlcG9zaXRvcnktd2lkZSBuYW1lc3BhY2UsIGFuZCBpZGVudGljYWwgbmFtZXMgZGVhZGxvY2sgdGhlIHJ1biAoXCJDYW5jZWxpbmcgc2luY2UgYVxuICAgIC8vIGRlYWRsb2NrIGZvciBjb25jdXJyZW5jeSBncm91cCAuLi4gd2FzIGRldGVjdGVkIGJldHdlZW4gJ3RvcCBsZXZlbCB3b3JrZmxvdycgYW5kICc8am9iPidcIikuXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICBxdWV1ZTogJ21heCcsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveSc7XG5cbi8qKlxuICogUGFyc2VzIGEgYHVzZXM6YCB2YWx1ZSBjYWxsaW5nIG9uZSBvZiBXaWxsQm9vc3RlcidzIG93biByZXVzYWJsZSB3b3JrZmxvd3MgKG9yIHRoZVxuICogV2lsbEJvb3N0ZXJMYWIgc3luYyBtaXJyb3IpIGludG8gdGhlIHdvcmtmbG93IG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKSBhbmQgZ2l0IHJlZi4gT25seSB0aG9zZVxuICogZm9sbG93IHRoZSBjb250cmFjdCB3YmZ5IGVuZm9yY2VzIOKAlCBjYWxsZXJzIG9mIGFub3RoZXIgb3JnYW5pemF0aW9uJ3Mgc2FtZS1uYW1lZCByZXBvc2l0b3J5IGFyZVxuICogbGVmdCBhbG9uZS4gR2l0SHViIHRyZWF0cyBvd25lci9yZXBvc2l0b3J5IG5hbWVzIGNhc2UtaW5zZW5zaXRpdmVseSwgc28gdGhlIGNvbXBhcmlzb24gZG9lc1xuICogdG9vLCB3aGlsZSB0aGUgd29ya2Zsb3cgcGF0aCBhbmQgcmVmIHN0YXkgY2FzZS1zZW5zaXRpdmUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoXG4gIHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogeyB3b3JrZmxvd05hbWU6IHN0cmluZzsgZXh0ZW5zaW9uOiBzdHJpbmc7IHJlZjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IC9eKFteL10rKVxcLyhbXi9dKylcXC9cXC5naXRodWJcXC93b3JrZmxvd3NcXC8oW14vQF0rPylcXC4oeWE/bWwpQCguKykkL3UuZXhlYyh1c2VzID8/ICcnKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3duZXIgPSBtYXRjaFsxXSEudG9Mb3dlckNhc2UoKTtcbiAgaWYgKChvd25lciAhPT0gJ3dpbGxib29zdGVyJyAmJiBvd25lciAhPT0gJ3dpbGxib29zdGVybGFiJykgfHwgbWF0Y2hbMl0hLnRvTG93ZXJDYXNlKCkgIT09ICdyZXVzYWJsZS13b3JrZmxvd3MnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyB3b3JrZmxvd05hbWU6IG1hdGNoWzNdISwgZXh0ZW5zaW9uOiBtYXRjaFs0XSEsIHJlZjogbWF0Y2hbNV0hIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgLy8gV2l0aCAuZ2l0aHViIG9yIC5naXRodWIvd29ya2Zsb3dzIHN5bWxpbmtlZCBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCB3cml0ZVlhbWwncyBndWFyZHNcbiAgICAvLyBhbHJlYWR5IHJlZnVzZSB0aGUgd3JpdGVzLCBidXQgcmVhZGRpci9ybSBiZWxvdyB3b3VsZCBzdGlsbCBlbnVtZXJhdGUgYW5kIERFTEVURSBmaWxlc1xuICAgIC8vIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIHNvIHJlcXVpcmUgdGhlIGRpcmVjdG9yeSB0byByZXNvbHZlIGluc2lkZSBpdCBiZWZvcmUgYW55XG4gICAgLy8gdHJhdmVyc2FsLCBta2Rpciwgb3IgY2xlYW51cC5cbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgLy8gd2JmeSB3cml0ZXMgLnltbCB3b3JrZmxvd3MsIHNvIGVhY2gga2luZCBtYXBzIHRvIGl0cyAueW1sIGZpbGUuXG4gICAgY29uc3QgZmlsZU5hbWVzQnlLaW5kID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkgY29udGludWU7XG4gICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGVudHJ5Lm5hbWUuc2xpY2UoMCwgLScueW1sJy5sZW5ndGgpLCBlbnRyeS5uYW1lKTtcbiAgICB9XG4gICAgY29uc3QgbWFuZGF0b3J5S2luZHMgPSBbJ3Rlc3QnLCAnc2VtYW50aWMtcHInLCAnY2xvc2UtY29tbWVudCddO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIG1hbmRhdG9yeUtpbmRzLnB1c2goJ3JlbGVhc2UnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgbWFuZGF0b3J5S2luZHMucHVzaCgndGVzdC1ydXN0Jyk7XG4gICAgfVxuICAgIC8vIEEgcHJldmlvdXMgcnVuIG1heSBoYXZlIG1pc3Rha2VuIGEgZ2l0aWdub3JlZCB0aGlyZC1wYXJ0eSBjaGVja291dCBmb3IgcmVwb3NpdG9yeSBSdXN0IGNvZGUuXG4gICAgLy8gUmVtb3ZlIG9ubHkgdGhlIGdlbmVyYXRlZC1zdHlsZSBjYWxsZXI6IGEgc2FtZS1uYW1lZCBjdXN0b20gd29ya2Zsb3cgd2l0aCBhbnkgb3RoZXIgam9iIHN0YXlzLlxuICAgIGlmIChyb290Q29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgdGVzdFJ1c3RGaWxlTmFtZSA9IGZpbGVOYW1lc0J5S2luZC5nZXQoJ3Rlc3QtcnVzdCcpO1xuICAgICAgaWYgKHRlc3RSdXN0RmlsZU5hbWUgJiYgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGgsIHRlc3RSdXN0RmlsZU5hbWUsICd0ZXN0LXJ1c3QnKSkge1xuICAgICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCd0ZXN0LXJ1c3QnKTtcbiAgICAgICAgYXdhaXQgZnNVdGlsLnJlbW92ZUNvbmZpbmVkKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCB0ZXN0UnVzdEZpbGVOYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3diZnknKTtcbiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgbWFuZGF0b3J5S2luZHMpIHtcbiAgICAgIGlmICghZmlsZU5hbWVzQnlLaW5kLmhhcyhraW5kKSkge1xuICAgICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGtpbmQsIGAke2tpbmR9LnltbGApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmlsZU5hbWVzQnlLaW5kLmhhcygnc3luYycpKSB7XG4gICAgICAvLyBUaGUgc3luYyB3b3JrZmxvdydzIGdlbmVyYXRpb24gb3ducyB0aGUgZm9yY2Utc3luYyB3b3JrZmxvdywgc28gcHJvY2Vzc2luZyBpdCBhcyBhblxuICAgICAgLy8gaW5kZXBlbmRlbnQga2luZCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgd3JpdGVzIG9uIHRoZSBzYW1lIHBhdGguXG4gICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCdzeW5jLWZvcmNlJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2luZCwgZmlsZU5hbWVdIG9mIGZpbGVOYW1lc0J5S2luZCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCBhcyBLbm93bktpbmQsIGZpbGVOYW1lKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZTogR2l0SHViIHJlcG9zaXRvcnkgbmFtZXMgYXJlLCBhbmQgYSByZW1vdGUgbWF5IHNwZWxsIHRoaXMgb25lIGFueSB3YXkuIEdldHRpbmcgaXQgd3JvbmdcbiAgLy8gbGV0cyB3YmZ5IHJld3JpdGUgdGhlIHJlcG9zaXRvcnkgdGhhdCBob3N0cyB0aGUgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gIHJldHVybiByZXBvc2l0b3J5Py50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciBldmVyeSBqb2Igb2YgdGhlIHdvcmtmbG93IGZpbGUgY2FsbHMgdGhlIG5hbWVkIFdpbGxCb29zdGVyIHJldXNhYmxlIHdvcmtmbG93IChvd25lclxuICogcmVzdHJpY3RlZCB2aWEgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCkuIFVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgd2JmeSBvd25zIGEgZmlsZSBlbm91Z2ggdG9cbiAqIGRlbGV0ZSBpdDogdW5wYXJzYWJsZSBmaWxlcyBhbmQgZmlsZXMgd2l0aCBhbnkgb3RoZXIgam9iIHJldHVybiBmYWxzZSDigJQgZGVsZXRpbmcgYSB3aG9sZVxuICogd29ya2Zsb3cgb24gYSBsb29zZSBtYXRjaCB3b3VsZCBiZSB0b28gYWdncmVzc2l2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIHdvcmtmbG93TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghZmlsZU5hbWUuZW5kc1dpdGgoJy55bWwnKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGlzVGFyZ2V0Q2FsbCA9ICh1c2VzOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICAgIHR5cGVvZiB1c2VzID09PSAnc3RyaW5nJyAmJiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09IHdvcmtmbG93TmFtZTtcbiAgdHJ5IHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHlhbWwubG9hZChjb250ZW50KSBhcyBXb3JrZmxvdyB8IHVuZGVmaW5lZDtcbiAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qgam9icyA9IE9iamVjdC52YWx1ZXMod29ya2Zsb3cuam9icyk7XG4gICAgICByZXR1cm4gam9icy5sZW5ndGggPiAwICYmIGpvYnMuZXZlcnkoKGpvYikgPT4gaXNUYXJnZXRDYWxsKGpvYj8udXNlcykpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gVW5wYXJzYWJsZSBjb250ZW50IGlzIG5vdCBwcm92YWJseSBhIGNhbGxlciBvZiB0aGUgbmFtZWQgd29ya2Zsb3cuXG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsXG4gIGtpbmQ6IEtub3duS2luZCxcbiAgZmlsZU5hbWUgPSBgJHtraW5kfS55bWxgXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWUgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpXG4gICAgPyAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJ1xuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIEEgbm9uLWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sIGluIGEgcmVwbyB3aXRob3V0IFJ1c3QgY29kZSBtZXJlbHkgc2hhcmVzIHRoZSBuYW1lOyBsZWF2ZSBpdCBhbG9uZS5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnICYmIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBvbGRTZXR0aW5nczogV29ya2Zsb3c7XG4gICAgdHJ5IHtcbiAgICAgIG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQW4gZXhpc3Rpbmcgd29ya2Zsb3cgd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGUgdGVtcGxhdGVcbiAgICAgIC8vIHdpdGhvdXQgbWVyZ2luZyB3b3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSByZXBvc2l0b3J5J3Mgd29ya2Zsb3cuXG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBZQU1MLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB5YW1sLmxvYWQgcmV0dXJucyB1bmRlZmluZWQgZm9yIGVtcHR5L2NvbW1lbnQtb25seSBmaWxlcyBhbmQgbm9uLW9iamVjdHMgZm9yIHNjYWxhclxuICAgIC8vIGRvY3VtZW50cyB3aXRob3V0IHRocm93aW5nOyBkZWVwbWVyZ2Ugd291bGQgY3Jhc2ggb24gdGhlbS5cbiAgICBpZiAodHlwZW9mIG9sZFNldHRpbmdzICE9PSAnb2JqZWN0JyB8fCBvbGRTZXR0aW5ncyA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgYSB3b3JrZmxvdy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfVxuXG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICAvLyBVbmxpa2UgdGhlIHJlbGVhc2UgY2FsbGVyLCB0aGUgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGlzIGludGVudGlvbmFsIGhlcmU6IGEgcGVuZGluZ1xuICAgICAgLy8gZGVwbG95IHRoYXQgaXMgY2FuY2VsbGVkIGFuZCByZXBsYWNlZCBieSBhIG5ld2VyIG9uZSBsb3NlcyBub3RoaW5nIOKAlCB0aGUgbmV3ZXIgZGVwbG95XG4gICAgICAvLyBjb252ZXJnZXMgdGhlIGVudmlyb25tZW50IHRvIHRoZSBsYXRlc3Qgc3RhdGUgYW55d2F5LlxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9IGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZTtcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBlbXB0eSBqb2JzIChhIGJhcmUgYGpvYk5hbWU6YCBwYXJzZXMgYXMgbnVsbCksIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3MsIGFuZCBvdGhlclxuICAgIC8vIG9yZ2FuaXphdGlvbnMnIHJldXNhYmxlIHdvcmtmbG93czogYSBzYW1lLW5hbWVkIGByZXVzYWJsZS13b3JrZmxvd3NgIHJlcG9zaXRvcnkgZWxzZXdoZXJlXG4gICAgLy8gZm9sbG93cyBhIGRpZmZlcmVudCBjb250cmFjdCwgYW5kIG5vcm1hbGl6aW5nIGl0cyBjYWxsZXJzIChzZWNyZXQgaW5qZWN0aW9uL3JlbW92YWwsXG4gICAgLy8gcGVybWlzc2lvbnMpIGNvdWxkIGJyZWFrIHRoZW0uXG4gICAgaWYgKCFqb2IgfHwgIXBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIC8vIERlcGxveSBjYWxsZXJzIG5lZWQgbm8gcmVwb3NpdG9yeSB3cml0ZXM6IHRoZSBjYWxsZWQgcmV1c2FibGUgd29ya2Zsb3cgaW5oZXJpdHMgdGhlIGNhbGxlcidzXG4gIC8vIHRva2VuIHBlcm1pc3Npb25zLCByZXBvc2l0b3JpZXMgZGVmYXVsdCB0aGUgdG9rZW4gdG8gd3JpdGUsIGFuZCB0aGUgcmV1c2FibGUgZGVwbG95IHdvcmtmbG93XG4gIC8vIGF0IG1haW4gcGVyZm9ybXMgbm8gR0lUSFVCX1RPS0VOIHdyaXRlcy4gVGhlIHJlYWQtb25seSBkZWZhdWx0IGlzIGluamVjdGVkIGF0IHRoZSBKT0IgbGV2ZWxcbiAgLy8gKGpvYiBwZXJtaXNzaW9ucyBkbyBub3QgYWZmZWN0IHNpYmxpbmcgam9icywgc28gaW5saW5lIGpvYnMgb3IgcGlubmVkIGNhbGxlZXMg4oCUIHdob3NlIHdyaXRlXG4gIC8vIG5lZWRzIGFyZSB1bmF1ZGl0ZWQg4oCUIGtlZXAgdGhlaXJzKSwgYW5kIG9ubHkgd2hlbiBuZWl0aGVyIHRoZSB3b3JrZmxvdyBub3IgdGhlIGpvYiBkZWNsYXJlc1xuICAvLyBpdHMgb3duIHBlcm1pc3Npb25zIChPSURDIGRlcGxveXMgYWx3YXlzIGRvLCBmb3IgaWQtdG9rZW4pLiBydW4tc2NyaXB0IGNhbGxlcnMgYXJlIGV4Y2x1ZGVkXG4gIC8vIGJlY2F1c2UgYXJiaXRyYXJ5IHBhY2thZ2Ugc2NyaXB0cyBtYXkgcHVzaCBjb21taXRzLlxuICBpZiAoIW5ld1NldHRpbmdzLnBlcm1pc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2IpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2FsbCA9IHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpO1xuICAgICAgaWYgKCFqb2IucGVybWlzc2lvbnMgJiYgY2FsbD8ud29ya2Zsb3dOYW1lID09PSAnZGVwbG95JyAmJiBjYWxsLnJlZiA9PT0gJ21haW4nKSB7XG4gICAgICAgIGpvYi5wZXJtaXNzaW9ucyA9IHsgY29udGVudHM6ICdyZWFkJyB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6XG4gICAgY2FzZSAndGVzdC1ydXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgdGhlIGZvcmNlLXN5bmMgd29ya2Zsb3cgYmFzZWQgb24gdGhlIHN5bmMgd29ya2Zsb3cgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuLy8gd2IncyBnbG9iYWwgb3B0aW9ucyB0aGF0IGNvbnN1bWUgYSBmb2xsb3dpbmcgdmFsdWUgdG9rZW4gKGZyb20gc2hhcmVkT3B0aW9uc0J1aWxkZXIgcGx1c1xuLy8geWFyZ3NPcHRpb25zQnVpbGRlckZvckVudik7IGV2ZXJ5IG90aGVyIGAtYC1wcmVmaXhlZCB0b2tlbiBiZWZvcmUgdGhlIHN1YmNvbW1hbmQgaXMgYSBib29sZWFuLlxuY29uc3Qgd2JHbG9iYWxWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFsnLS13b3JraW5nLWRpcicsICctdycsICctLWVudicsICctLWNhc2NhZGUtZW52J10pO1xuXG4vLyBTdWJjb21tYW5kcyB0aGF0IHJ1biBhIEJJTkFSWSAoc28gdGhlIGZvbGxvd2luZyB0b2tlbiBjYW4gYmUgdGhlIHdiIGV4ZWN1dGFibGUpLCBwZXIgcnVubmVyOiBidW5cbi8vIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYSBwYWNrYWdlIHNjcmlwdCBvZiB0aGF0IG5hbWUpLCBucG0gaGFzIGBleGVjYC9geGAsXG4vLyBhbmQgcG5wbS95YXJuIChCZXJyeSkgaGF2ZSBgZXhlY2AvYGRseGAuXG5jb25zdCBydW5uZXJFeGVjdXRvclN1YmNvbW1hbmRzQnlSdW5uZXI6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHtcbiAgbnBtOiBuZXcgU2V0KFsnZXhlYycsICd4J10pLFxuICBwbnBtOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIHlhcm46IG5ldyBTZXQoWydleGVjJywgJ2RseCddKSxcbiAgYnVuOiBuZXcgU2V0KFsneCddKSxcbn07XG5cbi8vIFJ1bm5lciBvcHRpb25zIHRoYXQgY29uc3VtZSB0aGUgRk9MTE9XSU5HIHRva2VuIGFzIHRoZWlyIHZhbHVlLCBzbyBpdCBpcyBub3QgdGhlIHdiIGV4ZWN1dGFibGVcbi8vIChlLmcuIGBidW4gLS1jd2QgZGlyIHdiIGRlcGxveWAsIGBucHggLXAgcGtnIHdiIGRlcGxveWApLiBBIGNvbnNlcnZhdGl2ZSBzdXBlcnNldCBhY3Jvc3Ncbi8vIG5wbS9wbnBtL3lhcm4vYnVuIGFuZCB0aGUgbnB4L2J1bnggcGFja2FnZSBleGVjdXRvcnMuXG5jb25zdCBydW5uZXJWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgJy0tY3dkJyxcbiAgJy1DJyxcbiAgJy0tcHJlZml4JyxcbiAgJy0tZmlsdGVyJyxcbiAgJy1GJyxcbiAgJy0td29ya3NwYWNlJyxcbiAgJy13JyxcbiAgJy0tZGlyJyxcbiAgJy1wJyxcbiAgJy0tcGFja2FnZScsXG4gICctYycsXG4gICctLWNhbGwnLFxuXSk7XG5cbi8qKiBBZHZhbmNlIHBhc3QgYSBydW5uZXIncyBvcHRpb25zLCBjb25zdW1pbmcgYSBzZXBhcmF0ZSB2YWx1ZSB0b2tlbiB3aGVyZSBvbmUgYXBwbGllcy4gKi9cbmZ1bmN0aW9uIHNraXBSdW5uZXJPcHRpb25zKHRva2Vuczogc3RyaW5nW10sIHN0YXJ0SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgKHRva2Vuc1tpbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgaW5kZXgrKztcbiAgICBpZiAoIW9wdGlvbi5pbmNsdWRlcygnPScpICYmIHJ1bm5lclZhbHVlT3B0aW9ucy5oYXMob3B0aW9uKSAmJiBpbmRleCA8IHRva2Vucy5sZW5ndGgpIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIFRva2VuaXplIGEgc2hlbGwgY29tbWFuZCBsaW5lIGludG8gY29tbWFuZCBzZWdtZW50cywgZWFjaCBhIGxpc3Qgb2YgdG9rZW5zIHdpdGggcXVvdGVzIHJlbW92ZWQuXG4gKiBBIG5ldyBzZWdtZW50IHN0YXJ0cyBhdCBhbiB1bnF1b3RlZCBgJiZgL2B8fGAvYDtgL2B8YC9gJmA7IGFuIHVucXVvdGVkIGAjYCBzdGFydHMgYSBjb21tZW50IHRvXG4gKiBlbmQgb2YgbGluZTsgYSBiYWNrc2xhc2ggZXNjYXBlcyB0aGUgbmV4dCBjaGFyYWN0ZXIgKHNvIGBcXDtgIGlzIGEgbGl0ZXJhbCwgbm90IGEgc2VwYXJhdG9yKTtcbiAqIGdyb3VwaW5nIHBhcmVudGhlc2VzIGAoYC9gKWAgYXJlIHRva2VuIHNlcGFyYXRvcnMsIHNvIGAod2IgZGVwbG95KWAgdG9rZW5pemVzIGFzIGB3YiBkZXBsb3lgLlxuICogU2VnbWVudHMvdG9rZW5zIG1vZGVsIGNvbW1hbmQgc3RydWN0dXJlIHByZWNpc2VseSBlbm91Z2ggdGhhdCBxdW90ZWQgb3BlcmF0b3JzLCBlc2NhcGVkXG4gKiBvcGVyYXRvcnMsIGNvbW1lbnRzLCBhbmQgc3Vic2hlbGwgZ3JvdXBzIG5laXRoZXIgZmFicmljYXRlIG5vciBoaWRlIGEgYHdiIGRlcGxveWAgaW52b2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVTaGVsbENvbW1hbmQoc2NyaXB0OiBzdHJpbmcpOiB7IHNlZ21lbnRzOiBzdHJpbmdbXVtdOyBzYXdIZXJlZG9jOiBib29sZWFuIH0ge1xuICBjb25zdCBzZWdtZW50czogc3RyaW5nW11bXSA9IFtdO1xuICBsZXQgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9ICcnO1xuICBsZXQgaW5Ub2tlbiA9IGZhbHNlO1xuICBsZXQgcXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLy8gV2hldGhlciB0aGUgc2NyaXB0IHVzZXMgYW55IGhlcmVkb2MuIEZhaXRoZnVsbHkgY2xhc3NpZnlpbmcgd2hpY2ggYm9keSBsaW5lcyBhcmUgZGF0YSAodGhlXG4gIC8vIGRlbGltaXRlciB3b3JkIGNhbiBiZSBxdW90ZWQvYmFja3NsYXNoLWVzY2FwZWQsIGA8PC1gIHN0cmlwcyBsZWFkaW5nIHRhYnMsIHRlcm1pbmF0b3JzIG1hdGNoXG4gIC8vIGV4YWN0bHkpIGlzIG1vcmUgdGhhbiB0aGlzIHBhcnNlciBtb2RlbHMsIHNvIGEgaGVyZWRvYyBhbnl3aGVyZSBtYWtlcyBkZXRlY3Rpb24gcmV0dXJuIGZhbHNlLlxuICBsZXQgc2F3SGVyZWRvYyA9IGZhbHNlO1xuICAvLyBIZXJlZG9jIGRlbGltaXRlcnMgd2hvc2UgYm9kaWVzIGJlZ2luIGF0IHRoZSBORVhUIG5ld2xpbmU6IGBjYXQgPDxBIDw8QmAgcXVldWVzIEEgdGhlbiBCLCBhbmRcbiAgLy8gdGhlIGNvbW1hbmRzIEFGVEVSIHRoZSBgPDxgIGhlYWRlciBvbiB0aGUgc2FtZSBsaW5lIHN0aWxsIGV4ZWN1dGUsIHNvIHRoZSBoZWFkZXIgaXMgcmVjb3JkZWRcbiAgLy8gaGVyZSBhbmQgdGhlIGJvZGllcyBhcmUgc2tpcHBlZCBvbmx5IHdoZW4gdGhlIGxpbmUncyBuZXdsaW5lIGlzIHJlYWNoZWQuXG4gIGxldCBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNraXBIZXJlZG9jQm9kaWVzID0gKGZyb21JbmRleDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICBsZXQgY3Vyc29yID0gZnJvbUluZGV4O1xuICAgIGZvciAoY29uc3QgZGVsaW1pdGVyIG9mIHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVycykge1xuICAgICAgd2hpbGUgKGN1cnNvciA8IHNjcmlwdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbGluZVN0YXJ0ID0gY3Vyc29yICsgMTtcbiAgICAgICAgbGV0IGxpbmVFbmQgPSBsaW5lU3RhcnQ7XG4gICAgICAgIHdoaWxlIChsaW5lRW5kIDwgc2NyaXB0Lmxlbmd0aCAmJiBzY3JpcHRbbGluZUVuZF0gIT09ICdcXG4nKSBsaW5lRW5kKys7XG4gICAgICAgIGN1cnNvciA9IGxpbmVFbmQ7XG4gICAgICAgIGlmIChzY3JpcHQuc2xpY2UobGluZVN0YXJ0LCBsaW5lRW5kKS50cmltKCkgPT09IGRlbGltaXRlcikgYnJlYWs7XG4gICAgICAgIGlmIChsaW5lRW5kID49IHNjcmlwdC5sZW5ndGgpIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMgPSBbXTtcbiAgICByZXR1cm4gY3Vyc29yO1xuICB9O1xuICBjb25zdCBlbmRUb2tlbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoaW5Ub2tlbikgdG9rZW5zLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9ICcnO1xuICAgIGluVG9rZW4gPSBmYWxzZTtcbiAgfTtcbiAgY29uc3QgZW5kU2VnbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICBlbmRUb2tlbigpO1xuICAgIHNlZ21lbnRzLnB1c2godG9rZW5zKTtcbiAgICB0b2tlbnMgPSBbXTtcbiAgfTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNjcmlwdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBzY3JpcHRbaW5kZXhdID8/ICcnO1xuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIHF1b3RlID09PSAnXCInKSB7XG4gICAgICAgIC8vIEluc2lkZSBkb3VibGUgcXVvdGVzLCBiYWNrc2xhc2gtbmV3bGluZSBpcyBzdGlsbCBhIGxpbmUgY29udGludWF0aW9uIChib3RoIHJlbW92ZWQpO1xuICAgICAgICAvLyBhbnkgb3RoZXIgZXNjYXBlZCBjaGFyYWN0ZXIgY29udHJpYnV0ZXMgbGl0ZXJhbGx5LlxuICAgICAgICBpZiAoc2NyaXB0W2luZGV4ICsgMV0gPT09ICdcXG4nKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGN1cnJlbnQgKz0gc2NyaXB0WysraW5kZXhdID8/ICcnO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09IHF1b3RlKSBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGVsc2UgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnKSB7XG4gICAgICAvLyBCYWNrc2xhc2gtbmV3bGluZSBpcyBhIGxpbmUgY29udGludWF0aW9uOiB0aGUgc2hlbGwgcmVtb3ZlcyBib3RoLCBqb2luaW5nIHRoZSBsaW5lc1xuICAgICAgLy8gd2l0aG91dCBpbnRyb2R1Y2luZyBhIHRva2VuIGJvdW5kYXJ5LiBBbnkgb3RoZXIgZXNjYXBlZCBjaGFyYWN0ZXIgaXMgYSBsaXRlcmFsLlxuICAgICAgaWYgKHNjcmlwdFtpbmRleCArIDFdID09PSAnXFxuJykge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgKz0gc2NyaXB0WysraW5kZXhdID8/ICcnO1xuICAgICAgaW5Ub2tlbiA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gXCInXCIgfHwgY2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBxdW90ZSA9IGNoYXJhY3RlcjtcbiAgICAgIGluVG9rZW4gPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEEgYDw8YC9gPDwtYCBoZXJlZG9jIHJlZGlyZWN0aW9uOiBpdHMgYm9keSBsaW5lcyAodXAgdG8gdGhlIGRlbGltaXRlciBsaW5lKSBhcmUgREFUQSwgbm90XG4gICAgLy8gY29tbWFuZHMsIHNvIGBjYXQgPDwnRU9GJ1xcbndiIGRlcGxveVxcbkVPRmAgbXVzdCBub3QgcmVhZCBgd2IgZGVwbG95YCBhcyBhbiBpbnZvY2F0aW9uLiBTaW5jZVxuICAgIC8vIHRoZSBjYWxsZXIgZGVjbGluZXMgb24gQU5ZIGhlcmVkb2MsIGZsYWcgaXQgdGhlIGluc3RhbnQgYDw8YCBhcHBlYXJzIOKAlCBiZWZvcmUgcGFyc2luZyB0aGVcbiAgICAvLyBkZWxpbWl0ZXIgd29yZCDigJQgc28gYW4gZXhvdGljIGRlbGltaXRlciAoYDw8K2ApIHRoZSB3b3JkIHNjYW5uZXIgY2Fubm90IHJlYWQgc3RpbGwgZGVjbGluZXMuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJzwnICYmIHNjcmlwdFtpbmRleCArIDFdID09PSAnPCcpIHtcbiAgICAgIHNhd0hlcmVkb2MgPSB0cnVlO1xuICAgICAgbGV0IGN1cnNvciA9IGluZGV4ICsgMjtcbiAgICAgIGlmIChzY3JpcHRbY3Vyc29yXSA9PT0gJy0nKSBjdXJzb3IrKztcbiAgICAgIHdoaWxlICgvWyBcXHRdL3UudGVzdChzY3JpcHRbY3Vyc29yXSA/PyAnJykpIGN1cnNvcisrO1xuICAgICAgbGV0IGRlbGltaXRlciA9ICcnO1xuICAgICAgLy8gVGhlIGRlbGltaXRlciB3b3JkIG1heSBiZSBxdW90ZWQgKGA8PCdFT0YnYCkgb3IgYmFja3NsYXNoLWVzY2FwZWQgKGA8PFxcRU9GYCk7IGVpdGhlciBmb3JtXG4gICAgICAvLyBqdXN0IGRpc2FibGVzIGJvZHkgZXhwYW5zaW9uLCBzbyBjb2xsZWN0IHRoZSBiYXJlIHdvcmQuIE1pc3NpbmcgdGhlIGVzY2FwZWQgZm9ybSB3b3VsZCBkcm9wXG4gICAgICAvLyBgc2F3SGVyZWRvY2AgYW5kIHJlYWQgdGhlIGhlcmVkb2MgYm9keSBhcyBjb21tYW5kcy5cbiAgICAgIGxldCBkZWxpbWl0ZXJRdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgd2hpbGUgKGN1cnNvciA8IHNjcmlwdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGVsaW1pdGVyQ2hhciA9IHNjcmlwdFtjdXJzb3JdID8/ICcnO1xuICAgICAgICBpZiAoZGVsaW1pdGVyUXVvdGUpIHtcbiAgICAgICAgICBpZiAoZGVsaW1pdGVyQ2hhciA9PT0gZGVsaW1pdGVyUXVvdGUpIGRlbGltaXRlclF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGVsc2UgZGVsaW1pdGVyICs9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsaW1pdGVyQ2hhciA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgLy8gQSBiYWNrc2xhc2ggcXVvdGVzIHRoZSBuZXh0IGNoYXJhY3RlciBpbnRvIHRoZSBkZWxpbWl0ZXIgd29yZCAoYDw8XFxFT0ZgIOKGkiBgRU9GYCkuXG4gICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgZGVsaW1pdGVyICs9IHNjcmlwdFtjdXJzb3JdID8/ICcnO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbGltaXRlckNoYXIgPT09IFwiJ1wiIHx8IGRlbGltaXRlckNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBkZWxpbWl0ZXJRdW90ZSA9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoL1tcXHcuLV0vdS50ZXN0KGRlbGltaXRlckNoYXIpKSB7XG4gICAgICAgICAgZGVsaW1pdGVyICs9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY3Vyc29yKys7XG4gICAgICB9XG4gICAgICBpZiAoZGVsaW1pdGVyKSB7XG4gICAgICAgIC8vIFRoZSBgPDxkZWxpbWAgaGVhZGVyIGlzIGEgcmVkaXJlY3Rpb24gKG5vdCBhIHRva2VuKTsgcmVjb3JkIHRoZSBkZWxpbWl0ZXIgYW5kIGtlZXBcbiAgICAgICAgLy8gcGFyc2luZyB0aGUgcmVzdCBvZiB0aGlzIGxpbmUg4oCUIGl0cyBib2R5IGlzIHNraXBwZWQgd2hlbiB0aGUgbmV3bGluZSBpcyByZWFjaGVkLlxuICAgICAgICBlbmRUb2tlbigpO1xuICAgICAgICBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMucHVzaChkZWxpbWl0ZXIpO1xuICAgICAgICBpbmRleCA9IGN1cnNvciAtIDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnIycgJiYgIWluVG9rZW4pIHtcbiAgICAgIC8vIENvbW1lbnQgcnVucyB0byBlbmQgb2YgbGluZTsgZW5kIHRoZSBjdXJyZW50IGNvbW1hbmQgc2VnbWVudCBhbmQgbGV0IHRoZSBsb29wIHJlc3VtZSBhdFxuICAgICAgLy8gdGhlIG5ld2xpbmUgc28gdGhlIG5leHQgbGluZSBpcyBwYXJzZWQgYXMgaXRzIG93biBzZWdtZW50LlxuICAgICAgZW5kU2VnbWVudCgpO1xuICAgICAgd2hpbGUgKGluZGV4ICsgMSA8IHNjcmlwdC5sZW5ndGggJiYgc2NyaXB0W2luZGV4ICsgMV0gIT09ICdcXG4nKSBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcmJyB8fCBjaGFyYWN0ZXIgPT09ICd8JyB8fCBjaGFyYWN0ZXIgPT09ICc7JyB8fCBjaGFyYWN0ZXIgPT09ICdcXG4nKSB7XG4gICAgICBlbmRTZWdtZW50KCk7XG4gICAgICBpZiAoKGNoYXJhY3RlciA9PT0gJyYnIHx8IGNoYXJhY3RlciA9PT0gJ3wnKSAmJiBzY3JpcHRbaW5kZXggKyAxXSA9PT0gY2hhcmFjdGVyKSBpbmRleCsrO1xuICAgICAgLy8gQSBuZXdsaW5lIHRoYXQgY2xvc2VzIGEgaGVyZWRvYyBoZWFkZXIgbGluZSBjb25zdW1lcyB0aGUgcXVldWVkIGJvZGllcyBiZWZvcmUgdGhlIG5leHRcbiAgICAgIC8vIGNvbW1hbmQuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxuJyAmJiBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMubGVuZ3RoID4gMCkgaW5kZXggPSBza2lwSGVyZWRvY0JvZGllcyhpbmRleCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJygnIHx8IGNoYXJhY3RlciA9PT0gJyknKSB7XG4gICAgICBlbmRUb2tlbigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICgvXFxzL3UudGVzdChjaGFyYWN0ZXIpKSB7XG4gICAgICBlbmRUb2tlbigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGN1cnJlbnQgKz0gY2hhcmFjdGVyO1xuICAgIGluVG9rZW4gPSB0cnVlO1xuICB9XG4gIGVuZFNlZ21lbnQoKTtcbiAgcmV0dXJuIHsgc2VnbWVudHMsIHNhd0hlcmVkb2MgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVwbG95IHNjcmlwdCBpbnZva2VzIGB3YiDigKYgZGVwbG95YCBhdCBjb21tYW5kIHBvc2l0aW9uLiBFbnYgYXNzaWdubWVudHMsIHBhY2thZ2VcbiAqIHJ1bm5lcnMsIGFuZCBnbG9iYWwgeWFyZ3Mgb3B0aW9ucyAod2l0aCB0aGVpciB2YWx1ZSB0b2tlbnMpIG1heSBwcmVjZWRlIHRoZSBkZXBsb3kgY29tbWFuZDtcbiAqIHNoZWxsIHF1b3RpbmcsIGVzY2FwaW5nLCBjb21tZW50cywgYW5kIGdyb3VwaW5nIGFyZSBob25vcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdDogc3RyaW5nLCBzY3JpcHROYW1lczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBjb25zdCB7IHNlZ21lbnRzLCBzYXdIZXJlZG9jIH0gPSB0b2tlbml6ZVNoZWxsQ29tbWFuZChkZXBsb3lTY3JpcHQpO1xuICAvLyBBIGhlcmVkb2MgbWFrZXMgYm9keS12cy1jb21tYW5kIGNsYXNzaWZpY2F0aW9uIHVucmVsaWFibGUgKHNlZSB0b2tlbml6ZVNoZWxsQ29tbWFuZCkuXG4gIGlmIChzYXdIZXJlZG9jKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgdG9rZW5zIG9mIHNlZ21lbnRzKSB7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmIC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKj0vdS50ZXN0KHRva2Vuc1tpbmRleF0gPz8gJycpKSBpbmRleCsrO1xuICAgIC8vIExlYWRpbmcgbGF1bmNoZXJzIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBlbnZgICh3aXRoIG9wdGlvbnMgKyBLRVk9dmFsdWUgYXNzaWdubWVudHMpXG4gICAgLy8gYW5kIHRoZSBQT1NJWCBgY29tbWFuZGAgYnVpbHRpbiAod2l0aCBpdHMgYC1wYC9gLXZgL2AtVmAgb3B0aW9ucykuIENvbW1hbmQtcG9zaXRpb24gc2hlbGxcbiAgICAvLyByZXNlcnZlZCB3b3JkcyBhbmQgb3RoZXIgbGF1bmNoZXJzIChgaWZgL2B0aGVuYC9gZm9yYC9gdGltZWAvYGV4ZWNgL2AhYC9icmFjZSBncm91cHMsIOKApikgYXJlXG4gICAgLy8gTk9UIG1vZGVsZWQ6IHRoZXkgbGVhdmUgYSBub24tYHdiYCBmaXJzdCB0b2tlbiwgc28gdGhlIHNlZ21lbnQgc2ltcGx5IGRvZXMgbm90IG1hdGNoLiBUaGlzIGlzXG4gICAgLy8gYSBkZWxpYmVyYXRlIGZhbHNlLW5lZ2F0aXZlIGZvciBnZW5lcmF0ZWQgZ3VpZGFuY2UuXG4gICAgaWYgKHRva2Vuc1tpbmRleF0gPT09ICdlbnYnKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICAgIGlmICgvXltBLVphLXpfXVtBLVphLXowLTlfXSo9L3UudGVzdCh0b2tlbikpIGluZGV4Kys7XG4gICAgICAgIC8vIGVudidzIGRpcmVjdG9yeSB2YWx1ZSBtYXkgYmUgc2VwYXJhdGUgb3IgYXR0YWNoZWQgKGAtQ2RpcmAsIGAtLWNoZGlyPWRpcmApLiBJdCBjaGFuZ2VzXG4gICAgICAgIC8vIHdoZXJlIHdiIHJ1bnMgYnV0IG5vdCB3aGV0aGVyIHRoZSBjb21tYW5kIGludm9rZXMgd2IgZGVwbG95LlxuICAgICAgICBlbHNlIGlmICh0b2tlbiA9PT0gJy1DJyB8fCB0b2tlbiA9PT0gJy0tY2hkaXInKSBpbmRleCArPSAyO1xuICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKCctQycpIHx8IHRva2VuLnN0YXJ0c1dpdGgoJy0tY2hkaXI9JykpIGluZGV4Kys7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuID09PSAnLXUnKSBpbmRleCArPSAyO1xuICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKCctJykpIGluZGV4Kys7XG4gICAgICAgIGVsc2UgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGBjb21tYW5kIENNRGAgZXhlY3V0ZXMgQ01ELCBidXQgYGNvbW1hbmQgLXZgL2AtViBDTURgIG9ubHkgUVVFUlkgaXRzIGF2YWlsYWJpbGl0eSB3aXRob3V0XG4gICAgLy8gcnVubmluZyBpdCwgc28gYSBkZXBsb3kgYmVoaW5kIHRoZW0gZG9lcyBub3QgcnVuLiBUaGUgYHZgL2BWYCBmbGFnIG1heSBiZSBjbHVzdGVyZWQgd2l0aFxuICAgIC8vIG90aGVyIG9wdGlvbiBsZXR0ZXJzIChgY29tbWFuZCAtcHYgd2JgKSwgc28gbWF0Y2ggYW55IG9wdGlvbiBsZXR0ZXIgY2x1c3RlciBjb250YWluaW5nIGl0LlxuICAgIHdoaWxlICh0b2tlbnNbaW5kZXhdID09PSAnY29tbWFuZCcpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBsZXQgcXVlcmllc09ubHkgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgKHRva2Vuc1tpbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBpZiAoL14tW0EtWmEtel0qW3ZWXVtBLVphLXpdKiQvdS50ZXN0KHRva2Vuc1tpbmRleF0gPz8gJycpKSBxdWVyaWVzT25seSA9IHRydWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICBpZiAocXVlcmllc09ubHkpIHtcbiAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbmRleCA8IDApIGNvbnRpbnVlO1xuICAgIC8vIFJlc29sdmUgYSBydW5uZXIgcHJlZml4IHRvIHdoZXRoZXIgdGhlIGZvbGxvd2luZyB0b2tlbiBpcyBhIEJJTkFSWSAodGhlIHdiIGV4ZWN1dGFibGUpIG9yIGFcbiAgICAvLyBwYWNrYWdlIFNDUklQVCBuYW1lLiBgYnVueGAvYG5weGAgYW5kIGA8cG0+IHh8ZGx4fGV4ZWNgIHJ1biBhIGJpbmFyeTsgYDxwbT4gcnVufHJ1bi1zY3JpcHRgXG4gICAgLy8gKGFuZCBiYXJlIGBucG0gPG5hbWU+YCwgb3IgYW55IHJ1bm5lciBmb2xsb3dlZCBieSBgLS1gKSBydW4gYSBwYWNrYWdlIHNjcmlwdCDigJQgc29cbiAgICAvLyBgbnBtIHJ1biB3YiBkZXBsb3lgIGV4ZWN1dGVzIHRoZSBzY3JpcHQgbmFtZWQgYHdiYCwgbm90IHRoZSB3YiBiaW5hcnksIGFuZCBtdXN0IGJlIHJlamVjdGVkLlxuICAgIGlmIChbJ25wbScsICdwbnBtJywgJ3lhcm4nLCAnYnVuJ10uaW5jbHVkZXModG9rZW5zW2luZGV4XSA/PyAnJykpIHtcbiAgICAgIGNvbnN0IHJ1bm5lciA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICBpbmRleCA9IHNraXBSdW5uZXJPcHRpb25zKHRva2VucywgaW5kZXggKyAxKTtcbiAgICAgIGNvbnN0IHN1YmNvbW1hbmQgPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgaWYgKFsncnVuJywgJ3J1bi1zY3JpcHQnXS5pbmNsdWRlcyhzdWJjb21tYW5kKSkgY29udGludWU7IC8vIHJ1bnMgYSBwYWNrYWdlIHNjcmlwdCwgbm90IHdiXG4gICAgICAvLyBFeGVjdXRvciBzdWJjb21tYW5kcyBhcmUgcnVubmVyLVNQRUNJRklDOiBidW4gcmVzZXJ2ZXMgb25seSBgeGAgKGBidW4gZGx4YC9gYnVuIGV4ZWNgIHJ1biBhXG4gICAgICAvLyBwYWNrYWdlIHNjcmlwdCBuYW1lZCBkbHgvZXhlYykuIFJlYWwgYnVpbHQtaW4gZXhlY3V0b3JzIChgZXhlY2AvYHhgLCBhbmQgYGRseGAgZm9yIHBucG0pXG4gICAgICAvLyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBhIHNhbWUtbmFtZWQgc2NyaXB0LCBzbyB0aGV5IGFyZSBOT1Qgc2hhZG93LWNoZWNrZWQuIE9ubHkgYHlhcm4gZGx4YCBpc1xuICAgICAgLy8gYW1iaWd1b3VzIOKAlCBhIEJlcnJ5IGJ1aWx0LWluIGJ1dCBhIHBhY2thZ2UgU0NSSVBUIGluIFlhcm4gQ2xhc3NpYyDigJQgc28gYSBkZWNsYXJlZCBgZGx4YFxuICAgICAgLy8gc2NyaXB0IG1ha2VzIGB5YXJuIGRseGAgZGVjbGluZSAoZmFsbCB0aHJvdWdoIHRvIHRoZSBwYWNrYWdlLXNjcmlwdCBjaGVja3MpLlxuICAgICAgY29uc3QgaXNZYXJuRGx4U2hhZG93ZWRCeVNjcmlwdCA9IHJ1bm5lciA9PT0gJ3lhcm4nICYmIHN1YmNvbW1hbmQgPT09ICdkbHgnICYmIHNjcmlwdE5hbWVzLmhhcygnZGx4Jyk7XG4gICAgICBpZiAocnVubmVyRXhlY3V0b3JTdWJjb21tYW5kc0J5UnVubmVyW3J1bm5lcl0/LmhhcyhzdWJjb21tYW5kKSAmJiAhaXNZYXJuRGx4U2hhZG93ZWRCeVNjcmlwdCkge1xuICAgICAgICBpbmRleCsrOyAvLyBiaW5hcnkgcnVubmVyIChwbnBtIGRseCwgYnVuIHgsIGBucG0gZXhlYyAtLSB3YiDigKZgKVxuICAgICAgICBpZiAodG9rZW5zW2luZGV4XSA9PT0gJy0tJykgaW5kZXgrKzsgLy8gdGhlIGV4ZWN1dG9yJ3Mgb3B0aW9uYWwgYC0tYCBiZWZvcmUgdGhlIGNvbW1hbmRcbiAgICAgIH0gZWxzZSBpZiAocnVubmVyID09PSAnbnBtJykge1xuICAgICAgICBjb250aW51ZTsgLy8gYmFyZSBgbnBtIHdiYCBuZXZlciBydW5zIGEgYmluYXJ5XG4gICAgICB9IGVsc2UgaWYgKHRva2Vuc1tpbmRleF0gPT09ICd3YicgJiYgc2NyaXB0TmFtZXMuaGFzKCd3YicpKSB7XG4gICAgICAgIC8vIEJhcmUgYGJ1bi9wbnBtL3lhcm4gd2JgIHJ1bnMgYSBwYWNrYWdlIFNDUklQVCBuYW1lZCBgd2JgIHdoZW4gb25lIGV4aXN0cyAocGFzc2luZyBgZGVwbG95YFxuICAgICAgICAvLyBhcyBpdHMgYXJndW1lbnQpLCBub3QgdGhlIHdiIGJpbmFyeS5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChbJ2J1bngnLCAnbnB4J10uaW5jbHVkZXModG9rZW5zW2luZGV4XSA/PyAnJykpIHtcbiAgICAgIGluZGV4ID0gc2tpcFJ1bm5lck9wdGlvbnModG9rZW5zLCBpbmRleCArIDEpO1xuICAgIH1cbiAgICBpZiAodG9rZW5zW2luZGV4XSAhPT0gJ3diJykgY29udGludWU7XG4gICAgY29uc3Qgd2JBcmdzID0gdG9rZW5zLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gU2tpcCBnbG9iYWwgb3B0aW9ucyAoYW5kIGFueSB2YWx1ZSB0b2tlbiBhIHZhbHVlLWJlYXJpbmcgb3B0aW9uIGNvbnN1bWVzKSBzbyB0aGUgRklSU1RcbiAgICAvLyBjb21tYW5kIHRva2VuIGRlY2lkZXM6IGB3YiAtLWNhc2NhZGUtZW52IHByb2R1Y3Rpb24gZGVwbG95YCBhbmQgYHdiIC13IHBhY2thZ2VzL2FwaSBkZXBsb3lgXG4gICAgLy8gbWF0Y2gsIHdoaWxlIHN1YmNvbW1hbmRzIG93bmluZyB0aGVpciBvd24gYGRlcGxveWAgKGB3YiBwcmlzbWEgZGVwbG95YCwgYHdiIHJldHJ5IGRlcGxveWApXG4gICAgLy8gZG8gbm90LiBgLS1vcHQ9dmFsdWVgIGNhcnJpZXMgaXRzIHZhbHVlIGlubGluZSwgc28gb25seSB0aGUgc3BhY2Utc2VwYXJhdGVkIGZvcm0gc2tpcHMgb25lLlxuICAgIGxldCBjb21tYW5kSW5kZXggPSAwO1xuICAgIHdoaWxlIChjb21tYW5kSW5kZXggPCB3YkFyZ3MubGVuZ3RoICYmICh3YkFyZ3NbY29tbWFuZEluZGV4XSA/PyAnJykuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICBjb25zdCBmbGFnID0gd2JBcmdzW2NvbW1hbmRJbmRleF0gPz8gJyc7XG4gICAgICBjb21tYW5kSW5kZXgrKztcbiAgICAgIGlmICh3Ykdsb2JhbFZhbHVlT3B0aW9ucy5oYXMoZmxhZykgJiYgY29tbWFuZEluZGV4IDwgd2JBcmdzLmxlbmd0aCkgY29tbWFuZEluZGV4Kys7XG4gICAgfVxuICAgIGlmICh3YkFyZ3NbY29tbWFuZEluZGV4XSAhPT0gJ2RlcGxveScpIGNvbnRpbnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSB3b3JrZmxvd3MgZGlyZWN0b3J5IGhvbGRzIGEgbGl2ZSBjYWxsZXIgb2YgdGhlIHJldXNhYmxlIENsb3VkZmxhcmUgZGVwbG95IHdvcmtmbG93LlxuICogWUFNTCBpcyBwYXJzZWQgYW5kIG9ubHkgYGpvYnMuKi51c2VzYCB2YWx1ZXMgYXJlIGluc3BlY3RlZCAoYSByYXctdGV4dCBzZWFyY2ggd291bGQgbWF0Y2hcbiAqIGNvbW1lbnRzIG9yIGBydW46YCBzdHJpbmdzKSwgd2l0aCBhIGBkZXBsb3kqYC1maWxlbmFtZSBzaG9ydGN1dCBhbmQgYSBjb25zZXJ2YXRpdmUgcmF3LXRleHRcbiAqIGZhbGxiYWNrIGZvciB1bnBhcnNlYWJsZSBmaWxlcy4gVXNlZCBieSB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gZ2VuZXJhdG9yIHNvIGdlbmVyYXRlZCBndWlkYW5jZVxuICogZGVzY3JpYmVzIG9ubHkgd29ya2Zsb3dzIHRoYXQgZXhpc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cod29ya2Zsb3dzRGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBlbnRyaWVzOiBmcy5EaXJlbnRbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMod29ya2Zsb3dzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBvd25lci9yZXBvc2l0b3J5IChHaXRIdWIgdHJlYXRzIHRoZW0gc28pLCBjYXNlLXNlbnNpdGl2ZSBwYXRoL3JlZiDigJQgbWF0Y2hpbmdcbiAgLy8gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCwgdXNlZCBmb3IgdGhlIHVucGFyc2VhYmxlLVlBTUwgcmF3LXRleHQgZmFsbGJhY2sgb25seS5cbiAgY29uc3QgZGVwbG95Q2FsbFBhdHRlcm4gPSAvW14vXStcXC9yZXVzYWJsZS13b3JrZmxvd3NcXC9cXC5naXRodWJcXC93b3JrZmxvd3NcXC9kZXBsb3lcXC55YT9tbEAvaXU7XG4gIGNvbnN0IGNhbGxzRGVwbG95V29ya2Zsb3cgPSAodXNlczogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICAgIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwodXNlcyk/LndvcmtmbG93TmFtZSA9PT0gJ2RlcGxveSc7XG4gIHJldHVybiBlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiB7XG4gICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhL1xcLnlhP21sJC91LnRlc3QoZW50cnkubmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgcmV0dXJuIHRydWU7XG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzRGlyUGF0aCwgZW50cnkubmFtZSksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3JrZmxvdyA9IHlhbWwubG9hZChjb250ZW50KSBhcyBXb3JrZmxvdyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh3b3JrZmxvdyAmJiB0eXBlb2Ygd29ya2Zsb3cgPT09ICdvYmplY3QnICYmIHdvcmtmbG93LmpvYnMgJiYgdHlwZW9mIHdvcmtmbG93LmpvYnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHdvcmtmbG93LmpvYnMpLnNvbWUoKGpvYikgPT4gY2FsbHNEZXBsb3lXb3JrZmxvdyhqb2I/LnVzZXMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkZXBsb3lDYWxsUGF0dGVybi50ZXN0KGNvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIFRoZSByZXVzYWJsZSB3b3JrZmxvd3MgdGhhdCBkZWNsYXJlIEZOT1hfQUdFX0tFWSBhbmQgVkVSREFDQ0lPX1RPS0VOIHVuZGVyXG4vLyBvbi53b3JrZmxvd19jYWxsLnNlY3JldHMgKHNlZSBXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MpLiBQYXNzaW5nIGVpdGhlciBzZWNyZXQgdG8gYW55XG4vLyBvdGhlciBjYWxsZWUgaXMgYSBHaXRIdWIgZXJyb3IuXG5jb25zdCBpbnN0YWxsQ2FwYWJsZVJldXNhYmxlV29ya2Zsb3dzID0gbmV3IFNldChbJ2RlcGxveScsICdyZWxlYXNlJywgJ3J1bi1zY3JpcHQnLCAndGVzdCddKTtcbmNvbnN0IHJldXNhYmxlV29ya2Zsb3dQZXJtaXNzaW9uczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gIC8vIHNraXAtZHVwbGljYXRlLWFjdGlvbnMgcmVhZHMgd29ya2Zsb3cgcnVuczsgY2FuY2VsX290aGVycyBpcyBmYWxzZSwgc28gcmVhZCBpcyBlbm91Z2guXG4gICd0ZXN0LXJ1c3QnOiB7IGFjdGlvbnM6ICdyZWFkJywgY29udGVudHM6ICdyZWFkJyB9LFxuICAnc2VtYW50aWMtcHInOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLCBzdGF0dXNlczogJ3dyaXRlJyB9LFxuICAnY2xvc2UtY29tbWVudCc6IHsgJ3B1bGwtcmVxdWVzdHMnOiAnd3JpdGUnIH0sXG59O1xuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgLy8gYHNlY3JldHM6IGluaGVyaXRgIChwYXJzZWQgYnkganMteWFtbCBhcyBhIHBsYWluIHN0cmluZykgYWxyZWFkeSBmb3J3YXJkcyBldmVyeSBjYWxsZXIgc2VjcmV0XG4gIC8vIGluY2x1ZGluZyB0aGUgb25lcyBpbmplY3RlZCBiZWxvdywgc28gcHJlc2VydmUgaXQgdW50b3VjaGVkIOKAlCBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvbiB0aGVcbiAgLy8gc3RyaW5nIHdvdWxkIHRocm93LiBDYXZlYXQ6IGBpbmhlcml0YCBmb3J3YXJkcyBzZWNyZXRzIHVuZGVyIHRoZWlyIGV4aXN0aW5nIE5BTUVTLCBzbyBpdCBjYW5cbiAgLy8gbmV2ZXIgZmVlZCBQVUJMSUNfRk5PWF9BR0VfS0VZIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWTsgYSBoYW5kLXdyaXR0ZW5cbiAgLy8gaW5oZXJpdCBjYWxsZXIgaW4gYSBQVUJMSUMgZm5veCByZXBvc2l0b3J5IG11c3QgYmUgY29udmVydGVkIHRvIGFuIGV4cGxpY2l0IG1hcHBpbmcgbWFudWFsbHlcbiAgLy8gKHdiZnkgbmV2ZXIgZ2VuZXJhdGVzIHRoZSBpbmhlcml0IGZvcm0sIGFuZCBoYW5kLXdyaXR0ZW4gZGV2aWF0aW9ucyBhcmUgZml4ZWQgaW4gdGhlIHRhcmdldFxuICAvLyByZXBvc2l0b3J5IGJ5IHBvbGljeSkuXG4gIGNvbnN0IHNlY3JldHMgPSBqb2Iuc2VjcmV0cyA9PT0gJ2luaGVyaXQnID8gdW5kZWZpbmVkIDogKGpvYi5zZWNyZXRzID0gam9iLnNlY3JldHMgPz8ge30pO1xuXG4gIGlmIChzZWNyZXRzICYmIChraW5kID09PSAndGVzdCcgfHwga2luZCA9PT0gJ3JlbGVhc2UnKSkge1xuICAgIHNlY3JldHMuR0hfVE9LRU4gPSAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JztcbiAgfVxuXG4gIC8vIGZub3gudG9tbCBjYXJyaWVzIGFnZS1lbmNyeXB0ZWQgYXBwIHNlY3JldHM7IENJIGRlY3J5cHRzIHRoZW0gd2l0aCB0aGUgRk5PWF9BR0VfS0VZIChvciwgZm9yXG4gIC8vIHB1YmxpYyByZXBvc2l0b3JpZXMsIFBVQkxJQ19GTk9YX0FHRV9LRVkpIG9yZ2FuaXphdGlvbiBzZWNyZXQuXG4gIC8vIEtleSB0aGUgaW5qZWN0aW9uIG9uIHRoZSAqY2FsbGVkKiByZXVzYWJsZSB3b3JrZmxvdywgbm90IHRoZSBjYWxsZXIncyBmaWxlbmFtZTogY2FsbGVycyBtYXkgaGF2ZVxuICAvLyBhcmJpdHJhcnkgbmFtZXMgKGUuZy4gc2NoZWR1bGVkIHJ1bi1zY3JpcHQgY2FsbGVycyksIGFuZCBHaXRIdWIgcmVqZWN0cyBwYXNzaW5nIGEgc2VjcmV0IHRoYXQgdGhlXG4gIC8vIGNhbGxlZSBkb2VzIG5vdCBkZWNsYXJlLlxuICAvLyBPbmx5IGFuIEBtYWluIGNhbGxlZSBpcyBrbm93biB0byBmb2xsb3cgdGhlIGN1cnJlbnQgc2VjcmV0IGNvbnRyYWN0OiBhIHdvcmtmbG93IHBpbm5lZCB0byBhblxuICAvLyBvbGRlciB0YWcgb3IgU0hBIG1heSBzdGlsbCBkZWNsYXJlIE5QTV9UT0tFTiAoYW5kIG5vdCBWRVJEQUNDSU9fVE9LRU4pLCBhbmQgR2l0SHViIHJlamVjdHMgYVxuICAvLyBjYWxsZXIgd2hvc2Ugc2VjcmV0cyBkbyBub3QgbWF0Y2ggdGhlIHNlbGVjdGVkIHJldmlzaW9uJ3MgZGVjbGFyYXRpb25zLCBzbyBwaW5uZWQgY2FsbGVycyBrZWVwXG4gIC8vIHRoZWlyIHNlY3JldHMgdW50b3VjaGVkLlxuICBjb25zdCBvcmdXb3JrZmxvd0NhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgY29uc3QgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA9IG9yZ1dvcmtmbG93Q2FsbD8ucmVmID09PSAnbWFpbicgPyBvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXF1aXJlZFBlcm1pc3Npb25zID0gY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA/IHJldXNhYmxlV29ya2Zsb3dQZXJtaXNzaW9uc1tjYWxsZWRSZXVzYWJsZVdvcmtmbG93XSA6IHVuZGVmaW5lZDtcbiAgaWYgKHJlcXVpcmVkUGVybWlzc2lvbnMpIGpvYi5wZXJtaXNzaW9ucyA9IHsgLi4ucmVxdWlyZWRQZXJtaXNzaW9ucyB9O1xuICBpZiAoc2VjcmV0cyAmJiBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ICYmIGluc3RhbGxDYXBhYmxlUmV1c2FibGVXb3JrZmxvd3MuaGFzKGNhbGxlZFJldXNhYmxlV29ya2Zsb3cpKSB7XG4gICAgLy8gVGhlIGNhbGxlZSByb3V0ZXMgcHVibGljIChkZWZhdWx0LXJlZ2lzdHJ5KSBpbnN0YWxscyB0aHJvdWdoIHRoZSBUYWt1bWkgR3VhcmRcbiAgICAvLyBtYWxpY2lvdXMtcGFja2FnZS1ibG9ja2luZyBwcm94eSB3aGVuIHRoaXMgdG9rZW4gcmVzb2x2ZXM7IGFuIHVuc2V0IG9yZ2FuaXphdGlvbiBzZWNyZXRcbiAgICAvLyBleHBhbmRzIHRvICcnIGFuZCB0aGUgY2FsbGVlIHRyZWF0cyB0aGF0IGFzIFwiZmVhdHVyZSBvZmZcIiwgc28gcGFzc2luZyBpdCBpcyBhbHdheXMgc2FmZS5cbiAgICBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiA9ICcke3sgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nO1xuICAgIC8vIFRoZSBjYWxsZWUgZ2VuZXJhdGVzIHRoZSB3b3Jrc3BhY2UgLm5wbXJjIGZvciBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIGZyb20gVkVSREFDQ0lPX1RPS0VOXG4gICAgLy8gYmVmb3JlIGluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLiBPbmx5IHJlcG9zaXRvcmllcyB0aGF0IGFjdHVhbGx5IHJlc29sdmUgcHJpdmF0ZSBwYWNrYWdlc1xuICAgIC8vIChvciBwdWJsaXNoIHRvIFZlcmRhY2NpbykgZ2V0IHRoZSBwYXNzLXRocm91Z2g6IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgY3JlZGVudGlhbCB3b3VsZCBmbG93XG4gICAgLy8gaW50byBDSSBydW5zIHRoYXQgbmV2ZXIgdXNlIGl0LCBzbyB0aGUgbGluZSBpcyByZW1vdmVkIGluc3RlYWQuIFRoZSBHaXRIdWIgc2VjcmV0IGl0c2VsZiBpc1xuICAgIC8vIGFsd2F5cyByZWdpc3RlcmVkIG1hbnVhbGx5IGFuZCBzdGF5cyByZWdpc3RlcmVkIGVpdGhlciB3YXkuXG4gICAgaWYgKHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhjb25maWcpKSB7XG4gICAgICBzZWNyZXRzLlZFUkRBQ0NJT19UT0tFTiA9ICcke3sgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gfX0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU47XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgLy8gUHVibGljIHJlcG9zaXRvcmllcyBjb21taXQgd29ybGQtcmVhZGFibGUgY2lwaGVydGV4dHMsIHNvIHRoZXkgZGVjcnlwdCB3aXRoIGEgZGVkaWNhdGVkXG4gICAgICAvLyBDSSBpZGVudGl0eSAodGhlIFBVQkxJQ19GTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uIHNlY3JldCkgaW5zdGVhZCBvZiB0aGUgb3JnLWludGVybmFsXG4gICAgICAvLyBvbmU7IHRoZSBjYWxsZWUgc3RpbGwgcmVjZWl2ZXMgaXQgdW5kZXIgaXRzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSBuYW1lLiBXaGVuIG5vIENJXG4gICAgICAvLyBpZGVudGl0eSByZXNvbHZlcyAoc2VlIGZub3hBZ2VLZXlNYXBwaW5nKSwgbGVhdmUgYW55IGV4aXN0aW5nIG1hcHBpbmcgdW50b3VjaGVkIGFuZCBhZGRcbiAgICAgIC8vIG5vbmU6IGNyZWF0aW5nIG9yIHJld3JpdGluZyBvbmUgb24gaW5jb21wbGV0ZSBpbmZvcm1hdGlvbiB3b3VsZCBtYXAgYSBwb3NzaWJseS1wdWJsaWNcbiAgICAgIC8vIHJlcG9zaXRvcnkgdG8gdGhlIHdyb25nIGlkZW50aXR5LCBhbmQgYSBmbm94IHJlY2lwaWVudCBzeW5jIGZhaWx1cmUgZG9lcyBub3Qgc3RvcCB0aGlzXG4gICAgICAvLyBnZW5lcmF0b3IgZnJvbSB3cml0aW5nIGZpbGVzIOKAlCB0aGUgZmFpbGVkIHJ1bidzIHJlcnVuIGZpbGxzIHRoZSBtYXBwaW5nIGluLlxuICAgICAgY29uc3QgbWFwcGluZyA9IGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZyk7XG4gICAgICBpZiAobWFwcGluZykge1xuICAgICAgICBzZWNyZXRzLkZOT1hfQUdFX0tFWSA9IG1hcHBpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0Jykge1xuICAgIGNvbnN0IFtydXN0RGlyUGF0aF0gPSBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHM7XG4gICAgaWYgKHJ1c3REaXJQYXRoICYmIHJ1c3REaXJQYXRoICE9PSAnLicpIHtcbiAgICAgIGpvYi53aXRoLndvcmtpbmdfZGlyZWN0b3J5ID0gcnVzdERpclBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNvbnN0cnVjdCBmcm9tIHRoZSBwYXJzZWQgY2FsbCBzbyBhIGRpZmZlcmVudGx5IGNhc2VkIG93bmVyIChHaXRIdWIgaXMgY2FzZS1pbnNlbnNpdGl2ZVxuICAvLyB0aGVyZSkgaXMgYWxzbyBub3JtYWxpemVkIHRvIHRoZSByZXBvc2l0b3J5J3Mgb3duIG9yZ2FuaXphdGlvbiAvIG1pcnJvci5cbiAgaWYgKG9yZ1dvcmtmbG93Q2FsbCAmJiBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzLyR7b3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZX0uJHtvcmdXb3JrZmxvd0NhbGwuZXh0ZW5zaW9ufUAke29yZ1dvcmtmbG93Q2FsbC5yZWZ9YDtcbiAgfSBlbHNlIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyTGFiL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQW4gZXhpc3RpbmcgZ2l0aHViX2hvc3RlZF9ydW5uZXIgb24gYSBQUklWQVRFIHJlcG9zaXRvcnkgaXMgcHJlc2VydmVkIG9uIHB1cnBvc2U6IHRoZSBpbnB1dFxuICAgIC8vIGV4aXN0cyBwcmVjaXNlbHkgc28gYSBwcml2YXRlIGNhbGxlciBjYW4gb3B0IGludG8gR2l0SHViLWhvc3RlZCBydW5uZXJzLCBhbmQgd2JmeSBtdXN0IG5vdFxuICAgIC8vIHJldmVydCB0aGF0IG1hbnVhbCBjaG9pY2UgKG9ubHkgdGhlIG90aGVyIGtpbmRzIGJlbG93IG5ldmVyIHRha2UgdGhlIGlucHV0KS5cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChzZWNyZXRzKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhzZWNyZXRzKTtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBzZWNyZXQgZXhwcmVzc2lvbiB0aGUgY2FsbGVyIG1hcHMgaW50byB0aGUgY2FsbGVlJ3MgZGVjbGFyZWQgRk5PWF9BR0VfS0VZLCBvciB1bmRlZmluZWRcbiAqIHdoZW4gdGhlIHJlcG9zaXRvcnkgc3RhdGUgZG9lcyBub3QgaWRlbnRpZnkgYSB1c2FibGUgQ0kgaWRlbnRpdHkg4oCUIGFuIHVua25vd24gdmlzaWJpbGl0eSwgYVxuICogcmVwb3NpdG9yeSBubyBDSSBzY29wZSBjb3ZlcnMgKGRlcml2aW5nIGZyb20gdGhlIHNhbWUgcHJpbmNpcGFsIHJvc3RlciBhcyB0aGUgcmVjaXBpZW50IHN5bmNcbiAqIGtlZXBzIHRoZSB0d28gZnJvbSBldmVyIGRpc2FncmVlaW5nKSwgb3IgYSBmYWlsZWQgZm5veCByZWNpcGllbnQgc3luYywgd2hvc2UgY2lwaGVydGV4dHMgbWF5XG4gKiBzdGlsbCB0YXJnZXQgdGhlIHByZXZpb3VzIGlkZW50aXR5LiBUaGUgY2FsbGVyIG11c3QgdGhlbiBwcmVzZXJ2ZSBhbnkgZXhpc3RpbmcgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gZm5veEFnZUtleU1hcHBpbmcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duIHx8IGhhc0Zub3hTeW5jRmFpbGVkKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNlY3JldE5hbWUgPSByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShjb25maWcpO1xuICByZXR1cm4gc2VjcmV0TmFtZSAmJiBgXFwke3sgc2VjcmV0cy4ke3NlY3JldE5hbWV9IH19YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBBIHBlcm1pc3Npb25zIG9iamVjdCBlbXB0aWVkIGJ5IHRoZSBwZXIta2luZCBkZWxldGlvbnMgKGUuZy4gYW4gZXhpc3RpbmcgdGVzdC1ydXN0IGNhbGxlclxuICAvLyB3aG9zZSBvbmx5IGVudHJ5IHdhcyBgYWN0aW9uc2ApIG11c3QgYmUgZHJvcHBlZCBlbnRpcmVseTogYHBlcm1pc3Npb25zOiB7fWAgc3RyaXBzIEVWRVJZXG4gIC8vIHRva2VuIHBlcm1pc3Npb24gZnJvbSB0aGUgd29ya2Zsb3csIHVubGlrZSB0aGUgYWJzZW50IGtleSB3aGljaCBrZWVwcyB0aGUgZGVmYXVsdHMuXG4gIGlmIChuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyAmJiBPYmplY3Qua2V5cyhuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zO1xuICB9XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMgfSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGZpeFR5cG9zIHJ1bnMgb25jZSBvbiB0aGUgcm9vdCBjb25maWcsIHNvIHRoaXMgZ2xvYiBzZXQgbXVzdCBjb3ZlciBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2VcbiAgICAvLyBsYXlvdXQgKGUuZy4gYXBwcy8qKSwgbm90IGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeSDigJQgd2hpbGUgaG9ub3JpbmdcbiAgICAvLyBkZWNsYXJlZCBuZWdhdGlvbnMgKGUuZy4gYCFhcHBzL2V4Y2x1ZGVkYCksIHdob3NlIHNvdXJjZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtb25vcmVwby5cbiAgICBjb25zdCB3b3Jrc3BhY2VEaXJQYXR0ZXJucyA9IGdldFdvcmtzcGFjZURpclBhdHRlcm5zKHBhY2thZ2VDb25maWcpO1xuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBmZy5nbG9iKFxuICAgICAgW1xuICAgICAgICAne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5pbmNsdWRlcy5tYXAoXG4gICAgICAgICAgKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9YFxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHtcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsIC4uLndvcmtzcGFjZURpclBhdHRlcm5zLmV4Y2x1ZGVzLm1hcCgoZGlyUGF0dGVybikgPT4gYCR7ZGlyUGF0dGVybn0vKipgKV0sXG4gICAgICB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0cycpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50XG4gICAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgICAvLyBUaGUgd29yZCBib3VuZGFyeSBhbmQgdHJhaWxpbmctd2hpdGVzcGFjZSBndWFyZCBrZWVwIHdvcmRzIG1lcmVseSBlbmRpbmcgaW4gdGhlXG4gICAgICAvLyBhYmJyZXZpYXRpb24gbGV0dGVycyAoZS5nLiBcImNvb2tpZS5cIiwgXCJsZWcuXCIpIGludGFjdC5cbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnJDEvLyQyY2YuJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJlZ1xcLig/PVxcc3wkKS9nLCAnJDEvLyQyZS5nLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiaWVcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmkuZS4nKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgLy8gVGhlIGRvdCBtdXN0IGJlIGVzY2FwZWQ6IGFuIHVuZXNjYXBlZCBgLmAgbWF0Y2hlcyBBTlkgY2hhcmFjdGVyLCBzbyBgbGVnaXRgIGxvc3QgaXRzIGBsYCBhbmQgYGVgLlxuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC9cXC5naXQkL3UsICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICByZXR1cm4gc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgc3RhdHVzID09PSA0MDQ7XG59XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICAvLyBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHNvIGNyZWRlbnRpYWwgc2VsZWN0aW9uIChhbmQgdGhlIGNhY2hlIGtleSkgbXVzdFxuICAvLyBub3QgZGVwZW5kIG9uIGhvdyBhIHJlbW90ZSBVUkwgaGFwcGVucyB0byBzcGVsbCB0aGUgb3JnYW5pemF0aW9uLlxuICBjb25zdCBrZXkgPSBvd25lcj8udG9Mb3dlckNhc2UoKSA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG9uIHB1cnBvc2U6IGEgbm9uY2Fub25pY2FsbHkgY2FzZWQgcmVtb3RlIChlLmcuIGdpdGh1Yi5jb20vd2lsbGJvb3N0ZXJsYWIv4oCmKVxuICAvLyBtdXN0IHN0aWxsIHNlbGVjdCB0aGUgb3JnYW5pemF0aW9uJ3Mgb3duIFBBVCDigJQgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIGJyYW5jaCB3b3VsZFxuICAvLyBwcmVmZXIgdGhlIE9USEVSIG9yZ2FuaXphdGlvbidzIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgdGhpcyBvcmdhbml6YXRpb24ncyBwcml2YXRlXG4gIC8vIHJlcG9zaXRvcmllcy5cbiAgY29uc3Qgbm9ybWFsaXplZE93bmVyID0gb3duZXI/LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChub3JtYWxpemVkT3duZXIgPT09ICd3aWxsYm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXJsYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4gfHxcbiAgICBnZXRHaXRIdWJDbGlUb2tlbigpXG4gICk7XG59XG5cbmxldCBnaXRIdWJDbGlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRHaXRIdWJDbGlUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZ2l0SHViQ2xpVG9rZW4gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbWUgbG9jYWwgcnVucyByZWx5IG9uIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBleHBvcnRlZCBlbnYgdG9rZW5zLlxuICAgIGdpdEh1YkNsaVRva2VuID1cbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAuZXhlY0ZpbGVTeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRyaW0oKSB8fCAnJztcbiAgfSBjYXRjaCB7XG4gICAgZ2l0SHViQ2xpVG9rZW4gPSAnJztcbiAgfVxuICByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IGFwcGx5RWRpdHMsIGNyZWF0ZVNjYW5uZXIsIGZpbmROb2RlQXRMb2NhdGlvbiwgbW9kaWZ5LCBwYXJzZSBhcyBwYXJzZUpzb25jLCBwYXJzZVRyZWUgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuXG4vLyBqc29uYy1wYXJzZXIgZGVjbGFyZXMgU3ludGF4S2luZC9TY2FuRXJyb3IgYXMgYW1iaWVudCBjb25zdCBlbnVtcywgd2hpY2ggY2Fubm90IGJlIGltcG9ydGVkXG4vLyB1bmRlciB2ZXJiYXRpbU1vZHVsZVN5bnRheDsgbWlycm9yIHRoZSBuZWVkZWQgbWVtYmVyIHZhbHVlcyBsb2NhbGx5LlxuY29uc3Qgc3ludGF4S2luZCA9IHsgbGluZUNvbW1lbnRUcml2aWE6IDEyLCBibG9ja0NvbW1lbnRUcml2aWE6IDEzLCBsaW5lQnJlYWtUcml2aWE6IDE0LCB0cml2aWE6IDE1LCBlb2Y6IDE3IH07XG5jb25zdCBzY2FuRXJyb3JOb25lID0gMDtcblxuZXhwb3J0IGNvbnN0IGpzb25jVXRpbCA9IHtcbiAgLyoqXG4gICAqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaG9sZHMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwg4oCUIG9ubHkgd2hpdGVzcGFjZSwgY29tcGxldGUgY29tbWVudHMsXG4gICAqIGFuZC9vciBhIEJPTS4gdHNjIHRyZWF0cyBzdWNoIGEgdHNjb25maWcuanNvbiBhcyBhbiBlbXB0eSBjb25maWcsIHNvIGdlbmVyYXRvcnMgc2hvdWxkIHRyZWF0XG4gICAqIGl0IGxpa2UgYSBtaXNzaW5nIGZpbGUgKGFuZCBnZW5lcmF0ZSBkZWZhdWx0cykgaW5zdGVhZCBvZiByZWZ1c2luZyB0byBtYW5hZ2UgaXQuIExleGljYWxseVxuICAgKiBicm9rZW4gdHJpdmlhIChlLmcuIGFuIHVudGVybWluYXRlZCBibG9jayBjb21tZW50KSBpcyBOT1QgdHJpdmlhLW9ubHk6IHRoZSBmaWxlIG11c3QgYmUgbGVmdFxuICAgKiB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gb3ZlcndyaXR0ZW4gd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGlzVHJpdmlhT25seShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgaWYgKFxuICAgICAgICAoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSB8fFxuICAgICAgICAoa2luZCAhPT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC50cml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmxpbmVCcmVha1RyaXZpYSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUGFyc2VzIGEgSlNPTkMgKEpTT04gd2l0aCBjb21tZW50cykgb2JqZWN0IGZyb20gY29uZmlnIGZpbGVzIHN1Y2ggYXMgdHNjb25maWcuanNvbixcbiAgICogcHlyaWdodGNvbmZpZy5qc29uLCByZW5vdmF0ZS5qc29uLCAudnNjb2RlL3NldHRpbmdzLmpzb24sIGFuZCB3cmFuZ2xlci5qc29uYy5cbiAgICpcbiAgICoganNvbmMtcGFyc2VyIGlzIGZhdWx0IHRvbGVyYW50IGFuZCByZXR1cm5zIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCwgd2hpY2ggbXVzdFxuICAgKiBub3QgYmUgdHJlYXRlZCBhcyB0aGUgZmlsZSdzIGNvbmZpZ3VyYXRpb247IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IgaW5zdGVhZC4gQSBsZWFkaW5nIEJPTSBpc1xuICAgKiBzdHJpcHBlZCBiZWNhdXNlIFR5cGVTY3JpcHQgYWNjZXB0cyBCT00nZCBjb25maWcgZmlsZXMgd2hpbGUganNvbmMtcGFyc2VyIHJlcG9ydHMgdGhlIEJPTSBhc1xuICAgKiBhIHBhcnNlIGVycm9yLlxuICAgKi9cbiAgcGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFQgZXh0ZW5kcyBvYmplY3Q+KGNvbnRlbnQ6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSnNvbmMoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSwgcGFyc2VFcnJvcnMsIHsgYWxsb3dUcmFpbGluZ0NvbW1hOiB0cnVlIH0pIGFzXG4gICAgICB8IFRcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBwYXJzZUVycm9ycy5sZW5ndGggPT09IDAgJiYgISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgPyB2YWx1ZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIC8qKiBUZWxscyB3aGV0aGVyIHRoZSBjb250ZW50IGNhcnJpZXMgYXQgbGVhc3Qgb25lIGNvbW1lbnQsIGkuZS4gY29udGVudCBKU09OLnN0cmluZ2lmeSB3b3VsZCBkcm9wLiAqL1xuICBjb250YWluc0NvbW1lbnQoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXIoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSk7XG4gICAgZm9yIChsZXQga2luZDogbnVtYmVyID0gc2Nhbm5lci5zY2FuKCk7IGtpbmQgIT09IHN5bnRheEtpbmQuZW9mOyBraW5kID0gc2Nhbm5lci5zY2FuKCkpIHtcbiAgICAgIC8vIEEgbGV4aWNhbCBlcnJvciBtZWFucyB0aGUgcmVtYWluaW5nIHRva2VucyBhcmUgdW5yZWxpYWJsZTsgcmVwb3J0IG5vIGNvbW1lbnQgcmF0aGVyIHRoYW5cbiAgICAgIC8vIGd1ZXNzaW5nLCBzaW5jZSBjYWxsZXJzIG9ubHkgdXNlIHRoaXMgdG8gZGVjaWRlIHdoZXRoZXIgdG8gd2FybiBhYm91dCBkcm9wcGVkIGNvbW1lbnRzLlxuICAgICAgaWYgKChzY2FubmVyLmdldFRva2VuRXJyb3IoKSBhcyBudW1iZXIpICE9PSBzY2FuRXJyb3JOb25lKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoa2luZCA9PT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSB8fCBraW5kID09PSBzeW50YXhLaW5kLmJsb2NrQ29tbWVudFRyaXZpYSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYHNldHRpbmdzYCBpbnRvIGBvbGRDb250ZW50YCwgZWRpdGluZyBvbmx5IHRoZSB0b3AtbGV2ZWwgcHJvcGVydGllcyB3aG9zZSB2YWx1ZXNcbiAgICogY2hhbmdlZCBzbyB0aGUgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgb2YgYW4gZXhpc3RpbmcgZmlsZSBzdXJ2aXZlLiBDYWxsZXJzIG5ldmVyIGRyb3BcbiAgICogcHJvcGVydGllcyAoZ2VuZXJhdGVkIHNldHRpbmdzIGFyZSBtZXJnZWQgT04gVE9QIG9mIHRoZSBleGlzdGluZyBvbmVzKSwgc28gcmVtb3ZhbHMgYXJlIG5vdFxuICAgKiBoYW5kbGVkOiBhIHByb3BlcnR5IG1pc3NpbmcgZnJvbSBgc2V0dGluZ3NgIGlzIGxlZnQgdW50b3VjaGVkIHJhdGhlciB0aGFuIGRlbGV0ZWQuXG4gICAqXG4gICAqIFRyaXZpYS1vbmx5IGNvbnRlbnQga2VlcHMgaXRzIGNvbW1lbnRzIGFzIGEgaGVhZGVyIGFib3ZlIHRoZSBnZW5lcmF0ZWQgb2JqZWN0LCByYXRoZXIgdGhhblxuICAgKiBiZWluZyByZXBsYWNlZCBvdXRyaWdodCBvciBydW4gdGhyb3VnaCBtb2RpZnkoKSAod2hpY2ggd291bGQgbW92ZSB0aGUgb2JqZWN0IGluIGZyb250IG9mIHRoZW0pLlxuICAgKi9cbiAgc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShcbiAgICBvbGRDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHsgY29udGVudDogc3RyaW5nOyBrZXlzTG9zaW5nQ29tbWVudHM6IHN0cmluZ1tdIH0ge1xuICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpLCBrZXlzTG9zaW5nQ29tbWVudHM6IFtdIH07XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvbGRDb250ZW50KTtcbiAgICAvLyBEcm9wIGEgbGVhZGluZyBCT006IG1vZGlmeSgpIGluc2VydHMgdGhlIGdlbmVyYXRlZCBvYmplY3QgQkVGT1JFIGFueSBsZWFkaW5nIHRyaXZpYSwgd2hpY2hcbiAgICAvLyB3b3VsZCBsZWF2ZSB0aGUgQk9NIHN0cmFuZGVkIG1pZC1maWxlIHdoZXJlIGl0IGlzIGEgc3ludGF4IGVycm9yIHJhdGhlciB0aGFuIGFuIGlnbm9yZWQgbWFyay5cbiAgICBsZXQgY29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJyk7XG4gICAgaWYgKGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoY29udGVudCkpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IGNvbnRlbnQudHJpbSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogYCR7aGVhZGVyID8gaGVhZGVyICsgJ1xcbicgOiAnJ30ke0pTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpfWAsXG4gICAgICAgIGtleXNMb3NpbmdDb21tZW50czogW10sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBtb2RpZnlPcHRpb25zID0geyBmb3JtYXR0aW5nT3B0aW9uczogZGV0ZWN0Rm9ybWF0dGluZ09wdGlvbnMoY29udGVudCkgfTtcbiAgICBjb25zdCBrZXlzTG9zaW5nQ29tbWVudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmV3RW50cmllczogW3N0cmluZywgdW5rbm93bl1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNldHRpbmdzKSkge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSBvbGRTZXR0aW5ncz8uW2tleV07XG4gICAgICAvLyBDb21wYXJlIHNlcmlhbGl6ZWQgZm9ybXMgc28gZGVlcC1lcXVhbCB2YWx1ZXMgKGUuZy4gYSByZS1tZXJnZWQgYGV4dGVuZHNgIGFycmF5KSBkbyBub3RcbiAgICAgIC8vIHJld3JpdGUgdGhlIHByb3BlcnR5IGFuZCByZWZsb3cgaXRzIGZvcm1hdHRpbmcuXG4gICAgICBpZiAoSlNPTi5zdHJpbmdpZnkob2xkVmFsdWUpID09PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3RW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gUmVwbGFjaW5nIGEgd2hvbGUgYXJyYXkgd291bGQgZGlzY2FyZCB0aGUgY29tbWVudHMgYmV0d2VlbiBpdHMgZWxlbWVudHMsIHNvIGdyb3cgaXQgd2l0aFxuICAgICAgLy8gcGVyLWVsZW1lbnQgaW5zZXJ0aW9ucyB3aGVuZXZlciB0aGUgbmV3IHZhbHVlIG9ubHkgYWRkcyB0byBpdC5cbiAgICAgIGNvbnN0IGluc2VydGlvbnMgPSBBcnJheS5pc0FycmF5KG9sZFZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlLCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IGluc2VydGlvbiBvZiBpbnNlcnRpb25zID8/IFtdKSB7XG4gICAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgbW9kaWZ5KGNvbnRlbnQsIFtrZXksIGluc2VydGlvbi5pbmRleF0sIGluc2VydGlvbi52YWx1ZSwgeyAuLi5tb2RpZnlPcHRpb25zLCBpc0FycmF5SW5zZXJ0aW9uOiB0cnVlIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRlbnQgPSByZXN0b3JlVHJhaWxpbmdDb21tZW50KGNvbnRlbnQsIGtleSwgaW5zZXJ0aW9uLmluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnNlcnRpb25zKSBjb250aW51ZTtcbiAgICAgIC8vIFJld3JpdGluZyB0aGUgd2hvbGUgdmFsdWUgaXMgdGhlIG9ubHkgb3B0aW9uIGxlZnQgKHRoZSBuZXcgb25lIGRyb3BzIG9yIHJlb3JkZXJzIGVsZW1lbnRzKSxcbiAgICAgIC8vIGFuZCBpdCB0YWtlcyBhbnkgY29tbWVudCBuZXN0ZWQgaW5zaWRlIGl0IGFsb25nLiBSZXBvcnQgdGhhdCByYXRoZXIgdGhhbiBsb3NpbmcgaXQgcXVpZXRseS5cbiAgICAgIGNvbnN0IHJlcGxhY2VkVGV4dCA9IHZhbHVlVGV4dE9mKGNvbnRlbnQsIGtleSk7XG4gICAgICBpZiAocmVwbGFjZWRUZXh0ICE9PSB1bmRlZmluZWQgJiYganNvbmNVdGlsLmNvbnRhaW5zQ29tbWVudChyZXBsYWNlZFRleHQpKSBrZXlzTG9zaW5nQ29tbWVudHMucHVzaChrZXkpO1xuICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoY29udGVudCwgbW9kaWZ5KGNvbnRlbnQsIFtrZXldLCB2YWx1ZSwgbW9kaWZ5T3B0aW9ucykpO1xuICAgIH1cbiAgICAvLyBQcmVwZW5kIHJhdGhlciB0aGFuIGFwcGVuZCB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSBuZXc6IGFwcGVuZGluZyBkZXRhY2hlcyBhIHRyYWlsaW5nXG4gICAgLy8gc2FtZS1saW5lIGNvbW1lbnQgZnJvbSB0aGUgbGFzdCBwcm9wZXJ0eSwgbGVhdmluZyBpdCB0byBkZXNjcmliZSB0aGUgZ2VuZXJhdGVkIHZhbHVlXG4gICAgLy8gaW5zdGVhZC4gSW5zZXJ0aW5nIGluIHJldmVyc2Uga2VlcHMgdGhlIG9yZGVyIHRoZSBzZXR0aW5ncyBkZWNsYXJlIHRoZW0gaW4uXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbmV3RW50cmllcy50b1JldmVyc2VkKCkpIHtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgZ2V0SW5zZXJ0aW9uSW5kZXg6ICgpID0+IDAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfTtcbiAgfSxcbn07XG5cbi8qKiBSZXR1cm5zIHRoZSBzb3VyY2UgdGV4dCBvZiBhIHRvcC1sZXZlbCBwcm9wZXJ0eSdzIHZhbHVlLCBjb21tZW50cyBhbmQgYWxsLiAqL1xuZnVuY3Rpb24gdmFsdWVUZXh0T2YoY29udGVudDogc3RyaW5nLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IG5vZGUgPSByb290ICYmIGZpbmROb2RlQXRMb2NhdGlvbihyb290LCBba2V5XSk7XG4gIHJldHVybiBub2RlICYmIGNvbnRlbnQuc2xpY2Uobm9kZS5vZmZzZXQsIG5vZGUub2Zmc2V0ICsgbm9kZS5sZW5ndGgpO1xufVxuXG4vLyBUaGUgd2hvbGUgc2FtZS1saW5lIGNvbW1lbnQgc2VxdWVuY2UsIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmU6IGEgbGluZSBjb21tZW50IGVuZHMgaXQgKGl0IHJ1bnMgdG9cbi8vIHRoZSBuZXdsaW5lKSwgYnV0IGFueSBudW1iZXIgb2YgYmxvY2sgY29tbWVudHMgY2FuIHByZWNlZGUgaXQsIGFuZCBtb3Zpbmcgb25seSB0aGUgZmlyc3Qgd291bGRcbi8vIGxlYXZlIHRoZSByZXN0IGRlc2NyaWJpbmcgdGhlIHdyb25nIGVsZW1lbnQuXG5jb25zdCB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuID0gL14oPzpbXlxcU1xcbl0qXFwvXFwqW1xcU1xcc10qP1xcKlxcLykqKD86W15cXFNcXG5dKlxcL1xcL1teXFxuXSopPy91O1xuXG4vKipcbiAqIFJlYXR0YWNoZXMgYSBzYW1lLWxpbmUgY29tbWVudCB0byB0aGUgZWxlbWVudCBpdCBkZXNjcmliZXMuIEluc2VydGluZyBpbnRvIGFuIGFycmF5IHBsYWNlcyB0aGVcbiAqIG5ldyBlbGVtZW50IEJFRk9SRSB0aGUgdHJpdmlhIHRoYXQgZm9sbG93cyBpdHMgcHJlZGVjZXNzb3IsIHNvIGFwcGVuZGluZyBhZnRlclxuICogYHsgLi4uIH0gLy8gd2h5IHRoaXMgcnVsZSBleGlzdHNgIGxlYXZlcyB0aGF0IGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgZ2VuZXJhdGVkIGVsZW1lbnQgaW5zdGVhZC5cbiAqIEEgZnJlc2hseSBzZXJpYWxpemVkIGVsZW1lbnQgbmV2ZXIgY2FycmllcyBhIGNvbW1lbnQgb2YgaXRzIG93biwgc28gYW55dGhpbmcgdHJhaWxpbmcgdGhlXG4gKiBpbnNlcnRpb24gYmVsb25nZWQgdG8gdGhlIGVsZW1lbnQgYmVmb3JlIGl0LlxuICovXG5mdW5jdGlvbiByZXN0b3JlVHJhaWxpbmdDb21tZW50KGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGluc2VydGVkSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpbnNlcnRlZEluZGV4ID09PSAwKSByZXR1cm4gY29udGVudDtcbiAgY29uc3Qgcm9vdCA9IHBhcnNlVHJlZShjb250ZW50KTtcbiAgY29uc3QgZWxlbWVudHMgPSAocm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pKT8uY2hpbGRyZW47XG4gIGNvbnN0IGluc2VydGVkID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4XTtcbiAgY29uc3QgcHJldmlvdXMgPSBlbGVtZW50cz8uW2luc2VydGVkSW5kZXggLSAxXTtcbiAgaWYgKCFpbnNlcnRlZCB8fCAhcHJldmlvdXMpIHJldHVybiBjb250ZW50O1xuICBjb25zdCBpbnNlcnRlZEVuZCA9IGluc2VydGVkLm9mZnNldCArIGluc2VydGVkLmxlbmd0aDtcbiAgY29uc3QgY29tbWVudCA9IHRyYWlsaW5nQ29tbWVudFBhdHRlcm4uZXhlYyhjb250ZW50LnNsaWNlKGluc2VydGVkRW5kKSk/LlswXTtcbiAgaWYgKCFjb21tZW50KSByZXR1cm4gY29udGVudDtcbiAgLy8gTGFuZCB0aGUgY29tbWVudCBhZnRlciB0aGUgc2VwYXJhdGluZyBjb21tYSBzbyB0aGUgZWxlbWVudCBrZWVwcyBpdHMgb3duIGxpbmUgaW50YWN0LlxuICBjb25zdCBwcmV2aW91c0VuZCA9IHByZXZpb3VzLm9mZnNldCArIHByZXZpb3VzLmxlbmd0aDtcbiAgY29uc3QgcmVzdG9yZU9mZnNldCA9IHByZXZpb3VzRW5kICsgKC9eXFxzKiwvdS5leGVjKGNvbnRlbnQuc2xpY2UocHJldmlvdXNFbmQpKT8uWzBdLmxlbmd0aCA/PyAwKTtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50LnNsaWNlKDAsIHJlc3RvcmVPZmZzZXQpICtcbiAgICBjb21tZW50ICtcbiAgICBjb250ZW50LnNsaWNlKHJlc3RvcmVPZmZzZXQsIGluc2VydGVkRW5kKSArXG4gICAgY29udGVudC5zbGljZShpbnNlcnRlZEVuZCArIGNvbW1lbnQubGVuZ3RoKVxuICApO1xufVxuXG4vKipcbiAqIE1pcnJvcnMgdGhlIGluZGVudGF0aW9uIHRoZSBmaWxlIGFscmVhZHkgdXNlcywgc28gYSBzZW1hbnRpYyBjaGFuZ2UgZG9lcyBub3QgcmVpbmRlbnQgdW5yZWxhdGVkXG4gKiBsaW5lcy4gVGhlIGZpcnN0IHByb3BlcnR5IGlzIG1lYXN1cmVkIHJhdGhlciB0aGFuIHRoZSBmaXJzdCBpbmRlbnRlZCBsaW5lLCBiZWNhdXNlIGEgZGVjb3JhdGVkXG4gKiBibG9jayBjb21tZW50IChgICogLi4uYCkgd291bGQgb3RoZXJ3aXNlIHBhc3MgZm9yIHRoZSBmaWxlJ3MgaW5kZW50YXRpb24uIEZhbGxzIGJhY2sgdG8gdGhlIHR3b1xuICogc3BhY2VzIGV2ZXJ5IGdlbmVyYXRlZCBjb25maWcgdXNlcy5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0Rm9ybWF0dGluZ09wdGlvbnMoY29udGVudDogc3RyaW5nKTogeyBpbnNlcnRTcGFjZXM6IGJvb2xlYW47IHRhYlNpemU6IG51bWJlciB9IHtcbiAgY29uc3QgZmlyc3RQcm9wZXJ0eSA9IHBhcnNlVHJlZShjb250ZW50KT8uY2hpbGRyZW4/LlswXTtcbiAgY29uc3QgaW5kZW50YXRpb24gPVxuICAgIGZpcnN0UHJvcGVydHkgJiYgY29udGVudC5zbGljZShjb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nLCBmaXJzdFByb3BlcnR5Lm9mZnNldCkgKyAxLCBmaXJzdFByb3BlcnR5Lm9mZnNldCk7XG4gIGlmICghaW5kZW50YXRpb24gfHwgIS9eW1xcdCBdKyQvdS50ZXN0KGluZGVudGF0aW9uKSkgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiAyIH07XG4gIGlmIChpbmRlbnRhdGlvbi5zdGFydHNXaXRoKCdcXHQnKSkgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiBmYWxzZSwgdGFiU2l6ZTogMSB9O1xuICByZXR1cm4geyBpbnNlcnRTcGFjZXM6IHRydWUsIHRhYlNpemU6IGluZGVudGF0aW9uLmxlbmd0aCB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGluc2VydCBpbnRvIGBvbGRWYWx1ZWAgdG8gdHVybiBpdCBpbnRvIGBuZXdWYWx1ZWAsIG9yIHVuZGVmaW5lZCB3aGVuXG4gKiB0aGF0IGlzIGltcG9zc2libGUgYmVjYXVzZSBgbmV3VmFsdWVgIGRyb3BzIG9yIHJlb3JkZXJzIGFuIGV4aXN0aW5nIGVsZW1lbnQgKHRoZSBjYWxsZXIgbXVzdFxuICogdGhlbiByZXBsYWNlIHRoZSBhcnJheSB3aG9sZXNhbGUpLiBJbmRpY2VzIGFkZHJlc3MgdGhlIGFycmF5IGFzIGl0IGdyb3dzLCBzbyBhcHBseWluZyB0aGVcbiAqIGluc2VydGlvbnMgbGVmdCB0byByaWdodCB5aWVsZHMgYG5ld1ZhbHVlYC5cbiAqL1xuZnVuY3Rpb24gZmluZEluc2VydGlvbnMob2xkVmFsdWU6IHVua25vd25bXSwgbmV3VmFsdWU6IHVua25vd25bXSk6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5zZXJ0aW9uczogeyBpbmRleDogbnVtYmVyOyB2YWx1ZTogdW5rbm93biB9W10gPSBbXTtcbiAgbGV0IG9sZEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBbbmV3SW5kZXgsIGVsZW1lbnRdIG9mIG5ld1ZhbHVlLmVudHJpZXMoKSkge1xuICAgIGlmIChvbGRJbmRleCA8IG9sZFZhbHVlLmxlbmd0aCAmJiBKU09OLnN0cmluZ2lmeShvbGRWYWx1ZVtvbGRJbmRleF0pID09PSBKU09OLnN0cmluZ2lmeShlbGVtZW50KSkge1xuICAgICAgb2xkSW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpbnNlcnRpb25zLnB1c2goeyBpbmRleDogbmV3SW5kZXgsIHZhbHVlOiBlbGVtZW50IH0pO1xuICB9XG4gIHJldHVybiBvbGRJbmRleCA9PT0gb2xkVmFsdWUubGVuZ3RoID8gaW5zZXJ0aW9ucyA6IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG4vKipcbiAqIFJlY29nbml6ZXMgdGhlIG1hbmFnZWQgYHdiIGdlbi1jb2RlYCBzZWdtZW50LCBhIG9uZS1sZXZlbCBwYWNrYWdlLXNjcmlwdCB3cmFwcGVyIGFyb3VuZCBpdCwgYW5kXG4gKiBjdXN0b20gc2VnbWVudHMgdGhhdCB3YmZ5IGxlYXZlcyBhbG9uZS5cbiAqL1xudHlwZSBTY3JpcHRTZWdtZW50S2luZCA9ICdjdXN0b20nIHwgJ2dlbkNvZGUnIHwgJ2dlbkNvZGVXcmFwcGVyJztcblxuY29uc3QgZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuID0gL15idW5cXHMrd2JcXHMrZ2VuLWNvZGUkL3U7XG5cbi8vIEEgcnVubmVyIGRlbGVnYXRpbmcgdG8gb25lIG9mIHRoaXMgcGFja2FnZSdzIG93biBzY3JpcHRzLCBlLmcuIGBidW4gcnVuIGdlbi10eXBlc2AuXG5jb25zdCBzY3JpcHRSdW5uZXJQYXR0ZXJuID0gL15idW5cXHMrcnVuXFxzKyhcXFMrKSQvdTtcblxuLy8gQW55dGhpbmcgd2JmeSdzIGAmJmAgc3BsaXQgY2Fubm90IG1vZGVsIChwaXBlcywgc2VxdWVuY2luZywgcmVkaXJlY3Rpb25zLCBxdW90aW5nLCBzdWJzdGl0dXRpb25zLCBkaXJlY3Rvcnlcbi8vIGNoYW5nZXMpLiBTY3JpcHRzIGNvbnRhaW5pbmcgaXQgYXJlIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgYmVpbmcgcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbmNvbnN0IHVuc3VwcG9ydGVkU2hlbGxTeW50YXhQYXR0ZXJuID0gL1tcXG47fDw+YCQnXCIoKV18XFxiY2RcXHMvdTtcblxuLyoqXG4gKiBTcGxpdHMgYSBzY3JpcHQgaW50byBgJiZgLXNlcGFyYXRlZCBzZWdtZW50cywgb3IgcmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgc2NyaXB0IHVzZXMgc2hlbGwgc3ludGF4IHdiZnlcbiAqIGRlbGliZXJhdGVseSBkb2VzIG5vdCBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICh1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybjtcbiAgcmV0dXJuIHNjcmlwdFxuICAgIC5zcGxpdCgnJiYnKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoXG4gIHNlZ21lbnQ6IHN0cmluZyxcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgZm9sbG93c1dyYXBwZXIgPSB0cnVlXG4pOiBTY3JpcHRTZWdtZW50S2luZCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBzZWdtZW50LnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpO1xuICBpZiAoZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuLnRlc3Qobm9ybWFsaXplZCkpIHJldHVybiAnZ2VuQ29kZSc7XG4gIC8vIEEgb25lLWxldmVsIHdyYXBwZXIgbG9va3VwIGNvdmVycyBgXCJwb3N0aW5zdGFsbFwiOiBcImJ1biBydW4gZ2VuLXR5cGVzXCJgLCB0aGUgc2hhcGUgdGhlc2UgcmVwb3NpdG9yaWVzIHVzZTtcbiAgLy8gZGVlcGVyIGNoYWlucyBzdGF5IGN1c3RvbSBzbyB3YmZ5IGNhbm5vdCBsb29wIG9uIGEgc2VsZi1yZWZlcmVudGlhbCBzY3JpcHQuXG4gIGNvbnN0IHNjcmlwdE5hbWUgPSBmb2xsb3dzV3JhcHBlciA/IHNjcmlwdFJ1bm5lclBhdHRlcm4uZXhlYyhub3JtYWxpemVkKT8uWzFdIDogdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXQgPSBzY3JpcHROYW1lID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICBpZiAoIXRhcmdldCkgcmV0dXJuICdjdXN0b20nO1xuICBjb25zdCBzZWdtZW50cyA9IHNwbGl0U2NyaXB0U2VnbWVudHModGFyZ2V0KTtcbiAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBzdGlsbCBwZXJmb3JtcyB0aGUgbWFuYWdlZFxuICAvLyBnZW5lcmF0aW9uLCBzbyBpdCBjb3VudHMgYXMgZ2VuLWNvZGU7IHRyZWF0aW5nIGl0IGFzIGN1c3RvbSB3b3VsZCBhcHBlbmQgYSBzZWNvbmQgYHdiIGdlbi1jb2RlYCBhbmQgcnVuIGV2ZXJ5XG4gIC8vIGdlbmVyYXRvciB0d2ljZSBwZXIgaW5zdGFsbC5cbiAgaWYgKHNlZ21lbnRzPy5sZW5ndGggIT09IDEpIHtcbiAgICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgQ1VTVE9NSVpFRCBnZW4tY29kZSAoYGJ1biB3YiBnZW4tY29kZSAmJiBidW4gcnVuIGJ1aWxkLWFzc2V0c2ApIGFscmVhZHkgcGVyZm9ybXMgdGhlXG4gICAgLy8gbWFuYWdlZCBnZW5lcmF0aW9uIEFORCB0aGUgcHJvamVjdCdzIG93biBzdGVwcywgc28gaXQgaXMgdGhlIGluc3RhbGwtdGltZSBlbnRyeSBwb2ludDogaXQgbXVzdCBiZSBrZXB0IGFzXG4gICAgLy8gd3JpdHRlbi4gUmVwbGFjaW5nIGl0IHdpdGggYSBiYXJlIGB3YiBnZW4tY29kZWAgd291bGQgZHJvcCB0aG9zZSBzdGVwczsgYXBwZW5kaW5nIG9uZSB3b3VsZCBydW4gZXZlcnlcbiAgICAvLyBnZW5lcmF0b3IgdHdpY2UuXG4gICAgcmV0dXJuIHNlZ21lbnRzPy5zb21lKChpbm5lcikgPT4gZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuLnRlc3QoaW5uZXIudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJykpKVxuICAgICAgPyAnZ2VuQ29kZVdyYXBwZXInXG4gICAgICA6ICdjdXN0b20nO1xuICB9XG4gIHJldHVybiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudHNbMF0gPz8gJycsIHNjcmlwdHMsIGZhbHNlKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgcmV0cnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiBudW1iZXIge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICAgIGlmIChyZXRyeSA8PSAwKSByZXR1cm4gc3RhdHVzO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXRJbnRlcm5hbChjb21tYW5kLCBhcmdzLCBjd2QpWzFdO1xufVxuXG5mdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXRJbnRlcm5hbChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtudW1iZXIsIHN0cmluZ10ge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgY29uc3Qgc3Rkb3V0VGV4dCA9IHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0IDogc3Rkb3V0LnRvU3RyaW5nKCk7XG4gIHJldHVybiBbcHJvYy5zdGF0dXMgPz8gMSwgc3Rkb3V0VGV4dC50cmltKCldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5zcGxpdCgnOicpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBlbnYuQkVSUllfQklOX0ZPTERFUilcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJy4vdXRpbHMvc3RyaW5nVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLCBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyB9IGZyb20gJy4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgLy8gV2hldGhlciBpc1B1YmxpY1JlcG8gY29tZXMgZnJvbSBhbiBhY3R1YWwgR2l0SHViIEFQSSByZXNwb25zZTogYSBmYWlsZWQgbG9va3VwIChvZmZsaW5lLFxuICAvLyByYXRlLWxpbWl0ZWQsIGJhZCBjcmVkZW50aWFsKSBjb2xsYXBzZXMgdG8gaXNQdWJsaWNSZXBvPWZhbHNlLCB3aGljaCB2aXNpYmlsaXR5LXNlbnNpdGl2ZVxuICAvLyBnZW5lcmF0b3JzIG11c3Qgbm90IG1pc3Rha2UgZm9yIGEgY29uZmlybWVkIHByaXZhdGUgcmVwb3NpdG9yeS5cbiAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNDbG91ZGZsYXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuO1xuICBpc1JhaWx3YXk6IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8qKiBEaXJlY3RvcmllcyBjb250YWluaW5nIENhcmdvLnRvbWwgKHJlbGF0aXZlIHRvIGRpclBhdGgsIHJvb3QtbW9zdCBmaXJzdCkuIEVtcHR5IGlmIHRoZSByZXBvIGhhcyBubyBSdXN0IGNvZGUuICovXG4gIGNhcmdvVG9tbERpclBhdGhzOiBzdHJpbmdbXTtcbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFB5dGhvbiBsb2NrZmlsZSAocG9ldHJ5LmxvY2sgLyB1di5sb2NrKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgTWF2ZW4gcG9tLnhtbCBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFNsaWRldiBkZWNrIChgKi5zbGlkZXYubWRgKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblNsaWRldk1kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRSdW50aW1lOiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzbGlkZXY6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHRhdXJpOiBib29sZWFuO1xuICAgIHZpbmV4dDogYm9vbGVhbjtcbiAgICB2aXRlOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICAgIGNoYWtyYTogYm9vbGVhbjtcbiAgICBkcml6emxlOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQW4gZXhwbGljaXQgYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgcGx1Z2luIGVudHJ5IHB1Ymxpc2hlcyB0aGUgcm9vdCBtYW5pZmVzdCBpdHNlbGZcbiAgICAgKiAobm8gcGtnUm9vdCByZWRpcmVjdGlvbiBhbmQgbnBtUHVibGlzaCBub3QgZGlzYWJsZWQpLlxuICAgICAqL1xuICAgIG5wbVB1Ymxpc2hlc1Jvb3Q6IGJvb2xlYW47XG4gIH07XG4gIG1pc2VUYXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBzZW1hbnRpYy1yZWxlYXNlIGNvbmZpZyBmaWxlcyB3YmZ5IGV4cGVjdHMsIGluIGNvc21pY29uZmlnJ3MgcmVzb2x1dGlvbiBvcmRlciAodGhlIGxlYWRpbmdcbiAqIHBhY2thZ2UuanNvbiBlbnRyeSBpcyBjaGVja2VkIGJ5IHRoZSBjYWxsZXIpLiB3YmZ5IGdlbmVyYXRlcyAucmVsZWFzZXJjLmpzb247IHRoZSBvdGhlciBzcGVsbGluZ3NcbiAqIGFyZSBsaXN0ZWQgb25seSB0byBkZXRlY3QgYSBoYW5kLXdyaXR0ZW4gY29uZmlnLCB3aG9zZSBmb3JtYXQgSlNPTi5wYXJzZSBjYW5ub3QgcmVhZCBhbmQgd2hvc2VcbiAqIHBsdWdpbiBsaXN0IGlzIHRoZXJlZm9yZSBzdGF0aWNhbGx5IHVuaW5zcGVjdGFibGUuXG4gKi9cbmNvbnN0IHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlczogeyBmaWxlTmFtZTogc3RyaW5nOyBqc29uUGFyc2VhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBpc1Jvb3Q/OiBib29sZWFuIH1cbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IGZhbHNlO1xuICAgIGxldCByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCA9IGZhbHNlO1xuICAgIC8vIFRoZSBGSVJTVCBleGlzdGluZyBzZWFyY2ggcGxhY2Ugd2lucyAoY29zbWljb25maWcgc2hvcnQtY2lyY3VpdHMpLCBzbyBhIEpTL1lBTUwvVFMgY29uZmlnXG4gICAgLy8gb3IgYW4gYGV4dGVuZHNgIHByZXNldCBtYWtlcyB0aGUgZWZmZWN0aXZlIHBsdWdpbiBsaXN0IHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZSAobWlycm9yc1xuICAgIC8vIHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMgaW4gd2IncyByZWxlYXNlLnRzKS4gVHJlYXRpbmcgaXQgYXMgdW5rbm93biBrZWVwc1xuICAgIC8vIGByZWxlYXNlLm5wbWAgY29uc2VydmF0aXZlbHkgdHJ1ZSwgc28gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIG5ldmVyIGZvcmNlc1xuICAgIC8vIGBwcml2YXRlOiB0cnVlYCBvbiBhIG1vbm9yZXBvIHRoYXQgYWN0dWFsbHkgcHVibGlzaGVzIHRvIG5wbS5cbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHR5cGUgUmVsZWFzZUNvbmZpZyA9XG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM/OiB1bmtub3duO1xuICAgICAgICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPl0pW107XG4gICAgICAgICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gY29zbWljb25maWcgc2VhcmNoZXMgcGFja2FnZS5qc29uJ3MgYHJlbGVhc2VgIGtleSBCRUZPUkUgYW55IHJjL2NvbmZpZyBmaWxlXG4gICAgICAvLyAoc2VtYW50aWMtcmVsZWFzZSAyNSBkZWxlZ2F0ZXMgdG8gY29zbWljb25maWcgOSdzIGRlZmF1bHQgc2VhcmNoUGxhY2VzKS5cbiAgICAgIGxldCByZWxlYXNlQ29uZmlnID0gKHBhY2thZ2VKc29uIGFzIHsgcmVsZWFzZT86IFJlbGVhc2VDb25maWcgfSkucmVsZWFzZTtcbiAgICAgIGlmIChyZWxlYXNlQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCB7IGZpbGVOYW1lLCBqc29uUGFyc2VhYmxlIH0gb2Ygc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzKSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZXJjUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlbGVhc2VyY1BhdGgpKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWpzb25QYXJzZWFibGUpIHtcbiAgICAgICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gYC5yZWxlYXNlcmNgIGFuZCBgLmNvbmZpZy9yZWxlYXNlcmNgIG1heSBhbHNvIGhvbGQgWUFNTDsgYSBKU09OLnBhcnNlIGZhaWx1cmUgbGFuZHNcbiAgICAgICAgICAvLyBpbiB0aGUgY2F0Y2ggYmVsb3cgYW5kIG1hcmtzIHRoZSBwbHVnaW4gbGlzdCB1bmtub3duIGluc3RlYWQgb2Ygc2lsZW50bHkgcmVwb3J0aW5nXG4gICAgICAgICAgLy8gXCJubyBwbHVnaW5zXCIuXG4gICAgICAgICAgcmVsZWFzZUNvbmZpZyA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY1BhdGgsICd1dGY4JykpIGFzIFJlbGVhc2VDb25maWc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgYWNjZXB0cyBhIHNjYWxhciBicmFuY2ggb3IgYnJhbmNoIG9iamVjdHMgKHsgbmFtZSwgcHJlcmVsZWFzZSwgLi4uIH0pO1xuICAgICAgLy8gbm9ybWFsaXplIHRvIHBsYWluIGJyYW5jaCBuYW1lcyBmb3IgY29uc3VtZXJzIHN1Y2ggYXMgdGhlIHdvcmtmbG93IGdlbmVyYXRvci5cbiAgICAgIGNvbnN0IHJhd0JyYW5jaGVzID0gcmVsZWFzZUNvbmZpZz8uYnJhbmNoZXM7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSAoQXJyYXkuaXNBcnJheShyYXdCcmFuY2hlcykgPyByYXdCcmFuY2hlcyA6IHJhd0JyYW5jaGVzID09PSB1bmRlZmluZWQgPyBbXSA6IFtyYXdCcmFuY2hlc10pXG4gICAgICAgIC5tYXAoKGJyYW5jaDogdW5rbm93bikgPT5cbiAgICAgICAgICB0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJyA/IGJyYW5jaCA6IChicmFuY2ggYXMgeyBuYW1lPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubmFtZVxuICAgICAgICApXG4gICAgICAgIC5maWx0ZXIoKGJyYW5jaE5hbWUpOiBicmFuY2hOYW1lIGlzIHN0cmluZyA9PiB0eXBlb2YgYnJhbmNoTmFtZSA9PT0gJ3N0cmluZycpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVsZWFzZUNvbmZpZz8ucGx1Z2lucykpIHtcbiAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luRW50cnkgb2YgcmVsZWFzZUNvbmZpZy5wbHVnaW5zKSB7XG4gICAgICAgICAgY29uc3QgW3BsdWdpbk5hbWUsIHBsdWdpbk9wdGlvbnNdID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSkgPyBwbHVnaW5FbnRyeSA6IFtwbHVnaW5FbnRyeSwgdW5kZWZpbmVkXTtcbiAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbk5hbWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5wdXNoKHBsdWdpbk5hbWUpO1xuICAgICAgICAgIGlmIChwbHVnaW5OYW1lICE9PSAnQHNlbWFudGljLXJlbGVhc2UvbnBtJykgY29udGludWU7XG4gICAgICAgICAgLy8gV2l0aCBwa2dSb290IHRoZSBwbHVnaW4gcHVibGlzaGVzIGFub3RoZXIgbWFuaWZlc3QgKGl0IHJlc29sdmVzIHBrZ1Jvb3QgYWdhaW5zdCB0aGVcbiAgICAgICAgICAvLyByZXBvIHJvb3QsIHNvIGAuYCBhbmQgYC4vYCBib3RoIG1lYW4gdGhlIHJvb3QgaXRzZWxmKSwgYW5kIG5wbVB1Ymxpc2g6IGZhbHNlXG4gICAgICAgICAgLy8gZGlzYWJsZXMgcHVibGlzaGluZyBlbnRpcmVseTsgb25seSB0aGUgcmVtYWluaW5nIHNoYXBlIHByb3ZlcyB0aGUgUk9PVCBpcyBwdWJsaXNoZWQuXG4gICAgICAgICAgY29uc3QgcGtnUm9vdCA9IHBsdWdpbk9wdGlvbnM/LnBrZ1Jvb3Q7XG4gICAgICAgICAgY29uc3QgcHVibGlzaGVzUm9vdCA9XG4gICAgICAgICAgICBwbHVnaW5PcHRpb25zPy5ucG1QdWJsaXNoICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgKHBrZ1Jvb3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAodHlwZW9mIHBrZ1Jvb3QgPT09ICdzdHJpbmcnICYmIHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwa2dSb290KSA9PT0gcGF0aC5yZXNvbHZlKGRpclBhdGgpKSk7XG4gICAgICAgICAgcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QgfHw9IHB1Ymxpc2hlc1Jvb3Q7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVsZWFzZUNvbmZpZyAmJiByZWxlYXNlQ29uZmlnLmV4dGVuZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCBwbHVnaW4gbGlzdCwgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgbGlzdCBhcHBsaWVzLCB3aGljaCBpbmNsdWRlc1xuICAgIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbSBhbmQgQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViIChtaXJyb3JzIHJlbGVhc2VQdWJsaXNoZXNUb05wbSBpbiB3YidzXG4gICAgLy8gcmVsZWFzZS50cykuXG4gICAgY29uc3QgdXNlc1NlbWFudGljUmVsZWFzZSA9ICEhKFxuICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICApO1xuXG4gICAgLy8gVGhlIGNhbGxlciBtYXkgY2xhc3NpZnkgZXhwbGljaXRseSAoaW5kZXgudHMgcGFzc2VzIGZhbHNlIGZvciBldmVyeSBkaXNjb3ZlcmVkIHdvcmtzcGFjZSxcbiAgICAvLyBpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKik7IHRoZSBoZXVyaXN0aWMgY2xhc3NpZmllcyB0aGUgQ0xJIGVudHJ5XG4gICAgLy8gcGF0aCBpdHNlbGYsIHNvIGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgYW5kIGB3YmZ5IDxyZXBvPi9hcHBzLzxhcHA+YCBrZWVwIHRoZWlyIGNoaWxkXG4gICAgLy8gY2xhc3NpZmljYXRpb24uXG4gICAgY29uc3QgaXNSb290ID0gb3B0aW9ucz8uaXNSb290ID8/ICFpc1dvcmtzcGFjZU9mRW5jbG9zaW5nUm9vdChkaXJQYXRoKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgLy8gRmV0Y2ggdmlzaWJpbGl0eSBmb3IgdGhlIENMSSBlbnRyeSBldmVuIHdoZW4gaXQgaXMgYSB3b3Jrc3BhY2UgY2hpbGQgKGB3YmZ5XG4gICAgLy8gPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCk6IGdlbmVyYXRvcnMgcmVhZCBpc1B1YmxpY1JlcG8gZnJvbSB0aGVpciByb290Q29uZmlnIHBhcmFtZXRlcixcbiAgICAvLyB3aGljaCBJUyB0aGUgY2hpbGQgY29uZmlnIGluIHRoYXQgaW52b2NhdGlvbiwgc28gYSBzdHViIGBmYWxzZWAgdGhlcmUgd291bGQgZHJvcCB0aGVcbiAgICAvLyBwdWJsaWMtcmVwbyBwdWJsaXNoQ29uZmlnIGhhbmRsaW5nLiBEaXNjb3ZlcmVkIGNoaWxkcmVuIChvcHRpb25zLmlzUm9vdCA9PT0gZmFsc2UpIHN0aWxsXG4gICAgLy8gc2tpcCB0aGUgZmV0Y2gg4oCUIHRoZXkgaW5oZXJpdCB0aGUgZW5jbG9zaW5nIHJvb3QncyB2aXNpYmlsaXR5IHZpYSByb290Q29uZmlnIGluc3RlYWQuXG4gICAgaWYgKG9wdGlvbnM/LmlzUm9vdCAhPT0gZmFsc2UpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPbmx5IHRoZSByb290IGZldGNoZXMgcmVwbyBpbmZvLCBhbmQgdGhhdCBmZXRjaCBuZWVkcyBuZXR3b3JrIGFuZCBhIHRva2VuLCBzbyBpZGVudGl0eS1kZXJpdmVkXG4gICAgLy8gZmxhZ3MgYmVsb3cgd291bGQgb3RoZXJ3aXNlIGJlIGZhbHNlIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSBhbmQgZm9yIGV2ZXJ5IG9mZmxpbmUgb3JcbiAgICAvLyByYXRlLWxpbWl0ZWQgcnVuLiBUaGUgZ2l0IHJlbW90ZSBhbnN3ZXJzIHRoZSBzYW1lIHF1ZXN0aW9uIGxvY2FsbHksIGZvciBldmVyeSBwYWNrYWdlLlxuICAgIGlmICghcmVwb0F1dGhvciB8fCAhcmVwb05hbWUpIHtcbiAgICAgIFtyZXBvQXV0aG9yLCByZXBvTmFtZV0gPSBhd2FpdCByZXNvbHZlTG9jYWxSZXBvSWRlbnRpdHkoZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cbiAgICAvLyBCdWlsdCBmcm9tIHRoZSBSRVNPTFZFRCBpZGVudGl0eSBzbyB3b3Jrc3BhY2UgcGFja2FnZXMgYW5kIG9mZmxpbmUgcnVucyBhbHNvIGdldCBpdDsgY29uc3VtZXJzIGRlcml2ZVxuICAgIC8vIHRoZSBvd25lciBmcm9tIHRoaXMgZmllbGQgKGUuZy4gdG8gc2V0IGBhdXRob3JgKS5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0F1dGhvciAmJiByZXBvTmFtZSA/IGBnaXRodWI6JHtyZXBvQXV0aG9yfS8ke3JlcG9OYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGF1cmkgb2ZmaWNpYWxseSBzdXBwb3J0cyBKU09OLCBKU09ONSwgYW5kIFRPTUwgY29uZmlndXJhdGlvbiBmb3JtYXRzLlxuICAgIGNvbnN0IGRvZXNDb250YWluVGF1cmlDb25maWcgPSBbJ3RhdXJpLmNvbmYuanNvbicsICd0YXVyaS5jb25mLmpzb241JywgJ1RhdXJpLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdzcmMtdGF1cmknLCBmaWxlTmFtZSkpXG4gICAgKTtcbiAgICAvLyBSb290LWxldmVsIFwiSW5QYWNrYWdlc1wiIHNpZ25hbHMgbXVzdCBzZWUgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlIGxheW91dCAoZS5nLiBhcHBzLyopLCBub3RcbiAgICAvLyBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnksIHNvIHNjYW4gZWFjaCBkaXNjb3ZlcmVkIHdvcmtzcGFjZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgd29ya3NwYWNlU3ViRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyh7XG4gICAgICBkaXJQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgfSk7XG4gICAgY29uc3QgY29udGFpbnNBbnlJbldvcmtzcGFjZXMgPSAocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgICAgd29ya3NwYWNlU3ViRGlyUGF0aHMuc29tZSgod29ya3NwYWNlU3ViRGlyUGF0aCkgPT4gY29udGFpbnNBbnkocGF0dGVybiwgd29ya3NwYWNlU3ViRGlyUGF0aCkpO1xuICAgIGNvbnN0IGRvZXNDb250YWluV3JhbmdsZXJDb25maWcgPSBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoKTtcbiAgICBjb25zdCB3b3JrZmxvd0NvbnRlbnRzID0gcmVhZFdvcmtmbG93RmlsZUNvbnRlbnRzKGRpclBhdGgpO1xuICAgIGNvbnN0IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lID0gZGV0ZWN0UGxheXdyaWdodFJ1bnRpbWVJbXBvcnQoZGlyUGF0aCk7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogdHlwZW9mIHJlcG9JbmZvPy5wcml2YXRlID09PSAnYm9vbGVhbicsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0Nsb3VkZmxhcmU6IGRldGVjdENsb3VkZmxhcmUocGFja2FnZUpzb24sIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcsIHdvcmtmbG93Q29udGVudHMpLFxuICAgICAgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyxcbiAgICAgIGlzUmFpbHdheTogZGV0ZWN0UmFpbHdheShkaXJQYXRoLCBwYWNrYWdlSnNvbiwgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoLCByZXBvTmFtZSksXG4gICAgICBjYXJnb1RvbWxEaXJQYXRoczogZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGgpLFxuICAgICAgLy8gQWxzbyBob25vciBkZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgYmV5b25kIHBhY2thZ2VzLyogKGUuZy4gYXBwcy8qKTogdHJlYXRpbmcgYW5cbiAgICAgIC8vIGFwcHMvKi1vbmx5IG1vbm9yZXBvIGFzIGEgcGxhaW4gcGFja2FnZSB3b3VsZCBkZWxldGUgaXRzIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbiBpblxuICAgICAgLy8gZ2VuZXJhdGVQYWNrYWdlSnNvbiBhbmQgc2tpcCBtb25vcmVwby1vbmx5IGNvbnZlbnRpb25zIHN1Y2ggYXMgcm9vdCBgcHJpdmF0ZTogdHJ1ZWAuXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpIHx8IHdvcmtzcGFjZVN1YkRpclBhdGhzLmxlbmd0aCA+IDAsXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblV2TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3V2LmxvY2snKSksXG4gICAgICAvLyBSZWN1cnNpdmUgbGlrZSBkb2VzQ29udGFpbkphdmE6IG11bHRpLWxhbmd1YWdlIHJlcG9zaXRvcmllcyBrZWVwIGxhbmd1YWdlIGRpcmVjdG9yaWVzXG4gICAgICAvLyAoZS5nLiBQeXRob24gdG9vbGluZyBvciBNYXZlbiBtb2R1bGVzKSBvdXRzaWRlIHRoZSByb290IGFuZCBvdXRzaWRlIGRlY2xhcmVkIHdvcmtzcGFjZXMuXG4gICAgICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3twb2V0cnkubG9jayx1di5sb2NrfScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3BvbS54bWwnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblNsaWRldk1kOiBjb250YWluc0FueSgnKiovKi5zbGlkZXYubWQnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoXG4gICAgICAgICdzcmMtdGF1cmkve3RhdXJpLmNvbmYuanNvbix0YXVyaS5jb25mLmpzb241LFRhdXJpLnRvbWx9J1xuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmE6IGNvbnRhaW5zQW55KCcqKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJyoqLyouamF2YScpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgY2hha3JhOiAhIWRldkRlcGVuZGVuY2llc1snQGNoYWtyYS11aS9jbGknXSxcbiAgICAgICAgZHJpenpsZTogISFkZXBlbmRlbmNpZXNbJ2RyaXp6bGUtb3JtJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2RyaXp6bGUta2l0J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHBsYXl3cmlnaHRSdW50aW1lOiBpbXBvcnRzUGxheXdyaWdodEF0UnVudGltZSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgc2xpZGV2OiAhIWRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB0YXVyaTpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgICB2aW5leHQ6ICEhZGVwZW5kZW5jaWVzLnZpbmV4dCB8fCAhIWRldkRlcGVuZGVuY2llcy52aW5leHQsXG4gICAgICAgIHZpdGU6ICEhZGVwZW5kZW5jaWVzLnZpdGUgfHwgISFkZXZEZXBlbmRlbmNpZXMudml0ZSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXRcbiAgICAgICAgICA/IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB8fCByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICAgICAgICA6IHVzZXNTZW1hbnRpY1JlbGVhc2UsXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpIHx8IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICAgICAgIDogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgbnBtUHVibGlzaGVzUm9vdDogcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QsXG4gICAgICB9LFxuICAgICAgbWlzZVRhc2tzOiBhd2FpdCByZWFkTWlzZVRhc2tzKGRpclBhdGgpLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVXZMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sIHx8XG4gICAgICAvLyBBIHJlcG9zaXRvcnkgY2FuIGxlZ2l0aW1hdGVseSBjb250YWluIG9ubHkgZG9jdW1lbnRhdGlvbi4gSXRzIEdpdCBtZXRhZGF0YSBpcyBlbm91Z2ggdG9cbiAgICAgIC8vIGVzdGFibGlzaCB0aGF0IHRoZSBDTEkgdGFyZ2V0IGlzIGEgcHJvamVjdCByb290OyByZXF1aXJpbmcgYSBsYW5ndWFnZSBtYW5pZmVzdCBoZXJlIHdvdWxkXG4gICAgICAvLyBtYWtlIHdiZnkgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgcGFja2FnZS5qc29uIHRoYXQgaXQgbWFuYWdlcyBmb3Igc3VjaCByZXBvc2l0b3JpZXMuIEJvdGhcbiAgICAgIC8vIG9yZGluYXJ5IGNoZWNrb3V0cyAoYC5naXRgIGRpcmVjdG9yeSkgYW5kIHdvcmt0cmVlcyAoYC5naXRgIGZpbGUpIHNhdGlzZnkgdGhpcyBjaGVjay5cbiAgICAgIChjb25maWcuaXNSb290ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0JykpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgd2JmeSBtYW5hZ2VzIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgZm9yIHRoZSBwYWNrYWdlLiBUaGUgZmlsZSBpcyBnaXRpZ25vcmVkIGFuZCB1bnRyYWNrZWRcbiAqIGJlY2F1c2UgdGhlIGB3YiBnZW4tY29kZWAgcG9zdGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQgb24gZXZlcnkgaW5zdGFsbCwgc28gdGhlIHBhY2thZ2UgaGFzIHRvIG93biBhIHdyYW5nbGVyXG4gKiBjb25maWcgKGB3cmFuZ2xlciB0eXBlc2AgZXhpdHMgbm9uLXplcm8gd2l0aG91dCBvbmUpLCB0byBkZXBlbmQgb24gd3JhbmdsZXIgKGEgcGFja2FnZSBkZXBsb3lpbmcgdmlhIGFcbiAqIENJIGFjdGlvbiBjYW5ub3QgcmVzb2x2ZSB0aGUgY29tbWFuZCksIGFuZCB0byBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgZmlsZS5cbiAqXG4gKiBJTlZBUklBTlQg4oCUIHRoaXMgZGVjaXNpb24gbXVzdCBjb252ZXJnZSBhY3Jvc3MgbWFjaGluZXMgaG9sZGluZyB0aGUgc2FtZSBjb21taXQuIEl0IG11c3QgTkVWRVIgY29uc3VsdFxuICogZ2l0aWdub3JlZCBmaWxlcyAoYC5kZXYudmFycypgLCBgLmVudipgLCAuLi4pLCB3aGljaCBgd2Igc3RhcnRgIGFuZCBgd2IgZGVwbG95YCBjcmVhdGUgcm91dGluZWx5IGFuZCB3aGljaFxuICogdGhlcmVmb3JlIHN0YXkgdW50cmFja2VkIG9uIGRldiBtYWNoaW5lcyBmb3JldmVyOiBhIGZvcm1lciBjaGVjayB0aGF0IHRyZWF0ZWQgdGhlbSBhcyBpcnJlcHJvZHVjaWJsZSBpbnB1dHNcbiAqIG1hZGUgd2JmeSBydW5zIG9uIGRldiBtYWNoaW5lcyByZS10cmFjayB0aGUgfjE1ay1saW5lIGdlbmVyYXRlZCBmaWxlIHRoYXQgcnVucyBmcm9tIGNsZWFuIGNoZWNrb3V0cyBoYWRcbiAqIHVudHJhY2tlZCwgb3NjaWxsYXRpbmcgZXRlcm5hbGx5IChlLmcuIGFpLWdhbWUtYnVpbGRlciAjNjg0IOKGkiAjNzQ2KS4gUmVhZGluZyBjb21taXR0YWJsZSByZXBvc2l0b3J5IGZpbGVzXG4gKiBmcm9tIHRoZSB3b3JraW5nIHRyZWUgKHRoZSB3cmFuZ2xlciBjb25maWcsIHBhY2thZ2UuanNvbiwgdHNjb25maWcg4oCUIGFzIGV2ZXJ5IHdiZnkgZ2VuZXJhdG9yIGRvZXMpIGlzIGZpbmU6XG4gKiBhbnkgZGl2ZXJnZW5jZSB0aGVyZSBpcyB0cmFuc2llbnQgYW5kIGRpc2FwcGVhcnMgb25jZSB0aGUgZmlsZSBpcyBjb21taXR0ZWQgb3IgcmVtb3ZlZC5cbiAqIFRoZSBoYXphcmQgdGhhdCBjaGVjayBndWFyZGVkIGFnYWluc3Qgbm8gbG9uZ2VyIGV4aXN0czogYHdiIGdlbi1jb2RlYCBydW5zIGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCB3aXRoXG4gKiBhIGtleSBzdHViIGRlcml2ZWQgc29sZWx5IGZyb20gdGhlIGNvbW1pdHRlZCBmbm94LnRvbWwgKHNlZSB3YidzIHdyaXRlV29ya2VyVHlwZXNFbnZTdHViKSwgc28gbG9jYWwgZG90ZW52XG4gKiBmaWxlcyBuZXZlciBpbmZsdWVuY2UgdGhlIGdlbmVyYXRlZCBgRW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbikgJiYgY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcihjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ3BhY2thZ2VKc29uJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzY3JpcHRzID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBzY3JpcHRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBzZWdtZW50cyA9IHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0KTtcbiAgICBjb25zdCBoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUgPSBzZWdtZW50cz8uc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvXig/Oig/OmJ1bnxidW54KSg/OiAtLWJ1bik/KD86IHJ1bik/ICk/d2IgZ2VuLWNvZGUkL3UudGVzdChub3JtYWxpemVkKSAmJlxuICAgICAgICBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSB0aGUgY2Fub25pY2FsIGJ1biB3YiBnZW4tY29kZSBjb21tYW5kYDtcbiAgfVxuICAvLyBPbmx5IGBidW4gcnVuIDxzY3JpcHQ+YCBpcyByZWNvZ25pemVkIGFzIGEgd3JhcHBlcjsgYW5vdGhlciBydW5uZXIgc3BlbGxpbmcgd291bGQgZ2V0IGEgbWFuYWdlZFxuICAvLyBnZW5lcmF0aW9uIGFwcGVuZGVkIG5leHQgdG8gaXQgYW5kIHJ1biBldmVyeSBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuIFdpdGhvdXQgYSBnZW4tY29kZVxuICAvLyBwaXBlbGluZSBub3RoaW5nIGlzIGFwcGVuZGVkLCBzbyB0aGUgc3BlbGxpbmcgaXMgaXJyZWxldmFudCB0aGVyZS5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCA/PyAnJykgPz8gW10pIHtcbiAgICBjb25zdCBzY3JpcHROYW1lID0gL14oPzpidW58YnVueCkoPzpcXHMrLS1idW4pPyg/OlxccytydW4pP1xccysoXFxTKykkL3UuZXhlYyhzZWdtZW50KT8uWzFdO1xuICAgIGNvbnN0IHRhcmdldCA9IHNjcmlwdE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgaWYgKFxuICAgICAgdGFyZ2V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHNlZ21lbnQgIT09IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gICYmXG4gICAgICAoc2NyaXB0c1snZ2VuLWNvZGUnXSAhPT0gdW5kZWZpbmVkIHx8IHRhcmdldC5pbmNsdWRlcygnd2IgZ2VuLWNvZGUnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBgcG9zdGluc3RhbGwgbXVzdCBpbnZva2UgdGhlICR7c2NyaXB0TmFtZX0gc2NyaXB0IGFzIGJ1biBydW4gJHtzY3JpcHROYW1lfWA7XG4gICAgfVxuICB9XG4gIGlmIChcbiAgICAvKD86XnwmJilcXHMqKD86bnBtfG5weHxwbnBtfHlhcm4pXFxzKyg/OnJ1big/Oi1zY3JpcHQpP1xccyspPyg/Omdlbi1jb2RlfHdiXFxzK2dlbi1jb2RlKVxccyooPzomJnwkKS91LnRlc3QoXG4gICAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gJ3Bvc3RpbnN0YWxsIG11c3QgdXNlIGJ1biB3YiBnZW4tY29kZSBpbnN0ZWFkIG9mIGEgbm9uLUJ1biBnZW4tY29kZSBydW5uZXInO1xuICB9XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmICh3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm4gYCR7bmFtZX0gbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2Ygd3JhbmdsZXIgdHlwZXNgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIFtcbiAgICBwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/Lm9wdGlvbmFsRGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5wZWVyRGVwZW5kZW5jaWVzLFxuICBdLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gZGVwZW5kZW5jaWVzPy53cmFuZ2xlciAhPT0gdW5kZWZpbmVkKTtcbn1cblxuY29uc3Qgc2hlbGxXb3JkUGF0dGVybiA9IFN0cmluZy5yYXdgKD86XCIoPzpcXFxcLnxbXlwiXFxcXF0pKlwifCcoPzpcXFxcLnxbXidcXFxcXSkqJ3woPzpcXFxcLnxbXlxcc1wiJ1xcXFxdKSspYDtcbmNvbnN0IHdyYW5nbGVyT3B0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgXFxzKy0tP1tBLVphLXpdW1xcdy1dKig/Oj0ke3NoZWxsV29yZFBhdHRlcm59fFxccysoPyEtfHR5cGVzXFxiKSR7c2hlbGxXb3JkUGF0dGVybn0pP2A7XG5jb25zdCB3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICBTdHJpbmcucmF3YFtcIiddP1xcYndyYW5nbGVyKD86QFteXFxzXCInXSspP1xcYltcIiddPyg/OiR7d3JhbmdsZXJPcHRpb25QYXR0ZXJufSkqXFxzK3R5cGVzXFxiYCxcbiAgJ3UnXG4pO1xuXG4vKipcbiAqIEEgcGFja2FnZSB3aG9zZSBUeXBlU2NyaXB0IHByb2plY3QgY2Fubm90IGluY2x1ZGUgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyAoZS5nLiBvbmUgb24gYSBoYW5kLW1haW50YWluZWRcbiAqIG1pbmltYWwgYEVudmAgd2l0aCBgdHlwZXM6IFtcImJ1blwiXWAsIHRoZSBzdGFuZGFyZCBlc2NhcGUgd2hlbiB0aGUgYW1iaWVudCB3cmFuZ2xlciBnbG9iYWxzIGNvbmZsaWN0IHdpdGggdGhlXG4gKiBgQHR5cGVzL2J1bmAgZ2xvYmFscyBpdHMgdGVzdHMgbmVlZCkgZ2FpbnMgbm90aGluZyBmcm9tIHJlZ2VuZXJhdGluZyB0aGUgfjUwMEtCIGZpbGUgb24gZXZlcnkgaW5zdGFsbCwgc28gd2JmeVxuICogbGVhdmVzIHN1Y2ggcGFja2FnZXMgdW5tYW5hZ2VkIGluc3RlYWQgb2YgcmUtYWRkaW5nIHRoZSBnZW5lcmF0aW9uIHN0ZXAuIENvbnN1bXB0aW9uIGlzIGRldGVjdGVkIHR3byB3YXlzOlxuICogYSB0ZXh0dWFsIGB3b3JrZXItY29uZmlndXJhdGlvbmAgcmVmZXJlbmNlIGluIGFueSB0cmFja2VkIGZpbGUgb2YgdGhlIHBhY2thZ2UgKGNvdmVycyBpbXBvcnRzLCB0cmlwbGUtc2xhc2hcbiAqIHJlZmVyZW5jZXMsIGFuZCBleHBsaWNpdCB0c2NvbmZpZyBlbnRyaWVzKSwgb3IgYSBgZmlsZXNgL2BpbmNsdWRlYC9gZXhjbHVkZWAgc2V0IHRoYXQgY2FuIG1hdGNoIHRoZSBmaWxlIOKAlFxuICogcmVzb2x2ZWQgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zIHdpdGggZWFjaCBwYXR0ZXJuIGtlcHQgcmVsYXRpdmUgdG8gdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIGl0LFxuICogbWF0Y2hpbmcgdHNjLiBXaGVuZXZlciB0aGUgZWZmZWN0aXZlIHNldCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAobWlzc2luZyBvciB1bnBhcnNlYWJsZSB0c2NvbmZpZywgcGFja2FnZS1uYW1lXG4gKiBgZXh0ZW5kc2AgcHJlc2V0cywgb3IgVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24pLCB0aGUgY3VycmVudCBtYW5hZ2VkIGJlaGF2aW9yIGlzIGtlcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCc+KTogYm9vbGVhbiB7XG4gIC8vIGBnaXQgZ3JlcGAgc2VhcmNoZXMgdHJhY2tlZCBmaWxlcyBvbmx5LCBzbyB0aGUgZ2l0aWdub3JlZCBnZW5lcmF0ZWQgZmlsZSBpdHNlbGYgbmV2ZXIgbWF0Y2hlcy5cbiAgLy8gd2JmeSdzIG93biBtYW5hZ2VkIGFydGlmYWN0cyBhcmUgZXhjbHVkZWQ6IHRoZSBgLmdpdGlnbm9yZWAgcnVsZSAoYC93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYClcbiAgLy8gd2JmeSBjb21taXR0ZWQgd2hpbGUgaXQgbWFuYWdlZCB0aGUgcGFja2FnZSBtdXN0IG5vdCBjb3VudCBhcyBjb25zdW1wdGlvbiwgb3IgYSBvbmNlLW1hbmFnZWRcbiAgLy8gcGFja2FnZSBjb3VsZCBuZXZlciBvcHQgb3V0LlxuICBjb25zdCBncmVwUmVzdWx0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICdnaXQnLFxuICAgIC8vIHRzY29uZmlnIGZpbGVzIGFyZSBjbGFzc2lmaWVkIGJ5IHRoZSByZXNvbHZlZCBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgbG9naWMgYmVsb3cg4oCUIGEgdGV4dHVhbFxuICAgIC8vIGhpdCB0aGVyZSAoZS5nLiBhbiBgZXhjbHVkZWAgZW50cnkpIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLlxuICAgIFtcbiAgICAgICdncmVwJyxcbiAgICAgICctbCcsXG4gICAgICAnd29ya2VyLWNvbmZpZ3VyYXRpb24nLFxuICAgICAgJy0tJyxcbiAgICAgICcuJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGlnbm9yZScsXG4gICAgICAnOihleGNsdWRlKS5naXRhdHRyaWJ1dGVzJyxcbiAgICAgIFN0cmluZy5yYXdgOihnbG9iLGV4Y2x1ZGUpKiovdHNjb25maWcqLmpzb25gLFxuICAgIF0sXG4gICAgY29uZmlnLmRpclBhdGhcbiAgKTtcbiAgaWYgKGdyZXBSZXN1bHQudHJpbSgpKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCB3b3JrZXJUeXBlc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJyk7XG4gIGNvbnN0IGZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKSwgY29uZmlnLmRpclBhdGgsIDUpO1xuICBpZiAoIWZpbGVTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBtYXRjaGVzID0gKHBhdHRlcm5TZXQ6IFRzY29uZmlnUGF0dGVyblNldCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghcGF0dGVyblNldCB8fCAhQXJyYXkuaXNBcnJheShwYXR0ZXJuU2V0LnBhdHRlcm5zKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGF0dGVyblNldC5iYXNlRGlyUGF0aCwgd29ya2VyVHlwZXNQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICByZXR1cm4gcGF0dGVyblNldC5wYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBgJHtjb25maWdEaXJ9YC1wcmVmaXhlZCBwYXR0ZXJucyB3ZXJlIGV4cGFuZGVkIHRvIGFic29sdXRlIHBhdGhzIGF0IHJlc29sdmUgdGltZS5cbiAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm4sIHdvcmtlclR5cGVzUGF0aCwgcGF0dGVyblNldC5leHBhbmRzRGlyZWN0b3JpZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgcmVsYXRpdmVQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgfSk7XG4gIH07XG4gIC8vIGBmaWxlc2AgZW50cmllcyBhcmUgYWx3YXlzIHBhcnQgb2YgdGhlIHByb2dyYW0sIGV2ZW4gd2hlbiBgZXhjbHVkZWAgbWF0Y2hlcyB0aGVtLlxuICBpZiAobWF0Y2hlcyhmaWxlU2V0LmZpbGVzKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZXhjbHVkZSkpIHJldHVybiBmYWxzZTtcbiAgLy8gTmVpdGhlciBpbmNsdWRlIG5vciBmaWxlcyBkZWNsYXJlZDogVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24gY292ZXJzIHRoZSBmaWxlLlxuICBpZiAoIWZpbGVTZXQuaW5jbHVkZSAmJiAhZmlsZVNldC5maWxlcykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBtYXRjaGVzKGZpbGVTZXQuaW5jbHVkZSk7XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ1BhdHRlcm5TZXQge1xuICAvKiogRGlyZWN0b3J5IG9mIHRoZSBjb25maWcgdGhhdCBkZWNsYXJlZCB0aGUgcGF0dGVybnM7IHRzYyByZXNvbHZlcyB0aGVtIHJlbGF0aXZlIHRvIGl0LiAqL1xuICBiYXNlRGlyUGF0aDogc3RyaW5nO1xuICAvKiogaW5jbHVkZS9leGNsdWRlIHRyZWF0IGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgcGF0dGVybiBhcyBhIGRpcmVjdG9yeSBzdWJ0cmVlOyBgZmlsZXNgIGRvZXMgbm90LiAqL1xuICBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW47XG4gIHBhdHRlcm5zOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgVHNjb25maWdGaWxlU2V0IHtcbiAgZXhjbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgZmlsZXM/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG4gIGluY2x1ZGU/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG59XG5cbi8qKiBSZXNvbHZlcyBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zOyB1bmRlZmluZWQgd2hlbiB1bnJlYWRhYmxlLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uc3VtZXJEaXJQYXRoOiBzdHJpbmcsXG4gIHJlbWFpbmluZ0RlcHRoOiBudW1iZXJcbik6IFRzY29uZmlnRmlsZVNldCB8IHVuZGVmaW5lZCB7XG4gIGlmIChyZW1haW5pbmdEZXB0aCA8PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgdHNjb25maWcgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPHtcbiAgICBleGNsdWRlPzogdW5rbm93bjtcbiAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICBmaWxlcz86IHVua25vd247XG4gICAgaW5jbHVkZT86IHVua25vd247XG4gIH0+KGNvbnRlbnQpO1xuICBpZiAoIXRzY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgLy8gYCR7Y29uZmlnRGlyfWAgcmVzb2x2ZXMgdG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgUk9PVCAoY29uc3VtaW5nKSBjb25maWcsIHdoZXJldmVyIGl0IGFwcGVhcnMuXG4gIGNvbnN0IHRvUGF0dGVyblNldCA9IChwYXR0ZXJuczogdW5rbm93biwgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkID0+XG4gICAgQXJyYXkuaXNBcnJheShwYXR0ZXJucylcbiAgICAgID8ge1xuICAgICAgICAgIGJhc2VEaXJQYXRoOiBkaXJQYXRoLFxuICAgICAgICAgIGV4cGFuZHNEaXJlY3RvcmllcyxcbiAgICAgICAgICBwYXR0ZXJuczogcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PlxuICAgICAgICAgICAgdHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnICYmIHBhdHRlcm4uc3RhcnRzV2l0aCgnJHtjb25maWdEaXJ9JylcbiAgICAgICAgICAgICAgPyBwYXRoLmpvaW4oY29uc3VtZXJEaXJQYXRoLCBwYXR0ZXJuLnNsaWNlKCcke2NvbmZpZ0Rpcn0nLmxlbmd0aCkpXG4gICAgICAgICAgICAgIDogcGF0dGVyblxuICAgICAgICAgICksXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBmaWxlU2V0OiBUc2NvbmZpZ0ZpbGVTZXQgPSB7XG4gICAgZXhjbHVkZTogdG9QYXR0ZXJuU2V0KHRzY29uZmlnLmV4Y2x1ZGUsIHRydWUpLFxuICAgIGZpbGVzOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZmlsZXMsIGZhbHNlKSxcbiAgICBpbmNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuaW5jbHVkZSwgdHJ1ZSksXG4gIH07XG4gIGNvbnN0IHBhcmVudHMgPVxuICAgIHR5cGVvZiB0c2NvbmZpZy5leHRlbmRzID09PSAnc3RyaW5nJyA/IFt0c2NvbmZpZy5leHRlbmRzXSA6IEFycmF5LmlzQXJyYXkodHNjb25maWcuZXh0ZW5kcykgPyB0c2NvbmZpZy5leHRlbmRzIDogW107XG4gIC8vIFdpdGggYW4gYGV4dGVuZHNgIGFycmF5LCBsYXRlciBlbnRyaWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lcywgYW5kIHRoZSBjaGlsZCBvdmVycmlkZXMgYWxsIOKAlFxuICAvLyBzbyBmaWxsIGVhY2ggc3RpbGwtbWlzc2luZyBrZXkgZnJvbSB0aGUgbGFzdCBwYXJlbnQgdGhhdCBkZWZpbmVzIGl0LlxuICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRzLnRvUmV2ZXJzZWQoKSkge1xuICAgIGlmIChmaWxlU2V0LmV4Y2x1ZGUgJiYgZmlsZVNldC5maWxlcyAmJiBmaWxlU2V0LmluY2x1ZGUpIGJyZWFrO1xuICAgIC8vIFBhY2thZ2UtbmFtZSBleHRlbmRzIChlLmcuIGBAdHNjb25maWcvYnVuYCkgYXJlIGNvbXBpbGVyT3B0aW9ucyBwcmVzZXRzIHdpdGhvdXQgZmlsZSBzZXRzLlxuICAgIGlmICh0eXBlb2YgcGFyZW50ICE9PSAnc3RyaW5nJyB8fCAhcGFyZW50LnN0YXJ0c1dpdGgoJy4nKSkgY29udGludWU7XG4gICAgbGV0IHBhcmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcGFyZW50KTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFyZW50UGF0aCkgJiYgZnMuZXhpc3RzU3luYyhgJHtwYXJlbnRQYXRofS5qc29uYCkpIHBhcmVudFBhdGggKz0gJy5qc29uJztcbiAgICBjb25zdCBwYXJlbnRGaWxlU2V0ID0gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChwYXJlbnRQYXRoLCBjb25zdW1lckRpclBhdGgsIHJlbWFpbmluZ0RlcHRoIC0gMSk7XG4gICAgaWYgKCFwYXJlbnRGaWxlU2V0KSBjb250aW51ZTtcbiAgICBmaWxlU2V0LmV4Y2x1ZGUgPz89IHBhcmVudEZpbGVTZXQuZXhjbHVkZTtcbiAgICBmaWxlU2V0LmZpbGVzID8/PSBwYXJlbnRGaWxlU2V0LmZpbGVzO1xuICAgIGZpbGVTZXQuaW5jbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5pbmNsdWRlO1xuICB9XG4gIHJldHVybiBmaWxlU2V0O1xufVxuXG5mdW5jdGlvbiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXR0ZXJuLnJlcGxhY2UoL15cXC5cXC8vdSwgJycpO1xuICAvLyBBIGJhcmUgYC5gIGluY2x1ZGUgY292ZXJzIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIGNvbmZpZydzIGRpcmVjdG9yeS5cbiAgaWYgKG5vcm1hbGl6ZWQgPT09ICcnIHx8IG5vcm1hbGl6ZWQgPT09ICcuJykgcmV0dXJuIHRydWU7XG4gIC8vIEFic29sdXRlIHBhdHRlcm5zIChleHBhbmRlZCBgJHtjb25maWdEaXJ9YCkgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgYWJzb2x1dGUgdGFyZ2V0OyBkcm9wIHRoZVxuICAvLyBsZWFkaW5nIHNsYXNoZXMgZnJvbSBib3RoIHNvIHRoZSBzZWdtZW50LWJ1aWx0IHJlZ2V4IGFuY2hvcnMgaWRlbnRpY2FsbHkuXG4gIHRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL15cXC8rL3UsICcnKTtcbiAgY29uc3Qgc2VnbWVudHMgPSBub3JtYWxpemVkLnNwbGl0KCcvJykuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICE9PSAnJyk7XG4gIGNvbnN0IHJlZ2V4U291cmNlID0gc2VnbWVudHNcbiAgICAubWFwKChzZWdtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoc2VnbWVudCA9PT0gJyoqJykgcmV0dXJuIGlzTGFzdCA/ICcuKicgOiBTdHJpbmcucmF3YCg/OlteL10rLykqYDtcbiAgICAgIGNvbnN0IHNlZ21lbnRTb3VyY2UgPSBzZWdtZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKVxuICAgICAgICAucmVwbGFjZUFsbCgnKicsIFN0cmluZy5yYXdgW14vXSpgKVxuICAgICAgICAucmVwbGFjZUFsbCgnPycsIFN0cmluZy5yYXdgW14vXWApO1xuICAgICAgcmV0dXJuIGlzTGFzdCA/IHNlZ21lbnRTb3VyY2UgOiBgJHtzZWdtZW50U291cmNlfS9gO1xuICAgIH0pXG4gICAgLmpvaW4oJycpO1xuICAvLyB0c2MgdHJlYXRzIGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgaW5jbHVkZS9leGNsdWRlIGVudHJ5IGFzIGEgZGlyZWN0b3J5IHdob3NlIHN1YnRyZWUgaXMgaW5jbHVkZWQuXG4gIGNvbnN0IGxhc3RTZWdtZW50ID0gc2VnbWVudHMuYXQoLTEpID8/ICcnO1xuICBjb25zdCBkaXJlY3RvcnlTdWZmaXggPVxuICAgIGV4cGFuZHNEaXJlY3RvcmllcyAmJiAhL1sqP10vdS50ZXN0KGxhc3RTZWdtZW50KSAmJiAhbGFzdFNlZ21lbnQuaW5jbHVkZXMoJy4nKSA/IFN0cmluZy5yYXdgKD86Ly4qKT9gIDogJyc7XG4gIHJldHVybiBuZXcgUmVnRXhwKGBeJHtyZWdleFNvdXJjZX0ke2RpcmVjdG9yeVN1ZmZpeH0kYCwgJ3UnKS50ZXN0KHRhcmdldFBhdGgpO1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBvd25zIGEgV29ya2VyLCB1bmxpa2UgdGhlIGlzQ2xvdWRmbGFyZSBoZXVyaXN0aWMsIHdoaWNoIGFsc28gbWF0Y2hlcyBhIHBhY2thZ2UgdGhhdFxuICogbWVyZWx5IG1lbnRpb25zIHdyYW5nbGVyIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93IChlLmcuIHRoZSByb290IG9mIGEgbW9ub3JlcG8gd2hvc2UgV29ya2VyIGxpdmVzIGluIGEgc3ViLXBhY2thZ2UpLlxuICovXG5mdW5jdGlvbiBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpKVxuICApO1xufVxuXG4vKipcbiAqIERldGVjdHMgd2hldGhlciBkaXJQYXRoIGJlbG9uZ3MgdG8gdGhlIHdpbGxib29zdGVyLWNvbmZpZ3MgcmVwb3NpdG9yeS4gUHJlZmVycyB0aGUgYXV0aG9yaXRhdGl2ZVxuICogR2l0SHViIHJlcG8gbmFtZSwgd2hpY2ggaXMgaW1tdW5lIHRvIHRoZSBsb2NhbCBkaXJlY3RvcnkgbGF5b3V0LiBUaGF0IG5hbWUgaXMgZmV0Y2hlZCBvbmx5IGZvciB0aGVcbiAqIHJvb3QsIHNvIHN1Yi1wYWNrYWdlcyAoYW5kIG9mZmxpbmUgcm9vdHMpIHdhbGsgdXAgdG8gdGhlIG5lYXJlc3QgZ2l0IHJvb3QgYW5kIG1hdGNoIGl0cyBkaXJlY3RvcnlcbiAqIG5hbWU6IGEgc2libGluZyByZXBvIGNsb25lZCB1bmRlciBhIHBhcmVudCBkaXJlY3RvcnkgbmFtZWQgd2lsbGJvb3N0ZXItY29uZmlncyBzdG9wcyBhdCBpdHMgb3duXG4gKiBgLmdpdGAsIHNvIGl0IGlzIG5vdCBtaXNjbGFzc2lmaWVkLiBUaGUgcGF0aCBzZWdtZW50IHJlbWFpbnMgYSBsYXN0IHJlc29ydCB3aGVuIG5vIGdpdCByb290IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvblBhdGg6IHN0cmluZywgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAocmVwb05hbWUpIHJldHVybiByZXBvTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAoY3VycmVudCAhPT0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcuZ2l0JykpKSB7XG4gICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjdXJyZW50KS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCcvd2lsbGJvb3N0ZXItY29uZmlncy8nKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0Q2xvdWRmbGFyZShcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuLFxuICB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCd3cmFuZ2xlcicpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRvZXNDb250YWluV3JhbmdsZXJDb25maWcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0NvbnRlbnRzLnNvbWUoKGNvbnRlbnQpID0+IC9jbG91ZGZsYXJlfHdyYW5nbGVyL2l1LnRlc3QoY29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RSYWlsd2F5KGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygncmFpbHdheScpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmFpbHdheWlnbm9yZScpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5Lmpzb24nKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncmFpbHdheS50b21sJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL3JhaWx3YXkvaXUudGVzdChjb250ZW50KSk7XG59XG5cbi8qKiBDb250ZW50cyBvZiB0aGUgcmVhZGFibGUgLmdpdGh1Yi93b3JrZmxvd3MgWUFNTCBmaWxlcywgcmVhZCBvbmNlIGZvciBldmVyeSBkZXRlY3RvciBuZWVkaW5nIHRoZW0uICovXG5mdW5jdGlvbiByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpXG4gICAgICAuZmlsdGVyKChmaWxlTmFtZSkgPT4gL1xcLnlhP21sJC9pdS50ZXN0KGZpbGVOYW1lKSlcbiAgICAgIC5mbGF0TWFwKChmaWxlTmFtZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBbZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4JyldO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1pc2VUYXNrcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7IHRhc2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncy50YXNrcyA/PyB7fSkpIHtcbiAgICAgICAgdGFza3NbbmFtZV0gPSByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3Npbmcgb3IgdGVtcG9yYXJpbHkgaW52YWxpZCBtaXNlIGZpbGVzIHNob3VsZCBub3QgYmxvY2sgb3RoZXIgd2JmeSBnZW5lcmF0b3JzLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAvLyBQcmVzZXJ2ZSBhcnJheS1mb3JtIG1pc2UgY29tbWFuZHMgc28gcmVjdXJzaW9uIGNoZWNrcyBjYW4gc3RpbGwgc2VlIHBhY2thZ2Ugc2NyaXB0IGNhbGxzLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIHN0cmluZyA9PiB0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpLmpvaW4oJ1xcbicpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHJlYWRNaXNlVGFza0NvbW1hbmQoKHZhbHVlIGFzIHsgcnVuPzogdW5rbm93biB9KS5ydW4pO1xuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2hldGhlciBkaXJQYXRoIGlzIGEgY2hpbGQgd29ya3NwYWNlIG9mIGFuIGVuY2xvc2luZyBtb25vcmVwbyByb290OiBlaXRoZXIgdGhlIGNvbnZlbnRpb25hbFxuICogYDxyb290Pi9wYWNrYWdlcy88bmFtZT5gIGxheW91dCwgb3IgYSBkaXJlY3RvcnkgbWF0Y2hpbmcgYSB3b3Jrc3BhY2UgcGF0dGVybiBkZWNsYXJlZCBieSBhblxuICogYW5jZXN0b3IgcGFja2FnZS5qc29uIChwYXR0ZXJucyBtYXkgYmUgYXJiaXRyYXJpbHkgZGVlcCwgZS5nLiBgZXhhbXBsZXMvKipgKS4gVGhlIHdhbGsgc3RvcHNcbiAqIGF0IHRoZSBmaXJzdCBnaXQgcmVwb3NpdG9yeSBib3VuZGFyeSBzbyBhbiB1bnJlbGF0ZWQgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyB3b3Jrc3BhY2VzIGNhblxuICogbmV2ZXIgcmVjbGFzc2lmeSBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IGFzIGEgY2hpbGQuXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZXNvbHZlZERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIC8vIEEgZGlyZWN0b3J5IHdpdGggaXRzIG93biAuZ2l0IGlzIGEgcmVwb3NpdG9yeSBpbiBpdHMgb3duIHJpZ2h0LCBuZXZlciBhIGNoaWxkIHdvcmtzcGFjZSDigJRcbiAgLy8gY2hlY2tlZCBGSVJTVCBzbyBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IHVuZGVyIHNvbWUgYHBhY2thZ2VzL2AgZGlyZWN0b3J5IHN0YXlzIGEgcm9vdC5cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy4uJykpID09PSAncGFja2FnZXMnICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvciAoXG4gICAgbGV0IGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHJlc29sdmVkRGlyUGF0aCk7XG4gICAgO1xuICAgIGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKVxuICApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgcmVzb2x2ZWREaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh7XG4gICAgICAgIGRpclBhdGg6IGNhbmRpZGF0ZVJvb3REaXJQYXRoLFxuICAgICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogZmFsc2UsXG4gICAgICB9KS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmluY2x1ZGVzKHJlbGF0aXZlRGlyUGF0aCkpIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm8gb3IgdW5wYXJzYWJsZSBtYW5pZmVzdCBhdCB0aGlzIGFuY2VzdG9yOiBrZWVwIHdhbGtpbmcuXG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsICcuZ2l0JykpO1xuICAgIGNvbnN0IGlzRmlsZXN5c3RlbVJvb3QgPSBjYW5kaWRhdGVSb290RGlyUGF0aCA9PT0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZnXG4gICAgLmdsb2JTeW5jKCcqKi9DYXJnby50b21sJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pXG4gICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnNwbGl0KCcvJykubGVuZ3RoIC0gYi5zcGxpdCgnLycpLmxlbmd0aCB8fCBhLmxvY2FsZUNvbXBhcmUoYikpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZXMgPSBmZy5nbG9iU3luYygne2FwcCxzcmN9LyoqLyoue2NqcyxjdHMsanMsanN4LG1qcyxtdHMsdHMsdHN4fScsIHtcbiAgICBkb3Q6IHRydWUsXG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsICcqKi9fX3Rlc3RzX18vKionLCAnKiovKi5zcGVjLionLCAnKiovKi50ZXN0LionLCAnKiovcGxheXdyaWdodC5jb25maWcuKiddLFxuICB9KTtcbiAgY29uc3QgcGxheXdyaWdodEltcG9ydFBhdHRlcm4gPSBidWlsZFJ1bnRpbWVJbXBvcnRSZWdFeHAoJ3BsYXl3cmlnaHQnKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZSksICd1dGY4Jyk7XG4gICAgaWYgKHBsYXl3cmlnaHRJbXBvcnRQYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSdW50aW1lSW1wb3J0UmVnRXhwKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBSZWdFeHAge1xuICAvLyBNYXRjaCB0aGUgYmFyZSBzcGVjaWZpZXIgb3IgYW55IHN1YnBhdGggb2YgaXQgKGBwa2dgIC8gYHBrZy9zdWJgKSwgYnV0IG5ldmVyIGEgZGlmZmVyZW50IHBhY2thZ2VcbiAgLy8gdGhhdCBtZXJlbHkgc2hhcmVzIHRoZSBwcmVmaXggKGBwa2ctb3RoZXJgKSwgc2luY2UgdGhlIGNoYXIgYWZ0ZXIgdGhlIG5hbWUgbXVzdCBiZSBgL2Agb3IgYSBxdW90ZS5cbiAgY29uc3Qgc3BlY2lmaWVyID0gU3RyaW5nLnJhd2BbJ1wiXSR7ZXNjYXBlUmVnRXhwKHBhY2thZ2VOYW1lKX0oPzovW14nXCJdKik/WydcIl1gO1xuICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YFxcYmZyb21cXHMrJHtzcGVjaWZpZXJ9fFxcYmltcG9ydFxccypcXChcXHMqJHtzcGVjaWZpZXJ9XFxzKlxcKXxcXGJyZXF1aXJlXFxzKlxcKFxccyoke3NwZWNpZmllcn1cXHMqXFwpYCxcbiAgICAndSdcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVtb3RlVXJsID0gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGgpO1xuICBpZiAocmVtb3RlVXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uLiBUaGUgb3duZXIgTVVTVCBiZSBwYXNzZWQ6IGdldE9jdG9raXQoKSB3aXRob3V0IGl0IHByZWZlcnMgdGhlXG4gICAgLy8gV2lsbEJvb3N0ZXIgUEFULCB3aGljaCBjYW5ub3QgcmVhZCBwcml2YXRlIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcywgY29sbGFwc2luZyB0aGVpclxuICAgIC8vIHZpc2liaWxpdHkgdG8gdW5rbm93biAoYW5kIGUuZy4gc2tpcHBpbmcgdGhlIHdiZnkgY2FsbGVyIGdlbmVyYXRpb24gaW5kZWZpbml0ZWx5KS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQob3JnKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgLy8gUmUtZmV0Y2ggdW5kZXIgdGhlIHJlZGlyZWN0ZWQgaWRlbnRpdHkgc28gYSByZW5hbWVkIHJlcG9zaXRvcnkgc3RpbGwgZ2V0cyBjb21wbGV0ZVxuICAgICAgLy8gbWV0YWRhdGEgKHZpc2liaWxpdHkgaW5jbHVkZWQpIGluc3RlYWQgb2YgYSBiYXJlIGZ1bGxfbmFtZSB0aGF0IHdvdWxkIGxlYXZlXG4gICAgICAvLyBpc1JlcG9WaXNpYmlsaXR5S25vd24gZmFsc2Ugb24gZXZlcnkgc3Vic2VxdWVudCBydW4gd2l0aCB0aGUgc3RhbGUgcmVtb3RlIFVSTC5cbiAgICAgIGNvbnN0IFtyZWRpcmVjdGVkT3JnLCByZWRpcmVjdGVkTmFtZV0gPSByZWRpcmVjdGVkRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZWRpcmVjdGVkT3JnICYmIHJlZGlyZWN0ZWROYW1lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KHJlZGlyZWN0ZWRPcmcpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcjogcmVkaXJlY3RlZE9yZyxcbiAgICAgICAgICAgIHJlcG86IHJlZGlyZWN0ZWROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGJhcmUgaWRlbnRpdHkgYmVsb3c6IHRoZSByZXBvc2l0b3J5IGlzIHN0aWxsIGNhbm9uaWNhbGl6ZWQsIG9ubHlcbiAgICAgICAgICAvLyBpdHMgdmlzaWJpbGl0eSBzdGF5cyB1bmtub3duLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBmdWxsX25hbWU6IHJlZGlyZWN0ZWRGdWxsTmFtZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGA8b3JnPi88bmFtZT5gIGZyb20gdGhlIGdpdCByZW1vdGUgKGZhbGxpbmcgYmFjayB0byBwYWNrYWdlLmpzb24ncyBgcmVwb3NpdG9yeWApIHdpdGhvdXRcbiAqIGNhbGxpbmcgdGhlIEdpdEh1YiBBUEkuIEl0IHdvcmtzIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSwgbm90IGp1c3QgdGhlIHJvb3Qg4oCUIG9ubHkgdGhlIHJvb3RcbiAqIGZldGNoZXMgcmVwbyBpbmZvIOKAlCBhbmQgaXQga2VlcHMgd29ya2luZyBvZmZsaW5lIG9yIHJhdGUtbGltaXRlZCwgd2hlcmUgYW4gdW5kZWZpbmVkIGlkZW50aXR5XG4gKiB3b3VsZCBzaWxlbnRseSByZWNsYXNzaWZ5IHRoZSByZXBvc2l0b3J5IChlLmcuIG1ha2luZyB3YmZ5IHdyaXRlIHdpbGxib29zdGVyLWNvbmZpZ3MnIFJlbm92YXRlXG4gKiBwcmVzZXQgaW50byB0aGUgcHJlc2V0IGl0c2VsZiBhZ2FpbikuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb25cbik6IFByb21pc2U8W3N0cmluZyB8IHVuZGVmaW5lZCwgc3RyaW5nIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCByZW1vdGVVcmwgPSBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aCk7XG4gIGlmIChyZW1vdGVVcmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eShyZW1vdGVVcmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eSh1cmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIHJldHVybiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xufVxuXG5mdW5jdGlvbiBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydjb25maWcnLCAnLS1nZXQnLCAncmVtb3RlLm9yaWdpbi51cmwnXSwgZGlyUGF0aCkgfHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWVgIGlzIGhvc3QtYWdub3N0aWMsIHNvIGl0IGhhcHBpbHkgdHVybnMgYSBHaXRMYWIgVVJMIGludG8gYW4gYDxvcmc+LzxyZXBvPmAgcGFpci5cbiAqIEV2ZXJ5dGhpbmcgZG93bnN0cmVhbSB0cmVhdHMgdGhlIHJlc3VsdGluZyBpZGVudGl0eSBhcyBHaXRIdWIgKHRoZSBgZ2l0aHViOmAgcmVwb3NpdG9yeSBmaWVsZCBpcyByZXdyaXR0ZW5cbiAqIGludG8gcGFja2FnZS5qc29uKSwgc28gdGhlIGhvc3QgbXVzdCBiZSB2ZXJpZmllZCBmaXJzdDsgYSBub24tR2l0SHViIHJlbW90ZSB5aWVsZHMgbm8gaWRlbnRpdHksIGFzIGJlZm9yZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEdpdEh1YklkZW50aXR5KHVybDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdGFyZ2V0c0dpdEh1Yih1cmwpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmwpO1xuICByZXR1cm4gb3JnICYmIG5hbWUgPyBbY2Fub25pY2FsaXplT3duZXIob3JnKSwgbmFtZV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgVVJMJ3MgSE9TVCBpcyBnaXRodWIuY29tLiBQYXJzZWQgcmF0aGVyIHRoYW4gc3Vic3RyaW5nLW1hdGNoZWQ6IGEgcGF0aCBzdWNoIGFzXG4gKiBgaHR0cHM6Ly9naXRsYWIuY29tL2dpdGh1Yi5jb20vb3duZXIvcmVwby5naXRgIHdvdWxkIG90aGVyd2lzZSBiZSB0YWtlbiBmb3IgR2l0SHViLCBhbmQgYW4gdXBwZXJjYXNlXG4gKiBgR0lUSFVCLkNPTWAgd291bGQgYmUgcmVqZWN0ZWQuIGBnaXRodWI6b3duZXIvcmVwb2AgaXMgbnBtJ3Mgc2hvcnRoYW5kIGFuZCBuYW1lcyBubyBob3N0LCBzbyBpdCBpc1xuICogcmVjb2duaXplZCBzZXBhcmF0ZWx5OyBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24gYWNjZXB0cyB0aGUgc2FtZSBzaG9ydGhhbmQuXG4gKi9cbmZ1bmN0aW9uIHRhcmdldHNHaXRIdWIodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKC9eZ2l0aHViOi9pdS50ZXN0KHVybCkpIHJldHVybiB0cnVlO1xuICAvLyBzY3Atc3R5bGUgcmVtb3RlcyAoYGdpdEBnaXRodWIuY29tOm93bmVyL3JlcG8uZ2l0YCkgYXJlIG5vdCB2YWxpZCBVUkxzLlxuICBjb25zdCBzY3BIb3N0ID0gL15bXi9AXSpAKFteOi9dKyk6L3UuZXhlYyh1cmwpPy5bMV07XG4gIGlmIChzY3BIb3N0KSByZXR1cm4gc2NwSG9zdC50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsLnJlcGxhY2UoL15naXRcXCsvdSwgJycpKS5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdEh1YiBvd25lciBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgYW5kIGEgcmVtb3RlIG9yIG1hbmlmZXN0IFVSTCBtYXkgc3BlbGwgdGhlbSBhbnkgd2F5LCBidXQgdGhlIEFQSSdzXG4gKiBgZnVsbF9uYW1lYCBhbHdheXMgcmV0dXJuZWQgdGhlIGNhbm9uaWNhbCBzcGVsbGluZyDigJQgd2hpY2ggdGhlIG1hbnkgZXhhY3QgYD09PSAnV2lsbEJvb3N0ZXInYCBwb2xpY3kgY2hlY2tzXG4gKiAob3JnYW5pemF0aW9uIHdvcmtmbG93cywgYXV0aG9yIG1ldGFkYXRhLCB0aGUgV2lsbEJvb3N0ZXJMYWIgcHJlLXB1c2ggZ3VhcmQpIGRlcGVuZCBvbi4gQ2Fub25pY2FsaXplIGhlcmUgc29cbiAqIHRoZSBsb2NhbCBmYWxsYmFjayB5aWVsZHMgdGhlIHNhbWUgaWRlbnRpdHkgdGhlIEFQSSBkaWQsIGluc3RlYWQgb2Ygc2lsZW50bHkgc2tpcHBpbmcgdGhvc2UgcG9saWNpZXMuXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZU93bmVyKG93bmVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYW5vbmljYWxPd25lcnMgPSBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ107XG4gIHJldHVybiBjYW5vbmljYWxPd25lcnMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudG9Mb3dlckNhc2UoKSA9PT0gb3duZXIudG9Mb3dlckNhc2UoKSkgPz8gb3duZXI7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZXNXb3JrZXJUeXBlcyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgaGFzQ2xvdWRmbGFyZURlcGxveVdvcmtmbG93LCBpbnZva2VzV2JEZXBsb3kgfSBmcm9tICcuL3dvcmtmbG93LmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCByZWFkQWdlbnRzRXh0cmFDb250ZW50KHJvb3RDb25maWcuZGlyUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgdG9vbE5hbWVdIG9mIFtcbiAgICAgIFsnQUdFTlRTLm1kJywgJ0NvZGV4IENMSSddLFxuICAgICAgWydDTEFVREUubWQnLCAnQ2xhdWRlIENvZGUnXSxcbiAgICAgIFsnR0VNSU5JLm1kJywgJ0dlbWluaSBDTEknXSxcbiAgICBdIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHRvb2xOYW1lLCBleHRyYUNvbnRlbnQpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvclJ1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjJyk7XG4gICAgY29uc3QgY3Vyc29yUnVsZXNDb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChyb290Q29uZmlnLCBhbGxDb25maWdzLCBleHRyYUNvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGN1cnNvclJ1bGVzUGF0aCwgY3Vyc29yUnVsZXNDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG5cbi8qKlxuICogUmVhZHMgdGhlIHJvb3QncyB1c2VyLWF1dGhvcmVkIEFHRU5UU19FWFRSQS5tZCBvbmNlIHBlciBwcm9jZXNzOiB3YmZ5IG5ldmVyIHJld3JpdGVzIHRoZSBmaWxlLFxuICogYW5kIGJvdGggdGhlIGFnZW50LWluc3RydWN0aW9uIGFuZCBHZW1pbmkgZ2VuZXJhdG9ycyBuZWVkIGl0cyBjb250ZW50LiBDYWNoaW5nIHRoZSByZXNvbHZlZFxuICogdmFsdWUgKG5vdCB0aGUgUHJvbWlzZSkgaXMgcmFjZS1mcmVlIGJlY2F1c2UgdGhlIHR3byBjYWxsZXJzIHJ1biBzZXF1ZW50aWFsbHkgaW4gaW5kZXgudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQWdlbnRzRXh0cmFDb250ZW50KHJvb3REaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcbiAgaWYgKCFhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZS5oYXMoYWdlbnRzRXh0cmFQYXRoKSkge1xuICAgIGFnZW50c0V4dHJhQ29udGVudENhY2hlLnNldChhZ2VudHNFeHRyYVBhdGgsIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGFnZW50c0V4dHJhUGF0aCkpO1xuICB9XG4gIHJldHVybiBhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZS5nZXQoYWdlbnRzRXh0cmFQYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSAnYnVuJztcbiAgY29uc3QgZGVzY3JpcHRpb24gPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbjtcbiAgY29uc3QgZm5veEluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpXG4gICAgPyBgXFxuLSBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHNlY3JldHMgYXJlIG1hbmFnZWQgaW4gXFxgZm5veC50b21sXFxgIHZpYSBtaXNlICsgZm5veDsgcnVuIGNvbW1hbmRzIHRocm91Z2ggXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgLi4uXFxgIG9yIFxcYGZub3ggcnVuIC1QIDxwcm9maWxlPiAtLSA8Y29tbWFuZD5cXGAgaW5zdGVhZCBvZiBleHBlY3RpbmcgXFxgLmVudlxcYCBmaWxlcy4gTmV2ZXIgY3JlYXRlIGEgXFxgLmVudlxcYCwgXFxgLmVudi4qXFxgLCBvciBcXGAuZGV2LnZhcnNcXGAgZmlsZTogYWRkIHRoZSB2YXJpYWJsZSB0byBcXGBmbm94LnRvbWxcXGAgaW5zdGVhZC4gUHJvZmlsZSBzZWNyZXRzIGxvYWQgb25seSB3aGVuIGEgcHJvZmlsZSBpcyBzZWxlY3RlZDogbW9kZS1hd2FyZSB3YiBjb21tYW5kcyAoZS5nLiBcXGB3YiBzdGFydFxcYCwgXFxgd2IgdGVzdFxcYCkgYW5kIFxcYHdiIGRvdGVudlxcYCBzZWxlY3QgaXQgdGhlbXNlbHZlcyAoXFxgd2IgZG90ZW52XFxgIHVzZXMgXFxgV0JfRU5WXFxgLCBlbHNlIFxcYEZOT1hfUFJPRklMRVxcYCwgZWxzZSBcXGBOT0RFX0VOVlxcYCwgZWxzZSB0aGUgZGV2ZWxvcG1lbnQgcHJvZmlsZTsgXFxgV0JfRU5WXFxgIGFjY2VwdHMgb25seSBcXGBkZXZlbG9wbWVudFxcYC9cXGB0ZXN0XFxgL1xcYHN0YWdpbmdcXGAvXFxgcHJvZHVjdGlvblxcYCwgc28gdXNlIFxcYEZOT1hfUFJPRklMRVxcYCBmb3IgYW55IG90aGVyIHByb2ZpbGUpLCB3aGlsZSBiYXJlIFxcYGZub3ggcnVuXFxgIG5lZWRzIGFuIGV4cGxpY2l0IFxcYC1QIDxwcm9maWxlPlxcYC5gXG4gICAgOiAnJztcbiAgLy8gbWlzZSBvd25zIHRoZSBwaW5uZWQgdG9vbCB2ZXJzaW9ucywgc28gYSB2ZXJzaW9uIG1pc21hdGNoIGlzIGZpeGVkIGJ5IGVkaXRpbmcgbWlzZS50b21sIOKAlCBub3RcbiAgLy8gYnkgaW5zdGFsbGluZyBhIGRpZmZlcmVudCB2ZXJzaW9uIGdsb2JhbGx5LCB3aGljaCB0aGUgbmV4dCBgbWlzZSBpbnN0YWxsYCBzaWxlbnRseSBvdmVycmlkZXMuXG4gIGNvbnN0IG1pc2VJbnN0cnVjdGlvbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ21pc2UudG9tbCcpKVxuICAgID8gJ1xcbi0gVG9vbCB2ZXJzaW9ucyAoZS5nLiwgbm9kZSkgYXJlIHBpbm5lZCBpbiBgbWlzZS50b21sYDsgcnVuIGBtaXNlIGluc3RhbGxgIGFmdGVyIGNoYW5naW5nIGl0LCBhbmQgbmV2ZXIgaW5zdGFsbCB0aG9zZSB0b29scyBnbG9iYWxseSBpbnN0ZWFkLidcbiAgICA6ICcnO1xuICAvLyBJc29sYXRlZCBpbnN0YWxscyBhcmUgdGhlIG9yZyBzdGFuZGFyZCAod2JmeSBnZW5lcmF0ZXMgbm8gb3RoZXIgbGlua2VyKSBhbmQgdGhlIG1vc3RcbiAgLy8gYWdlbnQtaG9zdGlsZSBwYXJ0IG9mIHRoZSBzdGFjazogYSBwYWNrYWdlIHRoYXQgaXMgb25seSByZWFjaGFibGUgYmVjYXVzZSBhIGRlcGVuZGVuY3kgaG9pc3RlZFxuICAvLyBpdCBubyBsb25nZXIgcmVzb2x2ZXMsIGFuZCB0aGUgcmVmbGV4IGZpeCAoc3dpdGNoaW5nIHRoZSBsaW5rZXIgYmFjaykgc2lsZW50bHkgcmVpbnRyb2R1Y2VzXG4gIC8vIHRoZSBwaGFudG9tIGRlcGVuZGVuY2llcyB0aGUgbGF5b3V0IGV4aXN0cyB0byBjYXRjaC5cbiAgY29uc3QgaXNvbGF0ZWRJbnN0YWxsSW5zdHJ1Y3Rpb24gPSBgXFxuLSBcXGBidW5maWcudG9tbFxcYCB1c2VzIEJ1bidzIGlzb2xhdGVkIGxpbmtlciwgc28gb25seSBkZWNsYXJlZCBkZXBlbmRlbmNpZXMgcmVzb2x2ZS4gSWYgYW4gaW1wb3J0IGZhaWxzIHRvIHJlc29sdmUsIGRlY2xhcmUgdGhhdCBwYWNrYWdlIGluIHRoZSBcXGBwYWNrYWdlLmpzb25cXGAgdGhhdCBpbXBvcnRzIGl0OyBuZXZlciBzd2l0Y2ggXFxgbGlua2VyXFxgIHRvIFxcYGhvaXN0ZWRcXGAgb3IgYWRkIHRvIFxcYHB1YmxpY0hvaXN0UGF0dGVyblxcYCB0byB3b3JrIGFyb3VuZCBpdC5gO1xuICAvLyBFdmVyeSBjbGF1c2Ugc3RhdGVzIG9ubHkgYSB2ZXJpZmllZCBmYWN0LCByZXVzaW5nIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IncyBvd24gZGV0ZWN0b3JzOiB0aGVcbiAgLy8gd3JhbmdsZXItY29uZmlnIGNsYXVzZSBuZWVkcyBhbiBhY3R1YWwgY29uZmlnIGZpbGUgKGlzQ2xvdWRmbGFyZSBhbHNvIG1hdGNoZXMgYSBtZXJlIHdyYW5nbGVyXG4gIC8vIG1lbnRpb24gaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cpLCB0aGUgd29ya2Zsb3cgY2xhdXNlIG5lZWRzIGEgbGl2ZSByZXVzYWJsZS1kZXBsb3kgY2FsbGVyXG4gIC8vIChZQU1MLXBhcnNlZCBqb2JzLioudXNlcywgbm90IGEgcmF3LXRleHQvY29tbWVudCBtYXRjaCksIGFuZCB0aGUgYHdiIGRlcGxveWAgY2xhdXNlIG5lZWRzIGFcbiAgLy8gZGVwbG95IHNjcmlwdCB3aG9zZSBjb21tYW5kIHRva2VuIGlzIGB3YiDigKYgZGVwbG95YC5cbiAgY29uc3Qgb3duc1dyYW5nbGVyQ29uZmlnID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnKTtcbiAgLy8gT25seSBjbGFpbSB0aGUgZmlsZSBpcyBnZW5lcmF0ZWQgd2hlcmUgaXQgYWN0dWFsbHkgaXM6IGEgcGFja2FnZSB0aGF0IGhhbmQtbWFpbnRhaW5zIGl0cyBgRW52YCAoZS5nLiB1bmRlclxuICAvLyBgdHlwZXM6IFtcImJ1blwiXWApIGlzIGRlbGliZXJhdGVseSBsZWZ0IHVubWFuYWdlZCwgYW5kIHRlbGxpbmcgYW4gYWdlbnQgdG8gcnVuIGB3YiBnZW4tY29kZWAgdGhlcmUgd291bGQgc2VuZFxuICAvLyBpdCBhZnRlciBhIGZpbGUgdGhhdCBuZXZlciBhcHBlYXJzIOKAlCBhbmQgYXdheSBmcm9tIHRoZSBgRW52YCBpdCBzaG91bGQgYmUgZWRpdGluZy5cbiAgY29uc3Qgb3duc0dlbmVyYXRlZFdvcmtlclR5cGVzID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpO1xuICBjb25zdCBoYXNEZXBsb3lXb3JrZmxvdyA9IGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1Yi93b3JrZmxvd3MnKSk7XG4gIGNvbnN0IHVzZXNXYkRlcGxveSA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiB7XG4gICAgY29uc3QgZGVwbG95U2NyaXB0ID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5bJ2RlcGxveSddO1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgZGVwbG95U2NyaXB0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdCwgbmV3IFNldChPYmplY3Qua2V5cyhjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge30pKSlcbiAgICApO1xuICB9KTtcbiAgLy8gSW5kZXBlbmRlbnQgZmFjdHMgc3RheSBzZXBhcmF0ZSBzZW50ZW5jZXM6IHRoZSB3b3JrZmxvdydzIG93biBkZXBsb3kgbWVjaGFuaXNtIGlzIG5vdFxuICAvLyBpbnNwZWN0ZWQsIHNvIHRoZSB3Yi1kZXBsb3kgY2xhdXNlIG11c3Qgbm90IGNsYWltIHRoZSB3b3JrZmxvdyBpbnZva2VzIGl0LlxuICBjb25zdCBjbG91ZGZsYXJlSW5zdHJ1Y3Rpb24gPSBvd25zV3JhbmdsZXJDb25maWdcbiAgICA/IGBcXG4tIFRoaXMgcHJvamVjdCBydW5zIG9uIENsb3VkZmxhcmUgV29ya2VyczogdGhlIHdyYW5nbGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBob2xkcyB0aGUgV29ya2VyJ3MgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIGFueSBiaW5kaW5ncyBhbmQgcGVyLWVudmlyb25tZW50IG92ZXJyaWRlcy4ke2hhc0RlcGxveVdvcmtmbG93ID8gJyBUaGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgIHBlcmZvcm0gZGVwbG95bWVudHMuJyA6ICcnfSR7dXNlc1diRGVwbG95ID8gJyBUaGUgYGRlcGxveWAgcGFja2FnZSBzY3JpcHQgcnVucyBgd2IgZGVwbG95YC4nIDogJyd9JHtvd25zR2VuZXJhdGVkV29ya2VyVHlwZXMgPyBgXFxuLSBcXGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXFxgIGlzIGdlbmVyYXRlZCBieSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBnZW4tY29kZVxcYCBhbmQgaXMgZ2l0aWdub3JlZDsgYWZ0ZXIgY2hhbmdpbmcgYmluZGluZ3Mgb3IgdmFycyBpbiB0aGUgd3JhbmdsZXIgY29uZmlndXJhdGlvbiwgcmUtcnVuIGl0IGluc3RlYWQgb2YgZWRpdGluZyB0aGF0IGZpbGUgYnkgaGFuZC5gIDogJyd9YFxuICAgIDogJyc7XG4gIC8vIFdpbGxCb29zdGVyIFJhaWx3YXkgcHJvamVjdCBpZGVudGlmaWVycyBhcmUgbWFuYWdlZCBpbiBkZXBsb3kgd29ya2Zsb3cgc2V0dGluZ3MuXG4gIGNvbnN0IHJhaWx3YXlJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNSYWlsd2F5XG4gICAgPyAnXFxuLSBSYWlsd2F5IHByb2plY3QgaW5mb3JtYXRpb24gaXMgaW4gdGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYC4nXG4gICAgOiAnJztcbiAgY29uc3QgcGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbiA9IGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGFsbENvbmZpZ3MpXG4gICAgPyBgXFxuLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJyc7XG4gIGNvbnN0IGNvQXV0aG9ySW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuICAtIEVuZCB5b3VyIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBibGFuayBsaW5lIGZvbGxvd2VkIGJ5IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgLmBcbiAgICA6ICcnO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IHJvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKSk7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cHJvamVjdE5hbWV9XFxgJHtkZXNjcmlwdGlvbiA/IGBcXG4tIERlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWAgOiAnJ31cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIElmIG9uIFxcYG1haW5cXGAsIGNyZWF0ZSBhIG5ldyBicmFuY2g7IG90aGVyd2lzZSB3b3JrIG9uIHRoZSBjdXJyZW50IGJyYW5jaC5cbi0gUnVuIFxcYGdpdFxcYCBjb21tYW5kcyBvbmUgYXQgYSB0aW1lIHRvIGF2b2lkIFxcYGluZGV4LmxvY2tcXGAgY29uZmxpY3RzLlxuLSBXcml0ZSBhIHRlc3Qgb25seSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBvciB3aGVuIGEgYmVoYXZpb3IgaXMgYm90aCBsaWtlbHkgdG8gcmVncmVzcyBBTkQgaGFzIG5vIG90aGVyIGF1dG9tYXRpYyBzYWZlZ3VhcmQgKHR5cGUgY2hlY2tpbmcsIGxpbnRpbmcsIG9yIGFuIGV4aXN0aW5nIHRlc3QvQ0kgY2hlY2sgd291bGQgbm90IGNhdGNoIHRoZSBicmVha2FnZSkuIFNraXAgdGhlIHRlc3Qgd2hlbiBhbiBleGlzdGluZyBzaWduYWwgYWxyZWFkeSBjYXRjaGVzIHRoZSByZWdyZXNzaW9uLCB3aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBtZXJlbHkgbWFwcyBjb25kaXRpb25zIHRvIGNvbnN0YW50IG91dHB1dHMgc28gYSB0ZXN0IHdvdWxkIHJlc3RhdGUgdGhhdCBtYXBwaW5nIGFuZCBmYWlsIG9ubHkgb24gaW50ZW50aW9uYWwgZWRpdHMgKGEgY2hhbmdlIGRldGVjdG9yKSwgb3Igd2hlbiB5b3UgYXJlIG9ubHkgY29uZmlybWluZyBhbiBleHRlcm5hbCBmYWN0IChhIGxpYnJhcnkncyBiZWhhdmlvciwgd2hldGhlciBhIHZlcnNpb24gZml4ZXMgYW4gaXNzdWUpOyB2ZXJpZnkgdGhlIGxhdHRlciB0d28gb25jZSBtYW51YWxseSBpbnN0ZWFkIG9mIGFkZGluZyBhIHBlcm1hbmVudCB0ZXN0LlxuLSBXaGVuIHdyaXRpbmcgdGVzdHMsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBUZXN0IGV4dGVybmFsbHkgb2JzZXJ2YWJsZSBiZWhhdmlvciAoZS5nLiwgZW1pdHRlZCBmaWxlcywgQ0xJIG91dHB1dCwgcmVuZGVyZWQgcmVzdWx0cykgYXQgdGhlIHN5c3RlbSBib3VuZGFyeSwgbm90IGltcGxlbWVudGF0aW9uIGRldGFpbHM6IGRvIG5vdCBtaXJyb3IgcHJvZHVjdGlvbiBsb2dpYywgYXNzZXJ0IHRoYXQgYSBicmFuY2ggaXMgdGFrZW4sIG9yIGZlZWQgaGFuZC1hc3NlbWJsZWQgaW50ZXJuYWwgb2JqZWN0cyB0byBpbnRlcm5hbCBmdW5jdGlvbnMuXG4gIC0gUHJlZmVyIGFjdHVhbCBBUEkgY2FsbHMgb3ZlciBtb2NrcywgdW5sZXNzIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIG1vY2tzIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBFbnN1cmUgdGVzdHMgYXJlIGlkZW1wb3RlbnQgYW5kIGluZGVwZW5kZW50IChlLmcuLCByZXNldCBwZXJzaXN0ZW50IGRhdGEpIHNvIHRoZXkgY2FuIHJ1biByZXBlYXRlZGx5IG9yIGluIHBhcmFsbGVsLlxuICAtIEF2b2lkIGZpeGVkIHdhaXRzIGluIEUyRSB0ZXN0czsgd2FpdCBmb3IgY29uZGl0aW9ucyBpbnN0ZWFkLlxuICAtIENvbnRpbnVlIG1vZGlmeWluZyB0ZXN0cyBhbmQvb3IgY29kZSB1bnRpbCBhbGwgdGVzdHMgcGFzcy5cbi0gV2hlbiBmaXhpbmcgaXNzdWVzIChpbmNsdWRpbmcgdGVzdCBmYWlsdXJlcyksIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCB2aWEgZGVidWcgbG9ncyBvciBzY3JlZW5zaG90cykgYW5kIGZpeCBpdCBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY2hhbmdlcywgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnlcXGAgKHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmc7IHRha2VzIHVwIHRvIDEwIG1pbnV0ZXMpLCBvciBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5LWZ1bGxcXGAgKGFsbCB0ZXN0czsgdGFrZXMgdXAgdG8gMSBob3VyKSBpZiB5b3UgY2hhbmdlZCBydW50aW1lIGJlaGF2aW9yIG9yIHRlc3RzLiBGaXggZXJyb3JzIGFuZCByZS1ydW4gdW50aWwgaXQgcGFzc2VzLlxuICAtIEFnZW50IHNoZWxscyBtYXkgdGVybWluYXRlIHRyYWNrZWQgY29tbWFuZHMgKGluY2x1ZGluZyBiYWNrZ3JvdW5kIG9uZXMpIGF0IHRpbWUgbGltaXRzLCBvZnRlbiBtaW51dGVzLCBzbyBydW4gY29tbWFuZHMgdGhhdCBjYW4gZXhjZWVkIHlvdXIgc2hlbGwtY2FsbCB0aW1lb3V0IChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5XFxgIGFuZCBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5LWZ1bGxcXGApIGRldGFjaGVkIHZpYSBub2h1cCwgZnJvbSBhIHNoZWxsIGNhbGwgdGhhdCByZXR1cm5zIGltbWVkaWF0ZWx5OiBcXGBta2RpciAtcCAudG1wOyBybSAtZiAudG1wL3ZlcmlmeS1mdWxsLmV4aXQ7IG5vaHVwIHNoIC1jICcke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5LWZ1bGw7IGVjaG8gJD8gPiAudG1wL3ZlcmlmeS1mdWxsLmV4aXQnID4gLnRtcC92ZXJpZnktZnVsbC5sb2cgMj4mMSAmXFxgICh0aGUgcmVkaXJlY3RzIGFyZSByZXF1aXJlZDogYW4gaW5oZXJpdGVkIHN0ZG91dC9zdGRlcnIgcGlwZSB3b3VsZCBrZWVwIHRoZSBjYWxsIHdhaXRpbmcpLiBQb2xsIGZyb20gc2VwYXJhdGUgY2FsbHMsIGVhY2ggc2hvcnRlciB0aGFuIHlvdXIgc2hlbGwtY2FsbCB0aW1lb3V0OiBcXGBmb3IgaSBpbiAxIDIgMzsgZG8gdGVzdCAtZiAudG1wL3ZlcmlmeS1mdWxsLmV4aXQgJiYgYnJlYWs7IHNsZWVwIDIwOyBkb25lOyBjYXQgLnRtcC92ZXJpZnktZnVsbC5leGl0IDI+L2Rldi9udWxsIHx8IGVjaG8gc3RpbGwgcnVubmluZ1xcYC4gUmVwZWF0IHVudGlsIHRoZSBleGl0IGZpbGUgYXBwZWFycyAoaXRzIGNvbnRlbnQgaXMgdGhlIGV4aXQgY29kZSksIHRoZW4gcmVhZCB0aGUgbG9nOyBpZiBpdCBuZXZlciBhcHBlYXJzIHdoaWxlIHRoZSBsb2cgc3RvcHMgZ3Jvd2luZywgdGhlIHJ1biBpdHNlbGYgZGllZC5cbi0gT25jZSB2ZXJpZmllZCwgY29tbWl0IGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCBhbmQgY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgYnJhbmNoLlxuICAtIEZvbGxvdyB0aGUgQ29udmVudGlvbmFsIENvbW1pdHMgZm9ybWF0IChlLmcuLCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCkuJHtjb0F1dGhvckluc3RydWN0aW9ufVxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHM7IGF2b2lkIFxcYC0tYW1lbmRcXGAuXG4tIEluIGFueSBleHBsYW5hdG9yeSB0ZXh0IChjb21taXQgbWVzc2FnZXMsIFBSIGRlc2NyaXB0aW9ucywgZG9jdW1lbnRhdGlvbiwgY29kZSBjb21tZW50cywgZXRjLiksIGRlc2NyaWJlIG9ubHkgd2hhdCBleGlzdHMgaW4gdGhlIGZpbmFsIHNuYXBzaG90OiBuZXZlciBtZW50aW9uIHN5bWJvbHMgb3IgY29uY2VwdHMgdGhhdCB3ZXJlIGFkZGVkIGFuZCBsYXRlciByZW1vdmVkIG9yIHJlbmFtZWQgYWxvbmcgdGhlIHdheSwgZXZlbiBpZiB0aGV5IG1hdHRlcmVkIGR1cmluZyB0aGUgd29yay4gSWYgeW91IGNhbm5vdCBjb25maXJtIHRoYXQgYW4gaWRlbnRpZmllciBvciBmZWF0dXJlIG5hbWUgeW91IGFyZSBhYm91dCB0byB3cml0ZSBleGlzdHMgaW4gdGhlIGZpbmFsIGRpZmYgb3IgdGhlIGN1cnJlbnQgY29kZWJhc2UsIGRyb3AgdGhhdCBzdGF0ZW1lbnQuXG4tIFVzZSBoZXJlZG9jIGZvciBtdWx0aS1saW5lIGNvbW1hbmQgaW5wdXQgKGUuZy4sIFxcYGdpdCBjb21taXQgLUYgLVxcYCwgXFxgZ2ggcHIgY3JlYXRlIC0tYm9keS1maWxlIC1cXGApLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIFxcYC50bXBcXGA7IHVzZSBcXGAvdG1wXFxgIG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBsaXZlIG91dHNpZGUgdGhlIHJlcG8uJHttaXNlSW5zdHJ1Y3Rpb259JHtpc29sYXRlZEluc3RhbGxJbnN0cnVjdGlvbn0ke2Zub3hJbnN0cnVjdGlvbn0ke2Nsb3VkZmxhcmVJbnN0cnVjdGlvbn0ke3JhaWx3YXlJbnN0cnVjdGlvbn0ke3BsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb259XG5cbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWcsIGFsbENvbmZpZ3MpfVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgaGFzTmV3U2VjdGlvbiA9IGV4dHJhQ29udGVudD8udHJpbSgpLnN0YXJ0c1dpdGgoJyMnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudFxuICAgID8gaGFzTmV3U2VjdGlvblxuICAgICAgPyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKClcbiAgICAgIDogJ1xcbicgKyBleHRyYUNvbnRlbnRcbiAgICA6ICcnO1xuICByZXR1cm4gYmFzZUNvbnRlbnQgKyBub3JtYWxpemVkRXh0cmFDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIC8vIFRhdXJpIGRlc2t0b3AgYXBwcyBzaGlwIFdpbmRvd3MgYnVpbGRzLCBhbmQgdGhlIGJvdW5kYXJ5IGJldHdlZW4gYXBwIGNvZGUgYW5kIHNoYXJlZCBjb2RlIGlzXG4gIC8vIHRvbyBmdXp6eSB0byBzY29wZSB0aGUgbWFjT1MvTGludXgtb25seSBydWxlIHBlciBwYWNrYWdlLCBzbyBzdWNoIHJlcG9zaXRvcmllcyB0YXJnZXQgYWxsXG4gIC8vIHRocmVlIE9TZXMgaW5zdGVhZC5cbiAgY29uc3QgaGFzRGVza3RvcEFwcCA9IGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcudGF1cmkgfHwgYy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcyk7XG4gIC8vIEEgcHVibGljIHJlcG9zaXRvcnkgd2l0aCBubyBgQHdpbGxib29zdGVyL2AgcGFja2FnZSBpcyBPU1MgZm9yIHRoZSBnZW5lcmFsIHB1YmxpYywgd2hvc2UgdXNlcnNcbiAgLy8gbWF5IHJ1biBXaW5kb3dzLCBzbyBubyBPUyByZXN0cmljdGlvbiBhcHBsaWVzIHRoZXJlLiBBbiB1bmtub3duIHZpc2liaWxpdHkgY29sbGFwc2VzIHRvXG4gIC8vIGlzUHVibGljUmVwbz1mYWxzZSBhbmQgdGhlcmVmb3JlIGtlZXBzIHRoZSByZXN0cmljdGl2ZSBkZWZhdWx0LlxuICBjb25zdCBpc0dlbmVyYWxQdWJsaWNPc3MgPVxuICAgIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvICYmIGFsbENvbmZpZ3MuZXZlcnkoKGMpID0+ICFjLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpO1xuICBjb25zdCBvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbiA9IGlzR2VuZXJhbFB1YmxpY09zc1xuICAgID8gJydcbiAgICA6IGhhc0Rlc2t0b3BBcHBcbiAgICAgID8gJy0gRW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5kb3dzLCBtYWNPUywgYW5kIExpbnV4LidcbiAgICAgIDogJy0gRW5zdXJlIGNvbXBhdGliaWxpdHkgb25seSB3aXRoIG1hY09TIGFuZCBMaW51eDsgZG8gbm90IGluY2x1ZGUgV2luZG93cy1zcGVjaWZpYyBjb2RlLic7XG4gIC8vIENsb3VkZmxhcmUgV29ya2VycyBleGVjdXRlIGFjcm9zcyBtYW55IGVwaGVtZXJhbCBpc29sYXRlcyBhbmQgdHdvIHJlcXVlc3RzIGFyZSBub3QgZ3VhcmFudGVlZFxuICAvLyB0byBoaXQgdGhlIHNhbWUgaW5zdGFuY2UsIHNvIHRoZSBzaW5nbGUtaW5zdGFuY2Ugc2ltcGxpZmljYXRpb24gc2lsZW50bHkgbG9zZXMgc3RhdGUgdGhlcmUg4oCUXG4gIC8vIGJ1dCBXb3JrZXJzIGRlbGliZXJhdGVseSByZXVzZSBleGVjdXRpb24gY29udGV4dHMsIHNvIGJlc3QtZWZmb3J0IGlzb2xhdGUtbG9jYWwgY2FjaGVzIHN0YXlcbiAgLy8gbGVnaXRpbWF0ZSAoaHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL3dvcmtlcnMvcmVmZXJlbmNlL2hvdy13b3JrZXJzLXdvcmtzLykuIFRoZVxuICAvLyBzaWduYWxzIGFyZSBjb3JyZWxhdGVkIFBFUiBQQUNLQUdFOiBhIG1vbm9yZXBvIGNhbiBob3N0IGEgc2luZ2xlLWluc3RhbmNlIHNlcnZlciBhcHAgbmV4dCB0b1xuICAvLyBhbiB1bnJlbGF0ZWQgV29ya2VyLCBhbmQgbmVpdGhlciBtYXkgb3ZlcnJpZGUgdGhlIG90aGVyJ3MgcnVsZS4gZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyBpc1xuICAvLyB0aGUgYWNjdXJhdGUgV29ya2VycyBzaWduYWwgKGlzQ2xvdWRmbGFyZSBhbHNvIG1hdGNoZXMgYSBtZXJlIHdyYW5nbGVyIG1lbnRpb24gaW4gYSBzY3JpcHQgb3JcbiAgLy8gd29ya2Zsb3cpLlxuICBjb25zdCBoYXNXb3JrZXJzQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcpO1xuICBjb25zdCBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcCA9IGFsbENvbmZpZ3Muc29tZShcbiAgICAoYykgPT4gKGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KSAmJiAhYy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnXG4gICk7XG4gIGNvbnN0IHdvcmtlcnNJbnN0cnVjdGlvbiA9XG4gICAgJy0gQ2xvdWRmbGFyZSBXb3JrZXJzIHJ1biBhY3Jvc3MgbXVsdGlwbGUgZXBoZW1lcmFsIGlzb2xhdGVzIGFuZCB0d28gcmVxdWVzdHMgbWF5IGhpdCBkaWZmZXJlbnQgaW5zdGFuY2VzOiBuZXZlciBsZXQgY29ycmVjdG5lc3MgZGVwZW5kIG9uIG1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlOyBwZXJzaXN0IGF1dGhvcml0YXRpdmUgc2hhcmVkIHN0YXRlIGluIGJpbmRpbmdzIChEMSwgS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMpLiBCZXN0LWVmZm9ydCBpc29sYXRlLWxvY2FsIGNhY2hlcyBvZiBub24tcmVxdWVzdC1zY29wZWQgZGF0YSBhcmUgZmluZS4nO1xuICBjb25zdCBzZXJ2ZXJJbnN0YW5jZUluc3RydWN0aW9uID0gaGFzV29ya2Vyc0FwcFxuICAgID8gaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gYCR7d29ya2Vyc0luc3RydWN0aW9ufSBUaGlzIGFwcGxpZXMgdG8gYWxsIGNvZGUgdGhhdCBydW5zIG9uIENsb3VkZmxhcmUgV29ya2VycyAodGhlIHdyYW5nbGVyLWNvbmZpZ3VyZWQgcGFja2FnZXMgYW5kIGFueSB3b3Jrc3BhY2UgcGFja2FnZSB0aGV5IGltcG9ydCk7IGFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UgZm9yIHRoZSBvdGhlciBzZXJ2ZXIgYXBwcy5gXG4gICAgICA6IHdvcmtlcnNJbnN0cnVjdGlvblxuICAgIDogaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gJy0gQXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS4nXG4gICAgICA6ICcnO1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmaWxlIG5hbWVzIGZvciBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgKFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBtb2R1bGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoIGhpZ2ggY29oZXNpb24gYW5kIGxvdyBjb3VwbGluZzsgc3BsaXQgbGFyZ2UgbW9kdWxlcyB3aGVuIG5lZWRlZC5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgKHRvcC1kb3duIG9yZGVyKTsgcGxhY2UgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGFib3ZlIHRoZWlyIHVzYWdlLlxuLSBXcml0ZSBjb21tZW50cyBhbmQgSlNEb2Mgb25seSBmb3IgaGFyZC10by11bmRlcnN0YW5kIGNvZGU6IGV4cGxhaW4gXCJ3aHlcIiBpbiBjb21tZW50cyBhbmQgXCJ3aGF0XCIgaW4gSlNEb2MuXG4tIE5ldmVyIGV4cGxhaW4gaG93IFdpbGxCb29zdGVyJ3MgaW4taG91c2UgdG9vbHMgKGUuZy4sIFxcYHdiXFxgLCBcXGB3YmZ5XFxgKSB3b3JrIGluIGNvZGUgY29tbWVudHMgb3IgZG9jdW1lbnRzIG91dHNpZGUgdGhlIHRvb2wncyBvd24gcGFja2FnZSwgZXhjZXB0IGluIGluc3RydWN0aW9ucyBmb3IgQUkgYWdlbnRzOyBlLmcuLCBkbyBub3Qgbm90ZSB0aGF0IFxcYFBPUlRcXGAgaXMgdW5zZXQgYmVjYXVzZSBcXGB3YlxcYCBwaWNrcyBhIGZyZWUgcG9ydC5cbi0gSWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLCB1c2UgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gV2hlbiB2YWxpZGF0aW5nIEphdmFTY3JpcHQgb2JqZWN0cyAoZS5nLiwgcGFyc2VkIEpTT04sIEFQSSByZXNwb25zZXMpLCBhbHdheXMgdXNlIFxcYHpvZFxcYCBpZiBwb3NzaWJsZSBpbnN0ZWFkIG9mIGhhbmQtd3JpdHRlbiBjaGVja3Mgb3IgdHlwZSBhc3NlcnRpb25zLlxuLSBCdWlsZCBwcm9tcHRzIGFzIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgb24gYSBwcmUtY29tcHV0YWJsZSBhcnJheSBvZiBzdHJpbmdzLlxuLSBBc3N1bWUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZDsgaWYgdmFsaWRhdGlvbiBpcyBuZWVkZWQsIFxcYGFzc2VydFxcYCBhdCBzdGFydHVwIHRvIGZhaWwgZmFzdC5cbi0gQXNzdW1lIGxvY2FsIHRvb2xzIHN1Y2ggYXMgXFxgZ2l0XFxgLCBcXGBnaFxcYCwgYW5kIFxcYGdocVxcYCBhcmUgaW5zdGFsbGVkIGFuZCBhdXRoZW50aWNhdGVkLlxuJHtvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gV2hlbiBhZGRpbmcgc3RyaW5nIGxpdGVyYWxzIGluIFJlYWN0IGNvbXBvbmVudHMsIHJlZ2lzdGVyIHRoZW0gaW4gdGhlIFxcYGkxOG5cXGAgcmVzb3VyY2UgZmlsZXMgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkgYW5kIHJlZmVyZW5jZSB0aGVtIHZpYSB0aGUgXFxgaTE4blxcYCB1dGlsaXR5IChlLmcuLCBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgKS5gXG4gICAgOiAnJ1xufVxuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIG92ZXIgXFxgdXNlU3RhdGVcXGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbi0gVXNlIFxcYGF1dG9Gb2N1c1xcYCB3aGVyZSBpdCByZWR1Y2VzIHVzZXIgZWZmb3J0LmBcbiAgICA6ICcnXG59XG4ke1xuICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIGN1cnJlbnQgd2ViLWFwcCBmcmFtZXdvcmsgYW5kIGVuYWJsZXMgdGhlIFJlYWN0IENvbXBpbGVyIGp1c3QgYXMgTmV4dC5qc1xuICAvLyBkb2VzLCBzbyBpdCBtdXN0IG5vdCBtaXNzIHRoaXMgcnVsZS5cbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/IGBcbi0gVGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCBzbyBcXGB1c2VDYWxsYmFja1xcYCBhbmQgXFxgdXNlTWVtb1xcYCBhcmUgdW5uZWNlc3NhcnkgZm9yIHBlcmZvcm1hbmNlLlxuYFxuICAgIDogJydcbn1cbiR7c2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KTtcbn1cbiIsIiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCByZWxlYXNlQWdlR2F0ZSBmcm9tICcuLi8uLi9jb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgICBnbG9iYWxTdG9yZT86IGJvb2xlYW47XG4gICAgbGlua2VyPzogc3RyaW5nO1xuICB9O1xufVxuXG4vLyBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gaXMgdGhlIG9yZ2FuaXphdGlvbidzIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBwb2xpY3k6IHRoZVxuLy8gbWFjaGluZXMnIGdsb2JhbCBjb25maWdzIGdldCBpdCB0aHJvdWdoIGNvbmZpZ3MvYXBwbHlSZWxlYXNlQWdlR2F0ZS5zaCAocnVuIGJ5IHdiZnkgaXRzZWxmLCBieVxuLy8gcmV1c2FibGUtd29ya2Zsb3dzIG9uIENJLCBhbmQgYnkgc2VsZi1ob3N0LXV0aWxzIG9uIHRoZSBydW5uZXJzKSwgYW5kIHJlcG9zaXRvcmllcyBnZXQgaXQgaGVyZS5cbi8vIE9ubHkgb3VyIG93biBwYWNrYWdlcyBhcmUgZXhlbXB0OiB3ZSBjb250cm9sIHdobyBwdWJsaXNoZXMgdGhlbSwgc28gYSBjb21wcm9taXNlZCByZWxlYXNlIGNhbm5vdFxuLy8gcmVhY2ggdXMgdGhyb3VnaCBhbiB1cHN0cmVhbSBtYWludGFpbmVyJ3Mgc3RvbGVuIGNyZWRlbnRpYWxzLiBUaGF0IGNvdmVycyBldmVyeVxuLy8gQHdpbGxib29zdGVyLXByaXZhdGUgcGFja2FnZSAodGhlIHNjb3BlIHJlc29sdmVzIG9ubHkgZnJvbSBvdXIgb3duIHJlZ2lzdHJ5KSwgYnV0IGJ1biwgbnBtLCBhbmRcbi8vIFlhcm4gbWF0Y2ggZXhjbHVkZSBlbnRyaWVzIGJ5IGV4YWN0IG5hbWUg4oCUIG5vIEBzY29wZS8qIHBhdHRlcm5zIOKAlCBzbyBlYWNoIG5ldyBwYWNrYWdlIGluIHRoZVxuLy8gc2NvcGUgbXVzdCBiZSBhZGRlZCB0byBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gd2hlbiBpdCBpcyBmaXJzdCBwdWJsaXNoZWQuIFRoaXJkLXBhcnR5XG4vLyBwYWNrYWdlcyDigJQgaW5jbHVkaW5nXG4vLyB0b29saW5nIHdiZnkgcGlucyBpdHNlbGYg4oCUIHN0YXkgYWdlLWdhdGVkOyBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uIGluIHBhY2thZ2VKc29uLnRzXG4vLyBwaW5zIHRoZSBuZXdlc3QgcmVsZWFzZSBvbGQgZW5vdWdoIHRvIHBhc3MgdGhlIGdhdGUsIHNvIHBpbm5pbmcga2VlcHMgd29ya2luZyB3aXRob3V0IGFuIGV4ZW1wdGlvbi5cbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgPSByZWxlYXNlQWdlR2F0ZS5kYXlzICogMjQgKiA2MCAqIDYwO1xuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSByZWxlYXNlQWdlR2F0ZS5leGNsdWRlcztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRCdW5HbG9iYWxTdG9yZShyb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHBhcnNlQnVuZmlnVG9tbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpPy5pbnN0YWxsPy5nbG9iYWxTdG9yZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5HbG9iYWxTdG9yZShcbiAgY29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBza2lwRGVwczogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSA9IHNob3VsZFVzZUJ1bkdsb2JhbFN0b3JlKGNvbmZpZ3MpO1xuICByZXR1cm4gc2tpcERlcHMgPyAocHJldmlvdXNHbG9iYWxTdG9yZSA/PyBkZWZhdWx0VXNlR2xvYmFsU3RvcmUpIDogZGVmYXVsdFVzZUdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIC8vIEJsaXR6IGJ1aWxkcyBvbiBOZXh0LmpzIGJ1dCBuZWVkIG5vdCBkZWNsYXJlIGl0IGRpcmVjdGx5LCBhbmQgaXRzIGNvZGVnZW4gYWxzbyBwYXRjaGVzIE5leHRcbiAgLy8gaW5zaWRlIG5vZGVfbW9kdWxlcy4gQm90aCBmcmFtZXdvcmtzIHRoZXJlZm9yZSByZXF1aXJlIHByb2plY3QtbG9jYWwgaXNvbGF0ZWQgaW5zdGFsbHMuXG4gIC8vIFNsaWRldiBsb2FkcyBvcHRpb25hbCBWdWUgY29tcGlsZXIgcGVlcnMgdGhyb3VnaCBsb2NhbC1wa2cuIFRoZSBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzXG4gIC8vIGxvY2FsLXBrZyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBzbyBOb2RlIGNhbm5vdCByZXNvbHZlIGEgY29tcGlsZXIgZGVjbGFyZWQgYnkgdGhlIHByb2plY3QuXG4gIHJldHVybiAhY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuc2xpZGV2KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcsIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIC8vIG1pbmltdW1SZWxlYXNlQWdlIGFuZCBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIGFyZSBvcmcgcG9saWN5LCBuZXZlciByZXBvc2l0b3J5IHBvbGljeTogYm90aFxuICAvLyBhcmUgcmV3cml0dGVuIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbidzIHZhbHVlcyBvbiBldmVyeSBydW4sIHNvIGEgaGFuZC1lZGl0ZWQgKHdlYWtlbmVkKVxuICAvLyBnYXRlIGNhbm5vdCBzdXJ2aXZlIHJlZ2VuZXJhdGlvbi4gRHJvcHBpbmcgcmVwb3NpdG9yeS1zcGVjaWZpYyBleGNsdWRlIGVudHJpZXMgaXMgZmFpbC1zYWZlIOKAlCBhblxuICAvLyB1bmNvdmVyZWQgcGFja2FnZSBiZWNvbWVzIGFnZS1nYXRlZCBhbmQgc3VyZmFjZXMgYXQgaW5zdGFsbCB0aW1lIGluc3RlYWQgb2Ygd2Vha2VuaW5nIHRoZSBnYXRlLlxuICAvLyBUdXJib3BhY2sgcmVqZWN0cyBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVjYXVzZSB0aGV5IHJlc29sdmUgb3V0c2lkZSBpdHMgZmlsZXN5c3RlbSByb290LlxuICAvLyBLZWVwaW5nIE5leHQuanMgaW5zdGFsbHMgcHJvamVjdC1sb2NhbCBhdm9pZHMgd2lkZW5pbmcgdGhhdCByb290IHRvICRIT01FIChvciBgL2AgaW4gRG9ja2VyKSxcbiAgLy8gd2hpY2ggd291bGQgZXhwYW5kIGRldmVsb3BtZW50IGZpbGVzeXN0ZW0gd2F0Y2hpbmcgYW5kIGJ5cGFzcyB0aGUgYm91bmRhcnkncyBjYWNoZSBiZW5lZml0cy5cbiAgY29uc3QgZ2xvYmFsU3RvcmVMaW5lID0gdXNlR2xvYmFsU3RvcmUgPyAnZ2xvYmFsU3RvcmUgPSB0cnVlJyA6ICdnbG9iYWxTdG9yZSA9IGZhbHNlJztcbiAgLy8gTm8gYFtydW5dIGJ1biA9IHRydWVgOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrc1xuICAvLyB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KTsgYW55IGV4aXN0aW5nIHNldHRpbmcgaXMgZHJvcHBlZC5cbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIOKAlCB0c3g6IGJ1aWxkLXRzIHVuZGVyIE5vZGUuanMgc3Bhd25zIGBub2RlIC0taW1wb3J0IHRzeGAsIHdoaWNoIHJlc29sdmVzXG4gIC8vIHRzeCBmcm9tIHRoZSBjb25zdW1lciBwYWNrYWdlJ3MgZGlyZWN0b3J5LCBub3QgZnJvbSBidWlsZC10cydzIG93biBkZXBlbmRlbmNpZXMuXG4gIC8vIHVuZGljaS10eXBlczogYnVuLXR5cGVzIHJlZmVyZW5jZXMgaXQgd2l0aG91dCBkZWNsYXJpbmcgaXQgYXMgYSBkZXBlbmRlbmN5IChvdmVuLXNoL2J1biMyMjgwNSk7XG4gIC8vIGdlbmVyYXRlZCB0c2NvbmZpZ3MgYWxzbyBtYXAgdW5kaWNpLXR5cGVzIHRvIHRoZSBob2lzdGVkIGNvcHkgKHNlZSB0c2NvbmZpZy50cykgYmVjYXVzZSB0aGVcbiAgLy8gZ2xvYmFsIHN0b3JlIHJlYWxwYXRocyBidW4tdHlwZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGV4aXN0aW5nQ29udGVudCl9W2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbiR7Z2xvYmFsU3RvcmVMaW5lfVxubGlua2VyID0gXCJpc29sYXRlZFwiXG5wdWJsaWNIb2lzdFBhdHRlcm4gPSBbXCJ0c3hcIiwgXCJ1bmRpY2ktdHlwZXNcIl1cbm1pbmltdW1SZWxlYXNlQWdlID0gJHtidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHN9XG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHtidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbi8qKlxuICogUHJlc2VydmUgdGhlIHByb2plY3QncyBgW3Rlc3RdYCBzZWN0aW9ucyAoZS5nLiBwcmVsb2FkIHNjcmlwdHMgc3dhcHBpbmcgYSBDbG91ZGZsYXJlIEQxIGNsaWVudFxuICogZm9yIGEgbG9jYWwgU1FMaXRlIG9uZSkgdmVyYmF0aW0sIGNvbW1lbnRzIGluY2x1ZGVkOyB3YmZ5IG1hbmFnZXMgb25seSB0aGUgb3RoZXIgc2VjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghY29udGVudCkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IHByZXNlcnZlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5UZXN0U2VjdGlvbiA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBzZWN0aW9uTWF0Y2ggPSAvXlxccypcXFsoW15cXF1dKylcXF0vLmV4ZWMobGluZSk7XG4gICAgaWYgKHNlY3Rpb25NYXRjaCkge1xuICAgICAgaW5UZXN0U2VjdGlvbiA9IHNlY3Rpb25NYXRjaFsxXSA9PT0gJ3Rlc3QnIHx8IChzZWN0aW9uTWF0Y2hbMV0gYXMgc3RyaW5nKS5zdGFydHNXaXRoKCd0ZXN0LicpO1xuICAgIH1cbiAgICBpZiAoaW5UZXN0U2VjdGlvbiAmJiBsaW5lLnRyaW0oKSkge1xuICAgICAgcHJlc2VydmVkTGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByZXNlcnZlZExpbmVzLmxlbmd0aCA+IDAgPyBgJHtwcmVzZXJ2ZWRMaW5lcy5qb2luKCdcXG4nKX1cXG5cXG5gIDogJyc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGUgZGVwbG95cyBHaXQtYmFzZWQgcHJpdmF0ZSBwYWNrYWdlcyBmcm9tIG5vZGVfbW9kdWxlcywgYnV0IHRoZSBEb2NrZXIgY29udGV4dCBzaG91bGQgc3RheSBuYXJyb3cuXG5jb25zdCBpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnMgPSBbJ0B3aWxsYm9vc3RlciddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuLmVudipcbioqLy5EU19TdG9yZVxuKiovLmNhY2hlXG4qKi8uY2xhdWRlXG4qKi8uY3Vyc29yXG4qKi8uZWRpdG9yY29uZmlnXG4qKi8uZXNsaW50Y2FjaGVcbioqLy5nZW1pbmlcbioqLy5naXRcbioqLy5naXRhdHRyaWJ1dGVzXG4qKi8uZ2l0aHViXG4qKi8uZ2l0aWdub3JlXG4qKi8uaWRlYVxuKiovLmxlZnRob29rXG4qKi8ubXlweV9jYWNoZVxuKiovLm5leHQvY2FjaGVcbioqLy5ucG1cbioqLy5wYXJjZWwtY2FjaGVcbioqLy5wbnBtLXN0b3JlXG4qKi8ucHl0ZXN0X2NhY2hlXG4qKi8ucmFpbHdheWlnbm9yZVxuKiovLnJlbGVhc2VyYy5qc29uXG4qKi8ucnVmZl9jYWNoZVxuKiovLnRtcFxuKiovLnRtcC0qLyoqXG4qKi8udHVyYm9cbioqLy50b3hcbioqLy52c2NvZGVcbioqLy55YXJuL2NhY2hlXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuKiovX19weWNhY2hlX19cbioqLyoubG9nXG4qKi8qLnB5Y1xuKiovKi50c2J1aWxkaW5mb1xuKiovY292ZXJhZ2VcbioqL25vZGVfbW9kdWxlcy8qKlxuJHtpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnNcbiAgLm1hcChcbiAgICAocGF0dGVybikgPT4gYCEqKi9ub2RlX21vZHVsZXMvJHtwYXR0ZXJufVxuISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59LyoqYFxuICApXG4gIC5qb2luKCdcXG4nKX1cbioqL25vZGVfbW9kdWxlcy8uY2FjaGVcbioqL3BsYXl3cmlnaHQtcmVwb3J0XG4qKi9zdG9yeWJvb2stc3RhdGljXG4qKi90YXJnZXRcbioqL3Rlc3QtcmVzdWx0c1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlLCByZWFkQWdlbnRzRXh0cmFDb250ZW50IH0gZnJvbSAnLi9hZ2VudHMuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnlhbWwnKTtcbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuXG4gICAgY29uc3QgaGFzTm9uQ2Fub25pY2FsQ29uZmlnID0gISEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQobm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KSk7XG4gICAgaWYgKGhhc05vbkNhbm9uaWNhbENvbmZpZykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgU2tpcHBlZCBnZW5lcmF0aW5nICR7Y29uZmlnRmlsZVBhdGh9IGJlY2F1c2UgJHtub25DYW5vbmljYWxDb25maWdGaWxlUGF0aH0gaXMgbm90IGEgc3VwcG9ydGVkIEdlbWluaSBjb25maWcgbG9jYXRpb24uIFJlbmFtZSBpdCBtYW51YWxseS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0Q29uZmlnKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gaGFzTm9uQ2Fub25pY2FsQ29uZmlnID8gdW5kZWZpbmVkIDogYXdhaXQgZnNVdGlsLnJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhjb25maWdGaWxlUGF0aCk7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb2xkQ29uZmlnID0gQnVuLllBTUwucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICAgIC8vIE1lcmdlIG9ubHkgYSBtYXBwaW5nOiBlbXB0eSwgY29tbWVudC1vbmx5LCBvciBzY2FsYXIgWUFNTCB3b3VsZCBlaXRoZXIgdGhyb3cgaW5cbiAgICAgICAgLy8gbWVyZ2UuYWxsIG9yIHBvbGx1dGUgdGhlIGNvbmZpZyB3aXRoIGluZGV4IGtleXMuXG4gICAgICAgIGlmIChvbGRDb25maWcgJiYgdHlwZW9mIG9sZENvbmZpZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2xkQ29uZmlnKSkge1xuICAgICAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBjYW4ndCBiZSBwYXJzZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IEJ1bi5ZQU1MLnN0cmluZ2lmeShuZXdDb25maWcsIHVuZGVmaW5lZCwgMik7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCByZWFkQWdlbnRzRXh0cmFDb250ZW50KGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50Py50cmltU3RhcnQoKS5zdGFydHNXaXRoKCcjJykgPyB1bmRlZmluZWQgOiBleHRyYUNvbnRlbnQ7XG4gICAgY29uc3QgcmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbiA9IGNvbmZpZy5pc1B1YmxpY1JlcG9cbiAgICAgID8gJ1JldmlldyBpbiBFbmdsaXNoIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy4nXG4gICAgICA6ICfku6XkuIvjga7jgrPjg7zjg4fjgqPjg7PjgrDopo/ntITjgpLouI/jgb7jgYjjgabjgIHml6XmnKzoqp7jgafjg6zjg5Pjg6Xjg7zjgZfjgabjgY/jgaDjgZXjgYTjgIInO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYCR7cmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbn1cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShjb25maWcsIGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIC4uLihoYXNOb25DYW5vbmljYWxDb25maWcgPyBbXSA6IFtwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKV0pLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpLFxuICAgIF07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGdpdE91dHB1dE1heEJ1ZmZlciA9IDY0ICogMTAyNCAqIDEwMjQ7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbi8vIGAuZ2l0aWdub3JlIC10ZXh0YCBrZWVwcyB0aGUgbWFjT1MgdGVtcGxhdGUncyBgSWNvblxcclxccmAgcnVsZSBpbnRhY3Q6IGB0ZXh0PWF1dG9gIG5vcm1hbGl6YXRpb25cbi8vIHN0cmlwcyBvbmUgQ1IgcGVyIGNoZWNraW4sIGRlZ3JhZGluZyB0aGUgcnVsZSB1bnRpbCBpdCBtYXRjaGVzIG5vdGhpbmcuXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbi5naXRpZ25vcmUgLXRleHRcblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMoZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGxldCBvdXRwdXQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBvdXRwdXQgPSBjaGlsZF9wcm9jZXNzLmV4ZWNGaWxlU3luYygnZ2l0JywgWydscy1maWxlcycsICctLWVvbCcsICcteiddLCB7XG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBnaXRPdXRwdXRNYXhCdWZmZXIsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHRyYWNrZWQgbGluZS1lbmRpbmcgcmVub3JtYWxpemF0aW9uOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHJlbm9ybWFsaXplZENvdW50ID0gMDtcbiAgZm9yIChjb25zdCByZWNvcmQgb2Ygb3V0cHV0LnNwbGl0KCdcXDAnKSkge1xuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gcmVjb3JkLmluZGV4T2YoJ1xcdCcpO1xuICAgIGlmIChzZXBhcmF0b3JJbmRleCA9PT0gLTEpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHJlY29yZC5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCk7XG4gICAgaWYgKCEvXmlcXC8oPzpjcmxmfG1peGVkKVxccy91LnRlc3QoYXR0cmlidXRlcykgfHwgIS9hdHRyXFwvLipcXGJlb2w9KD86bGZ8Y3JsZikoPzpcXHN8JCkvdS50ZXN0KGF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWNvcmQuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKTtcbiAgICBjb25zdCB0cmFja2VkRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCBzdGF0cyA9IGZzLmxzdGF0U3luYyh0cmFja2VkRmlsZVBhdGgsIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pO1xuICAgIGlmICghc3RhdHM/LmlzRmlsZSgpKSBjb250aW51ZTtcblxuICAgIC8vIEdpdCdzIHN0YXQgY2FjaGUgY2FuIGhpZGUgcHJlLWV4aXN0aW5nIENSTEYgYmxvYnMgYWZ0ZXIgd2JmeSBpbnRyb2R1Y2VzIHRleHQgYXR0cmlidXRlcy5cbiAgICAvLyBOb3JtYWxpemUgYnl0ZXMgaW4gdGhlIHdvcmt0cmVlIHNvIHRoZSBjYWxsZXIncyBub3JtYWwgYGdpdCBhZGQgLUFgIHJlY29yZHMgdGhlIGNhbm9uaWNhbFxuICAgIC8vIGJsb2I7IHRoaXMgYWxzbyBwcmV2ZW50cyBQcmV0dGllcidzIG1ldGFkYXRhIGNhY2hlIGZyb20gc2tpcHBpbmcgdGhlIG5ld2x5IGNoYW5nZWQgZmlsZS5cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0cmFja2VkRmlsZVBhdGgsIEJ1ZmZlci5mcm9tKGNvbnRlbnQudG9TdHJpbmcoJ2JpbmFyeScpLnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKSwgJ2JpbmFyeScpKTtcbiAgICByZW5vcm1hbGl6ZWRDb3VudCsrO1xuICB9XG4gIGlmIChyZW5vcm1hbGl6ZWRDb3VudCA+IDApIHtcbiAgICBjb25zb2xlLmluZm8oYFJlbm9ybWFsaXplZCBsaW5lIGVuZGluZ3MgaW4gJHtyZW5vcm1hbGl6ZWRDb3VudH0gdHJhY2tlZCBmaWxlKHMpLmApO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcywgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIERvIG5vdCByZW1vdmUgYHdpbmRvd3NgOiBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBmaWxlcyBtdXN0IGtlZXAgaWdub3JpbmcgV2luZG93cy1jcmVhdGVkIGxvY2FsIGFydGlmYWN0cy5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuX19nZW5lcmF0ZWRfXy9cbiEua2VlcFxuLmFpZGVyKlxuLmFudGlncmF2aXR5Y2xpL1xuLmNsYXVkZS8qLmxvY2FsLipcbi5jbGF1ZGUvc2NoZWR1bGVkX3Rhc2tzLmxvY2tcbi5kZXZjb250YWluZXIvXG4uZG9ja2VyLmVudlxuLmVudipcbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4ucGxheXdyaWdodC1tY3AvXG4uc2VyZW5hL1xuLnRtcC9cbi50bXAtKi9cbi50b2tlbnNhdmUvXG4ud2IvXG5Ad2lsbGJvb3N0ZXIvXG5Ad2lsbGJvb3N0ZXItcHJpdmF0ZS9cbiovbW91bnQvKi5oYXNoXG5DTEFVREUubG9jYWwubWRcbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICAvLyBFdmVyeSBhY2NlcHRlZCByZXBvc2l0b3J5IHJvb3QgcmVjZWl2ZXMgYSBtYW5hZ2VkIHBhY2thZ2UuanNvbiBsYXRlciBpbiB0aGUgc2FtZSBydW4sIHNvIGl0c1xuICAgIC8vIGRlcGVuZGVuY3kgdHJlZSBtdXN0IGJlIGlnbm9yZWQgZXZlbiB3aGVuIHRoZSBtYW5pZmVzdCBkaWQgbm90IGV4aXN0IGF0IGNvbmZpZy1kZXRlY3Rpb24gdGltZS5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHwgY29uZmlnLmlzUm9vdCkge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmUgZGV0ZWN0aW9uIChub3QganVzdCBhIHJvb3QgcG9tLnhtbCk6IGEgbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yeSBrZWVwcyBpdHMgTWF2ZW5cbiAgICAvLyBtb2R1bGVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmQgZHJvcHBpbmcgdGhlIG1hdmVuIHRlbXBsYXRlIHdvdWxkIGxldCB0YXJnZXQvIGdldCB0cmFja2VkLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnkuIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdFxuICAgIC8vIGxvY2tmaWxlKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIFB5dGhvbiBkaXJlY3RvcmllcyBpbiBzdWJkaXJlY3RvcmllcywgYW5kXG4gICAgLy8gZHJvcHBpbmcgdGhlIHB5dGhvbiB0ZW1wbGF0ZSB3b3VsZCBsZXQgX19weWNhY2hlX18vIGFuZCAudmVudi8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHwgY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydXN0Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZykge1xuICAgICAgLy8gIUNhcmdvLmxvY2sgb3ZlcnJpZGVzIGFueSBwcmUtZXhpc3RpbmcgdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgZnJvbSBhXG4gICAgICAvLyBwYXJlbnQgLmdpdGlnbm9yZSwgc28gdGhlIGFwcGxpY2F0aW9uIGxvY2tmaWxlIHN0YXlzIGNvbW1pdHRhYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAhQ2FyZ28ubG9ja1xuc3JjLXRhdXJpL2dlbi9zY2hlbWFzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNDbG91ZGZsYXJlIHx8IHJvb3RDb25maWcuaXNDbG91ZGZsYXJlKSB7XG4gICAgICAvLyAuZGV2LnZhcnMqIGhvbGQgbG9jYWwgc2VjcmV0cyBmb3Igd3JhbmdsZXIgZGV2IGFuZCBtdXN0IG5ldmVyIGJlIGNvbW1pdHRlZC5cbiAgICAgIC8vIC5lbnYuY2xvdWRmbGFyZSBjYXJyaWVzIENMT1VERkxBUkVfQVBJX1RPS0VOOiBDSSB3cml0ZXMgaXQgZnJvbSBhIHNlY3JldCwgYW5kIGEgbG9jYWxcbiAgICAgIC8vIGB3YiBkZXBsb3lgIG5lZWRzIGEgcmVhbCB0b2tlbiBpbiBpdCwgc28gY29tbWl0dGluZyBpdCB3b3VsZCBsZWFrIGFjY291bnQgY3JlZGVudGlhbHMuXG4gICAgICAvLyBJdCBpcyBsaXN0ZWQgZXhwbGljaXRseSBzbyB0aGUgQ2xvdWRmbGFyZS1zcGVjaWZpYyBjcmVkZW50aWFsIHBvbGljeSByZW1haW5zIHZpc2libGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5kZXYudmFycypcbi5lbnYuY2xvdWRmbGFyZVxuLndyYW5nbGVyL1xuYDtcbiAgICB9XG4gICAgLy8gSWdub3JlZCBvbmx5IHdoZXJlIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0LCBzbyB3YmZ5IG5ldmVyIGlnbm9yZXMgYSBmaWxlIHRoYXQgbm90aGluZyByZWNyZWF0ZXMuIFRoaXMga2VlcHNcbiAgICAvLyBpdHMgdGhvdXNhbmRzIG9mIGxpbmVzIG91dCBvZiBldmVyeSB3cmFuZ2xlciBidW1wJ3MgZGlmZi4gQW5jaG9yZWQgd2l0aCBhIGxlYWRpbmcgc2xhc2ggYmVjYXVzZSBgd3JhbmdsZXIgdHlwZXNgXG4gICAgLy8gYW5kIHRoZSBvcHQtb3V0IGRlbGV0aW9uIGJlbG93IG9ubHkgZXZlciB0b3VjaCB0aGlzIHBhY2thZ2UncyBvd24gZmlsZSwgbm90IGEgbmVzdGVkIG9uZSBhdCBhbnkgZGVwdGguXG4gICAgaWYgKGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyAmJiAhY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICAvLyBPbiBhIGdlbnVpbmUgd29ya2VyLXR5cGVzIG9wdC1vdXQgKG5vdGhpbmcgY29uc3VtZXMgdGhlIGdlbmVyYXRlZCBmaWxlOyBnZW5lcmF0ZXNXb3JrZXJUeXBlc1xuICAgICAgLy8gYWxvbmUgaXMgZmFsc2UgZm9yIHVucmVsYXRlZCByZWFzb25zIHN1Y2ggYXMgYSBtaXNzaW5nIGxvY2FsIHdyYW5nbGVyIGRlcGVuZGVuY3ksIHdoZXJlIHRoZVxuICAgICAgLy8gZmlsZSBtYXkgc3RpbGwgYmUgY29uc3VtZWQpIHRoZSBpZ25vcmUgcnVsZVxuICAgICAgLy8gYWJvdmUgZGlzYXBwZWFycywgc28gYW4gYWxyZWFkeS1nZW5lcmF0ZWQgZmlsZSB3b3VsZCBzdXJmYWNlIGFzIHVudHJhY2tlZCBub2lzZSBvbiBldmVyeVxuICAgICAgLy8gY2hlY2tvdXQg4oCUIGRlbGV0ZSBpdC4gTm8gcmVwb3NpdG9yeSB0cmFja3MgdGhlIGZpbGUgKGRvY3MvZXhwZWN0ZWQtcmVwb3NpdG9yeS1ydWxlcy5tZCksXG4gICAgICAvLyBzbyBhbiBleGlzdGluZyBjb3B5IGlzIGFsd2F5cyBhIGRpc3Bvc2FibGUgZ2VuZXJhdGVkIG9uZS5cbiAgICAgIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtlclR5cGVzUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHdvcmtlclR5cGVzUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZpbmV4dC9cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sQW55d2hlcmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAgIC8vIFRoZSBydXN0IHRlbXBsYXRlJ3MgdW5hbmNob3JlZCBkZWJ1Zy8gd291bGQgYWxzbyBoaWRlIGZyb250ZW5kIHNvdXJjZVxuICAgICAgLy8gZGlyZWN0b3JpZXMgc3VjaCBhcyBzcmMvZGVidWcvOyBjYXJnbyBvdXRwdXQgaXMgYWxyZWFkeSBjb3ZlcmVkIGJ5IHRhcmdldC8uXG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXmRlYnVnXFwvJC9nbSwgJyMgZGVidWcvJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fCBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXMpIHtcbiAgICAgIC8vIFRoZSBydXN0IHRlbXBsYXRlIGlnbm9yZXMgQ2FyZ28ubG9jaywgYnV0IGEgc3JjLXRhdXJpIGNvbmZpZ3VyYXRpb24gbWFya3MgYW5cbiAgICAgIC8vIGFwcGxpY2F0aW9uLCB3aG9zZSBDYXJnby5sb2NrIG11c3QgYmUgY29tbWl0dGVkIGZvciByZXByb2R1Y2libGUgYnVpbGRzLiBUaGVcbiAgICAgIC8vIHJ1bGUgaXMgYWxzbyBkaXNhYmxlZCB3aGVuIGEgc3ViIHBhY2thZ2UgY29udGFpbnMgYSBUYXVyaSBhcHBsaWNhdGlvbiwgYmVjYXVzZVxuICAgICAgLy8gYW4gdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgaW4gYSBwYXJlbnQgLmdpdGlnbm9yZSB3b3VsZCBoaWRlIHRoZSBuZXN0ZWRcbiAgICAgIC8vIGFwcGxpY2F0aW9uJ3MgbG9ja2ZpbGUuIFRhdXJpIHBsdWdpbiBsaWJyYXJpZXMgKGRldGVjdGVkIG9ubHkgdmlhXG4gICAgICAvLyBAdGF1cmktYXBwcy8qIGRlcGVuZGVuY2llcykga2VlcCB0aGUgdGVtcGxhdGUncyBwb2xpY3kgb2YgaWdub3JpbmcgQ2FyZ28ubG9jay5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eQ2FyZ29cXC5sb2NrJC9nbSwgJyMgQ2FyZ28ubG9jaycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbi8qKlxuICogVGhlIHZlcnNpb24gd2JmeSdzIG93biBwYWNrYWdlLmpzb24gY2FycmllcyBpbiB0aGUgcmVwb3NpdG9yeS4gYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgcmV3cml0ZXNcbiAqIGl0IGluIHRoZSBwdWJsaXNoZWQgdGFyYmFsbCBvbmx5IChpdCBpcyBuZXZlciBjb21taXR0ZWQgYmFjayksIHNvIGEgd2JmeSBydW4gc3RhcnRlZCBmcm9tIGEgZ2l0XG4gKiBjaGVja291dCByZXBvcnRzIHRoaXMgcGxhY2Vob2xkZXIgaW5zdGVhZCBvZiBhIHJlYWwgdmVyc2lvbi5cbiAqL1xuY29uc3QgdW5yZWxlYXNlZFZlcnNpb25QcmVmaXggPSAnMC4wLjAtJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlWZXJzaW9uKCk6IHN0cmluZyB7XG4gIHJldHVybiByZWFkV2JmeVBhY2thZ2VKc29uKCkudmVyc2lvbjtcbn1cblxuLyoqIHdiZnkncyBsb2NhdGlvbiBpbnNpZGUgaXRzIG93biByZXBvc2l0b3J5LCByZWxhdGl2ZSB0byB0aGUgcmVwb3NpdG9yeSByb290LiAqL1xuY29uc3Qgd2JmeURpclBhdGhJblJlcG8gPSBwYXRoLmpvaW4oJ3BhY2thZ2VzJywgJ3diZnknKTtcblxuLyoqXG4gKiBJZGVudGlmaWVzIHRoZSB3YmZ5IGJ1aWxkIHRoYXQgcHJvZHVjZWQgdGhlIGdlbmVyYXRlZCBmaWxlczogdGhlIHJlbGVhc2VkIHZlcnNpb24sIG9yXG4gKiBgPHNob3J0IGNvbW1pdCBoYXNoPlstZGlydHldLWxvY2FsYCB3aGVuIHdiZnkgcnVucyBmcm9tIGl0cyBvd24gZ2l0IGNoZWNrb3V0LiBVbmRlZmluZWQgd2hlblxuICogbmVpdGhlciBpcyBhdmFpbGFibGUgKGUuZy4gYW4gdW5yZWxlYXNlZCBidWlsZCBleHRyYWN0ZWQgZnJvbSBhIHNvdXJjZSBhcmNoaXZlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlWZXJzaW9uTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gTmVpdGhlciB0aGUgaW5zdGFsbGVkIHBhY2thZ2UuanNvbiBub3IgdGhlIGdpdCBzdGF0ZSBvZiB3YmZ5J3Mgb3duIGNoZWNrb3V0IGNhbiBjaGFuZ2VcbiAgLy8gbWlkLXJ1biwgYW5kIGNvbXB1dGluZyB0aGUgbGFiZWwgc3Bhd25zIHNldmVyYWwgZ2l0IHN1YnByb2Nlc3Nlcywgc28gaXQgaXMgY29tcHV0ZWQgb25jZS5cbiAgaWYgKCFoYXNDb21wdXRlZFZlcnNpb25MYWJlbCkge1xuICAgIGNhY2hlZFZlcnNpb25MYWJlbCA9IGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk7XG4gICAgaGFzQ29tcHV0ZWRWZXJzaW9uTGFiZWwgPSB0cnVlO1xuICB9XG4gIHJldHVybiBjYWNoZWRWZXJzaW9uTGFiZWw7XG59XG5cbmxldCBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IGZhbHNlO1xubGV0IGNhY2hlZFZlcnNpb25MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBjb21wdXRlV2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IG5hbWUsIHZlcnNpb24sIGRpclBhdGggfSA9IHJlYWRXYmZ5UGFja2FnZUpzb24oKTtcbiAgaWYgKCF2ZXJzaW9uLnN0YXJ0c1dpdGgodW5yZWxlYXNlZFZlcnNpb25QcmVmaXgpKSByZXR1cm4gdmVyc2lvbjtcblxuICAvLyBnaXQgcmVzb2x2ZXMgdGhlIE5FQVJFU1QgZW5jbG9zaW5nIHJlcG9zaXRvcnksIHdoaWNoIGZvciBhbiB1bnJlbGVhc2VkIGJ1aWxkIHBsYWNlZCB1bmRlciBhXG4gIC8vIHRhcmdldCByZXBvc2l0b3J5IChub2RlX21vZHVsZXMsIG9yIGEgdmVuZG9yZWQvZXh0cmFjdGVkIHNvdXJjZSB0cmVlKSBpcyB0aGF0IHJlcG9zaXRvcnkg4oCUIGl0c1xuICAvLyBjb21taXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSB3YmZ5IGJ1aWxkIHRoYXQgcmFuLiBPbmx5IHdiZnkncyBvd24gbG9jYXRpb24gaW5zaWRlIGl0cyBvd25cbiAgLy8gcmVwb3NpdG9yeSBpZGVudGlmaWVzIGEgZ2VudWluZSBjaGVja291dCwgc28gYW55dGhpbmcgZWxzZSBmYWxscyBiYWNrIHRvIHRoZSB2ZXJzaW9uLWxlc3MgbGFiZWwuXG4gIGNvbnN0IGdpdFJvb3REaXJQYXRoID0gcnVuR2l0KFsncmV2LXBhcnNlJywgJy0tc2hvdy10b3BsZXZlbCddLCBkaXJQYXRoKTtcbiAgaWYgKFxuICAgICFnaXRSb290RGlyUGF0aCB8fFxuICAgIHBhdGgucmVsYXRpdmUoZ2l0Um9vdERpclBhdGgsIGRpclBhdGgpICE9PSB3YmZ5RGlyUGF0aEluUmVwbyB8fFxuICAgICFpc1diZnlSZXBvc2l0b3J5KGdpdFJvb3REaXJQYXRoKVxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG9ydD04JywgJ0hFQUQnXSwgZGlyUGF0aCk7XG4gIGlmICghY29tbWl0SGFzaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gVGhlIGNvbW1pdCBhbG9uZSB3b3VsZCBtaXNpZGVudGlmeSBhIGJ1aWxkIG1hZGUgZnJvbSBhbiBlZGl0ZWQgY2hlY2tvdXQsIHNvIHVuY29tbWl0dGVkIGNoYW5nZXNcbiAgLy8gYXJlIHJlcG9ydGVkIHRvbyDigJQgYnV0IG9ubHkgdW5kZXIgcGFja2FnZXMvKi9zcmMsIHBhY2thZ2VzLyovYmluIGFuZCBwYWNrYWdlcy8qL2NvbmZpZ3MsIHRoZVxuICAvLyBzb3VyY2UsIGVudHJ5LXBvaW50IHdyYXBwZXIgYW5kIHBvbGljeSBmaWxlcyB3YmZ5IGFuZCBpdHMgd29ya3NwYWNlIGRlcGVuZGVuY2llcyBhY3R1YWxseSBydW5cbiAgLy8gZnJvbS4gRXZlcnl0aGluZyB3YmZ5IEdFTkVSQVRFUyB3aGVuIGl0IHRhcmdldHMgaXRzIG93biByZXBvc2l0b3J5IGxpdmVzIG91dHNpZGUgdGhvc2UgKHRoZVxuICAvLyByb290IFJFQURNRSB0aGlzIGxhYmVsIGdvZXMgaW50bywgYW5kIGVhY2ggcGFja2FnZSdzIC5naXRpZ25vcmUsIHBhY2thZ2UuanNvbiwgdHNjb25maWcsIOKApiksIHNvXG4gIC8vIGEgZmlyc3QgcnVuIGNhbm5vdCBtYWtlIHRoZSBuZXh0IG9uZSByZWxhYmVsIHRoZSBiYWRnZSBgLWRpcnR5LWxvY2FsYCBieSBpdHNlbGYuXG4gIC8vIE1hbmlmZXN0cyBzdGF5IG91dCBvbiBwdXJwb3NlLCBldmVuIHRob3VnaCBhbiBlZGl0ZWQgYGV4cG9ydHNgIG1hcCBjYW4gcmVkaXJlY3Qgd2hpY2ggY29kZVxuICAvLyBsb2Fkczogd2JmeSBHRU5FUkFURVMgcGFja2FnZS5qc29uLCBzbyBpbmNsdWRpbmcgaXQgd291bGQgbWFrZSBldmVyeSBydW4gcmVwb3J0IGl0c2VsZiBkaXJ0eS5cbiAgLy8gVGhlIGxhYmVsIGlzIGJlc3QtZWZmb3J0IGJ1aWxkIHByb3ZlbmFuY2UsIG5vdCBhIHJlcHJvZHVjaWJsZS1idWlsZCBhdHRlc3RhdGlvbi5cbiAgY29uc3QgaXNEaXJ0eSA9IGdldEdpdERpcnR5U3RhdGUoZ2l0Um9vdERpclBhdGgpO1xuICBpZiAoaXNEaXJ0eSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoaXNEaXJ0eSkgcmV0dXJuIGAke2NvbW1pdEhhc2h9LWRpcnR5LWxvY2FsYDtcbiAgLy8gQW4gdW5tb2RpZmllZCBjaGVja291dCBzaXR0aW5nIG9uIGEgcmVsZWFzZSB0YWcgcnVucyBleGFjdGx5IHRoZSBjb2RlIHRoYXQgd2FzIHB1Ymxpc2hlZCB1bmRlclxuICAvLyB0aGF0IHZlcnNpb24sIHNvIGl0IGlzIGxhYmVsZWQgd2l0aCB0aGUgdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBjb21taXQgdGhhdCBvbmx5IHdiZnkgZGV2ZWxvcGVyc1xuICAvLyBjb3VsZCByZXNvbHZlIGJhY2sgdG8gb25lLlxuICByZXR1cm4gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChuYW1lLCBkaXJQYXRoKSA/PyBgJHtjb21taXRIYXNofS1sb2NhbGA7XG59XG5cbi8qKiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCB0YWdzIGVhY2ggcmVsZWFzZSBgPHBhY2thZ2UgbmFtZT5APHZlcnNpb24+YC4gKi9cbmZ1bmN0aW9uIGZpbmRSZWxlYXNlZFZlcnNpb25BdEhlYWQocGFja2FnZU5hbWU6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YWdQcmVmaXggPSBgJHtwYWNrYWdlTmFtZX1AYDtcbiAgLy8gQSBjb21taXQgY2FycmllcyBhdCBtb3N0IG9uZSByZWxlYXNlIHRhZyBwZXIgcGFja2FnZSwgc28gdGhlIGZpcnN0IG1hdGNoIGlzIHRoZSBvbmx5IG1hdGNoLlxuICByZXR1cm4gcnVuR2l0KFsndGFnJywgJy0tcG9pbnRzLWF0JywgJ0hFQUQnXSwgY3dkKVxuICAgID8uc3BsaXQoJ1xcbicpXG4gICAgLmZpbmQoKHRhZykgPT4gdGFnLnN0YXJ0c1dpdGgodGFnUHJlZml4KSlcbiAgICA/LnNsaWNlKHRhZ1ByZWZpeC5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBpc1diZnlSZXBvc2l0b3J5KGdpdFJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gRXZlcnkgcmVtb3RlIGNvdW50cywgbm90IGp1c3QgYG9yaWdpbmA6IGEgZm9yayBjaGVja291dCBjYXJyaWVzIHRoZSBjYW5vbmljYWwgcmVwb3NpdG9yeSBhc1xuICAvLyBgdXBzdHJlYW1gLCBhbmQgaXQgaXMgc3RpbGwgYSBnZW51aW5lIHdiZnkgY2hlY2tvdXQgd2hvc2UgY29tbWl0IGlkZW50aWZpZXMgdGhlIGJ1aWxkLlxuICBjb25zdCByZW1vdGVVcmxzID0gcnVuR2l0KFsncmVtb3RlJywgJy12J10sIGdpdFJvb3REaXJQYXRoKTtcbiAgcmV0dXJuICEhcmVtb3RlVXJscz8uc3BsaXQoJ1xcbicpLnNvbWUoKGxpbmUpID0+IGlzQ2Fub25pY2FsUmVtb3RlVXJsKGxpbmUuc3BsaXQoL1sgXFx0XSsvdSlbMV0gPz8gJycpKTtcbn1cblxuY29uc3QgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGggPSAvXlxcLz9XaWxsQm9vc3RlclxcL3NoYXJlZCg/OlxcLmdpdCk/JC9pdTtcblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZW1vdGUgVVJMIHBvaW50cyBhdCB3YmZ5J3Mgb3duIHJlcG9zaXRvcnkuIFRoZSBob3N0IGlzIGNvbXBhcmVkIGFmdGVyIFBBUlNJTkcgcmF0aGVyXG4gKiB0aGFuIG1hdGNoZWQgaW5zaWRlIHRoZSBzdHJpbmc6IGFueSBwYXR0ZXJuIGxvb3NlIGVub3VnaCB0byBhY2NlcHQgZXZlcnkgVVJMIGZvcm0gZ2l0IHN1cHBvcnRzXG4gKiBhbHNvIGFjY2VwdGVkIGEgbG9va2FsaWtlIHRoYXQgbWVyZWx5IGNvbnRhaW5zIHRoZSBob3N0LCBzdWNoIGFzXG4gKiBgaHR0cHM6Ly9ldmlsLmV4YW1wbGUvL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkLmdpdGAsIGxldHRpbmcgYW4gdW5yZWxhdGVkIGNoZWNrb3V0IGNsYWltIHRvXG4gKiBiZSBhIGdlbnVpbmUgd2JmeSBidWlsZC5cbiAqL1xuZnVuY3Rpb24gaXNDYW5vbmljYWxSZW1vdGVVcmwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gc2NwLXN0eWxlIChgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXIvc2hhcmVkLmdpdGApIGlzIG5vdCBhIFVSTCwgc28gaXQgaXMgbWF0Y2hlZCBzZXBhcmF0ZWx5LlxuICAvLyBUaGUgbG9va2FoZWFkIGtlZXBzIGEgc2NoZW1lJ3MgYDovL2AgZnJvbSBiZWluZyByZWFkIGFzIHRoZSBgaG9zdDpwYXRoYCBzZXBhcmF0b3IuXG4gIGNvbnN0IHNjcE1hdGNoID0gL14oPzpbXkAvXStAKT8oW14vOl0rKTooPyFcXC8pKC4qKSQvdS5leGVjKHVybCk7XG4gIGlmIChzY3BNYXRjaCkge1xuICAgIHJldHVybiBzY3BNYXRjaFsxXSEudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3Qoc2NwTWF0Y2hbMl0hKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBhdGhuYW1lIH0gPSBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIGhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJyAmJiBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aC50ZXN0KHBhdGhuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEdpdERpcnR5U3RhdGUoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgJ2dpdCcsXG4gICAgW1xuICAgICAgJ3N0YXR1cycsXG4gICAgICAnLS1wb3JjZWxhaW4nLFxuICAgICAgJy0tdW50cmFja2VkLWZpbGVzPWFsbCcsXG4gICAgICAnLS0nLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9Lyovc3JjLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2Jpbi8qKmAsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9jb25maWdzLyoqYCxcbiAgICBdLFxuICAgIHsgY3dkOiBnaXRSb290RGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9XG4gICk7XG4gIHJldHVybiBwcm9jLnN0YXR1cyA9PT0gMCA/ICEhcHJvYy5zdGRvdXQudHJpbSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBydW5HaXQoYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBhcmdzLCB7IGN3ZCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9KTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gcHJvYy5zdGRvdXQudHJpbSgpIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFdiZnlQYWNrYWdlSnNvbjogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbi8qKiBSZXR1cm5zIHdiZnkncyBvd24gcGFja2FnZSBkaXJlY3RvcnksIHdoaWNoIGFsc28gaG9sZHMgaXRzIGNvbmZpZ3MgKGUuZy4gcmVsZWFzZUFnZUdhdGUuanNvbikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeURpclBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS5kaXJQYXRoO1xufVxuXG5mdW5jdGlvbiByZWFkV2JmeVBhY2thZ2VKc29uKCk6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGRpclBhdGg6IHN0cmluZyB9IHtcbiAgaWYgKGNhY2hlZFdiZnlQYWNrYWdlSnNvbikgcmV0dXJuIGNhY2hlZFdiZnlQYWNrYWdlSnNvbjtcbiAgLy8gZmlsZVVSTFRvUGF0aCwgbm90IFVSTC5wYXRobmFtZTogdGhlIGxhdHRlciBrZWVwcyBwZXJjZW50LWVuY29kaW5nLCBzbyBhbiBpbnN0YWxsYXRpb24gcGF0aFxuICAvLyBjb250YWluaW5nIGUuZy4gYSBzcGFjZSB3b3VsZCByZXNvbHZlIHRvIGEgbm9uZXhpc3RlbnQgZGlyZWN0b3J5IGFuZCB0aGUgc2VhcmNoIHdvdWxkIHdhbGsgdXBcbiAgLy8gdG8gYW4gdW5yZWxhdGVkIHBhY2thZ2UuXG4gIGxldCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gICAgLy8gcGF0aC5kaXJuYW1lKCcvJykgPT09ICcvJywgc28gdGhlIHNlYXJjaCBtdXN0IHN0b3AgZXhwbGljaXRseSBhdCB0aGUgZmlsZXN5c3RlbSByb290LlxuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSB0aHJvdyBuZXcgRXJyb3IoXCJ3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBpcyBtaXNzaW5nLlwiKTtcbiAgICBkaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICBjYWNoZWRXYmZ5UGFja2FnZUpzb24gPSB7IG5hbWU6IHBhY2thZ2VKc29uLm5hbWUsIHZlcnNpb246IHBhY2thZ2VKc29uLnZlcnNpb24sIGRpclBhdGggfTtcbiAgcmV0dXJuIGNhY2hlZFdiZnlQYWNrYWdlSnNvbjtcbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnZXRXYmZ5RGlyUGF0aCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIEdMT0JBTFxuICogcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuIFJlcG9zaXRvcnkgY29uZmlncyBndWFyZCBvbmx5IHdiZmllZCByZXBvc2l0b3JpZXM7IGEgYnJhbmQtbmV3IGxvY2FsXG4gKiBwcm9qZWN0IGhhcyBubyBidW5maWcudG9tbCB5ZXQsIHNvIHRoZSBnbG9iYWwgZmlsZXMgYXJlIHRoZSBvbmx5IGdhdGUgYmV0d2VlbiBgYnVuIGNyZWF0ZWAgL1xuICogYG5wbSBpbml0YCBhbmQgYSBmcmVzaGx5IGNvbXByb21pc2VkIHJlbGVhc2UuIFRoZSBzYW1lIHNjcmlwdCBydW5zIG9uIENJIGFuZCBvbiB0aGUgc2VsZi1ob3N0ZWRcbiAqIHJ1bm5lcnMsIHNvIGV2ZXJ5IG1hY2hpbmUgZW5kcyB1cCB3aXRoIGJ5dGUtaWRlbnRpY2FsIHNldHRpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk6IGJvb2xlYW4ge1xuICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKCdiYXNoJywgW3BhdGguam9pbihnZXRXYmZ5RGlyUGF0aCgpLCAnY29uZmlncycsICdhcHBseVJlbGVhc2VBZ2VHYXRlLnNoJyldLCB7XG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGlmIChzdGF0dXMgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFwcGx5IHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGUgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzLicpO1xuICByZXR1cm4gZmFsc2U7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSnNPclRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YSB8fCBjb25maWcuZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gS2VlcCBwYWNrYWdlLW1hbmFnZXIgc2hpbXMgaW4gdGhlIEZpbGUgV2F0Y2hlciBwcm9ncmFtIGZpZWxkIHNvIG5vZGUgZG9lcyBub3Rcbi8vIHBhcnNlIHdyYXBwZXIgc2NyaXB0cyBwYXNzZWQgdGhyb3VnaCBhcmd1bWVudHMuXG5jb25zdCBveGZtdFByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9veGZtdCc7XG5jb25zdCBwcmV0dGllclByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnKSkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB0YXNrT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBhcmdzOiAnLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICEqKi9wYWNrYWdlLmpzb24nLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5veGZtdCxcbiAgICAgIG5hbWU6ICdPeGZtdCcsXG4gICAgICBwcm9ncmFtOiBveGZtdFByb2dyYW0sXG4gICAgfSxcbiAgICB7XG4gICAgICBhcmdzOiAnLS1jYWNoZSAtLXdyaXRlJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLnByZXR0aWVyT25seSxcbiAgICAgIG5hbWU6ICdQcmV0dGllcicsXG4gICAgICBwcm9ncmFtOiBwcmV0dGllclByb2dyYW0sXG4gICAgfSxcbiAgXVxuICAgIC5maWx0ZXIoKHRhc2spID0+IHRhc2suY29uZGl0aW9uKVxuICAgIC5mbGF0TWFwKCh0YXNrKSA9PiB0YXNrLmV4dGVuc2lvbnMubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKHRhc2sucHJvZ3JhbSwgdGFzay5hcmdzLCB0YXNrLm5hbWUsIGV4dCkpKTtcblxuICByZXR1cm4gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuICAgICR7dGFza09wdGlvbnMuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5JMThuVHNDb21tYW5kKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RlcGVuZGluZyc+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAnYnVuIHJ1biBnZW4taTE4bi10cyA+IC9kZXYvbnVsbCc7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCIiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Y29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcblx0cmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsdWUpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgc29ydE9iamVjdEtleXMgZnJvbSAnc29ydC1vYmplY3Qta2V5cydcbmltcG9ydCBkZXRlY3RJbmRlbnQgZnJvbSAnZGV0ZWN0LWluZGVudCdcbmltcG9ydCB7IGRldGVjdE5ld2xpbmVHcmFjZWZ1bCBhcyBkZXRlY3ROZXdsaW5lIH0gZnJvbSAnZGV0ZWN0LW5ld2xpbmUnXG5pbXBvcnQgZ2l0SG9va3MgZnJvbSAnZ2l0LWhvb2tzLWxpc3QnXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICdpcy1wbGFpbi1vYmonXG5pbXBvcnQgc2VtdmVyQ29tcGFyZSBmcm9tICdzZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUuanMnXG5pbXBvcnQgc2VtdmVyTWluVmVyc2lvbiBmcm9tICdzZW12ZXIvcmFuZ2VzL21pbi12ZXJzaW9uLmpzJ1xuXG5jb25zdCBwaXBlID1cbiAgKGZucykgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnJlZHVjZSgocmVzdWx0LCBmbikgPT4gZm4ocmVzdWx0LCAuLi5hcmdzKSwgeClcbmNvbnN0IG9uQXJyYXkgPSAoZm4pID0+ICh4KSA9PiAoQXJyYXkuaXNBcnJheSh4KSA/IGZuKHgpIDogeClcbmNvbnN0IG9uU3RyaW5nQXJyYXkgPSAoZm4pID0+ICh4KSA9PlxuICBBcnJheS5pc0FycmF5KHgpICYmIHguZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgPyBmbih4KSA6IHhcbmNvbnN0IHVuaXEgPSBvblN0cmluZ0FycmF5KCh4cykgPT4gWy4uLm5ldyBTZXQoeHMpXSlcbmNvbnN0IHNvcnRBcnJheSA9IG9uU3RyaW5nQXJyYXkoKGFycmF5KSA9PiBhcnJheS50b1NvcnRlZCgpKVxuY29uc3QgdW5pcUFuZFNvcnRBcnJheSA9IHBpcGUoW3VuaXEsIHNvcnRBcnJheV0pXG5jb25zdCBvbk9iamVjdCA9XG4gIChmbikgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgaXNQbGFpbk9iamVjdCh4KSA/IGZuKHgsIC4uLmFyZ3MpIDogeFxuY29uc3Qgc29ydE9iamVjdEJ5ID0gKGNvbXBhcmF0b3IsIGRlZXApID0+IHtcbiAgY29uc3Qgb3ZlciA9IG9uT2JqZWN0KChvYmplY3QpID0+IHtcbiAgICBpZiAoZGVlcCkge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBvdmVyKHZhbHVlKV0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhvYmplY3QsIGNvbXBhcmF0b3IpXG4gIH0pXG5cbiAgcmV0dXJuIG92ZXJcbn1cbmNvbnN0IHNvcnRPYmplY3QgPSBzb3J0T2JqZWN0QnkoKVxuY29uc3Qgc29ydFVSTE9iamVjdCA9IHNvcnRPYmplY3RCeShbJ3R5cGUnLCAndXJsJ10pXG5jb25zdCBzb3J0UGVvcGxlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnbmFtZScsICdlbWFpbCcsICd1cmwnXSlcbmNvbnN0IHNvcnREaXJlY3RvcmllcyA9IHNvcnRPYmplY3RCeShbXG4gICdsaWInLFxuICAnYmluJyxcbiAgJ21hbicsXG4gICdkb2MnLFxuICAnZXhhbXBsZScsXG4gICd0ZXN0Jyxcbl0pXG5jb25zdCBvdmVyUHJvcGVydHkgPSAocHJvcGVydHksIG92ZXIpID0+XG4gIG9uT2JqZWN0KChvYmplY3QsIC4uLmFyZ3MpID0+XG4gICAgT2JqZWN0Lmhhc093bihvYmplY3QsIHByb3BlcnR5KVxuICAgICAgPyB7IC4uLm9iamVjdCwgW3Byb3BlcnR5XTogb3ZlcihvYmplY3RbcHJvcGVydHldLCAuLi5hcmdzKSB9XG4gICAgICA6IG9iamVjdCxcbiAgKVxuY29uc3Qgc29ydEdpdEhvb2tzID0gc29ydE9iamVjdEJ5KGdpdEhvb2tzKVxuXG5jb25zdCBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UgPSAoc3BlY2lmaWVyKSA9PiB7XG4gIC8vIElnbm9yZSBhbnl0aGluZyBhZnRlciA+ICYgcmVseSBvbiBmYWxsYmFjayBhbHBoYW51bWVyaWMgc29ydGluZyBmb3IgdGhhdFxuICBjb25zdCBbbmFtZUFuZFZlcnNpb25dID0gc3BlY2lmaWVyLnNwbGl0KCc+JylcbiAgY29uc3QgYXRNYXRjaGVzID0gWy4uLm5hbWVBbmRWZXJzaW9uLm1hdGNoQWxsKCdAJyldXG4gIGlmIChcbiAgICAhYXRNYXRjaGVzLmxlbmd0aCB8fFxuICAgIChhdE1hdGNoZXMubGVuZ3RoID09PSAxICYmIGF0TWF0Y2hlc1swXS5pbmRleCA9PT0gMClcbiAgKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogc3BlY2lmaWVyIH1cbiAgfVxuICBjb25zdCBzcGxpdEluZGV4ID0gYXRNYXRjaGVzLnBvcCgpLmluZGV4XG4gIHJldHVybiB7XG4gICAgbmFtZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKDAsIHNwbGl0SW5kZXgpLFxuICAgIHJhbmdlOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoc3BsaXRJbmRleCArIDEpLFxuICB9XG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeVNlbXZlciA9IHNvcnRPYmplY3RCeSgoYSwgYikgPT4ge1xuICBjb25zdCB7IG5hbWU6IGFOYW1lLCByYW5nZTogYVJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYSlcbiAgY29uc3QgeyBuYW1lOiBiTmFtZSwgcmFuZ2U6IGJSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGIpXG5cbiAgaWYgKGFOYW1lICE9PSBiTmFtZSkge1xuICAgIHJldHVybiBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lLCAnZW4nKVxuICB9XG4gIGlmICghYVJhbmdlKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKCFiUmFuZ2UpIHtcbiAgICByZXR1cm4gMVxuICB9XG4gIHJldHVybiBzZW12ZXJDb21wYXJlKHNlbXZlck1pblZlcnNpb24oYVJhbmdlKSwgc2VtdmVyTWluVmVyc2lvbihiUmFuZ2UpKVxufSlcblxuY29uc3QgZ2V0UGFja2FnZU5hbWUgPSAoaWRlbnQpID0+IHtcbiAgY29uc3QgaW5kZXggPSBpZGVudC5pbmRleE9mKCdAJywgaWRlbnQuc3RhcnRzV2l0aCgnQCcpID8gMSA6IDApXG4gIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHVubGVzcyB1c2VyIG1hbnVhbGx5IGVkaXQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gIHJldHVybiBpbmRleCA9PT0gLTEgPyBpZGVudCA6IGlkZW50LnNsaWNlKDAsIGluZGV4KVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlJZGVudCA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lQSA9IGdldFBhY2thZ2VOYW1lKGEpXG4gIGNvbnN0IHBhY2thZ2VOYW1lQiA9IGdldFBhY2thZ2VOYW1lKGIpXG5cbiAgaWYgKHBhY2thZ2VOYW1lQSA8IHBhY2thZ2VOYW1lQikgcmV0dXJuIC0xXG4gIGlmIChwYWNrYWdlTmFtZUEgPiBwYWNrYWdlTmFtZUIpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIENhY2hlIGJ5IGBwcm9jZXNzLmN3ZCgpYCBpbnN0ZWFkIG9mIGEgdmFyaWFibGUgdG8gYWxsb3cgdXNlciBjYWxsIGBwcm9jZXNzLmNoZGlyKClgXG5jb25zdCBjYWNoZSA9IG5ldyBNYXAoKVxuY29uc3QgaGFzWWFybk9yUG5wbUZpbGVzID0gKCkgPT4ge1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4gIGlmICghY2FjaGUuaGFzKGN3ZCkpIHtcbiAgICBjYWNoZS5zZXQoXG4gICAgICBjd2QsXG4gICAgICBmcy5leGlzdHNTeW5jKCd5YXJuLmxvY2snKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybi8nKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybnJjLnltbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0tbG9jay55YW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS13b3Jrc3BhY2UueWFtbCcpLFxuICAgIClcbiAgfVxuICByZXR1cm4gY2FjaGUuZ2V0KGN3ZClcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBwYWNrYWdlIG1hbmFnZXIgZnJvbSBwYWNrYWdlLmpzb24gYW5kIGxvY2sgZmlsZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlSnNvbiAtIFRoZSBwYXJzZWQgcGFja2FnZS5qc29uIG9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVGhlIGRldGVjdGVkIHBhY2thZ2UgbWFuYWdlci4gRGVmYXVsdCB0byBucG0gaWYgbm90IGRldGVjdGVkLlxuICovXG5mdW5jdGlvbiBzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL2NvcmVwYWNrXG4gIGlmICh0eXBlb2YgcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ25wbUAnKVxuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLmRldkVuZ2luZXM/LnBhY2thZ2VNYW5hZ2VyPy5uYW1lKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLmRldkVuZ2luZXMucGFja2FnZU1hbmFnZXIubmFtZSA9PT0gJ25wbSdcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5wbnBtKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBPcHRpbWlzYXRpb246IENoZWNrIGlmIG5wbSBpcyBleHBsaWNpdCBiZWZvcmUgcmVhZGluZyBGUy5cbiAgaWYgKHBhY2thZ2VKc29uLmVuZ2luZXM/Lm5wbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoaGFzWWFybk9yUG5wbUZpbGVzKCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogU29ydCBkZXBlbmRlbmNpZXMgYWxwaGFiZXRpY2FsbHksIGRldGVjdGluZyBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlIHRoZVxuICogYXBwcm9wcmlhdGUgY29tcGFyaXNvbi4gbnBtIHVzZXMgbG9jYWxlLWF3YXJlIGNvbXBhcmlzb24sIHlhcm4gYW5kIHBucG0gdXNlXG4gKiBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb25cbiAqL1xuY29uc3Qgc29ydERlcGVuZGVuY2llcyA9IG9uT2JqZWN0KChkZXBlbmRlbmNpZXMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIC8vIEF2b2lkIGZpbGUgYWNjZXNzXG4gIGlmIChPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzXG4gIH1cblxuICAvLyBzb3J0IGRlcHMgbGlrZSB0aGUgbnBtIENMSSBkb2VzICh2aWEgdGhlIHBhY2thZ2UgQG5wbWNsaS9wYWNrYWdlLWpzb24pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vcGFja2FnZS1qc29uL2Jsb2IvYjY0NjVmNDRjNzI3ZDY1MTNkYjY4OThjN2NiZTQxZGQzNTVjZWJlOC9saWIvdXBkYXRlLWRlcGVuZGVuY2llcy5qcyNMOC1MMjFcbiAgaWYgKHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSkge1xuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMsIChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYiwgJ2VuJykpXG4gIH1cblxuICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzKVxufSlcblxuLyoqXG4gKiBcIndvcmtzcGFjZXNcIiBjYW4gYmUgYW4gYXJyYXkgKG5wbSBvciB5YXJuIGNsYXNzaWMpIG9yIGFuIG9iamVjdCAocG5wbS9idW4pLlxuICogSW4gdGhlIGNhc2Ugb2YgYW4gYXJyYXksIHdlIGRvIG5vdCB3YW50IHRvIGFscGhhYmV0aWNhbGx5IHNvcnQgaXQgaW4gY2FzZVxuICogc2NyaXB0cyBuZWVkIHRvIHJ1biBpbiBhIHNwZWNpZmljIG9yZGVyLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjcvdXNpbmctbnBtL3dvcmtzcGFjZXM/dj10cnVlI3J1bm5pbmctY29tbWFuZHMtaW4tdGhlLWNvbnRleHQtb2Ytd29ya3NwYWNlc1xuICovXG5jb25zdCBzb3J0V29ya3NwYWNlcyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoWydwYWNrYWdlcycsICdjYXRhbG9nJ10pLFxuICBvdmVyUHJvcGVydHkoJ3BhY2thZ2VzJywgdW5pcUFuZFNvcnRBcnJheSksXG4gIG92ZXJQcm9wZXJ0eSgnY2F0YWxvZycsIHNvcnREZXBlbmRlbmNpZXMpLFxuXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi9hY2MwZTQ3NTcyYTkzOTAyOTJiNGUzMTNiNGE0YmYzNjBkMjM2MzU4L2NvbmYvY29uZmlnLXNjaGVtYS5qc1xuY29uc3QgZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gIC8vIGBmaWxlc2AgYW5kIGBleGNsdWRlZEZpbGVzYCBhcmUgb25seSBvbiBgb3ZlcnJpZGVzW11gXG4gIC8vIGZvciBlYXNpZXIgc29ydCBgb3ZlcnJpZGVzW11gLFxuICAvLyBhZGQgdGhlbSB0byBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHNvcnQgYG92ZXJyaWRlc1tdYCB0d2ljZVxuICAnZmlsZXMnLFxuICAnZXhjbHVkZWRGaWxlcycsXG4gIC8vIGJhc2VDb25maWdcbiAgJ2VudicsXG4gICdwYXJzZXInLFxuICAncGFyc2VyT3B0aW9ucycsXG4gICdzZXR0aW5ncycsXG4gICdwbHVnaW5zJyxcbiAgJ2V4dGVuZHMnLFxuICAncnVsZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ2dsb2JhbHMnLFxuICAncHJvY2Vzc29yJyxcbiAgJ25vSW5saW5lQ29uZmlnJyxcbiAgJ3JlcG9ydFVudXNlZERpc2FibGVEaXJlY3RpdmVzJyxcbl1cbmNvbnN0IHNvcnRFc2xpbnRDb25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KCdlbnYnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KCdnbG9iYWxzJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+IG92ZXJyaWRlcy5tYXAoc29ydEVzbGludENvbmZpZykpLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3BhcnNlck9wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdydWxlcycsXG4gICAgc29ydE9iamVjdEJ5KFxuICAgICAgKHJ1bGUxLCBydWxlMikgPT5cbiAgICAgICAgcnVsZTEuc3BsaXQoJy8nKS5sZW5ndGggLSBydWxlMi5zcGxpdCgnLycpLmxlbmd0aCB8fFxuICAgICAgICBydWxlMS5sb2NhbGVDb21wYXJlKHJ1bGUyKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3NldHRpbmdzJywgc29ydE9iamVjdCksXG5dKVxuY29uc3Qgc29ydFZTQ29kZUJhZGdlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnZGVzY3JpcHRpb24nLCAndXJsJywgJ2hyZWYnXSlcblxuY29uc3Qgc29ydFByZXR0aWVyQ29uZmlnID0gcGlwZShbXG4gIC8vIHNvcnQga2V5cyBhbHBoYWJldGljYWxseSwgYnV0IHB1dCBgb3ZlcnJpZGVzYCBhdCBib3R0b21cbiAgb25PYmplY3QoKGNvbmZpZykgPT5cbiAgICBzb3J0T2JqZWN0S2V5cyhjb25maWcsIFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKGNvbmZpZylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdvdmVycmlkZXMnKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgJ292ZXJyaWRlcycsXG4gICAgXSksXG4gICksXG4gIC8vIGlmIGBjb25maWcub3ZlcnJpZGVzYCBleGlzdHNcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIC8vIGFuZCBgY29uZmlnLm92ZXJyaWRlc2AgaXMgYW4gYXJyYXlcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+XG4gICAgICBvdmVycmlkZXMubWFwKFxuICAgICAgICBwaXBlKFtcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW11gIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgc29ydE9iamVjdCxcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW10ub3B0aW9uc2AgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBvdmVyUHJvcGVydHkoJ29wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICksXG4gICksXG5dKVxuXG5jb25zdCBzb3J0Vm9sdGEgPSBzb3J0T2JqZWN0QnkoWydub2RlJywgJ25wbScsICd5YXJuJ10pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvd2lyZWl0XG5jb25zdCB3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzID0gWydjb21tYW5kJywgJ2RlcGVuZGVuY2llcycsICdmaWxlcycsICdvdXRwdXQnXVxuY29uc3Qgc29ydFdpcmVpdFNjcmlwdCA9IHBpcGUoW1xuICBzb3J0T2JqZWN0Qnkod2lyZWl0U2NyaXB0UHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICBvbkFycmF5KChkZXBzKSA9PiBkZXBzLm1hcChzb3J0T2JqZWN0QnkoWydzY3JpcHQnLCAnY2FzY2FkZSddKSkpLFxuICApLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ2VudicsXG4gICAgb25PYmplY3QoKGVudikgPT5cbiAgICAgIHNvcnRPYmplY3RLZXlzKFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoZW52KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgc29ydE9iamVjdEJ5KFsnZXh0ZXJuYWwnLCAnZGVmYXVsdCddKSh2YWx1ZSksXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnc2VydmljZScsXG4gICAgcGlwZShbc29ydE9iamVjdEJ5KFsncmVhZHlXaGVuJ10pLCBvdmVyUHJvcGVydHkoJ3JlYWR5V2hlbicsIHNvcnRPYmplY3QpXSksXG4gICksXG5dKVxuY29uc3Qgc29ydFdpcmVpdCA9IG9uT2JqZWN0KCh3aXJlaXQpID0+XG4gIHNvcnRPYmplY3RLZXlzKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHdpcmVpdCkubWFwKChbbmFtZSwgY29uZmlnXSkgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICBzb3J0V2lyZWl0U2NyaXB0KGNvbmZpZyksXG4gICAgICBdKSxcbiAgICApLFxuICApLFxuKVxuY29uc3Qgc29ydERldkVuZ2luZXMgPSBvdmVyUHJvcGVydHkoXG4gICdwYWNrYWdlTWFuYWdlcicsXG4gIHNvcnRPYmplY3RCeShbJ25hbWUnLCAndmVyc2lvbicsICdvbkZhaWwnXSksXG4pXG5cbmNvbnN0IHBucG1CYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgJ3BlZXJEZXBlbmRlbmN5UnVsZXMnLFxuICAnbmV2ZXJCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzRmlsZScsXG4gICdhbGxvd2VkRGVwcmVjYXRlZFZlcnNpb25zJyxcbiAgJ2FsbG93Tm9uQXBwbGllZFBhdGNoZXMnLFxuICAndXBkYXRlQ29uZmlnJyxcbiAgJ2F1ZGl0Q29uZmlnJyxcbiAgJ3JlcXVpcmVkU2NyaXB0cycsXG4gICdzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdwYXRjaGVkRGVwZW5kZW5jaWVzJyxcbiAgJ3BhY2thZ2VFeHRlbnNpb25zJyxcbl1cblxuY29uc3Qgc29ydFBucG1Db25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHBucG1CYXNlQ29uZmlnUHJvcGVydGllcywgdHJ1ZSksXG4gIG92ZXJQcm9wZXJ0eSgnb3ZlcnJpZGVzJywgc29ydE9iamVjdEJ5U2VtdmVyKSxcbl0pXG5cbi8vIFNlZSBodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2NyaXB0c1xuY29uc3QgZGVmYXVsdE5wbVNjcmlwdHMgPSBuZXcgU2V0KFtcbiAgJ2luc3RhbGwnLFxuICAncGFjaycsXG4gICdwcmVwYXJlJyxcbiAgJ3B1Ymxpc2gnLFxuICAncmVzdGFydCcsXG4gICdzaHJpbmt3cmFwJyxcbiAgJ3N0YXJ0JyxcbiAgJ3N0b3AnLFxuICAndGVzdCcsXG4gICd1bmluc3RhbGwnLFxuICAndmVyc2lvbicsXG5dKVxuXG5jb25zdCBoYXNEZXZEZXBlbmRlbmN5ID0gKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uKSA9PiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2RldkRlcGVuZGVuY2llcycpICYmXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpXG4gIClcbn1cblxuY29uc3QgcnVuU1JlZ0V4cCA9XG4gIC8oPzw9XnxbXFxzJjs8PnwoXSkoPzpydW4tc3xucG0tcnVuLWFsbDI/IC4qKD86LS1zZXF1ZW50aWFsfC0tc2VyaWFsfC1zKSkoPz0kfFtcXHMmOzw+fCldKS9cblxuY29uc3QgaXNTZXF1ZW50aWFsU2NyaXB0ID0gKGNvbW1hbmQpID0+XG4gIGNvbW1hbmQuaW5jbHVkZXMoJyonKSAmJiBydW5TUmVnRXhwLnRlc3QoY29tbWFuZClcblxuY29uc3QgaGFzU2VxdWVudGlhbFNjcmlwdCA9IChwYWNrYWdlSnNvbikgPT4ge1xuICBpZiAoXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsJywgcGFja2FnZUpzb24pICYmXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsMicsIHBhY2thZ2VKc29uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBzY3JpcHRzID0gWydzY3JpcHRzJywgJ2JldHRlclNjcmlwdHMnXS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICBwYWNrYWdlSnNvbltmaWVsZF0gPyBPYmplY3QudmFsdWVzKHBhY2thZ2VKc29uW2ZpZWxkXSkgOiBbXSxcbiAgKVxuICByZXR1cm4gc2NyaXB0cy5zb21lKChzY3JpcHQpID0+IGlzU2VxdWVudGlhbFNjcmlwdChzY3JpcHQpKVxufVxuXG5mdW5jdGlvbiBzb3J0U2NyaXB0TmFtZXMoa2V5cywgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwKClcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSBwcmVmaXggPyBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCArIDEpIDoga2V5XG4gICAgY29uc3QgaWR4ID0gcmVzdC5pbmRleE9mKCc6JylcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IGtleS5zbGljZSgwLCAocHJlZml4ID8gcHJlZml4Lmxlbmd0aCArIDEgOiAwKSArIGlkeClcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGJhc2UpKSBncm91cE1hcC5zZXQoYmFzZSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoYmFzZSkucHVzaChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGtleSkpIGdyb3VwTWFwLnNldChrZXksIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGtleSkucHVzaChrZXkpXG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKGdyb3VwTWFwLmtleXMoKSlcbiAgICAuc29ydCgpXG4gICAgLmZsYXRNYXAoKGdyb3VwS2V5KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdyb3VwTWFwLmdldChncm91cEtleSlcbiAgICAgIGlmIChcbiAgICAgICAgY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBjaGlsZHJlbi5zb21lKChrKSA9PiBrICE9PSBncm91cEtleSAmJiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdCA9IGNoaWxkcmVuXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gayA9PT0gZ3JvdXBLZXkgfHwgIWsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICBjb25zdCBuZXN0ZWQgPSBjaGlsZHJlbi5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgIHJldHVybiBbLi4uZGlyZWN0LCAuLi5zb3J0U2NyaXB0TmFtZXMobmVzdGVkLCBncm91cEtleSldXG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc29ydCgpXG4gICAgfSlcbn1cblxuY29uc3Qgc29ydFNjcmlwdHMgPSBvbk9iamVjdCgoc2NyaXB0cywgcGFja2FnZUpzb24pID0+IHtcbiAgbGV0IG5hbWVzID0gT2JqZWN0LmtleXMoc2NyaXB0cylcbiAgY29uc3QgcHJlZml4YWJsZSA9IG5ldyBTZXQoKVxuXG4gIG5hbWVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgY29uc3Qgb21pdHRlZCA9IG5hbWUucmVwbGFjZSgvXig/OnByZXxwb3N0KS8sICcnKVxuICAgIGlmIChkZWZhdWx0TnBtU2NyaXB0cy5oYXMob21pdHRlZCkgfHwgbmFtZXMuaW5jbHVkZXMob21pdHRlZCkpIHtcbiAgICAgIHByZWZpeGFibGUuYWRkKG9taXR0ZWQpXG4gICAgICByZXR1cm4gb21pdHRlZFxuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICB9KVxuXG4gIGlmICghaGFzU2VxdWVudGlhbFNjcmlwdChwYWNrYWdlSnNvbikpIHtcbiAgICBuYW1lcyA9IHNvcnRTY3JpcHROYW1lcyhuYW1lcylcbiAgfVxuICBuYW1lcyA9IG5hbWVzLmZsYXRNYXAoKGtleSkgPT5cbiAgICBwcmVmaXhhYmxlLmhhcyhrZXkpID8gW2BwcmUke2tleX1gLCBrZXksIGBwb3N0JHtrZXl9YF0gOiBba2V5XSxcbiAgKVxuICByZXR1cm4gc29ydE9iamVjdEtleXMoc2NyaXB0cywgbmFtZXMpXG59KVxuXG4vKlxuLSBNb3ZlIGBkZWZhdWx0YCBjb25kaXRpb24gdG8gYm90dG9tXG4qL1xuY29uc3Qgc29ydENvbmRpdGlvbnMgPSAoY29uZGl0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25kaXRpb25zID0gW10sIHJlc3RDb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICBPYmplY3Qua2V5cyhleHBvcnRzKSxcbiAgICAoa2V5KSA9PiAoa2V5LnN0YXJ0c1dpdGgoJy4nKSA/ICdwYXRocycgOiAnY29uZGl0aW9ucycpLFxuICApXG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4ucGF0aHMsIC4uLnNvcnRDb25kaXRpb25zKGNvbmRpdGlvbnMpXS5tYXAoKGtleSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgc29ydEV4cG9ydHMoZXhwb3J0c1trZXldKSxcbiAgICBdKSxcbiAgKVxufSlcblxuLy8gZmllbGRzIG1hcmtlZCBgdnNjb2RlYCBhcmUgZm9yIGBWaXN1YWwgU3R1ZGlvIENvZGUgZXh0ZW5zaW9uIG1hbmlmZXN0YCBvbmx5XG4vLyBodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS9hcGkvcmVmZXJlbmNlcy9leHRlbnNpb24tbWFuaWZlc3Rcbi8vIFN1cHBvcnRlZCBmaWVsZHM6XG4vLyBwdWJsaXNoZXIsIGRpc3BsYXlOYW1lLCBjYXRlZ29yaWVzLCBnYWxsZXJ5QmFubmVyLCBwcmV2aWV3LCBjb250cmlidXRlcyxcbi8vIGFjdGl2YXRpb25FdmVudHMsIGJhZGdlcywgbWFya2Rvd24sIHFuYSwgZXh0ZW5zaW9uUGFjayxcbi8vIGV4dGVuc2lvbkRlcGVuZGVuY2llcywgaWNvblxuXG4vLyBmaWVsZC5rZXl7c3RyaW5nfTogZmllbGQgbmFtZVxuLy8gZmllbGQub3ZlcntmdW5jdGlvbn06IHNvcnQgZmllbGQgc3ViS2V5XG5jb25zdCBmaWVsZHMgPSBbXG4gIHsga2V5OiAnJHNjaGVtYScgfSxcbiAgeyBrZXk6ICduYW1lJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdkaXNwbGF5TmFtZScgfSxcbiAgeyBrZXk6ICd2ZXJzaW9uJyB9LFxuICAvKiB5YXJuICovIHsga2V5OiAnc3RhYmxlVmVyc2lvbicgfSxcbiAgeyBrZXk6ICdwcml2YXRlJyB9LFxuICB7IGtleTogJ2Rlc2NyaXB0aW9uJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjYXRlZ29yaWVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2tleXdvcmRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2hvbWVwYWdlJyB9LFxuICB7IGtleTogJ2J1Z3MnLCBvdmVyOiBzb3J0T2JqZWN0QnkoWyd1cmwnLCAnZW1haWwnXSkgfSxcbiAgeyBrZXk6ICdyZXBvc2l0b3J5Jywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2Z1bmRpbmcnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnbGljZW5zZScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncW5hJyB9LFxuICB7IGtleTogJ2F1dGhvcicsIG92ZXI6IHNvcnRQZW9wbGVPYmplY3QgfSxcbiAge1xuICAgIGtleTogJ21haW50YWluZXJzJyxcbiAgICBvdmVyOiBvbkFycmF5KChtYWludGFpbmVycykgPT4gbWFpbnRhaW5lcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbnRyaWJ1dG9ycycsXG4gICAgb3Zlcjogb25BcnJheSgoY29udHJpYnV0b3JzKSA9PiBjb250cmlidXRvcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHVibGlzaGVyJyB9LFxuICB7IGtleTogJ3NpZGVFZmZlY3RzJyB9LFxuICB7IGtleTogJ3R5cGUnIH0sXG4gIHsga2V5OiAnaW1wb3J0cycgfSxcbiAgeyBrZXk6ICdleHBvcnRzJywgb3Zlcjogc29ydEV4cG9ydHMgfSxcbiAgeyBrZXk6ICdtYWluJyB9LFxuICB7IGtleTogJ3N2ZWx0ZScgfSxcbiAgeyBrZXk6ICd1bWQ6bWFpbicgfSxcbiAgeyBrZXk6ICdqc2RlbGl2cicgfSxcbiAgeyBrZXk6ICd1bnBrZycgfSxcbiAgeyBrZXk6ICdtb2R1bGUnIH0sXG4gIHsga2V5OiAnc291cmNlJyB9LFxuICB7IGtleTogJ2pzbmV4dDptYWluJyB9LFxuICB7IGtleTogJ2Jyb3dzZXInIH0sXG4gIHsga2V5OiAncmVhY3QtbmF0aXZlJyB9LFxuICB7IGtleTogJ3R5cGVzJyB9LFxuICB7IGtleTogJ3R5cGVzVmVyc2lvbnMnIH0sXG4gIHsga2V5OiAndHlwaW5ncycgfSxcbiAgeyBrZXk6ICdzdHlsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGVzdHlsZScgfSxcbiAgeyBrZXk6ICdhc3NldHMnIH0sXG4gIHsga2V5OiAnYmluJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21hbicgfSxcbiAgeyBrZXk6ICdkaXJlY3RvcmllcycsIG92ZXI6IHNvcnREaXJlY3RvcmllcyB9LFxuICB7IGtleTogJ2ZpbGVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ3dvcmtzcGFjZXMnLCBvdmVyOiBzb3J0V29ya3NwYWNlcyB9LFxuICAvLyBub2RlLXByZS1neXAgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvbm9kZS1wcmUtZ3lwIzEtYWRkLW5ldy1lbnRyaWVzLXRvLXlvdXItcGFja2FnZWpzb25cbiAge1xuICAgIGtleTogJ2JpbmFyeScsXG4gICAgb3Zlcjogc29ydE9iamVjdEJ5KFtcbiAgICAgICdtb2R1bGVfbmFtZScsXG4gICAgICAnbW9kdWxlX3BhdGgnLFxuICAgICAgJ3JlbW90ZV9wYXRoJyxcbiAgICAgICdwYWNrYWdlX25hbWUnLFxuICAgICAgJ2hvc3QnLFxuICAgIF0pLFxuICB9LFxuICB7IGtleTogJ3NjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ2JldHRlclNjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ3dpcmVpdCcsIG92ZXI6IHNvcnRXaXJlaXQgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbDEwbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY29udHJpYnV0ZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2FjdGl2YXRpb25FdmVudHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaHVza3knLCBvdmVyOiBvdmVyUHJvcGVydHkoJ2hvb2tzJywgc29ydEdpdEhvb2tzKSB9LFxuICB7IGtleTogJ3NpbXBsZS1naXQtaG9va3MnLCBvdmVyOiBzb3J0R2l0SG9va3MgfSxcbiAgeyBrZXk6ICdwcmUtY29tbWl0JyB9LFxuICB7IGtleTogJ2NvbW1pdGxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbGludC1zdGFnZWQnIH0sXG4gIHsga2V5OiAnbmFuby1zdGFnZWQnIH0sXG4gIHsga2V5OiAnY29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25vZGVtb25Db25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcmlmeScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdiYWJlbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2Vyc2xpc3QnIH0sXG4gIHsga2V5OiAneG8nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHJldHRpZXInLCBvdmVyOiBzb3J0UHJldHRpZXJDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRDb25maWcnLCBvdmVyOiBzb3J0RXNsaW50Q29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50SWdub3JlJyB9LFxuICB7IGtleTogJ25wbXBrZ2pzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbVBhY2thZ2VKc29uTGludENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1wYWNrYWdlanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVsZWFzZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZW1hcmtDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnc3R5bGVsaW50JyB9LFxuICB7IGtleTogJ2F2YScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QtanVuaXQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1zdGFyZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtb2NoYScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdueWMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYzgnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAndGFwJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ29jbGlmJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdyZXNvbHV0aW9ucycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvdmVycmlkZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RldkRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHNvcnRPYmplY3RCeUlkZW50LCB0cnVlKSB9LFxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIC8vIFRPRE86IG9ubHkgc29ydCBkZXB0aCA9IDJcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnYnVuZGxlZERlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdidW5kbGVEZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvblBhY2snLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvbkRlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdmbGF0JyB9LFxuICB7IGtleTogJ3BhY2thZ2VNYW5hZ2VyJyB9LFxuICB7IGtleTogJ2VuZ2luZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZW5naW5lU3RyaWN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2RldkVuZ2luZXMnLCBvdmVyOiBzb3J0RGV2RW5naW5lcyB9LFxuICB7IGtleTogJ3ZvbHRhJywgb3Zlcjogc29ydFZvbHRhIH0sXG4gIHsga2V5OiAnbGFuZ3VhZ2VOYW1lJyB9LFxuICB7IGtleTogJ29zJyB9LFxuICB7IGtleTogJ2NwdScgfSxcbiAgeyBrZXk6ICdwcmVmZXJHbG9iYWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHVibGlzaENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnaWNvbicgfSxcbiAgLyogdnNjb2RlICovIHtcbiAgICBrZXk6ICdiYWRnZXMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGJhZGdlKSA9PiBiYWRnZS5tYXAoc29ydFZTQ29kZUJhZGdlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2dhbGxlcnlCYW5uZXInLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3ByZXZpZXcnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ21hcmtkb3duJyB9LFxuICB7IGtleTogJ3BucG0nLCBvdmVyOiBzb3J0UG5wbUNvbmZpZyB9LFxuXVxuXG5jb25zdCBkZWZhdWx0U29ydE9yZGVyID0gZmllbGRzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KVxuY29uc3Qgb3ZlckZpZWxkcyA9IHBpcGUoXG4gIGZpZWxkc1xuICAgIC5tYXAoKHsga2V5LCBvdmVyIH0pID0+IChvdmVyID8gb3ZlclByb3BlcnR5KGtleSwgb3ZlcikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pXG5cbmZ1bmN0aW9uIGVkaXRTdHJpbmdKU09OKGpzb24sIG92ZXIpIHtcbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHsgaW5kZW50LCB0eXBlIH0gPSBkZXRlY3RJbmRlbnQoanNvbilcbiAgICBjb25zdCBlbmRDaGFyYWN0ZXJzID0ganNvbi5zbGljZSgtMSkgPT09ICdcXG4nID8gJ1xcbicgOiAnJ1xuICAgIGNvbnN0IG5ld2xpbmUgPSBkZXRlY3ROZXdsaW5lKGpzb24pXG4gICAganNvbiA9IEpTT04ucGFyc2UoanNvbilcblxuICAgIGxldCByZXN1bHQgPVxuICAgICAgSlNPTi5zdHJpbmdpZnkob3Zlcihqc29uKSwgbnVsbCwgdHlwZSA9PT0gJ3RhYicgPyAnXFx0JyA6IGluZGVudCkgK1xuICAgICAgZW5kQ2hhcmFjdGVyc1xuICAgIGlmIChuZXdsaW5lID09PSAnXFxyXFxuJykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcbi9nLCBuZXdsaW5lKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gb3Zlcihqc29uKVxufVxuXG5mdW5jdGlvbiBzb3J0UGFja2FnZUpzb24oanNvbklzaCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBlZGl0U3RyaW5nSlNPTihcbiAgICBqc29uSXNoLFxuICAgIG9uT2JqZWN0KChqc29uKSA9PiB7XG4gICAgICBsZXQgc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXIgfHwgZGVmYXVsdFNvcnRPcmRlclxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0T3JkZXIpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uKVxuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXlzID0gW10sIHB1YmxpY0tleXMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gW1xuICAnQHRzY29uZmlnL2J1bicsXG4gICdAdHNjb25maWcvbm9kZS1sdHMnLFxuICAnQHRzY29uZmlnL25vZGUtdHMnLFxuICAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZScsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgLy8gUmVhY3QgTmF0aXZlIG5lZWRzIE1ldHJvLWNvbXBhdGlibGUgc2V0dGluZ3MgKGpzeDogcmVhY3QtbmF0aXZlLCBub2RlIHJlc29sdXRpb24pLCB3aGljaFxuICAvLyBAdHNjb25maWcvYnVuIHdvdWxkIG92ZXJyaWRlIGV2ZW4gdGhvdWdoIHRoZSByZXBvIHVzZXMgQnVuIGFzIGl0cyBwYWNrYWdlIG1hbmFnZXIuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiAnQHRzY29uZmlnL2J1bi90c2NvbmZpZy5qc29uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnXTtcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtb2R1bGUgc3BlY2lmaWVyIGEgZ2VuZXJhdGVkIGNvbmZpZyBmaWxlIHNob3VsZCB1c2UgdG8gbG9hZCBhXG4gKiB3aWxsYm9vc3Rlci1jb25maWdzIGNvbmZpZyBwYWNrYWdlIHN1Y2ggYXMgYEB3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnYC5cbiAqXG4gKiBPdXRzaWRlIHdpbGxib29zdGVyLWNvbmZpZ3MgdGhpcyBpcyBzaW1wbHkgdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIG5hbWUuIEluc2lkZVxuICogd2lsbGJvb3N0ZXItY29uZmlncyB0aGUgcGFja2FnZSBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBhIGRlcGVuZGVuY3k6IHRoZVxuICogY29uZmlnIHBhY2thZ2VzIGltcG9ydCBvbmUgYW5vdGhlciAoZS5nLiBveGZtdC1jb25maWcncyBveGxpbnQuY29uZmlnLnRzXG4gKiBpbXBvcnRzIG94bGludC1jb25maWcgYW5kIHZpY2UgdmVyc2EpLCBzbyBhIGRlY2xhcmVkIGVkZ2Ugd291bGQgZm9ybSBhXG4gKiBkZXBlbmRlbmN5IGN5Y2xlIHRoYXQgbXVsdGktc2VtYW50aWMtcmVsZWFzZSBjYW5ub3QgdG9wb2xvZ2ljYWxseSBzb3J0LiBTaW5jZVxuICogdGhlIGVkZ2UgaXMgYWJzZW50LCBpc29sYXRlZCBpbnN0YWxscyBjYW5ub3QgcmVzb2x2ZSB0aGUgYmFyZSBwYWNrYWdlIG5hbWUsIHNvXG4gKiBpbXBvcnQgdGhlIGNvbW1pdHRlZCBgY29uZmlnLm1qc2AgYnVpbGQgb3V0cHV0IHRocm91Z2ggYSByZWxhdGl2ZSBwYXRoIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBjb25maWdQYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybiBjb25maWdQYWNrYWdlTmFtZTtcblxuICAvLyBlLmcuICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycgLT4gJ294bGludC1jb25maWcnLCB3aGljaCBpcyBpdHMgZGlyZWN0b3J5IHVuZGVyIGBwYWNrYWdlcy9gLlxuICBjb25zdCBjb25maWdQYWNrYWdlRGlyID0gY29uZmlnUGFja2FnZU5hbWUuc3BsaXQoJy8nKS5wb3AoKSA/PyAnJztcbiAgLy8gRGVyaXZlIHRoZSB3aWxsYm9vc3Rlci1jb25maWdzIHJvb3QgZnJvbSB0aGUgcGFja2FnZSBiZWluZyBnZW5lcmF0ZWQsIG5vdCBmcm9tIHRoZSBDTEkgZW50cnlcbiAgLy8gcGF0aDogYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxwa2c+YCBpcyBhIHN1cHBvcnRlZCBpbnZvY2F0aW9uIHdob3NlIGVudHJ5IGNvbmZpZyBpcyB0aGUgY2hpbGRcbiAgLy8gcGFja2FnZSByYXRoZXIgdGhhbiB0aGUgcmVwbyByb290LCBzbyByZWx5aW5nIG9uIHRoZSBlbnRyeSB3b3VsZCBlbWl0IGEgbmVzdGVkLCB1bnJlc29sdmFibGVcbiAgLy8gcGF0aCBmb3IgYSBkaXJlY3RseSB0YXJnZXRlZCBjb25maWcgcGFja2FnZS4gRXZlcnkgd2lsbGJvb3N0ZXItY29uZmlncyBwYWNrYWdlIGlzIGVpdGhlciB0aGVcbiAgLy8gcm9vdCBvciBhIGRpcmVjdCBjaGlsZCB1bmRlciBgcGFja2FnZXMvYCwgc28gdGhlIHJvb3QgaXMgdGhlIHBhY2thZ2UgZGlyIGl0c2VsZiBvciBpdHMgZ3JhbmRwYXJlbnQuXG4gIGNvbnN0IHJlcG9Sb290RGlyUGF0aCA9IGNvbmZpZy5pc1Jvb3QgPyBjb25maWcuZGlyUGF0aCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gIGNvbnN0IGxvY2FsRW50cnkgPSBwYXRoLnJlc29sdmUocmVwb1Jvb3REaXJQYXRoLCAncGFja2FnZXMnLCBjb25maWdQYWNrYWdlRGlyLCAnY29uZmlnLm1qcycpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBsb2NhbEVudHJ5KTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJlxuICAgICFjb25maWcuaXNSb290ICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5wcml2YXRlICE9PSB0cnVlICYmXG4gICAgQXJyYXkuaXNBcnJheShjb25maWcucGFja2FnZUpzb24/LmZpbGVzKSAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbi5maWxlcy5sZW5ndGggPiAwXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvciwgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuLi91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMsIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcbmltcG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsXG4gIGhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybixcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbn0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5pbXBvcnQgeyBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgfSBmcm9tICcuL2J1bmZpZy5qcyc7XG5cbmNvbnN0IG94bGludERlcHMgPSBbJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLCAnb3hmbXQnLCAnb3hsaW50JywgJ294bGludC10c2dvbGludCddO1xuY29uc3QgdHlwZXNjcmlwdERlcGVuZGVuY3kgPSAndHlwZXNjcmlwdCc7XG4vLyBUeXBlU2NyaXB0IDcncyBgdHlwZXNjcmlwdGAgcGFja2FnZSBpcyB0aGUgdHNnbyBuYXRpdmUgY29tcGlsZXIgYW5kIGV4cG9zZXMgbm9cbi8vIHByb2dyYW1tYXRpYyBBUEkuIE5leHQuanMncyBidWlsZC10aW1lIGB2ZXJpZnlUeXBlU2NyaXB0U2V0dXBgIG5lZWRzIHRoYXQgQVBJLCBzb1xuLy8gYG5leHQgYnVpbGRgIGZhaWxzIChcInRyeWluZyB0byB1c2UgVHlwZVNjcmlwdCBidXQgZG8gbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBhY2thZ2UocylcIilcbi8vIHdpdGggb25seSBgdHlwZXNjcmlwdGAgdjcgaW5zdGFsbGVkLiBOZXh0LmpzIHJlc29sdmVzIHRoZSB0c2dvIGJpbmFyeSB0aHJvdWdoIHRoZVxuLy8gc2VwYXJhdGUgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCBwYWNrYWdlLCBzbyBOZXh0LmpzLWZhbWlseSByZXBvcyBtdXN0IGluc3RhbGxcbi8vIGJvdGg7IG90aGVyIHJlcG9zIG9ubHkgbmVlZCBgdHlwZXNjcmlwdGAgZm9yIGB0c2NgIHR5cGVjaGVja3MuXG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3QgbGVmdGhvb2tEZXBlbmRlbmN5ID0gJ2xlZnRob29rJztcbmNvbnN0IG1hbmFnZWREZXBlbmRlbmN5TmFtZXMgPSBuZXcgU2V0KFtcbiAgd2JEZXBlbmRlbmN5LFxuICBidWlsZFRzRGVwZW5kZW5jeSxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0RGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSxcbiAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgLy8gTWl4ZWQgQHR5cGVzL2J1biB2ZXJzaW9ucyBhY3Jvc3MgYSBtb25vcmVwbyBsb2FkIHR3byBidW4tdHlwZXMgY29waWVzLCB3aGljaFxuICAvLyBicmVha3MgZ2xvYmFsIGludGVyZmFjZSBtZXJnaW5nIChlLmcuIFJlc3BvbnNlL0hlYWRlcnMpIGR1cmluZyB0eXBlIGNoZWNraW5nLlxuICAnQHR5cGVzL2J1bicsXG4gIC4uLm94bGludERlcHMsXG5dKTtcbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgcGFja2FnZUFnZUdhdGVNcyA9IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyAqIDEwMDA7XG5jb25zdCBucG1QYWNrYWdlVGltZXNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcblxudHlwZSBXcml0YWJsZVBhY2thZ2VKc29uID0gU2V0UmVxdWlyZWQ8XG4gIFBhY2thZ2VKc29uLFxuICAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnXG4+O1xuXG5pbnRlcmZhY2UgRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBkZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdvcmtlclR5cGVzU2NyaXB0RXJyb3IgPSBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKGNvbmZpZyk7XG4gIGlmICh3b3JrZXJUeXBlc1NjcmlwdEVycm9yKSB0aHJvdyBuZXcgRXJyb3Iod29ya2VyVHlwZXNTY3JpcHRFcnJvcik7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25PYmogPSBhd2FpdCByZWFkUGFja2FnZUpzb24oZmlsZVBhdGgpO1xuICB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IGVuc3VyZVRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIGNvbnN0IGRlcGVuZGVuY3lVcGRhdGVzID0gYXdhaXQgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgLy8gT24gYSBmaXJzdCBydW4gdGhlcmUgaXMgbm8gbWFuaWZlc3QgZm9yIGBidW4gYWRkYCB0byB1cGRhdGUgcmVsaWFibHkuIFdyaXRlIHRoZSByZXNvbHZlZFxuICAvLyBkZXBlbmRlbmN5IHZlcnNpb25zIGludG8gdGhlIG5ldyBtYW5pZmVzdCBkaXJlY3RseTsgdGhlIGZpbmFsIHJlcG9zaXRvcnktd2lkZSBgYnVuIGluc3RhbGxgXG4gIC8vIHRoZW4gaW5zdGFsbHMgdGhlbSBhbmQgcmVtYWlucyB0aGUgYXV0aG9yaXRhdGl2ZSBmYWlsdXJlIGNoZWNrLlxuICBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgZGVwZW5kZW5jeVVwZGF0ZXMsXG4gICAgc2tpcEFkZGluZ0RlcHMgfHwgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uXG4gICk7XG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcbiAgcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG5cbiAgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIC8vIFlhcm4gcmVhZHMgcGFja2FnZS5qc29uIGZyb20gZGlzayBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciBgeWFybiBhZGQgLURgXG4gIC8vIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZGVwZW5kZW5jeSwgc28gdGhpcyB3cml0ZSBtdXN0IGZpbmlzaFxuICAvLyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZXMgYmVsb3cuIEtlZXAgdGhpcyBnZW5lcmF0ZWRcbiAgLy8gZmlsZSBzb3J0ZWQgZXZlbiB3aGVuIHdlIGxhdGVyIHJ1biB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBmb3JtYXR0ZXIgc28gYVxuICAvLyBtaWQtcnVuIGludGVycnVwdGlvbiBuZXZlciBsZWF2ZXMgcGFja2FnZS5qc29uIGluIGEgcGFydGlhbGx5IG1hbmFnZWQgb3JkZXIuXG4gIC8vIEEgcmVmdXNlZCB3cml0ZSAoZS5nLiBhIHN5bWxpbmtlZCBwYWNrYWdlLmpzb24pIG11c3QgYWxzbyBhYm9ydCB0aGUgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb25cbiAgLy8gYmVsb3c6IGBidW4gYWRkYCBmb2xsb3dzIHRoZSBzeW1saW5rIGFuZCB3b3VsZCBtb2RpZnkgdGhlIGZpbGUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpKSkgcmV0dXJuO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gICAgLy8gQSBuZXdseSBjcmVhdGVkIG1hbmlmZXN0IGlzIGFscmVhZHkgc29ydGVkIGJ5IHdiZnkncyBidW5kbGVkIHNlcmlhbGl6ZXI7IHRoZSB0YXJnZXQgZm9ybWF0dGVyXG4gICAgLy8gaXMgYXZhaWxhYmxlIHdpdGhvdXQgYW4gZXh0cmEgZmV0Y2ggb25seSB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgd2l0aCBwYWNrYWdlLmpzb24uXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZywgZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogc3RyaW5nIHtcbiAgLy8gZnNVdGlsLmdlbmVyYXRlRmlsZSgpIG5vcm1hbGl6ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIGtlZXAgdGhlIHNlcmlhbGl6ZXJcbiAgLy8gZm9jdXNlZCBvbiB0aGUgSlNPTiBwYXlsb2FkIGl0c2VsZi5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihqc29uT2JqKSwgdW5kZWZpbmVkLCAyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgbGV0IGpzb25PYmo6IFBhY2thZ2VKc29uID0ge307XG4gIHRyeSB7XG4gICAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRG9jdW1lbnRhdGlvbi1vbmx5IHJlcG9zaXRvcmllcyBoYXZlIG5vIG1hbmlmZXN0IG9uIHRoZWlyIGZpcnN0IHdiZnkgcnVuLiBTdGFydGluZyBmcm9tIGFuXG4gICAgLy8gZW1wdHkgb2JqZWN0IGxldHMgdGhlIG5vcm1hbCBnZW5lcmF0b3IgZXN0YWJsaXNoIHRoZSBzYW1lIG1hbmFnZWQgYmFzZWxpbmUgYXMgZXZlcnkgb3RoZXJcbiAgICAvLyByZXBvc2l0b3J5OyBtYWxmb3JtZWQgb3IgdW5yZWFkYWJsZSBleGlzdGluZyBtYW5pZmVzdHMgbXVzdCBzdGlsbCBmYWlsIGxvdWRseS5cbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHRocm93IGVycm9yO1xuICB9XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5mdW5jdGlvbiBwcnVuZUNhcGFiaWxpdHlEZXBlbmRlbnRDb21waWxlckRlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgLy8gUnVuIGJlZm9yZSBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIHJlLWFkZHMgdHNnbyBvbmx5IGZvciBjdXJyZW50IE5leHQuanMtZmFtaWx5IHJlcG9zaXRvcmllcy5cbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGlmICghY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAganNvbk9iai5zY3JpcHRzID0geyAuLi5qc29uT2JqLnNjcmlwdHMsIC4uLmdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykgfTtcbn1cblxuLyoqXG4gKiBLZWVwcyB0aGUgcHJvamVjdCdzIG93biBzZWdtZW50cyBpbiBvcmRlciwgcmVwbGFjaW5nIHRoZSBmaXJzdCBtYW5hZ2VkIGdlbi1jb2RlIHNwZWxsaW5nIHdpdGhcbiAqIGBidW4gd2IgZ2VuLWNvZGVgIGFuZCBkcm9wcGluZyBsYXRlciBkdXBsaWNhdGVzLiBBcHBlbmRzIGdlbmVyYXRpb24gb25seSB3aGVuIHRoZSBzY3JpcHRcbiAqIGNvbnRhaW5lZCBub25lLCBzbyBub3RoaW5nIGlzIHJlb3JkZXJlZC5cbiAqL1xuZnVuY3Rpb24gcmVidWlsZFBvc3RpbnN0YWxsU2VnbWVudHMoc2VnbWVudHM6IHN0cmluZ1tdLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogc3RyaW5nW10ge1xuICBjb25zdCBraW5kcyA9IHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMsIHRydWUpKTtcbiAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIGN1c3RvbWl6ZWQgZ2VuLWNvZGUgYWxyZWFkeSBnZW5lcmF0ZXM7IGFkZGluZyBhbm90aGVyIGludm9jYXRpb24gd291bGQgcnVuIGV2ZXJ5XG4gIC8vIGdlbmVyYXRvciB0d2ljZS5cbiAgbGV0IGdlbmVyYXRpb25QbGFjZWQgPSBraW5kcy5pbmNsdWRlcygnZ2VuQ29kZVdyYXBwZXInKTtcbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgc2VnbWVudF0gb2Ygc2VnbWVudHMuZW50cmllcygpKSB7XG4gICAgY29uc3Qga2luZCA9IGtpbmRzW2luZGV4XTtcbiAgICBpZiAoa2luZCA9PT0gJ2N1c3RvbScgfHwga2luZCA9PT0gJ2dlbkNvZGVXcmFwcGVyJykge1xuICAgICAgcmVzdWx0LnB1c2goc2VnbWVudCk7XG4gICAgfSBlbHNlIGlmICghZ2VuZXJhdGlvblBsYWNlZCkge1xuICAgICAgcmVzdWx0LnB1c2goJ2J1biB3YiBnZW4tY29kZScpO1xuICAgICAgZ2VuZXJhdGlvblBsYWNlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmICghZ2VuZXJhdGlvblBsYWNlZCkgcmVzdWx0LnB1c2goJ2J1biB3YiBnZW4tY29kZScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgbWFuYWdlZCBnZW4tY29kZSBzZWdtZW50cyB3aGlsZSBrZWVwaW5nIHRoZSBmaXJzdCBzZWdtZW50J3MgcG9zaXRpb24gc28gYSBjdXN0b21cbiAqIHN0ZXAgdGhhdCBjb25zdW1lcyBnZW5lcmF0ZWQgb3V0cHV0IHN0aWxsIHJ1bnMgYWZ0ZXIgaXQuIFJldHVybnMgd2l0aG91dCBjaGFuZ2luZyBhblxuICogdW5wYXJzZWFibGUgc2NyaXB0LlxuICovXG5mdW5jdGlvbiB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLCBtYW5hZ2VzV29ya2VyVHlwZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgLy8gYGJ1biB3YiBnZW4tY29kZWAgcmVnZW5lcmF0ZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBpdHNlbGYsIHNvIGEgcGFja2FnZSB3aXRoIGFcbiAgLy8gY29kZS1nZW5lcmF0aW9uIG9yIHdvcmtlci10eXBlcyBwaXBlbGluZSBnZXRzIG9uZSBtYW5hZ2VkIGdlbmVyYXRpb24gc2VnbWVudC5cbiAgaWYgKHNjcmlwdHNbJ2dlbi1jb2RlJ10gfHwgbWFuYWdlc1dvcmtlclR5cGVzKSB7XG4gICAgLy8gUHJvamVjdC1vd25lZCBzdGVwcyBhcmUgbmV2ZXIgZHJvcHBlZCwgYW5kIHRoZWlyIFBPU0lUSU9OIHJlbGF0aXZlIHRvIGdlbmVyYXRpb24gaXMgcHJlc2VydmVkOiBhIHN0ZXBcbiAgICAvLyBiZWZvcmUgaXQgbWF5IHByb2R1Y2UgYHdyYW5nbGVyIHR5cGVzYCcgaW5wdXRzIChhIHdyYW5nbGVyIGNvbmZpZywgYC5kZXYudmFyc2ApLCB3aGlsZSBvbmUgYWZ0ZXIgaXQgbWF5XG4gICAgLy8gY29uc3VtZSB0aGUgZ2VuZXJhdGVkIHR5cGVzLiBTbyB0aGUgbWFuYWdlZCBnZW5lcmF0aW9uIHJlcGxhY2VzIHRoZSBmaXJzdCBtYW5hZ2VkIHNlZ21lbnQgaW4gcGxhY2UsIGFuZCBpc1xuICAgIC8vIGFwcGVuZGVkIG9ubHkgd2hlbiB0aGUgc2NyaXB0IGhhZCBub25lLiBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIGdlbmVyYXRpb24gcGx1cyB0aGUgcHJvamVjdCdzIG93biBzdGVwcywgc28gaXQgc3VwcHJlc3NlcyB0aGUgcmVwbGFjZW1lbnQgZW50aXJlbHkuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBzY3JpcHRzLnBvc3RpbnN0YWxsID09PSB1bmRlZmluZWQgPyBbXSA6IHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCk7XG4gICAgY29uc3Qga2VwdFNlZ21lbnRzID0gc2VnbWVudHMgJiYgcmVidWlsZFBvc3RpbnN0YWxsU2VnbWVudHMoc2VnbWVudHMsIHNjcmlwdHMpO1xuICAgIGlmIChrZXB0U2VnbWVudHMpIHtcbiAgICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPSBrZXB0U2VnbWVudHMuam9pbignICYmICcpO1xuICAgIH1cbiAgICAvLyBBbnkgb3RoZXIgdW5wYXJzZWFibGUgcG9zdGluc3RhbGwgaXMgbGVmdCB0byBhIGh1bWFuIHJhdGhlciB0aGFuIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8RGVwZW5kZW5jeVVwZGF0ZXM+IHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIGlmIChcbiAgICBoYXNKYXZhICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllcicpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAvLyBMZWZ0aG9vayBnZW5lcmF0aW9uIGlzIGJlc3QtZWZmb3J0IGFuZCAubGVmdGhvb2sgaXMgYWJzZW50IGZyb20gRG9ja2VyIGJ1aWxkIGNvbnRleHRzLCBzbyBhXG4gICAgLy8gbWlzc2luZyBub3JtYWxpemVyIGlzIHZhbGlkLiBPbmNlIHByZXNlbnQsIGl0cyBmYWlsdXJlIG11c3QgYWJvcnQgaW5zdGFsbCByYXRoZXIgdGhhbiBsZWF2ZSBhXG4gICAgLy8gR3VhcmQtcGlubmVkIGxvY2tmaWxlIGJlaGluZDsga2VlcCB0aGF0IGZhaWwtZmFzdCBncm91cGluZyBleHBsaWNpdCBiZWZvcmUgYW55IHdvcmtzcGFjZSBidWlsZC5cbiAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9XG4gICAgICAnKGJ1biBsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUpICYmICh0ZXN0ICEgLWYgLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2ggfHwgYmFzaCAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCknO1xuICAgIC8vIFdoZW4gQHdpbGxib29zdGVyL3diIGlzIGEgd29ya3NwYWNlIG9mIHRoaXMgcmVwb3NpdG9yeSwgdGhlIGdlbmVyYXRlZCBgYnVuIHdiIOKApmAgc2NyaXB0cyBydW5cbiAgICAvLyBpdHMgZ2l0aWdub3JlZCBkaXN0IGJ1aWxkIChiaW4vaW5kZXguanMgaW1wb3J0cyAuLi9kaXN0L2luZGV4LmpzKSwgc28gYSBmcmVzaCBjaGVja291dCBtdXN0XG4gICAgLy8gYnVpbGQgaXQgZHVyaW5nIGluc3RhbGw7IHJlZ2lzdHJ5IGluc3RhbGxzIHNoaXAgYSBwcmVidWlsdCBkaXN0IGFuZCBuZWVkIG5vIGV4dHJhIHN0ZXAuXG4gICAgY29uc3Qgd2JXb3Jrc3BhY2VEaXIgPSBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS5nZXQod2JEZXBlbmRlbmN5KTtcbiAgICBpZiAod2JXb3Jrc3BhY2VEaXIpIHtcbiAgICAgIC8vIFNpbmdsZSBxdW90ZXMgKHdpdGggZW1iZWRkZWQgcXVvdGVzIGVzY2FwZWQpIHByZXZlbnQgdGhlIHNoZWxsIGZyb20gZXhwYW5kaW5nIGAkKOKApilgIG9yXG4gICAgICAvLyB2YXJpYWJsZXMgdGhhdCBhIGhvc3RpbGUgZGlyZWN0b3J5IG5hbWUgY291bGQgc211Z2dsZSBpbnRvIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LlxuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgKz0gYCAmJiBidW4gcnVuIC0tY3dkICcke3diV29ya3NwYWNlRGlyLnJlcGxhY2VBbGwoXCInXCIsIFN0cmluZy5yYXdgJ1xcJydgKX0nIGJ1aWxkYDtcbiAgICB9XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2gobGVmdGhvb2tEZXBlbmRlbmN5KTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShqc29uT2JqLnNjcmlwdHMucmVsZWFzZSkpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ107XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0UnVudGltZSkge1xuICAgICAgICAvLyBSdW50aW1lIGltcG9ydHMgbmVlZCB0aGUgc3RhbmRhbG9uZSBwYWNrYWdlIGFmdGVyIERvY2tlciBwcnVuaW5nIHJlbW92ZXMgZGV2RGVwZW5kZW5jaWVzLlxuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/PVxuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz9cbiAgICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddID8/XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ3BsYXl3cmlnaHQnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uIFlhcm4gdjEncyBvYmplY3QgZm9ybSBrZWVwcyBpdHNcbiAgICAgIC8vIGRlY2xhcmVkIHBhdHRlcm5zICh3b3Jrc3BhY2VzLnBhY2thZ2VzKTsgb25seSBleHRyYXMgc3VjaCBhcyBub2hvaXN0IGFyZSBkcm9wcGVkLlxuICAgICAgLy8gRm9yY2UgYHBhY2thZ2VzLypgIG9ubHkgd2hlbiBpdCBhY3R1YWxseSBtYXRjaGVzIGEgd29ya3NwYWNlIG1hbmlmZXN0OiBhbiBhcHBzLyotb25seVxuICAgICAgLy8gbW9ub3JlcG8gbXVzdCBub3QgZ2V0IGEgbmV2ZXItbWF0Y2hpbmcgcGF0dGVybiBhcHBlbmRlZCB0byBpdHMgZGVjbGFyYXRpb24uIEFcbiAgICAgIC8vIGJhc2VsaW5lLXNlZWRpbmcgZGVjbGFyYXRpb24gbmVlZHMgbm8gZm9yY2VkIHBhdHRlcm4gYXQgYWxsIOKAlCB0aGUgc2VlZGVkIGJhc2VsaW5lXG4gICAgICAvLyAoYCovKmAgb3IgYCoqYCkgYWxyZWFkeSBjb3ZlcnMgcGFja2FnZXMvKi4gVGhlIGZvcmNlZCBwYXR0ZXJuIGlzIFBSRVBFTkRFRDogQnVuXG4gICAgICAvLyBldmFsdWF0ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHNlcXVlbnRpYWxseSwgc28gYSBwb3NpdGl2ZSBwYXR0ZXJuIHBsYWNlZCBhZnRlciBhIHVzZXJcbiAgICAgIC8vIG5lZ2F0aW9uIHdvdWxkIHJlLWluY2x1ZGUgdGhlIG5lZ2F0ZWQgcGFja2FnZXMuIEEgZGVjbGFyYXRpb24gdGhhdCBhbHJlYWR5IGNvdmVyc1xuICAgICAgLy8gcGFja2FnZXMvKiB1bmRlciBub3JtYWxpemF0aW9uIChlLmcuIGAuL3BhY2thZ2VzLypgKSBpcyBrZXB0IHZlcmJhdGltOiBmb3JjaW5nIGEgdGV4dHVhbFxuICAgICAgLy8gYHBhY2thZ2VzLypgIG5leHQgdG8gaXQgd291bGQgcGVyc2lzdCBhIGR1cGxpY2F0ZSBlcXVpdmFsZW50IHBhdHRlcm4uXG4gICAgICBjb25zdCBmb3JjZWRQYXR0ZXJucyA9XG4gICAgICAgICFoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgIWhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybihqc29uT2JqLndvcmtzcGFjZXMpICYmXG4gICAgICAgIGZnLmdsb2JTeW5jKCdwYWNrYWdlcy8qL3BhY2thZ2UuanNvbicsIHsgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddIH0pLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFsncGFja2FnZXMvKiddXG4gICAgICAgICAgOiBbXTtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IG1lcmdlLmFsbChbZm9yY2VkUGF0dGVybnMsIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMoanNvbk9iai53b3Jrc3BhY2VzKV0sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgfSk7XG4gICAgICAvLyBCb3RoIGlucHV0cyBjYW4gYmUgZW1wdHkgKGUuZy4gcGFja2FnZXMvcGFja2FnZS5qc29uIHdpdGhvdXQgYW55IHBhY2thZ2VzLyovcGFja2FnZS5qc29uXG4gICAgICAvLyBhbmQgbm8gZGVjbGFyZWQgd29ya3NwYWNlcyk7IGRvIG5vdCBwZXJzaXN0IGEgbWVhbmluZ2xlc3MgYHdvcmtzcGFjZXM6IFtdYC5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykgJiYganNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaXhlcnMvbmV4dENvbmZpZy50cyBlbmFibGVzIGByZWFjdENvbXBpbGVyOiB0cnVlYCBmb3IgZXZlcnkgTmV4dC5qcyBwcm9qZWN0LCBhbmQgTmV4dC5qc1xuICAvLyByZXNvbHZlcyBgYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyYCBhdCBidWlsZCB0aW1lIHdoZW4gUmVhY3QgQ29tcGlsZXIgaXMgb24uIEFkZCBpdCBoZXJlIHNvXG4gIC8vIHRoZSBtYW5hZ2VkIG5leHQuY29uZmlnIG5ldmVyIGJyZWFrcyBgbmV4dCBidWlsZGAgd2l0aCBhbiB1bnJlc29sdmVkLXBhY2thZ2UgZXJyb3IuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyk7XG4gIH1cblxuICAvLyBgd2IgdmVyaWZ5IC0tZnVsbGAgYXVkaXRzIGV2ZXJ5IGAqLnNsaWRldi5tZGAgZGVjayB3aXRoIHNsaWRldi1jaGVjaywgc28gdGhlIGNoZWNrZXIgaGFzIHRvIGJlXG4gIC8vIGluc3RhbGxlZCB3aGVyZXZlciBhIGRlY2sgbGl2ZXMuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TbGlkZXZNZCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzbGlkZXYtY2hlY2snKTtcbiAgfVxuXG4gIGlmICghaXNXYlBhY2thZ2UoanNvbk9iaikpIHtcbiAgICAvLyBBIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgZGVwZW5kcyBvbiB0aGUgd2IgZGV2ZWxvcGVkIGluIHRoaXMgcmVwb3NpdG9yeSAoZS5nLlxuICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBpdHNlbGYpOyBpbnN0YWxsaW5nIHRoZSBsYXRlc3QgcmVnaXN0cnkgcmVsZWFzZSBvdmVyIGl0IHdvdWxkIHNpbGVudGx5XG4gICAgLy8gcmVwbGFjZSB0aGUgbG9jYWwgYnVpbGQgd2l0aCBhIHB1Ymxpc2hlZCBvbmUsIHNvIGxlYXZlIHN1Y2ggYSBkZWNsYXJhdGlvbiB1bnRvdWNoZWQuXG4gICAgY29uc3Qgd2JTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1t3YkRlcGVuZGVuY3ldID8/IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV07XG4gICAgaWYgKCF3YlNwZWNpZmllcj8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gYnVpbGQtdHMgb3ducyBUeXBlU2NyaXB0IGV4ZWN1dGlvbiBhbmQgZGVjbGFyYXRpb24gZW1pdC4gd2JmeSBtdXN0IGFsd2F5c1xuICAvLyBrZWVwIGV4aXN0aW5nIGJ1aWxkLXRzIHVzZXJzIGN1cnJlbnQgYmVjYXVzZSBvbGRlciByZWxlYXNlcyBjYW4gZW1pdCAuZC50c1xuICAvLyBmaWxlcyBhdCBwYXRocyB0aGF0IG5vIGxvbmdlciBtYXRjaCBwYWNrYWdlIGV4cG9ydHMuXG4gIGlmIChcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBPYmplY3QudmFsdWVzKGpzb25PYmouc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiBzY3JpcHQ/LmluY2x1ZGVzKGJ1aWxkVHNEZXBlbmRlbmN5KSlcbiAgKSB7XG4gICAgaWYgKHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gIH1cblxuICBjb25zdCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpID8gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykgOiBbXTtcbiAgYXdhaXQgcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaiwgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4udHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSwgc28gaXQgaXNcbiAgICAvLyBub3cgdGhlIG1hbmFnZWQgY29tcGlsZXIgZm9yIGV2ZXJ5IFR5cGVTY3JpcHQgcmVwbyAodHlwZWNoZWNraW5nIHJ1bnMgYHRzY2ApLlxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHREZXBlbmRlbmN5KTtcbiAgICAvLyBOZXh0LmpzJ3MgYG5leHQgYnVpbGRgIGluc3BlY3RzIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIHRvIHJ1biBpdHMgdHlwZVxuICAgIC8vIGNoZWNrOyB0aGUgYHR5cGVzY3JpcHRgIHY3IHBhY2thZ2UgYWxvbmUgbGFja3MgdGhlIEFQSSBuZXh0IG5lZWRzLCBzbyBrZWVwIGJvdGhcbiAgICAvLyBpbnN0YWxsZWQgZm9yIE5leHQuanMtZmFtaWx5IHJlcG9zLiBTZWUgdGhlIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgY29tbWVudCBhYm92ZS5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpO1xuICAgIH1cbiAgICAvLyBSZWFjdCBOYXRpdmUgcmVsaWVzIG9uIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUncyBhbWJpZW50IHR5cGVzIGluc3RlYWQgb2YgQHR5cGVzL2J1bi5cbiAgICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2Uoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL1xcYig/OmJ1bnh8bnB4fHBucG1cXHMrZGx4fHlhcm5cXHMrZGx4KVxccytzZW1hbnRpYy1yZWxlYXNlKD86QFxcUyspP1xcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCBrZWVwQXNSdW50aW1lXSBvZiBbXG4gICAgW3diRGVwZW5kZW5jeSwgc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gICAgW2J1aWxkVHNEZXBlbmRlbmN5LCBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICBdIGFzIGNvbnN0KSB7XG4gICAgaWYgKGtlZXBBc1J1bnRpbWUpIHtcbiAgICAgIGNvbnN0IGRldlZlcnNpb24gPSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZGV2VmVyc2lvbikgY29udGludWU7XG4gICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFydW50aW1lVmVyc2lvbiB8fCBpc05ld2VyUGFja2FnZVZlcnNpb24oZGV2VmVyc2lvbiwgcnVudGltZVZlcnNpb24pKSB7XG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZGV2VmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9IGVsc2UgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSB7XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBpbWFnZXMgcnVuIG1pZ3JhdGlvbnMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsIGp1c3QgYXMgcGFja2FnZSBtYW5hZ2Vyc1xuICAvLyBydW4gcG9zdGluc3RhbGwgZHVyaW5nIHByb2R1Y3Rpb24gaW5zdGFsbHMsIHNvIGJvdGggZW50cnkgcG9pbnRzIG11c3QgcmV0YWluIHRoZSB3YiBiaW5hcnkuXG4gIC8vIEtlZXAgdGhlIHdvcmQgbWF0Y2ggY29uc2VydmF0aXZlOiBzdXBwb3J0ZWQgY3VzdG9tIHdyYXBwZXJzIGNhbiBwdXQgd2IgaW5zaWRlIHNoZWxsIGxvb3BzIHRoYXRcbiAgLy8gdGhlIGNvbW1hbmQtcG9zaXRpb24gcGFyc2VyIGNhbm5vdCBjbGFzc2lmeSwgd2hpbGUgYSBmYWxzZSBwb3NpdGl2ZSBvbmx5IHJldGFpbnMgdGhlIENMSS5cbiAgcmV0dXJuIFtqc29uT2JqLnNjcmlwdHM/LnBvc3RpbnN0YWxsLCBqc29uT2JqLnNjcmlwdHM/LlsnZGItbWlncmF0ZSddXS5zb21lKFxuICAgIChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIC9cXGJ3YlxcYi91LnRlc3Qoc2NyaXB0KVxuICApO1xufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgY29uc3QgcHJpc21hID0ganNvbk9iai5wcmlzbWEgYXMgeyBzZWVkPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhwcmlzbWE/LnNlZWQpIHx8IGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoanNvbk9iai5zY3JpcHRzPy5zZWVkKTtcbn1cblxuZnVuY3Rpb24gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhzZWVkQ29tbWFuZDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIERvY2tlciBpbWFnZXMgcnVuIHNlZWQgc2NyaXB0cyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCxcbiAgLy8gc28gVHlwZVNjcmlwdCBzZWVkIHJ1bm5lcnMgbXVzdCByZW1haW4gYXZhaWxhYmxlIGF0IHJ1bnRpbWUuXG4gIHJldHVybiB0eXBlb2Ygc2VlZENvbW1hbmQgPT09ICdzdHJpbmcnICYmIC8oPzwhW1xcdy1dKWJ1aWxkLXRzKD8hW1xcdy1dKS91LnRlc3Qoc2VlZENvbW1hbmQpO1xufVxuXG5jb25zdCBkZXBlbmRlbmN5RGVjbGFyYXRpb25TZWN0aW9ucyA9IFtcbiAgJ2RlcGVuZGVuY2llcycsXG4gICdkZXZEZXBlbmRlbmNpZXMnLFxuICAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLFxuICAncGVlckRlcGVuZGVuY2llcycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIEZvcmNlcyBzdG9yZS1pbmNvbXBhdGlibGUgcGFja2FnZXMgdG8gc3RheSBwcm9qZWN0LWxvY2FsIHdoZW4gdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBlbmFibGVzXG4gKiBCdW4ncyBnbG9iYWwgc3RvcmU6IGBjaGFrcmEgdHlwZWdlbmAgKHJ1biBieSBgd2IgZ2VuLWNvZGVgKVxuICogd3JpdGVzIGdlbmVyYXRlZCB0eXBlcyBpbnRvIHRoZSBpbnN0YWxsZWQgQGNoYWtyYS11aS9yZWFjdCBwYWNrYWdlLCB3aGljaCB3b3VsZCBvdGhlcndpc2VcbiAqIG11dGF0ZSB0aGUgbWFjaGluZS13aWRlIHN0b3JlIHNoYXJlZCBhY3Jvc3MgcmVwb3NpdG9yaWVzLCBhbmQgZHJpenpsZS1raXQgcmVxdWlyZXMgZHJpenpsZS1vcm1cbiAqIHdpdGhvdXQgZGVjbGFyaW5nIGl0LCB3aGljaCB0aGUgc3RvcmUgcmVhbHBhdGggcGxhY2VzIGJleW9uZCBhIHBsYWluIG5vZGVfbW9kdWxlcyB3YWxrLXVwLlxuICogTGlzdGluZyB0aGVtIGluIGB0cnVzdGVkRGVwZW5kZW5jaWVzYCBtYWtlcyBCdW4gbWF0ZXJpYWxpemUgYSBwZXItcHJvamVjdCBjb3B5IHVuZGVyXG4gKiBgbm9kZV9tb2R1bGVzLy5idW4vYCwgd2hvc2Ugc2libGluZyBgbm9kZV9tb2R1bGVzLy5idW4vbm9kZV9tb2R1bGVzL2AgbGlua3MgZXZlcnkgaW5zdGFsbGVkXG4gKiBwYWNrYWdlIGFuZCB0aGVyZWZvcmUgcmVzb2x2ZXMgdGhlIHVuZGVjbGFyZWQgcmVxdWlyZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEJ1biBjb25zdWx0cyB0cnVzdGVkRGVwZW5kZW5jaWVzIGluIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIHBhY2thZ2UuanNvbiBvbmx5LCBzbyB0aGUgbGlzdCBpc1xuICAvLyBtYW5hZ2VkIHRoZXJlIGFuZCBtdXN0IGNvdmVyIGRlcGVuZGVuY2llcyBkZWNsYXJlZCBhbnl3aGVyZSBpbiB0aGUgcmVwb3NpdG9yeS5cbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG4gIGNvbnN0IGJ1bkpzb25PYmogPSBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb24gJiB7IHRydXN0ZWREZXBlbmRlbmNpZXM/OiBzdHJpbmdbXSB9O1xuICAvLyBCdW4gaW5zdGFsbHMgb3B0aW9uYWwgYW5kIHBlZXIgZGVwZW5kZW5jaWVzIGJ5IGRlZmF1bHQsIHNvIGFsbCBkZWNsYXJhdGlvbiBzZWN0aW9ucyBjb3VudC5cbiAgLy8gRXZlcnkgZGVjbGFyZWQgcmFuZ2UgaXMga2VwdCBwZXIgcGFja2FnZTogYSByb290IGRlY2xhcmF0aW9uIG11c3Qgbm90IG1hc2sgYSB3b3Jrc3BhY2Ugb25lXG4gIC8vIChlLmcuIHJvb3QgQGNoYWtyYS11aS9jbGkgdjIgYWxvbmdzaWRlIGEgd29ya3NwYWNlIG9uIHYzKS5cbiAgY29uc3QgZGVjbGFyZWREZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGNvbnN0IGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzID0gKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBkZXBlbmRlbmN5RGVjbGFyYXRpb25TZWN0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHZlcnNpb25SYW5nZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUpzb25bc2VjdGlvbl0gPz8ge30pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmVyc2lvblJhbmdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25SYW5nZXMgPSBkZWNsYXJlZERlcGVuZGVuY2llcy5nZXQoZGVwZW5kZW5jeU5hbWUpO1xuICAgICAgICAgIGlmICh2ZXJzaW9uUmFuZ2VzKSB7XG4gICAgICAgICAgICB2ZXJzaW9uUmFuZ2VzLnB1c2godmVyc2lvblJhbmdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVjbGFyZWREZXBlbmRlbmNpZXMuc2V0KGRlcGVuZGVuY3lOYW1lLCBbdmVyc2lvblJhbmdlXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBhZGREZWNsYXJlZERlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhjb25maWcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKFxuICAgICAgICBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb25cbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgdW5yZWFkYWJsZSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uXG4gICAgfVxuICB9XG4gIC8vIE9ubHkgQGNoYWtyYS11aS9jbGkgdjMncyBgY2hha3JhIHR5cGVnZW5gIHdyaXRlcyBpbnRvIHRoZSBpbnN0YWxsZWQgQGNoYWtyYS11aS9yZWFjdDtcbiAgLy8gdjIncyBgY2hha3JhLWNsaSB0b2tlbnNgIHdyaXRlcyBpbnRvIEBjaGFrcmEtdWkvc3R5bGVkLXN5c3RlbSBpbnN0ZWFkLCBzbyB0cnVzdGluZ1xuICAvLyBAY2hha3JhLXVpL3JlYWN0IHRoZXJlIHdvdWxkIGZvcmNlIGEgdXNlbGVzcyBwcm9qZWN0LWxvY2FsIGNvcHkgd2l0aG91dCBmaXhpbmcgZ2VuLWNvZGUuXG4gIC8vIE1pcnJvciB3YiBnZW4tY29kZSdzIGNsYXNzaWZpY2F0aW9uOiBvbmx5IGEgcmFuZ2Ugd2hvc2UgbGVhZGluZyBtYWpvciBwYXJzZXMgdG8gMiBzZWxlY3RzIHRoZVxuICAvLyB2MiBjb21tYW5kLCBzbyBkaWdpdGxlc3Mgc3BlY3MgbGlrZSBgbGF0ZXN0YCBvciBjYXRhbG9nIHJlZmVyZW5jZXMgY291bnQgYXMgdjMuXG4gIGNvbnN0IGhhc0NoYWtyYUNsaVYzID0gKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldCgnQGNoYWtyYS11aS9jbGknKSA/PyBbXSkuc29tZShcbiAgICAodmVyc2lvblJhbmdlKSA9PiAvXFxkKy91LmV4ZWModmVyc2lvblJhbmdlKT8uWzBdICE9PSAnMidcbiAgKTtcbiAgY29uc3QgcmVxdWlyZWRXYmZ5UGFja2FnZXMgPSBbXG4gICAgLi4uKGhhc0NoYWtyYUNsaVYzICYmIGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGNoYWtyYS11aS9yZWFjdCcpID8gWydAY2hha3JhLXVpL3JlYWN0J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnZHJpenpsZS1raXQnKSA/IFsnZHJpenpsZS1raXQnXSA6IFtdKSxcbiAgICAvLyBUaGVzZSBnaXQtZGVwZW5kZW5jeSBidWlsZHMgaW1wb3J0IHBhY2thZ2VzIHRoZXkgZG8gbm90IGRlY2xhcmUgKGUuZy4gem9kKSwgd2hpY2ggdGhlXG4gICAgLy8gZ2xvYmFsLXN0b3JlIGxheW91dCBwbGFjZXMgYmV5b25kIHRoZWlyIHdhbGstdXA7IGEgcHJvamVjdC1sb2NhbCBjb3B5IHVuZGVyXG4gICAgLy8gbm9kZV9tb2R1bGVzLy5idW4gcmVzb2x2ZXMgdGhlbSAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvcHJvbXB0LXN0dWR5KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvanVkZ2UnKSA/IFsnQHdpbGxib29zdGVyL2p1ZGdlJ10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpID8gWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gOiBbXSksXG4gICAgLy8gYmxpdHogYW5kIEBibGl0empzL2F1dGggcmVxdWlyZSByZWFjdCAoYW5kIG90aGVyIHBlZXJzKSB3aXRob3V0IGRlY2xhcmluZyB0aGVtLCByZWx5aW5nIG9uXG4gICAgLy8gaG9pc3RpbmcsIHdoaWNoIHRoZSBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cCAob2JzZXJ2ZWQgaW5cbiAgICAvLyBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtOiBgbmV4dCBidWlsZGAgcGFnZS1kYXRhIGNvbGxlY3Rpb24gZGllcyB3aXRoIFwiQ2Fubm90IGZpbmQgbW9kdWxlXG4gICAgLy8gJ3JlYWN0J1wiIGZyb20gQGJsaXR6anMvYXV0aCkuIEBibGl0empzL3JwYyBpcyBOT1QgbGlzdGVkIGJlY2F1c2UgaXQgcHJvcGVybHkgZGVjbGFyZXMgaXRzXG4gICAgLy8gcmVhY3QvQHRhbnN0YWNrIHBlZXJzLCBzbyBCdW4gbGlua3MgdGhlbSBpbnRvIGl0cyBzdG9yZSBlbnRyeS4gQGJsaXR6anMvbmV4dCBpc1xuICAgIC8vIGRlbGliZXJhdGVseSBOT1QgbGlzdGVkIGVpdGhlcjogdHJ1c3RpbmcgaXQgd291bGQgcnVuIGl0cyBwb3N0aW5zdGFsbCAoYGJsaXR6IGNvZGVnZW5gKSxcbiAgICAvLyB3aGljaCBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluIHBsYWNlIOKAlCByZXBvc2l0b3JpZXMgcGF0Y2ggb3V0IHRoYXQgcG9zdGluc3RhbGxcbiAgICAvLyB3aXRoIGBidW4gcGF0Y2hgIGluc3RlYWQsIHdoaWNoIGFsc28ga2VlcHMgdGhlIHBhY2thZ2UgcHJvamVjdC1sb2NhbC5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdibGl0eicpID8gWydibGl0eiddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0BibGl0empzL2F1dGgnKSA/IFsnQGJsaXR6anMvYXV0aCddIDogW10pLFxuICAgIC8vIEJ1biBkb2VzIG5vdCBsaW5rIEBob29rZm9ybS9yZXNvbHZlcnMnIE9QVElPTkFMIHZhbGlkYXRvciBwZWVycyAoZS5nLiB6b2QpIGludG8gaXRzXG4gICAgLy8gZ2xvYmFsLXN0b3JlIGVudHJ5IGV2ZW4gd2hlbiB0aGUgcHJvamVjdCBpbnN0YWxscyB0aGVtLCBzbyBpdHMgc2VydmVyLXNpZGVcbiAgICAvLyBgaW1wb3J0ICd6b2QnYCBmYWlscyBmcm9tIHRoZSBzdG9yZSAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGhvb2tmb3JtL3Jlc29sdmVycycpID8gWydAaG9va2Zvcm0vcmVzb2x2ZXJzJ10gOiBbXSksXG4gICAgLy8gQHpvb20vcnRtcyBpbnN0YWxscyBpdHMgbmF0aXZlIHJ0bXMubm9kZSBiaW5kaW5nIGluIGEgbGlmZWN5Y2xlIHNjcmlwdC4gV2l0aG91dCBleHBsaWNpdFxuICAgIC8vIHRydXN0LCBCdW4gc2tpcHMgdGhhdCBzY3JpcHQgYW5kIHRoZSBwYWNrYWdlIGZhaWxzIGFzIHNvb24gYXMgdGhlIFpvb20gYm90IGltcG9ydHMgaXRcbiAgICAvLyAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc21hcnRzZS16b29tLWJvdCkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHpvb20vcnRtcycpID8gWydAem9vbS9ydG1zJ10gOiBbXSksXG4gIF07XG5cbiAgLy8gd2JmeSBmdWxseSBvd25zIHRoaXMgZmllbGQ6IGEgcGFja2FnZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyBtdXN0IHJ1biBnZXRzIGFkZGVkIHRvIHdiZnlcbiAgLy8gaXRzZWxmIGluc3RlYWQgb2YgdG8gaW5kaXZpZHVhbCByZXBvc2l0b3JpZXMsIHNvIHVubWFuYWdlZCBlbnRyaWVzIGFyZSBhbHdheXMgcmVtb3ZlZCDigJRcbiAgLy8gaW5jbHVkaW5nIGFuIGV4cGxpY2l0bHkgZW1wdHkgZGVueS1hbGwgbGlzdCwgd2hvc2UgZGVsZXRpb24gZGVsaWJlcmF0ZWx5IHJlc3RvcmVzIEJ1bidzXG4gIC8vIGRlZmF1bHQgYWxsb3ctbGlzdCAodGhlIG93bmVyc2hpcCBwb2xpY3kgY2hvc2VuIGluICM5NzUpLlxuICBjb25zdCBleGlzdGluZ1RydXN0ZWQgPSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gIGlmIChyZXF1aXJlZFdiZnlQYWNrYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoZXhpc3RpbmdUcnVzdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIERlbGV0aW5nIHRoZSBmaWVsZCByZXN0b3JlcyBCdW4ncyBmdWxsIGRlZmF1bHQgYWxsb3ctbGlzdCwgc28gb25seSBlbnRyaWVzIG91dHNpZGUgdGhhdFxuICAgICAgLy8gbGlzdCBhY3R1YWxseSBsb3NlIHRoZWlyIGxpZmVjeWNsZSBzY3JpcHRzLlxuICAgICAgd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBleGlzdGluZ1RydXN0ZWQsIG5ldyBTZXQoKSk7XG4gICAgICBkZWxldGUgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBbiBleHBsaWNpdCB0cnVzdGVkRGVwZW5kZW5jaWVzIGxpc3QgUkVQTEFDRVMgQnVuJ3MgZGVmYXVsdCBhbGxvdy1saXN0IGluc3RlYWQgb2YgZXh0ZW5kaW5nXG4gIC8vIGl0LCBhbmQgQnVuIHByaW50cyBubyB3YXJuaW5nIGZvciB0aGUgcG9zdGluc3RhbGxzIGl0IGNvbnNlcXVlbnRseSBza2lwcyAoZS5nLiBAcmFpbHdheS9jbGlcbiAgLy8gZG93bmxvYWRzIGl0cyBiaW5hcnkgaW4gcG9zdGluc3RhbGwgYW5kIGV4aXRzIDEgd2l0aG91dCBvbmUpLiBJbmNsdWRlIHRoZSBFTlRJUkUgZGVmYXVsdCBsaXN0OlxuICAvLyBlbnRyaWVzIGZvciBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW5zdGFsbGVkIGFyZSBpbmVydCwgYW5kIHRoaXMgaXMgdGhlIG9ubHkgcmVwcmVzZW50YXRpb25cbiAgLy8gdGhhdCBzdGF5cyBjb3JyZWN0IGZvciB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyB0aGUgZmluYWwgYGJ1biBpbnN0YWxsYCByZXNvbHZlcyBhZnRlciB0aGlzXG4gIC8vIHJ1bnMg4oCUIGFuIGludGVyc2VjdGlvbiB3aXRoIGEgbWlzc2luZyBvciBzdGFsZSBsb2NrZmlsZSB3b3VsZCBzaWxlbnRseSBkcm9wIHRoZW0uXG4gIGNvbnN0IGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgLy8gbGVmdGhvb2sgaXMgYXBwZW5kZWQgZXhwbGljaXRseSBzbyB0aGUgZGVmYXVsdC1saXN0IGxvb2t1cCBmYWlsaW5nIGNhbm5vdCBkcm9wIGl0OiBpdCBpc1xuICAvLyByZXF1aXJlZCBpbiBldmVyeSBtYW5hZ2VkIHJlcG9zaXRvcnkuXG4gIGNvbnN0IG5ld1RydXN0ZWRQYWNrYWdlcyA9IG5ldyBTZXQoW1xuICAgIC4uLnJlcXVpcmVkV2JmeVBhY2thZ2VzLFxuICAgIGxlZnRob29rRGVwZW5kZW5jeSxcbiAgICAuLi4oZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPz8gW10pLFxuICBdKTtcbiAgd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBleGlzdGluZ1RydXN0ZWQgPz8gW10sIG5ld1RydXN0ZWRQYWNrYWdlcyk7XG4gIGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcyA9IFsuLi5uZXdUcnVzdGVkUGFja2FnZXNdLnRvU29ydGVkKCk7XG59XG5cbi8vIFRoZSBwYWNrYWdlcyB3YmZ5IGl0c2VsZiBtYXkgd3JpdGUgaW50byB0cnVzdGVkRGVwZW5kZW5jaWVzOyB0aGVpciByZW1vdmFsIGlzIG1hbmFnZWQgY2xlYW51cCxcbi8vIG5ldmVyIGEgbG9zcyBvZiB1c2VyIHBvbGljeS5cbmNvbnN0IHdiZnlNYW5hZ2VkVHJ1c3RlZERlcGVuZGVuY2llcyA9IG5ldyBTZXQoW1xuICAnQGJsaXR6anMvYXV0aCcsXG4gICdAY2hha3JhLXVpL3JlYWN0JyxcbiAgJ0Bob29rZm9ybS9yZXNvbHZlcnMnLFxuICAnQHdpbGxib29zdGVyL2p1ZGdlJyxcbiAgJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknLFxuICAnQHpvb20vcnRtcycsXG4gICdibGl0eicsXG4gICdkcml6emxlLWtpdCcsXG4gIGxlZnRob29rRGVwZW5kZW5jeSxcbl0pO1xuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBleGlzdGluZ1RydXN0ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBrZXB0UGFja2FnZXM6IFJlYWRvbmx5U2V0PHN0cmluZz5cbik6IHZvaWQge1xuICAvLyBBIGRlZmF1bHQtdHJ1c3RlZCBlbnRyeSBuZXZlciBsb3NlcyBhbnl0aGluZyBieSByZW1vdmFsOiB3aGlsZSB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQgdGhlXG4gIC8vIGtlcHQgbGlzdCAob3IsIHdoZW4gdGhlIGZpZWxkIGlzIGRlbGV0ZWQsIEJ1bidzIG93biBkZWZhdWx0IGxpc3QpIHN0aWxsIHRydXN0cyBpdC5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICBjb25zdCByZW1vdmVkUGFja2FnZXMgPSBleGlzdGluZ1RydXN0ZWQuZmlsdGVyKFxuICAgIChwa2cpID0+ICFrZXB0UGFja2FnZXMuaGFzKHBrZykgJiYgIXdiZnlNYW5hZ2VkVHJ1c3RlZERlcGVuZGVuY2llcy5oYXMocGtnKSAmJiAhZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM/Lmhhcyhwa2cpXG4gICk7XG4gIGlmIChyZW1vdmVkUGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBSZW1vdmluZyB1bm1hbmFnZWQgdHJ1c3RlZERlcGVuZGVuY2llcyBlbnRyaWVzOiAke3JlbW92ZWRQYWNrYWdlcy5qb2luKCcsICcpfS4gd2JmeSBvd25zIHRoaXMgZmllbGQ7IGlmIHRoZWlyIGxpZmVjeWNsZSBzY3JpcHRzIGFyZSByZXF1aXJlZCwgYWRkIHRoZSBwYWNrYWdlcyB0byB3YmZ5IGl0c2VsZi5gXG4gICAgKTtcbiAgfVxufVxuXG5sZXQgY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4vKiogRmV0Y2hlcyBCdW4ncyBkZWZhdWx0IHRydXN0ZWQtZGVwZW5kZW5jeSBhbGxvdy1saXN0IGZyb20gdGhlIEJ1biB2ZXJzaW9uIGluc3RhbGxpbmcgdGhlIHJlcG9zaXRvcnkuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMpIHtcbiAgICAvLyBCdW4gY29sb3JpemVzIHRoZSBsaXN0IG1hcmtlcnMgd2hlbiBGT1JDRV9DT0xPUiBpcyBzZXQgKGUuZy4gYnkgdGVzdCBydW5uZXJzIG9uIENJKSwgc29cbiAgICAvLyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgbXVzdCBiZSBzdHJpcHBlZCBiZWZvcmUgcGFyc2luZy5cbiAgICBjb25zdCBzdGRvdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2J1bicsIFsncG0nLCAnZGVmYXVsdC10cnVzdGVkJ10sIGNvbmZpZy5kaXJQYXRoKS5yZXBsYWNlQWxsKFxuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gbWF0Y2hpbmcgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIHJlcXVpcmVzIHRoZSBFU0MgY29udHJvbCBjaGFyYWN0ZXJcbiAgICAgIC9cXHUwMDFCXFxbWzAtOTtdKm0vZ3UsXG4gICAgICAnJ1xuICAgICk7XG4gICAgY29uc3QgcGFyc2VkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbLi4uc3Rkb3V0Lm1hdGNoQWxsKC9eXFxzKi1cXHMrKFxcUyspJC9nbXUpXS5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXSBhcyBzdHJpbmcpKTtcbiAgICBpZiAocGFyc2VkRGVwZW5kZW5jaWVzLnNpemUgPT09IDApIHtcbiAgICAgIC8vIERvIG5vdCBjYWNoZSB0aGUgZmFpbHVyZTogYSB0YXJnZXQtbG9jYWwgcHJvYmxlbSAoZS5nLiBhbiB1bnJlYWRhYmxlIHBhY2thZ2UuanNvbikgbXVzdFxuICAgICAgLy8gbm90IGRlbnkgdGhlIGRlZmF1bHQgbGlzdCB0byBldmVyeSBsYXRlciB0YXJnZXQgb2YgYSBtdWx0aS1wYXRoIHJ1bi5cbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHJlYWQgdGhlIGRlZmF1bHQgYWxsb3ctbGlzdCB2aWEgYGJ1biBwbSBkZWZhdWx0LXRydXN0ZWRgLicpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBwYXJzZWREZXBlbmRlbmNpZXM7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIC8vIEV4cGxpY2l0IHJvb3QgcHVibGlzaGluZyBpbnRlbnQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHdiZnkncyBwcml2YXRlIG1vbm9yZXBvLXJvb3QgZGVmYXVsdC5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAoY29uZmlnLnJlbGVhc2UubnBtUHVibGlzaGVzUm9vdCB8fCBqc29uT2JqLnB1Ymxpc2hDb25maWcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmoucHJpdmF0ZTtcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgIWNvbmZpZy5yZWxlYXNlLm5wbSAmJiAhanNvbk9iai5wdWJsaXNoQ29uZmlnKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCByZWdpc3RyeSwgbnBtIHJlc29sdmVzIHRoZSBwdWJsaXNoIHRhcmdldCBmcm9tIHRoZSB3b3Jrc3BhY2UgLm5wbXJjLFxuICAgIC8vIHdob3NlIGRlZmF1bHQgcmVnaXN0cnkgb24gQ0kgbWF5IGJlIHRoZSBUYWt1bWkgR3VhcmQgaW5zdGFsbCBwcm94eSDigJQgd2hpY2ggcmVqZWN0c1xuICAgIC8vIGBucG0gcHVibGlzaGAgd2l0aCA0MDUgKHNoYXJlZCMxMDcyKS4gYD8/PWAga2VlcHMgYSBkZWxpYmVyYXRlbHkgZGlmZmVyZW50IHJlZ2lzdHJ5LlxuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5yZWdpc3RyeSA/Pz0gJ2h0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyc7XG4gIH1cbiAgY29uc3Qgb3duZXIgPSBjb25maWcucmVwb0F1dGhvcjtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgYXdhaXQgbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKGNvbmZpZywganNvbk9iaik7XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICdidW4gcnVuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGNvbnN0IHNjcmlwdFJ1bm5lciA9ICdidW4gcnVuJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snY29tbW9uL2NpLXNldHVwJ10gPSBgJHtzY3JpcHRSdW5uZXJ9IHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknID8gJ3V2JyA6ICdwb2V0cnknfWBdO1xuICAgICAganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWBdID0gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHB5dGhvblBhY2thZ2VNYW5hZ2VyKTtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcHl0aG9uUnVubmVyID0gYCR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9IHJ1bmA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYCR7cHl0aG9uUnVubmVyfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgJHtweXRob25SdW5uZXJ9IGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gYCR7c2NyaXB0UnVubmVyfSBsaW50YDtcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICAgIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IGdlbkNvZGVTY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIGlmIChzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWcpKSB7XG4gICAgLy8gUHJlc2VydmUgcHJvamVjdC1zcGVjaWZpYyBzdGVwcyBhIHJlcG8gYXBwZW5kZWQgdG8gdGhlIG1hbmFnZWQgYGJ1biB3YiBnZW4tY29kZWAgKGUuZy4gYnVpbGRpbmcgZXh0cmEgZGVwbG95XG4gICAgLy8gYXNzZXRzKSBpbnN0ZWFkIG9mIGRpc2NhcmRpbmcgdGhlbTsgb25seSB0aGUgbWFuYWdlZCBnZW4tY29kZSBzZWdtZW50IGlzIHdiZnkncyB0b1xuICAgIC8vIHJlZ2VuZXJhdGUuIEFuIHVucGFyc2VhYmxlIHNjcmlwdCBpcyBsZWZ0IGFsb25lIHJhdGhlciB0aGFuIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBnZW5Db2RlU2NyaXB0ID09PSB1bmRlZmluZWQgPyBbXSA6IHNwbGl0U2NyaXB0U2VnbWVudHMoZ2VuQ29kZVNjcmlwdCk7XG4gICAgY29uc3QgY3VzdG9tU2VnbWVudHMgPSBzZWdtZW50cz8uZmlsdGVyKFxuICAgICAgKHNlZ21lbnQpID0+IGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBqc29uT2JqLnNjcmlwdHMsIHRydWUpID09PSAnY3VzdG9tJ1xuICAgICk7XG4gICAgaWYgKGN1c3RvbVNlZ21lbnRzKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBbJ2J1biB3YiBnZW4tY29kZScsIC4uLmN1c3RvbVNlZ21lbnRzXS5qb2luKCcgJiYgJyk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLmNoYWtyYSB8fCBjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCBjb25maWcuZGVwZW5kaW5nLnByaXNtYTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gZm9ybWF0U2NyaXB0ID8gYCR7Zm9ybWF0U2NyaXB0fSAmJiBidW4gcnVuIGZvcm1hdC1jb2RlYCA6ICdidW4gcnVuIGZvcm1hdC1jb2RlJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlnTWpzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5tanMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ01qc1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai50eXBlID0gJ21vZHVsZSc7XG5cbiAgY29uc3QgY29uZmlnRHRzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLnRzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdEdHNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmouZmlsZXMgPSBbLi4ubmV3IFNldChbLi4uKGpzb25PYmouZmlsZXMgPz8gW10pLCAnY29uZmlnLmQubXRzJ10pXTtcbiAgLy8gTm9kZU5leHQgcmVzb2x2ZXMgYSByZWxhdGl2ZSBgLi9jb25maWcubWpzYCBpbXBvcnQgdG8gYGNvbmZpZy5kLm10c2AsIG5vdFxuICAvLyB0aGUgcGFja2FnZS1sZXZlbCBgdHlwZXNgIGZpZWxkLiBLZWVwIHRoZSBwdWJsaXNoZWQgY29uZmlnIGltcG9ydGFibGUgZnJvbVxuICAvLyBwYWNrYWdlLWxvY2FsIFR5cGVTY3JpcHQgbGludGVyIHNldHRpbmdzLlxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpKTtcbn1cblxuY29uc3QgY29uZmlnRG10c0NvbnRlbnQgPSBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vY29uZmlnLmpzJztcbmA7XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLCBqc29uT2JqKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwXSk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLCBqc29uT2JqKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAganNvbk9iajogUGFja2FnZUpzb25cbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKS5maWx0ZXIoXG4gICAgKGRlcGVuZGVuY3kpID0+XG4gICAgICBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSAmJlxuICAgICAgLy8gQSBwdWJsaWMgcGFja2FnZSdzIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgbXVzdCBuZXZlciBiZSByZS1tYW5hZ2VkIHZpYSBhIHJlZ2lzdHJ5IGluc3RhbGxcbiAgICAgIC8vIChwcml2YXRlIG9uZXMgYXJlIG5vcm1hbGl6ZWQgdG8gYHdvcmtzcGFjZToqYCBsYXRlcikuIFRoaXMgYWxzbyBjb3ZlcnMgcnVubmluZyB3YmZ5IG9uIGFcbiAgICAgIC8vIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSwgd2hlcmUgdGhlIHBhcmVudCdzIHdvcmtzcGFjZXMgYXJlIGludmlzaWJsZSBhbmQgdGhlIHdvcmtzcGFjZS1tYXBcbiAgICAgIC8vIGd1YXJkIGluIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIGNhbm5vdCBwcm90ZWN0IHRoZSBzcGVjaWZpZXIuXG4gICAgICAoanNvbk9iai5wcml2YXRlIHx8ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKVxuICApO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0ganNvbk9ialtrZXldO1xuICAgIGlmIChzZWN0aW9uICYmIE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogdm9pZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gICAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyICYmIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzKV07XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5Jykge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKCd1dicsIFsnYWRkJywgJy0tZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5JyB8ICd1dicgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSByZXR1cm4gJ3V2JztcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHJldHVybiAncG9ldHJ5Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiAncG9ldHJ5JyB8ICd1dicpOiBzdHJpbmcge1xuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICd1dicpIHJldHVybiAndXYgc3luYyAtLWZyb3plbic7XG4gIC8vIGBtaXNlIHdoaWNoIHB5dGhvbmAgeWllbGRzIHRoZSBzaW5nbGUgYWN0aXZlIGludGVycHJldGVyIHBhdGg7IGBtaXNlIGN1cnJlbnQgcHl0aG9uYCBjYW5cbiAgLy8gcHJpbnQgbXVsdGlwbGUgc3BhY2Utc2VwYXJhdGVkIHZlcnNpb25zIChtaXNlIHN1cHBvcnRzIG11bHRpLXZlcnNpb24gcGlucyksIHdoaWNoIHdvdWxkIHBhc3NcbiAgLy8gZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gYHBvZXRyeSBlbnYgdXNlYC4gV2hlbiBtaXNlIGlzIG1pc3Npbmcgb3IgcHl0aG9uIGlzXG4gIC8vIHVuY29uZmlndXJlZCwgc2tpcCBgcG9ldHJ5IGVudiB1c2VgIGFuZCBmYWxsIGJhY2sgdG8gcG9ldHJ5J3MgZGVmYXVsdCBpbnRlcnByZXRlciBpbnN0ZWFkIG9mXG4gIC8vIGFib3J0aW5nIHRoZSBjaGFpbi5cbiAgLy8gVGhlIGB8fCB0cnVlYCBjb3ZlcnMgb25seSB0aGUgbWlzZSByZXNvbHV0aW9uOiBhIG1pc3NpbmcvdW5jb25maWd1cmVkIG1pc2UgZmFsbHMgYmFjayB0b1xuICAvLyBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyLCB3aGlsZSBhIGZhaWxpbmcgYHBvZXRyeSBlbnYgdXNlYCBzdGlsbCBhYm9ydHMgdGhlIGNoYWluLlxuICByZXR1cm4gJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlICYmIHsgcHl0aG9uX3BhdGg9XCIkKG1pc2Ugd2hpY2ggcHl0aG9uIDI+L2Rldi9udWxsKVwiIHx8IHRydWU7IH0gJiYgeyBbIC16IFwiJHB5dGhvbl9wYXRoXCIgXSB8fCBwb2V0cnkgZW52IHVzZSBcIiRweXRob25fcGF0aFwiOyB9ICYmIHBvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAmJiBwb2V0cnkgaW5zdGFsbCc7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFtcbiAgICAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSkpKSxcbiAgXTtcbiAgc3Bhd25TeW5jKCdidW4nLCBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksICctLWV4YWN0JywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICAvLyBBIHByaXZhdGUgcGFja2FnZSB3aG9zZSBtb25vcmVwbyBjb250YWlucyB0aGlzIGRlcGVuZGVuY3kgYXMgYSB3b3Jrc3BhY2UgbXVzdCByZWZlcmVuY2UgaXRcbiAgICAvLyB2aWEgdGhlIHdvcmtzcGFjZSBwcm90b2NvbDogcGlubmluZyBhIHJlZ2lzdHJ5IHZlcnNpb24gbWFrZXMgQnVuIHNoYWRvdyB0aGUgc2FtZS1uYW1lXG4gICAgLy8gd29ya3NwYWNlIGFuZCBza2lwIGluc3RhbGxpbmcgdGhlIHdvcmtzcGFjZSdzIG93biBkZXBlbmRlbmNpZXMuIChQdWJsaXNoZWQgcGFja2FnZXMgaW5zdGVhZFxuICAgIC8vIHBpbiBhIGNvbmNyZXRlIHZlcnNpb24gYmVjYXVzZSBgbnBtIHB1Ymxpc2hgIHJlamVjdHMgYHdvcmtzcGFjZToqYCBzcGVjaWZpZXJzIOKAlCBidXQgYW5cbiAgICAvLyBFWElTVElORyBgd29ya3NwYWNlOmAgZGVjbGFyYXRpb24gaXMgYWx3YXlzIGtlcHQ6IG92ZXJ3cml0aW5nIGl0IHdpdGggYSByZWdpc3RyeSByZWxlYXNlXG4gICAgLy8gd291bGQgc2lsZW50bHkgYnJlYWsgdGhlIGxvY2FsIHdvcmtzcGFjZSBsaW5rLilcblxuICAgIC8vIEEgZGVjbGFyZWQgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBhbHdheXMgd2lucywgd2hldGhlciBvciBub3QgdGhlIHdvcmtzcGFjZSBtYXAgc2VlcyB0aGVcbiAgICAvLyBwYWNrYWdlOiBydW5uaW5nIHdiZnkgb24gYSBtb25vcmVwbyBTVUJESVJFQ1RPUlkgaGlkZXMgdGhlIHBhcmVudCdzIHdvcmtzcGFjZXMsIHNvIHRoZSBtYXBcbiAgICAvLyBhbG9uZSBjYW5ub3QgYmUgdHJ1c3RlZCB0byBkZXRlY3QgYSBsb2NhbCB3b3Jrc3BhY2UgbGluay5cbiAgICBpZiAocGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgaWYgKGpzb25PYmoucHJpdmF0ZSkge1xuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9ICd3b3Jrc3BhY2U6Kic7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGpzb25PYmoucHJpdmF0ZSAmJiBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS5oYXMoZGVwZW5kZW5jeSkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWVyID0gcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIWV4aXN0aW5nU3BlY2lmaWVyIHx8IGV4aXN0aW5nU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9ICd3b3Jrc3BhY2U6Kic7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQW4gZXhpc3RpbmcgQ09OQ1JFVEUgcGluIG9uIGEgd29ya3NwYWNlIHBhY2thZ2UgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSBhbmQgbXVzdCBub3QgYmVcbiAgICAgIC8vIGNvbnZlcnRlZCB0byB0aGUgd29ya3NwYWNlIHByb3RvY29sLiBOb3RlIHRoZSB0cmFkZS1vZmYgZWl0aGVyIHdheTogbnBtICh3aGljaFxuICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gc2hlbGxzIG91dCB0bykgY2Fubm90IHBhcnNlIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXJzLCB3aGlsZVxuICAgICAgLy8gYSByZWdpc3RyeSBwaW4gbWFrZXMgYSBjb2xkIGJ1biBpbnN0YWxsIHNoYWRvdyB0aGUgd29ya3NwYWNlIGFuZCBza2lwIGl0cyBkZXBlbmRlbmNpZXMg4oCUXG4gICAgICAvLyBXaWxsQm9vc3Rlci9zaGFyZWQga2VlcHMgYHdvcmtzcGFjZToqYCBhbmQgc3RyaXBzIHRoZSBwcm90b2NvbCBvbiB0aGUgQ0kgY2hlY2tvdXQgcmlnaHRcbiAgICAgIC8vIGJlZm9yZSByZWxlYXNpbmcgKHNjcmlwdHMvc3RyaXBXb3Jrc3BhY2VQcm90b2NvbC5tanMpLiBGYWxsIHRocm91Z2ggc28gYSBjb25jcmV0ZSBwaW5cbiAgICAgIC8vIGtlZXBzIGJlaW5nIGJ1bXBlZCBsaWtlIGFueSBtYW5hZ2VkIGRlcGVuZGVuY3kuXG4gICAgfVxuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSA9IHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gICAgICBjb25maWcsXG4gICAgICByb290Q29uZmlnLFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBjb25zdCBtYW5hZ2VkVmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICAgICAgaWYgKHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeSwgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0sIG1hbmFnZWRWZXJzaW9uKSkge1xuICAgICAgICAvLyBgYnVuIGFkZCBkZXBlbmRlbmN5YCBwcmVzZXJ2ZXMgYW4gZXhpc3RpbmcgZXhhY3QgcGluLCBzbyB3cml0ZSB0aGUgYWdlLWNsZWFyZWQgdmVyc2lvblxuICAgICAgICAvLyBkaXJlY3RseS4gVGhlIGZpbmFsIHJlcG9zaXRvcnktd2lkZSBpbnN0YWxsIHJlZnJlc2hlcyB0aGUgbG9ja2ZpbGUgYWZ0ZXIgZXZlcnkgcGFja2FnZVxuICAgICAgICAvLyBtYW5pZmVzdCBoYXMgY29udmVyZ2VkIG9uIHRoZSBnZW5lcmF0ZWQgcmVsZWFzZS1hZ2UgcG9saWN5LlxuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IG1hbmFnZWRWZXJzaW9uO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRlcGVuZGVuY2llc1RvSW5zdGFsbC5wdXNoKGRlcGVuZGVuY3kpO1xuICAgICAgaWYgKCFza2lwQWRkaW5nRGVwcykgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICYmXG4gICAgICAhc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ICYmXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAhPT0gJyonXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICAgIGlmIChsYXRlc3RWZXJzaW9uID09PSAnKicgJiYgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIGNvbnRpbnVlO1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICBpZiAoIXJlbGF0aXZlRmlsZVBhdGgpIHJldHVybjtcblxuICAvLyBSZXVzZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBvd24gZm9ybWF0dGVyIGFmdGVyIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uIHNvXG4gIC8vIHBhY2thZ2UuanNvbiBtYXRjaGVzIHdoYXRldmVyIGl0cyBjdXJyZW50IHNvcnQtcGFja2FnZS1qc29uIHZlcnNpb24gZXhwZWN0cy5cbiAgLy8gVGhpcyBhdm9pZHMgZm9sbG93LXVwIGF1dG9maXggY29tbWl0cyBjYXVzZWQgb25seSBieSBmb3JtYXR0ZXIgdmVyc2lvbiBkcmlmdFxuICAvLyBiZXR3ZWVuIHdiZnkgYW5kIHRoZSBwcm9qZWN0IGJlaW5nIHVwZGF0ZWQuXG4gIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgdXNlZERlcGVuZGVuY2llczogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VkRGVwZW5kZW5jeVNldCA9IG5ldyBTZXQodXNlZERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gYXdhaXQgZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodXNlZERlcGVuZGVuY3lTZXQuaGFzKGRlcGVuZGVuY3kpIHx8IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIGJhc2UtY29uZmlnIHBhY2thZ2VzLiBSZW1vdmUgc3RhbGUgdmFyaWFudHMgd2hlbiByZXBvXG4gICAgLy8gY2FwYWJpbGl0aWVzIGNoYW5nZSwgc3VjaCBhcyBOZXh0LmpzIHRha2luZyBvd25lcnNoaXAgb2YgdHNjb25maWcuanNvbi5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RzY29uZmlnKi5qc29uJywge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgLy8gVHlwZVNjcmlwdCA3J3MgbmF0aXZlIGNvbXBpbGVyIGRyb3BwZWQgdGhlIGluLXByb2Nlc3MgYHBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb25gXG4gICAgLy8gaGVscGVyLCBzbyBwYXJzZSB0aGUgdHNjb25maWcgaW50byBhbiBBU1QgYW5kIHJlYWQgaXRzIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZGlyZWN0bHkuXG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGFic29sdXRlRmlsZVBhdGgpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHBhcnNlZC5gKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlKSkge1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXM7XG59XG5cbi8qKiBSZWFkcyB0aGUgdG9wLWxldmVsIGBleHRlbmRzYCBlbnRyaWVzIChhIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzKSBmcm9tIGEgcGFyc2VkIHRzY29uZmlnLiAqL1xuZnVuY3Rpb24gcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nW10ge1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2UpKSB7XG4gICAgaWYgKGFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgJiYgYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSAmJiBwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICdleHRlbmRzJykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHZhbHVlcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHJlYWRvbmx5IGFzdC5PYmplY3RMaXRlcmFsRWxlbWVudExpa2VbXSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHNvdXJjZS5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKGFzdC5pc0V4cHJlc3Npb25TdGF0ZW1lbnQoc3RhdGVtZW50KSAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbikpIHtcbiAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5wcm9wZXJ0aWVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKG5vZGU6IGFzdC5FeHByZXNzaW9uLCB2YWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGlmIChhc3QuaXNTdHJpbmdMaXRlcmFsKG5vZGUpKSB7XG4gICAgdmFsdWVzLnB1c2gobm9kZS50ZXh0KTtcbiAgfSBlbHNlIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG5vZGUuZWxlbWVudHMpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKGVsZW1lbnQsIHZhbHVlcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj5bXSB7XG4gIHJldHVybiBkZXBlbmRlbmN5U2VjdGlvbktleXNcbiAgICAubWFwKChrZXkpID0+IGpzb25PYmpba2V5XSlcbiAgICAuZmlsdGVyKChzZWN0aW9uKTogc2VjdGlvbiBpcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+ICEhc2VjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChkZXBlbmRlbmN5KTtcbiAgaWYgKGNhY2hlZFZlcnNpb24pIHJldHVybiBjYWNoZWRWZXJzaW9uO1xuXG4gIGNvbnN0IHZlcnNpb24gPSBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGRlcGVuZGVuY3ksIHZlcnNpb24pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSkge1xuICAgIHJldHVybiBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIH1cblxuICByZXR1cm4gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0aW1lcyA9IGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5KTtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgaWYgKGxhdGVzdFZlcnNpb24gIT09ICcqJyAmJiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUodGltZXNbbGF0ZXN0VmVyc2lvbl0pKSB7XG4gICAgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gIH1cblxuICByZXR1cm4gZ2V0QWdlR2F0ZWRWZXJzaW9uc0Rlc2NlbmRpbmcodGltZXMpWzBdID8/ICcqJztcbn1cblxuLyoqIEV2ZXJ5IHN0YWJsZSByZWxlYXNlIGluIGB0aW1lc2AgdGhhdCBhbHJlYWR5IGNsZWFyZWQgdGhlIGFnZSBnYXRlLCBuZXdlc3QgZmlyc3QuICovXG5mdW5jdGlvbiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRpbWVzKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gc2VtdmVyLnZhbGlkKHZlcnNpb24pKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gKHNlbXZlci5wcmVyZWxlYXNlKHZlcnNpb24pPy5sZW5ndGggPz8gMCkgPT09IDApXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkpKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gbm93IC0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkgPj0gcGFja2FnZUFnZUdhdGVNcylcbiAgICAudG9Tb3J0ZWQoKFt2ZXJzaW9uQV0sIFt2ZXJzaW9uQl0pID0+IHNlbXZlci5yY29tcGFyZSh2ZXJzaW9uQSwgdmVyc2lvbkIpKVxuICAgIC5tYXAoKFt2ZXJzaW9uXSkgPT4gdmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZShwdWJsaXNoZWRBdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcHVibGlzaGVkQXQpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHVibGlzaGVkVGltZSA9IERhdGUucGFyc2UocHVibGlzaGVkQXQpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHB1Ymxpc2hlZFRpbWUpICYmIERhdGUubm93KCkgLSBwdWJsaXNoZWRUaW1lID49IHBhY2thZ2VBZ2VHYXRlTXM7XG59XG5cbmZ1bmN0aW9uIGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBkZXBlbmRlbmN5LnJlcGxhY2UoL0BbXkAvXSskL3UsICcnKTtcbiAgY29uc3QgY2FjaGVkVGltZXMgPSBucG1QYWNrYWdlVGltZXNDYWNoZS5nZXQocGFja2FnZU5hbWUpO1xuICBpZiAoY2FjaGVkVGltZXMpIHJldHVybiBjYWNoZWRUaW1lcztcblxuICBjb25zdCBzdGRvdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ25wbScsXG4gICAgWydzaG93JywgcGFja2FnZU5hbWUsICd0aW1lJywgJy0tanNvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSxcbiAgICBwcm9jZXNzLmN3ZCgpXG4gICk7XG4gIGlmICghc3Rkb3V0KSByZXR1cm4ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0ZG91dCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XTtcbiAgICBjb25zdCB0aW1lcyA9IEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZFswXSA6IHBhcnNlZDtcbiAgICBpZiAoIXRpbWVzKSByZXR1cm4ge307XG4gICAgbnBtUGFja2FnZVRpbWVzQ2FjaGUuc2V0KHBhY2thZ2VOYW1lLCB0aW1lcyk7XG4gICAgcmV0dXJuIHRpbWVzO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gS2VlcCBtYW5hZ2VkIGZpcnN0LXBhcnR5IHBhY2thZ2VzIGFsaWduZWQgd2l0aCBCdW4ncyBleHBsaWNpdCBleGVtcHRpb25zLiB3YmZ5J3MgZ2VuZXJhdGVkXG4gIC8vIGNvbmZpZ3VyYXRpb24gY2FuIHJlbHkgb24gdGhlIGN1cnJlbnQgd2IgY29udHJhY3QsIHNvIGluZGVwZW5kZW50bHkgc29ha2luZyBvciBkb3duZ3JhZGluZyB3YlxuICAvLyB3b3VsZCBwYWlyIG5ldyBnZW5lcmF0ZWQgZmlsZXMgd2l0aCBhbiBpbmNvbXBhdGlibGUgb2xkIENMSS4gVGhvc2UgcGFja2FnZXMgYXJlIHJlbGVhc2VkIGFuZFxuICAvLyBmaXhlZCBhdCB0aGVpciBzb3VyY2UgaW5zdGVhZDsgb25seSBwYWNrYWdlcyBCdW4gaXRzZWxmIGdhdGVzIG1heSBiZSBzZWxlY3RlZCBmcm9tIG9sZGVyIHRhZ3MuXG4gIHJldHVybiAhYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5zb21lKChwYXR0ZXJuKSA9PiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuLCBkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJuID09PSBkZXBlbmRlbmN5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgvWy4rP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApLnJlcGxhY2VBbGwoJyonLCAnLionKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgLCAndScpLnRlc3QoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBObyBjYWNoZSBoZXJlOiB0aGUgb25seSBjYWxsZXIgY2hhaW4gZ29lcyB0aHJvdWdoIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uLCB3aGljaCBhbHJlYWR5XG4gIC8vIG1lbW9pemVzIHBlciBkZXBlbmRlbmN5LCBzbyB0aGlzIGNhbiBydW4gYXQgbW9zdCBvbmNlIHBlciBkZXBlbmRlbmN5LlxuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBkZXBlbmRlbmN5LCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSwgcHJvY2Vzcy5jd2QoKSkgfHwgJyonO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFR5cGVTY3JpcHQgaXMgdmVyc2lvbi1jYXBwZWQgaW4gQmxpdHogcmVwb3NpdG9yaWVzLCBzbyBpdHMgaW5zdGFsbCBzcGVjaWZpZXIgbXVzdCBjYXJyeSB0aGVcbiAgLy8gbWFuYWdlZCB2ZXJzaW9uIOKAlCBhIGJhcmUgYGJ1biBhZGRgIHdvdWxkIGluc3RhbGwgdGhlIGluY29tcGF0aWJsZSBsYXRlc3QuXG4gIGlmIChkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0RGVwZW5kZW5jeSAmJiBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpKSB7XG4gICAgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Z2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSl9YDtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jeTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlcG9zaXRvcnkgY29udGFpbnMgYSBCbGl0eiBhcHAgKHRoZSBjdXJyZW50IHBhY2thZ2Ugb3IgdGhlIHdvcmtzcGFjZSByb290KS4gKi9cbmZ1bmN0aW9uIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCByb290Q29uZmlnLmRlcGVuZGluZy5ibGl0ejtcbn1cblxuY29uc3Qgd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4vKiogTWFwIGZyb20gZWFjaCB3b3Jrc3BhY2UgcGFja2FnZSdzIG5hbWUgdG8gaXRzIGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZS5nZXQocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCB3b3Jrc3BhY2VEaXJzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290Q29uZmlnKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgaWYgKHdvcmtzcGFjZVBhY2thZ2VKc29uLm5hbWUpIHtcbiAgICAgICAgd29ya3NwYWNlRGlyc0J5TmFtZS5zZXQod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIHVucGFyc2FibGUgd29ya3NwYWNlIHBhY2thZ2UuanNvblxuICAgIH1cbiAgfVxuICB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLnNldChyb290Q29uZmlnLmRpclBhdGgsIHdvcmtzcGFjZURpcnNCeU5hbWUpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyc0J5TmFtZTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGN1cnJlbnRWZXJzaW9uID09PSAnKicpIHJldHVybiB0cnVlO1xuICBpZiAoaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkgcmV0dXJuIHRydWU7XG4gIGlmICghbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgY29uc3QgY3VycmVudFZhbGlkVmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIC8vIEEgVHlwZVNjcmlwdCA3IHBpbiBpbiBhIEJsaXR6IHJlcG9zaXRvcnkgaXMgbGlrZXdpc2UgaW5jb21wYXRpYmxlIChgbmV4dCBidWlsZGAgZmFpbHMgb25cbiAgLy8gdGhlIE5leHQuanMgMTUgdGhhdCBCbGl0eiBwaW5zIOKAlCBzZWUgZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKSwgc28gcmV3cml0ZSBpdCB0byB0aGVcbiAgLy8gY2FwcGVkIHJlbGVhc2UgaW5zdGVhZCBvZiBwcmVzZXJ2aW5nIGl0IHZpYSB0aGUgbm8tZG93bmdyYWRlIHJ1bGUgYmVsb3cuIFRoZSBwaW4gbWF5IGJlIGFcbiAgLy8gUkFOR0UgKGUuZy4gYF43LjAuMGApLCB3aGljaCBzZW12ZXIudmFsaWQgcmVqZWN0cyDigJQganVkZ2UgdGhlIG1ham9yIGZyb20gdGhlIHJhbmdlIG1pbmltdW0uXG4gIGNvbnN0IGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiA9XG4gICAgY3VycmVudFZhbGlkVmVyc2lvbiA/PyAoc2VtdmVyLnZhbGlkUmFuZ2UoY3VycmVudFZlcnNpb24pID8gc2VtdmVyLm1pblZlcnNpb24oY3VycmVudFZlcnNpb24pPy52ZXJzaW9uIDogdW5kZWZpbmVkKTtcbiAgaWYgKFxuICAgIGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmXG4gICAgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSAmJlxuICAgIGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiAmJlxuICAgIHNlbXZlci5tYWpvcihjdXJyZW50VHlwZXNjcmlwdFZlcnNpb24pID49IDcgJiZcbiAgICBzZW12ZXIudmFsaWQobWFuYWdlZFZlcnNpb24pICYmXG4gICAgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbilcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gVGhlIGdlbmVyYXRlZCBidW5maWcgYXBwbGllcyB0aGUgb3JnYW5pemF0aW9uIGFnZSBnYXRlIGV2ZW4gdG8gZXhhY3QgcGlucy4gSWYgYSBtYW5hZ2VkXG4gIC8vIHRoaXJkLXBhcnR5IHRvb2wgaXMgbmV3ZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UgdGhhdCBjbGVhcmVkIHRoYXQgZ2F0ZSwgcHJlc2VydmluZyB0aGUgcGluXG4gIC8vIHByb2R1Y2VzIGEgcGFja2FnZS5qc29uIHRoYXQgYSBmcmVzaCBpbnN0YWxsIHdpdGhvdXQgdGhlIG9sZCBsb2NrZmlsZSBjYW5ub3QgcmVzb2x2ZSAobm90YWJseVxuICAvLyBvcHRpbWl6ZWQgRG9ja2VyIGJ1aWxkcykuIEtlZXAgdGhlIG5vLWRvd25ncmFkZSBwb2xpY3kgb25seSB3aGVuIHRoZSBkZXBlbmRlbmN5IGlzIGV4ZW1wdCBmcm9tXG4gIC8vIHRoZSBnYXRlOyBhZ2UtZ2F0ZWQgbWFuYWdlZCB0b29scyBtdXN0IGNvbnZlcmdlIG9uIHRoZSB2ZXJzaW9uIHRoZSBnZW5lcmF0ZWQgYnVuZmlnIGFjY2VwdHMuXG4gIGlmIChzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyB3YmZ5IG93bnMgdGhlc2UgdG9vbCBkZXBlbmRlbmNpZXMsIGJ1dCBhcHBseWluZyB3YmZ5IHNob3VsZCBub3QgZG93bmdyYWRlIGFcbiAgLy8gcmVwb3NpdG9yeSB0aGF0IGFscmVhZHkgcGlucyBhIG5ld2VyIHJldmlld2VkIHJlbGVhc2Ugd2hlbiB0aGUgb3JnIHBvbGljeSBleGVtcHRzIGl0LlxuICByZXR1cm4gaXNOZXdlclBhY2thZ2VWZXJzaW9uKG1hbmFnZWRWZXJzaW9uLCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWFuYWdlZFZlcnNpb246IHN0cmluZ1xuKTogY3VycmVudFZlcnNpb24gaXMgc3RyaW5nIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRNYW5hZ2VkVmVyc2lvbiA9IHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbik7XG4gIHJldHVybiAoXG4gICAgc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSAmJlxuICAgIHZhbGlkQ3VycmVudFZlcnNpb24gIT09IG51bGwgJiZcbiAgICB2YWxpZE1hbmFnZWRWZXJzaW9uICE9PSBudWxsICYmXG4gICAgc2VtdmVyLmd0KHZhbGlkQ3VycmVudFZlcnNpb24sIHZhbGlkTWFuYWdlZFZlcnNpb24pXG4gICk7XG59XG5cbi8vIFRoZSBuZXdlc3QgVHlwZVNjcmlwdCA2IHJlbGVhc2UgYXQgdGhlIHRpbWUgdGhlIEJsaXR6IGNhcCBzaGlwcGVkOyB1c2VkIG9ubHkgd2hlbiB0aGUgcmVnaXN0cnlcbi8vIGxvb2t1cCBmb3IgdGhlIGFjdHVhbCBuZXdlc3QgcHJlLXY3IHJlbGVhc2UgZmFpbHMgKHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLlxuY29uc3QgbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbiA9ICc2LjAuMyc7XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICAvLyBCbGl0eiBwaW5zIE5leHQuanMgMTUsIHdob3NlIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgcmVxdWlyZXMgdGhlIGNsYXNzaWNcbiAgICAvLyBgdHlwZXNjcmlwdGAgY29tcGlsZXIgQVBJOyB0aGUgVHlwZVNjcmlwdCA3IGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIGJpbmFyeVxuICAgIC8vIHdpdGhvdXQgdGhhdCBBUEksIHNvIGBuZXh0IGJ1aWxkYCBhYm9ydHMgd2l0aCBcIkZhaWxlZCB0byBpbnN0YWxsIHJlcXVpcmVkIFR5cGVTY3JpcHRcbiAgICAvLyBkZXBlbmRlbmNpZXNcIiAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuIENhcCBgdHlwZXNjcmlwdGAgYmVsb3cgNyB1bnRpbFxuICAgIC8vIEJsaXR6IHN1cHBvcnRzIGEgTmV4dC5qcyByZWxlYXNlIHRoYXQgdW5kZXJzdGFuZHMgdHNnby4gQSBmYWlsZWQgcmVnaXN0cnkgbG9va3VwIG11c3RcbiAgICAvLyByZXNvbHZlIHRvIGEga25vd24tY29tcGF0aWJsZSByZWxlYXNlIOKAlCBmYWxsaW5nIGJhY2sgdG8gbGF0ZXN0VmVyc2lvbiB3b3VsZCByZWluc3RhbGwgdGhlXG4gICAgLy8gaW5jb21wYXRpYmxlIFR5cGVTY3JpcHQgNy5cbiAgICBjb25zdCB2YWxpZExhdGVzdFZlcnNpb24gPSBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbik7XG4gICAgaWYgKHZhbGlkTGF0ZXN0VmVyc2lvbiAmJiBzZW12ZXIubWFqb3IodmFsaWRMYXRlc3RWZXJzaW9uKSA8IDcpIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICAgIC8vIFRoZSBjYXBwZWQgbG9va3VwIG11c3QgcmVzcGVjdCB0aGUgYWdlIGdhdGUgdG9vOiB0aGlzIHZlcnNpb24gaXMgd3JpdHRlbiBhcyBhbiBleGFjdCBwaW4sXG4gICAgLy8gYW5kIEJ1biByZWZ1c2VzIHRvIHJlc29sdmUgb25lIHB1Ymxpc2hlZCBpbnNpZGUgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93LiBUaGVyZSBpcyBub1xuICAgIC8vIHVuZ2F0ZWQgZmFsbGJhY2sg4oCUIHdpdGhvdXQgcHVibGljYXRpb24gbWV0YWRhdGEgdGhlIGFnZSBvZiBhIHJhbmdlIHJlc3VsdCBpcyB1bmtub3duLCBzbyBhXG4gICAgLy8gcGFydGlhbCByZWdpc3RyeSBmYWlsdXJlIHdvdWxkIG90aGVyd2lzZSB3cml0ZSBhIHZlcnNpb24gQnVuIHRoZW4gcmVmdXNlcyB0byBpbnN0YWxsLlxuICAgIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZFZlcnNpb25CZWxvdyh0eXBlc2NyaXB0RGVwZW5kZW5jeSwgJzcuMC4wJykgPz8gbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBUaGUgaGlnaGVzdCByZWxlYXNlIG9mIGBwYWNrYWdlTmFtZWAgYmVsb3cgYGV4Y2x1c2l2ZVVwcGVyQm91bmRgIHRoYXQgYWxyZWFkeSBjbGVhcmVkIHRoZSBhZ2VcbiAqIGdhdGUsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSByZWdpc3RyeSBsb29rdXAgZmFpbHMgb3Igbm8gc3VjaCByZWxlYXNlIGV4aXN0cyB5ZXQuXG4gKi9cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHBhY2thZ2VOYW1lOiBzdHJpbmcsIGV4Y2x1c2l2ZVVwcGVyQm91bmQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyhnZXROcG1QYWNrYWdlVGltZXMocGFja2FnZU5hbWUpKS5maW5kKCh2ZXJzaW9uKSA9PlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBleGNsdXNpdmVVcHBlckJvdW5kKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyUGFja2FnZVZlcnNpb24oY2FuZGlkYXRlVmVyc2lvbjogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChjYW5kaWRhdGVWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIHJldHVybiAhdmFsaWRMYXRlc3RWZXJzaW9uIHx8ICF2YWxpZEN1cnJlbnRWZXJzaW9uIHx8IHNlbXZlci5ndCh2YWxpZExhdGVzdFZlcnNpb24sIHZhbGlkQ3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHNcbiAgICAvLyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgICBjbGVhbnVwOiAnYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgIGZvcm1hdDogYGJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICBsaW50OiBgYnVuIHdiIGxpbnRgLFxuICAgICdsaW50LWZpeCc6ICdidW4gd2IgbGludCAtLWZpeCcsXG4gICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICB0eXBlY2hlY2s6ICdidW4gd2IgdHlwZWNoZWNrJyxcbiAgICB2ZXJpZnk6ICdidW4gd2IgdmVyaWZ5JyxcbiAgICAndmVyaWZ5LWZ1bGwnOiAnYnVuIHdiIHZlcmlmeSAtLWZ1bGwnLFxuICB9O1xuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGFwcGx5VGVzdE9uQ2lTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIH1cbiAgYXBwbHlUZXN0U2NyaXB0KGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ3Rlc3QnLCAndmVyaWZ5LWZ1bGwnXSk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgYGJ1biAke2dldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZyl9YCk7XG4gIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICcgJiYgcHlyaWdodCc7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbi8vIENJIHdvcmtmbG93cyAoYm90aCB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBhbmQgdGhlIHNlbGYtY29udGFpbmVkIHZhcmlhbnQgZm9yIG5vbi1XaWxsQm9vc3RlclxuLy8gcmVwb3NpdG9yaWVzKSBwcmVmZXIgYHRlc3QvY2lgIG92ZXIgYHRlc3RgLCBzbyBzdGFuZGFyZGl6ZSBpdCBvbiBgd2IgdGVzdC1vbi1jaWAgYXQgdGhlIHJvb3Qg4oCUXG4vLyBgd2IgdGVzdC1vbi1jaWAgYWxyZWFkeSBpdGVyYXRlcyB3b3Jrc3BhY2UgcGFja2FnZXMgaXRzZWxmLlxuZnVuY3Rpb24gYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbJ3Rlc3QvY2knXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBDSSB0ZXN0cyB3aXRoIGV4dHJhIHN0ZXBzIChlLmcuIHNlbGVjdGluZyBzcGVjIGZpbGVzIG9yIHJ1bm5pbmcgcmF3XG4gIC8vIFBsYXl3cmlnaHQpIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5OyBzdWNoIHdyYXBwZXJzIGFyZSBwcmVzZXJ2ZWQuXG4gIHNjcmlwdHNbJ3Rlc3QvY2knXSA9IG9sZFNjcmlwdCAmJiAhaXNHZW5lcmF0ZWRUZXN0T25DaVNjcmlwdChvbGRTY3JpcHQpID8gb2xkU2NyaXB0IDogJ2J1biB3YiB0ZXN0LW9uLWNpJztcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIGdlbmVyYXRlZCBgd2IgdGVzdC1vbi1jaWAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKipcbiAqIGB3YiB0ZXN0YCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCB0ZXN0IHJ1bm5lcnMgb25seSwgc28gcmVwbGFjaW5nIHRoZSBgdGVzdGAgc2NyaXB0IG9mIGFcbiAqIHBhY2thZ2Ugd3JpdHRlbiBpbiBhbm90aGVyIGxhbmd1YWdlIChlLmcuIGEgTWF2ZW4gb3IgYW4gUlNwZWMgcGFja2FnZSBpbiBhIHBvbHlnbG90IG1vbm9yZXBvKVxuICogc2lsZW50bHkgZHJvcHMgaXRzIHdob2xlIHN1aXRlOiB0aGUgZ2VuZXJhdGVkIHNjcmlwdCB0aGVuIHN1Y2NlZWRzIHdpdGhvdXQgcnVubmluZyBhbnl0aGluZy5cbiAqIFN1Y2ggYSBwYWNrYWdlIGtlZXBzIGl0cyBvd24gYHRlc3RgIHNjcmlwdDsgSlMvVFMgcGFja2FnZXMgYXJlIHN0YW5kYXJkaXplZCBhcyB1c3VhbC5cbiAqL1xuZnVuY3Rpb24gYXBwbHlUZXN0U2NyaXB0KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHNcbik6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzLnRlc3Q/LnRyaW0oKTtcbiAgaWYgKCFvbGRTY3JpcHQgfHwgZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBpc0dlbmVyYXRlZFRlc3RTY3JpcHQob2xkU2NyaXB0KSkgcmV0dXJuO1xuICBzY3JpcHRzLnRlc3QgPSBvbGRTY3JpcHQ7XG59XG5cbi8qKiBXaGV0aGVyIGEgc2NyaXB0IGJvZHkgaXMgb25lIG9mIHRoZSBLTk9XTiBnZW5lcmF0ZWQgYHdiIHRlc3RgIGludm9jYXRpb25zLiAqL1xuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0U2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3QnO1xufVxuXG4vKipcbiAqIEtlZXBzIGEgc2NyaXB0IHRoYXQgQ0hBSU5TIGV4dHJhIGNvbW1hbmRzIG9udG8gdGhlIGdlbmVyYXRlZCBvbmUgKGUuZy4gYSBwb2x5Z2xvdCBtb25vcmVwb1xuICogYXBwZW5kaW5nIGl0cyBNYXZlbiBhbmQgUlNwZWMgc3VpdGVzIHRvIGB3YiB0ZXN0YCwgd2hpY2ggcnVucyBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgcnVubmVyc1xuICogb25seSkuIFN1Y2ggYSB3cmFwcGVyIHN0aWxsIHJ1bnMgdGhlIGdlbmVyYXRlZCBjb21tYW5kLCBzbyByZXBsYWNpbmcgaXQgd291bGQgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJlcG9zaXRvcnkncyBvd24gc3RlcHMg4oCUIHRoZSBzYW1lIHJlYXNvbmluZyBhcyBgYXBwbHlUZXN0T25DaVNjcmlwdGAuIEFuIHVucmVjb2duaXplZCBjaGFpbmVkXG4gKiBzY3JpcHQgaXMga2VwdCB3aG9sZXNhbGUgcmF0aGVyIHRoYW4gbG9zaW5nIGl0cyBwcm9qZWN0LW93bmVkIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBrZWVwR2VuZXJhdGVkU2NyaXB0V3JhcHBlcnMoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHNjcmlwdE5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBzY3JpcHROYW1lcykge1xuICAgIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbc2NyaXB0TmFtZV0/LnRyaW0oKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRTY3JpcHQgPSBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgIGlmICghb2xkU2NyaXB0IHx8ICFnZW5lcmF0ZWRTY3JpcHQgfHwgb2xkU2NyaXB0ID09PSBnZW5lcmF0ZWRTY3JpcHQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGhlYWRSZWdFeHAgPSBuZXcgUmVnRXhwKFxuICAgICAgYF4ke2VzY2FwZVJlZ0V4cChnZW5lcmF0ZWRTY3JpcHQpLnJlcGxhY2VBbGwoJyAnLCBTdHJpbmcucmF3YFsgXFx0XStgKX0oPz1bIFxcXFx0XSooPzomJnxcXFxcfFxcXFx8fDt8XFxcXG4pKWAsXG4gICAgICAndSdcbiAgICApO1xuICAgIC8vIEEgbmV3bGluZSBzZXBhcmF0ZXMgc2hlbGwgY29tbWFuZHMganVzdCBsaWtlICYmLCB8fCBhbmQgOy5cbiAgICBpZiAoaGVhZFJlZ0V4cC50ZXN0KG9sZFNjcmlwdCkpIHtcbiAgICAgIC8vIEEgZnVuY3Rpb24gcmVwbGFjZW1lbnQga2VlcHMgYCRgLXNoYXBlZCBjaGFyYWN0ZXJzIGluIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCBsaXRlcmFsLlxuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdC5yZXBsYWNlKGhlYWRSZWdFeHAsICgpID0+IGdlbmVyYXRlZFNjcmlwdCk7XG4gICAgfSBlbHNlIGlmICgvKD86JiZ8XFx8XFx8fDt8XFxuKS91LnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgd2JEYkNvbW1hbmQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkgcmV0dXJuO1xuXG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLWNyZWF0ZS1taWdyYXRpb24nLCBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZS1kZXZgLCAnbWlncmF0ZS1kZXYnKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChcbiAgICBzY3JpcHRzLFxuICAgIG9sZFNjcmlwdHMsXG4gICAgJ2RiLW1pZ3JhdGUnLFxuICAgIGAke3diRGJDb21tYW5kfSBtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3lgLFxuICAgICdtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3knXG4gICk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLXZpZXcnLCBgJHt3YkRiQ29tbWFuZH0gc3R1ZGlvYCwgJ3N0dWRpbycpO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0KFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lOiBzdHJpbmcsXG4gIGdlbmVyYXRlZFNjcmlwdDogc3RyaW5nLFxuICBnZW5lcmF0ZWRBcmd1bWVudHM6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbbmFtZV07XG4gIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHdyYXAgbWlncmF0aW9uIGNvbW1hbmRzIHRvIHByZXBhcmUgU1FMaXRlIGRpcmVjdG9yaWVzLFxuICAvLyBmYW4gb3V0IG92ZXIgdGVuYW50cywgb3IgcGVyZm9ybSBjbGVhbnVwIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5LlxuICBjb25zdCBnZW5lcmF0ZWRCb2RpZXMgPSBbYGJ1biB3YiBkYiAke2dlbmVyYXRlZEFyZ3VtZW50c31gLCBgYnVuIHdiIHByaXNtYSAke2dlbmVyYXRlZEFyZ3VtZW50c31gXTtcbiAgc2NyaXB0c1tuYW1lXSA9IG9sZFNjcmlwdCAmJiAhZ2VuZXJhdGVkQm9kaWVzLmluY2x1ZGVzKG9sZFNjcmlwdC50cmltKCkpID8gb2xkU2NyaXB0IDogZ2VuZXJhdGVkU2NyaXB0O1xufVxuXG5mdW5jdGlvbiBnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiAnd2IgZGInIHwgJ3diIHByaXNtYScge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiAnd2IgcHJpc21hJztcbiAgcmV0dXJuICd3YiBkYic7XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgLy8gUHJlc2VydmUgYSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYgcHJlZml4IChlLmcuIGBNSVNFX0VOVj10ZXN0YCkgb24gYW4gZXhpc3RpbmcgbWlzZSBicmlkZ2UuXG4gICAgLy8gU3VjaCBhIHByZWZpeCBpcyByZXF1aXJlZCBmb3IgbWlzZSBjb25maWcgZW52aXJvbm1lbnRzIChtaXNlLjxNSVNFX0VOVj4udG9tbCksIHdoaWNoIGFyZVxuICAgIC8vIHNlbGVjdGVkIGZyb20gTUlTRV9FTlYgKmJlZm9yZSogbWlzZSBzdGFydHMgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCBmcm9tIGluc2lkZSBhIHRhc2s7IGRyb3BwaW5nXG4gICAgLy8gaXQgd291bGQgc2lsZW50bHkgcnVuIHRoZSB0YXNrIGluIHRoZSBkZWZhdWx0IGVudmlyb25tZW50LlxuICAgIGNvbnN0IGVudlByZWZpeCA9IGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpO1xuICAgIGlmIChlbnZQcmVmaXggPT09IHVuZGVmaW5lZCAmJiBvbGRTY3JpcHRzW25hbWVdICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGAke2VudlByZWZpeCA/PyAnJ31taXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudi12YXIgcHJlZml4IG9mIGFuIGV4aXN0aW5nIGBtaXNlIHJ1biA8bmFtZT5gIGJyaWRnZSBzY3JpcHRcbiAqIChwb3NzaWJseSBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYnJpZGdlIGhhcyBubyBwcmVmaXgpLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzY3JpcHQgaXMgbm90IGFcbiAqIG1pc2UgYnJpZGdlIGZvciB0aGUgZ2l2ZW4gdGFzay5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEVhY2ggYXNzaWdubWVudCB2YWx1ZSBtYXkgYmUgZG91YmxlLXF1b3RlZCwgc2luZ2xlLXF1b3RlZCwgb3IgYW4gdW5xdW90ZWQgcnVuIG9mIG5vbi13aGl0ZXNwYWNlLFxuICAvLyBzbyBwcmVmaXhlcyBsaWtlIGBNSVNFX0VOVj1cImEgYlwiYCAod2hvc2UgdmFsdWUgY29udGFpbnMgc3BhY2VzKSBhcmUgbWF0Y2hlZCBpbnN0ZWFkIG9mIGRyb3BwZWQuXG4gIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF4oKD86XFx3Kz0oPzpcIlteXCJdKlwifCdbXiddKid8XFxTKylcXHMrKSopbWlzZSBydW4gJHtlc2NhcGVSZWdFeHAobmFtZSl9JGAsICd1JykuZXhlYyhcbiAgICBzY3JpcHQudHJpbSgpXG4gICk7XG4gIHJldHVybiBtYXRjaD8uWzFdO1xufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIG9yZzogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCBvcmc6ICdXaWxsQm9vc3RlcicsIHJlcG86ICdjb2RlLWFuYWx5emVyJywgdGFyZ2V0OiAnZGV2RGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvanVkZ2UnLCBvcmc6ICdXaWxsQm9vc3RlckxhYicsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IG9yZywgcGFja2FnZU5hbWUsIHJlcG8sIHRhcmdldCB9KSA9PiB7XG4gICAgICBpZiAoIXBhY2thZ2VOYW1lcy5oYXMocGFja2FnZU5hbWUpIHx8IGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCBwYWNrYWdlTmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdO1xuICAgICAgY29uc3Qgb3RoZXJUYXJnZXQgPSB0YXJnZXQgPT09ICdkZXBlbmRlbmNpZXMnID8gJ2RldkRlcGVuZGVuY2llcycgOiAnZGVwZW5kZW5jaWVzJztcbiAgICAgIC8vIFRoZSBsaW50IHJ1bGUgZGlzYWxsb3dzIGBkZWxldGVgIHdpdGggY29tcHV0ZWQgcGFja2FnZSBuYW1lczsgUmVmbGVjdCBoYXMgdGhlIHNhbWUgZGVsZXRpb24gc2VtYW50aWNzIGhlcmUuXG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmpbb3RoZXJUYXJnZXRdLCBwYWNrYWdlTmFtZSk7XG4gICAgICBqc29uT2JqW3RhcmdldF1bcGFja2FnZU5hbWVdID0gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihleGlzdGluZ1NwZWNpZmllciwgb3JnLCByZXBvKVxuICAgICAgICA/IGV4aXN0aW5nU3BlY2lmaWVyXG4gICAgICAgIDogYXdhaXQgZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIob3JnLCByZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGV4aXN0aW5nIHNwZWNpZmllciBhbHJlYWR5IHBpbnMgYSBnaXQgcmVmIG9mIHRoZSBleHBlY3RlZCBwcml2YXRlIHJlcG9zaXRvcnkuXG4gKiB3YmZ5IG11c3Qgbm90IGJ1bXAgc3VjaCBwaW5zOiBhIHJ1biBpbnRlbmRlZCBhcyBjb25maWd1cmF0aW9uL3BhY2thZ2UtbWFuYWdlciBtYWludGVuYW5jZVxuICogd291bGQgb3RoZXJ3aXNlIGNoYW5nZSB0aGUgZGVwZW5kZW5jeSdzIHZlcnNpb24gYXMgYSBzaWRlIGVmZmVjdCAodXBkYXRpbmcgcGlucyBpcyBSZW5vdmF0ZSdzXG4gKiBqb2IpLCBwb3NzaWJseSB0byBhIGNvbW1pdCB3aG9zZSBwcmVidWlsdCBhcnRpZmFjdHMgYXJlIG1pc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzUGlubmVkUHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIoXG4gIHNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcmc6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nXG4pOiBzcGVjaWZpZXIgaXMgc3RyaW5nIHtcbiAgaWYgKCFzcGVjaWZpZXIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2AoPzpefFs6L10pJHtvcmd9LyR7cmVwb30oPzpcXC5naXQpPyNcXFMrJGAsICd1JykudGVzdChzcGVjaWZpZXIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmc6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2gob3JnLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbToke29yZ30vJHtyZXBvfS5naXQjJHtjb21taXRIYXNofWA7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2V0R2VuSTE4blRzQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2dlbkkxOG5Ucy5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5pbnRlcmZhY2UgTGVmdGhvb2tTZXR0aW5ncyB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInO1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLWNvbW1pdCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIExlZnRob29rSm9iIHtcbiAgbmFtZTogc3RyaW5nO1xuICBnbG9iPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gIHNjcmlwdD86IHN0cmluZztcbiAgcnVubmVyPzogJ2Jhc2gnO1xuICBzdGFnZV9maXhlZD86IHRydWU7XG59XG5cbmNvbnN0IGJhc2VTZXR0aW5nczogT21pdDxMZWZ0aG9va1NldHRpbmdzLCAncHJlLWNvbW1pdCc+ID0ge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJyxcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAncHJlcGFyZScsXG4gICAgICAgIHNjcmlwdDogJ3ByZXBhcmUuc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NoZWNrJyxcbiAgICAgICAgc2NyaXB0OiAnY2hlY2suc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn07XG5cbi8vIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyB0aGUgdW5xdW90ZWQgbG9vcHMgYmVsb3cga2VlcCBwYXRoc1xuLy8gd2l0aCBzcGFjZXMgaW50YWN0LlxuY29uc3QgcHJlQ29tbWl0U2V0dGluZ3M6IExlZnRob29rU2V0dGluZ3NbJ3ByZS1jb21taXQnXSA9IHtcbiAgam9iczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdjbGVhbnVwJyxcbiAgICAgIGdsb2I6ICcnLFxuICAgICAgcnVuOiAnJyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2NoZWNrLW1pZ3JhdGlvbnMnLFxuICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgcnVuOiBgXG5mYWlsZWQ9MFxuZm9yIGZpbGUgaW4ge3N0YWdlZF9maWxlc307IGRvXG4gIGlmIGdyZXAgLXEgJ1dhcm5pbmdzOicgXCIkZmlsZVwiOyB0aGVuXG4gICAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZSAoJGZpbGUpIGNvbnRhaW5zIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgICBmYWlsZWQ9MVxuICBmaVxuZG9uZVxuZXhpdCBcIiRmYWlsZWRcIlxuYC50cmltKCksXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBidW4gcmVjb3JkcyBhbiBhYnNvbHV0ZSBgcmVzb2x2ZWRgIFVSTCBmb3IgYW4gYWxyZWFkeS1sb2NrZWQgcGFja2FnZSB3aGVuZXZlciB0aGVcbiAgICAgIC8vIGNvbmZpZ3VyZWQgcmVnaXN0cnkgZG9lcyBub3Qgc2VydmUgdGhlIHRhcmJhbGwgaG9zdCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSDigJQgd2hpY2ggaXNcbiAgICAgIC8vIGV4YWN0bHkgd2hhdCB0aGUgVGFrdW1pIEd1YXJkIHByb3h5IGRvZXMuIFNvIGFuIGluc3RhbGwgcnVuIHdpdGggR3VhcmQgYXMgdGhlIGRlZmF1bHRcbiAgICAgIC8vIHJlZ2lzdHJ5IChDSSwgb3IgYSBkZXZlbG9wZXIgd2hvIHB1dCBpdCBpbiB+Ly5ucG1yYykgYmFrZXMgbnBtLmZsYXR0LnRlY2ggVVJMcyBpbnRvXG4gICAgICAvLyBidW4ubG9jaywgYW5kIGNvbW1pdHRpbmcgdGhlbSBwaW5zIGEgU0hBUkVEIGxvY2tmaWxlIHRvIG9uZSBlbnZpcm9ubWVudCdzIG1pcnJvcjogZXZlcnlcbiAgICAgIC8vIGxhdGVyIGluc3RhbGwgZG93bmxvYWRzIHRocm91Z2ggdGhlIHByb3h5LCBhbmQgYSBjb2xkLWNhY2hlIGluc3RhbGwgZmFpbHMgb3V0cmlnaHQgd2l0aFxuICAgICAgLy8gNDAxIGZvciBhbnlvbmUgd2hvc2UgbnBtcmMgY2FycmllcyBhIHJlZ2lzdHJ5Lm5wbWpzLm9yZyB0b2tlbiwgYmVjYXVzZSBidW4gc2VuZHMgdGhlXG4gICAgICAvLyBkZWZhdWx0IHJlZ2lzdHJ5J3MgY3JlZGVudGlhbHMgdG8gd2hhdGV2ZXIgaG9zdCB0aGUgbG9ja2ZpbGUgbmFtZXMuIEd1YXJkIGNvdmVyYWdlIGRvZXNcbiAgICAgIC8vIG5vdCBkZXBlbmQgb24gdGhlc2UgVVJMcyDigJQgd2l0aCBhbiBlbXB0eSBgcmVzb2x2ZWRgLCBidW4gZGVyaXZlcyB0aGUgZG93bmxvYWQgVVJMIGZyb21cbiAgICAgIC8vIHRoZSBjb25maWd1cmVkIHJlZ2lzdHJ5IOKAlCBzbyBzdHJpcCB0aGVtLiBPbmx5IHRoZSBHdWFyZCBob3N0IGlzIHN0cmlwcGVkOiBhIHNjb3BlZFxuICAgICAgLy8gcmVnaXN0cnkgc3VjaCBhcyBWZXJkYWNjaW8gbGVnaXRpbWF0ZWx5IHJlY29yZHMgaXRzIG93biBVUkwgZm9yIHByaXZhdGUgcGFja2FnZXMuXG4gICAgICBuYW1lOiAnbm9ybWFsaXplLWJ1bi1sb2NrZmlsZScsXG4gICAgICBnbG9iOiAnYnVuLmxvY2snLFxuICAgICAgcnVuOiAnYmFzaCAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIE9ubHkgd2lsbGJvb3N0ZXItY29uZmlncyBnZXRzIHRoaXMgam9iOiBldmVyeSBvdGhlciByZXBvc2l0b3J5J3MgcmVub3ZhdGUuanNvbmMgbWVyZWx5XG4gICAgICAvLyBleHRlbmRzIHRoZSBzaGFyZWQgcHJlc2V0LCBhbmQgdGhlIHZhbGlkYXRvciBkb2VzIG5vdCByZXNvbHZlIHJlbW90ZSBwcmVzZXRzLCBzbyBydW5uaW5nIGl0XG4gICAgICAvLyB0aGVyZSB3b3VsZCB2YWxpZGF0ZSB0d28gbGluZXMgYW5kIGNhdGNoIG5vdGhpbmcuIGAtLW5vLWdsb2JhbGAgdmFsaWRhdGVzIHRoZSBwcmVzZXQgYXMgYVxuICAgICAgLy8gcmVwbyBjb25maWcgaW5zdGVhZCBvZiBhIHNlbGYtaG9zdGVkIGdsb2JhbCBjb25maWcsIGFuZCBgQGxhdGVzdGAga2VlcHMgbnBtIGZyb20gc2lsZW50bHlcbiAgICAgIC8vIGluc3RhbGxpbmcgYW4gYW5jaWVudCBSZW5vdmF0ZSB0aGF0IGNhbm5vdCBldmVuIHBhcnNlIEpTT05DIHdoZW4gdGhlIGxvY2FsIE5vZGUgbGFncyBiZWhpbmQuXG4gICAgICAvLyBTdGFnaW5nIGEgZGVsZXRpb24gb2YgcmVub3ZhdGUuanNvbmMgbGVhdmVzIG5vIGZpbGUgZm9yIGluc3BlY3Rpb24sIHNvIExlZnRob29rIHNraXBzIHRoaXNcbiAgICAgIC8vIGpvYiBpbnN0ZWFkIG9mIHJ1bm5pbmcgdGhlIHZhbGlkYXRvciBvbiBhIG1pc3NpbmcgcGF0aCDigJQgZGVsaWJlcmF0ZWx5LCBiZWNhdXNlIGRlbGV0aW5nIHRoZVxuICAgICAgLy8gc2hhcmVkIHByZXNldCBpcyBub3QgYW4gb3BlcmF0aW9uIHRoaXMgaG9vayBuZWVkcyB0byBndWFyZC5cbiAgICAgIG5hbWU6ICd2YWxpZGF0ZS1yZW5vdmF0ZS1jb25maWcnLFxuICAgICAgZ2xvYjogJ3Jlbm92YXRlLmpzb25jJyxcbiAgICAgIHJ1bjogJ25weCAtLXllcyAtLXBhY2thZ2UgcmVub3ZhdGVAbGF0ZXN0IC0tIHJlbm92YXRlLWNvbmZpZy12YWxpZGF0b3IgLS1zdHJpY3QgLS1uby1nbG9iYWwge3N0YWdlZF9maWxlc30nLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICAvLyBwcmVwYXJlIGNhbGxzIHRoaXMgd2l0aG91dCBhcmd1bWVudHMgYWZ0ZXIgQnVuIHNhdmVzIHRoZSByb290IGxvY2tmaWxlOyBMZWZ0aG9vayBwYXNzZXMgaXRzXG4gIC8vIHN0YWdlZCBwYXRoLiBUaGUgdW5wcmVkaWN0YWJsZSBzaWJsaW5nIGZpbGUgbWFrZXMgcmVwbGFjZW1lbnQgYXRvbWljLCBgY3AgLXBgIHByZXNlcnZlcyBpdHNcbiAgLy8gbW9kZSwgYW5kIHRoZSBhbmNob3JlZCBwYXR0ZXJuIGNhbm5vdCBlcmFzZSBhIGRpcmVjdCB0YXJiYWxsIGRlcGVuZGVuY3kgVVJMLlxuICBub3JtYWxpemVCdW5Mb2NrZmlsZTogYFxuIyEvYmluL2Jhc2hcbnNldCAtZVxuXG5pZiBbWyBcIiQjXCIgLWVxIDAgXV07IHRoZW5cbiAgc2V0IC0tIGJ1bi5sb2NrXG5maVxuXG5ub3JtYWxpemVkPVwiXCJcbnRyYXAgJ1tbIC16IFwiJG5vcm1hbGl6ZWRcIiBdXSB8fCBybSAtZiBcIiRub3JtYWxpemVkXCInIEVYSVRcbmZvciBmaWxlIGluIFwiJEBcIjsgZG9cbiAgW1sgLWYgXCIkZmlsZVwiIF1dIHx8IGNvbnRpbnVlXG4gIG5vcm1hbGl6ZWQ9XCIkKG1rdGVtcCBcIiRmaWxlLndiZnktbm9ybWFsaXppbmcuWFhYWFhYXCIpXCJcbiAgY3AgLXAgXCIkZmlsZVwiIFwiJG5vcm1hbGl6ZWRcIlxuICBzZWQgLUUgJ3MjKFwiLCApXCJodHRwczovL25wbVxcXFwuZmxhdHRcXFxcLnRlY2gvW15cIl0qXCIjXFxcXDFcIlwiI2cnIFwiJGZpbGVcIiA+IFwiJG5vcm1hbGl6ZWRcIlxuICBpZiAhIGNtcCAtcyBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiOyB0aGVuXG4gICAgbXYgXCIkbm9ybWFsaXplZFwiIFwiJGZpbGVcIlxuICAgIGVjaG8gXCJSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJGZpbGUgc28gdGhlIGxvY2tmaWxlIHN0YXlzIHJlZ2lzdHJ5LWFnbm9zdGljLlwiXG4gIGZpXG4gIHJtIC1mIFwiJG5vcm1hbGl6ZWRcIlxuICBub3JtYWxpemVkPVwiXCJcbmRvbmVcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdID0gW2NvbmZpZ10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCBhbGxDb25maWdzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCB7IGxpbnQgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8TGVmdGhvb2tTZXR0aW5ncz4gPSB7XG4gICAgLi4uYmFzZVNldHRpbmdzLFxuICAgICdwcmUtY29tbWl0Jzoge1xuICAgICAgam9iczogZ2V0UHJlQ29tbWl0Sm9icyhjb25maWcpLFxuICAgIH0sXG4gIH07XG4gIGlmICghbGludCkge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnNVdGlsLndyaXRlRmlsZUNvbmZpbmVkKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcblxuICBpZiAobGludCkge1xuICAgIGNvbnN0IHByZVB1c2ggPSBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZyk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZywgYWxsQ29uZmlncykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoJyksIHNjcmlwdHMubm9ybWFsaXplQnVuTG9ja2ZpbGUgKyAnXFxuJywge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByZVB1c2hTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gQnVuIHJlcG9zIHJlY2VpdmUgd2IgYXMgcGFydCBvZiB3YmZ5J3MgbWFuYWdlZCB0b29sY2hhaW4sIHNvIGdlbmVyYXRlIHRoZVxuICAvLyBmaW5hbCBob29rIGNvbW1hbmQgb24gdGhlIGZpcnN0IHJ1biBpbnN0ZWFkIG9mIGNoYW5naW5nIGl0IG9uIHRoZSBzZWNvbmQuXG4gIGNvbnN0IHF1aWV0TGludENvbW1hbmQgPSAnYnVuIHdiIGxpbnQgLS1xdWlldCc7XG4gIC8vIE5vIHNlcGFyYXRlIHR5cGVjaGVjayBzdGVwIG5lZWRlZCDigJQgdGhlIGxpbnQgY29tbWFuZCBhbHJlYWR5IGluY2x1ZGVzIHR5cGVjaGVja2luZy5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7cXVpZXRMaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBxdWlldExpbnRDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IExlZnRob29rSm9iW10ge1xuICByZXR1cm4gcHJlQ29tbWl0U2V0dGluZ3Muam9ic1xuICAgIC5maWx0ZXIoKGpvYikgPT4gam9iLm5hbWUgIT09ICd2YWxpZGF0ZS1yZW5vdmF0ZS1jb25maWcnIHx8IGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncylcbiAgICAubWFwKChqb2IpID0+XG4gICAgICBqb2IubmFtZSA9PT0gJ2NsZWFudXAnXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uam9iLFxuICAgICAgICAgICAgZ2xvYjogZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZyksXG4gICAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgICAgfVxuICAgICAgICA6IGpvYlxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBMZXQgYHdiIGxpbnQgLS1mb3JtYXRgIGRlY2lkZSB3aGV0aGVyIFByZXR0aWVyIGlzIGF2YWlsYWJsZTsgdGhlIGhvb2tcbiAgLy8gc3RpbGwgbmVlZHMgdG8gdHJpZ2dlciB3aGVuIGFkZGluZyB0aGUgZmlyc3QgcHJldHRpZXItb25seSBmaWxlLlxuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID0gWy4uLmV4dGVuc2lvbnMucHJldHRpZXJPbmx5XTtcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goLi4uZXh0ZW5zaW9ucy5veGZtdCwgLi4uZXh0ZW5zaW9ucy5veGxpbnQpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV0udG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gU3RyaW5nLnJhd2BcbmJ1biBydW4gLS1jd2QgcGFja2FnZXMvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cbiAgLy8gUHl0aG9uLW9ubHkgQnVuIHJlcG9zIGluc3RhbGwgd2IgZm9yIHNoYXJlZCBzY3JpcHRzIGJ1dCBub3QgT3hsaW50LCBzb1xuICAvLyBzdGFnZWQtZmlsZSBob29rcyBtdXN0IHVzZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgZm9ybWF0dGVyIHBhdGggYmVsb3cuXG4gIGNvbnN0IGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICBpZiAoY2FuVXNlV2JGb3JTdGFnZWRGaWxlcykge1xuICAgIHJldHVybiBgXG5idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nLnJhd2BcbnBhY2thZ2VfanNvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoXnwvKXBhY2thZ2VcXC5qc29uJCcgfHwgdHJ1ZSlcIlxuJHtoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpID8gU3RyaW5nLnJhd2BweXRob25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwucHkkJyB8fCB0cnVlKVwiYCA6ICcnfVxuJHtjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCA/IFN0cmluZy5yYXdgZGFydF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5kYXJ0JCcgfCBncmVwIC12ICdnZW5lcmF0ZWQnIHwgZ3JlcCAtdiAnXFwuZnJlZXplZFxcLmRhcnQkJyB8IGdyZXAgLXYgJ1xcLmdcXC5kYXJ0JCcgfHwgdHJ1ZSlcImAgOiAnJ31cblxuaWYgWyAtbiBcIiRwYWNrYWdlX2pzb25fZmlsZXNcIiBdOyB0aGVuXG4gIGJ1biBzb3J0LXBhY2thZ2UtanNvbiAkcGFja2FnZV9qc29uX2ZpbGVzXG5maVxuJHtcbiAgaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKVxuICAgID8gYGlmIFsgLW4gXCIkcHl0aG9uX2ZpbGVzXCIgXTsgdGhlblxuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBibGFjayAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGZsYWtlOCAkcHl0aG9uX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbFxuICAgID8gYGlmIFsgLW4gXCIkZGFydF9maWxlc1wiIF07IHRoZW5cbiAgZGFydCBmb3JtYXQgJGRhcnRfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbmAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsb2NhbFdiUGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZXMnLCAnd2InLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3aWxsYm9vc3Rlci93Yic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdG9vbHNDaGFuZ2VkUGF0dGVybiA9IFN0cmluZy5yYXdgKG1pc2VcXC50b21sfFxcLm1pc2VcXC50b21sKWA7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIiR7dG9vbHNDaGFuZ2VkUGF0dGVybn1cIiBcIm1pc2UgaW5zdGFsbFwiYCk7XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gJ2J1biBpbnN0YWxsJztcbiAgLy8gRG8gTk9UIGFkZCBgLnZpbmV4dGAgaGVyZTogaXQgaG9sZHMgb25seSB2aW5leHQncyBjb250ZW50LWhhc2hlZCBmb250IGNhY2hlIGFuZCB0aGUgZGV2XG4gIC8vIHNlcnZlcidzIGxvY2sgZmlsZSAoZGVsZXRpbmcgdGhlIGxvY2sgZGlzYWJsZXMgdGhlIGR1cGxpY2F0ZS1kZXYtc2VydmVyIGd1YXJkIGZvciBhIHJ1bm5pbmdcbiAgLy8gc2VydmVyKS4gdmluZXh0J3MgYnVpbGQgb3V0cHV0IGdvZXMgdG8gYGRpc3QvYCwgYW5kIFZpdGUncyBkZXBlbmRlbmN5IGNhY2hlIGlzIGhhbmRsZWQgYnlcbiAgLy8gdGhlIHNlcGFyYXRlIGluc3RhbGwtbGF5b3V0IGhvb2sgYmVsb3cuXG4gIC8vIFNjYW4gZXZlcnkgd29ya3NwYWNlIGNvbmZpZyAobm90IGp1c3QgdGhlIHJvb3QpOiBpbiBhIG1vbm9yZXBvIHRoZSBhcHAgdXN1YWxseSBsaXZlcyBpblxuICAvLyBwYWNrYWdlcy88YXBwPiBvciBhcHBzLzxhcHA+LCBhbmQgdGhlIGNhY2hlIGRpcmVjdG9yaWVzIGFyZSB3b3Jrc3BhY2UtcmVsYXRpdmUuXG4gIGNvbnN0IG5leHRDYWNoZURpclBhdGhzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gICAgY29uZmlnLFxuICAgIGFsbENvbmZpZ3MsXG4gICAgKHdvcmtzcGFjZUNvbmZpZykgPT4gd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLm5leHQsXG4gICAgJy5uZXh0J1xuICApO1xuICBjb25zdCBybU5leHREaXJlY3RvcmllcyA9XG4gICAgbmV4dENhY2hlRGlyUGF0aHMubGVuZ3RoID4gMCA/IGAgJiYgcm0gLVJmIC0tICR7bmV4dENhY2hlRGlyUGF0aHMubWFwKHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwpLmpvaW4oJyAnKX1gIDogJyc7XG4gIC8vIEJ1biBkb2VzIG5vdCByZWxpbmsgYW4gZXhpc3RpbmcgaXNvbGF0ZWQgdHJlZSB3aGVuIGdsb2JhbFN0b3JlL2xpbmtlciBzZXR0aW5ncyBjaGFuZ2UuIEluc3BlY3RcbiAgLy8gdGhvc2Uga2V5cyByYXRoZXIgdGhhbiBldmVyeSBidW5maWcgY2hhbmdlOiBtaW5pbXVtUmVsZWFzZUFnZSB1cGRhdGVzIG11c3Qgbm90IGRlc3Ryb3kgYVxuICAvLyBjb250cmlidXRvcidzIHdvcmtpbmcgaW5zdGFsbCBiZWZvcmUgYSBwb3RlbnRpYWxseSBuZXR3b3JrLWRlcGVuZGVudCByZXBsYWNlbWVudCBzdWNjZWVkcy5cbiAgY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRocyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKGNvbmZpZywgYWxsQ29uZmlncywgKCkgPT4gdHJ1ZSwgJ25vZGVfbW9kdWxlcycpO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgIFN0cmluZy5yYXdgaWYgZ2l0IGRpZmYgLS1uby1jb2xvciAtVTAgT1JJR19IRUFEIEhFQUQgLS0gJypidW5maWcudG9tbCcgfCBncmVwIC0tcXVpZXQgLUUgJ15bKy1dICooZ2xvYmFsU3RvcmV8bGlua2VyfHB1YmxpY0hvaXN0UGF0dGVybiknOyB0aGVuIHJtIC1SZiAtLSAke25vZGVNb2R1bGVzRGlyUGF0aHMubWFwKHF1b3RlRm9yU2hlbGwpLmpvaW4oJyAnKX07IGZpYFxuICApO1xuICAvLyBidW4ubG9jay1vbmx5IG1lcmdlcyAoUmVub3ZhdGUgbG9ja2ZpbGUgbWFpbnRlbmFuY2UpLCBidW5maWcudG9tbCAvIC5ucG1yYyBjaGFuZ2VzIChsaW5rZXIsXG4gIC8vIHJlZ2lzdHJ5LCBob2lzdGluZyksIGFuZCBwYXRjaCBlZGl0cyBhbGwgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0IHRvdWNoaW5nIHBhY2thZ2UuanNvbi5cbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKHBhY2thZ2VcXC5qc29ufGJ1blxcLmxvY2t8YnVuZmlnXFwudG9tbHxcXC5ucG1yY3xwYXRjaGVzLylcIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcmllc31cImBcbiAgKTtcbiAgLy8gVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaW4gbm9kZV9tb2R1bGVzLy52aXRlIHNlbGYtaW52YWxpZGF0ZXMgb24gbG9ja2ZpbGUgLyBwYXRjaGVzIC9cbiAgLy8gY29uZmlnIC8gTk9ERV9FTlYgY2hhbmdlcyAoc2VlIFZpdGUncyBkZXAgcHJlLWJ1bmRsaW5nIGRvY3MpLCBzbyB0aGUgcmVzaWR1YWwgc3RhbGUgY2FzZSBpc1xuICAvLyBpbnN0YWxsLWxheW91dCBjaGFuZ2VzIChidW5maWcudG9tbCBsaW5rZXIsIC5ucG1yYyk6IHRoZXkgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0XG4gIC8vIHRvdWNoaW5nIHRoZSBsb2NrZmlsZSwgYW5kIHRoZXkgYXJlIGFic2VudCBmcm9tIFZpdGUncyBjYWNoZSBrZXkuXG4gIGNvbnN0IHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpbmV4dCB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpdGUsXG4gICAgJ25vZGVfbW9kdWxlcy8udml0ZSdcbiAgKTtcbiAgaWYgKHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMubGVuZ3RoID4gMCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmMpXCIgXCJybSAtUmYgLS0gJHtybVZpdGVDYWNoZURpcmVjdG9yaWVzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9XCJgXG4gICAgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwidXZcXC5sb2NrXCIgXCJ1diBzeW5jIC0tZnJvemVuXCJgKTtcbiAgfVxuICAvLyBCbGl0eiByZXBvc2l0b3JpZXMgZGVsaWJlcmF0ZWx5IGdldCB0aGUgc2FtZSB3Yi1kcml2ZW4gcHJpc21hIGNvbW1hbmRzIGFzIGV2ZXJ5b25lIGVsc2U6XG4gIC8vIHRoZSBibGl0eiBDTEkncyBjb2RlZ2VuIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2UsIHdoaWNoIG11c3QgbmV2ZXIgcnVuXG4gIC8vIHVuZGVyIEJ1bidzIHNoYXJlZCBnbG9iYWwgc3RvcmUuIFlhcm4tZXJhIEJsaXR6IHJlcG9zIGdldCB0aGVpciByb3V0ZSBtYW5pZmVzdCBmcm9tXG4gIC8vIGB3YiBnZW4tY29kZWAncyBgYmxpdHogY29kZWdlbmAgc3RlcCwgYW5kIGN1cnJlbnQgd2Igcm91dGVzIG9ubHkgYHdiIHByaXNtYSBzZWVkYCB0aHJvdWdoXG4gIC8vIHRoZSBibGl0eiBDTEksIG9ubHkgZm9yIG5vbi1CdW4gcmVwb3MgKHNlZSBwYWNrYWdlcy93Yi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzKTsgdGhlXG4gIC8vIHBvc3QtbWVyZ2UgaG9va3Mgc3RheSB3Yi1kcml2ZW4gYmVjYXVzZSBgcHJpc21hIGRlcGxveWAvYGdlbmVyYXRlYCBuZWVkIG5vIGJsaXR6IGxvYWRlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcImJ1biB3YiBwcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc0NvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywgY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzKTtcbiAgaWYgKGdlbkkxOG5Uc0NvbW1hbmQpIHtcbiAgICAvLyBnZW4taTE4bi10cyBvdXRwdXRzIGFyZSBjb21tb25seSBpZ25vcmVkLCBzbyBwb3N0LW1lcmdlIHJlZ2VuZXJhdGVzIHRoZW0gYWZ0ZXIgcHVsbGVkIHJlc291cmNlIGNoYW5nZXMuXG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKF58LylpMThuLy4qXFwuanNvbiRcIiBcIiR7Z2VuSTE4blRzQ29tbWFuZH1cImApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cblxuLy8gVGhlIGdlbmVyYXRlZCBjb21tYW5kIHBhc3NlcyB0aHJvdWdoIFRXTyBzaGVsbCBwYXJzaW5nIHN0YWdlczogdGhlIHByZXBhcmUuc2ggbGluZSBwYXJzZXMgaXQgYXNcbi8vIGEgZG91YmxlLXF1b3RlZCBhcmd1bWVudCAocHJvY2Vzc2luZyBcXCwgYCwgJCBhbmQgXCIgaW1tZWRpYXRlbHkpLCBhbmQgcnVuX2lmX2NoYW5nZWQgdGhlbiBldmFsJ3Ncbi8vIGl0ICh3b3JkLXNwbGl0dGluZyBhbmQgZ2xvYmJpbmcpLiBBbiB1bnF1b3RlZCBwYXRoIGNvbnRhaW5pbmcgc3BhY2VzIChlLmcuIGBhcHBzL215IGFwcC8ubmV4dGApXG4vLyB3b3VsZCB3b3JkLXNwbGl0IGludG8gdW5yZWxhdGVkIHJtIHRhcmdldHMsIGFuZCBgJGAvYmFja3RpY2sgd291bGQgZXhwYW5kIGF0IHRoZSBmaXJzdCBzdGFnZS5cbi8vIFNvOiBzaW5nbGUtcXVvdGUgZm9yIHRoZSBldmFsIHN0YWdlLCB0aGVuIGJhY2tzbGFzaC1lc2NhcGUgdGhlIGRvdWJsZS1xdW90ZS1jb250ZXh0IHNwZWNpYWxzLlxuZnVuY3Rpb24gcXVvdGVGb3JFdmFsdWF0ZWRTaGVsbChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXZhbFF1b3RlZCA9IHF1b3RlRm9yU2hlbGwoZmlsZVBhdGgpO1xuICByZXR1cm4gZXZhbFF1b3RlZC5yZXBsYWNlQWxsKC9bXFxcXGAkXCJdL2d1LCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuZnVuY3Rpb24gcXVvdGVGb3JTaGVsbChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnJHtmaWxlUGF0aC5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG59XG5cbi8qKlxuICogVGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBkaXJlY3RvcmllcyAocm9vdCBmaXJzdCwgZGVkdXBsaWNhdGVkLCBgPHN1YkRpck5hbWU+YCBhcHBlbmRlZCkgb2YgZXZlcnlcbiAqIHdvcmtzcGFjZSB3aG9zZSBjb25maWcgbWF0Y2hlcyB0aGUgcHJlZGljYXRlLiBUaGUgaG9vayBzY3JpcHQgcnVucyBhdCB0aGUgcmVwb3NpdG9yeSByb290LCBzb1xuICogcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IGNvbmZpZydzIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgcHJlZGljYXRlOiAoY29uZmlnOiBQYWNrYWdlQ29uZmlnKSA9PiBib29sZWFuLFxuICBzdWJEaXJOYW1lOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgYWxsQ29uZmlnc1xuICAgICAgICAuZmlsdGVyKChjb25maWcpID0+IHByZWRpY2F0ZShjb25maWcpKVxuICAgICAgICAubWFwKChjb25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKHJvb3RDb25maWcuZGlyUGF0aCwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgICAgICAgIHJldHVybiByZWxhdGl2ZURpclBhdGggPyBwYXRoLnBvc2l4LmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBzdWJEaXJOYW1lKSA6IHN1YkRpck5hbWU7XG4gICAgICAgIH0pXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG5mdW5jdGlvbiBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25SdW5uZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeSBydW4nIHwgJ3V2IHJ1bicge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluVXZMb2NrID8gJ3V2IHJ1bicgOiAncG9ldHJ5IHJ1bic7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ29uZmlnQ29udGVudChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGVudD8udHJpbSgpO1xufVxuIiwiaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nVXRpbC5qcyc7XG5cbmV4cG9ydCB0eXBlIENvbmZpZ0Jsb2NrTmFtZSA9ICdiYXNlJyB8ICdleHBvcnQnO1xuXG5pbnRlcmZhY2UgTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMge1xuICBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcbiAgbWFya2VyUHJlZml4OiBzdHJpbmc7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHZXRDb25maWdDb250ZW50T3B0aW9ucyB7XG4gIGRlc2lyZWRDb250ZW50OiBzdHJpbmc7XG4gIGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZENvbmZpZ0Jsb2NrcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXJrZXJQcmVmaXg6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMpIHtcbiAgICB0aGlzLmJsb2NrTmFtZXMgPSBvcHRpb25zLmJsb2NrTmFtZXM7XG4gICAgdGhpcy5tYXJrZXJQcmVmaXggPSBvcHRpb25zLm1hcmtlclByZWZpeDtcbiAgICB0aGlzLnRvb2xOYW1lID0gb3B0aW9ucy50b29sTmFtZTtcbiAgfVxuXG4gIGdldENvbmZpZ0NvbnRlbnQob3B0aW9uczogR2V0Q29uZmlnQ29udGVudE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmICghb3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICAgIGlmICh0aGlzLmhhc01hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCwgb3B0aW9ucy5kZXNpcmVkQ29udGVudCwgb3B0aW9ucy5maWxlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICB9XG5cbiAgZ2V0QmxvY2soYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKX1cbiR7Y29udGVudH1cbiR7dGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKX1gO1xuICB9XG5cbiAgaGFzTWFuYWdlZEJsb2Nrcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja05hbWVzLnNvbWUoKGJsb2NrTmFtZSkgPT4gY29udGVudC5pbmNsdWRlcyh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcsIGRlc2lyZWRDb250ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gZXhpc3RpbmdDb250ZW50O1xuICAgIGZvciAoY29uc3QgYmxvY2tOYW1lIG9mIHRoaXMuYmxvY2tOYW1lcykge1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0aGlzLmV4dHJhY3RNYW5hZ2VkQmxvY2soZGVzaXJlZENvbnRlbnQsIGJsb2NrTmFtZSk7XG4gICAgICBpZiAoIXJlcGxhY2VtZW50KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudCwgYmxvY2tOYW1lLCByZXBsYWNlbWVudCk7XG4gICAgICBpZiAoIW5leHRDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyBpbmNvbXBsZXRlICR7YmxvY2tOYW1lfSBibG9jayBpbiAke3RoaXMudG9vbE5hbWV9IGNvbmZpZzogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29udGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgPSBuZXh0Q29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSkuZXhlYyhjb250ZW50KT8uWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBSZWdFeHAge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFxuICAgICAgYCR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSl9W1xcXFxzXFxcXFNdKj8ke2VzY2FwZVJlZ0V4cCh0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpKX1gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTpzdGFydCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTplbmQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hmbXQnLFxuICB0b29sTmFtZTogJ294Zm10Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94Zm10Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICBmaWxlUGF0aCxcbiAgICB9KTtcbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3Qgb3hmbXRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnKTtcblxuICAvLyBDb21tb25KUyBwYWNrYWdlcyBuZWVkIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMgaGVyZTogb3hmbXQgY29uZmlnIGZpbGVzIGFyZVxuICAvLyBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCB0aGUgc2hhcmVkIGNvbmZpZyBwYWNrYWdlIGlzIEVTTS1vbmx5LlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94Zm10IGNvbmZpZyBmaWxlcyBhcmUgb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hmbXRDb25maWcgPSByZXF1aXJlKCcke294Zm10QmFzZUNvbmZpZ01vZHVsZX0nKTtcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBveGZtdENvbmZpZy5kZWZhdWx0ID8/IG94Zm10Q29uZmlnO2BcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG5pbXBvcnQgY29uZmlnIGZyb20gJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gY29uZmlnO2BcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlLFxuICByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUsXG59IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gZ2VuZXJhdGlvblxuICAgIC8vIG11c3Qgbm90IHJlcGxhY2UgcGFja2FnZS1wcm92aWRlZCBsaW50ZXIgc2V0dGluZ3MuIEdlbmVyYXRlZCBmaWxlcyB3aXRoXG4gICAgLy8gbWFuYWdlZCBibG9ja3MgYXJlIHN0aWxsIHNhZmUgdG8gdXBkYXRlLlxuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnID0gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGxpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudCAmJiAhbWFuYWdlZENvbmZpZ0Jsb2Nrcy5oYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudFxuICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgIDogbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgfSk7XG5cbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgaXNSb290Q29uZmlnID0gY29uZmlnLmlzUm9vdDtcbiAgY29uc3Qgb3hsaW50QmFzZUNvbmZpZ01vZHVsZSA9IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWcsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycpO1xuXG4gIC8vIERvIG5vdCBjb2xsYXBzZSB0aGlzIHRvIGEgc3RhdGljIGltcG9ydCBmb3IgZXZlcnkgcGFja2FnZS4gQ29tbW9uSlMgcGFja2FnZXNcbiAgLy8gdHlwZS1jaGVjayBhdXRvLWRpc2NvdmVyZWQgb3hsaW50LmNvbmZpZy50cyBhcyBDb21tb25KUywgc28gaW1wb3J0aW5nIHRoZSBFU01cbiAgLy8gQHdpbGxib29zdGVyL294bGludC1jb25maWcgcGFja2FnZSB0cmlnZ2VycyBUUzE0NzkuIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGhcbiAgLy8gbGl0ZXJhY3ktdGVzdCdzIGdlbmVyYXRlZCBjb25maWcgcGF0dGVybi5cbiAgLy8gTm8gLy8vIDxyZWZlcmVuY2UgdHlwZXM+IGxpbmU6IHRoZSB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZyBhbHJlYWR5IGNvdmVycyAqLmNvbmZpZy50cyB3aXRoXG4gIC8vIHR5cGVzIFtcImJ1blwiXSwgd2hpY2ggdHlwZXMgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cywgd2hpbGUgYSBcIm5vZGVcIiByZWZlcmVuY2UgYnJlYWtzIHVuZGVyXG4gIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciB3aGVyZSB0aGUgdW5kZWNsYXJlZCBAdHlwZXMvbm9kZSBpcyB1bnJlc29sdmFibGUgKFRTMjY4OCkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZy5kZWZhdWx0ID8/IG94bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG5pbXBvcnQgb3hsaW50QmFzZUNvbmZpZyBmcm9tICcke294bGludEJhc2VDb25maWdNb2R1bGV9JztcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuXG4vLyBzdHJ1Y3R1cmVkQ2xvbmUga2VlcHMgYSBwYWNrYWdlLWxvY2FsIGNvcHkgc28gcmVwb3NpdG9yaWVzIGNhbiBhZGQgc2V0dGluZ3Mgb3V0c2lkZSBtYW5hZ2VkXG4vLyBibG9ja3Mgd2l0aG91dCBtdXRhdGluZyB0aGUgc2hhcmVkIGltcG9ydGVkIGNvbmZpZyBvYmplY3QuIFRoZSByb290IGNvbmZpZyBmb3JjZXMgdGhlIHR5cGUtYXdhcmVcbi8vIG9wdGlvbnMgb24gaW5zaWRlIHRoZSBtYW5hZ2VkIGJsb2NrIHNvIG5vIGN1c3RvbWl6YXRpb24gY2FuIHNpbGVudGx5IGRpc2FibGUgdHlwZSBjaGVja2luZzsgZXZlcnlcbi8vIG90aGVyIGNvbmZpZyBkZWxldGVzIHRoZW0gYmVjYXVzZSBPeGxpbnQgcmVqZWN0cyB0aG9zZSByb290LW9ubHkgb3B0aW9ucyBlbHNld2hlcmUgKHR5cGUgY2hlY2tpbmdcbi8vIHN1cnZpdmVzOiB0aGUgbGludCBjb21tYW5kcyBwYXNzIC0tdHlwZS1hd2FyZSBhbmQgLS10eXBlLWNoZWNrIGV4cGxpY2l0bHkpLlxuZnVuY3Rpb24gZ2V0UmVzb2x2ZWRDb25maWdDb250ZW50KGJhc2VDb25maWdOYW1lOiBzdHJpbmcsIGlzUm9vdENvbmZpZzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChpc1Jvb3RDb25maWcpIHtcbiAgICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucyA9IHsgLi4ub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucywgdHlwZUF3YXJlOiB0cnVlLCB0eXBlQ2hlY2s6IHRydWUgfTtgO1xuICB9XG5cbiAgcmV0dXJuIGBjb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogT3hsaW50Q29uZmlnID0gc3RydWN0dXJlZENsb25lKCR7YmFzZUNvbmZpZ05hbWV9KTtcbmRlbGV0ZSBveGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zO2A7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9yaWdpbmFsU2V0dGluZ3NKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShvbGRDb250ZW50KSkge1xuICAgICAgLy8gcHlyaWdodGNvbmZpZy5qc29uIGFsbG93cyBKU09OQzsgYW4gZXhpc3RpbmcgZmlsZSB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnRcbiAgICAgIC8vIHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIGJhcmUgdGVtcGxhdGUuXG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8b2JqZWN0PihvbGRDb250ZW50KTtcbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG9sZFNldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS1jbGVhbiBweXJpZ2h0Y29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKG9yaWdpbmFsU2V0dGluZ3NKc29uID09PSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUobmV3U2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgY29uc3VtZXNEb2NrZXJFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbWFuYWdlZFNjcmlwdHNCbG9jayA9IGBzY3JpcHRzLyoqXG4hc2NyaXB0cy9cbiFzY3JpcHRzLyouc2hgO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UmFpbHdheWlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhSYWlsd2F5aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJhaWx3YXlpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHVzZXNEb2NrZXJFbnYgPSBjb25zdW1lc0RvY2tlckVudihjb25maWcuZG9ja2VyZmlsZSk7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICBpZiAoY29uZmlnLmlzUmFpbHdheSAmJiB1c2VzRG9ja2VyRW52KSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCAnIS5kb2NrZXIuZW52XFxuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9ec2NyaXB0c1xcLyQvbSwgbWFuYWdlZFNjcmlwdHNCbG9jayk7XG4gICAgLy8gYHJhaWx3YXkgdXBgIHN0cmlwcyBnaXRpZ25vcmVkIGZpbGVzIGZyb20gdGhlIHVwbG9hZGVkIGJ1aWxkIGNvbnRleHQsIHNvIHRoZSBnZW5lcmF0ZWRcbiAgICAvLyBub24tc2VjcmV0IC5kb2NrZXIuZW52IChgd2IgZ2VuLWRvY2tlci1lbnZgIG91dHB1dCkgbmVlZHMgYW4gZXhwbGljaXQgdW4taWdub3JlIHRvIHJlYWNoXG4gICAgLy8gdGhlIHJlbW90ZSBEb2NrZXIgYnVpbGQuIEFwcGVuZGVkLCBub3QgcHJlcGVuZGVkOiBpZ25vcmUgZmlsZXMgYXJlIGxhc3QtbWF0Y2gtd2lucywgc28gYVxuICAgIC8vIGhhbmQtd3JpdHRlbiBwYXR0ZXJuIHN1Y2ggYXMgYCouZW52YCBlYXJsaWVyIGluIHRoZSBmaWxlIG11c3Qgbm90IHNpbGVudGx5IHJlLWV4Y2x1ZGUgaXQuXG4gICAgaWYgKHVzZXNEb2NrZXJFbnYgJiYgIS9eIVxcLmRvY2tlclxcLmVudiQvbS50ZXN0KG5ld0NvbnRlbnQpKSB7XG4gICAgICBuZXdDb250ZW50ID0gYCR7bmV3Q29udGVudC5yZXBsYWNlKC9cXG4/JC8sICdcXG4nKX0hLmRvY2tlci5lbnZcXG5gO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvY2tlcmZpbGUgJiYgIXVzZXNEb2NrZXJFbnYpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL14hXFwuZG9ja2VyXFwuZW52XFxuPy9tLCAnJyk7XG4gICAgfVxuICAgIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIG5ld0NvbnRlbnQgPyBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSA6IGZzVXRpbC5yZW1vdmVDb25maW5lZChmaWxlUGF0aClcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgSW1hZ2UsIExpbmssIFBhcmFncmFwaCwgUGhyYXNpbmdDb250ZW50LCBSb290Q29udGVudCB9IGZyb20gJ21kYXN0JztcbmltcG9ydCB7IGZyb21NYXJrZG93biB9IGZyb20gJ21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cgfSBmcm9tICcuL3dvcmtmbG93LmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0V2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5jb25zdCB3YmZ5QmFkZ2VVcmxQcmVmaXggPSAnaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS93YmZ5LSc7XG5jb25zdCB3YmZ5QmFkZ2VVcmxTdWZmaXggPSAnLTFlOTBmZi5zdmcnO1xuY29uc3Qgd2JmeUJhZGdlTGluayA9ICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL3RyZWUvbWFpbi9wYWNrYWdlcy93YmZ5JztcblxuY29uc3QgbnBtUGFja2FnZVVybFByZWZpeCA9ICdodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS8nO1xuXG5jb25zdCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucyA9IFtcbiAgL15cXFshXFxbd2JmeVxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL2JhZGdlXFwvd2JmeS1bXilcXHNdKy0xZTkwZmZcXC5zdmdcXClcXF1cXChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9XaWxsQm9vc3RlclxcL3NoYXJlZFxcL3RyZWVcXC9tYWluXFwvcGFja2FnZXNcXC93YmZ5XFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1teKVxcc10rXFwvYWN0aW9uc1xcL3dvcmtmbG93c1xcL1teKVxcc10rKVxcL2JhZGdlXFwuc3ZnXFwpXFxdXFwoXFwxXFwpJC91LFxuICAvLyBBbnkgYmFkZ2UgbGlua2luZyB0byBhbiBucG0gcGFja2FnZSBwYWdlLCB3aGF0ZXZlciBpbWFnZSBpdCBzaG93cyBhbmQgaG93ZXZlciB0aGUgbGluayBpc1xuICAvLyBzcGVsbGVkOiB0aGUgYmxvY2sgaXMgd2JmeSdzLCBpdCB3cml0ZXMgYXQgbW9zdCBvbmUgbnBtIGJhZGdlLCBzbyBhIGJhZGdlIGZvciBhIHJlbmFtZWQgb3JcbiAgLy8gdW5wdWJsaXNoZWQgcGFja2FnZSBpcyBhIHN0YWxlIGNvcHkgb2YgdGhhdCBvbmUg4oCUIG5vdCBhbm90aGVyIGJhZGdlIHRvIGtlZXAgYmVzaWRlIGl0LlxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoW14pXFxzXStcXClcXF1cXChodHRwcz86XFwvXFwvKD86d3d3XFwuKT9ucG1qc1xcLmNvbVxcL3BhY2thZ2VcXC9bXilcXHNdKlxcKSQvdSxcbl07XG5cbmZ1bmN0aW9uIGJ1aWxkV2JmeUJhZGdlKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIeXBoZW5zIGFyZSBlc2NhcGVkIGFzIGAtLWAgcGVyIHNoaWVsZHMuaW8ncyBiYWRnZSBwYXRoIHN5bnRheCwgc28gYHYxLjIuMy1yYy4xYCBzdGF5cyBpbnRhY3QuXG4gIHJldHVybiBgWyFbd2JmeV0oJHt3YmZ5QmFkZ2VVcmxQcmVmaXh9JHtsYWJlbC5yZXBsYWNlQWxsKCctJywgJy0tJyl9JHt3YmZ5QmFkZ2VVcmxTdWZmaXh9KV0oJHt3YmZ5QmFkZ2VMaW5rfSlgO1xufVxuXG4vKiogVGhlIHZlcnNpb24gbGFiZWwgdGhlIHdiZnkgYmFkZ2UgaW4gdGhlIHJlcG9zaXRvcnkncyBSRUFETUUgcmVjb3JkcywgaS5lLiB0aGUgYnVpbGQgdGhhdCB3YmZpZWQgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIENvbmZpbmVkLCBhbmQgdG9sZXJhbnQgb2YgYW55IHJlYWQgZmFpbHVyZTogYSBSRUFETUUgdGhhdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IChhXG4gIC8vIGNvbW1pdHRlZCBzeW1saW5rKSBvciBjYW5ub3QgYmUgcmVhZCBhdCBhbGwgc2F5cyBub3RoaW5nIGFib3V0IHdoaWNoIGJ1aWxkIGNvbmZpZ3VyZWQgVEhJU1xuICAvLyByZXBvc2l0b3J5LCBhbmQgdGhlIGFuc3dlciBvbmx5IGV2ZXIgc3VwcHJlc3NlcyB3b3JrIOKAlCBzbyBhbnl0aGluZyBidXQgYSByZWFkYWJsZSBpbi1yZXBvc2l0b3J5XG4gIC8vIFJFQURNRSBtZWFucyBcIm5vdCBrbm93biB0byBiZSBhcHBsaWVkXCIgYW5kIHRoZSBydW4gcHJvY2VlZHMuXG4gIGNvbnN0IHJlYWRtZSA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdSRUFETUUubWQnKSkuY2F0Y2goKCkgPT4ge30pO1xuICBpZiAocmVhZG1lID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFJFQURNRSBpcyBwYXJzZWQgcmF0aGVyIHRoYW4gc2Nhbm5lZCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3cml0ZUJhZGdlQmxvY2sgcGFyc2VzIGl0LCBhbmRcbiAgLy8gb25seSB0aGUgc2hhcGUgd3JpdGVCYWRnZUJsb2NrIGl0c2VsZiB3cml0ZXMgY291bnRzIGFzIGFuIGFwcGxpZWQgYmFkZ2U6IGEgdG9wLWxldmVsIHBhcmFncmFwaFxuICAvLyBvZiBiYWRnZXMuIEEgYmFkZ2UgYW55d2hlcmUgZWxzZSBpcyBjb250ZW50IHRoYXQgbWVyZWx5IG1lbnRpb25zIG9uZSDigJQgYSBmZW5jZWQgZXhhbXBsZSAod2JmeSdzXG4gIC8vIG93biBkb2N1bWVudGF0aW9uIGhhcyB0aG9zZSksIGEgYmxvY2sgcXVvdGUsIGEgbGlzdCBpdGVtIOKAlCBhbmQgcmVhZGluZyBpdCBhcyBhcHBsaWVkIHdvdWxkIHNraXBcbiAgLy8gZXZlcnkgZml4ZXIgZm9yIHRoZSByZXBvc2l0b3J5LlxuICBmb3IgKGNvbnN0IG5vZGUgb2YgZnJvbU1hcmtkb3duKHJlYWRtZSkuY2hpbGRyZW4pIHtcbiAgICBpZiAoIWlzQmFkZ2VCbG9ja05vZGUobm9kZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYmFkZ2Ugb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKCFpc0JhZGdlTm9kZShiYWRnZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyB1cmwgfSA9IGJhZGdlLmNoaWxkcmVuWzBdO1xuICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHdiZnlCYWRnZVVybFByZWZpeCkgJiYgdXJsLmVuZHNXaXRoKHdiZnlCYWRnZVVybFN1ZmZpeCkpIHtcbiAgICAgICAgcmV0dXJuIHVybC5zbGljZSh3YmZ5QmFkZ2VVcmxQcmVmaXgubGVuZ3RoLCAtd2JmeUJhZGdlVXJsU3VmZml4Lmxlbmd0aCkucmVwbGFjZUFsbCgnLS0nLCAnLScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICAvLyBUaGUgd2JmeSBiYWRnZSBtYXJrcyBhIHJlcG9zaXRvcnkgYXMgd2JmaWVkLCBzbyBhIHJlcG9zaXRvcnkgd2l0aG91dCBhIFJFQURNRSBzdGlsbCBnZXRzIG9uZS5cbiAgICAvLyByZWFkRmlsZUlmRXhpc3RzIGZhbGxzIGJhY2sgT05MWSBvbiBFTk9FTlQ6IGEgUkVBRE1FIHRoYXQgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZCAoZS5nLlxuICAgIC8vIHBlcm1pc3Npb25zLCBFTUZJTEUpIG11c3QgYWJvcnQgdGhlIGdlbmVyYXRvciBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIHN0dWIuXG4gICAgbGV0IG5ld0NvbnRlbnQgPVxuICAgICAgKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz9cbiAgICAgIGAjICR7Y29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID8/IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSl9XFxuYDtcblxuICAgIC8vIE9yZGVyZWQgYnkgd2hhdCBhIHJlYWRlciBjYXJlcyBhYm91dCBtb3N0OiB0aGUgbnBtIGJhZGdlIG5hbWVzIHRoZSBwYWNrYWdlIGEgcmVhZGVyIGluc3RhbGxzLFxuICAgIC8vIHRoZW4gdGhlIHdvcmtmbG93IGJhZGdlcyByZXBvcnQgd2hldGhlciB0aGUgY29kZSBpcyBjdXJyZW50bHkgaGVhbHRoeSwgdGhlbiBob3cgaXQgaXNcbiAgICAvLyByZWxlYXNlZCwgYW5kIGxhc3QgdGhlIHdiZnkgYnVpbGQgdGhhdCBjb25maWd1cmVkIGl0LlxuICAgIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBucG1QYWNrYWdlTmFtZSA9IGF3YWl0IGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZyk7XG4gICAgaWYgKG5wbVBhY2thZ2VOYW1lKSBiYWRnZXMucHVzaChidWlsZE5wbUJhZGdlKG5wbVBhY2thZ2VOYW1lKSk7XG4gICAgYmFkZ2VzLnB1c2goLi4uKGF3YWl0IGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnKSkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkgYmFkZ2VzLnB1c2goc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIGJhZGdlcy5wdXNoKGJ1aWxkV2JmeUJhZGdlKGdldFdiZnlWZXJzaW9uTGFiZWwoKSA/PyAnYXBwbGllZCcpKTtcblxuICAgIC8vIFRoZSBibG9jayBpcyB3cml0dGVuIGluIG9uZSBwYXNzIGZyb20gdGhlIGJhZGdlcyB3YmZ5IG1hbmFnZXMgcmlnaHQgbm93LiBBIGJhZGdlIHRoYXQgaXMgbm9cbiAgICAvLyBsb25nZXIgd2FudGVkIOKAlCBhIHN1cGVyc2VkZWQgdmVyc2lvbiwgb3Igb25lIHdob3NlIHdvcmtmbG93IGlzIGdvbmUg4oCUIHNpbXBseSBpcyBub3QgaW4gdGhlXG4gICAgLy8gbGlzdCwgc28gbm90aGluZyBoYXMgdG8gcmVtb3ZlIGl0LlxuICAgIG5ld0NvbnRlbnQgPSB3cml0ZUJhZGdlQmxvY2sobmV3Q29udGVudCwgYmFkZ2VzKTtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50LCBnZXRMaW5lRW5kaW5nKG5ld0NvbnRlbnQpKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBucG0gcGFja2FnZSBuYW1lIHRoZSByZXBvc2l0b3J5IHB1Ymxpc2hlcyBmcm9tIGl0cyByb290IG1hbmlmZXN0LCBpZiBhbnkuIEEgbWFuaWZlc3Qgbm9cbiAqIHJlbGVhc2UgcHVibGlzaGVzLCBvciBvbmUga2VwdCBvdXQgb2YgdGhlIHJlZ2lzdHJ5IG9uIHB1cnBvc2UsIGhhcyBubyBwYWNrYWdlIHBhZ2UgdG8gbGluayB0by5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGlzaGVkTnBtUGFja2FnZU5hbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIGlmICghcGFja2FnZUpzb24/Lm5hbWUgfHwgIWNvbmZpZy5yZWxlYXNlLm5wbSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gYHByaXZhdGVgIGlzIHJlYWQgdGhlIHdheSBnZW5lcmF0ZVBhY2thZ2VKc29uIHdyaXRlcyBpdDogaXQgcmVtb3ZlcyB0aGUgZmxhZyBmcm9tIGEgTU9OT1JFUE9cbiAgLy8gcm9vdCB0aGF0IGRlY2xhcmVzIHB1Ymxpc2hpbmcgaW50ZW50LCBzbyByZWFkaW5nIHRoZSBmbGFnIGFsb25lIHdvdWxkIGRlbnkgdGhlIGJhZGdlIHRvIHRoZVxuICAvLyB2ZXJ5IG1hbmlmZXN0IHRoZSBzYW1lIHJ1biBtYWtlcyBwdWJsaXNoYWJsZS4gQW55d2hlcmUgZWxzZSB0aGUgZmxhZyBzdGFuZHMgYXMgd3JpdHRlbi5cbiAgY29uc3QgZGVjbGFyZXNQdWJsaXNoaW5nSW50ZW50ID0gISFwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnIHx8IGNvbmZpZy5yZWxlYXNlLm5wbVB1Ymxpc2hlc1Jvb3Q7XG4gIGlmIChwYWNrYWdlSnNvbi5wcml2YXRlICYmICEoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmIGRlY2xhcmVzUHVibGlzaGluZ0ludGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIFRoZSBtYW5pZmVzdCBvbmx5IHNheXMgdGhlIHJlcG9zaXRvcnkgSU5URU5EUyB0byBwdWJsaXNoOiBhIG1vbm9yZXBvIHJvb3QgdGhhdCBjb25maWd1cmVzXG4gIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbSBmb3IgaXRzIHdvcmtzcGFjZXMgaXMgbmV2ZXIgb24gbnBtIGl0c2VsZiwgYW5kIGEgcGFja2FnZSdzIGZpcnN0IHJlbGVhc2VcbiAgLy8gaGFzIG5vdCBoYXBwZW5lZCB5ZXQuIEJvdGggd291bGQgcmVuZGVyIGEgYnJva2VuIGJhZGdlLCBzbyB0aGUgcmVnaXN0cnkgZGVjaWRlcy5cbiAgcmV0dXJuIChhd2FpdCBpc01pc3NpbmdGcm9tTnBtUmVnaXN0cnkocGFja2FnZUpzb24ubmFtZSkpID8gdW5kZWZpbmVkIDogcGFja2FnZUpzb24ubmFtZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWdpc3RyeSBhbnN3ZXJzIHRoYXQgaXQgaGFzIG5vIHN1Y2ggcGFja2FnZSDigJQgdGhlIE9OTFkgYW5zd2VyIHRoYXQgcmVtb3ZlcyBhIGJhZGdlLlxuICogQSBjaGVjayB0aGF0IGNhbm5vdCBydW4gKG9mZmxpbmUsIGFuIG91dGFnZSwgYSB0aW1lb3V0KSBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHBhY2thZ2UsIGFuZFxuICogdHJlYXRpbmcgaXQgYXMgYWJzZW50IHdvdWxkIHN0cmlwIHRoZSBiYWRnZSBvdXQgb2YgZXZlcnkgcHVibGlzaGVkIHJlcG9zaXRvcnkgd2JmeSB0b3VjaGVzXG4gKiBkdXJpbmcgdGhlIG91dGFnZSBhbmQgcHV0IGl0IGJhY2sgYWZ0ZXJ3YXJkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICAvLyBUaGUgc2NvcGUgc2VwYXJhdG9yIG11c3Qgc3Vydml2ZSBhcyBhIHBhdGggc2VnbWVudCwgc28gdGhlIG5hbWUgaXMgZW5jb2RlZCBwaWVjZXdpc2UuXG4gICAgY29uc3QgZW5jb2RlZE5hbWUgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLycpLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJy8nKTtcbiAgICAvLyBBIGJhZGdlIGlzIGRlY29yYXRpb246IGEgc3RhbGxlZCByZWdpc3RyeSBjb25uZWN0aW9uIG11c3Qgbm90IGhvbGQgdGhlIHdob2xlIHJ1biBmb3IgaG93ZXZlclxuICAgIC8vIGxvbmcgdGhlIG5ldHdvcmtpbmcgc3RhY2sgd291bGQgd2FpdC4gVGhlIGJ1ZGdldCBpcyBnZW5lcm91cyBiZWNhdXNlIGEgdGltZW91dCBhbnN3ZXJzXG4gICAgLy8gXCJ1bmtub3duXCIsIHdoaWNoIGtlZXBzIHRoZSBiYWRnZSDigJQgYW5kIG9uIGEgcmVwb3NpdG9yeSB0aGF0IGlzIG5vdCBvbiBucG0gdGhhdCBtZWFucyB3cml0aW5nXG4gICAgLy8gb25lIGl0IHNob3VsZCBub3QgaGF2ZTsgYSB3YmZ5IHJ1biBhbHJlYWR5IHNwZW5kcyBtaW51dGVzIG9uIGluc3RhbGxzLCBzbyB3YWl0aW5nIGEgbGl0dGxlXG4gICAgLy8gbG9uZ2VyIGZvciBhIHJlYWwgYW5zd2VyIGNvc3RzIGxlc3MgdGhhbiBhY3Rpbmcgb24gYSBtaXNzaW5nIG9uZS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8ke2VuY29kZWROYW1lfWAsIHtcbiAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDEwXzAwMCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGROcG1CYWRnZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBbIVtucG0gdmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vdi8ke3BhY2thZ2VOYW1lfS5zdmcpXSgke25wbVBhY2thZ2VVcmxQcmVmaXh9JHtwYWNrYWdlTmFtZX0pYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRXb3JrZmxvd0JhZGdlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICBpZiAoIXJlcG9zaXRvcnkgfHwgIWZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkpIHJldHVybiBbXTtcblxuICAvLyBXb3JrZmxvdyBhbmQgUkVBRE1FIGdlbmVyYXRpb24gcnVuIGNvbmN1cnJlbnRseS4gRG8gbm90IHJldGFpbiBhIHN0YWxlIFJ1c3QgYmFkZ2Ugd2hpbGUgdGhlXG4gIC8vIHdvcmtmbG93IGdlbmVyYXRvciByZW1vdmVzIGEgY2FsbGVyIGNyZWF0ZWQgZnJvbSBhIGZvcm1lcmx5IG1pc2RldGVjdGVkIGxvY2FsIGNhY2hlIOKAlCBidXRcbiAgLy8gbWlycm9yIGl0cyBvd25lcnNoaXAgY2hlY2s6IGEgY3VzdG9tIHNhbWUtbmFtZWQgd29ya2Zsb3cgc3Vydml2ZXMsIHNvIGl0cyBiYWRnZSBtdXN0IHRvby5cbiAgLy8gRGVjaWRlZCBzeW5jaHJvbm91c2x5IGJlZm9yZSB0aGUgbG9vcCdzIGZpcnN0IGF3YWl0OiB0aGUgZ2VuZXJhdG9yJ3MgZGVsZXRlIGNhbiBvbmx5IGxhbmQgYXRcbiAgLy8gYW4gYXdhaXQgcG9pbnQsIGFuZCBhIHBvc3QtZGVsZXRlIHJlYWQgd291bGQgbWlzcmVwb3J0IHRoZSB3YmZ5LW93bmVkIGNhbGxlciBhcyBjdXN0b20uXG4gIC8vIE5vIGV4aXN0c1N5bmMgcHJlLWNoZWNrOiB0aGUgaGVscGVyIGFscmVhZHkgdHJlYXRzIGEgbWlzc2luZyBmaWxlIGFzIG5vdCBvd25lZCwgYW5kIHRoaXMgcnVuc1xuICAvLyBvbmNlIHBlciByZXBvc2l0b3J5LCBzbyB0aGUgZXhjZXB0aW9uYWwgRU5PRU5UIHJlYWQgY29zdHMgbm90aGluZyB3b3J0aCBhIHJlZHVuZGFudCBzdGF0LlxuICBjb25zdCBkcm9wc1Rlc3RSdXN0QmFkZ2UgPVxuICAgIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDAgJiYgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGgsICd0ZXN0LXJ1c3QueW1sJywgJ3Rlc3QtcnVzdCcpO1xuXG4gIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSkge1xuICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG4gICAgaWYgKGZpbGVOYW1lID09PSAndGVzdC1ydXN0LnltbCcgJiYgZHJvcHNUZXN0UnVzdEJhZGdlKSBjb250aW51ZTtcbiAgICAvLyBHaXRIdWIncyBiYWRnZSBlbmRwb2ludCByZXR1cm5zIDQwNCB1bnRpbCB0aGUgd29ya2Zsb3cgaGFzIGF0IGxlYXN0IG9uZSBydW4sIHNvIGEgYmFkZ2UgZm9yIGFcbiAgICAvLyBkaXNwYXRjaC1vbmx5IGRlcGxveSB3b3JrZmxvdyB0aGF0IGhhcyBuZXZlciBydW4gcmVuZGVycyBhcyBhIGJyb2tlbiBpbWFnZS4gVGVzdCB3b3JrZmxvd3MgcnVuXG4gICAgLy8gb24gZXZlcnkgUFIsIHNvIG9ubHkgZGVwbG95IGJhZGdlcyBuZWVkIHRoZSBndWFyZC5cbiAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgIShhd2FpdCBoYXNBbnlXb3JrZmxvd1J1bihyZXBvc2l0b3J5LCBmaWxlTmFtZSwgY29uZmlnLmlzUHVibGljUmVwbykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYmFkZ2VOYW1lID0gKGZpbGVOYW1lWzBdID8/ICcnKS50b1VwcGVyQ2FzZSgpICsgZmlsZU5hbWUuc2xpY2UoMSwgZmlsZU5hbWUuaW5kZXhPZignLicpKS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICBjb25zdCB3b3JrZmxvd1VybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2VuY29kZVVybFBhdGgoZmlsZU5hbWUpfWA7XG4gICAgYmFkZ2VzLnB1c2goYFshWyR7YmFkZ2VOYW1lfV0oJHt3b3JrZmxvd1VybH0vYmFkZ2Uuc3ZnKV0oJHt3b3JrZmxvd1VybH0pYCk7XG4gIH1cbiAgcmV0dXJuIGJhZGdlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzQW55V29ya2Zsb3dSdW4oXG4gIHJlcG9zaXRvcnk6IHN0cmluZyxcbiAgd29ya2Zsb3dGaWxlTmFtZTogc3RyaW5nLFxuICBpc1B1YmxpY1JlcG86IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gcmVwb3NpdG9yeS5zcGxpdCgnLycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQob3duZXIpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgd29ya2Zsb3dfaWQ6IHdvcmtmbG93RmlsZU5hbWUsXG4gICAgICBwZXJfcGFnZTogMSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS50b3RhbF9jb3VudCA+IDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRm9yIGEgUFVCTElDIHJlcG9zaXRvcnkgdGhlIHJ1bnMgZW5kcG9pbnQgbmVlZHMgbm8gYXV0aG9yaXphdGlvbiwgc28gNDA0IHJlbGlhYmx5IG1lYW5zIHRoZVxuICAgIC8vIHdvcmtmbG93IGlzIGFic2VudCBmcm9tIHRoZSByZW1vdGUgKGUuZy4gYWRkZWQgbG9jYWxseSwgbmV2ZXIgcHVzaGVkKSDigJQgbGlrZSB6ZXJvIHJ1bnMsIGl0c1xuICAgIC8vIGJhZGdlIHdvdWxkIHJlbmRlciBicm9rZW4uIEZvciBhIFBSSVZBVEUgcmVwb3NpdG9yeSBHaXRIdWIgYWxzbyBhbnN3ZXJzIDQwNCB3aGVuIHRoZSB0b2tlblxuICAgIC8vIGlzIG1pc3Npbmcgb3IgdW5kZXItc2NvcGVkLCBzbyA0MDQgaXMgYW1iaWd1b3VzIHRoZXJlIGFuZCB0aGUgYmFkZ2UgaXMga2VwdC5cbiAgICBpZiAoKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cyA9PT0gNDA0ICYmIGlzUHVibGljUmVwbykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEtlZXAgdGhlIHByZS1ndWFyZCBiZWhhdmlvciAoaW5zZXJ0IHRoZSBiYWRnZSkgd2hlbiB0aGUgY2hlY2sgaXRzZWxmIGNhbm5vdCBydW4uXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXBsYWNlcyB0aGUgYmFkZ2UgYmxvY2sg4oCUIHRoZSBiYWRnZXMgd2JmeSBrZWVwcyBkaXJlY3RseSB1bmRlciB0aGUgdGl0bGUg4oCUIHdpdGggYG1hbmFnZWRCYWRnZXNgLFxuICoga2VlcGluZyBhbnkgYmFkZ2UgdGhlcmUgdGhhdCB3YmZ5IGRvZXMgbm90IG1hbmFnZSwgYW5kIHJlYXNzZW1ibGVzIHRoZSBSRUFETUUgYXJvdW5kIGl0IHdpdGhcbiAqIGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgb24gZWFjaCBzaWRlLlxuICpcbiAqIEJvdGggdGhlIHRpdGxlIGFuZCB0aGUgYmxvY2sgYXJlIGxvY2F0ZWQgaW4gYSBDb21tb25NYXJrIHN5bnRheCB0cmVlIHJhdGhlciB0aGFuIGJ5IHNjYW5uaW5nXG4gKiBsaW5lczogb25seSBhIHJlYWwgcGFyc2VyIGtub3dzIHdoZXRoZXIgYSBsaW5lIHRoYXQgbG9va3MgbGlrZSBhIGJhZGdlIGlzIGEgYmFkZ2UgKGEgcGFyYWdyYXBoIG9mXG4gKiBsaW5rZWQgaW1hZ2VzKSBvciBjb250ZW50IHRoYXQgbWVyZWx5IHJlYWRzIGxpa2Ugb25lIChhbiBpbmRlbnRlZCBjb2RlIGJsb2NrLCBhIGJsb2NrIHF1b3RlLCBhXG4gKiBmZW5jZWQgZXhhbXBsZSwgYSBtdWx0aWxpbmUgY29kZSBzcGFuLCBhbiBIVE1MIGJsb2NrKS4gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBibG9jayBpcyBjb3BpZWQgYmFja1xuICogdmVyYmF0aW0gZnJvbSB0aGUgb3JpZ2luYWwgdGV4dCB0aHJvdWdoIHRoZSBwYXJzZXIncyBwb3NpdGlvbmFsIG9mZnNldHMsIHNvIG5vIHJlZm9ybWF0dGluZyBvZiB0aGVcbiAqIHVzZXIncyBjb250ZW50IGlzIHBvc3NpYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVCYWRnZUJsb2NrKHJlYWRtZTogc3RyaW5nLCBtYW5hZ2VkQmFkZ2VzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVFbmRpbmcgPSBnZXRMaW5lRW5kaW5nKHJlYWRtZSk7XG4gIC8vIEEgQk9NIGlzIG5vdCBNYXJrZG93bjogbGVmdCBpbiB0aGUgdGV4dCBpdCBoaWRlcyB0aGUgYCNgIG9mIHRoZSB0aXRsZSBmcm9tIHRoZSBwYXJzZXIsIGFuZFxuICAvLyBwcmVwZW5kaW5nIHRoZSBibG9jayBhaGVhZCBvZiBpdCB3b3VsZCBzdHJpcCB0aGUgbWFya2VyIGZyb20gdGhlIGZpbGUncyBmaXJzdCBieXRlLlxuICBjb25zdCBieXRlT3JkZXJNYXJrID0gcmVhZG1lLnN0YXJ0c1dpdGgoJ++7vycpID8gJ++7vycgOiAnJztcbiAgLy8gRnJvbnQgbWF0dGVyIGlzIGRlbGltaXRlZCBieSB0aGUgc2FtZSBgLS0tYCBhIFNldGV4dCBoZWFkaW5nIGFuZCBhIHRoZW1hdGljIGJyZWFrIHVzZSwgc28gaXQgaXNcbiAgLy8gZGV0YWNoZWQgYmVmb3JlIHBhcnNpbmcgaW5zdGVhZCBvZiBiZWluZyB0b2xkIGFwYXJ0IGFmdGVyd2FyZHM7IGl0IGFsc28gaGFzIHRvIHN0YXkgZmlyc3QgaW4gdGhlXG4gIC8vIGZpbGUsIHdoaWNoIG1ha2VzIGl0IGEgcHJlZml4IGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IHRoZSBCT00gaXMuXG4gIGNvbnN0IHdpdGhvdXRNYXJrID0gcmVhZG1lLnNsaWNlKGJ5dGVPcmRlck1hcmsubGVuZ3RoKTtcbiAgY29uc3QgZnJvbnRNYXR0ZXIgPSB3aXRob3V0TWFyay5zdGFydHNXaXRoKCctLS0nKVxuICAgID8gKC9eLS0tWyBcXHRdKlxccj9cXG5bXFxzXFxTXSo/Xi0tLVsgXFx0XSooPzpcXHI/XFxufCQpL211LmV4ZWMod2l0aG91dE1hcmspPy5bMF0gPz8gJycpXG4gICAgOiAnJztcbiAgY29uc3QgcHJlZml4ID0gYCR7Ynl0ZU9yZGVyTWFya30ke2Zyb250TWF0dGVyfWA7XG4gIC8vIFRoZSBmaW5hbCBuZXdsaW5lIGlzIHNldCBhc2lkZSByYXRoZXIgdGhhbiBwYXJzZWQgYXMgdHJhaWxpbmcgYmxhbmsgc3BhY2UsIHdoaWNoIHRoZSBibGFuay1saW5lXG4gIC8vIHRyaW1taW5nIGJlbG93IHdvdWxkIG90aGVyd2lzZSBzd2FsbG93LlxuICBjb25zdCBlbmRzV2l0aE5ld2xpbmUgPSAvXFxyP1xcbiQvdS50ZXN0KHJlYWRtZSk7XG4gIGNvbnN0IGNvbnRlbnQgPSB3aXRob3V0TWFyay5zbGljZShmcm9udE1hdHRlci5sZW5ndGgpLnJlcGxhY2UoL1xccj9cXG4kL3UsICcnKTtcblxuICBjb25zdCBub2RlcyA9IGZyb21NYXJrZG93bihjb250ZW50KS5jaGlsZHJlbjtcbiAgLy8gQSBsZWFkaW5nIGJhZGdlIGJsb2NrIGlzIHRoZSB1c2VyJ3Mgb3duIGxheW91dDogaXQgc3RheXMgYWJvdmUgdGhlIHRpdGxlLCBhbmQgd2JmeSdzIGJsb2NrIGdvZXMgYmVsb3cuXG4gIGNvbnN0IGtlZXBzTGVhZGluZ0Jsb2NrID0gISFub2Rlc1swXSAmJiBpc0JhZGdlQmxvY2tOb2RlKG5vZGVzWzBdKSAmJiBpc1RpdGxlTm9kZShub2Rlc1sxXSk7XG4gIGNvbnN0IHRpdGxlSW5kZXggPSBrZWVwc0xlYWRpbmdCbG9jayA/IDEgOiBpc1RpdGxlTm9kZShub2Rlc1swXSkgPyAwIDogLTE7XG4gIC8vIFdpdGhvdXQgYSByZWNvZ25pemFibGUgdGl0bGUgdGhlIGJsb2NrIHNpdHMgYXQgdGhlIHZlcnkgdG9wLCBhYm92ZSBldmVyeXRoaW5nLlxuICBjb25zdCBoZWFkU3RhcnROb2RlID0ga2VlcHNMZWFkaW5nQmxvY2sgPyBub2Rlc1swXSEgOiBub2Rlc1t0aXRsZUluZGV4XTtcbiAgY29uc3QgaGVhZCA9XG4gICAgdGl0bGVJbmRleCA9PT0gLTFcbiAgICAgID8gJydcbiAgICAgIDogY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgaGVhZFN0YXJ0Tm9kZSEpLCBub2Rlc1t0aXRsZUluZGV4XSEucG9zaXRpb24hLmVuZC5vZmZzZXQpO1xuXG4gIGNvbnN0IGJsb2NrTm9kZSA9IG5vZGVzW3RpdGxlSW5kZXggKyAxXTtcbiAgY29uc3QgZXhpc3RpbmcgPSBibG9ja05vZGUgJiYgaXNCYWRnZUJsb2NrTm9kZShibG9ja05vZGUpID8gcmVhZEJhZGdlcyhibG9ja05vZGUsIGNvbnRlbnQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBib2R5Tm9kZSA9IGV4aXN0aW5nICYmIGJsb2NrTm9kZSA/IG5vZGVzW25vZGVzLmluZGV4T2YoYmxvY2tOb2RlKSArIDFdIDogYmxvY2tOb2RlO1xuICBjb25zdCBib2R5ID0gYm9keU5vZGUgPyBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50LCBib2R5Tm9kZSkpIDogJyc7XG5cbiAgLy8gU3VwZXJzZWRpbmcgYSBtYW5hZ2VkIGJhZGdlIGlzIGp1c3QgZHJvcHBpbmcgdGhlIG9sZCBvbmU6IGEgdmVyc2lvbiBvciB3b3JrZmxvdyBjaGFuZ2UgbGVhdmVzXG4gIC8vIG5vIHN0YWxlIGNvcHksIHdoaWxlIGFueSBvdGhlciBiYWRnZSBpbiB0aGUgYmxvY2sgKGluY2x1ZGluZyBhIG5vbi1jYW5vbmljYWwgd2JmeSBiYWRnZSwgd2hpY2hcbiAgLy8gaXMgcmVtb3ZlZCBtYW51YWxseSkgaXMga2VwdC5cbiAgY29uc3QgYmFkZ2VzID0gWy4uLm1hbmFnZWRCYWRnZXMsIC4uLihleGlzdGluZyA/PyBbXSkuZmlsdGVyKChiYWRnZSkgPT4gIWlzTWFuYWdlZEJhZGdlKGJhZGdlKSldO1xuICAvLyBDb250ZW50IGlzIHNsaWNlZCBmcm9tIGl0cyBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBzbyB3aGF0ZXZlciBibGFuayBzcGFjZSBmb2xsb3dlZCB0aGUgZnJvbnRcbiAgLy8gbWF0dGVyIGlzIGdvbmU7IGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgaXMgcmVzdG9yZWQgaGVyZS4gQSBjbG9zaW5nIGRlbGltaXRlciB0aGF0IGVuZGVkIGF0IEVPRlxuICAvLyBjYXJyaWVzIG5vIG5ld2xpbmUgb2YgaXRzIG93biBhbmQgbmVlZHMgYm90aCwgb3IgYC0tLWAgd291bGQgZnVzZSB3aXRoIHRoZSBmaXJzdCBiYWRnZSBhbmRcbiAgLy8gZGVzdHJveSB0aGVtIGJvdGguIEEgQk9NIG5lZWRzIG5vIHNlcGFyYXRvcjogaXQgaXMgYSBieXRlIG1hcmtlciwgbm90IGEgbGluZS5cbiAgY29uc3Qgc2VwYXJhdG9yID0gZnJvbnRNYXR0ZXIgPyAoL1xccj9cXG4kL3UudGVzdChmcm9udE1hdHRlcikgPyBsaW5lRW5kaW5nIDogYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCkgOiAnJztcbiAgY29uc3QgcmVzdWx0ID1cbiAgICBwcmVmaXggKyBzZXBhcmF0b3IgKyBbaGVhZCwgYmFkZ2VzLmpvaW4obGluZUVuZGluZyksIGJvZHldLmZpbHRlcihCb29sZWFuKS5qb2luKGAke2xpbmVFbmRpbmd9JHtsaW5lRW5kaW5nfWApO1xuICByZXR1cm4gZW5kc1dpdGhOZXdsaW5lID8gYCR7cmVzdWx0fSR7bGluZUVuZGluZ31gIDogcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgbm9kZSdzIHN0YXJ0IG9mZnNldCwgZXh0ZW5kZWQgYmFjayBvdmVyIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2Ugb24gaXRzIG93biBsaW5lLiBDb21tb25NYXJrXG4gKiBhbGxvd3Mgb25lIHRvIHRocmVlIHNwYWNlcyBvZiBpbmRlbnRhdGlvbiBiZWZvcmUgYSBibG9jaywgYW5kIG1kYXN0IHJlcG9ydHMgdGhlIG9mZnNldCBBRlRFUlxuICogdGhlbSDigJQgc28gc2xpY2luZyBmcm9tIGl0IHNpbGVudGx5IHJlaW5kZW50cyBjb250ZW50IHRoaXMgZ2VuZXJhdG9yIHByb21pc2VzIHRvIGNvcHkgdmVyYmF0aW0uXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50OiBzdHJpbmcsIG5vZGU6IFJvb3RDb250ZW50KTogbnVtYmVyIHtcbiAgY29uc3Qgc3RhcnQgPSBub2RlLnBvc2l0aW9uIS5zdGFydC5vZmZzZXQhO1xuICBjb25zdCBsaW5lU3RhcnQgPSBjb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nLCBzdGFydCAtIDEpICsgMTtcbiAgcmV0dXJuIC9eWyBcXHRdKiQvdS50ZXN0KGNvbnRlbnQuc2xpY2UobGluZVN0YXJ0LCBzdGFydCkpID8gbGluZVN0YXJ0IDogc3RhcnQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgbm9kZSBvcGVucyB0aGUgUkVBRE1FIHdpdGggYSB0aXRsZS4gT25seSB0aGUgRklSU1QgcGllY2Ugb2YgY29udGVudCBjYW4gYmUgb25lOiBhXG4gKiB0aXRsZSBpcyB3aGF0IGEgUkVBRE1FIG9wZW5zIHdpdGgsIGFuZCBhbmNob3JpbmcgdGhlIGJhZGdlcyB0byBhIGhlYWRpbmcgZnVydGhlciBkb3duIHdvdWxkIGJ1cnlcbiAqIHRoZW0gYmVsb3cgY29udGVudCB0aGUgYXV0aG9yIHB1dCBmaXJzdC5cbiAqL1xuZnVuY3Rpb24gaXNUaXRsZU5vZGUobm9kZTogUm9vdENvbnRlbnQgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChub2RlLnR5cGUgPT09ICdoZWFkaW5nJykgcmV0dXJuIHRydWU7XG4gIC8vIE1hbnkgUkVBRE1FcyBjZW50ZXIgdGhlaXIgdGl0bGUgaW4gSFRNTCAoYDxoMT5gLCBvciBhIGA8ZGl2PmAvYDxwPmAgd3JhcHBpbmcgb25lKSwgd2hpY2ggdGhlXG4gIC8vIHBhcnNlciByZXBvcnRzIGFzIG9uZSBvcGFxdWUgSFRNTCBibG9jazsgdGhlIGJhZGdlcyBnbyBhZnRlciB0aGUgd2hvbGUgYmxvY2suXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdodG1sJyAmJiBjb250YWluc1JlbmRlcmVkSDEobm9kZS52YWx1ZSk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgSFRNTCBibG9jayB1bmFtYmlndW91c2x5IFJFTkRFUlMgYW4gYDxoMT5gIOKAlCB0aGUgY2VudGVyZWQtdGl0bGUgbGF5b3V0IG1hbnkgUkVBRE1Fc1xuICogdXNlIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgYSBnZW5lcmFsIEhUTUwgcGFyc2VyLiBEZWNpZGluZyB0aGlzIGV4YWN0bHkgcmVxdWlyZXMgdGhlIHJlYWwgdG9rZW5pemVyJ3NcbiAqIHN0YXRlcyDigJQgcmF3IHRleHQsIFJDREFUQSwgc2NyaXB0IGRhdGEsIGF0dHJpYnV0ZSB2YWx1ZXMsIHRlbXBsYXRlIGNvbnRlbnRzLCBkZWNsYXJhdGlvbnMg4oCUIGFuZFxuICogYXBwcm94aW1hdGluZyB0aGVtIHdpdGggcmVnZXhlcyBpcyB0aGUgc2FtZSBsb3NpbmcgZ2FtZSB0aGUgTWFya2Rvd24gc2Nhbm5pbmcgdGhpcyBtb2R1bGVcbiAqIHJlcGxhY2VkIHdhcyBwbGF5aW5nLiBTbyB0aGUgcnVsZSBpczogdG9rZW5pemUgb25seSB0aGUgc2ltcGxlIGNhc2UsIGFuZCB0cmVhdCBhbnl0aGluZyBjYXJyeWluZ1xuICogYSBjb25zdHJ1Y3Qgd2hvc2UgcGFyc2luZyBkZXBlbmRzIG9uIHRob3NlIHN0YXRlcyBhcyBOT1QgYSB0aXRsZS4gQmVpbmcgd3JvbmcgdGhhdCB3YXkgcHV0cyB0aGVcbiAqIGJhZGdlcyBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLCB3aGljaCBpcyBtZXJlbHkgdW5oZWxwZnVsOyBiZWluZyB3cm9uZyB0aGUgb3RoZXIgd2F5IHJld3JpdGVzIHRoZVxuICogdXNlcidzIFJFQURNRSBhcm91bmQgdGhlIHdyb25nIGFuY2hvci5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNSZW5kZXJlZEgxKGh0bWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBDb21tZW50cyBjYW5ub3QgbmVzdCBhbmQgZW5kIHVuYW1iaWd1b3VzbHksIHNvIHRoZXkgYXJlIHNpbXBseSByZW1vdmVkIHJhdGhlciB0aGFuIGRpc3F1YWxpZnlpbmcuXG4gIGNvbnN0IHdpdGhvdXRDb21tZW50cyA9IGh0bWwucmVwbGFjZUFsbCgvPCEtLVtcXHNcXFNdKj8oPzotLT58JCkvZ3UsICcnKTtcbiAgLy8gQ0RBVEEsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBkZWNsYXJhdGlvbnMsIGVsZW1lbnRzIHdob3NlIGNvbnRlbnQgaXMgcmF3IHRleHQgLyBSQ0RBVEEgL1xuICAvLyBzY3JpcHQgZGF0YSwgYW5kIGA8dGVtcGxhdGU+YCAod2hvc2UgY29udGVudHMgYXJlIGluZXJ0KS4gQSBxdW90ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgYDxgXG4gIC8vIG1ha2VzIGV2ZW4gbG9jYXRpbmcgdGhlc2UgdW5yZWxpYWJsZSwgc28gaXQgZGlzcXVhbGlmaWVzIHRoZSBibG9jayB0b28uXG4gIGNvbnN0IGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4gPVxuICAgIC88IVxcW0NEQVRBXFxbfDxcXD98PCFbYS16QS1aXXw8XFwvPyg/OnNjcmlwdHxzdHlsZXx0ZXh0YXJlYXx0aXRsZXxpZnJhbWV8bm9mcmFtZXN8bm9lbWJlZHx4bXB8dGVtcGxhdGUpXFxifFwiW15cIl0qPFteXCJdKlwifCdbXiddKjxbXiddKicvaXU7XG4gIGlmIChhbWJpZ3VvdXNDb25zdHJ1Y3RQYXR0ZXJuLnRlc3Qod2l0aG91dENvbW1lbnRzKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBRdW90aW5nIGlzIHNpZ25pZmljYW50IG9ubHkgaW5zaWRlIGEgc3RhcnQgdGFnLCBzbyBhbiBhdHRyaWJ1dGUgdmFsdWUgaXMgY29uc3VtZWQgd2l0aCBpdHMgb3duXG4gIC8vIHRhZyB3aGlsZSBxdW90YXRpb24gbWFya3MgaW4gb3JkaW5hcnkgdGV4dCBzdGF5IHRleHQ6IGA8ZGl2IHRpdGxlPVwiJmx0O2gxJmd0O1wiPmAgZG9lcyBub3QgY291bnQsXG4gIC8vIGBcIjxoMT5Qcm9qZWN0PC9oMT5cImAgZG9lcy5cbiAgY29uc3Qgc3RhcnRUYWdQYXR0ZXJuID0gLzwoW2EtekEtWl1bXlxccy8+XSopKD86XCJbXlwiXSpcInwnW14nXSonfFtePlwiJ10pKj4vZ3U7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygd2l0aG91dENvbW1lbnRzLm1hdGNoQWxsKHN0YXJ0VGFnUGF0dGVybikpIHtcbiAgICBpZiAobWF0Y2hbMV0/LnRvTG93ZXJDYXNlKCkgPT09ICdoMScpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIG5vZGUgaXMgYSBwYXJhZ3JhcGggb2YgYmFkZ2VzIGFuZCBub3RoaW5nIGVsc2Ug4oCUIHRoZSBvbmx5IGNvbnRlbnQgd2JmeSBwdXRzIGluIHRoZSBibG9jay4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VCbG9ja05vZGUobm9kZTogUm9vdENvbnRlbnQpOiBub2RlIGlzIFBhcmFncmFwaCB7XG4gIHJldHVybiAoXG4gICAgbm9kZS50eXBlID09PSAncGFyYWdyYXBoJyAmJlxuICAgIG5vZGUuY2hpbGRyZW4uc29tZSgoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSkgJiZcbiAgICBub2RlLmNoaWxkcmVuLmV2ZXJ5KFxuICAgICAgKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkgfHwgY2hpbGQudHlwZSA9PT0gJ2JyZWFrJyB8fCAoY2hpbGQudHlwZSA9PT0gJ3RleHQnICYmICFjaGlsZC52YWx1ZS50cmltKCkpXG4gICAgKVxuICApO1xufVxuXG4vKiogQSBiYWRnZSBpcyBvbmUgYFshW2FsdF0oaW1hZ2UpXShsaW5rKWAsIHRoZSBvbmx5IHNoYXBlIHdiZnkgZXZlciB3cml0ZXMuICovXG5mdW5jdGlvbiBpc0JhZGdlTm9kZShub2RlOiBSb290Q29udGVudCB8IFBocmFzaW5nQ29udGVudCk6IG5vZGUgaXMgTGluayAmIHsgY2hpbGRyZW46IFtJbWFnZV0gfSB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdsaW5rJyAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBub2RlLmNoaWxkcmVuWzBdPy50eXBlID09PSAnaW1hZ2UnO1xufVxuXG4vKipcbiAqIFRoZSBiYWRnZXMgaW4gdGhlIGJsb2NrLCBhcyB0aGUgZXhhY3Qgc291cmNlIHRleHQgdGhhdCBwcm9kdWNlZCB0aGVtOiBhIGJhZGdlIHdiZnkgZG9lcyBub3QgbWFuYWdlXG4gKiBpcyB3cml0dGVuIGJhY2sgYnl0ZSBmb3IgYnl0ZSBpbnN0ZWFkIG9mIGJlaW5nIHJlLXNlcmlhbGl6ZWQgZnJvbSB0aGUgdHJlZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEJhZGdlcyhub2RlOiBQYXJhZ3JhcGgsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIG5vZGUuY2hpbGRyZW5cbiAgICAuZmlsdGVyKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKVxuICAgIC5tYXAoKGNoaWxkKSA9PiBjb250ZW50LnNsaWNlKGNoaWxkLnBvc2l0aW9uIS5zdGFydC5vZmZzZXQsIGNoaWxkLnBvc2l0aW9uIS5lbmQub2Zmc2V0KSk7XG59XG5cbi8qKlxuICogUGVyY2VudC1lbmNvZGVzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgd291bGQgZW5kIGEgTWFya2Rvd24gZGVzdGluYXRpb24gZWFybHkuIEEgd29ya2Zsb3cgZmlsZSBtYXkgYmVcbiAqIG5hbWVkIGFueXRoaW5nIHdpdGggYSBgLnltbGAgZXh0ZW5zaW9uLCBhbmQgb25lIGNvbnRhaW5pbmcgYChgIG9yIGApYCBwcm9kdWNlZCBhIGJhZGdlIHRoYXQgd2JmeSdzXG4gKiBvd24gYmFkZ2UgcGF0dGVybiBjb3VsZCBub3QgcmVhZCBiYWNrIOKAlCBzbyB0aGUgbGluZSBsZWZ0IHRoZSBibG9jayBhbmQgdGhlIGJhZGdlIHdhcyBkdXBsaWNhdGVkLlxuICovXG5mdW5jdGlvbiBlbmNvZGVVcmxQYXRoKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWygpXFxzXS9ndSwgKGNoYXJhY3RlcikgPT4gYCUke2NoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKSEudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9YCk7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBiYWRnZSBpcyBvbmUgd2JmeSB3cml0ZXMgaXRzZWxmLCBhbmQgc28gbWF5IGJlIHJlcGxhY2VkIGJ5IHRoZSBjdXJyZW50IGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNNYW5hZ2VkQmFkZ2UoYmFkZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYmFkZ2UgPT09IHNlbWFudGljUmVsZWFzZUJhZGdlIHx8IG1hbmFnZWRCYWRnZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChiYWRnZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lRW5kaW5nKGNvbnRlbnQ6IHN0cmluZyk6ICdcXG4nIHwgJ1xcclxcbicge1xuICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxyXFxuJykgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luRW50cnkgPSBwbHVnaW5zW2ldO1xuICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpO1xuICAgICAgY29uc3QgcGx1Z2luID0gaXNBcnJheSA/IHBsdWdpbkVudHJ5WzBdIDogcGx1Z2luRW50cnk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoaXNBcnJheSAmJiBwbHVnaW5FbnRyeVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcblxuY29uc3Qgc2hhcmVkUHJlc2V0ID0gJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb25jJztcbmNvbnN0IGdlbmVyYXRlZFNldHRpbmdzID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFtzaGFyZWRQcmVzZXRdLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IFBhcnRpYWw8dHlwZW9mIGdlbmVyYXRlZFNldHRpbmdzPiAmIHtcbiAgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXTtcbn07XG5cbmNvbnN0IG1hbmFnZWRGaWxlTmFtZSA9ICdyZW5vdmF0ZS5qc29uYyc7XG5cbi8vIHdiZnkgc3VwcG9ydHMgb25lIGNhbm9uaWNhbCBSZW5vdmF0ZSBsb2NhdGlvbi4gTm9uLWNhbm9uaWNhbCBjb25maWdzIGFyZSBmaXhlZCBpbiB0aGUgdGFyZ2V0XG4vLyByZXBvc2l0b3J5IGluc3RlYWQgb2YgYmVpbmcgcGFyc2VkLCBtZXJnZWQsIG9yIGRlbGV0ZWQgaGVyZS5cbmNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ1BhdGhzID0gW1xuICAncmVub3ZhdGUuanNvbicsXG4gICdyZW5vdmF0ZS5qc29uNScsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb24nLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uYycsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb241JyxcbiAgJy5yZW5vdmF0ZXJjJyxcbiAgJy5yZW5vdmF0ZXJjLmpzb24nLFxuICAnLnJlbm92YXRlcmMuanNvbjUnLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIG1hbmFnZWRGaWxlTmFtZSk7XG4gICAgY29uc3QgbWFuYWdlZEZpbGVTdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKG1hbmFnZWRGaWxlU3RhdHM/LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ0NhbmRpZGF0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG5vbkNhbm9uaWNhbENvbmZpZ1BhdGhzLm1hcChhc3luYyAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChjYW5kaWRhdGUpLmNhdGNoKCgpID0+IHt9KSkgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA9IG5vbkNhbm9uaWNhbENvbmZpZ0NhbmRpZGF0ZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCk7XG4gICAgaWYgKG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggfHwgY29uZmlnLnBhY2thZ2VKc29uPy5yZW5vdmF0ZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIHJlcG9zaXRvcnkgaGFzIGEgbm9uLWNhbm9uaWNhbCBSZW5vdmF0ZSBjb25maWcke1xuICAgICAgICAgIG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggPyBgIGF0ICR7bm9uQ2Fub25pY2FsQ29uZmlnUGF0aH1gIDogJyBpbiBwYWNrYWdlLmpzb24nXG4gICAgICAgIH0uYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvbGRTZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShvbGRDb250ZW50KSkge1xuICAgICAgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFNldHRpbmdzPihvbGRDb250ZW50KTtcbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2xkU2V0dGluZ3M/LmV4dGVuZHMgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5leHRlbmRzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcImV4dGVuZHNcIiBpcyBub3QgYW4gYXJyYXkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZWRQcmVzZXQgPSBvbGRTZXR0aW5ncz8uZXh0ZW5kcz8uZmluZChcbiAgICAgIChwcmVzZXQpID0+IHByZXNldC5zdGFydHNXaXRoKCdnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczonKSAmJiBwcmVzZXQgIT09IHNoYXJlZFByZXNldFxuICAgICk7XG4gICAgaWYgKHJlbW92ZWRQcmVzZXQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgXCIke3JlbW92ZWRQcmVzZXR9XCIgbm8gbG9uZ2VyIGV4aXN0czsgcmVtb3ZlIGl0IG1hbnVhbGx5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1NldHRpbmdzID0gYnVpbGRTZXR0aW5ncyhjb25maWcsIG9sZFNldHRpbmdzKTtcbiAgICBjb25zdCB7IGNvbnRlbnQsIGtleXNMb3NpbmdDb21tZW50cyB9ID0ganNvbmNVdGlsLnN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgICBvbGRDb250ZW50LFxuICAgICAgbmV3U2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgbm9ybWFsaXplKGNvbnRlbnQpID09PSBub3JtYWxpemUob2xkQ29udGVudCkpIHJldHVybjtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSkpIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNMb3NpbmdDb21tZW50cykge1xuICAgICAgY29uc29sZS53YXJuKGBDb21tZW50cyBpbnNpZGUgXCIke2tleX1cIiB3ZXJlIGRyb3BwZWQgd2hpbGUgcmV3cml0aW5nIGl0IGluICR7ZmlsZVBhdGh9LmApO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQpOiBTZXR0aW5ncyB7XG4gIGNvbnN0IHNldHRpbmdzID0gb2xkU2V0dGluZ3NcbiAgICA/IChtZXJnZS5hbGwoW2dlbmVyYXRlZFNldHRpbmdzLCBvbGRTZXR0aW5ncywgZ2VuZXJhdGVkU2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3MpXG4gICAgOiBzdHJ1Y3R1cmVkQ2xvbmUoZ2VuZXJhdGVkU2V0dGluZ3MpO1xuICBjb25zdCBleGlzdGluZ0V4dGVuZHMgPSBvbGRTZXR0aW5ncz8uZXh0ZW5kcyA/PyBbXTtcbiAgc2V0dGluZ3MuZXh0ZW5kcyA9IGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlnc1xuICAgID8gZXhpc3RpbmdFeHRlbmRzLmZpbHRlcigocHJlc2V0KSA9PiBwcmVzZXQgIT09IHNoYXJlZFByZXNldClcbiAgICA6IGV4aXN0aW5nRXh0ZW5kcy5pbmNsdWRlcyhzaGFyZWRQcmVzZXQpXG4gICAgICA/IGV4aXN0aW5nRXh0ZW5kc1xuICAgICAgOiBbc2hhcmVkUHJlc2V0LCAuLi5leGlzdGluZ0V4dGVuZHNdO1xuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICByZXR1cm4gdHJpbW1lZENvbnRlbnQgPyB0cmltbWVkQ29udGVudCArICdcXG4nIDogJyc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQge1xuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIC8vIHdiZnkgZ2VuZXJhdGVzIHJvb3QtbGV2ZWwgdG9vbCBjb25maWdzIHN1Y2ggYXMgcGxheXdyaWdodC5jb25maWcudHMsIGFuZFxuICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgbmVlZHMgdGhvc2UgZmlsZXMgaW4gdGhlIHByb2plY3QgdG8gc2VlIE5vZGUvQnVuIGdsb2JhbHMuXG4gIC8vIGBhcHAvKipgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgZXZlbiB0aG91Z2ggdGhlIGRvZXNDb250YWluKlNjcmlwdCBzaWduYWxzIHNjYW4gaXQ6IGFwcFxuICAvLyBkaXJlY3RvcmllcyBiZWxvbmcgdG8gZnJhbWV3b3JrIHBhY2thZ2VzIChOZXh0LmpzL0JsaXR6KSwgd2hpY2ggb3duIHRoZWlyIHRzY29uZmlnXG4gIC8vIChnZW5lcmF0ZVRzY29uZmlnIHNraXBzIHRoZW0pLCBhbmQgY2hlY2tpbmcgZnJhbWV3b3JrIHNvdXJjZXMgdW5kZXIgdGhpcyBwcm9qZWN0J3MgY29tcGlsZXJcbiAgLy8gb3B0aW9ucyB3b3VsZCBwcm9kdWNlIGZhbHNlIGVycm9ycy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHZpbmV4dCBpcyB0aGUgb3JnJ3MgTmV4dC5qcy1lcXVpdmFsZW50IGZyYW1ld29yayBhbmQgb3ducyBpdHMgdHNjb25maWcganVzdCBsaWtlIE5leHQvQmxpdHosXG4gICAgLy8gc28gaXQgbXVzdCBza2lwIHRoZSBzdGFuZGFyZCBnZW5lcmF0aW9uIHRoYXQgd291bGQgb3ZlcndyaXRlIHRoZSBmcmFtZXdvcmsncyBvd24gc2V0dGluZ3MuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBhd2FpdCBub3JtYWxpemVGcmFtZXdvcmtUc2NvbmZpZyhjb25maWcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IChjb25maWcuaXNSb290ID8gYnVpbGRSb290SnNvbk9iaihjb25maWcpIDogc3RydWN0dXJlZENsb25lKHN1Ykpzb25PYmopKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgY29uc3QgZ2VuZXJhdGVkVHlwZXMgPSBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2V0Um9vdERpcihjb25maWcpO1xuICAgIGlmIChnZW5lcmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgdHlwZXM6IGdlbmVyYXRlZFR5cGVzIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvcmlnaW5hbFNldHRpbmdzSnNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8vIEEgZmlsZSB3aXRoIG5vIGNvbmZpZ3VyYXRpb24gKGVtcHR5IG9yIGNvbW1lbnQtb25seSkgaXMgdHJlYXRlZCBsaWtlIGEgbWlzc2luZyBvbmUsIGFzIHRzYyBkb2VzLlxuICAgIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VHNDb25maWdKc29uPihleGlzdGluZ0NvbnRlbnQpO1xuICAgICAgLy8gQW4gZXhpc3RpbmcgdHNjb25maWcuanNvbiB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkOiB3cml0aW5nIHRoZVxuICAgICAgLy8gZ2VuZXJhdGVkIHNldHRpbmdzIHdpdGhvdXQgbWVyZ2luZyB3b3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSBwcm9qZWN0J3MgY29uZmlndXJhdGlvbi5cbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG9sZFNldHRpbmdzKSkpO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAgICAgcmVtb3ZlU3RhbGVNYW5hZ2VkV29ya3NwYWNlRW50cmllcyhjb25maWcsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgLy8gd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcuanNvbiBpcyBhIGxpbnQvdHlwZWNoZWNrIHByb2plY3QsIG5vdCB0aGUgZW1pdFxuICAgICAgLy8gY29udHJhY3QuIEl0IG11c3Qga2VlcCByb290RGlyIGJyb2FkIGVub3VnaCBmb3Igcm9vdCBjb25maWcgZmlsZXMsXG4gICAgICAvLyBzY3JpcHRzLCBzcmMsIGFuZCB0ZXN0cy4gYnVpbGQtdHMgb3ducyBlbWl0IGFuZCBjcmVhdGVzIGEgdGVtcG9yYXJ5XG4gICAgICAvLyBzcmMtb25seSB0c2NvbmZpZyB3aXRoIG5vRW1pdD1mYWxzZSwgZW1pdERlY2xhcmF0aW9uT25seT10cnVlLFxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiLCBhbmQgaW5jbHVkZT1bXCJzcmMvKiovKlwiXSwgc28gcHJlc2VydmluZyBub0VtaXQ9ZmFsc2Ugb3JcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiBoZXJlIHdvdWxkIG9ubHkgYnJlYWsgbm9uLXNyYyB0eXBlLWF3YXJlIGxpbnQgY292ZXJhZ2UuXG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgLi4uZXhpc3RpbmdFbWl0TWV0YWRhdGEgfTtcblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzLCBnZW5lcmF0ZWRUeXBlcyksIC4uLmdlbmVyYXRlZFR5cGVzXSldO1xuICAgICAgaWYgKG1lcmdlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzID0gbWVyZ2VkVHlwZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZERlbGV0ZVR5cGVSb290cyhnZW5lcmF0ZWRUeXBlcykpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlUm9vdHM7XG4gICAgICB9XG4gICAgfVxuICAgIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcobmV3U2V0dGluZ3MsIGNvbmZpZyk7XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgLy8gUGFja2FnZSBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHRocm91Z2ggcGFja2FnZSBleHBvcnRzIGluc3RlYWQgb2YgYmFzZVVybC5cbiAgICAvLyBwYXRocyBpcyBpbnRlbnRpb25hbGx5IHByZXNlcnZlZCBzbyByZXBvLWxvY2FsIHRvb2xpbmcgY2FuIGtlZXAgZXhwbGljaXRcbiAgICAvLyBhbGlhc2VzIHdpdGhvdXQgcmVseWluZyBvbiBiYXNlVXJsJ3MgYnJvYWQgZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy52ZXJiYXRpbU1vZHVsZVN5bnRheDtcbiAgICB9XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktdXAtdG8tZGF0ZSB0c2NvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChvcmlnaW5hbFNldHRpbmdzSnNvbiA9PT0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBtb25vcmVwby1yb290IHRzY29uZmlnLCB3aG9zZSBpbmNsdWRlL2V4Y2x1ZGUgY292ZXIgZXZlcnkgREVDTEFSRUQgd29ya3NwYWNlIGxheW91dCAoZS5nLlxuICogYGFwcHMvKmAgYWxvbmdzaWRlIGBwYWNrYWdlcy8qYCkgc28gdHlwZS1hd2FyZSBsaW50aW5nIHJ1biBmcm9tIHRoZSByb290IHNlZXMgYWxsIHdvcmtzcGFjZVxuICogc291cmNlcywgbm90IGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRSb290SnNvbk9iaihjb25maWc6IFBhY2thZ2VDb25maWcpOiBUc0NvbmZpZ0pzb24ge1xuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9IGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29uc1xuICAgID8gZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMoY29uZmlnKVxuICAgIDogeyBleGNsdWRlczogW10sIGluY2x1ZGVzOiBbXSB9O1xuICBjb25zdCBzZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gIHNldHRpbmdzLmV4Y2x1ZGUgPSBbXG4gICAgLi4ubmV3IFNldChbXG4gICAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5pbmNsdWRlcy5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IGAke3dvcmtzcGFjZVBhdHRlcm59L3Rlc3QvZml4dHVyZXNgKSxcbiAgICAgIC8vIE5lZ2F0aXZlIHdvcmtzcGFjZSBwYXR0ZXJucyAoZS5nLiBgIXBhY2thZ2VzL2V4Y2x1ZGVkYCkgb3B0IHdvcmtzcGFjZSBzdWJ0cmVlcyBvdXQgb2YgdGhlXG4gICAgICAvLyBtb25vcmVwbywgc28gdGhlaXIgc291cmNlcyBtdXN0IG5vdCBlbnRlciB0aGUgcm9vdCB0eXBlLWNoZWNrIHByb2plY3QgZWl0aGVyLiBBIG5lZ2F0aW9uXG4gICAgICAvLyB3aG9zZSBkaXJlY3RvcnkgaXMgYW4gYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgeWllbGRzIHBhY2thZ2Utb3duZWQgc3VicGF0aCBlbnRyaWVzXG4gICAgICAvLyBpbnN0ZWFkIG9mIHRoZSB3aG9sZSBzdWJ0cmVlIChzZWUgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMpLlxuICAgICAgLi4ud29ya3NwYWNlUGF0dGVybnMuZXhjbHVkZXMsXG4gICAgICAvLyBUaGUgbWFuYWdlZCBpbmNsdWRlcyBhYm92ZSBkZWxpYmVyYXRlbHkgb21pdCBmcmFtZXdvcmsgYGFwcC8qKmAgZGlyZWN0b3JpZXMgKHNlZVxuICAgICAgLy8gc3ViSnNvbk9iai5pbmNsdWRlJ3MgY29tbWVudCksIGJ1dCBhIHJlcG8tYXV0aG9yZWQgYnJvYWQgaW5jbHVkZSBzdWNoIGFzIGBlMmUvKipcXC8qYFxuICAgICAgLy8gY2FuIHN0aWxsIGRyYWcgYSBmcmFtZXdvcmsgd29ya3NwYWNlJ3MgYXBwIHNvdXJjZXMgaW50byB0aGUgcm9vdCBwcm9qZWN0LCB3aGVyZSB0aGV5XG4gICAgICAvLyBmYWlsIHVuZGVyIHRoZSByb290IGNvbXBpbGVyIG9wdGlvbnMg4oCUIHRoZWlyIGJhcmUgYG5leHQvKmAgaW1wb3J0cyByZXNvbHZlIG9ubHkgdGhyb3VnaFxuICAgICAgLy8gdGhlIGZyYW1ld29yayB3b3Jrc3BhY2UncyBvd24gdHNjb25maWcgYHBhdGhzYC4gRXhjbHVkZSB0aG9zZSBhcHAgZGlyZWN0b3JpZXMgc28gdGhlXG4gICAgICAvLyByb290IHByb2plY3QgbmV2ZXIgdHlwZS1jaGVja3MgdGhlbSwgbm8gbWF0dGVyIGhvdyBicm9hZCB0aGUgcmVwbydzIGluY2x1ZGUgZ2xvYnMgYXJlLlxuICAgICAgLi4uZ2V0RnJhbWV3b3JrV29ya3NwYWNlQXBwRXhjbHVkZXMoY29uZmlnKSxcbiAgICAgIC4uLihzZXR0aW5ncy5leGNsdWRlID8/IFtdKSxcbiAgICBdKSxcbiAgXS50b1NvcnRlZCgpO1xuICBzZXR0aW5ncy5pbmNsdWRlID0gW1xuICAgIC4uLihzZXR0aW5ncy5pbmNsdWRlID8/IFtdKSxcbiAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5pbmNsdWRlcy5mbGF0TWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBbXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS8qLmNvbmZpZy50c2AsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS9zY3JpcHRzLyoqLypgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vc3JjLyoqLypgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vdGVzdC8qKi8qYCxcbiAgICBdKSxcbiAgXTtcbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG4vLyBGcmFtZXdvcmsgcGFja2FnZXMgb3duIHRoZWlyIHRzY29uZmlnIChnZW5lcmF0ZVRzY29uZmlnIHNraXBzIHRoZW0pIGFuZCBzaGltIGJhcmUgaW1wb3J0cyBzdWNoIGFzXG4vLyBgbmV4dC9uYXZpZ2F0aW9uYCB0aHJvdWdoIHBhY2thZ2UtbG9jYWwgYHBhdGhzYDsgdmluZXh0IGlzIHRoZSBvcmcncyBOZXh0LmpzLWVxdWl2YWxlbnQgZnJhbWV3b3JrXG4vLyBhbmQgYmVoYXZlcyB0aGUgc2FtZS4gVGhlaXIgYXBwIHNvdXJjZXMgdGhlcmVmb3JlIG9ubHkgdHlwZS1jaGVjayB1bmRlciB0aGVpciBvd24gY29uZmlnLlxuY29uc3QgZnJhbWV3b3JrRGVwZW5kZW5jeU5hbWVzID0gWydibGl0eicsICduZXh0JywgJ3ZpbmV4dCddO1xuXG4vLyBBIGZyYW1ld29yayBhcHAgbGl2ZXMgaW4gYGFwcC9gIG9yLCB1bmRlciB0aGUgc3JjLWRpcmVjdG9yeSBsYXlvdXQsIGBzcmMvYXBwL2AuIFRoZSByb290IHByb2plY3Rcbi8vIGluY2x1ZGVzIGA8d29ya3NwYWNlPi9zcmMvKiovKmAsIHNvIGBzcmMvYXBwYCBsZWFrcyBpbiBqdXN0IGFzIGEgcmVwby13aWRlIGdsb2IgY2FuIHB1bGwgaW4gYGFwcGAuXG5jb25zdCBmcmFtZXdvcmtBcHBEaXJOYW1lcyA9IFsnYXBwJywgJ3NyYy9hcHAnXTtcblxuLyoqIFJvb3QgYGV4Y2x1ZGVgIGVudHJpZXMgKHBvc2l4LCByZWxhdGl2ZSB0byB0aGUgcm9vdCkgZm9yIGV2ZXJ5IGZyYW1ld29yayB3b3Jrc3BhY2UncyBhcHAgZGlyZWN0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0RnJhbWV3b3JrV29ya3NwYWNlQXBwRXhjbHVkZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykgcmV0dXJuIFtdO1xuICBjb25zdCBleGNsdWRlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VEaXJQYXRoIG9mIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKGNvbmZpZykpIHtcbiAgICBpZiAoIWRlcGVuZHNPbkZyYW1ld29yayhwYXRoLnJlc29sdmUod29ya3NwYWNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBhcHBEaXJOYW1lIG9mIGZyYW1ld29ya0FwcERpck5hbWVzKSB7XG4gICAgICBjb25zdCBhcHBEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtzcGFjZURpclBhdGgsIGFwcERpck5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYXBwRGlyUGF0aCkpIGV4Y2x1ZGVzLnB1c2gocGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgYXBwRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXhjbHVkZXM7XG59XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbkZyYW1ld29yayhtYW5pZmVzdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgbWFuaWZlc3Q6IFBhY2thZ2VKc29uIHwgbnVsbDtcbiAgdHJ5IHtcbiAgICBtYW5pZmVzdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24gfCBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQSBtYW5pZmVzdCB0aGF0IHBhcnNlcyB0byBhIG5vbi1vYmplY3QgKGUuZy4gYSBmaWxlIGxpdGVyYWxseSBjb250YWluaW5nIGBudWxsYCkgZGVjbGFyZXMgbm9cbiAgLy8gZGVwZW5kZW5jaWVzOyBndWFyZCB0aGUgcHJvcGVydHkgYWNjZXNzLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgdGhyb3cgb3V0c2lkZSB0aGUgdHJ5IGFib3ZlLlxuICBpZiAoIW1hbmlmZXN0IHx8IHR5cGVvZiBtYW5pZmVzdCAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0geyAuLi5tYW5pZmVzdC5kZXBlbmRlbmNpZXMsIC4uLm1hbmlmZXN0LmRldkRlcGVuZGVuY2llcyB9O1xuICByZXR1cm4gZnJhbWV3b3JrRGVwZW5kZW5jeU5hbWVzLnNvbWUoKGRlcGVuZGVuY3lOYW1lKSA9PiBkZXBlbmRlbmNpZXNbZGVwZW5kZW5jeU5hbWVdKTtcbn1cblxuY29uc3QgbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcyA9IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddO1xuXG4vKipcbiAqIFJvb3QgaW5jbHVkZS9leGNsdWRlIGVudHJpZXMgd2JmeSBnZW5lcmF0ZWQgZm9yIGFuIGVhcmxpZXIgd29ya3NwYWNlIGxheW91dCAoZS5nLiBgcGFja2FnZXMvKmBcbiAqIGdsb2JzIGluIGEgcmVwbyB0aGF0IG5vdyBkZWNsYXJlcyBvbmx5IGBhcHBzLypgKSBtdXN0IG5vdCBzdXJ2aXZlIHRoZSBtZXJnZSB3aXRoIHRoZSBleGlzdGluZ1xuICogdHNjb25maWcsIG9yIHRoZSBvYnNvbGV0ZSBkaXJlY3RvcmllcyB3b3VsZCBrZWVwIGVudGVyaW5nIHJvb3QgdHlwZSBjaGVja2luZyBmb3JldmVyLiBBIHByZWZpeFxuICogY291bnRzIGFzIHdiZnktbWFuYWdlZCBvbmx5IHdoZW4gdGhlIENPTVBMRVRFIGdlbmVyYXRlZCBpbmNsdWRlIHNldCBmb3IgaXQgaXMgcHJlc2VudCBhbmQgbm9cbiAqIGxvbmdlciBnZW5lcmF0ZWQg4oCUIGEgdXNlci1hdXRob3JlZCBlbnRyeSBzdWNoIGFzIGEgbG9uZSBgdG9vbHMvKlxcL3NyYy8qKlxcLypgIG5ldmVyIHF1YWxpZmllcy5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU3RhbGVNYW5hZ2VkV29ya3NwYWNlRW50cmllcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBvbGRTZXR0aW5nczogVHNDb25maWdKc29uLFxuICBuZXdTZXR0aW5nczogVHNDb25maWdKc29uXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhbGVQcmVmaXhlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBpZiAoQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5pbmNsdWRlKSkge1xuICAgIGNvbnN0IG9sZEluY2x1ZGUgPSBvbGRTZXR0aW5ncy5pbmNsdWRlLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBzdHJpbmcgPT4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyk7XG4gICAgY29uc3QgZ2VuZXJhdGVkSW5jbHVkZSA9IG5ldyBTZXQobmV3U2V0dGluZ3MuaW5jbHVkZSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBvbGRJbmNsdWRlKSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5KTtcbiAgICAgIGlmICh3b3Jrc3BhY2VQcmVmaXggPT09IHVuZGVmaW5lZCB8fCBzdGFsZVByZWZpeGVzLmhhcyh3b3Jrc3BhY2VQcmVmaXgpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGlzQ29tcGxldGUgPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLmV2ZXJ5KChzdWZmaXgpID0+XG4gICAgICAgIG9sZEluY2x1ZGUuaW5jbHVkZXMoYCR7d29ya3NwYWNlUHJlZml4fS8ke3N1ZmZpeH1gKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzU3RpbGxHZW5lcmF0ZWQgPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLnNvbWUoKHN1ZmZpeCkgPT5cbiAgICAgICAgZ2VuZXJhdGVkSW5jbHVkZS5oYXMoYCR7d29ya3NwYWNlUHJlZml4fS8ke3N1ZmZpeH1gKVxuICAgICAgKTtcbiAgICAgIGlmIChpc0NvbXBsZXRlICYmICFpc1N0aWxsR2VuZXJhdGVkKSBzdGFsZVByZWZpeGVzLmFkZCh3b3Jrc3BhY2VQcmVmaXgpO1xuICAgIH1cbiAgICBpZiAoc3RhbGVQcmVmaXhlcy5zaXplID4gMCkge1xuICAgICAgb2xkU2V0dGluZ3MuaW5jbHVkZSA9IG9sZFNldHRpbmdzLmluY2x1ZGUuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgICAgICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnID8gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB3b3Jrc3BhY2VQcmVmaXggPT09IHVuZGVmaW5lZCB8fCAhc3RhbGVQcmVmaXhlcy5oYXMod29ya3NwYWNlUHJlZml4KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoIUFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuZXhjbHVkZSkpIHJldHVybjtcbiAgY29uc3QgZ2VuZXJhdGVkRXhjbHVkZSA9IG5ldyBTZXQobmV3U2V0dGluZ3MuZXhjbHVkZSk7XG4gIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zXG4gICAgPyBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhjb25maWcpLm1hcCgod29ya3NwYWNlRGlyUGF0aCkgPT5cbiAgICAgICAgcGF0aC5yZWxhdGl2ZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpLCB3b3Jrc3BhY2VEaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKVxuICAgICAgKVxuICAgIDogW107XG4gIG9sZFNldHRpbmdzLmV4Y2x1ZGUgPSBvbGRTZXR0aW5ncy5leGNsdWRlLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSAnc3RyaW5nJyB8fCBnZW5lcmF0ZWRFeGNsdWRlLmhhcyhlbnRyeSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChlbnRyeS5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSkge1xuICAgICAgcmV0dXJuICFzdGFsZVByZWZpeGVzLmhhcyhlbnRyeS5zbGljZSgwLCAtJy90ZXN0L2ZpeHR1cmVzJy5sZW5ndGgpKTtcbiAgICB9XG4gICAgLy8gQSBmcmFtZXdvcmsgYXBwIGV4Y2x1ZGUgKGA8d29ya3NwYWNlPi9hcHBgLCBgPHdvcmtzcGFjZT4vc3JjL2FwcGApIGZvciBhIHN0aWxsLWRlY2xhcmVkXG4gICAgLy8gd29ya3NwYWNlIGlzIHBydW5lZCBieSBjb3ZlcnNXb3Jrc3BhY2VEaXIgYmVsb3cgd2hlbiBubyBsb25nZXIgZ2VuZXJhdGVkOyB0aGlzIGNhdGNoZXMgdGhlXG4gICAgLy8gcmVtYWluaW5nIGNhc2UsIHdoZXJlIHRoZSB3b3Jrc3BhY2UgaXRzZWxmIHdhcyByZW1vdmVkIGFuZCBpdHMgcHJlZml4IGlzIHRoZXJlZm9yZSBzdGFsZS5cbiAgICAvLyAoQSB3cm9uZyBzdWZmaXggc3RyaXAgeWllbGRzIGEgcHJlZml4IGFic2VudCBmcm9tIHN0YWxlUHJlZml4ZXMsIHNvIHRlc3RpbmcgZXZlcnkgbmFtZSBpcyBzYWZlLilcbiAgICBpZiAoXG4gICAgICBmcmFtZXdvcmtBcHBEaXJOYW1lcy5zb21lKFxuICAgICAgICAoYXBwRGlyTmFtZSkgPT4gZW50cnkuZW5kc1dpdGgoYC8ke2FwcERpck5hbWV9YCkgJiYgc3RhbGVQcmVmaXhlcy5oYXMoZW50cnkuc2xpY2UoMCwgLShhcHBEaXJOYW1lLmxlbmd0aCArIDEpKSlcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFjb3ZlcnNXb3Jrc3BhY2VEaXIoZW50cnksIHdvcmtzcGFjZURpclBhdGhzKTtcbiAgfSk7XG59XG5cbi8vIFdoZXRoZXIgYW4gZXhjbHVkZSBlbnRyeSBpcyBhIHdvcmtzcGFjZSBuZWdhdGlvbiAoYCFhcHBzL2V4Y2x1ZGVkYCkgd2hvc2UgbmVnYXRpb24gaXMgZ29uZTogdGhlXG4vLyBkaXJlY3RvcnkgaXMgYSB3b3Jrc3BhY2UgYWdhaW4gYW5kIG11c3QgcmUtZW50ZXIgdGhlIHJvb3QgcHJvamVjdC4gd2JmeSB3cml0ZXMgc3VjaCBhIG5lZ2F0aW9uIGFzXG4vLyBhIGRpcmVjdG9yeSBwYXRoLCBhcyBhIGRpcmVjdG9yeSBQQVRURVJOIHdoZW4gaXQgZXhjbHVkZXMgZXhhY3RseSB3aGF0IGl0IG1hdGNoZXMgKGBhcHBzLypiYCksIG9yXG4vLyBhcyBhbiBhbmNlc3RvcidzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgKGBhcHBzL3gvc3JjYCkg4oCUIHNvIHRoZSBlbnRyeSBtYXkgY292ZXIgYSBkaXNjb3ZlcmVkXG4vLyB3b3Jrc3BhY2UgZGlyZWN0b3J5IG9yIHNpdCB1bmRlciBvbmUuIEEgZ2xvYnN0YXIgc2VnbWVudCBtYXJrcyBhIGh5Z2llbmUgZ2xvYiAobm9kZV9tb2R1bGVzLCBlMmVcbi8vIGFuZCBmcmllbmRzKSwgd2hpY2ggaXMgbmV2ZXIgbmVnYXRpb24tZGVyaXZlZCBhbmQgbXVzdCBzdXJ2aXZlLlxuZnVuY3Rpb24gY292ZXJzV29ya3NwYWNlRGlyKGVudHJ5OiBzdHJpbmcsIHdvcmtzcGFjZURpclBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBpZiAoZW50cnkuc3BsaXQoJy8nKS5pbmNsdWRlcygnKionKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWdleFNvdXJjZSA9IGVudHJ5XG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PlxuICAgICAgc2VnbWVudFxuICAgICAgICAucmVwbGFjZUFsbCgvWy4rXiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJyonLCAnW14vXSonKVxuICAgICAgICAucmVwbGFjZUFsbCgnPycsICdbXi9dJylcbiAgICApXG4gICAgLmpvaW4oJy8nKTtcbiAgY29uc3QgZW50cnlQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7cmVnZXhTb3VyY2V9KD86Ly4qKT8kYCwgJ3UnKTtcbiAgcmV0dXJuIHdvcmtzcGFjZURpclBhdGhzLnNvbWUoXG4gICAgKHdvcmtzcGFjZURpclBhdGgpID0+IGVudHJ5UGF0dGVybi50ZXN0KHdvcmtzcGFjZURpclBhdGgpIHx8IGVudHJ5LnN0YXJ0c1dpdGgoYCR7d29ya3NwYWNlRGlyUGF0aH0vYClcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2hlZFN1ZmZpeCA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuZmluZCgoc3VmZml4KSA9PiBlbnRyeS5lbmRzV2l0aChgLyR7c3VmZml4fWApKTtcbiAgaWYgKCFtYXRjaGVkU3VmZml4KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSBlbnRyeS5zbGljZSgwLCAtKG1hdGNoZWRTdWZmaXgubGVuZ3RoICsgMSkpO1xuICByZXR1cm4gd29ya3NwYWNlUHJlZml4ID09PSAnJyA/IHVuZGVmaW5lZCA6IHdvcmtzcGFjZVByZWZpeDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplRnJhbWV3b3JrVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIE5leHQvQmxpdHogb3duIHRoZWlyIHRzY29uZmlnIHNoYXBlLCBidXQgVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhY2NlcHRzXG4gIC8vIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZ3MgdGhhdCBvbGRlciBwcm9qZWN0cyBjb21tb25seSBpbmhlcml0ZWQuXG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IHVuZGVmaW5lZCB8fCBqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHJldHVybjtcbiAgY29uc3Qgc2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFRzQ29uZmlnSnNvbj4oZXhpc3RpbmdDb250ZW50KTtcbiAgaWYgKCFzZXR0aW5ncykge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBjbGVhbmluZyB1cCAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzKTtcbiAgbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzKTtcbiAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhzZXR0aW5ncywgY29uZmlnKTtcbiAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAvLyBhbHJlYWR5LWNsZWFuIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gIGlmIChKU09OLnN0cmluZ2lmeShzZXR0aW5ncykgPT09IG9yaWdpbmFsU2V0dGluZ3NKc29uKSByZXR1cm47XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSkpO1xufVxuXG4vKipcbiAqIGJ1bi10eXBlcyByZWZlcmVuY2VzIHVuZGljaS10eXBlcyB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KSwgc29cbiAqIEJ1bidzIGlzb2xhdGVkIGxpbmtlciAoZXNwZWNpYWxseSB3aXRoIHRoZSBnbG9iYWwgc3RvcmUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSkgY2Fubm90IHJlc29sdmVcbiAqIGl0IGZyb20gYnVuLXR5cGVzJyBsb2NhdGlvbiwgd2hpY2ggc2lsZW50bHkgZGVncmFkZXMgZ2xvYmFsIGZldGNoIHR5cGVzIHN1Y2ggYXMgUmVzcG9uc2UuIE1hcCBpdFxuICogdG8gdGhlIGNvcHkgdGhhdCBidW5maWcudG9tbCdzIHB1YmxpY0hvaXN0UGF0dGVybiBwbGFjZXMgaW4gdGhlIHJvb3Qgbm9kZV9tb2R1bGVzLlxuICovXG5mdW5jdGlvbiBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICAvLyBNYXAgdW5kaWNpLXR5cGVzIG9ubHkgd2hlbiBidW4tdHlwZXMgYWN0dWFsbHkgbG9hZHM6IGFuIGV4cGxpY2l0IGB0eXBlc2AgbGlzdCBsb2FkcyBpdCBpZmYgaXRcbiAgLy8gY29udGFpbnMgXCJidW5cIiAoZXZlbiBvbiBSZWFjdCBOYXRpdmUsIHdob3NlIHByb2plY3RzIG1heSBvcHQgaW4gYnkgaGFuZCk7IHdpdGggYHR5cGVzYFxuICAvLyBvbWl0dGVkLCBUeXBlU2NyaXB0J3MgYXV0b21hdGljIEB0eXBlcyBpbmNsdXNpb24gbG9hZHMgaXQgYmVjYXVzZSB3YmZ5IGluc3RhbGxzIEB0eXBlcy9idW5cbiAgLy8gZm9yIGV2ZXJ5IFR5cGVTY3JpcHQgcHJvamVjdCBleGNlcHQgUmVhY3QgTmF0aXZlLCB3aGljaCB1c2VzIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUgaW5zdGVhZC5cbiAgY29uc3QgdHlwZXMgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzO1xuICBpZiAodHlwZXMgPyAhdHlwZXMuaW5jbHVkZXMoJ2J1bicpIDogY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkgcmV0dXJuO1xuICBjb25zdCBjb3JyZWN0TWFwcGluZyA9IGAke2dldFJvb3REaXIoY29uZmlnKX0vbm9kZV9tb2R1bGVzL3VuZGljaS10eXBlcy9pbmRleC5kLnRzYDtcbiAgY29uc3QgZXhpc3RpbmdNYXBwaW5nID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5wYXRocz8uWyd1bmRpY2ktdHlwZXMnXTtcbiAgaWYgKGV4aXN0aW5nTWFwcGluZykge1xuICAgIC8vIFJld3JpdGUgdGhlIGdlbmVyYXRlZCBtYXBwaW5nIHdoZW4gYSB3b3Jrc3BhY2UgbW92ZXMgdG8gYSBkaWZmZXJlbnQgcm9vdCBkZXB0aC4gQW55IG90aGVyXG4gICAgLy8gdmFsdWUgaXMgYSBkZWxpYmVyYXRlIHJlcG8tbG9jYWwgbWFwcGluZyAoZS5nLiBwYXRjaGVkIHR5cGVzKSBhbmQgbXVzdCBiZSBrZXB0LlxuICAgIGlmIChcbiAgICAgIGV4aXN0aW5nTWFwcGluZy5sZW5ndGggPT09IDEgJiZcbiAgICAgIHR5cGVvZiBleGlzdGluZ01hcHBpbmdbMF0gPT09ICdzdHJpbmcnICYmXG4gICAgICAvKD86XnxcXC8pbm9kZV9tb2R1bGVzXFwvdW5kaWNpLXR5cGVzXFwvaW5kZXhcXC5kXFwudHMkL3UudGVzdChleGlzdGluZ01hcHBpbmdbMF0pXG4gICAgKSB7XG4gICAgICBzZXR0aW5ncy5jb21waWxlck9wdGlvbnMhLnBhdGhzIVsndW5kaWNpLXR5cGVzJ10gPSBbY29ycmVjdE1hcHBpbmddO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBzZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICBzZXR0aW5ncy5jb21waWxlck9wdGlvbnMucGF0aHMgPSB7XG4gICAgLi4uc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnBhdGhzLFxuICAgICd1bmRpY2ktdHlwZXMnOiBbY29ycmVjdE1hcHBpbmddLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbik6IHZvaWQge1xuICAvLyBPbWl0dGluZyBpbmNsdWRlIGxldHMgZnJhbWV3b3JrIHRzY29uZmlncyBrZWVwIFR5cGVTY3JpcHQncyBkZWZhdWx0XG4gIC8vIFwiYWxsIFRTL1RTWCBmaWxlc1wiIGJlaGF2aW9yLCB3aGljaCBhbHJlYWR5IGNvdmVycyBzY3JpcHRzLlxuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUpIHJldHVybjtcbiAgaWYgKHNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoJ3NjcmlwdHMvKiovKicpKSByZXR1cm47XG5cbiAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKCdzY3JpcHRzLyoqLyonKTtcbiAgc2V0dGluZ3MuaW5jbHVkZS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgY29uc3QgY29tcGlsZXJPcHRpb25zID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zO1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBjb25zdCBtb2R1bGVSZXNvbHV0aW9uID0gbG93ZXJDYXNlU2V0dGluZyhjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbik7XG4gIGlmIChtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHwgbW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUxMCcgfHwgbW9kdWxlUmVzb2x1dGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNldHRpbmdzLmV4dGVuZHMpIHtcbiAgICAgIC8vIEFuIGV4dGVuZGVkIGNvbmZpZyBtYXkgYWxyZWFkeSBzdXBwbHkgYSB2YWxpZCBtb2R1bGUvcmVzb2x2ZXIgcGFpciwgc28gb25seVxuICAgICAgLy8gcmVtb3ZlIHRoZSByZW1vdmVkLWluLVRTNiBub2RlMTAgc3BlbGxpbmdzIGluc3RlYWQgb2YgZm9yY2luZyBidW5kbGVyIG9uIGl0LlxuICAgICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZXh0LmpzIHdyaXRlcyBcIm5vZGVcIiBkdXJpbmcgYnVpbGQgd2hlbiB0aGlzIG9wdGlvbiBpcyBtaXNzaW5nLCBidXRcbiAgICAgIC8vIHRzZ29saW50IHRyZWF0cyB0aGF0IHNwZWxsaW5nIGFzIHRoZSByZW1vdmVkIG5vZGUxMCByZXNvbHZlci5cbiAgICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gJ2J1bmRsZXInO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcblxuICAvLyB0c2dvbGludCBmb2xsb3dzIFR5cGVTY3JpcHQgNiB2YWxpZGF0aW9uLCB3aGVyZSBiYXNlVXJsIGlzIHJlbW92ZWQgYW5kXG4gIC8vIHBhdGggdGFyZ2V0cyBtdXN0IGJlIGV4cGxpY2l0bHkgcmVsYXRpdmUuIE5leHQuanMgc3RpbGwgYWNjZXB0cyB0aGUgYWxpYXNcbiAgLy8gc2hhcGUgYWZ0ZXIgZWFjaCB0YXJnZXQgaXMgd3JpdHRlbiB3aXRoIGEgbGVhZGluZyAuLy5cbiAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5iYXNlVXJsO1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucy5wYXRocykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhjb21waWxlck9wdGlvbnMucGF0aHMpKSB7XG4gICAgY29tcGlsZXJPcHRpb25zLnBhdGhzW2FsaWFzXSA9IG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHRhcmdldHMubWFwKCh0YXJnZXQpID0+IHtcbiAgICBpZiAodGFyZ2V0LnN0YXJ0c1dpdGgoJy4vJykgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoJy4uLycpIHx8IHBhdGguaXNBYnNvbHV0ZSh0YXJnZXQpKSByZXR1cm4gdGFyZ2V0O1xuICAgIHJldHVybiBgLi8ke3RhcmdldH1gO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzUm9vdCkgcmV0dXJuICcuJztcbiAgLy8gVGhlIHVuZGljaS10eXBlcyBwYXRoIG1hcHBpbmcgbXVzdCByZWFjaCB0aGUgbW9ub3JlcG8gcm9vdCdzIG5vZGVfbW9kdWxlcyAoYnVuZmlnLnRvbWwnc1xuICAvLyBwdWJsaWNIb2lzdFBhdHRlcm4gaG9pc3RzIHRoZSBwYWNrYWdlIHRoZXJlKSwgYW5kIHdvcmtzcGFjZSBwYXR0ZXJucyBtYXkgYmUgYXJiaXRyYXJpbHkgZGVlcFxuICAvLyAoZS5nLiBgZXhhbXBsZXMvKipgKSwgc28gYSBmaXhlZCB0d28tbGV2ZWwgcHJvYmUgaXMgbm90IGVub3VnaC4gUHJlZmVyIHRoZSBuZWFyZXN0IGFuY2VzdG9yXG4gIC8vIG1hbmlmZXN0IHRoYXQgZGVjbGFyZXMgd29ya3NwYWNlcyAodGhlIG1vbm9yZXBvIHJvb3QpOyBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBuZWFyZXN0XG4gIC8vIGFuY2VzdG9yIG1hbmlmZXN0LiBTdG9wIGF0IHRoZSBmaXJzdCBnaXQgcmVwb3NpdG9yeSBib3VuZGFyeSBzbyBhbiB1bnJlbGF0ZWQgZW5jbG9zaW5nXG4gIC8vIHJlcG9zaXRvcnkncyBtYW5pZmVzdCBjYW4gbmV2ZXIgYmUgY2hvc2VuLlxuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKTtcbiAgbGV0IHJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGFuY2VzdG9yRGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTsgOyBhbmNlc3RvckRpclBhdGggPSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JEaXJQYXRoKSkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGgucmVzb2x2ZShhbmNlc3RvckRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgICByb290RGlyUGF0aCA/Pz0gYW5jZXN0b3JEaXJQYXRoO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgICAvLyBCdW4gbm8tb3AgcGF0dGVybnMgKGUuZy4gYHdvcmtzcGFjZXM6IFtcIlwiXWApIGRvIG5vdCBtYWtlIGEgbWFuaWZlc3QgYSB3b3Jrc3BhY2Ugcm9vdC5cbiAgICAgICAgaWYgKGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKG1hbmlmZXN0LndvcmtzcGFjZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByb290RGlyUGF0aCA9IGFuY2VzdG9yRGlyUGF0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEFuIHVucGFyc2FibGUgbWFuaWZlc3Qgc3RpbGwgbWFya3MgYSBwcm9qZWN0IGRpcmVjdG9yeTsga2VlcCBjbGltYmluZyBmb3IgYSB3b3Jrc3BhY2Ugcm9vdC5cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXNSZXBvQm91bmRhcnkgPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShhbmNlc3RvckRpclBhdGgsICcuZ2l0JykpO1xuICAgIGNvbnN0IGlzRmlsZXN5c3RlbVJvb3QgPSBhbmNlc3RvckRpclBhdGggPT09IHBhdGguZGlybmFtZShhbmNlc3RvckRpclBhdGgpO1xuICAgIGlmIChpc1JlcG9Cb3VuZGFyeSB8fCBpc0ZpbGVzeXN0ZW1Sb290KSBicmVhaztcbiAgfVxuICBpZiAoIXJvb3REaXJQYXRoKSByZXR1cm4gJy4nO1xuICByZXR1cm4gcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCByb290RGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJykgfHwgJy4nO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBhZGRJbmNsdWRlUGF0aChzZXR0aW5nczogVHNDb25maWdKc29uLCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0dGluZ3MuaW5jbHVkZSA/Pz0gW107XG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcyhkaXJQYXRoKSkge1xuICAgIHNldHRpbmdzLmluY2x1ZGUucHVzaChkaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVR5cGVSb290cyh0eXBlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgZ2VuZXJhdGVkIHBhY2thZ2Utb3duZWQgdGVzdCB0eXBlcyBzaG91bGQgdHJpZ2dlciB0aGlzLiBVc2VyLWRlZmluZWQgc2xhc2gtYmFzZWRcbiAgLy8gZW50cmllcyBtYXkgaW50ZW50aW9uYWxseSByZWx5IG9uIGN1c3RvbSB0eXBlUm9vdHMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMtaXMuXG4gIHJldHVybiB0eXBlTmFtZXMuc29tZSgodHlwZU5hbWUpID0+IHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUuaW5jbHVkZXMoJy8nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlczogc3RyaW5nW10sIGdlbmVyYXRlZFR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2VuZXJhdGVkVHlwZVNldCA9IG5ldyBTZXQoZ2VuZXJhdGVkVHlwZXMpO1xuICByZXR1cm4gZXhpc3RpbmdUeXBlcy5maWx0ZXIoKHR5cGVOYW1lKSA9PiB7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIHBhY2thZ2UtcHJvdmlkZWQgdGVzdCBnbG9iYWxzLiBEcm9wIHN0YWxlIGVudHJpZXMgd2hlbiB0aGVcbiAgICAvLyBjb3JyZXNwb25kaW5nIGRlcGVuZGVuY3kgaXMgbm8gbG9uZ2VyIHByZXNlbnQgc28gVHlwZVNjcmlwdCB3b24ndCByZXF1aXJlXG4gICAgLy8gbWlzc2luZyBwYWNrYWdlcyBzdWNoIGFzIHZpdGVzdC5cbiAgICBpZiAoaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZSkgJiYgIWdlbmVyYXRlZFR5cGVTZXQuaGFzKHR5cGVOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lID09PSAnamVzdCcgfHwgdHlwZU5hbWUgPT09ICdtb2NoYScgfHwgdHlwZU5hbWUgPT09ICd2aXRlc3QvZ2xvYmFscyc7XG59XG5cbmZ1bmN0aW9uIGxvd2VyQ2FzZVNldHRpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddXG4pOiBQaWNrPE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LCAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnPiB7XG4gIGNvbnN0IGVtaXRPcHRpb25zID0ge30gYXMgUGljazxcbiAgICBOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPixcbiAgICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgLy8gUmVhY3QgTmF0aXZlIGdldHMgaXRzIGFtYmllbnQgdHlwZXMgZnJvbSBAdHNjb25maWcvcmVhY3QtbmF0aXZlIChyZWFjdC1uYXRpdmUsIGplc3QpLlxuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdidW4nKTtcbiAgfVxuICBpZiAoXG4gICAgZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICBkZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgIGRlcGVuZGVuY2llc1snamVzdC1lbnZpcm9ubWVudC1qc2RvbSddIHx8XG4gICAgZGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnamVzdCcpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMudml0ZXN0KSB7XG4gICAgdHlwZU5hbWVzLmFkZCgndml0ZXN0L2dsb2JhbHMnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLm1vY2hhKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbW9jaGEnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLmN5cHJlc3MpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdjeXByZXNzJyk7XG4gIH1cblxuICByZXR1cm4gWy4uLnR5cGVOYW1lc107XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICAgIC8vIC52c2NvZGUvc2V0dGluZ3MuanNvbiBpcyBKU09OQyBieSBkZWZpbml0aW9uOyBKU09OLnBhcnNlIHdvdWxkIG1ha2Ugd2JmeSBzaWxlbnRseSBza2lwXG4gICAgLy8gY29tbWVudGVkIGZpbGVzLlxuICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShwYXJzZWRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICBsZXQgc2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICB9XG4gICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHNldHRpbmdzLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuaW50ZXJmYWNlIEZub3hUb21sU3VidHJlZSB7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgdW5kZWZpbmVkPjtcbn1cblxuLy8gVGhlIGZvdXIgc3RhbmRhcmQgV0JfRU5WIG1vZGVzOyBzdGFnaW5nIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGNvbXBsZXRlZCB3aGVuIHRoZSByZXBvc2l0b3J5XG4vLyBhbHJlYWR5IGRlY2xhcmVzIHRoZSBzdGFnaW5nIHByb2ZpbGUuXG5jb25zdCB3YkVudk1vZGVzID0gWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddIGFzIGNvbnN0O1xudHlwZSBXYkVudk1vZGUgPSAodHlwZW9mIHdiRW52TW9kZXMpW251bWJlcl07XG5cbi8qKlxuICogRW5zdXJlcyBhIGZub3ggcmVwb3NpdG9yeSBkZWZpbmVzIFdCX0VOViBmb3IgZXZlcnkgc3RhbmRhcmQgbW9kZSAoYW5kIE5FWFRfUFVCTElDX1dCX0VOViB3aGVuXG4gKiBhbnkgd29ya3NwYWNlIGRlcGVuZHMgb24gTmV4dC5qcyBvciB2aW5leHQpIGluIGZub3gudG9tbCBwcm9maWxlcy4gRXhpc3RpbmcgZGVmaW5pdGlvbnMgYXJlXG4gKiBhbHdheXMgbGVmdCB1bnRvdWNoZWQuIE5vbi1mbm94IHJlcG9zaXRvcmllcyBhcmUgc2tpcHBlZDogLmVudiBmaWxlcyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2Vuc3VyZVdiRW52RGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmVlZHNOZXh0UHVibGljID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZykpO1xuICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAvLyBsc3RhdCwgbm90IGV4aXN0c1N5bmM6IGV4aXN0c1N5bmMgaXMgZmFsc2UgZm9yIGEgREFOR0xJTkcgZm5veC50b21sIHN5bWxpbms7IGFueSBmbm94LnRvbWxcbiAgICAvLyBkaXJlY3RvcnkgZW50cnkgbWFya3MgYSBmbm94IHJlcG9zaXRvcnksIGFuZCBhIHJlZnVzZWQvZGFuZ2xpbmcgb25lIGFib3J0cyBpbnN0ZWFkIG9mXG4gICAgLy8gYmVpbmcgdHJlYXRlZCBhcyBhIG5vbi1mbm94IHJlcG9zaXRvcnkgd2hpbGUgdGhlIGZub3ggc3luY2hyb25pemF0aW9uIGlzIGZhaWxpbmcuXG4gICAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZm5veFRvbWxQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZm5veFRvbWxQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50LCBuZWVkc05leHRQdWJsaWMpO1xuICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWlycm9ycyB3YidzIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52IGNvbnRyYWN0IChwYWNrYWdlcy93Yi9zcmMvcHJvamVjdC50cyk6IHRoZSBmcmFtZXdvcmsgbWF5XG4gKiBiZSBkZWNsYXJlZCBpbiBBTlkgb2YgdGhlIGZvdXIgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBgbmV4dGAgYXMgYSBkZXZEZXBlbmRlbmN5IGluIGEgc2hhcmVkXG4gKiBjb21wb25lbnQgbGlicmFyeSksIHdoaWxlIHdiZnkncyBgZGVwZW5kaW5nLm5leHRgIGxvb2tzIG9ubHkgYXQgcmVndWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXS5zb21lKChzZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gY29uZmlnLnBhY2thZ2VKc29uPy5bc2VjdGlvbiBhcyAnZGVwZW5kZW5jaWVzJ107XG4gICAgcmV0dXJuICEhZGVwZW5kZW5jaWVzPy5bJ25leHQnXSB8fCAhIWRlcGVuZGVuY2llcz8uWyd2aW5leHQnXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBtaXNzaW5nIFdCX0VOViAoYW5kIG9wdGlvbmFsbHkgTkVYVF9QVUJMSUNfV0JfRU5WKSBlbnRyaWVzIGludG8gYSBmbm94LnRvbWw6IHRoZSBiYXNlXG4gKiBgW3NlY3JldHNdYCB0YWJsZSBjYXJyaWVzIHRoZSBkZXZlbG9wbWVudCBkZWZhdWx0cyBhbmQgYFtwcm9maWxlcy48bW9kZT4uc2VjcmV0c11gIG92ZXJsYXlzXG4gKiBlYWNoIG90aGVyIG1vZGUsIG1hdGNoaW5nIHRoZSBvcmctc3RhbmRhcmQgbGF5b3V0LiBGb3JtYXR0aW5nIGFuZCBjb21tZW50cyBhcmUgcHJlc2VydmVkOyBvbmx5XG4gKiBtaXNzaW5nIGxpbmVzIGFyZSBpbnNlcnRlZCBvciBtaXNzaW5nIHNlY3Rpb25zIGFwcGVuZGVkLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjb250ZW50XG4gKiBjYW5ub3QgYmUgc2FmZWx5IGVkaXRlZCAodW5wYXJzYWJsZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGVkaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudDogc3RyaW5nLCBuZWVkc05leHRQdWJsaWM6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgc2V0dGluZ3M6IEZub3hUb21sU3VidHJlZTtcbiAgdHJ5IHtcbiAgICBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSBpdCBpcyBub3QgcGFyc2FibGUgYXMgVE9NTC4nKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qga2V5TmFtZXMgPSBuZWVkc05leHRQdWJsaWMgPyBbJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSA6IFsnV0JfRU5WJ107XG4gIGxldCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgLy8gVGhlIHN0YWdpbmcgbW9kZSBpcyBvcHRpb25hbDogY29tcGxldGUgaXQgb25seSB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgZGVjbGFyZXMgdGhlIHByb2ZpbGUuXG4gICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHNldHRpbmdzLnNlY3JldHMgOiBzZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBrZXlOYW1lcykge1xuICAgICAgY29uc3QgZGVmaW5lZCA9IGRlZmluZWRLZXlzPy5ba2V5TmFtZV07XG4gICAgICBjb25zdCBkZWZpbmVkVmFsdWUgPVxuICAgICAgICB0eXBlb2YgZGVmaW5lZCA9PT0gJ3N0cmluZycgPyBkZWZpbmVkIDogKGRlZmluZWQgYXMgeyBkZWZhdWx0PzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uZGVmYXVsdDtcbiAgICAgIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWUsIGRlZmluZWRWYWx1ZSwgbW9kZSk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmdMaW5lcyA9IGtleU5hbWVzXG4gICAgICAuZmlsdGVyKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChrZXlOYW1lKSA9PiBgJHtrZXlOYW1lfSA9IHsgZGVmYXVsdCA9IFwiJHttb2RlfVwiIH1gKTtcbiAgICBpZiAobWlzc2luZ0xpbmVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRJbnRvRm5veFNlY3Rpb24oXG4gICAgICB1cGRhdGVkQ29udGVudCxcbiAgICAgIG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyAnc2VjcmV0cycgOiBgcHJvZmlsZXMuJHttb2RlfS5zZWNyZXRzYCxcbiAgICAgIG1pc3NpbmdMaW5lc1xuICAgICk7XG4gIH1cbiAgaWYgKHVwZGF0ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm4gY29udGVudDtcblxuICAvLyBSZS1wYXJzZSBiZWZvcmUgcmV0dXJuaW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cyB3aXRob3V0IGEgdGFibGUgaGVhZGVyKSBjb3VsZFxuICAvLyBtYWtlIHRoZSB0ZXh0dWFsIGVkaXQgcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZTsgZmFpbCBzYWZlbHkgaW5zdGVhZCBvZiBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKHVwZGF0ZWRDb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHVwZGF0ZWRTZXR0aW5ncy5zZWNyZXRzIDogdXBkYXRlZFNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgICBpZiAoa2V5TmFtZXMuc29tZSgoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnNlcnRlZCAke21vZGV9IGVudHJpZXMgZGlkIG5vdCB0YWtlIGVmZmVjdGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1cGRhdGVkQ29udGVudDtcbn1cblxuLyoqXG4gKiBXYXJucyB3aGVuIGFuIGV4aXN0aW5nIFdCX0VOVi1mYW1pbHkgZGVmaW5pdGlvbiBuYW1lcyBhIGRpZmZlcmVudCBtb2RlIHRoYW4gdGhlIG9uZSBpdCBpc1xuICogZGVmaW5lZCBmb3IgKGEgdHlwbyBsaWtlIGBwcm9kY3V0aW9uYCBvciBgcHJvZHVjdGlvbjFgLCBvciBhIGNvcHktcGFzdGVkIHdyb25nIG1vZGUpOiB3YlxuICogcmVqZWN0cyBub24tc3RhbmRhcmQgdmFsdWVzIGF0IHJ1bnRpbWUsIHNvIHN1cmZhY2luZyB0aGUgbWlzbWF0Y2ggZHVyaW5nIHdiZnkgaXMgdGhlIGVhcmxpZXN0XG4gKiBwb3NzaWJsZSBzaWduYWwuIFRoZSBwYXNzZWQgdmFsdWUgaXMgYWx3YXlzIHBsYWludGV4dCAoYSBmbm94IGBkZWZhdWx0YCBmaWVsZCkg4oCUIGVuY3J5cHRlZFxuICogZm5veCBlbnRyaWVzIGFyZSBgeyBwcm92aWRlciwgdmFsdWUgfWAgb2JqZWN0cyB3aG9zZSBgZGVmYXVsdGAgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBtb2RlOiBXYkVudk1vZGUpOiB2b2lkIHtcbiAgLy8gQW4gRU1QVFkgdmFsdWUgY291bnRzIGFzIHVuc2V0ICh3YiBzdXBwbGllcyB0aGUgZmFsbGJhY2sgbW9kZSksIG5vdCBhcyBhIG1pc21hdGNoaW5nIG1vZGUuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbW9kZSkgcmV0dXJuO1xuICAvLyBBIGR5bmFtaWMgdmFsdWUgKGUuZy4gYE5FWFRfUFVCTElDX1dCX0VOVj0ke1dCX0VOVn1gKSBtYXkgbGVnaXRpbWF0ZWx5IHJlc29sdmUgdG8gdGhlIG1vZGVcbiAgLy8gdGhyb3VnaCBleHBhbnNpb24sIHdoaWNoIHRoaXMgc3RhdGljIGNoZWNrIGNhbm5vdCBldmFsdWF0ZSDigJQgc2tpcCBpbnN0ZWFkIG9mIG1pc2ZpcmluZy5cbiAgLy8gZm5veCBleHBhbmRzIG9ubHkgYCR7Li4ufWAgKGEgYmFyZSBgJFVOU0VUYCBzdGF5cyBsaXRlcmFsKS5cbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCckeycpKSByZXR1cm47XG4gIGlmIChrZXlOYW1lID09PSAnTkVYVF9QVUJMSUNfV0JfRU5WJykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2Igb3ZlcnJpZGVzIGl0IHdpdGggV0JfRU5WLCBidXQgYSBkaXJlY3QgZnJhbWV3b3JrIGJ1aWxkIHdvdWxkIGlubGluZSB0aGlzIHZhbHVlLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiByZWplY3RzIHZhbHVlcyBvdXRzaWRlIGRldmVsb3BtZW50L3Rlc3Qvc3RhZ2luZy9wcm9kdWN0aW9uLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGxpbmVzIGF0IHRoZSB0b3Agb2YgYSBUT01MIHNlY3Rpb24sIHJpZ2h0IGFmdGVyIGl0cyBgW2hlYWRlcl1gIGxpbmUgc28gcHJvZmlsZS1zcGVjaWZpY1xuICogZW50cmllcyBzdGF5IGdyb3VwZWQgd2l0aCB0aGVpciBoZWFkZXI7IHRoZSBzZWN0aW9uIGlzIGFwcGVuZGVkIGF0IHRoZSBlbmQgd2hlbiBpdCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEludG9Gbm94U2VjdGlvbihjb250ZW50OiBzdHJpbmcsIHNlY3Rpb25OYW1lOiBzdHJpbmcsIGluc2VydGVkTGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgLy8gd2JmeSB3cml0ZXMgdGhlIGhlYWRlciB3aXRob3V0IHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBkb3R0ZWQta2V5IGNvbXBvbmVudHMuXG4gIGNvbnN0IGhlYWRlclBhdHRlcm4gPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXlxccypcXFske3NlY3Rpb25OYW1lLnJlcGxhY2VBbGwoJy4nLCBTdHJpbmcucmF3YFxcLmApfVxcXVxccyooPzojLiopPyRgLCAndScpO1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gaGVhZGVyUGF0dGVybi50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bJHtzZWN0aW9uTmFtZX1dXFxuJHtpbnNlcnRlZExpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCArIDEpLCAuLi5pbnNlcnRlZExpbmVzLCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEpXS5qb2luKCdcXG4nKTtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLyoqXG4gKiBSZXBvc2l0b3JpZXMgb3V0c2lkZSBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZVxuICogd29ya2Zsb3dzOiB0aG9zZSB3b3JrZmxvd3MgZGVwZW5kIG9uIG9yZ2FuaXphdGlvbiBzZWNyZXRzIChWRVJEQUNDSU9fVE9LRU4sIERpc2NvcmQgd2ViaG9va3MpXG4gKiBhbmQgc2VsZi1ob3N0ZWQgcnVubmVycyB0aGF0IG90aGVyIG93bmVycyBkbyBub3QgaGF2ZS4gVGhpcyBnZW5lcmF0b3IgaW5zdGVhZCBlbWl0c1xuICogc2VsZi1jb250YWluZWQgd29ya2Zsb3dzIGJ1aWx0IG9ubHkgZnJvbSB3aGF0IGFueSByZXBvc2l0b3J5IG93bmVyIGNhbiBwcm92aWRlOiB0aGUgcmVwb3NpdG9yeVxuICogY29udGVudHMgKG1pc2UudG9tbCwgcGFja2FnZS5qc29uIHNjcmlwdHMpIGFuZCB0aGUgc2luZ2xlIGBGTk9YX0FHRV9LRVlgIHJlcG9zaXRvcnkgc2VjcmV0IHdoZW5cbiAqIHRoZSByZXBvc2l0b3J5IHVzZXMgZm5veC4gR2VuZXJhdGlvbiBpcyBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXInc1xuICogaWRlbnRpdHksIHNvIGl0IHdvcmtzIGZvciBhcmJpdHJhcnkgcGVyc29uYWwgcmVwb3NpdG9yaWVzLlxuICovXG5cbi8qKiBGaXJzdCBsaW5lIG9mIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlOyBmaWxlcyB3aXRob3V0IGl0IGFyZSBoYW5kLXdyaXR0ZW4gYW5kIG5ldmVyIHRvdWNoZWQuICovXG5leHBvcnQgY29uc3Qgc2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnkuJztcblxuLy8gU2FtZSBwaW5zIGFzIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MgLyB0aGVpciBjb25zdW1lcnM7IFJlbm92YXRlIHVwZGF0ZXMgdGhlbSBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkuXG5jb25zdCBjaGVja291dEFjdGlvbiA9ICdhY3Rpb25zL2NoZWNrb3V0QHY3LjAuMSc7XG5jb25zdCBtaXNlQWN0aW9uID0gJ2pkeC9taXNlLWFjdGlvbkB2NC4yLjMnO1xuY29uc3QgY2FjaGVBY3Rpb24gPSAnYWN0aW9ucy9jYWNoZUB2Ni4xLjAnO1xuY29uc3QgdXBsb2FkQXJ0aWZhY3RBY3Rpb24gPSAnYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjcuMC4xJztcbi8vIHY2LjEuMTsgdGhlIHNhbWUgcGluIGFzIHRoZSByZXVzYWJsZSBzZW1hbnRpYy1wciB3b3JrZmxvdy5cbmNvbnN0IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24gPSAnYW1hbm5uL2FjdGlvbi1zZW1hbnRpYy1wdWxsLXJlcXVlc3RANDViOWVkN2NmMjQwODdhMmY3Nzg1YmY1NWJlOTczOTRiYTg3ZTFjMic7XG4vLyB2My4wLjM7IGRlcGxveXMgYXJlIG5ldHdvcmstaGVhdnkgYW5kIGJlbmVmaXQgZnJvbSByZXRyaWVzIHdpdGggYSBsb25nIHRpbWVvdXQuXG5jb25zdCByZXRyeUFjdGlvbiA9ICduaWNrLWZpZWxkcy9yZXRyeUBkZDU2ZjFjYThjYTk5MWUyMzg1YzE4YWI2ZGQzNmVhN2Y5ZmRiNTVmJztcblxuLyoqXG4gKiBKb2ItbGV2ZWwgZW52IHRoYXQgdHVybnMgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHBhdGggb24sIG1pcnJvcmluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzLlxuICpcbiAqIGBzZWNyZXRzYCBpcyB1bmF2YWlsYWJsZSBpbiBhIHN0ZXAtbGV2ZWwgYGlmOmAsIHNvIHRoZSBwcmVzZW5jZSBvZiB0aGUgdG9rZW4gaXMgZXhwb3NlZCBhcyBhXG4gKiBub24tc2VjcmV0IHNpZ25hbDsgYW4gdW5zZXQgc2VjcmV0IGV4cGFuZHMgdG8gYGZhbHNlYCBhbmQgbGVhdmVzIGV2ZXJ5IEd1YXJkIHN0ZXAgc2tpcHBlZCwgd2hpY2hcbiAqIGlzIHdoYXQga2VlcHMgdGhlIGdlbmVyYXRlZCB3b3JrZmxvd3MgcnVubmFibGUgaW4gYSByZXBvc2l0b3J5IHRoYXQgbmV2ZXIgcmVnaXN0ZXJzIHRoZSBzZWNyZXQuXG4gKiBUQUtVTUlfR1VBUkRfVE9LRU4gaXRzZWxmIGlzIGRlZmluZWQtYnV0LUVNUFRZIGpvYi13aWRlIHNvIHRoZSBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2VcbiAqIGluIHRoZSBnZW5lcmF0ZWQgLm5wbXJjIHN0aWxsIGV4cGFuZHMgKHRvICcnKSBpbiB0aGUgc3RlcHMgdGhhdCBkZWxpYmVyYXRlbHkgcnVuIHdpdGhvdXQgdGhlXG4gKiB0b2tlbjsgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkIHZhcmlhYmxlIGlzIHdoYXQgYnJlYWtzIGFuIGluc3RhbGwsIGFuIGVtcHR5IG9uZSBpcyBmaW5lLlxuICovXG5jb25zdCBndWFyZEpvYkVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgSEFTX1RBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyAhIXNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyxcbiAgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJyxcbn07XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgbmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICB1c2VzPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gICd3b3JraW5nLWRpcmVjdG9yeSc/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbmN1cnJlbmN5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7ICdydW5zLW9uJzogc3RyaW5nOyBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0ZXBzOiBTdGVwW10gfVxuICA+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxQYWNrYWdlQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdID0gW3Jvb3RDb25maWddXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKHdvcmtmbG93c1BhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgd29ya2Zsb3dzIGJlY2F1c2UgJHt3b3JrZmxvd3NQYXRofSByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHVzZXNGbm94ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpO1xuICAgIGNvbnN0IHdvcmtmbG93QnlGaWxlTmFtZTogUmVjb3JkPHN0cmluZywgV29ya2Zsb3c+ID0ge1xuICAgICAgJ3Rlc3QueW1sJzogYnVpbGRUZXN0V29ya2Zsb3cocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MsIHVzZXNGbm94KSxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnOiBidWlsZFNlbWFudGljUHJXb3JrZmxvdygpLFxuICAgIH07XG4gICAgLy8gRGVwbG95IHdvcmtmbG93cyBhcmUgZ2VuZXJhdGVkIHBlciBkZXBsb3kgc2NyaXB0IHRoZSByZXBvc2l0b3J5IGRlY2xhcmVzLCBzbyBhIHJlcG9zaXRvcnlcbiAgICAvLyB3aXRob3V0IGEgc3RhZ2luZyBlbnZpcm9ubWVudCBzaW1wbHkgZ2V0cyBubyBzdGFnaW5nIHdvcmtmbG93LiBPbmx5IHNjcmlwdHMgdGhhdCBpbnZva2VcbiAgICAvLyBgd2IgZGVwbG95YCBxdWFsaWZ5OiBhIGJlc3Bva2UgZGVwbG95IHNjcmlwdCBtYXkgbm90IGJlIHNhZmUgdG8gdHJpZ2dlciBhdXRvbWF0aWNhbGx5XG4gICAgLy8gKGRlcGxveS1zdGFnaW5nIHJ1bnMgb24gZXZlcnkgcHVzaCB0byB0aGUgZGVmYXVsdCBicmFuY2gpLlxuICAgIGNvbnN0IHNjcmlwdHMgPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICAgIGNvbnN0IGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA9IGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0c1snZGVwbG95J10pO1xuICAgIGlmIChoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cpIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsnZGVwbG95LXByb2R1Y3Rpb24ueW1sJ10gPSBidWlsZERlcGxveVdvcmtmbG93KCdwcm9kdWN0aW9uJywgJ2RlcGxveScsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0c1snZGVwbG95OnN0YWdpbmcnXSkpIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsnZGVwbG95LXN0YWdpbmcueW1sJ10gPSBidWlsZERlcGxveVdvcmtmbG93KCdzdGFnaW5nJywgJ2RlcGxveTpzdGFnaW5nJywgdXNlc0Zub3gpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlICYmIHJvb3RDb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ3JlbGVhc2UueW1sJ10gPSBidWlsZFJlbGVhc2VXb3JrZmxvdyhyb290Q29uZmlnLCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3csIHVzZXNGbm94KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHdvcmtmbG93XSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvd0J5RmlsZU5hbWUpKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVTZWxmQ29udGFpbmVkV29ya2Zsb3cocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgd29ya2Zsb3cpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhmaWxlUGF0aDogc3RyaW5nLCB3b3JrZmxvdzogV29ya2Zsb3cpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgLy8gVW5saWtlIFdpbGxCb29zdGVyLW9yZ2FuaXphdGlvbiByZXBvc2l0b3JpZXMsIHdiZnkgZG9lcyBub3Qgb3duIGFyYml0cmFyeSByZXBvc2l0b3JpZXMnIENJOlxuICAvLyBvbmx5IGZpbGVzIGl0IGdlbmVyYXRlZCAoaWRlbnRpZmllZCBieSB0aGUgbWFya2VyKSBhcmUgcmVnZW5lcmF0ZWQsIGFuZCBoYW5kLXdyaXR0ZW5cbiAgLy8gd29ya2Zsb3dzIGFyZSBuZXZlciB0b3VjaGVkLiBPd25lcnMgb3B0IG91dCBwZXJtYW5lbnRseSBieSByZW1vdmluZyB0aGUgbWFya2VyIGxpbmUuXG4gIC8vIEFuIGVtcHR5IG9yIHdoaXRlc3BhY2Utb25seSBmaWxlIGNhcnJpZXMgbm8gaGFuZC13cml0dGVuIGNvbnRlbnQsIHNvIGl0IGlzIHRyZWF0ZWQgYXMgYWJzZW50LlxuICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG9sZENvbnRlbnQudHJpbSgpICE9PSAnJyAmJiAhb2xkQ29udGVudC5zdGFydHNXaXRoKHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXIgPSBgJHtzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXJ9IFJlbW92ZSB0aGlzIGxpbmUgdG8gc3RvcCB3YmZ5IGZyb20gb3ZlcndyaXRpbmcgdGhpcyBmaWxlLlxcbmA7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKHdvcmtmbG93LCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgaGVhZGVyICsgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiB3b3JraW5nRGlyKGRpclBhdGg6IHN0cmluZyk6IFBpY2s8U3RlcCwgJ3dvcmtpbmctZGlyZWN0b3J5Jz4ge1xuICByZXR1cm4gZGlyUGF0aCA/IHsgJ3dvcmtpbmctZGlyZWN0b3J5JzogZGlyUGF0aCB9IDoge307XG59XG5cbmZ1bmN0aW9uIGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2IgZGVwbG95XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBidWlsZFRlc3RXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbFBhY2thZ2VDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sIHVzZXNGbm94OiBib29sZWFuKTogV29ya2Zsb3cge1xuICAvLyBQbGF5d3JpZ2h0IG1heSBiZSBkZWNsYXJlZCBvbmx5IGluIHdvcmtzcGFjZSBwYWNrYWdlczsgYHdiIHRlc3Qtb24tY2lgIHJ1bnMgZXZlcnkgZGVjbGFyaW5nXG4gIC8vIHBhY2thZ2UncyBlMmUgdGVzdHMsIHNvIHRoZSB3b3JrZmxvdyBtdXN0IGluc3RhbGwgYnJvd3NlcnMgZm9yIGVhY2ggb2YgdGhlbSAodGhlaXIgdmVyc2lvbnNcbiAgLy8gbWF5IGRpZmZlciwgYW5kIGVhY2ggbGlicmFyeSB2ZXJzaW9uIHJlcXVpcmVzIGl0cyBtYXRjaGluZyBicm93c2VyIGJpbmFyaWVzKS4gQnVuJ3MgaXNvbGF0ZWRcbiAgLy8gbGlua2VyIHJlc29sdmVzIHRoZSBwbGF5d3JpZ2h0IGJpbmFyeSBvbmx5IGZyb20gdGhlIGRlY2xhcmluZyBwYWNrYWdlLCBoZW5jZSB0aGVcbiAgLy8gd29ya2luZy1kaXJlY3Rvcnkgb24gZXZlcnkgc3RlcC4gVGhlIGJyb3dzZXJzIGxhbmQgaW4gfi8uY2FjaGUvbXMtcGxheXdyaWdodCwgc2hhcmVkIGFjcm9zc1xuICAvLyB3b3Jrc3BhY2VzLCBzbyBzYW1lLXZlcnNpb24gaW5zdGFsbHMgbmF0dXJhbGx5IGRlZHVwbGljYXRlLlxuICBjb25zdCBwbGF5d3JpZ2h0RGlyUGF0aHMgPSBbLi4uYWxsUGFja2FnZUNvbmZpZ3NdXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLmRpclBhdGgubG9jYWxlQ29tcGFyZShiLmRpclBhdGgpKVxuICAgIC5maWx0ZXIoKHBhY2thZ2VDb25maWcpID0+IHBhY2thZ2VDb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KVxuICAgIC5tYXAoKHBhY2thZ2VDb25maWcpID0+IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIHBhY2thZ2VDb25maWcuZGlyUGF0aCkpO1xuICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieSBgYnVuIGluc3RhbGxgXG4gIC8vIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gIGNvbnN0IGZub3hFbnY6IFBpY2s8U3RlcCwgJ2Vudic+ID0gdXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9O1xuXG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiB9LFxuICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKHRydWUpLFxuICAgIC4uLihwbGF5d3JpZ2h0RGlyUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyAoW1xuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgsIGluZGV4KTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgbmFtZTogYEdldCBQbGF5d3JpZ2h0IHZlcnNpb24ke2RpclBhdGggPyBgICgke2RpclBhdGh9KWAgOiAnJ31gLFxuICAgICAgICAgICAgLy8gVGhlIElOU1RBTExFRCB2ZXJzaW9uLCBub3QgdGhlIHBhY2thZ2UuanNvbiBzcGVjaWZpZXI6IGEgcmFuZ2UgbGlrZSBgXjEuNDUuMGBcbiAgICAgICAgICAgIC8vIHN0YXlzIHVuY2hhbmdlZCBhY3Jvc3MgbG9ja2ZpbGUgdXBkYXRlcywgc28ga2V5aW5nIHRoZSBjYWNoZSBvbiBpdCB3b3VsZCByZXN0b3JlXG4gICAgICAgICAgICAvLyBzdGFsZSBicm93c2VycyB0aGF0IG5vIGxvbmdlciBtYXRjaCB0aGUgbGlicmFyeS4gUnVucyBhZnRlciBgYnVuIGluc3RhbGxgLCBzbyB0aGVcbiAgICAgICAgICAgIC8vIHBhY2thZ2UgaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSdzIGRpcmVjdG9yeS5cbiAgICAgICAgICAgIGlkOiBgcGxheXdyaWdodC12ZXJzaW9uLSR7aW5kZXh9YCxcbiAgICAgICAgICAgIHJ1bjogJ2VjaG8gXCJ2ZXJzaW9uPSQoYnVuIC1lIFwidHJ5IHsgY29uc29sZS5sb2cocmVxdWlyZShcXCdAcGxheXdyaWdodC90ZXN0L3BhY2thZ2UuanNvblxcJykudmVyc2lvbikgfSBjYXRjaCB7fVwiKVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQ2FjaGUgUGxheXdyaWdodCBicm93c2VycycsXG4gICAgICAgICAgICBpZDogJ3BsYXl3cmlnaHQtY2FjaGUnLFxuICAgICAgICAgICAgdXNlczogY2FjaGVBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHBhdGg6ICd+Ly5jYWNoZS9tcy1wbGF5d3JpZ2h0JyxcbiAgICAgICAgICAgICAga2V5OiBgcGxheXdyaWdodC1cXCR7eyBydW5uZXIub3MgfX0tJHtwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChfLCBpbmRleCkgPT4gYFxcJHt7IHN0ZXBzLnBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fS5vdXRwdXRzLnZlcnNpb24gfX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCctJyl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoKTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCAhPSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgYnJvd3NlcnMgc3RpbGwgbmVlZCB0aGVpciBzeXN0ZW0gZGVwZW5kZW5jaWVzIG9uIGEgZnJlc2ggcnVubmVyLlxuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwtZGVwcycsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgOiBbXSksXG4gICAgLi4uKGhhc1R5cGVjaGVjayA/IFt7IHJ1bjogJ2J1biBydW4gdHlwZWNoZWNrJywgLi4uZm5veEVudiB9XSA6IFtdKSxcbiAgICB7IHJ1bjogJ2J1biBydW4gbGludCcsIC4uLmZub3hFbnYgfSxcbiAgICB7IHJ1bjogJ2J1biBydW4gdGVzdC9jaScsIC4uLmZub3hFbnYgfSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdVcGxvYWQgdGVzdCByZXN1bHRzJyxcbiAgICAgICAgICAgIGlmOiAnJHt7IGFsd2F5cygpIH19JyxcbiAgICAgICAgICAgIHVzZXM6IHVwbG9hZEFydGlmYWN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBuYW1lOiAndGVzdC1yZXN1bHRzJyxcbiAgICAgICAgICAgICAgLy8gRXZlcnkgZGVjbGFyaW5nIHBhY2thZ2Ugd3JpdGVzIGl0cyBvd24gdGVzdC1yZXN1bHRzIGRpcmVjdG9yeTsgYSBuZXdsaW5lLXNlcGFyYXRlZFxuICAgICAgICAgICAgICAvLyBsaXN0IHVwbG9hZHMgdGhlbSBhbGwuXG4gICAgICAgICAgICAgIHBhdGg6IHBsYXl3cmlnaHREaXJQYXRoc1xuICAgICAgICAgICAgICAgIC5tYXAoKGRpclBhdGgpID0+IChkaXJQYXRoID8gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICd0ZXN0LXJlc3VsdHMnKSA6ICd0ZXN0LXJlc3VsdHMnKSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdpZ25vcmUnLFxuICAgICAgICAgICAgICAncmV0ZW50aW9uLWRheXMnOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgICAgOiBbXSksXG4gIF07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHsgYnJhbmNoZXM6IFsnbWFpbiddIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6ICdyZWFkJyB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBGT1JDRV9DT0xPUjogJzMnLCBXQl9FTlY6ICd0ZXN0JywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHMsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVwbG95V29ya2Zsb3coZW52aXJvbm1lbnQ6ICdzdGFnaW5nJyB8ICdwcm9kdWN0aW9uJywgc2NyaXB0TmFtZTogc3RyaW5nLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBgRGVwbG95IGFwcCBvbiAke2Vudmlyb25tZW50fWAsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgICAgLy8gUHJvZHVjdGlvbiBkZXBsb3lzIGZvbGxvdyBwdWJsaXNoZWQgcmVsZWFzZXMgKHNlZSB0aGUgcmVsZWFzZSB3b3JrZmxvdydzIHRyaWdnZXIgc3RlcCk7XG4gICAgICAvLyBzdGFnaW5nIGNvbnZlcmdlcyBvbiBldmVyeSBkZWZhdWx0LWJyYW5jaCBwdXNoLlxuICAgICAgLi4uKGVudmlyb25tZW50ID09PSAncHJvZHVjdGlvbidcbiAgICAgICAgPyB7IHJlbGVhc2U6IHsgdHlwZXM6IFsncHVibGlzaGVkJ10gfSB9XG4gICAgICAgIDogeyBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSwgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddIH0gfSksXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICBkZXBsb3k6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBXQl9FTlY6IGVudmlyb25tZW50LCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIC8vIGZldGNoLWRlcHRoIDAgc28gYGdpdCBkZXNjcmliZWAgc2VlcyB0aGUgdGFncyBXQl9WRVJTSU9OIGlzIGRlcml2ZWQgZnJvbS5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdTZXQgV0JfVkVSU0lPTicsXG4gICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbldCX1ZFUlNJT049JChnaXQgZGVzY3JpYmUgLS1hbHdheXMgLS10YWdzKVxcbmVjaG8gXCJXQl9WRVJTSU9OPSRXQl9WRVJTSU9OXCIgPj4gXCIkR0lUSFVCX0VOVlwiJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnRGVwbG95JyxcbiAgICAgICAgICAgIHVzZXM6IHJldHJ5QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICB0aW1lb3V0X21pbnV0ZXM6IDYwLFxuICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHM6IDUsXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFN0ZXAtc2NvcGVkIGxpa2UgdGhlIHRlc3Qgd29ya2Zsb3c6IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgcnVuIGJ5XG4gICAgICAgICAgICAvLyBgYnVuIGluc3RhbGxgIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gICAgICAgICAgICAuLi4odXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbGVhc2VXb3JrZmxvdyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3c6IGJvb2xlYW4sXG4gIHVzZXNGbm94OiBib29sZWFuXG4pOiBXb3JrZmxvdyB7XG4gIGNvbnN0IGZub3hFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB1c2VzRm5veCA/IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IDoge307XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbLi4uY29uZmlnLnJlbGVhc2UuYnJhbmNoZXNdIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgZGlzcGF0Y2hpbmcgdGhlIHByb2R1Y3Rpb24gZGVwbG95IHdvcmtmbG93IGFmdGVyIGEgcmVsZWFzZVxuICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA/IHsgYWN0aW9uczogJ3dyaXRlJyB9IDoge30pLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gUmVsZWFzZXMgYnVpbGQgcHJvZHVjdGlvbiBhcnRpZmFjdHMsIGhlbmNlIHRoZSBlbnZpcm9ubWVudCDigJQgdGhlIHNhbWUgZGVmYXVsdCBhcyB0aGVcbiAgICAgICAgLy8gcmV1c2FibGUgcmVsZWFzZSB3b3JrZmxvdy4gd2IncyBDSSBndWFyZCBhbHNvIHJlcXVpcmVzIGFuIGV4cG9ydGVkIFdCX0VOViwgc28gd2l0aG91dFxuICAgICAgICAvLyBpdCBhIGBwb3N0aW5zdGFsbGAgdGhhdCBjYWxscyB3YiAoZS5nLiBgd2IgZ2VuLWNvZGVgKSBleGl0cyAxIGJlZm9yZSBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICAgIC8vIHJ1bnMuXG4gICAgICAgIGVudjogeyBXQl9FTlY6ICdwcm9kdWN0aW9uJywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwOiBzZW1hbnRpYy1yZWxlYXNlIHJlYWRzIHRoZSBmdWxsIGhpc3RvcnkgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLlxuICAgICAgICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24sIHdpdGg6IHsgJ2ZldGNoLWRlcHRoJzogMCB9IH0sXG4gICAgICAgICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgICAgICAgLi4uYnVpbGRJbnN0YWxsU3RlcHMoZmFsc2UpLFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdHZXQgY3VycmVudCBsYXRlc3QgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncHJlLXJlbGVhc2UtdGFnJyxcbiAgICAgICAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuZWNobyBcInRhZz0kKGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hYmJyZXY9MCAyPi9kZXYvbnVsbCB8fCBlY2hvIFxcJ1xcJylcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICAgICAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgY2hlY2tzIE5vZGUuanMgcnVudGltZSByZXF1aXJlbWVudHM7IGBidW4gPGJpbj5gIHJlc3BlY3RzIGl0c1xuICAgICAgICAgICAgLy8gYCMhL3Vzci9iaW4vZW52IG5vZGVgIHNoZWJhbmcsIHNvIGl0IHN0aWxsIHJ1bnMgdW5kZXIgcmVhbCBOb2RlLlxuICAgICAgICAgICAgcnVuOiAnYnVuIHNlbWFudGljLXJlbGVhc2UnLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgICAgICAgIExFRlRIT09LOiAnMCcsXG4gICAgICAgICAgICAgIC4uLmZub3hFbnYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd1xuICAgICAgICAgICAgPyAoW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdDaGVjayBmb3IgbmV3IHJlbGVhc2UgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncG9zdC1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmdpdCBmZXRjaCAtLXRhZ3MgLS1mb3JjZVxcbk5FV19UQUc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXFxuZWNobyBcInRhZz0kTkVXX1RBR1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxcbmlmIFtbIC1uIFwiJE5FV19UQUdcIiAmJiBcIiRORVdfVEFHXCIgIT0gXCIke3sgc3RlcHMucHJlLXJlbGVhc2UtdGFnLm91dHB1dHMudGFnIH19XCIgXV07IHRoZW5cXG4gIGVjaG8gXCJjcmVhdGVkPXRydWVcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5maScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZjogXCJzdGVwcy5wb3N0LXJlbGVhc2UtdGFnLm91dHB1dHMuY3JlYXRlZCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdUcmlnZ2VyIHByb2R1Y3Rpb24gZGVwbG95JyxcbiAgICAgICAgICAgICAgICAgIC8vIEEgR0lUSFVCX1RPS0VOLWNyZWF0ZWQgcmVsZWFzZSBkb2VzIG5vdCBmaXJlIHRoZSBkZXBsb3kgd29ya2Zsb3cnc1xuICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZS1wdWJsaXNoZWQgdHJpZ2dlciwgc28gZGlzcGF0Y2ggaXQgZXhwbGljaXRseSBvbiB0aGUgbmV3IHRhZy5cbiAgICAgICAgICAgICAgICAgIHJ1bjogJ2doIHdvcmtmbG93IHJ1biBkZXBsb3ktcHJvZHVjdGlvbi55bWwgLS1yZWYgXCIke3sgc3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiJyxcbiAgICAgICAgICAgICAgICAgIGVudjogeyBHSF9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdIHNhdGlzZmllcyBTdGVwW10pXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbCBzZXF1ZW5jZSBldmVyeSBnZW5lcmF0ZWQgd29ya2Zsb3cgc2hhcmVzOiBgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVgLCBoYXJkZW5lZCBpbnRvIHRoZVxuICogcmV1c2FibGUgd29ya2Zsb3dzJyB0aHJlZS1zdGVwIGRhbmNlIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVnaXN0ZXJzIGEgVEFLVU1JX0dVQVJEX1RPS0VOIHNlY3JldC5cbiAqXG4gKiBUYWt1bWkgR3VhcmQgKGh0dHBzOi8vZmxhdHQudGVjaC90YWt1bWkvZmVhdHVyZXMvZ3VhcmQpIGlzIGEgcmVnaXN0cnkgcHJveHkgdGhhdCBibG9ja3NcbiAqIGtub3duLW1hbGljaW91cyBwYWNrYWdlcy4gUm91dGluZyB0aGUgREVGQVVMVCByZWdpc3RyeSB0aHJvdWdoIGl0IGlzIHdoYXQgcHJvdGVjdHMgdGhlIGluc3RhbGwsXG4gKiBhbmQgdGhlIHRva2VuIGF1dGhlbnRpY2F0ZXMgdGhhdCBwcm94eSDigJQgc28gdGhlIHRva2VuIGhhcyB0byBiZSBwcmVzZW50IHdoaWxlIGRlcGVuZGVuY2llcyBhcmVcbiAqIHJlc29sdmVkLCB3aGljaCBpcyBleGFjdGx5IHdoZW4gYSBjb21wcm9taXNlZCBkZXBlbmRlbmN5J3MgbGlmZWN5Y2xlIHNjcmlwdCB3b3VsZCBydW4uIEhlbmNlIHRoZVxuICogc3BsaXQ6IHJlc29sdmUgYW5kIGRvd25sb2FkIHdpdGggYC0taWdub3JlLXNjcmlwdHNgIGFuZCB0aGUgdG9rZW4sIHRoZW4gcmVwbGF5IHRoZSBza2lwcGVkXG4gKiBsaWZlY3ljbGUgc2NyaXB0cyBpbiBhIHNlY29uZCBpbnN0YWxsIHRoYXQgaGFzIG5vIHRva2VuIChldmVyeSBwYWNrYWdlIGlzIGFscmVhZHkgY2FjaGVkLCBhbmRcbiAqIEd1YXJkIHNlcnZlcyBhbm9ueW1vdXNseSBhbnl3YXkpLiBPbmx5IGJ1biBpcyBnZW5lcmF0ZWQgaGVyZSwgYW5kIGJ1biByZWFkcyAubnBtcmMsIHNvIG5vXG4gKiBwYWNrYWdlLW1hbmFnZXIgYnJhbmNoaW5nIGlzIG5lZWRlZC5cbiAqXG4gKiBUaGUgc2hlbGwgZGV0YWlscyBkZWxpYmVyYXRlbHkgbWlycm9yIHJldXNhYmxlLXdvcmtmbG93cycgcHJvZHVjdGlvbi1wcm92ZW4gaW5zdGFsbCBzdGVwczogYmFyZVxuICogYCRSVU5ORVJfVEVNUGAgKHNldCBieSB0aGUgcnVubmVyIGFwcGxpY2F0aW9uIG9uIGV2ZXJ5IHJ1bm5lciwgYW5kIGBzZXQgLXVgIGZhaWxzIGxvdWRseSBpZiBub3QpLFxuICogYFtbIC1lIC5ucG1yYyBdXWAsIGFuZCB0aGUgc2Vjb25kIGBybSAtcmYgbm9kZV9tb2R1bGVzYCBpbiB0aGUgZmFsbGJhY2sgKGFuIGludGVycnVwdGVkIGxpZmVjeWNsZVxuICogcnVuIG1heSBsZWF2ZSBub2RlX21vZHVsZXMgaW5jb25zaXN0ZW50LCBzbyB0aGUgcmV0cnkgc3RhcnRzIGNsZWFuIHJhdGhlciB0aGFuIHRydXN0aW5nIGEgcmVwYWlyKS5cbiAqXG4gKiBgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlYCBkZWNpZGVzIHdoYXQgYSBmYWlsaW5nIGxpZmVjeWNsZS1zY3JpcHQgcmVwbGF5IGRvZXMuIEV2ZXJ5XG4gKiByZXBsYXkgcnVucyB0b2tlbmxlc3MgYW5kIHdpdGhvdXQgRk5PWF9BR0VfS0VZICh0aGUga2V5IGlzIHNjb3BlZCB0byB0aGUgbGF0ZXIgRGVwbG95L1JlbGVhc2VcbiAqIHN0ZXApLCBzbyBhIHBvc3RpbnN0YWxsIHRoYXQgbmVlZHMgZGVjcnlwdGVkIHNlY3JldHMgaXMgdW5zdXBwb3J0ZWQgaW4gYWxsIG9mIHRoZW0gYnkgZGVzaWduLlxuICogVGhlIHRlc3Qgd29ya2Zsb3cgdG9sZXJhdGVzIHRoZSBmYWlsdXJlIGJlY2F1c2UgdHlwZWNoZWNrL2xpbnQvdGVzdCBmYWlsIGxvdWRseSBvbiBhIGRlZ3JhZGVkXG4gKiB0cmVlIGFueXdheS4gRGVwbG95IGFuZCByZWxlYXNlIHdvcmtmbG93cyBtdXN0IG5vdDogYSBgOjp3YXJuaW5nOjpgIGRvZXMgbm90IGZhaWwgdGhlIGpvYiwgc29cbiAqIHRoZSBmYWxsYmFjayB3b3VsZCBzaGlwIGEgdHJlZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyAoZS5nLiBhIGBwb3N0aW5zdGFsbDogd2IgZ2VuLWNvZGVgKVxuICogbmV2ZXIgcmFuLCBzaWxlbnRseSBkZXBsb3lpbmcgZGVncmFkZWQgb3V0cHV0ICgjMTEyNykuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbFN0ZXBzKHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZTogYm9vbGVhbik6IFN0ZXBbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ0dlbmVyYXRlIC5ucG1yYyBmb3IgVGFrdW1pIEd1YXJkJyxcbiAgICAgIC8vIFRoZSB0b2tlbiBpcyB3cml0dGVuIGFzIGEgbGl0ZXJhbCBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2UgdGhhdCBidW4gZXhwYW5kcyBhdFxuICAgICAgLy8gaW5zdGFsbCB0aW1lLCBzbyB0aGUgc2VjcmV0IGl0c2VsZiBuZXZlciBsYW5kcyBpbiBhIGZpbGUuIFRoZSBtYW5hZ2VkIGxpbmVzIGFyZSBzdHJpcHBlZFxuICAgICAgLy8gZnJvbSBhbiBleGlzdGluZyAubnBtcmMgZmlyc3Q6IGEgcmVwb3NpdG9yeSBvdXRzaWRlIHRoZSBvcmdhbml6YXRpb25zIG1heSBsZWdpdGltYXRlbHlcbiAgICAgIC8vIGNvbW1pdCBvbmUgKHNjb3BlIG1hcHBpbmdzIGZvciBhbm90aGVyIHJlZ2lzdHJ5KSwgYW5kIGRyb3BwaW5nIG9ubHkgdGhlc2UgdHdvIGxpbmVzIGtlZXBzXG4gICAgICAvLyB0aGUgcmVzdCBvZiBpdCBpbiBlZmZlY3QuIFJlcGxhY2luZyB0aGUgZmlsZSB3aXRoIGBtdmAgcmF0aGVyIHRoYW4gYXBwZW5kaW5nIGluIHBsYWNlIHN0b3BzXG4gICAgICAvLyBhIGNvbW1pdHRlZCBzeW1saW5rIGZyb20gcmVkaXJlY3RpbmcgdGhlIHdyaXRlIGludG8sIHNheSwgYSBwZXJzaXN0ZW50IGhvbWUgbnBtcmMuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuTlBNUkM9XCIkKG1rdGVtcCBcIiRSVU5ORVJfVEVNUC9ucG1yYy5YWFhYWFhcIilcIlxuaWYgW1sgLWUgLm5wbXJjIF1dOyB0aGVuXG4gIGdyZXAgLXZFICdecmVnaXN0cnk9fF4vL25wbVxcXFwuZmxhdHRcXFxcLnRlY2gvOl9hdXRoVG9rZW4nIC5ucG1yYyA+IFwiJE5QTVJDXCIgfHwgdHJ1ZVxuZmlcbmVjaG8gJ3JlZ2lzdHJ5PWh0dHBzOi8vbnBtLmZsYXR0LnRlY2gvJyA+PiBcIiROUE1SQ1wiXG5lY2hvICcvL25wbS5mbGF0dC50ZWNoLzpfYXV0aFRva2VuPVxcJHtUQUtVTUlfR1VBUkRfVE9LRU59JyA+PiBcIiROUE1SQ1wiXG5ybSAtZiAubnBtcmNcbm12IFwiJE5QTVJDXCIgLm5wbXJjYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAvLyAtLWZyb3plbi1sb2NrZmlsZTogYSBwbGFpbiBgYnVuIGluc3RhbGxgIHNpbGVudGx5IHJlcGFpcnMgYSBidW4ubG9jayB0aGF0IGlzIHN0YWxlIGFnYWluc3RcbiAgICAgIC8vIHBhY2thZ2UuanNvbiwgc28gQ0kgd291bGQgcnVuIGRlcGVuZGVuY3kgcmVzb2x1dGlvbnMgdGhhdCB3ZXJlIG5ldmVyIHJldmlld2VkICgjMTEyNikuXG4gICAgICAvLyBXaXRoIE5PIGJ1bi5sb2NrIGF0IGFsbCwgLS1mcm96ZW4tbG9ja2ZpbGUgc2lsZW50bHkgaW5zdGFsbHMgZnJlc2gsIHVucGlubmVkIHJlc29sdXRpb25zXG4gICAgICAvLyAoQnVuIDEuMy4xNCBleGl0cyAwIGFuZCB3cml0ZXMgbm8gbG9ja2ZpbGUpLCBzbyBhIG1pc3NpbmcgbG9ja2ZpbGUgbXVzdCBmYWlsIGV4cGxpY2l0bHkuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgW1sgISAtZSBidW4ubG9jayBdXTsgdGhlblxuICBlY2hvIFwiOjplcnJvcjo6YnVuLmxvY2sgaXMgbWlzc2luZzsgY29tbWl0IGl0IHNvIENJIGluc3RhbGxzIHN0YXkgcmVwcm9kdWNpYmxlXCJcbiAgZXhpdCAxXG5maVxuaWYgW1sgXCIkSEFTX1RBS1VNSV9HVUFSRF9UT0tFTlwiID09IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIC0taWdub3JlLXNjcmlwdHNcbmVsc2VcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVcbmZpYCxcbiAgICAgIC8vIFN0ZXAtc2NvcGVkOiBhIGpvYi1sZXZlbCB0b2tlbiB3b3VsZCBiZSByZWFkYWJsZSBieSBldmVyeSBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHQgdGhlXG4gICAgICAvLyB0b2tlbmxlc3MgcmVwbGF5IGJlbG93IHJ1bnMuXG4gICAgICBlbnY6IHsgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1J1biBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMnLFxuICAgICAgLy8gQSByZXBlYXRlZCBgYnVuIGluc3RhbGxgIGlzIGEgbm8tb3AgdGhhdCByZXBsYXlzIG5vdGhpbmcsIHNvIG5vZGVfbW9kdWxlcyBoYXMgdG8gZ28gZmlyc3QuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxucm0gLXJmIG5vZGVfbW9kdWxlc1xuYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUke1xuICAgICAgICB0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmVcbiAgICAgICAgICA/IGAgfHwge1xuICBlY2hvIFwiOjp3YXJuaW5nOjpMaWZlY3ljbGUgc2NyaXB0cyBmYWlsZWQ7IGNvbXBsZXRpbmcgdGhlIGluc3RhbGwgd2l0aG91dCB0aGVtXCJcbiAgcm0gLXJmIG5vZGVfbW9kdWxlc1xuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG59YFxuICAgICAgICAgIDogJydcbiAgICAgIH1gLFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1JlbW92ZSB0aGUgZ2VuZXJhdGVkIC5ucG1yYycsXG4gICAgICAvLyBOb3RoaW5nIGFmdGVyIHRoZSBpbnN0YWxsIG5lZWRzIHRoZSBwcm94eSwgYW5kIGxlYXZpbmcgaXQgaW4gcGxhY2Ugd291bGQgYnJlYWsgdGhlIG9uZVxuICAgICAgLy8gdGhpbmcgR3VhcmQgcmVmdXNlcyB0byBzZXJ2ZTogaXQgYW5zd2VycyBgbnBtIHB1Ymxpc2hgIHdpdGggNDA1LCBzbyBhIHJlbGVhc2Ugd29ya2Zsb3dcbiAgICAgIC8vIHdob3NlIHBhY2thZ2UgbGFja3MgYW4gZXhwbGljaXQgcHVibGlzaENvbmZpZy5yZWdpc3RyeSB3b3VsZCBmYWlsIHRvIHB1Ymxpc2guXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAtLSAubnBtcmMgPiAvZGV2L251bGwgMj4mMTsgdGhlblxuICBnaXQgY2hlY2tvdXQgLS0gLm5wbXJjXG5lbHNlXG4gIHJtIC1mIC5ucG1yY1xuZmlgLFxuICAgIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VtYW50aWNQcldvcmtmbG93KCk6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHsgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAvLyBUaGUgYWN0aW9uIHJlYWRzIHRoZSBwdWxsIHJlcXVlc3QsIGFuZCBpdHMgYHdpcGAgc3VwcG9ydCBwb3N0cyBhIGNvbW1pdCBzdGF0dXM7IG5laXRoZXJcbiAgICAgICAgLy8gcGVybWlzc2lvbiBpcyBncmFudGVkIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVzdHJpY3RzIGRlZmF1bHQgd29ya2Zsb3cgcGVybWlzc2lvbnMuXG4gICAgICAgIHBlcm1pc3Npb25zOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLCBzdGF0dXNlczogJ3dyaXRlJyB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXM6IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7IHdpcDogdHJ1ZSB9LFxuICAgICAgICAgICAgZW52OiB7IEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIE1pc2VUb21sIHtcbiAgdG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gVGhlIG9sZGVzdCBCdW4gcnVudGltZSB3YmZ5IHN1cHBvcnRzLlxuZXhwb3J0IGNvbnN0IG1pbmltdW1CdW5WZXJzaW9uID0gJzEuNC4wJztcblxuLyoqXG4gKiBFbnN1cmVzIG1pc2UudG9tbCBtYW5hZ2VzIHRoZSBOb2RlLmpzIGFuZCAod2hlbiBmbm94LnRvbWwgZXhpc3RzKSBmbm94IHRvb2wgdmVyc2lvbnMgd2hpbGVcbiAqIHByZXNlcnZpbmcgdGhlIEJ1biBwaW4gYW5kIHVucmVsYXRlZCBtaXNlIHNldHRpbmdzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNaXNlVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU1pc2VUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1pc2VUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ21pc2UudG9tbCcpO1xuICAgIC8vIEEgcGFyc2UgZmFpbHVyZSBtdXN0IGFib3J0IGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIHt9OiByZWdlbmVyYXRpbmcgZnJvbSBhbiBlbXB0eSBvYmplY3RcbiAgICAvLyB3b3VsZCBzaWxlbnRseSByZXBsYWNlIHRoZSB1c2VyJ3MgZXhpc3RpbmcgKGFsYmVpdCBicm9rZW4pIG1pc2UudG9tbC5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHBhcnNlTWlzZVRvbWwobWlzZVRvbWxQYXRoKTtcbiAgICBjb25zdCB0b29scyA9IHsgLi4uc2V0dGluZ3MudG9vbHMgfTtcblxuICAgIC8vIEVuc3VyZSBOb2RlLmpzIGlzIGFsd2F5cyBwaW5uZWQ6IGdlbmVyYXRlZCBob29rcyBhbmQgQ0kgcnVuIGBtaXNlIGluc3RhbGxgLCBhbmQgYW4gdW5waW5uZWRcbiAgICAvLyBOb2RlIHdvdWxkIGNvbWUgZnJvbSB3aGF0ZXZlciBoYXBwZW5zIHRvIGJlIG9uIFBBVEguXG4gICAgLy8gTGlmdC10aGVuLXBpbjogdGhlIGxpZnQgb25seSB0b3VjaGVzIGV4YWN0IHBpbnMgYW5kIHRoZSBwaW4gb25seSB0b3VjaGVzIHNlbGVjdG9ycywgc29cbiAgICAvLyBvcmRlcmluZyB0aGUgbGlmdCBmaXJzdCBhdm9pZHMgcmVzb2x2aW5nIGBtaXNlIGxhdGVzdCBub2RlQGx0c2AgdHdpY2UgZm9yIHVucGlubmVkIHJlcG9zLlxuICAgIHRvb2xzLm5vZGUgPSBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgJ25vZGUnLFxuICAgICAgbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcignbm9kZUBsdHMnLCB0b29scy5ub2RlLCBjb25maWcuZGlyUGF0aCksXG4gICAgICBjb25maWcuZGlyUGF0aFxuICAgICk7XG4gICAgLy8gQnVuIGlzIG5ldmVyIGFkZGVkIG9yIGNoYW5nZWQ6IGEgbWlzc2luZyBwaW4gc3RheXMgbWlzc2luZyAoZGV2ZWxvcGVycyBpbnN0YWxsIEJ1biBnbG9iYWxseVxuICAgIC8vIHRvIHJ1biB3YmZ5KSwgYW5kIGhhc1N1cHBvcnRlZEJ1blBpbigpIGhhcyBhbHJlYWR5IHJlamVjdGVkIGFueSBwaW4gdGhhdCBpcyBub3Qgb25lIGV4YWN0XG4gICAgLy8gc3VwcG9ydGVkIHZlcnNpb24uXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICB0b29scy5mbm94ID0gcGluQ29uY3JldGVUb29sVmVyc2lvbihcbiAgICAgICAgJ2Zub3gnLFxuICAgICAgICBsaWZ0T3V0ZGF0ZWRUb29sVmVyc2lvbldpdGhpbk1ham9yKCdmbm94JywgdG9vbHMuZm5veCwgY29uZmlnLmRpclBhdGgpLFxuICAgICAgICBjb25maWcuZGlyUGF0aFxuICAgICAgKTtcbiAgICB9XG4gICAgc2V0dGluZ3MudG9vbHMgPSB0b29scztcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gQnVuIDEuNCBwcm92aWRlcyBUT01MLnN0cmluZ2lmeSBiZWZvcmUgdGhlIGFnZS1nYXRlZCBAdHlwZXMvYnVuIHZlcnNpb24gZGVjbGFyZXMgaXQuXG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShtaXNlVG9tbFBhdGgsIEJ1bi5UT01MLnN0cmluZ2lmeShzZXR0aW5ncykpO1xuICB9KTtcbn1cblxuLyoqIFdoZXRoZXIgbWlzZS50b21sIG9taXRzIEJ1biBvciBwaW5zIGl0IHRvIG9uZSBleGFjdCB2ZXJzaW9uIHRoYXQgd2JmeSBzdXBwb3J0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNTdXBwb3J0ZWRCdW5QaW4oZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBidW5WZXJzaW9uOiB1bmtub3duO1xuICB0cnkge1xuICAgIGJ1blZlcnNpb24gPSBwYXJzZU1pc2VUb21sKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbWlzZS50b21sJykpLnRvb2xzPy5idW47XG4gIH0gY2F0Y2gge1xuICAgIC8vIExldCBnZW5lcmF0ZU1pc2VUb21sIHJlcG9ydCB0aGUgdW5yZWFkYWJsZSBvciBtYWxmb3JtZWQgZmlsZS5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIGJ1blZlcnNpb24gPT09IHVuZGVmaW5lZCB8fFxuICAgICh0eXBlb2YgYnVuVmVyc2lvbiA9PT0gJ3N0cmluZycgJiYgISFzZW12ZXIudmFsaWQoYnVuVmVyc2lvbikgJiYgc2VtdmVyLmd0ZShidW5WZXJzaW9uLCBtaW5pbXVtQnVuVmVyc2lvbikpXG4gICk7XG59XG5cbi8qKlxuICogTGlmdHMgYW4gZXhhY3QgdG9vbCBwaW4gYmVsb3cgdGhlIGxhdGVzdCByZXNvbHZhYmxlIHZlcnNpb24g4oCUIHdpdGhpbiB0aGUgU0FNRSBtYWpvciDigJQgdG8gdGhhdFxuICogdmVyc2lvbiAoTm9kZS5qcyByZXNvbHZlcyBhZ2FpbnN0IHRoZSBsYXRlc3QgTFRTKTogdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlIHN0YW5kYXJkIHRyYWNrcyB0aGVcbiAqIGN1cnJlbnQgdG9vbGNoYWluIGFjcm9zcyByZXBvc2l0b3JpZXMgYW5kIFJlbm92YXRlIGRvZXMgbm90IG1hbmFnZSBtaXNlLnRvbWwgcGlucywgc29cbiAqIHBhdGNoL21pbm9yIGRyaWZ0IChlLmcuIG5vZGUgMjQuMTYuMCB2cyAyNC4xOC4wLCBmbm94IDEuMzAuMCB2cyAxLjMxLjApIG5ldmVyIHNlbGYtaGVhbHMuIEEgcGluXG4gKiBvbiBhbiBvbGRlciBtYWpvciBpcyBhIGRlbGliZXJhdGUgY29tcGF0aWJpbGl0eSBjaG9pY2UgYW5kIGlzIGtlcHQsIGFzIGFyZSBub24tZXhhY3QgYW5kXG4gKiBub24tc3RyaW5nIGZvcm1zLiBXaGVuIG1pc2UgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgcGluIGlzIGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3Ioc2VsZWN0b3I6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCAhc2VtdmVyLnZhbGlkKHZlcnNpb24pKSByZXR1cm4gdmVyc2lvbjtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbWlzZScsIFsnbGF0ZXN0Jywgc2VsZWN0b3JdLCBjd2QpO1xuICByZXR1cm4gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pICYmXG4gICAgc2VtdmVyLm1ham9yKGxhdGVzdFZlcnNpb24pID09PSBzZW12ZXIubWFqb3IodmVyc2lvbikgJiZcbiAgICBzZW12ZXIubHQodmVyc2lvbiwgbGF0ZXN0VmVyc2lvbilcbiAgICA/IGxhdGVzdFZlcnNpb25cbiAgICA6IHZlcnNpb247XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYW4gdW5waW5uZWQgc2VsZWN0b3IgKGBsYXRlc3RgLCBhIHJhbmdlIHN1Y2ggYXMgXCIyNFwiLCBhbiBhbGlhcywgb3IgYSBtaXNzaW5nIGVudHJ5KVxuICogd2l0aCB0aGUgbmV3ZXN0IGNvbmNyZXRlIHZlcnNpb24gbWlzZSByZXNvbHZlcyBmb3IgaXQsIGJlY2F1c2UgdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlXG4gKiBzdGFuZGFyZCByZXF1aXJlcyBjb25jcmV0ZSBwaW5zOiBDSSBpbnN0YWxscyB3aGF0ZXZlciBhbiB1bnBpbm5lZCBzZWxlY3RvciByZXNvbHZlcyB0byBhdCBydW5cbiAqIHRpbWUsIHNvIGJ1aWxkcyBkcmlmdCBhY3Jvc3MgcnVucy4gRXhhY3QgdmVyc2lvbnMgYXJlIGtlcHQgYXMtaXMsIGFuZCBub24tc3RyaW5nIGZvcm1zIChtaXNlJ3NcbiAqIGFycmF5IGFuZCBgeyB2ZXJzaW9uID0gXCLigKZcIiB9YCBmb3JtcykgYXJlIHVzZXItbWFuYWdlZCBhbmQgbGVmdCB1bnRvdWNoZWQuIFdoZW4gbWlzZSBpc1xuICogdW5hdmFpbGFibGUgb3IgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgaXMga2VwdCDigJRcbiAqIGFuIHVucGlubmVkIHRvb2wgaXMgYmV0dGVyIHRoYW4gYSBicm9rZW4gY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcGluQ29uY3JldGVUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCBzZW12ZXIudmFsaWQodmVyc2lvbikpKSByZXR1cm4gdmVyc2lvbjtcbiAgLy8gTm9ybWFsaXplIHNlbGVjdG9yIGZvcm1zIGBtaXNlIGxhdGVzdGAgY2Fubm90IHJlc29sdmUgZXZlbiB0aG91Z2ggbWlzZSBjb25maWd1cmF0aW9uIGFjY2VwdHNcbiAgLy8gdGhlbTogYHByZWZpeDoyNGAgaXMgcmVqZWN0ZWQgb3V0cmlnaHQgd2hpbGUgYDI0YCByZXNvbHZlcywgYW5kIGBsdHMvKmAgeWllbGRzIGVtcHR5IG91dHB1dFxuICAvLyB3aGlsZSBgbHRzYCByZXNvbHZlcy4gTW9kaWZpZXIgc2VsZWN0b3JzIHN1Y2ggYXMgYHN1Yi0yOmx0c2Agc3RheSB1bnJlc29sdmFibGUgYW5kIGZhbGwgYmFja1xuICAvLyB0byB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgYmVsb3cuXG4gIGNvbnN0IHJhbmdlID0gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnID8gdmVyc2lvbi5yZXBsYWNlKC9ecHJlZml4Oi91LCAnJykucmVwbGFjZSgvXFwvXFwqJC91LCAnJykgOiB1bmRlZmluZWQ7XG4gIC8vIFdpdGggbm8gbWVhbmluZ2Z1bCBzZWxlY3RvciwgTm9kZS5qcyBwaW5zIHRvIHRoZSBsYXRlc3QgTFRTIChtYXRjaGluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzJ1xuICAvLyBgbHRzLypgIGZhbGxiYWNrKSByYXRoZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UuXG4gIGNvbnN0IGRlZmF1bHRTZWxlY3RvciA9IHRvb2wgPT09ICdub2RlJyA/ICdub2RlQGx0cycgOiB0b29sO1xuICBjb25zdCBzZWxlY3RvciA9IHJhbmdlICYmIHJhbmdlICE9PSAnbGF0ZXN0JyA/IGAke3Rvb2x9QCR7cmFuZ2V9YCA6IGRlZmF1bHRTZWxlY3RvcjtcbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSA/IHJlc29sdmVkVmVyc2lvbiA6ICh2ZXJzaW9uID8/ICdsYXRlc3QnKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNaXNlVG9tbChtaXNlVG9tbFBhdGg6IHN0cmluZyk6IE1pc2VUb21sIHtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKG1pc2VUb21sUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPbmx5IGEgcmVwb3NpdG9yeSB3aXRob3V0IG1pc2UudG9tbCBzdGFydHMgZnJvbSBhbiBlbXB0eSBjb25maWd1cmF0aW9uOyBhbiB1bnJlYWRhYmxlIGZpbGVcbiAgICAvLyAoZS5nLiBwZXJtaXNzaW9ucykgbXVzdCBhYm9ydCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggZ2VuZXJhdGVkIHNldHRpbmdzLlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIHt9O1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBNaXNlVG9tbDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZywgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVBhY2thZ2VzLmpzJztcblxuLyoqXG4gKiBCdW4gcmVhZHMgcmVnaXN0cnkgc2NvcGUgbWFwcGluZ3MgZnJvbSBhIHBoeXNpY2FsIHJlcG9zaXRvcnkgLm5wbXJjIGR1cmluZyBSZW5vdmF0ZSBhcnRpZmFjdFxuICogdXBkYXRlczsgUmVub3ZhdGUncyBucG1yYyBzZXR0aW5nIGlzIHVzZWQgb25seSBieSBpdHMgZGF0YXNvdXJjZSBsYXllci4gS2VlcCB0aGUgbm9uLXNlY3JldFxuICogbWFwcGluZyBpbiByZXBvc2l0b3JpZXMgdGhhdCByZXNvbHZlIHByaXZhdGUgcGFja2FnZXMsIHdoaWxlIGF1dGhlbnRpY2F0aW9uIHJlbWFpbnMgaW4gdGhlXG4gKiBkZXZlbG9wZXIncyB+Ly5ucG1yYyBsb2NhbGx5IGFuZCBpbiB0ZW1wb3JhcnkgQ0kgb3IgTWVuZCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9BdXRob3IgPSBjb25maWdzWzBdPy5yZXBvQXV0aG9yO1xuICBpZiAocmVwb0F1dGhvciAhPT0gJ1dpbGxCb29zdGVyJyAmJiByZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgY29uc3QgbnBtcmNQYXRocyA9IG5ldyBTZXQoY29uZmlncy5tYXAoKGNvbmZpZykgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm5wbXJjJykpKTtcbiAgY29uc3Qgcm9vdENvbmZpZyA9IGNvbmZpZ3MuZmluZCgoY29uZmlnKSA9PiBjb25maWcuaXNSb290KTtcbiAgaWYgKHJvb3RDb25maWcgJiYgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKHJvb3RDb25maWcpKSB7XG4gICAgY29uc3Qgcm9vdE5wbXJjUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcubnBtcmMnKTtcbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHJvb3ROcG1yY1BhdGgsIHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZyk7XG4gICAgbnBtcmNQYXRocy5kZWxldGUocm9vdE5wbXJjUGF0aCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBucG1yY1BhdGhzKSBhd2FpdCByZW1vdmVOcG1yYyhucG1yY1BhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVOcG1yYyhucG1yY1BhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChucG1yY1BhdGgpLmNhdGNoKCgpID0+IHt9KSkpIHJldHVybjtcbiAgaWYgKGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChucG1yY1BhdGgpKSB7XG4gICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIG5vbi1jYW5vbmljYWwgcmVwb3NpdG9yeSBucG1yYyAke25wbXJjUGF0aH0uYCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0OiAnYnJhbmNoJztcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnO1xuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGluY2x1ZGU6IHN0cmluZ1tdO1xuICAgICAgZXhjbHVkZTogc3RyaW5nW107XG4gICAgfTtcbiAgfTtcbiAgcnVsZXM6IChcbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2RlbGV0aW9uJyB8ICdub25fZmFzdF9mb3J3YXJkJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBib29sZWFuO1xuICAgICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiB7XG4gICAgICAgICAgICBjb250ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogbnVtYmVyO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiBudW1iZXI7XG4gICAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXTtcbiAgICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogYm9vbGVhbjtcbiAgICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ107XG4gICAgICAgIH07XG4gICAgICB9XG4gIClbXTtcbiAgYnlwYXNzX2FjdG9yczoge1xuICAgIGFjdG9yX2lkOiBudW1iZXI7XG4gICAgYWN0b3JfdHlwZTogJ1RlYW0nO1xuICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JztcbiAgfVtdO1xufVxuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNvdXJjZV90eXBlPzogc3RyaW5nO1xufVxuXG5jb25zdCBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSID0ge1xuICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCA9IDE1XzM2ODtcblxuY29uc3QgUFJPVEVDVF9NQUlOX1JVTEVTRVQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCA9IHtcbiAgbmFtZTogJ1Byb3RlY3QgbWFpbicsXG4gIHRhcmdldDogJ2JyYW5jaCcsXG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJyxcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBleGNsdWRlOiBbXSxcbiAgICAgIGluY2x1ZGU6IFsnfkRFRkFVTFRfQlJBTkNIJ10sXG4gICAgfSxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZGVsZXRpb24nLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGZhbHNlLFxuICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAndGVzdCAvIHRlc3QnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3NlbWFudGljLXByIC8gc2VtYW50aWMtcHInLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ25vbl9mYXN0X2ZvcndhcmQnLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IDAsXG4gICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXSxcbiAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBmYWxzZSxcbiAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBieXBhc3NfYWN0b3JzOiBbXG4gICAge1xuICAgICAgYWN0b3JfaWQ6IDE3Xzc3N180OTUsXG4gICAgICBhY3Rvcl90eXBlOiAnVGVhbScsXG4gICAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgfSxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicpIHJldHVybjtcbiAgICAvLyBUaGUgcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gaG9zdHMgd29ya2Zsb3dfY2FsbCBkZWZpbml0aW9ucywgc28gdGhlXG4gICAgLy8gUHJvdGVjdCBtYWluIHJ1bGVzZXQgd291bGQgcmVxdWlyZSB0ZXN0L3NlbWFudGljLXByIGNoZWNrcyB0aGF0IG5ldmVyIHJ1biB0aGVyZS5cbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8oY29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIFJlcG9zaXRvcnkgcnVsZXNldHMgcmVxdWlyZSBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB3aGljaCBsb2NhbCBydW5zXG4gICAgICAvLyBtYXkgbm90IGhhdmUgZXZlbiB3aGVuIGZpbGUtZ2VuZXJhdGlvbiBhbmQgcHVzaGVzIGFyZSBhbGxvd2VkLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgY29uc3QgcnVsZXNldCA9IHN0cnVjdHVyZWRDbG9uZShQUk9URUNUX01BSU5fUlVMRVNFVCk7XG4gIGlmIChjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlc2V0LnJ1bGVzKSB7XG4gICAgICBpZiAocnVsZS50eXBlICE9PSAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIGNvbnRleHQgaXMgYDxjYWxsZXIgam9iIGlkPiAvIDxyZXVzYWJsZSBqb2IgaWQ+YCBvZiB0aGUgd2JmeS1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbC5cbiAgICAgIHJ1bGUucGFyYW1ldGVycy5yZXF1aXJlZF9zdGF0dXNfY2hlY2tzLnB1c2goe1xuICAgICAgICBjb250ZXh0OiAndGVzdC1ydXN0IC8gdGVzdC1ydXN0JyxcbiAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydWxlc2V0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0ID0gYXdhaXQgZmluZFJlcG9zaXRvcnlSdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBydWxlc2V0Lm5hbWUpO1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXRJZCA9IGV4aXN0aW5nUnVsZXNldD8uaWQ7XG5cbiAgYXdhaXQgd2l0aFJldHJ5KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChleGlzdGluZ1J1bGVzZXRJZCkge1xuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgcnVsZXNldF9pZDogZXhpc3RpbmdSdWxlc2V0SWQsXG4gICAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5UnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdpdGhSZXRyeShcbiAgICAoKSA9PlxuICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgaW5jbHVkZXNfcGFyZW50czogZmFsc2UsXG4gICAgICAgIHRhcmdldHM6ICdicmFuY2gnLFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSksXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG4gIGNvbnN0IHJ1bGVzZXRzID0gcmVzcG9uc2UuZGF0YTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVzZXRzKSkgcmV0dXJuO1xuICByZXR1cm4gcnVsZXNldHMuZmluZCgocnVsZXNldCkgPT4gcnVsZXNldC5uYW1lID09PSBydWxlc2V0TmFtZSAmJiBydWxlc2V0LnNvdXJjZV90eXBlID09PSAnUmVwb3NpdG9yeScpO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4sIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwR2l0SHViU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIExvY2FsIHdiZnkgcnVucyBvZnRlbiBoYXZlIHB1c2ggcGVybWlzc2lvbiB3aXRob3V0IGFkbWluIHBlcm1pc3Npb24uXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBHaXRIdWJTZXR0aW5ncyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlclJlcG8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZShuZXdDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBjb250ZW50KSA+IGNvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJDb21tYW5kID0gJ2J1biBydW4nO1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZUFsbChwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyLCBwYWNrYWdlTWFuYWdlckNvbW1hbmQpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgKD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpYDtcbmNvbnN0IGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMgPSBbXG4gIG5ldyBSZWdFeHAoYF4ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoYF5naXRodWI6JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP2h0dHBzOi8vZ2l0aHViXFxcXC5jb20vJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9zc2g6Ly9naXRAZ2l0aHViXFxcXC5jb21bOi9dJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChgXig/OmdpdFxcXFwrKT9naXRAZ2l0aHViXFxcXC5jb206JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCwgJ3UnKSxcbl07XG5cbmludGVyZmFjZSBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZSB7XG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgc2VjdGlvbk5hbWU6ICh0eXBlb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKVtudW1iZXJdO1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiB2b2lkIHtcbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXMgPSBjb25maWdzLmZsYXRNYXAoZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKTtcbiAgaWYgKGRpc2FsbG93ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBkaXNhbGxvd2VkU291cmNlc1xuICAgIC5tYXAoXG4gICAgICAoeyBkZXBlbmRlbmN5TmFtZSwgZGlyUGF0aCwgc2VjdGlvbk5hbWUsIHNwZWNpZmllciB9KSA9PlxuICAgICAgICBgLSAke3BhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyl9OiAke3NlY3Rpb25OYW1lfS4ke2RlcGVuZGVuY3lOYW1lfSB1c2VzICR7c3BlY2lmaWVyfWBcbiAgICApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzYWxsb3dlZCBHaXQgZGVwZW5kZW5jeSBzb3VyY2VzIGZvdW5kLlxcbk9ubHkgV2lsbEJvb3N0ZXIgYW5kIFdpbGxCb29zdGVyTGFiIEdpdEh1YiBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQuXFxuJHtkZXRhaWxzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHBhY2thZ2VKc29uW3NlY3Rpb25OYW1lXTtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHNwZWNpZmllcl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG5cbiAgICAgIGRpc2FsbG93ZWRTb3VyY2VzLnB1c2goe1xuICAgICAgICBkZXBlbmRlbmN5TmFtZSxcbiAgICAgICAgZGlyUGF0aDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIHNlY3Rpb25OYW1lLFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc2FsbG93ZWRTb3VyY2VzO1xufVxuXG5mdW5jdGlvbiBpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpiaXRidWNrZXR8Z2lzdHxnaXRodWJ8Z2l0bGFiKTovdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXmh0dHBzPzpcXC9cXC8oPzpiaXRidWNrZXRcXC5vcmd8Z2l0aHViXFwuY29tfGdpdGxhYlxcLmNvbSlcXC8vdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXig/Omh0dHBzP3xzc2gpOlxcL1xcL1xcUytcXC5naXQoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eW15AXFxzXStAW146XFxzXSs6XFxTKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdDonKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQrJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnc3NoOi8vZ2l0QCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlthLXpBLVowLTldW1xcdy4tXSpcXC9bXFx3Li1dKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzcGVjaWZpZXIpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yLCBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeENoYWtyYVRvYXN0ZXIgfSBmcm9tICcuL2ZpeGVycy9jaGFrcmFUb2FzdGVyLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sLCByZWFkQnVuR2xvYmFsU3RvcmUsIHJlc29sdmVCdW5HbG9iYWxTdG9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUZub3hUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMsIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24sIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFJhaWx3YXlpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSwgcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGVuc3VyZVdiRW52RGVmaW5pdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvd2JFbnYuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3NlbGZDb250YWluZWRXb3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNaXNlVG9tbCwgaGFzU3VwcG9ydGVkQnVuUGluLCBtaW5pbXVtQnVuVmVyc2lvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9taXNlVG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9ucG1yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIH0gZnJvbSAnLi9naXRodWIvcnVsZXNldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVR5cGVTY3JpcHRBcGkgfSBmcm9tICcuL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgZ2V0V2JmeVZlcnNpb24sIGdldFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMgfSBmcm9tICcuL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgb25seSB0aGUgZ2xvYmFsIHJlbGVhc2UtYWdlIGdhdGUsIHdpdGhvdXQgdG91Y2hpbmcgYW55IHJlcG9zaXRvcnkuIFNwZWxsZWQgb3V0IGluIGZ1bGxcbiAqIHJhdGhlciB0aGFuIHNob3J0ZW5lZCAoZS5nLiBgZ2F0ZWApIGJlY2F1c2UgdGhlIGRlZmF1bHQgY29tbWFuZCB0YWtlcyBwb3NpdGlvbmFsIHBhdGhzOiBhIHNob3J0XG4gKiBuYW1lIHdvdWxkIHN3YWxsb3cgYSBkaXJlY3RvcnkgdGhhdCBoYXBwZW5zIHRvIHNoYXJlIGl0LlxuICovXG5jb25zdCBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCA9ICdhcHBseS1yZWxlYXNlLWFnZS1nYXRlJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZChcbiAgICAgIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLFxuICAgICAgXCJBcHBseSBvbmx5IHRoZSBvcmdhbml6YXRpb24ncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGlzIG1hY2hpbmUncyBnbG9iYWwgcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3NcIlxuICAgIClcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZm9yY2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdBcHBseSB3YmZ5IGV2ZW4gd2hlbiB0aGUgcmVwb3NpdG9yeSBhbHJlYWR5IHJlY29yZHMgdGhpcyB3YmZ5IHZlcnNpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2YnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdTa2lwIGFkZGluZyBtYW5hZ2VkIGRlcGVuZGVuY2llcyBhbmQgdGhlIGxpbmtlciBwcm9iZSAodGhlIGZpbmFsIGBidW4gaW5zdGFsbGAgcmVmcmVzaGluZyB0aGUgbG9ja2ZpbGUgc3RpbGwgcnVucyknLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRXYmZ5VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcblxuICAvLyBEZWxpYmVyYXRlbHkgYmVmb3JlIHRoZSBCdW4gY2hlY2sgaW4gd2lsbGJvb3N0ZXJpZnlQYXRocygpOiB0aGUgZ2F0ZSBtdXN0IGJlIGFwcGxpYWJsZSBvbiBhXG4gIC8vIG1hY2hpbmUgd2hvc2UgQnVuIGlzIG91dGRhdGVkLCB3aGljaCBpcyBleGFjdGx5IGEgbWFjaGluZSB0aGF0IHN0aWxsIG5lZWRzIGdhdGluZy5cbiAgaWYgKGFyZ3YuX1swXSA9PT0gYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQpIHtcbiAgICBpZiAoIWVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpKSBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGF3YWl0IHdpbGxib29zdGVyaWZ5UGF0aHMoYXJndi5wYXRocyBhcyBzdHJpbmdbXSwgYXJndi5za2lwRGVwcywgYXJndi5mb3JjZSk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgY29tcGlsZXIgc2VydmVyIHNwYXduZWQgZm9yIEFTVCBwYXJzaW5nIGtlZXBzIGFuIG9wZW4gSVBDXG4gICAgLy8gY2hhbm5lbCB0aGF0IHdvdWxkIG90aGVyd2lzZSBwcmV2ZW50IHRoZSBOb2RlLmpzIHByb2Nlc3MgZnJvbSBleGl0aW5nLlxuICAgIGF3YWl0IGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk7XG4gIH1cbiAgaWYgKGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnKSB7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd2lsbGJvb3N0ZXJpZnlQYXRocyhwYXRoczogc3RyaW5nW10sIHNraXBEZXBzOiBib29sZWFuLCBmb3JjZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBCZWZvcmUgYW55dGhpbmcgZWxzZSDigJQgZXZlbiB0aGUgQnVuIGNoZWNrIGJlbG93OiB0aGUgZGV2ZWxvcGVyIG1hY2hpbmUncyBnbG9iYWxcbiAgLy8gcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MgbXVzdCByZWNlaXZlIHRoZSBvcmcncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSBvbiBFVkVSWSBydW4sXG4gIC8vIGJlY2F1c2UgdGhleSBhcmUgd2hhdCBndWFyZHMgYnJhbmQtbmV3IGxvY2FsIHByb2plY3RzIHRoYXQgaGF2ZSBubyB3YmZ5LWdlbmVyYXRlZCByZXBvc2l0b3J5XG4gIC8vIGNvbmZpZyB5ZXQsIGFuZCB0aGF0IHByb3RlY3Rpb24gbXVzdCB3b3JrIGJlZm9yZSB0aGUgc3VwcG9ydGVkLXZlcnNpb24gY2hlY2suXG4gIGVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpO1xuXG4gIC8vIHdiZnkgbWFuYWdlcyByZXBvc2l0b3JpZXMgdGhyb3VnaCBCdW4gKyBtaXNlIGFuZCB1c2VzIEJ1biAxLjQgcnVudGltZSBBUElzLiBUaGUgdmVyc2lvbiBmbG9vclxuICAvLyBhbHNvIGVuc3VyZXMgdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBvcHRpb25zIHByb2R1Y2UgdGhlIGluc3RhbGwgbGF5b3V0IHdiZnkgdmFsaWRhdGVzLiBJdFxuICAvLyBzdGF5cyB1bmNvbmRpdGlvbmFsIGV2ZW4gdGhvdWdoIHRoZSBhbHJlYWR5LWFwcGxpZWQgY2hlY2sgYmVsb3cgY2FuIG1ha2UgYSBydW4gYSBuby1vcDogYW5cbiAgLy8gb3V0ZGF0ZWQgQnVuIGlzIGEgYnJva2VuIGVudmlyb25tZW50IHdiZnkgbXVzdCByZXBvcnQsIGFuZCBoaWRpbmcgaXQgd2hlbmV2ZXIgZXZlcnkgcGF0aFxuICAvLyBoYXBwZW5zIHRvIGJlIHNraXBwZWQgd291bGQgc3VyZmFjZSBpdCBvbmx5IGxhdGVyLlxuICBjb25zdCBidW5WZXJzaW9uID0gQnVuLnZlcnNpb247XG4gIGlmIChCdW4uc2VtdmVyLm9yZGVyKGJ1blZlcnNpb24sIG1pbmltdW1CdW5WZXJzaW9uKSA8IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGB3YmZ5IHJlcXVpcmVzIEJ1biA+PSAke21pbmltdW1CdW5WZXJzaW9ufSAoZm91bmQgJHtidW5WZXJzaW9ufSkuIFVwZ3JhZGUgQnVuIGFuZCByZS1ydW4uYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBBIGAtZGlydHktbG9jYWxgIGxhYmVsIGlkZW50aWZpZXMgYW4gZWRpdGVkIGNoZWNrb3V0LCB3aG9zZSBuZXh0IGJ1aWxkIHByb2R1Y2VzIGRpZmZlcmVudCBmaWxlc1xuICAvLyB1bmRlciB0aGUgc2FtZSBsYWJlbCwgc28gc3VjaCBhIHJ1biBpcyBuZXZlciB0cmVhdGVkIGFzIGFscmVhZHkgYXBwbGllZC5cbiAgY29uc3QgdmVyc2lvbkxhYmVsID0gZ2V0V2JmeVZlcnNpb25MYWJlbCgpO1xuICBjb25zdCBza2lwcGFibGVWZXJzaW9uTGFiZWwgPVxuICAgICFmb3JjZSAmJiB2ZXJzaW9uTGFiZWwgJiYgIXZlcnNpb25MYWJlbC5lbmRzV2l0aCgnLWRpcnR5LWxvY2FsJykgPyB2ZXJzaW9uTGFiZWwgOiB1bmRlZmluZWQ7XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIGZvciAoY29uc3QgaW5wdXREaXJQYXRoIG9mIHBhdGhzKSB7XG4gICAgLy8gTm9ybWFsaXplIG9uY2UgYXQgdGhlIENMSSBib3VuZGFyeS4gR2VuZXJhdG9ycyB1c2UgZGlyUGF0aCBmb3IgY3dkIGFuZCBiYXNlbmFtZSBkZWNpc2lvbnM7XG4gICAgLy8gbGVhdmluZyB0aGUgc3VwcG9ydGVkIGRlZmF1bHQgYC5gIHVucmVzb2x2ZWQgd291bGQgZ2VuZXJhdGUgYW4gaW52YWxpZCBwYWNrYWdlIG5hbWUgb2YgYC5gLlxuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGlucHV0RGlyUGF0aCk7XG4gICAgLy8gQ29uZmluZSBldmVyeSBnZW5lcmF0ZWQgZmlsZSB0byB0aGlzIHJlcG9zaXRvcnkgKHNlZSBmc1V0aWwuZ2VuZXJhdGVGaWxlKS4gU2V0IEJFRk9SRSBhbnlcbiAgICAvLyBmaXhlciB3cml0ZXMsIGFuZCByZXNldCBvbiBldmVyeSBpdGVyYXRpb24gc28gYSBtdWx0aS1wYXRoIHJ1biBuZXZlciBrZWVwcyB0aGUgcHJldmlvdXMgcm9vdC5cbiAgICBmc1V0aWwuc2V0Um9vdERpclBhdGgoZnMuZXhpc3RzU3luYyhyb290RGlyUGF0aCkgPyByb290RGlyUGF0aCA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBBIHJlcG9zaXRvcnkgcHJlY29uZGl0aW9uLCBjaGVja2VkIGJlZm9yZSB0aGUgYWxyZWFkeS1hcHBsaWVkIHNraXAgYmVsb3cgYW5kIGJlZm9yZSBhbnkgZmlsZVxuICAgIC8vIGlzIHdyaXR0ZW46IGFuIHVuc3VwcG9ydGVkIHBpbiBtdXN0IGJlIHJlcG9ydGVkIG9uIGV2ZXJ5IHJ1biBhbmQgbXVzdCBub3Qgc3RhbXAgdGhlIGJhZGdlLlxuICAgIGlmICghaGFzU3VwcG9ydGVkQnVuUGluKHJvb3REaXJQYXRoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFNraXAgJHtyb290RGlyUGF0aH06IG1pc2UudG9tbCBtdXN0IHBpbiBCdW4gdG8gb25lIGV4YWN0IHZlcnNpb24gPj0gJHttaW5pbXVtQnVuVmVyc2lvbn0gb3Igb21pdCBpdC4gVXBkYXRlIHRoZSBwaW4gYW5kIHJlLXJ1bi5gXG4gICAgICApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gVGhlIGJhZGdlIHJlY29yZHMgdGhlIGJ1aWxkIHRoYXQgZ2VuZXJhdGVkIHRoZSByZXBvc2l0b3J5J3MgY29uZmlndXJhdGlvbiwgc28gdGhlIHNhbWUgYnVpbGRcbiAgICAvLyB3b3VsZCBvbmx5IHJld3JpdGUgd2hhdCBpcyBhbHJlYWR5IHRoZXJlLiBTa2lwcGluZyBpcyBhIGRlbGliZXJhdGUgdHJhZGU6IHRoZSBwYXJ0cyBvZiBhIHJ1blxuICAgIC8vIHRoYXQgZGVwZW5kIG9uIHN0YXRlIE9VVFNJREUgdGhlIHJlcG9zaXRvcnkgKEdpdEh1YiBzZXR0aW5ncywgZGVwZW5kZW5jeSB1cGRhdGVzLCB0aGUgZmV0Y2hlZFxuICAgIC8vIC5naXRpZ25vcmUpIGRvIGdldCBza2lwcGVkIHRvbywgd2hpY2ggaXMgd2hhdCAtLWZvcmNlIGlzIGZvci5cbiAgICBpZiAoc2tpcHBhYmxlVmVyc2lvbkxhYmVsICYmIChhd2FpdCByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwocm9vdERpclBhdGgpKSA9PT0gc2tpcHBhYmxlVmVyc2lvbkxhYmVsKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgJHtyb290RGlyUGF0aH06IHdiZnkgJHtza2lwcGFibGVWZXJzaW9uTGFiZWx9IGlzIGFscmVhZHkgYXBwbGllZC4gUGFzcyAtLWZvcmNlIHRvIHJlLWFwcGx5LmApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBwYWNrYWdlc1N1YkRpclBhdGhzID0gZGlyZW50c1xuICAgICAgLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKVxuICAgICAgLm1hcCgoZCkgPT4gcGF0aC5yZXNvbHZlKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG4gICAgLy8gQWxzbyBjb3ZlciB3b3Jrc3BhY2VzIGRlY2xhcmVkIG91dHNpZGUgcGFja2FnZXMvKiAoZS5nLiBhcHBzLyopOiB0aGV5IHJlY2VpdmUgdGhlIHNhbWVcbiAgICAvLyBtYW5hZ2VkIGNvbmZpZ3MgKHRzY29uZmlnLmpzb24sIHBhY2thZ2UuanNvbiBjb252ZW50aW9ucywg4oCmKSBhcyBwYWNrYWdlcy8qIGNoaWxkcmVuLlxuICAgIGNvbnN0IHJvb3RQYWNrYWdlSnNvbiA9XG4gICAgICBpZ25vcmVFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUNvbmZpZ1sncGFja2FnZUpzb24nXVxuICAgICAgKSA/PyB7fTtcbiAgICBjb25zdCB3b3Jrc3BhY2VTdWJEaXJQYXRocyA9IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHtcbiAgICAgIGRpclBhdGg6IHJvb3REaXJQYXRoLFxuICAgICAgcGFja2FnZUpzb246IHJvb3RQYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBwYWNrYWdlc1N1YkRpclBhdGhzLnNvbWUoKHN1YkRpclBhdGgpID0+XG4gICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHN1YkRpclBhdGgsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgICksXG4gICAgfSk7XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBbLi4ubmV3IFNldChbLi4ucGFja2FnZXNTdWJEaXJQYXRocywgLi4ud29ya3NwYWNlU3ViRGlyUGF0aHNdKV0uZmlsdGVyKFxuICAgICAgKHN1YkRpclBhdGgpID0+IHN1YkRpclBhdGggIT09IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aClcbiAgICApO1xuXG4gICAgLy8gUmVmdXNlZCB3cml0ZXMgb24gY29yZSBtYW5hZ2VkIGZpbGVzIHdvdWxkIGxlYXZlIHRoZSByZXBvc2l0b3J5IHBhcnRpYWxseSB1cGRhdGVkLCBzbyBza2lwXG4gICAgLy8gaXQgQkVGT1JFIGFueSBtdXRhdGlvbiB3aGVuIG9uZSBvZiB0aGVtIGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICAgIGNvbnN0IG1hbmFnZWRGaWxlUGF0aHMgPSBbXG4gICAgICAuLi5bJy5naXRhdHRyaWJ1dGVzJywgJ2J1bmZpZy50b21sJywgJ2xlZnRob29rLnltbCcsICdwYWNrYWdlLmpzb24nLCAndHNjb25maWcuanNvbiddLm1hcCgobmFtZSkgPT5cbiAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCBuYW1lKVxuICAgICAgKSxcbiAgICAgIC4uLnN1YkRpclBhdGhzLmZsYXRNYXAoKHN1YkRpclBhdGgpID0+XG4gICAgICAgIFsncGFja2FnZS5qc29uJywgJ3RzY29uZmlnLmpzb24nXS5tYXAoKG5hbWUpID0+IHBhdGgucmVzb2x2ZShzdWJEaXJQYXRoLCBuYW1lKSlcbiAgICAgICksXG4gICAgXTtcbiAgICBjb25zdCB3cml0YWJsZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hbmFnZWRGaWxlUGF0aHMubWFwKChmaWxlUGF0aCkgPT4gZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKVxuICAgICk7XG4gICAgaWYgKHdyaXRhYmxlUmVzdWx0cy5pbmNsdWRlcyhmYWxzZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06IGEgbWFuYWdlZCBjb25maWcgZmlsZSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZsaWdodEVycm9ycyA9IFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdLmZsYXRNYXAoKGRpclBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VDb25maWdbJ3BhY2thZ2VKc29uJ107XG4gICAgICAgIGNvbnN0IGVycm9yID0gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcih7IHBhY2thZ2VKc29uIH0pO1xuICAgICAgICByZXR1cm4gZXJyb3IgPyBbYCR7ZGlyUGF0aH06ICR7ZXJyb3J9YF0gOiBbXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW2Ake3BhY2thZ2VKc29uUGF0aH0gaXMgaW52YWxpZGBdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChwcmVmbGlnaHRFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTpcXG4ke3ByZWZsaWdodEVycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIExldCBnZXRQYWNrYWdlQ29uZmlnIGRlcml2ZSBpc1Jvb3QgZm9yIHRoZSBlbnRyeSBwYXRoOiBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gIGlzIGFcbiAgICAvLyBzdXBwb3J0ZWQgaW52b2NhdGlvbiB3aG9zZSB0YXJnZXQgbXVzdCBrZWVwIGl0cyBjaGlsZCBjbGFzc2lmaWNhdGlvbiwgc28gZm9yY2luZ1xuICAgIC8vIGBpc1Jvb3Q6IHRydWVgIGhlcmUgd291bGQgYXBwbHkgcm9vdC1vbmx5IHByb2Nlc3NpbmcgKGxlZnRob29rIGluc3RhbGwsIHJvb3QgdHNjb25maWcsXG4gICAgLy8gQUdFTlRTLm1kLCDigKYpIHRvIGEgc3VicGFja2FnZS5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBFdmVyeSBkaXNjb3ZlcmVkIHdvcmtzcGFjZSAoaW5jbHVkaW5nIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyopIGlzIGEgY2hpbGRcbiAgICAvLyBwYWNrYWdlOyB0aGUgcGFja2FnZXMvKiBoZXVyaXN0aWMgaW5zaWRlIGdldFBhY2thZ2VDb25maWcgd291bGQgbWlzY2xhc3NpZnkgYXBwcy8qIGFzIHJvb3RzLlxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCB7IGlzUm9vdDogZmFsc2UgfSkpXG4gICAgKTtcbiAgICBjb25zdCBpbnZhbGlkU3ViUGFja2FnZURpclBhdGggPSBzdWJEaXJQYXRocy5maW5kKFxuICAgICAgKHN1YkRpclBhdGgsIGluZGV4KSA9PiAhbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlnc1tpbmRleF0gJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKVxuICAgICk7XG4gICAgaWYgKGludmFsaWRTdWJQYWNrYWdlRGlyUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTogJHtpbnZhbGlkU3ViUGFja2FnZURpclBhdGh9L3BhY2thZ2UuanNvbiBpcyBpbnZhbGlkLmApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcbiAgICAvLyBUaGUgbWFuYWdlZCBpZ25vcmUgcnVsZSBpcyB1bmFuY2hvcmVkLCBzbyBhIG5lc3RlZCBjb3B5IChlLmcuIHdvcmtlcnMvYXBpLy5lbnYuY2xvdWRmbGFyZSkgaXNcbiAgICAvLyBhcyBtdWNoIGEgbGVhayBhcyBhIHJvb3Qgb25lOyB0aGUgd2lsZGNhcmQgcGF0aHNwZWMgY292ZXJzIGV2ZXJ5IGRlcHRoIGluIG9uZSBxdWVyeS5cbiAgICBjb25zdCB0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzID0gYWxsUGFja2FnZUNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuaXNDbG91ZGZsYXJlKVxuICAgICAgPyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgICAgICAgJ2dpdCcsXG4gICAgICAgICAgWyctYycsICdjb3JlLnF1b3RlUGF0aD1mYWxzZScsICdscy1maWxlcycsICctLScsICcuZW52LmNsb3VkZmxhcmUnLCAnKi8uZW52LmNsb3VkZmxhcmUnXSxcbiAgICAgICAgICByb290Q29uZmlnLmRpclBhdGhcbiAgICAgICAgKVxuICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKSlcbiAgICAgIDogW107XG4gICAgaWYgKHRyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFNFQ1VSSVRZIEVSUk9SOiBDbG91ZGZsYXJlIGNyZWRlbnRpYWxzIG11c3QgYmUgdW50cmFja2VkLiBSZW1vdmUgJHt0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzLmpvaW4oXG4gICAgICAgICAgJywgJ1xuICAgICAgICApfSBmcm9tIEdpdCwgcHVyZ2UgdGhlIHRva2VuIGZyb20gaGlzdG9yeSwgYW5kIHJvdGF0ZSBDTE9VREZMQVJFX0FQSV9UT0tFTiBiZWZvcmUgcmVydW5uaW5nIHdiZnkuYFxuICAgICAgKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBhd2FpdCBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyhhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMoYWxsUGFja2FnZUNvbmZpZ3MpO1xuICAgIC8vIE1hbmFnZWQgcmVwb3NpdG9yaWVzIHVzZSBCdW4gd2l0aCBtaXNlIChhbmQgb3B0aW9uYWxseSBmbm94KS5cbiAgICBjb25zdCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlID0gcmVhZEJ1bkdsb2JhbFN0b3JlKHJvb3REaXJQYXRoKTtcbiAgICAvLyBSb290LWxldmVsIGluc3RhbGwgbGF5b3V0IG11c3QgY292ZXIgd29ya3NwYWNlIGFwcHMgdG9vOiBOZXh0LmpzIGNvbW1vbmx5IGxpdmVzIHVuZGVyXG4gICAgLy8gcGFja2FnZXMvKiBvciBhcHBzLyogd2hpbGUgYnVuZmlnLnRvbWwgZXhpc3RzIG9ubHkgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgICBjb25zdCB1c2VHbG9iYWxTdG9yZSA9IHJlc29sdmVCdW5HbG9iYWxTdG9yZShhbGxQYWNrYWdlQ29uZmlncywgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSwgc2tpcERlcHMpO1xuICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnLCB1c2VHbG9iYWxTdG9yZSk7XG4gICAgYXdhaXQgZ2VuZXJhdGVNaXNlVG9tbChyb290Q29uZmlnKTtcbiAgICBhd2FpdCBnZW5lcmF0ZUZub3hUb21sKHJvb3RDb25maWcpO1xuICAgIC8vIFJ1biBhZnRlciBnZW5lcmF0ZUZub3hUb21sIHNvIGl0cyB0cmFuc2FjdGlvbmFsIHJlY2lwaWVudCBzeW5jIGNhbm5vdCByZXN0b3JlIGEgc25hcHNob3RcbiAgICAvLyBvdmVyIGRlZmluaXRpb25zIGluc2VydGVkIGhlcmUuXG4gICAgYXdhaXQgZW5zdXJlV2JFbnZEZWZpbml0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgLy8gcHJvbWlzZVBvb2wucnVuIHJlc29sdmVzIHdoZW4gYSB0YXNrIFNUQVJUUywgc28gdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBpcyBub3RcbiAgICAvLyBndWFyYW50ZWVkIHRvIGJlIG9uIGRpc2sgeWV0OyB0aGUgcHJvYmUgYmVsb3cgbXVzdCBub3QgdmFsaWRhdGUgYSBzdGFsZSBjb25maWd1cmF0aW9uLlxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIC8vIFRoZSBsYXlvdXQgbXVzdCBiZSB2ZXJpZmllZCBpbnN0YWxsYWJsZSBCRUZPUkUgYW55IGBidW4gYWRkYCBtdXRhdGVzIHBhY2thZ2UuanNvbiBmaWxlczpcbiAgICAvLyBwZXItcGFja2FnZSBpbnN0YWxscyB0b2xlcmF0ZSBmYWlsdXJlcyAoc3Bhd25TeW5jIGRpc2NhcmRzIHRoZWlyIHN0YXR1cyksIHNvIGEgbGF5b3V0IHRoYXRcbiAgICAvLyBjYW5ub3QgaW5zdGFsbCB3b3VsZCBzaWxlbnRseSBkcm9wIGV2ZXJ5IG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGUgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4uXG4gICAgLy8gQSBkb2NzLW9ubHkgcmVwb3NpdG9yeSBoYXMgbm8gbWFuaWZlc3QgdG8gcHJvYmUgb24gaXRzIGZpcnN0IHJ1bjsgZ2VuZXJhdGVQYWNrYWdlSnNvbiBiZWxvd1xuICAgIC8vIGNyZWF0ZXMgaXQgYmVmb3JlIHRoZSBhdXRob3JpdGF0aXZlIHJlZnJlc2hCdW5Mb2NrIGNoZWNrLlxuICAgIGlmIChcbiAgICAgICFza2lwRGVwcyAmJlxuICAgICAgcm9vdENvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmXG4gICAgICAhcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwocm9vdERpclBhdGgsIHJvb3RDb25maWcsIHByZXZpb3VzQnVuR2xvYmFsU3RvcmUsIHVzZUdsb2JhbFN0b3JlKVxuICAgICkge1xuICAgICAgLy8gcmVmcmVzaEJ1bkxvY2sgYmVsb3cgaXMgdGhlIGF1dGhvcml0eSBvbiB3aGV0aGVyIHRoZSBmaW5hbCBpbnN0YWxsIGZhaWxlZC5cbiAgICAgIGNvbnNvbGUud2FybihgYnVuIGluc3RhbGwgY3VycmVudGx5IGZhaWxzIGluICR7cm9vdERpclBhdGh9IHVuZGVyIHRoZSBpc29sYXRlZCBsaW5rZXIuYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIC8vIE90aGVyIG93bmVycyBjYW5ub3QgY2FsbCB0aGUgb3JnYW5pemF0aW9uJ3MgcmV1c2FibGUgd29ya2Zsb3dzICh0aGVpciBzZWNyZXRzIGFuZCBydW5uZXJzXG4gICAgLy8gZG8gbm90IGV4aXN0IHRoZXJlKSwgc28gYW55IG90aGVyIEdpdEh1Yi1ob3N0ZWQgTm9kZS5qcyByZXBvc2l0b3J5IGdldHMgc2VsZi1jb250YWluZWRcbiAgICAvLyB3b3JrZmxvd3MgaW5zdGVhZCDigJQga2V5ZWQgb24gcmVwb3NpdG9yeSBzdGF0ZSwgbmV2ZXIgb24gdGhlIG93bmVyJ3MgaWRlbnRpdHkuXG4gICAgLy8gcm9vdENvbmZpZy5pc1Jvb3Q6IGEgZGlyZWN0IHdvcmtzcGFjZS1jaGlsZCBpbnZvY2F0aW9uIChgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gKSBrZWVwc1xuICAgIC8vIGlzUm9vdCBmYWxzZSwgYW5kIEdpdEh1YiBpZ25vcmVzIHdvcmtmbG93IGZpbGVzIG5lc3RlZCB1bmRlciBhIHBhY2thZ2UgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHNob3VsZFJ1blNlbGZDb250YWluZWRXb3JrZmxvd3MgPVxuICAgICAgIXNob3VsZFJ1bldvcmtmbG93cyAmJlxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgICEhcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6JykgJiZcbiAgICAgIHJvb3RDb25maWcuaXNSb290O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGZpeFJhaWx3YXlpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbmMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgLi4uKHNob3VsZFJ1blNlbGZDb250YWluZWRXb3JrZmxvd3MgPyBbZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIC8vIEdpdCBob29rcyBhcmUgcmVwb3NpdG9yeS1sZXZlbCBzdGF0ZTogYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gbXVzdCBub3Qgd3JpdGUgYVxuICAgICAgLy8gY2hpbGQgbGVmdGhvb2sueW1sIG9yIHJlcGxhY2UgdGhlIGVuY2xvc2luZyByZXBvc2l0b3J5J3MgaG9vayBpbnN0YWxsYXRpb24uXG4gICAgICAuLi4ocm9vdENvbmZpZy5pc1Jvb3QgPyBbZ2VuZXJhdGVMZWZ0aG9vayhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyldIDogW10pLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAvLyBBZnRlciB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yIChhbmQgaXRzIHBvb2xlZCB3cml0ZXMpIHNvIHRoZSBpbnN0cnVjdGlvbiBmaWxlcyBkZXNjcmliZSB0aGVcbiAgICAvLyBmaW5hbGl6ZWQgd29ya2Zsb3cgZmlsZXMgaW5zdGVhZCBvZiBsYWdnaW5nIG9uZSBydW4gYmVoaW5kLlxuICAgIGF3YWl0IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4Q2hha3JhVG9hc3Rlcihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSmF2YShjb25maWcpKSBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcERlcHMpO1xuXG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiYgZG9lc0NvbnRhaW5Kc09yVHMocm9vdENvbmZpZykpIHtcbiAgICAgICAgLy8gTW9ub3JlcG8gdmVyaWZpY2F0aW9uIGNhbiBpbnZva2Ugb3hsaW50IGZyb20gZXZlcnkgd29ya3NwYWNlLiBHaXZlXG4gICAgICAgIC8vIG5vbi1jb2RlIHBhY2thZ2VzIGEgbG9jYWwgY29uZmlnIHNvIG94bGludCBkb2VzIG5vdCBjbGltYiB0byB0aGVcbiAgICAgICAgLy8gcm9vdCBjb25maWcgYW5kIHJlamVjdCByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIGZyb20gYSBwYWNrYWdlIGN3ZC5cbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIC8vIFJ1biBhZnRlciBldmVyeSBwb29sZWQgZ2VuZXJhdG9yIHdyaXRlIHNvIG5vcm1hbGl6YXRpb24gY2Fubm90IG92ZXJ3cml0ZSBhIGNvbmN1cnJlbnRcbiAgICAvLyB1cGRhdGUsIGFuZCBiZWZvcmUgY2xlYW51cCBzbyBmb3JtYXR0ZXIgbWV0YWRhdGEgY2FjaGVzIG9ic2VydmUgdGhlIGNoYW5nZWQgZmlsZXMuXG4gICAgcmVub3JtYWxpemVUcmFja2VkVGV4dEZpbGVzKHJvb3REaXJQYXRoKTtcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICB0cnkge1xuICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBBIGZhaWxlZCBpbnN0YWxsIG11c3QgZmFpbCB0aGUgQ0xJOiBleGl0aW5nIDAgd2l0aCBhIHN0YWxlIG9yIG1pc3NpbmcgQnVuIGxvY2tmaWxlIHdvdWxkXG4gICAgICAvLyBoaWRlIGEgYnJva2VuIG1hbmFnZWQgY29uZmlndXJhdGlvbi5cbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZWZyZXNoIHRoZSBCdW4gbG9ja2ZpbGU6JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcik7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyBCdW4gd3JpdGVzIGJ1bi5sb2NrIGJlZm9yZSBsaWZlY3ljbGUgc2NyaXB0cywgc28gYSBmYWlsZWQgaW5zdGFsbCBjYW4gc3RpbGwgbGVhdmUgR3VhcmRcbiAgICAgIC8vIFVSTHMgYmVoaW5kLiBOb3JtYWxpemUgYm90aCBzdWNjZXNzIGFuZCBmYWlsdXJlIG91dHB1dCB3aXRob3V0IHJlcGxhY2luZyB0aGUgaW5zdGFsbCBlcnJvci5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRMb2NrZmlsZVBhdGggPSBub3JtYWxpemVCdW5Mb2NrZmlsZShyb290RGlyUGF0aCk7XG4gICAgICBpZiAobm9ybWFsaXplZExvY2tmaWxlUGF0aCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAke25vcm1hbGl6ZWRMb2NrZmlsZVBhdGh9IHRvIGtlZXAgaXQgcmVnaXN0cnktYWdub3N0aWMuYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBub3JtYWxpemUgdGhlIEJ1biBsb2NrZmlsZTonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKCdidW4nLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuICB9XG4gIHJldHVybiBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZztcbn1cblxuLyoqXG4gKiBQcm9iZXMgYGJ1biBpbnN0YWxsYCB1bmRlciB0aGUgaXNvbGF0ZWQgbGlua2VyLiBBbiBpbmNvbXBhdGliaWxpdHkgbXVzdCBiZSBmaXhlZCBpbiB0aGVcbiAqIHJlcG9zaXRvcnkgb3IgaW4gd2JmeSdzIG1hbmFnZWQgbGlzdHMsIG5ldmVyIGJ5IHN3aXRjaGluZyB0aGUgbGlua2VyLiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlXG4gKiBpbnN0YWxsIGZhaWxzLlxuICovXG5mdW5jdGlvbiBwcm9iZUlzb2xhdGVkQnVuSW5zdGFsbChcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcHJldmlvdXNHbG9iYWxTdG9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICAvLyBBIGxheW91dCBzd2l0Y2ggbXVzdCBwcm9iZSBmcm9tIGEgY2xlYW4gdHJlZSBiZWNhdXNlIEJ1biBkb2VzIG5vdCByZW1vdmUgdGhlIHByZXZpb3VzIGxheW91dCdzIGxlZnRvdmVycy5cbiAgaWYgKHByZXZpb3VzR2xvYmFsU3RvcmUgIT09IHVzZUdsb2JhbFN0b3JlKSB7XG4gICAgcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGgsIHJvb3RDb25maWcpO1xuICB9XG4gIC8vIFJldHJ5IG9uY2Ugc28gYSB0cmFuc2llbnQgZmFpbHVyZSAocmVnaXN0cnkgaGljY3VwLCBmbGFreSBsaWZlY3ljbGUgc2NyaXB0KSBkb2VzIG5vdFxuICAvLyBtYXNxdWVyYWRlIGFzIGEgbGF5b3V0IGluY29tcGF0aWJpbGl0eS5cbiAgaWYgKHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoLCAxKSA9PT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgLy8gQ2xlYW4gdXAgdGhlIGZhaWxlZCBhdHRlbXB0IHNvIGxhdGVyIGluc3RhbGxzIGRvIG5vdCBydW4gb24gYSBwb2xsdXRlZCB0cmVlLlxuICByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aCwgcm9vdENvbmZpZyk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGg6IHN0cmluZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICAvLyBDb3ZlciBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2U6IGxlZnRvdmVycyBjYW4ga2VlcCBwaGFudG9tIGRlcGVuZGVuY2llcyByZXNvbHZhYmxlLlxuICBjb25zdCBub2RlTW9kdWxlc1BhdGhzID0gW1xuICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpLFxuICAgIC4uLlsuLi5nZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS52YWx1ZXMoKV0ubWFwKCh3b3Jrc3BhY2VEaXIpID0+XG4gICAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIHdvcmtzcGFjZURpciwgJ25vZGVfbW9kdWxlcycpXG4gICAgKSxcbiAgXTtcbiAgLy8gTmV2ZXIgZGVsZXRlIHRocm91Z2ggYSB3b3Jrc3BhY2Ugc3ltbGluayB0aGF0IGVzY2FwZXMgdGhpcyByZXBvc2l0b3J5LlxuICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICBmb3IgKGNvbnN0IG5vZGVNb2R1bGVzUGF0aCBvZiBub2RlTW9kdWxlc1BhdGhzKSB7XG4gICAgY29uc3QgcmVhbFBhcmVudERpclBhdGggPSBpZ25vcmVFcnJvcigoKSA9PiBmcy5yZWFscGF0aFN5bmMocGF0aC5kaXJuYW1lKG5vZGVNb2R1bGVzUGF0aCkpKTtcbiAgICBpZiAoXG4gICAgICAhcmVhbFBhcmVudERpclBhdGggfHxcbiAgICAgIChyZWFsUGFyZW50RGlyUGF0aCAhPT0gcmVhbFJvb3REaXJQYXRoICYmICFyZWFsUGFyZW50RGlyUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKSlcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAvLyB3YmZ5IHNob3VsZCB1cGRhdGUgb25seSB0aGUgcGFja2FnZXMgaXQgZXhwbGljaXRseSBtYW5hZ2VzIHRocm91Z2ggYnVuIGFkZC5cbiAgLy8gUnVubmluZyBidW4gdXBkYXRlIGhlcmUgcmVmcmVzaGVzIHVucmVsYXRlZCBhcHBsaWNhdGlvbiBkZXBlbmRlbmNpZXMgYW5kXG4gIC8vIGNhbiBjaGFuZ2UgcHJvZHVjdCBiZWhhdmlvciwgc28ga2VlcCB0aGUgZXhpc3RpbmcgbG9jayBhbmQgcmVjb25jaWxlIGl0LlxuICBjb25zdCBzdGF0dXMgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCwgMSk7XG4gIGlmIChzdGF0dXMgPT09IDApIHJldHVybjtcbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBCdW4gbG9ja2ZpbGU6IGJ1biBpbnN0YWxsIGV4aXRlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gKTtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOls0Miw0Myw0NCw0NSw0Niw0N10sIm1hcHBpbmdzIjoiKzFCQUFBLGVBQXNCLEVBQU0sRUFBcUMsQ0FDL0QsT0FBTyxJQUFJLFFBQVMsR0FBWSxXQUFXLEVBQVMsQ0FBWSxDQUFDLENBQ25FLENDY0EsU0FBZ0IsR0FBZSxFQUE0QixDQUN6RCxHQUFJLENBQ0YsT0FBTyxFQUFHLENBQ1osTUFBUSxDQUVSLENBQ0YsQ0FhQSxlQUFzQixHQUFvQixFQUE4QyxDQUN0RixHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUcsQ0FDbEIsTUFBUSxDQUVSLENBQ0YsQ0FxQ0EsZUFBc0IsR0FDcEIsRUFDQSxDQUNFLGNBQ0EsY0FDQSxhQUFhLEVBQ2IsY0FDQSxjQUNBLG9CQUFvQixFQUNwQiwyQkFDZ0IsQ0FBQyxFQUNQLENBQ1osSUFBSSxFQUFjLEVBQ2xCLE9BQ0UsR0FBSSxDQUNGLE9BQU8sTUFBTSxFQUFLLENBQVcsQ0FDL0IsT0FBUyxFQUFPLENBTWQsR0FMQSxNQUFNLElBQWMsQ0FBSyxFQUN6QixJQUNJLEdBQWUsR0FHZixHQUFlLENBQUMsRUFBWSxDQUFLLEVBQ25DLE1BQU0sRUFFSixFQUFvQixHQUN0QixNQUFNLEVBQU0sQ0FBaUIsRUFFM0IsSUFDRixFQUFvQixFQUF3QixDQUFpQixHQUUvRCxJQUFjLGlCQUFpQixFQUFNO0VBQ3pDLGFBQWlCLE1BQVE7R0FBVyxFQUFNLE9BQVMsSUFBTSxJQUFJLEVBQ3pELE1BQU0sSUFBYyxDQUFLLENBQzNCLENBRUosQ0M5REEsU0FBZ0IsRUFBaUMsRUFBNkIsRUFBK0IsQ0FTM0csSUFBTSxFQUFxQixHQUE4QixDQU12RCxJQUFNLEVBQXNCLEVBQUcsaUJBQWlCLENBQU8sRUFDakQsRUFBYyxDQUFFLElBQUssRUFBYSxvQkFBcUIsR0FBTyxPQUFRLENBQUMsb0JBQW9CLENBQUUsRUFPN0YsRUFBZ0IsSUFBSSxJQUFJLEVBQUcsU0FBUyxFQUFLLE1BQU0sS0FBSyxFQUFTLGNBQWMsRUFBRyxDQUFXLENBQUMsRUFDaEcsR0FBSSxFQUFRLFNBQVMsR0FBRyxFQUN0QixJQUFLLElBQU0sS0FBVyxFQUFHLFNBQVMsRUFBUyxDQUFFLEdBQUcsRUFBYSxnQkFBaUIsRUFBSyxDQUFDLEVBQUcsQ0FDckYsSUFBTSxFQUFrQixFQUFLLE1BQU0sS0FBSyxFQUFTLGNBQWMsRUFDM0QsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFhLENBQWUsQ0FBQyxHQUFHLEVBQWMsSUFBSSxDQUFlLENBQy9GLENBSUYsTUFBTyxDQUFDLEdBQUcsQ0FBYSxDQUFDLENBQUMsT0FDdkIsR0FDQyxJQUFvQixpQkFDbkIsQ0FBQyxHQUF1QixDQUFDLEVBQWdCLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBTSxHQUFZLEVBQVEsV0FBVyxHQUFHLENBQUMsSUFDOUYsRUFBaUIsQ0FBZSxDQUNwQyxDQUNGLEVBQ0ksRUFDRSxFQUFvQixHQUFxQyxDQUM3RCxHQUFJLENBQ0YsSUFBb0IsRUFBRyxhQUFhLENBQVcsRUFDL0MsSUFBTSxFQUFlLEVBQUssU0FBUyxFQUFpQixFQUFHLGFBQWEsRUFBSyxLQUFLLEVBQWEsQ0FBZSxDQUFDLENBQUMsRUFHNUcsT0FBTyxJQUFpQixNQUFRLENBQUMsRUFBYSxXQUFXLEtBQUssR0FBSyxDQUFDLEVBQUssV0FBVyxDQUFZLENBQ2xHLE1BQVEsQ0FFTixNQUFPLEVBQ1QsQ0FDRixFQUNNLEVBQW1CLElBQUksSUFDdkIsRUFBYyxJQUFJLElBQ3hCLElBQUssSUFBTSxLQUFvQixFQUFtQixDQUNoRCxJQUFNLEVBQWEsRUFBaUIsV0FBVyxHQUFHLEVBQzVDLEVBQWMsR0FBOEIsRUFBYSxFQUFpQixNQUFNLENBQUMsRUFBSSxDQUFnQixFQUMzRyxHQUFJLEVBQVksQ0FDZCxJQUFNLEVBQWUsR0FBc0IsQ0FBVyxFQUN0RCxHQUFJLElBQWlCLElBQUEsR0FDbkIsSUFBSyxJQUFNLEtBQW1CLEVBQWtCLENBQVksRUFBRyxFQUFpQixJQUFJLENBQWUsRUFFckcsSUFBSyxJQUFNLEtBQW1CLEVBQWtCLENBQVcsRUFBRyxFQUFpQixPQUFPLENBQWUsQ0FDdkcsS0FBTyxDQUNMLElBQU0sRUFBYyxFQUFHLGlCQUFpQixDQUFXLEVBQUksRUFBbUIsRUFDMUUsSUFBSyxJQUFNLEtBQW1CLEVBQWtCLENBQVcsRUFDekQsRUFBWSxJQUFJLENBQWUsQ0FFbkMsQ0FDRixDQUNBLE1BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBa0IsR0FBRyxDQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUN0RSxDQVdBLFNBQWdCLEdBQTZCLEVBQTRDLENBQ3ZGLE9BQU8sR0FBdUMsQ0FBVSxDQUFDLENBQUMsS0FDdkQsR0FDQyxFQUFpQixXQUFXLEdBQUcsR0FDL0IsR0FBc0IsR0FBOEIsRUFBaUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFNLElBQUEsRUFDeEYsQ0FDRixDQVFBLFNBQWdCLEdBQXVDLEVBQTZDLENBQ2xHLE9BQU8sR0FBNkIsQ0FBVSxDQUFDLENBQzVDLElBQUssR0FBcUIsQ0FHekIsSUFBTSxFQUFZLE9BQU8sS0FBSyxDQUFnQixDQUFDLENBQUUsRUFBRSxDQUFDLE9BQzlDLEVBQWMsRUFBaUIsTUFBTSxDQUFTLEVBQ3BELE9BQU8sRUFBWSxHQUFNLEVBQUksSUFBSSxJQUFnQixDQUNuRCxDQUFDLENBQUMsQ0FDRCxPQUFRLEdBSUEsR0FIYSxFQUFpQixXQUFXLEdBQUcsRUFBSSxFQUFpQixNQUFNLENBQUMsRUFBSSxDQUduQyxJQUFNLEdBQ3ZELENBQ0wsQ0FPQSxTQUFnQixHQUE4QixFQUE2QixDQUN6RSxPQUFPLEVBQUssTUFDVCxVQUFVLENBQVcsQ0FBQyxDQUN0QixRQUFRLFFBQVMsRUFBRSxDQUFDLENBQ3BCLE1BQU0sR0FBRyxDQUFDLENBQ1YsSUFBSyxHQUFhLFlBQVksS0FBSyxDQUFPLEVBQUksSUFBTSxDQUFRLENBQUMsQ0FDN0QsS0FBSyxHQUFHLENBQ2IsQ0FHQSxTQUFnQixHQUFzQixFQUEwQyxDQUM5RSxJQUFNLEVBQVcsRUFBYSxNQUFNLEdBQUcsRUFDdkMsR0FBSSxFQUFTLFNBQVcsRUFBRyxPQUMzQixHQUFNLENBQUMsRUFBYyxHQUFlLEVBQ2hDLE1BQUMsU0FBUyxLQUFLLENBQVcsR0FBSyxTQUFTLEtBQUssQ0FBWSxHQUM3RCxPQUFPLElBQWdCLEtBQU8sS0FBTyxLQUN2QyxDQUdBLFNBQWdCLEdBQTZCLEVBQTZDLENBRXhGLE9BREksTUFBTSxRQUFRLENBQVUsRUFBVSxFQUMvQixNQUFNLFFBQVEsR0FBWSxRQUFRLEVBQUksRUFBVyxTQUFXLENBQUMsQ0FDdEUsQ0FPQSxTQUFnQixHQUErQixFQUFtQyxDQUNoRixJQUFNLEVBQWMsRUFBaUIsV0FBVyxHQUFHLEVBQUksRUFBaUIsTUFBTSxDQUFDLEVBQUksRUFDbkYsTUFBTyxDQUFDLEVBQUssTUFBTSxXQUFXLENBQVcsR0FBSyxDQUFDLEVBQVksTUFBTSxHQUFHLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FDckYsQ0NqTUEsTUFBTSxHQUEwQiw0Q0FhaEMsU0FBZ0IsR0FBcUIsRUFBMEMsQ0FDN0UsSUFBTSxFQUFlLEdBQW9CLENBQVksRUFDckQsR0FBSSxDQUFDLEVBQWMsT0FFbkIsSUFBTSxFQUFVLEVBQUcsYUFBYSxFQUFjLE1BQU0sRUFDOUMsRUFBb0IsRUFBUSxXQUFXLEdBQXlCLE1BQU0sRUFDNUUsR0FBSSxJQUFzQixFQUFTLE9BSW5DLElBQU0sRUFBZ0IsR0FBRyxFQUFhLGVBQWUsUUFBUSxJQUFJLEdBQUcsRUFBTyxXQUFXLElBQ3RGLEdBQUksQ0FFRixJQUFNLEVBQU8sRUFBRyxTQUFTLENBQVksQ0FBQyxDQUFDLEtBQU8sSUFDOUMsRUFBRyxjQUFjLEVBQWUsRUFBbUIsQ0FBRSxNQUFLLENBQUMsRUFFM0QsRUFBRyxVQUFVLEVBQWUsQ0FBSSxFQUNoQyxFQUFHLFdBQVcsRUFBZSxDQUFZLENBQzNDLFFBQVUsQ0FDUixFQUFHLE9BQU8sRUFBZSxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQzFDLENBQ0EsT0FBTyxDQUNULENBRUEsU0FBUyxHQUFvQixFQUEwQyxDQUNyRSxJQUFNLEVBQXVCLEVBQUssUUFBUSxDQUFZLEVBQ2hELEVBQXdCLEdBQTBCLENBQW9CLEVBQzVFLEdBQUksQ0FBQyxFQUF1QixDQUMxQixJQUFNLEVBQWUsRUFBSyxLQUFLLEVBQXNCLFVBQVUsRUFDL0QsT0FBTyxFQUFHLFdBQVcsQ0FBWSxFQUFJLEVBQWUsSUFBQSxFQUN0RCxDQUVBLElBQUksRUFBVSxFQUNkLE9BQWEsQ0FDWCxJQUFNLEVBQWUsRUFBSyxLQUFLLEVBQVMsVUFBVSxFQUNsRCxHQUFJLEVBQUcsV0FBVyxDQUFZLEVBQUcsT0FBTyxFQUN4QyxHQUFJLElBQVksRUFBdUIsT0FFdkMsRUFBVSxFQUFLLFFBQVEsQ0FBTyxDQUNoQyxDQUNGLENBRUEsU0FBUyxHQUEwQixFQUEwQyxDQUMzRSxJQUFJLEVBQVUsRUFDZCxPQUFhLENBQ1gsR0FBSSxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQVMsTUFBTSxDQUFDLEVBQUcsT0FBTyxFQUV0RCxJQUFNLEVBQWdCLEVBQUssUUFBUSxDQUFPLEVBQzFDLEdBQUksSUFBa0IsRUFBUyxPQUMvQixFQUFVLENBQ1osQ0FDRixDQ3hFQSxTQUFnQixHQUFrQixFQUFpQyxDQUNqRSxPQUFPLEVBQ0osTUFBTTtDQUFJLENBQUMsQ0FDWCxLQUFNLEdBQVMsQ0FBQyxTQUFTLEtBQUssQ0FBSSxJQUFNLEVBQUssU0FBUyxhQUFhLEdBQUssRUFBSyxTQUFTLHFCQUFxQixFQUFFLENBQ2xILENDTEEsTUFBYSxFQUFhLENBQ3hCLHFCQUNBLHdCQUdBLGFBR0EsYUFDQSxlQUdBLGVBQ0EsY0FDQSxzQkFDQSxzQkFDQSxhQUNBLGNBQ0EsZUFDQSxhQUNBLFdBQ0YsRUNqQmEsRUFBVSxJQUFJLEtBSmIsQ0FDWixVQUFZLEVBQ2QsRUNnQmEsRUFBUyxJQUFJLEtBaEJiLENBQ1gsTUFBTSwwQkFBMEIsRUFBYyxFQUEwQyxDQUNsRixFQUFRLFdBQ1YsUUFBUSxLQUFLLGFBQWEsRUFBSyxpQkFBaUIsRUFFbEQsR0FBSSxDQUNGLE1BQU0sRUFBSyxDQUNiLE9BQVMsRUFBTyxDQUNkLFFBQVEsS0FBSyxxQkFBcUIsRUFBSyxJQUFJLGFBQWlCLE1BQVEsRUFBTSxNQUFRLE9BQU8sQ0FBSyxFQUFFLEVBQUUsQ0FDcEcsQ0FDSSxFQUFRLFdBQ1YsUUFBUSxLQUFLLGNBQWMsRUFBSyxnQkFBZ0IsQ0FFcEQsQ0FDRixFQ2JBLElBQUksRUFFSixNQUFhLEVBQVMsQ0FFcEIsZUFBZSxFQUF1QyxDQUNwRCxFQUFrQixJQUFnQixJQUFBLEdBQVksSUFBQSxHQUFZLEVBQUcsYUFBYSxDQUFXLENBQ3ZGLEVBS0EsTUFBTSxpQkFBaUIsRUFBK0MsQ0FDcEUsR0FBSSxDQUNGLE9BQU8sTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sQ0FDcEQsT0FBUyxFQUFPLENBQ2QsR0FBSyxFQUFnQyxPQUFTLFNBQVUsT0FDeEQsTUFBTSxDQUNSLENBQ0YsRUFFQSxNQUFNLHVCQUF1QixFQUFvQyxDQUMvRCxPQUFPLE1BQU0sR0FBdUIsQ0FBUSxDQUM5QyxFQU9BLE1BQU0seUJBQXlCLEVBQStDLENBQzVFLElBQU0sRUFBUSxNQUFNLEVBQUcsU0FBUyxNQUFNLENBQVEsQ0FBQyxDQUFDLFVBQVksQ0FBQyxDQUFDLEVBQ3pELEtBQ0wsSUFBSSxFQUFNLGVBQWUsRUFBRyxDQUMxQixJQUFJLEVBQ0osR0FBSSxDQUNGLEVBQWUsTUFBTSxFQUFHLFNBQVMsU0FBUyxDQUFRLENBQ3BELE1BQVEsQ0FDTixRQUFRLEtBQUssbUJBQW1CLEVBQVMseUNBQXlDLEVBQ2xGLE1BQ0YsQ0FDQSxHQUNFLElBQW9CLElBQUEsSUFDcEIsSUFBaUIsR0FDakIsQ0FBQyxFQUFhLFdBQVcsRUFBa0IsRUFBSyxHQUFHLEVBQ25ELENBQ0EsUUFBUSxLQUFLLG1CQUFtQixFQUFTLDZDQUE2QyxFQUN0RixNQUNGLENBQ0EsT0FBTyxNQUFNLEVBQU8saUJBQWlCLENBQVEsQ0FDL0MsQ0FDQSxHQUFJLENBQUUsTUFBTSxHQUFrQixDQUFRLEVBQUksQ0FDeEMsUUFBUSxLQUFLLG1CQUFtQixFQUFTLDZDQUE2QyxFQUN0RixNQUNGLENBQ0EsT0FBTyxNQUFNLEVBQU8saUJBQWlCLENBQVEsQ0FMN0MsQ0FNRixFQU9BLE1BQU0sZUFBZSxFQUFrQixFQUFxRCxDQU0xRixPQUxNLE1BQU0sR0FBa0IsQ0FBUSxHQUl0QyxNQUFNLEVBQUcsU0FBUyxHQUFHLEVBQVUsQ0FBRSxNQUFPLEdBQU0sVUFBVyxHQUFTLFdBQWEsRUFBTSxDQUFDLEVBQy9FLEtBSkwsUUFBUSxLQUFLLG9CQUFvQixFQUFTLDZDQUE2QyxFQUNoRixHQUlYLEVBRUEsTUFBTSxrQkFBa0IsRUFBa0IsRUFBbUMsQ0FHM0UsT0FGTSxNQUFNLEdBQXVCLENBQVEsR0FDM0MsTUFBTSxFQUFHLFNBQVMsVUFBVSxFQUFVLENBQU8sRUFDdEMsSUFGK0MsRUFHeEQsRUFFQSxNQUFNLGFBQWEsRUFBa0IsRUFBaUIsRUFBNEI7RUFBd0IsQ0FDeEcsR0FBSSxDQUFFLE1BQU0sR0FBdUIsQ0FBUSxFQUFJLE1BQU8sR0FDdEQsTUFBTSxFQUFHLFNBQVMsTUFBTSxFQUFLLFFBQVEsQ0FBUSxFQUFHLENBQUUsVUFBVyxFQUFLLENBQUMsRUFHbkUsSUFBTSxFQUFnQixFQUFRLFdBQVcsR0FBRyxFQUFJLElBQU0sR0FDbEQsRUFBb0IsRUFBUSxLQUFLLEVBTXJDLE1BTEEsQ0FDRSxJQUFvQixHQUFHLElBQWdCLElBQW9CLElBRTdELE1BQU0sRUFBRyxTQUFTLFVBQVUsRUFBVSxDQUFpQixFQUVoRCxFQUNULENBQ0YsRUFFQSxlQUFlLEdBQXVCLEVBQW9DLENBWXhFLE9BUkksTUFEZ0IsRUFBRyxTQUFTLE1BQU0sQ0FBUSxDQUFDLENBQUMsVUFBWSxDQUFDLENBQUMsRUFBQSxFQUNuRCxlQUFlLEdBQ3hCLFFBQVEsS0FBSyxtQkFBbUIsRUFBUyxnQ0FBZ0MsRUFDbEUsSUFFSCxNQUFNLEdBQWtCLENBQVEsRUFJL0IsSUFITCxRQUFRLEtBQUssbUJBQW1CLEVBQVMsNkNBQTZDLEVBQy9FLEdBR1gsQ0FJQSxlQUFlLEdBQWtCLEVBQW9DLENBQ25FLEdBQUksSUFBb0IsSUFBQSxHQUFXLE1BQU8sR0FDMUMsSUFBSSxFQUFlLEVBQUssUUFBUSxDQUFRLEVBQ3hDLEtBQU8sQ0FBQyxFQUFHLFdBQVcsQ0FBWSxHQUNoQyxFQUFlLEVBQUssUUFBUSxDQUFZLEVBRTFDLElBQU0sRUFBbUIsTUFBTSxFQUFHLFNBQVMsU0FBUyxDQUFZLEVBQ2hFLE9BQU8sSUFBcUIsR0FBbUIsRUFBaUIsV0FBVyxFQUFrQixFQUFLLEdBQUcsQ0FDdkcsQ0N2SEEsTUFBYSxFQUFjLElBQUksRUNNL0IsSUFBSSxHQUVKLFNBQVMsSUFBYyxDQUNyQixNQUFRLE1BQVEsSUFBSSxFQUFJLENBQUUsSUFBSyxRQUFRLElBQUksQ0FBRSxDQUFDLENBQ2hELENBT0EsZUFBc0IsR0FBZ0IsRUFBbUQsQ0FDdkYsR0FBSSxDQUdGLE9BQU8sTUFBTSxNQURTLE1BREMsR0FBTyxDQUFDLENBQUMsZUFBZSxDQUFFLFVBQVcsQ0FBQyxDQUFRLENBQUUsQ0FBQyxFQUFBLENBQ3pDLHlCQUF5QixDQUFRLEVBQUEsRUFDMUMsUUFBUSxjQUFjLENBQVEsQ0FDdEQsTUFBUSxDQUNOLE1BQ0YsQ0FDRixDQU9BLGVBQXNCLElBQXNDLENBQzFELE1BQU0sSUFBSyxNQUFNLEVBQ2pCLEdBQU0sSUFBQSxFQUNSLENDdkJBLE1BQU0sR0FBK0QsQ0FDbkUsQ0FBRSxLQUFNLGdCQUFpQixLQUFNLHFCQUFzQixFQUNyRCxDQUFFLEtBQU0sa0JBQW1CLEtBQU0sdUJBQXdCLEVBQ3pELENBQUUsS0FBTSxhQUFjLEtBQU0seUNBQTBDLENBQ3hFLEVBRUEsZUFBc0IsR0FBa0IsRUFBc0MsQ0FDNUUsT0FBTyxFQUFPLDBCQUEwQixvQkFBcUIsU0FBWSxDQUN2RSxJQUFNLEVBQVcsQ0FBQyxLQUFNLE1BQU8sTUFBTyxLQUFNLE1BQU8sS0FBSyxDQUFDLENBQ3RELElBQUssR0FBUSxFQUFLLFFBQVEsRUFBTyxRQUFTLGVBQWUsR0FBSyxDQUFDLENBQUMsQ0FDaEUsS0FBTSxHQUFNLEVBQUcsV0FBVyxDQUFDLENBQUMsRUFDL0IsR0FBSSxDQUFDLEVBQVUsT0FFZixJQUFNLEVBQVksTUFBTSxHQUEyQixDQUFRLEVBQzNELEdBQUksQ0FBQyxFQUFXLE9BQ2hCLEdBQU0sQ0FBRSxTQUFRLGlCQUFrQixFQUc1QixFQUFxQixJQUFJLElBQzdCLEVBQWMsV0FBVyxJQUFLLEdBQzVCLFNBQVUsR0FBWSxFQUFTLEtBQU8sR0FBZSxFQUFTLEtBQU0sQ0FBTSxFQUFJLElBQUEsRUFDaEYsQ0FDRixFQUNNLEVBQWdCLEdBQ25CLE9BQVEsR0FBYSxDQUFDLEVBQW1CLElBQUksRUFBUyxJQUFJLENBQUMsQ0FBQyxDQUM1RCxJQUFLLEdBQWEsRUFBUyxJQUFJLEVBQ2xDLEdBQUksRUFBYyxTQUFXLEVBQUcsT0FFaEMsSUFBTSxFQUFhLEVBQU8sS0FDcEIsRUFBaUIsRUFBYyxPQUFPLEVBQUksRUFJMUMsRUFBZSxFQUFjLFdBQVcsR0FBRyxFQUFFLEVBQzdDLEVBQW1CLEVBQ3JCLEdBQWMsRUFBVyxNQUFNLEVBQWEsT0FBTyxFQUFHLENBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEVBQ25GLEdBQ0UsRUFBUyxFQUFjLFdBQVcsT0FBUyxHQUFLLENBQUMsRUFBbUIsS0FBTyxHQUMzRSxFQUFhLEdBQUcsRUFBVyxNQUFNLEVBQUcsQ0FBYyxJQUFJLElBQVMsRUFBYyxLQUFLLElBQUksSUFBSSxFQUFXLE1BQ3pHLENBQ0YsSUFDQSxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBQUMsQ0FDdkUsQ0FBQyxDQUNILENBRUEsZUFBZSxHQUNiLEVBQzZGLENBQzdGLElBQU0sRUFBUyxNQUFNLEdBQWdCLENBQVEsRUFDN0MsR0FBSSxDQUFDLEVBQVEsT0FNYixJQUFJLEVBQ0EsRUFDRSxFQUF5QixJQUFJLElBQzdCLEVBQTJELENBQUMsRUFFNUQsRUFBUyxHQUF5QixDQUN0QyxHQUFJLEVBQUksbUJBQW1CLENBQUksRUFBRyxDQUNoQyxJQUFNLEVBQWdCLEdBQW9CLEVBQUssVUFBVSxFQUNyRCxFQUNGLElBQXdCLEVBQ2YsRUFBSSxhQUFhLEVBQUssVUFBVSxJQUN6QyxJQUF1QixFQUFLLFdBQVcsUUFBUSxDQUFNLEVBRXpELE1BQU8sR0FDTCxFQUFJLG1CQUFtQixDQUFJLEdBQzNCLEVBQUssY0FBYyxPQUFTLEVBQUksV0FBVyxhQUMzQyxFQUFLLEtBQUssUUFBUSxDQUFNLElBQU0saUJBQzlCLENBQ0EsSUFBTSxFQUFnQixHQUFvQixFQUFLLEtBQUssRUFDaEQsRUFDRixJQUF3QixFQUNmLEVBQUksYUFBYSxFQUFLLEtBQUssSUFDcEMsSUFBdUIsRUFBSyxNQUFNLFFBQVEsQ0FBTSxFQUVwRCxNQUFPLEdBQUksRUFBSSxzQkFBc0IsQ0FBSSxHQUFLLEVBQUssWUFBYSxDQUM5RCxJQUFNLEVBQWdCLEdBQW9CLEVBQUssV0FBVyxFQUMxRCxHQUFJLEdBQWlCLEVBQUksYUFBYSxFQUFLLElBQUksRUFBRyxDQUNoRCxFQUF1QixJQUFJLEVBQUssS0FBSyxRQUFRLENBQU0sRUFBRyxDQUFhLEVBR25FLElBQU0sRUFBaUIsRUFBSyxNQUFNLFFBQVEsQ0FBTSxFQUM1QyxJQUFtQixJQUFBLElBQWEsR0FBaUIsQ0FBYyxHQUNqRSxFQUEwQixLQUFLLENBQWEsQ0FFaEQsQ0FDRixDQUNBLEVBQUssYUFBYSxDQUFLLENBQ3pCLEVBQ0EsRUFBTyxhQUFhLENBQUssRUFFekIsSUFBTSxFQUNKLEVBQTBCLElBQzFCLElBQ0MsRUFBcUIsRUFBdUIsSUFBSSxDQUFrQixFQUFJLElBQUEsS0FDdkUsRUFBdUIsSUFBSSxZQUFZLEVBQ3pDLE9BQU8sRUFBZ0IsQ0FBRSxTQUFRLGVBQWMsRUFBSSxJQUFBLEVBQ3JELENBRUEsU0FBUyxHQUFvQixFQUErRCxDQUMxRixJQUFNLEVBQVUsR0FBa0IsQ0FBSSxFQUN0QyxPQUFPLEVBQUksMEJBQTBCLENBQU8sRUFBSSxFQUFVLElBQUEsRUFDNUQsQ0FFQSxTQUFTLEdBQWtCLEVBQXNDLENBQy9ELElBQUksRUFBVSxFQUNkLEtBQU8sRUFBSSwwQkFBMEIsQ0FBTyxHQUMxQyxFQUFVLEVBQVEsV0FFcEIsT0FBTyxDQUNULENBR0EsU0FBUyxHQUFpQixFQUEyQixDQUNuRCxPQUFPLElBQWEsY0FBZ0IsRUFBUyxTQUFTLGFBQWEsQ0FDckUsQ0FJQSxTQUFTLEdBQWUsRUFBd0IsRUFBZ0MsQ0FDOUUsTUFBTyxTQUFVLEdBQVEsT0FBTyxFQUFLLE1BQVMsU0FBVyxFQUFLLEtBQU8sRUFBSyxRQUFRLENBQU0sQ0FDMUYsQ0FFQSxTQUFTLEdBQWMsRUFBc0IsQ0FDM0MsT0FBTyxFQUFLLFdBQVcsK0JBQWdDLEVBQUUsQ0FDM0QsQ0N2SUEsZUFBc0IsR0FBaUIsRUFBc0MsQ0FDM0UsT0FBTyxFQUFPLDBCQUEwQixtQkFBb0IsU0FBWSxDQUN0RSxHQUFJLENBQUMsRUFBTyxVQUFVLE9BQVEsT0FFOUIsSUFBTSxFQUFZLE1BQU0sRUFBRyxLQUFLLHNCQUF1QixDQUNyRCxTQUFVLEdBQ1YsSUFBSyxFQUFPLFFBQ1osT0FBUSxDQUFDLFdBQVksb0JBQW9CLENBQzNDLENBQUMsRUFDRCxJQUFLLElBQU0sS0FBWSxFQUFXLENBQ2hDLElBQU0sRUFBVSxNQUFNQSxFQUFHLFNBQVMsRUFBVSxNQUFNLEVBQ2xELEdBQ0UsRUFBUSxTQUFTLHFCQUFxQixHQUN0QyxDQUFDLEVBQVEsU0FBUyx5QkFBeUIsR0FDM0MsQ0FBQyxFQUFRLFNBQVMsdUNBQXVDLEVBRXpELFNBRUYsSUFBTSxFQUFpQixFQUNwQixRQUNDLDBDQUNBOzZEQUNGLENBQUMsQ0FDQSxRQUFRLHdDQUF5Qyw0REFBNEQsRUFDNUcsSUFBbUIsR0FBUyxNQUFNLEVBQU8sYUFBYSxFQUFVLENBQWMsQ0FDcEYsQ0FDRixDQUFDLENBQ0gsQ0NWQSxNQUFNLEVBQVcsSUFBZ0MsQ0FBRSxLQUFNLFVBQVcsT0FBTSxHQUNwRSxHQUFXLElBQXVDLENBQUUsS0FBTSxRQUFTLE9BQU0sR0FDekUsSUFBWSxFQUF5QyxFQUF5QixDQUFDLEtBQW9CLENBQ3ZHLEtBQU0sU0FDTixNQUFPLEdBQWUsRUFBWSxDQUFZLENBQ2hELEdBRUEsU0FBUyxHQUFvQixFQUF1QixFQUFtRCxDQUNyRyxJQUFNLEVBQU0sR0FBZSxDQUN6QixNQUFPLEVBQVEseURBQXlELEVBQ3hFLFdBQVksRUFBUSwyQ0FBMkMsRUFDL0QsTUFBTyxFQUFRLHlEQUF5RCxDQUMxRSxDQUFDLEVBT0QsT0FMSSxJQUNGLEVBQUksV0FBVyxRQUFVLEVBQVEsa0NBQWtDLEVBQ25FLEVBQUksWUFBWSxRQUFRLENBQUUsS0FBTSxXQUFZLElBQUssU0FBVSxDQUFDLEdBR3ZELEdBQWUsQ0FDcEIsV0FBWSxFQUFRLGtCQUFrQixFQUN0QyxRQUFTLEVBQVEsa0RBQWtELEVBQ25FLElBQUssQ0FBRSxLQUFNLFNBQVUsTUFBTyxDQUFJLEVBQ2xDLEdBQUksRUFDQSxDQUNFLFVBQVcsR0FBUyxDQUNsQixRQUFTLEVBQVEsR0FBc0IsQ0FBQyxFQUN4QyxJQUFLLEVBQVEsa0NBQWtDLEVBQy9DLG9CQUFxQixFQUFRLGtCQUFrQixFQUMvQyxRQUFTLEVBQVEsU0FBUyxFQUMxQixPQUFRLEVBQVEsUUFBUSxFQUN4QixPQUFRLEVBQVEsUUFBUSxFQUN4QixJQUFLLEVBQVE7OztFQUd2QixFQUNVLGlCQUFrQixFQUFROzs7RUFHcEMsQ0FDUSxDQUFDLENBQ0gsRUFDQSxDQUFDLENBQ1AsQ0FBQyxDQUNILENBRUEsU0FBUyxHQUFlLEVBQXlDLEVBQXlCLENBQUMsRUFBaUIsQ0FDMUcsTUFBTyxDQUNMLGVBQ0EsWUFBYSxDQUNYLEdBQUcsT0FBTyxLQUFLLENBQVUsQ0FBQyxDQUFDLElBQUssSUFBdUIsQ0FBRSxLQUFNLFdBQVksS0FBSSxFQUFFLEVBQ2pGLEdBQUcsRUFBYSxLQUFLLEVBQUcsS0FBeUIsQ0FBRSxLQUFNLFFBQVMsT0FBTSxFQUFFLENBQzVFLEVBQ0EsWUFDRixDQUNGLENBRUEsZUFBc0IsR0FBb0IsRUFBc0MsQ0FDOUUsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsc0JBQXNCLEVBQy9ELEtBQUcsV0FBVyxDQUFRLEVBRTNCLE9BQU8sRUFBTywwQkFBMEIsc0JBQXVCLFNBQVksQ0FDekUsSUFBTSxFQUF5QixNQUFNLEdBQWlDLENBQVEsRUFDOUUsR0FBSSxDQUFDLEVBQXdCLE9BRTdCLElBQU0sRUFBUyxHQUE2QixFQUF1QixLQUFNLEVBQXVCLE1BQU0sRUFDdEcsR0FBSSxDQUFDLEVBQVEsT0FRYixJQUFNLEVBQWdCLEdBQW9CLEVBRnhDLEdBQThCLEVBQVEsQ0FBTSxJQUMzQyxFQUFPLFVBQVUsTUFBUyxNQUFNLEdBQTRCLEVBQU8sT0FBTyxFQUNELEVBQ3RFLEVBQVMsR0FBbUIsRUFBZSxDQUFNLEVBQ3ZELEdBQXdCLEVBQVEsQ0FBYSxFQUM3QyxHQUFvQixDQUFNLEVBRTFCLElBQU0sRUFBbUIsR0FBZSxDQUFFLEtBQU0sU0FBVSxNQUFPLENBQU8sRUFBRyxDQUFDLEVBQ3RFLEVBQWEsRUFBdUIsT0FBTyxLQUMzQyxFQUFRLEVBQXVCLEtBQUssU0FBUyxFQUF1QixNQUFNLEVBQzFFLEVBQU0sRUFBdUIsS0FBSyxPQUFPLEVBQ3pDLEVBQWEsR0FBRyxFQUFXLE1BQU0sRUFBRyxDQUFLLElBQUksSUFBbUIsRUFBVyxNQUFNLENBQUcsSUFFMUYsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBbUIsRUFBb0IsRUFBc0MsQ0FDcEYsSUFBTSxFQUF1QixJQUFJLElBQUksT0FBTyxLQUFLLEVBQVMsVUFBVSxDQUFDLEVBQy9ELEVBQWUsQ0FBQyxHQUFHLEVBQUssYUFBYyxHQUFHLEVBQVMsWUFBWSxFQUU5RCxFQUFjLENBQ2xCLEdBQUcsRUFBSyxZQUFZLE9BQVEsR0FBVyxFQUFPLE9BQVMsWUFBYyxDQUFDLEVBQXFCLElBQUksRUFBTyxHQUFHLENBQUMsRUFDMUcsR0FBRyxFQUFTLFlBQVksSUFBSyxHQUN2QixFQUFPLE9BQVMsV0FBbUIsRUFDaEMsQ0FBRSxLQUFNLFFBQVMsTUFBTyxFQUFLLGFBQWEsT0FBUyxFQUFPLEtBQU0sQ0FDeEUsQ0FDSCxFQUNNLEVBQWEsQ0FBRSxHQUFHLEVBQUssVUFBVyxFQUN4QyxJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsT0FBTyxRQUFRLEVBQVMsVUFBVSxFQUMzRCxFQUFXLEdBQU8sR0FBaUIsRUFBVyxHQUFNLENBQUssRUFFM0QsTUFBTyxDQUFFLGVBQWMsY0FBYSxZQUFXLENBQ2pELENBRUEsU0FBUyxHQUFpQixFQUErQixFQUFvQyxDQUkzRixPQUhJLEdBQU0sT0FBUyxVQUFZLEVBQVMsT0FBUyxTQUN4QyxDQUFFLEtBQU0sU0FBVSxNQUFPLEdBQW1CLEVBQUssTUFBTyxFQUFTLEtBQUssQ0FBRSxFQUUxRSxDQUNULENBRUEsU0FBUyxHQUF3QixFQUFzQixFQUFtQyxDQUN4RixJQUFNLEVBQU0sRUFBTyxXQUFXLElBQ3hCLEVBQWEsRUFBYyxXQUFXLElBQ3hDLE1BQUssT0FBUyxVQUFZLEdBQVksT0FBUyxTQUVuRCxJQUFLLElBQU0sSUFBTyxDQUFDLFFBQVMsYUFBYyxPQUFPLEVBQUcsQ0FDbEQsSUFBTSxFQUFlLEVBQVcsTUFBTSxXQUFXLEdBQzdDLElBQ0YsRUFBSSxNQUFNLFdBQVcsR0FBTyxFQUVoQyxDQUNGLENBRUEsU0FBUyxHQUE4QixFQUF1QixFQUErQixDQUMzRixPQUNFLEVBQU8sVUFBVSxNQUNqQixFQUFPLFdBQVcsWUFBYyxJQUFBLElBQ2hDLEdBQXNCLEVBQU8sV0FBVyxHQUFHLEdBQzNDLEdBQXdCLENBQUUsS0FBTSxTQUFVLE1BQU8sQ0FBTyxFQUFHLHNCQUFzQixDQUVyRixDQUVBLFNBQVMsR0FBc0IsRUFBeUMsQ0FDdEUsT0FBTyxHQUFPLE9BQVMsVUFBWSxFQUFNLE1BQU0sV0FBVyxVQUFZLElBQUEsRUFDeEUsQ0FFQSxTQUFTLEdBQXdCLEVBQW9CLEVBQThCLENBR2pGLE9BRkksRUFBTSxPQUFTLFVBQWtCLEVBQU0sTUFBTSxTQUFTLENBQVcsRUFDakUsRUFBTSxPQUFTLFFBQWdCLEVBQU0sTUFBTSxLQUFNLEdBQVUsR0FBd0IsRUFBTyxDQUFXLENBQUMsRUFFeEcsRUFBTSxNQUFNLGFBQWEsS0FBTSxHQUFXLEVBQU8sU0FBUyxDQUFXLENBQUMsR0FDdEUsT0FBTyxPQUFPLEVBQU0sTUFBTSxVQUFVLENBQUMsQ0FBQyxLQUFNLEdBQVUsR0FBd0IsRUFBTyxDQUFXLENBQUMsQ0FFckcsQ0FFQSxlQUFlLEdBQTRCLEVBQW1DLENBQzVFLElBQUssSUFBTSxLQUFlLEdBQWdCLENBQU8sRUFDL0MsR0FBSSxDQUNGLElBQU0sRUFBVSxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQWEsTUFBTSxFQUM5RCxHQUFJLDRCQUE0QixLQUFLLENBQU8sRUFDMUMsTUFBTyxFQUVYLE1BQVEsQ0FFUixDQUtGLE1BQU8sRUFDVCxDQUVBLFNBQVMsR0FBZ0IsRUFBMkIsQ0FDbEQsSUFBTSxFQUFlLENBQUMsWUFBYSxZQUFhLGdCQUFnQixFQUMxRCxFQUF5QixDQUFDLEVBRWhDLElBQUssSUFBSSxFQUFpQixFQUFLLFFBQVEsQ0FBTyxFQUM1QyxFQUFhLEtBQUssR0FBRyxFQUFhLElBQUssR0FBYSxFQUFLLFFBQVEsRUFBZ0IsQ0FBUSxDQUFDLENBQUMsRUFNckUsRUFGbEIsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFnQixNQUFNLENBQUMsR0FFaEMsRUFBSyxRQUFRLENBQ25CLElBQU0sR0FSMkIsRUFBaUIsRUFBSyxRQUFRLENBQWMsR0FXL0YsT0FBTyxDQUNULENBRUEsU0FBUyxHQUFvQixFQUE0QixDQUN2RCxJQUFNLEVBQVksRUFBTyxXQUFXLFVBQ3BDLEdBQUksR0FBVyxPQUFTLFNBQVUsT0FFbEMsSUFBTSxFQUFVLEVBQVUsTUFBTSxXQUFXLFFBSXZDLEdBQVcsQ0FBQyxHQUE4QixDQUFPLElBSXJELEVBQVUsTUFBTSxXQUFXLFFBQVUsRUFBUSxHQUFzQixDQUFDLEVBQ3RFLENBRUEsU0FBUyxHQUE4QixFQUErQixDQUVwRSxPQURJLEVBQVEsT0FBUyxXQUNkLEVBQVEsTUFBTSxLQUFLLElBQU0sR0FBc0IsQ0FDeEQsQ0FFQSxTQUFTLElBQWdDLENBQ3ZDLE1BQU8sNEJBQ1QsQ0FFQSxlQUFlLEdBQWlDLEVBQStELENBQzdHLElBQU0sRUFBUyxNQUFNLEdBQWdCLENBQVEsRUFDN0MsR0FBSSxDQUFDLEVBQVEsT0FJYixJQUFJLEVBQ0UsRUFBUyxHQUF5QixDQUNsQyxNQUNKLElBQUksRUFBSSxpQkFBaUIsQ0FBSSxHQUFLLEVBQUssV0FBVyxRQUFRLENBQU0sSUFBTSxlQUFnQixDQUNwRixJQUFNLEVBQWdCLEVBQUssVUFBVSxHQUNyQyxHQUFJLEdBQWlCLEVBQUksMEJBQTBCLENBQWEsRUFBRyxDQUNqRSxFQUFRLEVBQ1IsTUFDRixDQUNGLENBQ0EsRUFBSyxhQUFhLENBQUssQ0FEdkIsQ0FFRixFQUdBLE9BRkEsRUFBTyxhQUFhLENBQUssRUFFbEIsRUFBUSxDQUFFLFNBQVEsS0FBTSxDQUFNLEVBQUksSUFBQSxFQUMzQyxDQUVBLFNBQVMsR0FBZ0IsRUFBNEIsRUFBaUQsQ0FDcEcsR0FBSSxFQUFJLDBCQUEwQixDQUFVLEVBQUcsQ0FDN0MsSUFBTSxFQUFlLEdBQTZCLEVBQVksQ0FBTSxFQUNwRSxPQUFPLEVBQWUsQ0FBRSxLQUFNLFNBQVUsTUFBTyxDQUFhLEVBQUksRUFBUSxFQUFXLFFBQVEsQ0FBTSxDQUFDLENBQ3BHLENBQ0EsR0FBSSxFQUFJLHlCQUF5QixDQUFVLEVBQUcsQ0FDNUMsSUFBTSxFQUFXLEVBQVcsU0FBUyxJQUFLLEdBQVksR0FBZ0IsRUFBUyxDQUFNLENBQUMsRUFJdEYsT0FISSxFQUFTLEtBQU0sR0FBa0MsSUFBWSxJQUFBLEVBQVMsRUFDakUsRUFBUSxFQUFXLFFBQVEsQ0FBTSxDQUFDLEVBRXBDLEdBQVEsQ0FBeUIsQ0FDMUMsQ0FDQSxPQUFPLEVBQVEsRUFBVyxRQUFRLENBQU0sQ0FBQyxDQUMzQyxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQzBCLENBQzFCLElBQU0sRUFBdUIsQ0FBRSxhQUFjLENBQUMsRUFBRyxZQUFhLENBQUMsRUFBRyxXQUFZLENBQUMsQ0FBRSxFQUNqRixJQUFLLElBQU0sS0FBWSxFQUFjLFdBQVksQ0FDL0MsR0FBSSxFQUFJLDhCQUE4QixDQUFRLEVBQUcsQ0FDL0MsSUFBTSxFQUFNLEVBQVMsS0FBSyxRQUFRLENBQU0sRUFDeEMsRUFBTyxXQUFXLEdBQU8sRUFBUSxDQUFHLEVBQ3BDLEVBQU8sWUFBWSxLQUFLLENBQUUsS0FBTSxXQUFZLEtBQUksQ0FBQyxFQUNqRCxRQUNGLENBQ0EsR0FDRSxDQUFDLEVBQUkscUJBQXFCLENBQVEsR0FDakMsQ0FBQyxFQUFJLGFBQWEsRUFBUyxJQUFJLEdBQUssQ0FBQyxFQUFJLGdCQUFnQixFQUFTLElBQUksRUFDdkUsQ0FDQSxJQUFNLEVBQVEsRUFBTyxhQUFhLEtBQUssRUFBUyxRQUFRLENBQU0sQ0FBQyxFQUFJLEVBQ25FLEVBQU8sWUFBWSxLQUFLLENBQUUsS0FBTSxRQUFTLE9BQU0sQ0FBQyxFQUNoRCxRQUNGLENBQ0EsSUFBTSxFQUFRLEdBQWdCLEVBQVMsWUFBYSxDQUFNLEVBQzFELEdBQUksSUFBVSxJQUFBLEdBQVcsT0FDekIsSUFBTSxFQUFNLEVBQVMsS0FBSyxRQUFRLENBQU0sRUFDeEMsRUFBTyxXQUFXLEdBQU8sRUFDekIsRUFBTyxZQUFZLEtBQUssQ0FBRSxLQUFNLFdBQVksS0FBSSxDQUFDLENBQ25ELENBQ0EsT0FBTyxDQUNULENBRUEsU0FBUyxHQUFlLEVBQW9CLEVBQXVCLENBQ2pFLElBQU0sRUFBZ0IsS0FBSyxPQUFPLENBQUssRUFDdkMsR0FBSSxFQUFNLE9BQVMsUUFBUyxDQUMxQixHQUFJLEVBQU0sTUFBTSxTQUFXLEVBQUcsTUFBTyxLQUNyQyxJQUFNLEVBQVMsS0FBSyxPQUFPLEVBQVEsQ0FBQyxFQVlwQyxNQUFPLE1BWE8sRUFBTSxNQUFNLElBQUssR0FBUyxDQUN0QyxJQUFNLEVBQWMsR0FBZSxFQUFNLEVBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTTtDQUFJLEVBRTlELEdBREEsRUFBWSxFQUFZLE9BQVMsR0FBSyxHQUFHLEVBQVksR0FBRyxFQUFFLEVBQUUsR0FDeEQsRUFBSyxPQUFTLFVBQ2hCLElBQUssSUFBSSxFQUFRLEVBQUcsRUFBUSxFQUFZLE9BQVEsR0FBUyxFQUN2RCxFQUFZLEdBQVMsR0FBRyxJQUFTLEVBQVksS0FJakQsTUFEQSxHQUFZLEdBQUssR0FBRyxJQUFTLEVBQVksS0FDbEMsRUFBWSxLQUFLO0NBQUksQ0FDOUIsQ0FDaUIsQ0FBQyxDQUFDLEtBQUs7Q0FBSSxFQUFFLElBQUksRUFBYyxFQUNsRCxDQUNBLEdBQUksRUFBTSxPQUFTLFVBQVcsT0FBTyxFQUFNLE1BRTNDLElBQU0sRUFBUyxLQUFLLE9BQU8sRUFBUSxDQUFDLEVBQzlCLEVBQW9CLElBQUksSUFDeEIsRUFBeUIsR0FBMEIsRUFBTSxNQUFNLFdBQVcsRUFDMUUsRUFBUSxFQUFNLE1BQU0sWUFBWSxTQUFTLEVBQVEsSUFBVSxDQUMvRCxHQUFJLEVBQU8sT0FBUyxRQUNsQixNQUFPLENBQUMsR0FBc0IsRUFBTSxNQUFNLGFBQWEsRUFBTyxRQUFVLEdBQUksQ0FBTSxDQUFDLEVBR3JGLEdBQUksRUFBdUIsSUFBSSxFQUFPLEdBQUcsSUFBTSxFQUFPLE1BQU8sQ0FBQyxFQUM5RCxJQUFNLEVBQU8sRUFBTSxNQUFNLFdBQVcsRUFBTyxLQUczQyxNQUZJLENBQUMsR0FBUSxFQUFrQixJQUFJLEVBQU8sR0FBRyxFQUFVLENBQUMsR0FDeEQsRUFBa0IsSUFBSSxFQUFPLEdBQUcsRUFDekIsQ0FBQyxHQUF3QixFQUFPLElBQUssRUFBTSxFQUFPLENBQU0sQ0FBQyxFQUNsRSxDQUFDLEVBT0QsT0FOQSxFQUFNLEtBQ0osR0FBRyxPQUFPLFFBQVEsRUFBTSxNQUFNLFVBQVUsQ0FBQyxDQUN0QyxRQUFRLENBQUMsS0FBUyxDQUFDLEVBQWtCLElBQUksQ0FBRyxDQUFDLENBQUMsQ0FDOUMsS0FBSyxDQUFDLEVBQUssS0FBVSxHQUF3QixFQUFLLEVBQU0sRUFBTyxDQUFNLENBQUMsQ0FDM0UsRUFDSSxFQUFNLFNBQVcsRUFBVSxNQUFNLEVBQWMsR0FDNUMsTUFBTSxFQUFNLEtBQUs7Q0FBSSxFQUFFLElBQUksRUFBYyxFQUNsRCxDQUVBLFNBQVMsR0FBMEIsRUFBa0QsQ0FDbkYsSUFBTSxFQUF5QixJQUFJLElBQ25DLElBQUssR0FBTSxDQUFDLEVBQU8sS0FBVyxFQUFZLFFBQVEsRUFDNUMsRUFBTyxPQUFTLFlBQ2xCLEVBQXVCLElBQUksRUFBTyxJQUFLLENBQUssRUFHaEQsT0FBTyxDQUNULENBRUEsU0FBUyxHQUF3QixFQUFhLEVBQW1CLEVBQWUsRUFBd0IsQ0FDdEcsSUFBTSxFQUFjLEdBQWUsRUFBTSxFQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU07Q0FBSSxFQUU5RCxHQURBLEVBQVksRUFBWSxPQUFTLEdBQUssR0FBRyxFQUFZLEdBQUcsRUFBRSxFQUFFLEdBQ3hELEVBQUssT0FBUyxVQUNoQixJQUFLLElBQUksRUFBUSxFQUFHLEVBQVEsRUFBWSxPQUFRLEdBQVMsRUFDdkQsRUFBWSxHQUFTLEdBQUcsSUFBUyxFQUFZLEtBSWpELE1BREEsR0FBWSxHQUFLLEdBQUcsSUFBUyxFQUFJLElBQUksRUFBWSxLQUMxQyxFQUFZLEtBQUs7Q0FBSSxDQUM5QixDQUVBLFNBQVMsR0FBc0IsRUFBZ0IsRUFBd0IsQ0FDckUsSUFBTSxFQUFjLEVBQU8sTUFBTTtDQUFJLEVBQ3JDLEVBQVksRUFBWSxPQUFTLEdBQUssR0FBRyxFQUFZLEdBQUcsRUFBRSxFQUFFLEdBQzVELElBQUssR0FBTSxDQUFDLEVBQU8sS0FBUyxFQUFZLFFBQVEsRUFDOUMsRUFBWSxHQUFTLEdBQUcsSUFBUyxJQUVuQyxPQUFPLEVBQVksS0FBSztDQUFJLENBQzlCLENDcFVBLE1BQWEsR0FBc0IsQ0FDakMsQ0FDRSxLQUFNLFVBQ04sV0FBWSxDQUFDLGdFQUFnRSxFQUM3RSxnQkFBaUIsQ0FBRSxjQUFlLENBQUMsY0FBZSxnQkFBZ0IsQ0FBRSxDQUN0RSxFQUNBLENBQ0UsS0FBTSxVQUNOLFdBQVksQ0FDVixpRUFDQSxnRUFDRixFQUNBLGdCQUFpQixDQUFFLGNBQWUsQ0FBQyxjQUFlLGdCQUFnQixDQUFFLENBQ3RFLEVBQ0EsQ0FFRSxLQUFNLEtBQ04sV0FBWSxDQUFDLGdFQUFnRSxFQUM3RSxnQkFBaUIsQ0FBRSxjQUFlLENBQUMsY0FBZSxnQkFBZ0IsRUFBRyxXQUFZLFNBQVUsRUFDM0YsbUJBQW9CLGNBQ3RCLEVBQ0EsQ0FPRSxLQUFNLFlBQ04sV0FBWSxDQUFDLGdFQUFnRSxFQUM3RSxnQkFBaUIsQ0FBRSxjQUFlLENBQUMsYUFBYSxFQUFHLFdBQVksUUFBUyxFQUN4RSxtQkFBb0IscUJBQ3RCLEVBQ0EsQ0FDRSxLQUFNLFFBQ04sV0FBWSxDQUFDLGdFQUFnRSxFQUM3RSxnQkFBaUIsQ0FBRSxjQUFlLENBQUMsY0FBZSxnQkFBZ0IsQ0FBRSxDQUN0RSxFQUNBLENBQ0UsS0FBTSxRQUNOLFdBQVksQ0FBQyxnRUFBZ0UsRUFDN0UsZ0JBQWlCLENBQ2YsYUFBYyxDQUNaLCtCQUNBLDBDQUNBLHlCQUNBLDRCQUNBLDJCQUNBLHVCQUNBLG1CQUNGLENBQ0YsQ0FDRixFQUNBLENBQ0UsS0FBTSxTQUNOLFdBQVksQ0FBQyxnRUFBZ0UsRUFDN0UsZ0JBQWlCLENBQ2YsYUFBYyxDQUFDLHFCQUFzQix1QkFBd0IsbUJBQW1CLENBQ2xGLENBQ0YsRUFDQSxDQUNFLEtBQU0sUUFDTixXQUFZLENBQUMsZ0VBQWdFLEVBQzdFLGdCQUFpQixDQUNmLGFBQWMsQ0FBQyxxQkFBc0IsNEJBQTZCLHVCQUF3QixtQkFBbUIsQ0FDL0csQ0FDRixDQUNGLEVBU0EsSUFBSSxHQUFpQixHQUNqQixFQUNBLEVBQXVCLEdBRzNCLFNBQWdCLElBQTZCLENBQzNDLE9BQU8sRUFDVCxDQU1BLGVBQXNCLEdBQWlCLEVBQTBDLENBQy9FLE9BQU8sRUFBTywwQkFBMEIsbUJBQW9CLFNBQVksQ0FRdEUsR0FMQSxHQUFpQixHQUtiLENBQUMsRUFBVyxrQkFBbUIsT0FDbkMsSUFBTSxFQUFnQixHQUFxQixDQUFVLEVBQy9DLEVBQWMsRUFBSyxRQUFRLEVBQVcsT0FBTyxFQUNuRCxHQUFJLENBQUMsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFhLFdBQVcsQ0FBQyxFQUFHLENBRzFELEdBQUksQ0FLRixJQUFNLEVBQWlCLEdBQXNCLENBQVcsQ0FBQyxDQUFDLE9BQVEsR0FDaEUsR0FBd0IsQ0FBUSxDQUNsQyxFQUNJLEVBQWUsT0FBUyxHQUMxQixFQUNFLGtHQUFrRyxFQUFlLEtBQUssSUFBSSxFQUFFLHdCQUM5SCxDQUVKLE9BQVMsRUFBTyxDQUdkLEVBQ0UsbURBQW9ELEdBQTZCLFNBQVcsR0FDOUYsQ0FDRixDQUNBLE1BQ0YsQ0FJQSxHQUFJLENBQUMsRUFBVyx1QkFBeUIsR0FBdUMsQ0FBVSxFQUFHLENBQzNGLEVBQ0UsdUVBQXVFLEVBQVcsV0FBVyxHQUFHLEVBQVcsU0FBUywwSUFDdEgsRUFDQSxNQUNGLENBS0EsR0FBSSxDQUFDLEdBQThCLENBQVUsRUFBRyxDQUM5QyxFQUNFLGlGQUFpRixFQUFXLFdBQVcsR0FBRyxFQUFXLFNBQVMsOEpBQ2hJLEVBQ0EsTUFDRixDQUlBLElBQU0sRUFBWSxJQUFJLElBR3RCLEdBQUksQ0FJRixJQUFLLElBQUksRUFBVSxFQUFLLFFBQVEsQ0FBVyxHQUFLLEVBQVUsRUFBSyxRQUFRLENBQU8sRUFBRyxDQUMvRSxJQUFNLEVBQXdCLEdBQXNCLENBQU8sRUFDM0QsR0FBSSxFQUFzQixPQUFTLEVBQUcsQ0FDcEMsRUFDRSxtSkFBbUosRUFDaEosSUFBSyxHQUFTLEVBQUssS0FBSyxFQUFTLENBQUksQ0FBQyxDQUFBLENBQ3RDLEtBQUssSUFBSSxFQUFFLHNDQUNoQixFQUNBLE1BQ0YsQ0FDQSxHQUFJLEVBQUssUUFBUSxDQUFPLElBQU0sRUFBUyxLQUN6QyxDQUVBLElBQU0sRUFBb0IsR0FBc0IsQ0FBVyxFQUNyRCxFQUF1QixFQUFrQixPQUFRLEdBQWEsRUFBSyxTQUFTLENBQVEsSUFBTSxXQUFXLEVBQzNHLEdBQUksRUFBcUIsT0FBUyxFQUFHLENBQ25DLEVBQ0UseUZBQXlGLEVBQXFCLEtBQUssSUFBSSxFQUFFLDBDQUMzSCxFQUNBLE1BQ0YsQ0FDQSxJQUFNLEVBQVcsR0FBcUIsQ0FBaUIsRUFDdkQsR0FBSSxDQUFDLEVBQVMsU0FBUyxDQUFXLEVBQUcsQ0FDbkMsRUFDRSxxREFBcUQsRUFBSyxRQUFRLEVBQWEsV0FBVyxFQUFFLDREQUM5RixFQUNBLE1BQ0YsQ0FLQSxJQUFNLEVBQWtCLElBQUksSUFBSSxDQUFRLEVBQ3hDLElBQUssSUFBTSxLQUFXLEVBQ3BCLElBQUssSUFBTSxLQUFvQixHQUFxQixFQUFTLENBQVcsRUFBRyxDQUN6RSxJQUFNLEVBQWlCLEdBQXNCLENBQWdCLENBQUMsQ0FBQyxPQUM1RCxHQUFTLElBQVMsbUJBQXFCLEVBQUUsSUFBUyxhQUFlLEVBQWdCLElBQUksQ0FBZ0IsRUFDeEcsRUFDQSxHQUFJLEVBQWUsT0FBUyxFQUFHLENBQzdCLEVBQ0Usc0dBQXNHLEVBQ25HLElBQUssR0FBUyxFQUFLLEtBQUssRUFBa0IsQ0FBSSxDQUFDLENBQUEsQ0FDL0MsS0FBSyxJQUFJLEVBQUUsMkNBQ2hCLEVBQ0EsTUFDRixDQUdBLElBQU0sRUFBYSxHQUF1QixDQUFnQixFQUMxRCxHQUFJLEVBQVksQ0FDZCxFQUNFLHFEQUFxRCxFQUFXLGtEQUNsRSxFQUNBLE1BQ0YsQ0FDRixDQVVGLEdBREEsRUFBc0IsRUFBSyxRQUFRLEVBQWEsT0FBUSw0QkFBNEIsRUFDaEYsRUFBRyxXQUFXLENBQW1CLEVBQUcsQ0FDdEMsRUFDRSxnUEFBZ1AsRUFBb0IsaUJBQ3RRLEVBQ0EsTUFDRixDQUlBLElBQU0sRUFBa0IsRUFBRyxhQUFhLENBQVcsRUFDbkQsSUFBSyxJQUFNLEtBQVcsRUFBVSxDQUM5QixJQUFNLEVBQWUsRUFBSyxRQUFRLEVBQVMsV0FBVyxFQUNoRCxFQUFXLEVBQUcsYUFBYSxDQUFZLEVBQzdDLEdBQUksRUFBRyxVQUFVLENBQVksQ0FBQyxDQUFDLGVBQWUsR0FBSyxDQUFDLEVBQVMsV0FBVyxFQUFrQixFQUFLLEdBQUcsRUFBRyxDQUNuRyxFQUNFLHFEQUFxRCxFQUFhLG9EQUFvRCxFQUFTLGlEQUNqSSxFQUNBLE1BQ0YsQ0FDQSxFQUFVLElBQUksRUFBYyxFQUFHLGFBQWEsRUFBYyxNQUFNLENBQUMsQ0FDbkUsQ0FJQSxJQUFNLEVBQTRCLENBQUMsRUFDL0IsRUFBWSxHQUNoQixJQUFLLElBQU0sS0FBVyxFQUFVLENBQzlCLElBQU0sRUFBa0IsRUFBZ0IsS0FBTSxHQUFtQixFQUFRLFdBQVcsRUFBaUIsRUFBSyxHQUFHLENBQUMsRUFJeEcsRUFBa0IsRUFBVSxJQUFJLEVBQUssUUFBUSxFQUFTLFdBQVcsQ0FBQyxFQUN4RSxHQUFJLElBQW9CLElBQUEsR0FBVyxNQUFVLE1BQU0sa0NBQWtDLEVBQVEsRUFBRSxFQUMvRixJQUFNLEVBQVMsTUFBTSxHQUNuQixFQUNBLEVBQ0EsSUFBWSxFQUNaLEVBQ0EsRUFDQSxDQUNGLEVBQ0ksSUFBVyxXQUFXLEVBQWdCLEtBQUssQ0FBTyxFQUN0RCxJQUFjLElBQVcsUUFDM0IsQ0FDSSxFQU1FLEdBQXdCLEdBQWlCLENBQVMsR0FBRyxHQUEyQixFQUVwRixHQUEyQixDQUUvQixPQUFTLEVBQU8sQ0FDVixHQUF3QixHQUFpQixDQUFTLEdBQ3BELEdBQTJCLEVBRTdCLEVBQWEscURBQXNELEdBQTZCLE9BQVMsR0FBTyxDQUNsSCxRQUFVLENBQ1IsRUFBc0IsSUFBQSxHQUN0QixFQUF1QixFQUN6QixDQUNGLENBQUMsQ0FDSCxDQUVBLGVBQWUsR0FDYixFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDNkMsQ0FDN0MsSUFBTSxFQUFlLEVBQUssUUFBUSxFQUFTLFdBQVcsRUFTaEQsRUFBdUIsR0FBc0IsQ0FBTyxDQUFDLENBQUMsT0FDekQsR0FBUyxJQUFTLGFBQWUsSUFBUyxpQkFDN0MsRUFDQSxHQUFJLEVBQXFCLE9BQVMsRUFJaEMsT0FIQSxFQUNFLGdEQUFnRCxFQUFRLDZEQUE2RCxFQUFxQixLQUFLLElBQUksRUFBRSw2QkFDdkosRUFDTyxTQUtULEdBQTRCLEVBQWEsQ0FBTyxFQUVoRCxJQUFNLEVBQWMsR0FBb0IsQ0FBZSxFQUN2RCxHQUFJLEVBRUYsT0FEQSxFQUFhLHFEQUFxRCxFQUFhLEdBQUcsRUFBWSxFQUFFLEVBQ3pGLFNBRVQsSUFBTSxFQUFXLElBQUksS0FBSyxNQUFNLENBQWUsRUFDekMsRUFBZSxPQUFPLEtBQUssRUFBUyxVQUFZLENBQUMsQ0FBQyxFQUNsRCxFQUFvQixHQUFzQixDQUFlLEVBTS9ELEdBQUksQ0FBQyxHQUFVLENBQUMsRUFVZCxPQVRJLElBQ0YsR0FBcUIsRUFDakIsQ0FBQyxHQUFxQixFQUFTLEVBQWEsQ0FBWSxJQUMxRCxFQUNFLHdDQUF3QyxFQUFRLDJEQUNsRCxFQUNPLFVBR0osWUFHVCxHQUNFLEdBQ0EsRUFBa0IsT0FBUyxFQUFjLFFBQ3pDLEVBQWMsTUFBTyxHQUFjLEVBQWtCLElBQUksRUFBVSxTQUFTLENBQUMsRUFFN0UsTUFBTyxZQU1ULElBQU0sRUFBaUIsR0FBcUIsRUFBaUIsQ0FBYSxFQUNwRSxFQUFvQixDQUFDLEdBQUksR0FBc0IsQ0FBYyxHQUFLLENBQUMsQ0FBRSxFQUMzRSxHQUNFLEVBQWtCLFNBQVcsRUFBYyxRQUMzQyxDQUFDLEVBQWMsTUFBTyxHQUFjLEVBQWtCLFNBQVMsRUFBVSxTQUFTLENBQUMsRUFFbkYsTUFBVSxNQUFNLG1DQUFtQyxFQUFhLDRDQUE0QyxFQWU5RyxPQWJBLEdBQXFCLEVBQ3JCLE1BQU0sRUFBTyxhQUFhLEVBQWMsQ0FBYyxFQUVqRCxHQUFxQixFQUFTLEVBQWEsQ0FBWSxFQVVyRCxXQU5MLE1BQU0sRUFBTyxhQUFhLEVBQWMsQ0FBZSxFQUN2RCxFQUNFLHdDQUF3QyxFQUFRLDJEQUNsRCxFQUNPLFNBR1gsQ0FPQSxTQUFTLEdBQW9CLEVBQTZDLENBQ3hFLEdBQUksQ0FDRixJQUFNLEVBQVcsSUFBSSxLQUFLLE1BQU0sQ0FBZSxFQUMvQyxHQUFJLEVBQVMsU0FBVyxJQUFBLEdBQVcsTUFBTyx3Q0FDMUMsSUFBTSxFQUE4QixPQUFPLFFBQVEsRUFBUyxXQUFhLENBQUMsQ0FBQyxDQUFBLENBQ3hFLFFBQVEsQ0FBQyxFQUFNLEtBQWUsR0FBVSxPQUFTLFFBQVksSUFBUyxNQUFNLENBQUEsQ0FDNUUsS0FBSyxDQUFDLEtBQVUsQ0FBSSxFQUN2QixHQUFJLEVBQTRCLE9BQVMsRUFDdkMsTUFBTyxzRkFBc0YsRUFBNEIsS0FBSyxJQUFJLElBRXBJLElBQU0sRUFBd0IsT0FBTyxRQUFRLEVBQVMsVUFBWSxDQUFDLENBQUMsQ0FBQSxDQUNqRSxRQUFRLEVBQUcsS0FBYSxHQUFTLFNBQVMsQ0FBQSxDQUMxQyxLQUFLLENBQUMsS0FBVSxDQUFJLEVBSXZCLE9BSEksRUFBc0IsT0FBUyxFQUMxQixvREFBb0QsRUFBc0IsS0FBSyxJQUFJLElBRTVGLE1BQ0YsTUFBUSxDQUNOLE1BQU8sMEJBQ1QsQ0FDRixDQU1BLFNBQWdCLEdBQXNCLEVBQWtELENBQ3RGLEdBQUksQ0FDRixJQUFNLEVBQVcsSUFBSSxLQUFLLE1BQU0sQ0FBZSxFQUMvQyxHQUFJLENBQUMsRUFBUyxXQUFXLElBQUssT0FDOUIsSUFBTSxFQUFhLEVBQVMsVUFBVSxJQUFJLFdBQzFDLE9BQU8sSUFBSSxJQUFJLE1BQU0sUUFBUSxDQUFVLEVBQUksRUFBVyxPQUFRLEdBQW1CLE9BQU8sR0FBTSxRQUFRLEVBQUksQ0FBQyxDQUFDLENBQzlHLE1BQVEsQ0FFTixPQUFPLElBQUksR0FDYixDQUNGLENBU0EsU0FBZ0IsR0FDZCxFQUNvRCxDQUtwRCxPQUprRCxHQUFvQixLQUNuRSxHQUNDLEVBQVUsb0JBQXNCLEdBQTJCLEVBQVUsZ0JBQWlCLENBQU0sQ0FFL0UsQ0FBQyxFQUFFLGtCQUN0QixDQUdBLFNBQWdCLEdBQ2QsRUFDUyxDQUNULElBQU0sRUFBaUIsR0FDckIsR0FBcUIsQ0FBRSxHQUFHLEVBQVksZUFBYyxzQkFBdUIsRUFBSyxDQUFDLENBQUEsQ0FDOUUsS0FBSyxDQUFFLGVBQWdCLENBQVMsQ0FBQSxDQUNoQyxLQUFLO0NBQUksRUFDZCxPQUFPLEVBQWMsRUFBSSxJQUFNLEVBQWMsRUFBSyxDQUNwRCxDQUVBLFNBQWdCLEdBQXFCLEVBQXdELENBQzNGLE9BQU8sR0FBb0IsT0FBUSxHQUNqQyxHQUEyQixFQUFVLGdCQUFpQixDQUFVLENBQ2xFLENBQUMsQ0FBQyxRQUFTLEdBQ1QsRUFBVSxXQUFXLEtBQUssRUFBVyxLQUFXLENBQzlDLEtBQU0sRUFBVSxXQUFXLFNBQVcsRUFBSSxFQUFVLEtBQU8sR0FBRyxFQUFVLE9BQU8sRUFBUSxJQUN2RixXQUNGLEVBQUUsQ0FDSixDQUNGLENBRUEsU0FBZ0IsR0FBMkIsRUFBNEIsRUFBNkMsQ0FDbEgsSUFBTSxFQUFRLEVBQVcsWUFBWSxZQUFZLEVBQzNDLEVBQU8sRUFBVyxVQUFVLFlBQVksRUFZOUMsTUFYSSxDQUFDLEdBQVMsQ0FBQyxHQUtiLEVBQU0sYUFDTCxDQUFDLEVBQVcsdUJBQTBCLEVBQU0sYUFBZSxXQUFjLEVBQVcsY0FFOUUsSUFJTixFQUFNLGVBQWUsS0FBTSxHQUFpQixFQUFhLFlBQVksSUFBTSxDQUFLLEdBQUssTUFDckYsRUFBTSxjQUFjLEtBQU0sR0FBYSxFQUFTLFlBQVksSUFBTSxHQUFHLEVBQU0sR0FBRyxHQUFNLEdBQUssR0FFOUYsQ0FFQSxTQUFTLEdBQXFCLEVBQWlCLEVBQW9ELENBRWpHLElBQU0sRUFBaUIsbUJBQW1CLEVBQ3ZDLElBQUssR0FBYyxNQUFNLEVBQVUsVUFBVSxPQUFPLEVBQVUsTUFBTSxDQUFBLENBQ3BFLEtBQUs7Q0FBSSxFQUFFLEtBUVIsRUFBUSxFQUFRLE1BQU07Q0FBSSxFQUMxQixFQUFjLEVBQU0sVUFBVyxHQUFTLHNDQUFzQyxLQUFLLENBQUksQ0FBQyxFQUM5RixHQUFJLElBQWdCLEdBQUksQ0FDdEIsSUFBSSxFQUFXLEVBQU0sT0FDckIsSUFBSyxJQUFJLEVBQVEsRUFBYyxFQUFHLEVBQVEsRUFBTSxPQUFRLElBQ3RELEdBQUksVUFBVSxLQUFLLEVBQU0sSUFBVSxFQUFFLEVBQUcsQ0FDdEMsRUFBVyxFQUNYLEtBQ0YsQ0FFRixJQUFNLEVBQVUsRUFBTSxNQUFNLEVBQWEsQ0FBUSxDQUFDLENBQUMsS0FBSztDQUFJLEVBQ3RELEVBQWtCLEVBQVEsUUFBUSxvQ0FBcUMsQ0FBYyxFQUNyRixFQUNKLElBQW9CLEVBQ2hCLENBQUMsRUFBTSxHQUFjLEVBQWdCLEdBQUcsRUFBTSxNQUFNLEVBQWMsRUFBRyxDQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUs7Q0FBSSxFQUN6RixFQUNOLE1BQU8sQ0FBQyxHQUFHLEVBQU0sTUFBTSxFQUFHLENBQVcsRUFBRyxFQUFZLEdBQUcsRUFBTSxNQUFNLENBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSztDQUFJLENBQ3pGLENBQ0EsTUFBTyxHQUFHLEVBQVEsUUFBUSxFQUFFLHFDQUFxQyxFQUFlLEdBQ2xGLENBUUEsU0FBUyxHQUFxQixFQUFpQixFQUFxQixFQUFpQyxDQUduRyxJQUFNLEVBQVcsR0FBeUIsR0FBSyxRQUFRLElBQUksYUFDckQsRUFBYyxHQUFtQixDQUFPLEVBQ3hDLEVBQXNCLEVBQUcsWUFBWSxFQUFLLEtBQUssRUFBRyxPQUFPLEVBQUcsaUJBQWlCLENBQUMsRUFDcEYsR0FBSSxDQUlGLE9BQU8sR0FBcUIsRUFBYSxHQUFxQixFQUFTLENBQVcsTUFBUyxDQUN6RixJQUFNLEVBQU0sQ0FDVixHQUFHLE9BQU8sWUFBWSxPQUFPLFFBQVEsUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBUyxDQUFDLEVBQUksV0FBVyxPQUFPLENBQUMsQ0FBQyxFQUM3RixHQUFJLEVBQVcsQ0FBRSxhQUFjLENBQVMsRUFBSSxDQUFDLEVBQzdDLEtBQU0sRUFDTixnQkFBaUIsQ0FDbkIsRUFDTSxFQUFrQixDQUFDLENBQUMsRUFBRyxHQUFHLEVBQWEsSUFBSyxHQUFTLENBQUMsZ0JBQWlCLGFBQWEsR0FBTSxDQUFDLENBQUMsRUFDbEcsSUFBSyxJQUFNLEtBQWUsRUFBaUIsQ0FDekMsSUFBTSxFQUFPLENBQUMsWUFBYSxVQUFXLGNBQWUsYUFBYyxNQUFPLEdBQUcsQ0FBVyxFQVF4RixJQU5hLEVBQWMsVUFBVSxFQUFhLEVBQU0sQ0FDdEQsSUFBSyxFQUNMLFNBQVUsT0FDVixNQUFPLFVBQ1AsS0FDRixDQUNRLENBQUMsQ0FBQyxRQUFVLEtBQU8sRUFBRyxNQUFPLEVBQ3ZDLENBQ0EsTUFBTyxFQUNULENBQUMsQ0FDSCxRQUFVLENBQ1IsRUFBRyxPQUFPLEVBQXFCLENBQUUsVUFBVyxHQUFNLE1BQU8sRUFBSyxDQUFDLENBQ2pFLENBQ0YsQ0FPQSxTQUFTLEdBQW1CLEVBQXlCLENBQ25ELElBQU0sRUFBTyxFQUFjLFVBQVUsT0FBUSxDQUFDLFFBQVMsTUFBTSxFQUFHLENBQUUsSUFBSyxFQUFTLFNBQVUsT0FBUSxNQUFPLE1BQU8sQ0FBQyxFQUVqSCxPQURpQixFQUFLLFNBQVcsRUFBSSxFQUFLLE9BQU8sS0FBSyxFQUFJLEtBQ3ZDLE1BQ3JCLENBR0EsSUFBSSxHQUE4QixHQUM5QixHQUVKLFNBQVMsSUFBK0MsQ0FDdEQsR0FBSSxHQUE2QixPQUFPLEdBQ3hDLEdBQThCLEdBQzlCLEdBQUksQ0FFRixHQURnQixFQUFHLGFBQWEsRUFBSyxLQUFLLEVBQUcsUUFBUSxFQUFHLFVBQVcsT0FBUSxTQUFTLEVBQUcsTUFDcEQsQ0FBQSxDQUNoQyxNQUFNO0NBQUksQ0FBQSxDQUNWLEtBQU0sR0FBUyxFQUFLLEtBQUssQ0FBQyxDQUFDLFdBQVcsaUJBQWlCLENBQUMsQ0FBQSxFQUN2RCxLQUFLLENBQ1gsTUFBUSxDQUNOLEdBQTZCLElBQUEsRUFDL0IsQ0FDQSxPQUFPLEVBQ1QsQ0FPQSxTQUFTLEdBQXdCLEVBQXFCLEVBQW9CLEVBQWtCLENBQzFGLElBQU0sRUFBMkIsQ0FBQyxFQUNsQyxHQUFJLENBQ0YsSUFBSyxJQUFNLEtBQVcsRUFBVSxDQUM5QixHQUE0QixFQUFhLENBQU8sRUFDaEQsSUFBTSxFQUFZLEVBQUssUUFBUSxFQUFTLGlCQUFpQixFQUN6RCxHQUFJLEVBQUcsV0FBVyxDQUFTLEVBQUcsQ0FDNUIsSUFBTSxFQUFhLEdBQW9CLEVBQWEsQ0FBTyxFQUMzRCxHQUE2QixFQUFhLENBQVUsRUFDcEQsRUFBRyxXQUFXLEVBQVcsQ0FBVSxFQUNuQyxFQUFlLEtBQUssQ0FBTyxDQUM3QixDQUNGLENBQ0EsSUFBTSxFQUFTLEVBQUssRUFLcEIsT0FEQSxHQUF3QixFQUFhLENBQWMsRUFDNUMsQ0FDVCxPQUFTLEVBQU8sQ0FHZCxHQUFJLENBQ0YsR0FBd0IsRUFBYSxDQUFjLENBQ3JELE9BQVMsRUFBYyxDQUNyQixFQUFjLEdBQW9DLFNBQVcsT0FBTyxDQUFZLENBQUMsQ0FDbkYsQ0FDQSxNQUFNLENBQ1IsQ0FDRixDQUtBLFNBQVMsR0FBd0IsRUFBcUIsRUFBZ0MsQ0FDcEYsSUFBTSxFQUFrQyxDQUFDLEVBQ3pDLElBQUssSUFBTSxLQUFXLEVBQWUsT0FBTyxDQUFDLEVBQUcsQ0FDOUMsSUFBTSxFQUFZLEVBQUssUUFBUSxFQUFTLGlCQUFpQixFQUN6RCxHQUFJLEVBQUcsV0FBVyxDQUFTLEVBQUcsQ0FDNUIsRUFBc0IsS0FBSyxDQUFTLEVBQ3BDLFFBQ0YsQ0FDQSxFQUFHLFdBQVcsR0FBb0IsRUFBYSxDQUFPLEVBQUcsQ0FBUyxDQUNwRSxDQUNBLEdBQUksRUFBc0IsT0FBUyxFQUNqQyxNQUFVLE1BQ1IsaUhBQWlILEVBQUssUUFBUSxFQUFhLE9BQVEsd0JBQXdCLEVBQUUsMkJBQTJCLEVBQXNCLEtBQUssSUFBSSxHQUN6TyxDQUVKLENBTUEsU0FBUyxHQUE0QixFQUFxQixFQUF1QixDQUMvRSxJQUFNLEVBQVksRUFBSyxRQUFRLEVBQVMsaUJBQWlCLEVBQ25ELEVBQWEsR0FBb0IsRUFBYSxDQUFPLEVBQ3RELEtBQUcsV0FBVyxDQUFVLEVBQzdCLElBQUksRUFBRyxXQUFXLENBQVMsRUFDekIsTUFBVSxNQUFNLFFBQVEsRUFBVSxrQkFBa0IsRUFBVyw4Q0FBOEMsRUFFL0csR0FBNkIsRUFBYSxDQUFVLEVBQ3BELEVBQUcsV0FBVyxFQUFZLENBQVMsQ0FINEUsQ0FJakgsQ0FNQSxTQUFTLEdBQTZCLEVBQXFCLEVBQTBCLENBQ25GLElBQU0sRUFBZ0IsRUFBSyxRQUFRLENBQVUsRUFDN0MsRUFBRyxVQUFVLEVBQWUsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUMvQyxJQUFNLEVBQW1CLEVBQUssS0FBSyxFQUFHLGFBQWEsQ0FBVyxFQUFHLEVBQUssU0FBUyxFQUFhLENBQWEsQ0FBQyxFQUMxRyxHQUFJLEVBQUcsYUFBYSxDQUFhLElBQU0sRUFDckMsTUFBVSxNQUFNLEdBQUcsRUFBYyw2REFBNkQsQ0FFbEcsQ0FLQSxTQUFTLEdBQW9CLEVBQXFCLEVBQXlCLENBQ3pFLE9BQU8sRUFBSyxRQUNWLEVBQ0EsT0FDQSx5QkFDQSxFQUFLLFNBQVMsRUFBYSxDQUFPLEVBQ2xDLGlCQUNGLENBQ0YsQ0FFQSxTQUFTLElBQTZCLENBQ3BDLEdBQUksQ0FBQyxHQUF1QixFQUFzQixPQUNsRCxJQUFNLEVBQWEsRUFBSyxRQUFRLENBQW1CLEVBTW5ELEdBTEEsRUFBRyxVQUFVLEVBQVksQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUt4QyxFQUFHLFVBQVUsQ0FBVSxDQUFDLENBQUMsZUFBZSxFQUMxQyxNQUFVLE1BQU0sR0FBRyxFQUFXLG9EQUFvRCxFQUVwRixHQUFJLENBQ0YsRUFBRyxjQUNELEVBQ0E7RUFDQSxDQUNFLEtBQU0sSUFDUixDQUNGLENBQ0YsT0FBUyxFQUFPLENBQ2QsTUFBVSxNQUFNLGlEQUFpRCxFQUFvQixZQUFZLEdBQU8sQ0FDMUcsQ0FDQSxFQUF1QixFQUN6QixDQUlBLFNBQVMsSUFBbUMsQ0FDdEMsQ0FBQyxHQUF3QixDQUFDLElBQzlCLEVBQUcsT0FBTyxFQUFxQixDQUFFLE1BQU8sRUFBSyxDQUFDLEVBQzlDLEVBQXVCLEdBQ3pCLENBRUEsU0FBUyxHQUFpQixFQUF5QyxDQUNqRSxJQUFJLEVBQVksR0FDaEIsSUFBSyxHQUFNLENBQUMsRUFBVSxLQUFZLEVBQ2hDLEdBQUksQ0FDRixFQUFHLGNBQWMsRUFBVSxDQUFPLENBQ3BDLE9BQVMsRUFBTyxDQUNkLEVBQWEscUJBQXFCLEVBQVMsNkJBQTZCLEdBQU8sRUFDL0UsRUFBWSxFQUNkLENBRUYsT0FBTyxDQUNULENBRUEsU0FBUyxFQUFhLEVBQXVCLENBQzNDLFFBQVEsTUFBTSxDQUFPLEVBQ3JCLFFBQVEsU0FBVyxFQUNuQixHQUFpQixFQUNuQixDQUtBLFNBQVMsR0FBdUIsRUFBcUMsQ0FDbkUsSUFBTSxFQUFnQixFQUFLLFFBQVEsRUFBUyxpQkFBaUIsRUFDN0QsR0FBSSxDQUFDLEVBQUcsV0FBVyxDQUFhLEVBQUcsT0FDbkMsSUFBTSxFQUFnQixJQUFJLEtBQUssTUFBTSxFQUFHLGFBQWEsRUFBZSxNQUFNLENBQUMsRUFLM0UsT0FIRSxFQUFjLFNBQVcsSUFBQSxJQUN6QixFQUFjLFlBQWMsSUFBQSxJQUM1QixPQUFPLE9BQU8sRUFBYyxVQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBTSxHQUFZLEdBQVMsWUFBYyxJQUFBLEVBQVMsRUFDdEUsR0FBRyxFQUFjLG1EQUFxRCxJQUFBLEVBQ2xHLENBT0EsU0FBUyxHQUFxQixFQUF1QyxDQUNuRSxNQUFPLENBQ0wsR0FBRyxJQUFJLElBQ0wsRUFDRyxPQUFRLEdBQWEsRUFBSyxTQUFTLENBQVEsSUFBTSxXQUFXLENBQUEsQ0FDNUQsSUFBSyxHQUFhLEVBQUssUUFBUSxDQUFRLENBQUMsQ0FDN0MsQ0FDRixDQUFDLENBQUMsU0FBUyxDQUNiLENBUUEsU0FBUyxHQUF3QixFQUEyQixDQUMxRCxJQUFJLEVBQ0osR0FBSSxDQUNGLEVBQVUsRUFBRyxhQUFhLEVBQVUsTUFBTSxDQUM1QyxNQUFRLENBRU4sTUFBTyxFQUNULENBQ0EsR0FBSSxDQUNGLE1BQU8sRUFBUyxJQUFJLEtBQUssTUFBTSxDQUFPLENBQUMsQ0FBYyxXQUFXLEdBQ2xFLE1BQVEsQ0FFTixNQUFPLEVBQ1QsQ0FDRixDQVVBLFNBQWdCLEdBQXNCLEVBQTJCLENBRy9ELElBQU0sRUFBVyxFQUFTLE1BQU0sR0FBRyxFQUNuQyxPQUFPLEVBQVMsTUFDYixFQUFTLElBQ1IsSUFBWSxpQkFDWixJQUFZLGFBQ1gsSUFBWSxhQUFlLEVBQVMsRUFBUSxLQUFPLFFBQVUsRUFBUyxFQUFRLEtBQU8sUUFDMUYsQ0FDRixDQUVBLFNBQVMsR0FBc0IsRUFBK0IsQ0FHNUQsSUFBTSxFQUFPLEVBQWMsVUFDekIsTUFDQSxDQUFDLFdBQVksS0FBTSxXQUFZLFdBQVkscUJBQXNCLEtBQU0sYUFBYSxFQUNwRixDQUFFLElBQUssRUFBYSxTQUFVLE9BQVEsTUFBTyxNQUFPLENBQ3RELEVBR0EsR0FBSSxFQUFLLFNBQVcsRUFDbEIsTUFBVSxNQUFNLDBCQUEwQixFQUFZLEtBQUssRUFBSyxRQUFVLEVBQUssT0FBTyxTQUFXLEdBQUEsQ0FBSSxLQUFLLEdBQUcsRUFFL0csT0FBTyxFQUFLLE9BQ1QsTUFBTSxJQUFJLENBQUEsQ0FDVixPQUFRLEdBQVMsMEJBQTBCLEtBQUssRUFBSyxTQUFTLENBQUksQ0FBQyxHQUFLLENBQUMsR0FBc0IsQ0FBSSxDQUFDLENBQUEsQ0FDcEcsSUFBSyxHQUFTLEVBQUssUUFBUSxFQUFhLENBQUksQ0FBQyxDQUNsRCxDQUVBLFNBQVMsR0FBc0IsRUFBMkIsQ0FDeEQsR0FBSSxDQUNGLE9BQU8sRUFDSixZQUFZLENBQU8sQ0FBQSxDQUNuQixPQUFRLEdBQVMsMEJBQTBCLEtBQUssQ0FBSSxDQUFDLENBQUEsQ0FDckQsU0FBUyxDQUNkLE9BQVMsRUFBTyxDQUNkLEdBQUssR0FBeUMsT0FBUyxTQUFVLE1BQU8sQ0FBQyxFQUd6RSxNQUFVLE1BQU0sa0JBQWtCLEVBQVEscUJBQXFCLEdBQU8sQ0FDeEUsQ0FDRixDQUVBLFNBQVMsR0FBcUIsRUFBaUIsRUFBK0IsQ0FDNUUsSUFBTSxFQUFXLENBQUMsQ0FBTyxFQUN6QixLQUFPLEVBQVMsR0FBRyxFQUFFLElBQU0sR0FBYSxDQUN0QyxJQUFNLEVBQVMsRUFBSyxRQUFRLEVBQVMsR0FBRyxFQUFFLEdBQUssRUFBRSxFQUNqRCxHQUFJLElBQVcsRUFBUyxHQUFHLEVBQUUsRUFBRyxNQUNoQyxFQUFTLEtBQUssQ0FBTSxDQUN0QixDQUNBLE9BQU8sQ0FDVCxDQzUzQkEsU0FBZ0IsR0FBa0IsRUFBdUIsRUFBdUIsQ0FDOUUsT0FBTyxDQUNULENBRUEsU0FBZ0IsR0FBYSxFQUFtQixFQUFtQixFQUE2QyxDQUM5RyxJQUFNLEVBQWMsQ0FBQyxHQUFHLENBQU0sRUFFOUIsSUFBSyxHQUFNLENBQUMsRUFBTyxLQUFTLEVBQU8sUUFBUSxFQUNyQyxFQUFZLEtBQVcsSUFBQSxHQUN6QixFQUFZLEdBQVMsR0FBOEIsRUFBTSxDQUFPLEVBQ3ZELEdBQWtCLEVBQU8sR0FBUSxDQUFPLEdBQUssR0FBa0IsRUFBTSxDQUFPLEVBQ3JGLEVBQVksR0FBUyxFQUFNLEVBQU8sR0FBUSxFQUFNLENBQU8sRUFDN0MsRUFBTyxTQUFTLENBQUksR0FDOUIsRUFBWSxLQUFLLENBQUksRUFHekIsT0FBTyxDQUNULENBRUEsU0FBUyxHQUE4QixFQUFnQixFQUEyQyxDQUNoRyxPQUFPLEdBQWtCLEVBQU8sQ0FBTyxFQUFJLEVBQVEsOEJBQThCLEVBQU8sQ0FBTyxFQUFJLENBQ3JHLENBRUEsU0FBUyxHQUFrQixFQUFnQixFQUFtRCxDQUM1RixNQUFPLENBQUMsQ0FBQyxHQUFTLE9BQU8sR0FBVSxVQUFZLEVBQVEsa0JBQWtCLENBQUssQ0FDaEYsQ0MzQkEsU0FBZ0IsR0FDZCxFQUNBLEVBQ00sQ0FDTixJQUFNLEVBQVEsRUFBSSxHQUlsQixPQUZBLE9BQU8sRUFBSSxHQUNYLEVBQStCLEdBQU8sRUFDL0IsQ0FDVCxDQUVBLFNBQWdCLEVBQTRDLEVBQVcsQ0FDckUsSUFBTSxFQUFlLE9BQU8sUUFBUSxDQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBTyxDQUFDLEtBQVUsRUFBSyxjQUFjLENBQUksQ0FBQyxFQUM5RixJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsRUFHekIsT0FBTyxFQUFJLEdBQ1gsRUFBaUMsR0FBTyxFQUVwQyxHQUFTLE9BQU8sR0FBVSxVQUFZLENBQUMsTUFBTSxRQUFRLENBQUssR0FDNUQsRUFBUyxDQUFnQyxFQUc3QyxPQUFPLENBQ1QsQ0NRQSxTQUFnQixHQUF3QixFQUF1QyxDQUM3RSxNQUFPLENBQ0wsR0FBRyxJQUFJLElBQ0wsR0FBNkIsQ0FBUSxDQUFDLENBQUMsSUFBSyxHQUMxQyxFQUFLLFFBQVEsRUFBUyxRQUFTLEVBQUssTUFBTSxRQUFRLENBQWUsQ0FBQyxDQUNwRSxDQUNGLENBQ0YsQ0FBQyxDQUFDLFNBQVMsQ0FDYixDQU9BLFNBQWdCLEdBQTZCLEVBQXlDLENBQ3BGLE9BQU8sRUFBaUMsR0FBOEIsQ0FBVSxFQUFHLEVBQVcsT0FBTyxDQUN2RyxDQXVCQSxTQUFnQixHQUF3QixFQUFtRCxDQUl6RixJQUFNLEVBQ0osRUFBUyw0QkFHVCxDQUFDLEdBQTZCLEVBQVMsYUFBYSxVQUFVLEdBQzlELEVBQUcsU0FBUywwQkFBMkIsQ0FDckMsSUFBSyxFQUFTLFFBQ2Qsb0JBQXFCLEdBQ3JCLE9BQVEsQ0FBQyxvQkFBb0IsQ0FDL0IsQ0FBQyxDQUFDLENBQUMsT0FBUyxFQUNSLEVBQW9CLEdBQThCLENBQ3RELEdBQUcsRUFDSCwyQkFBNEIsQ0FDOUIsQ0FBQyxFQUNLLEVBQW9CLElBQUksSUFDNUIsRUFBaUMsRUFBbUIsRUFBUyxPQUFPLENBQUMsQ0FBQyxJQUFLLEdBQ3pFLEVBQUssTUFBTSxRQUFRLENBQWUsQ0FDcEMsQ0FDRixFQUNNLEVBQVcsSUFBSSxJQUNmLEVBQTJCLENBQUMsRUFDbEMsSUFBSyxJQUFNLEtBQW9CLEVBQW1CLENBQ2hELElBQU0sRUFBYSxFQUFpQixXQUFXLEdBQUcsRUFDNUMsRUFBYyxHQUE4QixFQUFhLEVBQWlCLE1BQU0sQ0FBQyxFQUFJLENBQWdCLEVBQzNHLEdBQUksRUFBWSxDQUdkLElBQU0sRUFBZSxHQUFzQixDQUFXLEVBQ2xELElBQWlCLElBQUEsSUFBVyxFQUFTLElBQUksQ0FBWSxFQUN6RCxFQUFlLEtBQUssQ0FBVyxDQUNqQyxNQUNFLElBQUssSUFBTSxLQUFjLEdBQWdDLEVBQWEsRUFBUyxPQUFPLEVBQ3BGLEVBQVMsSUFBSSxDQUFVLENBRzdCLENBQ0EsSUFBTSxFQUFXLElBQUksSUFDckIsSUFBSyxJQUFNLEtBQWdCLEVBQ3pCLElBQUssSUFBTSxLQUFnQixHQUFpQixFQUFjLEVBQW1CLEVBQVMsT0FBTyxFQUMzRixFQUFTLElBQUksQ0FBWSxFQUc3QixNQUFPLENBQUUsU0FBVSxDQUFDLEdBQUcsQ0FBUSxDQUFDLENBQUMsU0FBUyxFQUFHLFNBQVUsQ0FBQyxHQUFHLENBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBRSxDQUNsRixDQWNBLFNBQVMsR0FBaUIsRUFBc0IsRUFBZ0MsRUFBK0IsQ0FDN0csSUFBTSxFQUF1QixHQUMzQixDQUFDLEdBQUcsQ0FBaUIsQ0FBQyxDQUFDLEtBQU0sR0FBcUIsRUFBaUIsV0FBVyxHQUFHLEVBQVEsRUFBRSxDQUFDLEVBSXhGLEVBQWtDLEdBQ3RDLENBQUMsR0FBRyxDQUFpQixDQUFDLENBQUMsS0FBTSxHQUFxQixFQUFRLFdBQVcsR0FBRyxFQUFpQixFQUFFLENBQUMsR0FDNUYsQ0FBQyxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQWEsRUFBUyxjQUFjLENBQUMsRUFDMUQsRUFBa0IsR0FBbUIsRUFBYyxDQUFXLEVBU3BFLE9BUEcsRUFBZ0IsS0FDZCxHQUNDLEVBQWtCLElBQUksQ0FBTyxHQUFLLEVBQW9CLENBQU8sR0FBSyxFQUErQixDQUFPLENBQzVHLEVBSUssRUFBZ0IsUUFBUyxHQUkxQixFQUFrQixJQUFJLENBQU8sR0FBSyxFQUErQixDQUFPLEVBQVUsQ0FBQyxFQUNuRixFQUFvQixDQUFPLEVBQ3RCLENBQUMsR0FBRyxFQUFRLGNBQWUsR0FBRyxFQUFRLFVBQVcsR0FBRyxFQUFRLE1BQU8sR0FBRyxFQUFRLE1BQU0sRUFFdEYsQ0FBQyxDQUFPLENBQ2hCLEVBWFEsR0FBZ0MsRUFBYyxDQUFXLENBWXBFLENBT0EsU0FBUyxHQUFtQixFQUFzQixFQUErQixDQUMvRSxJQUFNLEVBQWMsQ0FBRSxJQUFLLEVBQWEsb0JBQXFCLEdBQU8sT0FBUSxDQUFDLG9CQUFvQixDQUFFLEVBQ25HLE1BQU8sQ0FDTCxHQUFHLElBQUksSUFBSSxDQUNULEdBQUcsRUFBRyxTQUFTLEVBQWMsQ0FBRSxHQUFHLEVBQWEsZ0JBQWlCLEVBQUssQ0FBQyxFQUN0RSxHQUFHLEVBQ0EsU0FBUyxFQUFLLE1BQU0sS0FBSyxFQUFjLGNBQWMsRUFBRyxDQUFXLENBQUMsQ0FDcEUsSUFBSyxHQUFvQixFQUFLLE1BQU0sUUFBUSxDQUFlLENBQUMsQ0FBQyxDQUU3RCxPQUFRLEdBQVksSUFBWSxHQUFHLENBQ3hDLENBQUMsQ0FDSCxDQUFDLENBQUMsU0FBUyxDQUNiLENBT0EsU0FBUyxHQUFnQyxFQUFxQixFQUErQixDQUUzRixNQURLLGFBQWEsS0FBSyxDQUFXLEVBQzNCLEVBQUcsU0FBUyxFQUFhLENBQzlCLElBQUssRUFDTCxvQkFBcUIsR0FDckIsT0FBUSxDQUFDLG9CQUFvQixFQUM3QixnQkFBaUIsRUFDbkIsQ0FBQyxFQU4yQyxDQUFDLENBQVcsQ0FPMUQsQ0FRQSxTQUFTLEdBQThCLEVBQXVDLENBQzVFLElBQU0sRUFBbUIsR0FBdUMsRUFBUyxhQUFhLFVBQVUsRUFZaEcsT0FIRSxFQUFTLDRCQUE4QixDQUFDLEdBQStCLEVBQVMsYUFBYSxVQUFVLEVBQ25HLENBQUMsYUFBYyxHQUFHLENBQWdCLEVBQ2xDLEVBQUEsQ0FDbUIsT0FBUSxHQUFxQixHQUErQixDQUFnQixDQUFDLENBQ3hHLENBT0EsU0FBZ0IsR0FBK0IsRUFBZ0QsQ0FDN0YsT0FBTyxHQUF1QyxDQUFVLENBQUMsQ0FBQyxLQUN2RCxHQUNDLENBQUMsRUFBaUIsV0FBVyxHQUFHLEdBSWhDLEdBQStCLENBQWdCLEdBQy9DLEdBQThCLENBQWdCLElBQU0sWUFDeEQsQ0FDRixDQ2pPQSxNQUFNLEdBQWdCLHdCQWdCdEIsU0FBZ0IsR0FDZCxFQUNTLENBRVQsTUFBTyxDQUFDLEdBQUcsSUFEa0IsSUFBSSxDQUFDLGVBQWdCLEdBQUcsR0FBNkIsQ0FBTSxDQUFDLENBQy9ELENBQUMsQ0FBQyxDQUFDLEtBQU0sR0FBWSxDQUM3QyxJQUFNLEVBQVcsR0FBd0IsRUFBSyxRQUFRLEVBQU8sUUFBUyxDQUFPLENBQUMsRUFHOUUsT0FGSyxFQUNELEVBQVMsTUFBTSxXQUFXLEVBQWEsRUFBVSxHQUM5QyxDQUNMLEVBQVMsYUFDVCxFQUFTLGdCQUNULEVBQVMsaUJBQ1QsRUFBUyxvQkFDWCxDQUFDLENBQUMsS0FBTSxHQUFpQixPQUFPLEtBQUssR0FBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFNLEdBQVMsRUFBSyxXQUFXLEVBQWEsQ0FBQyxDQUFDLEVBUGpGLEVBUXhCLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBd0IsRUFBMkMsQ0FDMUUsR0FBSSxDQUNGLE9BQU8sS0FBSyxNQUFNLEVBQUcsYUFBYSxFQUFVLE1BQU0sQ0FBQyxDQUNyRCxNQUFRLENBQ04sTUFDRixDQUNGLENDOEJBLE1BQU0sR0FBWSxDQUNoQixLQUFNLENBQ0osS0FBTSxPQUNOLEdBQUksQ0FDRixhQUFjLEtBQ2QsS0FBTSxDQUNKLFNBQVUsQ0FBQyxNQUFNLENBQ25CLEVBRUEsa0JBQW1CLElBQ3JCLEVBRUEsWUFBYSxDQUNYLE1BQU8sMkNBQ1AscUJBQXNCLEVBQ3hCLEVBRUEsWUFBYSxDQUdYLFFBQVMsUUFHVCxTQUFVLFFBRVYsZ0JBQWlCLE1BQ25CLEVBQ0EsS0FBTSxDQUNKLEtBQU0sQ0FDSixLQUFNLGdFQUNSLENBQ0YsQ0FDRixFQUNBLFlBQWEsQ0FDWCxLQUFNLFlBQ04sR0FBSSxDQUNGLGFBQWMsS0FDZCxLQUFNLENBQ0osU0FBVSxDQUFDLE1BQU0sQ0FDbkIsQ0FDRixFQUNBLFlBQWEsQ0FDWCxNQUFPLDJDQUNQLHFCQUFzQixFQUN4QixFQUNBLEtBQU0sQ0FDSixZQUFhLENBQ1gsS0FBTSxxRUFDUixDQUNGLENBQ0YsRUFDQSxRQUFTLENBQ1AsS0FBTSxVQUNOLEdBQUksQ0FDRixLQUFNLENBQ0osU0FBVSxDQUFDLENBQ2IsQ0FDRixFQVFBLFlBQWEsQ0FDWCxNQUFPLHlCQUNQLHFCQUFzQixHQUN0QixNQUFPLEtBQ1QsRUFDQSxZQUFhLENBRVgsV0FBWSxRQUVaLFNBQVUsT0FDWixFQUNBLEtBQU0sQ0FDSixRQUFTLENBQ1AsS0FBTSxtRUFDUixDQUNGLENBQ0YsRUFDQSxjQUFlLENBQ2IsS0FBTSxnQkFDTixHQUFJLENBQ0Ysb0JBQXFCLENBQ25CLE1BQU8sQ0FBQyxTQUFVLFNBQVUsYUFBYSxDQUMzQyxDQUNGLEVBQ0EsS0FBTSxDQUNKLGNBQWUsQ0FDYixLQUFNLHVFQUNSLENBQ0YsQ0FDRixFQUNBLEtBQU0sQ0FDSixLQUFNLE9BQ04sR0FBSSxDQUFDLEVBQ0wsWUFBYSxDQUVYLFNBQVUsT0FDWixFQUNBLEtBQU0sQ0FDSixLQUFNLENBQUUsS0FBTSxnRUFBaUUsQ0FDakYsQ0FDRixFQUNBLGdCQUFpQixDQUNmLEtBQU0sb0JBQ04sR0FBSSxDQUNGLGFBQWMsQ0FDWixNQUFPLENBQUMsUUFBUSxDQUNsQixDQUNGLEVBQ0EsS0FBTSxDQUNKLGdCQUFpQixDQUNmLEtBQU0seUVBQ1IsQ0FDRixDQUNGLENBQ0YsRUFXQSxTQUFTLEdBQ1AsRUFDc0UsQ0FDdEUsSUFBTSxFQUFRLG9FQUFvRSxLQUFLLEdBQVEsRUFBRSxFQUNqRyxHQUFJLENBQUMsRUFBTyxPQUNaLElBQU0sRUFBUSxFQUFNLEVBQUUsQ0FBRSxZQUFZLEVBQy9CLFNBQVUsZUFBaUIsSUFBVSxrQkFBcUIsRUFBTSxFQUFFLENBQUUsWUFBWSxJQUFNLHNCQUczRixNQUFPLENBQUUsYUFBYyxFQUFNLEdBQUssVUFBVyxFQUFNLEdBQUssSUFBSyxFQUFNLEVBQUksQ0FDekUsQ0FFQSxlQUFzQixHQUFrQixFQUEwQyxDQUNoRixPQUFPLEVBQU8sMEJBQTBCLG1CQUFvQixTQUFZLENBQ3RFLEdBQUksR0FBd0IsRUFBVyxVQUFVLEVBRS9DLE9BR0YsSUFBTSxFQUFnQixFQUFLLFFBQVEsRUFBVyxRQUFTLFVBQVcsV0FBVyxFQUs3RSxHQUFJLENBQUUsTUFBTSxFQUFPLHVCQUF1QixDQUFhLEVBQUksQ0FDekQsUUFBUSxLQUFLLHdDQUF3QyxFQUFjLGtDQUFrQyxFQUNyRyxNQUNGLENBQ0EsTUFBTSxFQUFHLFNBQVMsTUFBTSxFQUFlLENBQUUsVUFBVyxFQUFLLENBQUMsRUFFMUQsSUFBTSxFQUFVLE1BQU0sRUFBRyxTQUFTLFFBQVEsRUFBZSxDQUFFLGNBQWUsRUFBSyxDQUFDLEVBRTFFLEVBQWtCLElBQUksSUFDNUIsSUFBSyxJQUFNLEtBQVMsRUFDZCxDQUFDLEVBQU0sT0FBTyxHQUFLLENBQUMsRUFBTSxLQUFLLFNBQVMsTUFBTSxHQUNsRCxFQUFnQixJQUFJLEVBQU0sS0FBSyxNQUFNLEVBQUcsRUFBYyxFQUFHLEVBQU0sSUFBSSxFQUVyRSxJQUFNLEVBQWlCLENBQUMsT0FBUSxjQUFlLGVBQWUsRUFTOUQsR0FSSSxFQUFXLFVBQVUsaUJBQ3ZCLEVBQWUsS0FBSyxTQUFTLEVBRTNCLEVBQVcsa0JBQWtCLE9BQVMsR0FDeEMsRUFBZSxLQUFLLFdBQVcsRUFJN0IsRUFBVyxrQkFBa0IsU0FBVyxFQUFHLENBQzdDLElBQU0sRUFBbUIsRUFBZ0IsSUFBSSxXQUFXLEVBQ3BELEdBQW9CLEdBQTRCLEVBQWUsRUFBa0IsV0FBVyxJQUM5RixFQUFnQixPQUFPLFdBQVcsRUFDbEMsTUFBTSxFQUFPLGVBQWUsRUFBSyxLQUFLLEVBQWUsQ0FBZ0IsQ0FBQyxFQUUxRSxDQUNBLEVBQWdCLE9BQU8sTUFBTSxFQUM3QixJQUFLLElBQU0sS0FBUSxFQUNaLEVBQWdCLElBQUksQ0FBSSxHQUMzQixFQUFnQixJQUFJLEVBQU0sR0FBRyxFQUFLLEtBQUssRUFHdkMsRUFBZ0IsSUFBSSxNQUFNLEdBRzVCLEVBQWdCLE9BQU8sWUFBWSxFQUdyQyxJQUFLLEdBQU0sQ0FBQyxFQUFNLEtBQWEsRUFFN0IsTUFBTSxFQUFZLFFBQVUsR0FBa0IsRUFBWSxFQUFlLEVBQW1CLENBQVEsQ0FBQyxDQUV6RyxDQUFDLENBQ0gsQ0FFQSxTQUFnQixHQUF3QixFQUE4QixDQUdwRSxPQUFPLEdBQVksWUFBWSxDQUFDLENBQUMsU0FBUyxxQkFBcUIsR0FBSyxFQUN0RSxDQVFBLFNBQWdCLEdBQTRCLEVBQXVCLEVBQWtCLEVBQStCLENBQ2xILEdBQUksQ0FBQyxFQUFTLFNBQVMsTUFBTSxFQUFHLE1BQU8sR0FDdkMsSUFBSSxFQUNKLEdBQUksQ0FDRixFQUFVLEVBQUcsYUFBYSxFQUFLLEtBQUssRUFBZSxDQUFRLEVBQUcsTUFBTSxDQUN0RSxNQUFRLENBQ04sTUFBTyxFQUNULENBQ0EsSUFBTSxFQUFnQixHQUNwQixPQUFPLEdBQVMsVUFBWSxHQUE2QixDQUFJLENBQUMsRUFBRSxlQUFpQixFQUNuRixHQUFJLENBQ0YsSUFBTSxFQUFXLEVBQUssS0FBSyxDQUFPLEVBQ2xDLEdBQUksR0FBWSxPQUFPLEdBQWEsVUFBWSxFQUFTLE1BQVEsT0FBTyxFQUFTLE1BQVMsU0FBVSxDQUNsRyxJQUFNLEVBQU8sT0FBTyxPQUFPLEVBQVMsSUFBSSxFQUN4QyxPQUFPLEVBQUssT0FBUyxHQUFLLEVBQUssTUFBTyxHQUFRLEVBQWEsR0FBSyxJQUFJLENBQUMsQ0FDdkUsQ0FDRixNQUFRLENBRVIsQ0FDQSxNQUFPLEVBQ1QsQ0FFQSxlQUFlLEdBQ2IsRUFDQSxFQUNBLEVBQ0EsRUFBVyxHQUFHLEVBQUssTUFDSixDQUNmLElBQU0sRUFBVyxFQUFLLEtBQUssRUFBZSxDQUFRLEVBQzVDLEVBQTJCLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBZSx1QkFBdUIsQ0FBQyxFQUM1Rix3QkFDQSxJQUFBLEdBR0osR0FBSSxJQUFTLGFBQWUsRUFBTyxrQkFBa0IsU0FBVyxFQUFHLE9BRW5FLElBQUksRUFBYyxnQkFBZ0IsS0FBUSxHQUFZLEdBQVUsR0FBa0MsQ0FBQyxDQUFDLEVBQzlGLEVBQWEsTUFBTSxFQUFPLGlCQUFpQixDQUFRLEVBQ3pELEdBQUksSUFBZSxJQUFBLEdBQVcsQ0FDNUIsSUFBSSxFQUNKLEdBQUksQ0FDRixFQUFjLEVBQUssS0FBSyxDQUFVLENBQ3BDLE1BQVEsQ0FHTixRQUFRLEtBQUssc0JBQXNCLEVBQVMsdURBQXVELEVBQ25HLE1BQ0YsQ0FHQSxHQUFJLE9BQU8sR0FBZ0IsV0FBWSxHQUF3QixNQUFNLFFBQVEsQ0FBVyxFQUFHLENBQ3pGLFFBQVEsS0FBSyxzQkFBc0IsRUFBUyxpREFBaUQsRUFDN0YsTUFDRixDQUNBLEVBQWMsRUFBTSxJQUFJLENBQUMsRUFBYSxFQUFhLENBQVcsRUFBRyxDQUFFLFdBQVksRUFBYSxDQUFDLENBQy9GLENBRUEsR0FBSSxFQUFFLFNBQVUsR0FBYyxPQUUxQixFQUFLLFdBQVcsUUFBUSxJQUMxQixFQUFjLENBQ1osR0FBRyxFQUlILFlBQWEsQ0FDWCxNQUFPLHlCQUNQLHFCQUFzQixFQUN4QixDQUNGLEVBQ0EsR0FBYSxFQUFhLE1BQU0sRUFDNUIsRUFBWSxJQUFJLE9BQ2xCLEVBQVksR0FBRyxLQUFLLGdCQUFrQixDQUNwQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVMsYUFBYyxHQUFJLEVBQVksR0FBRyxLQUFLLGlCQUFtQixDQUFDLENBQUUsQ0FBQyxDQUNwRixJQUlBLElBQVMsV0FBYSxFQUFZLEtBQUssU0FBVyxJQUNwRCxFQUFZLGNBQWdCLENBQUMsRUFDN0IsRUFBWSxZQUFZLFFBQVUsUUFDbEMsRUFBWSxLQUFLLFFBQVEsT0FBUyxDQUFDLEVBQ25DLEVBQVksS0FBSyxRQUFRLEtBQUssd0JBQTBCLEdBRzFELElBQUksRUFBcUIsR0FDekIsSUFBSyxJQUFNLEtBQU8sT0FBTyxPQUFPLEVBQVksSUFBSSxFQUsxQyxDQUFDLEdBQU8sQ0FBQyxHQUE2QixFQUFJLElBQUksSUFFbEQsR0FBYSxFQUFRLEVBQUssQ0FBSSxFQUM5QixFQUFxQixJQUVsQixLQVNMLElBQUksQ0FBQyxFQUFZLFlBQ2YsSUFBSyxJQUFNLEtBQU8sT0FBTyxPQUFPLEVBQVksSUFBSSxFQUFHLENBQ2pELEdBQUksQ0FBQyxFQUFLLFNBQ1YsSUFBTSxFQUFPLEdBQTZCLEVBQUksSUFBSSxFQUM5QyxDQUFDLEVBQUksYUFBZSxHQUFNLGVBQWlCLFVBQVksRUFBSyxNQUFRLFNBQ3RFLEVBQUksWUFBYyxDQUFFLFNBQVUsTUFBTyxFQUV6QyxDQUdGLE9BQVEsRUFBUixDQUNFLElBQUssVUFDSCxHQUFJLEVBQVksSUFBSSxTQUNsQixPQUFPLEVBQVksR0FBRyxVQUNqQixHQUFJLEVBQVksSUFBSSxNQUFRLEVBQU8sUUFBUSxTQUFTLE9BQVMsRUFDbEUsRUFBWSxHQUFHLEtBQUssU0FBVyxFQUFPLFFBQVEsYUFDekMsQ0FDTCxNQUFNLEVBQU8sZUFBZSxDQUFRLEVBQ3BDLE1BQ0YsQ0FDSSxFQUFPLGNBQ1QsRUFBWSxjQUFnQixDQUFDLEVBQzdCLEVBQVksWUFBWSxZQUFjLFNBRXRDLE9BQU8sRUFBWSxjQUFjLFlBRW5DLE1BRUYsSUFBSyxPQUNMLElBQUssWUFFQyxFQUFZLElBQUksY0FDbEIsT0FBTyxFQUFZLEdBQUcsYUFBYSxnQkFFakMsRUFBWSxJQUFJLE9BQ2xCLE9BQU8sRUFBWSxHQUFHLEtBQUssZ0JBQzNCLEVBQVksR0FBRyxLQUFLLFNBQVcsRUFBWSxHQUFHLEtBQUssU0FBUyxPQUFRLEdBQVcsSUFBVyxhQUFhLEVBSTdHLENBR0EsR0FGQSxNQUFNLEdBQVUsRUFBYSxDQUFRLEVBRWpDLElBQVMsT0FBUSxDQUNuQixHQUFJLENBQUMsRUFBWSxLQUFLLE1BQU0sS0FBTSxPQUdsQyxFQUFZLEtBQUssY0FBZ0IsRUFBWSxLQUFLLEtBQ2xELElBQU0sRUFBUyxFQUFZLEtBQUssS0FBSyxLQUFLLHlCQUMxQyxHQUFJLE9BQU8sR0FBVyxTQUFVLE9BRWhDLEVBQVksS0FBSyxLQUFLLEtBQUsseUJBQTJCLFdBQVcsSUFDakUsRUFBWSxLQUFPLGdCQUNuQixFQUFZLEdBQUssQ0FBRSxrQkFBbUIsSUFBSyxFQUMzQyxPQUFPLEVBQVksS0FBSyxLQUN4QixNQUFNLEdBQVUsRUFBYSxFQUFLLEtBQUssRUFBZSxnQkFBZ0IsQ0FBQyxDQUN6RSxDQWpERSxDQWtESixDQUlBLE1BQU0sR0FBdUIsSUFBSSxJQUFJLENBQUMsZ0JBQWlCLEtBQU0sUUFBUyxlQUFlLENBQUMsRUFLaEYsR0FBaUUsQ0FDckUsSUFBSyxJQUFJLElBQUksQ0FBQyxPQUFRLEdBQUcsQ0FBQyxFQUMxQixLQUFNLElBQUksSUFBSSxDQUFDLE9BQVEsS0FBSyxDQUFDLEVBQzdCLEtBQU0sSUFBSSxJQUFJLENBQUMsT0FBUSxLQUFLLENBQUMsRUFDN0IsSUFBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FDcEIsRUFLTSxHQUFxQixJQUFJLElBQUksQ0FDakMsUUFDQSxLQUNBLFdBQ0EsV0FDQSxLQUNBLGNBQ0EsS0FDQSxRQUNBLEtBQ0EsWUFDQSxLQUNBLFFBQ0YsQ0FBQyxFQUdELFNBQVMsR0FBa0IsRUFBa0IsRUFBNEIsQ0FDdkUsSUFBSSxFQUFRLEVBQ1osS0FBTyxFQUFRLEVBQU8sU0FBVyxFQUFPLElBQVUsR0FBQSxDQUFJLFdBQVcsR0FBRyxHQUFHLENBQ3JFLElBQU0sRUFBUyxFQUFPLElBQVUsR0FDaEMsSUFDSSxDQUFDLEVBQU8sU0FBUyxHQUFHLEdBQUssR0FBbUIsSUFBSSxDQUFNLEdBQUssRUFBUSxFQUFPLFFBQVEsR0FDeEYsQ0FDQSxPQUFPLENBQ1QsQ0FVQSxTQUFTLEdBQXFCLEVBQStELENBQzNGLElBQU0sRUFBdUIsQ0FBQyxFQUMxQixFQUFtQixDQUFDLEVBQ3BCLEVBQVUsR0FDVixFQUFVLEdBQ1YsRUFJQSxFQUFhLEdBSWIsRUFBcUMsQ0FBQyxFQUNwQyxFQUFxQixHQUE4QixDQUN2RCxJQUFJLEVBQVMsRUFDYixJQUFLLElBQU0sS0FBYSxFQUN0QixLQUFPLEVBQVMsRUFBTyxRQUFRLENBQzdCLElBQU0sRUFBWSxFQUFTLEVBQ3ZCLEVBQVUsRUFDZCxLQUFPLEVBQVUsRUFBTyxRQUFVLEVBQU8sS0FBYTtHQUFNLElBRzVELEdBRkEsRUFBUyxFQUNMLEVBQU8sTUFBTSxFQUFXLENBQU8sQ0FBQyxDQUFDLEtBQUssSUFBTSxHQUM1QyxHQUFXLEVBQU8sT0FBUSxLQUNoQyxDQUdGLE1BREEsR0FBMkIsQ0FBQyxFQUNyQixDQUNULEVBQ00sTUFBdUIsQ0FDdkIsR0FBUyxFQUFPLEtBQUssQ0FBTyxFQUNoQyxFQUFVLEdBQ1YsRUFBVSxFQUNaLEVBQ00sTUFBeUIsQ0FDN0IsRUFBUyxFQUNULEVBQVMsS0FBSyxDQUFNLEVBQ3BCLEVBQVMsQ0FBQyxDQUNaLEVBQ0EsSUFBSyxJQUFJLEVBQVEsRUFBRyxFQUFRLEVBQU8sT0FBUSxJQUFTLENBQ2xELElBQU0sRUFBWSxFQUFPLElBQVUsR0FDbkMsR0FBSSxFQUFPLENBQ1QsR0FBSSxJQUFjLE1BQVEsSUFBVSxJQUFLLENBR25DLEVBQU8sRUFBUSxLQUFPO0VBQU0sSUFDM0IsR0FBVyxFQUFPLEVBQUUsSUFBVSxHQUNuQyxRQUNGLENBQ0ksSUFBYyxFQUFPLEVBQVEsSUFBQSxHQUM1QixHQUFXLEVBQ2hCLFFBQ0YsQ0FDQSxHQUFJLElBQWMsS0FBTSxDQUd0QixHQUFJLEVBQU8sRUFBUSxLQUFPO0VBQU0sQ0FDOUIsSUFDQSxRQUNGLENBQ0EsR0FBVyxFQUFPLEVBQUUsSUFBVSxHQUM5QixFQUFVLEdBQ1YsUUFDRixDQUNBLEdBQUksSUFBYyxLQUFPLElBQWMsSUFBSyxDQUMxQyxFQUFRLEVBQ1IsRUFBVSxHQUNWLFFBQ0YsQ0FLQSxHQUFJLElBQWMsS0FBTyxFQUFPLEVBQVEsS0FBTyxJQUFLLENBQ2xELEVBQWEsR0FDYixJQUFJLEVBQVMsRUFBUSxFQUVyQixJQURJLEVBQU8sS0FBWSxLQUFLLElBQ3JCLFNBQVMsS0FBSyxFQUFPLElBQVcsRUFBRSxHQUFHLElBQzVDLElBQUksRUFBWSxHQUlaLEVBQ0osS0FBTyxFQUFTLEVBQU8sUUFBUSxDQUM3QixJQUFNLEVBQWdCLEVBQU8sSUFBVyxHQUN4QyxHQUFJLEVBQ0UsSUFBa0IsRUFBZ0IsRUFBaUIsSUFBQSxHQUNsRCxHQUFhLE9BQ2IsR0FBSSxJQUFrQixLQUUzQixJQUNBLEdBQWEsRUFBTyxJQUFXLFFBQzFCLEdBQUksSUFBa0IsS0FBTyxJQUFrQixJQUNwRCxFQUFpQixPQUNaLEdBQUksVUFBVSxLQUFLLENBQWEsRUFDckMsR0FBYSxPQUViLE1BRUYsR0FDRixDQUNBLEdBQUksRUFBVyxDQUdiLEVBQVMsRUFDVCxFQUF5QixLQUFLLENBQVMsRUFDdkMsRUFBUSxFQUFTLEVBQ2pCLFFBQ0YsQ0FDRixDQUNBLEdBQUksSUFBYyxLQUFPLENBQUMsRUFBUyxDQUlqQyxJQURBLEVBQVcsRUFDSixFQUFRLEVBQUksRUFBTyxRQUFVLEVBQU8sRUFBUSxLQUFPO0dBQU0sSUFDaEUsUUFDRixDQUNBLEdBQUksSUFBYyxLQUFPLElBQWMsS0FBTyxJQUFjLEtBQU8sSUFBYztFQUFNLENBQ3JGLEVBQVcsR0FDTixJQUFjLEtBQU8sSUFBYyxNQUFRLEVBQU8sRUFBUSxLQUFPLEdBQVcsSUFHN0UsSUFBYztHQUFRLEVBQXlCLE9BQVMsSUFBRyxFQUFRLEVBQWtCLENBQUssR0FDOUYsUUFDRixDQUNBLEdBQUksSUFBYyxLQUFPLElBQWMsSUFBSyxDQUMxQyxFQUFTLEVBQ1QsUUFDRixDQUNBLEdBQUksTUFBTSxLQUFLLENBQVMsRUFBRyxDQUN6QixFQUFTLEVBQ1QsUUFDRixDQUNBLEdBQVcsRUFDWCxFQUFVLEVBQ1osQ0FFQSxPQURBLEVBQVcsRUFDSixDQUFFLFdBQVUsWUFBVyxDQUNoQyxDQU9BLFNBQWdCLEdBQWdCLEVBQXNCLEVBQTJDLENBQy9GLEdBQU0sQ0FBRSxXQUFVLGNBQWUsR0FBcUIsQ0FBWSxFQUVsRSxHQUFJLEVBQVksTUFBTyxHQUN2QixJQUFLLElBQU0sS0FBVSxFQUFVLENBQzdCLElBQUksRUFBUSxFQUNaLEtBQU8sRUFBUSxFQUFPLFFBQVUsNEJBQTRCLEtBQUssRUFBTyxJQUFVLEVBQUUsR0FBRyxJQU12RixHQUFJLEVBQU8sS0FBVyxNQUVwQixJQURBLElBQ08sRUFBUSxFQUFPLFFBQVEsQ0FDNUIsSUFBTSxFQUFRLEVBQU8sSUFBVSxHQUMvQixHQUFJLDRCQUE0QixLQUFLLENBQUssRUFBRyxTQUd4QyxHQUFJLElBQVUsTUFBUSxJQUFVLFVBQVcsR0FBUyxPQUNwRCxHQUFJLEVBQU0sV0FBVyxJQUFJLEdBQUssRUFBTSxXQUFXLFVBQVUsRUFBRyxTQUM1RCxHQUFJLElBQVUsS0FBTSxHQUFTLE9BQzdCLEdBQUksRUFBTSxXQUFXLEdBQUcsRUFBRyxTQUMzQixLQUNQLENBS0YsS0FBTyxFQUFPLEtBQVcsV0FBVyxDQUNsQyxJQUNBLElBQUksRUFBYyxHQUNsQixLQUFPLEVBQVEsRUFBTyxTQUFXLEVBQU8sSUFBVSxHQUFBLENBQUksV0FBVyxHQUFHLEdBQzlELDZCQUE2QixLQUFLLEVBQU8sSUFBVSxFQUFFLElBQUcsRUFBYyxJQUMxRSxJQUVGLEdBQUksRUFBYSxDQUNmLEVBQVEsR0FDUixLQUNGLENBQ0YsQ0FDQSxHQUFJLEVBQVEsRUFBRyxTQUtmLEdBQUksQ0FBQyxNQUFPLE9BQVEsT0FBUSxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQU8sSUFBVSxFQUFFLEVBQUcsQ0FDaEUsSUFBTSxFQUFTLEVBQU8sSUFBVSxHQUNoQyxFQUFRLEdBQWtCLEVBQVEsRUFBUSxDQUFDLEVBQzNDLElBQU0sRUFBYSxFQUFPLElBQVUsR0FDcEMsR0FBSSxDQUFDLE1BQU8sWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFVLEVBQUcsU0FNaEQsSUFBTSxFQUE0QixJQUFXLFFBQVUsSUFBZSxPQUFTLEVBQVksSUFBSSxLQUFLLEVBQ3BHLEdBQUksR0FBa0MsRUFBTyxFQUFFLElBQUksQ0FBVSxHQUFLLENBQUMsRUFDakUsSUFDSSxFQUFPLEtBQVcsTUFBTSxTQUN2QixHQUFJLElBQVcsTUFDcEIsY0FDSyxHQUFJLEVBQU8sS0FBVyxNQUFRLEVBQVksSUFBSSxJQUFJLEVBR3ZELFFBRUosS0FBVyxDQUFDLE9BQVEsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFPLElBQVUsRUFBRSxJQUNyRCxFQUFRLEdBQWtCLEVBQVEsRUFBUSxDQUFDLEdBRTdDLEdBQUksRUFBTyxLQUFXLEtBQU0sU0FDNUIsSUFBTSxFQUFTLEVBQU8sTUFBTSxFQUFRLENBQUMsRUFLakMsRUFBZSxFQUNuQixLQUFPLEVBQWUsRUFBTyxTQUFXLEVBQU8sSUFBaUIsR0FBQSxDQUFJLFdBQVcsR0FBRyxHQUFHLENBQ25GLElBQU0sRUFBTyxFQUFPLElBQWlCLEdBQ3JDLElBQ0ksR0FBcUIsSUFBSSxDQUFJLEdBQUssRUFBZSxFQUFPLFFBQVEsR0FDdEUsQ0FDSSxLQUFPLEtBQWtCLFNBQzdCLE1BQU8sRUFDVCxDQUNBLE1BQU8sRUFDVCxDQVNBLFNBQWdCLEdBQTRCLEVBQW1DLENBQzdFLElBQUksRUFDSixHQUFJLENBQ0YsRUFBVSxFQUFHLFlBQVksRUFBa0IsQ0FBRSxjQUFlLEVBQUssQ0FBQyxDQUNwRSxNQUFRLENBQ04sTUFBTyxFQUNULENBR0EsSUFBTSxFQUFvQixtRUFDcEIsRUFBdUIsR0FDM0IsR0FBNkIsQ0FBSSxDQUFDLEVBQUUsZUFBaUIsU0FDdkQsT0FBTyxFQUFRLEtBQU0sR0FBVSxDQUM3QixHQUFJLENBQUMsRUFBTSxPQUFPLEdBQUssQ0FBQyxZQUFZLEtBQUssRUFBTSxJQUFJLEVBQUcsTUFBTyxHQUM3RCxHQUFJLEVBQU0sS0FBSyxXQUFXLFFBQVEsRUFBRyxNQUFPLEdBQzVDLElBQUksRUFDSixHQUFJLENBQ0YsRUFBVSxFQUFHLGFBQWEsRUFBSyxLQUFLLEVBQWtCLEVBQU0sSUFBSSxFQUFHLE1BQU0sQ0FDM0UsTUFBUSxDQUNOLE1BQU8sRUFDVCxDQUNBLEdBQUksQ0FDRixJQUFNLEVBQVcsRUFBSyxLQUFLLENBQU8sRUFJbEMsT0FISSxHQUFZLE9BQU8sR0FBYSxVQUFZLEVBQVMsTUFBUSxPQUFPLEVBQVMsTUFBUyxTQUNqRixPQUFPLE9BQU8sRUFBUyxJQUFJLENBQUMsQ0FBQyxLQUFNLEdBQVEsRUFBb0IsR0FBSyxJQUFJLENBQUMsRUFFM0UsRUFDVCxNQUFRLENBQ04sT0FBTyxFQUFrQixLQUFLLENBQU8sQ0FDdkMsQ0FDRixDQUFDLENBQ0gsQ0FLQSxNQUFNLEdBQWtDLElBQUksSUFBSSxDQUFDLFNBQVUsVUFBVyxhQUFjLE1BQU0sQ0FBQyxFQUNyRixHQUFzRSxDQUUxRSxZQUFhLENBQUUsUUFBUyxPQUFRLFNBQVUsTUFBTyxFQUNqRCxjQUFlLENBQUUsZ0JBQWlCLE9BQVEsU0FBVSxPQUFRLEVBQzVELGdCQUFpQixDQUFFLGdCQUFpQixPQUFRLENBQzlDLEVBRUEsU0FBUyxHQUFhLEVBQXVCLEVBQVUsRUFBdUIsQ0FDNUUsRUFBSSxPQUFTLENBQUMsRUFRZCxJQUFNLEVBQVUsRUFBSSxVQUFZLFVBQVksSUFBQSxHQUFhLEVBQUksUUFBVSxFQUFJLFNBQVcsQ0FBQyxFQUVuRixJQUFZLElBQVMsUUFBVSxJQUFTLGFBQzFDLEVBQVEsU0FBVywrQkFZckIsSUFBTSxFQUFrQixHQUE2QixFQUFJLElBQUksRUFDdkQsRUFBeUIsR0FBaUIsTUFBUSxPQUFTLEVBQWdCLGFBQWUsSUFBQSxHQUMxRixFQUFzQixFQUF5QixHQUE0QixHQUEwQixJQUFBLEdBRTNHLEdBREksSUFBcUIsRUFBSSxZQUFjLENBQUUsR0FBRyxDQUFvQixHQUNoRSxHQUFXLEdBQTBCLEdBQWdDLElBQUksQ0FBc0IsSUFJakcsRUFBUSxtQkFBcUIsb0NBTXpCLEdBQTRCLENBQU0sRUFDcEMsRUFBUSxnQkFBa0IsaUNBRTFCLE9BQU8sRUFBUSxnQkFFYixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxXQUFXLENBQUMsR0FBRyxDQVE1RCxJQUFNLEVBQVUsR0FBa0IsQ0FBTSxFQUNwQyxJQUNGLEVBQVEsYUFBZSxFQUUzQixDQUVGLEdBQUksSUFBUyxZQUFhLENBQ3hCLEdBQU0sQ0FBQyxHQUFlLEVBQU8sa0JBQ3pCLEdBQWUsSUFBZ0IsSUFDakMsRUFBSSxLQUFLLGtCQUFvQixFQUU3QixPQUFPLEVBQUksS0FBSyxpQkFFcEIsQ0E4QkEsR0ExQkksR0FBbUIsRUFBTyxZQUFZLFdBQVcscUJBQXFCLEVBQ3hFLEVBQUksS0FBTyxvREFBb0QsRUFBZ0IsYUFBYSxHQUFHLEVBQWdCLFVBQVUsR0FBRyxFQUFnQixNQUNuSSxHQUFtQixFQUFPLFlBQVksV0FBVyx3QkFBd0IsSUFDbEYsRUFBSSxLQUFPLHVEQUF1RCxFQUFnQixhQUFhLEdBQUcsRUFBZ0IsVUFBVSxHQUFHLEVBQWdCLE9BRzdJLEVBQU8sdUJBQXlCLENBQUMsRUFBSSxLQUFLLFVBQVksRUFBSyxXQUFXLE1BQU0sSUFDOUUsRUFBSSxLQUFLLFNBQVcsU0FHbEIsSUFBUyxXQUFhLEVBQUssV0FBVyxNQUFNLEdBQUssRUFBSyxXQUFXLFFBQVEsRUFDdkUsRUFBTyxlQUNULEVBQUksS0FBSyxxQkFBdUIsSUFNbEMsT0FBTyxFQUFJLEtBQUsscUJBR2QsT0FBTyxLQUFLLEVBQUksSUFBSSxDQUFDLENBQUMsT0FBUyxFQUNqQyxFQUFTLEVBQUksSUFBSSxFQUVqQixPQUFPLEVBQUksS0FFVCxFQUFTLENBQ1gsR0FBSSxPQUFPLEtBQUssQ0FBTyxDQUFDLENBQUMsT0FBUyxFQUFHLENBQ25DLElBQU0sRUFBYSxFQUFTLENBQU8sRUFDbkMsT0FBTyxFQUFJLFFBQ1gsRUFBSSxRQUFVLENBQ2hCLE1BQ0UsT0FBTyxFQUFJLE9BRWYsQ0FDRixDQVNBLFNBQVMsR0FBa0IsRUFBMkMsQ0FDcEUsR0FBSSxDQUFDLEVBQU8sdUJBQXlCLEdBQWtCLEVBQUcsT0FDMUQsSUFBTSxFQUFhLEdBQThCLENBQU0sRUFDdkQsT0FBTyxHQUFjLGdCQUFnQixFQUFXLElBQ2xELENBRUEsZUFBZSxHQUFVLEVBQXVCLEVBQWlDLENBSTNFLEVBQVksYUFBZSxPQUFPLEtBQUssRUFBWSxXQUFXLENBQUMsQ0FBQyxTQUFXLEdBQzdFLE9BQU8sRUFBWSxZQUVyQixJQUFNLEVBQVcsRUFBSyxLQUFLLEVBQWEsQ0FBRSxVQUFXLEVBQUcsQ0FBQyxFQUN6RCxNQUFNLEVBQU8sa0JBQWtCLEVBQVUsQ0FBUSxDQUNuRCxDQ3o0QkEsZUFBc0IsR0FBUyxFQUE2QyxDQUMxRSxPQUFPLEVBQU8sMEJBQTBCLFdBQVksU0FBWSxDQUM5RCxHQUFJLEdBQXdCLEVBQWMsVUFBVSxFQUFHLE9BRXZELElBQU0sRUFBVSxFQUFjLFFBQ3hCLEVBQVcsTUFBTSxFQUFHLEtBQUssVUFBVyxDQUFFLElBQUssR0FBTSxJQUFLLEVBQVMsT0FBUSxDQUFXLENBQUMsRUFDckYsRUFBUSxXQUNWLFFBQVEsS0FBSyxTQUFTLEVBQVMsT0FBTyxxQkFBcUIsR0FBUyxFQUV0RSxJQUFLLElBQU0sS0FBVSxFQUFVLENBQzdCLElBQU0sRUFBVyxFQUFLLEtBQUssRUFBUyxDQUFNLEVBQzFDLEVBQWlCLElBQUksU0FBWSxDQUMvQixJQUFNLEVBQVUsTUFBTSxFQUFPLGlCQUFpQixDQUFRLEVBQ3RELEdBQUksSUFBWSxJQUFBLEdBQVcsT0FDM0IsSUFBSSxFQUFhLEdBQWUsQ0FBTyxFQUN2QyxFQUFhLEdBQWtCLEVBQVksRUFBZSxLQUFLLEVBQzNELElBQVksR0FDZCxNQUFNLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FFbEQsQ0FBQyxDQUNILENBS0EsSUFBTSxFQUF1QixHQUF3QixDQUFhLEVBQzVELEVBQVUsTUFBTSxFQUFHLEtBQ3ZCLENBQ0UsOERBQ0EsMEVBQ0EsR0FBRyxFQUFxQixTQUFTLElBQzlCLEdBQWUsR0FBRyxFQUFXLGdFQUNoQyxDQUNGLEVBQ0EsQ0FDRSxJQUFLLEdBQ0wsSUFBSyxFQUNMLE9BQVEsQ0FBQyxHQUFHLEVBQVksR0FBRyxFQUFxQixTQUFTLElBQUssR0FBZSxHQUFHLEVBQVcsSUFBSSxDQUFDLENBQ2xHLENBQ0YsRUFDSSxFQUFRLFdBQ1YsUUFBUSxLQUFLLFNBQVMsRUFBUSxPQUFPLHVCQUF1QixHQUFTLEVBRXZFLElBQUssSUFBTSxLQUFVLEVBQVMsQ0FDNUIsSUFBTSxFQUFXLEVBQUssS0FBSyxFQUFTLENBQU0sRUFDMUMsRUFBaUIsSUFBSSxTQUFZLENBQy9CLElBQU0sRUFBYSxNQUFNLEVBQU8saUJBQWlCLENBQVEsRUFDekQsR0FBSSxJQUFlLElBQUEsR0FBVyxPQUM5QixJQUFJLEVBQWEsR0FBZSxDQUFVLEVBQzFDLEVBQWEsR0FBa0IsRUFBWSxFQUFlLElBQUksRUFFMUQsSUFBZSxHQUNqQixNQUFNLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FFbEQsQ0FBQyxDQUNILENBRUEsSUFBTSxFQUFpQixNQUFNLEVBQUcsS0FBSyx1Q0FBd0MsQ0FDM0UsSUFBSyxHQUNMLElBQUssRUFDTCxPQUFRLENBQ1YsQ0FBQyxFQUNHLEVBQVEsV0FDVixRQUFRLEtBQUssU0FBUyxFQUFlLE9BQU8sdUJBQXVCLEdBQVMsRUFFOUUsSUFBSyxJQUFNLEtBQVEsRUFBZ0IsQ0FDakMsSUFBTSxFQUFXLEVBQUssS0FBSyxFQUFTLENBQUksRUFDeEMsRUFBaUIsSUFBSSxTQUFZLENBQy9CLElBQU0sRUFBYSxNQUFNLEVBQU8saUJBQWlCLENBQVEsRUFDekQsR0FBSSxJQUFlLElBQUEsR0FBVyxPQUM5QixJQUFJLEVBQWEsR0FBZSxDQUFVLEVBQzFDLEVBQWEsR0FBa0IsRUFBWSxFQUFlLE1BQU0sRUFFNUQsSUFBZSxHQUNqQixNQUFNLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FFbEQsQ0FBQyxDQUNILENBRUEsTUFBTSxFQUFZLFdBQVcsQ0FDL0IsQ0FBQyxDQUNILENBRUEsU0FBZ0IsR0FBZSxFQUF5QixDQUN0RCxPQUFPLEVBQ0osV0FBVyxvQkFBcUIsS0FBSyxDQUFDLENBQ3RDLFdBQVcsa0JBQW1CLE1BQU0sQ0FBQyxDQUNyQyxXQUFXLGdCQUFpQixNQUFNLENBQ3ZDLENBRUEsU0FBZ0IsR0FBZSxFQUF5QixDQUN0RCxPQUNFLEVBQ0csV0FBVyxvQkFBc0IsR0FBWSxHQUFlLENBQU8sQ0FBQyxDQUFDLENBR3JFLFdBQVcsbUNBQW9DLFdBQVcsQ0FBQyxDQUMzRCxXQUFXLGlDQUFrQyxZQUFZLENBQUMsQ0FDMUQsV0FBVyxpQ0FBa0MsWUFBWSxDQUVoRSxDQUVBLFNBQVMsR0FBa0IsRUFBb0IsRUFBOEIsRUFBeUMsQ0FDcEgsSUFBSyxHQUFNLENBQUMsRUFBUSxLQUFVLE9BQU8sUUFBUSxFQUFjLFVBQVUsT0FBTyxLQUFPLENBQUMsQ0FBQyxFQUNuRixFQUFhLEVBQVcsV0FBVyxFQUFRLENBQUssRUFFbEQsSUFBSyxHQUFNLENBQUMsRUFBUSxLQUFVLE9BQU8sUUFBUSxFQUFjLFVBQVUsUUFBUSxJQUFhLENBQUMsQ0FBQyxFQUMxRixFQUFhLEVBQVcsV0FBVyxFQUFRLENBQUssRUFFbEQsT0FBTyxDQUNULENDN0dBLE1BQWEsR0FBYSxJQUFJLEtBVmIsQ0FDZixjQUFjLEVBQXlDLENBRXJELElBQU0sRUFEcUIsRUFBYyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFDeEIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUkzQyxNQUFPLENBSEssR0FBTyxHQUFHLEVBQUUsR0FBSyxHQUVoQixHQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUUsUUFBUSxVQUFXLEVBQUUsR0FBSyxFQUNyQyxDQUNuQixDQUNGLEVBR0EsU0FBZ0IsR0FBb0MsRUFBeUIsQ0FDM0UsR0FBSSxDQUFDLEdBQVMsT0FBTyxHQUFVLFNBQVUsTUFBTyxHQUNoRCxJQUFNLEVBQVUsRUFBOEIsT0FDOUMsT0FBTyxJQUFXLEtBQU8sSUFBVyxLQUFPLElBQVcsR0FDeEQsQ0FFQSxNQUFNLEdBQWUsSUFBSSxJQUV6QixTQUFnQixHQUFXLEVBQXlCLENBR2xELElBQU0sRUFBTSxHQUFPLFlBQVksR0FBSyxHQUM5QixFQUFTLEdBQWEsSUFBSSxDQUFHLEVBQ25DLEdBQUksRUFBUSxPQUFPLEVBRW5CLElBQU0sRUFBVSxJQUFJLEVBQVEsQ0FDMUIsS0FBTSxHQUFlLENBQUssR0FBSyxJQUFBLEVBQ2pDLENBQUMsRUFFRCxPQURBLEdBQWEsSUFBSSxFQUFLLENBQU8sRUFDdEIsQ0FDVCxDQUVBLFNBQWdCLEdBQWUsRUFBd0IsQ0FDckQsTUFBTyxDQUFDLENBQUMsR0FBZSxDQUFLLENBQy9CLENBRUEsU0FBUyxHQUFlLEVBQW9DLENBSzFELElBQU0sRUFBa0IsR0FBTyxZQUFZLEVBTzNDLE9BTkksSUFBb0IsY0FDZixRQUFRLElBQUksNEJBQThCLEdBQWtCLEVBRWpFLElBQW9CLGlCQUNmLFFBQVEsSUFBSSwrQkFBaUMsR0FBa0IsRUFHdEUsUUFBUSxJQUFJLDRCQUNaLFFBQVEsSUFBSSwrQkFDWixRQUFRLElBQUksVUFDWixRQUFRLElBQUksY0FDWixHQUFrQixDQUV0QixDQUVBLElBQUksR0FFSixTQUFTLElBQXdDLENBQy9DLEdBQUksS0FBbUIsSUFBQSxHQUFXLE9BQU8sSUFBa0IsSUFBQSxHQUUzRCxHQUFJLENBRUYsR0FDRSxFQUNHLGFBQWEsS0FBTSxDQUFDLE9BQVEsT0FBTyxFQUFHLENBQ3JDLFNBQVUsT0FDVixNQUFPLENBQUMsU0FBVSxPQUFRLFFBQVEsQ0FDcEMsQ0FBQyxDQUFDLENBQ0QsS0FBSyxHQUFLLEVBQ2pCLE1BQVEsQ0FDTixHQUFpQixFQUNuQixDQUNBLE9BQU8sSUFBa0IsSUFBQSxFQUMzQixDQzVFQSxNQUFNLEVBQWEsQ0FBRSxrQkFBbUIsR0FBSSxtQkFBb0IsR0FBSSxnQkFBaUIsR0FBSSxPQUFRLEdBQUksSUFBSyxFQUFHLEVBR2hHLEVBQVksQ0FRdkIsYUFBYSxFQUEwQixDQUNyQyxJQUFNLEVBQVUsRUFBYyxFQUFRLFFBQVEsVUFBVyxFQUFFLENBQUMsRUFDNUQsSUFBSyxJQUFJLEVBQWUsRUFBUSxLQUFLLEVBQUcsSUFBUyxFQUFXLElBQUssRUFBTyxFQUFRLEtBQUssRUFDbkYsR0FDRyxFQUFRLGNBQWMsSUFBaUIsR0FDdkMsSUFBUyxFQUFXLG1CQUNuQixJQUFTLEVBQVcsb0JBQ3BCLElBQVMsRUFBVyxRQUNwQixJQUFTLEVBQVcsZ0JBRXRCLE1BQU8sR0FHWCxNQUFPLEVBQ1QsRUFVQSx5QkFBMkMsRUFBZ0MsQ0FDekUsSUFBTSxFQUE0QixDQUFDLEVBQzdCLEVBQVFDLEdBQVcsRUFBUSxRQUFRLFVBQVcsRUFBRSxFQUFHLEVBQWEsQ0FBRSxtQkFBb0IsRUFBSyxDQUFDLEVBR2xHLE9BQU8sRUFBWSxTQUFXLEdBQU8sR0FBUyxPQUFPLEdBQVUsVUFBWSxDQUFDLE1BQU0sUUFBUSxDQUFLLEVBQzNGLEVBQ0EsSUFBQSxFQUNOLEVBRUEsZ0JBQWdCLEVBQTBCLENBQ3hDLElBQU0sRUFBVSxFQUFjLEVBQVEsUUFBUSxVQUFXLEVBQUUsQ0FBQyxFQUM1RCxJQUFLLElBQUksRUFBZSxFQUFRLEtBQUssRUFBRyxJQUFTLEVBQVcsSUFBSyxFQUFPLEVBQVEsS0FBSyxFQUFHLENBR3RGLEdBQUssRUFBUSxjQUFjLElBQWlCLEVBQWUsTUFBTyxHQUNsRSxHQUFJLElBQVMsRUFBVyxtQkFBcUIsSUFBUyxFQUFXLG1CQUFvQixNQUFPLEVBQzlGLENBQ0EsTUFBTyxFQUNULEVBVUEsMEJBQ0UsRUFDQSxFQUNtRCxDQUNuRCxHQUFJLElBQWUsSUFBQSxHQUNqQixNQUFPLENBQUUsUUFBUyxLQUFLLFVBQVUsRUFBVSxJQUFBLEdBQVcsQ0FBQyxFQUFHLG1CQUFvQixDQUFDLENBQUUsRUFHbkYsSUFBTSxFQUFjLEVBQVUseUJBQWtELENBQVUsRUFHdEYsRUFBVSxFQUFXLFFBQVEsVUFBVyxFQUFFLEVBQzlDLEdBQUksRUFBVSxhQUFhLENBQU8sRUFBRyxDQUNuQyxJQUFNLEVBQVMsRUFBUSxLQUFLLEVBQzVCLE1BQU8sQ0FDTCxRQUFTLEdBQUcsRUFBUyxFQUFTO0VBQU8sS0FBSyxLQUFLLFVBQVUsRUFBVSxJQUFBLEdBQVcsQ0FBQyxJQUMvRSxtQkFBb0IsQ0FBQyxDQUN2QixDQUNGLENBQ0EsSUFBTSxFQUFnQixDQUFFLGtCQUFtQixHQUF3QixDQUFPLENBQUUsRUFDdEUsRUFBK0IsQ0FBQyxFQUNoQyxFQUFrQyxDQUFDLEVBQ3pDLElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxPQUFPLFFBQVEsQ0FBUSxFQUFHLENBQ25ELElBQU0sRUFBVyxJQUFjLEdBRy9CLEdBQUksS0FBSyxVQUFVLENBQVEsSUFBTSxLQUFLLFVBQVUsQ0FBSyxFQUFHLFNBQ3hELEdBQUksSUFBYSxJQUFBLEdBQVcsQ0FDMUIsRUFBVyxLQUFLLENBQUMsRUFBSyxDQUFLLENBQUMsRUFDNUIsUUFDRixDQUdBLElBQU0sRUFBYSxNQUFNLFFBQVEsQ0FBUSxHQUFLLE1BQU0sUUFBUSxDQUFLLEVBQUksR0FBZSxFQUFVLENBQUssRUFBSSxJQUFBLEdBQ3ZHLElBQUssSUFBTSxLQUFhLEdBQWMsQ0FBQyxFQUNyQyxFQUFVLEVBQ1IsRUFDQSxFQUFPLEVBQVMsQ0FBQyxFQUFLLEVBQVUsS0FBSyxFQUFHLEVBQVUsTUFBTyxDQUFFLEdBQUcsRUFBZSxpQkFBa0IsRUFBSyxDQUFDLENBQ3ZHLEVBQ0EsRUFBVSxHQUF1QixFQUFTLEVBQUssRUFBVSxLQUFLLEVBRWhFLEdBQUksRUFBWSxTQUdoQixJQUFNLEVBQWUsR0FBWSxFQUFTLENBQUcsRUFDekMsSUFBaUIsSUFBQSxJQUFhLEVBQVUsZ0JBQWdCLENBQVksR0FBRyxFQUFtQixLQUFLLENBQUcsRUFDdEcsRUFBVSxFQUFXLEVBQVMsRUFBTyxFQUFTLENBQUMsQ0FBRyxFQUFHLEVBQU8sQ0FBYSxDQUFDLENBQzVFLENBSUEsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLEVBQVcsV0FBVyxFQUMvQyxFQUFVLEVBQVcsRUFBUyxFQUFPLEVBQVMsQ0FBQyxDQUFHLEVBQUcsRUFBTyxDQUFFLEdBQUcsRUFBZSxzQkFBeUIsQ0FBRSxDQUFDLENBQUMsRUFFL0csTUFBTyxDQUFFLFVBQVMsb0JBQW1CLENBQ3ZDLENBQ0YsRUFHQSxTQUFTLEdBQVksRUFBaUIsRUFBaUMsQ0FDckUsSUFBTSxFQUFPLEVBQVUsQ0FBTyxFQUN4QixFQUFPLEdBQVEsRUFBbUIsRUFBTSxDQUFDLENBQUcsQ0FBQyxFQUNuRCxPQUFPLEdBQVEsRUFBUSxNQUFNLEVBQUssT0FBUSxFQUFLLE9BQVMsRUFBSyxNQUFNLENBQ3JFLENBS0EsTUFBTSxHQUF5Qix5REFTL0IsU0FBUyxHQUF1QixFQUFpQixFQUFhLEVBQStCLENBQzNGLEdBQUksSUFBa0IsRUFBRyxPQUFPLEVBQ2hDLElBQU0sRUFBTyxFQUFVLENBQU8sRUFDeEIsR0FBWSxHQUFRLEVBQW1CLEVBQU0sQ0FBQyxDQUFHLENBQUMsRUFBQSxFQUFJLFNBQ3RELEVBQVcsSUFBVyxHQUN0QixFQUFXLElBQVcsRUFBZ0IsR0FDNUMsR0FBSSxDQUFDLEdBQVksQ0FBQyxFQUFVLE9BQU8sRUFDbkMsSUFBTSxFQUFjLEVBQVMsT0FBUyxFQUFTLE9BQ3pDLEVBQVUsR0FBdUIsS0FBSyxFQUFRLE1BQU0sQ0FBVyxDQUFDLENBQUMsR0FBRyxHQUMxRSxHQUFJLENBQUMsRUFBUyxPQUFPLEVBRXJCLElBQU0sRUFBYyxFQUFTLE9BQVMsRUFBUyxPQUN6QyxFQUFnQixHQUFlLFNBQVMsS0FBSyxFQUFRLE1BQU0sQ0FBVyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBVSxHQUM5RixPQUNFLEVBQVEsTUFBTSxFQUFHLENBQWEsRUFDOUIsRUFDQSxFQUFRLE1BQU0sRUFBZSxDQUFXLEVBQ3hDLEVBQVEsTUFBTSxFQUFjLEVBQVEsTUFBTSxDQUU5QyxDQVFBLFNBQVMsR0FBd0IsRUFBNkQsQ0FDNUYsSUFBTSxFQUFnQixFQUFVLENBQU8sQ0FBQyxFQUFFLFdBQVcsR0FDL0MsRUFDSixHQUFpQixFQUFRLE1BQU0sRUFBUSxZQUFZO0VBQU0sRUFBYyxNQUFNLEVBQUksRUFBRyxFQUFjLE1BQU0sRUFHMUcsTUFGSSxDQUFDLEdBQWUsQ0FBQyxZQUFZLEtBQUssQ0FBVyxFQUFVLENBQUUsYUFBYyxHQUFNLFFBQVMsQ0FBRSxFQUN4RixFQUFZLFdBQVcsR0FBSSxFQUFVLENBQUUsYUFBYyxHQUFPLFFBQVMsQ0FBRSxFQUNwRSxDQUFFLGFBQWMsR0FBTSxRQUFTLEVBQVksTUFBTyxDQUMzRCxDQVFBLFNBQVMsR0FBZSxFQUFxQixFQUFzRSxDQUNqSCxJQUFNLEVBQWtELENBQUMsRUFDckQsRUFBVyxFQUNmLElBQUssR0FBTSxDQUFDLEVBQVUsS0FBWSxFQUFTLFFBQVEsRUFBRyxDQUNwRCxHQUFJLEVBQVcsRUFBUyxRQUFVLEtBQUssVUFBVSxFQUFTLEVBQVMsSUFBTSxLQUFLLFVBQVUsQ0FBTyxFQUFHLENBQ2hHLElBQ0EsUUFDRixDQUNBLEVBQVcsS0FBSyxDQUFFLE1BQU8sRUFBVSxNQUFPLENBQVEsQ0FBQyxDQUNyRCxDQUNBLE9BQU8sSUFBYSxFQUFTLE9BQVMsRUFBYSxJQUFBLEVBQ3JELENDL0xBLE1BQU0sR0FBd0IseUJBR3hCLEdBQXNCLHVCQUl0QixHQUFnQyx5QkFNdEMsU0FBZ0IsR0FBb0IsRUFBc0MsQ0FDcEUsT0FBOEIsS0FBSyxDQUFNLEVBQzdDLE9BQU8sRUFDSixNQUFNLElBQUksQ0FBQyxDQUNYLElBQUssR0FBWSxFQUFRLEtBQUssQ0FBQyxDQUFDLENBQ2hDLE9BQU8sT0FBTyxDQUNuQixDQUVBLFNBQWdCLEdBQ2QsRUFDQSxFQUNBLEVBQWlCLEdBQ0UsQ0FDbkIsSUFBTSxFQUFhLEVBQVEsS0FBSyxDQUFDLENBQUMsV0FBVyxRQUFTLEdBQUcsRUFDekQsR0FBSSxHQUFzQixLQUFLLENBQVUsRUFBRyxNQUFPLFVBR25ELElBQU0sRUFBYSxFQUFpQixHQUFvQixLQUFLLENBQVUsQ0FBQyxHQUFHLEdBQUssSUFBQSxHQUMxRSxFQUFTLElBQWUsSUFBQSxHQUFZLElBQUEsR0FBWSxFQUFRLEdBQzlELEdBQUksQ0FBQyxFQUFRLE1BQU8sU0FDcEIsSUFBTSxFQUFXLEdBQW9CLENBQU0sRUFhM0MsT0FUSSxHQUFVLFNBQVcsRUFTbEIsR0FBc0IsRUFBUyxJQUFNLEdBQUksRUFBUyxFQUFLLEVBSnJELEdBQVUsS0FBTSxHQUFVLEdBQXNCLEtBQUssRUFBTSxLQUFLLENBQUMsQ0FBQyxXQUFXLFFBQVMsR0FBRyxDQUFDLENBQUMsRUFDOUYsaUJBQ0EsUUFHUixDQ3BEQSxTQUFnQixHQUFVLEVBQWlCLEVBQWdCLEVBQWEsRUFBUSxFQUFTLENBQ3ZGLEdBQXlCLEVBQVMsRUFBTSxFQUFLLENBQUssQ0FDcEQsQ0FFQSxTQUFnQixHQUF5QixFQUFpQixFQUFnQixFQUFhLEVBQVEsRUFBVyxDQUN4RyxFQUFHLENBQ0QsR0FBTSxDQUFDLEVBQVEsRUFBUyxHQUFXLEdBQWlCLEVBQVMsRUFBTSxDQUFHLEVBR2hFLEVBRE0sRUFBYyxVQUFVLEVBQVEsRUFBUyxDQUNwQyxDQUFDLENBQUMsUUFBVSxFQUM3QixHQUFJLElBQVcsRUFBRyxNQUNsQixHQUFJLEdBQVMsRUFBRyxPQUFPLENBQ3pCLE9BQVMsRUFBRSxHQUFTLEdBQ3BCLE1BQU8sRUFDVCxDQUVBLFNBQWdCLEVBQXlCLEVBQWlCLEVBQWdCLEVBQXFCLENBQzdGLE9BQU8sR0FBaUMsRUFBUyxFQUFNLENBQUcsQ0FBQyxDQUFDLEVBQzlELENBRUEsU0FBUyxHQUFpQyxFQUFpQixFQUFnQixFQUErQixDQUN4RyxHQUFNLENBQUMsRUFBUSxFQUFTLEdBQVcsR0FBaUIsRUFBUyxFQUFNLENBQUcsRUFDdEUsRUFBUSxNQUFRLE9BQ2hCLElBQU0sRUFBTyxFQUFjLFVBQVUsRUFBUSxFQUFTLENBQU8sRUFFdkQsRUFBUyxFQUFLLFFBQVUsR0FDeEIsRUFBUSxPQUFPLEdBQVcsU0FBVyxFQUFPLEtBQUssRUFBSSxFQUFPLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFDOUUsRUFBSyxNQUNQLFFBQVEsTUFBTSxHQUFHLEVBQU8sSUFBSSxFQUFRLElBQUssR0FBTSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsaUJBQWlCLEVBQUssTUFBTSxTQUFTLEVBQ2hHLEdBQ1QsUUFBUSxNQUNOLEdBQUcsRUFBTyxJQUFJLEVBQVEsSUFBSyxHQUFNLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSw4Q0FBOEMsR0FDdEcsRUFHRixJQUFNLEVBQVMsRUFBSyxRQUFVLEdBQ3hCLEVBQWEsT0FBTyxHQUFXLFNBQVcsRUFBUyxFQUFPLFNBQVMsRUFDekUsTUFBTyxDQUFDLEVBQUssUUFBVSxFQUFHLEVBQVcsS0FBSyxDQUFDLENBQzdDLENBRUEsU0FBZ0IsR0FBaUIsRUFBaUIsRUFBZ0IsRUFBbUQsQ0FDbkgsSUFBTSxFQUFNLENBQUUsR0FBRyxRQUFRLEdBQUksRUFPN0IsT0FOSSxFQUFJLE1BQVEsRUFBSSxtQkFDbEIsRUFBSSxLQUFPLEVBQUksS0FBSyxNQUFNLEdBQUcsQ0FBQSxDQUMxQixPQUFRLEdBQU0sSUFBTSxFQUFJLGdCQUFnQixDQUFBLENBQ3hDLEtBQUssR0FBRyxHQUdOLENBQ0wsRUFDQSxFQUNBLENBQ0UsTUFDQSxNQUNBLFNBQVUsT0FDVixNQUFPLEdBQ1AsTUFBTyxTQUNULENBQ0YsQ0FDRixDQzlEQSxTQUFnQixHQUFhLEVBQXVCLENBQ2xELE9BQU8sRUFBTSxXQUFXLHVCQUF3QixPQUFPLEdBQUcsS0FBSyxDQUNqRSxDQ3NHQSxNQUFNLEdBQWlCLEVBQUUsT0FBTyxDQUM5QixNQUFPLEVBQ0osT0FBTyxDQUNOLElBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQy9DLElBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQy9DLEdBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQzlDLEtBQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ2xELENBQUMsQ0FBQyxDQUNELFNBQVMsQ0FDZCxDQUFDLEVBUUssR0FBb0YsQ0FDeEYsQ0FBRSxTQUFVLGFBQWMsY0FBZSxFQUFLLEVBQzlDLENBQUUsU0FBVSxrQkFBbUIsY0FBZSxFQUFLLEVBQ25ELENBQUUsU0FBVSxrQkFBbUIsY0FBZSxFQUFNLEVBQ3BELENBQUUsU0FBVSxpQkFBa0IsY0FBZSxFQUFNLEVBQ25ELENBQUUsU0FBVSxnQkFBaUIsY0FBZSxFQUFNLEVBQ2xELENBQUUsU0FBVSxvQkFBcUIsY0FBZSxFQUFNLENBQ3hELEVBRUEsZUFBc0IsR0FDcEIsRUFDQSxFQUNvQyxDQUNwQyxJQUFNLEVBQWtCLEVBQUssUUFBUSxFQUFTLGNBQWMsRUFDNUQsR0FBSSxDQUNGLElBQU0sRUFBeUIsRUFBRyxXQUFXLENBQWUsRUFDeEQsRUFBNEMsQ0FBQyxFQUM3QyxFQUFrRCxDQUFDLEVBQ25ELEVBQTJCLENBQUMsRUFDNUIsRUFBYSxHQUNqQixHQUFJLEVBQXdCLENBQzFCLElBQU0sRUFBa0IsRUFBRyxhQUFhLEVBQWlCLE1BQU0sRUFDL0QsRUFBYyxLQUFLLE1BQU0sQ0FBZSxFQUN4QyxFQUFlLEVBQVksY0FBZ0IsQ0FBQyxFQUM1QyxFQUFrQixFQUFZLGlCQUFtQixDQUFDLEVBQ2xELEVBQWEsRUFBWSxPQUFTLFFBQ3BDLENBRUEsSUFBSSxFQUE0QixDQUFDLEVBQzdCLEVBQTJCLENBQUMsRUFDNUIsRUFBNEIsR0FDNUIsRUFBZ0MsR0FNaEMsRUFBMkIsR0FDL0IsR0FBSSxDQVVGLElBQUksRUFBaUIsRUFBNEMsUUFDakUsR0FBSSxJQUFrQixJQUFBLEdBQ3BCLElBQUssR0FBTSxDQUFFLFdBQVUsbUJBQW1CLEdBQW1DLENBQzNFLElBQU0sRUFBZ0IsRUFBSyxRQUFRLEVBQVMsQ0FBUSxFQUMvQyxLQUFHLFdBQVcsQ0FBYSxFQUNoQyxJQUFJLENBQUMsRUFBZSxDQUNsQixFQUEyQixHQUMzQixLQUNGLENBSUEsRUFBZ0IsS0FBSyxNQUFNLE1BQU1DLEVBQUksU0FBUyxFQUFlLE1BQU0sQ0FBQyxFQUNwRSxLQUxBLENBTUYsQ0FJRixJQUFNLEVBQWMsR0FBZSxTQU1uQyxHQUxBLEdBQW1CLE1BQU0sUUFBUSxDQUFXLEVBQUksRUFBYyxJQUFnQixJQUFBLEdBQVksQ0FBQyxFQUFJLENBQUMsQ0FBVyxFQUFBLENBQ3hHLElBQUssR0FDSixPQUFPLEdBQVcsU0FBVyxFQUFVLEdBQTJDLElBQ3BGLENBQUMsQ0FDQSxPQUFRLEdBQXFDLE9BQU8sR0FBZSxRQUFRLEVBQzFFLE1BQU0sUUFBUSxHQUFlLE9BQU8sRUFBRyxDQUN6QyxFQUE0QixHQUM1QixJQUFLLElBQU0sS0FBZSxFQUFjLFFBQVMsQ0FDL0MsR0FBTSxDQUFDLEVBQVksR0FBaUIsTUFBTSxRQUFRLENBQVcsRUFBSSxFQUFjLENBQUMsRUFBYSxJQUFBLEVBQVMsRUFHdEcsR0FGSSxPQUFPLEdBQWUsV0FDMUIsRUFBZSxLQUFLLENBQVUsRUFDMUIsSUFBZSx5QkFBeUIsU0FJNUMsSUFBTSxFQUFVLEdBQWUsUUFDekIsRUFDSixHQUFlLGFBQWUsS0FDN0IsSUFBWSxJQUFBLElBQ1YsT0FBTyxHQUFZLFVBQVksRUFBSyxRQUFRLEVBQVMsQ0FBTyxJQUFNLEVBQUssUUFBUSxDQUFPLEdBQzNGLElBQWtDLENBQ3BDLENBQ0YsTUFBVyxHQUFpQixFQUFjLFVBQVksSUFBQSxLQUNwRCxFQUEyQixHQUUvQixNQUFRLENBQ04sRUFBMkIsRUFDN0IsQ0FJQSxJQUFNLEVBQXNCLENBQUMsRUFDM0IsRUFBZ0IscUJBQ2hCLEVBQWdCLE9BQVMsR0FDekIsRUFBZSxPQUFTLEdBQ3hCLEdBT0ksRUFBUyxHQUFTLFFBQVUsQ0FBQyxHQUEyQixDQUFPLEVBRWpFLEVBTUEsR0FBUyxTQUFXLEtBQ3RCLEVBQVcsTUFBTSxHQUFjLEVBQVMsQ0FBVyxHQUdyRCxJQUFJLEVBQWEsR0FDakIsR0FBSSxDQUNGLEVBQWEsTUFBTUEsRUFBSSxTQUFTLEVBQUssUUFBUSxFQUFTLFlBQVksRUFBRyxNQUFNLENBQzdFLE1BQVEsQ0FFUixDQUVBLElBQU0sR0FBZSxFQUFLLFFBQVEsRUFBUyxXQUFXLEVBQ2xELEVBQ0osR0FBSSxDQUNGLElBQU0sRUFBZSxNQUFNQSxFQUFJLFNBQVMsR0FBYyxNQUFNLEVBQzVELEVBQVcsR0FBZSxNQUFNLEtBQUssTUFBTSxDQUFZLENBQUMsQ0FDMUQsTUFBUSxDQUVSLENBRUEsSUFBTSxHQUFlLE9BQU8sR0FBVSxXQUFjLFNBQVcsRUFBUyxVQUFZLElBQUEsR0FDaEYsRUFDQSxFQUNKLEdBQUksR0FBYyxDQUNoQixJQUFNLEVBQVksR0FBYSxNQUFNLEdBQUcsRUFDcEMsRUFBVSxRQUFVLElBQ3RCLEVBQWEsRUFBVSxHQUN2QixFQUFXLEVBQVUsR0FFekIsRUFJSSxDQUFDLEdBQWMsQ0FBQyxLQUNsQixDQUFDLEVBQVksR0FBWSxNQUFNLEdBQXlCLEVBQVMsQ0FBVyxHQUk5RSxJQUFNLEdBQWEsR0FBYyxFQUFXLFVBQVUsRUFBVyxHQUFHLElBQWEsSUFBQSxHQUUzRSxHQUF5QixDQUFDLGtCQUFtQixtQkFBb0IsWUFBWSxDQUFDLENBQUMsS0FBTSxHQUN6RixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsWUFBYSxDQUFRLENBQUMsQ0FDNUQsRUFHTSxHQUF1QixHQUF3QixDQUNuRCxVQUNBLGNBQ0EsMkJBQTRCLEVBQVksMEJBQTJCLENBQU8sQ0FDNUUsQ0FBQyxFQUNLLEVBQTJCLEdBQy9CLEdBQXFCLEtBQU0sR0FBd0IsRUFBWSxFQUFTLENBQW1CLENBQUMsRUFDeEYsR0FBNEIsR0FBcUIsQ0FBTyxFQUN4RCxHQUFtQixHQUF5QixDQUFPLEVBQ25ELEdBQTZCLEdBQThCLENBQU8sRUFDbEUsRUFBd0IsQ0FDNUIsVUFDQSxhQUNBLFNBQ0EsYUFBYyxHQUFVLFVBQVksR0FDcEMsc0JBQXVCLE9BQU8sR0FBVSxTQUFZLFVBQ3BELHNCQUF1QixDQUFDLENBQUMsRUFBWSxNQUNyQyxjQUNBLGFBQ0EsV0FDQSxrQkFBbUIsR0FDakIsSUFBWSxXQUFXLHFCQUFxQixHQUFLLElBQVksV0FBVyx3QkFBd0IsR0FFbEcsYUFBYyxHQUFpQixFQUFhLEdBQTJCLEVBQWdCLEVBQ3ZGLDZCQUNBLFVBQVcsR0FBYyxFQUFTLEVBQWEsRUFBZ0IsRUFDL0QsYUFBYyxFQUNkLHFCQUFzQixHQUEyQixFQUFTLEVBQWlCLENBQVEsRUFDbkYsa0JBQW1CLEdBQXNCLENBQU8sRUFJaEQsMkJBQTRCLEVBQVksMkJBQTRCLENBQU8sR0FBSyxHQUFxQixPQUFTLEVBQzlHLHNCQUF1QixDQUFDLENBQUMsR0FBYyxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsb0JBQW9CLENBQUMsRUFDaEcsbUJBQW9CLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxTQUFTLENBQUMsRUFDbEUsaUJBQWtCLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxRQUFRLENBQUMsRUFDL0QseUJBQ0Esc0JBQXVCLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxhQUFhLENBQUMsRUFDekUsa0JBQW1CLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxTQUFTLENBQUMsRUFHakUsOEJBQStCLEVBQVksMkJBQTRCLENBQU8sRUFDOUUsa0JBQW1CLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxTQUFTLENBQUMsRUFDakUsMEJBQTJCLEVBQVksYUFBYyxDQUFPLEVBQzVELHVCQUF3QixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsY0FBYyxDQUFDLEVBQzNFLG9CQUFxQixFQUFZLGlCQUFrQixDQUFPLEVBQzFELDBCQUNBLGlDQUFrQyxFQUNoQyx5REFDRixFQUNBLHdCQUF5QixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsZUFBZSxDQUFDLEVBQzdFLDhCQUErQixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsVUFBVyxlQUFlLENBQUMsRUFDOUYsc0JBQXVCLEVBQVksK0NBQWdELENBQU8sRUFDMUYsc0JBQXVCLEVBQVksK0NBQWdELENBQU8sRUFDMUYsb0JBQXFCLEVBQVksOEJBQStCLENBQU8sRUFDdkUsZ0JBQWlCLEVBQVksWUFBYSxDQUFPLEVBQ2pELGdDQUFpQyxFQUF3Qiw4Q0FBOEMsRUFDdkcsZ0NBQWlDLEVBQXdCLDhDQUE4QyxFQUN2Ryw4QkFBK0IsRUFBd0IsNkJBQTZCLEVBQ3BGLDBCQUEyQixFQUF3QixXQUFXLEVBQzlELFVBQVcsQ0FDVCxNQUFPLENBQUMsQ0FBQyxFQUFhLE1BQ3RCLE9BQVEsQ0FBQyxDQUFDLEVBQWdCLGtCQUMxQixRQUFTLENBQUMsQ0FBQyxFQUFhLGdCQUFrQixDQUFDLENBQUMsRUFBZ0IsZUFDNUQsU0FBVSxDQUFDLENBQUMsRUFBZ0Isa0JBQzVCLFVBQVcsQ0FBQyxDQUFDLEVBQWEsZ0JBQWtCLENBQUMsQ0FBQyxFQUFnQixlQUM5RCxXQUFZLEVBQVcsU0FBUyx1QkFBdUIsRUFDdkQsTUFBTyxDQUFDLENBQUMsRUFBYSxNQUN0QixLQUFNLENBQUMsQ0FBQyxFQUFhLEtBQ3JCLGVBQ0UsQ0FBQyxDQUFDLEVBQWEscUJBQXVCLENBQUMsQ0FBQyxFQUFnQixxQkFBdUIsQ0FBQyxDQUFDLEVBQWdCLFdBQ25HLGtCQUFtQixHQUNuQixPQUFRLENBQUMsQ0FBQyxFQUFhLG1CQUFxQixDQUFDLENBQUMsRUFBZ0IsT0FDOUQsUUFBUyxDQUFDLENBQUMsRUFBZ0IsUUFDM0IsWUFBYSxDQUFDLENBQUMsRUFBYSxnQkFDNUIsZ0JBQWlCLEVBQ2pCLE9BQVEsQ0FBQyxDQUFDLEVBQWEsZ0JBQWtCLENBQUMsQ0FBQyxFQUFnQixlQUMzRCxVQUFXLENBQUMsQ0FBQyxFQUFnQixvQkFDN0IsTUFDRSxDQUFDLENBQUMsRUFBYSxvQkFDZixDQUFDLENBQUMsRUFBZ0Isb0JBQ2xCLENBQUMsQ0FBQyxFQUFhLG9CQUNmLENBQUMsQ0FBQyxFQUFnQixvQkFDbEIsR0FDRixPQUFRLENBQUMsQ0FBQyxFQUFhLFFBQVUsQ0FBQyxDQUFDLEVBQWdCLE9BQ25ELEtBQU0sQ0FBQyxDQUFDLEVBQWEsTUFBUSxDQUFDLENBQUMsRUFBZ0IsS0FDL0MsR0FBSSxDQUFDLENBQUMsRUFBYSxvQkFBc0IsQ0FBQyxDQUFDLEVBQWdCLGtCQUM3RCxFQUNBLFFBQVMsQ0FDUCxTQUFVLEVBQ1YsT0FBUSxFQUNKLEVBQWUsU0FBUywwQkFBMEIsR0FBSyxFQUN2RCxFQUNKLElBQUssRUFDRCxFQUFlLFNBQVMsdUJBQXVCLEdBQUssRUFDcEQsRUFDSixpQkFBa0IsQ0FDcEIsRUFDQSxVQUFXLE1BQU0sR0FBYyxDQUFPLEVBQ3RDLGNBQ0EsVUFDRixFQUNBLEdBQ0UsRUFBTyxvQkFDUCxFQUFPLGtCQUNQLEVBQU8sd0JBQ1AsRUFBTyx1QkFDUCxFQUFPLG1CQUNQLEVBQU8sbUJBQ1AsRUFBTyx3QkFDUCxFQUFPLHdCQUNQLEVBQU8seUJBS04sRUFBTyxRQUFVLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxNQUFNLENBQUMsRUFFN0QsT0FBTyxDQUVYLE1BQVEsQ0FFUixDQUNGLENBbUJBLFNBQWdCLEdBQXFCLEVBQWdDLENBQ25FLElBQU0sRUFBYyxFQUFPLFlBQzNCLE9BQU8sRUFBTywyQkFBNkIsR0FBc0IsQ0FBVyxHQUFLLEdBQTZCLENBQU0sQ0FDdEgsQ0FFQSxTQUFnQixHQUEwQixFQUFnRSxDQUN4RyxJQUFNLEVBQVUsRUFBTyxhQUFhLFNBQVcsQ0FBQyxFQUNoRCxJQUFLLEdBQU0sQ0FBQyxFQUFNLEtBQVcsT0FBTyxRQUFRLENBQU8sRUFDN0MsT0FBVyxJQUFBLElBQ0UsR0FBb0IsQ0FDRyxDQUFDLEVBQUUsS0FBTSxHQUFZLENBQzNELElBQU0sRUFBYSxFQUFRLEtBQUssQ0FBQyxDQUFDLFdBQVcsUUFBUyxHQUFHLEVBQ3pELE1BQ0UsdURBQXVELEtBQUssQ0FBVSxHQUN0RSxHQUFzQixFQUFTLEVBQVMsRUFBSSxJQUFNLFFBRXRELENBQUMsRUFDNkIsTUFBTyxHQUFHLEVBQUssaURBSy9DLElBQUssSUFBTSxLQUFXLEdBQW9CLEVBQVEsYUFBZSxFQUFFLEdBQUssQ0FBQyxFQUFHLENBQzFFLElBQU0sRUFBYSxrREFBa0QsS0FBSyxDQUFPLENBQUMsR0FBRyxHQUMvRSxFQUFTLElBQWUsSUFBQSxHQUFZLElBQUEsR0FBWSxFQUFRLEdBQzlELEdBQ0UsSUFBVyxJQUFBLElBQ1gsSUFBWSxXQUFXLE1BQ3RCLEVBQVEsY0FBZ0IsSUFBQSxJQUFhLEVBQU8sU0FBUyxhQUFhLEdBRW5FLE1BQU8sK0JBQStCLEVBQVcscUJBQXFCLEdBRTFFLENBQ0EsR0FDRSxtR0FBbUcsS0FDakcsRUFBUSxhQUFlLEVBQ3pCLEVBRUEsTUFBTyw0RUFFVCxJQUFLLEdBQU0sQ0FBQyxFQUFNLEtBQVcsT0FBTyxRQUFRLENBQU8sRUFDN0MsT0FBVyxJQUFBLElBQ1gsR0FBeUIsS0FBSyxDQUFNLEVBQUcsTUFBTyxHQUFHLEVBQUssb0RBRTlELENBRUEsU0FBUyxHQUFzQixFQUErQyxDQUM1RSxNQUFPLENBQ0wsR0FBYSxhQUNiLEdBQWEsZ0JBQ2IsR0FBYSxxQkFDYixHQUFhLGdCQUNmLENBQUMsQ0FBQyxLQUFNLEdBQWlCLEdBQWMsV0FBYSxJQUFBLEVBQVMsQ0FDL0QsQ0FFQSxNQUFNLEdBQW1CLE9BQU8sR0FBRyw2REFDN0IsR0FBd0IsT0FBTyxHQUFHLDJCQUEyQixHQUFpQixtQkFBbUIsR0FBaUIsSUFDbEgsR0FBMkIsSUFBSSxPQUNuQyxPQUFPLEdBQUcsMENBQTBDLEdBQXNCLGNBQzFFLEdBQ0YsRUFhQSxTQUFnQixHQUE2QixFQUFpRCxDQXFCNUYsR0FoQm1CLEVBQ2pCLE1BR0EsQ0FDRSxPQUNBLEtBQ0EsdUJBQ0EsS0FDQSxJQUNBLHVCQUNBLDJCQUNBLE9BQU8sR0FBRyxrQ0FDWixFQUNBLEVBQU8sT0FFSSxDQUFDLENBQUMsS0FBSyxFQUFHLE1BQU8sR0FFOUIsSUFBTSxFQUFrQixFQUFLLFFBQVEsRUFBTyxRQUFTLDJCQUEyQixFQUMxRSxFQUFVLEdBQXVCLEVBQUssUUFBUSxFQUFPLFFBQVMsZUFBZSxFQUFHLEVBQU8sUUFBUyxDQUFDLEVBQ3ZHLEdBQUksQ0FBQyxFQUFTLE1BQU8sR0FDckIsSUFBTSxFQUFXLEdBQXdELENBQ3ZFLEdBQUksQ0FBQyxHQUFjLENBQUMsTUFBTSxRQUFRLEVBQVcsUUFBUSxFQUFHLE1BQU8sR0FDL0QsSUFBTSxFQUFlLEVBQUssU0FBUyxFQUFXLFlBQWEsQ0FBZSxDQUFDLENBQUMsV0FBVyxLQUFNLEdBQUcsRUFDaEcsT0FBTyxFQUFXLFNBQVMsS0FBTSxHQUMzQixPQUFPLEdBQVksU0FFbkIsRUFBSyxXQUFXLENBQU8sRUFDbEIsR0FBOEIsRUFBUyxFQUFpQixFQUFXLGtCQUFrQixFQUU5RixDQUFJLEVBQWEsV0FBVyxJQUFJLEdBQ3pCLEdBQThCLEVBQVMsRUFBYyxFQUFXLGtCQUFrQixFQU5qRCxFQU96QyxDQUNILEVBTUEsT0FKSSxFQUFRLEVBQVEsS0FBSyxFQUFVLEdBQy9CLEVBQVEsRUFBUSxPQUFPLEVBQVUsR0FFakMsQ0FBQyxFQUFRLFNBQVcsQ0FBQyxFQUFRLE9BQzFCLEVBQVEsRUFBUSxPQUFPLENBQ2hDLENBaUJBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDNkIsQ0FDN0IsR0FBSSxHQUFrQixFQUFHLE9BQ3pCLElBQUksRUFDSixHQUFJLENBQ0YsRUFBVSxFQUFHLGFBQWEsRUFBVSxNQUFNLENBQzVDLE1BQVEsQ0FDTixNQUNGLENBQ0EsSUFBTSxFQUFXLEVBQVUseUJBS3hCLENBQU8sRUFDVixHQUFJLENBQUMsRUFBVSxPQUNmLElBQU0sRUFBVSxFQUFLLFFBQVEsQ0FBUSxFQUUvQixHQUFnQixFQUFtQixJQUN2QyxNQUFNLFFBQVEsQ0FBUSxFQUNsQixDQUNFLFlBQWEsRUFDYixxQkFDQSxTQUFVLEVBQVMsSUFBSyxHQUN0QixPQUFPLEdBQVksVUFBWSxFQUFRLFdBQVcsY0FBYyxFQUM1RCxFQUFLLEtBQUssRUFBaUIsRUFBUSxNQUFNLEVBQXFCLENBQUMsRUFDL0QsQ0FDTixDQUNGLEVBQ0EsSUFBQSxHQUNBLEVBQTJCLENBQy9CLFFBQVMsRUFBYSxFQUFTLFFBQVMsRUFBSSxFQUM1QyxNQUFPLEVBQWEsRUFBUyxNQUFPLEVBQUssRUFDekMsUUFBUyxFQUFhLEVBQVMsUUFBUyxFQUFJLENBQzlDLEVBQ00sRUFDSixPQUFPLEVBQVMsU0FBWSxTQUFXLENBQUMsRUFBUyxPQUFPLEVBQUksTUFBTSxRQUFRLEVBQVMsT0FBTyxFQUFJLEVBQVMsUUFBVSxDQUFDLEVBR3BILElBQUssSUFBTSxLQUFVLEVBQVEsV0FBVyxFQUFHLENBQ3pDLEdBQUksRUFBUSxTQUFXLEVBQVEsT0FBUyxFQUFRLFFBQVMsTUFFekQsR0FBSSxPQUFPLEdBQVcsVUFBWSxDQUFDLEVBQU8sV0FBVyxHQUFHLEVBQUcsU0FDM0QsSUFBSSxFQUFhLEVBQUssUUFBUSxFQUFTLENBQU0sRUFDekMsQ0FBQyxFQUFHLFdBQVcsQ0FBVSxHQUFLLEVBQUcsV0FBVyxHQUFHLEVBQVcsTUFBTSxJQUFHLEdBQWMsU0FDckYsSUFBTSxFQUFnQixHQUF1QixFQUFZLEVBQWlCLEVBQWlCLENBQUMsRUFDdkYsSUFDTCxFQUFRLFVBQVksRUFBYyxRQUNsQyxFQUFRLFFBQVUsRUFBYyxNQUNoQyxFQUFRLFVBQVksRUFBYyxRQUNwQyxDQUNBLE9BQU8sQ0FDVCxDQUVBLFNBQVMsR0FBOEIsRUFBaUIsRUFBb0IsRUFBc0MsQ0FDaEgsSUFBTSxFQUFhLEVBQVEsUUFBUSxTQUFVLEVBQUUsRUFFL0MsR0FBSSxJQUFlLElBQU0sSUFBZSxJQUFLLE1BQU8sR0FHcEQsRUFBYSxFQUFXLFFBQVEsUUFBUyxFQUFFLEVBQzNDLElBQU0sRUFBVyxFQUFXLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBUSxHQUFZLElBQVksRUFBRSxFQUNuRSxFQUFjLEVBQ2pCLEtBQUssRUFBUyxJQUFVLENBQ3ZCLElBQU0sRUFBUyxJQUFVLEVBQVMsT0FBUyxFQUMzQyxHQUFJLElBQVksS0FBTSxPQUFPLEVBQVMsS0FBTyxPQUFPLEdBQUcsY0FDdkQsSUFBTSxFQUFnQixFQUNuQixXQUFXLHFCQUFzQixPQUFPLEdBQUcsS0FBSyxDQUFDLENBQ2pELFdBQVcsSUFBSyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQ2xDLFdBQVcsSUFBSyxPQUFPLEdBQUcsTUFBTSxFQUNuQyxPQUFPLEVBQVMsRUFBZ0IsR0FBRyxFQUFjLEVBQ25ELENBQUMsQ0FBQyxDQUNELEtBQUssRUFBRSxFQUVKLEVBQWMsRUFBUyxHQUFHLEVBQUUsR0FBSyxHQUNqQyxFQUNKLEdBQXNCLENBQUMsUUFBUSxLQUFLLENBQVcsR0FBSyxDQUFDLEVBQVksU0FBUyxHQUFHLEVBQUksT0FBTyxHQUFHLFdBQWEsR0FDMUcsT0FBVyxPQUFPLElBQUksSUFBYyxFQUFnQixHQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBVSxDQUM5RSxDQU1BLFNBQVMsR0FBcUIsRUFBMEIsQ0FDdEQsTUFBTyxDQUFDLGlCQUFrQixnQkFBaUIsZUFBZSxDQUFDLENBQUMsS0FBTSxHQUNoRSxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsQ0FBUSxDQUFDLENBQy9DLENBQ0YsQ0FTQSxTQUFTLEdBQTJCLEVBQWlCLEVBQXlCLEVBQXVDLENBQ25ILEdBQUksRUFBVSxPQUFPLEVBQVMsWUFBWSxJQUFNLHNCQUNoRCxJQUFJLEVBQVUsRUFBSyxRQUFRLENBQU8sRUFDbEMsS0FBTyxJQUFZLEVBQUssUUFBUSxDQUFPLEdBQUcsQ0FDeEMsR0FBSSxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQVMsTUFBTSxDQUFDLEVBQzFDLE9BQU8sRUFBSyxTQUFTLENBQU8sQ0FBQyxDQUFDLFlBQVksSUFBTSxzQkFFbEQsRUFBVSxFQUFLLFFBQVEsQ0FBTyxDQUNoQyxDQUNBLE9BQU8sRUFBZ0IsWUFBWSxDQUFDLENBQUMsU0FBUyx1QkFBdUIsQ0FDdkUsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ1MsQ0FDVCxJQUFNLEVBQVUsRUFBWSxRQVM1QixPQVJJLEdBQVcsT0FBTyxPQUFPLENBQU8sQ0FBQyxDQUFDLEtBQU0sR0FBVyxPQUFPLEdBQVcsVUFBWSxFQUFPLFNBQVMsVUFBVSxDQUFDLEdBSTVHLEVBQ0ssR0FHRixFQUFpQixLQUFNLEdBQVksd0JBQXdCLEtBQUssQ0FBTyxDQUFDLENBQ2pGLENBRUEsU0FBUyxHQUFjLEVBQWlCLEVBQTBCLEVBQXFDLENBQ3JHLElBQU0sRUFBVSxFQUFZLFFBYTVCLE9BWkksR0FBVyxPQUFPLE9BQU8sQ0FBTyxDQUFDLENBQUMsS0FBTSxHQUFXLE9BQU8sR0FBVyxVQUFZLEVBQU8sU0FBUyxTQUFTLENBQUMsR0FLN0csRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLGdCQUFnQixDQUFDLEdBQ3JELEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxjQUFjLENBQUMsR0FDbkQsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLGNBQWMsQ0FBQyxFQUU1QyxHQUdGLEVBQWlCLEtBQU0sR0FBWSxZQUFZLEtBQUssQ0FBTyxDQUFDLENBQ3JFLENBR0EsU0FBUyxHQUF5QixFQUEyQixDQUMzRCxJQUFNLEVBQWdCLEVBQUssUUFBUSxFQUFTLFVBQVcsV0FBVyxFQUNsRSxHQUFJLENBQ0YsT0FBTyxFQUNKLFlBQVksQ0FBYSxDQUFDLENBQzFCLE9BQVEsR0FBYSxhQUFhLEtBQUssQ0FBUSxDQUFDLENBQUMsQ0FDakQsUUFBUyxHQUFhLENBQ3JCLEdBQUksQ0FDRixNQUFPLENBQUMsRUFBRyxhQUFhLEVBQUssS0FBSyxFQUFlLENBQVEsRUFBRyxNQUFNLENBQUMsQ0FDckUsTUFBUSxDQUNOLE1BQU8sQ0FBQyxDQUNWLENBQ0YsQ0FBQyxDQUNMLE1BQVEsQ0FDTixNQUFPLENBQUMsQ0FDVixDQUNGLENBRUEsZUFBZSxHQUFjLEVBQWtELENBQzdFLElBQU0sRUFBZ0MsQ0FBQyxFQUN2QyxJQUFLLElBQU0sSUFBWSxDQUFDLFlBQWEsWUFBWSxFQUFHLENBQ2xELElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBUyxDQUFRLEVBQy9DLEdBQUksQ0FDRixJQUFNLEVBQVcsSUFBSSxLQUFLLE1BQU0sTUFBTUEsRUFBSSxTQUFTLEVBQVUsTUFBTSxDQUFDLEVBQ3BFLElBQUssR0FBTSxDQUFDLEVBQU0sS0FBVSxPQUFPLFFBQVEsRUFBUyxPQUFTLENBQUMsQ0FBQyxFQUM3RCxFQUFNLEdBQVEsR0FBb0IsQ0FBSyxDQUUzQyxNQUFRLENBRVIsQ0FDRixDQUNBLE9BQU8sQ0FDVCxDQUVBLFNBQVMsR0FBb0IsRUFBd0IsQ0FLbkQsT0FKSSxPQUFPLEdBQVUsU0FBaUIsRUFFbEMsTUFBTSxRQUFRLENBQUssRUFBVSxFQUFNLE9BQVEsR0FBK0IsT0FBTyxHQUFZLFFBQVEsQ0FBQyxDQUFDLEtBQUs7Q0FBSSxFQUNoSCxHQUFTLE9BQU8sR0FBVSxTQUFpQixHQUFxQixFQUE0QixHQUFHLEVBQzVGLEVBQ1QsQ0FTQSxTQUFTLEdBQTJCLEVBQTBCLENBQzVELElBQU0sRUFBa0IsRUFBSyxRQUFRLENBQU8sRUFHNUMsR0FBSSxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQWlCLE1BQU0sQ0FBQyxFQUFHLE1BQU8sR0FDakUsR0FDRSxFQUFLLFNBQVMsRUFBSyxRQUFRLEVBQWlCLElBQUksQ0FBQyxJQUFNLFlBQ3ZELEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBaUIsS0FBTSxLQUFNLGNBQWMsQ0FBQyxFQUV2RSxNQUFPLEdBRVQsSUFDRSxJQUFJLEVBQXVCLEVBQUssUUFBUSxDQUFlLEdBRXZELEVBQXVCLEVBQUssUUFBUSxDQUFvQixFQUN4RCxDQUNBLEdBQUksQ0FDRixJQUFNLEVBQWtCLEtBQUssTUFDM0IsRUFBRyxhQUFhLEVBQUssUUFBUSxFQUFzQixjQUFjLEVBQUcsTUFBTSxDQUM1RSxFQUNNLEVBQWtCLEVBQUssU0FBUyxFQUFzQixDQUFlLENBQUMsQ0FBQyxXQUFXLEtBQU0sR0FBRyxFQU1qRyxHQUwwQixHQUE2QixDQUNyRCxRQUFTLEVBQ1QsWUFBYSxFQUNiLDJCQUE0QixFQUM5QixDQUFDLENBQUMsQ0FBQyxJQUFLLEdBQW9CLEVBQUssTUFBTSxRQUFRLENBQWUsQ0FDMUMsQ0FBQyxDQUFDLFNBQVMsQ0FBZSxFQUFHLE1BQU8sRUFDMUQsTUFBUSxDQUVSLENBQ0EsSUFBTSxFQUFpQixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQXNCLE1BQU0sQ0FBQyxFQUN6RSxFQUFtQixJQUF5QixFQUFLLFFBQVEsQ0FBb0IsRUFDbkYsR0FBSSxHQUFrQixFQUFrQixNQUFPLEVBQ2pELENBQ0YsQ0FFQSxTQUFTLEVBQVksRUFBaUIsRUFBMEIsQ0FDOUQsT0FBTyxFQUFHLFNBQVMsRUFBUyxDQUFFLElBQUssR0FBTSxJQUFLLEVBQVMsT0FBUSxDQUFXLENBQUMsQ0FBQyxDQUFDLE9BQVMsQ0FDeEYsQ0FFQSxTQUFTLEdBQXNCLEVBQTJCLENBQ3hELE9BQU8sRUFDSixTQUFTLGdCQUFpQixDQUFFLElBQUssR0FBTSxJQUFLLEVBQVMsT0FBUSxDQUFXLENBQUMsQ0FBQyxDQUMxRSxJQUFLLEdBQWEsRUFBSyxRQUFRLENBQVEsQ0FBQyxDQUFDLENBQ3pDLFVBQVUsRUFBRyxJQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFTLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxRQUFVLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FDdkYsQ0FFQSxTQUFTLEdBQThCLEVBQTBCLENBQy9ELElBQU0sRUFBUSxFQUFHLFNBQVMsaURBQWtELENBQzFFLElBQUssR0FDTCxJQUFLLEVBQ0wsT0FBUSxDQUFDLEdBQUcsRUFBWSxrQkFBbUIsY0FBZSxjQUFlLHdCQUF3QixDQUNuRyxDQUFDLEVBQ0ssRUFBMEIsR0FBeUIsWUFBWSxFQUNyRSxJQUFLLElBQU0sS0FBUSxFQUFPLENBQ3hCLElBQU0sRUFBVSxFQUFHLGFBQWEsRUFBSyxRQUFRLEVBQVMsQ0FBSSxFQUFHLE1BQU0sRUFDbkUsR0FBSSxFQUF3QixLQUFLLENBQU8sRUFBRyxNQUFPLEVBQ3BELENBQ0EsTUFBTyxFQUNULENBRUEsU0FBUyxHQUF5QixFQUE2QixDQUc3RCxJQUFNLEVBQVksT0FBTyxHQUFHLE9BQU8sR0FBYSxDQUFXLEVBQUUsa0JBQzdELE9BQU8sSUFBSSxPQUNULE9BQU8sR0FBRyxZQUFZLEVBQVUsbUJBQW1CLEVBQVUseUJBQXlCLEVBQVUsT0FDaEcsR0FDRixDQUNGLENBRUEsZUFBZSxHQUFjLEVBQWlCLEVBQXdFLENBQ3BILElBQU0sRUFBWSxHQUFtQixDQUFPLEVBQzVDLEdBQUksRUFBVyxDQUNiLElBQU0sRUFBTyxNQUFNLEdBQWdCLENBQVMsRUFDNUMsR0FBSSxFQUFNLE9BQU8sQ0FDbkIsQ0FFQSxJQUFNLEVBQU0sT0FBTyxFQUFZLFlBQWUsU0FBVyxFQUFZLFdBQWEsRUFBWSxZQUFZLElBQzFHLEdBQUksRUFBSyxDQUNQLElBQU0sRUFBTyxNQUFNLEdBQWdCLENBQUcsRUFDdEMsR0FBSSxHQUFRLEVBQUssVUFBWSxZQUFhLE9BQU8sQ0FDbkQsQ0FDRixDQUVBLGVBQWUsR0FBZ0IsRUFBcUUsQ0FDbEcsR0FBTSxDQUFDLEVBQUssR0FBUSxHQUFXLGNBQWMsQ0FBYSxFQUN0RCxNQUFDLEdBQU8sQ0FBQyxHQUViLEdBQUksQ0FRRixPQUFPLE1BSmdCLEdBQVcsQ0FBRyxDQUFDLENBQUMsUUFBUSw0QkFBNkIsQ0FDMUUsTUFBTyxFQUNQLEtBQU0sQ0FDUixDQUFDLEVBQUEsQ0FDZSxJQUNsQixPQUFTLEVBQU8sQ0FDZCxJQUFNLEVBQXFCLEdBQTBCLENBQUssRUFDMUQsR0FBSSxFQUFvQixDQUl0QixHQUFNLENBQUMsRUFBZSxHQUFrQixFQUFtQixNQUFNLEdBQUcsRUFDcEUsR0FBSSxHQUFpQixFQUNuQixHQUFJLENBS0YsT0FBTyxNQUpnQixHQUFXLENBQWEsQ0FBQyxDQUFDLFFBQVEsNEJBQTZCLENBQ3BGLE1BQU8sRUFDUCxLQUFNLENBQ1IsQ0FBQyxFQUFBLENBQ2UsSUFDbEIsTUFBUSxDQUdSLENBRUYsTUFBTyxDQUFFLFVBQVcsQ0FBbUIsQ0FDekMsQ0FDRixDQUNGLENBRUEsU0FBUyxHQUEwQixFQUFvQyxDQUNyRSxHQUFJLENBQUMsR0FBUyxPQUFPLEdBQVUsU0FBVSxPQUV6QyxJQUFNLEVBQ0osYUFBYyxFQUNULEVBQTJGLFNBQzVGLElBQUEsR0FDQSxFQUFTLEdBQVUsUUFBVyxFQUE4QixPQUNsRSxHQUFJLElBQVcsS0FBTyxJQUFXLElBQUssT0FFdEMsSUFBTSxFQUFXLEdBQVUsU0FBUyxTQUNwQyxHQUFJLE9BQU8sR0FBYSxTQUFVLE9BRWxDLEdBQU0sQ0FBQyxFQUFLLEdBQVEsR0FBVyxjQUFjLENBQVEsRUFDakQsTUFBQyxHQUFPLENBQUMsR0FFYixNQUFPLEdBQUcsRUFBSSxHQUFHLEdBQ25CLENBU0EsZUFBZSxHQUNiLEVBQ0EsRUFDbUQsQ0FDbkQsSUFBTSxFQUFZLEdBQW1CLENBQU8sRUFDNUMsR0FBSSxFQUFXLENBQ2IsSUFBTSxFQUFXLEdBQW1CLENBQVMsRUFDN0MsR0FBSSxFQUFVLE9BQU8sQ0FDdkIsQ0FDQSxJQUFNLEVBQU0sT0FBTyxFQUFZLFlBQWUsU0FBVyxFQUFZLFdBQWEsRUFBWSxZQUFZLElBQzFHLEdBQUksRUFBSyxDQUNQLElBQU0sRUFBVyxHQUFtQixDQUFHLEVBQ3ZDLEdBQUksRUFBVSxPQUFPLENBQ3ZCLENBQ0EsTUFBTyxDQUFDLElBQUEsR0FBVyxJQUFBLEVBQVMsQ0FDOUIsQ0FFQSxTQUFTLEdBQW1CLEVBQXFDLENBQy9ELE9BQU8sRUFBeUIsTUFBTyxDQUFDLFNBQVUsUUFBUyxtQkFBbUIsRUFBRyxDQUFPLEdBQUssSUFBQSxFQUMvRixDQU9BLFNBQVMsR0FBbUIsRUFBMkMsQ0FDckUsR0FBSSxDQUFDLEdBQWMsQ0FBRyxFQUFHLE9BQ3pCLEdBQU0sQ0FBQyxFQUFLLEdBQVEsR0FBVyxjQUFjLENBQUcsRUFDaEQsT0FBTyxHQUFPLEVBQU8sQ0FBQyxHQUFrQixDQUFHLEVBQUcsQ0FBSSxFQUFJLElBQUEsRUFDeEQsQ0FRQSxTQUFTLEdBQWMsRUFBc0IsQ0FDM0MsR0FBSSxhQUFhLEtBQUssQ0FBRyxFQUFHLE1BQU8sR0FFbkMsSUFBTSxFQUFVLHFCQUFxQixLQUFLLENBQUcsQ0FBQyxHQUFHLEdBQ2pELEdBQUksRUFBUyxPQUFPLEVBQVEsWUFBWSxJQUFNLGFBQzlDLEdBQUksQ0FDRixPQUFPLElBQUksSUFBSSxFQUFJLFFBQVEsVUFBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsWUFBWSxJQUFNLFlBQ3hFLE1BQVEsQ0FDTixNQUFPLEVBQ1QsQ0FDRixDQVFBLFNBQVMsR0FBa0IsRUFBdUIsQ0FFaEQsTUFBTyxDQURrQixjQUFlLGdCQUNuQixDQUFDLENBQUMsS0FBTSxHQUFjLEVBQVUsWUFBWSxJQUFNLEVBQU0sWUFBWSxDQUFDLEdBQUssQ0FDakcsQ0N6N0JBLGVBQXNCLEdBQTBCLEVBQTJCLEVBQTRDLENBQ3JILE9BQU8sRUFBTywwQkFBMEIsNEJBQTZCLFNBQVksQ0FDL0UsR0FBSSxDQUFDLEVBQVcsT0FBUSxPQUV4QixJQUFNLEVBQWUsTUFBTSxHQUF1QixFQUFXLE9BQU8sRUFFcEUsSUFBSyxHQUFNLENBQUMsRUFBVSxJQUFhLENBQ2pDLENBQUMsWUFBYSxXQUFXLEVBQ3pCLENBQUMsWUFBYSxhQUFhLEVBQzNCLENBQUMsWUFBYSxZQUFZLENBQzVCLEVBQVksQ0FDVixJQUFNLEVBQVUsR0FBeUIsRUFBWSxFQUFZLEVBQVUsQ0FBWSxFQUNqRixFQUFXLEVBQUssUUFBUSxFQUFXLFFBQVMsQ0FBUSxFQUMxRCxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFPLENBQUMsQ0FDcEUsQ0FFQSxJQUFNLEVBQWtCLEVBQUssUUFBUSxFQUFXLFFBQVMsMkJBQTJCLEVBQzlFLEVBQXFCLEdBQWdDLEVBQVksRUFBWSxDQUFZLEVBQy9GLE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFpQixDQUFrQixDQUFDLENBQ3RGLENBQUMsQ0FDSCxDQUVBLE1BQU0sR0FBMEIsSUFBSSxJQU9wQyxlQUFzQixHQUF1QixFQUFrRCxDQUM3RixJQUFNLEVBQWtCLEVBQUssUUFBUSxFQUFhLGlCQUFpQixFQUluRSxPQUhLLEdBQXdCLElBQUksQ0FBZSxHQUM5QyxHQUF3QixJQUFJLEVBQWlCLE1BQU0sRUFBTyxpQkFBaUIsQ0FBZSxDQUFDLEVBRXRGLEdBQXdCLElBQUksQ0FBZSxDQUNwRCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDUSxDQUdSLE1BQU87Ozs7U0FETSxHQUF5QixFQUFRLEVBQVksU0FBVSxDQUNyQyxHQUNqQyxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNRLENBQ1IsSUFDTSxFQUFjLEVBQVcsYUFBYSxZQUN0QyxFQUFrQixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVcsUUFBUyxXQUFXLENBQUMsRUFDL0Usd3JCQUNBLEdBR0UsRUFBa0IsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFXLFFBQVMsV0FBVyxDQUFDLEVBQy9FLGtKQUNBLEdBV0UsRUFBcUIsRUFBVyxLQUFNLEdBQVcsRUFBTyx5QkFBeUIsRUFJakYsRUFBMkIsRUFBVyxLQUFNLEdBQVcsR0FBcUIsQ0FBTSxDQUFDLEVBQ25GLEVBQW9CLEdBQTRCLEVBQUssUUFBUSxFQUFXLFFBQVMsbUJBQW1CLENBQUMsRUFDckcsRUFBZSxFQUFXLEtBQU0sR0FBVyxDQUMvQyxJQUFNLEVBQWUsRUFBTyxhQUFhLFNBQVUsT0FDbkQsT0FDRSxPQUFPLEdBQWlCLFVBQ3hCLEdBQWdCLEVBQWMsSUFBSSxJQUFJLE9BQU8sS0FBSyxFQUFPLGFBQWEsU0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBRXpGLENBQUMsRUFHSyxFQUF3QixFQUMxQix1S0FBdUssRUFBb0IsdUVBQXlFLEtBQUssRUFBZSxpREFBbUQsS0FBSyxFQUEyQixzTUFBME4sS0FDcmtCLEdBRUUsRUFBcUIsRUFBVyxVQUNsQyx3RkFDQSxHQUNFLEVBQWtDLEdBQXdCLENBQVUsRUFDdEUsc0ZBQ0EsR0FDRSxFQUFzQixFQUFXLGtCQUNuQyw4RkFBOEYsRUFBUyw4QkFDdkcsR0FFRSxFQUFjOzs7WUFEQSxFQUFXLGFBQWEsTUFBUSxFQUFLLFNBQVMsRUFBSyxRQUFRLEVBQVcsT0FBTyxDQUFDLEVBSTVFLElBQUksRUFBYyxvQkFBb0IsSUFBZ0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7O3lFQWtCUixFQUFvQjs7OztpR0FJSTs4UUFBK0MsSUFBa0IsSUFBd0IsSUFBcUIsRUFBZ0M7O0VBRTdPLEdBQXlCLEVBQVksQ0FBVSxFQUFFO0VBRTlDLFdBQVcsWUFBYTtFQUFNLENBQUMsQ0FDL0IsV0FBVyxVQUFXOztDQUFNLENBQUMsQ0FDN0IsS0FBSyxFQUVGLEVBQWdCLEdBQWMsS0FBSyxDQUFDLENBQUMsV0FBVyxHQUFHLEVBTXpELE9BQU8sR0FMd0IsRUFDM0IsRUFDRTs7RUFBUyxFQUFhLEtBQUssRUFDM0I7RUFBTyxFQUNULEdBRU4sQ0FFQSxTQUFnQixHQUF5QixFQUEyQixFQUFxQyxDQUl2RyxJQUFNLEVBQWdCLEVBQVcsS0FBTSxHQUFNLEVBQUUsVUFBVSxPQUFTLEVBQUUsZ0NBQWdDLEVBTTlGLEVBREosRUFBVyxjQUFnQixFQUFXLE1BQU8sR0FBTSxDQUFDLEVBQUUsYUFBYSxNQUFNLFdBQVcsZUFBZSxDQUFDLEVBRWxHLEdBQ0EsRUFDRSx5REFDQSwwRkFTQSxFQUFnQixFQUFXLEtBQU0sR0FBTSxFQUFFLHlCQUF5QixFQUNsRSxFQUE2QixFQUFXLEtBQzNDLElBQU8sRUFBRSxVQUFVLE1BQVEsRUFBRSxVQUFVLFNBQVcsQ0FBQyxFQUFFLHlCQUN4RCxFQUNNLEVBQ0osNFRBQ0ksRUFBNEIsRUFDOUIsRUFDRSxHQUFHLEVBQW1CLGdNQUN0QixFQUNGLEVBQ0UscUNBQ0EsR0FFTixNQUFPOzs7Ozs7Ozs7Ozs7Ozs7RUFlUCxFQUEyQjtFQUUzQixFQUFXLEtBQU0sR0FBTSxFQUFFLFVBQVUsU0FBUyxFQUN4Qyw0UEFDQSxHQUNMOztFQUdDLEVBQVcsS0FBTSxHQUFNLEVBQUUsVUFBVSxPQUFTLEVBQUUsVUFBVSxNQUFRLEVBQUUsVUFBVSxNQUFNLEVBQzlFLGdOQUdBLEdBQ0w7RUFJQyxFQUFXLEtBQU0sR0FBTSxFQUFFLFVBQVUsTUFBUSxFQUFFLFVBQVUsTUFBTSxFQUN6RCw4R0FHQSxHQUNMO0VBQ0MsRUFBMEI7RUFFdkIsV0FBVyxZQUFhO0VBQU0sQ0FBQyxDQUMvQixXQUFXLFVBQVc7O0NBQU0sQ0FBQyxDQUM3QixLQUFLLENBQ1YsQ0FFQSxTQUFTLEdBQXdCLEVBQW1DLENBQ2xFLE9BQU8sRUFBUSxLQUFNLEdBQVcsRUFBTyxVQUFVLGNBQWMsQ0FDakUsZ2lDRWxOQSxNQUFhLEdBQThCQyxHQUFzQixHQUFLLEdBQUssR0FDOUQsR0FBK0JDLEdBRTVDLFNBQWdCLEdBQW1CLEVBQTBDLENBQzNFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBYSxhQUFhLEVBQ25ELEtBQUcsV0FBVyxDQUFRLEVBQzNCLE9BQU8sR0FBZ0IsRUFBRyxhQUFhLEVBQVUsTUFBTSxDQUFDLENBQUMsRUFBRSxTQUFTLFdBQ3RFLENBRUEsU0FBZ0IsR0FDZCxFQUNBLEVBQ0EsRUFDUyxDQUNULElBQU0sRUFBd0IsR0FBd0IsQ0FBTyxFQUM3RCxPQUFPLEVBQVksR0FBdUIsRUFBeUIsQ0FDckUsQ0FFQSxTQUFnQixHQUF3QixFQUFtQyxDQUt6RSxNQUFPLENBQUMsRUFBUSxLQUFNLEdBQVcsRUFBTyxVQUFVLE1BQVEsRUFBTyxVQUFVLE9BQVMsRUFBTyxVQUFVLE1BQU0sQ0FDN0csQ0FFQSxlQUFzQixHQUFtQixFQUF1QixFQUF3QyxDQUN0RyxPQUFPLEVBQU8sMEJBQTBCLHFCQUFzQixTQUFZLENBQ3hFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGFBQWEsRUFDckQsRUFBa0IsRUFBRyxXQUFXLENBQVEsRUFBSSxFQUFHLGFBQWEsRUFBVSxNQUFNLEVBQUksSUFBQSxHQUNoRixFQUFVQyxHQUFXLEVBQWlCLENBQWMsRUFDMUQsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBTyxDQUFDLENBQ3BFLENBQUMsQ0FDSCxDQUVBLE1BQU1BLElBQWMsRUFBcUMsSUFBb0MsQ0FDM0YsSUFBTSxFQUFhLEdBQWdCLENBQWUsRUFRNUMsRUFBa0IsRUFBaUIscUJBQXVCLHNCQVFoRSxNQUFPOzs7RUFHUCxHQUF1QixDQUFlLEVBQUU7VUFDaEMsR0FBWSxTQUFTLFFBQVUsR0FBUSxRQUFVLE9BQU87RUFDaEUsRUFBZ0I7OztzQkFHSSxHQUE0Qjs7RUFFaEQsR0FBNkIsSUFBSyxHQUFnQixRQUFRLEVBQVksR0FBRyxDQUFDLENBQUMsS0FBSztDQUFJLEVBQUU7O0NBR3hGLEVBTUEsU0FBZ0IsR0FBdUIsRUFBcUMsQ0FDMUUsR0FBSSxDQUFDLEVBQVMsTUFBTyxHQUVyQixJQUFNLEVBQTJCLENBQUMsRUFDOUIsRUFBZ0IsR0FDcEIsSUFBSyxJQUFNLEtBQVEsRUFBUSxNQUFNO0NBQUksRUFBRyxDQUN0QyxJQUFNLEVBQWUsbUJBQW1CLEtBQUssQ0FBSSxFQUM3QyxJQUNGLEVBQWdCLEVBQWEsS0FBTyxRQUFXLEVBQWEsRUFBRSxDQUFZLFdBQVcsT0FBTyxHQUUxRixHQUFpQixFQUFLLEtBQUssR0FDN0IsRUFBZSxLQUFLLENBQUksQ0FFNUIsQ0FDQSxPQUFPLEVBQWUsT0FBUyxFQUFJLEdBQUcsRUFBZSxLQUFLO0NBQUksRUFBRSxNQUFRLEVBQzFFLENBRUEsU0FBUyxHQUFnQixFQUFxRCxDQUN2RSxLQUdMLEdBQUksQ0FDRixPQUFPLElBQUksS0FBSyxNQUFNLENBQU8sQ0FDL0IsTUFBUSxDQUNOLE1BQ0YsQ0FDRixDQzNIQSxNQUFNLEdBQW9CLDhCQUNwQixHQUF5Qix3Q0FDekIsR0FBWSxzQkFFWixHQUF5QixHQUFHLEdBQWtCOzs7RUFHbEQsR0FBVTtFQUVOLEdBQXlCO0VBQzdCLEdBQWtCO0VBR1AsRUFBaUIsQ0FDNUIsYUFDQSxrQ0FDQSwwQkFDQSwwQkFDQSxNQUFNLCtCQUErQixFQUErQyxDQUNsRixHQUFJLENBQ0YsSUFBSSxFQUFVLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLEVBQ25ELEVBQWtCLEdBQWdDLENBQU8sRUFJL0QsT0FISSxFQUFrQixJQUNwQixFQUFVLEVBQVEsTUFBTSxFQUFHLEVBQWtCLENBQUMsR0FHOUMsRUFDRyxXQUFXLEdBQXdCLEVBQUUsQ0FBQyxDQUN0QyxXQUFXLDRCQUE2QixFQUFFLENBQUMsQ0FDM0MsV0FBVyx1QkFBd0I7O0NBQU0sQ0FBQyxDQUMxQyxLQUFLLEVBQUk7Q0FFaEIsTUFBUSxDQUVSLENBQ0YsRUFDQSxtQkFBbUIsRUFBeUIsQ0FDMUMsSUFBTSxFQUFRLEVBQVEsUUFBUSxLQUFLLGVBQWUsRUFNbEQsT0FMSSxJQUFVLEdBS1AsR0FKRSxFQUNKLE1BQU0sRUFBRyxFQUFRLFFBQVE7RUFBTSxDQUFLLEVBQUksQ0FBQyxDQUFDLENBQzFDLFdBQVcsR0FBd0IsR0FBRyxHQUFrQixVQUFVLENBR3pFLEVBQ0EsbUJBQW1CLEVBQXlCLENBQzFDLElBQU0sRUFBa0IsR0FBZ0MsQ0FBTyxFQUkvRCxPQUhJLEVBQWtCLEVBQ2IsRUFBUSxNQUFNLEVBQWtCLENBQUMsRUFFbkMsRUFDVCxFQUNBLE1BQU0sMEJBQTBCLEVBQW9DLENBQ2xFLEdBQUksQ0FFRixPQUFPLE1BRGUsRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLEVBQUEsQ0FDNUMsU0FBUzthQUFnQixDQUMxQyxNQUFRLENBQ04sTUFBTyxFQUNULENBQ0YsQ0FDRixFQUVBLFNBQVMsR0FBZ0MsRUFBeUIsQ0FDaEUsSUFBTSxFQUFRLEVBQVEsUUFBUSxFQUFpQixFQUN6QyxFQUFZLEVBQVEsWUFBWSxFQUFpQixFQUN2RCxPQUFPLEVBQVksRUFBUSxFQUFZLEVBQ3pDLENDeERBLE1BQU1DLEdBQWdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF1Q3BCLENBekNtQyxjQXlDVCxDQUFDLENBQzFCLElBQ0UsR0FBWSxvQkFBb0IsRUFBUTttQkFDMUIsRUFBUSxJQUN6QixDQUFDLENBQ0EsS0FBSztDQUFJLEVBQUU7Ozs7OztFQVFkLGVBQXNCLEdBQXFCLEVBQXNDLENBQy9FLE9BQU8sRUFBTywwQkFBMEIsdUJBQXdCLFNBQVksQ0FDMUUsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsZUFBZSxFQUM3RCxHQUFJLEVBQU8sc0JBQXVCLENBQ2hDLElBQU0sRUFBVyxNQUFNLEVBQU8saUJBQWlCLENBQVEsR0FBTSxHQUN2RCxFQUFrQixFQUFlLG1CQUFtQixDQUFPLEVBQzNELEVBQWtCLEVBQWUsbUJBQW1CLENBQU8sRUFFM0QsRUFBYSxFQUFrQkEsR0FBZ0IsRUFDckQsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLE1BQ0UsTUFBTSxFQUFHLFNBQVMsR0FBRyxFQUFVLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FFbEQsQ0FBQyxDQUNILENDOUVBLE1BQWEsRUFBYSxDQUN4QixvQkFBcUIsQ0FDbkIsTUFDQSxNQUNBLEtBQ0EsTUFDQSxNQUNBLE1BQ0EsS0FDQSxNQUNBLE9BQ0EsUUFDQSxRQUNBLE1BQ0EsT0FDQSxNQUNBLE9BQ0EsS0FDQSxPQUNBLEtBQ0EsTUFDQSxNQUNBLE9BQ0EsTUFDQSxJQUNGLENBQUMsQ0FBQyxTQUFTLEVBQ1gsb0JBQXFCLENBQUMsS0FBTSxTQUFVLE9BQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUM3RCxhQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUM5QixPQUFRLENBQUMsUUFBUyxNQUFPLE1BQU8sS0FBTSxNQUFPLE1BQU8sTUFBTyxTQUFVLEtBQU0sTUFBTyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQ2xHLE1BQU8sdUlBNEJQLENBQUMsQ0FBQyxTQUFTLEVBQ1gsYUFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FDbEMsRUNuRE1DLEdBQWE7Ozs7Ozs7O0VBUWpCLEdBQW1CLEVBQVcsbUJBQW1CLEVBQUU7Ozs7RUFJbkQsR0FBbUIsRUFBVyxtQkFBbUIsRUFBRTs7OztFQUluRCxHQUFtQixFQUFXLFlBQVksRUFBRTs7Ozs7O0VBUTlDLGVBQXNCLEdBQXFCLEVBQXNDLENBQy9FLE9BQU8sRUFBTywwQkFBMEIsdUJBQXdCLFNBQVksQ0FDMUUsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsZUFBZSxFQUM3RCxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVUEsRUFBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBbUIsRUFBOEIsQ0FDeEQsT0FBTyxFQUFXLE9BQVMsRUFBSSxPQUFPLEVBQVcsS0FBSyxHQUFHLEVBQUUsSUFBTSxNQUFNLEVBQVcsR0FBRyxFQUN2RixDQzVCQSxNQUFNLEdBQWdCLENBQ3BCLFNBQVUsR0FDVixZQUFhLENBQ1gsUUFBUyxHQUNULDJCQUE0QixTQUM1QixvQkFBcUIsR0FDckIsb0JBQXFCLENBQ25CLEtBQU0sR0FDTixRQUFTLEdBQ1QsWUFBYSxFQUNmLENBQ0YsRUFDQSxnQkFBaUIsQ0FBQyxrQkFBa0IsQ0FDdEMsRUFFQSxlQUFzQixHQUFxQixFQUF1QixFQUE0QyxDQUM1RyxPQUFPLEVBQU8sMEJBQTBCLHVCQUF3QixTQUFZLENBQzFFLEdBQUksQ0FBQyxFQUFPLE9BQVEsT0FFcEIsSUFBTSxFQUFVLEVBQUssUUFBUSxFQUFPLFFBQVMsU0FBUyxFQUNoRCxFQUFpQixFQUFLLFFBQVEsRUFBUyxhQUFhLEVBQ3BELEVBQTZCLEVBQUssUUFBUSxFQUFTLFlBQVksRUFDL0QsRUFBcUIsRUFBSyxRQUFRLEVBQVMsZUFBZSxFQUUxRCxFQUF3QixDQUFDLENBQUUsTUFBTSxFQUFHLFNBQVMsTUFBTSxDQUEwQixDQUFDLENBQUMsVUFBWSxDQUFDLENBQUMsRUFDL0YsR0FDRixRQUFRLEtBQ04sc0JBQXNCLEVBQWUsV0FBVyxFQUEyQixnRUFDN0UsRUFHRixJQUFJLEVBQW9CLGdCQUFnQixFQUFhLEVBQy9DLEVBQWEsRUFBd0IsSUFBQSxHQUFZLE1BQU0sRUFBTyx5QkFBeUIsQ0FBYyxFQUMzRyxHQUFJLElBQWUsSUFBQSxHQUNqQixHQUFJLENBQ0YsSUFBTSxFQUFZLElBQUksS0FBSyxNQUFNLENBQVUsRUFHdkMsR0FBYSxPQUFPLEdBQWMsVUFBWSxDQUFDLE1BQU0sUUFBUSxDQUFTLElBQ3hFLEVBQVksRUFBTSxJQUFJLENBQUMsRUFBVyxFQUFXLENBQVMsRUFBRyxDQUFFLFdBQVksRUFBZSxDQUFDLEVBRTNGLE1BQVEsQ0FFUixDQUdGLElBQU0sRUFBYyxJQUFJLEtBQUssVUFBVSxFQUFXLElBQUEsR0FBVyxDQUFDLEVBRXhELEVBQWUsTUFBTSxHQUF1QixFQUFPLE9BQU8sRUFDMUQsRUFBeUIsR0FBYyxVQUFVLENBQUMsQ0FBQyxXQUFXLEdBQUcsRUFBSSxJQUFBLEdBQVksRUFJakYsRUFBb0IsR0FIUSxFQUFPLGFBQ3JDLDZEQUNBLG1DQUNtRCxNQUFNLEdBQXlCLEVBQVEsQ0FBVSxJQUN0RyxFQUF5QixLQUFLLEVBQXVCLFFBQVEsSUFBTSxLQUcvRCxFQUFXLENBQ2YsR0FBSSxFQUF3QixDQUFDLEVBQUksQ0FBQyxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQWdCLENBQVcsQ0FBQyxDQUFDLEVBQ3pHLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBb0IsQ0FBaUIsQ0FBQyxDQUNsRixFQUNBLE1BQU0sUUFBUSxJQUFJLENBQVEsQ0FDNUIsQ0FBQyxDQUNILENDbEVBLE1BS00sR0FBYTs7Ozs7OztFQU9qQixDQUFDLEdBQUcsRUFBVyxvQkFBcUIsR0FBRyxFQUFXLG9CQUFxQixHQUFHLEVBQVcsWUFBWSxDQUFDLENBQ2pHLElBQUssR0FBUSxLQUFLLEVBQUksYUFBYSxDQUFDLENBQ3BDLEtBQUs7Q0FBSSxFQUFFOzs7RUFLZCxlQUFzQixHQUFzQixFQUFzQyxDQUNoRixPQUFPLEVBQU8sMEJBQTBCLHdCQUF5QixTQUFZLENBQzNFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGdCQUFnQixFQUM5RCxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxFQUFVLENBQUMsQ0FDdkUsQ0FBQyxDQUNILENBRUEsU0FBZ0IsR0FBNEIsRUFBdUIsQ0FDakUsSUFBSSxFQUNKLEdBQUksQ0FDRixFQUFTQyxFQUFjLGFBQWEsTUFBTyxDQUFDLFdBQVksUUFBUyxJQUFJLEVBQUcsQ0FDdEUsSUFBSyxFQUNMLFNBQVUsT0FDVixVQUFXLFNBQ1gsTUFBTyxDQUFDLFNBQVUsT0FBUSxNQUFNLENBQ2xDLENBQUMsQ0FDSCxPQUFTLEVBQU8sQ0FDZCxRQUFRLEtBQUssZ0RBQWlELEVBQWdCLFNBQVMsRUFDdkYsTUFDRixDQUNBLElBQUksRUFBb0IsRUFDeEIsSUFBSyxJQUFNLEtBQVUsRUFBTyxNQUFNLElBQUksRUFBRyxDQUN2QyxJQUFNLEVBQWlCLEVBQU8sUUFBUSxHQUFJLEVBQzFDLEdBQUksSUFBbUIsR0FBSSxTQUUzQixJQUFNLEVBQWEsRUFBTyxNQUFNLEVBQUcsQ0FBYyxFQUNqRCxHQUFJLENBQUMsd0JBQXdCLEtBQUssQ0FBVSxHQUFLLENBQUMscUNBQXFDLEtBQUssQ0FBVSxFQUNwRyxTQUdGLElBQU0sRUFBZSxFQUFPLE1BQU0sRUFBaUIsQ0FBQyxFQUM5QyxFQUFrQixFQUFLLFFBQVEsRUFBUyxDQUFZLEVBRTFELEdBQUksQ0FEVSxFQUFHLFVBQVUsRUFBaUIsQ0FBRSxlQUFnQixFQUFNLENBQzNELENBQUMsRUFBRSxPQUFPLEVBQUcsU0FLdEIsSUFBTSxFQUFVLEVBQUcsYUFBYSxDQUFlLEVBQy9DLEVBQUcsY0FBYyxFQUFpQixPQUFPLEtBQUssRUFBUSxTQUFTLFFBQVEsQ0FBQyxDQUFDLFdBQVc7RUFBUTtDQUFJLEVBQUcsUUFBUSxDQUFDLEVBQzVHLEdBQ0YsQ0FDSSxFQUFvQixHQUN0QixRQUFRLEtBQUssZ0NBQWdDLEVBQWtCLGtCQUFrQixDQUVyRixDQzlEQSxNQUFNLEdBQWUsQ0FBQyxVQUFXLFFBQVMsUUFBUyxZQUFhLG1CQUFvQixRQUFTLE1BQU8sTUFBTSxFQWdDMUcsZUFBc0IsR0FBa0IsRUFBdUIsRUFBMEMsQ0FDdkcsT0FBTyxFQUFPLDBCQUEwQixvQkFBcUIsU0FBWSxDQUN2RSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxZQUFZLEVBQ3BELEVBQVcsTUFBTSxFQUFPLGlCQUFpQixDQUFRLEdBQU0sR0FDekQsRUFBa0IsRUFBZSxtQkFBbUIsQ0FBTyxFQUFJQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUM3RCxFQUFrQixFQUFlLG1CQUFtQixDQUFPLEVBRTNELEVBQVEsQ0FBQyxHQUFHLEVBQVksRUFtRzlCLEdBbEdJLEVBQU8sb0JBQ1QsRUFBTSxLQUFLLE1BQU0sRUFFZixFQUFPLG1CQUNULEVBQU0sS0FBSyxJQUFJLEVBQ2YsR0FBbUIsR0FBRyxFQUFLLFNBQVMsRUFBTyxPQUFPLEVBQUU7SUFLbEQsRUFBTyx3QkFBMEIsRUFBTyxTQUMxQyxFQUFNLEtBQUssTUFBTSxFQUlmLEVBQU8sNEJBQ1QsRUFBTSxLQUFLLE9BQU8sRUFDbEIsR0FBbUI7R0FHakIsRUFBTyx5QkFDVCxFQUFNLEtBQUssVUFBVyxnQkFBaUIsTUFBTSxFQUM3QyxHQUFtQjs7OztHQU1qQixFQUFPLDBCQUNULEdBQW1COztHQU9qQixFQUFPLGdDQUNULEVBQU0sS0FBSyxRQUFRLEVBQ25CLEdBQW1CO0dBSWpCLEVBQU8sVUFBVSxRQUNuQixHQUFtQjs7R0FJakIsRUFBTyxVQUFVLE1BQ25CLEVBQU0sS0FBSyxRQUFRLEdBRWpCLEVBQVcsVUFBVSxVQUFZLEVBQU8sVUFBVSxXQUNwRCxFQUFNLEtBQUssVUFBVSxHQUVuQixFQUFPLFVBQVUsUUFBVSxFQUFPLFVBQVUsV0FDOUMsR0FBbUI7R0FHakIsRUFBTyxVQUFVLGlCQUNuQixHQUFtQjs7SUFJakIsRUFBVyxVQUFVLGFBQWUsRUFBTyxVQUFVLGVBQ3ZELEVBQU0sS0FBSyxhQUFhLEVBQ3hCLEdBQW1COztHQUlqQixFQUFPLFVBQVUsV0FDbkIsRUFBTSxLQUFLLGFBQWEsRUFFdEIsRUFBTyxVQUFVLE9BQ25CLEVBQU0sS0FBSyxNQUFNLEVBRWYsRUFBTyx5QkFHVCxHQUFtQjs7R0FJakIsRUFBTyxVQUFVLGFBQ25CLEdBQW1CO0lBR2pCLEVBQU8sY0FBZ0IsRUFBVyxnQkFLcEMsR0FBbUI7OztHQVFqQixHQUFxQixDQUFNLEVBQzdCLEdBQW1CO09BRWQsR0FBSSxFQUFPLDJCQUE2QixDQUFDLEdBQTZCLENBQU0sRUFBRyxDQU9wRixJQUFNLEVBQWtCLEVBQUssUUFBUSxFQUFPLFFBQVMsMkJBQTJCLEVBQzVFLEVBQUcsV0FBVyxDQUFlLEdBQy9CLE1BQU0sRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQWlCLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxDQUVoRixFQUNJLEVBQVcsVUFBVSxRQUFVLEVBQU8sVUFBVSxVQUNsRCxHQUFtQjtHQUlyQixJQUFJLEVBQVksR0FDaEIsSUFBSyxJQUFNLEtBQVEsRUFBTyxDQUN4QixJQUFJLEVBQVcsTUFBTSxHQUFVLENBQUksR0FBTSxHQUN6QyxHQUFJLENBQUMsRUFBUyxDQUNaLElBQU0sRUFBTSxtREFBbUQsSUFDekQsRUFBVyxNQUFNLE1BQU0sQ0FBRyxFQUMxQixFQUFlLE1BQU0sRUFBUyxLQUFLLEVBQ3pDLEdBQUksQ0FBQyxFQUFTLElBQU0sRUFBYSxTQUFTLHFCQUFxQixHQUFLLEVBQWEsU0FBUyxTQUFTLEVBQUcsQ0FDcEcsUUFBUSxNQUFNLG1CQUFtQixHQUFLLEVBQ3RDLE1BQ0YsQ0FDQSxFQUFVLEVBQWEsS0FBSyxFQUM1QixNQUFNLEVBQVksUUFBVSxHQUFXLEVBQU0sQ0FBTyxDQUFDLEVBQ2pELEVBQVEsV0FDVixRQUFRLEtBQUssV0FBVyxHQUFLLENBRWpDLENBQ0ksSUFBVyxHQUFhO0dBQzVCLEdBQWEsRUFBVTtDQUN6QixDQUNNLE1BQU0sRUFBZSwwQkFBMEIsQ0FBUSxJQUMzRCxFQUFZLEVBQVUsUUFBUSxlQUFnQixnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsV0FBWSxRQUFRLElBRTFGLEVBQU8sMkJBQTZCLEVBQU8sMEJBQzdDLEVBQVksRUFDVCxXQUFXLHlCQUEwQixpQkFBaUIsQ0FBQyxDQUN2RCxXQUFXLDRCQUE2QixvQkFBb0IsQ0FBQyxDQUM3RCxXQUFXLG1DQUFvQywyQkFBMkIsQ0FBQyxDQUMzRSxXQUFXLDJCQUE0QixtQkFBbUIsQ0FBQyxDQUMzRCxXQUFXLHFCQUFzQixhQUFhLENBQUMsQ0FDL0MsV0FBVyx1QkFBd0IsZUFBZSxDQUFDLENBQ25ELFdBQVcsY0FBZSxPQUFPLENBQUMsQ0FDbEMsV0FBVyxjQUFlLE9BQU8sRUFDaEMsRUFBTyx5QkFDVCxFQUFZLEVBQVUsV0FBVyx5QkFBMEIscUJBQXFCLElBR3BGLEVBQVksRUFBVSxXQUFXLGVBQWdCLFNBQVMsRUFDdEQsRUFBTyxVQUFVLFFBR25CLEVBQVksRUFBVSxXQUFXLGNBQWUsVUFBVSxJQUV4RCxFQUFPLHdCQUEwQixFQUFPLG9DQU8xQyxFQUFZLEVBQVUsV0FBVyxrQkFBbUIsY0FBYyxJQUVoRSxFQUFXLFVBQVUsYUFBZSxFQUFPLFVBQVUsYUFBZSxFQUFPLDBCQUM3RSxFQUFZLEVBQVUsV0FBVyxrQkFBbUI7V0FBZ0IsR0FFdEUsSUFBTSxFQUFhLEVBQWtCO0VBQU8sRUFBWSxFQUN4RCxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBQUMsQ0FDdkUsQ0FBQyxDQUNILENBRUEsTUFBTSxHQUFVLEVBQUssS0FBSyxFQUFHLFFBQVEsRUFBRyxTQUFVLE9BQVEsV0FBVyxFQUVyRSxlQUFlLEdBQVcsRUFBYyxFQUFnQyxDQUN0RSxNQUFNLEVBQUcsU0FBUyxNQUFNLEdBQVMsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUNwRCxNQUFNLEVBQUcsU0FBUyxVQUFVLEVBQUssS0FBSyxHQUFTLENBQUksRUFBRyxDQUFPLENBQy9ELENBRUEsZUFBZSxHQUFVLEVBQTJDLENBQ2xFLEdBQUksQ0FDRixJQUFNLEVBQU8sTUFBTSxFQUFHLFNBQVMsS0FBSyxFQUFLLEtBQUssR0FBUyxDQUFJLENBQUMsRUFJNUQsT0FISSxLQUFLLElBQUksRUFBSSxFQUFLLFFBQVUsTUFDOUIsT0FFSyxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQUssS0FBSyxHQUFTLENBQUksRUFBRyxNQUFNLENBQ3BFLE1BQVEsQ0FFUixDQUNGLENDM09BLFNBQWdCLElBQXlCLENBQ3ZDLE9BQU8sR0FBb0IsQ0FBQyxDQUFDLE9BQy9CLENBR0EsTUFBTSxHQUFvQixFQUFLLEtBQUssV0FBWSxNQUFNLEVBT3RELFNBQWdCLElBQTBDLENBT3hELE1BSkEsQ0FFRSxNQURBLEdBQXFCLEdBQXdCLEVBQ25CLElBRXJCLEVBQ1QsQ0FFQSxJQUFJLEdBQTBCLEdBQzFCLEdBRUosU0FBUyxJQUE4QyxDQUNyRCxHQUFNLENBQUUsT0FBTSxVQUFTLFdBQVksR0FBb0IsRUFDdkQsR0FBSSxDQUFDLEVBQVEsV0FBVyxRQUF1QixFQUFHLE9BQU8sRUFNekQsSUFBTSxFQUFpQixHQUFPLENBQUMsWUFBYSxpQkFBaUIsRUFBRyxDQUFPLEVBQ3ZFLEdBQ0UsQ0FBQyxHQUNELEVBQUssU0FBUyxFQUFnQixDQUFPLElBQU0sSUFDM0MsQ0FBQyxHQUFpQixDQUFjLEVBRWhDLE9BRUYsSUFBTSxFQUFhLEdBQU8sQ0FBQyxZQUFhLFlBQWEsTUFBTSxFQUFHLENBQU8sRUFDckUsR0FBSSxDQUFDLEVBQVksT0FVakIsSUFBTSxFQUFVLEdBQWlCLENBQWMsRUFDM0MsT0FBWSxJQUFBLEdBS2hCLE9BSkksRUFBZ0IsR0FBRyxFQUFXLGNBSTNCLEdBQTBCLEVBQU0sQ0FBTyxHQUFLLEdBQUcsRUFBVyxPQUNuRSxDQUdBLFNBQVMsR0FBMEIsRUFBcUIsRUFBaUMsQ0FDdkYsSUFBTSxFQUFZLEdBQUcsRUFBWSxHQUVqQyxPQUFPLEdBQU8sQ0FBQyxNQUFPLGNBQWUsTUFBTSxFQUFHLENBQUcsQ0FBQyxFQUM5QyxNQUFNO0NBQUksQ0FBQyxDQUNaLEtBQU0sR0FBUSxFQUFJLFdBQVcsQ0FBUyxDQUFDLENBQUMsRUFDdkMsTUFBTSxFQUFVLE1BQU0sQ0FDNUIsQ0FFQSxTQUFTLEdBQWlCLEVBQWlDLENBSXpELE1BQU8sQ0FBQyxDQURXLEdBQU8sQ0FBQyxTQUFVLElBQUksRUFBRyxDQUMxQixDQUFDLEVBQUUsTUFBTTtDQUFJLENBQUMsQ0FBQyxLQUFNLEdBQVMsR0FBcUIsRUFBSyxNQUFNLFNBQVMsQ0FBQyxDQUFDLElBQU0sRUFBRSxDQUFDLENBQ3RHLENBRUEsTUFBTSxHQUEwQix1Q0FTaEMsU0FBUyxHQUFxQixFQUFzQixDQUdsRCxJQUFNLEVBQVcscUNBQXFDLEtBQUssQ0FBRyxFQUM5RCxHQUFJLEVBQ0YsT0FBTyxFQUFTLEVBQUUsQ0FBRSxZQUFZLElBQU0sY0FBZ0IsR0FBd0IsS0FBSyxFQUFTLEVBQUcsRUFFakcsR0FBSSxDQUNGLEdBQU0sQ0FBRSxXQUFVLFlBQWEsSUFBSSxJQUFJLENBQUcsRUFDMUMsT0FBTyxFQUFTLFlBQVksSUFBTSxjQUFnQixHQUF3QixLQUFLLENBQVEsQ0FDekYsTUFBUSxDQUNOLE1BQU8sRUFDVCxDQUNGLENBRUEsU0FBUyxHQUFpQixFQUE2QyxDQUNyRSxJQUFNLEVBQU9DLEVBQWMsVUFDekIsTUFDQSxDQUNFLFNBQ0EsY0FDQSx3QkFDQSxLQUNBLFVBQVUsRUFBSyxRQUFRLEVBQWlCLEVBQUUsV0FDMUMsVUFBVSxFQUFLLFFBQVEsRUFBaUIsRUFBRSxXQUMxQyxVQUFVLEVBQUssUUFBUSxFQUFpQixFQUFFLGNBQzVDLEVBQ0EsQ0FBRSxJQUFLLEVBQWdCLFNBQVUsT0FBUSxNQUFPLE1BQU8sQ0FDekQsRUFDQSxPQUFPLEVBQUssU0FBVyxFQUFJLENBQUMsQ0FBQyxFQUFLLE9BQU8sS0FBSyxFQUFJLElBQUEsRUFDcEQsQ0FFQSxTQUFTLEdBQU8sRUFBZ0IsRUFBaUMsQ0FDL0QsSUFBTSxFQUFPQSxFQUFjLFVBQVUsTUFBTyxFQUFNLENBQUUsTUFBSyxTQUFVLE9BQVEsTUFBTyxNQUFPLENBQUMsRUFDMUYsT0FBTyxFQUFLLFNBQVcsR0FBSSxFQUFLLE9BQU8sS0FBSyxHQUFpQixJQUFBLEVBQy9ELENBRUEsSUFBSSxHQUdKLFNBQWdCLElBQXlCLENBQ3ZDLE9BQU8sR0FBb0IsQ0FBQyxDQUFDLE9BQy9CLENBRUEsU0FBUyxJQUEwRSxDQUNqRixHQUFJLEdBQXVCLE9BQU8sR0FJbEMsSUFBSSxFQUFVLEVBQUssUUFBUSxHQUFjLFlBQVksR0FBRyxDQUFDLEVBQ3pELEtBQU8sQ0FBQyxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQVMsY0FBYyxDQUFDLEdBQUcsQ0FDekQsSUFBTSxFQUFnQixFQUFLLFFBQVEsQ0FBTyxFQUUxQyxHQUFJLElBQWtCLEVBQVMsTUFBVSxNQUFNLHFDQUFxQyxFQUNwRixFQUFVLENBQ1osQ0FDQSxJQUFNLEVBQWMsS0FBSyxNQUFNLEVBQUcsYUFBYSxFQUFLLEtBQUssRUFBUyxjQUFjLEVBQUcsTUFBTSxDQUFDLEVBSzFGLE1BREEsSUFBd0IsQ0FBRSxLQUFNLEVBQVksS0FBTSxRQUFTLEVBQVksUUFBUyxTQUFRLEVBQ2pGLEVBQ1QsQ0NySkEsU0FBZ0IsSUFBdUMsQ0FDckQsR0FBTSxDQUFFLFVBQVcsRUFBVSxPQUFRLENBQUMsRUFBSyxLQUFLLEdBQWUsRUFBRyxVQUFXLHdCQUF3QixDQUFDLEVBQUcsQ0FDdkcsTUFBTyxTQUNULENBQUMsRUFJRCxPQUhJLElBQVcsSUFFZixRQUFRLEtBQUssdUZBQXVGLEVBQzdGLEdBQ1QsQ0NsQkEsU0FBZ0IsRUFBa0IsRUFBZ0MsQ0FDaEUsT0FDRSxFQUFPLHVCQUNQLEVBQU8saUNBQ1AsRUFBTyx1QkFDUCxFQUFPLCtCQUVYLENBRUEsU0FBZ0IsR0FBZ0IsRUFBZ0MsQ0FDOUQsT0FBTyxFQUFPLGlCQUFtQixFQUFPLHlCQUMxQyxDQ0VBLGVBQXNCLEdBQXFCLEVBQXNDLENBQy9FLE9BQU8sRUFBTywwQkFBMEIsdUJBQXdCLFNBQVksQ0FDMUUsSUFBTSxFQUFVLEVBQUssUUFBUSxFQUFPLFFBQVMsT0FBTyxFQUNwRCxHQUFJLEVBQUcsV0FBVyxDQUFPLEVBQUcsQ0FDMUIsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFTLGtCQUFrQixFQUN6RCxNQUFPLEVBQWtCLENBQU0sR0FBSyxHQUFnQixDQUFNLEVBQ3RELEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxHQUF1QixDQUFNLENBQUMsQ0FBQyxFQUNuRixFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBVSxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsRUFDckUsQ0FDRixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQXVCLEVBQStCLENBb0I3RCxNQUFPOzs7TUFuQmEsQ0FDbEIsQ0FDRSxLQUFNLDJEQUNOLFVBQVcsRUFBa0IsQ0FBTSxFQUNuQyxXQUFZLEVBQVcsTUFDdkIsS0FBTSxRQUNOLFFBQVMsMENBQ1gsRUFDQSxDQUNFLEtBQU0sa0JBQ04sVUFBVyxHQUFnQixDQUFNLEVBQ2pDLFdBQVksRUFBVyxhQUN2QixLQUFNLFdBQ04sUUFBUyw2Q0FDWCxDQUNGLENBQUMsQ0FDRSxPQUFRLEdBQVMsRUFBSyxTQUFTLENBQUMsQ0FDaEMsUUFBUyxHQUFTLEVBQUssV0FBVyxJQUFLLEdBQVEsR0FBa0IsRUFBSyxRQUFTLEVBQUssS0FBTSxFQUFLLEtBQU0sQ0FBRyxDQUFDLENBSzlGLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7O0NBSTNCLENBRUEsU0FBUyxHQUFrQixFQUFnQixFQUFjLEVBQWMsRUFBMkIsQ0FDaEcsTUFBTzt3Q0FDK0IsRUFBSzs7Ozs0Q0FJRCxFQUFVOzttQ0FFbkIsRUFBSyxLQUFLLEVBQVU7Ozs7OztzQ0FNakIsRUFBTzs7Ozs7OztDQVE3QyxDQzFFQSxTQUFnQixHQUNkLEVBQ0EsRUFDb0IsQ0FDaEIsTUFBQyxFQUFPLFVBQVUsV0FBYSxDQUFDLElBQVUsZ0JBQzlDLE1BQU8saUNBQ1QsQ0NWQSxNQUFNLElBQU8sRUFBUSxJQUFRLE9BQU8sVUFBVSxlQUFlLEtBQUssRUFBUSxDQUFHLEVBRTdFLFNBQXdCLEVBQXdCLEVBQVEsRUFBVSxDQUNoRSxJQUFJLEVBQU0sRUFBUSxFQUVkLE9BQU8sR0FBYSxXQUN0QixFQUFTLEVBRVQsRUFBTyxFQUdULElBQU0sRUFBUSxDQUFDLEVBR2YsSUFBSyxJQUFPLENBRlEsR0FBSSxHQUFRLENBQUMsRUFBSSxHQUFHLE9BQU8sS0FBSyxDQUFNLENBQUMsQ0FBQyxLQUFLLENBQU0sQ0FFbEQsRUFDZixHQUFJLEVBQVEsQ0FBRyxJQUNqQixFQUFNLEdBQU8sRUFBTyxJQUl4QixPQUFPLENBQ1QsQ0NwQkEsTUFBTSxHQUFlLGdCQUVmLEdBQW9CLFFBSTFCLFNBQVMsR0FBd0IsRUFBb0IsRUFBWSxFQUFPLENBQ3ZFLE9BQU8sR0FBc0IsSUFBZSxJQUFxQixJQUFVLENBQzVFLENBZ0JBLFNBQVMsR0FBZSxFQUFRLEVBQW9CLENBQ25ELElBQU0sRUFBVSxJQUFJLElBR2hCLEVBQWUsRUFDZixFQUdBLEVBRUosSUFBSyxJQUFNLEtBQVEsRUFBTyxNQUFNLEtBQUssRUFBRyxDQUN2QyxHQUFJLENBQUMsRUFFSixTQUdELElBQU0sRUFBVSxFQUFLLE1BQU0sRUFBWSxFQUV2QyxHQUFJLElBQVksS0FDZixFQUFlLEVBQ2YsRUFBcUIsT0FDZixDQUNOLElBQU0sRUFBUyxFQUFRLEVBQUUsQ0FBQyxPQUNwQixFQUFhLEVBQVEsR0FBSyxHQUFvQixNQUdwRCxHQUFJLEdBQXdCLEVBQW9CLEVBQVksQ0FBTSxFQUNqRSxTQUdHLElBQWUsSUFDbEIsRUFBZSxHQUdoQixFQUFxQixFQUVyQixJQUFJLEVBQU0sRUFDTixFQUFTLEVBRVAsRUFBbUIsRUFBUyxFQUlsQyxHQUhBLEVBQWUsRUFHWCxJQUFxQixFQUV4QixFQUFNLEVBRU4sRUFBUyxNQUVILENBQ04sSUFBTSxFQUEyQixLQUFLLElBQUksQ0FBZ0IsRUFJMUQsR0FBSSxHQUF3QixFQUFvQixFQUFZLENBQXdCLEVBQ25GLFNBR0QsRUFBTSxHQUFpQixFQUFZLENBQXdCLENBQzVELENBR0EsSUFBTSxFQUFRLEVBQVEsSUFBSSxDQUFHLEVBQzdCLEVBQVEsSUFBSSxFQUFLLElBQVUsSUFBQSxHQUFZLENBQUMsRUFBRyxDQUFDLEVBQUksQ0FBQyxFQUFNLEdBQUssRUFBSyxFQUFNLEdBQUssQ0FBTSxDQUFDLENBQ3BGLENBQ0QsQ0FFQSxPQUFPLENBQ1IsQ0FHQSxTQUFTLEdBQWlCLEVBQVksRUFBYyxDQUVuRCxPQURzQixJQUFlLEdBQW9CLElBQU0sS0FDeEMsT0FBTyxDQUFZLENBQzNDLENBR0EsU0FBUyxHQUFpQixFQUFZLENBTXJDLE1BQU8sQ0FBQyxLQUxnQixFQUFXLEtBQU8sSUFDWCxHQUFvQixNQUlyQyxPQUZDLE9BQU8sRUFBVyxNQUFNLENBQUMsQ0FFckIsQ0FBQyxDQUNyQixDQUlBLFNBQVMsR0FBZSxFQUFTLENBQ2hDLElBQUksRUFDQSxFQUFVLEVBQ1YsRUFBWSxFQUVoQixJQUFLLEdBQU0sQ0FBQyxFQUFLLENBQUMsRUFBVyxNQUFZLEdBQ3BDLEVBQVksR0FBWSxJQUFjLEdBQVcsRUFBUyxLQUM3RCxFQUFVLEVBQ1YsRUFBWSxFQUNaLEVBQVMsR0FJWCxPQUFPLENBQ1IsQ0FFQSxTQUFTLEdBQWlCLEVBQU0sRUFBUSxDQUV2QyxPQUR3QixJQUFTLEdBQW9CLElBQU0sSUFBQSxDQUNwQyxPQUFPLENBQU0sQ0FDckMsQ0FFQSxTQUF3QixHQUFhLEVBQVEsQ0FDNUMsR0FBSSxPQUFPLEdBQVcsU0FDckIsTUFBVSxVQUFVLG1CQUFtQixFQUt4QyxJQUFJLEVBQVUsR0FBZSxFQUFRLEVBQUksRUFDckMsRUFBUSxPQUFTLElBQ3BCLEVBQVUsR0FBZSxFQUFRLEVBQUssR0FHdkMsSUFBTSxFQUFzQixHQUFlLENBQU8sRUFFOUMsRUFDQSxFQUFTLEVBQ1QsRUFBUyxHQU9iLE9BTEksSUFBd0IsSUFBQSxLQUMxQixrQkFBaUIsR0FBaUIsQ0FBbUIsRUFDdEQsRUFBUyxHQUFpQixFQUFNLENBQU0sR0FHaEMsQ0FDTixTQUNBLE9BQ0EsUUFDRCxDQUNELENDbEtBLFNBQWdCLEdBQWMsRUFBUSxDQUNyQyxHQUFJLE9BQU8sR0FBVyxTQUNyQixNQUFVLFVBQVUsbUJBQW1CLEVBR3hDLElBQU0sRUFBVyxFQUFPLE1BQU0sWUFBWSxHQUFLLENBQUMsRUFFaEQsR0FBSSxFQUFTLFNBQVcsRUFDdkIsT0FHRCxJQUFNLEVBQU8sRUFBUyxPQUFPLEdBQVcsSUFBWTtDQUFNLENBQUMsQ0FBQyxPQUc1RCxPQUFPLEVBRkksRUFBUyxPQUFTLEVBRVY7RUFBUztDQUM3QixDQUVBLFNBQWdCLEdBQXNCLEVBQVEsQ0FDN0MsT0FBUSxPQUFPLEdBQVcsVUFBWSxHQUFjLENBQU0sR0FBTTtDQUNqRSw0YUVuQkEsU0FBd0IsR0FBYyxFQUFPLENBQzVDLEdBQUksT0FBTyxHQUFVLFdBQVksRUFDaEMsTUFBTyxHQUdSLElBQU0sRUFBWSxPQUFPLGVBQWUsQ0FBSyxFQUM3QyxPQUFRLElBQWMsTUFBUSxJQUFjLE9BQU8sV0FBYSxPQUFPLGVBQWUsQ0FBUyxJQUFNLE9BQVMsRUFBRSxPQUFPLGVBQWUsSUFBVSxFQUFFLE9BQU8sWUFBWSxFQUN0SyxDQ0VBLE1BQU0sRUFDSCxJQUNBLEVBQUcsR0FBRyxJQUNMLEVBQUksUUFBUSxFQUFRLElBQU8sRUFBRyxFQUFRLEdBQUcsQ0FBSSxFQUFHLENBQUMsRUFDL0MsR0FBVyxHQUFRLEdBQU8sTUFBTSxRQUFRLENBQUMsRUFBSSxFQUFHLENBQUMsRUFBSSxFQUNyRCxHQUFpQixHQUFRLEdBQzdCLE1BQU0sUUFBUSxDQUFDLEdBQUssRUFBRSxNQUFPLEdBQVMsT0FBTyxHQUFTLFFBQVEsRUFBSSxFQUFHLENBQUMsRUFBSSxFQUN0RSxHQUFPLEdBQWUsR0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUUsQ0FBQyxDQUFDLEVBRTdDLEdBQW1CLEVBQUssQ0FBQyxHQURiLEdBQWUsR0FBVSxFQUFNLFNBQVMsQ0FDYixDQUFDLENBQUMsRUFDekMsRUFDSCxJQUNBLEVBQUcsR0FBRyxJQUNMLEdBQWMsQ0FBQyxFQUFJLEVBQUcsRUFBRyxHQUFHLENBQUksRUFBSSxFQUNsQyxHQUFnQixFQUFZLElBQVMsQ0FDekMsSUFBTSxFQUFPLEVBQVUsSUFDakIsSUFDRixFQUFTLE9BQU8sWUFDZCxPQUFPLFFBQVEsQ0FBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUssS0FBVyxDQUFDLEVBQUssRUFBSyxDQUFLLENBQUMsQ0FBQyxDQUNqRSxHQUdLQyxFQUFlLEVBQVEsQ0FBVSxFQUN6QyxFQUVELE9BQU8sQ0FDVCxFQUNNLEVBQWEsRUFBYSxFQUMxQixHQUFnQixFQUFhLENBQUMsT0FBUSxLQUFLLENBQUMsRUFDNUMsR0FBbUIsRUFBYSxDQUFDLE9BQVEsUUFBUyxLQUFLLENBQUMsRUFDeEQsR0FBa0IsRUFBYSxDQUNuQyxNQUNBLE1BQ0EsTUFDQSxNQUNBLFVBQ0EsTUFDRixDQUFDLEVBQ0ssR0FBZ0IsRUFBVSxJQUM5QixHQUFVLEVBQVEsR0FBRyxJQUNuQixPQUFPLE9BQU8sRUFBUSxDQUFRLEVBQzFCLENBQUUsR0FBRyxHQUFTLEdBQVcsRUFBSyxFQUFPLEdBQVcsR0FBRyxDQUFJLENBQUUsRUFDekQsQ0FDTixFQUNJLEdBQWUsRUFBYUMsRUFBUSxFQUVwQyxHQUE0QixHQUFjLENBRTlDLEdBQU0sQ0FBQyxHQUFrQixFQUFVLE1BQU0sR0FBRyxFQUN0QyxFQUFZLENBQUMsR0FBRyxFQUFlLFNBQVMsR0FBRyxDQUFDLEVBQ2xELEdBQ0UsQ0FBQyxFQUFVLFFBQ1YsRUFBVSxTQUFXLEdBQUssRUFBVSxFQUFFLENBQUMsUUFBVSxFQUVsRCxNQUFPLENBQUUsS0FBTSxDQUFVLEVBRTNCLElBQU0sRUFBYSxFQUFVLElBQUksQ0FBQyxDQUFDLE1BQ25DLE1BQU8sQ0FDTCxLQUFNLEVBQWUsVUFBVSxFQUFHLENBQVUsRUFDNUMsTUFBTyxFQUFlLFVBQVUsRUFBYSxDQUFDLENBQ2hELENBQ0YsRUFFTSxHQUFxQixHQUFjLEVBQUcsSUFBTSxDQUNoRCxHQUFNLENBQUUsS0FBTSxFQUFPLE1BQU8sR0FBVyxHQUF5QixDQUFDLEVBQzNELENBQUUsS0FBTSxFQUFPLE1BQU8sR0FBVyxHQUF5QixDQUFDLEVBV2pFLE9BVEksSUFBVSxFQUdULEVBR0EsRUFHRSxFQUFjLEdBQWlCLENBQU0sRUFBRyxHQUFpQixDQUFNLENBQUMsRUFGOUQsRUFIQSxHQUhBLEVBQU0sY0FBYyxFQUFPLElBQUksQ0FTMUMsQ0FBQyxFQUVLLEdBQWtCLEdBQVUsQ0FDaEMsSUFBTSxFQUFRLEVBQU0sUUFBUSxJQUFLLEtBQU0sV0FBVyxHQUFHLENBQVMsRUFFOUQsT0FBTyxJQUFVLEdBQUssRUFBUSxFQUFNLE1BQU0sRUFBRyxDQUFLLENBQ3BELEVBRU0sSUFBcUIsRUFBRyxJQUFNLENBQ2xDLElBQU0sRUFBZSxHQUFlLENBQUMsRUFDL0IsRUFBZSxHQUFlLENBQUMsRUFJckMsT0FGSSxFQUFlLEVBQXFCLEdBQ3hDLEVBQUksRUFBZSxFQUVyQixFQUdNLEdBQVEsSUFBSSxJQUNaLE9BQTJCLENBQy9CLElBQU0sRUFBTSxRQUFRLElBQUksRUFXeEIsT0FWSyxHQUFNLElBQUksQ0FBRyxHQUNoQixHQUFNLElBQ0osRUFDQSxFQUFHLFdBQVcsV0FBVyxHQUN2QixFQUFHLFdBQVcsUUFBUSxHQUN0QixFQUFHLFdBQVcsYUFBYSxHQUMzQixFQUFHLFdBQVcsZ0JBQWdCLEdBQzlCLEVBQUcsV0FBVyxxQkFBcUIsQ0FDdkMsRUFFSyxHQUFNLElBQUksQ0FBRyxDQUN0QixFQU9BLFNBQVMsR0FBOEIsRUFBYSxDQXVCbEQsT0FyQkksT0FBTyxFQUFZLGdCQUFtQixTQUNqQyxFQUFZLGVBQWUsV0FBVyxNQUFNLEVBR2pELEVBQVksWUFBWSxnQkFBZ0IsS0FDbkMsRUFBWSxXQUFXLGVBQWUsT0FBUyxNQUdwRCxFQUFZLEtBQ1AsR0FJTCxFQUFZLFNBQVMsSUFDaEIsR0FHVCxDQUFJLEdBQW1CLENBS3pCLENBT0EsTUFBTSxHQUFtQixHQUFVLEVBQWMsSUFFM0MsT0FBTyxLQUFLLENBQVksQ0FBQyxDQUFDLE9BQVMsRUFDOUIsRUFLTCxHQUE4QixDQUFXLEVBQ3BDRCxFQUFlLEdBQWUsRUFBRyxJQUFNLEVBQUUsY0FBYyxFQUFHLElBQUksQ0FBQyxFQUdqRUEsRUFBZSxDQUFZLENBQ25DLEVBU0ssR0FBaUIsRUFBSyxDQUMxQixFQUFhLENBQUMsV0FBWSxTQUFTLENBQUMsRUFDcEMsRUFBYSxXQUFZLEVBQWdCLEVBQ3pDLEVBQWEsVUFBVyxFQUFnQixDQUMxQyxDQUFDLEVBdUJLLEdBQW1CLEVBQUssQ0FDNUIsRUFBYSxDQWpCYixRQUNBLGdCQUVBLE1BQ0EsU0FDQSxnQkFDQSxXQUNBLFVBQ0EsVUFDQSxRQUNBLFlBQ0EsVUFDQSxZQUNBLGlCQUNBLCtCQUdzQyxDQUFDLEVBQ3ZDLEVBQWEsTUFBTyxDQUFVLEVBQzlCLEVBQWEsVUFBVyxDQUFVLEVBQ2xDLEVBQ0UsWUFDQSxHQUFTLEdBQWMsRUFBVSxJQUFJLEVBQWdCLENBQUMsQ0FDeEQsRUFDQSxFQUFhLGdCQUFpQixDQUFVLEVBQ3hDLEVBQ0UsUUFDQSxHQUNHLEVBQU8sSUFDTixFQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBUyxFQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFDM0MsRUFBTSxjQUFjLENBQUssQ0FDN0IsQ0FDRixFQUNBLEVBQWEsV0FBWSxDQUFVLENBQ3JDLENBQUMsRUFDSyxHQUF3QixFQUFhLENBQUMsY0FBZSxNQUFPLE1BQU0sQ0FBQyxFQUVuRSxHQUFxQixFQUFLLENBRTlCLEVBQVUsR0FDUkEsRUFBZSxFQUFRLENBQ3JCLEdBQUcsT0FBTyxLQUFLLENBQU0sQ0FBQyxDQUNuQixPQUFRLEdBQVEsSUFBUSxXQUFXLENBQUMsQ0FDcEMsS0FBSyxFQUNSLFdBQ0YsQ0FBQyxDQUNILEVBRUEsRUFDRSxZQUVBLEdBQVMsR0FDUCxFQUFVLElBQ1IsRUFBSyxDQUVILEVBRUEsRUFBYSxVQUFXLENBQVUsQ0FDcEMsQ0FBQyxDQUNILENBQ0YsQ0FDRixDQUNGLENBQUMsRUFFSyxHQUFZLEVBQWEsQ0FBQyxPQUFRLE1BQU8sTUFBTSxDQUFDLEVBSWhELEdBQW1CLEVBQUssQ0FDNUIsRUFBYSxDQUZpQixVQUFXLGVBQWdCLFFBQVMsUUFFaEMsQ0FBQyxFQUNuQyxFQUNFLGVBQ0EsR0FBUyxHQUFTLEVBQUssSUFBSSxFQUFhLENBQUMsU0FBVSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2pFLEVBQ0EsRUFDRSxNQUNBLEVBQVUsR0FDUkEsRUFDRSxPQUFPLFlBQ0wsT0FBTyxRQUFRLENBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFLLEtBQVcsQ0FDeEMsRUFDQSxFQUFhLENBQUMsV0FBWSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUssQ0FDN0MsQ0FBQyxDQUNILENBQ0YsQ0FDRixDQUNGLEVBQ0EsRUFDRSxVQUNBLEVBQUssQ0FBQyxFQUFhLENBQUMsV0FBVyxDQUFDLEVBQUcsRUFBYSxZQUFhLENBQVUsQ0FBQyxDQUFDLENBQzNFLENBQ0YsQ0FBQyxFQUNLLEdBQWEsRUFBVSxHQUMzQkEsRUFDRSxPQUFPLFlBQ0wsT0FBTyxRQUFRLENBQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFNLEtBQVksQ0FDN0MsRUFDQSxHQUFpQixDQUFNLENBQ3pCLENBQUMsQ0FDSCxDQUNGLENBQ0YsRUFDTSxHQUFpQixFQUNyQixpQkFDQSxFQUFhLENBQUMsT0FBUSxVQUFXLFFBQVEsQ0FBQyxDQUM1QyxFQWtCTSxHQUFpQixFQUFLLENBQzFCLEVBQWEsQ0FoQmIsc0JBQ0EseUJBQ0Esd0JBQ0EsNEJBQ0EsNEJBQ0EseUJBQ0EsZUFDQSxjQUNBLGtCQUNBLHlCQUNBLFlBQ0Esc0JBQ0EsbUJBSW9DLEVBQUcsRUFBSSxFQUMzQyxFQUFhLFlBQWEsRUFBa0IsQ0FDOUMsQ0FBQyxFQUdLLEdBQW9CLElBQUksSUFBSSxDQUNoQyxVQUNBLE9BQ0EsVUFDQSxVQUNBLFVBQ0EsYUFDQSxRQUNBLE9BQ0EsT0FDQSxZQUNBLFNBQ0YsQ0FBQyxFQUVLLElBQW9CLEVBQVksSUFFbEMsT0FBTyxPQUFPLEVBQWEsaUJBQWlCLEdBQzVDLE9BQU8sT0FBTyxFQUFZLGdCQUFpQixDQUFVLEVBSW5ELEdBQ0osMEZBRUksR0FBc0IsR0FDMUIsRUFBUSxTQUFTLEdBQUcsR0FBSyxHQUFXLEtBQUssQ0FBTyxFQUU1QyxHQUF1QixHQUV6QixDQUFDLEdBQWlCLGNBQWUsQ0FBVyxHQUM1QyxDQUFDLEdBQWlCLGVBQWdCLENBQVcsRUFFdEMsR0FFTyxDQUFDLFVBQVcsZUFBZSxDQUFDLENBQUMsUUFBUyxHQUNwRCxFQUFZLEdBQVMsT0FBTyxPQUFPLEVBQVksRUFBTSxFQUFJLENBQUMsQ0FFL0MsQ0FBQyxDQUFDLEtBQU0sR0FBVyxHQUFtQixDQUFNLENBQUMsRUFHNUQsU0FBUyxHQUFnQixFQUFNLEVBQVMsR0FBSSxDQUMxQyxJQUFNLEVBQVcsSUFBSSxJQUNyQixJQUFLLElBQU0sS0FBTyxFQUFNLENBRXRCLElBQU0sR0FETyxFQUFTLEVBQUksTUFBTSxFQUFPLE9BQVMsQ0FBQyxFQUFJLEVBQUEsQ0FDcEMsUUFBUSxHQUFHLEVBQzVCLEdBQUksRUFBTSxFQUFHLENBQ1gsSUFBTSxFQUFPLEVBQUksTUFBTSxHQUFJLEVBQVMsRUFBTyxPQUFTLEVBQUksR0FBSyxDQUFHLEVBQzNELEVBQVMsSUFBSSxDQUFJLEdBQUcsRUFBUyxJQUFJLEVBQU0sQ0FBQyxDQUFDLEVBQzlDLEVBQVMsSUFBSSxDQUFJLENBQUMsQ0FBQyxLQUFLLENBQUcsQ0FDN0IsTUFDTyxFQUFTLElBQUksQ0FBRyxHQUFHLEVBQVMsSUFBSSxFQUFLLENBQUMsQ0FBQyxFQUM1QyxFQUFTLElBQUksQ0FBRyxDQUFDLENBQUMsS0FBSyxDQUFHLENBRTlCLENBQ0EsT0FBTyxNQUFNLEtBQUssRUFBUyxLQUFLLENBQUMsQ0FBQyxDQUMvQixLQUFLLENBQUMsQ0FDTixRQUFTLEdBQWEsQ0FDckIsSUFBTSxFQUFXLEVBQVMsSUFBSSxDQUFRLEVBQ3RDLEdBQ0UsRUFBUyxPQUFTLEdBQ2xCLEVBQVMsS0FBTSxHQUFNLElBQU0sR0FBWSxFQUFFLFdBQVcsRUFBVyxHQUFHLENBQUMsRUFDbkUsQ0FDQSxJQUFNLEVBQVMsRUFDWixPQUFRLEdBQU0sSUFBTSxHQUFZLENBQUMsRUFBRSxXQUFXLEVBQVcsR0FBRyxDQUFDLENBQUMsQ0FDOUQsS0FBSyxFQUNGLEVBQVMsRUFBUyxPQUFRLEdBQU0sRUFBRSxXQUFXLEVBQVcsR0FBRyxDQUFDLEVBQ2xFLE1BQU8sQ0FBQyxHQUFHLEVBQVEsR0FBRyxHQUFnQixFQUFRLENBQVEsQ0FBQyxDQUN6RCxDQUNBLE9BQU8sRUFBUyxLQUFLLENBQ3ZCLENBQUMsQ0FDTCxDQUVBLE1BQU0sR0FBYyxHQUFVLEVBQVMsSUFBZ0IsQ0FDckQsSUFBSSxFQUFRLE9BQU8sS0FBSyxDQUFPLEVBQ3pCLEVBQWEsSUFBSSxJQWlCdkIsTUFmQSxHQUFRLEVBQU0sSUFBSyxHQUFTLENBQzFCLElBQU0sRUFBVSxFQUFLLFFBQVEsZ0JBQWlCLEVBQUUsRUFLaEQsT0FKSSxHQUFrQixJQUFJLENBQU8sR0FBSyxFQUFNLFNBQVMsQ0FBTyxHQUMxRCxFQUFXLElBQUksQ0FBTyxFQUNmLEdBRUYsQ0FDVCxDQUFDLEVBRUksR0FBb0IsQ0FBVyxJQUNsQyxFQUFRLEdBQWdCLENBQUssR0FFL0IsRUFBUSxFQUFNLFFBQVMsR0FDckIsRUFBVyxJQUFJLENBQUcsRUFBSSxDQUFDLE1BQU0sSUFBTyxFQUFLLE9BQU8sR0FBSyxFQUFJLENBQUMsQ0FBRyxDQUMvRCxFQUNPQSxFQUFlLEVBQVMsQ0FBSyxDQUN0QyxDQUFDLEVBS0ssR0FBa0IsR0FBZSxDQUNyQyxHQUFNLENBQUUsb0JBQW9CLENBQUMsRUFBRyxpQkFBaUIsQ0FBQyxHQUFNLE9BQU8sUUFDN0QsRUFDQyxHQUNLLElBQWMsVUFDVCxvQkFHRixnQkFFWCxFQUVBLE1BQU8sQ0FBQyxHQUFHLEVBQWdCLEdBQUcsQ0FBaUIsQ0FDakQsRUFFTSxHQUFjLEVBQVUsR0FBWSxDQUN4QyxHQUFNLENBQUUsUUFBUSxDQUFDLEVBQUcsYUFBYSxDQUFDLEdBQU0sT0FBTyxRQUM3QyxPQUFPLEtBQUssQ0FBTyxFQUNsQixHQUFTLEVBQUksV0FBVyxHQUFHLEVBQUksUUFBVSxZQUM1QyxFQUVBLE9BQU8sT0FBTyxZQUNaLENBQUMsR0FBRyxFQUFPLEdBQUcsR0FBZSxDQUFVLENBQUMsQ0FBQyxDQUFDLElBQUssR0FBUSxDQUNyRCxFQUNBLEdBQVksRUFBUSxFQUFJLENBQzFCLENBQUMsQ0FDSCxDQUNGLENBQUMsRUFXSyxHQUFTLENBQ2IsQ0FBRSxJQUFLLFNBQVUsRUFDakIsQ0FBRSxJQUFLLE1BQU8sRUFDRCxDQUFFLElBQUssYUFBYyxFQUNsQyxDQUFFLElBQUssU0FBVSxFQUNOLENBQUUsSUFBSyxlQUFnQixFQUNsQyxDQUFFLElBQUssU0FBVSxFQUNqQixDQUFFLElBQUssYUFBYyxFQUNSLENBQUUsSUFBSyxhQUFjLEtBQU0sRUFBSyxFQUM3QyxDQUFFLElBQUssV0FBWSxLQUFNLEVBQUssRUFDOUIsQ0FBRSxJQUFLLFVBQVcsRUFDbEIsQ0FBRSxJQUFLLE9BQVEsS0FBTSxFQUFhLENBQUMsTUFBTyxPQUFPLENBQUMsQ0FBRSxFQUNwRCxDQUFFLElBQUssYUFBYyxLQUFNLEVBQWMsRUFDekMsQ0FBRSxJQUFLLFVBQVcsS0FBTSxFQUFjLEVBQ3RDLENBQUUsSUFBSyxVQUFXLEtBQU0sRUFBYyxFQUN6QixDQUFFLElBQUssS0FBTSxFQUMxQixDQUFFLElBQUssU0FBVSxLQUFNLEVBQWlCLEVBQ3hDLENBQ0UsSUFBSyxjQUNMLEtBQU0sR0FBUyxHQUFnQixFQUFZLElBQUksRUFBZ0IsQ0FBQyxDQUNsRSxFQUNBLENBQ0UsSUFBSyxlQUNMLEtBQU0sR0FBUyxHQUFpQixFQUFhLElBQUksRUFBZ0IsQ0FBQyxDQUNwRSxFQUNhLENBQUUsSUFBSyxXQUFZLEVBQ2hDLENBQUUsSUFBSyxhQUFjLEVBQ3JCLENBQUUsSUFBSyxNQUFPLEVBQ2QsQ0FBRSxJQUFLLFNBQVUsRUFDakIsQ0FBRSxJQUFLLFVBQVcsS0FBTSxFQUFZLEVBQ3BDLENBQUUsSUFBSyxNQUFPLEVBQ2QsQ0FBRSxJQUFLLFFBQVMsRUFDaEIsQ0FBRSxJQUFLLFVBQVcsRUFDbEIsQ0FBRSxJQUFLLFVBQVcsRUFDbEIsQ0FBRSxJQUFLLE9BQVEsRUFDZixDQUFFLElBQUssUUFBUyxFQUNoQixDQUFFLElBQUssUUFBUyxFQUNoQixDQUFFLElBQUssYUFBYyxFQUNyQixDQUFFLElBQUssU0FBVSxFQUNqQixDQUFFLElBQUssY0FBZSxFQUN0QixDQUFFLElBQUssT0FBUSxFQUNmLENBQUUsSUFBSyxlQUFnQixFQUN2QixDQUFFLElBQUssU0FBVSxFQUNqQixDQUFFLElBQUssT0FBUSxFQUNmLENBQUUsSUFBSyxTQUFVLEVBQ2pCLENBQUUsSUFBSyxjQUFlLEVBQ3RCLENBQUUsSUFBSyxRQUFTLEVBQ2hCLENBQUUsSUFBSyxNQUFPLEtBQU0sQ0FBVyxFQUMvQixDQUFFLElBQUssS0FBTSxFQUNiLENBQUUsSUFBSyxjQUFlLEtBQU0sRUFBZ0IsRUFDNUMsQ0FBRSxJQUFLLFFBQVMsS0FBTSxFQUFLLEVBQzNCLENBQUUsSUFBSyxhQUFjLEtBQU0sRUFBZSxFQUUxQyxDQUNFLElBQUssU0FDTCxLQUFNLEVBQWEsQ0FDakIsY0FDQSxjQUNBLGNBQ0EsZUFDQSxNQUNGLENBQUMsQ0FDSCxFQUNBLENBQUUsSUFBSyxVQUFXLEtBQU0sRUFBWSxFQUNwQyxDQUFFLElBQUssZ0JBQWlCLEtBQU0sRUFBWSxFQUMxQyxDQUFFLElBQUssU0FBVSxLQUFNLEVBQVcsRUFDckIsQ0FBRSxJQUFLLE1BQU8sRUFDZCxDQUFFLElBQUssY0FBZSxLQUFNLENBQVcsRUFDdkMsQ0FBRSxJQUFLLG1CQUFvQixLQUFNLEVBQUssRUFDbkQsQ0FBRSxJQUFLLFFBQVMsS0FBTSxFQUFhLFFBQVMsRUFBWSxDQUFFLEVBQzFELENBQUUsSUFBSyxtQkFBb0IsS0FBTSxFQUFhLEVBQzlDLENBQUUsSUFBSyxZQUFhLEVBQ3BCLENBQUUsSUFBSyxhQUFjLEtBQU0sQ0FBVyxFQUN0QyxDQUFFLElBQUssYUFBYyxFQUNyQixDQUFFLElBQUssYUFBYyxFQUNyQixDQUFFLElBQUssU0FBVSxLQUFNLENBQVcsRUFDbEMsQ0FBRSxJQUFLLGdCQUFpQixLQUFNLENBQVcsRUFDekMsQ0FBRSxJQUFLLGFBQWMsS0FBTSxDQUFXLEVBQ3RDLENBQUUsSUFBSyxRQUFTLEtBQU0sQ0FBVyxFQUNqQyxDQUFFLElBQUssY0FBZSxFQUN0QixDQUFFLElBQUssS0FBTSxLQUFNLENBQVcsRUFDOUIsQ0FBRSxJQUFLLFdBQVksS0FBTSxFQUFtQixFQUM1QyxDQUFFLElBQUssZUFBZ0IsS0FBTSxFQUFpQixFQUM5QyxDQUFFLElBQUssY0FBZSxFQUN0QixDQUFFLElBQUssaUJBQWtCLEtBQU0sQ0FBVyxFQUMxQyxDQUFFLElBQUssMkJBQTRCLEtBQU0sQ0FBVyxFQUNwRCxDQUFFLElBQUsscUJBQXNCLEtBQU0sQ0FBVyxFQUM5QyxDQUFFLElBQUssVUFBVyxLQUFNLENBQVcsRUFDbkMsQ0FBRSxJQUFLLGVBQWdCLEtBQU0sQ0FBVyxFQUN4QyxDQUFFLElBQUssV0FBWSxFQUNuQixDQUFFLElBQUssTUFBTyxLQUFNLENBQVcsRUFDL0IsQ0FBRSxJQUFLLE9BQVEsS0FBTSxDQUFXLEVBQ2hDLENBQUUsSUFBSyxhQUFjLEtBQU0sQ0FBVyxFQUN0QyxDQUFFLElBQUssYUFBYyxLQUFNLENBQVcsRUFDdEMsQ0FBRSxJQUFLLFFBQVMsS0FBTSxDQUFXLEVBQ2pDLENBQUUsSUFBSyxNQUFPLEtBQU0sQ0FBVyxFQUMvQixDQUFFLElBQUssS0FBTSxLQUFNLENBQVcsRUFDOUIsQ0FBRSxJQUFLLE1BQU8sS0FBTSxDQUFXLEVBQy9CLENBQUUsSUFBSyxRQUFTLEtBQU0sRUFBYSxJQUFBLEdBQVcsRUFBSSxDQUFFLEVBQ3BELENBQUUsSUFBSyxjQUFlLEtBQU0sQ0FBVyxFQUN2QyxDQUFFLElBQUssWUFBYSxLQUFNLEVBQWlCLEVBQzNDLENBQUUsSUFBSyxlQUFnQixLQUFNLEVBQWlCLEVBQzlDLENBQUUsSUFBSyxrQkFBbUIsS0FBTSxFQUFpQixFQUNqRCxDQUFFLElBQUssbUJBQW9CLEtBQU0sRUFBYSxHQUFtQixFQUFJLENBQUUsRUFDdkUsQ0FBRSxJQUFLLG1CQUFvQixLQUFNLEVBQWlCLEVBRWxELENBQUUsSUFBSyx1QkFBd0IsS0FBTSxFQUFhLElBQUEsR0FBVyxFQUFJLENBQUUsRUFDbkUsQ0FBRSxJQUFLLHVCQUF3QixLQUFNLEVBQWlCLEVBQ3RELENBQUUsSUFBSyxzQkFBdUIsS0FBTSxFQUFpQixFQUNyRCxDQUFFLElBQUsscUJBQXNCLEtBQU0sRUFBaUIsRUFDdkMsQ0FBRSxJQUFLLGdCQUFpQixLQUFNLEVBQWlCLEVBQy9DLENBQUUsSUFBSyx3QkFBeUIsS0FBTSxFQUFpQixFQUNwRSxDQUFFLElBQUssTUFBTyxFQUNkLENBQUUsSUFBSyxnQkFBaUIsRUFDeEIsQ0FBRSxJQUFLLFVBQVcsS0FBTSxDQUFXLEVBQ25DLENBQUUsSUFBSyxlQUFnQixLQUFNLENBQVcsRUFDeEMsQ0FBRSxJQUFLLGFBQWMsS0FBTSxFQUFlLEVBQzFDLENBQUUsSUFBSyxRQUFTLEtBQU0sRUFBVSxFQUNoQyxDQUFFLElBQUssY0FBZSxFQUN0QixDQUFFLElBQUssSUFBSyxFQUNaLENBQUUsSUFBSyxLQUFNLEVBQ2IsQ0FBRSxJQUFLLGVBQWdCLEtBQU0sQ0FBVyxFQUN4QyxDQUFFLElBQUssZ0JBQWlCLEtBQU0sQ0FBVyxFQUM1QixDQUFFLElBQUssTUFBTyxFQUNkLENBQ1gsSUFBSyxTQUNMLEtBQU0sR0FBUyxHQUFVLEVBQU0sSUFBSSxFQUFxQixDQUFDLENBQzNELEVBQ2EsQ0FBRSxJQUFLLGdCQUFpQixLQUFNLENBQVcsRUFDekMsQ0FBRSxJQUFLLFNBQVUsRUFDakIsQ0FBRSxJQUFLLFVBQVcsRUFDL0IsQ0FBRSxJQUFLLE9BQVEsS0FBTSxFQUFlLENBQ3RDLEVBRU0sR0FBbUIsR0FBTyxLQUFLLENBQUUsU0FBVSxDQUFHLEVBQzlDLEdBQWEsRUFDakIsR0FDRyxLQUFLLENBQUUsTUFBSyxVQUFZLEVBQU8sRUFBYSxFQUFLLENBQUksRUFBSSxJQUFBLEVBQVUsQ0FBQyxDQUNwRSxPQUFPLE9BQU8sQ0FDbkIsRUFFQSxTQUFTLEdBQWUsRUFBTSxFQUFNLENBQ2xDLEdBQUksT0FBTyxHQUFTLFNBQVUsQ0FDNUIsR0FBTSxDQUFFLFNBQVEsUUFBUyxHQUFhLENBQUksRUFDcEMsRUFBZ0IsRUFBSyxNQUFNLEVBQUUsSUFBTTtFQUFPO0VBQU8sR0FDakQsRUFBVUUsR0FBYyxDQUFJLEVBQ2xDLEVBQU8sS0FBSyxNQUFNLENBQUksRUFFdEIsSUFBSSxFQUNGLEtBQUssVUFBVSxFQUFLLENBQUksRUFBRyxLQUFNLElBQVMsTUFBUSxJQUFPLENBQU0sRUFDL0QsRUFJRixPQUhJLElBQVk7SUFDZCxFQUFTLEVBQU8sUUFBUSxNQUFPLENBQU8sR0FFakMsQ0FDVCxDQUVBLE9BQU8sRUFBSyxDQUFJLENBQ2xCLENBRUEsU0FBUyxHQUFnQixFQUFTLEVBQVUsQ0FBQyxFQUFHLENBQzlDLE9BQU8sR0FDTCxFQUNBLEVBQVUsR0FBUyxDQUNqQixJQUFJLEVBQVksRUFBUSxXQUFhLEdBRXJDLEdBQUksTUFBTSxRQUFRLENBQVMsRUFBRyxDQUM1QixJQUFNLEVBQU8sT0FBTyxLQUFLLENBQUksRUFDdkIsQ0FBRSxjQUFjLENBQUMsRUFBRyxhQUFhLENBQUMsR0FBTSxPQUFPLFFBQ25ELEVBQ0MsR0FBUyxFQUFJLEtBQU8sSUFBTSxjQUFnQixZQUM3QyxFQUNBLEVBQVksQ0FDVixHQUFHLEVBQ0gsR0FBRyxHQUNILEdBQUcsRUFBVyxLQUFLLEVBQ25CLEdBQUcsRUFBWSxLQUFLLENBQ3RCLENBQ0YsQ0FFQSxPQUFPLEdBQVdGLEVBQWUsRUFBTSxDQUFTLEVBQUcsQ0FBSSxDQUN6RCxDQUFDLENBQ0gsQ0FDRixDQzFuQkEsU0FBZ0IsR0FBb0IsRUFBc0IsRUFBK0IsQ0FDdkYsR0FBSSxDQUdGLElBQU0sRUFEUyxFQUF5QixNQUFPLENBQUMsWUFBYSxrQkFEM0IsRUFBYSxHQUFHLEVBQUssTUFDZSxNQUFNLEVBQUcsUUFBUSxJQUFJLENBQ25FLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEdBQ3ZDLEdBQUksQ0FBQyxFQUNILE1BQVUsTUFBTSx3QkFBd0IsRUFBYSxHQUFHLEdBQU0sRUFFaEUsT0FBTyxRQUFRLFFBQVEsQ0FBVSxDQUNuQyxPQUFTLEVBQU8sQ0FDZCxPQUFPLFFBQVEsT0FBVyxNQUFNLCtCQUErQixFQUFhLEdBQUcsRUFBSyxJQUFJLE9BQU8sQ0FBSyxHQUFHLENBQUMsQ0FDMUcsQ0FDRixDQ1pBLE1BQWEsR0FBa0MsQ0FDN0MsZ0JBQ0EscUJBQ0Esb0JBQ0Esd0JBQ0YsRUFFQSxTQUFnQixHQUFtQixFQUEwQyxDQU0zRSxPQUhJLEVBQU8sVUFBVSxZQUNaLHVDQUVGLDZCQUNULENBRUEsU0FBZ0IsR0FBNEIsRUFBaUMsQ0FPM0UsT0FOSSxFQUFPLFVBQVUsT0FBUyxFQUFPLFVBQVUsS0FDdEMsQ0FBQyxFQUVOLEVBQU8sVUFBVSxZQUNaLENBQUMsd0JBQXdCLEVBRTNCLENBQUMsZUFBZSxDQUN6QixDQ1ZBLFNBQWdCLEdBQStCLEVBQXVCLEVBQW1DLENBQ3ZHLEdBQUksQ0FBQyxFQUFPLHFCQUFzQixPQUFPLEVBR3pDLElBQU0sRUFBbUIsRUFBa0IsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUssR0FNekQsRUFBa0IsRUFBTyxPQUFTLEVBQU8sUUFBVSxFQUFLLFFBQVEsRUFBTyxRQUFTLEtBQU0sSUFBSSxFQUMxRixFQUFhLEVBQUssUUFBUSxFQUFpQixXQUFZLEVBQWtCLFlBQVksRUFDckYsRUFBZSxFQUFLLFNBQVMsRUFBTyxRQUFTLENBQVUsRUFDN0QsT0FBTyxFQUFhLFdBQVcsR0FBRyxFQUFJLEVBQWUsS0FBSyxHQUM1RCxDQUVBLFNBQWdCLEdBQXFDLEVBQWdDLENBQ25GLE9BQ0UsRUFBTyxzQkFDUCxDQUFDLEVBQU8sUUFDUixFQUFPLGFBQWEsVUFBWSxJQUNoQyxNQUFNLFFBQVEsRUFBTyxhQUFhLEtBQUssR0FDdkMsRUFBTyxZQUFZLE1BQU0sT0FBUyxDQUV0QyxDQ1BBLE1BQU0sR0FBYSxDQUFDLDRCQUE2Qiw2QkFBOEIsUUFBUyxTQUFVLGlCQUFpQixFQUM3RyxFQUF1QixhQU92QixHQUF5Qiw2QkFDekIsRUFBZSxrQkFDZixFQUFvQixXQUNwQixHQUFxQixXQUNyQixHQUF5QixJQUFJLElBQUksQ0FDckMsRUFDQSxFQUNBLEdBQ0EsRUFDQSxHQUNBLG9CQUdBLGFBQ0EsR0FBRyxFQUNMLENBQUMsRUFDSyxHQUErQixJQUFJLElBQ25DLEdBQW1CLEdBQThCLElBQ2pELEdBQXVCLElBQUksSUFDM0JHLEdBQXdCLENBQUMsZUFBZ0Isa0JBQW1CLHVCQUF3QixrQkFBa0IsRUFhNUcsZUFBc0IsR0FDcEIsRUFDQSxFQUNBLEVBQ2UsQ0FDZixPQUFPLEVBQU8sMEJBQTBCLHNCQUF1QixTQUFZLENBQ3pFLE1BQU1DLEdBQUssRUFBUSxFQUFZLENBQWMsQ0FDL0MsQ0FBQyxDQUNILENBRUEsZUFBZUEsR0FBSyxFQUF1QixFQUEyQixFQUF3QyxDQUM1RyxJQUFNLEVBQXlCLEdBQTBCLENBQU0sRUFDL0QsR0FBSSxFQUF3QixNQUFVLE1BQU0sQ0FBc0IsRUFDbEUsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsY0FBYyxFQUN0RCxFQUFVLE1BQU0sR0FBZ0IsQ0FBUSxFQUM5QyxHQUFjLEVBQVEsQ0FBTyxFQUM3QixNQUFNLEdBQTBCLEVBQVEsQ0FBTyxFQUMvQyxHQUE2QyxDQUFPLEVBQ3BELEdBQTZDLEVBQVEsQ0FBTyxFQUM1RCxJQUFNLEVBQW9CLE1BQU0sR0FBNEIsRUFBUSxFQUFZLENBQU8sRUFDdkYsTUFBTSxHQUF5QixFQUFRLEVBQVksRUFBUyxDQUFpQixFQUk3RSxHQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsR0FBa0IsQ0FBQyxFQUFPLHNCQUM1QixFQUNBLE1BQU0sR0FBc0IsQ0FBTyxFQUNuQyxHQUE4QixDQUFPLEVBRXJDLE9BQU8sRUFBUSxlQVFULE1BQU0sRUFBTyxhQUFhLEVBQVUsR0FBcUIsQ0FBTyxDQUFDLElBRWxFLElBQ0gsR0FBeUIsRUFBUSxFQUFZLEVBQVMsQ0FBaUIsRUFHbkUsRUFBTyx3QkFDVCxHQUFzQyxFQUFRLENBQVEsR0FHNUQsQ0FFQSxTQUFTLEdBQXFCLEVBQXNDLENBR2xFLE9BQU8sS0FBSyxVQUFVLEdBQWdCLENBQU8sRUFBRyxJQUFBLEdBQVcsQ0FBQyxDQUM5RCxDQUVBLGVBQWUsR0FBZ0IsRUFBZ0QsQ0FDN0UsSUFBSSxFQUF1QixDQUFDLEVBQzVCLEdBQUksQ0FDRixJQUFNLEVBQVcsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sRUFDNUQsRUFBVSxLQUFLLE1BQU0sQ0FBUSxDQUMvQixPQUFTLEVBQU8sQ0FJZCxHQUFLLEVBQWdDLE9BQVMsU0FBVSxNQUFNLENBQ2hFLENBS0EsTUFKQSxHQUFRLFFBQVUsRUFBUSxTQUFXLENBQUMsRUFDdEMsRUFBUSxhQUFlLEVBQVEsY0FBZ0IsQ0FBQyxFQUNoRCxFQUFRLGdCQUFrQixFQUFRLGlCQUFtQixDQUFDLEVBQ3RELEVBQVEsaUJBQW1CLEVBQVEsa0JBQW9CLENBQUMsRUFDakQsQ0FDVCxDQUVBLFNBQVMsR0FBNkMsRUFBdUIsRUFBb0MsQ0FFL0csT0FBTyxFQUFRLGFBQWEsSUFDNUIsT0FBTyxFQUFRLGdCQUFnQixJQUMzQixDQUFDLEVBQU8sdUJBQXlCLENBQUMsRUFBTyxrQ0FDM0MsT0FBTyxFQUFRLGFBQWEsR0FDNUIsT0FBTyxFQUFRLGdCQUFnQixHQUVuQyxDQUVBLFNBQVMsR0FBYyxFQUF1QixFQUFvQyxDQUNoRixFQUFRLFFBQVUsQ0FBRSxHQUFHLEVBQVEsUUFBUyxHQUFHLEdBQWdCLEVBQVEsRUFBUSxPQUFPLENBQUUsQ0FDdEYsQ0FPQSxTQUFTLEdBQTJCLEVBQW9CLEVBQXdDLENBQzlGLElBQU0sRUFBUSxFQUFTLElBQUssR0FBWSxHQUFzQixFQUFTLEVBQVMsRUFBSSxDQUFDLEVBR2pGLEVBQW1CLEVBQU0sU0FBUyxnQkFBZ0IsRUFDaEQsRUFBbUIsQ0FBQyxFQUMxQixJQUFLLEdBQU0sQ0FBQyxFQUFPLEtBQVksRUFBUyxRQUFRLEVBQUcsQ0FDakQsSUFBTSxFQUFPLEVBQU0sR0FDZixJQUFTLFVBQVksSUFBUyxpQkFDaEMsRUFBTyxLQUFLLENBQU8sRUFDZCxBQUVMLEtBREEsRUFBTyxLQUFLLGlCQUFpQixFQUNWLEdBRXZCLENBRUEsT0FESyxHQUFrQixFQUFPLEtBQUssaUJBQWlCLEVBQzdDLENBQ1QsQ0FPQSxTQUFTLEdBQXdCLEVBQThCLEVBQW1DLENBR2hHLEdBQUksRUFBUSxhQUFlLEVBQW9CLENBTTdDLElBQU0sRUFBVyxFQUFRLGNBQWdCLElBQUEsR0FBWSxDQUFDLEVBQUksR0FBb0IsRUFBUSxXQUFXLEVBQzNGLEVBQWUsR0FBWSxHQUEyQixFQUFVLENBQU8sRUFDekUsSUFDRixFQUFRLFlBQWMsRUFBYSxLQUFLLE1BQU0sRUFHbEQsQ0FDRixDQUVBLGVBQWUsR0FDYixFQUNBLEVBQ0EsRUFDNEIsQ0FDNUIsSUFBTSxFQUF5QixDQUFDLEVBQzFCLEVBQWtCLENBQUMsbUJBQW1CLEVBQ3RDLEVBQWtDLENBQUMsRUFDbkMsRUFBVSxHQUFnQixDQUFNLEVBY3RDLEdBWEUsR0FDQSxDQUFDLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBVyxRQUFTLGtCQUFrQixDQUFDLEdBQ2hFLENBQUMsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFPLFFBQVMsa0JBQWtCLENBQUMsSUFFNUQsRUFBUSxTQUFXLCtCQUNuQixFQUFnQixLQUFLLHVCQUF3Qiw4QkFBOEIsR0FFekUsR0FDRixFQUFnQixLQUFLLFVBQVUsRUFHN0IsRUFBTyxPQUFRLENBSWpCLEVBQVEsUUFBUSxRQUNkLGdJQUlGLElBQU0sRUFBaUIsR0FBd0IsQ0FBVSxDQUFDLENBQUMsSUFBSSxDQUFZLEVBMEMzRSxHQXpDSSxJQUdGLEVBQVEsUUFBUSxTQUFXLHNCQUFzQixFQUFlLFdBQVcsSUFBSyxPQUFPLEdBQUcsTUFBTSxFQUFFLFVBRXBHLEVBQWdCLEtBQUssRUFBa0IsRUFFbkMsRUFBTyxVQUFVLGtCQUNmLEdBQXdDLEVBQVEsUUFBUSxPQUFPLEVBQ2pFLE9BQU8sRUFBUSxnQkFBZ0Isb0JBRS9CLENBQUMsRUFBUSxnQkFBZ0IscUJBQ3pCLENBQUMsRUFBUSxnQkFBZ0IsMkJBQ3pCLENBQUMsRUFBUSxnQkFBZ0IsaUNBRXpCLEVBQWdCLEtBQUssa0JBQWtCLEVBRXpDLEVBQVEsUUFBVSwrQkFHaEIsRUFBTyxVQUFVLGlCQUlmLEVBRmlCLEVBQVEsYUFBYSxXQUFhLEVBQVEsZ0JBQWdCLFlBRTFELENBQUMsRUFBUSxhQUFhLHFCQUN6QyxFQUFnQixLQUFLLGtCQUFrQixFQUVyQyxFQUFPLFVBQVUsbUJBRW5CLEVBQVEsYUFBYSxhQUNuQixFQUFRLGdCQUFnQixZQUN4QixFQUFRLGFBQWEscUJBQ3JCLEVBQVEsZ0JBQWdCLG9CQUMxQixFQUFhLEtBQUssWUFBWSxFQUM5QixPQUFPLEVBQVEsZ0JBQWdCLGFBRS9CLE9BQU8sRUFBUSxhQUFhLFdBQzVCLE9BQU8sRUFBUSxnQkFBZ0IsYUFJL0IsRUFBTywyQkFBNEIsQ0FXckMsSUFBTSxFQUNKLENBQUMsR0FBNkIsRUFBUSxVQUFVLEdBQ2hELENBQUMsR0FBK0IsRUFBUSxVQUFVLEdBQ2xELEVBQUcsU0FBUywwQkFBMkIsQ0FBRSxJQUFLLEVBQU8sUUFBUyxPQUFRLENBQUMsb0JBQW9CLENBQUUsQ0FBQyxDQUFDLENBQUMsT0FBUyxFQUNyRyxDQUFDLFlBQVksRUFDYixDQUFDLEVBQ1AsRUFBUSxXQUFhLEVBQU0sSUFBSSxDQUFDLEVBQWdCLEdBQTZCLEVBQVEsVUFBVSxDQUFDLEVBQUcsQ0FDakcsV0FBWSxFQUNkLENBQUMsRUFHRyxNQUFNLFFBQVEsRUFBUSxVQUFVLEdBQUssRUFBUSxXQUFXLFNBQVcsR0FDckUsT0FBTyxFQUFRLFVBRW5CLE1BQVcsTUFBTSxRQUFRLEVBQVEsVUFBVSxJQUN6QyxFQUFRLFdBQWEsRUFBUSxXQUFXLE9BQ3JDLEdBQ0MsRUFBRyxTQUFTLEVBQVcsQ0FDckIsSUFBSyxHQUNMLElBQUssRUFBTyxRQUNaLE9BQVEsQ0FDVixDQUFDLENBQUMsQ0FBQyxPQUFTLENBQ2hCLEVBQ0ksRUFBUSxXQUFXLFNBQVcsR0FDaEMsT0FBTyxFQUFRLFdBR3JCLENBS0ksRUFBTyxVQUFVLE1BQ25CLEVBQWdCLEtBQUssNkJBQTZCLEVBS2hELEVBQU8scUJBQ1QsRUFBZ0IsS0FBSyxjQUFjLEVBR2hDLEdBQVksQ0FBTyxJQUlGLEVBQVEsYUFBYSxJQUFpQixFQUFRLGdCQUFnQixHQUFBLEVBQ2hFLFdBQVcsWUFBWSxJQUNuQyxHQUFnQyxDQUFPLEVBQ3pDLEVBQWEsS0FBSyxDQUFZLEVBRTlCLEVBQWdCLEtBQUssQ0FBWSxJQVFyQyxFQUFRLGFBQWEsSUFDckIsRUFBUSxnQkFBZ0IsSUFDeEIsT0FBTyxPQUFPLEVBQVEsT0FBTyxDQUFDLENBQUMsS0FBTSxHQUFXLEdBQVEsU0FBUyxDQUFpQixDQUFDLEtBRS9FLEdBQXFDLENBQU8sRUFDOUMsRUFBYSxLQUFLLENBQWlCLEVBRW5DLEVBQWdCLEtBQUssQ0FBaUIsR0FHdEMsRUFBa0IsQ0FBTSxHQUMxQixFQUFnQixLQUFLLEdBQUcsRUFBVSxFQUdwQyxJQUFNLEVBQTJCLEVBQWtCLENBQU0sRUFBSSxHQUE0QixDQUFNLEVBQUksQ0FBQyxFQXNDcEcsT0FyQ0EsTUFBTSxHQUFxQyxFQUFRLEVBQVMsQ0FBd0IsRUFDcEYsRUFBZ0IsS0FBSyxHQUFHLENBQXdCLEdBRTVDLEVBQU8sdUJBQXlCLEVBQU8sbUNBR3pDLEVBQWdCLEtBQUssQ0FBb0IsR0FJckMsRUFBTyxVQUFVLE1BQVEsRUFBTyxVQUFVLE9BQVMsRUFBTyxVQUFVLFNBQ3RFLEVBQWdCLEtBQUssRUFBc0IsRUFHeEMsRUFBTyxVQUFVLGFBQ3BCLEVBQWdCLEtBQUssWUFBWSxHQUdqQyxFQUFRLGFBQWEsTUFDckIsRUFBUSxnQkFBZ0IsTUFDeEIsRUFBUSxhQUFhLGtCQUNyQixFQUFRLGdCQUFnQixrQkFDeEIsRUFBUSxhQUFhLFlBQ3JCLEVBQVEsZ0JBQWdCLGFBRXhCLEVBQWdCLEtBQUssYUFBYSxHQUlsQyxFQUFPLHFCQUNGLENBQ0wsYUFBYyxFQUFhLE9BQVEsR0FBUSxDQUFDLEVBQUksU0FBUyxlQUFlLENBQUMsRUFDekUsZ0JBQWlCLEVBQWdCLE9BQVEsR0FBUSxDQUFDLEVBQUksU0FBUyxlQUFlLENBQUMsRUFDL0UsdUJBQ0YsRUFHSyxDQUFFLGVBQWMsa0JBQWlCLHVCQUFzQixDQUNoRSxDQUVBLFNBQVMsR0FBd0MsRUFBMEIsQ0FFekUsT0FESSxPQUFPLEdBQVcsVUFDZixzRUFBc0UsS0FBSyxDQUFNLENBQzFGLENBRUEsU0FBUyxHQUE2QyxFQUFvQyxDQUN4RixJQUFLLEdBQU0sQ0FBQyxFQUFZLElBQWtCLENBQ3hDLENBQUMsRUFBYyxHQUFnQyxDQUFPLENBQUMsRUFDdkQsQ0FBQyxFQUFtQixHQUFxQyxDQUFPLENBQUMsQ0FDbkUsRUFDRSxHQUFJLEVBQWUsQ0FDakIsSUFBTSxFQUFhLEVBQVEsZ0JBQWdCLEdBQzNDLEdBQUksQ0FBQyxFQUFZLFNBQ2pCLElBQU0sRUFBaUIsRUFBUSxhQUFhLElBQ3hDLENBQUMsR0FBa0IsR0FBc0IsRUFBWSxDQUFjLEtBQ3JFLEVBQVEsYUFBYSxHQUFjLEdBRXJDLE9BQU8sRUFBUSxnQkFBZ0IsRUFDakMsTUFBVyxFQUFRLGFBQWEsS0FDOUIsRUFBUSxnQkFBZ0IsS0FBZ0IsRUFBUSxhQUFhLEdBQzdELE9BQU8sRUFBUSxhQUFhLEdBR2xDLENBRUEsU0FBUyxHQUFnQyxFQUErQixDQUt0RSxNQUFPLENBQUMsRUFBUSxTQUFTLFlBQWEsRUFBUSxVQUFVLGFBQWEsQ0FBQyxDQUFDLEtBQ3BFLEdBQVcsT0FBTyxHQUFXLFVBQVksVUFBVSxLQUFLLENBQU0sQ0FDakUsQ0FDRixDQUVBLFNBQVMsR0FBcUMsRUFBK0IsQ0FDM0UsSUFBTSxFQUFTLEVBQVEsT0FDdkIsT0FBTyxHQUEwQixHQUFRLElBQUksR0FBSyxHQUEwQixFQUFRLFNBQVMsSUFBSSxDQUNuRyxDQUVBLFNBQVMsR0FBMEIsRUFBK0IsQ0FHaEUsT0FBTyxPQUFPLEdBQWdCLFVBQVksK0JBQStCLEtBQUssQ0FBVyxDQUMzRixDQUVBLE1BQU0sR0FBZ0MsQ0FDcEMsZUFDQSxrQkFDQSx1QkFDQSxrQkFDRixFQVlBLGVBQWUsR0FBMEIsRUFBdUIsRUFBNkMsQ0FHM0csR0FBSSxDQUFDLEVBQU8sT0FBUSxPQUNwQixJQUFNLEVBQWEsRUFJYixFQUF1QixJQUFJLElBQzNCLEVBQTJCLEdBQW1DLENBQ2xFLElBQUssSUFBTSxLQUFXLEdBQ3BCLElBQUssR0FBTSxDQUFDLEVBQWdCLEtBQWlCLE9BQU8sUUFBUSxFQUFZLElBQVksQ0FBQyxDQUFDLEVBQ3BGLEdBQUksT0FBTyxHQUFpQixTQUFVLENBQ3BDLElBQU0sRUFBZ0IsRUFBcUIsSUFBSSxDQUFjLEVBQ3pELEVBQ0YsRUFBYyxLQUFLLENBQVksRUFFL0IsRUFBcUIsSUFBSSxFQUFnQixDQUFDLENBQVksQ0FBQyxDQUUzRCxDQUdOLEVBQ0EsRUFBd0IsQ0FBTyxFQUMvQixJQUFLLElBQU0sS0FBbUIsR0FBNkIsQ0FBTSxFQUMvRCxHQUFJLENBQ0YsRUFDRSxLQUFLLE1BQU0sTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFLLFFBQVEsRUFBTyxRQUFTLENBQWUsRUFBRyxNQUFNLENBQUMsQ0FDOUYsQ0FDRixNQUFRLENBRVIsQ0FVRixJQUFNLEVBQXVCLENBQzNCLElBSnNCLEVBQXFCLElBQUksZ0JBQWdCLEdBQUssQ0FBQyxFQUFBLENBQUcsS0FDdkUsR0FBaUIsT0FBTyxLQUFLLENBQVksQ0FBQyxHQUFHLEtBQU8sR0FHcEMsR0FBSyxFQUFxQixJQUFJLGtCQUFrQixFQUFJLENBQUMsa0JBQWtCLEVBQUksQ0FBQyxFQUM3RixHQUFJLEVBQXFCLElBQUksYUFBYSxFQUFJLENBQUMsYUFBYSxFQUFJLENBQUMsRUFJakUsR0FBSSxFQUFxQixJQUFJLG9CQUFvQixFQUFJLENBQUMsb0JBQW9CLEVBQUksQ0FBQyxFQUMvRSxHQUFJLEVBQXFCLElBQUksd0JBQXdCLEVBQUksQ0FBQyx3QkFBd0IsRUFBSSxDQUFDLEVBU3ZGLEdBQUksRUFBcUIsSUFBSSxPQUFPLEVBQUksQ0FBQyxPQUFPLEVBQUksQ0FBQyxFQUNyRCxHQUFJLEVBQXFCLElBQUksZUFBZSxFQUFJLENBQUMsZUFBZSxFQUFJLENBQUMsRUFJckUsR0FBSSxFQUFxQixJQUFJLHFCQUFxQixFQUFJLENBQUMscUJBQXFCLEVBQUksQ0FBQyxFQUlqRixHQUFJLEVBQXFCLElBQUksWUFBWSxFQUFJLENBQUMsWUFBWSxFQUFJLENBQUMsQ0FDakUsRUFNTSxFQUFrQixFQUFXLG9CQUNuQyxHQUFJLEVBQXFCLFNBQVcsRUFBRyxDQUNqQyxJQUFvQixJQUFBLEtBR3RCLEdBQW9DLEVBQVEsRUFBaUIsSUFBSSxHQUFLLEVBQ3RFLE9BQU8sRUFBVyxxQkFFcEIsTUFDRixDQVFBLElBQU0sRUFBNkIsR0FBOEIsQ0FBTSxFQUdqRSxFQUFxQixJQUFJLElBQUksQ0FDakMsR0FBRyxFQUNILEdBQ0EsR0FBSSxHQUE4QixDQUFDLENBQ3JDLENBQUMsRUFDRCxHQUFvQyxFQUFRLEdBQW1CLENBQUMsRUFBRyxDQUFrQixFQUNyRixFQUFXLG9CQUFzQixDQUFDLEdBQUcsQ0FBa0IsQ0FBQyxDQUFDLFNBQVMsQ0FDcEUsQ0FJQSxNQUFNLEdBQWlDLElBQUksSUFBSSxDQUM3QyxnQkFDQSxtQkFDQSxzQkFDQSxxQkFDQSx5QkFDQSxhQUNBLFFBQ0EsY0FDQSxFQUNGLENBQUMsRUFFRCxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ00sQ0FHTixJQUFNLEVBQTZCLEdBQThCLENBQU0sRUFDakUsRUFBa0IsRUFBZ0IsT0FDckMsR0FBUSxDQUFDLEVBQWEsSUFBSSxDQUFHLEdBQUssQ0FBQyxHQUErQixJQUFJLENBQUcsR0FBSyxDQUFDLEdBQTRCLElBQUksQ0FBRyxDQUNySCxFQUNJLEVBQWdCLE9BQVMsR0FDM0IsUUFBUSxLQUNOLG1EQUFtRCxFQUFnQixLQUFLLElBQUksRUFBRSxrR0FDaEYsQ0FFSixDQUVBLElBQUksR0FHSixTQUFTLEdBQThCLEVBQWdELENBQ3JGLEdBQUksQ0FBQyxHQUFrQyxDQUdyQyxJQUFNLEVBQVMsRUFBeUIsTUFBTyxDQUFDLEtBQU0saUJBQWlCLEVBQUcsRUFBTyxPQUFPLENBQUMsQ0FBQyxXQUV4RixxQkFDQSxFQUNGLEVBQ00sRUFBcUIsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFPLFNBQVMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUssR0FBVSxFQUFNLEVBQVksQ0FBQyxFQUMvRyxHQUFJLEVBQW1CLE9BQVMsRUFBRyxDQUdqQyxRQUFRLEtBQUsscUVBQXFFLEVBQ2xGLE1BQ0YsQ0FDQSxHQUFtQyxDQUNyQyxDQUNBLE9BQU8sRUFDVCxDQUVBLGVBQWUsR0FDYixFQUNBLEVBQ0EsRUFDQSxFQUNlLENBQ2YsQUFDRSxFQUFRLE9BQU8sRUFBSyxTQUFTLEVBQU8sT0FBTyxFQUl6QyxFQUFPLDZCQUErQixFQUFPLFFBQVEsa0JBQW9CLEVBQVEsZUFDbkYsT0FBTyxFQUFRLFFBQ04sRUFBTyw0QkFBOEIsQ0FBQyxFQUFPLFFBQVEsS0FBTyxDQUFDLEVBQVEsZ0JBQzlFLEVBQVEsUUFBVSxJQUVwQixBQUNFLEVBQVEsVUFBVSxhQUVoQixDQUFDLEVBQVEsU0FBVyxFQUFRLFVBQVksY0FBZ0IsRUFBVyxlQUNyRSxFQUFRLGdCQUFrQixDQUFDLEVBQzNCLEVBQVEsY0FBYyxTQUFXLFNBSWpDLEVBQVEsY0FBYyxXQUFhLCtCQUVyQyxJQUFNLEVBQVEsRUFBTyxXQVVyQixJQVRJLElBQVUsZUFBaUIsSUFBVSxvQkFDdkMsRUFBUSxPQUFTLG9CQUVuQixNQUFNLEdBQXdDLEVBQVEsQ0FBTyxFQUN6RCxDQUFDLEVBQU8sUUFBVSxFQUFRLFNBQVcsQ0FBQyxFQUFRLE9BRWhELEVBQVEsS0FBTyxTQUdiLENBQUMsRUFBTywyQkFBNEIsQ0FDdEMsR0FBSSxFQUFPLHVCQUF3QixDQUNqQyxFQUFRLFFBQVEsS0FBTyxrQkFDdkIsRUFBUSxRQUFRLFlBQWMsZUFDOUIsSUFBTSxFQUFPLENBQUMsTUFBTyxPQUFRLGFBQWEsQ0FBQyxDQUFDLE9BQVEsR0FBUSxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxDQUFHLENBQUMsQ0FBQyxFQUN4RyxFQUFLLE9BQVMsSUFDaEIsRUFBUSxRQUFRLGVBQWlCLHNCQUFzQixFQUFLLEtBQzFELEdBQ0YsRUFBRSwrR0FDRixFQUFRLFFBQVEsT0FBUyxHQUF3QixFQUFRLFFBQVEsTUFBTSxFQUUzRSxDQUVBLElBQU0sRUFBdUIsR0FBd0IsQ0FBTSxFQUMzRCxHQUFJLEVBQXNCLENBQ3hCLElBQU0sRUFBZSxVQUNyQixFQUFRLFFBQVEsbUJBQXFCLEdBQUcsRUFBYSxTQUFTLElBQzlELE9BQU8sRUFBUSxRQUFRLFNBQVMsSUFBeUIsU0FBVyxLQUFPLFlBQzNFLEVBQVEsUUFBUSxTQUFTLEtBQTBCLEdBQXNCLENBQW9CLEVBQzdGLElBQU0sRUFBYyxNQUFNLEVBQUcsS0FBSyxVQUFXLENBQzNDLElBQUssRUFBTyxRQUNaLElBQUssR0FDTCxPQUFRLENBQ1YsQ0FBQyxFQUNLLEVBQWEsSUFBSSxJQUN2QixJQUFLLElBQU0sS0FBYyxFQUFhLENBQ3BDLEdBQU0sQ0FBQyxFQUFPLEdBQVUsRUFBVyxNQUFNLEdBQUcsRUFDeEMsR0FBUyxHQUNYLEVBQVcsSUFBSSxDQUFLLENBRXhCLENBQ0EsR0FBSSxFQUFXLEtBQU8sRUFBRyxDQUN2QixJQUFNLEVBQWMsQ0FBQyxHQUFHLENBQVUsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUN0QyxFQUFlLEdBQUcsRUFBcUIsTUFDN0MsRUFBUSxRQUFRLGVBQ2QsR0FBRyxFQUFhLHlCQUF5QixFQUFZLE1BQU0sRUFBYSxTQUFTLElBQy9FLEVBQVEsUUFBUSxLQUNsQixFQUFRLFFBQVEsS0FBTyxHQUFHLEVBQWEsVUFBVSxFQUFZLE1BQU0sRUFBUSxRQUFRLFFBRW5GLEVBQVEsUUFBUSxLQUFPLEdBQUcsRUFBYSxVQUFVLElBQ2pELEVBQVEsUUFBUSxZQUFjLEdBQUcsRUFBYSxRQUVoRCxFQUFRLFFBQVEsT0FBUyxHQUF3QixFQUFRLFFBQVEsTUFBTSxFQUN2RSxFQUFrQixzQkFBc0IsS0FBSyxRQUFTLFFBQVMsUUFBUSxDQUN6RSxDQUNGLENBQ0YsRUFFSSxFQUFPLFlBQWMsRUFBUSxjQUMvQixFQUFRLFdBQWEsR0FBK0IsRUFBTyxZQUFjLEVBQVEsV0FBWSxFQUFRLFVBQVUsR0FHakgsSUFBTSxFQUFnQixFQUFRLFFBQVEsWUFDdEMsR0FBSSxHQUE4QixDQUFNLEVBQUcsQ0FLekMsSUFBTSxHQURXLElBQWtCLElBQUEsR0FBWSxDQUFDLEVBQUksR0FBb0IsQ0FBYSxFQUFBLEVBQ3BELE9BQzlCLEdBQVksR0FBc0IsRUFBUyxFQUFRLFFBQVMsRUFBSSxJQUFNLFFBQ3pFLEVBQ0ksSUFDRixFQUFRLFFBQVEsWUFBYyxDQUFDLGtCQUFtQixHQUFHLENBQWMsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUVwRixDQUNBLEdBQXdCLEVBQVEsUUFBUyxHQUFxQixDQUFNLENBQUMsQ0FDdkUsQ0FFQSxTQUFTLEdBQThCLEVBQWdDLENBQ3JFLE9BQU8sRUFBTyxVQUFVLE9BQVMsRUFBTyxVQUFVLFFBQVUsRUFBTyxVQUFVLFdBQWEsRUFBTyxVQUFVLE1BQzdHLENBRUEsU0FBUyxHQUF3QixFQUEwQyxDQUN6RSxPQUFPLEVBQWUsR0FBRyxFQUFhLHlCQUEyQixxQkFDbkUsQ0FFQSxlQUFlLEdBQ2IsRUFDQSxFQUNlLENBQ2YsR0FBSSxDQUFDLEdBQXFDLENBQU0sRUFBRyxPQUVuRCxJQUFNLEVBQWdCLEVBQUssUUFBUSxFQUFPLFFBQVMsWUFBWSxFQUMvRCxHQUFJLENBQUMsRUFBRyxXQUFXLENBQWEsRUFBRyxPQUVuQyxFQUFRLEtBQU8sU0FFZixJQUFNLEVBQWdCLEVBQUssUUFBUSxFQUFPLFFBQVMsYUFBYSxFQUMzRCxFQUFHLFdBQVcsQ0FBYSxJQUVoQyxFQUFRLE1BQVEsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUksRUFBUSxPQUFTLENBQUMsRUFBSSxjQUFjLENBQUMsQ0FBQyxFQUl2RSxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBSyxRQUFRLEVBQU8sUUFBUyxjQUFjLEVBQUcsRUFBaUIsQ0FBQyxFQUNsSCxDQUVBLE1BQU0sR0FBb0I7RUFHMUIsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUNOLElBQU0sRUFBMEIsRUFBUSxhQUNsQyxFQUE2QixFQUFRLGdCQUMzQyxFQUFrQixhQUFlLEdBQy9CLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsQ0FBQyxHQUFHLEVBQWtCLGFBQWMsR0FBRyxHQUErQixFQUF5QixDQUFPLENBQUMsRUFDdkcsQ0FDRixFQUNBLEVBQWtCLGdCQUFrQixFQUFrQixnQkFBZ0IsT0FBUSxHQUFRLENBQUMsRUFBd0IsRUFBSSxFQUNuSCxFQUFrQixnQkFBa0IsR0FDbEMsRUFDQSxFQUNBLEVBQ0EsRUFDQSxDQUFDLEdBQUcsRUFBa0IsZ0JBQWlCLEdBQUcsR0FBK0IsRUFBNEIsQ0FBTyxDQUFDLEVBQzdHLENBQ0YsQ0FDRixDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ1UsQ0FDVixPQUFPLE9BQU8sS0FBSyxDQUF1QixDQUFDLENBQUMsT0FDekMsR0FDQyxHQUF1QixJQUFJLENBQVUsSUFLcEMsRUFBUSxTQUFXLENBQUMsRUFBd0IsRUFBVyxFQUFFLFdBQVcsWUFBWSxFQUNyRixDQUNGLENBRUEsU0FBUyxHQUE4QixFQUE0QixDQUNqRSxJQUFLLElBQU0sS0FBT0QsR0FBdUIsQ0FDdkMsSUFBTSxFQUFVLEVBQVEsR0FDcEIsR0FBVyxPQUFPLEtBQUssQ0FBTyxDQUFDLENBQUMsU0FBVyxHQUM3QyxRQUFRLGVBQWUsRUFBUyxDQUFHLENBRXZDLENBQ0YsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUNGLEVBQU8seUJBRVQsR0FBdUIsRUFBUSxFQURWLEVBQWtCLGFBQWEsT0FBUSxHQUFRLENBQUMsRUFBUSxrQkFBa0IsRUFDekMsRUFBRyxFQUFLLEVBRzlELEdBQXVCLEVBQVEsRUFEUCxFQUFrQixnQkFBZ0IsT0FBUSxHQUFRLENBQUMsRUFBUSxlQUFlLEVBQ3pDLEVBQUcsRUFBSSxHQUdsRSxJQUFNLEVBQXVCLEdBQXdCLENBQU0sRUFDM0QsR0FBSSxHQUF3QixFQUFrQixzQkFBc0IsT0FBUyxFQUFHLENBQzlFLElBQU0sRUFBZSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQWtCLHFCQUFxQixDQUFDLEVBQ3JFLElBQXlCLFNBQzNCLEdBQVUsU0FBVSxDQUFDLE1BQU8sVUFBVyxNQUFPLEdBQUcsQ0FBWSxFQUFHLEVBQU8sT0FBTyxFQUU5RSxHQUFVLEtBQU0sQ0FBQyxNQUFPLFFBQVMsR0FBRyxDQUFZLEVBQUcsRUFBTyxPQUFPLENBRXJFLENBQ0YsQ0FFQSxTQUFTLEdBQXdCLEVBQW9ELENBQ25GLEdBQUksRUFBTyxrQkFBbUIsTUFBTyxLQUNyQyxHQUFJLEVBQU8sc0JBQXVCLE1BQU8sUUFDM0MsQ0FFQSxTQUFTLEdBQXNCLEVBQXlDLENBU3RFLE9BUkksSUFBbUIsS0FBYSxtQkFRN0IsbU9BQ1QsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUNOLEdBQUksRUFBYSxTQUFXLEVBQUcsT0FFL0IsSUFBTSxFQUF1QixDQUMzQixHQUFHLElBQUksSUFBSSxFQUFhLElBQUssR0FBZSxHQUE4QixFQUFRLEVBQVksQ0FBVSxDQUFDLENBQUMsQ0FDNUcsRUFDQSxHQUFVLE1BQU8sQ0FBQyxNQUFPLEdBQUksRUFBTSxDQUFDLElBQUksRUFBSSxDQUFDLEVBQUksVUFBVyxHQUFHLENBQW9CLEVBQUcsRUFBTyxPQUFPLENBQ3RHLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNVLENBQ1YsSUFBTSxFQUFrQyxDQUFDLEVBQ3pDLElBQUssSUFBTSxLQUFjLElBQUksSUFBSSxDQUFZLEVBQUcsQ0FXOUMsR0FBSSxFQUF3QixFQUFXLEVBQUUsV0FBVyxZQUFZLEVBQUcsQ0FDN0QsRUFBUSxVQUNWLEVBQXdCLEdBQWMsZUFFeEMsUUFDRixDQUNBLEdBQUksRUFBUSxTQUFXLEdBQXdCLENBQVUsQ0FBQyxDQUFDLElBQUksQ0FBVSxFQUFHLENBQzFFLElBQU0sRUFBb0IsRUFBd0IsR0FDbEQsR0FBSSxDQUFDLEdBQXFCLEVBQWtCLFdBQVcsWUFBWSxFQUFHLENBQ3BFLEVBQXdCLEdBQWMsY0FDdEMsUUFDRixDQVFGLENBQ0EsSUFBTSxFQUFpQyxHQUNyQyxFQUNBLEVBQ0EsRUFDQSxFQUF3QixFQUMxQixFQUNBLEdBQUksRUFBZ0MsQ0FDbEMsSUFBTSxFQUFpQixHQUE0QixFQUFRLEVBQVksQ0FBVSxFQUNqRixHQUFJLEdBQXlDLEVBQVksRUFBd0IsR0FBYSxDQUFjLEVBQUcsQ0FJN0csRUFBd0IsR0FBYyxFQUN0QyxRQUNGLENBRUEsR0FEQSxFQUFzQixLQUFLLENBQVUsRUFDakMsQ0FBQyxFQUFnQixRQUN2QixDQUNBLEdBQ0UsRUFBd0IsSUFDeEIsQ0FBQyxHQUNELEVBQXdCLEtBQWdCLElBRXhDLFNBQ0YsSUFBTSxFQUFnQixHQUE0QixFQUFRLEVBQVksQ0FBVSxFQUM1RSxJQUFrQixLQUFPLEVBQXdCLEtBQ3JELEVBQXdCLEdBQWMsRUFDeEMsQ0FDQSxPQUFPLENBQ1QsQ0FFQSxTQUFTLEdBQXNDLEVBQXVCLEVBQXdCLENBQzVGLElBQU0sRUFBbUIsRUFBSyxTQUFTLEVBQU8sUUFBUyxDQUFRLEVBQzFELEdBTUwsR0FBVSxPQUFRLENBQUMsb0JBQXFCLENBQWdCLEVBQUcsRUFBTyxPQUFPLENBQzNFLENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDQSxFQUNlLENBQ2YsSUFBTSxFQUFvQixJQUFJLElBQUksQ0FBZ0IsRUFDNUMsRUFBbUMsTUFBTSxHQUFvQyxDQUFNLEVBQ3pGLElBQUssSUFBTSxLQUFjLEdBQ25CLE9BQWtCLElBQUksQ0FBVSxHQUFLLEVBQWlDLElBQUksQ0FBVSxHQUd4RixJQUFLLElBQU0sS0FBVyxHQUFzQixDQUFPLEVBQ2pELFFBQVEsZUFBZSxFQUFTLENBQVUsQ0FHaEQsQ0FFQSxlQUFlLEdBQW9DLEVBQTZDLENBQzlGLElBQU0sRUFBbUMsSUFBSSxJQUN2QyxFQUFZLE1BQU0sRUFBRyxLQUFLLG9CQUFxQixDQUNuRCxJQUFLLEVBQU8sUUFDWixJQUFLLEdBQ0wsT0FBUSxDQUNWLENBQUMsRUFFRCxJQUFLLElBQU0sS0FBWSxFQUFXLENBQ2hDLElBQU0sRUFBbUIsRUFBSyxRQUFRLEVBQU8sUUFBUyxDQUFRLEVBR3hELEVBQVMsTUFBTSxHQUFnQixDQUFnQixFQUNyRCxHQUFJLENBQUMsRUFFSCxPQURBLFFBQVEsS0FBSyxtREFBbUQsRUFBaUIsc0JBQXNCLEVBQ2hHLElBQUksSUFBSSxFQUErQixFQUVoRCxJQUFLLElBQU0sS0FBUyxHQUFvQixDQUFNLEVBQzVDLElBQUssSUFBTSxLQUFjLElBQ25CLElBQVUsR0FBYyxFQUFNLFdBQVcsR0FBRyxFQUFXLEVBQUUsSUFDM0QsRUFBaUMsSUFBSSxDQUFVLENBSXZELENBRUEsT0FBTyxDQUNULENBR0EsU0FBUyxHQUFvQixFQUFrQyxDQUM3RCxJQUFNLEVBQW1CLENBQUMsRUFDMUIsSUFBSyxJQUFNLEtBQVksR0FBMEIsQ0FBTSxFQUNqRCxFQUFJLHFCQUFxQixDQUFRLEdBQUssRUFBSSxnQkFBZ0IsRUFBUyxJQUFJLEdBQUssRUFBUyxLQUFLLE9BQVMsV0FDckcsR0FBMkIsRUFBUyxZQUFhLENBQU0sRUFHM0QsT0FBTyxDQUNULENBRUEsU0FBUyxHQUEwQixFQUFpRSxDQUNsRyxJQUFLLElBQU0sS0FBYSxFQUFPLFdBQzdCLEdBQUksRUFBSSxzQkFBc0IsQ0FBUyxHQUFLLEVBQUksMEJBQTBCLEVBQVUsVUFBVSxFQUM1RixPQUFPLEVBQVUsV0FBVyxXQUdoQyxNQUFPLENBQUMsQ0FDVixDQUVBLFNBQVMsR0FBMkIsRUFBc0IsRUFBd0IsQ0FDaEYsR0FBSSxFQUFJLGdCQUFnQixDQUFJLEVBQzFCLEVBQU8sS0FBSyxFQUFLLElBQUksT0FDaEIsR0FBSSxFQUFJLHlCQUF5QixDQUFJLEVBQzFDLElBQUssSUFBTSxLQUFXLEVBQUssU0FDekIsR0FBMkIsRUFBUyxDQUFNLENBR2hELENBRUEsU0FBUyxHQUFzQixFQUF5RCxDQUN0RixPQUFPQSxHQUNKLElBQUssR0FBUSxFQUFRLEVBQUksQ0FBQyxDQUMxQixPQUFRLEdBQXdELENBQUMsQ0FBQyxDQUFPLENBQzlFLENBRUEsU0FBUyxHQUEyQixFQUE0QixDQUM5RCxJQUFNLEVBQWdCLEdBQTZCLElBQUksQ0FBVSxFQUNqRSxHQUFJLEVBQWUsT0FBTyxFQUUxQixJQUFNLEVBQVUsR0FBNEIsQ0FBVSxFQUV0RCxPQURBLEdBQTZCLElBQUksRUFBWSxDQUFPLEVBQzdDLENBQ1QsQ0FFQSxTQUFTLEdBQTRCLEVBQTRCLENBSy9ELE9BSkssR0FBMEIsQ0FBVSxFQUlsQyxHQUFtQyxDQUFVLEVBSDNDLEdBQStCLENBQVUsQ0FJcEQsQ0FFQSxTQUFTLEdBQW1DLEVBQTRCLENBQ3RFLElBQU0sRUFBUSxHQUFtQixDQUFVLEVBQ3JDLEVBQWdCLEdBQStCLENBQVUsRUFLL0QsT0FKSSxJQUFrQixLQUFPLEdBQXlCLEVBQU0sRUFBYyxFQUNqRSxFQUdGLEdBQThCLENBQUssQ0FBQyxDQUFDLElBQU0sR0FDcEQsQ0FHQSxTQUFTLEdBQThCLEVBQXlDLENBQzlFLElBQU0sRUFBTSxLQUFLLElBQUksRUFDckIsT0FBTyxPQUFPLFFBQVEsQ0FBSyxDQUFDLENBQ3pCLFFBQVEsQ0FBQyxLQUFhLEVBQU8sTUFBTSxDQUFPLENBQUMsQ0FBQyxDQUM1QyxRQUFRLENBQUMsTUFBYyxFQUFPLFdBQVcsQ0FBTyxDQUFDLEVBQUUsUUFBVSxLQUFPLENBQUMsQ0FBQyxDQUN0RSxRQUFRLEVBQUcsS0FBaUIsT0FBTyxTQUFTLEtBQUssTUFBTSxDQUFXLENBQUMsQ0FBQyxDQUFDLENBQ3JFLFFBQVEsRUFBRyxLQUFpQixFQUFNLEtBQUssTUFBTSxDQUFXLEdBQUssRUFBZ0IsQ0FBQyxDQUM5RSxVQUFVLENBQUMsR0FBVyxDQUFDLEtBQWMsRUFBTyxTQUFTLEVBQVUsQ0FBUSxDQUFDLENBQUMsQ0FDekUsS0FBSyxDQUFDLEtBQWEsQ0FBTyxDQUMvQixDQUVBLFNBQVMsR0FBeUIsRUFBMEMsQ0FDMUUsR0FBSSxDQUFDLEVBQWEsTUFBTyxHQUN6QixJQUFNLEVBQWdCLEtBQUssTUFBTSxDQUFXLEVBQzVDLE9BQU8sT0FBTyxTQUFTLENBQWEsR0FBSyxLQUFLLElBQUksRUFBSSxHQUFpQixFQUN6RSxDQUVBLFNBQVMsR0FBbUIsRUFBNEMsQ0FDdEUsSUFBTSxFQUFjLEVBQVcsUUFBUSxZQUFhLEVBQUUsRUFDaEQsRUFBYyxHQUFxQixJQUFJLENBQVcsRUFDeEQsR0FBSSxFQUFhLE9BQU8sRUFFeEIsSUFBTSxFQUFTLEVBQ2IsTUFDQSxDQUFDLE9BQVEsRUFBYSxPQUFRLFNBQVUsb0JBQW9CLEVBQzVELFFBQVEsSUFBSSxDQUNkLEVBQ0EsR0FBSSxDQUFDLEVBQVEsTUFBTyxDQUFDLEVBRXJCLEdBQUksQ0FDRixJQUFNLEVBQVMsS0FBSyxNQUFNLENBQU0sRUFDMUIsRUFBUSxNQUFNLFFBQVEsQ0FBTSxFQUFJLEVBQU8sR0FBSyxFQUdsRCxPQUZLLEdBQ0wsR0FBcUIsSUFBSSxFQUFhLENBQUssRUFDcEMsR0FGWSxDQUFDLENBR3RCLE1BQVEsQ0FDTixNQUFPLENBQUMsQ0FDVixDQUNGLENBRUEsU0FBUyxHQUEwQixFQUE2QixDQUs5RCxNQUFPLENBQUMsR0FBNkIsS0FBTSxHQUFZLEdBQXdCLEVBQVMsQ0FBVSxDQUFDLENBQ3JHLENBRUEsU0FBUyxHQUF3QixFQUFpQixFQUE2QixDQUM3RSxHQUFJLElBQVksRUFBWSxNQUFPLEdBQ25DLEdBQUksQ0FBQyxFQUFRLFNBQVMsR0FBRyxFQUFHLE1BQU8sR0FFbkMsSUFBTSxFQUFpQixFQUFRLFdBQVcsc0JBQXVCLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxXQUFXLElBQUssSUFBSSxFQUN0RyxPQUFXLE9BQU8sSUFBSSxFQUFlLEdBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFVLENBQy9ELENBRUEsU0FBUyxHQUErQixFQUE0QixDQUdsRSxPQUFPLEVBQXlCLE1BQU8sQ0FBQyxPQUFRLEVBQVksVUFBVyxvQkFBb0IsRUFBRyxRQUFRLElBQUksQ0FBQyxHQUFLLEdBQ2xILENBRUEsU0FBUyxHQUE4QixFQUF1QixFQUEyQixFQUE0QixDQU1uSCxPQUhJLElBQWUsR0FBd0IsR0FBa0IsRUFBUSxDQUFVLEVBQ3RFLEdBQUcsRUFBVyxHQUFHLEdBQTRCLEVBQVEsRUFBWSxDQUFVLElBRTdFLENBQ1QsQ0FHQSxTQUFTLEdBQWtCLEVBQXVCLEVBQW9DLENBQ3BGLE9BQU8sRUFBTyxVQUFVLE9BQVMsRUFBVyxVQUFVLEtBQ3hELENBRUEsTUFBTSxHQUE0QixJQUFJLElBR3RDLFNBQWdCLEdBQXdCLEVBQWdELENBQ3RGLElBQU0sRUFBUyxHQUEwQixJQUFJLEVBQVcsT0FBTyxFQUMvRCxHQUFJLEVBQVEsT0FBTyxFQUVuQixJQUFNLEVBQXNCLElBQUksSUFDaEMsSUFBSyxJQUFNLEtBQW1CLEdBQTZCLENBQVUsRUFDbkUsR0FBSSxDQUNGLElBQU0sRUFBdUIsS0FBSyxNQUNoQyxFQUFHLGFBQWEsRUFBSyxRQUFRLEVBQVcsUUFBUyxDQUFlLEVBQUcsTUFBTSxDQUMzRSxFQUNJLEVBQXFCLE1BQ3ZCLEVBQW9CLElBQUksRUFBcUIsS0FBTSxFQUFLLE1BQU0sUUFBUSxDQUFlLENBQUMsQ0FFMUYsTUFBUSxDQUVSLENBR0YsT0FEQSxHQUEwQixJQUFJLEVBQVcsUUFBUyxDQUFtQixFQUM5RCxDQUNULENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ1MsQ0FHVCxHQUZJLENBQUMsR0FDRCxJQUFtQixLQUNuQixHQUF5QixDQUFjLEVBQUcsTUFBTyxHQUNyRCxHQUFJLENBQUMsR0FBdUIsSUFBSSxDQUFVLEVBQUcsTUFBTyxHQUNwRCxJQUFNLEVBQWlCLEdBQTRCLEVBQVEsRUFBWSxDQUFVLEVBTTNFLEVBTHNCLEVBQU8sTUFBTSxDQU1yQixJQUFNLEVBQU8sV0FBVyxDQUFjLEVBQUksRUFBTyxXQUFXLENBQWMsQ0FBQyxFQUFFLFFBQVUsSUFBQSxJQXFCM0csT0FuQkUsSUFBZSxHQUNmLEdBQWtCLEVBQVEsQ0FBVSxHQUNwQyxHQUNBLEVBQU8sTUFBTSxDQUF3QixHQUFLLEdBQzFDLEVBQU8sTUFBTSxDQUFjLEdBQzNCLEdBQXNCLEVBQWdCLENBQWMsR0FTbEQsR0FBeUMsRUFBWSxFQUFnQixDQUFjLEVBQzlFLEdBSUYsR0FBc0IsRUFBZ0IsQ0FBYyxDQUM3RCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDMEIsQ0FDMUIsR0FBSSxDQUFDLEVBQ0gsTUFBTyxHQUVULElBQU0sRUFBc0IsRUFBTyxNQUFNLENBQWMsRUFDakQsRUFBc0IsRUFBTyxNQUFNLENBQWMsRUFDdkQsT0FDRSxHQUEwQixDQUFVLEdBQ3BDLElBQXdCLE1BQ3hCLElBQXdCLE1BQ3hCLEVBQU8sR0FBRyxFQUFxQixDQUFtQixDQUV0RCxDQU1BLFNBQVMsR0FBNEIsRUFBdUIsRUFBMkIsRUFBNEIsQ0FDakgsSUFBTSxFQUFnQixHQUEyQixDQUFVLEVBQzNELEdBQUksSUFBZSxHQUF3QixHQUFrQixFQUFRLENBQVUsRUFBRyxDQVFoRixJQUFNLEVBQXFCLEVBQU8sTUFBTSxDQUFhLEVBTXJELE9BTEksR0FBc0IsRUFBTyxNQUFNLENBQWtCLEVBQUksRUFBVSxFQUtoRSxHQUE4QixFQUFzQixPQUFPLEdBQUssT0FDekUsQ0FDQSxPQUFPLENBQ1QsQ0FNQSxTQUFTLEdBQThCLEVBQXFCLEVBQWlELENBQzNHLE9BQU8sR0FBOEIsR0FBbUIsQ0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFNLEdBQzFFLEVBQU8sR0FBRyxFQUFTLENBQW1CLENBQ3hDLENBQ0YsQ0FFQSxTQUFTLEdBQXNCLEVBQTBCLEVBQWlDLENBQ3hGLElBQU0sRUFBcUIsRUFBTyxNQUFNLENBQWdCLEVBQ2xELEVBQXNCLEVBQU8sTUFBTSxDQUFjLEVBQ3ZELE1BQU8sQ0FBQyxHQUFzQixDQUFDLEdBQXVCLEVBQU8sR0FBRyxFQUFvQixDQUFtQixDQUN6RyxDQUVBLFNBQVMsR0FBeUIsRUFBMEIsQ0FDMUQsT0FBTyxFQUFRLFdBQVcsWUFBWSxDQUN4QyxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQzJCLENBQzNCLElBQU0sRUFBdUIsR0FBcUMsQ0FBVSxFQUM1RSxHQUFJLEVBQ0YsT0FBTyxHQUF3QyxFQUFzQixFQUFZLENBQWtCLEVBR3JHLElBQU0sRUFBK0IsR0FBcUMsQ0FBa0IsRUFLNUYsT0FKSSxFQUNLLEdBQXdDLEVBQThCLENBQWtCLEVBRzFGLENBQ1QsQ0FFQSxTQUFTLEdBQXFDLEVBQTJELENBQ3ZHLEdBQUksT0FBTyxHQUFlLFNBQVUsQ0FDbEMsR0FBSSxDQUFDLEVBQVcsV0FBVyxTQUFTLEVBQUcsT0FFdkMsR0FBTSxDQUFDLEVBQU8sR0FBUSxHQUFXLGNBQWMsQ0FBVSxFQUV6RCxNQURJLENBQUMsR0FBUyxDQUFDLEVBQU0sT0FDZCwwQkFBMEIsRUFBTSxHQUFHLEVBQUssS0FDakQsQ0FFQSxJQUFNLEVBQWdCLEdBQVksSUFDbEMsR0FBSSxPQUFPLEdBQWtCLFNBQVUsT0FFdkMsSUFBTSxFQUFVLGtFQUFrRSxLQUFLLENBQWEsRUFDcEcsR0FBSSxDQUFDLEVBQVMsT0FFZCxHQUFNLEVBQUcsRUFBTyxHQUFRLEVBQ3hCLE1BQU8sMEJBQTBCLEVBQU0sR0FBRyxFQUFLLEtBQ2pELENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUMyQixDQVEzQixNQUFPLENBQ0wsR0FQQSxPQUFPLEdBQWUsU0FDbEIsRUFDQSxPQUFPLEdBQXVCLFNBQzVCLEVBQ0EsSUFBQSxHQUlOLEtBQU0sTUFDTixJQUFLLENBQ1AsQ0FDRixDQUVBLFNBQWdCLEdBQWdCLEVBQXVCLEVBQXlELENBQzlHLElBQU0sRUFBZSxFQUFPLHVCQUF5QixFQUFPLGdDQUN0RCxFQUFrQyxDQUd0QyxRQUFTLDZCQUNULE9BQVEsdUJBQ1IsS0FBTSxjQUNOLFdBQVksb0JBQ1osS0FBTSxjQUNOLFVBQVcsbUJBQ1gsT0FBUSxnQkFDUixjQUFlLHNCQUNqQixFQWFBLE9BWkksRUFBTyxRQUNULEdBQW9CLEVBQVMsQ0FBVSxFQUV6QyxHQUFnQixFQUFRLEVBQVMsQ0FBVSxFQUMzQyxHQUE0QixFQUFTLEVBQVksQ0FBQyxPQUFRLGFBQWEsQ0FBQyxFQUN4RSxHQUFxQixFQUFRLEVBQVMsRUFBWSxPQUFPLEdBQXFCLENBQU0sR0FBRyxFQUN2RixHQUFxQixFQUFRLEVBQVMsRUFBWSxDQUFDLFFBQVMsTUFBTyxRQUFTLE9BQVEsV0FBVyxDQUFDLEVBQzNGLEVBRU0sRUFBTyxVQUFVLFVBQzFCLEVBQVEsV0FBYSxlQUZyQixPQUFPLEVBQVEsVUFJVixDQUNULENBS0EsU0FBUyxHQUFvQixFQUFpQyxFQUF1QyxDQUNuRyxJQUFNLEVBQVksRUFBVyxXQUc3QixFQUFRLFdBQWEsR0FBYSxDQUFDLEdBQTBCLENBQVMsRUFBSSxFQUFZLG1CQUN4RixDQUdBLFNBQVMsR0FBMEIsRUFBeUIsQ0FDMUQsT0FBTyxFQUFPLEtBQUssSUFBTSxtQkFDM0IsQ0FRQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ00sQ0FDTixJQUFNLEVBQVksRUFBVyxNQUFNLEtBQUssRUFDcEMsQ0FBQyxHQUFhLEVBQWtCLENBQU0sR0FBSyxHQUFzQixDQUFTLElBQzlFLEVBQVEsS0FBTyxFQUNqQixDQUdBLFNBQVMsR0FBc0IsRUFBeUIsQ0FDdEQsT0FBTyxFQUFPLEtBQUssSUFBTSxhQUMzQixDQVNBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDTSxDQUNOLElBQUssSUFBTSxLQUFjLEVBQWEsQ0FDcEMsSUFBTSxFQUFZLEVBQVcsRUFBVyxFQUFFLEtBQUssRUFDekMsRUFBa0IsRUFBUSxHQUNoQyxHQUFJLENBQUMsR0FBYSxDQUFDLEdBQW1CLElBQWMsRUFBaUIsU0FDckUsSUFBTSxFQUFpQixPQUNyQixJQUFJLEdBQWEsQ0FBZSxDQUFDLENBQUMsV0FBVyxJQUFLLE9BQU8sR0FBRyxRQUFRLEVBQUUsZ0NBQ3RFLEdBQ0YsRUFFSSxFQUFXLEtBQUssQ0FBUyxFQUUzQixFQUFRLEdBQWMsRUFBVSxRQUFRLE1BQWtCLENBQWUsRUFDaEUsb0JBQW9CLEtBQUssQ0FBUyxJQUMzQyxFQUFRLEdBQWMsRUFFMUIsQ0FDRixDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNNLENBQ0YsQ0FBQyxFQUFPLFVBQVUsUUFBVSxDQUFDLEVBQU8sVUFBVSxVQUVsRCxHQUFvQixFQUFTLEVBQVksc0JBQXVCLEdBQUcsRUFBWSxjQUFlLGFBQWEsRUFDM0csR0FDRSxFQUNBLEVBQ0EsYUFDQSxHQUFHLEVBQVksOEJBQ2YsNkJBQ0YsRUFDQSxHQUFvQixFQUFTLEVBQVksVUFBVyxHQUFHLEVBQVksU0FBVSxRQUFRLEVBQ3ZGLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUNOLElBQU0sRUFBWSxFQUFXLEdBR3ZCLEVBQWtCLENBQUMsYUFBYSxJQUFzQixpQkFBaUIsR0FBb0IsRUFDakcsRUFBUSxHQUFRLEdBQWEsQ0FBQyxFQUFnQixTQUFTLEVBQVUsS0FBSyxDQUFDLEVBQUksRUFBWSxDQUN6RixDQUVBLFNBQVMsR0FBcUIsRUFBOEMsQ0FFMUUsT0FESSxFQUFPLFVBQVUsT0FBZSxZQUM3QixPQUNULENBRUEsU0FBUyxHQUFZLEVBQStDLENBQ2xFLE9BQU8sR0FBYSxPQUFTLENBQy9CLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ00sQ0FDTixJQUFLLElBQU0sS0FBUSxFQUFPLENBRXhCLEdBREksQ0FBQyxHQUFZLEVBQVEsQ0FBSSxHQUN6QixHQUE4QixFQUFRLENBQUksRUFBRyxTQUtqRCxJQUFNLEVBQVksR0FBMkIsRUFBVyxHQUFPLENBQUksRUFDL0QsSUFBYyxJQUFBLElBQWEsRUFBVyxJQUFTLEVBQUUsS0FBUSxLQUM3RCxFQUFRLEdBQVEsR0FBRyxHQUFhLEdBQUcsV0FBVyxJQUNoRCxDQUNGLENBT0EsU0FBUyxHQUEyQixFQUFpQixFQUFrQyxDQUNqRixVQUFPLEdBQVcsU0FNdEIsT0FIYyxJQUFJLE9BQU8sT0FBTyxHQUFHLGtEQUFrRCxHQUFhLENBQUksRUFBRSxHQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQy9HLEVBQU8sS0FBSyxDQUVILENBQUMsR0FBRyxFQUNqQixDQUVBLFNBQVMsR0FBWSxFQUF1QixFQUF1QixDQUNqRSxPQUFPLE9BQU8sT0FBTyxFQUFPLFVBQVcsQ0FBSSxDQUM3QyxDQUVBLFNBQVMsR0FBOEIsRUFBdUIsRUFBdUIsQ0FDbkYsSUFBTSxFQUFPLEVBQU8sVUFBVSxHQUc5QixPQUZLLEVBRUUsQ0FEa0IsTUFBTyxPQUFRLE1BQU8sTUFDMUIsQ0FBQyxDQUFDLEtBQU0sR0FDM0IsSUFBSSxPQUFPLE9BQU8sR0FBRyxLQUFLLEVBQWUsZ0JBQWdCLEdBQWEsQ0FBSSxFQUFFLHNCQUF1QixHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUksQ0FDbkgsRUFKa0IsRUFLcEIsQ0FFQSxlQUFlLEdBQXNCLEVBQTZDLENBQ2hGLElBQU0sRUFBZSxJQUFJLElBQUksQ0FBQyxHQUFHLE9BQU8sS0FBSyxFQUFRLFlBQVksRUFBRyxHQUFHLE9BQU8sS0FBSyxFQUFRLGVBQWUsQ0FBQyxDQUFDLEVBWTVHLE1BQU0sUUFBUSxJQUNaLENBTkEsQ0FBRSxZQUFhLDZCQUE4QixJQUFLLGNBQWUsS0FBTSxnQkFBaUIsT0FBUSxpQkFBa0IsRUFDbEgsQ0FBRSxZQUFhLHFCQUFzQixJQUFLLGlCQUFrQixLQUFNLFFBQVMsT0FBUSxjQUFlLEVBQ2xHLENBQUUsWUFBYSx5QkFBMEIsSUFBSyxpQkFBa0IsS0FBTSxZQUFhLE9BQVEsY0FBZSxDQUk1RixDQUFDLENBQUMsSUFBSSxNQUFPLENBQUUsTUFBSyxjQUFhLE9BQU0sWUFBYSxDQUNoRSxHQUFJLENBQUMsRUFBYSxJQUFJLENBQVcsR0FBSyxHQUFtQixFQUFTLENBQVcsRUFBRyxPQUVoRixJQUFNLEVBQW9CLEVBQVEsYUFBYSxJQUFnQixFQUFRLGdCQUFnQixHQUd2RixRQUFRLGVBQWUsRUFGSCxJQUFXLGVBQWlCLGtCQUFvQixnQkFFdkIsQ0FBVyxFQUN4RCxFQUFRLEVBQU8sQ0FBQyxHQUFlLEdBQWdDLEVBQW1CLEVBQUssQ0FBSSxFQUN2RixFQUNBLE1BQU0sR0FBaUMsRUFBSyxDQUFJLENBQ3RELENBQUMsQ0FDSCxDQUNGLENBUUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNxQixDQUVyQixPQURLLEVBQ0UsSUFBSSxPQUFPLE9BQU8sR0FBRyxhQUFhLEVBQUksR0FBRyxFQUFLLGlCQUFrQixHQUFHLENBQUMsQ0FBQyxLQUFLLENBQVMsRUFEbkUsRUFFekIsQ0FFQSxlQUFlLEdBQWlDLEVBQWEsRUFBK0IsQ0FFMUYsTUFBTyxrQkFBa0IsRUFBSSxHQUFHLEVBQUssT0FBTyxNQURuQixHQUFvQixFQUFLLENBQUksR0FFeEQsQ0FFQSxTQUFTLEdBQW1CLEVBQXNCLEVBQThCLENBQzlFLE9BQVEsRUFBUSxrQkFBa0IsSUFBZ0IsRUFBUSxlQUFlLElBQWdCLEdBQUEsQ0FBSSxTQUFTLFdBQVcsQ0FDbkgsQ0NyL0NBLE1BQU0sR0FBcUQsQ0FDekQsYUFBYyxhQUNkLGFBQWMsQ0FDWixLQUFNLENBQ0osQ0FDRSxLQUFNLFVBQ04sT0FBUSxhQUNSLE9BQVEsTUFDVixDQUNGLENBQ0YsRUFDQSxXQUFZLENBQ1YsS0FBTSxDQUNKLENBQ0UsS0FBTSxRQUNOLE9BQVEsV0FDUixPQUFRLE1BQ1YsQ0FDRixDQUNGLENBQ0YsRUFJTSxHQUFvRCxDQUN4RCxLQUFNLENBQ0osQ0FDRSxLQUFNLFVBQ04sS0FBTSxHQUNOLElBQUssR0FDTCxZQUFhLEVBQ2YsRUFDQSxDQUNFLEtBQU0sbUJBQ04sS0FBTSxtQkFDTixJQUFLOzs7Ozs7O2VBVVAsRUFDQSxDQVlFLEtBQU0seUJBQ04sS0FBTSxXQUNOLElBQUssMERBQ0wsWUFBYSxFQUNmLEVBQ0EsQ0FTRSxLQUFNLDJCQUNOLEtBQU0saUJBQ04sSUFBSyxzR0FDUCxDQUNGLENBQ0YsRUFFTSxHQUFVLENBSWQscUJBQXNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXVCdEIsVUFBVzs7Ozs7Ozs7RUFXYixFQUVBLGVBQXNCLEdBQWlCLEVBQXVCLEVBQThCLENBQUMsQ0FBTSxFQUFrQixDQUNuSCxPQUFPLEVBQU8sMEJBQTBCLG1CQUFvQixTQUFZLENBQ3RFLE1BQU0sR0FBSyxFQUFRLENBQVUsQ0FDL0IsQ0FBQyxDQUNILENBRUEsZUFBZSxHQUFLLEVBQXVCLEVBQTRDLENBQ3JGLElBQU0sRUFBVSxFQUFLLFFBQVEsRUFBTyxRQUFTLFdBQVcsRUFDbEQsQ0FBRSxRQUFTLEdBQWdCLEVBQVEsQ0FBQyxDQUFDLEVBQ3JDLEVBQXNDLENBQzFDLEdBQUcsR0FDSCxhQUFjLENBQ1osS0FBTSxHQUFpQixDQUFNLENBQy9CLENBQ0YsRUFTQSxHQVJLLEdBQ0gsT0FBTyxFQUFTLFlBRWxCLE1BQU0sUUFBUSxJQUFJLENBQ2hCLEVBQU8sa0JBQWtCLEVBQUssS0FBSyxFQUFPLFFBQVMsY0FBYyxFQUFHLEVBQUssS0FBSyxFQUFVLENBQUUsVUFBVyxFQUFHLENBQUMsQ0FBQyxFQUMxRyxFQUFHLFNBQVMsR0FBRyxFQUFTLENBQUUsTUFBTyxHQUFNLFVBQVcsRUFBSyxDQUFDLENBQzFELENBQUMsRUFFRyxFQUFNLENBQ1IsSUFBTSxFQUFVLEdBQWlCLENBQU0sRUFDdkMsRUFBRyxVQUFVLEVBQUssS0FBSyxFQUFTLFVBQVUsRUFBRyxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQ2hFLE1BQU0sRUFBRyxTQUFTLFVBQVUsRUFBSyxLQUFLLEVBQVMsV0FBWSxVQUFVLEVBQUcsRUFBVTtFQUFNLENBQ3RGLEtBQU0sR0FDUixDQUFDLENBQ0gsQ0FDQSxJQUFNLEVBQW1CLEdBQUcsR0FBUSxVQUFVLE1BQU0sR0FBMEIsRUFBUSxDQUFVLENBQUMsQ0FBQyxLQUFLO0NBQUksRUFBRSxJQUM3RyxFQUFHLFVBQVUsRUFBUyxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQ3pDLE1BQU0sRUFBRyxTQUFTLFVBQVUsRUFBSyxRQUFRLEVBQVMsMkJBQTJCLEVBQUcsR0FBUSxxQkFBdUI7RUFBTSxDQUNuSCxLQUFNLEdBQ1IsQ0FBQyxFQUNELEVBQUcsVUFBVSxFQUFLLEtBQUssRUFBUyxZQUFZLEVBQUcsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUNsRSxNQUFNLEVBQUcsU0FBUyxVQUFVLEVBQUssUUFBUSxFQUFTLGFBQWMsWUFBWSxFQUFHLEVBQWtCLENBQy9GLEtBQU0sR0FDUixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQWlCLEVBQStCLENBR3ZELElBQU0sRUFBbUIsc0JBZ0J6QixPQWRJLEVBQU8sWUFBWSxXQUFXLHdCQUF3QixFQUNqRDs7Ozs7Ozs7OztFQVVULEVBQWlCO0VBQ2pCLEtBQUssRUFFRSxDQUNULENBRUEsU0FBUyxHQUFpQixFQUFzQyxDQUM5RCxPQUFPLEdBQWtCLEtBQ3RCLE9BQVEsR0FBUSxFQUFJLE9BQVMsNEJBQThCLEVBQU8sb0JBQW9CLENBQUMsQ0FDdkYsSUFBSyxHQUNKLEVBQUksT0FBUyxVQUNULENBQ0UsR0FBRyxFQUNILEtBQU0sR0FBZ0IsQ0FBTSxFQUM1QixJQUFLLEdBQWtCLENBQU0sQ0FDL0IsRUFDQSxDQUNOLENBQ0osQ0FFQSxTQUFTLEdBQWdCLEVBQStCLENBR3RELElBQU0sRUFBc0IsQ0FBQyxHQUFHLEVBQVcsWUFBWSxFQVd2RCxPQVZJLEVBQWtCLENBQU0sR0FDMUIsRUFBb0IsS0FBSyxHQUFHLEVBQVcsTUFBTyxHQUFHLEVBQVcsTUFBTSxHQUVoRSxFQUFPLHVCQUF5QixFQUFPLG9CQUN6QyxFQUFvQixLQUFLLElBQUksRUFFM0IsRUFBTyx3QkFDVCxFQUFvQixLQUFLLE1BQU0sRUFHMUIsU0FEb0IsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFtQixDQUFDLENBQUMsQ0FBQyxTQUM1QixDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFDL0MsQ0FFQSxTQUFTLEdBQWtCLEVBQStCLENBZXhELE9BZEksR0FBb0IsQ0FBTSxFQUNyQixPQUFPLEdBQUc7O0VBRW5CLEtBQUssRUFJMEIsRUFBa0IsQ0FBTSxHQUFLLEdBQWdCLENBQU0sRUFFekUsK0NBS0YsT0FBTyxHQUFHOztFQUVqQixHQUF3QixDQUFNLEVBQUksT0FBTyxHQUFHLDJFQUE2RSxHQUFHO0VBQzVILEVBQU8sdUJBQXlCLE9BQU8sR0FBRyxxSkFBdUosR0FBRzs7Ozs7RUFNcE0sR0FBd0IsQ0FBTSxFQUMxQjtJQUNGLEdBQWdCLENBQU0sRUFBRTtJQUN4QixHQUFnQixDQUFNLEVBQUU7SUFDeEIsR0FBZ0IsQ0FBTSxFQUFFO0lBRXRCLEdBQ0w7RUFFQyxFQUFPLHVCQUNIOztJQUdBLEdBQ0w7RUFDQyxLQUFLLENBQ1AsQ0FFQSxTQUFTLEdBQW9CLEVBQWdDLENBQzNELEdBQUksQ0FBQyxFQUFPLE9BQVEsTUFBTyxHQUUzQixJQUFNLEVBQXlCLEVBQUssUUFBUSxFQUFPLFFBQVMsV0FBWSxLQUFNLGNBQWMsRUFDNUYsR0FBSSxDQUFDLEVBQUcsV0FBVyxDQUFzQixFQUFHLE1BQU8sR0FFbkQsR0FBSSxDQUVGLE9BRG9CLEtBQUssTUFBTSxFQUFHLGFBQWEsRUFBd0IsTUFBTSxDQUM1RCxDQUFDLENBQUMsT0FBUyxpQkFDOUIsTUFBUSxDQUNOLE1BQU8sRUFDVCxDQUNGLENBRUEsU0FBUyxHQUEwQixFQUF1QixFQUF1QyxDQUMvRixJQUFNLEVBQThCLENBQUMsRUFDL0IsRUFBc0IsT0FBTyxHQUFHLDRCQUN0QyxFQUFrQixLQUFLLE9BQU8sR0FBRyxtQkFBbUIsRUFBb0IsaUJBQWlCLEVBQ3pGLElBT00sRUFBb0IsR0FDeEIsRUFDQSxFQUNDLEdBQW9CLEVBQWdCLFVBQVUsT0FBUyxFQUFnQixVQUFVLEtBQ2xGLE9BQ0YsRUFDTSxFQUNKLEVBQWtCLE9BQVMsRUFBSSxpQkFBaUIsRUFBa0IsSUFBSSxFQUFzQixDQUFDLENBQUMsS0FBSyxHQUFHLElBQU0sR0FJeEcsRUFBc0IsR0FBaUMsRUFBUSxNQUFrQixHQUFNLGNBQWMsRUFDM0csRUFBa0IsS0FDaEIsT0FBTyxHQUFHLGtKQUFrSixFQUFvQixJQUFJLEVBQWEsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQy9NLEVBR0EsRUFBa0IsS0FDaEIsT0FBTyxHQUFHLDZFQUE2RSxnQkFBaUIsRUFBa0IsRUFDNUgsRUFLQSxJQUFNLEVBQXlCLEdBQzdCLEVBQ0EsRUFDQyxHQUFvQixFQUFnQixVQUFVLFFBQVUsRUFBZ0IsVUFBVSxLQUNuRixvQkFDRixFQUNJLEVBQXVCLE9BQVMsR0FDbEMsRUFBa0IsS0FDaEIsT0FBTyxHQUFHLHNEQUFzRCxFQUF1QixJQUFJLEVBQXNCLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxFQUMvSCxFQUVFLEVBQU8sdUJBQ1QsRUFBa0IsS0FBSyxPQUFPLEdBQUcsZ0RBQWdELEVBRS9FLEVBQU8sbUJBQ1QsRUFBa0IsS0FBSyxPQUFPLEdBQUcsOENBQThDLEVBUTdFLEVBQU8sVUFBVSxRQUNuQixFQUFrQixLQUNoQixPQUFPLEdBQUcscURBQ1YsT0FBTyxHQUFHLHNEQUNaLEVBRUYsSUFBTSxFQUFtQixHQUFvQixFQUFRLEVBQU8sYUFBYSxPQUFPLEVBS2hGLE9BSkksR0FFRixFQUFrQixLQUFLLE9BQU8sR0FBRyx5Q0FBeUMsRUFBaUIsRUFBRSxFQUV4RixDQUNULENBT0EsU0FBUyxHQUF1QixFQUEwQixDQUV4RCxPQURtQixHQUFjLENBQ2pCLENBQUMsQ0FBQyxXQUFXLFlBQWEsT0FBTyxHQUFHLEtBQUssQ0FDM0QsQ0FFQSxTQUFTLEdBQWMsRUFBMEIsQ0FDL0MsTUFBTyxJQUFJLEVBQVMsV0FBVyxJQUFLLE9BQU8sR0FBRyxNQUFNLEVBQUUsRUFDeEQsQ0FPQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFDVSxDQUNWLE1BQU8sQ0FDTCxHQUFHLElBQUksSUFDTCxFQUNHLE9BQVEsR0FBVyxFQUFVLENBQU0sQ0FBQyxDQUFDLENBQ3JDLElBQUssR0FBVyxDQUNmLElBQU0sRUFBa0IsRUFBSyxTQUFTLEVBQVcsUUFBUyxFQUFPLE9BQU8sQ0FBQyxDQUFDLFdBQVcsS0FBTSxHQUFHLEVBQzlGLE9BQU8sRUFBa0IsRUFBSyxNQUFNLEtBQUssRUFBaUIsQ0FBVSxFQUFJLENBQzFFLENBQUMsQ0FDTCxDQUNGLENBQUMsQ0FBQyxTQUFTLENBQ2IsQ0FFQSxTQUFTLEdBQXdCLEVBQWdDLENBQy9ELE9BQU8sRUFBTyx1QkFBeUIsRUFBTyxpQkFDaEQsQ0FFQSxTQUFTLEdBQWdCLEVBQWdELENBQ3ZFLE9BQU8sRUFBTyxrQkFBb0IsU0FBVyxZQUMvQyxDQ3BhQSxTQUFnQixHQUF1QixFQUFpRCxDQUN0RixPQUFPLEdBQVMsS0FBSyxDQUN2QixDQ2NBLElBQWEsR0FBYixLQUFpQyxDQUMvQixXQUVBLGFBRUEsU0FFQSxZQUFZLEVBQXFDLENBQy9DLEtBQUssV0FBYSxFQUFRLFdBQzFCLEtBQUssYUFBZSxFQUFRLGFBQzVCLEtBQUssU0FBVyxFQUFRLFFBQzFCLENBRUEsaUJBQWlCLEVBQTBDLENBS3pELE9BSkssRUFBUSxpQkFDVCxLQUFLLGlCQUFpQixFQUFRLGVBQWUsRUFDeEMsS0FBSyxxQkFBcUIsRUFBUSxnQkFBaUIsRUFBUSxlQUFnQixFQUFRLFFBQVEsRUFFN0YsRUFBUSxjQUNqQixDQUVBLFNBQVMsRUFBNEIsRUFBeUIsQ0FDNUQsTUFBTyxHQUFHLEtBQUssZUFBZSxDQUFTLEVBQUU7RUFDM0MsRUFBUTtFQUNSLEtBQUssYUFBYSxDQUFTLEdBQzNCLENBRUEsaUJBQWlCLEVBQTBCLENBQ3pDLE9BQU8sS0FBSyxXQUFXLEtBQU0sR0FBYyxFQUFRLFNBQVMsS0FBSyxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQzdGLENBRUEscUJBQTZCLEVBQXlCLEVBQXdCLEVBQTBCLENBQ3RHLElBQUksRUFBVSxFQUNkLElBQUssSUFBTSxLQUFhLEtBQUssV0FBWSxDQUN2QyxJQUFNLEVBQWMsS0FBSyxvQkFBb0IsRUFBZ0IsQ0FBUyxFQUN0RSxHQUFJLENBQUMsRUFBYSxTQUVsQixJQUFNLEVBQWMsS0FBSyxvQkFBb0IsRUFBUyxFQUFXLENBQVcsRUFDNUUsR0FBSSxDQUFDLEVBRUgsT0FEQSxRQUFRLEtBQUssK0JBQStCLEVBQVUsWUFBWSxLQUFLLFNBQVMsV0FBVyxHQUFVLEVBQzlGLEVBRVQsRUFBVSxDQUNaLENBQ0EsT0FBTyxDQUNULENBRUEsb0JBQTRCLEVBQWlCLEVBQWdELENBQzNGLE9BQU8sS0FBSyxzQkFBc0IsQ0FBUyxDQUFDLENBQUMsS0FBSyxDQUFPLENBQUMsR0FBRyxFQUMvRCxDQUVBLG9CQUE0QixFQUFpQixFQUE0QixFQUF5QyxDQUNoSCxJQUFNLEVBQVUsS0FBSyxzQkFBc0IsQ0FBUyxFQUMvQyxLQUFRLEtBQUssQ0FBTyxFQUN6QixPQUFPLEVBQVEsUUFBUSxFQUFTLENBQVcsQ0FDN0MsQ0FFQSxzQkFBOEIsRUFBb0MsQ0FDaEUsT0FBVyxPQUNULEdBQUcsR0FBYSxLQUFLLGVBQWUsQ0FBUyxDQUFDLEVBQUUsWUFBWSxHQUFhLEtBQUssYUFBYSxDQUFTLENBQUMsR0FDdkcsQ0FDRixDQUVBLGVBQXVCLEVBQW9DLENBQ3pELE1BQU8saUJBQWlCLEtBQUssYUFBYSxHQUFHLEdBQy9DLENBRUEsYUFBcUIsRUFBb0MsQ0FDdkQsTUFBTyxlQUFlLEtBQUssYUFBYSxHQUFHLEdBQzdDLENBQ0YsRUM1RUEsTUFBTUUsR0FBc0IsSUFBSSxHQUFvQixDQUNsRCxXQUFZLENBQUMsT0FBUSxRQUFRLEVBQzdCLGFBQWMsUUFDZCxTQUFVLE9BQ1osQ0FBQyxFQUVELGVBQXNCLEdBQW9CLEVBQXNDLENBQzlFLE9BQU8sRUFBTywwQkFBMEIsc0JBQXVCLFNBQVksQ0FDekUsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsaUJBQWlCLEVBQ3pELEVBQWtCLE1BQU0sRUFBTyxpQkFBaUIsQ0FBUSxFQUN4RCxFQUFpQkEsR0FBb0IsaUJBQWlCLENBQzFELGVBQWdCQyxHQUFpQixDQUFNLEVBQ3ZDLGtCQUNBLFVBQ0YsQ0FBQyxFQUNHLEdBQXVCLENBQWUsSUFBTSxHQUF1QixDQUFjLEdBQ25GLE1BQU0sRUFBTyxhQUFhLEVBQVUsQ0FBYyxDQUV0RCxDQUFDLENBQ0gsQ0FFQSxTQUFTQSxHQUFpQixFQUErQixDQUN2RCxJQUFNLEVBQXdCLEdBQStCLEVBQVEsMkJBQTJCLEVBc0JoRyxPQWZLLEVBQU8sYUFlTCxHQUFHRCxHQUFvQixTQUM1QixPQUNBOztzQkFFa0IsRUFBc0I7O2lEQUcxQyxFQUFFOztFQUVGQSxHQUFvQixTQUFTLFNBQVUscUNBQXFDLEVBQUU7RUF2QnJFLEdBQUdBLEdBQW9CLFNBQzVCLE9BQ0E7OzsrQkFHeUIsRUFBc0I7OzZFQUdqRCxFQUFFOztFQUVKQSxHQUFvQixTQUFTLFNBQVUsdUNBQXVDLEVBQUU7Q0FlbEYsQ0NwREEsTUFBTSxHQUFzQixJQUFJLEdBQW9CLENBQ2xELFdBQVksQ0FBQyxPQUFRLFFBQVEsRUFDN0IsYUFBYyxTQUNkLFNBQVUsUUFDWixDQUFDLEVBRUQsZUFBc0IsR0FBcUIsRUFBdUIsRUFBMkMsQ0FDM0csT0FBTyxFQUFPLDBCQUEwQix1QkFBd0IsU0FBWSxDQUkxRSxJQUFNLEVBQXNDLEdBQXFDLENBQU0sRUFDakYsRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGtCQUFrQixFQUMxRCxFQUFrQixNQUFNLEVBQU8saUJBQWlCLENBQVEsRUFHeEQsRUFESixHQUF1QyxHQUFtQixDQUFDLEdBQW9CLGlCQUFpQixDQUFlLEVBRTdHLEVBQ0EsR0FBb0IsaUJBQWlCLENBQ25DLGVBQWdCLEdBQWlCLENBQU0sRUFDdkMsa0JBQ0EsVUFDRixDQUFDLEVBRUQsR0FBdUIsQ0FBZSxJQUFNLEdBQXVCLENBQWMsR0FDbkYsTUFBTSxFQUFPLGFBQWEsRUFBVSxDQUFjLENBRXRELENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBaUIsRUFBK0IsQ0FDdkQsSUFBTSxFQUFlLEVBQU8sT0FDdEIsRUFBeUIsR0FBK0IsRUFBUSw0QkFBNEIsRUF3QmxHLE9BZkssRUFBTyxhQWVMLEdBQUcsR0FBb0IsU0FDNUIsT0FDQTs7Z0NBRTRCLEVBQXVCOztFQUVyRCxHQUF5QixtQkFBb0IsQ0FBWSxHQUN6RCxFQUFFOztFQUVGLEdBQW9CLFNBQVMsU0FBVSxzQ0FBc0MsRUFBRTtFQXZCdEUsR0FBRyxHQUFvQixTQUM1QixPQUNBOzs7b0NBRzhCLEVBQXVCOztFQUV6RCxHQUF5QiwrQ0FBZ0QsQ0FBWSxHQUNuRixFQUFFOztFQUVKLEdBQW9CLFNBQVMsU0FBVSx3Q0FBd0MsRUFBRTtDQWVuRixDQU9BLFNBQVMsR0FBeUIsRUFBd0IsRUFBK0IsQ0FNdkYsT0FMSSxFQUNLLDhEQUE4RCxFQUFlO3VHQUkvRSw4REFBOEQsRUFBZTtxQ0FFdEYsQ0MxRUEsZUFBc0IsR0FBdUIsRUFBc0MsQ0FDakYsT0FBTyxFQUFPLDBCQUEwQix5QkFBMEIsU0FBWSxDQUM1RSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxpQkFBaUIsRUFDekQsRUFBVyxNQUFNLEVBQU8saUJBQWlCLENBQVEsR0FBTSxHQUN2RCxFQUFrQixFQUFlLG1CQUFtQixDQUFPLEVBQzNELEVBQWtCLEVBQWUsbUJBQW1CLENBQU8sRUFFM0QsRUFBb0IsRUFBSyxRQUFRLEVBQU8sUUFBUyxZQUFZLEVBQzdELEVBQW9CLE1BQU0sRUFBZSwrQkFBK0IsQ0FBaUIsR0FBTSxHQUVqRyxFQUFvQixHQUNwQixFQUFPLHlCQUNULEVBQW9COzs7O0dBT3RCLElBQU0sRUFBYSxFQUFrQjs7Ozs7Ozs7Ozs7RUFBZ0IsRUFBb0IsRUFBbUIsRUFDNUYsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQy9CQSxNQUFNLEdBQVUsQ0FDZCxTQUFVLElBQ1YsS0FBTSxPQUNSLEVBRUEsZUFBc0IsR0FBMEIsRUFBc0MsQ0FDcEYsT0FBTyxFQUFPLDBCQUEwQiw0QkFBNkIsU0FBWSxDQUMvRSxJQUFJLEVBQXNCLGdCQUFnQixFQUFPLEVBQzNDLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxvQkFBb0IsRUFDNUQsRUFBYSxNQUFNLEVBQU8saUJBQWlCLENBQVEsRUFDckQsRUFDSixHQUFJLElBQWUsSUFBQSxJQUFhLENBQUMsRUFBVSxhQUFhLENBQVUsRUFBRyxDQUduRSxJQUFNLEVBQWMsRUFBVSx5QkFBaUMsQ0FBVSxFQUN6RSxHQUFJLENBQUMsRUFBYSxDQUNoQixRQUFRLEtBQUssc0JBQXNCLEVBQVMsd0RBQXdELEVBQ3BHLE1BQ0YsQ0FDQSxFQUF1QixLQUFLLFVBQVUsRUFBUyxnQkFBZ0IsQ0FBVyxDQUE0QixDQUFDLEVBQ3ZHLEVBQWMsRUFBTSxJQUFJLENBQUMsRUFBYSxFQUFhLENBQVcsRUFBRyxDQUFFLFdBQVksRUFBZSxDQUFDLENBQ2pHLENBR0EsR0FBSSxJQUF5QixLQUFLLFVBQVUsRUFBUyxnQkFBZ0IsQ0FBVyxDQUE0QixDQUFDLEVBQzNHLE9BRUYsSUFBTSxFQUFhLEtBQUssVUFBVSxFQUFhLElBQUEsR0FBVyxDQUFDLEVBQzNELE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FBQyxDQUN2RSxDQUFDLENBQ0gsQ0M3QkEsZUFBc0IsR0FBaUIsRUFBc0MsQ0FDM0UsT0FBTyxFQUFPLDBCQUEwQixtQkFBb0IsU0FBWSxDQUN0RSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxnQkFBZ0IsRUFDeEQsRUFBVSxNQUFNLEVBQU8saUJBQWlCLENBQVEsRUFDaEQsRUFBZ0IsR0FBa0IsRUFBTyxVQUFVLEVBQ3pELEdBQUksQ0FBQyxFQUFTLENBQ1IsRUFBTyxXQUFhLEdBQ3RCLE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVO0NBQWdCLENBQUMsRUFFN0UsTUFDRixDQUVBLElBQUksRUFBYSxFQUFRLFFBQVEsZUFBZ0I7O2NBQW1CLEVBS2hFLEdBQWlCLENBQUMsb0JBQW9CLEtBQUssQ0FBVSxFQUN2RCxFQUFhLEdBQUcsRUFBVyxRQUFRLE9BQVE7Q0FBSSxFQUFFLGdCQUN4QyxFQUFPLFlBQWMsQ0FBQyxJQUMvQixFQUFhLEVBQVcsUUFBUSxzQkFBdUIsRUFBRSxHQUV2RCxJQUFlLEdBRW5CLE1BQU0sRUFBWSxRQUNoQixFQUFhLEVBQU8sYUFBYSxFQUFVLENBQVUsRUFBSSxFQUFPLGVBQWUsQ0FBUSxDQUN6RixDQUNGLENBQUMsQ0FDSCxDQzNCQSxNQUFNLEdBQ0osd0tBRUksR0FBcUIscUNBQ3JCLEdBQXFCLGNBS3JCLEdBQXVCLENBQzNCLDRKQUNBLHdHQUlBLG9GQUNGLEVBRUEsU0FBUyxHQUFlLEVBQXVCLENBRTdDLE1BQU8sWUFBWSxLQUFxQixFQUFNLFdBQVcsSUFBSyxJQUFJLElBQUksR0FBbUIsa0VBQzNGLENBR0EsZUFBc0IsR0FBNEIsRUFBOEMsQ0FLOUYsSUFBTSxFQUFTLE1BQU0sRUFBTyx5QkFBeUIsRUFBSyxRQUFRLEVBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFZLENBQUMsQ0FBQyxFQUNuRyxPQUFXLElBQUEsR0FPZixLQUFLLElBQU0sS0FBUSxHQUFhLENBQU0sQ0FBQyxDQUFDLFNBQ2pDLE1BQWlCLENBQUksRUFDMUIsSUFBSyxJQUFNLEtBQVMsRUFBSyxTQUFVLENBQ2pDLEdBQUksQ0FBQyxHQUFZLENBQUssRUFBRyxTQUN6QixHQUFNLENBQUUsT0FBUSxFQUFNLFNBQVMsR0FDL0IsR0FBSSxFQUFJLFdBQVcsRUFBa0IsR0FBSyxFQUFJLFNBQVMsRUFBa0IsRUFDdkUsT0FBTyxFQUFJLE1BQU0sR0FBMkIsR0FBMEIsQ0FBQyxDQUFDLFdBQVcsS0FBTSxHQUFHLENBRWhHLENBQ0YsQ0FFRixDQUVBLGVBQXNCLEdBQWUsRUFBc0MsQ0FDekUsT0FBTyxFQUFPLDBCQUEwQixpQkFBa0IsU0FBWSxDQUNwRSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxXQUFXLEVBSXJELEVBQ0QsTUFBTSxFQUFPLGlCQUFpQixDQUFRLEdBQ3ZDLEtBQUssRUFBTyxhQUFhLE1BQVEsRUFBSyxTQUFTLEVBQUssUUFBUSxFQUFPLE9BQU8sQ0FBQyxFQUFFLElBS3pFLEVBQW1CLENBQUMsRUFDcEIsRUFBaUIsTUFBTSxHQUEyQixDQUFNLEVBQzFELEdBQWdCLEVBQU8sS0FBSyxHQUFjLENBQWMsQ0FBQyxFQUM3RCxFQUFPLEtBQUssR0FBSSxNQUFNLEdBQW9CLENBQU0sQ0FBRSxFQUM5QyxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxpQkFBaUIsQ0FBQyxHQUFHLEVBQU8sS0FBSyxFQUFvQixFQUNwRyxFQUFPLEtBQUssR0FBZSxHQUFvQixHQUFLLFNBQVMsQ0FBQyxFQUs5RCxFQUFhLEdBQWdCLEVBQVksQ0FBTSxFQUUvQyxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxFQUFZLEdBQWMsQ0FBVSxDQUFDLENBQUMsQ0FDbEcsQ0FBQyxDQUNILENBTUEsZUFBZSxHQUEyQixFQUFvRCxDQUM1RixJQUFNLEVBQWMsRUFBTyxZQUMzQixHQUFJLENBQUMsR0FBYSxNQUFRLENBQUMsRUFBTyxRQUFRLElBQUssT0FJL0MsSUFBTSxFQUEyQixDQUFDLENBQUMsRUFBWSxlQUFpQixFQUFPLFFBQVEsaUJBQzNFLE9BQVksU0FBVyxFQUFFLEVBQU8sNEJBQThCLElBSWxFLE9BQVEsTUFBTSxHQUF5QixFQUFZLElBQUksRUFBSyxJQUFBLEdBQVksRUFBWSxJQUN0RixDQVFBLGVBQWUsR0FBeUIsRUFBdUMsQ0FDN0UsR0FBSSxDQUVGLElBQU0sRUFBYyxFQUFZLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQVUzRSxPQUFPLE1BSmdCLE1BQU0sOEJBQThCLElBQWUsQ0FDeEUsT0FBUSxPQUNSLE9BQVEsWUFBWSxRQUFRLEdBQU0sQ0FDcEMsQ0FBQyxFQUFBLENBQ2UsU0FBVyxHQUM3QixNQUFRLENBQ04sTUFBTyxFQUNULENBQ0YsQ0FFQSxTQUFTLEdBQWMsRUFBNkIsQ0FDbEQsTUFBTyxnREFBZ0QsRUFBWSx1Q0FBK0IsRUFBWSxFQUNoSCxDQUVBLGVBQWUsR0FBb0IsRUFBMEMsQ0FDM0UsSUFBTSxFQUFhLEVBQU8sWUFBWSxNQUFNLEVBQU8sV0FBVyxRQUFRLEdBQUcsRUFBSSxDQUFDLEVBQ3hFLEVBQWdCLEVBQUssUUFBUSxFQUFPLFFBQVMsVUFBVyxXQUFXLEVBQ3pFLEdBQUksQ0FBQyxHQUFjLENBQUMsRUFBRyxXQUFXLENBQWEsRUFBRyxNQUFPLENBQUMsRUFTMUQsSUFBTSxFQUNKLEVBQU8sa0JBQWtCLFNBQVcsR0FBSyxHQUE0QixFQUFlLGdCQUFpQixXQUFXLEVBRTVHLEVBQW1CLENBQUMsRUFDMUIsSUFBSyxJQUFNLEtBQVksRUFBRyxZQUFZLENBQWEsRUFBRyxDQU1wRCxHQUxJLENBQUMsRUFBUyxXQUFXLE1BQU0sR0FBSyxDQUFDLEVBQVMsV0FBVyxRQUFRLEdBQzdELElBQWEsaUJBQW1CLEdBSWhDLEVBQVMsV0FBVyxRQUFRLEdBQUssQ0FBRSxNQUFNLEdBQWtCLEVBQVksRUFBVSxFQUFPLFlBQVksRUFDdEcsU0FFRixJQUFNLEdBQWEsRUFBUyxJQUFNLEdBQUEsQ0FBSSxZQUFZLEVBQUksRUFBUyxNQUFNLEVBQUcsRUFBUyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFLLEdBQUcsRUFDekcsRUFBYyxzQkFBc0IsRUFBVyxxQkFBcUIsR0FBYyxDQUFRLElBQ2hHLEVBQU8sS0FBSyxNQUFNLEVBQVUsSUFBSSxFQUFZLGVBQWUsRUFBWSxFQUFFLENBQzNFLENBQ0EsT0FBTyxDQUNULENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDQSxFQUNrQixDQUNsQixHQUFNLENBQUMsRUFBTyxHQUFRLEVBQVcsTUFBTSxHQUFHLEVBQzFDLEdBQUksQ0FBQyxHQUFTLENBQUMsRUFBTSxNQUFPLEdBQzVCLEdBQUksQ0FPRixPQUFPLE1BTmdCLEdBQVcsQ0FBSyxDQUFDLENBQUMsUUFBUSxpRUFBa0UsQ0FDakgsUUFDQSxPQUNBLFlBQWEsRUFDYixTQUFVLENBQ1osQ0FBQyxFQUFBLENBQ2UsS0FBSyxZQUFjLENBQ3JDLE9BQVMsRUFBTyxDQU9kLE1BRkEsRUFBSyxFQUE4QixTQUFXLEtBQU8sRUFHdkQsQ0FDRixDQWNBLFNBQWdCLEdBQWdCLEVBQWdCLEVBQWlDLENBQy9FLElBQU0sRUFBYSxHQUFjLENBQU0sRUFHakMsRUFBZ0IsRUFBTyxXQUFXLEdBQUcsRUFBSSxJQUFNLEdBSS9DLEVBQWMsRUFBTyxNQUFNLEVBQWMsTUFBTSxFQUMvQyxFQUFjLEVBQVksV0FBVyxLQUFLLEVBQzNDLGlEQUFpRCxLQUFLLENBQVcsQ0FBQyxHQUFHLElBQU0sR0FDNUUsR0FDRSxFQUFTLEdBQUcsSUFBZ0IsSUFHNUIsRUFBa0IsVUFBVSxLQUFLLENBQU0sRUFDdkMsRUFBVSxFQUFZLE1BQU0sRUFBWSxNQUFNLENBQUMsQ0FBQyxRQUFRLFVBQVcsRUFBRSxFQUVyRSxFQUFRLEdBQWEsQ0FBTyxDQUFDLENBQUMsU0FFOUIsRUFBb0IsQ0FBQyxDQUFDLEVBQU0sSUFBTSxHQUFpQixFQUFNLEVBQUUsR0FBSyxHQUFZLEVBQU0sRUFBRSxFQUNwRixFQUFhLEVBQW9CLEVBQUksR0FBWSxFQUFNLEVBQUUsRUFBSSxFQUFJLEdBRWpFLEVBQWdCLEVBQW9CLEVBQU0sR0FBTSxFQUFNLEdBQ3RELEVBQ0osSUFBZSxHQUNYLEdBQ0EsRUFBUSxNQUFNLEdBQXNCLEVBQVMsQ0FBYyxFQUFHLEVBQU0sRUFBVyxDQUFFLFNBQVUsSUFBSSxNQUFNLEVBRXJHLEVBQVksRUFBTSxFQUFhLEdBQy9CLEVBQVcsR0FBYSxHQUFpQixDQUFTLEVBQUksR0FBVyxFQUFXLENBQU8sRUFBSSxJQUFBLEdBQ3ZGLEVBQVcsR0FBWSxFQUFZLEVBQU0sRUFBTSxRQUFRLENBQVMsRUFBSSxHQUFLLEVBQ3pFLEVBQU8sRUFBVyxFQUFRLE1BQU0sR0FBc0IsRUFBUyxDQUFRLENBQUMsRUFBSSxHQUs1RSxFQUFTLENBQUMsR0FBRyxFQUFlLElBQUksR0FBWSxDQUFDLEVBQUEsQ0FBRyxPQUFRLEdBQVUsQ0FBQyxHQUFlLENBQUssQ0FBQyxDQUFDLEVBTXpGLEVBQ0osR0FGZ0IsRUFBZSxVQUFVLEtBQUssQ0FBVyxFQUFJLEVBQWEsR0FBRyxJQUFhLElBQWdCLElBRXJGLENBQUMsRUFBTSxFQUFPLEtBQUssQ0FBVSxFQUFHLENBQUksQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQWEsR0FBWSxFQUM5RyxPQUFPLEVBQWtCLEdBQUcsSUFBUyxJQUFlLENBQ3RELENBT0EsU0FBUyxHQUFzQixFQUFpQixFQUEyQixDQUN6RSxJQUFNLEVBQVEsRUFBSyxTQUFVLE1BQU0sT0FDN0IsRUFBWSxFQUFRLFlBQVk7RUFBTSxFQUFRLENBQUMsRUFBSSxFQUN6RCxNQUFPLFlBQVksS0FBSyxFQUFRLE1BQU0sRUFBVyxDQUFLLENBQUMsRUFBSSxFQUFZLENBQ3pFLENBT0EsU0FBUyxHQUFZLEVBQXdDLENBSzNELE9BSkssRUFDRCxFQUFLLE9BQVMsV0FHWCxFQUFLLE9BQVMsUUFBVSxHQUFtQixFQUFLLEtBQUssRUFKMUMsRUFLcEIsQ0FjQSxTQUFTLEdBQW1CLEVBQXVCLENBRWpELElBQU0sRUFBa0IsRUFBSyxXQUFXLDBCQUEyQixFQUFFLEVBTXJFLEdBQUksc0lBQTBCLEtBQUssQ0FBZSxFQUFHLE1BQU8sR0FLNUQsSUFBSyxJQUFNLEtBQVMsRUFBZ0IsU0FBUyxtREFBZSxFQUMxRCxHQUFJLEVBQU0sRUFBRSxFQUFFLFlBQVksSUFBTSxLQUFNLE1BQU8sR0FFL0MsTUFBTyxFQUNULENBR0EsU0FBUyxHQUFpQixFQUFzQyxDQUM5RCxPQUNFLEVBQUssT0FBUyxhQUNkLEVBQUssU0FBUyxLQUFNLEdBQVUsR0FBWSxDQUFLLENBQUMsR0FDaEQsRUFBSyxTQUFTLE1BQ1gsR0FBVSxHQUFZLENBQUssR0FBSyxFQUFNLE9BQVMsU0FBWSxFQUFNLE9BQVMsUUFBVSxDQUFDLEVBQU0sTUFBTSxLQUFLLENBQ3pHLENBRUosQ0FHQSxTQUFTLEdBQVksRUFBMkUsQ0FDOUYsT0FBTyxFQUFLLE9BQVMsUUFBVSxFQUFLLFNBQVMsU0FBVyxHQUFLLEVBQUssU0FBUyxFQUFFLEVBQUUsT0FBUyxPQUMxRixDQU1BLFNBQVMsR0FBVyxFQUFpQixFQUEyQixDQUM5RCxPQUFPLEVBQUssU0FDVCxPQUFRLEdBQVUsR0FBWSxDQUFLLENBQUMsQ0FBQyxDQUNyQyxJQUFLLEdBQVUsRUFBUSxNQUFNLEVBQU0sU0FBVSxNQUFNLE9BQVEsRUFBTSxTQUFVLElBQUksTUFBTSxDQUFDLENBQzNGLENBT0EsU0FBUyxHQUFjLEVBQXVCLENBQzVDLE9BQU8sRUFBTSxXQUFXLFdBQWEsR0FBYyxJQUFJLEVBQVUsWUFBWSxDQUFDLENBQUMsQ0FBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUMvRyxDQUdBLFNBQVMsR0FBZSxFQUF3QixDQUM5QyxPQUFPLElBQVUsSUFBd0IsR0FBcUIsS0FBTSxHQUFZLEVBQVEsS0FBSyxDQUFLLENBQUMsQ0FDckcsQ0FFQSxTQUFTLEdBQWMsRUFBZ0MsQ0FDckQsT0FBTyxFQUFRLFNBQVM7Q0FBTSxFQUFJO0VBQVM7Q0FDN0MsQ0N4VkEsZUFBc0IsR0FBa0IsRUFBMEMsQ0FDaEYsT0FBTyxFQUFPLDBCQUEwQixvQkFBcUIsU0FBWSxDQUN2RSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQVcsUUFBUyxpQkFBaUIsRUFDbkUsR0FBSSxDQUFDLEVBQUcsV0FBVyxDQUFRLEVBQUcsT0FFOUIsSUFBTSxFQUFXLEtBQUssTUFBTSxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQVUsTUFBTSxDQUFDLEVBSWxFLEVBQVUsRUFBUyxTQUFXLENBQUMsRUFDckMsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQVEsT0FBUSxJQUFLLENBQ3ZDLElBQU0sRUFBYyxFQUFRLEdBQ3RCLEVBQVUsTUFBTSxRQUFRLENBQVcsRUFDbkMsRUFBUyxFQUFVLEVBQVksR0FBSyxFQUNwQyxFQUFhLEdBQVcsRUFBWSxJQUFPLENBQUMsRUFDOUMsSUFBVyxvQ0FDYixFQUFRLEdBQUssQ0FDWCxvQ0FDQSxFQUFNLElBQ0osQ0FDRSxFQUNBLENBQ0UsT0FBUSxxQkFDVixDQUNGLEVBQ0EsQ0FBRSxXQUFZLEVBQWUsQ0FDL0IsQ0FDRixFQUNTLElBQVcsNkJBQ3BCLEVBQVEsR0FBSyxDQUNYLDJCQUNBLEVBQU0sSUFDSixDQUNFLEVBQ0EsQ0FFRSx3QkFBeUIsR0FDekIscUJBQXNCLEdBQ3RCLE9BQVEsQ0FBQyxxQkFBcUIsRUFDOUIsZUFBZ0IsQ0FBQyxxQkFBcUIsQ0FDeEMsQ0FDRixFQUNBLENBQUUsV0FBWSxFQUFlLENBQy9CLENBQ0YsRUFFSixDQUNBLElBQU0sRUFBYSxLQUFLLFVBQVUsRUFBVSxJQUFBLEdBQVcsQ0FBQyxFQUN4RCxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBQUMsQ0FDdkUsQ0FBQyxDQUNILENDbERBLE1BQU0sR0FBZSx3REFDZixHQUFvQixDQUN4QixRQUFTLG9EQUNULFFBQVMsQ0FBQyxFQUFZLENBQ3hCLEVBVU0sR0FBMEIsQ0FDOUIsZ0JBQ0EsaUJBQ0Esd0JBQ0EseUJBQ0EseUJBQ0EsY0FDQSxtQkFDQSxtQkFDRixFQUVBLGVBQXNCLEdBQXNCLEVBQXNDLENBQ2hGLE9BQU8sRUFBTywwQkFBMEIsd0JBQXlCLFNBQVksQ0FDM0UsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsZ0JBQWUsRUFFN0QsSUFBSSxNQUQyQixFQUFHLFNBQVMsTUFBTSxDQUFRLENBQUMsQ0FBQyxVQUFZLENBQUMsQ0FBQyxFQUFBLEVBQ25ELGVBQWUsRUFBRyxDQUN0QyxRQUFRLEtBQUssc0JBQXNCLEVBQVMsZ0NBQWdDLEVBQzVFLE1BQ0YsQ0FRQSxJQUFNLEdBQXlCLE1BTlksUUFBUSxJQUNqRCxHQUF3QixJQUFJLEtBQU8sSUFBaUIsQ0FDbEQsSUFBTSxFQUFZLEVBQUssUUFBUSxFQUFPLFFBQVMsQ0FBWSxFQUMzRCxPQUFRLE1BQU0sRUFBRyxTQUFTLE1BQU0sQ0FBUyxDQUFDLENBQUMsVUFBWSxDQUFDLENBQUMsRUFBSyxFQUFZLElBQUEsRUFDNUUsQ0FBQyxDQUNILEVBQUEsQ0FDNEQsS0FBTSxHQUFjLElBQWMsSUFBQSxFQUFTLEVBQ3ZHLEdBQUksR0FBMEIsRUFBTyxhQUFhLFNBQVUsQ0FDMUQsUUFBUSxLQUNOLHNCQUFzQixFQUFTLDZEQUM3QixFQUF5QixPQUFPLElBQTJCLG1CQUM1RCxFQUNILEVBQ0EsTUFDRixDQUVBLElBQU0sRUFBYSxNQUFNLEVBQU8saUJBQWlCLENBQVEsRUFDckQsRUFDSixHQUFJLElBQWUsSUFBQSxJQUFhLENBQUMsRUFBVSxhQUFhLENBQVUsSUFDaEUsRUFBYyxFQUFVLHlCQUFtQyxDQUFVLEVBQ2pFLENBQUMsR0FBYSxDQUNoQixRQUFRLEtBQUssc0JBQXNCLEVBQVMsd0RBQXdELEVBQ3BHLE1BQ0YsQ0FHRixHQUFJLEdBQWEsVUFBWSxJQUFBLElBQWEsQ0FBQyxNQUFNLFFBQVEsRUFBWSxPQUFPLEVBQUcsQ0FDN0UsUUFBUSxLQUFLLHNCQUFzQixFQUFTLG9DQUFvQyxFQUNoRixNQUNGLENBQ0EsSUFBTSxFQUFnQixHQUFhLFNBQVMsS0FDekMsR0FBVyxFQUFPLFdBQVcseUNBQXlDLEdBQUssSUFBVyxFQUN6RixFQUNBLEdBQUksRUFBZSxDQUNqQixRQUFRLEtBQUssc0JBQXNCLEVBQVMsWUFBWSxFQUFjLHdDQUF3QyxFQUM5RyxNQUNGLENBRUEsSUFBTSxFQUFjLEdBQWMsRUFBUSxDQUFXLEVBQy9DLENBQUUsVUFBUyxzQkFBdUIsRUFBVSwwQkFDaEQsRUFDQSxDQUNGLEVBQ0ksUUFBZSxJQUFBLElBQWEsR0FBVSxDQUFPLElBQU0sR0FBVSxDQUFVLElBQ3JFLE1BQU0sRUFBTyxhQUFhLEVBQVUsQ0FBTyxFQUVqRCxJQUFLLElBQU0sS0FBTyxFQUNoQixRQUFRLEtBQUssb0JBQW9CLEVBQUksdUNBQXVDLEVBQVMsRUFBRSxDQUUzRixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQWMsRUFBdUIsRUFBNkMsQ0FDekYsSUFBTSxFQUFXLEVBQ1osRUFBTSxJQUFJLENBQUMsR0FBbUIsRUFBYSxFQUFpQixFQUFHLENBQzlELFdBQVksRUFDZCxDQUFDLEVBQ0QsZ0JBQWdCLEVBQWlCLEVBQy9CLEVBQWtCLEdBQWEsU0FBVyxDQUFDLEVBTWpELE1BTEEsR0FBUyxRQUFVLEVBQU8scUJBQ3RCLEVBQWdCLE9BQVEsR0FBVyxJQUFXLEVBQVksRUFDMUQsRUFBZ0IsU0FBUyxFQUFZLEVBQ25DLEVBQ0EsQ0FBQyxHQUFjLEdBQUcsQ0FBZSxFQUNoQyxDQUNULENBRUEsU0FBUyxHQUFVLEVBQXlCLENBQzFDLElBQU0sRUFBaUIsRUFBUSxLQUFLLEVBQ3BDLE9BQU8sRUFBaUIsRUFBaUI7RUFBTyxFQUNsRCxDQy9GQSxNQUFNLEdBQWEsQ0FDakIsZ0JBQWlCLENBQ2YsYUFBYyxHQUNkLHlCQUEwQixHQUMxQiw2QkFBOEIsR0FDOUIsZ0JBQWlCLEdBQ2pCLGtCQUFtQixHQUNuQixjQUFlLEdBQ2YsT0FBUSxFQUNWLEVBQ0EsUUFBUyxDQUFDLGVBQWUsRUFPekIsUUFBUyxDQUFDLGNBQWUsZUFBZ0IsV0FBWSxXQUFXLENBQ2xFLEVBRUEsZUFBc0IsR0FBaUIsRUFBc0MsQ0FDM0UsT0FBTyxFQUFPLDBCQUEwQixtQkFBb0IsU0FBWSxDQUd0RSxHQUFJLEVBQU8sVUFBVSxPQUFTLEVBQU8sVUFBVSxNQUFRLEVBQU8sVUFBVSxPQUFRLENBQzlFLE1BQU0sR0FBMkIsQ0FBTSxFQUN2QyxNQUNGLENBRUEsSUFBSSxFQUFlLEVBQU8sT0FBUyxHQUFpQixDQUFNLEVBQUksZ0JBQWdCLEVBQVUsRUFDbEYsRUFBaUIsR0FBa0IsQ0FBTSxFQUMvQyxFQUFZLFFBQVUsR0FBbUIsQ0FBTSxFQUMvQyxFQUFZLGtCQUFvQixDQUFDLEVBQ2pDLEVBQVksZ0JBQWdCLFFBQVUsR0FBVyxDQUFNLEVBQ25ELEVBQWUsT0FBUyxJQUMxQixFQUFZLGdCQUFrQixDQUFFLEdBQUcsRUFBWSxnQkFBaUIsTUFBTyxDQUFlLEdBRXBGLENBQUMsRUFBTyxxQkFBdUIsQ0FBQyxFQUFPLCtCQUN6QyxPQUFPLEVBQVksaUJBQWlCLElBRWxDLEVBQU8sVUFBVSxRQUduQixHQUFlLEVBQWEsYUFBYSxFQUczQyxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEVBQ3ZELEVBQWtCLE1BQU0sRUFBTyxpQkFBaUIsQ0FBUSxFQUMxRCxFQUVKLEdBQUksSUFBb0IsSUFBQSxJQUFhLENBQUMsRUFBVSxhQUFhLENBQWUsRUFBRyxDQUM3RSxJQUFNLEVBQWMsRUFBVSx5QkFBdUMsQ0FBZSxFQUdwRixHQUFJLENBQUMsRUFBYSxDQUNoQixRQUFRLEtBQUssc0JBQXNCLEVBQVMsd0RBQXdELEVBQ3BHLE1BQ0YsQ0FDQSxFQUF1QixLQUFLLFVBQVUsRUFBUyxnQkFBZ0IsQ0FBVyxDQUFDLENBQUMsRUFDNUUsSUFBTSxFQUFnQixHQUFxQixFQUFZLGlCQUFpQixLQUFLLEVBQ3ZFLEVBQXVCLEdBQXlCLEVBQVksZUFBZSxFQUNqRixFQUFZLFFBQVUsR0FBcUIsRUFBWSxRQUFTLEVBQVksT0FBTyxFQUNuRixPQUFPLEVBQVksUUFDbkIsT0FBTyxFQUFZLGlCQUFpQixJQUNoQyxFQUFPLFFBQ1QsR0FBbUMsRUFBUSxFQUFhLENBQVcsRUFFckUsRUFBYyxFQUFNLElBQUksQ0FBQyxFQUFhLEVBQWEsQ0FBVyxFQUFHLENBQUUsV0FBWSxFQUFhLENBQUMsRUFDN0YsRUFBWSxRQUFVLEVBQVksU0FBUyxPQUN4QyxHQUNDLENBQUMsRUFBUSxTQUFTLFFBQVEsR0FBSyxDQUFDLEVBQVEsU0FBUyxZQUFZLEdBQUssQ0FBQyxFQUFRLFNBQVMsUUFBUSxDQUNoRyxFQUNBLEVBQVksa0JBQW9CLENBQUMsRUFPakMsRUFBWSxnQkFBa0IsQ0FBRSxHQUFHLEVBQVksZ0JBQWlCLEdBQUcsQ0FBcUIsRUFFeEYsSUFBTSxFQUFjLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQW9CLEVBQWUsQ0FBYyxFQUFHLEdBQUcsQ0FBYyxDQUFDLENBQUMsRUFDdkcsRUFBWSxPQUFTLEVBQ3ZCLEVBQVksZ0JBQWdCLE1BQVEsRUFFcEMsT0FBTyxFQUFZLGdCQUFnQixNQUVqQyxHQUFzQixDQUFjLEdBQ3RDLE9BQU8sRUFBWSxnQkFBZ0IsU0FFdkMsQ0FlQSxHQWRBLEdBQTBCLEVBQWEsQ0FBTSxFQUM3QyxFQUFTLENBQVcsRUFDcEIsRUFBWSxTQUFTLEtBQUssRUFFMUIsT0FBTyxFQUFZLGlCQUFpQix1QkFJcEMsT0FBTyxFQUFZLGlCQUFpQixRQUNoQyxFQUFPLFVBQVUsYUFDbkIsT0FBTyxFQUFZLGlCQUFpQixxQkFJbEMsSUFBeUIsS0FBSyxVQUFVLENBQVcsRUFBRyxPQUMxRCxJQUFNLEVBQWEsS0FBSyxVQUFVLEVBQWEsSUFBQSxHQUFXLENBQUMsRUFDM0QsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQU9BLFNBQVMsR0FBaUIsRUFBcUMsQ0FDN0QsSUFBTSxFQUFvQixFQUFPLDJCQUM3QixHQUF3QixDQUFNLEVBQzlCLENBQUUsU0FBVSxDQUFDLEVBQUcsU0FBVSxDQUFDLENBQUUsRUFDM0IsRUFBVyxnQkFBZ0IsRUFBVSxFQTRCM0MsTUEzQkEsR0FBUyxRQUFVLENBQ2pCLEdBQUcsSUFBSSxJQUFJLENBQ1QsR0FBRyxFQUFrQixTQUFTLElBQUssR0FBcUIsR0FBRyxFQUFpQixlQUFlLEVBSzNGLEdBQUcsRUFBa0IsU0FPckIsR0FBRyxHQUFpQyxDQUFNLEVBQzFDLEdBQUksRUFBUyxTQUFXLENBQUMsQ0FDM0IsQ0FBQyxDQUNILENBQUMsQ0FBQyxTQUFTLEVBQ1gsRUFBUyxRQUFVLENBQ2pCLEdBQUksRUFBUyxTQUFXLENBQUMsRUFDekIsR0FBRyxFQUFrQixTQUFTLFFBQVMsR0FBcUIsQ0FDMUQsR0FBRyxFQUFpQixjQUNwQixHQUFHLEVBQWlCLGVBQ3BCLEdBQUcsRUFBaUIsV0FDcEIsR0FBRyxFQUFpQixXQUN0QixDQUFDLENBQ0gsRUFDTyxDQUNULENBS0EsTUFBTSxHQUEyQixDQUFDLFFBQVMsT0FBUSxRQUFRLEVBSXJELEdBQXVCLENBQUMsTUFBTyxTQUFTLEVBRzlDLFNBQVMsR0FBaUMsRUFBaUMsQ0FDekUsR0FBSSxDQUFDLEVBQU8sMkJBQTRCLE1BQU8sQ0FBQyxFQUNoRCxJQUFNLEVBQXFCLENBQUMsRUFDNUIsSUFBSyxJQUFNLEtBQW9CLEdBQXdCLENBQU0sRUFDdEQsTUFBbUIsRUFBSyxRQUFRLEVBQWtCLGNBQWMsQ0FBQyxFQUN0RSxJQUFLLElBQU0sS0FBYyxHQUFzQixDQUM3QyxJQUFNLEVBQWEsRUFBSyxRQUFRLEVBQWtCLENBQVUsRUFDeEQsRUFBRyxXQUFXLENBQVUsR0FBRyxFQUFTLEtBQUssRUFBSyxTQUFTLEVBQU8sUUFBUyxDQUFVLENBQUMsQ0FBQyxXQUFXLEtBQU0sR0FBRyxDQUFDLENBQzlHLENBRUYsT0FBTyxDQUNULENBRUEsU0FBUyxHQUFtQixFQUErQixDQUN6RCxJQUFJLEVBQ0osR0FBSSxDQUNGLEVBQVcsS0FBSyxNQUFNLEVBQUcsYUFBYSxFQUFjLE1BQU0sQ0FBQyxDQUM3RCxNQUFRLENBQ04sTUFBTyxFQUNULENBR0EsR0FBSSxDQUFDLEdBQVksT0FBTyxHQUFhLFNBQVUsTUFBTyxHQUN0RCxJQUFNLEVBQWUsQ0FBRSxHQUFHLEVBQVMsYUFBYyxHQUFHLEVBQVMsZUFBZ0IsRUFDN0UsT0FBTyxHQUF5QixLQUFNLEdBQW1CLEVBQWEsRUFBZSxDQUN2RixDQUVBLE1BQU0sR0FBa0MsQ0FBQyxjQUFlLGVBQWdCLFdBQVksV0FBVyxFQVMvRixTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ00sQ0FDTixJQUFNLEVBQWdCLElBQUksSUFDMUIsR0FBSSxNQUFNLFFBQVEsRUFBWSxPQUFPLEVBQUcsQ0FDdEMsSUFBTSxFQUFhLEVBQVksUUFBUSxPQUFRLEdBQTJCLE9BQU8sR0FBVSxRQUFRLEVBQzdGLEVBQW1CLElBQUksSUFBSSxFQUFZLE9BQU8sRUFDcEQsSUFBSyxJQUFNLEtBQVMsRUFBWSxDQUM5QixJQUFNLEVBQWtCLEdBQTBCLENBQUssRUFDdkQsR0FBSSxJQUFvQixJQUFBLElBQWEsRUFBYyxJQUFJLENBQWUsRUFBRyxTQUN6RSxJQUFNLEVBQWEsR0FBZ0MsTUFBTyxHQUN4RCxFQUFXLFNBQVMsR0FBRyxFQUFnQixHQUFHLEdBQVEsQ0FDcEQsRUFDTSxFQUFtQixHQUFnQyxLQUFNLEdBQzdELEVBQWlCLElBQUksR0FBRyxFQUFnQixHQUFHLEdBQVEsQ0FDckQsRUFDSSxHQUFjLENBQUMsR0FBa0IsRUFBYyxJQUFJLENBQWUsQ0FDeEUsQ0FDSSxFQUFjLEtBQU8sSUFDdkIsRUFBWSxRQUFVLEVBQVksUUFBUSxPQUFRLEdBQVUsQ0FDMUQsSUFBTSxFQUFrQixPQUFPLEdBQVUsU0FBVyxHQUEwQixDQUFLLEVBQUksSUFBQSxHQUN2RixPQUFPLElBQW9CLElBQUEsSUFBYSxDQUFDLEVBQWMsSUFBSSxDQUFlLENBQzVFLENBQUMsRUFFTCxDQUNBLEdBQUksQ0FBQyxNQUFNLFFBQVEsRUFBWSxPQUFPLEVBQUcsT0FDekMsSUFBTSxFQUFtQixJQUFJLElBQUksRUFBWSxPQUFPLEVBQzlDLEVBQW9CLEVBQU8sMkJBQzdCLEdBQXdCLENBQU0sQ0FBQyxDQUFDLElBQUssR0FDbkMsRUFBSyxTQUFTLEVBQUssUUFBUSxFQUFPLE9BQU8sRUFBRyxDQUFnQixDQUFDLENBQUMsV0FBVyxLQUFNLEdBQUcsQ0FDcEYsRUFDQSxDQUFDLEVBQ0wsRUFBWSxRQUFVLEVBQVksUUFBUSxPQUFRLEdBQzVDLE9BQU8sR0FBVSxVQUFZLEVBQWlCLElBQUksQ0FBSyxFQUFVLEdBQ2pFLEVBQU0sU0FBUyxnQkFBZ0IsRUFDMUIsQ0FBQyxFQUFjLElBQUksRUFBTSxNQUFNLEVBQUcsR0FBd0IsQ0FBQyxFQU1wRSxDQUNFLEdBQXFCLEtBQ2xCLEdBQWUsRUFBTSxTQUFTLElBQUksR0FBWSxHQUFLLEVBQWMsSUFBSSxFQUFNLE1BQU0sRUFBRyxFQUFFLEVBQVcsT0FBUyxFQUFFLENBQUMsQ0FDaEgsR0FJSyxDQUFDLEdBQW1CLEVBQU8sQ0FBaUIsQ0FDcEQsQ0FDSCxDQVFBLFNBQVMsR0FBbUIsRUFBZSxFQUErQyxDQUN4RixHQUFJLEVBQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRyxNQUFPLEdBQzVDLElBQU0sRUFBYyxFQUNqQixNQUFNLEdBQUcsQ0FBQyxDQUNWLElBQUssR0FDSixFQUNHLFdBQVcscUJBQXNCLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FDakQsV0FBVyxJQUFLLE9BQU8sQ0FBQyxDQUN4QixXQUFXLElBQUssTUFBTSxDQUMzQixDQUFDLENBQ0EsS0FBSyxHQUFHLEVBQ0wsRUFBbUIsT0FBTyxJQUFJLEVBQVksV0FBWSxHQUFHLEVBQy9ELE9BQU8sRUFBa0IsS0FDdEIsR0FBcUIsRUFBYSxLQUFLLENBQWdCLEdBQUssRUFBTSxXQUFXLEdBQUcsRUFBaUIsRUFBRSxDQUN0RyxDQUNGLENBRUEsU0FBUyxHQUEwQixFQUFtQyxDQUNwRSxJQUFNLEVBQWdCLEdBQWdDLEtBQU0sR0FBVyxFQUFNLFNBQVMsSUFBSSxHQUFRLENBQUMsRUFDbkcsR0FBSSxDQUFDLEVBQWUsT0FDcEIsSUFBTSxFQUFrQixFQUFNLE1BQU0sRUFBRyxFQUFFLEVBQWMsT0FBUyxFQUFFLEVBQ2xFLE9BQU8sSUFBb0IsR0FBSyxJQUFBLEdBQVksQ0FDOUMsQ0FFQSxlQUFlLEdBQTJCLEVBQXNDLENBRzlFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGVBQWUsRUFDdkQsRUFBa0IsTUFBTSxFQUFPLGlCQUFpQixDQUFRLEVBQzlELEdBQUksSUFBb0IsSUFBQSxJQUFhLEVBQVUsYUFBYSxDQUFlLEVBQUcsT0FDOUUsSUFBTSxFQUFXLEVBQVUseUJBQXVDLENBQWUsRUFDakYsR0FBSSxDQUFDLEVBQVUsQ0FDYixRQUFRLEtBQUssdUJBQXVCLEVBQVMsd0RBQXdELEVBQ3JHLE1BQ0YsQ0FDQSxJQUFNLEVBQXVCLEtBQUssVUFBVSxDQUFRLEVBQ3BELEdBQW9DLENBQVEsRUFDNUMsR0FBaUMsRUFBUyxlQUFlLEVBQ3pELEdBQXFDLENBQVEsRUFDN0MsR0FBMEIsRUFBVSxDQUFNLEVBR3RDLEtBQUssVUFBVSxDQUFRLElBQU0sR0FDakMsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsS0FBSyxVQUFVLEVBQVUsSUFBQSxHQUFXLENBQUMsQ0FBQyxDQUFDLENBQ25HLENBUUEsU0FBUyxHQUEwQixFQUF3QixFQUE2QixDQUt0RixJQUFNLEVBQVEsRUFBUyxpQkFBaUIsTUFDeEMsR0FBSSxFQUFRLENBQUMsRUFBTSxTQUFTLEtBQUssRUFBSSxFQUFPLFVBQVUsWUFBYSxPQUNuRSxJQUFNLEVBQWlCLEdBQUcsR0FBVyxDQUFNLEVBQUUsdUNBQ3ZDLEVBQWtCLEVBQVMsaUJBQWlCLFFBQVEsZ0JBQzFELEdBQUksRUFBaUIsQ0FJakIsRUFBZ0IsU0FBVyxHQUMzQixPQUFPLEVBQWdCLElBQU8sVUFDOUIscURBQXFELEtBQUssRUFBZ0IsRUFBRSxJQUU1RSxFQUFTLGdCQUFpQixNQUFPLGdCQUFrQixDQUFDLENBQWMsR0FFcEUsTUFDRixDQUVBLEVBQVMsa0JBQW9CLENBQUMsRUFDOUIsRUFBUyxnQkFBZ0IsTUFBUSxDQUMvQixHQUFHLEVBQVMsZ0JBQWdCLE1BQzVCLGVBQWdCLENBQUMsQ0FBYyxDQUNqQyxDQUNGLENBRUEsU0FBUyxHQUFxQyxFQUE4QixDQUdyRSxFQUFTLFVBQ1YsRUFBUyxRQUFRLFNBQVMsY0FBYyxJQUU1QyxFQUFTLFFBQVEsS0FBSyxjQUFjLEVBQ3BDLEVBQVMsUUFBUSxLQUFLLEdBQ3hCLENBRUEsU0FBUyxHQUFvQyxFQUE4QixDQUN6RSxJQUFNLEVBQWtCLEVBQVMsZ0JBQ2pDLEdBQUksQ0FBQyxFQUFpQixPQUN0QixJQUFNLEVBQW1CLEdBQWlCLEVBQWdCLGdCQUFnQixHQUN0RSxJQUFxQixRQUFVLElBQXFCLFVBQVksSUFBcUIsSUFBQSxNQUNuRixFQUFTLFFBR1gsT0FBTyxFQUFnQixpQkFJdkIsRUFBZ0IsaUJBQW1CLFVBR3pDLENBRUEsU0FBUyxHQUFpQyxFQUFpRSxDQUNwRyxPQUtMLE9BQU8sRUFBZ0IsUUFDbEIsRUFBZ0IsT0FFckIsSUFBSyxHQUFNLENBQUMsRUFBTyxLQUFZLE9BQU8sUUFBUSxFQUFnQixLQUFLLEVBQ2pFLEVBQWdCLE1BQU0sR0FBUyxHQUEwQixDQUFPLENBRXBFLENBRUEsU0FBUyxHQUEwQixFQUE2QixDQUM5RCxPQUFPLEVBQVEsSUFBSyxHQUNkLEVBQU8sV0FBVyxJQUFJLEdBQUssRUFBTyxXQUFXLEtBQUssR0FBSyxFQUFLLFdBQVcsQ0FBTSxFQUFVLEVBQ3BGLEtBQUssR0FDYixDQUNILENBRUEsU0FBUyxHQUFXLEVBQStCLENBQ2pELEdBQUksRUFBTyxPQUFRLE1BQU8sSUFPMUIsSUFBTSxFQUFVLEVBQUssUUFBUSxFQUFPLE9BQU8sRUFDdkMsRUFDSixJQUFLLElBQUksRUFBa0IsRUFBSyxRQUFRLENBQU8sR0FBSyxFQUFrQixFQUFLLFFBQVEsQ0FBZSxFQUFHLENBQ25HLElBQU0sRUFBZSxFQUFLLFFBQVEsRUFBaUIsY0FBYyxFQUNqRSxHQUFJLEVBQUcsV0FBVyxDQUFZLEVBQUcsQ0FDL0IsSUFBZ0IsRUFDaEIsR0FBSSxDQUdGLEdBQUksR0FGYSxLQUFLLE1BQU0sRUFBRyxhQUFhLEVBQWMsTUFBTSxDQUVyQixDQUFBLENBQVMsVUFBVSxDQUFDLENBQUMsT0FBUyxFQUFHLENBQzFFLEVBQWMsRUFDZCxLQUNGLENBQ0YsTUFBUSxDQUVSLENBQ0YsQ0FDQSxJQUFNLEVBQWlCLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBaUIsTUFBTSxDQUFDLEVBQ3BFLEVBQW1CLElBQW9CLEVBQUssUUFBUSxDQUFlLEVBQ3pFLEdBQUksR0FBa0IsRUFBa0IsS0FDMUMsQ0FFQSxPQURLLEdBQ0UsRUFBSyxTQUFTLEVBQVMsQ0FBVyxDQUFDLENBQUMsV0FBVyxLQUFNLEdBQUcsR0FEdEMsR0FFM0IsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUN5QixDQUN6QixJQUFNLEVBQWdCLENBQUMsR0FBRyxHQUFpQixDQUFnQixFQUFHLEdBQUcsR0FBaUIsQ0FBZSxDQUFDLEVBQzVGLEVBQWdCLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBYSxDQUFDLEVBQzVDLEtBQWMsU0FBVyxFQUU3QixPQURJLEVBQWMsU0FBVyxFQUFVLEVBQWMsR0FDOUMsQ0FDVCxDQUVBLFNBQVMsR0FBZSxFQUF3QixFQUF1QixDQUNyRSxFQUFTLFVBQVksQ0FBQyxFQUNqQixFQUFTLFFBQVEsU0FBUyxDQUFPLEdBQ3BDLEVBQVMsUUFBUSxLQUFLLENBQU8sQ0FFakMsQ0FFQSxTQUFTLEdBQWlCLEVBQTBDLENBRWxFLE9BREssRUFDRSxNQUFNLFFBQVEsQ0FBSyxFQUFJLEVBQVEsQ0FBQyxDQUFLLEVBRHpCLENBQUMsQ0FFdEIsQ0FFQSxTQUFTLEdBQXFCLEVBQTBCLENBR3RELE9BRkksT0FBTyxHQUFVLFNBQWlCLENBQUMsQ0FBSyxFQUN2QyxNQUFNLFFBQVEsQ0FBSyxFQUNqQixFQUFNLE9BQVEsR0FBeUIsT0FBTyxHQUFTLFFBQVEsRUFEcEMsQ0FBQyxDQUVyQyxDQUVBLFNBQVMsR0FBc0IsRUFBOEIsQ0FHM0QsT0FBTyxFQUFVLEtBQU0sR0FBYSxJQUFhLFdBQWEsRUFBUyxTQUFTLEdBQUcsQ0FBQyxDQUN0RixDQUVBLFNBQVMsR0FBb0IsRUFBeUIsRUFBb0MsQ0FDeEYsSUFBTSxFQUFtQixJQUFJLElBQUksQ0FBYyxFQUMvQyxPQUFPLEVBQWMsT0FBUSxHQUkzQixFQUFJLEdBQTBCLENBQVEsR0FBSyxDQUFDLEVBQWlCLElBQUksQ0FBUSxFQUUxRSxDQUNILENBRUEsU0FBUyxHQUEwQixFQUEyQixDQUM1RCxPQUFPLElBQWEsV0FBYSxJQUFhLFFBQVUsSUFBYSxTQUFXLElBQWEsZ0JBQy9GLENBRUEsU0FBUyxHQUFpQixFQUFvQyxDQUM1RCxPQUFPLE9BQU8sR0FBVSxTQUFXLEVBQU0sWUFBWSxFQUFJLElBQUEsRUFDM0QsQ0FFQSxTQUFTLEdBQ1AsRUFDb0csQ0FDcEcsSUFBTSxFQUFjLENBQUMsRUFJckIsSUFBSyxJQUFNLElBQU8sQ0FBQyxjQUFlLGlCQUFrQixXQUFXLEVBQVksQ0FDekUsSUFBTSxFQUFRLElBQWtCLEdBQzVCLElBQVUsSUFBQSxLQUNaLEVBQVksR0FBTyxFQUV2QixDQUNBLE9BQU8sQ0FDVCxDQUVBLFNBQVMsR0FBa0IsRUFBaUMsQ0FDMUQsSUFBTSxFQUFZLElBQUksSUFDaEIsRUFBZSxDQUNuQixHQUFHLEVBQU8sYUFBYSxhQUN2QixHQUFHLEVBQU8sYUFBYSxlQUN6QixFQXdCQSxPQXJCSyxFQUFPLFVBQVUsYUFDcEIsRUFBVSxJQUFJLEtBQUssR0FHbkIsRUFBYSxNQUNiLEVBQWEsa0JBQ2IsRUFBYSwyQkFDYixFQUFhLGFBRWIsRUFBVSxJQUFJLE1BQU0sRUFFbEIsRUFBYSxRQUNmLEVBQVUsSUFBSSxnQkFBZ0IsRUFFNUIsRUFBYSxPQUNmLEVBQVUsSUFBSSxPQUFPLEVBRW5CLEVBQWEsU0FDZixFQUFVLElBQUksU0FBUyxFQUdsQixDQUFDLEdBQUcsQ0FBUyxDQUN0QixDQ2hoQkEsTUFBTSxHQUFzQixDQUMxQixxQkFDQSwyQkFDQSxxQkFDQSxZQUNBLGFBQ0EsWUFDRixFQUVBLGVBQXNCLEdBQXVCLEVBQXNDLENBQ2pGLE9BQU8sRUFBTywwQkFBMEIseUJBQTBCLFNBQVksQ0FDNUUsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsVUFBVyxlQUFlLEVBQ2xFLEVBQWtCLE1BQU0sRUFBTyxpQkFBaUIsQ0FBUSxFQUM5RCxHQUFJLElBQW9CLElBQUEsSUFBYSxFQUFVLGFBQWEsQ0FBZSxFQUFHLE9BRzlFLElBQU0sRUFBaUIsRUFBVSx5QkFBaUMsQ0FBZSxFQUNqRixHQUFJLENBQUMsRUFBZ0IsQ0FDbkIsUUFBUSxLQUFLLG9CQUFvQixFQUFTLHdEQUF3RCxFQUNsRyxNQUNGLENBQ0EsSUFBTSxFQUF1QixLQUFLLFVBQVUsRUFBUyxnQkFBZ0IsQ0FBYyxDQUE0QixDQUFDLEVBQzVHLEVBQVcsRUFDZixJQUFLLElBQU0sS0FBc0IsR0FDL0IsRUFBVyxFQUFNLElBQUksQ0FBQyxFQUFVLEdBQWUsQ0FBa0IsQ0FBQyxDQUFDLEVBV3JFLElBVEksRUFBTyx1QkFBeUIsRUFBTyxxQkFDekMsRUFBVyxFQUFNLElBQUksQ0FBQyxFQUFVLEdBQWUsYUFBYSxDQUFDLENBQUMsR0FFNUQsRUFBTyxVQUFVLE9BQ25CLEVBQVcsRUFBTSxJQUFJLENBQUMsRUFBVSxHQUFlLGFBQWEsQ0FBQyxDQUFDLEdBRWhFLEVBQVMsQ0FBbUMsRUFHeEMsS0FBSyxVQUFVLENBQVEsSUFBTSxFQUFzQixPQUN2RCxJQUFNLEVBQWEsS0FBSyxVQUFVLEVBQVUsSUFBQSxHQUFXLENBQUMsRUFDeEQsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBZSxFQUFvQyxDQUMxRCxNQUFPLENBQ0wsdUJBQXdCLEVBQ3JCLEdBQXFCLEVBQ3hCLENBQ0YsQ0FDRixDQzVDQSxNQUFNLEdBQWEsQ0FBQyxjQUFlLE9BQVEsVUFBVyxZQUFZLEVBUWxFLGVBQXNCLEdBQXVCLEVBQTJCLEVBQTRDLENBQ2xILE9BQU8sRUFBTywwQkFBMEIseUJBQTBCLFNBQVksQ0FDNUUsSUFBTSxFQUFrQixFQUFXLEtBQU0sR0FBVyxHQUF3QixDQUFNLENBQUMsRUFDN0UsRUFBZSxFQUFLLFFBQVEsRUFBVyxRQUFTLFdBQVcsRUFJakUsR0FBSSxDQUFFLE1BQU0sRUFBRyxTQUFTLE1BQU0sQ0FBWSxDQUFDLENBQUMsVUFBWSxDQUFDLENBQUMsRUFBSSxPQUM5RCxJQUFNLEVBQVUsTUFBTSxFQUFPLHlCQUF5QixDQUFZLEVBQ2xFLEdBQUksSUFBWSxJQUFBLEdBQVcsT0FDM0IsSUFBTSxFQUFpQixHQUF3QixFQUFTLENBQWUsRUFDbkUsSUFBbUIsSUFBQSxJQUFhLElBQW1CLEdBQ3JELE1BQU0sRUFBTyxhQUFhLEVBQWMsQ0FBYyxDQUUxRCxDQUFDLENBQ0gsQ0FPQSxTQUFTLEdBQXdCLEVBQWdDLENBQy9ELE1BQU8sQ0FBQyxlQUFnQixrQkFBbUIsdUJBQXdCLGtCQUFrQixDQUFDLENBQUMsS0FBTSxHQUFZLENBQ3ZHLElBQU0sRUFBZSxFQUFPLGNBQWMsR0FDMUMsTUFBTyxDQUFDLENBQUMsR0FBZSxNQUFXLENBQUMsQ0FBQyxHQUFlLE1BQ3RELENBQUMsQ0FDSCxDQVNBLFNBQWdCLEdBQXdCLEVBQWlCLEVBQThDLENBQ3JHLElBQUksRUFDSixHQUFJLENBQ0YsRUFBVyxJQUFJLEtBQUssTUFBTSxDQUFPLENBQ25DLE1BQVEsQ0FDTixRQUFRLEtBQUssNkVBQTZFLEVBQzFGLE1BQ0YsQ0FFQSxJQUFNLEVBQVcsRUFBa0IsQ0FBQyxTQUFVLG9CQUFvQixFQUFJLENBQUMsUUFBUSxFQUMzRSxFQUFpQixFQUNyQixJQUFLLElBQU0sS0FBUSxHQUFZLENBRTdCLEdBQUksSUFBUyxXQUFhLENBQUMsRUFBUyxVQUFVLFFBQVMsU0FDdkQsSUFBTSxFQUFjLElBQVMsY0FBZ0IsRUFBUyxRQUFVLEVBQVMsV0FBVyxFQUFLLEVBQUUsUUFDM0YsSUFBSyxJQUFNLEtBQVcsRUFBVSxDQUM5QixJQUFNLEVBQVUsSUFBYyxHQUc5QixHQUEyQixFQUR6QixPQUFPLEdBQVksU0FBVyxFQUFXLEdBQStDLFFBQ3hDLENBQUksQ0FDeEQsQ0FDQSxJQUFNLEVBQWUsRUFDbEIsT0FBUSxHQUFZLElBQWMsS0FBYSxJQUFBLEVBQVMsQ0FBQyxDQUN6RCxJQUFLLEdBQVksR0FBRyxFQUFRLGtCQUFrQixFQUFLLElBQUksRUFDdEQsRUFBYSxTQUFXLElBQzVCLEVBQWlCLEdBQ2YsRUFDQSxJQUFTLGNBQWdCLFVBQVksWUFBWSxFQUFLLFVBQ3RELENBQ0YsRUFDRixDQUNBLEdBQUksSUFBbUIsRUFBUyxPQUFPLEVBSXZDLEdBQUksQ0FDRixJQUFNLEVBQWtCLElBQUksS0FBSyxNQUFNLENBQWMsRUFDckQsSUFBSyxJQUFNLEtBQVEsR0FBWSxDQUM3QixHQUFJLElBQVMsV0FBYSxDQUFDLEVBQVMsVUFBVSxRQUFTLFNBQ3ZELElBQU0sRUFBYyxJQUFTLGNBQWdCLEVBQWdCLFFBQVUsRUFBZ0IsV0FBVyxFQUFLLEVBQUUsUUFDekcsR0FBSSxFQUFTLEtBQU0sR0FBWSxJQUFjLEtBQWEsSUFBQSxFQUFTLEVBQ2pFLE1BQVUsTUFBTSxnQkFBZ0IsRUFBSyw2QkFBNkIsQ0FFdEUsQ0FDRixPQUFTLEVBQU8sQ0FDZCxRQUFRLEtBQUssbURBQW9ELEVBQWdCLFFBQVEsRUFBRSxFQUMzRixNQUNGLENBQ0EsT0FBTyxDQUNULENBU0EsU0FBUyxHQUEyQixFQUFpQixFQUFnQixFQUF1QixDQUV0RixVQUFPLEdBQVUsVUFBWSxJQUFVLElBQU0sSUFBVSxHQUl2RCxHQUFNLFNBQVMsSUFBSSxFQUN2QixJQUFJLElBQVkscUJBQXNCLENBQ3BDLFFBQVEsS0FDTixHQUFHLEVBQVEsb0JBQW9CLEVBQU0sbUJBQW1CLEVBQUssWUFBWSxFQUFLLDBGQUNoRixFQUNBLE1BQ0YsQ0FDQSxRQUFRLEtBQ04sR0FBRyxFQUFRLG9CQUFvQixFQUFNLG1CQUFtQixFQUFLLFlBQVksRUFBSyxzRUFDaEYsQ0FIQSxDQUlGLENBTUEsU0FBUyxHQUFzQixFQUFpQixFQUFxQixFQUFpQyxDQUVwRyxJQUFNLEVBQWdCLElBQUksT0FBTyxPQUFPLEdBQUcsU0FBUyxFQUFZLFdBQVcsSUFBSyxPQUFPLEdBQUcsSUFBSSxFQUFFLGdCQUFpQixHQUFHLEVBQzlHLEVBQVEsRUFBUSxNQUFNO0NBQUksRUFDMUIsRUFBYyxFQUFNLFVBQVcsR0FBUyxFQUFjLEtBQUssQ0FBSSxDQUFDLEVBSXRFLE9BSEksSUFBZ0IsR0FDWCxHQUFHLEVBQVEsUUFBUSxFQUFFLE9BQU8sRUFBWSxLQUFLLEVBQWMsS0FBSztDQUFJLEVBQUUsSUFFeEUsQ0FBQyxHQUFHLEVBQU0sTUFBTSxFQUFHLEVBQWMsQ0FBQyxFQUFHLEdBQUcsRUFBZSxHQUFHLEVBQU0sTUFBTSxFQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztDQUFJLENBQzFHLENDM0hBLE1BR00sR0FBaUIsMEJBQ2pCLEdBQWEseUJBa0JiLEdBQXNDLENBQzFDLHVCQUF3QixzQ0FDeEIsbUJBQW9CLEVBQ3RCLEVBd0JBLGVBQXNCLEdBQ3BCLEVBQ0EsRUFBcUMsQ0FBQyxDQUFVLEVBQ2pDLENBQ2YsT0FBTyxFQUFPLDBCQUEwQixpQ0FBa0MsU0FBWSxDQUNwRixJQUFNLEVBQWdCLEVBQUssUUFBUSxFQUFXLFFBQVMsVUFBVyxXQUFXLEVBQzdFLEdBQUksQ0FBRSxNQUFNLEVBQU8sdUJBQXVCLENBQWEsRUFBSSxDQUN6RCxRQUFRLEtBQUssd0NBQXdDLEVBQWMsa0NBQWtDLEVBQ3JHLE1BQ0YsQ0FDQSxNQUFNLEVBQUcsU0FBUyxNQUFNLEVBQWUsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUUxRCxJQUFNLEVBQVcsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFXLFFBQVMsV0FBVyxDQUFDLEVBQ3RFLEVBQStDLENBQ25ELFdBQVksR0FBa0IsRUFBWSxFQUFtQixDQUFRLEVBQ3JFLGtCQUFtQixHQUF3QixDQUM3QyxFQUtNLEVBQVUsRUFBVyxhQUFhLFNBQVcsQ0FBQyxFQUM5QyxFQUE4QixHQUFpQixFQUFRLE1BQVMsRUFDbEUsSUFDRixFQUFtQix5QkFBMkIsR0FBb0IsYUFBYyxTQUFVLENBQVEsR0FFaEcsR0FBaUIsRUFBUSxpQkFBaUIsSUFDNUMsRUFBbUIsc0JBQXdCLEdBQW9CLFVBQVcsaUJBQWtCLENBQVEsR0FFbEcsRUFBVyxVQUFVLGlCQUFtQixFQUFXLFFBQVEsU0FBUyxPQUFTLElBQy9FLEVBQW1CLGVBQWlCLEdBQXFCLEVBQVksRUFBNkIsQ0FBUSxHQUU1RyxJQUFLLEdBQU0sQ0FBQyxFQUFVLEtBQWEsT0FBTyxRQUFRLENBQWtCLEVBQ2xFLE1BQU0sRUFBWSxRQUFVLEdBQTJCLEVBQUssS0FBSyxFQUFlLENBQVEsRUFBRyxDQUFRLENBQUMsQ0FFeEcsQ0FBQyxDQUNILENBRUEsZUFBZSxHQUEyQixFQUFrQixFQUFtQyxDQUM3RixJQUFNLEVBQWEsTUFBTSxFQUFPLGlCQUFpQixDQUFRLEVBS3pELEdBQUksSUFBZSxJQUFBLElBQWEsRUFBVyxLQUFLLElBQU0sSUFBTSxDQUFDLEVBQVcsV0FBQSxzQkFBc0MsRUFDNUcsT0FHRixJQUNNLEVBQVcsRUFBSyxLQUFLLEVBQVUsQ0FBRSxVQUFXLEVBQUcsQ0FBQyxFQUN0RCxNQUFNLEVBQU8sa0JBQWtCLEVBQVU7RUFBUyxDQUFRLENBQzVELENBRUEsU0FBUyxHQUFXLEVBQWtELENBQ3BFLE9BQU8sRUFBVSxDQUFFLG9CQUFxQixDQUFRLEVBQUksQ0FBQyxDQUN2RCxDQUVBLFNBQVMsR0FBaUIsRUFBMEIsQ0FDbEQsT0FBTyxPQUFPLEdBQVcsVUFBWSxpQkFBaUIsS0FBSyxDQUFNLENBQ25FLENBRUEsU0FBUyxHQUFrQixFQUF1QixFQUFvQyxFQUE2QixDQU9qSCxJQUFNLEVBQXFCLENBQUMsR0FBRyxDQUFpQixDQUFDLENBQzlDLFVBQVUsRUFBRyxJQUFNLEVBQUUsUUFBUSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FDdEQsT0FBUSxHQUFrQixFQUFjLFVBQVUsY0FBYyxDQUFDLENBQ2pFLElBQUssR0FBa0IsRUFBSyxTQUFTLEVBQU8sUUFBUyxFQUFjLE9BQU8sQ0FBQyxFQUN4RSxFQUFlLEVBQU8sdUJBQXlCLEVBQU8sZ0NBR3RELEVBQTZCLEVBQVcsQ0FBRSxJQUFLLENBQUUsYUFBYyw2QkFBOEIsQ0FBRSxFQUFJLENBQUMsRUFFcEcsRUFBZ0IsQ0FDcEIsQ0FBRSxLQUFNLEVBQWUsRUFDdkIsQ0FBRSxLQUFNLEVBQVcsRUFDbkIsR0FBRyxHQUFrQixFQUFJLEVBQ3pCLEdBQUksRUFBbUIsT0FBUyxFQUMzQixDQUNDLEdBQUcsRUFBbUIsS0FBSyxFQUFTLEtBQWlCLENBQ25ELEtBQU0seUJBQXlCLEVBQVUsS0FBSyxFQUFRLEdBQUssS0FLM0QsR0FBSSxzQkFBc0IsSUFDMUIsSUFBSyxnSUFDTCxHQUFHLEdBQVcsQ0FBTyxDQUN2QixFQUFFLEVBQ0YsQ0FDRSxLQUFNLDRCQUNOLEdBQUksbUJBQ0osS0FBTSx1QkFDTixLQUFNLENBQ0osS0FBTSx5QkFDTixJQUFLLGdDQUFnQyxFQUNsQyxLQUFLLEVBQUcsSUFBVSxpQ0FBaUMsRUFBTSxvQkFBb0IsQ0FBQyxDQUM5RSxLQUFLLEdBQUcsR0FDYixDQUNGLEVBQ0EsR0FBRyxFQUFtQixJQUFLLElBQW1CLENBQzVDLEdBQUkscURBQ0osSUFBSyxxQ0FDTCxHQUFHLEdBQVcsQ0FBTyxDQUN2QixFQUFFLEVBQ0YsR0FBRyxFQUFtQixJQUFLLElBQW1CLENBRTVDLEdBQUkscURBQ0osSUFBSyw4QkFDTCxHQUFHLEdBQVcsQ0FBTyxDQUN2QixFQUFFLENBQ0osRUFDQSxDQUFDLEVBQ0wsR0FBSSxFQUFlLENBQUMsQ0FBRSxJQUFLLG9CQUFxQixHQUFHLENBQVEsQ0FBQyxFQUFJLENBQUMsRUFDakUsQ0FBRSxJQUFLLGVBQWdCLEdBQUcsQ0FBUSxFQUNsQyxDQUFFLElBQUssa0JBQW1CLEdBQUcsQ0FBUSxFQUNyQyxHQUFJLEVBQW1CLE9BQVMsRUFDNUIsQ0FDRSxDQUNFLEtBQU0sc0JBQ04sR0FBSSxrQkFDSixLQUFNLGlDQUNOLEtBQU0sQ0FDSixLQUFNLGVBR04sS0FBTSxFQUNILElBQUssR0FBYSxFQUFVLEVBQUssTUFBTSxLQUFLLEVBQVMsY0FBYyxFQUFJLGNBQWUsQ0FBQyxDQUN2RixLQUFLO0NBQUksRUFDWixvQkFBcUIsU0FDckIsaUJBQWtCLEVBQ3BCLENBQ0YsQ0FDRixFQUNBLENBQUMsQ0FDUCxFQUVBLE1BQU8sQ0FDTCxLQUFNLE9BQ04sR0FBSSxDQUNGLGFBQWMsS0FDZCxLQUFNLENBQUUsU0FBVSxDQUFDLE1BQU0sQ0FBRSxDQUM3QixFQUNBLFlBQWEsQ0FDWCxNQUFPLDJDQUNQLHFCQUFzQixFQUN4QixFQUNBLFlBQWEsQ0FBRSxTQUFVLE1BQU8sRUFDaEMsS0FBTSxDQUNKLEtBQU0sQ0FDSixVQUFXLGdCQUNYLElBQUssQ0FBRSxZQUFhLElBQUssT0FBUSxPQUFRLEdBQUcsRUFBWSxFQUN4RCxPQUNGLENBQ0YsQ0FDRixDQUNGLENBRUEsU0FBUyxHQUFvQixFQUF1QyxFQUFvQixFQUE2QixDQUNuSCxNQUFPLENBQ0wsS0FBTSxpQkFBaUIsSUFDdkIsR0FBSSxDQUNGLGtCQUFtQixLQUduQixHQUFJLElBQWdCLGFBQ2hCLENBQUUsUUFBUyxDQUFFLE1BQU8sQ0FBQyxXQUFXLENBQUUsQ0FBRSxFQUNwQyxDQUFFLEtBQU0sQ0FBRSxTQUFVLENBQUMsTUFBTSxFQUFHLGVBQWdCLENBQUMsUUFBUyxZQUFZLENBQUUsQ0FBRSxDQUM5RSxFQUNBLFlBQWEsQ0FDWCxNQUFPLHlCQUNQLHFCQUFzQixFQUN4QixFQUNBLFlBQWEsQ0FBRSxTQUFVLE1BQU8sRUFDaEMsS0FBTSxDQUNKLE9BQVEsQ0FDTixVQUFXLGdCQUNYLElBQUssQ0FBRSxPQUFRLEVBQWEsR0FBRyxFQUFZLEVBQzNDLE1BQU8sQ0FFTCxDQUFFLEtBQU0sR0FBZ0IsS0FBTSxDQUFFLGNBQWUsQ0FBRSxDQUFFLEVBQ25ELENBQUUsS0FBTSxFQUFXLEVBQ25CLENBQ0UsS0FBTSxpQkFDTixJQUFLOzsrQ0FDUCxFQUNBLEdBQUcsR0FBa0IsRUFBSyxFQUMxQixDQUNFLEtBQU0sU0FDTixLQUFNLDZEQUNOLEtBQU0sQ0FDSixnQkFBaUIsR0FDakIsYUFBYyxFQUNkLFFBQVMsV0FBVyxHQUN0QixFQUdBLEdBQUksRUFBVyxDQUFFLElBQUssQ0FBRSxhQUFjLDZCQUE4QixDQUFFLEVBQUksQ0FBQyxDQUM3RSxDQUNGLENBQ0YsQ0FDRixDQUNGLENBQ0YsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ1UsQ0FDVixJQUFNLEVBQWtDLEVBQVcsQ0FBRSxhQUFjLDZCQUE4QixFQUFJLENBQUMsRUFDdEcsTUFBTyxDQUNMLEtBQU0sVUFDTixHQUFJLENBQ0YsS0FBTSxDQUFFLFNBQVUsQ0FBQyxHQUFHLEVBQU8sUUFBUSxRQUFRLENBQUUsQ0FDakQsRUFDQSxZQUFhLENBQ1gsTUFBTyx5QkFDUCxxQkFBc0IsRUFDeEIsRUFDQSxZQUFhLENBRVgsU0FBVSxRQUVWLEdBQUksRUFBOEIsQ0FBRSxRQUFTLE9BQVEsRUFBSSxDQUFDLENBQzVELEVBQ0EsS0FBTSxDQUNKLFFBQVMsQ0FDUCxVQUFXLGdCQUtYLElBQUssQ0FBRSxPQUFRLGFBQWMsR0FBRyxFQUFZLEVBQzVDLE1BQU8sQ0FFTCxDQUFFLEtBQU0sR0FBZ0IsS0FBTSxDQUFFLGNBQWUsQ0FBRSxDQUFFLEVBQ25ELENBQUUsS0FBTSxFQUFXLEVBQ25CLEdBQUcsR0FBa0IsRUFBSyxFQUMxQixHQUFJLEVBQ0EsQ0FDRSxDQUNFLEtBQU0seUJBQ04sR0FBSSxrQkFDSixJQUFLO3dGQUNQLENBQ0YsRUFDQSxDQUFDLEVBQ0wsQ0FDRSxLQUFNLFVBR04sSUFBSyx1QkFDTCxJQUFLLENBQ0gsYUFBYyw4QkFDZCxTQUFVLElBQ1YsR0FBRyxDQUNMLENBQ0YsRUFDQSxHQUFJLEVBQ0MsQ0FDQyxDQUNFLEtBQU0sNEJBQ04sR0FBSSxtQkFDSixJQUFLOzs7Ozs7R0FDUCxFQUNBLENBQ0UsR0FBSSxtREFDSixLQUFNLDRCQUdOLElBQUssMEZBQ0wsSUFBSyxDQUFFLFNBQVUsNkJBQThCLENBQ2pELENBQ0YsRUFDQSxDQUFDLENBQ1AsQ0FDRixDQUNGLENBQ0YsQ0FDRixDQTRCQSxTQUFTLEdBQWtCLEVBQWlELENBQzFFLE1BQU8sQ0FDTCxDQUNFLEdBQUksOENBQ0osS0FBTSxtQ0FPTixJQUFLOzs7Ozs7OzttQkFTUCxFQUNBLENBQ0UsS0FBTSx1QkFLTixJQUFLOzs7Ozs7Ozs7SUFZTCxJQUFLLENBQUUsbUJBQW9CLG1DQUFvQyxDQUNqRSxFQUNBLENBQ0UsR0FBSSw4Q0FDSixLQUFNLGdFQUVOLElBQUs7OytCQUdILEVBQ0k7Ozs7R0FLQSxJQUVSLEVBQ0EsQ0FDRSxHQUFJLDhDQUNKLEtBQU0sOEJBSU4sSUFBSzs7Ozs7R0FNUCxDQUNGLENBQ0YsQ0FFQSxTQUFTLElBQW9DLENBQzNDLE1BQU8sQ0FDTCxLQUFNLGdCQUNOLEdBQUksQ0FDRixvQkFBcUIsQ0FBRSxNQUFPLENBQUMsU0FBVSxTQUFVLGFBQWEsQ0FBRSxDQUNwRSxFQUNBLEtBQU0sQ0FDSixjQUFlLENBQ2IsVUFBVyxnQkFHWCxZQUFhLENBQUUsZ0JBQWlCLE9BQVEsU0FBVSxPQUFRLEVBQzFELE1BQU8sQ0FDTCxDQUNFLEtBQU0sK0VBQ04sS0FBTSxDQUFFLElBQUssRUFBSyxFQUNsQixJQUFLLENBQUUsYUFBYyw2QkFBOEIsQ0FDckQsQ0FDRixDQUNGLENBQ0YsQ0FDRixDQUNGLENDaGRBLE1BQWEsR0FBb0IsUUFNakMsZUFBc0IsR0FBaUIsRUFBc0MsQ0FDM0UsT0FBTyxFQUFPLDBCQUEwQixtQkFBb0IsU0FBWSxDQUN0RSxJQUFNLEVBQWUsRUFBSyxRQUFRLEVBQU8sUUFBUyxXQUFXLEVBR3ZELEVBQVcsR0FBYyxDQUFZLEVBQ3JDLEVBQVEsQ0FBRSxHQUFHLEVBQVMsS0FBTSxFQU1sQyxFQUFNLEtBQU8sR0FDWCxPQUNBLEdBQW1DLFdBQVksRUFBTSxLQUFNLEVBQU8sT0FBTyxFQUN6RSxFQUFPLE9BQ1QsRUFJSSxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxXQUFXLENBQUMsSUFDekQsRUFBTSxLQUFPLEdBQ1gsT0FDQSxHQUFtQyxPQUFRLEVBQU0sS0FBTSxFQUFPLE9BQU8sRUFDckUsRUFBTyxPQUNULEdBRUYsRUFBUyxNQUFRLEVBR2pCLE1BQU0sRUFBTyxhQUFhLEVBQWMsSUFBSSxLQUFLLFVBQVUsQ0FBUSxDQUFDLENBQ3RFLENBQUMsQ0FDSCxDQUdBLFNBQWdCLEdBQW1CLEVBQTBCLENBQzNELElBQUksRUFDSixHQUFJLENBQ0YsRUFBYSxHQUFjLEVBQUssUUFBUSxFQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUN4RSxNQUFRLENBRU4sTUFBTyxFQUNULENBQ0EsT0FDRSxJQUFlLElBQUEsSUFDZCxPQUFPLEdBQWUsVUFBWSxDQUFDLENBQUMsRUFBTyxNQUFNLENBQVUsR0FBSyxFQUFPLElBQUksRUFBQSxPQUE2QixDQUU3RyxDQVVBLFNBQVMsR0FBbUMsRUFBa0IsRUFBa0IsRUFBc0IsQ0FDcEcsR0FBSSxPQUFPLEdBQVksVUFBWSxDQUFDLEVBQU8sTUFBTSxDQUFPLEVBQUcsT0FBTyxFQUNsRSxJQUFNLEVBQWdCLEVBQXlCLE9BQVEsQ0FBQyxTQUFVLENBQVEsRUFBRyxDQUFHLEVBQ2hGLE9BQU8sRUFBTyxNQUFNLENBQWEsR0FDL0IsRUFBTyxNQUFNLENBQWEsSUFBTSxFQUFPLE1BQU0sQ0FBTyxHQUNwRCxFQUFPLEdBQUcsRUFBUyxDQUFhLEVBQzlCLEVBQ0EsQ0FDTixDQVdBLFNBQVMsR0FBdUIsRUFBYyxFQUFrQixFQUFzQixDQUNwRixHQUFJLElBQVksSUFBQSxLQUFjLE9BQU8sR0FBWSxVQUFZLEVBQU8sTUFBTSxDQUFPLEdBQUksT0FBTyxFQUs1RixJQUFNLEVBQVEsT0FBTyxHQUFZLFNBQVcsRUFBUSxRQUFRLFlBQWEsRUFBRSxDQUFDLENBQUMsUUFBUSxTQUFVLEVBQUUsRUFBSSxJQUFBLEdBSy9GLEVBQWtCLEVBQXlCLE9BQVEsQ0FBQyxTQUR6QyxHQUFTLElBQVUsU0FBVyxHQUFHLEVBQUssR0FBRyxJQURsQyxJQUFTLE9BQVMsV0FBYSxDQUVxQixFQUFHLENBQUcsRUFDbEYsT0FBTyxFQUFPLE1BQU0sQ0FBZSxFQUFJLEVBQW1CLEdBQVcsUUFDdkUsQ0FFQSxTQUFTLEdBQWMsRUFBZ0MsQ0FDckQsSUFBSSxFQUNKLEdBQUksQ0FDRixFQUFVLEVBQUcsYUFBYSxFQUFjLE1BQU0sQ0FDaEQsT0FBUyxFQUFPLENBR2QsR0FBSyxFQUFnQyxPQUFTLFNBQVUsTUFBTyxDQUFDLEVBQ2hFLE1BQU0sQ0FDUixDQUNBLE9BQU8sSUFBSSxLQUFLLE1BQU0sQ0FBTyxDQUMvQixDQy9HQSxlQUFzQixHQUF3QixFQUF5QyxDQUNyRixJQUFNLEVBQWEsRUFBUSxFQUFFLEVBQUUsV0FDL0IsR0FBSSxJQUFlLGVBQWlCLElBQWUsaUJBQWtCLE9BRXJFLElBQU0sRUFBYSxJQUFJLElBQUksRUFBUSxJQUFLLEdBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxRQUFRLENBQUMsQ0FBQyxFQUNwRixFQUFhLEVBQVEsS0FBTSxHQUFXLEVBQU8sTUFBTSxFQUN6RCxHQUFJLEdBQWMsR0FBNEIsQ0FBVSxFQUFHLENBQ3pELElBQU0sRUFBZ0IsRUFBSyxRQUFRLEVBQVcsUUFBUyxRQUFRLEVBQy9ELE1BQU0sRUFBTyxhQUFhLEVBQWUsaUZBQTJCLEVBQ3BFLEVBQVcsT0FBTyxDQUFhLENBQ2pDLENBRUEsSUFBSyxJQUFNLEtBQWEsRUFBWSxNQUFNLEdBQVksQ0FBUyxDQUNqRSxDQUVBLGVBQWUsR0FBWSxFQUFrQyxDQUNyRCxNQUFNLEVBQUcsU0FBUyxNQUFNLENBQVMsQ0FBQyxDQUFDLFVBQVksQ0FBQyxDQUFDLEdBQ25ELE1BQU0sRUFBTyxlQUFlLENBQVMsR0FDdkMsUUFBUSxLQUFLLDBDQUEwQyxFQUFVLEVBQUUsQ0FFdkUsQ0MzQkEsZUFBc0IsR0FBWSxFQUFzQyxDQUN0RSxPQUFPLEVBQU8sMEJBQTBCLGNBQWUsU0FBWSxDQUNqRSxHQUFNLENBQUUsV0FBWSxFQUFPLFNBQVUsR0FBUyxFQUc5QyxHQUZJLENBQUMsR0FBUyxDQUFDLEdBQ1gsSUFBVSxlQUFpQixJQUFVLGtCQUNyQyxDQUFDLEdBQWUsQ0FBSyxFQUFHLE9BRTVCLElBQU0sRUFBVSxHQUFXLENBQUssRUFFaEMsR0FBSSxDQUNGLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSx3QkFBeUIsUUFBUSxFQUN4RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0scUJBQXNCLFFBQVEsRUFDckUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLGtCQUFtQixRQUFRLEVBQ2xFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxtQkFBb0IsUUFBUSxFQUNuRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sc0JBQXVCLFFBQVEsRUFDdEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLGtDQUFtQyxRQUFRLEVBQ2xGLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSwwQkFBMkIsUUFBUSxFQUMxRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sdUJBQXdCLFFBQVEsRUFDdkUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLDZCQUE4QixRQUFRLEVBQzdFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxXQUFZLFFBQVEsRUFDM0QsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLGNBQWUsUUFBUSxFQUM5RCxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sWUFBYSxRQUFRLEVBQzVELE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxXQUFZLFFBQVEsRUFDM0QsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLHNCQUF1QixRQUFRLEVBQ3RFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxpQkFBa0IsUUFBUSxFQUNqRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0seUJBQTBCLFFBQVEsRUFDekUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLHNCQUF1QixRQUFRLEVBQ3RFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxzQkFBdUIsUUFBUSxFQUN0RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0saUJBQWtCLFFBQVEsRUFDakUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLGlCQUFrQixRQUFRLEVBQ2pFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxpQkFBa0IsUUFBUSxFQUNqRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0saUJBQWtCLFFBQVEsRUFDakUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLGlCQUFrQixRQUFRLEVBQ2pFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxrQkFBbUIsUUFBUSxFQUNsRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sb0JBQXFCLFFBQVEsRUFDcEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLG1CQUFvQixRQUFRLEVBQ25FLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSw4QkFBK0IsUUFBUSxFQUM5RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0saUJBQWtCLFFBQVEsRUFDakUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLHFCQUFzQixRQUFRLEVBQ3JFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxlQUFnQixRQUFRLEVBQy9ELE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxnQkFBaUIsUUFBUSxFQUNoRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sd0JBQXlCLFFBQVEsRUFDeEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLHNCQUF1QixRQUFRLEVBQ3RFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxzQkFBdUIsUUFBUSxFQUN0RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sVUFBVyxRQUFRLEVBQzFELE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxpQkFBa0IsUUFBUSxFQUVqRSxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sS0FBSyxFQUM3QyxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sZUFBZSxFQUN2RCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sV0FBVyxFQUNuRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sYUFBYSxFQUNyRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sa0JBQWtCLEVBQzFELE1BQU0sRUFBWSxFQUFTLEVBQU8sRUFBTSxhQUFhLEVBQ3JELE1BQU0sRUFBWSxFQUFTLEVBQU8sRUFBTSxTQUFTLEVBQ2pELE1BQU0sRUFBWSxFQUFTLEVBQU8sRUFBTSxVQUFVLEVBQ2xELE1BQU0sRUFBWSxFQUFTLEVBQU8sRUFBTSxTQUFTLENBQ25ELE9BQVMsRUFBTyxDQUNkLFFBQVEsS0FBSywyQkFBNkIsR0FBNkIsT0FBUyxDQUFLLENBQ3ZGLENBQ0YsQ0FBQyxDQUNILENBRUEsZUFBZSxFQUFXLEVBQWtCLEVBQWUsRUFBYyxFQUFjLEVBQThCLENBQ25ILEdBQUksQ0FDRixNQUFNLEVBQVEsUUFBUSxvQ0FBcUMsQ0FDekQsUUFDQSxPQUNBLE9BQ0EsT0FDRixDQUFDLENBQ0gsTUFBUSxDQUNOLE1BQU0sRUFBUSxRQUFRLDRDQUE2QyxDQUNqRSxRQUNBLE9BQ0EsT0FDQSxPQUNGLENBQUMsQ0FDSCxDQUNGLENBRUEsZUFBZSxFQUFZLEVBQWtCLEVBQWUsRUFBYyxFQUE2QixDQUNyRyxHQUFJLENBQ0YsTUFBTSxFQUFRLFFBQVEsNkNBQThDLENBQ2xFLFFBQ0EsT0FDQSxNQUNGLENBQUMsQ0FDSCxNQUFRLENBRVIsQ0FDRixDQ3JDQSxNQUFNLEdBQTRCLENBQ2hDLHVCQUF3QixZQUMxQixFQUVNLEdBQWdDLE1BRWhDLEdBQWlELENBQ3JELEtBQU0sZUFDTixPQUFRLFNBQ1IsWUFBYSxTQUNiLFdBQVksQ0FDVixTQUFVLENBQ1IsUUFBUyxDQUFDLEVBQ1YsUUFBUyxDQUFDLGlCQUFpQixDQUM3QixDQUNGLEVBQ0EsTUFBTyxDQUNMLENBQ0UsS0FBTSxVQUNSLEVBQ0EsQ0FDRSxLQUFNLHlCQUNOLFdBQVksQ0FDVixxQ0FBc0MsR0FDdEMseUJBQTBCLEdBQzFCLHVCQUF3QixDQUN0QixDQUNFLFFBQVMsY0FDVCxlQUFnQixFQUNsQixFQUNBLENBQ0UsUUFBUyw0QkFDVCxlQUFnQixFQUNsQixDQUNGLENBQ0YsQ0FDRixFQUNBLENBQ0UsS0FBTSxrQkFDUixFQUNBLENBQ0UsS0FBTSxlQUNOLFdBQVksQ0FDVixnQ0FBaUMsRUFDakMsOEJBQStCLEdBQy9CLG1CQUFvQixDQUFDLEVBQ3JCLDBCQUEyQixHQUMzQiwyQkFBNEIsR0FDNUIsa0NBQW1DLEdBQ25DLHNCQUF1QixDQUFDLFFBQVEsQ0FDbEMsQ0FDRixDQUNGLEVBQ0EsY0FBZSxDQUNiLENBQ0UsU0FBVSxTQUNWLFdBQVksT0FDWixZQUFhLGNBQ2YsQ0FDRixDQUNGLEVBRUEsZUFBc0IsR0FBd0IsRUFBc0MsQ0FDbEYsT0FBTyxFQUFPLDBCQUEwQiwwQkFBMkIsU0FBWSxDQUM3RSxHQUFNLENBQUUsV0FBWSxFQUFPLFNBQVUsR0FBUyxFQU05QyxHQUxJLENBQUMsR0FBUyxDQUFDLEdBQ1gsSUFBVSxlQUdWLEdBQXdCLEVBQU8sVUFBVSxHQUN6QyxDQUFDLEdBQWUsQ0FBSyxFQUFHLE9BRTVCLElBQU0sRUFBVSxHQUFXLENBQUssRUFFaEMsR0FBSSxDQUNGLE1BQU0sR0FBeUIsRUFBUyxFQUFPLEVBQU0sR0FBd0IsQ0FBTSxDQUFDLENBQ3RGLE9BQVMsRUFBTyxDQUNkLEdBQUksQ0FBQyxHQUFvQyxDQUFLLEVBQUcsTUFBTSxFQUl2RCxRQUFRLEtBQUssdUNBQXlDLEdBQTZCLE9BQVMsQ0FBSyxDQUNuRyxDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBd0IsRUFBaUQsQ0FDaEYsSUFBTSxFQUFVLGdCQUFnQixFQUFvQixFQUNwRCxHQUFJLEVBQU8sa0JBQWtCLE9BQVMsRUFDcEMsSUFBSyxJQUFNLEtBQVEsRUFBUSxNQUNyQixFQUFLLE9BQVMsMEJBRWxCLEVBQUssV0FBVyx1QkFBdUIsS0FBSyxDQUMxQyxRQUFTLHdCQUNULGVBQWdCLEVBQ2xCLENBQUMsRUFHTCxPQUFPLENBQ1QsQ0FFQSxlQUFlLEdBQ2IsRUFDQSxFQUNBLEVBQ0EsRUFDZSxDQUVmLElBQU0sR0FBb0IsTUFESSxHQUFzQixFQUFTLEVBQU8sRUFBTSxFQUFRLElBQUksRUFBQSxFQUMzQyxHQUUzQyxNQUFNLEdBQ0osU0FBWSxDQUNWLEdBQUksRUFBbUIsQ0FDckIsTUFBTSxFQUFRLFFBQVEsa0RBQW1ELENBQ3ZFLFFBQ0EsT0FDQSxXQUFZLEVBQ1osR0FBRyxFQUNILFFBQVMsRUFDWCxDQUFDLEVBQ0QsTUFDRixDQUVBLE1BQU0sRUFBUSxRQUFRLHNDQUF1QyxDQUMzRCxRQUNBLE9BQ0EsR0FBRyxFQUNILFFBQVMsRUFDWCxDQUFDLENBQ0gsRUFDQSxDQUNFLFlBQWMsR0FBVSxDQUFDLEdBQW9DLENBQUssQ0FDcEUsQ0FDRixDQUNGLENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDQSxFQUNBLEVBQytDLENBYy9DLElBQU0sR0FBVyxNQWJNLE9BRW5CLEVBQVEsUUFBUSxxQ0FBc0MsQ0FDcEQsUUFDQSxPQUNBLGlCQUFrQixHQUNsQixRQUFTLFNBQ1QsUUFBUyxFQUNYLENBQUMsRUFDSCxDQUNFLFlBQWMsR0FBVSxDQUFDLEdBQW9DLENBQUssQ0FDcEUsQ0FDRixFQUFBLENBQzBCLEtBQ3JCLFNBQU0sUUFBUSxDQUFRLEVBQzNCLE9BQU8sRUFBUyxLQUFNLEdBQVksRUFBUSxPQUFTLEdBQWUsRUFBUSxjQUFnQixZQUFZLENBQ3hHLENDbk5BLGVBQXNCLEdBQW9CLEVBQXNDLENBQzlFLE9BQU8sRUFBTywwQkFBMEIsc0JBQXVCLFNBQVksQ0FDekUsR0FBTSxDQUFFLFdBQVksRUFBTyxTQUFVLEdBQVMsRUFHOUMsR0FGSSxDQUFDLEdBQVMsQ0FBQyxHQUNYLElBQVUsZUFBaUIsSUFBVSxrQkFDckMsQ0FBQyxHQUFlLENBQUssRUFBRyxPQUU1QixJQUFNLEVBQVUsR0FBVyxDQUFLLEVBRWhDLEdBQUksQ0FFRixNQUFNLE9BRUYsRUFBUSxRQUFRLDhCQUErQixDQUM3QyxRQUNBLE9BQ0EsaUJBQWtCLEdBQ2xCLG1CQUFvQixHQUNwQixtQkFBb0IsR0FDcEIsbUJBQW9CLEdBQ3BCLG9CQUFxQixHQUNyQix1QkFBd0IsR0FDeEIsMEJBQTJCLFdBQzNCLDRCQUE2QixRQUM3QixRQUFTLENBQ1AsdUJBQXdCLFlBQzFCLEVBQ0EsR0FBSSxFQUFPLFlBQVksV0FBVyxxQkFBcUIsRUFBSSxDQUFFLGlCQUFrQixFQUFLLEVBQUksQ0FBQyxDQUMzRixDQUFDLEVBQ0gsQ0FDRSxZQUFjLEdBQVUsQ0FBQyxHQUFvQyxDQUFLLENBQ3BFLENBQ0YsQ0FDRixPQUFTLEVBQU8sQ0FDZCxHQUFJLENBQUMsR0FBb0MsQ0FBSyxFQUFHLE1BQU0sRUFHdkQsUUFBUSxLQUFLLG1DQUFxQyxHQUE2QixPQUFTLENBQUssQ0FDL0YsQ0FDRixDQUFDLENBQ0gsQ0NwQ0EsTUFBTSxHQUErQixhQUUvQixHQUFZLENBQ2hCLDJCQUE0Qjs7Ozs7Ozs7Z0NBUUUsR0FBNkI7Z0NBQzdCLEdBQTZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFpQzNELEtBQUssQ0FDUCxFQUVBLGVBQXNCLEdBQXdCLEVBQXNDLENBQ2xGLE9BQU8sRUFBTywwQkFBMEIsMEJBQTJCLFNBQVksQ0FDeEUsS0FBTyxrQkFJWixJQUFLLEdBQU0sQ0FBQyxFQUFVLEtBQWUsT0FBTyxRQUFRLEVBQVMsRUFBRyxDQUM5RCxJQUFNLEVBQVUsR0FBNEIsQ0FBVSxFQUNoRCxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsVUFBVyxDQUFRLEVBQ2pFLEdBQUksRUFBRyxXQUFXLENBQVEsRUFBRyxDQUMzQixJQUFNLEVBQWEsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sRUFDOUQsR0FBSSxHQUFTLEVBQVksQ0FBTyxFQUFJLEVBQVEsT0FBUyxFQUNuRCxRQUVKLENBRUEsTUFBTSxFQUFHLFNBQVMsTUFBTSxFQUFLLFFBQVEsRUFBTyxRQUFTLFNBQVMsRUFBRyxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQ3BGLE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQU8sQ0FBQyxDQUNwRSxDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBNEIsRUFBMEIsQ0FFN0QsT0FBTyxFQUFTLFdBQVcsR0FBOEIsU0FBcUIsQ0FDaEYsQ0MvRUEsTUFBTSxHQUF3QixDQUFDLGVBQWdCLGtCQUFtQix1QkFBd0Isa0JBQWtCLEVBQ3RHLEdBQW1DLE9BQU8sR0FBRyxpQ0FDN0MsR0FBK0IsQ0FDL0IsT0FBTyxJQUFJLEdBQWlDLHNCQUF1QixHQUFHLEVBQ3RFLE9BQU8sV0FBVyxHQUFpQyxzQkFBdUIsR0FBRyxFQUM3RSxPQUNGLG9DQUFvQyxHQUFpQyxpQ0FDckUsR0FDRixFQUNJLE9BQ0YseUNBQXlDLEdBQWlDLGlDQUMxRSxHQUNGLEVBQ0ksT0FBTyxnQ0FBZ0MsR0FBaUMsaUNBQWtDLEdBQUcsQ0FDbkgsRUFTQSxTQUFnQixHQUE0QixFQUFnQyxDQUMxRSxJQUFNLEVBQW9CLEVBQVEsUUFBUSxFQUE4QixFQUN4RSxHQUFJLEVBQWtCLFNBQVcsRUFBRyxPQUVwQyxJQUFNLEVBQVUsRUFDYixLQUNFLENBQUUsaUJBQWdCLFVBQVMsY0FBYSxlQUN2QyxLQUFLLEVBQUssS0FBSyxFQUFTLGNBQWMsRUFBRSxJQUFJLEVBQVksR0FBRyxFQUFlLFFBQVEsR0FDdEYsQ0FBQyxDQUNBLEtBQUs7Q0FBSSxFQUVaLE1BQVUsTUFDUixtSEFBbUgsR0FDckgsQ0FDRixDQUVBLFNBQVMsR0FBK0IsRUFBcUQsQ0FDM0YsSUFBTSxFQUFjLEVBQU8sWUFDM0IsR0FBSSxDQUFDLEVBQWEsTUFBTyxDQUFDLEVBRTFCLElBQU0sRUFBa0QsQ0FBQyxFQUN6RCxJQUFLLElBQU0sS0FBZSxHQUF1QixDQUMvQyxJQUFNLEVBQVUsRUFBWSxHQUN2QixLQUVMLElBQUssR0FBTSxDQUFDLEVBQWdCLEtBQWMsT0FBTyxRQUFRLENBQU8sRUFDekQsR0FDQSxHQUF5QixDQUFTLElBQ25DLEdBQWdDLENBQVMsR0FFN0MsRUFBa0IsS0FBSyxDQUNyQixpQkFDQSxRQUFTLEVBQU8sUUFDaEIsY0FDQSxXQUNGLENBQUMsRUFFTCxDQUNBLE9BQU8sQ0FDVCxDQUVBLFNBQVMsR0FBeUIsRUFBNEIsQ0FDNUQsT0FDRSxHQUEyQixDQUFTLEdBQ3BDLHNDQUFzQyxLQUFLLENBQVMsR0FDcEQsNERBQTRELEtBQUssQ0FBUyxHQUMxRSwwQ0FBMEMsS0FBSyxDQUFTLEdBQ3hELGtDQUFrQyxLQUFLLENBQVMsR0FDaEQsRUFBVSxXQUFXLE1BQU0sR0FDM0IsRUFBVSxXQUFXLE1BQU0sR0FDM0IsRUFBVSxXQUFXLFlBQVksQ0FFckMsQ0FFQSxTQUFTLEdBQTJCLEVBQTRCLENBQzlELE1BQU8sMENBQTBDLEtBQUssQ0FBUyxDQUNqRSxDQUVBLFNBQVMsR0FBZ0MsRUFBNEIsQ0FDbkUsT0FBTyxHQUE2QixLQUFNLEdBQVksRUFBUSxLQUFLLENBQVMsQ0FBQyxDQUMvRSxDQzVCQSxNQUFNLEdBQTZCLHlCQUVuQyxlQUFlLElBQXNCLENBQ25DLElBQU0sRUFBTyxNQUFNLEVBQU0sUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUEsQ0FDM0MsUUFDQyxHQUNBLDJHQUNGLENBQUEsQ0FDQyxRQUFRLGVBQWdCLHVEQUF5RCxHQUFVLENBQzFGLEVBQU0sV0FBVyxRQUFTLENBQ3hCLFNBQVUsNkJBQ1YsTUFBTyxHQUNQLEtBQU0sU0FDTixRQUFTLENBQUMsR0FBRyxDQUNmLENBQUMsQ0FDSCxDQUFDLENBQUEsQ0FDQSxRQUFRLENBQ1AsTUFBTyxDQUNMLFlBQWEsd0VBQ2IsS0FBTSxVQUNOLFFBQVMsR0FDVCxNQUFPLEdBQ1QsRUFDQSxTQUFVLENBQ1IsWUFDRSxxSEFDRixLQUFNLFVBQ04sUUFBUyxHQUNULE1BQU8sR0FDVCxFQUNBLFFBQVMsQ0FDUCxZQUFhLHdDQUNiLEtBQU0sVUFDTixRQUFTLEdBQ1QsTUFBTyxHQUNULENBQ0YsQ0FBQyxDQUFBLENBQ0EsUUFBUSxHQUFlLENBQUMsQ0FBQSxDQUN4QixPQUFPLENBQUMsQ0FBQyxLQUtaLEdBSkEsRUFBUSxVQUFZLEVBQUssUUFJckIsRUFBSyxFQUFFLEtBQU8sR0FBNEIsQ0FDdkMsR0FBNEIsSUFBRyxRQUFRLFNBQVcsR0FDdkQsTUFDRixDQUVBLElBQUksRUFBMEIsR0FDOUIsR0FBSSxDQUNGLEVBQTBCLE1BQU0sR0FBb0IsRUFBSyxNQUFtQixFQUFLLFNBQVUsRUFBSyxLQUFLLENBQ3ZHLFFBQVUsQ0FHUixNQUFNLEdBQXFCLENBQzdCLENBQ0ksSUFDRixRQUFRLFNBQVcsRUFFdkIsQ0FFQSxlQUFlLEdBQW9CLEVBQWlCLEVBQW1CLEVBQWtDLENBS3ZHLEdBQTRCLEVBTzVCLElBQU0sRUFBYSxJQUFJLFFBQ3ZCLEdBQUksSUFBSSxPQUFPLE1BQU0sRUFBQSxPQUE2QixFQUFJLEVBRXBELE9BREEsUUFBUSxNQUFNLHdCQUF3QixHQUFrQixVQUFVLEVBQVcsMkJBQTJCLEVBQ2pHLEdBS1QsSUFBTSxFQUFlLEdBQW9CLEVBQ25DLEVBQ0osQ0FBQyxHQUFTLEdBQWdCLENBQUMsRUFBYSxTQUFTLGNBQWMsRUFBSSxFQUFlLElBQUEsR0FFaEYsRUFBMEIsR0FDOUIsSUFBSyxJQUFNLEtBQWdCLEVBQU8sQ0FHaEMsSUFBTSxFQUFjLEVBQUssUUFBUSxDQUFZLEVBTzdDLEdBSkEsRUFBTyxlQUFlLEVBQUcsV0FBVyxDQUFXLEVBQUksRUFBYyxJQUFBLEVBQVMsRUFJdEUsQ0FBQyxHQUFtQixDQUFXLEVBQUcsQ0FDcEMsUUFBUSxNQUNOLFFBQVEsRUFBWSxtREFBbUQsR0FBa0Isd0NBQzNGLEVBQ0EsRUFBMEIsR0FDMUIsUUFDRixDQU1BLEdBQUksR0FBMEIsTUFBTSxHQUE0QixDQUFXLElBQU8sRUFBdUIsQ0FDdkcsUUFBUSxLQUFLLFFBQVEsRUFBWSxTQUFTLEVBQXNCLCtDQUErQyxFQUMvRyxRQUNGLENBQ0EsSUFBTSxFQUFrQixFQUFLLEtBQUssRUFBYSxVQUFVLEVBRW5ELEdBRFcsTUFBTSxPQUF1QixFQUFHLFNBQVMsUUFBUSxFQUFpQixDQUFFLGNBQWUsRUFBSyxDQUFDLENBQUMsR0FBTSxDQUFDLEVBQUEsQ0FFL0csT0FBUSxHQUFNLEVBQUUsWUFBWSxDQUFDLENBQUEsQ0FDN0IsSUFBSyxHQUFNLEVBQUssUUFBUSxFQUFpQixFQUFFLElBQUksQ0FBQyxFQVE3QyxFQUF1QixHQUF3QixDQUNuRCxRQUFTLEVBQ1QsWUFOQSxPQUVJLEtBQUssTUFBTSxFQUFHLGFBQWEsRUFBSyxRQUFRLEVBQWEsY0FBYyxFQUFHLE1BQU0sQ0FBQyxDQUNqRixHQUFLLENBQUMsRUFJTiwyQkFBNEIsRUFBb0IsS0FBTSxHQUNwRCxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVksY0FBYyxDQUFDLENBQ3hELENBQ0YsQ0FBQyxFQUNLLEVBQWMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBcUIsR0FBRyxDQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQ2pGLEdBQWUsSUFBZSxFQUFLLFFBQVEsQ0FBVyxDQUN6RCxFQUlNLEVBQW1CLENBQ3ZCLEdBQUcsQ0FBQyxpQkFBa0IsY0FBZSxlQUFnQixlQUFnQixlQUFlLENBQUMsQ0FBQyxJQUFLLEdBQ3pGLEVBQUssUUFBUSxFQUFhLENBQUksQ0FDaEMsRUFDQSxHQUFHLEVBQVksUUFBUyxHQUN0QixDQUFDLGVBQWdCLGVBQWUsQ0FBQyxDQUFDLElBQUssR0FBUyxFQUFLLFFBQVEsRUFBWSxDQUFJLENBQUMsQ0FDaEYsQ0FDRixFQUlBLElBQUksTUFIMEIsUUFBUSxJQUNwQyxFQUFpQixJQUFLLEdBQWEsRUFBTyx1QkFBdUIsQ0FBUSxDQUFDLENBQzVFLEVBQUEsQ0FDb0IsU0FBUyxFQUFLLEVBQUcsQ0FDbkMsUUFBUSxNQUFNLFFBQVEsRUFBWSx5RUFBeUUsRUFDM0csRUFBMEIsR0FDMUIsUUFDRixDQUVBLElBQU0sRUFBa0IsQ0FBQyxFQUFhLEdBQUcsQ0FBVyxDQUFDLENBQUMsUUFBUyxHQUFZLENBQ3pFLElBQU0sRUFBa0IsRUFBSyxRQUFRLEVBQVMsY0FBYyxFQUM1RCxHQUFJLENBQUMsRUFBRyxXQUFXLENBQWUsRUFBRyxNQUFPLENBQUMsRUFDN0MsR0FBSSxDQUVGLElBQU0sRUFBUSxHQUEwQixDQUFFLFlBRHRCLEtBQUssTUFBTSxFQUFHLGFBQWEsRUFBaUIsTUFBTSxDQUM1QixDQUFZLENBQUMsRUFDdkQsT0FBTyxFQUFRLENBQUMsR0FBRyxFQUFRLElBQUksR0FBTyxFQUFJLENBQUMsQ0FDN0MsTUFBUSxDQUNOLE1BQU8sQ0FBQyxHQUFHLEVBQWdCLFlBQVksQ0FDekMsQ0FDRixDQUFDLEVBQ0QsR0FBSSxFQUFnQixPQUFTLEVBQUcsQ0FDOUIsUUFBUSxNQUFNLFFBQVEsRUFBWSxLQUFLLEVBQWdCLEtBQUs7Q0FBSSxHQUFHLEVBQ25FLEVBQTBCLEdBQzFCLFFBQ0YsQ0FNQSxJQUFNLEVBQWEsTUFBTSxHQUFpQixDQUFXLEVBSXJELEdBSEksRUFBUSxVQUdSLENBQUMsRUFBWSxDQUNmLFFBQVEsTUFBTSxxQ0FBcUMsR0FBYSxFQUNoRSxFQUEwQixHQUMxQixRQUNGLENBR0EsSUFBTSxFQUE0QixNQUFNLFFBQVEsSUFDOUMsRUFBWSxJQUFLLEdBQWUsR0FBaUIsRUFBWSxDQUFFLE9BQVEsRUFBTSxDQUFDLENBQUMsQ0FDakYsRUFDTSxFQUEyQixFQUFZLE1BQzFDLEVBQVksSUFBVSxDQUFDLEVBQTBCLElBQVUsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFZLGNBQWMsQ0FBQyxDQUNqSCxFQUNBLEdBQUksRUFBMEIsQ0FDNUIsUUFBUSxNQUFNLFFBQVEsRUFBWSxJQUFJLEVBQXlCLDBCQUEwQixFQUN6RixFQUEwQixHQUMxQixRQUNGLENBRUEsSUFBTSxFQUFvQixDQUFDLEVBQVksR0FEYixFQUEwQixPQUFRLEdBQVcsQ0FBQyxDQUFDLENBQ2YsQ0FBQyxFQUdyRCxFQUE0QixFQUFrQixLQUFNLEdBQVcsRUFBTyxZQUFZLEVBQ3BGLEVBQ0UsTUFDQSxDQUFDLEtBQU0sdUJBQXdCLFdBQVksS0FBTSxrQkFBbUIsbUJBQW1CLEVBQ3ZGLEVBQVcsT0FDYixDQUFBLENBQ0csTUFBTTtDQUFJLENBQUEsQ0FDVixPQUFPLE9BQU8sQ0FBQSxDQUNkLElBQUssR0FBYSxFQUFLLFFBQVEsRUFBVyxRQUFTLENBQVEsQ0FBQyxFQUMvRCxDQUFDLEVBQ0wsR0FBSSxFQUEwQixPQUFTLEVBQUcsQ0FDeEMsUUFBUSxNQUNOLG9FQUFvRSxFQUEwQixLQUM1RixJQUNGLEVBQUUsZ0dBQ0osRUFDQSxFQUEwQixHQUMxQixRQUNGLENBQ0EsSUFBTSxFQUFzQixHQUFTLENBQVUsRUFJL0MsR0FGQSxNQUFNLEdBQXdCLENBQWlCLEVBRTNDLEVBQVEsVUFDVixJQUFLLElBQU0sS0FBVSxFQUNuQixRQUFRLEtBQUssQ0FBTSxFQUd2QixHQUE0QixDQUFpQixFQUU3QyxJQUFNLEVBQXlCLEdBQW1CLENBQVcsRUFHdkQsR0FBaUIsR0FBc0IsRUFBbUIsRUFBd0IsQ0FBUSxFQUNoRyxNQUFNLEdBQW1CLEVBQVksRUFBYyxFQUNuRCxNQUFNLEdBQWlCLENBQVUsRUFDakMsTUFBTSxHQUFpQixDQUFVLEVBR2pDLE1BQU0sR0FBdUIsRUFBWSxDQUFpQixFQUcxRCxNQUFNLEVBQVksV0FBVyxFQVEzQixDQUFDLEdBQ0QsRUFBVyx3QkFDWCxDQUFDLEdBQXdCLEVBQWEsRUFBWSxFQUF3QixFQUFjLEdBR3hGLFFBQVEsS0FBSyxrQ0FBa0MsRUFBWSw0QkFBNEIsRUFHekYsSUFBTSxFQUNKLENBQUMsR0FBd0IsRUFBVyxVQUFVLElBQzdDLEVBQVcsWUFBWSxXQUFXLHFCQUFxQixHQUN0RCxFQUFXLFlBQVksV0FBVyx3QkFBd0IsR0FNeEQsR0FDSixDQUFDLEdBQ0QsQ0FBQyxHQUF3QixFQUFXLFVBQVUsR0FDOUMsQ0FBQyxDQUFDLEVBQVcsWUFBWSxXQUFXLFNBQVMsR0FDN0MsRUFBVyxPQUNiLE1BQU0sUUFBUSxJQUFJLENBQ2hCLEVBQW9CLFNBQVcsR0FBZSxDQUFVLENBQUMsRUFDekQsR0FBcUIsQ0FBVSxFQUMvQixHQUFxQixDQUFVLEVBQy9CLEdBQXFCLEVBQVksQ0FBaUIsRUFDbEQsR0FBc0IsQ0FBVSxFQUNoQyxHQUF3QixDQUFVLEVBQ2xDLEdBQXFCLENBQVUsRUFDL0IsR0FBaUIsQ0FBVSxFQUMzQixHQUFzQixDQUFVLEVBQ2hDLEdBQWtCLENBQVUsRUFDNUIsR0FBSSxFQUFxQixDQUFDLEdBQWtCLENBQVUsQ0FBQyxFQUFJLENBQUMsRUFDNUQsR0FBSSxHQUFrQyxDQUFDLEdBQStCLEVBQVksQ0FBaUIsQ0FBQyxFQUFJLENBQUMsRUFDekcsR0FBWSxDQUFVLEVBQ3RCLEdBQXdCLENBQVUsRUFDbEMsR0FBb0IsQ0FBVSxFQUc5QixHQUFJLEVBQVcsT0FBUyxDQUFDLEdBQWlCLEVBQVksQ0FBaUIsQ0FBQyxFQUFJLENBQUMsQ0FDL0UsQ0FBQyxFQUNELE1BQU0sRUFBWSxXQUFXLEVBRzdCLE1BQU0sR0FBMEIsRUFBWSxDQUFpQixFQUM3RCxNQUFNLEVBQVksV0FBVyxFQUU3QixJQUFNLEVBQTRCLENBQUMsRUFDbkMsSUFBSyxJQUFNLEtBQVUsRUFDZixFQUFPLFVBQVUsZ0JBQ25CLEVBQVMsS0FBSyxHQUFvQixDQUFNLENBQUMsRUFFdkMsRUFBTyxVQUFVLE1BQ25CLEVBQVMsS0FBSyxHQUFrQixDQUFNLENBQUMsRUFFckMsRUFBTyxVQUFVLFFBQ25CLEVBQVMsS0FBSyxHQUFpQixDQUFNLENBQUMsRUFFeEMsTUFBTSxHQUFrQixFQUFRLENBQVUsRUFDMUMsTUFBTSxFQUFZLFdBQVcsRUFDekIsR0FBQyxFQUFPLFFBQVUsQ0FBQyxFQUFPLDBCQUcxQixHQUFnQixDQUFNLEdBQUcsTUFBTSxHQUF1QixDQUFNLEVBQ2hFLE1BQU0sR0FBb0IsRUFBUSxFQUFZLENBQVEsRUFFbEQsRUFBTywrQkFDVCxFQUFTLEtBQUssR0FBdUIsQ0FBTSxDQUFDLEdBRTFDLEVBQU8sdUJBQXlCLEVBQU8sa0NBQ3pDLEVBQVMsS0FBSyxHQUFpQixDQUFNLENBQUMsRUFFcEMsRUFBa0IsQ0FBTSxHQUMxQixFQUFTLEtBQUssR0FBb0IsQ0FBTSxDQUFDLEVBQ3pDLEVBQVMsS0FBSyxHQUFxQixFQUFRLENBQVUsQ0FBQyxHQUM3QyxDQUFDLEVBQU8sUUFBVSxFQUFPLHdCQUEwQixFQUFrQixDQUFVLEdBSXhGLEVBQVMsS0FBSyxHQUFxQixFQUFRLENBQVUsQ0FBQyxFQUVwRCxFQUFPLFVBQVUsU0FDbkIsRUFBUyxLQUFLLEdBQTBCLENBQU0sQ0FBQyxHQUduRCxNQUFNLFFBQVEsSUFBSSxDQUFRLEVBQzFCLE1BQU0sRUFBWSxXQUFXLEVBRzdCLEdBQTRCLENBQVcsRUFFdkMsR0FBSSxDQUNGLEdBQWUsQ0FBVyxDQUM1QixPQUFTLEVBQU8sQ0FHZCxRQUFRLE1BQU0sc0NBQXdDLEdBQTZCLFNBQVcsQ0FBSyxFQUNuRyxFQUEwQixFQUM1QixDQUNBLEdBQUksQ0FHRixJQUFNLEVBQXlCLEdBQXFCLENBQVcsRUFDM0QsR0FDRixRQUFRLEtBQUssd0NBQXdDLEVBQXVCLCtCQUErQixDQUUvRyxPQUFTLEVBQU8sQ0FDZCxRQUFRLE1BQU0sd0NBQTBDLEdBQTZCLFNBQVcsQ0FBSyxFQUNyRyxFQUEwQixFQUM1QixDQUNBLEdBQVUsTUFBTyxDQUFDLFNBQVMsRUFBRyxDQUFXLENBQzNDLENBQ0EsT0FBTyxDQUNULENBT0EsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ1MsQ0FXVCxPQVRJLElBQXdCLEdBQzFCLEdBQWtCLEVBQWEsQ0FBVSxFQUl2QyxHQUF5QixNQUFPLENBQUMsU0FBUyxFQUFHLEVBQWEsQ0FBQyxJQUFNLElBR3JFLEdBQWtCLEVBQWEsQ0FBVSxFQUNsQyxHQUNULENBRUEsU0FBUyxHQUFrQixFQUFxQixFQUFpQyxDQUUvRSxJQUFNLEVBQW1CLENBQ3ZCLEVBQUssUUFBUSxFQUFhLGNBQWMsRUFDeEMsR0FBRyxDQUFDLEdBQUcsR0FBd0IsQ0FBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFLLEdBQ3hELEVBQUssUUFBUSxFQUFhLEVBQWMsY0FBYyxDQUN4RCxDQUNGLEVBRU0sRUFBa0IsRUFBRyxhQUFhLENBQVcsRUFDbkQsSUFBSyxJQUFNLEtBQW1CLEVBQWtCLENBQzlDLElBQU0sRUFBb0IsT0FBa0IsRUFBRyxhQUFhLEVBQUssUUFBUSxDQUFlLENBQUMsQ0FBQyxFQUV4RixDQUFDLEdBQ0EsSUFBc0IsR0FBbUIsQ0FBQyxFQUFrQixXQUFXLEVBQWtCLEVBQUssR0FBRyxHQUlwRyxFQUFHLE9BQU8sRUFBaUIsQ0FBRSxVQUFXLEdBQU0sTUFBTyxFQUFLLENBQUMsQ0FDN0QsQ0FDRixDQUVBLFNBQVMsR0FBZSxFQUEyQixDQUlqRCxJQUFNLEVBQVMsR0FBeUIsTUFBTyxDQUFDLFNBQVMsRUFBRyxFQUFhLENBQUMsRUFDdEUsT0FBVyxFQUNmLE1BQVUsTUFBTSxrRUFBa0UsR0FBUSxDQUM1RixDQUVBLE1BQU0sR0FBSyJ9
512
+ `).filter(Boolean).map(e=>t.resolve(p.dirPath,e)):[];if(_.length>0){console.error(`SECURITY ERROR: Cloudflare credentials must be untracked. Remove ${_.join(`, `)} from Git, purge the token from history, and rotate CLOUDFLARE_API_TOKEN before rerunning wbfy.`),c=!0;continue}let v=gn(p);if(await yl(g),E.isVerbose)for(let e of g)console.info(e);Ll(g);let y=jr(n),ee=Mr(g,y,r);await Pr(p,ee),await ml(p),await ot(p),await Xc(p,g),await A.promiseAll(),!r&&p.doesContainPackageJson&&!Kl(n,p,y,ee)&&console.warn(`bun install currently fails in ${n} under the isolated linker.`);let b=!en(p.repository)&&(p.repository?.startsWith(`github:WillBooster/`)||p.repository?.startsWith(`github:WillBoosterLab/`)),te=!b&&!en(p.repository)&&!!p.repository?.startsWith(`github:`)&&p.isRoot;await Promise.all([v.then(()=>qs(p)),Gr(p),qr(p),Xr(p,g),Qr(p),Ml(p),Si(p),Bs(p),pc(p),lc(p),...b?[$t(p)]:[],...te?[il(p,g)]:[],xl(p),Tl(p),kl(p),...p.isRoot?[hs(p,g)]:[]]),await A.promiseAll(),await br(p,g),await A.promiseAll();let x=[];for(let e of g)e.depending.playwrightTest&&x.push(Re(e)),e.depending.next&&x.push(Ee(e)),e.depending.chakra&&x.push(Ne(e)),await ti(e,p),await A.promiseAll(),!(!e.isRoot&&!e.doesContainPackageJson)&&(xi(e)&&await Ls(e),await za(e,p,r),e.doesContainVscodeSettingsJson&&x.push(qc(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&x.push(_c(e)),H(e)?(x.push(js(e)),x.push(Ps(e,p))):!e.isRoot&&e.doesContainPackageJson&&H(p)&&x.push(Ps(e,p)),e.depending.pyright&&x.push(zs(e)));await Promise.all(x),await A.promiseAll(),$r(n);try{Jl(n)}catch(e){console.error(`Failed to refresh the Bun lockfile:`,e?.message??e),c=!0}try{let e=he(n);e&&console.info(`Removed Takumi Guard proxy URLs from ${e} to keep it registry-agnostic.`)}catch(e){console.error(`Failed to normalize the Bun lockfile:`,e?.message??e),c=!0}Rn(`bun`,[`cleanup`],n)}return c}function Kl(e,t,n,r){return n!==r&&ql(e,t),zn(`bun`,[`install`],e,1)===0||(ql(e,t),!1)}function ql(n,r){let i=[t.resolve(n,`node_modules`),...[...Ro(r).values()].map(e=>t.resolve(n,e,`node_modules`))],a=e.realpathSync(n);for(let n of i){let r=ae(()=>e.realpathSync(t.dirname(n)));!r||r!==a&&!r.startsWith(a+t.sep)||e.rmSync(n,{recursive:!0,force:!0})}}function Jl(e){let t=zn(`bun`,[`install`],e,1);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await Wl();
513
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsInBhcnNlSnNvbmMiLCJmc3AiLCJyZWxlYXNlQWdlR2F0ZS5kYXlzIiwicmVsZWFzZUFnZUdhdGUuZXhjbHVkZXMiLCJuZXdDb250ZW50IiwiY29tbW9uQ29udGVudCIsIm5ld0NvbnRlbnQiLCJjaGlsZF9wcm9jZXNzIiwiY29tbW9uQ29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJzb3J0T2JqZWN0S2V5cyIsImdpdEhvb2tzIiwiZGV0ZWN0TmV3bGluZSIsImRlcGVuZGVuY3lTZWN0aW9uS2V5cyIsImNvcmUiLCJtYW5hZ2VkQ29uZmlnQmxvY2tzIiwiZ2V0Q29uZmlnQ29udGVudCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bkxvY2tmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9kb2NrZXJmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9nbG9iLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9jaGFrcmFUb2FzdGVyLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZm5veFRvbWwudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd29ya3NwYWNlVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9qc29uY1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3N0cmluZ1V0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUudHMiLCIuLi9zcmMvdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtb2JqZWN0LWtleXNAMi4xLjAtMThkZjJmODM3ZTZlYzI5YS9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtaW5kZW50QDcuMC4yLTZiNzVkYzBmNTY1MzNiZDkvbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LW5ld2xpbmVANC4wLjEtNWRhOWRmNjUxMjVlZTc5NS9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZ2l0LWhvb2tzLWxpc3RANC4yLjEtNmNhMmIyNjlkOTE2MzMyZS9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9pcy1wbGFpbi1vYmpANC4xLjAtNDdmZGRkNzcwNjQ4ZTU3Ny9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtcGFja2FnZS1qc29uQDQuMC4wLTYzNTFiOTJmODI2MTU2ZjQvbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3VzZXJBZ2VudEluc3RydWN0aW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd2JFbnYudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9zZWxmQ29udGFpbmVkV29ya2Zsb3cudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9taXNlVG9tbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL25wbXJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvcnVsZXNldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBBbmNob3JlZCB0byBgXCIsIGAgc28gb25seSBhIHJlZ2lzdHJ5IGVudHJ5J3MgYHJlc29sdmVkYCBzbG90IGlzIGNsZWFyZWQuIEEgZGlyZWN0IHRhcmJhbGxcbiAqIGRlcGVuZGVuY3kgY2FycmllcyBpdHMgVVJMIGluIHRoZSB3b3Jrc3BhY2UgZGVzY3JpcHRvciBhbmQgdHVwbGUgaWRlbnRpZmllciBpbnN0ZWFkLCBhbmQgdGhvc2VcbiAqIFVSTHMgbXVzdCByZW1haW4gaW50YWN0LlxuICovXG5jb25zdCBndWFyZFJlc29sdmVkVXJsUGF0dGVybiA9IC8oXCIsIClcImh0dHBzOlxcL1xcL25wbVxcLmZsYXR0XFwudGVjaFxcL1teXCJdKlwiL2c7XG5cbi8qKlxuICogUmVtb3ZlIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGJ1bi5sb2NrLlxuICpcbiAqIEJ1biB3cml0ZXMgdGhlIHdvcmtzcGFjZSByb290J3MgbG9ja2ZpbGUgZXZlbiB3aGVuIGFuIGluc3RhbGwgcnVucyBmcm9tIGEgY2hpbGQgcGFja2FnZS4gSW4gYVxuICogR2l0IGNoZWNrb3V0IHRoZSBzZWFyY2ggY2xpbWJzIHRvIHRoYXQgcm9vdDsgd2l0aG91dCBhIGNoZWNrb3V0IGJvdW5kYXJ5IGl0IGluc3BlY3RzIG9ubHkgdGhlXG4gKiBzdGFydGluZyBkaXJlY3Rvcnkgc28gaXQgY2Fubm90IHJld3JpdGUgYW4gdW5yZWxhdGVkIGFuY2VzdG9yJ3MgbG9ja2ZpbGUuIFRoZSBwcm94eSBpc1xuICogaW5zdGFsbC10aW1lIHBvbGljeSByYXRoZXIgdGhhbiByZXBvc2l0b3J5IHN0YXRlOiBhbiBlbXB0eSByZXNvbHZlZCBzbG90IHN0aWxsIG1ha2VzIEJ1biB1c2UgdGhlXG4gKiBjb25maWd1cmVkIGRlZmF1bHQgcmVnaXN0cnkuXG4gKlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgbG9ja2ZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY2hhbmdlIHdhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGxvY2tmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4sICckMVwiXCInKTtcbiAgaWYgKG5vcm1hbGl6ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQSBzaWJsaW5nIHRlbXAgZmlsZSBtYWtlcyB0aGUgcmVwbGFjZW1lbnQgYW4gYXRvbWljIHNhbWUtZGlyZWN0b3J5IHJlbmFtZSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgLy8gd3JpdGUgY2Fubm90IGxlYXZlIGEgdHJ1bmNhdGVkIGJ1bi5sb2NrIGJlaGluZC5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke2xvY2tmaWxlUGF0aH0ubm9ybWFsaXppbmcuJHtwcm9jZXNzLnBpZH0uJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gIHRyeSB7XG4gICAgLy8gc3RhdCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGNobW9kIGlzIG5vdCBzcGVjaWZpZWQgdG8gYWNjZXB0LlxuICAgIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhsb2NrZmlsZVBhdGgpLm1vZGUgJiAwbzc3NztcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBvcmFyeVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50LCB7IG1vZGUgfSk7XG4gICAgLy8gd3JpdGVGaWxlU3luYydzIG1vZGUgaXMgbWFza2VkIGJ5IHRoZSBwcm9jZXNzIHVtYXNrOyBjaG1vZCByZXN0b3JlcyB0aGUgZXhhY3Qgb3JpZ2luYWwgYml0cy5cbiAgICBmcy5jaG1vZFN5bmModGVtcG9yYXJ5UGF0aCwgbW9kZSk7XG4gICAgZnMucmVuYW1lU3luYyh0ZW1wb3JhcnlQYXRoLCBsb2NrZmlsZVBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyh0ZW1wb3JhcnlQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiBsb2NrZmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZFN0YXJ0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShzdGFydERpclBhdGgpO1xuICBjb25zdCByZXBvc2l0b3J5Um9vdERpclBhdGggPSBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHJlc29sdmVkU3RhcnREaXJQYXRoKTtcbiAgaWYgKCFyZXBvc2l0b3J5Um9vdERpclBhdGgpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRTdGFydERpclBhdGgsICdidW4ubG9jaycpO1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkgPyBsb2NrZmlsZVBhdGggOiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgZGlyUGF0aCA9IHJlc29sdmVkU3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpKSByZXR1cm4gbG9ja2ZpbGVQYXRoO1xuICAgIGlmIChkaXJQYXRoID09PSByZXBvc2l0b3J5Um9vdERpclBhdGgpIHJldHVybjtcblxuICAgIGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkaXJQYXRoID0gc3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGRpclBhdGg7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSByZXR1cm47XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cbiIsIi8qKiBXaGV0aGVyIGEgRG9ja2VyZmlsZSBjb25zdW1lcyB3YidzIGdlbmVyYXRlZCBub24tc2VjcmV0IGVudmlyb25tZW50IGRpcmVjdGx5IG9yIHRocm91Z2ggaXRzIGhlbHBlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0RvY2tlckVudihkb2NrZXJmaWxlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBkb2NrZXJmaWxlVGV4dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuc29tZSgobGluZSkgPT4gIS9eXFxzKiMvdS50ZXN0KGxpbmUpICYmIChsaW5lLmluY2x1ZGVzKCcuZG9ja2VyLmVudicpIHx8IGxpbmUuaW5jbHVkZXMoJ2FwcGx5LWRvY2tlci1lbnYuc2gnKSkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLmFudGlncmF2aXR5Y2xpLyoqJyxcbiAgLy8gR2l0J3Mgb2JqZWN0IHN0b3JlIGhvbGRzIGNvcGllcyBvZiB0cmFja2VkIGZpbGVzIChhbmQgYGRvdDogdHJ1ZWAgbWFrZXMgdGhlbSB2aXNpYmxlKSwgc29cbiAgLy8gc2Nhbm5pbmcgaXQgd291bGQgYm90aCBzbG93IGV2ZXJ5IGdsb2IgZG93biBhbmQgbGV0IHN0YWxlIGJsb2JzIGluZmx1ZW5jZSBkZXRlY3Rpb24uXG4gICcqKi8uZ2l0LyoqJyxcbiAgLy8gVGhlIG9yZy1zdGFuZGFyZCB0ZW1wb3JhcnkgZGlyZWN0b3J5OyBzdGFsZSBjb3BpZXMgdW5kZXIgaXQgKGUuZy4gcmV2aWV3IHNjcmF0Y2ggZGlycykgbXVzdFxuICAvLyBub3QgaW5mbHVlbmNlIGxhbmd1YWdlIGRldGVjdGlvbi5cbiAgJyoqLy50bXAvKionLFxuICAnKiovLnRtcC0qLyoqJyxcbiAgLy8gTG9jYWwgY2FjaGVzIGNhbiBjb250YWluIGNvbXBsZXRlIHRoaXJkLXBhcnR5IHNvdXJjZSBjaGVja291dHMuIFRyZWF0aW5nIHRob3NlIGFzIHJlcG9zaXRvcnlcbiAgLy8gY29kZSBnZW5lcmF0ZXMgd29ya2Zsb3dzIGZvciBwYXRocyB0aGF0IGFyZSBnaXRpZ25vcmVkIGFuZCBhYnNlbnQgZnJvbSBmcmVzaCBDSSBjaGVja291dHMuXG4gICcqKi8uY2FjaGUvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5sZXQgcmVhbFJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIC8qKiBDb25maW5lcyBnZW5lcmF0ZUZpbGUgd3JpdGVzIHRvIHRoZSByZXBvc2l0b3J5IHJvb3RlZCBhdCByb290RGlyUGF0aCAodW5kZWZpbmVkIGRpc2FibGVzIGl0KS4gKi9cbiAgc2V0Um9vdERpclBhdGgocm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHJlYWxSb290RGlyUGF0aCA9IHJvb3REaXJQYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJucyB1bmRlZmluZWQgb25seSB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LiBPdGhlciBmYWlsdXJlcyAoZS5nLiBwZXJtaXNzaW9ucykgYXJlXG4gICAqIHJldGhyb3duIHNvIGNhbGxlcnMgcmVnZW5lcmF0aW5nIGNvbmZpZyBmaWxlcyBuZXZlciBvdmVyd3JpdGUgY29udGVudCB0aGV5IGNvdWxkIG5vdCByZWFkLlxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH0sXG4gIC8qKiBUZWxscyB3aGV0aGVyIGEgd3JpdGUgdG8gZmlsZVBhdGggd291bGQgcGFzcyB0aGUgc3ltbGluay9yZXBvc2l0b3J5LWNvbnRhaW5tZW50IGd1YXJkcy4gKi9cbiAgYXN5bmMgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmVhZHMgYSBzb3VyY2UgZmlsZSwgcmV0dXJuaW5nIHVuZGVmaW5lZCB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IE9SIHdoZW4gaXRcbiAgICogcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSDigJQgYSBjb21taXR0ZWQgc3ltbGluayBwb2ludGluZyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IG11c3RcbiAgICogbm90IGdldCBpdHMgdGFyZ2V0J3MgY29udGVudCBjb3BpZWQgaW50byBhIHRyYWNrZWQgZmlsZS4gQSBzeW1saW5rIHdob3NlIHJlc29sdmVkIHRhcmdldFxuICAgKiBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkgaXMgbGVnaXRpbWF0ZSAoZS5nLiBgLm5vZGUtdmVyc2lvbiAtPiAubnZtcmNgKSBhbmQgaXMgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKCFzdGF0cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgbGV0IHJlYWxGaWxlUGF0aDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVhbEZpbGVQYXRoID0gYXdhaXQgZnMucHJvbWlzZXMucmVhbHBhdGgoZmlsZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBkYW5nbGluZyBzeW1ib2xpYyBsaW5rLmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICByZWFsUm9vdERpclBhdGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICByZWFsRmlsZVBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJlxuICAgICAgICAhcmVhbEZpbGVQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZXMgZmlsZVBhdGggKGZvcmNlLCBvcHRpb25hbGx5IHJlY3Vyc2l2ZSkgb25seSB3aGVuIGl0cyBQQVJFTlQgZGlyZWN0b3J5IHJlc29sdmVzIGluc2lkZVxuICAgKiB0aGUgcmVwb3NpdG9yeSwgc28gYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGEgY29tbWl0dGVkIC5naXRodWIvd29ya2Zsb3dzIGxpbmspIGNhbiBuZXZlclxuICAgKiBtYWtlIGNsZWFudXAgZGVsZXRlIGZpbGVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuIFJlbW92aW5nIGEgc3ltbGluayBlbnRyeSBpdHNlbGYgaXMgYWxsb3dlZDpcbiAgICogdGhhdCBkZWxldGVzIG9ubHkgdGhlIGxpbmssIG5ldmVyIGl0cyB0YXJnZXQuIFJldHVybnMgd2hldGhlciB0aGUgcmVtb3ZhbCB3YXMgcGVyZm9ybWVkLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlbW92aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogb3B0aW9ucz8ucmVjdXJzaXZlID8/IGZhbHNlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogV3JpdGVzIGNvbnRlbnQgdmVyYmF0aW0sIGFwcGx5aW5nIHRoZSBzYW1lIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMgYXMgZ2VuZXJhdGVGaWxlLiAqL1xuICBhc3luYyB3cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSkpIHJldHVybiBmYWxzZTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIHdhcyBhY3R1YWxseSBnZW5lcmF0ZWQgKGZhbHNlIHdoZW4gdGhlIGNvbmZpbmVtZW50IGd1YXJkcyBza2lwIGl0KS4gKi9cbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGluZUVuZGluZzogJ1xcbicgfCAnXFxyXFxuJyA9ICdcXG4nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gYHRyaW1gIHRyZWF0cyBhIEJPTSBhcyB3aGl0ZXNwYWNlLCBzbyBpdCBpcyByZWF0dGFjaGVkIGF0IHBvc2l0aW9uIDA6IGRyb3BwaW5nIGl0IHdvdWxkXG4gICAgLy8gcmV3cml0ZSB0aGUgZW5jb2RpbmcgbWFya2VyIG9mIGEgZmlsZSB0aGUgZ2VuZXJhdG9yIHdhcyBvbmx5IGFza2VkIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBieXRlT3JkZXJNYXJrID0gY29udGVudC5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCA9IGAke2J5dGVPcmRlck1hcmt9JHtub3JtYWxpemVkQ29udGVudH0ke2xpbmVFbmRpbmd9YDtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gTmV2ZXIgd3JpdGUgdGhyb3VnaCBhIHN5bWxpbms6IGEgKHBvc3NpYmx5IGRhbmdsaW5nKSBsaW5rIGNvbW1pdHRlZCBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnlcbiAgLy8gY291bGQgcmVkaXJlY3QgdGhlIHdyaXRlIG91dHNpZGUgaXQuXG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgaWYgKHN0YXRzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgd3JpdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBBIHN5bWxpbmtlZCBwYXJlbnQgZGlyZWN0b3J5IHdvdWxkIHJlZGlyZWN0IHJlYWRzLCB3cml0ZXMsIGFuZCByZW1vdmFscyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LFxuLy8gc28gcmVxdWlyZSB0aGUgY2xvc2VzdCBleGlzdGluZyBhbmNlc3RvciB0byByZXNvbHZlIGluc2lkZSB0aGUgcm9vdCBzZXQgYnkgdGhlIENMSSBlbnRyeSBwb2ludC5cbmFzeW5jIGZ1bmN0aW9uIGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKHJlYWxSb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgbGV0IGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhhbmNlc3RvclBhdGgpKSB7XG4gICAgYW5jZXN0b3JQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yUGF0aCk7XG4gIH1cbiAgY29uc3QgcmVhbEFuY2VzdG9yUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGFuY2VzdG9yUGF0aCk7XG4gIHJldHVybiByZWFsQW5jZXN0b3JQYXRoID09PSByZWFsUm9vdERpclBhdGggfHwgcmVhbEFuY2VzdG9yUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IEFQSSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VGaWxlIH0gZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG4vLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSAoR28pIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSBhbmQgbm9cbi8vIGxvbmdlciBleHBvc2VzIGFuIGluLXByb2Nlc3MgcGFyc2VyIHN1Y2ggYXMgYHRzLmNyZWF0ZVNvdXJjZUZpbGVgLiBQYXJzaW5nIG5vd1xuLy8gaGFwcGVucyBpbiBhIHNwYXduZWQgY29tcGlsZXIgc2VydmVyIHJlYWNoZWQgdGhyb3VnaCB0aGUgYXN5bmNocm9ub3VzIEFQSSwgc28gd2Vcbi8vIGtlZXAgYSBzaW5nbGUgbGF6aWx5LWNyZWF0ZWQgaW5zdGFuY2UgYW5kIHJldXNlIGl0IGFjcm9zcyBldmVyeSBmaXhlciB0byBhdm9pZFxuLy8gcGF5aW5nIHRoZSBwcm9jZXNzLXNwYXduIGNvc3QgcGVyIGZpbGUuXG5sZXQgYXBpOiBBUEkgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGdldEFwaSgpOiBBUEkge1xuICByZXR1cm4gKGFwaSA/Pz0gbmV3IEFQSSh7IGN3ZDogcHJvY2Vzcy5jd2QoKSB9KSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgc291cmNlIGZpbGUgaW50byBhIFR5cGVTY3JpcHQgQVNUIHVzaW5nIHRoZSBidW5kbGVkIG5hdGl2ZSBjb21waWxlci5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY29tcGlsZXIgY2Fubm90IGxvYWQgdGhlIGZpbGUgKGUuZy4gaXQgaXMgbWlzc2luZ1xuICogb3IgdW5wYXJzYWJsZSkgc28gY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIGNvbnNlcnZhdGl2ZSBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxTb3VyY2VGaWxlIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBnZXRBcGkoKS51cGRhdGVTbmFwc2hvdCh7IG9wZW5GaWxlczogW2ZpbGVQYXRoXSB9KTtcbiAgICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgc25hcHNob3QuZ2V0RGVmYXVsdFByb2plY3RGb3JGaWxlKGZpbGVQYXRoKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvamVjdD8ucHJvZ3JhbS5nZXRTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNodXRzIGRvd24gdGhlIHNwYXduZWQgY29tcGlsZXIgc2VydmVyLiBUaGUgc2VydmVyIGtlZXBzIGFuIG9wZW4gSVBDIGNoYW5uZWxcbiAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGtlZXAgdGhlIHJ1bnRpbWUgZXZlbnQgbG9vcCBhbGl2ZSwgc28gd2JmeSBtdXN0IGNhbGwgdGhpc1xuICogb25jZSBpdHMgcnVuIGZpbmlzaGVzIGZvciB0aGUgcHJvY2VzcyB0byBleGl0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwaT8uY2xvc2UoKTtcbiAgYXBpID0gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbi8vIFNldHRpbmdzIGV2ZXJ5IFdpbGxCb29zdGVyIE5leHQuanMgcHJvamVjdCBzaG91bGQgY2FycnkuIGBuYW1lYCBpcyB0aGUgdG9wLWxldmVsXG4vLyBwcm9wZXJ0eSBrZXkgdXNlZCB0byBkZXRlY3Qgd2hldGhlciB0aGUgc2V0dGluZyBhbHJlYWR5IGV4aXN0czsgYHRleHRgIGlzIGluc2VydGVkXG4vLyB2ZXJiYXRpbSAoYSB3aG9sZSBga2V5OiB2YWx1ZWAgcGFpcikgd2hlbiB0aGUga2V5IGlzIG1pc3NpbmcuXG5jb25zdCBtYW5hZ2VkUHJvcGVydGllczogcmVhZG9ubHkgeyBuYW1lOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXG4gIHsgbmFtZTogJ3JlYWN0Q29tcGlsZXInLCB0ZXh0OiAncmVhY3RDb21waWxlcjogdHJ1ZScgfSxcbiAgeyBuYW1lOiAncmVhY3RTdHJpY3RNb2RlJywgdGV4dDogJ3JlYWN0U3RyaWN0TW9kZTogdHJ1ZScgfSxcbiAgeyBuYW1lOiAndHlwZXNjcmlwdCcsIHRleHQ6ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0nIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ3RzJywgJ210cycsICdjdHMnLCAnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IGF3YWl0IGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gPSBleHRyYWN0ZWQ7XG5cbiAgICAvLyBgcHJvcGVydGllc2AgaW5jbHVkZXMgc3ByZWFkIGFzc2lnbm1lbnRzIChgLi4ucmVzdGApIHRoYXQgY2Fycnkgbm8gbmFtZSwgc28gZ3VhcmQgYmVmb3JlIHJlYWRpbmcgaXQuXG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0aWVzID0gbmV3IFNldChcbiAgICAgIG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PlxuICAgICAgICAnbmFtZScgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkubmFtZSA/IGdldFByb3BlcnR5S2V5KHByb3BlcnR5Lm5hbWUsIHNvdXJjZSkgOiB1bmRlZmluZWRcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHByb3BlcnR5VGV4dHMgPSBtYW5hZ2VkUHJvcGVydGllc1xuICAgICAgLmZpbHRlcigocHJvcGVydHkpID0+ICFleGlzdGluZ1Byb3BlcnRpZXMuaGFzKHByb3BlcnR5Lm5hbWUpKVxuICAgICAgLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnRleHQpO1xuICAgIGlmIChwcm9wZXJ0eVRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IHNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgLy8gVGhlIG5hdGl2ZSBUUyBBU1QgZG9lcyBub3QgcmVsaWFibHkgZXhwb3NlIGBwcm9wZXJ0aWVzLmhhc1RyYWlsaW5nQ29tbWFgLCBzbyBzY2FuIHRoZSBzb3VyY2VcbiAgICAvLyBiZXR3ZWVuIHRoZSBsYXN0IHByb3BlcnR5IGFuZCB0aGUgY2xvc2luZyBicmFjZS4gU3RyaXAgY29tbWVudHMgZmlyc3Qgc28gYSBjb21tYSBpbnNpZGUgYVxuICAgIC8vIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4gYGZvbzogMSAvLyBhLCBiYCkgaXMgbm90IG1pc3Rha2VuIGZvciBhIHJlYWwgdHJhaWxpbmcgY29tbWEuXG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IHN0cmlwQ29tbWVudHMob2xkQ29udGVudC5zbGljZShsYXN0UHJvcGVydHkuZ2V0RW5kKCksIGluc2VydGlvblBvaW50KSkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHsgc291cmNlOiBhc3QuU291cmNlRmlsZTsgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkIGRlY2xhcmVzIHRoZSBjb25maWcgYXMgYGNvbnN0IG5leHRDb25maWc6IE5leHRDb25maWcgPSB7IC4uLiB9YCBhbmRcbiAgLy8gZXhwb3J0cyBpdCAocG9zc2libHkgd3JhcHBlZCwgZS5nLiBgd2l0aFNlbnRyeUNvbmZpZyguLi4pYCksIHNvIHRoZSBvYmplY3QgbGl0ZXJhbCBpcyByYXJlbHlcbiAgLy8gdGhlIGRpcmVjdCBvcGVyYW5kIG9mIGBleHBvcnQgZGVmYXVsdGAvYG1vZHVsZS5leHBvcnRzYC4gQ29sbGVjdCBldmVyeSBjYW5kaWRhdGUgYW5kIHBpY2sgdGhlXG4gIC8vIG1vc3QgYXV0aG9yaXRhdGl2ZSBvbmUgYmVsb3cuXG4gIGxldCBkaXJlY3RPYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGxldCBleHBvcnRlZElkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmFyaWFibGVPYmplY3RMaXRlcmFscyA9IG5ldyBNYXA8c3RyaW5nLCBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24+KCk7XG4gIGNvbnN0IHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHM6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbltdID0gW107XG5cbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoYXN0LmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFzdC5pc0JpbmFyeUV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUub3BlcmF0b3JUb2tlbi5raW5kID09PSBhc3QuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJ1xuICAgICkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5yaWdodCk7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUucmlnaHQpKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5yaWdodC5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhc3QuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpICYmIG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuaW5pdGlhbGl6ZXIpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwgJiYgYXN0LmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuc2V0KG5vZGUubmFtZS5nZXRUZXh0KHNvdXJjZSksIG9iamVjdExpdGVyYWwpO1xuICAgICAgICAvLyBUaGUgYDogTmV4dENvbmZpZ2AgYW5ub3RhdGlvbiB3YmZ5IHdyaXRlcyBtYXJrcyB0aGUgY2Fub25pY2FsIGNvbmZpZyBvYmplY3QgKGFjY2VwdGluZ1xuICAgICAgICAvLyBxdWFsaWZpZWQgbmFtZXMgc3VjaCBhcyBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2ApLlxuICAgICAgICBjb25zdCBhbm5vdGF0aW9uVHlwZSA9IG5vZGUudHlwZT8uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgICBpZiAoYW5ub3RhdGlvblR5cGUgIT09IHVuZGVmaW5lZCAmJiBpc05leHRDb25maWdUeXBlKGFubm90YXRpb25UeXBlKSkge1xuICAgICAgICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHMucHVzaChvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIGNvbnN0IG9iamVjdExpdGVyYWwgPVxuICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHNbMF0gPz9cbiAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/XG4gICAgKGV4cG9ydGVkSWRlbnRpZmllciA/IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KGV4cG9ydGVkSWRlbnRpZmllcikgOiB1bmRlZmluZWQpID8/XG4gICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoJ25leHRDb25maWcnKTtcbiAgcmV0dXJuIG9iamVjdExpdGVyYWwgPyB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3VycmVudCA9IHVud3JhcFBhcmVudGhlc2VzKG5vZGUpO1xuICByZXR1cm4gYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oY3VycmVudCkgPyBjdXJyZW50IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJlbnRoZXNlcyhub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5FeHByZXNzaW9uIHtcbiAgbGV0IGN1cnJlbnQgPSBub2RlO1xuICB3aGlsZSAoYXN0LmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oY3VycmVudCkpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5leHByZXNzaW9uO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vLyBNYXRjaCBib3RoIHRoZSBiYXJlIGBOZXh0Q29uZmlnYCBhbmQgcXVhbGlmaWVkIGZvcm1zIGxpa2UgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgLlxuZnVuY3Rpb24gaXNOZXh0Q29uZmlnVHlwZSh0eXBlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlVGV4dCA9PT0gJ05leHRDb25maWcnIHx8IHR5cGVUZXh0LmVuZHNXaXRoKCcuTmV4dENvbmZpZycpO1xufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBrZXkgd2l0aG91dCBzdXJyb3VuZGluZyBxdW90ZXMsIHNvIGAncmVhY3RDb21waWxlcidgIG1hdGNoZXMgYHJlYWN0Q29tcGlsZXJgLlxuLy8gSWRlbnRpZmllciwgc3RyaW5nLWxpdGVyYWwgYW5kIG51bWVyaWMtbGl0ZXJhbCBuYW1lcyBhbGwgZXhwb3NlIHRoZSB1bnF1b3RlZCB2YWx1ZSB2aWEgYC50ZXh0YC5cbmZ1bmN0aW9uIGdldFByb3BlcnR5S2V5KG5hbWU6IGFzdC5Qcm9wZXJ0eU5hbWUsIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmcge1xuICByZXR1cm4gJ3RleHQnIGluIG5hbWUgJiYgdHlwZW9mIG5hbWUudGV4dCA9PT0gJ3N0cmluZycgPyBuYW1lLnRleHQgOiBuYW1lLmdldFRleHQoc291cmNlKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb21tZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9cXC9cXC9bXlxcbl0qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgJycpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeENoYWtyYVRvYXN0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4Q2hha3JhVG9hc3RlcicsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuY2hha3JhKSByZXR1cm47XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90b2FzdGVyLnt0cyx0c3h9Jywge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgaWdub3JlOiBbJyoqLy4qLyoqJywgJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRlbnQuaW5jbHVkZXMoJ0NyZWF0ZVRvYXN0ZXJSZXR1cm4nKSB8fFxuICAgICAgICAhY29udGVudC5pbmNsdWRlcyhcImZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnXCIpIHx8XG4gICAgICAgICFjb250ZW50LmluY2x1ZGVzKCdleHBvcnQgY29uc3QgdG9hc3RlciA9IGNyZWF0ZVRvYXN0ZXIoJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gY29udGVudFxuICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAvXmltcG9ydCAuKiBmcm9tICdAY2hha3JhLXVpXFwvcmVhY3QnOyQvbXUsXG4gICAgICAgICAgXCIkJlxcbmltcG9ydCB0eXBlIHsgQ3JlYXRlVG9hc3RlclJldHVybiB9IGZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnO1wiXG4gICAgICAgIClcbiAgICAgICAgLnJlcGxhY2UoJ2V4cG9ydCBjb25zdCB0b2FzdGVyID0gY3JlYXRlVG9hc3RlcignLCAnZXhwb3J0IGNvbnN0IHRvYXN0ZXI6IENyZWF0ZVRvYXN0ZXJSZXR1cm4gPSBjcmVhdGVUb2FzdGVyKCcpO1xuICAgICAgaWYgKHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZTtcbiAgbm9kZTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0czogYm9vbGVhbik6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IHVzZSA9IHRvUGFyc2VkT2JqZWN0KHtcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb24nXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSk7XG5cbiAgaWYgKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKSB7XG4gICAgdXNlLnByb3BlcnRpZXMuYmFzZVVSTCA9IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyk7XG4gICAgdXNlLm1lbWJlck9yZGVyLnVuc2hpZnQoeyBraW5kOiAncHJvcGVydHknLCBrZXk6ICdiYXNlVVJMJyB9KTtcbiAgfVxuXG4gIHJldHVybiB0b1BhcnNlZE9iamVjdCh7XG4gICAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICAgIHVzZTogeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHVzZSB9LFxuICAgIC4uLihzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0c1xuICAgICAgPyB7XG4gICAgICAgICAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgICAgICAgICBjb21tYW5kOiBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpKSxcbiAgICAgICAgICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICAgICAgICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICAgICAgICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgICAgICAgICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICBleHRyYU1lbWJlcnMsXG4gICAgbWVtYmVyT3JkZXI6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BlcnRpZXMpLm1hcCgoa2V5KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KSksXG4gICAgICAuLi5leHRyYU1lbWJlcnMubWFwKChfLCBpbmRleCk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KSksXG4gICAgXSxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBhd2FpdCBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICAvLyB3YiBkZXJpdmVzIE5FWFRfUFVCTElDX0JBU0VfVVJMIGZyb20gdGhlIHJlc29sdmVkIHBvcnQgZm9yIE5leHQuanMvdmluZXh0IGFwcHMgKHZpbmV4dFxuICAgIC8vIGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gYGRlcGVuZGluZy5uZXh0YCBjb3ZlcnMgYm90aCksIHNvIHRob3NlIG5lZWQgbm8gZGVjbGFyZWRcbiAgICAvLyB2YXJpYWJsZTsgb3RoZXIgcGFja2FnZXMgc3RpbGwgcmVxdWlyZSBhIGRlY2xhcmF0aW9uLlxuICAgIGNvbnN0IHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzID1cbiAgICAgIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZywgcGFyc2VkKSAmJlxuICAgICAgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCAoYXdhaXQgZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKSkpO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpO1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhkZWZhdWx0Q29uZmlnLCBwYXJzZWQpO1xuICAgIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKG1lcmdlZCwgZGVmYXVsdENvbmZpZyk7XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChtZXJnZWQpO1xuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeVZhbHVlKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZWQgfSwgMCk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlLnRleHQ7XG4gICAgY29uc3Qgc3RhcnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0U3RhcnQoZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGNvbnN0IGVuZCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRFbmQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBzdGFydCl9JHtuZXdPYmplY3RMaXRlcmFsfSR7b2xkQ29udGVudC5zbGljZShlbmQpfWA7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2U6IFBhcnNlZE9iamVjdCwgb3ZlcnJpZGU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IG92ZXJyaWRlUHJvcGVydHlLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhvdmVycmlkZS5wcm9wZXJ0aWVzKSk7XG4gIGNvbnN0IGV4dHJhTWVtYmVycyA9IFsuLi5iYXNlLmV4dHJhTWVtYmVycywgLi4ub3ZlcnJpZGUuZXh0cmFNZW1iZXJzXTtcbiAgLy8gS2VlcCBkZWZhdWx0LW9ubHkgbWVtYmVycyBiZWZvcmUgcGFyc2VkIG1lbWJlcnMgc28gc3ByZWFkcyBhbmQgZXhwbGljaXQgbG9jYWwgcHJvcGVydGllcyByZXRhaW4gcHJlY2VkZW5jZS5cbiAgY29uc3QgbWVtYmVyT3JkZXIgPSBbXG4gICAgLi4uYmFzZS5tZW1iZXJPcmRlci5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgIT09ICdwcm9wZXJ0eScgfHwgIW92ZXJyaWRlUHJvcGVydHlLZXlzLmhhcyhtZW1iZXIua2V5KSksXG4gICAgLi4ub3ZlcnJpZGUubWVtYmVyT3JkZXIubWFwKChtZW1iZXIpOiBPYmplY3RNZW1iZXIgPT4ge1xuICAgICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSByZXR1cm4gbWVtYmVyO1xuICAgICAgcmV0dXJuIHsga2luZDogJ2V4dHJhJywgaW5kZXg6IGJhc2UuZXh0cmFNZW1iZXJzLmxlbmd0aCArIG1lbWJlci5pbmRleCB9O1xuICAgIH0pLFxuICBdO1xuICBjb25zdCBwcm9wZXJ0aWVzID0geyAuLi5iYXNlLnByb3BlcnRpZXMgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGUucHJvcGVydGllcykpIHtcbiAgICBwcm9wZXJ0aWVzW2tleV0gPSBtZXJnZVBhcnNlZFZhbHVlKHByb3BlcnRpZXNba2V5XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB7IGV4dHJhTWVtYmVycywgbWVtYmVyT3JkZXIsIHByb3BlcnRpZXMgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRWYWx1ZShiYXNlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCwgb3ZlcnJpZGU6IFBhcnNlZFZhbHVlKTogUGFyc2VkVmFsdWUge1xuICBpZiAoYmFzZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgb3ZlcnJpZGUua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlLnZhbHVlLCBvdmVycmlkZS52YWx1ZSkgfTtcbiAgfVxuICByZXR1cm4gb3ZlcnJpZGU7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKGNvbmZpZzogUGFyc2VkT2JqZWN0LCBkZWZhdWx0Q29uZmlnOiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3QgdXNlID0gY29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBjb25zdCBkZWZhdWx0VXNlID0gZGVmYXVsdENvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgaWYgKHVzZT8ua2luZCAhPT0gJ29iamVjdCcgfHwgZGVmYXVsdFVzZT8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ3RyYWNlJywgJ3NjcmVlbnNob3QnLCAndmlkZW8nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRVc2UudmFsdWUucHJvcGVydGllc1trZXldO1xuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcGFyc2VkOiBQYXJzZWRPYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZGVwZW5kaW5nLm5leHQgfHxcbiAgICBwYXJzZWQucHJvcGVydGllcy53ZWJTZXJ2ZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgIGRvZXNPYmplY3RIYXZlQmFzZVVybChwYXJzZWQucHJvcGVydGllcy51c2UpIHx8XG4gICAgZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZCB9LCAnTkVYVF9QVUJMSUNfQkFTRV9VUkwnKVxuICApO1xufVxuXG5mdW5jdGlvbiBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwodmFsdWU6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgdmFsdWUudmFsdWUucHJvcGVydGllcy5iYXNlVVJMICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGl0ZXJhbFRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWUuaW5jbHVkZXMobGl0ZXJhbFRleHQpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5JykgcmV0dXJuIHZhbHVlLnZhbHVlLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKTtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnMuc29tZSgobWVtYmVyKSA9PiBtZW1iZXIuaW5jbHVkZXMobGl0ZXJhbFRleHQpKSB8fFxuICAgIE9iamVjdC52YWx1ZXModmFsdWUudmFsdWUucHJvcGVydGllcykuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3NpbmcgZW52IGZpbGVzIGFyZSBleHBlY3RlZCBpbiBzb21lIHJlcG9zLlxuICAgIH1cbiAgfVxuXG4gIC8vIFNvbWUgUGxheXdyaWdodCBjb25maWdzIG9ubHkgZGVmaW5lIGJyb3dzZXIgcHJvamVjdHMgb3IgZml4dHVyZXMgYW5kIGRvIG5vdFxuICAvLyBzdGFydCBhIHdlYiBhcHAuIEF2b2lkIGZvcmNpbmcgYW4gYXBwLXNlcnZlciBVUkwgaW50byB0aG9zZSBwYWNrYWdlcy5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnZGaWxlTmFtZXMgPSBbJ2Zub3gudG9tbCcsICdtaXNlLnRvbWwnLCAnbWlzZS50ZXN0LnRvbWwnXTtcbiAgY29uc3QgZW52RmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpOyA7IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKSkge1xuICAgIGVudkZpbGVQYXRocy5wdXNoKC4uLmVudkZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsIGZpbGVOYW1lKSkpO1xuXG4gICAgLy8gUGxheXdyaWdodCBjb25maWdzIG9mdGVuIGxpdmUgaW4gcGFja2FnZXMvKiB3aGlsZSBzaGFyZWQgZW52IGZpbGVzIGxpdmUgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290LCBzbyB3YWxrIHVwd2FyZCB1bnRpbCB0aGUgdGFyZ2V0IHJlcG8gYm91bmRhcnkuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCAnLmdpdCcpKSkgYnJlYWs7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGVudkZpbGVQYXRocztcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChvYmplY3Q6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgY29tbWFuZCA9IHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQ7XG4gIC8vIExpYnJhcmllcyBjYW4gdXNlIFBsYXl3cmlnaHQncyB3ZWJTZXJ2ZXIgdG8gYnVpbGQgYW5kIGxhdW5jaCBhIGZpeHR1cmUgZXZlbiB0aG91Z2ggYHdiIHN0YXJ0YFxuICAvLyBpbnRlbnRpb25hbGx5IGhhcyBubyB0ZXN0IHNlcnZlciBmb3IgdGhlIGxpYnJhcnkgaXRzZWxmLiBQcmVzZXJ2ZSB0aG9zZSBjdXN0b20gbGlmZWN5Y2xlXG4gIC8vIGNvbW1hbmRzOyBvbmx5IGFkZCB0aGUgY29tbWFuZCB3aGVuIHdiZnkgYWxyZWFkeSBvd25zIGl0LlxuICBpZiAoY29tbWFuZCAmJiAhaXNHZW5lcmF0ZWRXYlN0YXJ0VGVzdENvbW1hbmQoY29tbWFuZCkpIHJldHVybjtcblxuICAvLyBQbGF5d3JpZ2h0IHJlcXVpcmVzIGBjb21tYW5kYCB3aGVuZXZlciBgd2ViU2VydmVyYCBleGlzdHM7IGFuIGV4dGVybmFsbHkgbWFuYWdlZCBzZXJ2ZXIgc2hvdWxkXG4gIC8vIG9taXQgYHdlYlNlcnZlcmAgaW5zdGVhZC4gS2VlcCBmaWxsaW5nIHRoaXMgcmVxdWlyZWQgZmllbGQgd2hlbiBhIHBhcnRpYWwgbWFuYWdlZCBibG9jayBsYWNrcyBpdC5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKCkpO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFdiU3RhcnRUZXN0Q29tbWFuZChjb21tYW5kOiBQYXJzZWRWYWx1ZSk6IGJvb2xlYW4ge1xuICBpZiAoY29tbWFuZC5raW5kICE9PSAnbGl0ZXJhbCcpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbW1hbmQudmFsdWUudHJpbSgpID09PSBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2JTdGFydFRlc3RDb21tYW5kKCk6IHN0cmluZyB7XG4gIHJldHVybiBgJ2J1biB3YiBzdGFydCAtLW1vZGUgdGVzdCdgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIGlmIChhc3QuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBhc3QuRXhwcmVzc2lvbiwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKGFzdC5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IGxpdGVyYWwoa2V5KTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8XG4gICAgICAoIWFzdC5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIWFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpXG4gICAgKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlZC5leHRyYU1lbWJlcnMucHVzaChwcm9wZXJ0eS5nZXRUZXh0KHNvdXJjZSkpIC0gMTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAodmFsdWUudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuXG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGVtaXR0ZWRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlci5mbGF0TWFwKChtZW1iZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAnZXh0cmEnKSB7XG4gICAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdE1lbWJlcih2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnNbbWVtYmVyLmluZGV4XSA/PyAnJywgaW5kZW50KV07XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuZ2V0KG1lbWJlci5rZXkpICE9PSBpbmRleCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzW21lbWJlci5rZXldO1xuICAgIGlmICghaXRlbSB8fCBlbWl0dGVkUHJvcGVydGllcy5oYXMobWVtYmVyLmtleSkpIHJldHVybiBbXTtcbiAgICBlbWl0dGVkUHJvcGVydGllcy5hZGQobWVtYmVyLmtleSk7XG4gICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShtZW1iZXIua2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KV07XG4gIH0pO1xuICBsaW5lcy5wdXNoKFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhrZXkpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCkpXG4gICk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkobWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbWVtYmVyXSBvZiBtZW1iZXJPcmRlci5lbnRyaWVzKCkpIHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuc2V0KG1lbWJlci5rZXksIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleTogc3RyaW5nLCBpdGVtOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlciwgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgfVxuICB9XG4gIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdE1lbWJlcihtZW1iZXI6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IG1lbWJlci5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2Ygc3RyaW5naWZpZWQuZW50cmllcygpKSB7XG4gICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG50eXBlIFdpbGxCb29zdGVyT3JnYW5pemF0aW9uID0gJ1dpbGxCb29zdGVyJyB8ICdXaWxsQm9vc3RlckxhYic7XG50eXBlIFJlcG9zaXRvcnlGdWxsTmFtZSA9IGAke1dpbGxCb29zdGVyT3JnYW5pemF0aW9ufS8ke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZub3hSZXBvc2l0b3J5U2NvcGUge1xuICBvcmdhbml6YXRpb25zPzogcmVhZG9ubHkgV2lsbEJvb3N0ZXJPcmdhbml6YXRpb25bXTtcbiAgcmVwb3NpdG9yaWVzPzogcmVhZG9ubHkgUmVwb3NpdG9yeUZ1bGxOYW1lW107XG4gIC8vIFJlc3RyaWN0cyB0aGUgc2NvcGUgdG8gcmVwb3NpdG9yaWVzIG9mIHRoZSBnaXZlbiB2aXNpYmlsaXR5LiBQdWJsaWMgcmVwb3NpdG9yaWVzIHB1Ymxpc2ggdGhlaXJcbiAgLy8gY2lwaGVydGV4dHMgdG8gdGhlIHdvcmxkLCBzbyB0aGV5IG11c3QgdXNlIGEgQ0kgaWRlbnRpdHkgc2VwYXJhdGUgZnJvbSB0aGUgb3JnLWludGVybmFsIG9uZTpcbiAgLy8gbGVha2luZyBlaXRoZXIgQ0kga2V5IG11c3Qgbm90IGV4cG9zZSB0aGUgb3RoZXIgc2lkZSdzIHNlY3JldHMuXG4gIHZpc2liaWxpdHk/OiAncHVibGljJyB8ICdwcml2YXRlJztcbn1cblxuaW50ZXJmYWNlIEZub3hBZ2VQcmluY2lwYWwge1xuICBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpY0tleXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZXBvc2l0b3J5U2NvcGU6IEZub3hSZXBvc2l0b3J5U2NvcGU7XG4gIC8vIE1hcmtzIHRoZSBwcmluY2lwYWwgYXMgYSBDSSBpZGVudGl0eSBhbmQgbmFtZXMgdGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyBpdHMgcHJpdmF0ZSBrZXkuXG4gIC8vIEV2ZXJ5IGZub3gtbWFuYWdlZCByZXBvc2l0b3J5IG11c3QgcmVzb2x2ZSBvbmUgKGdlbmVyYXRlRm5veFRvbWwgZmFpbHMgY2xvc2VkIG90aGVyd2lzZTogYVxuICAvLyByb3N0ZXIgd2l0aG91dCBhIENJIHJlY2lwaWVudCB3b3VsZCByZS1lbmNyeXB0IHNlY3JldHMgdGhhdCBDSSBjYW4gbmV2ZXIgZGVjcnlwdCBhZ2FpbiksIGFuZFxuICAvLyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yIGRlcml2ZXMgaXRzIGNhbGxlciBtYXBwaW5ncyBmcm9tIHRoZSBzYW1lIHJlc29sdXRpb24gc28gdGhlIHR3byBjYW5cbiAgLy8gbmV2ZXIgZGlzYWdyZWUgb24gd2hpY2ggQ0kgaWRlbnRpdHkgYXBwbGllcy5cbiAgY2lBZ2VLZXlTZWNyZXROYW1lPzogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWSc7XG59XG5cbmludGVyZmFjZSBGbm94QWdlUmVjaXBpZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwdWJsaWNLZXk6IHN0cmluZztcbn1cblxuLy8gVGhlIGFnZSBwcmluY2lwYWxzIGF1dGhvcml6ZWQgdG8gZGVjcnlwdCBlYWNoIGZub3gtbWFuYWdlZCByZXBvc2l0b3J5LiBUbyBncmFudCBhY2Nlc3MsIGFkZCB0aGVcbi8vIHByaW5jaXBhbCdzIHB1YmxpYyBrZXlzIGFuZCByZXBvc2l0b3J5IHNjb3BlIGhlcmUuIE9yZ2FuaXphdGlvbiBzY29wZXMgaW5jbHVkZSBldmVyeSBjdXJyZW50IGFuZFxuLy8gZnV0dXJlIHJlcG9zaXRvcnkgaW4gdGhhdCBvcmdhbml6YXRpb247IHVzZSByZXBvc2l0b3JpZXMgZm9yIGV4YWN0IG93bmVyL3JlcG9zaXRvcnkgZ3JhbnRzLiBUaGVcbi8vIG5leHQgd2JmeSBydW4gb24gZWFjaCBtYXRjaGluZyByZXBvc2l0b3J5IHJld3JpdGVzIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sIGFuZCByZS1lbmNyeXB0cyBpdHNcbi8vIGNvbW1pdHRlZCBzZWNyZXRzIGZvciB0aGUgcmVzdWx0aW5nIHJlY2lwaWVudCBzZXQuIEEgc2NvcGUncyBvcHRpb25hbCB2aXNpYmlsaXR5IGNvbnN0cmFpbnRcbi8vIHNlbGVjdHMgb25seSBwdWJsaWMgb3Igb25seSBwcml2YXRlIHJlcG9zaXRvcmllcyAodXNlZCB0byBrZWVwIHRoZSBvcmctaW50ZXJuYWwgYW5kIHRoZVxuLy8gcHVibGljLXJlcG9zaXRvcnkgQ0kgaWRlbnRpdGllcyBhcGFydCkuIFJlbW92aW5nIGEgc2NvcGUgY2Fubm90IHJldm9rZSBjaXBoZXJ0ZXh0XG4vLyBhbHJlYWR5IGF2YWlsYWJsZSBmcm9tIEdpdCBoaXN0b3J5LCBzbyByb3RhdGUgdGhlIHNlY3JldCB2YWx1ZXMgdGhhdCBwcmluY2lwYWwgY291bGQgZGVjcnlwdC5cbi8vIE9ubHkgcHVibGljIGtleXMgbWF5IGFwcGVhciBoZXJlOyBhIENJIGlkZW50aXR5J3MgcHJpdmF0ZSBrZXkgc3VwcGxpZXMgdGhlIEZOT1hfQUdFX0tFWSAob3IsXG4vLyBmb3IgcHVibGljIHJlcG9zaXRvcmllcywgUFVCTElDX0ZOT1hfQUdFX0tFWSkgb3JnYW5pemF0aW9uIHNlY3JldC5cbmV4cG9ydCBjb25zdCBGTk9YX0FHRV9QUklOQ0lQQUxTID0gW1xuICB7XG4gICAgbmFtZTogJ2V4a2F6dXUnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWoyMzU0eGh2bTNmdjl5Nzd0NWc2eTNxOG1leGdrMm1mMDB0Z3JremdwNzN0eW5ydno1NXM4YXVheXcnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncG9uaGFydScsXG4gICAgcHVibGljS2V5czogW1xuICAgICAgJ2FnZTE4cnVnbGRmOWh0YzZ1bTVlcGxweDI3azUzZXA0em4wbGh6d2ZmZ254emhycTBjN3pndnlxM3pjY2R5JyxcbiAgICAgICdhZ2Uxbnoybjk5Y3JqcjducDl4amdsd2ZmZmMzZHVkNDVkaGV3cXpxZnpwenRrZHd1NGhqNzRncTZlbDUzMycsXG4gICAgXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICAvLyBUaGUgb3JnLWludGVybmFsIENJIGlkZW50aXR5ICh0aGUgRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2IudHh0KS5cbiAgICBuYW1lOiAnY2knLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWEyYzZlZjZhaGw2bW1raGdxdHhnMG1ndGQ3eXNzcG50cTdyeHVzdjI2ZWZ4aG51aGxjZHNyOWRwYWsnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddLCB2aXNpYmlsaXR5OiAncHJpdmF0ZScgfSxcbiAgICBjaUFnZUtleVNlY3JldE5hbWU6ICdGTk9YX0FHRV9LRVknLFxuICB9LFxuICB7XG4gICAgLy8gVGhlIENJIGlkZW50aXR5IGRlZGljYXRlZCB0byBwdWJsaWMgcmVwb3NpdG9yaWVzICh0aGUgUFVCTElDX0ZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb25cbiAgICAvLyBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2ItcHVibGljLnR4dCkuIFNjb3BlZCB0byBXaWxsQm9vc3RlciBvbmx5IGJlY2F1c2UgdGhlXG4gICAgLy8gUFVCTElDX0ZOT1hfQUdFX0tFWSBzZWNyZXQgaXMgcmVnaXN0ZXJlZCBpbiB0aGF0IG9yZ2FuaXphdGlvbiBhbG9uZTsgYSBwdWJsaWNcbiAgICAvLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5IHJlc29sdmVzIE5PIENJIGlkZW50aXR5IGFuZCBnZW5lcmF0ZUZub3hUb21sIGZhaWxzIGNsb3NlZCBvbiBpdFxuICAgIC8vIChXaWxsQm9vc3RlckxhYiBkb2VzIG93biBwdWJsaWMgcmVwb3NpdG9yaWVzLCBlLmcuIGl0cyByZXVzYWJsZS13b3JrZmxvd3Mgc3luYyBtaXJyb3IsIGJ1dFxuICAgIC8vIG5vbmUgb2YgdGhlbSB1c2UgZm5veCDigJQgcmVnaXN0ZXIgdGhlIHNlY3JldCB0aGVyZSBhbmQgZXh0ZW5kIHRoaXMgc2NvcGUgaWYgb25lIGV2ZXIgZG9lcykuXG4gICAgbmFtZTogJ2NpLXB1YmxpYycsXG4gICAgcHVibGljS2V5czogWydhZ2UxZmhlYTg1eGp3cDg5bHdxM2pjbndqMzJzd2gzdjI0cHdwYXJxaDVsN3FrZ3ZjNGF4M3AwcWw2ZHUzNiddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJ10sIHZpc2liaWxpdHk6ICdwdWJsaWMnIH0sXG4gICAgY2lBZ2VLZXlTZWNyZXROYW1lOiAnUFVCTElDX0ZOT1hfQUdFX0tFWScsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncmVtaW4nLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW13NHB6OWR1ank5ZG1oazBwYWxxYXdqa2o3bTRrN3p4Nzh5cjlmanQ2M3NhNWwzZTQzdXE2bncwMDQnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYXJpZXMnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW5uMGVoeWFlbnlxOGttbnE0Mjk0a3p6Z3h2NWRuZjZwZXAyY2RrcmF4emZxbGs3eGdzcnFxbjZubjknXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogW1xuICAgICAgICAnV2lsbEJvb3N0ZXIvYWdlbnQtY2hhbGxlbmdlcycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9hZ2VudGljLXdvcmtmbG93cy1kYXNoYm9hcmQnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvY2hlZXJsaW5ncycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL3Byb21wdC1zdHVkeScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9leGVyY29kZScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9qdWRnZScsXG4gICAgICBdLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnc3VuYWdhJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTF1bHh6bjZ5NjhrdTM0Y3B4NWZ5YTVnZjdybnJ3ejB1ZmxueWU2dXh1aGczNHAybmpoZ2txbWc3M2c0J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFsnV2lsbEJvb3N0ZXIvYWktb2NyJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdheWFtZScsXG4gICAgcHVibGljS2V5czogWydhZ2UxdnhtMmdzMDAzcnV3bThwNmgzaHY3eGFzanUyczhrNG14bWMzNHptNmdyZHd6bnJzMDlucTZ4ejV2eiddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbJ1dpbGxCb29zdGVyL2FpLW9jcicsICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IEZub3hBZ2VQcmluY2lwYWxbXTtcblxuaW50ZXJmYWNlIEZub3hUb21sIHtcbiAgaW1wb3J0PzogdW5rbm93bjtcbiAgcHJvdmlkZXJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+O1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxubGV0IGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG5sZXQgbWlncmF0aW9uTWFya2VyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG5cbi8qKiBXaGV0aGVyIGFueSBmbm94IHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gZmFpbGVkIGluIHRoZSBjdXJyZW50IHJlcG9zaXRvcnk7IHNldHVwU2VjcmV0cyBtdXN0IG5vdCB1cGxvYWQgdGhlbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGbm94U3luY0ZhaWxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZub3hTeW5jRmFpbGVkO1xufVxuXG4vKipcbiAqIFN5bmNocm9uaXplcyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gZXZlcnkgZm5veC50b21sIHdpdGggdGhlIHByaW5jaXBhbHMgYXV0aG9yaXplZCBmb3IgdGhpc1xuICogcmVwb3NpdG9yeSBhbmQgcmUtZW5jcnlwdHMgdGhlIGNvbW1pdHRlZCBzZWNyZXRzIHdoZW4gdGhlIHJlY2lwaWVudCBzZXQgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRm5veFRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGhlIGZhaWx1cmUgZmxhZyBpcyBwZXIgcmVwb3NpdG9yeTogd2JmeSBjYW4gcHJvY2VzcyBtdWx0aXBsZSB3b3JraW5nIGRpcmVjdG9yaWVzIGluIG9uZVxuICAgIC8vIGludm9jYXRpb24sIGFuZCBhbiBlYXJsaWVyIHJlcG9zaXRvcnkncyBmYWlsdXJlIG11c3Qgbm90IHZldG8gYSBsYXRlciByZXBvc2l0b3J5J3MgdXBsb2FkLlxuICAgIGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG4gICAgLy8gQSByZXBvc2l0b3J5IG91dHNpZGUgV2lsbEJvb3N0ZXIvV2lsbEJvb3N0ZXJMYWIgbWFuYWdlcyBpdHMgb3duIHJlY2lwaWVudCBzZXQgKGUuZy4gYVxuICAgIC8vIHBlcnNvbmFsIHJlcG9zaXRvcnkgd2l0aCBpdHMgb3duIENJIGlkZW50aXR5KSwgc28gcmV3cml0aW5nIGl0IHRvIHRoZSBvcmcgcm9zdGVyIHdvdWxkIGdyYW50XG4gICAgLy8gb3JnIG1lbWJlcnMgYWNjZXNzIGFuZCByZS1lbmNyeXB0IHNlY3JldHMgZm9yIGEgQ0kga2V5IHRoYXQgcmVwb3NpdG9yeSBkb2VzIG5vdCB1c2UuXG4gICAgLy8gc2V0dXBTZWNyZXRzIG5ldmVyIHVwbG9hZHMgc2VjcmV0cyBmb3Igc3VjaCByZXBvc2l0b3JpZXMgZWl0aGVyLCBzbyBza2lwIGVudGlyZWx5LlxuICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbykgcmV0dXJuO1xuICAgIGNvbnN0IGFnZVJlY2lwaWVudHMgPSBnZXRGbm94QWdlUmVjaXBpZW50cyhyb290Q29uZmlnKTtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIEEgbmVzdGVkLW9ubHkgZm5veCBsYXlvdXQgaXMgdW5zdXBwb3J0ZWQ6IHNldHVwU2VjcmV0cyB3b3VsZCB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmRcbiAgICAgIC8vIGRlbGV0ZSBGTk9YX0FHRV9LRVkgZXZlbiB0aG91Z2ggdGhlIG5lc3RlZCBjb25maWcncyBDSSBzdGlsbCBuZWVkcyBpdC5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIE9ubHkgYWdlLXVzaW5nIGNvbmZpZ3MgY2FycnkgdGhhdCByaXNrLiBXaXRob3V0IGEgcm9vdCBwcm92aWRpbmcgdGhlIGFnZSBwcm92aWRlciwgYVxuICAgICAgICAvLyBzdHJheSBjb25maWcgdGhhdCBkZWNsYXJlcyBub25lIHVzZXMgbm8gYWdlIGVuY3J5cHRpb24gYXQgYWxsIChlLmcuIGEgcGxhaW50ZXh0IHRlc3RcbiAgICAgICAgLy8gZml4dHVyZSBvciBleGFtcGxlIGNvbmZpZyBhbnkgcmVwb3NpdG9yeSBtYXkgbGVnaXRpbWF0ZWx5IGNvbW1pdCksIHNvIGl0IG5laXRoZXIgbmVlZHNcbiAgICAgICAgLy8gcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBub3Igb3ducyBhbiBGTk9YX0FHRV9LRVkgYW5kIG11c3Qgbm90IGJsb2NrIHRoZSBydW4uXG4gICAgICAgIGNvbnN0IHN0cmF5RmlsZVBhdGhzID0gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoKS5maWx0ZXIoKGZpbGVQYXRoKSA9PlxuICAgICAgICAgIGRlY2xhcmVzRm5veEFnZVByb3ZpZGVyKGZpbGVQYXRoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoc3RyYXlGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggY29uZmlncyBleGlzdCB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWw6ICR7c3RyYXlGaWxlUGF0aHMuam9pbignLCAnKX0uIEFkZCBhIHJvb3QgZm5veC50b21sLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGYWlsIGNsb3NlZDogd2l0aG91dCBnaXQgaW5mb3JtYXRpb24gYSBuZXN0ZWQtb25seSBmbm94IGxheW91dCBjYW5ub3QgYmUgcnVsZWQgb3V0LCBhbmRcbiAgICAgICAgLy8gc2V0dXBTZWNyZXRzIHdvdWxkIG90aGVyd2lzZSB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmQgZGVsZXRlIEZOT1hfQUdFX0tFWS5cbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY2hlY2sgZm9yIG5lc3RlZCBmbm94IGNvbmZpZ3MgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3J9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIGZhaWxlZCB2aXNpYmlsaXR5IGxvb2t1cCBjb2xsYXBzZXMgaXNQdWJsaWNSZXBvIHRvIGZhbHNlLCB3aGljaCB3b3VsZCBzaWxlbnRseSByZS1lbmNyeXB0XG4gICAgLy8gYSBwdWJsaWMgcmVwb3NpdG9yeSdzIHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzIHRvIHRoZSBvcmctaW50ZXJuYWwgQ0kgaWRlbnRpdHkgKGFuZCB2aWNlXG4gICAgLy8gdmVyc2EgZHJvcCB0aGUgcHVibGljIG9uZSkuIEZhaWwgaW5zdGVhZCBvZiBndWVzc2luZyB3aGVuZXZlciB2aXNpYmlsaXR5IGNoYW5nZXMgdGhlIHJvc3Rlci5cbiAgICBpZiAoIXJvb3RDb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duICYmIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KHJvb3RDb25maWcpKSB7XG4gICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIHRoZSB2aXNpYmlsaXR5IG9mICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChHaXRIdWIgbG9va3VwIGZhaWxlZCkgYW5kIHRoZSBDSSByZWNpcGllbnQgZGVwZW5kcyBvbiBpdC4gQ2hlY2sgbmV0d29yayBhbmQgZ2ggYXV0aGVudGljYXRpb24sIHRoZW4gcmVydW4gd2JmeS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBCb3RoIENJIGlkZW50aXRpZXMgYXJlIHZpc2liaWxpdHktY29uc3RyYWluZWQsIHNvIGEgcmVwb3NpdG9yeSBjYW4gZmFsbCB0aHJvdWdoIEJPVEggKGUuZy4gYVxuICAgIC8vIHB1YmxpYyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5LCB3aG9zZSBvcmdhbml6YXRpb24gaGFzIG5vIFBVQkxJQ19GTk9YX0FHRV9LRVkgc2VjcmV0KS5cbiAgICAvLyBSZS1lbmNyeXB0aW5nIGZvciBhIHJvc3RlciB3aXRob3V0IGEgQ0kgaWRlbnRpdHkgd291bGQgbGVhdmUgQ0kgdW5hYmxlIHRvIGRlY3J5cHQgYW55dGhpbmcsXG4gICAgLy8gZmFpbGluZyBvbmx5IGF0IHJ1bnRpbWUgaW4gQWN0aW9uczsgZmFpbCBsb3VkbHkgaGVyZSBpbnN0ZWFkLlxuICAgIGlmICghcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUocm9vdENvbmZpZykpIHtcbiAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2Ugbm8gQ0kgaWRlbnRpdHkgaXMgc2NvcGVkIHRvICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IChwdWJsaWMgcmVwb3NpdG9yaWVzIGFyZSBzdXBwb3J0ZWQgb25seSBpbiB0aGUgV2lsbEJvb3N0ZXIgb3JnYW5pemF0aW9uKS4gUHJvdmlzaW9uIHRoZSBtYXRjaGluZyBvcmdhbml6YXRpb24gc2VjcmV0IGFuZCBleHRlbmQgdGhlIENJIHNjb3BlcyBpbiB3YmZ5IGZpcnN0LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSBtaWdyYXRpb24gaXMgdHJhbnNhY3Rpb25hbCBvdmVyIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sOiByZXJ1bnMgbXVzdCByZXRyeSBmcm9tIHRoZVxuICAgIC8vIG9yaWdpbmFsIHN0YXRlLCBhbmQgYSBwYXJ0aWFsbHkgbWlncmF0ZWQgdHJlZSBjb3VsZCBvdGhlcndpc2UgYmVjb21lIHVuZGVjcnlwdGFibGUgZm9yIHRoZVxuICAgIC8vIGlkZW50aXR5IHBlcmZvcm1pbmcgYSBsYXRlciByZXRyeSAoZS5nLiB3aGVuIGEgcmVjaXBpZW50IGlzIGJlaW5nIHJlbW92ZWQpLlxuICAgIGNvbnN0IHNuYXBzaG90cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgLy8gQSBmYWlsZWQgc3luY2hyb25pemF0aW9uIG11c3QgZmFpbCB0aGUgd2hvbGUgd2JmeSBydW46IGV4aXRpbmcgemVybyB3aXRoIHN0YWxlIHJlY2lwaWVudHNcbiAgICAvLyB3b3VsZCBsZWF2ZSBzZWNyZXRzIHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzIHdoaWxlIGxvb2tpbmcgc3VjY2Vzc2Z1bC5cbiAgICB0cnkge1xuICAgICAgLy8gQW55IGZub3ggY29uZmlnIChpbmNsdWRpbmcgYWxpYXNlcyBhbmQgbG9jYWwgb3ZlcnJpZGVzKSBpbiBhbiBhbmNlc3RvciBkaXJlY3Rvcnkgd291bGRcbiAgICAgIC8vIG1lcmdlIGludG8gKGFuZCBwb3NzaWJseSBiZSBSRVdSSVRURU4gYnkpIHRoaXMgcmVwb3NpdG9yeSdzIGBmbm94IHJlZW5jcnlwdGAgdGhyb3VnaFxuICAgICAgLy8gaGllcmFyY2hpY2FsIGxvYWRpbmcsIHVzaW5nIHRoaXMgcmVwb3NpdG9yeSdzIHJlY2lwaWVudCBzZXQgZm9yIGZvcmVpZ24gc2VjcmV0cy5cbiAgICAgIGZvciAobGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUocm9vdERpclBhdGgpOyA7IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JGbm94RmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpO1xuICAgICAgICBpZiAoYW5jZXN0b3JGbm94RmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBhbiBhbmNlc3RvciBkaXJlY3RvcnkgY29udGFpbnMgZm5veCBjb25maWdzIHRoYXQgZm5veCB3b3VsZCBoaWVyYXJjaGljYWxseSBtZXJnZSBhbmQgcmV3cml0ZTogJHthbmNlc3RvckZub3hGaWxlTmFtZXNcbiAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX0uIFJlbW92ZSB0aGVtIG9yIG1vdmUgdGhlIHJlcG9zaXRvcnkuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmRpcm5hbWUoZGlyUGF0aCkgPT09IGRpclBhdGgpIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gZm5veCBhbHNvIGxvYWRzIGNvbW1pdHRlZCBjb25maWcgYWxpYXNlcyB0aGlzIGdlbmVyYXRvciBjYW5ub3Qga2VlcCBpbiBzeW5jLlxuICAgICAgY29uc3QgZm5veExpa2VGaWxlUGF0aHMgPSBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGgpO1xuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRGaWxlUGF0aHMgPSBmbm94TGlrZUZpbGVQYXRocy5maWx0ZXIoKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSAhPT0gJ2Zub3gudG9tbCcpO1xuICAgICAgaWYgKHVuc3VwcG9ydGVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIG9ubHkgZm5veC50b21sIGZpbGVzIGFyZSBzdXBwb3J0ZWQ6ICR7dW5zdXBwb3J0ZWRGaWxlUGF0aHMuam9pbignLCAnKX0uIE1lcmdlIHRoZW0gaW50byB0aGUgYWRqYWNlbnQgZm5veC50b21sLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGlyUGF0aHMgPSBsaXN0Rm5veFRvbWxEaXJQYXRocyhmbm94TGlrZUZpbGVQYXRocyk7XG4gICAgICBpZiAoIWRpclBhdGhzLmluY2x1ZGVzKHJvb3REaXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKX0gaXMgaW52aXNpYmxlIHRvIGdpdCAoZ2l0aWdub3JlZD8pLiBDb21taXQgaXQgb3IgcmVtb3ZlIGl0LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gR2l0LWJhc2VkIGRpc2NvdmVyeSBjYW5ub3Qgc2VlIGdpdGlnbm9yZWQgZmlsZXMsIHNvIGFsc28gaW5zcGVjdCBldmVyeSBkaXJlY3RvcnkgaW4gZWFjaFxuICAgICAgLy8gbWFuYWdlZCBjb25maWcncyBoaWVyYXJjaHkgdGhyb3VnaCB0aGUgZmlsZXN5c3RlbTogYSBnaXRpZ25vcmVkIGFsaWFzIChlLmcuIC5mbm94LnRvbWwpXG4gICAgICAvLyBvciBhIGdpdGlnbm9yZWQgZm5veC50b21sIGluIGFuIGludGVybWVkaWF0ZSBkaXJlY3Rvcnkgd291bGQgc3RpbGwgYmUgbG9hZGVkIGJ5IGZub3ggYW5kXG4gICAgICAvLyBjb3VsZCBvdmVycmlkZSB0aGUgcHJvdmlkZXIgdXNlZCBmb3IgbmVzdGVkIHJlLWVuY3J5cHRpb24uXG4gICAgICBjb25zdCBtYW5hZ2VkRGlyUGF0aHMgPSBuZXcgU2V0KGRpclBhdGhzKTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBmb3IgKGNvbnN0IGhpZXJhcmNoeURpclBhdGggb2YgbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aCwgcm9vdERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3Qgc3RyYXlGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoaGllcmFyY2h5RGlyUGF0aCkuZmlsdGVyKFxuICAgICAgICAgICAgKG5hbWUpID0+IG5hbWUgIT09ICdmbm94LmxvY2FsLnRvbWwnICYmICEobmFtZSA9PT0gJ2Zub3gudG9tbCcgJiYgbWFuYWdlZERpclBhdGhzLmhhcyhoaWVyYXJjaHlEaXJQYXRoKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzdHJheUZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggd291bGQgbG9hZCB1bm1hbmFnZWQgKGdpdGlnbm9yZWQ/KSBjb25maWdzOiAke3N0cmF5RmlsZU5hbWVzXG4gICAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGhpZXJhcmNoeURpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpfS4gQ29tbWl0IHRoZW0gYXMgZm5veC50b21sIG9yIHJlbW92ZSB0aGVtLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEEgZm5veC5sb2NhbC50b21sIGFueXdoZXJlIGluIHRoZSBtZXJnZWQgaGllcmFyY2h5IChub3Qgb25seSBuZXh0IHRvIGEgbWFuYWdlZFxuICAgICAgICAgIC8vIGNvbmZpZykgY2FuIG92ZXJyaWRlIHByb3ZpZGVycy5cbiAgICAgICAgICBjb25zdCBsb2NhbElzc3VlID0gZmluZEZub3hMb2NhbFRvbWxJc3N1ZShoaWVyYXJjaHlEaXJQYXRoKTtcbiAgICAgICAgICBpZiAobG9jYWxJc3N1ZSkge1xuICAgICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2xvY2FsSXNzdWV9LiBLZWVwIG9ubHkgbWFjaGluZS1sb2NhbCBzZWNyZXQgb3ZlcnJpZGVzIHRoZXJlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW4tbWVtb3J5IHNuYXBzaG90cyBkbyBub3Qgc3Vydml2ZSBhIGtpbGxlZCBwcm9jZXNzLCBzbyBhIGR1cmFibGUgbWFya2VyIGlzIHdyaXR0ZW5cbiAgICAgIC8vIGJlZm9yZSB0aGUgZmlyc3QgbXV0YXRpb24gYW5kIHJlbW92ZWQgb25seSB3aGVuIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQgYWdhaW4uIEEgbGVmdG92ZXJcbiAgICAgIC8vIG1hcmtlciBtZWFucyBhIHByZXZpb3VzIHJ1biB3YXMga2lsbGVkIG1pZC1taWdyYXRpb24gKG9yIGNvdWxkIG5vdCByZXN0b3JlKTogc29tZVxuICAgICAgLy8gY2lwaGVydGV4dHMgbWF5IG5vdCBtYXRjaCB0aGUgcmVjaXBpZW50cywgb3IgbWF5IGV2ZW4gYmUgdW5kZWNyeXB0YWJsZSBmb3IgdGhlIGV4ZWN1dG9yJ3NcbiAgICAgIC8vIGlkZW50aXR5IHdoZW4gYSByZWNpcGllbnQgd2FzIGJlaW5nIHJlbW92ZWQg4oCUIHN0YXRlcyB0aGlzIGNvZGUgY2Fubm90IHJlcGFpciBzYWZlbHlcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHdvcmtpbmcgdHJlZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIChicmFuY2ggc3dpdGNoZXMsIG1hbnVhbCBlZGl0cykuIFRoZVxuICAgICAgLy8gZm5veC50b21sIGZpbGVzIGFyZSBnaXQtdHJhY2tlZCwgc28gdGhlIHVzZXIgcmVzdG9yZXMgdGhlbSB2aWEgZ2l0IGFuZCBjbGVhcnMgdGhlIG1hcmtlci5cbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICcudG1wJywgJ3diZnktZm5veC1taWdyYXRpb24tbWFya2VyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgYSBwcmV2aW91cyBtaWdyYXRpb24gd2FzIGludGVycnVwdGVkLiBSZXN0b3JlIHRoZSBmbm94LnRvbWwgZmlsZXMgdmlhIGdpdCAoZS5nLiBcXGBnaXQgc3RhdHVzXFxgIGFuZCBcXGBnaXQgcmVzdG9yZSAtLSAnKmZub3gqLnRvbWwnXFxgIGlmIHlvdSBoYXZlIG5vIGludGVudGlvbmFsIGxvY2FsIGNoYW5nZXMpLCB0aGVuIGRlbGV0ZSAke21pZ3JhdGlvbk1hcmtlclBhdGh9IGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHRyYWNrZWQgc3ltbGluayBuYW1lZCBmbm94LnRvbWwgKG9yIGEgc3ltbGlua2VkIHBhcmVudCBkaXJlY3RvcnkpIHdvdWxkIG1ha2UgdGhlXG4gICAgICAvLyByZXdyaXRlIGFuZCBgZm5veCByZWVuY3J5cHRgIHJlYWQgYW5kIE1PRElGWSBmaWxlcyBvdXRzaWRlIHRoaXMgcmVwb3NpdG9yeS5cbiAgICAgIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAgICAgY29uc3QgcmVhbFBhdGggPSBmcy5yZWFscGF0aFN5bmMoZm5veFRvbWxQYXRoKTtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmbm94VG9tbFBhdGgpLmlzU3ltYm9saWNMaW5rKCkgfHwgIXJlYWxQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtmbm94VG9tbFBhdGh9IGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5ICgke3JlYWxQYXRofSkuIFJlcGxhY2UgaXQgd2l0aCBhIHJlZ3VsYXIgaW4tcmVwb3NpdG9yeSBmaWxlLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzbmFwc2hvdHMuc2V0KGZub3hUb21sUGF0aCwgZnMucmVhZEZpbGVTeW5jKGZub3hUb21sUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNvcnRlZCBvcmRlciBwcm9jZXNzZXMgYW5jZXN0b3JzIGJlZm9yZSBkZXNjZW5kYW50cywgc28gY29uZmlncyBpbmhlcml0aW5nIGFuIHVwZGF0ZWRcbiAgICAgIC8vIHByb3ZpZGVyIHJlLWVuY3J5cHQgYWdhaW5zdCB0aGUgYWxyZWFkeS11cGRhdGVkIHJlY2lwaWVudHMuXG4gICAgICBjb25zdCBjaGFuZ2VkRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBsZXQgYW55RmFpbGVkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JDaGFuZ2VkID0gY2hhbmdlZERpclBhdGhzLnNvbWUoKGNoYW5nZWREaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoY2hhbmdlZERpclBhdGggKyBwYXRoLnNlcCkpO1xuICAgICAgICAvLyBFdmVyeSBkaXJQYXRoIHdhcyBzbmFwc2hvdHRlZCBhYm92ZS4gQSBtaXNzaW5nIHNuYXBzaG90IG11c3QgZmFpbCBoYXJkOiBmYWxsaW5nIGJhY2sgdG9cbiAgICAgICAgLy8gYW4gZW1wdHkgc3RyaW5nIHdvdWxkIGZsb3cgaW50byByZXBsYWNlQWdlUmVjaXBpZW50cyBhbmQgb3ZlcndyaXRlIHRoZSByZWFsIGZub3gudG9tbFxuICAgICAgICAvLyB3aXRoIGEgcmVjaXBpZW50cy1vbmx5IGZpbGUsIGRlc3Ryb3lpbmcgZXZlcnkgY29tbWl0dGVkIHNlY3JldC5cbiAgICAgICAgY29uc3Qgc25hcHNob3RDb250ZW50ID0gc25hcHNob3RzLmdldChwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICAgICAgaWYgKHNuYXBzaG90Q29udGVudCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZm5veC50b21sIHNuYXBzaG90IGZvciAke2RpclBhdGh9LmApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICAgICAgICAgIGRpclBhdGgsXG4gICAgICAgICAgcm9vdERpclBhdGgsXG4gICAgICAgICAgZGlyUGF0aCA9PT0gcm9vdERpclBhdGgsXG4gICAgICAgICAgYW5jZXN0b3JDaGFuZ2VkLFxuICAgICAgICAgIHNuYXBzaG90Q29udGVudCxcbiAgICAgICAgICBhZ2VSZWNpcGllbnRzXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09ICdjaGFuZ2VkJykgY2hhbmdlZERpclBhdGhzLnB1c2goZGlyUGF0aCk7XG4gICAgICAgIGFueUZhaWxlZCB8fD0gcmVzdWx0ID09PSAnZmFpbGVkJztcbiAgICAgIH1cbiAgICAgIGlmIChhbnlGYWlsZWQpIHtcbiAgICAgICAgLy8gQSBmYWlsZWQgcmUtZW5jcnlwdGlvbiBtYXkgaGF2ZSByZXdyaXR0ZW4gc29tZSBjaXBoZXJ0ZXh0cywgc28gcmVzdG9yZSB1bmNvbmRpdGlvbmFsbHkuXG4gICAgICAgIC8vIFRoZSBtYXJrZXIgaXMgcmVtb3ZlZCBvbmx5IHdoZW4gcmVzdG9yYXRpb24gZnVsbHkgc3VjY2VlZGVkIGFuZCB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LlxuICAgICAgICAvLyBSZXN0b3JlIE9OTFkgd2hlbiB0aGlzIHJ1biBvd25zIHRoZSBtYXJrZXI6IGV2ZXJ5IGNvbW1pdHRlZC1jb25maWcgbXV0YXRpb24gaGFwcGVuc1xuICAgICAgICAvLyBhZnRlciBtYXJrZXIgYWNxdWlzaXRpb24sIHNvIGEgbm9uLW93bmVyIChlLmcuIGxvc2luZyBhIHJhY2UgYWdhaW5zdCBhIGNvbmN1cnJlbnQgd2JmeSlcbiAgICAgICAgLy8gaGFzIGNoYW5nZWQgbm90aGluZyBhbmQgbXVzdCBub3Qgb3ZlcndyaXRlIHRoZSBvd25lcidzIGluLXByb2dyZXNzIG1pZ3JhdGlvbi5cbiAgICAgICAgaWYgKG1pZ3JhdGlvbk1hcmtlck93bmVkICYmIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzKSkgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChtaWdyYXRpb25NYXJrZXJPd25lZCAmJiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90cykpIHtcbiAgICAgICAgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH1cbiAgICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIGlzUm9vdDogYm9vbGVhbixcbiAgYW5jZXN0b3JSZWNpcGllbnRzQ2hhbmdlZDogYm9vbGVhbixcbiAgb3JpZ2luYWxDb250ZW50OiBzdHJpbmcsXG4gIGFnZVJlY2lwaWVudHM6IHJlYWRvbmx5IEZub3hBZ2VSZWNpcGllbnRbXVxuKTogUHJvbWlzZTwnY2hhbmdlZCcgfCAndW5jaGFuZ2VkJyB8ICdmYWlsZWQnPiB7XG4gIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJyk7XG5cbiAgLy8gUmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBvbmx5IHVuZGVyc3RhbmRzIHRoZSBzdGFuZGFyZCBzaW5nbGUtZmlsZSBsYXlvdXQgd2l0aCBvbmVcbiAgLy8gdG9wLWxldmVsIGFnZSBwcm92aWRlciBuYW1lZCBgYWdlYC4gR2l0aWdub3JlZCBjb25maWcgYWxpYXNlcyAoZS5nLiAuZm5veC5sb2NhbC50b21sKSB0aGF0XG4gIC8vIGdpdC1iYXNlZCBkaXNjb3ZlcnkgY2Fubm90IHNlZSwgaW1wb3J0cywgZGlmZmVyZW50bHkgbmFtZWQgYWdlIHByb3ZpZGVycywgb3IgcHJvdmlkZXJcbiAgLy8gb3ZlcnJpZGVzIHdvdWxkIGtlZXAgdXNpbmcgcmVjaXBpZW50IHNldHMgdGhpcyBnZW5lcmF0b3IgZG9lcyBub3QgcmV3cml0ZSwgc28gdGhlaXIgc2VjcmV0c1xuICAvLyB3b3VsZCBzaWxlbnRseSBzdGF5IHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzOyBmYWlsIGluc3RlYWQgb2YgcHJvY2VlZGluZy4gVGhlXG4gIC8vIGdpdGlnbm9yZWQgZm5veC5sb2NhbC50b21sIGlzIGEgc3VwcG9ydGVkIG1hY2hpbmUtbG9jYWwgb3ZlcnJpZGUsIGJ1dCBvbmx5IHdoaWxlIGl0IGxlYXZlc1xuICAvLyBwcm92aWRlcnMgYWxvbmUuXG4gIGNvbnN0IHVuc3VwcG9ydGVkRmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpLmZpbHRlcihcbiAgICAobmFtZSkgPT4gbmFtZSAhPT0gJ2Zub3gudG9tbCcgJiYgbmFtZSAhPT0gJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbiAgaWYgKHVuc3VwcG9ydGVkRmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBmYWlsRm5veFN5bmMoXG4gICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgaW4gJHtkaXJQYXRofSBiZWNhdXNlIG9ubHkgZm5veC50b21sIGFuZCBmbm94LmxvY2FsLnRvbWwgYXJlIHN1cHBvcnRlZDogJHt1bnN1cHBvcnRlZEZpbGVOYW1lcy5qb2luKCcsICcpfS4gTWVyZ2UgdGhlbSBpbnRvIGZub3gudG9tbC5gXG4gICAgKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgLy8gQSBzdGFsZSBiYWNrdXAgbGVmdCBieSBhbiBpbnRlcnJ1cHRlZCBlYXJsaWVyIHJ1biBtdXN0IGJlIHJlc3RvcmVkIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAgLy8gb3ZlcnJpZGVzIGFyZSBuZXZlciBzaWxlbnRseSBsb3N0ICh0aGUgbWlncmF0aW9uIG1hcmtlciBzZXBhcmF0ZWx5IGJsb2NrcyB0aGlzIHJ1biB3aGVuIHRoZVxuICAvLyBpbnRlcnJ1cHRpb24gbGVmdCB0aGUgbWlncmF0aW9uIGl0c2VsZiBpbmNvbXBsZXRlKS5cbiAgcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcblxuICBjb25zdCBsYXlvdXRJc3N1ZSA9IGZpbmRGbm94TGF5b3V0SXNzdWUob3JpZ2luYWxDb250ZW50KTtcbiAgaWYgKGxheW91dElzc3VlKSB7XG4gICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7Zm5veFRvbWxQYXRofSAke2xheW91dElzc3VlfS5gKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShvcmlnaW5hbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICBjb25zdCBwcm9maWxlTmFtZXMgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSk7XG4gIGNvbnN0IGN1cnJlbnRSZWNpcGllbnRzID0gcmVhZEZub3hBZ2VSZWNpcGllbnRzKG9yaWdpbmFsQ29udGVudCk7XG5cbiAgLy8gQSBuZXN0ZWQgZm5veC50b21sIHdpdGhvdXQgaXRzIG93biBhZ2UgcHJvdmlkZXIgaW5oZXJpdHMgdGhlIG5lYXJlc3QgYW5jZXN0b3IncyBvbmUgdGhyb3VnaFxuICAvLyBmbm94J3MgaGllcmFyY2hpY2FsIGxvYWRpbmcsIHNvIG9ubHkgdGhlIHJvb3QgY29uZmlnIG11c3QgZGVjbGFyZSB0aGUgcHJvdmlkZXIg4oCUIGJ1dCB0aGVcbiAgLy8gbmVzdGVkIGNvbmZpZydzIG93biBjaXBoZXJ0ZXh0cyBzdGlsbCBtdXN0IGJlIHJlLWVuY3J5cHRlZCB3aGVuZXZlciBhbiBhbmNlc3RvcidzIHJlY2lwaWVudHNcbiAgLy8gY2hhbmdlZCwgYW5kIHRoYXQgb25seSBoYXBwZW5zIHdoZW4gYGZub3ggcmVlbmNyeXB0YCBydW5zIGZyb20gdGhlIG5lc3RlZCBkaXJlY3RvcnkuXG4gIGlmICghaXNSb290ICYmICFjdXJyZW50UmVjaXBpZW50cykge1xuICAgIGlmIChhbmNlc3RvclJlY2lwaWVudHNDaGFuZ2VkKSB7XG4gICAgICB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICBpZiAoXG4gICAgY3VycmVudFJlY2lwaWVudHMgJiZcbiAgICBjdXJyZW50UmVjaXBpZW50cy5zaXplID09PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCAmJlxuICAgIGFnZVJlY2lwaWVudHMuZXZlcnkoKHJlY2lwaWVudCkgPT4gY3VycmVudFJlY2lwaWVudHMuaGFzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICAvLyBSZXdyaXRlIG9ubHkgdGhlIHJlY2lwaWVudHMgYXNzaWdubWVudCBzbyB1c2VyLWF1dGhvcmVkIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIHN1cnZpdmUuXG4gIC8vIFJlLXBhcnNlIGJlZm9yZSB3cml0aW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cykgY291bGQgbWFrZSB0aGUgdGV4dHVhbCBlZGl0XG4gIC8vIHByb2R1Y2UgYSBkdXBsaWNhdGUgdGFibGUgb3IgbGVhdmUgdGhlIG9sZCByZWNpcGllbnRzIGluIGVmZmVjdC5cbiAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSByZXBsYWNlQWdlUmVjaXBpZW50cyhvcmlnaW5hbENvbnRlbnQsIGFnZVJlY2lwaWVudHMpO1xuICBjb25zdCB1cGRhdGVkUmVjaXBpZW50cyA9IFsuLi4ocmVhZEZub3hBZ2VSZWNpcGllbnRzKHVwZGF0ZWRDb250ZW50KSA/PyBbXSldO1xuICBpZiAoXG4gICAgdXBkYXRlZFJlY2lwaWVudHMubGVuZ3RoICE9PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCB8fFxuICAgICFhZ2VSZWNpcGllbnRzLmV2ZXJ5KChyZWNpcGllbnQpID0+IHVwZGF0ZWRSZWNpcGllbnRzLmluY2x1ZGVzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJld3JpdGluZyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gJHtmbm94VG9tbFBhdGh9IGRpZCBub3QgdGFrZSBlZmZlY3Q7IHVwZGF0ZSB0aGVtIG1hbnVhbGx5LmApO1xuICB9XG4gIHdyaXRlTWlncmF0aW9uTWFya2VyKCk7XG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCB1cGRhdGVkQ29udGVudCk7XG5cbiAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGNvbmZpZzoga2VlcGluZyB0aGUgbmV3IHJlY2lwaWVudHMgd2l0aCBvbGQgY2lwaGVydGV4dHMgd291bGQgbWFrZVxuICAgIC8vIHRoaXMgZ2VuZXJhdG9yIHNraXAgcmUtZW5jcnlwdGlvbiBmb3JldmVyIGFuZCBsZXQgc2V0dXBTZWNyZXRzIHVwbG9hZCBhIENJIGtleSB0aGF0XG4gICAgLy8gY2Fubm90IGRlY3J5cHQgYW55dGhpbmcuIFRoZSBvbGQgY2lwaGVydGV4dHMgcmVtYWluIHZhbGlkIGZvciB0aGUgb2xkIHJlY2lwaWVudHMuXG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gICAgZmFpbEZub3hTeW5jKFxuICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICByZXR1cm4gJ2NoYW5nZWQnO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiBhIGZub3gudG9tbCBsYXlvdXQgdGhhdCByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIGFuZCB0aGUgQ0kta2V5XG4gKiB2ZXJpZmljYXRpb24gY2Fubm90IGNvdmVyLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc3RhbmRhcmQgc2luZ2xlLWZpbGUsIHNpbmdsZS1hZ2UtcHJvdmlkZXJcbiAqIGxheW91dCBpcyB1c2VkLlxuICovXG5mdW5jdGlvbiBmaW5kRm5veExheW91dElzc3VlKGZub3hUb21sQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZub3hUb21sQ29udGVudCkgYXMgRm5veFRvbWw7XG4gICAgaWYgKHNldHRpbmdzLmltcG9ydCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gJ3VzZXMgdGhlIHVuc3VwcG9ydGVkIGBpbXBvcnRgIHNldHRpbmcnO1xuICAgIGNvbnN0IG5vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcyA9IE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnByb3ZpZGVycyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFtuYW1lLCBwcm92aWRlcl0pID0+IChwcm92aWRlcj8udHlwZSA9PT0gJ2FnZScpICE9PSAobmFtZSA9PT0gJ2FnZScpKVxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbiAgICBpZiAobm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgZGVjbGFyZXMgYWdlIHByb3ZpZGVycyBub3QgbmFtZWQgXFxgYWdlXFxgIChvciBhbiBcXGBhZ2VcXGAgcHJvdmlkZXIgb2YgYW5vdGhlciB0eXBlKTogJHtub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICBjb25zdCBwcm9maWxlc1dpdGhQcm92aWRlcnMgPSBPYmplY3QuZW50cmllcyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFssIHByb2ZpbGVdKSA9PiBwcm9maWxlPy5wcm92aWRlcnMpXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuICAgIGlmIChwcm9maWxlc1dpdGhQcm92aWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGBkZWNsYXJlcyB1bnN1cHBvcnRlZCBwcm9maWxlLXNwZWNpZmljIHByb3ZpZGVyczogJHtwcm9maWxlc1dpdGhQcm92aWRlcnMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ2Nhbm5vdCBiZSBwYXJzZWQgYXMgVE9NTCc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgW3Byb3ZpZGVycy5hZ2VdLnJlY2lwaWVudHMgb2YgYSBmbm94LnRvbWwsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBjb25maWcgZGVjbGFyZXMgbm9cbiAqIGFnZSBwcm92aWRlciAobmVzdGVkIGNvbmZpZ3MgdGhlbiBpbmhlcml0IHRoZSByb290IG9uZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRm5veEFnZVJlY2lwaWVudHMoZm5veFRvbWxDb250ZW50OiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmbm94VG9tbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICAgIGlmICghc2V0dGluZ3MucHJvdmlkZXJzPy5hZ2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHNldHRpbmdzLnByb3ZpZGVycy5hZ2UucmVjaXBpZW50cztcbiAgICByZXR1cm4gbmV3IFNldChBcnJheS5pc0FycmF5KHJlY2lwaWVudHMpID8gcmVjaXBpZW50cy5maWx0ZXIoKHIpOiByIGlzIHN0cmluZyA9PiB0eXBlb2YgciA9PT0gJ3N0cmluZycpIDogW10pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBBbiB1bnBhcnNhYmxlIGZub3gudG9tbCB5aWVsZHMgbm8gcmVjaXBpZW50cywgc28gdGhlIGNhbGxlciByZXBvcnRzIGFuIGVycm9yLlxuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cbn1cblxudHlwZSBGbm94UmVwb3NpdG9yeUlkZW50aXR5ID0gUGljazxQYWNrYWdlQ29uZmlnLCAncmVwb0F1dGhvcicgfCAncmVwb05hbWUnIHwgJ2lzUHVibGljUmVwbycgfCAnaXNSZXBvVmlzaWJpbGl0eUtub3duJz47XG5cbi8qKlxuICogVGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyB0aGUgcHJpdmF0ZSBrZXkgb2YgdGhlIENJIGlkZW50aXR5IHNjb3BlZCB0byB0aGUgcmVwb3NpdG9yeSwgb3JcbiAqIHVuZGVmaW5lZCB3aGVuIG5vbmUgaXMgKGFuIHVua25vd24gdmlzaWJpbGl0eSwgb3IgYSByZXBvc2l0b3J5IG5vIENJIHNjb3BlIGNvdmVycykuIFRoZSBzaW5nbGVcbiAqIHNvdXJjZSBvZiB0cnV0aCBzaGFyZWQgYnkgdGhlIHJlY2lwaWVudCBzeW5jIGFuZCB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3MgY2FsbGVyIG1hcHBpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoXG4gIGNvbmZpZzogRm5veFJlcG9zaXRvcnlJZGVudGl0eVxuKTogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWScgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaVByaW5jaXBhbDogRm5veEFnZVByaW5jaXBhbCB8IHVuZGVmaW5lZCA9IEZOT1hfQUdFX1BSSU5DSVBBTFMuZmluZChcbiAgICAocHJpbmNpcGFsOiBGbm94QWdlUHJpbmNpcGFsKSA9PlxuICAgICAgcHJpbmNpcGFsLmNpQWdlS2V5U2VjcmV0TmFtZSAmJiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCBjb25maWcpXG4gICk7XG4gIHJldHVybiBjaVByaW5jaXBhbD8uY2lBZ2VLZXlTZWNyZXROYW1lO1xufVxuXG4vKiogV2hldGhlciB0aGUgcmVjaXBpZW50IHNldCBkaWZmZXJzIGJldHdlZW4gdGhlIHB1YmxpYyBhbmQgcHJpdmF0ZSByZWFkaW5nIG9mIHRoZSByZXBvc2l0b3J5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KFxuICByb290Q29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdyZXBvQXV0aG9yJyB8ICdyZXBvTmFtZSc+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgcHVibGljS2V5c0ZvciA9IChpc1B1YmxpY1JlcG86IGJvb2xlYW4pOiBzdHJpbmcgPT5cbiAgICBnZXRGbm94QWdlUmVjaXBpZW50cyh7IC4uLnJvb3RDb25maWcsIGlzUHVibGljUmVwbywgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0cnVlIH0pXG4gICAgICAubWFwKCh7IHB1YmxpY0tleSB9KSA9PiBwdWJsaWNLZXkpXG4gICAgICAuam9pbignXFxuJyk7XG4gIHJldHVybiBwdWJsaWNLZXlzRm9yKHRydWUpICE9PSBwdWJsaWNLZXlzRm9yKGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZub3hBZ2VSZWNpcGllbnRzKHJvb3RDb25maWc6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHkpOiBGbm94QWdlUmVjaXBpZW50W10ge1xuICByZXR1cm4gRk5PWF9BR0VfUFJJTkNJUEFMUy5maWx0ZXIoKHByaW5jaXBhbCkgPT5cbiAgICBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCByb290Q29uZmlnKVxuICApLmZsYXRNYXAoKHByaW5jaXBhbCkgPT5cbiAgICBwcmluY2lwYWwucHVibGljS2V5cy5tYXAoKHB1YmxpY0tleSwgaW5kZXgpID0+ICh7XG4gICAgICBuYW1lOiBwcmluY2lwYWwucHVibGljS2V5cy5sZW5ndGggPT09IDEgPyBwcmluY2lwYWwubmFtZSA6IGAke3ByaW5jaXBhbC5uYW1lfSR7aW5kZXggKyAxfWAsXG4gICAgICBwdWJsaWNLZXksXG4gICAgfSkpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShzY29wZTogRm5veFJlcG9zaXRvcnlTY29wZSwgcmVwb3NpdG9yeTogRm5veFJlcG9zaXRvcnlJZGVudGl0eSk6IGJvb2xlYW4ge1xuICBjb25zdCBvd25lciA9IHJlcG9zaXRvcnkucmVwb0F1dGhvcj8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbmFtZSA9IHJlcG9zaXRvcnkucmVwb05hbWU/LnRvTG93ZXJDYXNlKCk7XG4gIGlmICghb3duZXIgfHwgIW5hbWUpIHJldHVybiBmYWxzZTtcblxuICAvLyBBbiB1bmtub3duIHZpc2liaWxpdHkgKGZhaWxlZCBHaXRIdWIgbG9va3VwKSBtYXRjaGVzIG5vIHZpc2liaWxpdHktY29uc3RyYWluZWQgc2NvcGU6IGNhbGxlcnNcbiAgLy8gdGhhdCB3b3VsZCByZXdyaXRlIHJlY2lwaWVudHMgZmFpbCBpbnN0ZWFkIG9mIGVuY3J5cHRpbmcgdG8gdGhlIHdyb25nIENJIGlkZW50aXR5LlxuICBpZiAoXG4gICAgc2NvcGUudmlzaWJpbGl0eSAmJlxuICAgICghcmVwb3NpdG9yeS5pc1JlcG9WaXNpYmlsaXR5S25vd24gfHwgKHNjb3BlLnZpc2liaWxpdHkgPT09ICdwdWJsaWMnKSAhPT0gcmVwb3NpdG9yeS5pc1B1YmxpY1JlcG8pXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgKHNjb3BlLm9yZ2FuaXphdGlvbnM/LnNvbWUoKG9yZ2FuaXphdGlvbikgPT4gb3JnYW5pemF0aW9uLnRvTG93ZXJDYXNlKCkgPT09IG93bmVyKSA/PyBmYWxzZSkgfHxcbiAgICAoc2NvcGUucmVwb3NpdG9yaWVzPy5zb21lKChmdWxsTmFtZSkgPT4gZnVsbE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYCR7b3duZXJ9LyR7bmFtZX1gKSA/PyBmYWxzZSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUFnZVJlY2lwaWVudHMoY29udGVudDogc3RyaW5nLCBhZ2VSZWNpcGllbnRzOiByZWFkb25seSBGbm94QWdlUmVjaXBpZW50W10pOiBzdHJpbmcge1xuICAvLyBUcmFpbGluZyBuYW1lIGNvbW1lbnRzIGxldCBodW1hbnMgdGVsbCB3aG9zZSBrZXkgZWFjaCByZWNpcGllbnQgaXMgd2l0aG91dCBjb25zdWx0aW5nIHdiZnkuXG4gIGNvbnN0IHJlY2lwaWVudHNUZXh0ID0gYHJlY2lwaWVudHMgPSBbXFxuJHthZ2VSZWNpcGllbnRzXG4gICAgLm1hcCgocmVjaXBpZW50KSA9PiBgICBcIiR7cmVjaXBpZW50LnB1YmxpY0tleX1cIiwgIyAke3JlY2lwaWVudC5uYW1lfWApXG4gICAgLmpvaW4oJ1xcbicpfVxcbl1gO1xuICAvLyB3YmZ5IHdyaXRlcyBhIFtwcm92aWRlcnMuYWdlXSB0YWJsZSAocG9zc2libHkgd2l0aCBhIHRyYWlsaW5nIGNvbW1lbnQpLiBTY2FuIGxpbmUtd2lzZSBzbyB0aGF0XG4gIC8vIGEgYFtgIGluc2lkZSBhIGNvbW1lbnQgb3IgYSBzdHJpbmcgbmV2ZXIgdGVybWluYXRlcyB0aGUgdGFibGUgZWFybHk7IHRoZSB0YWJsZSBlbmRzIGF0IHRoZVxuICAvLyBuZXh0IGxpbmUtc3RhcnQgdGFibGUgaGVhZGVyLiBUaGUgYXNzaWdubWVudCBtYXRjaCBpcyBsaW5lLWFuY2hvcmVkIHNvIGEgY29tbWVudGVkLW91dFxuICAvLyBgIyByZWNpcGllbnRzID0gWy4uLl1gIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcmVhbCBvbmUsIHdoaWxlIG11bHRpbGluZSBhcnJheXMgc3RpbGwgbWF0Y2hcbiAgLy8gYmVjYXVzZSB0aGUgbmVnYXRlZCBjbGFzcyBbXlxcXV0gKHVubGlrZSBgLmApIHNwYW5zIG5ld2xpbmVzLiBBbnkgb3RoZXIgc3BlbGxpbmcgZmFsbHMgdGhyb3VnaFxuICAvLyB0byB0aGUgY2FsbGVyJ3MgcmUtcGFyc2UgdmFsaWRhdGlvbiwgd2hpY2ggZmFpbHMgdGhlIHJ1biBzYWZlbHkgd2l0aCBpbnN0cnVjdGlvbnMgaW5zdGVhZCBvZlxuICAvLyBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gL15cXHMqXFxbcHJvdmlkZXJzXFwuYWdlXFxdXFxzKig/OiMuKik/JC91LnRlc3QobGluZSkpO1xuICBpZiAoaGVhZGVySW5kZXggIT09IC0xKSB7XG4gICAgbGV0IGVuZEluZGV4ID0gbGluZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gaGVhZGVySW5kZXggKyAxOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKC9eXFxzKlxcWy91LnRlc3QobGluZXNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgICBlbmRJbmRleCA9IGluZGV4O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VjdGlvbiA9IGxpbmVzLnNsaWNlKGhlYWRlckluZGV4LCBlbmRJbmRleCkuam9pbignXFxuJyk7XG4gICAgY29uc3QgcmVwbGFjZWRTZWN0aW9uID0gc2VjdGlvbi5yZXBsYWNlKC9eXFxzKnJlY2lwaWVudHNcXHMqPVxccypcXFtbXlxcXV0qXFxdL211LCByZWNpcGllbnRzVGV4dCk7XG4gICAgY29uc3QgbmV3U2VjdGlvbiA9XG4gICAgICByZXBsYWNlZFNlY3Rpb24gPT09IHNlY3Rpb25cbiAgICAgICAgPyBbbGluZXNbaGVhZGVySW5kZXhdLCByZWNpcGllbnRzVGV4dCwgLi4ubGluZXMuc2xpY2UoaGVhZGVySW5kZXggKyAxLCBlbmRJbmRleCldLmpvaW4oJ1xcbicpXG4gICAgICAgIDogcmVwbGFjZWRTZWN0aW9uO1xuICAgIHJldHVybiBbLi4ubGluZXMuc2xpY2UoMCwgaGVhZGVySW5kZXgpLCBuZXdTZWN0aW9uLCAuLi5saW5lcy5zbGljZShlbmRJbmRleCldLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bcHJvdmlkZXJzLmFnZV1cXG50eXBlID0gXCJhZ2VcIlxcbiR7cmVjaXBpZW50c1RleHR9XFxuYDtcbn1cblxuLy8gUmUtZW5jcnlwdHMgdGhlIGJhc2Ugc2VjcmV0cyBhbmQgZWFjaCBwcm9maWxlJ3Mgb3duIHNlY3JldHMgKC0tbm8tZGVmYXVsdHMga2VlcHMgdGhlIG1lcmdlZFxuLy8gYmFzZSBzZWNyZXRzIGZyb20gYmVpbmcgZHVwbGljYXRlZCBpbnRvIHByb2ZpbGUgdGFibGVzKSBmb3IgdGhlIGN1cnJlbnQgcmVjaXBpZW50IHNldC4gVGhlXG4vLyBzcGF3bmVkIGZub3ggcnVucyB3aXRoIGFuIGlzb2xhdGVkIEhPTUUvWERHX0NPTkZJR19IT01FIGJlY2F1c2UgZm5veCBtZXJnZXMgdGhlIHVzZXItZ2xvYmFsXG4vLyB+Ly5jb25maWcvZm5veC9jb25maWcudG9tbCBpbnRvIGV2ZXJ5IHByb2plY3QgY29uZmlnIOKAlCBhIHBsYWluIHJlZW5jcnlwdCB3b3VsZCByZXdyaXRlIHRoZVxuLy8gdXNlcidzIGdsb2JhbCBzZWNyZXRzIHRvby4gRGVjcnlwdGlvbiB0aGVyZWZvcmUgbmVlZHMgdGhlIHBlcnNvbmFsIGlkZW50aXR5IHBhc3NlZCBleHBsaWNpdGx5XG4vLyB2aWEgRk5PWF9BR0VfS0VZOyBGTk9YX1BST0ZJTEUgaXMgc3RyaXBwZWQgc28gaXQgY2Fubm90IHJlZGlyZWN0IHRoZSBiYXNlIChubyAtUCkgcnVuLlxuZnVuY3Rpb24gcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nLCBwcm9maWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIFRoZSBpZGVudGl0eSBpcyBvcHRpb25hbDogYSBwbGFpbnRleHQtb25seSBjb25maWcgaGFzIG5vdGhpbmcgdG8gZGVjcnlwdCBhbmQgZm5veCBzdWNjZWVkc1xuICAvLyB3aXRob3V0IG9uZSwgd2hpbGUgZXhpc3RpbmcgY2lwaGVydGV4dHMgbWFrZSBmbm94IGZhaWwgbG91ZGx5IG9uIGl0cyBvd24uXG4gIGNvbnN0IGlkZW50aXR5ID0gcmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KCkgPz8gcHJvY2Vzcy5lbnYuRk5PWF9BR0VfS0VZO1xuICBjb25zdCBmbm94Q29tbWFuZCA9IHJlc29sdmVGbm94Q29tbWFuZChkaXJQYXRoKTtcbiAgY29uc3QgaXNvbGF0ZWRIb21lRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diZnktZm5veC1ob21lLScpKTtcbiAgdHJ5IHtcbiAgICAvLyBIaWRlIHRoZSBsb2NhbCBvdmVycmlkZXMgb2YgRVZFUlkgZGlyZWN0b3J5IGZub3ggbWVyZ2VzIGhpZXJhcmNoaWNhbGx5IChmcm9tIHRoZSBjb21tYW5kXG4gICAgLy8gZGlyZWN0b3J5IHVwIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QpOiBhbiBhbmNlc3RvcidzIGZub3gubG9jYWwudG9tbCB3b3VsZCBvdGhlcndpc2Ugc2hhZG93XG4gICAgLy8gY29tbWl0dGVkIHNlY3JldHMgb3IgaXRzZWxmIGdldCByZXdyaXR0ZW4gYnkgdGhlIHJlLWVuY3J5cHRpb24uXG4gICAgcmV0dXJuIHdpdGhGbm94TG9jYWxzSGlkZGVuKHJvb3REaXJQYXRoLCBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoLCByb290RGlyUGF0aCksICgpID0+IHtcbiAgICAgIGNvbnN0IGVudiA9IHtcbiAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KS5maWx0ZXIoKFtrZXldKSA9PiAha2V5LnN0YXJ0c1dpdGgoJ0ZOT1hfJykpKSxcbiAgICAgICAgLi4uKGlkZW50aXR5ID8geyBGTk9YX0FHRV9LRVk6IGlkZW50aXR5IH0gOiB7fSksXG4gICAgICAgIEhPTUU6IGlzb2xhdGVkSG9tZURpclBhdGgsXG4gICAgICAgIFhER19DT05GSUdfSE9NRTogaXNvbGF0ZWRIb21lRGlyUGF0aCxcbiAgICAgIH07XG4gICAgICBjb25zdCBwcm9maWxlQXJnc0xpc3QgPSBbW10sIC4uLnByb2ZpbGVOYW1lcy5tYXAoKG5hbWUpID0+IFsnLS1uby1kZWZhdWx0cycsIGAtLXByb2ZpbGU9JHtuYW1lfWBdKV07XG4gICAgICBmb3IgKGNvbnN0IHByb2ZpbGVBcmdzIG9mIHByb2ZpbGVBcmdzTGlzdCkge1xuICAgICAgICBjb25zdCBhcmdzID0gWydyZWVuY3J5cHQnLCAnLS1mb3JjZScsICctLW5vLWRhZW1vbicsICctLXByb3ZpZGVyJywgJ2FnZScsIC4uLnByb2ZpbGVBcmdzXTtcbiAgICAgICAgY29uc29sZS5sb2coYCQgJHtmbm94Q29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX0gYXQgJHtkaXJQYXRofWApO1xuICAgICAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoZm5veENvbW1hbmQsIGFyZ3MsIHtcbiAgICAgICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICAgIGVudixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgocHJvYy5zdGF0dXMgPz8gMSkgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyhpc29sYXRlZEhvbWVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGZub3ggYmluYXJ5LiBgZm5veGAgb24gUEFUSCBpcyBvZnRlbiBhIG1pc2Ugc2hpbSwgYW5kIG1pc2UgcmVmdXNlcyB0byBydW5cbiAqIG9uY2UgSE9NRS9YREdfQ09ORklHX0hPTUUgcG9pbnQgYXQgdGhlIGlzb2xhdGVkIGRpcmVjdG9yeSAoaXRzIHRydXN0IHN0YXRlIGRpc2FwcGVhcnMpLCBzbyB0aGVcbiAqIGlzb2xhdGVkIHNwYXducyBuZWVkIHRoZSBzaGltIHJlc29sdmVkIHRvIHRoZSByZWFsIGV4ZWN1dGFibGUgYmVmb3JlaGFuZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUZub3hDb21tYW5kKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnbWlzZScsIFsnd2hpY2gnLCAnZm5veCddLCB7IGN3ZDogZGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwcm9jLnN0YXR1cyA9PT0gMCA/IHByb2Muc3Rkb3V0LnRyaW0oKSA6ICcnO1xuICByZXR1cm4gcmVzb2x2ZWQgfHwgJ2Zub3gnO1xufVxuXG4vLyBUaGUgcGVyc29uYWwgaWRlbnRpdHkgZmlsZSBpcyBtYWNoaW5lLWdsb2JhbCwgc28gaXQgaXMgcmVhZCBvbmNlIHBlciBwcm9jZXNzLlxubGV0IGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGZhbHNlO1xubGV0IGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHJlYWRQZXJzb25hbEFnZVNlY3JldEtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KSByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG4gIGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNvbmZpZycsICdmbm94JywgJ2FnZS50eHQnKSwgJ3V0ZjgnKTtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGNvbnRlbnRcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maW5kKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdBR0UtU0VDUkVULUtFWS0nKSlcbiAgICAgID8udHJpbSgpO1xuICB9IGNhdGNoIHtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG59XG5cbi8qKlxuICogUnVucyBhIGZ1bmN0aW9uIHdoaWxlIHRoZSBtYWNoaW5lLWxvY2FsIGZub3gubG9jYWwudG9tbCBmaWxlcyBvZiB0aGUgZ2l2ZW4gZGlyZWN0b3JpZXMgYXJlXG4gKiB0ZW1wb3JhcmlseSBtb3ZlZCBhc2lkZTogZm5veCBsb2FkcyB0aGVtIGF0IGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBjb21taXR0ZWQgZm5veC50b21sLCBzbyBhXG4gKiBsb2NhbCBvdmVycmlkZSBzaGFkb3dpbmcgYSBjb21taXR0ZWQgc2VjcmV0IHdvdWxkIG1ha2UgYGZub3ggcmVlbmNyeXB0YCBza2lwIHRoYXQgc2VjcmV0LlxuICovXG5mdW5jdGlvbiB3aXRoRm5veExvY2Fsc0hpZGRlbjxUPihyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoczogc3RyaW5nW10sIGZ1bmM6ICgpID0+IFQpOiBUIHtcbiAgY29uc3QgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYmFja3VwUGF0aCA9IGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgICBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICAgICAgZnMucmVuYW1lU3luYyhsb2NhbFBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgICBoaWRkZW5EaXJQYXRocy5wdXNoKGRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgLy8gQSByZXN0b3JhdGlvbiBjb25mbGljdCB0aHJvd3MgaGVyZSBhbmQgdGhlcmVieSBpbnZhbGlkYXRlcyB0aGUgc2VlbWluZ2x5IHN1Y2Nlc3NmdWwgcmVzdWx0OlxuICAgIC8vIGEgcmVjcmVhdGVkIG92ZXJyaWRlIG1heSBoYXZlIHNoYWRvd2VkIGNvbW1pdHRlZCBzZWNyZXRzIGR1cmluZyB0aGUgZm5veCBydW4sIHNvIHRoZSBvdXRlclxuICAgIC8vIHRyYW5zYWN0aW9uIG11c3QgcmVzdG9yZSBldmVyeSBjb21taXR0ZWQgZm5veC50b21sIGluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgbWlncmF0aW9uLlxuICAgIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoLCBoaWRkZW5EaXJQYXRocyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGUgb3JpZ2luYWwgZmFpbHVyZSBtdXN0IHdpbjsgYSByZXN0b3JhdGlvbiBjb25mbGljdCBvbiB0aGlzIHBhdGggaXMgb25seSByZXBvcnRlZCBzbyBpdFxuICAgIC8vIGNhbm5vdCBtYXNrIHRoZSByb290IGNhdXNlLlxuICAgIHRyeSB7XG4gICAgICByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aCwgaGlkZGVuRGlyUGF0aHMpO1xuICAgIH0gY2F0Y2ggKHJlc3RvcmVFcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKChyZXN0b3JlRXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IFN0cmluZyhyZXN0b3JlRXJyb3IpKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLy8gTW92ZXMgdGhlIGhpZGRlbiBmbm94LmxvY2FsLnRvbWwgZmlsZXMgYmFjaywgY2xlYXJpbmcgdGhlIGdpdmVuIGxpc3Qgc28gYSBzZWNvbmQgY2FsbCBpcyBhXG4vLyBuby1vcC4gTmV2ZXIgY2xvYmJlcnMgYSBmbm94LmxvY2FsLnRvbWwgcmVjcmVhdGVkIChlLmcuIGJ5IGFuIGVkaXRvcikgd2hpbGUgZm5veCB3YXMgcnVubmluZzpcbi8vIHRoZSBiYWNrdXAgaXMga2VwdCBhbmQgcmVwb3J0ZWQgZm9yIGEgbWFudWFsIG1lcmdlLlxuZnVuY3Rpb24gcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGg6IHN0cmluZywgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZsaWN0aW5nTG9jYWxQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGhpZGRlbkRpclBhdGhzLnNwbGljZSgwKSkge1xuICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgY29uZmxpY3RpbmdMb2NhbFBhdGhzLnB1c2gobG9jYWxQYXRoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmcy5yZW5hbWVTeW5jKGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpLCBsb2NhbFBhdGgpO1xuICB9XG4gIGlmIChjb25mbGljdGluZ0xvY2FsUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgZm9sbG93aW5nIGZub3gubG9jYWwudG9tbCBmaWxlcyB3ZXJlIHJlY3JlYXRlZCB3aGlsZSBmbm94IHdhcyBydW5uaW5nIChvcmlnaW5hbCBmaWxlcyBhcmUgcHJlc2VydmVkIHVuZGVyICR7cGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnLnRtcCcsICd3YmZ5LWZub3gtbG9jYWwtYmFja3VwJyl9IOKAlCBtZXJnZSB0aGVtIG1hbnVhbGx5KTogJHtjb25mbGljdGluZ0xvY2FsUGF0aHMuam9pbignLCAnKX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3RvcmVzIGEgZm5veC5sb2NhbC50b21sIGJhY2t1cCBsZWZ0IGJ5IGFuIGludGVycnVwdGVkIGVhcmxpZXIgcnVuIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAqIG92ZXJyaWRlcyBhcmUgbmV2ZXIgc2lsZW50bHkgbG9zdC5cbiAqL1xuZnVuY3Rpb24gcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICBjb25zdCBiYWNrdXBQYXRoID0gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhiYWNrdXBQYXRoKSkgcmV0dXJuO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCb3RoICR7bG9jYWxQYXRofSBhbmQgaXRzIGJhY2t1cCAke2JhY2t1cFBhdGh9IGV4aXN0OyByZXNvbHZlIHRoZSBsZWZ0b3ZlciBiYWNrdXAgbWFudWFsbHkuYCk7XG4gIH1cbiAgZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aCwgYmFja3VwUGF0aCk7XG4gIGZzLnJlbmFtZVN5bmMoYmFja3VwUGF0aCwgbG9jYWxQYXRoKTtcbn1cblxuLy8gQ3JlYXRlcyB0aGUgYmFja3VwIGRpcmVjdG9yeSBhbmQgcHJvdmVzIG5vIHBhdGggY29tcG9uZW50IGJlbG93IHRoZSByZXBvc2l0b3J5IHJvb3QgaXMgYVxuLy8gc3ltbGluazogYSByZXBvc2l0b3J5LWNvbnRyb2xsZWQgc3ltbGluayAoZS5nLiBhIHRyYWNrZWQgLnRtcC93YmZ5LWZub3gtbG9jYWwtYmFja3VwIGxpbmspXG4vLyBjb3VsZCBvdGhlcndpc2UgbW92ZSB0aGUgcGxhaW50ZXh0IGxvY2FsIHNlY3JldHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgb3IgcmVzb2x2ZSB0aGUgYmFja3VwXG4vLyBiYWNrIG9udG8gdGhlIHNvdXJjZSBmaWxlIGFuZCB0dXJuIHRoZSBoaWRlIHJlbmFtZSBpbnRvIGEgbm8tb3AuXG5mdW5jdGlvbiBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoOiBzdHJpbmcsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBiYWNrdXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGJhY2t1cFBhdGgpO1xuICBmcy5ta2RpclN5bmMoYmFja3VwRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGV4cGVjdGVkUmVhbFBhdGggPSBwYXRoLmpvaW4oZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKSwgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgYmFja3VwRGlyUGF0aCkpO1xuICBpZiAoZnMucmVhbHBhdGhTeW5jKGJhY2t1cERpclBhdGgpICE9PSBleHBlY3RlZFJlYWxQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2JhY2t1cERpclBhdGh9IHJlc29sdmVzIHRocm91Z2ggYSBzeW1saW5rOyByZW1vdmUgdGhlIHN5bWxpbmtlZCBjb21wb25lbnQuYCk7XG4gIH1cbn1cblxuLy8gVGhlIGJhY2t1cCBsaXZlcyB1bmRlciB0aGUgZ2l0aWdub3JlZCAudG1wIHNvIGEgaGlkZGVuIGZub3gubG9jYWwudG9tbCBjYW4gbmV2ZXIgYmVjb21lXG4vLyBzdGFnZWFibGUgKGEgc2libGluZyByZW5hbWUgbGlrZSBmbm94LmxvY2FsLnRvbWwud2JmeS1iYWsgd291bGQgbm8gbG9uZ2VyIG1hdGNoIHRoZSBkb2N1bWVudGVkXG4vLyBgZm5veC5sb2NhbC50b21sYCBpZ25vcmUgZW50cnkgYW5kIGNvdWxkIGJlIGNvbW1pdHRlZCBieSBgZ2l0IGFkZCAtQWApLlxuZnVuY3Rpb24gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXNvbHZlKFxuICAgIHJvb3REaXJQYXRoLFxuICAgICcudG1wJyxcbiAgICAnd2JmeS1mbm94LWxvY2FsLWJhY2t1cCcsXG4gICAgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgZGlyUGF0aCksXG4gICAgJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVNaWdyYXRpb25NYXJrZXIoKTogdm9pZCB7XG4gIGlmICghbWlncmF0aW9uTWFya2VyUGF0aCB8fCBtaWdyYXRpb25NYXJrZXJPd25lZCkgcmV0dXJuO1xuICBjb25zdCB0bXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKG1pZ3JhdGlvbk1hcmtlclBhdGgpO1xuICBmcy5ta2RpclN5bmModG1wRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIFJlZnVzZSB0byB3cml0ZSB0aHJvdWdoIHN5bWxpbmtzOiBhIHJlcG9zaXRvcnktY29udHJvbGxlZCAudG1wIHN5bWxpbmsgY291bGQgb3RoZXJ3aXNlXG4gIC8vIHJlZGlyZWN0IHRoZSBtYXJrZXIgd3JpdGUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS4gVGhlIGB3eGAgZmxhZyBtYWtlcyB0aGUgb3BlbiBpdHNlbGYgZmFpbFxuICAvLyBvbiBhbnkgcHJlLWV4aXN0aW5nIHBhdGgsIGluY2x1ZGluZyBhIGRhbmdsaW5nIHN5bWxpbmsg4oCUIHdoaWNoIGFsc28gYWNxdWlyZXMgdGhlIG1hcmtlclxuICAvLyBhdG9taWNhbGx5LCBzbyBhIGNvbmN1cnJlbnQgd2JmeSBydW4gY2Fubm90IHN0YXJ0IGEgc2Vjb25kIG1pZ3JhdGlvbi5cbiAgaWYgKGZzLmxzdGF0U3luYyh0bXBEaXJQYXRoKS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RtcERpclBhdGh9IGlzIGEgc3ltbGluazsgcmVwbGFjZSBpdCB3aXRoIGEgcmVndWxhciBkaXJlY3RvcnkuYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCxcbiAgICAgICd3YmZ5IGZub3ggbWlncmF0aW9uIGluIHByb2dyZXNzOyBhIGxlZnRvdmVyIG1hcmtlciBibG9ja3MgbmV3IG1pZ3JhdGlvbnNcXG4nLFxuICAgICAge1xuICAgICAgICBmbGFnOiAnd3gnLFxuICAgICAgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBbm90aGVyIHdiZnkgcHJvY2VzcyBhcHBlYXJzIHRvIGJlIG1pZ3JhdGluZyAoJHttaWdyYXRpb25NYXJrZXJQYXRofSBleGlzdHMpOiAke2Vycm9yfWApO1xuICB9XG4gIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gdHJ1ZTtcbn1cblxuLy8gT25seSB0aGUgcnVuIHRoYXQgYWNxdWlyZWQgdGhlIG1hcmtlciBtYXkgcmVtb3ZlIGl0OiBkZWxldGluZyBhIGZvcmVpZ24gbWFya2VyIHdvdWxkIGRpc2FibGVcbi8vIGludGVycnVwdGVkLW1pZ3JhdGlvbiBkZXRlY3Rpb24gZm9yIGEgY29uY3VycmVudGx5IHJ1bm5pbmcgd2JmeS5cbmZ1bmN0aW9uIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk6IHZvaWQge1xuICBpZiAoIW1pZ3JhdGlvbk1hcmtlck93bmVkIHx8ICFtaWdyYXRpb25NYXJrZXJQYXRoKSByZXR1cm47XG4gIGZzLnJtU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90czogTWFwPHN0cmluZywgc3RyaW5nPik6IGJvb2xlYW4ge1xuICBsZXQgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGNvbnRlbnRdIG9mIHNuYXBzaG90cykge1xuICAgIHRyeSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gcmVzdG9yZSAke2ZpbGVQYXRofSBhZnRlciBhIGZhaWxlZCBtaWdyYXRpb246ICR7ZXJyb3J9YCk7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1Y2NlZWRlZDtcbn1cblxuZnVuY3Rpb24gZmFpbEZub3hTeW5jKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgZm5veFN5bmNGYWlsZWQgPSB0cnVlO1xufVxuXG4vLyBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgYW4gdW5zdXBwb3J0ZWQgZm5veC5sb2NhbC50b21sIGluIHRoZSBkaXJlY3RvcnksIG9yIHVuZGVmaW5lZC4gTG9jYWxcbi8vIG92ZXJyaWRlcyBtYXkgb25seSBob2xkIG1hY2hpbmUtbG9jYWwgc2VjcmV0IHZhbHVlczsgaW1wb3J0cyBvciBwcm92aWRlciAocmUpZGVmaW5pdGlvbnMgd291bGRcbi8vIHNpbGVudGx5IGNoYW5nZSB3aGljaCByZWNpcGllbnQgc2V0IGdvdmVybnMgcmUtZW5jcnlwdGlvbi5cbmZ1bmN0aW9uIGZpbmRGbm94TG9jYWxUb21sSXNzdWUoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbG9jYWxUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFRvbWxQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbG9jYWxTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFRvbWxQYXRoLCAndXRmOCcpKSBhcyBGbm94VG9tbDtcbiAgY29uc3QgZGVmaW5lc1Byb3ZpZGVycyA9XG4gICAgbG9jYWxTZXR0aW5ncy5pbXBvcnQgIT09IHVuZGVmaW5lZCB8fFxuICAgIGxvY2FsU2V0dGluZ3MucHJvdmlkZXJzICE9PSB1bmRlZmluZWQgfHxcbiAgICBPYmplY3QudmFsdWVzKGxvY2FsU2V0dGluZ3MucHJvZmlsZXMgPz8ge30pLnNvbWUoKHByb2ZpbGUpID0+IHByb2ZpbGU/LnByb3ZpZGVycyAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGRlZmluZXNQcm92aWRlcnMgPyBgJHtsb2NhbFRvbWxQYXRofSBkZWZpbmVzIGltcG9ydHMsIHByb3ZpZGVycywgb3IgcHJvZmlsZSBwcm92aWRlcnNgIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIExpc3RzIGV2ZXJ5IGRpcmVjdG9yeSBjb250YWluaW5nIGEgY29tbWl0dGVkIChvciBjb21taXR0YWJsZSkgZm5veC50b21sIGFtb25nIHRoZSBnaXZlblxuICogZ2l0LWRpc2NvdmVyZWQgY29uZmlnIHBhdGhzIChzZWUgbGlzdEZub3hMaWtlRmlsZVBhdGhzOiBnaXQtYmFzZWQgZGlzY292ZXJ5IGV4Y2x1ZGVzIGdpdGlnbm9yZWRcbiAqIHRyZWVzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIHdpdGhvdXQgZXhjbHVkaW5nIGxlZ2l0aW1hdGUgcGFja2FnZXMgbmFtZWQgbGlrZSBidWlsZCBvdXRwdXRzKS5cbiAqL1xuZnVuY3Rpb24gbGlzdEZub3hUb21sRGlyUGF0aHMoZm5veExpa2VGaWxlUGF0aHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBmbm94TGlrZUZpbGVQYXRoc1xuICAgICAgICAuZmlsdGVyKChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgPT09ICdmbm94LnRvbWwnKVxuICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZub3ggY29uZmlnIGRlY2xhcmVzIGl0cyBvd24gYFtwcm92aWRlcnMuYWdlXWAsIGkuZS4gcGFydGljaXBhdGVzIGluIGFnZSBlbmNyeXB0aW9uLlxuICogQSBjb25maWcgd2l0aG91dCBvbmUgZWl0aGVyIGluaGVyaXRzIGEgbWFuYWdlZCByb290J3MgcHJvdmlkZXIgKGhhbmRsZWQgYnkgdGhlIHJvb3QtZXhpc3RzIHBhdGgpXG4gKiBvciwgd2hlbiBubyByb290IGV4aXN0cywgdXNlcyBubyBhZ2UgZW5jcnlwdGlvbiBhdCBhbGwg4oCUIHNvIGl0IG5lZWRzIG5vIHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb25cbiAqIGFuZCBvd25zIG5vIEZOT1hfQUdFX0tFWS5cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNGbm94QWdlUHJvdmlkZXIoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhaWwgY2xvc2VkOiBhbiB1bnJlYWRhYmxlIGNvbmZpZyBtaWdodCBkZWNsYXJlIGFuIGFnZSBwcm92aWRlci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCb29sZWFuKChCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBGbm94VG9tbCkucHJvdmlkZXJzPy5hZ2UpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsIGNsb3NlZDogYW4gdW5wYXJzYWJsZSBjb25maWcgbWlnaHQgZGVjbGFyZSBhbiBhZ2UgcHJvdmlkZXIuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZm5veCBjb25maWcgcGF0aCBsaWVzIGluc2lkZSBhIHRlc3QtZml4dHVyZSB0cmVlICh0ZXN0L2ZpeHR1cmVzLCB0ZXN0LWZpeHR1cmVzLFxuICogX190ZXN0c19fKTogZml4dHVyZSBjb25maWdzIGFyZSB0ZXN0IElOUFVUUywgbm90IHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbi4gZm5veCBuZXZlciBsb2Fkc1xuICogdGhlbSBmb3IgcmVhbCBjb21tYW5kcyAoaGllcmFyY2hpY2FsIGxvYWRpbmcgb25seSB3YWxrcyBjd2QgYW5jZXN0b3JzKSwgcmVjaXBpZW50XG4gKiBzeW5jaHJvbml6YXRpb24gbXVzdCBub3QgcmV3cml0ZSBvciByZS1lbmNyeXB0IHRoZW0gKHNoYXJlZC1saWItbm9kZSdzIHVuZGVjcnlwdGFibGUgZml4dHVyZVxuICogZXhpc3RzIHByZWNpc2VseSB0byBzdGF5IHVuZGVjcnlwdGFibGUpLCBhbmQgYSBmaXh0dXJlIG11c3Qgbm90IGZhaWwgdGhlIHN0cmF5LW5lc3RlZC1jb25maWdcbiAqIGNoZWNrIGluIHJlcG9zaXRvcmllcyB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Rlc3RGaXh0dXJlRm5veFBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgZml4dHVyZXNgIGNvdW50cyBvbmx5IGRpcmVjdGx5IHVuZGVyIGEgdGVzdCBkaXJlY3Rvcnk6IHdiZnkgc3VwcG9ydHMgYXJiaXRyYXJ5IHdvcmtzcGFjZXMsXG4gIC8vIHNvIGEgbGVnaXRpbWF0ZSBgcGFja2FnZXMvZml4dHVyZXMvYCB3b3Jrc3BhY2UgbXVzdCBzdGF5IG1hbmFnZWQgYW5kIHZlcmlmaWVkLlxuICBjb25zdCBzZWdtZW50cyA9IGZpbGVQYXRoLnNwbGl0KCcvJyk7XG4gIHJldHVybiBzZWdtZW50cy5zb21lKFxuICAgIChzZWdtZW50LCBpbmRleCkgPT5cbiAgICAgIHNlZ21lbnQgPT09ICd0ZXN0LWZpeHR1cmVzJyB8fFxuICAgICAgc2VnbWVudCA9PT0gJ19fdGVzdHNfXycgfHxcbiAgICAgIChzZWdtZW50ID09PSAnZml4dHVyZXMnICYmIChzZWdtZW50c1tpbmRleCAtIDFdID09PSAndGVzdCcgfHwgc2VnbWVudHNbaW5kZXggLSAxXSA9PT0gJ3Rlc3RzJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAvLyAteiBwcmludHMgTlVMLWRlbGltaXRlZCB2ZXJiYXRpbSBwYXRoczsgd2l0aG91dCBpdCwgY29yZS5xdW90ZVBhdGggQy1xdW90ZXMgbm9uLUFTQ0lJIHBhdGhzXG4gIC8vIChlLmcuIFwiXFwzNDZcXDIyN1xcMjQ1Li4uXCIpLCB3aGljaCB3b3VsZCBtYWtlIHRoZSBiYXNlbmFtZSBmaWx0ZXIgc2lsZW50bHkgc2tpcCB0aG9zZSBjb25maWdzLlxuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgJ2dpdCcsXG4gICAgWydscy1maWxlcycsICcteicsICctLWNhY2hlZCcsICctLW90aGVycycsICctLWV4Y2x1ZGUtc3RhbmRhcmQnLCAnLS0nLCAnKmZub3gqLnRvbWwnXSxcbiAgICB7IGN3ZDogcm9vdERpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfVxuICApO1xuICAvLyBGYWlsIGNsb3NlZDogdHJlYXRpbmcgYSBnaXQgZmFpbHVyZSBhcyBcIm5vIGZub3ggY29uZmlnc1wiIHdvdWxkIHNraXAgc3luY2hyb25pemF0aW9uIGFuZCBsZXRcbiAgLy8gc2V0dXBTZWNyZXRzIHVwbG9hZCBhIGtleSB0aGF0IHdhcyBuZXZlciB2ZXJpZmllZCBhZ2FpbnN0IHRoZSByZXBvc2l0b3J5J3MgY2lwaGVydGV4dHMuXG4gIGlmIChwcm9jLnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZ2l0IGxzLWZpbGVzIGZhaWxlZCBpbiAke3Jvb3REaXJQYXRofTogJHsocHJvYy5zdGRlcnIgfHwgcHJvYy5lcnJvcj8ubWVzc2FnZSB8fCAnJykudHJpbSgpfWApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dFxuICAgIC5zcGxpdCgnXFwwJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiAvXlxcLj9mbm94KFxcLi4rKT9cXC50b21sJC91LnRlc3QocGF0aC5iYXNlbmFtZShsaW5lKSkgJiYgIWlzVGVzdEZpeHR1cmVGbm94UGF0aChsaW5lKSlcbiAgICAubWFwKChsaW5lKSA9PiBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIGxpbmUpKTtcbn1cblxuZnVuY3Rpb24gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhkaXJQYXRoKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gL15cXC4/Zm5veChcXC4uKyk/XFwudG9tbCQvdS50ZXN0KG5hbWUpKVxuICAgICAgLnRvU29ydGVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGZub3ggY2FuIHN0aWxsIGxvYWQgYSBjb25maWcgZnJvbSBhIGRpcmVjdG9yeSB0aGlzIHByb2Nlc3MgY2Fubm90IGVudW1lcmF0ZVxuICAgIC8vIChlLmcuIGV4ZWN1dGUtb25seSBwZXJtaXNzaW9uKSwgc28gYW4gZW51bWVyYXRpb24gZmFpbHVyZSBtdXN0IG5vdCByZWFkIGFzIFwibm8gY29uZmlnc1wiLlxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGluc3BlY3QgJHtkaXJQYXRofSBmb3IgZm5veCBjb25maWdzOiAke2Vycm9yfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGlyUGF0aHMgPSBbZGlyUGF0aF07XG4gIHdoaWxlIChkaXJQYXRocy5hdCgtMSkgIT09IHJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRpclBhdGhzLmF0KC0xKSA/PyAnJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyUGF0aHMuYXQoLTEpKSBicmVhaztcbiAgICBkaXJQYXRocy5wdXNoKHBhcmVudCk7XG4gIH1cbiAgcmV0dXJuIGRpclBhdGhzO1xufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiB1bmtub3duW10sIHNvdXJjZTogdW5rbm93bltdLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd25bXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0W2luZGV4XSwgb3B0aW9ucykgJiYgaXNNZXJnZWFibGVPYmplY3QoaXRlbSwgb3B0aW9ucykpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlLCBvcHRpb25zKSA/IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIHBhY2thZ2UuanNvbi1zdHlsZSBrZXlzIGFyZSBub24tYXJyYXktaW5kZXgga2V5cywgc28gSlNPTi5zdHJpbmdpZnkgcHJlc2VydmVzIHRoaXMgaW5zZXJ0aW9uIG9yZGVyLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQge1xuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxuICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4sXG4gIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5LFxuICByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbi8vIFRoZSBCdW4tZXhhY3QgcmVzb2x1dGlvbiBwcmltaXRpdmVzIGxpdmUgaW4gQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSAoc3JjL2J1bldvcmtzcGFjZXMudHMpXG4vLyBzbyB3YidzIHJlbGVhc2UgY29kZSBzaGFyZXMgdGhlbTsgcmUtZXhwb3J0IHRoZSBvbmVzIHdiZnkgbW9kdWxlcyBhbmQgdGVzdHMgY29uc3VtZS5cbmV4cG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIFBhY2thZ2VDb25maWcgdGhhdCB3b3Jrc3BhY2UgZGlzY292ZXJ5IG5lZWRzLCBzbyBpdCBjYW4gcnVuIGJlZm9yZSBjb25maWdzIGV4aXN0LiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlUm9vdExpa2UgPSBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJyB8ICdkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucycgfCAncGFja2FnZUpzb24nPjtcblxuLyoqXG4gKiBFdmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5IChhYnNvbHV0ZSwgZGVkdXBsaWNhdGVkKSBvZiB0aGUgbW9ub3JlcG8gcm9vdCwgY292ZXJpbmdcbiAqIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyouIFVuY2FjaGVkIGJlY2F1c2UgaW5kZXgudHMgY2FsbHMgaXQgYmVmb3JlIHdiZnkgbXV0YXRlc1xuICogdGhlIHJvb3QgcGFja2FnZS5qc29uIChnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyBjYWNoZXMgdGhlIHBvc3QtbXV0YXRpb24gc3RhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RMaWtlKS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3RMaWtlLmRpclBhdGgsIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKVxuICAgICAgKVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpLCBpbmNsdWRpbmcgbWFuaWZlc3RzXG4gKiB3aXRob3V0IGEgYG5hbWVgIGZpZWxkIOKAlCB3YmZ5IG5hbWVzIHRob3NlIGxhdGVyLCBzbyBkZXBlbmRlbmN5IHNjYW5zIG11c3Qgbm90IHNraXAgdGhlbS5cbiAqIFJlc29sdXRpb24gbWltaWNzIEJ1bidzIHNlcXVlbnRpYWwgcGF0dGVybiBldmFsdWF0aW9uOyBzZWUgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RDb25maWc6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMocm9vdENvbmZpZyksIHJvb3RDb25maWcuZGlyUGF0aCk7XG59XG5cbmludGVyZmFjZSBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8qKiBEaXJlY3Rvcnkgc3VidHJlZXMgKG9yIHBhY2thZ2Utb3duZWQgc3VicGF0aHMpIG1hdGNoZWQgYnkgZWZmZWN0aXZlIG5lZ2F0aW9ucywgZm9yIHRzY29uZmlnIGBleGNsdWRlYCBlbnRyaWVzLiAqL1xuICBleGNsdWRlczogc3RyaW5nW107XG4gIC8qKiBQb3NpdGl2ZSBkaXJlY3RvcnkgcGF0dGVybnMgKG9yIGNvbmNyZXRlIGRpcmVjdG9yaWVzIGZvciBCdW4tb25seSBnbG9iIHN5bnRheCkuICovXG4gIGluY2x1ZGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTb3J0ZWQgd29ya3NwYWNlIGRpcmVjdG9yeSBwYXR0ZXJucyAocG9zaXgsIHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290KSBmb3IgZ2VuZXJhdG9ycyB0aGF0XG4gKiBuZWVkIHBhdHRlcm4tc2hhcGVkIGdsb2JzIGNvdmVyaW5nIGV2ZXJ5IHdvcmtzcGFjZSBsYXlvdXQg4oCUIGUuZy4gdGhlIHJvb3QgdHNjb25maWcncyBgYXBwcy8qYFxuICogaW5jbHVkZSBlbnRyaWVzIOKAlCBpbnN0ZWFkIG9mIGNvbmNyZXRlIGRpcmVjdG9yaWVzLCB3aGljaCB3b3VsZCBjaHVybiBnZW5lcmF0ZWQgZmlsZXMgd2hlbmV2ZXIgYVxuICogd29ya3NwYWNlIHBhY2thZ2UgaXMgYWRkZWQgb3IgcmVtb3ZlZC4gRXZlcnkgcmV0dXJuZWQgcGF0dGVybiBpcyB2YWxpZCB0c2NvbmZpZyBnbG9iIHN5bnRheC5cbiAqIEEgcGF0dGVybiBjYW4gbWF0Y2ggYSBzaWJsaW5nIGRpcmVjdG9yeSB3aXRob3V0IGEgcGFja2FnZS5qc29uIChub3QgYSB3b3Jrc3BhY2UgdG8gQnVuKTsgdGhhdFxuICogaXMgZGVsaWJlcmF0ZSwgbWlycm9yaW5nIHRoZSBsb25nLXN0YW5kaW5nIGBwYWNrYWdlcy8qYCBlbnRyaWVzJyBiZWhhdmlvciBpbiBmYXZvciBvZiBzdGFibGVcbiAqIGdlbmVyYXRlZCBvdXRwdXQuIE5lZ2F0aW9ucyBmb2xsb3cgQnVuJ3Mgc2VxdWVudGlhbCBzZW1hbnRpY3MgKHNlZVxuICogcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMpOiBhIG5lZ2F0aW9uIHN0YXlzIHBhdHRlcm4tc2hhcGVkIHdoaWxlIGl0IGV4Y2x1ZGVzIGV4YWN0bHlcbiAqIHdoYXQgaXQgbWF0Y2hlcywgYnV0IGlzIGNvbmNyZXRpemVkIHBlciBtYXRjaGVkIGRpcmVjdG9yeSB3aGVuIGEgbWF0Y2hlZCBkaXJlY3RvcnkgZW5kcyB1cCBhXG4gKiB3b3Jrc3BhY2UgYW55d2F5IChyZS1pbmNsdWRlZCBieSBhIGxhdGVyIHBvc2l0aXZlLCBhIHBpbm5lZCBjb25jcmV0ZSBwb3NpdGl2ZSwgb3IgYSBzZWVkZWRcbiAqIGJhc2VsaW5lOyAjMTAwNSkgb3IgaXMgYW4gYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5LCB3aGVyZSBCdW4gZXhjbHVkZXMgb25seSB0aGVcbiAqIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3RvcnksIHNvIG9ubHkgaXRzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgYXJlIGV4Y2x1ZGVkICgjMTAwNCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8vIFVubGlrZSBkaXNjb3ZlcnksIGdlbmVyYXRlZCBvdXRwdXQgbXVzdCBub3QgY29udGFpbiBhIG5ldmVyLW1hdGNoaW5nIGBwYWNrYWdlcy8qYCBmYWxsYmFjazpcbiAgLy8gYW4gYXBwcy8qLW9ubHkgbW9ub3JlcG8gd291bGQgZ2V0IGRlYWQgZ2xvYnMgY29tbWl0dGVkIGludG8gaXRzIHJvb3QgdHNjb25maWcuIE1pcnJvclxuICAvLyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIGZvcmNlcyBgcGFja2FnZXMvKmAgb25seSB3aGVuIGEgbWFuaWZlc3QgYWN0dWFsbHkgbWF0Y2hlcy5cbiAgY29uc3QgaGFzUGFja2FnZXNMYXlvdXQgPVxuICAgIHJvb3RMaWtlLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmXG4gICAgLy8gTWlycm9yIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucycgYmFzZWxpbmUgZ2F0ZSB0b286IHdpdGggYW4gaW1wbGljaXQgYmFzZWxpbmUgc2VlZGVkLFxuICAgIC8vIGBwYWNrYWdlcy8qYCBlbnRyaWVzIHdvdWxkIGJlIGRlYWQgZ2xvYnMgc3Vic3VtZWQgYnkgdGhlIGJhc2VsaW5lLWRlcml2ZWQgb25lcy5cbiAgICAhaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZShyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcykgJiZcbiAgICBmZy5nbG9iU3luYygncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBjd2Q6IHJvb3RMaWtlLmRpclBhdGgsXG4gICAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICB9KS5sZW5ndGggPiAwO1xuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9IGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHtcbiAgICAuLi5yb290TGlrZSxcbiAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogaGFzUGFja2FnZXNMYXlvdXQsXG4gIH0pO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IG5ldyBTZXQoXG4gICAgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMod29ya3NwYWNlUGF0dGVybnMsIHJvb3RMaWtlLmRpclBhdGgpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aClcbiAgICApXG4gICk7XG4gIGNvbnN0IGluY2x1ZGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG5lZ2F0aW9uQm9kaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICAvLyBBIHNlZWRpbmcgbmVnYXRpb24gbWFrZXMgQnVuIGxpbmsgYmFzZWxpbmUtbWF0Y2hlZCBkaXJlY3Rvcmllcywgc28gdGhlIGJhc2VsaW5lIG11c3RcbiAgICAgIC8vIGVudGVyIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZSBwYXR0ZXJucyBldmVuIHdoZW4gZXZlcnkgZGVjbGFyZWQgcGF0dGVybiBpcyBhIG5lZ2F0aW9uLlxuICAgICAgY29uc3QgYmFzZWxpbmVHbG9iID0gZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKHBhdHRlcm5Cb2R5KTtcbiAgICAgIGlmIChiYXNlbGluZUdsb2IgIT09IHVuZGVmaW5lZCkgaW5jbHVkZXMuYWRkKGJhc2VsaW5lR2xvYik7XG4gICAgICBuZWdhdGlvbkJvZGllcy5wdXNoKHBhdHRlcm5Cb2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBkaXJQYXR0ZXJuIG9mIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMocGF0dGVybkJvZHksIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICAgIGluY2x1ZGVzLmFkZChkaXJQYXR0ZXJuKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgZXhjbHVkZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBuZWdhdGlvbkJvZHkgb2YgbmVnYXRpb25Cb2RpZXMpIHtcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVFbnRyeSBvZiB0b0V4Y2x1ZGVFbnRyaWVzKG5lZ2F0aW9uQm9keSwgd29ya3NwYWNlRGlyUGF0aHMsIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICBleGNsdWRlcy5hZGQoZXhjbHVkZUVudHJ5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgZXhjbHVkZXM6IFsuLi5leGNsdWRlc10udG9Tb3J0ZWQoKSwgaW5jbHVkZXM6IFsuLi5pbmNsdWRlc10udG9Tb3J0ZWQoKSB9O1xufVxuXG4vKipcbiAqIHRzY29uZmlnIGV4Y2x1ZGUgZW50cmllcyBmb3Igb25lIG5lZ2F0aW9uLiBQYXR0ZXJuLXNoYXBlZCB3aGVuIHRoZSBuZWdhdGlvbiBleGNsdWRlcyBleGFjdGx5XG4gKiB3aGF0IGl0IG1hdGNoZXMgKHN0YWJsZSBvdXRwdXQpOyBwZXItZGlyZWN0b3J5IG90aGVyd2lzZTogYSBkaXJlY3RvcnkgdGhhdCBpcyBhIHdvcmtzcGFjZVxuICogZGVzcGl0ZSB0aGUgbmVnYXRpb24gaXMgbm90IGV4Y2x1ZGVkIGF0IGFsbCwgYW5kIG5laXRoZXIgaXMgYSBQTEFJTiAocGFja2FnZS5qc29uLWxlc3MpXG4gKiBkZXNjZW5kYW50IG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSDigJQgbmVnYXRpbmcgYSBub24tcGFja2FnZSBkaXJlY3RvcnkgaXMgYSBuby1vcCBmb3IgQnVuLFxuICogYW5kIHRoZSBlbmNsb3Npbmcgd29ya3NwYWNlIHN0YXlzIGFjdGl2ZSAoZS5nLiBgWydhcHBzLyoqJywgJyFhcHBzLyoqJywgJ2FwcHMvd2ViJ11gXG4gKiByZS1pbmNsdWRlcyBhcHBzL3dlYiwgd2hvc2Ugc3JjIG11c3Qga2VlcCB0eXBlLWNoZWNraW5nOyBhIHRzY29uZmlnIGV4Y2x1ZGUgd291bGQgb3ZlcnJpZGVcbiAqIHRoZSBpbmNsdWRlKS4gQSBkZXNjZW5kYW50IHdpdGggaXRzIG93biBtYW5pZmVzdCB0aGF0IHRoZSBuZWdhdGlvbiBrZWVwcyBvdXQgb2YgdGhlIHdvcmtzcGFjZVxuICogc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlIGFuZCBzdGF5cyBleGNsdWRlZC4gQSBkaXJlY3RvcnkgdGhhdCBpcyBhblxuICogYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5IGdldHMgb25seSBpdHMgcGFja2FnZS1vd25lZCBzdWJwYXRocyBleGNsdWRlZCwgYmVjYXVzZSBCdW5cbiAqIGV4Y2x1ZGVzIG9ubHkgdGhlIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3Rvcnkgd2hpbGUga2VlcGluZyBkZXNjZW5kYW50IHdvcmtzcGFjZXMgKCMxMDA0KS5cbiAqL1xuZnVuY3Rpb24gdG9FeGNsdWRlRW50cmllcyhuZWdhdGlvbkJvZHk6IHN0cmluZywgd29ya3NwYWNlRGlyUGF0aHM6IFNldDxzdHJpbmc+LCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpc1dvcmtzcGFjZUFuY2VzdG9yID0gKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBbLi4ud29ya3NwYWNlRGlyUGF0aHNdLnNvbWUoKHdvcmtzcGFjZURpclBhdGgpID0+IHdvcmtzcGFjZURpclBhdGguc3RhcnRzV2l0aChgJHtkaXJQYXRofS9gKSk7XG4gIC8vIE9ubHkgUExBSU4gZGlyZWN0b3JpZXMgKG5vIHBhY2thZ2UuanNvbiBvZiB0aGVpciBvd24pIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGVuY2xvc2luZ1xuICAvLyB3b3Jrc3BhY2U6IGEgbWF0Y2hlZCBkaXJlY3RvcnkgdGhhdCBjYXJyaWVzIGl0cyBvd24gbWFuaWZlc3QgeWV0IGlzIGFic2VudCBmcm9tIHRoZSBmaW5hbFxuICAvLyB3b3Jrc3BhY2Ugc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlLCBhbmQgaXRzIGV4Y2x1c2lvbiBtdXN0IHN1cnZpdmUuXG4gIGNvbnN0IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudCA9IChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgWy4uLndvcmtzcGFjZURpclBhdGhzXS5zb21lKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoYCR7d29ya3NwYWNlRGlyUGF0aH0vYCkpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBkaXJQYXRoLCAncGFja2FnZS5qc29uJykpO1xuICBjb25zdCBtYXRjaGVkRGlyUGF0aHMgPSBnZXRNYXRjaGVkRGlyUGF0aHMobmVnYXRpb25Cb2R5LCByb290RGlyUGF0aCk7XG4gIGlmIChcbiAgICAhbWF0Y2hlZERpclBhdGhzLnNvbWUoXG4gICAgICAoZGlyUGF0aCkgPT5cbiAgICAgICAgd29ya3NwYWNlRGlyUGF0aHMuaGFzKGRpclBhdGgpIHx8IGlzV29ya3NwYWNlQW5jZXN0b3IoZGlyUGF0aCkgfHwgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50KGRpclBhdGgpXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhuZWdhdGlvbkJvZHksIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlZERpclBhdGhzLmZsYXRNYXAoKGRpclBhdGgpID0+IHtcbiAgICAvLyBUaGUgZGVzY2VuZGFudCBjaGVjayBwcmVjZWRlcyB0aGUgYW5jZXN0b3Igb25lOiBhIGRpcmVjdG9yeSBpbnNpZGUgb25lIHdvcmtzcGFjZSBidXQgYWJvdmVcbiAgICAvLyBhIG5lc3RlZCBvbmUgKGUuZy4gYXBwcy93ZWIvcGx1Z2lucyBiZXR3ZWVuIHdvcmtzcGFjZXMgYXBwcy93ZWIgYW5kIGFwcHMvd2ViL3BsdWdpbnMveClcbiAgICAvLyBzdGlsbCBiZWxvbmdzIHRvIHRoZSBlbmNsb3NpbmcgYWN0aXZlIHdvcmtzcGFjZSwgc28gbm90aGluZyBvZiBpdCBtYXkgYmUgZXhjbHVkZWQuXG4gICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmhhcyhkaXJQYXRoKSB8fCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQoZGlyUGF0aCkpIHJldHVybiBbXTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VBbmNlc3RvcihkaXJQYXRoKSkge1xuICAgICAgcmV0dXJuIFtgJHtkaXJQYXRofS8qLmNvbmZpZy50c2AsIGAke2RpclBhdGh9L3NjcmlwdHNgLCBgJHtkaXJQYXRofS9zcmNgLCBgJHtkaXJQYXRofS90ZXN0YF07XG4gICAgfVxuICAgIHJldHVybiBbZGlyUGF0aF07XG4gIH0pO1xufVxuXG4vKipcbiAqIERpcmVjdG9yaWVzIGEgbmVnYXRpb24gbWF0Y2hlcy4gVGhlIG1hbmlmZXN0LWJhc2VkIGdsb2IgY29tcGxlbWVudHMgb25seURpcmVjdG9yaWVzIGJlY2F1c2VcbiAqIGZhc3QtZ2xvYidzIGBkaXIvKipgIGRvZXMgbm90IHJldHVybiBgZGlyYCBpdHNlbGYgYXMgYSBkaXJlY3RvcnksIHdoaWxlIGJvdGggQnVuIGFuZCB0aGVcbiAqIG1hbmlmZXN0IGdsb2IgdHJlYXQgYCoqYCBhcyB6ZXJvIG9yIG1vcmUgc2VnbWVudHMgKGBhcHBzLyoqYCBjb3ZlcnMgdGhlIHBhY2thZ2UgYXQgYXBwcykuXG4gKi9cbmZ1bmN0aW9uIGdldE1hdGNoZWREaXJQYXRocyhuZWdhdGlvbkJvZHk6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLmZnLmdsb2JTeW5jKG5lZ2F0aW9uQm9keSwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pLFxuICAgICAgLi4uZmdcbiAgICAgICAgLmdsb2JTeW5jKHBhdGgucG9zaXguam9pbihuZWdhdGlvbkJvZHksICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpXG4gICAgICAgIC5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCBpdHNlbGYsIHdoaWNoIGlzIG5ldmVyIGEgd29ya3NwYWNlLlxuICAgICAgICAuZmlsdGVyKChkaXJQYXRoKSA9PiBkaXJQYXRoICE9PSAnLicpLFxuICAgIF0pLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogdHNjb25maWcgaW5jbHVkZS9leGNsdWRlIHN1cHBvcnQgb25seSB0aGUgYCpgLCBgP2AsIGFuZCBgKipgIHdpbGRjYXJkcywgd2hpbGUgQnVuIHdvcmtzcGFjZXNcbiAqIGFjY2VwdCBmdWxsIGdsb2Igc3ludGF4IChicmFjZSBleHBhbnNpb24sIGNoYXJhY3RlciBjbGFzc2VzLCDigKYpLCBzbyBleHBhbmQgQnVuLW9ubHkgcGF0dGVybnMgdG9cbiAqIHRoZSBjb25jcmV0ZSBkaXJlY3RvcmllcyB0aGV5IG1hdGNoIHRvIGtlZXAgdGhlIGdlbmVyYXRlZCBnbG9icyB2YWxpZCBmb3IgVHlwZVNjcmlwdC5cbiAqL1xuZnVuY3Rpb24gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhwYXR0ZXJuQm9keTogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoIS9bKClbXFxde31dL3UudGVzdChwYXR0ZXJuQm9keSkpIHJldHVybiBbcGF0dGVybkJvZHldO1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybkJvZHksIHtcbiAgICBjd2Q6IHJvb3REaXJQYXRoLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICBvbmx5RGlyZWN0b3JpZXM6IHRydWUsXG4gIH0pO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyAobmVnYXRpdmUgb25lcyBpbmNsdWRlZCkgdGhhdCBzdGF5IGluc2lkZSB0aGUgcmVwb3NpdG9yeTogYWJzb2x1dGVcbiAqIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIHJlbW92ZU5vZGVNb2R1bGVzIG9wZXJhdGUgb24gYW5vdGhlclxuICogcmVwb3NpdG9yeSdzIGZpbGVzLiBEZWNsYXJhdGlvbiBvcmRlciBhbmQgZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZVxuICogcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5mdW5jdGlvbiBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlY2xhcmVkUGF0dGVybnMgPSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcyk7XG4gIC8vIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyBmb3JjZXMgYHBhY2thZ2VzLypgIGludG8gYSBtb25vcmVwbydzIHdvcmtzcGFjZXMgd2hlbiBhXG4gIC8vIHBhY2thZ2VzLyovcGFja2FnZS5qc29uIGFjdHVhbGx5IG1hdGNoZXMsIGJ1dCBpdCBtYXkgbm90IGhhdmUgd3JpdHRlbiB0aGUgcm9vdCBwYWNrYWdlLmpzb25cbiAgLy8geWV0LCBzbyBtaXJyb3IgdGhhdCBub3JtYWxpemF0aW9uIGhlcmUg4oCUIFBSRVBFTkRFRCBsaWtlIHRoZXJlLCBiZWNhdXNlIGEgcG9zaXRpdmUgcGF0dGVyblxuICAvLyBwbGFjZWQgYWZ0ZXIgYSB1c2VyIG5lZ2F0aW9uIHdvdWxkIHJlLWluY2x1ZGUgdGhlIG5lZ2F0ZWQgcGFja2FnZXMgdW5kZXIgQnVuJ3Mgc2VxdWVudGlhbFxuICAvLyBldmFsdWF0aW9uLiBEaXNjb3ZlcnkgY2FsbGVycyBwYXNzIHRoZSBmYWxsYmFjayB1bmNvbmRpdGlvbmFsbHkgZm9yIG1vbm9yZXBvcyDigJQgYVxuICAvLyBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGNvbnRyaWJ1dGVzIG5vIHBhdGhzIHRoZXJlIOKAlCB3aGlsZSBwYXR0ZXJuLXNoYXBlZCBjYWxsZXJzXG4gIC8vIChnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucykgZ2F0ZSBpdCBvbiBhbiBhY3R1YWwgbWF0Y2guXG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID1cbiAgICByb290TGlrZS5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKVxuICAgICAgPyBbJ3BhY2thZ2VzLyonLCAuLi5kZWNsYXJlZFBhdHRlcm5zXVxuICAgICAgOiBkZWNsYXJlZFBhdHRlcm5zO1xuICByZXR1cm4gd29ya3NwYWNlUGF0dGVybnMuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZWNsYXJlZCBwb3NpdGl2ZSBwYXR0ZXJuIGFscmVhZHkgY292ZXJzIGBwYWNrYWdlcy8qYCB1bmRlciBwYXRoIG5vcm1hbGl6YXRpb25cbiAqIChlLmcuIGAuL3BhY2thZ2VzLypgIG9yIGEgdHJhaWxpbmctc2xhc2ggc3BlbGxpbmcpOiBmb3JjaW5nIGEgdGV4dHVhbCBgcGFja2FnZXMvKmAgbmV4dCB0b1xuICogc3VjaCBhIHNwZWxsaW5nIHdvdWxkIHBlcnNpc3QgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybnMgYW5kIHJlLXNjYW4gdGhlIHNhbWUgZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4od29ya3NwYWNlczogUGFja2FnZUpzb25bJ3dvcmtzcGFjZXMnXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcykuc29tZShcbiAgICAod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgICF3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgLy8gQSBgLi5gLXRyYXZlcnNpbmcgb3IgYWJzb2x1dGUgc3BlbGxpbmcgKGUuZy4gYHgvLi4vcGFja2FnZXMvKmApIGlzIGRpc2NhcmRlZCBieVxuICAgICAgLy8gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMsIHNvIGl0IG11c3Qgbm90IGNvdW50IGFzIGNvdmVyaW5nIHBhY2thZ2VzLyog4oCUIHRoYXQgd291bGRcbiAgICAgIC8vIHN1cHByZXNzIHRoZSBmYWxsYmFjayBBTkQgbG9zZSB0aGUgcGF0dGVybiwgbGVhdmluZyBubyBkaXNjb3ZlcmVkIHdvcmtzcGFjZXMuXG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikgJiZcbiAgICAgIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4pID09PSAncGFja2FnZXMvKidcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuaW1wb3J0IHsgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyB9IGZyb20gJy4vd29ya3NwYWNlVXRpbC5qcyc7XG5cbmNvbnN0IFBSSVZBVEVfU0NPUEUgPSAnQHdpbGxib29zdGVyLXByaXZhdGUvJztcblxuY29uc3QgcHJpdmF0ZVJlZ2lzdHJ5SG9zdCA9ICd2ZXJkYWNjaW8tcHJvZHVjdGlvbi1lMzg5LnVwLnJhaWx3YXkuYXBwJztcbmV4cG9ydCBjb25zdCBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcgPSBgQHdpbGxib29zdGVyLXByaXZhdGU6cmVnaXN0cnk9aHR0cHM6Ly8ke3ByaXZhdGVSZWdpc3RyeUhvc3R9L2A7XG5cbi8qKlxuICogV2hldGhlciB0aGlzIHJlcG9zaXRvcnkgZGVhbHMgd2l0aCBgQHdpbGxib29zdGVyLXByaXZhdGUvKmAgcGFja2FnZXMg4oCUIGJ5IGNvbnZlbnRpb24gdGhhdCBzY29wZVxuICogbGl2ZXMgZXhjbHVzaXZlbHkgb24gdGhlIHByaXZhdGUgVmVyZGFjY2lvIHJlZ2lzdHJ5LCBzbyBleGFjdGx5IHRoZXNlIHJlcG9zaXRvcmllcyBuZWVkIHRoZVxuICogVkVSREFDQ0lPX1RPS0VOIHBhc3MtdGhyb3VnaCBpbiB0aGVpciByZXVzYWJsZS13b3JrZmxvdyBjYWxsZXJzLlxuICpcbiAqIEEgcmVwb3NpdG9yeSBxdWFsaWZpZXMgd2hlbiBhbnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBERUNMQVJFUyBhIGRlcGVuZGVuY3kgaW4gdGhlIHNjb3BlIChhbnlcbiAqIGRlcGVuZGVuY3kgZmllbGQpLCBvciBpcyBpdHNlbGYgTkFNRUQgaW4gdGhlIHNjb3BlIChpdCBwdWJsaXNoZXMgdG8gVmVyZGFjY2lvLCBhbmQgcmVsZWFzZS55bWxcbiAqIGRlcml2ZXMgaXRzIG5wbSBhdXRoIGZyb20gdGhlIHNhbWUgc2VjcmV0KS4gTm90aGluZyBlbHNlIGlzIHNjYW5uZWQ6IGxvY2tmaWxlcyBvbmx5IG1pcnJvciB0aGVcbiAqIGRlY2xhcmVkIGRlcGVuZGVuY2llcywgYW5kIGJ1bmZpZy50b21sJ3MgYG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXNgIG1lbnRpb25zIHRoZSBzY29wZSBldmVuIGluXG4gKiByZXBvc2l0b3JpZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnIHwgJ2RvZXNDb250YWluU3ViUGFja2FnZUpzb25zJyB8ICdwYWNrYWdlSnNvbic+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgbWFuaWZlc3RSZWxQYXRocyA9IG5ldyBTZXQoWydwYWNrYWdlLmpzb24nLCAuLi5nZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZyldKTtcbiAgcmV0dXJuIFsuLi5tYW5pZmVzdFJlbFBhdGhzXS5zb21lKChyZWxQYXRoKSA9PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHJlbFBhdGgpKTtcbiAgICBpZiAoIW1hbmlmZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1hbmlmZXN0Lm5hbWU/LnN0YXJ0c1dpdGgoUFJJVkFURV9TQ09QRSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBbXG4gICAgICBtYW5pZmVzdC5kZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5wZWVyRGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3Qub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgXS5zb21lKChkZXBlbmRlbmNpZXMpID0+IE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcyA/PyB7fSkuc29tZSgobmFtZSkgPT4gbmFtZS5zdGFydHNXaXRoKFBSSVZBVEVfU0NPUEUpKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGhhc0Zub3hTeW5jRmFpbGVkLCByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZSB9IGZyb20gJy4vZm5veFRvbWwuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZT86IHN0cmluZztcbiAgb24/OiBPbjtcbiAgY29uY3VycmVuY3k/OiBDb25jdXJyZW5jeTtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBqb2JzOiBSZWNvcmQ8c3RyaW5nLCBKb2I+O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbiAgcXVldWU/OiAnc2luZ2xlJyB8ICdtYXgnO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICAvLyBHaXRIdWIgQWN0aW9ucyB0cmVhdHMgYGV2ZW50OiBudWxsYCBhcyBhIHZhbHVlbGVzcyBldmVudCBtYXBwaW5nLCBlLmcuXG4gIC8vIGBwdWxsX3JlcXVlc3Q6YC4gYHVuZGVmaW5lZGAgd291bGQgb21pdCB0aGUgZXZlbnQgZW50aXJlbHkgd2hlbiBkdW1waW5nIFlBTUwuXG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8ICdpbmhlcml0JztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgICAgfSxcbiAgICAgIC8vIExldCBtYWludGFpbmVycyByZS1ydW4gdGhlIHRlc3RzIGJ5IGhhbmQuXG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIC8vIE5vbmUgb2YgdGhlc2UgbWF5IGJlIG5hcnJvd2VkIGp1c3QgYmVjYXVzZSB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBuZXZlciBwdXNoZXM6XG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciB0aGUgdGVzdCBqb2IncyBza2lwLWR1cGxpY2F0ZS1hY3Rpb25zIGNhbGwgd2l0aCBjYW5jZWxfb3RoZXJzOiB0cnVlICh0aGUgcmV1c2FibGVcbiAgICAgIC8vIHRlc3Qgd29ya2Zsb3cgZGVjbGFyZXMgbm8gcGVybWlzc2lvbnMgb2YgaXRzIG93biwgc28gaXRzIGpvYnMgcnVuIG9uIHRoaXMgdG9rZW4pXG4gICAgICBhY3Rpb25zOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIGBzZW1hbnRpYy1yZWxlYXNlIC0tZHJ5LXJ1bmAsIHdoaWNoIGRvZXMgYSBgZ2l0IHB1c2ggLS1kcnktcnVuYCB0byB2ZXJpZnkgd3JpdGVcbiAgICAgIC8vIGFjY2VzcyBhbmQgYWJvcnRzIHdpdGggRUdJVE5PUEVSTUlTU0lPTiB3aXRob3V0IGl0XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBwa2ctcHJlZmxpZ2h0IFBSIGZpbGUgbGlzdGluZ1xuICAgICAgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICd0ZXN0LXJ1c3QnOiB7XG4gICAgbmFtZTogJ1Rlc3QgUnVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAndGVzdC1ydXN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QtcnVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGBxdWV1ZTogbWF4YCBoZXJlIHRvbyAoIzk3NCk6IEdpdEh1YidzIGRlZmF1bHQgcXVldWUgKGBzaW5nbGVgKSBjYW5jZWxzIGFuIGFscmVhZHktUEVORElOR1xuICAgIC8vIGNhbGxlciBydW4gd2hlbiBhbm90aGVyIG9uZSBxdWV1ZXMg4oCUIGJlZm9yZSBpdHMgam9iIChhbmQgdGhlIHJldXNhYmxlIHdvcmtmbG93J3Mgb3duXG4gICAgLy8gam9iLWxldmVsIGBxdWV1ZTogbWF4YCkgZXZlciBzdGFydHMg4oCUIHNpbGVudGx5IGRyb3BwaW5nIHRoYXQgcmVsZWFzZSB0cmlnZ2VyLlxuICAgIC8vIFRoZSBjYWxsZXItbGV2ZWwgZ3JvdXAgbXVzdCBOT1QgcmV1c2UgdGhlIHJldXNhYmxlIHdvcmtmbG93J3Mgam9iLWxldmVsIGdyb3VwIG5hbWVcbiAgICAvLyAoYHJlbGVhc2UtJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19YCk6IHdvcmtmbG93LWxldmVsIGFuZCBqb2ItbGV2ZWwgZ3JvdXBzIHNoYXJlIG9uZVxuICAgIC8vIHJlcG9zaXRvcnktd2lkZSBuYW1lc3BhY2UsIGFuZCBpZGVudGljYWwgbmFtZXMgZGVhZGxvY2sgdGhlIHJ1biAoXCJDYW5jZWxpbmcgc2luY2UgYVxuICAgIC8vIGRlYWRsb2NrIGZvciBjb25jdXJyZW5jeSBncm91cCAuLi4gd2FzIGRldGVjdGVkIGJldHdlZW4gJ3RvcCBsZXZlbCB3b3JrZmxvdycgYW5kICc8am9iPidcIikuXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICBxdWV1ZTogJ21heCcsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveSc7XG5cbi8qKlxuICogUGFyc2VzIGEgYHVzZXM6YCB2YWx1ZSBjYWxsaW5nIG9uZSBvZiBXaWxsQm9vc3RlcidzIG93biByZXVzYWJsZSB3b3JrZmxvd3MgKG9yIHRoZVxuICogV2lsbEJvb3N0ZXJMYWIgc3luYyBtaXJyb3IpIGludG8gdGhlIHdvcmtmbG93IG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKSBhbmQgZ2l0IHJlZi4gT25seSB0aG9zZVxuICogZm9sbG93IHRoZSBjb250cmFjdCB3YmZ5IGVuZm9yY2VzIOKAlCBjYWxsZXJzIG9mIGFub3RoZXIgb3JnYW5pemF0aW9uJ3Mgc2FtZS1uYW1lZCByZXBvc2l0b3J5IGFyZVxuICogbGVmdCBhbG9uZS4gR2l0SHViIHRyZWF0cyBvd25lci9yZXBvc2l0b3J5IG5hbWVzIGNhc2UtaW5zZW5zaXRpdmVseSwgc28gdGhlIGNvbXBhcmlzb24gZG9lc1xuICogdG9vLCB3aGlsZSB0aGUgd29ya2Zsb3cgcGF0aCBhbmQgcmVmIHN0YXkgY2FzZS1zZW5zaXRpdmUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoXG4gIHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogeyB3b3JrZmxvd05hbWU6IHN0cmluZzsgZXh0ZW5zaW9uOiBzdHJpbmc7IHJlZjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IC9eKFteL10rKVxcLyhbXi9dKylcXC9cXC5naXRodWJcXC93b3JrZmxvd3NcXC8oW14vQF0rPylcXC4oeWE/bWwpQCguKykkL3UuZXhlYyh1c2VzID8/ICcnKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3duZXIgPSBtYXRjaFsxXSEudG9Mb3dlckNhc2UoKTtcbiAgaWYgKChvd25lciAhPT0gJ3dpbGxib29zdGVyJyAmJiBvd25lciAhPT0gJ3dpbGxib29zdGVybGFiJykgfHwgbWF0Y2hbMl0hLnRvTG93ZXJDYXNlKCkgIT09ICdyZXVzYWJsZS13b3JrZmxvd3MnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyB3b3JrZmxvd05hbWU6IG1hdGNoWzNdISwgZXh0ZW5zaW9uOiBtYXRjaFs0XSEsIHJlZjogbWF0Y2hbNV0hIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgLy8gV2l0aCAuZ2l0aHViIG9yIC5naXRodWIvd29ya2Zsb3dzIHN5bWxpbmtlZCBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCB3cml0ZVlhbWwncyBndWFyZHNcbiAgICAvLyBhbHJlYWR5IHJlZnVzZSB0aGUgd3JpdGVzLCBidXQgcmVhZGRpci9ybSBiZWxvdyB3b3VsZCBzdGlsbCBlbnVtZXJhdGUgYW5kIERFTEVURSBmaWxlc1xuICAgIC8vIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIHNvIHJlcXVpcmUgdGhlIGRpcmVjdG9yeSB0byByZXNvbHZlIGluc2lkZSBpdCBiZWZvcmUgYW55XG4gICAgLy8gdHJhdmVyc2FsLCBta2Rpciwgb3IgY2xlYW51cC5cbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgLy8gd2JmeSB3cml0ZXMgLnltbCB3b3JrZmxvd3MsIHNvIGVhY2gga2luZCBtYXBzIHRvIGl0cyAueW1sIGZpbGUuXG4gICAgY29uc3QgZmlsZU5hbWVzQnlLaW5kID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkgY29udGludWU7XG4gICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGVudHJ5Lm5hbWUuc2xpY2UoMCwgLScueW1sJy5sZW5ndGgpLCBlbnRyeS5uYW1lKTtcbiAgICB9XG4gICAgY29uc3QgbWFuZGF0b3J5S2luZHMgPSBbJ3Rlc3QnLCAnc2VtYW50aWMtcHInLCAnY2xvc2UtY29tbWVudCddO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIG1hbmRhdG9yeUtpbmRzLnB1c2goJ3JlbGVhc2UnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgbWFuZGF0b3J5S2luZHMucHVzaCgndGVzdC1ydXN0Jyk7XG4gICAgfVxuICAgIC8vIEEgcHJldmlvdXMgcnVuIG1heSBoYXZlIG1pc3Rha2VuIGEgZ2l0aWdub3JlZCB0aGlyZC1wYXJ0eSBjaGVja291dCBmb3IgcmVwb3NpdG9yeSBSdXN0IGNvZGUuXG4gICAgLy8gUmVtb3ZlIG9ubHkgdGhlIGdlbmVyYXRlZC1zdHlsZSBjYWxsZXI6IGEgc2FtZS1uYW1lZCBjdXN0b20gd29ya2Zsb3cgd2l0aCBhbnkgb3RoZXIgam9iIHN0YXlzLlxuICAgIGlmIChyb290Q29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgdGVzdFJ1c3RGaWxlTmFtZSA9IGZpbGVOYW1lc0J5S2luZC5nZXQoJ3Rlc3QtcnVzdCcpO1xuICAgICAgaWYgKHRlc3RSdXN0RmlsZU5hbWUgJiYgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGgsIHRlc3RSdXN0RmlsZU5hbWUsICd0ZXN0LXJ1c3QnKSkge1xuICAgICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCd0ZXN0LXJ1c3QnKTtcbiAgICAgICAgYXdhaXQgZnNVdGlsLnJlbW92ZUNvbmZpbmVkKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCB0ZXN0UnVzdEZpbGVOYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3diZnknKTtcbiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgbWFuZGF0b3J5S2luZHMpIHtcbiAgICAgIGlmICghZmlsZU5hbWVzQnlLaW5kLmhhcyhraW5kKSkge1xuICAgICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGtpbmQsIGAke2tpbmR9LnltbGApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmlsZU5hbWVzQnlLaW5kLmhhcygnc3luYycpKSB7XG4gICAgICAvLyBUaGUgc3luYyB3b3JrZmxvdydzIGdlbmVyYXRpb24gb3ducyB0aGUgZm9yY2Utc3luYyB3b3JrZmxvdywgc28gcHJvY2Vzc2luZyBpdCBhcyBhblxuICAgICAgLy8gaW5kZXBlbmRlbnQga2luZCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgd3JpdGVzIG9uIHRoZSBzYW1lIHBhdGguXG4gICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCdzeW5jLWZvcmNlJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2luZCwgZmlsZU5hbWVdIG9mIGZpbGVOYW1lc0J5S2luZCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCBhcyBLbm93bktpbmQsIGZpbGVOYW1lKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZTogR2l0SHViIHJlcG9zaXRvcnkgbmFtZXMgYXJlLCBhbmQgYSByZW1vdGUgbWF5IHNwZWxsIHRoaXMgb25lIGFueSB3YXkuIEdldHRpbmcgaXQgd3JvbmdcbiAgLy8gbGV0cyB3YmZ5IHJld3JpdGUgdGhlIHJlcG9zaXRvcnkgdGhhdCBob3N0cyB0aGUgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gIHJldHVybiByZXBvc2l0b3J5Py50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciBldmVyeSBqb2Igb2YgdGhlIHdvcmtmbG93IGZpbGUgY2FsbHMgdGhlIG5hbWVkIFdpbGxCb29zdGVyIHJldXNhYmxlIHdvcmtmbG93IChvd25lclxuICogcmVzdHJpY3RlZCB2aWEgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCkuIFVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgd2JmeSBvd25zIGEgZmlsZSBlbm91Z2ggdG9cbiAqIGRlbGV0ZSBpdDogdW5wYXJzYWJsZSBmaWxlcyBhbmQgZmlsZXMgd2l0aCBhbnkgb3RoZXIgam9iIHJldHVybiBmYWxzZSDigJQgZGVsZXRpbmcgYSB3aG9sZVxuICogd29ya2Zsb3cgb24gYSBsb29zZSBtYXRjaCB3b3VsZCBiZSB0b28gYWdncmVzc2l2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIHdvcmtmbG93TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghZmlsZU5hbWUuZW5kc1dpdGgoJy55bWwnKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGlzVGFyZ2V0Q2FsbCA9ICh1c2VzOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICAgIHR5cGVvZiB1c2VzID09PSAnc3RyaW5nJyAmJiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09IHdvcmtmbG93TmFtZTtcbiAgdHJ5IHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHlhbWwubG9hZChjb250ZW50KSBhcyBXb3JrZmxvdyB8IHVuZGVmaW5lZDtcbiAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qgam9icyA9IE9iamVjdC52YWx1ZXMod29ya2Zsb3cuam9icyk7XG4gICAgICByZXR1cm4gam9icy5sZW5ndGggPiAwICYmIGpvYnMuZXZlcnkoKGpvYikgPT4gaXNUYXJnZXRDYWxsKGpvYj8udXNlcykpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gVW5wYXJzYWJsZSBjb250ZW50IGlzIG5vdCBwcm92YWJseSBhIGNhbGxlciBvZiB0aGUgbmFtZWQgd29ya2Zsb3cuXG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsXG4gIGtpbmQ6IEtub3duS2luZCxcbiAgZmlsZU5hbWUgPSBgJHtraW5kfS55bWxgXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWUgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpXG4gICAgPyAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJ1xuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIEEgbm9uLWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sIGluIGEgcmVwbyB3aXRob3V0IFJ1c3QgY29kZSBtZXJlbHkgc2hhcmVzIHRoZSBuYW1lOyBsZWF2ZSBpdCBhbG9uZS5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnICYmIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBvbGRTZXR0aW5nczogV29ya2Zsb3c7XG4gICAgdHJ5IHtcbiAgICAgIG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQW4gZXhpc3Rpbmcgd29ya2Zsb3cgd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGUgdGVtcGxhdGVcbiAgICAgIC8vIHdpdGhvdXQgbWVyZ2luZyB3b3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSByZXBvc2l0b3J5J3Mgd29ya2Zsb3cuXG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBZQU1MLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB5YW1sLmxvYWQgcmV0dXJucyB1bmRlZmluZWQgZm9yIGVtcHR5L2NvbW1lbnQtb25seSBmaWxlcyBhbmQgbm9uLW9iamVjdHMgZm9yIHNjYWxhclxuICAgIC8vIGRvY3VtZW50cyB3aXRob3V0IHRocm93aW5nOyBkZWVwbWVyZ2Ugd291bGQgY3Jhc2ggb24gdGhlbS5cbiAgICBpZiAodHlwZW9mIG9sZFNldHRpbmdzICE9PSAnb2JqZWN0JyB8fCBvbGRTZXR0aW5ncyA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgYSB3b3JrZmxvdy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfVxuXG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICAvLyBVbmxpa2UgdGhlIHJlbGVhc2UgY2FsbGVyLCB0aGUgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGlzIGludGVudGlvbmFsIGhlcmU6IGEgcGVuZGluZ1xuICAgICAgLy8gZGVwbG95IHRoYXQgaXMgY2FuY2VsbGVkIGFuZCByZXBsYWNlZCBieSBhIG5ld2VyIG9uZSBsb3NlcyBub3RoaW5nIOKAlCB0aGUgbmV3ZXIgZGVwbG95XG4gICAgICAvLyBjb252ZXJnZXMgdGhlIGVudmlyb25tZW50IHRvIHRoZSBsYXRlc3Qgc3RhdGUgYW55d2F5LlxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9IGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZTtcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBlbXB0eSBqb2JzIChhIGJhcmUgYGpvYk5hbWU6YCBwYXJzZXMgYXMgbnVsbCksIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3MsIGFuZCBvdGhlclxuICAgIC8vIG9yZ2FuaXphdGlvbnMnIHJldXNhYmxlIHdvcmtmbG93czogYSBzYW1lLW5hbWVkIGByZXVzYWJsZS13b3JrZmxvd3NgIHJlcG9zaXRvcnkgZWxzZXdoZXJlXG4gICAgLy8gZm9sbG93cyBhIGRpZmZlcmVudCBjb250cmFjdCwgYW5kIG5vcm1hbGl6aW5nIGl0cyBjYWxsZXJzIChzZWNyZXQgaW5qZWN0aW9uL3JlbW92YWwsXG4gICAgLy8gcGVybWlzc2lvbnMpIGNvdWxkIGJyZWFrIHRoZW0uXG4gICAgaWYgKCFqb2IgfHwgIXBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIC8vIERlcGxveSBjYWxsZXJzIG5lZWQgbm8gcmVwb3NpdG9yeSB3cml0ZXM6IHRoZSBjYWxsZWQgcmV1c2FibGUgd29ya2Zsb3cgaW5oZXJpdHMgdGhlIGNhbGxlcidzXG4gIC8vIHRva2VuIHBlcm1pc3Npb25zLCByZXBvc2l0b3JpZXMgZGVmYXVsdCB0aGUgdG9rZW4gdG8gd3JpdGUsIGFuZCB0aGUgcmV1c2FibGUgZGVwbG95IHdvcmtmbG93XG4gIC8vIGF0IG1haW4gcGVyZm9ybXMgbm8gR0lUSFVCX1RPS0VOIHdyaXRlcy4gVGhlIHJlYWQtb25seSBkZWZhdWx0IGlzIGluamVjdGVkIGF0IHRoZSBKT0IgbGV2ZWxcbiAgLy8gKGpvYiBwZXJtaXNzaW9ucyBkbyBub3QgYWZmZWN0IHNpYmxpbmcgam9icywgc28gaW5saW5lIGpvYnMgb3IgcGlubmVkIGNhbGxlZXMg4oCUIHdob3NlIHdyaXRlXG4gIC8vIG5lZWRzIGFyZSB1bmF1ZGl0ZWQg4oCUIGtlZXAgdGhlaXJzKSwgYW5kIG9ubHkgd2hlbiBuZWl0aGVyIHRoZSB3b3JrZmxvdyBub3IgdGhlIGpvYiBkZWNsYXJlc1xuICAvLyBpdHMgb3duIHBlcm1pc3Npb25zIChPSURDIGRlcGxveXMgYWx3YXlzIGRvLCBmb3IgaWQtdG9rZW4pLiBydW4tc2NyaXB0IGNhbGxlcnMgYXJlIGV4Y2x1ZGVkXG4gIC8vIGJlY2F1c2UgYXJiaXRyYXJ5IHBhY2thZ2Ugc2NyaXB0cyBtYXkgcHVzaCBjb21taXRzLlxuICBpZiAoIW5ld1NldHRpbmdzLnBlcm1pc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2IpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2FsbCA9IHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpO1xuICAgICAgaWYgKCFqb2IucGVybWlzc2lvbnMgJiYgY2FsbD8ud29ya2Zsb3dOYW1lID09PSAnZGVwbG95JyAmJiBjYWxsLnJlZiA9PT0gJ21haW4nKSB7XG4gICAgICAgIGpvYi5wZXJtaXNzaW9ucyA9IHsgY29udGVudHM6ICdyZWFkJyB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6XG4gICAgY2FzZSAndGVzdC1ydXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgdGhlIGZvcmNlLXN5bmMgd29ya2Zsb3cgYmFzZWQgb24gdGhlIHN5bmMgd29ya2Zsb3cgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuLy8gd2IncyBnbG9iYWwgb3B0aW9ucyB0aGF0IGNvbnN1bWUgYSBmb2xsb3dpbmcgdmFsdWUgdG9rZW4gKGZyb20gc2hhcmVkT3B0aW9uc0J1aWxkZXIgcGx1c1xuLy8geWFyZ3NPcHRpb25zQnVpbGRlckZvckVudik7IGV2ZXJ5IG90aGVyIGAtYC1wcmVmaXhlZCB0b2tlbiBiZWZvcmUgdGhlIHN1YmNvbW1hbmQgaXMgYSBib29sZWFuLlxuY29uc3Qgd2JHbG9iYWxWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFsnLS13b3JraW5nLWRpcicsICctdycsICctLWVudicsICctLWNhc2NhZGUtZW52J10pO1xuXG4vLyBTdWJjb21tYW5kcyB0aGF0IHJ1biBhIEJJTkFSWSAoc28gdGhlIGZvbGxvd2luZyB0b2tlbiBjYW4gYmUgdGhlIHdiIGV4ZWN1dGFibGUpLCBwZXIgcnVubmVyOiBidW5cbi8vIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYSBwYWNrYWdlIHNjcmlwdCBvZiB0aGF0IG5hbWUpLCBucG0gaGFzIGBleGVjYC9geGAsXG4vLyBhbmQgcG5wbS95YXJuIChCZXJyeSkgaGF2ZSBgZXhlY2AvYGRseGAuXG5jb25zdCBydW5uZXJFeGVjdXRvclN1YmNvbW1hbmRzQnlSdW5uZXI6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHtcbiAgbnBtOiBuZXcgU2V0KFsnZXhlYycsICd4J10pLFxuICBwbnBtOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIHlhcm46IG5ldyBTZXQoWydleGVjJywgJ2RseCddKSxcbiAgYnVuOiBuZXcgU2V0KFsneCddKSxcbn07XG5cbi8vIFJ1bm5lciBvcHRpb25zIHRoYXQgY29uc3VtZSB0aGUgRk9MTE9XSU5HIHRva2VuIGFzIHRoZWlyIHZhbHVlLCBzbyBpdCBpcyBub3QgdGhlIHdiIGV4ZWN1dGFibGVcbi8vIChlLmcuIGBidW4gLS1jd2QgZGlyIHdiIGRlcGxveWAsIGBucHggLXAgcGtnIHdiIGRlcGxveWApLiBBIGNvbnNlcnZhdGl2ZSBzdXBlcnNldCBhY3Jvc3Ncbi8vIG5wbS9wbnBtL3lhcm4vYnVuIGFuZCB0aGUgbnB4L2J1bnggcGFja2FnZSBleGVjdXRvcnMuXG5jb25zdCBydW5uZXJWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgJy0tY3dkJyxcbiAgJy1DJyxcbiAgJy0tcHJlZml4JyxcbiAgJy0tZmlsdGVyJyxcbiAgJy1GJyxcbiAgJy0td29ya3NwYWNlJyxcbiAgJy13JyxcbiAgJy0tZGlyJyxcbiAgJy1wJyxcbiAgJy0tcGFja2FnZScsXG4gICctYycsXG4gICctLWNhbGwnLFxuXSk7XG5cbi8qKiBBZHZhbmNlIHBhc3QgYSBydW5uZXIncyBvcHRpb25zLCBjb25zdW1pbmcgYSBzZXBhcmF0ZSB2YWx1ZSB0b2tlbiB3aGVyZSBvbmUgYXBwbGllcy4gKi9cbmZ1bmN0aW9uIHNraXBSdW5uZXJPcHRpb25zKHRva2Vuczogc3RyaW5nW10sIHN0YXJ0SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgKHRva2Vuc1tpbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgaW5kZXgrKztcbiAgICBpZiAoIW9wdGlvbi5pbmNsdWRlcygnPScpICYmIHJ1bm5lclZhbHVlT3B0aW9ucy5oYXMob3B0aW9uKSAmJiBpbmRleCA8IHRva2Vucy5sZW5ndGgpIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIFRva2VuaXplIGEgc2hlbGwgY29tbWFuZCBsaW5lIGludG8gY29tbWFuZCBzZWdtZW50cywgZWFjaCBhIGxpc3Qgb2YgdG9rZW5zIHdpdGggcXVvdGVzIHJlbW92ZWQuXG4gKiBBIG5ldyBzZWdtZW50IHN0YXJ0cyBhdCBhbiB1bnF1b3RlZCBgJiZgL2B8fGAvYDtgL2B8YC9gJmA7IGFuIHVucXVvdGVkIGAjYCBzdGFydHMgYSBjb21tZW50IHRvXG4gKiBlbmQgb2YgbGluZTsgYSBiYWNrc2xhc2ggZXNjYXBlcyB0aGUgbmV4dCBjaGFyYWN0ZXIgKHNvIGBcXDtgIGlzIGEgbGl0ZXJhbCwgbm90IGEgc2VwYXJhdG9yKTtcbiAqIGdyb3VwaW5nIHBhcmVudGhlc2VzIGAoYC9gKWAgYXJlIHRva2VuIHNlcGFyYXRvcnMsIHNvIGAod2IgZGVwbG95KWAgdG9rZW5pemVzIGFzIGB3YiBkZXBsb3lgLlxuICogU2VnbWVudHMvdG9rZW5zIG1vZGVsIGNvbW1hbmQgc3RydWN0dXJlIHByZWNpc2VseSBlbm91Z2ggdGhhdCBxdW90ZWQgb3BlcmF0b3JzLCBlc2NhcGVkXG4gKiBvcGVyYXRvcnMsIGNvbW1lbnRzLCBhbmQgc3Vic2hlbGwgZ3JvdXBzIG5laXRoZXIgZmFicmljYXRlIG5vciBoaWRlIGEgYHdiIGRlcGxveWAgaW52b2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVTaGVsbENvbW1hbmQoc2NyaXB0OiBzdHJpbmcpOiB7IHNlZ21lbnRzOiBzdHJpbmdbXVtdOyBzYXdIZXJlZG9jOiBib29sZWFuIH0ge1xuICBjb25zdCBzZWdtZW50czogc3RyaW5nW11bXSA9IFtdO1xuICBsZXQgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9ICcnO1xuICBsZXQgaW5Ub2tlbiA9IGZhbHNlO1xuICBsZXQgcXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLy8gV2hldGhlciB0aGUgc2NyaXB0IHVzZXMgYW55IGhlcmVkb2MuIEZhaXRoZnVsbHkgY2xhc3NpZnlpbmcgd2hpY2ggYm9keSBsaW5lcyBhcmUgZGF0YSAodGhlXG4gIC8vIGRlbGltaXRlciB3b3JkIGNhbiBiZSBxdW90ZWQvYmFja3NsYXNoLWVzY2FwZWQsIGA8PC1gIHN0cmlwcyBsZWFkaW5nIHRhYnMsIHRlcm1pbmF0b3JzIG1hdGNoXG4gIC8vIGV4YWN0bHkpIGlzIG1vcmUgdGhhbiB0aGlzIHBhcnNlciBtb2RlbHMsIHNvIGEgaGVyZWRvYyBhbnl3aGVyZSBtYWtlcyBkZXRlY3Rpb24gcmV0dXJuIGZhbHNlLlxuICBsZXQgc2F3SGVyZWRvYyA9IGZhbHNlO1xuICAvLyBIZXJlZG9jIGRlbGltaXRlcnMgd2hvc2UgYm9kaWVzIGJlZ2luIGF0IHRoZSBORVhUIG5ld2xpbmU6IGBjYXQgPDxBIDw8QmAgcXVldWVzIEEgdGhlbiBCLCBhbmRcbiAgLy8gdGhlIGNvbW1hbmRzIEFGVEVSIHRoZSBgPDxgIGhlYWRlciBvbiB0aGUgc2FtZSBsaW5lIHN0aWxsIGV4ZWN1dGUsIHNvIHRoZSBoZWFkZXIgaXMgcmVjb3JkZWRcbiAgLy8gaGVyZSBhbmQgdGhlIGJvZGllcyBhcmUgc2tpcHBlZCBvbmx5IHdoZW4gdGhlIGxpbmUncyBuZXdsaW5lIGlzIHJlYWNoZWQuXG4gIGxldCBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNraXBIZXJlZG9jQm9kaWVzID0gKGZyb21JbmRleDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICBsZXQgY3Vyc29yID0gZnJvbUluZGV4O1xuICAgIGZvciAoY29uc3QgZGVsaW1pdGVyIG9mIHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVycykge1xuICAgICAgd2hpbGUgKGN1cnNvciA8IHNjcmlwdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbGluZVN0YXJ0ID0gY3Vyc29yICsgMTtcbiAgICAgICAgbGV0IGxpbmVFbmQgPSBsaW5lU3RhcnQ7XG4gICAgICAgIHdoaWxlIChsaW5lRW5kIDwgc2NyaXB0Lmxlbmd0aCAmJiBzY3JpcHRbbGluZUVuZF0gIT09ICdcXG4nKSBsaW5lRW5kKys7XG4gICAgICAgIGN1cnNvciA9IGxpbmVFbmQ7XG4gICAgICAgIGlmIChzY3JpcHQuc2xpY2UobGluZVN0YXJ0LCBsaW5lRW5kKS50cmltKCkgPT09IGRlbGltaXRlcikgYnJlYWs7XG4gICAgICAgIGlmIChsaW5lRW5kID49IHNjcmlwdC5sZW5ndGgpIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMgPSBbXTtcbiAgICByZXR1cm4gY3Vyc29yO1xuICB9O1xuICBjb25zdCBlbmRUb2tlbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoaW5Ub2tlbikgdG9rZW5zLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9ICcnO1xuICAgIGluVG9rZW4gPSBmYWxzZTtcbiAgfTtcbiAgY29uc3QgZW5kU2VnbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICBlbmRUb2tlbigpO1xuICAgIHNlZ21lbnRzLnB1c2godG9rZW5zKTtcbiAgICB0b2tlbnMgPSBbXTtcbiAgfTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNjcmlwdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBzY3JpcHRbaW5kZXhdID8/ICcnO1xuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIHF1b3RlID09PSAnXCInKSB7XG4gICAgICAgIC8vIEluc2lkZSBkb3VibGUgcXVvdGVzLCBiYWNrc2xhc2gtbmV3bGluZSBpcyBzdGlsbCBhIGxpbmUgY29udGludWF0aW9uIChib3RoIHJlbW92ZWQpO1xuICAgICAgICAvLyBhbnkgb3RoZXIgZXNjYXBlZCBjaGFyYWN0ZXIgY29udHJpYnV0ZXMgbGl0ZXJhbGx5LlxuICAgICAgICBpZiAoc2NyaXB0W2luZGV4ICsgMV0gPT09ICdcXG4nKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGN1cnJlbnQgKz0gc2NyaXB0WysraW5kZXhdID8/ICcnO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09IHF1b3RlKSBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGVsc2UgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnKSB7XG4gICAgICAvLyBCYWNrc2xhc2gtbmV3bGluZSBpcyBhIGxpbmUgY29udGludWF0aW9uOiB0aGUgc2hlbGwgcmVtb3ZlcyBib3RoLCBqb2luaW5nIHRoZSBsaW5lc1xuICAgICAgLy8gd2l0aG91dCBpbnRyb2R1Y2luZyBhIHRva2VuIGJvdW5kYXJ5LiBBbnkgb3RoZXIgZXNjYXBlZCBjaGFyYWN0ZXIgaXMgYSBsaXRlcmFsLlxuICAgICAgaWYgKHNjcmlwdFtpbmRleCArIDFdID09PSAnXFxuJykge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgKz0gc2NyaXB0WysraW5kZXhdID8/ICcnO1xuICAgICAgaW5Ub2tlbiA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gXCInXCIgfHwgY2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBxdW90ZSA9IGNoYXJhY3RlcjtcbiAgICAgIGluVG9rZW4gPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEEgYDw8YC9gPDwtYCBoZXJlZG9jIHJlZGlyZWN0aW9uOiBpdHMgYm9keSBsaW5lcyAodXAgdG8gdGhlIGRlbGltaXRlciBsaW5lKSBhcmUgREFUQSwgbm90XG4gICAgLy8gY29tbWFuZHMsIHNvIGBjYXQgPDwnRU9GJ1xcbndiIGRlcGxveVxcbkVPRmAgbXVzdCBub3QgcmVhZCBgd2IgZGVwbG95YCBhcyBhbiBpbnZvY2F0aW9uLiBTaW5jZVxuICAgIC8vIHRoZSBjYWxsZXIgZGVjbGluZXMgb24gQU5ZIGhlcmVkb2MsIGZsYWcgaXQgdGhlIGluc3RhbnQgYDw8YCBhcHBlYXJzIOKAlCBiZWZvcmUgcGFyc2luZyB0aGVcbiAgICAvLyBkZWxpbWl0ZXIgd29yZCDigJQgc28gYW4gZXhvdGljIGRlbGltaXRlciAoYDw8K2ApIHRoZSB3b3JkIHNjYW5uZXIgY2Fubm90IHJlYWQgc3RpbGwgZGVjbGluZXMuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJzwnICYmIHNjcmlwdFtpbmRleCArIDFdID09PSAnPCcpIHtcbiAgICAgIHNhd0hlcmVkb2MgPSB0cnVlO1xuICAgICAgbGV0IGN1cnNvciA9IGluZGV4ICsgMjtcbiAgICAgIGlmIChzY3JpcHRbY3Vyc29yXSA9PT0gJy0nKSBjdXJzb3IrKztcbiAgICAgIHdoaWxlICgvWyBcXHRdL3UudGVzdChzY3JpcHRbY3Vyc29yXSA/PyAnJykpIGN1cnNvcisrO1xuICAgICAgbGV0IGRlbGltaXRlciA9ICcnO1xuICAgICAgLy8gVGhlIGRlbGltaXRlciB3b3JkIG1heSBiZSBxdW90ZWQgKGA8PCdFT0YnYCkgb3IgYmFja3NsYXNoLWVzY2FwZWQgKGA8PFxcRU9GYCk7IGVpdGhlciBmb3JtXG4gICAgICAvLyBqdXN0IGRpc2FibGVzIGJvZHkgZXhwYW5zaW9uLCBzbyBjb2xsZWN0IHRoZSBiYXJlIHdvcmQuIE1pc3NpbmcgdGhlIGVzY2FwZWQgZm9ybSB3b3VsZCBkcm9wXG4gICAgICAvLyBgc2F3SGVyZWRvY2AgYW5kIHJlYWQgdGhlIGhlcmVkb2MgYm9keSBhcyBjb21tYW5kcy5cbiAgICAgIGxldCBkZWxpbWl0ZXJRdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgd2hpbGUgKGN1cnNvciA8IHNjcmlwdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGVsaW1pdGVyQ2hhciA9IHNjcmlwdFtjdXJzb3JdID8/ICcnO1xuICAgICAgICBpZiAoZGVsaW1pdGVyUXVvdGUpIHtcbiAgICAgICAgICBpZiAoZGVsaW1pdGVyQ2hhciA9PT0gZGVsaW1pdGVyUXVvdGUpIGRlbGltaXRlclF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGVsc2UgZGVsaW1pdGVyICs9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsaW1pdGVyQ2hhciA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgLy8gQSBiYWNrc2xhc2ggcXVvdGVzIHRoZSBuZXh0IGNoYXJhY3RlciBpbnRvIHRoZSBkZWxpbWl0ZXIgd29yZCAoYDw8XFxFT0ZgIOKGkiBgRU9GYCkuXG4gICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgZGVsaW1pdGVyICs9IHNjcmlwdFtjdXJzb3JdID8/ICcnO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbGltaXRlckNoYXIgPT09IFwiJ1wiIHx8IGRlbGltaXRlckNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBkZWxpbWl0ZXJRdW90ZSA9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoL1tcXHcuLV0vdS50ZXN0KGRlbGltaXRlckNoYXIpKSB7XG4gICAgICAgICAgZGVsaW1pdGVyICs9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY3Vyc29yKys7XG4gICAgICB9XG4gICAgICBpZiAoZGVsaW1pdGVyKSB7XG4gICAgICAgIC8vIFRoZSBgPDxkZWxpbWAgaGVhZGVyIGlzIGEgcmVkaXJlY3Rpb24gKG5vdCBhIHRva2VuKTsgcmVjb3JkIHRoZSBkZWxpbWl0ZXIgYW5kIGtlZXBcbiAgICAgICAgLy8gcGFyc2luZyB0aGUgcmVzdCBvZiB0aGlzIGxpbmUg4oCUIGl0cyBib2R5IGlzIHNraXBwZWQgd2hlbiB0aGUgbmV3bGluZSBpcyByZWFjaGVkLlxuICAgICAgICBlbmRUb2tlbigpO1xuICAgICAgICBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMucHVzaChkZWxpbWl0ZXIpO1xuICAgICAgICBpbmRleCA9IGN1cnNvciAtIDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnIycgJiYgIWluVG9rZW4pIHtcbiAgICAgIC8vIENvbW1lbnQgcnVucyB0byBlbmQgb2YgbGluZTsgZW5kIHRoZSBjdXJyZW50IGNvbW1hbmQgc2VnbWVudCBhbmQgbGV0IHRoZSBsb29wIHJlc3VtZSBhdFxuICAgICAgLy8gdGhlIG5ld2xpbmUgc28gdGhlIG5leHQgbGluZSBpcyBwYXJzZWQgYXMgaXRzIG93biBzZWdtZW50LlxuICAgICAgZW5kU2VnbWVudCgpO1xuICAgICAgd2hpbGUgKGluZGV4ICsgMSA8IHNjcmlwdC5sZW5ndGggJiYgc2NyaXB0W2luZGV4ICsgMV0gIT09ICdcXG4nKSBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcmJyB8fCBjaGFyYWN0ZXIgPT09ICd8JyB8fCBjaGFyYWN0ZXIgPT09ICc7JyB8fCBjaGFyYWN0ZXIgPT09ICdcXG4nKSB7XG4gICAgICBlbmRTZWdtZW50KCk7XG4gICAgICBpZiAoKGNoYXJhY3RlciA9PT0gJyYnIHx8IGNoYXJhY3RlciA9PT0gJ3wnKSAmJiBzY3JpcHRbaW5kZXggKyAxXSA9PT0gY2hhcmFjdGVyKSBpbmRleCsrO1xuICAgICAgLy8gQSBuZXdsaW5lIHRoYXQgY2xvc2VzIGEgaGVyZWRvYyBoZWFkZXIgbGluZSBjb25zdW1lcyB0aGUgcXVldWVkIGJvZGllcyBiZWZvcmUgdGhlIG5leHRcbiAgICAgIC8vIGNvbW1hbmQuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxuJyAmJiBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMubGVuZ3RoID4gMCkgaW5kZXggPSBza2lwSGVyZWRvY0JvZGllcyhpbmRleCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJygnIHx8IGNoYXJhY3RlciA9PT0gJyknKSB7XG4gICAgICBlbmRUb2tlbigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICgvXFxzL3UudGVzdChjaGFyYWN0ZXIpKSB7XG4gICAgICBlbmRUb2tlbigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGN1cnJlbnQgKz0gY2hhcmFjdGVyO1xuICAgIGluVG9rZW4gPSB0cnVlO1xuICB9XG4gIGVuZFNlZ21lbnQoKTtcbiAgcmV0dXJuIHsgc2VnbWVudHMsIHNhd0hlcmVkb2MgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVwbG95IHNjcmlwdCBpbnZva2VzIGB3YiDigKYgZGVwbG95YCBhdCBjb21tYW5kIHBvc2l0aW9uLiBFbnYgYXNzaWdubWVudHMsIHBhY2thZ2VcbiAqIHJ1bm5lcnMsIGFuZCBnbG9iYWwgeWFyZ3Mgb3B0aW9ucyAod2l0aCB0aGVpciB2YWx1ZSB0b2tlbnMpIG1heSBwcmVjZWRlIHRoZSBkZXBsb3kgY29tbWFuZDtcbiAqIHNoZWxsIHF1b3RpbmcsIGVzY2FwaW5nLCBjb21tZW50cywgYW5kIGdyb3VwaW5nIGFyZSBob25vcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdDogc3RyaW5nLCBzY3JpcHROYW1lczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBjb25zdCB7IHNlZ21lbnRzLCBzYXdIZXJlZG9jIH0gPSB0b2tlbml6ZVNoZWxsQ29tbWFuZChkZXBsb3lTY3JpcHQpO1xuICAvLyBBIGhlcmVkb2MgbWFrZXMgYm9keS12cy1jb21tYW5kIGNsYXNzaWZpY2F0aW9uIHVucmVsaWFibGUgKHNlZSB0b2tlbml6ZVNoZWxsQ29tbWFuZCkuXG4gIGlmIChzYXdIZXJlZG9jKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgdG9rZW5zIG9mIHNlZ21lbnRzKSB7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmIC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKj0vdS50ZXN0KHRva2Vuc1tpbmRleF0gPz8gJycpKSBpbmRleCsrO1xuICAgIC8vIExlYWRpbmcgbGF1bmNoZXJzIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBlbnZgICh3aXRoIG9wdGlvbnMgKyBLRVk9dmFsdWUgYXNzaWdubWVudHMpXG4gICAgLy8gYW5kIHRoZSBQT1NJWCBgY29tbWFuZGAgYnVpbHRpbiAod2l0aCBpdHMgYC1wYC9gLXZgL2AtVmAgb3B0aW9ucykuIENvbW1hbmQtcG9zaXRpb24gc2hlbGxcbiAgICAvLyByZXNlcnZlZCB3b3JkcyBhbmQgb3RoZXIgbGF1bmNoZXJzIChgaWZgL2B0aGVuYC9gZm9yYC9gdGltZWAvYGV4ZWNgL2AhYC9icmFjZSBncm91cHMsIOKApikgYXJlXG4gICAgLy8gTk9UIG1vZGVsZWQ6IHRoZXkgbGVhdmUgYSBub24tYHdiYCBmaXJzdCB0b2tlbiwgc28gdGhlIHNlZ21lbnQgc2ltcGx5IGRvZXMgbm90IG1hdGNoLiBUaGlzIGlzXG4gICAgLy8gYSBkZWxpYmVyYXRlIGZhbHNlLW5lZ2F0aXZlIGZvciBnZW5lcmF0ZWQgZ3VpZGFuY2UuXG4gICAgaWYgKHRva2Vuc1tpbmRleF0gPT09ICdlbnYnKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICAgIGlmICgvXltBLVphLXpfXVtBLVphLXowLTlfXSo9L3UudGVzdCh0b2tlbikpIGluZGV4Kys7XG4gICAgICAgIC8vIGVudidzIGRpcmVjdG9yeSB2YWx1ZSBtYXkgYmUgc2VwYXJhdGUgb3IgYXR0YWNoZWQgKGAtQ2RpcmAsIGAtLWNoZGlyPWRpcmApLiBJdCBjaGFuZ2VzXG4gICAgICAgIC8vIHdoZXJlIHdiIHJ1bnMgYnV0IG5vdCB3aGV0aGVyIHRoZSBjb21tYW5kIGludm9rZXMgd2IgZGVwbG95LlxuICAgICAgICBlbHNlIGlmICh0b2tlbiA9PT0gJy1DJyB8fCB0b2tlbiA9PT0gJy0tY2hkaXInKSBpbmRleCArPSAyO1xuICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKCctQycpIHx8IHRva2VuLnN0YXJ0c1dpdGgoJy0tY2hkaXI9JykpIGluZGV4Kys7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuID09PSAnLXUnKSBpbmRleCArPSAyO1xuICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKCctJykpIGluZGV4Kys7XG4gICAgICAgIGVsc2UgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGBjb21tYW5kIENNRGAgZXhlY3V0ZXMgQ01ELCBidXQgYGNvbW1hbmQgLXZgL2AtViBDTURgIG9ubHkgUVVFUlkgaXRzIGF2YWlsYWJpbGl0eSB3aXRob3V0XG4gICAgLy8gcnVubmluZyBpdCwgc28gYSBkZXBsb3kgYmVoaW5kIHRoZW0gZG9lcyBub3QgcnVuLiBUaGUgYHZgL2BWYCBmbGFnIG1heSBiZSBjbHVzdGVyZWQgd2l0aFxuICAgIC8vIG90aGVyIG9wdGlvbiBsZXR0ZXJzIChgY29tbWFuZCAtcHYgd2JgKSwgc28gbWF0Y2ggYW55IG9wdGlvbiBsZXR0ZXIgY2x1c3RlciBjb250YWluaW5nIGl0LlxuICAgIHdoaWxlICh0b2tlbnNbaW5kZXhdID09PSAnY29tbWFuZCcpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBsZXQgcXVlcmllc09ubHkgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgKHRva2Vuc1tpbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBpZiAoL14tW0EtWmEtel0qW3ZWXVtBLVphLXpdKiQvdS50ZXN0KHRva2Vuc1tpbmRleF0gPz8gJycpKSBxdWVyaWVzT25seSA9IHRydWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICBpZiAocXVlcmllc09ubHkpIHtcbiAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbmRleCA8IDApIGNvbnRpbnVlO1xuICAgIC8vIFJlc29sdmUgYSBydW5uZXIgcHJlZml4IHRvIHdoZXRoZXIgdGhlIGZvbGxvd2luZyB0b2tlbiBpcyBhIEJJTkFSWSAodGhlIHdiIGV4ZWN1dGFibGUpIG9yIGFcbiAgICAvLyBwYWNrYWdlIFNDUklQVCBuYW1lLiBgYnVueGAvYG5weGAgYW5kIGA8cG0+IHh8ZGx4fGV4ZWNgIHJ1biBhIGJpbmFyeTsgYDxwbT4gcnVufHJ1bi1zY3JpcHRgXG4gICAgLy8gKGFuZCBiYXJlIGBucG0gPG5hbWU+YCwgb3IgYW55IHJ1bm5lciBmb2xsb3dlZCBieSBgLS1gKSBydW4gYSBwYWNrYWdlIHNjcmlwdCDigJQgc29cbiAgICAvLyBgbnBtIHJ1biB3YiBkZXBsb3lgIGV4ZWN1dGVzIHRoZSBzY3JpcHQgbmFtZWQgYHdiYCwgbm90IHRoZSB3YiBiaW5hcnksIGFuZCBtdXN0IGJlIHJlamVjdGVkLlxuICAgIGlmIChbJ25wbScsICdwbnBtJywgJ3lhcm4nLCAnYnVuJ10uaW5jbHVkZXModG9rZW5zW2luZGV4XSA/PyAnJykpIHtcbiAgICAgIGNvbnN0IHJ1bm5lciA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICBpbmRleCA9IHNraXBSdW5uZXJPcHRpb25zKHRva2VucywgaW5kZXggKyAxKTtcbiAgICAgIGNvbnN0IHN1YmNvbW1hbmQgPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgaWYgKFsncnVuJywgJ3J1bi1zY3JpcHQnXS5pbmNsdWRlcyhzdWJjb21tYW5kKSkgY29udGludWU7IC8vIHJ1bnMgYSBwYWNrYWdlIHNjcmlwdCwgbm90IHdiXG4gICAgICAvLyBFeGVjdXRvciBzdWJjb21tYW5kcyBhcmUgcnVubmVyLVNQRUNJRklDOiBidW4gcmVzZXJ2ZXMgb25seSBgeGAgKGBidW4gZGx4YC9gYnVuIGV4ZWNgIHJ1biBhXG4gICAgICAvLyBwYWNrYWdlIHNjcmlwdCBuYW1lZCBkbHgvZXhlYykuIFJlYWwgYnVpbHQtaW4gZXhlY3V0b3JzIChgZXhlY2AvYHhgLCBhbmQgYGRseGAgZm9yIHBucG0pXG4gICAgICAvLyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBhIHNhbWUtbmFtZWQgc2NyaXB0LCBzbyB0aGV5IGFyZSBOT1Qgc2hhZG93LWNoZWNrZWQuIE9ubHkgYHlhcm4gZGx4YCBpc1xuICAgICAgLy8gYW1iaWd1b3VzIOKAlCBhIEJlcnJ5IGJ1aWx0LWluIGJ1dCBhIHBhY2thZ2UgU0NSSVBUIGluIFlhcm4gQ2xhc3NpYyDigJQgc28gYSBkZWNsYXJlZCBgZGx4YFxuICAgICAgLy8gc2NyaXB0IG1ha2VzIGB5YXJuIGRseGAgZGVjbGluZSAoZmFsbCB0aHJvdWdoIHRvIHRoZSBwYWNrYWdlLXNjcmlwdCBjaGVja3MpLlxuICAgICAgY29uc3QgaXNZYXJuRGx4U2hhZG93ZWRCeVNjcmlwdCA9IHJ1bm5lciA9PT0gJ3lhcm4nICYmIHN1YmNvbW1hbmQgPT09ICdkbHgnICYmIHNjcmlwdE5hbWVzLmhhcygnZGx4Jyk7XG4gICAgICBpZiAocnVubmVyRXhlY3V0b3JTdWJjb21tYW5kc0J5UnVubmVyW3J1bm5lcl0/LmhhcyhzdWJjb21tYW5kKSAmJiAhaXNZYXJuRGx4U2hhZG93ZWRCeVNjcmlwdCkge1xuICAgICAgICBpbmRleCsrOyAvLyBiaW5hcnkgcnVubmVyIChwbnBtIGRseCwgYnVuIHgsIGBucG0gZXhlYyAtLSB3YiDigKZgKVxuICAgICAgICBpZiAodG9rZW5zW2luZGV4XSA9PT0gJy0tJykgaW5kZXgrKzsgLy8gdGhlIGV4ZWN1dG9yJ3Mgb3B0aW9uYWwgYC0tYCBiZWZvcmUgdGhlIGNvbW1hbmRcbiAgICAgIH0gZWxzZSBpZiAocnVubmVyID09PSAnbnBtJykge1xuICAgICAgICBjb250aW51ZTsgLy8gYmFyZSBgbnBtIHdiYCBuZXZlciBydW5zIGEgYmluYXJ5XG4gICAgICB9IGVsc2UgaWYgKHRva2Vuc1tpbmRleF0gPT09ICd3YicgJiYgc2NyaXB0TmFtZXMuaGFzKCd3YicpKSB7XG4gICAgICAgIC8vIEJhcmUgYGJ1bi9wbnBtL3lhcm4gd2JgIHJ1bnMgYSBwYWNrYWdlIFNDUklQVCBuYW1lZCBgd2JgIHdoZW4gb25lIGV4aXN0cyAocGFzc2luZyBgZGVwbG95YFxuICAgICAgICAvLyBhcyBpdHMgYXJndW1lbnQpLCBub3QgdGhlIHdiIGJpbmFyeS5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChbJ2J1bngnLCAnbnB4J10uaW5jbHVkZXModG9rZW5zW2luZGV4XSA/PyAnJykpIHtcbiAgICAgIGluZGV4ID0gc2tpcFJ1bm5lck9wdGlvbnModG9rZW5zLCBpbmRleCArIDEpO1xuICAgIH1cbiAgICBpZiAodG9rZW5zW2luZGV4XSAhPT0gJ3diJykgY29udGludWU7XG4gICAgY29uc3Qgd2JBcmdzID0gdG9rZW5zLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gU2tpcCBnbG9iYWwgb3B0aW9ucyAoYW5kIGFueSB2YWx1ZSB0b2tlbiBhIHZhbHVlLWJlYXJpbmcgb3B0aW9uIGNvbnN1bWVzKSBzbyB0aGUgRklSU1RcbiAgICAvLyBjb21tYW5kIHRva2VuIGRlY2lkZXM6IGB3YiAtLWNhc2NhZGUtZW52IHByb2R1Y3Rpb24gZGVwbG95YCBhbmQgYHdiIC13IHBhY2thZ2VzL2FwaSBkZXBsb3lgXG4gICAgLy8gbWF0Y2gsIHdoaWxlIHN1YmNvbW1hbmRzIG93bmluZyB0aGVpciBvd24gYGRlcGxveWAgKGB3YiBwcmlzbWEgZGVwbG95YCwgYHdiIHJldHJ5IGRlcGxveWApXG4gICAgLy8gZG8gbm90LiBgLS1vcHQ9dmFsdWVgIGNhcnJpZXMgaXRzIHZhbHVlIGlubGluZSwgc28gb25seSB0aGUgc3BhY2Utc2VwYXJhdGVkIGZvcm0gc2tpcHMgb25lLlxuICAgIGxldCBjb21tYW5kSW5kZXggPSAwO1xuICAgIHdoaWxlIChjb21tYW5kSW5kZXggPCB3YkFyZ3MubGVuZ3RoICYmICh3YkFyZ3NbY29tbWFuZEluZGV4XSA/PyAnJykuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICBjb25zdCBmbGFnID0gd2JBcmdzW2NvbW1hbmRJbmRleF0gPz8gJyc7XG4gICAgICBjb21tYW5kSW5kZXgrKztcbiAgICAgIGlmICh3Ykdsb2JhbFZhbHVlT3B0aW9ucy5oYXMoZmxhZykgJiYgY29tbWFuZEluZGV4IDwgd2JBcmdzLmxlbmd0aCkgY29tbWFuZEluZGV4Kys7XG4gICAgfVxuICAgIGlmICh3YkFyZ3NbY29tbWFuZEluZGV4XSAhPT0gJ2RlcGxveScpIGNvbnRpbnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSB3b3JrZmxvd3MgZGlyZWN0b3J5IGhvbGRzIGEgbGl2ZSBjYWxsZXIgb2YgdGhlIHJldXNhYmxlIENsb3VkZmxhcmUgZGVwbG95IHdvcmtmbG93LlxuICogWUFNTCBpcyBwYXJzZWQgYW5kIG9ubHkgYGpvYnMuKi51c2VzYCB2YWx1ZXMgYXJlIGluc3BlY3RlZCAoYSByYXctdGV4dCBzZWFyY2ggd291bGQgbWF0Y2hcbiAqIGNvbW1lbnRzIG9yIGBydW46YCBzdHJpbmdzKSwgd2l0aCBhIGBkZXBsb3kqYC1maWxlbmFtZSBzaG9ydGN1dCBhbmQgYSBjb25zZXJ2YXRpdmUgcmF3LXRleHRcbiAqIGZhbGxiYWNrIGZvciB1bnBhcnNlYWJsZSBmaWxlcy4gVXNlZCBieSB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gZ2VuZXJhdG9yIHNvIGdlbmVyYXRlZCBndWlkYW5jZVxuICogZGVzY3JpYmVzIG9ubHkgd29ya2Zsb3dzIHRoYXQgZXhpc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cod29ya2Zsb3dzRGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBlbnRyaWVzOiBmcy5EaXJlbnRbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMod29ya2Zsb3dzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBvd25lci9yZXBvc2l0b3J5IChHaXRIdWIgdHJlYXRzIHRoZW0gc28pLCBjYXNlLXNlbnNpdGl2ZSBwYXRoL3JlZiDigJQgbWF0Y2hpbmdcbiAgLy8gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCwgdXNlZCBmb3IgdGhlIHVucGFyc2VhYmxlLVlBTUwgcmF3LXRleHQgZmFsbGJhY2sgb25seS5cbiAgY29uc3QgZGVwbG95Q2FsbFBhdHRlcm4gPSAvW14vXStcXC9yZXVzYWJsZS13b3JrZmxvd3NcXC9cXC5naXRodWJcXC93b3JrZmxvd3NcXC9kZXBsb3lcXC55YT9tbEAvaXU7XG4gIGNvbnN0IGNhbGxzRGVwbG95V29ya2Zsb3cgPSAodXNlczogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICAgIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwodXNlcyk/LndvcmtmbG93TmFtZSA9PT0gJ2RlcGxveSc7XG4gIHJldHVybiBlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiB7XG4gICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhL1xcLnlhP21sJC91LnRlc3QoZW50cnkubmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgcmV0dXJuIHRydWU7XG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzRGlyUGF0aCwgZW50cnkubmFtZSksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3JrZmxvdyA9IHlhbWwubG9hZChjb250ZW50KSBhcyBXb3JrZmxvdyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh3b3JrZmxvdyAmJiB0eXBlb2Ygd29ya2Zsb3cgPT09ICdvYmplY3QnICYmIHdvcmtmbG93LmpvYnMgJiYgdHlwZW9mIHdvcmtmbG93LmpvYnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHdvcmtmbG93LmpvYnMpLnNvbWUoKGpvYikgPT4gY2FsbHNEZXBsb3lXb3JrZmxvdyhqb2I/LnVzZXMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkZXBsb3lDYWxsUGF0dGVybi50ZXN0KGNvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIFRoZSByZXVzYWJsZSB3b3JrZmxvd3MgdGhhdCBkZWNsYXJlIEZOT1hfQUdFX0tFWSBhbmQgVkVSREFDQ0lPX1RPS0VOIHVuZGVyXG4vLyBvbi53b3JrZmxvd19jYWxsLnNlY3JldHMgKHNlZSBXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MpLiBQYXNzaW5nIGVpdGhlciBzZWNyZXQgdG8gYW55XG4vLyBvdGhlciBjYWxsZWUgaXMgYSBHaXRIdWIgZXJyb3IuXG5jb25zdCBpbnN0YWxsQ2FwYWJsZVJldXNhYmxlV29ya2Zsb3dzID0gbmV3IFNldChbJ2RlcGxveScsICdyZWxlYXNlJywgJ3J1bi1zY3JpcHQnLCAndGVzdCddKTtcbmNvbnN0IHJldXNhYmxlV29ya2Zsb3dQZXJtaXNzaW9uczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gIC8vIHNraXAtZHVwbGljYXRlLWFjdGlvbnMgcmVhZHMgd29ya2Zsb3cgcnVuczsgY2FuY2VsX290aGVycyBpcyBmYWxzZSwgc28gcmVhZCBpcyBlbm91Z2guXG4gICd0ZXN0LXJ1c3QnOiB7IGFjdGlvbnM6ICdyZWFkJywgY29udGVudHM6ICdyZWFkJyB9LFxuICAnc2VtYW50aWMtcHInOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLCBzdGF0dXNlczogJ3dyaXRlJyB9LFxuICAnY2xvc2UtY29tbWVudCc6IHsgJ3B1bGwtcmVxdWVzdHMnOiAnd3JpdGUnIH0sXG59O1xuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgLy8gYHNlY3JldHM6IGluaGVyaXRgIChwYXJzZWQgYnkganMteWFtbCBhcyBhIHBsYWluIHN0cmluZykgYWxyZWFkeSBmb3J3YXJkcyBldmVyeSBjYWxsZXIgc2VjcmV0XG4gIC8vIGluY2x1ZGluZyB0aGUgb25lcyBpbmplY3RlZCBiZWxvdywgc28gcHJlc2VydmUgaXQgdW50b3VjaGVkIOKAlCBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvbiB0aGVcbiAgLy8gc3RyaW5nIHdvdWxkIHRocm93LiBDYXZlYXQ6IGBpbmhlcml0YCBmb3J3YXJkcyBzZWNyZXRzIHVuZGVyIHRoZWlyIGV4aXN0aW5nIE5BTUVTLCBzbyBpdCBjYW5cbiAgLy8gbmV2ZXIgZmVlZCBQVUJMSUNfRk5PWF9BR0VfS0VZIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWTsgYSBoYW5kLXdyaXR0ZW5cbiAgLy8gaW5oZXJpdCBjYWxsZXIgaW4gYSBQVUJMSUMgZm5veCByZXBvc2l0b3J5IG11c3QgYmUgY29udmVydGVkIHRvIGFuIGV4cGxpY2l0IG1hcHBpbmcgbWFudWFsbHlcbiAgLy8gKHdiZnkgbmV2ZXIgZ2VuZXJhdGVzIHRoZSBpbmhlcml0IGZvcm0sIGFuZCBoYW5kLXdyaXR0ZW4gZGV2aWF0aW9ucyBhcmUgZml4ZWQgaW4gdGhlIHRhcmdldFxuICAvLyByZXBvc2l0b3J5IGJ5IHBvbGljeSkuXG4gIGNvbnN0IHNlY3JldHMgPSBqb2Iuc2VjcmV0cyA9PT0gJ2luaGVyaXQnID8gdW5kZWZpbmVkIDogKGpvYi5zZWNyZXRzID0gam9iLnNlY3JldHMgPz8ge30pO1xuXG4gIGlmIChzZWNyZXRzICYmIChraW5kID09PSAndGVzdCcgfHwga2luZCA9PT0gJ3JlbGVhc2UnKSkge1xuICAgIHNlY3JldHMuR0hfVE9LRU4gPSAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JztcbiAgfVxuXG4gIC8vIGZub3gudG9tbCBjYXJyaWVzIGFnZS1lbmNyeXB0ZWQgYXBwIHNlY3JldHM7IENJIGRlY3J5cHRzIHRoZW0gd2l0aCB0aGUgRk5PWF9BR0VfS0VZIChvciwgZm9yXG4gIC8vIHB1YmxpYyByZXBvc2l0b3JpZXMsIFBVQkxJQ19GTk9YX0FHRV9LRVkpIG9yZ2FuaXphdGlvbiBzZWNyZXQuXG4gIC8vIEtleSB0aGUgaW5qZWN0aW9uIG9uIHRoZSAqY2FsbGVkKiByZXVzYWJsZSB3b3JrZmxvdywgbm90IHRoZSBjYWxsZXIncyBmaWxlbmFtZTogY2FsbGVycyBtYXkgaGF2ZVxuICAvLyBhcmJpdHJhcnkgbmFtZXMgKGUuZy4gc2NoZWR1bGVkIHJ1bi1zY3JpcHQgY2FsbGVycyksIGFuZCBHaXRIdWIgcmVqZWN0cyBwYXNzaW5nIGEgc2VjcmV0IHRoYXQgdGhlXG4gIC8vIGNhbGxlZSBkb2VzIG5vdCBkZWNsYXJlLlxuICAvLyBPbmx5IGFuIEBtYWluIGNhbGxlZSBpcyBrbm93biB0byBmb2xsb3cgdGhlIGN1cnJlbnQgc2VjcmV0IGNvbnRyYWN0OiBhIHdvcmtmbG93IHBpbm5lZCB0byBhblxuICAvLyBvbGRlciB0YWcgb3IgU0hBIG1heSBzdGlsbCBkZWNsYXJlIE5QTV9UT0tFTiAoYW5kIG5vdCBWRVJEQUNDSU9fVE9LRU4pLCBhbmQgR2l0SHViIHJlamVjdHMgYVxuICAvLyBjYWxsZXIgd2hvc2Ugc2VjcmV0cyBkbyBub3QgbWF0Y2ggdGhlIHNlbGVjdGVkIHJldmlzaW9uJ3MgZGVjbGFyYXRpb25zLCBzbyBwaW5uZWQgY2FsbGVycyBrZWVwXG4gIC8vIHRoZWlyIHNlY3JldHMgdW50b3VjaGVkLlxuICBjb25zdCBvcmdXb3JrZmxvd0NhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgY29uc3QgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA9IG9yZ1dvcmtmbG93Q2FsbD8ucmVmID09PSAnbWFpbicgPyBvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXF1aXJlZFBlcm1pc3Npb25zID0gY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA/IHJldXNhYmxlV29ya2Zsb3dQZXJtaXNzaW9uc1tjYWxsZWRSZXVzYWJsZVdvcmtmbG93XSA6IHVuZGVmaW5lZDtcbiAgaWYgKHJlcXVpcmVkUGVybWlzc2lvbnMpIGpvYi5wZXJtaXNzaW9ucyA9IHsgLi4ucmVxdWlyZWRQZXJtaXNzaW9ucyB9O1xuICBpZiAoc2VjcmV0cyAmJiBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ICYmIGluc3RhbGxDYXBhYmxlUmV1c2FibGVXb3JrZmxvd3MuaGFzKGNhbGxlZFJldXNhYmxlV29ya2Zsb3cpKSB7XG4gICAgLy8gVGhlIGNhbGxlZSByb3V0ZXMgcHVibGljIChkZWZhdWx0LXJlZ2lzdHJ5KSBpbnN0YWxscyB0aHJvdWdoIHRoZSBUYWt1bWkgR3VhcmRcbiAgICAvLyBtYWxpY2lvdXMtcGFja2FnZS1ibG9ja2luZyBwcm94eSB3aGVuIHRoaXMgdG9rZW4gcmVzb2x2ZXM7IGFuIHVuc2V0IG9yZ2FuaXphdGlvbiBzZWNyZXRcbiAgICAvLyBleHBhbmRzIHRvICcnIGFuZCB0aGUgY2FsbGVlIHRyZWF0cyB0aGF0IGFzIFwiZmVhdHVyZSBvZmZcIiwgc28gcGFzc2luZyBpdCBpcyBhbHdheXMgc2FmZS5cbiAgICBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiA9ICcke3sgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nO1xuICAgIC8vIFRoZSBjYWxsZWUgZ2VuZXJhdGVzIHRoZSB3b3Jrc3BhY2UgLm5wbXJjIGZvciBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIGZyb20gVkVSREFDQ0lPX1RPS0VOXG4gICAgLy8gYmVmb3JlIGluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLiBPbmx5IHJlcG9zaXRvcmllcyB0aGF0IGFjdHVhbGx5IHJlc29sdmUgcHJpdmF0ZSBwYWNrYWdlc1xuICAgIC8vIChvciBwdWJsaXNoIHRvIFZlcmRhY2NpbykgZ2V0IHRoZSBwYXNzLXRocm91Z2g6IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgY3JlZGVudGlhbCB3b3VsZCBmbG93XG4gICAgLy8gaW50byBDSSBydW5zIHRoYXQgbmV2ZXIgdXNlIGl0LCBzbyB0aGUgbGluZSBpcyByZW1vdmVkIGluc3RlYWQuIFRoZSBHaXRIdWIgc2VjcmV0IGl0c2VsZiBpc1xuICAgIC8vIGFsd2F5cyByZWdpc3RlcmVkIG1hbnVhbGx5IGFuZCBzdGF5cyByZWdpc3RlcmVkIGVpdGhlciB3YXkuXG4gICAgaWYgKHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhjb25maWcpKSB7XG4gICAgICBzZWNyZXRzLlZFUkRBQ0NJT19UT0tFTiA9ICcke3sgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gfX0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU47XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgLy8gUHVibGljIHJlcG9zaXRvcmllcyBjb21taXQgd29ybGQtcmVhZGFibGUgY2lwaGVydGV4dHMsIHNvIHRoZXkgZGVjcnlwdCB3aXRoIGEgZGVkaWNhdGVkXG4gICAgICAvLyBDSSBpZGVudGl0eSAodGhlIFBVQkxJQ19GTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uIHNlY3JldCkgaW5zdGVhZCBvZiB0aGUgb3JnLWludGVybmFsXG4gICAgICAvLyBvbmU7IHRoZSBjYWxsZWUgc3RpbGwgcmVjZWl2ZXMgaXQgdW5kZXIgaXRzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSBuYW1lLiBXaGVuIG5vIENJXG4gICAgICAvLyBpZGVudGl0eSByZXNvbHZlcyAoc2VlIGZub3hBZ2VLZXlNYXBwaW5nKSwgbGVhdmUgYW55IGV4aXN0aW5nIG1hcHBpbmcgdW50b3VjaGVkIGFuZCBhZGRcbiAgICAgIC8vIG5vbmU6IGNyZWF0aW5nIG9yIHJld3JpdGluZyBvbmUgb24gaW5jb21wbGV0ZSBpbmZvcm1hdGlvbiB3b3VsZCBtYXAgYSBwb3NzaWJseS1wdWJsaWNcbiAgICAgIC8vIHJlcG9zaXRvcnkgdG8gdGhlIHdyb25nIGlkZW50aXR5LCBhbmQgYSBmbm94IHJlY2lwaWVudCBzeW5jIGZhaWx1cmUgZG9lcyBub3Qgc3RvcCB0aGlzXG4gICAgICAvLyBnZW5lcmF0b3IgZnJvbSB3cml0aW5nIGZpbGVzIOKAlCB0aGUgZmFpbGVkIHJ1bidzIHJlcnVuIGZpbGxzIHRoZSBtYXBwaW5nIGluLlxuICAgICAgY29uc3QgbWFwcGluZyA9IGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZyk7XG4gICAgICBpZiAobWFwcGluZykge1xuICAgICAgICBzZWNyZXRzLkZOT1hfQUdFX0tFWSA9IG1hcHBpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0Jykge1xuICAgIGNvbnN0IFtydXN0RGlyUGF0aF0gPSBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHM7XG4gICAgaWYgKHJ1c3REaXJQYXRoICYmIHJ1c3REaXJQYXRoICE9PSAnLicpIHtcbiAgICAgIGpvYi53aXRoLndvcmtpbmdfZGlyZWN0b3J5ID0gcnVzdERpclBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNvbnN0cnVjdCBmcm9tIHRoZSBwYXJzZWQgY2FsbCBzbyBhIGRpZmZlcmVudGx5IGNhc2VkIG93bmVyIChHaXRIdWIgaXMgY2FzZS1pbnNlbnNpdGl2ZVxuICAvLyB0aGVyZSkgaXMgYWxzbyBub3JtYWxpemVkIHRvIHRoZSByZXBvc2l0b3J5J3Mgb3duIG9yZ2FuaXphdGlvbiAvIG1pcnJvci5cbiAgaWYgKG9yZ1dvcmtmbG93Q2FsbCAmJiBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzLyR7b3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZX0uJHtvcmdXb3JrZmxvd0NhbGwuZXh0ZW5zaW9ufUAke29yZ1dvcmtmbG93Q2FsbC5yZWZ9YDtcbiAgfSBlbHNlIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyTGFiL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQW4gZXhpc3RpbmcgZ2l0aHViX2hvc3RlZF9ydW5uZXIgb24gYSBQUklWQVRFIHJlcG9zaXRvcnkgaXMgcHJlc2VydmVkIG9uIHB1cnBvc2U6IHRoZSBpbnB1dFxuICAgIC8vIGV4aXN0cyBwcmVjaXNlbHkgc28gYSBwcml2YXRlIGNhbGxlciBjYW4gb3B0IGludG8gR2l0SHViLWhvc3RlZCBydW5uZXJzLCBhbmQgd2JmeSBtdXN0IG5vdFxuICAgIC8vIHJldmVydCB0aGF0IG1hbnVhbCBjaG9pY2UgKG9ubHkgdGhlIG90aGVyIGtpbmRzIGJlbG93IG5ldmVyIHRha2UgdGhlIGlucHV0KS5cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChzZWNyZXRzKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhzZWNyZXRzKTtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBzZWNyZXQgZXhwcmVzc2lvbiB0aGUgY2FsbGVyIG1hcHMgaW50byB0aGUgY2FsbGVlJ3MgZGVjbGFyZWQgRk5PWF9BR0VfS0VZLCBvciB1bmRlZmluZWRcbiAqIHdoZW4gdGhlIHJlcG9zaXRvcnkgc3RhdGUgZG9lcyBub3QgaWRlbnRpZnkgYSB1c2FibGUgQ0kgaWRlbnRpdHkg4oCUIGFuIHVua25vd24gdmlzaWJpbGl0eSwgYVxuICogcmVwb3NpdG9yeSBubyBDSSBzY29wZSBjb3ZlcnMgKGRlcml2aW5nIGZyb20gdGhlIHNhbWUgcHJpbmNpcGFsIHJvc3RlciBhcyB0aGUgcmVjaXBpZW50IHN5bmNcbiAqIGtlZXBzIHRoZSB0d28gZnJvbSBldmVyIGRpc2FncmVlaW5nKSwgb3IgYSBmYWlsZWQgZm5veCByZWNpcGllbnQgc3luYywgd2hvc2UgY2lwaGVydGV4dHMgbWF5XG4gKiBzdGlsbCB0YXJnZXQgdGhlIHByZXZpb3VzIGlkZW50aXR5LiBUaGUgY2FsbGVyIG11c3QgdGhlbiBwcmVzZXJ2ZSBhbnkgZXhpc3RpbmcgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gZm5veEFnZUtleU1hcHBpbmcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duIHx8IGhhc0Zub3hTeW5jRmFpbGVkKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNlY3JldE5hbWUgPSByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShjb25maWcpO1xuICByZXR1cm4gc2VjcmV0TmFtZSAmJiBgXFwke3sgc2VjcmV0cy4ke3NlY3JldE5hbWV9IH19YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBBIHBlcm1pc3Npb25zIG9iamVjdCBlbXB0aWVkIGJ5IHRoZSBwZXIta2luZCBkZWxldGlvbnMgKGUuZy4gYW4gZXhpc3RpbmcgdGVzdC1ydXN0IGNhbGxlclxuICAvLyB3aG9zZSBvbmx5IGVudHJ5IHdhcyBgYWN0aW9uc2ApIG11c3QgYmUgZHJvcHBlZCBlbnRpcmVseTogYHBlcm1pc3Npb25zOiB7fWAgc3RyaXBzIEVWRVJZXG4gIC8vIHRva2VuIHBlcm1pc3Npb24gZnJvbSB0aGUgd29ya2Zsb3csIHVubGlrZSB0aGUgYWJzZW50IGtleSB3aGljaCBrZWVwcyB0aGUgZGVmYXVsdHMuXG4gIGlmIChuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyAmJiBPYmplY3Qua2V5cyhuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zO1xuICB9XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMgfSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGZpeFR5cG9zIHJ1bnMgb25jZSBvbiB0aGUgcm9vdCBjb25maWcsIHNvIHRoaXMgZ2xvYiBzZXQgbXVzdCBjb3ZlciBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2VcbiAgICAvLyBsYXlvdXQgKGUuZy4gYXBwcy8qKSwgbm90IGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeSDigJQgd2hpbGUgaG9ub3JpbmdcbiAgICAvLyBkZWNsYXJlZCBuZWdhdGlvbnMgKGUuZy4gYCFhcHBzL2V4Y2x1ZGVkYCksIHdob3NlIHNvdXJjZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtb25vcmVwby5cbiAgICBjb25zdCB3b3Jrc3BhY2VEaXJQYXR0ZXJucyA9IGdldFdvcmtzcGFjZURpclBhdHRlcm5zKHBhY2thZ2VDb25maWcpO1xuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBmZy5nbG9iKFxuICAgICAgW1xuICAgICAgICAne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5pbmNsdWRlcy5tYXAoXG4gICAgICAgICAgKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9YFxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHtcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsIC4uLndvcmtzcGFjZURpclBhdHRlcm5zLmV4Y2x1ZGVzLm1hcCgoZGlyUGF0dGVybikgPT4gYCR7ZGlyUGF0dGVybn0vKipgKV0sXG4gICAgICB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0cycpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50XG4gICAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgICAvLyBUaGUgd29yZCBib3VuZGFyeSBhbmQgdHJhaWxpbmctd2hpdGVzcGFjZSBndWFyZCBrZWVwIHdvcmRzIG1lcmVseSBlbmRpbmcgaW4gdGhlXG4gICAgICAvLyBhYmJyZXZpYXRpb24gbGV0dGVycyAoZS5nLiBcImNvb2tpZS5cIiwgXCJsZWcuXCIpIGludGFjdC5cbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnJDEvLyQyY2YuJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJlZ1xcLig/PVxcc3wkKS9nLCAnJDEvLyQyZS5nLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiaWVcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmkuZS4nKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgLy8gVGhlIGRvdCBtdXN0IGJlIGVzY2FwZWQ6IGFuIHVuZXNjYXBlZCBgLmAgbWF0Y2hlcyBBTlkgY2hhcmFjdGVyLCBzbyBgbGVnaXRgIGxvc3QgaXRzIGBsYCBhbmQgYGVgLlxuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC9cXC5naXQkL3UsICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICByZXR1cm4gc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgc3RhdHVzID09PSA0MDQ7XG59XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICAvLyBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHNvIGNyZWRlbnRpYWwgc2VsZWN0aW9uIChhbmQgdGhlIGNhY2hlIGtleSkgbXVzdFxuICAvLyBub3QgZGVwZW5kIG9uIGhvdyBhIHJlbW90ZSBVUkwgaGFwcGVucyB0byBzcGVsbCB0aGUgb3JnYW5pemF0aW9uLlxuICBjb25zdCBrZXkgPSBvd25lcj8udG9Mb3dlckNhc2UoKSA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG9uIHB1cnBvc2U6IGEgbm9uY2Fub25pY2FsbHkgY2FzZWQgcmVtb3RlIChlLmcuIGdpdGh1Yi5jb20vd2lsbGJvb3N0ZXJsYWIv4oCmKVxuICAvLyBtdXN0IHN0aWxsIHNlbGVjdCB0aGUgb3JnYW5pemF0aW9uJ3Mgb3duIFBBVCDigJQgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIGJyYW5jaCB3b3VsZFxuICAvLyBwcmVmZXIgdGhlIE9USEVSIG9yZ2FuaXphdGlvbidzIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgdGhpcyBvcmdhbml6YXRpb24ncyBwcml2YXRlXG4gIC8vIHJlcG9zaXRvcmllcy5cbiAgY29uc3Qgbm9ybWFsaXplZE93bmVyID0gb3duZXI/LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChub3JtYWxpemVkT3duZXIgPT09ICd3aWxsYm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXJsYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4gfHxcbiAgICBnZXRHaXRIdWJDbGlUb2tlbigpXG4gICk7XG59XG5cbmxldCBnaXRIdWJDbGlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRHaXRIdWJDbGlUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZ2l0SHViQ2xpVG9rZW4gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbWUgbG9jYWwgcnVucyByZWx5IG9uIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBleHBvcnRlZCBlbnYgdG9rZW5zLlxuICAgIGdpdEh1YkNsaVRva2VuID1cbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAuZXhlY0ZpbGVTeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRyaW0oKSB8fCAnJztcbiAgfSBjYXRjaCB7XG4gICAgZ2l0SHViQ2xpVG9rZW4gPSAnJztcbiAgfVxuICByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IGFwcGx5RWRpdHMsIGNyZWF0ZVNjYW5uZXIsIGZpbmROb2RlQXRMb2NhdGlvbiwgbW9kaWZ5LCBwYXJzZSBhcyBwYXJzZUpzb25jLCBwYXJzZVRyZWUgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuXG4vLyBqc29uYy1wYXJzZXIgZGVjbGFyZXMgU3ludGF4S2luZC9TY2FuRXJyb3IgYXMgYW1iaWVudCBjb25zdCBlbnVtcywgd2hpY2ggY2Fubm90IGJlIGltcG9ydGVkXG4vLyB1bmRlciB2ZXJiYXRpbU1vZHVsZVN5bnRheDsgbWlycm9yIHRoZSBuZWVkZWQgbWVtYmVyIHZhbHVlcyBsb2NhbGx5LlxuY29uc3Qgc3ludGF4S2luZCA9IHsgbGluZUNvbW1lbnRUcml2aWE6IDEyLCBibG9ja0NvbW1lbnRUcml2aWE6IDEzLCBsaW5lQnJlYWtUcml2aWE6IDE0LCB0cml2aWE6IDE1LCBlb2Y6IDE3IH07XG5jb25zdCBzY2FuRXJyb3JOb25lID0gMDtcblxuZXhwb3J0IGNvbnN0IGpzb25jVXRpbCA9IHtcbiAgLyoqXG4gICAqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaG9sZHMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwg4oCUIG9ubHkgd2hpdGVzcGFjZSwgY29tcGxldGUgY29tbWVudHMsXG4gICAqIGFuZC9vciBhIEJPTS4gdHNjIHRyZWF0cyBzdWNoIGEgdHNjb25maWcuanNvbiBhcyBhbiBlbXB0eSBjb25maWcsIHNvIGdlbmVyYXRvcnMgc2hvdWxkIHRyZWF0XG4gICAqIGl0IGxpa2UgYSBtaXNzaW5nIGZpbGUgKGFuZCBnZW5lcmF0ZSBkZWZhdWx0cykgaW5zdGVhZCBvZiByZWZ1c2luZyB0byBtYW5hZ2UgaXQuIExleGljYWxseVxuICAgKiBicm9rZW4gdHJpdmlhIChlLmcuIGFuIHVudGVybWluYXRlZCBibG9jayBjb21tZW50KSBpcyBOT1QgdHJpdmlhLW9ubHk6IHRoZSBmaWxlIG11c3QgYmUgbGVmdFxuICAgKiB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gb3ZlcndyaXR0ZW4gd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGlzVHJpdmlhT25seShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgaWYgKFxuICAgICAgICAoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSB8fFxuICAgICAgICAoa2luZCAhPT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC50cml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmxpbmVCcmVha1RyaXZpYSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUGFyc2VzIGEgSlNPTkMgKEpTT04gd2l0aCBjb21tZW50cykgb2JqZWN0IGZyb20gY29uZmlnIGZpbGVzIHN1Y2ggYXMgdHNjb25maWcuanNvbixcbiAgICogcHlyaWdodGNvbmZpZy5qc29uLCByZW5vdmF0ZS5qc29uLCAudnNjb2RlL3NldHRpbmdzLmpzb24sIGFuZCB3cmFuZ2xlci5qc29uYy5cbiAgICpcbiAgICoganNvbmMtcGFyc2VyIGlzIGZhdWx0IHRvbGVyYW50IGFuZCByZXR1cm5zIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCwgd2hpY2ggbXVzdFxuICAgKiBub3QgYmUgdHJlYXRlZCBhcyB0aGUgZmlsZSdzIGNvbmZpZ3VyYXRpb247IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IgaW5zdGVhZC4gQSBsZWFkaW5nIEJPTSBpc1xuICAgKiBzdHJpcHBlZCBiZWNhdXNlIFR5cGVTY3JpcHQgYWNjZXB0cyBCT00nZCBjb25maWcgZmlsZXMgd2hpbGUganNvbmMtcGFyc2VyIHJlcG9ydHMgdGhlIEJPTSBhc1xuICAgKiBhIHBhcnNlIGVycm9yLlxuICAgKi9cbiAgcGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFQgZXh0ZW5kcyBvYmplY3Q+KGNvbnRlbnQ6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSnNvbmMoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSwgcGFyc2VFcnJvcnMsIHsgYWxsb3dUcmFpbGluZ0NvbW1hOiB0cnVlIH0pIGFzXG4gICAgICB8IFRcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBwYXJzZUVycm9ycy5sZW5ndGggPT09IDAgJiYgISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgPyB2YWx1ZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIC8qKiBUZWxscyB3aGV0aGVyIHRoZSBjb250ZW50IGNhcnJpZXMgYXQgbGVhc3Qgb25lIGNvbW1lbnQsIGkuZS4gY29udGVudCBKU09OLnN0cmluZ2lmeSB3b3VsZCBkcm9wLiAqL1xuICBjb250YWluc0NvbW1lbnQoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXIoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSk7XG4gICAgZm9yIChsZXQga2luZDogbnVtYmVyID0gc2Nhbm5lci5zY2FuKCk7IGtpbmQgIT09IHN5bnRheEtpbmQuZW9mOyBraW5kID0gc2Nhbm5lci5zY2FuKCkpIHtcbiAgICAgIC8vIEEgbGV4aWNhbCBlcnJvciBtZWFucyB0aGUgcmVtYWluaW5nIHRva2VucyBhcmUgdW5yZWxpYWJsZTsgcmVwb3J0IG5vIGNvbW1lbnQgcmF0aGVyIHRoYW5cbiAgICAgIC8vIGd1ZXNzaW5nLCBzaW5jZSBjYWxsZXJzIG9ubHkgdXNlIHRoaXMgdG8gZGVjaWRlIHdoZXRoZXIgdG8gd2FybiBhYm91dCBkcm9wcGVkIGNvbW1lbnRzLlxuICAgICAgaWYgKChzY2FubmVyLmdldFRva2VuRXJyb3IoKSBhcyBudW1iZXIpICE9PSBzY2FuRXJyb3JOb25lKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoa2luZCA9PT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSB8fCBraW5kID09PSBzeW50YXhLaW5kLmJsb2NrQ29tbWVudFRyaXZpYSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYHNldHRpbmdzYCBpbnRvIGBvbGRDb250ZW50YCwgZWRpdGluZyBvbmx5IHRoZSB0b3AtbGV2ZWwgcHJvcGVydGllcyB3aG9zZSB2YWx1ZXNcbiAgICogY2hhbmdlZCBzbyB0aGUgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgb2YgYW4gZXhpc3RpbmcgZmlsZSBzdXJ2aXZlLiBDYWxsZXJzIG5ldmVyIGRyb3BcbiAgICogcHJvcGVydGllcyAoZ2VuZXJhdGVkIHNldHRpbmdzIGFyZSBtZXJnZWQgT04gVE9QIG9mIHRoZSBleGlzdGluZyBvbmVzKSwgc28gcmVtb3ZhbHMgYXJlIG5vdFxuICAgKiBoYW5kbGVkOiBhIHByb3BlcnR5IG1pc3NpbmcgZnJvbSBgc2V0dGluZ3NgIGlzIGxlZnQgdW50b3VjaGVkIHJhdGhlciB0aGFuIGRlbGV0ZWQuXG4gICAqXG4gICAqIFRyaXZpYS1vbmx5IGNvbnRlbnQga2VlcHMgaXRzIGNvbW1lbnRzIGFzIGEgaGVhZGVyIGFib3ZlIHRoZSBnZW5lcmF0ZWQgb2JqZWN0LCByYXRoZXIgdGhhblxuICAgKiBiZWluZyByZXBsYWNlZCBvdXRyaWdodCBvciBydW4gdGhyb3VnaCBtb2RpZnkoKSAod2hpY2ggd291bGQgbW92ZSB0aGUgb2JqZWN0IGluIGZyb250IG9mIHRoZW0pLlxuICAgKi9cbiAgc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShcbiAgICBvbGRDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHsgY29udGVudDogc3RyaW5nOyBrZXlzTG9zaW5nQ29tbWVudHM6IHN0cmluZ1tdIH0ge1xuICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpLCBrZXlzTG9zaW5nQ29tbWVudHM6IFtdIH07XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvbGRDb250ZW50KTtcbiAgICAvLyBEcm9wIGEgbGVhZGluZyBCT006IG1vZGlmeSgpIGluc2VydHMgdGhlIGdlbmVyYXRlZCBvYmplY3QgQkVGT1JFIGFueSBsZWFkaW5nIHRyaXZpYSwgd2hpY2hcbiAgICAvLyB3b3VsZCBsZWF2ZSB0aGUgQk9NIHN0cmFuZGVkIG1pZC1maWxlIHdoZXJlIGl0IGlzIGEgc3ludGF4IGVycm9yIHJhdGhlciB0aGFuIGFuIGlnbm9yZWQgbWFyay5cbiAgICBsZXQgY29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJyk7XG4gICAgaWYgKGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoY29udGVudCkpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IGNvbnRlbnQudHJpbSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogYCR7aGVhZGVyID8gaGVhZGVyICsgJ1xcbicgOiAnJ30ke0pTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpfWAsXG4gICAgICAgIGtleXNMb3NpbmdDb21tZW50czogW10sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBtb2RpZnlPcHRpb25zID0geyBmb3JtYXR0aW5nT3B0aW9uczogZGV0ZWN0Rm9ybWF0dGluZ09wdGlvbnMoY29udGVudCkgfTtcbiAgICBjb25zdCBrZXlzTG9zaW5nQ29tbWVudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmV3RW50cmllczogW3N0cmluZywgdW5rbm93bl1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNldHRpbmdzKSkge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSBvbGRTZXR0aW5ncz8uW2tleV07XG4gICAgICAvLyBDb21wYXJlIHNlcmlhbGl6ZWQgZm9ybXMgc28gZGVlcC1lcXVhbCB2YWx1ZXMgKGUuZy4gYSByZS1tZXJnZWQgYGV4dGVuZHNgIGFycmF5KSBkbyBub3RcbiAgICAgIC8vIHJld3JpdGUgdGhlIHByb3BlcnR5IGFuZCByZWZsb3cgaXRzIGZvcm1hdHRpbmcuXG4gICAgICBpZiAoSlNPTi5zdHJpbmdpZnkob2xkVmFsdWUpID09PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3RW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gUmVwbGFjaW5nIGEgd2hvbGUgYXJyYXkgd291bGQgZGlzY2FyZCB0aGUgY29tbWVudHMgYmV0d2VlbiBpdHMgZWxlbWVudHMsIHNvIGdyb3cgaXQgd2l0aFxuICAgICAgLy8gcGVyLWVsZW1lbnQgaW5zZXJ0aW9ucyB3aGVuZXZlciB0aGUgbmV3IHZhbHVlIG9ubHkgYWRkcyB0byBpdC5cbiAgICAgIGNvbnN0IGluc2VydGlvbnMgPSBBcnJheS5pc0FycmF5KG9sZFZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlLCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IGluc2VydGlvbiBvZiBpbnNlcnRpb25zID8/IFtdKSB7XG4gICAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgbW9kaWZ5KGNvbnRlbnQsIFtrZXksIGluc2VydGlvbi5pbmRleF0sIGluc2VydGlvbi52YWx1ZSwgeyAuLi5tb2RpZnlPcHRpb25zLCBpc0FycmF5SW5zZXJ0aW9uOiB0cnVlIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRlbnQgPSByZXN0b3JlVHJhaWxpbmdDb21tZW50KGNvbnRlbnQsIGtleSwgaW5zZXJ0aW9uLmluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnNlcnRpb25zKSBjb250aW51ZTtcbiAgICAgIC8vIFJld3JpdGluZyB0aGUgd2hvbGUgdmFsdWUgaXMgdGhlIG9ubHkgb3B0aW9uIGxlZnQgKHRoZSBuZXcgb25lIGRyb3BzIG9yIHJlb3JkZXJzIGVsZW1lbnRzKSxcbiAgICAgIC8vIGFuZCBpdCB0YWtlcyBhbnkgY29tbWVudCBuZXN0ZWQgaW5zaWRlIGl0IGFsb25nLiBSZXBvcnQgdGhhdCByYXRoZXIgdGhhbiBsb3NpbmcgaXQgcXVpZXRseS5cbiAgICAgIGNvbnN0IHJlcGxhY2VkVGV4dCA9IHZhbHVlVGV4dE9mKGNvbnRlbnQsIGtleSk7XG4gICAgICBpZiAocmVwbGFjZWRUZXh0ICE9PSB1bmRlZmluZWQgJiYganNvbmNVdGlsLmNvbnRhaW5zQ29tbWVudChyZXBsYWNlZFRleHQpKSBrZXlzTG9zaW5nQ29tbWVudHMucHVzaChrZXkpO1xuICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoY29udGVudCwgbW9kaWZ5KGNvbnRlbnQsIFtrZXldLCB2YWx1ZSwgbW9kaWZ5T3B0aW9ucykpO1xuICAgIH1cbiAgICAvLyBQcmVwZW5kIHJhdGhlciB0aGFuIGFwcGVuZCB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSBuZXc6IGFwcGVuZGluZyBkZXRhY2hlcyBhIHRyYWlsaW5nXG4gICAgLy8gc2FtZS1saW5lIGNvbW1lbnQgZnJvbSB0aGUgbGFzdCBwcm9wZXJ0eSwgbGVhdmluZyBpdCB0byBkZXNjcmliZSB0aGUgZ2VuZXJhdGVkIHZhbHVlXG4gICAgLy8gaW5zdGVhZC4gSW5zZXJ0aW5nIGluIHJldmVyc2Uga2VlcHMgdGhlIG9yZGVyIHRoZSBzZXR0aW5ncyBkZWNsYXJlIHRoZW0gaW4uXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbmV3RW50cmllcy50b1JldmVyc2VkKCkpIHtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgZ2V0SW5zZXJ0aW9uSW5kZXg6ICgpID0+IDAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfTtcbiAgfSxcbn07XG5cbi8qKiBSZXR1cm5zIHRoZSBzb3VyY2UgdGV4dCBvZiBhIHRvcC1sZXZlbCBwcm9wZXJ0eSdzIHZhbHVlLCBjb21tZW50cyBhbmQgYWxsLiAqL1xuZnVuY3Rpb24gdmFsdWVUZXh0T2YoY29udGVudDogc3RyaW5nLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IG5vZGUgPSByb290ICYmIGZpbmROb2RlQXRMb2NhdGlvbihyb290LCBba2V5XSk7XG4gIHJldHVybiBub2RlICYmIGNvbnRlbnQuc2xpY2Uobm9kZS5vZmZzZXQsIG5vZGUub2Zmc2V0ICsgbm9kZS5sZW5ndGgpO1xufVxuXG4vLyBUaGUgd2hvbGUgc2FtZS1saW5lIGNvbW1lbnQgc2VxdWVuY2UsIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmU6IGEgbGluZSBjb21tZW50IGVuZHMgaXQgKGl0IHJ1bnMgdG9cbi8vIHRoZSBuZXdsaW5lKSwgYnV0IGFueSBudW1iZXIgb2YgYmxvY2sgY29tbWVudHMgY2FuIHByZWNlZGUgaXQsIGFuZCBtb3Zpbmcgb25seSB0aGUgZmlyc3Qgd291bGRcbi8vIGxlYXZlIHRoZSByZXN0IGRlc2NyaWJpbmcgdGhlIHdyb25nIGVsZW1lbnQuXG5jb25zdCB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuID0gL14oPzpbXlxcU1xcbl0qXFwvXFwqW1xcU1xcc10qP1xcKlxcLykqKD86W15cXFNcXG5dKlxcL1xcL1teXFxuXSopPy91O1xuXG4vKipcbiAqIFJlYXR0YWNoZXMgYSBzYW1lLWxpbmUgY29tbWVudCB0byB0aGUgZWxlbWVudCBpdCBkZXNjcmliZXMuIEluc2VydGluZyBpbnRvIGFuIGFycmF5IHBsYWNlcyB0aGVcbiAqIG5ldyBlbGVtZW50IEJFRk9SRSB0aGUgdHJpdmlhIHRoYXQgZm9sbG93cyBpdHMgcHJlZGVjZXNzb3IsIHNvIGFwcGVuZGluZyBhZnRlclxuICogYHsgLi4uIH0gLy8gd2h5IHRoaXMgcnVsZSBleGlzdHNgIGxlYXZlcyB0aGF0IGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgZ2VuZXJhdGVkIGVsZW1lbnQgaW5zdGVhZC5cbiAqIEEgZnJlc2hseSBzZXJpYWxpemVkIGVsZW1lbnQgbmV2ZXIgY2FycmllcyBhIGNvbW1lbnQgb2YgaXRzIG93biwgc28gYW55dGhpbmcgdHJhaWxpbmcgdGhlXG4gKiBpbnNlcnRpb24gYmVsb25nZWQgdG8gdGhlIGVsZW1lbnQgYmVmb3JlIGl0LlxuICovXG5mdW5jdGlvbiByZXN0b3JlVHJhaWxpbmdDb21tZW50KGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGluc2VydGVkSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpbnNlcnRlZEluZGV4ID09PSAwKSByZXR1cm4gY29udGVudDtcbiAgY29uc3Qgcm9vdCA9IHBhcnNlVHJlZShjb250ZW50KTtcbiAgY29uc3QgZWxlbWVudHMgPSAocm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pKT8uY2hpbGRyZW47XG4gIGNvbnN0IGluc2VydGVkID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4XTtcbiAgY29uc3QgcHJldmlvdXMgPSBlbGVtZW50cz8uW2luc2VydGVkSW5kZXggLSAxXTtcbiAgaWYgKCFpbnNlcnRlZCB8fCAhcHJldmlvdXMpIHJldHVybiBjb250ZW50O1xuICBjb25zdCBpbnNlcnRlZEVuZCA9IGluc2VydGVkLm9mZnNldCArIGluc2VydGVkLmxlbmd0aDtcbiAgY29uc3QgY29tbWVudCA9IHRyYWlsaW5nQ29tbWVudFBhdHRlcm4uZXhlYyhjb250ZW50LnNsaWNlKGluc2VydGVkRW5kKSk/LlswXTtcbiAgaWYgKCFjb21tZW50KSByZXR1cm4gY29udGVudDtcbiAgLy8gTGFuZCB0aGUgY29tbWVudCBhZnRlciB0aGUgc2VwYXJhdGluZyBjb21tYSBzbyB0aGUgZWxlbWVudCBrZWVwcyBpdHMgb3duIGxpbmUgaW50YWN0LlxuICBjb25zdCBwcmV2aW91c0VuZCA9IHByZXZpb3VzLm9mZnNldCArIHByZXZpb3VzLmxlbmd0aDtcbiAgY29uc3QgcmVzdG9yZU9mZnNldCA9IHByZXZpb3VzRW5kICsgKC9eXFxzKiwvdS5leGVjKGNvbnRlbnQuc2xpY2UocHJldmlvdXNFbmQpKT8uWzBdLmxlbmd0aCA/PyAwKTtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50LnNsaWNlKDAsIHJlc3RvcmVPZmZzZXQpICtcbiAgICBjb21tZW50ICtcbiAgICBjb250ZW50LnNsaWNlKHJlc3RvcmVPZmZzZXQsIGluc2VydGVkRW5kKSArXG4gICAgY29udGVudC5zbGljZShpbnNlcnRlZEVuZCArIGNvbW1lbnQubGVuZ3RoKVxuICApO1xufVxuXG4vKipcbiAqIE1pcnJvcnMgdGhlIGluZGVudGF0aW9uIHRoZSBmaWxlIGFscmVhZHkgdXNlcywgc28gYSBzZW1hbnRpYyBjaGFuZ2UgZG9lcyBub3QgcmVpbmRlbnQgdW5yZWxhdGVkXG4gKiBsaW5lcy4gVGhlIGZpcnN0IHByb3BlcnR5IGlzIG1lYXN1cmVkIHJhdGhlciB0aGFuIHRoZSBmaXJzdCBpbmRlbnRlZCBsaW5lLCBiZWNhdXNlIGEgZGVjb3JhdGVkXG4gKiBibG9jayBjb21tZW50IChgICogLi4uYCkgd291bGQgb3RoZXJ3aXNlIHBhc3MgZm9yIHRoZSBmaWxlJ3MgaW5kZW50YXRpb24uIEZhbGxzIGJhY2sgdG8gdGhlIHR3b1xuICogc3BhY2VzIGV2ZXJ5IGdlbmVyYXRlZCBjb25maWcgdXNlcy5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0Rm9ybWF0dGluZ09wdGlvbnMoY29udGVudDogc3RyaW5nKTogeyBpbnNlcnRTcGFjZXM6IGJvb2xlYW47IHRhYlNpemU6IG51bWJlciB9IHtcbiAgY29uc3QgZmlyc3RQcm9wZXJ0eSA9IHBhcnNlVHJlZShjb250ZW50KT8uY2hpbGRyZW4/LlswXTtcbiAgY29uc3QgaW5kZW50YXRpb24gPVxuICAgIGZpcnN0UHJvcGVydHkgJiYgY29udGVudC5zbGljZShjb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nLCBmaXJzdFByb3BlcnR5Lm9mZnNldCkgKyAxLCBmaXJzdFByb3BlcnR5Lm9mZnNldCk7XG4gIGlmICghaW5kZW50YXRpb24gfHwgIS9eW1xcdCBdKyQvdS50ZXN0KGluZGVudGF0aW9uKSkgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiAyIH07XG4gIGlmIChpbmRlbnRhdGlvbi5zdGFydHNXaXRoKCdcXHQnKSkgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiBmYWxzZSwgdGFiU2l6ZTogMSB9O1xuICByZXR1cm4geyBpbnNlcnRTcGFjZXM6IHRydWUsIHRhYlNpemU6IGluZGVudGF0aW9uLmxlbmd0aCB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGluc2VydCBpbnRvIGBvbGRWYWx1ZWAgdG8gdHVybiBpdCBpbnRvIGBuZXdWYWx1ZWAsIG9yIHVuZGVmaW5lZCB3aGVuXG4gKiB0aGF0IGlzIGltcG9zc2libGUgYmVjYXVzZSBgbmV3VmFsdWVgIGRyb3BzIG9yIHJlb3JkZXJzIGFuIGV4aXN0aW5nIGVsZW1lbnQgKHRoZSBjYWxsZXIgbXVzdFxuICogdGhlbiByZXBsYWNlIHRoZSBhcnJheSB3aG9sZXNhbGUpLiBJbmRpY2VzIGFkZHJlc3MgdGhlIGFycmF5IGFzIGl0IGdyb3dzLCBzbyBhcHBseWluZyB0aGVcbiAqIGluc2VydGlvbnMgbGVmdCB0byByaWdodCB5aWVsZHMgYG5ld1ZhbHVlYC5cbiAqL1xuZnVuY3Rpb24gZmluZEluc2VydGlvbnMob2xkVmFsdWU6IHVua25vd25bXSwgbmV3VmFsdWU6IHVua25vd25bXSk6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5zZXJ0aW9uczogeyBpbmRleDogbnVtYmVyOyB2YWx1ZTogdW5rbm93biB9W10gPSBbXTtcbiAgbGV0IG9sZEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBbbmV3SW5kZXgsIGVsZW1lbnRdIG9mIG5ld1ZhbHVlLmVudHJpZXMoKSkge1xuICAgIGlmIChvbGRJbmRleCA8IG9sZFZhbHVlLmxlbmd0aCAmJiBKU09OLnN0cmluZ2lmeShvbGRWYWx1ZVtvbGRJbmRleF0pID09PSBKU09OLnN0cmluZ2lmeShlbGVtZW50KSkge1xuICAgICAgb2xkSW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpbnNlcnRpb25zLnB1c2goeyBpbmRleDogbmV3SW5kZXgsIHZhbHVlOiBlbGVtZW50IH0pO1xuICB9XG4gIHJldHVybiBvbGRJbmRleCA9PT0gb2xkVmFsdWUubGVuZ3RoID8gaW5zZXJ0aW9ucyA6IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG4vKipcbiAqIFJlY29nbml6ZXMgdGhlIG1hbmFnZWQgYHdiIGdlbi1jb2RlYCBzZWdtZW50LCBhIG9uZS1sZXZlbCBwYWNrYWdlLXNjcmlwdCB3cmFwcGVyIGFyb3VuZCBpdCwgYW5kXG4gKiBjdXN0b20gc2VnbWVudHMgdGhhdCB3YmZ5IGxlYXZlcyBhbG9uZS5cbiAqL1xudHlwZSBTY3JpcHRTZWdtZW50S2luZCA9ICdjdXN0b20nIHwgJ2dlbkNvZGUnIHwgJ2dlbkNvZGVXcmFwcGVyJztcblxuY29uc3QgZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuID0gL15idW5cXHMrd2JcXHMrZ2VuLWNvZGUkL3U7XG5cbi8vIEEgcnVubmVyIGRlbGVnYXRpbmcgdG8gb25lIG9mIHRoaXMgcGFja2FnZSdzIG93biBzY3JpcHRzLCBlLmcuIGBidW4gcnVuIGdlbi10eXBlc2AuXG5jb25zdCBzY3JpcHRSdW5uZXJQYXR0ZXJuID0gL15idW5cXHMrcnVuXFxzKyhcXFMrKSQvdTtcblxuLy8gQW55dGhpbmcgd2JmeSdzIGAmJmAgc3BsaXQgY2Fubm90IG1vZGVsIChwaXBlcywgc2VxdWVuY2luZywgcmVkaXJlY3Rpb25zLCBxdW90aW5nLCBzdWJzdGl0dXRpb25zLCBkaXJlY3Rvcnlcbi8vIGNoYW5nZXMpLiBTY3JpcHRzIGNvbnRhaW5pbmcgaXQgYXJlIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgYmVpbmcgcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbmNvbnN0IHVuc3VwcG9ydGVkU2hlbGxTeW50YXhQYXR0ZXJuID0gL1tcXG47fDw+YCQnXCIoKV18XFxiY2RcXHMvdTtcblxuLyoqXG4gKiBTcGxpdHMgYSBzY3JpcHQgaW50byBgJiZgLXNlcGFyYXRlZCBzZWdtZW50cywgb3IgcmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgc2NyaXB0IHVzZXMgc2hlbGwgc3ludGF4IHdiZnlcbiAqIGRlbGliZXJhdGVseSBkb2VzIG5vdCBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICh1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybjtcbiAgcmV0dXJuIHNjcmlwdFxuICAgIC5zcGxpdCgnJiYnKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoXG4gIHNlZ21lbnQ6IHN0cmluZyxcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgZm9sbG93c1dyYXBwZXIgPSB0cnVlXG4pOiBTY3JpcHRTZWdtZW50S2luZCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBzZWdtZW50LnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpO1xuICBpZiAoZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuLnRlc3Qobm9ybWFsaXplZCkpIHJldHVybiAnZ2VuQ29kZSc7XG4gIC8vIEEgb25lLWxldmVsIHdyYXBwZXIgbG9va3VwIGNvdmVycyBgXCJwb3N0aW5zdGFsbFwiOiBcImJ1biBydW4gZ2VuLXR5cGVzXCJgLCB0aGUgc2hhcGUgdGhlc2UgcmVwb3NpdG9yaWVzIHVzZTtcbiAgLy8gZGVlcGVyIGNoYWlucyBzdGF5IGN1c3RvbSBzbyB3YmZ5IGNhbm5vdCBsb29wIG9uIGEgc2VsZi1yZWZlcmVudGlhbCBzY3JpcHQuXG4gIGNvbnN0IHNjcmlwdE5hbWUgPSBmb2xsb3dzV3JhcHBlciA/IHNjcmlwdFJ1bm5lclBhdHRlcm4uZXhlYyhub3JtYWxpemVkKT8uWzFdIDogdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXQgPSBzY3JpcHROYW1lID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICBpZiAoIXRhcmdldCkgcmV0dXJuICdjdXN0b20nO1xuICBjb25zdCBzZWdtZW50cyA9IHNwbGl0U2NyaXB0U2VnbWVudHModGFyZ2V0KTtcbiAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBzdGlsbCBwZXJmb3JtcyB0aGUgbWFuYWdlZFxuICAvLyBnZW5lcmF0aW9uLCBzbyBpdCBjb3VudHMgYXMgZ2VuLWNvZGU7IHRyZWF0aW5nIGl0IGFzIGN1c3RvbSB3b3VsZCBhcHBlbmQgYSBzZWNvbmQgYHdiIGdlbi1jb2RlYCBhbmQgcnVuIGV2ZXJ5XG4gIC8vIGdlbmVyYXRvciB0d2ljZSBwZXIgaW5zdGFsbC5cbiAgaWYgKHNlZ21lbnRzPy5sZW5ndGggIT09IDEpIHtcbiAgICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgQ1VTVE9NSVpFRCBnZW4tY29kZSAoYGJ1biB3YiBnZW4tY29kZSAmJiBidW4gcnVuIGJ1aWxkLWFzc2V0c2ApIGFscmVhZHkgcGVyZm9ybXMgdGhlXG4gICAgLy8gbWFuYWdlZCBnZW5lcmF0aW9uIEFORCB0aGUgcHJvamVjdCdzIG93biBzdGVwcywgc28gaXQgaXMgdGhlIGluc3RhbGwtdGltZSBlbnRyeSBwb2ludDogaXQgbXVzdCBiZSBrZXB0IGFzXG4gICAgLy8gd3JpdHRlbi4gUmVwbGFjaW5nIGl0IHdpdGggYSBiYXJlIGB3YiBnZW4tY29kZWAgd291bGQgZHJvcCB0aG9zZSBzdGVwczsgYXBwZW5kaW5nIG9uZSB3b3VsZCBydW4gZXZlcnlcbiAgICAvLyBnZW5lcmF0b3IgdHdpY2UuXG4gICAgcmV0dXJuIHNlZ21lbnRzPy5zb21lKChpbm5lcikgPT4gZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuLnRlc3QoaW5uZXIudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJykpKVxuICAgICAgPyAnZ2VuQ29kZVdyYXBwZXInXG4gICAgICA6ICdjdXN0b20nO1xuICB9XG4gIHJldHVybiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudHNbMF0gPz8gJycsIHNjcmlwdHMsIGZhbHNlKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgcmV0cnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiBudW1iZXIge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICAgIGlmIChyZXRyeSA8PSAwKSByZXR1cm4gc3RhdHVzO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXRJbnRlcm5hbChjb21tYW5kLCBhcmdzLCBjd2QpWzFdO1xufVxuXG5mdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXRJbnRlcm5hbChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtudW1iZXIsIHN0cmluZ10ge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgY29uc3Qgc3Rkb3V0VGV4dCA9IHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0IDogc3Rkb3V0LnRvU3RyaW5nKCk7XG4gIHJldHVybiBbcHJvYy5zdGF0dXMgPz8gMSwgc3Rkb3V0VGV4dC50cmltKCldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5zcGxpdCgnOicpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBlbnYuQkVSUllfQklOX0ZPTERFUilcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJy4vdXRpbHMvc3RyaW5nVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLCBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyB9IGZyb20gJy4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgLy8gV2hldGhlciBpc1B1YmxpY1JlcG8gY29tZXMgZnJvbSBhbiBhY3R1YWwgR2l0SHViIEFQSSByZXNwb25zZTogYSBmYWlsZWQgbG9va3VwIChvZmZsaW5lLFxuICAvLyByYXRlLWxpbWl0ZWQsIGJhZCBjcmVkZW50aWFsKSBjb2xsYXBzZXMgdG8gaXNQdWJsaWNSZXBvPWZhbHNlLCB3aGljaCB2aXNpYmlsaXR5LXNlbnNpdGl2ZVxuICAvLyBnZW5lcmF0b3JzIG11c3Qgbm90IG1pc3Rha2UgZm9yIGEgY29uZmlybWVkIHByaXZhdGUgcmVwb3NpdG9yeS5cbiAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNDbG91ZGZsYXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuO1xuICBpc1JhaWx3YXk6IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8qKiBEaXJlY3RvcmllcyBjb250YWluaW5nIENhcmdvLnRvbWwgKHJlbGF0aXZlIHRvIGRpclBhdGgsIHJvb3QtbW9zdCBmaXJzdCkuIEVtcHR5IGlmIHRoZSByZXBvIGhhcyBubyBSdXN0IGNvZGUuICovXG4gIGNhcmdvVG9tbERpclBhdGhzOiBzdHJpbmdbXTtcbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFB5dGhvbiBsb2NrZmlsZSAocG9ldHJ5LmxvY2sgLyB1di5sb2NrKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgTWF2ZW4gcG9tLnhtbCBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFNsaWRldiBkZWNrIChgKi5zbGlkZXYubWRgKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblNsaWRldk1kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRSdW50aW1lOiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzbGlkZXY6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHRhdXJpOiBib29sZWFuO1xuICAgIHZpbmV4dDogYm9vbGVhbjtcbiAgICB2aXRlOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICAgIGNoYWtyYTogYm9vbGVhbjtcbiAgICBkcml6emxlOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQW4gZXhwbGljaXQgYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgcGx1Z2luIGVudHJ5IHB1Ymxpc2hlcyB0aGUgcm9vdCBtYW5pZmVzdCBpdHNlbGZcbiAgICAgKiAobm8gcGtnUm9vdCByZWRpcmVjdGlvbiBhbmQgbnBtUHVibGlzaCBub3QgZGlzYWJsZWQpLlxuICAgICAqL1xuICAgIG5wbVB1Ymxpc2hlc1Jvb3Q6IGJvb2xlYW47XG4gIH07XG4gIG1pc2VUYXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBzZW1hbnRpYy1yZWxlYXNlIGNvbmZpZyBmaWxlcyB3YmZ5IGV4cGVjdHMsIGluIGNvc21pY29uZmlnJ3MgcmVzb2x1dGlvbiBvcmRlciAodGhlIGxlYWRpbmdcbiAqIHBhY2thZ2UuanNvbiBlbnRyeSBpcyBjaGVja2VkIGJ5IHRoZSBjYWxsZXIpLiB3YmZ5IGdlbmVyYXRlcyAucmVsZWFzZXJjLmpzb247IHRoZSBvdGhlciBzcGVsbGluZ3NcbiAqIGFyZSBsaXN0ZWQgb25seSB0byBkZXRlY3QgYSBoYW5kLXdyaXR0ZW4gY29uZmlnLCB3aG9zZSBmb3JtYXQgSlNPTi5wYXJzZSBjYW5ub3QgcmVhZCBhbmQgd2hvc2VcbiAqIHBsdWdpbiBsaXN0IGlzIHRoZXJlZm9yZSBzdGF0aWNhbGx5IHVuaW5zcGVjdGFibGUuXG4gKi9cbmNvbnN0IHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlczogeyBmaWxlTmFtZTogc3RyaW5nOyBqc29uUGFyc2VhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBpc1Jvb3Q/OiBib29sZWFuIH1cbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IGZhbHNlO1xuICAgIGxldCByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCA9IGZhbHNlO1xuICAgIC8vIFRoZSBGSVJTVCBleGlzdGluZyBzZWFyY2ggcGxhY2Ugd2lucyAoY29zbWljb25maWcgc2hvcnQtY2lyY3VpdHMpLCBzbyBhIEpTL1lBTUwvVFMgY29uZmlnXG4gICAgLy8gb3IgYW4gYGV4dGVuZHNgIHByZXNldCBtYWtlcyB0aGUgZWZmZWN0aXZlIHBsdWdpbiBsaXN0IHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZSAobWlycm9yc1xuICAgIC8vIHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMgaW4gd2IncyByZWxlYXNlLnRzKS4gVHJlYXRpbmcgaXQgYXMgdW5rbm93biBrZWVwc1xuICAgIC8vIGByZWxlYXNlLm5wbWAgY29uc2VydmF0aXZlbHkgdHJ1ZSwgc28gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIG5ldmVyIGZvcmNlc1xuICAgIC8vIGBwcml2YXRlOiB0cnVlYCBvbiBhIG1vbm9yZXBvIHRoYXQgYWN0dWFsbHkgcHVibGlzaGVzIHRvIG5wbS5cbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHR5cGUgUmVsZWFzZUNvbmZpZyA9XG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM/OiB1bmtub3duO1xuICAgICAgICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPl0pW107XG4gICAgICAgICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gY29zbWljb25maWcgc2VhcmNoZXMgcGFja2FnZS5qc29uJ3MgYHJlbGVhc2VgIGtleSBCRUZPUkUgYW55IHJjL2NvbmZpZyBmaWxlXG4gICAgICAvLyAoc2VtYW50aWMtcmVsZWFzZSAyNSBkZWxlZ2F0ZXMgdG8gY29zbWljb25maWcgOSdzIGRlZmF1bHQgc2VhcmNoUGxhY2VzKS5cbiAgICAgIGxldCByZWxlYXNlQ29uZmlnID0gKHBhY2thZ2VKc29uIGFzIHsgcmVsZWFzZT86IFJlbGVhc2VDb25maWcgfSkucmVsZWFzZTtcbiAgICAgIGlmIChyZWxlYXNlQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCB7IGZpbGVOYW1lLCBqc29uUGFyc2VhYmxlIH0gb2Ygc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzKSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZXJjUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlbGVhc2VyY1BhdGgpKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWpzb25QYXJzZWFibGUpIHtcbiAgICAgICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gYC5yZWxlYXNlcmNgIGFuZCBgLmNvbmZpZy9yZWxlYXNlcmNgIG1heSBhbHNvIGhvbGQgWUFNTDsgYSBKU09OLnBhcnNlIGZhaWx1cmUgbGFuZHNcbiAgICAgICAgICAvLyBpbiB0aGUgY2F0Y2ggYmVsb3cgYW5kIG1hcmtzIHRoZSBwbHVnaW4gbGlzdCB1bmtub3duIGluc3RlYWQgb2Ygc2lsZW50bHkgcmVwb3J0aW5nXG4gICAgICAgICAgLy8gXCJubyBwbHVnaW5zXCIuXG4gICAgICAgICAgcmVsZWFzZUNvbmZpZyA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY1BhdGgsICd1dGY4JykpIGFzIFJlbGVhc2VDb25maWc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgYWNjZXB0cyBhIHNjYWxhciBicmFuY2ggb3IgYnJhbmNoIG9iamVjdHMgKHsgbmFtZSwgcHJlcmVsZWFzZSwgLi4uIH0pO1xuICAgICAgLy8gbm9ybWFsaXplIHRvIHBsYWluIGJyYW5jaCBuYW1lcyBmb3IgY29uc3VtZXJzIHN1Y2ggYXMgdGhlIHdvcmtmbG93IGdlbmVyYXRvci5cbiAgICAgIGNvbnN0IHJhd0JyYW5jaGVzID0gcmVsZWFzZUNvbmZpZz8uYnJhbmNoZXM7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSAoQXJyYXkuaXNBcnJheShyYXdCcmFuY2hlcykgPyByYXdCcmFuY2hlcyA6IHJhd0JyYW5jaGVzID09PSB1bmRlZmluZWQgPyBbXSA6IFtyYXdCcmFuY2hlc10pXG4gICAgICAgIC5tYXAoKGJyYW5jaDogdW5rbm93bikgPT5cbiAgICAgICAgICB0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJyA/IGJyYW5jaCA6IChicmFuY2ggYXMgeyBuYW1lPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubmFtZVxuICAgICAgICApXG4gICAgICAgIC5maWx0ZXIoKGJyYW5jaE5hbWUpOiBicmFuY2hOYW1lIGlzIHN0cmluZyA9PiB0eXBlb2YgYnJhbmNoTmFtZSA9PT0gJ3N0cmluZycpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVsZWFzZUNvbmZpZz8ucGx1Z2lucykpIHtcbiAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luRW50cnkgb2YgcmVsZWFzZUNvbmZpZy5wbHVnaW5zKSB7XG4gICAgICAgICAgY29uc3QgW3BsdWdpbk5hbWUsIHBsdWdpbk9wdGlvbnNdID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSkgPyBwbHVnaW5FbnRyeSA6IFtwbHVnaW5FbnRyeSwgdW5kZWZpbmVkXTtcbiAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbk5hbWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5wdXNoKHBsdWdpbk5hbWUpO1xuICAgICAgICAgIGlmIChwbHVnaW5OYW1lICE9PSAnQHNlbWFudGljLXJlbGVhc2UvbnBtJykgY29udGludWU7XG4gICAgICAgICAgLy8gV2l0aCBwa2dSb290IHRoZSBwbHVnaW4gcHVibGlzaGVzIGFub3RoZXIgbWFuaWZlc3QgKGl0IHJlc29sdmVzIHBrZ1Jvb3QgYWdhaW5zdCB0aGVcbiAgICAgICAgICAvLyByZXBvIHJvb3QsIHNvIGAuYCBhbmQgYC4vYCBib3RoIG1lYW4gdGhlIHJvb3QgaXRzZWxmKSwgYW5kIG5wbVB1Ymxpc2g6IGZhbHNlXG4gICAgICAgICAgLy8gZGlzYWJsZXMgcHVibGlzaGluZyBlbnRpcmVseTsgb25seSB0aGUgcmVtYWluaW5nIHNoYXBlIHByb3ZlcyB0aGUgUk9PVCBpcyBwdWJsaXNoZWQuXG4gICAgICAgICAgY29uc3QgcGtnUm9vdCA9IHBsdWdpbk9wdGlvbnM/LnBrZ1Jvb3Q7XG4gICAgICAgICAgY29uc3QgcHVibGlzaGVzUm9vdCA9XG4gICAgICAgICAgICBwbHVnaW5PcHRpb25zPy5ucG1QdWJsaXNoICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgKHBrZ1Jvb3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAodHlwZW9mIHBrZ1Jvb3QgPT09ICdzdHJpbmcnICYmIHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwa2dSb290KSA9PT0gcGF0aC5yZXNvbHZlKGRpclBhdGgpKSk7XG4gICAgICAgICAgcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QgfHw9IHB1Ymxpc2hlc1Jvb3Q7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVsZWFzZUNvbmZpZyAmJiByZWxlYXNlQ29uZmlnLmV4dGVuZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCBwbHVnaW4gbGlzdCwgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgbGlzdCBhcHBsaWVzLCB3aGljaCBpbmNsdWRlc1xuICAgIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbSBhbmQgQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViIChtaXJyb3JzIHJlbGVhc2VQdWJsaXNoZXNUb05wbSBpbiB3YidzXG4gICAgLy8gcmVsZWFzZS50cykuXG4gICAgY29uc3QgdXNlc1NlbWFudGljUmVsZWFzZSA9ICEhKFxuICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICApO1xuXG4gICAgLy8gVGhlIGNhbGxlciBtYXkgY2xhc3NpZnkgZXhwbGljaXRseSAoaW5kZXgudHMgcGFzc2VzIGZhbHNlIGZvciBldmVyeSBkaXNjb3ZlcmVkIHdvcmtzcGFjZSxcbiAgICAvLyBpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKik7IHRoZSBoZXVyaXN0aWMgY2xhc3NpZmllcyB0aGUgQ0xJIGVudHJ5XG4gICAgLy8gcGF0aCBpdHNlbGYsIHNvIGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgYW5kIGB3YmZ5IDxyZXBvPi9hcHBzLzxhcHA+YCBrZWVwIHRoZWlyIGNoaWxkXG4gICAgLy8gY2xhc3NpZmljYXRpb24uXG4gICAgY29uc3QgaXNSb290ID0gb3B0aW9ucz8uaXNSb290ID8/ICFpc1dvcmtzcGFjZU9mRW5jbG9zaW5nUm9vdChkaXJQYXRoKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgLy8gRmV0Y2ggdmlzaWJpbGl0eSBmb3IgdGhlIENMSSBlbnRyeSBldmVuIHdoZW4gaXQgaXMgYSB3b3Jrc3BhY2UgY2hpbGQgKGB3YmZ5XG4gICAgLy8gPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCk6IGdlbmVyYXRvcnMgcmVhZCBpc1B1YmxpY1JlcG8gZnJvbSB0aGVpciByb290Q29uZmlnIHBhcmFtZXRlcixcbiAgICAvLyB3aGljaCBJUyB0aGUgY2hpbGQgY29uZmlnIGluIHRoYXQgaW52b2NhdGlvbiwgc28gYSBzdHViIGBmYWxzZWAgdGhlcmUgd291bGQgZHJvcCB0aGVcbiAgICAvLyBwdWJsaWMtcmVwbyBwdWJsaXNoQ29uZmlnIGhhbmRsaW5nLiBEaXNjb3ZlcmVkIGNoaWxkcmVuIChvcHRpb25zLmlzUm9vdCA9PT0gZmFsc2UpIHN0aWxsXG4gICAgLy8gc2tpcCB0aGUgZmV0Y2gg4oCUIHRoZXkgaW5oZXJpdCB0aGUgZW5jbG9zaW5nIHJvb3QncyB2aXNpYmlsaXR5IHZpYSByb290Q29uZmlnIGluc3RlYWQuXG4gICAgaWYgKG9wdGlvbnM/LmlzUm9vdCAhPT0gZmFsc2UpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPbmx5IHRoZSByb290IGZldGNoZXMgcmVwbyBpbmZvLCBhbmQgdGhhdCBmZXRjaCBuZWVkcyBuZXR3b3JrIGFuZCBhIHRva2VuLCBzbyBpZGVudGl0eS1kZXJpdmVkXG4gICAgLy8gZmxhZ3MgYmVsb3cgd291bGQgb3RoZXJ3aXNlIGJlIGZhbHNlIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSBhbmQgZm9yIGV2ZXJ5IG9mZmxpbmUgb3JcbiAgICAvLyByYXRlLWxpbWl0ZWQgcnVuLiBUaGUgZ2l0IHJlbW90ZSBhbnN3ZXJzIHRoZSBzYW1lIHF1ZXN0aW9uIGxvY2FsbHksIGZvciBldmVyeSBwYWNrYWdlLlxuICAgIGlmICghcmVwb0F1dGhvciB8fCAhcmVwb05hbWUpIHtcbiAgICAgIFtyZXBvQXV0aG9yLCByZXBvTmFtZV0gPSBhd2FpdCByZXNvbHZlTG9jYWxSZXBvSWRlbnRpdHkoZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cbiAgICAvLyBCdWlsdCBmcm9tIHRoZSBSRVNPTFZFRCBpZGVudGl0eSBzbyB3b3Jrc3BhY2UgcGFja2FnZXMgYW5kIG9mZmxpbmUgcnVucyBhbHNvIGdldCBpdDsgY29uc3VtZXJzIGRlcml2ZVxuICAgIC8vIHRoZSBvd25lciBmcm9tIHRoaXMgZmllbGQgKGUuZy4gdG8gc2V0IGBhdXRob3JgKS5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0F1dGhvciAmJiByZXBvTmFtZSA/IGBnaXRodWI6JHtyZXBvQXV0aG9yfS8ke3JlcG9OYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGF1cmkgb2ZmaWNpYWxseSBzdXBwb3J0cyBKU09OLCBKU09ONSwgYW5kIFRPTUwgY29uZmlndXJhdGlvbiBmb3JtYXRzLlxuICAgIGNvbnN0IGRvZXNDb250YWluVGF1cmlDb25maWcgPSBbJ3RhdXJpLmNvbmYuanNvbicsICd0YXVyaS5jb25mLmpzb241JywgJ1RhdXJpLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdzcmMtdGF1cmknLCBmaWxlTmFtZSkpXG4gICAgKTtcbiAgICAvLyBSb290LWxldmVsIFwiSW5QYWNrYWdlc1wiIHNpZ25hbHMgbXVzdCBzZWUgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlIGxheW91dCAoZS5nLiBhcHBzLyopLCBub3RcbiAgICAvLyBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnksIHNvIHNjYW4gZWFjaCBkaXNjb3ZlcmVkIHdvcmtzcGFjZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgd29ya3NwYWNlU3ViRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyh7XG4gICAgICBkaXJQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgfSk7XG4gICAgY29uc3QgY29udGFpbnNBbnlJbldvcmtzcGFjZXMgPSAocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgICAgd29ya3NwYWNlU3ViRGlyUGF0aHMuc29tZSgod29ya3NwYWNlU3ViRGlyUGF0aCkgPT4gY29udGFpbnNBbnkocGF0dGVybiwgd29ya3NwYWNlU3ViRGlyUGF0aCkpO1xuICAgIGNvbnN0IGRvZXNDb250YWluV3JhbmdsZXJDb25maWcgPSBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoKTtcbiAgICBjb25zdCB3b3JrZmxvd0NvbnRlbnRzID0gcmVhZFdvcmtmbG93RmlsZUNvbnRlbnRzKGRpclBhdGgpO1xuICAgIGNvbnN0IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lID0gZGV0ZWN0UGxheXdyaWdodFJ1bnRpbWVJbXBvcnQoZGlyUGF0aCk7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogdHlwZW9mIHJlcG9JbmZvPy5wcml2YXRlID09PSAnYm9vbGVhbicsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0Nsb3VkZmxhcmU6IGRldGVjdENsb3VkZmxhcmUocGFja2FnZUpzb24sIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcsIHdvcmtmbG93Q29udGVudHMpLFxuICAgICAgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyxcbiAgICAgIGlzUmFpbHdheTogZGV0ZWN0UmFpbHdheShkaXJQYXRoLCBwYWNrYWdlSnNvbiwgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoLCByZXBvTmFtZSksXG4gICAgICBjYXJnb1RvbWxEaXJQYXRoczogZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGgpLFxuICAgICAgLy8gQWxzbyBob25vciBkZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgYmV5b25kIHBhY2thZ2VzLyogKGUuZy4gYXBwcy8qKTogdHJlYXRpbmcgYW5cbiAgICAgIC8vIGFwcHMvKi1vbmx5IG1vbm9yZXBvIGFzIGEgcGxhaW4gcGFja2FnZSB3b3VsZCBkZWxldGUgaXRzIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbiBpblxuICAgICAgLy8gZ2VuZXJhdGVQYWNrYWdlSnNvbiBhbmQgc2tpcCBtb25vcmVwby1vbmx5IGNvbnZlbnRpb25zIHN1Y2ggYXMgcm9vdCBgcHJpdmF0ZTogdHJ1ZWAuXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpIHx8IHdvcmtzcGFjZVN1YkRpclBhdGhzLmxlbmd0aCA+IDAsXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblV2TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3V2LmxvY2snKSksXG4gICAgICAvLyBSZWN1cnNpdmUgbGlrZSBkb2VzQ29udGFpbkphdmE6IG11bHRpLWxhbmd1YWdlIHJlcG9zaXRvcmllcyBrZWVwIGxhbmd1YWdlIGRpcmVjdG9yaWVzXG4gICAgICAvLyAoZS5nLiBQeXRob24gdG9vbGluZyBvciBNYXZlbiBtb2R1bGVzKSBvdXRzaWRlIHRoZSByb290IGFuZCBvdXRzaWRlIGRlY2xhcmVkIHdvcmtzcGFjZXMuXG4gICAgICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3twb2V0cnkubG9jayx1di5sb2NrfScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3BvbS54bWwnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblNsaWRldk1kOiBjb250YWluc0FueSgnKiovKi5zbGlkZXYubWQnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoXG4gICAgICAgICdzcmMtdGF1cmkve3RhdXJpLmNvbmYuanNvbix0YXVyaS5jb25mLmpzb241LFRhdXJpLnRvbWx9J1xuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmE6IGNvbnRhaW5zQW55KCcqKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJyoqLyouamF2YScpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgY2hha3JhOiAhIWRldkRlcGVuZGVuY2llc1snQGNoYWtyYS11aS9jbGknXSxcbiAgICAgICAgZHJpenpsZTogISFkZXBlbmRlbmNpZXNbJ2RyaXp6bGUtb3JtJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2RyaXp6bGUta2l0J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHBsYXl3cmlnaHRSdW50aW1lOiBpbXBvcnRzUGxheXdyaWdodEF0UnVudGltZSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgc2xpZGV2OiAhIWRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB0YXVyaTpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgICB2aW5leHQ6ICEhZGVwZW5kZW5jaWVzLnZpbmV4dCB8fCAhIWRldkRlcGVuZGVuY2llcy52aW5leHQsXG4gICAgICAgIHZpdGU6ICEhZGVwZW5kZW5jaWVzLnZpdGUgfHwgISFkZXZEZXBlbmRlbmNpZXMudml0ZSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXRcbiAgICAgICAgICA/IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB8fCByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICAgICAgICA6IHVzZXNTZW1hbnRpY1JlbGVhc2UsXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpIHx8IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICAgICAgIDogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgbnBtUHVibGlzaGVzUm9vdDogcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QsXG4gICAgICB9LFxuICAgICAgbWlzZVRhc2tzOiBhd2FpdCByZWFkTWlzZVRhc2tzKGRpclBhdGgpLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVXZMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sIHx8XG4gICAgICAvLyBBIHJlcG9zaXRvcnkgY2FuIGxlZ2l0aW1hdGVseSBjb250YWluIG9ubHkgZG9jdW1lbnRhdGlvbi4gSXRzIEdpdCBtZXRhZGF0YSBpcyBlbm91Z2ggdG9cbiAgICAgIC8vIGVzdGFibGlzaCB0aGF0IHRoZSBDTEkgdGFyZ2V0IGlzIGEgcHJvamVjdCByb290OyByZXF1aXJpbmcgYSBsYW5ndWFnZSBtYW5pZmVzdCBoZXJlIHdvdWxkXG4gICAgICAvLyBtYWtlIHdiZnkgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgcGFja2FnZS5qc29uIHRoYXQgaXQgbWFuYWdlcyBmb3Igc3VjaCByZXBvc2l0b3JpZXMuIEJvdGhcbiAgICAgIC8vIG9yZGluYXJ5IGNoZWNrb3V0cyAoYC5naXRgIGRpcmVjdG9yeSkgYW5kIHdvcmt0cmVlcyAoYC5naXRgIGZpbGUpIHNhdGlzZnkgdGhpcyBjaGVjay5cbiAgICAgIChjb25maWcuaXNSb290ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0JykpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgd2JmeSBtYW5hZ2VzIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgZm9yIHRoZSBwYWNrYWdlLiBUaGUgZmlsZSBpcyBnaXRpZ25vcmVkIGFuZCB1bnRyYWNrZWRcbiAqIGJlY2F1c2UgdGhlIGB3YiBnZW4tY29kZWAgcG9zdGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQgb24gZXZlcnkgaW5zdGFsbCwgc28gdGhlIHBhY2thZ2UgaGFzIHRvIG93biBhIHdyYW5nbGVyXG4gKiBjb25maWcgKGB3cmFuZ2xlciB0eXBlc2AgZXhpdHMgbm9uLXplcm8gd2l0aG91dCBvbmUpLCB0byBkZXBlbmQgb24gd3JhbmdsZXIgKGEgcGFja2FnZSBkZXBsb3lpbmcgdmlhIGFcbiAqIENJIGFjdGlvbiBjYW5ub3QgcmVzb2x2ZSB0aGUgY29tbWFuZCksIGFuZCB0byBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgZmlsZS5cbiAqXG4gKiBJTlZBUklBTlQg4oCUIHRoaXMgZGVjaXNpb24gbXVzdCBjb252ZXJnZSBhY3Jvc3MgbWFjaGluZXMgaG9sZGluZyB0aGUgc2FtZSBjb21taXQuIEl0IG11c3QgTkVWRVIgY29uc3VsdFxuICogZ2l0aWdub3JlZCBmaWxlcyAoYC5kZXYudmFycypgLCBgLmVudipgLCAuLi4pLCB3aGljaCBgd2Igc3RhcnRgIGFuZCBgd2IgZGVwbG95YCBjcmVhdGUgcm91dGluZWx5IGFuZCB3aGljaFxuICogdGhlcmVmb3JlIHN0YXkgdW50cmFja2VkIG9uIGRldiBtYWNoaW5lcyBmb3JldmVyOiBhIGZvcm1lciBjaGVjayB0aGF0IHRyZWF0ZWQgdGhlbSBhcyBpcnJlcHJvZHVjaWJsZSBpbnB1dHNcbiAqIG1hZGUgd2JmeSBydW5zIG9uIGRldiBtYWNoaW5lcyByZS10cmFjayB0aGUgfjE1ay1saW5lIGdlbmVyYXRlZCBmaWxlIHRoYXQgcnVucyBmcm9tIGNsZWFuIGNoZWNrb3V0cyBoYWRcbiAqIHVudHJhY2tlZCwgb3NjaWxsYXRpbmcgZXRlcm5hbGx5IChlLmcuIGFpLWdhbWUtYnVpbGRlciAjNjg0IOKGkiAjNzQ2KS4gUmVhZGluZyBjb21taXR0YWJsZSByZXBvc2l0b3J5IGZpbGVzXG4gKiBmcm9tIHRoZSB3b3JraW5nIHRyZWUgKHRoZSB3cmFuZ2xlciBjb25maWcsIHBhY2thZ2UuanNvbiwgdHNjb25maWcg4oCUIGFzIGV2ZXJ5IHdiZnkgZ2VuZXJhdG9yIGRvZXMpIGlzIGZpbmU6XG4gKiBhbnkgZGl2ZXJnZW5jZSB0aGVyZSBpcyB0cmFuc2llbnQgYW5kIGRpc2FwcGVhcnMgb25jZSB0aGUgZmlsZSBpcyBjb21taXR0ZWQgb3IgcmVtb3ZlZC5cbiAqIFRoZSBoYXphcmQgdGhhdCBjaGVjayBndWFyZGVkIGFnYWluc3Qgbm8gbG9uZ2VyIGV4aXN0czogYHdiIGdlbi1jb2RlYCBydW5zIGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCB3aXRoXG4gKiBhIGtleSBzdHViIGRlcml2ZWQgc29sZWx5IGZyb20gdGhlIGNvbW1pdHRlZCBmbm94LnRvbWwgKHNlZSB3YidzIHdyaXRlV29ya2VyVHlwZXNFbnZTdHViKSwgc28gbG9jYWwgZG90ZW52XG4gKiBmaWxlcyBuZXZlciBpbmZsdWVuY2UgdGhlIGdlbmVyYXRlZCBgRW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbikgJiYgY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcihjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ3BhY2thZ2VKc29uJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzY3JpcHRzID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBzY3JpcHRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBzZWdtZW50cyA9IHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0KTtcbiAgICBjb25zdCBoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUgPSBzZWdtZW50cz8uc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvXig/Oig/OmJ1bnxidW54KSg/OiAtLWJ1bik/KD86IHJ1bik/ICk/d2IgZ2VuLWNvZGUkL3UudGVzdChub3JtYWxpemVkKSAmJlxuICAgICAgICBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSB0aGUgY2Fub25pY2FsIGJ1biB3YiBnZW4tY29kZSBjb21tYW5kYDtcbiAgfVxuICAvLyBPbmx5IGBidW4gcnVuIDxzY3JpcHQ+YCBpcyByZWNvZ25pemVkIGFzIGEgd3JhcHBlcjsgYW5vdGhlciBydW5uZXIgc3BlbGxpbmcgd291bGQgZ2V0IGEgbWFuYWdlZFxuICAvLyBnZW5lcmF0aW9uIGFwcGVuZGVkIG5leHQgdG8gaXQgYW5kIHJ1biBldmVyeSBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuIFdpdGhvdXQgYSBnZW4tY29kZVxuICAvLyBwaXBlbGluZSBub3RoaW5nIGlzIGFwcGVuZGVkLCBzbyB0aGUgc3BlbGxpbmcgaXMgaXJyZWxldmFudCB0aGVyZS5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCA/PyAnJykgPz8gW10pIHtcbiAgICBjb25zdCBzY3JpcHROYW1lID0gL14oPzpidW58YnVueCkoPzpcXHMrLS1idW4pPyg/OlxccytydW4pP1xccysoXFxTKykkL3UuZXhlYyhzZWdtZW50KT8uWzFdO1xuICAgIGNvbnN0IHRhcmdldCA9IHNjcmlwdE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgaWYgKFxuICAgICAgdGFyZ2V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHNlZ21lbnQgIT09IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gICYmXG4gICAgICAoc2NyaXB0c1snZ2VuLWNvZGUnXSAhPT0gdW5kZWZpbmVkIHx8IHRhcmdldC5pbmNsdWRlcygnd2IgZ2VuLWNvZGUnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBgcG9zdGluc3RhbGwgbXVzdCBpbnZva2UgdGhlICR7c2NyaXB0TmFtZX0gc2NyaXB0IGFzIGJ1biBydW4gJHtzY3JpcHROYW1lfWA7XG4gICAgfVxuICB9XG4gIGlmIChcbiAgICAvKD86XnwmJilcXHMqKD86bnBtfG5weHxwbnBtfHlhcm4pXFxzKyg/OnJ1big/Oi1zY3JpcHQpP1xccyspPyg/Omdlbi1jb2RlfHdiXFxzK2dlbi1jb2RlKVxccyooPzomJnwkKS91LnRlc3QoXG4gICAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gJ3Bvc3RpbnN0YWxsIG11c3QgdXNlIGJ1biB3YiBnZW4tY29kZSBpbnN0ZWFkIG9mIGEgbm9uLUJ1biBnZW4tY29kZSBydW5uZXInO1xuICB9XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmICh3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm4gYCR7bmFtZX0gbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2Ygd3JhbmdsZXIgdHlwZXNgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIFtcbiAgICBwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/Lm9wdGlvbmFsRGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5wZWVyRGVwZW5kZW5jaWVzLFxuICBdLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gZGVwZW5kZW5jaWVzPy53cmFuZ2xlciAhPT0gdW5kZWZpbmVkKTtcbn1cblxuY29uc3Qgc2hlbGxXb3JkUGF0dGVybiA9IFN0cmluZy5yYXdgKD86XCIoPzpcXFxcLnxbXlwiXFxcXF0pKlwifCcoPzpcXFxcLnxbXidcXFxcXSkqJ3woPzpcXFxcLnxbXlxcc1wiJ1xcXFxdKSspYDtcbmNvbnN0IHdyYW5nbGVyT3B0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgXFxzKy0tP1tBLVphLXpdW1xcdy1dKig/Oj0ke3NoZWxsV29yZFBhdHRlcm59fFxccysoPyEtfHR5cGVzXFxiKSR7c2hlbGxXb3JkUGF0dGVybn0pP2A7XG5jb25zdCB3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICBTdHJpbmcucmF3YFtcIiddP1xcYndyYW5nbGVyKD86QFteXFxzXCInXSspP1xcYltcIiddPyg/OiR7d3JhbmdsZXJPcHRpb25QYXR0ZXJufSkqXFxzK3R5cGVzXFxiYCxcbiAgJ3UnXG4pO1xuXG4vKipcbiAqIEEgcGFja2FnZSB3aG9zZSBUeXBlU2NyaXB0IHByb2plY3QgY2Fubm90IGluY2x1ZGUgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyAoZS5nLiBvbmUgb24gYSBoYW5kLW1haW50YWluZWRcbiAqIG1pbmltYWwgYEVudmAgd2l0aCBgdHlwZXM6IFtcImJ1blwiXWAsIHRoZSBzdGFuZGFyZCBlc2NhcGUgd2hlbiB0aGUgYW1iaWVudCB3cmFuZ2xlciBnbG9iYWxzIGNvbmZsaWN0IHdpdGggdGhlXG4gKiBgQHR5cGVzL2J1bmAgZ2xvYmFscyBpdHMgdGVzdHMgbmVlZCkgZ2FpbnMgbm90aGluZyBmcm9tIHJlZ2VuZXJhdGluZyB0aGUgfjUwMEtCIGZpbGUgb24gZXZlcnkgaW5zdGFsbCwgc28gd2JmeVxuICogbGVhdmVzIHN1Y2ggcGFja2FnZXMgdW5tYW5hZ2VkIGluc3RlYWQgb2YgcmUtYWRkaW5nIHRoZSBnZW5lcmF0aW9uIHN0ZXAuIENvbnN1bXB0aW9uIGlzIGRldGVjdGVkIHR3byB3YXlzOlxuICogYSB0ZXh0dWFsIGB3b3JrZXItY29uZmlndXJhdGlvbmAgcmVmZXJlbmNlIGluIGFueSB0cmFja2VkIGZpbGUgb2YgdGhlIHBhY2thZ2UgKGNvdmVycyBpbXBvcnRzLCB0cmlwbGUtc2xhc2hcbiAqIHJlZmVyZW5jZXMsIGFuZCBleHBsaWNpdCB0c2NvbmZpZyBlbnRyaWVzKSwgb3IgYSBgZmlsZXNgL2BpbmNsdWRlYC9gZXhjbHVkZWAgc2V0IHRoYXQgY2FuIG1hdGNoIHRoZSBmaWxlIOKAlFxuICogcmVzb2x2ZWQgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zIHdpdGggZWFjaCBwYXR0ZXJuIGtlcHQgcmVsYXRpdmUgdG8gdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIGl0LFxuICogbWF0Y2hpbmcgdHNjLiBXaGVuZXZlciB0aGUgZWZmZWN0aXZlIHNldCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAobWlzc2luZyBvciB1bnBhcnNlYWJsZSB0c2NvbmZpZywgcGFja2FnZS1uYW1lXG4gKiBgZXh0ZW5kc2AgcHJlc2V0cywgb3IgVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24pLCB0aGUgY3VycmVudCBtYW5hZ2VkIGJlaGF2aW9yIGlzIGtlcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCc+KTogYm9vbGVhbiB7XG4gIC8vIGBnaXQgZ3JlcGAgc2VhcmNoZXMgdHJhY2tlZCBmaWxlcyBvbmx5LCBzbyB0aGUgZ2l0aWdub3JlZCBnZW5lcmF0ZWQgZmlsZSBpdHNlbGYgbmV2ZXIgbWF0Y2hlcy5cbiAgLy8gd2JmeSdzIG93biBtYW5hZ2VkIGFydGlmYWN0cyBhcmUgZXhjbHVkZWQ6IHRoZSBgLmdpdGlnbm9yZWAgcnVsZSAoYC93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYClcbiAgLy8gd2JmeSBjb21taXR0ZWQgd2hpbGUgaXQgbWFuYWdlZCB0aGUgcGFja2FnZSBtdXN0IG5vdCBjb3VudCBhcyBjb25zdW1wdGlvbiwgb3IgYSBvbmNlLW1hbmFnZWRcbiAgLy8gcGFja2FnZSBjb3VsZCBuZXZlciBvcHQgb3V0LlxuICBjb25zdCBncmVwUmVzdWx0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICdnaXQnLFxuICAgIC8vIHRzY29uZmlnIGZpbGVzIGFyZSBjbGFzc2lmaWVkIGJ5IHRoZSByZXNvbHZlZCBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgbG9naWMgYmVsb3cg4oCUIGEgdGV4dHVhbFxuICAgIC8vIGhpdCB0aGVyZSAoZS5nLiBhbiBgZXhjbHVkZWAgZW50cnkpIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLlxuICAgIFtcbiAgICAgICdncmVwJyxcbiAgICAgICctbCcsXG4gICAgICAnd29ya2VyLWNvbmZpZ3VyYXRpb24nLFxuICAgICAgJy0tJyxcbiAgICAgICcuJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGlnbm9yZScsXG4gICAgICAnOihleGNsdWRlKS5naXRhdHRyaWJ1dGVzJyxcbiAgICAgIFN0cmluZy5yYXdgOihnbG9iLGV4Y2x1ZGUpKiovdHNjb25maWcqLmpzb25gLFxuICAgIF0sXG4gICAgY29uZmlnLmRpclBhdGhcbiAgKTtcbiAgaWYgKGdyZXBSZXN1bHQudHJpbSgpKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCB3b3JrZXJUeXBlc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJyk7XG4gIGNvbnN0IGZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKSwgY29uZmlnLmRpclBhdGgsIDUpO1xuICBpZiAoIWZpbGVTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBtYXRjaGVzID0gKHBhdHRlcm5TZXQ6IFRzY29uZmlnUGF0dGVyblNldCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghcGF0dGVyblNldCB8fCAhQXJyYXkuaXNBcnJheShwYXR0ZXJuU2V0LnBhdHRlcm5zKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGF0dGVyblNldC5iYXNlRGlyUGF0aCwgd29ya2VyVHlwZXNQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICByZXR1cm4gcGF0dGVyblNldC5wYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBgJHtjb25maWdEaXJ9YC1wcmVmaXhlZCBwYXR0ZXJucyB3ZXJlIGV4cGFuZGVkIHRvIGFic29sdXRlIHBhdGhzIGF0IHJlc29sdmUgdGltZS5cbiAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm4sIHdvcmtlclR5cGVzUGF0aCwgcGF0dGVyblNldC5leHBhbmRzRGlyZWN0b3JpZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgcmVsYXRpdmVQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgfSk7XG4gIH07XG4gIC8vIGBmaWxlc2AgZW50cmllcyBhcmUgYWx3YXlzIHBhcnQgb2YgdGhlIHByb2dyYW0sIGV2ZW4gd2hlbiBgZXhjbHVkZWAgbWF0Y2hlcyB0aGVtLlxuICBpZiAobWF0Y2hlcyhmaWxlU2V0LmZpbGVzKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZXhjbHVkZSkpIHJldHVybiBmYWxzZTtcbiAgLy8gTmVpdGhlciBpbmNsdWRlIG5vciBmaWxlcyBkZWNsYXJlZDogVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24gY292ZXJzIHRoZSBmaWxlLlxuICBpZiAoIWZpbGVTZXQuaW5jbHVkZSAmJiAhZmlsZVNldC5maWxlcykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBtYXRjaGVzKGZpbGVTZXQuaW5jbHVkZSk7XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ1BhdHRlcm5TZXQge1xuICAvKiogRGlyZWN0b3J5IG9mIHRoZSBjb25maWcgdGhhdCBkZWNsYXJlZCB0aGUgcGF0dGVybnM7IHRzYyByZXNvbHZlcyB0aGVtIHJlbGF0aXZlIHRvIGl0LiAqL1xuICBiYXNlRGlyUGF0aDogc3RyaW5nO1xuICAvKiogaW5jbHVkZS9leGNsdWRlIHRyZWF0IGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgcGF0dGVybiBhcyBhIGRpcmVjdG9yeSBzdWJ0cmVlOyBgZmlsZXNgIGRvZXMgbm90LiAqL1xuICBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW47XG4gIHBhdHRlcm5zOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgVHNjb25maWdGaWxlU2V0IHtcbiAgZXhjbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgZmlsZXM/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG4gIGluY2x1ZGU/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG59XG5cbi8qKiBSZXNvbHZlcyBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zOyB1bmRlZmluZWQgd2hlbiB1bnJlYWRhYmxlLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uc3VtZXJEaXJQYXRoOiBzdHJpbmcsXG4gIHJlbWFpbmluZ0RlcHRoOiBudW1iZXJcbik6IFRzY29uZmlnRmlsZVNldCB8IHVuZGVmaW5lZCB7XG4gIGlmIChyZW1haW5pbmdEZXB0aCA8PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgdHNjb25maWcgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPHtcbiAgICBleGNsdWRlPzogdW5rbm93bjtcbiAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICBmaWxlcz86IHVua25vd247XG4gICAgaW5jbHVkZT86IHVua25vd247XG4gIH0+KGNvbnRlbnQpO1xuICBpZiAoIXRzY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgLy8gYCR7Y29uZmlnRGlyfWAgcmVzb2x2ZXMgdG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgUk9PVCAoY29uc3VtaW5nKSBjb25maWcsIHdoZXJldmVyIGl0IGFwcGVhcnMuXG4gIGNvbnN0IHRvUGF0dGVyblNldCA9IChwYXR0ZXJuczogdW5rbm93biwgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkID0+XG4gICAgQXJyYXkuaXNBcnJheShwYXR0ZXJucylcbiAgICAgID8ge1xuICAgICAgICAgIGJhc2VEaXJQYXRoOiBkaXJQYXRoLFxuICAgICAgICAgIGV4cGFuZHNEaXJlY3RvcmllcyxcbiAgICAgICAgICBwYXR0ZXJuczogcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PlxuICAgICAgICAgICAgdHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnICYmIHBhdHRlcm4uc3RhcnRzV2l0aCgnJHtjb25maWdEaXJ9JylcbiAgICAgICAgICAgICAgPyBwYXRoLmpvaW4oY29uc3VtZXJEaXJQYXRoLCBwYXR0ZXJuLnNsaWNlKCcke2NvbmZpZ0Rpcn0nLmxlbmd0aCkpXG4gICAgICAgICAgICAgIDogcGF0dGVyblxuICAgICAgICAgICksXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBmaWxlU2V0OiBUc2NvbmZpZ0ZpbGVTZXQgPSB7XG4gICAgZXhjbHVkZTogdG9QYXR0ZXJuU2V0KHRzY29uZmlnLmV4Y2x1ZGUsIHRydWUpLFxuICAgIGZpbGVzOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZmlsZXMsIGZhbHNlKSxcbiAgICBpbmNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuaW5jbHVkZSwgdHJ1ZSksXG4gIH07XG4gIGNvbnN0IHBhcmVudHMgPVxuICAgIHR5cGVvZiB0c2NvbmZpZy5leHRlbmRzID09PSAnc3RyaW5nJyA/IFt0c2NvbmZpZy5leHRlbmRzXSA6IEFycmF5LmlzQXJyYXkodHNjb25maWcuZXh0ZW5kcykgPyB0c2NvbmZpZy5leHRlbmRzIDogW107XG4gIC8vIFdpdGggYW4gYGV4dGVuZHNgIGFycmF5LCBsYXRlciBlbnRyaWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lcywgYW5kIHRoZSBjaGlsZCBvdmVycmlkZXMgYWxsIOKAlFxuICAvLyBzbyBmaWxsIGVhY2ggc3RpbGwtbWlzc2luZyBrZXkgZnJvbSB0aGUgbGFzdCBwYXJlbnQgdGhhdCBkZWZpbmVzIGl0LlxuICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRzLnRvUmV2ZXJzZWQoKSkge1xuICAgIGlmIChmaWxlU2V0LmV4Y2x1ZGUgJiYgZmlsZVNldC5maWxlcyAmJiBmaWxlU2V0LmluY2x1ZGUpIGJyZWFrO1xuICAgIC8vIFBhY2thZ2UtbmFtZSBleHRlbmRzIChlLmcuIGBAdHNjb25maWcvYnVuYCkgYXJlIGNvbXBpbGVyT3B0aW9ucyBwcmVzZXRzIHdpdGhvdXQgZmlsZSBzZXRzLlxuICAgIGlmICh0eXBlb2YgcGFyZW50ICE9PSAnc3RyaW5nJyB8fCAhcGFyZW50LnN0YXJ0c1dpdGgoJy4nKSkgY29udGludWU7XG4gICAgbGV0IHBhcmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcGFyZW50KTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFyZW50UGF0aCkgJiYgZnMuZXhpc3RzU3luYyhgJHtwYXJlbnRQYXRofS5qc29uYCkpIHBhcmVudFBhdGggKz0gJy5qc29uJztcbiAgICBjb25zdCBwYXJlbnRGaWxlU2V0ID0gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChwYXJlbnRQYXRoLCBjb25zdW1lckRpclBhdGgsIHJlbWFpbmluZ0RlcHRoIC0gMSk7XG4gICAgaWYgKCFwYXJlbnRGaWxlU2V0KSBjb250aW51ZTtcbiAgICBmaWxlU2V0LmV4Y2x1ZGUgPz89IHBhcmVudEZpbGVTZXQuZXhjbHVkZTtcbiAgICBmaWxlU2V0LmZpbGVzID8/PSBwYXJlbnRGaWxlU2V0LmZpbGVzO1xuICAgIGZpbGVTZXQuaW5jbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5pbmNsdWRlO1xuICB9XG4gIHJldHVybiBmaWxlU2V0O1xufVxuXG5mdW5jdGlvbiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXR0ZXJuLnJlcGxhY2UoL15cXC5cXC8vdSwgJycpO1xuICAvLyBBIGJhcmUgYC5gIGluY2x1ZGUgY292ZXJzIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIGNvbmZpZydzIGRpcmVjdG9yeS5cbiAgaWYgKG5vcm1hbGl6ZWQgPT09ICcnIHx8IG5vcm1hbGl6ZWQgPT09ICcuJykgcmV0dXJuIHRydWU7XG4gIC8vIEFic29sdXRlIHBhdHRlcm5zIChleHBhbmRlZCBgJHtjb25maWdEaXJ9YCkgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgYWJzb2x1dGUgdGFyZ2V0OyBkcm9wIHRoZVxuICAvLyBsZWFkaW5nIHNsYXNoZXMgZnJvbSBib3RoIHNvIHRoZSBzZWdtZW50LWJ1aWx0IHJlZ2V4IGFuY2hvcnMgaWRlbnRpY2FsbHkuXG4gIHRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL15cXC8rL3UsICcnKTtcbiAgY29uc3Qgc2VnbWVudHMgPSBub3JtYWxpemVkLnNwbGl0KCcvJykuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICE9PSAnJyk7XG4gIGNvbnN0IHJlZ2V4U291cmNlID0gc2VnbWVudHNcbiAgICAubWFwKChzZWdtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoc2VnbWVudCA9PT0gJyoqJykgcmV0dXJuIGlzTGFzdCA/ICcuKicgOiBTdHJpbmcucmF3YCg/OlteL10rLykqYDtcbiAgICAgIGNvbnN0IHNlZ21lbnRTb3VyY2UgPSBzZWdtZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKVxuICAgICAgICAucmVwbGFjZUFsbCgnKicsIFN0cmluZy5yYXdgW14vXSpgKVxuICAgICAgICAucmVwbGFjZUFsbCgnPycsIFN0cmluZy5yYXdgW14vXWApO1xuICAgICAgcmV0dXJuIGlzTGFzdCA/IHNlZ21lbnRTb3VyY2UgOiBgJHtzZWdtZW50U291cmNlfS9gO1xuICAgIH0pXG4gICAgLmpvaW4oJycpO1xuICAvLyB0c2MgdHJlYXRzIGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgaW5jbHVkZS9leGNsdWRlIGVudHJ5IGFzIGEgZGlyZWN0b3J5IHdob3NlIHN1YnRyZWUgaXMgaW5jbHVkZWQuXG4gIGNvbnN0IGxhc3RTZWdtZW50ID0gc2VnbWVudHMuYXQoLTEpID8/ICcnO1xuICBjb25zdCBkaXJlY3RvcnlTdWZmaXggPVxuICAgIGV4cGFuZHNEaXJlY3RvcmllcyAmJiAhL1sqP10vdS50ZXN0KGxhc3RTZWdtZW50KSAmJiAhbGFzdFNlZ21lbnQuaW5jbHVkZXMoJy4nKSA/IFN0cmluZy5yYXdgKD86Ly4qKT9gIDogJyc7XG4gIHJldHVybiBuZXcgUmVnRXhwKGBeJHtyZWdleFNvdXJjZX0ke2RpcmVjdG9yeVN1ZmZpeH0kYCwgJ3UnKS50ZXN0KHRhcmdldFBhdGgpO1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBvd25zIGEgV29ya2VyLCB1bmxpa2UgdGhlIGlzQ2xvdWRmbGFyZSBoZXVyaXN0aWMsIHdoaWNoIGFsc28gbWF0Y2hlcyBhIHBhY2thZ2UgdGhhdFxuICogbWVyZWx5IG1lbnRpb25zIHdyYW5nbGVyIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93IChlLmcuIHRoZSByb290IG9mIGEgbW9ub3JlcG8gd2hvc2UgV29ya2VyIGxpdmVzIGluIGEgc3ViLXBhY2thZ2UpLlxuICovXG5mdW5jdGlvbiBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpKVxuICApO1xufVxuXG4vKipcbiAqIERldGVjdHMgd2hldGhlciBkaXJQYXRoIGJlbG9uZ3MgdG8gdGhlIHdpbGxib29zdGVyLWNvbmZpZ3MgcmVwb3NpdG9yeS4gUHJlZmVycyB0aGUgYXV0aG9yaXRhdGl2ZVxuICogR2l0SHViIHJlcG8gbmFtZSwgd2hpY2ggaXMgaW1tdW5lIHRvIHRoZSBsb2NhbCBkaXJlY3RvcnkgbGF5b3V0LiBUaGF0IG5hbWUgaXMgZmV0Y2hlZCBvbmx5IGZvciB0aGVcbiAqIHJvb3QsIHNvIHN1Yi1wYWNrYWdlcyAoYW5kIG9mZmxpbmUgcm9vdHMpIHdhbGsgdXAgdG8gdGhlIG5lYXJlc3QgZ2l0IHJvb3QgYW5kIG1hdGNoIGl0cyBkaXJlY3RvcnlcbiAqIG5hbWU6IGEgc2libGluZyByZXBvIGNsb25lZCB1bmRlciBhIHBhcmVudCBkaXJlY3RvcnkgbmFtZWQgd2lsbGJvb3N0ZXItY29uZmlncyBzdG9wcyBhdCBpdHMgb3duXG4gKiBgLmdpdGAsIHNvIGl0IGlzIG5vdCBtaXNjbGFzc2lmaWVkLiBUaGUgcGF0aCBzZWdtZW50IHJlbWFpbnMgYSBsYXN0IHJlc29ydCB3aGVuIG5vIGdpdCByb290IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvblBhdGg6IHN0cmluZywgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAocmVwb05hbWUpIHJldHVybiByZXBvTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAoY3VycmVudCAhPT0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcuZ2l0JykpKSB7XG4gICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjdXJyZW50KS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCcvd2lsbGJvb3N0ZXItY29uZmlncy8nKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0Q2xvdWRmbGFyZShcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuLFxuICB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCd3cmFuZ2xlcicpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRvZXNDb250YWluV3JhbmdsZXJDb25maWcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0NvbnRlbnRzLnNvbWUoKGNvbnRlbnQpID0+IC9jbG91ZGZsYXJlfHdyYW5nbGVyL2l1LnRlc3QoY29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RSYWlsd2F5KGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygncmFpbHdheScpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmFpbHdheWlnbm9yZScpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5Lmpzb24nKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncmFpbHdheS50b21sJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL3JhaWx3YXkvaXUudGVzdChjb250ZW50KSk7XG59XG5cbi8qKiBDb250ZW50cyBvZiB0aGUgcmVhZGFibGUgLmdpdGh1Yi93b3JrZmxvd3MgWUFNTCBmaWxlcywgcmVhZCBvbmNlIGZvciBldmVyeSBkZXRlY3RvciBuZWVkaW5nIHRoZW0uICovXG5mdW5jdGlvbiByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpXG4gICAgICAuZmlsdGVyKChmaWxlTmFtZSkgPT4gL1xcLnlhP21sJC9pdS50ZXN0KGZpbGVOYW1lKSlcbiAgICAgIC5mbGF0TWFwKChmaWxlTmFtZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBbZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4JyldO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1pc2VUYXNrcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7IHRhc2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncy50YXNrcyA/PyB7fSkpIHtcbiAgICAgICAgdGFza3NbbmFtZV0gPSByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3Npbmcgb3IgdGVtcG9yYXJpbHkgaW52YWxpZCBtaXNlIGZpbGVzIHNob3VsZCBub3QgYmxvY2sgb3RoZXIgd2JmeSBnZW5lcmF0b3JzLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAvLyBQcmVzZXJ2ZSBhcnJheS1mb3JtIG1pc2UgY29tbWFuZHMgc28gcmVjdXJzaW9uIGNoZWNrcyBjYW4gc3RpbGwgc2VlIHBhY2thZ2Ugc2NyaXB0IGNhbGxzLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIHN0cmluZyA9PiB0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpLmpvaW4oJ1xcbicpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHJlYWRNaXNlVGFza0NvbW1hbmQoKHZhbHVlIGFzIHsgcnVuPzogdW5rbm93biB9KS5ydW4pO1xuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2hldGhlciBkaXJQYXRoIGlzIGEgY2hpbGQgd29ya3NwYWNlIG9mIGFuIGVuY2xvc2luZyBtb25vcmVwbyByb290OiBlaXRoZXIgdGhlIGNvbnZlbnRpb25hbFxuICogYDxyb290Pi9wYWNrYWdlcy88bmFtZT5gIGxheW91dCwgb3IgYSBkaXJlY3RvcnkgbWF0Y2hpbmcgYSB3b3Jrc3BhY2UgcGF0dGVybiBkZWNsYXJlZCBieSBhblxuICogYW5jZXN0b3IgcGFja2FnZS5qc29uIChwYXR0ZXJucyBtYXkgYmUgYXJiaXRyYXJpbHkgZGVlcCwgZS5nLiBgZXhhbXBsZXMvKipgKS4gVGhlIHdhbGsgc3RvcHNcbiAqIGF0IHRoZSBmaXJzdCBnaXQgcmVwb3NpdG9yeSBib3VuZGFyeSBzbyBhbiB1bnJlbGF0ZWQgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyB3b3Jrc3BhY2VzIGNhblxuICogbmV2ZXIgcmVjbGFzc2lmeSBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IGFzIGEgY2hpbGQuXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZXNvbHZlZERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIC8vIEEgZGlyZWN0b3J5IHdpdGggaXRzIG93biAuZ2l0IGlzIGEgcmVwb3NpdG9yeSBpbiBpdHMgb3duIHJpZ2h0LCBuZXZlciBhIGNoaWxkIHdvcmtzcGFjZSDigJRcbiAgLy8gY2hlY2tlZCBGSVJTVCBzbyBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IHVuZGVyIHNvbWUgYHBhY2thZ2VzL2AgZGlyZWN0b3J5IHN0YXlzIGEgcm9vdC5cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy4uJykpID09PSAncGFja2FnZXMnICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvciAoXG4gICAgbGV0IGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHJlc29sdmVkRGlyUGF0aCk7XG4gICAgO1xuICAgIGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKVxuICApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgcmVzb2x2ZWREaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh7XG4gICAgICAgIGRpclBhdGg6IGNhbmRpZGF0ZVJvb3REaXJQYXRoLFxuICAgICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogZmFsc2UsXG4gICAgICB9KS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmluY2x1ZGVzKHJlbGF0aXZlRGlyUGF0aCkpIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm8gb3IgdW5wYXJzYWJsZSBtYW5pZmVzdCBhdCB0aGlzIGFuY2VzdG9yOiBrZWVwIHdhbGtpbmcuXG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsICcuZ2l0JykpO1xuICAgIGNvbnN0IGlzRmlsZXN5c3RlbVJvb3QgPSBjYW5kaWRhdGVSb290RGlyUGF0aCA9PT0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZnXG4gICAgLmdsb2JTeW5jKCcqKi9DYXJnby50b21sJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pXG4gICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnNwbGl0KCcvJykubGVuZ3RoIC0gYi5zcGxpdCgnLycpLmxlbmd0aCB8fCBhLmxvY2FsZUNvbXBhcmUoYikpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZXMgPSBmZy5nbG9iU3luYygne2FwcCxzcmN9LyoqLyoue2NqcyxjdHMsanMsanN4LG1qcyxtdHMsdHMsdHN4fScsIHtcbiAgICBkb3Q6IHRydWUsXG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsICcqKi9fX3Rlc3RzX18vKionLCAnKiovKi5zcGVjLionLCAnKiovKi50ZXN0LionLCAnKiovcGxheXdyaWdodC5jb25maWcuKiddLFxuICB9KTtcbiAgY29uc3QgcGxheXdyaWdodEltcG9ydFBhdHRlcm4gPSBidWlsZFJ1bnRpbWVJbXBvcnRSZWdFeHAoJ3BsYXl3cmlnaHQnKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZSksICd1dGY4Jyk7XG4gICAgaWYgKHBsYXl3cmlnaHRJbXBvcnRQYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSdW50aW1lSW1wb3J0UmVnRXhwKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBSZWdFeHAge1xuICAvLyBNYXRjaCB0aGUgYmFyZSBzcGVjaWZpZXIgb3IgYW55IHN1YnBhdGggb2YgaXQgKGBwa2dgIC8gYHBrZy9zdWJgKSwgYnV0IG5ldmVyIGEgZGlmZmVyZW50IHBhY2thZ2VcbiAgLy8gdGhhdCBtZXJlbHkgc2hhcmVzIHRoZSBwcmVmaXggKGBwa2ctb3RoZXJgKSwgc2luY2UgdGhlIGNoYXIgYWZ0ZXIgdGhlIG5hbWUgbXVzdCBiZSBgL2Agb3IgYSBxdW90ZS5cbiAgY29uc3Qgc3BlY2lmaWVyID0gU3RyaW5nLnJhd2BbJ1wiXSR7ZXNjYXBlUmVnRXhwKHBhY2thZ2VOYW1lKX0oPzovW14nXCJdKik/WydcIl1gO1xuICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YFxcYmZyb21cXHMrJHtzcGVjaWZpZXJ9fFxcYmltcG9ydFxccypcXChcXHMqJHtzcGVjaWZpZXJ9XFxzKlxcKXxcXGJyZXF1aXJlXFxzKlxcKFxccyoke3NwZWNpZmllcn1cXHMqXFwpYCxcbiAgICAndSdcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVtb3RlVXJsID0gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGgpO1xuICBpZiAocmVtb3RlVXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uLiBUaGUgb3duZXIgTVVTVCBiZSBwYXNzZWQ6IGdldE9jdG9raXQoKSB3aXRob3V0IGl0IHByZWZlcnMgdGhlXG4gICAgLy8gV2lsbEJvb3N0ZXIgUEFULCB3aGljaCBjYW5ub3QgcmVhZCBwcml2YXRlIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcywgY29sbGFwc2luZyB0aGVpclxuICAgIC8vIHZpc2liaWxpdHkgdG8gdW5rbm93biAoYW5kIGUuZy4gc2tpcHBpbmcgdGhlIHdiZnkgY2FsbGVyIGdlbmVyYXRpb24gaW5kZWZpbml0ZWx5KS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQob3JnKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgLy8gUmUtZmV0Y2ggdW5kZXIgdGhlIHJlZGlyZWN0ZWQgaWRlbnRpdHkgc28gYSByZW5hbWVkIHJlcG9zaXRvcnkgc3RpbGwgZ2V0cyBjb21wbGV0ZVxuICAgICAgLy8gbWV0YWRhdGEgKHZpc2liaWxpdHkgaW5jbHVkZWQpIGluc3RlYWQgb2YgYSBiYXJlIGZ1bGxfbmFtZSB0aGF0IHdvdWxkIGxlYXZlXG4gICAgICAvLyBpc1JlcG9WaXNpYmlsaXR5S25vd24gZmFsc2Ugb24gZXZlcnkgc3Vic2VxdWVudCBydW4gd2l0aCB0aGUgc3RhbGUgcmVtb3RlIFVSTC5cbiAgICAgIGNvbnN0IFtyZWRpcmVjdGVkT3JnLCByZWRpcmVjdGVkTmFtZV0gPSByZWRpcmVjdGVkRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZWRpcmVjdGVkT3JnICYmIHJlZGlyZWN0ZWROYW1lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KHJlZGlyZWN0ZWRPcmcpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcjogcmVkaXJlY3RlZE9yZyxcbiAgICAgICAgICAgIHJlcG86IHJlZGlyZWN0ZWROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGJhcmUgaWRlbnRpdHkgYmVsb3c6IHRoZSByZXBvc2l0b3J5IGlzIHN0aWxsIGNhbm9uaWNhbGl6ZWQsIG9ubHlcbiAgICAgICAgICAvLyBpdHMgdmlzaWJpbGl0eSBzdGF5cyB1bmtub3duLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBmdWxsX25hbWU6IHJlZGlyZWN0ZWRGdWxsTmFtZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGA8b3JnPi88bmFtZT5gIGZyb20gdGhlIGdpdCByZW1vdGUgKGZhbGxpbmcgYmFjayB0byBwYWNrYWdlLmpzb24ncyBgcmVwb3NpdG9yeWApIHdpdGhvdXRcbiAqIGNhbGxpbmcgdGhlIEdpdEh1YiBBUEkuIEl0IHdvcmtzIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSwgbm90IGp1c3QgdGhlIHJvb3Qg4oCUIG9ubHkgdGhlIHJvb3RcbiAqIGZldGNoZXMgcmVwbyBpbmZvIOKAlCBhbmQgaXQga2VlcHMgd29ya2luZyBvZmZsaW5lIG9yIHJhdGUtbGltaXRlZCwgd2hlcmUgYW4gdW5kZWZpbmVkIGlkZW50aXR5XG4gKiB3b3VsZCBzaWxlbnRseSByZWNsYXNzaWZ5IHRoZSByZXBvc2l0b3J5IChlLmcuIG1ha2luZyB3YmZ5IHdyaXRlIHdpbGxib29zdGVyLWNvbmZpZ3MnIFJlbm92YXRlXG4gKiBwcmVzZXQgaW50byB0aGUgcHJlc2V0IGl0c2VsZiBhZ2FpbikuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb25cbik6IFByb21pc2U8W3N0cmluZyB8IHVuZGVmaW5lZCwgc3RyaW5nIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCByZW1vdGVVcmwgPSBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aCk7XG4gIGlmIChyZW1vdGVVcmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eShyZW1vdGVVcmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eSh1cmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIHJldHVybiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xufVxuXG5mdW5jdGlvbiBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydjb25maWcnLCAnLS1nZXQnLCAncmVtb3RlLm9yaWdpbi51cmwnXSwgZGlyUGF0aCkgfHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWVgIGlzIGhvc3QtYWdub3N0aWMsIHNvIGl0IGhhcHBpbHkgdHVybnMgYSBHaXRMYWIgVVJMIGludG8gYW4gYDxvcmc+LzxyZXBvPmAgcGFpci5cbiAqIEV2ZXJ5dGhpbmcgZG93bnN0cmVhbSB0cmVhdHMgdGhlIHJlc3VsdGluZyBpZGVudGl0eSBhcyBHaXRIdWIgKHRoZSBgZ2l0aHViOmAgcmVwb3NpdG9yeSBmaWVsZCBpcyByZXdyaXR0ZW5cbiAqIGludG8gcGFja2FnZS5qc29uKSwgc28gdGhlIGhvc3QgbXVzdCBiZSB2ZXJpZmllZCBmaXJzdDsgYSBub24tR2l0SHViIHJlbW90ZSB5aWVsZHMgbm8gaWRlbnRpdHksIGFzIGJlZm9yZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEdpdEh1YklkZW50aXR5KHVybDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdGFyZ2V0c0dpdEh1Yih1cmwpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmwpO1xuICByZXR1cm4gb3JnICYmIG5hbWUgPyBbY2Fub25pY2FsaXplT3duZXIob3JnKSwgbmFtZV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgVVJMJ3MgSE9TVCBpcyBnaXRodWIuY29tLiBQYXJzZWQgcmF0aGVyIHRoYW4gc3Vic3RyaW5nLW1hdGNoZWQ6IGEgcGF0aCBzdWNoIGFzXG4gKiBgaHR0cHM6Ly9naXRsYWIuY29tL2dpdGh1Yi5jb20vb3duZXIvcmVwby5naXRgIHdvdWxkIG90aGVyd2lzZSBiZSB0YWtlbiBmb3IgR2l0SHViLCBhbmQgYW4gdXBwZXJjYXNlXG4gKiBgR0lUSFVCLkNPTWAgd291bGQgYmUgcmVqZWN0ZWQuIGBnaXRodWI6b3duZXIvcmVwb2AgaXMgbnBtJ3Mgc2hvcnRoYW5kIGFuZCBuYW1lcyBubyBob3N0LCBzbyBpdCBpc1xuICogcmVjb2duaXplZCBzZXBhcmF0ZWx5OyBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24gYWNjZXB0cyB0aGUgc2FtZSBzaG9ydGhhbmQuXG4gKi9cbmZ1bmN0aW9uIHRhcmdldHNHaXRIdWIodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKC9eZ2l0aHViOi9pdS50ZXN0KHVybCkpIHJldHVybiB0cnVlO1xuICAvLyBzY3Atc3R5bGUgcmVtb3RlcyAoYGdpdEBnaXRodWIuY29tOm93bmVyL3JlcG8uZ2l0YCkgYXJlIG5vdCB2YWxpZCBVUkxzLlxuICBjb25zdCBzY3BIb3N0ID0gL15bXi9AXSpAKFteOi9dKyk6L3UuZXhlYyh1cmwpPy5bMV07XG4gIGlmIChzY3BIb3N0KSByZXR1cm4gc2NwSG9zdC50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsLnJlcGxhY2UoL15naXRcXCsvdSwgJycpKS5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdEh1YiBvd25lciBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgYW5kIGEgcmVtb3RlIG9yIG1hbmlmZXN0IFVSTCBtYXkgc3BlbGwgdGhlbSBhbnkgd2F5LCBidXQgdGhlIEFQSSdzXG4gKiBgZnVsbF9uYW1lYCBhbHdheXMgcmV0dXJuZWQgdGhlIGNhbm9uaWNhbCBzcGVsbGluZyDigJQgd2hpY2ggdGhlIG1hbnkgZXhhY3QgYD09PSAnV2lsbEJvb3N0ZXInYCBwb2xpY3kgY2hlY2tzXG4gKiAob3JnYW5pemF0aW9uIHdvcmtmbG93cywgYXV0aG9yIG1ldGFkYXRhLCB0aGUgV2lsbEJvb3N0ZXJMYWIgcHJlLXB1c2ggZ3VhcmQpIGRlcGVuZCBvbi4gQ2Fub25pY2FsaXplIGhlcmUgc29cbiAqIHRoZSBsb2NhbCBmYWxsYmFjayB5aWVsZHMgdGhlIHNhbWUgaWRlbnRpdHkgdGhlIEFQSSBkaWQsIGluc3RlYWQgb2Ygc2lsZW50bHkgc2tpcHBpbmcgdGhvc2UgcG9saWNpZXMuXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZU93bmVyKG93bmVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYW5vbmljYWxPd25lcnMgPSBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ107XG4gIHJldHVybiBjYW5vbmljYWxPd25lcnMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudG9Mb3dlckNhc2UoKSA9PT0gb3duZXIudG9Mb3dlckNhc2UoKSkgPz8gb3duZXI7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZXNXb3JrZXJUeXBlcyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgaGFzQ2xvdWRmbGFyZURlcGxveVdvcmtmbG93LCBpbnZva2VzV2JEZXBsb3kgfSBmcm9tICcuL3dvcmtmbG93LmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCByZWFkQWdlbnRzRXh0cmFDb250ZW50KHJvb3RDb25maWcuZGlyUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgdG9vbE5hbWVdIG9mIFtcbiAgICAgIFsnQUdFTlRTLm1kJywgJ0NvZGV4IENMSSddLFxuICAgICAgWydDTEFVREUubWQnLCAnQ2xhdWRlIENvZGUnXSxcbiAgICAgIFsnR0VNSU5JLm1kJywgJ0dlbWluaSBDTEknXSxcbiAgICBdIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHRvb2xOYW1lLCBleHRyYUNvbnRlbnQpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvclJ1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjJyk7XG4gICAgY29uc3QgY3Vyc29yUnVsZXNDb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChyb290Q29uZmlnLCBhbGxDb25maWdzLCBleHRyYUNvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGN1cnNvclJ1bGVzUGF0aCwgY3Vyc29yUnVsZXNDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG5cbi8qKlxuICogUmVhZHMgdGhlIHJvb3QncyB1c2VyLWF1dGhvcmVkIEFHRU5UU19FWFRSQS5tZCBvbmNlIHBlciBwcm9jZXNzOiB3YmZ5IG5ldmVyIHJld3JpdGVzIHRoZSBmaWxlLFxuICogYW5kIGJvdGggdGhlIGFnZW50LWluc3RydWN0aW9uIGFuZCBHZW1pbmkgZ2VuZXJhdG9ycyBuZWVkIGl0cyBjb250ZW50LiBDYWNoaW5nIHRoZSByZXNvbHZlZFxuICogdmFsdWUgKG5vdCB0aGUgUHJvbWlzZSkgaXMgcmFjZS1mcmVlIGJlY2F1c2UgdGhlIHR3byBjYWxsZXJzIHJ1biBzZXF1ZW50aWFsbHkgaW4gaW5kZXgudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQWdlbnRzRXh0cmFDb250ZW50KHJvb3REaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcbiAgaWYgKCFhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZS5oYXMoYWdlbnRzRXh0cmFQYXRoKSkge1xuICAgIGFnZW50c0V4dHJhQ29udGVudENhY2hlLnNldChhZ2VudHNFeHRyYVBhdGgsIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGFnZW50c0V4dHJhUGF0aCkpO1xuICB9XG4gIHJldHVybiBhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZS5nZXQoYWdlbnRzRXh0cmFQYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSAnYnVuJztcbiAgY29uc3QgZGVzY3JpcHRpb24gPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbjtcbiAgY29uc3QgZm5veEluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpXG4gICAgPyBgXFxuLSBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHNlY3JldHMgYXJlIG1hbmFnZWQgaW4gXFxgZm5veC50b21sXFxgIHZpYSBtaXNlICsgZm5veDsgcnVuIGNvbW1hbmRzIHRocm91Z2ggXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgLi4uXFxgIG9yIFxcYGZub3ggcnVuIC1QIDxwcm9maWxlPiAtLSA8Y29tbWFuZD5cXGAgaW5zdGVhZCBvZiBleHBlY3RpbmcgXFxgLmVudlxcYCBmaWxlcy4gTmV2ZXIgY3JlYXRlIGEgXFxgLmVudlxcYCwgXFxgLmVudi4qXFxgLCBvciBcXGAuZGV2LnZhcnNcXGAgZmlsZTogYWRkIHRoZSB2YXJpYWJsZSB0byBcXGBmbm94LnRvbWxcXGAgaW5zdGVhZC4gUHJvZmlsZSBzZWNyZXRzIGxvYWQgb25seSB3aGVuIGEgcHJvZmlsZSBpcyBzZWxlY3RlZDogbW9kZS1hd2FyZSB3YiBjb21tYW5kcyAoZS5nLiBcXGB3YiBzdGFydFxcYCwgXFxgd2IgdGVzdFxcYCkgYW5kIFxcYHdiIGRvdGVudlxcYCBzZWxlY3QgaXQgdGhlbXNlbHZlcyAoXFxgd2IgZG90ZW52XFxgIHVzZXMgXFxgV0JfRU5WXFxgLCBlbHNlIFxcYEZOT1hfUFJPRklMRVxcYCwgZWxzZSBcXGBOT0RFX0VOVlxcYCwgZWxzZSB0aGUgZGV2ZWxvcG1lbnQgcHJvZmlsZTsgXFxgV0JfRU5WXFxgIGFjY2VwdHMgb25seSBcXGBkZXZlbG9wbWVudFxcYC9cXGB0ZXN0XFxgL1xcYHN0YWdpbmdcXGAvXFxgcHJvZHVjdGlvblxcYCwgc28gdXNlIFxcYEZOT1hfUFJPRklMRVxcYCBmb3IgYW55IG90aGVyIHByb2ZpbGUpLCB3aGlsZSBiYXJlIFxcYGZub3ggcnVuXFxgIG5lZWRzIGFuIGV4cGxpY2l0IFxcYC1QIDxwcm9maWxlPlxcYC5gXG4gICAgOiAnJztcbiAgLy8gbWlzZSBvd25zIHRoZSBwaW5uZWQgdG9vbCB2ZXJzaW9ucywgc28gYSB2ZXJzaW9uIG1pc21hdGNoIGlzIGZpeGVkIGJ5IGVkaXRpbmcgbWlzZS50b21sIOKAlCBub3RcbiAgLy8gYnkgaW5zdGFsbGluZyBhIGRpZmZlcmVudCB2ZXJzaW9uIGdsb2JhbGx5LCB3aGljaCB0aGUgbmV4dCBgbWlzZSBpbnN0YWxsYCBzaWxlbnRseSBvdmVycmlkZXMuXG4gIGNvbnN0IG1pc2VJbnN0cnVjdGlvbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ21pc2UudG9tbCcpKVxuICAgID8gJ1xcbi0gVG9vbCB2ZXJzaW9ucyAoZS5nLiwgbm9kZSkgYXJlIHBpbm5lZCBpbiBgbWlzZS50b21sYDsgcnVuIGBtaXNlIGluc3RhbGxgIGFmdGVyIGNoYW5naW5nIGl0LCBhbmQgbmV2ZXIgaW5zdGFsbCB0aG9zZSB0b29scyBnbG9iYWxseSBpbnN0ZWFkLidcbiAgICA6ICcnO1xuICAvLyBJc29sYXRlZCBpbnN0YWxscyBhcmUgdGhlIG9yZyBzdGFuZGFyZCAod2JmeSBnZW5lcmF0ZXMgbm8gb3RoZXIgbGlua2VyKSBhbmQgdGhlIG1vc3RcbiAgLy8gYWdlbnQtaG9zdGlsZSBwYXJ0IG9mIHRoZSBzdGFjazogYSBwYWNrYWdlIHRoYXQgaXMgb25seSByZWFjaGFibGUgYmVjYXVzZSBhIGRlcGVuZGVuY3kgaG9pc3RlZFxuICAvLyBpdCBubyBsb25nZXIgcmVzb2x2ZXMsIGFuZCB0aGUgcmVmbGV4IGZpeCAoc3dpdGNoaW5nIHRoZSBsaW5rZXIgYmFjaykgc2lsZW50bHkgcmVpbnRyb2R1Y2VzXG4gIC8vIHRoZSBwaGFudG9tIGRlcGVuZGVuY2llcyB0aGUgbGF5b3V0IGV4aXN0cyB0byBjYXRjaC5cbiAgY29uc3QgaXNvbGF0ZWRJbnN0YWxsSW5zdHJ1Y3Rpb24gPSBgXFxuLSBcXGBidW5maWcudG9tbFxcYCB1c2VzIEJ1bidzIGlzb2xhdGVkIGxpbmtlciwgc28gb25seSBkZWNsYXJlZCBkZXBlbmRlbmNpZXMgcmVzb2x2ZS4gSWYgYW4gaW1wb3J0IGZhaWxzIHRvIHJlc29sdmUsIGRlY2xhcmUgdGhhdCBwYWNrYWdlIGluIHRoZSBcXGBwYWNrYWdlLmpzb25cXGAgdGhhdCBpbXBvcnRzIGl0OyBuZXZlciBzd2l0Y2ggXFxgbGlua2VyXFxgIHRvIFxcYGhvaXN0ZWRcXGAgb3IgYWRkIHRvIFxcYHB1YmxpY0hvaXN0UGF0dGVyblxcYCB0byB3b3JrIGFyb3VuZCBpdC5gO1xuICAvLyBFdmVyeSBjbGF1c2Ugc3RhdGVzIG9ubHkgYSB2ZXJpZmllZCBmYWN0LCByZXVzaW5nIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IncyBvd24gZGV0ZWN0b3JzOiB0aGVcbiAgLy8gd3JhbmdsZXItY29uZmlnIGNsYXVzZSBuZWVkcyBhbiBhY3R1YWwgY29uZmlnIGZpbGUgKGlzQ2xvdWRmbGFyZSBhbHNvIG1hdGNoZXMgYSBtZXJlIHdyYW5nbGVyXG4gIC8vIG1lbnRpb24gaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cpLCB0aGUgd29ya2Zsb3cgY2xhdXNlIG5lZWRzIGEgbGl2ZSByZXVzYWJsZS1kZXBsb3kgY2FsbGVyXG4gIC8vIChZQU1MLXBhcnNlZCBqb2JzLioudXNlcywgbm90IGEgcmF3LXRleHQvY29tbWVudCBtYXRjaCksIGFuZCB0aGUgYHdiIGRlcGxveWAgY2xhdXNlIG5lZWRzIGFcbiAgLy8gZGVwbG95IHNjcmlwdCB3aG9zZSBjb21tYW5kIHRva2VuIGlzIGB3YiDigKYgZGVwbG95YC5cbiAgY29uc3Qgb3duc1dyYW5nbGVyQ29uZmlnID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnKTtcbiAgLy8gT25seSBjbGFpbSB0aGUgZmlsZSBpcyBnZW5lcmF0ZWQgd2hlcmUgaXQgYWN0dWFsbHkgaXM6IGEgcGFja2FnZSB0aGF0IGhhbmQtbWFpbnRhaW5zIGl0cyBgRW52YCAoZS5nLiB1bmRlclxuICAvLyBgdHlwZXM6IFtcImJ1blwiXWApIGlzIGRlbGliZXJhdGVseSBsZWZ0IHVubWFuYWdlZCwgYW5kIHRlbGxpbmcgYW4gYWdlbnQgdG8gcnVuIGB3YiBnZW4tY29kZWAgdGhlcmUgd291bGQgc2VuZFxuICAvLyBpdCBhZnRlciBhIGZpbGUgdGhhdCBuZXZlciBhcHBlYXJzIOKAlCBhbmQgYXdheSBmcm9tIHRoZSBgRW52YCBpdCBzaG91bGQgYmUgZWRpdGluZy5cbiAgY29uc3Qgb3duc0dlbmVyYXRlZFdvcmtlclR5cGVzID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpO1xuICBjb25zdCBoYXNEZXBsb3lXb3JrZmxvdyA9IGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1Yi93b3JrZmxvd3MnKSk7XG4gIGNvbnN0IHVzZXNXYkRlcGxveSA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiB7XG4gICAgY29uc3QgZGVwbG95U2NyaXB0ID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5bJ2RlcGxveSddO1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgZGVwbG95U2NyaXB0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdCwgbmV3IFNldChPYmplY3Qua2V5cyhjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge30pKSlcbiAgICApO1xuICB9KTtcbiAgLy8gSW5kZXBlbmRlbnQgZmFjdHMgc3RheSBzZXBhcmF0ZSBzZW50ZW5jZXM6IHRoZSB3b3JrZmxvdydzIG93biBkZXBsb3kgbWVjaGFuaXNtIGlzIG5vdFxuICAvLyBpbnNwZWN0ZWQsIHNvIHRoZSB3Yi1kZXBsb3kgY2xhdXNlIG11c3Qgbm90IGNsYWltIHRoZSB3b3JrZmxvdyBpbnZva2VzIGl0LlxuICBjb25zdCBjbG91ZGZsYXJlSW5zdHJ1Y3Rpb24gPSBvd25zV3JhbmdsZXJDb25maWdcbiAgICA/IGBcXG4tIFRoaXMgcHJvamVjdCBydW5zIG9uIENsb3VkZmxhcmUgV29ya2VyczogdGhlIHdyYW5nbGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBob2xkcyB0aGUgV29ya2VyJ3MgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIGFueSBiaW5kaW5ncyBhbmQgcGVyLWVudmlyb25tZW50IG92ZXJyaWRlcy4ke2hhc0RlcGxveVdvcmtmbG93ID8gJyBUaGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgIHBlcmZvcm0gZGVwbG95bWVudHMuJyA6ICcnfSR7dXNlc1diRGVwbG95ID8gJyBUaGUgYGRlcGxveWAgcGFja2FnZSBzY3JpcHQgcnVucyBgd2IgZGVwbG95YC4nIDogJyd9JHtvd25zR2VuZXJhdGVkV29ya2VyVHlwZXMgPyBgXFxuLSBcXGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXFxgIGlzIGdlbmVyYXRlZCBieSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBnZW4tY29kZVxcYCBhbmQgaXMgZ2l0aWdub3JlZDsgYWZ0ZXIgY2hhbmdpbmcgYmluZGluZ3Mgb3IgdmFycyBpbiB0aGUgd3JhbmdsZXIgY29uZmlndXJhdGlvbiwgcmUtcnVuIGl0IGluc3RlYWQgb2YgZWRpdGluZyB0aGF0IGZpbGUgYnkgaGFuZC5gIDogJyd9YFxuICAgIDogJyc7XG4gIC8vIFdpbGxCb29zdGVyIFJhaWx3YXkgcHJvamVjdCBpZGVudGlmaWVycyBhcmUgbWFuYWdlZCBpbiBkZXBsb3kgd29ya2Zsb3cgc2V0dGluZ3MuXG4gIGNvbnN0IHJhaWx3YXlJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNSYWlsd2F5XG4gICAgPyAnXFxuLSBSYWlsd2F5IHByb2plY3QgaW5mb3JtYXRpb24gaXMgaW4gdGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYC4nXG4gICAgOiAnJztcbiAgY29uc3QgcGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbiA9IGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGFsbENvbmZpZ3MpXG4gICAgPyBgXFxuLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJyc7XG4gIGNvbnN0IGNvQXV0aG9ySW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuICAtIEVuZCB5b3VyIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBibGFuayBsaW5lIGZvbGxvd2VkIGJ5IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgLmBcbiAgICA6ICcnO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IHJvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKSk7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cHJvamVjdE5hbWV9XFxgJHtkZXNjcmlwdGlvbiA/IGBcXG4tIERlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWAgOiAnJ31cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIElmIG9uIFxcYG1haW5cXGAsIGNyZWF0ZSBhIG5ldyBicmFuY2g7IG90aGVyd2lzZSB3b3JrIG9uIHRoZSBjdXJyZW50IGJyYW5jaC5cbi0gUnVuIFxcYGdpdFxcYCBjb21tYW5kcyBvbmUgYXQgYSB0aW1lIHRvIGF2b2lkIFxcYGluZGV4LmxvY2tcXGAgY29uZmxpY3RzLlxuLSBXcml0ZSBhIHRlc3Qgb25seSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBvciB3aGVuIGEgYmVoYXZpb3IgaXMgYm90aCBsaWtlbHkgdG8gcmVncmVzcyBBTkQgaGFzIG5vIG90aGVyIGF1dG9tYXRpYyBzYWZlZ3VhcmQgKHR5cGUgY2hlY2tpbmcsIGxpbnRpbmcsIG9yIGFuIGV4aXN0aW5nIHRlc3QvQ0kgY2hlY2sgd291bGQgbm90IGNhdGNoIHRoZSBicmVha2FnZSkuIFNraXAgdGhlIHRlc3Qgd2hlbiBhbiBleGlzdGluZyBzaWduYWwgYWxyZWFkeSBjYXRjaGVzIHRoZSByZWdyZXNzaW9uLCB3aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBtZXJlbHkgbWFwcyBjb25kaXRpb25zIHRvIGNvbnN0YW50IG91dHB1dHMgc28gYSB0ZXN0IHdvdWxkIHJlc3RhdGUgdGhhdCBtYXBwaW5nIGFuZCBmYWlsIG9ubHkgb24gaW50ZW50aW9uYWwgZWRpdHMgKGEgY2hhbmdlIGRldGVjdG9yKSwgb3Igd2hlbiB5b3UgYXJlIG9ubHkgY29uZmlybWluZyBhbiBleHRlcm5hbCBmYWN0IChhIGxpYnJhcnkncyBiZWhhdmlvciwgd2hldGhlciBhIHZlcnNpb24gZml4ZXMgYW4gaXNzdWUpOyB2ZXJpZnkgdGhlIGxhdHRlciB0d28gb25jZSBtYW51YWxseSBpbnN0ZWFkIG9mIGFkZGluZyBhIHBlcm1hbmVudCB0ZXN0LlxuLSBXaGVuIHdyaXRpbmcgdGVzdHMsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBUZXN0IGV4dGVybmFsbHkgb2JzZXJ2YWJsZSBiZWhhdmlvciAoZS5nLiwgZW1pdHRlZCBmaWxlcywgQ0xJIG91dHB1dCwgcmVuZGVyZWQgcmVzdWx0cykgYXQgdGhlIHN5c3RlbSBib3VuZGFyeSwgbm90IGltcGxlbWVudGF0aW9uIGRldGFpbHM6IGRvIG5vdCBtaXJyb3IgcHJvZHVjdGlvbiBsb2dpYywgYXNzZXJ0IHRoYXQgYSBicmFuY2ggaXMgdGFrZW4sIG9yIGZlZWQgaGFuZC1hc3NlbWJsZWQgaW50ZXJuYWwgb2JqZWN0cyB0byBpbnRlcm5hbCBmdW5jdGlvbnMuXG4gIC0gUHJlZmVyIGFjdHVhbCBBUEkgY2FsbHMgb3ZlciBtb2NrcywgdW5sZXNzIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIG1vY2tzIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBFbnN1cmUgdGVzdHMgYXJlIGlkZW1wb3RlbnQgYW5kIGluZGVwZW5kZW50IChlLmcuLCByZXNldCBwZXJzaXN0ZW50IGRhdGEpIHNvIHRoZXkgY2FuIHJ1biByZXBlYXRlZGx5IG9yIGluIHBhcmFsbGVsLlxuICAtIEF2b2lkIGZpeGVkIHdhaXRzIGluIEUyRSB0ZXN0czsgd2FpdCBmb3IgY29uZGl0aW9ucyBpbnN0ZWFkLlxuICAtIENvbnRpbnVlIG1vZGlmeWluZyB0ZXN0cyBhbmQvb3IgY29kZSB1bnRpbCBhbGwgdGVzdHMgcGFzcy5cbi0gV2hlbiBmaXhpbmcgaXNzdWVzIChpbmNsdWRpbmcgdGVzdCBmYWlsdXJlcyksIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCB2aWEgZGVidWcgbG9ncyBvciBzY3JlZW5zaG90cykgYW5kIGZpeCBpdCBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY2hhbmdlcywgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnlcXGAgKHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmc7IHRha2VzIHVwIHRvIDEwIG1pbnV0ZXMpLCBvciBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5LWZ1bGxcXGAgKGFsbCB0ZXN0czsgdGFrZXMgdXAgdG8gMSBob3VyKSBpZiB5b3UgY2hhbmdlZCBydW50aW1lIGJlaGF2aW9yIG9yIHRlc3RzLiBGaXggZXJyb3JzIGFuZCByZS1ydW4gdW50aWwgaXQgcGFzc2VzLlxuICAtIEFnZW50IHNoZWxscyBtYXkgdGVybWluYXRlIHRyYWNrZWQgY29tbWFuZHMgKGluY2x1ZGluZyBiYWNrZ3JvdW5kIG9uZXMpIGF0IHRpbWUgbGltaXRzLCBvZnRlbiBtaW51dGVzLCBzbyBydW4gY29tbWFuZHMgdGhhdCBjYW4gZXhjZWVkIHlvdXIgc2hlbGwtY2FsbCB0aW1lb3V0IChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5XFxgIGFuZCBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5LWZ1bGxcXGApIGRldGFjaGVkIHZpYSBub2h1cCwgZnJvbSBhIHNoZWxsIGNhbGwgdGhhdCByZXR1cm5zIGltbWVkaWF0ZWx5OiBcXGBta2RpciAtcCAudG1wOyBybSAtZiAudG1wL3ZlcmlmeS1mdWxsLmV4aXQ7IG5vaHVwIHNoIC1jICcke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5LWZ1bGw7IGVjaG8gJD8gPiAudG1wL3ZlcmlmeS1mdWxsLmV4aXQnID4gLnRtcC92ZXJpZnktZnVsbC5sb2cgMj4mMSAmXFxgICh0aGUgcmVkaXJlY3RzIGFyZSByZXF1aXJlZDogYW4gaW5oZXJpdGVkIHN0ZG91dC9zdGRlcnIgcGlwZSB3b3VsZCBrZWVwIHRoZSBjYWxsIHdhaXRpbmcpLiBQb2xsIGZyb20gc2VwYXJhdGUgY2FsbHMsIGVhY2ggc2hvcnRlciB0aGFuIHlvdXIgc2hlbGwtY2FsbCB0aW1lb3V0OiBcXGBmb3IgaSBpbiAxIDIgMzsgZG8gdGVzdCAtZiAudG1wL3ZlcmlmeS1mdWxsLmV4aXQgJiYgYnJlYWs7IHNsZWVwIDIwOyBkb25lOyBjYXQgLnRtcC92ZXJpZnktZnVsbC5leGl0IDI+L2Rldi9udWxsIHx8IGVjaG8gc3RpbGwgcnVubmluZ1xcYC4gUmVwZWF0IHVudGlsIHRoZSBleGl0IGZpbGUgYXBwZWFycyAoaXRzIGNvbnRlbnQgaXMgdGhlIGV4aXQgY29kZSksIHRoZW4gcmVhZCB0aGUgbG9nOyBpZiBpdCBuZXZlciBhcHBlYXJzIHdoaWxlIHRoZSBsb2cgc3RvcHMgZ3Jvd2luZywgdGhlIHJ1biBpdHNlbGYgZGllZC5cbi0gT25jZSB2ZXJpZmllZCwgY29tbWl0IGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCBhbmQgY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgYnJhbmNoLlxuICAtIEZvbGxvdyB0aGUgQ29udmVudGlvbmFsIENvbW1pdHMgZm9ybWF0IChlLmcuLCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCkuJHtjb0F1dGhvckluc3RydWN0aW9ufVxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHM7IGF2b2lkIFxcYC0tYW1lbmRcXGAuXG4tIEluIGFueSBleHBsYW5hdG9yeSB0ZXh0IChjb21taXQgbWVzc2FnZXMsIFBSIGRlc2NyaXB0aW9ucywgZG9jdW1lbnRhdGlvbiwgY29kZSBjb21tZW50cywgZXRjLiksIGRlc2NyaWJlIG9ubHkgd2hhdCBleGlzdHMgaW4gdGhlIGZpbmFsIHNuYXBzaG90OiBuZXZlciBtZW50aW9uIHN5bWJvbHMgb3IgY29uY2VwdHMgdGhhdCB3ZXJlIGFkZGVkIGFuZCBsYXRlciByZW1vdmVkIG9yIHJlbmFtZWQgYWxvbmcgdGhlIHdheSwgZXZlbiBpZiB0aGV5IG1hdHRlcmVkIGR1cmluZyB0aGUgd29yay4gSWYgeW91IGNhbm5vdCBjb25maXJtIHRoYXQgYW4gaWRlbnRpZmllciBvciBmZWF0dXJlIG5hbWUgeW91IGFyZSBhYm91dCB0byB3cml0ZSBleGlzdHMgaW4gdGhlIGZpbmFsIGRpZmYgb3IgdGhlIGN1cnJlbnQgY29kZWJhc2UsIGRyb3AgdGhhdCBzdGF0ZW1lbnQuXG4tIFVzZSBoZXJlZG9jIGZvciBtdWx0aS1saW5lIGNvbW1hbmQgaW5wdXQgKGUuZy4sIFxcYGdpdCBjb21taXQgLUYgLVxcYCwgXFxgZ2ggcHIgY3JlYXRlIC0tYm9keS1maWxlIC1cXGApLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIFxcYC50bXBcXGA7IHVzZSBcXGAvdG1wXFxgIG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBsaXZlIG91dHNpZGUgdGhlIHJlcG8uJHttaXNlSW5zdHJ1Y3Rpb259JHtpc29sYXRlZEluc3RhbGxJbnN0cnVjdGlvbn0ke2Zub3hJbnN0cnVjdGlvbn0ke2Nsb3VkZmxhcmVJbnN0cnVjdGlvbn0ke3JhaWx3YXlJbnN0cnVjdGlvbn0ke3BsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb259XG5cbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWcsIGFsbENvbmZpZ3MpfVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgaGFzTmV3U2VjdGlvbiA9IGV4dHJhQ29udGVudD8udHJpbSgpLnN0YXJ0c1dpdGgoJyMnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudFxuICAgID8gaGFzTmV3U2VjdGlvblxuICAgICAgPyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKClcbiAgICAgIDogJ1xcbicgKyBleHRyYUNvbnRlbnRcbiAgICA6ICcnO1xuICByZXR1cm4gYmFzZUNvbnRlbnQgKyBub3JtYWxpemVkRXh0cmFDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIC8vIFRhdXJpIGRlc2t0b3AgYXBwcyBzaGlwIFdpbmRvd3MgYnVpbGRzLCBhbmQgdGhlIGJvdW5kYXJ5IGJldHdlZW4gYXBwIGNvZGUgYW5kIHNoYXJlZCBjb2RlIGlzXG4gIC8vIHRvbyBmdXp6eSB0byBzY29wZSB0aGUgbWFjT1MvTGludXgtb25seSBydWxlIHBlciBwYWNrYWdlLCBzbyBzdWNoIHJlcG9zaXRvcmllcyB0YXJnZXQgYWxsXG4gIC8vIHRocmVlIE9TZXMgaW5zdGVhZC5cbiAgY29uc3QgaGFzRGVza3RvcEFwcCA9IGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcudGF1cmkgfHwgYy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcyk7XG4gIC8vIEEgcHVibGljIHJlcG9zaXRvcnkgd2l0aCBubyBgQHdpbGxib29zdGVyL2AgcGFja2FnZSBpcyBPU1MgZm9yIHRoZSBnZW5lcmFsIHB1YmxpYywgd2hvc2UgdXNlcnNcbiAgLy8gbWF5IHJ1biBXaW5kb3dzLCBzbyBubyBPUyByZXN0cmljdGlvbiBhcHBsaWVzIHRoZXJlLiBBbiB1bmtub3duIHZpc2liaWxpdHkgY29sbGFwc2VzIHRvXG4gIC8vIGlzUHVibGljUmVwbz1mYWxzZSBhbmQgdGhlcmVmb3JlIGtlZXBzIHRoZSByZXN0cmljdGl2ZSBkZWZhdWx0LlxuICBjb25zdCBpc0dlbmVyYWxQdWJsaWNPc3MgPVxuICAgIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvICYmIGFsbENvbmZpZ3MuZXZlcnkoKGMpID0+ICFjLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpO1xuICBjb25zdCBvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbiA9IGlzR2VuZXJhbFB1YmxpY09zc1xuICAgID8gJydcbiAgICA6IGhhc0Rlc2t0b3BBcHBcbiAgICAgID8gJy0gRW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5kb3dzLCBtYWNPUywgYW5kIExpbnV4LidcbiAgICAgIDogJy0gRW5zdXJlIGNvbXBhdGliaWxpdHkgb25seSB3aXRoIG1hY09TIGFuZCBMaW51eDsgZG8gbm90IGluY2x1ZGUgV2luZG93cy1zcGVjaWZpYyBjb2RlLic7XG4gIC8vIENsb3VkZmxhcmUgV29ya2VycyBleGVjdXRlIGFjcm9zcyBtYW55IGVwaGVtZXJhbCBpc29sYXRlcyBhbmQgdHdvIHJlcXVlc3RzIGFyZSBub3QgZ3VhcmFudGVlZFxuICAvLyB0byBoaXQgdGhlIHNhbWUgaW5zdGFuY2UsIHNvIHRoZSBzaW5nbGUtaW5zdGFuY2Ugc2ltcGxpZmljYXRpb24gc2lsZW50bHkgbG9zZXMgc3RhdGUgdGhlcmUg4oCUXG4gIC8vIGJ1dCBXb3JrZXJzIGRlbGliZXJhdGVseSByZXVzZSBleGVjdXRpb24gY29udGV4dHMsIHNvIGJlc3QtZWZmb3J0IGlzb2xhdGUtbG9jYWwgY2FjaGVzIHN0YXlcbiAgLy8gbGVnaXRpbWF0ZSAoaHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL3dvcmtlcnMvcmVmZXJlbmNlL2hvdy13b3JrZXJzLXdvcmtzLykuIFRoZVxuICAvLyBzaWduYWxzIGFyZSBjb3JyZWxhdGVkIFBFUiBQQUNLQUdFOiBhIG1vbm9yZXBvIGNhbiBob3N0IGEgc2luZ2xlLWluc3RhbmNlIHNlcnZlciBhcHAgbmV4dCB0b1xuICAvLyBhbiB1bnJlbGF0ZWQgV29ya2VyLCBhbmQgbmVpdGhlciBtYXkgb3ZlcnJpZGUgdGhlIG90aGVyJ3MgcnVsZS4gZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyBpc1xuICAvLyB0aGUgYWNjdXJhdGUgV29ya2VycyBzaWduYWwgKGlzQ2xvdWRmbGFyZSBhbHNvIG1hdGNoZXMgYSBtZXJlIHdyYW5nbGVyIG1lbnRpb24gaW4gYSBzY3JpcHQgb3JcbiAgLy8gd29ya2Zsb3cpLlxuICBjb25zdCBoYXNXb3JrZXJzQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcpO1xuICBjb25zdCBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcCA9IGFsbENvbmZpZ3Muc29tZShcbiAgICAoYykgPT4gKGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KSAmJiAhYy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnXG4gICk7XG4gIGNvbnN0IHdvcmtlcnNJbnN0cnVjdGlvbiA9XG4gICAgJy0gQ2xvdWRmbGFyZSBXb3JrZXJzIHJ1biBhY3Jvc3MgbXVsdGlwbGUgZXBoZW1lcmFsIGlzb2xhdGVzIGFuZCB0d28gcmVxdWVzdHMgbWF5IGhpdCBkaWZmZXJlbnQgaW5zdGFuY2VzOiBuZXZlciBsZXQgY29ycmVjdG5lc3MgZGVwZW5kIG9uIG1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlOyBwZXJzaXN0IGF1dGhvcml0YXRpdmUgc2hhcmVkIHN0YXRlIGluIGJpbmRpbmdzIChEMSwgS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMpLiBCZXN0LWVmZm9ydCBpc29sYXRlLWxvY2FsIGNhY2hlcyBvZiBub24tcmVxdWVzdC1zY29wZWQgZGF0YSBhcmUgZmluZS4nO1xuICBjb25zdCBzZXJ2ZXJJbnN0YW5jZUluc3RydWN0aW9uID0gaGFzV29ya2Vyc0FwcFxuICAgID8gaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gYCR7d29ya2Vyc0luc3RydWN0aW9ufSBUaGlzIGFwcGxpZXMgdG8gYWxsIGNvZGUgdGhhdCBydW5zIG9uIENsb3VkZmxhcmUgV29ya2VycyAodGhlIHdyYW5nbGVyLWNvbmZpZ3VyZWQgcGFja2FnZXMgYW5kIGFueSB3b3Jrc3BhY2UgcGFja2FnZSB0aGV5IGltcG9ydCk7IGFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UgZm9yIHRoZSBvdGhlciBzZXJ2ZXIgYXBwcy5gXG4gICAgICA6IHdvcmtlcnNJbnN0cnVjdGlvblxuICAgIDogaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gJy0gQXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS4nXG4gICAgICA6ICcnO1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmaWxlIG5hbWVzIGZvciBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgKFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBtb2R1bGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoIGhpZ2ggY29oZXNpb24gYW5kIGxvdyBjb3VwbGluZzsgc3BsaXQgbGFyZ2UgbW9kdWxlcyB3aGVuIG5lZWRlZC5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgKHRvcC1kb3duIG9yZGVyKTsgcGxhY2UgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGFib3ZlIHRoZWlyIHVzYWdlLlxuLSBXcml0ZSBjb21tZW50cyBhbmQgSlNEb2Mgb25seSBmb3IgaGFyZC10by11bmRlcnN0YW5kIGNvZGU6IGV4cGxhaW4gXCJ3aHlcIiBpbiBjb21tZW50cyBhbmQgXCJ3aGF0XCIgaW4gSlNEb2MuXG4tIE5ldmVyIGV4cGxhaW4gaG93IFdpbGxCb29zdGVyJ3MgaW4taG91c2UgdG9vbHMgKGUuZy4sIFxcYHdiXFxgLCBcXGB3YmZ5XFxgKSB3b3JrIGluIGNvZGUgY29tbWVudHMgb3IgZG9jdW1lbnRzIG91dHNpZGUgdGhlIHRvb2wncyBvd24gcGFja2FnZSwgZXhjZXB0IGluIGluc3RydWN0aW9ucyBmb3IgQUkgYWdlbnRzOyBlLmcuLCBkbyBub3Qgbm90ZSB0aGF0IFxcYFBPUlRcXGAgaXMgdW5zZXQgYmVjYXVzZSBcXGB3YlxcYCBwaWNrcyBhIGZyZWUgcG9ydC5cbi0gSWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLCB1c2UgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gV2hlbiB2YWxpZGF0aW5nIEphdmFTY3JpcHQgb2JqZWN0cyAoZS5nLiwgcGFyc2VkIEpTT04sIEFQSSByZXNwb25zZXMpLCBhbHdheXMgdXNlIFxcYHpvZFxcYCBpZiBwb3NzaWJsZSBpbnN0ZWFkIG9mIGhhbmQtd3JpdHRlbiBjaGVja3Mgb3IgdHlwZSBhc3NlcnRpb25zLlxuLSBCdWlsZCBwcm9tcHRzIGFzIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgb24gYSBwcmUtY29tcHV0YWJsZSBhcnJheSBvZiBzdHJpbmdzLlxuLSBBc3N1bWUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZDsgaWYgdmFsaWRhdGlvbiBpcyBuZWVkZWQsIFxcYGFzc2VydFxcYCBhdCBzdGFydHVwIHRvIGZhaWwgZmFzdC5cbi0gQXNzdW1lIGxvY2FsIHRvb2xzIHN1Y2ggYXMgXFxgZ2l0XFxgLCBcXGBnaFxcYCwgYW5kIFxcYGdocVxcYCBhcmUgaW5zdGFsbGVkIGFuZCBhdXRoZW50aWNhdGVkLlxuJHtvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gV2hlbiBhZGRpbmcgc3RyaW5nIGxpdGVyYWxzIGluIFJlYWN0IGNvbXBvbmVudHMsIHJlZ2lzdGVyIHRoZW0gaW4gdGhlIFxcYGkxOG5cXGAgcmVzb3VyY2UgZmlsZXMgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkgYW5kIHJlZmVyZW5jZSB0aGVtIHZpYSB0aGUgXFxgaTE4blxcYCB1dGlsaXR5IChlLmcuLCBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgKS5gXG4gICAgOiAnJ1xufVxuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIG92ZXIgXFxgdXNlU3RhdGVcXGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbi0gVXNlIFxcYGF1dG9Gb2N1c1xcYCB3aGVyZSBpdCByZWR1Y2VzIHVzZXIgZWZmb3J0LmBcbiAgICA6ICcnXG59XG4ke1xuICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIGN1cnJlbnQgd2ViLWFwcCBmcmFtZXdvcmsgYW5kIGVuYWJsZXMgdGhlIFJlYWN0IENvbXBpbGVyIGp1c3QgYXMgTmV4dC5qc1xuICAvLyBkb2VzLCBzbyBpdCBtdXN0IG5vdCBtaXNzIHRoaXMgcnVsZS5cbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/IGBcbi0gVGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCBzbyBcXGB1c2VDYWxsYmFja1xcYCBhbmQgXFxgdXNlTWVtb1xcYCBhcmUgdW5uZWNlc3NhcnkgZm9yIHBlcmZvcm1hbmNlLlxuYFxuICAgIDogJydcbn1cbiR7c2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KTtcbn1cbiIsIiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCByZWxlYXNlQWdlR2F0ZSBmcm9tICcuLi8uLi9jb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgICBnbG9iYWxTdG9yZT86IGJvb2xlYW47XG4gICAgbGlua2VyPzogc3RyaW5nO1xuICB9O1xufVxuXG4vLyBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gaXMgdGhlIG9yZ2FuaXphdGlvbidzIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBwb2xpY3k6IHRoZVxuLy8gbWFjaGluZXMnIGdsb2JhbCBjb25maWdzIGdldCBpdCB0aHJvdWdoIGNvbmZpZ3MvYXBwbHlSZWxlYXNlQWdlR2F0ZS5zaCAocnVuIGJ5IHdiZnkgaXRzZWxmLCBieVxuLy8gcmV1c2FibGUtd29ya2Zsb3dzIG9uIENJLCBhbmQgYnkgc2VsZi1ob3N0LXV0aWxzIG9uIHRoZSBydW5uZXJzKSwgYW5kIHJlcG9zaXRvcmllcyBnZXQgaXQgaGVyZS5cbi8vIE9ubHkgb3VyIG93biBwYWNrYWdlcyBhcmUgZXhlbXB0OiB3ZSBjb250cm9sIHdobyBwdWJsaXNoZXMgdGhlbSwgc28gYSBjb21wcm9taXNlZCByZWxlYXNlIGNhbm5vdFxuLy8gcmVhY2ggdXMgdGhyb3VnaCBhbiB1cHN0cmVhbSBtYWludGFpbmVyJ3Mgc3RvbGVuIGNyZWRlbnRpYWxzLiBUaGF0IGNvdmVycyBldmVyeVxuLy8gQHdpbGxib29zdGVyLXByaXZhdGUgcGFja2FnZSAodGhlIHNjb3BlIHJlc29sdmVzIG9ubHkgZnJvbSBvdXIgb3duIHJlZ2lzdHJ5KSwgYnV0IGJ1biwgbnBtLCBhbmRcbi8vIFlhcm4gbWF0Y2ggZXhjbHVkZSBlbnRyaWVzIGJ5IGV4YWN0IG5hbWUg4oCUIG5vIEBzY29wZS8qIHBhdHRlcm5zIOKAlCBzbyBlYWNoIG5ldyBwYWNrYWdlIGluIHRoZVxuLy8gc2NvcGUgbXVzdCBiZSBhZGRlZCB0byBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gd2hlbiBpdCBpcyBmaXJzdCBwdWJsaXNoZWQuIFRoaXJkLXBhcnR5XG4vLyBwYWNrYWdlcyDigJQgaW5jbHVkaW5nXG4vLyB0b29saW5nIHdiZnkgcGlucyBpdHNlbGYg4oCUIHN0YXkgYWdlLWdhdGVkOyBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uIGluIHBhY2thZ2VKc29uLnRzXG4vLyBwaW5zIHRoZSBuZXdlc3QgcmVsZWFzZSBvbGQgZW5vdWdoIHRvIHBhc3MgdGhlIGdhdGUsIHNvIHBpbm5pbmcga2VlcHMgd29ya2luZyB3aXRob3V0IGFuIGV4ZW1wdGlvbi5cbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgPSByZWxlYXNlQWdlR2F0ZS5kYXlzICogMjQgKiA2MCAqIDYwO1xuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSByZWxlYXNlQWdlR2F0ZS5leGNsdWRlcztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRCdW5HbG9iYWxTdG9yZShyb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHBhcnNlQnVuZmlnVG9tbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpPy5pbnN0YWxsPy5nbG9iYWxTdG9yZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5HbG9iYWxTdG9yZShcbiAgY29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBza2lwRGVwczogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSA9IHNob3VsZFVzZUJ1bkdsb2JhbFN0b3JlKGNvbmZpZ3MpO1xuICByZXR1cm4gc2tpcERlcHMgPyAocHJldmlvdXNHbG9iYWxTdG9yZSA/PyBkZWZhdWx0VXNlR2xvYmFsU3RvcmUpIDogZGVmYXVsdFVzZUdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIC8vIEJsaXR6IGJ1aWxkcyBvbiBOZXh0LmpzIGJ1dCBuZWVkIG5vdCBkZWNsYXJlIGl0IGRpcmVjdGx5LCBhbmQgaXRzIGNvZGVnZW4gYWxzbyBwYXRjaGVzIE5leHRcbiAgLy8gaW5zaWRlIG5vZGVfbW9kdWxlcy4gQm90aCBmcmFtZXdvcmtzIHRoZXJlZm9yZSByZXF1aXJlIHByb2plY3QtbG9jYWwgaXNvbGF0ZWQgaW5zdGFsbHMuXG4gIC8vIFNsaWRldiBsb2FkcyBvcHRpb25hbCBWdWUgY29tcGlsZXIgcGVlcnMgdGhyb3VnaCBsb2NhbC1wa2cuIFRoZSBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzXG4gIC8vIGxvY2FsLXBrZyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBzbyBOb2RlIGNhbm5vdCByZXNvbHZlIGEgY29tcGlsZXIgZGVjbGFyZWQgYnkgdGhlIHByb2plY3QuXG4gIHJldHVybiAhY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuc2xpZGV2KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcsIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIC8vIG1pbmltdW1SZWxlYXNlQWdlIGFuZCBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIGFyZSBvcmcgcG9saWN5LCBuZXZlciByZXBvc2l0b3J5IHBvbGljeTogYm90aFxuICAvLyBhcmUgcmV3cml0dGVuIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbidzIHZhbHVlcyBvbiBldmVyeSBydW4sIHNvIGEgaGFuZC1lZGl0ZWQgKHdlYWtlbmVkKVxuICAvLyBnYXRlIGNhbm5vdCBzdXJ2aXZlIHJlZ2VuZXJhdGlvbi4gRHJvcHBpbmcgcmVwb3NpdG9yeS1zcGVjaWZpYyBleGNsdWRlIGVudHJpZXMgaXMgZmFpbC1zYWZlIOKAlCBhblxuICAvLyB1bmNvdmVyZWQgcGFja2FnZSBiZWNvbWVzIGFnZS1nYXRlZCBhbmQgc3VyZmFjZXMgYXQgaW5zdGFsbCB0aW1lIGluc3RlYWQgb2Ygd2Vha2VuaW5nIHRoZSBnYXRlLlxuICAvLyBUdXJib3BhY2sgcmVqZWN0cyBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVjYXVzZSB0aGV5IHJlc29sdmUgb3V0c2lkZSBpdHMgZmlsZXN5c3RlbSByb290LlxuICAvLyBLZWVwaW5nIE5leHQuanMgaW5zdGFsbHMgcHJvamVjdC1sb2NhbCBhdm9pZHMgd2lkZW5pbmcgdGhhdCByb290IHRvICRIT01FIChvciBgL2AgaW4gRG9ja2VyKSxcbiAgLy8gd2hpY2ggd291bGQgZXhwYW5kIGRldmVsb3BtZW50IGZpbGVzeXN0ZW0gd2F0Y2hpbmcgYW5kIGJ5cGFzcyB0aGUgYm91bmRhcnkncyBjYWNoZSBiZW5lZml0cy5cbiAgY29uc3QgZ2xvYmFsU3RvcmVMaW5lID0gdXNlR2xvYmFsU3RvcmUgPyAnZ2xvYmFsU3RvcmUgPSB0cnVlJyA6ICdnbG9iYWxTdG9yZSA9IGZhbHNlJztcbiAgLy8gTm8gYFtydW5dIGJ1biA9IHRydWVgOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrc1xuICAvLyB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KTsgYW55IGV4aXN0aW5nIHNldHRpbmcgaXMgZHJvcHBlZC5cbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIOKAlCB0c3g6IGJ1aWxkLXRzIHVuZGVyIE5vZGUuanMgc3Bhd25zIGBub2RlIC0taW1wb3J0IHRzeGAsIHdoaWNoIHJlc29sdmVzXG4gIC8vIHRzeCBmcm9tIHRoZSBjb25zdW1lciBwYWNrYWdlJ3MgZGlyZWN0b3J5LCBub3QgZnJvbSBidWlsZC10cydzIG93biBkZXBlbmRlbmNpZXMuXG4gIC8vIHVuZGljaS10eXBlczogYnVuLXR5cGVzIHJlZmVyZW5jZXMgaXQgd2l0aG91dCBkZWNsYXJpbmcgaXQgYXMgYSBkZXBlbmRlbmN5IChvdmVuLXNoL2J1biMyMjgwNSk7XG4gIC8vIGdlbmVyYXRlZCB0c2NvbmZpZ3MgYWxzbyBtYXAgdW5kaWNpLXR5cGVzIHRvIHRoZSBob2lzdGVkIGNvcHkgKHNlZSB0c2NvbmZpZy50cykgYmVjYXVzZSB0aGVcbiAgLy8gZ2xvYmFsIHN0b3JlIHJlYWxwYXRocyBidW4tdHlwZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGV4aXN0aW5nQ29udGVudCl9W2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbiR7Z2xvYmFsU3RvcmVMaW5lfVxubGlua2VyID0gXCJpc29sYXRlZFwiXG5wdWJsaWNIb2lzdFBhdHRlcm4gPSBbXCJ0c3hcIiwgXCJ1bmRpY2ktdHlwZXNcIl1cbm1pbmltdW1SZWxlYXNlQWdlID0gJHtidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHN9XG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHtidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbi8qKlxuICogUHJlc2VydmUgdGhlIHByb2plY3QncyBgW3Rlc3RdYCBzZWN0aW9ucyAoZS5nLiBwcmVsb2FkIHNjcmlwdHMgc3dhcHBpbmcgYSBDbG91ZGZsYXJlIEQxIGNsaWVudFxuICogZm9yIGEgbG9jYWwgU1FMaXRlIG9uZSkgdmVyYmF0aW0sIGNvbW1lbnRzIGluY2x1ZGVkOyB3YmZ5IG1hbmFnZXMgb25seSB0aGUgb3RoZXIgc2VjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghY29udGVudCkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IHByZXNlcnZlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5UZXN0U2VjdGlvbiA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBzZWN0aW9uTWF0Y2ggPSAvXlxccypcXFsoW15cXF1dKylcXF0vLmV4ZWMobGluZSk7XG4gICAgaWYgKHNlY3Rpb25NYXRjaCkge1xuICAgICAgaW5UZXN0U2VjdGlvbiA9IHNlY3Rpb25NYXRjaFsxXSA9PT0gJ3Rlc3QnIHx8IChzZWN0aW9uTWF0Y2hbMV0gYXMgc3RyaW5nKS5zdGFydHNXaXRoKCd0ZXN0LicpO1xuICAgIH1cbiAgICBpZiAoaW5UZXN0U2VjdGlvbiAmJiBsaW5lLnRyaW0oKSkge1xuICAgICAgcHJlc2VydmVkTGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByZXNlcnZlZExpbmVzLmxlbmd0aCA+IDAgPyBgJHtwcmVzZXJ2ZWRMaW5lcy5qb2luKCdcXG4nKX1cXG5cXG5gIDogJyc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGUgZGVwbG95cyBHaXQtYmFzZWQgcHJpdmF0ZSBwYWNrYWdlcyBmcm9tIG5vZGVfbW9kdWxlcywgYnV0IHRoZSBEb2NrZXIgY29udGV4dCBzaG91bGQgc3RheSBuYXJyb3cuXG5jb25zdCBpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnMgPSBbJ0B3aWxsYm9vc3RlciddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuLmVudipcbioqLy5EU19TdG9yZVxuKiovLmNhY2hlXG4qKi8uY2xhdWRlXG4qKi8uY3Vyc29yXG4qKi8uZWRpdG9yY29uZmlnXG4qKi8uZXNsaW50Y2FjaGVcbioqLy5nZW1pbmlcbioqLy5naXRcbioqLy5naXRhdHRyaWJ1dGVzXG4qKi8uZ2l0aHViXG4qKi8uZ2l0aWdub3JlXG4qKi8uaWRlYVxuKiovLmxlZnRob29rXG4qKi8ubXlweV9jYWNoZVxuKiovLm5leHQvY2FjaGVcbioqLy5ucG1cbioqLy5wYXJjZWwtY2FjaGVcbioqLy5wbnBtLXN0b3JlXG4qKi8ucHl0ZXN0X2NhY2hlXG4qKi8ucmFpbHdheWlnbm9yZVxuKiovLnJlbGVhc2VyYy5qc29uXG4qKi8ucnVmZl9jYWNoZVxuKiovLnRtcFxuKiovLnRtcC0qLyoqXG4qKi8udHVyYm9cbioqLy50b3hcbioqLy52c2NvZGVcbioqLy55YXJuL2NhY2hlXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuKiovX19weWNhY2hlX19cbioqLyoubG9nXG4qKi8qLnB5Y1xuKiovKi50c2J1aWxkaW5mb1xuKiovY292ZXJhZ2VcbioqL25vZGVfbW9kdWxlcy8qKlxuJHtpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnNcbiAgLm1hcChcbiAgICAocGF0dGVybikgPT4gYCEqKi9ub2RlX21vZHVsZXMvJHtwYXR0ZXJufVxuISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59LyoqYFxuICApXG4gIC5qb2luKCdcXG4nKX1cbioqL25vZGVfbW9kdWxlcy8uY2FjaGVcbioqL3BsYXl3cmlnaHQtcmVwb3J0XG4qKi9zdG9yeWJvb2stc3RhdGljXG4qKi90YXJnZXRcbioqL3Rlc3QtcmVzdWx0c1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlLCByZWFkQWdlbnRzRXh0cmFDb250ZW50IH0gZnJvbSAnLi9hZ2VudHMuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnlhbWwnKTtcbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuXG4gICAgY29uc3QgaGFzTm9uQ2Fub25pY2FsQ29uZmlnID0gISEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQobm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KSk7XG4gICAgaWYgKGhhc05vbkNhbm9uaWNhbENvbmZpZykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgU2tpcHBlZCBnZW5lcmF0aW5nICR7Y29uZmlnRmlsZVBhdGh9IGJlY2F1c2UgJHtub25DYW5vbmljYWxDb25maWdGaWxlUGF0aH0gaXMgbm90IGEgc3VwcG9ydGVkIEdlbWluaSBjb25maWcgbG9jYXRpb24uIFJlbmFtZSBpdCBtYW51YWxseS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0Q29uZmlnKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gaGFzTm9uQ2Fub25pY2FsQ29uZmlnID8gdW5kZWZpbmVkIDogYXdhaXQgZnNVdGlsLnJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhjb25maWdGaWxlUGF0aCk7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb2xkQ29uZmlnID0gQnVuLllBTUwucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICAgIC8vIE1lcmdlIG9ubHkgYSBtYXBwaW5nOiBlbXB0eSwgY29tbWVudC1vbmx5LCBvciBzY2FsYXIgWUFNTCB3b3VsZCBlaXRoZXIgdGhyb3cgaW5cbiAgICAgICAgLy8gbWVyZ2UuYWxsIG9yIHBvbGx1dGUgdGhlIGNvbmZpZyB3aXRoIGluZGV4IGtleXMuXG4gICAgICAgIGlmIChvbGRDb25maWcgJiYgdHlwZW9mIG9sZENvbmZpZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2xkQ29uZmlnKSkge1xuICAgICAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBjYW4ndCBiZSBwYXJzZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IEJ1bi5ZQU1MLnN0cmluZ2lmeShuZXdDb25maWcsIHVuZGVmaW5lZCwgMik7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCByZWFkQWdlbnRzRXh0cmFDb250ZW50KGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50Py50cmltU3RhcnQoKS5zdGFydHNXaXRoKCcjJykgPyB1bmRlZmluZWQgOiBleHRyYUNvbnRlbnQ7XG4gICAgY29uc3QgcmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbiA9IGNvbmZpZy5pc1B1YmxpY1JlcG9cbiAgICAgID8gJ1JldmlldyBpbiBFbmdsaXNoIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy4nXG4gICAgICA6ICfku6XkuIvjga7jgrPjg7zjg4fjgqPjg7PjgrDopo/ntITjgpLouI/jgb7jgYjjgabjgIHml6XmnKzoqp7jgafjg6zjg5Pjg6Xjg7zjgZfjgabjgY/jgaDjgZXjgYTjgIInO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYCR7cmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbn1cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShjb25maWcsIGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIC4uLihoYXNOb25DYW5vbmljYWxDb25maWcgPyBbXSA6IFtwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKV0pLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpLFxuICAgIF07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGdpdE91dHB1dE1heEJ1ZmZlciA9IDY0ICogMTAyNCAqIDEwMjQ7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbi8vIGAuZ2l0aWdub3JlIC10ZXh0YCBrZWVwcyB0aGUgbWFjT1MgdGVtcGxhdGUncyBgSWNvblxcclxccmAgcnVsZSBpbnRhY3Q6IGB0ZXh0PWF1dG9gIG5vcm1hbGl6YXRpb25cbi8vIHN0cmlwcyBvbmUgQ1IgcGVyIGNoZWNraW4sIGRlZ3JhZGluZyB0aGUgcnVsZSB1bnRpbCBpdCBtYXRjaGVzIG5vdGhpbmcuXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbi5naXRpZ25vcmUgLXRleHRcblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMoZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGxldCBvdXRwdXQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBvdXRwdXQgPSBjaGlsZF9wcm9jZXNzLmV4ZWNGaWxlU3luYygnZ2l0JywgWydscy1maWxlcycsICctLWVvbCcsICcteiddLCB7XG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBnaXRPdXRwdXRNYXhCdWZmZXIsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHRyYWNrZWQgbGluZS1lbmRpbmcgcmVub3JtYWxpemF0aW9uOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHJlbm9ybWFsaXplZENvdW50ID0gMDtcbiAgZm9yIChjb25zdCByZWNvcmQgb2Ygb3V0cHV0LnNwbGl0KCdcXDAnKSkge1xuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gcmVjb3JkLmluZGV4T2YoJ1xcdCcpO1xuICAgIGlmIChzZXBhcmF0b3JJbmRleCA9PT0gLTEpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHJlY29yZC5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCk7XG4gICAgaWYgKCEvXmlcXC8oPzpjcmxmfG1peGVkKVxccy91LnRlc3QoYXR0cmlidXRlcykgfHwgIS9hdHRyXFwvLipcXGJlb2w9KD86bGZ8Y3JsZikoPzpcXHN8JCkvdS50ZXN0KGF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWNvcmQuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKTtcbiAgICBjb25zdCB0cmFja2VkRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCBzdGF0cyA9IGZzLmxzdGF0U3luYyh0cmFja2VkRmlsZVBhdGgsIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pO1xuICAgIGlmICghc3RhdHM/LmlzRmlsZSgpKSBjb250aW51ZTtcblxuICAgIC8vIEdpdCdzIHN0YXQgY2FjaGUgY2FuIGhpZGUgcHJlLWV4aXN0aW5nIENSTEYgYmxvYnMgYWZ0ZXIgd2JmeSBpbnRyb2R1Y2VzIHRleHQgYXR0cmlidXRlcy5cbiAgICAvLyBOb3JtYWxpemUgYnl0ZXMgaW4gdGhlIHdvcmt0cmVlIHNvIHRoZSBjYWxsZXIncyBub3JtYWwgYGdpdCBhZGQgLUFgIHJlY29yZHMgdGhlIGNhbm9uaWNhbFxuICAgIC8vIGJsb2I7IHRoaXMgYWxzbyBwcmV2ZW50cyBQcmV0dGllcidzIG1ldGFkYXRhIGNhY2hlIGZyb20gc2tpcHBpbmcgdGhlIG5ld2x5IGNoYW5nZWQgZmlsZS5cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0cmFja2VkRmlsZVBhdGgsIEJ1ZmZlci5mcm9tKGNvbnRlbnQudG9TdHJpbmcoJ2JpbmFyeScpLnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKSwgJ2JpbmFyeScpKTtcbiAgICByZW5vcm1hbGl6ZWRDb3VudCsrO1xuICB9XG4gIGlmIChyZW5vcm1hbGl6ZWRDb3VudCA+IDApIHtcbiAgICBjb25zb2xlLmluZm8oYFJlbm9ybWFsaXplZCBsaW5lIGVuZGluZ3MgaW4gJHtyZW5vcm1hbGl6ZWRDb3VudH0gdHJhY2tlZCBmaWxlKHMpLmApO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcywgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIERvIG5vdCByZW1vdmUgYHdpbmRvd3NgOiBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBmaWxlcyBtdXN0IGtlZXAgaWdub3JpbmcgV2luZG93cy1jcmVhdGVkIGxvY2FsIGFydGlmYWN0cy5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuX19nZW5lcmF0ZWRfXy9cbiEua2VlcFxuLmFpZGVyKlxuLmFudGlncmF2aXR5Y2xpL1xuLmNsYXVkZS8qLmxvY2FsLipcbi5jbGF1ZGUvc2NoZWR1bGVkX3Rhc2tzLmxvY2tcbi5kZXZjb250YWluZXIvXG4uZG9ja2VyLmVudlxuLmVudipcbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4ucGxheXdyaWdodC1tY3AvXG4uc2VyZW5hL1xuLnRtcC9cbi50bXAtKi9cbi50b2tlbnNhdmUvXG4ud2IvXG5Ad2lsbGJvb3N0ZXIvXG5Ad2lsbGJvb3N0ZXItcHJpdmF0ZS9cbiovbW91bnQvKi5oYXNoXG5DTEFVREUubG9jYWwubWRcbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICAvLyBFdmVyeSBhY2NlcHRlZCByZXBvc2l0b3J5IHJvb3QgcmVjZWl2ZXMgYSBtYW5hZ2VkIHBhY2thZ2UuanNvbiBsYXRlciBpbiB0aGUgc2FtZSBydW4sIHNvIGl0c1xuICAgIC8vIGRlcGVuZGVuY3kgdHJlZSBtdXN0IGJlIGlnbm9yZWQgZXZlbiB3aGVuIHRoZSBtYW5pZmVzdCBkaWQgbm90IGV4aXN0IGF0IGNvbmZpZy1kZXRlY3Rpb24gdGltZS5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHwgY29uZmlnLmlzUm9vdCkge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmUgZGV0ZWN0aW9uIChub3QganVzdCBhIHJvb3QgcG9tLnhtbCk6IGEgbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yeSBrZWVwcyBpdHMgTWF2ZW5cbiAgICAvLyBtb2R1bGVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmQgZHJvcHBpbmcgdGhlIG1hdmVuIHRlbXBsYXRlIHdvdWxkIGxldCB0YXJnZXQvIGdldCB0cmFja2VkLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnkuIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdFxuICAgIC8vIGxvY2tmaWxlKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIFB5dGhvbiBkaXJlY3RvcmllcyBpbiBzdWJkaXJlY3RvcmllcywgYW5kXG4gICAgLy8gZHJvcHBpbmcgdGhlIHB5dGhvbiB0ZW1wbGF0ZSB3b3VsZCBsZXQgX19weWNhY2hlX18vIGFuZCAudmVudi8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHwgY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydXN0Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZykge1xuICAgICAgLy8gIUNhcmdvLmxvY2sgb3ZlcnJpZGVzIGFueSBwcmUtZXhpc3RpbmcgdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgZnJvbSBhXG4gICAgICAvLyBwYXJlbnQgLmdpdGlnbm9yZSwgc28gdGhlIGFwcGxpY2F0aW9uIGxvY2tmaWxlIHN0YXlzIGNvbW1pdHRhYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAhQ2FyZ28ubG9ja1xuc3JjLXRhdXJpL2dlbi9zY2hlbWFzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNDbG91ZGZsYXJlIHx8IHJvb3RDb25maWcuaXNDbG91ZGZsYXJlKSB7XG4gICAgICAvLyAuZGV2LnZhcnMqIGhvbGQgbG9jYWwgc2VjcmV0cyBmb3Igd3JhbmdsZXIgZGV2IGFuZCBtdXN0IG5ldmVyIGJlIGNvbW1pdHRlZC5cbiAgICAgIC8vIC5lbnYuY2xvdWRmbGFyZSBjYXJyaWVzIENMT1VERkxBUkVfQVBJX1RPS0VOOiBDSSB3cml0ZXMgaXQgZnJvbSBhIHNlY3JldCwgYW5kIGEgbG9jYWxcbiAgICAgIC8vIGB3YiBkZXBsb3lgIG5lZWRzIGEgcmVhbCB0b2tlbiBpbiBpdCwgc28gY29tbWl0dGluZyBpdCB3b3VsZCBsZWFrIGFjY291bnQgY3JlZGVudGlhbHMuXG4gICAgICAvLyBJdCBpcyBsaXN0ZWQgZXhwbGljaXRseSBzbyB0aGUgQ2xvdWRmbGFyZS1zcGVjaWZpYyBjcmVkZW50aWFsIHBvbGljeSByZW1haW5zIHZpc2libGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5kZXYudmFycypcbi5lbnYuY2xvdWRmbGFyZVxuLndyYW5nbGVyL1xuYDtcbiAgICB9XG4gICAgLy8gSWdub3JlZCBvbmx5IHdoZXJlIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0LCBzbyB3YmZ5IG5ldmVyIGlnbm9yZXMgYSBmaWxlIHRoYXQgbm90aGluZyByZWNyZWF0ZXMuIFRoaXMga2VlcHNcbiAgICAvLyBpdHMgdGhvdXNhbmRzIG9mIGxpbmVzIG91dCBvZiBldmVyeSB3cmFuZ2xlciBidW1wJ3MgZGlmZi4gQW5jaG9yZWQgd2l0aCBhIGxlYWRpbmcgc2xhc2ggYmVjYXVzZSBgd3JhbmdsZXIgdHlwZXNgXG4gICAgLy8gYW5kIHRoZSBvcHQtb3V0IGRlbGV0aW9uIGJlbG93IG9ubHkgZXZlciB0b3VjaCB0aGlzIHBhY2thZ2UncyBvd24gZmlsZSwgbm90IGEgbmVzdGVkIG9uZSBhdCBhbnkgZGVwdGguXG4gICAgaWYgKGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyAmJiAhY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICAvLyBPbiBhIGdlbnVpbmUgd29ya2VyLXR5cGVzIG9wdC1vdXQgKG5vdGhpbmcgY29uc3VtZXMgdGhlIGdlbmVyYXRlZCBmaWxlOyBnZW5lcmF0ZXNXb3JrZXJUeXBlc1xuICAgICAgLy8gYWxvbmUgaXMgZmFsc2UgZm9yIHVucmVsYXRlZCByZWFzb25zIHN1Y2ggYXMgYSBtaXNzaW5nIGxvY2FsIHdyYW5nbGVyIGRlcGVuZGVuY3ksIHdoZXJlIHRoZVxuICAgICAgLy8gZmlsZSBtYXkgc3RpbGwgYmUgY29uc3VtZWQpIHRoZSBpZ25vcmUgcnVsZVxuICAgICAgLy8gYWJvdmUgZGlzYXBwZWFycywgc28gYW4gYWxyZWFkeS1nZW5lcmF0ZWQgZmlsZSB3b3VsZCBzdXJmYWNlIGFzIHVudHJhY2tlZCBub2lzZSBvbiBldmVyeVxuICAgICAgLy8gY2hlY2tvdXQg4oCUIGRlbGV0ZSBpdC4gTm8gcmVwb3NpdG9yeSB0cmFja3MgdGhlIGZpbGUgKGRvY3MvZXhwZWN0ZWQtcmVwb3NpdG9yeS1ydWxlcy5tZCksXG4gICAgICAvLyBzbyBhbiBleGlzdGluZyBjb3B5IGlzIGFsd2F5cyBhIGRpc3Bvc2FibGUgZ2VuZXJhdGVkIG9uZS5cbiAgICAgIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtlclR5cGVzUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHdvcmtlclR5cGVzUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZpbmV4dC9cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sQW55d2hlcmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAgIC8vIFRoZSBydXN0IHRlbXBsYXRlJ3MgdW5hbmNob3JlZCBkZWJ1Zy8gd291bGQgYWxzbyBoaWRlIGZyb250ZW5kIHNvdXJjZVxuICAgICAgLy8gZGlyZWN0b3JpZXMgc3VjaCBhcyBzcmMvZGVidWcvOyBjYXJnbyBvdXRwdXQgaXMgYWxyZWFkeSBjb3ZlcmVkIGJ5IHRhcmdldC8uXG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXmRlYnVnXFwvJC9nbSwgJyMgZGVidWcvJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fCBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXMpIHtcbiAgICAgIC8vIFRoZSBydXN0IHRlbXBsYXRlIGlnbm9yZXMgQ2FyZ28ubG9jaywgYnV0IGEgc3JjLXRhdXJpIGNvbmZpZ3VyYXRpb24gbWFya3MgYW5cbiAgICAgIC8vIGFwcGxpY2F0aW9uLCB3aG9zZSBDYXJnby5sb2NrIG11c3QgYmUgY29tbWl0dGVkIGZvciByZXByb2R1Y2libGUgYnVpbGRzLiBUaGVcbiAgICAgIC8vIHJ1bGUgaXMgYWxzbyBkaXNhYmxlZCB3aGVuIGEgc3ViIHBhY2thZ2UgY29udGFpbnMgYSBUYXVyaSBhcHBsaWNhdGlvbiwgYmVjYXVzZVxuICAgICAgLy8gYW4gdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgaW4gYSBwYXJlbnQgLmdpdGlnbm9yZSB3b3VsZCBoaWRlIHRoZSBuZXN0ZWRcbiAgICAgIC8vIGFwcGxpY2F0aW9uJ3MgbG9ja2ZpbGUuIFRhdXJpIHBsdWdpbiBsaWJyYXJpZXMgKGRldGVjdGVkIG9ubHkgdmlhXG4gICAgICAvLyBAdGF1cmktYXBwcy8qIGRlcGVuZGVuY2llcykga2VlcCB0aGUgdGVtcGxhdGUncyBwb2xpY3kgb2YgaWdub3JpbmcgQ2FyZ28ubG9jay5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eQ2FyZ29cXC5sb2NrJC9nbSwgJyMgQ2FyZ28ubG9jaycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbi8qKlxuICogVGhlIHZlcnNpb24gd2JmeSdzIG93biBwYWNrYWdlLmpzb24gY2FycmllcyBpbiB0aGUgcmVwb3NpdG9yeS4gYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgcmV3cml0ZXNcbiAqIGl0IGluIHRoZSBwdWJsaXNoZWQgdGFyYmFsbCBvbmx5IChpdCBpcyBuZXZlciBjb21taXR0ZWQgYmFjayksIHNvIGEgd2JmeSBydW4gc3RhcnRlZCBmcm9tIGEgZ2l0XG4gKiBjaGVja291dCByZXBvcnRzIHRoaXMgcGxhY2Vob2xkZXIgaW5zdGVhZCBvZiBhIHJlYWwgdmVyc2lvbi5cbiAqL1xuY29uc3QgdW5yZWxlYXNlZFZlcnNpb25QcmVmaXggPSAnMC4wLjAtJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlWZXJzaW9uKCk6IHN0cmluZyB7XG4gIHJldHVybiByZWFkV2JmeVBhY2thZ2VKc29uKCkudmVyc2lvbjtcbn1cblxuLyoqIHdiZnkncyBsb2NhdGlvbiBpbnNpZGUgaXRzIG93biByZXBvc2l0b3J5LCByZWxhdGl2ZSB0byB0aGUgcmVwb3NpdG9yeSByb290LiAqL1xuY29uc3Qgd2JmeURpclBhdGhJblJlcG8gPSBwYXRoLmpvaW4oJ3BhY2thZ2VzJywgJ3diZnknKTtcblxuLyoqXG4gKiBJZGVudGlmaWVzIHRoZSB3YmZ5IGJ1aWxkIHRoYXQgcHJvZHVjZWQgdGhlIGdlbmVyYXRlZCBmaWxlczogdGhlIHJlbGVhc2VkIHZlcnNpb24sIG9yXG4gKiBgPHNob3J0IGNvbW1pdCBoYXNoPlstZGlydHldLWxvY2FsYCB3aGVuIHdiZnkgcnVucyBmcm9tIGl0cyBvd24gZ2l0IGNoZWNrb3V0LiBVbmRlZmluZWQgd2hlblxuICogbmVpdGhlciBpcyBhdmFpbGFibGUgKGUuZy4gYW4gdW5yZWxlYXNlZCBidWlsZCBleHRyYWN0ZWQgZnJvbSBhIHNvdXJjZSBhcmNoaXZlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlWZXJzaW9uTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gTmVpdGhlciB0aGUgaW5zdGFsbGVkIHBhY2thZ2UuanNvbiBub3IgdGhlIGdpdCBzdGF0ZSBvZiB3YmZ5J3Mgb3duIGNoZWNrb3V0IGNhbiBjaGFuZ2VcbiAgLy8gbWlkLXJ1biwgYW5kIGNvbXB1dGluZyB0aGUgbGFiZWwgc3Bhd25zIHNldmVyYWwgZ2l0IHN1YnByb2Nlc3Nlcywgc28gaXQgaXMgY29tcHV0ZWQgb25jZS5cbiAgaWYgKCFoYXNDb21wdXRlZFZlcnNpb25MYWJlbCkge1xuICAgIGNhY2hlZFZlcnNpb25MYWJlbCA9IGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk7XG4gICAgaGFzQ29tcHV0ZWRWZXJzaW9uTGFiZWwgPSB0cnVlO1xuICB9XG4gIHJldHVybiBjYWNoZWRWZXJzaW9uTGFiZWw7XG59XG5cbmxldCBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IGZhbHNlO1xubGV0IGNhY2hlZFZlcnNpb25MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBjb21wdXRlV2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IG5hbWUsIHZlcnNpb24sIGRpclBhdGggfSA9IHJlYWRXYmZ5UGFja2FnZUpzb24oKTtcbiAgaWYgKCF2ZXJzaW9uLnN0YXJ0c1dpdGgodW5yZWxlYXNlZFZlcnNpb25QcmVmaXgpKSByZXR1cm4gdmVyc2lvbjtcblxuICAvLyBnaXQgcmVzb2x2ZXMgdGhlIE5FQVJFU1QgZW5jbG9zaW5nIHJlcG9zaXRvcnksIHdoaWNoIGZvciBhbiB1bnJlbGVhc2VkIGJ1aWxkIHBsYWNlZCB1bmRlciBhXG4gIC8vIHRhcmdldCByZXBvc2l0b3J5IChub2RlX21vZHVsZXMsIG9yIGEgdmVuZG9yZWQvZXh0cmFjdGVkIHNvdXJjZSB0cmVlKSBpcyB0aGF0IHJlcG9zaXRvcnkg4oCUIGl0c1xuICAvLyBjb21taXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSB3YmZ5IGJ1aWxkIHRoYXQgcmFuLiBPbmx5IHdiZnkncyBvd24gbG9jYXRpb24gaW5zaWRlIGl0cyBvd25cbiAgLy8gcmVwb3NpdG9yeSBpZGVudGlmaWVzIGEgZ2VudWluZSBjaGVja291dCwgc28gYW55dGhpbmcgZWxzZSBmYWxscyBiYWNrIHRvIHRoZSB2ZXJzaW9uLWxlc3MgbGFiZWwuXG4gIGNvbnN0IGdpdFJvb3REaXJQYXRoID0gcnVuR2l0KFsncmV2LXBhcnNlJywgJy0tc2hvdy10b3BsZXZlbCddLCBkaXJQYXRoKTtcbiAgaWYgKFxuICAgICFnaXRSb290RGlyUGF0aCB8fFxuICAgIHBhdGgucmVsYXRpdmUoZ2l0Um9vdERpclBhdGgsIGRpclBhdGgpICE9PSB3YmZ5RGlyUGF0aEluUmVwbyB8fFxuICAgICFpc1diZnlSZXBvc2l0b3J5KGdpdFJvb3REaXJQYXRoKVxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG9ydD04JywgJ0hFQUQnXSwgZGlyUGF0aCk7XG4gIGlmICghY29tbWl0SGFzaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gVGhlIGNvbW1pdCBhbG9uZSB3b3VsZCBtaXNpZGVudGlmeSBhIGJ1aWxkIG1hZGUgZnJvbSBhbiBlZGl0ZWQgY2hlY2tvdXQsIHNvIHVuY29tbWl0dGVkIGNoYW5nZXNcbiAgLy8gYXJlIHJlcG9ydGVkIHRvbyDigJQgYnV0IG9ubHkgdW5kZXIgcGFja2FnZXMvKi9zcmMsIHBhY2thZ2VzLyovYmluIGFuZCBwYWNrYWdlcy8qL2NvbmZpZ3MsIHRoZVxuICAvLyBzb3VyY2UsIGVudHJ5LXBvaW50IHdyYXBwZXIgYW5kIHBvbGljeSBmaWxlcyB3YmZ5IGFuZCBpdHMgd29ya3NwYWNlIGRlcGVuZGVuY2llcyBhY3R1YWxseSBydW5cbiAgLy8gZnJvbS4gRXZlcnl0aGluZyB3YmZ5IEdFTkVSQVRFUyB3aGVuIGl0IHRhcmdldHMgaXRzIG93biByZXBvc2l0b3J5IGxpdmVzIG91dHNpZGUgdGhvc2UgKHRoZVxuICAvLyByb290IFJFQURNRSB0aGlzIGxhYmVsIGdvZXMgaW50bywgYW5kIGVhY2ggcGFja2FnZSdzIC5naXRpZ25vcmUsIHBhY2thZ2UuanNvbiwgdHNjb25maWcsIOKApiksIHNvXG4gIC8vIGEgZmlyc3QgcnVuIGNhbm5vdCBtYWtlIHRoZSBuZXh0IG9uZSByZWxhYmVsIHRoZSBiYWRnZSBgLWRpcnR5LWxvY2FsYCBieSBpdHNlbGYuXG4gIC8vIE1hbmlmZXN0cyBzdGF5IG91dCBvbiBwdXJwb3NlLCBldmVuIHRob3VnaCBhbiBlZGl0ZWQgYGV4cG9ydHNgIG1hcCBjYW4gcmVkaXJlY3Qgd2hpY2ggY29kZVxuICAvLyBsb2Fkczogd2JmeSBHRU5FUkFURVMgcGFja2FnZS5qc29uLCBzbyBpbmNsdWRpbmcgaXQgd291bGQgbWFrZSBldmVyeSBydW4gcmVwb3J0IGl0c2VsZiBkaXJ0eS5cbiAgLy8gVGhlIGxhYmVsIGlzIGJlc3QtZWZmb3J0IGJ1aWxkIHByb3ZlbmFuY2UsIG5vdCBhIHJlcHJvZHVjaWJsZS1idWlsZCBhdHRlc3RhdGlvbi5cbiAgY29uc3QgaXNEaXJ0eSA9IGdldEdpdERpcnR5U3RhdGUoZ2l0Um9vdERpclBhdGgpO1xuICBpZiAoaXNEaXJ0eSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoaXNEaXJ0eSkgcmV0dXJuIGAke2NvbW1pdEhhc2h9LWRpcnR5LWxvY2FsYDtcbiAgLy8gQW4gdW5tb2RpZmllZCBjaGVja291dCBzaXR0aW5nIG9uIGEgcmVsZWFzZSB0YWcgcnVucyBleGFjdGx5IHRoZSBjb2RlIHRoYXQgd2FzIHB1Ymxpc2hlZCB1bmRlclxuICAvLyB0aGF0IHZlcnNpb24sIHNvIGl0IGlzIGxhYmVsZWQgd2l0aCB0aGUgdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBjb21taXQgdGhhdCBvbmx5IHdiZnkgZGV2ZWxvcGVyc1xuICAvLyBjb3VsZCByZXNvbHZlIGJhY2sgdG8gb25lLlxuICByZXR1cm4gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChuYW1lLCBkaXJQYXRoKSA/PyBgJHtjb21taXRIYXNofS1sb2NhbGA7XG59XG5cbi8qKiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCB0YWdzIGVhY2ggcmVsZWFzZSBgPHBhY2thZ2UgbmFtZT5APHZlcnNpb24+YC4gKi9cbmZ1bmN0aW9uIGZpbmRSZWxlYXNlZFZlcnNpb25BdEhlYWQocGFja2FnZU5hbWU6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YWdQcmVmaXggPSBgJHtwYWNrYWdlTmFtZX1AYDtcbiAgLy8gQSBjb21taXQgY2FycmllcyBhdCBtb3N0IG9uZSByZWxlYXNlIHRhZyBwZXIgcGFja2FnZSwgc28gdGhlIGZpcnN0IG1hdGNoIGlzIHRoZSBvbmx5IG1hdGNoLlxuICByZXR1cm4gcnVuR2l0KFsndGFnJywgJy0tcG9pbnRzLWF0JywgJ0hFQUQnXSwgY3dkKVxuICAgID8uc3BsaXQoJ1xcbicpXG4gICAgLmZpbmQoKHRhZykgPT4gdGFnLnN0YXJ0c1dpdGgodGFnUHJlZml4KSlcbiAgICA/LnNsaWNlKHRhZ1ByZWZpeC5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBpc1diZnlSZXBvc2l0b3J5KGdpdFJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gRXZlcnkgcmVtb3RlIGNvdW50cywgbm90IGp1c3QgYG9yaWdpbmA6IGEgZm9yayBjaGVja291dCBjYXJyaWVzIHRoZSBjYW5vbmljYWwgcmVwb3NpdG9yeSBhc1xuICAvLyBgdXBzdHJlYW1gLCBhbmQgaXQgaXMgc3RpbGwgYSBnZW51aW5lIHdiZnkgY2hlY2tvdXQgd2hvc2UgY29tbWl0IGlkZW50aWZpZXMgdGhlIGJ1aWxkLlxuICBjb25zdCByZW1vdGVVcmxzID0gcnVuR2l0KFsncmVtb3RlJywgJy12J10sIGdpdFJvb3REaXJQYXRoKTtcbiAgcmV0dXJuICEhcmVtb3RlVXJscz8uc3BsaXQoJ1xcbicpLnNvbWUoKGxpbmUpID0+IGlzQ2Fub25pY2FsUmVtb3RlVXJsKGxpbmUuc3BsaXQoL1sgXFx0XSsvdSlbMV0gPz8gJycpKTtcbn1cblxuY29uc3QgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGggPSAvXlxcLz9XaWxsQm9vc3RlclxcL3NoYXJlZCg/OlxcLmdpdCk/JC9pdTtcblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZW1vdGUgVVJMIHBvaW50cyBhdCB3YmZ5J3Mgb3duIHJlcG9zaXRvcnkuIFRoZSBob3N0IGlzIGNvbXBhcmVkIGFmdGVyIFBBUlNJTkcgcmF0aGVyXG4gKiB0aGFuIG1hdGNoZWQgaW5zaWRlIHRoZSBzdHJpbmc6IGFueSBwYXR0ZXJuIGxvb3NlIGVub3VnaCB0byBhY2NlcHQgZXZlcnkgVVJMIGZvcm0gZ2l0IHN1cHBvcnRzXG4gKiBhbHNvIGFjY2VwdGVkIGEgbG9va2FsaWtlIHRoYXQgbWVyZWx5IGNvbnRhaW5zIHRoZSBob3N0LCBzdWNoIGFzXG4gKiBgaHR0cHM6Ly9ldmlsLmV4YW1wbGUvL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkLmdpdGAsIGxldHRpbmcgYW4gdW5yZWxhdGVkIGNoZWNrb3V0IGNsYWltIHRvXG4gKiBiZSBhIGdlbnVpbmUgd2JmeSBidWlsZC5cbiAqL1xuZnVuY3Rpb24gaXNDYW5vbmljYWxSZW1vdGVVcmwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gc2NwLXN0eWxlIChgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXIvc2hhcmVkLmdpdGApIGlzIG5vdCBhIFVSTCwgc28gaXQgaXMgbWF0Y2hlZCBzZXBhcmF0ZWx5LlxuICAvLyBUaGUgbG9va2FoZWFkIGtlZXBzIGEgc2NoZW1lJ3MgYDovL2AgZnJvbSBiZWluZyByZWFkIGFzIHRoZSBgaG9zdDpwYXRoYCBzZXBhcmF0b3IuXG4gIGNvbnN0IHNjcE1hdGNoID0gL14oPzpbXkAvXStAKT8oW14vOl0rKTooPyFcXC8pKC4qKSQvdS5leGVjKHVybCk7XG4gIGlmIChzY3BNYXRjaCkge1xuICAgIHJldHVybiBzY3BNYXRjaFsxXSEudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3Qoc2NwTWF0Y2hbMl0hKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBhdGhuYW1lIH0gPSBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIGhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJyAmJiBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aC50ZXN0KHBhdGhuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEdpdERpcnR5U3RhdGUoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgJ2dpdCcsXG4gICAgW1xuICAgICAgJ3N0YXR1cycsXG4gICAgICAnLS1wb3JjZWxhaW4nLFxuICAgICAgJy0tdW50cmFja2VkLWZpbGVzPWFsbCcsXG4gICAgICAnLS0nLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9Lyovc3JjLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2Jpbi8qKmAsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9jb25maWdzLyoqYCxcbiAgICBdLFxuICAgIHsgY3dkOiBnaXRSb290RGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9XG4gICk7XG4gIHJldHVybiBwcm9jLnN0YXR1cyA9PT0gMCA/ICEhcHJvYy5zdGRvdXQudHJpbSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBydW5HaXQoYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBhcmdzLCB7IGN3ZCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9KTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gcHJvYy5zdGRvdXQudHJpbSgpIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFdiZnlQYWNrYWdlSnNvbjogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbi8qKiBSZXR1cm5zIHdiZnkncyBvd24gcGFja2FnZSBkaXJlY3RvcnksIHdoaWNoIGFsc28gaG9sZHMgaXRzIGNvbmZpZ3MgKGUuZy4gcmVsZWFzZUFnZUdhdGUuanNvbikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeURpclBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS5kaXJQYXRoO1xufVxuXG5mdW5jdGlvbiByZWFkV2JmeVBhY2thZ2VKc29uKCk6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGRpclBhdGg6IHN0cmluZyB9IHtcbiAgaWYgKGNhY2hlZFdiZnlQYWNrYWdlSnNvbikgcmV0dXJuIGNhY2hlZFdiZnlQYWNrYWdlSnNvbjtcbiAgLy8gZmlsZVVSTFRvUGF0aCwgbm90IFVSTC5wYXRobmFtZTogdGhlIGxhdHRlciBrZWVwcyBwZXJjZW50LWVuY29kaW5nLCBzbyBhbiBpbnN0YWxsYXRpb24gcGF0aFxuICAvLyBjb250YWluaW5nIGUuZy4gYSBzcGFjZSB3b3VsZCByZXNvbHZlIHRvIGEgbm9uZXhpc3RlbnQgZGlyZWN0b3J5IGFuZCB0aGUgc2VhcmNoIHdvdWxkIHdhbGsgdXBcbiAgLy8gdG8gYW4gdW5yZWxhdGVkIHBhY2thZ2UuXG4gIGxldCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gICAgLy8gcGF0aC5kaXJuYW1lKCcvJykgPT09ICcvJywgc28gdGhlIHNlYXJjaCBtdXN0IHN0b3AgZXhwbGljaXRseSBhdCB0aGUgZmlsZXN5c3RlbSByb290LlxuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSB0aHJvdyBuZXcgRXJyb3IoXCJ3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBpcyBtaXNzaW5nLlwiKTtcbiAgICBkaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICBjYWNoZWRXYmZ5UGFja2FnZUpzb24gPSB7IG5hbWU6IHBhY2thZ2VKc29uLm5hbWUsIHZlcnNpb246IHBhY2thZ2VKc29uLnZlcnNpb24sIGRpclBhdGggfTtcbiAgcmV0dXJuIGNhY2hlZFdiZnlQYWNrYWdlSnNvbjtcbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnZXRXYmZ5RGlyUGF0aCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIEdMT0JBTFxuICogcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuIFJlcG9zaXRvcnkgY29uZmlncyBndWFyZCBvbmx5IHdiZmllZCByZXBvc2l0b3JpZXM7IGEgYnJhbmQtbmV3IGxvY2FsXG4gKiBwcm9qZWN0IGhhcyBubyBidW5maWcudG9tbCB5ZXQsIHNvIHRoZSBnbG9iYWwgZmlsZXMgYXJlIHRoZSBvbmx5IGdhdGUgYmV0d2VlbiBgYnVuIGNyZWF0ZWAgL1xuICogYG5wbSBpbml0YCBhbmQgYSBmcmVzaGx5IGNvbXByb21pc2VkIHJlbGVhc2UuIFRoZSBzYW1lIHNjcmlwdCBydW5zIG9uIENJIGFuZCBvbiB0aGUgc2VsZi1ob3N0ZWRcbiAqIHJ1bm5lcnMsIHNvIGV2ZXJ5IG1hY2hpbmUgZW5kcyB1cCB3aXRoIGJ5dGUtaWRlbnRpY2FsIHNldHRpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk6IGJvb2xlYW4ge1xuICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKCdiYXNoJywgW3BhdGguam9pbihnZXRXYmZ5RGlyUGF0aCgpLCAnY29uZmlncycsICdhcHBseVJlbGVhc2VBZ2VHYXRlLnNoJyldLCB7XG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGlmIChzdGF0dXMgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFwcGx5IHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGUgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzLicpO1xuICByZXR1cm4gZmFsc2U7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSnNPclRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YSB8fCBjb25maWcuZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gS2VlcCBwYWNrYWdlLW1hbmFnZXIgc2hpbXMgaW4gdGhlIEZpbGUgV2F0Y2hlciBwcm9ncmFtIGZpZWxkIHNvIG5vZGUgZG9lcyBub3Rcbi8vIHBhcnNlIHdyYXBwZXIgc2NyaXB0cyBwYXNzZWQgdGhyb3VnaCBhcmd1bWVudHMuXG5jb25zdCBveGZtdFByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9veGZtdCc7XG5jb25zdCBwcmV0dGllclByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnKSkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB0YXNrT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBhcmdzOiAnLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICEqKi9wYWNrYWdlLmpzb24nLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5veGZtdCxcbiAgICAgIG5hbWU6ICdPeGZtdCcsXG4gICAgICBwcm9ncmFtOiBveGZtdFByb2dyYW0sXG4gICAgfSxcbiAgICB7XG4gICAgICBhcmdzOiAnLS1jYWNoZSAtLXdyaXRlJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLnByZXR0aWVyT25seSxcbiAgICAgIG5hbWU6ICdQcmV0dGllcicsXG4gICAgICBwcm9ncmFtOiBwcmV0dGllclByb2dyYW0sXG4gICAgfSxcbiAgXVxuICAgIC5maWx0ZXIoKHRhc2spID0+IHRhc2suY29uZGl0aW9uKVxuICAgIC5mbGF0TWFwKCh0YXNrKSA9PiB0YXNrLmV4dGVuc2lvbnMubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKHRhc2sucHJvZ3JhbSwgdGFzay5hcmdzLCB0YXNrLm5hbWUsIGV4dCkpKTtcblxuICByZXR1cm4gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuICAgICR7dGFza09wdGlvbnMuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5JMThuVHNDb21tYW5kKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RlcGVuZGluZyc+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAnYnVuIHJ1biBnZW4taTE4bi10cyA+IC9kZXYvbnVsbCc7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCIiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Y29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcblx0cmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsdWUpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgc29ydE9iamVjdEtleXMgZnJvbSAnc29ydC1vYmplY3Qta2V5cydcbmltcG9ydCBkZXRlY3RJbmRlbnQgZnJvbSAnZGV0ZWN0LWluZGVudCdcbmltcG9ydCB7IGRldGVjdE5ld2xpbmVHcmFjZWZ1bCBhcyBkZXRlY3ROZXdsaW5lIH0gZnJvbSAnZGV0ZWN0LW5ld2xpbmUnXG5pbXBvcnQgZ2l0SG9va3MgZnJvbSAnZ2l0LWhvb2tzLWxpc3QnXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICdpcy1wbGFpbi1vYmonXG5pbXBvcnQgc2VtdmVyQ29tcGFyZSBmcm9tICdzZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUuanMnXG5pbXBvcnQgc2VtdmVyTWluVmVyc2lvbiBmcm9tICdzZW12ZXIvcmFuZ2VzL21pbi12ZXJzaW9uLmpzJ1xuXG5jb25zdCBwaXBlID1cbiAgKGZucykgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnJlZHVjZSgocmVzdWx0LCBmbikgPT4gZm4ocmVzdWx0LCAuLi5hcmdzKSwgeClcbmNvbnN0IG9uQXJyYXkgPSAoZm4pID0+ICh4KSA9PiAoQXJyYXkuaXNBcnJheSh4KSA/IGZuKHgpIDogeClcbmNvbnN0IG9uU3RyaW5nQXJyYXkgPSAoZm4pID0+ICh4KSA9PlxuICBBcnJheS5pc0FycmF5KHgpICYmIHguZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgPyBmbih4KSA6IHhcbmNvbnN0IHVuaXEgPSBvblN0cmluZ0FycmF5KCh4cykgPT4gWy4uLm5ldyBTZXQoeHMpXSlcbmNvbnN0IHNvcnRBcnJheSA9IG9uU3RyaW5nQXJyYXkoKGFycmF5KSA9PiBhcnJheS50b1NvcnRlZCgpKVxuY29uc3QgdW5pcUFuZFNvcnRBcnJheSA9IHBpcGUoW3VuaXEsIHNvcnRBcnJheV0pXG5jb25zdCBvbk9iamVjdCA9XG4gIChmbikgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgaXNQbGFpbk9iamVjdCh4KSA/IGZuKHgsIC4uLmFyZ3MpIDogeFxuY29uc3Qgc29ydE9iamVjdEJ5ID0gKGNvbXBhcmF0b3IsIGRlZXApID0+IHtcbiAgY29uc3Qgb3ZlciA9IG9uT2JqZWN0KChvYmplY3QpID0+IHtcbiAgICBpZiAoZGVlcCkge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBvdmVyKHZhbHVlKV0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhvYmplY3QsIGNvbXBhcmF0b3IpXG4gIH0pXG5cbiAgcmV0dXJuIG92ZXJcbn1cbmNvbnN0IHNvcnRPYmplY3QgPSBzb3J0T2JqZWN0QnkoKVxuY29uc3Qgc29ydFVSTE9iamVjdCA9IHNvcnRPYmplY3RCeShbJ3R5cGUnLCAndXJsJ10pXG5jb25zdCBzb3J0UGVvcGxlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnbmFtZScsICdlbWFpbCcsICd1cmwnXSlcbmNvbnN0IHNvcnREaXJlY3RvcmllcyA9IHNvcnRPYmplY3RCeShbXG4gICdsaWInLFxuICAnYmluJyxcbiAgJ21hbicsXG4gICdkb2MnLFxuICAnZXhhbXBsZScsXG4gICd0ZXN0Jyxcbl0pXG5jb25zdCBvdmVyUHJvcGVydHkgPSAocHJvcGVydHksIG92ZXIpID0+XG4gIG9uT2JqZWN0KChvYmplY3QsIC4uLmFyZ3MpID0+XG4gICAgT2JqZWN0Lmhhc093bihvYmplY3QsIHByb3BlcnR5KVxuICAgICAgPyB7IC4uLm9iamVjdCwgW3Byb3BlcnR5XTogb3ZlcihvYmplY3RbcHJvcGVydHldLCAuLi5hcmdzKSB9XG4gICAgICA6IG9iamVjdCxcbiAgKVxuY29uc3Qgc29ydEdpdEhvb2tzID0gc29ydE9iamVjdEJ5KGdpdEhvb2tzKVxuXG5jb25zdCBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UgPSAoc3BlY2lmaWVyKSA9PiB7XG4gIC8vIElnbm9yZSBhbnl0aGluZyBhZnRlciA+ICYgcmVseSBvbiBmYWxsYmFjayBhbHBoYW51bWVyaWMgc29ydGluZyBmb3IgdGhhdFxuICBjb25zdCBbbmFtZUFuZFZlcnNpb25dID0gc3BlY2lmaWVyLnNwbGl0KCc+JylcbiAgY29uc3QgYXRNYXRjaGVzID0gWy4uLm5hbWVBbmRWZXJzaW9uLm1hdGNoQWxsKCdAJyldXG4gIGlmIChcbiAgICAhYXRNYXRjaGVzLmxlbmd0aCB8fFxuICAgIChhdE1hdGNoZXMubGVuZ3RoID09PSAxICYmIGF0TWF0Y2hlc1swXS5pbmRleCA9PT0gMClcbiAgKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogc3BlY2lmaWVyIH1cbiAgfVxuICBjb25zdCBzcGxpdEluZGV4ID0gYXRNYXRjaGVzLnBvcCgpLmluZGV4XG4gIHJldHVybiB7XG4gICAgbmFtZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKDAsIHNwbGl0SW5kZXgpLFxuICAgIHJhbmdlOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoc3BsaXRJbmRleCArIDEpLFxuICB9XG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeVNlbXZlciA9IHNvcnRPYmplY3RCeSgoYSwgYikgPT4ge1xuICBjb25zdCB7IG5hbWU6IGFOYW1lLCByYW5nZTogYVJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYSlcbiAgY29uc3QgeyBuYW1lOiBiTmFtZSwgcmFuZ2U6IGJSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGIpXG5cbiAgaWYgKGFOYW1lICE9PSBiTmFtZSkge1xuICAgIHJldHVybiBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lLCAnZW4nKVxuICB9XG4gIGlmICghYVJhbmdlKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKCFiUmFuZ2UpIHtcbiAgICByZXR1cm4gMVxuICB9XG4gIHJldHVybiBzZW12ZXJDb21wYXJlKHNlbXZlck1pblZlcnNpb24oYVJhbmdlKSwgc2VtdmVyTWluVmVyc2lvbihiUmFuZ2UpKVxufSlcblxuY29uc3QgZ2V0UGFja2FnZU5hbWUgPSAoaWRlbnQpID0+IHtcbiAgY29uc3QgaW5kZXggPSBpZGVudC5pbmRleE9mKCdAJywgaWRlbnQuc3RhcnRzV2l0aCgnQCcpID8gMSA6IDApXG4gIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHVubGVzcyB1c2VyIG1hbnVhbGx5IGVkaXQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gIHJldHVybiBpbmRleCA9PT0gLTEgPyBpZGVudCA6IGlkZW50LnNsaWNlKDAsIGluZGV4KVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlJZGVudCA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lQSA9IGdldFBhY2thZ2VOYW1lKGEpXG4gIGNvbnN0IHBhY2thZ2VOYW1lQiA9IGdldFBhY2thZ2VOYW1lKGIpXG5cbiAgaWYgKHBhY2thZ2VOYW1lQSA8IHBhY2thZ2VOYW1lQikgcmV0dXJuIC0xXG4gIGlmIChwYWNrYWdlTmFtZUEgPiBwYWNrYWdlTmFtZUIpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIENhY2hlIGJ5IGBwcm9jZXNzLmN3ZCgpYCBpbnN0ZWFkIG9mIGEgdmFyaWFibGUgdG8gYWxsb3cgdXNlciBjYWxsIGBwcm9jZXNzLmNoZGlyKClgXG5jb25zdCBjYWNoZSA9IG5ldyBNYXAoKVxuY29uc3QgaGFzWWFybk9yUG5wbUZpbGVzID0gKCkgPT4ge1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4gIGlmICghY2FjaGUuaGFzKGN3ZCkpIHtcbiAgICBjYWNoZS5zZXQoXG4gICAgICBjd2QsXG4gICAgICBmcy5leGlzdHNTeW5jKCd5YXJuLmxvY2snKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybi8nKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybnJjLnltbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0tbG9jay55YW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS13b3Jrc3BhY2UueWFtbCcpLFxuICAgIClcbiAgfVxuICByZXR1cm4gY2FjaGUuZ2V0KGN3ZClcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBwYWNrYWdlIG1hbmFnZXIgZnJvbSBwYWNrYWdlLmpzb24gYW5kIGxvY2sgZmlsZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlSnNvbiAtIFRoZSBwYXJzZWQgcGFja2FnZS5qc29uIG9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVGhlIGRldGVjdGVkIHBhY2thZ2UgbWFuYWdlci4gRGVmYXVsdCB0byBucG0gaWYgbm90IGRldGVjdGVkLlxuICovXG5mdW5jdGlvbiBzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL2NvcmVwYWNrXG4gIGlmICh0eXBlb2YgcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ25wbUAnKVxuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLmRldkVuZ2luZXM/LnBhY2thZ2VNYW5hZ2VyPy5uYW1lKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLmRldkVuZ2luZXMucGFja2FnZU1hbmFnZXIubmFtZSA9PT0gJ25wbSdcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5wbnBtKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBPcHRpbWlzYXRpb246IENoZWNrIGlmIG5wbSBpcyBleHBsaWNpdCBiZWZvcmUgcmVhZGluZyBGUy5cbiAgaWYgKHBhY2thZ2VKc29uLmVuZ2luZXM/Lm5wbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoaGFzWWFybk9yUG5wbUZpbGVzKCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogU29ydCBkZXBlbmRlbmNpZXMgYWxwaGFiZXRpY2FsbHksIGRldGVjdGluZyBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlIHRoZVxuICogYXBwcm9wcmlhdGUgY29tcGFyaXNvbi4gbnBtIHVzZXMgbG9jYWxlLWF3YXJlIGNvbXBhcmlzb24sIHlhcm4gYW5kIHBucG0gdXNlXG4gKiBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb25cbiAqL1xuY29uc3Qgc29ydERlcGVuZGVuY2llcyA9IG9uT2JqZWN0KChkZXBlbmRlbmNpZXMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIC8vIEF2b2lkIGZpbGUgYWNjZXNzXG4gIGlmIChPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzXG4gIH1cblxuICAvLyBzb3J0IGRlcHMgbGlrZSB0aGUgbnBtIENMSSBkb2VzICh2aWEgdGhlIHBhY2thZ2UgQG5wbWNsaS9wYWNrYWdlLWpzb24pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vcGFja2FnZS1qc29uL2Jsb2IvYjY0NjVmNDRjNzI3ZDY1MTNkYjY4OThjN2NiZTQxZGQzNTVjZWJlOC9saWIvdXBkYXRlLWRlcGVuZGVuY2llcy5qcyNMOC1MMjFcbiAgaWYgKHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSkge1xuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMsIChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYiwgJ2VuJykpXG4gIH1cblxuICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzKVxufSlcblxuLyoqXG4gKiBcIndvcmtzcGFjZXNcIiBjYW4gYmUgYW4gYXJyYXkgKG5wbSBvciB5YXJuIGNsYXNzaWMpIG9yIGFuIG9iamVjdCAocG5wbS9idW4pLlxuICogSW4gdGhlIGNhc2Ugb2YgYW4gYXJyYXksIHdlIGRvIG5vdCB3YW50IHRvIGFscGhhYmV0aWNhbGx5IHNvcnQgaXQgaW4gY2FzZVxuICogc2NyaXB0cyBuZWVkIHRvIHJ1biBpbiBhIHNwZWNpZmljIG9yZGVyLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjcvdXNpbmctbnBtL3dvcmtzcGFjZXM/dj10cnVlI3J1bm5pbmctY29tbWFuZHMtaW4tdGhlLWNvbnRleHQtb2Ytd29ya3NwYWNlc1xuICovXG5jb25zdCBzb3J0V29ya3NwYWNlcyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoWydwYWNrYWdlcycsICdjYXRhbG9nJ10pLFxuICBvdmVyUHJvcGVydHkoJ3BhY2thZ2VzJywgdW5pcUFuZFNvcnRBcnJheSksXG4gIG92ZXJQcm9wZXJ0eSgnY2F0YWxvZycsIHNvcnREZXBlbmRlbmNpZXMpLFxuXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi9hY2MwZTQ3NTcyYTkzOTAyOTJiNGUzMTNiNGE0YmYzNjBkMjM2MzU4L2NvbmYvY29uZmlnLXNjaGVtYS5qc1xuY29uc3QgZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gIC8vIGBmaWxlc2AgYW5kIGBleGNsdWRlZEZpbGVzYCBhcmUgb25seSBvbiBgb3ZlcnJpZGVzW11gXG4gIC8vIGZvciBlYXNpZXIgc29ydCBgb3ZlcnJpZGVzW11gLFxuICAvLyBhZGQgdGhlbSB0byBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHNvcnQgYG92ZXJyaWRlc1tdYCB0d2ljZVxuICAnZmlsZXMnLFxuICAnZXhjbHVkZWRGaWxlcycsXG4gIC8vIGJhc2VDb25maWdcbiAgJ2VudicsXG4gICdwYXJzZXInLFxuICAncGFyc2VyT3B0aW9ucycsXG4gICdzZXR0aW5ncycsXG4gICdwbHVnaW5zJyxcbiAgJ2V4dGVuZHMnLFxuICAncnVsZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ2dsb2JhbHMnLFxuICAncHJvY2Vzc29yJyxcbiAgJ25vSW5saW5lQ29uZmlnJyxcbiAgJ3JlcG9ydFVudXNlZERpc2FibGVEaXJlY3RpdmVzJyxcbl1cbmNvbnN0IHNvcnRFc2xpbnRDb25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KCdlbnYnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KCdnbG9iYWxzJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+IG92ZXJyaWRlcy5tYXAoc29ydEVzbGludENvbmZpZykpLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3BhcnNlck9wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdydWxlcycsXG4gICAgc29ydE9iamVjdEJ5KFxuICAgICAgKHJ1bGUxLCBydWxlMikgPT5cbiAgICAgICAgcnVsZTEuc3BsaXQoJy8nKS5sZW5ndGggLSBydWxlMi5zcGxpdCgnLycpLmxlbmd0aCB8fFxuICAgICAgICBydWxlMS5sb2NhbGVDb21wYXJlKHJ1bGUyKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3NldHRpbmdzJywgc29ydE9iamVjdCksXG5dKVxuY29uc3Qgc29ydFZTQ29kZUJhZGdlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnZGVzY3JpcHRpb24nLCAndXJsJywgJ2hyZWYnXSlcblxuY29uc3Qgc29ydFByZXR0aWVyQ29uZmlnID0gcGlwZShbXG4gIC8vIHNvcnQga2V5cyBhbHBoYWJldGljYWxseSwgYnV0IHB1dCBgb3ZlcnJpZGVzYCBhdCBib3R0b21cbiAgb25PYmplY3QoKGNvbmZpZykgPT5cbiAgICBzb3J0T2JqZWN0S2V5cyhjb25maWcsIFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKGNvbmZpZylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdvdmVycmlkZXMnKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgJ292ZXJyaWRlcycsXG4gICAgXSksXG4gICksXG4gIC8vIGlmIGBjb25maWcub3ZlcnJpZGVzYCBleGlzdHNcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIC8vIGFuZCBgY29uZmlnLm92ZXJyaWRlc2AgaXMgYW4gYXJyYXlcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+XG4gICAgICBvdmVycmlkZXMubWFwKFxuICAgICAgICBwaXBlKFtcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW11gIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgc29ydE9iamVjdCxcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW10ub3B0aW9uc2AgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBvdmVyUHJvcGVydHkoJ29wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICksXG4gICksXG5dKVxuXG5jb25zdCBzb3J0Vm9sdGEgPSBzb3J0T2JqZWN0QnkoWydub2RlJywgJ25wbScsICd5YXJuJ10pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvd2lyZWl0XG5jb25zdCB3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzID0gWydjb21tYW5kJywgJ2RlcGVuZGVuY2llcycsICdmaWxlcycsICdvdXRwdXQnXVxuY29uc3Qgc29ydFdpcmVpdFNjcmlwdCA9IHBpcGUoW1xuICBzb3J0T2JqZWN0Qnkod2lyZWl0U2NyaXB0UHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICBvbkFycmF5KChkZXBzKSA9PiBkZXBzLm1hcChzb3J0T2JqZWN0QnkoWydzY3JpcHQnLCAnY2FzY2FkZSddKSkpLFxuICApLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ2VudicsXG4gICAgb25PYmplY3QoKGVudikgPT5cbiAgICAgIHNvcnRPYmplY3RLZXlzKFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoZW52KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgc29ydE9iamVjdEJ5KFsnZXh0ZXJuYWwnLCAnZGVmYXVsdCddKSh2YWx1ZSksXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnc2VydmljZScsXG4gICAgcGlwZShbc29ydE9iamVjdEJ5KFsncmVhZHlXaGVuJ10pLCBvdmVyUHJvcGVydHkoJ3JlYWR5V2hlbicsIHNvcnRPYmplY3QpXSksXG4gICksXG5dKVxuY29uc3Qgc29ydFdpcmVpdCA9IG9uT2JqZWN0KCh3aXJlaXQpID0+XG4gIHNvcnRPYmplY3RLZXlzKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHdpcmVpdCkubWFwKChbbmFtZSwgY29uZmlnXSkgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICBzb3J0V2lyZWl0U2NyaXB0KGNvbmZpZyksXG4gICAgICBdKSxcbiAgICApLFxuICApLFxuKVxuY29uc3Qgc29ydERldkVuZ2luZXMgPSBvdmVyUHJvcGVydHkoXG4gICdwYWNrYWdlTWFuYWdlcicsXG4gIHNvcnRPYmplY3RCeShbJ25hbWUnLCAndmVyc2lvbicsICdvbkZhaWwnXSksXG4pXG5cbmNvbnN0IHBucG1CYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgJ3BlZXJEZXBlbmRlbmN5UnVsZXMnLFxuICAnbmV2ZXJCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzRmlsZScsXG4gICdhbGxvd2VkRGVwcmVjYXRlZFZlcnNpb25zJyxcbiAgJ2FsbG93Tm9uQXBwbGllZFBhdGNoZXMnLFxuICAndXBkYXRlQ29uZmlnJyxcbiAgJ2F1ZGl0Q29uZmlnJyxcbiAgJ3JlcXVpcmVkU2NyaXB0cycsXG4gICdzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdwYXRjaGVkRGVwZW5kZW5jaWVzJyxcbiAgJ3BhY2thZ2VFeHRlbnNpb25zJyxcbl1cblxuY29uc3Qgc29ydFBucG1Db25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHBucG1CYXNlQ29uZmlnUHJvcGVydGllcywgdHJ1ZSksXG4gIG92ZXJQcm9wZXJ0eSgnb3ZlcnJpZGVzJywgc29ydE9iamVjdEJ5U2VtdmVyKSxcbl0pXG5cbi8vIFNlZSBodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2NyaXB0c1xuY29uc3QgZGVmYXVsdE5wbVNjcmlwdHMgPSBuZXcgU2V0KFtcbiAgJ2luc3RhbGwnLFxuICAncGFjaycsXG4gICdwcmVwYXJlJyxcbiAgJ3B1Ymxpc2gnLFxuICAncmVzdGFydCcsXG4gICdzaHJpbmt3cmFwJyxcbiAgJ3N0YXJ0JyxcbiAgJ3N0b3AnLFxuICAndGVzdCcsXG4gICd1bmluc3RhbGwnLFxuICAndmVyc2lvbicsXG5dKVxuXG5jb25zdCBoYXNEZXZEZXBlbmRlbmN5ID0gKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uKSA9PiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2RldkRlcGVuZGVuY2llcycpICYmXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpXG4gIClcbn1cblxuY29uc3QgcnVuU1JlZ0V4cCA9XG4gIC8oPzw9XnxbXFxzJjs8PnwoXSkoPzpydW4tc3xucG0tcnVuLWFsbDI/IC4qKD86LS1zZXF1ZW50aWFsfC0tc2VyaWFsfC1zKSkoPz0kfFtcXHMmOzw+fCldKS9cblxuY29uc3QgaXNTZXF1ZW50aWFsU2NyaXB0ID0gKGNvbW1hbmQpID0+XG4gIGNvbW1hbmQuaW5jbHVkZXMoJyonKSAmJiBydW5TUmVnRXhwLnRlc3QoY29tbWFuZClcblxuY29uc3QgaGFzU2VxdWVudGlhbFNjcmlwdCA9IChwYWNrYWdlSnNvbikgPT4ge1xuICBpZiAoXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsJywgcGFja2FnZUpzb24pICYmXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsMicsIHBhY2thZ2VKc29uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBzY3JpcHRzID0gWydzY3JpcHRzJywgJ2JldHRlclNjcmlwdHMnXS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICBwYWNrYWdlSnNvbltmaWVsZF0gPyBPYmplY3QudmFsdWVzKHBhY2thZ2VKc29uW2ZpZWxkXSkgOiBbXSxcbiAgKVxuICByZXR1cm4gc2NyaXB0cy5zb21lKChzY3JpcHQpID0+IGlzU2VxdWVudGlhbFNjcmlwdChzY3JpcHQpKVxufVxuXG5mdW5jdGlvbiBzb3J0U2NyaXB0TmFtZXMoa2V5cywgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwKClcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSBwcmVmaXggPyBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCArIDEpIDoga2V5XG4gICAgY29uc3QgaWR4ID0gcmVzdC5pbmRleE9mKCc6JylcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IGtleS5zbGljZSgwLCAocHJlZml4ID8gcHJlZml4Lmxlbmd0aCArIDEgOiAwKSArIGlkeClcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGJhc2UpKSBncm91cE1hcC5zZXQoYmFzZSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoYmFzZSkucHVzaChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGtleSkpIGdyb3VwTWFwLnNldChrZXksIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGtleSkucHVzaChrZXkpXG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKGdyb3VwTWFwLmtleXMoKSlcbiAgICAuc29ydCgpXG4gICAgLmZsYXRNYXAoKGdyb3VwS2V5KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdyb3VwTWFwLmdldChncm91cEtleSlcbiAgICAgIGlmIChcbiAgICAgICAgY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBjaGlsZHJlbi5zb21lKChrKSA9PiBrICE9PSBncm91cEtleSAmJiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdCA9IGNoaWxkcmVuXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gayA9PT0gZ3JvdXBLZXkgfHwgIWsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICBjb25zdCBuZXN0ZWQgPSBjaGlsZHJlbi5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgIHJldHVybiBbLi4uZGlyZWN0LCAuLi5zb3J0U2NyaXB0TmFtZXMobmVzdGVkLCBncm91cEtleSldXG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc29ydCgpXG4gICAgfSlcbn1cblxuY29uc3Qgc29ydFNjcmlwdHMgPSBvbk9iamVjdCgoc2NyaXB0cywgcGFja2FnZUpzb24pID0+IHtcbiAgbGV0IG5hbWVzID0gT2JqZWN0LmtleXMoc2NyaXB0cylcbiAgY29uc3QgcHJlZml4YWJsZSA9IG5ldyBTZXQoKVxuXG4gIG5hbWVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgY29uc3Qgb21pdHRlZCA9IG5hbWUucmVwbGFjZSgvXig/OnByZXxwb3N0KS8sICcnKVxuICAgIGlmIChkZWZhdWx0TnBtU2NyaXB0cy5oYXMob21pdHRlZCkgfHwgbmFtZXMuaW5jbHVkZXMob21pdHRlZCkpIHtcbiAgICAgIHByZWZpeGFibGUuYWRkKG9taXR0ZWQpXG4gICAgICByZXR1cm4gb21pdHRlZFxuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICB9KVxuXG4gIGlmICghaGFzU2VxdWVudGlhbFNjcmlwdChwYWNrYWdlSnNvbikpIHtcbiAgICBuYW1lcyA9IHNvcnRTY3JpcHROYW1lcyhuYW1lcylcbiAgfVxuICBuYW1lcyA9IG5hbWVzLmZsYXRNYXAoKGtleSkgPT5cbiAgICBwcmVmaXhhYmxlLmhhcyhrZXkpID8gW2BwcmUke2tleX1gLCBrZXksIGBwb3N0JHtrZXl9YF0gOiBba2V5XSxcbiAgKVxuICByZXR1cm4gc29ydE9iamVjdEtleXMoc2NyaXB0cywgbmFtZXMpXG59KVxuXG4vKlxuLSBNb3ZlIGBkZWZhdWx0YCBjb25kaXRpb24gdG8gYm90dG9tXG4qL1xuY29uc3Qgc29ydENvbmRpdGlvbnMgPSAoY29uZGl0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25kaXRpb25zID0gW10sIHJlc3RDb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICBPYmplY3Qua2V5cyhleHBvcnRzKSxcbiAgICAoa2V5KSA9PiAoa2V5LnN0YXJ0c1dpdGgoJy4nKSA/ICdwYXRocycgOiAnY29uZGl0aW9ucycpLFxuICApXG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4ucGF0aHMsIC4uLnNvcnRDb25kaXRpb25zKGNvbmRpdGlvbnMpXS5tYXAoKGtleSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgc29ydEV4cG9ydHMoZXhwb3J0c1trZXldKSxcbiAgICBdKSxcbiAgKVxufSlcblxuLy8gZmllbGRzIG1hcmtlZCBgdnNjb2RlYCBhcmUgZm9yIGBWaXN1YWwgU3R1ZGlvIENvZGUgZXh0ZW5zaW9uIG1hbmlmZXN0YCBvbmx5XG4vLyBodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS9hcGkvcmVmZXJlbmNlcy9leHRlbnNpb24tbWFuaWZlc3Rcbi8vIFN1cHBvcnRlZCBmaWVsZHM6XG4vLyBwdWJsaXNoZXIsIGRpc3BsYXlOYW1lLCBjYXRlZ29yaWVzLCBnYWxsZXJ5QmFubmVyLCBwcmV2aWV3LCBjb250cmlidXRlcyxcbi8vIGFjdGl2YXRpb25FdmVudHMsIGJhZGdlcywgbWFya2Rvd24sIHFuYSwgZXh0ZW5zaW9uUGFjayxcbi8vIGV4dGVuc2lvbkRlcGVuZGVuY2llcywgaWNvblxuXG4vLyBmaWVsZC5rZXl7c3RyaW5nfTogZmllbGQgbmFtZVxuLy8gZmllbGQub3ZlcntmdW5jdGlvbn06IHNvcnQgZmllbGQgc3ViS2V5XG5jb25zdCBmaWVsZHMgPSBbXG4gIHsga2V5OiAnJHNjaGVtYScgfSxcbiAgeyBrZXk6ICduYW1lJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdkaXNwbGF5TmFtZScgfSxcbiAgeyBrZXk6ICd2ZXJzaW9uJyB9LFxuICAvKiB5YXJuICovIHsga2V5OiAnc3RhYmxlVmVyc2lvbicgfSxcbiAgeyBrZXk6ICdwcml2YXRlJyB9LFxuICB7IGtleTogJ2Rlc2NyaXB0aW9uJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjYXRlZ29yaWVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2tleXdvcmRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2hvbWVwYWdlJyB9LFxuICB7IGtleTogJ2J1Z3MnLCBvdmVyOiBzb3J0T2JqZWN0QnkoWyd1cmwnLCAnZW1haWwnXSkgfSxcbiAgeyBrZXk6ICdyZXBvc2l0b3J5Jywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2Z1bmRpbmcnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnbGljZW5zZScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncW5hJyB9LFxuICB7IGtleTogJ2F1dGhvcicsIG92ZXI6IHNvcnRQZW9wbGVPYmplY3QgfSxcbiAge1xuICAgIGtleTogJ21haW50YWluZXJzJyxcbiAgICBvdmVyOiBvbkFycmF5KChtYWludGFpbmVycykgPT4gbWFpbnRhaW5lcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbnRyaWJ1dG9ycycsXG4gICAgb3Zlcjogb25BcnJheSgoY29udHJpYnV0b3JzKSA9PiBjb250cmlidXRvcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHVibGlzaGVyJyB9LFxuICB7IGtleTogJ3NpZGVFZmZlY3RzJyB9LFxuICB7IGtleTogJ3R5cGUnIH0sXG4gIHsga2V5OiAnaW1wb3J0cycgfSxcbiAgeyBrZXk6ICdleHBvcnRzJywgb3Zlcjogc29ydEV4cG9ydHMgfSxcbiAgeyBrZXk6ICdtYWluJyB9LFxuICB7IGtleTogJ3N2ZWx0ZScgfSxcbiAgeyBrZXk6ICd1bWQ6bWFpbicgfSxcbiAgeyBrZXk6ICdqc2RlbGl2cicgfSxcbiAgeyBrZXk6ICd1bnBrZycgfSxcbiAgeyBrZXk6ICdtb2R1bGUnIH0sXG4gIHsga2V5OiAnc291cmNlJyB9LFxuICB7IGtleTogJ2pzbmV4dDptYWluJyB9LFxuICB7IGtleTogJ2Jyb3dzZXInIH0sXG4gIHsga2V5OiAncmVhY3QtbmF0aXZlJyB9LFxuICB7IGtleTogJ3R5cGVzJyB9LFxuICB7IGtleTogJ3R5cGVzVmVyc2lvbnMnIH0sXG4gIHsga2V5OiAndHlwaW5ncycgfSxcbiAgeyBrZXk6ICdzdHlsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGVzdHlsZScgfSxcbiAgeyBrZXk6ICdhc3NldHMnIH0sXG4gIHsga2V5OiAnYmluJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21hbicgfSxcbiAgeyBrZXk6ICdkaXJlY3RvcmllcycsIG92ZXI6IHNvcnREaXJlY3RvcmllcyB9LFxuICB7IGtleTogJ2ZpbGVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ3dvcmtzcGFjZXMnLCBvdmVyOiBzb3J0V29ya3NwYWNlcyB9LFxuICAvLyBub2RlLXByZS1neXAgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvbm9kZS1wcmUtZ3lwIzEtYWRkLW5ldy1lbnRyaWVzLXRvLXlvdXItcGFja2FnZWpzb25cbiAge1xuICAgIGtleTogJ2JpbmFyeScsXG4gICAgb3Zlcjogc29ydE9iamVjdEJ5KFtcbiAgICAgICdtb2R1bGVfbmFtZScsXG4gICAgICAnbW9kdWxlX3BhdGgnLFxuICAgICAgJ3JlbW90ZV9wYXRoJyxcbiAgICAgICdwYWNrYWdlX25hbWUnLFxuICAgICAgJ2hvc3QnLFxuICAgIF0pLFxuICB9LFxuICB7IGtleTogJ3NjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ2JldHRlclNjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ3dpcmVpdCcsIG92ZXI6IHNvcnRXaXJlaXQgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbDEwbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY29udHJpYnV0ZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2FjdGl2YXRpb25FdmVudHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaHVza3knLCBvdmVyOiBvdmVyUHJvcGVydHkoJ2hvb2tzJywgc29ydEdpdEhvb2tzKSB9LFxuICB7IGtleTogJ3NpbXBsZS1naXQtaG9va3MnLCBvdmVyOiBzb3J0R2l0SG9va3MgfSxcbiAgeyBrZXk6ICdwcmUtY29tbWl0JyB9LFxuICB7IGtleTogJ2NvbW1pdGxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbGludC1zdGFnZWQnIH0sXG4gIHsga2V5OiAnbmFuby1zdGFnZWQnIH0sXG4gIHsga2V5OiAnY29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25vZGVtb25Db25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcmlmeScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdiYWJlbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2Vyc2xpc3QnIH0sXG4gIHsga2V5OiAneG8nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHJldHRpZXInLCBvdmVyOiBzb3J0UHJldHRpZXJDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRDb25maWcnLCBvdmVyOiBzb3J0RXNsaW50Q29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50SWdub3JlJyB9LFxuICB7IGtleTogJ25wbXBrZ2pzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbVBhY2thZ2VKc29uTGludENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1wYWNrYWdlanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVsZWFzZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZW1hcmtDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnc3R5bGVsaW50JyB9LFxuICB7IGtleTogJ2F2YScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QtanVuaXQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1zdGFyZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtb2NoYScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdueWMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYzgnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAndGFwJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ29jbGlmJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdyZXNvbHV0aW9ucycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvdmVycmlkZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RldkRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHNvcnRPYmplY3RCeUlkZW50LCB0cnVlKSB9LFxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIC8vIFRPRE86IG9ubHkgc29ydCBkZXB0aCA9IDJcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnYnVuZGxlZERlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdidW5kbGVEZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvblBhY2snLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvbkRlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdmbGF0JyB9LFxuICB7IGtleTogJ3BhY2thZ2VNYW5hZ2VyJyB9LFxuICB7IGtleTogJ2VuZ2luZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZW5naW5lU3RyaWN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2RldkVuZ2luZXMnLCBvdmVyOiBzb3J0RGV2RW5naW5lcyB9LFxuICB7IGtleTogJ3ZvbHRhJywgb3Zlcjogc29ydFZvbHRhIH0sXG4gIHsga2V5OiAnbGFuZ3VhZ2VOYW1lJyB9LFxuICB7IGtleTogJ29zJyB9LFxuICB7IGtleTogJ2NwdScgfSxcbiAgeyBrZXk6ICdwcmVmZXJHbG9iYWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHVibGlzaENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnaWNvbicgfSxcbiAgLyogdnNjb2RlICovIHtcbiAgICBrZXk6ICdiYWRnZXMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGJhZGdlKSA9PiBiYWRnZS5tYXAoc29ydFZTQ29kZUJhZGdlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2dhbGxlcnlCYW5uZXInLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3ByZXZpZXcnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ21hcmtkb3duJyB9LFxuICB7IGtleTogJ3BucG0nLCBvdmVyOiBzb3J0UG5wbUNvbmZpZyB9LFxuXVxuXG5jb25zdCBkZWZhdWx0U29ydE9yZGVyID0gZmllbGRzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KVxuY29uc3Qgb3ZlckZpZWxkcyA9IHBpcGUoXG4gIGZpZWxkc1xuICAgIC5tYXAoKHsga2V5LCBvdmVyIH0pID0+IChvdmVyID8gb3ZlclByb3BlcnR5KGtleSwgb3ZlcikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pXG5cbmZ1bmN0aW9uIGVkaXRTdHJpbmdKU09OKGpzb24sIG92ZXIpIHtcbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHsgaW5kZW50LCB0eXBlIH0gPSBkZXRlY3RJbmRlbnQoanNvbilcbiAgICBjb25zdCBlbmRDaGFyYWN0ZXJzID0ganNvbi5zbGljZSgtMSkgPT09ICdcXG4nID8gJ1xcbicgOiAnJ1xuICAgIGNvbnN0IG5ld2xpbmUgPSBkZXRlY3ROZXdsaW5lKGpzb24pXG4gICAganNvbiA9IEpTT04ucGFyc2UoanNvbilcblxuICAgIGxldCByZXN1bHQgPVxuICAgICAgSlNPTi5zdHJpbmdpZnkob3Zlcihqc29uKSwgbnVsbCwgdHlwZSA9PT0gJ3RhYicgPyAnXFx0JyA6IGluZGVudCkgK1xuICAgICAgZW5kQ2hhcmFjdGVyc1xuICAgIGlmIChuZXdsaW5lID09PSAnXFxyXFxuJykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcbi9nLCBuZXdsaW5lKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gb3Zlcihqc29uKVxufVxuXG5mdW5jdGlvbiBzb3J0UGFja2FnZUpzb24oanNvbklzaCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBlZGl0U3RyaW5nSlNPTihcbiAgICBqc29uSXNoLFxuICAgIG9uT2JqZWN0KChqc29uKSA9PiB7XG4gICAgICBsZXQgc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXIgfHwgZGVmYXVsdFNvcnRPcmRlclxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0T3JkZXIpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uKVxuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXlzID0gW10sIHB1YmxpY0tleXMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gW1xuICAnQHRzY29uZmlnL2J1bicsXG4gICdAdHNjb25maWcvbm9kZS1sdHMnLFxuICAnQHRzY29uZmlnL25vZGUtdHMnLFxuICAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZScsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgLy8gUmVhY3QgTmF0aXZlIG5lZWRzIE1ldHJvLWNvbXBhdGlibGUgc2V0dGluZ3MgKGpzeDogcmVhY3QtbmF0aXZlLCBub2RlIHJlc29sdXRpb24pLCB3aGljaFxuICAvLyBAdHNjb25maWcvYnVuIHdvdWxkIG92ZXJyaWRlIGV2ZW4gdGhvdWdoIHRoZSByZXBvIHVzZXMgQnVuIGFzIGl0cyBwYWNrYWdlIG1hbmFnZXIuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiAnQHRzY29uZmlnL2J1bi90c2NvbmZpZy5qc29uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnXTtcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtb2R1bGUgc3BlY2lmaWVyIGEgZ2VuZXJhdGVkIGNvbmZpZyBmaWxlIHNob3VsZCB1c2UgdG8gbG9hZCBhXG4gKiB3aWxsYm9vc3Rlci1jb25maWdzIGNvbmZpZyBwYWNrYWdlIHN1Y2ggYXMgYEB3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnYC5cbiAqXG4gKiBPdXRzaWRlIHdpbGxib29zdGVyLWNvbmZpZ3MgdGhpcyBpcyBzaW1wbHkgdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIG5hbWUuIEluc2lkZVxuICogd2lsbGJvb3N0ZXItY29uZmlncyB0aGUgcGFja2FnZSBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBhIGRlcGVuZGVuY3k6IHRoZVxuICogY29uZmlnIHBhY2thZ2VzIGltcG9ydCBvbmUgYW5vdGhlciAoZS5nLiBveGZtdC1jb25maWcncyBveGxpbnQuY29uZmlnLnRzXG4gKiBpbXBvcnRzIG94bGludC1jb25maWcgYW5kIHZpY2UgdmVyc2EpLCBzbyBhIGRlY2xhcmVkIGVkZ2Ugd291bGQgZm9ybSBhXG4gKiBkZXBlbmRlbmN5IGN5Y2xlIHRoYXQgbXVsdGktc2VtYW50aWMtcmVsZWFzZSBjYW5ub3QgdG9wb2xvZ2ljYWxseSBzb3J0LiBTaW5jZVxuICogdGhlIGVkZ2UgaXMgYWJzZW50LCBpc29sYXRlZCBpbnN0YWxscyBjYW5ub3QgcmVzb2x2ZSB0aGUgYmFyZSBwYWNrYWdlIG5hbWUsIHNvXG4gKiBpbXBvcnQgdGhlIGNvbW1pdHRlZCBgY29uZmlnLm1qc2AgYnVpbGQgb3V0cHV0IHRocm91Z2ggYSByZWxhdGl2ZSBwYXRoIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBjb25maWdQYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybiBjb25maWdQYWNrYWdlTmFtZTtcblxuICAvLyBlLmcuICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycgLT4gJ294bGludC1jb25maWcnLCB3aGljaCBpcyBpdHMgZGlyZWN0b3J5IHVuZGVyIGBwYWNrYWdlcy9gLlxuICBjb25zdCBjb25maWdQYWNrYWdlRGlyID0gY29uZmlnUGFja2FnZU5hbWUuc3BsaXQoJy8nKS5wb3AoKSA/PyAnJztcbiAgLy8gRGVyaXZlIHRoZSB3aWxsYm9vc3Rlci1jb25maWdzIHJvb3QgZnJvbSB0aGUgcGFja2FnZSBiZWluZyBnZW5lcmF0ZWQsIG5vdCBmcm9tIHRoZSBDTEkgZW50cnlcbiAgLy8gcGF0aDogYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxwa2c+YCBpcyBhIHN1cHBvcnRlZCBpbnZvY2F0aW9uIHdob3NlIGVudHJ5IGNvbmZpZyBpcyB0aGUgY2hpbGRcbiAgLy8gcGFja2FnZSByYXRoZXIgdGhhbiB0aGUgcmVwbyByb290LCBzbyByZWx5aW5nIG9uIHRoZSBlbnRyeSB3b3VsZCBlbWl0IGEgbmVzdGVkLCB1bnJlc29sdmFibGVcbiAgLy8gcGF0aCBmb3IgYSBkaXJlY3RseSB0YXJnZXRlZCBjb25maWcgcGFja2FnZS4gRXZlcnkgd2lsbGJvb3N0ZXItY29uZmlncyBwYWNrYWdlIGlzIGVpdGhlciB0aGVcbiAgLy8gcm9vdCBvciBhIGRpcmVjdCBjaGlsZCB1bmRlciBgcGFja2FnZXMvYCwgc28gdGhlIHJvb3QgaXMgdGhlIHBhY2thZ2UgZGlyIGl0c2VsZiBvciBpdHMgZ3JhbmRwYXJlbnQuXG4gIGNvbnN0IHJlcG9Sb290RGlyUGF0aCA9IGNvbmZpZy5pc1Jvb3QgPyBjb25maWcuZGlyUGF0aCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gIGNvbnN0IGxvY2FsRW50cnkgPSBwYXRoLnJlc29sdmUocmVwb1Jvb3REaXJQYXRoLCAncGFja2FnZXMnLCBjb25maWdQYWNrYWdlRGlyLCAnY29uZmlnLm1qcycpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBsb2NhbEVudHJ5KTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJlxuICAgICFjb25maWcuaXNSb290ICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5wcml2YXRlICE9PSB0cnVlICYmXG4gICAgQXJyYXkuaXNBcnJheShjb25maWcucGFja2FnZUpzb24/LmZpbGVzKSAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbi5maWxlcy5sZW5ndGggPiAwXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvciwgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuLi91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMsIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcbmltcG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsXG4gIGhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybixcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbn0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5pbXBvcnQgeyBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgfSBmcm9tICcuL2J1bmZpZy5qcyc7XG5cbmNvbnN0IG94bGludERlcHMgPSBbJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLCAnb3hmbXQnLCAnb3hsaW50JywgJ294bGludC10c2dvbGludCddO1xuY29uc3QgdHlwZXNjcmlwdERlcGVuZGVuY3kgPSAndHlwZXNjcmlwdCc7XG4vLyBUeXBlU2NyaXB0IDcncyBgdHlwZXNjcmlwdGAgcGFja2FnZSBpcyB0aGUgdHNnbyBuYXRpdmUgY29tcGlsZXIgYW5kIGV4cG9zZXMgbm9cbi8vIHByb2dyYW1tYXRpYyBBUEkuIE5leHQuanMncyBidWlsZC10aW1lIGB2ZXJpZnlUeXBlU2NyaXB0U2V0dXBgIG5lZWRzIHRoYXQgQVBJLCBzb1xuLy8gYG5leHQgYnVpbGRgIGZhaWxzIChcInRyeWluZyB0byB1c2UgVHlwZVNjcmlwdCBidXQgZG8gbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBhY2thZ2UocylcIilcbi8vIHdpdGggb25seSBgdHlwZXNjcmlwdGAgdjcgaW5zdGFsbGVkLiBOZXh0LmpzIHJlc29sdmVzIHRoZSB0c2dvIGJpbmFyeSB0aHJvdWdoIHRoZVxuLy8gc2VwYXJhdGUgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCBwYWNrYWdlLCBzbyBOZXh0LmpzLWZhbWlseSByZXBvcyBtdXN0IGluc3RhbGxcbi8vIGJvdGg7IG90aGVyIHJlcG9zIG9ubHkgbmVlZCBgdHlwZXNjcmlwdGAgZm9yIGB0c2NgIHR5cGVjaGVja3MuXG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3QgbGVmdGhvb2tEZXBlbmRlbmN5ID0gJ2xlZnRob29rJztcbmNvbnN0IG1hbmFnZWREZXBlbmRlbmN5TmFtZXMgPSBuZXcgU2V0KFtcbiAgd2JEZXBlbmRlbmN5LFxuICBidWlsZFRzRGVwZW5kZW5jeSxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0RGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSxcbiAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgLy8gTWl4ZWQgQHR5cGVzL2J1biB2ZXJzaW9ucyBhY3Jvc3MgYSBtb25vcmVwbyBsb2FkIHR3byBidW4tdHlwZXMgY29waWVzLCB3aGljaFxuICAvLyBicmVha3MgZ2xvYmFsIGludGVyZmFjZSBtZXJnaW5nIChlLmcuIFJlc3BvbnNlL0hlYWRlcnMpIGR1cmluZyB0eXBlIGNoZWNraW5nLlxuICAnQHR5cGVzL2J1bicsXG4gIC4uLm94bGludERlcHMsXG5dKTtcbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgcGFja2FnZUFnZUdhdGVNcyA9IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyAqIDEwMDA7XG5jb25zdCBucG1QYWNrYWdlVGltZXNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcblxudHlwZSBXcml0YWJsZVBhY2thZ2VKc29uID0gU2V0UmVxdWlyZWQ8XG4gIFBhY2thZ2VKc29uLFxuICAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnXG4+O1xuXG5pbnRlcmZhY2UgRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBkZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdvcmtlclR5cGVzU2NyaXB0RXJyb3IgPSBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKGNvbmZpZyk7XG4gIGlmICh3b3JrZXJUeXBlc1NjcmlwdEVycm9yKSB0aHJvdyBuZXcgRXJyb3Iod29ya2VyVHlwZXNTY3JpcHRFcnJvcik7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25PYmogPSBhd2FpdCByZWFkUGFja2FnZUpzb24oZmlsZVBhdGgpO1xuICB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IGVuc3VyZVRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIGNvbnN0IGRlcGVuZGVuY3lVcGRhdGVzID0gYXdhaXQgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgLy8gT24gYSBmaXJzdCBydW4gdGhlcmUgaXMgbm8gbWFuaWZlc3QgZm9yIGBidW4gYWRkYCB0byB1cGRhdGUgcmVsaWFibHkuIFdyaXRlIHRoZSByZXNvbHZlZFxuICAvLyBkZXBlbmRlbmN5IHZlcnNpb25zIGludG8gdGhlIG5ldyBtYW5pZmVzdCBkaXJlY3RseTsgdGhlIGZpbmFsIHJlcG9zaXRvcnktd2lkZSBgYnVuIGluc3RhbGxgXG4gIC8vIHRoZW4gaW5zdGFsbHMgdGhlbSBhbmQgcmVtYWlucyB0aGUgYXV0aG9yaXRhdGl2ZSBmYWlsdXJlIGNoZWNrLlxuICBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgZGVwZW5kZW5jeVVwZGF0ZXMsXG4gICAgc2tpcEFkZGluZ0RlcHMgfHwgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uXG4gICk7XG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcbiAgcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG5cbiAgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIC8vIFlhcm4gcmVhZHMgcGFja2FnZS5qc29uIGZyb20gZGlzayBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciBgeWFybiBhZGQgLURgXG4gIC8vIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZGVwZW5kZW5jeSwgc28gdGhpcyB3cml0ZSBtdXN0IGZpbmlzaFxuICAvLyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZXMgYmVsb3cuIEtlZXAgdGhpcyBnZW5lcmF0ZWRcbiAgLy8gZmlsZSBzb3J0ZWQgZXZlbiB3aGVuIHdlIGxhdGVyIHJ1biB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBmb3JtYXR0ZXIgc28gYVxuICAvLyBtaWQtcnVuIGludGVycnVwdGlvbiBuZXZlciBsZWF2ZXMgcGFja2FnZS5qc29uIGluIGEgcGFydGlhbGx5IG1hbmFnZWQgb3JkZXIuXG4gIC8vIEEgcmVmdXNlZCB3cml0ZSAoZS5nLiBhIHN5bWxpbmtlZCBwYWNrYWdlLmpzb24pIG11c3QgYWxzbyBhYm9ydCB0aGUgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb25cbiAgLy8gYmVsb3c6IGBidW4gYWRkYCBmb2xsb3dzIHRoZSBzeW1saW5rIGFuZCB3b3VsZCBtb2RpZnkgdGhlIGZpbGUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpKSkgcmV0dXJuO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gICAgLy8gQSBuZXdseSBjcmVhdGVkIG1hbmlmZXN0IGlzIGFscmVhZHkgc29ydGVkIGJ5IHdiZnkncyBidW5kbGVkIHNlcmlhbGl6ZXI7IHRoZSB0YXJnZXQgZm9ybWF0dGVyXG4gICAgLy8gaXMgYXZhaWxhYmxlIHdpdGhvdXQgYW4gZXh0cmEgZmV0Y2ggb25seSB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgd2l0aCBwYWNrYWdlLmpzb24uXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZywgZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogc3RyaW5nIHtcbiAgLy8gZnNVdGlsLmdlbmVyYXRlRmlsZSgpIG5vcm1hbGl6ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIGtlZXAgdGhlIHNlcmlhbGl6ZXJcbiAgLy8gZm9jdXNlZCBvbiB0aGUgSlNPTiBwYXlsb2FkIGl0c2VsZi5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihqc29uT2JqKSwgdW5kZWZpbmVkLCAyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgbGV0IGpzb25PYmo6IFBhY2thZ2VKc29uID0ge307XG4gIHRyeSB7XG4gICAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRG9jdW1lbnRhdGlvbi1vbmx5IHJlcG9zaXRvcmllcyBoYXZlIG5vIG1hbmlmZXN0IG9uIHRoZWlyIGZpcnN0IHdiZnkgcnVuLiBTdGFydGluZyBmcm9tIGFuXG4gICAgLy8gZW1wdHkgb2JqZWN0IGxldHMgdGhlIG5vcm1hbCBnZW5lcmF0b3IgZXN0YWJsaXNoIHRoZSBzYW1lIG1hbmFnZWQgYmFzZWxpbmUgYXMgZXZlcnkgb3RoZXJcbiAgICAvLyByZXBvc2l0b3J5OyBtYWxmb3JtZWQgb3IgdW5yZWFkYWJsZSBleGlzdGluZyBtYW5pZmVzdHMgbXVzdCBzdGlsbCBmYWlsIGxvdWRseS5cbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHRocm93IGVycm9yO1xuICB9XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5mdW5jdGlvbiBwcnVuZUNhcGFiaWxpdHlEZXBlbmRlbnRDb21waWxlckRlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgLy8gUnVuIGJlZm9yZSBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIHJlLWFkZHMgdHNnbyBvbmx5IGZvciBjdXJyZW50IE5leHQuanMtZmFtaWx5IHJlcG9zaXRvcmllcy5cbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGlmICghY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAganNvbk9iai5zY3JpcHRzID0geyAuLi5qc29uT2JqLnNjcmlwdHMsIC4uLmdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykgfTtcbn1cblxuLyoqXG4gKiBLZWVwcyB0aGUgcHJvamVjdCdzIG93biBzZWdtZW50cyBpbiBvcmRlciwgcmVwbGFjaW5nIHRoZSBmaXJzdCBtYW5hZ2VkIGdlbi1jb2RlIHNwZWxsaW5nIHdpdGhcbiAqIGBidW4gd2IgZ2VuLWNvZGVgIGFuZCBkcm9wcGluZyBsYXRlciBkdXBsaWNhdGVzLiBBcHBlbmRzIGdlbmVyYXRpb24gb25seSB3aGVuIHRoZSBzY3JpcHRcbiAqIGNvbnRhaW5lZCBub25lLCBzbyBub3RoaW5nIGlzIHJlb3JkZXJlZC5cbiAqL1xuZnVuY3Rpb24gcmVidWlsZFBvc3RpbnN0YWxsU2VnbWVudHMoc2VnbWVudHM6IHN0cmluZ1tdLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogc3RyaW5nW10ge1xuICBjb25zdCBraW5kcyA9IHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMsIHRydWUpKTtcbiAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIGN1c3RvbWl6ZWQgZ2VuLWNvZGUgYWxyZWFkeSBnZW5lcmF0ZXM7IGFkZGluZyBhbm90aGVyIGludm9jYXRpb24gd291bGQgcnVuIGV2ZXJ5XG4gIC8vIGdlbmVyYXRvciB0d2ljZS5cbiAgbGV0IGdlbmVyYXRpb25QbGFjZWQgPSBraW5kcy5pbmNsdWRlcygnZ2VuQ29kZVdyYXBwZXInKTtcbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgc2VnbWVudF0gb2Ygc2VnbWVudHMuZW50cmllcygpKSB7XG4gICAgY29uc3Qga2luZCA9IGtpbmRzW2luZGV4XTtcbiAgICBpZiAoa2luZCA9PT0gJ2N1c3RvbScgfHwga2luZCA9PT0gJ2dlbkNvZGVXcmFwcGVyJykge1xuICAgICAgcmVzdWx0LnB1c2goc2VnbWVudCk7XG4gICAgfSBlbHNlIGlmICghZ2VuZXJhdGlvblBsYWNlZCkge1xuICAgICAgcmVzdWx0LnB1c2goJ2J1biB3YiBnZW4tY29kZScpO1xuICAgICAgZ2VuZXJhdGlvblBsYWNlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmICghZ2VuZXJhdGlvblBsYWNlZCkgcmVzdWx0LnB1c2goJ2J1biB3YiBnZW4tY29kZScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgbWFuYWdlZCBnZW4tY29kZSBzZWdtZW50cyB3aGlsZSBrZWVwaW5nIHRoZSBmaXJzdCBzZWdtZW50J3MgcG9zaXRpb24gc28gYSBjdXN0b21cbiAqIHN0ZXAgdGhhdCBjb25zdW1lcyBnZW5lcmF0ZWQgb3V0cHV0IHN0aWxsIHJ1bnMgYWZ0ZXIgaXQuIFJldHVybnMgd2l0aG91dCBjaGFuZ2luZyBhblxuICogdW5wYXJzZWFibGUgc2NyaXB0LlxuICovXG5mdW5jdGlvbiB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLCBtYW5hZ2VzV29ya2VyVHlwZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgLy8gYGJ1biB3YiBnZW4tY29kZWAgcmVnZW5lcmF0ZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBpdHNlbGYsIHNvIGEgcGFja2FnZSB3aXRoIGFcbiAgLy8gY29kZS1nZW5lcmF0aW9uIG9yIHdvcmtlci10eXBlcyBwaXBlbGluZSBnZXRzIG9uZSBtYW5hZ2VkIGdlbmVyYXRpb24gc2VnbWVudC5cbiAgaWYgKHNjcmlwdHNbJ2dlbi1jb2RlJ10gfHwgbWFuYWdlc1dvcmtlclR5cGVzKSB7XG4gICAgLy8gUHJvamVjdC1vd25lZCBzdGVwcyBhcmUgbmV2ZXIgZHJvcHBlZCwgYW5kIHRoZWlyIFBPU0lUSU9OIHJlbGF0aXZlIHRvIGdlbmVyYXRpb24gaXMgcHJlc2VydmVkOiBhIHN0ZXBcbiAgICAvLyBiZWZvcmUgaXQgbWF5IHByb2R1Y2UgYHdyYW5nbGVyIHR5cGVzYCcgaW5wdXRzIChhIHdyYW5nbGVyIGNvbmZpZywgYC5kZXYudmFyc2ApLCB3aGlsZSBvbmUgYWZ0ZXIgaXQgbWF5XG4gICAgLy8gY29uc3VtZSB0aGUgZ2VuZXJhdGVkIHR5cGVzLiBTbyB0aGUgbWFuYWdlZCBnZW5lcmF0aW9uIHJlcGxhY2VzIHRoZSBmaXJzdCBtYW5hZ2VkIHNlZ21lbnQgaW4gcGxhY2UsIGFuZCBpc1xuICAgIC8vIGFwcGVuZGVkIG9ubHkgd2hlbiB0aGUgc2NyaXB0IGhhZCBub25lLiBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIGdlbmVyYXRpb24gcGx1cyB0aGUgcHJvamVjdCdzIG93biBzdGVwcywgc28gaXQgc3VwcHJlc3NlcyB0aGUgcmVwbGFjZW1lbnQgZW50aXJlbHkuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBzY3JpcHRzLnBvc3RpbnN0YWxsID09PSB1bmRlZmluZWQgPyBbXSA6IHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCk7XG4gICAgY29uc3Qga2VwdFNlZ21lbnRzID0gc2VnbWVudHMgJiYgcmVidWlsZFBvc3RpbnN0YWxsU2VnbWVudHMoc2VnbWVudHMsIHNjcmlwdHMpO1xuICAgIGlmIChrZXB0U2VnbWVudHMpIHtcbiAgICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPSBrZXB0U2VnbWVudHMuam9pbignICYmICcpO1xuICAgIH1cbiAgICAvLyBBbnkgb3RoZXIgdW5wYXJzZWFibGUgcG9zdGluc3RhbGwgaXMgbGVmdCB0byBhIGh1bWFuIHJhdGhlciB0aGFuIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8RGVwZW5kZW5jeVVwZGF0ZXM+IHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIGlmIChcbiAgICBoYXNKYXZhICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllcicpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAvLyBMZWZ0aG9vayBnZW5lcmF0aW9uIGlzIGJlc3QtZWZmb3J0IGFuZCAubGVmdGhvb2sgaXMgYWJzZW50IGZyb20gRG9ja2VyIGJ1aWxkIGNvbnRleHRzLCBzbyBhXG4gICAgLy8gbWlzc2luZyBub3JtYWxpemVyIGlzIHZhbGlkLiBPbmNlIHByZXNlbnQsIGl0cyBmYWlsdXJlIG11c3QgYWJvcnQgaW5zdGFsbCByYXRoZXIgdGhhbiBsZWF2ZSBhXG4gICAgLy8gR3VhcmQtcGlubmVkIGxvY2tmaWxlIGJlaGluZDsga2VlcCB0aGF0IGZhaWwtZmFzdCBncm91cGluZyBleHBsaWNpdCBiZWZvcmUgYW55IHdvcmtzcGFjZSBidWlsZC5cbiAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9XG4gICAgICAnKGJ1biBsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUpICYmICh0ZXN0ICEgLWYgLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2ggfHwgYmFzaCAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCknO1xuICAgIC8vIFdoZW4gQHdpbGxib29zdGVyL3diIGlzIGEgd29ya3NwYWNlIG9mIHRoaXMgcmVwb3NpdG9yeSwgdGhlIGdlbmVyYXRlZCBgYnVuIHdiIOKApmAgc2NyaXB0cyBydW5cbiAgICAvLyBpdHMgZ2l0aWdub3JlZCBkaXN0IGJ1aWxkIChiaW4vaW5kZXguanMgaW1wb3J0cyAuLi9kaXN0L2luZGV4LmpzKSwgc28gYSBmcmVzaCBjaGVja291dCBtdXN0XG4gICAgLy8gYnVpbGQgaXQgZHVyaW5nIGluc3RhbGw7IHJlZ2lzdHJ5IGluc3RhbGxzIHNoaXAgYSBwcmVidWlsdCBkaXN0IGFuZCBuZWVkIG5vIGV4dHJhIHN0ZXAuXG4gICAgY29uc3Qgd2JXb3Jrc3BhY2VEaXIgPSBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS5nZXQod2JEZXBlbmRlbmN5KTtcbiAgICBpZiAod2JXb3Jrc3BhY2VEaXIpIHtcbiAgICAgIC8vIFNpbmdsZSBxdW90ZXMgKHdpdGggZW1iZWRkZWQgcXVvdGVzIGVzY2FwZWQpIHByZXZlbnQgdGhlIHNoZWxsIGZyb20gZXhwYW5kaW5nIGAkKOKApilgIG9yXG4gICAgICAvLyB2YXJpYWJsZXMgdGhhdCBhIGhvc3RpbGUgZGlyZWN0b3J5IG5hbWUgY291bGQgc211Z2dsZSBpbnRvIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LlxuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgKz0gYCAmJiBidW4gcnVuIC0tY3dkICcke3diV29ya3NwYWNlRGlyLnJlcGxhY2VBbGwoXCInXCIsIFN0cmluZy5yYXdgJ1xcJydgKX0nIGJ1aWxkYDtcbiAgICB9XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2gobGVmdGhvb2tEZXBlbmRlbmN5KTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShqc29uT2JqLnNjcmlwdHMucmVsZWFzZSkpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ107XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0UnVudGltZSkge1xuICAgICAgICAvLyBSdW50aW1lIGltcG9ydHMgbmVlZCB0aGUgc3RhbmRhbG9uZSBwYWNrYWdlIGFmdGVyIERvY2tlciBwcnVuaW5nIHJlbW92ZXMgZGV2RGVwZW5kZW5jaWVzLlxuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/PVxuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz9cbiAgICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddID8/XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ3BsYXl3cmlnaHQnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uIFlhcm4gdjEncyBvYmplY3QgZm9ybSBrZWVwcyBpdHNcbiAgICAgIC8vIGRlY2xhcmVkIHBhdHRlcm5zICh3b3Jrc3BhY2VzLnBhY2thZ2VzKTsgb25seSBleHRyYXMgc3VjaCBhcyBub2hvaXN0IGFyZSBkcm9wcGVkLlxuICAgICAgLy8gRm9yY2UgYHBhY2thZ2VzLypgIG9ubHkgd2hlbiBpdCBhY3R1YWxseSBtYXRjaGVzIGEgd29ya3NwYWNlIG1hbmlmZXN0OiBhbiBhcHBzLyotb25seVxuICAgICAgLy8gbW9ub3JlcG8gbXVzdCBub3QgZ2V0IGEgbmV2ZXItbWF0Y2hpbmcgcGF0dGVybiBhcHBlbmRlZCB0byBpdHMgZGVjbGFyYXRpb24uIEFcbiAgICAgIC8vIGJhc2VsaW5lLXNlZWRpbmcgZGVjbGFyYXRpb24gbmVlZHMgbm8gZm9yY2VkIHBhdHRlcm4gYXQgYWxsIOKAlCB0aGUgc2VlZGVkIGJhc2VsaW5lXG4gICAgICAvLyAoYCovKmAgb3IgYCoqYCkgYWxyZWFkeSBjb3ZlcnMgcGFja2FnZXMvKi4gVGhlIGZvcmNlZCBwYXR0ZXJuIGlzIFBSRVBFTkRFRDogQnVuXG4gICAgICAvLyBldmFsdWF0ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHNlcXVlbnRpYWxseSwgc28gYSBwb3NpdGl2ZSBwYXR0ZXJuIHBsYWNlZCBhZnRlciBhIHVzZXJcbiAgICAgIC8vIG5lZ2F0aW9uIHdvdWxkIHJlLWluY2x1ZGUgdGhlIG5lZ2F0ZWQgcGFja2FnZXMuIEEgZGVjbGFyYXRpb24gdGhhdCBhbHJlYWR5IGNvdmVyc1xuICAgICAgLy8gcGFja2FnZXMvKiB1bmRlciBub3JtYWxpemF0aW9uIChlLmcuIGAuL3BhY2thZ2VzLypgKSBpcyBrZXB0IHZlcmJhdGltOiBmb3JjaW5nIGEgdGV4dHVhbFxuICAgICAgLy8gYHBhY2thZ2VzLypgIG5leHQgdG8gaXQgd291bGQgcGVyc2lzdCBhIGR1cGxpY2F0ZSBlcXVpdmFsZW50IHBhdHRlcm4uXG4gICAgICBjb25zdCBmb3JjZWRQYXR0ZXJucyA9XG4gICAgICAgICFoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgIWhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybihqc29uT2JqLndvcmtzcGFjZXMpICYmXG4gICAgICAgIGZnLmdsb2JTeW5jKCdwYWNrYWdlcy8qL3BhY2thZ2UuanNvbicsIHsgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddIH0pLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFsncGFja2FnZXMvKiddXG4gICAgICAgICAgOiBbXTtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IG1lcmdlLmFsbChbZm9yY2VkUGF0dGVybnMsIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMoanNvbk9iai53b3Jrc3BhY2VzKV0sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgfSk7XG4gICAgICAvLyBCb3RoIGlucHV0cyBjYW4gYmUgZW1wdHkgKGUuZy4gcGFja2FnZXMvcGFja2FnZS5qc29uIHdpdGhvdXQgYW55IHBhY2thZ2VzLyovcGFja2FnZS5qc29uXG4gICAgICAvLyBhbmQgbm8gZGVjbGFyZWQgd29ya3NwYWNlcyk7IGRvIG5vdCBwZXJzaXN0IGEgbWVhbmluZ2xlc3MgYHdvcmtzcGFjZXM6IFtdYC5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykgJiYganNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaXhlcnMvbmV4dENvbmZpZy50cyBlbmFibGVzIGByZWFjdENvbXBpbGVyOiB0cnVlYCBmb3IgZXZlcnkgTmV4dC5qcyBwcm9qZWN0LCBhbmQgTmV4dC5qc1xuICAvLyByZXNvbHZlcyBgYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyYCBhdCBidWlsZCB0aW1lIHdoZW4gUmVhY3QgQ29tcGlsZXIgaXMgb24uIEFkZCBpdCBoZXJlIHNvXG4gIC8vIHRoZSBtYW5hZ2VkIG5leHQuY29uZmlnIG5ldmVyIGJyZWFrcyBgbmV4dCBidWlsZGAgd2l0aCBhbiB1bnJlc29sdmVkLXBhY2thZ2UgZXJyb3IuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyk7XG4gIH1cblxuICAvLyBgd2IgdmVyaWZ5IC0tZnVsbGAgYXVkaXRzIGV2ZXJ5IGAqLnNsaWRldi5tZGAgZGVjayB3aXRoIHNsaWRldi1jaGVjaywgc28gdGhlIGNoZWNrZXIgaGFzIHRvIGJlXG4gIC8vIGluc3RhbGxlZCB3aGVyZXZlciBhIGRlY2sgbGl2ZXMuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TbGlkZXZNZCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzbGlkZXYtY2hlY2snKTtcbiAgfVxuXG4gIGlmICghaXNXYlBhY2thZ2UoanNvbk9iaikpIHtcbiAgICAvLyBBIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgZGVwZW5kcyBvbiB0aGUgd2IgZGV2ZWxvcGVkIGluIHRoaXMgcmVwb3NpdG9yeSAoZS5nLlxuICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBpdHNlbGYpOyBpbnN0YWxsaW5nIHRoZSBsYXRlc3QgcmVnaXN0cnkgcmVsZWFzZSBvdmVyIGl0IHdvdWxkIHNpbGVudGx5XG4gICAgLy8gcmVwbGFjZSB0aGUgbG9jYWwgYnVpbGQgd2l0aCBhIHB1Ymxpc2hlZCBvbmUsIHNvIGxlYXZlIHN1Y2ggYSBkZWNsYXJhdGlvbiB1bnRvdWNoZWQuXG4gICAgY29uc3Qgd2JTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1t3YkRlcGVuZGVuY3ldID8/IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV07XG4gICAgaWYgKCF3YlNwZWNpZmllcj8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gYnVpbGQtdHMgb3ducyBUeXBlU2NyaXB0IGV4ZWN1dGlvbiBhbmQgZGVjbGFyYXRpb24gZW1pdC4gd2JmeSBtdXN0IGFsd2F5c1xuICAvLyBrZWVwIGV4aXN0aW5nIGJ1aWxkLXRzIHVzZXJzIGN1cnJlbnQgYmVjYXVzZSBvbGRlciByZWxlYXNlcyBjYW4gZW1pdCAuZC50c1xuICAvLyBmaWxlcyBhdCBwYXRocyB0aGF0IG5vIGxvbmdlciBtYXRjaCBwYWNrYWdlIGV4cG9ydHMuXG4gIGlmIChcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBPYmplY3QudmFsdWVzKGpzb25PYmouc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiBzY3JpcHQ/LmluY2x1ZGVzKGJ1aWxkVHNEZXBlbmRlbmN5KSlcbiAgKSB7XG4gICAgaWYgKHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gIH1cblxuICBjb25zdCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpID8gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykgOiBbXTtcbiAgYXdhaXQgcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaiwgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4udHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSwgc28gaXQgaXNcbiAgICAvLyBub3cgdGhlIG1hbmFnZWQgY29tcGlsZXIgZm9yIGV2ZXJ5IFR5cGVTY3JpcHQgcmVwbyAodHlwZWNoZWNraW5nIHJ1bnMgYHRzY2ApLlxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHREZXBlbmRlbmN5KTtcbiAgICAvLyBOZXh0LmpzJ3MgYG5leHQgYnVpbGRgIGluc3BlY3RzIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIHRvIHJ1biBpdHMgdHlwZVxuICAgIC8vIGNoZWNrOyB0aGUgYHR5cGVzY3JpcHRgIHY3IHBhY2thZ2UgYWxvbmUgbGFja3MgdGhlIEFQSSBuZXh0IG5lZWRzLCBzbyBrZWVwIGJvdGhcbiAgICAvLyBpbnN0YWxsZWQgZm9yIE5leHQuanMtZmFtaWx5IHJlcG9zLiBTZWUgdGhlIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgY29tbWVudCBhYm92ZS5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpO1xuICAgIH1cbiAgICAvLyBSZWFjdCBOYXRpdmUgcmVsaWVzIG9uIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUncyBhbWJpZW50IHR5cGVzIGluc3RlYWQgb2YgQHR5cGVzL2J1bi5cbiAgICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2Uoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL1xcYig/OmJ1bnh8bnB4fHBucG1cXHMrZGx4fHlhcm5cXHMrZGx4KVxccytzZW1hbnRpYy1yZWxlYXNlKD86QFxcUyspP1xcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCBrZWVwQXNSdW50aW1lXSBvZiBbXG4gICAgW3diRGVwZW5kZW5jeSwgc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gICAgW2J1aWxkVHNEZXBlbmRlbmN5LCBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICBdIGFzIGNvbnN0KSB7XG4gICAgaWYgKGtlZXBBc1J1bnRpbWUpIHtcbiAgICAgIGNvbnN0IGRldlZlcnNpb24gPSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZGV2VmVyc2lvbikgY29udGludWU7XG4gICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFydW50aW1lVmVyc2lvbiB8fCBpc05ld2VyUGFja2FnZVZlcnNpb24oZGV2VmVyc2lvbiwgcnVudGltZVZlcnNpb24pKSB7XG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZGV2VmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9IGVsc2UgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSB7XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBpbWFnZXMgcnVuIG1pZ3JhdGlvbnMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsIGp1c3QgYXMgcGFja2FnZSBtYW5hZ2Vyc1xuICAvLyBydW4gcG9zdGluc3RhbGwgZHVyaW5nIHByb2R1Y3Rpb24gaW5zdGFsbHMsIHNvIGJvdGggZW50cnkgcG9pbnRzIG11c3QgcmV0YWluIHRoZSB3YiBiaW5hcnkuXG4gIC8vIEtlZXAgdGhlIHdvcmQgbWF0Y2ggY29uc2VydmF0aXZlOiBzdXBwb3J0ZWQgY3VzdG9tIHdyYXBwZXJzIGNhbiBwdXQgd2IgaW5zaWRlIHNoZWxsIGxvb3BzIHRoYXRcbiAgLy8gdGhlIGNvbW1hbmQtcG9zaXRpb24gcGFyc2VyIGNhbm5vdCBjbGFzc2lmeSwgd2hpbGUgYSBmYWxzZSBwb3NpdGl2ZSBvbmx5IHJldGFpbnMgdGhlIENMSS5cbiAgcmV0dXJuIFtqc29uT2JqLnNjcmlwdHM/LnBvc3RpbnN0YWxsLCBqc29uT2JqLnNjcmlwdHM/LlsnZGItbWlncmF0ZSddXS5zb21lKFxuICAgIChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIC9cXGJ3YlxcYi91LnRlc3Qoc2NyaXB0KVxuICApO1xufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgY29uc3QgcHJpc21hID0ganNvbk9iai5wcmlzbWEgYXMgeyBzZWVkPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhwcmlzbWE/LnNlZWQpIHx8IGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoanNvbk9iai5zY3JpcHRzPy5zZWVkKTtcbn1cblxuZnVuY3Rpb24gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhzZWVkQ29tbWFuZDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIERvY2tlciBpbWFnZXMgcnVuIHNlZWQgc2NyaXB0cyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCxcbiAgLy8gc28gVHlwZVNjcmlwdCBzZWVkIHJ1bm5lcnMgbXVzdCByZW1haW4gYXZhaWxhYmxlIGF0IHJ1bnRpbWUuXG4gIHJldHVybiB0eXBlb2Ygc2VlZENvbW1hbmQgPT09ICdzdHJpbmcnICYmIC8oPzwhW1xcdy1dKWJ1aWxkLXRzKD8hW1xcdy1dKS91LnRlc3Qoc2VlZENvbW1hbmQpO1xufVxuXG5jb25zdCBkZXBlbmRlbmN5RGVjbGFyYXRpb25TZWN0aW9ucyA9IFtcbiAgJ2RlcGVuZGVuY2llcycsXG4gICdkZXZEZXBlbmRlbmNpZXMnLFxuICAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLFxuICAncGVlckRlcGVuZGVuY2llcycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIEZvcmNlcyBzdG9yZS1pbmNvbXBhdGlibGUgcGFja2FnZXMgdG8gc3RheSBwcm9qZWN0LWxvY2FsIHdoZW4gdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBlbmFibGVzXG4gKiBCdW4ncyBnbG9iYWwgc3RvcmU6IGBjaGFrcmEgdHlwZWdlbmAgKHJ1biBieSBgd2IgZ2VuLWNvZGVgKVxuICogd3JpdGVzIGdlbmVyYXRlZCB0eXBlcyBpbnRvIHRoZSBpbnN0YWxsZWQgQGNoYWtyYS11aS9yZWFjdCBwYWNrYWdlLCB3aGljaCB3b3VsZCBvdGhlcndpc2VcbiAqIG11dGF0ZSB0aGUgbWFjaGluZS13aWRlIHN0b3JlIHNoYXJlZCBhY3Jvc3MgcmVwb3NpdG9yaWVzLCBhbmQgZHJpenpsZS1raXQgcmVxdWlyZXMgZHJpenpsZS1vcm1cbiAqIHdpdGhvdXQgZGVjbGFyaW5nIGl0LCB3aGljaCB0aGUgc3RvcmUgcmVhbHBhdGggcGxhY2VzIGJleW9uZCBhIHBsYWluIG5vZGVfbW9kdWxlcyB3YWxrLXVwLlxuICogTGlzdGluZyB0aGVtIGluIGB0cnVzdGVkRGVwZW5kZW5jaWVzYCBtYWtlcyBCdW4gbWF0ZXJpYWxpemUgYSBwZXItcHJvamVjdCBjb3B5IHVuZGVyXG4gKiBgbm9kZV9tb2R1bGVzLy5idW4vYCwgd2hvc2Ugc2libGluZyBgbm9kZV9tb2R1bGVzLy5idW4vbm9kZV9tb2R1bGVzL2AgbGlua3MgZXZlcnkgaW5zdGFsbGVkXG4gKiBwYWNrYWdlIGFuZCB0aGVyZWZvcmUgcmVzb2x2ZXMgdGhlIHVuZGVjbGFyZWQgcmVxdWlyZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEJ1biBjb25zdWx0cyB0cnVzdGVkRGVwZW5kZW5jaWVzIGluIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIHBhY2thZ2UuanNvbiBvbmx5LCBzbyB0aGUgbGlzdCBpc1xuICAvLyBtYW5hZ2VkIHRoZXJlIGFuZCBtdXN0IGNvdmVyIGRlcGVuZGVuY2llcyBkZWNsYXJlZCBhbnl3aGVyZSBpbiB0aGUgcmVwb3NpdG9yeS5cbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG4gIGNvbnN0IGJ1bkpzb25PYmogPSBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb24gJiB7IHRydXN0ZWREZXBlbmRlbmNpZXM/OiBzdHJpbmdbXSB9O1xuICAvLyBCdW4gaW5zdGFsbHMgb3B0aW9uYWwgYW5kIHBlZXIgZGVwZW5kZW5jaWVzIGJ5IGRlZmF1bHQsIHNvIGFsbCBkZWNsYXJhdGlvbiBzZWN0aW9ucyBjb3VudC5cbiAgLy8gRXZlcnkgZGVjbGFyZWQgcmFuZ2UgaXMga2VwdCBwZXIgcGFja2FnZTogYSByb290IGRlY2xhcmF0aW9uIG11c3Qgbm90IG1hc2sgYSB3b3Jrc3BhY2Ugb25lXG4gIC8vIChlLmcuIHJvb3QgQGNoYWtyYS11aS9jbGkgdjIgYWxvbmdzaWRlIGEgd29ya3NwYWNlIG9uIHYzKS5cbiAgY29uc3QgZGVjbGFyZWREZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGNvbnN0IGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzID0gKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBkZXBlbmRlbmN5RGVjbGFyYXRpb25TZWN0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHZlcnNpb25SYW5nZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUpzb25bc2VjdGlvbl0gPz8ge30pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmVyc2lvblJhbmdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25SYW5nZXMgPSBkZWNsYXJlZERlcGVuZGVuY2llcy5nZXQoZGVwZW5kZW5jeU5hbWUpO1xuICAgICAgICAgIGlmICh2ZXJzaW9uUmFuZ2VzKSB7XG4gICAgICAgICAgICB2ZXJzaW9uUmFuZ2VzLnB1c2godmVyc2lvblJhbmdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVjbGFyZWREZXBlbmRlbmNpZXMuc2V0KGRlcGVuZGVuY3lOYW1lLCBbdmVyc2lvblJhbmdlXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBhZGREZWNsYXJlZERlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhjb25maWcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKFxuICAgICAgICBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb25cbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgdW5yZWFkYWJsZSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uXG4gICAgfVxuICB9XG4gIC8vIE9ubHkgQGNoYWtyYS11aS9jbGkgdjMncyBgY2hha3JhIHR5cGVnZW5gIHdyaXRlcyBpbnRvIHRoZSBpbnN0YWxsZWQgQGNoYWtyYS11aS9yZWFjdDtcbiAgLy8gdjIncyBgY2hha3JhLWNsaSB0b2tlbnNgIHdyaXRlcyBpbnRvIEBjaGFrcmEtdWkvc3R5bGVkLXN5c3RlbSBpbnN0ZWFkLCBzbyB0cnVzdGluZ1xuICAvLyBAY2hha3JhLXVpL3JlYWN0IHRoZXJlIHdvdWxkIGZvcmNlIGEgdXNlbGVzcyBwcm9qZWN0LWxvY2FsIGNvcHkgd2l0aG91dCBmaXhpbmcgZ2VuLWNvZGUuXG4gIC8vIE1pcnJvciB3YiBnZW4tY29kZSdzIGNsYXNzaWZpY2F0aW9uOiBvbmx5IGEgcmFuZ2Ugd2hvc2UgbGVhZGluZyBtYWpvciBwYXJzZXMgdG8gMiBzZWxlY3RzIHRoZVxuICAvLyB2MiBjb21tYW5kLCBzbyBkaWdpdGxlc3Mgc3BlY3MgbGlrZSBgbGF0ZXN0YCBvciBjYXRhbG9nIHJlZmVyZW5jZXMgY291bnQgYXMgdjMuXG4gIGNvbnN0IGhhc0NoYWtyYUNsaVYzID0gKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldCgnQGNoYWtyYS11aS9jbGknKSA/PyBbXSkuc29tZShcbiAgICAodmVyc2lvblJhbmdlKSA9PiAvXFxkKy91LmV4ZWModmVyc2lvblJhbmdlKT8uWzBdICE9PSAnMidcbiAgKTtcbiAgY29uc3QgcmVxdWlyZWRXYmZ5UGFja2FnZXMgPSBbXG4gICAgLi4uKGhhc0NoYWtyYUNsaVYzICYmIGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGNoYWtyYS11aS9yZWFjdCcpID8gWydAY2hha3JhLXVpL3JlYWN0J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnZHJpenpsZS1raXQnKSA/IFsnZHJpenpsZS1raXQnXSA6IFtdKSxcbiAgICAvLyBUaGVzZSBnaXQtZGVwZW5kZW5jeSBidWlsZHMgaW1wb3J0IHBhY2thZ2VzIHRoZXkgZG8gbm90IGRlY2xhcmUgKGUuZy4gem9kKSwgd2hpY2ggdGhlXG4gICAgLy8gZ2xvYmFsLXN0b3JlIGxheW91dCBwbGFjZXMgYmV5b25kIHRoZWlyIHdhbGstdXA7IGEgcHJvamVjdC1sb2NhbCBjb3B5IHVuZGVyXG4gICAgLy8gbm9kZV9tb2R1bGVzLy5idW4gcmVzb2x2ZXMgdGhlbSAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvcHJvbXB0LXN0dWR5KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvanVkZ2UnKSA/IFsnQHdpbGxib29zdGVyL2p1ZGdlJ10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpID8gWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gOiBbXSksXG4gICAgLy8gYmxpdHogYW5kIEBibGl0empzL2F1dGggcmVxdWlyZSByZWFjdCAoYW5kIG90aGVyIHBlZXJzKSB3aXRob3V0IGRlY2xhcmluZyB0aGVtLCByZWx5aW5nIG9uXG4gICAgLy8gaG9pc3RpbmcsIHdoaWNoIHRoZSBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cCAob2JzZXJ2ZWQgaW5cbiAgICAvLyBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtOiBgbmV4dCBidWlsZGAgcGFnZS1kYXRhIGNvbGxlY3Rpb24gZGllcyB3aXRoIFwiQ2Fubm90IGZpbmQgbW9kdWxlXG4gICAgLy8gJ3JlYWN0J1wiIGZyb20gQGJsaXR6anMvYXV0aCkuIEBibGl0empzL3JwYyBpcyBOT1QgbGlzdGVkIGJlY2F1c2UgaXQgcHJvcGVybHkgZGVjbGFyZXMgaXRzXG4gICAgLy8gcmVhY3QvQHRhbnN0YWNrIHBlZXJzLCBzbyBCdW4gbGlua3MgdGhlbSBpbnRvIGl0cyBzdG9yZSBlbnRyeS4gQGJsaXR6anMvbmV4dCBpc1xuICAgIC8vIGRlbGliZXJhdGVseSBOT1QgbGlzdGVkIGVpdGhlcjogdHJ1c3RpbmcgaXQgd291bGQgcnVuIGl0cyBwb3N0aW5zdGFsbCAoYGJsaXR6IGNvZGVnZW5gKSxcbiAgICAvLyB3aGljaCBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluIHBsYWNlIOKAlCByZXBvc2l0b3JpZXMgcGF0Y2ggb3V0IHRoYXQgcG9zdGluc3RhbGxcbiAgICAvLyB3aXRoIGBidW4gcGF0Y2hgIGluc3RlYWQsIHdoaWNoIGFsc28ga2VlcHMgdGhlIHBhY2thZ2UgcHJvamVjdC1sb2NhbC5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdibGl0eicpID8gWydibGl0eiddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0BibGl0empzL2F1dGgnKSA/IFsnQGJsaXR6anMvYXV0aCddIDogW10pLFxuICAgIC8vIEJ1biBkb2VzIG5vdCBsaW5rIEBob29rZm9ybS9yZXNvbHZlcnMnIE9QVElPTkFMIHZhbGlkYXRvciBwZWVycyAoZS5nLiB6b2QpIGludG8gaXRzXG4gICAgLy8gZ2xvYmFsLXN0b3JlIGVudHJ5IGV2ZW4gd2hlbiB0aGUgcHJvamVjdCBpbnN0YWxscyB0aGVtLCBzbyBpdHMgc2VydmVyLXNpZGVcbiAgICAvLyBgaW1wb3J0ICd6b2QnYCBmYWlscyBmcm9tIHRoZSBzdG9yZSAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGhvb2tmb3JtL3Jlc29sdmVycycpID8gWydAaG9va2Zvcm0vcmVzb2x2ZXJzJ10gOiBbXSksXG4gICAgLy8gQHpvb20vcnRtcyBpbnN0YWxscyBpdHMgbmF0aXZlIHJ0bXMubm9kZSBiaW5kaW5nIGluIGEgbGlmZWN5Y2xlIHNjcmlwdC4gV2l0aG91dCBleHBsaWNpdFxuICAgIC8vIHRydXN0LCBCdW4gc2tpcHMgdGhhdCBzY3JpcHQgYW5kIHRoZSBwYWNrYWdlIGZhaWxzIGFzIHNvb24gYXMgdGhlIFpvb20gYm90IGltcG9ydHMgaXRcbiAgICAvLyAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc21hcnRzZS16b29tLWJvdCkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHpvb20vcnRtcycpID8gWydAem9vbS9ydG1zJ10gOiBbXSksXG4gIF07XG5cbiAgLy8gd2JmeSBmdWxseSBvd25zIHRoaXMgZmllbGQ6IGEgcGFja2FnZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyBtdXN0IHJ1biBnZXRzIGFkZGVkIHRvIHdiZnlcbiAgLy8gaXRzZWxmIGluc3RlYWQgb2YgdG8gaW5kaXZpZHVhbCByZXBvc2l0b3JpZXMsIHNvIHVubWFuYWdlZCBlbnRyaWVzIGFyZSBhbHdheXMgcmVtb3ZlZCDigJRcbiAgLy8gaW5jbHVkaW5nIGFuIGV4cGxpY2l0bHkgZW1wdHkgZGVueS1hbGwgbGlzdCwgd2hvc2UgZGVsZXRpb24gZGVsaWJlcmF0ZWx5IHJlc3RvcmVzIEJ1bidzXG4gIC8vIGRlZmF1bHQgYWxsb3ctbGlzdCAodGhlIG93bmVyc2hpcCBwb2xpY3kgY2hvc2VuIGluICM5NzUpLlxuICBjb25zdCBleGlzdGluZ1RydXN0ZWQgPSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gIGlmIChyZXF1aXJlZFdiZnlQYWNrYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoZXhpc3RpbmdUcnVzdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIERlbGV0aW5nIHRoZSBmaWVsZCByZXN0b3JlcyBCdW4ncyBmdWxsIGRlZmF1bHQgYWxsb3ctbGlzdCwgc28gb25seSBlbnRyaWVzIG91dHNpZGUgdGhhdFxuICAgICAgLy8gbGlzdCBhY3R1YWxseSBsb3NlIHRoZWlyIGxpZmVjeWNsZSBzY3JpcHRzLlxuICAgICAgd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBleGlzdGluZ1RydXN0ZWQsIG5ldyBTZXQoKSk7XG4gICAgICBkZWxldGUgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBbiBleHBsaWNpdCB0cnVzdGVkRGVwZW5kZW5jaWVzIGxpc3QgUkVQTEFDRVMgQnVuJ3MgZGVmYXVsdCBhbGxvdy1saXN0IGluc3RlYWQgb2YgZXh0ZW5kaW5nXG4gIC8vIGl0LCBhbmQgQnVuIHByaW50cyBubyB3YXJuaW5nIGZvciB0aGUgcG9zdGluc3RhbGxzIGl0IGNvbnNlcXVlbnRseSBza2lwcyAoZS5nLiBAcmFpbHdheS9jbGlcbiAgLy8gZG93bmxvYWRzIGl0cyBiaW5hcnkgaW4gcG9zdGluc3RhbGwgYW5kIGV4aXRzIDEgd2l0aG91dCBvbmUpLiBJbmNsdWRlIHRoZSBFTlRJUkUgZGVmYXVsdCBsaXN0OlxuICAvLyBlbnRyaWVzIGZvciBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW5zdGFsbGVkIGFyZSBpbmVydCwgYW5kIHRoaXMgaXMgdGhlIG9ubHkgcmVwcmVzZW50YXRpb25cbiAgLy8gdGhhdCBzdGF5cyBjb3JyZWN0IGZvciB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyB0aGUgZmluYWwgYGJ1biBpbnN0YWxsYCByZXNvbHZlcyBhZnRlciB0aGlzXG4gIC8vIHJ1bnMg4oCUIGFuIGludGVyc2VjdGlvbiB3aXRoIGEgbWlzc2luZyBvciBzdGFsZSBsb2NrZmlsZSB3b3VsZCBzaWxlbnRseSBkcm9wIHRoZW0uXG4gIGNvbnN0IGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgLy8gbGVmdGhvb2sgaXMgYXBwZW5kZWQgZXhwbGljaXRseSBzbyB0aGUgZGVmYXVsdC1saXN0IGxvb2t1cCBmYWlsaW5nIGNhbm5vdCBkcm9wIGl0OiBpdCBpc1xuICAvLyByZXF1aXJlZCBpbiBldmVyeSBtYW5hZ2VkIHJlcG9zaXRvcnkuXG4gIGNvbnN0IG5ld1RydXN0ZWRQYWNrYWdlcyA9IG5ldyBTZXQoW1xuICAgIC4uLnJlcXVpcmVkV2JmeVBhY2thZ2VzLFxuICAgIGxlZnRob29rRGVwZW5kZW5jeSxcbiAgICAuLi4oZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPz8gW10pLFxuICBdKTtcbiAgd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBleGlzdGluZ1RydXN0ZWQgPz8gW10sIG5ld1RydXN0ZWRQYWNrYWdlcyk7XG4gIGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcyA9IFsuLi5uZXdUcnVzdGVkUGFja2FnZXNdLnRvU29ydGVkKCk7XG59XG5cbi8vIFRoZSBwYWNrYWdlcyB3YmZ5IGl0c2VsZiBtYXkgd3JpdGUgaW50byB0cnVzdGVkRGVwZW5kZW5jaWVzOyB0aGVpciByZW1vdmFsIGlzIG1hbmFnZWQgY2xlYW51cCxcbi8vIG5ldmVyIGEgbG9zcyBvZiB1c2VyIHBvbGljeS5cbmNvbnN0IHdiZnlNYW5hZ2VkVHJ1c3RlZERlcGVuZGVuY2llcyA9IG5ldyBTZXQoW1xuICAnQGJsaXR6anMvYXV0aCcsXG4gICdAY2hha3JhLXVpL3JlYWN0JyxcbiAgJ0Bob29rZm9ybS9yZXNvbHZlcnMnLFxuICAnQHdpbGxib29zdGVyL2p1ZGdlJyxcbiAgJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknLFxuICAnQHpvb20vcnRtcycsXG4gICdibGl0eicsXG4gICdkcml6emxlLWtpdCcsXG4gIGxlZnRob29rRGVwZW5kZW5jeSxcbl0pO1xuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBleGlzdGluZ1RydXN0ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBrZXB0UGFja2FnZXM6IFJlYWRvbmx5U2V0PHN0cmluZz5cbik6IHZvaWQge1xuICAvLyBBIGRlZmF1bHQtdHJ1c3RlZCBlbnRyeSBuZXZlciBsb3NlcyBhbnl0aGluZyBieSByZW1vdmFsOiB3aGlsZSB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQgdGhlXG4gIC8vIGtlcHQgbGlzdCAob3IsIHdoZW4gdGhlIGZpZWxkIGlzIGRlbGV0ZWQsIEJ1bidzIG93biBkZWZhdWx0IGxpc3QpIHN0aWxsIHRydXN0cyBpdC5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICBjb25zdCByZW1vdmVkUGFja2FnZXMgPSBleGlzdGluZ1RydXN0ZWQuZmlsdGVyKFxuICAgIChwa2cpID0+ICFrZXB0UGFja2FnZXMuaGFzKHBrZykgJiYgIXdiZnlNYW5hZ2VkVHJ1c3RlZERlcGVuZGVuY2llcy5oYXMocGtnKSAmJiAhZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM/Lmhhcyhwa2cpXG4gICk7XG4gIGlmIChyZW1vdmVkUGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBSZW1vdmluZyB1bm1hbmFnZWQgdHJ1c3RlZERlcGVuZGVuY2llcyBlbnRyaWVzOiAke3JlbW92ZWRQYWNrYWdlcy5qb2luKCcsICcpfS4gd2JmeSBvd25zIHRoaXMgZmllbGQ7IGlmIHRoZWlyIGxpZmVjeWNsZSBzY3JpcHRzIGFyZSByZXF1aXJlZCwgYWRkIHRoZSBwYWNrYWdlcyB0byB3YmZ5IGl0c2VsZi5gXG4gICAgKTtcbiAgfVxufVxuXG5sZXQgY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4vKiogRmV0Y2hlcyBCdW4ncyBkZWZhdWx0IHRydXN0ZWQtZGVwZW5kZW5jeSBhbGxvdy1saXN0IGZyb20gdGhlIEJ1biB2ZXJzaW9uIGluc3RhbGxpbmcgdGhlIHJlcG9zaXRvcnkuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMpIHtcbiAgICAvLyBCdW4gY29sb3JpemVzIHRoZSBsaXN0IG1hcmtlcnMgd2hlbiBGT1JDRV9DT0xPUiBpcyBzZXQgKGUuZy4gYnkgdGVzdCBydW5uZXJzIG9uIENJKSwgc29cbiAgICAvLyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgbXVzdCBiZSBzdHJpcHBlZCBiZWZvcmUgcGFyc2luZy5cbiAgICBjb25zdCBzdGRvdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2J1bicsIFsncG0nLCAnZGVmYXVsdC10cnVzdGVkJ10sIGNvbmZpZy5kaXJQYXRoKS5yZXBsYWNlQWxsKFxuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gbWF0Y2hpbmcgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIHJlcXVpcmVzIHRoZSBFU0MgY29udHJvbCBjaGFyYWN0ZXJcbiAgICAgIC9cXHUwMDFCXFxbWzAtOTtdKm0vZ3UsXG4gICAgICAnJ1xuICAgICk7XG4gICAgY29uc3QgcGFyc2VkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbLi4uc3Rkb3V0Lm1hdGNoQWxsKC9eXFxzKi1cXHMrKFxcUyspJC9nbXUpXS5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXSBhcyBzdHJpbmcpKTtcbiAgICBpZiAocGFyc2VkRGVwZW5kZW5jaWVzLnNpemUgPT09IDApIHtcbiAgICAgIC8vIERvIG5vdCBjYWNoZSB0aGUgZmFpbHVyZTogYSB0YXJnZXQtbG9jYWwgcHJvYmxlbSAoZS5nLiBhbiB1bnJlYWRhYmxlIHBhY2thZ2UuanNvbikgbXVzdFxuICAgICAgLy8gbm90IGRlbnkgdGhlIGRlZmF1bHQgbGlzdCB0byBldmVyeSBsYXRlciB0YXJnZXQgb2YgYSBtdWx0aS1wYXRoIHJ1bi5cbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHJlYWQgdGhlIGRlZmF1bHQgYWxsb3ctbGlzdCB2aWEgYGJ1biBwbSBkZWZhdWx0LXRydXN0ZWRgLicpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBwYXJzZWREZXBlbmRlbmNpZXM7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIC8vIEV4cGxpY2l0IHJvb3QgcHVibGlzaGluZyBpbnRlbnQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHdiZnkncyBwcml2YXRlIG1vbm9yZXBvLXJvb3QgZGVmYXVsdC5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAoY29uZmlnLnJlbGVhc2UubnBtUHVibGlzaGVzUm9vdCB8fCBqc29uT2JqLnB1Ymxpc2hDb25maWcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmoucHJpdmF0ZTtcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgIWNvbmZpZy5yZWxlYXNlLm5wbSAmJiAhanNvbk9iai5wdWJsaXNoQ29uZmlnKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCByZWdpc3RyeSwgbnBtIHJlc29sdmVzIHRoZSBwdWJsaXNoIHRhcmdldCBmcm9tIHRoZSB3b3Jrc3BhY2UgLm5wbXJjLFxuICAgIC8vIHdob3NlIGRlZmF1bHQgcmVnaXN0cnkgb24gQ0kgbWF5IGJlIHRoZSBUYWt1bWkgR3VhcmQgaW5zdGFsbCBwcm94eSDigJQgd2hpY2ggcmVqZWN0c1xuICAgIC8vIGBucG0gcHVibGlzaGAgd2l0aCA0MDUgKHNoYXJlZCMxMDcyKS4gYD8/PWAga2VlcHMgYSBkZWxpYmVyYXRlbHkgZGlmZmVyZW50IHJlZ2lzdHJ5LlxuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5yZWdpc3RyeSA/Pz0gJ2h0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyc7XG4gIH1cbiAgY29uc3Qgb3duZXIgPSBjb25maWcucmVwb0F1dGhvcjtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgYXdhaXQgbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKGNvbmZpZywganNvbk9iaik7XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICdidW4gcnVuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGNvbnN0IHNjcmlwdFJ1bm5lciA9ICdidW4gcnVuJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snY29tbW9uL2NpLXNldHVwJ10gPSBgJHtzY3JpcHRSdW5uZXJ9IHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknID8gJ3V2JyA6ICdwb2V0cnknfWBdO1xuICAgICAganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWBdID0gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHB5dGhvblBhY2thZ2VNYW5hZ2VyKTtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcHl0aG9uUnVubmVyID0gYCR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9IHJ1bmA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYCR7cHl0aG9uUnVubmVyfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgJHtweXRob25SdW5uZXJ9IGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gYCR7c2NyaXB0UnVubmVyfSBsaW50YDtcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICAgIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IGdlbkNvZGVTY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIGlmIChzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWcpKSB7XG4gICAgLy8gUHJlc2VydmUgcHJvamVjdC1zcGVjaWZpYyBzdGVwcyBhIHJlcG8gYXBwZW5kZWQgdG8gdGhlIG1hbmFnZWQgYGJ1biB3YiBnZW4tY29kZWAgKGUuZy4gYnVpbGRpbmcgZXh0cmEgZGVwbG95XG4gICAgLy8gYXNzZXRzKSBpbnN0ZWFkIG9mIGRpc2NhcmRpbmcgdGhlbTsgb25seSB0aGUgbWFuYWdlZCBnZW4tY29kZSBzZWdtZW50IGlzIHdiZnkncyB0b1xuICAgIC8vIHJlZ2VuZXJhdGUuIEFuIHVucGFyc2VhYmxlIHNjcmlwdCBpcyBsZWZ0IGFsb25lIHJhdGhlciB0aGFuIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBnZW5Db2RlU2NyaXB0ID09PSB1bmRlZmluZWQgPyBbXSA6IHNwbGl0U2NyaXB0U2VnbWVudHMoZ2VuQ29kZVNjcmlwdCk7XG4gICAgY29uc3QgY3VzdG9tU2VnbWVudHMgPSBzZWdtZW50cz8uZmlsdGVyKFxuICAgICAgKHNlZ21lbnQpID0+IGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBqc29uT2JqLnNjcmlwdHMsIHRydWUpID09PSAnY3VzdG9tJ1xuICAgICk7XG4gICAgaWYgKGN1c3RvbVNlZ21lbnRzKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBbJ2J1biB3YiBnZW4tY29kZScsIC4uLmN1c3RvbVNlZ21lbnRzXS5qb2luKCcgJiYgJyk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLmNoYWtyYSB8fCBjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCBjb25maWcuZGVwZW5kaW5nLnByaXNtYTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gZm9ybWF0U2NyaXB0ID8gYCR7Zm9ybWF0U2NyaXB0fSAmJiBidW4gcnVuIGZvcm1hdC1jb2RlYCA6ICdidW4gcnVuIGZvcm1hdC1jb2RlJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlnTWpzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5tanMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ01qc1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai50eXBlID0gJ21vZHVsZSc7XG5cbiAgY29uc3QgY29uZmlnRHRzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLnRzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdEdHNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmouZmlsZXMgPSBbLi4ubmV3IFNldChbLi4uKGpzb25PYmouZmlsZXMgPz8gW10pLCAnY29uZmlnLmQubXRzJ10pXTtcbiAgLy8gTm9kZU5leHQgcmVzb2x2ZXMgYSByZWxhdGl2ZSBgLi9jb25maWcubWpzYCBpbXBvcnQgdG8gYGNvbmZpZy5kLm10c2AsIG5vdFxuICAvLyB0aGUgcGFja2FnZS1sZXZlbCBgdHlwZXNgIGZpZWxkLiBLZWVwIHRoZSBwdWJsaXNoZWQgY29uZmlnIGltcG9ydGFibGUgZnJvbVxuICAvLyBwYWNrYWdlLWxvY2FsIFR5cGVTY3JpcHQgbGludGVyIHNldHRpbmdzLlxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpKTtcbn1cblxuY29uc3QgY29uZmlnRG10c0NvbnRlbnQgPSBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vY29uZmlnLmpzJztcbmA7XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLCBqc29uT2JqKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwXSk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLCBqc29uT2JqKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAganNvbk9iajogUGFja2FnZUpzb25cbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKS5maWx0ZXIoXG4gICAgKGRlcGVuZGVuY3kpID0+XG4gICAgICBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSAmJlxuICAgICAgLy8gQSBwdWJsaWMgcGFja2FnZSdzIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgbXVzdCBuZXZlciBiZSByZS1tYW5hZ2VkIHZpYSBhIHJlZ2lzdHJ5IGluc3RhbGxcbiAgICAgIC8vIChwcml2YXRlIG9uZXMgYXJlIG5vcm1hbGl6ZWQgdG8gYHdvcmtzcGFjZToqYCBsYXRlcikuIFRoaXMgYWxzbyBjb3ZlcnMgcnVubmluZyB3YmZ5IG9uIGFcbiAgICAgIC8vIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSwgd2hlcmUgdGhlIHBhcmVudCdzIHdvcmtzcGFjZXMgYXJlIGludmlzaWJsZSBhbmQgdGhlIHdvcmtzcGFjZS1tYXBcbiAgICAgIC8vIGd1YXJkIGluIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIGNhbm5vdCBwcm90ZWN0IHRoZSBzcGVjaWZpZXIuXG4gICAgICAoanNvbk9iai5wcml2YXRlIHx8ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKVxuICApO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0ganNvbk9ialtrZXldO1xuICAgIGlmIChzZWN0aW9uICYmIE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogdm9pZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gICAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyICYmIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzKV07XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5Jykge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKCd1dicsIFsnYWRkJywgJy0tZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5JyB8ICd1dicgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSByZXR1cm4gJ3V2JztcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHJldHVybiAncG9ldHJ5Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiAncG9ldHJ5JyB8ICd1dicpOiBzdHJpbmcge1xuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICd1dicpIHJldHVybiAndXYgc3luYyAtLWZyb3plbic7XG4gIC8vIGBtaXNlIHdoaWNoIHB5dGhvbmAgeWllbGRzIHRoZSBzaW5nbGUgYWN0aXZlIGludGVycHJldGVyIHBhdGg7IGBtaXNlIGN1cnJlbnQgcHl0aG9uYCBjYW5cbiAgLy8gcHJpbnQgbXVsdGlwbGUgc3BhY2Utc2VwYXJhdGVkIHZlcnNpb25zIChtaXNlIHN1cHBvcnRzIG11bHRpLXZlcnNpb24gcGlucyksIHdoaWNoIHdvdWxkIHBhc3NcbiAgLy8gZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gYHBvZXRyeSBlbnYgdXNlYC4gV2hlbiBtaXNlIGlzIG1pc3Npbmcgb3IgcHl0aG9uIGlzXG4gIC8vIHVuY29uZmlndXJlZCwgc2tpcCBgcG9ldHJ5IGVudiB1c2VgIGFuZCBmYWxsIGJhY2sgdG8gcG9ldHJ5J3MgZGVmYXVsdCBpbnRlcnByZXRlciBpbnN0ZWFkIG9mXG4gIC8vIGFib3J0aW5nIHRoZSBjaGFpbi5cbiAgLy8gVGhlIGB8fCB0cnVlYCBjb3ZlcnMgb25seSB0aGUgbWlzZSByZXNvbHV0aW9uOiBhIG1pc3NpbmcvdW5jb25maWd1cmVkIG1pc2UgZmFsbHMgYmFjayB0b1xuICAvLyBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyLCB3aGlsZSBhIGZhaWxpbmcgYHBvZXRyeSBlbnYgdXNlYCBzdGlsbCBhYm9ydHMgdGhlIGNoYWluLlxuICByZXR1cm4gJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlICYmIHsgcHl0aG9uX3BhdGg9XCIkKG1pc2Ugd2hpY2ggcHl0aG9uIDI+L2Rldi9udWxsKVwiIHx8IHRydWU7IH0gJiYgeyBbIC16IFwiJHB5dGhvbl9wYXRoXCIgXSB8fCBwb2V0cnkgZW52IHVzZSBcIiRweXRob25fcGF0aFwiOyB9ICYmIHBvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAmJiBwb2V0cnkgaW5zdGFsbCc7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFtcbiAgICAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSkpKSxcbiAgXTtcbiAgc3Bhd25TeW5jKCdidW4nLCBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksICctLWV4YWN0JywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICAvLyBBIHByaXZhdGUgcGFja2FnZSB3aG9zZSBtb25vcmVwbyBjb250YWlucyB0aGlzIGRlcGVuZGVuY3kgYXMgYSB3b3Jrc3BhY2UgbXVzdCByZWZlcmVuY2UgaXRcbiAgICAvLyB2aWEgdGhlIHdvcmtzcGFjZSBwcm90b2NvbDogcGlubmluZyBhIHJlZ2lzdHJ5IHZlcnNpb24gbWFrZXMgQnVuIHNoYWRvdyB0aGUgc2FtZS1uYW1lXG4gICAgLy8gd29ya3NwYWNlIGFuZCBza2lwIGluc3RhbGxpbmcgdGhlIHdvcmtzcGFjZSdzIG93biBkZXBlbmRlbmNpZXMuIChQdWJsaXNoZWQgcGFja2FnZXMgaW5zdGVhZFxuICAgIC8vIHBpbiBhIGNvbmNyZXRlIHZlcnNpb24gYmVjYXVzZSBgbnBtIHB1Ymxpc2hgIHJlamVjdHMgYHdvcmtzcGFjZToqYCBzcGVjaWZpZXJzIOKAlCBidXQgYW5cbiAgICAvLyBFWElTVElORyBgd29ya3NwYWNlOmAgZGVjbGFyYXRpb24gaXMgYWx3YXlzIGtlcHQ6IG92ZXJ3cml0aW5nIGl0IHdpdGggYSByZWdpc3RyeSByZWxlYXNlXG4gICAgLy8gd291bGQgc2lsZW50bHkgYnJlYWsgdGhlIGxvY2FsIHdvcmtzcGFjZSBsaW5rLilcblxuICAgIC8vIEEgZGVjbGFyZWQgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBhbHdheXMgd2lucywgd2hldGhlciBvciBub3QgdGhlIHdvcmtzcGFjZSBtYXAgc2VlcyB0aGVcbiAgICAvLyBwYWNrYWdlOiBydW5uaW5nIHdiZnkgb24gYSBtb25vcmVwbyBTVUJESVJFQ1RPUlkgaGlkZXMgdGhlIHBhcmVudCdzIHdvcmtzcGFjZXMsIHNvIHRoZSBtYXBcbiAgICAvLyBhbG9uZSBjYW5ub3QgYmUgdHJ1c3RlZCB0byBkZXRlY3QgYSBsb2NhbCB3b3Jrc3BhY2UgbGluay5cbiAgICBpZiAocGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgaWYgKGpzb25PYmoucHJpdmF0ZSkge1xuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9ICd3b3Jrc3BhY2U6Kic7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGpzb25PYmoucHJpdmF0ZSAmJiBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS5oYXMoZGVwZW5kZW5jeSkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWVyID0gcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIWV4aXN0aW5nU3BlY2lmaWVyIHx8IGV4aXN0aW5nU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9ICd3b3Jrc3BhY2U6Kic7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQW4gZXhpc3RpbmcgQ09OQ1JFVEUgcGluIG9uIGEgd29ya3NwYWNlIHBhY2thZ2UgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSBhbmQgbXVzdCBub3QgYmVcbiAgICAgIC8vIGNvbnZlcnRlZCB0byB0aGUgd29ya3NwYWNlIHByb3RvY29sLiBOb3RlIHRoZSB0cmFkZS1vZmYgZWl0aGVyIHdheTogbnBtICh3aGljaFxuICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gc2hlbGxzIG91dCB0bykgY2Fubm90IHBhcnNlIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXJzLCB3aGlsZVxuICAgICAgLy8gYSByZWdpc3RyeSBwaW4gbWFrZXMgYSBjb2xkIGJ1biBpbnN0YWxsIHNoYWRvdyB0aGUgd29ya3NwYWNlIGFuZCBza2lwIGl0cyBkZXBlbmRlbmNpZXMg4oCUXG4gICAgICAvLyBXaWxsQm9vc3Rlci9zaGFyZWQga2VlcHMgYHdvcmtzcGFjZToqYCBhbmQgc3RyaXBzIHRoZSBwcm90b2NvbCBvbiB0aGUgQ0kgY2hlY2tvdXQgcmlnaHRcbiAgICAgIC8vIGJlZm9yZSByZWxlYXNpbmcgKHNjcmlwdHMvc3RyaXBXb3Jrc3BhY2VQcm90b2NvbC5tanMpLiBGYWxsIHRocm91Z2ggc28gYSBjb25jcmV0ZSBwaW5cbiAgICAgIC8vIGtlZXBzIGJlaW5nIGJ1bXBlZCBsaWtlIGFueSBtYW5hZ2VkIGRlcGVuZGVuY3kuXG4gICAgfVxuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSA9IHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gICAgICBjb25maWcsXG4gICAgICByb290Q29uZmlnLFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBjb25zdCBtYW5hZ2VkVmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICAgICAgaWYgKHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeSwgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0sIG1hbmFnZWRWZXJzaW9uKSkge1xuICAgICAgICAvLyBgYnVuIGFkZCBkZXBlbmRlbmN5YCBwcmVzZXJ2ZXMgYW4gZXhpc3RpbmcgZXhhY3QgcGluLCBzbyB3cml0ZSB0aGUgYWdlLWNsZWFyZWQgdmVyc2lvblxuICAgICAgICAvLyBkaXJlY3RseS4gVGhlIGZpbmFsIHJlcG9zaXRvcnktd2lkZSBpbnN0YWxsIHJlZnJlc2hlcyB0aGUgbG9ja2ZpbGUgYWZ0ZXIgZXZlcnkgcGFja2FnZVxuICAgICAgICAvLyBtYW5pZmVzdCBoYXMgY29udmVyZ2VkIG9uIHRoZSBnZW5lcmF0ZWQgcmVsZWFzZS1hZ2UgcG9saWN5LlxuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IG1hbmFnZWRWZXJzaW9uO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRlcGVuZGVuY2llc1RvSW5zdGFsbC5wdXNoKGRlcGVuZGVuY3kpO1xuICAgICAgaWYgKCFza2lwQWRkaW5nRGVwcykgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICYmXG4gICAgICAhc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ICYmXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAhPT0gJyonXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICAgIGlmIChsYXRlc3RWZXJzaW9uID09PSAnKicgJiYgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIGNvbnRpbnVlO1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICBpZiAoIXJlbGF0aXZlRmlsZVBhdGgpIHJldHVybjtcblxuICAvLyBSZXVzZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBvd24gZm9ybWF0dGVyIGFmdGVyIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uIHNvXG4gIC8vIHBhY2thZ2UuanNvbiBtYXRjaGVzIHdoYXRldmVyIGl0cyBjdXJyZW50IHNvcnQtcGFja2FnZS1qc29uIHZlcnNpb24gZXhwZWN0cy5cbiAgLy8gVGhpcyBhdm9pZHMgZm9sbG93LXVwIGF1dG9maXggY29tbWl0cyBjYXVzZWQgb25seSBieSBmb3JtYXR0ZXIgdmVyc2lvbiBkcmlmdFxuICAvLyBiZXR3ZWVuIHdiZnkgYW5kIHRoZSBwcm9qZWN0IGJlaW5nIHVwZGF0ZWQuXG4gIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgdXNlZERlcGVuZGVuY2llczogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VkRGVwZW5kZW5jeVNldCA9IG5ldyBTZXQodXNlZERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gYXdhaXQgZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodXNlZERlcGVuZGVuY3lTZXQuaGFzKGRlcGVuZGVuY3kpIHx8IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIGJhc2UtY29uZmlnIHBhY2thZ2VzLiBSZW1vdmUgc3RhbGUgdmFyaWFudHMgd2hlbiByZXBvXG4gICAgLy8gY2FwYWJpbGl0aWVzIGNoYW5nZSwgc3VjaCBhcyBOZXh0LmpzIHRha2luZyBvd25lcnNoaXAgb2YgdHNjb25maWcuanNvbi5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RzY29uZmlnKi5qc29uJywge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgLy8gVHlwZVNjcmlwdCA3J3MgbmF0aXZlIGNvbXBpbGVyIGRyb3BwZWQgdGhlIGluLXByb2Nlc3MgYHBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb25gXG4gICAgLy8gaGVscGVyLCBzbyBwYXJzZSB0aGUgdHNjb25maWcgaW50byBhbiBBU1QgYW5kIHJlYWQgaXRzIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZGlyZWN0bHkuXG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGFic29sdXRlRmlsZVBhdGgpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHBhcnNlZC5gKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlKSkge1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXM7XG59XG5cbi8qKiBSZWFkcyB0aGUgdG9wLWxldmVsIGBleHRlbmRzYCBlbnRyaWVzIChhIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzKSBmcm9tIGEgcGFyc2VkIHRzY29uZmlnLiAqL1xuZnVuY3Rpb24gcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nW10ge1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2UpKSB7XG4gICAgaWYgKGFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgJiYgYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSAmJiBwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICdleHRlbmRzJykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHZhbHVlcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHJlYWRvbmx5IGFzdC5PYmplY3RMaXRlcmFsRWxlbWVudExpa2VbXSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHNvdXJjZS5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKGFzdC5pc0V4cHJlc3Npb25TdGF0ZW1lbnQoc3RhdGVtZW50KSAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbikpIHtcbiAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5wcm9wZXJ0aWVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKG5vZGU6IGFzdC5FeHByZXNzaW9uLCB2YWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGlmIChhc3QuaXNTdHJpbmdMaXRlcmFsKG5vZGUpKSB7XG4gICAgdmFsdWVzLnB1c2gobm9kZS50ZXh0KTtcbiAgfSBlbHNlIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG5vZGUuZWxlbWVudHMpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKGVsZW1lbnQsIHZhbHVlcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj5bXSB7XG4gIHJldHVybiBkZXBlbmRlbmN5U2VjdGlvbktleXNcbiAgICAubWFwKChrZXkpID0+IGpzb25PYmpba2V5XSlcbiAgICAuZmlsdGVyKChzZWN0aW9uKTogc2VjdGlvbiBpcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+ICEhc2VjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChkZXBlbmRlbmN5KTtcbiAgaWYgKGNhY2hlZFZlcnNpb24pIHJldHVybiBjYWNoZWRWZXJzaW9uO1xuXG4gIGNvbnN0IHZlcnNpb24gPSBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGRlcGVuZGVuY3ksIHZlcnNpb24pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSkge1xuICAgIHJldHVybiBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIH1cblxuICByZXR1cm4gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0aW1lcyA9IGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5KTtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgaWYgKGxhdGVzdFZlcnNpb24gIT09ICcqJyAmJiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUodGltZXNbbGF0ZXN0VmVyc2lvbl0pKSB7XG4gICAgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gIH1cblxuICByZXR1cm4gZ2V0QWdlR2F0ZWRWZXJzaW9uc0Rlc2NlbmRpbmcodGltZXMpWzBdID8/ICcqJztcbn1cblxuLyoqIEV2ZXJ5IHN0YWJsZSByZWxlYXNlIGluIGB0aW1lc2AgdGhhdCBhbHJlYWR5IGNsZWFyZWQgdGhlIGFnZSBnYXRlLCBuZXdlc3QgZmlyc3QuICovXG5mdW5jdGlvbiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRpbWVzKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gc2VtdmVyLnZhbGlkKHZlcnNpb24pKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gKHNlbXZlci5wcmVyZWxlYXNlKHZlcnNpb24pPy5sZW5ndGggPz8gMCkgPT09IDApXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkpKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gbm93IC0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkgPj0gcGFja2FnZUFnZUdhdGVNcylcbiAgICAudG9Tb3J0ZWQoKFt2ZXJzaW9uQV0sIFt2ZXJzaW9uQl0pID0+IHNlbXZlci5yY29tcGFyZSh2ZXJzaW9uQSwgdmVyc2lvbkIpKVxuICAgIC5tYXAoKFt2ZXJzaW9uXSkgPT4gdmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZShwdWJsaXNoZWRBdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcHVibGlzaGVkQXQpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHVibGlzaGVkVGltZSA9IERhdGUucGFyc2UocHVibGlzaGVkQXQpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHB1Ymxpc2hlZFRpbWUpICYmIERhdGUubm93KCkgLSBwdWJsaXNoZWRUaW1lID49IHBhY2thZ2VBZ2VHYXRlTXM7XG59XG5cbmZ1bmN0aW9uIGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBkZXBlbmRlbmN5LnJlcGxhY2UoL0BbXkAvXSskL3UsICcnKTtcbiAgY29uc3QgY2FjaGVkVGltZXMgPSBucG1QYWNrYWdlVGltZXNDYWNoZS5nZXQocGFja2FnZU5hbWUpO1xuICBpZiAoY2FjaGVkVGltZXMpIHJldHVybiBjYWNoZWRUaW1lcztcblxuICBjb25zdCBzdGRvdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ25wbScsXG4gICAgWydzaG93JywgcGFja2FnZU5hbWUsICd0aW1lJywgJy0tanNvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSxcbiAgICBwcm9jZXNzLmN3ZCgpXG4gICk7XG4gIGlmICghc3Rkb3V0KSByZXR1cm4ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0ZG91dCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XTtcbiAgICBjb25zdCB0aW1lcyA9IEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZFswXSA6IHBhcnNlZDtcbiAgICBpZiAoIXRpbWVzKSByZXR1cm4ge307XG4gICAgbnBtUGFja2FnZVRpbWVzQ2FjaGUuc2V0KHBhY2thZ2VOYW1lLCB0aW1lcyk7XG4gICAgcmV0dXJuIHRpbWVzO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gS2VlcCBtYW5hZ2VkIGZpcnN0LXBhcnR5IHBhY2thZ2VzIGFsaWduZWQgd2l0aCBCdW4ncyBleHBsaWNpdCBleGVtcHRpb25zLiB3YmZ5J3MgZ2VuZXJhdGVkXG4gIC8vIGNvbmZpZ3VyYXRpb24gY2FuIHJlbHkgb24gdGhlIGN1cnJlbnQgd2IgY29udHJhY3QsIHNvIGluZGVwZW5kZW50bHkgc29ha2luZyBvciBkb3duZ3JhZGluZyB3YlxuICAvLyB3b3VsZCBwYWlyIG5ldyBnZW5lcmF0ZWQgZmlsZXMgd2l0aCBhbiBpbmNvbXBhdGlibGUgb2xkIENMSS4gVGhvc2UgcGFja2FnZXMgYXJlIHJlbGVhc2VkIGFuZFxuICAvLyBmaXhlZCBhdCB0aGVpciBzb3VyY2UgaW5zdGVhZDsgb25seSBwYWNrYWdlcyBCdW4gaXRzZWxmIGdhdGVzIG1heSBiZSBzZWxlY3RlZCBmcm9tIG9sZGVyIHRhZ3MuXG4gIHJldHVybiAhYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5zb21lKChwYXR0ZXJuKSA9PiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuLCBkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJuID09PSBkZXBlbmRlbmN5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgvWy4rP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApLnJlcGxhY2VBbGwoJyonLCAnLionKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgLCAndScpLnRlc3QoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBObyBjYWNoZSBoZXJlOiB0aGUgb25seSBjYWxsZXIgY2hhaW4gZ29lcyB0aHJvdWdoIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uLCB3aGljaCBhbHJlYWR5XG4gIC8vIG1lbW9pemVzIHBlciBkZXBlbmRlbmN5LCBzbyB0aGlzIGNhbiBydW4gYXQgbW9zdCBvbmNlIHBlciBkZXBlbmRlbmN5LlxuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBkZXBlbmRlbmN5LCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSwgcHJvY2Vzcy5jd2QoKSkgfHwgJyonO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFR5cGVTY3JpcHQgaXMgdmVyc2lvbi1jYXBwZWQgaW4gQmxpdHogcmVwb3NpdG9yaWVzLCBzbyBpdHMgaW5zdGFsbCBzcGVjaWZpZXIgbXVzdCBjYXJyeSB0aGVcbiAgLy8gbWFuYWdlZCB2ZXJzaW9uIOKAlCBhIGJhcmUgYGJ1biBhZGRgIHdvdWxkIGluc3RhbGwgdGhlIGluY29tcGF0aWJsZSBsYXRlc3QuXG4gIGlmIChkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0RGVwZW5kZW5jeSAmJiBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpKSB7XG4gICAgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Z2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSl9YDtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jeTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlcG9zaXRvcnkgY29udGFpbnMgYSBCbGl0eiBhcHAgKHRoZSBjdXJyZW50IHBhY2thZ2Ugb3IgdGhlIHdvcmtzcGFjZSByb290KS4gKi9cbmZ1bmN0aW9uIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCByb290Q29uZmlnLmRlcGVuZGluZy5ibGl0ejtcbn1cblxuY29uc3Qgd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4vKiogTWFwIGZyb20gZWFjaCB3b3Jrc3BhY2UgcGFja2FnZSdzIG5hbWUgdG8gaXRzIGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZS5nZXQocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCB3b3Jrc3BhY2VEaXJzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290Q29uZmlnKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgaWYgKHdvcmtzcGFjZVBhY2thZ2VKc29uLm5hbWUpIHtcbiAgICAgICAgd29ya3NwYWNlRGlyc0J5TmFtZS5zZXQod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIHVucGFyc2FibGUgd29ya3NwYWNlIHBhY2thZ2UuanNvblxuICAgIH1cbiAgfVxuICB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLnNldChyb290Q29uZmlnLmRpclBhdGgsIHdvcmtzcGFjZURpcnNCeU5hbWUpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyc0J5TmFtZTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGN1cnJlbnRWZXJzaW9uID09PSAnKicpIHJldHVybiB0cnVlO1xuICBpZiAoaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkgcmV0dXJuIHRydWU7XG4gIGlmICghbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgY29uc3QgY3VycmVudFZhbGlkVmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIC8vIEEgVHlwZVNjcmlwdCA3IHBpbiBpbiBhIEJsaXR6IHJlcG9zaXRvcnkgaXMgbGlrZXdpc2UgaW5jb21wYXRpYmxlIChgbmV4dCBidWlsZGAgZmFpbHMgb25cbiAgLy8gdGhlIE5leHQuanMgMTUgdGhhdCBCbGl0eiBwaW5zIOKAlCBzZWUgZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKSwgc28gcmV3cml0ZSBpdCB0byB0aGVcbiAgLy8gY2FwcGVkIHJlbGVhc2UgaW5zdGVhZCBvZiBwcmVzZXJ2aW5nIGl0IHZpYSB0aGUgbm8tZG93bmdyYWRlIHJ1bGUgYmVsb3cuIFRoZSBwaW4gbWF5IGJlIGFcbiAgLy8gUkFOR0UgKGUuZy4gYF43LjAuMGApLCB3aGljaCBzZW12ZXIudmFsaWQgcmVqZWN0cyDigJQganVkZ2UgdGhlIG1ham9yIGZyb20gdGhlIHJhbmdlIG1pbmltdW0uXG4gIGNvbnN0IGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiA9XG4gICAgY3VycmVudFZhbGlkVmVyc2lvbiA/PyAoc2VtdmVyLnZhbGlkUmFuZ2UoY3VycmVudFZlcnNpb24pID8gc2VtdmVyLm1pblZlcnNpb24oY3VycmVudFZlcnNpb24pPy52ZXJzaW9uIDogdW5kZWZpbmVkKTtcbiAgaWYgKFxuICAgIGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmXG4gICAgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSAmJlxuICAgIGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiAmJlxuICAgIHNlbXZlci5tYWpvcihjdXJyZW50VHlwZXNjcmlwdFZlcnNpb24pID49IDcgJiZcbiAgICBzZW12ZXIudmFsaWQobWFuYWdlZFZlcnNpb24pICYmXG4gICAgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbilcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gVGhlIGdlbmVyYXRlZCBidW5maWcgYXBwbGllcyB0aGUgb3JnYW5pemF0aW9uIGFnZSBnYXRlIGV2ZW4gdG8gZXhhY3QgcGlucy4gSWYgYSBtYW5hZ2VkXG4gIC8vIHRoaXJkLXBhcnR5IHRvb2wgaXMgbmV3ZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UgdGhhdCBjbGVhcmVkIHRoYXQgZ2F0ZSwgcHJlc2VydmluZyB0aGUgcGluXG4gIC8vIHByb2R1Y2VzIGEgcGFja2FnZS5qc29uIHRoYXQgYSBmcmVzaCBpbnN0YWxsIHdpdGhvdXQgdGhlIG9sZCBsb2NrZmlsZSBjYW5ub3QgcmVzb2x2ZSAobm90YWJseVxuICAvLyBvcHRpbWl6ZWQgRG9ja2VyIGJ1aWxkcykuIEtlZXAgdGhlIG5vLWRvd25ncmFkZSBwb2xpY3kgb25seSB3aGVuIHRoZSBkZXBlbmRlbmN5IGlzIGV4ZW1wdCBmcm9tXG4gIC8vIHRoZSBnYXRlOyBhZ2UtZ2F0ZWQgbWFuYWdlZCB0b29scyBtdXN0IGNvbnZlcmdlIG9uIHRoZSB2ZXJzaW9uIHRoZSBnZW5lcmF0ZWQgYnVuZmlnIGFjY2VwdHMuXG4gIGlmIChzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyB3YmZ5IG93bnMgdGhlc2UgdG9vbCBkZXBlbmRlbmNpZXMsIGJ1dCBhcHBseWluZyB3YmZ5IHNob3VsZCBub3QgZG93bmdyYWRlIGFcbiAgLy8gcmVwb3NpdG9yeSB0aGF0IGFscmVhZHkgcGlucyBhIG5ld2VyIHJldmlld2VkIHJlbGVhc2Ugd2hlbiB0aGUgb3JnIHBvbGljeSBleGVtcHRzIGl0LlxuICByZXR1cm4gaXNOZXdlclBhY2thZ2VWZXJzaW9uKG1hbmFnZWRWZXJzaW9uLCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWFuYWdlZFZlcnNpb246IHN0cmluZ1xuKTogY3VycmVudFZlcnNpb24gaXMgc3RyaW5nIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRNYW5hZ2VkVmVyc2lvbiA9IHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbik7XG4gIHJldHVybiAoXG4gICAgc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSAmJlxuICAgIHZhbGlkQ3VycmVudFZlcnNpb24gIT09IG51bGwgJiZcbiAgICB2YWxpZE1hbmFnZWRWZXJzaW9uICE9PSBudWxsICYmXG4gICAgc2VtdmVyLmd0KHZhbGlkQ3VycmVudFZlcnNpb24sIHZhbGlkTWFuYWdlZFZlcnNpb24pXG4gICk7XG59XG5cbi8vIFRoZSBuZXdlc3QgVHlwZVNjcmlwdCA2IHJlbGVhc2UgYXQgdGhlIHRpbWUgdGhlIEJsaXR6IGNhcCBzaGlwcGVkOyB1c2VkIG9ubHkgd2hlbiB0aGUgcmVnaXN0cnlcbi8vIGxvb2t1cCBmb3IgdGhlIGFjdHVhbCBuZXdlc3QgcHJlLXY3IHJlbGVhc2UgZmFpbHMgKHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLlxuY29uc3QgbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbiA9ICc2LjAuMyc7XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICAvLyBCbGl0eiBwaW5zIE5leHQuanMgMTUsIHdob3NlIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgcmVxdWlyZXMgdGhlIGNsYXNzaWNcbiAgICAvLyBgdHlwZXNjcmlwdGAgY29tcGlsZXIgQVBJOyB0aGUgVHlwZVNjcmlwdCA3IGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIGJpbmFyeVxuICAgIC8vIHdpdGhvdXQgdGhhdCBBUEksIHNvIGBuZXh0IGJ1aWxkYCBhYm9ydHMgd2l0aCBcIkZhaWxlZCB0byBpbnN0YWxsIHJlcXVpcmVkIFR5cGVTY3JpcHRcbiAgICAvLyBkZXBlbmRlbmNpZXNcIiAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuIENhcCBgdHlwZXNjcmlwdGAgYmVsb3cgNyB1bnRpbFxuICAgIC8vIEJsaXR6IHN1cHBvcnRzIGEgTmV4dC5qcyByZWxlYXNlIHRoYXQgdW5kZXJzdGFuZHMgdHNnby4gQSBmYWlsZWQgcmVnaXN0cnkgbG9va3VwIG11c3RcbiAgICAvLyByZXNvbHZlIHRvIGEga25vd24tY29tcGF0aWJsZSByZWxlYXNlIOKAlCBmYWxsaW5nIGJhY2sgdG8gbGF0ZXN0VmVyc2lvbiB3b3VsZCByZWluc3RhbGwgdGhlXG4gICAgLy8gaW5jb21wYXRpYmxlIFR5cGVTY3JpcHQgNy5cbiAgICBjb25zdCB2YWxpZExhdGVzdFZlcnNpb24gPSBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbik7XG4gICAgaWYgKHZhbGlkTGF0ZXN0VmVyc2lvbiAmJiBzZW12ZXIubWFqb3IodmFsaWRMYXRlc3RWZXJzaW9uKSA8IDcpIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICAgIC8vIFRoZSBjYXBwZWQgbG9va3VwIG11c3QgcmVzcGVjdCB0aGUgYWdlIGdhdGUgdG9vOiB0aGlzIHZlcnNpb24gaXMgd3JpdHRlbiBhcyBhbiBleGFjdCBwaW4sXG4gICAgLy8gYW5kIEJ1biByZWZ1c2VzIHRvIHJlc29sdmUgb25lIHB1Ymxpc2hlZCBpbnNpZGUgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93LiBUaGVyZSBpcyBub1xuICAgIC8vIHVuZ2F0ZWQgZmFsbGJhY2sg4oCUIHdpdGhvdXQgcHVibGljYXRpb24gbWV0YWRhdGEgdGhlIGFnZSBvZiBhIHJhbmdlIHJlc3VsdCBpcyB1bmtub3duLCBzbyBhXG4gICAgLy8gcGFydGlhbCByZWdpc3RyeSBmYWlsdXJlIHdvdWxkIG90aGVyd2lzZSB3cml0ZSBhIHZlcnNpb24gQnVuIHRoZW4gcmVmdXNlcyB0byBpbnN0YWxsLlxuICAgIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZFZlcnNpb25CZWxvdyh0eXBlc2NyaXB0RGVwZW5kZW5jeSwgJzcuMC4wJykgPz8gbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBUaGUgaGlnaGVzdCByZWxlYXNlIG9mIGBwYWNrYWdlTmFtZWAgYmVsb3cgYGV4Y2x1c2l2ZVVwcGVyQm91bmRgIHRoYXQgYWxyZWFkeSBjbGVhcmVkIHRoZSBhZ2VcbiAqIGdhdGUsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSByZWdpc3RyeSBsb29rdXAgZmFpbHMgb3Igbm8gc3VjaCByZWxlYXNlIGV4aXN0cyB5ZXQuXG4gKi9cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHBhY2thZ2VOYW1lOiBzdHJpbmcsIGV4Y2x1c2l2ZVVwcGVyQm91bmQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyhnZXROcG1QYWNrYWdlVGltZXMocGFja2FnZU5hbWUpKS5maW5kKCh2ZXJzaW9uKSA9PlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBleGNsdXNpdmVVcHBlckJvdW5kKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyUGFja2FnZVZlcnNpb24oY2FuZGlkYXRlVmVyc2lvbjogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChjYW5kaWRhdGVWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIHJldHVybiAhdmFsaWRMYXRlc3RWZXJzaW9uIHx8ICF2YWxpZEN1cnJlbnRWZXJzaW9uIHx8IHNlbXZlci5ndCh2YWxpZExhdGVzdFZlcnNpb24sIHZhbGlkQ3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHNcbiAgICAvLyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgICBjbGVhbnVwOiAnYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgIGZvcm1hdDogYGJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICBsaW50OiBgYnVuIHdiIGxpbnRgLFxuICAgICdsaW50LWZpeCc6ICdidW4gd2IgbGludCAtLWZpeCcsXG4gICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICB0eXBlY2hlY2s6ICdidW4gd2IgdHlwZWNoZWNrJyxcbiAgICB2ZXJpZnk6ICdidW4gd2IgdmVyaWZ5JyxcbiAgICAndmVyaWZ5LWZ1bGwnOiAnYnVuIHdiIHZlcmlmeSAtLWZ1bGwnLFxuICB9O1xuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGFwcGx5VGVzdE9uQ2lTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIH1cbiAgYXBwbHlUZXN0U2NyaXB0KGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ3Rlc3QnLCAndmVyaWZ5LWZ1bGwnXSk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgYGJ1biAke2dldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZyl9YCk7XG4gIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICcgJiYgcHlyaWdodCc7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbi8vIENJIHdvcmtmbG93cyAoYm90aCB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBhbmQgdGhlIHNlbGYtY29udGFpbmVkIHZhcmlhbnQgZm9yIG5vbi1XaWxsQm9vc3RlclxuLy8gcmVwb3NpdG9yaWVzKSBwcmVmZXIgYHRlc3QvY2lgIG92ZXIgYHRlc3RgLCBzbyBzdGFuZGFyZGl6ZSBpdCBvbiBgd2IgdGVzdC1vbi1jaWAgYXQgdGhlIHJvb3Qg4oCUXG4vLyBgd2IgdGVzdC1vbi1jaWAgYWxyZWFkeSBpdGVyYXRlcyB3b3Jrc3BhY2UgcGFja2FnZXMgaXRzZWxmLlxuZnVuY3Rpb24gYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbJ3Rlc3QvY2knXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBDSSB0ZXN0cyB3aXRoIGV4dHJhIHN0ZXBzIChlLmcuIHNlbGVjdGluZyBzcGVjIGZpbGVzIG9yIHJ1bm5pbmcgcmF3XG4gIC8vIFBsYXl3cmlnaHQpIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5OyBzdWNoIHdyYXBwZXJzIGFyZSBwcmVzZXJ2ZWQuXG4gIHNjcmlwdHNbJ3Rlc3QvY2knXSA9IG9sZFNjcmlwdCAmJiAhaXNHZW5lcmF0ZWRUZXN0T25DaVNjcmlwdChvbGRTY3JpcHQpID8gb2xkU2NyaXB0IDogJ2J1biB3YiB0ZXN0LW9uLWNpJztcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIGdlbmVyYXRlZCBgd2IgdGVzdC1vbi1jaWAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKipcbiAqIGB3YiB0ZXN0YCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCB0ZXN0IHJ1bm5lcnMgb25seSwgc28gcmVwbGFjaW5nIHRoZSBgdGVzdGAgc2NyaXB0IG9mIGFcbiAqIHBhY2thZ2Ugd3JpdHRlbiBpbiBhbm90aGVyIGxhbmd1YWdlIChlLmcuIGEgTWF2ZW4gb3IgYW4gUlNwZWMgcGFja2FnZSBpbiBhIHBvbHlnbG90IG1vbm9yZXBvKVxuICogc2lsZW50bHkgZHJvcHMgaXRzIHdob2xlIHN1aXRlOiB0aGUgZ2VuZXJhdGVkIHNjcmlwdCB0aGVuIHN1Y2NlZWRzIHdpdGhvdXQgcnVubmluZyBhbnl0aGluZy5cbiAqIFN1Y2ggYSBwYWNrYWdlIGtlZXBzIGl0cyBvd24gYHRlc3RgIHNjcmlwdDsgSlMvVFMgcGFja2FnZXMgYXJlIHN0YW5kYXJkaXplZCBhcyB1c3VhbC5cbiAqL1xuZnVuY3Rpb24gYXBwbHlUZXN0U2NyaXB0KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHNcbik6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzLnRlc3Q/LnRyaW0oKTtcbiAgaWYgKCFvbGRTY3JpcHQgfHwgZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBpc0dlbmVyYXRlZFRlc3RTY3JpcHQob2xkU2NyaXB0KSkgcmV0dXJuO1xuICBzY3JpcHRzLnRlc3QgPSBvbGRTY3JpcHQ7XG59XG5cbi8qKiBXaGV0aGVyIGEgc2NyaXB0IGJvZHkgaXMgb25lIG9mIHRoZSBLTk9XTiBnZW5lcmF0ZWQgYHdiIHRlc3RgIGludm9jYXRpb25zLiAqL1xuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0U2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3QnO1xufVxuXG4vKipcbiAqIEtlZXBzIGEgc2NyaXB0IHRoYXQgQ0hBSU5TIGV4dHJhIGNvbW1hbmRzIG9udG8gdGhlIGdlbmVyYXRlZCBvbmUgKGUuZy4gYSBwb2x5Z2xvdCBtb25vcmVwb1xuICogYXBwZW5kaW5nIGl0cyBNYXZlbiBhbmQgUlNwZWMgc3VpdGVzIHRvIGB3YiB0ZXN0YCwgd2hpY2ggcnVucyBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgcnVubmVyc1xuICogb25seSkuIFN1Y2ggYSB3cmFwcGVyIHN0aWxsIHJ1bnMgdGhlIGdlbmVyYXRlZCBjb21tYW5kLCBzbyByZXBsYWNpbmcgaXQgd291bGQgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJlcG9zaXRvcnkncyBvd24gc3RlcHMg4oCUIHRoZSBzYW1lIHJlYXNvbmluZyBhcyBgYXBwbHlUZXN0T25DaVNjcmlwdGAuIEFuIHVucmVjb2duaXplZCBjaGFpbmVkXG4gKiBzY3JpcHQgaXMga2VwdCB3aG9sZXNhbGUgcmF0aGVyIHRoYW4gbG9zaW5nIGl0cyBwcm9qZWN0LW93bmVkIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBrZWVwR2VuZXJhdGVkU2NyaXB0V3JhcHBlcnMoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHNjcmlwdE5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBzY3JpcHROYW1lcykge1xuICAgIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbc2NyaXB0TmFtZV0/LnRyaW0oKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRTY3JpcHQgPSBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgIGlmICghb2xkU2NyaXB0IHx8ICFnZW5lcmF0ZWRTY3JpcHQgfHwgb2xkU2NyaXB0ID09PSBnZW5lcmF0ZWRTY3JpcHQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGhlYWRSZWdFeHAgPSBuZXcgUmVnRXhwKFxuICAgICAgYF4ke2VzY2FwZVJlZ0V4cChnZW5lcmF0ZWRTY3JpcHQpLnJlcGxhY2VBbGwoJyAnLCBTdHJpbmcucmF3YFsgXFx0XStgKX0oPz1bIFxcXFx0XSooPzomJnxcXFxcfFxcXFx8fDt8XFxcXG4pKWAsXG4gICAgICAndSdcbiAgICApO1xuICAgIC8vIEEgbmV3bGluZSBzZXBhcmF0ZXMgc2hlbGwgY29tbWFuZHMganVzdCBsaWtlICYmLCB8fCBhbmQgOy5cbiAgICBpZiAoaGVhZFJlZ0V4cC50ZXN0KG9sZFNjcmlwdCkpIHtcbiAgICAgIC8vIEEgZnVuY3Rpb24gcmVwbGFjZW1lbnQga2VlcHMgYCRgLXNoYXBlZCBjaGFyYWN0ZXJzIGluIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCBsaXRlcmFsLlxuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdC5yZXBsYWNlKGhlYWRSZWdFeHAsICgpID0+IGdlbmVyYXRlZFNjcmlwdCk7XG4gICAgfSBlbHNlIGlmICgvKD86JiZ8XFx8XFx8fDt8XFxuKS91LnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgd2JEYkNvbW1hbmQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkgcmV0dXJuO1xuXG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLWNyZWF0ZS1taWdyYXRpb24nLCBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZS1kZXZgLCAnbWlncmF0ZS1kZXYnKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChcbiAgICBzY3JpcHRzLFxuICAgIG9sZFNjcmlwdHMsXG4gICAgJ2RiLW1pZ3JhdGUnLFxuICAgIGAke3diRGJDb21tYW5kfSBtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3lgLFxuICAgICdtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3knXG4gICk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLXZpZXcnLCBgJHt3YkRiQ29tbWFuZH0gc3R1ZGlvYCwgJ3N0dWRpbycpO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0KFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lOiBzdHJpbmcsXG4gIGdlbmVyYXRlZFNjcmlwdDogc3RyaW5nLFxuICBnZW5lcmF0ZWRBcmd1bWVudHM6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbbmFtZV07XG4gIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHdyYXAgbWlncmF0aW9uIGNvbW1hbmRzIHRvIHByZXBhcmUgU1FMaXRlIGRpcmVjdG9yaWVzLFxuICAvLyBmYW4gb3V0IG92ZXIgdGVuYW50cywgb3IgcGVyZm9ybSBjbGVhbnVwIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5LlxuICBjb25zdCBnZW5lcmF0ZWRCb2RpZXMgPSBbYGJ1biB3YiBkYiAke2dlbmVyYXRlZEFyZ3VtZW50c31gLCBgYnVuIHdiIHByaXNtYSAke2dlbmVyYXRlZEFyZ3VtZW50c31gXTtcbiAgc2NyaXB0c1tuYW1lXSA9IG9sZFNjcmlwdCAmJiAhZ2VuZXJhdGVkQm9kaWVzLmluY2x1ZGVzKG9sZFNjcmlwdC50cmltKCkpID8gb2xkU2NyaXB0IDogZ2VuZXJhdGVkU2NyaXB0O1xufVxuXG5mdW5jdGlvbiBnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiAnd2IgZGInIHwgJ3diIHByaXNtYScge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiAnd2IgcHJpc21hJztcbiAgcmV0dXJuICd3YiBkYic7XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgLy8gUHJlc2VydmUgYSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYgcHJlZml4IChlLmcuIGBNSVNFX0VOVj10ZXN0YCkgb24gYW4gZXhpc3RpbmcgbWlzZSBicmlkZ2UuXG4gICAgLy8gU3VjaCBhIHByZWZpeCBpcyByZXF1aXJlZCBmb3IgbWlzZSBjb25maWcgZW52aXJvbm1lbnRzIChtaXNlLjxNSVNFX0VOVj4udG9tbCksIHdoaWNoIGFyZVxuICAgIC8vIHNlbGVjdGVkIGZyb20gTUlTRV9FTlYgKmJlZm9yZSogbWlzZSBzdGFydHMgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCBmcm9tIGluc2lkZSBhIHRhc2s7IGRyb3BwaW5nXG4gICAgLy8gaXQgd291bGQgc2lsZW50bHkgcnVuIHRoZSB0YXNrIGluIHRoZSBkZWZhdWx0IGVudmlyb25tZW50LlxuICAgIGNvbnN0IGVudlByZWZpeCA9IGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpO1xuICAgIGlmIChlbnZQcmVmaXggPT09IHVuZGVmaW5lZCAmJiBvbGRTY3JpcHRzW25hbWVdICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGAke2VudlByZWZpeCA/PyAnJ31taXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudi12YXIgcHJlZml4IG9mIGFuIGV4aXN0aW5nIGBtaXNlIHJ1biA8bmFtZT5gIGJyaWRnZSBzY3JpcHRcbiAqIChwb3NzaWJseSBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYnJpZGdlIGhhcyBubyBwcmVmaXgpLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzY3JpcHQgaXMgbm90IGFcbiAqIG1pc2UgYnJpZGdlIGZvciB0aGUgZ2l2ZW4gdGFzay5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEVhY2ggYXNzaWdubWVudCB2YWx1ZSBtYXkgYmUgZG91YmxlLXF1b3RlZCwgc2luZ2xlLXF1b3RlZCwgb3IgYW4gdW5xdW90ZWQgcnVuIG9mIG5vbi13aGl0ZXNwYWNlLFxuICAvLyBzbyBwcmVmaXhlcyBsaWtlIGBNSVNFX0VOVj1cImEgYlwiYCAod2hvc2UgdmFsdWUgY29udGFpbnMgc3BhY2VzKSBhcmUgbWF0Y2hlZCBpbnN0ZWFkIG9mIGRyb3BwZWQuXG4gIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF4oKD86XFx3Kz0oPzpcIlteXCJdKlwifCdbXiddKid8XFxTKylcXHMrKSopbWlzZSBydW4gJHtlc2NhcGVSZWdFeHAobmFtZSl9JGAsICd1JykuZXhlYyhcbiAgICBzY3JpcHQudHJpbSgpXG4gICk7XG4gIHJldHVybiBtYXRjaD8uWzFdO1xufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIG9yZzogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCBvcmc6ICdXaWxsQm9vc3RlcicsIHJlcG86ICdjb2RlLWFuYWx5emVyJywgdGFyZ2V0OiAnZGV2RGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvanVkZ2UnLCBvcmc6ICdXaWxsQm9vc3RlckxhYicsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IG9yZywgcGFja2FnZU5hbWUsIHJlcG8sIHRhcmdldCB9KSA9PiB7XG4gICAgICBpZiAoIXBhY2thZ2VOYW1lcy5oYXMocGFja2FnZU5hbWUpIHx8IGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCBwYWNrYWdlTmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdO1xuICAgICAgY29uc3Qgb3RoZXJUYXJnZXQgPSB0YXJnZXQgPT09ICdkZXBlbmRlbmNpZXMnID8gJ2RldkRlcGVuZGVuY2llcycgOiAnZGVwZW5kZW5jaWVzJztcbiAgICAgIC8vIFRoZSBsaW50IHJ1bGUgZGlzYWxsb3dzIGBkZWxldGVgIHdpdGggY29tcHV0ZWQgcGFja2FnZSBuYW1lczsgUmVmbGVjdCBoYXMgdGhlIHNhbWUgZGVsZXRpb24gc2VtYW50aWNzIGhlcmUuXG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmpbb3RoZXJUYXJnZXRdLCBwYWNrYWdlTmFtZSk7XG4gICAgICBqc29uT2JqW3RhcmdldF1bcGFja2FnZU5hbWVdID0gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihleGlzdGluZ1NwZWNpZmllciwgb3JnLCByZXBvKVxuICAgICAgICA/IGV4aXN0aW5nU3BlY2lmaWVyXG4gICAgICAgIDogYXdhaXQgZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIob3JnLCByZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGV4aXN0aW5nIHNwZWNpZmllciBhbHJlYWR5IHBpbnMgYSBnaXQgcmVmIG9mIHRoZSBleHBlY3RlZCBwcml2YXRlIHJlcG9zaXRvcnkuXG4gKiB3YmZ5IG11c3Qgbm90IGJ1bXAgc3VjaCBwaW5zOiBhIHJ1biBpbnRlbmRlZCBhcyBjb25maWd1cmF0aW9uL3BhY2thZ2UtbWFuYWdlciBtYWludGVuYW5jZVxuICogd291bGQgb3RoZXJ3aXNlIGNoYW5nZSB0aGUgZGVwZW5kZW5jeSdzIHZlcnNpb24gYXMgYSBzaWRlIGVmZmVjdCAodXBkYXRpbmcgcGlucyBpcyBSZW5vdmF0ZSdzXG4gKiBqb2IpLCBwb3NzaWJseSB0byBhIGNvbW1pdCB3aG9zZSBwcmVidWlsdCBhcnRpZmFjdHMgYXJlIG1pc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzUGlubmVkUHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIoXG4gIHNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcmc6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nXG4pOiBzcGVjaWZpZXIgaXMgc3RyaW5nIHtcbiAgaWYgKCFzcGVjaWZpZXIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2AoPzpefFs6L10pJHtvcmd9LyR7cmVwb30oPzpcXC5naXQpPyNcXFMrJGAsICd1JykudGVzdChzcGVjaWZpZXIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmc6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2gob3JnLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbToke29yZ30vJHtyZXBvfS5naXQjJHtjb21taXRIYXNofWA7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2V0R2VuSTE4blRzQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2dlbkkxOG5Ucy5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5pbnRlcmZhY2UgTGVmdGhvb2tTZXR0aW5ncyB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInO1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLWNvbW1pdCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIExlZnRob29rSm9iIHtcbiAgbmFtZTogc3RyaW5nO1xuICBnbG9iPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gIHNjcmlwdD86IHN0cmluZztcbiAgcnVubmVyPzogJ2Jhc2gnO1xuICBzdGFnZV9maXhlZD86IHRydWU7XG59XG5cbmNvbnN0IGJhc2VTZXR0aW5nczogT21pdDxMZWZ0aG9va1NldHRpbmdzLCAncHJlLWNvbW1pdCc+ID0ge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJyxcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAncHJlcGFyZScsXG4gICAgICAgIHNjcmlwdDogJ3ByZXBhcmUuc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NoZWNrJyxcbiAgICAgICAgc2NyaXB0OiAnY2hlY2suc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn07XG5cbi8vIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyB0aGUgdW5xdW90ZWQgbG9vcHMgYmVsb3cga2VlcCBwYXRoc1xuLy8gd2l0aCBzcGFjZXMgaW50YWN0LlxuY29uc3QgcHJlQ29tbWl0U2V0dGluZ3M6IExlZnRob29rU2V0dGluZ3NbJ3ByZS1jb21taXQnXSA9IHtcbiAgam9iczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdjbGVhbnVwJyxcbiAgICAgIGdsb2I6ICcnLFxuICAgICAgcnVuOiAnJyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2NoZWNrLW1pZ3JhdGlvbnMnLFxuICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgcnVuOiBgXG5mYWlsZWQ9MFxuZm9yIGZpbGUgaW4ge3N0YWdlZF9maWxlc307IGRvXG4gIGlmIGdyZXAgLXEgJ1dhcm5pbmdzOicgXCIkZmlsZVwiOyB0aGVuXG4gICAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZSAoJGZpbGUpIGNvbnRhaW5zIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgICBmYWlsZWQ9MVxuICBmaVxuZG9uZVxuZXhpdCBcIiRmYWlsZWRcIlxuYC50cmltKCksXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBidW4gcmVjb3JkcyBhbiBhYnNvbHV0ZSBgcmVzb2x2ZWRgIFVSTCBmb3IgYW4gYWxyZWFkeS1sb2NrZWQgcGFja2FnZSB3aGVuZXZlciB0aGVcbiAgICAgIC8vIGNvbmZpZ3VyZWQgcmVnaXN0cnkgZG9lcyBub3Qgc2VydmUgdGhlIHRhcmJhbGwgaG9zdCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSDigJQgd2hpY2ggaXNcbiAgICAgIC8vIGV4YWN0bHkgd2hhdCB0aGUgVGFrdW1pIEd1YXJkIHByb3h5IGRvZXMuIFNvIGFuIGluc3RhbGwgcnVuIHdpdGggR3VhcmQgYXMgdGhlIGRlZmF1bHRcbiAgICAgIC8vIHJlZ2lzdHJ5IChDSSwgb3IgYSBkZXZlbG9wZXIgd2hvIHB1dCBpdCBpbiB+Ly5ucG1yYykgYmFrZXMgbnBtLmZsYXR0LnRlY2ggVVJMcyBpbnRvXG4gICAgICAvLyBidW4ubG9jaywgYW5kIGNvbW1pdHRpbmcgdGhlbSBwaW5zIGEgU0hBUkVEIGxvY2tmaWxlIHRvIG9uZSBlbnZpcm9ubWVudCdzIG1pcnJvcjogZXZlcnlcbiAgICAgIC8vIGxhdGVyIGluc3RhbGwgZG93bmxvYWRzIHRocm91Z2ggdGhlIHByb3h5LCBhbmQgYSBjb2xkLWNhY2hlIGluc3RhbGwgZmFpbHMgb3V0cmlnaHQgd2l0aFxuICAgICAgLy8gNDAxIGZvciBhbnlvbmUgd2hvc2UgbnBtcmMgY2FycmllcyBhIHJlZ2lzdHJ5Lm5wbWpzLm9yZyB0b2tlbiwgYmVjYXVzZSBidW4gc2VuZHMgdGhlXG4gICAgICAvLyBkZWZhdWx0IHJlZ2lzdHJ5J3MgY3JlZGVudGlhbHMgdG8gd2hhdGV2ZXIgaG9zdCB0aGUgbG9ja2ZpbGUgbmFtZXMuIEd1YXJkIGNvdmVyYWdlIGRvZXNcbiAgICAgIC8vIG5vdCBkZXBlbmQgb24gdGhlc2UgVVJMcyDigJQgd2l0aCBhbiBlbXB0eSBgcmVzb2x2ZWRgLCBidW4gZGVyaXZlcyB0aGUgZG93bmxvYWQgVVJMIGZyb21cbiAgICAgIC8vIHRoZSBjb25maWd1cmVkIHJlZ2lzdHJ5IOKAlCBzbyBzdHJpcCB0aGVtLiBPbmx5IHRoZSBHdWFyZCBob3N0IGlzIHN0cmlwcGVkOiBhIHNjb3BlZFxuICAgICAgLy8gcmVnaXN0cnkgc3VjaCBhcyBWZXJkYWNjaW8gbGVnaXRpbWF0ZWx5IHJlY29yZHMgaXRzIG93biBVUkwgZm9yIHByaXZhdGUgcGFja2FnZXMuXG4gICAgICBuYW1lOiAnbm9ybWFsaXplLWJ1bi1sb2NrZmlsZScsXG4gICAgICBnbG9iOiAnYnVuLmxvY2snLFxuICAgICAgcnVuOiAnYmFzaCAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIE9ubHkgd2lsbGJvb3N0ZXItY29uZmlncyBnZXRzIHRoaXMgam9iOiBldmVyeSBvdGhlciByZXBvc2l0b3J5J3MgcmVub3ZhdGUuanNvbmMgbWVyZWx5XG4gICAgICAvLyBleHRlbmRzIHRoZSBzaGFyZWQgcHJlc2V0LCBhbmQgdGhlIHZhbGlkYXRvciBkb2VzIG5vdCByZXNvbHZlIHJlbW90ZSBwcmVzZXRzLCBzbyBydW5uaW5nIGl0XG4gICAgICAvLyB0aGVyZSB3b3VsZCB2YWxpZGF0ZSB0d28gbGluZXMgYW5kIGNhdGNoIG5vdGhpbmcuIGAtLW5vLWdsb2JhbGAgdmFsaWRhdGVzIHRoZSBwcmVzZXQgYXMgYVxuICAgICAgLy8gcmVwbyBjb25maWcgaW5zdGVhZCBvZiBhIHNlbGYtaG9zdGVkIGdsb2JhbCBjb25maWcsIGFuZCBgQGxhdGVzdGAga2VlcHMgbnBtIGZyb20gc2lsZW50bHlcbiAgICAgIC8vIGluc3RhbGxpbmcgYW4gYW5jaWVudCBSZW5vdmF0ZSB0aGF0IGNhbm5vdCBldmVuIHBhcnNlIEpTT05DIHdoZW4gdGhlIGxvY2FsIE5vZGUgbGFncyBiZWhpbmQuXG4gICAgICAvLyBTdGFnaW5nIGEgZGVsZXRpb24gb2YgcmVub3ZhdGUuanNvbmMgbGVhdmVzIG5vIGZpbGUgZm9yIGluc3BlY3Rpb24sIHNvIExlZnRob29rIHNraXBzIHRoaXNcbiAgICAgIC8vIGpvYiBpbnN0ZWFkIG9mIHJ1bm5pbmcgdGhlIHZhbGlkYXRvciBvbiBhIG1pc3NpbmcgcGF0aCDigJQgZGVsaWJlcmF0ZWx5LCBiZWNhdXNlIGRlbGV0aW5nIHRoZVxuICAgICAgLy8gc2hhcmVkIHByZXNldCBpcyBub3QgYW4gb3BlcmF0aW9uIHRoaXMgaG9vayBuZWVkcyB0byBndWFyZC5cbiAgICAgIG5hbWU6ICd2YWxpZGF0ZS1yZW5vdmF0ZS1jb25maWcnLFxuICAgICAgZ2xvYjogJ3Jlbm92YXRlLmpzb25jJyxcbiAgICAgIHJ1bjogJ25weCAtLXllcyAtLXBhY2thZ2UgcmVub3ZhdGVAbGF0ZXN0IC0tIHJlbm92YXRlLWNvbmZpZy12YWxpZGF0b3IgLS1zdHJpY3QgLS1uby1nbG9iYWwge3N0YWdlZF9maWxlc30nLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICAvLyBwcmVwYXJlIGNhbGxzIHRoaXMgd2l0aG91dCBhcmd1bWVudHMgYWZ0ZXIgQnVuIHNhdmVzIHRoZSByb290IGxvY2tmaWxlOyBMZWZ0aG9vayBwYXNzZXMgaXRzXG4gIC8vIHN0YWdlZCBwYXRoLiBUaGUgdW5wcmVkaWN0YWJsZSBzaWJsaW5nIGZpbGUgbWFrZXMgcmVwbGFjZW1lbnQgYXRvbWljLCBgY3AgLXBgIHByZXNlcnZlcyBpdHNcbiAgLy8gbW9kZSwgYW5kIHRoZSBhbmNob3JlZCBwYXR0ZXJuIGNhbm5vdCBlcmFzZSBhIGRpcmVjdCB0YXJiYWxsIGRlcGVuZGVuY3kgVVJMLlxuICBub3JtYWxpemVCdW5Mb2NrZmlsZTogYFxuIyEvYmluL2Jhc2hcbnNldCAtZVxuXG5pZiBbWyBcIiQjXCIgLWVxIDAgXV07IHRoZW5cbiAgc2V0IC0tIGJ1bi5sb2NrXG5maVxuXG5ub3JtYWxpemVkPVwiXCJcbnRyYXAgJ1tbIC16IFwiJG5vcm1hbGl6ZWRcIiBdXSB8fCBybSAtZiBcIiRub3JtYWxpemVkXCInIEVYSVRcbmZvciBmaWxlIGluIFwiJEBcIjsgZG9cbiAgW1sgLWYgXCIkZmlsZVwiIF1dIHx8IGNvbnRpbnVlXG4gIG5vcm1hbGl6ZWQ9XCIkKG1rdGVtcCBcIiRmaWxlLndiZnktbm9ybWFsaXppbmcuWFhYWFhYXCIpXCJcbiAgY3AgLXAgXCIkZmlsZVwiIFwiJG5vcm1hbGl6ZWRcIlxuICBzZWQgLUUgJ3MjKFwiLCApXCJodHRwczovL25wbVxcXFwuZmxhdHRcXFxcLnRlY2gvW15cIl0qXCIjXFxcXDFcIlwiI2cnIFwiJGZpbGVcIiA+IFwiJG5vcm1hbGl6ZWRcIlxuICBpZiAhIGNtcCAtcyBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiOyB0aGVuXG4gICAgbXYgXCIkbm9ybWFsaXplZFwiIFwiJGZpbGVcIlxuICAgIGVjaG8gXCJSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJGZpbGUgc28gdGhlIGxvY2tmaWxlIHN0YXlzIHJlZ2lzdHJ5LWFnbm9zdGljLlwiXG4gIGZpXG4gIHJtIC1mIFwiJG5vcm1hbGl6ZWRcIlxuICBub3JtYWxpemVkPVwiXCJcbmRvbmVcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdID0gW2NvbmZpZ10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCBhbGxDb25maWdzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCB7IGxpbnQgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8TGVmdGhvb2tTZXR0aW5ncz4gPSB7XG4gICAgLi4uYmFzZVNldHRpbmdzLFxuICAgICdwcmUtY29tbWl0Jzoge1xuICAgICAgam9iczogZ2V0UHJlQ29tbWl0Sm9icyhjb25maWcpLFxuICAgIH0sXG4gIH07XG4gIGlmICghbGludCkge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnNVdGlsLndyaXRlRmlsZUNvbmZpbmVkKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcblxuICBpZiAobGludCkge1xuICAgIGNvbnN0IHByZVB1c2ggPSBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZyk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZywgYWxsQ29uZmlncykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoJyksIHNjcmlwdHMubm9ybWFsaXplQnVuTG9ja2ZpbGUgKyAnXFxuJywge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByZVB1c2hTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gQnVuIHJlcG9zIHJlY2VpdmUgd2IgYXMgcGFydCBvZiB3YmZ5J3MgbWFuYWdlZCB0b29sY2hhaW4sIHNvIGdlbmVyYXRlIHRoZVxuICAvLyBmaW5hbCBob29rIGNvbW1hbmQgb24gdGhlIGZpcnN0IHJ1biBpbnN0ZWFkIG9mIGNoYW5naW5nIGl0IG9uIHRoZSBzZWNvbmQuXG4gIGNvbnN0IHF1aWV0TGludENvbW1hbmQgPSAnYnVuIHdiIGxpbnQgLS1xdWlldCc7XG4gIC8vIE5vIHNlcGFyYXRlIHR5cGVjaGVjayBzdGVwIG5lZWRlZCDigJQgdGhlIGxpbnQgY29tbWFuZCBhbHJlYWR5IGluY2x1ZGVzIHR5cGVjaGVja2luZy5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7cXVpZXRMaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBxdWlldExpbnRDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IExlZnRob29rSm9iW10ge1xuICByZXR1cm4gcHJlQ29tbWl0U2V0dGluZ3Muam9ic1xuICAgIC5maWx0ZXIoKGpvYikgPT4gam9iLm5hbWUgIT09ICd2YWxpZGF0ZS1yZW5vdmF0ZS1jb25maWcnIHx8IGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncylcbiAgICAubWFwKChqb2IpID0+XG4gICAgICBqb2IubmFtZSA9PT0gJ2NsZWFudXAnXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uam9iLFxuICAgICAgICAgICAgZ2xvYjogZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZyksXG4gICAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgICAgfVxuICAgICAgICA6IGpvYlxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBMZXQgYHdiIGxpbnQgLS1mb3JtYXRgIGRlY2lkZSB3aGV0aGVyIFByZXR0aWVyIGlzIGF2YWlsYWJsZTsgdGhlIGhvb2tcbiAgLy8gc3RpbGwgbmVlZHMgdG8gdHJpZ2dlciB3aGVuIGFkZGluZyB0aGUgZmlyc3QgcHJldHRpZXItb25seSBmaWxlLlxuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID0gWy4uLmV4dGVuc2lvbnMucHJldHRpZXJPbmx5XTtcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goLi4uZXh0ZW5zaW9ucy5veGZtdCwgLi4uZXh0ZW5zaW9ucy5veGxpbnQpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV0udG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gU3RyaW5nLnJhd2BcbmJ1biBydW4gLS1jd2QgcGFja2FnZXMvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cbiAgLy8gUHl0aG9uLW9ubHkgQnVuIHJlcG9zIGluc3RhbGwgd2IgZm9yIHNoYXJlZCBzY3JpcHRzIGJ1dCBub3QgT3hsaW50LCBzb1xuICAvLyBzdGFnZWQtZmlsZSBob29rcyBtdXN0IHVzZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgZm9ybWF0dGVyIHBhdGggYmVsb3cuXG4gIGNvbnN0IGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICBpZiAoY2FuVXNlV2JGb3JTdGFnZWRGaWxlcykge1xuICAgIHJldHVybiBgXG5idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nLnJhd2BcbnBhY2thZ2VfanNvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoXnwvKXBhY2thZ2VcXC5qc29uJCcgfHwgdHJ1ZSlcIlxuJHtoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpID8gU3RyaW5nLnJhd2BweXRob25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwucHkkJyB8fCB0cnVlKVwiYCA6ICcnfVxuJHtjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCA/IFN0cmluZy5yYXdgZGFydF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5kYXJ0JCcgfCBncmVwIC12ICdnZW5lcmF0ZWQnIHwgZ3JlcCAtdiAnXFwuZnJlZXplZFxcLmRhcnQkJyB8IGdyZXAgLXYgJ1xcLmdcXC5kYXJ0JCcgfHwgdHJ1ZSlcImAgOiAnJ31cblxuaWYgWyAtbiBcIiRwYWNrYWdlX2pzb25fZmlsZXNcIiBdOyB0aGVuXG4gIGJ1biBzb3J0LXBhY2thZ2UtanNvbiAkcGFja2FnZV9qc29uX2ZpbGVzXG5maVxuJHtcbiAgaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKVxuICAgID8gYGlmIFsgLW4gXCIkcHl0aG9uX2ZpbGVzXCIgXTsgdGhlblxuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBibGFjayAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGZsYWtlOCAkcHl0aG9uX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbFxuICAgID8gYGlmIFsgLW4gXCIkZGFydF9maWxlc1wiIF07IHRoZW5cbiAgZGFydCBmb3JtYXQgJGRhcnRfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbmAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsb2NhbFdiUGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZXMnLCAnd2InLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3aWxsYm9vc3Rlci93Yic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdG9vbHNDaGFuZ2VkUGF0dGVybiA9IFN0cmluZy5yYXdgKG1pc2VcXC50b21sfFxcLm1pc2VcXC50b21sKWA7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIiR7dG9vbHNDaGFuZ2VkUGF0dGVybn1cIiBcIm1pc2UgaW5zdGFsbFwiYCk7XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gJ2J1biBpbnN0YWxsJztcbiAgLy8gRG8gTk9UIGFkZCBgLnZpbmV4dGAgaGVyZTogaXQgaG9sZHMgb25seSB2aW5leHQncyBjb250ZW50LWhhc2hlZCBmb250IGNhY2hlIGFuZCB0aGUgZGV2XG4gIC8vIHNlcnZlcidzIGxvY2sgZmlsZSAoZGVsZXRpbmcgdGhlIGxvY2sgZGlzYWJsZXMgdGhlIGR1cGxpY2F0ZS1kZXYtc2VydmVyIGd1YXJkIGZvciBhIHJ1bm5pbmdcbiAgLy8gc2VydmVyKS4gdmluZXh0J3MgYnVpbGQgb3V0cHV0IGdvZXMgdG8gYGRpc3QvYCwgYW5kIFZpdGUncyBkZXBlbmRlbmN5IGNhY2hlIGlzIGhhbmRsZWQgYnlcbiAgLy8gdGhlIHNlcGFyYXRlIGluc3RhbGwtbGF5b3V0IGhvb2sgYmVsb3cuXG4gIC8vIFNjYW4gZXZlcnkgd29ya3NwYWNlIGNvbmZpZyAobm90IGp1c3QgdGhlIHJvb3QpOiBpbiBhIG1vbm9yZXBvIHRoZSBhcHAgdXN1YWxseSBsaXZlcyBpblxuICAvLyBwYWNrYWdlcy88YXBwPiBvciBhcHBzLzxhcHA+LCBhbmQgdGhlIGNhY2hlIGRpcmVjdG9yaWVzIGFyZSB3b3Jrc3BhY2UtcmVsYXRpdmUuXG4gIGNvbnN0IG5leHRDYWNoZURpclBhdGhzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gICAgY29uZmlnLFxuICAgIGFsbENvbmZpZ3MsXG4gICAgKHdvcmtzcGFjZUNvbmZpZykgPT4gd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLm5leHQsXG4gICAgJy5uZXh0J1xuICApO1xuICBjb25zdCBybU5leHREaXJlY3RvcmllcyA9XG4gICAgbmV4dENhY2hlRGlyUGF0aHMubGVuZ3RoID4gMCA/IGAgJiYgcm0gLVJmIC0tICR7bmV4dENhY2hlRGlyUGF0aHMubWFwKHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwpLmpvaW4oJyAnKX1gIDogJyc7XG4gIC8vIEJ1biBkb2VzIG5vdCByZWxpbmsgYW4gZXhpc3RpbmcgaXNvbGF0ZWQgdHJlZSB3aGVuIGdsb2JhbFN0b3JlL2xpbmtlciBzZXR0aW5ncyBjaGFuZ2UuIEluc3BlY3RcbiAgLy8gdGhvc2Uga2V5cyByYXRoZXIgdGhhbiBldmVyeSBidW5maWcgY2hhbmdlOiBtaW5pbXVtUmVsZWFzZUFnZSB1cGRhdGVzIG11c3Qgbm90IGRlc3Ryb3kgYVxuICAvLyBjb250cmlidXRvcidzIHdvcmtpbmcgaW5zdGFsbCBiZWZvcmUgYSBwb3RlbnRpYWxseSBuZXR3b3JrLWRlcGVuZGVudCByZXBsYWNlbWVudCBzdWNjZWVkcy5cbiAgY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRocyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKGNvbmZpZywgYWxsQ29uZmlncywgKCkgPT4gdHJ1ZSwgJ25vZGVfbW9kdWxlcycpO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgIFN0cmluZy5yYXdgaWYgZ2l0IGRpZmYgLS1uby1jb2xvciAtVTAgT1JJR19IRUFEIEhFQUQgLS0gJypidW5maWcudG9tbCcgfCBncmVwIC0tcXVpZXQgLUUgJ15bKy1dICooZ2xvYmFsU3RvcmV8bGlua2VyfHB1YmxpY0hvaXN0UGF0dGVybiknOyB0aGVuIHJtIC1SZiAtLSAke25vZGVNb2R1bGVzRGlyUGF0aHMubWFwKHF1b3RlRm9yU2hlbGwpLmpvaW4oJyAnKX07IGZpYFxuICApO1xuICAvLyBidW4ubG9jay1vbmx5IG1lcmdlcyAoUmVub3ZhdGUgbG9ja2ZpbGUgbWFpbnRlbmFuY2UpLCBidW5maWcudG9tbCAvIC5ucG1yYyBjaGFuZ2VzIChsaW5rZXIsXG4gIC8vIHJlZ2lzdHJ5LCBob2lzdGluZyksIGFuZCBwYXRjaCBlZGl0cyBhbGwgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0IHRvdWNoaW5nIHBhY2thZ2UuanNvbi5cbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKHBhY2thZ2VcXC5qc29ufGJ1blxcLmxvY2t8YnVuZmlnXFwudG9tbHxcXC5ucG1yY3xwYXRjaGVzLylcIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcmllc31cImBcbiAgKTtcbiAgLy8gVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaW4gbm9kZV9tb2R1bGVzLy52aXRlIHNlbGYtaW52YWxpZGF0ZXMgb24gbG9ja2ZpbGUgLyBwYXRjaGVzIC9cbiAgLy8gY29uZmlnIC8gTk9ERV9FTlYgY2hhbmdlcyAoc2VlIFZpdGUncyBkZXAgcHJlLWJ1bmRsaW5nIGRvY3MpLCBzbyB0aGUgcmVzaWR1YWwgc3RhbGUgY2FzZSBpc1xuICAvLyBpbnN0YWxsLWxheW91dCBjaGFuZ2VzIChidW5maWcudG9tbCBsaW5rZXIsIC5ucG1yYyk6IHRoZXkgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0XG4gIC8vIHRvdWNoaW5nIHRoZSBsb2NrZmlsZSwgYW5kIHRoZXkgYXJlIGFic2VudCBmcm9tIFZpdGUncyBjYWNoZSBrZXkuXG4gIGNvbnN0IHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpbmV4dCB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpdGUsXG4gICAgJ25vZGVfbW9kdWxlcy8udml0ZSdcbiAgKTtcbiAgaWYgKHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMubGVuZ3RoID4gMCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmMpXCIgXCJybSAtUmYgLS0gJHtybVZpdGVDYWNoZURpcmVjdG9yaWVzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9XCJgXG4gICAgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwidXZcXC5sb2NrXCIgXCJ1diBzeW5jIC0tZnJvemVuXCJgKTtcbiAgfVxuICAvLyBCbGl0eiByZXBvc2l0b3JpZXMgZGVsaWJlcmF0ZWx5IGdldCB0aGUgc2FtZSB3Yi1kcml2ZW4gcHJpc21hIGNvbW1hbmRzIGFzIGV2ZXJ5b25lIGVsc2U6XG4gIC8vIHRoZSBibGl0eiBDTEkncyBjb2RlZ2VuIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2UsIHdoaWNoIG11c3QgbmV2ZXIgcnVuXG4gIC8vIHVuZGVyIEJ1bidzIHNoYXJlZCBnbG9iYWwgc3RvcmUuIFlhcm4tZXJhIEJsaXR6IHJlcG9zIGdldCB0aGVpciByb3V0ZSBtYW5pZmVzdCBmcm9tXG4gIC8vIGB3YiBnZW4tY29kZWAncyBgYmxpdHogY29kZWdlbmAgc3RlcCwgYW5kIGN1cnJlbnQgd2Igcm91dGVzIG9ubHkgYHdiIHByaXNtYSBzZWVkYCB0aHJvdWdoXG4gIC8vIHRoZSBibGl0eiBDTEksIG9ubHkgZm9yIG5vbi1CdW4gcmVwb3MgKHNlZSBwYWNrYWdlcy93Yi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzKTsgdGhlXG4gIC8vIHBvc3QtbWVyZ2UgaG9va3Mgc3RheSB3Yi1kcml2ZW4gYmVjYXVzZSBgcHJpc21hIGRlcGxveWAvYGdlbmVyYXRlYCBuZWVkIG5vIGJsaXR6IGxvYWRlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcImJ1biB3YiBwcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc0NvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywgY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzKTtcbiAgaWYgKGdlbkkxOG5Uc0NvbW1hbmQpIHtcbiAgICAvLyBnZW4taTE4bi10cyBvdXRwdXRzIGFyZSBjb21tb25seSBpZ25vcmVkLCBzbyBwb3N0LW1lcmdlIHJlZ2VuZXJhdGVzIHRoZW0gYWZ0ZXIgcHVsbGVkIHJlc291cmNlIGNoYW5nZXMuXG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKF58LylpMThuLy4qXFwuanNvbiRcIiBcIiR7Z2VuSTE4blRzQ29tbWFuZH1cImApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cblxuLy8gVGhlIGdlbmVyYXRlZCBjb21tYW5kIHBhc3NlcyB0aHJvdWdoIFRXTyBzaGVsbCBwYXJzaW5nIHN0YWdlczogdGhlIHByZXBhcmUuc2ggbGluZSBwYXJzZXMgaXQgYXNcbi8vIGEgZG91YmxlLXF1b3RlZCBhcmd1bWVudCAocHJvY2Vzc2luZyBcXCwgYCwgJCBhbmQgXCIgaW1tZWRpYXRlbHkpLCBhbmQgcnVuX2lmX2NoYW5nZWQgdGhlbiBldmFsJ3Ncbi8vIGl0ICh3b3JkLXNwbGl0dGluZyBhbmQgZ2xvYmJpbmcpLiBBbiB1bnF1b3RlZCBwYXRoIGNvbnRhaW5pbmcgc3BhY2VzIChlLmcuIGBhcHBzL215IGFwcC8ubmV4dGApXG4vLyB3b3VsZCB3b3JkLXNwbGl0IGludG8gdW5yZWxhdGVkIHJtIHRhcmdldHMsIGFuZCBgJGAvYmFja3RpY2sgd291bGQgZXhwYW5kIGF0IHRoZSBmaXJzdCBzdGFnZS5cbi8vIFNvOiBzaW5nbGUtcXVvdGUgZm9yIHRoZSBldmFsIHN0YWdlLCB0aGVuIGJhY2tzbGFzaC1lc2NhcGUgdGhlIGRvdWJsZS1xdW90ZS1jb250ZXh0IHNwZWNpYWxzLlxuZnVuY3Rpb24gcXVvdGVGb3JFdmFsdWF0ZWRTaGVsbChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXZhbFF1b3RlZCA9IHF1b3RlRm9yU2hlbGwoZmlsZVBhdGgpO1xuICByZXR1cm4gZXZhbFF1b3RlZC5yZXBsYWNlQWxsKC9bXFxcXGAkXCJdL2d1LCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuZnVuY3Rpb24gcXVvdGVGb3JTaGVsbChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnJHtmaWxlUGF0aC5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG59XG5cbi8qKlxuICogVGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBkaXJlY3RvcmllcyAocm9vdCBmaXJzdCwgZGVkdXBsaWNhdGVkLCBgPHN1YkRpck5hbWU+YCBhcHBlbmRlZCkgb2YgZXZlcnlcbiAqIHdvcmtzcGFjZSB3aG9zZSBjb25maWcgbWF0Y2hlcyB0aGUgcHJlZGljYXRlLiBUaGUgaG9vayBzY3JpcHQgcnVucyBhdCB0aGUgcmVwb3NpdG9yeSByb290LCBzb1xuICogcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IGNvbmZpZydzIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgcHJlZGljYXRlOiAoY29uZmlnOiBQYWNrYWdlQ29uZmlnKSA9PiBib29sZWFuLFxuICBzdWJEaXJOYW1lOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgYWxsQ29uZmlnc1xuICAgICAgICAuZmlsdGVyKChjb25maWcpID0+IHByZWRpY2F0ZShjb25maWcpKVxuICAgICAgICAubWFwKChjb25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKHJvb3RDb25maWcuZGlyUGF0aCwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgICAgICAgIHJldHVybiByZWxhdGl2ZURpclBhdGggPyBwYXRoLnBvc2l4LmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBzdWJEaXJOYW1lKSA6IHN1YkRpck5hbWU7XG4gICAgICAgIH0pXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG5mdW5jdGlvbiBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25SdW5uZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeSBydW4nIHwgJ3V2IHJ1bicge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluVXZMb2NrID8gJ3V2IHJ1bicgOiAncG9ldHJ5IHJ1bic7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ29uZmlnQ29udGVudChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGVudD8udHJpbSgpO1xufVxuIiwiaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nVXRpbC5qcyc7XG5cbmV4cG9ydCB0eXBlIENvbmZpZ0Jsb2NrTmFtZSA9ICdiYXNlJyB8ICdleHBvcnQnO1xuXG5pbnRlcmZhY2UgTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMge1xuICBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcbiAgbWFya2VyUHJlZml4OiBzdHJpbmc7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHZXRDb25maWdDb250ZW50T3B0aW9ucyB7XG4gIGRlc2lyZWRDb250ZW50OiBzdHJpbmc7XG4gIGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZENvbmZpZ0Jsb2NrcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXJrZXJQcmVmaXg6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMpIHtcbiAgICB0aGlzLmJsb2NrTmFtZXMgPSBvcHRpb25zLmJsb2NrTmFtZXM7XG4gICAgdGhpcy5tYXJrZXJQcmVmaXggPSBvcHRpb25zLm1hcmtlclByZWZpeDtcbiAgICB0aGlzLnRvb2xOYW1lID0gb3B0aW9ucy50b29sTmFtZTtcbiAgfVxuXG4gIGdldENvbmZpZ0NvbnRlbnQob3B0aW9uczogR2V0Q29uZmlnQ29udGVudE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmICghb3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICAgIGlmICh0aGlzLmhhc01hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCwgb3B0aW9ucy5kZXNpcmVkQ29udGVudCwgb3B0aW9ucy5maWxlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICB9XG5cbiAgZ2V0QmxvY2soYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKX1cbiR7Y29udGVudH1cbiR7dGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKX1gO1xuICB9XG5cbiAgaGFzTWFuYWdlZEJsb2Nrcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja05hbWVzLnNvbWUoKGJsb2NrTmFtZSkgPT4gY29udGVudC5pbmNsdWRlcyh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcsIGRlc2lyZWRDb250ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gZXhpc3RpbmdDb250ZW50O1xuICAgIGZvciAoY29uc3QgYmxvY2tOYW1lIG9mIHRoaXMuYmxvY2tOYW1lcykge1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0aGlzLmV4dHJhY3RNYW5hZ2VkQmxvY2soZGVzaXJlZENvbnRlbnQsIGJsb2NrTmFtZSk7XG4gICAgICBpZiAoIXJlcGxhY2VtZW50KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudCwgYmxvY2tOYW1lLCByZXBsYWNlbWVudCk7XG4gICAgICBpZiAoIW5leHRDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyBpbmNvbXBsZXRlICR7YmxvY2tOYW1lfSBibG9jayBpbiAke3RoaXMudG9vbE5hbWV9IGNvbmZpZzogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29udGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgPSBuZXh0Q29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSkuZXhlYyhjb250ZW50KT8uWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBSZWdFeHAge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFxuICAgICAgYCR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSl9W1xcXFxzXFxcXFNdKj8ke2VzY2FwZVJlZ0V4cCh0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpKX1gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTpzdGFydCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTplbmQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hmbXQnLFxuICB0b29sTmFtZTogJ294Zm10Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94Zm10Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICBmaWxlUGF0aCxcbiAgICB9KTtcbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3Qgb3hmbXRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnKTtcblxuICAvLyBDb21tb25KUyBwYWNrYWdlcyBuZWVkIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMgaGVyZTogb3hmbXQgY29uZmlnIGZpbGVzIGFyZVxuICAvLyBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCB0aGUgc2hhcmVkIGNvbmZpZyBwYWNrYWdlIGlzIEVTTS1vbmx5LlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94Zm10IGNvbmZpZyBmaWxlcyBhcmUgb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hmbXRDb25maWcgPSByZXF1aXJlKCcke294Zm10QmFzZUNvbmZpZ01vZHVsZX0nKTtcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBveGZtdENvbmZpZy5kZWZhdWx0ID8/IG94Zm10Q29uZmlnO2BcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG5pbXBvcnQgY29uZmlnIGZyb20gJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gY29uZmlnO2BcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlLFxuICByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUsXG59IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gZ2VuZXJhdGlvblxuICAgIC8vIG11c3Qgbm90IHJlcGxhY2UgcGFja2FnZS1wcm92aWRlZCBsaW50ZXIgc2V0dGluZ3MuIEdlbmVyYXRlZCBmaWxlcyB3aXRoXG4gICAgLy8gbWFuYWdlZCBibG9ja3MgYXJlIHN0aWxsIHNhZmUgdG8gdXBkYXRlLlxuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnID0gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGxpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudCAmJiAhbWFuYWdlZENvbmZpZ0Jsb2Nrcy5oYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudFxuICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgIDogbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgfSk7XG5cbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgaXNSb290Q29uZmlnID0gY29uZmlnLmlzUm9vdDtcbiAgY29uc3Qgb3hsaW50QmFzZUNvbmZpZ01vZHVsZSA9IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWcsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycpO1xuXG4gIC8vIERvIG5vdCBjb2xsYXBzZSB0aGlzIHRvIGEgc3RhdGljIGltcG9ydCBmb3IgZXZlcnkgcGFja2FnZS4gQ29tbW9uSlMgcGFja2FnZXNcbiAgLy8gdHlwZS1jaGVjayBhdXRvLWRpc2NvdmVyZWQgb3hsaW50LmNvbmZpZy50cyBhcyBDb21tb25KUywgc28gaW1wb3J0aW5nIHRoZSBFU01cbiAgLy8gQHdpbGxib29zdGVyL294bGludC1jb25maWcgcGFja2FnZSB0cmlnZ2VycyBUUzE0NzkuIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGhcbiAgLy8gbGl0ZXJhY3ktdGVzdCdzIGdlbmVyYXRlZCBjb25maWcgcGF0dGVybi5cbiAgLy8gTm8gLy8vIDxyZWZlcmVuY2UgdHlwZXM+IGxpbmU6IHRoZSB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZyBhbHJlYWR5IGNvdmVycyAqLmNvbmZpZy50cyB3aXRoXG4gIC8vIHR5cGVzIFtcImJ1blwiXSwgd2hpY2ggdHlwZXMgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cywgd2hpbGUgYSBcIm5vZGVcIiByZWZlcmVuY2UgYnJlYWtzIHVuZGVyXG4gIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciB3aGVyZSB0aGUgdW5kZWNsYXJlZCBAdHlwZXMvbm9kZSBpcyB1bnJlc29sdmFibGUgKFRTMjY4OCkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZy5kZWZhdWx0ID8/IG94bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG5pbXBvcnQgb3hsaW50QmFzZUNvbmZpZyBmcm9tICcke294bGludEJhc2VDb25maWdNb2R1bGV9JztcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuXG4vLyBzdHJ1Y3R1cmVkQ2xvbmUga2VlcHMgYSBwYWNrYWdlLWxvY2FsIGNvcHkgc28gcmVwb3NpdG9yaWVzIGNhbiBhZGQgc2V0dGluZ3Mgb3V0c2lkZSBtYW5hZ2VkXG4vLyBibG9ja3Mgd2l0aG91dCBtdXRhdGluZyB0aGUgc2hhcmVkIGltcG9ydGVkIGNvbmZpZyBvYmplY3QuIFRoZSByb290IGNvbmZpZyBmb3JjZXMgdGhlIHR5cGUtYXdhcmVcbi8vIG9wdGlvbnMgb24gaW5zaWRlIHRoZSBtYW5hZ2VkIGJsb2NrIHNvIG5vIGN1c3RvbWl6YXRpb24gY2FuIHNpbGVudGx5IGRpc2FibGUgdHlwZSBjaGVja2luZzsgZXZlcnlcbi8vIG90aGVyIGNvbmZpZyBkZWxldGVzIHRoZW0gYmVjYXVzZSBPeGxpbnQgcmVqZWN0cyB0aG9zZSByb290LW9ubHkgb3B0aW9ucyBlbHNld2hlcmUgKHR5cGUgY2hlY2tpbmdcbi8vIHN1cnZpdmVzOiB0aGUgbGludCBjb21tYW5kcyBwYXNzIC0tdHlwZS1hd2FyZSBhbmQgLS10eXBlLWNoZWNrIGV4cGxpY2l0bHkpLlxuZnVuY3Rpb24gZ2V0UmVzb2x2ZWRDb25maWdDb250ZW50KGJhc2VDb25maWdOYW1lOiBzdHJpbmcsIGlzUm9vdENvbmZpZzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChpc1Jvb3RDb25maWcpIHtcbiAgICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucyA9IHsgLi4ub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucywgdHlwZUF3YXJlOiB0cnVlLCB0eXBlQ2hlY2s6IHRydWUgfTtgO1xuICB9XG5cbiAgcmV0dXJuIGBjb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogT3hsaW50Q29uZmlnID0gc3RydWN0dXJlZENsb25lKCR7YmFzZUNvbmZpZ05hbWV9KTtcbmRlbGV0ZSBveGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zO2A7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9yaWdpbmFsU2V0dGluZ3NKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShvbGRDb250ZW50KSkge1xuICAgICAgLy8gcHlyaWdodGNvbmZpZy5qc29uIGFsbG93cyBKU09OQzsgYW4gZXhpc3RpbmcgZmlsZSB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnRcbiAgICAgIC8vIHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIGJhcmUgdGVtcGxhdGUuXG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8b2JqZWN0PihvbGRDb250ZW50KTtcbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG9sZFNldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS1jbGVhbiBweXJpZ2h0Y29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKG9yaWdpbmFsU2V0dGluZ3NKc29uID09PSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUobmV3U2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgY29uc3VtZXNEb2NrZXJFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbWFuYWdlZFNjcmlwdHNCbG9jayA9IGBzY3JpcHRzLyoqXG4hc2NyaXB0cy9cbiFzY3JpcHRzLyouc2hgO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UmFpbHdheWlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhSYWlsd2F5aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJhaWx3YXlpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHVzZXNEb2NrZXJFbnYgPSBjb25zdW1lc0RvY2tlckVudihjb25maWcuZG9ja2VyZmlsZSk7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICBpZiAoY29uZmlnLmlzUmFpbHdheSAmJiB1c2VzRG9ja2VyRW52KSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCAnIS5kb2NrZXIuZW52XFxuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9ec2NyaXB0c1xcLyQvbSwgbWFuYWdlZFNjcmlwdHNCbG9jayk7XG4gICAgLy8gYHJhaWx3YXkgdXBgIHN0cmlwcyBnaXRpZ25vcmVkIGZpbGVzIGZyb20gdGhlIHVwbG9hZGVkIGJ1aWxkIGNvbnRleHQsIHNvIHRoZSBnZW5lcmF0ZWRcbiAgICAvLyBub24tc2VjcmV0IC5kb2NrZXIuZW52IChgd2IgZ2VuLWRvY2tlci1lbnZgIG91dHB1dCkgbmVlZHMgYW4gZXhwbGljaXQgdW4taWdub3JlIHRvIHJlYWNoXG4gICAgLy8gdGhlIHJlbW90ZSBEb2NrZXIgYnVpbGQuIEFwcGVuZGVkLCBub3QgcHJlcGVuZGVkOiBpZ25vcmUgZmlsZXMgYXJlIGxhc3QtbWF0Y2gtd2lucywgc28gYVxuICAgIC8vIGhhbmQtd3JpdHRlbiBwYXR0ZXJuIHN1Y2ggYXMgYCouZW52YCBlYXJsaWVyIGluIHRoZSBmaWxlIG11c3Qgbm90IHNpbGVudGx5IHJlLWV4Y2x1ZGUgaXQuXG4gICAgaWYgKHVzZXNEb2NrZXJFbnYgJiYgIS9eIVxcLmRvY2tlclxcLmVudiQvbS50ZXN0KG5ld0NvbnRlbnQpKSB7XG4gICAgICBuZXdDb250ZW50ID0gYCR7bmV3Q29udGVudC5yZXBsYWNlKC9cXG4/JC8sICdcXG4nKX0hLmRvY2tlci5lbnZcXG5gO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvY2tlcmZpbGUgJiYgIXVzZXNEb2NrZXJFbnYpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL14hXFwuZG9ja2VyXFwuZW52XFxuPy9tLCAnJyk7XG4gICAgfVxuICAgIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIG5ld0NvbnRlbnQgPyBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSA6IGZzVXRpbC5yZW1vdmVDb25maW5lZChmaWxlUGF0aClcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgSW1hZ2UsIExpbmssIFBhcmFncmFwaCwgUGhyYXNpbmdDb250ZW50LCBSb290Q29udGVudCB9IGZyb20gJ21kYXN0JztcbmltcG9ydCB7IGZyb21NYXJrZG93biB9IGZyb20gJ21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cgfSBmcm9tICcuL3dvcmtmbG93LmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0V2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5jb25zdCB3YmZ5QmFkZ2VVcmxQcmVmaXggPSAnaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS93YmZ5LSc7XG5jb25zdCB3YmZ5QmFkZ2VVcmxTdWZmaXggPSAnLTFlOTBmZi5zdmcnO1xuY29uc3Qgd2JmeUJhZGdlTGluayA9ICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL3RyZWUvbWFpbi9wYWNrYWdlcy93YmZ5JztcblxuY29uc3QgbnBtUGFja2FnZVVybFByZWZpeCA9ICdodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS8nO1xuXG5jb25zdCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucyA9IFtcbiAgL15cXFshXFxbd2JmeVxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL2JhZGdlXFwvd2JmeS1bXilcXHNdKy0xZTkwZmZcXC5zdmdcXClcXF1cXChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9XaWxsQm9vc3RlclxcL3NoYXJlZFxcL3RyZWVcXC9tYWluXFwvcGFja2FnZXNcXC93YmZ5XFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1teKVxcc10rXFwvYWN0aW9uc1xcL3dvcmtmbG93c1xcL1teKVxcc10rKVxcL2JhZGdlXFwuc3ZnXFwpXFxdXFwoXFwxXFwpJC91LFxuICAvLyBBbnkgYmFkZ2UgbGlua2luZyB0byBhbiBucG0gcGFja2FnZSBwYWdlLCB3aGF0ZXZlciBpbWFnZSBpdCBzaG93cyBhbmQgaG93ZXZlciB0aGUgbGluayBpc1xuICAvLyBzcGVsbGVkOiB0aGUgYmxvY2sgaXMgd2JmeSdzLCBpdCB3cml0ZXMgYXQgbW9zdCBvbmUgbnBtIGJhZGdlLCBzbyBhIGJhZGdlIGZvciBhIHJlbmFtZWQgb3JcbiAgLy8gdW5wdWJsaXNoZWQgcGFja2FnZSBpcyBhIHN0YWxlIGNvcHkgb2YgdGhhdCBvbmUg4oCUIG5vdCBhbm90aGVyIGJhZGdlIHRvIGtlZXAgYmVzaWRlIGl0LlxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoW14pXFxzXStcXClcXF1cXChodHRwcz86XFwvXFwvKD86d3d3XFwuKT9ucG1qc1xcLmNvbVxcL3BhY2thZ2VcXC9bXilcXHNdKlxcKSQvdSxcbl07XG5cbmZ1bmN0aW9uIGJ1aWxkV2JmeUJhZGdlKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIeXBoZW5zIGFyZSBlc2NhcGVkIGFzIGAtLWAgcGVyIHNoaWVsZHMuaW8ncyBiYWRnZSBwYXRoIHN5bnRheCwgc28gYHYxLjIuMy1yYy4xYCBzdGF5cyBpbnRhY3QuXG4gIHJldHVybiBgWyFbd2JmeV0oJHt3YmZ5QmFkZ2VVcmxQcmVmaXh9JHtsYWJlbC5yZXBsYWNlQWxsKCctJywgJy0tJyl9JHt3YmZ5QmFkZ2VVcmxTdWZmaXh9KV0oJHt3YmZ5QmFkZ2VMaW5rfSlgO1xufVxuXG4vKiogVGhlIHZlcnNpb24gbGFiZWwgdGhlIHdiZnkgYmFkZ2UgaW4gdGhlIHJlcG9zaXRvcnkncyBSRUFETUUgcmVjb3JkcywgaS5lLiB0aGUgYnVpbGQgdGhhdCB3YmZpZWQgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIENvbmZpbmVkLCBhbmQgdG9sZXJhbnQgb2YgYW55IHJlYWQgZmFpbHVyZTogYSBSRUFETUUgdGhhdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IChhXG4gIC8vIGNvbW1pdHRlZCBzeW1saW5rKSBvciBjYW5ub3QgYmUgcmVhZCBhdCBhbGwgc2F5cyBub3RoaW5nIGFib3V0IHdoaWNoIGJ1aWxkIGNvbmZpZ3VyZWQgVEhJU1xuICAvLyByZXBvc2l0b3J5LCBhbmQgdGhlIGFuc3dlciBvbmx5IGV2ZXIgc3VwcHJlc3NlcyB3b3JrIOKAlCBzbyBhbnl0aGluZyBidXQgYSByZWFkYWJsZSBpbi1yZXBvc2l0b3J5XG4gIC8vIFJFQURNRSBtZWFucyBcIm5vdCBrbm93biB0byBiZSBhcHBsaWVkXCIgYW5kIHRoZSBydW4gcHJvY2VlZHMuXG4gIGNvbnN0IHJlYWRtZSA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdSRUFETUUubWQnKSkuY2F0Y2goKCkgPT4ge30pO1xuICBpZiAocmVhZG1lID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFJFQURNRSBpcyBwYXJzZWQgcmF0aGVyIHRoYW4gc2Nhbm5lZCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3cml0ZUJhZGdlQmxvY2sgcGFyc2VzIGl0LCBhbmRcbiAgLy8gb25seSB0aGUgc2hhcGUgd3JpdGVCYWRnZUJsb2NrIGl0c2VsZiB3cml0ZXMgY291bnRzIGFzIGFuIGFwcGxpZWQgYmFkZ2U6IGEgdG9wLWxldmVsIHBhcmFncmFwaFxuICAvLyBvZiBiYWRnZXMuIEEgYmFkZ2UgYW55d2hlcmUgZWxzZSBpcyBjb250ZW50IHRoYXQgbWVyZWx5IG1lbnRpb25zIG9uZSDigJQgYSBmZW5jZWQgZXhhbXBsZSAod2JmeSdzXG4gIC8vIG93biBkb2N1bWVudGF0aW9uIGhhcyB0aG9zZSksIGEgYmxvY2sgcXVvdGUsIGEgbGlzdCBpdGVtIOKAlCBhbmQgcmVhZGluZyBpdCBhcyBhcHBsaWVkIHdvdWxkIHNraXBcbiAgLy8gZXZlcnkgZml4ZXIgZm9yIHRoZSByZXBvc2l0b3J5LlxuICBmb3IgKGNvbnN0IG5vZGUgb2YgZnJvbU1hcmtkb3duKHJlYWRtZSkuY2hpbGRyZW4pIHtcbiAgICBpZiAoIWlzQmFkZ2VCbG9ja05vZGUobm9kZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYmFkZ2Ugb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKCFpc0JhZGdlTm9kZShiYWRnZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyB1cmwgfSA9IGJhZGdlLmNoaWxkcmVuWzBdO1xuICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHdiZnlCYWRnZVVybFByZWZpeCkgJiYgdXJsLmVuZHNXaXRoKHdiZnlCYWRnZVVybFN1ZmZpeCkpIHtcbiAgICAgICAgcmV0dXJuIHVybC5zbGljZSh3YmZ5QmFkZ2VVcmxQcmVmaXgubGVuZ3RoLCAtd2JmeUJhZGdlVXJsU3VmZml4Lmxlbmd0aCkucmVwbGFjZUFsbCgnLS0nLCAnLScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICAvLyBUaGUgd2JmeSBiYWRnZSBtYXJrcyBhIHJlcG9zaXRvcnkgYXMgd2JmaWVkLCBzbyBhIHJlcG9zaXRvcnkgd2l0aG91dCBhIFJFQURNRSBzdGlsbCBnZXRzIG9uZS5cbiAgICAvLyByZWFkRmlsZUlmRXhpc3RzIGZhbGxzIGJhY2sgT05MWSBvbiBFTk9FTlQ6IGEgUkVBRE1FIHRoYXQgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZCAoZS5nLlxuICAgIC8vIHBlcm1pc3Npb25zLCBFTUZJTEUpIG11c3QgYWJvcnQgdGhlIGdlbmVyYXRvciBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIHN0dWIuXG4gICAgbGV0IG5ld0NvbnRlbnQgPVxuICAgICAgKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz9cbiAgICAgIGAjICR7Y29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID8/IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSl9XFxuYDtcblxuICAgIC8vIE9yZGVyZWQgYnkgd2hhdCBhIHJlYWRlciBjYXJlcyBhYm91dCBtb3N0OiB0aGUgbnBtIGJhZGdlIG5hbWVzIHRoZSBwYWNrYWdlIGEgcmVhZGVyIGluc3RhbGxzLFxuICAgIC8vIHRoZW4gdGhlIHdvcmtmbG93IGJhZGdlcyByZXBvcnQgd2hldGhlciB0aGUgY29kZSBpcyBjdXJyZW50bHkgaGVhbHRoeSwgdGhlbiBob3cgaXQgaXNcbiAgICAvLyByZWxlYXNlZCwgYW5kIGxhc3QgdGhlIHdiZnkgYnVpbGQgdGhhdCBjb25maWd1cmVkIGl0LlxuICAgIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBucG1QYWNrYWdlTmFtZSA9IGF3YWl0IGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZyk7XG4gICAgaWYgKG5wbVBhY2thZ2VOYW1lKSBiYWRnZXMucHVzaChidWlsZE5wbUJhZGdlKG5wbVBhY2thZ2VOYW1lKSk7XG4gICAgYmFkZ2VzLnB1c2goLi4uKGF3YWl0IGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnKSkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkgYmFkZ2VzLnB1c2goc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIGJhZGdlcy5wdXNoKGJ1aWxkV2JmeUJhZGdlKGdldFdiZnlWZXJzaW9uTGFiZWwoKSA/PyAnYXBwbGllZCcpKTtcblxuICAgIC8vIFRoZSBibG9jayBpcyB3cml0dGVuIGluIG9uZSBwYXNzIGZyb20gdGhlIGJhZGdlcyB3YmZ5IG1hbmFnZXMgcmlnaHQgbm93LiBBIGJhZGdlIHRoYXQgaXMgbm9cbiAgICAvLyBsb25nZXIgd2FudGVkIOKAlCBhIHN1cGVyc2VkZWQgdmVyc2lvbiwgb3Igb25lIHdob3NlIHdvcmtmbG93IGlzIGdvbmUg4oCUIHNpbXBseSBpcyBub3QgaW4gdGhlXG4gICAgLy8gbGlzdCwgc28gbm90aGluZyBoYXMgdG8gcmVtb3ZlIGl0LlxuICAgIG5ld0NvbnRlbnQgPSB3cml0ZUJhZGdlQmxvY2sobmV3Q29udGVudCwgYmFkZ2VzKTtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50LCBnZXRMaW5lRW5kaW5nKG5ld0NvbnRlbnQpKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBucG0gcGFja2FnZSBuYW1lIHRoZSByZXBvc2l0b3J5IHB1Ymxpc2hlcyBmcm9tIGl0cyByb290IG1hbmlmZXN0LCBpZiBhbnkuIEEgbWFuaWZlc3Qgbm9cbiAqIHJlbGVhc2UgcHVibGlzaGVzLCBvciBvbmUga2VwdCBvdXQgb2YgdGhlIHJlZ2lzdHJ5IG9uIHB1cnBvc2UsIGhhcyBubyBwYWNrYWdlIHBhZ2UgdG8gbGluayB0by5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGlzaGVkTnBtUGFja2FnZU5hbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIGlmICghcGFja2FnZUpzb24/Lm5hbWUgfHwgIWNvbmZpZy5yZWxlYXNlLm5wbSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gYHByaXZhdGVgIGlzIHJlYWQgdGhlIHdheSBnZW5lcmF0ZVBhY2thZ2VKc29uIHdyaXRlcyBpdDogaXQgcmVtb3ZlcyB0aGUgZmxhZyBmcm9tIGEgTU9OT1JFUE9cbiAgLy8gcm9vdCB0aGF0IGRlY2xhcmVzIHB1Ymxpc2hpbmcgaW50ZW50LCBzbyByZWFkaW5nIHRoZSBmbGFnIGFsb25lIHdvdWxkIGRlbnkgdGhlIGJhZGdlIHRvIHRoZVxuICAvLyB2ZXJ5IG1hbmlmZXN0IHRoZSBzYW1lIHJ1biBtYWtlcyBwdWJsaXNoYWJsZS4gQW55d2hlcmUgZWxzZSB0aGUgZmxhZyBzdGFuZHMgYXMgd3JpdHRlbi5cbiAgY29uc3QgZGVjbGFyZXNQdWJsaXNoaW5nSW50ZW50ID0gISFwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnIHx8IGNvbmZpZy5yZWxlYXNlLm5wbVB1Ymxpc2hlc1Jvb3Q7XG4gIGlmIChwYWNrYWdlSnNvbi5wcml2YXRlICYmICEoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmIGRlY2xhcmVzUHVibGlzaGluZ0ludGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIFRoZSBtYW5pZmVzdCBvbmx5IHNheXMgdGhlIHJlcG9zaXRvcnkgSU5URU5EUyB0byBwdWJsaXNoOiBhIG1vbm9yZXBvIHJvb3QgdGhhdCBjb25maWd1cmVzXG4gIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbSBmb3IgaXRzIHdvcmtzcGFjZXMgaXMgbmV2ZXIgb24gbnBtIGl0c2VsZiwgYW5kIGEgcGFja2FnZSdzIGZpcnN0IHJlbGVhc2VcbiAgLy8gaGFzIG5vdCBoYXBwZW5lZCB5ZXQuIEJvdGggd291bGQgcmVuZGVyIGEgYnJva2VuIGJhZGdlLCBzbyB0aGUgcmVnaXN0cnkgZGVjaWRlcy5cbiAgcmV0dXJuIChhd2FpdCBpc01pc3NpbmdGcm9tTnBtUmVnaXN0cnkocGFja2FnZUpzb24ubmFtZSkpID8gdW5kZWZpbmVkIDogcGFja2FnZUpzb24ubmFtZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWdpc3RyeSBhbnN3ZXJzIHRoYXQgaXQgaGFzIG5vIHN1Y2ggcGFja2FnZSDigJQgdGhlIE9OTFkgYW5zd2VyIHRoYXQgcmVtb3ZlcyBhIGJhZGdlLlxuICogQSBjaGVjayB0aGF0IGNhbm5vdCBydW4gKG9mZmxpbmUsIGFuIG91dGFnZSwgYSB0aW1lb3V0KSBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHBhY2thZ2UsIGFuZFxuICogdHJlYXRpbmcgaXQgYXMgYWJzZW50IHdvdWxkIHN0cmlwIHRoZSBiYWRnZSBvdXQgb2YgZXZlcnkgcHVibGlzaGVkIHJlcG9zaXRvcnkgd2JmeSB0b3VjaGVzXG4gKiBkdXJpbmcgdGhlIG91dGFnZSBhbmQgcHV0IGl0IGJhY2sgYWZ0ZXJ3YXJkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICAvLyBUaGUgc2NvcGUgc2VwYXJhdG9yIG11c3Qgc3Vydml2ZSBhcyBhIHBhdGggc2VnbWVudCwgc28gdGhlIG5hbWUgaXMgZW5jb2RlZCBwaWVjZXdpc2UuXG4gICAgY29uc3QgZW5jb2RlZE5hbWUgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLycpLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJy8nKTtcbiAgICAvLyBBIGJhZGdlIGlzIGRlY29yYXRpb246IGEgc3RhbGxlZCByZWdpc3RyeSBjb25uZWN0aW9uIG11c3Qgbm90IGhvbGQgdGhlIHdob2xlIHJ1biBmb3IgaG93ZXZlclxuICAgIC8vIGxvbmcgdGhlIG5ldHdvcmtpbmcgc3RhY2sgd291bGQgd2FpdC4gVGhlIGJ1ZGdldCBpcyBnZW5lcm91cyBiZWNhdXNlIGEgdGltZW91dCBhbnN3ZXJzXG4gICAgLy8gXCJ1bmtub3duXCIsIHdoaWNoIGtlZXBzIHRoZSBiYWRnZSDigJQgYW5kIG9uIGEgcmVwb3NpdG9yeSB0aGF0IGlzIG5vdCBvbiBucG0gdGhhdCBtZWFucyB3cml0aW5nXG4gICAgLy8gb25lIGl0IHNob3VsZCBub3QgaGF2ZTsgYSB3YmZ5IHJ1biBhbHJlYWR5IHNwZW5kcyBtaW51dGVzIG9uIGluc3RhbGxzLCBzbyB3YWl0aW5nIGEgbGl0dGxlXG4gICAgLy8gbG9uZ2VyIGZvciBhIHJlYWwgYW5zd2VyIGNvc3RzIGxlc3MgdGhhbiBhY3Rpbmcgb24gYSBtaXNzaW5nIG9uZS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8ke2VuY29kZWROYW1lfWAsIHtcbiAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDEwXzAwMCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGROcG1CYWRnZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBbIVtucG0gdmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vdi8ke3BhY2thZ2VOYW1lfS5zdmcpXSgke25wbVBhY2thZ2VVcmxQcmVmaXh9JHtwYWNrYWdlTmFtZX0pYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRXb3JrZmxvd0JhZGdlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICBpZiAoIXJlcG9zaXRvcnkgfHwgIWZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkpIHJldHVybiBbXTtcblxuICAvLyBXb3JrZmxvdyBhbmQgUkVBRE1FIGdlbmVyYXRpb24gcnVuIGNvbmN1cnJlbnRseS4gRG8gbm90IHJldGFpbiBhIHN0YWxlIFJ1c3QgYmFkZ2Ugd2hpbGUgdGhlXG4gIC8vIHdvcmtmbG93IGdlbmVyYXRvciByZW1vdmVzIGEgY2FsbGVyIGNyZWF0ZWQgZnJvbSBhIGZvcm1lcmx5IG1pc2RldGVjdGVkIGxvY2FsIGNhY2hlIOKAlCBidXRcbiAgLy8gbWlycm9yIGl0cyBvd25lcnNoaXAgY2hlY2s6IGEgY3VzdG9tIHNhbWUtbmFtZWQgd29ya2Zsb3cgc3Vydml2ZXMsIHNvIGl0cyBiYWRnZSBtdXN0IHRvby5cbiAgLy8gRGVjaWRlZCBzeW5jaHJvbm91c2x5IGJlZm9yZSB0aGUgbG9vcCdzIGZpcnN0IGF3YWl0OiB0aGUgZ2VuZXJhdG9yJ3MgZGVsZXRlIGNhbiBvbmx5IGxhbmQgYXRcbiAgLy8gYW4gYXdhaXQgcG9pbnQsIGFuZCBhIHBvc3QtZGVsZXRlIHJlYWQgd291bGQgbWlzcmVwb3J0IHRoZSB3YmZ5LW93bmVkIGNhbGxlciBhcyBjdXN0b20uXG4gIC8vIE5vIGV4aXN0c1N5bmMgcHJlLWNoZWNrOiB0aGUgaGVscGVyIGFscmVhZHkgdHJlYXRzIGEgbWlzc2luZyBmaWxlIGFzIG5vdCBvd25lZCwgYW5kIHRoaXMgcnVuc1xuICAvLyBvbmNlIHBlciByZXBvc2l0b3J5LCBzbyB0aGUgZXhjZXB0aW9uYWwgRU5PRU5UIHJlYWQgY29zdHMgbm90aGluZyB3b3J0aCBhIHJlZHVuZGFudCBzdGF0LlxuICBjb25zdCBkcm9wc1Rlc3RSdXN0QmFkZ2UgPVxuICAgIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDAgJiYgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGgsICd0ZXN0LXJ1c3QueW1sJywgJ3Rlc3QtcnVzdCcpO1xuXG4gIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSkge1xuICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG4gICAgaWYgKGZpbGVOYW1lID09PSAndGVzdC1ydXN0LnltbCcgJiYgZHJvcHNUZXN0UnVzdEJhZGdlKSBjb250aW51ZTtcbiAgICAvLyBHaXRIdWIncyBiYWRnZSBlbmRwb2ludCByZXR1cm5zIDQwNCB1bnRpbCB0aGUgd29ya2Zsb3cgaGFzIGF0IGxlYXN0IG9uZSBydW4sIHNvIGEgYmFkZ2UgZm9yIGFcbiAgICAvLyBkaXNwYXRjaC1vbmx5IGRlcGxveSB3b3JrZmxvdyB0aGF0IGhhcyBuZXZlciBydW4gcmVuZGVycyBhcyBhIGJyb2tlbiBpbWFnZS4gVGVzdCB3b3JrZmxvd3MgcnVuXG4gICAgLy8gb24gZXZlcnkgUFIsIHNvIG9ubHkgZGVwbG95IGJhZGdlcyBuZWVkIHRoZSBndWFyZC5cbiAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgIShhd2FpdCBoYXNBbnlXb3JrZmxvd1J1bihyZXBvc2l0b3J5LCBmaWxlTmFtZSwgY29uZmlnLmlzUHVibGljUmVwbykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYmFkZ2VOYW1lID0gKGZpbGVOYW1lWzBdID8/ICcnKS50b1VwcGVyQ2FzZSgpICsgZmlsZU5hbWUuc2xpY2UoMSwgZmlsZU5hbWUuaW5kZXhPZignLicpKS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICBjb25zdCB3b3JrZmxvd1VybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2VuY29kZVVybFBhdGgoZmlsZU5hbWUpfWA7XG4gICAgYmFkZ2VzLnB1c2goYFshWyR7YmFkZ2VOYW1lfV0oJHt3b3JrZmxvd1VybH0vYmFkZ2Uuc3ZnKV0oJHt3b3JrZmxvd1VybH0pYCk7XG4gIH1cbiAgcmV0dXJuIGJhZGdlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzQW55V29ya2Zsb3dSdW4oXG4gIHJlcG9zaXRvcnk6IHN0cmluZyxcbiAgd29ya2Zsb3dGaWxlTmFtZTogc3RyaW5nLFxuICBpc1B1YmxpY1JlcG86IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gcmVwb3NpdG9yeS5zcGxpdCgnLycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQob3duZXIpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgd29ya2Zsb3dfaWQ6IHdvcmtmbG93RmlsZU5hbWUsXG4gICAgICBwZXJfcGFnZTogMSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS50b3RhbF9jb3VudCA+IDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRm9yIGEgUFVCTElDIHJlcG9zaXRvcnkgdGhlIHJ1bnMgZW5kcG9pbnQgbmVlZHMgbm8gYXV0aG9yaXphdGlvbiwgc28gNDA0IHJlbGlhYmx5IG1lYW5zIHRoZVxuICAgIC8vIHdvcmtmbG93IGlzIGFic2VudCBmcm9tIHRoZSByZW1vdGUgKGUuZy4gYWRkZWQgbG9jYWxseSwgbmV2ZXIgcHVzaGVkKSDigJQgbGlrZSB6ZXJvIHJ1bnMsIGl0c1xuICAgIC8vIGJhZGdlIHdvdWxkIHJlbmRlciBicm9rZW4uIEZvciBhIFBSSVZBVEUgcmVwb3NpdG9yeSBHaXRIdWIgYWxzbyBhbnN3ZXJzIDQwNCB3aGVuIHRoZSB0b2tlblxuICAgIC8vIGlzIG1pc3Npbmcgb3IgdW5kZXItc2NvcGVkLCBzbyA0MDQgaXMgYW1iaWd1b3VzIHRoZXJlIGFuZCB0aGUgYmFkZ2UgaXMga2VwdC5cbiAgICBpZiAoKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cyA9PT0gNDA0ICYmIGlzUHVibGljUmVwbykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEtlZXAgdGhlIHByZS1ndWFyZCBiZWhhdmlvciAoaW5zZXJ0IHRoZSBiYWRnZSkgd2hlbiB0aGUgY2hlY2sgaXRzZWxmIGNhbm5vdCBydW4uXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXBsYWNlcyB0aGUgYmFkZ2UgYmxvY2sg4oCUIHRoZSBiYWRnZXMgd2JmeSBrZWVwcyBkaXJlY3RseSB1bmRlciB0aGUgdGl0bGUg4oCUIHdpdGggYG1hbmFnZWRCYWRnZXNgLFxuICoga2VlcGluZyBhbnkgYmFkZ2UgdGhlcmUgdGhhdCB3YmZ5IGRvZXMgbm90IG1hbmFnZSwgYW5kIHJlYXNzZW1ibGVzIHRoZSBSRUFETUUgYXJvdW5kIGl0IHdpdGhcbiAqIGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgb24gZWFjaCBzaWRlLlxuICpcbiAqIEJvdGggdGhlIHRpdGxlIGFuZCB0aGUgYmxvY2sgYXJlIGxvY2F0ZWQgaW4gYSBDb21tb25NYXJrIHN5bnRheCB0cmVlIHJhdGhlciB0aGFuIGJ5IHNjYW5uaW5nXG4gKiBsaW5lczogb25seSBhIHJlYWwgcGFyc2VyIGtub3dzIHdoZXRoZXIgYSBsaW5lIHRoYXQgbG9va3MgbGlrZSBhIGJhZGdlIGlzIGEgYmFkZ2UgKGEgcGFyYWdyYXBoIG9mXG4gKiBsaW5rZWQgaW1hZ2VzKSBvciBjb250ZW50IHRoYXQgbWVyZWx5IHJlYWRzIGxpa2Ugb25lIChhbiBpbmRlbnRlZCBjb2RlIGJsb2NrLCBhIGJsb2NrIHF1b3RlLCBhXG4gKiBmZW5jZWQgZXhhbXBsZSwgYSBtdWx0aWxpbmUgY29kZSBzcGFuLCBhbiBIVE1MIGJsb2NrKS4gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBibG9jayBpcyBjb3BpZWQgYmFja1xuICogdmVyYmF0aW0gZnJvbSB0aGUgb3JpZ2luYWwgdGV4dCB0aHJvdWdoIHRoZSBwYXJzZXIncyBwb3NpdGlvbmFsIG9mZnNldHMsIHNvIG5vIHJlZm9ybWF0dGluZyBvZiB0aGVcbiAqIHVzZXIncyBjb250ZW50IGlzIHBvc3NpYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVCYWRnZUJsb2NrKHJlYWRtZTogc3RyaW5nLCBtYW5hZ2VkQmFkZ2VzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVFbmRpbmcgPSBnZXRMaW5lRW5kaW5nKHJlYWRtZSk7XG4gIC8vIEEgQk9NIGlzIG5vdCBNYXJrZG93bjogbGVmdCBpbiB0aGUgdGV4dCBpdCBoaWRlcyB0aGUgYCNgIG9mIHRoZSB0aXRsZSBmcm9tIHRoZSBwYXJzZXIsIGFuZFxuICAvLyBwcmVwZW5kaW5nIHRoZSBibG9jayBhaGVhZCBvZiBpdCB3b3VsZCBzdHJpcCB0aGUgbWFya2VyIGZyb20gdGhlIGZpbGUncyBmaXJzdCBieXRlLlxuICBjb25zdCBieXRlT3JkZXJNYXJrID0gcmVhZG1lLnN0YXJ0c1dpdGgoJ++7vycpID8gJ++7vycgOiAnJztcbiAgLy8gRnJvbnQgbWF0dGVyIGlzIGRlbGltaXRlZCBieSB0aGUgc2FtZSBgLS0tYCBhIFNldGV4dCBoZWFkaW5nIGFuZCBhIHRoZW1hdGljIGJyZWFrIHVzZSwgc28gaXQgaXNcbiAgLy8gZGV0YWNoZWQgYmVmb3JlIHBhcnNpbmcgaW5zdGVhZCBvZiBiZWluZyB0b2xkIGFwYXJ0IGFmdGVyd2FyZHM7IGl0IGFsc28gaGFzIHRvIHN0YXkgZmlyc3QgaW4gdGhlXG4gIC8vIGZpbGUsIHdoaWNoIG1ha2VzIGl0IGEgcHJlZml4IGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IHRoZSBCT00gaXMuXG4gIGNvbnN0IHdpdGhvdXRNYXJrID0gcmVhZG1lLnNsaWNlKGJ5dGVPcmRlck1hcmsubGVuZ3RoKTtcbiAgY29uc3QgZnJvbnRNYXR0ZXIgPSB3aXRob3V0TWFyay5zdGFydHNXaXRoKCctLS0nKVxuICAgID8gKC9eLS0tWyBcXHRdKlxccj9cXG5bXFxzXFxTXSo/Xi0tLVsgXFx0XSooPzpcXHI/XFxufCQpL211LmV4ZWMod2l0aG91dE1hcmspPy5bMF0gPz8gJycpXG4gICAgOiAnJztcbiAgY29uc3QgcHJlZml4ID0gYCR7Ynl0ZU9yZGVyTWFya30ke2Zyb250TWF0dGVyfWA7XG4gIC8vIFRoZSBmaW5hbCBuZXdsaW5lIGlzIHNldCBhc2lkZSByYXRoZXIgdGhhbiBwYXJzZWQgYXMgdHJhaWxpbmcgYmxhbmsgc3BhY2UsIHdoaWNoIHRoZSBibGFuay1saW5lXG4gIC8vIHRyaW1taW5nIGJlbG93IHdvdWxkIG90aGVyd2lzZSBzd2FsbG93LlxuICBjb25zdCBlbmRzV2l0aE5ld2xpbmUgPSAvXFxyP1xcbiQvdS50ZXN0KHJlYWRtZSk7XG4gIGNvbnN0IGNvbnRlbnQgPSB3aXRob3V0TWFyay5zbGljZShmcm9udE1hdHRlci5sZW5ndGgpLnJlcGxhY2UoL1xccj9cXG4kL3UsICcnKTtcblxuICBjb25zdCBub2RlcyA9IGZyb21NYXJrZG93bihjb250ZW50KS5jaGlsZHJlbjtcbiAgLy8gQSBsZWFkaW5nIGJhZGdlIGJsb2NrIGlzIHRoZSB1c2VyJ3Mgb3duIGxheW91dDogaXQgc3RheXMgYWJvdmUgdGhlIHRpdGxlLCBhbmQgd2JmeSdzIGJsb2NrIGdvZXMgYmVsb3cuXG4gIGNvbnN0IGtlZXBzTGVhZGluZ0Jsb2NrID0gISFub2Rlc1swXSAmJiBpc0JhZGdlQmxvY2tOb2RlKG5vZGVzWzBdKSAmJiBpc1RpdGxlTm9kZShub2Rlc1sxXSk7XG4gIGNvbnN0IHRpdGxlSW5kZXggPSBrZWVwc0xlYWRpbmdCbG9jayA/IDEgOiBpc1RpdGxlTm9kZShub2Rlc1swXSkgPyAwIDogLTE7XG4gIC8vIFdpdGhvdXQgYSByZWNvZ25pemFibGUgdGl0bGUgdGhlIGJsb2NrIHNpdHMgYXQgdGhlIHZlcnkgdG9wLCBhYm92ZSBldmVyeXRoaW5nLlxuICBjb25zdCBoZWFkU3RhcnROb2RlID0ga2VlcHNMZWFkaW5nQmxvY2sgPyBub2Rlc1swXSEgOiBub2Rlc1t0aXRsZUluZGV4XTtcbiAgY29uc3QgaGVhZCA9XG4gICAgdGl0bGVJbmRleCA9PT0gLTFcbiAgICAgID8gJydcbiAgICAgIDogY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgaGVhZFN0YXJ0Tm9kZSEpLCBub2Rlc1t0aXRsZUluZGV4XSEucG9zaXRpb24hLmVuZC5vZmZzZXQpO1xuXG4gIGNvbnN0IGJsb2NrTm9kZSA9IG5vZGVzW3RpdGxlSW5kZXggKyAxXTtcbiAgY29uc3QgZXhpc3RpbmcgPSBibG9ja05vZGUgJiYgaXNCYWRnZUJsb2NrTm9kZShibG9ja05vZGUpID8gcmVhZEJhZGdlcyhibG9ja05vZGUsIGNvbnRlbnQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBib2R5Tm9kZSA9IGV4aXN0aW5nICYmIGJsb2NrTm9kZSA/IG5vZGVzW25vZGVzLmluZGV4T2YoYmxvY2tOb2RlKSArIDFdIDogYmxvY2tOb2RlO1xuICBjb25zdCBib2R5ID0gYm9keU5vZGUgPyBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50LCBib2R5Tm9kZSkpIDogJyc7XG5cbiAgLy8gU3VwZXJzZWRpbmcgYSBtYW5hZ2VkIGJhZGdlIGlzIGp1c3QgZHJvcHBpbmcgdGhlIG9sZCBvbmU6IGEgdmVyc2lvbiBvciB3b3JrZmxvdyBjaGFuZ2UgbGVhdmVzXG4gIC8vIG5vIHN0YWxlIGNvcHksIHdoaWxlIGFueSBvdGhlciBiYWRnZSBpbiB0aGUgYmxvY2sgKGluY2x1ZGluZyBhIG5vbi1jYW5vbmljYWwgd2JmeSBiYWRnZSwgd2hpY2hcbiAgLy8gaXMgcmVtb3ZlZCBtYW51YWxseSkgaXMga2VwdC5cbiAgY29uc3QgYmFkZ2VzID0gWy4uLm1hbmFnZWRCYWRnZXMsIC4uLihleGlzdGluZyA/PyBbXSkuZmlsdGVyKChiYWRnZSkgPT4gIWlzTWFuYWdlZEJhZGdlKGJhZGdlKSldO1xuICAvLyBDb250ZW50IGlzIHNsaWNlZCBmcm9tIGl0cyBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBzbyB3aGF0ZXZlciBibGFuayBzcGFjZSBmb2xsb3dlZCB0aGUgZnJvbnRcbiAgLy8gbWF0dGVyIGlzIGdvbmU7IGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgaXMgcmVzdG9yZWQgaGVyZS4gQSBjbG9zaW5nIGRlbGltaXRlciB0aGF0IGVuZGVkIGF0IEVPRlxuICAvLyBjYXJyaWVzIG5vIG5ld2xpbmUgb2YgaXRzIG93biBhbmQgbmVlZHMgYm90aCwgb3IgYC0tLWAgd291bGQgZnVzZSB3aXRoIHRoZSBmaXJzdCBiYWRnZSBhbmRcbiAgLy8gZGVzdHJveSB0aGVtIGJvdGguIEEgQk9NIG5lZWRzIG5vIHNlcGFyYXRvcjogaXQgaXMgYSBieXRlIG1hcmtlciwgbm90IGEgbGluZS5cbiAgY29uc3Qgc2VwYXJhdG9yID0gZnJvbnRNYXR0ZXIgPyAoL1xccj9cXG4kL3UudGVzdChmcm9udE1hdHRlcikgPyBsaW5lRW5kaW5nIDogYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCkgOiAnJztcbiAgY29uc3QgcmVzdWx0ID1cbiAgICBwcmVmaXggKyBzZXBhcmF0b3IgKyBbaGVhZCwgYmFkZ2VzLmpvaW4obGluZUVuZGluZyksIGJvZHldLmZpbHRlcihCb29sZWFuKS5qb2luKGAke2xpbmVFbmRpbmd9JHtsaW5lRW5kaW5nfWApO1xuICByZXR1cm4gZW5kc1dpdGhOZXdsaW5lID8gYCR7cmVzdWx0fSR7bGluZUVuZGluZ31gIDogcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgbm9kZSdzIHN0YXJ0IG9mZnNldCwgZXh0ZW5kZWQgYmFjayBvdmVyIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2Ugb24gaXRzIG93biBsaW5lLiBDb21tb25NYXJrXG4gKiBhbGxvd3Mgb25lIHRvIHRocmVlIHNwYWNlcyBvZiBpbmRlbnRhdGlvbiBiZWZvcmUgYSBibG9jaywgYW5kIG1kYXN0IHJlcG9ydHMgdGhlIG9mZnNldCBBRlRFUlxuICogdGhlbSDigJQgc28gc2xpY2luZyBmcm9tIGl0IHNpbGVudGx5IHJlaW5kZW50cyBjb250ZW50IHRoaXMgZ2VuZXJhdG9yIHByb21pc2VzIHRvIGNvcHkgdmVyYmF0aW0uXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50OiBzdHJpbmcsIG5vZGU6IFJvb3RDb250ZW50KTogbnVtYmVyIHtcbiAgY29uc3Qgc3RhcnQgPSBub2RlLnBvc2l0aW9uIS5zdGFydC5vZmZzZXQhO1xuICBjb25zdCBsaW5lU3RhcnQgPSBjb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nLCBzdGFydCAtIDEpICsgMTtcbiAgcmV0dXJuIC9eWyBcXHRdKiQvdS50ZXN0KGNvbnRlbnQuc2xpY2UobGluZVN0YXJ0LCBzdGFydCkpID8gbGluZVN0YXJ0IDogc3RhcnQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgbm9kZSBvcGVucyB0aGUgUkVBRE1FIHdpdGggYSB0aXRsZS4gT25seSB0aGUgRklSU1QgcGllY2Ugb2YgY29udGVudCBjYW4gYmUgb25lOiBhXG4gKiB0aXRsZSBpcyB3aGF0IGEgUkVBRE1FIG9wZW5zIHdpdGgsIGFuZCBhbmNob3JpbmcgdGhlIGJhZGdlcyB0byBhIGhlYWRpbmcgZnVydGhlciBkb3duIHdvdWxkIGJ1cnlcbiAqIHRoZW0gYmVsb3cgY29udGVudCB0aGUgYXV0aG9yIHB1dCBmaXJzdC5cbiAqL1xuZnVuY3Rpb24gaXNUaXRsZU5vZGUobm9kZTogUm9vdENvbnRlbnQgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChub2RlLnR5cGUgPT09ICdoZWFkaW5nJykgcmV0dXJuIHRydWU7XG4gIC8vIE1hbnkgUkVBRE1FcyBjZW50ZXIgdGhlaXIgdGl0bGUgaW4gSFRNTCAoYDxoMT5gLCBvciBhIGA8ZGl2PmAvYDxwPmAgd3JhcHBpbmcgb25lKSwgd2hpY2ggdGhlXG4gIC8vIHBhcnNlciByZXBvcnRzIGFzIG9uZSBvcGFxdWUgSFRNTCBibG9jazsgdGhlIGJhZGdlcyBnbyBhZnRlciB0aGUgd2hvbGUgYmxvY2suXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdodG1sJyAmJiBjb250YWluc1JlbmRlcmVkSDEobm9kZS52YWx1ZSk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgSFRNTCBibG9jayB1bmFtYmlndW91c2x5IFJFTkRFUlMgYW4gYDxoMT5gIOKAlCB0aGUgY2VudGVyZWQtdGl0bGUgbGF5b3V0IG1hbnkgUkVBRE1Fc1xuICogdXNlIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgYSBnZW5lcmFsIEhUTUwgcGFyc2VyLiBEZWNpZGluZyB0aGlzIGV4YWN0bHkgcmVxdWlyZXMgdGhlIHJlYWwgdG9rZW5pemVyJ3NcbiAqIHN0YXRlcyDigJQgcmF3IHRleHQsIFJDREFUQSwgc2NyaXB0IGRhdGEsIGF0dHJpYnV0ZSB2YWx1ZXMsIHRlbXBsYXRlIGNvbnRlbnRzLCBkZWNsYXJhdGlvbnMg4oCUIGFuZFxuICogYXBwcm94aW1hdGluZyB0aGVtIHdpdGggcmVnZXhlcyBpcyB0aGUgc2FtZSBsb3NpbmcgZ2FtZSB0aGUgTWFya2Rvd24gc2Nhbm5pbmcgdGhpcyBtb2R1bGVcbiAqIHJlcGxhY2VkIHdhcyBwbGF5aW5nLiBTbyB0aGUgcnVsZSBpczogdG9rZW5pemUgb25seSB0aGUgc2ltcGxlIGNhc2UsIGFuZCB0cmVhdCBhbnl0aGluZyBjYXJyeWluZ1xuICogYSBjb25zdHJ1Y3Qgd2hvc2UgcGFyc2luZyBkZXBlbmRzIG9uIHRob3NlIHN0YXRlcyBhcyBOT1QgYSB0aXRsZS4gQmVpbmcgd3JvbmcgdGhhdCB3YXkgcHV0cyB0aGVcbiAqIGJhZGdlcyBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLCB3aGljaCBpcyBtZXJlbHkgdW5oZWxwZnVsOyBiZWluZyB3cm9uZyB0aGUgb3RoZXIgd2F5IHJld3JpdGVzIHRoZVxuICogdXNlcidzIFJFQURNRSBhcm91bmQgdGhlIHdyb25nIGFuY2hvci5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNSZW5kZXJlZEgxKGh0bWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBDb21tZW50cyBjYW5ub3QgbmVzdCBhbmQgZW5kIHVuYW1iaWd1b3VzbHksIHNvIHRoZXkgYXJlIHNpbXBseSByZW1vdmVkIHJhdGhlciB0aGFuIGRpc3F1YWxpZnlpbmcuXG4gIGNvbnN0IHdpdGhvdXRDb21tZW50cyA9IGh0bWwucmVwbGFjZUFsbCgvPCEtLVtcXHNcXFNdKj8oPzotLT58JCkvZ3UsICcnKTtcbiAgLy8gQ0RBVEEsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBkZWNsYXJhdGlvbnMsIGVsZW1lbnRzIHdob3NlIGNvbnRlbnQgaXMgcmF3IHRleHQgLyBSQ0RBVEEgL1xuICAvLyBzY3JpcHQgZGF0YSwgYW5kIGA8dGVtcGxhdGU+YCAod2hvc2UgY29udGVudHMgYXJlIGluZXJ0KS4gQSBxdW90ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgYDxgXG4gIC8vIG1ha2VzIGV2ZW4gbG9jYXRpbmcgdGhlc2UgdW5yZWxpYWJsZSwgc28gaXQgZGlzcXVhbGlmaWVzIHRoZSBibG9jayB0b28uXG4gIGNvbnN0IGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4gPVxuICAgIC88IVxcW0NEQVRBXFxbfDxcXD98PCFbYS16QS1aXXw8XFwvPyg/OnNjcmlwdHxzdHlsZXx0ZXh0YXJlYXx0aXRsZXxpZnJhbWV8bm9mcmFtZXN8bm9lbWJlZHx4bXB8dGVtcGxhdGUpXFxifFwiW15cIl0qPFteXCJdKlwifCdbXiddKjxbXiddKicvaXU7XG4gIGlmIChhbWJpZ3VvdXNDb25zdHJ1Y3RQYXR0ZXJuLnRlc3Qod2l0aG91dENvbW1lbnRzKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBRdW90aW5nIGlzIHNpZ25pZmljYW50IG9ubHkgaW5zaWRlIGEgc3RhcnQgdGFnLCBzbyBhbiBhdHRyaWJ1dGUgdmFsdWUgaXMgY29uc3VtZWQgd2l0aCBpdHMgb3duXG4gIC8vIHRhZyB3aGlsZSBxdW90YXRpb24gbWFya3MgaW4gb3JkaW5hcnkgdGV4dCBzdGF5IHRleHQ6IGA8ZGl2IHRpdGxlPVwiJmx0O2gxJmd0O1wiPmAgZG9lcyBub3QgY291bnQsXG4gIC8vIGBcIjxoMT5Qcm9qZWN0PC9oMT5cImAgZG9lcy5cbiAgY29uc3Qgc3RhcnRUYWdQYXR0ZXJuID0gLzwoW2EtekEtWl1bXlxccy8+XSopKD86XCJbXlwiXSpcInwnW14nXSonfFtePlwiJ10pKj4vZ3U7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygd2l0aG91dENvbW1lbnRzLm1hdGNoQWxsKHN0YXJ0VGFnUGF0dGVybikpIHtcbiAgICBpZiAobWF0Y2hbMV0/LnRvTG93ZXJDYXNlKCkgPT09ICdoMScpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIG5vZGUgaXMgYSBwYXJhZ3JhcGggb2YgYmFkZ2VzIGFuZCBub3RoaW5nIGVsc2Ug4oCUIHRoZSBvbmx5IGNvbnRlbnQgd2JmeSBwdXRzIGluIHRoZSBibG9jay4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VCbG9ja05vZGUobm9kZTogUm9vdENvbnRlbnQpOiBub2RlIGlzIFBhcmFncmFwaCB7XG4gIHJldHVybiAoXG4gICAgbm9kZS50eXBlID09PSAncGFyYWdyYXBoJyAmJlxuICAgIG5vZGUuY2hpbGRyZW4uc29tZSgoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSkgJiZcbiAgICBub2RlLmNoaWxkcmVuLmV2ZXJ5KFxuICAgICAgKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkgfHwgY2hpbGQudHlwZSA9PT0gJ2JyZWFrJyB8fCAoY2hpbGQudHlwZSA9PT0gJ3RleHQnICYmICFjaGlsZC52YWx1ZS50cmltKCkpXG4gICAgKVxuICApO1xufVxuXG4vKiogQSBiYWRnZSBpcyBvbmUgYFshW2FsdF0oaW1hZ2UpXShsaW5rKWAsIHRoZSBvbmx5IHNoYXBlIHdiZnkgZXZlciB3cml0ZXMuICovXG5mdW5jdGlvbiBpc0JhZGdlTm9kZShub2RlOiBSb290Q29udGVudCB8IFBocmFzaW5nQ29udGVudCk6IG5vZGUgaXMgTGluayAmIHsgY2hpbGRyZW46IFtJbWFnZV0gfSB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdsaW5rJyAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBub2RlLmNoaWxkcmVuWzBdPy50eXBlID09PSAnaW1hZ2UnO1xufVxuXG4vKipcbiAqIFRoZSBiYWRnZXMgaW4gdGhlIGJsb2NrLCBhcyB0aGUgZXhhY3Qgc291cmNlIHRleHQgdGhhdCBwcm9kdWNlZCB0aGVtOiBhIGJhZGdlIHdiZnkgZG9lcyBub3QgbWFuYWdlXG4gKiBpcyB3cml0dGVuIGJhY2sgYnl0ZSBmb3IgYnl0ZSBpbnN0ZWFkIG9mIGJlaW5nIHJlLXNlcmlhbGl6ZWQgZnJvbSB0aGUgdHJlZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEJhZGdlcyhub2RlOiBQYXJhZ3JhcGgsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIG5vZGUuY2hpbGRyZW5cbiAgICAuZmlsdGVyKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKVxuICAgIC5tYXAoKGNoaWxkKSA9PiBjb250ZW50LnNsaWNlKGNoaWxkLnBvc2l0aW9uIS5zdGFydC5vZmZzZXQsIGNoaWxkLnBvc2l0aW9uIS5lbmQub2Zmc2V0KSk7XG59XG5cbi8qKlxuICogUGVyY2VudC1lbmNvZGVzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgd291bGQgZW5kIGEgTWFya2Rvd24gZGVzdGluYXRpb24gZWFybHkuIEEgd29ya2Zsb3cgZmlsZSBtYXkgYmVcbiAqIG5hbWVkIGFueXRoaW5nIHdpdGggYSBgLnltbGAgZXh0ZW5zaW9uLCBhbmQgb25lIGNvbnRhaW5pbmcgYChgIG9yIGApYCBwcm9kdWNlZCBhIGJhZGdlIHRoYXQgd2JmeSdzXG4gKiBvd24gYmFkZ2UgcGF0dGVybiBjb3VsZCBub3QgcmVhZCBiYWNrIOKAlCBzbyB0aGUgbGluZSBsZWZ0IHRoZSBibG9jayBhbmQgdGhlIGJhZGdlIHdhcyBkdXBsaWNhdGVkLlxuICovXG5mdW5jdGlvbiBlbmNvZGVVcmxQYXRoKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWygpXFxzXS9ndSwgKGNoYXJhY3RlcikgPT4gYCUke2NoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKSEudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9YCk7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBiYWRnZSBpcyBvbmUgd2JmeSB3cml0ZXMgaXRzZWxmLCBhbmQgc28gbWF5IGJlIHJlcGxhY2VkIGJ5IHRoZSBjdXJyZW50IGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNNYW5hZ2VkQmFkZ2UoYmFkZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYmFkZ2UgPT09IHNlbWFudGljUmVsZWFzZUJhZGdlIHx8IG1hbmFnZWRCYWRnZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChiYWRnZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lRW5kaW5nKGNvbnRlbnQ6IHN0cmluZyk6ICdcXG4nIHwgJ1xcclxcbicge1xuICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxyXFxuJykgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luRW50cnkgPSBwbHVnaW5zW2ldO1xuICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpO1xuICAgICAgY29uc3QgcGx1Z2luID0gaXNBcnJheSA/IHBsdWdpbkVudHJ5WzBdIDogcGx1Z2luRW50cnk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoaXNBcnJheSAmJiBwbHVnaW5FbnRyeVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcblxuY29uc3Qgc2hhcmVkUHJlc2V0ID0gJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb25jJztcbmNvbnN0IGdlbmVyYXRlZFNldHRpbmdzID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFtzaGFyZWRQcmVzZXRdLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IFBhcnRpYWw8dHlwZW9mIGdlbmVyYXRlZFNldHRpbmdzPiAmIHtcbiAgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXTtcbn07XG5cbmNvbnN0IG1hbmFnZWRGaWxlTmFtZSA9ICdyZW5vdmF0ZS5qc29uYyc7XG5cbi8vIHdiZnkgc3VwcG9ydHMgb25lIGNhbm9uaWNhbCBSZW5vdmF0ZSBsb2NhdGlvbi4gTm9uLWNhbm9uaWNhbCBjb25maWdzIGFyZSBmaXhlZCBpbiB0aGUgdGFyZ2V0XG4vLyByZXBvc2l0b3J5IGluc3RlYWQgb2YgYmVpbmcgcGFyc2VkLCBtZXJnZWQsIG9yIGRlbGV0ZWQgaGVyZS5cbmNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ1BhdGhzID0gW1xuICAncmVub3ZhdGUuanNvbicsXG4gICdyZW5vdmF0ZS5qc29uNScsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb24nLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uYycsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb241JyxcbiAgJy5yZW5vdmF0ZXJjJyxcbiAgJy5yZW5vdmF0ZXJjLmpzb24nLFxuICAnLnJlbm92YXRlcmMuanNvbjUnLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIG1hbmFnZWRGaWxlTmFtZSk7XG4gICAgY29uc3QgbWFuYWdlZEZpbGVTdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKG1hbmFnZWRGaWxlU3RhdHM/LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ0NhbmRpZGF0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG5vbkNhbm9uaWNhbENvbmZpZ1BhdGhzLm1hcChhc3luYyAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChjYW5kaWRhdGUpLmNhdGNoKCgpID0+IHt9KSkgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA9IG5vbkNhbm9uaWNhbENvbmZpZ0NhbmRpZGF0ZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCk7XG4gICAgaWYgKG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggfHwgY29uZmlnLnBhY2thZ2VKc29uPy5yZW5vdmF0ZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIHJlcG9zaXRvcnkgaGFzIGEgbm9uLWNhbm9uaWNhbCBSZW5vdmF0ZSBjb25maWcke1xuICAgICAgICAgIG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggPyBgIGF0ICR7bm9uQ2Fub25pY2FsQ29uZmlnUGF0aH1gIDogJyBpbiBwYWNrYWdlLmpzb24nXG4gICAgICAgIH0uYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvbGRTZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShvbGRDb250ZW50KSkge1xuICAgICAgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFNldHRpbmdzPihvbGRDb250ZW50KTtcbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2xkU2V0dGluZ3M/LmV4dGVuZHMgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5leHRlbmRzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcImV4dGVuZHNcIiBpcyBub3QgYW4gYXJyYXkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZWRQcmVzZXQgPSBvbGRTZXR0aW5ncz8uZXh0ZW5kcz8uZmluZChcbiAgICAgIChwcmVzZXQpID0+IHByZXNldC5zdGFydHNXaXRoKCdnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczonKSAmJiBwcmVzZXQgIT09IHNoYXJlZFByZXNldFxuICAgICk7XG4gICAgaWYgKHJlbW92ZWRQcmVzZXQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgXCIke3JlbW92ZWRQcmVzZXR9XCIgbm8gbG9uZ2VyIGV4aXN0czsgcmVtb3ZlIGl0IG1hbnVhbGx5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1NldHRpbmdzID0gYnVpbGRTZXR0aW5ncyhjb25maWcsIG9sZFNldHRpbmdzKTtcbiAgICBjb25zdCB7IGNvbnRlbnQsIGtleXNMb3NpbmdDb21tZW50cyB9ID0ganNvbmNVdGlsLnN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgICBvbGRDb250ZW50LFxuICAgICAgbmV3U2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgbm9ybWFsaXplKGNvbnRlbnQpID09PSBub3JtYWxpemUob2xkQ29udGVudCkpIHJldHVybjtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSkpIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNMb3NpbmdDb21tZW50cykge1xuICAgICAgY29uc29sZS53YXJuKGBDb21tZW50cyBpbnNpZGUgXCIke2tleX1cIiB3ZXJlIGRyb3BwZWQgd2hpbGUgcmV3cml0aW5nIGl0IGluICR7ZmlsZVBhdGh9LmApO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQpOiBTZXR0aW5ncyB7XG4gIGNvbnN0IHNldHRpbmdzID0gb2xkU2V0dGluZ3NcbiAgICA/IChtZXJnZS5hbGwoW2dlbmVyYXRlZFNldHRpbmdzLCBvbGRTZXR0aW5ncywgZ2VuZXJhdGVkU2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3MpXG4gICAgOiBzdHJ1Y3R1cmVkQ2xvbmUoZ2VuZXJhdGVkU2V0dGluZ3MpO1xuICBjb25zdCBleGlzdGluZ0V4dGVuZHMgPSBvbGRTZXR0aW5ncz8uZXh0ZW5kcyA/PyBbXTtcbiAgc2V0dGluZ3MuZXh0ZW5kcyA9IGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlnc1xuICAgID8gZXhpc3RpbmdFeHRlbmRzLmZpbHRlcigocHJlc2V0KSA9PiBwcmVzZXQgIT09IHNoYXJlZFByZXNldClcbiAgICA6IGV4aXN0aW5nRXh0ZW5kcy5pbmNsdWRlcyhzaGFyZWRQcmVzZXQpXG4gICAgICA/IGV4aXN0aW5nRXh0ZW5kc1xuICAgICAgOiBbc2hhcmVkUHJlc2V0LCAuLi5leGlzdGluZ0V4dGVuZHNdO1xuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICByZXR1cm4gdHJpbW1lZENvbnRlbnQgPyB0cmltbWVkQ29udGVudCArICdcXG4nIDogJyc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQge1xuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIC8vIHdiZnkgZ2VuZXJhdGVzIHJvb3QtbGV2ZWwgdG9vbCBjb25maWdzIHN1Y2ggYXMgcGxheXdyaWdodC5jb25maWcudHMsIGFuZFxuICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgbmVlZHMgdGhvc2UgZmlsZXMgaW4gdGhlIHByb2plY3QgdG8gc2VlIE5vZGUvQnVuIGdsb2JhbHMuXG4gIC8vIGBhcHAvKipgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgZXZlbiB0aG91Z2ggdGhlIGRvZXNDb250YWluKlNjcmlwdCBzaWduYWxzIHNjYW4gaXQ6IGFwcFxuICAvLyBkaXJlY3RvcmllcyBiZWxvbmcgdG8gZnJhbWV3b3JrIHBhY2thZ2VzIChOZXh0LmpzL0JsaXR6KSwgd2hpY2ggb3duIHRoZWlyIHRzY29uZmlnXG4gIC8vIChnZW5lcmF0ZVRzY29uZmlnIHNraXBzIHRoZW0pLCBhbmQgY2hlY2tpbmcgZnJhbWV3b3JrIHNvdXJjZXMgdW5kZXIgdGhpcyBwcm9qZWN0J3MgY29tcGlsZXJcbiAgLy8gb3B0aW9ucyB3b3VsZCBwcm9kdWNlIGZhbHNlIGVycm9ycy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHZpbmV4dCBpcyB0aGUgb3JnJ3MgTmV4dC5qcy1lcXVpdmFsZW50IGZyYW1ld29yayBhbmQgb3ducyBpdHMgdHNjb25maWcganVzdCBsaWtlIE5leHQvQmxpdHosXG4gICAgLy8gc28gaXQgbXVzdCBza2lwIHRoZSBzdGFuZGFyZCBnZW5lcmF0aW9uIHRoYXQgd291bGQgb3ZlcndyaXRlIHRoZSBmcmFtZXdvcmsncyBvd24gc2V0dGluZ3MuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBhd2FpdCBub3JtYWxpemVGcmFtZXdvcmtUc2NvbmZpZyhjb25maWcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IChjb25maWcuaXNSb290ID8gYnVpbGRSb290SnNvbk9iaihjb25maWcpIDogc3RydWN0dXJlZENsb25lKHN1Ykpzb25PYmopKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgY29uc3QgZ2VuZXJhdGVkVHlwZXMgPSBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2V0Um9vdERpcihjb25maWcpO1xuICAgIGlmIChnZW5lcmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgdHlwZXM6IGdlbmVyYXRlZFR5cGVzIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvcmlnaW5hbFNldHRpbmdzSnNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8vIEEgZmlsZSB3aXRoIG5vIGNvbmZpZ3VyYXRpb24gKGVtcHR5IG9yIGNvbW1lbnQtb25seSkgaXMgdHJlYXRlZCBsaWtlIGEgbWlzc2luZyBvbmUsIGFzIHRzYyBkb2VzLlxuICAgIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VHNDb25maWdKc29uPihleGlzdGluZ0NvbnRlbnQpO1xuICAgICAgLy8gQW4gZXhpc3RpbmcgdHNjb25maWcuanNvbiB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkOiB3cml0aW5nIHRoZVxuICAgICAgLy8gZ2VuZXJhdGVkIHNldHRpbmdzIHdpdGhvdXQgbWVyZ2luZyB3b3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSBwcm9qZWN0J3MgY29uZmlndXJhdGlvbi5cbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG9sZFNldHRpbmdzKSkpO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAgICAgcmVtb3ZlU3RhbGVNYW5hZ2VkV29ya3NwYWNlRW50cmllcyhjb25maWcsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgLy8gd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcuanNvbiBpcyBhIGxpbnQvdHlwZWNoZWNrIHByb2plY3QsIG5vdCB0aGUgZW1pdFxuICAgICAgLy8gY29udHJhY3QuIEl0IG11c3Qga2VlcCByb290RGlyIGJyb2FkIGVub3VnaCBmb3Igcm9vdCBjb25maWcgZmlsZXMsXG4gICAgICAvLyBzY3JpcHRzLCBzcmMsIGFuZCB0ZXN0cy4gYnVpbGQtdHMgb3ducyBlbWl0IGFuZCBjcmVhdGVzIGEgdGVtcG9yYXJ5XG4gICAgICAvLyBzcmMtb25seSB0c2NvbmZpZyB3aXRoIG5vRW1pdD1mYWxzZSwgZW1pdERlY2xhcmF0aW9uT25seT10cnVlLFxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiLCBhbmQgaW5jbHVkZT1bXCJzcmMvKiovKlwiXSwgc28gcHJlc2VydmluZyBub0VtaXQ9ZmFsc2Ugb3JcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiBoZXJlIHdvdWxkIG9ubHkgYnJlYWsgbm9uLXNyYyB0eXBlLWF3YXJlIGxpbnQgY292ZXJhZ2UuXG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgLi4uZXhpc3RpbmdFbWl0TWV0YWRhdGEgfTtcblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzLCBnZW5lcmF0ZWRUeXBlcyksIC4uLmdlbmVyYXRlZFR5cGVzXSldO1xuICAgICAgaWYgKG1lcmdlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzID0gbWVyZ2VkVHlwZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZERlbGV0ZVR5cGVSb290cyhnZW5lcmF0ZWRUeXBlcykpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlUm9vdHM7XG4gICAgICB9XG4gICAgfVxuICAgIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcobmV3U2V0dGluZ3MsIGNvbmZpZyk7XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgLy8gUGFja2FnZSBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHRocm91Z2ggcGFja2FnZSBleHBvcnRzIGluc3RlYWQgb2YgYmFzZVVybC5cbiAgICAvLyBwYXRocyBpcyBpbnRlbnRpb25hbGx5IHByZXNlcnZlZCBzbyByZXBvLWxvY2FsIHRvb2xpbmcgY2FuIGtlZXAgZXhwbGljaXRcbiAgICAvLyBhbGlhc2VzIHdpdGhvdXQgcmVseWluZyBvbiBiYXNlVXJsJ3MgYnJvYWQgZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy52ZXJiYXRpbU1vZHVsZVN5bnRheDtcbiAgICB9XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktdXAtdG8tZGF0ZSB0c2NvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChvcmlnaW5hbFNldHRpbmdzSnNvbiA9PT0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBtb25vcmVwby1yb290IHRzY29uZmlnLCB3aG9zZSBpbmNsdWRlL2V4Y2x1ZGUgY292ZXIgZXZlcnkgREVDTEFSRUQgd29ya3NwYWNlIGxheW91dCAoZS5nLlxuICogYGFwcHMvKmAgYWxvbmdzaWRlIGBwYWNrYWdlcy8qYCkgc28gdHlwZS1hd2FyZSBsaW50aW5nIHJ1biBmcm9tIHRoZSByb290IHNlZXMgYWxsIHdvcmtzcGFjZVxuICogc291cmNlcywgbm90IGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRSb290SnNvbk9iaihjb25maWc6IFBhY2thZ2VDb25maWcpOiBUc0NvbmZpZ0pzb24ge1xuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9IGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29uc1xuICAgID8gZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMoY29uZmlnKVxuICAgIDogeyBleGNsdWRlczogW10sIGluY2x1ZGVzOiBbXSB9O1xuICBjb25zdCBzZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gIHNldHRpbmdzLmV4Y2x1ZGUgPSBbXG4gICAgLi4ubmV3IFNldChbXG4gICAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5pbmNsdWRlcy5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IGAke3dvcmtzcGFjZVBhdHRlcm59L3Rlc3QvZml4dHVyZXNgKSxcbiAgICAgIC8vIE5lZ2F0aXZlIHdvcmtzcGFjZSBwYXR0ZXJucyAoZS5nLiBgIXBhY2thZ2VzL2V4Y2x1ZGVkYCkgb3B0IHdvcmtzcGFjZSBzdWJ0cmVlcyBvdXQgb2YgdGhlXG4gICAgICAvLyBtb25vcmVwbywgc28gdGhlaXIgc291cmNlcyBtdXN0IG5vdCBlbnRlciB0aGUgcm9vdCB0eXBlLWNoZWNrIHByb2plY3QgZWl0aGVyLiBBIG5lZ2F0aW9uXG4gICAgICAvLyB3aG9zZSBkaXJlY3RvcnkgaXMgYW4gYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgeWllbGRzIHBhY2thZ2Utb3duZWQgc3VicGF0aCBlbnRyaWVzXG4gICAgICAvLyBpbnN0ZWFkIG9mIHRoZSB3aG9sZSBzdWJ0cmVlIChzZWUgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMpLlxuICAgICAgLi4ud29ya3NwYWNlUGF0dGVybnMuZXhjbHVkZXMsXG4gICAgICAvLyBUaGUgbWFuYWdlZCBpbmNsdWRlcyBhYm92ZSBkZWxpYmVyYXRlbHkgb21pdCBmcmFtZXdvcmsgYGFwcC8qKmAgZGlyZWN0b3JpZXMgKHNlZVxuICAgICAgLy8gc3ViSnNvbk9iai5pbmNsdWRlJ3MgY29tbWVudCksIGJ1dCBhIHJlcG8tYXV0aG9yZWQgYnJvYWQgaW5jbHVkZSBzdWNoIGFzIGBlMmUvKipcXC8qYFxuICAgICAgLy8gY2FuIHN0aWxsIGRyYWcgYSBmcmFtZXdvcmsgd29ya3NwYWNlJ3MgYXBwIHNvdXJjZXMgaW50byB0aGUgcm9vdCBwcm9qZWN0LCB3aGVyZSB0aGV5XG4gICAgICAvLyBmYWlsIHVuZGVyIHRoZSByb290IGNvbXBpbGVyIG9wdGlvbnMg4oCUIHRoZWlyIGJhcmUgYG5leHQvKmAgaW1wb3J0cyByZXNvbHZlIG9ubHkgdGhyb3VnaFxuICAgICAgLy8gdGhlIGZyYW1ld29yayB3b3Jrc3BhY2UncyBvd24gdHNjb25maWcgYHBhdGhzYC4gRXhjbHVkZSB0aG9zZSBhcHAgZGlyZWN0b3JpZXMgc28gdGhlXG4gICAgICAvLyByb290IHByb2plY3QgbmV2ZXIgdHlwZS1jaGVja3MgdGhlbSwgbm8gbWF0dGVyIGhvdyBicm9hZCB0aGUgcmVwbydzIGluY2x1ZGUgZ2xvYnMgYXJlLlxuICAgICAgLi4uZ2V0RnJhbWV3b3JrV29ya3NwYWNlQXBwRXhjbHVkZXMoY29uZmlnKSxcbiAgICAgIC4uLihzZXR0aW5ncy5leGNsdWRlID8/IFtdKSxcbiAgICBdKSxcbiAgXS50b1NvcnRlZCgpO1xuICBzZXR0aW5ncy5pbmNsdWRlID0gW1xuICAgIC4uLihzZXR0aW5ncy5pbmNsdWRlID8/IFtdKSxcbiAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5pbmNsdWRlcy5mbGF0TWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBbXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS8qLmNvbmZpZy50c2AsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS9zY3JpcHRzLyoqLypgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vc3JjLyoqLypgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vdGVzdC8qKi8qYCxcbiAgICBdKSxcbiAgXTtcbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG4vLyBGcmFtZXdvcmsgcGFja2FnZXMgb3duIHRoZWlyIHRzY29uZmlnIChnZW5lcmF0ZVRzY29uZmlnIHNraXBzIHRoZW0pIGFuZCBzaGltIGJhcmUgaW1wb3J0cyBzdWNoIGFzXG4vLyBgbmV4dC9uYXZpZ2F0aW9uYCB0aHJvdWdoIHBhY2thZ2UtbG9jYWwgYHBhdGhzYDsgdmluZXh0IGlzIHRoZSBvcmcncyBOZXh0LmpzLWVxdWl2YWxlbnQgZnJhbWV3b3JrXG4vLyBhbmQgYmVoYXZlcyB0aGUgc2FtZS4gVGhlaXIgYXBwIHNvdXJjZXMgdGhlcmVmb3JlIG9ubHkgdHlwZS1jaGVjayB1bmRlciB0aGVpciBvd24gY29uZmlnLlxuY29uc3QgZnJhbWV3b3JrRGVwZW5kZW5jeU5hbWVzID0gWydibGl0eicsICduZXh0JywgJ3ZpbmV4dCddO1xuXG4vLyBBIGZyYW1ld29yayBhcHAgbGl2ZXMgaW4gYGFwcC9gIG9yLCB1bmRlciB0aGUgc3JjLWRpcmVjdG9yeSBsYXlvdXQsIGBzcmMvYXBwL2AuIFRoZSByb290IHByb2plY3Rcbi8vIGluY2x1ZGVzIGA8d29ya3NwYWNlPi9zcmMvKiovKmAsIHNvIGBzcmMvYXBwYCBsZWFrcyBpbiBqdXN0IGFzIGEgcmVwby13aWRlIGdsb2IgY2FuIHB1bGwgaW4gYGFwcGAuXG5jb25zdCBmcmFtZXdvcmtBcHBEaXJOYW1lcyA9IFsnYXBwJywgJ3NyYy9hcHAnXTtcblxuLyoqIFJvb3QgYGV4Y2x1ZGVgIGVudHJpZXMgKHBvc2l4LCByZWxhdGl2ZSB0byB0aGUgcm9vdCkgZm9yIGV2ZXJ5IGZyYW1ld29yayB3b3Jrc3BhY2UncyBhcHAgZGlyZWN0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0RnJhbWV3b3JrV29ya3NwYWNlQXBwRXhjbHVkZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykgcmV0dXJuIFtdO1xuICBjb25zdCBleGNsdWRlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VEaXJQYXRoIG9mIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKGNvbmZpZykpIHtcbiAgICBpZiAoIWRlcGVuZHNPbkZyYW1ld29yayhwYXRoLnJlc29sdmUod29ya3NwYWNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBhcHBEaXJOYW1lIG9mIGZyYW1ld29ya0FwcERpck5hbWVzKSB7XG4gICAgICBjb25zdCBhcHBEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtzcGFjZURpclBhdGgsIGFwcERpck5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYXBwRGlyUGF0aCkpIGV4Y2x1ZGVzLnB1c2gocGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgYXBwRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXhjbHVkZXM7XG59XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbkZyYW1ld29yayhtYW5pZmVzdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgbWFuaWZlc3Q6IFBhY2thZ2VKc29uIHwgbnVsbDtcbiAgdHJ5IHtcbiAgICBtYW5pZmVzdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24gfCBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQSBtYW5pZmVzdCB0aGF0IHBhcnNlcyB0byBhIG5vbi1vYmplY3QgKGUuZy4gYSBmaWxlIGxpdGVyYWxseSBjb250YWluaW5nIGBudWxsYCkgZGVjbGFyZXMgbm9cbiAgLy8gZGVwZW5kZW5jaWVzOyBndWFyZCB0aGUgcHJvcGVydHkgYWNjZXNzLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgdGhyb3cgb3V0c2lkZSB0aGUgdHJ5IGFib3ZlLlxuICBpZiAoIW1hbmlmZXN0IHx8IHR5cGVvZiBtYW5pZmVzdCAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0geyAuLi5tYW5pZmVzdC5kZXBlbmRlbmNpZXMsIC4uLm1hbmlmZXN0LmRldkRlcGVuZGVuY2llcyB9O1xuICByZXR1cm4gZnJhbWV3b3JrRGVwZW5kZW5jeU5hbWVzLnNvbWUoKGRlcGVuZGVuY3lOYW1lKSA9PiBkZXBlbmRlbmNpZXNbZGVwZW5kZW5jeU5hbWVdKTtcbn1cblxuY29uc3QgbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcyA9IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddO1xuXG4vKipcbiAqIFJvb3QgaW5jbHVkZS9leGNsdWRlIGVudHJpZXMgd2JmeSBnZW5lcmF0ZWQgZm9yIGFuIGVhcmxpZXIgd29ya3NwYWNlIGxheW91dCAoZS5nLiBgcGFja2FnZXMvKmBcbiAqIGdsb2JzIGluIGEgcmVwbyB0aGF0IG5vdyBkZWNsYXJlcyBvbmx5IGBhcHBzLypgKSBtdXN0IG5vdCBzdXJ2aXZlIHRoZSBtZXJnZSB3aXRoIHRoZSBleGlzdGluZ1xuICogdHNjb25maWcsIG9yIHRoZSBvYnNvbGV0ZSBkaXJlY3RvcmllcyB3b3VsZCBrZWVwIGVudGVyaW5nIHJvb3QgdHlwZSBjaGVja2luZyBmb3JldmVyLiBBIHByZWZpeFxuICogY291bnRzIGFzIHdiZnktbWFuYWdlZCBvbmx5IHdoZW4gdGhlIENPTVBMRVRFIGdlbmVyYXRlZCBpbmNsdWRlIHNldCBmb3IgaXQgaXMgcHJlc2VudCBhbmQgbm9cbiAqIGxvbmdlciBnZW5lcmF0ZWQg4oCUIGEgdXNlci1hdXRob3JlZCBlbnRyeSBzdWNoIGFzIGEgbG9uZSBgdG9vbHMvKlxcL3NyYy8qKlxcLypgIG5ldmVyIHF1YWxpZmllcy5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU3RhbGVNYW5hZ2VkV29ya3NwYWNlRW50cmllcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBvbGRTZXR0aW5nczogVHNDb25maWdKc29uLFxuICBuZXdTZXR0aW5nczogVHNDb25maWdKc29uXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhbGVQcmVmaXhlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBpZiAoQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5pbmNsdWRlKSkge1xuICAgIGNvbnN0IG9sZEluY2x1ZGUgPSBvbGRTZXR0aW5ncy5pbmNsdWRlLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBzdHJpbmcgPT4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyk7XG4gICAgY29uc3QgZ2VuZXJhdGVkSW5jbHVkZSA9IG5ldyBTZXQobmV3U2V0dGluZ3MuaW5jbHVkZSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBvbGRJbmNsdWRlKSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5KTtcbiAgICAgIGlmICh3b3Jrc3BhY2VQcmVmaXggPT09IHVuZGVmaW5lZCB8fCBzdGFsZVByZWZpeGVzLmhhcyh3b3Jrc3BhY2VQcmVmaXgpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGlzQ29tcGxldGUgPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLmV2ZXJ5KChzdWZmaXgpID0+XG4gICAgICAgIG9sZEluY2x1ZGUuaW5jbHVkZXMoYCR7d29ya3NwYWNlUHJlZml4fS8ke3N1ZmZpeH1gKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzU3RpbGxHZW5lcmF0ZWQgPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLnNvbWUoKHN1ZmZpeCkgPT5cbiAgICAgICAgZ2VuZXJhdGVkSW5jbHVkZS5oYXMoYCR7d29ya3NwYWNlUHJlZml4fS8ke3N1ZmZpeH1gKVxuICAgICAgKTtcbiAgICAgIGlmIChpc0NvbXBsZXRlICYmICFpc1N0aWxsR2VuZXJhdGVkKSBzdGFsZVByZWZpeGVzLmFkZCh3b3Jrc3BhY2VQcmVmaXgpO1xuICAgIH1cbiAgICBpZiAoc3RhbGVQcmVmaXhlcy5zaXplID4gMCkge1xuICAgICAgb2xkU2V0dGluZ3MuaW5jbHVkZSA9IG9sZFNldHRpbmdzLmluY2x1ZGUuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgICAgICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnID8gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB3b3Jrc3BhY2VQcmVmaXggPT09IHVuZGVmaW5lZCB8fCAhc3RhbGVQcmVmaXhlcy5oYXMod29ya3NwYWNlUHJlZml4KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoIUFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuZXhjbHVkZSkpIHJldHVybjtcbiAgY29uc3QgZ2VuZXJhdGVkRXhjbHVkZSA9IG5ldyBTZXQobmV3U2V0dGluZ3MuZXhjbHVkZSk7XG4gIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zXG4gICAgPyBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhjb25maWcpLm1hcCgod29ya3NwYWNlRGlyUGF0aCkgPT5cbiAgICAgICAgcGF0aC5yZWxhdGl2ZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpLCB3b3Jrc3BhY2VEaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKVxuICAgICAgKVxuICAgIDogW107XG4gIG9sZFNldHRpbmdzLmV4Y2x1ZGUgPSBvbGRTZXR0aW5ncy5leGNsdWRlLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSAnc3RyaW5nJyB8fCBnZW5lcmF0ZWRFeGNsdWRlLmhhcyhlbnRyeSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChlbnRyeS5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSkge1xuICAgICAgcmV0dXJuICFzdGFsZVByZWZpeGVzLmhhcyhlbnRyeS5zbGljZSgwLCAtJy90ZXN0L2ZpeHR1cmVzJy5sZW5ndGgpKTtcbiAgICB9XG4gICAgLy8gQSBmcmFtZXdvcmsgYXBwIGV4Y2x1ZGUgKGA8d29ya3NwYWNlPi9hcHBgLCBgPHdvcmtzcGFjZT4vc3JjL2FwcGApIGZvciBhIHN0aWxsLWRlY2xhcmVkXG4gICAgLy8gd29ya3NwYWNlIGlzIHBydW5lZCBieSBjb3ZlcnNXb3Jrc3BhY2VEaXIgYmVsb3cgd2hlbiBubyBsb25nZXIgZ2VuZXJhdGVkOyB0aGlzIGNhdGNoZXMgdGhlXG4gICAgLy8gcmVtYWluaW5nIGNhc2UsIHdoZXJlIHRoZSB3b3Jrc3BhY2UgaXRzZWxmIHdhcyByZW1vdmVkIGFuZCBpdHMgcHJlZml4IGlzIHRoZXJlZm9yZSBzdGFsZS5cbiAgICAvLyAoQSB3cm9uZyBzdWZmaXggc3RyaXAgeWllbGRzIGEgcHJlZml4IGFic2VudCBmcm9tIHN0YWxlUHJlZml4ZXMsIHNvIHRlc3RpbmcgZXZlcnkgbmFtZSBpcyBzYWZlLilcbiAgICBpZiAoXG4gICAgICBmcmFtZXdvcmtBcHBEaXJOYW1lcy5zb21lKFxuICAgICAgICAoYXBwRGlyTmFtZSkgPT4gZW50cnkuZW5kc1dpdGgoYC8ke2FwcERpck5hbWV9YCkgJiYgc3RhbGVQcmVmaXhlcy5oYXMoZW50cnkuc2xpY2UoMCwgLShhcHBEaXJOYW1lLmxlbmd0aCArIDEpKSlcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFjb3ZlcnNXb3Jrc3BhY2VEaXIoZW50cnksIHdvcmtzcGFjZURpclBhdGhzKTtcbiAgfSk7XG59XG5cbi8vIFdoZXRoZXIgYW4gZXhjbHVkZSBlbnRyeSBpcyBhIHdvcmtzcGFjZSBuZWdhdGlvbiAoYCFhcHBzL2V4Y2x1ZGVkYCkgd2hvc2UgbmVnYXRpb24gaXMgZ29uZTogdGhlXG4vLyBkaXJlY3RvcnkgaXMgYSB3b3Jrc3BhY2UgYWdhaW4gYW5kIG11c3QgcmUtZW50ZXIgdGhlIHJvb3QgcHJvamVjdC4gd2JmeSB3cml0ZXMgc3VjaCBhIG5lZ2F0aW9uIGFzXG4vLyBhIGRpcmVjdG9yeSBwYXRoLCBhcyBhIGRpcmVjdG9yeSBQQVRURVJOIHdoZW4gaXQgZXhjbHVkZXMgZXhhY3RseSB3aGF0IGl0IG1hdGNoZXMgKGBhcHBzLypiYCksIG9yXG4vLyBhcyBhbiBhbmNlc3RvcidzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgKGBhcHBzL3gvc3JjYCkg4oCUIHNvIHRoZSBlbnRyeSBtYXkgY292ZXIgYSBkaXNjb3ZlcmVkXG4vLyB3b3Jrc3BhY2UgZGlyZWN0b3J5IG9yIHNpdCB1bmRlciBvbmUuIEEgZ2xvYnN0YXIgc2VnbWVudCBtYXJrcyBhIGh5Z2llbmUgZ2xvYiAobm9kZV9tb2R1bGVzLCBlMmVcbi8vIGFuZCBmcmllbmRzKSwgd2hpY2ggaXMgbmV2ZXIgbmVnYXRpb24tZGVyaXZlZCBhbmQgbXVzdCBzdXJ2aXZlLlxuZnVuY3Rpb24gY292ZXJzV29ya3NwYWNlRGlyKGVudHJ5OiBzdHJpbmcsIHdvcmtzcGFjZURpclBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBpZiAoZW50cnkuc3BsaXQoJy8nKS5pbmNsdWRlcygnKionKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWdleFNvdXJjZSA9IGVudHJ5XG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PlxuICAgICAgc2VnbWVudFxuICAgICAgICAucmVwbGFjZUFsbCgvWy4rXiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJyonLCAnW14vXSonKVxuICAgICAgICAucmVwbGFjZUFsbCgnPycsICdbXi9dJylcbiAgICApXG4gICAgLmpvaW4oJy8nKTtcbiAgY29uc3QgZW50cnlQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7cmVnZXhTb3VyY2V9KD86Ly4qKT8kYCwgJ3UnKTtcbiAgcmV0dXJuIHdvcmtzcGFjZURpclBhdGhzLnNvbWUoXG4gICAgKHdvcmtzcGFjZURpclBhdGgpID0+IGVudHJ5UGF0dGVybi50ZXN0KHdvcmtzcGFjZURpclBhdGgpIHx8IGVudHJ5LnN0YXJ0c1dpdGgoYCR7d29ya3NwYWNlRGlyUGF0aH0vYClcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2hlZFN1ZmZpeCA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuZmluZCgoc3VmZml4KSA9PiBlbnRyeS5lbmRzV2l0aChgLyR7c3VmZml4fWApKTtcbiAgaWYgKCFtYXRjaGVkU3VmZml4KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSBlbnRyeS5zbGljZSgwLCAtKG1hdGNoZWRTdWZmaXgubGVuZ3RoICsgMSkpO1xuICByZXR1cm4gd29ya3NwYWNlUHJlZml4ID09PSAnJyA/IHVuZGVmaW5lZCA6IHdvcmtzcGFjZVByZWZpeDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplRnJhbWV3b3JrVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIE5leHQvQmxpdHogb3duIHRoZWlyIHRzY29uZmlnIHNoYXBlLCBidXQgVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhY2NlcHRzXG4gIC8vIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZ3MgdGhhdCBvbGRlciBwcm9qZWN0cyBjb21tb25seSBpbmhlcml0ZWQuXG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IHVuZGVmaW5lZCB8fCBqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHJldHVybjtcbiAgY29uc3Qgc2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFRzQ29uZmlnSnNvbj4oZXhpc3RpbmdDb250ZW50KTtcbiAgaWYgKCFzZXR0aW5ncykge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBjbGVhbmluZyB1cCAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzKTtcbiAgbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzKTtcbiAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhzZXR0aW5ncywgY29uZmlnKTtcbiAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAvLyBhbHJlYWR5LWNsZWFuIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gIGlmIChKU09OLnN0cmluZ2lmeShzZXR0aW5ncykgPT09IG9yaWdpbmFsU2V0dGluZ3NKc29uKSByZXR1cm47XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSkpO1xufVxuXG4vKipcbiAqIGJ1bi10eXBlcyByZWZlcmVuY2VzIHVuZGljaS10eXBlcyB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KSwgc29cbiAqIEJ1bidzIGlzb2xhdGVkIGxpbmtlciAoZXNwZWNpYWxseSB3aXRoIHRoZSBnbG9iYWwgc3RvcmUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSkgY2Fubm90IHJlc29sdmVcbiAqIGl0IGZyb20gYnVuLXR5cGVzJyBsb2NhdGlvbiwgd2hpY2ggc2lsZW50bHkgZGVncmFkZXMgZ2xvYmFsIGZldGNoIHR5cGVzIHN1Y2ggYXMgUmVzcG9uc2UuIE1hcCBpdFxuICogdG8gdGhlIGNvcHkgdGhhdCBidW5maWcudG9tbCdzIHB1YmxpY0hvaXN0UGF0dGVybiBwbGFjZXMgaW4gdGhlIHJvb3Qgbm9kZV9tb2R1bGVzLlxuICovXG5mdW5jdGlvbiBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICAvLyBNYXAgdW5kaWNpLXR5cGVzIG9ubHkgd2hlbiBidW4tdHlwZXMgYWN0dWFsbHkgbG9hZHM6IGFuIGV4cGxpY2l0IGB0eXBlc2AgbGlzdCBsb2FkcyBpdCBpZmYgaXRcbiAgLy8gY29udGFpbnMgXCJidW5cIiAoZXZlbiBvbiBSZWFjdCBOYXRpdmUsIHdob3NlIHByb2plY3RzIG1heSBvcHQgaW4gYnkgaGFuZCk7IHdpdGggYHR5cGVzYFxuICAvLyBvbWl0dGVkLCBUeXBlU2NyaXB0J3MgYXV0b21hdGljIEB0eXBlcyBpbmNsdXNpb24gbG9hZHMgaXQgYmVjYXVzZSB3YmZ5IGluc3RhbGxzIEB0eXBlcy9idW5cbiAgLy8gZm9yIGV2ZXJ5IFR5cGVTY3JpcHQgcHJvamVjdCBleGNlcHQgUmVhY3QgTmF0aXZlLCB3aGljaCB1c2VzIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUgaW5zdGVhZC5cbiAgY29uc3QgdHlwZXMgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzO1xuICBpZiAodHlwZXMgPyAhdHlwZXMuaW5jbHVkZXMoJ2J1bicpIDogY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkgcmV0dXJuO1xuICBjb25zdCBjb3JyZWN0TWFwcGluZyA9IGAke2dldFJvb3REaXIoY29uZmlnKX0vbm9kZV9tb2R1bGVzL3VuZGljaS10eXBlcy9pbmRleC5kLnRzYDtcbiAgY29uc3QgZXhpc3RpbmdNYXBwaW5nID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5wYXRocz8uWyd1bmRpY2ktdHlwZXMnXTtcbiAgaWYgKGV4aXN0aW5nTWFwcGluZykge1xuICAgIC8vIFJld3JpdGUgdGhlIGdlbmVyYXRlZCBtYXBwaW5nIHdoZW4gYSB3b3Jrc3BhY2UgbW92ZXMgdG8gYSBkaWZmZXJlbnQgcm9vdCBkZXB0aC4gQW55IG90aGVyXG4gICAgLy8gdmFsdWUgaXMgYSBkZWxpYmVyYXRlIHJlcG8tbG9jYWwgbWFwcGluZyAoZS5nLiBwYXRjaGVkIHR5cGVzKSBhbmQgbXVzdCBiZSBrZXB0LlxuICAgIGlmIChcbiAgICAgIGV4aXN0aW5nTWFwcGluZy5sZW5ndGggPT09IDEgJiZcbiAgICAgIHR5cGVvZiBleGlzdGluZ01hcHBpbmdbMF0gPT09ICdzdHJpbmcnICYmXG4gICAgICAvKD86XnxcXC8pbm9kZV9tb2R1bGVzXFwvdW5kaWNpLXR5cGVzXFwvaW5kZXhcXC5kXFwudHMkL3UudGVzdChleGlzdGluZ01hcHBpbmdbMF0pXG4gICAgKSB7XG4gICAgICBzZXR0aW5ncy5jb21waWxlck9wdGlvbnMhLnBhdGhzIVsndW5kaWNpLXR5cGVzJ10gPSBbY29ycmVjdE1hcHBpbmddO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBzZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICBzZXR0aW5ncy5jb21waWxlck9wdGlvbnMucGF0aHMgPSB7XG4gICAgLi4uc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnBhdGhzLFxuICAgICd1bmRpY2ktdHlwZXMnOiBbY29ycmVjdE1hcHBpbmddLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbik6IHZvaWQge1xuICAvLyBPbWl0dGluZyBpbmNsdWRlIGxldHMgZnJhbWV3b3JrIHRzY29uZmlncyBrZWVwIFR5cGVTY3JpcHQncyBkZWZhdWx0XG4gIC8vIFwiYWxsIFRTL1RTWCBmaWxlc1wiIGJlaGF2aW9yLCB3aGljaCBhbHJlYWR5IGNvdmVycyBzY3JpcHRzLlxuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUpIHJldHVybjtcbiAgaWYgKHNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoJ3NjcmlwdHMvKiovKicpKSByZXR1cm47XG5cbiAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKCdzY3JpcHRzLyoqLyonKTtcbiAgc2V0dGluZ3MuaW5jbHVkZS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgY29uc3QgY29tcGlsZXJPcHRpb25zID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zO1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBjb25zdCBtb2R1bGVSZXNvbHV0aW9uID0gbG93ZXJDYXNlU2V0dGluZyhjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbik7XG4gIGlmIChtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHwgbW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUxMCcgfHwgbW9kdWxlUmVzb2x1dGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNldHRpbmdzLmV4dGVuZHMpIHtcbiAgICAgIC8vIEFuIGV4dGVuZGVkIGNvbmZpZyBtYXkgYWxyZWFkeSBzdXBwbHkgYSB2YWxpZCBtb2R1bGUvcmVzb2x2ZXIgcGFpciwgc28gb25seVxuICAgICAgLy8gcmVtb3ZlIHRoZSByZW1vdmVkLWluLVRTNiBub2RlMTAgc3BlbGxpbmdzIGluc3RlYWQgb2YgZm9yY2luZyBidW5kbGVyIG9uIGl0LlxuICAgICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZXh0LmpzIHdyaXRlcyBcIm5vZGVcIiBkdXJpbmcgYnVpbGQgd2hlbiB0aGlzIG9wdGlvbiBpcyBtaXNzaW5nLCBidXRcbiAgICAgIC8vIHRzZ29saW50IHRyZWF0cyB0aGF0IHNwZWxsaW5nIGFzIHRoZSByZW1vdmVkIG5vZGUxMCByZXNvbHZlci5cbiAgICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gJ2J1bmRsZXInO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcblxuICAvLyB0c2dvbGludCBmb2xsb3dzIFR5cGVTY3JpcHQgNiB2YWxpZGF0aW9uLCB3aGVyZSBiYXNlVXJsIGlzIHJlbW92ZWQgYW5kXG4gIC8vIHBhdGggdGFyZ2V0cyBtdXN0IGJlIGV4cGxpY2l0bHkgcmVsYXRpdmUuIE5leHQuanMgc3RpbGwgYWNjZXB0cyB0aGUgYWxpYXNcbiAgLy8gc2hhcGUgYWZ0ZXIgZWFjaCB0YXJnZXQgaXMgd3JpdHRlbiB3aXRoIGEgbGVhZGluZyAuLy5cbiAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5iYXNlVXJsO1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucy5wYXRocykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhjb21waWxlck9wdGlvbnMucGF0aHMpKSB7XG4gICAgY29tcGlsZXJPcHRpb25zLnBhdGhzW2FsaWFzXSA9IG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHRhcmdldHMubWFwKCh0YXJnZXQpID0+IHtcbiAgICBpZiAodGFyZ2V0LnN0YXJ0c1dpdGgoJy4vJykgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoJy4uLycpIHx8IHBhdGguaXNBYnNvbHV0ZSh0YXJnZXQpKSByZXR1cm4gdGFyZ2V0O1xuICAgIHJldHVybiBgLi8ke3RhcmdldH1gO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzUm9vdCkgcmV0dXJuICcuJztcbiAgLy8gVGhlIHVuZGljaS10eXBlcyBwYXRoIG1hcHBpbmcgbXVzdCByZWFjaCB0aGUgbW9ub3JlcG8gcm9vdCdzIG5vZGVfbW9kdWxlcyAoYnVuZmlnLnRvbWwnc1xuICAvLyBwdWJsaWNIb2lzdFBhdHRlcm4gaG9pc3RzIHRoZSBwYWNrYWdlIHRoZXJlKSwgYW5kIHdvcmtzcGFjZSBwYXR0ZXJucyBtYXkgYmUgYXJiaXRyYXJpbHkgZGVlcFxuICAvLyAoZS5nLiBgZXhhbXBsZXMvKipgKSwgc28gYSBmaXhlZCB0d28tbGV2ZWwgcHJvYmUgaXMgbm90IGVub3VnaC4gUHJlZmVyIHRoZSBuZWFyZXN0IGFuY2VzdG9yXG4gIC8vIG1hbmlmZXN0IHRoYXQgZGVjbGFyZXMgd29ya3NwYWNlcyAodGhlIG1vbm9yZXBvIHJvb3QpOyBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBuZWFyZXN0XG4gIC8vIGFuY2VzdG9yIG1hbmlmZXN0LiBTdG9wIGF0IHRoZSBmaXJzdCBnaXQgcmVwb3NpdG9yeSBib3VuZGFyeSBzbyBhbiB1bnJlbGF0ZWQgZW5jbG9zaW5nXG4gIC8vIHJlcG9zaXRvcnkncyBtYW5pZmVzdCBjYW4gbmV2ZXIgYmUgY2hvc2VuLlxuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKTtcbiAgbGV0IHJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGFuY2VzdG9yRGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTsgOyBhbmNlc3RvckRpclBhdGggPSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JEaXJQYXRoKSkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGgucmVzb2x2ZShhbmNlc3RvckRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgICByb290RGlyUGF0aCA/Pz0gYW5jZXN0b3JEaXJQYXRoO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgICAvLyBCdW4gbm8tb3AgcGF0dGVybnMgKGUuZy4gYHdvcmtzcGFjZXM6IFtcIlwiXWApIGRvIG5vdCBtYWtlIGEgbWFuaWZlc3QgYSB3b3Jrc3BhY2Ugcm9vdC5cbiAgICAgICAgaWYgKGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKG1hbmlmZXN0LndvcmtzcGFjZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByb290RGlyUGF0aCA9IGFuY2VzdG9yRGlyUGF0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEFuIHVucGFyc2FibGUgbWFuaWZlc3Qgc3RpbGwgbWFya3MgYSBwcm9qZWN0IGRpcmVjdG9yeTsga2VlcCBjbGltYmluZyBmb3IgYSB3b3Jrc3BhY2Ugcm9vdC5cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXNSZXBvQm91bmRhcnkgPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShhbmNlc3RvckRpclBhdGgsICcuZ2l0JykpO1xuICAgIGNvbnN0IGlzRmlsZXN5c3RlbVJvb3QgPSBhbmNlc3RvckRpclBhdGggPT09IHBhdGguZGlybmFtZShhbmNlc3RvckRpclBhdGgpO1xuICAgIGlmIChpc1JlcG9Cb3VuZGFyeSB8fCBpc0ZpbGVzeXN0ZW1Sb290KSBicmVhaztcbiAgfVxuICBpZiAoIXJvb3REaXJQYXRoKSByZXR1cm4gJy4nO1xuICByZXR1cm4gcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCByb290RGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJykgfHwgJy4nO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBhZGRJbmNsdWRlUGF0aChzZXR0aW5nczogVHNDb25maWdKc29uLCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0dGluZ3MuaW5jbHVkZSA/Pz0gW107XG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcyhkaXJQYXRoKSkge1xuICAgIHNldHRpbmdzLmluY2x1ZGUucHVzaChkaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVR5cGVSb290cyh0eXBlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgZ2VuZXJhdGVkIHBhY2thZ2Utb3duZWQgdGVzdCB0eXBlcyBzaG91bGQgdHJpZ2dlciB0aGlzLiBVc2VyLWRlZmluZWQgc2xhc2gtYmFzZWRcbiAgLy8gZW50cmllcyBtYXkgaW50ZW50aW9uYWxseSByZWx5IG9uIGN1c3RvbSB0eXBlUm9vdHMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMtaXMuXG4gIHJldHVybiB0eXBlTmFtZXMuc29tZSgodHlwZU5hbWUpID0+IHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUuaW5jbHVkZXMoJy8nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlczogc3RyaW5nW10sIGdlbmVyYXRlZFR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2VuZXJhdGVkVHlwZVNldCA9IG5ldyBTZXQoZ2VuZXJhdGVkVHlwZXMpO1xuICByZXR1cm4gZXhpc3RpbmdUeXBlcy5maWx0ZXIoKHR5cGVOYW1lKSA9PiB7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIHBhY2thZ2UtcHJvdmlkZWQgdGVzdCBnbG9iYWxzLiBEcm9wIHN0YWxlIGVudHJpZXMgd2hlbiB0aGVcbiAgICAvLyBjb3JyZXNwb25kaW5nIGRlcGVuZGVuY3kgaXMgbm8gbG9uZ2VyIHByZXNlbnQgc28gVHlwZVNjcmlwdCB3b24ndCByZXF1aXJlXG4gICAgLy8gbWlzc2luZyBwYWNrYWdlcyBzdWNoIGFzIHZpdGVzdC5cbiAgICBpZiAoaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZSkgJiYgIWdlbmVyYXRlZFR5cGVTZXQuaGFzKHR5cGVOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lID09PSAnamVzdCcgfHwgdHlwZU5hbWUgPT09ICdtb2NoYScgfHwgdHlwZU5hbWUgPT09ICd2aXRlc3QvZ2xvYmFscyc7XG59XG5cbmZ1bmN0aW9uIGxvd2VyQ2FzZVNldHRpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddXG4pOiBQaWNrPE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LCAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnPiB7XG4gIGNvbnN0IGVtaXRPcHRpb25zID0ge30gYXMgUGljazxcbiAgICBOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPixcbiAgICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgLy8gUmVhY3QgTmF0aXZlIGdldHMgaXRzIGFtYmllbnQgdHlwZXMgZnJvbSBAdHNjb25maWcvcmVhY3QtbmF0aXZlIChyZWFjdC1uYXRpdmUsIGplc3QpLlxuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdidW4nKTtcbiAgfVxuICBpZiAoXG4gICAgZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICBkZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgIGRlcGVuZGVuY2llc1snamVzdC1lbnZpcm9ubWVudC1qc2RvbSddIHx8XG4gICAgZGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnamVzdCcpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMudml0ZXN0KSB7XG4gICAgdHlwZU5hbWVzLmFkZCgndml0ZXN0L2dsb2JhbHMnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLm1vY2hhKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbW9jaGEnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLmN5cHJlc3MpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdjeXByZXNzJyk7XG4gIH1cblxuICByZXR1cm4gWy4uLnR5cGVOYW1lc107XG59XG4iLCJpbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGUgb2YgZWFjaCBzdXBwb3J0ZWQgYWdlbnQsIHJlbGF0aXZlIHRvIHRoZSBob21lIGRpcmVjdG9yeS4gVGhlc2VcbiAqIGFwcGx5IHRvIGV2ZXJ5IHJlcG9zaXRvcnkgdGhlIGFnZW50IHdvcmtzIGluLCBzbyB0aGV5IGhvbGQgb25seSB0aGUgY29udmVudGlvbnMgdGhhdCBhcmUgdHJ1ZSBvblxuICogZXZlcnkgV2lsbEJvb3N0ZXIgZGV2ZWxvcGVyIG1hY2hpbmUgcmF0aGVyIHRoYW4gaW4gYSBwYXJ0aWN1bGFyIHJlcG9zaXRvcnkuXG4gKi9cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzID0gWycuY29kZXgvQUdFTlRTLm1kJywgJy5jbGF1ZGUvQ0xBVURFLm1kJywgJy5nZW1pbmkvR0VNSU5JLm1kJ10gYXMgY29uc3Q7XG5cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCA9IGAtIFJlcG9zIGxpdmUgdW5kZXIgXFxgfi9naHEvZ2l0aHViLmNvbVxcYDsgYWx3YXlzIGNsb25lIHdpdGggXFxgZ2hxIGdldCAtcFxcYCwgbmV2ZXIgXFxgZ2l0IGNsb25lXFxgLlxuLSBMTE0vQUkgYWdlbnQgcmVzcG9uc2VzIG1heSB0YWtlIDHigJMyIGhvdXJzOyB3YWl0IHBhdGllbnRseSwgZG9uJ3QgYXNzdW1lIGZhaWx1cmUuXG4tIE5vIEFJIGF0dHJpYnV0aW9uIChlLmcuLCBcXGBDby1BdXRob3JlZC1CeVxcYCB0cmFpbGVycywgXCJHZW5lcmF0ZWQgd2l0aCAuLi5cIiBmb290ZXJzKSBpbiBjb21taXRzLCBpc3N1ZXMsIG9yIFBScyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuIFRoaXMgaGlkZXMgbm90aGluZzogaWYgYXNrZWQgd2hpY2ggQUkgYWdlbnQgZGlkIHRoZSB3b3JrLCBhbnN3ZXIgdHJ1dGhmdWxseS5cbmA7XG5cbi8qKlxuICogT3ZlcndyaXRlcyB0aGUgdXNlci1sZXZlbCBpbnN0cnVjdGlvbiBmaWxlcyBvZiBldmVyeSBzdXBwb3J0ZWQgYWdlbnQgd2l0aCB0aGUgZml4ZWQgY29udGVudC5cbiAqIFJldHVybnMgZmFsc2Ugd2hlbiBhbnkgZmlsZSB3YXMgc2tpcHBlZCAoZS5nLiBhIHN5bWxpbmtlZCBmaWxlKSwgc28gdGhlIGNvbW1hbmQgY2FuIGZhaWwgbG91ZGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVVc2VyQWdlbnRJbnN0cnVjdGlvbnMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGxldCBoYXNXcml0dGVuQWxsID0gdHJ1ZTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgdXNlckFnZW50SW5zdHJ1Y3Rpb25GaWxlUGF0aHMpIHtcbiAgICBjb25zdCBoYXNXcml0dGVuID0gYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCByZWxhdGl2ZVBhdGgpLCB1c2VyQWdlbnRJbnN0cnVjdGlvbkNvbnRlbnQpO1xuICAgIGhhc1dyaXR0ZW5BbGwgJiY9IGhhc1dyaXR0ZW47XG4gIH1cbiAgcmV0dXJuIGhhc1dyaXR0ZW5BbGw7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICAgIC8vIC52c2NvZGUvc2V0dGluZ3MuanNvbiBpcyBKU09OQyBieSBkZWZpbml0aW9uOyBKU09OLnBhcnNlIHdvdWxkIG1ha2Ugd2JmeSBzaWxlbnRseSBza2lwXG4gICAgLy8gY29tbWVudGVkIGZpbGVzLlxuICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShwYXJzZWRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICBsZXQgc2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICB9XG4gICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHNldHRpbmdzLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuaW50ZXJmYWNlIEZub3hUb21sU3VidHJlZSB7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgdW5kZWZpbmVkPjtcbn1cblxuLy8gVGhlIGZvdXIgc3RhbmRhcmQgV0JfRU5WIG1vZGVzOyBzdGFnaW5nIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGNvbXBsZXRlZCB3aGVuIHRoZSByZXBvc2l0b3J5XG4vLyBhbHJlYWR5IGRlY2xhcmVzIHRoZSBzdGFnaW5nIHByb2ZpbGUuXG5jb25zdCB3YkVudk1vZGVzID0gWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddIGFzIGNvbnN0O1xudHlwZSBXYkVudk1vZGUgPSAodHlwZW9mIHdiRW52TW9kZXMpW251bWJlcl07XG5cbi8qKlxuICogRW5zdXJlcyBhIGZub3ggcmVwb3NpdG9yeSBkZWZpbmVzIFdCX0VOViBmb3IgZXZlcnkgc3RhbmRhcmQgbW9kZSAoYW5kIE5FWFRfUFVCTElDX1dCX0VOViB3aGVuXG4gKiBhbnkgd29ya3NwYWNlIGRlcGVuZHMgb24gTmV4dC5qcyBvciB2aW5leHQpIGluIGZub3gudG9tbCBwcm9maWxlcy4gRXhpc3RpbmcgZGVmaW5pdGlvbnMgYXJlXG4gKiBhbHdheXMgbGVmdCB1bnRvdWNoZWQuIE5vbi1mbm94IHJlcG9zaXRvcmllcyBhcmUgc2tpcHBlZDogLmVudiBmaWxlcyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2Vuc3VyZVdiRW52RGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmVlZHNOZXh0UHVibGljID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZykpO1xuICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAvLyBsc3RhdCwgbm90IGV4aXN0c1N5bmM6IGV4aXN0c1N5bmMgaXMgZmFsc2UgZm9yIGEgREFOR0xJTkcgZm5veC50b21sIHN5bWxpbms7IGFueSBmbm94LnRvbWxcbiAgICAvLyBkaXJlY3RvcnkgZW50cnkgbWFya3MgYSBmbm94IHJlcG9zaXRvcnksIGFuZCBhIHJlZnVzZWQvZGFuZ2xpbmcgb25lIGFib3J0cyBpbnN0ZWFkIG9mXG4gICAgLy8gYmVpbmcgdHJlYXRlZCBhcyBhIG5vbi1mbm94IHJlcG9zaXRvcnkgd2hpbGUgdGhlIGZub3ggc3luY2hyb25pemF0aW9uIGlzIGZhaWxpbmcuXG4gICAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZm5veFRvbWxQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZm5veFRvbWxQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50LCBuZWVkc05leHRQdWJsaWMpO1xuICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWlycm9ycyB3YidzIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52IGNvbnRyYWN0IChwYWNrYWdlcy93Yi9zcmMvcHJvamVjdC50cyk6IHRoZSBmcmFtZXdvcmsgbWF5XG4gKiBiZSBkZWNsYXJlZCBpbiBBTlkgb2YgdGhlIGZvdXIgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBgbmV4dGAgYXMgYSBkZXZEZXBlbmRlbmN5IGluIGEgc2hhcmVkXG4gKiBjb21wb25lbnQgbGlicmFyeSksIHdoaWxlIHdiZnkncyBgZGVwZW5kaW5nLm5leHRgIGxvb2tzIG9ubHkgYXQgcmVndWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXS5zb21lKChzZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gY29uZmlnLnBhY2thZ2VKc29uPy5bc2VjdGlvbiBhcyAnZGVwZW5kZW5jaWVzJ107XG4gICAgcmV0dXJuICEhZGVwZW5kZW5jaWVzPy5bJ25leHQnXSB8fCAhIWRlcGVuZGVuY2llcz8uWyd2aW5leHQnXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBtaXNzaW5nIFdCX0VOViAoYW5kIG9wdGlvbmFsbHkgTkVYVF9QVUJMSUNfV0JfRU5WKSBlbnRyaWVzIGludG8gYSBmbm94LnRvbWw6IHRoZSBiYXNlXG4gKiBgW3NlY3JldHNdYCB0YWJsZSBjYXJyaWVzIHRoZSBkZXZlbG9wbWVudCBkZWZhdWx0cyBhbmQgYFtwcm9maWxlcy48bW9kZT4uc2VjcmV0c11gIG92ZXJsYXlzXG4gKiBlYWNoIG90aGVyIG1vZGUsIG1hdGNoaW5nIHRoZSBvcmctc3RhbmRhcmQgbGF5b3V0LiBGb3JtYXR0aW5nIGFuZCBjb21tZW50cyBhcmUgcHJlc2VydmVkOyBvbmx5XG4gKiBtaXNzaW5nIGxpbmVzIGFyZSBpbnNlcnRlZCBvciBtaXNzaW5nIHNlY3Rpb25zIGFwcGVuZGVkLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjb250ZW50XG4gKiBjYW5ub3QgYmUgc2FmZWx5IGVkaXRlZCAodW5wYXJzYWJsZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGVkaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudDogc3RyaW5nLCBuZWVkc05leHRQdWJsaWM6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgc2V0dGluZ3M6IEZub3hUb21sU3VidHJlZTtcbiAgdHJ5IHtcbiAgICBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSBpdCBpcyBub3QgcGFyc2FibGUgYXMgVE9NTC4nKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qga2V5TmFtZXMgPSBuZWVkc05leHRQdWJsaWMgPyBbJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSA6IFsnV0JfRU5WJ107XG4gIGxldCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgLy8gVGhlIHN0YWdpbmcgbW9kZSBpcyBvcHRpb25hbDogY29tcGxldGUgaXQgb25seSB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgZGVjbGFyZXMgdGhlIHByb2ZpbGUuXG4gICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHNldHRpbmdzLnNlY3JldHMgOiBzZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBrZXlOYW1lcykge1xuICAgICAgY29uc3QgZGVmaW5lZCA9IGRlZmluZWRLZXlzPy5ba2V5TmFtZV07XG4gICAgICBjb25zdCBkZWZpbmVkVmFsdWUgPVxuICAgICAgICB0eXBlb2YgZGVmaW5lZCA9PT0gJ3N0cmluZycgPyBkZWZpbmVkIDogKGRlZmluZWQgYXMgeyBkZWZhdWx0PzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uZGVmYXVsdDtcbiAgICAgIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWUsIGRlZmluZWRWYWx1ZSwgbW9kZSk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmdMaW5lcyA9IGtleU5hbWVzXG4gICAgICAuZmlsdGVyKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChrZXlOYW1lKSA9PiBgJHtrZXlOYW1lfSA9IHsgZGVmYXVsdCA9IFwiJHttb2RlfVwiIH1gKTtcbiAgICBpZiAobWlzc2luZ0xpbmVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRJbnRvRm5veFNlY3Rpb24oXG4gICAgICB1cGRhdGVkQ29udGVudCxcbiAgICAgIG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyAnc2VjcmV0cycgOiBgcHJvZmlsZXMuJHttb2RlfS5zZWNyZXRzYCxcbiAgICAgIG1pc3NpbmdMaW5lc1xuICAgICk7XG4gIH1cbiAgaWYgKHVwZGF0ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm4gY29udGVudDtcblxuICAvLyBSZS1wYXJzZSBiZWZvcmUgcmV0dXJuaW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cyB3aXRob3V0IGEgdGFibGUgaGVhZGVyKSBjb3VsZFxuICAvLyBtYWtlIHRoZSB0ZXh0dWFsIGVkaXQgcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZTsgZmFpbCBzYWZlbHkgaW5zdGVhZCBvZiBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKHVwZGF0ZWRDb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHVwZGF0ZWRTZXR0aW5ncy5zZWNyZXRzIDogdXBkYXRlZFNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgICBpZiAoa2V5TmFtZXMuc29tZSgoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnNlcnRlZCAke21vZGV9IGVudHJpZXMgZGlkIG5vdCB0YWtlIGVmZmVjdGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1cGRhdGVkQ29udGVudDtcbn1cblxuLyoqXG4gKiBXYXJucyB3aGVuIGFuIGV4aXN0aW5nIFdCX0VOVi1mYW1pbHkgZGVmaW5pdGlvbiBuYW1lcyBhIGRpZmZlcmVudCBtb2RlIHRoYW4gdGhlIG9uZSBpdCBpc1xuICogZGVmaW5lZCBmb3IgKGEgdHlwbyBsaWtlIGBwcm9kY3V0aW9uYCBvciBgcHJvZHVjdGlvbjFgLCBvciBhIGNvcHktcGFzdGVkIHdyb25nIG1vZGUpOiB3YlxuICogcmVqZWN0cyBub24tc3RhbmRhcmQgdmFsdWVzIGF0IHJ1bnRpbWUsIHNvIHN1cmZhY2luZyB0aGUgbWlzbWF0Y2ggZHVyaW5nIHdiZnkgaXMgdGhlIGVhcmxpZXN0XG4gKiBwb3NzaWJsZSBzaWduYWwuIFRoZSBwYXNzZWQgdmFsdWUgaXMgYWx3YXlzIHBsYWludGV4dCAoYSBmbm94IGBkZWZhdWx0YCBmaWVsZCkg4oCUIGVuY3J5cHRlZFxuICogZm5veCBlbnRyaWVzIGFyZSBgeyBwcm92aWRlciwgdmFsdWUgfWAgb2JqZWN0cyB3aG9zZSBgZGVmYXVsdGAgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBtb2RlOiBXYkVudk1vZGUpOiB2b2lkIHtcbiAgLy8gQW4gRU1QVFkgdmFsdWUgY291bnRzIGFzIHVuc2V0ICh3YiBzdXBwbGllcyB0aGUgZmFsbGJhY2sgbW9kZSksIG5vdCBhcyBhIG1pc21hdGNoaW5nIG1vZGUuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbW9kZSkgcmV0dXJuO1xuICAvLyBBIGR5bmFtaWMgdmFsdWUgKGUuZy4gYE5FWFRfUFVCTElDX1dCX0VOVj0ke1dCX0VOVn1gKSBtYXkgbGVnaXRpbWF0ZWx5IHJlc29sdmUgdG8gdGhlIG1vZGVcbiAgLy8gdGhyb3VnaCBleHBhbnNpb24sIHdoaWNoIHRoaXMgc3RhdGljIGNoZWNrIGNhbm5vdCBldmFsdWF0ZSDigJQgc2tpcCBpbnN0ZWFkIG9mIG1pc2ZpcmluZy5cbiAgLy8gZm5veCBleHBhbmRzIG9ubHkgYCR7Li4ufWAgKGEgYmFyZSBgJFVOU0VUYCBzdGF5cyBsaXRlcmFsKS5cbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCckeycpKSByZXR1cm47XG4gIGlmIChrZXlOYW1lID09PSAnTkVYVF9QVUJMSUNfV0JfRU5WJykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2Igb3ZlcnJpZGVzIGl0IHdpdGggV0JfRU5WLCBidXQgYSBkaXJlY3QgZnJhbWV3b3JrIGJ1aWxkIHdvdWxkIGlubGluZSB0aGlzIHZhbHVlLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiByZWplY3RzIHZhbHVlcyBvdXRzaWRlIGRldmVsb3BtZW50L3Rlc3Qvc3RhZ2luZy9wcm9kdWN0aW9uLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGxpbmVzIGF0IHRoZSB0b3Agb2YgYSBUT01MIHNlY3Rpb24sIHJpZ2h0IGFmdGVyIGl0cyBgW2hlYWRlcl1gIGxpbmUgc28gcHJvZmlsZS1zcGVjaWZpY1xuICogZW50cmllcyBzdGF5IGdyb3VwZWQgd2l0aCB0aGVpciBoZWFkZXI7IHRoZSBzZWN0aW9uIGlzIGFwcGVuZGVkIGF0IHRoZSBlbmQgd2hlbiBpdCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEludG9Gbm94U2VjdGlvbihjb250ZW50OiBzdHJpbmcsIHNlY3Rpb25OYW1lOiBzdHJpbmcsIGluc2VydGVkTGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgLy8gd2JmeSB3cml0ZXMgdGhlIGhlYWRlciB3aXRob3V0IHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBkb3R0ZWQta2V5IGNvbXBvbmVudHMuXG4gIGNvbnN0IGhlYWRlclBhdHRlcm4gPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXlxccypcXFske3NlY3Rpb25OYW1lLnJlcGxhY2VBbGwoJy4nLCBTdHJpbmcucmF3YFxcLmApfVxcXVxccyooPzojLiopPyRgLCAndScpO1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gaGVhZGVyUGF0dGVybi50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bJHtzZWN0aW9uTmFtZX1dXFxuJHtpbnNlcnRlZExpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCArIDEpLCAuLi5pbnNlcnRlZExpbmVzLCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEpXS5qb2luKCdcXG4nKTtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLyoqXG4gKiBSZXBvc2l0b3JpZXMgb3V0c2lkZSBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZVxuICogd29ya2Zsb3dzOiB0aG9zZSB3b3JrZmxvd3MgZGVwZW5kIG9uIG9yZ2FuaXphdGlvbiBzZWNyZXRzIChWRVJEQUNDSU9fVE9LRU4sIERpc2NvcmQgd2ViaG9va3MpXG4gKiBhbmQgc2VsZi1ob3N0ZWQgcnVubmVycyB0aGF0IG90aGVyIG93bmVycyBkbyBub3QgaGF2ZS4gVGhpcyBnZW5lcmF0b3IgaW5zdGVhZCBlbWl0c1xuICogc2VsZi1jb250YWluZWQgd29ya2Zsb3dzIGJ1aWx0IG9ubHkgZnJvbSB3aGF0IGFueSByZXBvc2l0b3J5IG93bmVyIGNhbiBwcm92aWRlOiB0aGUgcmVwb3NpdG9yeVxuICogY29udGVudHMgKG1pc2UudG9tbCwgcGFja2FnZS5qc29uIHNjcmlwdHMpIGFuZCB0aGUgc2luZ2xlIGBGTk9YX0FHRV9LRVlgIHJlcG9zaXRvcnkgc2VjcmV0IHdoZW5cbiAqIHRoZSByZXBvc2l0b3J5IHVzZXMgZm5veC4gR2VuZXJhdGlvbiBpcyBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXInc1xuICogaWRlbnRpdHksIHNvIGl0IHdvcmtzIGZvciBhcmJpdHJhcnkgcGVyc29uYWwgcmVwb3NpdG9yaWVzLlxuICovXG5cbi8qKiBGaXJzdCBsaW5lIG9mIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlOyBmaWxlcyB3aXRob3V0IGl0IGFyZSBoYW5kLXdyaXR0ZW4gYW5kIG5ldmVyIHRvdWNoZWQuICovXG5leHBvcnQgY29uc3Qgc2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnkuJztcblxuLy8gU2FtZSBwaW5zIGFzIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MgLyB0aGVpciBjb25zdW1lcnM7IFJlbm92YXRlIHVwZGF0ZXMgdGhlbSBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkuXG5jb25zdCBjaGVja291dEFjdGlvbiA9ICdhY3Rpb25zL2NoZWNrb3V0QHY3LjAuMSc7XG5jb25zdCBtaXNlQWN0aW9uID0gJ2pkeC9taXNlLWFjdGlvbkB2NC4yLjMnO1xuY29uc3QgY2FjaGVBY3Rpb24gPSAnYWN0aW9ucy9jYWNoZUB2Ni4xLjAnO1xuY29uc3QgdXBsb2FkQXJ0aWZhY3RBY3Rpb24gPSAnYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjcuMC4xJztcbi8vIHY2LjEuMTsgdGhlIHNhbWUgcGluIGFzIHRoZSByZXVzYWJsZSBzZW1hbnRpYy1wciB3b3JrZmxvdy5cbmNvbnN0IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24gPSAnYW1hbm5uL2FjdGlvbi1zZW1hbnRpYy1wdWxsLXJlcXVlc3RANDViOWVkN2NmMjQwODdhMmY3Nzg1YmY1NWJlOTczOTRiYTg3ZTFjMic7XG4vLyB2My4wLjM7IGRlcGxveXMgYXJlIG5ldHdvcmstaGVhdnkgYW5kIGJlbmVmaXQgZnJvbSByZXRyaWVzIHdpdGggYSBsb25nIHRpbWVvdXQuXG5jb25zdCByZXRyeUFjdGlvbiA9ICduaWNrLWZpZWxkcy9yZXRyeUBkZDU2ZjFjYThjYTk5MWUyMzg1YzE4YWI2ZGQzNmVhN2Y5ZmRiNTVmJztcblxuLyoqXG4gKiBKb2ItbGV2ZWwgZW52IHRoYXQgdHVybnMgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHBhdGggb24sIG1pcnJvcmluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzLlxuICpcbiAqIGBzZWNyZXRzYCBpcyB1bmF2YWlsYWJsZSBpbiBhIHN0ZXAtbGV2ZWwgYGlmOmAsIHNvIHRoZSBwcmVzZW5jZSBvZiB0aGUgdG9rZW4gaXMgZXhwb3NlZCBhcyBhXG4gKiBub24tc2VjcmV0IHNpZ25hbDsgYW4gdW5zZXQgc2VjcmV0IGV4cGFuZHMgdG8gYGZhbHNlYCBhbmQgbGVhdmVzIGV2ZXJ5IEd1YXJkIHN0ZXAgc2tpcHBlZCwgd2hpY2hcbiAqIGlzIHdoYXQga2VlcHMgdGhlIGdlbmVyYXRlZCB3b3JrZmxvd3MgcnVubmFibGUgaW4gYSByZXBvc2l0b3J5IHRoYXQgbmV2ZXIgcmVnaXN0ZXJzIHRoZSBzZWNyZXQuXG4gKiBUQUtVTUlfR1VBUkRfVE9LRU4gaXRzZWxmIGlzIGRlZmluZWQtYnV0LUVNUFRZIGpvYi13aWRlIHNvIHRoZSBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2VcbiAqIGluIHRoZSBnZW5lcmF0ZWQgLm5wbXJjIHN0aWxsIGV4cGFuZHMgKHRvICcnKSBpbiB0aGUgc3RlcHMgdGhhdCBkZWxpYmVyYXRlbHkgcnVuIHdpdGhvdXQgdGhlXG4gKiB0b2tlbjsgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkIHZhcmlhYmxlIGlzIHdoYXQgYnJlYWtzIGFuIGluc3RhbGwsIGFuIGVtcHR5IG9uZSBpcyBmaW5lLlxuICovXG5jb25zdCBndWFyZEpvYkVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgSEFTX1RBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyAhIXNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyxcbiAgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJyxcbn07XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgbmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICB1c2VzPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gICd3b3JraW5nLWRpcmVjdG9yeSc/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbmN1cnJlbmN5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7ICdydW5zLW9uJzogc3RyaW5nOyBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0ZXBzOiBTdGVwW10gfVxuICA+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxQYWNrYWdlQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdID0gW3Jvb3RDb25maWddXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKHdvcmtmbG93c1BhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgd29ya2Zsb3dzIGJlY2F1c2UgJHt3b3JrZmxvd3NQYXRofSByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHVzZXNGbm94ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpO1xuICAgIGNvbnN0IHdvcmtmbG93QnlGaWxlTmFtZTogUmVjb3JkPHN0cmluZywgV29ya2Zsb3c+ID0ge1xuICAgICAgJ3Rlc3QueW1sJzogYnVpbGRUZXN0V29ya2Zsb3cocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MsIHVzZXNGbm94KSxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnOiBidWlsZFNlbWFudGljUHJXb3JrZmxvdygpLFxuICAgIH07XG4gICAgLy8gRGVwbG95IHdvcmtmbG93cyBhcmUgZ2VuZXJhdGVkIHBlciBkZXBsb3kgc2NyaXB0IHRoZSByZXBvc2l0b3J5IGRlY2xhcmVzLCBzbyBhIHJlcG9zaXRvcnlcbiAgICAvLyB3aXRob3V0IGEgc3RhZ2luZyBlbnZpcm9ubWVudCBzaW1wbHkgZ2V0cyBubyBzdGFnaW5nIHdvcmtmbG93LiBPbmx5IHNjcmlwdHMgdGhhdCBpbnZva2VcbiAgICAvLyBgd2IgZGVwbG95YCBxdWFsaWZ5OiBhIGJlc3Bva2UgZGVwbG95IHNjcmlwdCBtYXkgbm90IGJlIHNhZmUgdG8gdHJpZ2dlciBhdXRvbWF0aWNhbGx5XG4gICAgLy8gKGRlcGxveS1zdGFnaW5nIHJ1bnMgb24gZXZlcnkgcHVzaCB0byB0aGUgZGVmYXVsdCBicmFuY2gpLlxuICAgIGNvbnN0IHNjcmlwdHMgPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICAgIGNvbnN0IGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA9IGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0c1snZGVwbG95J10pO1xuICAgIGlmIChoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cpIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsnZGVwbG95LXByb2R1Y3Rpb24ueW1sJ10gPSBidWlsZERlcGxveVdvcmtmbG93KCdwcm9kdWN0aW9uJywgJ2RlcGxveScsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0c1snZGVwbG95OnN0YWdpbmcnXSkpIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsnZGVwbG95LXN0YWdpbmcueW1sJ10gPSBidWlsZERlcGxveVdvcmtmbG93KCdzdGFnaW5nJywgJ2RlcGxveTpzdGFnaW5nJywgdXNlc0Zub3gpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlICYmIHJvb3RDb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ3JlbGVhc2UueW1sJ10gPSBidWlsZFJlbGVhc2VXb3JrZmxvdyhyb290Q29uZmlnLCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3csIHVzZXNGbm94KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHdvcmtmbG93XSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvd0J5RmlsZU5hbWUpKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVTZWxmQ29udGFpbmVkV29ya2Zsb3cocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgd29ya2Zsb3cpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhmaWxlUGF0aDogc3RyaW5nLCB3b3JrZmxvdzogV29ya2Zsb3cpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgLy8gVW5saWtlIFdpbGxCb29zdGVyLW9yZ2FuaXphdGlvbiByZXBvc2l0b3JpZXMsIHdiZnkgZG9lcyBub3Qgb3duIGFyYml0cmFyeSByZXBvc2l0b3JpZXMnIENJOlxuICAvLyBvbmx5IGZpbGVzIGl0IGdlbmVyYXRlZCAoaWRlbnRpZmllZCBieSB0aGUgbWFya2VyKSBhcmUgcmVnZW5lcmF0ZWQsIGFuZCBoYW5kLXdyaXR0ZW5cbiAgLy8gd29ya2Zsb3dzIGFyZSBuZXZlciB0b3VjaGVkLiBPd25lcnMgb3B0IG91dCBwZXJtYW5lbnRseSBieSByZW1vdmluZyB0aGUgbWFya2VyIGxpbmUuXG4gIC8vIEFuIGVtcHR5IG9yIHdoaXRlc3BhY2Utb25seSBmaWxlIGNhcnJpZXMgbm8gaGFuZC13cml0dGVuIGNvbnRlbnQsIHNvIGl0IGlzIHRyZWF0ZWQgYXMgYWJzZW50LlxuICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG9sZENvbnRlbnQudHJpbSgpICE9PSAnJyAmJiAhb2xkQ29udGVudC5zdGFydHNXaXRoKHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXIgPSBgJHtzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXJ9IFJlbW92ZSB0aGlzIGxpbmUgdG8gc3RvcCB3YmZ5IGZyb20gb3ZlcndyaXRpbmcgdGhpcyBmaWxlLlxcbmA7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKHdvcmtmbG93LCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgaGVhZGVyICsgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiB3b3JraW5nRGlyKGRpclBhdGg6IHN0cmluZyk6IFBpY2s8U3RlcCwgJ3dvcmtpbmctZGlyZWN0b3J5Jz4ge1xuICByZXR1cm4gZGlyUGF0aCA/IHsgJ3dvcmtpbmctZGlyZWN0b3J5JzogZGlyUGF0aCB9IDoge307XG59XG5cbmZ1bmN0aW9uIGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2IgZGVwbG95XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBidWlsZFRlc3RXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbFBhY2thZ2VDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sIHVzZXNGbm94OiBib29sZWFuKTogV29ya2Zsb3cge1xuICAvLyBQbGF5d3JpZ2h0IG1heSBiZSBkZWNsYXJlZCBvbmx5IGluIHdvcmtzcGFjZSBwYWNrYWdlczsgYHdiIHRlc3Qtb24tY2lgIHJ1bnMgZXZlcnkgZGVjbGFyaW5nXG4gIC8vIHBhY2thZ2UncyBlMmUgdGVzdHMsIHNvIHRoZSB3b3JrZmxvdyBtdXN0IGluc3RhbGwgYnJvd3NlcnMgZm9yIGVhY2ggb2YgdGhlbSAodGhlaXIgdmVyc2lvbnNcbiAgLy8gbWF5IGRpZmZlciwgYW5kIGVhY2ggbGlicmFyeSB2ZXJzaW9uIHJlcXVpcmVzIGl0cyBtYXRjaGluZyBicm93c2VyIGJpbmFyaWVzKS4gQnVuJ3MgaXNvbGF0ZWRcbiAgLy8gbGlua2VyIHJlc29sdmVzIHRoZSBwbGF5d3JpZ2h0IGJpbmFyeSBvbmx5IGZyb20gdGhlIGRlY2xhcmluZyBwYWNrYWdlLCBoZW5jZSB0aGVcbiAgLy8gd29ya2luZy1kaXJlY3Rvcnkgb24gZXZlcnkgc3RlcC4gVGhlIGJyb3dzZXJzIGxhbmQgaW4gfi8uY2FjaGUvbXMtcGxheXdyaWdodCwgc2hhcmVkIGFjcm9zc1xuICAvLyB3b3Jrc3BhY2VzLCBzbyBzYW1lLXZlcnNpb24gaW5zdGFsbHMgbmF0dXJhbGx5IGRlZHVwbGljYXRlLlxuICBjb25zdCBwbGF5d3JpZ2h0RGlyUGF0aHMgPSBbLi4uYWxsUGFja2FnZUNvbmZpZ3NdXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLmRpclBhdGgubG9jYWxlQ29tcGFyZShiLmRpclBhdGgpKVxuICAgIC5maWx0ZXIoKHBhY2thZ2VDb25maWcpID0+IHBhY2thZ2VDb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KVxuICAgIC5tYXAoKHBhY2thZ2VDb25maWcpID0+IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIHBhY2thZ2VDb25maWcuZGlyUGF0aCkpO1xuICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieSBgYnVuIGluc3RhbGxgXG4gIC8vIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gIGNvbnN0IGZub3hFbnY6IFBpY2s8U3RlcCwgJ2Vudic+ID0gdXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9O1xuXG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiB9LFxuICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKHRydWUpLFxuICAgIC4uLihwbGF5d3JpZ2h0RGlyUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyAoW1xuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgsIGluZGV4KTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgbmFtZTogYEdldCBQbGF5d3JpZ2h0IHZlcnNpb24ke2RpclBhdGggPyBgICgke2RpclBhdGh9KWAgOiAnJ31gLFxuICAgICAgICAgICAgLy8gVGhlIElOU1RBTExFRCB2ZXJzaW9uLCBub3QgdGhlIHBhY2thZ2UuanNvbiBzcGVjaWZpZXI6IGEgcmFuZ2UgbGlrZSBgXjEuNDUuMGBcbiAgICAgICAgICAgIC8vIHN0YXlzIHVuY2hhbmdlZCBhY3Jvc3MgbG9ja2ZpbGUgdXBkYXRlcywgc28ga2V5aW5nIHRoZSBjYWNoZSBvbiBpdCB3b3VsZCByZXN0b3JlXG4gICAgICAgICAgICAvLyBzdGFsZSBicm93c2VycyB0aGF0IG5vIGxvbmdlciBtYXRjaCB0aGUgbGlicmFyeS4gUnVucyBhZnRlciBgYnVuIGluc3RhbGxgLCBzbyB0aGVcbiAgICAgICAgICAgIC8vIHBhY2thZ2UgaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSdzIGRpcmVjdG9yeS5cbiAgICAgICAgICAgIGlkOiBgcGxheXdyaWdodC12ZXJzaW9uLSR7aW5kZXh9YCxcbiAgICAgICAgICAgIHJ1bjogJ2VjaG8gXCJ2ZXJzaW9uPSQoYnVuIC1lIFwidHJ5IHsgY29uc29sZS5sb2cocmVxdWlyZShcXCdAcGxheXdyaWdodC90ZXN0L3BhY2thZ2UuanNvblxcJykudmVyc2lvbikgfSBjYXRjaCB7fVwiKVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQ2FjaGUgUGxheXdyaWdodCBicm93c2VycycsXG4gICAgICAgICAgICBpZDogJ3BsYXl3cmlnaHQtY2FjaGUnLFxuICAgICAgICAgICAgdXNlczogY2FjaGVBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHBhdGg6ICd+Ly5jYWNoZS9tcy1wbGF5d3JpZ2h0JyxcbiAgICAgICAgICAgICAga2V5OiBgcGxheXdyaWdodC1cXCR7eyBydW5uZXIub3MgfX0tJHtwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChfLCBpbmRleCkgPT4gYFxcJHt7IHN0ZXBzLnBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fS5vdXRwdXRzLnZlcnNpb24gfX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCctJyl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoKTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCAhPSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgYnJvd3NlcnMgc3RpbGwgbmVlZCB0aGVpciBzeXN0ZW0gZGVwZW5kZW5jaWVzIG9uIGEgZnJlc2ggcnVubmVyLlxuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwtZGVwcycsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgOiBbXSksXG4gICAgLi4uKGhhc1R5cGVjaGVjayA/IFt7IHJ1bjogJ2J1biBydW4gdHlwZWNoZWNrJywgLi4uZm5veEVudiB9XSA6IFtdKSxcbiAgICB7IHJ1bjogJ2J1biBydW4gbGludCcsIC4uLmZub3hFbnYgfSxcbiAgICB7IHJ1bjogJ2J1biBydW4gdGVzdC9jaScsIC4uLmZub3hFbnYgfSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdVcGxvYWQgdGVzdCByZXN1bHRzJyxcbiAgICAgICAgICAgIGlmOiAnJHt7IGFsd2F5cygpIH19JyxcbiAgICAgICAgICAgIHVzZXM6IHVwbG9hZEFydGlmYWN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBuYW1lOiAndGVzdC1yZXN1bHRzJyxcbiAgICAgICAgICAgICAgLy8gRXZlcnkgZGVjbGFyaW5nIHBhY2thZ2Ugd3JpdGVzIGl0cyBvd24gdGVzdC1yZXN1bHRzIGRpcmVjdG9yeTsgYSBuZXdsaW5lLXNlcGFyYXRlZFxuICAgICAgICAgICAgICAvLyBsaXN0IHVwbG9hZHMgdGhlbSBhbGwuXG4gICAgICAgICAgICAgIHBhdGg6IHBsYXl3cmlnaHREaXJQYXRoc1xuICAgICAgICAgICAgICAgIC5tYXAoKGRpclBhdGgpID0+IChkaXJQYXRoID8gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICd0ZXN0LXJlc3VsdHMnKSA6ICd0ZXN0LXJlc3VsdHMnKSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdpZ25vcmUnLFxuICAgICAgICAgICAgICAncmV0ZW50aW9uLWRheXMnOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgICAgOiBbXSksXG4gIF07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHsgYnJhbmNoZXM6IFsnbWFpbiddIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6ICdyZWFkJyB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBGT1JDRV9DT0xPUjogJzMnLCBXQl9FTlY6ICd0ZXN0JywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHMsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVwbG95V29ya2Zsb3coZW52aXJvbm1lbnQ6ICdzdGFnaW5nJyB8ICdwcm9kdWN0aW9uJywgc2NyaXB0TmFtZTogc3RyaW5nLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBgRGVwbG95IGFwcCBvbiAke2Vudmlyb25tZW50fWAsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgICAgLy8gUHJvZHVjdGlvbiBkZXBsb3lzIGZvbGxvdyBwdWJsaXNoZWQgcmVsZWFzZXMgKHNlZSB0aGUgcmVsZWFzZSB3b3JrZmxvdydzIHRyaWdnZXIgc3RlcCk7XG4gICAgICAvLyBzdGFnaW5nIGNvbnZlcmdlcyBvbiBldmVyeSBkZWZhdWx0LWJyYW5jaCBwdXNoLlxuICAgICAgLi4uKGVudmlyb25tZW50ID09PSAncHJvZHVjdGlvbidcbiAgICAgICAgPyB7IHJlbGVhc2U6IHsgdHlwZXM6IFsncHVibGlzaGVkJ10gfSB9XG4gICAgICAgIDogeyBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSwgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddIH0gfSksXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICBkZXBsb3k6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBXQl9FTlY6IGVudmlyb25tZW50LCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIC8vIGZldGNoLWRlcHRoIDAgc28gYGdpdCBkZXNjcmliZWAgc2VlcyB0aGUgdGFncyBXQl9WRVJTSU9OIGlzIGRlcml2ZWQgZnJvbS5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdTZXQgV0JfVkVSU0lPTicsXG4gICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbldCX1ZFUlNJT049JChnaXQgZGVzY3JpYmUgLS1hbHdheXMgLS10YWdzKVxcbmVjaG8gXCJXQl9WRVJTSU9OPSRXQl9WRVJTSU9OXCIgPj4gXCIkR0lUSFVCX0VOVlwiJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnRGVwbG95JyxcbiAgICAgICAgICAgIHVzZXM6IHJldHJ5QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICB0aW1lb3V0X21pbnV0ZXM6IDYwLFxuICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHM6IDUsXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFN0ZXAtc2NvcGVkIGxpa2UgdGhlIHRlc3Qgd29ya2Zsb3c6IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgcnVuIGJ5XG4gICAgICAgICAgICAvLyBgYnVuIGluc3RhbGxgIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gICAgICAgICAgICAuLi4odXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbGVhc2VXb3JrZmxvdyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3c6IGJvb2xlYW4sXG4gIHVzZXNGbm94OiBib29sZWFuXG4pOiBXb3JrZmxvdyB7XG4gIGNvbnN0IGZub3hFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB1c2VzRm5veCA/IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IDoge307XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbLi4uY29uZmlnLnJlbGVhc2UuYnJhbmNoZXNdIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgZGlzcGF0Y2hpbmcgdGhlIHByb2R1Y3Rpb24gZGVwbG95IHdvcmtmbG93IGFmdGVyIGEgcmVsZWFzZVxuICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA/IHsgYWN0aW9uczogJ3dyaXRlJyB9IDoge30pLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gUmVsZWFzZXMgYnVpbGQgcHJvZHVjdGlvbiBhcnRpZmFjdHMsIGhlbmNlIHRoZSBlbnZpcm9ubWVudCDigJQgdGhlIHNhbWUgZGVmYXVsdCBhcyB0aGVcbiAgICAgICAgLy8gcmV1c2FibGUgcmVsZWFzZSB3b3JrZmxvdy4gd2IncyBDSSBndWFyZCBhbHNvIHJlcXVpcmVzIGFuIGV4cG9ydGVkIFdCX0VOViwgc28gd2l0aG91dFxuICAgICAgICAvLyBpdCBhIGBwb3N0aW5zdGFsbGAgdGhhdCBjYWxscyB3YiAoZS5nLiBgd2IgZ2VuLWNvZGVgKSBleGl0cyAxIGJlZm9yZSBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICAgIC8vIHJ1bnMuXG4gICAgICAgIGVudjogeyBXQl9FTlY6ICdwcm9kdWN0aW9uJywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwOiBzZW1hbnRpYy1yZWxlYXNlIHJlYWRzIHRoZSBmdWxsIGhpc3RvcnkgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLlxuICAgICAgICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24sIHdpdGg6IHsgJ2ZldGNoLWRlcHRoJzogMCB9IH0sXG4gICAgICAgICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgICAgICAgLi4uYnVpbGRJbnN0YWxsU3RlcHMoZmFsc2UpLFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdHZXQgY3VycmVudCBsYXRlc3QgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncHJlLXJlbGVhc2UtdGFnJyxcbiAgICAgICAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuZWNobyBcInRhZz0kKGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hYmJyZXY9MCAyPi9kZXYvbnVsbCB8fCBlY2hvIFxcJ1xcJylcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICAgICAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgY2hlY2tzIE5vZGUuanMgcnVudGltZSByZXF1aXJlbWVudHM7IGBidW4gPGJpbj5gIHJlc3BlY3RzIGl0c1xuICAgICAgICAgICAgLy8gYCMhL3Vzci9iaW4vZW52IG5vZGVgIHNoZWJhbmcsIHNvIGl0IHN0aWxsIHJ1bnMgdW5kZXIgcmVhbCBOb2RlLlxuICAgICAgICAgICAgcnVuOiAnYnVuIHNlbWFudGljLXJlbGVhc2UnLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgICAgICAgIExFRlRIT09LOiAnMCcsXG4gICAgICAgICAgICAgIC4uLmZub3hFbnYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd1xuICAgICAgICAgICAgPyAoW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdDaGVjayBmb3IgbmV3IHJlbGVhc2UgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncG9zdC1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmdpdCBmZXRjaCAtLXRhZ3MgLS1mb3JjZVxcbk5FV19UQUc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXFxuZWNobyBcInRhZz0kTkVXX1RBR1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxcbmlmIFtbIC1uIFwiJE5FV19UQUdcIiAmJiBcIiRORVdfVEFHXCIgIT0gXCIke3sgc3RlcHMucHJlLXJlbGVhc2UtdGFnLm91dHB1dHMudGFnIH19XCIgXV07IHRoZW5cXG4gIGVjaG8gXCJjcmVhdGVkPXRydWVcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5maScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZjogXCJzdGVwcy5wb3N0LXJlbGVhc2UtdGFnLm91dHB1dHMuY3JlYXRlZCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdUcmlnZ2VyIHByb2R1Y3Rpb24gZGVwbG95JyxcbiAgICAgICAgICAgICAgICAgIC8vIEEgR0lUSFVCX1RPS0VOLWNyZWF0ZWQgcmVsZWFzZSBkb2VzIG5vdCBmaXJlIHRoZSBkZXBsb3kgd29ya2Zsb3cnc1xuICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZS1wdWJsaXNoZWQgdHJpZ2dlciwgc28gZGlzcGF0Y2ggaXQgZXhwbGljaXRseSBvbiB0aGUgbmV3IHRhZy5cbiAgICAgICAgICAgICAgICAgIHJ1bjogJ2doIHdvcmtmbG93IHJ1biBkZXBsb3ktcHJvZHVjdGlvbi55bWwgLS1yZWYgXCIke3sgc3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiJyxcbiAgICAgICAgICAgICAgICAgIGVudjogeyBHSF9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdIHNhdGlzZmllcyBTdGVwW10pXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbCBzZXF1ZW5jZSBldmVyeSBnZW5lcmF0ZWQgd29ya2Zsb3cgc2hhcmVzOiBgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVgLCBoYXJkZW5lZCBpbnRvIHRoZVxuICogcmV1c2FibGUgd29ya2Zsb3dzJyB0aHJlZS1zdGVwIGRhbmNlIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVnaXN0ZXJzIGEgVEFLVU1JX0dVQVJEX1RPS0VOIHNlY3JldC5cbiAqXG4gKiBUYWt1bWkgR3VhcmQgKGh0dHBzOi8vZmxhdHQudGVjaC90YWt1bWkvZmVhdHVyZXMvZ3VhcmQpIGlzIGEgcmVnaXN0cnkgcHJveHkgdGhhdCBibG9ja3NcbiAqIGtub3duLW1hbGljaW91cyBwYWNrYWdlcy4gUm91dGluZyB0aGUgREVGQVVMVCByZWdpc3RyeSB0aHJvdWdoIGl0IGlzIHdoYXQgcHJvdGVjdHMgdGhlIGluc3RhbGwsXG4gKiBhbmQgdGhlIHRva2VuIGF1dGhlbnRpY2F0ZXMgdGhhdCBwcm94eSDigJQgc28gdGhlIHRva2VuIGhhcyB0byBiZSBwcmVzZW50IHdoaWxlIGRlcGVuZGVuY2llcyBhcmVcbiAqIHJlc29sdmVkLCB3aGljaCBpcyBleGFjdGx5IHdoZW4gYSBjb21wcm9taXNlZCBkZXBlbmRlbmN5J3MgbGlmZWN5Y2xlIHNjcmlwdCB3b3VsZCBydW4uIEhlbmNlIHRoZVxuICogc3BsaXQ6IHJlc29sdmUgYW5kIGRvd25sb2FkIHdpdGggYC0taWdub3JlLXNjcmlwdHNgIGFuZCB0aGUgdG9rZW4sIHRoZW4gcmVwbGF5IHRoZSBza2lwcGVkXG4gKiBsaWZlY3ljbGUgc2NyaXB0cyBpbiBhIHNlY29uZCBpbnN0YWxsIHRoYXQgaGFzIG5vIHRva2VuIChldmVyeSBwYWNrYWdlIGlzIGFscmVhZHkgY2FjaGVkLCBhbmRcbiAqIEd1YXJkIHNlcnZlcyBhbm9ueW1vdXNseSBhbnl3YXkpLiBPbmx5IGJ1biBpcyBnZW5lcmF0ZWQgaGVyZSwgYW5kIGJ1biByZWFkcyAubnBtcmMsIHNvIG5vXG4gKiBwYWNrYWdlLW1hbmFnZXIgYnJhbmNoaW5nIGlzIG5lZWRlZC5cbiAqXG4gKiBUaGUgc2hlbGwgZGV0YWlscyBkZWxpYmVyYXRlbHkgbWlycm9yIHJldXNhYmxlLXdvcmtmbG93cycgcHJvZHVjdGlvbi1wcm92ZW4gaW5zdGFsbCBzdGVwczogYmFyZVxuICogYCRSVU5ORVJfVEVNUGAgKHNldCBieSB0aGUgcnVubmVyIGFwcGxpY2F0aW9uIG9uIGV2ZXJ5IHJ1bm5lciwgYW5kIGBzZXQgLXVgIGZhaWxzIGxvdWRseSBpZiBub3QpLFxuICogYFtbIC1lIC5ucG1yYyBdXWAsIGFuZCB0aGUgc2Vjb25kIGBybSAtcmYgbm9kZV9tb2R1bGVzYCBpbiB0aGUgZmFsbGJhY2sgKGFuIGludGVycnVwdGVkIGxpZmVjeWNsZVxuICogcnVuIG1heSBsZWF2ZSBub2RlX21vZHVsZXMgaW5jb25zaXN0ZW50LCBzbyB0aGUgcmV0cnkgc3RhcnRzIGNsZWFuIHJhdGhlciB0aGFuIHRydXN0aW5nIGEgcmVwYWlyKS5cbiAqXG4gKiBgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlYCBkZWNpZGVzIHdoYXQgYSBmYWlsaW5nIGxpZmVjeWNsZS1zY3JpcHQgcmVwbGF5IGRvZXMuIEV2ZXJ5XG4gKiByZXBsYXkgcnVucyB0b2tlbmxlc3MgYW5kIHdpdGhvdXQgRk5PWF9BR0VfS0VZICh0aGUga2V5IGlzIHNjb3BlZCB0byB0aGUgbGF0ZXIgRGVwbG95L1JlbGVhc2VcbiAqIHN0ZXApLCBzbyBhIHBvc3RpbnN0YWxsIHRoYXQgbmVlZHMgZGVjcnlwdGVkIHNlY3JldHMgaXMgdW5zdXBwb3J0ZWQgaW4gYWxsIG9mIHRoZW0gYnkgZGVzaWduLlxuICogVGhlIHRlc3Qgd29ya2Zsb3cgdG9sZXJhdGVzIHRoZSBmYWlsdXJlIGJlY2F1c2UgdHlwZWNoZWNrL2xpbnQvdGVzdCBmYWlsIGxvdWRseSBvbiBhIGRlZ3JhZGVkXG4gKiB0cmVlIGFueXdheS4gRGVwbG95IGFuZCByZWxlYXNlIHdvcmtmbG93cyBtdXN0IG5vdDogYSBgOjp3YXJuaW5nOjpgIGRvZXMgbm90IGZhaWwgdGhlIGpvYiwgc29cbiAqIHRoZSBmYWxsYmFjayB3b3VsZCBzaGlwIGEgdHJlZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyAoZS5nLiBhIGBwb3N0aW5zdGFsbDogd2IgZ2VuLWNvZGVgKVxuICogbmV2ZXIgcmFuLCBzaWxlbnRseSBkZXBsb3lpbmcgZGVncmFkZWQgb3V0cHV0ICgjMTEyNykuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbFN0ZXBzKHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZTogYm9vbGVhbik6IFN0ZXBbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ0dlbmVyYXRlIC5ucG1yYyBmb3IgVGFrdW1pIEd1YXJkJyxcbiAgICAgIC8vIFRoZSB0b2tlbiBpcyB3cml0dGVuIGFzIGEgbGl0ZXJhbCBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2UgdGhhdCBidW4gZXhwYW5kcyBhdFxuICAgICAgLy8gaW5zdGFsbCB0aW1lLCBzbyB0aGUgc2VjcmV0IGl0c2VsZiBuZXZlciBsYW5kcyBpbiBhIGZpbGUuIFRoZSBtYW5hZ2VkIGxpbmVzIGFyZSBzdHJpcHBlZFxuICAgICAgLy8gZnJvbSBhbiBleGlzdGluZyAubnBtcmMgZmlyc3Q6IGEgcmVwb3NpdG9yeSBvdXRzaWRlIHRoZSBvcmdhbml6YXRpb25zIG1heSBsZWdpdGltYXRlbHlcbiAgICAgIC8vIGNvbW1pdCBvbmUgKHNjb3BlIG1hcHBpbmdzIGZvciBhbm90aGVyIHJlZ2lzdHJ5KSwgYW5kIGRyb3BwaW5nIG9ubHkgdGhlc2UgdHdvIGxpbmVzIGtlZXBzXG4gICAgICAvLyB0aGUgcmVzdCBvZiBpdCBpbiBlZmZlY3QuIFJlcGxhY2luZyB0aGUgZmlsZSB3aXRoIGBtdmAgcmF0aGVyIHRoYW4gYXBwZW5kaW5nIGluIHBsYWNlIHN0b3BzXG4gICAgICAvLyBhIGNvbW1pdHRlZCBzeW1saW5rIGZyb20gcmVkaXJlY3RpbmcgdGhlIHdyaXRlIGludG8sIHNheSwgYSBwZXJzaXN0ZW50IGhvbWUgbnBtcmMuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuTlBNUkM9XCIkKG1rdGVtcCBcIiRSVU5ORVJfVEVNUC9ucG1yYy5YWFhYWFhcIilcIlxuaWYgW1sgLWUgLm5wbXJjIF1dOyB0aGVuXG4gIGdyZXAgLXZFICdecmVnaXN0cnk9fF4vL25wbVxcXFwuZmxhdHRcXFxcLnRlY2gvOl9hdXRoVG9rZW4nIC5ucG1yYyA+IFwiJE5QTVJDXCIgfHwgdHJ1ZVxuZmlcbmVjaG8gJ3JlZ2lzdHJ5PWh0dHBzOi8vbnBtLmZsYXR0LnRlY2gvJyA+PiBcIiROUE1SQ1wiXG5lY2hvICcvL25wbS5mbGF0dC50ZWNoLzpfYXV0aFRva2VuPVxcJHtUQUtVTUlfR1VBUkRfVE9LRU59JyA+PiBcIiROUE1SQ1wiXG5ybSAtZiAubnBtcmNcbm12IFwiJE5QTVJDXCIgLm5wbXJjYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAvLyAtLWZyb3plbi1sb2NrZmlsZTogYSBwbGFpbiBgYnVuIGluc3RhbGxgIHNpbGVudGx5IHJlcGFpcnMgYSBidW4ubG9jayB0aGF0IGlzIHN0YWxlIGFnYWluc3RcbiAgICAgIC8vIHBhY2thZ2UuanNvbiwgc28gQ0kgd291bGQgcnVuIGRlcGVuZGVuY3kgcmVzb2x1dGlvbnMgdGhhdCB3ZXJlIG5ldmVyIHJldmlld2VkICgjMTEyNikuXG4gICAgICAvLyBXaXRoIE5PIGJ1bi5sb2NrIGF0IGFsbCwgLS1mcm96ZW4tbG9ja2ZpbGUgc2lsZW50bHkgaW5zdGFsbHMgZnJlc2gsIHVucGlubmVkIHJlc29sdXRpb25zXG4gICAgICAvLyAoQnVuIDEuMy4xNCBleGl0cyAwIGFuZCB3cml0ZXMgbm8gbG9ja2ZpbGUpLCBzbyBhIG1pc3NpbmcgbG9ja2ZpbGUgbXVzdCBmYWlsIGV4cGxpY2l0bHkuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgW1sgISAtZSBidW4ubG9jayBdXTsgdGhlblxuICBlY2hvIFwiOjplcnJvcjo6YnVuLmxvY2sgaXMgbWlzc2luZzsgY29tbWl0IGl0IHNvIENJIGluc3RhbGxzIHN0YXkgcmVwcm9kdWNpYmxlXCJcbiAgZXhpdCAxXG5maVxuaWYgW1sgXCIkSEFTX1RBS1VNSV9HVUFSRF9UT0tFTlwiID09IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIC0taWdub3JlLXNjcmlwdHNcbmVsc2VcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVcbmZpYCxcbiAgICAgIC8vIFN0ZXAtc2NvcGVkOiBhIGpvYi1sZXZlbCB0b2tlbiB3b3VsZCBiZSByZWFkYWJsZSBieSBldmVyeSBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHQgdGhlXG4gICAgICAvLyB0b2tlbmxlc3MgcmVwbGF5IGJlbG93IHJ1bnMuXG4gICAgICBlbnY6IHsgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1J1biBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMnLFxuICAgICAgLy8gQSByZXBlYXRlZCBgYnVuIGluc3RhbGxgIGlzIGEgbm8tb3AgdGhhdCByZXBsYXlzIG5vdGhpbmcsIHNvIG5vZGVfbW9kdWxlcyBoYXMgdG8gZ28gZmlyc3QuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxucm0gLXJmIG5vZGVfbW9kdWxlc1xuYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUke1xuICAgICAgICB0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmVcbiAgICAgICAgICA/IGAgfHwge1xuICBlY2hvIFwiOjp3YXJuaW5nOjpMaWZlY3ljbGUgc2NyaXB0cyBmYWlsZWQ7IGNvbXBsZXRpbmcgdGhlIGluc3RhbGwgd2l0aG91dCB0aGVtXCJcbiAgcm0gLXJmIG5vZGVfbW9kdWxlc1xuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG59YFxuICAgICAgICAgIDogJydcbiAgICAgIH1gLFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1JlbW92ZSB0aGUgZ2VuZXJhdGVkIC5ucG1yYycsXG4gICAgICAvLyBOb3RoaW5nIGFmdGVyIHRoZSBpbnN0YWxsIG5lZWRzIHRoZSBwcm94eSwgYW5kIGxlYXZpbmcgaXQgaW4gcGxhY2Ugd291bGQgYnJlYWsgdGhlIG9uZVxuICAgICAgLy8gdGhpbmcgR3VhcmQgcmVmdXNlcyB0byBzZXJ2ZTogaXQgYW5zd2VycyBgbnBtIHB1Ymxpc2hgIHdpdGggNDA1LCBzbyBhIHJlbGVhc2Ugd29ya2Zsb3dcbiAgICAgIC8vIHdob3NlIHBhY2thZ2UgbGFja3MgYW4gZXhwbGljaXQgcHVibGlzaENvbmZpZy5yZWdpc3RyeSB3b3VsZCBmYWlsIHRvIHB1Ymxpc2guXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAtLSAubnBtcmMgPiAvZGV2L251bGwgMj4mMTsgdGhlblxuICBnaXQgY2hlY2tvdXQgLS0gLm5wbXJjXG5lbHNlXG4gIHJtIC1mIC5ucG1yY1xuZmlgLFxuICAgIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VtYW50aWNQcldvcmtmbG93KCk6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHsgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAvLyBUaGUgYWN0aW9uIHJlYWRzIHRoZSBwdWxsIHJlcXVlc3QsIGFuZCBpdHMgYHdpcGAgc3VwcG9ydCBwb3N0cyBhIGNvbW1pdCBzdGF0dXM7IG5laXRoZXJcbiAgICAgICAgLy8gcGVybWlzc2lvbiBpcyBncmFudGVkIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVzdHJpY3RzIGRlZmF1bHQgd29ya2Zsb3cgcGVybWlzc2lvbnMuXG4gICAgICAgIHBlcm1pc3Npb25zOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLCBzdGF0dXNlczogJ3dyaXRlJyB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXM6IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7IHdpcDogdHJ1ZSB9LFxuICAgICAgICAgICAgZW52OiB7IEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIE1pc2VUb21sIHtcbiAgdG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gVGhlIG9sZGVzdCBCdW4gcnVudGltZSB3YmZ5IHN1cHBvcnRzLlxuZXhwb3J0IGNvbnN0IG1pbmltdW1CdW5WZXJzaW9uID0gJzEuNC4wJztcblxuLyoqXG4gKiBFbnN1cmVzIG1pc2UudG9tbCBtYW5hZ2VzIHRoZSBOb2RlLmpzIGFuZCAod2hlbiBmbm94LnRvbWwgZXhpc3RzKSBmbm94IHRvb2wgdmVyc2lvbnMgd2hpbGVcbiAqIHByZXNlcnZpbmcgdGhlIEJ1biBwaW4gYW5kIHVucmVsYXRlZCBtaXNlIHNldHRpbmdzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNaXNlVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU1pc2VUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1pc2VUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ21pc2UudG9tbCcpO1xuICAgIC8vIEEgcGFyc2UgZmFpbHVyZSBtdXN0IGFib3J0IGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIHt9OiByZWdlbmVyYXRpbmcgZnJvbSBhbiBlbXB0eSBvYmplY3RcbiAgICAvLyB3b3VsZCBzaWxlbnRseSByZXBsYWNlIHRoZSB1c2VyJ3MgZXhpc3RpbmcgKGFsYmVpdCBicm9rZW4pIG1pc2UudG9tbC5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHBhcnNlTWlzZVRvbWwobWlzZVRvbWxQYXRoKTtcbiAgICBjb25zdCB0b29scyA9IHsgLi4uc2V0dGluZ3MudG9vbHMgfTtcblxuICAgIC8vIEVuc3VyZSBOb2RlLmpzIGlzIGFsd2F5cyBwaW5uZWQ6IGdlbmVyYXRlZCBob29rcyBhbmQgQ0kgcnVuIGBtaXNlIGluc3RhbGxgLCBhbmQgYW4gdW5waW5uZWRcbiAgICAvLyBOb2RlIHdvdWxkIGNvbWUgZnJvbSB3aGF0ZXZlciBoYXBwZW5zIHRvIGJlIG9uIFBBVEguXG4gICAgLy8gTGlmdC10aGVuLXBpbjogdGhlIGxpZnQgb25seSB0b3VjaGVzIGV4YWN0IHBpbnMgYW5kIHRoZSBwaW4gb25seSB0b3VjaGVzIHNlbGVjdG9ycywgc29cbiAgICAvLyBvcmRlcmluZyB0aGUgbGlmdCBmaXJzdCBhdm9pZHMgcmVzb2x2aW5nIGBtaXNlIGxhdGVzdCBub2RlQGx0c2AgdHdpY2UgZm9yIHVucGlubmVkIHJlcG9zLlxuICAgIHRvb2xzLm5vZGUgPSBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgJ25vZGUnLFxuICAgICAgbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcignbm9kZUBsdHMnLCB0b29scy5ub2RlLCBjb25maWcuZGlyUGF0aCksXG4gICAgICBjb25maWcuZGlyUGF0aFxuICAgICk7XG4gICAgLy8gQnVuIGlzIG5ldmVyIGFkZGVkIG9yIGNoYW5nZWQ6IGEgbWlzc2luZyBwaW4gc3RheXMgbWlzc2luZyAoZGV2ZWxvcGVycyBpbnN0YWxsIEJ1biBnbG9iYWxseVxuICAgIC8vIHRvIHJ1biB3YmZ5KSwgYW5kIGhhc1N1cHBvcnRlZEJ1blBpbigpIGhhcyBhbHJlYWR5IHJlamVjdGVkIGFueSBwaW4gdGhhdCBpcyBub3Qgb25lIGV4YWN0XG4gICAgLy8gc3VwcG9ydGVkIHZlcnNpb24uXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICB0b29scy5mbm94ID0gcGluQ29uY3JldGVUb29sVmVyc2lvbihcbiAgICAgICAgJ2Zub3gnLFxuICAgICAgICBsaWZ0T3V0ZGF0ZWRUb29sVmVyc2lvbldpdGhpbk1ham9yKCdmbm94JywgdG9vbHMuZm5veCwgY29uZmlnLmRpclBhdGgpLFxuICAgICAgICBjb25maWcuZGlyUGF0aFxuICAgICAgKTtcbiAgICB9XG4gICAgc2V0dGluZ3MudG9vbHMgPSB0b29scztcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gQnVuIDEuNCBwcm92aWRlcyBUT01MLnN0cmluZ2lmeSBiZWZvcmUgdGhlIGFnZS1nYXRlZCBAdHlwZXMvYnVuIHZlcnNpb24gZGVjbGFyZXMgaXQuXG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShtaXNlVG9tbFBhdGgsIEJ1bi5UT01MLnN0cmluZ2lmeShzZXR0aW5ncykpO1xuICB9KTtcbn1cblxuLyoqIFdoZXRoZXIgbWlzZS50b21sIG9taXRzIEJ1biBvciBwaW5zIGl0IHRvIG9uZSBleGFjdCB2ZXJzaW9uIHRoYXQgd2JmeSBzdXBwb3J0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNTdXBwb3J0ZWRCdW5QaW4oZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBidW5WZXJzaW9uOiB1bmtub3duO1xuICB0cnkge1xuICAgIGJ1blZlcnNpb24gPSBwYXJzZU1pc2VUb21sKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbWlzZS50b21sJykpLnRvb2xzPy5idW47XG4gIH0gY2F0Y2gge1xuICAgIC8vIExldCBnZW5lcmF0ZU1pc2VUb21sIHJlcG9ydCB0aGUgdW5yZWFkYWJsZSBvciBtYWxmb3JtZWQgZmlsZS5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIGJ1blZlcnNpb24gPT09IHVuZGVmaW5lZCB8fFxuICAgICh0eXBlb2YgYnVuVmVyc2lvbiA9PT0gJ3N0cmluZycgJiYgISFzZW12ZXIudmFsaWQoYnVuVmVyc2lvbikgJiYgc2VtdmVyLmd0ZShidW5WZXJzaW9uLCBtaW5pbXVtQnVuVmVyc2lvbikpXG4gICk7XG59XG5cbi8qKlxuICogTGlmdHMgYW4gZXhhY3QgdG9vbCBwaW4gYmVsb3cgdGhlIGxhdGVzdCByZXNvbHZhYmxlIHZlcnNpb24g4oCUIHdpdGhpbiB0aGUgU0FNRSBtYWpvciDigJQgdG8gdGhhdFxuICogdmVyc2lvbiAoTm9kZS5qcyByZXNvbHZlcyBhZ2FpbnN0IHRoZSBsYXRlc3QgTFRTKTogdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlIHN0YW5kYXJkIHRyYWNrcyB0aGVcbiAqIGN1cnJlbnQgdG9vbGNoYWluIGFjcm9zcyByZXBvc2l0b3JpZXMgYW5kIFJlbm92YXRlIGRvZXMgbm90IG1hbmFnZSBtaXNlLnRvbWwgcGlucywgc29cbiAqIHBhdGNoL21pbm9yIGRyaWZ0IChlLmcuIG5vZGUgMjQuMTYuMCB2cyAyNC4xOC4wLCBmbm94IDEuMzAuMCB2cyAxLjMxLjApIG5ldmVyIHNlbGYtaGVhbHMuIEEgcGluXG4gKiBvbiBhbiBvbGRlciBtYWpvciBpcyBhIGRlbGliZXJhdGUgY29tcGF0aWJpbGl0eSBjaG9pY2UgYW5kIGlzIGtlcHQsIGFzIGFyZSBub24tZXhhY3QgYW5kXG4gKiBub24tc3RyaW5nIGZvcm1zLiBXaGVuIG1pc2UgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgcGluIGlzIGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3Ioc2VsZWN0b3I6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCAhc2VtdmVyLnZhbGlkKHZlcnNpb24pKSByZXR1cm4gdmVyc2lvbjtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbWlzZScsIFsnbGF0ZXN0Jywgc2VsZWN0b3JdLCBjd2QpO1xuICByZXR1cm4gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pICYmXG4gICAgc2VtdmVyLm1ham9yKGxhdGVzdFZlcnNpb24pID09PSBzZW12ZXIubWFqb3IodmVyc2lvbikgJiZcbiAgICBzZW12ZXIubHQodmVyc2lvbiwgbGF0ZXN0VmVyc2lvbilcbiAgICA/IGxhdGVzdFZlcnNpb25cbiAgICA6IHZlcnNpb247XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYW4gdW5waW5uZWQgc2VsZWN0b3IgKGBsYXRlc3RgLCBhIHJhbmdlIHN1Y2ggYXMgXCIyNFwiLCBhbiBhbGlhcywgb3IgYSBtaXNzaW5nIGVudHJ5KVxuICogd2l0aCB0aGUgbmV3ZXN0IGNvbmNyZXRlIHZlcnNpb24gbWlzZSByZXNvbHZlcyBmb3IgaXQsIGJlY2F1c2UgdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlXG4gKiBzdGFuZGFyZCByZXF1aXJlcyBjb25jcmV0ZSBwaW5zOiBDSSBpbnN0YWxscyB3aGF0ZXZlciBhbiB1bnBpbm5lZCBzZWxlY3RvciByZXNvbHZlcyB0byBhdCBydW5cbiAqIHRpbWUsIHNvIGJ1aWxkcyBkcmlmdCBhY3Jvc3MgcnVucy4gRXhhY3QgdmVyc2lvbnMgYXJlIGtlcHQgYXMtaXMsIGFuZCBub24tc3RyaW5nIGZvcm1zIChtaXNlJ3NcbiAqIGFycmF5IGFuZCBgeyB2ZXJzaW9uID0gXCLigKZcIiB9YCBmb3JtcykgYXJlIHVzZXItbWFuYWdlZCBhbmQgbGVmdCB1bnRvdWNoZWQuIFdoZW4gbWlzZSBpc1xuICogdW5hdmFpbGFibGUgb3IgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgaXMga2VwdCDigJRcbiAqIGFuIHVucGlubmVkIHRvb2wgaXMgYmV0dGVyIHRoYW4gYSBicm9rZW4gY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcGluQ29uY3JldGVUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCBzZW12ZXIudmFsaWQodmVyc2lvbikpKSByZXR1cm4gdmVyc2lvbjtcbiAgLy8gTm9ybWFsaXplIHNlbGVjdG9yIGZvcm1zIGBtaXNlIGxhdGVzdGAgY2Fubm90IHJlc29sdmUgZXZlbiB0aG91Z2ggbWlzZSBjb25maWd1cmF0aW9uIGFjY2VwdHNcbiAgLy8gdGhlbTogYHByZWZpeDoyNGAgaXMgcmVqZWN0ZWQgb3V0cmlnaHQgd2hpbGUgYDI0YCByZXNvbHZlcywgYW5kIGBsdHMvKmAgeWllbGRzIGVtcHR5IG91dHB1dFxuICAvLyB3aGlsZSBgbHRzYCByZXNvbHZlcy4gTW9kaWZpZXIgc2VsZWN0b3JzIHN1Y2ggYXMgYHN1Yi0yOmx0c2Agc3RheSB1bnJlc29sdmFibGUgYW5kIGZhbGwgYmFja1xuICAvLyB0byB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgYmVsb3cuXG4gIGNvbnN0IHJhbmdlID0gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnID8gdmVyc2lvbi5yZXBsYWNlKC9ecHJlZml4Oi91LCAnJykucmVwbGFjZSgvXFwvXFwqJC91LCAnJykgOiB1bmRlZmluZWQ7XG4gIC8vIFdpdGggbm8gbWVhbmluZ2Z1bCBzZWxlY3RvciwgTm9kZS5qcyBwaW5zIHRvIHRoZSBsYXRlc3QgTFRTIChtYXRjaGluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzJ1xuICAvLyBgbHRzLypgIGZhbGxiYWNrKSByYXRoZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UuXG4gIGNvbnN0IGRlZmF1bHRTZWxlY3RvciA9IHRvb2wgPT09ICdub2RlJyA/ICdub2RlQGx0cycgOiB0b29sO1xuICBjb25zdCBzZWxlY3RvciA9IHJhbmdlICYmIHJhbmdlICE9PSAnbGF0ZXN0JyA/IGAke3Rvb2x9QCR7cmFuZ2V9YCA6IGRlZmF1bHRTZWxlY3RvcjtcbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSA/IHJlc29sdmVkVmVyc2lvbiA6ICh2ZXJzaW9uID8/ICdsYXRlc3QnKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNaXNlVG9tbChtaXNlVG9tbFBhdGg6IHN0cmluZyk6IE1pc2VUb21sIHtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKG1pc2VUb21sUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPbmx5IGEgcmVwb3NpdG9yeSB3aXRob3V0IG1pc2UudG9tbCBzdGFydHMgZnJvbSBhbiBlbXB0eSBjb25maWd1cmF0aW9uOyBhbiB1bnJlYWRhYmxlIGZpbGVcbiAgICAvLyAoZS5nLiBwZXJtaXNzaW9ucykgbXVzdCBhYm9ydCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggZ2VuZXJhdGVkIHNldHRpbmdzLlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIHt9O1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBNaXNlVG9tbDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZywgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVBhY2thZ2VzLmpzJztcblxuLyoqXG4gKiBCdW4gcmVhZHMgcmVnaXN0cnkgc2NvcGUgbWFwcGluZ3MgZnJvbSBhIHBoeXNpY2FsIHJlcG9zaXRvcnkgLm5wbXJjIGR1cmluZyBSZW5vdmF0ZSBhcnRpZmFjdFxuICogdXBkYXRlczsgUmVub3ZhdGUncyBucG1yYyBzZXR0aW5nIGlzIHVzZWQgb25seSBieSBpdHMgZGF0YXNvdXJjZSBsYXllci4gS2VlcCB0aGUgbm9uLXNlY3JldFxuICogbWFwcGluZyBpbiByZXBvc2l0b3JpZXMgdGhhdCByZXNvbHZlIHByaXZhdGUgcGFja2FnZXMsIHdoaWxlIGF1dGhlbnRpY2F0aW9uIHJlbWFpbnMgaW4gdGhlXG4gKiBkZXZlbG9wZXIncyB+Ly5ucG1yYyBsb2NhbGx5IGFuZCBpbiB0ZW1wb3JhcnkgQ0kgb3IgTWVuZCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9BdXRob3IgPSBjb25maWdzWzBdPy5yZXBvQXV0aG9yO1xuICBpZiAocmVwb0F1dGhvciAhPT0gJ1dpbGxCb29zdGVyJyAmJiByZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgY29uc3QgbnBtcmNQYXRocyA9IG5ldyBTZXQoY29uZmlncy5tYXAoKGNvbmZpZykgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm5wbXJjJykpKTtcbiAgY29uc3Qgcm9vdENvbmZpZyA9IGNvbmZpZ3MuZmluZCgoY29uZmlnKSA9PiBjb25maWcuaXNSb290KTtcbiAgaWYgKHJvb3RDb25maWcgJiYgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKHJvb3RDb25maWcpKSB7XG4gICAgY29uc3Qgcm9vdE5wbXJjUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcubnBtcmMnKTtcbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHJvb3ROcG1yY1BhdGgsIHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZyk7XG4gICAgbnBtcmNQYXRocy5kZWxldGUocm9vdE5wbXJjUGF0aCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBucG1yY1BhdGhzKSBhd2FpdCByZW1vdmVOcG1yYyhucG1yY1BhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVOcG1yYyhucG1yY1BhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChucG1yY1BhdGgpLmNhdGNoKCgpID0+IHt9KSkpIHJldHVybjtcbiAgaWYgKGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChucG1yY1BhdGgpKSB7XG4gICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIG5vbi1jYW5vbmljYWwgcmVwb3NpdG9yeSBucG1yYyAke25wbXJjUGF0aH0uYCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0OiAnYnJhbmNoJztcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnO1xuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGluY2x1ZGU6IHN0cmluZ1tdO1xuICAgICAgZXhjbHVkZTogc3RyaW5nW107XG4gICAgfTtcbiAgfTtcbiAgcnVsZXM6IChcbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2RlbGV0aW9uJyB8ICdub25fZmFzdF9mb3J3YXJkJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBib29sZWFuO1xuICAgICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiB7XG4gICAgICAgICAgICBjb250ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogbnVtYmVyO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiBudW1iZXI7XG4gICAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXTtcbiAgICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogYm9vbGVhbjtcbiAgICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ107XG4gICAgICAgIH07XG4gICAgICB9XG4gIClbXTtcbiAgYnlwYXNzX2FjdG9yczoge1xuICAgIGFjdG9yX2lkOiBudW1iZXI7XG4gICAgYWN0b3JfdHlwZTogJ1RlYW0nO1xuICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JztcbiAgfVtdO1xufVxuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNvdXJjZV90eXBlPzogc3RyaW5nO1xufVxuXG5jb25zdCBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSID0ge1xuICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCA9IDE1XzM2ODtcblxuY29uc3QgUFJPVEVDVF9NQUlOX1JVTEVTRVQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCA9IHtcbiAgbmFtZTogJ1Byb3RlY3QgbWFpbicsXG4gIHRhcmdldDogJ2JyYW5jaCcsXG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJyxcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBleGNsdWRlOiBbXSxcbiAgICAgIGluY2x1ZGU6IFsnfkRFRkFVTFRfQlJBTkNIJ10sXG4gICAgfSxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZGVsZXRpb24nLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGZhbHNlLFxuICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAndGVzdCAvIHRlc3QnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3NlbWFudGljLXByIC8gc2VtYW50aWMtcHInLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ25vbl9mYXN0X2ZvcndhcmQnLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IDAsXG4gICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXSxcbiAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBmYWxzZSxcbiAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBieXBhc3NfYWN0b3JzOiBbXG4gICAge1xuICAgICAgYWN0b3JfaWQ6IDE3Xzc3N180OTUsXG4gICAgICBhY3Rvcl90eXBlOiAnVGVhbScsXG4gICAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgfSxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicpIHJldHVybjtcbiAgICAvLyBUaGUgcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gaG9zdHMgd29ya2Zsb3dfY2FsbCBkZWZpbml0aW9ucywgc28gdGhlXG4gICAgLy8gUHJvdGVjdCBtYWluIHJ1bGVzZXQgd291bGQgcmVxdWlyZSB0ZXN0L3NlbWFudGljLXByIGNoZWNrcyB0aGF0IG5ldmVyIHJ1biB0aGVyZS5cbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8oY29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIFJlcG9zaXRvcnkgcnVsZXNldHMgcmVxdWlyZSBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB3aGljaCBsb2NhbCBydW5zXG4gICAgICAvLyBtYXkgbm90IGhhdmUgZXZlbiB3aGVuIGZpbGUtZ2VuZXJhdGlvbiBhbmQgcHVzaGVzIGFyZSBhbGxvd2VkLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgY29uc3QgcnVsZXNldCA9IHN0cnVjdHVyZWRDbG9uZShQUk9URUNUX01BSU5fUlVMRVNFVCk7XG4gIGlmIChjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlc2V0LnJ1bGVzKSB7XG4gICAgICBpZiAocnVsZS50eXBlICE9PSAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIGNvbnRleHQgaXMgYDxjYWxsZXIgam9iIGlkPiAvIDxyZXVzYWJsZSBqb2IgaWQ+YCBvZiB0aGUgd2JmeS1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbC5cbiAgICAgIHJ1bGUucGFyYW1ldGVycy5yZXF1aXJlZF9zdGF0dXNfY2hlY2tzLnB1c2goe1xuICAgICAgICBjb250ZXh0OiAndGVzdC1ydXN0IC8gdGVzdC1ydXN0JyxcbiAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydWxlc2V0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0ID0gYXdhaXQgZmluZFJlcG9zaXRvcnlSdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBydWxlc2V0Lm5hbWUpO1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXRJZCA9IGV4aXN0aW5nUnVsZXNldD8uaWQ7XG5cbiAgYXdhaXQgd2l0aFJldHJ5KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChleGlzdGluZ1J1bGVzZXRJZCkge1xuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgcnVsZXNldF9pZDogZXhpc3RpbmdSdWxlc2V0SWQsXG4gICAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5UnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdpdGhSZXRyeShcbiAgICAoKSA9PlxuICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgaW5jbHVkZXNfcGFyZW50czogZmFsc2UsXG4gICAgICAgIHRhcmdldHM6ICdicmFuY2gnLFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSksXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG4gIGNvbnN0IHJ1bGVzZXRzID0gcmVzcG9uc2UuZGF0YTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVzZXRzKSkgcmV0dXJuO1xuICByZXR1cm4gcnVsZXNldHMuZmluZCgocnVsZXNldCkgPT4gcnVsZXNldC5uYW1lID09PSBydWxlc2V0TmFtZSAmJiBydWxlc2V0LnNvdXJjZV90eXBlID09PSAnUmVwb3NpdG9yeScpO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4sIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwR2l0SHViU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIExvY2FsIHdiZnkgcnVucyBvZnRlbiBoYXZlIHB1c2ggcGVybWlzc2lvbiB3aXRob3V0IGFkbWluIHBlcm1pc3Npb24uXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBHaXRIdWJTZXR0aW5ncyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlclJlcG8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZShuZXdDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBjb250ZW50KSA+IGNvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJDb21tYW5kID0gJ2J1biBydW4nO1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZUFsbChwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyLCBwYWNrYWdlTWFuYWdlckNvbW1hbmQpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgKD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpYDtcbmNvbnN0IGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMgPSBbXG4gIG5ldyBSZWdFeHAoYF4ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoYF5naXRodWI6JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP2h0dHBzOi8vZ2l0aHViXFxcXC5jb20vJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9zc2g6Ly9naXRAZ2l0aHViXFxcXC5jb21bOi9dJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChgXig/OmdpdFxcXFwrKT9naXRAZ2l0aHViXFxcXC5jb206JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCwgJ3UnKSxcbl07XG5cbmludGVyZmFjZSBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZSB7XG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgc2VjdGlvbk5hbWU6ICh0eXBlb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKVtudW1iZXJdO1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiB2b2lkIHtcbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXMgPSBjb25maWdzLmZsYXRNYXAoZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKTtcbiAgaWYgKGRpc2FsbG93ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBkaXNhbGxvd2VkU291cmNlc1xuICAgIC5tYXAoXG4gICAgICAoeyBkZXBlbmRlbmN5TmFtZSwgZGlyUGF0aCwgc2VjdGlvbk5hbWUsIHNwZWNpZmllciB9KSA9PlxuICAgICAgICBgLSAke3BhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyl9OiAke3NlY3Rpb25OYW1lfS4ke2RlcGVuZGVuY3lOYW1lfSB1c2VzICR7c3BlY2lmaWVyfWBcbiAgICApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzYWxsb3dlZCBHaXQgZGVwZW5kZW5jeSBzb3VyY2VzIGZvdW5kLlxcbk9ubHkgV2lsbEJvb3N0ZXIgYW5kIFdpbGxCb29zdGVyTGFiIEdpdEh1YiBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQuXFxuJHtkZXRhaWxzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHBhY2thZ2VKc29uW3NlY3Rpb25OYW1lXTtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHNwZWNpZmllcl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG5cbiAgICAgIGRpc2FsbG93ZWRTb3VyY2VzLnB1c2goe1xuICAgICAgICBkZXBlbmRlbmN5TmFtZSxcbiAgICAgICAgZGlyUGF0aDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIHNlY3Rpb25OYW1lLFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc2FsbG93ZWRTb3VyY2VzO1xufVxuXG5mdW5jdGlvbiBpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpiaXRidWNrZXR8Z2lzdHxnaXRodWJ8Z2l0bGFiKTovdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXmh0dHBzPzpcXC9cXC8oPzpiaXRidWNrZXRcXC5vcmd8Z2l0aHViXFwuY29tfGdpdGxhYlxcLmNvbSlcXC8vdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXig/Omh0dHBzP3xzc2gpOlxcL1xcL1xcUytcXC5naXQoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eW15AXFxzXStAW146XFxzXSs6XFxTKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdDonKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQrJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnc3NoOi8vZ2l0QCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlthLXpBLVowLTldW1xcdy4tXSpcXC9bXFx3Li1dKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzcGVjaWZpZXIpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yLCBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeENoYWtyYVRvYXN0ZXIgfSBmcm9tICcuL2ZpeGVycy9jaGFrcmFUb2FzdGVyLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sLCByZWFkQnVuR2xvYmFsU3RvcmUsIHJlc29sdmVCdW5HbG9iYWxTdG9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUZub3hUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMsIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24sIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFJhaWx3YXlpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSwgcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVVzZXJBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy91c2VyQWdlbnRJbnN0cnVjdGlvbnMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBlbnN1cmVXYkVudkRlZmluaXRpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3diRW52LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9zZWxmQ29udGFpbmVkV29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTWlzZVRvbWwsIGhhc1N1cHBvcnRlZEJ1blBpbiwgbWluaW11bUJ1blZlcnNpb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbWlzZVRvbWwuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbnBtcmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyB9IGZyb20gJy4vZ2l0aHViL3J1bGVzZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZywgZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvciB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMgfSBmcm9tICcuL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VUeXBlU2NyaXB0QXBpIH0gZnJvbSAnLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGdldFdiZnlWZXJzaW9uLCBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi91dGlscy92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuLyoqXG4gKiBBcHBsaWVzIG9ubHkgdGhlIGdsb2JhbCByZWxlYXNlLWFnZSBnYXRlLCB3aXRob3V0IHRvdWNoaW5nIGFueSByZXBvc2l0b3J5LiBTcGVsbGVkIG91dCBpbiBmdWxsXG4gKiByYXRoZXIgdGhhbiBzaG9ydGVuZWQgKGUuZy4gYGdhdGVgKSBiZWNhdXNlIHRoZSBkZWZhdWx0IGNvbW1hbmQgdGFrZXMgcG9zaXRpb25hbCBwYXRoczogYSBzaG9ydFxuICogbmFtZSB3b3VsZCBzd2FsbG93IGEgZGlyZWN0b3J5IHRoYXQgaGFwcGVucyB0byBzaGFyZSBpdC5cbiAqL1xuY29uc3QgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQgPSAnYXBwbHktcmVsZWFzZS1hZ2UtZ2F0ZSc7XG4vKiogU2FtZSBuYW1pbmcgcmF0aW9uYWxlIGFzIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLiAqL1xuY29uc3QgZ2VuZXJhdGVVc2VyQWdlbnRJbnN0cnVjdGlvbnNDb21tYW5kID0gJ2dlbmVyYXRlLXVzZXItYWdlbnQtaW5zdHJ1Y3Rpb25zJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZChcbiAgICAgIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLFxuICAgICAgXCJBcHBseSBvbmx5IHRoZSBvcmdhbml6YXRpb24ncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGlzIG1hY2hpbmUncyBnbG9iYWwgcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3NcIlxuICAgIClcbiAgICAuY29tbWFuZChcbiAgICAgIGdlbmVyYXRlVXNlckFnZW50SW5zdHJ1Y3Rpb25zQ29tbWFuZCxcbiAgICAgIFwiT3ZlcndyaXRlIHRoaXMgdXNlcidzIGFnZW50IGluc3RydWN0aW9uIGZpbGVzICh+Ly5jb2RleC9BR0VOVFMubWQsIH4vLmNsYXVkZS9DTEFVREUubWQsIH4vLmdlbWluaS9HRU1JTkkubWQpIHdpdGggdGhlIG9yZ2FuaXphdGlvbidzIGZpeGVkIGNvbnRlbnRcIlxuICAgIClcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZm9yY2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdBcHBseSB3YmZ5IGV2ZW4gd2hlbiB0aGUgcmVwb3NpdG9yeSBhbHJlYWR5IHJlY29yZHMgdGhpcyB3YmZ5IHZlcnNpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2YnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdTa2lwIGFkZGluZyBtYW5hZ2VkIGRlcGVuZGVuY2llcyBhbmQgdGhlIGxpbmtlciBwcm9iZSAodGhlIGZpbmFsIGBidW4gaW5zdGFsbGAgcmVmcmVzaGluZyB0aGUgbG9ja2ZpbGUgc3RpbGwgcnVucyknLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRXYmZ5VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcblxuICAvLyBEZWxpYmVyYXRlbHkgYmVmb3JlIHRoZSBCdW4gY2hlY2sgaW4gd2lsbGJvb3N0ZXJpZnlQYXRocygpOiB0aGUgZ2F0ZSBtdXN0IGJlIGFwcGxpYWJsZSBvbiBhXG4gIC8vIG1hY2hpbmUgd2hvc2UgQnVuIGlzIG91dGRhdGVkLCB3aGljaCBpcyBleGFjdGx5IGEgbWFjaGluZSB0aGF0IHN0aWxsIG5lZWRzIGdhdGluZy5cbiAgaWYgKGFyZ3YuX1swXSA9PT0gYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQpIHtcbiAgICBpZiAoIWVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpKSBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFyZ3YuX1swXSA9PT0gZ2VuZXJhdGVVc2VyQWdlbnRJbnN0cnVjdGlvbnNDb21tYW5kKSB7XG4gICAgaWYgKCEoYXdhaXQgZ2VuZXJhdGVVc2VyQWdlbnRJbnN0cnVjdGlvbnMoKSkpIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICB0cnkge1xuICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gYXdhaXQgd2lsbGJvb3N0ZXJpZnlQYXRocyhhcmd2LnBhdGhzIGFzIHN0cmluZ1tdLCBhcmd2LnNraXBEZXBzLCBhcmd2LmZvcmNlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBUaGUgVHlwZVNjcmlwdCBjb21waWxlciBzZXJ2ZXIgc3Bhd25lZCBmb3IgQVNUIHBhcnNpbmcga2VlcHMgYW4gb3BlbiBJUENcbiAgICAvLyBjaGFubmVsIHRoYXQgd291bGQgb3RoZXJ3aXNlIHByZXZlbnQgdGhlIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gICAgYXdhaXQgZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZFBhY2thZ2VDb25maWcpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3aWxsYm9vc3RlcmlmeVBhdGhzKHBhdGhzOiBzdHJpbmdbXSwgc2tpcERlcHM6IGJvb2xlYW4sIGZvcmNlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIEJlZm9yZSBhbnl0aGluZyBlbHNlIOKAlCBldmVuIHRoZSBCdW4gY2hlY2sgYmVsb3c6IHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIGdsb2JhbFxuICAvLyBwYWNrYWdlLW1hbmFnZXIgY29uZmlncyBtdXN0IHJlY2VpdmUgdGhlIG9yZydzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IG9uIEVWRVJZIHJ1bixcbiAgLy8gYmVjYXVzZSB0aGV5IGFyZSB3aGF0IGd1YXJkcyBicmFuZC1uZXcgbG9jYWwgcHJvamVjdHMgdGhhdCBoYXZlIG5vIHdiZnktZ2VuZXJhdGVkIHJlcG9zaXRvcnlcbiAgLy8gY29uZmlnIHlldCwgYW5kIHRoYXQgcHJvdGVjdGlvbiBtdXN0IHdvcmsgYmVmb3JlIHRoZSBzdXBwb3J0ZWQtdmVyc2lvbiBjaGVjay5cbiAgZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk7XG5cbiAgLy8gd2JmeSBtYW5hZ2VzIHJlcG9zaXRvcmllcyB0aHJvdWdoIEJ1biArIG1pc2UgYW5kIHVzZXMgQnVuIDEuNCBydW50aW1lIEFQSXMuIFRoZSB2ZXJzaW9uIGZsb29yXG4gIC8vIGFsc28gZW5zdXJlcyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIG9wdGlvbnMgcHJvZHVjZSB0aGUgaW5zdGFsbCBsYXlvdXQgd2JmeSB2YWxpZGF0ZXMuIEl0XG4gIC8vIHN0YXlzIHVuY29uZGl0aW9uYWwgZXZlbiB0aG91Z2ggdGhlIGFscmVhZHktYXBwbGllZCBjaGVjayBiZWxvdyBjYW4gbWFrZSBhIHJ1biBhIG5vLW9wOiBhblxuICAvLyBvdXRkYXRlZCBCdW4gaXMgYSBicm9rZW4gZW52aXJvbm1lbnQgd2JmeSBtdXN0IHJlcG9ydCwgYW5kIGhpZGluZyBpdCB3aGVuZXZlciBldmVyeSBwYXRoXG4gIC8vIGhhcHBlbnMgdG8gYmUgc2tpcHBlZCB3b3VsZCBzdXJmYWNlIGl0IG9ubHkgbGF0ZXIuXG4gIGNvbnN0IGJ1blZlcnNpb24gPSBCdW4udmVyc2lvbjtcbiAgaWYgKEJ1bi5zZW12ZXIub3JkZXIoYnVuVmVyc2lvbiwgbWluaW11bUJ1blZlcnNpb24pIDwgMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYHdiZnkgcmVxdWlyZXMgQnVuID49ICR7bWluaW11bUJ1blZlcnNpb259IChmb3VuZCAke2J1blZlcnNpb259KS4gVXBncmFkZSBCdW4gYW5kIHJlLXJ1bi5gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEEgYC1kaXJ0eS1sb2NhbGAgbGFiZWwgaWRlbnRpZmllcyBhbiBlZGl0ZWQgY2hlY2tvdXQsIHdob3NlIG5leHQgYnVpbGQgcHJvZHVjZXMgZGlmZmVyZW50IGZpbGVzXG4gIC8vIHVuZGVyIHRoZSBzYW1lIGxhYmVsLCBzbyBzdWNoIGEgcnVuIGlzIG5ldmVyIHRyZWF0ZWQgYXMgYWxyZWFkeSBhcHBsaWVkLlxuICBjb25zdCB2ZXJzaW9uTGFiZWwgPSBnZXRXYmZ5VmVyc2lvbkxhYmVsKCk7XG4gIGNvbnN0IHNraXBwYWJsZVZlcnNpb25MYWJlbCA9XG4gICAgIWZvcmNlICYmIHZlcnNpb25MYWJlbCAmJiAhdmVyc2lvbkxhYmVsLmVuZHNXaXRoKCctZGlydHktbG9jYWwnKSA/IHZlcnNpb25MYWJlbCA6IHVuZGVmaW5lZDtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBpbnB1dERpclBhdGggb2YgcGF0aHMpIHtcbiAgICAvLyBOb3JtYWxpemUgb25jZSBhdCB0aGUgQ0xJIGJvdW5kYXJ5LiBHZW5lcmF0b3JzIHVzZSBkaXJQYXRoIGZvciBjd2QgYW5kIGJhc2VuYW1lIGRlY2lzaW9ucztcbiAgICAvLyBsZWF2aW5nIHRoZSBzdXBwb3J0ZWQgZGVmYXVsdCBgLmAgdW5yZXNvbHZlZCB3b3VsZCBnZW5lcmF0ZSBhbiBpbnZhbGlkIHBhY2thZ2UgbmFtZSBvZiBgLmAuXG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoaW5wdXREaXJQYXRoKTtcbiAgICAvLyBDb25maW5lIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlIHRvIHRoaXMgcmVwb3NpdG9yeSAoc2VlIGZzVXRpbC5nZW5lcmF0ZUZpbGUpLiBTZXQgQkVGT1JFIGFueVxuICAgIC8vIGZpeGVyIHdyaXRlcywgYW5kIHJlc2V0IG9uIGV2ZXJ5IGl0ZXJhdGlvbiBzbyBhIG11bHRpLXBhdGggcnVuIG5ldmVyIGtlZXBzIHRoZSBwcmV2aW91cyByb290LlxuICAgIGZzVXRpbC5zZXRSb290RGlyUGF0aChmcy5leGlzdHNTeW5jKHJvb3REaXJQYXRoKSA/IHJvb3REaXJQYXRoIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIEEgcmVwb3NpdG9yeSBwcmVjb25kaXRpb24sIGNoZWNrZWQgYmVmb3JlIHRoZSBhbHJlYWR5LWFwcGxpZWQgc2tpcCBiZWxvdyBhbmQgYmVmb3JlIGFueSBmaWxlXG4gICAgLy8gaXMgd3JpdHRlbjogYW4gdW5zdXBwb3J0ZWQgcGluIG11c3QgYmUgcmVwb3J0ZWQgb24gZXZlcnkgcnVuIGFuZCBtdXN0IG5vdCBzdGFtcCB0aGUgYmFkZ2UuXG4gICAgaWYgKCFoYXNTdXBwb3J0ZWRCdW5QaW4ocm9vdERpclBhdGgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgU2tpcCAke3Jvb3REaXJQYXRofTogbWlzZS50b21sIG11c3QgcGluIEJ1biB0byBvbmUgZXhhY3QgdmVyc2lvbiA+PSAke21pbmltdW1CdW5WZXJzaW9ufSBvciBvbWl0IGl0LiBVcGRhdGUgdGhlIHBpbiBhbmQgcmUtcnVuLmBcbiAgICAgICk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgYmFkZ2UgcmVjb3JkcyB0aGUgYnVpbGQgdGhhdCBnZW5lcmF0ZWQgdGhlIHJlcG9zaXRvcnkncyBjb25maWd1cmF0aW9uLCBzbyB0aGUgc2FtZSBidWlsZFxuICAgIC8vIHdvdWxkIG9ubHkgcmV3cml0ZSB3aGF0IGlzIGFscmVhZHkgdGhlcmUuIFNraXBwaW5nIGlzIGEgZGVsaWJlcmF0ZSB0cmFkZTogdGhlIHBhcnRzIG9mIGEgcnVuXG4gICAgLy8gdGhhdCBkZXBlbmQgb24gc3RhdGUgT1VUU0lERSB0aGUgcmVwb3NpdG9yeSAoR2l0SHViIHNldHRpbmdzLCBkZXBlbmRlbmN5IHVwZGF0ZXMsIHRoZSBmZXRjaGVkXG4gICAgLy8gLmdpdGlnbm9yZSkgZG8gZ2V0IHNraXBwZWQgdG9vLCB3aGljaCBpcyB3aGF0IC0tZm9yY2UgaXMgZm9yLlxuICAgIGlmIChza2lwcGFibGVWZXJzaW9uTGFiZWwgJiYgKGF3YWl0IHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChyb290RGlyUGF0aCkpID09PSBza2lwcGFibGVWZXJzaW9uTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCAke3Jvb3REaXJQYXRofTogd2JmeSAke3NraXBwYWJsZVZlcnNpb25MYWJlbH0gaXMgYWxyZWFkeSBhcHBsaWVkLiBQYXNzIC0tZm9yY2UgdG8gcmUtYXBwbHkuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHBhY2thZ2VzU3ViRGlyUGF0aHMgPSBkaXJlbnRzXG4gICAgICAuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpXG4gICAgICAubWFwKChkKSA9PiBwYXRoLnJlc29sdmUocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcbiAgICAvLyBBbHNvIGNvdmVyIHdvcmtzcGFjZXMgZGVjbGFyZWQgb3V0c2lkZSBwYWNrYWdlcy8qIChlLmcuIGFwcHMvKik6IHRoZXkgcmVjZWl2ZSB0aGUgc2FtZVxuICAgIC8vIG1hbmFnZWQgY29uZmlncyAodHNjb25maWcuanNvbiwgcGFja2FnZS5qc29uIGNvbnZlbnRpb25zLCDigKYpIGFzIHBhY2thZ2VzLyogY2hpbGRyZW4uXG4gICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID1cbiAgICAgIGlnbm9yZUVycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlQ29uZmlnWydwYWNrYWdlSnNvbiddXG4gICAgICApID8/IHt9O1xuICAgIGNvbnN0IHdvcmtzcGFjZVN1YkRpclBhdGhzID0gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoe1xuICAgICAgZGlyUGF0aDogcm9vdERpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IHBhY2thZ2VzU3ViRGlyUGF0aHMuc29tZSgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoc3ViRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgKSxcbiAgICB9KTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IFsuLi5uZXcgU2V0KFsuLi5wYWNrYWdlc1N1YkRpclBhdGhzLCAuLi53b3Jrc3BhY2VTdWJEaXJQYXRoc10pXS5maWx0ZXIoXG4gICAgICAoc3ViRGlyUGF0aCkgPT4gc3ViRGlyUGF0aCAhPT0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoKVxuICAgICk7XG5cbiAgICAvLyBSZWZ1c2VkIHdyaXRlcyBvbiBjb3JlIG1hbmFnZWQgZmlsZXMgd291bGQgbGVhdmUgdGhlIHJlcG9zaXRvcnkgcGFydGlhbGx5IHVwZGF0ZWQsIHNvIHNraXBcbiAgICAvLyBpdCBCRUZPUkUgYW55IG11dGF0aW9uIHdoZW4gb25lIG9mIHRoZW0gaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gICAgY29uc3QgbWFuYWdlZEZpbGVQYXRocyA9IFtcbiAgICAgIC4uLlsnLmdpdGF0dHJpYnV0ZXMnLCAnYnVuZmlnLnRvbWwnLCAnbGVmdGhvb2sueW1sJywgJ3BhY2thZ2UuanNvbicsICd0c2NvbmZpZy5qc29uJ10ubWFwKChuYW1lKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIG5hbWUpXG4gICAgICApLFxuICAgICAgLi4uc3ViRGlyUGF0aHMuZmxhdE1hcCgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgWydwYWNrYWdlLmpzb24nLCAndHNjb25maWcuanNvbiddLm1hcCgobmFtZSkgPT4gcGF0aC5yZXNvbHZlKHN1YkRpclBhdGgsIG5hbWUpKVxuICAgICAgKSxcbiAgICBdO1xuICAgIGNvbnN0IHdyaXRhYmxlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWFuYWdlZEZpbGVQYXRocy5tYXAoKGZpbGVQYXRoKSA9PiBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpXG4gICAgKTtcbiAgICBpZiAod3JpdGFibGVSZXN1bHRzLmluY2x1ZGVzKGZhbHNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTogYSBtYW5hZ2VkIGNvbmZpZyBmaWxlIGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmxpZ2h0RXJyb3JzID0gW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10uZmxhdE1hcCgoZGlyUGF0aCkgPT4ge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gW107XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUNvbmZpZ1sncGFja2FnZUpzb24nXTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKHsgcGFja2FnZUpzb24gfSk7XG4gICAgICAgIHJldHVybiBlcnJvciA/IFtgJHtkaXJQYXRofTogJHtlcnJvcn1gXSA6IFtdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbYCR7cGFja2FnZUpzb25QYXRofSBpcyBpbnZhbGlkYF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHByZWZsaWdodEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OlxcbiR7cHJlZmxpZ2h0RXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gTGV0IGdldFBhY2thZ2VDb25maWcgZGVyaXZlIGlzUm9vdCBmb3IgdGhlIGVudHJ5IHBhdGg6IGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgaXMgYVxuICAgIC8vIHN1cHBvcnRlZCBpbnZvY2F0aW9uIHdob3NlIHRhcmdldCBtdXN0IGtlZXAgaXRzIGNoaWxkIGNsYXNzaWZpY2F0aW9uLCBzbyBmb3JjaW5nXG4gICAgLy8gYGlzUm9vdDogdHJ1ZWAgaGVyZSB3b3VsZCBhcHBseSByb290LW9ubHkgcHJvY2Vzc2luZyAobGVmdGhvb2sgaW5zdGFsbCwgcm9vdCB0c2NvbmZpZyxcbiAgICAvLyBBR0VOVFMubWQsIOKApikgdG8gYSBzdWJwYWNrYWdlLlxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlIChpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKikgaXMgYSBjaGlsZFxuICAgIC8vIHBhY2thZ2U7IHRoZSBwYWNrYWdlcy8qIGhldXJpc3RpYyBpbnNpZGUgZ2V0UGFja2FnZUNvbmZpZyB3b3VsZCBtaXNjbGFzc2lmeSBhcHBzLyogYXMgcm9vdHMuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHsgaXNSb290OiBmYWxzZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IGludmFsaWRTdWJQYWNrYWdlRGlyUGF0aCA9IHN1YkRpclBhdGhzLmZpbmQoXG4gICAgICAoc3ViRGlyUGF0aCwgaW5kZXgpID0+ICFudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzW2luZGV4XSAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJEaXJQYXRoLCAncGFja2FnZS5qc29uJykpXG4gICAgKTtcbiAgICBpZiAoaW52YWxpZFN1YlBhY2thZ2VEaXJQYXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OiAke2ludmFsaWRTdWJQYWNrYWdlRGlyUGF0aH0vcGFja2FnZS5qc29uIGlzIGludmFsaWQuYCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuICAgIC8vIFRoZSBtYW5hZ2VkIGlnbm9yZSBydWxlIGlzIHVuYW5jaG9yZWQsIHNvIGEgbmVzdGVkIGNvcHkgKGUuZy4gd29ya2Vycy9hcGkvLmVudi5jbG91ZGZsYXJlKSBpc1xuICAgIC8vIGFzIG11Y2ggYSBsZWFrIGFzIGEgcm9vdCBvbmU7IHRoZSB3aWxkY2FyZCBwYXRoc3BlYyBjb3ZlcnMgZXZlcnkgZGVwdGggaW4gb25lIHF1ZXJ5LlxuICAgIGNvbnN0IHRyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMgPSBhbGxQYWNrYWdlQ29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5pc0Nsb3VkZmxhcmUpXG4gICAgICA/IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAgICAgICAnZ2l0JyxcbiAgICAgICAgICBbJy1jJywgJ2NvcmUucXVvdGVQYXRoPWZhbHNlJywgJ2xzLWZpbGVzJywgJy0tJywgJy5lbnYuY2xvdWRmbGFyZScsICcqLy5lbnYuY2xvdWRmbGFyZSddLFxuICAgICAgICAgIHJvb3RDb25maWcuZGlyUGF0aFxuICAgICAgICApXG4gICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpKVxuICAgICAgOiBbXTtcbiAgICBpZiAodHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgU0VDVVJJVFkgRVJST1I6IENsb3VkZmxhcmUgY3JlZGVudGlhbHMgbXVzdCBiZSB1bnRyYWNrZWQuIFJlbW92ZSAke3RyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMuam9pbihcbiAgICAgICAgICAnLCAnXG4gICAgICAgICl9IGZyb20gR2l0LCBwdXJnZSB0aGUgdG9rZW4gZnJvbSBoaXN0b3J5LCBhbmQgcm90YXRlIENMT1VERkxBUkVfQVBJX1RPS0VOIGJlZm9yZSByZXJ1bm5pbmcgd2JmeS5gXG4gICAgICApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGF3YWl0IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgLy8gTWFuYWdlZCByZXBvc2l0b3JpZXMgdXNlIEJ1biB3aXRoIG1pc2UgKGFuZCBvcHRpb25hbGx5IGZub3gpLlxuICAgIGNvbnN0IHByZXZpb3VzQnVuR2xvYmFsU3RvcmUgPSByZWFkQnVuR2xvYmFsU3RvcmUocm9vdERpclBhdGgpO1xuICAgIC8vIFJvb3QtbGV2ZWwgaW5zdGFsbCBsYXlvdXQgbXVzdCBjb3ZlciB3b3Jrc3BhY2UgYXBwcyB0b286IE5leHQuanMgY29tbW9ubHkgbGl2ZXMgdW5kZXJcbiAgICAvLyBwYWNrYWdlcy8qIG9yIGFwcHMvKiB3aGlsZSBidW5maWcudG9tbCBleGlzdHMgb25seSBhdCB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgIGNvbnN0IHVzZUdsb2JhbFN0b3JlID0gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKGFsbFBhY2thZ2VDb25maWdzLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCBza2lwRGVwcyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBnZW5lcmF0ZU1pc2VUb21sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZyk7XG4gICAgLy8gUnVuIGFmdGVyIGdlbmVyYXRlRm5veFRvbWwgc28gaXRzIHRyYW5zYWN0aW9uYWwgcmVjaXBpZW50IHN5bmMgY2Fubm90IHJlc3RvcmUgYSBzbmFwc2hvdFxuICAgIC8vIG92ZXIgZGVmaW5pdGlvbnMgaW5zZXJ0ZWQgaGVyZS5cbiAgICBhd2FpdCBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICAvLyBwcm9taXNlUG9vbC5ydW4gcmVzb2x2ZXMgd2hlbiBhIHRhc2sgU1RBUlRTLCBzbyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGlzIG5vdFxuICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgb24gZGlzayB5ZXQ7IHRoZSBwcm9iZSBiZWxvdyBtdXN0IG5vdCB2YWxpZGF0ZSBhIHN0YWxlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgLy8gVGhlIGxheW91dCBtdXN0IGJlIHZlcmlmaWVkIGluc3RhbGxhYmxlIEJFRk9SRSBhbnkgYGJ1biBhZGRgIG11dGF0ZXMgcGFja2FnZS5qc29uIGZpbGVzOlxuICAgIC8vIHBlci1wYWNrYWdlIGluc3RhbGxzIHRvbGVyYXRlIGZhaWx1cmVzIChzcGF3blN5bmMgZGlzY2FyZHMgdGhlaXIgc3RhdHVzKSwgc28gYSBsYXlvdXQgdGhhdFxuICAgIC8vIGNhbm5vdCBpbnN0YWxsIHdvdWxkIHNpbGVudGx5IGRyb3AgZXZlcnkgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1bi5cbiAgICAvLyBBIGRvY3Mtb25seSByZXBvc2l0b3J5IGhhcyBubyBtYW5pZmVzdCB0byBwcm9iZSBvbiBpdHMgZmlyc3QgcnVuOyBnZW5lcmF0ZVBhY2thZ2VKc29uIGJlbG93XG4gICAgLy8gY3JlYXRlcyBpdCBiZWZvcmUgdGhlIGF1dGhvcml0YXRpdmUgcmVmcmVzaEJ1bkxvY2sgY2hlY2suXG4gICAgaWYgKFxuICAgICAgIXNraXBEZXBzICYmXG4gICAgICByb290Q29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICFwcm9iZUlzb2xhdGVkQnVuSW5zdGFsbChyb290RGlyUGF0aCwgcm9vdENvbmZpZywgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSwgdXNlR2xvYmFsU3RvcmUpXG4gICAgKSB7XG4gICAgICAvLyByZWZyZXNoQnVuTG9jayBiZWxvdyBpcyB0aGUgYXV0aG9yaXR5IG9uIHdoZXRoZXIgdGhlIGZpbmFsIGluc3RhbGwgZmFpbGVkLlxuICAgICAgY29uc29sZS53YXJuKGBidW4gaW5zdGFsbCBjdXJyZW50bHkgZmFpbHMgaW4gJHtyb290RGlyUGF0aH0gdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgLy8gT3RoZXIgb3duZXJzIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZSB3b3JrZmxvd3MgKHRoZWlyIHNlY3JldHMgYW5kIHJ1bm5lcnNcbiAgICAvLyBkbyBub3QgZXhpc3QgdGhlcmUpLCBzbyBhbnkgb3RoZXIgR2l0SHViLWhvc3RlZCBOb2RlLmpzIHJlcG9zaXRvcnkgZ2V0cyBzZWxmLWNvbnRhaW5lZFxuICAgIC8vIHdvcmtmbG93cyBpbnN0ZWFkIOKAlCBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXIncyBpZGVudGl0eS5cbiAgICAvLyByb290Q29uZmlnLmlzUm9vdDogYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gKGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmApIGtlZXBzXG4gICAgLy8gaXNSb290IGZhbHNlLCBhbmQgR2l0SHViIGlnbm9yZXMgd29ya2Zsb3cgZmlsZXMgbmVzdGVkIHVuZGVyIGEgcGFja2FnZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA9XG4gICAgICAhc2hvdWxkUnVuV29ya2Zsb3dzICYmXG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgISFyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSAmJlxuICAgICAgcm9vdENvbmZpZy5pc1Jvb3Q7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZml4UmFpbHdheWlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICAuLi4oc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA/IFtnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3Mocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgLy8gR2l0IGhvb2tzIGFyZSByZXBvc2l0b3J5LWxldmVsIHN0YXRlOiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCB3cml0ZSBhXG4gICAgICAvLyBjaGlsZCBsZWZ0aG9vay55bWwgb3IgcmVwbGFjZSB0aGUgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyBob29rIGluc3RhbGxhdGlvbi5cbiAgICAgIC4uLihyb290Q29uZmlnLmlzUm9vdCA/IFtnZW5lcmF0ZUxlZnRob29rKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIC8vIEFmdGVyIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgKGFuZCBpdHMgcG9vbGVkIHdyaXRlcykgc28gdGhlIGluc3RydWN0aW9uIGZpbGVzIGRlc2NyaWJlIHRoZVxuICAgIC8vIGZpbmFsaXplZCB3b3JrZmxvdyBmaWxlcyBpbnN0ZWFkIG9mIGxhZ2dpbmcgb25lIHJ1biBiZWhpbmQuXG4gICAgYXdhaXQgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5jaGFrcmEpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhDaGFrcmFUb2FzdGVyKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBza2lwRGVwcyk7XG5cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJiBkb2VzQ29udGFpbkpzT3JUcyhyb290Q29uZmlnKSkge1xuICAgICAgICAvLyBNb25vcmVwbyB2ZXJpZmljYXRpb24gY2FuIGludm9rZSBveGxpbnQgZnJvbSBldmVyeSB3b3Jrc3BhY2UuIEdpdmVcbiAgICAgICAgLy8gbm9uLWNvZGUgcGFja2FnZXMgYSBsb2NhbCBjb25maWcgc28gb3hsaW50IGRvZXMgbm90IGNsaW1iIHRvIHRoZVxuICAgICAgICAvLyByb290IGNvbmZpZyBhbmQgcmVqZWN0IHJvb3Qtb25seSB0eXBlLWF3YXJlIG9wdGlvbnMgZnJvbSBhIHBhY2thZ2UgY3dkLlxuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgLy8gUnVuIGFmdGVyIGV2ZXJ5IHBvb2xlZCBnZW5lcmF0b3Igd3JpdGUgc28gbm9ybWFsaXphdGlvbiBjYW5ub3Qgb3ZlcndyaXRlIGEgY29uY3VycmVudFxuICAgIC8vIHVwZGF0ZSwgYW5kIGJlZm9yZSBjbGVhbnVwIHNvIGZvcm1hdHRlciBtZXRhZGF0YSBjYWNoZXMgb2JzZXJ2ZSB0aGUgY2hhbmdlZCBmaWxlcy5cbiAgICByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMocm9vdERpclBhdGgpO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIHRyeSB7XG4gICAgICByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEEgZmFpbGVkIGluc3RhbGwgbXVzdCBmYWlsIHRoZSBDTEk6IGV4aXRpbmcgMCB3aXRoIGEgc3RhbGUgb3IgbWlzc2luZyBCdW4gbG9ja2ZpbGUgd291bGRcbiAgICAgIC8vIGhpZGUgYSBicm9rZW4gbWFuYWdlZCBjb25maWd1cmF0aW9uLlxuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlZnJlc2ggdGhlIEJ1biBsb2NrZmlsZTonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJ1biB3cml0ZXMgYnVuLmxvY2sgYmVmb3JlIGxpZmVjeWNsZSBzY3JpcHRzLCBzbyBhIGZhaWxlZCBpbnN0YWxsIGNhbiBzdGlsbCBsZWF2ZSBHdWFyZFxuICAgICAgLy8gVVJMcyBiZWhpbmQuIE5vcm1hbGl6ZSBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgb3V0cHV0IHdpdGhvdXQgcmVwbGFjaW5nIHRoZSBpbnN0YWxsIGVycm9yLlxuICAgICAgY29uc3Qgbm9ybWFsaXplZExvY2tmaWxlUGF0aCA9IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHJvb3REaXJQYXRoKTtcbiAgICAgIGlmIChub3JtYWxpemVkTG9ja2ZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgUmVtb3ZlZCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tICR7bm9ybWFsaXplZExvY2tmaWxlUGF0aH0gdG8ga2VlcCBpdCByZWdpc3RyeS1hZ25vc3RpYy5gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIG5vcm1hbGl6ZSB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICBzcGF3blN5bmMoJ2J1bicsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gIH1cbiAgcmV0dXJuIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnO1xufVxuXG4vKipcbiAqIFByb2JlcyBgYnVuIGluc3RhbGxgIHVuZGVyIHRoZSBpc29sYXRlZCBsaW5rZXIuIEFuIGluY29tcGF0aWJpbGl0eSBtdXN0IGJlIGZpeGVkIGluIHRoZVxuICogcmVwb3NpdG9yeSBvciBpbiB3YmZ5J3MgbWFuYWdlZCBsaXN0cywgbmV2ZXIgYnkgc3dpdGNoaW5nIHRoZSBsaW5rZXIuIFJldHVybnMgZmFsc2Ugd2hlbiB0aGVcbiAqIGluc3RhbGwgZmFpbHMuXG4gKi9cbmZ1bmN0aW9uIHByb2JlSXNvbGF0ZWRCdW5JbnN0YWxsKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICB1c2VHbG9iYWxTdG9yZTogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIC8vIEEgbGF5b3V0IHN3aXRjaCBtdXN0IHByb2JlIGZyb20gYSBjbGVhbiB0cmVlIGJlY2F1c2UgQnVuIGRvZXMgbm90IHJlbW92ZSB0aGUgcHJldmlvdXMgbGF5b3V0J3MgbGVmdG92ZXJzLlxuICBpZiAocHJldmlvdXNHbG9iYWxTdG9yZSAhPT0gdXNlR2xvYmFsU3RvcmUpIHtcbiAgICByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aCwgcm9vdENvbmZpZyk7XG4gIH1cbiAgLy8gUmV0cnkgb25jZSBzbyBhIHRyYW5zaWVudCBmYWlsdXJlIChyZWdpc3RyeSBoaWNjdXAsIGZsYWt5IGxpZmVjeWNsZSBzY3JpcHQpIGRvZXMgbm90XG4gIC8vIG1hc3F1ZXJhZGUgYXMgYSBsYXlvdXQgaW5jb21wYXRpYmlsaXR5LlxuICBpZiAoc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpID09PSAwKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBDbGVhbiB1cCB0aGUgZmFpbGVkIGF0dGVtcHQgc28gbGF0ZXIgaW5zdGFsbHMgZG8gbm90IHJ1biBvbiBhIHBvbGx1dGVkIHRyZWUuXG4gIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aDogc3RyaW5nLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIC8vIENvdmVyIGV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZTogbGVmdG92ZXJzIGNhbiBrZWVwIHBoYW50b20gZGVwZW5kZW5jaWVzIHJlc29sdmFibGUuXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aHMgPSBbXG4gICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJyksXG4gICAgLi4uWy4uLmdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLnZhbHVlcygpXS5tYXAoKHdvcmtzcGFjZURpcikgPT5cbiAgICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgd29ya3NwYWNlRGlyLCAnbm9kZV9tb2R1bGVzJylcbiAgICApLFxuICBdO1xuICAvLyBOZXZlciBkZWxldGUgdGhyb3VnaCBhIHdvcmtzcGFjZSBzeW1saW5rIHRoYXQgZXNjYXBlcyB0aGlzIHJlcG9zaXRvcnkuXG4gIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNQYXRoIG9mIG5vZGVNb2R1bGVzUGF0aHMpIHtcbiAgICBjb25zdCByZWFsUGFyZW50RGlyUGF0aCA9IGlnbm9yZUVycm9yKCgpID0+IGZzLnJlYWxwYXRoU3luYyhwYXRoLmRpcm5hbWUobm9kZU1vZHVsZXNQYXRoKSkpO1xuICAgIGlmIChcbiAgICAgICFyZWFsUGFyZW50RGlyUGF0aCB8fFxuICAgICAgKHJlYWxQYXJlbnREaXJQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiYgIXJlYWxQYXJlbnREaXJQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZzLnJtU3luYyhub2RlTW9kdWxlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoLCAxKTtcbiAgaWYgKHN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIEJ1biBsb2NrZmlsZTogYnVuIGluc3RhbGwgZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzQyLDQzLDQ0LDQ1LDQ2LDQ3XSwibWFwcGluZ3MiOiIrMUJBQUEsZUFBc0IsRUFBTSxFQUFxQyxDQUMvRCxPQUFPLElBQUksUUFBUyxHQUFZLFdBQVcsRUFBUyxDQUFZLENBQUMsQ0FDbkUsQ0NjQSxTQUFnQixHQUFlLEVBQTRCLENBQ3pELEdBQUksQ0FDRixPQUFPLEVBQUcsQ0FDWixNQUFRLENBRVIsQ0FDRixDQWFBLGVBQXNCLEdB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