UNPKG

91.2 kBJavaScriptView Raw
1#!/usr/bin/env node
2var Je=Object.create;var D=Object.defineProperty,Ze=Object.defineProperties,Ke=Object.getOwnPropertyDescriptor,Ye=Object.getOwnPropertyDescriptors,Qe=Object.getOwnPropertyNames,ae=Object.getOwnPropertySymbols,Xe=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty,et=Object.prototype.propertyIsEnumerable;var ce=(e,t,s)=>t in e?D(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s,y=(e,t)=>{for(var s in t||(t={}))le.call(t,s)&&ce(e,s,t[s]);if(ae)for(var s of ae(t))et.call(t,s)&&ce(e,s,t[s]);return e},O=(e,t)=>Ze(e,Ye(t)),pe=e=>D(e,"__esModule",{value:!0});var ue=(e,t)=>{pe(e);for(var s in t)D(e,s,{get:t[s],enumerable:!0})},tt=(e,t,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Qe(t))!le.call(e,o)&&o!=="default"&&D(e,o,{get:()=>t[o],enumerable:!(s=Ke(t,o))||s.enumerable});return e},c=e=>tt(pe(D(e!=null?Je(Xe(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);ue(exports,{registerRuntime:()=>J});var Ge=c(require("path")),ze=c(require("sade"));var rt="presta",ot="0.44.0",st="Hyper minimal framework for the modern web.",it="./dist/index.js",nt="./dist/index.d.ts",at={presta:"dist/bin.js"},lt=["dist"],ct={build:"node scripts/build && pnpx tsc --emitDeclarationOnly",cloc:"pnpm dlx cloc './lib/*.ts'",typecheck:"pnpx tsc --noEmit"},pt={type:"git",url:"git+ssh://git@github.com/sure-thing/presta.git"},ut="estrattonbailey",mt="MIT",ft={url:"https://github.com/sure-thing/presta/issues"},dt="https://github.com/sure-thing/presta#readme",gt={"@presta/utils":"workspace:^0.1.0",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","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",statuses:"^2.0.1","tiny-glob":"^0.2.9","watch-dependency-graph":"^3.0.1",ws:"^8.4.0"},ht={"@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"},me={name:rt,version:ot,description:st,main:it,types:nt,bin:at,files:lt,scripts:ct,repository:pt,author:ut,license:mt,bugs:ft,homepage:dt,dependencies:gt,devDependencies:ht};var qe=c(require("fs-extra")),_e=c(require("path")),ne=c(require("chokidar"));var K={};ue(K,{Levels:()=>w,colors:()=>F.default,debug:()=>g,error:()=>x,getLogs:()=>yt,info:()=>h,logger:()=>B,newline:()=>xt,raw:()=>vt,warn:()=>k});var F=c(require("kleur"));var v={PRODUCTION:"production",DEVELOPMENT:"development"};var w;(function(r){r.Debug="debug",r.Info="info",r.Warn="warn",r.Err="error"})(w||(w={}));var Z=[],bt={[w.Debug]:"magenta",[w.Info]:"blue",[w.Warn]:"yellow",[w.Err]:"red"};function yt(){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,s=process.env.PRESTA_ENV===v.PRODUCTION?"prod":"dev";if(!t&&e.level===w.Debug)return;console.log([F.default.gray(s),F.default[bt[e.level||"info"]](e.label),e.message,e.duration?F.default.gray("+"+e.duration):"",e.error?`
3
4${e.error.stack||e.error}
5
6`:""].filter(Boolean).join(" "))}}function g(e){B(y({level:w.Debug},e))}function h(e){B(y({level:w.Info},e))}function k(e){B(y({level:w.Warn},e))}function x(e){B(y({level:w.Err},e))}function vt(...e){process.env.TESTING?Z.push(e):console.log(...e)}function xt(){process.env.TESTING||console.log("")}var fe=c(require("fs")),S=c(require("path")),de=c(require("get-port"));var C="presta.config.js";function j(e){return(0,de.default)({port:parseInt(e,10)})}function L(e,t=!1){let s=S.default.resolve(e||C);try{return delete require.cache[s],require(s)}catch(o){return fe.default.existsSync(s)&&(x({label:"error",error:o}),t&&process.exit(1)),{}}}function M(e,t,s,o=process.cwd()){let r=y({env:e,output:"build",assets:"public",plugins:[],port:4e3,files:[]},s);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=>S.default.resolve(o,i))),r.output&&(r.output=S.default.resolve(o,r.output)),r.assets&&(r.assets=S.default.resolve(o,r.assets)),O(y({},r),{staticOutputDir:S.default.join(r.output,"static"),functionsOutputDir:S.default.join(r.output,"functions"),functionsManifest:S.default.join(r.output,"routes.json")})}var ee=c(require("fs-extra")),Se=c(require("path")),Ce=c(require("watch-dependency-graph")),Re=c(require("chokidar")),ke=c(require("picomatch")),Oe=c(require("deep-extend")),De=c(require("@presta/utils"));var $=c(require("fs-extra")),ge=c(require("path")),he=c(require("route-sort")),be=c(require("@presta/utils"));function wt(e){return e.replace(process.cwd(),"").split(".").reverse().slice(1).reverse().join("-").split("/").filter(Boolean).join("-")}function N(e,t){let s=e.map(i=>{try{let{route:n}=require(i),p=wt(i),a=ge.default.join(t.functionsOutputDir,t.env===v.PRODUCTION?p+"-"+(0,be.hashContent)($.default.readFileSync(i,"utf8"))+".js":p+".js");return g({label:"debug",message:`generating ${p} lambda`}),delete require.cache[i],delete require.cache[a],$.default.outputFileSync(a,`import { wrapHandler } from 'presta/dist/wrapHandler';
7 import * as file from '${i}';
8 export const route = file.route
9 export const handler = wrapHandler(file)`),[n,a]}catch(n){x({label:"error",error:n})}}).filter(Boolean),o=(0,he.default)(s.map(i=>i[0])),r={};for(let i of o){let n=s.find(p=>p[0]===i);n&&(r[i]=n[1])}return $.default.outputFileSync(t.functionsManifest,JSON.stringify(r)),s}var Y=c(require("fs-extra")),ye=c(require("path")),ve=c(require("tiny-glob/sync"));function H(e){return/export\s.+\sroute\s+\=/.test(Y.default.readFileSync(e,"utf-8"))}function A(e){return/export\s.+\sgetStaticPaths/.test(Y.default.readFileSync(e,"utf-8"))}function q(e){return[].concat(e).map(t=>(0,ve.default)(t)).flat().map(t=>ye.default.resolve(process.cwd(),t))}var Q=c(require("fs-extra")),X=c(require("path")),Pe=c(require("mime-types")),Ee=c(require("@presta/utils"));var xe=c(require("regexparam"));function we(e,t){let[s]=e.split("?"),o=(0,xe.default)(t),r=0,i={},n=o.pattern.exec(s)||[];for(;r<o.keys.length;)i[o.keys[r]]=n[++r];return i}function Pt(e){return typeof e=="object"?JSON.stringify(e):e}function I(e){let{isBase64Encoded:t=!1,statusCode:s=200,headers:o={},multiValueHeaders:r={},body:i="",html:n=void 0,json:p=void 0,xml:a=void 0}=typeof e=="string"?{body:e}:e,l="text/html; charset=utf-8";p?l="application/json; charset=utf-8":a&&(l="application/xml; charset=utf-8");let m=y({"Content-Type":l},o),u={};for(let f of Object.keys(m)){let b=f.toLowerCase(),E=m[f];u[b]=E||""}return{isBase64Encoded:t,statusCode:s,headers:u,multiValueHeaders:r,body:Pt(i||n||p||a||"")}}function _({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 X.default.extname(e)?e:t==="html"?`${e}/index.html`:`${e}.${t}`}async function U(e){return g({label:"debug",message:`removing old static file ${e}`}),Q.default.remove(e)}async function St(e){return Promise.all(e.map(U))}async function Ct(e,t,{footer:s}){let o=require(e),r=await o.getStaticPaths(),i=[];if(!r||!r.length)return i;for(let n of r){let p=(0,Ee.timer)(),a={path:n,pathParameters:o.route?we(n,o.route):{}},l=I(await o.handler(a,{})),m=((l==null?void 0:l.headers)||{})["content-type"],u=Pe.default.extension(m)||"html",f=Et(n,u),b=l.body+(u==="html"?s:""),E=X.default.join(t,f);Q.default.outputFileSync(E,b,"utf-8"),h({label:"built",message:n,duration:p()}),i.push(E)}return i}async function V(e,t,s={}){let o=t.env===v.DEVELOPMENT,r=t.staticOutputDir,i=o?_({port:t.port}):"";for(let n of e)try{let p=n.replace(process.cwd(),""),a=s[n]||[],l=await Ct(n,r,{footer:i});if(!l||!l.length){k({label:"paths",message:`${p} - no paths to render`}),St(a);continue}for(let m of a)l.includes(m)||U(m);s[n]=l}catch(p){x({label:"error",error:p});break}return{staticFilesMap:s}}function Fe(e,t){let s=(0,De.timer)();N(e,t),e.length&&h({label:"built",message:"lambdas",duration:s()})}function Rt(e,t,s){return(0,ke.default)(t)(e)&&!s.includes(e)}async function Be(e,t){let s={},o=q(e.files);o.length||k({label:"paths",message:"no files configured"});async function r(a,l,m){if(delete require.cache[a],A(a)){let u=await V([a],m,s);s=(0,Oe.default)({},s,u.staticFilesMap)}Fe(l.filter(H),m)}async function i(a,l,m){for(let u of a)await r(u,l,m)}await i(o,o,e),t.emitBrowserRefresh();let n=(0,Ce.create)({alias:{"@":process.cwd()}});n.onChange(async a=>{await i(a,o,e),t.emitBrowserRefresh()}),n.onRemove(async([a])=>{g({label:"watch",message:`removed ${a}`}),o.splice(o.indexOf(a),1),Fe(o.filter(H),e),(s[a]||[]).forEach(l=>U(Se.default.join(e.staticOutputDir,l))),t.emitBrowserRefresh()}),n.onError(a=>{x({label:"error",error:typeof a=="string"?new Error(a):a})}),await n.add(o);let p=Re.default.watch(process.cwd(),{ignoreInitial:!0,ignored:[e.output,e.assets]});return p.on("add",async a=>{!ee.default.existsSync(a)||ee.default.lstatSync(a).isDirectory()||!Rt(a,e.files,o)||(g({label:"watch",message:`add ${a}`}),o.push(a),await n.add(a),await r(a,o,e),t.emitBrowserRefresh())}),t.onBuildFile(async({file:a})=>{await r(a,o,e),t.emitBrowserRefresh()}),{async close(){await n.close(),await p.close()}}}async function W(e,t,s){let o=await Promise.all(e.map(r=>{try{return r(t,s)}catch(i){x({label:"error",error:i})}}).filter(Boolean));return{async cleanup(){return Promise.all(o.map(r=>r&&r.cleanup&&r.cleanup()))}}}var He;(function(o){o.PostBuild="post-build",o.BuildFile="build-file",o.BrowserRefresh="browser-refresh"})(He||(He={}));function G(){let e={};function t(i,...n){e[i]&&e[i].map(p=>p(...n))}function s(i,n){return e[i]=e[i]?e[i].concat(n):[n],()=>e[i].splice(e[i].indexOf(n),1)}function o(){e={}}function r(i){return e[i]||[]}return{emit:t,on:s,clear:o,listeners:r}}function z(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 Ie=c(require("path")),te=c(require("fs-extra")),Te=c(require("esbuild")),R=c(require("@presta/utils"));async function je(e,t){let s=(0,R.timer)(),o=q(e.files),r=o.filter(A),i=o.filter(H);if(g({label:"build",message:"starting build"}),!r.length&&!i.length)k({label:"files",message:"no files were found, nothing to build"});else{let n="",p=0,a="",l="",m=await Promise.allSettled([(async()=>{if(r.length){let u=(0,R.timer)(),{staticFilesMap:f}=await V(r,e);n=u(),p=Object.keys(f).reduce((b,E)=>b+=f[E].length,0)}})(),(async()=>{if(i.length){let u=(0,R.timer)(),f=(0,R.requireSafe)(Ie.default.join(process.cwd(),"package.json"));N(i,e),await(0,Te.build)({entryPoints:Object.values(require(e.functionsManifest)),outdir:e.functionsOutputDir,platform:"node",target:["node12"],minify:!0,allowOverwrite:!0,external:Object.keys(f.dependencies||{}),bundle:!0,define:{"process.env.PRESTA_SERVERLESS_RUNTIME":"true"}}),a=u()}})(),(async()=>{if(te.default.existsSync(e.assets)){let u=(0,R.timer)();te.default.copySync(e.assets,e.staticOutputDir),l=u()}})()]);if(m.find(u=>u.status==="rejected"))throw g({label:"build",message:"build partially failed"}),m.forEach(u=>{u.status==="rejected"&&x({label:"error",error:u.reason})}),new Error("presta build failed");n&&h({label:"static",message:`rendered ${p} file(s)`,duration:n}),a&&h({label:"lambda",message:`compiled ${i.length} function(s)`,duration:a}),l&&h({label:"assets",message:"copied",duration:l}),t.emitPostBuild({output:e.output,staticOutput:e.staticOutputDir,functionsOutput:e.functionsOutputDir,functionsManifest:(0,R.requireSafe)(e.functionsManifest)}),(n||a)&&h({label:"build",message:"complete",duration:s()})}}var Me=c(require("http")),oe=c(require("sirv")),$e=c(require("mime-types")),Ne=c(require("regexparam")),se=c(require("statuses")),Ae=c(require("ws")),P=c(require("@presta/utils"));var re=c(require("statuses"));function Le({statusCode:e}){return`<!-- built with presta https://npm.im/presta -->
31 <!DOCTYPE html>
32 <html>
33 <head>
34 <meta charset="UTF-8" />
35 <meta name="viewport" content="width=device-width,initial-scale=1" />
36 <title>${e} \u2014\xA0${re.default.message[e]}</title>
37 <link rel="icon" type="image/png" href="https://presta.run/favicon.png">
38 <link rel="icon" type="image/svg" href="https://presta.run/favicon.svg">
39 <link rel="preconnect" href="https://fonts.googleapis.com">
40 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
41 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;900&display=swap" rel="stylesheet">
42 <link rel='stylesheet' href='https://unpkg.com/svbstrate@5.1.0/svbstrate.css' />
43 <style>
44 html,body {
45 font-family: 'Inter', 'sans-serif';
46 color: #23283D;
47 background-color: #DADEF0;
48 }
49 #favicon {
50 fill: #23283D;
51 }
52 @media (prefers-color-scheme: dark) {
53 html,body {
54 color: #DADEF0;
55 background-color: #23283D;
56 }
57 #favicon {
58 fill: #DADEF0;
59 }
60 }
61 </style>
62 </head>
63 <body class='w f aic jcc' style='height: 100vh'>
64 <div class='p12 tac'>
65 <h1>${e}</h1>
66 <p class='mb1'>${re.default.message[e]}</p>
67
68 <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
69 <g clip-path="url(#a)">
70 <path id="favicon" fill-rule="evenodd" clip-rule="evenodd" d="M10.4 7c-.3 0-.8.2-1 .5L1.1 22.1c-.2.3 0 .6.3.6l4 .3-2.1 2.6c-.2.3-.1.6.2.6l16.8 1.3c.4 0 .8-.2 1-.4L32 13.9c.2-.2.1-.5-.2-.5l-6.4-.5 2.2-4c.2-.3 0-.5-.3-.6L10.4 7ZM24 12.8l1.9-3.4-15.5-1.2-7.7 13.4 3.6.3 7.5-9.4c.3-.3.7-.5 1-.4l9.2.7ZM7.6 22l7.1-8.9 8.7.7-5.2 9L7.6 22Zm-1 1.1 11.6 1c.3 0 .8-.3 1-.6l5.5-9.6 5.5.5-9.7 12L5 25.2l1.7-2Z" fill="#23283D"/>
71 </g>
72 <defs>
73 <clipPath id="a">
74 <path fill="#fff" d="M0 0h32v32H0z"/>
75 </clipPath>
76 </defs>
77 </svg>
78 </div>
79 </body>
80 </html>
81 `}function kt(e,t){let s=new Error(t);return s.statusCode=e,s}function Ot(e){let t=((e==null?void 0:e.headers)||{})["content-type"];return $e.default.extension(t)||"html"}function Dt(e,t){let o=Object.keys(t).map(r=>({matcher:(0,Ne.default)(r),route:r})).filter(({matcher:r})=>r.pattern.test(e.split("?")[0])).map(({route:r})=>t[r])[0];return o?require(o):void 0}async function Ft(e,t){let s=e.headers.Accept||e.headers.accept,o=s&&s.includes("json");try{if(!t||!t.handler)throw kt(404,"");return I(await t.handler(e,{awsRequestId:"presta dev"}))}catch(r){let i=r,{statusCode:n=500}=i;return n>499&&x({label:"error",message:i.message||se.default.message[n],error:i}),I({statusCode:n,html:o?void 0:Le({statusCode:n}),json:o?{detail:se.default.message[n]}:void 0})}}function Bt({port:e,config:t}){return async function(o,r){var f;let i=(0,P.timer)(),n=await(0,P.requestToEvent)(o),p=(0,P.requireFresh)(t.functionsManifest),a=Dt(n.path,p),l=await Ft(n,a),m=l.statusCode>299&&l.statusCode<399;Ot(l)==="html"&&(l.body=(l.body||"").split("</body>")[0]+_({port:e})),(0,P.sendServerlessResponse)(r,l),K[l.statusCode<299?"info":"error"]({label:"serve",message:`${l.statusCode} ${m&&((f=l==null?void 0:l.headers)==null?void 0:f.Location)||n.path}`,duration:i()})}}function Ht({port:e,config:t}){let s=t.staticOutputDir,o=t.assets;return async function(i,n){let p=(0,P.timer)(),a=i.url;g({label:"debug",message:`handling ${a}`});function l(m,u){h({label:"serve",message:`${m.statusCode} ${u}`,duration:p()})}(0,oe.default)(o,{dev:!0,setHeaders:l})(i,n,()=>{(0,oe.default)(s,{dev:!0,setHeaders:l})(i,n,async()=>{Bt({port:e,config:t})(i,n)})})}}function ie(e,t){let s=e.port,o=Me.default.createServer(Ht({port:s,config:e})).listen(s),r=new Ae.WebSocketServer({server:o}),i=[];return o.on("connection",n=>{i.push(n),n.on("close",()=>i.splice(i.indexOf(n),1))}),t.onBrowserRefresh(()=>{g({label:"debug",message:"refresh event received"}),r.clients.forEach(n=>n.send("refresh"))}),{async close(){return new Promise(n=>{o.close(()=>n(1)),i.forEach(p=>p.destroy())})}}}async function Ue(e){let t=L(e.config,!0),s=await j(e.port||t.port||4e3),o=G(),r=z(o),i=M(v.PRODUCTION,O(y({},e),{port:s}),t);await W(i.plugins,i,r),qe.default.emptyDirSync(i.output),h({label:"build"}),await je(i,r)}async function Ve(e){let t=e["no-serve"],s,o,r=!1;async function i(){let p,a,l,m=L(e.config);(!o||m.port&&o!==m.port)&&(o=await j(e.port||m.port||4e3),process.env.PRESTA_SERVE_URL=`http://localhost:${o}`);let u=G(),f=z(u),b=M(v.DEVELOPMENT,O(y({},e),{port:o}),m),E=await W(b.plugins,b,f);return g({label:"debug",message:`config created ${JSON.stringify(b)}`}),t||(a=ie(b,f),l=ne.default.watch(b.assets,{ignoreInitial:!0}).on("all",()=>{f.emitBrowserRefresh()})),h({label:r?"restart":"start",message:t?"":`http://localhost:${b.port}`}),p=await Be(b,f),{config:b,async close(){u.clear(),await E.cleanup(),await l.close(),await p.close(),a&&await a.close()}}}let n=ne.default.watch(_e.default.resolve(e.config||C),{ignoreInitial:!0}).on("all",async()=>{if(!r){r=!0;try{await s.close()}catch(p){console.error(p)}console.clear(),s=await i(),r=!1}});return s=await i(),{async close(){await n.close(),await s.close()}}}async function We(e){let t=L(e.config,!0),s=await j(e.port||t.port||4e3),o=G(),r=z(o),i=M(v.PRODUCTION,O(y({},e),{port:s}),t);await W(i.plugins,i,r),ie(i,r),h({label:"serve",message:`http://localhost:${i.port}`})}function J(e={}){require("dotenv").config({path:Ge.default.join(process.cwd(),".env")}),require("module-alias").addAliases({"@":process.cwd(),"presta:internal":__dirname}),require("esbuild-register/dist/node").register(e)}var T=(0,ze.default)("presta");T.version(me.version).option("--config, -c",`Path to a config file. (default ${C})`).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 ${C}`).action(e=>{process.env.PRESTA_ENV=v.PRODUCTION,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),J(),Ue(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 ${C}`).action(e=>{process.env.PRESTA_ENV=v.DEVELOPMENT,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),J(),Ve(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 ${C}`).action(async e=>{process.env.PRESTA_ENV=v.DEVELOPMENT,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),J(),We(e)});T.parse(process.argv);0&&(module.exports={registerRuntime});
82//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL2Jpbi50cyIsICIuLi9saWIvY2xpLnRzIiwgIi4uL2xpYi9sb2cudHMiLCAiLi4vbGliL2NvbnN0YW50cy50cyIsICIuLi9saWIvY29uZmlnLnRzIiwgIi4uL2xpYi93YXRjaC50cyIsICIuLi9saWIvb3V0cHV0TGFtYmRhcy50cyIsICIuLi9saWIvZ2V0RmlsZXMudHMiLCAiLi4vbGliL2J1aWxkU3RhdGljRmlsZXMudHMiLCAiLi4vbGliL2dldFJvdXRlUGFyYW1zLnRzIiwgIi4uL2xpYi9ub3JtYWxpemVSZXNwb25zZS50cyIsICIuLi9saWIvdXRpbHMudHMiLCAiLi4vbGliL3BsdWdpbnMudHMiLCAiLi4vbGliL2NyZWF0ZUVtaXR0ZXIudHMiLCAiLi4vbGliL2J1aWxkLnRzIiwgIi4uL2xpYi9zZXJ2ZS50cyIsICIuLi9saWIvY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHNhZGUgZnJvbSAnc2FkZSdcblxuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nXG5cbmltcG9ydCB7IGJ1aWxkQ29tbWFuZCwgZGV2Q29tbWFuZCwgc2VydmVDb21tYW5kIH0gZnJvbSAnLi9jbGknXG5pbXBvcnQgeyBkZWZhdWx0Q29uZmlnRmlsZXBhdGggfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lKG9wdGlvbnMgPSB7fSkge1xuICByZXF1aXJlKCdkb3RlbnYnKS5jb25maWcoeyBwYXRoOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5lbnYnKSB9KVxuXG4gIHJlcXVpcmUoJ21vZHVsZS1hbGlhcycpLmFkZEFsaWFzZXMoe1xuICAgICdAJzogcHJvY2Vzcy5jd2QoKSxcbiAgICAncHJlc3RhOmludGVybmFsJzogX19kaXJuYW1lLCAvLyBUT0RPIHdoZXJldmVyIHRoaXMgaXMgcnVubmluZyBmcm9tXG4gIH0pXG5cbiAgcmVxdWlyZSgnZXNidWlsZC1yZWdpc3Rlci9kaXN0L25vZGUnKS5yZWdpc3RlcihvcHRpb25zKVxufVxuXG5jb25zdCBwcm9ncmFtID0gc2FkZSgncHJlc3RhJylcblxucHJvZ3JhbVxuICAudmVyc2lvbihwa2cudmVyc2lvbilcbiAgLy8gZG8gbm90IHByb3ZpZGUgZGVmYXVsdCBjb25maWcgaGVyZVxuICAub3B0aW9uKCctLWNvbmZpZywgLWMnLCBgUGF0aCB0byBhIGNvbmZpZyBmaWxlLiAgKGRlZmF1bHQgJHtkZWZhdWx0Q29uZmlnRmlsZXBhdGh9KWApXG4gIC5vcHRpb24oJy0tb3V0cHV0LCAtbycsIGBTcGVjaWZ5IG91dHB1dCBkaXJlY3RvcnkgZm9yIGJ1aWx0IGZpbGVzLiAgKGRlZmF1bHQgLi9idWlsZClgKVxuICAub3B0aW9uKCctLWFzc2V0cywgLWEnLCBgU3BlY2lmeSBzdGF0aWMgYXNzZXQgZGlyZWN0b3J5LiAgKGRlZmF1bHQgLi9wdWJsaWMpYClcbiAgLm9wdGlvbignLS1kZWJ1ZywgLWQnLCBgRW5hYmxlIGRlYnVnIG1vZGUgKHByaW50cyBtb3JlIGxvZ3MpYClcbiAgLmV4YW1wbGUoYGRldiBpbmRleC5qc3ggLW8gZGlzdGApXG4gIC5leGFtcGxlKGBkZXYgJ3BhZ2VzLyoudHN4JyAtbyBzdGF0aWNgKVxuICAuZXhhbXBsZShgJ3BhZ2VzLyoudHN4J2ApXG4gIC5leGFtcGxlKGAtYyBzaXRlLmpzb25gKVxuICAuZXhhbXBsZShgc2VydmUgLXAgODA4MGApXG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2J1aWxkJywgJ0J1aWxkIHByb2plY3QgdG8gb3V0cHV0IGRpcmVjdG9yeS4nLCB7IGRlZmF1bHQ6IHRydWUgfSlcbiAgLmV4YW1wbGUoYGApXG4gIC5leGFtcGxlKGBmaWxlcy8qKi8qLmpzYClcbiAgLmV4YW1wbGUoYC1jICR7ZGVmYXVsdENvbmZpZ0ZpbGVwYXRofWApXG4gIC5hY3Rpb24oKG9wdGlvbnMpID0+IHtcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID0gRW52LlBST0RVQ1RJT05cbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfREVCVUcgPSBvcHRpb25zLmRlYnVnID8gJ2RlYnVnJyA6ICcnXG4gICAgY29uc29sZS5jbGVhcigpXG4gICAgcmVnaXN0ZXJSdW50aW1lKClcbiAgICBidWlsZENvbW1hbmQob3B0aW9ucylcbiAgfSlcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnZGV2JywgJ1N0YXJ0IFByZXN0YSBkZXYgc2VydmVyIGFuZCB3YXRjaCBmaWxlcycsIHsgYWxpYXM6ICd3YXRjaCcgfSlcbiAgLm9wdGlvbignLS1wb3J0LCAtcCcsIGBQb3J0IHRvIHJ1biB0aGUgbG9jYWwgc2VydmVyLiAgKGRlZmF1bHQgNDAwMClgKVxuICAub3B0aW9uKCctLW5vLXNlcnZlLCAtbicsIGBEbyBub3QgcnVuIGxvY2FsIGRldiBzZXJ2ZXIuICAoZGVmYXVsdCBmYWxzZSlgKVxuICAuZGVzY3JpYmUoJ1dhdGNoIHByb2plY3QgYW5kIGJ1aWxkIHRvIG91dHB1dCBkaXJlY3RvcnkuJylcbiAgLmV4YW1wbGUoYGRldmApXG4gIC5leGFtcGxlKGBkZXYgLi9maWxlcy8qKi8qLmpzYClcbiAgLmV4YW1wbGUoYGRldiAuL2ZpbGVzLyoqLyouanMgLW8gLi9vdXRgKVxuICAuZXhhbXBsZShgZGV2IC1jICR7ZGVmYXVsdENvbmZpZ0ZpbGVwYXRofWApXG4gIC5hY3Rpb24oKG9wdGlvbnMpID0+IHtcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID0gRW52LkRFVkVMT1BNRU5UXG4gICAgcHJvY2Vzcy5lbnYuUFJFU1RBX0RFQlVHID0gb3B0aW9ucy5kZWJ1ZyA/ICdkZWJ1ZycgOiAnJ1xuICAgIGNvbnNvbGUuY2xlYXIoKVxuICAgIHJlZ2lzdGVyUnVudGltZSgpXG4gICAgZGV2Q29tbWFuZChvcHRpb25zKVxuICB9KVxuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdzZXJ2ZScpXG4gIC5vcHRpb24oJy0tcG9ydCwgLXAnLCBgUG9ydCB0byBydW4gdGhlIGxvY2FsIHNlcnZlci4gIChkZWZhdWx0IDQwMDApYClcbiAgLmRlc2NyaWJlKCdTZXJ2ZSBidWlsdCBmaWxlcywgbGFtYmRhcywgYW5kIHN0YXRpYyBhc3NldHMuJylcbiAgLmV4YW1wbGUoYHNlcnZlYClcbiAgLmV4YW1wbGUoYHNlcnZlIC1vIC4vb3V0IC1wIDgwODBgKVxuICAuZXhhbXBsZShgc2VydmUgLWMgJHtkZWZhdWx0Q29uZmlnRmlsZXBhdGh9YClcbiAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgIHByb2Nlc3MuZW52LlBSRVNUQV9FTlYgPSBFbnYuREVWRUxPUE1FTlRcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfREVCVUcgPSBvcHRpb25zLmRlYnVnID8gJ2RlYnVnJyA6ICcnXG4gICAgY29uc29sZS5jbGVhcigpXG4gICAgcmVnaXN0ZXJSdW50aW1lKClcbiAgICBzZXJ2ZUNvbW1hbmQob3B0aW9ucylcbiAgfSlcblxucHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpXG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBjaG9raWRhciBmcm9tICdjaG9raWRhcidcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgT3B0aW9ucywgY3JlYXRlLCBnZXRDb25maWdGaWxlLCBkZWZhdWx0Q29uZmlnRmlsZXBhdGgsIGdldEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi93YXRjaCdcbmltcG9ydCB7IGluaXRQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW5zJ1xuaW1wb3J0IHsgY3JlYXRlRW1pdHRlciwgY3JlYXRlSG9va3MgfSBmcm9tICcuL2NyZWF0ZUVtaXR0ZXInXG5pbXBvcnQgeyBidWlsZCB9IGZyb20gJy4vYnVpbGQnXG5pbXBvcnQgeyBzZXJ2ZSB9IGZyb20gJy4vc2VydmUnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcblxuZXhwb3J0IHR5cGUgUHJlc3RhQ0xJT3B0aW9ucyA9IHtcbiAgY29uZmlnPzogc3RyaW5nXG4gIG91dHB1dD86IHN0cmluZ1xuICBkZWJ1Zz86IGJvb2xlYW5cbn0gJiBQYXJ0aWFsPE9wdGlvbnM+XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSUJ1aWxkT3B0aW9ucyA9IFByZXN0YUNMSU9wdGlvbnMgJiB7XG4gIF86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSVNlcnZlT3B0aW9ucyA9IFByZXN0YUNMSUJ1aWxkT3B0aW9ucyAmIHtcbiAgcG9ydD86IHN0cmluZ1xuICAnbm8tc2VydmUnOiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSURldk9wdGlvbnMgPSBQcmVzdGFDTElTZXJ2ZU9wdGlvbnNcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29tbWFuZChvcHRpb25zOiBQcmVzdGFDTElCdWlsZE9wdGlvbnMpIHtcbiAgY29uc3QgY29uZmlnRmlsZSA9IGdldENvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWcsIHRydWUpXG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRBdmFpbGFibGVQb3J0KG9wdGlvbnMucG9ydCB8fCBjb25maWdGaWxlLnBvcnQgfHwgNDAwMClcblxuICBjb25zdCBlbWl0dGVyID0gY3JlYXRlRW1pdHRlcigpXG4gIGNvbnN0IGhvb2tzID0gY3JlYXRlSG9va3MoZW1pdHRlcilcbiAgY29uc3QgY29uZmlnID0gY3JlYXRlKEVudi5QUk9EVUNUSU9OLCB7IC4uLm9wdGlvbnMsIHBvcnQgfSwgY29uZmlnRmlsZSlcbiAgYXdhaXQgaW5pdFBsdWdpbnMoY29uZmlnLnBsdWdpbnMsIGNvbmZpZywgaG9va3MpXG5cbiAgZnMuZW1wdHlEaXJTeW5jKGNvbmZpZy5vdXRwdXQpXG5cbiAgbG9nZ2VyLmluZm8oe1xuICAgIGxhYmVsOiAnYnVpbGQnLFxuICB9KVxuXG4gIGF3YWl0IGJ1aWxkKGNvbmZpZywgaG9va3MpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXZDb21tYW5kKG9wdGlvbnM6IFByZXN0YUNMSURldk9wdGlvbnMpIHtcbiAgY29uc3Qgbm9TZXJ2ZSA9IG9wdGlvbnNbJ25vLXNlcnZlJ11cbiAgbGV0IGRldlNlcnZlcjogYW55XG4gIGxldCBwb3J0OiBudW1iZXJcbiAgbGV0IHJlc3RhcnRpbmcgPSBmYWxzZVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKCkge1xuICAgIGxldCB3YXRjaFRhc2s6IGFueVxuICAgIGxldCBodHRwU2VydmVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXJ2ZT5cbiAgICBsZXQgc3RhdGljQXNzZXRXYXRjaGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBjaG9raWRhci53YXRjaD5cblxuICAgIGNvbnN0IHVzZXJDb25maWdGaWxlID0gZ2V0Q29uZmlnRmlsZShvcHRpb25zLmNvbmZpZylcblxuICAgIGlmICghcG9ydCB8fCAodXNlckNvbmZpZ0ZpbGUucG9ydCAmJiBwb3J0ICE9PSB1c2VyQ29uZmlnRmlsZS5wb3J0KSkge1xuICAgICAgcG9ydCA9IGF3YWl0IGdldEF2YWlsYWJsZVBvcnQob3B0aW9ucy5wb3J0IHx8IHVzZXJDb25maWdGaWxlLnBvcnQgfHwgNDAwMClcbiAgICAgIHByb2Nlc3MuZW52LlBSRVNUQV9TRVJWRV9VUkwgPSBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YFxuICAgIH1cblxuICAgIGNvbnN0IGVtaXR0ZXIgPSBjcmVhdGVFbWl0dGVyKClcbiAgICBjb25zdCBob29rcyA9IGNyZWF0ZUhvb2tzKGVtaXR0ZXIpXG4gICAgY29uc3QgY29uZmlnID0gY3JlYXRlKEVudi5ERVZFTE9QTUVOVCwgeyAuLi5vcHRpb25zLCBwb3J0IH0sIHVzZXJDb25maWdGaWxlKVxuICAgIGNvbnN0IHBsdWdpbnMgPSBhd2FpdCBpbml0UGx1Z2lucyhjb25maWcucGx1Z2lucywgY29uZmlnLCBob29rcylcblxuICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2U6IGBjb25maWcgY3JlYXRlZCAke0pTT04uc3RyaW5naWZ5KGNvbmZpZyl9YCxcbiAgICB9KVxuXG4gICAgaWYgKCFub1NlcnZlKSB7XG4gICAgICBodHRwU2VydmVyID0gc2VydmUoY29uZmlnLCBob29rcylcblxuICAgICAgc3RhdGljQXNzZXRXYXRjaGVyID0gY2hva2lkYXIud2F0Y2goY29uZmlnLmFzc2V0cywgeyBpZ25vcmVJbml0aWFsOiB0cnVlIH0pLm9uKCdhbGwnLCAoKSA9PiB7XG4gICAgICAgIGhvb2tzLmVtaXRCcm93c2VyUmVmcmVzaCgpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgIGxhYmVsOiByZXN0YXJ0aW5nID8gJ3Jlc3RhcnQnIDogJ3N0YXJ0JyxcbiAgICAgIG1lc3NhZ2U6ICFub1NlcnZlID8gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtjb25maWcucG9ydH1gIDogJycsXG4gICAgfSlcblxuICAgIHdhdGNoVGFzayA9IGF3YWl0IHdhdGNoKGNvbmZpZywgaG9va3MpXG5cbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlnLFxuICAgICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICAgIGVtaXR0ZXIuY2xlYXIoKVxuICAgICAgICBhd2FpdCBwbHVnaW5zLmNsZWFudXAoKVxuICAgICAgICBhd2FpdCBzdGF0aWNBc3NldFdhdGNoZXIuY2xvc2UoKVxuICAgICAgICBhd2FpdCB3YXRjaFRhc2suY2xvc2UoKVxuXG4gICAgICAgIGlmIChodHRwU2VydmVyKSB7XG4gICAgICAgICAgYXdhaXQgaHR0cFNlcnZlci5jbG9zZSgpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlnV2F0Y2hlciA9IGNob2tpZGFyXG4gICAgLndhdGNoKHBhdGgucmVzb2x2ZShvcHRpb25zLmNvbmZpZyB8fCBkZWZhdWx0Q29uZmlnRmlsZXBhdGgpLCB7IGlnbm9yZUluaXRpYWw6IHRydWUgfSlcbiAgICAub24oJ2FsbCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChyZXN0YXJ0aW5nKSByZXR1cm5cblxuICAgICAgcmVzdGFydGluZyA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGV2U2VydmVyLmNsb3NlKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmNsZWFyKClcblxuICAgICAgZGV2U2VydmVyID0gYXdhaXQgc3RhcnREZXZTZXJ2ZXIoKVxuXG4gICAgICByZXN0YXJ0aW5nID0gZmFsc2VcbiAgICB9KVxuXG4gIGRldlNlcnZlciA9IGF3YWl0IHN0YXJ0RGV2U2VydmVyKClcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgYXdhaXQgY29uZmlnV2F0Y2hlci5jbG9zZSgpXG4gICAgICBhd2FpdCBkZXZTZXJ2ZXIuY2xvc2UoKVxuICAgIH0sXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlcnZlQ29tbWFuZChvcHRpb25zOiBQcmVzdGFDTElTZXJ2ZU9wdGlvbnMpIHtcbiAgY29uc3QgY29uZmlnRmlsZSA9IGdldENvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWcsIHRydWUpXG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRBdmFpbGFibGVQb3J0KG9wdGlvbnMucG9ydCB8fCBjb25maWdGaWxlLnBvcnQgfHwgNDAwMClcblxuICBjb25zdCBlbWl0dGVyID0gY3JlYXRlRW1pdHRlcigpXG4gIGNvbnN0IGhvb2tzID0gY3JlYXRlSG9va3MoZW1pdHRlcilcbiAgY29uc3QgY29uZmlnID0gY3JlYXRlKEVudi5QUk9EVUNUSU9OLCB7IC4uLm9wdGlvbnMsIHBvcnQgfSwgY29uZmlnRmlsZSlcbiAgYXdhaXQgaW5pdFBsdWdpbnMoY29uZmlnLnBsdWdpbnMsIGNvbmZpZywgaG9va3MpXG5cbiAgc2VydmUoY29uZmlnLCBob29rcylcblxuICBsb2dnZXIuaW5mbyh7XG4gICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgbWVzc2FnZTogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtjb25maWcucG9ydH1gLFxuICB9KVxufVxuIiwgImltcG9ydCBjLCB7IEtsZXVyIH0gZnJvbSAna2xldXInXG5cbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5leHBvcnQgZW51bSBMZXZlbHMge1xuICBEZWJ1ZyA9ICdkZWJ1ZycsXG4gIEluZm8gPSAnaW5mbycsXG4gIFdhcm4gPSAnd2FybicsXG4gIEVyciA9ICdlcnJvcicsXG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2UgPSB7XG4gIGxldmVsPzogTGV2ZWxzXG4gIGxhYmVsOiBzdHJpbmcgfCBudW1iZXJcbiAgbWVzc2FnZT86IHN0cmluZ1xuICBkdXJhdGlvbj86IHN0cmluZyB8IG51bWJlclxuICBlcnJvcj86IEVycm9yXG59XG5cbmxldCBsb2dzOiBhbnlbXSA9IFtdXG5cbmNvbnN0IGNvbG9ycyA9IHtcbiAgW0xldmVscy5EZWJ1Z106ICdtYWdlbnRhJyxcbiAgW0xldmVscy5JbmZvXTogJ2JsdWUnLFxuICBbTGV2ZWxzLldhcm5dOiAneWVsbG93JyxcbiAgW0xldmVscy5FcnJdOiAncmVkJyxcbn1cblxuZXhwb3J0IHsgYyBhcyBjb2xvcnMgfVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9ncygpIHtcbiAgaWYgKCFwcm9jZXNzLmVudi5URVNUSU5HKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBtZXRob2Qgd2FzIGNhbGxlZCBvdXRzaWRlIHRlc3QgbW9kZScpXG4gIH1cblxuICByZXR1cm4gbG9nc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9nZ2VyKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgaWYgKHByb2Nlc3MuZW52LlRFU1RJTkcpIHtcbiAgICBsb2dzLnB1c2gobWVzc2FnZSlcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWJ1ZyA9IHByb2Nlc3MuZW52LlBSRVNUQV9ERUJVR1xuICAgIGNvbnN0IGNvbnRleHQgPSBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID09PSBFbnYuUFJPRFVDVElPTiA/ICdwcm9kJyA6ICdkZXYnXG5cbiAgICBpZiAoIWRlYnVnICYmIG1lc3NhZ2UubGV2ZWwgPT09IExldmVscy5EZWJ1ZykgcmV0dXJuXG5cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFtcbiAgICAgICAgYy5ncmF5KGNvbnRleHQpLFxuICAgICAgICBjW2NvbG9yc1ttZXNzYWdlLmxldmVsIHx8ICdpbmZvJ10gYXMga2V5b2YgS2xldXJdKG1lc3NhZ2UubGFiZWwpLFxuICAgICAgICBtZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgIG1lc3NhZ2UuZHVyYXRpb24gPyBjLmdyYXkoJysnICsgbWVzc2FnZS5kdXJhdGlvbikgOiAnJyxcbiAgICAgICAgbWVzc2FnZS5lcnJvciA/IGBcXG5cXG4ke21lc3NhZ2UuZXJyb3Iuc3RhY2sgfHwgbWVzc2FnZS5lcnJvcn1cXG5cXG5gIDogJycsXG4gICAgICBdXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmpvaW4oJyAnKVxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVidWcobWVzc2FnZTogTWVzc2FnZSkge1xuICBsb2dnZXIoeyBsZXZlbDogTGV2ZWxzLkRlYnVnLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZvKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgbG9nZ2VyKHsgbGV2ZWw6IExldmVscy5JbmZvLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3YXJuKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgbG9nZ2VyKHsgbGV2ZWw6IExldmVscy5XYXJuLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcihtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGxvZ2dlcih7IGxldmVsOiBMZXZlbHMuRXJyLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYXcoLi4uYXJnczogYW55W10pIHtcbiAgaWYgKHByb2Nlc3MuZW52LlRFU1RJTkcpIHtcbiAgICBsb2dzLnB1c2goYXJncylcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyguLi5hcmdzKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdsaW5lKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuVEVTVElORykgcmV0dXJuXG4gIGNvbnNvbGUubG9nKCcnKVxufVxuIiwgImV4cG9ydCBjb25zdCBFbnYgPSB7XG4gIFBST0RVQ1RJT046ICdwcm9kdWN0aW9uJyxcbiAgREVWRUxPUE1FTlQ6ICdkZXZlbG9wbWVudCcsXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBnZXRQb3J0IGZyb20gJ2dldC1wb3J0J1xuXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBQcmVzdGFDTElEZXZPcHRpb25zLCBQcmVzdGFDTElCdWlsZE9wdGlvbnMgfSBmcm9tICcuL2NsaSdcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJy4vcGx1Z2lucydcblxuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtcbiAgZmlsZXM6IHN0cmluZ1tdXG4gIG91dHB1dDogc3RyaW5nXG4gIGFzc2V0czogc3RyaW5nXG4gIHBsdWdpbnM6IFBsdWdpbltdXG4gIHBvcnQ6IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBDb25maWcgPSBPcHRpb25zICYge1xuICBlbnY6IHN0cmluZ1xuICBzdGF0aWNPdXRwdXREaXI6IHN0cmluZ1xuICBmdW5jdGlvbnNPdXRwdXREaXI6IHN0cmluZ1xuICBmdW5jdGlvbnNNYW5pZmVzdDogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnRmlsZXBhdGggPSAncHJlc3RhLmNvbmZpZy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF2YWlsYWJsZVBvcnQocHJlZmVycmVkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGdldFBvcnQoeyBwb3J0OiBwYXJzZUludChwcmVmZXJyZWQsIDEwKSB9KVxufVxuXG4vKipcbiAqIEZldGNoIGEgY29uZmlnIGZpbGUuIElmIG9uZSB3YXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCBsZXQgdGhlbSBrbm93IGlmXG4gKiBhbnl0aGluZyBnb2VzIHdyb25nLiBPdXRzaWRlIHdhdGNoIG1vZGUsIHRoaXMgc2hvdWxkIGV4aXQoMSkgaWYgdGhlIHVzZXJcbiAqIHByb3ZpZGVkIGEgY29uZmlnIGFuZCB0aGVyZSB3YXMgYW4gZXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ0ZpbGUoZmlsZXBhdGg/OiBzdHJpbmcsIHNob3VsZEV4aXQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICBjb25zdCBmcCA9IHBhdGgucmVzb2x2ZShmaWxlcGF0aCB8fCBkZWZhdWx0Q29uZmlnRmlsZXBhdGgpXG5cbiAgdHJ5IHtcbiAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtmcF1cbiAgICByZXR1cm4gcmVxdWlyZShmcClcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IGV4aXN0cyA9IGZzLmV4aXN0c1N5bmMoZnApXG5cbiAgICAvLyBjb25maWcgZmlsZSBleGlzdHMsIHNob3VsZCBsb2cgZXJyb3IsIG90aGVyd2lzZSBpZ25vcmUgbWlzc2luZyBmaWxlXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgfSlcblxuICAgICAgLy8gd2UncmUgbm90IGluIHdhdGNoIG1vZGUsIGV4aXQgYnVpbGRcbiAgICAgIGlmIChzaG91bGRFeGl0KSBwcm9jZXNzLmV4aXQoMSlcbiAgICB9XG5cbiAgICByZXR1cm4ge31cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKFxuICBlbnY6IHN0cmluZyxcbiAgY2xpOiBQcmVzdGFDTElCdWlsZE9wdGlvbnMgfCBQcmVzdGFDTElEZXZPcHRpb25zLFxuICBmaWxlOiBQYXJ0aWFsPE9wdGlvbnM+LFxuICBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4pOiBDb25maWcge1xuICBjb25zdCBjb25maWcgPSB7XG4gICAgZW52LFxuICAgIG91dHB1dDogJ2J1aWxkJyxcbiAgICBhc3NldHM6ICdwdWJsaWMnLFxuICAgIHBsdWdpbnM6IFtdLFxuICAgIHBvcnQ6IDQwMDAsXG4gICAgZmlsZXM6IFtdLCAvLyBUT0RPIHdoZXJlIGRvIHdlIHZhbGlkYXRlXG4gICAgLi4uZmlsZSxcbiAgfVxuXG4gIC8vIG92ZXJyaWRlIHdpdGggQ0xJXG4gIGlmIChjbGkuXy5sZW5ndGgpIGNvbmZpZy5maWxlcyA9IGNsaS5fXG4gIGlmIChjbGkub3V0cHV0KSBjb25maWcub3V0cHV0ID0gY2xpLm91dHB1dFxuICBpZiAoY2xpLmFzc2V0cykgY29uZmlnLmFzc2V0cyA9IGNsaS5hc3NldHNcbiAgaWYgKGNsaS5wb3J0KSBjb25maWcucG9ydCA9IGNsaS5wb3J0XG5cbiAgLy8gcmVzb2x2ZSBhYnNvbHV0ZSBwYXRoc1xuICBpZiAoY29uZmlnLmZpbGVzKSBjb25maWcuZmlsZXMgPSAoW10gYXMgc3RyaW5nW10pLmNvbmNhdChjb25maWcuZmlsZXMpLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgcCkpXG4gIGlmIChjb25maWcub3V0cHV0KSBjb25maWcub3V0cHV0ID0gcGF0aC5yZXNvbHZlKGN3ZCwgY29uZmlnLm91dHB1dClcbiAgaWYgKGNvbmZpZy5hc3NldHMpIGNvbmZpZy5hc3NldHMgPSBwYXRoLnJlc29sdmUoY3dkLCBjb25maWcuYXNzZXRzKVxuXG4gIHJldHVybiB7XG4gICAgLi4uY29uZmlnLFxuICAgIHN0YXRpY091dHB1dERpcjogcGF0aC5qb2luKGNvbmZpZy5vdXRwdXQsICdzdGF0aWMnKSxcbiAgICBmdW5jdGlvbnNPdXRwdXREaXI6IHBhdGguam9pbihjb25maWcub3V0cHV0LCAnZnVuY3Rpb25zJyksXG4gICAgZnVuY3Rpb25zTWFuaWZlc3Q6IHBhdGguam9pbihjb25maWcub3V0cHV0LCAncm91dGVzLmpzb24nKSxcbiAgfVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd3YXRjaC1kZXBlbmRlbmN5LWdyYXBoJ1xuaW1wb3J0IGNob2tpZGFyIGZyb20gJ2Nob2tpZGFyJ1xuaW1wb3J0IG1hdGNoIGZyb20gJ3BpY29tYXRjaCdcbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwLWV4dGVuZCdcbmltcG9ydCB7IHRpbWVyIH0gZnJvbSAnQHByZXN0YS91dGlscydcblxuaW1wb3J0IHsgb3V0cHV0TGFtYmRhcyB9IGZyb20gJy4vb3V0cHV0TGFtYmRhcydcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IGdldEZpbGVzLCBpc1N0YXRpYywgaXNEeW5hbWljIH0gZnJvbSAnLi9nZXRGaWxlcydcbmltcG9ydCB7IGJ1aWxkU3RhdGljRmlsZXMsIHJlbW92ZUJ1aWx0U3RhdGljRmlsZSwgU3RhdGljRmlsZXNNYXAgfSBmcm9tICcuL2J1aWxkU3RhdGljRmlsZXMnXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IEhvb2tzIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuXG4vKlxuICogV3JhcHMgb3V0cHV0TGFtYmRhcyBmb3IgbG9nZ2luZ1xuICovXG5mdW5jdGlvbiB1cGRhdGVMYW1iZGFzKGlucHV0czogc3RyaW5nW10sIGNvbmZpZzogQ29uZmlnKSB7XG4gIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgLy8gYWx3YXlzIHdyaXRlIHRoaXMsIGV2ZW4gaWYgaW5wdXRzID0gW11cbiAgb3V0cHV0TGFtYmRhcyhpbnB1dHMsIGNvbmZpZylcblxuICAvLyBpZiB1c2VyIGFjdHVhbGx5IGhhcyByb3V0ZXMgY29uZmlndXJlZCwgZ2l2ZSBmZWVkYmFja1xuICBpZiAoaW5wdXRzLmxlbmd0aCkge1xuICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgIGxhYmVsOiAnYnVpbHQnLFxuICAgICAgbWVzc2FnZTogYGxhbWJkYXNgLFxuICAgICAgZHVyYXRpb246IHRpbWUoKSxcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05ld1ZhbGlkRmlsZShmaWxlOiBzdHJpbmcsIGdsb2JzOiBzdHJpbmdbXSwgZXhpc3Rpbmc6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBtYXRjaChnbG9icykoZmlsZSkgJiYgIWV4aXN0aW5nLmluY2x1ZGVzKGZpbGUpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXRjaChjb25maWc6IENvbmZpZywgaG9va3M6IEhvb2tzKSB7XG4gIGxldCBzdGF0aWNGaWxlc01hcDogU3RhdGljRmlsZXNNYXAgPSB7fVxuICBjb25zdCBmaWxlcyA9IGdldEZpbGVzKGNvbmZpZy5maWxlcylcblxuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIGxvZ2dlci53YXJuKHtcbiAgICAgIGxhYmVsOiAncGF0aHMnLFxuICAgICAgbWVzc2FnZTogJ25vIGZpbGVzIGNvbmZpZ3VyZWQnLFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBidWlsZEZpbGUoZmlsZTogc3RyaW5nLCBleGlzdGluZzogc3RyaW5nW10sIGNvbmZpZzogQ29uZmlnKSB7XG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbZmlsZV1cblxuICAgIC8vIHJlbmRlciBqdXN0IGZpbGUgdGhhdCBjaGFuZ2VkXG4gICAgaWYgKGlzU3RhdGljKGZpbGUpKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZFN0YXRpY0ZpbGVzKFtmaWxlXSwgY29uZmlnLCBzdGF0aWNGaWxlc01hcClcbiAgICAgIHN0YXRpY0ZpbGVzTWFwID0gbWVyZ2Uoe30sIHN0YXRpY0ZpbGVzTWFwLCByZXN1bHQuc3RhdGljRmlsZXNNYXApXG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGR5bmFtaWMgZW50cnkgd2l0aCBBTEwgZHluYW1pYyBmaWxlc1xuICAgIHVwZGF0ZUxhbWJkYXMoZXhpc3RpbmcuZmlsdGVyKGlzRHluYW1pYyksIGNvbmZpZylcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkRmlsZXMoZmlsZXM6IHN0cmluZ1tdLCBleGlzdGluZzogc3RyaW5nW10sIGNvbmZpZzogQ29uZmlnKSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBhd2FpdCBidWlsZEZpbGUoZmlsZSwgZXhpc3RpbmcsIGNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0YW50OiBpZiB3ZSBldmVyIHJlbW92ZSBpbml0aWFsIHJlbmRlcmluZywgd2Ugd2lsbCBuZWVkIHRvXG4gICAqIHJlLWludHJvZHVjZSBcImZpbGUgcHJpbWluZ1wiIHdoZXJlIHdlIHJlcXVpcmUgYWxsIGZpbGVzIGFuZCBzdXJmYWNlIGVycm9yc1xuICAgKiBvbiBzdGFydHVwLlxuICAgKi9cbiAgYXdhaXQgYnVpbGRGaWxlcyhmaWxlcywgZmlsZXMsIGNvbmZpZylcbiAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcblxuICAvKlxuICAgKiBGaWxld2F0Y2hlciB3YXRjaGVzIG9ubHkgcHJlc3RhIGZpbGVzLiBJdCBoYW5kbGVzIGNoYW5nZSBhbmQgcmVtb3ZlXG4gICAqIGV2ZW50cywgYXMgd2VsbCBhcyBzdXJmYWNlcyBkZXBlbmRlbmN5IHRyZWUgdHJhdmVyc2FsIGVycm9yc1xuICAgKi9cbiAgY29uc3QgZmlsZVdhdGNoZXIgPSBjcmVhdGUoeyBhbGlhczogeyAnQCc6IHByb2Nlc3MuY3dkKCkgfSB9KVxuXG4gIGZpbGVXYXRjaGVyLm9uQ2hhbmdlKGFzeW5jIChjaGFuZ2VkKSA9PiB7XG4gICAgYXdhaXQgYnVpbGRGaWxlcyhjaGFuZ2VkLCBmaWxlcywgY29uZmlnKVxuICAgIGhvb2tzLmVtaXRCcm93c2VyUmVmcmVzaCgpXG4gIH0pXG5cbiAgZmlsZVdhdGNoZXIub25SZW1vdmUoYXN5bmMgKFtpZF0pID0+IHtcbiAgICBsb2dnZXIuZGVidWcoeyBsYWJlbDogJ3dhdGNoJywgbWVzc2FnZTogYHJlbW92ZWQgJHtpZH1gIH0pXG5cbiAgICAvLyByZW1vdmUgZnJvbSBsb2NhbCBoYXNoXG4gICAgZmlsZXMuc3BsaWNlKGZpbGVzLmluZGV4T2YoaWQpLCAxKVxuXG4gICAgLy8gdXBkYXRlIHRoaXMgcmVnYXJkbGVzcywgbm90IHN1cmUgaWYgW2lkXSB3YXMgZHluYW1pYyBvciBzdGF0aWNcbiAgICB1cGRhdGVMYW1iZGFzKGZpbGVzLmZpbHRlcihpc0R5bmFtaWMpLCBjb25maWcpXG4gICAgOyhzdGF0aWNGaWxlc01hcFtpZF0gfHwgW10pLmZvckVhY2goKGZpbGUpID0+IHJlbW92ZUJ1aWx0U3RhdGljRmlsZShwYXRoLmpvaW4oY29uZmlnLnN0YXRpY091dHB1dERpciwgZmlsZSkpKVxuXG4gICAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfSlcblxuICBmaWxlV2F0Y2hlci5vbkVycm9yKChlKSA9PiB7XG4gICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgZXJyb3I6IHR5cGVvZiBlID09PSAnc3RyaW5nJyA/IG5ldyBFcnJvcihlKSA6IGUsXG4gICAgfSlcbiAgfSlcblxuICBhd2FpdCBmaWxlV2F0Y2hlci5hZGQoZmlsZXMpXG5cbiAgLypcbiAgICogZ2xvYmFsV2F0Y2hlciB3YXRjaGVzIHRoZSByYXcgZmlsZSBnbG9icyBwYXNzZWQgdG8gdGhlIENMSSBvciBhcyBgZmlsZXNgXG4gICAqIGluIHRoZSBjb25maWcuIElmIGNoZWNrcyBvbiBhZGQvY2hhbmdlIHRvIHNlZSBpZiBhIGZpbGUgc2hvdWxkIGJlIHVwZ3JhZGVkXG4gICAqIHRvIGEgYSBQcmVzdGEgc291cmNlIGZpbGUsIGFuZCBhZGRlZCB0byB0aGUgZmlsZVdhdGNoZXIuXG4gICAqL1xuICBjb25zdCBnbG9iYWxXYXRjaGVyID0gY2hva2lkYXIud2F0Y2gocHJvY2Vzcy5jd2QoKSwge1xuICAgIGlnbm9yZUluaXRpYWw6IHRydWUsXG4gICAgaWdub3JlZDogW2NvbmZpZy5vdXRwdXQsIGNvbmZpZy5hc3NldHNdLFxuICB9KVxuXG4gIGdsb2JhbFdhdGNoZXIub24oJ2FkZCcsIGFzeW5jIChmaWxlKSA9PiB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGUpIHx8IGZzLmxzdGF0U3luYyhmaWxlKS5pc0RpcmVjdG9yeSgpKSByZXR1cm5cbiAgICBpZiAoIWlzTmV3VmFsaWRGaWxlKGZpbGUsIGNvbmZpZy5maWxlcywgZmlsZXMpKSByZXR1cm5cblxuICAgIGxvZ2dlci5kZWJ1Zyh7IGxhYmVsOiAnd2F0Y2gnLCBtZXNzYWdlOiBgYWRkICR7ZmlsZX1gIH0pXG5cbiAgICBmaWxlcy5wdXNoKGZpbGUpXG4gICAgYXdhaXQgZmlsZVdhdGNoZXIuYWRkKGZpbGUpXG5cbiAgICBhd2FpdCBidWlsZEZpbGUoZmlsZSwgZmlsZXMsIGNvbmZpZylcblxuICAgIGhvb2tzLmVtaXRCcm93c2VyUmVmcmVzaCgpXG4gIH0pXG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIGV2ZW50cyBmcm9tIHBsdWdpbnMgcmVxdWVzdGluZyBhIGZpbGUgdG8gYmUgYnVpbHRcbiAgICovXG4gIGhvb2tzLm9uQnVpbGRGaWxlKGFzeW5jICh7IGZpbGUgfSkgPT4ge1xuICAgIGF3YWl0IGJ1aWxkRmlsZShmaWxlLCBmaWxlcywgY29uZmlnKVxuICAgIGhvb2tzLmVtaXRCcm93c2VyUmVmcmVzaCgpXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgIGF3YWl0IGZpbGVXYXRjaGVyLmNsb3NlKClcbiAgICAgIGF3YWl0IGdsb2JhbFdhdGNoZXIuY2xvc2UoKVxuICAgIH0sXG4gIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHJzb3J0IGZyb20gJ3JvdXRlLXNvcnQnXG5pbXBvcnQgeyBoYXNoQ29udGVudCB9IGZyb20gJ0BwcmVzdGEvdXRpbHMnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBzbHVnaWZ5KGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZpbGVuYW1lXG4gICAgLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpIC8vIC9wYWdlcy9GaWxlLnBhZ2UuanNcbiAgICAuc3BsaXQoJy4nKSAvLyBleHRlbnNpb24sIFsvcGFnZXMvRmlsZSwgcGFnZSwganNdXG4gICAgLnJldmVyc2UoKVxuICAgIC5zbGljZSgxKVxuICAgIC5yZXZlcnNlKClcbiAgICAuam9pbignLScpIC8vIC9wYWdlcy9GaWxlLnBhZ2VcbiAgICAuc3BsaXQoJy8nKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuam9pbignLScpIC8vIHBhZ2VzLUZpbGUtcGFnZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb3V0cHV0TGFtYmRhcyhpbnB1dHM6IHN0cmluZ1tdLCBjb25maWc6IENvbmZpZykge1xuICBjb25zdCBsYW1iZGFzID0gaW5wdXRzXG4gICAgLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgcm91dGUgfSA9IHJlcXVpcmUoaW5wdXQpXG4gICAgICAgIGNvbnN0IG5hbWUgPSBzbHVnaWZ5KGlucHV0KVxuICAgICAgICBjb25zdCBvdXRwdXQgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgY29uZmlnLmZ1bmN0aW9uc091dHB1dERpcixcbiAgICAgICAgICBjb25maWcuZW52ID09PSBFbnYuUFJPRFVDVElPTlxuICAgICAgICAgICAgPyBuYW1lICsgJy0nICsgaGFzaENvbnRlbnQoZnMucmVhZEZpbGVTeW5jKGlucHV0LCAndXRmOCcpKSArICcuanMnXG4gICAgICAgICAgICA6IG5hbWUgKyAnLmpzJ1xuICAgICAgICApXG5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgICAgICBtZXNzYWdlOiBgZ2VuZXJhdGluZyAke25hbWV9IGxhbWJkYWAsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gaW1wb3J0YW50IGZvciB3YXRjaCB0YXNrXG4gICAgICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW2lucHV0XVxuICAgICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtvdXRwdXRdXG5cbiAgICAgICAgZnMub3V0cHV0RmlsZVN5bmMoXG4gICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgIGBpbXBvcnQgeyB3cmFwSGFuZGxlciB9IGZyb20gJ3ByZXN0YS9kaXN0L3dyYXBIYW5kbGVyJztcbiAgICAgIGltcG9ydCAqIGFzIGZpbGUgZnJvbSAnJHtpbnB1dH0nO1xuICAgICAgZXhwb3J0IGNvbnN0IHJvdXRlID0gZmlsZS5yb3V0ZVxuICAgICAgZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSB3cmFwSGFuZGxlcihmaWxlKWBcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBbcm91dGUsIG91dHB1dF1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgW3N0cmluZywgc3RyaW5nXVtdXG5cbiAgY29uc3Qgc29ydGVkID0gcnNvcnQobGFtYmRhcy5tYXAoKGwpID0+IGxbMF0pKVxuICBjb25zdCBtYW5pZmVzdDogeyBbcm91dGU6IHN0cmluZ106IHN0cmluZyB9ID0ge31cblxuICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNvcnRlZCkge1xuICAgIGNvbnN0IG1hdGNoID0gbGFtYmRhcy5maW5kKChsKSA9PiBsWzBdID09PSByb3V0ZSlcblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgbWFuaWZlc3Rbcm91dGVdID0gbWF0Y2hbMV1cbiAgICB9XG4gIH1cblxuICBmcy5vdXRwdXRGaWxlU3luYyhjb25maWcuZnVuY3Rpb25zTWFuaWZlc3QsIEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0KSlcblxuICByZXR1cm4gbGFtYmRhc1xufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZ2xvYlN5bmMgZnJvbSAndGlueS1nbG9iL3N5bmMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0R5bmFtaWMoZmlsZTogc3RyaW5nKSB7XG4gIHJldHVybiAvZXhwb3J0XFxzLitcXHNyb3V0ZVxccytcXD0vLnRlc3QoZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdGF0aWMoZmlsZTogc3RyaW5nKSB7XG4gIHJldHVybiAvZXhwb3J0XFxzLitcXHNnZXRTdGF0aWNQYXRocy8udGVzdChmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlcyhmaWxlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoW10gYXMgc3RyaW5nW10pXG4gICAgLmNvbmNhdChmaWxlcylcbiAgICAubWFwKChmaWxlKSA9PiBnbG9iU3luYyhmaWxlKSlcbiAgICAuZmxhdCgpXG4gICAgLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGZpbGUpKSAvLyBtYWtlIGFic29sdXRlXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXG5pbXBvcnQgeyB0aW1lciB9IGZyb20gJ0BwcmVzdGEvdXRpbHMnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IGdldFJvdXRlUGFyYW1zIH0gZnJvbSAnLi9nZXRSb3V0ZVBhcmFtcydcbmltcG9ydCB7IG5vcm1hbGl6ZVJlc3BvbnNlIH0gZnJvbSAnLi9ub3JtYWxpemVSZXNwb25zZSdcbmltcG9ydCB7IGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQgfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZydcblxuZXhwb3J0IHR5cGUgU3RhdGljRmlsZXNNYXAgPSB7IFtmaWxlbmFtZTogc3RyaW5nXTogc3RyaW5nW10gfVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aG5hbWVUb0ZpbGUocGF0aG5hbWU6IHN0cmluZywgZXh0ID0gJ2h0bWwnKSB7XG4gIHJldHVybiAhIXBhdGguZXh0bmFtZShwYXRobmFtZSlcbiAgICA/IHBhdGhuYW1lIC8vIGlmIHBhdGggaGFzIGV4dGVuc2lvbiwgdXNlIGl0XG4gICAgOiBleHQgPT09ICdodG1sJ1xuICAgID8gYCR7cGF0aG5hbWV9L2luZGV4Lmh0bWxgIC8vIGlmIEhUTUwgaXMgaW5mZXJyZWQsIGNyZWF0ZSBpbmRleFxuICAgIDogYCR7cGF0aG5hbWV9LiR7ZXh0fWAgLy8gYW55dGhpbmcgYnV0IEhUTUwgd2lsbCBuZWVkIGFuIGV4dGVuc2lvbiwgb3RoZXJ3aXNlIGJyb3dzZXJzIHdpbGwgcmVuZGVyIGFzIHRleHRcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUJ1aWx0U3RhdGljRmlsZShmaWxlOiBzdHJpbmcpIHtcbiAgbG9nZ2VyLmRlYnVnKHtcbiAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICBtZXNzYWdlOiBgcmVtb3Zpbmcgb2xkIHN0YXRpYyBmaWxlICR7ZmlsZX1gLFxuICB9KVxuXG4gIHJldHVybiBmcy5yZW1vdmUoZmlsZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUJ1aWx0U3RhdGljRmlsZXMoZmlsZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChmaWxlcy5tYXAocmVtb3ZlQnVpbHRTdGF0aWNGaWxlKSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkU3RhdGljRmlsZShmaWxlOiBzdHJpbmcsIG91dHB1dDogc3RyaW5nLCB7IGZvb3RlciB9OiB7IGZvb3Rlcjogc3RyaW5nIH0pIHtcbiAgY29uc3QgbGFtYmRhID0gcmVxdWlyZShmaWxlKVxuICBjb25zdCBwYXRocyA9IGF3YWl0IGxhbWJkYS5nZXRTdGF0aWNQYXRocygpXG5cbiAgY29uc3QgYnVpbHRGaWxlczogc3RyaW5nW10gPSBbXVxuXG4gIGlmICghcGF0aHMgfHwgIXBhdGhzLmxlbmd0aCkgcmV0dXJuIGJ1aWx0RmlsZXNcblxuICBmb3IgKGNvbnN0IHVybCBvZiBwYXRocykge1xuICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIHBhdGg6IHVybCxcbiAgICAgIHBhdGhQYXJhbWV0ZXJzOiBsYW1iZGEucm91dGUgPyBnZXRSb3V0ZVBhcmFtcyh1cmwsIGxhbWJkYS5yb3V0ZSkgOiB7fSxcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IG5vcm1hbGl6ZVJlc3BvbnNlKGF3YWl0IGxhbWJkYS5oYW5kbGVyKGV2ZW50LCB7fSkpXG4gICAgY29uc3QgdHlwZSA9IChyZXNwb25zZT8uaGVhZGVycyB8fCB7fSlbJ2NvbnRlbnQtdHlwZSddXG4gICAgY29uc3QgZXh0ID0gbWltZS5leHRlbnNpb24odHlwZSBhcyBzdHJpbmcpIHx8ICdodG1sJ1xuICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aG5hbWVUb0ZpbGUodXJsLCBleHQpXG4gICAgY29uc3QgaHRtbCA9IHJlc3BvbnNlLmJvZHkgKyAoZXh0ID09PSAnaHRtbCcgPyBmb290ZXIgOiAnJylcbiAgICBjb25zdCBvdXRmaWxlID0gcGF0aC5qb2luKG91dHB1dCwgZmlsZW5hbWUpXG5cbiAgICBmcy5vdXRwdXRGaWxlU3luYyhvdXRmaWxlLCBodG1sLCAndXRmLTgnKVxuXG4gICAgbG9nZ2VyLmluZm8oe1xuICAgICAgbGFiZWw6ICdidWlsdCcsXG4gICAgICBtZXNzYWdlOiB1cmwsXG4gICAgICBkdXJhdGlvbjogdGltZSgpLFxuICAgIH0pXG5cbiAgICBidWlsdEZpbGVzLnB1c2gob3V0ZmlsZSlcbiAgfVxuXG4gIHJldHVybiBidWlsdEZpbGVzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFN0YXRpY0ZpbGVzKGZpbGVzOiBzdHJpbmdbXSwgY29uZmlnOiBDb25maWcsIHN0YXRpY0ZpbGVzTWFwOiBTdGF0aWNGaWxlc01hcCA9IHt9KSB7XG4gIGNvbnN0IGlzRGV2ID0gY29uZmlnLmVudiA9PT0gRW52LkRFVkVMT1BNRU5UXG4gIGNvbnN0IG91dHB1dCA9IGNvbmZpZy5zdGF0aWNPdXRwdXREaXJcbiAgY29uc3QgZm9vdGVyID0gaXNEZXYgPyBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0KHsgcG9ydDogY29uZmlnLnBvcnQgfSkgOiAnJ1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IGZpbGUucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJylcbiAgICAgIGNvbnN0IHByZXZCdWlsdEZpbGVzID0gc3RhdGljRmlsZXNNYXBbZmlsZV0gfHwgW11cbiAgICAgIGNvbnN0IGJ1aWx0RmlsZXMgPSBhd2FpdCBidWlsZFN0YXRpY0ZpbGUoZmlsZSwgb3V0cHV0LCB7IGZvb3RlciB9KVxuXG4gICAgICBpZiAoIWJ1aWx0RmlsZXMgfHwgIWJ1aWx0RmlsZXMubGVuZ3RoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKHtcbiAgICAgICAgICBsYWJlbDogJ3BhdGhzJyxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtmaWxlbmFtZX0gLSBubyBwYXRocyB0byByZW5kZXJgLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJlbW92ZUJ1aWx0U3RhdGljRmlsZXMocHJldkJ1aWx0RmlsZXMpXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gZGlmZiBhbmQgcmVtb3ZlIGZpbGVzXG4gICAgICBmb3IgKGNvbnN0IHByZXYgb2YgcHJldkJ1aWx0RmlsZXMpIHtcbiAgICAgICAgaWYgKCFidWlsdEZpbGVzLmluY2x1ZGVzKHByZXYpKSB7XG4gICAgICAgICAgcmVtb3ZlQnVpbHRTdGF0aWNGaWxlKHByZXYpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3RhdGljRmlsZXNNYXBbZmlsZV0gPSBidWlsdEZpbGVzXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yKHsgbGFiZWw6ICdlcnJvcicsIGVycm9yOiBlIGFzIEVycm9yIH0pXG5cbiAgICAgIC8vIGV4aXQgbG9vcCBvbiBhbnkgZXJyb3JcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGF0aWNGaWxlc01hcCxcbiAgfVxufVxuIiwgImltcG9ydCB0b1JlZ0V4cCBmcm9tICdyZWdleHBhcmFtJ1xuXG5pbXBvcnQgeyBQYXRoUGFyYW1ldGVycyB9IGZyb20gJy4vbGFtYmRhJ1xuXG4vLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQvcmVnZXhwYXJhbSN1c2FnZVxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdXRlUGFyYW1zKHVybDogc3RyaW5nLCByb3V0ZTogc3RyaW5nKTogUGF0aFBhcmFtZXRlcnMge1xuICBjb25zdCBbcGF0aF0gPSB1cmwuc3BsaXQoJz8nKVxuICBjb25zdCByZXN1bHQgPSB0b1JlZ0V4cChyb3V0ZSlcbiAgbGV0IGkgPSAwXG4gIGxldCBvdXQ6IFBhdGhQYXJhbWV0ZXJzID0ge31cbiAgbGV0IG1hdGNoZXMgPSByZXN1bHQucGF0dGVybi5leGVjKHBhdGgpIHx8IFtdXG5cbiAgd2hpbGUgKGkgPCByZXN1bHQua2V5cy5sZW5ndGgpIHtcbiAgICBvdXRbcmVzdWx0LmtleXNbaV1dID0gbWF0Y2hlc1srK2ldXG4gIH1cblxuICByZXR1cm4gb3V0XG59XG4iLCAiLyoqXG4gKiBUSElTIElTIFBST0QgQ09ERSwgQkUgQ0FSRUZVTCBXSEFUIFlPVSBBREQgVE8gVEhJUyBGSUxFXG4gKi9cblxuaW1wb3J0IHsgUmVzcG9uc2UgYXMgTGFtYmRhUmVzcG9uc2UgfSBmcm9tICdsYW1iZGEtdHlwZXMnXG5pbXBvcnQgeyBSZXNwb25zZSwgSGVhZGVycyB9IGZyb20gJy4vbGFtYmRhJ1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqOiBvYmplY3QgfCBzdHJpbmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkob2JqKSA6IG9ialxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmVzcG9uc2UocmVzcG9uc2U6IFBhcnRpYWw8UmVzcG9uc2U+IHwgc3RyaW5nKTogTGFtYmRhUmVzcG9uc2Uge1xuICBjb25zdCB7XG4gICAgaXNCYXNlNjRFbmNvZGVkID0gZmFsc2UsXG4gICAgc3RhdHVzQ29kZSA9IDIwMCxcbiAgICBoZWFkZXJzID0ge30sXG4gICAgbXVsdGlWYWx1ZUhlYWRlcnMgPSB7fSxcbiAgICBib2R5ID0gJycsXG4gICAgaHRtbCA9IHVuZGVmaW5lZCxcbiAgICBqc29uID0gdW5kZWZpbmVkLFxuICAgIHhtbCA9IHVuZGVmaW5lZCxcbiAgfSA9IHR5cGVvZiByZXNwb25zZSA9PT0gJ3N0cmluZydcbiAgICA/IHtcbiAgICAgICAgYm9keTogcmVzcG9uc2UsXG4gICAgICB9XG4gICAgOiByZXNwb25zZVxuXG4gIGxldCBjb250ZW50VHlwZSA9ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnXG5cbiAgaWYgKCEhanNvbikge1xuICAgIGNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnXG4gIH0gZWxzZSBpZiAoISF4bWwpIHtcbiAgICBjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLTgnXG4gIH1cblxuICBjb25zdCByYXdIZWFkZXJzOiBIZWFkZXJzID0ge1xuICAgICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSxcbiAgICAuLi5oZWFkZXJzLFxuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRIZWFkZXJzOiBMYW1iZGFSZXNwb25zZVsnaGVhZGVycyddID0ge31cblxuICBmb3IgKGNvbnN0IGhlYWRlciBvZiBPYmplY3Qua2V5cyhyYXdIZWFkZXJzKSkge1xuICAgIGNvbnN0IGtleSA9IGhlYWRlci50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgdmFsdWUgPSByYXdIZWFkZXJzW2hlYWRlcl1cbiAgICBub3JtYWxpemVkSGVhZGVyc1trZXldID0gdmFsdWUgfHwgJydcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaXNCYXNlNjRFbmNvZGVkLFxuICAgIHN0YXR1c0NvZGUsXG4gICAgaGVhZGVyczogbm9ybWFsaXplZEhlYWRlcnMsXG4gICAgbXVsdGlWYWx1ZUhlYWRlcnMsXG4gICAgYm9keTogc3RyaW5naWZ5KGJvZHkgfHwgaHRtbCB8fCBqc29uIHx8IHhtbCB8fCAnJyksXG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCh7IHBvcnQgfTogeyBwb3J0OiBudW1iZXIgfSkge1xuICByZXR1cm4gYFxuICAgIDxzY3JpcHQ+XG4gICAgICAoZnVuY3Rpb24gKGdsb2JhbCkge1xuICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFdlYlNvY2tldCgnd3M6Ly9sb2NhbGhvc3Q6JHtwb3J0fScpO1xuXG4gICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1twcmVzdGFdIGNvbm5lY3RlZCBvbiBwb3J0ICR7cG9ydH0nKVxuICAgICAgICB9KTtcblxuICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxcYCdbcHJlc3RhXSByZWNlaXZlZCBcXCRcXHtldmVudC5kYXRhXFx9XFxgKVxuICAgICAgICAgIGlmIChldmVudC5kYXRhID09PSAncmVmcmVzaCcpIHtcbiAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW3ByZXN0YV0gZGlzY29ubmVjdGVkJylcbiAgICAgICAgfSk7XG4gICAgICB9KSh0aGlzKTtcbiAgICA8L3NjcmlwdD5cbiAgYFxufVxuIiwgImltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IEhvb2tzIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5cbmV4cG9ydCB0eXBlIFBsdWdpbkludGVyZmFjZSA9IHtcbiAgY2xlYW51cD8oKTogdm9pZFxufVxuZXhwb3J0IHR5cGUgUGx1Z2luID0gKGNvbmZpZzogQ29uZmlnLCBob29rczogSG9va3MpID0+IFByb21pc2U8UGx1Z2luSW50ZXJmYWNlIHwgdm9pZD4gfCBQbHVnaW5JbnRlcmZhY2UgfCB2b2lkXG5leHBvcnQgdHlwZSBQbHVnaW5Jbml0ID0gKC4uLnByb3BzOiBhbnkpID0+IFBsdWdpblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGx1Z2luKGluaXQ6IFBsdWdpbkluaXQpIHtcbiAgcmV0dXJuIGluaXRcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRQbHVnaW5zKHBsdWdpbnM6IFBsdWdpbltdLCBpbnN0YW5jZTogQ29uZmlnLCBob29rczogSG9va3MpIHtcbiAgY29uc3QgaW5zdGFudGlhdGVkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcGx1Z2luc1xuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBwKGluc3RhbmNlLCBob29rcylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFBsdWdpbkludGVyZmFjZVtdXG4gIClcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNsZWFudXAoKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaW5zdGFudGlhdGVkLm1hcCgocCkgPT4gcCAmJiBwLmNsZWFudXAgJiYgcC5jbGVhbnVwKCkpKVxuICAgIH0sXG4gIH1cbn1cbiIsICJleHBvcnQgZW51bSBFdmVudHMge1xuICBQb3N0QnVpbGQgPSAncG9zdC1idWlsZCcsXG4gIEJ1aWxkRmlsZSA9ICdidWlsZC1maWxlJyxcbiAgQnJvd3NlclJlZnJlc2ggPSAnYnJvd3Nlci1yZWZyZXNoJyxcbn1cblxuZXhwb3J0IHR5cGUgQ2FsbGFibGUgPSAoLi4uYXJnczogYW55W10pID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgSG9va1Bvc3RCdWlsZFBheWxvYWQgPSB7XG4gIG91dHB1dDogc3RyaW5nXG4gIHN0YXRpY091dHB1dDogc3RyaW5nXG4gIGZ1bmN0aW9uc091dHB1dDogc3RyaW5nXG4gIGZ1bmN0aW9uc01hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmV4cG9ydCB0eXBlIEhvb2tCdWlsZEZpbGVQYXlsb2FkID0ge1xuICBmaWxlOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgRGVzdHJveUhvb2tDYWxsYmFjayA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgSG9va3MgPSB7XG4gIGVtaXRQb3N0QnVpbGQocHJvcHM6IEhvb2tQb3N0QnVpbGRQYXlsb2FkKTogdm9pZFxuICBvblBvc3RCdWlsZChjYjogKHByb3BzOiBIb29rUG9zdEJ1aWxkUGF5bG9hZCkgPT4gdm9pZCk6IERlc3Ryb3lIb29rQ2FsbGJhY2tcbiAgZW1pdEJ1aWxkRmlsZShwcm9wczogSG9va0J1aWxkRmlsZVBheWxvYWQpOiB2b2lkXG4gIG9uQnVpbGRGaWxlKGNiOiAocHJvcHM6IEhvb2tCdWlsZEZpbGVQYXlsb2FkKSA9PiB2b2lkKTogRGVzdHJveUhvb2tDYWxsYmFja1xuICBlbWl0QnJvd3NlclJlZnJlc2goKTogdm9pZFxuICBvbkJyb3dzZXJSZWZyZXNoKGNiOiAoKSA9PiB2b2lkKTogRGVzdHJveUhvb2tDYWxsYmFja1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgbGV0IGV2ZW50czogeyBbZXZlbnQ6IHN0cmluZ106IENhbGxhYmxlW10gfSA9IHt9XG5cbiAgZnVuY3Rpb24gZW1pdChldjogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGV2ZW50c1tldl0gPyBldmVudHNbZXZdLm1hcCgoZm46IENhbGxhYmxlKSA9PiBmbiguLi5hcmdzKSkgOiBbXVxuICB9XG5cbiAgZnVuY3Rpb24gb24oZXY6IHN0cmluZywgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGV2ZW50c1tldl0gPSBldmVudHNbZXZdID8gZXZlbnRzW2V2XS5jb25jYXQoZm4pIDogW2ZuXVxuICAgIHJldHVybiAoKSA9PiBldmVudHNbZXZdLnNwbGljZShldmVudHNbZXZdLmluZGV4T2YoZm4pLCAxKVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZXZlbnRzID0ge31cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbmVycyhldjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGV2ZW50c1tldl0gfHwgW11cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW1pdCxcbiAgICBvbixcbiAgICBjbGVhcixcbiAgICBsaXN0ZW5lcnMsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2tzKGVtaXR0ZXI6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUVtaXR0ZXI+KTogSG9va3Mge1xuICByZXR1cm4ge1xuICAgIGVtaXRQb3N0QnVpbGQocHJvcHMpIHtcbiAgICAgIGVtaXR0ZXIuZW1pdCgncG9zdEJ1aWxkJywgcHJvcHMpXG4gICAgfSxcbiAgICBvblBvc3RCdWlsZChjYikge1xuICAgICAgcmV0dXJuIGVtaXR0ZXIub24oJ3Bvc3RCdWlsZCcsIGNiKVxuICAgIH0sXG4gICAgZW1pdEJ1aWxkRmlsZShwcm9wcykge1xuICAgICAgZW1pdHRlci5lbWl0KCdidWlsZEZpbGUnLCBwcm9wcylcbiAgICB9LFxuICAgIG9uQnVpbGRGaWxlKGNiKSB7XG4gICAgICByZXR1cm4gZW1pdHRlci5vbignYnVpbGRGaWxlJywgY2IpXG4gICAgfSxcbiAgICBlbWl0QnJvd3NlclJlZnJlc2goKSB7XG4gICAgICBlbWl0dGVyLmVtaXQoJ2Jyb3dzZXJSZWZyZXNoJylcbiAgICB9LFxuICAgIG9uQnJvd3NlclJlZnJlc2goY2IpIHtcbiAgICAgIHJldHVybiBlbWl0dGVyLm9uKCdicm93c2VyUmVmcmVzaCcsIGNiKVxuICAgIH0sXG4gIH1cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHsgYnVpbGQgYXMgZXNidWlsZCB9IGZyb20gJ2VzYnVpbGQnXG5pbXBvcnQgeyByZXF1aXJlU2FmZSwgdGltZXIgfSBmcm9tICdAcHJlc3RhL3V0aWxzJ1xuXG5pbXBvcnQgeyBvdXRwdXRMYW1iZGFzIH0gZnJvbSAnLi9vdXRwdXRMYW1iZGFzJ1xuaW1wb3J0IHsgZ2V0RmlsZXMsIGlzU3RhdGljLCBpc0R5bmFtaWMgfSBmcm9tICcuL2dldEZpbGVzJ1xuaW1wb3J0IHsgYnVpbGRTdGF0aWNGaWxlcyB9IGZyb20gJy4vYnVpbGRTdGF0aWNGaWxlcydcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgSG9va3MgfSBmcm9tICcuL2NyZWF0ZUVtaXR0ZXInXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChjb25maWc6IENvbmZpZywgaG9va3M6IEhvb2tzKSB7XG4gIGNvbnN0IHRvdGFsVGltZSA9IHRpbWVyKClcbiAgY29uc3QgZmlsZXMgPSBnZXRGaWxlcyhjb25maWcuZmlsZXMpXG4gIGNvbnN0IHN0YXRpY0lkcyA9IGZpbGVzLmZpbHRlcihpc1N0YXRpYylcbiAgY29uc3QgZHluYW1pY0lkcyA9IGZpbGVzLmZpbHRlcihpc0R5bmFtaWMpXG5cbiAgbG9nZ2VyLmRlYnVnKHtcbiAgICBsYWJlbDogJ2J1aWxkJyxcbiAgICBtZXNzYWdlOiAnc3RhcnRpbmcgYnVpbGQnLFxuICB9KVxuXG4gIGlmICghc3RhdGljSWRzLmxlbmd0aCAmJiAhZHluYW1pY0lkcy5sZW5ndGgpIHtcbiAgICBsb2dnZXIud2Fybih7XG4gICAgICBsYWJlbDogJ2ZpbGVzJyxcbiAgICAgIG1lc3NhZ2U6ICdubyBmaWxlcyB3ZXJlIGZvdW5kLCBub3RoaW5nIHRvIGJ1aWxkJyxcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIGxldCBzdGF0aWNUaW1lID0gJydcbiAgICBsZXQgc3RhdGljRmlsZUFtb3VudCA9IDBcbiAgICBsZXQgZHluYW1pY1RpbWUgPSAnJ1xuICAgIGxldCBjb3B5VGltZSA9ICcnXG5cbiAgICBjb25zdCB0YXNrcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoc3RhdGljSWRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgICAgICAgICBjb25zdCB7IHN0YXRpY0ZpbGVzTWFwIH0gPSBhd2FpdCBidWlsZFN0YXRpY0ZpbGVzKHN0YXRpY0lkcywgY29uZmlnKVxuXG4gICAgICAgICAgc3RhdGljVGltZSA9IHRpbWUoKVxuICAgICAgICAgIHN0YXRpY0ZpbGVBbW91bnQgPSBPYmplY3Qua2V5cyhzdGF0aWNGaWxlc01hcCkucmVkdWNlKChjb3VudCwga2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKGNvdW50ICs9IHN0YXRpY0ZpbGVzTWFwW2tleV0ubGVuZ3RoKVxuICAgICAgICAgIH0sIDApXG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoZHluYW1pY0lkcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuICAgICAgICAgIGNvbnN0IHBrZyA9IHJlcXVpcmVTYWZlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAncGFja2FnZS5qc29uJykpXG5cbiAgICAgICAgICBvdXRwdXRMYW1iZGFzKGR5bmFtaWNJZHMsIGNvbmZpZylcblxuICAgICAgICAgIGF3YWl0IGVzYnVpbGQoe1xuICAgICAgICAgICAgZW50cnlQb2ludHM6IE9iamVjdC52YWx1ZXMocmVxdWlyZShjb25maWcuZnVuY3Rpb25zTWFuaWZlc3QpKSxcbiAgICAgICAgICAgIG91dGRpcjogY29uZmlnLmZ1bmN0aW9uc091dHB1dERpcixcbiAgICAgICAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICAgICAgICB0YXJnZXQ6IFsnbm9kZTEyJ10sXG4gICAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgICBhbGxvd092ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGV4dGVybmFsOiBPYmplY3Qua2V5cyhwa2cuZGVwZW5kZW5jaWVzIHx8IHt9KSxcbiAgICAgICAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlZmluZToge1xuICAgICAgICAgICAgICAncHJvY2Vzcy5lbnYuUFJFU1RBX1NFUlZFUkxFU1NfUlVOVElNRSc6ICd0cnVlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGR5bmFtaWNUaW1lID0gdGltZSgpXG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWcuYXNzZXRzKSkge1xuICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgICAgICAgICBmcy5jb3B5U3luYyhjb25maWcuYXNzZXRzLCBjb25maWcuc3RhdGljT3V0cHV0RGlyKVxuXG4gICAgICAgICAgY29weVRpbWUgPSB0aW1lKClcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICBdKVxuXG4gICAgLy8gc2luY2Ugd2UncmUgYnVpbGRpbmcgKG5vdCB3YXRjaCkgaWYgYW55IHRhc2sgZmFpbHMsIGV4aXQgd2l0aCBlcnJvclxuICAgIGlmICh0YXNrcy5maW5kKCh0YXNrKSA9PiB0YXNrLnN0YXR1cyA9PT0gJ3JlamVjdGVkJykpIHtcbiAgICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICAgIGxhYmVsOiAnYnVpbGQnLFxuICAgICAgICBtZXNzYWdlOiAnYnVpbGQgcGFydGlhbGx5IGZhaWxlZCcsXG4gICAgICB9KVxuXG4gICAgICAvLyBsb2cgb3V0IGVycm9yc1xuICAgICAgdGFza3MuZm9yRWFjaCgodGFzaykgPT4ge1xuICAgICAgICBpZiAodGFzay5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAvLyBUT0RPIGNhbiBzd2FsbG93IGVycm9ycyBpbiB0ZXN0aW5nXG4gICAgICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgZXJyb3I6IHRhc2sucmVhc29uLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJlc3RhIGJ1aWxkIGZhaWxlZCcpXG4gICAgfVxuXG4gICAgaWYgKHN0YXRpY1RpbWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdzdGF0aWMnLFxuICAgICAgICBtZXNzYWdlOiBgcmVuZGVyZWQgJHtzdGF0aWNGaWxlQW1vdW50fSBmaWxlKHMpYCxcbiAgICAgICAgZHVyYXRpb246IHN0YXRpY1RpbWUsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChkeW5hbWljVGltZSkge1xuICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICBsYWJlbDogJ2xhbWJkYScsXG4gICAgICAgIG1lc3NhZ2U6IGBjb21waWxlZCAke2R5bmFtaWNJZHMubGVuZ3RofSBmdW5jdGlvbihzKWAsXG4gICAgICAgIGR1cmF0aW9uOiBkeW5hbWljVGltZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGNvcHlUaW1lKSB7XG4gICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgIGxhYmVsOiAnYXNzZXRzJyxcbiAgICAgICAgbWVzc2FnZTogYGNvcGllZGAsXG4gICAgICAgIGR1cmF0aW9uOiBjb3B5VGltZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaG9va3MuZW1pdFBvc3RCdWlsZCh7XG4gICAgICBvdXRwdXQ6IGNvbmZpZy5vdXRwdXQsXG4gICAgICBzdGF0aWNPdXRwdXQ6IGNvbmZpZy5zdGF0aWNPdXRwdXREaXIsXG4gICAgICBmdW5jdGlvbnNPdXRwdXQ6IGNvbmZpZy5mdW5jdGlvbnNPdXRwdXREaXIsXG4gICAgICBmdW5jdGlvbnNNYW5pZmVzdDogcmVxdWlyZVNhZmUoY29uZmlnLmZ1bmN0aW9uc01hbmlmZXN0KSxcbiAgICB9KVxuXG4gICAgaWYgKHN0YXRpY1RpbWUgfHwgZHluYW1pY1RpbWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdidWlsZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBjb21wbGV0ZWAsXG4gICAgICAgIGR1cmF0aW9uOiB0b3RhbFRpbWUoKSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnbmV0J1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCdcbmltcG9ydCBzaXJ2IGZyb20gJ3NpcnYnXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xuaW1wb3J0IHRvUmVnRXhwIGZyb20gJ3JlZ2V4cGFyYW0nXG5pbXBvcnQgc3RhdHVzIGZyb20gJ3N0YXR1c2VzJ1xuaW1wb3J0IHsgV2ViU29ja2V0U2VydmVyIH0gZnJvbSAnd3MnXG5pbXBvcnQgeyB0aW1lciwgcmVxdWVzdFRvRXZlbnQsIHJlcXVpcmVGcmVzaCwgc2VuZFNlcnZlcmxlc3NSZXNwb25zZSB9IGZyb20gJ0BwcmVzdGEvdXRpbHMnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHRIdG1sUmVzcG9uc2UgfSBmcm9tICcuL2NyZWF0ZURlZmF1bHRIdG1sUmVzcG9uc2UnXG5pbXBvcnQgeyBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0IH0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7IEhhbmRsZXIsIEV2ZW50LCBSZXNwb25zZSwgQ29udGV4dCB9IGZyb20gJy4vbGFtYmRhJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyBIb29rcyB9IGZyb20gJy4vY3JlYXRlRW1pdHRlcidcbmltcG9ydCB7IG5vcm1hbGl6ZVJlc3BvbnNlIH0gZnJvbSAnLi9ub3JtYWxpemVSZXNwb25zZSdcblxuZXhwb3J0IGludGVyZmFjZSBIdHRwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHN0YXR1c0NvZGU/OiBudW1iZXJcbiAgbWVzc2FnZTogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIdHRwRXJyb3Ioc3RhdHVzQ29kZTogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpOiBIdHRwRXJyb3Ige1xuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKVxuICAvLyBAdHMtaWdub3JlXG4gIGVycm9yLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlXG4gIHJldHVybiBlcnJvclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWltZVR5cGUocmVzcG9uc2U6IFJlc3BvbnNlKSB7XG4gIGNvbnN0IHR5cGUgPSAocmVzcG9uc2U/LmhlYWRlcnMgfHwge30pWydjb250ZW50LXR5cGUnXVxuICByZXR1cm4gbWltZS5leHRlbnNpb24odHlwZSBhcyBzdHJpbmcpIHx8ICdodG1sJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZExhbWJkYUZyb01hbmlmZXN0KHVybDogc3RyaW5nLCBtYW5pZmVzdDogeyBbcm91dGU6IHN0cmluZ106IHN0cmluZyB9KTogeyBoYW5kbGVyOiBIYW5kbGVyIH0ge1xuICBjb25zdCByb3V0ZXMgPSBPYmplY3Qua2V5cyhtYW5pZmVzdClcbiAgY29uc3QgbGFtYmRhRmlsZXBhdGggPSByb3V0ZXNcbiAgICAubWFwKChyb3V0ZSkgPT4gKHtcbiAgICAgIG1hdGNoZXI6IHRvUmVnRXhwKHJvdXRlKSxcbiAgICAgIHJvdXRlLFxuICAgIH0pKVxuICAgIC5maWx0ZXIoKHsgbWF0Y2hlciB9KSA9PiB7XG4gICAgICByZXR1cm4gbWF0Y2hlci5wYXR0ZXJuLnRlc3QodXJsLnNwbGl0KCc/JylbMF0pXG4gICAgfSlcbiAgICAubWFwKCh7IHJvdXRlIH0pID0+IG1hbmlmZXN0W3JvdXRlXSlbMF1cblxuICByZXR1cm4gbGFtYmRhRmlsZXBhdGggPyByZXF1aXJlKGxhbWJkYUZpbGVwYXRoKSA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0hhbmRsZXIoZXZlbnQ6IEV2ZW50LCBsYW1iZGE6IHsgaGFuZGxlcjogSGFuZGxlciB9KSB7XG4gIGNvbnN0IGFjY2VwdCA9IGV2ZW50LmhlYWRlcnMuQWNjZXB0IHx8IGV2ZW50LmhlYWRlcnMuYWNjZXB0XG4gIGNvbnN0IGFjY2VwdHNKc29uID0gYWNjZXB0ICYmIGFjY2VwdC5pbmNsdWRlcygnanNvbicpXG5cbiAgLypcbiAgICogTm8gYXNzZXQgZmlsZSwgbm8gc3RhdGljIGZpbGUsIHRyeSBkeW5hbWljXG4gICAqL1xuICB0cnkge1xuICAgIGlmICghbGFtYmRhIHx8ICFsYW1iZGEuaGFuZGxlcikge1xuICAgICAgdGhyb3cgY3JlYXRlSHR0cEVycm9yKDQwNCwgJycpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJlc3BvbnNlKGF3YWl0IGxhbWJkYS5oYW5kbGVyKGV2ZW50LCB7IGF3c1JlcXVlc3RJZDogJ3ByZXN0YSBkZXYnIH0gYXMgQ29udGV4dCkpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zdCBlcnJvciA9IGUgYXMgSHR0cEVycm9yXG4gICAgY29uc3QgeyBzdGF0dXNDb2RlID0gNTAwIH0gPSBlcnJvclxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPiA0OTkpXG4gICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCBzdGF0dXMubWVzc2FnZVtzdGF0dXNDb2RlXSxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJlc3BvbnNlKHtcbiAgICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGUsXG4gICAgICBodG1sOiBhY2NlcHRzSnNvbiA/IHVuZGVmaW5lZCA6IGNyZWF0ZURlZmF1bHRIdG1sUmVzcG9uc2UoeyBzdGF0dXNDb2RlIH0pLFxuICAgICAganNvbjogYWNjZXB0c0pzb24gPyB7IGRldGFpbDogc3RhdHVzLm1lc3NhZ2Vbc3RhdHVzQ29kZV0gfSA6IHVuZGVmaW5lZCxcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7IHBvcnQsIGNvbmZpZyB9OiB7IHBvcnQ6IG51bWJlcjsgY29uZmlnOiBDb25maWcgfSkge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEhhbmRsZXIocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlKSB7XG4gICAgY29uc3QgdGltZSA9IHRpbWVyKClcbiAgICBjb25zdCBldmVudCA9IGF3YWl0IHJlcXVlc3RUb0V2ZW50KHJlcSkgLy8gc3RvY2sgQVdTIEV2ZW50IHNoYXBlXG4gICAgY29uc3QgbWFuaWZlc3QgPSByZXF1aXJlRnJlc2goY29uZmlnLmZ1bmN0aW9uc01hbmlmZXN0KVxuICAgIGNvbnN0IGxhbWJkYSA9IGxvYWRMYW1iZGFGcm9NYW5pZmVzdChldmVudC5wYXRoLCBtYW5pZmVzdClcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHByb2Nlc3NIYW5kbGVyKGV2ZW50LCBsYW1iZGEpXG4gICAgY29uc3QgcmVkaXIgPSByZXNwb25zZS5zdGF0dXNDb2RlID4gMjk5ICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzOTlcbiAgICBjb25zdCBtaW1lID0gZ2V0TWltZVR5cGUocmVzcG9uc2UpXG5cbiAgICBpZiAobWltZSA9PT0gJ2h0bWwnKSB7XG4gICAgICByZXNwb25zZS5ib2R5ID0gKHJlc3BvbnNlLmJvZHkgfHwgJycpLnNwbGl0KCc8L2JvZHk+JylbMF0gKyBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0KHsgcG9ydCB9KVxuICAgIH1cblxuICAgIHNlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UocmVzLCByZXNwb25zZSlcblxuICAgIGxvZ2dlcltyZXNwb25zZS5zdGF0dXNDb2RlIDwgMjk5ID8gJ2luZm8nIDogJ2Vycm9yJ10oe1xuICAgICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgICBtZXNzYWdlOiBgJHtyZXNwb25zZS5zdGF0dXNDb2RlfSAke3JlZGlyID8gcmVzcG9uc2U/LmhlYWRlcnM/LkxvY2F0aW9uIHx8IGV2ZW50LnBhdGggOiBldmVudC5wYXRofWAsXG4gICAgICBkdXJhdGlvbjogdGltZSgpLFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZlckhhbmRsZXIoeyBwb3J0LCBjb25maWcgfTogeyBwb3J0OiBudW1iZXI7IGNvbmZpZzogQ29uZmlnIH0pIHtcbiAgY29uc3Qgc3RhdGljRGlyID0gY29uZmlnLnN0YXRpY091dHB1dERpclxuICBjb25zdCBhc3NldERpciA9IGNvbmZpZy5hc3NldHNcblxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gc2VydmVIYW5kbGVyKHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSkge1xuICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG4gICAgY29uc3QgdXJsID0gcmVxLnVybCBhcyBzdHJpbmdcblxuICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2U6IGBoYW5kbGluZyAke3VybH1gLFxuICAgIH0pXG5cbiAgICAvLyBob29rIGludG8gc2lydiBmb3IgbG9nZ2luZyBvbmx5XG4gICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgZnVuY3Rpb24gc2V0SGVhZGVycyhyZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIHBhdGhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgICAgIG1lc3NhZ2U6IGAke3Jlcy5zdGF0dXNDb2RlfSAke3BhdGhuYW1lfWAsXG4gICAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgICB9KVxuICAgIH1cbiAgICAvKiBjOCBpZ25vcmUgZW5kICovXG5cbiAgICAvKiBjOCBpZ25vcmUgbmV4dCAyICovXG4gICAgc2lydihhc3NldERpciwgeyBkZXY6IHRydWUsIHNldEhlYWRlcnMgfSkocmVxLCByZXMsICgpID0+IHtcbiAgICAgIHNpcnYoc3RhdGljRGlyLCB7IGRldjogdHJ1ZSwgc2V0SGVhZGVycyB9KShyZXEsIHJlcywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7IHBvcnQsIGNvbmZpZyB9KShyZXEsIHJlcylcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VydmUoY29uZmlnOiBDb25maWcsIGhvb2tzOiBIb29rcykge1xuICBjb25zdCBwb3J0ID0gY29uZmlnLnBvcnRcbiAgY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoY3JlYXRlU2VydmVySGFuZGxlcih7IHBvcnQsIGNvbmZpZyB9KSkubGlzdGVuKHBvcnQpXG4gIGNvbnN0IHdlYnNvY2tldCA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoeyBzZXJ2ZXIgfSlcbiAgY29uc3Qgc29ja2V0czogU29ja2V0W10gPSBbXVxuXG4gIHNlcnZlci5vbignY29ubmVjdGlvbicsIChzb2NrZXQpID0+IHtcbiAgICBzb2NrZXRzLnB1c2goc29ja2V0KVxuICAgIHNvY2tldC5vbignY2xvc2UnLCAoKSA9PiBzb2NrZXRzLnNwbGljZShzb2NrZXRzLmluZGV4T2Yoc29ja2V0KSwgMSkpXG4gIH0pXG5cbiAgaG9va3Mub25Ccm93c2VyUmVmcmVzaCgoKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgIGxhYmVsOiAnZGVidWcnLFxuICAgICAgbWVzc2FnZTogYHJlZnJlc2ggZXZlbnQgcmVjZWl2ZWRgLFxuICAgIH0pXG5cbiAgICB3ZWJzb2NrZXQuY2xpZW50cy5mb3JFYWNoKCh3cykgPT4gd3Muc2VuZCgncmVmcmVzaCcpKVxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICAvLyBzbyBqdXN0IGFsd2F5cyByZXNvbHZlIE9LXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHkpID0+IHtcbiAgICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHkoMSkpXG4gICAgICAgIC8vIHNvY2tldHMgaW5jbHVkZXMgd3Mgc29ja2V0c1xuICAgICAgICBzb2NrZXRzLmZvckVhY2goKHdzKSA9PiB3cy5kZXN0cm95KCkpXG4gICAgICB9KVxuICAgIH0sXG4gIH1cbn1cbiIsICJpbXBvcnQgc3RhdHVzIGZyb20gJ3N0YXR1c2VzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZSh7IHN0YXR1c0NvZGUgfTogeyBzdGF0dXNDb2RlOiBudW1iZXIgfSkge1xuICByZXR1cm4gYDwhLS0gYnVpbHQgd2l0aCBwcmVzdGEgaHR0cHM6Ly9ucG0uaW0vcHJlc3RhIC0tPlxuICAgIDwhRE9DVFlQRSBodG1sPlxuICAgIDxodG1sPlxuICAgICAgPGhlYWQ+XG4gICAgICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xXCIgLz5cbiAgICAgICAgPHRpdGxlPiR7c3RhdHVzQ29kZX0gXHUyMDE0XHUwMEEwJHtzdGF0dXMubWVzc2FnZVtzdGF0dXNDb2RlXX08L3RpdGxlPlxuICAgICAgICA8bGluayByZWw9XCJpY29uXCIgdHlwZT1cImltYWdlL3BuZ1wiIGhyZWY9XCJodHRwczovL3ByZXN0YS5ydW4vZmF2aWNvbi5wbmdcIj5cbiAgICAgICAgPGxpbmsgcmVsPVwiaWNvblwiIHR5cGU9XCJpbWFnZS9zdmdcIiBocmVmPVwiaHR0cHM6Ly9wcmVzdGEucnVuL2Zhdmljb24uc3ZnXCI+XG4gICAgICAgIDxsaW5rIHJlbD1cInByZWNvbm5lY3RcIiBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbVwiPlxuICAgICAgICA8bGluayByZWw9XCJwcmVjb25uZWN0XCIgaHJlZj1cImh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb21cIiBjcm9zc29yaWdpbj5cbiAgICAgICAgPGxpbmsgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEA0MDA7OTAwJmRpc3BsYXk9c3dhcFwiIHJlbD1cInN0eWxlc2hlZXRcIj4gXG4gICAgICAgIDxsaW5rIHJlbD0nc3R5bGVzaGVldCcgaHJlZj0naHR0cHM6Ly91bnBrZy5jb20vc3Zic3RyYXRlQDUuMS4wL3N2YnN0cmF0ZS5jc3MnIC8+XG4gICAgICAgIDxzdHlsZT5cbiAgICAgICAgICBodG1sLGJvZHkge1xuICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdJbnRlcicsICdzYW5zLXNlcmlmJztcbiAgICAgICAgICAgIGNvbG9yOiAjMjMyODNEO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0RBREVGMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgI2Zhdmljb24ge1xuICAgICAgICAgICAgZmlsbDogIzIzMjgzRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xuICAgICAgICAgICAgaHRtbCxib2R5IHtcbiAgICAgICAgICAgICAgY29sb3I6ICNEQURFRjA7XG4gICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyMzI4M0Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAjZmF2aWNvbiB7XG4gICAgICAgICAgICAgIGZpbGw6ICNEQURFRjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L3N0eWxlPlxuICAgICAgPC9oZWFkPlxuICAgICAgPGJvZHkgY2xhc3M9J3cgZiBhaWMgamNjJyBzdHlsZT0naGVpZ2h0OiAxMDB2aCc+XG4gICAgICAgIDxkaXYgY2xhc3M9J3AxMiB0YWMnPlxuICAgICAgICAgIDxoMT4ke3N0YXR1c0NvZGV9PC9oMT5cbiAgICAgICAgICA8cCBjbGFzcz0nbWIxJz4ke3N0YXR1cy5tZXNzYWdlW3N0YXR1c0NvZGVdfTwvcD5cblxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNhKVwiPlxuICAgICAgICAgICAgICA8cGF0aCBpZD1cImZhdmljb25cIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTAuNCA3Yy0uMyAwLS44LjItMSAuNUwxLjEgMjIuMWMtLjIuMyAwIC42LjMuNmw0IC4zLTIuMSAyLjZjLS4yLjMtLjEuNi4yLjZsMTYuOCAxLjNjLjQgMCAuOC0uMiAxLS40TDMyIDEzLjljLjItLjIuMS0uNS0uMi0uNWwtNi40LS41IDIuMi00Yy4yLS4zIDAtLjUtLjMtLjZMMTAuNCA3Wk0yNCAxMi44bDEuOS0zLjQtMTUuNS0xLjItNy43IDEzLjQgMy42LjMgNy41LTkuNGMuMy0uMy43LS41IDEtLjRsOS4yLjdaTTcuNiAyMmw3LjEtOC45IDguNy43LTUuMiA5TDcuNiAyMlptLTEgMS4xIDExLjYgMWMuMyAwIC44LS4zIDEtLjZsNS41LTkuNiA1LjUuNS05LjcgMTJMNSAyNS4ybDEuNy0yWlwiIGZpbGw9XCIjMjMyODNEXCIvPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImFcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiI2ZmZlwiIGQ9XCJNMCAwaDMydjMySDB6XCIvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYm9keT5cbiAgICA8L2h0bWw+XG4gIGBcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7bThCQUFBLG9DQUVBLE9BQWlCLG1CQUNqQixHQUFpQixnOENDSGpCLE9BQWUsdUJBQ2YsR0FBaUIsbUJBQ2pCLEdBQXFCLHVCQ0ZyQiw2SkFBeUIsb0JDQWxCLEdBQU0sR0FBTSxDQUNqQixXQUFZLGFBQ1osWUFBYSxlREVSLEdBQUssR0FBTCxVQUFLLEVBQUwsQ0FD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