UNPKG

88.3 kBJavaScriptView Raw
1#!/usr/bin/env node
2var Ke=Object.create;var M=Object.defineProperty,Qe=Object.defineProperties,Xe=Object.getOwnPropertyDescriptor,Ye=Object.getOwnPropertyDescriptors,Ze=Object.getOwnPropertyNames,ue=Object.getOwnPropertySymbols,et=Object.getPrototypeOf,fe=Object.prototype.hasOwnProperty,tt=Object.prototype.propertyIsEnumerable;var me=(e,t,o)=>t in e?M(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,w=(e,t)=>{for(var o in t||(t={}))fe.call(t,o)&&me(e,o,t[o]);if(ue)for(var o of ue(t))tt.call(t,o)&&me(e,o,t[o]);return e},R=(e,t)=>Qe(e,Ye(t)),de=e=>M(e,"__esModule",{value:!0});var ge=(e,t)=>{de(e);for(var o in t)M(e,o,{get:t[o],enumerable:!0})},rt=(e,t,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ze(t))!fe.call(e,s)&&s!=="default"&&M(e,s,{get:()=>t[s],enumerable:!(o=Xe(t,s))||o.enumerable});return e},c=e=>rt(de(M(e!=null?Ke(et(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);ge(exports,{registerRuntime:()=>X});var ze=c(require("path")),Ge=c(require("sade"));var ot="presta",st="0.45.4",it="Hyper minimal framework for the modern web.",nt="./dist/index.js",at="./dist/index.d.ts",lt={presta:"dist/bin.js"},ct=["dist"],pt={build:"node scripts/build && pnpx tsc --emitDeclarationOnly",cloc:"pnpm dlx cloc './lib/*.ts'",typecheck:"pnpx tsc --noEmit"},ut={type:"git",url:"git+ssh://git@github.com/sure-thing/presta.git"},ft="estrattonbailey",mt="MIT",dt={url:"https://github.com/sure-thing/presta/issues"},gt="https://github.com/sure-thing/presta#readme",bt={"@presta/utils":"workspace:^0.1.2",chokidar:"^3.4.3","deep-extend":"^0.6.0",dotenv:"^10.0.0",esbuild:"^0.12.28","esbuild-register":"^2.6.0",filewatcher:"^3.0.1","fs-extra":"^9.0.1","get-port":"^5.1.1",kleur:"^4.1.4","lambda-types":"^1.0.0","mime-types":"^2.1.31","module-alias":"^2.2.2",ms:"^2.1.2",picomatch:"^2.3.0","query-string":"^6.14.1","raw-body":"^2.4.1",regexparam:"^1.3.0","route-sort":"^1.0.0",sade:"^1.7.3",sirv:"^1.0.7",statues:"^1.0.0-alpha1",statuses:"^2.0.1","tiny-glob":"^0.2.9","watch-dependency-graph":"^3.0.1",ws:"^8.4.0"},yt={"@netlify/functions":"^0.7.2","@types/deep-extend":"^0.4.32","@types/fs-extra":"^9.0.12","@types/mime-types":"^2.1.0","@types/picomatch":"^2.2.4","@types/sade":"^1.7.3","@types/statuses":"^2.0.0","@types/ws":"^8.2.2",proxyquire:"^2.1.3","supertest-fetch":"^1.4.3",typescript:"^4.5.2"},be={name:ot,version:st,description:it,main:nt,types:at,bin:lt,files:ct,scripts:pt,repository:ut,author:ft,license:mt,bugs:dt,homepage:gt,dependencies:bt,devDependencies:yt};var Ae=c(require("path")),pe=c(require("chokidar"));var ee={};ge(ee,{Levels:()=>F,colors:()=>k.default,debug:()=>b,error:()=>v,getLogs:()=>vt,info:()=>y,logger:()=>B,newline:()=>wt,raw:()=>xt,warn:()=>C});var k=c(require("kleur"));var h={PRODUCTION:"production",DEVELOPMENT:"development"};var F;(function(r){r.Debug="debug",r.Info="info",r.Warn="warn",r.Err="error"})(F||(F={}));var Z=[],ht={[F.Debug]:"magenta",[F.Info]:"blue",[F.Warn]:"yellow",[F.Err]:"red"};function vt(){if(!process.env.TESTING)throw new Error("Internal method was called outside test mode");return Z}function B(e){if(process.env.TESTING)Z.push(e);else{let t=process.env.PRESTA_DEBUG,o=process.env.PRESTA_ENV===h.PRODUCTION?"prod":"dev";if(!t&&e.level===F.Debug)return;console.log([k.default.gray(o),k.default[ht[e.level||"info"]](e.label),e.message,e.duration?k.default.gray("+"+e.duration):"",e.error?`
3
4${e.error.stack||e.error}
5
6`:""].filter(Boolean).join(" "))}}function b(e){B(w({level:F.Debug},e))}function y(e){B(w({level:F.Info},e))}function C(e){B(w({level:F.Warn},e))}function v(e){B(w({level:F.Err},e))}function xt(...e){process.env.TESTING?Z.push(e):console.log(...e)}function wt(){process.env.TESTING||console.log("")}var ye=c(require("fs")),P=c(require("path")),he=c(require("get-port"));var E="presta.config.js";function j(e){return(0,he.default)({port:parseInt(e,10)})}function L(e,t=!1){let o=P.default.resolve(e||E);try{return delete require.cache[o],require(o)}catch(s){return ye.default.existsSync(o)&&(v({label:"error",error:s}),t&&process.exit(1)),{}}}function _(e,t,o,s=process.cwd()){let r=w({env:e,output:"build",assets:"public",plugins:[],port:4e3,files:[]},o);return t._.length&&(r.files=t._),t.output&&(r.output=t.output),t.assets&&(r.assets=t.assets),t.port&&(r.port=t.port),r.files&&(r.files=[].concat(r.files).map(i=>P.default.resolve(s,i))),r.output&&(r.output=P.default.resolve(s,r.output)),r.assets&&(r.assets=P.default.resolve(s,r.assets)),R(w({},r),{staticOutputDir:P.default.join(r.output,"static"),functionsOutputDir:P.default.join(r.output,"functions"),manifestFilepath:P.default.join(r.output,"manifest.json"),__unsafe_bundle_everything:r.__unsafe_bundle_everything||!1})}var ie=c(require("fs-extra")),Oe=c(require("path")),Re=c(require("watch-dependency-graph")),De=c(require("chokidar")),Me=c(require("picomatch")),ke=c(require("@presta/utils"));var te=c(require("fs-extra")),ve=c(require("path")),xe=c(require("route-sort")),we=c(require("@presta/utils"));function Ft(e){return e.replace(process.cwd(),"").split(".").reverse().slice(1).reverse().join("-").split("/").filter(Boolean).join("-")}function $(e,t,o=!1){let s=e.map(n=>{try{let{route:a}=require(n),p=Ft(n),l=ve.default.join(t.functionsOutputDir,t.env===h.PRODUCTION?p+"-"+(0,we.hashContent)(te.default.readFileSync(n,"utf8"))+".js":p+".js");return b({label:"debug",message:`generating ${p} lambda`}),delete require.cache[n],delete require.cache[l],te.default.outputFileSync(l,`import { wrapHandler } from 'presta/dist/wrapHandler';
7 import * as file from '${n}';
8 export const route = file.route
9 export const handler = wrapHandler(file)`),{type:"dynamic",src:n,dest:l,route:a}}catch(a){if(o)throw a;v({label:"error",error:a})}}).filter(Boolean),r=(0,xe.default)(s.map(n=>n.route)),i=[];for(let n of r){let a=s.find(p=>p.route===n);a&&i.push(a)}return i}var re=c(require("fs-extra")),Fe=c(require("path")),Se=c(require("tiny-glob/sync"));function H(e){return/export\s.+\sroute\s+\=/.test(re.default.readFileSync(e,"utf-8"))}function N(e){return/export\s.+\sgetStaticPaths/.test(re.default.readFileSync(e,"utf-8"))}function q(e){return[].concat(e).map(t=>(0,Se.default)(t)).flat().map(t=>Fe.default.resolve(process.cwd(),t))}var oe=c(require("fs-extra")),se=c(require("path")),Pe=c(require("mime-types")),V=c(require("@presta/utils"));function St(e){return typeof e=="object"?JSON.stringify(e):e}function Pt(e){let t={};for(let o of Object.keys(e)){let s=o.toLowerCase(),r=e[o];t[s]=r||""}return t}function I(e){let{isBase64Encoded:t=!1,statusCode:o=200,headers:s={},multiValueHeaders:r={},body:i="",html:n=void 0,json:a=void 0,xml:p=void 0}=typeof e=="string"?{body:e}:e,l=o>299&&o<399,u="text/html; charset=utf-8";a?u="application/json; charset=utf-8":p&&(u="application/xml; charset=utf-8");let m=Pt(s),f={};return l||(f["content-type"]=u),{isBase64Encoded:t,statusCode:o,headers:Object.assign({},f,m),multiValueHeaders:r,body:St(i||n||a||p||"")}}function A({port:e}){return`
10 <script>
11 (function (global) {
12 var socket = new WebSocket('ws://localhost:${e}');
13
14 socket.addEventListener('open', function (event) {
15 console.log('[presta] connected on port ${e}')
16 });
17
18 socket.addEventListener('message', function (event) {
19 console.log(\`'[presta] received \${event.data}\`)
20 if (event.data === 'refresh') {
21 global.location.reload();
22 }
23 });
24
25 socket.addEventListener('close', function () {
26 console.log('[presta] disconnected')
27 });
28 })(this);
29 <\/script>
30 `}function Et(e,t="html"){return se.default.extname(e)?e:t==="html"?`${e}/index.html`:`${e}.${t}`}async function U(e){return b({label:"debug",message:`removing old static file ${e}`}),oe.default.remove(e)}async function Ct(e){return Promise.all(e.map(U))}async function Ot(e,t,{footer:o}){let s=require(e),r=await s.getStaticPaths(),i=[];if(!r||!r.length)return i;for(let n of r){let a=(0,V.timer)(),p={path:n,pathParameters:s.route?(0,V.parsePathParameters)(n,s.route):{}},l=I(await s.handler(p,{})),u=((l==null?void 0:l.headers)||{})["content-type"],m=Pe.default.extension(u)||"html",f=Et(n,m),x=l.body+(m==="html"?o:""),g=se.default.join(t,f);oe.default.outputFileSync(g,x,"utf-8"),y({label:"built",message:n,duration:a()}),i.push(g)}return i}async function W(e,t,o={}){let s=t.env===h.DEVELOPMENT,r=t.staticOutputDir,i=s?A({port:t.port}):"";for(let n of e)try{let a=n.replace(process.cwd(),""),p=o[n]||[],l=await Ot(n,r,{footer:i});if(!l||!l.length){C({label:"paths",message:`${a} - no paths to render`}),Ct(p);continue}for(let u of p)l.includes(u)||U(u);o[n]=l}catch(a){v({label:"error",error:a});break}return{staticFilesMap:o}}var Ee=c(require("fs-extra"));function z(e){return Object.keys(e).map(t=>e[t].map(o=>({type:"static",src:t,dest:o}))).flat()}function Ce(e){return e.files.filter(t=>t.type==="dynamic")}function G(e,t){Ee.default.outputFileSync(t.manifestFilepath,JSON.stringify(e,null," "),"utf8")}function Be(e,t){let o=(0,ke.timer)(),s=$(e,t);return e.length&&y({label:"built",message:"lambdas",duration:o()}),s}function Rt(e,t,o){return(0,Me.default)(t)(e)&&!o.includes(e)}async function He(e,t){let o={},s=q(e.files);s.length||C({label:"paths",message:"no files configured"});async function r(a,p,l){for(let f of a)delete require.cache[f];let u=await W(a.filter(N),l,o),m=Be(p.filter(H),l);o=Object.assign(o,u.staticFilesMap),G({files:[...z(o),...m]},l)}await r(s,s,e),t.emitBrowserRefresh();let i=(0,Re.create)({alias:{"@":process.cwd()}});i.onChange(async a=>{await r(a,s,e),t.emitBrowserRefresh()}),i.onRemove(async([a])=>{b({label:"watch",message:`removed ${a}`}),s.splice(s.indexOf(a),1),Be(s.filter(H),e),(o[a]||[]).forEach(p=>U(Oe.default.join(e.staticOutputDir,p))),t.emitBrowserRefresh()}),i.onError(a=>{v({label:"error",error:typeof a=="string"?new Error(a):a})}),await i.add(s);let n=De.default.watch(process.cwd(),{ignoreInitial:!0,ignored:[e.output,e.assets]});return n.on("add",async a=>{!ie.default.existsSync(a)||ie.default.lstatSync(a).isDirectory()||!Rt(a,e.files,s)||(b({label:"watch",message:`add ${a}`}),s.push(a),await i.add(a),await r([a],s,e),t.emitBrowserRefresh())}),t.onBuildFile(async({file:a})=>{await r([a],s,e),t.emitBrowserRefresh()}),{async close(){await i.close(),await n.close()}}}async function J(e,t,o){let s=await Promise.all(e.map(r=>{try{return r(t,o)}catch(i){v({label:"error",error:i})}}).filter(Boolean));return{async cleanup(){return Promise.all(s.map(r=>r&&r.cleanup&&r.cleanup()))}}}var Ie;(function(s){s.PostBuild="post-build",s.BuildFile="build-file",s.BrowserRefresh="browser-refresh"})(Ie||(Ie={}));function K(){let e={};function t(i,...n){e[i]&&e[i].map(a=>a(...n))}function o(i,n){return e[i]=e[i]?e[i].concat(n):[n],()=>e[i].splice(e[i].indexOf(n),1)}function s(){e={}}function r(i){return e[i]||[]}return{emit:t,on:o,clear:s,listeners:r}}function Q(e){return{emitPostBuild(t){e.emit("postBuild",t)},onPostBuild(t){return e.on("postBuild",t)},emitBuildFile(t){e.emit("buildFile",t)},onBuildFile(t){return e.on("buildFile",t)},emitBrowserRefresh(){e.emit("browserRefresh")},onBrowserRefresh(t){return e.on("browserRefresh",t)}}}var Te=c(require("path")),ne=c(require("fs-extra")),je=c(require("esbuild")),O=c(require("@presta/utils"));async function Le(e,t){let o=(0,O.timer)(),s=q(e.files),r=s.filter(N),i=s.filter(H);if(b({label:"build",message:"starting build"}),!r.length&&!i.length)C({label:"files",message:"no files were found, nothing to build"});else{let n="",a=0,p="",l="",u=[],m=[],f=await Promise.allSettled([(async()=>{if(r.length){let g=(0,O.timer)(),{staticFilesMap:D}=await W(r,e);u=z(D),n=g(),a=Object.keys(D).reduce((Y,Je)=>Y+=D[Je].length,0)}})(),(async()=>{if(i.length){let g=(0,O.timer)(),D=(0,O.requireSafe)(Te.default.join(process.cwd(),"package.json"));m=$(i,e,!0),await(0,je.build)({entryPoints:m.map(Y=>Y.dest),outdir:e.functionsOutputDir,platform:"node",target:["node12"],minify:!0,allowOverwrite:!0,external:e.__unsafe_bundle_everything?[]:Object.keys(D.dependencies||{}),bundle:!0,define:{"process.env.PRESTA_SERVERLESS_RUNTIME":"true"}}),p=g()}})(),(async()=>{if(ne.default.existsSync(e.assets)){let g=(0,O.timer)();ne.default.copySync(e.assets,e.staticOutputDir),l=g()}})()]);if(f.find(g=>g.status==="rejected"))throw b({label:"build",message:"build partially failed"}),f.forEach(g=>{g.status==="rejected"&&v({label:"error",error:g.reason})}),new Error("presta build failed");let x={files:[...u,...m]};G(x,e),t.emitPostBuild({output:e.output,staticOutput:e.staticOutputDir,functionsOutput:e.functionsOutputDir,manifest:x}),n&&y({label:"static",message:`rendered ${a} file(s)`,duration:n}),p&&y({label:"lambda",message:`compiled ${i.length} function(s)`,duration:p}),l&&y({label:"assets",message:"copied",duration:l}),(n||p)&&y({label:"build",message:"complete",duration:o()})}}var _e=c(require("http")),ae=c(require("sirv")),$e=c(require("mime-types")),Ne=c(require("regexparam")),le=c(require("statuses")),qe=c(require("ws")),S=c(require("@presta/utils"));function Dt(e,t){let o=new Error(t);return o.statusCode=e,o}function Mt(e){let t=((e==null?void 0:e.headers)||{})["content-type"];return $e.default.extension(t)||"html"}function kt(e,t){let s=Ce(t).map(r=>({matcher:(0,Ne.default)(r.route),file:r})).filter(({matcher:r})=>r.pattern.test(e.split("?")[0])).map(({file:r})=>r)[0];return s?require(s.dest):void 0}async function Bt(e,t){let o=e.headers.Accept||e.headers.accept,s=o&&o.includes("json");try{if(!t||!t.handler)throw Dt(404,"");return I(await t.handler(e,{awsRequestId:"presta dev"}))}catch(r){let i=r,{statusCode:n=500}=i;return n>499&&v({label:"error",message:i.message||le.default.message[n],error:i}),I({statusCode:n,html:s?void 0:(0,S.createDefaultHtmlResponse)({statusCode:n}),json:s?{detail:le.default.message[n]}:void 0})}}function Ht({port:e,config:t}){return async function(s,r){var f;let i=(0,S.timer)(),n=await(0,S.requestToEvent)(s),a=(0,S.requireFresh)(t.manifestFilepath),p=kt(n.path,a),l=await Bt(n,p),u=l.statusCode>299&&l.statusCode<399;(u?void 0:Mt(l))==="html"&&(l.body=(l.body||"").split("</body>")[0]+A({port:e})),(0,S.sendServerlessResponse)(r,l),ee[l.statusCode<299?"info":"error"]({label:"serve",message:`${l.statusCode} ${u&&((f=l==null?void 0:l.headers)==null?void 0:f.Location)||n.path}`,duration:i()})}}function It({port:e,config:t}){let o=t.staticOutputDir,s=t.assets;return async function(i,n){let a=(0,S.timer)(),p=i.url;b({label:"debug",message:`handling ${p}`});function l(u,m){y({label:"serve",message:`${u.statusCode} ${m}`,duration:a()})}(0,ae.default)(s,{dev:!0,setHeaders:l})(i,n,()=>{(0,ae.default)(o,{dev:!0,setHeaders:l})(i,n,async()=>{Ht({port:e,config:t})(i,n)})})}}function ce(e,t){let o=e.port,s=_e.default.createServer(It({port:o,config:e})).listen(o),r=new qe.WebSocketServer({server:s}),i=[];return s.on("connection",n=>{i.push(n),n.on("close",()=>i.splice(i.indexOf(n),1))}),t.onBrowserRefresh(()=>{b({label:"debug",message:"refresh event received"}),r.clients.forEach(n=>n.send("refresh"))}),{async close(){return new Promise(n=>{s.close(()=>n(1)),i.forEach(a=>a.destroy())})}}}async function Ve(e){let t=L(e.config,!0),o=await j(e.port||t.port||4e3),s=K(),r=Q(s),i=_(h.PRODUCTION,R(w({},e),{port:o}),t);await J(i.plugins,i,r),y({label:"build"}),await Le(i,r)}async function Ue(e){let t=e["no-serve"],o,s,r=!1;async function i(){let a,p,l,u=L(e.config);(!s||u.port&&s!==u.port)&&(s=await j(e.port||u.port||4e3),process.env.PRESTA_SERVE_URL=`http://localhost:${s}`);let m=K(),f=Q(m),x=_(h.DEVELOPMENT,R(w({},e),{port:s}),u),g=await J(x.plugins,x,f);return b({label:"debug",message:`config created ${JSON.stringify(x)}`}),t||(p=ce(x,f),l=pe.default.watch(x.assets,{ignoreInitial:!0}).on("all",()=>{f.emitBrowserRefresh()})),y({label:r?"restart":"start",message:t?"":`http://localhost:${x.port}`}),a=await He(x,f),{config:x,async close(){m.clear(),await g.cleanup(),await l.close(),await a.close(),p&&await p.close()}}}let n=pe.default.watch(Ae.default.resolve(e.config||E),{ignoreInitial:!0}).on("all",async()=>{if(!r){r=!0;try{await o.close()}catch(a){console.error(a)}console.clear(),o=await i(),r=!1}});return o=await i(),{async close(){await n.close(),await o.close()}}}async function We(e){let t=L(e.config,!0),o=await j(e.port||t.port||4e3),s=K(),r=Q(s),i=_(h.PRODUCTION,R(w({},e),{port:o}),t);await J(i.plugins,i,r),ce(i,r),y({label:"serve",message:`http://localhost:${i.port}`})}function X(e={}){require("dotenv").config({path:ze.default.join(process.cwd(),".env")}),require("module-alias").addAliases({"@":process.cwd(),"presta:internal":__dirname}),require("esbuild-register/dist/node").register(e)}var T=(0,Ge.default)("presta");T.version(be.version).option("--config, -c",`Path to a config file. (default ${E})`).option("--output, -o","Specify output directory for built files. (default ./build)").option("--assets, -a","Specify static asset directory. (default ./public)").option("--debug, -d","Enable debug mode (prints more logs)").example("dev index.jsx -o dist").example("dev 'pages/*.tsx' -o static").example("'pages/*.tsx'").example("-c site.json").example("serve -p 8080");T.command("build","Build project to output directory.",{default:!0}).example("").example("files/**/*.js").example(`-c ${E}`).action(e=>{process.env.PRESTA_ENV=h.PRODUCTION,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),X(),Ve(e)});T.command("dev","Start Presta dev server and watch files",{alias:"watch"}).option("--port, -p","Port to run the local server. (default 4000)").option("--no-serve, -n","Do not run local dev server. (default false)").describe("Watch project and build to output directory.").example("dev").example("dev ./files/**/*.js").example("dev ./files/**/*.js -o ./out").example(`dev -c ${E}`).action(e=>{process.env.PRESTA_ENV=h.DEVELOPMENT,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),X(),Ue(e)});T.command("serve").option("--port, -p","Port to run the local server. (default 4000)").describe("Serve built files, lambdas, and static assets.").example("serve").example("serve -o ./out -p 8080").example(`serve -c ${E}`).action(async e=>{process.env.PRESTA_ENV=h.DEVELOPMENT,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),X(),We(e)});T.parse(process.argv);0&&(module.exports={registerRuntime});
31//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL2Jpbi50cyIsICIuLi9saWIvY2xpLnRzIiwgIi4uL2xpYi9sb2cudHMiLCAiLi4vbGliL2NvbnN0YW50cy50cyIsICIuLi9saWIvY29uZmlnLnRzIiwgIi4uL2xpYi93YXRjaC50cyIsICIuLi9saWIvb3V0cHV0TGFtYmRhcy50cyIsICIuLi9saWIvZ2V0RmlsZXMudHMiLCAiLi4vbGliL2J1aWxkU3RhdGljRmlsZXMudHMiLCAiLi4vbGliL25vcm1hbGl6ZVJlc3BvbnNlLnRzIiwgIi4uL2xpYi91dGlscy50cyIsICIuLi9saWIvbWFuaWZlc3QudHMiLCAiLi4vbGliL3BsdWdpbnMudHMiLCAiLi4vbGliL2NyZWF0ZUVtaXR0ZXIudHMiLCAiLi4vbGliL2J1aWxkLnRzIiwgIi4uL2xpYi9zZXJ2ZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHNhZGUgZnJvbSAnc2FkZSdcblxuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nXG5cbmltcG9ydCB7IGJ1aWxkQ29tbWFuZCwgZGV2Q29tbWFuZCwgc2VydmVDb21tYW5kIH0gZnJvbSAnLi9jbGknXG5pbXBvcnQgeyBkZWZhdWx0Q29uZmlnRmlsZXBhdGggfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lKG9wdGlvbnMgPSB7fSkge1xuICByZXF1aXJlKCdkb3RlbnYnKS5jb25maWcoeyBwYXRoOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5lbnYnKSB9KVxuXG4gIHJlcXVpcmUoJ21vZHVsZS1hbGlhcycpLmFkZEFsaWFzZXMoe1xuICAgICdAJzogcHJvY2Vzcy5jd2QoKSxcbiAgICAncHJlc3RhOmludGVybmFsJzogX19kaXJuYW1lLCAvLyBUT0RPIHdoZXJldmVyIHRoaXMgaXMgcnVubmluZyBmcm9tXG4gIH0pXG5cbiAgcmVxdWlyZSgnZXNidWlsZC1yZWdpc3Rlci9kaXN0L25vZGUnKS5yZWdpc3RlcihvcHRpb25zKVxufVxuXG5jb25zdCBwcm9ncmFtID0gc2FkZSgncHJlc3RhJylcblxucHJvZ3JhbVxuICAudmVyc2lvbihwa2cudmVyc2lvbilcbiAgLy8gZG8gbm90IHByb3ZpZGUgZGVmYXVsdCBjb25maWcgaGVyZVxuICAub3B0aW9uKCctLWNvbmZpZywgLWMnLCBgUGF0aCB0byBhIGNvbmZpZyBmaWxlLiAgKGRlZmF1bHQgJHtkZWZhdWx0Q29uZmlnRmlsZXBhdGh9KWApXG4gIC5vcHRpb24oJy0tb3V0cHV0LCAtbycsIGBTcGVjaWZ5IG91dHB1dCBkaXJlY3RvcnkgZm9yIGJ1aWx0IGZpbGVzLiAgKGRlZmF1bHQgLi9idWlsZClgKVxuICAub3B0aW9uKCctLWFzc2V0cywgLWEnLCBgU3BlY2lmeSBzdGF0aWMgYXNzZXQgZGlyZWN0b3J5LiAgKGRlZmF1bHQgLi9wdWJsaWMpYClcbiAgLm9wdGlvbignLS1kZWJ1ZywgLWQnLCBgRW5hYmxlIGRlYnVnIG1vZGUgKHByaW50cyBtb3JlIGxvZ3MpYClcbiAgLmV4YW1wbGUoYGRldiBpbmRleC5qc3ggLW8gZGlzdGApXG4gIC5leGFtcGxlKGBkZXYgJ3BhZ2VzLyoudHN4JyAtbyBzdGF0aWNgKVxuICAuZXhhbXBsZShgJ3BhZ2VzLyoudHN4J2ApXG4gIC5leGFtcGxlKGAtYyBzaXRlLmpzb25gKVxuICAuZXhhbXBsZShgc2VydmUgLXAgODA4MGApXG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2J1aWxkJywgJ0J1aWxkIHByb2plY3QgdG8gb3V0cHV0IGRpcmVjdG9yeS4nLCB7IGRlZmF1bHQ6IHRydWUgfSlcbiAgLmV4YW1wbGUoYGApXG4gIC5leGFtcGxlKGBmaWxlcy8qKi8qLmpzYClcbiAgLmV4YW1wbGUoYC1jICR7ZGVmYXVsdENvbmZpZ0ZpbGVwYXRofWApXG4gIC5hY3Rpb24oKG9wdGlvbnMpID0+IHtcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID0gRW52LlBST0RVQ1RJT05cbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfREVCVUcgPSBvcHRpb25zLmRlYnVnID8gJ2RlYnVnJyA6ICcnXG4gICAgY29uc29sZS5jbGVhcigpXG4gICAgcmVnaXN0ZXJSdW50aW1lKClcbiAgICBidWlsZENvbW1hbmQob3B0aW9ucylcbiAgfSlcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnZGV2JywgJ1N0YXJ0IFByZXN0YSBkZXYgc2VydmVyIGFuZCB3YXRjaCBmaWxlcycsIHsgYWxpYXM6ICd3YXRjaCcgfSlcbiAgLm9wdGlvbignLS1wb3J0LCAtcCcsIGBQb3J0IHRvIHJ1biB0aGUgbG9jYWwgc2VydmVyLiAgKGRlZmF1bHQgNDAwMClgKVxuICAub3B0aW9uKCctLW5vLXNlcnZlLCAtbicsIGBEbyBub3QgcnVuIGxvY2FsIGRldiBzZXJ2ZXIuICAoZGVmYXVsdCBmYWxzZSlgKVxuICAuZGVzY3JpYmUoJ1dhdGNoIHByb2plY3QgYW5kIGJ1aWxkIHRvIG91dHB1dCBkaXJlY3RvcnkuJylcbiAgLmV4YW1wbGUoYGRldmApXG4gIC5leGFtcGxlKGBkZXYgLi9maWxlcy8qKi8qLmpzYClcbiAgLmV4YW1wbGUoYGRldiAuL2ZpbGVzLyoqLyouanMgLW8gLi9vdXRgKVxuICAuZXhhbXBsZShgZGV2IC1jICR7ZGVmYXVsdENvbmZpZ0ZpbGVwYXRofWApXG4gIC5hY3Rpb24oKG9wdGlvbnMpID0+IHtcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID0gRW52LkRFVkVMT1BNRU5UXG4gICAgcHJvY2Vzcy5lbnYuUFJFU1RBX0RFQlVHID0gb3B0aW9ucy5kZWJ1ZyA/ICdkZWJ1ZycgOiAnJ1xuICAgIGNvbnNvbGUuY2xlYXIoKVxuICAgIHJlZ2lzdGVyUnVudGltZSgpXG4gICAgZGV2Q29tbWFuZChvcHRpb25zKVxuICB9KVxuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdzZXJ2ZScpXG4gIC5vcHRpb24oJy0tcG9ydCwgLXAnLCBgUG9ydCB0byBydW4gdGhlIGxvY2FsIHNlcnZlci4gIChkZWZhdWx0IDQwMDApYClcbiAgLmRlc2NyaWJlKCdTZXJ2ZSBidWlsdCBmaWxlcywgbGFtYmRhcywgYW5kIHN0YXRpYyBhc3NldHMuJylcbiAgLmV4YW1wbGUoYHNlcnZlYClcbiAgLmV4YW1wbGUoYHNlcnZlIC1vIC4vb3V0IC1wIDgwODBgKVxuICAuZXhhbXBsZShgc2VydmUgLWMgJHtkZWZhdWx0Q29uZmlnRmlsZXBhdGh9YClcbiAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgIHByb2Nlc3MuZW52LlBSRVNUQV9FTlYgPSBFbnYuREVWRUxPUE1FTlRcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfREVCVUcgPSBvcHRpb25zLmRlYnVnID8gJ2RlYnVnJyA6ICcnXG4gICAgY29uc29sZS5jbGVhcigpXG4gICAgcmVnaXN0ZXJSdW50aW1lKClcbiAgICBzZXJ2ZUNvbW1hbmQob3B0aW9ucylcbiAgfSlcblxucHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpXG4iLCAiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBjaG9raWRhciBmcm9tICdjaG9raWRhcidcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgT3B0aW9ucywgY3JlYXRlLCBnZXRDb25maWdGaWxlLCBkZWZhdWx0Q29uZmlnRmlsZXBhdGgsIGdldEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi93YXRjaCdcbmltcG9ydCB7IGluaXRQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW5zJ1xuaW1wb3J0IHsgY3JlYXRlRW1pdHRlciwgY3JlYXRlSG9va3MgfSBmcm9tICcuL2NyZWF0ZUVtaXR0ZXInXG5pbXBvcnQgeyBidWlsZCB9IGZyb20gJy4vYnVpbGQnXG5pbXBvcnQgeyBzZXJ2ZSB9IGZyb20gJy4vc2VydmUnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcblxuZXhwb3J0IHR5cGUgUHJlc3RhQ0xJT3B0aW9ucyA9IHtcbiAgY29uZmlnPzogc3RyaW5nXG4gIG91dHB1dD86IHN0cmluZ1xuICBkZWJ1Zz86IGJvb2xlYW5cbn0gJiBQYXJ0aWFsPE9wdGlvbnM+XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSUJ1aWxkT3B0aW9ucyA9IFByZXN0YUNMSU9wdGlvbnMgJiB7XG4gIF86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSVNlcnZlT3B0aW9ucyA9IFByZXN0YUNMSUJ1aWxkT3B0aW9ucyAmIHtcbiAgcG9ydD86IHN0cmluZ1xuICAnbm8tc2VydmUnOiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSURldk9wdGlvbnMgPSBQcmVzdGFDTElTZXJ2ZU9wdGlvbnNcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29tbWFuZChvcHRpb25zOiBQcmVzdGFDTElCdWlsZE9wdGlvbnMpIHtcbiAgY29uc3QgY29uZmlnRmlsZSA9IGdldENvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWcsIHRydWUpXG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRBdmFpbGFibGVQb3J0KG9wdGlvbnMucG9ydCB8fCBjb25maWdGaWxlLnBvcnQgfHwgNDAwMClcblxuICBjb25zdCBlbWl0dGVyID0gY3JlYXRlRW1pdHRlcigpXG4gIGNvbnN0IGhvb2tzID0gY3JlYXRlSG9va3MoZW1pdHRlcilcbiAgY29uc3QgY29uZmlnID0gY3JlYXRlKEVudi5QUk9EVUNUSU9OLCB7IC4uLm9wdGlvbnMsIHBvcnQgfSwgY29uZmlnRmlsZSlcbiAgYXdhaXQgaW5pdFBsdWdpbnMoY29uZmlnLnBsdWdpbnMsIGNvbmZpZywgaG9va3MpXG5cbiAgbG9nZ2VyLmluZm8oe1xuICAgIGxhYmVsOiAnYnVpbGQnLFxuICB9KVxuXG4gIGF3YWl0IGJ1aWxkKGNvbmZpZywgaG9va3MpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXZDb21tYW5kKG9wdGlvbnM6IFByZXN0YUNMSURldk9wdGlvbnMpIHtcbiAgY29uc3Qgbm9TZXJ2ZSA9IG9wdGlvbnNbJ25vLXNlcnZlJ11cbiAgbGV0IGRldlNlcnZlcjogYW55XG4gIGxldCBwb3J0OiBudW1iZXJcbiAgbGV0IHJlc3RhcnRpbmcgPSBmYWxzZVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKCkge1xuICAgIGxldCB3YXRjaFRhc2s6IGFueVxuICAgIGxldCBodHRwU2VydmVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXJ2ZT5cbiAgICBsZXQgc3RhdGljQXNzZXRXYXRjaGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBjaG9raWRhci53YXRjaD5cblxuICAgIGNvbnN0IHVzZXJDb25maWdGaWxlID0gZ2V0Q29uZmlnRmlsZShvcHRpb25zLmNvbmZpZylcblxuICAgIGlmICghcG9ydCB8fCAodXNlckNvbmZpZ0ZpbGUucG9ydCAmJiBwb3J0ICE9PSB1c2VyQ29uZmlnRmlsZS5wb3J0KSkge1xuICAgICAgcG9ydCA9IGF3YWl0IGdldEF2YWlsYWJsZVBvcnQob3B0aW9ucy5wb3J0IHx8IHVzZXJDb25maWdGaWxlLnBvcnQgfHwgNDAwMClcbiAgICAgIHByb2Nlc3MuZW52LlBSRVNUQV9TRVJWRV9VUkwgPSBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YFxuICAgIH1cblxuICAgIGNvbnN0IGVtaXR0ZXIgPSBjcmVhdGVFbWl0dGVyKClcbiAgICBjb25zdCBob29rcyA9IGNyZWF0ZUhvb2tzKGVtaXR0ZXIpXG4gICAgY29uc3QgY29uZmlnID0gY3JlYXRlKEVudi5ERVZFTE9QTUVOVCwgeyAuLi5vcHRpb25zLCBwb3J0IH0sIHVzZXJDb25maWdGaWxlKVxuICAgIGNvbnN0IHBsdWdpbnMgPSBhd2FpdCBpbml0UGx1Z2lucyhjb25maWcucGx1Z2lucywgY29uZmlnLCBob29rcylcblxuICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2U6IGBjb25maWcgY3JlYXRlZCAke0pTT04uc3RyaW5naWZ5KGNvbmZpZyl9YCxcbiAgICB9KVxuXG4gICAgaWYgKCFub1NlcnZlKSB7XG4gICAgICBodHRwU2VydmVyID0gc2VydmUoY29uZmlnLCBob29rcylcblxuICAgICAgc3RhdGljQXNzZXRXYXRjaGVyID0gY2hva2lkYXIud2F0Y2goY29uZmlnLmFzc2V0cywgeyBpZ25vcmVJbml0aWFsOiB0cnVlIH0pLm9uKCdhbGwnLCAoKSA9PiB7XG4gICAgICAgIGhvb2tzLmVtaXRCcm93c2VyUmVmcmVzaCgpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgIGxhYmVsOiByZXN0YXJ0aW5nID8gJ3Jlc3RhcnQnIDogJ3N0YXJ0JyxcbiAgICAgIG1lc3NhZ2U6ICFub1NlcnZlID8gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtjb25maWcucG9ydH1gIDogJycsXG4gICAgfSlcblxuICAgIHdhdGNoVGFzayA9IGF3YWl0IHdhdGNoKGNvbmZpZywgaG9va3MpXG5cbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlnLFxuICAgICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICAgIGVtaXR0ZXIuY2xlYXIoKVxuICAgICAgICBhd2FpdCBwbHVnaW5zLmNsZWFudXAoKVxuICAgICAgICBhd2FpdCBzdGF0aWNBc3NldFdhdGNoZXIuY2xvc2UoKVxuICAgICAgICBhd2FpdCB3YXRjaFRhc2suY2xvc2UoKVxuXG4gICAgICAgIGlmIChodHRwU2VydmVyKSB7XG4gICAgICAgICAgYXdhaXQgaHR0cFNlcnZlci5jbG9zZSgpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlnV2F0Y2hlciA9IGNob2tpZGFyXG4gICAgLndhdGNoKHBhdGgucmVzb2x2ZShvcHRpb25zLmNvbmZpZyB8fCBkZWZhdWx0Q29uZmlnRmlsZXBhdGgpLCB7IGlnbm9yZUluaXRpYWw6IHRydWUgfSlcbiAgICAub24oJ2FsbCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChyZXN0YXJ0aW5nKSByZXR1cm5cblxuICAgICAgcmVzdGFydGluZyA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGV2U2VydmVyLmNsb3NlKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmNsZWFyKClcblxuICAgICAgZGV2U2VydmVyID0gYXdhaXQgc3RhcnREZXZTZXJ2ZXIoKVxuXG4gICAgICByZXN0YXJ0aW5nID0gZmFsc2VcbiAgICB9KVxuXG4gIGRldlNlcnZlciA9IGF3YWl0IHN0YXJ0RGV2U2VydmVyKClcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgYXdhaXQgY29uZmlnV2F0Y2hlci5jbG9zZSgpXG4gICAgICBhd2FpdCBkZXZTZXJ2ZXIuY2xvc2UoKVxuICAgIH0sXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlcnZlQ29tbWFuZChvcHRpb25zOiBQcmVzdGFDTElTZXJ2ZU9wdGlvbnMpIHtcbiAgY29uc3QgY29uZmlnRmlsZSA9IGdldENvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWcsIHRydWUpXG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRBdmFpbGFibGVQb3J0KG9wdGlvbnMucG9ydCB8fCBjb25maWdGaWxlLnBvcnQgfHwgNDAwMClcblxuICBjb25zdCBlbWl0dGVyID0gY3JlYXRlRW1pdHRlcigpXG4gIGNvbnN0IGhvb2tzID0gY3JlYXRlSG9va3MoZW1pdHRlcilcbiAgY29uc3QgY29uZmlnID0gY3JlYXRlKEVudi5QUk9EVUNUSU9OLCB7IC4uLm9wdGlvbnMsIHBvcnQgfSwgY29uZmlnRmlsZSlcbiAgYXdhaXQgaW5pdFBsdWdpbnMoY29uZmlnLnBsdWdpbnMsIGNvbmZpZywgaG9va3MpXG5cbiAgc2VydmUoY29uZmlnLCBob29rcylcblxuICBsb2dnZXIuaW5mbyh7XG4gICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgbWVzc2FnZTogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtjb25maWcucG9ydH1gLFxuICB9KVxufVxuIiwgImltcG9ydCBjLCB7IEtsZXVyIH0gZnJvbSAna2xldXInXG5cbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5leHBvcnQgZW51bSBMZXZlbHMge1xuICBEZWJ1ZyA9ICdkZWJ1ZycsXG4gIEluZm8gPSAnaW5mbycsXG4gIFdhcm4gPSAnd2FybicsXG4gIEVyciA9ICdlcnJvcicsXG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2UgPSB7XG4gIGxldmVsPzogTGV2ZWxzXG4gIGxhYmVsOiBzdHJpbmcgfCBudW1iZXJcbiAgbWVzc2FnZT86IHN0cmluZ1xuICBkdXJhdGlvbj86IHN0cmluZyB8IG51bWJlclxuICBlcnJvcj86IEVycm9yXG59XG5cbmxldCBsb2dzOiBhbnlbXSA9IFtdXG5cbmNvbnN0IGNvbG9ycyA9IHtcbiAgW0xldmVscy5EZWJ1Z106ICdtYWdlbnRhJyxcbiAgW0xldmVscy5JbmZvXTogJ2JsdWUnLFxuICBbTGV2ZWxzLldhcm5dOiAneWVsbG93JyxcbiAgW0xldmVscy5FcnJdOiAncmVkJyxcbn1cblxuZXhwb3J0IHsgYyBhcyBjb2xvcnMgfVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9ncygpIHtcbiAgaWYgKCFwcm9jZXNzLmVudi5URVNUSU5HKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBtZXRob2Qgd2FzIGNhbGxlZCBvdXRzaWRlIHRlc3QgbW9kZScpXG4gIH1cblxuICByZXR1cm4gbG9nc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9nZ2VyKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgaWYgKHByb2Nlc3MuZW52LlRFU1RJTkcpIHtcbiAgICBsb2dzLnB1c2gobWVzc2FnZSlcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWJ1ZyA9IHByb2Nlc3MuZW52LlBSRVNUQV9ERUJVR1xuICAgIGNvbnN0IGNvbnRleHQgPSBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID09PSBFbnYuUFJPRFVDVElPTiA/ICdwcm9kJyA6ICdkZXYnXG5cbiAgICBpZiAoIWRlYnVnICYmIG1lc3NhZ2UubGV2ZWwgPT09IExldmVscy5EZWJ1ZykgcmV0dXJuXG5cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFtcbiAgICAgICAgYy5ncmF5KGNvbnRleHQpLFxuICAgICAgICBjW2NvbG9yc1ttZXNzYWdlLmxldmVsIHx8ICdpbmZvJ10gYXMga2V5b2YgS2xldXJdKG1lc3NhZ2UubGFiZWwpLFxuICAgICAgICBtZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgIG1lc3NhZ2UuZHVyYXRpb24gPyBjLmdyYXkoJysnICsgbWVzc2FnZS5kdXJhdGlvbikgOiAnJyxcbiAgICAgICAgbWVzc2FnZS5lcnJvciA/IGBcXG5cXG4ke21lc3NhZ2UuZXJyb3Iuc3RhY2sgfHwgbWVzc2FnZS5lcnJvcn1cXG5cXG5gIDogJycsXG4gICAgICBdXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmpvaW4oJyAnKVxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVidWcobWVzc2FnZTogTWVzc2FnZSkge1xuICBsb2dnZXIoeyBsZXZlbDogTGV2ZWxzLkRlYnVnLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZvKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgbG9nZ2VyKHsgbGV2ZWw6IExldmVscy5JbmZvLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3YXJuKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgbG9nZ2VyKHsgbGV2ZWw6IExldmVscy5XYXJuLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcihtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGxvZ2dlcih7IGxldmVsOiBMZXZlbHMuRXJyLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYXcoLi4uYXJnczogYW55W10pIHtcbiAgaWYgKHByb2Nlc3MuZW52LlRFU1RJTkcpIHtcbiAgICBsb2dzLnB1c2goYXJncylcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyguLi5hcmdzKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdsaW5lKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuVEVTVElORykgcmV0dXJuXG4gIGNvbnNvbGUubG9nKCcnKVxufVxuIiwgImV4cG9ydCBjb25zdCBFbnYgPSB7XG4gIFBST0RVQ1RJT046ICdwcm9kdWN0aW9uJyxcbiAgREVWRUxPUE1FTlQ6ICdkZXZlbG9wbWVudCcsXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBnZXRQb3J0IGZyb20gJ2dldC1wb3J0J1xuXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBQcmVzdGFDTElEZXZPcHRpb25zLCBQcmVzdGFDTElCdWlsZE9wdGlvbnMgfSBmcm9tICcuL2NsaSdcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJy4vcGx1Z2lucydcblxuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtcbiAgZmlsZXM6IHN0cmluZ1tdXG4gIG91dHB1dDogc3RyaW5nXG4gIGFzc2V0czogc3RyaW5nXG4gIHBsdWdpbnM6IFBsdWdpbltdXG4gIHBvcnQ6IG51bWJlclxuICBfX3Vuc2FmZV9idW5kbGVfZXZlcnl0aGluZzogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBDb25maWcgPSBPcHRpb25zICYge1xuICBlbnY6IHN0cmluZ1xuICBzdGF0aWNPdXRwdXREaXI6IHN0cmluZ1xuICBmdW5jdGlvbnNPdXRwdXREaXI6IHN0cmluZ1xuICBtYW5pZmVzdEZpbGVwYXRoOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb25maWdGaWxlcGF0aCA9ICdwcmVzdGEuY29uZmlnLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlUG9ydChwcmVmZXJyZWQ6IHN0cmluZykge1xuICByZXR1cm4gZ2V0UG9ydCh7IHBvcnQ6IHBhcnNlSW50KHByZWZlcnJlZCwgMTApIH0pXG59XG5cbi8qKlxuICogRmV0Y2ggYSBjb25maWcgZmlsZS4gSWYgb25lIHdhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIGxldCB0aGVtIGtub3cgaWZcbiAqIGFueXRoaW5nIGdvZXMgd3JvbmcuIE91dHNpZGUgd2F0Y2ggbW9kZSwgdGhpcyBzaG91bGQgZXhpdCgxKSBpZiB0aGUgdXNlclxuICogcHJvdmlkZWQgYSBjb25maWcgYW5kIHRoZXJlIHdhcyBhbiBlcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnRmlsZShmaWxlcGF0aD86IHN0cmluZywgc2hvdWxkRXhpdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIGNvbnN0IGZwID0gcGF0aC5yZXNvbHZlKGZpbGVwYXRoIHx8IGRlZmF1bHRDb25maWdGaWxlcGF0aClcblxuICB0cnkge1xuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW2ZwXVxuICAgIHJldHVybiByZXF1aXJlKGZwKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhmcClcblxuICAgIC8vIGNvbmZpZyBmaWxlIGV4aXN0cywgc2hvdWxkIGxvZyBlcnJvciwgb3RoZXJ3aXNlIGlnbm9yZSBtaXNzaW5nIGZpbGVcbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgZXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICB9KVxuXG4gICAgICAvLyB3ZSdyZSBub3QgaW4gd2F0Y2ggbW9kZSwgZXhpdCBidWlsZFxuICAgICAgaWYgKHNob3VsZEV4aXQpIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIHJldHVybiB7fVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoXG4gIGVudjogc3RyaW5nLFxuICBjbGk6IFByZXN0YUNMSUJ1aWxkT3B0aW9ucyB8IFByZXN0YUNMSURldk9wdGlvbnMsXG4gIGZpbGU6IFBhcnRpYWw8T3B0aW9ucz4sXG4gIGN3ZCA9IHByb2Nlc3MuY3dkKClcbik6IENvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICBlbnYsXG4gICAgb3V0cHV0OiAnYnVpbGQnLFxuICAgIGFzc2V0czogJ3B1YmxpYycsXG4gICAgcGx1Z2luczogW10sXG4gICAgcG9ydDogNDAwMCxcbiAgICBmaWxlczogW10sIC8vIFRPRE8gd2hlcmUgZG8gd2UgdmFsaWRhdGVcbiAgICAuLi5maWxlLFxuICB9XG5cbiAgLy8gb3ZlcnJpZGUgd2l0aCBDTElcbiAgaWYgKGNsaS5fLmxlbmd0aCkgY29uZmlnLmZpbGVzID0gY2xpLl9cbiAgaWYgKGNsaS5vdXRwdXQpIGNvbmZpZy5vdXRwdXQgPSBjbGkub3V0cHV0XG4gIGlmIChjbGkuYXNzZXRzKSBjb25maWcuYXNzZXRzID0gY2xpLmFzc2V0c1xuICBpZiAoY2xpLnBvcnQpIGNvbmZpZy5wb3J0ID0gY2xpLnBvcnRcblxuICAvLyByZXNvbHZlIGFic29sdXRlIHBhdGhzXG4gIGlmIChjb25maWcuZmlsZXMpIGNvbmZpZy5maWxlcyA9IChbXSBhcyBzdHJpbmdbXSkuY29uY2F0KGNvbmZpZy5maWxlcykubWFwKChwKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBwKSlcbiAgaWYgKGNvbmZpZy5vdXRwdXQpIGNvbmZpZy5vdXRwdXQgPSBwYXRoLnJlc29sdmUoY3dkLCBjb25maWcub3V0cHV0KVxuICBpZiAoY29uZmlnLmFzc2V0cykgY29uZmlnLmFzc2V0cyA9IHBhdGgucmVzb2x2ZShjd2QsIGNvbmZpZy5hc3NldHMpXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb25maWcsXG4gICAgc3RhdGljT3V0cHV0RGlyOiBwYXRoLmpvaW4oY29uZmlnLm91dHB1dCwgJ3N0YXRpYycpLFxuICAgIGZ1bmN0aW9uc091dHB1dERpcjogcGF0aC5qb2luKGNvbmZpZy5vdXRwdXQsICdmdW5jdGlvbnMnKSxcbiAgICBtYW5pZmVzdEZpbGVwYXRoOiBwYXRoLmpvaW4oY29uZmlnLm91dHB1dCwgJ21hbmlmZXN0Lmpzb24nKSxcbiAgICBfX3Vuc2FmZV9idW5kbGVfZXZlcnl0aGluZzogY29uZmlnLl9fdW5zYWZlX2J1bmRsZV9ldmVyeXRoaW5nIHx8IGZhbHNlLFxuICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3dhdGNoLWRlcGVuZGVuY3ktZ3JhcGgnXG5pbXBvcnQgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInXG5pbXBvcnQgbWF0Y2ggZnJvbSAncGljb21hdGNoJ1xuaW1wb3J0IHsgdGltZXIgfSBmcm9tICdAcHJlc3RhL3V0aWxzJ1xuXG5pbXBvcnQgeyBvdXRwdXRMYW1iZGFzIH0gZnJvbSAnLi9vdXRwdXRMYW1iZGFzJ1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgZ2V0RmlsZXMsIGlzU3RhdGljLCBpc0R5bmFtaWMgfSBmcm9tICcuL2dldEZpbGVzJ1xuaW1wb3J0IHsgYnVpbGRTdGF0aWNGaWxlcywgcmVtb3ZlQnVpbHRTdGF0aWNGaWxlLCBTdGF0aWNGaWxlc01hcCB9IGZyb20gJy4vYnVpbGRTdGF0aWNGaWxlcydcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgSG9va3MgfSBmcm9tICcuL2NyZWF0ZUVtaXR0ZXInXG5pbXBvcnQgeyBzdGF0aWNGaWxlc01hcFRvTWFuaWZlc3RGaWxlcywgd3JpdGVNYW5pZmVzdCB9IGZyb20gJy4vbWFuaWZlc3QnXG5cbi8qXG4gKiBXcmFwcyBvdXRwdXRMYW1iZGFzIGZvciBsb2dnaW5nXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUxhbWJkYXMoaW5wdXRzOiBzdHJpbmdbXSwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3QgdGltZSA9IHRpbWVyKClcblxuICAvLyBhbHdheXMgd3JpdGUgdGhpcywgZXZlbiBpZiBpbnB1dHMgPSBbXVxuICBjb25zdCBsYW1iZGFzID0gb3V0cHV0TGFtYmRhcyhpbnB1dHMsIGNvbmZpZylcblxuICAvLyBpZiB1c2VyIGFjdHVhbGx5IGhhcyByb3V0ZXMgY29uZmlndXJlZCwgZ2l2ZSBmZWVkYmFja1xuICBpZiAoaW5wdXRzLmxlbmd0aCkge1xuICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgIGxhYmVsOiAnYnVpbHQnLFxuICAgICAgbWVzc2FnZTogYGxhbWJkYXNgLFxuICAgICAgZHVyYXRpb246IHRpbWUoKSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGxhbWJkYXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmV3VmFsaWRGaWxlKGZpbGU6IHN0cmluZywgZ2xvYnM6IHN0cmluZ1tdLCBleGlzdGluZzogc3RyaW5nW10pIHtcbiAgcmV0dXJuIG1hdGNoKGdsb2JzKShmaWxlKSAmJiAhZXhpc3RpbmcuaW5jbHVkZXMoZmlsZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhdGNoKGNvbmZpZzogQ29uZmlnLCBob29rczogSG9va3MpIHtcbiAgbGV0IHN0YXRpY0ZpbGVzTWFwOiBTdGF0aWNGaWxlc01hcCA9IHt9XG4gIGNvbnN0IGFsbEZpbGVzID0gZ2V0RmlsZXMoY29uZmlnLmZpbGVzKVxuXG4gIGlmICghYWxsRmlsZXMubGVuZ3RoKSB7XG4gICAgbG9nZ2VyLndhcm4oe1xuICAgICAgbGFiZWw6ICdwYXRocycsXG4gICAgICBtZXNzYWdlOiAnbm8gZmlsZXMgY29uZmlndXJlZCcsXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkRmlsZXMoZmlsZXM6IHN0cmluZ1tdLCBleGlzdGluZzogc3RyaW5nW10sIGNvbmZpZzogQ29uZmlnKSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtmaWxlXVxuICAgIH1cblxuICAgIGNvbnN0IGJ1aWx0U3RhdGljRmlsZXMgPSBhd2FpdCBidWlsZFN0YXRpY0ZpbGVzKGZpbGVzLmZpbHRlcihpc1N0YXRpYyksIGNvbmZpZywgc3RhdGljRmlsZXNNYXApXG4gICAgY29uc3QgYnVpbHRMYW1iZGFzID0gdXBkYXRlTGFtYmRhcyhleGlzdGluZy5maWx0ZXIoaXNEeW5hbWljKSwgY29uZmlnKVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHN0YXRpYyBmaWxlc1xuICAgIHN0YXRpY0ZpbGVzTWFwID0gT2JqZWN0LmFzc2lnbihzdGF0aWNGaWxlc01hcCwgYnVpbHRTdGF0aWNGaWxlcy5zdGF0aWNGaWxlc01hcClcblxuICAgIHdyaXRlTWFuaWZlc3QoXG4gICAgICB7XG4gICAgICAgIGZpbGVzOiBbLi4uc3RhdGljRmlsZXNNYXBUb01hbmlmZXN0RmlsZXMoc3RhdGljRmlsZXNNYXApLCAuLi5idWlsdExhbWJkYXNdLFxuICAgICAgfSxcbiAgICAgIGNvbmZpZ1xuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRhbnQ6IGlmIHdlIGV2ZXIgcmVtb3ZlIGluaXRpYWwgcmVuZGVyaW5nLCB3ZSB3aWxsIG5lZWQgdG9cbiAgICogcmUtaW50cm9kdWNlIFwiZmlsZSBwcmltaW5nXCIgd2hlcmUgd2UgcmVxdWlyZSBhbGwgZmlsZXMgYW5kIHN1cmZhY2UgZXJyb3JzXG4gICAqIG9uIHN0YXJ0dXAuXG4gICAqL1xuICBhd2FpdCBidWlsZEZpbGVzKGFsbEZpbGVzLCBhbGxGaWxlcywgY29uZmlnKVxuICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuXG4gIC8qXG4gICAqIEZpbGV3YXRjaGVyIHdhdGNoZXMgb25seSBwcmVzdGEgZmlsZXMuIEl0IGhhbmRsZXMgY2hhbmdlIGFuZCByZW1vdmVcbiAgICogZXZlbnRzLCBhcyB3ZWxsIGFzIHN1cmZhY2VzIGRlcGVuZGVuY3kgdHJlZSB0cmF2ZXJzYWwgZXJyb3JzXG4gICAqL1xuICBjb25zdCBmaWxlV2F0Y2hlciA9IGNyZWF0ZSh7IGFsaWFzOiB7ICdAJzogcHJvY2Vzcy5jd2QoKSB9IH0pXG5cbiAgZmlsZVdhdGNoZXIub25DaGFuZ2UoYXN5bmMgKGNoYW5nZWQpID0+IHtcbiAgICBhd2FpdCBidWlsZEZpbGVzKGNoYW5nZWQsIGFsbEZpbGVzLCBjb25maWcpXG4gICAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfSlcblxuICBmaWxlV2F0Y2hlci5vblJlbW92ZShhc3luYyAoW2lkXSkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1Zyh7IGxhYmVsOiAnd2F0Y2gnLCBtZXNzYWdlOiBgcmVtb3ZlZCAke2lkfWAgfSlcblxuICAgIC8vIHJlbW92ZSBmcm9tIGxvY2FsIGhhc2hcbiAgICBhbGxGaWxlcy5zcGxpY2UoYWxsRmlsZXMuaW5kZXhPZihpZCksIDEpXG5cbiAgICAvLyB1cGRhdGUgdGhpcyByZWdhcmRsZXNzLCBub3Qgc3VyZSBpZiBbaWRdIHdhcyBkeW5hbWljIG9yIHN0YXRpY1xuICAgIHVwZGF0ZUxhbWJkYXMoYWxsRmlsZXMuZmlsdGVyKGlzRHluYW1pYyksIGNvbmZpZylcbiAgICA7KHN0YXRpY0ZpbGVzTWFwW2lkXSB8fCBbXSkuZm9yRWFjaCgoZmlsZSkgPT4gcmVtb3ZlQnVpbHRTdGF0aWNGaWxlKHBhdGguam9pbihjb25maWcuc3RhdGljT3V0cHV0RGlyLCBmaWxlKSkpXG5cbiAgICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICB9KVxuXG4gIGZpbGVXYXRjaGVyLm9uRXJyb3IoKGUpID0+IHtcbiAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICBlcnJvcjogdHlwZW9mIGUgPT09ICdzdHJpbmcnID8gbmV3IEVycm9yKGUpIDogZSxcbiAgICB9KVxuICB9KVxuXG4gIGF3YWl0IGZpbGVXYXRjaGVyLmFkZChhbGxGaWxlcylcblxuICAvKlxuICAgKiBnbG9iYWxXYXRjaGVyIHdhdGNoZXMgdGhlIHJhdyBmaWxlIGdsb2JzIHBhc3NlZCB0byB0aGUgQ0xJIG9yIGFzIGBmaWxlc2BcbiAgICogaW4gdGhlIGNvbmZpZy4gSWYgY2hlY2tzIG9uIGFkZC9jaGFuZ2UgdG8gc2VlIGlmIGEgZmlsZSBzaG91bGQgYmUgdXBncmFkZWRcbiAgICogdG8gYSBhIFByZXN0YSBzb3VyY2UgZmlsZSwgYW5kIGFkZGVkIHRvIHRoZSBmaWxlV2F0Y2hlci5cbiAgICovXG4gIGNvbnN0IGdsb2JhbFdhdGNoZXIgPSBjaG9raWRhci53YXRjaChwcm9jZXNzLmN3ZCgpLCB7XG4gICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICBpZ25vcmVkOiBbY29uZmlnLm91dHB1dCwgY29uZmlnLmFzc2V0c10sXG4gIH0pXG5cbiAgZ2xvYmFsV2F0Y2hlci5vbignYWRkJywgYXN5bmMgKGZpbGUpID0+IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZSkgfHwgZnMubHN0YXRTeW5jKGZpbGUpLmlzRGlyZWN0b3J5KCkpIHJldHVyblxuICAgIGlmICghaXNOZXdWYWxpZEZpbGUoZmlsZSwgY29uZmlnLmZpbGVzLCBhbGxGaWxlcykpIHJldHVyblxuXG4gICAgbG9nZ2VyLmRlYnVnKHsgbGFiZWw6ICd3YXRjaCcsIG1lc3NhZ2U6IGBhZGQgJHtmaWxlfWAgfSlcblxuICAgIGFsbEZpbGVzLnB1c2goZmlsZSlcbiAgICBhd2FpdCBmaWxlV2F0Y2hlci5hZGQoZmlsZSlcblxuICAgIGF3YWl0IGJ1aWxkRmlsZXMoW2ZpbGVdLCBhbGxGaWxlcywgY29uZmlnKVxuXG4gICAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfSlcblxuICAvKipcbiAgICogTGlzdGVucyBmb3IgZXZlbnRzIGZyb20gcGx1Z2lucyByZXF1ZXN0aW5nIGEgZmlsZSB0byBiZSBidWlsdFxuICAgKi9cbiAgaG9va3Mub25CdWlsZEZpbGUoYXN5bmMgKHsgZmlsZSB9KSA9PiB7XG4gICAgYXdhaXQgYnVpbGRGaWxlcyhbZmlsZV0sIGFsbEZpbGVzLCBjb25maWcpXG4gICAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgYXdhaXQgZmlsZVdhdGNoZXIuY2xvc2UoKVxuICAgICAgYXdhaXQgZ2xvYmFsV2F0Y2hlci5jbG9zZSgpXG4gICAgfSxcbiAgfVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgcnNvcnQgZnJvbSAncm91dGUtc29ydCdcbmltcG9ydCB7IGhhc2hDb250ZW50IH0gZnJvbSAnQHByZXN0YS91dGlscydcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcbmltcG9ydCB7IE1hbmlmZXN0RHluYW1pY0ZpbGUgfSBmcm9tICcuL21hbmlmZXN0J1xuXG5leHBvcnQgZnVuY3Rpb24gc2x1Z2lmeShmaWxlbmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBmaWxlbmFtZVxuICAgIC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSAvLyAvcGFnZXMvRmlsZS5wYWdlLmpzXG4gICAgLnNwbGl0KCcuJykgLy8gZXh0ZW5zaW9uLCBbL3BhZ2VzL0ZpbGUsIHBhZ2UsIGpzXVxuICAgIC5yZXZlcnNlKClcbiAgICAuc2xpY2UoMSlcbiAgICAucmV2ZXJzZSgpXG4gICAgLmpvaW4oJy0nKSAvLyAvcGFnZXMvRmlsZS5wYWdlXG4gICAgLnNwbGl0KCcvJylcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmpvaW4oJy0nKSAvLyBwYWdlcy1GaWxlLXBhZ2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG91dHB1dExhbWJkYXMoaW5wdXRzOiBzdHJpbmdbXSwgY29uZmlnOiBDb25maWcsIHNob3VsZFRocm93ID0gZmFsc2UpIHtcbiAgY29uc3QgbGFtYmRhcyA9IGlucHV0c1xuICAgIC5tYXAoKGlucHV0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHJvdXRlIH0gPSByZXF1aXJlKGlucHV0KVxuICAgICAgICBjb25zdCBuYW1lID0gc2x1Z2lmeShpbnB1dClcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gcGF0aC5qb2luKFxuICAgICAgICAgIGNvbmZpZy5mdW5jdGlvbnNPdXRwdXREaXIsXG4gICAgICAgICAgY29uZmlnLmVudiA9PT0gRW52LlBST0RVQ1RJT05cbiAgICAgICAgICAgID8gbmFtZSArICctJyArIGhhc2hDb250ZW50KGZzLnJlYWRGaWxlU3luYyhpbnB1dCwgJ3V0ZjgnKSkgKyAnLmpzJ1xuICAgICAgICAgICAgOiBuYW1lICsgJy5qcydcbiAgICAgICAgKVxuXG4gICAgICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICAgICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRpbmcgJHtuYW1lfSBsYW1iZGFgLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIGltcG9ydGFudCBmb3Igd2F0Y2ggdGFza1xuICAgICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtpbnB1dF1cbiAgICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbb3V0cHV0XVxuXG4gICAgICAgIGZzLm91dHB1dEZpbGVTeW5jKFxuICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICBgaW1wb3J0IHsgd3JhcEhhbmRsZXIgfSBmcm9tICdwcmVzdGEvZGlzdC93cmFwSGFuZGxlcic7XG4gICAgICBpbXBvcnQgKiBhcyBmaWxlIGZyb20gJyR7aW5wdXR9JztcbiAgICAgIGV4cG9ydCBjb25zdCByb3V0ZSA9IGZpbGUucm91dGVcbiAgICAgIGV4cG9ydCBjb25zdCBoYW5kbGVyID0gd3JhcEhhbmRsZXIoZmlsZSlgXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdkeW5hbWljJyxcbiAgICAgICAgICBzcmM6IGlucHV0LFxuICAgICAgICAgIGRlc3Q6IG91dHB1dCxcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoc2hvdWxkVGhyb3cpIHRocm93IGVcblxuICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKSBhcyBNYW5pZmVzdER5bmFtaWNGaWxlW11cblxuICBjb25zdCBzb3J0ZWRSb3V0ZXMgPSByc29ydChsYW1iZGFzLm1hcCgobCkgPT4gbC5yb3V0ZSkpXG4gIGNvbnN0IHNvcnRlZEZpbGVzOiBNYW5pZmVzdER5bmFtaWNGaWxlW10gPSBbXVxuXG4gIGZvciAoY29uc3Qgcm91dGUgb2Ygc29ydGVkUm91dGVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsYW1iZGFzLmZpbmQoKGwpID0+IGwucm91dGUgPT09IHJvdXRlKVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBzb3J0ZWRGaWxlcy5wdXNoKG1hdGNoKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzb3J0ZWRGaWxlc1xufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZ2xvYlN5bmMgZnJvbSAndGlueS1nbG9iL3N5bmMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0R5bmFtaWMoZmlsZTogc3RyaW5nKSB7XG4gIHJldHVybiAvZXhwb3J0XFxzLitcXHNyb3V0ZVxccytcXD0vLnRlc3QoZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdGF0aWMoZmlsZTogc3RyaW5nKSB7XG4gIHJldHVybiAvZXhwb3J0XFxzLitcXHNnZXRTdGF0aWNQYXRocy8udGVzdChmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlcyhmaWxlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoW10gYXMgc3RyaW5nW10pXG4gICAgLmNvbmNhdChmaWxlcylcbiAgICAubWFwKChmaWxlKSA9PiBnbG9iU3luYyhmaWxlKSlcbiAgICAuZmxhdCgpXG4gICAgLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGZpbGUpKSAvLyBtYWtlIGFic29sdXRlXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXG5pbXBvcnQgeyB0aW1lciwgcGFyc2VQYXRoUGFyYW1ldGVycyB9IGZyb20gJ0BwcmVzdGEvdXRpbHMnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IG5vcm1hbGl6ZVJlc3BvbnNlIH0gZnJvbSAnLi9ub3JtYWxpemVSZXNwb25zZSdcbmltcG9ydCB7IGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQgfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZydcblxuZXhwb3J0IHR5cGUgU3RhdGljRmlsZXNNYXAgPSB7IFtmaWxlbmFtZTogc3RyaW5nXTogc3RyaW5nW10gfVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aG5hbWVUb0ZpbGUocGF0aG5hbWU6IHN0cmluZywgZXh0ID0gJ2h0bWwnKSB7XG4gIHJldHVybiAhIXBhdGguZXh0bmFtZShwYXRobmFtZSlcbiAgICA/IHBhdGhuYW1lIC8vIGlmIHBhdGggaGFzIGV4dGVuc2lvbiwgdXNlIGl0XG4gICAgOiBleHQgPT09ICdodG1sJ1xuICAgID8gYCR7cGF0aG5hbWV9L2luZGV4Lmh0bWxgIC8vIGlmIEhUTUwgaXMgaW5mZXJyZWQsIGNyZWF0ZSBpbmRleFxuICAgIDogYCR7cGF0aG5hbWV9LiR7ZXh0fWAgLy8gYW55dGhpbmcgYnV0IEhUTUwgd2lsbCBuZWVkIGFuIGV4dGVuc2lvbiwgb3RoZXJ3aXNlIGJyb3dzZXJzIHdpbGwgcmVuZGVyIGFzIHRleHRcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUJ1aWx0U3RhdGljRmlsZShmaWxlOiBzdHJpbmcpIHtcbiAgbG9nZ2VyLmRlYnVnKHtcbiAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICBtZXNzYWdlOiBgcmVtb3Zpbmcgb2xkIHN0YXRpYyBmaWxlICR7ZmlsZX1gLFxuICB9KVxuXG4gIHJldHVybiBmcy5yZW1vdmUoZmlsZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUJ1aWx0U3RhdGljRmlsZXMoZmlsZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChmaWxlcy5tYXAocmVtb3ZlQnVpbHRTdGF0aWNGaWxlKSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkU3RhdGljRmlsZShmaWxlOiBzdHJpbmcsIG91dHB1dDogc3RyaW5nLCB7IGZvb3RlciB9OiB7IGZvb3Rlcjogc3RyaW5nIH0pIHtcbiAgY29uc3QgbGFtYmRhID0gcmVxdWlyZShmaWxlKVxuICBjb25zdCBwYXRocyA9IGF3YWl0IGxhbWJkYS5nZXRTdGF0aWNQYXRocygpXG5cbiAgY29uc3QgYnVpbHRGaWxlczogc3RyaW5nW10gPSBbXVxuXG4gIGlmICghcGF0aHMgfHwgIXBhdGhzLmxlbmd0aCkgcmV0dXJuIGJ1aWx0RmlsZXNcblxuICBmb3IgKGNvbnN0IHVybCBvZiBwYXRocykge1xuICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIHBhdGg6IHVybCxcbiAgICAgIHBhdGhQYXJhbWV0ZXJzOiBsYW1iZGEucm91dGUgPyBwYXJzZVBhdGhQYXJhbWV0ZXJzKHVybCwgbGFtYmRhLnJvdXRlKSA6IHt9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gbm9ybWFsaXplUmVzcG9uc2UoYXdhaXQgbGFtYmRhLmhhbmRsZXIoZXZlbnQsIHt9KSlcbiAgICBjb25zdCB0eXBlID0gKHJlc3BvbnNlPy5oZWFkZXJzIHx8IHt9KVsnY29udGVudC10eXBlJ11cbiAgICBjb25zdCBleHQgPSBtaW1lLmV4dGVuc2lvbih0eXBlIGFzIHN0cmluZykgfHwgJ2h0bWwnXG4gICAgY29uc3QgZmlsZW5hbWUgPSBwYXRobmFtZVRvRmlsZSh1cmwsIGV4dClcbiAgICBjb25zdCBodG1sID0gcmVzcG9uc2UuYm9keSArIChleHQgPT09ICdodG1sJyA/IGZvb3RlciA6ICcnKVxuICAgIGNvbnN0IG91dGZpbGUgPSBwYXRoLmpvaW4ob3V0cHV0LCBmaWxlbmFtZSlcblxuICAgIGZzLm91dHB1dEZpbGVTeW5jKG91dGZpbGUsIGh0bWwsICd1dGYtOCcpXG5cbiAgICBsb2dnZXIuaW5mbyh7XG4gICAgICBsYWJlbDogJ2J1aWx0JyxcbiAgICAgIG1lc3NhZ2U6IHVybCxcbiAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgfSlcblxuICAgIGJ1aWx0RmlsZXMucHVzaChvdXRmaWxlKVxuICB9XG5cbiAgcmV0dXJuIGJ1aWx0RmlsZXNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkU3RhdGljRmlsZXMoZmlsZXM6IHN0cmluZ1tdLCBjb25maWc6IENvbmZpZywgc3RhdGljRmlsZXNNYXA6IFN0YXRpY0ZpbGVzTWFwID0ge30pIHtcbiAgY29uc3QgaXNEZXYgPSBjb25maWcuZW52ID09PSBFbnYuREVWRUxPUE1FTlRcbiAgY29uc3Qgb3V0cHV0ID0gY29uZmlnLnN0YXRpY091dHB1dERpclxuICBjb25zdCBmb290ZXIgPSBpc0RldiA/IGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQoeyBwb3J0OiBjb25maWcucG9ydCB9KSA6ICcnXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gZmlsZS5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKVxuICAgICAgY29uc3QgcHJldkJ1aWx0RmlsZXMgPSBzdGF0aWNGaWxlc01hcFtmaWxlXSB8fCBbXVxuICAgICAgY29uc3QgYnVpbHRGaWxlcyA9IGF3YWl0IGJ1aWxkU3RhdGljRmlsZShmaWxlLCBvdXRwdXQsIHsgZm9vdGVyIH0pXG5cbiAgICAgIGlmICghYnVpbHRGaWxlcyB8fCAhYnVpbHRGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oe1xuICAgICAgICAgIGxhYmVsOiAncGF0aHMnLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke2ZpbGVuYW1lfSAtIG5vIHBhdGhzIHRvIHJlbmRlcmAsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVtb3ZlQnVpbHRTdGF0aWNGaWxlcyhwcmV2QnVpbHRGaWxlcylcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBkaWZmIGFuZCByZW1vdmUgZmlsZXNcbiAgICAgIGZvciAoY29uc3QgcHJldiBvZiBwcmV2QnVpbHRGaWxlcykge1xuICAgICAgICBpZiAoIWJ1aWx0RmlsZXMuaW5jbHVkZXMocHJldikpIHtcbiAgICAgICAgICByZW1vdmVCdWlsdFN0YXRpY0ZpbGUocHJldilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdGF0aWNGaWxlc01hcFtmaWxlXSA9IGJ1aWx0RmlsZXNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoeyBsYWJlbDogJ2Vycm9yJywgZXJyb3I6IGUgYXMgRXJyb3IgfSlcblxuICAgICAgLy8gZXhpdCBsb29wIG9uIGFueSBlcnJvclxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXRpY0ZpbGVzTWFwLFxuICB9XG59XG4iLCAiLyoqXG4gKiBUSElTIElTIFBST0QgQ09ERSwgQkUgQ0FSRUZVTCBXSEFUIFlPVSBBREQgVE8gVEhJUyBGSUxFXG4gKi9cblxuaW1wb3J0IHsgUmVzcG9uc2UgYXMgTGFtYmRhUmVzcG9uc2UgfSBmcm9tICdsYW1iZGEtdHlwZXMnXG5pbXBvcnQgeyBSZXNwb25zZSwgSGVhZGVycyB9IGZyb20gJy4vbGFtYmRhJ1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqOiBvYmplY3QgfCBzdHJpbmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkob2JqKSA6IG9ialxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVIZWFkZXJzKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZDogSGVhZGVycyA9IHt9XG5cbiAgZm9yIChjb25zdCBoZWFkZXIgb2YgT2JqZWN0LmtleXMoaGVhZGVycykpIHtcbiAgICBjb25zdCBrZXkgPSBoZWFkZXIudG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgbm9ybWFsaXplZFtrZXldID0gdmFsdWUgfHwgJydcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZXNwb25zZShyZXNwb25zZTogUGFydGlhbDxSZXNwb25zZT4gfCBzdHJpbmcpOiBMYW1iZGFSZXNwb25zZSB7XG4gIGNvbnN0IHtcbiAgICBpc0Jhc2U2NEVuY29kZWQgPSBmYWxzZSxcbiAgICBzdGF0dXNDb2RlID0gMjAwLFxuICAgIGhlYWRlcnMgPSB7fSxcbiAgICBtdWx0aVZhbHVlSGVhZGVycyA9IHt9LFxuICAgIGJvZHkgPSAnJyxcbiAgICBodG1sID0gdW5kZWZpbmVkLFxuICAgIGpzb24gPSB1bmRlZmluZWQsXG4gICAgeG1sID0gdW5kZWZpbmVkLFxuICB9ID0gdHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJ1xuICAgID8ge1xuICAgICAgICBib2R5OiByZXNwb25zZSxcbiAgICAgIH1cbiAgICA6IHJlc3BvbnNlXG4gIGNvbnN0IHJlZGlyID0gc3RhdHVzQ29kZSA+IDI5OSAmJiBzdGF0dXNDb2RlIDwgMzk5XG5cbiAgbGV0IGNvbnRlbnRUeXBlID0gJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCdcblxuICBpZiAoISFqc29uKSB7XG4gICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCdcbiAgfSBlbHNlIGlmICghIXhtbCkge1xuICAgIGNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL3htbDsgY2hhcnNldD11dGYtOCdcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRJbmNvbWluZ0hlYWRlcnMgPSBub3JtYWxpemVIZWFkZXJzKGhlYWRlcnMgYXMgSGVhZGVycylcbiAgY29uc3Qgbm9ybWFsaXplZEhlYWRlcnM6IExhbWJkYVJlc3BvbnNlWydoZWFkZXJzJ10gPSB7fVxuXG4gIGlmICghcmVkaXIpIHtcbiAgICBub3JtYWxpemVkSGVhZGVyc1snY29udGVudC10eXBlJ10gPSBjb250ZW50VHlwZVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpc0Jhc2U2NEVuY29kZWQsXG4gICAgc3RhdHVzQ29kZSxcbiAgICBoZWFkZXJzOiBPYmplY3QuYXNzaWduKHt9LCBub3JtYWxpemVkSGVhZGVycywgbm9ybWFsaXplZEluY29taW5nSGVhZGVycyksXG4gICAgbXVsdGlWYWx1ZUhlYWRlcnMsXG4gICAgYm9keTogc3RyaW5naWZ5KGJvZHkgfHwgaHRtbCB8fCBqc29uIHx8IHhtbCB8fCAnJyksXG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCh7IHBvcnQgfTogeyBwb3J0OiBudW1iZXIgfSkge1xuICByZXR1cm4gYFxuICAgIDxzY3JpcHQ+XG4gICAgICAoZnVuY3Rpb24gKGdsb2JhbCkge1xuICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFdlYlNvY2tldCgnd3M6Ly9sb2NhbGhvc3Q6JHtwb3J0fScpO1xuXG4gICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1twcmVzdGFdIGNvbm5lY3RlZCBvbiBwb3J0ICR7cG9ydH0nKVxuICAgICAgICB9KTtcblxuICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxcYCdbcHJlc3RhXSByZWNlaXZlZCBcXCRcXHtldmVudC5kYXRhXFx9XFxgKVxuICAgICAgICAgIGlmIChldmVudC5kYXRhID09PSAncmVmcmVzaCcpIHtcbiAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW3ByZXN0YV0gZGlzY29ubmVjdGVkJylcbiAgICAgICAgfSk7XG4gICAgICB9KSh0aGlzKTtcbiAgICA8L3NjcmlwdD5cbiAgYFxufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcblxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyBTdGF0aWNGaWxlc01hcCB9IGZyb20gJy4vYnVpbGRTdGF0aWNGaWxlcydcblxuZXhwb3J0IHR5cGUgTWFuaWZlc3REeW5hbWljRmlsZSA9IHtcbiAgdHlwZTogJ2R5bmFtaWMnXG4gIHNyYzogc3RyaW5nXG4gIGRlc3Q6IHN0cmluZ1xuICByb3V0ZTogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIE1hbmlmZXN0U3RhdGljRmlsZSA9IHtcbiAgdHlwZTogJ3N0YXRpYydcbiAgc3JjOiBzdHJpbmdcbiAgZGVzdDogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIE1hbmlmZXN0RmlsZSA9IE1hbmlmZXN0RHluYW1pY0ZpbGUgfCBNYW5pZmVzdFN0YXRpY0ZpbGVcblxuZXhwb3J0IHR5cGUgTWFuaWZlc3QgPSB7XG4gIGZpbGVzOiBNYW5pZmVzdEZpbGVbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RhdGljRmlsZXNNYXBUb01hbmlmZXN0RmlsZXMoc3RhdGljRmlsZXNNYXA6IFN0YXRpY0ZpbGVzTWFwKTogTWFuaWZlc3RTdGF0aWNGaWxlW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoc3RhdGljRmlsZXNNYXApXG4gICAgLm1hcCgoc3JjKSA9PiB7XG4gICAgICByZXR1cm4gc3RhdGljRmlsZXNNYXBbc3JjXS5tYXAoKGRlc3QpID0+ICh7XG4gICAgICAgIHR5cGU6ICdzdGF0aWMnLFxuICAgICAgICBzcmMsXG4gICAgICAgIGRlc3QsXG4gICAgICB9KSkgYXMgTWFuaWZlc3RTdGF0aWNGaWxlW11cbiAgICB9KVxuICAgIC5mbGF0KClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldER5bmFtaWNGaWxlc0Zyb21NYW5pZmVzdChtYW5pZmVzdDogTWFuaWZlc3QpOiBNYW5pZmVzdER5bmFtaWNGaWxlW10ge1xuICByZXR1cm4gbWFuaWZlc3QuZmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnR5cGUgPT09ICdkeW5hbWljJykgYXMgTWFuaWZlc3REeW5hbWljRmlsZVtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0aWNGaWxlc0Zyb21NYW5pZmVzdChtYW5pZmVzdDogTWFuaWZlc3QpOiBNYW5pZmVzdFN0YXRpY0ZpbGVbXSB7XG4gIHJldHVybiBtYW5pZmVzdC5maWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUudHlwZSA9PT0gJ3N0YXRpYycpIGFzIE1hbmlmZXN0U3RhdGljRmlsZVtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZU1hbmlmZXN0KG1hbmlmZXN0OiBNYW5pZmVzdCwgY29uZmlnOiBDb25maWcpOiB2b2lkIHtcbiAgZnMub3V0cHV0RmlsZVN5bmMoY29uZmlnLm1hbmlmZXN0RmlsZXBhdGgsIEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAnICAnKSwgJ3V0ZjgnKVxufVxuIiwgImltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IEhvb2tzIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5cbmV4cG9ydCB0eXBlIFBsdWdpbkludGVyZmFjZSA9IHtcbiAgY2xlYW51cD8oKTogdm9pZFxufVxuZXhwb3J0IHR5cGUgUGx1Z2luID0gKGNvbmZpZzogQ29uZmlnLCBob29rczogSG9va3MpID0+IFByb21pc2U8UGx1Z2luSW50ZXJmYWNlIHwgdm9pZD4gfCBQbHVnaW5JbnRlcmZhY2UgfCB2b2lkXG5leHBvcnQgdHlwZSBQbHVnaW5Jbml0ID0gKC4uLnByb3BzOiBhbnkpID0+IFBsdWdpblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGx1Z2luKGluaXQ6IFBsdWdpbkluaXQpIHtcbiAgcmV0dXJuIGluaXRcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRQbHVnaW5zKHBsdWdpbnM6IFBsdWdpbltdLCBpbnN0YW5jZTogQ29uZmlnLCBob29rczogSG9va3MpIHtcbiAgY29uc3QgaW5zdGFudGlhdGVkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcGx1Z2luc1xuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBwKGluc3RhbmNlLCBob29rcylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFBsdWdpbkludGVyZmFjZVtdXG4gIClcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNsZWFudXAoKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaW5zdGFudGlhdGVkLm1hcCgocCkgPT4gcCAmJiBwLmNsZWFudXAgJiYgcC5jbGVhbnVwKCkpKVxuICAgIH0sXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBNYW5pZmVzdCB9IGZyb20gJy4vbWFuaWZlc3QnXG5cbmV4cG9ydCBlbnVtIEV2ZW50cyB7XG4gIFBvc3RCdWlsZCA9ICdwb3N0LWJ1aWxkJyxcbiAgQnVpbGRGaWxlID0gJ2J1aWxkLWZpbGUnLFxuICBCcm93c2VyUmVmcmVzaCA9ICdicm93c2VyLXJlZnJlc2gnLFxufVxuXG5leHBvcnQgdHlwZSBDYWxsYWJsZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBIb29rUG9zdEJ1aWxkUGF5bG9hZCA9IHtcbiAgb3V0cHV0OiBzdHJpbmdcbiAgc3RhdGljT3V0cHV0OiBzdHJpbmdcbiAgZnVuY3Rpb25zT3V0cHV0OiBzdHJpbmdcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0XG59XG5cbmV4cG9ydCB0eXBlIEhvb2tCdWlsZEZpbGVQYXlsb2FkID0ge1xuICBmaWxlOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgRGVzdHJveUhvb2tDYWxsYmFjayA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgSG9va3MgPSB7XG4gIGVtaXRQb3N0QnVpbGQocHJvcHM6IEhvb2tQb3N0QnVpbGRQYXlsb2FkKTogdm9pZFxuICBvblBvc3RCdWlsZChjYjogKHByb3BzOiBIb29rUG9zdEJ1aWxkUGF5bG9hZCkgPT4gdm9pZCk6IERlc3Ryb3lIb29rQ2FsbGJhY2tcbiAgZW1pdEJ1aWxkRmlsZShwcm9wczogSG9va0J1aWxkRmlsZVBheWxvYWQpOiB2b2lkXG4gIG9uQnVpbGRGaWxlKGNiOiAocHJvcHM6IEhvb2tCdWlsZEZpbGVQYXlsb2FkKSA9PiB2b2lkKTogRGVzdHJveUhvb2tDYWxsYmFja1xuICBlbWl0QnJvd3NlclJlZnJlc2goKTogdm9pZFxuICBvbkJyb3dzZXJSZWZyZXNoKGNiOiAoKSA9PiB2b2lkKTogRGVzdHJveUhvb2tDYWxsYmFja1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgbGV0IGV2ZW50czogeyBbZXZlbnQ6IHN0cmluZ106IENhbGxhYmxlW10gfSA9IHt9XG5cbiAgZnVuY3Rpb24gZW1pdChldjogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGV2ZW50c1tldl0gPyBldmVudHNbZXZdLm1hcCgoZm46IENhbGxhYmxlKSA9PiBmbiguLi5hcmdzKSkgOiBbXVxuICB9XG5cbiAgZnVuY3Rpb24gb24oZXY6IHN0cmluZywgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGV2ZW50c1tldl0gPSBldmVudHNbZXZdID8gZXZlbnRzW2V2XS5jb25jYXQoZm4pIDogW2ZuXVxuICAgIHJldHVybiAoKSA9PiBldmVudHNbZXZdLnNwbGljZShldmVudHNbZXZdLmluZGV4T2YoZm4pLCAxKVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZXZlbnRzID0ge31cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbmVycyhldjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGV2ZW50c1tldl0gfHwgW11cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW1pdCxcbiAgICBvbixcbiAgICBjbGVhcixcbiAgICBsaXN0ZW5lcnMsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2tzKGVtaXR0ZXI6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUVtaXR0ZXI+KTogSG9va3Mge1xuICByZXR1cm4ge1xuICAgIGVtaXRQb3N0QnVpbGQocHJvcHMpIHtcbiAgICAgIGVtaXR0ZXIuZW1pdCgncG9zdEJ1aWxkJywgcHJvcHMpXG4gICAgfSxcbiAgICBvblBvc3RCdWlsZChjYikge1xuICAgICAgcmV0dXJuIGVtaXR0ZXIub24oJ3Bvc3RCdWlsZCcsIGNiKVxuICAgIH0sXG4gICAgZW1pdEJ1aWxkRmlsZShwcm9wcykge1xuICAgICAgZW1pdHRlci5lbWl0KCdidWlsZEZpbGUnLCBwcm9wcylcbiAgICB9LFxuICAgIG9uQnVpbGRGaWxlKGNiKSB7XG4gICAgICByZXR1cm4gZW1pdHRlci5vbignYnVpbGRGaWxlJywgY2IpXG4gICAgfSxcbiAgICBlbWl0QnJvd3NlclJlZnJlc2goKSB7XG4gICAgICBlbWl0dGVyLmVtaXQoJ2Jyb3dzZXJSZWZyZXNoJylcbiAgICB9LFxuICAgIG9uQnJvd3NlclJlZnJlc2goY2IpIHtcbiAgICAgIHJldHVybiBlbWl0dGVyLm9uKCdicm93c2VyUmVmcmVzaCcsIGNiKVxuICAgIH0sXG4gIH1cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHsgYnVpbGQgYXMgZXNidWlsZCB9IGZyb20gJ2VzYnVpbGQnXG5pbXBvcnQgeyByZXF1aXJlU2FmZSwgdGltZXIgfSBmcm9tICdAcHJlc3RhL3V0aWxzJ1xuXG5pbXBvcnQgeyBvdXRwdXRMYW1iZGFzIH0gZnJvbSAnLi9vdXRwdXRMYW1iZGFzJ1xuaW1wb3J0IHsgZ2V0RmlsZXMsIGlzU3RhdGljLCBpc0R5bmFtaWMgfSBmcm9tICcuL2dldEZpbGVzJ1xuaW1wb3J0IHsgYnVpbGRTdGF0aWNGaWxlcyB9IGZyb20gJy4vYnVpbGRTdGF0aWNGaWxlcydcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgSG9va3MgfSBmcm9tICcuL2NyZWF0ZUVtaXR0ZXInXG5pbXBvcnQgeyBNYW5pZmVzdFN0YXRpY0ZpbGUsIE1hbmlmZXN0RHluYW1pY0ZpbGUsIHN0YXRpY0ZpbGVzTWFwVG9NYW5pZmVzdEZpbGVzLCB3cml0ZU1hbmlmZXN0IH0gZnJvbSAnLi9tYW5pZmVzdCdcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGNvbmZpZzogQ29uZmlnLCBob29rczogSG9va3MpIHtcbiAgY29uc3QgdG90YWxUaW1lID0gdGltZXIoKVxuICBjb25zdCBmaWxlcyA9IGdldEZpbGVzKGNvbmZpZy5maWxlcylcbiAgY29uc3Qgc3RhdGljSWRzID0gZmlsZXMuZmlsdGVyKGlzU3RhdGljKVxuICBjb25zdCBkeW5hbWljSWRzID0gZmlsZXMuZmlsdGVyKGlzRHluYW1pYylcblxuICBsb2dnZXIuZGVidWcoe1xuICAgIGxhYmVsOiAnYnVpbGQnLFxuICAgIG1lc3NhZ2U6ICdzdGFydGluZyBidWlsZCcsXG4gIH0pXG5cbiAgaWYgKCFzdGF0aWNJZHMubGVuZ3RoICYmICFkeW5hbWljSWRzLmxlbmd0aCkge1xuICAgIGxvZ2dlci53YXJuKHtcbiAgICAgIGxhYmVsOiAnZmlsZXMnLFxuICAgICAgbWVzc2FnZTogJ25vIGZpbGVzIHdlcmUgZm91bmQsIG5vdGhpbmcgdG8gYnVpbGQnLFxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgbGV0IHN0YXRpY1RpbWUgPSAnJ1xuICAgIGxldCBzdGF0aWNGaWxlQW1vdW50ID0gMFxuICAgIGxldCBkeW5hbWljVGltZSA9ICcnXG4gICAgbGV0IGNvcHlUaW1lID0gJydcbiAgICBsZXQgbWFuaWZlc3RTdGF0aWNGaWxlczogTWFuaWZlc3RTdGF0aWNGaWxlW10gPSBbXVxuICAgIGxldCBtYW5pZmVzdER5bmFtaWNGaWxlczogTWFuaWZlc3REeW5hbWljRmlsZVtdID0gW11cblxuICAgIGNvbnN0IHRhc2tzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChzdGF0aWNJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgdGltZSA9IHRpbWVyKClcblxuICAgICAgICAgIGNvbnN0IHsgc3RhdGljRmlsZXNNYXAgfSA9IGF3YWl0IGJ1aWxkU3RhdGljRmlsZXMoc3RhdGljSWRzLCBjb25maWcpXG4gICAgICAgICAgbWFuaWZlc3RTdGF0aWNGaWxlcyA9IHN0YXRpY0ZpbGVzTWFwVG9NYW5pZmVzdEZpbGVzKHN0YXRpY0ZpbGVzTWFwKVxuXG4gICAgICAgICAgc3RhdGljVGltZSA9IHRpbWUoKVxuICAgICAgICAgIHN0YXRpY0ZpbGVBbW91bnQgPSBPYmplY3Qua2V5cyhzdGF0aWNGaWxlc01hcCkucmVkdWNlKChjb3VudCwga2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKGNvdW50ICs9IHN0YXRpY0ZpbGVzTWFwW2tleV0ubGVuZ3RoKVxuICAgICAgICAgIH0sIDApXG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoZHluYW1pY0lkcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuICAgICAgICAgIGNvbnN0IHBrZyA9IHJlcXVpcmVTYWZlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAncGFja2FnZS5qc29uJykpXG5cbiAgICAgICAgICBtYW5pZmVzdER5bmFtaWNGaWxlcyA9IG91dHB1dExhbWJkYXMoZHluYW1pY0lkcywgY29uZmlnLCB0cnVlKVxuXG4gICAgICAgICAgYXdhaXQgZXNidWlsZCh7XG4gICAgICAgICAgICBlbnRyeVBvaW50czogbWFuaWZlc3REeW5hbWljRmlsZXMubWFwKChmKSA9PiBmLmRlc3QpLFxuICAgICAgICAgICAgb3V0ZGlyOiBjb25maWcuZnVuY3Rpb25zT3V0cHV0RGlyLFxuICAgICAgICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgICAgICAgIHRhcmdldDogWydub2RlMTInXSxcbiAgICAgICAgICAgIG1pbmlmeTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93T3ZlcndyaXRlOiB0cnVlLFxuICAgICAgICAgICAgZXh0ZXJuYWw6IGNvbmZpZy5fX3Vuc2FmZV9idW5kbGVfZXZlcnl0aGluZyA/IFtdIDogT2JqZWN0LmtleXMocGtnLmRlcGVuZGVuY2llcyB8fCB7fSksXG4gICAgICAgICAgICBidW5kbGU6IHRydWUsXG4gICAgICAgICAgICBkZWZpbmU6IHtcbiAgICAgICAgICAgICAgJ3Byb2Nlc3MuZW52LlBSRVNUQV9TRVJWRVJMRVNTX1JVTlRJTUUnOiAndHJ1ZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBkeW5hbWljVGltZSA9IHRpbWUoKVxuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnLmFzc2V0cykpIHtcbiAgICAgICAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuXG4gICAgICAgICAgZnMuY29weVN5bmMoY29uZmlnLmFzc2V0cywgY29uZmlnLnN0YXRpY091dHB1dERpcilcblxuICAgICAgICAgIGNvcHlUaW1lID0gdGltZSgpXG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgXSlcblxuICAgIC8vIHNpbmNlIHdlJ3JlIGJ1aWxkaW5nIChub3Qgd2F0Y2gpIGlmIGFueSB0YXNrIGZhaWxzLCBleGl0IHdpdGggZXJyb3JcbiAgICBpZiAodGFza3MuZmluZCgodGFzaykgPT4gdGFzay5zdGF0dXMgPT09ICdyZWplY3RlZCcpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgICBsYWJlbDogJ2J1aWxkJyxcbiAgICAgICAgbWVzc2FnZTogJ2J1aWxkIHBhcnRpYWxseSBmYWlsZWQnLFxuICAgICAgfSlcblxuICAgICAgLy8gbG9nIG91dCBlcnJvcnNcbiAgICAgIHRhc2tzLmZvckVhY2goKHRhc2spID0+IHtcbiAgICAgICAgaWYgKHRhc2suc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgLy8gVE9ETyBjYW4gc3dhbGxvdyBlcnJvcnMgaW4gdGVzdGluZ1xuICAgICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiB0YXNrLnJlYXNvbixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByZXN0YSBidWlsZCBmYWlsZWQnKVxuICAgIH1cblxuICAgIGNvbnN0IG1hbmlmZXN0ID0ge1xuICAgICAgZmlsZXM6IFsuLi5tYW5pZmVzdFN0YXRpY0ZpbGVzLCAuLi5tYW5pZmVzdER5bmFtaWNGaWxlc10sXG4gICAgfVxuXG4gICAgd3JpdGVNYW5pZmVzdChtYW5pZmVzdCwgY29uZmlnKVxuXG4gICAgaG9va3MuZW1pdFBvc3RCdWlsZCh7XG4gICAgICBvdXRwdXQ6IGNvbmZpZy5vdXRwdXQsXG4gICAgICBzdGF0aWNPdXRwdXQ6IGNvbmZpZy5zdGF0aWNPdXRwdXREaXIsXG4gICAgICBmdW5jdGlvbnNPdXRwdXQ6IGNvbmZpZy5mdW5jdGlvbnNPdXRwdXREaXIsXG4gICAgICBtYW5pZmVzdCxcbiAgICB9KVxuXG4gICAgaWYgKHN0YXRpY1RpbWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdzdGF0aWMnLFxuICAgICAgICBtZXNzYWdlOiBgcmVuZGVyZWQgJHtzdGF0aWNGaWxlQW1vdW50fSBmaWxlKHMpYCxcbiAgICAgICAgZHVyYXRpb246IHN0YXRpY1RpbWUsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChkeW5hbWljVGltZSkge1xuICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICBsYWJlbDogJ2xhbWJkYScsXG4gICAgICAgIG1lc3NhZ2U6IGBjb21waWxlZCAke2R5bmFtaWNJZHMubGVuZ3RofSBmdW5jdGlvbihzKWAsXG4gICAgICAgIGR1cmF0aW9uOiBkeW5hbWljVGltZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGNvcHlUaW1lKSB7XG4gICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgIGxhYmVsOiAnYXNzZXRzJyxcbiAgICAgICAgbWVzc2FnZTogYGNvcGllZGAsXG4gICAgICAgIGR1cmF0aW9uOiBjb3B5VGltZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHN0YXRpY1RpbWUgfHwgZHluYW1pY1RpbWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdidWlsZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBjb21wbGV0ZWAsXG4gICAgICAgIGR1cmF0aW9uOiB0b3RhbFRpbWUoKSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnbmV0J1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCdcbmltcG9ydCBzaXJ2IGZyb20gJ3NpcnYnXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xuaW1wb3J0IHRvUmVnRXhwIGZyb20gJ3JlZ2V4cGFyYW0nXG5pbXBvcnQgc3RhdHVzIGZyb20gJ3N0YXR1c2VzJ1xuaW1wb3J0IHsgV2ViU29ja2V0U2VydmVyIH0gZnJvbSAnd3MnXG5pbXBvcnQgeyB0aW1lciwgcmVxdWVzdFRvRXZlbnQsIHJlcXVpcmVGcmVzaCwgc2VuZFNlcnZlcmxlc3NSZXNwb25zZSwgY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZSB9IGZyb20gJ0BwcmVzdGEvdXRpbHMnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQgfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgSGFuZGxlciwgRXZlbnQsIFJlc3BvbnNlLCBDb250ZXh0IH0gZnJvbSAnLi9sYW1iZGEnXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IEhvb2tzIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuaW1wb3J0IHsgbm9ybWFsaXplUmVzcG9uc2UgfSBmcm9tICcuL25vcm1hbGl6ZVJlc3BvbnNlJ1xuaW1wb3J0IHsgZ2V0RHluYW1pY0ZpbGVzRnJvbU1hbmlmZXN0LCBNYW5pZmVzdCB9IGZyb20gJy4vbWFuaWZlc3QnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBzdGF0dXNDb2RlPzogbnVtYmVyXG4gIG1lc3NhZ2U6IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSHR0cEVycm9yKHN0YXR1c0NvZGU6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nKTogSHR0cEVycm9yIHtcbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSlcbiAgLy8gQHRzLWlnbm9yZVxuICBlcnJvci5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICByZXR1cm4gZXJyb3Jcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1pbWVUeXBlKHJlc3BvbnNlOiBSZXNwb25zZSkge1xuICBjb25zdCB0eXBlID0gKHJlc3BvbnNlPy5oZWFkZXJzIHx8IHt9KVsnY29udGVudC10eXBlJ11cbiAgcmV0dXJuIG1pbWUuZXh0ZW5zaW9uKHR5cGUgYXMgc3RyaW5nKSB8fCAnaHRtbCdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRMYW1iZGFGcm9tTWFuaWZlc3QodXJsOiBzdHJpbmcsIG1hbmlmZXN0OiBNYW5pZmVzdCk6IHsgaGFuZGxlcjogSGFuZGxlciB9IHtcbiAgY29uc3QgZHluYW1pY0ZpbGVzID0gZ2V0RHluYW1pY0ZpbGVzRnJvbU1hbmlmZXN0KG1hbmlmZXN0KVxuICBjb25zdCBsYW1iZGEgPSBkeW5hbWljRmlsZXNcbiAgICAubWFwKChmaWxlKSA9PiAoe1xuICAgICAgbWF0Y2hlcjogdG9SZWdFeHAoZmlsZS5yb3V0ZSksXG4gICAgICBmaWxlLFxuICAgIH0pKVxuICAgIC5maWx0ZXIoKHsgbWF0Y2hlciB9KSA9PiB7XG4gICAgICByZXR1cm4gbWF0Y2hlci5wYXR0ZXJuLnRlc3QodXJsLnNwbGl0KCc/JylbMF0pXG4gICAgfSlcbiAgICAubWFwKCh7IGZpbGUgfSkgPT4gZmlsZSlbMF1cblxuICByZXR1cm4gbGFtYmRhID8gcmVxdWlyZShsYW1iZGEuZGVzdCkgOiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NIYW5kbGVyKGV2ZW50OiBFdmVudCwgbGFtYmRhOiB7IGhhbmRsZXI6IEhhbmRsZXIgfSkge1xuICBjb25zdCBhY2NlcHQgPSBldmVudC5oZWFkZXJzLkFjY2VwdCB8fCBldmVudC5oZWFkZXJzLmFjY2VwdFxuICBjb25zdCBhY2NlcHRzSnNvbiA9IGFjY2VwdCAmJiBhY2NlcHQuaW5jbHVkZXMoJ2pzb24nKVxuXG4gIC8qXG4gICAqIE5vIGFzc2V0IGZpbGUsIG5vIHN0YXRpYyBmaWxlLCB0cnkgZHluYW1pY1xuICAgKi9cbiAgdHJ5IHtcbiAgICBpZiAoIWxhbWJkYSB8fCAhbGFtYmRhLmhhbmRsZXIpIHtcbiAgICAgIHRocm93IGNyZWF0ZUh0dHBFcnJvcig0MDQsICcnKVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVSZXNwb25zZShhd2FpdCBsYW1iZGEuaGFuZGxlcihldmVudCwgeyBhd3NSZXF1ZXN0SWQ6ICdwcmVzdGEgZGV2JyB9IGFzIENvbnRleHQpKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgZXJyb3IgPSBlIGFzIEh0dHBFcnJvclxuICAgIGNvbnN0IHsgc3RhdHVzQ29kZSA9IDUwMCB9ID0gZXJyb3JcblxuICAgIGlmIChzdGF0dXNDb2RlID4gNDk5KVxuICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgc3RhdHVzLm1lc3NhZ2Vbc3RhdHVzQ29kZV0sXG4gICAgICAgIGVycm9yLFxuICAgICAgfSlcblxuICAgIHJldHVybiBub3JtYWxpemVSZXNwb25zZSh7XG4gICAgICBzdGF0dXNDb2RlOiBzdGF0dXNDb2RlLFxuICAgICAgaHRtbDogYWNjZXB0c0pzb24gPyB1bmRlZmluZWQgOiBjcmVhdGVEZWZhdWx0SHRtbFJlc3BvbnNlKHsgc3RhdHVzQ29kZSB9KSxcbiAgICAgIGpzb246IGFjY2VwdHNKc29uID8geyBkZXRhaWw6IHN0YXR1cy5tZXNzYWdlW3N0YXR1c0NvZGVdIH0gOiB1bmRlZmluZWQsXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdEhhbmRsZXIoeyBwb3J0LCBjb25maWcgfTogeyBwb3J0OiBudW1iZXI7IGNvbmZpZzogQ29uZmlnIH0pIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RIYW5kbGVyKHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSkge1xuICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG4gICAgY29uc3QgZXZlbnQgPSBhd2FpdCByZXF1ZXN0VG9FdmVudChyZXEpIC8vIHN0b2NrIEFXUyBFdmVudCBzaGFwZVxuICAgIGNvbnN0IG1hbmlmZXN0ID0gcmVxdWlyZUZyZXNoKGNvbmZpZy5tYW5pZmVzdEZpbGVwYXRoKSBhcyBNYW5pZmVzdFxuICAgIGNvbnN0IGxhbWJkYSA9IGxvYWRMYW1iZGFGcm9tTWFuaWZlc3QoZXZlbnQucGF0aCwgbWFuaWZlc3QpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwcm9jZXNzSGFuZGxlcihldmVudCwgbGFtYmRhKVxuICAgIGNvbnN0IHJlZGlyID0gcmVzcG9uc2Uuc3RhdHVzQ29kZSA+IDI5OSAmJiByZXNwb25zZS5zdGF0dXNDb2RlIDwgMzk5XG4gICAgY29uc3QgbWltZSA9IHJlZGlyID8gdW5kZWZpbmVkIDogZ2V0TWltZVR5cGUocmVzcG9uc2UpXG5cbiAgICBpZiAobWltZSA9PT0gJ2h0bWwnKSB7XG4gICAgICByZXNwb25zZS5ib2R5ID0gKHJlc3BvbnNlLmJvZHkgfHwgJycpLnNwbGl0KCc8L2JvZHk+JylbMF0gKyBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0KHsgcG9ydCB9KVxuICAgIH1cblxuICAgIHNlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UocmVzLCByZXNwb25zZSlcblxuICAgIGxvZ2dlcltyZXNwb25zZS5zdGF0dXNDb2RlIDwgMjk5ID8gJ2luZm8nIDogJ2Vycm9yJ10oe1xuICAgICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgICBtZXNzYWdlOiBgJHtyZXNwb25zZS5zdGF0dXNDb2RlfSAke3JlZGlyID8gcmVzcG9uc2U/LmhlYWRlcnM/LkxvY2F0aW9uIHx8IGV2ZW50LnBhdGggOiBldmVudC5wYXRofWAsXG4gICAgICBkdXJhdGlvbjogdGltZSgpLFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZlckhhbmRsZXIoeyBwb3J0LCBjb25maWcgfTogeyBwb3J0OiBudW1iZXI7IGNvbmZpZzogQ29uZmlnIH0pIHtcbiAgY29uc3Qgc3RhdGljRGlyID0gY29uZmlnLnN0YXRpY091dHB1dERpclxuICBjb25zdCBhc3NldERpciA9IGNvbmZpZy5hc3NldHNcblxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gc2VydmVIYW5kbGVyKHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSkge1xuICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG4gICAgY29uc3QgdXJsID0gcmVxLnVybCBhcyBzdHJpbmdcblxuICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2U6IGBoYW5kbGluZyAke3VybH1gLFxuICAgIH0pXG5cbiAgICAvLyBob29rIGludG8gc2lydiBmb3IgbG9nZ2luZyBvbmx5XG4gICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgZnVuY3Rpb24gc2V0SGVhZGVycyhyZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIHBhdGhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgICAgIG1lc3NhZ2U6IGAke3Jlcy5zdGF0dXNDb2RlfSAke3BhdGhuYW1lfWAsXG4gICAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgICB9KVxuICAgIH1cbiAgICAvKiBjOCBpZ25vcmUgZW5kICovXG5cbiAgICAvKiBjOCBpZ25vcmUgbmV4dCAyICovXG4gICAgc2lydihhc3NldERpciwgeyBkZXY6IHRydWUsIHNldEhlYWRlcnMgfSkocmVxLCByZXMsICgpID0+IHtcbiAgICAgIHNpcnYoc3RhdGljRGlyLCB7IGRldjogdHJ1ZSwgc2V0SGVhZGVycyB9KShyZXEsIHJlcywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7IHBvcnQsIGNvbmZpZyB9KShyZXEsIHJlcylcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VydmUoY29uZmlnOiBDb25maWcsIGhvb2tzOiBIb29rcykge1xuICBjb25zdCBwb3J0ID0gY29uZmlnLnBvcnRcbiAgY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoY3JlYXRlU2VydmVySGFuZGxlcih7IHBvcnQsIGNvbmZpZyB9KSkubGlzdGVuKHBvcnQpXG4gIGNvbnN0IHdlYnNvY2tldCA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoeyBzZXJ2ZXIgfSlcbiAgY29uc3Qgc29ja2V0czogU29ja2V0W10gPSBbXVxuXG4gIHNlcnZlci5vbignY29ubmVjdGlvbicsIChzb2NrZXQpID0+IHtcbiAgICBzb2NrZXRzLnB1c2goc29ja2V0KVxuICAgIHNvY2tldC5vbignY2xvc2UnLCAoKSA9PiBzb2NrZXRzLnNwbGljZShzb2NrZXRzLmluZGV4T2Yoc29ja2V0KSwgMSkpXG4gIH0pXG5cbiAgaG9va3Mub25Ccm93c2VyUmVmcmVzaCgoKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgIGxhYmVsOiAnZGVidWcnLFxuICAgICAgbWVzc2FnZTogYHJlZnJlc2ggZXZlbnQgcmVjZWl2ZWRgLFxuICAgIH0pXG5cbiAgICB3ZWJzb2NrZXQuY2xpZW50cy5mb3JFYWNoKCh3cykgPT4gd3Muc2VuZCgncmVmcmVzaCcpKVxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICAvLyBzbyBqdXN0IGFsd2F5cyByZXNvbHZlIE9LXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHkpID0+IHtcbiAgICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHkoMSkpXG4gICAgICAgIC8vIHNvY2tldHMgaW5jbHVkZXMgd3Mgc29ja2V0c1xuICAgICAgICBzb2NrZXRzLmZvckVhY2goKHdzKSA9PiB3cy5kZXN0cm95KCkpXG4gICAgICB9KVxuICAgIH0sXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7bThCQUFBLG9DQUVBLE9BQWlCLG1CQUNqQixHQUFpQixnL0NDSGpCLE9BQWlCLG1CQUNqQixHQUFxQix1QkNEckIsK0pBQXlCLG9CQ0FsQixHQUFNLEdBQU0sQ0FDakIsV0FBWSxhQUNaLFlBQWEsZURFUixHQUFLLEdBQUwsVUFBSyxFQUFMLENBQ0wsUUFBUSxRQUNSLE9BQU8sT0FDUCxPQUFPLE9BQ1AsTUFBTSxVQUpJLFdBZVosR0FBSSxHQUFjLEdBRVosR0FBUyxFQUNaLEVBQU8sT0FBUSxXQUNmLEVBQU8sTUFBTyxRQUNkLEVBQU8sTUFBTyxVQUNkLEVBQU8sS0FBTSxPQUtULGFBQW1CLENBQ3hCLEdBQUksQ0FBQyxRQUFRLElBQUksUUFDZixLQUFNLElBQUksT0FBTSxnREFHbEIsTUFBTyxHQUdGLFdBQWdCLEVBQWtCLENBQ3ZDLEdBQUksUUFBUSxJQUFJLFFBQ2QsRUFBSyxLQUFLLE9BQ0wsQ0FDTCxHQUFNLEdBQVEsUUFBUSxJQUFJLGFBQ3BCLEVBQVUsUUFBUSxJQUFJLGFBQWUsRUFBSSxXQUFhLE9BQVMsTUFFckUsR0FBSSxDQUFDLEdBQVMsRUFBUSxRQUFVLEVBQU8sTUFBTyxPQUU5QyxRQUFRLElBQ04sQ0FDRSxVQUFFLEtBQUssR0FDUCxVQUFFLEdBQU8sRUFBUSxPQUFTLFNBQXdCLEVBQVEsT0FDMUQsRUFBUSxRQUNSLEVBQVEsU0FBVyxVQUFFLEtBQUssSUFBTSxFQUFRLFVBQVksR0FDcEQsRUFBUSxNQUFRO0FBQUE7QUFBQSxFQUFPLEVBQVEsTUFBTSxPQUFTLEVBQVE7QUFBQTtBQUFBLEVBQWMsSUFFbkUsT0FBTyxTQUNQLEtBQUssT0FLUCxXQUFlLEVBQWtCLENBQ3RDLEVBQU8sR0FBRSxNQUFPLEVBQU8sT0FBVSxJQUc1QixXQUFjLEVBQWtCLENBQ3JDLEVBQU8sR0FBRSxNQUFPLEVBQU8sTUFBUyxJQUczQixXQUFjLEVBQWtCLENB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R0FBTCxDQUFjLFNBQVEsR0FDNUQsS0FBTSxHQUFZLEVBQU8sUUFBUyxFQUFRLEdBRTFDLEdBQU0sRUFBUSxHQUVkLEFBQU8sRUFBSyxDQUNWLE1BQU8sUUFDUCxRQUFTLG9CQUFvQixFQUFPLFNEdklqQyxXQUF5QixFQUFVLEdBQUksQ0FDNUMsUUFBUSxVQUFVLE9BQU8sQ0FBRSxLQUFNLFdBQUssS0FBSyxRQUFRLE1BQU8sVUFFMUQsUUFBUSxnQkFBZ0IsV0FBVyxDQUNqQyxJQUFLLFFBQVEsTUFDYixrQkFBbUIsWUFHckIsUUFBUSw4QkFBOEIsU0FBUyxHQUdqRCxHQUFNLEdBQVUsZUFBSyxVQUVyQixFQUNHLFFBQVEsR0FBSSxTQUVaLE9BQU8sZUFBZ0Isb0NBQW9DLE1BQzNELE9BQU8sZUFBZ0IsZ0VBQ3ZCLE9BQU8sZUFBZ0IsdURBQ3ZCLE9BQU8sY0FBZSx3Q0FDdEIsUUFBUSx5QkFDUixRQUFRLCtCQUNSLFFBQVEsaUJBQ1IsUUFBUSxnQkFDUixRQUFRLGlCQUVYLEVBQ0csUUFBUSxRQUFTLHFDQUFzQyxDQUFFLFFBQVMsS0FDbEUsUUFBUSxJQUNSLFFBQVEsaUJBQ1IsUUFBUSxNQUFNLEtBQ2QsT0FBTyxBQUFDLEdBQVksQ0FDbkIsUUFBUSxJQUFJLFdBQWEsRUFBSSxXQUM3QixRQUFRLElBQUksYUFBZSxFQUFRLE1BQVEsUUFBVSxHQUNyRCxRQUFRLFFBQ1IsSUFDQSxHQUFhLEtBR2pCLEVBQ0csUUFBUSxNQUFPLDBDQUEyQyxDQUFFLE1BQU8sVUFDbkUsT0FBTyxhQUFjLGlEQUNyQixPQUFPLGlCQUFrQixpREFDekIsU0FBUyxnREFDVCxRQUFRLE9BQ1IsUUFBUSx1QkFDUixRQUFRLGdDQUNSLFFBQVEsVUFBVSxLQUNsQixPQUFPLEFBQUMsR0FBWSxDQUNuQixRQUFRLElBQUksV0FBYSxFQUFJLFlBQzdCLFFBQVEsSUFBSSxhQUFlLEVBQVEsTUFBUSxRQUFVLEdBQ3JELFFBQVEsUUFDUixJQUNBLEdBQVcsS0FHZixFQUNHLFFBQVEsU0FDUixPQUFPLGFBQWMsaURBQ3JCLFNBQVMsa0RBQ1QsUUFBUSxTQUNSLFFBQVEsMEJBQ1IsUUFBUSxZQUFZLEtBQ3BCLE9BQU8sS0FBTyxJQUFZLENBQ3pCLFFBQVEsSUFBSSxXQUFhLEVBQUksWUFDN0IsUUFBUSxJQUFJLGFBQWUsRUFBUSxNQUFRLFFBQVUsR0FDckQsUUFBUSxRQUNSLElBQ0EsR0FBYSxLQUdqQixFQUFRLE1BQU0sUUFBUSIsCiAgIm5hbWVzIjogW10KfQo=